diff --git a/SD/BIN/SETDATE b/SD/BIN/SETDATE
new file mode 100644
index 0000000..e553f9c
Binary files /dev/null and b/SD/BIN/SETDATE differ
diff --git a/SD/SYS/RTC.SYS b/SD/SYS/RTC.SYS
index e648c05..f4e67a8 100644
Binary files a/SD/SYS/RTC.SYS and b/SD/SYS/RTC.SYS differ
diff --git a/sdk/include/zxuno.def b/sdk/include/zxuno.def
index f80c6fb..8b4b2bd 100644
--- a/sdk/include/zxuno.def
+++ b/sdk/include/zxuno.def
@@ -39,6 +39,7 @@
define dma_len $a4 ; ZX-UNO register to set DMA length
define dma_prob $a5
define dma_stat $a6
+ define i2creg $f8
define ad724 $fb
define core_addr $fc
define core_boot $fd
diff --git a/utils/Makefile b/utils/Makefile
index 5ba65bf..32e70e2 100644
--- a/utils/Makefile
+++ b/utils/Makefile
@@ -49,7 +49,9 @@ BINS=\
BACKUP\
CORCLEAN\
COREBIOS\
- MC\
+ ZX1\
+ SETDATE\
+ RTC.SYS\
ROMSBACK\
ROMSUPGR\
UPGR16M\
@@ -188,7 +190,7 @@ build/UPGRADE: $(srcdir)/upgrade.asm\
$(AS) $(AFLAGS) --raw=$@ $<
-build/MC: $(srcdir)/mc.asm\
+build/ZX1: $(srcdir)/zx1.asm\
$(INCLUDEDIR)/zxuno.def\
$(INCLUDEDIR)/esxdos.def\
$(INCLUDEDIR)/Print.inc\
@@ -197,6 +199,19 @@ build/MC: $(srcdir)/mc.asm\
| build
$(AS) $(AFLAGS) --raw=$@ $<
+build/SETDATE: $(srcdir)/setdate.asm\
+ $(INCLUDEDIR)/zxuno.def\
+ $(INCLUDEDIR)/esxdos.def\
+ $(INCLUDEDIR)/Print.inc\
+ | build
+ $(AS) $(AFLAGS) --raw=$@ $<
+
+build/RTC.SYS: $(srcdir)/rtc.asm\
+ $(INCLUDEDIR)/zxuno.def\
+ $(INCLUDEDIR)/esxdos.def\
+ | build
+ $(AS) $(AFLAGS) --raw=$@ $<
+
build/ZXUNOCFG: $(srcdir)/zxunocfg.asm\
$(INCLUDEDIR)/zxuno.def\
| build
diff --git a/utils/mc.asm b/utils/mc.asm
deleted file mode 100644
index 0a80c2f..0000000
--- a/utils/mc.asm
+++ /dev/null
@@ -1,152 +0,0 @@
-; mc.asm - multicore load any .ZX1 core on slot 9 or 45.
-; File must exists in current directory. It must be run while using a "root" mode ROM.
-;
-; Copyright (C) 2022 Antonio Villena
-;
-; This program is free software: you can redistribute it and/or modify
-; it under the terms of the GNU General Public License as published by
-; the Free Software Foundation, version 3.
-;
-; This program is distributed in the hope that it will be useful,
-; but WITHOUT ANY WARRANTY; without even the implied warranty of
-; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-; GNU General Public License for more details.
-;
-; You should have received a copy of the GNU General Public License
-; along with this program. If not, see .
-;
-; Compatible compilers:
-; SjAsmPlus,
-
-; output MC
- define plugin 0
-
- include zxuno.def
- include esxdos.def
-
- IF plugin=1
- org $8000 ; comienzo requerido si es plugin del navegador
- jr NoPrint
- db 'BP', 0, 0, 0, 0, 'MC plugin - antoniovillena', 0
-
- ELSE
- org $2000 ; comienzo de la ejecución de los comandos ESXDOS
-Main ld a, h
- or l
- jr nz, NoPrint ; si no se ha especificado nombre de fichero, imprimir uso
- call Print
- dz '.mc corefile.zx1', 13, 13, 'Loads and executes a core'
- ret
- ENDIF
-
-NoPrint ld de, FileName
-NextChar ld a, (hl)
- or a
- jr z, EndParse
- cp ' '
- jr c, EndParse
- ldi
- jr NextChar
-EndParse xor a
- ld (de), a
- ld bc, zxuno_port
- out (c), a
- inc b
- in f, (c)
- jp p, Nonlock
- call Print
- dz 'ROM not rooted'
- ret
-Nonlock wreg flash_cs, 0 ; activamos spi, enviando un 0
- wreg flash_spi, $9f ; jedec id
- in a, (c)
- in a, (c)
- in a, (c)
- in a, (c)
- wreg flash_cs, 1 ; desactivamos spi, enviando un 1
- sub $18
- jr z, Goodflsh
- ld hl, $2f80
- ld (Slot+1), hl
- inc a
- inc a
- jr z, Goodflsh
- call Print
- dz 'Incorrect flash IC'
- ret
-Goodflsh ld a, scandbl_ctrl
- dec b
- out (c), a
- inc b
- in a, (c)
- and $3f
- ld (normal+1), a
- or $c0
- out (c), a
- call init
- ld bc, zxuno_port
- ld a, scandbl_ctrl
- out (c), a
- inc b
-normal ld a, 0
- out (c), a
- ret
-init xor a
- esxdos M_GETSETDRV ; A = unidad actual
- jr nc, SDCard
- call Print
- dz 'SD card not inserted'
- ret
-SDCard ld b, FA_READ ; B = modo de apertura
- ld hl, FileName ; HL = Puntero al nombre del fichero (ASCIIZ)
- esxdos F_OPEN
- ld (handle+1), a
- jr nc, FileFound
- call Print
- dz 'File not found'
- ret
-FileFound call Print
- db 13, 'Writing SPI flash', 13
- dz '[', 6, ' ]', 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8
- ld ixl, $15
-Slot ld de, $f7c0
- exx
-Bucle ld a, 'o'
- exx
- push de
- rst $10
- pop de
- exx
-punto ld hl, $8000+plugin*4000
- ld bc, $4000
-handle ld a, 0
- esxdos F_READ
- jr nc, ReadOK
- call Print
- dz 'Read Error'
- ret
-ReadOK ld a, $40
- ld hl, $8000+plugin*4000
- exx
- call wrflsh
- inc de
- exx
- dec ixl
- jr nz, Bucle
- ld bc, zxuno_port
- ld hl, (Slot+1)
- ld a, core_addr
- out (c), a
- inc a
- inc b
- out (c), h
- out (c), l
- out (c), 0
- dec b
- out (c), a
- inc b
- out (c), a
- include Print.inc
- include wrflsh.inc
- include rst28.inc
-FileName
diff --git a/utils/rtc.asm b/utils/rtc.asm
new file mode 100644
index 0000000..318e3b6
--- /dev/null
+++ b/utils/rtc.asm
@@ -0,0 +1,187 @@
+; rtc.asm - return date for esxdos call on $2700
+;
+; Copyright (C) 2022 Antonio Villena/McLeod_ideafix
+;
+; This program is free software: you can redistribute it and/or modify
+; it under the terms of the GNU General Public License as published by
+; the Free Software Foundation, version 3.
+;
+; This program is distributed in the hope that it will be useful,
+; but WITHOUT ANY WARRANTY; without even the implied warranty of
+; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+; GNU General Public License for more details.
+;
+; You should have received a copy of the GNU General Public License
+; along with this program. If not, see .
+;
+; Compatible compilers:
+; SjAsmPlus,
+;
+;-------------------------------------------------------------------------------
+
+; output RTC.SYS
+
+ define SCL0SDA0 00b
+ define SCL0SDA1 01b
+ define SCL1SDA0 10b
+ define SCL1SDA1 11b
+ define I2CADDR_R $a3
+ define I2CADDR_W $a2
+
+ include zxuno.def
+ include esxdos.def
+
+ org $2700
+
+ ld bc, ZXUNOADDR
+ ld a, i2creg
+ out (c), a ; selecciono el registro I2C.
+ inc b
+
+ReadDateTime ld hl, Params
+ ;ld e, 1
+ ;call SendW ;Envío en modo escritura el número de registro desde donde quiero empezar a leer
+
+SendW ;Transmite E bytes apuntados por HL al bus I2C (escritura)
+ ld a, SCL1SDA1 ;Bus en modo idle.
+ out (c), a ;Envío condición de START al bus (SDA a 0 mientras mantengo SCL a 1)
+ dec a ;ld a,SCL1SDA0
+ out (c), a
+ ld a, I2CADDR_W ;Envío la dirección I2C de escritura del RTC
+ call SendByte
+
+LoopSendMess ;ld a, (hl) ;y en un bucle, me pongo a enviar uno tras otro, los E bytes a los que apunta HL
+ ld a, 2 ;y en un bucle, me pongo a enviar uno tras otro, los E bytes a los que apunta HL
+; inc hl
+ call SendByte
+; dec e
+; jr nz, LoopSendMess
+ call Send0 ;después de enviar el ultimo byte, envío la condición de STOP al bus (envío un 0, con lo que se queda SDA a 0 y SCL a 1, y a continuación pongo SDA a 1)
+ inc d ;ld d, SCL1SDA1
+ out (c), d
+; ret
+
+ ld e, 7
+
+; call SendR ;Y a continuación espero recibir 7 bytes (segundos, minutos, horas, día del mes, día de la semana (que no uso), mes, y dos últimos dígitos del año
+
+SendR ;Recibo E bytes que se guardarán a partir de donde indique HL
+ ld a, SCL1SDA1 ;Bus en modo idle.
+ out (c), a
+ ;Envío la condición de START al bus I2C
+ dec a ;ld a,SCL1SDA0
+ out (c), a
+
+ ld a, I2CADDR_R ;Envío la dirección I2C de lectura del RTC
+ call SendByte
+
+LoopSendR call nz, Send0 ;enviar un ACK es enviar un 0
+ call RcvByte ;y en un bucle, me pongo a recibir un byte detrás de otro. Tras cada byte, menos el último, envío ACK
+ ld (hl), a
+ inc hl
+ dec e
+ jr nz, LoopSendR
+
+SendNACKandP call Send1 ;aquí llego si acabo de recibir el último byte. Envío un NACK (un 1)
+ call Send0 ;y a continuación envío la condición de STOP al bus I2C
+ inc d ;ld d, SCL1SDA1
+ out (c), d
+; ret
+
+ ld hl, Params
+ ld b, %01111110 ;Segundos
+ call BCDtobin
+ rrca ;Segundos / 2
+ ld e, a ;Guarda en E
+ ld b, %01111111 ;Minutos
+ call BCDtobin
+ rrca
+ rrca
+ rrca
+ ld d, a
+ and %11100000
+ or e
+ ld e, a
+ ld b, %00111111 ;Horas
+ call BCDtobin
+ rlca
+ rlca
+ rlca
+ xor d
+ and %11111000
+ xor d
+ ld d, a
+ push de
+ ld b, %00111111 ;Días
+ call BCDtobin
+ ld e, a
+ inc hl
+ ld b, %00011111 ;Siglo/Mes
+ ld c, (hl)
+ call BCDtobin
+ rrca
+ rrca
+ rrca
+ ld d, a
+ and %11100000
+ or e
+ ld e, a
+ dec b
+ call BCDtobin
+ bit 7, c
+ jr z, Milnov
+ add 100
+Milnov sub 80
+ rr d
+ adc a, a
+ ld b, a
+ ld c, e
+ pop de
+ ret
+
+BCDtobin ld a, (hl)
+ inc hl
+ and b
+ ld b, 0
+Repite inc b
+ sub $10
+ jr nc, Repite
+Suma10 add a, 10
+ djnz Suma10
+ add a, 6
+ ret
+
+Params ;db 02h ; VL_seconds register . Indico que quiero empezar a leer desde aquí (que es lo típico para leer toda la fecha y hora)
+ db 0,40h,16h,24h,01h,10h,22h ;La hora a la que quieres poner el reloj. En lectura, estos datos se machacan con la hora leída del RTC
+ ; S M H D W Mo Y (en BCD) OJO cuidao porque el dígito de las decenas no usa todos los bits (excepto en el año)
+ ; así que hay que enmascararlo antes de hacer algo con él (yo lo hago justo antes de imprirmilo)
+
+SendByte ;Enviar un byte por I2C. Byte en A. BC=puerto de datos del ZXUNO ya apuntando a I2CREG. Usa y modifica: A, D, flags
+ scf
+TransBit adc a, a ;A otro bit
+ jr z, Endbyte
+ call c, Send1
+ call nc, Send0
+ and a
+ jr TransBit
+Endbyte ; Wait for ACK
+Send1 ld d, SCL0SDA1
+ out (c), d
+ ld d, SCL1SDA1
+ out (c), d ;Transmito un bit 1 para dejar SDA en modo de alta impedancia y que el receptor puedo ponerlo a 0
+ ret ; S flag 0 = ACK received, S flag 1 = ACK not received
+
+RcvByte ;byte a recibir en A. BC=puerto de datos del ZXUNO ya apuntando a I2CREG. Usa y modifica: A, D, flags
+ ld a, 1
+RcvBit call Send1 ;envío un pulso de reloj con SDA a alta impedancia
+ in d, (c) ;el RTC pone aquí el dato (1 o 0) y lo leo (está en bit 7 de D)
+ sll d ;bit 7 a carry
+ adc a, a ;carry a bit 0 de A, y desplazo a la izquierda
+ jr nc, RcvBit
+ ret
+
+Send0 ld d, SCL0SDA0
+ out (c), d
+ ld d, SCL1SDA0
+ out (c), d
+ ret
diff --git a/utils/setdate.asm b/utils/setdate.asm
new file mode 100644
index 0000000..3c30e57
--- /dev/null
+++ b/utils/setdate.asm
@@ -0,0 +1,138 @@
+; setdate.asm - set date and time using pcf8563
+; .setdate YYYYMMDDHHMMSS
+;
+; Copyright (C) 2022 Antonio Villena/McLeod_ideafix
+;
+; This program is free software: you can redistribute it and/or modify
+; it under the terms of the GNU General Public License as published by
+; the Free Software Foundation, version 3.
+;
+; This program is distributed in the hope that it will be useful,
+; but WITHOUT ANY WARRANTY; without even the implied warranty of
+; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+; GNU General Public License for more details.
+;
+; You should have received a copy of the GNU General Public License
+; along with this program. If not, see .
+;
+; Compatible compilers:
+; SjAsmPlus,
+
+; output SETDATE
+
+ define SCL0SDA0 00b
+ define SCL0SDA1 01b
+ define SCL1SDA0 10b
+ define SCL1SDA1 11b
+ define I2CADDR_R $a3
+ define I2CADDR_W $a2
+
+ include zxuno.def
+ include esxdos.def
+
+ org $2000 ; comienzo de la ejecución de los comandos ESXDOS
+NoPrint ld (Command+1), hl
+ ld a, h
+ or l
+ jp nz, Init
+ call Print
+ db 13, 'Usage:', 13
+ db ' .SETDATE YYYYMMDDHHMMSS', 13
+ db 'Example:', 13
+ dz ' .SETDATE 20151021072800', 13
+ ret
+
+Params db 02h ; VL_seconds register . Indico que quiero empezar a leer desde aquí (que es lo típico para leer toda la fecha y hora)
+ db 0,40h,16h,24h,01h,10h,22h,0 ;La hora a la que quieres poner el reloj. En lectura, estos datos se machacan con la hora leída del RTC
+ ; S M H D W Mo Y
+
+Wrong call Print
+ dz 'Wrong format entered', 13
+ ret
+Init ld b, 15
+Repite ld a, (hl)
+ cp 13
+ jr z, Fincad
+ inc hl
+ dec b
+ sub $30
+ cp 10
+ jr c, Repite
+Fincad djnz Wrong
+Command ld hl, 0
+ ld de, Params+8
+ call ReadBCD
+ cp $20
+ jr nz, Centone
+ ld b, $80
+Centone inc de
+ call ReadBCD
+ call ReadBCD
+ xor b
+ call ReadBCD
+ dec de
+ call ReadBCD
+ call ReadBCD
+ call ReadBCD
+ ld (de), a
+ ld hl, Params
+ ld e, 8
+ ld bc, ZXUNOADDR
+ ld a, i2creg
+ out (c), a ; selecciono el registro I2C.
+ inc b
+ ld a, SCL1SDA1 ;Bus en modo idle.
+ out (c), a ;Envío condición de START al bus (SDA a 0 mientras mantengo SCL a 1)
+ dec a ;ld a,SCL1SDA0
+ out (c), a
+ ld a, I2CADDR_W ;Envío la dirección I2C de escritura del RTC
+ call SendByte
+LoopSendMess ld a, (hl) ;y en un bucle, me pongo a enviar uno tras otro, los E bytes a los que apunta HL
+ inc hl
+ call SendByte
+ dec e
+ jr nz, LoopSendMess
+ call Send0 ;después de enviar el ultimo byte, envío la condición de STOP al bus (envío un 0, con lo que se queda SDA a 0 y SCL a 1, y a continuación pongo SDA a 1)
+ inc d ;ld d, SCL1SDA1
+ out (c), d
+ or a
+ ret
+
+SendByte ;Enviar un byte por I2C. Byte en A. BC=puerto de datos del ZXUNO ya apuntando a I2CREG. Usa y modifica: A, D, flags
+ scf
+TransBit adc a, a ;A otro bit
+ jr z, Endbyte
+ call c, Send1
+ call nc, Send0
+ and a
+ jr TransBit
+Endbyte ; Wait for ACK
+Send1 ld d, SCL0SDA1
+ out (c), d
+ ld d, SCL1SDA1
+ out (c), d ;Transmito un bit 1 para dejar SDA en modo de alta impedancia y que el receptor puedo ponerlo a 0
+ ret ; S flag 0 = ACK received, S flag 1 = ACK not received
+
+Send0 ld d, SCL0SDA0
+ out (c), d
+ ld d, SCL1SDA0
+ out (c), d
+ ret
+
+ReadBCD ld (de), a
+ dec de
+ ld a, (hl)
+ inc hl
+ sub $30
+ rlca
+ rlca
+ rlca
+ rlca
+ ld c, a
+ ld a, (hl)
+ inc hl
+ sub $30
+ or c
+ ret
+
+ include Print.inc
diff --git a/utils/zx1.asm b/utils/zx1.asm
new file mode 100644
index 0000000..43c964a
--- /dev/null
+++ b/utils/zx1.asm
@@ -0,0 +1,947 @@
+; mc.asm - multicore load any .ZX1 core on slot 9 or 45.
+; File must exists in current directory. It must be run while using a "root" mode ROM.
+;
+; Copyright (C) 2022 Antonio Villena
+;
+; This program is free software: you can redistribute it and/or modify
+; it under the terms of the GNU General Public License as published by
+; the Free Software Foundation, version 3.
+;
+; This program is distributed in the hope that it will be useful,
+; but WITHOUT ANY WARRANTY; without even the implied warranty of
+; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+; GNU General Public License for more details.
+;
+; You should have received a copy of the GNU General Public License
+; along with this program. If not, see .
+;
+; Compatible compilers:
+; SjAsmPlus,
+
+; output ZX1
+
+ define romtbl $d000
+ define indexe $e000
+ define active $e040
+
+ define bitstr active+1
+ define quietb bitstr+1
+ define checkc quietb+1
+ define keyiss checkc+1
+ define timing keyiss+1
+ define conten timing+1
+ define divmap conten+1
+ define nmidiv divmap+1
+ define grapmo nmidiv+1
+ define layout grapmo+1
+ define joykey layout+1
+ define joydb9 joykey+1
+ define split joydb9+1
+ define outvid split+1
+ define scanli outvid+1
+ define freque scanli+1
+ define cpuspd freque+1
+ define copt cpuspd+1
+ define cburst copt+1
+
+ define cmbpnt $e100
+ define cmbcor $e1d0 ;lo: Y coord hi: X coord
+ define items $e1d2 ;lo: totales hi: en pantalla
+ define offsel $e1d4 ;lo: offset visible hi: seleccionado
+ define empstr $e1d6
+ define tmpbuf $e200
+
+ include zxuno.def
+ include esxdos.def
+
+ org $8000
+ jr NoPrint
+ db 'BP', 0, 0, 0, 0, 'ZX1 plugin - antoniovillena', 0
+NoPrint ld (FileName+1), hl
+ ld bc, zxuno_port
+ out (c), 0
+ inc b
+ in f, (c)
+ jp p, Nonlock
+ call Print
+ dz 'ROM not rooted'
+ ret
+Nonlock wreg flash_cs, 0 ; activamos spi, enviando un 0
+ wreg flash_spi, $9f ; jedec id
+ in a, (c)
+ in a, (c)
+ in a, (c)
+ in a, (c)
+ wreg flash_cs, 1 ; desactivamos spi, enviando un 1
+ sub $18
+ jr z, Goodflsh
+ ld hl, $2f80
+ ld (Slot+1), hl
+ inc a
+ inc a
+ jr z, Goodflsh
+ call Print
+ dz 'Incorrect flash IC'
+ ret
+Goodflsh ld a, scandbl_ctrl
+ dec b
+ out (c), a
+ inc b
+ in a, (c)
+ and $3f
+ ld (Normal+1), a
+ or $c0
+ out (c), a
+ call Init
+ ld bc, zxuno_port
+ ld a, scandbl_ctrl
+ out (c), a
+ inc b
+Normal ld a, 0
+ out (c), a
+ ld a, 7 ;PLUGIN_OK|PLUGIN_RESTORE_SCREEN|PLUGIN_RESTORE_BUFFERS
+ ret
+Init wreg flash_cs, 1
+ ld de, indexe
+ ld hl, $0070
+ ld a, 1
+ call rdflsh
+ xor a
+ esxdos M_GETSETDRV ; A = unidad actual
+ jr nc, SDCard
+ call Print
+ dz 'SD card not inserted'
+ ret
+SDCard ld (Drive+1), a
+ ld b, FA_READ ; B = modo de apertura
+FileName ld hl, 0
+ esxdos F_OPEN
+ ld (Handle+1), a
+ jr nc, FileFound
+ call Print
+ dz 'File not found'
+ ret
+FileFound ld hl, Stat
+ esxdos F_FSTAT
+ ld hl, (Stat+7)
+ ld bc, $1041
+ sbc hl, bc
+ jp z, Roms
+ call Print
+ db 13, 'Writing SPI flash', 13
+ dz '[', 6, ' ]', 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8
+ ld ixl, $15
+Slot ld de, $f7c0
+ exx
+Bucle ld a, 'o'
+ exx
+ push de
+ rst $10
+ pop de
+ exx
+ ld hl, $c000
+ ld bc, $4000
+Handle ld a, 0
+ esxdos F_READ
+ jr nc, ReadOK
+ call Print
+ dz 'Read Error'
+ ret
+ReadOK ld a, $40
+ ld hl, $c000
+ exx
+ call wrflsh
+ inc de
+ exx
+ dec ixl
+ jr nz, Bucle
+ ld bc, zxuno_port
+ ld hl, (Slot+1)
+ ld a, core_addr
+ out (c), a
+ inc a
+ inc b
+ out (c), h
+ out (c), l
+ out (c), 0
+ dec b
+ out (c), a
+ inc b
+ out (c), a
+ include Print.inc
+ include rdflsh.inc
+ include wrflsh.inc
+ include rst28.inc
+
+Roms ld a, (Handle+1)
+ ld hl, romtbl
+ esxdos F_READ
+ ld hl, chrBegin
+ ld de, $c400-Stat+chrBegin
+ ld bc, Stat-chrBegin
+ ldir
+ ld hl, $c000
+Roms1 ld b, $04
+Roms2 ld a, (hl)
+ rrca
+ rrca
+ ld (de), a
+ inc de
+ cpi
+ jp pe, Roms2
+ jr nc, Roms1
+ push ix
+
+;++++++++++++++++++++++++++++++++++
+;++++++++ Boot list ++++++++
+;++++++++++++++++++++++++++++++++++
+blst ld hl, indexe
+numen1 ld a, (hl) ; calculo en L el número de entradas
+ inc l
+ inc a
+ jr nz, numen1
+ ld a, l
+ cp 13
+ jr c, blst1
+ ld a, 13
+blst1 ld h, a
+ ld (items), hl
+ add a, -25
+ cpl
+ rra
+ ld l, a
+ ld a, h
+ add a, 2
+ ld e, a
+ ld a, %01001111 ; fondo azul tinta blanca
+ ld h, $01 ; coordenada X
+ ld d, $1c ; anchura de ventana
+ push hl
+ call window
+ ld ix, cad1
+ pop bc
+ inc b
+ call prnstr
+ push bc
+ ld iy, (items)
+blst2 ld ix, cad2
+ call prnstr ; | |
+ dec iyh
+ jr nz, blst2
+ ld ix, cad3
+ call prnstr
+ ld iy, indexe
+ ld ix, cmbpnt
+ ld de, tmpbuf
+ ld b, e
+blst3 ld l, (iy)
+ inc l
+ call calcu
+addbls ld (ix+0), e
+ ld (ix+1), d
+ push hl
+ ld c, $21
+ push hl
+str2t1 dec hl
+ dec c
+ ld a, (hl)
+ cp $20
+ jr z, str2t1
+ pop hl
+ ld a, l
+ sub $20
+ ld l, a
+ jr nc, str2t2
+ dec h
+str2t2 ldir
+ xor a
+ ld (de), a
+ inc de
+ pop hl
+addbl1 inc iyl
+ inc ixl
+ inc ixl
+ ld a, (items)
+ sub 2
+ sub iyl
+ jr nc, blst3
+bls37 ld (ix+1), a
+ ld a, (items+1)
+ ld e, a
+ ld d, 32
+ ld a, (active)
+bls38 pop hl
+ ld h, 4
+blst4 ei
+
+combol push hl
+ push de
+ ex af, af'
+ ld (cmbcor), hl
+ ld hl, cmbpnt+1
+combo1 ld a, (hl)
+ inc l
+ inc l
+ inc a
+ jr nz, combo1
+ srl l
+ dec l
+ ld c, l
+ ld h, e
+ ld b, d
+ ld (items), hl
+ ld hl, empstr
+combo2 ld (hl), $20
+ inc l
+ djnz combo2
+ ld (hl), a
+ ex af, af'
+ ld (offsel+1), a
+ sub e
+ jr nc, combo3
+ sbc a, a
+combo3 inc a
+combo4 ld (offsel), a
+ ld iy, (items)
+ ld iyl, iyh
+ ld bc, (cmbcor)
+ ld a, iyl
+ or a
+ jr z, combo7
+combo5 ld ix, empstr
+ call prnstr
+ dec iyl
+ jr nz, combo5
+ ld a, (offsel)
+ ld bc, (cmbcor)
+ add a, a
+ ld h, cmbpnt>>8
+ ld l, a
+combo6 ld a, (hl)
+ ld ixl, a
+ inc l
+ ld a, (hl)
+ inc l
+ ld ixh, a
+ push hl
+ call prnstr
+ pop hl
+ dec iyh
+ jr nz, combo6
+combo7 ld de, $1a02
+ ld hl, (cmbcor)
+ ld h, e
+ ld a, (items+1)
+ ld e, a
+ ld a, %01001111
+ call window
+ ld de, $1a02
+ ld hl, (offsel)
+ ld a, (cmbcor)
+ add a, h
+ sub l
+ ld l, a
+ ld h, e
+ ld e, 1
+ ld a, %01000111
+ call window
+waitky in a, ($fe)
+ or %11100000
+ inc a
+ jr z, waitky
+ ld bc, (items)
+ ld hl, (offsel)
+ ld a, $ef ;67
+ in a, ($fe)
+ bit 3, a
+ jr nz, combo9
+ call halt8
+ dec h
+ jp m, combo7
+ ld a, h
+ cp l
+ ld (offsel), hl
+ jr nc, combo7
+ ld a, l
+ dec a
+combo8 jp combo4
+combo9 bit 4, a
+ jr nz, comboa
+ call halt8
+ inc h
+ ld a, h
+ cp c
+ jr z, combo7
+ sub l
+ cp b
+ ld (offsel), hl
+ jr nz, combo7
+ ld a, l
+ inc a
+ jr combo8
+comboa ld a, $bf ;enter
+ in a, ($fe)
+ rrca
+ jr nc, execut
+salir pop de
+ pop hl
+ pop ix
+halt8 halt
+ halt
+ halt
+ halt
+ halt
+ halt
+ halt
+ halt
+ halt
+ halt
+ halt
+ halt
+ ret
+
+execut ld l, h
+
+ccon0 ld h, active>>8
+ ld l, (hl)
+ call calcu
+ ld de, Stat
+ ld a, (hl)
+ push de
+ pop ix
+ ld bc, 5
+ ldir
+ ld l, a
+ ld a, (ix+1)
+ ld iyh, a
+ add hl, hl
+ add hl, hl
+ add hl, hl
+ add hl, hl
+ add hl, hl
+ add hl, hl
+ ld d, l
+ ld e, 0
+ ld c, h
+ ld b, e
+ ld a, (Handle+1)
+ ld l, SEEK_CUR
+ esxdos F_SEEK
+ ld iyl, 28
+
+ call Bootoogle
+cont66 ld bc, zxuno_port
+ ld a, master_mapper
+ out (c), a
+ inc b
+ ld a, iyl
+ inc iyl
+ out (c), a
+ call Bootoogle
+ ld hl, $a000
+ ld bc, $2000
+ ld a, (Handle+1)
+ esxdos F_READ
+ call Bootoogle
+ ld hl, $a000
+ ld bc, $2000
+ ld de, $c000
+ ldir
+
+ call Bootoogle
+ ld hl, $a000
+ ld bc, $2000
+ ld a, (Handle+1)
+ esxdos F_READ
+ call Bootoogle
+ ld hl, $a000
+ ld bc, $2000
+ ld de, $e000
+ ldir
+ dec iyh
+ jr nz, cont66
+
+ call Bootoogle
+ ld a, (Handle+1)
+ esxdos F_CLOSE
+
+Drive ld a, 0
+ ld b, FA_WRITE | FA_OPEN_AL ; B = modo de apertura
+ ld hl, Groms
+ esxdos F_OPEN
+ ld (Handle+1), a
+ jr nc, FileFo
+ call Print
+ dz 'Cannot open GROMS.ZX1'
+ ret
+FileFo
+
+ ld iyl, 28
+cont67 call Bootoogle
+ ld bc, zxuno_port
+ ld a, master_mapper
+ out (c), a
+ inc b
+ ld a, iyl
+ inc iyl
+ out (c), a
+ ld hl, $c000
+ ld bc, $2000
+ ld de, $a000
+ ldir
+ call Bootoogle
+ ld hl, $a000
+ ld bc, $2000
+ ld a, (Handle+1)
+ esxdos F_WRITE
+
+ call Bootoogle
+ ld hl, $e000
+ ld bc, $2000
+ ld de, $a000
+ ldir
+ call Bootoogle
+ ld hl, $a000
+ ld bc, $2000
+ ld a, (Handle+1)
+ esxdos F_WRITE
+ dec (ix+1)
+ jr nz, cont67
+
+ ld a, (Handle+1)
+ esxdos F_CLOSE
+
+
+ ld a, 2
+ out ($fe), a
+oooo jr oooo
+
+
+
+ ld d, (ix+2)
+ ld hl, timing
+ ld a, (outvid)
+ rrca
+ ld a, 3
+ ld b, a
+ jr c, ccon1
+ cp (hl) ; timing
+ ld b, (hl)
+ jr nz, ccon1
+ ld b, d
+ccon1 and b ; 0 0 0 0 0 0 MODE1 MODE0
+ rrca ; MODE0 0 0 0 0 0 0 MODE1
+ inc l
+ srl (hl) ; conten
+ jr z, ccon2
+ bit 4, d
+ jr z, ccon2
+ ccf
+ccon2 adc a, a ; 0 0 0 0 0 0 MODE1 /DISCONT
+ ld l, keyiss & $ff
+ rr b
+ adc a, a ; 0 0 0 0 0 MODE1 /DISCONT MODE0
+ srl (hl) ; keyiss
+ jr z, ccon3
+ bit 5, d
+ jr z, ccon3
+ ccf
+ccon3 adc a, a ; 0 0 0 0 MODE1 /DISCONT MODE0 /I2KB
+ ld l, nmidiv & $ff
+ srl (hl) ; nmidiv
+ jr z, conti1
+ bit 2, d
+ jr z, conti1
+ ccf
+conti1 adc a, a ; 0 0 0 MODE1 /DISCONT MODE0 /I2KB /DISNMI
+ dec l
+ srl (hl) ; divmap
+ jr z, conti2
+ bit 3, d
+ jr z, conti2
+ ccf
+conti2 adc a, a ; 0 0 MODE1 /DISCONT MODE0 /I2KB /DISNMI DIVEN
+ add a, a ; 0 MODE1 /DISCONT MODE0 /I2KB /DISNMI DIVEN 0
+ xor d
+ and %01111111
+ xor d
+ xor %10101100 ; LOCK MODE1 DISCONT MODE0 I2KB DISNMI DIVEN 0
+ ld (conti9+1), a
+
+micont ld iyl, 28
+ ld a, (ix+1)
+ ld iyh, a
+
+ IF 0
+conti5 wreg master_conf, 1
+ ld a, master_mapper
+ dec b
+ out (c), a
+ inc b
+ ld a, iyl
+ inc iyl
+ out (c), a
+ wreg master_conf, 2
+ ld hl, $6000
+ ld bc, $1000
+ ld a, (Handle+1)
+ esxdos F_READ
+ wreg master_conf, 1
+ ld hl, $6000
+ ld bc, $1000
+ ld de, $c000
+ ldir
+ wreg master_conf, 2
+ ld hl, $6000
+ ld bc, $1000
+ ld a, (Handle+1)
+ esxdos F_READ
+ wreg master_conf, 1
+ ld hl, $6000
+ ld bc, $1000
+ ld de, $d000
+ ldir
+ wreg master_conf, 2
+ ld hl, $6000
+ ld bc, $1000
+ ld a, (Handle+1)
+ esxdos F_READ
+ wreg master_conf, 1
+ ld hl, $6000
+ ld bc, $1000
+ ld de, $e000
+ ldir
+ wreg master_conf, 2
+ ld hl, $6000
+ ld bc, $1000
+ ld a, (Handle+1)
+ esxdos F_READ
+ wreg master_conf, 1
+ ld hl, $6000
+ ld bc, $1000
+ ld de, $f000
+ ldir
+ dec iyh
+ jp nz, conti5
+ ENDIF
+
+; wreg master_conf, 2
+
+cont55 wreg master_conf, 1
+ ld a, master_mapper
+ dec b
+ out (c), a
+ inc b
+ ld a, iyl
+ inc iyl
+ out (c), a
+ ld hl, $c000
+ ld bc, $2000
+ ld de, $a000
+ ldir
+ wreg master_conf, 2
+ ld hl, $a000
+ ld bc, $2000
+handle2 ld a, 0
+ esxdos F_WRITE
+ wreg master_conf, 1
+ ld hl, $e000
+ ld bc, $2000
+ ld de, $a000
+ ldir
+ wreg master_conf, 2
+ ld hl, $a000
+ ld bc, $2000
+ ld a, (handle2+1)
+ esxdos F_WRITE
+ dec (ix+1)
+ jr nz, cont55
+
+ ld a, (handle2+1)
+ esxdos F_CLOSE
+
+ ld a, 1
+ out ($fe), a
+ di
+ halt
+
+; jp conti9
+
+; ei
+
+ wreg master_conf, 1
+ ld iyl, 28
+conti6 ld a, master_mapper
+ dec b
+ out (c), a
+ inc b
+ ld a, iyl
+ out (c), a
+ ld hl, $c000
+ ld bc, $2000
+ ld de, $a000
+ ldir
+ ld a, master_mapper
+ dec b
+ out (c), a
+ inc b
+ ld a, iyl
+ sub 20
+ out (c), a
+ ld hl, $a000
+ ld bc, $2000
+ ld de, $c000
+ ldir
+ ld a, master_mapper
+ dec b
+ out (c), a
+ inc b
+ ld a, iyl
+ out (c), a
+ ld hl, $e000
+ ld bc, $2000
+ ld de, $a000
+ ldir
+ ld a, master_mapper
+ dec b
+ out (c), a
+ inc b
+ ld a, iyl
+ sub 20
+ out (c), a
+ ld hl, $a000
+ ld bc, $2000
+ ld de, $e000
+ ldir
+ inc iyl
+ dec iyh
+ jr nz, conti6
+
+; ld a, 1
+; out ($fe), a
+; halt
+
+conti9 ld a, 0
+ dec b
+ out (c), 0
+ inc b
+ out (c), a
+ dec b
+ ld a, dev_control
+ out (c), a
+ inc b
+ ld a, (ix+3)
+ out (c), a
+ dec b
+ ld a, dev_control2
+ out (c), a
+ inc b
+ in a, (c)
+ and %11111000
+ ld l, a
+ ld a, (grapmo)
+ srl a
+ jr c, contib
+ ld a, 7 ; Resv Resv Resv Resv Resv DIRADAS DITIMEX DIULAPLUS
+ jr z, contib
+ ld a, (ix+4)
+contib or l
+ out (c), a
+ rst 0
+
+; -------------------------------------
+; Draw a window in the attribute area
+; Parameters:
+; A: attribute color
+; HL: X coordinate (H) and Y coordinate (L)
+; DE: window width (D) and window height (E)
+; -------------------------------------
+window push hl
+ push de
+ ld c, h
+ add hl, hl
+ add hl, hl
+ add hl, hl
+ ld h, $16
+ add hl, hl
+ add hl, hl
+ ld b, 0
+ add hl, bc
+windo1 ld b, d
+windo2 ld (hl), a
+ inc hl
+ djnz windo2
+ ld c, d
+ sbc hl, bc
+ ld c, $20
+ add hl, bc
+ dec e
+ jr nz, windo1
+ pop de
+ pop hl
+ ret
+
+; -------------------------------------
+; Calculate ROM entry address
+; Parameters:
+; L: input slot
+; Returns:
+; HL: destination address
+; -------------------------------------
+calcu add hl, hl
+ add hl, hl
+ ld h, romtbl >> 12
+ add hl, hl
+ add hl, hl
+ add hl, hl
+ add hl, hl
+ ret
+
+; -----------------------------------------------------------------------------
+; Print string routine
+; Parameters:
+; BC: X coord (B) and Y coord (C)
+; IX: null terminated string
+; -----------------------------------------------------------------------------
+prnstr push bc
+ call prnstr1
+ pop bc
+ inc c
+ ret
+prnstr1 ld a, b
+ and %11111100
+ ld d, a
+ xor b
+ ld b, a
+ ld e, a
+ jr z, prnch1
+ dec e
+prnch1 ld a, d
+ rrca
+ ld d, a
+ rrca
+ add a, d
+ add a, e
+ ld e, a
+ ld a, c
+ and %00011000
+ or %01000000
+ ld d, a
+ ld a, c
+ and %00000111
+ rrca
+ rrca
+ rrca
+ add a, e
+ ld e, a
+ rr b
+ jr c, pos26
+ jr nz, pos4
+pos0 ld a, (ix)
+ inc ix
+ add a, a
+ ret z
+ ld h, $c0 >> 2
+ ld b, 8
+ ld l, a
+ add hl, hl
+ add hl, hl
+pos01 ld a, (hl)
+ ld (de), a
+ inc d
+ inc l
+ djnz pos01
+ ld hl, $f800
+ add hl, de
+ ex de, hl
+pos2 ld a, (ix)
+ inc ix
+ add a, a
+ ret z
+ ld h, $cc >> 2
+ ld bc, $04fc
+ call doble
+pos4 ld a, (ix)
+ inc ix
+ add a, a
+ ret z
+ ld h, $c8 >> 2
+ ld bc, $04f0
+ call doble
+pos6 ld a, (ix)
+ inc ix
+ add a, a
+ ret z
+ ld h, $c4 >> 2
+ ld b, 8
+ ld l, a
+ add hl, hl
+ add hl, hl
+pos61 ld a, (de)
+ xor (hl)
+ ld (de), a
+ inc d
+ inc l
+ djnz pos61
+ ld hl, $f801
+ add hl, de
+ ex de, hl
+ jr pos0
+pos26 rr b
+ jr c, pos6
+ jr pos2
+
+doble ld l, a
+ add hl, hl
+ add hl, hl
+doble2 ld a, (de)
+ xor (hl)
+ and c
+ xor (hl)
+ ld (de), a
+ inc e
+ ld a, (hl)
+ and c
+ ld (de), a
+ inc d
+ inc l
+ ld a, (hl)
+ and c
+ ld (de), a
+ dec e
+ ld a, (de)
+ xor (hl)
+ and c
+ xor (hl)
+ ld (de), a
+ inc d
+ inc l
+ djnz doble2
+ ld hl, $f801
+ add hl, de
+ ex de, hl
+ ret
+
+Bootoogle ld bc, zxuno_port
+ out (c), 0
+ inc b
+ in a, (c)
+ xor %00000001
+ out (c), a
+ ret
+
+Groms dz "GROMS.ZX1"
+
+cad1 defb $12, $11, $11, $11, $11, $11, $11, $11, $11
+ defb $11, $11, $11, $11, $11, $11, $11, $11, $11
+ defb $11, $11, $11, $11, $11, $11, $11, $11, $11
+ defb $11, $11, $11, $11, $11, $11, $11, $11, $13, 0
+cad2 defb $10, ' ', $10, 0
+cad3 defb $14, $11, $11, $11, $11, $11, $11, $11, $11
+ defb $11, $11, $11, $11, $11, $11, $11, $11, $11
+ defb $11, $11, $11, $11, $11, $11, $11, $11, $11
+ defb $11, $11, $11, $11, $11, $11, $11, $11, $15, 0
+
+chrBegin incbin fuente6x8.bin
+
+Stat
\ No newline at end of file