Fix many VM issues, especially 6502 version. Now boots!

This commit is contained in:
David Schmenk
2014-05-07 14:25:19 -07:00
parent b0e291b1f6
commit 23ac5a36f0
6 changed files with 153 additions and 112 deletions

View File

@@ -41,8 +41,12 @@ SRCH = SRC+1
DST = SRC+2 DST = SRC+2
DSTL = DST DSTL = DST
DSTH = DST+1 DSTH = DST+1
ESP = DST+2 ;*
;* ASM VARIABLES
;*
ESP !BYTE 0
end end
;
; CALL PRODOS ; CALL PRODOS
; SYSCALL(CMD, PARAMS) ; SYSCALL(CMD, PARAMS)
; ;
@@ -68,12 +72,26 @@ end
; CALL LOADED SYSTEM PROGRAM ; CALL LOADED SYSTEM PROGRAM
; ;
asm exec asm exec
LDX #$FE LDA #$00
STA IFPL
LDA #$BF
STA IFPH
LDX #$FF
TXS TXS
LDX ESTKSZ/2 LDX #ESTKSZ/2
BIT ROMEN
JMP $2000 JMP $2000
end end
; ;
; EXIT
;
asm reboot
BIT ROMEN
LDA #$00
STA $3F4 ; INVALIDATE POWER-UP BYTE
JMP ($FFFC) ; RESET
end
;
; SET MEMORY TO 0 ; SET MEMORY TO 0
; MEMCLR(ADDR, SIZE) ; MEMCLR(ADDR, SIZE)
; ;
@@ -181,6 +199,7 @@ asm cout
ORA #$80 ORA #$80
BIT ROMEN BIT ROMEN
JSR $FDED JSR $FDED
BIT LCRDEN+LCBNK2
RTS RTS
end end
; ;
@@ -196,6 +215,7 @@ asm cin
STA ESTKL,X STA ESTKL,X
LDY #$00 LDY #$00
STY ESTKH,X STY ESTKH,X
BIT LCRDEN+LCBNK2
RTS RTS
end end
; ;
@@ -219,7 +239,8 @@ asm prstr
TYA TYA
CMP ESTKL,X CMP ESTKL,X
BNE - BNE -
+ RTS + BIT LCRDEN+LCBNK2
RTS
end end
; ;
; PRINT BYTE ; PRINT BYTE
@@ -230,6 +251,7 @@ asm prbyte
BIT ROMEN BIT ROMEN
JSR $FDDA JSR $FDDA
LDX ESP LDX ESP
BIT LCRDEN+LCBNK2
RTS RTS
end end
; ;
@@ -253,6 +275,7 @@ asm rdstr
STA ESTKL,X STA ESTKL,X
LDA #$01 LDA #$01
STA ESTKH,X STA ESTKH,X
BIT LCRDEN+LCBNK2
RTS RTS
end end
asm toupper asm toupper
@@ -266,15 +289,6 @@ asm toupper
STA ESTKL,X STA ESTKL,X
+ RTS + RTS
end end
;
; EXIT
;
asm reboot
BIT ROMEN
LDA #$00
STA $3F4 ; INVALIDATE POWER-UP BYTE
JMP ($FFFC) ; RESET
end
def crout def crout
cout($0D) cout($0D)
end end
@@ -303,9 +317,9 @@ def online
params.0 = 2 params.0 = 2
params.1 = 0 params.1 = 0
params:2 = $2000 params:2 = databuff
perr = prodos($C5, @params) perr = prodos($C5, @params)
return $2000 return databuff
end end
def open(path, buff) def open(path, buff)
byte params[6] byte params[6]
@@ -492,7 +506,7 @@ end
resetmemfiles() resetmemfiles()
prstr(@version) prstr(@version)
crout(); crout()
while 1 while 1
prstr(getpfx(@prefix)) prstr(getpfx(@prefix))
cmdptr = rdstr($BA) cmdptr = rdstr($BA)

View File

