Browse Source

Monitor and RomLdr Updates

pull/23/head
Wayne Warthen 7 years ago
parent
commit
fd5636229d
  1. 2
      Source/CBIOS/ver.inc
  2. 17
      Source/HBIOS/API.txt
  3. 286
      Source/HBIOS/dbgmon.asm
  4. 2
      Source/HBIOS/dsky.asm
  5. 2
      Source/HBIOS/hbios.asm
  6. 594
      Source/HBIOS/romldr.asm
  7. 6
      Source/HBIOS/std.asm
  8. 9
      Source/HBIOS/util.asm
  9. 2
      Source/HBIOS/ver.inc

2
Source/CBIOS/ver.inc

@ -2,4 +2,4 @@
#DEFINE RMN 9 #DEFINE RMN 9
#DEFINE RUP 1 #DEFINE RUP 1
#DEFINE RTP 0 #DEFINE RTP 0
#DEFINE BIOSVER "2.9.1-pre.7"
#DEFINE BIOSVER "2.9.1-pre.8"

17
Source/HBIOS/API.txt

@ -215,7 +215,7 @@ INIT ($04):
DE=Line Characteristics DE=Line Characteristics
L=Terminal Type? L=Terminal Type?
Setup Parameter Word:
Line Characteristics:
_______________________________ _______________________________ _______________________________ _______________________________
| | | encoded || | | | | | | | | encoded || | | | | |
| |rts| Baud Rate ||dtr|xon| parity |stp| 8/7/6 | | |rts| Baud Rate ||dtr|xon| parity |stp| 8/7/6 |
@ -223,21 +223,6 @@ INIT ($04):
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
D register E register D register E register
_______________________________ _______________________________
| | | || | | | | |
| 0 0 |AFE|LP OT2 OT1 RTS DTR||DLB|BRK|STK EPS PEN|STB| WLS |
|_______|___|___________________||___|___|___________|___|_______|
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
-- MCR -- -- LCR --
_______________________________ _______________________________
| | re| te|~rs| er|8/7 pe stp|| | | | | | |
| 0 | 1 | 1 | 0 | 0 | m2 m1 m0|| 0 | 0 | ps|peo| dr| SSS |
|___|___|___|___|___|___________||___|___|___|___|___|___________|
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
CNTLA0 CNTLB0
QUERY ($05) QUERY ($05)
BC=Function/Unit A=Result BC=Function/Unit A=Result
DE=Line Characteristics (Baud, Flow Control, etc.) DE=Line Characteristics (Baud, Flow Control, etc.)

286
Source/HBIOS/dbgmon.asm

