VM02/src/except.s

231 lines
3.8 KiB
ArmAsm
Executable File

;*
;* JAVA VIRTUAL MACHINE EXCEPTION SUPPORT FOR 6502
;*
.INCLUDE "global.inc"
.INCLUDE "class.inc"
.INCLUDE "frame.inc"
.IMPORT PRBLNK,PRBYTE,COUT,CROUT,PRNTAX,KBWAIT
.IMPORT PUTS,PUTSLN,PRSTR,PRHSTR,PRSTRLN,MEMSRC,MEMDST,MEMCPY,MEMCLR
.IMPORT HMEM_PTR,HSTRPL_ADD
.IMPORT CLASS_STRING,CLASS_METHODPTR,RESOLVE_CLASS
.IMPORT CLASS_MATCH_NAME,CLASS_MATCH_DESC,RESOLVE_METHOD,CLASS_METHODPTR
.IMPORT ASYNC_STATIC
.IMPORT CURRENT_THREAD
.IMPORT VM_RESTART
.EXPORT EXCEPT_INIT,THROW_SYSEXCEPTN,THROW_INTERNALERR,UNHANDLED_EXCEPTN,CURRENTEXCEPTN,THREAD_TRACE
.SEGMENT "INIT"
EXCEPT_INIT: LDA #<SYSTHROWSTR
LDX #>SYSTHROWSTR
JSR HSTRPL_ADD
STA HSYSTHROWSTR+1
STX HSYSTHROWSTR+3
LDA #<SYSEXCEPTNNAMESTR
LDX #>SYSEXCEPTNNAMESTR
JSR HSTRPL_ADD
STA HSYSEXCEPTNNAMESTR+1
STX HSYSEXCEPTNNAMESTR+3
LDA #<SYSEXCEPTNDESCSTR
LDX #>SYSEXCEPTNDESCSTR
JSR HSTRPL_ADD
STA HSYSEXCEPTNDESCSTR+1
STX HSYSEXCEPTNDESCSTR+3
LDA #<THREAD_TRACE ; CREATE EXTERNAL LINKEAGE TO DUMPSTACK
STA LINK_DUMPSTACK
LDA #>THREAD_TRACE
STA LINK_DUMPSTACK+1
RTS
SYSTHROWSTR: .BYTE 22,"apple2/SystemException" ; SYSTEM EXCEPTION CLASS
SYSEXCEPTNNAMESTR: .BYTE 20,"throwSystemException" ; THROW SYSTEM EXCEPTION METHOD NAME
SYSEXCEPTNDESCSTR: .BYTE 4,"(I)V" ; THROW SYSTEM EXCEPTION METHOD DESCRIPTOR
.CODE
UNHANDLED_EXCEPTN: PSTRLN "UNHANDLED EXCEPTION: "
TSX
LDA $0105,X
AND #$7F
TAY
STA $0105,X
JSR CLASS_STRING
JSR PRHSTR
JMP CROUT
THROW_SYSEXCEPTN: TAX ; SAVE INDEX AS METHOD PARAM
LDA #$00
PHA
PHA
PHA
TXA
PHA
LDA HSYSTHROW
LDX HSYSTHROW+1
BNE CALLSYSEXCPTN
HSYSTHROWSTR: LDA #$00
LDX #$00
JSR RESOLVE_CLASS
BCS :+
HSYSEXCEPTNNAMESTR: LDA #$00
LDX #$00
JSR CLASS_MATCH_NAME ; SAVE MATCH NAME
HSYSEXCEPTNDESCSTR: LDA #$00
LDX #$00
JSR CLASS_MATCH_DESC ; SAVE MATCH TYPE
JSR RESOLVE_METHOD ; LOOK IT UP
BCS :+ ; METHOD NOT FOUND - REAL BAD
STA HSYSTHROW
STX HSYSTHROW+1
CALLSYSEXCPTN: JSR ASYNC_STATIC
PLA
STA CURRENTEXCEPTN
PLA
STA CURRENTEXCEPTN+1
PLA
STA CURRENTEXCEPTN+2
PLA
STA CURRENTEXCEPTN+3
RTS
: PERR "SYS EXCEPTION METHOD NOT FOUND!"
THROW_INTERNALERR:
SEI
JSR THREAD_TRACE
.IFDEF DEBUG
FOREVER: JMP FOREVER
.ENDIF
LDA #$FF
TAX
JMP VM_RESTART
THREAD_TRACE:
.IFDEF DEBUG
TSX
INX
INX
STX DUMP_TOS
JSR CROUT
PSTR "CURRENT THREAD: "
LDA CURRENT_THREAD
JSR PRBYTE
JSR CROUT
LDA HEXECFRAME ; SET FRAME POINTER
LDX HEXECFRAME+1
BNE :+
PSTRLN "NO CURRENT FRAME"
LDA #$FF
JMP DUMPSTACK
: JSR PRNTMETHD
LDA EXECPC
SEC
SBC EXECCODEBASE
TAX
INY
LDA EXECPC+1
SBC EXECCODEBASE+1
JSR PRNTAX
JSR CROUT
LDY #FRAMESP
LDA (FRAMEPTR),Y
PHA
JSR DUMPSTACK
PLA
STA DUMP_TOS
FRAMETRACE: LDY #FRAMELINKPREV+1
LDA (FRAMEPTR),Y
BNE :+
JSR CROUT
.IFDEF DEBUG_EXCEPT
JSR KBWAIT
.ENDIF
RTS
: DEY
TAX
LDA (FRAMEPTR),Y
CMP HEXECFRAME
BNE :+
CPX HEXECFRAME+1
BNE :+
PERR "SELF-LINKED FRAMES!"
BRK
: JSR PRNTMETHD
LDY #FRAMEPC
LDA (FRAMEPTR),Y
INY
TAX
LDA (FRAMEPTR),Y
JSR PRNTAX
JSR CROUT
LDY #FRAMESP
LDA (FRAMEPTR),Y
PHA
JSR DUMPSTACK
PLA
STA DUMP_TOS
JMP FRAMETRACE
DUMPSTACK: PHA
; PSTRLN "EVAL STACK:"
PLA
TAY
DUMPSTKLP: CPY DUMP_TOS
BCS :+
RTS
: BNE :+
RTS
: DEY
STY TMP
TYA
; JSR PRBYTE
LDA #':'
; JSR COUT
LDY TMP
LDX $0100,Y
LDA $0101,Y
; JSR PRNTAX
; JSR CROUT
LDY TMP
DEY
BNE DUMPSTKLP
PRNTMETHD: STA HEXECFRAME
STX HEXECFRAME+1
JSR HMEM_PTR
STA FRAMEPTR
STX FRAMEPTR+1
LDY #FRAMEICLASS
LDA (FRAMEPTR),Y
PHA
TAY
JSR CLASS_STRING
JSR PRHSTR
LDA #'.'
JSR COUT
PLA
STA TMP
LDY #FRAMEMETHOD+1
LDA (FRAMEPTR),Y
DEY
TAX
LDA (FRAMEPTR),Y
LDY TMP
JSR CLASS_METHODPTR ; GET POINTER TO METHOD
STA METHODPTR
STX METHODPTR+1
LDY #METHODNAME+1
LDA (METHODPTR),Y
DEY
TAX
LDA (METHODPTR),Y
JSR PRHSTR
LDY #METHODDESC+1
LDA (METHODPTR),Y
DEY
TAX
LDA (METHODPTR),Y
JSR PRHSTR
LDA #'#'
JMP COUT
DUMP_TOS: .BYTE 0
.ELSE
RTS
.ENDIF
.DATA
HSYSTHROW: .WORD $0000
CURRENTEXCEPTN: .BYTE 0,0,0,0