1
0
mirror of https://github.com/dschmenk/PLASMA.git synced 2025-02-13 15:31:09 +00:00

JIT tuning parameters

This commit is contained in:
Dave Schmenk 2018-03-21 22:31:06 -07:00
parent 8c18a28e49
commit 81574a8a62
4 changed files with 164 additions and 109 deletions

View File

@ -35,7 +35,7 @@ def compiler(defptr)#0
word codeptr, addrxlate, bytecode, i, case, dest
byte j
puts("JIT compiler invoked!\n")
//puts("JIT compiler invoked!\n")
addrxlate = heapalloc(512 + defptr->bytecodesize) // 256 * sizeof(word) address xlate
if not addrxlate
@ -54,9 +54,9 @@ def compiler(defptr)#0
*$003E = *$003C + defptr->bytecodesize
*$0042 = bytecode
call($C311, 0, 0, 0, $00) // CALL XMOVE with carry clear (AUX->MAIN)
^$C053 // MIX TEXT
puts("Addr Xlate: $"); puth(addrxlate); putln
puts("Bytecode: $"); puth(bytecode); putln
//^$C053 // MIX TEXT
////puts("Addr Xlate: $"); puth(addrxlate); putln
////puts("Bytecode: $"); puth(bytecode); putln
//
// Compile the bytecodes
//
@ -79,11 +79,11 @@ def compiler(defptr)#0
fin
addrxlate=>[i] = codeptr
//putc('$'); puth(codeptr); putc(':')
//putc('['); puti(i); puts("] ")
//putc('['); puti(i); //puts("] ")
if ^(bytecode+i) < $20
// CN,CN,CN,CN,CN,CN,CN,CN ; 00 02 04 06 08 0A 0C 0E
// CN,CN,CN,CN,CN,CN,CN,CN ; 10 12 14 16 18 1A 1C 1E
puts("CN $"); putb(^(bytecode+i)/2)
//puts("CN $"); putb(^(bytecode+i)/2)
^codeptr = $CA; codeptr++ // DEX
^codeptr = $A9; codeptr++ // LDA #imm
^codeptr = ^(bytecode+i)/2; codeptr++
@ -97,7 +97,7 @@ def compiler(defptr)#0
when ^(bytecode+i)
// MINUS1,BREQ,BRNE,LA,LLA,CB,CW,CS ; 20 22 24 26 28 2A 2C 2E
is $20
puts("MINUS_ONE")
//puts("MINUS_ONE")
^codeptr = $CA; codeptr++ // DEX
^codeptr = $A9; codeptr++ // LDA #imm
^codeptr = $FF; codeptr++ // $FF
@ -110,7 +110,7 @@ def compiler(defptr)#0
i++
dest = i + *(bytecode+i)
i++
puts("BREQ "); puti(dest)
//puts("BREQ "); puti(dest)
^codeptr = $E8; codeptr++ // INX
^codeptr = $E8; codeptr++ // INX
^codeptr = $B5; codeptr++ // LDA zp,X
@ -136,7 +136,7 @@ def compiler(defptr)#0
i++
dest = i + *(bytecode+i)
i++
puts("BRNE "); puti(dest)
//puts("BRNE "); puti(dest)
^codeptr = $E8; codeptr++ // INX
^codeptr = $E8; codeptr++ // INX
^codeptr = $B5; codeptr++ // LDA zp,X
@ -160,7 +160,7 @@ def compiler(defptr)#0
break
is $26
i++
puts("LA $"); puth(*(bytecode+i))
//puts("LA $"); puth(*(bytecode+i))
^codeptr = $CA; codeptr++ // DEX
^codeptr = $A9; codeptr++ // LDA #imm
^codeptr = ^(bytecode+i); codeptr++
@ -174,7 +174,7 @@ def compiler(defptr)#0
break
is $28
i++
puts("LLA "); puti(^(bytecode+i))
//puts("LLA "); puti(^(bytecode+i))
^codeptr = $CA; codeptr++ // DEX
^codeptr = $A9; codeptr++ // LDA #imm
^codeptr = ^(bytecode+i); codeptr++
@ -192,7 +192,7 @@ def compiler(defptr)#0
break
is $2A
i++
puts("CB $"); putb(^(bytecode+i))
//puts("CB $"); putb(^(bytecode+i))
^codeptr = $CA; codeptr++ // DEX
^codeptr = $A9; codeptr++ // LDA #imm
^codeptr = ^(bytecode+i); codeptr++
@ -205,7 +205,7 @@ def compiler(defptr)#0
break
is $2C
i++
puts("CW $"); puth(*(bytecode+i))
//puts("CW $"); puth(*(bytecode+i))
^codeptr = $CA; codeptr++ // DEX
^codeptr = $A9; codeptr++ // LDA #imm
^codeptr = ^(bytecode+i); codeptr++
@ -221,7 +221,7 @@ def compiler(defptr)#0
i++
j = ^(bytecode+i)
dest = i + j + 1
puts("CS "); puts(bytecode+i); puts("-->"); puti(dest)
//puts("CS "); //puts(bytecode+i); //puts("-->"); puti(dest)
if isule(codeptr + 12 + j, codemax)
^codeptr = $CA; codeptr++ // DEX
^codeptr = $A9; codeptr++ // LDA #imm
@ -247,16 +247,16 @@ def compiler(defptr)#0
break
// DROP,DROP2,DUP,DIVMOD,ADDI,SUBI,ANDI,ORI ; 30 32 34 36 38 3A 3C 3E
is $30
puts("DROP")
//puts("DROP")
^codeptr = $E8; codeptr++ // INX
break
is $32
puts("DROP2")
//puts("DROP2")
^codeptr = $E8; codeptr++ // INX
^codeptr = $E8; codeptr++ // INX
break
is $34
puts("DUP")
//puts("DUP")
^codeptr = $CA; codeptr++ // DEX
^codeptr = $B5; codeptr++ // LDA zp,X
^codeptr = $D0+1; codeptr++ // ESTKL+1
@ -268,14 +268,14 @@ def compiler(defptr)#0
^codeptr = $C0; codeptr++ // ESTKH
break
is $36
puts("DIVMOD")
//puts("DIVMOD")
//
// Should never happen
//
break
is $38
i++
puts("ADDI $"); putb(^(bytecode+i))
//puts("ADDI $"); putb(^(bytecode+i))
^codeptr = $A9; codeptr++ // LDA #imm
^codeptr = ^(bytecode+i); codeptr++
^codeptr = $18; codeptr++ // CLC
@ -290,7 +290,7 @@ def compiler(defptr)#0
break
is $3A
i++
puts("SUBI $"); putb(^(bytecode+i))
//puts("SUBI $"); putb(^(bytecode+i))
^codeptr = $B5; codeptr++ // LDA zp,X
^codeptr = $D0; codeptr++ // ESTKL
^codeptr = $18; codeptr++ // SEC
@ -305,7 +305,7 @@ def compiler(defptr)#0
break
is $3C
i++
puts("ANDI $"); putb(^(bytecode+i))
//puts("ANDI $"); putb(^(bytecode+i))
^codeptr = $A9; codeptr++ // LDA #imm
^codeptr = ^(bytecode+i); codeptr++
^codeptr = $35; codeptr++ // AND zp,X
@ -319,7 +319,7 @@ def compiler(defptr)#0
break
is $3E
i++
puts("ORI $"); putb(^(bytecode+i))
//puts("ORI $"); putb(^(bytecode+i))
^codeptr = $A9; codeptr++ // LDA #imm
^codeptr = ^(bytecode+i); codeptr++
^codeptr = $15; codeptr++ // ORA zp,X
@ -329,7 +329,7 @@ def compiler(defptr)#0
break
// ISEQ,ISNE,ISGT,ISLT,ISGE,ISLE,BRFLS,BRTRU ; 40 42 44 46 48 4A 4C 4E
is $40
puts("ISEQ")
//puts("ISEQ")
^codeptr = $A0; codeptr++ // LDY #imm
^codeptr = $00; codeptr++ // $00
^codeptr = $B5; codeptr++ // LDA zp,X
@ -352,7 +352,7 @@ def compiler(defptr)#0
^codeptr = $E8; codeptr++ // INX
break
is $42
puts("ISNE")
//puts("ISNE")
^codeptr = $A0; codeptr++ // LDY #imm
^codeptr = $FF; codeptr++ // $FF
^codeptr = $B5; codeptr++ // LDA zp,X
@ -375,7 +375,7 @@ def compiler(defptr)#0
^codeptr = $E8; codeptr++ // INX
break
is $44
puts("ISGT")
//puts("ISGT")
^codeptr = $A0; codeptr++ // LDY #imm
^codeptr = $FF; codeptr++ // $FF
^codeptr = $B5; codeptr++ // LDA zp,X
@ -400,7 +400,7 @@ def compiler(defptr)#0
^codeptr = $E8; codeptr++ // INX
break
is $46
puts("ISLT")
//puts("ISLT")
^codeptr = $A0; codeptr++ // LDY #imm
^codeptr = $FF; codeptr++ // $FF
^codeptr = $B5; codeptr++ // LDA zp,X
@ -425,7 +425,7 @@ def compiler(defptr)#0
^codeptr = $E8; codeptr++ // INX
break
is $48
puts("ISGE")
//puts("ISGE")
^codeptr = $A0; codeptr++ // LDY #imm
^codeptr = $FF; codeptr++ // $FF
^codeptr = $B5; codeptr++ // LDA zp,X
@ -450,7 +450,7 @@ def compiler(defptr)#0
^codeptr = $E8; codeptr++ // INX
break
is $4A
puts("ISLE")
//puts("ISLE")
^codeptr = $A0; codeptr++ // LDY #imm
^codeptr = $FF; codeptr++ // $FF
^codeptr = $B5; codeptr++ // LDA zp,X
@ -478,7 +478,7 @@ def compiler(defptr)#0
i++
dest = i + *(bytecode+i)
i++
puts("BRFLS "); puti(dest)
//puts("BRFLS "); puti(dest)
^codeptr = $E8; codeptr++ // INX
^codeptr = $B5; codeptr++ // LDA zp,X
^codeptr = $D0-1; codeptr++ // ESTKL-1
@ -497,7 +497,7 @@ def compiler(defptr)#0
i++
dest = i + *(bytecode+i)
i++
puts("BRTRU "); puti(dest)
//puts("BRTRU "); puti(dest)
^codeptr = $E8; codeptr++ // INX
^codeptr = $B5; codeptr++ // LDA zp,X
^codeptr = $D0-1; codeptr++ // ESTKL-1
@ -517,7 +517,7 @@ def compiler(defptr)#0
i++
dest = i + *(bytecode+i)
i++
puts("BRNCH "); puti(dest)
//puts("BRNCH "); puti(dest)
^codeptr = $4C; codeptr++ // JMP abs
*codeptr = addrxlate=>[dest]
if not (*codeptr & $8000) // Unresolved address list
@ -529,7 +529,7 @@ def compiler(defptr)#0
i++
case = i + *(bytecode+i)
i++
puts("SEL "); puti(case); putln
//puts("SEL "); puti(case); putln
j = ^(bytecode+case)
dest = codeptr + 8 + case * 11)
if isule(dest, codemax)
@ -541,7 +541,7 @@ def compiler(defptr)#0
^codeptr = $C0; codeptr++ // ESTKH
^codeptr = $E8; codeptr++ // INX
repeat
puts(" $"); puth(*(bytecode+case))
//puts(" $"); puth(*(bytecode+case))
^codeptr = $C9; codeptr++ // CMP #imm
^codeptr = ^(bytecode+case); codeptr++
^codeptr = $D0; codeptr++ // BNE rel
@ -552,7 +552,7 @@ def compiler(defptr)#0
^codeptr = $03; codeptr++ // +3
*(bytecode+case) = $FFFF
case = case + 2
puts("-->"); puti(case + *(bytecode+case)); putln
//puts("-->"); puti(case + *(bytecode+case)); putln
^codeptr = $4C; codeptr++ // JMP abs
*codeptr = addrxlate=>[case]
if not (*codeptr & $8000) // Unresolved address list
@ -575,7 +575,7 @@ def compiler(defptr)#0
break
is $54
i++
puts("CALL $"); puth(*(bytecode+i))
//puts("CALL $"); puth(*(bytecode+i))
//
// Call address
//
@ -584,7 +584,7 @@ def compiler(defptr)#0
i++
break
is $56
puts("ICAL")
//puts("ICAL")
//
// Pull address off stack
//
@ -606,7 +606,7 @@ def compiler(defptr)#0
break
is $58
i++
puts("ENTER "); puti(^(bytecode+i)); putc(',');puti(^(bytecode+i+1))
//puts("ENTER "); puti(^(bytecode+i)); putc(',');puti(^(bytecode+i+1))
//
// Call into VM
//
@ -620,7 +620,7 @@ def compiler(defptr)#0
break
is $5A
i++
puts("LEAVE "); puti(^(bytecode+i))
//puts("LEAVE "); puti(^(bytecode+i))
//
// Call into VM
//
@ -630,12 +630,12 @@ def compiler(defptr)#0
^codeptr = ^(bytecode+i); codeptr++ // LEAVE OPERAND
break
is $5C
puts("RET")
//puts("RET")
^codeptr = $60; codeptr++ // RTS
break
is $5E
i++
puts("CFFB $FF"); putb(^(bytecode+i))
//puts("CFFB $FF"); putb(^(bytecode+i))
^codeptr = $CA; codeptr++ // DEX
^codeptr = $A9; codeptr++ // LDA #imm
^codeptr = ^(bytecode+i); codeptr++
@ -648,7 +648,7 @@ def compiler(defptr)#0
break
// LB,LW,LLB,LLW,LAB,LAW,DLB,DLW ; 60 62 64 66 68 6A 6C 6E
is $60
puts("LB")
//puts("LB")
^codeptr = $B5; codeptr++ // LDA zp,X
^codeptr = $D0; codeptr++ // ESTKL
^codeptr = $95; codeptr++ // STA zp,X
@ -663,7 +663,7 @@ def compiler(defptr)#0
^codeptr = $C0; codeptr++ // ESTKH
break
is $62
puts("LW")
//puts("LW")
^codeptr = $B5; codeptr++ // LDA zp,X
^codeptr = $D0; codeptr++ // ESTKL
^codeptr = $95; codeptr++ // STA zp,X
@ -685,7 +685,7 @@ def compiler(defptr)#0
break
is $64
i++
puts("LLB "); puti(^(bytecode+i))
//puts("LLB "); puti(^(bytecode+i))
^codeptr = $CA; codeptr++ // DEX
^codeptr = $A0; codeptr++ // LDY #imm
^codeptr = ^(bytecode+i); codeptr++
@ -700,7 +700,7 @@ def compiler(defptr)#0
break
is $66
i++
puts("LLW "); puti(^(bytecode+i))
//puts("LLW "); puti(^(bytecode+i))
^codeptr = $CA; codeptr++ // DEX
^codeptr = $A0; codeptr++ // LDY #imm
^codeptr = ^(bytecode+i); codeptr++
@ -716,7 +716,7 @@ def compiler(defptr)#0
break
is $68
i++
puts("LAB $"); puth(*(bytecode+i))
//puts("LAB $"); puth(*(bytecode+i))
^codeptr = $CA; codeptr++ // DEX
^codeptr = $AD; codeptr++ // LDA abs
*codeptr = *(bytecode+i); codeptr = codeptr + 2
@ -730,7 +730,7 @@ def compiler(defptr)#0
break
is $6A
i++
puts("LAW $"); puth(*(bytecode+i))
//puts("LAW $"); puth(*(bytecode+i))
^codeptr = $CA; codeptr++ // DEX
^codeptr = $AD; codeptr++ // LDA abs
*codeptr = *(bytecode+i); codeptr = codeptr + 2
@ -744,7 +744,7 @@ def compiler(defptr)#0
break
is $6C
i++
puts("DLB "); puti(^(bytecode+i))
//puts("DLB "); puti(^(bytecode+i))
^codeptr = $A0; codeptr++ // LDY #imm
^codeptr = ^(bytecode+i); codeptr++
^codeptr = $B5; codeptr++ // LDA zp,X
@ -754,7 +754,7 @@ def compiler(defptr)#0
break
is $6E
i++
puts("DLW "); puti(^(bytecode+i))
//puts("DLW "); puti(^(bytecode+i))
^codeptr = $A0; codeptr++ // LDY #imm
^codeptr = ^(bytecode+i); codeptr++
^codeptr = $B5; codeptr++ // LDA zp,X
@ -769,7 +769,7 @@ def compiler(defptr)#0
break
// SB,SW,SLB,SLW,SAB,SAW,DAB,DAW ; 70 72 74 76 78 7A 7C 7E
is $70
puts("SB")
//puts("SB")
^codeptr = $B5; codeptr++ // LDA zp,X
^codeptr = $D0; codeptr++ // ESTKL
^codeptr = $95; codeptr++ // STA zp,X
@ -782,7 +782,7 @@ def compiler(defptr)#0
^codeptr = $E8; codeptr++ // INX
break
is $72
puts("SW")
//puts("SW")
^codeptr = $B5; codeptr++ // LDA zp,X
^codeptr = $D0; codeptr++ // ESTKL
^codeptr = $95; codeptr++ // STA zp,X
@ -806,7 +806,7 @@ def compiler(defptr)#0
break
is $74
i++
puts("SLB "); puti(^(bytecode+i))
//puts("SLB "); puti(^(bytecode+i))
^codeptr = $A0; codeptr++ // LDY #imm
^codeptr = ^(bytecode+i); codeptr++
^codeptr = $B5; codeptr++ // LDA zp,X
@ -817,7 +817,7 @@ def compiler(defptr)#0
break
is $76
i++
puts("SLW "); puti(^(bytecode+i))
//puts("SLW "); puti(^(bytecode+i))
^codeptr = $A0; codeptr++ // LDY #imm
^codeptr = ^(bytecode+i); codeptr++
^codeptr = $B5; codeptr++ // LDA zp,X
@ -833,7 +833,7 @@ def compiler(defptr)#0
break
is $78
i++
puts("SAB $"); puth(*(bytecode+i))
//puts("SAB $"); puth(*(bytecode+i))
^codeptr = $B5; codeptr++ // LDA zp,X
^codeptr = $D0; codeptr++ // ESTKL
^codeptr = $8D; codeptr++ // STA abs
@ -843,7 +843,7 @@ def compiler(defptr)#0
break
is $7A
i++
puts("SAW $"); puth(*(bytecode+i))
//puts("SAW $"); puth(*(bytecode+i))
^codeptr = $B5; codeptr++ // LDA zp,X
^codeptr = $D0; codeptr++ // ESTKL
^codeptr = $8D; codeptr++ // STA abs
@ -857,7 +857,7 @@ def compiler(defptr)#0
break
is $7C
i++
puts("DAB $"); puth(*(bytecode+i))
//puts("DAB $"); puth(*(bytecode+i))
^codeptr = $B5; codeptr++ // LDA zp,X
^codeptr = $D0; codeptr++ // ESTKL
^codeptr = $8D; codeptr++ // STA abs
@ -866,7 +866,7 @@ def compiler(defptr)#0
break
is $7E
i++
puts("DAW $"); puth(*(bytecode+i))
//puts("DAW $"); puth(*(bytecode+i))
^codeptr = $B5; codeptr++ // LDA zp,X
^codeptr = $D0; codeptr++ // ESTKL
^codeptr = $8D; codeptr++ // STA abs
@ -879,7 +879,7 @@ def compiler(defptr)#0
break
// LNOT,ADD,SUB,MUL,DIV,MOD,INCR,DECR ; 80 82 84 86 88 8A 8C 8E
is $80
puts("NOT")
//puts("NOT")
^codeptr = $B5; codeptr++ // LDA zp,X
^codeptr = $D0; codeptr++ // ESTKL
^codeptr = $15; codeptr++ // ORA zp,X
@ -896,7 +896,7 @@ def compiler(defptr)#0
^codeptr = $C0; codeptr++ // ESTKH
break
is $82
puts("ADD")
//puts("ADD")
^codeptr = $B5; codeptr++ // LDA zp,X
^codeptr = $D0; codeptr++ // ESTKL
^codeptr = $18; codeptr++ // CLC
@ -913,7 +913,7 @@ def compiler(defptr)#0
^codeptr = $E8; codeptr++ // INX
break
is $84
puts("SUB")
//puts("SUB")
^codeptr = $B5; codeptr++ // LDA zp,X
^codeptr = $D0+1; codeptr++ // ESTKL+1
^codeptr = $38; codeptr++ // SEC
@ -930,7 +930,7 @@ def compiler(defptr)#0
^codeptr = $E8; codeptr++ // INX
break
is $86
puts("MUL")
//puts("MUL")
//
// Call into VM
//
@ -940,7 +940,7 @@ def compiler(defptr)#0
^codeptr = $C0; codeptr++ // NATV CODE
break
is $88
puts("DIV")
//puts("DIV")
//
// Call into VM
//
@ -950,7 +950,7 @@ def compiler(defptr)#0
^codeptr = $C0; codeptr++ // NATV CODE
break
is $8A
puts("MOD")
//puts("MOD")
//
// Call into VM
//
@ -960,7 +960,7 @@ def compiler(defptr)#0
^codeptr = $C0; codeptr++ // NATV CODE
break
is $8C
puts("INCR")
//puts("INCR")
^codeptr = $F6; codeptr++ // INC zp,X
^codeptr = $D0; codeptr++ // ESTKL
^codeptr = $D0; codeptr++ // BNE rel
@ -969,7 +969,7 @@ def compiler(defptr)#0
^codeptr = $C0; codeptr++ // ESTKH
break
is $8E
puts("DECR")
//puts("DECR")
^codeptr = $B5; codeptr++ // LDA zp,X
^codeptr = $D0; codeptr++ // ESTKL
^codeptr = $D0; codeptr++ // BNE rel
@ -981,7 +981,7 @@ def compiler(defptr)#0
break
// NEG,COMP,BAND,IOR,XOR,SHL,SHR,IDXW ; 90 92 94 96 98 9A 9C 9E
is $90
puts("NEG")
//puts("NEG")
^codeptr = $A9; codeptr++ // LDA #imm
^codeptr = $00; codeptr++ // $00
^codeptr = $38; codeptr++ // SEC
@ -997,7 +997,7 @@ def compiler(defptr)#0
^codeptr = $C0; codeptr++ // ESTKH
break
is $92
puts("COMP")
//puts("COMP")
^codeptr = $A9; codeptr++ // LDA #imm
^codeptr = $FF; codeptr++ // $FF
^codeptr = $55; codeptr++ // EOR zp,X
@ -1012,7 +1012,7 @@ def compiler(defptr)#0
^codeptr = $C0; codeptr++ // ESTKH
break
is $94
puts("AND")
//puts("AND")
^codeptr = $B5; codeptr++ // LDA zp,X
^codeptr = $D0; codeptr++ // ESTKL
^codeptr = $35; codeptr++ // AND zp,X
@ -1028,7 +1028,7 @@ def compiler(defptr)#0
^codeptr = $E8; codeptr++ // INX
break
is $96
puts("OR")
//puts("OR")
^codeptr = $B5; codeptr++ // LDA zp,X
^codeptr = $D0; codeptr++ // ESTKL
^codeptr = $15; codeptr++ // ORA zp,X
@ -1044,7 +1044,7 @@ def compiler(defptr)#0
^codeptr = $E8; codeptr++ // INX
break
is $98
puts("XOR")
//puts("XOR")
^codeptr = $B5; codeptr++ // LDA zp,X
^codeptr = $D0; codeptr++ // ESTKL
^codeptr = $55; codeptr++ // EOR zp,X
@ -1060,7 +1060,7 @@ def compiler(defptr)#0
^codeptr = $E8; codeptr++ // INX
break
is $9A
puts("SHL")
//puts("SHL")
//
// Call into VM
//
@ -1070,7 +1070,7 @@ def compiler(defptr)#0
^codeptr = $C0; codeptr++ // NATV CODE
break
is $9C
puts("SHR")
//puts("SHR")
//
// Call into VM
//
@ -1080,7 +1080,7 @@ def compiler(defptr)#0
^codeptr = $C0; codeptr++ // NATV CODE
break
is $9E
puts("IDXW")
//puts("IDXW")
^codeptr = $B5; codeptr++ // LDA zp,X
^codeptr = $D0; codeptr++ // ESTKL
^codeptr = $0A; codeptr++ // ASL
@ -1103,7 +1103,7 @@ def compiler(defptr)#0
is $A0
i++
dest = i + *(bytecode+i)
puts("BRGT "); puti(dest)
//puts("BRGT "); puti(dest)
i++
^codeptr = $B5; codeptr++ // LDA zp,X
^codeptr = $D0+1; codeptr++ // ESTKL+1
@ -1131,7 +1131,7 @@ def compiler(defptr)#0
is $A2
i++
dest = i + *(bytecode+i)
puts("BRLT "); puti(dest)
//puts("BRLT "); puti(dest)
i++
^codeptr = $B5; codeptr++ // LDA zp,X
^codeptr = $D0; codeptr++ // ESTKL
@ -1159,7 +1159,7 @@ def compiler(defptr)#0
is $A4
i++
dest = i + *(bytecode+i)
puts("INCBRLE "); puti(dest)
//puts("INCBRLE "); puti(dest)
i++
//
// INCR
@ -1199,7 +1199,7 @@ def compiler(defptr)#0
is $A6
i++
dest = i + *(bytecode+i)
puts("ADDBRLE "); puti(dest)
//puts("ADDBRLE "); puti(dest)
i++
//
// ADD
@ -1247,7 +1247,7 @@ def compiler(defptr)#0
is $A8
i++
dest = i + *(bytecode+i)
puts("DECBRGE "); puti(dest)
//puts("DECBRGE "); puti(dest)
i++
//
// DECR
@ -1289,7 +1289,7 @@ def compiler(defptr)#0
is $AA
i++
dest = i + *(bytecode+i)
puts("SUBBRGE "); puti(dest)
//puts("SUBBRGE "); puti(dest)
i++
//
// SUB
@ -1338,7 +1338,7 @@ def compiler(defptr)#0
i++
dest = i + *(bytecode+i)
i++
puts("BRAND "); puti(dest)
//puts("BRAND "); puti(dest)
^codeptr = $B5; codeptr++ // LDA zp,X
^codeptr = $D0; codeptr++ // ESTKL
^codeptr = $15; codeptr++ // ORA zp,X
@ -1357,7 +1357,7 @@ def compiler(defptr)#0
i++
dest = i + *(bytecode+i)
i++
puts("BROR "); puti(dest)
//puts("BROR "); puti(dest)
^codeptr = $B5; codeptr++ // LDA zp,X
^codeptr = $D0; codeptr++ // ESTKL
^codeptr = $15; codeptr++ // ORA zp,X
@ -1375,7 +1375,7 @@ def compiler(defptr)#0
// ADDLB,ADDLW,ADDAB,ADDAW,IDXLB,IDXLW,IDXAB,IDXAW ; B0 B2 B4 B6 B8 BA BC BE
is $B0
i++
puts("ADDLB "); puti(^(bytecode+i))
//puts("ADDLB "); puti(^(bytecode+i))
^codeptr = $A0; codeptr++ // LDY #imm
^codeptr = ^(bytecode+i); codeptr++
^codeptr = $B1; codeptr++ // LDA (zp),Y
@ -1392,7 +1392,7 @@ def compiler(defptr)#0
break
is $B2
i++
puts("ADDLW "); puti(^(bytecode+i))
//puts("ADDLW "); puti(^(bytecode+i))
^codeptr = $A0; codeptr++ // LDY #imm
^codeptr = ^(bytecode+i); codeptr++
^codeptr = $B1; codeptr++ // LDA (zp),Y
@ -1412,7 +1412,7 @@ def compiler(defptr)#0
break
is $B4
i++
puts("ADDAB $"); puth(*(bytecode+i))
//puts("ADDAB $"); puth(*(bytecode+i))
^codeptr = $AD; codeptr++ // LDA abs
*codeptr = *(bytecode+i); codeptr = codeptr + 2
^codeptr = $18; codeptr++ // CLC
@ -1428,7 +1428,7 @@ def compiler(defptr)#0
break
is $B6
i++
puts("ADDAW $"); puth(*(bytecode+i))
//puts("ADDAW $"); puth(*(bytecode+i))
^codeptr = $AD; codeptr++ // LDA abs
*codeptr = *(bytecode+i); codeptr = codeptr + 2
^codeptr = $18; codeptr++ // CLC
@ -1446,7 +1446,7 @@ def compiler(defptr)#0
break
is $B8
i++
puts("IDXLB "); puti(^(bytecode+i))
//puts("IDXLB "); puti(^(bytecode+i))
^codeptr = $A0; codeptr++ // LDY #imm
^codeptr = ^(bytecode+i); codeptr++
^codeptr = $B1; codeptr++ // LDA (zp),Y
@ -1470,7 +1470,7 @@ def compiler(defptr)#0
break
is $BA
i++
puts("IDXLW "); puti(^(bytecode+i))
//puts("IDXLW "); puti(^(bytecode+i))
^codeptr = $A0; codeptr++ // LDY #imm
^codeptr = ^(bytecode+i); codeptr++
^codeptr = $B1; codeptr++ // LDA (zp),Y
@ -1498,7 +1498,7 @@ def compiler(defptr)#0
break
is $BC
i++
puts("IDXAB $"); puth(*(bytecode+i))
//puts("IDXAB $"); puth(*(bytecode+i))
^codeptr = $AD; codeptr++ // LDA abs
*codeptr = *(bytecode+i); codeptr = codeptr + 2
^codeptr = $A0; codeptr++ // LDY #imm
@ -1521,7 +1521,7 @@ def compiler(defptr)#0
break
is $BE
i++
puts("IDXAW $"); puth(*(bytecode+i))
//puts("IDXAW $"); puth(*(bytecode+i))
^codeptr = $AD; codeptr++ // LDA abs
*codeptr = *(bytecode+i); codeptr = codeptr + 2
^codeptr = $0A; codeptr++ // ASL
@ -1548,10 +1548,10 @@ def compiler(defptr)#0
is $FF // NOPed out earlier by SELect
break
otherwise
putc('$'); puth(^(bytecode+i))
//putc('$'); puth(^(bytecode+i))
wend
fin
putln
//putln
i++
if i >= defptr->bytecodesize
//
@ -1564,11 +1564,11 @@ def compiler(defptr)#0
// Free working bufffers
//
heaprelease(addrxlate)
puts("Done compiling: $"); puth(defptr=>interpaddr); putln
getc
//puts("Done compiling: $"); puth(defptr=>interpaddr); putln
//getc
return
fin
getc
//getc
loop
//
// If we got here. we ran out of code buffer space. Overwrite interpreter
@ -1579,8 +1579,8 @@ def compiler(defptr)#0
// Free working bufffers
//
heaprelease(addrxlate)
puts("Ran out of code buffer\n")
getc
//puts("Ran out of code buffer\n")
//getc
end
//
// Install JIT compiler

