diff --git a/Source/CBIOS/cbios.asm b/Source/CBIOS/cbios.asm index 4af347ef..34d8647d 100644 --- a/Source/CBIOS/cbios.asm +++ b/Source/CBIOS/cbios.asm @@ -350,33 +350,41 @@ REBOOT: ; ;__________________________________________________________________________________________________ WBOOT: - LD SP,STACK ; STACK FOR INITIALIZATION +; +#IFDEF PLTWBW + ; GIVE HBIOS A CHANCE TO DIAGNOSE ISSUES, PRIMARILY + ; THE OCCURRENCE OF A Z180 INVALID OPCODE TRAP + POP HL ; SAVE PC FOR DIAGNOSIS + LD SP,STACK ; STACK FOR INITIALIZATION + LD BC,$F003 ; HBIOS USER RESET FUNCTION + RST 08 ; DO IT +#ENDIF ; #IFDEF PLTUNA ; RESTORE COMMAND PROCESSOR FROM UNA BIOS CACHE - LD BC,$01FB ; UNA FUNC = SET BANK - LD DE,(BNKBIOS) ; UBIOS_PAGE (SEE PAGES.INC) - RST 08 ; DO IT - PUSH DE ; SAVE PREVIOUS BANK - - LD HL,(CCPBUF) ; ADDRESS OF CCP BUF IN BIOS MEM - LD DE,CCP_LOC ; ADDRESS IN HI MEM OF CCP - LD BC,CCP_SIZ ; SIZE OF CCP - LDIR ; DO IT - - LD BC,$01FB ; UNA FUNC = SET BANK - POP DE ; RECOVER OPERATING BANK - RST 08 ; DO IT + LD BC,$01FB ; UNA FUNC = SET BANK + LD DE,(BNKBIOS) ; UBIOS_PAGE (SEE PAGES.INC) + RST 08 ; DO IT + PUSH DE ; SAVE PREVIOUS BANK + + LD HL,(CCPBUF) ; ADDRESS OF CCP BUF IN BIOS MEM + LD DE,CCP_LOC ; ADDRESS IN HI MEM OF CCP + LD BC,CCP_SIZ ; SIZE OF CCP + LDIR ; DO IT + + LD BC,$01FB ; UNA FUNC = SET BANK + POP DE ; RECOVER OPERATING BANK + RST 08 ; DO IT #ELSE ; RESTORE COMMAND PROCESSOR FROM CACHE IN HB BANK - LD B,BF_SYSSETCPY ; HBIOS FUNC: SETUP BANK COPY - LD DE,(BNKBIOS) ; D = DEST (USER BANK), E = SRC (BIOS BANK) - LD HL,CCP_SIZ ; HL = COPY LEN = SIZE OF COMMAND PROCESSOR - RST 08 ; DO IT - LD B,BF_SYSBNKCPY ; HBIOS FUNC: PERFORM BANK COPY - LD HL,(CCPBUF) ; COPY FROM FIXED LOCATION IN HB BANK - LD DE,CCP_LOC ; TO CCP LOCATION IN USR BANK - RST 08 ; DO IT + LD B,BF_SYSSETCPY ; HBIOS FUNC: SETUP BANK COPY + LD DE,(BNKBIOS) ; D = DEST (USER BANK), E = SRC (BIOS BANK) + LD HL,CCP_SIZ ; HL = COPY LEN = SIZE OF COMMAND PROCESSOR + RST 08 ; DO IT + LD B,BF_SYSBNKCPY ; HBIOS FUNC: PERFORM BANK COPY + LD HL,(CCPBUF) ; COPY FROM FIXED LOCATION IN HB BANK + LD DE,CCP_LOC ; TO CCP LOCATION IN USR BANK + RST 08 ; DO IT #ENDIF ; ; SOME APPLICATIONS STEAL THE BDOS SERIAL NUMBER STORAGE diff --git a/Source/CPM3/bioskrnl.asm b/Source/CPM3/bioskrnl.asm index bd21c783..85effacf 100644 --- a/Source/CPM3/bioskrnl.asm +++ b/Source/CPM3/bioskrnl.asm @@ -172,7 +172,10 @@ boot$1: ; Entry for system restarts. wboot: - lxi sp,boot$stack + pop h ; WBW: save PC for diagnosis + lxi sp,boot$stack ; reset stack + lxi b,0F003H ; WBW: HBIOS user reset func + rst 1 ; WBW: do it call set$jumps ; initialize page zero call ?rlccp ; reload CCP jmp ccp ; then reset jmp vectors and exit to ccp diff --git a/Source/HBIOS/Config/RCZ280_nat_zz.asm b/Source/HBIOS/Config/RCZ280_nat_zz.asm index d9f325c4..e74f9d28 100644 --- a/Source/HBIOS/Config/RCZ280_nat_zz.asm +++ b/Source/HBIOS/Config/RCZ280_nat_zz.asm @@ -29,4 +29,4 @@ RAMLOC .SET 23 ; START OF RAM AS POWER OF 2 (2^N) IN PHYSICAL ADDRESS SPACE RAMBIAS .SET (1 << (RAMLOC - 10)) ; OFFSET OF START OF RAM IN PHYSICAL ADDRESS SPACE ; -Z2U0HFC .SET FALSE ; Z2U 0: ENABLE HARDWARE FLOW CONTROL +Z2U0HFC .SET TRUE ; Z2U 0: ENABLE HARDWARE FLOW CONTROL diff --git a/Source/HBIOS/dbgmon.asm b/Source/HBIOS/dbgmon.asm index 73691701..5aacfe6c 100644 --- a/Source/HBIOS/dbgmon.asm +++ b/Source/HBIOS/dbgmon.asm @@ -120,9 +120,9 @@ SERIALCMDLOOP: ;_____________________________________________________________________________ ; INITIALIZE: - LD A,$C3 ; JP OPCODE - LD (0),A ; STORE AT $0000 - LD (1),HL ; STORE AT $0001 + ;LD A,$C3 ; JP OPCODE + ;LD (0),A ; STORE AT $0000 + ;LD (1),HL ; STORE AT $0001 #IF (BIOS == BIOS_UNA) ; INSTALL UNA INVOCATION VECTOR FOR RST 08 diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index abbfac72..c5bc7e68 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -201,7 +201,7 @@ RTCDEF .EQU 0 ; ALLOWS DRIVERS TO SET BITS #IF (INTMODE == 1) JP INT_IM1 ; JP TO INTERRUPT HANDLER IN HI MEM #ELSE - RETI ; RETURN W/ INTS DISABLED + RET ; RETURN W/ INTS DISABLED #ENDIF .FILL (066H - $),0FFH ; NMI RETN @@ -2908,6 +2908,8 @@ SYS_RESET: JR Z,SYS_RESWARM CP BF_SYSRES_COLD JR Z,SYS_RESCOLD + CP BF_SYSRES_USER + JR Z,SYS_RESUSER CALL SYSCHK LD A,ERR_NOFUNC OR A ; SIGNAL ERROR @@ -2916,8 +2918,15 @@ SYS_RESET: ; SOFT RESET HBIOS, RELEASE HEAP MEMORY NOT USED BY HBIOS ; SYS_RESINT: +; + ; RESET THE HEAP LD HL,(HEAPCURB) ; GET HBIOS HEAP THRESHOLD LD (CB_HEAPTOP),HL ; RESTORE HEAP TOP +; + ; MAKE SURE THE PROPER RESET VECTOR IS AT ADDRESS $0000 + LD HL,$0040 ; USER RESET CODE STUB + LD ($0001),HL ; OPERAND OF JP AT $0000 +; XOR A RET ; @@ -2946,6 +2955,63 @@ SYS_RESCOLD: LD IX,0 ; ADDRESS ZERO CALL HB_BNKCALL ; DOES NOT RETURN ; +; HOOK CALLED WHEN A USERLAND RESET IS INVOKED, TYPICALLY VIA A JUMP +; TO LOGICAL CPU ADDRESS $0000 +; +SYS_RESUSER: +; +#IF (CPUFAM == CPU_Z180) +; + IN0 A,(Z180_ITC) ; GET ITC REGISTER + BIT 7,A ; TRAP BIT SET? + JR Z,SYS_RESUSER9 ; IF NOT, SKIP AHEAD +; + ; HANDLE INVALID OPCODE + DEC HL ; BACK UP TO OPCODE START + BIT 6,A ; CHECK UFO BIT (2 BYTE OPCODE) + JR Z,SYS_RESUSER1 ; IF NOT, ALL SET + DEC HL ; OTHERWISE, BACK UP 1 MORE BYTE +; +SYS_RESUSER1: + RES 7,A ; CLEAR THE TRAP BIT + OUT0 (Z180_ITC),A ; SAVE IT +; + CALL PRTSTRD ; PRINT ERROR TAG + .TEXT "\r\n\r\n+++ BAD OPCODE @$" + CALL PRTHEXWORDHL ; PRINT ADDRESS + PRTS("H:$") ; FORMATTING +; + LD B,8 ; SHOW 8 BYTES +SYS_RESUSER2: + PUSH BC ; SAVE BC + PUSH HL ; SAVE HL + LD A,(HB_INVBNK) ; GET BYTE FROM INVOKING BANK + LD D,A ; PUT IN D + CALL SYS_PEEK ; PEEK TO GET BYTE VALUE + LD A,E ; PUT IN A + CALL PC_SPACE ; FORMATTING + CALL PRTHEXBYTE ; DISPLAY BYTE + POP HL ; RECOVER HL + POP BC ; RECOVER BC + INC HL ; NEXT BYTE + DJNZ SYS_RESUSER2 ; LOOP TIL DONE + CALL NEWLINE ; FORMATTING +; +#ENDIF +; +SYS_RESUSER9: + ;; NOTIFY USER + ;CALL PRTSTRD + ;.TEXT "\r\n*** USER RESET ***\r\n$" +; + ;; EXIT VIA USER RESET VECTOR (IF SET) + ;LD HL,(HB_RESVEC) ; GET USER RESET VECTOR + ;LD A,H ; CHECK IF IT + ;OR L ; ... HAS BEEN SET + ;JP Z,SYS_RESWARM ; IF NOT, JUST WARM START +; + RET ; ELSE RETURN WITH USER RESET VECTOR IN HL +; ; GET THE CURRENT HBIOS VERSION ; ON INPUT, C=0 ; RETURNS VERSION IN DE AS BCD diff --git a/Source/HBIOS/hbios.inc b/Source/HBIOS/hbios.inc index bdee24ed..ecb01a9f 100644 --- a/Source/HBIOS/hbios.inc +++ b/Source/HBIOS/hbios.inc @@ -90,6 +90,7 @@ BF_SYSINT .EQU BF_SYS + 12 ; MANAGE INTERRUPT VECTORS BF_SYSRES_INT .EQU $00 ; RESET HBIOS INTERNAL BF_SYSRES_WARM .EQU $01 ; WARM START (RESTART BOOT LOADER) BF_SYSRES_COLD .EQU $02 ; COLD START +BF_SYSRES_USER .EQU $03 ; USER RESET REQUEST ; BF_SYSGET_CIOCNT .EQU $00 ; GET CHAR UNIT COUNT BF_SYSGET_CIOFN .EQU $01 ; GET CIO UNIT FN/DATA ADR diff --git a/Source/HBIOS/romldr.asm b/Source/HBIOS/romldr.asm index 17783fa4..f8f9954b 100644 --- a/Source/HBIOS/romldr.asm +++ b/Source/HBIOS/romldr.asm @@ -83,6 +83,20 @@ bid_cur .equ -1 ; used below to indicate current bank #else ret ; return w/ ints disabled #endif +; +#if (BIOS == BIOS_WBW) + .fill ($40 - $),$FF + ; After initial bootup, it is conventional for a jp 0 to + ; cause a warm start of the system. If there is no OS running + ; then this bit of code will suffice. After bootup, the + ; jp instruction at $0 is modified to point here. + pop hl ; save PC in case needed for ... + ld bc,$F003 ; HBIOS user reset function + call HB_INVOKE ; do it + ld bc,$F001 ; HBIOS warm start function + call HB_INVOKE ; do it +#endif +; .fill ($66 - $) retn ; nmi ; @@ -147,6 +161,8 @@ start1: ld de,0 ; put it in user page zero ld bc,$100 ; full page ldir ; do it + ld hl,$0040 ; adr of user reset code + ld (1),hl ; save at $0000 ; ; Page zero in user bank is ready for interrupts now. ; diff --git a/Source/Images/Common/TDLBASIC.COM b/Source/Images/Common/TDLBASIC.COM new file mode 100644 index 00000000..ebaec526 Binary files /dev/null and b/Source/Images/Common/TDLBASIC.COM differ diff --git a/Source/ver.inc b/Source/ver.inc index 349e2d90..0874d9c4 100644 --- a/Source/ver.inc +++ b/Source/ver.inc @@ -2,4 +2,4 @@ #DEFINE RMN 1 #DEFINE RUP 1 #DEFINE RTP 0 -#DEFINE BIOSVER "3.1.1-pre.51" +#DEFINE BIOSVER "3.1.1-pre.52" diff --git a/Source/ver.lib b/Source/ver.lib index 2ce9dafe..c0a496e9 100644 --- a/Source/ver.lib +++ b/Source/ver.lib @@ -3,5 +3,5 @@ rmn equ 1 rup equ 1 rtp equ 0 biosver macro - db "3.1.1-pre.51" + db "3.1.1-pre.52" endm