@ -19,13 +19,6 @@
; ;
#INCLUDE "std.asm" #INCLUDE "std.asm"
; ;
;__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_______________________________________________________________ ;__MAIN_PROGRAM_______________________________________________________________
; ;
; ORG 00100h ; FOR DEBUG IN CP/M (AS .COM) ; ORG 00100h ; FOR DEBUG IN CP/M (AS .COM)
@ -49,20 +42,20 @@ UART_ENTRY:
CALL INITIALIZE ; INITIALIZE SYSTEM CALL INITIALIZE ; INITIALIZE SYSTEM
LD HL,TXT_READY ; POINT AT TEXT LD HL,TXT_READY ; POINT AT TEXT
CALL MSG ; SHOW WE'RE HERE
CALL PRTSTR ; SHOW WE'RE HERE
; ;
;__SERIAL_MONITOR_COMMANDS____________________________________________________ ;__SERIAL_MONITOR_COMMANDS____________________________________________________
; ;
; B - BOOT SYSTEM ; B - BOOT SYSTEM
; D XXXX YYYY - DUMP MEMORY FROM XXXX TO YYYY ; D XXXX YYYY - DUMP MEMORY FROM XXXX TO YYYY
; F XXXX YYYY ZZ - FILL MEMORY FROM XXXX TO YYYY WITH ZZ ; F XXXX YYYY ZZ - FILL MEMORY FROM XXXX TO YYYY WITH ZZ
; H - LOAD INTEL HEX FORMAT DATA
; I XX - SHOW VALUE AT PORT XX
; K - ECHO KEYBOARD INPUT ; K - ECHO KEYBOARD INPUT
; L XX - INPUT FROM PORT XX AND SHOW HEX DATA
; M XXXX YYYY ZZZZ - MOVE MEMORY BLOCK XXXX TO YYYY TO ZZZZ
; O XX YY - OUTPUT TO PORT XX HEX DATA YY
; P XXXX - PROGRAM RAM STARTING AT XXXXH, WILL PROMPT FOR SUCCESSIVE VALUES
; R XXXX - RUN A PROGRAM FROM LOCATION XXXX
; L - LOAD INTEL HEX FORMAT DATA
; M XXXX YYYY ZZZZ - MOVE MEMORY BLOCK XXXX-YYYY TO ZZZZ
; O XX YY - WRITE VALUE YY TO PORT XX
; P XXXX - PROGRAM RAM STARTING AT XXXX, PROMPT FOR VALUES
; R XXXX - RUN A PROGRAM AT ADDRESS XXXX
; ;
;__COMMAND_PARSE______________________________________________________________ ;__COMMAND_PARSE______________________________________________________________
; ;
@ -72,7 +65,8 @@ UART_ENTRY:
SERIALCMDLOOP: SERIALCMDLOOP:
LD SP,MON_STACK ; RESET STACK LD SP,MON_STACK ; RESET STACK
CALL CRLFA ; CR,LF,>
LD HL,PROMPT ;
CALL PRTSTR ;
LD HL,KEYBUF ; SET POINTER TO KEYBUF AREA LD HL,KEYBUF ; SET POINTER TO KEYBUF AREA
CALL GETLN ; GET A LINE OF INPUT FROM THE USER CALL GETLN ; GET A LINE OF INPUT FROM THE USER
LD HL,KEYBUF ; RESET POINTER TO START OF KEYBUF LD HL,KEYBUF ; RESET POINTER TO START OF KEYBUF
@ -93,7 +87,7 @@ SERIALCMDLOOP:
JP Z,PIN ; PORT INPUT JP Z,PIN ; PORT INPUT
CP 'D' ; IS IT A "D" (Y/N) CP 'D' ; IS IT A "D" (Y/N)
JP Z,DUMPMEM ; DUMP MEMORY JP Z,DUMPMEM ; DUMP MEMORY
CP 'K'
CP 'K' ; IS IT A "K" (Y/N)
JP Z,KLOP ; LOOP ON KEYBOARD JP Z,KLOP ; LOOP ON KEYBOARD
CP 'M' ; IS IT A "M" (Y/N) CP 'M' ; IS IT A "M" (Y/N)
JP Z,MOVEMEM ; MOVE MEMORY COMMAND JP Z,MOVEMEM ; MOVE MEMORY COMMAND
@ -102,7 +96,7 @@ SERIALCMDLOOP:
CP 'H' ; IS IT A "H" (Y/N) CP 'H' ; IS IT A "H" (Y/N)
JP Z,HELP ; HELP COMMAND JP Z,HELP ; HELP COMMAND
LD HL,TXT_COMMAND ; POINT AT ERROR TEXT LD HL,TXT_COMMAND ; POINT AT ERROR TEXT
CALL MSG ; PRINT COMMAND LABEL
CALL PRTSTR ; PRINT COMMAND LABEL
JR SERIALCMDLOOP JR SERIALCMDLOOP
; ;
@ -130,9 +124,9 @@ INITIALIZE:
BOOT: BOOT:
#IF (PLATFORM == PLT_UNA) #IF (PLATFORM == PLT_UNA)
LD BC,$01FB ; UNA FUNC = SET BANK LD BC,$01FB ; UNA FUNC = SET BANK
LD DE,$0000 ; ROM BANK 0
LD DE,0 ; ROM BANK 0
CALL $FFFD ; DO IT (RST 08 NOT SAFE HERE) CALL $FFFD ; DO IT (RST 08 NOT SAFE HERE)
JP 0000H ; JUMP TO RESTART ADDRESS
JP 0 ; JUMP TO RESTART ADDRESS
#ELSE #ELSE
LD A,BID_BOOT ; BOOT BANK LD A,BID_BOOT ; BOOT BANK
LD HL,0 ; ADDRESS ZERO LD HL,0 ; ADDRESS ZERO
@ -167,14 +161,12 @@ PROGRM:
CP 0 ; TEST FOR TERMINATING NULL CP 0 ; TEST FOR TERMINATING NULL
JP NZ,ERR ; ERROR IF NOT TERMINATING NULL JP NZ,ERR ; ERROR IF NOT TERMINATING NULL
PROGRM1: PROGRM1:
CALL CRLF
CALL NEWLINE
POP HL POP HL
PUSH HL PUSH HL
CALL PHL CALL PHL
LD A,':'
CALL COUT
CALL SPACE
CALL COUT
CALL PC_COLON
CALL PC_SPACE
LD HL,KEYBUF LD HL,KEYBUF
CALL GETLN CALL GETLN
LD HL,KEYBUF LD HL,KEYBUF
@ -190,7 +182,7 @@ PROGRM1:
JR PROGRM1 JR PROGRM1
PROGRM2: PROGRM2:
LD HL,TXT_BADNUM LD HL,TXT_BADNUM
CALL MSG
CALL PRTSTR
JR PROGRM1 JR PROGRM1
; ;
;__KLOP_______________________________________________________________________ ;__KLOP_______________________________________________________________________
@ -199,10 +191,10 @@ PROGRM2:
;_____________________________________________________________________________ ;_____________________________________________________________________________
; ;
KLOP: KLOP:
CALL CRLF ;
CALL NEWLINE ;
KLOP1: KLOP1:
CALL KIN ; GET A KEY CALL KIN ; GET A KEY
CP ESC ; IS <ESC>?
CP CHR_ESC ; IS <ESC>?
JP Z,SERIALCMDLOOP ; IF SO, ALL DONE JP Z,SERIALCMDLOOP ; IF SO, ALL DONE
CALL COUT ; OUTPUT KEY TO SCREEN CALL COUT ; OUTPUT KEY TO SCREEN
JR KLOP1 ; LOOP JR KLOP1 ; LOOP
@ -231,7 +223,7 @@ KLOP1:
;_____________________________________________________________________________ ;_____________________________________________________________________________
; ;
HXLOAD: HXLOAD:
CALL CRLF ; SHOW READY
CALL NEWLINE ; SHOW READY
HXLOAD0: HXLOAD0:
CALL KIN ; GET THE FIRST CHARACTER, EXPECTING A ':' CALL KIN ; GET THE FIRST CHARACTER, EXPECTING A ':'
HXLOAD1: HXLOAD1:
@ -255,7 +247,7 @@ HXLOAD1:
CALL HXCHKSUM ; UPDATE HEX CHECK SUM CALL HXCHKSUM ; UPDATE HEX CHECK SUM
LD A,E ; RECALL THE CHECKSUM BYTE LD A,E ; RECALL THE CHECKSUM BYTE
AND A ; IS IT ZERO? AND A ; IS IT ZERO?
JP Z,HXLOADEXIT ; MUST BE O K., GO BACK FOR SOME MORE, ELSE
JR Z,HXLOADEXIT ; MUST BE O K., GO BACK FOR SOME MORE, ELSE
JR HXLOADERR ; CHECKSUMS DON'T ADD UP, ERROR OUT JR HXLOADERR ; CHECKSUMS DON'T ADD UP, ERROR OUT
HXLOAD2: HXLOAD2:
LD A,D ; RETRIEVE LINE CHARACTER COUNTER LD A,D ; RETRIEVE LINE CHARACTER COUNTER
@ -275,8 +267,8 @@ HXLOAD3:
JR Z,HXLOADAGAIN ; IF THE CHECKSUM IS STILL OK, CONTINUE ON, ELSE JR Z,HXLOADAGAIN ; IF THE CHECKSUM IS STILL OK, CONTINUE ON, ELSE
HXLOADERR: HXLOADERR:
LD HL,TXT_CKSUMERR ; GET "CHECKSUM ERROR" MESSAGE LD HL,TXT_CKSUMERR ; GET "CHECKSUM ERROR" MESSAGE
CALL MSG ; PRINT MESSAGE FROM (HL) AND TERMINATE THE LOAD
JP HXLOADEXIT ; RETURN TO PROMPT
CALL PRTSTR ; PRINT MESSAGE FROM (HL) AND TERMINATE THE LOAD
JR HXLOADEXIT ; RETURN TO PROMPT
HXCHKSUM: HXCHKSUM:
LD C,A ; BUILD THE CHECKSUM LD C,A ; BUILD THE CHECKSUM
LD A,E ; LD A,E ;
@ -286,7 +278,7 @@ HXCHKSUM:
RET ; BACK TO CALLER RET ; BACK TO CALLER
HXLOADAGAIN: HXLOADAGAIN:
CALL KIN ; CATCH THE TRAILING CARRIAGE RETURN CALL KIN ; CATCH THE TRAILING CARRIAGE RETURN
JP HXLOAD0 ; LOAD ANOTHER LINE OF DATA
JR HXLOAD0 ; LOAD ANOTHER LINE OF DATA
HXLOADEXIT: HXLOADEXIT:
CALL KIN ; CATCH ANY STRAY TRAILING CHARACTERS CALL KIN ; CATCH ANY STRAY TRAILING CHARACTERS
JP SERIALCMDLOOP ; RETURN TO PROMPT JP SERIALCMDLOOP ; RETURN TO PROMPT
@ -323,10 +315,10 @@ PIN:
CALL WORDPARM ; GET PORT NUMBER CALL WORDPARM ; GET PORT NUMBER
JP C,ERR ; HANDLE ERRORS JP C,ERR ; HANDLE ERRORS
PUSH DE ; SAVE IT PUSH DE ; SAVE IT
CALL CRLF ;
CALL NEWLINE ;
POP BC ; RESTORE TO BC POP BC ; RESTORE TO BC
IN A,(C) ; GET PORT VALUE IN A,(C) ; GET PORT VALUE
CALL HXOUT ; PRINT HEX VALUE
CALL PRTHEXBYTE ; DISPLAY IT
JP SERIALCMDLOOP ; DONE, BACK TO COMMAND LOOP JP SERIALCMDLOOP ; DONE, BACK TO COMMAND LOOP
; ;
;__DUMPMEM____________________________________________________________________ ;__DUMPMEM____________________________________________________________________
@ -348,13 +340,11 @@ DUMPMEM:
GDATA: GDATA:
INC DE ; BUMP DE FOR LATER COMPARE INC DE ; BUMP DE FOR LATER COMPARE
CALL CRLF ;
CALL NEWLINE ;
BLKRD: BLKRD:
CALL PHL ; PRINT START LOCATION CALL PHL ; PRINT START LOCATION
LD A,':'
CALL COUT
CALL SPACE
CALL COUT
CALL PC_COLON
CALL PC_SPACE
LD C,16 ; SET FOR 16 LOCS LD C,16 ; SET FOR 16 LOCS
PUSH HL ; SAVE STARTING HL PUSH HL ; SAVE STARTING HL
NXTONE: NXTONE:
@ -363,20 +353,20 @@ NXTONE:
IN A,(C) ; IN A,(C) ;
EXX ; EXX ;
AND 7FH ; AND 7FH ;
CP ESC ;
CP CHR_ESC ;
JP Z,SERIALCMDLOOP ; JP Z,SERIALCMDLOOP ;
CP 19 ; CP 19 ;
JR Z,NXTONE ; JR Z,NXTONE ;
LD A,(HL) ; GET BYTE LD A,(HL) ; GET BYTE
CALL HXOUT ; PRINT IT
CALL SPACE ;
CALL PRTHEXBYTE ; DISPLAY IT
CALL PC_SPACE ;
UPDH: UPDH:
INC HL ; POINT NEXT INC HL ; POINT NEXT
DEC C ; DEC LOC COUNT DEC C ; DEC LOC COUNT
JR NZ,NXTONE ; IF LINE NOT DONE JR NZ,NXTONE ; IF LINE NOT DONE
; NOW PRINT 'DECODED' DATA TO RIGHT OF DUMP ; NOW PRINT 'DECODED' DATA TO RIGHT OF DUMP
PCRLF: PCRLF:
CALL SPACE ; SPACE IT
CALL PC_SPACE ; SPACE IT
LD C,16 ; SET FOR 16 CHARS LD C,16 ; SET FOR 16 CHARS
POP HL ; GET BACK START POP HL ; GET BACK START
PCRLF0: PCRLF0:
@ -401,8 +391,8 @@ UPDH1:
DEC C ; DEC CHAR COUNT DEC C ; DEC CHAR COUNT
JR NZ,PCRLF0 ; DO NEXT JR NZ,PCRLF0 ; DO NEXT
CONTD: CONTD:
CALL CRLF ;
JP BLKRD ;
CALL NEWLINE ;
JR BLKRD ;
; ;
;__MOVEMEM____________________________________________________________________ ;__MOVEMEM____________________________________________________________________
; ;
@ -484,7 +474,7 @@ FILLMEM1:
; ;
HELP: HELP:
LD HL,TXT_HELP ; POINT AT SYNTAX HELP TEXT LD HL,TXT_HELP ; POINT AT SYNTAX HELP TEXT
CALL MSG ; DISPLAY IT
CALL PRTSTR ; DISPLAY IT
JP SERIALCMDLOOP ; AND BACK TO COMMAND LOOP JP SERIALCMDLOOP ; AND BACK TO COMMAND LOOP
; ;
;__ERR________________________________________________________________________ ;__ERR________________________________________________________________________
@ -494,7 +484,7 @@ HELP:
; ;
ERR: ERR:
LD HL,TXT_ERR ; POINT AT ERROR TEXT LD HL,TXT_ERR ; POINT AT ERROR TEXT
CALL MSG ; DISPLAY IT
CALL PRTSTR ; DISPLAY IT
JP SERIALCMDLOOP ; AND BACK TO COMMAND LOOP JP SERIALCMDLOOP ; AND BACK TO COMMAND LOOP
; ;
;__BYTEPARM___________________________________________________________________ ;__BYTEPARM___________________________________________________________________
@ -507,7 +497,7 @@ BYTEPARM:
CALL NONBLANK ; SKIP LEADING BLANKS CALL NONBLANK ; SKIP LEADING BLANKS
JP Z,ERR ; SYNTAX ERROR IF PARM NOT FOUND JP Z,ERR ; SYNTAX ERROR IF PARM NOT FOUND
CALL ISHEX ; HEX CHAR? CALL ISHEX ; HEX CHAR?
JP NZ,BYTEPARM1 ; IF NOT, ERR
JR NZ,BYTEPARM1 ; IF NOT, ERR
JP HEXBYTE ; RETURN VIA HEXBYTE JP HEXBYTE ; RETURN VIA HEXBYTE
BYTEPARM1: BYTEPARM1:
SCF ; SIGNAL ERROR SCF ; SIGNAL ERROR
@ -523,11 +513,8 @@ WORDPARM:
CALL NONBLANK ; SKIP LEADING BLANKS CALL NONBLANK ; SKIP LEADING BLANKS
JP Z,ERR ; SYNTAX ERROR IF PARM NOT FOUND JP Z,ERR ; SYNTAX ERROR IF PARM NOT FOUND
CALL ISHEX ; HEX CHAR? CALL ISHEX ; HEX CHAR?
JP NZ,WORDPARM1 ; IF NOT, ERR
JR NZ,BYTEPARM1 ; IF NOT, ERR
JP HEXWORD ; RETURN VIA HEXWORD JP HEXWORD ; RETURN VIA HEXWORD
WORDPARM1:
SCF ; SIGNAL ERROR
RET ; RETURN
; ;
;__GETLN______________________________________________________________________ ;__GETLN______________________________________________________________________
; ;
@ -540,10 +527,10 @@ GETLN:
PUSH DE ; STORE DE PUSH DE ; STORE DE
GETLNLOP: GETLNLOP:
CALL KIN ; GET A KEY CALL KIN ; GET A KEY
CP CR ; IS <CR>?
CP CHR_CR ; IS <CR>?
JR Z,GETLNDONE ; YES, EXIT JR Z,GETLNDONE ; YES, EXIT
CALL COUT ; OUTPUT KEY TO SCREEN CALL COUT ; OUTPUT KEY TO SCREEN
CP BS ; IS <BS>?
CP CHR_BS ; IS <BS>?
JR NZ,GETLNSTORE ; NO, STORE CHAR JR NZ,GETLNSTORE ; NO, STORE CHAR
LD A,C ; A=C LD A,C ; A=C
CP 0 ; CP 0 ;
@ -554,7 +541,7 @@ GETLNLOP:
LD (HL),A ; STORE NULL IN BUFFER LD (HL),A ; STORE NULL IN BUFFER
LD A,20H ; BLANK OUT CHAR ON TERM LD A,20H ; BLANK OUT CHAR ON TERM
CALL COUT ; CALL COUT ;
LD A,BS ;
LD A,CHR_BS ;
CALL COUT ; CALL COUT ;
JR GETLNLOP ; GET NEXT KEY JR GETLNLOP ; GET NEXT KEY
GETLNSTORE: GETLNSTORE:
@ -584,30 +571,6 @@ KIN:
AND 5FH ; MAKE UPPER CASE AND 5FH ; MAKE UPPER CASE
RET RET
; ;
;__CRLFA______________________________________________________________________
;
; PRINT COMMAND PROMPT TO THE SERIAL PORT
;_____________________________________________________________________________
;
CRLFA:
PUSH HL ; PROTECT HL FROM OVERWRITE
LD HL,PROMPT ;
CALL MSG ;
POP HL ; PROTECT HL FROM OVERWRITE
RET ; DONE
;
;__CRLF_______________________________________________________________________
;
; SEND CR & LF TO THE SERIAL PORT
;_____________________________________________________________________________
;
CRLF:
PUSH HL ; PROTECT HL FROM OVERWRITE
LD HL,TCRLF ; LOAD MESSAGE POINTER
CALL MSG ; SEBD MESSAGE TO SERIAL PORT
POP HL ; PROTECT HL FROM OVERWRITE
RET ;
;
;__NONBLANK___________________________________________________________________ ;__NONBLANK___________________________________________________________________
; ;
; FIND NEXT NONBLANK CHARACTER IN BUFFER AT (HL) ; FIND NEXT NONBLANK CHARACTER IN BUFFER AT (HL)
@ -715,9 +678,9 @@ ALPH:
;_____________________________________________________________________________ ;_____________________________________________________________________________
; ;
HEXINS: HEXINS:
PUSH BC ;SAVE BC REGS
CALL NIBLS ;DO A NIBBLE
RLC A ;MOVE FIRST BYTE UPPER NIBBLE
PUSH BC ; SAVE BC REGS
CALL NIBLS ; DO A NIBBLE
RLC A ; MOVE FIRST BYTE UPPER NIBBLE
RLC A ; RLC A ;
RLC A ; RLC A ;
RLC A ; RLC A ;
@ -740,66 +703,11 @@ NIBLS:
; ;
PHL: PHL:
LD A,H ; GET HI BYTE LD A,H ; GET HI BYTE
CALL HXOUT ; DO HEX OUT ROUTINE
CALL PRTHEXBYTE ; DISPLAY IT
LD A,L ; GET LOW BYTE LD A,L ; GET LOW BYTE
CALL HXOUT ; HEX IT
CALL PRTHEXBYTE ; DISPLAY IT
RET ; DONE RET ; DONE
; ;
;__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
;
;__MSG________________________________________________________________________
;
; PRINT A STRING TO THE SERIAL PORT
;_____________________________________________________________________________
;
MSG:
LD A,(HL) ; GET CHARACTER TO A
OR A ; SET FLAGS
RET Z ; DONE IF NULL
CALL COUT ; PRINT CHARACTER
INC HL ; INC POINTER, TO NEXT CHAR
JR MSG ; LOOP
;
#IF (PLATFORM == PLT_UNA) #IF (PLATFORM == PLT_UNA)
; ;
;__COUT_______________________________________________________________________ ;__COUT_______________________________________________________________________
@ -957,49 +865,49 @@ KEYBUF: .FILL 80,' '
;_____________________________________________________________________________ ;_____________________________________________________________________________
; ;
TCRLF: TCRLF:
.DB CR,LF,0
.DB CHR_CR,CHR_LF,'$'
PROMPT: PROMPT:
.DB CR,LF,'>',0
.DB CHR_CR,CHR_LF,'>','$'
TXT_READY: TXT_READY:
.DB CR,LF
.DB CHR_CR,CHR_LF
.TEXT "MONITOR READY ('H' FOR HELP)" .TEXT "MONITOR READY ('H' FOR HELP)"
.DB 0
.DB '$'
TXT_COMMAND: TXT_COMMAND:
.DB CR,LF
.DB CHR_CR,CHR_LF
.TEXT "UNKNOWN COMMAND ('H' FOR HELP)" .TEXT "UNKNOWN COMMAND ('H' FOR HELP)"
.DB 0
.DB '$'
TXT_ERR: TXT_ERR:
.DB CR,LF
.DB CHR_CR,CHR_LF
.TEXT "SYNTAX ERROR ('H' FOR HELP)" .TEXT "SYNTAX ERROR ('H' FOR HELP)"
.DB 0
.DB '$'
TXT_CKSUMERR: TXT_CKSUMERR:
.DB CR,LF
.DB CHR_CR,CHR_LF
.TEXT "CHECKSUM ERROR" .TEXT "CHECKSUM ERROR"
.DB 0
.DB '$'
TXT_BADNUM: TXT_BADNUM:
.TEXT " *INVALID VALUE*" .TEXT " *INVALID VALUE*"
.DB 0
.DB '$'
TXT_HELP: TXT_HELP:
.DB CR,LF
.DB CHR_CR,CHR_LF
.TEXT "MONITOR COMMANDS (ALL VALUES IN HEX):\r\n" .TEXT "MONITOR COMMANDS (ALL VALUES IN HEX):\r\n"
.TEXT "B - BOOT SYSTEM\r\n" .TEXT "B - BOOT SYSTEM\r\n"
.TEXT "D XXXX YYYY - DUMP MEMORY FROM XXXX TO YYYY\r\n" .TEXT "D XXXX YYYY - DUMP MEMORY FROM XXXX TO YYYY\r\n"
.TEXT "F XXXX YYYY ZZ - FILL MEMORY FROM XXXX TO YYYY WITH ZZ\r\n" .TEXT "F XXXX YYYY ZZ - FILL MEMORY FROM XXXX TO YYYY WITH ZZ\r\n"
.TEXT "I XX - SHOW VALUE FROM PORT XX\r\n"
.TEXT "I XX - SHOW VALUE AT PORT XX\r\n"
.TEXT "K - ECHO KEYBOARD INPUT\r\n" .TEXT "K - ECHO KEYBOARD INPUT\r\n"
.TEXT "L - LOAD INTEL HEX FORMAT DATA\r\n" .TEXT "L - LOAD INTEL HEX FORMAT DATA\r\n"
.TEXT "M XXXX YYYY ZZZZ - MOVE MEMORY BLOCK XXXX-YYYY TO ZZZZ\r\n" .TEXT "M XXXX YYYY ZZZZ - MOVE MEMORY BLOCK XXXX-YYYY TO ZZZZ\r\n"
.TEXT "O XX YY - WRITE VALUE YY TO PORT XX\r\n" .TEXT "O XX YY - WRITE VALUE YY TO PORT XX\r\n"
.TEXT "P XXXX - PROGRAM RAM STARTING AT XXXX\r\n" .TEXT "P XXXX - PROGRAM RAM STARTING AT XXXX\r\n"
.TEXT "R XXXX - RUN A PROGRAM AT ADDRESS XXXX" .TEXT "R XXXX - RUN A PROGRAM AT ADDRESS XXXX"
.DB 0
.DB '$'
; ;
#IF DSKYENABLE #IF DSKYENABLE
; ;
@ -1062,6 +970,8 @@ DOBOOT:
;__DOPORTREAD_________________________________________________________________ ;__DOPORTREAD_________________________________________________________________
; ;
; PERFORM PORT READ FRONT PANEL ACTION ; PERFORM PORT READ FRONT PANEL ACTION
; PANEL TEMPLATE "Po88 88"
; POS 01234567
;_____________________________________________________________________________ ;_____________________________________________________________________________
; ;
DOPORTREAD: DOPORTREAD:
@ -1072,33 +982,33 @@ PORTREADLOOP:
SRL A ; SRL A ;
SRL A ; SRL A ;
SRL A ; SRL A ;
LD (DISPLAYBUF+2),A ; SHOW HIGH NIB IN DISP 5
LD (DISPLAYBUF+2),A ; SHOW HIGH NIB IN DISP 2
LD A,C ; RESTORE PORT VALUE INTO "A" LD A,C ; RESTORE PORT VALUE INTO "A"
AND 0FH ; CLEAR HIGH NIB, LEAVING LOW AND 0FH ; CLEAR HIGH NIB, LEAVING LOW
LD (DISPLAYBUF+3),A ; SHOW LOW NIB IN DISP 4
LD (DISPLAYBUF+3),A ; SHOW LOW NIB IN DISP 3
IN A,(C) ; GET PORT VALUE FROM PORT IN "C" IN A,(C) ; GET PORT VALUE FROM PORT IN "C"
LD C,A ; STORE VALUE IN "C" LD C,A ; STORE VALUE IN "C"
SRL A ; ROTATE HIGH NIB TO LOW SRL A ; ROTATE HIGH NIB TO LOW
SRL A ; SRL A ;
SRL A ; SRL A ;
SRL A ; SRL A ;
LD (DISPLAYBUF+6),A ; SHOW HIGH NIB IN DISP 1
LD (DISPLAYBUF+6),A ; SHOW HIGH NIB IN DISP 6
LD A,C ; RESTORE VALUE TO "A" LD A,C ; RESTORE VALUE TO "A"
AND 0FH ; CLEAR HIGH NIB, LEAVING LOW AND 0FH ; CLEAR HIGH NIB, LEAVING LOW
LD (DISPLAYBUF+7),A ; DISPLAY LOW NIB IN DISP 0
LD (DISPLAYBUF+7),A ; DISPLAY LOW NIB IN DISP 7
LD A,10H ; CLEAR OTHER DISPLAYS LD A,10H ; CLEAR OTHER DISPLAYS
LD (DISPLAYBUF+5),A ; LD (DISPLAYBUF+5),A ;
LD (DISPLAYBUF+4),A ; LD (DISPLAYBUF+4),A ;
LD A,13H ; "P" LD A,13H ; "P"
LD (DISPLAYBUF+0),A ; STORE IN DISP 7
LD (DISPLAYBUF+0),A ; STORE IN DISP 0
LD A,14H ; "O" LD A,14H ; "O"
LD (DISPLAYBUF+1),A ; STORE IN DISP 6
LD (DISPLAYBUF+1),A ; STORE IN DISP 1
LD HL,DISPLAYBUF ; SET POINTER TO DISPLAY BUFFER LD HL,DISPLAYBUF ; SET POINTER TO DISPLAY BUFFER
CALL ENCDISPLAY ; DISPLAY BUFFER CONTENTS CALL ENCDISPLAY ; DISPLAY BUFFER CONTENTS
PORTREADGETKEY: PORTREADGETKEY:
CALL KB_GET ; GET KEY FROM KB CALL KB_GET ; GET KEY FROM KB
CP 12H ; [CL] PRESSED, EXIT CP 12H ; [CL] PRESSED, EXIT
JP Z,PORTREADEXIT ;
JR Z,PORTREADEXIT ;
CP 10H ; [PR] PRESSED, PROMPT FOR NEW PORT CP 10H ; [PR] PRESSED, PROMPT FOR NEW PORT
JR Z,DOPORTREAD ; JR Z,DOPORTREAD ;
JR PORTREADGETKEY ; NO VALID KEY, LOOP JR PORTREADGETKEY ; NO VALID KEY, LOOP
@ -1110,6 +1020,8 @@ PORTREADEXIT:
;__DOPORTWRITE________________________________________________________________ ;__DOPORTWRITE________________________________________________________________
; ;
; PERFORM PORT WRITE FRONT PANEL ACTION ; PERFORM PORT WRITE FRONT PANEL ACTION
; PANEL TEMPLATE "Po88 88"
; POS 01234567
;_____________________________________________________________________________ ;_____________________________________________________________________________
; ;
DOPORTWRITE: DOPORTWRITE:
@ -1120,16 +1032,16 @@ PORTWRITELOOP:
SRL A ; SRL A ;
SRL A ; SRL A ;
SRL A ; SRL A ;
LD (DISPLAYBUF+2),A ; DISPLAY HIGH NIB IN DISPLAY 5
LD (DISPLAYBUF+2),A ; DISPLAY HIGH NIB IN DISPLAY 2
LD A,C ; RESTORE PORT VALUE INTO "A" LD A,C ; RESTORE PORT VALUE INTO "A"
AND 0FH ; CLEAR OUT HIGH NIB AND 0FH ; CLEAR OUT HIGH NIB
LD (DISPLAYBUF+3),A ; DISPLAY LOW NIB IN DISPLAY 4
LD A,10H ; CLEAR OUT DISPLAYS 2 AND 3
LD (DISPLAYBUF+3),A ; DISPLAY LOW NIB IN DISPLAY 3
LD A,10H ; CLEAR OUT DISPLAYS 4 AND 5
LD (DISPLAYBUF+5),A ; LD (DISPLAYBUF+5),A ;
LD (DISPLAYBUF+4),A ; LD (DISPLAYBUF+4),A ;
LD A,13H ; DISPLAY "P" IN DISP 7
LD A,13H ; DISPLAY "P" IN DISP 0
LD (DISPLAYBUF+0),A ; LD (DISPLAYBUF+0),A ;
LD A,14H ; DISPLAY "O" IN DISP 6
LD A,14H ; DISPLAY "O" IN DISP 1
LD (DISPLAYBUF+1),A ; LD (DISPLAYBUF+1),A ;
LD HL,DISPLAYBUF ; POINT TO DISPLAY BUFFER LD HL,DISPLAYBUF ; POINT TO DISPLAY BUFFER
CALL GETVALUE ; INPUT A BYTE VALUE, RETURN IN "A" CALL GETVALUE ; INPUT A BYTE VALUE, RETURN IN "A"
@ -1150,6 +1062,8 @@ DOGO:
;__DODEPOSIT__________________________________________________________________ ;__DODEPOSIT__________________________________________________________________
; ;
; PERFORM DEPOSIT FRONT PANEL ACTION ; PERFORM DEPOSIT FRONT PANEL ACTION
; PANEL TEMPLATE "8888 88"
; POS 01234567
;_____________________________________________________________________________ ;_____________________________________________________________________________
; ;
DODEPOSIT: DODEPOSIT:
@ -1183,7 +1097,7 @@ DEPOSITLOOP:
DEPOSITGETKEY: DEPOSITGETKEY:
CALL KB_GET ; GET KEY FROM KB CALL KB_GET ; GET KEY FROM KB
CP 12H ; [CL] PRESSED, EXIT CP 12H ; [CL] PRESSED, EXIT
JP Z,DEPOSITEXIT ;
JR Z,DEPOSITEXIT ;
CP 13H ; [EN] PRESSED, INC ADDRESS AND LOOP CP 13H ; [EN] PRESSED, INC ADDRESS AND LOOP
JR Z,DEPOSITFW ; JR Z,DEPOSITFW ;
CP 14H ; [DE] PRESSED, PROMPT FOR NEW ADDRESS CP 14H ; [DE] PRESSED, PROMPT FOR NEW ADDRESS
@ -1201,6 +1115,8 @@ DEPOSITEXIT:
;__DOEXAMINE__________________________________________________________________ ;__DOEXAMINE__________________________________________________________________
; ;
; PERFORM EXAMINE FRONT PANEL ACTION ; PERFORM EXAMINE FRONT PANEL ACTION
; PANEL TEMPLATE "8888 88"
; POS 01234567
;_____________________________________________________________________________ ;_____________________________________________________________________________
; ;
DOEXAMINE: DOEXAMINE:
@ -1208,41 +1124,41 @@ DOEXAMINE:
PUSH HL ; STORE HL PUSH HL ; STORE HL
EXAMINELOOP: EXAMINELOOP:
LD A,H ; MOVE HIGH BYTE IN "A" LD A,H ; MOVE HIGH BYTE IN "A"
SRL A ; SHOW HIGH NIBBLE IN DISP 7
SRL A ; SHOW HIGH NIBBLE IN DISP 0
SRL A ; SRL A ;
SRL A ; SRL A ;
SRL A ; SRL A ;
LD (DISPLAYBUF+0),A ; LD (DISPLAYBUF+0),A ;
LD A,H ; RESTORE HIGH BYTE LD A,H ; RESTORE HIGH BYTE
AND 0FH ; CLEAR HIGH NIBBLE AND 0FH ; CLEAR HIGH NIBBLE
LD (DISPLAYBUF+1),A ; DISPLAY LOW NIBBLE IN DISP 6
LD (DISPLAYBUF+1),A ; DISPLAY LOW NIBBLE IN DISP 1
LD A,L ; PUT LOW BYTE IN "A" LD A,L ; PUT LOW BYTE IN "A"
SRL A ; SHOW HIGH NIBBLE IN DISP 5
SRL A ; SHOW HIGH NIBBLE IN DISP 2
SRL A ; SRL A ;
SRL A ; SRL A ;
SRL A ; SRL A ;
LD (DISPLAYBUF+2),A ; LD (DISPLAYBUF+2),A ;
LD A,L ; RESTORE LOW BYTE IN "A" LD A,L ; RESTORE LOW BYTE IN "A"
AND 0FH ; CLEAR OUT HIGH NIBBLE AND 0FH ; CLEAR OUT HIGH NIBBLE
LD (DISPLAYBUF+3),A ; DISPLAY LOW NIBBLE IN DISP 4
LD A,10H ; CLEAR OUT DISP 3
LD (DISPLAYBUF+3),A ; DISPLAY LOW NIBBLE IN DISP 3
LD A,10H ; CLEAR OUT DISP 4
LD (DISPLAYBUF+4),A ; LD (DISPLAYBUF+4),A ;
LD A,(HL) ; GET VALUE FROM ADDRESS IN HL LD A,(HL) ; GET VALUE FROM ADDRESS IN HL
SRL A ; DISPLAY HIGH NIB IN DISPLAY 1
SRL A ; DISPLAY HIGH NIB IN DISPLAY 6
SRL A ; SRL A ;
SRL A ; SRL A ;
SRL A ; SRL A ;
LD (DISPLAYBUF+6),A ; LD (DISPLAYBUF+6),A ;
LD A,(HL) ; GET VALUE FROM ADDRESS IN HL LD A,(HL) ; GET VALUE FROM ADDRESS IN HL
AND 0FH ; CLEAR OUT HIGH NIBBLE AND 0FH ; CLEAR OUT HIGH NIBBLE
LD (DISPLAYBUF+7),A ; DISPLAY LOW NIBBLE IN DISPLAY 0
LD (DISPLAYBUF+7),A ; DISPLAY LOW NIBBLE IN DISPLAY 7
LD HL,DISPLAYBUF ; POINT TO DISPLAY BUFFER LD HL,DISPLAYBUF ; POINT TO DISPLAY BUFFER
CALL ENCDISPLAY ; DISPLAY BUFFER ON DISPLAYS CALL ENCDISPLAY ; DISPLAY BUFFER ON DISPLAYS
POP HL ; RESTORE HL POP HL ; RESTORE HL
EXAMINEGETKEY: EXAMINEGETKEY:
CALL KB_GET ; GET KEY FROM KB CALL KB_GET ; GET KEY FROM KB
CP 12H ; [CL] PRESSED, EXIT CP 12H ; [CL] PRESSED, EXIT
JP Z,EXAMINEEXIT ;
JR Z,EXAMINEEXIT ;
CP 13H ; [EN] PRESSED, INC ADDRESS AND LOOP CP 13H ; [EN] PRESSED, INC ADDRESS AND LOOP
JR Z,EXAMINEFW ; JR Z,EXAMINEFW ;
CP 15H ; [DE] PRESSED, PROMPT FOR NEW ADDRESS CP 15H ; [DE] PRESSED, PROMPT FOR NEW ADDRESS
@ -1260,6 +1176,8 @@ EXAMINEEXIT:
;__GETADDR____________________________________________________________________ ;__GETADDR____________________________________________________________________
; ;
; GET ADDRESS FROM FRONT PANEL ; GET ADDRESS FROM FRONT PANEL
; PANEL TEMPLATE "Adr 8888"
; POS 01234567
;_____________________________________________________________________________ ;_____________________________________________________________________________
; ;
GETADDR: GETADDR:
@ -1283,27 +1201,27 @@ GETADDRLOOP:
JR GETADDRLOOP ; INVALID KEY, LOOP JR GETADDRLOOP ; INVALID KEY, LOOP
GETADDRDONE: GETADDRDONE:
LD HL,00H ; HL=0 LD HL,00H ; HL=0
LD A,(DISPLAYBUF+6) ; GET DIGIT IN DISPLAY 1
LD A,(DISPLAYBUF+6) ; GET DIGIT IN DISPLAY 6
SLA A ; ROTATE IT TO HIGH NIBBLE SLA A ; ROTATE IT TO HIGH NIBBLE
SLA A ; SLA A ;
SLA A ; SLA A ;
SLA A ; SLA A ;
LD C,A ; STORE IT IN "C" LD C,A ; STORE IT IN "C"
LD A,(DISPLAYBUF+7) ; GET DIGIT IN DISPLAY 0
LD A,(DISPLAYBUF+7) ; GET DIGIT IN DISPLAY 7
AND 0FH ; CLEAR HIGH NIBBLE AND 0FH ; CLEAR HIGH NIBBLE
OR C ; ADD IN NIBBLE STORED IN C OR C ; ADD IN NIBBLE STORED IN C
LD L,A ; STORE IT IN LOW BYTE OF ADDRESS POINTER LD L,A ; STORE IT IN LOW BYTE OF ADDRESS POINTER
LD A,(DISPLAYBUF+4) ; GET DIGIT IN DISPLAY 3
LD A,(DISPLAYBUF+4) ; GET DIGIT IN DISPLAY 4
SLA A ; ROTATE IT TO HIGH NIBBLE SLA A ; ROTATE IT TO HIGH NIBBLE
SLA A ; SLA A ;
SLA A ; SLA A ;
SLA A ; SLA A ;
LD C,A ; STORE IT IN "C" LD C,A ; STORE IT IN "C"
LD A,(DISPLAYBUF+5) ; GET DIGIT IN DISPLAY 2
LD A,(DISPLAYBUF+5) ; GET DIGIT IN DISPLAY 5
AND 0FH ; CLEAR HIGH NIBBLE AND 0FH ; CLEAR HIGH NIBBLE
OR C ; ADD IN NIBBLE STORED IN "C" OR C ; ADD IN NIBBLE STORED IN "C"
LD H,A ; STORE BYTE IN HIGH BYTE OF ADDRESS POINTER LD H,A ; STORE BYTE IN HIGH BYTE OF ADDRESS POINTER
LD A,10H ; CLEAR OUT DISPLAYS 0,1,2 & 3
LD A,10H ; CLEAR OUT DISPLAYS 4,5,6 & 7
LD (DISPLAYBUF+7),A ; LD (DISPLAYBUF+7),A ;
LD (DISPLAYBUF+6),A ; LD (DISPLAYBUF+6),A ;
LD (DISPLAYBUF+5),A ; LD (DISPLAYBUF+5),A ;
@ -1325,8 +1243,11 @@ GETADDRNUM:
;__GETPORT____________________________________________________________________ ;__GETPORT____________________________________________________________________
; ;
; GET PORT FROM FRONT PANEL ; GET PORT FROM FRONT PANEL
; PANEL TEMPLATE "Port 88"
; POS 01234567
;_____________________________________________________________________________ ;_____________________________________________________________________________
; ;
;***use getvalue below after init of displaybuf
GETPORT: GETPORT:
PUSH BC ; STORE BC PUSH BC ; STORE BC
GETPORT0: GETPORT0:
@ -1374,6 +1295,8 @@ GETPORTNUM:
;__GETVALUE___________________________________________________________________ ;__GETVALUE___________________________________________________________________
; ;
; GET VALUE FROM FRONT PANEL ; GET VALUE FROM FRONT PANEL
; PANEL TEMPLATE "??????88"
; POS 01234567
;_____________________________________________________________________________ ;_____________________________________________________________________________
; ;
GETVALUE: GETVALUE:
@ -1415,10 +1338,10 @@ GETVALUENUM:
LD (DISPLAYBUF+7),A ; LD (DISPLAYBUF+7),A ;
JR GETVALUE1 ; JR GETVALUE1 ;
GETVALUECLEAR: GETVALUECLEAR:
LD A,12H ;
LD A,00H ;
LD (DISPLAYBUF+7),A ; LD (DISPLAYBUF+7),A ;
LD (DISPLAYBUF+6),A ; LD (DISPLAYBUF+6),A ;
JP GETVALUE1 ;
JR GETVALUE1 ;
; ;
;__MTERM_INIT_________________________________________________________________ ;__MTERM_INIT_________________________________________________________________
; ;
@ -1481,6 +1404,7 @@ ENCDISPLAY1:
; ;
;_____________________________________________________________________________ ;_____________________________________________________________________________
; ;
;***remove this and replace occurences with dsky_showraw
SEGDISPLAY: SEGDISPLAY:
PUSH AF PUSH AF
PUSH BC PUSH BC

