; 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 %00011111 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