diff --git a/Source/CBIOS/ver.inc b/Source/CBIOS/ver.inc index 6f33bd5a..fd364f7a 100644 --- a/Source/CBIOS/ver.inc +++ b/Source/CBIOS/ver.inc @@ -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" diff --git a/Source/HBIOS/API.txt b/Source/HBIOS/API.txt index 3c6d5bf7..74c8794c 100644 --- a/Source/HBIOS/API.txt +++ b/Source/HBIOS/API.txt @@ -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.) diff --git a/Source/HBIOS/dbgmon.asm b/Source/HBIOS/dbgmon.asm index 08ce5dda..3bce3a34 100644 --- a/Source/HBIOS/dbgmon.asm +++ b/Source/HBIOS/dbgmon.asm @@ -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 ? + CP CHR_ESC ; IS ? 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 ? + CP CHR_CR ; IS ? JR Z,GETLNDONE ; YES, EXIT CALL COUT ; OUTPUT KEY TO SCREEN - CP BS ; IS ? + CP CHR_BS ; IS ? 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 diff --git a/Source/HBIOS/dsky.asm b/Source/HBIOS/dsky.asm index d7b2e9eb..8d309ae6 100644 --- a/Source/HBIOS/dsky.asm +++ b/Source/HBIOS/dsky.asm @@ -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: diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index 56116b9c..704b60e3 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -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! diff --git a/Source/HBIOS/romldr.asm b/Source/HBIOS/romldr.asm index 1b5293e1..54f68211 100644 --- a/Source/HBIOS/romldr.asm +++ b/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 "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 ;================================================================================================== ; - 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) 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 - - 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 - - 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$ ") - +; 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) - 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 - - .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 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 -;_____________________________________________________________________________________________________________________________ -; -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) ; 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 diff --git a/Source/HBIOS/std.asm b/Source/HBIOS/std.asm index bb310d3e..cc37b3fc 100644 --- a/Source/HBIOS/std.asm +++ b/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_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 diff --git a/Source/HBIOS/util.asm b/Source/HBIOS/util.asm index 11a87e3c..92dbe9f1 100644 --- a/Source/HBIOS/util.asm +++ b/Source/HBIOS/util.asm @@ -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 diff --git a/Source/HBIOS/ver.inc b/Source/HBIOS/ver.inc index 6f33bd5a..fd364f7a 100644 --- a/Source/HBIOS/ver.inc +++ b/Source/HBIOS/ver.inc @@ -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"