[ATARI] recopilación de códigos assembler - MAC65 u otros

Software y Juegos para retro-computadores, bueeeno... casi puros juegos :-)
Responder
Avatar de Usuario
dogdark
Mensajes: 594
Registrado: Lun Mar 04, 2013 1:36 pm
Contactar:

[ATARI] recopilación de códigos assembler - MAC65 u otros

Mensaje por dogdark » Lun Mar 09, 2015 2:32 am

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.
Última edición por dogdark el Lun Mar 09, 2015 11:29 am, editado 1 vez en total.

Avatar de Usuario
dogdark
Mensajes: 594
Registrado: Lun Mar 04, 2013 1:36 pm
Contactar:

SYSEQU.M65

Mensaje por dogdark » Lun Mar 09, 2015 2:46 am

SYSEQU.M65

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.

Avatar de Usuario
dogdark
Mensajes: 594
Registrado: Lun Mar 04, 2013 1:36 pm
Contactar:

IOMAC.LIB

Mensaje por dogdark » Lun Mar 09, 2015 2:57 am

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.

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.

Avatar de Usuario
dogdark
Mensajes: 594
Registrado: Lun Mar 04, 2013 1:36 pm
Contactar:

EMUBAS.LIB

Mensaje por dogdark » Lun Mar 09, 2015 3:04 am

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.

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"
EMUBAS.LIB

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.

Avatar de Usuario
vitoco
Mensajes: 1970
Registrado: Lun Ene 28, 2013 5:47 pm
Contactar:

Re: [ATARI] recopilación de códigos assembler - MAC65

Mensaje por vitoco » Lun Mar 09, 2015 9:26 am

¡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.

foxer
Mensajes: 94
Registrado: Lun Feb 25, 2013 4:34 pm

Re: [ATARI] recopilación de códigos assembler - MAC65 u otro

Mensaje por foxer » Mar Mar 10, 2015 8:27 am

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.

Avatar de Usuario
vitoco
Mensajes: 1970
Registrado: Lun Ene 28, 2013 5:47 pm
Contactar:

CIO: GET/PUT N bytes en buffer desde BASIC

Mensaje por vitoco » Mar Mar 10, 2015 1:33 pm

Esta rutina permite leer o escribir N bytes desde/hacia un archivo previamente abierto en BASIC.

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     RTS
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:

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
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.
Adjuntos
cio.zip
(1.71 KiB) Descargado 185 veces

Avatar de Usuario
dogdark
Mensajes: 594
Registrado: Lun Mar 04, 2013 1:36 pm
Contactar:

IMPRIMIR EN PANTALLA

Mensaje por dogdark » Sab Mar 21, 2015 1:28 am

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 *

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,"*"

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.
Adjuntos
imprimepantalla.rar
(7.84 KiB) Descargado 218 veces

Responder