ZX-SP-ROMs/TRDOS/boot/boot.asm
2025-06-25 23:51:57 +10:00

601 lines
13 KiB
NASM
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

IF DEFtrd_boot_small
;======================================================================;
INCLUDE 'inc/rom_routines.inc'
INCLUDE 'Shared_Includes/constants/ZX_VARS.inc'
INCLUDE 'Shared_Includes/constants/zx_char_codes.inc'
INCLUDE 'Shared_Includes/constants/standart_colors.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
;======================================================================;
; Variables
;======================================================================;
ColumnNumber EQU #70E0
Columns EQU 3
;======================================================================;
;======================================================================;
ORG org_addr
bstart: DW #100 ; line number = 1
DW l1end - l1begin ; line length
l1begin: DB ZX_Token.border, ZX_Token.not, ZX_Token.pi, ":"
DB ZX_Token.randomize, ZX_Token.usr, ZX_Token.val, '"',"23907",'"'
DB ":", ZX_Token.rem, ":", ZX_Token.run
DB '"'
BootName: DB ZX_Char.tab, 10, 32
DB "MAXBOOT v9.1"
.size EQU $-BootName
DB '"', ZX_Char.carriage_return
;======================================================================;
;#70F6 - disk name
;======================================================================;
START_BOOT: ;Permanent current colours, etc, as set up by colour statements.
LD (iy+#53),COLORS.ZX.CYAN ;5d63 fd 36 53 05 . 6 S .
l5d67h: CALL BASIC_FN.x48.cls ;5d67 cd 6b 0d . k .
ADD HL,BC ;5d6a 09 .
; HL = 6801
; read 9 sectors
LD BC,#0905 ;5d6b 01 05 09 . . .
PUSH HL ;5d6e e5 .
CALL #3D13 ;5d6f cd 13 3d . . =
;PR-STRING
LD DE,BootName ;5d72 11 52 5d . R ]
LD C,BootName.size ;5d75 0e 0f . .
CALL #203C ;5d77 cd 3c 20 . <
;CHAN_OPEN
; Open channel 2 (main screen)
LD A,#02 ;5d7a 3e 02 > .
CALL #1601 ;5d7c cd 01 16 . . .
;
POP HL ;5d7f e1 .
LD D,H ;5d80 54 T
LD E,L ;5d81 5d ]
loopDir: LD BC,8 ; ᬥ饭<E1ACA5><E9A5AD> <20><> <><E4A0A9> ;5d82 01 08 00 . . .
DEC (HL) ;5d85 35 5
JR Z,.nextFile ;5d86 28 28 ( (
INC (HL) ;5d88 34 4
JR Z,.EXIT ;5d89 28 2a ( *
;
PUSH HL ;5d8b e5 .
ADD HL,BC ;5d8c 09 .
LD A,(HL) ;5d8d 7e ~
POP HL ;5d8e e1 .
CP "B" ;5d8f fe 42 . B
JR NZ,.nextFile ;5d91 20 1d .
PUSH HL ;5d93 e5 .
;PRINT-A
LD A," " ;5d94 3e 20 >
RST #10 ;5d96 d7 .
; (#5C51) == #5D2B
; (#5D2B) == #09F4
; <20><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><><E4A0A9>
.loopPrint: LD A,(HL) ;5d97 7e ~
RST #10 ;5d98 d7 .
LDI ;5d99 ed a0 . .
JP PE,.loopPrint ;5d9b ea 97 5d . . ]
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><EFBFBD><E0A0A2><EFBFBD><ECADAE> <20><EFBFBD><EBA2AE> <20><><EFBFBD><EFBFBD><><E4A0A9><EFBFBD>
LD HL,ColumnNumber ;5d9e 21 e0 70 ! . p
INC (HL) ;5da1 34 4
LD A,(HL) ;5da2 7e ~
.loopColumn: SUB Columns ;5da3 d6 03 . .
JR Z,.ColumnThree ;5da5 28 05 ( .
JR NC,.loopColumn ;5da7 30 fa 0 .
LD A," " ;5da9 3e 20 >
RST #10 ;5dab d7 .
.ColumnThree: LD A," " ;5dac 3e 20 >
RST #10 ;5dae d7 .
;
POP HL ;5daf e1 .
.nextFile: LD C,#10 ;5db0 0e 10 . .
ADD HL,BC ;5db2 09 .
JR loopDir ;5db3 18 cd . .
.EXIT: ;
;;;;;;;;;;;;;;;;;
; B = 0
; <20><><EFBFBD><E1AEA2><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD><E9A5AD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
MAIN_LOOP: LD C,B ;5db5 48 H
l5db6h: LD HL,#57F5 ;5db6 21 f5 57 ! . W
LD DE,#000B ;5db9 11 0b 00 . . .
LD A,D ;5dbc 7a z
l5dbdh: LD B,#03 ;5dbd 06 03 . .
l5dbfh: ADD HL,DE ;5dbf 19 .
CP C ;5dc0 b9 .
JR Z,l5dc9h ;5dc1 28 06 ( .
INC A ;5dc3 3c <
DJNZ l5dbfh ;5dc4 10 f9 . .
DEC HL ;5dc6 2b +
JR l5dbdh ;5dc7 18 f4 . .
;
l5dc9h: LD B,#0A ;5dc9 06 0a . .
LD DE,(#70DE) ;5dcb ed 5b de 70 . [ . p
LD (#70DE),HL ;5dcf 22 de 70 " . p
LD A,#05 ;5dd2 3e 05 > .
l5dd4h: LD (DE),A ;5dd4 12 .
INC DE ;5dd5 13 .
LD (HL),#1E ;5dd6 36 1e 6 .
INC HL ;5dd8 23 #
DJNZ l5dd4h ;5dd9 10 f9 . .
LD HL,#5C08 ;5ddb 21 08 5c ! . \
LD (HL),H ;5dde 74 t
l5ddfh: LD A,(HL) ;5ddf 7e ~
OR #20 ;5de0 f6 20 .
SUB #20 ;5de2 d6 20 .
JR Z,l5d67h ;5de4 28 81 ( .
SUB L ;5de6 95 .
LD B,#02 ;5de7 06 02 . .
l5de9h: JR Z,l5e0fh ;5de9 28 24 ( $
DEC A ;5deb 3d =
JR Z,l5e13h ;5dec 28 25 ( %
DEC A ;5dee 3d =
JR Z,l5e11h ;5def 28 20 (
DEC A ;5df1 3d =
JR Z,l5e0dh ;5df2 28 19 ( .
SUB B ;5df4 90 .
JR Z,RUN_BASIC ;5df5 28 2d ( -
SUB #03 ;5df7 d6 03 . .
JR Z,RUN_BASIC ;5df9 28 29 ( )
SUB #06 ;5dfb d6 06 . .
DJNZ l5de9h ;5dfd 10 ea . .
SUB #1E ;5dff d6 1e . .
JR Z,l5e11h ;5e01 28 0e ( .
SUB #0E ;5e03 d6 0e . .
JR Z,l5e0fh ;5e05 28 08 ( .
DEC A ;5e07 3d =
JR Z,l5e13h ;5e08 28 09 ( .
DEC A ;5e0a 3d =
JR NZ,l5ddfh ;5e0b 20 d2 .
l5e0dh: SUB #02 ;5e0d d6 02 . .
l5e0fh: SUB #04 ;5e0f d6 04 . .
l5e11h: ADD A,#02 ;5e11 c6 02 . .
l5e13h: ADD A,C ;5e13 81 .
LD BC,(ColumnNumber) ;5e14 ed 4b e0 70 . K . p
DEC C ;5e18 0d .
INC A ;5e19 3c <
JP M,l5db6h ;5e1a fa b6 5d . . ]
INC C ;5e1d 0c .
CP C ;5e1e b9 .
LD C,A ;5e1f 4f O
JR C,l5db6h ;5e20 38 94 8 .
JR MAIN_LOOP ;5e22 18 91 . .
;
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>
; A = 0
RUN_BASIC: LD B,A ;5e24 47 G
LD A,C ;5e25 79 y
INC A ;5e26 3c <
LD C,L ;5e27 4d M
LD HL,#67F9 ;5e28 21 f9 67 ! . g
.loop: ADD HL,BC ;5e2b 09 .
DEC A ;5e2c 3d =
JR NZ,.loop ;5e2d 20 fc .
;
LD DE,BootName ;5e2f 11 52 5d . R ]
LDIR ;5e32 ed b0 . .
JP #3D03 ;5e34 c3 03 3d . . =
;ADD A,B ;5e37 80 .
;XOR D ;5e38 aa .
;DEFB 001h,000h ;5e39 01 00 . .
StartLineNum: DB 0
DW 0
;DB #80
l1end:
EXPORT StartLineNum
EXPORT org_addr
ELSE
;======================================================================;
INCLUDE 'inc/rom_routines.inc'
INCLUDE 'Shared_Includes/constants/ZX_VARS.inc'
INCLUDE 'Shared_Includes/constants/zx_char_codes.inc'
INCLUDE 'Shared_Includes/constants/standart_colors.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
;=======================================================================
DiskName EQU catBuff + #08F5
.size EQU 8
Columns EQU 3
vROMbootSize EQU bstart
;=======================================================================
ORG org_addr
bstart: DW #100 ; line number = 1
DW l1end-l1begin ; line length
l1begin: DB ZX_Token.randomize,ZX_Token.usr,"0" ; 'rand' 'usr' 0
DB ZX_Char.number
DB #00,#00 : DW start : DB #00 ; start address
DB ZX_Char.carriage_return
l1end: DW #200 ; line number = 2
DW l2end-l2begin ; line length
l2begin: DB ZX_Token.randomize,ZX_Token.usr,"0" ; ':' 'rand' 'usr' 0
DB ZX_Char.number
DB #00,#00 : DW 15619 : DB #00 ; start address
DB ":",ZX_Token.rem,":",ZX_Token.run,'"'
filename: DB "boot ",'"',":" ; ':' '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: CALL PRINT_HELP
LD A,collor_T
LD (var_collor),A
LD HL,#50CC
LD (var_printPos),HL
LD HL,DiskName
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
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EBA2A0><EFBFBD> <20><><EFBFBD><E2A0AB><EFBFBD>
.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
; <20><><EFBFBD><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
LD A,C ; C - ⥪<>騩 䠩<>
CP "y"
JR NC,PRINT_NEXT_BUTTONS ; "::PREV::" "::NEXT::"
;
; <20><><EFBFBD><EFBFBD><E5AEA4><EFBFBD> <20><EFBFBD><E0AEA3>?
LD A,(.PagesCounter)
DEC A
JR NZ,.nextHiddenRec
; basic file
LD A,C
CP B ; <20><><EFBFBD><EFBFBD><E0A0AD><EFBFBD><>
LD A,collor_A
JR NZ,.notMarked
; <20><EFBFBD><EBA4A5><EFBFBD><EFBFBD><EFBFBD><><E4A0A9> <20> <20><><EFBFBD><EFBFBD><EFBFBD><E0AEA2><EFBFBD><EFBFBD> <20><><EFBFBD> <20> <20><><EFBFBD> <20><><EFBFBD><EFBFBD>
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
JR Z,keys
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: LD A,C
CP "a"
JP Z,NewDisk
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 ; <20><><EFBFBD><EFBFBD><E0A0AD><EFBFBD><>. #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
;
ENDIF