lawless-legends/Platform/Apple/tools/PLASMA/src/plvm02.s

1338 lines
19 KiB
ArmAsm
Raw Normal View History

;**************************************************************************************
; Copyright (C) 2015 The 8-Bit Bunch. Licensed under the Apache License, Version 1.1
; (the "License"); you may not use this file except in compliance with the License.
; You may obtain a copy of the License at <http://www.apache.org/licenses/LICENSE-1.1>.
; Unless required by applicable law or agreed to in writing, software distributed under
; the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
; ANY KIND, either express or implied. See the License for the specific language
; governing permissions and limitations under the License.
;**************************************************************************************
2014-05-04 23:15:45 +00:00
;**********************************************************
;*
;* APPLE ][ 64K/128K PLASMA INTERPETER
;*
;* SYSTEM ROUTINES AND LOCATIONS
2014-05-04 23:15:45 +00:00
;*
;**********************************************************
;*
;* MONITOR SPECIAL LOCATIONS
2014-05-04 23:15:45 +00:00
;*
CSWL = $36
CSWH = $37
PROMPT = $33
;*
;* PRODOS
;*
PRODOS = $BF00
DEVCNT = $BF31 ; GLOBAL PAGE DEVICE COUNT
DEVLST = $BF32 ; GLOBAL PAGE DEVICE LIST
MACHID = $BF98 ; GLOBAL PAGE MACHINE ID BYTE
RAMSLOT = $BF26 ; SLOT 3, DRIVE 2 IS /RAM'S DRIVER VECTOR
NODEV = $BF10
2014-05-04 23:15:45 +00:00
;*
;* HARDWARE ADDRESSES
;*
KEYBD = $C000
CLRKBD = $C010
SPKR = $C030
2014-05-06 16:43:14 +00:00
LCRDEN = $C080
LCWTEN = $C081
ROMEN = $C082
LCRWEN = $C083
LCBNK2 = $00
LCBNK1 = $08
ALTZPOFF= $C008
ALTZPON = $C009
ALTRDOFF= $C002
ALTRDON = $C003
ALTWROFF= $C004
ALTWRON = $C005
!SOURCE "plvm02zp.inc"
STRBUF = $0280
INTERP = $03D0
2014-05-04 23:15:45 +00:00
;*
2014-05-06 16:43:14 +00:00
;* INTERPRETER INSTRUCTION POINTER INCREMENT MACRO
2014-05-04 23:15:45 +00:00
;*
2014-05-06 16:43:14 +00:00
!MACRO INC_IP {
INY
BNE * + 4
INC IPH
}
2014-06-13 01:40:04 +00:00
;******************************
;* *
;* INTERPRETER INITIALIZATION *
;* *
;******************************
* = $4000
;*
;* MOVE VM INTO LANGUAGE CARD
;*
2014-05-07 02:18:36 +00:00
BIT LCRWEN+LCBNK2
BIT LCRWEN+LCBNK2
LDA #<VMCORE
2014-05-07 02:18:36 +00:00
STA SRCL
LDA #>VMCORE
2014-05-07 02:18:36 +00:00
STA SRCH
LDA #$00
2014-05-07 02:18:36 +00:00
STA DSTL
LDA #$D0
2014-05-07 02:18:36 +00:00
STA DSTH
LDY #$00
2014-05-07 02:18:36 +00:00
- LDA (SRC),Y ; COPY VM+CMD INTO LANGUAGE CARD
STA (DST),Y
INY
BNE -
2014-05-07 02:18:36 +00:00
INC SRCH
INC DSTH
LDA DSTH
CMP #>(VMEND+255)
BNE -
;
; INSTALL PAGE 0 FETCHOP ROUTINE
;
LDY #$0F
- LDA PAGE0,Y
STA DROP,Y
DEY
BPL -
;
; INSTALL PAGE 3 VECTORS
;
LDY #$12
- LDA PAGE3,Y
STA INTERP,Y
DEY
BPL -
;
; INIT VM ENVIRONMENT STACK POINTERS
;
LDA #$00 ; INIT FRAME POINTER
STA PPL
STA IFPL
LDA #$BF
STA PPH
STA IFPH
RTS
PAGE0 = *
;******************************
;* *
;* INTERP BYTECODE INNER LOOP *
;* *
;******************************
!PSEUDOPC $00EF {
INX ; DROP @ $EF
INY ; NEXTOP @ $F0
BEQ NEXTOPH
LDA $FFFF,Y ; FETCHOP @ $F3, IP MAPS OVER $FFFF @ $F4
STA OPIDX
JMP (OPTBL) ; OPIDX AND OPPAGE MAP OVER OPTBL
NEXTOPH INC IPH
BNE FETCHOP
}
PAGE3 = *
;*
;* PAGE 3 VECTORS INTO INTERPRETER
;*
!PSEUDOPC $03D0 {
BIT LCRDEN+LCBNK2 ; $03D0 - DIRECT INTERP ENTRY
JMP DINTRP
BIT LCRDEN+LCBNK2 ; $03D6 - INDIRECT INTERP ENTRY
JMP IINTRP
BIT LCRDEN+LCBNK2 ; $03DC - INDIRECT INTERPX ENTRY
JMP IINTRPX
}
2014-06-13 01:40:04 +00:00
;************************************************
;* *
;* LANGUAGE CARD RESIDENT PLASMA VM STARTS HERE *
;* *
;************************************************
VMCORE = *
!PSEUDOPC $D000 {
2014-06-16 06:07:54 +00:00
;****************
;* *
;* OPCODE TABLE *
;* *
;****************
!ALIGN 255,0
OPTBL !WORD ZERO,ADD,SUB,MUL,DIV,MOD,INCR,DECR ; 00 02 04 06 08 0A 0C 0E
!WORD NEG,COMP,BAND,IOR,XOR,SHL,SHR,IDXW ; 10 12 14 16 18 1A 1C 1E
2015-02-26 21:07:08 +00:00
!WORD LNOT,LOR,LAND,LA,LLA,CB,CW,CS ; 20 22 24 26 28 2A 2C 2E
2017-06-04 14:25:20 +00:00
!WORD DROP,DUP,PUSHEP,PULLEP,BRGT,BRLT,BREQ,BRNE ; 30 32 34 36 38 3A 3C 3E
!WORD ISEQ,ISNE,ISGT,ISLT,ISGE,ISLE,BRFLS,BRTRU ; 40 42 44 46 48 4A 4C 4E
!WORD BRNCH,IBRNCH,CALL,ICAL,ENTER,LEAVE,RET,CFFB ; 50 52 54 56 58 5A 5C 5E
!WORD LB,LW,LLB,LLW,LAB,LAW,DLB,DLW ; 60 62 64 66 68 6A 6C 6E
!WORD SB,SW,SLB,SLW,SAB,SAW,DAB,DAW ; 70 72 74 76 78 7A 7C 7E
;*****************
;* *
;* OPXCODE TABLE *
;* *
;*****************
!ALIGN 255,0
OPXTBL !WORD ZERO,ADD,SUB,MUL,DIV,MOD,INCR,DECR ; 00 02 04 06 08 0A 0C 0E
!WORD NEG,COMP,BAND,IOR,XOR,SHL,SHR,IDXW ; 10 12 14 16 18 1A 1C 1E
!WORD LNOT,LOR,LAND,LA,LLA,CB,CW,CSX ; 20 22 24 26 28 2A 2C 2E
2017-06-04 14:25:20 +00:00
!WORD DROP,DUP,PUSHEP,PULLEP,BRGT,BRLT,BREQ,BRNE ; 30 32 34 36 38 3A 3C 3E
!WORD ISEQ,ISNE,ISGT,ISLT,ISGE,ISLE,BRFLS,BRTRU ; 40 42 44 46 48 4A 4C 4E
!WORD BRNCH,IBRNCH,CALLX,ICALX,ENTER,LEAVEX,RETX,CFFB; 50 52 54 56 58 5A 5C 5E
!WORD LBX,LWX,LLBX,LLWX,LABX,LAWX,DLB,DLW ; 60 62 64 66 68 6A 6C 6E
!WORD SB,SW,SLB,SLW,SAB,SAW,DAB,DAW ; 70 72 74 76 78 7A 7C 7E
;*
2014-06-16 06:07:54 +00:00
;* ENTER INTO BYTECODE INTERPRETER
;*
DINTRP PLA
CLC
ADC #$01
2014-06-16 06:07:54 +00:00
STA IPL
PLA
ADC #$00
2014-06-16 06:07:54 +00:00
STA IPH
2015-02-26 21:07:08 +00:00
LDA IFPH
PHA ; SAVE ON STACK FOR LEAVE/RET
LDA IFPL
PHA ; SAVE ON STACK FOR LEAVE/RET
LDA PPL ; SET FP TO PP
STA IFPL
LDA PPH
STA IFPH
LDY #$00
2014-06-16 06:07:54 +00:00
LDA #>OPTBL
STA OPPAGE
JMP FETCHOP
IINTRP PLA
2014-06-16 06:07:54 +00:00
STA TMPL
PLA
STA TMPH
LDY #$02
LDA (TMP),Y
STA IPH
DEY
LDA (TMP),Y
STA IPL
DEY
2015-02-26 21:07:08 +00:00
LDA IFPH
PHA ; SAVE ON STACK FOR LEAVE/RET
LDA IFPL
PHA ; SAVE ON STACK FOR LEAVE/RET
LDA PPL ; SET FP TO PP
STA IFPL
LDA PPH
STA IFPH
2014-06-16 06:07:54 +00:00
LDA #>OPTBL
STA OPPAGE
JMP FETCHOP
IINTRPX PLA
2014-06-16 06:07:54 +00:00
STA TMPL
PLA
STA TMPH
LDY #$02
LDA (TMP),Y
STA IPH
DEY
LDA (TMP),Y
STA IPL
DEY
2015-02-26 21:07:08 +00:00
LDA IFPH
PHA ; SAVE ON STACK FOR LEAVE/RET
LDA IFPL
PHA ; SAVE ON STACK FOR LEAVE/RET
LDA PPL ; SET FP TO PP
STA IFPL
LDA PPH
STA IFPH
2014-06-16 06:07:54 +00:00
LDA #>OPXTBL
STA OPPAGE
SEI
STA ALTRDON
JMP FETCHOP
;*
2014-05-04 23:15:45 +00:00
;* ADD TOS TO TOS-1
;*
ADD LDA ESTKL,X
2014-05-04 23:15:45 +00:00
CLC
ADC ESTKL+1,X
STA ESTKL+1,X
LDA ESTKH,X
ADC ESTKH+1,X
STA ESTKH+1,X
; INX
; JMP NEXTOP
JMP DROP
2014-05-04 23:15:45 +00:00
;*
;* SUB TOS FROM TOS-1
;*
SUB LDA ESTKL+1,X
2014-05-04 23:15:45 +00:00
SEC
SBC ESTKL,X
STA ESTKL+1,X
LDA ESTKH+1,X
SBC ESTKH,X
STA ESTKH+1,X
; INX
; JMP NEXTOP
JMP DROP
2014-05-04 23:15:45 +00:00
;*
;* SHIFT TOS-1 LEFT BY 1, ADD TO TOS-1
;*
IDXW LDA ESTKL,X
2014-05-04 23:15:45 +00:00
ASL
ROL ESTKH,X
CLC
ADC ESTKL+1,X
STA ESTKL+1,X
LDA ESTKH,X
ADC ESTKH+1,X
STA ESTKH+1,X
; INX
; JMP NEXTOP
JMP DROP
2014-05-04 23:15:45 +00:00
;*
2014-06-16 06:07:54 +00:00
;* MUL TOS-1 BY TOS
2014-05-04 23:15:45 +00:00
;*
2014-06-16 06:07:54 +00:00
MUL STY IPY
2014-05-04 23:15:45 +00:00
LDY #$10
2014-12-08 04:59:24 +00:00
LDA ESTKL+1,X
EOR #$FF
2014-05-04 23:15:45 +00:00
STA TMPL
2014-12-08 04:59:24 +00:00
LDA ESTKH+1,X
EOR #$FF
2014-05-04 23:15:45 +00:00
STA TMPH
2014-12-08 04:59:24 +00:00
LDA #$00
STA ESTKL+1,X ; PRODL
; STA ESTKH+1,X ; PRODH
MULLP LSR TMPH ; MULTPLRH
ROR TMPL ; MULTPLRL
BCS +
STA ESTKH+1,X ; PRODH
LDA ESTKL,X ; MULTPLNDL
ADC ESTKL+1,X ; PRODL
STA ESTKL+1,X
LDA ESTKH,X ; MULTPLNDH
ADC ESTKH+1,X ; PRODH
+ ASL ESTKL,X ; MULTPLNDL
ROL ESTKH,X ; MULTPLNDH
2014-05-04 23:15:45 +00:00
DEY
BNE MULLP
2014-12-08 04:59:24 +00:00
STA ESTKH+1,X ; PRODH
2014-05-04 23:15:45 +00:00
INX
LDY IPY
JMP NEXTOP
;*
2014-05-04 23:15:45 +00:00
;* INTERNAL DIVIDE ALGORITHM
;*
_NEG LDA #$00
SEC
SBC ESTKL,X
STA ESTKL,X
LDA #$00
SBC ESTKH,X
STA ESTKH,X
RTS
_DIV STY IPY
2014-12-08 04:59:24 +00:00
LDY #$11 ; #BITS+1
LDA #$00
STA TMPL ; REMNDRL
STA TMPH ; REMNDRH
LDA ESTKH,X
2014-05-04 23:15:45 +00:00
AND #$80
STA DVSIGN
BPL +
JSR _NEG
2014-05-04 23:15:45 +00:00
INC DVSIGN
+ LDA ESTKH+1,X
BPL +
2014-05-04 23:15:45 +00:00
INX
JSR _NEG
2014-05-04 23:15:45 +00:00
DEX
INC DVSIGN
BNE _DIV1
+ ORA ESTKL+1,X ; DVDNDL
2014-12-08 04:59:24 +00:00
BEQ _DIVEX
_DIV1 ASL ESTKL+1,X ; DVDNDL
2014-05-04 23:15:45 +00:00
ROL ESTKH+1,X ; DVDNDH
DEY
2014-12-08 04:59:24 +00:00
BCC _DIV1
_DIVLP ROL TMPL ; REMNDRL
2014-05-04 23:15:45 +00:00
ROL TMPH ; REMNDRH
LDA TMPL ; REMNDRL
2014-12-08 04:59:24 +00:00
CMP ESTKL,X ; DVSRL
2014-05-04 23:15:45 +00:00
LDA TMPH ; REMNDRH
SBC ESTKH,X ; DVSRH
BCC +
2014-05-04 23:15:45 +00:00
STA TMPH ; REMNDRH
2014-12-08 04:59:24 +00:00
LDA TMPL ; REMNDRL
SBC ESTKL,X ; DVSRL
STA TMPL ; REMNDRL
SEC
+ ROL ESTKL+1,X ; DVDNDL
2014-05-04 23:15:45 +00:00
ROL ESTKH+1,X ; DVDNDH
2014-12-08 04:59:24 +00:00
DEY
BNE _DIVLP
2014-12-08 04:59:24 +00:00
_DIVEX INX
LDY IPY
2014-05-04 23:15:45 +00:00
RTS
;*
;* NEGATE TOS
;*
NEG LDA #$00
2014-05-04 23:15:45 +00:00
SEC
SBC ESTKL,X
STA ESTKL,X
LDA #$00
2014-05-04 23:15:45 +00:00
SBC ESTKH,X
STA ESTKH,X
JMP NEXTOP
;*
;* DIV TOS-1 BY TOS
;*
DIV JSR _DIV
LSR DVSIGN ; SIGN(RESULT) = (SIGN(DIVIDEND) + SIGN(DIVISOR)) & 1
BCS NEG
JMP NEXTOP
2014-05-04 23:15:45 +00:00
;*
;* MOD TOS-1 BY TOS
2014-05-04 23:15:45 +00:00
;*
MOD JSR _DIV
2014-05-04 23:15:45 +00:00
LDA TMPL ; REMNDRL
STA ESTKL,X
LDA TMPH ; REMNDRH
STA ESTKH,X
LDA DVSIGN ; REMAINDER IS SIGN OF DIVIDEND
BMI NEG
JMP NEXTOP
2014-05-04 23:15:45 +00:00
;*
;* INCREMENT TOS
;*
INCR INC ESTKL,X
2014-05-04 23:15:45 +00:00
BNE INCR1
INC ESTKH,X
INCR1 JMP NEXTOP
2014-05-04 23:15:45 +00:00
;*
;* DECREMENT TOS
;*
DECR LDA ESTKL,X
2014-05-04 23:15:45 +00:00
BNE DECR1
DEC ESTKH,X
DECR1 DEC ESTKL,X
JMP NEXTOP
2014-05-04 23:15:45 +00:00
;*
;* BITWISE COMPLIMENT TOS
;*
COMP LDA #$FF
2014-05-04 23:15:45 +00:00
EOR ESTKL,X
STA ESTKL,X
LDA #$FF
EOR ESTKH,X
STA ESTKH,X
JMP NEXTOP
2014-05-04 23:15:45 +00:00
;*
;* BITWISE AND TOS TO TOS-1
;*
BAND LDA ESTKL+1,X
2014-05-04 23:15:45 +00:00
AND ESTKL,X
STA ESTKL+1,X
LDA ESTKH+1,X
AND ESTKH,X
STA ESTKH+1,X
; INX
; JMP NEXTOP
JMP DROP
2014-05-04 23:15:45 +00:00
;*
;* INCLUSIVE OR TOS TO TOS-1
;*
IOR LDA ESTKL+1,X
2014-05-04 23:15:45 +00:00
ORA ESTKL,X
STA ESTKL+1,X
LDA ESTKH+1,X
ORA ESTKH,X
STA ESTKH+1,X
; INX
; JMP NEXTOP
JMP DROP
2014-05-04 23:15:45 +00:00
;*
;* EXLUSIVE OR TOS TO TOS-1
;*
XOR LDA ESTKL+1,X
2014-05-04 23:15:45 +00:00
EOR ESTKL,X
STA ESTKL+1,X
LDA ESTKH+1,X
EOR ESTKH,X
STA ESTKH+1,X
; INX
; JMP NEXTOP
JMP DROP
2014-05-04 23:15:45 +00:00
;*
;* SHIFT TOS-1 LEFT BY TOS
;*
SHL STY IPY
LDA ESTKL,X
2014-05-04 23:15:45 +00:00
CMP #$08
BCC SHL1
LDY ESTKL+1,X
STY ESTKH+1,X
LDY #$00
STY ESTKL+1,X
SBC #$08
SHL1 TAY
2014-05-04 23:15:45 +00:00
BEQ SHL3
SHL2 ASL ESTKL+1,X
2014-05-04 23:15:45 +00:00
ROL ESTKH+1,X
DEY
BNE SHL2
SHL3 LDY IPY
; INX
; JMP NEXTOP
JMP DROP
2014-05-04 23:15:45 +00:00
;*
;* SHIFT TOS-1 RIGHT BY TOS
;*
SHR STY IPY
LDA ESTKL,X
2014-05-04 23:15:45 +00:00
CMP #$08
BCC SHR2
LDY ESTKH+1,X
STY ESTKL+1,X
CPY #$80
LDY #$00
BCC SHR1
DEY
SHR1 STY ESTKH+1,X
2014-05-04 23:15:45 +00:00
SEC
SBC #$08
SHR2 TAY
2014-05-04 23:15:45 +00:00
BEQ SHR4
LDA ESTKH+1,X
SHR3 CMP #$80
2014-05-04 23:15:45 +00:00
ROR
ROR ESTKL+1,X
DEY
BNE SHR3
STA ESTKH+1,X
SHR4 LDY IPY
; INX
; JMP NEXTOP
JMP DROP
2014-05-04 23:15:45 +00:00
;*
;* LOGICAL NOT
;*
2014-05-06 16:43:14 +00:00
LNOT LDA ESTKL,X
2014-05-04 23:15:45 +00:00
ORA ESTKH,X
2014-05-06 16:43:14 +00:00
BEQ LNOT1
2014-05-04 23:15:45 +00:00
LDA #$FF
2014-05-06 16:43:14 +00:00
LNOT1 EOR #$FF
2014-05-04 23:15:45 +00:00
STA ESTKL,X
STA ESTKH,X
JMP NEXTOP
2014-05-04 23:15:45 +00:00
;*
;* LOGICAL AND
;*
2014-07-04 17:20:01 +00:00
LAND LDA ESTKL+1,X
2014-05-04 23:15:45 +00:00
ORA ESTKH+1,X
2014-07-04 17:20:01 +00:00
BEQ LAND2
LDA ESTKL,X
ORA ESTKH,X
2014-05-04 23:15:45 +00:00
BEQ LAND1
LDA #$FF
LAND1 STA ESTKL+1,X
2014-05-04 23:15:45 +00:00
STA ESTKH+1,X
;LAND2 INX
; JMP NEXTOP
LAND2 JMP DROP
2014-05-04 23:15:45 +00:00
;*
2014-05-06 16:43:14 +00:00
;* LOGICAL OR
2014-05-04 23:15:45 +00:00
;*
LOR LDA ESTKL,X
2014-05-04 23:15:45 +00:00
ORA ESTKH,X
ORA ESTKL+1,X
ORA ESTKH+1,X
BEQ LOR1
LDA #$FF
2014-07-04 17:20:01 +00:00
STA ESTKL+1,X
2014-05-04 23:15:45 +00:00
STA ESTKH+1,X
;LOR1 INX
; JMP NEXTOP
LOR1 JMP DROP
2014-05-04 23:15:45 +00:00
;*
;* DUPLICATE TOS
;*
DUP DEX
2014-05-04 23:15:45 +00:00
LDA ESTKL+1,X
STA ESTKL,X
LDA ESTKH+1,X
STA ESTKH,X
JMP NEXTOP
2014-05-04 23:15:45 +00:00
;*
2017-06-04 14:25:20 +00:00
;* PUSH EVAL STACK POINTER TO CALL STACK
2014-05-04 23:15:45 +00:00
;*
2017-06-04 14:25:20 +00:00
PUSHEP TXA
2014-05-04 23:15:45 +00:00
PHA
2017-06-04 14:25:20 +00:00
JMP NEXTOP
2014-05-04 23:15:45 +00:00
;*
2017-06-04 14:25:20 +00:00
;* PULL EVAL STACK POINTER FROM CALL STACK
2014-05-04 23:15:45 +00:00
;*
2017-06-04 14:25:20 +00:00
PULLEP PLA
TAX
JMP NEXTOP
2014-05-04 23:15:45 +00:00
;*
;* CONSTANT
;*
ZERO DEX
LDA #$00
2014-05-04 23:15:45 +00:00
STA ESTKL,X
STA ESTKH,X
JMP NEXTOP
CFFB LDA #$FF
!BYTE $2C ; BIT $00A9 - effectively skips LDA #$00, no harm in reading this address
CB DEX
2014-05-06 16:43:14 +00:00
+INC_IP
LDA (IP),Y
STA ESTKL,X
LDA #$00
STA ESTKH,X
JMP NEXTOP
2014-05-04 23:15:45 +00:00
;*
;* LOAD ADDRESS & LOAD CONSTANT WORD (SAME THING, WITH OR WITHOUT FIXUP)
2014-05-04 23:15:45 +00:00
;*
2014-05-06 16:43:14 +00:00
LA = *
CW DEX
2014-05-06 16:43:14 +00:00
+INC_IP
LDA (IP),Y
2014-05-04 23:15:45 +00:00
STA ESTKL,X
2014-05-06 16:43:14 +00:00
+INC_IP
LDA (IP),Y
2014-05-04 23:15:45 +00:00
STA ESTKH,X
JMP NEXTOP
2014-05-04 23:15:45 +00:00
;*
2015-02-26 21:07:08 +00:00
;* CONSTANT STRING
;*
CS DEX
+INC_IP
TYA ; NORMALIZE IP AND SAVE STRING ADDR ON ESTK
CLC
ADC IPL
STA IPL
STA ESTKL,X
LDA #$00
TAY
ADC IPH
STA IPH
STA ESTKH,X
LDA (IP),Y
TAY
JMP NEXTOP
;
CSX DEX
+INC_IP
TYA ; NORMALIZE IP
CLC
ADC IPL
STA IPL
LDA #$00
TAY
ADC IPH
STA IPH
LDA PPL ; SCAN POOL FOR STRING ALREADY THERE
STA TMPL
LDA PPH
STA TMPH
_CMPPSX ;LDA TMPH ; CHECK FOR END OF POOL
CMP IFPH
BCC _CMPSX ; CHECK FOR MATCHING STRING
BNE _CPYSX ; BEYOND END OF POOL, COPY STRING OVER
LDA TMPL
CMP IFPL
BCS _CPYSX ; AT OR BEYOND END OF POOL, COPY STRING OVER
_CMPSX STA ALTRDOFF
LDA (TMP),Y ; COMPARE STRINGS FROM AUX MEM TO STRINGS IN MAIN MEM
STA ALTRDON
CMP (IP),Y ; COMPARE STRING LENGTHS
BNE _CNXTSX1
TAY
_CMPCSX STA ALTRDOFF
LDA (TMP),Y ; COMPARE STRING CHARS FROM END
STA ALTRDON
CMP (IP),Y
BNE _CNXTSX
DEY
BNE _CMPCSX
LDA TMPL ; MATCH - SAVE EXISTING ADDR ON ESTK AND MOVE ON
STA ESTKL,X
LDA TMPH
STA ESTKH,X
BNE _CEXSX
_CNXTSX LDY #$00
STA ALTRDOFF
LDA (TMP),Y
STA ALTRDON
_CNXTSX1 SEC
ADC TMPL
STA TMPL
LDA #$00
ADC TMPH
STA TMPH
BNE _CMPPSX
_CPYSX LDA (IP),Y ; COPY STRING FROM AUX TO MAIN MEM POOL
2015-02-26 21:07:08 +00:00
TAY ; MAKE ROOM IN POOL AND SAVE ADDR ON ESTK
EOR #$FF
2015-03-04 02:37:00 +00:00
CLC
2015-02-26 21:07:08 +00:00
ADC PPL
STA PPL
STA ESTKL,X
LDA #$FF
ADC PPH
STA PPH
STA ESTKH,X ; COPY STRING FROM AUX MEM BYTECODE TO MAIN MEM POOL
_CPYSX1 LDA (IP),Y ; ALTRD IS ON, NO NEED TO CHANGE IT HERE
2015-02-26 21:07:08 +00:00
STA (PP),Y ; ALTWR IS OFF, NO NEED TO CHANGE IT HERE
DEY
CPY #$FF
BNE _CPYSX1
2015-02-26 21:07:08 +00:00
INY
_CEXSX LDA (IP),Y ; SKIP TO NEXT OP ADDR AFTER STRING
2015-02-26 21:07:08 +00:00
TAY
JMP NEXTOP
;*
2014-05-04 23:15:45 +00:00
;* LOAD VALUE FROM ADDRESS TAG
;*
LB LDA ESTKL,X
2014-05-04 23:15:45 +00:00
STA TMPL
LDA ESTKH,X
STA TMPH
STY IPY
LDY #$00
LDA (TMP),Y
2014-05-04 23:15:45 +00:00
STA ESTKL,X
STY ESTKH,X
LDY IPY
JMP NEXTOP
LW LDA ESTKL,X
2014-05-04 23:15:45 +00:00
STA TMPL
LDA ESTKH,X
STA TMPH
STY IPY
LDY #$00
LDA (TMP),Y
2014-05-04 23:15:45 +00:00
STA ESTKL,X
INY
LDA (TMP),Y
2014-05-04 23:15:45 +00:00
STA ESTKH,X
LDY IPY
JMP NEXTOP
;
LBX LDA ESTKL,X
STA TMPL
LDA ESTKH,X
STA TMPH
STY IPY
STA ALTRDOFF
2017-06-30 16:30:29 +00:00
BEQ NULLPTR
LDY #$00
LDA (TMP),Y
STA ESTKL,X
STY ESTKH,X
LDY IPY
STA ALTRDON
2014-06-16 06:07:54 +00:00
JMP NEXTOP
LWX LDA ESTKL,X
STA TMPL
LDA ESTKH,X
STA TMPH
STY IPY
STA ALTRDOFF
2017-06-30 16:30:29 +00:00
BEQ NULLPTR
LDY #$00
LDA (TMP),Y
STA ESTKL,X
INY
LDA (TMP),Y
STA ESTKH,X
LDY IPY
STA ALTRDON
2014-06-16 06:07:54 +00:00
JMP NEXTOP
2017-06-30 16:30:29 +00:00
NULLPTR BRK
2014-05-04 23:15:45 +00:00
;*
;* LOAD ADDRESS OF LOCAL FRAME OFFSET
;*
2014-05-06 16:43:14 +00:00
LLA +INC_IP
LDA (IP),Y
DEX
CLC
ADC IFPL
STA ESTKL,X
LDA #$00
ADC IFPH
STA ESTKH,X
JMP NEXTOP
2014-05-04 23:15:45 +00:00
;*
;* LOAD VALUE FROM LOCAL FRAME OFFSET
;*
2014-05-06 16:43:14 +00:00
LLB +INC_IP
LDA (IP),Y
STY IPY
2014-05-04 23:15:45 +00:00
TAY
DEX
LDA (IFP),Y
2014-05-04 23:15:45 +00:00
STA ESTKL,X
LDA #$00
STA ESTKH,X
LDY IPY
JMP NEXTOP
2014-05-06 16:43:14 +00:00
LLW +INC_IP
LDA (IP),Y
STY IPY
2014-05-04 23:15:45 +00:00
TAY
DEX
LDA (IFP),Y
2014-05-04 23:15:45 +00:00
STA ESTKL,X
INY
LDA (IFP),Y
2014-05-04 23:15:45 +00:00
STA ESTKH,X
LDY IPY
JMP NEXTOP
;
2014-05-06 16:43:14 +00:00
LLBX +INC_IP
LDA (IP),Y
STY IPY
TAY
DEX
2014-05-06 16:43:14 +00:00
STA ALTRDOFF
LDA (IFP),Y
STA ESTKL,X
LDA #$00
STA ESTKH,X
STA ALTRDON
LDY IPY
2014-06-16 06:07:54 +00:00
JMP NEXTOP
2014-05-06 16:43:14 +00:00
LLWX +INC_IP
LDA (IP),Y
STY IPY
TAY
DEX
2014-05-06 16:43:14 +00:00
STA ALTRDOFF
LDA (IFP),Y
STA ESTKL,X
INY
LDA (IFP),Y
STA ESTKH,X
STA ALTRDON
LDY IPY
2014-06-16 06:07:54 +00:00
JMP NEXTOP
2014-05-04 23:15:45 +00:00
;*
;* LOAD VALUE FROM ABSOLUTE ADDRESS
;*
2014-05-06 16:43:14 +00:00
LAB +INC_IP
LDA (IP),Y
2014-05-04 23:15:45 +00:00
STA TMPL
2014-05-06 16:43:14 +00:00
+INC_IP
LDA (IP),Y
2014-05-04 23:15:45 +00:00
STA TMPH
STY IPY
LDY #$00
LDA (TMP),Y
2014-05-04 23:15:45 +00:00
DEX
STA ESTKL,X
STY ESTKH,X
LDY IPY
JMP NEXTOP
2014-05-06 16:43:14 +00:00
LAW +INC_IP
LDA (IP),Y
2014-05-04 23:15:45 +00:00
STA TMPL
2014-05-06 16:43:14 +00:00
+INC_IP
LDA (IP),Y
2014-05-04 23:15:45 +00:00
STA TMPH
STY IPY
LDY #$00
LDA (TMP),Y
2014-05-04 23:15:45 +00:00
DEX
STA ESTKL,X
INY
LDA (TMP),Y
2014-05-04 23:15:45 +00:00
STA ESTKH,X
LDY IPY
JMP NEXTOP
;
2014-05-06 16:43:14 +00:00
LABX +INC_IP
LDA (IP),Y
STA TMPL
2014-05-06 16:43:14 +00:00
+INC_IP
LDA (IP),Y
STA TMPH
STY IPY
2014-05-06 16:43:14 +00:00
STA ALTRDOFF
LDY #$00
LDA (TMP),Y
DEX
STA ESTKL,X
STY ESTKH,X
STA ALTRDON
LDY IPY
2014-06-16 06:07:54 +00:00
JMP NEXTOP
2014-05-06 16:43:14 +00:00
LAWX +INC_IP
LDA (IP),Y
STA TMPL
2014-05-06 16:43:14 +00:00
+INC_IP
LDA (IP),Y
STA TMPH
STY IPY
2014-05-06 16:43:14 +00:00
STA ALTRDOFF
LDY #$00
LDA (TMP),Y
DEX
STA ESTKL,X
INY
LDA (TMP),Y
STA ESTKH,X
STA ALTRDON
LDY IPY
2014-06-16 06:07:54 +00:00
JMP NEXTOP
2014-05-04 23:15:45 +00:00
;*
;* STORE VALUE TO ADDRESS
;*
2017-06-04 14:25:20 +00:00
SB LDA ESTKL,X
2014-05-04 23:15:45 +00:00
STA TMPL
2017-06-04 14:25:20 +00:00
LDA ESTKH,X
2014-05-04 23:15:45 +00:00
STA TMPH
2017-06-04 14:25:20 +00:00
LDA ESTKL+1,X
STY IPY
BIT LCRWEN+LCBNK2
BIT LCRWEN+LCBNK2
LDY #$00
STA (TMP),Y
LDY IPY
INX
; INX
; JMP NEXTOP
JMP DROP
2017-06-04 14:25:20 +00:00
SW LDA ESTKL,X
2014-05-04 23:15:45 +00:00
STA TMPL
2017-06-04 14:25:20 +00:00
LDA ESTKH,X
2014-05-04 23:15:45 +00:00
STA TMPH
STY IPY
BIT LCRWEN+LCBNK2
BIT LCRWEN+LCBNK2
LDY #$00
2017-06-04 14:25:20 +00:00
LDA ESTKL+1,X
STA (TMP),Y
INY
2017-06-04 14:25:20 +00:00
LDA ESTKH+1,X
STA (TMP),Y
LDY IPY
INX
; INX
; JMP NEXTOP
JMP DROP
2014-05-04 23:15:45 +00:00
;*
;* STORE VALUE TO LOCAL FRAME OFFSET
;*
2014-05-06 16:43:14 +00:00
SLB +INC_IP
LDA (IP),Y
STY IPY
TAY
LDA ESTKL,X
STA (IFP),Y
LDY IPY
; INX
; JMP NEXTOP
JMP DROP
2014-05-06 16:43:14 +00:00
SLW +INC_IP
LDA (IP),Y
STY IPY
2014-05-04 23:15:45 +00:00
TAY
LDA ESTKL,X
2014-05-06 16:43:14 +00:00
STA (IFP),Y
INY
LDA ESTKH,X
2014-05-06 16:43:14 +00:00
STA (IFP),Y
LDY IPY
; INX
; JMP NEXTOP
JMP DROP
2014-05-04 23:15:45 +00:00
;*
;* STORE VALUE TO LOCAL FRAME OFFSET WITHOUT POPPING STACK
;*
2014-05-06 16:43:14 +00:00
DLB +INC_IP
LDA (IP),Y
STY IPY
2014-05-04 23:15:45 +00:00
TAY
LDA ESTKL,X
STA (IFP),Y
LDY IPY
JMP NEXTOP
2014-05-06 16:43:14 +00:00
DLW +INC_IP
LDA (IP),Y
STY IPY
2014-05-04 23:15:45 +00:00
TAY
LDA ESTKL,X
STA (IFP),Y
2014-05-04 23:15:45 +00:00
INY
LDA ESTKH,X
STA (IFP),Y
LDY IPY
JMP NEXTOP
2014-05-04 23:15:45 +00:00
;*
;* STORE VALUE TO ABSOLUTE ADDRESS
;*
2014-05-06 16:43:14 +00:00
SAB +INC_IP
LDA (IP),Y
2014-05-04 23:15:45 +00:00
STA TMPL
2014-05-06 16:43:14 +00:00
+INC_IP
LDA (IP),Y
2014-05-04 23:15:45 +00:00
STA TMPH
LDA ESTKL,X
STY IPY
LDY #$00
STA (TMP),Y
LDY IPY
; INX
; JMP NEXTOP
JMP DROP
2014-05-06 16:43:14 +00:00
SAW +INC_IP
LDA (IP),Y
2014-05-04 23:15:45 +00:00
STA TMPL
2014-05-06 16:43:14 +00:00
+INC_IP
LDA (IP),Y
2014-05-04 23:15:45 +00:00
STA TMPH
STY IPY
LDY #$00
2014-05-04 23:15:45 +00:00
LDA ESTKL,X
STA (TMP),Y
INY
2014-05-04 23:15:45 +00:00
LDA ESTKH,X
STA (TMP),Y
LDY IPY
; INX
; JMP NEXTOP
JMP DROP
2014-05-04 23:15:45 +00:00
;*
;* STORE VALUE TO ABSOLUTE ADDRESS WITHOUT POPPING STACK
;*
2014-05-06 16:43:14 +00:00
DAB +INC_IP
LDA (IP),Y
2014-05-04 23:15:45 +00:00
STA TMPL
2014-05-06 16:43:14 +00:00
+INC_IP
LDA (IP),Y
2014-05-04 23:15:45 +00:00
STA TMPH
STY IPY
LDY #$00
2014-05-04 23:15:45 +00:00
LDA ESTKL,X
STA (TMP),Y
LDY IPY
JMP NEXTOP
2014-05-06 16:43:14 +00:00
DAW +INC_IP
LDA (IP),Y
2014-05-04 23:15:45 +00:00
STA TMPL
2014-05-06 16:43:14 +00:00
+INC_IP
LDA (IP),Y
2014-05-04 23:15:45 +00:00
STA TMPH
STY IPY
LDY #$00
2014-05-04 23:15:45 +00:00
LDA ESTKL,X
STA (TMP),Y
INY
2014-05-04 23:15:45 +00:00
LDA ESTKH,X
STA (TMP),Y
LDY IPY
JMP NEXTOP
2014-05-04 23:15:45 +00:00
;*
;* COMPARES
;*
2014-06-24 01:55:52 +00:00
ISEQ LDA ESTKL,X
2014-05-04 23:15:45 +00:00
CMP ESTKL+1,X
2014-06-24 01:55:52 +00:00
BNE ISFLS
2014-05-04 23:15:45 +00:00
LDA ESTKH,X
CMP ESTKH+1,X
2014-06-24 01:55:52 +00:00
BNE ISFLS
ISTRU LDA #$FF
STA ESTKL+1,X
STA ESTKH+1,X
; INX
; JMP NEXTOP
JMP DROP
;
2014-06-24 01:55:52 +00:00
ISNE LDA ESTKL,X
2014-05-04 23:15:45 +00:00
CMP ESTKL+1,X
2014-06-24 01:55:52 +00:00
BNE ISTRU
2014-05-04 23:15:45 +00:00
LDA ESTKH,X
CMP ESTKH+1,X
2014-06-24 01:55:52 +00:00
BNE ISTRU
ISFLS LDA #$00
STA ESTKL+1,X
STA ESTKH+1,X
; INX
; JMP NEXTOP
JMP DROP
;
2014-06-24 01:55:52 +00:00
ISGE LDA ESTKL+1,X
2014-05-04 23:15:45 +00:00
CMP ESTKL,X
LDA ESTKH+1,X
SBC ESTKH,X
BVC ISGE1
EOR #$80
2014-06-24 01:55:52 +00:00
ISGE1 BPL ISTRU
BMI ISFLS
;
2014-06-24 01:55:52 +00:00
ISGT LDA ESTKL,X
2014-05-04 23:15:45 +00:00
CMP ESTKL+1,X
LDA ESTKH,X
SBC ESTKH+1,X
BVC ISGT1
EOR #$80
2014-06-24 01:55:52 +00:00
ISGT1 BMI ISTRU
BPL ISFLS
;
2014-06-24 01:55:52 +00:00
ISLE LDA ESTKL,X
2014-05-04 23:15:45 +00:00
CMP ESTKL+1,X
LDA ESTKH,X
SBC ESTKH+1,X
BVC ISLE1
EOR #$80
2014-06-24 01:55:52 +00:00
ISLE1 BPL ISTRU
BMI ISFLS
;
2014-06-24 01:55:52 +00:00
ISLT LDA ESTKL+1,X
2014-05-04 23:15:45 +00:00
CMP ESTKL,X
LDA ESTKH+1,X
SBC ESTKH,X
BVC ISLT1
EOR #$80
2014-06-24 01:55:52 +00:00
ISLT1 BMI ISTRU
BPL ISFLS
2014-05-04 23:15:45 +00:00
;*
;* BRANCHES
2014-05-04 23:15:45 +00:00
;*
BRTRU INX
2014-05-04 23:15:45 +00:00
LDA ESTKH-1,X
ORA ESTKL-1,X
BNE BRNCH
2014-05-06 16:43:14 +00:00
NOBRNCH +INC_IP
+INC_IP
JMP NEXTOP
BRFLS INX
2014-05-04 23:15:45 +00:00
LDA ESTKH-1,X
ORA ESTKL-1,X
BNE NOBRNCH
BRNCH LDA IPH
STA TMPH
LDA IPL
2014-05-06 16:43:14 +00:00
+INC_IP
2014-05-04 23:15:45 +00:00
CLC
ADC (IP),Y
STA TMPL
LDA TMPH
2014-05-06 16:43:14 +00:00
+INC_IP
ADC (IP),Y
STA IPH
LDA TMPL
STA IPL
DEY
DEY
JMP NEXTOP
BREQ INX
2014-05-04 23:15:45 +00:00
LDA ESTKL-1,X
CMP ESTKL,X
BNE NOBRNCH
LDA ESTKH-1,X
CMP ESTKH,X
BEQ BRNCH
BNE NOBRNCH
BRNE INX
2014-05-04 23:15:45 +00:00
LDA ESTKL-1,X
CMP ESTKL,X
BNE BRNCH
LDA ESTKH-1,X
CMP ESTKH,X
BEQ NOBRNCH
BNE BRNCH
BRGT INX
2014-05-04 23:15:45 +00:00
LDA ESTKL-1,X
CMP ESTKL,X
LDA ESTKH-1,X
SBC ESTKH,X
BMI BRNCH
BPL NOBRNCH
BRLT INX
2014-05-04 23:15:45 +00:00
LDA ESTKL,X
CMP ESTKL-1,X
LDA ESTKH,X
SBC ESTKH-1,X
BMI BRNCH
BPL NOBRNCH
IBRNCH LDA IPL
CLC
ADC ESTKL,X
STA IPL
LDA IPH
ADC ESTKH,X
STA IPH
INX
JMP NEXTOP
2014-05-04 23:15:45 +00:00
;*
;* CALL INTO ABSOLUTE ADDRESS (NATIVE CODE)
;*
2014-05-06 16:43:14 +00:00
CALL +INC_IP
LDA (IP),Y
STA TMPL
2014-05-06 16:43:14 +00:00
+INC_IP
LDA (IP),Y
STA TMPH
LDA IPH
2014-05-04 23:15:45 +00:00
PHA
LDA IPL
PHA
TYA
2014-05-04 23:15:45 +00:00
PHA
JSR JMPTMP
2014-05-04 23:15:45 +00:00
PLA
TAY
PLA
STA IPL
2014-05-04 23:15:45 +00:00
PLA
STA IPH
2014-06-16 06:07:54 +00:00
LDA #>OPTBL ; MAKE SURE WE'RE INDEXING THE RIGHT TABLE
STA OPPAGE
JMP NEXTOP
;
2014-05-06 16:43:14 +00:00
CALLX +INC_IP
LDA (IP),Y
STA TMPL
2014-05-06 16:43:14 +00:00
+INC_IP
LDA (IP),Y
STA TMPH
LDA IPH
PHA
LDA IPL
PHA
TYA
PHA
2014-05-23 19:23:51 +00:00
STA ALTRDOFF
CLI
JSR JMPTMP
SEI
STA ALTRDON
PLA
TAY
PLA
STA IPL
PLA
STA IPH
2014-06-16 06:07:54 +00:00
LDA #>OPXTBL ; MAKE SURE WE'RE INDEXING THE RIGHT TABLE
STA OPPAGE
JMP NEXTOP
2014-05-04 23:15:45 +00:00
;*
;* INDIRECT CALL TO ADDRESS (NATIVE CODE)
;*
ICAL LDA ESTKL,X
STA TMPL
2014-05-04 23:15:45 +00:00
LDA ESTKH,X
STA TMPH
2014-05-04 23:15:45 +00:00
INX
LDA IPH
PHA
LDA IPL
PHA
TYA
2014-05-04 23:15:45 +00:00
PHA
JSR JMPTMP
2014-05-04 23:15:45 +00:00
PLA
TAY
PLA
STA IPL
2014-05-04 23:15:45 +00:00
PLA
STA IPH
2014-06-16 06:07:54 +00:00
LDA #>OPTBL ; MAKE SURE WE'RE INDEXING THE RIGHT TABLE
STA OPPAGE
JMP NEXTOP
;
ICALX LDA ESTKL,X
STA TMPL
LDA ESTKH,X
STA TMPH
INX
LDA IPH
PHA
LDA IPL
PHA
TYA
PHA
2014-05-06 16:43:14 +00:00
STA ALTRDOFF
2014-05-23 19:23:51 +00:00
CLI
JSR JMPTMP
SEI
STA ALTRDON
PLA
TAY
PLA
STA IPL
PLA
STA IPH
2014-06-16 06:07:54 +00:00
LDA #>OPXTBL ; MAKE SURE WE'RE INDEXING THE RIGHT TABLE
STA OPPAGE
JMP NEXTOP
2014-05-04 23:15:45 +00:00
;*
;* JUMP INDIRECT TRHOUGH TMP
;*
JMPTMP JMP (TMP)
;*
2014-05-04 23:15:45 +00:00
;* ENTER FUNCTION WITH FRAME SIZE AND PARAM COUNT
;*
ENTER INY
LDA (IP),Y
PHA ; SAVE ON STACK FOR LEAVE
2015-02-26 21:07:08 +00:00
EOR #$FF ; ALLOCATE FRAME
2014-05-04 23:15:45 +00:00
SEC
2015-02-26 21:07:08 +00:00
ADC PPL
STA PPL
STA IFPL
2015-02-26 21:07:08 +00:00
LDA #$FF
ADC PPH
STA PPH
STA IFPH
INY
2014-06-30 20:46:36 +00:00
LDA (IP),Y
2014-05-04 23:15:45 +00:00
ASL
TAY
BEQ +
2014-06-30 20:46:36 +00:00
- LDA ESTKH,X
2014-05-04 23:15:45 +00:00
DEY
STA (IFP),Y
LDA ESTKL,X
2014-05-04 23:15:45 +00:00
INX
2014-06-30 20:46:36 +00:00
DEY
STA (IFP),Y
BNE -
+ LDY #$02
JMP NEXTOP
2014-05-04 23:15:45 +00:00
;*
;* LEAVE FUNCTION
2014-05-04 23:15:45 +00:00
;*
2014-05-06 16:43:14 +00:00
LEAVEX STA ALTRDOFF
CLI
2015-02-26 21:07:08 +00:00
LEAVE PLA ; DEALLOCATE POOL + FRAME
CLC
ADC IFPL
2015-02-26 21:07:08 +00:00
STA PPL
LDA #$00
ADC IFPH
STA PPH
PLA ; RESTORE PREVIOUS FRAME
STA IFPL
2015-02-26 21:07:08 +00:00
PLA
STA IFPH
RTS
2015-02-26 21:07:08 +00:00
;
2014-05-06 16:43:14 +00:00
RETX STA ALTRDOFF
2014-05-23 19:23:51 +00:00
CLI
2015-02-26 21:07:08 +00:00
RET LDA IFPL ; DEALLOCATE POOL
STA PPL
LDA IFPH
STA PPH
PLA ; RESTORE PREVIOUS FRAME
STA IFPL
PLA
STA IFPH
2014-05-04 23:15:45 +00:00
RTS
2014-05-07 02:18:36 +00:00
VMEND = *
2015-03-04 02:37:00 +00:00
}