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