Serie clonicos del Spectrum La ROM de Henk de Groot Continuo mi serie de clonicos del Spectrum con una traduccion al español del texto originalmente en ingles sobre la Groot.ROM. " ROM de 48K modificada por Henk de Groot (Documentado) modificacion sin el permiso de Amstrad http://www.srcf.ucam.org/~pak21/spectrum/roms/ comp.sys.sinclair > Lista de cambios de la GROOT.ROM. Henk de Groot Jan 31 1994, 6:39 pm Algunas personas, al parecer, se confunden con las diferentes roms para el Spectrum. He aqui lo que hice a la rom original del ZX-Spectrum: o Bug corregidos tal como se menciona en "The complete Spectrum Rom Disassembly" del Dr Ian Logan y el Dr Frank O'Hara. o Soporte para impresoras EPSON via un chip Z80-PIO y toma Centronics. o Soporte para monitor: arranca con pantalla negra y caracteres blancos. o Soporte para Lapiz optico: rutina para lap.opt. DK'Tronics incluida. He aqui el codigo en ensamblador de los cambios. Todo puede ser encontrado sitios web bajo el nombee "newrom.???" donde ??? es .exe, .zip, .arj o lo que sea. ------------------------- LISTA DE CAMBIOS --------------------------------- Este archivo muestra los cambios a la ROM original. Las etiquetas y numeros de pagina refieren al libro "The Complete Spectrum Rom Disassembly" del Dr. Ian Logan & Dr. Frank O'Hara, publicado por Melbourne House Publishers, ISBN 0 86161 116 0. Salto para inicializar el chip Z80-PIO --------------------------------------------------------------------------- ----- El 'START' La interrupion mascarable es desabilitada y el par de registro DE puesto en lo 'alto de la RAM posible' 0000 F3 START DI Desabilita 'interrupt.teclado' 0001 AF XOR A +00 para 'start' (pero +FF para 'NEW'). 0002 11FFFF LD DE,FFFF alto de la RAM posible. 0005 C3AA04 JP 04AA,PIO-INIT Inicia Z80-PIO --------------------------------------------------------------------------- ----- Nueva rutina NMI: arranque rapido del BASIC sin borrar la memoria! --------------------------------------------------------------------------- ----- 0066 F3 RESET DI Desabilita 'interrupt.teclado' 0067 AF XOR A pone el borde en color negro 0068 D3FE OUT (FE),A 006A 3E3F LD A,3F pone el registro I con el 006C ED47 LD I,A valor +3F. 006E 2AB25C LD HL,(RAMTOP) Preserva RAMTOP actual 0071 C31912 JP 1219,RAM-SET Actua si RAM es probado --------------------------------------------------------------------------- ----- Inicia el Z80-PIO. Esta es una nueva rutina. Esta ubicada donde habia codigo del ZX81 inutil, llamado "THE 'PROGRAM NAME' SUBROUTINE" --------------------------------------------------------------------------- ----- Inicia Z80-PIO Port DB = Control port "A" Port FB = Control port "B" Port 9B = Data port "A" Port BB = Data port "B" 04AA 3E3F PIO-INIT LD A,3F Programa puerto A del Z80-PIO 04AC D3DB OUT (DB),A para ser todo "outputs". 04AE 3EFF LD A,FF Puerto A se conecta a las 04B0 D3FB OUT (FB),A lineas de datos Centronix. 04B2 3E80 LD A,80 Programa puerto B a "inputs" 04B4 D3FB OUT (FB),A Excepto bit 8 en puerto B 04B6 3E02 LD A,02 el Bit 2 del puerto B sera el 04B8 D3BB OUT (BB),A "Stobe", inicia a "1" 04BA AF XOR A +00 para 'start' (pero +FF para 'NEW'). 04BB C3CB11 JP 11CB,START/NEW salta hacia adelante --------------------------------------------------------------------------- ----- Soporte para impresoras tipo EPSON incluido. --------------------------------------------------------------------------- ----- 09F4 C32C39 PRINT-OUT JP 392C,PRINTER llama a rutina de impresora --------------------------------------------------------------------------- ----- Bug de la pag. 33 corregido --------------------------------------------------------------------------- ----- 0A30 0E02 LD C,02 pone el valor de columna 0A32 3E19 LD A,19 prueba contra linea de arriba 0A34 B8 CP B Nota: Bug corregido, era 18 --------------------------------------------------------------------------- ----- Bug de la pag. 34 corregido, sale via PO-STORE --------------------------------------------------------------------------- ----- 0A4A F1 POP AF extrae viejo valor de P-FLAG 0A4B C32039 JP 3920,REP-PO-ST salta a rutina de reparacion --------------------------------------------------------------------------- ----- Cambia la implementacion de impresora --------------------------------------------------------------------------- ----- Subrutina 'COPY-LINE' es ingresada con el par HL conteniendo la direccion base de 32 bytes que forman el pixel-line y el registro B con el numero del pixel-line. 0EF4 C36E38 COPY-LINE JP 386E,COPY-LN Copia bufer a impresora --------------------------------------------------------------------------- ----- Pone la pantalla inicial de blanco a negro. Se ve mucho mejor cuando se usa un monitor con el Spectrum. --------------------------------------------------------------------------- ----- 11CB 47 START/NEW LD B,A Salva el flag para despues. 11CC 3E00 LD A,00 pone el borde a negro 11CE D3FE OUT (FE),A (antes era blanco). --------------------------------------------------------------------------- ----- 1265 3E07 LD A,07 Inicia variables del sistema 1267 328D5C LD (ATTR-P),A del color a: FLASH 0, 126A 328F5C LD (ATTR-T),A BRIGHT 0, PAPER 0, INK 7 126D 32485C LD (BORDCR),A --------------------------------------------------------------------------- ----- Nuevo mensaje de Copyright: --------------------------------------------------------------------------- ----- Antes: 1539 '(C) 1982 Sinclair Research Ltd' Nuevo: 1539 '(C) New Zx Spectrum ROM READY ' --------------------------------------------------------------------------- ----- Bug de la pag. 177: -65536 --------------------------------------------------------------------------- ----- 3032 C3393A JP 3A39,FIX-177 va a corregir -65536 3035 23 NOFIX-177 INC HL apunta a la sigte. posicion 3036 72 LD (HL),D guarda el byte alto del resultado. 3037 2B DEC HL Mueve puntero de vuelta a la 3038 2B DEC HL direccion el primer byte del 3039 2B DEC HL resultado. 303A D1 FIXED-177 POP DE Restaura STKEND a DE. 303B C9 RET --------------------------------------------------------------------------- ----- Bug de la pag. 185: saltaba al lugar erroneo --------------------------------------------------------------------------- ----- 31FF 28DA JR Z,31DB,DIV-34TH antes: saltaba a DIV-START --------------------------------------------------------------------------- ----- Bug de la pag. 186: el codigo debe ser saltado --------------------------------------------------------------------------- ----- 3221 FE91 CP 91 Compara e con 91h, 145 decimal. 3223 181A JR 323F,T-SMALL salta siempre, omite el codigo desde 3225 a 323E siempre! --------------------------------------------------------------------------- ----- Nueva rutina COPY-LINE, copia con EPSON via Z80-PIO --------------------------------------------------------------------------- ----- 386E DDE5 COPY-LN PUSH IX Usa IX como indice 3870 3A815C LD A,(PR-CC) pone columna de impresora 3873 0605 COPY-MUL LD B,05 Multiplica 2^5 (=32) veces 3875 87 ADD A para calcular el offset en 3876 10FD DJNZ COPY-MUL el bufer de impresora. 3878 1600 LD D,00 Transfiere el offset al par 387A 5F LD E,A DE 387B DD21005B LD IX,5B00 carga IX con el bufer 387F 5F LD E,A por que otra vez?? 3880 DD19 ADD IX,DE Añade el offset al registro IX 3882 0620 LD B,20 coge 32 bytes 3884 7E LD A,(HL) y lo guarda en el bufer de 3885 DD7700 LD (IX+00),A impresora. 3888 23 INC HL sigte. byte a ser impreso 3889 DD23 INC IX sigte. byte en el bufer. 388B 10F7 DJNZ 3884 hasta hacer todos los 32 bytes. 388D 3A815C LD A,(PR-CC) Incrementa numero de columna. 3890 3C INC A 3891 FE08 CP 08 tenemos 8 lineas en el bufer 3893 2806 JR Z,COPY-PRT si, hace un salto 3895 32815C LD (PR-CC),A almacena nuevo numero de col. 3898 DDE1 POP IX Restaura IY 389A C9 RET COPY-PRT Copia el contenido del printerbuffer en 5B00h a una EPSON. 389B F5 COPY-PRT PUSH AF no se destruye el registro A 389C 21005B LD HL,5B00 HL apunta al printer buffer 389F 3E1B LD A,1B envia "1B 41 08" 38A1 CD0A39 CALL 390A,PRT-BYTE (establece el linefeet 38A4 3E41 LD A,41 8/72 pulgadas) 38A6 CD0A39 CALL 390A 38A9 3E08 LD A,08 38AB CD0A39 CALL 390A,PRT-BYTE 38AE 3E1B LD A,1B envia "1B 4D" 38B0 CD0A39 CALL 390A,PRT-BYTE (Selecciona Elite (12 cpi)) 38B3 3E4D LD A,4D 38B5 CD0A39 CALL 390A,PRT-BYTE 38B8 3E1B LD A,1B envia "1B 4B 00 01" 38BA CD0A39 CALL 390A,PRT-BYTE (imprime graficos de densidad 38BD 3E4B LD A,4B estandar, 256 puntos le 38BF CD0A39 CALL 390A,PRT-BYTE seguiran) 38C2 3E00 LD A,00 38C4 CD0A39 CALL 390A,PRT-BYTE 38C7 3E01 LD A,01 38C9 CD0A39 CALL 390A,PRT-BYTE Nota: los pixeles en el bufer son alineados horizontalmente, el cabezal de la impresora tiene los pixeles alineados verticalmente. Hay que tomar un bit de los 8 bytes que estan por encima uno del otro. 38CC 0620 LD B,20 maneja 32 bytes. 38CE 112000 LD DE,0020 Offset entre lineas sucesivas 38D1 C5 NXT-BYTE PUSH BC 38D2 0608 LD B,08 hay 8 pixeles en un byte 38D4 C5 NXT-PIXEL PUSH BC 38D5 E5 PUSH HL 38D6 0608 LD B,08 imprimimos 8 pixeles a la vez 38D8 CB16 NXT-FETCH RL (HL) cogemos 1 bit de este byte 38DA 17 RLA lo cambiamos en el registro A 38DB 19 ADD HL,DE manejamos sigte. byte 38DC 10FA DJNZ 38D8,NXT-FETCH 38DE E1 POP HL 38DF C1 POP BC 38E0 CD0A39 CALL 390A,PRT-BYTE imprime imagen de pixeles en A 38E3 10EF DJNZ 38D4,NXT-PIXEL sigte pixel del set de bytes 38E5 C1 POP BC 38E6 23 INC HL 38E7 10E8 DJNZ 38D1,NXT-BYTE sigte grupo de 8 bytes 38E9 3E0D LD A,0D envia retorno de carro 38EB CD0A39 CALL 390A,PRT-BYTE 38EE 3E0A LD A,0A envia linefeet 38F0 CD0A39 CALL 390A,PRT-BYTE 38F3 3E1B LD A,1B envia "1B 32" 38F5 CD0A39 CALL 390A,PRT-BYTE (linefeed a 1/6 pulgadas) 38F8 3E32 LD A,32 38FA CD0A39 CALL 390A,PRT-BYTE 38FD 3E12 LD A,12 envia DC2 para cancelar Elite 38FF CD0A39 CALL 390A,PRT-BYTE 3902 AF XOR A limpia PR-CC. 3903 32815C LD (PR-CC),A 3906 F1 POP AF Restaura registro A 3907 DDE1 POP IX este se queda en el stack (esta parte era "llamada" por una instruccion jump) 3909 C9 RET PRT-BYTE envia el contenido del registro A a la impresora. El contenido del registro no sera cambiado despues que la rutina haya siso completada. 390A C5 PRT-BYTE PUSH BC Salva todos los registros que 390B F5 PUSH AF necesitemos 390C AF XOR A ve si la impresora esta "BUSY" 390D DBBB PRT-BUSY IN A,(BB) ve linea de datos 8 del puerto 390F 07 RLCA B del Z80-PIO. 3910 38FA JR C,390C,PRT-BUSY Repite si la impresora sigue 3912 F1 POP AF ocupada 3913 F5 PUSH AF Restaura el registro A 3914 D39B OUT (9B),A Pone A en Z80-PIO puerto A 3916 AF XOR A limpia A 3917 D3BB OUT (BB),A baja la señal STROBE, linea 3919 3E02 LD A,02 de datos 2 puerto B. Y lo 391B D3BB OUT (BB),A eleva de nuevo. El dato es 391D F1 POP AF registrado en la impresora 391E C1 POP BC con la señal STROBE. 391F C9 RET Restaura registros y acaba --------------------------------------------------------------------------- ----- Bug de la pag. 34 corregido: sale via PO store. --------------------------------------------------------------------------- ----- 3920 32915C REP-PO-ST LD (P-FLAG),A la instruccion fue sobrescrita 3923 C3DC0A JP 0ADC,PO-STORE salto a PO-STORE (corregido) --------------------------------------------------------------------------- ----- Desperdicio, lo siento! --------------------------------------------------------------------------- ----- 3926 2A805C LD HL,(5C80) 3929 265B LD H,5B 392B C9 RET --------------------------------------------------------------------------- ----- Soporte para impresora serial, llamada por la rutina en 09F4 de la ROM --------------------------------------------------------------------------- ----- 392C CD030B PRINTER CALL 0B03,PO-FETCH la actual posicion de impr. 392F FDCB014E BIT 1,(FLAGS) prueba si imprime, si no continua la rutina original 3933 CAF709 JP Z,09F7 PRINT-OUT 3936 CA283A JP Z,3A28,PR-REINIT (me parece un NOP a mi...) 3939 FE06 CP 06 prueba si PRINT comma (,) 393B CAC839 JP Z,39C8,PR-COMMA maneja coma ("TAB") 393E FE0D CP 0D prueba retorno de carro 3940 2833 JR Z,3975,PR-CR maneja ret. de carro 3942 FE16 CP 16 prueba caracter de control AT 3944 2854 JR Z,399A,PR-AT maneja control AT 3946 FE17 CP 17 prueba caracter control TAB 3948 284A JR Z,3994,PR-TAB maneja contr. TAB 394A FE1C CP 1C No es extension Sinclair 394C 2818 JR Z,3966,PR-TRANS escribe transparente! 394E FE20 CP 20 prueba otros controles 3950 DA0A39 JP C,390A,PRT-BYTE Otros controles de impresora 3953 FE80 CP 80 prueba juego ASCII normal 3955 382F JR C,3986,PR-NORM maneja caracteres normales 3957 FE90 CP 90 prueba bloque graficos 3959 DA0E3A JP C,3A0E,PR-GRAPH maneja bloques graficos 395C D6A5 SUB A5 Re-base en tokens 395E D2100C JP NC,0C10,PO-TOKENS Expande tokens 3961 C615 ADD 15 Re-base en UDGs 3963 C3F939 JP 39F9,PR-UDG maneja UDGs PR-TRANS Escritos ransparentes. El caracter que sigue al control de escrito trans parente sera enviado a la impresora sin modificar. Esto permite imprimir caracteres no sinclair, crea un acceso a todas las capacidades de la impresora sin limitaciones! 3966 116C39 PR-TRANS LD DE,396C Apunta a PR-TRANS2 3969 C3800A JP 0A80,PO-CHANGE Cambia rutina de salida 396C CD0A39 PR-TRANS2 CALL 390A,PRT-BYTE envia byte sin modificar 396F 11F409 LD DE,09F4 apunta a PRINT-OUT 3972 C3800A JP 0A80,PO-CHANGE Cambia la entrada de rutina PR-CR envia linefeet y cariage return a la impresora. 3975 FD364500 PR-CR LD (PR-CC),00 Resetea contador de columna 3979 CD283A CALL 3A28,PR-REINIT Reinicializa el Z80-PIO 397C 3E0A LD A,0A envia linefeet 397E CD0A39 CALL 390A,PRT-BYTE 3981 3E0D LD A,0D envia cariage return 3983 C30A39 JP 390A,PRT-BYTE envia y sale via PRT-BYTE PR-NORM imprime un caracter normal. 3986 FE60 PR-NORM CP 60 Chequea si es un signo libra 3988 2865 JR Z,39EF,PR-POUND si lo es, accion especial 398A FE7F CP 7F Chequea si es un copyright 398C 2866 JR Z,39F4,PR-CRIGHT si lo es, accion especial 398E FD3445 INC (PR-CC) Avanza puntero de columna 3991 C30A39 JP 390A,PRT-BYTE envia byte y sale. PR-TAB y PR-AT Los caracteres de control TAB y AT son seguidos de uno (TAB) o dos, columna y linea (AT). Temporalmente cambiamos el flujo de input a otra rutina para coger los caracteres. Ni la informacion de la linea AT es enviada al cubo de bits (p.e. es saltado). 3994 11A639 PR-TAB LD DE,39A6 apunta a PR-TAB2 3997 C3800A JP 0A80,PO-CHANGE Cambia rutina de salida 399A 11A039 PR-AT LD DE,39A0 apunta a PR-AT2 399D C3800A JP 0A80,PO-CHANGE Cambia la entrada de rutina 39A0 11B439 PR-AT2 LD DE,39B4 apunta a PR-AT3 39A3 C3800A JP 0A80,PO-CHANGE Cambia rutina de salida 39A6 11AE39 PR-TAB2 LD DE,39AE apunta a PR-TAB3 39A9 CD800A CALL 0A80,PO-CHANGE Cambia rutina de salida 39AC 180C JR 39BA,PR-AT-TAB ahora ejecuta TAB 39AE 11F409 PR-TAB3 LD DE,09F4 apunta a PRINT-OUT 39B1 C3800A JP 0A80,PO-CHANGE Cambia rutina de salida 39B4 11F409 PR-AT3 LD DE,09F4 apunta a PRINT-OUT 39B7 CD800A CALL 0A80,PO-CHANGE Cambia rutina de salida 39BA FD9645 PR-AT-TAB SUB (PR-CC) Test contra posicion actual 39BD D8 RET C ya pasamos lae posicion 39BE C8 RET Z ya estamos en la posicion 39BF 47 LD B,A N espacios impresos en B 39C0 3E20 PR-SPACE LD A,20 carga A con un espacio 39C2 CD8639 CALL 3986,PR-NORM imprime el espacio 39C5 10F9 DJNZ 39C0 Repite hasta que B sea 0 39C7 C9 RET PR-COMMA este control (usado en BASIC para tabular columnas) avanza hacia la columna mas cercana la cual es un multiplo de 16. 39C8 FD7E45 PR-COMMA LD A,(PR-CC) busca la posicion actual 39CB 47 LD B,A Salva en el registro B 39CC E6F0 AND F0 Calcula A MOD 16 39CE C610 ADD 10 Añade 16 (tabula cada 16 pos) 39D0 90 SUB B Calcula N espacios a ser 39D1 47 LD B,A impresos 39D2 18EC JR 39C0,PR-SPACE imprime los espacios. 39D4 C9 RET PR-8BYTES imprime caracter o figura grafica de 8x8 pixeles. La imagen es almacenada en MEMBOT. La impresora debe estar configurada para recibir la fig. de 8 bytes. 39D5 0608 PR-8BYTES LD B,08 tenemos 8 pixeles 39D7 C5 PR-8NXTPI PUSH BC Salva el contador de pixeles 39D8 0608 LD B,08 tenemos 8 bytes para manejar 39DA 21925C LD HL,MEMBOT lugar donde estan los bytes 39DD AF XOR A empieza con acumulador limpio 39DE CB16 PR-8NXTBY RL (HL) busca un bit en el byte actual 39E0 CB17 RL A cambia el bit en A 39E2 23 INC HL sigte. byte 39E3 10F9 DJNZ 39DE,PR-8NXTBY hasta 8 Bytes son manejados 39E5 CD0A39 CALL 390A,PRT-BYTE imprime la imagen 39E8 C1 POP BC Restaura el contador de pixel 39E9 10EC DJNZ 39D7,PR-8NXTPI bucle hasta que los 8 pixeles esten listos 39EB FD3445 INC (PR-CC) Incrementa puntero de columna 39EE C9 RET PR-POUND imprime un signo libra. Este caracter no esta disponible en el juego ASCII americano, pero si en el del Spectrum. Tenemos que componer el signo libra nosotros mismos. 39EF 21003F PR-POUND LD HL,3F00 HL apunta al signo libra. 39F2 1810 JR 3A04,PR-IMAGE imprime imagen del caracter cuya direccion esta en HL. PR-CRIGHT imprime el signo de copyright. 39F4 21F83F LD HL,3FF8 HL apunta a copyright. 39F7 1810 JR 3A04,PR-IMAGE imprime PR-UDG imprime graficos definidos por el usuario. A guarda el numero del UDG a imprimir p.e. A=0 imprime UDG "A" = caracter 144 (90H). 39F9 ED5B7B5C PR-UDG LD DE,(UDG) carga DE con la base del UDG 39FD 6F LD L,A el numero del UDG en HL 39FE 2600 LD H,00 3A00 29 ADD HL,HL Multiplica por 8 3A01 29 ADD HL,HL 3A02 29 ADD HL,HL 3A03 19 ADD HL,DE Añade la base del UDG a HL PR-IMAGE una imagen de 8 bytes apuntado por HL se imprime por medio de graficos. 3A04 11925C PR-IMAGE LD DE,MEMBOT espacio guardado brevemente 3A07 010800 LD BC,0008 Copia todos los 8 bytes 3A0A EDB0 LDIR 3A0C 1804 JR 3A12,PR-MEMBOT imprime imagen y retorna. 3A0E 47 PR-GRAPH LD B,A Mueve el codigo grafico 3A0F CD380B CALL 0B38,PO-GR-1 Construye la forma grafica. PR-MEMBOT imprime imagen de 8 bytes guardada en el MEMBOT. 3A12 3E1B PR-MEMBOT LD A,1B envia "1B 4B 08 00" 3A14 CD0A39 CALL 390A,PRT-BYTE (imprime graficos de densidad 3A17 3E4B LD A,4B estandar, 8 bytes seguiran) 3A19 CD0A39 CALL 390A,PRT-BYTE 3A1C 3E08 LD A,08 3A1E CD0A39 CALL 390A,PRT-BYTE 3A21 3E00 LD A,00 3A23 CD0A39 CALL 390A,PRT-BYTE 3A26 18AD JR 39D5,PR-8BYTES envia el grafico de 8 bytes PR-REINIT Inicializa Z80-PIO. Si un programa destruyese el programa del Z80-PIO, esta rutina lo arregla. Esta rutina es llamada cuando un cariage return es enviado a la impresora. 3A28 3E3F PR-REINIT LD A,3F 3A2A D3DB OUT (DB),A 3A2C 3EFF LD A,FF 3A2E D3FB OUT (FB),A 3A30 3E80 LD A,80 3A32 D3FB OUT (FB),A 3A34 3E02 LD A,02 3A36 D3BB OUT (BB),A 3A38 C9 RET --------------------------------------------------------------------------- ----- Corrige bug en pag. 177: -65536. Implementacion parcialmente basada en la pag. 230; fue hecho porque queria continuar la rutina de la ROM original en el punto justo tras el parche en la instruccuon 'JP'. --------------------------------------------------------------------------- ----- 3A39 F5 FIX-177 PUSH AF Salva el signo byte en A. 3A3A 3C INC A hace cada FF en A igual a 00. 3A3B B3 OR E prueba los 3 bytes como cero. 3A3C B2 OR D 3A3D 2014 JR NZ,3A53,ADD-STORE salta si no es -65536. 3A3F F1 POP AF limpia el stack. 3A40 E5 PUSH HL no cambia el puntero HL! 3A41 3680 LD (HL),80 pone 80h en el segundo byte. 3A43 23 INC HL 3A44 3600 LD (HL),00 00h en el tercer byte. 3A46 23 INC HL 3A47 3600 LD (HL),00 00h en el cuarto byte. 3A49 23 INC HL 3A4A 3600 LD (HL),00 00h en el quinto byte. 3A4C E1 POP HL 3A4D 2B DEC HL 3A4E 3691 LD (HL),91 91h en el 1er. byte. 3A50 C33A30 JP 303A,FIXED-177 salta a la instr. POP DE Justo antes del RET de la rutina original. 3A53 F1 ADD-STORE POP AF Las sigtes. instrucciones son dejadas porque el 'JP' fue parchado 3A54 77 LD (HL),A 3A55 23 INC HL 3A56 73 LD (HL),E 3A57 C33530 JP 3035,NOFIX-177 --------------------------------------------------------------------------- ----- Rutina del lapiz optico no es invocada por otras rutinas de la ROM, si no que debe ser llamada desde el BASIC. Esta en 15555, una direccion facil de recordar. La rutina ha sido hecha para un lapiz optico DK'Tronics. Tengo ese lapiz, pero no el esquema de su diagrama. --------------------------------------------------------------------------- ----- 3CC3 0E3F LIGHT-IN LD C,3F 3CC5 210000 LD HL,0000 pone contador de linea a 0 3CC8 11FB01 LD DE,01FB inicia contador bucle tiempo 3CCB 76 HALT espera interrupcion 3CCC 1B LI-TIME1 DEC DE Decrementa contador 3CCD 7A LD A,D Compara con 0 3CCE B3 OR E 3CCF 20FB JR NZ,3CCC,LI-TIME1 sigue bucle si no 0 3CD1 110001 LD DE,0100 tiempo de espera 3CD4 3EFF LD A,FF a continuación para "CP D" 3CD6 ED40 LI-AGAIN IN B,(C) lee puerto entrada lap.opt. 3CD8 CB40 BIT 0,B espera señal del lapiz. 3CDA 2809 JR Z,3CE5,LI-FOUND si hay señal salta 3CDC 060D LD B,0D Inicia contador bucle temp. 3CDE 10FE LI-TIME2 DJNZ 3CDE,LI-TIME2 espera un poco 3CE0 23 INC HL Incrementa contador de Linea 3CE1 1B DEC DE Decrementa contador de tiempo 3CE2 BA CP D Si D igual FF, tiempo espera 3CE3 20F1 JR NZ,3CD6,LI-AGAIN 3CE5 3E00 LI-FOUND LD A,00 Compara si es 00 3CE7 BC CP H Estamos encima de 1ra línea? 3CE8 20D9 JR NZ,3CC3,LIGHT-IN Lap.opt. pos.errada, rehacer 3CEA CB3D SRL L HL cuenta mas rapido 3CEC CB3D SRL L si son filas. Divide por 8 3CEE CB3D SRL L y obtiene real num. linea 3CF0 E5 PUSH HL Transfiere num. linea a BC 3CF1 C1 POP BC contenido de BC sera el valor 3CF2 C9 RET de Retorno de "USR" --------------------------------------------------------------------------- ----- Cambia el caracter flecha (tecla 'H') a '^' que es mas estandar en el ASCII. Tambien es usada mucho en Pascal (Hisoft Pascal HP4TM16) la cual usa este caracter como puntero. --------------------------------------------------------------------------- ----- 3EF2 DEFB 28 3EF3 DEFB 44 3EF4 DEFB 00 3EF5 DEFB 00 3EF6 DEFB 00 --------------------------------------------------------------------------- ----- --------------------- FIN DE LA LISTA DE CAMBIOS --------------------------- / / de Groot Dep: WGA | E-Mail: g...@idca.tds.philips.nl /---/ __ __ / Tel: +31 55 432104 | Corp: Digital Equipment Corporation / / (-_ / / /( Loc: V2-B03 | Site: Apeldoorn, The Netherlands " (c)2022 zx_if1@hotmail.com