mirror of https://github.com/dschmenk/VM02.git
231 lines
3.8 KiB
ArmAsm
Executable File
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 |