mirror of https://github.com/wwarthen/RomWBW.git
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.
424 lines
9.6 KiB
424 lines
9.6 KiB
;___BOOTGEN___________________________________________________________________________________________________________
|
|
;
|
|
; COPY THE SYSTEM TO THE BOOT SECTORS OF AN IDE HDD
|
|
;
|
|
; CREATED BY : DAN WERNER 09 12.2009
|
|
;
|
|
;
|
|
;
|
|
;
|
|
;__CONSTANTS_________________________________________________________________________________________________________________________
|
|
;
|
|
CR: .EQU 0DH ; ASCII CARRIAGE RETURN CHARACTER
|
|
LF: .EQU 0AH ; ASCII LINE FEED CHARACTER
|
|
ESC: .EQU 1BH ; ASCII ESCAPE CHARACTER
|
|
BS: .EQU 08H ; ASCII BACKSPACE CHARACTER
|
|
|
|
;
|
|
;
|
|
;
|
|
;__MAIN_PROGRAM_____________________________________________________________________________________________________________________
|
|
;
|
|
.ORG 00100h ; FOR DEBUG IN CP/M (AS .COM)
|
|
|
|
|
|
LD HL,(0001H) ; GET WBOOT ADDRESS
|
|
LD BC,1603H ; GET CP/M TOP
|
|
SBC HL,BC ;
|
|
LD (CPMSTART),HL ; SET IT
|
|
DEC HL ;
|
|
LD SP,HL ; SETUP STACK
|
|
|
|
|
|
; PARSE COMMAND LINE
|
|
LD HL,0081H ; SET INDEX POINTER
|
|
LD B,(0080H) ; NUMBER OF BYTES
|
|
PARSECMD:
|
|
LD A,(HL) ; GET DRIVE LETTER ON COMMAND LINE
|
|
INC HL
|
|
CP 20H ; IS SPACE?
|
|
JP NZ,PARSEGOT ; JUMP ON NON-BLANK
|
|
DJNZ PARSECMD ; LOOP
|
|
PARSEERR:
|
|
LD DE,MSG_VALID ;
|
|
LD C,09H ; CP/M WRITE START STRING TO CONSOLE CALL
|
|
CALL 0005H
|
|
JP EXIT ; EXIT
|
|
PARSEGOT:
|
|
SUB 'A' ; TURN IT INTO A NUMERIC
|
|
JP C,PARSEERR ;
|
|
CP 16 ; VALID CP/M DRIVE?
|
|
JP P,PARSEERR ;
|
|
LD (DEVICENUMBER),A ; DEVICE ID
|
|
; GET NUMBER OF SECTORS PER TRACK
|
|
LD L,A ; L=DISK NUMBER 0,1,2,3,4
|
|
LD H,0 ; HIGH ORDER ZERO
|
|
ADD HL,HL ; *2
|
|
ADD HL,HL ; *4
|
|
ADD HL,HL ; *8
|
|
ADD HL,HL ; *16 (SIZE OF EACH HEADER)
|
|
PUSH HL ;
|
|
POP DE
|
|
LD HL,(0001H) ;
|
|
LD BC,0058 ;
|
|
ADD HL,BC ;
|
|
ADD HL,DE ; HL= DPBASE(DISKNO*16)
|
|
EX DE,HL ;
|
|
LD A,(DE) ;
|
|
LD L,A ;
|
|
INC DE ;
|
|
LD A,(DE) ;
|
|
LD H,A ;
|
|
EX DE,HL ;
|
|
LD A,(DE) ;
|
|
LD (SECTRACK),A ;
|
|
INC DE ;
|
|
LD A,(DE) ;
|
|
LD (SECTRACK+1),A ;
|
|
|
|
LD DE,DRIVE_MSG ;
|
|
LD C,09H ; CP/M WRITE START STRING TO CONSOLE CALL
|
|
CALL 0005H
|
|
LD A,(DEVICENUMBER) ;
|
|
ADD A,'A' ;
|
|
CALL COUT ;
|
|
LD A,':' ;
|
|
CALL COUT ;
|
|
CALL CRLF ;
|
|
|
|
|
|
LD DE,BASE_MSG ;
|
|
LD C,09H ; CP/M WRITE START STRING TO CONSOLE CALL
|
|
CALL 0005H
|
|
LD HL,(CPMSTART) ;
|
|
CALL PHL ;
|
|
LD DE,END_MSG ;
|
|
LD C,09H ; CP/M WRITE START STRING TO CONSOLE CALL
|
|
CALL 0005H
|
|
LD HL,(CPMEND) ;
|
|
CALL PHL ;
|
|
CALL CRLF ;
|
|
|
|
LD DE,SECTOR_MSG ;
|
|
LD C,09H ; CP/M WRITE START STRING TO CONSOLE CALL
|
|
CALL 0005H
|
|
LD HL,(SECTRACK) ;
|
|
CALL PHL ;
|
|
CALL CRLF ;
|
|
|
|
|
|
; RUN WITH GOOD OUTPUT
|
|
|
|
LD A,(DEVICENUMBER) ; SET DEVICE NUMBER
|
|
LD C,A
|
|
CALL SELDSK ; SELECT DISK
|
|
|
|
LD HL,000CH ; SET INITIAL SECTOR
|
|
LD (CURSECTOR),HL
|
|
|
|
LD HL,0000H ; SET INITIAL TRACK
|
|
LD (CURTRACK),HL ;
|
|
|
|
LD HL,(CPMSTART) ; SET BEGINNING OF CPM
|
|
LD (CURADDRESS),HL ;
|
|
|
|
LD BC,(DMAAD) ; SETUP THE DMA AREA
|
|
CALL SETDMA ;
|
|
|
|
LOOP:
|
|
LD BC,(CURSECTOR) ; SET SECTOR
|
|
CALL SETSEC ;
|
|
LD BC,(CURTRACK) ;
|
|
CALL SETTRK ;
|
|
CALL COPYTODMA ; COPY BYTES TO DMA
|
|
CALL WRITE ; WRITE SECTOR
|
|
|
|
LD HL,(CURADDRESS) ; IF IX>CPMEND, EXIT PROGRAM
|
|
LD BC,(CPMEND) ;
|
|
LD A,H ;
|
|
CP B ;
|
|
JP NZ,CONTINUE ;
|
|
LD A,L ;
|
|
CP C ;
|
|
JP M,ENDLOOP ;
|
|
CONTINUE:
|
|
LD HL,(CURSECTOR) ; GET NEXT TRACK & SECTOR
|
|
INC HL ;
|
|
LD (CURSECTOR),HL ;
|
|
LD BC,(SECTRACK) ;
|
|
LD A,H ;
|
|
CP B ;
|
|
JP NZ,LOOP ;
|
|
LD A,L ;
|
|
CP C ;
|
|
JP NZ,LOOP ;
|
|
|
|
LD HL,(CURTRACK) ;
|
|
INC HL ;
|
|
LD (CURTRACK),HL ;
|
|
LD HL,0000H ;
|
|
LD (CURSECTOR),HL ;
|
|
JP LOOP ;
|
|
|
|
ENDLOOP:
|
|
; WRITE CP/M BOOT START AND END ADDRESSES IN LAST TWO WORDS OF MEDIA INFO SECTOR
|
|
LD BC,000BH ; SET SECTOR
|
|
CALL SETSEC ;
|
|
LD BC,0000H ;
|
|
CALL SETTRK ;
|
|
CALL READ ;
|
|
LD HL,(DMAAD) ; SET ADDRESS IN BUFFER TO LAST TWO WORDS
|
|
LD BC,122 ;
|
|
ADD HL,BC ;
|
|
LD A,(CPMSTART) ;
|
|
LD (HL),A ;
|
|
LD A,(CPMSTART+1) ;
|
|
INC HL
|
|
LD (HL),A ;
|
|
LD A,(CPMEND) ;
|
|
INC HL
|
|
LD (HL),A ;
|
|
LD A,(CPMEND+1) ;
|
|
INC HL
|
|
LD (HL),A ;
|
|
LD A,(0001H) ;
|
|
DEC A ;
|
|
DEC A ;
|
|
DEC A ;
|
|
INC HL
|
|
LD (HL),A ;
|
|
LD A,(0002H) ;
|
|
INC HL
|
|
LD (HL),A ;
|
|
CALL WRITE ; WRITE SECTOR
|
|
|
|
EXIT:
|
|
|
|
LD DE,MSG_END ;
|
|
LD C,09H ; CP/M WRITE END STRING TO CONSOLE CALL
|
|
CALL 0005H ;
|
|
;
|
|
LD C,00H ; CP/M SYSTEM RESET CALL
|
|
CALL 0005H ; RETURN TO PROMPT
|
|
|
|
|
|
|
|
|
|
|
|
;___COPYTODMA_____________________________________________________________________________________
|
|
;
|
|
; COPY CURRENT ADDRESS BLOCK TO DMA
|
|
;_________________________________________________________________________________________________
|
|
COPYTODMA:
|
|
LD HL,(DMAAD) ; LOAD HL WITH DMA ADDRESS
|
|
LD E,L ;
|
|
LD D,H ; GET IT INTO DE
|
|
LD HL,(CURADDRESS) ; GET RAM ADDRESS TO COPY
|
|
LD BC,128 ; BC IS COUNTER FOR FIXED SIZE TRANSFER (128 BYTES)
|
|
LDIR ; TRANSFER
|
|
LD HL,(CURADDRESS) ; INCREMENT ADDRESS POINTER BY COPY SIZE
|
|
LD BC,128 ;
|
|
ADD HL,BC ;
|
|
LD (CURADDRESS),HL ;
|
|
RET
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;__HXOUT_________________________________________________________________________________________________________________________
|
|
;
|
|
; PRINT THE ACCUMULATOR CONTENTS AS HEX DATA ON THE SERIAL PORT
|
|
;________________________________________________________________________________________________________________________________
|
|
;
|
|
HXOUT:
|
|
PUSH BC ; SAVE BC
|
|
LD B,A ;
|
|
RLC A ; DO HIGH NIBBLE FIRST
|
|
RLC A ;
|
|
RLC A ;
|
|
RLC A ;
|
|
AND 0FH ; ONLY THIS NOW
|
|
ADD A,30H ; TRY A NUMBER
|
|
CP 3AH ; TEST IT
|
|
JR C,OUT1 ; IF CY SET PRINT 'NUMBER'
|
|
ADD A,07H ; MAKE IT AN ALPHA
|
|
OUT1:
|
|
CALL COUT ; SCREEN IT
|
|
LD A,B ; NEXT NIBBLE
|
|
AND 0FH ; JUST THIS
|
|
ADD A,30H ; TRY A NUMBER
|
|
CP 3AH ; TEST IT
|
|
JR C,OUT2 ; PRINT 'NUMBER'
|
|
ADD A,07H ; MAKE IT ALPHA
|
|
OUT2:
|
|
CALL COUT ; SCREEN IT
|
|
POP BC ; RESTORE BC
|
|
RET ;
|
|
|
|
|
|
;__SPACE_________________________________________________________________________________________________________________________
|
|
;
|
|
; PRINT A SPACE CHARACTER ON THE SERIAL PORT
|
|
;________________________________________________________________________________________________________________________________
|
|
;
|
|
SPACE:
|
|
PUSH AF ; STORE AF
|
|
LD A,20H ; LOAD A "SPACE"
|
|
CALL COUT ; SCREEN IT
|
|
POP AF ; RESTORE AF
|
|
RET ; DONE
|
|
|
|
;__CRLF_________________________________________________________________________________________________________________________
|
|
;
|
|
; PRINT A CR/LF
|
|
;________________________________________________________________________________________________________________________________
|
|
;
|
|
CRLF:
|
|
PUSH AF ; STORE AF
|
|
LD A,0DH ; LOAD A "SPACE"
|
|
CALL COUT ; SCREEN IT
|
|
LD A,0AH ; LOAD A "SPACE"
|
|
CALL COUT ; SCREEN IT
|
|
POP AF ; RESTORE AF
|
|
RET ; DONE
|
|
|
|
;__COUT_________________________________________________________________________________________________________________________
|
|
;
|
|
; PRINT CONTENTS OF A
|
|
;________________________________________________________________________________________________________________________________
|
|
;
|
|
COUT:
|
|
PUSH BC ;
|
|
PUSH AF ;
|
|
PUSH HL ;
|
|
PUSH DE ;
|
|
|
|
LD (COUT_BUFFER),A ;
|
|
LD DE,COUT_BUFFER ;
|
|
LD C,09H ; CP/M WRITE START STRING TO CONSOLE CALL
|
|
CALL 0005H
|
|
POP DE ;
|
|
POP HL ;
|
|
POP AF ;
|
|
POP BC ;
|
|
RET ; DONE
|
|
|
|
|
|
|
|
|
|
;__PHL_________________________________________________________________________________________________________________________
|
|
;
|
|
; PRINT THE HL REG ON THE SERIAL PORT
|
|
;________________________________________________________________________________________________________________________________
|
|
;
|
|
PHL:
|
|
LD A,H ; GET HI BYTE
|
|
CALL HXOUT ; DO HEX OUT ROUTINE
|
|
LD A,L ; GET LOW BYTE
|
|
CALL HXOUT ; HEX IT
|
|
CALL SPACE ;
|
|
RET ; DONE
|
|
|
|
COUT_BUFFER:
|
|
.DB 00
|
|
.DB "$"
|
|
|
|
BASE_MSG:
|
|
.TEXT "CP/M IMAGE="
|
|
.db "$"
|
|
END_MSG:
|
|
.TEXT "TO "
|
|
.db "$"
|
|
SECTOR_MSG:
|
|
.TEXT "SECTORS/TRACK="
|
|
.db "$"
|
|
|
|
DRIVE_MSG:
|
|
.TEXT "DRIVE="
|
|
.db "$"
|
|
|
|
|
|
;__CBIOS_________________________________________________________________________________________________________________________
|
|
;
|
|
; CBIOS JUMP TABLE
|
|
;________________________________________________________________________________________________________________________________
|
|
;
|
|
|
|
SELDSK: ;SELECT DISK
|
|
PUSH BC ;
|
|
LD HL,(0001H) ;
|
|
LD BC,0024 ;
|
|
ADD HL,BC ;
|
|
POP BC ;
|
|
JP (HL) ;
|
|
SETTRK: ;SET DISK TRACK ADDR
|
|
PUSH BC ;
|
|
LD HL,(0001H) ;
|
|
LD BC,0027 ;
|
|
ADD HL,BC ;
|
|
POP BC ;
|
|
JP (HL) ;
|
|
SETSEC: ;SET DISK SECTOR ADDR
|
|
PUSH BC ;
|
|
LD HL,(0001H) ;
|
|
LD BC,0030 ;
|
|
ADD HL,BC ;
|
|
POP BC ;
|
|
JP (HL) ;
|
|
SETDMA: ;SET DMA BUFFER ADDR
|
|
PUSH BC ;
|
|
LD HL,(0001H) ;
|
|
LD BC,0033 ;
|
|
ADD HL,BC ;
|
|
POP BC ;
|
|
JP (HL) ;
|
|
READ: ;READ SECTOR
|
|
PUSH BC ;
|
|
LD HL,(0001H) ;
|
|
LD BC,0036 ;
|
|
ADD HL,BC ;
|
|
POP BC ;
|
|
JP (HL) ;
|
|
WRITE: ;WRITE SECTOR
|
|
PUSH BC ;
|
|
LD HL,(0001H) ;
|
|
LD BC,0039 ;
|
|
ADD HL,BC ;
|
|
POP BC ;
|
|
JP (HL) ;
|
|
|
|
|
|
|
|
CURTRACK: .DW 0 ; CURRENT TRACK
|
|
CURSECTOR: .DW 0 ; CURRENT SECTOR
|
|
CURADDRESS: .DW 0 ; CURRENT CP/M ADDRESS
|
|
DMAAD: .DW 5000H ; DIRECT MEMORY ADDRESS
|
|
|
|
CPMEND: .DW 0FDFFH ; END OF CP/M
|
|
SECTRACK: .DW 0100H ; SECTORS PER TRACK
|
|
CPMSTART: .DW 0D000H ; START OF CP/M
|
|
DEVICENUMBER: .DB 2 ; DEVICE ID
|
|
|
|
|
|
|
|
MSG_END:
|
|
.DB LF, CR ; LINE FEED AND CARRIAGE RETURN
|
|
.TEXT "BOOTGEN COMPLETED."
|
|
.DB LF, CR ; LINE FEED AND CARRIAGE RETURN
|
|
.DB "$" ; LINE TERMINATOR
|
|
MSG_VALID:
|
|
.DB LF, CR ; LINE FEED AND CARRIAGE RETURN
|
|
.TEXT "USAGE: BOOTGEN (DRIVE):"
|
|
.DB LF, CR ; LINE FEED AND CARRIAGE RETURN
|
|
.TEXT "(DRIVE) IS ANY VALID CP/M DRIVE:"
|
|
.DB LF, CR ; LINE FEED AND CARRIAGE RETURN
|
|
.DB "$" ; LINE TERMINATOR
|
|
|
|
|
|
.END
|
|
|
|
|
|
|