1
0
mirror of https://github.com/dschmenk/PLASMA.git synced 2024-07-05 04:28:57 +00:00

Add in-line strings

This commit is contained in:
dschmenk 2015-02-26 13:02:53 -08:00
parent 752f6c7bdb
commit 3f48559d56
13 changed files with 249 additions and 92 deletions

View File

@ -479,6 +479,8 @@ def etherServiceIP
// What kind of IP protocol is it?
//
when iphdr->ip_proto
is IP_PROTO_TCP
break
is IP_PROTO_UDP
port = @portsUDP
if port
@ -492,8 +494,6 @@ def etherServiceIP
next
fin
break
is IP_PROTO_TCP
break
is IP_PROTO_ICMP
//
// Service ICMP packets

View File

@ -407,15 +407,15 @@ def pokeregs(reg, buf, len)
end
def peekregs(reg, buf, len)
// There is an issue missing data on back-to-back reads
// _pokeiow(reg)
// return peekdata(buf, len)
word i
_pokeiow(reg)
return peekdata(buf, len)
// word i
len = len - 1
for i = 0 to len
_pokeiow(reg + i)
buf->[i] = _peekio()
next
// len = len - 1
// for i = 0 to len
// _pokeiow(reg + i)
// buf->[i] = _peekio()
// next
end
def pokeregw(reg, dataw)
_pokeiow(reg)

View File

@ -114,4 +114,5 @@ putln
puti(mystruc)
putln
puts(@constr); puti(constval); putln
puts("Hello from in-line string!\n")
done

View File

@ -541,6 +541,11 @@ void emit_const(int cval)
else
printf("\t%s\t$2C,$%02X,$%02X\t\t; CW\t%d\n", DB, cval&0xFF,(cval>>8)&0xFF, cval);
}
void emit_conststr(long conststr, int strsize)
{
printf("\t%s\t$2E\t\t\t; CS\n", DB);
emit_data(0, STRING_TYPE, conststr, strsize);
}
void emit_lb(void)
{
printf("\t%s\t$60\t\t\t; LB\n", DB);

View File

@ -16,6 +16,7 @@ void emit_def(char *name, int is_bytecode);
int emit_data(int vartype, int consttype, long constval, int constsize);
void emit_codetag(int tag);
void emit_const(int cval);
void emit_conststr(long conststr, int strsize);
void emit_lb(void);
void emit_lw(void);
void emit_llb(int index);

View File

@ -450,6 +450,15 @@ int parse_value(int rvalue)
// type |= WORD_TYPE;
emit_value = 1;
}
else if (scantoken == STRING_TOKEN)
{
/*
* This is a special case. Just emit the string and return
*/
emit_conststr(constval, tokenlen - 1);
scan();
return WORD_TYPE;
}
else
return (0);
if (type & CONST_TYPE)

View File

@ -2126,6 +2126,10 @@ def emit_const(cval)
emit_word(cval)
fin
end
def emit_constr(str, size)
emit_op($2E)
return emit_data(0, STR_TYPE, str, size)
end
def emit_lb
return emit_op($60)
end
@ -3151,6 +3155,14 @@ def parse_value(rvalue)
// type = type | WORD_TYPE
emit_val = TRUE
break
is STR_TKN
//
// Special case
//
emit_constr(constval, tknlen - 1)
scan
return WORD_TYPE
break
otherwise
return 0
wend

View File

@ -34,8 +34,10 @@ LCBNK1 = $08
; INIT VM ENVIRONMENT STACK POINTERS
;
LDA #$00 ; INIT FRAME POINTER
STA PPL
STA IFPL
LDA #$BF
STA PPH
STA IFPH
LDX #$FE ; INIT STACK POINTER (YES, $FE. SEE GETS)
TXS

View File

