[ATARI] recopilación de códigos assembler - MAC65 u otros
[ATARI] recopilación de códigos assembler - MAC65 u otros
La idea es realizar un post de recopilación de códigos para mac-65 ya probados, así serviría de apuntes y ayuda para varios
1-. TITULO DE LIBRERÍA O CÓDIGO
2-. CÓDIGO
3-. ADJUNTO SI ES QUE FUE CREADO.
Esa es la esquemática para crear el post.
1-. TITULO DE LIBRERÍA O CÓDIGO
2-. CÓDIGO
3-. ADJUNTO SI ES QUE FUE CREADO.
Esa es la esquemática para crear el post.
Última edición por dogdark el Lun Mar 09, 2015 11:29 am, editado 1 vez en total.
SYSEQU.M65
SYSEQU.M65
Libreria importante donde se encuentran posiciones de memoria para ser utilizadas con iomac.lib, aperturas de puertos cio como disketeras, caseteras.etc
Libreria importante donde se encuentran posiciones de memoria para ser utilizadas con iomac.lib, aperturas de puertos cio como disketeras, caseteras.etc
Código: Seleccionar todo
1000 ;
1010 ; SYSEQU.M65
1020 ;
1030 .PAGE "FTE SYSTEM EQUATES FOR ATARI"
1040 ;
1050 ; FILE = #DN:SYSEQU.ASM
1060 ;
1070 ;
1080 ; I/O CONTROL BLOCK EQUATES
1090 ;
1100 SAVEPC = * ; SAVE CURRENT ORG
1110 ;
1120 *= $0340 ;START OF SYSTEM IOCBS
1130 IOCB
1140 ;
1150 ICHID *= *+1 ;DEVICE HANDLER IS (SET BY OS)
1160 ICDNO *= *+1 ;DEVICE NUMBER (SET BY OS)
1170 ICCOM *= *+1 ;I/O COMMAND
1180 ICSTA *= *+1 ;I/O STATUS
1190 ICBADR *= *+2 ;BUFFER ADDRESS
1200 ICPUT *= *+2 ;DH PUT ROUTINE (ADR-1)
1210 ICBLEN *= *+2 ;BUFFER LENGTH
1220 ICAUX1 *= *+1 ;AUX 1
1230 ICAUX2 *= *+1 ;AUX 2
1240 ICAUX3 *= *+1 ;AUX 3
1250 ICAUX4 *= *+1 ;AUX 4
1260 ICAUX5 *= *+1 ;AUX 5
1270 ICAUX6 *= *+1 ;AUX 6
1280 ;
1290 IOCBLEN = *-IOCB ;LENGTH OF ONE IOCB
1300 ;
1310 ; IOCB COMMAND VALUE EQUATES
1320 ;
1330 COPN = 3 ;OPEN
1340 CGBINR = 7 ;GET BINARY RECORD
1350 CGTXTR = 5 ;GET TEXT RECORD
1360 CPBINR = 11 ;PUT BINARY RECORD
1370 CPTXTR = 9 ;PUT TEXT RECORD
1380 CCLOSE = 12 ;CLOSE
1390 CSTAT = 13 ;GET STATUS
1400 ;
1410 ; DEVICE DEPENDENT COMMAND EQUATES FOR FILE MANAGER
1420 ;
1430 CREN = 32 ;RENAME
1440 CERA = 33 ;ERASE
1450 CPRO = 35 ;PROTECT
1460 CUNP = 36 ;UNPROTECT
1470 CPOINT = 37 ;POINT
1480 CNOTE = 38 ;NOTE
1490 ;
1500 ; AUX1 VALUES REQD FOR OPEN
1510 ;
1520 OPIN = 4 ;OPEN INPUT
1530 OPOUT = 8 ;OPEN OUTPUT
1540 OPUPD = 12 ;OPEN UPDATE
1550 OPAPND = 9 ;OPEN APPEND
1560 OPDIR = 6 ;OPEN DIRECTORY
1570 ;
1580 .PAGE
1590 ;
1600 ; EXECUTE FLAG DEFINES
1610 ;
1620 EXCYES = $80 ; EXECUTE IN PROGRESS
1630 EXCSCR = $40 ; ECHO EXCUTE INPUT TO SCREEN
1640 EXCNEW = $10 ; EXECUTE START UP MODE
1650 EXCSUP = $20 ; COLD START EXEC FLAG
1660 ;
1670 ; MISC ADDRESS EQUATES
1680 ;
1690 CPALOC = $0A ; POINTER TO CP/A
1700 WARMST = $08 ; WAR, START (0=COLD)
1710 MEMLO = $02E7 ; AVAIL MEM (LOW) PTR
1720 MEMTOP = $02E5 ; AVAIL MEM (HIGH) PTR
1730 APPMHI = $0E ; UPPER LIMIT OF APPLICATION MEMORY
1740 INITADR = $02E2 ; ATARI LOAD/INIT ADR
1750 GOADR = $02E0 ; ATARI LOAD/GO ADR
1760 CARTLOC = $BFFA ; CARTRIDGE RUN LOCATION
1770 CIO = $E456 ;CIO ENTRY ADR
1780 EOL = $9B ; END OF LINE CHAR
1790 ;
1800 ; CP/A FUNCTION AND VALUE DISPLACEMSNT
1810 ; (INDIRECT THROUGH CPALOC)
1820 ; IE. (CPALOC),Y
1830 ;
1840 CPGNFN = 3 ; GET NEXT FILE NAME
1850 CPDFDV = $07 ; DEFAULT DRIVE (3 BYTES)
1860 CPBUFP = $0A ; CMD BUFF NEXT CHAR POINTR (1 BYTE)
1870 CPEXFL = $0B ; EXECUTE FLAG
1880 CPEXFN = $0C ; EXECUTE FILE NAME (16 BYTES)
1890 CPEXNP = $1C ; EXECUTE NOTE/POINT VALUES
1900 CPFNAM = $21 ; FILENAME BUFFER
1910 RUNLOC = $3D ; CP/A LOAD/RUN ADR
1920 CPCMDB = $3F ; COMMAND BUFFER (60 BYTES)
1930 CPCMDGO = $F3
1940 PRINTBYTE = $F2B0
1950 GETBYTE = $F2F8
1960 ;
1970 *= SAVEPC ; RESTORE PC
1980 ;
1990 ;
2000 ;FIN SYSEQU.M65
2010 ;
Última edición por dogdark el Mar Mar 10, 2015 11:16 am, editado 3 veces en total.
IOMAC.LIB
IOMAC.LIB
Libreria de ayuda, con esta podremos manejar las posiciones de memoria que trae sysequ.m65 para abrir los puertos de los perifericos. Maneja open print xio etc.
Un ejemplo corto para imprimir en pantalla usamos la macro print de la siguiente manera. Print 0,"hola", con eso la macro del iomac te genera automaticamente el codigo asm al compilar tu programa. A posterior subire algun codigo con esta macro y otras probadas.
Libreria de ayuda, con esta podremos manejar las posiciones de memoria que trae sysequ.m65 para abrir los puertos de los perifericos. Maneja open print xio etc.
Un ejemplo corto para imprimir en pantalla usamos la macro print de la siguiente manera. Print 0,"hola", con eso la macro del iomac te genera automaticamente el codigo asm al compilar tu programa. A posterior subire algun codigo con esta macro y otras probadas.
Código: Seleccionar todo
1000 .TITLE "IOMAC.LIB -- FTE SYSTEM I/O MACROS"
1010 .PAGE " SUPPORT MACROS"
1020 .IF .NOT .DEF IOCB
1030 .ERROR "YOU MUST INCLUDE SYSEQU.M65 AHEAD OF THIS!!"
1040 .ENDIF
1050 ;
1060 ; THESE MACROS ARE CALLED BY THE ACTUAL I/O MACROS
1070 ; TO PERFORM THE RUDIMENTARY REGISTER LOAD FUNCTIONS.
1080 ;
1090 ;
1100 ; MACRO: @CH
1110 ;
1120 ; LOADS IOCB NUMBER (PARAMETER 1) INTO X REGISTER.
1130 ;
1140 ; IF PARAMETER VALUE IS 0 TO 7, IMMEDIATE CHANNEL NUMBER
1150 ; IS ASSUMED.
1160 ;
1170 ; IF PARAMETER VALUE IS > 7 THEN A MEMORY LOCATION
1180 ; IS ASSUMED TO CONTAIN THE CHANNEL NUMBER.
1190 ;
1200 .MACRO @CH
1210 .IF %1>7
1220 LDA %1
1230 ASL A
1240 ASL A
1250 ASL A
1260 ASL A
1270 TAX
1280 .ELSE
1290 LDX #%1*16
1300 .ENDIF
1310 .ENDM
1320 ;
1330 ;
1340 ; MACRO: @CV
1350 ;
1360 ; LOADS CONSTANT OR VALUE INTO ACCUMULTOR (A-REGISTER)
1370 ;
1380 ; IF VALUE OF PARAMETER 1 IS 0-255, @CV
1390 ; ASSUMES IT'S AN (IMMEDIATE) CONSTANT.
1400 ;
1410 ; OTHERWISE THE VALUE IS ASSUMED TO
1420 ; BE A MEMORY LOCATION (NON-ZERO PAGE).
1430 ;
1440 ;
1450 ;
1460 .MACRO @CV
1470 .IF %1<256
1480 LDA #%1
1490 .ELSE
1500 LDA %1
1510 .ENDIF
1520 .ENDM
1530 ;
1540 ;
1550 ;
1560 ;
1570 ; MACRO: @FL
1580 ;
1590 ; @FL IS USED TO ESTABLISH A FILESPEC (FILE NAME)
1600 ;
1610 ; IF A LITERAL STRING IS PASSED, @FL WILL
1620 ; GENERATE THE STRING IN LINE, JUMP
1630 ; AROUND IT, AND PLACE ITS ADDRESS
1640 ; IN THE IOCB POINTED TO BY THE X-REGISTER.
1650 ;
1660 ; IF A NON-ZERO PAGE LABEL IS PASSED
1670 ; THE MACRO ASSUMES IT TO BE THE LABEL
1680 ; OF A VALID FILESPEC AND USES IT INSTEAD.
1690 ;
1700 ;
1710 ;
1720 .MACRO @FL
1730 .IF %1<256
1740 JMP *+%1+4
1750 @F .BYTE %$1,0
1760 LDA # <@F
1770 STA ICBADR,X
1780 LDA # >@F
1790 STA ICBADR+1,X
1800 .ELSE
1810 LDA # <%1
1820 STA ICBADR,X
1830 LDA # >%1
1840 STA ICBADR+1,X
1850 .ENDIF
1860 .ENDM
1870 .PAGE " XIO MACRO"
1880 ;
1890 ; MACRO: XIO
1900 ;
1910 ; FORM: XIO CMD,CH[,AUX1,AUX2][,FILESPEC]
1920 ;
1930 ; CH IS GIVEN AS IN THE @CH MACRO
1940 ; CMD, AUX1, AUX2 ARE GIVEN AS IN THE @CV MACRO
1950 ; FILESPEC IS GIVEN AS IN THE @FL MACRO
1960 ;
1970 ; PERFORMS FAMILIAR XIO OPERATIONS WITH/FOR OS/A+
1980 ;
1990 ; IF AUX1 IS GIVEN, AUX2 MUST ALSO BE GIVEN
2000 ; IF AUX1 AND AUX2 ARE OMITTED, THEY ARE SET TO ZERO
2010 ; IF THE FILESPEC IS OMITTED, "S:" IS ASSUMED
2020 ;
2030 .MACRO XIO
2040 .IF %0<2 .OR %0>5
2050 .ERROR "XIO: WRONG NUMBER OF ARGUMENTS"
2060 .ELSE
2070 @CH %2
2080 @CV %1
2090 STA ICCOM,X ; COMMAND
2100 .IF %0>=4
2110 @CV %3
2120 STA ICAUX1,X
2130 @CV %4
2140 STA ICAUX2,X
2150 .ELSE
2160 LDA #0
2170 STA ICAUX1,X
2180 STA ICAUX2,X
2190 .ENDIF
2200 .IF %0=2 .OR %0=4
2210 @FL "S:"
2220 .ELSE
2230 @@IO .= %0
2240 @FL %$(@@IO)
2250 .ENDIF
2260 JSR CIO
2270 .ENDIF
2280 .ENDM
2290 .PAGE " OPEN MACRO"
2300 ;
2310 ; MACRO: OPEN
2320 ;
2330 ; FORM: OPEN CH,AUX1,AUX2,FILESPEC
2340 ;
2350 ; CH IS GIVEN AS IN THE @CH MACRO
2360 ; AUX1 AND AUX2 ARE GIVEN AS IN THE @CV MACRO
2370 ; FILESPEC IS GIVEN AS IN THE @FL MACRO
2380 ;
2390 ; WILL ATTEMPT TO OPEN THE GIVEN FILE NAME ON
2400 ; THE GIVEN CHANNEL, USING THE OPEN "MODES"
2410 ; SPECIFIED BY AUX1 AND AUX2
2420 ;
2430 .MACRO OPEN
2440 .IF %0<>4
2450 .ERROR "OPEN: WRONG NUMBER OF ARGUMENTS"
2460 .ELSE
2470 .IF %4<256
2480 XIO COPN,%1,%2,%3,%$4
2490 .ELSE
2500 XIO COPN,%1,%2,%3,%4
2510 .ENDIF
2520 .ENDIF
2530 .ENDM
2540 .PAGE " BGET AND BPUT MACROS"
2550 ;
2560 ; MACROS: BGET AND BPUT
2570 ;
2580 ; FORM: BGET CH,BUF,LEN
2590 ; BPUT CH,BUF,LEN
2600 ;
2610 ; CH IS GIVEN AS IN THE @CH MACRO
2620 ; LEN IS ALWAYS ASSUMED TO BE ANIMMEDIATE
2630 ; AND ACTUAL VALUE...NEVER A MEMORY ADDRESS
2640 ; BUF MUST BE THE ADDRESS OF AN APPROPRIATE
2650 ; BUFFER IN MEMORY
2660 ;
2670 ; PUTS OR GETS LENGTH BYTES TO/FROM THE
2680 ; SPECIFIED BUFFER, USES BINARY READ/WRITE
2690 ;
2700 ;
2710 ; FIRST: A COMMON MACRO
2720 ;
2730 .MACRO @GP
2740 @CH %1
2750 LDA #%4
2760 STA ICCOM,X
2770 LDA # <%2
2780 STA ICBADR,X
2790 LDA # >%2
2800 STA ICBADR+1,X
2810 LDA # <%3
2820 STA ICBLEN,X
2830 LDA # >%3
2840 STA ICBLEN+1,X
2850 JSR CIO
2860 .ENDM
2870 ;
2880 .MACRO BGET
2890 .IF %0<>3
2900 .ERROR "BGET: WRONG NUMBER OF PARAMETERS"
2910 .ELSE
2920 @GP %1,%2,%3,CGBINR
2930 .ENDIF
2940 .ENDM
2950 ;
2960 .MACRO BPUT
2970 .IF %0<>3
2980 .ERROR "BPUT: WRONG NUMBER OF PARAMETERS"
2990 .ELSE
3000 @GP %1,%2,%3,CPBINR
3010 .ENDIF
3020 .ENDM
3030 ;
3040 .PAGE " PRINT MACRO"
3050 ;
3060 ; MACRO: PRINT
3070 ;
3080 ; FORM: PRINT CH[,BUFFER[,LENGTH]]
3090 ;
3100 ; CH IS AS GIVEN IN @CH MACRO
3110 ; IF NO BUFFER, PRINTS JUST A RETURN
3120 ; IF NO LENGTH GIVEN, 255 ASSUMED
3130 ;
3140 ; USED TO PRINT TEXT. TO PRINT TEXT WITHOUT RETURN,
3150 ; LENGTH MUST BE GIVEN. SEE OS/A+ MANUAL
3160 ;
3170 ; EXCEPTION: SECOND PARAMETER MAYBE A LITERAL
3180 ; STRING (E.G., PRINT 0,"TEST"), IN WHICH
3190 ; CASE THE LENGTH (IF GIVEN) IS IGNORED.
3200 ;
3210 .MACRO PRINT
3220 .IF %0<1 .OR %0>3
3230 .ERROR "PRINT: WRONG NUMBER OF PARAMETERS"
3240 .ELSE
3250 .IF %0>1
3260 .IF %2<128
3270 JMP *+4+%2
3280 @IO .BYTE %$2,$9B
3290 @GP %1,@IO,%2+1,CPTXTR
3300 .ELSE
3310 .IF %0=2
3320 @GP %1,%2,255,CPTXTR
3330 .ELSE
3340 @GP %1,%2,%3,CPTXTR
3350 .ENDIF
3360 .ENDIF
3370 .ELSE
3380 JMP *+4
3390 @IO .BYTE $9B
3400 @GP %1,@IO,1,CPTXTR
3410 .ENDIF
3420 .ENDIF
3430 .ENDM
3440 ;
3450 .PAGE " INPUT MACRO"
3460 ;
3470 ; MACRO: INPUT
3480 ;
3490 ; FORM: INPUT CH,BUF,LEN
3500 ;
3510 ; CH IS GIVEN AS IN THE @CH MACRO
3520 ; BUF MUST BE A PROPER BUFFER ADDRESS
3530 ; LEN MAY BE OMITTED, IN WHICH CASE 255 IS ASSUMED
3540 ;
3550 ; GETS A LINE OF TEXT INPUT TO THE GIVEN
3560 ; BUFFER, MAXIMUM OF LENGTH BYTES
3570 ;
3580 .MACRO INPUT
3590 .IF %0<2 .OR %0>3
3600 .ERROR "INPUT: WRONG NUMBER OF PARAMETERS"
3610 .ELSE
3620 .IF %0=2
3630 @GP %1,%2,255,CGTXTR
3640 .ELSE
3650 @GP %1,%2,%3,CGTXTR
3660 .ENDIF
3670 .ENDIF
3680 .ENDM
3690 .PAGE " CLOSE MACRO"
3700 ;
3710 ; MACRO: CLOSE
3720 ;
3730 ; FORM: CLOSE CH
3740 ;
3750 ; CH IS GIVEN AS IN THE @CH MACRO
3760 ;
3770 ; CLOSES CHANNEL CH
3780 ;
3790 .MACRO CLOSE
3800 .IF %0<>1
3810 .ERROR "CLOSE: WRONG NUMBER OF PARAMETERS"
3820 .ELSE
3830 @CH %1
3840 LDA #CCLOSE
3850 STA ICCOM,X
3860 JSR CIO
3870 .ENDIF
3880 .ENDM
3890 ;
3900 ;;;;;;;;;;; END OF IOMAC.LIB ;;;;
;;;;;;;;
3910 ;
- Adjuntos
-
- iomac-lib.rar
- LIBRERIA IOMAC.LIB
- (3.37 KiB) Descargado 204 veces
Última edición por dogdark el Mar Mar 10, 2015 11:23 am, editado 2 veces en total.
EMUBAS.LIB
Esta es una librería propia que uso para emular algunos elementos de basic con macros, si la pueden mejorar sería la raja,
esta emula el poke y el position y se agregan igual que lda, sta etc.
ej.
EMUBAS.LIB
esta emula el poke y el position y se agregan igual que lda, sta etc.
ej.
Código: Seleccionar todo
1000 POKE 710,0 ; pantalla negra
1010 POSITION 0,0 ; posicion del cursor en pantalla
1020 ; SI USAMOS LIBRERIA SYSEQU.M65 Y IOMAC.LIB
1030 ; USAMOS EL PRINT DIRECTAMENTE
1040 PRINT 0,"HOLA MUNDO"
Código: Seleccionar todo
1000 ;SAVE#D:EMUBAS.LIB
1010 ;
1020 ; MACRO EMULACION BASIC
1030 ;
1040 ; MACRO POKE
1050 ;
1060 .MACRO POKE
1070 LDA #%2
1080 STA %1
1090 .ENDM
1100 ;
1110 ; MACRO POSITION
1120 ;
1130 .MACRO POSITION
1140 LDA #%2 ; FILA
1150 STA 84
1160 LDA #%1 ; COLUMNA
1170 STA 85
1180 .ENDM
1190 ;
- Adjuntos
-
- emubas.lib.rar
- LIBRERIA EMUBAS.LIB
- (637 Bytes) Descargado 169 veces
Última edición por dogdark el Lun Mar 09, 2015 11:29 am, editado 2 veces en total.
Re: [ATARI] recopilación de códigos assembler - MAC65
¡Excelente iniciativa! Sólo sugiero que en cada post de este hilo vaya una rutina, y que el "asunto" de ese post sea el nombre y/o función de la rutina.
Yo tengo harto código pequeño para ser usado desde BASIC con USR. No todo lo hice en MAC/65... creo que en la mayoría utilicé el cartucho Atari Assembler Editor, pues podía ir probando en caliente algunas cosas, pero para efectos prácticos, es la misma cosa pero sin macros.
Voy a buscar a ver qué fuentes puedo encontrar.
Yo tengo harto código pequeño para ser usado desde BASIC con USR. No todo lo hice en MAC/65... creo que en la mayoría utilicé el cartucho Atari Assembler Editor, pues podía ir probando en caliente algunas cosas, pero para efectos prácticos, es la misma cosa pero sin macros.
Voy a buscar a ver qué fuentes puedo encontrar.
Re: [ATARI] recopilación de códigos assembler - MAC65 u otro
Muy buena la idea, a modo de sugerencia:
No me queda claro que hacen las primeras librerías, creo que sería bueno poner una pequeña descripción en nuestro lenguaje de la utilidad de la librería, me estoy entusiasmando con el Assembler de Atari, me gustaría aprender.
No me queda claro que hacen las primeras librerías, creo que sería bueno poner una pequeña descripción en nuestro lenguaje de la utilidad de la librería, me estoy entusiasmando con el Assembler de Atari, me gustaría aprender.
CIO: GET/PUT N bytes en buffer desde BASIC
Esta rutina permite leer o escribir N bytes desde/hacia un archivo previamente abierto en BASIC.
La función USR devuelve el número de bytes realmente transferidos.
En el PEEK(195) se puede ver el estado de la operación.
Ejemplo: Copiar un máximo de 10000 bytes desde CIOEJEM.BAS hacia CIOCOPIA.BAS:
Para copiar archivos más grandes completos, hay que iterar hasta que el último bloque leído termine con error 136 (fin de archivo) y que todos los bloques escritos terminen con error 1 (sin error).
En el ATR adjunto va el código fuente en CIO.ASM y CIO.M65, en binario para BASIC como CIO.LST (para cargar en línea 1 con ENTER "D:CIO.LST") y el programa de ejemplo CIOEJEM.BAS que se copia a sí mismo.
Código: Seleccionar todo
0100 ; CIO: GET/PUT USANDO IOCB
0110 ; VICTOR PARADA
0120 ; BYTES=USR(CIO,CANAL,OP,BUFFER,LARGO)
0130 ; OP: 7=GET 11=PUT
0140 CIOV = $E456
0150 ESTADO = 195 ; $C3
0160 BYTES = 212 ; $D4
0170 *= $0600
0180 PLA
0190 PLA
0200 PLA
0210 ASL A
0220 ASL A
0230 ASL A
0240 ASL A
0250 TAX
0260 PLA
0270 PLA
0280 STA $0342,X
0290 PLA
0300 STA $0345,X
0310 PLA
0320 STA $0344,X
0330 PLA
0340 STA $0349,X
0350 PLA
0360 STA $0348,X
0370 JSR CIOV
0380 LDA $0349,X
0390 STA BYTES+1
0400 LDA $0348,X
0410 STA BYTES
0420 LDA $0343,X
0430 STA ESTADO
0440 RTSEn el PEEK(195) se puede ver el estado de la operación.
Ejemplo: Copiar un máximo de 10000 bytes desde CIOEJEM.BAS hacia CIOCOPIA.BAS:
Código: Seleccionar todo
100 DIM BUFFER$(10000)
110 CIO=ADR("<códigobinario>")
120 OPEN #1,4,0,"D:CIOEJEM.BAS"
130 OPEN #2,8,0,"D:CIOCOPIA.BAS"
140 BYTES=USR(CIO,1,7,ADR(BUFFER$),10000)
150 ? BYTES;" BYTES LEIDOS"
160 IF PEEK(195)<>136 THEN ? "ARCHIVO INCOMPLETO"
170 BYTES=USR(CIO,2,11,ADR(BUFFER$),BYTES)
180 ? BYTES;" BYTES ESCRITOS"
190 IF PEEK(195)<>1 THEN ? "ERROR ";PEEK(195);" DURANTE LA COPIA"
200 CLOSE #1
210 CLOSE #2
En el ATR adjunto va el código fuente en CIO.ASM y CIO.M65, en binario para BASIC como CIO.LST (para cargar en línea 1 con ENTER "D:CIO.LST") y el programa de ejemplo CIOEJEM.BAS que se copia a sí mismo.
- Adjuntos
-
- cio.zip
- (1.71 KiB) Descargado 185 veces
IMPRIMIR EN PANTALLA
Con este código generamos una impresión con bucle, en que consta, que toma los valores de byte según el label y las envié a un bucle que toma estos valores y los imprime, terminando cuando encuentra el caracter *
desde la 1100 a 1180 se encuentra la preparación de la primera linea,
1100 - 1110 indicamos que el cursor se posicione en la fila 0
1120 - 1130 indicamos que el cursor se posicione en la columna 0
1140 - 1170 cargamos los caracteres de HEADER en el acumulador
1180 enviamos los datos del acumulador almacenado en MANDO a IMPRIMO, como un gosub en basic
1300 limpio el acumulador Y
1310 - 1390 recibo y provoco el bucle para la impresión en general, en la linea 1330 comparo que el carácter sea * para terminar la ejecución, si esta coincide con LDA (MANDO), indico con BEQ que me direccione a FINIMPRIMO
1410 retrocedo a el ultimo envió, (GOSUB generado en 1180)
1190-1270 nuevamente repito operación para imprimir otra linea y envió datos a imprimir donde después me volverá acá mismo
1280 salto a TERMINO
1420 - 1470 genero ultimo mensaje a imprimir con la diferencia que esta ves no uso posicionamiento solo salto de lineas en la variable
1530 FINAL
1540 .BYTE $9B,$9B,"TERMINE LA APLICACION",$9B,$9B,$9B,"*"
donde los saltos de linea son provocados con $9B.
1480 RTS , culmino el programa y me saca a dos o ready
1490 -1540 almacenaje de las variables a imprimir en bytes.
Código: Seleccionar todo
1000 ;SAVE#D:PRUEBA.MAC
1010 ;ASM,#P:,#D:PRUEBA.XEX
1020 MANDO = $BB
1030 GUARDOY = $AE
1040 *= $02E0
1050 .WORD INICIO
1060 *= $6000
1070 INICIO
1080 LDA #'} ;ESC CONTROL <
1090 JSR $F2B0
1100 LDA #0
1110 STA 84
1120 LDA #0
1130 STA 85
1140 LDA # <HEADER
1150 STA MANDO
1160 LDA # >HEADER
1170 STA MANDO+1
1180 JSR IMPRIMO
1190 LDA #2
1200 STA 84
1210 LDA #0
1220 STA 85
1230 LDA # <OTRA
1240 STA MANDO
1250 LDA # >OTRA
1260 STA MANDO+1
1270 JSR IMPRIMO
1280 JMP TERMINO
1290 IMPRIMO
1300 LDY #0
1310 LOOPIMPRIMO
1320 LDA (MANDO),Y
1330 CMP #'*
1340 BEQ FINIMPRIMO
1350 STY GUARDOY
1360 JSR $F2B0
1370 LDY GUARDOY
1380 INY
1390 JMP LOOPIMPRIMO
1400 FINIMPRIMO
1410 RTS
1420 TERMINO
1430 LDA # <FINAL
1440 STA MANDO
1450 LDA # >FINAL
1460 STA MANDO+1
1470 JSR IMPRIMO
1480 RTS
1490 HEADER
1500 .BYTE " PRIMERA LINEA *"
1510 OTRA
1520 .BYTE "SEGUNDA LINEA*"
1530 FINAL
1540 .BYTE $9B,$9B,"TERMINE LA APLICACION",$9B,$9B,$9B,"*"
1100 - 1110 indicamos que el cursor se posicione en la fila 0
1120 - 1130 indicamos que el cursor se posicione en la columna 0
1140 - 1170 cargamos los caracteres de HEADER en el acumulador
1180 enviamos los datos del acumulador almacenado en MANDO a IMPRIMO, como un gosub en basic
1300 limpio el acumulador Y
1310 - 1390 recibo y provoco el bucle para la impresión en general, en la linea 1330 comparo que el carácter sea * para terminar la ejecución, si esta coincide con LDA (MANDO), indico con BEQ que me direccione a FINIMPRIMO
1410 retrocedo a el ultimo envió, (GOSUB generado en 1180)
1190-1270 nuevamente repito operación para imprimir otra linea y envió datos a imprimir donde después me volverá acá mismo
1280 salto a TERMINO
1420 - 1470 genero ultimo mensaje a imprimir con la diferencia que esta ves no uso posicionamiento solo salto de lineas en la variable
1530 FINAL
1540 .BYTE $9B,$9B,"TERMINE LA APLICACION",$9B,$9B,$9B,"*"
donde los saltos de linea son provocados con $9B.
1480 RTS , culmino el programa y me saca a dos o ready
1490 -1540 almacenaje de las variables a imprimir en bytes.
- Adjuntos
-
- imprimepantalla.rar
- (7.84 KiB) Descargado 218 veces