include version.asm define chloe 0 define recovery 0 define recodire 0 define zesarux 0 define vertical 0 define clones 0 ; 0= zxdos+, 1= buryak, 2= unoxt 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 dev_control 14 define dev_control2 15 define newreg 16 define ad724 $fb 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 scnbak $8fd5 define empstr $8fd6 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 grapmo nmidiv+1 define layout grapmo+1 define joykey layout+1 define joydb9 joykey+1 IF version=1 define split joydb9+1 define outvid split+1 ELSE define outvid joydb9+1 ENDIF define scanli outvid+1 define freque scanli+1 define cpuspd freque+1 define copt cpuspd+1 define cburst copt+1 define tmpbuf $7800 define tmpbu2 $7880 define bnames $a100 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, sdtab ld de, $b400-chrend+sdtab ei jp start rst18 jp alto prnstr nop jmptbl IF recovery=0 defw main defw roms defw upgra defw upgra defw advan defw exit ELSE defw upgra defw upgra defw upgra defw upgra defw upgra defw upgra ENDIF 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 in a, ($1f) or a jr z, nokemp ld hl, kemp-1 sikemp inc hl rrca jr nc, sikemp jr sikem2 nokemp ld h, a add a, d jr z, keysc6 ld d, h ld l, a add hl, de sikem2 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 . , * kemp defb $1f, $1e, $1d, $1c, $0d ; Right Left Down Up Enter defb $0c ; Break start ld bc, chrend-sdtab ldir wreg scan_code, $f6 ; $f6 = kb set defaults halt halt wreg scan_code, $f0 ; $f0 + 2 = Set scan code set 2 halt halt wreg scan_code, $02 ld c, $05 ; 100msec delay delay1 halt dec c jr nz, delay1 IF recovery=0 call alto loadch ld hl, (scanli) rrc l add hl, hl ld a, (copt) rrca jr nc, start0 set 4, h start0 ld a, (outvid) push af rrca ld a, (cburst) adc a, a ld de, ad724<<8 | scandbl_ctrl ld bc, zxuno_port out (c), d inc b out (c), a pop af dec b out (c), e inc b rrca rrca ld a, h adc a, a or $c0 ld (scnbak), a sub $40 ; lo pongo a 14Mhz out (c), a nop ld de, fincad-1 ; descomprimo cadenas ld hl, sdtab-1 call dzx7b ELSE wreg scandbl_ctrl, $c0 ENDIF im 1 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 IF recovery=0 ld a, 1 out ($fe), a ld a, (quietb) or a ld d, $7a jr nz, start3 ld h, l ld d, $20 call window jr start8 start3 xor a out ($fe), a ld hl, finlog-1 call dzx7b ; descomprimir call drcs ld bc, zxuno_port out (c), a ; a = $ff = core_id inc b ld hl, cad0+6 ; Load address of coreID string start5 in a, (c) ld (hl), a ; copia el caracter leido de CoreID inc hl ld ix, cad0 ; imprimir cadena jr nz, start5 ; si no recibimos un 0 seguimos pillando caracteres call alto tstmem jr z, star55 ld hl, cadmem ld (hl), ' ' inc hl ld (hl), ' ' inc hl dec e jr nz, star54 dec (hl) star54 inc hl ld (hl), 'M' star55 ld a, (outvid) rrca jr nc, star56 wreg master_conf, %01010000 star56 IF vertical=0 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 ELSE ld bc, $040f call_prnstr ; CoreID ld c, $0c ld ixl, cad1 & $ff ; imprimir cadenas BOOT screen call_prnstr ; http://zxuno.speccy.org ld bc, $0211 call_prnstr ; ZX-Uno BIOS version call_prnstr ; Copyleft ld bc, $0014 ; 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, $1b call_prnstr ; Press to Setup call_prnstr ; Press to Setup ENDIF ld hl, bitstr add a, (hl) jr z, start6 dec a call cbname xor a jr start7 start6 dec l ld l, (hl) ld l, (hl) call calcu set 5, l start7 ld de, tmpbuf push de pop ix ld c, $1f ldir ld (de), a pop bc call_prnstr ; Imprime máquina (ROM o core) ENDIF start8 IF version=1 wreg flash_cs, 0 ; activamos spi, enviando un 0 wreg flash_spi, $9f ; jedec id in a, (c) in a, (c) in a, (c) in a, (c) wreg flash_cs, 1 ; desactivamos spi, enviando un 1 sub $13 cp 5 jr nz, start9 ld hl, alto subnn+1 ld (hl), 6*4 start9 ld hl, $0800 star10 add hl, hl dec a jr nz, star10 ld (alto fllen), hl ENDIF IF recovery=0 wreg mouse_data, $f4 ; $f4 = init Kmouse ld a, (layout) srl a ld hl, fines-1 jr z, star12 ld hl, finus-1 jr nc, star13 ld hl, finav-1 star12 jr nc, star15 star13 ld de, $cfff call dzx7b wreg key_map, 0 ld hl, $c001 star14 inc b outi bit 4, h ; compruebo si la direccion es D000 (final) jr z, star14 ; repito si no lo es star15 ld a, (quietb) inc a ld d, 1 star1a rlc d dec a jr nz, star1a pop af jr nz, star16 set 4, d star16 djnz star18 dec de ld a, d or e jr nz, star18 wreg scan_code, $f6 ; $f6 = kb set defaults halt halt wreg scan_code, $ed ; $ed + 2 = kb set leds + numlock halt halt wreg scan_code, $02 halt halt IF vertical=0 ld hl, $0017 ; Si se acaba el temporizador borrar ld de, $2001 ; lo de presione Break ELSE ld hl, $001b ; Si se acaba el temporizador borrar ld de, $2002 ; lo de presione Break ENDIF call window star17 ld hl, (joykey) inc h inc l ld a, h rlca rlca rlca rlca or l ld bc, zxuno_port ld de, joy_conf<<8 | scandbl_ctrl out (c), d inc b out (c), a IF version=1 ld a, (split) rrca rrca rrca ld (alto contib+1), a ENDIF ld a, (cpuspd) rrca rrca or $3f ld hl, scnbak and (hl) dec b out (c), e inc b out (c), a jp conti runbit0 ld a, l IF version=2 cp 69 ELSE cp 45 ENDIF jr z, bios runbit1 ld (bitstr), a jr star17 star18 ld a, (codcnt) star19 sub $80 jr c, star16 ld (codcnt), a sub '1' cp 9 jr c, runbit1 jp z, alto easter cp $19-'1' jr z, star20 sub $0c-'1' star20 jp z, blst sub $1d-$0c jp z, launch ld hl, alto contia+1 cp $2f-$1d ;'/' jr nz, star20a out ($fe), a ld (hl), %01111111 star20a cp $72-$1d ; 'r' jr nz, star20b out ($fe), a ld (hl), %11111101 star20b cp $17-$1d ; 'Edit' jr nz, star19 ELSE pop af star21 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, 1 ; envío write register status IF version=4 ld hl, $0202 ld (menuop), hl ld l, $40 out (c), l out (c), 0 wreg flash_cs, 1 ; desactivamos spi, enviando un 1 wreg flash_cs, 0 ; activamos spi, enviando un 0 wreg flash_spi, $05 ; envío write register status ELSE ld hl, $0202 ld (menuop), hl out (c), 0 out (c), l wreg flash_cs, 1 ; desactivamos spi, enviando un 1 wreg flash_cs, 0 ; activamos spi, enviando un 0 wreg flash_spi, $35 ; envío write register status ENDIF in a, (c) in a, (c) wreg flash_cs, 1 ; desactivamos spi, enviando un 1 and 2 jr z, star21 xor a ENDIF ;++++++++++++++++++++++++++++++++++ ;++++++++ Enter Setup ++++++++ ;++++++++++++++++++++++++++++++++++ bios ld a, %01001111 ; fondo azul tinta blanca IF vertical=0 ld hl, $0017 ld de, $2001 call window ld a, %00111001 ; fondo blanco tinta azul ld l, h ld e, $17 ELSE ld hl, $001f ld de, $1801 call window ld a, %00111001 ; fondo blanco tinta azul ld l, h ld de, $181f ENDIF call window IF recovery=0 ld (menuop), hl ENDIF call clrscr ; borro pantalla ld ix, cad7 call_prnstr ; menu superior call_prnstr ; borde superior IF vertical=0 ld iyl, $14 ELSE ld iyl, $1c ENDIF bios1 ld ix, cad8 call_prnstr ; | | | dec iyl jr nz, bios1 ld ix, cad9 call_prnstr ; borde inferior call_prnstr ; info IF vertical=0 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 ELSE ld hl, $411f ld c, 4 bios2 ld b, 6 bios25 ld (hl), %00000110 inc h djnz bios25 ld de, $fa20 add hl, de dec c jr nz, bios2 ld a, %01001010 ld ($587f), a ld a, %01001110 ld ($585f), a dec a ld ($581f), a dec a ld ($583f), a ENDIF bios3 ld a, $07 out ($fe), a call bios4 jr bios3 bios4 ld a, %00111001 ; fondo blanco tinta azul ld hl, $0102 IF vertical=0 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 ELSE ld de, $1614 call window ld a, %01001111 ; fondo azul tinta blanca dec h ld l, h ld de, $1801 call window di ld bc, $16 ld hl, $403e ld d, b ld e, b bios5 ld b, 8 bios6 ld sp, hl push de push de push de push de push de 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 ;;di borrado ei ld h, 0 ENDIF 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 defw %0100011100111001 ld hl, (menuop) ld l, 0 push bc ld de, $0401 ld a, %01111001 ; fondo blanco tinta azul ret IF recovery=0 IF vertical=0 launch ld (tmpbuf+21), a call clrscr ; borro pantalla inc hl inc de IF version=2 ld bc, $300 ld (hl), %01001111 ldir ld hl, $5ae0 ld de, $5ae1 ld c, 20 ld (hl), %00000111 ldir ld ix, cad62 call_prnstr ld c, 23 ld ix, cad118+8 call_prnstr ld c, 1 ELSE ld c, $20 ld (hl), %00000111 ldir ld bc, $2e0 ld (hl), %01001111 ldir ld ix, cad118 call_prnstr ld ix, cad62 call_prnstr ENDIF ld de, bnames laun1 ex de, hl push hl push bc ld de, tmpbuf IF version=2 ld bc, 14 ldir ld (de), a ELSE ld bc, 21 ldir ENDIF ld ix, tmpbuf pop bc call_prnstr pop hl ld de, $0020 add hl, de ex de, hl ld hl, $a3c0 sbc hl, de IF version=2 jr nz, laun2 ld bc, $0e00 laun2 ld hl, $a6a1 sbc hl, de jr nz, laun3 ld bc, $1c00 laun3 ld hl, $a981 ELSE jr nz, laun2 ld bc, $1501 laun2 ld hl, $a681 ENDIF sbc hl, de jr nz, laun1 ld ix, cad6 call_prnstr ld hl, (active+1) games call SELEC call waitky cp $0d jr z, gamen cp $20 gamen jp z, runbit0 ld bc, games push bc call SELEC ld a, (codcnt) sub $1c jr z, gamup dec a jr z, gamdw dec a jr z, gamlf dec a jr z, gamrh sub 'a'-$1f jr z, gamdw sub 'o'-'a' jr z, gamlf dec a jr z, gamrh dec a ret nz gamup dec l ret p gamdw inc l ld a, l IF version=2 cp 70 ret c dec l ret gamlf ld a, l ld l, 0 sub 23 ret c ld l, a ret gamrh ld a, l cp 47 jr c, gamrh1 ld a, 46 gamrh1 add a, 23 ld l, a ret SELEC push hl exx pop hl ld a, l cp 23 ld de, 0 ld b, 11 jr c, sel01 cp 46 jr nc, seli ld e, -23 add hl, de ld e, b dec b jr sel01 seli ld e, -46 add hl, de ld e, 21 sel01 add hl, hl add hl, hl add hl, hl ld h, $16 add hl, hl add hl, hl add hl, de sel02 ld a, (hl) xor %00110110 ld (hl), a inc l djnz sel02 exx ld a, l cp 46 ret nc exx sel03 sub 23 jr nc, sel03 add a, 23 ld c, a and %00011000 or %01000000 ld d, a ld a, c and %00000111 rrca rrca rrca add a, $0a ld e, a ld b, 8 sel04 ld a, (de) xor 7 ld (de), a inc d djnz sel04 sel05 exx ret ELSE cp 46 ret c dec l ret gamlf ld a, l ld l, 0 sub 23 ret c ld l, a ret gamrh ld a, l cp 23 jr c, gamrh1 ld a, 22 gamrh1 add a, 23 ld l, a ret SELEC push hl exx pop hl inc l ld a, l cp 24 ld de, 0 ld b, 16 jr c, sel01 ld e, -23 add hl, de ld e, b sel01 add hl, hl add hl, hl add hl, hl ld h, $16 add hl, hl add hl, hl add hl, de sel02 ld a, (hl) xor %00110110 ld (hl), a inc l djnz sel02 exx ld a, l exx sel03 sub 23 jr nc, sel03 add a, 24 ld c, a and %00011000 or %01000000 ld d, a ld a, c and %00000111 rrca rrca rrca add a, $0f ld e, a ld b, 8 sel04 ld a, (de) xor 3 ld (de), a inc d djnz sel04 exx ret ENDIF ELSE launch ld (tmpbuf), a ld hl, finbez-1 ld d, $7a call dzx7b ; descomprimir call drcs ld hl, bnames-1 ld bc, $20 ld a, c laun0 add hl, bc inc e cp (hl) jr z, laun0 inc a ld (tmpbuf), a inc e ld a, e ld l, a cp 24 jr c, laun1 ld a, 24 laun1 ld h, a ld (items), hl ld hl, $0104 ; coordenada X push hl ld iy, (items) ld hl, cad62 ld (cmbpnt), hl ld iy, indexe ld ix, cmbpnt ld de, tmpbuf ld b, e ld hl, bnames call addbl1 laun2 ld c, $20 add hl, bc call addbls jr nc, laun2 ld (ix+0), cad6&$ff ld (ix+1), cad6>>8 ld (ix+3), a ld a, (items+1) ld e, a ld d, 24 call chcol defw $1203 defw %0111100001000111 jp bls375 ENDIF ;++++++++++++++++++++++++++++++++++ ;++++++++ Start ROM ++++++++ ;++++++++++++++++++++++++++++++++++ conti di xor a ld hl, (active) cp h jr z, ccon0 runbit ld b, h call calbit IF version=2 OR version=3 push hl 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, $c5 ; envío wrear out (c), a wreg flash_cs, 1 ; desactivamos spi, enviando un 1 dec b pop hl ELSE ld bc, zxuno_port ENDIF ld e, core_addr out (c), e inc b IF version=4 ld a, (alto highb+1) out (c), a out (c), h ELSE out (c), h out (c), l ENDIF out (c), 0 wreg core_boot, 1 ccon0 ld h, active>>8 ld l, (hl) call calcu push hl pop ix ld d, (ix+2) ld hl, timing ld a, (outvid) rrca ld a, 3 ld b, a jr c, ccon1 cp (hl) ; timing ld b, (hl) jr nz, ccon1 ld b, d ccon1 and b ; 0 0 0 0 0 0 MODE1 MODE0 rrca ; MODE0 0 0 0 0 0 0 MODE1 inc l srl (hl) ; conten jr z, ccon2 bit 4, d jr z, ccon2 ccf ccon2 adc a, a ; 0 0 0 0 0 0 MODE1 /DISCONT ld l, keyiss & $ff rr b adc a, a ; 0 0 0 0 0 MODE1 /DISCONT MODE0 srl (hl) ; keyiss jr z, ccon3 bit 5, d jr z, ccon3 ccf ccon3 adc a, a ; 0 0 0 0 MODE1 /DISCONT MODE0 /I2KB ld l, nmidiv & $ff srl (hl) ; nmidiv jr z, conti1 bit 2, d jr z, conti1 ccf conti1 adc a, a ; 0 0 0 MODE1 /DISCONT MODE0 /I2KB /DISNMI dec l srl (hl) ; divmap jr z, conti2 bit 3, d jr z, conti2 ccf conti2 adc a, a ; 0 0 MODE1 /DISCONT MODE0 /I2KB /DISNMI DIVEN add a, a ; 0 MODE1 /DISCONT MODE0 /I2KB /DISNMI DIVEN 0 xor d and %01111111 xor d xor %10101100 ; LOCK MODE1 DISCONT MODE0 I2KB DISNMI DIVEN 0 ld (alto conti9+1), a jp alto micont ;**** Main Menu **** ;********************* main IF vertical=0 inc d ld h, l call help ELSE ld h, l call window ENDIF ld ix, cad10 ld bc, $0202 call prnmul ; Harward tests ... ld iy, quietb ld bc, $0f0b call showop defw cad28 defw cad110 defw cad111 defw cad112 defw cad113 defw $ffff call showop defw cad28 defw cad29 defw $ffff 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, grapmo&$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 $12 defb $ff defw cad14 defw cad15 defw cad72 defw cad16 defw cad17 defw cad56 defw cad20 defw cad70 defw cad71 defw cad18 defw cad19 defw cad116 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 inc a jp z, advana call popupw ; quiet or crc (enabled or disabled) defw cad28 defw cad110 defw cad111 defw cad112 defw cad113 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, cad114 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 IF vertical=0 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 ld l, $6b 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 ELSE ld de, $57cb ld a, '1'<<1 tkeys1 ld l, a ld h, $2c add hl, hl add hl, hl ld b, 6 tkeys2 ld a, (hl) ld (de), a inc l dec d djnz tkeys2 ld hl, $05c0 add hl, de ld a, l or %00111111 inc a jr nz, tkeys3 ld a, h sub $07 ld h, a tkeys3 ex de, hl ld a, (ix) inc ix add a, a jr nc, tkeys1 ld hl, $1082 add hl, de ex de, hl jr nz, tkeys1 tkeys4 add a, $fe ld hl, $5993 tkeys5 ld de, $013e add hl, de push af in a, ($fe) ld b, 5 tkeys6 ld (hl), 7 rrca jr c, tkeys7 ld (hl), $4e tkeys7 ld de, $ffc0 add hl, de djnz tkeys6 pop af rlca cp $ef jr nz, tkeys5 ld hl, $5a09 tkeys8 ld de, $fe82 add hl, de push af in a, ($fe) ld b, 5 tkeys9 ld (hl), 7 rrca jr c, tkeys10 ld (hl), $4e tkeys10 ld de, $0040 add hl, de djnz tkeys9 add hl, de pop af rlca jr c, tkeys8 ld a, ($5ad1) ld e, a ld a, ($5891) add a, e ret m ld hl, $5b13 in a, ($1f) cpl ld b, 5 call tkeys11 xor a jr tkeys4 tkeys11 ld de, $ffc0 add hl, de rrca tkeys12 ld (hl), 7 jr c, tkeys13 ld (hl), $4e tkeys13 djnz tkeys11 ret ENDIF tape call bomain ld c, $14 ld ix, cad51 call_prnstr ; Press any key to continue IF vertical=0 ld hl, $4881 ELSE ld hl, $4882 ENDIF 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 IF vertical=0 ld ($5968), hl ld hl, %0000100001001000 ld ($596a), hl ELSE ld ($5969), hl ld hl, %0000100001001000 ld ($596b), hl ENDIF 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 IF vertical=0 add a, $81 rl l ld de, $5991 ld hl, $5992 ELSE add a, $82 rl l ld de, $5992 ld hl, $5993 ENDIF 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 IF vertical=0 ld h, 5 ELSE ld h, 4 ENDIF 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 IF vertical=0 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 ENDIF 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 call deixl 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 IF vertical=0 cp $12 jr c, roms6 ld a, $12 ELSE cp $1a jr c, roms6 ld a, $1a ENDIF 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 'n'-$1f ; n= New Entry jp nz, roms144 call qloadt 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 loadta ei jp nc, roms12 call atoi ld b, (ix-$3f) romsb6 ld e, 0 isbusy ld h, indexe>>8 ld l, e inc e ld l, (hl) inc l jr z, romsb7 dec l call calcu inc l ld c, (hl) dec l isbus1 cp (hl) jr z, isbus2 dec a dec c jr nz, isbus1 inc l add a, (hl) jr isbusy isbus2 IF vertical=0 ld bc, $090a ELSE ld bc, $0510 ENDIF ld ix, cad115 call_prnstr call_prnstr call_prnstr jp waitky romsb7 inc a djnz romsb6 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 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 ENDIF roms12 call romcyb ld ix, cad50 roms13 call_prnstr call romcyb toanyk ei ld ix, cad51 call_prnstr jp waitky IF recovery=0 roms144 sub 'q'-'n' ; 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 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 IF vertical=0 ld hl, $0309 ld de, $1b07 ELSE ld hl, $020d ld de, $1507 ENDIF ld a, e ;%00000111 fondo negro tinta blanca call window dec h dec l ld a, %01001111 ; fondo azul tinta blanca call window IF vertical=0 sub l ; fondo negro tinta blanca ld iyl, 2 ld hl, $030c ld de, $1801 call window ld bc, $0208 ELSE ld a, %01000111 ; fondo negro tinta blanca ld iyl, 2 ld hl, $0310 ld de, $1201 call window ld bc, $010c ENDIF call_prnstr call_prnstr call_prnstr roms20 push ix call_prnstr pop ix dec iyl jr nz, roms20 call_prnstr call_prnstr IF vertical=0 ld bc, $040c ld hl, $1fff call inputs ld hl, $1708 ld de, $0708 ld a, %00111001 ; fondo blanco tinta azul call window ELSE xor a ld (empstr+23), a ld bc, $0410 ld hl, $17ff call inputs ld b, 0 ENDIF 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 ENDIF ;*** Upgrade Menu *** ;********************* upgra IF recovery=1 ld ix, cad117 ex af, af' call prnhel upgra0 in a, ($1f) jr nz, upgra0 ld de, $0401 ld a, %01111001 ; fondo blanco tinta azul ld l, 0 ENDIF ld bc, (menuop) IF vertical=0 ld h, 16 dec c dec c jr nz, upgra1 ld h, 9 ld d, 7 upgra1 push af call help pop af ELSE ld h, 12 ld d, 3 dec c dec c jr nz, upgra1 ld h, 8 ld d, 4 upgra1 push af call window pop af ENDIF ld de, tmpbuf ld ix, cmbpnt ld hl, cad60 jr z, upgr17 ld l, cad62 & $ff ld a, (bitstr) or a jr nz, upgr17 call deixl ld a, $1b defb $ca upgr15 ld a, (hl) inc hl upgr16 ld (de), a inc de or a jr nz, upgr15 upgr17 call deixl ld a, cad63 & $ff sub l ld a, ' ' jr nz, upgr16 ld hl, bnames ld iyl, 1 upgra3 inc iyl ld a, (menuop) dec a dec a jr z, upgr31 ld a, (bitstr) inc a cp iyl ld a, $1b jr z, upgr32 upgr31 ld a, ' ' upgr32 ld (de), a ld a, iyl inc de ld bc, 23 ldir ex de, hl ld (hl), b dec hl upgr33 inc c sub 10 jr nc, upgr33 add a, 10+$30 ld (hl), a dec hl dec c ld a, ' ' jr z, upgr34 ld a, c add a, $30 upgr34 ld (hl), a dec hl ld (hl), ' ' ld c, 4 add hl, bc ex de, hl ld c, 8 add hl, bc ld a, (hl) inc hl call deixl or a jr nz, upgra3 ld hl, (menuop) dec l dec l IF recovery=0 ld a, (alto fllen+1) or l ld a, ixl rra jr nz, upgr35 IF version<3 IF version=1 cp 45+5 ELSE cp 68+5 ENDIF ELSE IF version=3 cp 55+5 ELSE cp 27+5 ENDIF ENDIF jr z, upgr35 inc a ld (ix-4), cad119 & $ff ld (ix-3), cad119 >> 8 call deixl1 upgr35 ld (ix-3), $ff dec a dec a IF vertical=0 cp 20 jr c, upgr38 ld a, 20 ELSE cp $1c jr c, upgr38 ld a, $1c ENDIF upgr38 ld e, a ELSE ld (ix-3), $ff ld e, 4 ENDIF dec l ld a, h jr nz, upgra4 ld a, (bitstr) upgra4 ld hl, $0102 ld d, $18 IF recodire=0 call combol ELSE ld a, 2 ENDIF ld (menuop+1), a inc a ld iyl, a IF recovery=0 ld a, (codcnt) cp $0d jp nz, main9 ENDIF 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 IF vertical=0 call prnhel ENDIF call imyesn ld ix, cad445 IF recodire=0 call yesno ret nz ELSE ld c, 8 call_prnstr call_prnstr ENDIF 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 call mmcinit jp nz, errsd ld hl, 0 ld ix, tmpbu2 call readat0 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 dec b push af call p, calbit pop af ld (tmpbu2+$1e), hl ld b, a ld hl, alto 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 sub 3 ld hl, fileco+5 tosd45 inc b sub 10 jr nc, tosd45 add a, 10+$30 ld (hl), a djnz tosd46 cp '1' jr nz, tosd46 IF version=4 ld a, (ix+$1d) add a, 5 ld (ix+$1d), a ELSE dec (ix+$1c) ENDIF jr tosd5 tosd46 dec l ld a, b add a, $30 ld (hl), a tosd5 ld bc, 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 IF vertical=0 ld bc, $090d ELSE ld bc, $0510 ENDIF call_prnstr ld a, cad80 & $ff cp ixl ei twaitk jp nz, waitky ld a, (menuop+1) sub 4 jr c, twaitk call cbname ld bc, $0020 add hl, bc ld de, empstr call str2tmp ld ix, cad82 IF vertical=0 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, $1fff call inputs ld a, (items) add a, empstr&$ff ld l, a ld h, empstr>>8 ld bc, $20 ld (hl), c ELSE ld bc, $050d call_prnstr ld a, %00000111 ; fondo negro tinta blanca ld hl, $030e ld de, $1201 call window ld bc, $040e ld hl, $1aff xor a ld (empstr+$1a), a call inputs ld a, (items) add a, empstr&$ff ld l, a ld h, empstr>>8 ld bc, $1a ld (hl), $20 ENDIF 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 'N' jr z, sab2 IF version=3 IF clones=0 sub 'D'-'N' ELSE IF clones=1 sub 'B'-'N' ELSE sub 'T'-'N' ENDIF ENDIF ELSE IF version<3 sub $30+version-'N' ELSE sub $2f+version-'N' ENDIF ENDIF jr nz, erfnf sab2 call testl jr nz, erfnf ; wrong length ld l, (ix+$1a) ; first cluster of the file ld h, (ix+$1b) ld ix, $e000 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 IF version=2 OR version=3 xor a ld (alto highb+1), a ENDIF IF recovery=0 call alto loadch ENDIF IF vertical=0 ld bc, $090a ELSE ld bc, $050d ENDIF ld ix, cad785 call_prnstr 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 'N' jr z, sab3 IF version=3 IF clones=0 sub 'D'-'N' ELSE IF clones=1 sub 'B'-'N' ELSE sub 'T'-'N' ENDIF ENDIF ELSE IF version<3 sub $30+version-'N' ELSE sub $2f+version-'N' ENDIF ENDIF jr nz, erfnf2 sab3 call testl jr nz, erfnf2 ld b, (ix+$14) ld l, (ix+$1a) ld h, (ix+$1b) ld ix, $e000 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 a, e or d jr nz, test1 dec (ix+$1f) jr nz, test2 test1 ld hl, (tmpbu2+$1c) sbc hl, de jr nz, test2 cp $3f jr nz, nzxco inc a ld (tmpbu2+$1c), a nzxco xor a test2 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 cp 'C' push hl jr nz, noco ld de, 6 add hl, de ld (hl), ' ' inc hl ld (hl), ' ' pop hl push hl noco ld de, (tmpbu2+$1a) buub ld a, (de) cp (hl) inc hl inc de jr nz, beeb djnz buub pop ix sali pop bc jr desc beeb 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 trans push bc ld a, (tmpbu2+$d) ld b, a ld a, (tmpbu2+$1d) or a jr nz, otva ld a, (tmpbu2+$1c) rrc a jr z, otva cp b jr nc, otva ld b, a otva call readata inc ixh inc ixh jr nz, putc0 push bc push hl push de ld hl, (tmpbu2+$1c) ld de, $ffe0 add hl, de ld (tmpbu2+$1c), hl ld hl, tmpbuf+$59 ld a, (tmpbu2+$1f) otv2 call alto subnn inc hl jr nc, otv2 ld (hl), 'o' ld iyl, 1 call prsta1 ld de, (tmpbu2+$1e) ; SPI address, initially 0000 exx ld a, $20 ld hl, $e000 exx call wrflsh inc de ld (tmpbu2+$1e), de exx ld ix, $e000 pop de pop hl pop bc putc0 inc hl djnz otva pop bc ret include sd.asm upgra7 ld hl, items IF vertical=0 ld (hl), b ELSE ld (hl), 0 ENDIF 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 defw %0100011100111001 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, $e000 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+2) 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+2) cp $cb upgrad jr nz, upgraa upgrae call calbit push hl call prstat 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 IF recovery=0 ;*** Advanced Menu *** ;********************* advan IF vertical=0 ld h, 20 ld d, 8 call help ELSE ld h, 15 ld d, 5 call window ENDIF ld ix, cad83 ld bc, $0202 call prnmul ld bc, $0f04 ld iy, layout call showop ; Keyb Layout defw cad875 defw cad88 defw cad89 defw cad90 defw $ffff advan1 call showop ; Joy Keypad & DB9 defw cad91 defw cad92 defw cad93 defw cad94 defw cad95 defw cad955 defw $ffff ld a, iyl rrca jr nc, advan1 IF version=1 call showop ; Splitter defw cad28 defw cad29 defw $ffff ENDIF ld c, $0b call showop ; Output defw cad96 defw cad97 defw cad98 defw $ffff call showop ; Scanlines defw cad28 defw cad29 defw $ffff call showop ; VSync frequency defw cad102 defw cad103 defw cad104 defw cad105 defw cad106 defw cad107 defw cad108 defw cad109 defw $ffff call showop ; CPU Speed defw cad110 defw cad111 defw cad112 defw cad113 defw $ffff call showop ; CSync defw cad90 defw cad96 defw $ffff call showop ; Color Burst defw cad10c defw cad10d defw $ffff ld de, $1201 call listas defb $04 defb $05 defb $06 IF version=1 defb $07 ENDIF defb $0b defb $0c defb $0d defb $0e defb $0f defb $10 defb $ff defw cad84 defw cad85 defw cad86 IF version=1 defw cad865 ENDIF defw cad87 defw cad99 defw cad100 defw cad101 defw cad10a defw cad10b jp c, main9 ld (menuop+1), a ld hl, layout ld e, a add hl, de jr nz, advan2 call popupw ; Keyb Layout defw cad875 defw cad88 defw cad89 defw cad90 defw $ffff ret advan2 ld b, a djnz advan3 adva25 call popupw ; Joy Keypad & DB9 defw cad91 defw cad92 defw cad93 defw cad94 defw cad95 defw cad955 defw $ffff ret advan3 djnz advan4 jr adva25 advan4 IF version=1 djnz adva45 call popupw ; Splitter defw cad28 defw cad29 defw $ffff ret ENDIF adva45 djnz advan5 call popupw ; Output defw cad96 defw cad97 defw cad98 defw $ffff ret advan5 djnz advan6 advana call popupw ; Scanlines defw cad28 defw cad29 defw $ffff ret advan6 djnz advan7 call popupw ; VSync frequency defw cad102 defw cad103 defw cad104 defw cad105 defw cad106 defw cad107 defw cad108 defw cad109 defw $ffff ret advan7 djnz advan8 call popupw ; CPU Speed defw cad110 defw cad111 defw cad112 defw cad113 defw $ffff ret advan8 djnz advan9 call popupw ; CSync defw cad90 defw cad96 defw $ffff ret advan9 call popupw ; Color Burst defw cad10c defw cad10d defw $ffff ret ;**** Exit Menu **** ;********************* exit IF vertical=0 ld h, 28 call help ELSE ld h, 20 call window ENDIF 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 alto loadch jr exit7 exit4 djnz exit5 jp savech exit5 djnz exit6 jp alto loadch exit6 call savech exit7 jp star17 ;++++++++++++++++++++++++++++++++++ ;++++++++ 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 IF vertical=0 cp 13 jr c, blst1 ld a, 13 blst1 ld h, a ld (items), hl add a, -16 ELSE cp 21 jr c, blst1 ld a, 21 blst1 ld h, a ld (items), hl add a, -24 ENDIF cpl rra ld l, a ld a, h add a, 7 ld e, a ld a, %01001111 ; fondo azul tinta blanca ld h, $01 ; coordenada X IF vertical=0 ld d, $1c ; anchura de ventana ELSE ld d, $16 ; anchura de ventana ENDIF 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 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 IF vertical=0 ld d, 32 call chcol defw $1a02 defw %0100011101001111 ELSE ld d, 25 call chcol defw $1402 defw %0100011101001111 ENDIF bls375 ld a, (cmbpnt+1) rlca 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) sub $0d ld (bitstr), a 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) rlca ld a, b ld (active), a jr nc, blst5 ld (bitstr), a blst5 jp star17 ENDIF 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 IF version=1 inc b ld a, 9 cp b ld hl, $0040 jr nc, calbi1 ld hl, $0b80 calbi1 ld de, $0540 calbi2 add hl, de djnz calbi2 ret ELSE IF version=4 xor a cp b inc b ld hl, $0180 jr nz, calbi1 ld hl, $ff00 calbi1 ld de, $0900 calbi2 add hl, de djnz calbi2 add hl, hl adc a, a ld (alto highb+1), a ret ELSE inc b ld a, b IF version=2 cp 35 jr z, calbi1 jr c, calbi2 calbi1 sub 34 calbi2 ld b, a sbc a, a inc a ld hl, $0240 ld de, $0740 ELSE cp 21 jr z, calbi1 jr c, calbi2 calbi1 sub 19 calbi2 ld b, a sbc a, a inc a ld hl, $fec0 ld de, $0c40 ENDIF calbi4 add hl, de djnz calbi4 ld (alto highb+1), a ret ENDIF ENDIF deixl ld (ix+0), e ld (ix+1), d deixl1 inc ixl inc ixl ret IF recovery=0 ; ---------------------------- ; Add an entry to the bootlist ; ---------------------------- addbls ld (ix+0), e ld (ix+1), d push hl IF vertical=0 call str2tmp ELSE push de call str2tmp pop hl ld a, l add a, 25 ld l, a jr nc, addbl0 inc h addbl0 ld (hl), 0 ENDIF pop hl addbl1 inc iyl call deixl1 ld a, (items) sub 2 sub iyl ret ENDIF ;first part of loadta qloadt IF vertical=0 ld ix, cad49 call prnhel call bloq1 dec c dec c ELSE call bloq1 ld bc, $040c ENDIF ld iyl, 5 loadt1 ld ix, cad42 call_prnstr dec iyl jr nz, loadt1 IF vertical=0 ld ixl, cad43 & $ff call_prnstr ld ixl, cad44 & $ff ld c, b ELSE ld ix, cad43 call_prnstr ld ixl, cad44 & $ff ld c, $0b ENDIF call_prnstr ; ------------------------------------- ; Prits a blank line in the actual line ; ------------------------------------- romcyb ld a, iyl romcy1 sub 5 jr nc, romcy1 IF vertical=0 add a, 5+9 ld c, a inc iyl ld b, 8 ELSE add a, 5+12 ld c, a inc iyl ld b, 4 ENDIF ld ix, cad42 call_prnstr inc b dec c ret ; ------------------------------------- ; Generates a determined box with shadow ; ------------------------------------- IF vertical=0 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 ELSE bloq1 ld hl, $040c 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, $040e ENDIF 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 call qloadt 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 IF vertical=0 ld bc, $0808 call_prnstr call_prnstr call_prnstr yesno0 inc a yesno1 ld ixl, a yesno2 ld hl, $0b0d ELSE ld bc, $040b call_prnstr call_prnstr call_prnstr yesno0 inc a yesno1 ld ixl, a yesno2 ld hl, $0810 ENDIF 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 IF vertical=0 ld h, $11 ELSE ld h, $0e ENDIF 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 IF vertical=0 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 ELSE cursor ld a, (offsel) add a, b ld e, a add a, e add a, e add a, a cpl add a, 192 ld e, a rrca rrca rrca and %00011000 xor e and %11111000 xor e or %01000000 ld d, a ld a, e rlca rlca and %11100000 add a, c ld e, a curso3 ld a, (de) cpl ld (de), a ret ENDIF 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 sub e jr nc, combo3 sbc a, a combo3 inc a combo4 ld (offsel), a ld iy, (items) ld iyl, iyh ld bc, (cmbcor) ld a, iyl or a jr z, combo7 combo5 ld ix, empstr call_prnstr dec iyl jr nz, combo5 ld a, (offsel) ld bc, (cmbcor) add a, a ld h, cmbpnt>>8 ld l, a combo6 ld a, (hl) ld ixl, a inc l ld a, (hl) inc l ld ixh, a push hl call_prnstr pop hl dec iyh jr nz, combo6 combo7 ld de, (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, (colcmb-1) 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 IF vertical=0 ld a, (hl) ld ixh, a dec hl ld a, (hl) ld ixl, a call prnhel ELSE call waitky ld a, (codcnt) cp $0d jr z, listaa jr lista55 ENDIF 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 lista55 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) ; ------------------------------------- IF vertical=0 window push hl push de ld c, h add hl, hl add hl, hl add hl, hl ld h, $16 add hl, hl add hl, hl ld b, 0 add hl, bc windo1 ld b, d windo2 ld (hl), a inc hl djnz windo2 ld c, d sbc hl, bc ld c, $20 add hl, bc dec e jr nz, windo1 pop de pop hl ret ELSE window push hl push de ld c, l;h push af ld a, 23 sub h ld l, a pop af add hl, hl add hl, hl add hl, hl ld h, $16 add hl, hl add hl, hl ld b, 0 add hl, bc ld c, e add hl, bc windo1 ld b, e;d windo2 dec hl ld (hl), a djnz windo2 ld c, e add hl, bc ld bc, $ffe0 add hl, bc dec d;e jr nz, windo1 pop de pop hl ret ENDIF ; ------------------------------------- ; 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 ld a, (hl) inc hl ld (colcmb-1), 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, alto prnstr 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 IF vertical=0 add a, -24 cpl rra ld l, a ld h, $16 ELSE add a, -32 cpl rra ld l, a ld h, $13 ENDIF 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 IF vertical=0 ld h, $0a ELSE ld h, $07 ENDIF ld de, $0d01 ld a, %00000111 ; fondo negro tinta blanca call window pop hl ld e, h dec l IF vertical=0 ld h, $09 ELSE ld h, $06 ENDIF push de push hl ld a, %01001111 ; fondo azul tinta blanca call window ld ix, cad21 IF vertical=0 ld b, $0c ELSE ld b, $08 ENDIF ld c, l call_prnstr popup2 ld ix, cad22 call_prnstr dec iyl jr nz, popup2 call_prnstr call chcol IF vertical=0 defw $0b0a ELSE defw $0b07 ENDIF defw %0100011101001111 pop hl pop de inc l ld a, h IF vertical=0 add a, 5 ELSE add a, 4 ENDIF 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 IF recovery=0 bomain ld ix, cad65 ld bc, $0209 call_prnstr ; Performing... inc c ld iyh, 8 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 ENDIF savena IF version=2 OR version=3 ld b, 1 call calbit ENDIF ld a, (menuop+1) sub 4 ret c call cbname ex de, hl 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 IF version>1 AND zesarux wreg flash_spi, $21 ; envío sector erase ld hl, (alto highb) out (c), h ELSE wreg flash_spi, $20 ; envío sector erase ENDIF 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 IF version>1 AND zesarux wreg flash_spi, $12 ; envío page program ld hl, (alto highb) out (c), h ELSE wreg flash_spi, 2 ; envío page program ENDIF 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 cbname ld h, bnames>>13 ld l, a add hl, hl add hl, hl add hl, hl add hl, hl add hl, hl inc h ret ; ----------------------------------------------------------------------------- ; 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 drcs inc hl ld b, $40 ; filtro RCS inverso start4 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 IF vertical=0 bit 3, b jr z, start4 ELSE ld a, b sub $58 jr nz, start4 dec a ENDIF ld b, $13 ldir ret ; Parameters: ;(empstr): input string ; Returns: ; A: binary number IF recovery=0 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 ENDIF 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 pop iy pop ix pop hl pop de pop bc pop af ret ;binf jr binf ENDIF IF recovery=0 incbin es.zx7b fines incbin us.zx7b finus incbin av.zx7b finav ; ----------------------------------------------------------------------------- ; Compressed and RCS filtered logo ; ----------------------------------------------------------------------------- IF vertical=0 IF version=1 incbin logo256x192.rcs.zx7b ELSE IF version=2 incbin logo256x192d.rcs.zx7b ELSE IF clones=0 incbin logo256x192dp.rcs.zx7b ELSE IF clones=1 incbin logo256x192bn.rcs.zx7b ELSE incbin logo256x192ut.rcs.zx7b ENDIF ENDIF ENDIF ENDIF finlog incbin strings.bin.zx7b ELSE incbin bezel.rcs.zx7b finbez IF version=1 incbin logo192x256.rcs.zx7b ELSE IF version=2 incbin logo192x256d.rcs.zx7b ELSE incbin logo192x256dp.rcs.zx7b ENDIF ENDIF finlog incbin strings.bin.zx7b ENDIF ENDIF ; ----------------------------------------------------------------------------- ; Compressed messages ; ----------------------------------------------------------------------------- sdtab defw $0020, $0040 defw $0040, $0080 fllen defw $0000, $0000 IF version=1 defw $0540 subnn sub 6 ELSE IF version=4 defw $1200 ELSE IF version=2 defw $0740 ELSE defw $0c40 ENDIF ENDIF subnn sub 6*4 ENDIF ret IF recovery=0 micont 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 conti4 ld iyl, 8 conti5 ld a, (ix) inc (ix) call alto slot2a ld a, master_mapper dec b out (c), a inc b ld a, iyl inc iyl 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, (ix+1) add a, a add a, ixl ld ixl, a ld l, (ix+6) ld h, (ix+7) 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 call alto prnstr ld c, $fe conti6 in a, (c) or $e0 inc a jr z, conti6 conti7 pop bc pop ix conti8 dec (ix+1) jr nz, conti5 conti9 ld a, 0 contia and %11111111 dec b out (c), 0;d inc b out (c), a dec b ld a, dev_control out (c), a inc b ld a, (ix+3) out (c), a dec b ld a, dev_control2 out (c), a inc b ld a, (grapmo) srl a jr c, contib ld a, 7 ; Resv Resv Resv Resv Resv DIRADAS DITIMEX DIULAPLUS jr z, contib ld a, (ix+4) contib or %00000000 out (c), a rst 0 ENDIF ; ------------------------------------- ; Detect memory size ; E: 00000000-> 512K ; 00000001-> 1M ; 00000011-> 2M ; ------------------------------------- tstmem ld de, newreg<<8 | %00000000 wreg master_conf, 1 wreg master_mapper, $48 ld a, ($c000) sub $31 jr z, tstme1 scf tstme1 rl e wreg master_mapper, $28 ld a, ($c000) sub $31 jr z, tstme2 scf tstme2 rl e wreg master_conf, 0 dec b out (c), d inc b out (c), e or e ret ; ------------------------------------- ; 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 easter di ld a, (scnbak) and %00111111 call setvid wreg master_conf, 1 jp $0100 IF recovery=0 ; ------------------------ ; Load flash structures from $06000 to $9000 ; ------------------------ loadch wreg flash_cs, 1 ld de, config ld hl, $0060 ;old $0aa0 ld a, $1a ENDIF ; ------------------------ ; 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' push hl wreg flash_cs, 0 ; activamos spi, enviando un 0 IF version>1 wreg flash_spi, $13-$10*zesarux ; envio flash_spi un 3, orden de lectura highb ld a, 0 IF zesarux=0 out (c), a ENDIF ELSE wreg flash_spi, 3 ; envio flash_spi un 3, orden de lectura ENDIF pop hl push hl xor a 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 ; ------------------------ IF recovery=0 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 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 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 ENDIF ; --------- ; CRC check ; --------- check ld hl, $c000 check0 ld a, $ff ld d, a check1 xor (hl) ;6*4+4*7+10= 62 ciclos/byte ld e, a ex de, hl ld a, h ld h, alto crctab>>8 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 IF recovery=0 slot2a ld de, 3 IF version=1 and $3f ld h, d ld l, a cp 19 jr c, slot2b ld e, $c0 ELSE sloti ld l, a IF version=4 sub 61 ;-44, -1 -> 0, 43 jr nc, sloti ld h, d ELSE IF version=2 sub 44 ;-44, -1 -> 0, 43 jr nc, sloti ld h, d sub -9 jr c, slot2b ld hl, $0400 ld e, a ELSE and $3f ld h, d cp 41 jr c, slot2b sub 41 ld l, a ld e, d ENDIF ENDIF ENDIF slot2b IF version=2 OR version=3 sbc a, a inc a ld (alto highb+1), a ENDIF 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 ENDIF 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 ; ----------------------------------------------------------------------------- ; Print string routine ; Parameters: ; BC: X coord (B) and Y coord (C) ; IX: null terminated string ; ----------------------------------------------------------------------------- IF vertical=0 prnstr push bc call alto prnstr1 pop bc inc c ret prnstr1 ld a, b and %11111100 ld d, a xor b ld b, a ld e, a jr z, prnch1 dec e prnch1 ld a, d rrca ld d, a rrca add a, d add a, e ld e, a ld a, c and %00011000 or %01000000 ld d, a ld a, c and %00000111 rrca rrca rrca add a, e ld e, a rr b jr c, pos26 jr nz, pos4 pos0 ld a, (ix) inc ix add a, a ret z ld h, $b0 >> 2 ld b, 8 ld l, a add hl, hl add hl, hl pos01 ld a, (hl) ld (de), a inc d inc l djnz pos01 ld hl, $f800 add hl, de ex de, hl pos2 ld a, (ix) inc ix add a, a ret z ld h, $bc >> 2 ld bc, $04fc call alto doble pos4 ld a, (ix) inc ix add a, a ret z ld h, $b8 >> 2 ld bc, $04f0 call alto doble pos6 ld a, (ix) inc ix add a, a ret z ld h, $b4 >> 2 ld b, 8 ld l, a add hl, hl add hl, hl pos61 ld a, (de) xor (hl) ld (de), a inc d inc l djnz pos61 ld hl, $f801 add hl, de ex de, hl jr pos0 pos26 rr b jr c, pos6 jr pos2 doble ld l, a add hl, hl add hl, hl doble2 ld a, (de) xor (hl) and c xor (hl) ld (de), a inc e ld a, (hl) and c ld (de), a inc d inc l ld a, (hl) and c ld (de), a dec e ld a, (de) xor (hl) and c xor (hl) ld (de), a inc d inc l djnz doble2 ld hl, $f801 add hl, de ex de, hl ret ELSE prnstr push bc call alto prnstr1 pop bc inc c ret prnstr1 ld a, b add a, b add a, b add a, a cpl add a, 192 ld e, a rrca rrca rrca and %00011000 xor e and %11111000 xor e or %01000000 ld d, a ld a, e rlca rlca and %11100000 add a, c ld e, a prnstr2 ld a, (ix) inc ix add a, a ret z ld h, $b0 >> 2 ld b, 6 ld l, a add hl, hl add hl, hl prnstr3 ld a, (hl) ld (de), a ld a, d and $07 jr nz, prnstr4 ld a, e sub $20 ld e, a jr c, prnstr4 ld a, d add a, $08 ld d, a prnstr4 dec d inc l djnz prnstr3 jr prnstr2 ENDIF ; ---------- ; CRC Table ; ---------- crctab incbin crctable.bin defs $80 ; ----------------------------------------------------------------------------- ; 6x8 character set (128 characters x 1 rotation) ; ----------------------------------------------------------------------------- IF vertical=0 IF chloe=1 incbin chloe6x8.bin ELSE incbin fuente6x8.bin ENDIF ELSE incbin fuente8x6.bin ENDIF chrend IF recovery=1 include strings.asm ENDIF 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 $3ee6-$ ; 25 bytes lbytes ld a, (scnbak) and %00111111 call setvid call lbytes2 ld a, (scnbak) setvid ld l, scandbl_ctrl ld bc, zxuno_port out (c), l inc b out (c), a ret l3eff in l, (c) jp (hl) lbytes2 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 $21 ; 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 +++++++++++++ ;++++++++++++ +++++++++++++ ;++++++++++++++++++++++++++++++++++++++++ ;++++++++++++++++++++++++++++++++++++++++ IF recovery=0 block $7e00-$ include strings.asm ENDIF ; todo ; * generar tablas CRC por código ; * descomprimir en lugar de copiar codigo alto