mirror of
https://github.com/wwarthen/RomWBW.git
synced 2026-02-06 22:33:12 -06:00
Add Z180 Invalid Opcode Handler
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
;
|
||||
|
||||
BIN
Source/Images/Common/TDLBASIC.COM
Normal file
BIN
Source/Images/Common/TDLBASIC.COM
Normal file
Binary file not shown.
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user