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