From 23ac5a36f0f00fab48f773031c490edc2ff6be27 Mon Sep 17 00:00:00 2001 From: David Schmenk Date: Wed, 7 May 2014 14:25:19 -0700 Subject: [PATCH] Fix many VM issues, especially 6502 version. Now boots! --- PLASMA/src/cmd.pla | 46 ++++++++++------ PLASMA/src/cmdexec.pla | 75 +++++++++++++------------- PLASMA/src/codegen.c | 10 +--- PLASMA/src/parse.c | 1 + PLASMA/src/plvm.c | 13 ++--- PLASMA/src/plvm02.s | 120 +++++++++++++++++++++++++---------------- 6 files changed, 153 insertions(+), 112 deletions(-) diff --git a/PLASMA/src/cmd.pla b/PLASMA/src/cmd.pla index d4984e58..2ddf67f4 100644 --- a/PLASMA/src/cmd.pla +++ b/PLASMA/src/cmd.pla @@ -41,8 +41,12 @@ SRCH = SRC+1 DST = SRC+2 DSTL = DST DSTH = DST+1 -ESP = DST+2 +;* +;* ASM VARIABLES +;* +ESP !BYTE 0 end +; ; CALL PRODOS ; SYSCALL(CMD, PARAMS) ; @@ -68,12 +72,26 @@ end ; CALL LOADED SYSTEM PROGRAM ; asm exec - LDX #$FE + LDA #$00 + STA IFPL + LDA #$BF + STA IFPH + LDX #$FF TXS - LDX ESTKSZ/2 + LDX #ESTKSZ/2 + BIT ROMEN JMP $2000 end ; +; EXIT +; +asm reboot + BIT ROMEN + LDA #$00 + STA $3F4 ; INVALIDATE POWER-UP BYTE + JMP ($FFFC) ; RESET +end +; ; SET MEMORY TO 0 ; MEMCLR(ADDR, SIZE) ; @@ -181,6 +199,7 @@ asm cout ORA #$80 BIT ROMEN JSR $FDED + BIT LCRDEN+LCBNK2 RTS end ; @@ -196,6 +215,7 @@ asm cin STA ESTKL,X LDY #$00 STY ESTKH,X + BIT LCRDEN+LCBNK2 RTS end ; @@ -219,7 +239,8 @@ asm prstr TYA CMP ESTKL,X BNE - -+ RTS ++ BIT LCRDEN+LCBNK2 + RTS end ; ; PRINT BYTE @@ -230,6 +251,7 @@ asm prbyte BIT ROMEN JSR $FDDA LDX ESP + BIT LCRDEN+LCBNK2 RTS end ; @@ -253,6 +275,7 @@ asm rdstr STA ESTKL,X LDA #$01 STA ESTKH,X + BIT LCRDEN+LCBNK2 RTS end asm toupper @@ -266,15 +289,6 @@ asm toupper STA ESTKL,X + RTS end -; -; EXIT -; -asm reboot - BIT ROMEN - LDA #$00 - STA $3F4 ; INVALIDATE POWER-UP BYTE - JMP ($FFFC) ; RESET -end def crout cout($0D) end @@ -303,9 +317,9 @@ def online params.0 = 2 params.1 = 0 - params:2 = $2000 + params:2 = databuff perr = prodos($C5, @params) - return $2000 + return databuff end def open(path, buff) byte params[6] @@ -492,7 +506,7 @@ end resetmemfiles() prstr(@version) -crout(); +crout() while 1 prstr(getpfx(@prefix)) cmdptr = rdstr($BA) diff --git a/PLASMA/src/cmdexec.pla b/PLASMA/src/cmdexec.pla index 600ceeb1..797ad432 100644 --- a/PLASMA/src/cmdexec.pla +++ b/PLASMA/src/cmdexec.pla @@ -25,7 +25,7 @@ CMD: !BYTE 00 PARAMS: !WORD 0000 LDX ESP STA ESTKL,X - LDY #$00 + LDY #$00 STY ESTKH,X RTS end @@ -39,24 +39,33 @@ asm exec STA IFPH LDX #$FE TXS - LDX ESTKSZ/2 + LDX #ESTKSZ/2 BIT ROMEN JMP $2000 end ; +; EXIT +; +asm reboot + BIT ROMEN + LDA #$00 + STA $3F4 ; INVALIDATE POWER-UP BYTE + JMP ($FFFC) ; RESET +end +; ; SET MEMORY TO 0 ; MEMCLR(ADDR, SIZE) ; asm memclr LDY #$00 - LDA ESTKL+1,X - STA DSTL - LDA ESTKH+1,X - STA DSTH + LDA ESTKL+1,X + STA DSTL + LDA ESTKH+1,X + STA DSTH INC ESTKL,X - INC ESTKH,X + INC ESTKH,X TYA -SETMLP DEC ESTKL,X +SETMLP DEC ESTKL,X BNE + DEC ESTKH,X BEQ ++ @@ -75,18 +84,18 @@ end asm memcpy LDY #$00 LDA ESTKL,X - BNE + + BNE + LDA ESTKH,X BEQ MEMEXIT + LDA ESTKL+2,X - STA DSTL + STA DSTL LDA ESTKH+2,X - STA DSTH + STA DSTH LDA ESTKL+1,X - STA SRCL + STA SRCL LDA ESTKH+1,X - STA SRCH - INC ESTKH,X + STA SRCH + INC ESTKH,X CPYLP LDA (SRC),Y STA (DST),Y INC DSTL @@ -95,7 +104,7 @@ CPYLP LDA (SRC),Y + INC SRCL BNE + INC SRCH -+ DEC ESTKL,X ++ DEC ESTKL,X BNE CPYLP DEC ESTKH,X BNE CPYLP @@ -109,9 +118,10 @@ end ; asm cout LDA ESTKL,X - ORA #$80 + ORA #$80 BIT ROMEN JSR $FDED + BIT LCRDEN+LCBNK2 RTS end ; @@ -121,12 +131,13 @@ end asm cin BIT ROMEN STX ESP - JSR $FD0C + JSR $FD0C LDX ESP DEX - STA ESTKL,X + STA ESTKL,X LDY #$00 - STY ESTKH,X + STY ESTKH,X + BIT LCRDEN+LCBNK2 RTS end ; @@ -135,14 +146,14 @@ end ; asm prstr LDY #$00 - LDA ESTKL,X - STA SRCL - LDA ESTKH,X - STA SRCH + LDA ESTKL,X + STA SRCL + LDA ESTKH,X + STA SRCH BIT ROMEN - LDA (SRC),Y - STA ESTKL,X - BEQ + + LDA (SRC),Y + STA ESTKL,X + BEQ + - INY LDA (SRC),Y ORA #$80 @@ -150,16 +161,8 @@ asm prstr TYA CMP ESTKL,X BNE - -+ RTS -end -; -; EXIT -; -asm reboot - BIT ROMEN - LDA #$00 - STA $3F4 ; INVALIDATE POWER-UP BYTE - JMP ($FFFC) ; RESET ++ BIT LCRDEN+LCBNK2 + RTS end def crout cout($0D) diff --git a/PLASMA/src/codegen.c b/PLASMA/src/codegen.c index f6f67766..a6986655 100755 --- a/PLASMA/src/codegen.c +++ b/PLASMA/src/codegen.c @@ -311,9 +311,7 @@ void emit_header(void) } else { - printf("\tJSR\t$3D0\n"); - printf("\t%s\t$00\t\t\t; MODULE INITIALIZATION ROUTINE\n", DB); - printf("\t%s\t_INIT\t\t\t;\n", DW); + printf("\tJMP\t_INIT\t\t\t; MODULE INITIALIZATION ROUTINE\n"); } } void emit_rld(void) @@ -493,13 +491,9 @@ void emit_def(char *name, int is_bytecode) { if (!(outflags & MODULE)) { - printf("%s%c\n", name, LBL); + //printf("%s%c\n", name, LBL); if (is_bytecode) - { printf("\tJSR $03D0\n"); - printf("\t%s\t$00\n", DB); - printf("\t%s\t*+2\n", DW); - } } } void emit_codetag(int tag) diff --git a/PLASMA/src/parse.c b/PLASMA/src/parse.c index a5eafe79..7dd1a621 100755 --- a/PLASMA/src/parse.c +++ b/PLASMA/src/parse.c @@ -1301,6 +1301,7 @@ int parse_module(void) if (scantoken != DONE_TOKEN && scantoken != EOF_TOKEN) { emit_start(); + emit_def("_INIT", 1); prevstmnt = 0; while (parse_stmnt()) next_line(); if (scantoken != DONE_TOKEN) diff --git a/PLASMA/src/plvm.c b/PLASMA/src/plvm.c index cf90cef8..2163f960 100755 --- a/PLASMA/src/plvm.c +++ b/PLASMA/src/plvm.c @@ -16,9 +16,9 @@ int show_state = 0; * Bytecode memory */ #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 TO_UWORD(w) ((w)&0xFFFF) +#define TO_UWORD(w) ((uword)((w))) #define MOD_ADDR 0x1000 #define DEF_CALL 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 PUSH(v) (*(--esp))=(v) -#define POP (*(esp++)) -#define UPOP ((uword)(*(esp++)&0xFFFF)) +#define POP ((word)(*(esp++))) +#define UPOP ((uword)(*(esp++))) #define TOS (esp[0]) word eval_stack[EVAL_STACKSZ]; word *esp = eval_stack + EVAL_STACKSZ; @@ -649,7 +649,7 @@ void interp(code *ip) * 0x30-0x3F */ case 0x30: // DROP : TOS = - esp++;; + POP; break; case 0x32: // DUP : TOS = TOS val = TOS; @@ -661,7 +661,8 @@ void interp(code *ip) mem_data[sp--] = val; break; 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; case 0x38: // BRGT : TOS-1 > TOS ? IP += (IP) val = POP; diff --git a/PLASMA/src/plvm02.s b/PLASMA/src/plvm02.s index c7ddac05..d0290ae1 100644 --- a/PLASMA/src/plvm02.s +++ b/PLASMA/src/plvm02.s @@ -110,6 +110,17 @@ ESP = DST+2 CMP #$E0 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 ;* JSR PRODOS ; OPEN AUTORUN @@ -133,18 +144,11 @@ ESP = DST+2 JMP NOAUTO + LDX READPARMS+6 STX $0280 -NOAUTO JSR PRODOS + JSR PRODOS !BYTE $CC !WORD CLOSEPARMS - LDY #$00 - STY SRCL - LDA #$D1 - STA SRCH -- LDA (SRC),Y ; LOAD FIRST PAGE OF CMD INTO PLACE - STA $1000,Y - INY - BNE - - JMP CMDEXEC ; CALL CMD + JMP CMDEXEC ; CALL CM +NOAUTO JMP BYE AUTORUN !BYTE 7 !TEXT "AUTORUN" OPENPARMS !BYTE 3 @@ -167,12 +171,10 @@ PAGE3 = * ;* ;* PAGE 3 VECTORS INTO INTERPRETER ;* - BIT LCRDEN+LCBNK2 ; $03D0 - INTERP ENTRY + BIT LCRDEN+LCBNK2 ; $03D0 - DIRECT INTERP ENTRY JMP INTERP -CALL3 BIT ROMEN -CALLADR JSR $0000 - BIT LCRDEN+LCBNK2 - RTS + BIT LCRDEN+LCBNK2 ; $03D6 - INDIRECT INTERP ENTRY + JMP INTERPX } VMCORE = * !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 !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 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 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 @@ -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 !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 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 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 @@ -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' ;* - LDY DEFCMD +BYE LDY DEFCMD STY $0280 ; SET DEFAULT COMMAND WHEN CALLED FROM 'BYE' - LDA DEFCMD,Y STA $0280,Y DEY BNE - - LDX #$FE ; LEAVE ROOM FOR COMMAND LINE LENGTH BYTE - TXS ;* ;* MOVE REST OF CMD FROM LANGUAGE CARD ;* @@ -256,13 +256,25 @@ START LDA #$00 STA IFPL LDA #$BF STA IFPH - LDX ESTKSZ/2 + LDX #$FF + TXS + LDX #ESTKSZ/2 !SOURCE "cmdexec.a" } ;* ;* 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 PLA STA TMPH @@ -287,7 +299,7 @@ DROP INX NEXTOP INY BEQ NEXTOPH FETCHOP LDA (IP),Y - STA *+5 + STA *+4 JMP (OPTBL) ;* ;* INTERP BYTECODE IN AUX MEM @@ -302,9 +314,13 @@ FETCHOPX SEI STA ALTRDON LDA (IP),Y ORA #$80 ; SELECT OPX OPCODES - STA *+5 + STA *+4 JMP (OPXTBL) ;* +;* INDIRECT JUMP TO (TMP) +;* +JMPTMP JMP (TMP) +;* ;* ADD TOS TO TOS-1 ;* ADD LDA ESTKL,X @@ -1592,8 +1608,7 @@ BRFLS INX LDA ESTKH-1,X ORA ESTKL-1,X BNE NOBRNCH -BRNCH STY IPY - LDA IPH +BRNCH LDA IPH STA TMPH LDA IPL +INC_IP @@ -1606,8 +1621,9 @@ BRNCH STY IPY STA IPH LDA TMPL STA IPL - LDY IPY - JMP FETCHOP + DEY + DEY + JMP NEXTOP BREQ INX LDA ESTKL-1,X CMP ESTKL,X @@ -1646,7 +1662,7 @@ IBRNCH LDA IPL ADC ESTKH,X STA IPH INX - JMP FETCHOP + JMP NEXTOP ; BRTRUX INX LDA ESTKH-1,X @@ -1659,8 +1675,7 @@ BRFLSX INX LDA ESTKH-1,X ORA ESTKL-1,X BNE NOBRNCHX -BRNCHX STY IPY - LDA IPH +BRNCHX LDA IPH STA TMPH LDA IPL +INC_IP @@ -1673,8 +1688,9 @@ BRNCHX STY IPY STA IPH LDA TMPL STA IPL - LDY IPY - JMP FETCHOPX + DEY + DEY + JMP NEXTOPX BREQX INX LDA ESTKL-1,X CMP ESTKL,X @@ -1713,29 +1729,31 @@ IBRNCHX LDA IPL ADC ESTKH,X STA IPH INX - JMP FETCHOPX + JMP NEXTOPX ;* ;* CALL INTO ABSOLUTE ADDRESS (NATIVE CODE) ;* CALL +INC_IP LDA (IP),Y - STA CALLADR+1 + STA TMPL +INC_IP LDA (IP),Y - STA CALLADR+2 + STA TMPH LDA IPH PHA LDA IPL PHA TYA PHA - JSR CALL3 + JSR JMPTMP PLA TAY PLA STA IPL PLA STA IPH + STA LCRWEN+LCBNK2 ; WRITE ENABLE LANGUAGE CARD + STA LCRWEN+LCBNK2 JMP NEXTOP ; CALLX +INC_IP @@ -1744,9 +1762,9 @@ CALLX +INC_IP +INC_IP LDA (IP),Y STA ALTRDOFF - STA CALLADR+2 + STA TMPH PLA - STA CALLADR+1 + STA TMPL LDA IPH PHA LDA IPL @@ -1754,13 +1772,15 @@ CALLX +INC_IP TYA PHA CLI - JSR CALL3 + JSR JMPTMP PLA TAY PLA STA IPL PLA STA IPH + STA LCRWEN+LCBNK2 ; WRITE ENABLE LANGUAGE CARD + STA LCRWEN+LCBNK2 JMP NEXTOPX ;* ;* INDIRECT CALL TO ADDRESS (NATIVE CODE) @@ -1778,18 +1798,22 @@ ICAL LDA ESTKL,X PHA LDY #$00 LDA (TMP),Y - STA CALLADR+1 + PHA INY LDA (TMP),Y - STA CALLADR+2 + STA TMPH + PLA + STA TMPL CLI - JSR CALL3 + JSR JMPTMP PLA TAY PLA STA IPL PLA STA IPH + STA LCRWEN+LCBNK2 ; WRITE ENABLE LANGUAGE CARD + STA LCRWEN+LCBNK2 JMP NEXTOP ; ICALX LDA ESTKL,X @@ -1806,18 +1830,22 @@ ICALX LDA ESTKL,X STA ALTRDOFF LDY #$00 LDA (TMP),Y - STA CALLADR+1 + PHA INY LDA (TMP),Y - STA CALLADR+2 + STA TMPH + PLA + STA TMPL CLI - JSR CALL3 + JSR JMPTMP PLA TAY PLA STA IPL PLA STA IPH + STA LCRWEN+LCBNK2 ; WRITE ENABLE LANGUAGE CARD + STA LCRWEN+LCBNK2 JMP NEXTOPX ;* ;* ENTER FUNCTION WITH FRAME SIZE AND PARAM COUNT