2
Source/HBIOS/dsky.asm

@ -44,7 +44,7 @@ KY_BO .EQU 017H ; BOOT
; ;
;__DSKY_INIT_________________________________________________________________________________________ ;__DSKY_INIT_________________________________________________________________________________________
; ;
; CHECK FOR KEY PRESS, SAVE RAW VALUE, RETURN STATUS
; CONFIGURE PARALLEL PORT AND CLEAR ANY BUFFERED CHARACTER
;____________________________________________________________________________________________________ ;____________________________________________________________________________________________________
; ;
DSKY_INIT: DSKY_INIT:

2
Source/HBIOS/hbios.asm

@ -1099,7 +1099,7 @@ INITSYS3:
; ;
#IFDEF ROMBOOT #IFDEF ROMBOOT
; PERFORM BANK CALL TO OS IMAGES BANK IN ROM ; PERFORM BANK CALL TO OS IMAGES BANK IN ROM
LD A,BID_BIOSIMG ; CHAIN TO OS IMAGES BANK
LD A,BID_IMG0 ; CHAIN TO OS IMAGES BANK
LD HL,0 ; ENTER AT ADDRESS 0 LD HL,0 ; ENTER AT ADDRESS 0
CALL HBX_BNKCALL ; GO THERE CALL HBX_BNKCALL ; GO THERE
HALT ; WE SHOULD NEVER COME BACK! HALT ; WE SHOULD NEVER COME BACK!

