diff --git a/firmware/av.zx7b b/firmware/av.zx7b new file mode 100644 index 0000000..31396e8 Binary files /dev/null and b/firmware/av.zx7b differ diff --git a/firmware/crctable.bin b/firmware/crctable.bin new file mode 100644 index 0000000..5c3b66c Binary files /dev/null and b/firmware/crctable.bin differ diff --git a/firmware/es.zx7b b/firmware/es.zx7b new file mode 100644 index 0000000..3d0a700 Binary files /dev/null and b/firmware/es.zx7b differ diff --git a/firmware/firmware.asm b/firmware/firmware.asm new file mode 100644 index 0000000..88913c4 --- /dev/null +++ b/firmware/firmware.asm @@ -0,0 +1,4464 @@ + include version.asm + + output firmware_strings.rom + macro wreg dir, dato + rst $28 + defb dir, dato + endm + + define call_prnstr rst $18 + define zxuno_port $fc3b + define master_conf 0 + define master_mapper 1 + define flash_spi 2 + define flash_cs 3 + define scan_code 4 + define key_stat 5 + define joy_conf 6 + define key_map 7 + define nmi_event 8 + define mouse_data 9 + define mouse_status 10 + define scandbl_ctrl 11 + define raster_line 12 + define raster_ctrl 13 + define core_addr $fc + define core_boot $fd + define cold_boot $fe + define core_id $ff + + define SPI_PORT $eb + define OUT_PORT $e7 + define MMC_0 $fe ; D0 LOW = SLOT0 active + define CMD0 $40 + define CMD1 $41 + define CMD8 $48 + define SET_BLOCKLEN $50 + define READ_SINGLE $51 + define CMD41 $69 + define CMD55 $77 + define CMD58 $7a + + define cmbpnt $8f00 + define colcmb $8fc6 ;lo: color de lista hi: temporal + define menuop $8fc8 ;lo: menu superior hi: submenu + define corwid $8fca ;lo: X attr coor hi: attr width + define cmbcor $8fcc ;lo: Y coord hi: X coord + define codcnt $8fce ;lo: codigo ascii hi: repdel + define items $8fd0 ;lo: totales hi: en pantalla + define offsel $8fd2 ;lo: offset visible hi: seleccionado + ; inputs lo: cursor position hi: max length + ; otro lo: pagina actual hi: mascara paginas + define sdhc $8fd4 + define empstr $8fd5 + define config $9000 + define indexe $a000 + define active $a040 + 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 layout nmidiv+1 + define joykey layout+1 + define joydb9 joykey+1 + define outvid joydb9+1 + define scanli outvid+1 + define freque scanli+1 + define cpuspd freque+1 + + define bnames $a100 + define tmpbuf $a200 + define tmpbu2 $a280 + define stack $aab0 + define alto $ae00-crctab+ + + ld sp, stack + ld a, scan_code + ld bc, zxuno_port + out (c), a + inc b + in f, (c) + push af + ld hl, runbit + ld de, $b400-chrend+runbit + ei + jp start + +rst18 push bc + jp alto prnstr + +jmptbl defw main + defw roms + defw upgra + defw upgra + defw advan + defw exit + +rst28 ld bc, zxuno_port + $100 + pop hl + outi + ld b, (zxuno_port >> 8)+2 + outi + jp (hl) + + nop + nop + nop + nop + nop + +; ---------------------- +; THE 'KEYBOARD' ROUTINE +; ---------------------- +rst38 push af + ex af, af' + push af + push bc + push de + push hl + ld de, keytab-1&$ff + ld bc, $fefe + ld l, d +keyscn in a, (c) + cpl + and $1f + ld h, l + jr z, keysc5 +keysc1 inc l + srl a + jr nc, keysc1 + ex af, af' + ld a, l + cp $25 ;symbol, change here + jr z, keysc3 + cp $01 ;shift, change here + jr z, keysc2 + inc d + dec d + ld d, l + jr z, keysc4 + xor a + jr keysc6 +keysc2 ld e, 39+keytab&$ff + defb $c2 ;JP NZ,xxxx +keysc3 ld e, 79+keytab&$ff +keysc4 ex af, af' + jr nz, keysc1 +keysc5 ld a, h + add a, 5 + ld l, a + rlc b + jr c, keyscn + xor a + ld h, a + add a, d + jr z, keysc6 + ld d, h + ld l, a + add hl, de + ld a, (hl) +keysc6 ld hl, (codcnt) + jr z, keysc8 + res 7, l + cp l + jr nz, keysc7 + dec h + jr nz, keysc9 + ld h, 3 + defb $c2 +keysc7 ld h, 32 + or $80 +keysc8 ld l, a +keysc9 ld (codcnt), hl + ei + pop hl + pop de + pop bc + pop af + ex af, af' + pop af + ret ; return. +; --------------- +; THE 'KEY TABLE' +; --------------- +keytab defb $00, $7a, $78, $63, $76 ; Caps z x c v + defb $61, $73, $64, $66, $67 ; a s d f g + defb $71, $77, $65, $72, $74 ; q w e r t + defb $31, $32, $33, $34, $35 ; 1 2 3 4 5 + defb $30, $39, $38, $37, $36 ; 0 9 8 7 6 + defb $70, $6f, $69, $75, $79 ; p o i u y + defb $0d, $6c, $6b, $6a, $68 ; Enter l k j h + defb $20, $00, $6d, $6e, $62 ; Space Symbol m n b + defb $00, $5a, $58, $43, $56 ; Caps Z X C V + defb $41, $53, $44, $46, $47 ; A S D F G + defb $51, $57, $45, $52, $54 ; Q W E R T + defb $17, $19, $1a, $1b, $1e ; Edit CapsLk TruVid InvVid Left + defb $18, $16, $1f, $1c, $1d ; Del Graph Right Up Down + defb $50, $4f, $49, $55, $59 ; P O I U Y + defb $0d, $4c, $4b, $4a, $48 ; Enter L K J H + defb $0c, $00, $4d, $4e, $42 ; Break Symbol M N B + defb $00, $3a, $60, $3f, $2f ; Caps : ` ? / + defb $7e, $7c, $5c, $7b, $7d ; ~ | \ { } + defb $51, $57, $45, $3c, $3e ; Q W E < > + defb $21, $40, $23, $24, $25 ; ! @ # $ % + defb $5f, $29, $28, $27, $26 ; _ ) ( ' & + defb $22, $3b, $7f, $5d, $5b ; " ; (c) ] [ + defb $0d, $3d, $2b, $2d, $5e ; Enter = + - ^ + defb $20, $00, $2e, $2c, $2a ; Space Symbol . , * + +start ld bc, chrend-runbit + ldir + call loadch + im 1 + ld de, fincad-1 ; descomprimo cadenas + ld hl, finstr-1 + call dzx7b + ld hl, $b000 + ld de, $b400 +start1 ld b, $04 +start2 ld a, (hl) + rrca + rrca + ld (de), a + inc de + cpi + jp pe, start2 + jr nc, start1 + dec e + ld a, (quietb) + out ($fe), a + dec a + jr nz, star25 + ld h, l + ld d, $20 + call window + jr start4 +star25 ld hl, finlog-1 + ld d, $7a + call dzx7b ; descomprimir + inc hl + ld b, $40 ; filtro RCS inverso +start3 ld a, b + xor c + and $f8 + xor c + ld d, a + xor b + xor c + rlca + rlca + ld e, a + inc bc + ldi + inc bc + bit 3, b + jr z, start3 + ld b, $13 + ldir + ld bc, zxuno_port ; print ID + out (c), a ; a = $ff = core_id + inc b + ld hl, cad0+6 ; Load address of coreID string +star35 in a, (c) + ld (hl), a ; copia el caracter leido de CoreID + inc hl + ld ix, cad0 ; imprimir cadena + jr nz, star35 ; si no recibimos un 0 seguimos pillando caracteres + ld bc, $090b + call_prnstr ; CoreID + ld c, b + ld ixl, cad1 & $ff ; imprimir cadenas BOOT screen + call_prnstr ; http://zxuno.speccy.org + ld bc, $020d + call_prnstr ; ZX-Uno BIOS version + call_prnstr ; Copyleft + ld bc, $0010 ; Copyleft (c) 2016 ZX-Uno Team + call_prnstr ; Processor + call_prnstr ; Memory + call_prnstr ; Graphics + ld b, $0b + call_prnstr ; hi-res, ULAplus + push bc + ld b, a + call_prnstr ; Booting + ld c, $17 + call_prnstr ; Press to Setup + ld hl, bitstr + add a, (hl) + jr z, star37 + dec a + rrca + rrca + rrca + ld l, a + ld h, bnames>>8 + jr star38 +star37 dec l + ld l, (hl) + ld l, (hl) + call calcu + set 5, l +star38 ld de, tmpbuf + push de + pop ix + ld c, $1f + ldir + ld (de), a + pop bc + call_prnstr ; Imprime máquina (ROM o core) +start4 ld d, a + pop af + jr nz, start5 + ld d, a +start5 djnz start6 + dec de + ld a, d + or e + jr nz, start6 + ld hl, $0017 ; Si se acaba el temporizador borrar + ld de, $2001 ; lo de presione Break + call window +start50 wreg scan_code, $f6 ; $f6 = kb set defaults + halt + halt + wreg scan_code, $ed ; $ed + 2 = kb set leds + numlock + halt + wreg scan_code, $02 + halt + wreg mouse_data, $f4 ; $f4 = init Kmouse +star51 ld a, (layout) + ld b, a + ld hl, fines-1 + djnz star52 + ld hl, finus-1 +star52 djnz star53 + ld hl, finav-1 +star53 ld de, $ffff + call dzx7b + wreg key_map, 0 + ld hl, $c001 +star54 inc b + outi + bit 7, h ; compruebo si la direccion es 0000 (final) + jr nz, star54 ; repito si no lo es + ld hl, (joykey) + inc h + inc l + ld a, h + rlca + rlca + rlca + rlca + or l + ld de, joy_conf<<8 | scandbl_ctrl + dec b + out (c), d + inc b + out (c), a + ld a, (cpuspd) + rrca + ld hl, (scanli) + ld a, (outvid) + rr l + rl h + rrca + rrca + ld a, h + adc a, a + or l + dec b + out (c), e + inc b + out (c), a + jp alto conti +start6 ld a, (codcnt) +tstart5 sub $80 + jr c, start5 + ld (codcnt), a + cp $19 + jr z, start7 + cp $0c +start7 jp z, blst + cp $17 + jr nz, tstart5 + +;++++++++++++++++++++++++++++++++++ +;++++++++ Enter Setup ++++++++ +;++++++++++++++++++++++++++++++++++ +bios out ($fe), a + ld a, %01001111 ; fondo azul tinta blanca + ld hl, $0017 + ld de, $2001 + call window + ld a, %00111001 ; fondo blanco tinta azul + ld l, h + ld e, $17 + call window + ld (menuop), hl + call clrscr ; borro pantalla + ld ix, cad7 + call_prnstr ; menu superior + call_prnstr ; borde superior + ld iy, $090a +bios1 ld ix, cad8 + call_prnstr ; | | | + dec iyh + jr nz, bios1 + call_prnstr ; borde medio +bios2 ld ix, cad8 + call_prnstr ; | | | + dec iyl + jr nz, bios2 + ld ix, cad9 + call_prnstr ; borde inferior + call_prnstr ; info + ld hl, %0111111001111110 + ld ($55fc), hl + ld ($55fe), hl + ld ($56fc), hl + ld ($56fe), hl + ld hl, %0100111001001010 + ld ($5afc), hl + ld hl, %0100110101001100 + ld ($5afe), hl +bios3 ld a, $07 + out ($fe), a + call bios4 + jr bios3 +bios4 ld a, %00111001 ; fondo blanco tinta azul + ld hl, $0102 + ld de, $1814 + call window + ld a, %01001111 ; fondo azul tinta blanca + dec h + ld l, h + ld de, $2001 + call window + di + ld c, $14 + ld hl, $405f + ld d, b + ld e, b +bios5 ld b, 8 +bios6 ld sp, hl + push de + push de + push de + push de + push de + inc sp + push de + dec sp + push de + push de + push de + push de + push de + push de + push de + push de + push de + inc h + djnz bios6 + ld a, l + add a, $20 + ld l, a + jr c, bios7 + ld a, h + sub 8 + ld h, a +bios7 dec c + jr nz, bios5 + ei + ld sp, stack-2 + ld ix, cad11 + ld bc, $1906 + call prnmul ; borde medio + ld h, a + ld a, (menuop) + add a, a + add a, jmptbl&$ff + ld l, a + ld c, (hl) + inc l + ld b, (hl) + call chcol + defw $1201 + defb %00111001 + ld hl, (menuop) + ld l, 0 + push bc + ld de, $0401 + ld a, %01111001 ; fondo blanco tinta azul + ret + +;**** Main Menu **** +;********************* +main inc d + ld h, l + call help + ld ix, cad10 + ld bc, $0202 + call prnmul ; Harward tests ... + ld iy, quietb + ld bc, $0f0b +main1 call showop + defw cad28 + defw cad29 + defw $ffff + ld a, iyl + rrca + jr c, main1 +main2 call showop + defw cad30 + defw cad31 + defw cadv2 + defw $ffff +main3 call showop + defw cadv3 + defw cadv4 + defw cadv5 + defw cadv2 + defw $ffff +main4 call showop + defw cad28 + defw cad29 + defw cadv2 + defw $ffff + ld a, nmidiv&$ff + cp iyl + jr nc, main4 + ld de, $1201 + call listas + defb $04 + defb $05 + defb $06 + defb $07 + defb $0b + defb $0c + defb $0d + defb $0e + defb $0f + defb $10 + defb $11 + defb $ff + defw cad14 + defw cad15 + defw cad72 + defw cad16 + defw cad17 + defw cad56 + defw cad20 + defw cad70 + defw cad71 + defw cad18 + defw cad19 + jr c, main9 + ld (menuop+1), a + cp 4 + ld h, active >> 8 + jr c, main8 ; c->tests, nc->options + add a, bitstr-3&$ff + ld l, a + sub keyiss&$ff + jr z, main5 + jr nc, main6 + call popupw ; quiet or crc (enabled or disabled) + defw cad28 + defw cad29 + defw $ffff + ret +main5 call popupw ; keyboard issue + defw cad30 + defw cad31 + defw cadv2 + defw $ffff + ret +main6 dec a + jr nz, main7 + call popupw ; timming + defw cadv3 + defw cadv4 + defw cadv5 + defw cadv2 + defw $ffff + ret +main7 call popupw ; contended, divmmc, nmidiv + defw cad28 + defw cad29 + defw cadv2 + defw $ffff + ret +main8 and a + jp z, alto ramtst + dec a + jr nz, main17 + call bomain + ld ix, cad112 + call_prnstr + ld a, $08 + ld bc, $7ffe +main83 xor $10 + out ($fe), a +main86 dec h + jr nz, main86 ; self loop to ld-wait (for 256 times) + in l, (c) + bit 0, l + jr nz, main83 + ret +main9 cp $0c + call z, roms8 + cp $16 + call z, romsa + ld hl, (menuop) + cp $1e + jr nz, main10 + dec l + jp p, main13 +main10 cp $1f + jr nz, main11 + res 2, l + dec l + jr nz, main13 +main11 ld a, iyl + dec a + ld (menuop+1), a + ret +main12 call waitky +main13 ld hl, (menuop) + cp $0c + call z, roms8 + cp $16 + call z, romsa + sub $1e + jr nz, main16 + dec l + jp m, main12 +main14 ld a, l + ld h, 0 + dec a + jr nz, main15 + ld a, (active) + ld h, a +main15 ld (menuop), hl + ret +main16 dec a + jr nz, main12 + inc l + ld a, l + cp 6 + jr z, main12 + jr main14 +main17 dec a + jp z, tape + call bomain + ld c, $12 + ld ix, cad74 + call_prnstr + ld c, $15 + call_prnstr + ld de, $4861 + ld a, '1'<<1 +tkeys1 ld l, a + ld h, $2c + add hl, hl + add hl, hl + ld b, 8 +tkeys2 ld a, (hl) + ld (de), a + inc l + inc d + djnz tkeys2 + ld hl, $f802 + add hl, de + ex de, hl + ld a, (ix) + inc ix + add a, a + jr nc, tkeys1 + ex af, af' + ld a, $2c + add a, e + ld e, a + jr nc, tkeys3 + ld d, $50 +tkeys3 ex af, af' + jr nz, tkeys1 +tkeys4 add a, $fe + ld de, $004a + ld hl, $5a6f-4 +tkeys5 sbc hl, de + push af + in a, ($fe) + ld b, 5 +tkeys6 ld (hl), 7 + rrca + jr c, tkeys7 + ld (hl), $4e +tkeys7 inc hl + inc hl + djnz tkeys6 + pop af + rlca + cp $ef + jr nz, tkeys5 + ld l, $77-4 +tkeys8 push af + in a, ($fe) + ld b, 5 +tkeys9 ld (hl), 7 + rrca + jr c, tkeys10 + ld (hl), $4e +tkeys10 dec hl + dec hl + djnz tkeys9 + add hl, de + pop af + rlca + jr c, tkeys8 + ld a, ($5a33) + ld e, a + ld a, ($5a21) + add a, e + ret m + in a, ($7f) + add a, $80 + inc b + call tkeys12 + ld b, 4 + call tkeys11 + in a, ($1f) + cpl + ld b, 5 + call tkeys11 + xor a + jr tkeys4 +tkeys11 dec l + dec l + rrca +tkeys12 ld (hl), 7 + jr c, tkeys13 + ld (hl), $4e +tkeys13 djnz tkeys11 + ret + +tape call bomain + ld c, $14 + ld ix, cad51 + call_prnstr ; Press any key to continue + ld hl, $4881 + ld de, $00ee + ld c, 8 +tape1 ld b, 18 +tape2 ld (hl), %00001111 + inc l + djnz tape2 + add hl, de + dec c + jr nz, tape1 + ld hl, %0100100000001000 + ld ($5968), hl + ld hl, %0000100001001000 + ld ($596a), hl +tape3 ld h, b + ld l, b + ld bc, $7ffe + ld de, $1820 +tape4 in a, (c) + jp po, tape5 + defb $e2 +tape5 ld a, d + inc hl + xor $10 + out (c), a + djnz tape4 + ld a, (codcnt) + sub $80 + ret nc + dec e + jr nz, tape4 + ld a, h + sub 7 + jr nc, tape6 + xor a +tape6 cp 17 + jr z, tape7 + jr c, tape8 + ld a, 17 +tape7 srl l +tape8 add a, $81 + rl l + ld de, $5991 + ld hl, $5992 + ld c, $11 + ld (hl), %01000000 + lddr + ld l, a + ld (hl), %01111111 + jr nc, tape3 + ld (hl), %01000111 + inc l + ld (hl), %01111000 + jr tape3 + +;**** Roms Menu **** +;********************* +roms push hl + ld h, 5 + call window + ld a, %00111000 ; fondo blanco tinta negra + ld hl, $0102 + ld d, $12 + call window + ld ix, cad12 ; Name Slot + ld bc, $0202 + call_prnstr + call_prnstr + ld bc, $1503 + call_prnstr + ld bc, $1b0c + call_prnstr + call_prnstr + ld c, $10 + call_prnstr + call_prnstr + call_prnstr + ld c, $0e + call_prnstr + call_prnstr + ld iy, indexe + ld ix, cmbpnt + ld de, tmpbuf + ld b, e +roms1 ld l, (iy) + inc l + jr z, roms5 + dec l + call calcu + ld c, (hl) + set 5, l + ld (ix+0), e + ld (ix+1), d + inc ixl + inc ixl + ld a, (active) + cp iyl + ld a, $1b + jr z, roms2 + ld a, ' ' +roms2 ld (de), a + inc e + inc iyl + ld a, c + ld c, $17 + ldir + ld h, d + ld l, e + inc e + ld (hl), b + dec l +roms3 inc c + sub 10 + jr nc, roms3 + add a, 10+$30 + ld (hl), a + dec l + dec c + ld a, $20 + jr z, roms4 + ld a, c + add a, $30 +roms4 ld (hl), a + dec l + ld (hl), $20 + jr roms1 +roms5 ld (ix+1), $ff + ld d, $17 + ld a, iyl + cp $12 + jr c, roms6 + ld a, $12 +roms6 ld e, a + pop af +roms7 ld hl, $0104 + call combol + ld (menuop+1), a + ld a, (codcnt) + sub $0d + jr nc, roms9 +roms8 push af + ld a, 1 + call exitg + pop af + ret +roms9 jp z, roms15 + sub $16-$0d + jr nz, romsb +romsa push af + call exitg + pop af + ret +romsb sub $1e-$16 + jp z, roms27 + dec a + jp z, roms27 + sub $6e-$1f ; n= New Entry + jp nz, roms144 + call loadta + jp nc, roms12 + ld hl, %00001010 +romsc ld (offsel), hl + ld bc, $7ffd + out (c), h + call prsta1 + push bc + inc (ix-8) + ld ix, $c000 + ld de, $4000 + call lbytes + pop bc + dec c + jp nc, roms12 + ld b, $17 + ld ix, cad53 + call_prnstr + ld hl, (offsel) + inc h + rr l + jr nc, romsd + inc h +romsd dec iyh + jr nz, romsc + ei + call romcyb + ld ix, cad54 + call_prnstr + dec c + ld a, %01000111 ; fondo blanco tinta azul + ld h, $12 + ld l, c + ld de, $0201 + call window + ld c, l + ld hl, $0200 + ld b, $18 + call inputv + ld a, (codcnt) + rrca + ret nc + call newent + call atoi + ld (items), a + ld (hl), a + inc l + ex de, hl + ld hl, tmpbuf + ld a, (hl) + ld iyh, a + ld c, $1f + ldir + ld c, $20 + ld l, tmpbuf+$31 & $ff + ldir + ld hl, %00001010 +roms10 ld (offsel), hl + ld bc, $7ffd + out (c), h + ld hl, $c000 + exx + ld hl, items + ld a, (hl) + inc (hl) + call alto slot2a + ex de, hl + ld a, $40 + call wrflsh + exx + ld hl, (offsel) + inc h + rr l + jr nc, roms11 + inc h +roms11 dec iyh + jr nz, roms10 + ret +roms12 call romcyb + ld ix, cad50 +roms13 call_prnstr + call romcyb +toanyk ei + ld ix, cad51 + call_prnstr + jp waitky +roms144 sub $72-$6e ; r= Recovery + jr nz, roms139 + ld hl, $0309 + ld a, %00000111 ; fondo negro tinta blanca + call rest1 + call resto + sub l ; fondo negro tinta blanca + ld hl, $030c + ld de, $1801 + ld ix, cad64 + call window + ld bc, $0208 + call prnmul + ld bc, $040c + ld hl, $20ff + call inputv + ld a, (codcnt) + rrca + jr nc, roms149 + call newent + push hl + set 5, l + ex de, hl + ld hl, empstr + ld a, (items) + ld c, a + inc c + ldir + sub 32 + ex de, hl + dec hl +roms145 ld (hl), 32 + inc hl + inc a + jr nz, roms145 + pop iy +roms146 inc iy + call resto + ld de, $0301 + ld a, iyl + and 7 + ld l, a + add a, a + push af + add a, l + ld h, a + ld l, $0e + ld a, %01000111 ; fondo negro tinta blanca + call window + pop af + add a, a + ld b, a + ld c, $0e + ld hl, $03ff + call inputv + ld a, (codcnt) + rrca + jr c, roms148 + call nument + dec l + dec l + ld (hl), $ff + jr roms149 +roms139 inc a ; q= move item up + jr nz, nmovup + ld a, (menuop+1) + jr moveup +nmovup add a, 'q'-'a' + ld a, (menuop+1) + jr z, movedw + jp roms7 +roms148 call atoi + ld (iy-1), a + ld a, iyl + inc a + and 7 + jr nz, roms146 +roms149 ld a, %00111001 ; fondo blanco tinta azul + ld hl, $0a08 + ld de, $1409 + call window + ret +roms15 ld hl, tmpbuf + ld (hl), 1 +roms16 call popupw + defw cad32 + defw cad33 + defw cad34 + defw cad35 + defw cad36 + defw $ffff + ld a, (codcnt) + sub $0e + jr nc, roms16 + inc a + ret nz + ld a, (menuop+1) + ld b, (hl) + inc b + djnz roms1a +moveup or a ; move up + ret z + ld hl, active + ld b, (hl) + cp b + jr nz, roms17 + dec (hl) +roms17 dec a + cp b + jr nz, roms18 + inc (hl) +roms18 ld (menuop+1), a +roms19 ld l, a + ld a, (hl) + inc l + ld b, (hl) + ld (hl), a + dec l + ld (hl), b + ret +roms1a djnz roms1b + ld (active), a ; set active + ret +roms1b djnz roms1f +movedw ld b, a ; move down + call nument + sub 2 + cp b +roms1c ret z + ld a, b + ld l, active & $ff + ld b, (hl) + cp b + jr nz, roms1d + inc (hl) +roms1d inc a + cp b + jr nz, roms1e + dec (hl) +roms1e ld (menuop+1), a + dec a + jr roms19 +roms1f djnz roms23 + ld l, a ; rename + ld h, indexe >> 8 + ld a, (hl) + inc a + ld l, a + call calcu + push hl + ld de, empstr + call str2tmp + ld hl, $0309 + ld de, $1b07 + ld a, e ;%00000111 fondo negro tinta blanca + call window + dec h + dec l + ld a, %01001111 ; fondo azul tinta blanca + call window + sub l ; fondo negro tinta blanca + ld iyl, c + ld hl, $030c + ld de, $1801 + call window + ld bc, $0208 + call_prnstr + call_prnstr + call_prnstr +roms20 push ix + call_prnstr + pop ix + dec iyl + jr nz, roms20 + call_prnstr + call_prnstr + ld bc, $040c + ld hl, $20ff + call inputs + ld hl, $1708 + ld de, $0708 + ld a, %00111001 ; fondo blanco tinta azul + call window + ld a, (codcnt) + cp $0c + pop hl + jr z, roms1c + ld a, (items) + or a + jr z, roms1c + ld c, a + sub 32 + jr z, roms22 + cpl +roms21 dec hl + ld (hl), 32 + dec a + jp p, roms21 +roms22 dec l + ex de, hl + ld h, empstr>>8 + ld a, empstr-1&$ff + add a, c + ld l, a + lddr + ret +roms23 ld hl, active ; delete + cp (hl) + jr c, roms24 + ld l, (hl) + inc l + ld b, (hl) + inc b + jr nz, roms25 + dec l + ret z + ld l, $20 +roms24 dec (hl) +roms25 ld l, a +roms26 inc l + ld a, (hl) + dec l + ld (hl), a + inc l + or a + jp p, roms26 + add a, l + ld hl, menuop+1 + cp (hl) + ret nz + dec (hl) + ret +roms27 ld hl, $0104 + ld d, $12 + ld a, (items+1) + ld e, a + ld a, %00111001 + call window + ld a, (codcnt) + jp main13 + +;*** Upgrade Menu *** +;********************* +upgra ld bc, (menuop) + ld h, 16 + dec c + dec c + jr nz, upgra1 + ld h, 9 + ld d, 7 +upgra1 push af + call help + ld de, $0200 | cad60>>8 + ld hl, cmbpnt + pop af + jr nz, upgra2 + ld (hl), cad60 & $ff + inc l + ld (hl), e + inc l + ld (hl), cad61 & $ff + inc l + ld (hl), e + inc l + ld (hl), cad615 & $ff + inc l + ld (hl), e + inc l +upgra2 ld (hl), cad62 & $ff + inc l + ld (hl), e + inc l + ld ix, bnames + ld bc, 32 +upgra3 ld a, ixl + ld (hl), a + inc l + ld (hl), bnames>>8 + inc l + ld (ix+23), b + add ix, bc + ld a, (ix+31) + cp ' ' + jr z, upgra3 + inc l + ld (hl), $ff + ld e, l + srl e + ld hl, (menuop) + dec l + dec l + ld a, h + jr z, upgra4 + inc b + ld a, (bitstr) + push af + add a, d + ld c, a + ld ix, cad73 + push de + call_prnstr + pop de + pop af +upgra4 ld h, d + ld l, d + call combol + ld (menuop+1), a + inc a + ld iyl, a + ld a, (codcnt) + cp $0d +upgra5 jp nz, main9 + ld hl, (menuop) + dec l + dec l + jr z, upgra6 + ld a, h + ld (bitstr), a + ret +upgra6 dec h + dec h + jp nz, upgra7 + +tosd ld ix, cad75 + call prnhel + call imyesn + ld ix, cad445 + call yesno + ret nz + ld d, h + ld a, %01001111 ; fondo azul tinta blanca + call window + ld iyl, 6 + call prstat + ld ix, cad76 + inc c + inc c + call_prnstr + di + ;wreg master_conf, 2 ; enable divmmc +; ld hl, SET_BLOCKLEN<<8 | 2 +; call cs_low +; out (c), h +; out (c), 0 +; out (c), 0 +; out (c), l +; call send1z + + wreg scandbl_ctrl, $80 + sbc hl, hl ; read MBR + ld ix, tmpbu2 + call inirea + jr nz, errsd + ld a, (tmpbu2) ; read first type + sub $e0 + cp $0b + jr z, tosd0 + ld hl, (tmpbu2+$1c6) ; read LBA address of 1st partition + ld a, (tmpbu2+$1c2) ; read partition type +tosd0 push af + call readata ; read boot sector with BPB + push hl + ld a, (menuop+1) + ld b, a + inc a + dec b + dec b + call calbi1 + ld (tmpbu2+$1e), hl + ld b, a + ld hl, sdtab-4 + cp 4 + push af + jr c, tosd1 + ld b, 4 +tosd1 cp b + ld a, files&$ff + jr z, tosd3 +tosd2 add a, 11 +tosd3 inc hl + inc hl + inc hl + inc hl + djnz tosd2 + ld de, tmpbu2+$1a + ld (de), a + inc de + ld a, files>>8 + ld (de), a + inc de + ldi + ldi + pop af + jr nc, tosd4 + ldi + ldi +tosd4 add $2d + ld (fileco+4), a + cp '1' + jr nz, tosd5 + dec (ix+$1c) +tosd5 ld c, SPI_PORT + pop de + pop af + cp $0b + jr z, fatxx + and $f5 + sub 4 + jr z, fatxx ; 04,06,0b,0c,0e -> FAT32 +errsd ld ix, cad77 +ferror ;wreg master_conf, 0 + wreg scandbl_ctrl, 0 + ld bc, $090d + call_prnstr + ld a, cad80 & $ff + cp ixl + ei +twaitk jp nz, waitky + ld a, (menuop+1) + sub 4 + jr c, twaitk + call alto readna + ld ix, cad82 + ld bc, $090a + call_prnstr + ld a, %00000111 ; fondo negro tinta blanca + ld hl, $060b + ld de, $1201 + call window + ld bc, $080b + ld hl, $20ff + call inputv + ld a, (items) + add a, empstr&$ff + ld l, a + ld h, empstr>>8 + ld bc, $20 + ld (hl), c + ld l, empstr&$ff + ld de, tmpbuf+$31 + ldir + jp savena + +fatxx ld hl, (tmpbu2+$0e) ; count of reserved logical sectors + add hl, de ; LBA address+reserved + ld (items), hl ; write FAT table address + ex de, hl + ld hl, (tmpbu2+$16) ; sectors per FAT + ld a, l + or h + jr z, fat32 +fat16 add hl, hl ; 2*FAT + add hl, de ; LBA+reserved+2*FAT + ex de, hl + ld hl, (tmpbu2+$11) ; max FAT entries in root + ld b, 4 +div8 rr h + rr l + djnz div8 + ld b, l ; B= (max entries in sectors)*2 + add hl, de ; LBA+reserved+2*FAT+entries in sectors + ld (offsel), hl ; data= LBA+reserved+2*FAT+entries + ex de, hl ; root= LBA+reserved+2*FAT + ld ix, $c000 +rotp call readat0 ; read 512 bytes of entries (16 entries) + call buba ; search filename (FLASH) in entries + jr z, saba ; if found ($20) or EOF ($00), exit + djnz rotp +erfnf ld ix, cad78 +terror jp ferror +saba sub $31 + jr nz, erfnf + call testl + jr nz, erfnf ; wrong length + ld l, (ix+$1a) ; first cluster of the file + ld h, (ix+$1b) + ld ix, $c000 +bucop push hl ; save current cluster + ld b, e + call calcs ; translate cluster to address + call trans ; copy from data address to SPI flash + pop hl ; recover current cluster + push ix ; save buffer position + ld ix, tmpbuf+$200 ; small buffer to read FAT + push hl + ld l, h + ld h, 0 + ld de, (items) ; fat address + add hl, de + call readat0 + pop hl + ld h, (tmpbuf+$200)>>9 ; hl= fatad/2 llllllll + add hl, hl ; hl= (fatad)l lllllll0 + ld a, (hl) + inc l + ld h, (hl) + ld l, a ; next cluster in hl + and h + inc a ; cluster==FFFF + pop ix + jr nz, bucop +enbur ld ix, cad79 + jr terror +fat32 ld hl, (tmpbu2+$24) ; Logical sectors per FAT + add hl, hl + add hl, de + ld (offsel), hl + ld hl, (tmpbu2+$2c) +tica push hl + push bc + call calcs + ld a, (tmpbu2+$d) + ld b, a + ld ix, $c000 +otve call readata + call buba + jr z, sabe + djnz otve + pop bc + pop hl + add hl, hl + rl b + ld ix, tmpbuf+$200 + push hl + ld l, h + ld h, b + ld de, (items) + add hl, de + call readat0 + pop hl + ld h, (tmpbuf+$200)>>9 + add hl, hl + ld e, (hl) + inc l + ld d, (hl) + inc l + ld b, (hl) + ex de, hl + ld a, l + and h + and b + inc a + jr nz, tica +erfnf2 jp erfnf +sabe pop bc + pop hl + sub $31 + jr nz, erfnf2 + call testl + jr nz, erfnf2 + ld b, (ix+$14) + ld l, (ix+$1a) + ld h, (ix+$1b) + ld ix, $c000 +bucap push hl + call calcs + call trans + pop hl + push ix + ld ix, tmpbuf+$200 + add hl, hl + rl b + push hl + ld l, h + ld h, b + ld de, (items) + add hl, de + call readat0 + pop hl + ld h, (tmpbuf+$200)>>9 + add hl, hl + ld e, (hl) + inc l + ld d, (hl) + inc l + ld b, (hl) + ex de, hl + ld a, l + and h + and b + inc a + pop ix + jr nz, bucap + jp enbur + +testl or a, (ix+$1c) ; third byte of length + ret nz + push de + ld e, (ix+$1d) + ld d, (ix+$1e) + ld hl, (tmpbu2+$1c) + sbc hl, de + pop de + ret + +calcs push bc + call decbhl + call decbhl + ld a, (tmpbu2+$d) + jr calc2 +calc1 add hl, hl + rl b +calc2 rrca + jr nc, calc1 + ld de, (offsel) + add hl, de + ld a, b + adc a, 0 + ld e, a + pop bc + ret + + +buba push bc + push de + push hl + ld hl, $c000 + ld b, 16 +bubi push bc + ld b, 11 + ld a, (hl) + or a + jr z, sali + ld de, (tmpbu2+$1a) + push hl +buub ld a, (de) + cp (hl) + inc hl + inc de + jr nz, beeb + djnz buub +beeb jr z, bien + pop hl + pop bc + ld de, $0020 + add hl, de + djnz bubi + ld a, d +desc pop hl + inc hl + pop de + pop bc + ret +bien pop ix +sali pop bc + jr desc + +trans push bc + ld a, (tmpbu2+$d) + ld b, a +otva call readata + inc ixh + inc ixh + jr nz, putc0 + push bc + push hl + ld hl, tmpbuf+$59 + ld a, (tmpbu2+$1f) +otv2 sub 6 + inc hl + jr nc, otv2 + ld (hl), 'o' + ld iyl, 1 + call prsta1 + ld de, (tmpbu2+$1e) ; SPI address, initially 0000 + exx + ld a, $40 + ld hl, $c000 + exx + call wrflsh + inc de + ld (tmpbu2+$1e), de + exx + ld ix, $c000 + pop hl + pop bc +putc0 inc hl + djnz otva + pop bc + ret + +sdtab defw $0020, $0040 + defw $0040, $0080 + defw $4000, $0000 + defw $0540;, $0580 + + include sd.asm + +upgra7 ld hl, items + ld (hl), b +upgr75 call popupw + defw cad80 + defw cad81 + defw $ffff + ld a, (codcnt) + sub $0e + jr nc, upgr75 + inc a + ld a, (hl) + rrca + call chcol + defw $1201 + defb %00111001 + ret nz + jp c, tosd + call loadta + jr nc, upgra8 + ld hl, (menuop+1) + dec l + jr z, upgra9 + jp p, upgrac + +;upgrade ESXDOS + call prsta1 + ld ix, $e000 + ld de, $2000 + call lbytes +upgra8 jp nc, roms12 + ld bc, $170a + ld ix, cad53 + call_prnstr + ld hl, $dfff + call alto check0 + ld hl, (tmpbuf+7) + sbc hl, de + jr nz, upgraa + ld a, $20 + ld hl, $e000 + exx + ld de, $0040 + call wrflsh + call romcyb + ld ix, cad59 + jr upgrab + +;upgrade BIOS +upgra9 cp $31 +upgraa jp nz, roms12 + ld a, (tmpbuf+1) + cp $ca + jr nz, upgraa + call prsta1 + ld ix, $c000 + ld de, $4000 + call lbytes + jr nc, upgra8 + ld bc, $170a + ld ix, cad53 + call_prnstr + call alto check + ld hl, (tmpbuf+7) + sbc hl, de + jr nz, upgraa + ld a, $40 + ld hl, $c000 + exx + ld de, $0080 + call wrflsh + call romcyb + ld ix, cad58 +upgrab jp roms13 + +prstat ld de, tmpbuf+$52 + ld hl, cad63 + ld bc, cad64-cad63 + ldir +prsta1 call romcyb + ld ix, tmpbuf+$52 + call_prnstr + ret + +;upgrade machine +upgrac cp $43 + jr c, upgraa + cp $46 + jr nc, upgraa + ld b, l + dec b + djnz upgrae + ld a, (tmpbuf+1) + cp $cb +upgrad jr nz, upgraa +upgrae call calbit + push hl + call prstat + call alto readna + push iy +upgrag ld a, (tmpbuf+$65 & $ff)*2 + sub iyh + rra + ld l, a + ld h, tmpbuf>>8 + ld (hl), 'o' + jr c, upgrah + ld (hl), '-' +upgrah and a + call shaon + ld ix, $4000 + ld de, $4000 + call lbytes + ex af, af' + ld a, 30 + sub iyh + call alto copyme + jr nz, upgrad + call shaoff + ex af, af' + jp nc, roms12 + dec iyl + call prsta1 + dec iyh + jr nz, upgrag + pop iy + call shaon + pop de + exx +upgrai ld a, 30 + sub iyh + call alto saveme + ld a, $40 + ld hl, $4000 + exx + call wrflsh + inc de + exx + dec iyh + jr nz, upgrai + call savena + call shaoff + call romcyb + ld ix, cad57 + jp roms13 + +;*** Advanced Menu *** +;********************* +advan ld h, 20 + ld d, 8 + call help + ld ix, cad83 + ld bc, $0202 + call prnmul + ld bc, $0f04 + ld iy, layout + call showop + defw cad88 + defw cad89 + defw cad90 + defw $ffff +advan1 call showop + defw cad91 + defw cad92 + defw cad93 + defw cad94 + defw cad95 + defw $ffff + ld a, iyl + rrca + jr c, advan1 + ld c, $0b + call showop + defw cad96 + defw cad97 + defw cad98 + defw $ffff + call showop + defw cad28 + defw cad29 + defw $ffff + call showop + defw cad102 + defw cad103 + defw cad104 + defw cad105 + defw cad106 + defw cad107 + defw cad108 + defw cad109 + defw $ffff + call showop + defw cad110 + defw cad111 + defw $ffff + ld de, $1201 + call listas + defb $04 + defb $05 + defb $06 + defb $0b + defb $0c + defb $0d + defb $0e + defb $ff + defw cad84 + defw cad85 + defw cad86 + defw cad87 + defw cad99 + defw cad100 + defw cad101 + jp c, main9 + ld (menuop+1), a + ld hl, layout + ld e, a + add hl, de + jr nz, advan2 + call popupw + defw cad88 + defw cad89 + defw cad90 + defw $ffff + ret +advan2 sub 3 + jr nc, advan3 + call popupw + defw cad91 + defw cad92 + defw cad93 + defw cad94 + defw cad95 + defw $ffff + ret +advan3 ld b, a + djnz advan4 + call popupw + defw cad28 + defw cad29 + defw $ffff + ret +advan4 djnz advan5 + call popupw + defw cad102 + defw cad103 + defw cad104 + defw cad105 + defw cad106 + defw cad107 + defw cad108 + defw cad109 + defw $ffff + ret +advan5 djnz advan6 + call popupw + defw cad110 + defw cad111 + defw $ffff + ret +advan6 call popupw + defw cad96 + defw cad97 + defw cad98 + defw $ffff + ret + +;**** Exit Menu **** +;********************* +exit ld h, 28 + call help + ld ix, cad37 + ld bc, $0202 + call_prnstr + call_prnstr + call_prnstr + call_prnstr + ld de, $1201 + call listas + defb $02 + defb $03 + defb $04 + defb $05 + defb $ff + defw cad38 + defw cad39 + defw cad40 + defw cad41 + jp c, main9 + ld (menuop+1), a +exitg ld (colcmb+1), a + call imyesn + ld a, (colcmb+1) + ld b, a + djnz exit1 + ld ix, cad46 +exit1 djnz exit2 + ld ix, cad47 +exit2 djnz exit3 + ld ix, cad48 +exit3 call yesno + ret nz + ld a, (colcmb+1) + ld b, a + djnz exit4 + call loadch + jr exit7 +exit4 djnz exit5 + jp savech +exit5 djnz exit6 + jp loadch +exit6 call savech +exit7 jp star51 + +;++++++++++++++++++++++++++++++++++ +;++++++++ Boot list ++++++++ +;++++++++++++++++++++++++++++++++++ +blst call clrscr ; borro pantalla + ld h, bnames-1>>8 + ld c, $20 + ld a, c +blst0 add hl, bc + inc e + cp (hl) + jr z, blst0 + ld a, (codcnt) + ld (tmpbuf), a + rrca + inc e + ld a, e + ld l, a + call nc, nument + cp 13 + jr c, blst1 + ld a, 13 +blst1 ld h, a + ld (items), hl + add a, -16 + cpl + rra + ld l, a + ld a, h + add a, 8 + 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, cad2 + pop bc + inc b + call_prnstr + call_prnstr + call_prnstr + push bc + ld iy, (items) +blst2 ld ix, cad4 + call_prnstr ; | | + dec iyh + jr nz, blst2 + ld ix, cad3 + call_prnstr ; |----------------| + ld ix, cad5 + call_prnstr + call_prnstr + call_prnstr + call_prnstr + ld hl, cad62 + ld (cmbpnt), hl + ld iy, indexe + ld ix, cmbpnt + ld de, tmpbuf + ld b, e + ld hl, bnames + ld a, (de) + rrca + jr c, bls31 +blst3 ld l, (iy) + inc l + call calcu + call addbls + jr nc, blst3 + jr bls37 +bls31 call addbl1 +bls33 ld c, $20 + add hl, bc + call addbls + jr nc, bls33 +bls37 ld (ix+0), cad6&$ff + ld (ix+1), cad6>>8 + ld (ix+3), a + ld a, (items+1) + ld e, a + ld d, 32 + call chcol + defw $1a02 + defb %01001111 + ld a, (cmbpnt+1) + rrca + ld hl, (active) + ld a, h + jr c, bls38 + ld a, l +bls38 pop hl + ld h, 4 +blst4 call combol + ld b, a + ld a, (codcnt) + cp $0d + ld a, b + jr c, blst5 + jr nz, blst4 + ld a, (items) + dec a + cp b + ld a, $17 + jp z, bios + ld a, (cmbpnt+1) + rrca + ld a, b + ld (active), a + jr nc, blst5 + ld (bitstr), a +blst5 jp start50 + +imyesn call bloq1 + ld ix, cad42 + call_prnstr + call_prnstr + call_prnstr + call_prnstr + ret + +; ------------------------------------ +; Calculate start address of bitstream +; B: number of bitstream +; Returns: +; HL: address of bitstream +; ------------------------------------ +calbit inc b +calbi1 ld hl, $0040 + ld de, $0540 +upgraf add hl, de + djnz upgraf + ret + +; ---------------------------- +; Add an entry to the bootlist +; ---------------------------- +addbls ld (ix+0), e + ld (ix+1), d + push hl + call str2tmp + pop hl +addbl1 inc iyl + inc ixl + inc ixl + ld a, (items) + sub 2 + sub iyl + ret + +; ------------------------------------- +; Prits a blank line in the actual line +; ------------------------------------- +romcyb ld a, iyl +romcy1 sub 5 + jr nc, romcy1 + add a, 5+9 + ld c, a + inc iyl + ld b, 8 + ld ix, cad42 + call_prnstr + inc b + dec c + ret + +; ------------------------------------- +; Generates a determined box with shadow +; ------------------------------------- +bloq1 ld hl, $0709 + ld de, $1207 + ld a, %00000111 ;%00000111 fondo negro tinta blanca + call window + dec h + dec l + ld a, %01001111 ; fondo azul tinta blanca + call window + ld bc, $080b + ret + +; ------------------------------------- +; Carry: 0 -> from 4000 to C000, shadow on , pre page +; 1 -> from C000 to 4000, shadow off, post page +; ------------------------------------- +shaoff scf +shao1 ld bc, $4000 + ld d, b + ld e, c + ld hl, $c000 + jr c, shao2 + ex de, hl +shao2 ldir + ret nc + ld a, $07 + defb $d2 +shaon ld a, $0f + ld bc, $7ffd + out (c), a + jr nc, shao1 + ret + +; ------------------------------------- +; Shows the window of Load from Tape +; ------------------------------------- +loadta ld ix, cad49 + call prnhel + call bloq1 + dec c + dec c + ld iyl, 5 +loadt1 ld ix, cad42 + call_prnstr + dec iyl + jr nz, loadt1 + ld ixl, cad43 & $ff + call_prnstr + ld ixl, cad44 & $ff + ld c, b + call_prnstr + call romcyb + ld ix, cad45 + call_prnstr + ld ix, tmpbuf + ld de, $0051 + call lbytes + ld bc, $1109 + ret nc + ld hl, tmpbuf+$3e + ld a, (hl) + push af + ld (hl), 0 + ld ixl, $31 + call_prnstr + pop af + ld (tmpbuf+$3e), a + ld de, tmpbuf+$52 + ld hl, cad52 + ld bc, cad53-cad52 + ldir + ld a, (tmpbuf) + ld iyh, a + sub $d0 + ld (tmpbuf+$5d), a + ret + +; ------------------------------------- +; Yes or not dialog +; A: if 0 preselected Yes, if 1 preselected No +; Returns: +; A: 0: yes, 1: no +; ------------------------------------- +yesno ld bc, $0808 + call_prnstr + call_prnstr + call_prnstr +yesno0 inc a +yesno1 ld ixl, a +yesno2 ld hl, $0b0d + ld de, $0801 + ld a, %01001111 ; fondo azul tinta blanca + call window + sub d ; %01000111 fondo negro tinta blanca + ld d, 3 + ld b, ixl + djnz yesno3 + ld h, $11 + dec d +yesno3 call window + call waitky + add a, $100-$1f + jr nz, yesno4 + add a, ixl + jr z, yesno0 +yesno4 inc a + jr nz, yesno5 + dec a + add a, ixl + jr z, yesno1 +yesno5 add a, $1e-$0c + cp 2 + jr nc, yesno2 + ld a, (codcnt) + sub $0d + ret nz + ld a, ixl + and a + ret + +; ------------------------------------- +; Transforms space finished string to a null terminated one +; HL: end of origin string +; DE: start of moved string +; ------------------------------------- +str2tmp 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 + ret + +; ------------------------------------- +; Read number of boot entries +; Returns: +; A: number of boot entries +; ------------------------------------- +nument 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 + ret + +; ------------------------------------- +; Input a string by the keyboard +; Parameters: +; empstr: input and output string +; HL: max length (H) and cursor position (L) +; BC: X coord (B) and Y coord (C) +; ------------------------------------- +inputv xor a + ld (empstr), a +inputs ld (offsel), hl +input1 push bc + ld ix, empstr + call_prnstr + push ix + pop hl + ld a, l + sub empstr+1&$ff + ld (items), a + ld r, a + ld e, a + add a, b + ld b, a + ld a, (offsel) + inc a + jr nz, input2 + ld a, e + ld (offsel), a +input2 ld de, (offsel) + ld e, ' ' + defb $32 +input3 ld (hl), e + inc l + ld a, l + sub empstr+2&$ff + sub d + jr nz, input3 + ld (hl), a + dec c + call_prnstr + pop bc +input4 ld a, r + cpl + ld r, a + call cursor + ld h, $80 +input5 ld a, (codcnt) + sub $80 + jr nc, input7 + dec l + jr nz, input5 + dec h + jr nz, input5 +input6 jr input4 +input7 ld (codcnt), a + cp $0e + jr nc, input8 + ld a, r + ret p +cursor ld a, (offsel) + add a, b + ld l, a + and %11111100 + ld d, a + xor l + ld h, $80 + ld e, a + jr z, curso1 + dec e +curso1 xor $fc +curso2 rrc h + rrc h + inc a + jr nz, curso2 + 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 + ld l, $08 +curso3 ld a, (de) + xor h + ld (de), a + inc d + dec l + jr nz, curso3 + ret +input8 ld hl, (offsel) + cp $18 + jr nz, input9 + dec l + jp m, input1 + ld (offsel), hl + ld a, 33 + sub l + push bc + ld c, a + ld b, 0 + ld a, l + add a, empstr&$ff + ld l, a + ld h, empstr>>8 + ld d, h + ld e, l + inc l + ldir + pop bc + jr inputc +input9 sub $1e + jr nz, inputb + dec l + jp m, input1 +inputa jp inputs +inputb dec a + ld a, (items) + jr nz, inputd + cp l + jr nz, inpute +inputc jp input1 +inputd cp h + jr z, input6 + ld a, l + add a, empstr&$ff + ld l, a + ld h, empstr>>8 + ld a, (codcnt) + inc (hl) + dec (hl) + jr nz, inputf + ld (hl), a + inc l + ld (hl), 0 +inpute ld hl, (offsel) + inc l + jr inputa +inputf ex af, af' + ld a, empstr+33&$ff + sub l + push bc + ld c, a + ld b, 0 + ld l, empstr+32&$ff + ld de, empstr+33 + lddr + inc l + ex af, af' + ld (hl), a + pop bc + jr inpute + +; ------------------------------------- +; Show a combo list to select one element +; Parameters: +;(corwid) +; cmbpnt: list of pointers (last is $ffff) +; A: preselected one +; HL: X coord (H) and Y coord (L) of the first element +; DE: window width (D) and window height (E) +; Returns: +; A: item selected +; ------------------------------------- +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 + defb $32 +combo3 dec a + inc b + cp e + jr nc, combo3 + ld a, b +combo4 ld (offsel), a + ld iy, (items) + ld iyl, iyh + ld bc, (cmbcor) +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, (corwid) + ld hl, (cmbcor) + ld h, e + ld a, (items+1) + ld e, a + ld a, (colcmb) + call window + ld de, (corwid) + 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 + call waitky + ld hl, (offsel) + sub $0d + jr c, comboa + jr z, comboa + ld bc, (items) + sub $1c-$0d + jr nz, combo9 + dec h + jp m, combo7 + ld a, h + cp l + ld (offsel), hl + jr nc, combo7 + ld a, l + dec a +combo8 jr combo4 +combo9 dec a ; $1d + jr nz, comboa + 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, h + pop de + pop hl + ret + +; ------------------------------------- +; Show a normal list only in attribute area width elements +; in not consecutive lines +; Parameters: +; A: preselected one +; PC: list of Y positions +; DE: window width (D) and X position (E) +; Returns: +; A: item selected +; Carry on: if no Enter pressed +; ------------------------------------- +listas ld a, (menuop+1) + inc a + ld iyl, a + pop hl + push hl + xor a + defb $32 +lista1 inc hl + inc a + inc (hl) + jr nz, lista1 + ld ixl, a + pop hl +lista2 ld iyh, iyl + ld ixh, ixl + push hl + push de +lista3 push hl + ld l, (hl) + ld h, e + ld e, 1 + ld a, %00111001 ; fondo blanco tinta azul + dec iyh + jr nz, lista4 + ld a, %01000111 +lista4 call window + pop hl + inc hl + dec ixh + jr nz, lista3 + ld a, iyl + add a, a + ld c, a + add hl, bc + push ix + ld a, (hl) + ld ixh, a + dec hl + ld a, (hl) + ld ixl, a + call prnhel + call waitky + ld a, (codcnt) + cp $0d + jr z, listaa + ld ix, lista5 +; ------------------------------------- +; Deletes the upper right area (help) +; ------------------------------------- +delhel di + ld c, $9 + ld hl, $405f + ld de, 0 +delhe1 ld b, 8 +delhe2 ld sp, hl + push de + push de + push de + push de + push de + inc sp + push de + inc h + djnz delhe2 + ld a, l + add a, $20 + ld l, a + jr c, delhe3 + ld a, h + sub 8 + ld h, a +delhe3 dec c + jr nz, delhe1 + ei + jp (ix) +lista5 ld sp, stack-8 + pop ix + pop de + pop hl + ld a, (codcnt) + cp $1c + jr nz, lista7 + ld a, iyl + dec a + jr z, lista2 +lista6 ld iyl, a + jr lista2 +lista7 cp $1d + jr nz, lista8 + ld a, iyl + cp ixl + jp nc, lista2 + inc a + jr lista6 +lista8 push ix + pop de + add hl, de + add hl, de + add hl, de + inc hl +lista9 scf + jp (hl) +listaa pop de + pop hl + pop hl + add hl, de + add hl, de + add hl, de + inc hl + ld a, iyl + dec a + jp (hl) + +; restore background color in recovery dialog +resto ld a, %01001111 ; fondo azul tinta blanca + ld hl, $0208 +rest1 ld de, $1b08 + + +; ------------------------------------- +; 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 l + djnz windo2 + ex af, af' + ld a, l + sub d + add a, 32 + ld l, a + jr nc, windo3 + inc h +windo3 ex af, af' + dec e + jr nz, windo1 + pop de + pop hl + ret + +; ------------------------------------- +; Change corwid and colcmb variables +; Parameters: PC +chcol pop hl + ld a, (hl) + inc hl + ld (corwid), a + ld a, (hl) + inc hl + ld (corwid+1), a + ld a, (hl) + inc hl + ld (colcmb), a + jp (hl) + +; ------------------------------------- +; Prints an option between some strings +; Parameters: +; (iy): option to print +; PC: list of pointers to options (last is $ffff) +showop ld a, (iy) + inc a + pop hl + defb $fe +showo1 dec a + push hl + call z, prnstr-1 + pop hl + ld e, (hl) + inc hl + ld d, (hl) + inc hl + push de + pop ix + inc d + jr nz, showo1 + inc iyl + jp (hl) + +; ------------------------------------- +; Draw a pop up list with options +; Parameters: +; PC: list of pointers to options (last is $ffff) +; HL: pointer to variable item +; ------------------------------------- +popupw exx + pop hl + ld de, cmbpnt + ldi +popup1 ldi + ldi + inc (hl) + jr nz, popup1 + ldi + push hl + srl e + ld a, e + dec a + ld iyl, a + add a, -24 + cpl + rra + ld l, a + ld h, $16 + ld d, 1 + ld a, %00000111 ; fondo negro tinta blanca + call window + ld a, e + inc e + ld h, e + push hl + add a, l + ld l, a + ld h, $0a + ld de, $0d01 + ld a, %00000111 ; fondo negro tinta blanca + call window + pop hl + ld e, h + dec l + ld h, $09 + push de + push hl + ld a, %01001111 ; fondo azul tinta blanca + call window + ld ix, cad21 + ld b, $0c + ld c, l + call_prnstr +popup2 ld ix, cad22 + call_prnstr + dec iyl + jr nz, popup2 + call_prnstr + call chcol + defw $0b0a + defb %01001111 + pop hl + pop de + inc l + ld a, h + add a, 5 + ld h, a + dec e + dec e + exx + ld a, (hl) + exx + call combol + exx + ld (hl), a + ret + +; ------------------------------------- +; Wait for a key +; Returns: +; A: ascii code of the key +; ------------------------------------- +waitky ld a, (codcnt) + sub $80 + jr c, waitky ; Espero la pulsación de una tecla + ld (codcnt), a + ret + +; ------------------------ +; Clear the screen +; ------------------------ +clrscr ld hl, $4000 + ld de, $4001 + ld bc, $17ff + ld (hl), l + ldir + ret + +; ------------------------------- +; Prints some lines, end with 0,0 +; ------------------------------- +prnhel ld bc, $1b02 +prnmul call_prnstr + add a, (ix) + jr nz, prnmul + inc ix + ret + +bomain ld ix, cad65 + ld bc, $0209 + call_prnstr ; Performing... + inc c + ld iyh, 7 +ramts1 ld ixl, cad66&$ff + call_prnstr + dec iyh + jr nz, ramts1 + ret + +; create a new ROM entry +newent call nument + dec l + ld e, l + ld a, -1 +romst inc a + ld b, e + ld l, 0 +romsu cp (hl) + jr z, romst + inc l + djnz romsu + ld (hl), a + ld l, a + +; points to the ROM table, input L entry, output HL +calcu add hl, hl + add hl, hl + ld h, 9 + jp alto slot2c + +savena ld a, (menuop+1) + sub 4 + ret c + ld d, bnames>>8 + rrca + rrca + rrca + ld e, a + ld hl, tmpbuf+$31 + ld bc, 32 + ldir + +; ------------------------ +; Save flash structures from $9000 to $06000 and from $a000 to $07000 +; ------------------------ +savech ld a, $20 + ld hl, config + exx + ld de, $0060 ;old $0aa0 + +; ------------------------ +; Write to SPI flash +; Parameters: +; A: number of pages (256 bytes) to write +; DE: target address without last byte +; HL': source address from memory +; ------------------------ +wrflsh ex af, af' + xor a +wrfls1 wreg flash_cs, 0 ; activamos spi, enviando un 0 + wreg flash_spi, 6 ; envío write enable + wreg flash_cs, 1 ; desactivamos spi, enviando un 1 + wreg flash_cs, 0 ; activamos spi, enviando un 0 + wreg flash_spi, $20 ; envío sector erase + out (c), d + out (c), e + out (c), a + wreg flash_cs, 1 ; desactivamos spi, enviando un 1 +wrfls2 call waits5 + wreg flash_cs, 0 ; activamos spi, enviando un 0 + wreg flash_spi, 6 ; envío write enable + wreg flash_cs, 1 ; desactivamos spi, enviando un 1 + wreg flash_cs, 0 ; activamos spi, enviando un 0 + wreg flash_spi, 2 ; page program + out (c), d + out (c), e + out (c), a + ld a, $20 + exx + ld bc, zxuno_port+$100 +wrfls3 inc b + outi + inc b + outi + inc b + outi + inc b + outi + inc b + outi + inc b + outi + inc b + outi + inc b + outi + dec a + jr nz, wrfls3 + exx + wreg flash_cs, 1 ; desactivamos spi, enviando un 1 + ex af, af' + dec a + jr z, waits5 + ex af, af' + inc e + ld a, e + and $0f + jr nz, wrfls2 + ld hl, wrfls1 + push hl +waits5 wreg flash_cs, 0 ; activamos spi, enviando un 0 + wreg flash_spi, 5 ; envío read status + in a, (c) +waits6 in a, (c) + and 1 + jr nz, waits6 + wreg flash_cs, 1 ; desactivamos spi, enviando un 1 + ret + +; ------------------------ +; Load flash structures from $06000 to $9000 +; ------------------------ +loadch wreg flash_cs, 1 + ld de, config + ld hl, $0060 ;old $0aa0 + ld a, $12 + jp alto rdflsh + +; ----------------------------------------------------------------------------- +; ZX7 Backwards by Einar Saukas, Antonio Villena +; Parameters: +; HL: source address (compressed data) +; DE: destination address (decompressing) +; ----------------------------------------------------------------------------- +dzx7b ld bc, $8000 + ld a, b +copyby inc c + ldd +mainlo add a, a + call z, getbit + jr nc, copyby + push de + ld d, c + defb $30 +lenval add a, a + call z, getbit + rl c + rl b + add a, a + call z, getbit + jr nc, lenval + inc c + jr z, exitdz + ld e, (hl) + dec hl + sll e + jr nc, offend + ld d, $10 +nexbit add a, a + call z, getbit + rl d + jr nc, nexbit + inc d + srl d +offend rr e + ex (sp), hl + ex de, hl + adc hl, de + lddr +exitdz pop hl + jr nc, mainlo + ret + +getbit ld a, (hl) + dec hl + adc a, a + ret + +get16 ld b, 0 + call lsampl + call lsampl + cp 12 + adc hl, hl + jr nc, get16 + ret + +; Parameters: +;(empstr): input string +; Returns: +; A: binary number +atoi push hl + ld hl, items + ld b, (hl) + ld l, empstr & $ff + xor a +romse add a, a + ld c, a + add a, a + add a, a + add a, c +romsf add a, (hl) + inc l + sub $30 + djnz romse + pop hl + ret + + IF 0 +hhhh push af + push bc + push de + push hl + push ix + push iy + pop hl + push hl + ld de, cad199+44 + call alto wtohex + ld iy, 0 + add iy, sp + ld l, (iy+2) + ld h, (iy+3) + ld de, cad199+37 + call alto wtohex + ld l, (iy+4) + ld h, (iy+5) + ld de, cad199+23 + call alto wtohex + ld l, (iy+6) + ld h, (iy+7) + ld de, cad199+16 + call alto wtohex + ld l, (iy+8) + ld h, (iy+9) + ld de, cad199+9 + call alto wtohex + ld l, (iy+10) + ld h, (iy+11) + ld de, cad199+2 + call alto wtohex + ld ix, cad199 + ld bc, $0030 + call alto prnstr-1 + pop iy + pop ix + pop hl + pop de + pop bc + pop af + ret +;binf jr binf + ENDIF + + incbin es.zx7b +fines incbin us.zx7b +finus incbin av.zx7b +finav + +; ----------------------------------------------------------------------------- +; Compressed and RCS filtered logo +; ----------------------------------------------------------------------------- + incbin logo256x192.rcs.zx7b +finlog + +; ----------------------------------------------------------------------------- +; Compressed messages +; ----------------------------------------------------------------------------- + incbin strings.bin.zx7b +finstr + +runbit ld b, h + call calbit + ld bc, zxuno_port + ld e, core_addr + out (c), e + inc b + out (c), h + out (c), l + out (c), 0 + wreg core_boot, 1 + +;++++++++++++++++++++++++++++++++++ +;++++++++ Start ROM ++++++++ +;++++++++++++++++++++++++++++++++++ +conti di + xor a + ld hl, (active) + cp h + jr nz, runbit + ld h, active>>8 + ld l, (hl) + call calcu + push hl + pop ix + ld d, (ix+6) + ld hl, timing + ld a, 3 + 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 %10101100 -$80 ;sinlock ; LOCK MODE1 DISCONT MODE0 I2KB DISNMI DIVEN 0 + ld (alto conti9+1), a + wreg master_conf, 1 + and $02 + jr z, conti4 + wreg master_mapper, 12 + ld hl, $0040 + ld de, $c000 + ld a, $20 + call alto rdflsh + ld a, 16 +conti3 ld de, $c000 | master_mapper + dec b + out (c), e + inc b + push bc + out (c), a + ld bc, $3fff + ld hl, $c000 + ld (hl), l + ldir + pop bc + inc a + cp 24 + jr nz, conti3 + defb $c2 +conti35 dec iyl + jr nz, conti5 +conti4 ld a, (ix+1) + ld iyl, a + ld a, (ix) + ld iyh, a +conti5 ld a, iyh + inc iyh + call alto slot2a + ld a, master_mapper + dec b + out (c), a + inc b + ld a, (ix+2) + inc (ix+2) + out (c), a + ld de, $c000 + ld a, $40 + call alto rdflsh + ld a, (checkc) + dec a + jr nz, conti8 + push ix + push bc + call alto check + ld a, iyl + add a, a + add a, ixl + ld ixl, a + ld l, (ix+$06) + ld h, (ix+$07) + sbc hl, de + jr z, conti7 + add hl, de + push de + ld de, cad55+33 + call alto wtohex + pop hl + ld e, cad55+19&$ff + call alto wtohex + ld ix, cad55 + ld bc, $0015 + call alto prnstr-1 + call alto prnstr-1 + ld c, $fe +conti6 in a, (c) + or $e0 + inc a + jr z, conti6 +conti7 pop bc + pop ix +conti8 dec (ix+3) + jr nz, conti35 +conti9 ld a, 0 + dec b + out (c), 0;d + inc b + out (c), a + ld bc, $1ffd + ld a, (ix+4) + out (c), a + ld b, $7f + ld a, (ix+5) + out (c), a + rst 0 + +; ------------------------------------- +; Put page A in mode 1 and copies from 4000 to C000 +; A: page number +; ------------------------------------- +copyme wreg master_conf, 1 + ld de, $c000 | master_mapper + dec b + out (c), e + inc b + out (c), a + dec e + push bc + ld bc, $4000 + ld h, b + ld l, c + ldir + call alto check + pop bc + wreg master_conf, 0 + ld a, iyh + add a, a + add a, 5 + ld l, a + ld h, tmpbuf>>8 + ld c, (hl) + inc l + ld b, (hl) + ex de, hl + sbc hl, bc + ret + +; ------------------------------------- +; Put page A in mode 1 and copies from C000 to 4000 +; A: page number +; ------------------------------------- +saveme wreg master_conf, 1 + ld hl, $c000 | master_mapper + dec b + out (c), l + inc b + out (c), a + dec l + push bc + ld bc, $4000 + ld d, b + ld e, c + ldir + pop bc + wreg master_conf, 0 + ret + +readna ld de, bnames + ld hl, $0071 + ld a, 1 + +; ------------------------ +; Read from SPI flash +; Parameters: +; DE: destination address +; HL: source address without last byte +; A: number of pages (256 bytes) to read +; ------------------------ +rdflsh ex af, af' + xor a + push hl + wreg flash_cs, 0 ; activamos spi, enviando un 0 + wreg flash_spi, 3 ; envio flash_spi un 3, orden de lectura + pop hl + push hl + out (c), h + out (c), l + out (c), a + ex af, af' + ex de, hl + in f, (c) +rdfls1 ld e, $20 +rdfls2 ini + inc b + ini + inc b + ini + inc b + ini + inc b + ini + inc b + ini + inc b + ini + inc b + ini + inc b + dec e + jr nz, rdfls2 + dec a + jr nz, rdfls1 + wreg flash_cs, 1 + pop hl + ret + +; ------------------------ +; Print Hexadecimal number +; Parameters: +; DE: destination address +; HL: 4 digit number +; ------------------------ +wtohex ld b, 4 +wtohe1 ld a, $3 + add hl, hl + adc a, a + add hl, hl + adc a, a + add hl, hl + adc a, a + add hl, hl + adc a, a + cp $3a + jr c, wtohe2 + add a, 7 +wtohe2 ld (de), a + inc e + djnz wtohe1 + ret + +; --------------- +; RAM Memory test +; --------------- +ramtst di + call bomain + wreg master_conf, 1 + ld bc, $040b +ramts2 dec b + dec b +ramts3 ld de, cad69 + push bc + ld bc, zxuno_port + ld a, master_mapper + out (c), a + inc b + push iy + pop hl + out (c), h + ld b, 2 + call alto wtohe1 + pop bc + ld ixl, cad69&$ff + call alto prnstr-1 + dec c + inc b + inc b + ld ixl, cad67&$ff + ld hl, $c000 +ramts4 ld a, (hl) + xor l + ld (hl), a + ld e, a + ld a, (hl) + xor l + ld (hl), a + xor l + xor e + jr z, ramts5 + ld ixl, cad68&$ff +ramts5 inc hl + bit 4, h + jr z, ramts4 + call alto prnstr-1 + inc iyh + ld a, iyh + and $07 + jr nz, ramts2 + ld c, $0b + ld a, b + add a, 4 + ld b, a + ld a, iyh + cp 32 + jr nz, ramts3 + wreg master_conf, 0 + ld bc, $0214 + jp toanyk + +; --------- +; CRC check +; --------- +check ld hl, $bfff ;4c2b > d432 +check0 ld c, alto crctab>>8 + defb $11 +check1 xor (hl) ;6*4+4*7+10= 62 ciclos/byte + ld e, a + ex de, hl + ld a, h + ld h, c + xor (hl) + inc h + ld h, (hl) + ex de, hl + inc l + jp nz, alto check1 + inc h + jr nz, check1 + ld e, a + ret + +; Parameters: +; A: input slot +; Returns: +; HL: destination address +slot2a ld de, 3 + and $3f + cp 19 + ld h, d + ld l, a + jr c, slot2b + ld e, $c0 +slot2b add hl, de ; $00c0 y 2f80 + add hl, hl + add hl, hl +slot2c add hl, hl + add hl, hl + add hl, hl + add hl, hl + ret + +help call window + ld a, %00111000 ; fondo blanco tinta negra + ld hl, $0102 + ld d, $12 + call window + ld l, 9 + call window + ld ix, cad13 + ld bc, $1b0c + call_prnstr ; Select Screen ... + call_prnstr + call_prnstr + call_prnstr + push bc + +; ----------------------------------------------------------------------------- +; Print string routine +; Parameters: +; BC: X coord (B) and Y coord (C) +; IX: null terminated string +; ----------------------------------------------------------------------------- +prnstr ld a, b + and %11111100 + ld d, a + xor b + ld e, a + jr z, prnch1 + dec e +prnch1 xor $fc + ld l, a + ld h, alto prnstr>>8 + ld l, (hl) + push hl + 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 + defb $3e ; salta la siguiente instruccion +posf pop bc + inc c + ret + +pos0 ld a, (ix) + inc ix + add a, a + jr z, posf + ld l, a + ld h, $2c + add hl, hl + add hl, hl + ld b, 4 +pos00 ld a, (hl) + ld (de), a + inc l + inc d + ld a, (hl) + ld (de), a + inc l + inc d + djnz pos00 + ld hl, $f800 + add hl, de + ex de, hl +pos1 ld a, (ix) + inc ix + add a, a + jr z, posf + ld l, a + ld h, $2f + add hl, hl + add hl, hl + ld bc, $04fc +pos10 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 pos10 + ld hl, $f801 + add hl, de + ex de, hl +pos2 ld a, (ix) + inc ix + add a, a +tposf jr z, posf + ld l, a + ld h, $2e + add hl, hl + add hl, hl + ld bc, $04f0 +pos20 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 pos20 + ld hl, $f801 + add hl, de + ex de, hl +pos3 ld a, (ix) + inc ix + add a, a + jr z, tposf + ld l, a + ld h, $2d + add hl, hl + add hl, hl + ld b, 4 +pos30 ld a, (de) + xor (hl) + ld (de), a + inc d + inc l + ld a, (de) + xor (hl) + ld (de), a + inc d + inc l + djnz pos30 + ld hl, $f801 + add hl, de + ex de, hl + jp alto pos0 + + defb pos0-crctab & $ff + defb pos1-crctab & $ff + defb pos2-crctab & $ff + defb pos3-crctab & $ff + +; ---------- +; CRC Table +; ---------- +crctab incbin crctable.bin + defs $80 + +; ----------------------------------------------------------------------------- +; 6x8 character set (128 characters x 1 rotation) +; ----------------------------------------------------------------------------- + incbin fuente6x8.bin +chrend + + block $3bbf-$ + +l3bbf inc h ;4 + jr nc, l3bcd ;7/12 46/48 + xor b ;4 + xor $9c ;7 + ld (de), a ;7 + inc de ;6 + ld a, $dc ;7 + ex af, af' ;4 + in l, (c) ;12 + jp (hl) ;4 +l3bcd xor b ;4 + add a, a ;4 + ret c ;5 + add a, a ;4 + ex af, af' ;4 + out ($fe), a ;11 + in l, (c) ;12 + jp (hl) ;4 + + block $3bff-$ ; X bytes + +l3bff in l, (c) + jp (hl) + + block $3c0d-$ ; 11 bytes + + defb $ec, $ec, $01 ; 0d + defb $ec, $ec, $02 ; 10 + defb $ec, $ec, $03 ; 13 + defb $ec, $ec, $04 ; 16 + defb $ec, $ec, $05 ; 19 + defb $ec, $ec, $06 ; 1c + defb $ec, $ec, $07 ; 1f + defb $ec, $ec, $08 ; 22 + defb $ec, $ec, $09 ; 25 + defb $ed, $ed, $0a ; 28 + defb $ed, $ed, $0b ; 2b + defb $ed, $ed, $0c ; 2e + defb $ed, $ed, $0d ; 31 + defb $ed, $ed, $0e ; 34 + defb $ed, $ed, $7f ; 37 + defb $ed, $ed, $7f ; 3a + defb $ed, $ed, $7f ; 3d + defb $ed, $ed, $7f ; 40 + defb $ed, $ee, $7f ; 43 -- + defb $ee, $ee, $7f ; 46 -- + defb $ee, $ee, $7f ; 49 + defb $ee, $ee, $7f ; 4c + defb $ee, $ee, $7f ; 4f + defb $ee, $ee, $7f ; 52 + defb $ee, $ee, $0f ; 55 + defb $ee, $ee, $10 ; 58 + defb $ee, $ee, $11 ; 5b + defb $ee, $ef, $12 ; 5e + defb $ee, $ef, $13 ; 61 + defb $ef, $ef, $14 ; 64 + defb $ef, $ef, $15 ; 67 + defb $ef, $ef, $16 ; 6a + defb $ef, $ef, $17 ; 6d + defb $ef, $ef, $18 ; 70 + defb $ef, $ef, $19 ; 73 + defb $ef, $ef, $1a ; 76 + defb $ef, $1b, $1c ; 79 + defb $ef, $1d, $1e ; 7c + defb $ef ; 7f + defb $ec, $ec, $1f ; 80 + defb $ec, $ec, $20 ; 83 + defb $ec, $ec, $21 ; 86 + defb $ec, $ec, $22 ; 89 + defb $ec, $ec, $23 ; 8c + defb $ed, $ed, $7e ; 8f + defb $ed, $ed, $7d ; 92 + defb $ed, $ed, $7f ; 95 + defb $ed, $ed, $7f ; 98 + defb $ed, $ee, $7f ; 9b -- + defb $ee, $ee, $7f ; 9e + defb $ee, $ee, $7f ; a1 + defb $ee, $ee, $7d ; a4 + defb $ee, $ee, $7e ; a7 + defb $ee, $ef, $24 ; aa + defb $ef, $ef, $25 ; ad + defb $ef, $ef, $26 ; b0 + defb $ef, $ef, $27 ; b3 + defb $ef, $ef, $28 ; b6 + defb $ef, $29, $2a ; b9 + defb $2b, $2c, $2d ; bc +l3cbf in l, (c) + jp (hl) + + block $3cff-$ ; 61 bytes + +l3cff ld a, r ;9 49 (41 sin borde) + ld l, a ;4 + ld b, (hl) ;7 +l3d03 ld a, ixl ;8 + ld r, a ;9 + ld a, b ;4 + ex af, af' ;4 + dec h ;4 + in l, (c) ;12 + jp (hl) ;4 + + block $3dbf-$ ; 178 bytes + +l3dbf in l, (c) + jp (hl) + + block $3df5-$ ; 51 bytes + +l3df5 xor b + add a, a + ret c + add a, a + ex af, af' + out ($fe), a + in l, (c) + jp (hl) +l3dff inc h + jr nc, l3df5 + xor b + xor $9c + ld (de), a + inc de + ld a, $dc + ex af, af' + in l, (c) + jp (hl) + defb $ec, $ec, $01 ; 0d + defb $ec, $ec, $02 ; 10 + defb $ec, $ec, $03 ; 13 + defb $ec, $ec, $04 ; 16 + defb $ec, $ec, $05 ; 19 + defb $ec, $ec, $06 ; 1c + defb $ec, $ec, $07 ; 1f + defb $ec, $ec, $08 ; 22 + defb $ec, $ec, $09 ; 25 + defb $ed, $ed, $0a ; 28 + defb $ed, $ed, $0b ; 2b + defb $ed, $ed, $0c ; 2e + defb $ed, $ed, $0d ; 31 + defb $ed, $ed, $0e ; 34 + defb $ed, $ed, $7f ; 37 + defb $ed, $ed, $7f ; 3a + defb $ed, $ed, $7f ; 3d + defb $ed, $ed, $7f ; 40 + defb $ed, $ee, $7f ; 43 -- + defb $ee, $ee, $7f ; 46 -- + defb $ee, $ee, $7f ; 49 + defb $ee, $ee, $7f ; 4c + defb $ee, $ee, $7f ; 4f + defb $ee, $ee, $7f ; 52 + defb $ee, $ee, $0f ; 55 + defb $ee, $ee, $10 ; 58 + defb $ee, $ee, $11 ; 5b + defb $ee, $ef, $12 ; 5e + defb $ee, $ef, $13 ; 61 + defb $ef, $ef, $14 ; 64 + defb $ef, $ef, $15 ; 67 + defb $ef, $ef, $16 ; 6a + defb $ef, $ef, $17 ; 6d + defb $ef, $ef, $18 ; 70 + defb $ef, $ef, $19 ; 73 + defb $ef, $ef, $1a ; 76 + defb $ef, $1b, $1c ; 79 + defb $ef, $1d, $1e ; 7c + defb $ef ; 7f + defb $ec, $ec, $1f ; 80 + defb $ec, $ec, $20 ; 83 + defb $ec, $ec, $21 ; 86 + defb $ec, $ec, $22 ; 89 + defb $ec, $ec, $23 ; 8c + defb $ed, $ed, $7e ; 8f + defb $ed, $ed, $7d ; 92 + defb $ed, $ed, $7f ; 95 + defb $ed, $ed, $7f ; 98 + defb $ed, $ee, $7f ; 9b -- + defb $ee, $ee, $7f ; 9e + defb $ee, $ee, $7f ; a1 + defb $ee, $ee, $7d ; a4 + defb $ee, $ee, $7e ; a7 + defb $ee, $ef, $24 ; aa + defb $ef, $ef, $25 ; ad + defb $ef, $ef, $26 ; b0 + defb $ef, $ef, $27 ; b3 + defb $ef, $ef, $28 ; b6 + defb $ef, $29, $2a ; b9 + defb $2b, $2c, $2d ; bc +l3ebf ld a, r + ld l, a + ld b, (hl) +l3ec3 ld a, ixl + ld r, a + ld a, b + ex af, af' + dec h + in l, (c) + jp (hl) + + block $3eff-$ ; 50 bytes + +l3eff in l,(c) + jp (hl) + +lbytes di ; disable interrupts + ld a, $0f ; make the border white and mic off. + out ($fe), a ; output to port. + push ix + pop hl ; pongo la direccion de comienzo en hl + ld c, 2 + exx ; salvo de, en caso de volver al cargador estandar y para hacer luego el checksum + ld c, a +ultr0 defb $11 ; en 1120 bit bajo de h=1 alto de l=0 +ultr1 jr nz, ultr3 ; return if at any time space is pressed. +ultr2 ld b, 0 + call lsampl ; leo la duracion de un pulso (positivo o negativo) + jr nc, ultr1 ; si el pulso es muy largo retorno a bucle + cp 40 ; si el contador esta entre 24 y 40 + jr nc, ultr4 ; y se reciben 8 pulsos (me falta inicializar hl a 00ff) + cp 24 + rl h + jr nz, ultr4 +ultr3 exx +lbreak ret nz ; return if at any time space is pressed. +lstart call ldedg1 ; routine ld-edge-1 + jr nc, lbreak ; back to ld-break with time out and no edge present on tape + xor a ; set up 8-bit outer loop counter for approx 0.45 second delay +ldwait add hl, hl + djnz ldwait ; self loop to ld-wait (for 256 times) + dec a ; decrease outer loop counter. + jr nz, ldwait ; back to ld-wait, if not zero, with zero in b. + call ldedg2 ; routine ld-edge-2 + jr nc, lbreak ; back to ld-break if no edges at all. +leader ld b, $9c ; two edges must be spaced apart. + call ldedg2 ; routine ld-edge-2 + jr nc, lbreak ; back to ld-break if time-out + add a, $3a ; two edges must be spaced apart. + jr nc, lstart ; back to ld-start if too close together for a lead-in. + inc h ; proceed to test 256 edged sample. + jr nz, leader ; back to ld-leader while more to do. +ldsync ld b, $c9 ; two edges must be spaced apart. + call ldedg1 ; routine ld-edge-1 + jr nc, lbreak ; back to ld-break with time-out. + cp $d4 ; compare + jr nc, ldsync ; back to ld-sync if gap too big, that is, a normal lead-in edge gap + call ldedg1 ; routine ld-edge-1 + ret nc ; return with time-out. + ld a, c ; fetch long-term mask from c + xor $03 ; and make blue/yellow. + ld c, a ; store the new long-term byte. + jr marker ; forward to ld-marker +ldloop ex af, af' ; restore entry flags and type in a. + jr nz, ldflag ; forward to ld-flag if awaiting initial flag, to be discarded + ld (ix), l ; place loaded byte at memory location. + inc ix ; increment byte pointer. + dec de ; decrement length. + defb $c2 +ldflag inc l ; compare type in a with first byte in l. + ret nz ; return if no match e.g. code vs. data. +marker ex af, af' ; store the flags. + ld l, $01 ; initialize as %00000001 +l8bits ld b, $b2 ; timing. + call ldedg2 ; routine ld-edge-2 increments b relative to gap between 2 edges + ret nc ; return with time-out. + add a, $35 ; the comparison byte. + rl l ; rotate the carry bit into l. + jr nc, l8bits ; jump back to ld-8-bits + ld a, h ; fetch the running parity byte. + xor l ; include the new byte. + ld h, a ; and store back in parity register. + ld a, d ; check length of + or e ; expected bytes. + jr nz, ldloop ; back to ld-loop while there are more. + ld a, h ; fetch parity byte. + cp 1 ; set carry if zero. + ret ; return +ultr4 cp 16 ; si el contador esta entre 10 y 16 es el tono guia + rr l ; de las ultracargas, si los ultimos 8 pulsos + cp 10 ; son de tono guia h debe valer ff + jr nc, ultr2 + inc l + inc l + jr nz, ultr0 ; si detecto sincronismo sin 8 pulsos de tono guia retorno a bucle + ld h, l + call lsampl ; leo pulso negativo de sincronismo + inc l ; hl vale 0001, marker para leer 16 bits en hl (checksum y byte flag) + call get16 ; leo 16 bits, ahora temporizo cada 2 pulsos + ld a, l + inc l ; lo comparo con el que me encuentro en la ultracarga + ret nz ; salgo si no coinciden + xor h ; xoreo el checksum con en byte flag, resultado en a + exx ; guardo checksum por duplicado en h' y l' + push hl ; pongo direccion de comienzo en pila + ld c, a + ld a, $d8 ; a' tiene que valer esto para entrar en raudo + ex af, af' + exx + ld h, $01 ; leo 8 bits en hl + call get16 + push hl + pop ix + pop de ; recupero en de la direccion de comienzo del bloque + rr c ; pongo en flag z el signo del pulso + ld bc, $effe ; este valor es el que necesita b para entrar en raudo + jp nc, ult55 + ld h, $3e +ultr5 in f, (c) + jp pe, ultr5 + call l3ec3 ; salto a raudo segun el signo del pulso en flag z + jr ultr7 +ult55 ld h, $3c +ultr6 in f, (c) + jp po, ultr6 + call l3d03 ; salto a raudo +ultr7 sbc a, a + exx ; ya se ha acabado la ultracarga (raudo) + dec de + ld b, e + inc b + inc d +ultr8 xor (hl) + inc hl + djnz ultr8 + dec d + jp nz, ultr8 + push hl ; ha ido bien + xor c + pop ix ; ix debe apuntar al siguiente byte despues del bloque + ret nz ; si no coincide el checksum salgo con carry desactivado + scf + ret +ldedg2 call ldedg1 ; call routine ld-edge-1 below. + ret nc ; return if space pressed or time-out. +ldedg1 ld a, $16 ; a delay value of twenty two. +ldelay dec a ; decrement counter + jr nz, ldelay ; loop back to ld-delay 22 times. +lsampl inc b ; increment the time-out counter. + ld a, b + ret z ; return with failure when $ff passed. + ld a, $7f ; prepare to read keyboard and ear port + in a, ($fe) ; row $7ffe. bit 6 is ear, bit 0 is space key. + rra ; test outer key the space. (bit 6 moves to 5) + ret nc ; return if space pressed. >>> + xor c ; compare with initial long-term state. + and $20 ; isolate bit 5 + jr z, lsampl ; back to ld-sample if no edge. + ld a, c ; fetch comparison value. + xor $27 ; switch the bits + ld c, a ; and put back in c for long-term. + out ($fe), a ; send to port to effect the change of colour. + ld a, b + scf ; set carry flag signaling edge found within time allowed + ret ; return. + +decbhl dec hl + ld a, l + and h + inc a + ret nz + dec b + ret + +;++++++++++++++++++++++++++++++++++++++++ +;++++++++++++++++++++++++++++++++++++++++ +;++++++++++++ +++++++++++++ +;++++++++++++ MESSAGES +++++++++++++ +;++++++++++++ +++++++++++++ +;++++++++++++++++++++++++++++++++++++++++ +;++++++++++++++++++++++++++++++++++++++++ + block $7e00-$ +cad0 defb 'Core: ',0 +cad1 defm 'http://zxuno.speccy.org', 0 + defm 'ZX-Uno BIOS v0.326', 0 + defm 'Copyleft ', 127, ' 2016 ZX-Uno Team', 0 + defm 'Processor: Z80 3.5MHz', 0 + defm 'Memory: 512K Ok', 0 + defm 'Graphics: normal, hi-color', 0 + defm 'hi-res, ULAplus', 0 + defm 'Booting:', 0 + defm 'Press to Setup Boot Menu', 0 +cad2 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 + defm $10, ' Please select boot machine: ', $10, 0 +cad3 defb $16, $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, $17, 0 +cad4 defm $10, ' ', $10, 0 +cad5 defm $10, ' ', $1c, ' and ', $1d, ' to move selection ', $10, 0 + defm $10, ' ENTER to select boot machine ', $10, 0 + defm $10, ' ESC to boot using defaults ', $10, 0 + 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 +cad6 defb 'Enter Setup', 0 +cad7 defb ' Main ROMs Upgrade Boot Advanced Exit', 0 + defb $12, $11, $11, $11, $11, $11, $11, $11, $11, $11, $11, $11, $11, $11 + defb $11, $11, $11, $11, $11, $11, $11, $11, $11, $11, $11, $11, $19, $11 + defb $11, $11, $11, $11, $11, $11, $11, $11, $11, $11, $11, $11, $11, $13, 0 +cad8 defm $10, ' ', $10, ' ', $10, 0 + defm $10, 0 +cad9 defb $14, $11, $11, $11, $11, $11, $11, $11, $11, $11, $11, $11, $11, $11 + defb $11, $11, $11, $11, $11, $11, $11, $11, $11, $11, $11, $11, $18, $11 + defb $11, $11, $11, $11, $11, $11, $11, $11, $11, $11, $11, $11, $11, $15, 0 + defb ' BIOS v0.326 ', $7f, '2016 ZX-Uno Team', 0 +cad10 defb 'Hardware tests', 0 + defb $11, $11, $11, $11, $11, $11, $11, $11, $11, $11, $11, $11 + defb $11, $11, $11, $11, 0 + defb $1b, ' Memory test', 0 + defb $1b, ' Sound test', 0 + defb $1b, ' Tape test', 0 + defb $1b, ' Input test', 0 + defb ' ', 0 + defb 'Options', 0 + defb $11, $11, $11, $11, $11, $11, $11, $11, $11, 0 + defb 'Quiet Boot', 0 + defb 'Check CRC', 0 + defb 'Keyboard', 0 + defb 'Timing', 0 + defb 'Contended', 0 + defb 'DivMMC', 0 + defb 'NMI-DivMMC', 0, 0 +cad11 defb ' ', $10, 0 + defb ' ', $10, 0 + defb ' ', $10, 0 + defb ' ', $10, 0 + defb ' ', $10, 0 + defb ' ', $16, $11, $11, $11, $11, $11, $11, $11 + defb $11, $11, $11, $11, $11, $11, $11, $17, 0 + defb ' ', $10, 0 + defb ' ', $10, 0 + defb ' ', $10, 0 + defb ' ', $10, 0 + defb ' ', $10, 0 + defb ' ', $10, 0 + defb ' ', $10, 0 + defb ' ', $10, 0, 0 +cad12 defb 'Name Slot', 0 + defb $11, $11, $11, $11, $11, $11, $11, $11, $11, $11, 0 + defb $11, $11, $11, $11, 0 +cad13 defb $1e, ' ', $1f, ' Sel.Screen', 0 + defb $1c, ' ', $1d, ' Sel.Item', 0 + defb 'Enter Change', 0 + defb 'Graph Save&Exi', 0 + defb 'Break Exit', 0 + defb 'N New Entry', 0 + defb 'R Recovery', 0 +cad14 defb 'Run a diagnos-', 0 + defb 'tic test on', 0 + defb 'your system', 0 + defb 'memory', 0, 0 +cad15 defb 'Performs a', 0 + defb 'sound test on', 0 + defb 'your system', 0, 0 +cad16 defb 'Performs a', 0 + defb 'keyboard &', 0 + defb 'joystick test', 0, 0 +cad17 defb 'Hide the whole', 0 + defb 'boot screen', 0 + defb 'when enabled', 0, 0 +cad18 defb 'Enable RAM and', 0 + defb 'ROM on DivMMC ', 0 + defb 'interface.', 0 + defb 'Ports are', 0 + defb 'available', 0, 0 +cad19 defb 'Disable for', 0 + defb 'better compa-', 0 + defb 'tibility with', 0 + defb 'SE Basic IV', 0, 0 +cad20 defb 'Behaviour of', 0 + defb 'bit 6 on port', 0 + defb '$FE depends', 0 + defb 'on hardware', 0 + defb 'issue', 0, 0 +cad21 defb $12, $11, $11, $11, ' Options ', $11, $11, $11, $13, 0 +cad22 defb $10, ' ', $10, 0 + defb $14, $11, $11, $11, $11, $11, $11, $11, $11, $11, $11 + defb $11, $11, $11, $11, $11, $15, 0 +cad88 defb 'Spanish', 0 +cad89 defb 'English', 0 +cad90 defb 'Spectrum', 0 +cad91 defb 'Kempston', 0 +cad92 defb 'SJS1', 0 +cad93 defb 'SJS2', 0 +cad94 defb 'Protek', 0 +cad95 defb 'Fuller', 0 +cad96 defb 'PAL', 0 +cad97 defb 'NTSC', 0 +cad98 defb 'VGA', 0 +cad28 defb 'Disabled', 0 +cad29 defb 'Enabled', 0 +cad30 defb 'Issue 2', 0 +cad31 defb 'Issue 3', 0 +cadv2 defb 'Auto', 0 +cadv3 defb '48K', 0 +cadv4 defb '128K', 0 +cadv5 defb 'Pentagon', 0 +cad32 defb 'Move Up q', 0 +cad33 defb 'Set Active', 0 +cad34 defb 'Move Down a', 0 +cad35 defb 'Rename', 0 +cad36 defb 'Delete', 0 + defb ' ', $12, $11, $11, $11, $11, $11, $11, $11, $11, $11, $11, $11, $11 + defb ' Rename ', $11, $11, $11, $11, $11, $11, $11, $11, $11, $11, $11, $11, $11, $13, 0 + defb ' ', $10, ' ', $1e, ' ', $1f, ' Enter accept Break cancel ', $10, 0 + defb ' ', $16, $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, $17, 0 + defb ' ', $10, ' ', $10, 0 + 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, $15, 0 +cad38 defb 'Exit system', 0 + defb 'setup after', 0 + defb 'saving the', 0 + defb 'changes', 0, 0 +cad39 defb 'Exit system', 0 + defb 'setup without', 0 + defb 'saving any', 0 + defb 'changes', 0, 0 +cad40 defb 'Save Changes', 0 + defb 'done so far to', 0 + defb 'any of the', 0 + defb 'setup options', 0, 0 +cad41 defb 'Discard Chan-', 0 + defb 'ges done so', 0 + defb 'far to any of', 0 + defb 'the setup', 0 + defb 'options', 0, 0 +cad45 defb 'Header:', 0 +cad46 defb $12, ' Exit Without Saving ', $11, $13, 0 + defb $10, ' ', $10, 0 + defb $10, ' Quit without saving? ', $10, 0 +cad47 defb $12, $11, ' Save Setup Values ', $11, $11, $13, 0 + defb $10, ' ', $10, 0 + defb $10, ' Save configuration? ', $10, 0 +cad48 defb $12, ' Load Previous Values ', $13, 0 + defb $10, ' ', $10, 0 + defb $10, ' Load previous values?', $10, 0 +cad42 defb $10, ' ', $10, 0 + defb $16, $11, $11, $11, $11, $11, $11, $11, $11 + defb $11, $11, $11, $11, $11, $11, $11, $11, $11 + defb $11, $11, $11, $11, $11, $17, 0 + defb $10, ' Yes No ', $10, 0 +cad43 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, $15, 0 + defb $12, $11, $11, $11, ' Save and Exit ', $11, $11, $11, $11, $13, 0 + defb $10, ' ', $10, 0 + defb $10, ' Save conf. & Exit? ', $10, 0 +cad44 defb $12, $11, $11, $11, ' Load from tape ', $11, $11, $11, $13, 0 +cad445 defb $12, $11, $11, $11, $11, ' Load from SD ', $11, $11, $11, $11, $13, 0 + defb $10, ' ', $10, 0 + defb $10, ' Are you sure? ', $10, 0 +cad37 defb 'Save Changes & Exit', 0 + defb 'Discard Changes & Exit', 0 + defb 'Save Changes', 0 + defb 'Discard Changes', 0 +cad49 defb 'Press play on', 0 + defb 'tape & follow', 0 + defb 'the progress', 0 + defb 'Break to', 0 + defb 'cancel', 0, 0 +cad50 defb 'Loading Error', 0 +cad51 defb 'Any key to return', 0 +cad52 defb 'Block 1 of 1:', 0 +cad53 defb 'Done', 0 +cad54 defb 'Slot position:', 0 +cad55 defb 'Invalid CRC in ROM 0000. Must be 0000', 0 + defb 'Press any key to continue ', 0 +cad56 defb 'Check CRC in', 0 + defb 'all ROMs. Slow', 0 + defb 'but safer', 0, 0 +cad57 defb 'Machine upgraded', 0 +cad58 defb 'BIOS upgraded', 0 +cad59 defb 'ESXDOS upgraded', 0 +cad60 defb 'Upgrade ESXDOS for ZX', 0 +cad61 defb 'Upgrade BIOS for ZX', 0 +cad615 defb 'Upgrade flash from SD', 0 +cad62 defb 'ZX Spectrum', 0 +cad63 defb 'Status:[ ]', 0 +cad64 defb ' ', $12, $11, $11, $11, $11, $11, $11, $11, $11, $11, $11, $11 + defb ' Recovery ', $11, $11, $11, $11, $11, $11, $11, $11, $11, $11, $11, $11, $13, 0 + defb ' ', $10, ' ', $1e, ' ', $1f, ' Enter accept Break cancel ', $10, 0 + defb ' ', $16, $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, $17, 0 + defb ' ', $10, 'Name ', $10, 0 + defb ' ', $10, ' ', $10, 0 + defb ' ', $10, 'Slt Siz Bnk Siz p1F p7F Flags ', $10, 0 + defb ' ', $10, ' ', $10, 0 + 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, $15, 0, 0 +cad65 defb 'Performing...', 0 +cad66 defb ' ', 0 +cad67 defb ' OK', 0 +cad68 defb ' Er', 0 +cad69 defb '00', 0 +cad70 defb 'Set timings', 0 + defb '224T if 48K', 0 + defb '228T if 128K', 0, 0 +cad71 defb 'Memory usually', 0 + defb 'contended.', 0 + defb 'Disabled on', 0 + defb 'Pentagon 128K', 0, 0 +cad72 defb 'Performs a', 0 + defb 'tape test', 0, 0 +cad73 defb $1b, 0 +cad74 defb 'Kempston Fuller', 0 + defb 'Break key to return', 0 + defb '234567890' + defb 'Q'+$80, 'WERTYUIOP' + defb 'A'+$80, 'SDFGHJKLe' + defb 'c'+$80, 'ZXCVBNMsb' + defb 'o'+$80, $1c, $1d, $1e, $1f, $1f, $1e, $1d, $1c, 'o', $80 +cad75 defb 'Insert SD with', 0 + defb 'the file on', 0 + defb 'root', 0, 0 +cad76 defb 'Be quiet, avoid brick', 0 +cad77 defb 'SD or partition error', 0 +cad78 defb 'Not found or bad size', 0 +cad79 defb ' Successfully burned ', 0 +cad80 defb 'EAR input', 0 +cad81 defb 'SD file', 0 +cad82 defb 'Input machine\'s name', 0 + IF version=4 +files defb 'ESXDOS ZX1' + defb 'FIRMWAREZX1' + defb 'FLASH ZX1' + defb 'SPECTRUMZX1' +fileco defb 'CORE ZX1' + ELSE + IF version=3 +files defb 'ESXDOS ZZ3' + defb 'FIRMWAREZZ3' + defb 'FLASH ZZ3' + defb 'SPECTRUMZZ3' +fileco defb 'CORE ZZ3' + ELSE + IF version=2 +files defb 'ESXDOS ZZ2' + defb 'FIRMWAREZZ2' + defb 'FLASH ZZ2' + defb 'SPECTRUMZZ2' +fileco defb 'CORE ZZ2' + ELSE + IF version=1 +files defb 'ESXDOS ZXA' + defb 'FIRMWAREZXA' + defb 'FLASH ZXA' + defb 'SPECTRUMZXA' +fileco defb 'CORE ZXA' + ENDIF + ENDIF + ENDIF + ENDIF +cad83 defb 'Input', 0 + defb $11, $11, $11, $11, $11, $11, $11, $11, 0 + defb 'Keyb Layout', 0 + defb 'Joy Keypad', 0 + defb 'Joy DB9', 0 + defb ' ', 0 + defb ' ', 0 + defb 'Output', 0 + defb $11, $11, $11, $11, $11, $11, $11, $11, $11, 0 + defb 'Video', 0 + defb 'Scanlines', 0 + defb 'Frequency', 0 + defb 'CPU Speed', 0, 0 +cad84 defb 'Select PS/2', 0 + defb 'mapping to', 0 + defb 'spectrum', 0, 0 +cad85 defb 'Simulated', 0 + defb 'joystick', 0 + defb 'configuration', 0, 0 +cad86 defb 'Real joystick', 0 + defb 'configuration', 0, 0 +cad87 defb 'Select default', 0 + defb 'video output', 0, 0 +cad99 defb 'Enable VGA', 0 + defb 'scanlines', 0, 0 +cad100 defb 'Set VGA', 0 + defb 'horizontal',0 + defb 'frequency', 0, 0 +cad101 defb 'Set CPU', 0 + defb 'speed', 0, 0 +cad102 defb '50', 0 +cad103 defb '51', 0 +cad104 defb '53.5', 0 +cad105 defb '55.8', 0 +cad106 defb '57.4', 0 +cad107 defb '59.5', 0 +cad108 defb '61.8', 0 +cad109 defb '63.8', 0 +cad110 defb '1X', 0 +cad111 defb '2X', 0 +cad112 defb 'Break to exit', 0 +;cad199 defb 'af0000 bc0000 de0000 hl0000 sp0000 ix0000 iy0000', 0 + +fincad + +; todo +; * generar tablas CRC por código +; * descomprimir en lugar de copiar codigo alto diff --git a/firmware/fuente6x8.bin b/firmware/fuente6x8.bin new file mode 100644 index 0000000..30d51de Binary files /dev/null and b/firmware/fuente6x8.bin differ diff --git a/firmware/generamcs.bat b/firmware/generamcs.bat new file mode 100644 index 0000000..1149308 --- /dev/null +++ b/firmware/generamcs.bat @@ -0,0 +1,66 @@ +echo define version %1 > version.asm +call make.bat +Bit2Bin ..\cores\Spectrum\zxuno.%2.bit tmp.bin +fpad 2000 00 tmp0.bin +fpad 4c000 00 tmp1.bin +fpad 354000 00 tmp2.bin +copy /b /y header.bin+rom_binaries\esxdos.rom+tmp0.bin+firmware.rom+tmp1.bin+tmp.bin+tmp2.bin FLASH.ZX1 +fpoke FLASH.ZX1 007000 000040xFF 007044 g0203020202 +fcut tmp.bin 0 53f00 sd_binaries\SPECTRUM.%3 +GenRom 0 203 0 0 0 Machine tmp.bin core_taps\SPECTRUM.TAP +rem CgLeches core_taps\SPECTRUM.TAP core_wavs\SPECTRUM.WAV 4 +call :CreateMachine CORE2 "Sam Coupe" SamCoupe\tld_sam.%2.bit 0 %3 +call :CreateMachine CORE3 "Jupiter ACE" JupiterAce\jupiter_ace.%2.bit JupiterAce\jupiter_ace.v2_v3.bit %3 +rem call :CreateMachine CORE4 "Master System" sms_v2_spartan6\test4\sms_final_v4.bit +rem call :CreateMachine CORE5 "Oric Atmos" oric_spartan6\test1\build\oric_v4.bit +rem call :CreateMachine CORE6 "BBC Micro" BBCMicro\test3\working\bbc_micro_v4.bit +rem call :CreateMachine CORE7 "Apple ][ (VGA)" Apple2_spartan6\test2\build\apple2_top_v4.bit +rem call :CreateMachine CORE8 "Acorn Atom (VGA)" acorn_atom_spartan6\test2\working\atomic_top_zxuno_v4.bit +rem call :CreateMachine CORE9 "NES (VGA)" nes_v2_spartan6\test1_v4\xilinx\nes_zxuno_v4.bit +copy /y rom_binaries\esxdos.rom sd_binaries\ESXDOS.%3 +copy /y firmware.rom sd_binaries\FIRMWARE.%3 +GenRom 0 202 0 0 0 BIOS firmware.rom core_taps\FIRMWARE.TAP +GenRom 0 0 0 0 0 ESXDOS rom_binaries\esxdos.rom core_taps\ESXDOS.TAP +call :CreateRom 0 "ZX Spectrum 48K Cargando Leches" leches dn 8 4 0 0 +call :CreateRom 1 "ZX +3e DivMMC" plus3en40divmmc t 8 4 0 0 +call :CreateRom 5 "SE Basic IV 4.0 Anya" se d 8 4 0 0 +call :CreateRom 7 "ZX Spectrum 48K" 48 dn 8 4 0 32 +call :CreateRom 8 "Jet Pac (1983)" JetPac 0 8 1 0 32 +call :CreateRom 9 "Pssst (1983)" Pssst 0 8 1 0 32 +call :CreateRom 10 "Cookie (1983)" Cookie 0 8 1 0 32 +call :CreateRom 11 "Tranz Am (1983)" TranzAm 0 8 1 0 32 +call :CreateRom 12 "Master Chess (1983)" MasterChess 0 8 1 0 32 +call :CreateRom 13 "Backgammon (1983)" Backgammon 0 8 1 0 32 +call :CreateRom 14 "Hungry Horace (1983)" HungryHorace 0 8 1 0 32 +call :CreateRom 15 "Horace & the Spiders (1983)" HoraceSpiders 0 8 1 0 32 +call :CreateRom 16 "Planetoids (1983)" Planetoids 0 8 1 0 32 +call :CreateRom 17 "Space Raiders (1983)" SpaceRaiders 0 8 1 0 32 +call :CreateRom 18 "Deathchase (1983)" Deathchase 0 8 1 0 32 +call :CreateRom 19 "Manic Miner (1983)" ManicMiner 0 8 1 0 32 +call :CreateRom 20 "Misco Jones (2013)" MiscoJones 0 8 1 0 32 +call :CreateRom 21 "Jet Set Willy (1984)" JetSetWilly 0 8 1 0 32 +call :CreateRom 22 "Lala Prologue (2010)" LalaPrologue 0 8 1 0 32 +srec_cat FLASH.ZX1 -binary ^ + -o prom.%2.mcs -Intel ^ + -line-length=44 ^ + -line-termination=nl +del tmp.bin tmp0.bin tmp1.bin tmp2.bin +move /y FLASH.ZX1 sd_binaries\FLASH.%3 +goto :eof + +:CreateMachine +IF EXIST ..\cores\%3 ( + Bit2Bin ..\cores\%3 sd_binaries\%1.%5 +) ELSE ( + Bit2Bin ..\cores\%4 sd_binaries\%1.%5 +) +GenRom 0 0 0 0 0 %2 sd_binaries\%1.%5 core_taps\%1.TAP +AddItem %1 core_taps\%1.tap +rem CgLeches core_taps\%1.TAP core_wavs\%1.WAV 4 +goto :eof + +:CreateRom +GenRom %4 %5 %6 %7 %8 %2 rom_binaries\%3.rom rom_taps\%3.tap +AddItem ROM %1 rom_taps\%3.tap +rem CgLeches rom_taps\%3.tap rom_wavs\%3.wav 4 +:eof diff --git a/firmware/generamcs_vx.bat b/firmware/generamcs_vx.bat new file mode 100644 index 0000000..df340f0 --- /dev/null +++ b/firmware/generamcs_vx.bat @@ -0,0 +1,4 @@ +rem call generamcs 1 Ap ZZA +call generamcs 2 v2 ZZ2 +rem call generamcs 3 v3 ZZ3 +rem call generamcs 4 v4 ZX1 diff --git a/firmware/header.bin b/firmware/header.bin new file mode 100644 index 0000000..d178650 Binary files /dev/null and b/firmware/header.bin differ diff --git a/firmware/logo256x192.rcs.zx7b b/firmware/logo256x192.rcs.zx7b new file mode 100644 index 0000000..7b0398d Binary files /dev/null and b/firmware/logo256x192.rcs.zx7b differ diff --git a/firmware/make.bat b/firmware/make.bat new file mode 100644 index 0000000..a9849fb --- /dev/null +++ b/firmware/make.bat @@ -0,0 +1,5 @@ +sjasmplus firmware.asm +fcut firmware_strings.rom 7e00 -7e00 strings.bin +zx7b strings.bin strings.bin.zx7b +sjasmplus firmware.asm +fcut firmware_strings.rom 0000 4000 firmware.rom diff --git a/firmware/sd.asm b/firmware/sd.asm new file mode 100644 index 0000000..1cd95ca --- /dev/null +++ b/firmware/sd.asm @@ -0,0 +1,139 @@ + define debug 0 + +inirea push hl + push bc +reinit call mmcinit + pop bc + pop hl + ret nz +; defb $32 +readat0 ld e, 0 +readata push hl + push bc + ld a, READ_SINGLE ; Command code for multiple block read + call cs_low ; set cs high + ld bc, READ_SINGLE<<8 | SPI_PORT + out (c), b + ld a, (sdhc) + or a + jr z, mul2 + out (c), 0 + out (c), e + out (c), h + out (c), l + call send0z + jr mul3 +mul2 ld a, e + add hl, hl + adc a, a + out (c), a + out (c), h + out (c), l + call send1z +mul3 or a + jr nz, reinit +waitl call waitr + sub $fe ; waits for the MMC to reply $FE (DATA TOKEN) + jr z, waitm + djnz waitl +waitm push ix + pop hl ; INI usa HL come puntatore + ld b, a + inir + inir + pop bc + pop hl + ret + +mmcinit xor a + ld (sdhc), a + ld iyl, a + dec a + call cs_high ; set cs high + ld bc, $09<<8 | SPI_PORT +l_init out (c), a + djnz l_init + call cs_low ; set cs low + ld hl, $95<<8 | CMD0 + call send5 + dec a ; MMC should respond 01 to this command + ret nz ; fail to reset + ld l, CMD8 + out (c), l ; sends the command + out (c), 0 + out (c), 0 + inc a + out (c), a + ld hl, $87aa + out (c), l + call send0z + dec a + jr z, sdv2 + ld h, 0 + call acmd41 + cp 2 + jr nc, mmc + IF debug=1 + ld a, 1 + out ($fe), a + ENDIF +sdv1 call acmd41 + call count + jr z, count + and a + jr nz, sdv1 +mmc1 and a + ret z +mmc ld l, CMD1 + call send5 + call count + jr nz, mmc1 +count dec b + ret nz + dec iyl + ret +sdv2 ld h, $40 + call sdv1 + ld l, CMD58 + call send5 + in a, (c) + cp $c0 + jr nz, sig2 + ld (sdhc), a +sig2 in a, (c) + in a, (c) + in a, (c) + +cs_low push af + ld a, MMC_0 + jr cs_hig1 + +acmd41 ld l, CMD55 + call send5 + ld l, CMD41 + out (c), l + out (c), h + jr send3z + +cs_high push af + ld a, $ff +cs_hig1 out (OUT_PORT), a + pop af + ret + +send5 out (c), l ; sends the command + out (c), 0 ; then sends four "00" bytes (parameters = NULL) +send3z out (c), 0 + out (c), 0 +send1z out (c), 0 +send0z out (c), h ; then this byte is ignored. +waitr push bc + ld c, 50 ; retry counter +resp in a, (SPI_PORT) ; reads a byte from MMC + cp $ff ; $FF = no card data line activity + jr nz, resp_ok + djnz resp + dec c + jr nz, resp +resp_ok pop bc + ret diff --git a/firmware/us.zx7b b/firmware/us.zx7b new file mode 100644 index 0000000..cfd0b7c Binary files /dev/null and b/firmware/us.zx7b differ