VM02/src/codemgr.s

472 lines
7.3 KiB
ArmAsm
Executable File

;*
;* JAVA BYTECODE MANAGER FOR 6502
;*
.INCLUDE "global.inc"
.IMPORT PRBLNK,PRBYTE,COUT,CROUT,PRNTAX
.IMPORT PUTS,PUTSLN,PRSTR,PRSTRLN,MEMSRC,MEMDST,MEMCPY,MUL_FIELDRECSZ,MUL_METHODRECSZ
.IMPORT HMEM_ALLOC,HMEM_ALLOC_FIXED,HMEM_ALLOC_CODE,HMEM_FREE,HMEM_LOCK,HMEM_UNLOCK,HMEM_UNLOCK_CODE
.IMPORT HMEM_PTR,HMEM_REF_INC,HMEM_REF_DEC
.IMPORT THROW_INTERNALERR,SYSTHROW
.EXPORT CODECPY,HCODE_ALLOC,HCODE_ACCESS,HCODE_UNACCESS,HCODE_LOCK,HCODE_UNLOCK,HCODE_ISBYTECODE,HCODE_FLAGS
.EXPORT HCODE_SETSTACK,HCODE_SETLOCALS,HCODE_SETOFFSET,HCODE_SETCLASS,HCODE_SETHEXCEPT,HCODE_SETEXCEPTLEN
.EXPORT HCODE_GETSTACK,HCODE_GETLOCALS,HCODE_GETOFFSET,HCODE_GETCLASS,HCODE_GETHEXCEPT,HCODE_GETEXCEPTLEN,HCODE_GETLEN
;*
;* BYTECODE BLOCK INTERNAL STRUCTURE
;*
CODEBLKSIG EQU $00 ; 1 BYTE = $42 (UNUSED 6502/65C02/65802 OPCODE)
CODEBLKCLASS EQU $01 ; 1 BYTE
CODEBLKSTACK EQU $02 ; 1 BYTE
CODEBLKLOCALCNT EQU $03 ; 1 BYTE
CODEBLKLOCALSZ EQU $04 ; 2 BYTES (MUL BY 5 IN SET LOCALS)
CODEBLKOFFST EQU $06 ; 3 BYTES
CODEBLKHEXCEPT EQU $09 ; 2 BYTES
CODEBLKEXCPTLEN EQU $0B ; 2 BYTES
CODELOCKCNT EQU $0D ; 2 BYTES
CODEBLKLEN EQU $0F ; 2 BYTES
CODEBLKFLAGS EQU $11 ; 1 BYTE
CODEAUXADDR EQU $12 ; 2 BYTES = ADDRESS OF CODE IN AUX MEMs
CODEBLKCODE EQU $14 ; CODEBLKLEN BYTES, 32 BIT ALIGNED
CODEBLKPARMSZ EQU $14 ; 32 BIT ALIGNED
.DATA
HCODE: .WORD 0
HCODEBLK: .WORD 0
.CODE
;*
;* COPY BYTECODES TO CODE MEMORY
;*
;* ENTRY: A = CODEBYTE
;*
CODECPY:
.IFDEF DEBUG
PHA
LDA HCODEBLK
ORA HCODEBLK+1
BNE :+
PERR "CODE NOT ACCESSED"
JMP THROW_INTERNALERR
: PLA
.ENDIF
LDY #$00
AUXMEM_WRACCESS_ON
STA (CODECOPYPTR),Y ; STORE CODE BYTE
AUXMEM_WRACCESS_OFF
INC CODECOPYPTR ; INCREMENT POINTER
BNE :+
INC CODECOPYPTR+1
: RTS
;*
;* ACCESS CODE BLOCK - WILL LOCK
;* ENTRY: AX = CODE HANDLE
;*
HCODE_ACCESS:
.IFDEF DEBUG
PHA
LDA HCODEBLK
ORA HCODEBLK+1
BEQ :+
PERR "CODE NOT UNACCESSED BEFORE ANOTHER ACCESS"
; JMP THROW_INTERNALERR
: PLA
.ENDIF
STA HCODEBLK
STX HCODEBLK+1
JSR HCODE_LOCK
STA CODECOPYPTR
STX CODECOPYPTR+1
.IFDEF BIGMEM
LDA HCODEBLK
LDX HCODEBLK+1
JSR HMEM_PTR
.ELSE
SEC
SBC #CODEBLKCODE
BCS :+
DEX
:
.ENDIF
STA CODEBLKPTR
STX CODEBLKPTR+1
RTS
;*
;* UNACCESS CODE BLOCK - WILL UNLOCK
;*
HCODE_UNACCESS: LDA HCODEBLK
LDX HCODEBLK+1
.IFDEF DEBUG
BEQ :+
JSR HCODE_UNLOCK
LDA #$00
STA HCODEBLK
STA HCODEBLK+1
: RTS
.ENDIF
JMP HCODE_UNLOCK
;*
;* ALLOCATE CODE BLOCK
;*
;* ENTRY: AX = CODE SIZE
;* Y = FLAGS
;* EXIT: AX = HANDLE
;* C = 1 :: SUCCESS
;* C = 0 :: ERROR
;*
HCODE_ALLOC:
.IFDEF BIGMEM
CLC ; ROUND TO 32 BIT SIZE
ADC #$03
BCC :+
INX
: AND #$FC
PHA ; CODELEN
TXA
PHA ; CODELEN+1
TYA
PHA ; CODEFLAGS
LDA #CODEBLKPARMSZ
LDX #$00
.ELSE
STA TMP
PHA ; CODELEN
TXA
PHA ; CODELEN+1
TYA
PHA ; CODEFLAGS
LDA TMP
CLC
ADC #CODEBLKPARMSZ
BCC :+
INX
:
.ENDIF
LDY #$01 ; INITIAL REF COUNT
JSR HMEM_ALLOC_CODE
STA HCODE
STX HCODE+1
JSR HMEM_PTR
STA TMPTR
STX TMPTR+1
LDY #CODEBLKFLAGS ; SET CODE FLAGS
PLA ; CODEFLAGS
STA (TMPTR),Y
DEY ; LDY #CODEBLKLEN - SET CODELEN
PLA ; CODELEN+1
STA (TMPTR),Y
DEY
PLA ; CODELEN
STA (TMPTR),Y
DEY ; LDY #CODEBLKPARMSZ - ZERO OUT PARAMTERS
LDA #$00
: STA (TMPTR),Y
DEY
BNE :-
LDA #$42 ; UNUSED 6502/65C02/65802 OPCODE
STA (TMPTR),Y ; FOR BYTECODE SIGNATURE
.IFDEF BIGMEM
LDA CODEHEAPTOP
LDY #CODEBLKLEN
SEC
SBC (TMPTR),Y
INY
STA CODEHEAPTOP
TAX
LDA CODEHEAPTOP+1
SBC (TMPTR),Y
CMP #$08
BCS :+
PERR "OUT OF BYTECODE HEAP"
LDA #4 ; OUT OF MEMORY
JMP SYSTHROW
: STA CODEHEAPTOP+1
LDY #CODEAUXADDR+1
STA (TMPTR),Y
DEY
TXA
STA (TMPTR),Y
.ENDIF
LDA HCODE
LDX HCODE+1
CLC
RTS
;*
;* SET CODE BLOCK PARAMETERS
;* ENTRY: A = BYTE
;* AX = WORD
;* AXY = 3 BYTES
;*
HCODE_SETCLASS:
.IFDEF DEBUG
PHA
LDA HCODEBLK
ORA HCODEBLK+1
BNE :+
PERR "CODE NOT ACCESSED"
JMP THROW_INTERNALERR
: PLA
.ENDIF
LDY #CODEBLKCLASS
STA (CODEBLKPTR),Y
RTS
HCODE_SETSTACK:
.IFDEF DEBUG
PHA
LDA HCODEBLK
ORA HCODEBLK+1
BNE :+
PERR "CODE NOT ACCESSED"
JMP THROW_INTERNALERR
: PLA
.ENDIF
LDY #CODEBLKSTACK
STA (CODEBLKPTR),Y
RTS
HCODE_SETLOCALS:
.IFDEF DEBUG
PHA
LDA HCODEBLK
ORA HCODEBLK+1
BNE :+
PERR "CODE NOT ACCESSED"
JMP THROW_INTERNALERR
: PLA
.ENDIF
LDY #CODEBLKLOCALCNT
STA (CODEBLKPTR),Y
INY ; LDY #CODEBLKLOCALSZ
STA TMP
LDX #$00
ASL ; MULTIPLE A BY 5
BCC :+
LDX #$02
: ASL
BCC :+
INX
CLC
: ADC TMP
BCC :+
INX
: STA (CODEBLKPTR),Y
INY
TXA
STA (CODEBLKPTR),Y
RTS
HCODE_SETOFFSET:
.IFDEF DEBUG
PHA
LDA HCODEBLK
ORA HCODEBLK+1
BNE :+
PERR "CODE NOT ACCESSED"
JMP THROW_INTERNALERR
: PLA
.ENDIF
STY TMP
LDY #CODEBLKOFFST
STA (CODEBLKPTR),Y
INY
TXA
STA (CODEBLKPTR),Y
INY
LDA TMP
STA (CODEBLKPTR),Y
RTS
HCODE_SETHEXCEPT:
LDY #CODEBLKHEXCEPT
BNE HCODE_SETWORD
HCODE_SETEXCEPTLEN:
LDY #CODEBLKEXCPTLEN
HCODE_SETWORD:
.IFDEF DEBUG
PHA
LDA HCODEBLK
ORA HCODEBLK+1
BNE :+
JMP THROW_INTERNALERR
: PLA
.ENDIF
STA (CODEBLKPTR),Y
INY
TXA
STA (CODEBLKPTR),Y
RTS
;*
;* GET CODE BLOCK PARAMETERS
;* EXIT: A = BYTE
;* AX = WORD
;* AXY = 3 BYTES
;*
HCODE_GETCLASS:
.IFDEF DEBUG
LDA HCODEBLK
ORA HCODEBLK+1
BNE :+
PERR "CODE NOT ACCESSED"
JMP THROW_INTERNALERR
:
.ENDIF
LDY #CODEBLKCLASS
LDA (CODEBLKPTR),Y
RTS
HCODE_GETSTACK:
.IFDEF DEBUG
LDA HCODEBLK
ORA HCODEBLK+1
BNE :+
PERR "CODE NOT ACCESSED"
JMP THROW_INTERNALERR
:
.ENDIF
LDY #CODEBLKSTACK
LDA (CODEBLKPTR),Y
RTS
HCODE_GETLOCALS:
.IFDEF DEBUG
LDA HCODEBLK
ORA HCODEBLK+1
BNE :+
PERR "CODE NOT ACCESSED"
JMP THROW_INTERNALERR
:
.ENDIF
LDY #CODEBLKLOCALSZ+1 ; SIZE IN AX
LDA (CODEBLKPTR),Y
DEY
TAX
LDA (CODEBLKPTR),Y
DEY
STA TMP
LDA (CODEBLKPTR),Y
TAY ; COUNT IN Y
LDA TMP
RTS
HCODE_GETOFFSET:
.IFDEF DEBUG
LDA HCODEBLK
ORA HCODEBLK+1
BNE :+
PERR "CODE NOT ACCESSED"
JMP THROW_INTERNALERR
:
.ENDIF
LDY #CODEBLKOFFST+2
LDA (CODEBLKPTR),Y
DEY
STA TMP
LDA (CODEBLKPTR),Y
DEY
TXA
LDA (CODEBLKPTR),Y
LDY TMP
RTS
HCODE_GETLEN:
LDY #CODEBLKLEN+1
BNE HCODE_GETWORD
HCODE_GETHEXCEPT:
LDY #CODEBLKHEXCEPT+1
BNE HCODE_GETWORD
HCODE_GETEXCEPTLEN:
LDY #CODEBLKEXCPTLEN+1
HCODE_GETWORD:
.IFDEF DEBUG
LDA HCODEBLK
ORA HCODEBLK+1
BNE :+
PERR "CODE NOT ACCESSED"
JMP THROW_INTERNALERR
:
.ENDIF
LDA (CODEBLKPTR),Y
DEY
TAX
LDA (CODEBLKPTR),Y
RTS
;*
;* LOCK CODE BLOCK
;* ENTRY: AX = CODE HANDLE
;* EXIT: AX = POINTER TO LOCKED CODE
;*
HCODE_LOCK: STA HCODE
STX HCODE+1
JSR HMEM_LOCK
STA TMPTR
STX TMPTR+1
LDY #CODELOCKCNT
LDA (TMPTR),Y
CLC
ADC #$01
STA (TMPTR),Y
BCC :+
INY
LDA (TMPTR),Y
ADC #$00
STA (TMPTR),Y
:
.IFDEF BIGMEM
LDY #CODEAUXADDR+1
LDA (TMPTR),Y
DEY
TAX
LDA (TMPTR),Y
.ELSE
LDA TMPTR
LDX TMPTR+1
CLC
ADC #CODEBLKCODE
BCC :+
INX
:
.ENDIF
RTS
;*
;* UNLOCK CODE BLOCK
;* ENTRY: AX = CODE HANDLE
;*
HCODE_UNLOCK: STA HCODE
STX HCODE+1
JSR HMEM_PTR
STA TMPTR
STX TMPTR+1
LDY #CODELOCKCNT
LDA (TMPTR),Y
SEC
SBC #$01
STA (TMPTR),Y
INY
TAX
LDA (TMPTR),Y
SBC #$00
STA (TMPTR),Y
BNE :-
CPX #$00
BNE :-
LDA HCODE
LDX HCODE+1
JMP HMEM_UNLOCK_CODE
;*
;* CHECK FOR BYTECODE SIGNATURE
;* ENTRY: AX = HANDLE
;* EXIT: Z = 1 :: IS BYTECODE
;* Z = 0 :: IS NOT BYTECODE
;*
HCODE_ISBYTECODE:
JSR HMEM_PTR
STA TMPTR
STX TMPTR+1
LDY #CODEBLKSIG
LDA (TMPTR),Y
CMP #$42
RTS
;*
;* RETURN HCODE FLAGS
;* ENTRY: AX = HANDLE
;* EXIT: Z = 1 :: IS SYNCHRONIZED
;* Z = 0 :: IS NOT SYNCHRONIZED
;*
HCODE_FLAGS: JSR HMEM_PTR
STA TMPTR
STX TMPTR+1
LDY #CODEBLKFLAGS
LDA (TMPTR),Y
RTS