594
Source/HBIOS/romldr.asm

@ -1,13 +1,41 @@
; ;
;================================================================================================== ;==================================================================================================
; LOADER
; ROMWBW LOADER
;================================================================================================== ;==================================================================================================
; ;
; THE LOADER CODE IS INVOKED IMMEDIATELY AFTER HBIOS COMPLETES SYSTEM INITIALIZATION.
; IT IS RESPONSIBLE FOR LOADING A RUNNABLE IMAGE (OPERATING SYSTEM, ETC.) INTO MEMORY
; AND TRANSFERRING CONTROL TO THAT IMAGE. THE IMAGE MAY COME FROM ROM (ROMBOOT),
; RAM (APPBOOT/IMGBOOT) OR FROM DISK (DISK BOOT).
;
; IN THE CASE OF A ROM BOOT, THE SELECTED EXECUTABLE IMAGE IS COPIED FROM ROM
; INTO A THE DEFAULT RAM AND THEN CONTROL IS PASSED TO THE STARTING ADDRESS
; IN RAM. IN THE CASE OF AN APPBOOT OR IMGBOOT STARTUP (SEE HBIOS.ASM)
; THE SOURCE OF THE IMAGE MAY BE RAM.
;
; IN THE CASE OF A DISK BOOT, SECTOR 2 (THE THIRD SECTOR) OF THE DISK DEVICE WILL
; BE READ -- THIS IS REFERRED TO AS THE BOOT INFO SECTOR AND IS EXPECTED TO HAVE
; THE FORMAT DEFINED AT BL_INFOSEC BELOW. THE LAST THREE WORDS OF DATA IN THIS
; SECTOR DETERMINE THE FINAL DESTINATION STARTING AND ENDING ADDRESS FOR THE DISK
; LOAD OPERATION AS WELL AS THE ENTRY POINT TO TRANSFER CONTROL TO. THE ACTUAL
; IMAGE TO BE LOADED *MUST* BE ON THE DISK IN THE SECTORS IMMEDIATELY FOLLOWING
; THE BOOT INFO SECTOR. THIS MEANS THE IMAGE TO BE LOADED MUST BEGIN IN SECTOR
; 3 (THE FOURTH SECTOR) AND OCCUPY SECTORS CONTIGUOUSLY AFTER THAT.
;
; THE CODE BELOW RELOCATES ITSELF AT STARTUP TO THE START OF COMMON RAM
; AT $8000. THIS MEANS THAT THE CODE, DATA, AND STACK WILL ALL STAY
; WITHIN $8000-$8FFF. SINCE ALL CODE IMAGES LIKE TO BE LOADED EITHER
; HIGH OR LOW (NEVER IN THE MIDDLE), THE $8000-$8FFF LOCATION TENDS
; TO AVOID THE PROBLEM WHERE THE CODE IS OVERLAID DURING THE LOADING
; OF THE DESIRED EXECUTABLE IMAGE.
;
; INCLUDE GENERIC STUFF ; INCLUDE GENERIC STUFF
; ;
#INCLUDE "std.asm" #INCLUDE "std.asm"
; ;
INT_IM1 .EQU $FF00 INT_IM1 .EQU $FF00
;
BID_CUR .EQU -1 ; SPECIAL BANK ID VALUE INDICATES CURRENT BANK
; ;
.ORG 0 .ORG 0
; ;
@ -47,68 +75,22 @@ INT_IM1 .EQU $FF00
; ;
.FILL (100H - $),0FFH ; PAD REMAINDER OF PAGE ZERO .FILL (100H - $),0FFH ; PAD REMAINDER OF PAGE ZERO
; ;
;
;================================================================================================== ;==================================================================================================
; LOADER
; STARTUP AND LOADER INITIALIZATION
;================================================================================================== ;==================================================================================================
; ;
JP START
DI ; NO INTERRUPTS FOR NOW
; ;
; BOOT OPTION PROCESSING - IN LOW MEMORY SO ~200H-7FFFH UPWARDS CAN BE OVERWRITTEN WHEN LOADING ROMS
; STACK IS AT 8000H+ SO WE CANT OVERWRITE THAT - MAYBE WE CAN MOVE THAT LATER.
;
GOROM: EX DE,HL
LD B,5 ; PUT NEXT FIVE ADDRESSES ON STACK
GOROMB1:INC HL
LD E,(HL) ; EXEC
INC HL ; SOURCE
LD D,(HL) ; DEST
PUSH DE ; SIZE
DJNZ GOROMB1 ; BANKS
POP DE ; BANKS
POP HL ; SIZE
LD B,BF_SYSSETCPY ; HBIOS FUNC: SETUP BANK COPY
RST 08 ; DO IT
POP DE ; DEST
POP HL ; SOURCE
LD B,BF_SYSBNKCPY ; HBIOS FUNC: PERFORM BANK COPY
RST 08 ; DO IT
;
; EXEC ADDRESS ON TOP OF STACK
; RELOCATE TO START OF COMMON RAM AT $8000
LD HL,0
LD DE,$8000
LD BC,LDR_SIZ
LDIR
JP START
; ;
#IF (PLATFORM == PLT_UNA)
LD BC,$00FB ; GET LOWER PAGE ID
RST 08 ; DE := LOWER PAGE ID == BOOT ROM PAGE
LD L,1 ; BOOT DISK UNIT IS ROM (UNIT ID = 1)
LD BC,$01FC ; UNA FUNC: SET BOOTSTRAP HISTORY
RST 08 ; CALL UNA
; HL IS ALREADY ON STACK AS REQUIRED BY UNA EXEC CHAIN CALL
LD DE,BID_USR ; TARGET BANK ID
PUSH DE ; ... ON STACK
DI ; ENTER WITH INTS DISABLED
JP $FFF7 ; UNA INTER-PAGE EXEC CHAIN
#ELSE
LD A,(HB_CURBNK) ; GET CURRENT BANK ID FROM PROXY DATA
LD B,BF_SYSSET ; HB FUNC: SET HBIOS PARAMETER
LD C,BF_SYSSET_BOOTINFO ; HB SUBFUNC: SET BOOT INFO
LD L,A ; ... AND SAVE AS BOOT BANK
LD DE,$0100 ; BOOT VOLUME (UNIT, SLICE)
RST 08
.ORG $8000 + $
; ;
LD A,BID_USR ; ACTIVATE USER BANK
POP HL ; RECOVER ENTRY ADDRESS
DI ; ENTER WITH INTS DISABLED
CALL HB_BNKCALL ; AND GO
HALT ; WE SHOULD NEVER RETURN!!!
#ENDIF
START: DI ; NO INTERRUPTS
LD SP,BL_STACK ; SETUP STACK
START: LD SP,BL_STACK ; SETUP STACK
; ;
#IF (PLATFORM != PLT_UNA) #IF (PLATFORM != PLT_UNA)
CALL DELAY_INIT ; INIT DELAY FUNCTIONS CALL DELAY_INIT ; INIT DELAY FUNCTIONS
@ -160,83 +142,91 @@ START: DI ; NO INTERRUPTS
#ENDIF #ENDIF
EI EI
; ;
; RUN THE BOOT LOADER MENU
;==================================================================================================
; BOOT LOADER MENU DISPLAY
;==================================================================================================
; ;
LD DE,STR_BANNER ; DISPLAY BOOT BANNER LD DE,STR_BANNER ; DISPLAY BOOT BANNER
DOBOOTMENU:
;
MENU:
CALL WRITESTR ; DISPLAY MESSAGE OR ERROR CALL WRITESTR ; DISPLAY MESSAGE OR ERROR
CALL NEWLINE
CALL NEWLINE2
; ;
#IF (DSKYENABLE) #IF (DSKYENABLE)
; DISPLAY DSKY BOOT MESSAGE
LD HL,BOOT ; POINT TO BOOT MESSAGE LD HL,BOOT ; POINT TO BOOT MESSAGE
CALL DSKY_SHOWRAW ; DISPLAY MESSAGE CALL DSKY_SHOWRAW ; DISPLAY MESSAGE
#ENDIF #ENDIF
; ;
#IF (BOOTTYPE == BT_AUTO) #IF (BOOTTYPE == BT_AUTO)
; INITIALIZE BOOT TIMEOUT DOWNCOUNTER
LD BC,100 * BOOT_TIMEOUT LD BC,100 * BOOT_TIMEOUT
LD (BL_TIMEOUT),BC LD (BL_TIMEOUT),BC
#ENDIF #ENDIF
; ;
LD B,MENU_N ; DISPLAY ALL ROM MENU ENTRIES
LD HL,MENU_S ; DE POINTS TO START RECORD
MENU_L: PUSH HL ; SAVE CURRENT RECORD POSITION
PUSH HL ; PUT CURRENT ROM RECORD IN HL
POP DE
PUSH BC ; POINT HL TO THE MENU KEY
LD BC,MENU_O
ADD HL,BC
POP BC
WRITEM1:LD A,(DE) ; DE STEPS THROUGH THE MENU NAMES
CP '$' ; TEST FOR STRING TERMINATOR
JR Z,WRITEM2
CP (HL) ; DO WE HAVE A MATCH WITH MENU
JR NZ,WRITEM3
LD A,'('
CALL COUT
LD A,(DE)
CALL COUT
LD A,')'
WRITEM3:CALL COUT
INC DE
JR WRITEM1
WRITEM2:POP HL ; RECALL THE PREVIOUS RECORD
LD DE,MENU_V ; SAVED AT MENU_L
ADD HL,DE ; MOVE TO NEXT RECORD
LD A,' '
CALL COUT
DJNZ MENU_L ; NEXT MENU ITEM
CALL NEWLINE ; DISPLAY AVAILABLE DRIVES
CALL PRTALL
CALL PC_COLON
DB_BOOTLOOP:
; DISPLAY ROM MENU ENTRIES
PRTS("ROM: $")
LD B,MENU_N ; B IS LOOP COUNTER, # OF ENTRIES
LD HL,MENU_S ; HL POINTS TO START OF ENTRY
MENU1:
; PROCESS A TABLE ENTRY
PUSH HL ; COPY HL TO
POP DE ; ... DE FOR USE AS CHAR PTR
MENU2:
LD A,(DE) ; GET NEXT CHAR
INC DE ; BUMP CHAR PTR FOR FUTURE
CP '$' ; TERMINATOR?
JR Z,MENU4 ; IF YES, DONE WITH THIS ENTRY
CP '~' ; HOT KEY PREFIX?
JR NZ,MENU3 ; IF NOT, JUST SKIP AHEAD
CALL PC_LPAREN ; L PAREN BEFORE HOT KEY
LD A,(DE) ; GET THE ACTUAL HOT KEY
INC DE ; BUMP CHAR PTR FOR FUTURE
CALL COUT ; OUTPUT HOT KEY
LD A,')' ; R PAREN WILL PRINT BELOW
MENU3:
CALL COUT ; OUTPUT CHAR
JR MENU2 ; AND LOOP
MENU4:
; END OF AN ENTRY
CALL PC_SPACE ; PRINT SEPARATOR
LD A,MENU_V ; LOAD ENTRY LENGTH
CALL ADDHLA ; BUMP HL TO NEXT ENTRY
DJNZ MENU1 ; LOOP UNTIL COUNT EXPIRES
;
; DISPLAY AVAILABLE DISK DRIVES
PRTS("\r\nDisk: $")
CALL PRTALL ; PRINT DRIVE LIST
;
LD DE,STR_BOOTSEL
CALL WRITESTR
;
;==================================================================================================
; BOOT SELECTION PROCESSING
;==================================================================================================
;
SEL:
; HANDLE SERIAL CONSOLE INPUT
CALL CST ; CHECK CONSOLE INPUT CALL CST ; CHECK CONSOLE INPUT
OR A
JR NZ,GOTK1
OR A ; ZERO?
JR Z,SEL1 ; IF NOT, CONTINUE
CALL CINUC ; GET THE KEY
CALL COUT ; ECHO KEY
JR MATS ; AND HANDLE IT
;
SEL1:
#IF (DSKYENABLE) #IF (DSKYENABLE)
CALL KY_STAT ; CHECK DSKY INPUR
OR A
JR Z,GOTNK
CALL KY_GET
JR MENU_A
; HANDLE DSKY KEY INPUT
CALL KY_STAT ; CHECK DSKY INPUT
OR A ; TEST FOR ZERO
JR Z,SEL2 ; IF ZERO, NO KEY PRESSED
CALL KY_GET ; GET PENDING KEY PRESS
JR MATK ; AND HANDLE IT
#ENDIF #ENDIF
GOTNK: ; CHECK AUTOBOOT TIMEOUT
;
SEL2:
#IF (BOOTTYPE == BT_AUTO) #IF (BOOTTYPE == BT_AUTO)
; CHECK FOR AUTOBOOT TIMEOUT
LD DE,625 ; DELAY FOR 10MS TO MAKE TIMEOUT CALC EASY LD DE,625 ; DELAY FOR 10MS TO MAKE TIMEOUT CALC EASY
CALL VDELAY ; 16US * 625 = 10MS CALL VDELAY ; 16US * 625 = 10MS
LD BC,(BL_TIMEOUT) ; CHECK/INCREMENT TIMEOUT LD BC,(BL_TIMEOUT) ; CHECK/INCREMENT TIMEOUT
@ -244,55 +234,78 @@ GOTNK: ; CHECK AUTOBOOT TIMEOUT
LD (BL_TIMEOUT),BC LD (BL_TIMEOUT),BC
LD A,B LD A,B
OR C OR C
JP NZ,DB_BOOTLOOP
JP NZ,SEL3
;
LD A,BOOT_DEFAULT ; TIMEOUT EXPIRED, LD A,BOOT_DEFAULT ; TIMEOUT EXPIRED,
JR MENU_A ; PERFORM DEFAULT BOOT ACTION JR MENU_A ; PERFORM DEFAULT BOOT ACTION
#ENDIF #ENDIF
JR DB_BOOTLOOP
GOTK1: CALL CINUC
MENU_A: LD B,MENU_N
;
SEL3:
; NO USER SELECTION YET
JR SEL ; LOOP
;
;==================================================================================================
; ROM MENU TABLE MATCHING
;==================================================================================================
;
MATS: ; MATCH SERIAL INPUT TO MENU
CP 'R'
JP Z,REBOOT
LD B,MENU_N
LD DE,MENU_S+10-MENU_V LD DE,MENU_S+10-MENU_V
LD HL,MENU_V LD HL,MENU_V
MENU_C: EX DE,HL
MATS1: EX DE,HL
ADD HL,DE ADD HL,DE
CP (HL) CP (HL)
EX DE,HL EX DE,HL
JR Z,MENU_X
DJNZ MENU_C ; FALL THRU IF IT DOES NOT MATCH ROM MENU
; CHECK FOR DRIVE EXECUTION
CP '0' ; 0-9, DISK DEVICE
JR C,DB_INVALID
CP '9' + 1
JR NC,DB_INVALID
SUB '0'
JP GOBOOTDISK
MENU_X: CALL NEWLINE
; DE CONTAIN POINTER TO MENU RECORD
EX DE,HL
INC HL ; WE HAVE A VALID ROM MENU OPTION
LD E,(HL)
INC HL
LD D,(HL)
JR Z,MATS2
DJNZ MATS1 ; FALL THRU IF IT DOES NOT MATCH ROM MENU
SUB '0' ; CONVERT ASCII TO BINARY
JR MATD ; AND TRY DISK BOOT
MATS2: INC DE ; SKIP MENU SEL CHAR
INC DE ; SKIP DSKY SEL CHAR
JP GOROM ; BOOT FROM ROM
;
#IF (DSKYENABLE)
MATK: ; MATCH DSKY INPUT TO MENU
CP KY_BO
JP Z,REBOOT
LD B,MENU_N
LD DE,MENU_S+11-MENU_V
LD HL,MENU_V
MATK1: EX DE,HL
ADD HL,DE
CP (HL)
EX DE,HL EX DE,HL
JP (HL) ; JUMP TO THE ROUTINE TO EXECUTE IT
DB_INVALID:
LD DE,STR_INVALID
JP DOBOOTMENU
#DEFINE MENU_L(M1,M2,M3,M4,M5,M6,M7,M8,M9,M10) \
JR Z,MATK2
DJNZ MATK1 ; FALL THRU IF IT DOES NOT MATCH DSKY MENU
JR MATD ; TRY DISK BOOT
MATK2: INC DE ; SKIP DSKY SEL CHAR
JP GOROM ; BOOT FROM ROM
#ENDIF
;
MATD: ; CHECK FOR DISK BOOT REQUEST
CP 10 ; 0-9, DISK DEVICE
JR NC,MATX ; NOT VALID, HANDLE IT BELOW
JP GOBOOTDISK ; BOOT FROM DISK
;
MATX:
; SET ERROR STRING AND LOOP
LD DE,STR_INVALID ; INVALID SEL MSG
JP MENU ; RESTART MENU LOOP
;
;==================================================================================================
; ROM MENU TABLE
;==================================================================================================
;
#DEFINE MENU_L(M1,M2,M3,M4,M5,M6,M7,M8,M9,M10) \
#DEFCONT \ .DB M1 #DEFCONT \ .DB M1
#DEFCONT \ .DB M2 #DEFCONT \ .DB M2
#DEFCONT \ .DW M3
#IF (DSKYENABLE)
#DEFCONT \ .DB M3
#ELSE
#DEFCONT \ .DB $FF
#ENDIF
#DEFCONT \ .DW M4 #DEFCONT \ .DW M4
#DEFCONT \ .DW M5 #DEFCONT \ .DW M5
#DEFCONT \ .DW M6 #DEFCONT \ .DW M6
@ -301,57 +314,164 @@ DB_INVALID:
#DEFCONT \ .DB M9 #DEFCONT \ .DB M9
#DEFCONT \ .DB M10 #DEFCONT \ .DB M10
; ;
; NOTE : THE FORMATTING OF THE FOLLOWING IS CRITICAL. TASM DOES NOT PASS MACRO ARGUMENTS WELL.
; ENSURE STD.ASM HOLDS THE DEFINITIONS FOR *_LOC, *_SIZ *_END AND ANY CODE GENERATED WHICH DOES NOT
; INCLUDE STD.ASM IS SYNCED.
; name menu exec dest-exec source dest-addr img-size source-bank dest desc
; DB DB DW DW DW DW DW DB DB DB
MENU_S: MENU_L("MONITOR$ $", "M", GOROM, MON_SERIAL, 1000h, MON_LOC, MON_SIZ, BID_BIOSIMG, BID_USR, "Monitor$12345")
MENU_1: MENU_L("CP/M$ $", "C", GOROM, CPM_ENT, 2000h, CPM_LOC, CPM_SIZ, BID_BIOSIMG, BID_USR, "CP/M 80 2.2$ ")
MENU_L("Z-SYSTEM$$", "Z", GOROM, CPM_ENT, 5000h, CPM_LOC, CPM_SIZ, BID_BIOSIMG, BID_USR, "ZSDOS V1.1$ ")
MENU_L("$ $", "E", GOROM, EGG_LOC, 0E00h, EGG_LOC, EGG_SIZ, BID_BIOSIMG, BID_USR, "Easter Egg$ ")
MENU_L("FORTH$ $", "F", GOROM, FTH_LOC, 0000h, FTH_LOC, FTH_SIZ, BID_OSIMG, BID_USR, "Camel Forth$ ")
MENU_L("BASIC$ $", "B", GOROM, BAS_LOC, 1700h, BAS_LOC, BAS_SIZ, BID_OSIMG, BID_USR, "Nascom BASIC$")
MENU_L("T-BASIC$ $", "T", GOROM, TBC_LOC, 3700h, TBC_LOC, TBC_SIZ, BID_OSIMG, BID_USR, "Tasty BASIC$ ")
; NOTE: THE FORMATTING OF THE FOLLOWING IS CRITICAL. TASM DOES NOT PASS MACRO ARGUMENTS WELL.
; ENSURE STD.ASM HOLDS THE DEFINITIONS FOR *_LOC, *_SIZ *_END AND ANY CODE GENERATED WHICH DOES NOT
; INCLUDE STD.ASM IS SYNCED.
;
; NOTE: THE LOADABLE ROM IMAGES ARE PLACED IN ROM BANKS BID_IMG0 AND BID_IMG1. HOWEVER, ROMWBW
; SUPPORTS A MECHANISM TO LOAD A COMPLETE NEW SYSTEM DYNAMICALLY AS A RUNNABLE APPLICATION
; (SEE APPBOOT AND IMGBOOT IN HBIOS.ASM). IN THIS CASE, THE CONTENTS OF BID_IMG0 WILL
; PRE-LOADED INTO THE CURRENTLY EXECUTING RAM BANK THEREBY ALLOWING THOSE IMAGES TO BE
; DYNAMICALLY LOADED AS WELL. TO SUPPORT THIS CONCEPT, A PSEUDO-BANK CALLED BID_CUR
; IS USED TO SPECIFY THE IMAGES NORMALLY FOUND IN BID_IMG0. IN GOROM, THIS SPECIAL
; VALUE WILL CAUSE THE ASSOCIATED IMAGE TO BE LOADED FROM THE CURRENTLY EXECUTING BANK
; WHICH WILL BE CORRECT REGARDLESS OF THE LOAD MODE. IMAGES IN OTHER BANKS (BID_IMG1)
; WILL ALWAYS BE LOADED DIRECTLY FROM ROM.
;
; name menu dsky dest-exec source dest-addr img-size source-bank dest desc
; DB DB DB DW DW DW DW DB DB DB
MENU_S: MENU_L("~Monitor$ ", "M", KY_CL, MON_SERIAL, 1000h, MON_LOC, MON_SIZ, BID_CUR, BID_USR, "Monitor$ ")
MENU_1: MENU_L("~CP/M$ ", "C", KY_BK, CPM_ENT, 2000h, CPM_LOC, CPM_SIZ, BID_CUR, BID_USR, "CP/M 80 v2.2$")
MENU_L("~Z-System$", "Z", KY_FW, CPM_ENT, 5000h, CPM_LOC, CPM_SIZ, BID_CUR, BID_USR, "ZSDOS v1.1$ ")
#IF (PLATFORM != PLT_UNA)
MENU_L("~Forth$ ", "F", KY_EX, FTH_LOC, 0000h, FTH_LOC, FTH_SIZ, BID_IMG1, BID_USR, "Camel Forth$ ")
MENU_L("~BASIC$ ", "B", KY_DE, BAS_LOC, 1700h, BAS_LOC, BAS_SIZ, BID_IMG1, BID_USR, "Nascom BASIC$")
MENU_L("~T-BASIC$ ", "T", KY_EN, TBC_LOC, 3700h, TBC_LOC, TBC_SIZ, BID_IMG1, BID_USR, "Tasty BASIC$ ")
#ENDIF
#IF (DSKYENABLE) #IF (DSKYENABLE)
MENU_L("DSKY-MON $", "D", GOROM, MON_DSKY, 1000h, MON_LOC, MON_SIZ, BID_BIOSIMG, BID_USR, "DSKY Monitor$")
MENU_L("~DSKY$ ", "D", KY_GO, MON_DSKY, 1000h, MON_LOC, MON_SIZ, BID_CUR, BID_USR, "DSKY Monitor$")
#ENDIF #ENDIF
.DB "REBOOT$ ", "R"
.DW REBOOT
MENU_E:
MENU_V .EQU MENU_1-MENU_S ; LENGTH OF EACH MENU RECORD
MENU_N .EQU ((MENU_E-MENU_S)/MENU_V)+1 ; NUMBER OF MENU ITEMS
MENU_O .EQU 10 ; OFFSET TO MENU KEY FROM NAME
;
; REBOOT ROMLDR
;
REBOOT: LD A,BID_BOOT ; BOOT BANK
MENU_L("$ ", "E", $FF, EGG_LOC, 0E00h, EGG_LOC, EGG_SIZ, BID_CUR, BID_USR, "Easter Egg$ ")
;
MENU_E .EQU $ ; END OF TABLE
MENU_V .EQU MENU_1 - MENU_S ; LENGTH OF EACH MENU RECORD
MENU_N .EQU ((MENU_E - MENU_S) / MENU_V) ; NUMBER OF MENU ITEMS
;
;==================================================================================================
; SYSTEM REBOOT HANDLER
;==================================================================================================
;
REBOOT: LD DE,STR_REBOOT ; POINT TO MESSAGE
CALL WRITESTR ; PRINT IT
LD A,BID_BOOT ; BOOT BANK
LD HL,0 ; ADDRESS ZERO LD HL,0 ; ADDRESS ZERO
CALL HB_BNKCALL ; DOES NOT RETURN CALL HB_BNKCALL ; DOES NOT RETURN
;
;==================================================================================================
; ROM IMAGE LOAD HANDLER
;==================================================================================================
;
; AT ENTRY, DE POINTS TO THE EXEC ADR FIELD OF THE ACTIVE ROM
; TABLE ENTRY
;
; ROM IMAGES MUST NOT OVERLAY THE SPACE OCCUPIED BY THE LOADER WHICH
; IS $8000-$8FFF.
;
GOROM: PUSH DE ; SAVE ROM TABLE ENTRY EXEC ADR PTR
LD DE,STR_BOOTROM ; ROM LOADING MSG PREFIX
CALL WRITESTR ; PRINT IT
POP HL ; EXEC ADR TO HL
PUSH HL ; AND RESAVE IT
LD A,10 ; OFFSET TO IMAGE DESC
CALL ADDHLA ; APPLY IT
EX DE,HL ; MOVE TO DE, ORIG VALUE TO HL
CALL WRITESTR ; AND PRINT IT
PRTS("...$") ; ADD SOME DOTS
POP HL ; RESTORE EXEC ADR TO HL
;
LD B,5 ; PUT NEXT FIVE WORDS ON STACK
GOROM1: LD E,(HL) ; (1) EXEC ADR
INC HL ; (2) SOURCE ADR
LD D,(HL) ; (3) DEST ADR
INC HL ; (4) IMAGE SIZE
PUSH DE ; (5) SRC/DEST BANKS
DJNZ GOROM1 ; LOOP TILL DONE
;
#IF (PLATFORM == PLT_UNA)
;
; NOTE: UNA HAS NO INTERBANK MEMORY COPY, SO WE CAN ONLY LOAD
; IMAGES FROM THE CURRENT BANK. A SIMPLE LDIR IS USED TO
; RELOCATE THE IMAGES
;
; COPY IMAGE TO IT'S RUNNING LOCATION
POP HL ; POP AND DISCARD BANKS
POP BC ; GET IMAGE SIZE TO BC
POP DE ; GET DESTINATION ADR TO DE
POP HL ; GET SOURCE ADR TO HL
LDIR ; MOVE IT
;
; RECORD BOOT INFO
LD BC,$00FB ; GET LOWER PAGE ID
RST 08 ; DE := LOWER PAGE ID == BOOT ROM PAGE
LD L,1 ; BOOT DISK UNIT IS ROM (UNIT ID = 1)
LD BC,$01FC ; UNA FUNC: SET BOOTSTRAP HISTORY
RST 08 ; CALL UNA
;
; LAUNCH IMAGE W/ USER BANK ACTIVE
; NOTE: UNA EXEC CHAIN CALL USES ADDRESS ON TOS
CALL NEWLINE2
LD DE,BID_USR ; TARGET BANK ID
PUSH DE ; ... ON STACK
DI ; ENTER WITH INTS DISABLED
JP $FFF7 ; UNA INTER-PAGE EXEC CHAIN
#ELSE
;
; NOTE: CHECK FOR SPECIAL CASE WHERE SOURCE BANK IS BID_CUR. IN THIS CASE
; WE COPY THE IMAGE FROM THE BANK THAT WE ARE CURRENTLY RUNNING IN. THIS
; IS DONE TO SUPPORT THE APPBOOT AND IMGBOOT MODES AS DEFINED IN HBIOS.
; IN THE CASE OF THESE MODES IT IS INTENDED THAT THE IMAGES BE LOADED
; FROM THE CURRENT RAM BANK AND NOT FROM THEIR NORMAL ROM LOCATIONS.
;
; COPY IMAGE TO IT'S RUNNING LOCATION
POP DE ; GET BANKS (E=SRC, D=DEST)
POP HL ; GET IMAGE SIZE
LD A,E ; SOURCE BANK TO A
CP BID_CUR ; SPECIAL CASE, BID_CUR?
JR NZ,GOROM2 ; IF NOT, GO RIGHT TO COPY
LD A,(HB_CURBNK) ; GET CURRENT BANK
LD E,A ; AND SUBSTITUE THE VALUE
GOROM2: LD B,BF_SYSSETCPY ; HBIOS FUNC: SETUP BANK COPY
RST 08 ; DO IT
POP DE ; GET DEST ADR
POP HL ; GER SOURCE ADR
LD B,BF_SYSBNKCPY ; HBIOS FUNC: PERFORM BANK COPY
RST 08 ; DO IT
;
; RECORD BOOT INFO
LD A,(HB_CURBNK) ; GET CURRENT BANK ID FROM PROXY DATA
LD B,BF_SYSSET ; HB FUNC: SET HBIOS PARAMETER
LD C,BF_SYSSET_BOOTINFO ; HB SUBFUNC: SET BOOT INFO
LD L,A ; ... AND SAVE AS BOOT BANK
LD DE,$0100 ; BOOT VOLUME (UNIT, SLICE)
RST 08
;
; LAUNCH IMAGE W/ USER BANK ACTIVE
CALL NEWLINE2
LD A,BID_USR ; ACTIVATE USER BANK
POP HL ; RECOVER EXEC ADDRESS
DI ; ENTER WITH INTS DISABLED
CALL HB_BNKCALL ; AND GO
HALT ; WE SHOULD NEVER RETURN!!!
#ENDIF
;
;==================================================================================================
; DISK BOOT HANDLER
;==================================================================================================
;
GOBOOTDISK: GOBOOTDISK:
LD (BL_BOOTID),A LD (BL_BOOTID),A
LD DE,STR_BOOTDISK LD DE,STR_BOOTDISK
CALL WRITESTR CALL WRITESTR
CALL PRTHEXBYTE
PRTS("...$")
; ;
; BOOT FROM DISK DRIVE
;
BOOTDISK:
LD DE,STR_BOOTDISK1 ; DISK BOOT MESSAGE LD DE,STR_BOOTDISK1 ; DISK BOOT MESSAGE
CALL WRITESTR ; PRINT IT CALL WRITESTR ; PRINT IT
;
#IF (PLATFORM == PLT_UNA) #IF (PLATFORM == PLT_UNA)
;
; BOOT FROM UNA DISK DRIVE
;
LD A,(BL_BOOTID) ; GET BOOT DEVICE ID LD A,(BL_BOOTID) ; GET BOOT DEVICE ID
LD B,A ; MOVE TO B LD B,A ; MOVE TO B
;
; LOAD SECTOR 2 (BOOT INFO) ; LOAD SECTOR 2 (BOOT INFO)
LD C,$41 ; UNA FUNC: SET LBA LD C,$41 ; UNA FUNC: SET LBA
LD DE,0 ; HI WORD OF LBA IS ALWAYS ZERO LD DE,0 ; HI WORD OF LBA IS ALWAYS ZERO
@ -364,7 +484,6 @@ BOOTDISK:
LD L,1 ; SECTORS TO READ LD L,1 ; SECTORS TO READ
RST 08 ; DO READ RST 08 ; DO READ
JP NZ,DB_ERR ; HANDLE ERROR JP NZ,DB_ERR ; HANDLE ERROR
;
#ELSE #ELSE
; CHECK FOR VALID DRIVE LETTER ; CHECK FOR VALID DRIVE LETTER
LD A,(BL_BOOTID) ; BOOT DEVICE TO A LD A,(BL_BOOTID) ; BOOT DEVICE TO A
@ -375,13 +494,13 @@ BOOTDISK:
POP AF ; RESTORE BOOT DEVICE POP AF ; RESTORE BOOT DEVICE
CP E ; CHECK MAX (INDEX - COUNT) CP E ; CHECK MAX (INDEX - COUNT)
JP NC,DB_NODISK ; HANDLE INVALID SELECTION JP NC,DB_NODISK ; HANDLE INVALID SELECTION
;
; SET THE BOOT UNIT AND SLICE ; SET THE BOOT UNIT AND SLICE
LD A,(BL_BOOTID) ; GET BOOTID LD A,(BL_BOOTID) ; GET BOOTID
LD (BL_DEVICE),A ; STORE IT LD (BL_DEVICE),A ; STORE IT
XOR A ; LU ALWAYS ZERO XOR A ; LU ALWAYS ZERO
LD (BL_LU),A ; STORE IT LD (BL_LU),A ; STORE IT
;
; SENSE MEDIA ; SENSE MEDIA
LD A,(BL_DEVICE) ; GET DEVICE/UNIT LD A,(BL_DEVICE) ; GET DEVICE/UNIT
LD C,A ; STORE IN C LD C,A ; STORE IN C
@ -389,7 +508,7 @@ BOOTDISK:
LD E,1 ; ENABLE MEDIA CHECK/DISCOVERY LD E,1 ; ENABLE MEDIA CHECK/DISCOVERY
RST 08 ; CALL HBIOS RST 08 ; CALL HBIOS
JP NZ,DB_ERR ; HANDLE ERROR JP NZ,DB_ERR ; HANDLE ERROR
;
; SEEK TO SECTOR 2 OF LU ; SEEK TO SECTOR 2 OF LU
LD A,(BL_LU) ; GET LU SPECIFIED LD A,(BL_LU) ; GET LU SPECIFIED
LD E,A ; LU INDEX LD E,A ; LU INDEX
@ -401,7 +520,7 @@ BOOTDISK:
LD C,A ; PUT IN C LD C,A ; PUT IN C
RST 08 ; DO IT RST 08 ; DO IT
JP NZ,DB_ERR ; HANDLE ERROR JP NZ,DB_ERR ; HANDLE ERROR
;
; READ ; READ
LD B,BF_DIOREAD ; FUNCTION IN B LD B,BF_DIOREAD ; FUNCTION IN B
LD A,(BL_DEVICE) ; GET BOOT DISK UNIT LD A,(BL_DEVICE) ; GET BOOT DISK UNIT
@ -414,7 +533,6 @@ BOOTDISK:
#ENDIF #ENDIF
; ;
; CHECK SIGNATURE ; CHECK SIGNATURE
CALL NEWLINE ; FORMATTING
LD DE,(BB_SIG) ; GET THE SIGNATURE LD DE,(BB_SIG) ; GET THE SIGNATURE
LD A,$A5 ; FIRST BYTE SHOULD BE $A5 LD A,$A5 ; FIRST BYTE SHOULD BE $A5
CP D ; COMPARE CP D ; COMPARE
@ -422,32 +540,24 @@ BOOTDISK:
LD A,$5A ; SECOND BYTE SHOULD BE $5A LD A,$5A ; SECOND BYTE SHOULD BE $5A
CP E ; COMPARE CP E ; COMPARE
JP NZ,DB_NOBOOT ; ERROR IS NOT EQUAL JP NZ,DB_NOBOOT ; ERROR IS NOT EQUAL
;
; PRINT CPMLOC VALUE ; PRINT CPMLOC VALUE
CALL NEWLINE
LD DE,STR_CPMLOC
CALL WRITESTR
PRTS("\r\nLoc=$")
LD BC,(BB_CPMLOC) LD BC,(BB_CPMLOC)
CALL PRTHEXWORD CALL PRTHEXWORD
;
; PRINT CPMEND VALUE ; PRINT CPMEND VALUE
CALL PC_SPACE
LD DE,STR_CPMEND
CALL WRITESTR
PRTS(" End=$")
LD BC,(BB_CPMEND) LD BC,(BB_CPMEND)
CALL PRTHEXWORD CALL PRTHEXWORD
;
; PRINT CPMENT VALUE ; PRINT CPMENT VALUE
CALL PC_SPACE
LD DE,STR_CPMENT
CALL WRITESTR
PRTS(" Ent=$")
LD BC,(BB_CPMENT) LD BC,(BB_CPMENT)
CALL PRTHEXWORD CALL PRTHEXWORD
CALL PC_SPACE
;
; PRINT DISK LABEL ; PRINT DISK LABEL
LD DE,STR_LABEL
CALL WRITESTR
PRTS(" Label=$")
LD DE,BB_LABEL ; if it is there, then a printable LD DE,BB_LABEL ; if it is there, then a printable
LD A,(BB_TERM) ; Display Disk Label if Present LD A,(BB_TERM) ; Display Disk Label if Present
CP '$' ; (dwg 2/7/2012) CP '$' ; (dwg 2/7/2012)
@ -505,7 +615,7 @@ BOOTDISK:
LD E,A ; NUMBER OF SECTORS TO LOAD LD E,A ; NUMBER OF SECTORS TO LOAD
RST 08 RST 08
JP NZ,DB_ERR ; HANDLE ERRORS JP NZ,DB_ERR ; HANDLE ERRORS
;
; PASS BOOT DEVICE/UNIT/LU TO CBIOS COLD BOOT ; PASS BOOT DEVICE/UNIT/LU TO CBIOS COLD BOOT
LD B,BF_SYSSET ; HB FUNC: SET HBIOS PARAMETER LD B,BF_SYSSET ; HB FUNC: SET HBIOS PARAMETER
LD C,BF_SYSSET_BOOTINFO ; HB SUBFUNC: SET BOOT INFO LD C,BF_SYSSET_BOOTINFO ; HB SUBFUNC: SET BOOT INFO
@ -517,7 +627,7 @@ BOOTDISK:
LD E,A ; SAVE IN E LD E,A ; SAVE IN E
RST 08 RST 08
JP NZ,DB_ERR ; HANDLE ERRORS JP NZ,DB_ERR ; HANDLE ERRORS
;
; JUMP TO COLD BOOT ENTRY ; JUMP TO COLD BOOT ENTRY
LD A,BID_USR ; ACTIVATE USER BANK LD A,BID_USR ; ACTIVATE USER BANK
LD HL,(BB_CPMENT) ; OS ENTRY ADDRESS LD HL,(BB_CPMENT) ; OS ENTRY ADDRESS
@ -530,21 +640,20 @@ BOOTDISK:
DB_NODISK: DB_NODISK:
; SELDSK DID NOT LIKE DRIVE SELECTION ; SELDSK DID NOT LIKE DRIVE SELECTION
LD DE,STR_NODISK LD DE,STR_NODISK
JP DOBOOTMENU
JP MENU
;
DB_NOBOOT: DB_NOBOOT:
; DISK IS NOT BOOTABLE ; DISK IS NOT BOOTABLE
LD DE,STR_NOBOOT LD DE,STR_NOBOOT
JP DOBOOTMENU
JP MENU
;
DB_ERR: DB_ERR:
; I/O ERROR DURING BOOT ATTEMPT ; I/O ERROR DURING BOOT ATTEMPT
LD DE,STR_BOOTERR LD DE,STR_BOOTERR
JP DOBOOTMENU
JP MENU
; ;
#IF (PLATFORM == PLT_UNA) #IF (PLATFORM == PLT_UNA)
; ;
;
; PRINT LIST OF ALL DRIVES UNDER UNA ; PRINT LIST OF ALL DRIVES UNDER UNA
; ;
PRTALL: PRTALL:
@ -712,31 +821,31 @@ DEV15 .EQU DEVUNK
; ;
#ENDIF #ENDIF
; ;
;__TEXT_STRINGS_________________________________________________________________________________________________________________
;
; STRINGS
;_____________________________________________________________________________________________________________________________
;
STR_BOOTDISK .DB "BOOT FROM DISK\r\n$"
STR_BOOTDISK1 .DB "\r\nReading disk information...$"
STR_INVALID .DB "INVALID SELECTION\r\n$"
STR_SETUP .DB "SYSTEM SETUP\r\n$"
STR_SIG .DB "SIGNATURE=$"
STR_CPMLOC .DB "LOC=$"
STR_CPMEND .DB "END=$"
STR_CPMENT .DB "ENT=$"
STR_LABEL .DB "LABEL=$"
STR_LOADING .DB "\r\nLoading...$"
STR_NODISK .DB "\r\nNo disk!$"
STR_NOBOOT .DB "\r\nDisk not bootable!$"
STR_BOOTERR .DB "\r\nBoot failure!$"
STR_BANNER .DB "\r\n", PLATFORM_NAME, " Boot Loader\r\n$"
;==================================================================================================
; STRINGS
;==================================================================================================
;
STR_BANNER .DB "\r\n\r\n", PLATFORM_NAME, " Boot Loader$"
STR_BOOTSEL .DB "\r\n\r\nBoot? $"
STR_BOOTDISK .DB "\r\n\r\nBooting Disk Unit $"
STR_BOOTROM .DB "\r\n\r\nLoading $"
STR_REBOOT .DB "\r\n\r\nRestarting System...$"
STR_INVALID .DB "\r\n\r\n*** Invalid Selection ***$"
STR_NODISK .DB "\r\n\r\nNo disk!$"
STR_NOBOOT .DB "\r\n\r\nDisk not bootable!$"
STR_BOOTERR .DB "\r\n\r\nBoot failure!$"
STR_BOOTDISK1 .DB "\r\n\r\nReading disk information...$"
STR_LOADING .DB "\r\n\r\nLoading...$"
; ;
#IF (DSKYENABLE) #IF (DSKYENABLE)
; b o o t . . ; b o o t . .
BOOT .DB $9F,$9D,$9D,$94,$80,$80,$00,$00 BOOT .DB $9F,$9D,$9D,$94,$80,$80,$00,$00
#ENDIF #ENDIF
; ;
;==================================================================================================
; INCLUDES
;==================================================================================================
;
#DEFINE USEDELAY #DEFINE USEDELAY
#INCLUDE "util.asm" #INCLUDE "util.asm"
; ;
@ -893,7 +1002,7 @@ CINUC:
; FILL REMAINDER OF BANK ; FILL REMAINDER OF BANK
;================================================================================================== ;==================================================================================================
; ;
SLACK: .EQU ($LDR_SIZ - $)
SLACK: .EQU ($8000 + LDR_SIZ - $)
.FILL SLACK .FILL SLACK
; ;
.ECHO "LOADER space remaining: " .ECHO "LOADER space remaining: "
@ -903,8 +1012,7 @@ SLACK: .EQU ($LDR_SIZ - $)
;================================================================================================== ;==================================================================================================
; WORKING DATA STORAGE ; WORKING DATA STORAGE
;================================================================================================== ;==================================================================================================
;
.ORG $8000
.ORG $8000 + LDR_SIZ
; ;
.DS 64 ; 32 LEVEL STACK .DS 64 ; 32 LEVEL STACK
BL_STACK .EQU $ ; ... TOP IS HERE BL_STACK .EQU $ ; ... TOP IS HERE

