; Prueba de conversion de Scancode a ASCII ORG 50000 CALL CLS START: CALL Wait_For_No_Key chequear_teclas: CALL Find_Key ; Llamamos a la rutina JR NZ, chequear_teclas ; Repetir si la tecla no es válida INC D JR Z, chequear_teclas ; Repetir si no se pulsó ninguna tecla DEC D ; En este punto D es un scancode valido CALL Scancode2Ascii ; En este punto A contiene el ASCII del scancode en D ; lo imprimimos por pantalla con rst 16. RST 16 JR START ; vuelta a empezar INCLUDE "utils.asm" ;----------------------------------------------------------------------- ; Chequea el teclado para detectar la pulsacion de una tecla. ; Devuelve un código en el registro D que indica: ; ; Bits 0, 1 y 2 de "D": Fila de teclas (puerto) detectada. ; Bits 3, 4 y 5 de "D": Posicion de la tecla en esa media fila ; ; Asi, el valor devuelto nos indica la semifila a leer y el bit a testear. ; El registro D valdra 255 ($FF) si no hay ninguna tecla pulsada. ; ; Flags: ZF desactivado: Mas de una tecla pulsada ; ZF activado: Tecla correctamente leida ;----------------------------------------------------------------------- Find_Key: LD DE, $FF2F ; Valor inicial "ninguna tecla" LD BC, $FEFE ; Puerto NXHALF: IN A, (C) CPL AND $1F JR Z, NPRESS ; Saltar si ninguna tecla pulsada INC D ; Comprobamos si hay mas de 1 tecla pulsada RET NZ ; Si es asi volver con Z a 0 LD H, A ; Calculo del valor de la tecla LD A, E KLOOP: SUB 8 SRL H JR NC, KLOOP RET NZ ; Comprobar si mas de una tecla pulsada LD D, A ; Guardar valor de tecla en D NPRESS: ; Comprobar el resto de semifilas DEC E RLC B JR C, NXHALF ; Repetimos escaneo para otra semifila CP A ; Ponemos flag a zero RET Z ; Volvemos ;----------------------------------------------------------------------- ; Scancode2Ascii: convierte un scancode en un valor ASCII ; IN: D = scancode de la tecla a analizar ; OUT: A = Codigo ASCII de la tecla ;----------------------------------------------------------------------- Scancode2Ascii: PUSH HL PUSH BC LD HL,0 LD BC, TABLA_S2ASCII ADD HL, BC ; hl apunta al inicio de la tabla ; buscamos en la tabla un max de 40 veces por el codigo ; le sumamos 40 a HL, leemos el valor de (HL) y ret A SC2Ascii_1: LD A, (HL) ; leemos un byte de la tabla CP "1" ; Si es "1" fin de la rutina (porque en ; (la tabla habriamos llegado a los ASCIIs) JR Z, SC2Ascii_Exit ; (y es condicion de forzado de salida) INC HL ; incrementamos puntero de HL CP D ; comparamos si A==D (nuestro scancode) JR NZ, SC2Ascii_1 SC2Ascii_Found: LD BC, 39 ; Sumamos 39(+INC HL=40) para ir a la seccion ADD HL, BC ; de la tabla con los codigos ASCII LD A,(HL) ; leemos el codigo ASCII de esa tabla SC2Ascii_Exit: POP BC POP HL RET ; 40 scancodes seguidos de sus ASCIIs equivalentes TABLA_S2ASCII: DEFB $24, $1C, $14, $0C, $04, $03, $0B, $13, $1B, $23 DEFB $25, $1D, $15, $0D, $05, $02, $0A, $12, $1A, $22 DEFB $26, $1E, $16, $0E, $06, $01, $09, $11, $19, $21 DEFB $27, $1F, $17, $0F, $07, $00, $08, $10, $18, $20 DEFB "1234567890QWERTYUIOPASDFGHJKLecZXCVBNMys" END 50000