;* ;* 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 JSR HSTRPL_ADD STA HSYSTHROWSTR+1 STX HSYSTHROWSTR+3 LDA #SYSEXCEPTNNAMESTR JSR HSTRPL_ADD STA HSYSEXCEPTNNAMESTR+1 STX HSYSEXCEPTNNAMESTR+3 LDA #SYSEXCEPTNDESCSTR JSR HSTRPL_ADD STA HSYSEXCEPTNDESCSTR+1 STX HSYSEXCEPTNDESCSTR+3 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