mirror of
https://github.com/wwarthen/RomWBW.git
synced 2026-02-06 14:11:48 -06:00
Monitor and RomLdr Updates
This commit is contained in:
@@ -2,4 +2,4 @@
|
||||
#DEFINE RMN 9
|
||||
#DEFINE RUP 1
|
||||
#DEFINE RTP 0
|
||||
#DEFINE BIOSVER "2.9.1-pre.7"
|
||||
#DEFINE BIOSVER "2.9.1-pre.8"
|
||||
|
||||
@@ -215,7 +215,7 @@ INIT ($04):
|
||||
DE=Line Characteristics
|
||||
L=Terminal Type?
|
||||
|
||||
Setup Parameter Word:
|
||||
Line Characteristics:
|
||||
_______________________________ _______________________________
|
||||
| | | encoded || | | | | |
|
||||
| |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
|
||||
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)
|
||||
BC=Function/Unit A=Result
|
||||
DE=Line Characteristics (Baud, Flow Control, etc.)
|
||||
|
||||
@@ -19,13 +19,6 @@
|
||||
;
|
||||
#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_______________________________________________________________
|
||||
;
|
||||
; ORG 00100h ; FOR DEBUG IN CP/M (AS .COM)
|
||||
@@ -49,20 +42,20 @@ UART_ENTRY:
|
||||
CALL INITIALIZE ; INITIALIZE SYSTEM
|
||||
|
||||
LD HL,TXT_READY ; POINT AT TEXT
|
||||
CALL MSG ; SHOW WE'RE HERE
|
||||
CALL PRTSTR ; SHOW WE'RE HERE
|
||||
;
|
||||
;__SERIAL_MONITOR_COMMANDS____________________________________________________
|
||||
;
|
||||
; B - BOOT SYSTEM
|
||||
; D XXXX YYYY - DUMP MEMORY FROM XXXX TO YYYY
|
||||
; 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
|
||||
; 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______________________________________________________________
|
||||
;
|
||||
@@ -72,7 +65,8 @@ UART_ENTRY:
|
||||
|
||||
SERIALCMDLOOP:
|
||||
LD SP,MON_STACK ; RESET STACK
|
||||
CALL CRLFA ; CR,LF,>
|
||||
LD HL,PROMPT ;
|
||||
CALL PRTSTR ;
|
||||
LD HL,KEYBUF ; SET POINTER TO KEYBUF AREA
|
||||
CALL GETLN ; GET A LINE OF INPUT FROM THE USER
|
||||
LD HL,KEYBUF ; RESET POINTER TO START OF KEYBUF
|
||||
@@ -93,7 +87,7 @@ SERIALCMDLOOP:
|
||||
JP Z,PIN ; PORT INPUT
|
||||
CP 'D' ; IS IT A "D" (Y/N)
|
||||
JP Z,DUMPMEM ; DUMP MEMORY
|
||||
CP 'K'
|
||||
CP 'K' ; IS IT A "K" (Y/N)
|
||||
JP Z,KLOP ; LOOP ON KEYBOARD
|
||||
CP 'M' ; IS IT A "M" (Y/N)
|
||||
JP Z,MOVEMEM ; MOVE MEMORY COMMAND
|
||||
@@ -102,7 +96,7 @@ SERIALCMDLOOP:
|
||||
CP 'H' ; IS IT A "H" (Y/N)
|
||||
JP Z,HELP ; HELP COMMAND
|
||||
LD HL,TXT_COMMAND ; POINT AT ERROR TEXT
|
||||
CALL MSG ; PRINT COMMAND LABEL
|
||||
CALL PRTSTR ; PRINT COMMAND LABEL
|
||||
|
||||
JR SERIALCMDLOOP
|
||||
;
|
||||
@@ -130,9 +124,9 @@ INITIALIZE:
|
||||
BOOT:
|
||||
#IF (PLATFORM == PLT_UNA)
|
||||
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)
|
||||
JP 0000H ; JUMP TO RESTART ADDRESS
|
||||
JP 0 ; JUMP TO RESTART ADDRESS
|
||||
#ELSE
|
||||
LD A,BID_BOOT ; BOOT BANK
|
||||
LD HL,0 ; ADDRESS ZERO
|
||||
@@ -167,14 +161,12 @@ PROGRM:
|
||||
CP 0 ; TEST FOR TERMINATING NULL
|
||||
JP NZ,ERR ; ERROR IF NOT TERMINATING NULL
|
||||
PROGRM1:
|
||||
CALL CRLF
|
||||
CALL NEWLINE
|
||||
POP HL
|
||||
PUSH HL
|
||||
CALL PHL
|
||||
LD A,':'
|
||||
CALL COUT
|
||||
CALL SPACE
|
||||
CALL COUT
|
||||
CALL PC_COLON
|
||||
CALL PC_SPACE
|
||||
LD HL,KEYBUF
|
||||
CALL GETLN
|
||||
LD HL,KEYBUF
|
||||
@@ -190,7 +182,7 @@ PROGRM1:
|
||||
JR PROGRM1
|
||||
PROGRM2:
|
||||
LD HL,TXT_BADNUM
|
||||
CALL MSG
|
||||
CALL PRTSTR
|
||||
JR PROGRM1
|
||||
;
|
||||
;__KLOP_______________________________________________________________________
|
||||
@@ -199,10 +191,10 @@ PROGRM2:
|
||||
;_____________________________________________________________________________
|
||||
;
|
||||
KLOP:
|
||||
CALL CRLF ;
|
||||
CALL NEWLINE ;
|
||||
KLOP1:
|
||||
CALL KIN ; GET A KEY
|
||||
CP ESC ; IS <ESC>?
|
||||
CP CHR_ESC ; IS <ESC>?
|
||||
JP Z,SERIALCMDLOOP ; IF SO, ALL DONE
|
||||
CALL COUT ; OUTPUT KEY TO SCREEN
|
||||
JR KLOP1 ; LOOP
|
||||
@@ -231,7 +223,7 @@ KLOP1:
|
||||
;_____________________________________________________________________________
|
||||
;
|
||||
HXLOAD:
|
||||
CALL CRLF ; SHOW READY
|
||||
CALL NEWLINE ; SHOW READY
|
||||
HXLOAD0:
|
||||
CALL KIN ; GET THE FIRST CHARACTER, EXPECTING A ':'
|
||||
HXLOAD1:
|
||||
@@ -255,7 +247,7 @@ HXLOAD1:
|
||||
CALL HXCHKSUM ; UPDATE HEX CHECK SUM
|
||||
LD A,E ; RECALL THE CHECKSUM BYTE
|
||||
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
|
||||
HXLOAD2:
|
||||
LD A,D ; RETRIEVE LINE CHARACTER COUNTER
|
||||
@@ -275,8 +267,8 @@ HXLOAD3:
|
||||
JR Z,HXLOADAGAIN ; IF THE CHECKSUM IS STILL OK, CONTINUE ON, ELSE
|
||||
HXLOADERR:
|
||||
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:
|
||||
LD C,A ; BUILD THE CHECKSUM
|
||||
LD A,E ;
|
||||
@@ -286,7 +278,7 @@ HXCHKSUM:
|
||||
RET ; BACK TO CALLER
|
||||
HXLOADAGAIN:
|
||||
CALL KIN ; CATCH THE TRAILING CARRIAGE RETURN
|
||||
JP HXLOAD0 ; LOAD ANOTHER LINE OF DATA
|
||||
JR HXLOAD0 ; LOAD ANOTHER LINE OF DATA
|
||||
HXLOADEXIT:
|
||||
CALL KIN ; CATCH ANY STRAY TRAILING CHARACTERS
|
||||
JP SERIALCMDLOOP ; RETURN TO PROMPT
|
||||
@@ -323,10 +315,10 @@ PIN:
|
||||
CALL WORDPARM ; GET PORT NUMBER
|
||||
JP C,ERR ; HANDLE ERRORS
|
||||
PUSH DE ; SAVE IT
|
||||
CALL CRLF ;
|
||||
CALL NEWLINE ;
|
||||
POP BC ; RESTORE TO BC
|
||||
IN A,(C) ; GET PORT VALUE
|
||||
CALL HXOUT ; PRINT HEX VALUE
|
||||
CALL PRTHEXBYTE ; DISPLAY IT
|
||||
JP SERIALCMDLOOP ; DONE, BACK TO COMMAND LOOP
|
||||
;
|
||||
;__DUMPMEM____________________________________________________________________
|
||||
@@ -348,13 +340,11 @@ DUMPMEM:
|
||||
|
||||
GDATA:
|
||||
INC DE ; BUMP DE FOR LATER COMPARE
|
||||
CALL CRLF ;
|
||||
CALL NEWLINE ;
|
||||
BLKRD:
|
||||
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
|
||||
PUSH HL ; SAVE STARTING HL
|
||||
NXTONE:
|
||||
@@ -363,20 +353,20 @@ NXTONE:
|
||||
IN A,(C) ;
|
||||
EXX ;
|
||||
AND 7FH ;
|
||||
CP ESC ;
|
||||
CP CHR_ESC ;
|
||||
JP Z,SERIALCMDLOOP ;
|
||||
CP 19 ;
|
||||
JR Z,NXTONE ;
|
||||
LD A,(HL) ; GET BYTE
|
||||
CALL HXOUT ; PRINT IT
|
||||
CALL SPACE ;
|
||||
CALL PRTHEXBYTE ; DISPLAY IT
|
||||
CALL PC_SPACE ;
|
||||
UPDH:
|
||||
INC HL ; POINT NEXT
|
||||
DEC C ; DEC LOC COUNT
|
||||
JR NZ,NXTONE ; IF LINE NOT DONE
|
||||
; NOW PRINT 'DECODED' DATA TO RIGHT OF DUMP
|
||||
PCRLF:
|
||||
CALL SPACE ; SPACE IT
|
||||
CALL PC_SPACE ; SPACE IT
|
||||
LD C,16 ; SET FOR 16 CHARS
|
||||
POP HL ; GET BACK START
|
||||
PCRLF0:
|
||||
@@ -401,8 +391,8 @@ UPDH1:
|
||||
DEC C ; DEC CHAR COUNT
|
||||
JR NZ,PCRLF0 ; DO NEXT
|
||||
CONTD:
|
||||
CALL CRLF ;
|
||||
JP BLKRD ;
|
||||
CALL NEWLINE ;
|
||||
JR BLKRD ;
|
||||
;
|
||||
;__MOVEMEM____________________________________________________________________
|
||||
;
|
||||
@@ -484,7 +474,7 @@ FILLMEM1:
|
||||
;
|
||||
HELP:
|
||||
LD HL,TXT_HELP ; POINT AT SYNTAX HELP TEXT
|
||||
CALL MSG ; DISPLAY IT
|
||||
CALL PRTSTR ; DISPLAY IT
|
||||
JP SERIALCMDLOOP ; AND BACK TO COMMAND LOOP
|
||||
;
|
||||
;__ERR________________________________________________________________________
|
||||
@@ -494,7 +484,7 @@ HELP:
|
||||
;
|
||||
ERR:
|
||||
LD HL,TXT_ERR ; POINT AT ERROR TEXT
|
||||
CALL MSG ; DISPLAY IT
|
||||
CALL PRTSTR ; DISPLAY IT
|
||||
JP SERIALCMDLOOP ; AND BACK TO COMMAND LOOP
|
||||
;
|
||||
;__BYTEPARM___________________________________________________________________
|
||||
@@ -507,7 +497,7 @@ BYTEPARM:
|
||||
CALL NONBLANK ; SKIP LEADING BLANKS
|
||||
JP Z,ERR ; SYNTAX ERROR IF PARM NOT FOUND
|
||||
CALL ISHEX ; HEX CHAR?
|
||||
JP NZ,BYTEPARM1 ; IF NOT, ERR
|
||||
JR NZ,BYTEPARM1 ; IF NOT, ERR
|
||||
JP HEXBYTE ; RETURN VIA HEXBYTE
|
||||
BYTEPARM1:
|
||||
SCF ; SIGNAL ERROR
|
||||
@@ -523,11 +513,8 @@ WORDPARM:
|
||||
CALL NONBLANK ; SKIP LEADING BLANKS
|
||||
JP Z,ERR ; SYNTAX ERROR IF PARM NOT FOUND
|
||||
CALL ISHEX ; HEX CHAR?
|
||||
JP NZ,WORDPARM1 ; IF NOT, ERR
|
||||
JR NZ,BYTEPARM1 ; IF NOT, ERR
|
||||
JP HEXWORD ; RETURN VIA HEXWORD
|
||||
WORDPARM1:
|
||||
SCF ; SIGNAL ERROR
|
||||
RET ; RETURN
|
||||
;
|
||||
;__GETLN______________________________________________________________________
|
||||
;
|
||||
@@ -540,10 +527,10 @@ GETLN:
|
||||
PUSH DE ; STORE DE
|
||||
GETLNLOP:
|
||||
CALL KIN ; GET A KEY
|
||||
CP CR ; IS <CR>?
|
||||
CP CHR_CR ; IS <CR>?
|
||||
JR Z,GETLNDONE ; YES, EXIT
|
||||
CALL COUT ; OUTPUT KEY TO SCREEN
|
||||
CP BS ; IS <BS>?
|
||||
CP CHR_BS ; IS <BS>?
|
||||
JR NZ,GETLNSTORE ; NO, STORE CHAR
|
||||
LD A,C ; A=C
|
||||
CP 0 ;
|
||||
@@ -554,7 +541,7 @@ GETLNLOP:
|
||||
LD (HL),A ; STORE NULL IN BUFFER
|
||||
LD A,20H ; BLANK OUT CHAR ON TERM
|
||||
CALL COUT ;
|
||||
LD A,BS ;
|
||||
LD A,CHR_BS ;
|
||||
CALL COUT ;
|
||||
JR GETLNLOP ; GET NEXT KEY
|
||||
GETLNSTORE:
|
||||
@@ -584,30 +571,6 @@ KIN:
|
||||
AND 5FH ; MAKE UPPER CASE
|
||||
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___________________________________________________________________
|
||||
;
|
||||
; FIND NEXT NONBLANK CHARACTER IN BUFFER AT (HL)
|
||||
@@ -715,9 +678,9 @@ ALPH:
|
||||
;_____________________________________________________________________________
|
||||
;
|
||||
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 ;
|
||||
@@ -740,66 +703,11 @@ NIBLS:
|
||||
;
|
||||
PHL:
|
||||
LD A,H ; GET HI BYTE
|
||||
CALL HXOUT ; DO HEX OUT ROUTINE
|
||||
CALL PRTHEXBYTE ; DISPLAY IT
|
||||
LD A,L ; GET LOW BYTE
|
||||
CALL HXOUT ; HEX IT
|
||||
CALL PRTHEXBYTE ; DISPLAY IT
|
||||
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)
|
||||
;
|
||||
;__COUT_______________________________________________________________________
|
||||
@@ -957,49 +865,49 @@ KEYBUF: .FILL 80,' '
|
||||
;_____________________________________________________________________________
|
||||
;
|
||||
TCRLF:
|
||||
.DB CR,LF,0
|
||||
.DB CHR_CR,CHR_LF,'$'
|
||||
|
||||
PROMPT:
|
||||
.DB CR,LF,'>',0
|
||||
.DB CHR_CR,CHR_LF,'>','$'
|
||||
|
||||
TXT_READY:
|
||||
.DB CR,LF
|
||||
.DB CHR_CR,CHR_LF
|
||||
.TEXT "MONITOR READY ('H' FOR HELP)"
|
||||
.DB 0
|
||||
.DB '$'
|
||||
|
||||
TXT_COMMAND:
|
||||
.DB CR,LF
|
||||
.DB CHR_CR,CHR_LF
|
||||
.TEXT "UNKNOWN COMMAND ('H' FOR HELP)"
|
||||
.DB 0
|
||||
.DB '$'
|
||||
|
||||
TXT_ERR:
|
||||
.DB CR,LF
|
||||
.DB CHR_CR,CHR_LF
|
||||
.TEXT "SYNTAX ERROR ('H' FOR HELP)"
|
||||
.DB 0
|
||||
.DB '$'
|
||||
|
||||
TXT_CKSUMERR:
|
||||
.DB CR,LF
|
||||
.DB CHR_CR,CHR_LF
|
||||
.TEXT "CHECKSUM ERROR"
|
||||
.DB 0
|
||||
.DB '$'
|
||||
|
||||
TXT_BADNUM:
|
||||
.TEXT " *INVALID VALUE*"
|
||||
.DB 0
|
||||
.DB '$'
|
||||
|
||||
TXT_HELP:
|
||||
.DB CR,LF
|
||||
.DB CHR_CR,CHR_LF
|
||||
.TEXT "MONITOR COMMANDS (ALL VALUES IN HEX):\r\n"
|
||||
.TEXT "B - BOOT SYSTEM\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 "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 "L - LOAD INTEL HEX FORMAT DATA\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 "P XXXX - PROGRAM RAM STARTING AT XXXX\r\n"
|
||||
.TEXT "R XXXX - RUN A PROGRAM AT ADDRESS XXXX"
|
||||
.DB 0
|
||||
.DB '$'
|
||||
;
|
||||
#IF DSKYENABLE
|
||||
;
|
||||
@@ -1062,6 +970,8 @@ DOBOOT:
|
||||
;__DOPORTREAD_________________________________________________________________
|
||||
;
|
||||
; PERFORM PORT READ FRONT PANEL ACTION
|
||||
; PANEL TEMPLATE "Po88 88"
|
||||
; POS 01234567
|
||||
;_____________________________________________________________________________
|
||||
;
|
||||
DOPORTREAD:
|
||||
@@ -1072,33 +982,33 @@ PORTREADLOOP:
|
||||
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"
|
||||
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"
|
||||
LD C,A ; STORE VALUE IN "C"
|
||||
SRL A ; ROTATE HIGH NIB TO LOW
|
||||
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"
|
||||
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 (DISPLAYBUF+5),A ;
|
||||
LD (DISPLAYBUF+4),A ;
|
||||
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 (DISPLAYBUF+1),A ; STORE IN DISP 6
|
||||
LD (DISPLAYBUF+1),A ; STORE IN DISP 1
|
||||
LD HL,DISPLAYBUF ; SET POINTER TO DISPLAY BUFFER
|
||||
CALL ENCDISPLAY ; DISPLAY BUFFER CONTENTS
|
||||
PORTREADGETKEY:
|
||||
CALL KB_GET ; GET KEY FROM KB
|
||||
CP 12H ; [CL] PRESSED, EXIT
|
||||
JP Z,PORTREADEXIT ;
|
||||
JR Z,PORTREADEXIT ;
|
||||
CP 10H ; [PR] PRESSED, PROMPT FOR NEW PORT
|
||||
JR Z,DOPORTREAD ;
|
||||
JR PORTREADGETKEY ; NO VALID KEY, LOOP
|
||||
@@ -1110,6 +1020,8 @@ PORTREADEXIT:
|
||||
;__DOPORTWRITE________________________________________________________________
|
||||
;
|
||||
; PERFORM PORT WRITE FRONT PANEL ACTION
|
||||
; PANEL TEMPLATE "Po88 88"
|
||||
; POS 01234567
|
||||
;_____________________________________________________________________________
|
||||
;
|
||||
DOPORTWRITE:
|
||||
@@ -1120,16 +1032,16 @@ PORTWRITELOOP:
|
||||
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"
|
||||
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+4),A ;
|
||||
LD A,13H ; DISPLAY "P" IN DISP 7
|
||||
LD A,13H ; DISPLAY "P" IN DISP 0
|
||||
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 HL,DISPLAYBUF ; POINT TO DISPLAY BUFFER
|
||||
CALL GETVALUE ; INPUT A BYTE VALUE, RETURN IN "A"
|
||||
@@ -1150,6 +1062,8 @@ DOGO:
|
||||
;__DODEPOSIT__________________________________________________________________
|
||||
;
|
||||
; PERFORM DEPOSIT FRONT PANEL ACTION
|
||||
; PANEL TEMPLATE "8888 88"
|
||||
; POS 01234567
|
||||
;_____________________________________________________________________________
|
||||
;
|
||||
DODEPOSIT:
|
||||
@@ -1183,7 +1097,7 @@ DEPOSITLOOP:
|
||||
DEPOSITGETKEY:
|
||||
CALL KB_GET ; GET KEY FROM KB
|
||||
CP 12H ; [CL] PRESSED, EXIT
|
||||
JP Z,DEPOSITEXIT ;
|
||||
JR Z,DEPOSITEXIT ;
|
||||
CP 13H ; [EN] PRESSED, INC ADDRESS AND LOOP
|
||||
JR Z,DEPOSITFW ;
|
||||
CP 14H ; [DE] PRESSED, PROMPT FOR NEW ADDRESS
|
||||
@@ -1201,6 +1115,8 @@ DEPOSITEXIT:
|
||||
;__DOEXAMINE__________________________________________________________________
|
||||
;
|
||||
; PERFORM EXAMINE FRONT PANEL ACTION
|
||||
; PANEL TEMPLATE "8888 88"
|
||||
; POS 01234567
|
||||
;_____________________________________________________________________________
|
||||
;
|
||||
DOEXAMINE:
|
||||
@@ -1208,41 +1124,41 @@ DOEXAMINE:
|
||||
PUSH HL ; STORE HL
|
||||
EXAMINELOOP:
|
||||
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 ;
|
||||
LD (DISPLAYBUF+0),A ;
|
||||
LD A,H ; RESTORE HIGH BYTE
|
||||
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"
|
||||
SRL A ; SHOW HIGH NIBBLE IN DISP 5
|
||||
SRL A ; SHOW HIGH NIBBLE IN DISP 2
|
||||
SRL A ;
|
||||
SRL A ;
|
||||
SRL A ;
|
||||
LD (DISPLAYBUF+2),A ;
|
||||
LD A,L ; RESTORE LOW BYTE IN "A"
|
||||
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 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 ;
|
||||
LD (DISPLAYBUF+6),A ;
|
||||
LD A,(HL) ; GET VALUE FROM ADDRESS IN HL
|
||||
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
|
||||
CALL ENCDISPLAY ; DISPLAY BUFFER ON DISPLAYS
|
||||
POP HL ; RESTORE HL
|
||||
EXAMINEGETKEY:
|
||||
CALL KB_GET ; GET KEY FROM KB
|
||||
CP 12H ; [CL] PRESSED, EXIT
|
||||
JP Z,EXAMINEEXIT ;
|
||||
JR Z,EXAMINEEXIT ;
|
||||
CP 13H ; [EN] PRESSED, INC ADDRESS AND LOOP
|
||||
JR Z,EXAMINEFW ;
|
||||
CP 15H ; [DE] PRESSED, PROMPT FOR NEW ADDRESS
|
||||
@@ -1260,6 +1176,8 @@ EXAMINEEXIT:
|
||||
;__GETADDR____________________________________________________________________
|
||||
;
|
||||
; GET ADDRESS FROM FRONT PANEL
|
||||
; PANEL TEMPLATE "Adr 8888"
|
||||
; POS 01234567
|
||||
;_____________________________________________________________________________
|
||||
;
|
||||
GETADDR:
|
||||
@@ -1283,27 +1201,27 @@ GETADDRLOOP:
|
||||
JR GETADDRLOOP ; INVALID KEY, LOOP
|
||||
GETADDRDONE:
|
||||
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 ;
|
||||
SLA A ;
|
||||
SLA A ;
|
||||
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
|
||||
OR C ; ADD IN NIBBLE STORED IN C
|
||||
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 ;
|
||||
SLA A ;
|
||||
SLA A ;
|
||||
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
|
||||
OR C ; ADD IN NIBBLE STORED IN "C"
|
||||
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+6),A ;
|
||||
LD (DISPLAYBUF+5),A ;
|
||||
@@ -1325,8 +1243,11 @@ GETADDRNUM:
|
||||
;__GETPORT____________________________________________________________________
|
||||
;
|
||||
; GET PORT FROM FRONT PANEL
|
||||
; PANEL TEMPLATE "Port 88"
|
||||
; POS 01234567
|
||||
;_____________________________________________________________________________
|
||||
;
|
||||
;***use getvalue below after init of displaybuf
|
||||
GETPORT:
|
||||
PUSH BC ; STORE BC
|
||||
GETPORT0:
|
||||
@@ -1374,6 +1295,8 @@ GETPORTNUM:
|
||||
;__GETVALUE___________________________________________________________________
|
||||
;
|
||||
; GET VALUE FROM FRONT PANEL
|
||||
; PANEL TEMPLATE "??????88"
|
||||
; POS 01234567
|
||||
;_____________________________________________________________________________
|
||||
;
|
||||
GETVALUE:
|
||||
@@ -1415,10 +1338,10 @@ GETVALUENUM:
|
||||
LD (DISPLAYBUF+7),A ;
|
||||
JR GETVALUE1 ;
|
||||
GETVALUECLEAR:
|
||||
LD A,12H ;
|
||||
LD A,00H ;
|
||||
LD (DISPLAYBUF+7),A ;
|
||||
LD (DISPLAYBUF+6),A ;
|
||||
JP GETVALUE1 ;
|
||||
JR GETVALUE1 ;
|
||||
;
|
||||
;__MTERM_INIT_________________________________________________________________
|
||||
;
|
||||
@@ -1481,6 +1404,7 @@ ENCDISPLAY1:
|
||||
;
|
||||
;_____________________________________________________________________________
|
||||
;
|
||||
;***remove this and replace occurences with dsky_showraw
|
||||
SEGDISPLAY:
|
||||
PUSH AF
|
||||
PUSH BC
|
||||
|
||||
@@ -44,7 +44,7 @@ KY_BO .EQU 017H ; BOOT
|
||||
;
|
||||
;__DSKY_INIT_________________________________________________________________________________________
|
||||
;
|
||||
; CHECK FOR KEY PRESS, SAVE RAW VALUE, RETURN STATUS
|
||||
; CONFIGURE PARALLEL PORT AND CLEAR ANY BUFFERED CHARACTER
|
||||
;____________________________________________________________________________________________________
|
||||
;
|
||||
DSKY_INIT:
|
||||
|
||||
@@ -1099,7 +1099,7 @@ INITSYS3:
|
||||
;
|
||||
#IFDEF ROMBOOT
|
||||
; 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
|
||||
CALL HBX_BNKCALL ; GO THERE
|
||||
HALT ; WE SHOULD NEVER COME BACK!
|
||||
|
||||
@@ -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 "std.asm"
|
||||
;
|
||||
INT_IM1 .EQU $FF00
|
||||
;
|
||||
BID_CUR .EQU -1 ; SPECIAL BANK ID VALUE INDICATES CURRENT BANK
|
||||
;
|
||||
.ORG 0
|
||||
;
|
||||
@@ -47,68 +75,22 @@ INT_IM1 .EQU $FF00
|
||||
;
|
||||
.FILL (100H - $),0FFH ; PAD REMAINDER OF PAGE ZERO
|
||||
;
|
||||
;
|
||||
;==================================================================================================
|
||||
; LOADER
|
||||
; STARTUP AND LOADER INITIALIZATION
|
||||
;==================================================================================================
|
||||
;
|
||||
DI ; NO INTERRUPTS FOR NOW
|
||||
;
|
||||
; RELOCATE TO START OF COMMON RAM AT $8000
|
||||
LD HL,0
|
||||
LD DE,$8000
|
||||
LD BC,LDR_SIZ
|
||||
LDIR
|
||||
JP START
|
||||
;
|
||||
; 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.
|
||||
.ORG $8000 + $
|
||||
;
|
||||
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
|
||||
;
|
||||
#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
|
||||
;
|
||||
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)
|
||||
CALL DELAY_INIT ; INIT DELAY FUNCTIONS
|
||||
@@ -160,83 +142,91 @@ START: DI ; NO INTERRUPTS
|
||||
#ENDIF
|
||||
EI
|
||||
;
|
||||
; RUN THE BOOT LOADER MENU
|
||||
;==================================================================================================
|
||||
; BOOT LOADER MENU DISPLAY
|
||||
;==================================================================================================
|
||||
;
|
||||
LD DE,STR_BANNER ; DISPLAY BOOT BANNER
|
||||
|
||||
DOBOOTMENU:
|
||||
;
|
||||
MENU:
|
||||
CALL WRITESTR ; DISPLAY MESSAGE OR ERROR
|
||||
CALL NEWLINE
|
||||
CALL NEWLINE2
|
||||
;
|
||||
#IF (DSKYENABLE)
|
||||
; DISPLAY DSKY BOOT MESSAGE
|
||||
LD HL,BOOT ; POINT TO BOOT MESSAGE
|
||||
CALL DSKY_SHOWRAW ; DISPLAY MESSAGE
|
||||
#ENDIF
|
||||
;
|
||||
#IF (BOOTTYPE == BT_AUTO)
|
||||
; INITIALIZE BOOT TIMEOUT DOWNCOUNTER
|
||||
LD BC,100 * BOOT_TIMEOUT
|
||||
LD (BL_TIMEOUT),BC
|
||||
#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
|
||||
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)
|
||||
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
|
||||
|
||||
GOTNK: ; CHECK AUTOBOOT TIMEOUT
|
||||
|
||||
;
|
||||
SEL2:
|
||||
#IF (BOOTTYPE == BT_AUTO)
|
||||
; CHECK FOR AUTOBOOT TIMEOUT
|
||||
LD DE,625 ; DELAY FOR 10MS TO MAKE TIMEOUT CALC EASY
|
||||
CALL VDELAY ; 16US * 625 = 10MS
|
||||
LD BC,(BL_TIMEOUT) ; CHECK/INCREMENT TIMEOUT
|
||||
@@ -244,55 +234,78 @@ GOTNK: ; CHECK AUTOBOOT TIMEOUT
|
||||
LD (BL_TIMEOUT),BC
|
||||
LD A,B
|
||||
OR C
|
||||
JP NZ,DB_BOOTLOOP
|
||||
|
||||
JP NZ,SEL3
|
||||
;
|
||||
LD A,BOOT_DEFAULT ; TIMEOUT EXPIRED,
|
||||
JR MENU_A ; PERFORM DEFAULT BOOT ACTION
|
||||
#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 HL,MENU_V
|
||||
MENU_C: EX DE,HL
|
||||
MATS1: EX DE,HL
|
||||
ADD HL,DE
|
||||
CP (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
|
||||
|
||||
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
|
||||
INC HL ; WE HAVE A VALID ROM MENU OPTION
|
||||
LD E,(HL)
|
||||
INC HL
|
||||
LD D,(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 M2
|
||||
#DEFCONT \ .DW M3
|
||||
#IF (DSKYENABLE)
|
||||
#DEFCONT \ .DB M3
|
||||
#ELSE
|
||||
#DEFCONT \ .DB $FF
|
||||
#ENDIF
|
||||
#DEFCONT \ .DW M4
|
||||
#DEFCONT \ .DW M5
|
||||
#DEFCONT \ .DW M6
|
||||
@@ -301,57 +314,164 @@ DB_INVALID:
|
||||
#DEFCONT \ .DB M9
|
||||
#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$ ")
|
||||
|
||||
#IF (DSKYENABLE)
|
||||
MENU_L("DSKY-MON $", "D", GOROM, MON_DSKY, 1000h, MON_LOC, MON_SIZ, BID_BIOSIMG, BID_USR, "DSKY Monitor$")
|
||||
; 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
|
||||
|
||||
.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
|
||||
|
||||
#IF (DSKYENABLE)
|
||||
MENU_L("~DSKY$ ", "D", KY_GO, MON_DSKY, 1000h, MON_LOC, MON_SIZ, BID_CUR, BID_USR, "DSKY Monitor$")
|
||||
#ENDIF
|
||||
MENU_L("$ ", "E", $FF, EGG_LOC, 0E00h, EGG_LOC, EGG_SIZ, BID_CUR, BID_USR, "Easter Egg$ ")
|
||||
;
|
||||
; REBOOT ROMLDR
|
||||
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
|
||||
;
|
||||
REBOOT: LD A,BID_BOOT ; BOOT BANK
|
||||
;==================================================================================================
|
||||
; 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
|
||||
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:
|
||||
LD (BL_BOOTID),A
|
||||
LD DE,STR_BOOTDISK
|
||||
CALL WRITESTR
|
||||
CALL PRTHEXBYTE
|
||||
PRTS("...$")
|
||||
;
|
||||
; BOOT FROM DISK DRIVE
|
||||
;
|
||||
BOOTDISK:
|
||||
LD DE,STR_BOOTDISK1 ; DISK BOOT MESSAGE
|
||||
CALL WRITESTR ; PRINT IT
|
||||
|
||||
;
|
||||
#IF (PLATFORM == PLT_UNA)
|
||||
;
|
||||
; BOOT FROM UNA DISK DRIVE
|
||||
;
|
||||
LD A,(BL_BOOTID) ; GET BOOT DEVICE ID
|
||||
LD B,A ; MOVE TO B
|
||||
|
||||
;
|
||||
; LOAD SECTOR 2 (BOOT INFO)
|
||||
LD C,$41 ; UNA FUNC: SET LBA
|
||||
LD DE,0 ; HI WORD OF LBA IS ALWAYS ZERO
|
||||
@@ -364,7 +484,6 @@ BOOTDISK:
|
||||
LD L,1 ; SECTORS TO READ
|
||||
RST 08 ; DO READ
|
||||
JP NZ,DB_ERR ; HANDLE ERROR
|
||||
;
|
||||
#ELSE
|
||||
; CHECK FOR VALID DRIVE LETTER
|
||||
LD A,(BL_BOOTID) ; BOOT DEVICE TO A
|
||||
@@ -375,13 +494,13 @@ BOOTDISK:
|
||||
POP AF ; RESTORE BOOT DEVICE
|
||||
CP E ; CHECK MAX (INDEX - COUNT)
|
||||
JP NC,DB_NODISK ; HANDLE INVALID SELECTION
|
||||
|
||||
;
|
||||
; SET THE BOOT UNIT AND SLICE
|
||||
LD A,(BL_BOOTID) ; GET BOOTID
|
||||
LD (BL_DEVICE),A ; STORE IT
|
||||
XOR A ; LU ALWAYS ZERO
|
||||
LD (BL_LU),A ; STORE IT
|
||||
|
||||
;
|
||||
; SENSE MEDIA
|
||||
LD A,(BL_DEVICE) ; GET DEVICE/UNIT
|
||||
LD C,A ; STORE IN C
|
||||
@@ -389,7 +508,7 @@ BOOTDISK:
|
||||
LD E,1 ; ENABLE MEDIA CHECK/DISCOVERY
|
||||
RST 08 ; CALL HBIOS
|
||||
JP NZ,DB_ERR ; HANDLE ERROR
|
||||
|
||||
;
|
||||
; SEEK TO SECTOR 2 OF LU
|
||||
LD A,(BL_LU) ; GET LU SPECIFIED
|
||||
LD E,A ; LU INDEX
|
||||
@@ -401,7 +520,7 @@ BOOTDISK:
|
||||
LD C,A ; PUT IN C
|
||||
RST 08 ; DO IT
|
||||
JP NZ,DB_ERR ; HANDLE ERROR
|
||||
|
||||
;
|
||||
; READ
|
||||
LD B,BF_DIOREAD ; FUNCTION IN B
|
||||
LD A,(BL_DEVICE) ; GET BOOT DISK UNIT
|
||||
@@ -414,7 +533,6 @@ BOOTDISK:
|
||||
#ENDIF
|
||||
;
|
||||
; CHECK SIGNATURE
|
||||
CALL NEWLINE ; FORMATTING
|
||||
LD DE,(BB_SIG) ; GET THE SIGNATURE
|
||||
LD A,$A5 ; FIRST BYTE SHOULD BE $A5
|
||||
CP D ; COMPARE
|
||||
@@ -422,32 +540,24 @@ BOOTDISK:
|
||||
LD A,$5A ; SECOND BYTE SHOULD BE $5A
|
||||
CP E ; COMPARE
|
||||
JP NZ,DB_NOBOOT ; ERROR IS NOT EQUAL
|
||||
|
||||
;
|
||||
; PRINT CPMLOC VALUE
|
||||
CALL NEWLINE
|
||||
LD DE,STR_CPMLOC
|
||||
CALL WRITESTR
|
||||
PRTS("\r\nLoc=$")
|
||||
LD BC,(BB_CPMLOC)
|
||||
CALL PRTHEXWORD
|
||||
|
||||
;
|
||||
; PRINT CPMEND VALUE
|
||||
CALL PC_SPACE
|
||||
LD DE,STR_CPMEND
|
||||
CALL WRITESTR
|
||||
PRTS(" End=$")
|
||||
LD BC,(BB_CPMEND)
|
||||
CALL PRTHEXWORD
|
||||
|
||||
;
|
||||
; PRINT CPMENT VALUE
|
||||
CALL PC_SPACE
|
||||
LD DE,STR_CPMENT
|
||||
CALL WRITESTR
|
||||
PRTS(" Ent=$")
|
||||
LD BC,(BB_CPMENT)
|
||||
CALL PRTHEXWORD
|
||||
CALL PC_SPACE
|
||||
|
||||
;
|
||||
; PRINT DISK LABEL
|
||||
LD DE,STR_LABEL
|
||||
CALL WRITESTR
|
||||
PRTS(" Label=$")
|
||||
LD DE,BB_LABEL ; if it is there, then a printable
|
||||
LD A,(BB_TERM) ; Display Disk Label if Present
|
||||
CP '$' ; (dwg 2/7/2012)
|
||||
@@ -505,7 +615,7 @@ BOOTDISK:
|
||||
LD E,A ; NUMBER OF SECTORS TO LOAD
|
||||
RST 08
|
||||
JP NZ,DB_ERR ; HANDLE ERRORS
|
||||
|
||||
;
|
||||
; PASS BOOT DEVICE/UNIT/LU TO CBIOS COLD BOOT
|
||||
LD B,BF_SYSSET ; HB FUNC: SET HBIOS PARAMETER
|
||||
LD C,BF_SYSSET_BOOTINFO ; HB SUBFUNC: SET BOOT INFO
|
||||
@@ -517,7 +627,7 @@ BOOTDISK:
|
||||
LD E,A ; SAVE IN E
|
||||
RST 08
|
||||
JP NZ,DB_ERR ; HANDLE ERRORS
|
||||
|
||||
;
|
||||
; JUMP TO COLD BOOT ENTRY
|
||||
LD A,BID_USR ; ACTIVATE USER BANK
|
||||
LD HL,(BB_CPMENT) ; OS ENTRY ADDRESS
|
||||
@@ -530,21 +640,20 @@ BOOTDISK:
|
||||
DB_NODISK:
|
||||
; SELDSK DID NOT LIKE DRIVE SELECTION
|
||||
LD DE,STR_NODISK
|
||||
JP DOBOOTMENU
|
||||
|
||||
JP MENU
|
||||
;
|
||||
DB_NOBOOT:
|
||||
; DISK IS NOT BOOTABLE
|
||||
LD DE,STR_NOBOOT
|
||||
JP DOBOOTMENU
|
||||
|
||||
JP MENU
|
||||
;
|
||||
DB_ERR:
|
||||
; I/O ERROR DURING BOOT ATTEMPT
|
||||
LD DE,STR_BOOTERR
|
||||
JP DOBOOTMENU
|
||||
JP MENU
|
||||
;
|
||||
#IF (PLATFORM == PLT_UNA)
|
||||
;
|
||||
;
|
||||
; PRINT LIST OF ALL DRIVES UNDER UNA
|
||||
;
|
||||
PRTALL:
|
||||
@@ -712,31 +821,31 @@ DEV15 .EQU DEVUNK
|
||||
;
|
||||
#ENDIF
|
||||
;
|
||||
;__TEXT_STRINGS_________________________________________________________________________________________________________________
|
||||
;==================================================================================================
|
||||
; 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$"
|
||||
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)
|
||||
; b o o t . .
|
||||
BOOT .DB $9F,$9D,$9D,$94,$80,$80,$00,$00
|
||||
#ENDIF
|
||||
;
|
||||
;==================================================================================================
|
||||
; INCLUDES
|
||||
;==================================================================================================
|
||||
;
|
||||
#DEFINE USEDELAY
|
||||
#INCLUDE "util.asm"
|
||||
;
|
||||
@@ -893,7 +1002,7 @@ CINUC:
|
||||
; FILL REMAINDER OF BANK
|
||||
;==================================================================================================
|
||||
;
|
||||
SLACK: .EQU ($LDR_SIZ - $)
|
||||
SLACK: .EQU ($8000 + LDR_SIZ - $)
|
||||
.FILL SLACK
|
||||
;
|
||||
.ECHO "LOADER space remaining: "
|
||||
@@ -903,8 +1012,7 @@ SLACK: .EQU ($LDR_SIZ - $)
|
||||
;==================================================================================================
|
||||
; WORKING DATA STORAGE
|
||||
;==================================================================================================
|
||||
;
|
||||
.ORG $8000
|
||||
.ORG $8000 + LDR_SIZ
|
||||
;
|
||||
.DS 64 ; 32 LEVEL STACK
|
||||
BL_STACK .EQU $ ; ... TOP IS HERE
|
||||
|
||||
@@ -325,8 +325,10 @@ BID_ROMN .EQU (BID_ROM0 + ((ROMSIZE / 32) - 1))
|
||||
BID_RAMN .EQU (BID_RAM0 + ((RAMSIZE / 32) - 1))
|
||||
|
||||
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_ROMD0 .EQU BID_ROM0 + 4 ; FIRST ROM DRIVE BANK
|
||||
BID_ROMDN .EQU BID_ROMN ; LAST ROM DRIVE BANK
|
||||
|
||||
@@ -273,7 +273,7 @@ DB_PCRLF0:
|
||||
LD A,(HL) ; GET BYTE
|
||||
AND 060H ; SEE IF A 'DOT'
|
||||
LD A,(HL) ; O.K. TO GET
|
||||
JR NZ,DB_PDOT ;
|
||||
JR NZ,DB_PDOT ;
|
||||
DB_DOT:
|
||||
LD A,2EH ; LOAD A DOT
|
||||
DB_PDOT:
|
||||
@@ -285,19 +285,18 @@ DB_PDOT:
|
||||
LD A,E ;
|
||||
CP L ;
|
||||
JP Z,DB_END ;
|
||||
;
|
||||
;IF BLOCK NOT DUMPED, DO NEXT CHARACTER OR LINE
|
||||
DB_UPDH1:
|
||||
; IF BLOCK NOT DUMPED, DO NEXT CHARACTER OR LINE
|
||||
DEC C ; DEC. CHAR COUNT
|
||||
JR NZ,DB_PCRLF0 ; DO NEXT
|
||||
DB_CONTD:
|
||||
CALL NEWLINE ;
|
||||
JP DB_BLKRD ;
|
||||
JP DB_BLKRD ;
|
||||
|
||||
DB_END:
|
||||
RET ;
|
||||
;
|
||||
; OUTPUT A '$' TERMINATED STRING
|
||||
; OUTPUT A '$' TERMINATED STRING AT DE
|
||||
;
|
||||
WRITESTR:
|
||||
PUSH AF
|
||||
|
||||
@@ -2,4 +2,4 @@
|
||||
#DEFINE RMN 9
|
||||
#DEFINE RUP 1
|
||||
#DEFINE RTP 0
|
||||
#DEFINE BIOSVER "2.9.1-pre.7"
|
||||
#DEFINE BIOSVER "2.9.1-pre.8"
|
||||
|
||||
Reference in New Issue
Block a user