@@ -39,11 +39,20 @@ asm exec
STA IFPH STA IFPH
LDX #$FE LDX #$FE
TXS TXS
LDX ESTKSZ/2 LDX #ESTKSZ/2
BIT ROMEN BIT ROMEN
JMP $2000 JMP $2000
end end
; ;
; EXIT
;
asm reboot
BIT ROMEN
LDA #$00
STA $3F4 ; INVALIDATE POWER-UP BYTE
JMP ($FFFC) ; RESET
end
;
; SET MEMORY TO 0 ; SET MEMORY TO 0
; MEMCLR(ADDR, SIZE) ; MEMCLR(ADDR, SIZE)
; ;
@@ -112,6 +121,7 @@ asm cout
ORA #$80 ORA #$80
BIT ROMEN BIT ROMEN
JSR $FDED JSR $FDED
BIT LCRDEN+LCBNK2
RTS RTS
end end
; ;
@@ -127,6 +137,7 @@ asm cin
STA ESTKL,X STA ESTKL,X
LDY #$00 LDY #$00
STY ESTKH,X STY ESTKH,X
BIT LCRDEN+LCBNK2
RTS RTS
end end
; ;
@@ -150,16 +161,8 @@ asm prstr
TYA TYA
CMP ESTKL,X CMP ESTKL,X
BNE - BNE -
+ RTS + BIT LCRDEN+LCBNK2
end RTS
;
; EXIT
;
asm reboot
BIT ROMEN
LDA #$00
STA $3F4 ; INVALIDATE POWER-UP BYTE
JMP ($FFFC) ; RESET
end end
def crout def crout
cout($0D) cout($0D)

View File

@@ -311,9 +311,7 @@ void emit_header(void)
} }
else else
{ {
printf("\tJSR\t$3D0\n"); printf("\tJMP\t_INIT\t\t\t; MODULE INITIALIZATION ROUTINE\n");
printf("\t%s\t$00\t\t\t; MODULE INITIALIZATION ROUTINE\n", DB);
printf("\t%s\t_INIT\t\t\t;\n", DW);
} }
} }
void emit_rld(void) void emit_rld(void)
@@ -493,13 +491,9 @@ void emit_def(char *name, int is_bytecode)
{ {
if (!(outflags & MODULE)) if (!(outflags & MODULE))
{ {
printf("%s%c\n", name, LBL); //printf("%s%c\n", name, LBL);
if (is_bytecode) if (is_bytecode)
{
printf("\tJSR $03D0\n"); printf("\tJSR $03D0\n");
printf("\t%s\t$00\n", DB);
printf("\t%s\t*+2\n", DW);
}
} }
} }
void emit_codetag(int tag) void emit_codetag(int tag)

View File

