labels, jumps, modr/m byte encoding
This commit is contained in:
parent
e1c6771fe1
commit
2563e5b6cb
66
asm.qf
66
asm.qf
|
@ -11,7 +11,6 @@ var currop
|
||||||
4 const OP_IMM
|
4 const OP_IMM
|
||||||
|
|
||||||
: op! ( op type ) currop @ >r optypes r@ + ! ops r@ + ! 1 r> + currop ! ;
|
: op! ( op type ) currop @ >r optypes r@ + ! ops r@ + ! 1 r> + currop ! ;
|
||||||
: assembled 0 currop ! ;
|
|
||||||
|
|
||||||
: mkreg makedo , does> @ swap makedo , , does> dup @ swap 1 + @ op! ;
|
: mkreg makedo , does> @ swap makedo , , does> dup @ swap 1 + @ op! ;
|
||||||
OP_REG8 mkreg reg8
|
OP_REG8 mkreg reg8
|
||||||
|
@ -26,6 +25,32 @@ OP_SREG mkreg sreg
|
||||||
|
|
||||||
: # OP_IMM op! ;
|
: # OP_IMM op! ;
|
||||||
|
|
||||||
|
&h80 const LBL_REL
|
||||||
|
var lblfixup var currlbl
|
||||||
|
|
||||||
|
: currlbl-head currlbl @ 1 + ;
|
||||||
|
: mk-lbl-fixpoint
|
||||||
|
here currlbl-head @ , tell , lblfixup @ , currlbl-head ! ;
|
||||||
|
|
||||||
|
: :> makedo tell , 0 , does> 0 # currlbl ! ;
|
||||||
|
: fixlabel.rel currlbl @ @ tell - &hff & tell 1 - seek outb! ;
|
||||||
|
: fixlabel.addr currlbl @ @ &h100 + tell 2 - seek outw! ;
|
||||||
|
: fixlabel ( fixtype -- ) if fixlabel.rel else fixlabel.addr then ;
|
||||||
|
: fixpoint.seek ( p -- ) 1 + @ seek ;
|
||||||
|
: fixpoint.fix ( p -- ) 2 + @ fixlabel ;
|
||||||
|
: fixpoint ( p -- next ) dup fixpoint.seek dup fixpoint.fix @ ;
|
||||||
|
|
||||||
|
: fix.fixpoints currlbl-head @ begin dup while fixpoint repeat drop ;
|
||||||
|
|
||||||
|
: assembled ( success -- )
|
||||||
|
currlbl @ and if
|
||||||
|
lblfixup @ fixlabel
|
||||||
|
mk-lbl-fixpoint
|
||||||
|
then 0 currop ! 0 lblfixup ! 0 currlbl ! ;
|
||||||
|
|
||||||
|
: update.label tell currlbl @ ! ;
|
||||||
|
: <: update.label tell fix.fixpoints seek 0 assembled ;
|
||||||
|
|
||||||
: read-impl ( p -- next cp optypes )
|
: read-impl ( p -- next cp optypes )
|
||||||
dup @ swap
|
dup @ swap
|
||||||
dup 1 + @ swap
|
dup 1 + @ swap
|
||||||
|
@ -37,12 +62,14 @@ OP_SREG mkreg sreg
|
||||||
if drop drop 0 ret then
|
if drop drop 0 ret then
|
||||||
repeat drop drop 1 ;
|
repeat drop drop 1 ;
|
||||||
|
|
||||||
: inst ( opcount -- ) makedo , 0 , does>
|
|
||||||
|
: inst ( opcount|lblfixup -- ) makedo dup &h7f & , 0 , &h80 & , does>
|
||||||
|
dup 2 + @ lblfixup !
|
||||||
dup @ currop @ != if 0 message yelp ret then
|
dup @ currop @ != if 0 message yelp ret then
|
||||||
1 + @ begin dup while
|
1 + @ begin dup while
|
||||||
read-impl currop @ match-impl
|
read-impl currop @ match-impl
|
||||||
if execute drop assembled ret else drop then
|
if execute drop 1 assembled ret else drop then
|
||||||
repeat drop 1 message yelp ;
|
repeat drop 1 message yelp 0 assembled ;
|
||||||
|
|
||||||
: inst-nextimpl do.data 1 + ;
|
: inst-nextimpl do.data 1 + ;
|
||||||
: inst-opcount do.data @ ;
|
: inst-opcount do.data @ ;
|
||||||
|
@ -53,18 +80,39 @@ OP_SREG mkreg sreg
|
||||||
r@ inst-opcount begin dup while 1 - swap , repeat drop
|
r@ inst-opcount begin dup while 1 - swap , repeat drop
|
||||||
r> inst-nextimpl r> swap ! ;
|
r> inst-nextimpl r> swap ! ;
|
||||||
|
|
||||||
: int &hcd outb! outb! assembled ;
|
: int &hcd outb! outb! 1 assembled ;
|
||||||
2 inst mov
|
2 inst mov
|
||||||
2 inst movb
|
2 inst movb
|
||||||
|
|
||||||
OP_IMM OP_REG16 :noname &hb8 op1 + outb! op2 outw! ; ' mov impl
|
OP_IMM OP_REG16 :noname &hb8 op1 + outb! op2 outw! ; ' mov impl
|
||||||
OP_IMM OP_REG8 :noname &hb0 op1 + outb! op2 outb! ; ' movb impl
|
OP_IMM OP_REG8 :noname &hb0 op1 + outb! op2 outb! ; ' movb impl
|
||||||
|
: :+r anondo >r , OP_REG16 r> does> @ op1 + outb! ;
|
||||||
|
: :+sreg anondo >r , OP_SREG r> does> @ op1 8 * + outb! ;
|
||||||
|
|
||||||
1 inst push
|
1 inst push
|
||||||
OP_SREG :noname &h06 op1 8 * + outb! ; ' push impl
|
&h06 :+sreg ' push impl
|
||||||
OP_REG16 :noname &h50 op1 + outb! ; ' push impl
|
&h50 :+r ' push impl
|
||||||
1 inst pop
|
1 inst pop
|
||||||
OP_SREG :noname &h07 op1 8 * + outb! ; ' pop impl
|
&h07 :+sreg ' pop impl
|
||||||
OP_REG16 :noname &h58 op1 + outb! ; ' pop impl
|
&h58 :+r ' pop impl
|
||||||
|
1 inst dec
|
||||||
|
&h48 :+r ' dec impl
|
||||||
|
|
||||||
|
: :jumprel here >r 1 LBL_REL | inst
|
||||||
|
:| anondo >r , OP_IMM r> does> @ outb! op1 outb! |; r> impl ;
|
||||||
|
|
||||||
|
&h77 :jumprel ja
|
||||||
|
&h73 :jumprel jae
|
||||||
|
&h72 :jumprel jb
|
||||||
|
&h76 :jumprel jbe
|
||||||
|
&h74 :jumprel je
|
||||||
|
&h7f :jumprel jg
|
||||||
|
&h7d :jumprel jge
|
||||||
|
&h7c :jumprel jl
|
||||||
|
&h7e :jumprel jle
|
||||||
|
&h75 :jumprel jne
|
||||||
|
&h74 :jumprel jz
|
||||||
|
|
||||||
|
: .EXIT ax &h4c00 | # mov &h21 int ;
|
||||||
|
: d" begin in@ dup [ in@ " lit ] != while outb! repeat drop ;
|
||||||
|
|
||||||
|
|
4
boot.qf
4
boot.qf
|
@ -34,7 +34,9 @@
|
||||||
|
|
||||||
: $do r> dup 1 + swap @ >r ;
|
: $do r> dup 1 + swap @ >r ;
|
||||||
var does.patch
|
var does.patch
|
||||||
: makedo word@ create ' $do , here does.patch ! -1 , ;
|
: compiledo ' $do , here does.patch ! -1 , ;
|
||||||
|
: makedo word@ create compiledo ;
|
||||||
|
: anondo here compiledo ;
|
||||||
: does> here 3 + lit :| does.patch @ ! rdrop |; , ; immediate
|
: does> here 3 + lit :| does.patch @ ! rdrop |; , ; immediate
|
||||||
|
|
||||||
: do.data ( cp -- data ) 2 + ;
|
: do.data ( cp -- data ) 2 + ;
|
||||||
|
|
17
in.asm
17
in.asm
|
@ -1,15 +1,20 @@
|
||||||
: .EXIT ax &h4c00 | # mov &h21 int ;
|
|
||||||
: d" begin in@ dup [ in@ " lit ] != while outb! repeat drop ;
|
|
||||||
|
|
||||||
cs push \ copy code segment to data segment
|
cs push \ copy code segment to data segment
|
||||||
ds pop
|
ds pop
|
||||||
|
|
||||||
tell 1 + dx 0 # mov
|
\ jne not yet working
|
||||||
|
\ :> loop
|
||||||
|
\ cx 3 # mov
|
||||||
|
|
||||||
|
:> msg
|
||||||
|
dx msg mov
|
||||||
ah 9 # movb
|
ah 9 # movb
|
||||||
&h21 int
|
&h21 int
|
||||||
|
|
||||||
|
\ cx dec
|
||||||
|
\ loop jne
|
||||||
|
|
||||||
0 .EXIT
|
0 .EXIT
|
||||||
|
|
||||||
tell
|
msg <:
|
||||||
d" Hello World!$"
|
d" Hello World!$"
|
||||||
&h100 + swap seek outw!
|
|
||||||
|
|
2
qf.bas
2
qf.bas
|
@ -447,7 +447,7 @@ END FUNCTION
|
||||||
|
|
||||||
FUNCTION lookup (w$)
|
FUNCTION lookup (w$)
|
||||||
lookup = -1
|
lookup = -1
|
||||||
FOR i = 0 TO mem(P.LATEST)
|
FOR i = mem(P.LATEST) TO 0 STEP -1
|
||||||
IF RTRIM$(words(i).nm) = w$ THEN
|
IF RTRIM$(words(i).nm) = w$ THEN
|
||||||
lookup = i
|
lookup = i
|
||||||
GOTO found
|
GOTO found
|
||||||
|
|
46
trace.txt
46
trace.txt
|
@ -1,39 +1,15 @@
|
||||||
read: :
|
|
||||||
read: .EXIT
|
|
||||||
read: ax
|
|
||||||
read: &h4c00
|
|
||||||
read: |
|
|
||||||
read: #
|
|
||||||
read: mov
|
|
||||||
read: &h21
|
|
||||||
read: int
|
|
||||||
read: ;
|
|
||||||
read: :
|
|
||||||
read: d"
|
|
||||||
read: begin
|
|
||||||
read: in@
|
|
||||||
read: dup
|
|
||||||
read: [
|
|
||||||
read: in@
|
|
||||||
read: lit
|
|
||||||
read: ]
|
|
||||||
read: !=
|
|
||||||
read: while
|
|
||||||
read: outb!
|
|
||||||
read: repeat
|
|
||||||
read: drop
|
|
||||||
read: ;
|
|
||||||
read: cs
|
read: cs
|
||||||
read: push
|
read: push
|
||||||
read: \
|
read: \
|
||||||
read: ds
|
read: ds
|
||||||
read: pop
|
read: pop
|
||||||
read: tell
|
read: \
|
||||||
read: 1
|
read: \
|
||||||
read: +
|
read: \
|
||||||
|
read: :>
|
||||||
|
read: msg
|
||||||
read: dx
|
read: dx
|
||||||
read: 0
|
read: msg
|
||||||
read: #
|
|
||||||
read: mov
|
read: mov
|
||||||
read: ah
|
read: ah
|
||||||
read: 9
|
read: 9
|
||||||
|
@ -41,12 +17,10 @@ read: #
|
||||||
read: movb
|
read: movb
|
||||||
read: &h21
|
read: &h21
|
||||||
read: int
|
read: int
|
||||||
|
read: \
|
||||||
|
read: \
|
||||||
read: 0
|
read: 0
|
||||||
read: .EXIT
|
read: .EXIT
|
||||||
read: tell
|
read: msg
|
||||||
|
read: <:
|
||||||
read: d"
|
read: d"
|
||||||
read: &h100
|
|
||||||
read: +
|
|
||||||
read: swap
|
|
||||||
read: seek
|
|
||||||
read: outw!
|
|
||||||
|
|
Loading…
Reference in a new issue