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