forked from MirrorRepos/RomWBW
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
150 lines
2.9 KiB
150 lines
2.9 KiB
;----------------------------------------------------------------------------
|
|
; PREFIX_UNA.ASM
|
|
;
|
|
; PUT AT THE HEAD OF BOOT.BIN TO XFER TO A FLOPPY DISK
|
|
;
|
|
;----------------------------------------------------------------------------
|
|
|
|
#INCLUDE "std.asm"
|
|
|
|
BYT .EQU 1 ; used to describe METADATA_SIZE below
|
|
WRD .EQU 2
|
|
|
|
SECTOR_SIZE .EQU 512
|
|
BLOCK_SIZE .EQU 128
|
|
PREFIX_SIZE .EQU (3 * SECTOR_SIZE) ; 3 SECTORS
|
|
METADATA_SIZE .EQU BYT+WRD+(4*BYT)+16+BYT+WRD+WRD+WRD+WRD ; (as defined below)
|
|
|
|
.ORG $8000
|
|
JR BOOT
|
|
;
|
|
BOOT:
|
|
LD DE,STR_LOAD ; LOADING STRING
|
|
CALL PRTSTR ; PRINT
|
|
CALL PRTDOT ; PROGRESS
|
|
;
|
|
LD BC,$00FC ; UNA FUNC: GET BOOTSTRAP HISTORY
|
|
CALL $FFFD ; CALL UNA
|
|
JR NZ,ERROR ; HANDLE ERROR
|
|
CALL PRTDOT ; PROGRESS
|
|
LD B,L ; MOVE BOOT UNIT ID TO B
|
|
;
|
|
LD C,$41 ; UNA FUNC: SET LBA
|
|
LD DE,0 ; HI WORD ALWAYS ZERO
|
|
LD HL,3 ; IMAGE STARTS AT FOURTH SECTOR
|
|
CALL $FFFD ; SET LBA
|
|
JR NZ,ERROR ; HANDLE ERROR
|
|
CALL PRTDOT ; PROGRESS
|
|
;
|
|
LD C,$42 ; UNA FUNC: READ SECTORS
|
|
LD DE,$D000 ; STARTING ADDRESS FOR IMAGE
|
|
LD L,22 ; READ 22 SECTORS
|
|
CALL $FFFD ; DO READ
|
|
JR NZ,ERROR ; HANDLE ERROR
|
|
CALL PRTDOT ; PROGRESS
|
|
;
|
|
LD DE,STR_DONE ; DONE MESSAGE
|
|
CALL PRTSTR ; PRINT IT
|
|
;
|
|
LD D,B ; PASS BOOT UNIT TO OS
|
|
LD E,0 ; ASSUME LU IS ZERO
|
|
JP CPM_ENT ; GO TO CPM
|
|
;
|
|
PRTCHR:
|
|
PUSH BC
|
|
PUSH DE
|
|
LD BC,$0012 ; UNIT 0, WRITE CHAR
|
|
LD E,A ; CHAR TO PRINT
|
|
CALL $FFFD ; PRINT
|
|
POP DE
|
|
POP BC
|
|
RET
|
|
;
|
|
PRTSTR:
|
|
PUSH BC
|
|
PUSH HL
|
|
LD BC,$0015 ; UNIT 0, WRITE CHARS UNTIL TERMINATOR
|
|
LD L,0 ; TERMINATOR IS NULL
|
|
CALL $FFFD ; PRINT
|
|
POP HL
|
|
POP BC
|
|
RET
|
|
;
|
|
PRTDOT:
|
|
LD A,'.' ; DOT CHARACTER
|
|
JR PRTCHR ; PRINT AND RETURN
|
|
;
|
|
; PRINT THE HEX BYTE VALUE IN A
|
|
;
|
|
PRTHEXBYTE:
|
|
PUSH AF
|
|
PUSH DE
|
|
CALL HEXASCII
|
|
LD A,D
|
|
CALL PRTCHR
|
|
LD A,E
|
|
CALL PRTCHR
|
|
POP DE
|
|
POP AF
|
|
RET
|
|
;
|
|
; CONVERT BINARY VALUE IN A TO ASCII HEX CHARACTERS IN DE
|
|
;
|
|
HEXASCII:
|
|
LD D,A
|
|
CALL HEXCONV
|
|
LD E,A
|
|
LD A,D
|
|
RLCA
|
|
RLCA
|
|
RLCA
|
|
RLCA
|
|
CALL HEXCONV
|
|
LD D,A
|
|
RET
|
|
;
|
|
; CONVERT LOW NIBBLE OF A TO ASCII HEX
|
|
;
|
|
HEXCONV:
|
|
AND 0FH ;LOW NIBBLE ONLY
|
|
ADD A,90H
|
|
DAA
|
|
ADC A,40H
|
|
DAA
|
|
RET
|
|
;
|
|
ERROR:
|
|
LD DE,STR_ERR ; POINT TO ERROR STRING
|
|
CALL PRTSTR ; PRINT IT
|
|
HALT ; HALT
|
|
;
|
|
STR_LOAD .DB "\r\nLoading",0
|
|
STR_DONE .DB "\r\n",0
|
|
STR_ERR .DB " Read Error!",0
|
|
;
|
|
.ORG $ - $8000
|
|
;
|
|
.FILL (SECTOR_SIZE) - $ - 2
|
|
.DW $AA55
|
|
;
|
|
.FILL ((PREFIX_SIZE - BLOCK_SIZE) - $),00H
|
|
PR_SIG .DW $A55A ; SIGNATURE GOES HERE
|
|
;
|
|
PR_PLATFORM .DB PLATFORM
|
|
PR_DEVICE .DB 0
|
|
PR_FORMATTER .DB 0,0,0,0,0,0,0,0
|
|
PR_DRIVE .DB 0
|
|
PR_LOG_UNIT .DW 0
|
|
|
|
;
|
|
.FILL ((PREFIX_SIZE - METADATA_SIZE) - $),00H
|
|
.DB 0 ; write protect boolean
|
|
.DW 0 ; starting update number
|
|
.DB RMJ,RMN,RUP,RTP
|
|
.DB "Unlabeled Drive ","$"
|
|
.DW 0 ; PTR TO LOCATION TO STORE DISKBOOT & BOOTDRIVE (SEE CNFGDATA)
|
|
.DW CPM_LOC ; CCP START
|
|
.DW CPM_END ; END OF CBIOS
|
|
.DW CPM_ENT ; COLD BOOT LOCATION
|
|
|
|
.END
|