ZX-SP-ROMs/TRDOS/boot/boot.asm
2025-06-16 04:41:18 +10:00

713 lines
11 KiB
NASM
Executable File

; device zxspectrum48
INCLUDE 'inc/rom_routines.inc'
INCLUDE 'Shared_Includes/constants/ZX_VARS.inc'
INCLUDE 'Shared_Includes/constants/zx_char_codes.inc'
;=======================================================================
collor_A EQU 0x03
collor_B EQU 0x02
collor_N EQU 0x04
collor_M EQU 0x08
collor_T EQU 0x07
org_addr EQU #5d3b
ORG org_addr
bstart: DW #100 ; line number = 1
DW l1end-l1begin ; line length
l1begin: DB ZX_Token.randomize,ZX_Token.usr,#30 ; 'rand' 'usr' 0
DB #0e,#00,#00 : DW start : DB #00,#0d ; start address
l1end: DW #200 ; line number = 2
DW l2end-l2begin ; line length
l2begin: DB #f9,#c0,#30 ; ':' 'rand' 'usr' 0
DB #0e,#00,#00 : DW 15619 : DB #00 ; start address
DB #3a,#ea,#3a,#f7,#22
filename: DB "boot ",#22,#3a ; ':' 'rem' run
;=======================================================================
;org #5d65
start: LD (memSP),SP
NewDisk: ;CALL clear_screen
LD BC,#0905
LD DE,0
LD HL,catBuff
CALL #3D13
LD A,"a"
LD (main.markPos),A
LD A,1
JP keys.setCP
;
; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ALIGN #10
TXT_BUTTONS:
.prev: DB '<<< PgUp'
.next: DB 'PgDn >>>'
;
main.CurrentPage:
DB 1
main.PagesCounter:
DB 1
; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
main: LD A,(.CurrentPage)
LD (.PagesCounter),A
.nextLoop: LD A,collor_T
LD (var_collor),A
LD HL,#50CC
LD (var_printPos),HL
LD HL,catBuff + #08F5
LD B,8
.p1: LD A,(HL)
PUSH HL
CALL printChar
POP HL
INC L
DJNZ .p1
; LD A,L
; CP low (catBuff + #08FD)
; JR NZ,.p1
LD HL,#4000
LD (var_printPos),HL
; ¢ëç¨â뢠­¨¥ ª â «®£ 
.buffPointer+1: LD HL,catBuff
.markPos+2: LD BC,"aa"
.l1: LD A,(HL)
DEC A
JR Z,.nextRec
;
JP M,DirShowDone
;
SET 3,L
LD A,(HL)
CP "B"
RES 3,L
JR NZ,.nextRec
; ¤¢¥ á¯¥æ ª­®¯ª¨
LD A,C ; C - ⥪ã騩 ä ©«
CP "y"
JR NC,PRINT_NEXT_BUTTONS ; "::PREV::" "::NEXT::"
;
; ¯à®å®¤­®© ¯à®£®­?
LD A,(.PagesCounter)
DEC A
JR NZ,.nextHiddenRec
; basic file
LD A,C
CP B ; ¢ë¡à ­­ë© ä ©«
LD A,collor_A
JR NZ,.notMarked
; ¢ë¤¥«¥­¨¥ ä ©«  ¨ ª®¯¨à®¢ ­¨¥ ¥£® ¢ áâப㠧 ¯ã᪠
XOR collor_M
;
LD DE,filename
PUSH BC
LD BC,8
LDIR
POP BC
RES 3,L
;
.notMarked: CALL prn_txt
.nextHiddenRec: INC C
.nextRec: LD DE,#10
ADD HL,DE
JR .l1
;
PRINT_NEXT_BUTTONS:
LD A,(main.PagesCounter)
LD (keys.nxtPage),A
DEC A
JR Z,.noChange
LD (main.PagesCounter),A
LD (main.buffPointer),HL
.noChange: PUSH AF
CALL PRINT_HELP
POP AF
JP Z,keys
JR keys.toMain
PRINT_HELP: LD HL,#5040
LD (var_printPos),HL
LD A,collor_N
PUSH BC
LD C," "
LD HL,TXT_BUTTONS.prev
CALL prn_txt
;
LD A,collor_N
CALL prn_txt
;
POP BC
RET
;
DirShowDone: XOR A
LD (keys.nxtPage),A
CALL PRINT_HELP
keys: RES 5,(iy+1)
.w1: BIT 5,(iy+1)
JR Z,.w1
LD A,(iy-#32)
;
CP B
JR Z,exit
CP #0D ; enter
JR Z,exit
CP " " ; space
JP Z,NewDisk
;
CP #04 ; pgUp
LD E,-1
JR Z,.prevPage
;
.pgdn: CP #05 ; pgDn
LD E,1
JR Z,.nextPage
;
.left: CP #08 ; left
JR NZ,.sl
DEC B
JR .c1
;
.sl: CP #0B ; up
JR NZ,.sd
DEC B
DEC B
DEC B
JR .c1
;
.sd: CP #0A ; down
JR NZ,.su
INC B
INC B
INC B
JR .c1
;
.su: CP #09 ; right
JR NZ,.sr
INC B
JR .c1
;
.sr: CP "a"
JR C,keys
CP C
JR NC,keys
LD B,A
;
.c1: LD A,B
CP "a"
JR NC,.sf1
LD A,"a"
.sf1: CP C
JR C,.sf2
LD A,C
DEC A
.sf2: LD (main.markPos),A
.toMain: JP main.nextLoop
; DE - +24 or -24
.nextPage: ;
.nxtPage+1: LD A,0
AND A
JR Z,.skip
XOR A
LD (.nxtPage),A
;
; DE - +24 or -24
.prevPage: LD A,(main.CurrentPage)
ADD A,E
JR Z,.skip
;
.setCP: LD H,A
LD L,A
LD (main.CurrentPage),HL
LD HL,catBuff
LD (main.buffPointer),HL
.skip: CALL clear_screen
JR .toMain
exit:
memSP+1: LD SP,0
RET
printChar: LD H,A
ADD A,A
ADD A,A
ADD A,A
LD L,A
LD A,H
RLCA
RLCA
RLCA
AND 0x07
ADD A,0x3c
LD H,A
var_printPos+1: LD DE,0x4000
.l1: LD A,(HL)
RRCA
OR (HL)
INC HL
LD (DE),A
INC D
LD (DE),A
INC D
LD A,D
AND 0x07
JR NZ,.l1
LD A,D
SUB 0x08
LD D,A
LD A,E
ADD A,0x20
LD E,A
AND 0x20
JR NZ,.l1
LD HL,(var_printPos)
LD A,H
RRCA
RRCA
RRCA
ADD A,0x50
LD H,A
var_collor+1: LD A,0
LD (HL),A
SET 5,L
XOR collor_A ^ collor_B
LD (HL),A
;
LD HL,var_printPos
LD A,(HL)
ADD A,0x21
AND 0xdf
LD (HL),A
RET NZ
INC HL
LD A,(HL)
ADD A,0x08
LD (HL),A
RET
;
;
clear_screen: XOR A
OUT (0xfe),A
LD (ZX_VARS.ATTR_P),A
LD (ZX_VARS.BORDER),A
JP BASIC_FN.x48.cls
; A - current file
; choose_color: CP B ; ¢ë¡à ­­ë© ä ©«. #C7
; LD A,collor_A
; SCF
; RET NZ
; XOR collor_M
; RET
; A - COLOR
; C - char of text button
; HL - Text
prn_txt: LD (var_collor),A
LD A,C
PUSH HL
CALL printChar
LD A," "
CALL printChar
POP HL
;
.loop: LD A,(HL)
INC HL
PUSH HL
CALL printChar
POP HL
LD A,L
AND 0x07
JR NZ,.loop
;
LD A,(var_printPos)
AND 0x1f
RET Z
LD A," "
PUSH HL
CALL printChar
POP HL
RET
;
;
; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; ALIGN #10
; TXT_BUTTONS:
; .prev: DB '<< PgDn '
; .next: DB '>> PgUp '
; ;
; main.CurrentPage:
; DB 1
; main.PagesCounter:
; DB 1
; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
StartLineNum: DB 0
DW 0
;DB #80
l2end:
;bend:
DISPLAY "printChar ",/A,$-printChar
DISPLAY "code ",/A,$-start
;ds -$&0x0f
;ALIGN #10
;filename EQU $
catBuff EQU #6000 ;$ + (-$&0x0f)
ASSERT l2end < catBuff,"ERROR!!! Code leaks to catBuff"
EXPORT StartLineNum
EXPORT org_addr
;
/*
; device zxspectrum48
INCLUDE 'inc/rom_routines.inc'
INCLUDE 'Shared_Includes/constants/ZX_VARS.inc'
INCLUDE 'Shared_Includes/constants/zx_char_codes.inc'
;=======================================================================
collor_A EQU 0x03
collor_B EQU 0x02
collor_N EQU 0x04
collor_M EQU 0x08
collor_T EQU 0x07
org_addr EQU #5d3b
ORG org_addr
bstart: DW #100 ; line number = 1
DW l1end-l1begin ; line length
l1begin: DB ZX_Token.randomize,ZX_Token.usr,#30 ; 'rand' 'usr' 0
DB #0e,#00,#00 : DW start : DB #00,#0d ; start address
l1end: DW #200 ; line number = 2
DW l2end-l2begin ; line length
l2begin: DB #f9,#c0,#30 ; ':' 'rand' 'usr' 0
DB #0e,#00,#00 : DW 15619 : DB #00 ; start address
DB #3a,#ea,#3a,#f7,#22
filename: DB "boot ",#22,#3a ; ':' 'rem' run
;=======================================================================
;org #5d65
start: LD (memSP),SP
NewDisk: CALL clear_screen
; XOR A
; ;OUT (0xfe),A
; LD (ZX_VARS.ATTR_P),A
; LD (ZX_VARS.BORDER),A
; CALL BASIC_FN.x48.cls
;
LD BC,0x0905
LD DE,0
LD HL,catBuff
;.3 nop
CALL 0x3d13
LD A,"a"
LD (main.markPos),A
main: LD A,collor_T
LD (var_collor),A
LD HL,0x50cc
LD (var_printPos),HL
LD HL,catBuff+0x08f5
.p1: LD A,(HL)
PUSH HL
CALL printChar
POP HL
INC L
LD A,L
CP low (catBuff+0x08fd)
JR NZ,.p1
LD HL,0x4000
LD (var_printPos),HL
; ¢ëç¨â뢠­¨¥ ª â «®£ 
.buffPointer+1: LD HL,catBuff
.markPos+2: LD BC,"aa"
.l1: LD A,(HL)
DEC A
JR Z,.n1
;
JP M,keys
;
LD A,L
AND #F0
ADD A,8
LD L,A
LD A,(HL)
CP "B"
RES 3,L
JR NZ,.n1
; ¤¢¥ á¯¥æ ª­®¯ª¨
LD A,C ; C - ⥪ã騩 ä ©«
CP "y"
JP NC,PRINT_NEXT_BUTTONS ; "::PREV::" "::NEXT::"
;
; basic file
CP B ; ¢ë¡à ­­ë© ä ©«
LD A,collor_A
JR NZ,.s1
; ¢ë¤¥«¥­¨¥ ä ©«  ¨ ª®¯¨à®¢ ­¨¥ ¥£® ¢ áâப㠧 ¯ã᪠
XOR collor_M
;CALL choose_color
;JR C,.s1
;
LD DE,filename
PUSH BC
LD BC,8
LDIR
POP BC
RES 3,L
;
.s1: CALL prn_txt
.s3: INC C
.n1: LD A,L
AND #F0
LD L,A
LD DE,#10
ADD HL,DE
JR .l1
;
;
;
ALIGN #10
TXT_BUTTONS:
.prev: DB '<< PgDn '
.next: DB '>> PgUp '
;
;
keys: RES 5,(iy+1)
.w1: BIT 5,(iy+1)
JR Z,.w1
LD A,(iy-0x32)
;
CP B
JR Z,exit
CP 0x0d ; enter
JR Z,exit
CP " " ; space
JP Z,NewDisk
;
CP #04 ; pgUp
LD DE,-384
JR Z,.nxtPage
;
.pgdn: CP #05 ; pgDn
LD DE,384
JR Z,.nxtPage
;
.left: CP #08 ; left
JR NZ,.sl
DEC B
JR .c1
;
.sl: CP #0B ; up
JR NZ,.sd
DEC B
DEC B
DEC B
JR .c1
;
.sd: CP #0A ; down
JR NZ,.su
INC B
INC B
INC B
JR .c1
;
.su: CP #09 ; right
JR NZ,.sr
INC B
JR .c1
;
.sr: CP "a"
JR C,keys
CP C
JR NC,keys
LD B,A
;
.c1: LD A,B
CP "a"
JR NC,.sf1
LD A,"a"
.sf1: CP C
JR C,.sf2
LD A,C
DEC A
.sf2: LD (main.markPos),A
.toMain: JP main
; DE - +24 or -24
.nxtPage: LD HL,(main.buffPointer)
ADD HL,DE
BIT 3,H
JR NZ,keys
.EnablePages+1: AND 0
JR Z,keys
;
XOR A
LD (.EnablePages),A ; A=0 - Disable Pages
LD (main.buffPointer),HL
CALL clear_screen
JR .toMain
; var_files db 0
exit:
memSP+1: LD SP,0
RET
PRINT_NEXT_BUTTONS:
LD HL,#5040
LD (var_printPos),HL
LD A,collor_N
LD (keys.EnablePages),A ; A!=0 - Enable Pages
LD HL,TXT_BUTTONS.prev
CALL prn_txt
;
LD A,collor_N
INC C
CALL prn_txt
;
JP keys
printChar: LD H,A
ADD A,A
ADD A,A
ADD A,A
LD L,A
LD A,H
RLCA
RLCA
RLCA
AND 0x07
ADD A,0x3c
LD H,A
var_printPos+1: LD DE,0x4000
.l1: LD A,(HL)
RRCA
OR (HL)
INC HL
LD (DE),A
INC D
LD (DE),A
INC D
LD A,D
AND 0x07
JR NZ,.l1
LD A,D
SUB 0x08
LD D,A
LD A,E
ADD A,0x20
LD E,A
AND 0x20
JR NZ,.l1
LD HL,(var_printPos)
LD A,H
RRCA
RRCA
RRCA
ADD A,0x50
LD H,A
var_collor+1: LD A,0
LD (HL),A
SET 5,L
XOR collor_A ^ collor_B
LD (HL),A
;
LD HL,var_printPos
LD A,(HL)
ADD A,0x21
AND 0xdf
LD (HL),A
RET NZ
INC HL
LD A,(HL)
ADD A,0x08
LD (HL),A
RET
;
;
clear_screen: XOR A
OUT (0xfe),A
LD (ZX_VARS.ATTR_P),A
LD (ZX_VARS.BORDER),A
JP BASIC_FN.x48.cls
;
; A - current file
; choose_color: CP B ; ¢ë¡à ­­ë© ä ©«. #C7
; LD A,collor_A
; SCF
; RET NZ
; XOR collor_M
; RET
; A - COLOR
; C - char of text button
; HL - Text
prn_txt: LD (var_collor),A
LD A,C
PUSH HL
CALL printChar
LD A," "
CALL printChar
POP HL
;
.loop: LD A,(HL)
INC HL
PUSH HL
CALL printChar
POP HL
LD A,L
AND 0x07
JR NZ,.loop
;
LD A,(var_printPos)
AND 0x1f
RET Z
LD A," "
PUSH HL
CALL printChar
POP HL
RET
;
StartLineNum: DB 0
DW 0
;DB #80
l2end:
;bend:
DISPLAY "printChar ",/A,$-printChar
DISPLAY "code ",/A,$-start
;ds -$&0x0f
;ALIGN #10
;filename EQU $
catBuff EQU #6000 ;$ + (-$&0x0f)
ASSERT l2end < catBuff,"ERROR!!! Code leaks to catBuff"
EXPORT StartLineNum
EXPORT org_addr
;
*/