@@ -1301,6 +1301,7 @@ int parse_module(void)
if (scantoken != DONE_TOKEN && scantoken != EOF_TOKEN) if (scantoken != DONE_TOKEN && scantoken != EOF_TOKEN)
{ {
emit_start(); emit_start();
emit_def("_INIT", 1);
prevstmnt = 0; prevstmnt = 0;
while (parse_stmnt()) next_line(); while (parse_stmnt()) next_line();
if (scantoken != DONE_TOKEN) if (scantoken != DONE_TOKEN)

View File

@@ -18,7 +18,7 @@ int show_state = 0;
#define BYTE_PTR(bp) ((byte)((bp)[0])) #define BYTE_PTR(bp) ((byte)((bp)[0]))
#define WORD_PTR(bp) ((word)((bp)[0] | ((bp)[1] << 8))) #define WORD_PTR(bp) ((word)((bp)[0] | ((bp)[1] << 8)))
#define UWORD_PTR(bp) ((uword)((bp)[0] | ((bp)[1] << 8))) #define UWORD_PTR(bp) ((uword)((bp)[0] | ((bp)[1] << 8)))
#define TO_UWORD(w) ((w)&0xFFFF) #define TO_UWORD(w) ((uword)((w)))
#define MOD_ADDR 0x1000 #define MOD_ADDR 0x1000
#define DEF_CALL 0x0800 #define DEF_CALL 0x0800
#define DEF_CALLSZ 0x0800 #define DEF_CALLSZ 0x0800
@@ -30,8 +30,8 @@ uword sp = 0x01FE, fp = 0xBEFF, heap = 0x6000, xheap = 0x0800, deftbl = DEF_CALL
#define EVAL_STACKSZ 16 #define EVAL_STACKSZ 16
#define PUSH(v) (*(--esp))=(v) #define PUSH(v) (*(--esp))=(v)
#define POP (*(esp++)) #define POP ((word)(*(esp++)))
#define UPOP ((uword)(*(esp++)&0xFFFF)) #define UPOP ((uword)(*(esp++)))
#define TOS (esp[0]) #define TOS (esp[0])
word eval_stack[EVAL_STACKSZ]; word eval_stack[EVAL_STACKSZ];
word *esp = eval_stack + EVAL_STACKSZ; word *esp = eval_stack + EVAL_STACKSZ;
@@ -649,7 +649,7 @@ void interp(code *ip)
* 0x30-0x3F * 0x30-0x3F
*/ */
case 0x30: // DROP : TOS = case 0x30: // DROP : TOS =
esp++;; POP;
break; break;
case 0x32: // DUP : TOS = TOS case 0x32: // DUP : TOS = TOS
val = TOS; val = TOS;
@@ -661,7 +661,8 @@ void interp(code *ip)
mem_data[sp--] = val; mem_data[sp--] = val;
break; break;
case 0x36: // PULL : TOS = TOSP case 0x36: // PULL : TOS = TOSP
PUSH(mem_data[++sp] | (mem_data[++sp] << 8)); PUSH(mem_data[sp] | (mem_data[sp + 1] << 8));
sp += 2;
break; break;
case 0x38: // BRGT : TOS-1 > TOS ? IP += (IP) case 0x38: // BRGT : TOS-1 > TOS ? IP += (IP)
val = POP; val = POP;

View File

@@ -110,6 +110,17 @@ ESP = DST+2
CMP #$E0 CMP #$E0
BNE - BNE -
;* ;*
;* MOVE FIRST PAGE OF 'BYE' INTO PLACE
;*
LDY #$00
STY SRCL
LDA #$D1
STA SRCH
- LDA (SRC),Y
STA $1000,Y
INY
BNE -
;*
;* LOOK FOR STARTUP FILE ;* LOOK FOR STARTUP FILE
;* ;*
JSR PRODOS ; OPEN AUTORUN JSR PRODOS ; OPEN AUTORUN
@@ -133,18 +144,11 @@ ESP = DST+2
JMP NOAUTO JMP NOAUTO
+ LDX READPARMS+6 + LDX READPARMS+6
STX $0280 STX $0280
NOAUTO JSR PRODOS JSR PRODOS
!BYTE $CC !BYTE $CC
!WORD CLOSEPARMS !WORD CLOSEPARMS
LDY #$00 JMP CMDEXEC ; CALL CM
STY SRCL NOAUTO JMP BYE
LDA #$D1
STA SRCH
- LDA (SRC),Y ; LOAD FIRST PAGE OF CMD INTO PLACE
STA $1000,Y
INY
BNE -
JMP CMDEXEC ; CALL CMD
AUTORUN !BYTE 7 AUTORUN !BYTE 7
!TEXT "AUTORUN" !TEXT "AUTORUN"
OPENPARMS !BYTE 3 OPENPARMS !BYTE 3
@@ -167,12 +171,10 @@ PAGE3 = *
;* ;*
;* PAGE 3 VECTORS INTO INTERPRETER ;* PAGE 3 VECTORS INTO INTERPRETER
;* ;*
BIT LCRDEN+LCBNK2 ; $03D0 - INTERP ENTRY BIT LCRDEN+LCBNK2 ; $03D0 - DIRECT INTERP ENTRY
JMP INTERP JMP INTERP
CALL3 BIT ROMEN BIT LCRDEN+LCBNK2 ; $03D6 - INDIRECT INTERP ENTRY
CALLADR JSR $0000 JMP INTERPX
BIT LCRDEN+LCBNK2
RTS
} }
VMCORE = * VMCORE = *
!PSEUDOPC $D000 { !PSEUDOPC $D000 {
@@ -182,7 +184,7 @@ VMCORE = *
OPTBL !WORD ZERO,ADD,SUB,MUL,DIV,MOD,INCR,DECR ; 00 02 04 06 08 0A 0C 0E 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 !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,SWAP ; 20 22 24 26 28 2A 2C 2E !WORD LNOT,LOR,LAND,LA,LLA,CB,CW,SWAP ; 20 22 24 26 28 2A 2C 2E
!WORD DROP,DUP,PUSH,PULL,BRLT,BRGT,BREQ,BRNE ; 30 32 34 36 38 3A 3C 3E !WORD DROP,DUP,PUSH,PULL,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 ISEQ,ISNE,ISGT,ISLT,ISGE,ISLE,BRFLS,BRTRU ; 40 42 44 46 48 4A 4C 4E
!WORD BRNCH,IBRNCH,CALL,ICAL,ENTER,LEAVE,RET,NEXTOP ; 50 52 54 56 58 5A 5C 5E !WORD BRNCH,IBRNCH,CALL,ICAL,ENTER,LEAVE,RET,NEXTOP ; 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 LB,LW,LLB,LLW,LAB,LAW,DLB,DLW ; 60 62 64 66 68 6A 6C 6E
@@ -193,7 +195,7 @@ OPTBL !WORD ZERO,ADD,SUB,MUL,DIV,MOD,INCR,DECR ; 00 02 04 06 08 0A 0C 0E
OPXTBL !WORD ZEROX,ADDX,SUBX,MULX,DIVX,MODX,INCRX,DECRX ; 00 02 04 06 08 0A 0C 0E OPXTBL !WORD ZEROX,ADDX,SUBX,MULX,DIVX,MODX,INCRX,DECRX ; 00 02 04 06 08 0A 0C 0E
!WORD NEGX,COMPX,BANDX,IORX,XORX,SHLX,SHRX,IDXWX ; 10 12 14 16 18 1A 1C 1E !WORD NEGX,COMPX,BANDX,IORX,XORX,SHLX,SHRX,IDXWX ; 10 12 14 16 18 1A 1C 1E
!WORD LNOTX,LORX,LANDX,LAX,LLAX,CBX,CWX,SWAPX ; 20 22 24 26 28 2A 2C 2E !WORD LNOTX,LORX,LANDX,LAX,LLAX,CBX,CWX,SWAPX ; 20 22 24 26 28 2A 2C 2E
!WORD DROPX,DUPX,PUSHX,PULLX,BRLTX,BRGTX,BREQX,BRNEX ; 30 32 34 36 38 3A 3C 3E !WORD DROPX,DUPX,PUSHX,PULLX,BRGTX,BRLTX,BREQX,BRNEX ; 30 32 34 36 38 3A 3C 3E
!WORD ISEQX,ISNEX,ISGTX,ISLTX,ISGEX,ISLEX,BRFLSX,BRTRUX; 40 42 44 46 48 4A 4C 4E !WORD ISEQX,ISNEX,ISGTX,ISLTX,ISGEX,ISLEX,BRFLSX,BRTRUX; 40 42 44 46 48 4A 4C 4E
!WORD BRNCHX,IBRNCHX,CALLX,ICALX,ENTERX,LEAVEX,RETX,NEXTOPX; 50 52 54 56 58 5A 5C 5E !WORD BRNCHX,IBRNCHX,CALLX,ICALX,ENTERX,LEAVEX,RETX,NEXTOPX; 50 52 54 56 58 5A 5C 5E
!WORD LBX,LWX,LLBX,LLWX,LABX,LAWX,DLBX,DLWX ; 60 62 64 66 68 6A 6C 6E !WORD LBX,LWX,LLBX,LLWX,LABX,LAWX,DLBX,DLWX ; 60 62 64 66 68 6A 6C 6E
@@ -205,14 +207,12 @@ OPXTBL !WORD ZEROX,ADDX,SUBX,MULX,DIVX,MODX,INCRX,DECRX ; 00 02 04 06 08 0
;* ;*
;* CLEAR COMMAND LINE LENGTH BYTE IF CALLED FROM 'BYE' ;* CLEAR COMMAND LINE LENGTH BYTE IF CALLED FROM 'BYE'
;* ;*
LDY DEFCMD BYE LDY DEFCMD
STY $0280 ; SET DEFAULT COMMAND WHEN CALLED FROM 'BYE' STY $0280 ; SET DEFAULT COMMAND WHEN CALLED FROM 'BYE'
- LDA DEFCMD,Y - LDA DEFCMD,Y
STA $0280,Y STA $0280,Y
DEY DEY
BNE - BNE -
LDX #$FE ; LEAVE ROOM FOR COMMAND LINE LENGTH BYTE
TXS
;* ;*
;* MOVE REST OF CMD FROM LANGUAGE CARD ;* MOVE REST OF CMD FROM LANGUAGE CARD
;* ;*
@@ -256,13 +256,25 @@ START LDA #$00
STA IFPL STA IFPL
LDA #$BF LDA #$BF
STA IFPH STA IFPH
LDX ESTKSZ/2 LDX #$FF
TXS
LDX #ESTKSZ/2
!SOURCE "cmdexec.a" !SOURCE "cmdexec.a"
} }
;* ;*
;* ENTER INTO BYTECODE INTERPRETER ;* ENTER INTO BYTECODE INTERPRETER
;* ;*
INTERP PLA INTERP STA LCRWEN+LCBNK2 ; WRITE ENABLE LANGUAGE CARD
STA LCRWEN+LCBNK2
PLA
STA IPL
PLA
STA IPH
LDY #$01
BNE FETCHOP
INTERPX STA LCRWEN+LCBNK2 ; WRITE ENABLE LANGUAGE CARD
STA LCRWEN+LCBNK2
PLA
STA TMPL STA TMPL
PLA PLA
STA TMPH STA TMPH
@@ -287,7 +299,7 @@ DROP INX
NEXTOP INY NEXTOP INY
BEQ NEXTOPH BEQ NEXTOPH
FETCHOP LDA (IP),Y FETCHOP LDA (IP),Y
STA *+5 STA *+4
JMP (OPTBL) JMP (OPTBL)
;* ;*
;* INTERP BYTECODE IN AUX MEM ;* INTERP BYTECODE IN AUX MEM
@@ -302,9 +314,13 @@ FETCHOPX SEI
STA ALTRDON STA ALTRDON
LDA (IP),Y LDA (IP),Y
ORA #$80 ; SELECT OPX OPCODES ORA #$80 ; SELECT OPX OPCODES
STA *+5 STA *+4
JMP (OPXTBL) JMP (OPXTBL)
;* ;*
;* INDIRECT JUMP TO (TMP)
;*
JMPTMP JMP (TMP)
;*
;* ADD TOS TO TOS-1 ;* ADD TOS TO TOS-1
;* ;*
ADD LDA ESTKL,X ADD LDA ESTKL,X
@@ -1592,8 +1608,7 @@ BRFLS INX
LDA ESTKH-1,X LDA ESTKH-1,X
ORA ESTKL-1,X ORA ESTKL-1,X
BNE NOBRNCH BNE NOBRNCH
BRNCH STY IPY BRNCH LDA IPH
LDA IPH
STA TMPH STA TMPH
LDA IPL LDA IPL
+INC_IP +INC_IP
@@ -1606,8 +1621,9 @@ BRNCH STY IPY
STA IPH STA IPH
LDA TMPL LDA TMPL
STA IPL STA IPL
LDY IPY DEY
JMP FETCHOP DEY
JMP NEXTOP
BREQ INX BREQ INX
LDA ESTKL-1,X LDA ESTKL-1,X
CMP ESTKL,X CMP ESTKL,X
@@ -1646,7 +1662,7 @@ IBRNCH LDA IPL
ADC ESTKH,X ADC ESTKH,X
STA IPH STA IPH
INX INX
JMP FETCHOP JMP NEXTOP
; ;
BRTRUX INX BRTRUX INX
LDA ESTKH-1,X LDA ESTKH-1,X
@@ -1659,8 +1675,7 @@ BRFLSX INX
LDA ESTKH-1,X LDA ESTKH-1,X
ORA ESTKL-1,X ORA ESTKL-1,X
BNE NOBRNCHX BNE NOBRNCHX
BRNCHX STY IPY BRNCHX LDA IPH
LDA IPH
STA TMPH STA TMPH
LDA IPL LDA IPL
+INC_IP +INC_IP
@@ -1673,8 +1688,9 @@ BRNCHX STY IPY
STA IPH STA IPH
LDA TMPL LDA TMPL
STA IPL STA IPL
LDY IPY DEY
JMP FETCHOPX DEY
JMP NEXTOPX
BREQX INX BREQX INX
LDA ESTKL-1,X LDA ESTKL-1,X
CMP ESTKL,X CMP ESTKL,X
@@ -1713,29 +1729,31 @@ IBRNCHX LDA IPL
ADC ESTKH,X ADC ESTKH,X
STA IPH STA IPH
INX INX
JMP FETCHOPX JMP NEXTOPX
;* ;*
;* CALL INTO ABSOLUTE ADDRESS (NATIVE CODE) ;* CALL INTO ABSOLUTE ADDRESS (NATIVE CODE)
;* ;*
CALL +INC_IP CALL +INC_IP
LDA (IP),Y LDA (IP),Y
STA CALLADR+1 STA TMPL
+INC_IP +INC_IP
LDA (IP),Y LDA (IP),Y
STA CALLADR+2 STA TMPH
LDA IPH LDA IPH
PHA PHA
LDA IPL LDA IPL
PHA PHA
TYA TYA
PHA PHA
JSR CALL3 JSR JMPTMP
PLA PLA
TAY TAY
PLA PLA
STA IPL STA IPL
PLA PLA
STA IPH STA IPH
STA LCRWEN+LCBNK2 ; WRITE ENABLE LANGUAGE CARD
STA LCRWEN+LCBNK2
JMP NEXTOP JMP NEXTOP
; ;
CALLX +INC_IP CALLX +INC_IP
@@ -1744,9 +1762,9 @@ CALLX +INC_IP
+INC_IP +INC_IP
LDA (IP),Y LDA (IP),Y
STA ALTRDOFF STA ALTRDOFF
STA CALLADR+2 STA TMPH
PLA PLA
STA CALLADR+1 STA TMPL
LDA IPH LDA IPH
PHA PHA
LDA IPL LDA IPL
@@ -1754,13 +1772,15 @@ CALLX +INC_IP
TYA TYA
PHA PHA
CLI CLI
JSR CALL3 JSR JMPTMP
PLA PLA
TAY TAY
PLA PLA
STA IPL STA IPL
PLA PLA
STA IPH STA IPH
STA LCRWEN+LCBNK2 ; WRITE ENABLE LANGUAGE CARD
STA LCRWEN+LCBNK2
JMP NEXTOPX JMP NEXTOPX
;* ;*
;* INDIRECT CALL TO ADDRESS (NATIVE CODE) ;* INDIRECT CALL TO ADDRESS (NATIVE CODE)
@@ -1778,18 +1798,22 @@ ICAL LDA ESTKL,X
PHA PHA
LDY #$00 LDY #$00
LDA (TMP),Y LDA (TMP),Y
STA CALLADR+1 PHA
INY INY
LDA (TMP),Y LDA (TMP),Y
STA CALLADR+2 STA TMPH
PLA
STA TMPL
CLI CLI
JSR CALL3 JSR JMPTMP
PLA PLA
TAY TAY
PLA PLA
STA IPL STA IPL
PLA PLA
STA IPH STA IPH
STA LCRWEN+LCBNK2 ; WRITE ENABLE LANGUAGE CARD
STA LCRWEN+LCBNK2
JMP NEXTOP JMP NEXTOP
; ;
ICALX LDA ESTKL,X ICALX LDA ESTKL,X
@@ -1806,18 +1830,22 @@ ICALX LDA ESTKL,X
STA ALTRDOFF STA ALTRDOFF
LDY #$00 LDY #$00
LDA (TMP),Y LDA (TMP),Y
STA CALLADR+1 PHA
INY INY
LDA (TMP),Y LDA (TMP),Y
STA CALLADR+2 STA TMPH
PLA
STA TMPL
CLI CLI
JSR CALL3 JSR JMPTMP
PLA PLA
TAY TAY
PLA PLA
STA IPL STA IPL
PLA PLA
STA IPH STA IPH
STA LCRWEN+LCBNK2 ; WRITE ENABLE LANGUAGE CARD
STA LCRWEN+LCBNK2
JMP NEXTOPX JMP NEXTOPX
;* ;*
;* ENTER FUNCTION WITH FRAME SIZE AND PARAM COUNT ;* ENTER FUNCTION WITH FRAME SIZE AND PARAM COUNT