@ -508,7 +508,7 @@ void call(uword pc)
*
OPTBL: DW ZERO,ADD,SUB,MUL,DIV,MOD,INCR,DECR ; 00 02 04 06 08 0A 0C 0E
DW NEG,COMP,AND,IOR,XOR,SHL,SHR,IDXW ; 10 12 14 16 18 1A 1C 1E
DW NOT,LOR,LAND,LA,LLA,CB,CW,SWAP ; 20 22 24 26 28 2A 2C 2E
DW NOT,LOR,LAND,LA,LLA,CB,CW,CS ; 20 22 24 26 28 2A 2C 2E
DW DROP,DUP,PUSH,PULL,BRGT,BRLT,BREQ,BRNE ; 30 32 34 36 38 3A 3C 3E
DW ISEQ,ISNE,ISGT,ISLT,ISGE,ISLE,BRFLS,BRTRU ; 40 42 44 46 48 4A 4C 4E
DW BRNCH,IBRNCH,CALL,ICAL,ENTER,LEAVE,RET,??? ; 50 52 54 56 58 5A 5C 5E
@ -639,11 +639,9 @@ void interp(code *ip)
PUSH(WORD_PTR(ip));
ip += 2;
break;
case 0x2E: // SWAP : TOS = TOS-1, TOS-1 = TOS
val = POP;
ea = POP;
PUSH(val);
PUSH(ea);
case 0x2E: // CS: TOS = CONSTANTSTRING (IP)
PUSH(ip - mem_data);
ip += BYTE_PTR(ip) + 1;
break;
/*
* 0x30-0x3F

View File

@ -111,7 +111,7 @@ COMP LDA #$FF
!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
!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,CS ; 20 22 24 26 28 2A 2C 2E
!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
@ -360,20 +360,6 @@ LOR LDA ESTKL,X
LOR1 INX
JMP NEXTOP
;*
;* SWAP TOS WITH TOS-1
;*
SWAP STY IPY
LDA ESTKL,X
LDY ESTKL+1,X
STA ESTKL+1,X
STY ESTKL,X
LDA ESTKH,X
LDY ESTKH+1,X
STA ESTKH+1,X
STY ESTKH,X
LDY IPY
JMP NEXTOP
;*
;* DUPLICATE TOS
;*
DUP DEX
@ -428,6 +414,24 @@ CW DEX
STA ESTKH,X
JMP NEXTOP
;*
;* 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
;*
;* LOAD VALUE FROM ADDRESS TAG
;*
LB LDA ESTKL,X

View File

@ -172,7 +172,7 @@ VMCORE = *
!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
!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,CS ; 20 22 24 26 28 2A 2C 2E
!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
@ -188,6 +188,14 @@ DINTRP PLA
PLA
ADC #$00
STA IPH
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
LDA #>OPTBL
STA OPPAGE
@ -203,6 +211,14 @@ IINTRP PLA
LDA (TMP),Y
STA IPL
DEY
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
LDA #>OPTBL
STA OPPAGE
JMP FETCHOP
@ -217,6 +233,14 @@ IINTRPX PLA
LDA (TMP),Y
STA IPL
DEY
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
LDA #>OPXTBL
STA OPPAGE
SEI
@ -292,8 +316,10 @@ CMDENTRY = *
; INIT VM ENVIRONMENT STACK POINTERS
;
; LDA #$00 ; INIT FRAME POINTER
STA PPL
STA IFPL
LDA #$BF
STA PPH
STA IFPH
LDX #$FE ; INIT STACK POINTER (YES, $FE. SEE GETS)
TXS
@ -364,7 +390,7 @@ LCDEFCMD = *-28 ; DEFCMD IN LC MEMORY
!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,SWAP ; 20 22 24 26 28 2A 2C 2E
!WORD LNOT,LOR,LAND,LA,LLA,CB,CW,CSX ; 20 22 24 26 28 2A 2C 2E
!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,CALLX,ICALX,ENTERX,LEAVEX,RETX,NEXTOP; 50 52 54 56 58 5A 5C 5E
@ -668,20 +694,6 @@ LOR LDA ESTKL,X
LOR1 INX
JMP NEXTOP
;*
;* SWAP TOS WITH TOS-1
;*
SWAP STY IPY
LDA ESTKL,X
LDY ESTKL+1,X
STA ESTKL+1,X
STY ESTKL,X
LDA ESTKH,X
LDY ESTKH+1,X
STA ESTKH+1,X
STY ESTKH,X
LDY IPY
JMP NEXTOP
;*
;* DUPLICATE TOS
;*
DUP DEX
@ -736,6 +748,55 @@ CW DEX
STA ESTKH,X
JMP NEXTOP
;*
;* 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 (IP),Y
TAY ; MAKE ROOM IN POOL AND SAVE ADDR ON ESTK
EOR #$FF
SEC
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
- LDA (IP),Y ; ALTRD IS ON, NO NEED TO CHANGE IT HERE
STA (PP),Y ; ALTWR IS OFF, NO NEED TO CHANGE IT HERE
DEY
CPY #$FF
BNE -
INY
LDA (IP),Y ; SKIP TO NEXT OP ADDR AFTER STRING
TAY
JMP NEXTOP
;*
;* LOAD VALUE FROM ADDRESS TAG
;*
LB LDA ESTKL,X
@ -1455,13 +1516,16 @@ JMPTMP JMP (TMP)
ENTER INY
LDA (IP),Y
PHA ; SAVE ON STACK FOR LEAVE
EOR #$FF
EOR #$FF ; ALLOCATE FRAME
SEC
ADC IFPL
ADC PPL
STA PPL
STA IFPL
BCS +
DEC IFPH
+ INY
LDA #$FF
ADC PPH
STA PPH
STA IFPH
INY
LDA (IP),Y
ASL
TAY
@ -1480,13 +1544,16 @@ ENTER INY
ENTERX INY
LDA (IP),Y
PHA ; SAVE ON STACK FOR LEAVEX
EOR #$FF
EOR #$FF ; ALLOCATE FRAME
SEC
ADC IFPL
ADC PPL
STA PPL
STA IFPL
BCS +
DEC IFPH
+ INY
LDA #$FF
ADC PPH
STA PPH
STA IFPH
INY
LDA (IP),Y
STA ALTRDOFF
ASL
@ -1506,25 +1573,31 @@ ENTERX INY
;*
;* LEAVE FUNCTION
;*
LEAVE PLA
CLC
ADC IFPL
STA IFPL
BCS LIFPH
RTS
LIFPH INC IFPH
RET RTS
;
LEAVEX STA ALTRDOFF
CLI
PLA
LEAVE PLA ; DEALLOCATE POOL + FRAME
CLC
ADC IFPL
STA PPL
LDA #$00
ADC IFPH
STA PPH
PLA ; RESTORE PREVIOUS FRAME
STA IFPL
BCS LIFPH
PLA
STA IFPH
RTS
;
RETX STA ALTRDOFF
CLI
RET LDA IFPL ; DEALLOCATE POOL
STA PPL
LDA IFPH
STA PPH
PLA ; RESTORE PREVIOUS FRAME
STA IFPL
PLA
STA IFPH
RTS
VMEND = *
}

View File

@ -16,6 +16,7 @@ MEMBANK = $FFEF
XPAGE = $1600
DROPX = XPAGE+DROP
IFPX = XPAGE+IFPH
PPX = XPAGE+PPH
IPX = XPAGE+IPH
TMPX = XPAGE+TMPH
SRCX = XPAGE+SRCH
@ -60,10 +61,13 @@ DSTX = XPAGE+DSTH
STA TMPX ; CLEAR ALL EXTENDED POINTERS
STA SRCX
STA DSTX
STA IFPX ; INIT FRAME POINTER
STA PPX ; INIT FRAME & POOL POINTERS
STA IFPX
LDA #<SEGSTART
STA PPL
STA IFPL
LDA #>SEGSTART
STA PPH
STA IFPH
LDX #ESTKSZ/2 ; INIT EVAL STACK INDEX
JMP SOSCMD
@ -115,6 +119,14 @@ INTERP PLA
PLA
ADC #$00
STA IPH
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
STY IPX
JMP FETCHOP
@ -135,6 +147,14 @@ XINTERP PLA
LDA (TMP),Y
STA IPL
DEY
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
JMP FETCHOP
;*
;* INTERNAL DIVIDE ALGORITHM
@ -196,7 +216,7 @@ _DIVEX INX
!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
!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,CS ; 20 22 24 26 28 2A 2C 2E
!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
@ -447,20 +467,6 @@ LOR LDA ESTKL,X
LOR1 INX
JMP NEXTOP
;*
;* SWAP TOS WITH TOS-1
;*
SWAP STY IPY
LDA ESTKL,X
LDY ESTKL+1,X
STA ESTKL+1,X
STY ESTKL,X
LDA ESTKH,X
LDY ESTKH+1,X
STA ESTKH+1,X
STY ESTKH,X
LDY IPY
JMP NEXTOP
;*
;* DUPLICATE TOS
;*
DUP DEX
@ -515,6 +521,39 @@ CW DEX
STA ESTKH,X
JMP NEXTOP
;*
;* CONSTANT STRING
;*
CS DEX
+INC_IP
TYA ; NORMALIZE IP
CLC
ADC IPL
STA IPL
LDA #$00
TAY
ADC IPH
STA IPH
LDA (IP),Y
TAY ; MAKE ROOM IN POOL AND SAVE ADDR ON ESTK
EOR #$FF
SEC
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
- LDA (IP),Y ; ALTRD IS ON, NO NEED TO CHANGE IT HERE
STA (PP),Y ; ALTWR IS OFF, NO NEED TO CHANGE IT HERE
DEY
CPY #$FF
BNE -
INY
LDA (IP),Y ; SKIP TO NEXT OP ADDR AFTER STRING
TAY
JMP NEXTOP
;*
;* LOAD VALUE FROM ADDRESS TAG
;*
LB LDA ESTKL,X
@ -971,11 +1010,25 @@ ENTER INY
LEAVE PLA
CLC
ADC IFPL
STA PPL
LDA #$00
ADC IFPH
STA PPH
PLA ; RESTORE PREVIOUS FRAME
STA IFPL
BCS LIFPH
PLA
STA IFPH
RTS
;
RET LDA IFPL ; DEALLOCATE POOL
STA PPL
LDA IFPH
STA PPH
PLA ; RESTORE PREVIOUS FRAME
STA IFPL
PLA
STA IFPH
RTS
LIFPH INC IFPH
RET RTS
SOSCMD = *
!SOURCE "vmsrc/soscmd.a"
SEGEND = *

View File

@ -17,11 +17,10 @@ VMZP = ESTK+ESTKSZ
IFP = VMZP
IFPL = IFP
IFPH = IFP+1
;IP = IFP+2 ; MOVED TO OVERLAY NEXTOP
;IPL = IP
;IPH = IP+1
;IPY = IP+2
IPY = IFP+2
PP = IFP+2
PPL = PP
PPH = PP+1
IPY = PP+2
TMP = IPY+1
TMPL = TMP
TMPH = TMP+1