6
Source/HBIOS/std.asm

@ -325,8 +325,10 @@ BID_ROMN .EQU (BID_ROM0 + ((ROMSIZE / 32) - 1))
BID_RAMN .EQU (BID_RAM0 + ((RAMSIZE / 32) - 1)) BID_RAMN .EQU (BID_RAM0 + ((RAMSIZE / 32) - 1))
BID_BOOT .EQU BID_ROM0 ; BOOT BANK BID_BOOT .EQU BID_ROM0 ; BOOT BANK
BID_BIOSIMG .EQU BID_ROM0 + 1 ; BIOS IMAGE BANK
BID_OSIMG .EQU BID_ROM0 + 2 ; ROM LOADER AND IMAGES BANK
;BID_BIOSIMG .EQU BID_ROM0 + 1 ; BIOS IMAGE BANK
;BID_OSIMG .EQU BID_ROM0 + 2 ; ROM LOADER AND IMAGES BANK
BID_IMG0 .EQU BID_ROM0 + 1 ; ROM LOADER AND FIRST IMAGES BANK
BID_IMG1 .EQU BID_ROM0 + 2 ; SECOND IMAGES BANK
BID_FSFAT .EQU BID_ROM0 + 3 ; FAT FILESYSTEM DRIVER BANK BID_FSFAT .EQU BID_ROM0 + 3 ; FAT FILESYSTEM DRIVER BANK
BID_ROMD0 .EQU BID_ROM0 + 4 ; FIRST ROM DRIVE BANK BID_ROMD0 .EQU BID_ROM0 + 4 ; FIRST ROM DRIVE BANK
BID_ROMDN .EQU BID_ROMN ; LAST ROM DRIVE BANK BID_ROMDN .EQU BID_ROMN ; LAST ROM DRIVE BANK

