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
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)

View File

@ -39,11 +39,20 @@ 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)
;
@ -112,6 +121,7 @@ asm cout
ORA #$80
BIT ROMEN
JSR $FDED
BIT LCRDEN+LCBNK2
RTS
end
;
@ -127,6 +137,7 @@ asm cin
STA ESTKL,X
LDY #$00
STY ESTKH,X
BIT LCRDEN+LCBNK2
RTS
end
;
@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -18,7 +18,7 @@ int show_state = 0;
#define BYTE_PTR(bp) ((byte)((bp)[0]))
#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;

View File

@ -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