1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203
|
; MAS
;
; Revista "El Ordenador Personal" num 57, marzo 1987
; Autor: L. Surez
; Adaptacin para posibilitar su ensamblado para CP/M 86
; con pasmo por Julian Albo.
;El programa funciona como la orden TYPE de CPM, excepto que se
;detiene cada vez que se escriben 24 lneas de pantalla, esperando por la
;pulsacin de cualqier tecla.
;La sintaxis correcta es: MAS d:FILENAME.TYP, en la que d es la
;identificacin del drive en el que se encuentra el archivo
;FILENAME.TYP.
; VALORES UTILIZABLES
NULO EQU 00H ; Caracter nulo.
BACK EQU 08H ; Cursor un lugar a la izquierda.
LF EQU 0AH ; Cursor una lnea abajo.
UP EQU 0BH ; Cursor una lnea arriba.
CLS EQU 0CH ; Cursor a la pgina siguiente.
CR EQU 0DH ; Cursor al comienzo de la lnea.
EOF EQU 1AH ; Seala el final de un archivo ASCII.
FIL EQU 24 ; Nmero de filas de pantalla.
COL EQU 80 ; Nmero de columnas de pantalla.
TASEC EQU 128 ; Tamao de un sector.
if ! defined CPM86
TAPILA EQU 50 ; Tamao de la pila, o stack.
endif
CMDBUF EQU 0080H ; Buffer del CP/M para rdenes.
DFTFCB12 EQU 0068H
DFTFCB EQU 005CH ; Direccin del FCB por defecto.
BDOS EQU 5 ; Punto de entrada de las rutinas BDOS.
PRBYT EQU 2 ; Envia un caracter a la pantalla.
INOUT EQU 6 ; Enviar/Recibir un byte pant/teclado.
OPEN EQU 15 ; Abrir un archivo.
READSE EQU 20 ; Leer sectores de forma secuencial.
SETDMA EQU 26 ; Lugar para dejar sector ledo.
RECIB EQU 0FFH ; Para indicar recibir desde teclado.
ORG 100H
if ! defined CPM86
LD (STACK), SP ; Resguardo del stack.
LD SP, PILA ; nuevo stack para programa.
else
; Install a call to bdos in the cp/m bdos call address
ld a,0CDh
ld (5),a
ld a,0E0h
ld (6),a
ld a,0C3h
ld (7),a
endif
CALL PANCR ; Cursor a nueva lnea.
LD A, (CMDBUF) ; Num. de caracteres de la
CP 2 ; orden inicial
JP C, ERROR
LD HL, DFTFCB12 ; Lugar siguiente al nombre.
LD B, 24 ; Resto del FCB.
INI1: LD (HL), NULO ; relleno con ceros.
INC HL
DJNZ INI1
LD DE, DFTFCB ; Direccin del FCB del
LD A, OPEN ; archivo a abrir.
CALL CPM ; Sale con A=0FFH si no
INC A ; existe el archivo buscado.
JP Z, ERROR ; No existe.
LD C, FIL ; Inicia la cuenta de filas,
LD B, COL ; y de columnas.
LEER: LD DE, DMASRC ; Donde colocar el sector.
LD A, SETDMA ; que se va a leer y,
CALL CPM
LD DE, DFTFCB ; desde que archivo se lee.
LD A, READSE ; Leer sector secuencialmente.
CALL CPM ; Sale con A=0 si pudo leer.
OR A ; Final archivo?
JP NZ, FINAL ; S, ya no hay ms.
LD HL, DMASRC ; Apunta a comienzo de sector.
ESC1: LD A, (HL) ; Toma un caracter.
CP EOF ; Es el final del archivo?
JP Z, FINAL ; S, no hay ms.
OR A ; Otro tipo de final?
JP Z, FINAL ; S, no hay ms.
CP CLS ; Cursor a pgina nueva?
JR NZ, ESC2 ; No.
LD C, FIL ; S, reinciar filas,
LD B, COL ; y columnas.
JR ESPERA
ESC2: CP LF ; A la lnea inferior?
JR NZ, ESC4 ; No.
ESC3: DEC C ; S, una fila menos.
LD A, C
OR A ; Era la ltima?
JR NZ, ESCRIB ; No.
LD C, FIL ; S, reinicia filas.
JR ESPERA
ESC4: CP CR ; A comienzo de lnea?
JR NZ, ESC5 ; No.
LD B, COL ; S, reinicia columnas.
JR ESCRIB
ESC5: CP UP ; A la lnea superior?
JR NZ, ESC7 ; No.
ESC6: INC C ; S, una fila ms.
LD A, FIL
CP C ; Era ya C el valor mximo?
JR NC, ESCRIB ; No.
LD C, A ; FIL como mximo.
JR ESCRIB
ESC7: CP BACK ; Cursor un lugar atrs?
JR NZ, ESC8 ; No.
INC B ; S, una columna ms.
LD A, COL
CP B ; Era B ya el valor mximo?
JR NC, ESCRIB ; No.
LD B, 1 ; S, ltimo de la anterior,
JR ESC6 ; y aumentar el num. de filas.
ESC8: DEC B ; En cualquier otro caso, una
LD A, B ; columna menos, salvo que ya
OR A ; fuese la ltima.
JR NZ, ESCRIB ; No.
LD B, COL ; S, reinicia columnas,
JR ESC3 ; y reduce el num. de filas.
ESPERA: LD E, RECIB ; Espera a que se pulse una
LD A, INOUT ; tecla cualquiera.
CALL CPM
OR A ; Se ha pulsado alguna?
JR Z, ESPERA ; No.
ESCRIB: LD E, (HL) ; S, tomar de nuevo el mismo
CALL SALPAN ; carc. y enviarlo a pantalla.
LD DE, FINDMA
INC HL
LD A, H ; Es el final del sector?
CP D
JR C, ESC1 ; No, ya que HL<DE.
JP NZ, LEER ; S, es HL>DE.
LD A, L ; Puesto que H=D ver L y E.
CP E
;JR C, ESC1 ; No, ya que HL<DE.
JP C, ESC1 ; No, ya que HL<DE.
JP LEER ; Como HL>=DE, leer otro
; sector del archivo.
CPM PUSH HL ; Resguardar HL.
PUSH BC ; Resguardar BC.
LD C, A ; ndice de rutina a C.
CALL BDOS
POP BC ; Recuperar BC.
POP HL ; Recuperar HL.
RET
PANCR: LD E, LF ; Una lnea ms abajo.
CALL SALPAN
LD E, CR ; y al comienzo de la misma.
SALPAN: LD A, PRBYT ; Enviar el caracter en E a la
CALL CPM ; pantalla.
RET
ERROR: LD HL, CMDBUF ; CP/M deja all la orden.
LD A, (HL) ; inicial, con A caracteres.
OR A
JR Z, FINAL0 ; No hay ninguno tras MAS.
INC HL ; Si los hay, pasa el nmero
LD B, A ; al registro B,
ESORD1: LD E, (HL) ; los toma uno a uno, y los
CALL SALPAN ; saca a pantalla.
INC HL
DJNZ ESORD1
FINAL0: LD E, '?' ; Ms una interrogacin, y
CALL SALPAN
FINAL: CALL PANCR ; pasa a una lnea ms abajo.
if ! defined CPM86
LD SP, (STACK) ; Recupera el stack original,
RET ; y termina el programa.
else
ld c, 0
call BDOS
endif
if ! defined CPM86
STACK: DS 2 ; Para guardar el stack.
PILA EQU $ + TAPILA ; Comienzo stack propio.
DMASRC EQU PILA + 1 ; Comienzo almacn sector.
else
DMASRC EQU $
endif
FINDMA EQU DMASRC + TASEC ; Siguiente a ltimo lugar
; del almacn del sector.
this_is_the_end: END
|