zxuno-git/firmware/firmware.asm

5594 lines
142 KiB
NASM

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 <Edit> 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 <Edit> to Setup
call_prnstr ; Press <Edit> 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=1 OR version=3
cp 45
ELSE
IF version=2
cp 69
ELSE
cp 56
ENDIF
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=1
cp 45+5
ELSE
IF version=2
cp 69+5
ELSE
cp 56+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
push af
call p, calbi1
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
dec (ix+$1c)
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
call alto loadch
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 inc b
IF version=1
calbi1 ld a, 9
cp b
ld hl, $0040
jr nc, calbi2
ld hl, $0b80
calbi2 ld de, $0540
calbi3 add hl, de
djnz calbi3
ret
ELSE
IF version=4
calbi1 ld hl, $ff00
calbi2 ld de, $0900
calbi3 add hl, de
djnz calbi3
xor a
add hl, hl
adc a, a
ld (alto highb+1), a
ret
ELSE
calbi1 ld a, b
IF version=2
cp 35
jr z, calbi2
jr c, calbi3
calbi2 sub 34
calbi3 ld b, a
sbc a, a
inc a
ld hl, $0240
ld de, $0740
ELSE
cp 21
jr z, calbi2
jr c, calbi3
calbi2 sub 19
calbi3 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