; API de ESXDOS.
include "esxdos.inc"
include "errors.inc"

; KEYMAP. Una utilidad para cargar un mapa de teclado en el ZX-Uno
; Necesita sólamente un nombre de fichero de mapa, que debe estar
; guardado en /SYS/KEYMAPS dentro de la tarjeta SD donde esté ESXDOS.

;Para ensamblar con PASMO como archivo binario (no TAP)

ZXUNOADDR           equ 0fc3bh
ZXUNODATA           equ 0fd3bh

                    org 2000h  ;comienzo de la ejecución de los comandos ESXDOS.

Main                proc
                    ld a,h
                    or l
                    jr z,PrintUso  ;si no se ha especificado nombre de fichero, imprimir uso
                    call RecogerNFile

                    call ReadMap
                    ret

PrintUso            ld hl,Uso
BucPrintMsg         ld a,(hl)
                    or a
                    ret z
                    rst 10h
                    inc hl
                    jr BucPrintMsg
                    endp


RecogerNFile        proc   ;HL apunta a los argumentos (nombre del fichero)
                    ld de,BufferNFich
CheckCaracter       ld a,(hl)
                    or a
                    jr z,FinRecoger
                    cp " "
                    jr z,FinRecoger
                    cp ":"
                    jr z,FinRecoger
                    cp 13
                    jr z,FinRecoger
                    ldi
                    jr CheckCaracter
FinRecoger          xor a
                    ld (de),a
                    inc de   ;DE queda apuntando al buffer este que se necesita en OPEN, no sé pa qué.
                    ret
                    endp


ReadMap             proc
                    xor a
                    rst 08h
                    db M_GETSETDRV  ;A = unidad actual
                    ld b,FA_READ    ;B = modo de apertura
                    ld hl,MapFile   ;HL = Puntero al nombre del fichero (ASCIIZ)
                    rst 08h
                    db F_OPEN
                    ret c   ;Volver si hay error
                    ld (FHandle),a

                    ld bc,ZXUNOADDR
                    ld a,7
                    out (c),a   ;select KEYMAP register

                    ld b,4      ;4 chunks of 4096 bytes each to load
BucReadMapFromFile  push bc

                    ld bc,4096
                    ld hl,Buffer
                    ld a,(FHandle)
                    rst 08h
                    db F_READ
                    jr c,PrematureEnd  ;si error, fin de lectura

                    ld hl,Buffer
                    ld bc,ZXUNODATA
                    ld de,4096
BucWriteMapToFPGA   ld a,(hl)
                    out (c),a
                    inc hl
                    dec de
                    ld a,d
                    or e
                    jr nz,BucWriteMapToFPGA

                    pop bc
                    djnz BucReadMapFromFile

                    jr FinReadMap

PrematureEnd        pop bc
                    push af
                    ld a,(FHandle)
                    rst 08h
                    db F_CLOSE
                    pop af
                    ret

FinReadMap          ld a,(FHandle)
                    rst 08h
                    db F_CLOSE
                    or a   ;Volver sin errores a ESXDOS
                    ret
                    endp

                    ;   01234567890123456789012345678901
Uso                 db " KEYMAP file",13,13
                    db "Loads the specified keymap from",13
                    db "/SYS/KEYMAPS and enables it.",13,0

FHandle             db 0

Buffer              ds 4096  ;4KB para buffer de lectura
MapFile             db "/SYS/KEYMAPS/"
BufferNFich         equ $   ;resto de la RAM para el nombre del fichero