9
Source/HBIOS/util.asm

@ -273,7 +273,7 @@ DB_PCRLF0:
LD A,(HL) ; GET BYTE LD A,(HL) ; GET BYTE
AND 060H ; SEE IF A 'DOT' AND 060H ; SEE IF A 'DOT'
LD A,(HL) ; O.K. TO GET LD A,(HL) ; O.K. TO GET
JR NZ,DB_PDOT ;
JR NZ,DB_PDOT ;
DB_DOT: DB_DOT:
LD A,2EH ; LOAD A DOT LD A,2EH ; LOAD A DOT
DB_PDOT: DB_PDOT:
@ -285,19 +285,18 @@ DB_PDOT:
LD A,E ; LD A,E ;
CP L ; CP L ;
JP Z,DB_END ; JP Z,DB_END ;
;
;IF BLOCK NOT DUMPED, DO NEXT CHARACTER OR LINE
DB_UPDH1: DB_UPDH1:
; IF BLOCK NOT DUMPED, DO NEXT CHARACTER OR LINE
DEC C ; DEC. CHAR COUNT DEC C ; DEC. CHAR COUNT
JR NZ,DB_PCRLF0 ; DO NEXT JR NZ,DB_PCRLF0 ; DO NEXT
DB_CONTD: DB_CONTD:
CALL NEWLINE ; CALL NEWLINE ;
JP DB_BLKRD ;
JP DB_BLKRD ;
DB_END: DB_END:
RET ; RET ;
; ;
; OUTPUT A '$' TERMINATED STRING
; OUTPUT A '$' TERMINATED STRING AT DE
; ;
WRITESTR: WRITESTR:
PUSH AF PUSH AF

2
Source/HBIOS/ver.inc

@ -2,4 +2,4 @@
#DEFINE RMN 9 #DEFINE RMN 9
#DEFINE RUP 1 #DEFINE RUP 1
#DEFINE RTP 0 #DEFINE RTP 0
#DEFINE BIOSVER "2.9.1-pre.7"
#DEFINE BIOSVER "2.9.1-pre.8"

Loading…
Cancel
Save