View File

@ -0,0 +1,38 @@
//
// PLASMA JIT bytecode compiler
//
include "inc/cmdsys.plh"
include "inc/args.plh"
const jitcount = syserr+1
const jitsize = jitcount+1
const jitwarmup = jitsize+1
word arg
def atoi(strptr)
word num
num = 0
if ^strptr < '0' or ^strptr > '9'
repeat
num = num * 10 + ^strptr - '0'
strptr++
until ^strptr < '0' or ^strptr > '9'
fin
return num
end
arg = argNext(argFirst)
if ^arg
cmdsys.jitcount = atoi(arg)
arg = argNext(arg)
if ^arg
cmdsys:warmup = atoi(arg)
arg = argNext(arg)
if ^arg
cmdsys.jitsize = atoi(arg)
fin
fin
else
puts("Usage: JITUNE CALLCOUNT [WARMUP [MAXSIZE]]\n")
fin

View File

@ -39,9 +39,9 @@ end
//
// JIT compiler constants
//
const jitcount = $01//$10
const jitcomp = $03E2
const jitcodeptr = $03E4
const jitwarming = $03E6
const jitcode = $BF00
//
// Pedefined functions.
@ -60,6 +60,9 @@ word syspath
word syscmdln
word = @execmod, @open, @close, @read, @write
byte perr
byte jitcount = $10
byte jitsize = $FF
word jitwarmup = $0100
//
// Working input buffer overlayed with strings table
//
@ -140,7 +143,7 @@ word sysmodsym = @exports
//
word systemflags = 0
word heap
word xheap = $0800
word xheap = $0C00//$0800 Skip text page2 for double lores
word lastsym = symtbl
//
// Utility functions
@ -988,12 +991,12 @@ def allocxheap(size)#1
xheap = xaddr + size
fin
fin
if systemflags & restxt2
if uword_isle(xaddr, $0C00) and uword_isgt(xheap, $0800)
xaddr = $0C00
xheap = xaddr + size
fin
fin
//if systemflags & restxt2
// if uword_isle(xaddr, $0C00) and uword_isgt(xheap, $0800)
// xaddr = $0C00
// xheap = xaddr + size
// fin
//fin
if systemflags & resxhgr1
if uword_isle(xaddr, $4000) and uword_isgt(xheap, $2000)
xaddr = $4000
@ -1067,9 +1070,9 @@ def adddef(isfirst, addr, deflast)#1
if not isfirst
preventry = defentry - t_defentry
defsize = addr - preventry=>bytecodeaddr
if *jitcomp and defsize < 256
if *jitcomp and defsize <= jitsize
preventry=>interpaddr = $03D6 // JSR $03D6 (JIT INTERP)
preventry->callcount = jitcount // Set count
preventry->callcount = jitcount // Set JIT countdown
preventry->bytecodesize = defsize // Set size
fin
fin
@ -1186,9 +1189,13 @@ def loadmod(mod)#1
codefix = defaddr - bytecode
defofst = defaddr - defofst
//
// Reser JIT warmup count
//
*jitwarming = jitwarmup
//
// Run through the DeFinition Dictionary.
//
deffirst = 1
deffirst = 1
while ^rld == $02
//
// This is a bytcode def entry - add it to the def directory.

View File

@ -53,6 +53,8 @@ OPPAGE = OPIDX+1
STRBUF = $0280
INTERP = $03D0
JITCOMP = $03E2
JITCODE = $03E4
JITWARM = $03E6
;******************************
;* *
;* INTERPRETER INITIALIZATION *
@ -439,13 +441,21 @@ JITINTRPX PHP
PLA
SBC #$00
STA TMPH
LDY #$05 ; DEC JIT COUNT
LDA (TMP),Y
LDY #$05
LDA JITWARM+1 ; CHECK WARMING
ORA JITWARM
BEQ ++
LDA JITWARM
BNE +
DEC JITWARM+1
+ DEC JITWARM
JMP +++
++ LDA (TMP),Y ; DEC JIT COUNT
SEC
SBC #$01
STA (TMP),Y
BEQ RUNJIT
DEY
+++ DEY
- LDA (TMP),Y
STA IPH
DEY