Browse Source

Add Z180 Invalid Opcode Handler

patch
Wayne Warthen 5 years ago
parent
commit
e17fee85e9
  1. 52
      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

52
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

5
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

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

68
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

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

16
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.
;

BIN
Source/Images/Common/TDLBASIC.COM

Binary file not shown.

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

2
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

Loading…
Cancel
Save