Browse Source

Add Z180 Invalid Opcode Handler

pull/199/head
Wayne Warthen 5 years ago
parent
commit
e17fee85e9
  1. 8
      Source/CBIOS/cbios.asm
  2. 5
      Source/CPM3/bioskrnl.asm
  3. 2
      Source/HBIOS/Config/RCZ280_nat_zz.asm
  4. 6
      Source/HBIOS/dbgmon.asm
  5. 68
      Source/HBIOS/hbios.asm
  6. 1
      Source/HBIOS/hbios.inc
  7. 16
      Source/HBIOS/romldr.asm
  8. BIN
      Source/Images/Common/TDLBASIC.COM
  9. 2
      Source/ver.inc
  10. 2
      Source/ver.lib

8
Source/CBIOS/cbios.asm

@ -350,7 +350,15 @@ REBOOT:
; ;
;__________________________________________________________________________________________________ ;__________________________________________________________________________________________________
WBOOT: WBOOT:
;
#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 SP,STACK ; STACK FOR INITIALIZATION
LD BC,$F003 ; HBIOS USER RESET FUNCTION
RST 08 ; DO IT
#ENDIF
; ;
#IFDEF PLTUNA #IFDEF PLTUNA
; RESTORE COMMAND PROCESSOR FROM UNA BIOS CACHE ; RESTORE COMMAND PROCESSOR FROM UNA BIOS CACHE

5
Source/CPM3/bioskrnl.asm

@ -172,7 +172,10 @@ boot$1:
; Entry for system restarts. ; Entry for system restarts.
wboot: 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 set$jumps ; initialize page zero
call ?rlccp ; reload CCP call ?rlccp ; reload CCP
jmp ccp ; then reset jmp vectors and exit to ccp jmp ccp ; then reset jmp vectors and exit to ccp

2
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 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 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

6
Source/HBIOS/dbgmon.asm

@ -120,9 +120,9 @@ SERIALCMDLOOP:
;_____________________________________________________________________________ ;_____________________________________________________________________________
; ;
INITIALIZE: 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) #IF (BIOS == BIOS_UNA)
; INSTALL UNA INVOCATION VECTOR FOR RST 08 ; INSTALL UNA INVOCATION VECTOR FOR RST 08

68
Source/HBIOS/hbios.asm

@ -201,7 +201,7 @@ RTCDEF .EQU 0 ; ALLOWS DRIVERS TO SET BITS
#IF (INTMODE == 1) #IF (INTMODE == 1)
JP INT_IM1 ; JP TO INTERRUPT HANDLER IN HI MEM JP INT_IM1 ; JP TO INTERRUPT HANDLER IN HI MEM
#ELSE #ELSE
RETI ; RETURN W/ INTS DISABLED
RET ; RETURN W/ INTS DISABLED
#ENDIF #ENDIF
.FILL (066H - $),0FFH ; NMI .FILL (066H - $),0FFH ; NMI
RETN RETN
@ -2908,6 +2908,8 @@ SYS_RESET:
JR Z,SYS_RESWARM JR Z,SYS_RESWARM
CP BF_SYSRES_COLD CP BF_SYSRES_COLD
JR Z,SYS_RESCOLD JR Z,SYS_RESCOLD
CP BF_SYSRES_USER
JR Z,SYS_RESUSER
CALL SYSCHK CALL SYSCHK
LD A,ERR_NOFUNC LD A,ERR_NOFUNC
OR A ; SIGNAL ERROR OR A ; SIGNAL ERROR
@ -2916,8 +2918,15 @@ SYS_RESET:
; SOFT RESET HBIOS, RELEASE HEAP MEMORY NOT USED BY HBIOS ; SOFT RESET HBIOS, RELEASE HEAP MEMORY NOT USED BY HBIOS
; ;
SYS_RESINT: SYS_RESINT:
;
; RESET THE HEAP
LD HL,(HEAPCURB) ; GET HBIOS HEAP THRESHOLD LD HL,(HEAPCURB) ; GET HBIOS HEAP THRESHOLD
LD (CB_HEAPTOP),HL ; RESTORE HEAP TOP 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 XOR A
RET RET
; ;
@ -2946,6 +2955,63 @@ SYS_RESCOLD:
LD IX,0 ; ADDRESS ZERO LD IX,0 ; ADDRESS ZERO
CALL HB_BNKCALL ; DOES NOT RETURN 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 ; GET THE CURRENT HBIOS VERSION
; ON INPUT, C=0 ; ON INPUT, C=0
; RETURNS VERSION IN DE AS BCD ; RETURNS VERSION IN DE AS BCD

1
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_INT .EQU $00 ; RESET HBIOS INTERNAL
BF_SYSRES_WARM .EQU $01 ; WARM START (RESTART BOOT LOADER) BF_SYSRES_WARM .EQU $01 ; WARM START (RESTART BOOT LOADER)
BF_SYSRES_COLD .EQU $02 ; COLD START 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_CIOCNT .EQU $00 ; GET CHAR UNIT COUNT
BF_SYSGET_CIOFN .EQU $01 ; GET CIO UNIT FN/DATA ADR BF_SYSGET_CIOFN .EQU $01 ; GET CIO UNIT FN/DATA ADR

16
Source/HBIOS/romldr.asm

@ -83,6 +83,20 @@ bid_cur .equ -1 ; used below to indicate current bank
#else #else
ret ; return w/ ints disabled ret ; return w/ ints disabled
#endif #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 - $) .fill ($66 - $)
retn ; nmi retn ; nmi
; ;
@ -147,6 +161,8 @@ start1:
ld de,0 ; put it in user page zero ld de,0 ; put it in user page zero
ld bc,$100 ; full page ld bc,$100 ; full page
ldir ; do it 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. ; Page zero in user bank is ready for interrupts now.
; ;

BIN
Source/Images/Common/TDLBASIC.COM

Binary file not shown.

2
Source/ver.inc

@ -2,4 +2,4 @@
#DEFINE RMN 1 #DEFINE RMN 1
#DEFINE RUP 1 #DEFINE RUP 1
#DEFINE RTP 0 #DEFINE RTP 0
#DEFINE BIOSVER "3.1.1-pre.51"
#DEFINE BIOSVER "3.1.1-pre.52"

2
Source/ver.lib

@ -3,5 +3,5 @@ rmn equ 1
rup equ 1 rup equ 1
rtp equ 0 rtp equ 0
biosver macro biosver macro
db "3.1.1-pre.51"
db "3.1.1-pre.52"
endm endm

Loading…
Cancel
Save