fix bugs, hello world assembles

This commit is contained in:
Jeremy Penner 2019-10-20 14:53:53 -04:00
parent e601535399
commit e1c6771fe1
8 changed files with 85 additions and 349 deletions

BIN
asm.img

Binary file not shown.

11
asm.qf
View file

@ -32,7 +32,7 @@ OP_SREG mkreg sreg
2 + ;
: match-impl ( optypes opcount -- b )
begin dup > 0 while
begin dup 0 > while
1 - 2dup + @ over optypes + @ !=
if drop drop 0 ret then
repeat drop drop 1 ;
@ -44,7 +44,6 @@ OP_SREG mkreg sreg
if execute drop assembled ret else drop then
repeat drop 1 message yelp ;
: do.data ( cp -- data ) 2 + ;
: inst-nextimpl do.data 1 + ;
: inst-opcount do.data @ ;
@ -58,8 +57,14 @@ OP_SREG mkreg sreg
2 inst mov
2 inst movb
: outw! dup &hff and outb! 256 / outb! ;
OP_IMM OP_REG16 :noname &hb8 op1 + outb! op2 outw! ; ' mov impl
OP_IMM OP_REG8 :noname &hb0 op1 + outb! op2 outb! ; ' movb impl
1 inst push
OP_SREG :noname &h06 op1 8 * + outb! ; ' push impl
OP_REG16 :noname &h50 op1 + outb! ; ' push impl
1 inst pop
OP_SREG :noname &h07 op1 8 * + outb! ; ' pop impl
OP_REG16 :noname &h58 op1 + outb! ; ' pop impl

BIN
boot.img

Binary file not shown.

View file

@ -1,7 +1,8 @@
: debug word@ yelp ;
: here 0 @ ;
: here! 0 ! ;
: != not = ;
: != = not ;
: outw! dup &hff & outb! 256 / &hff & outb! ;
: if ' jz_ , here 0 , ; immediate
: then here over - swap ! ; immediate
@ -36,6 +37,8 @@ var does.patch
: makedo word@ create ' $do , here does.patch ! -1 , ;
: does> here 3 + lit :| does.patch @ ! rdrop |; , ; immediate
: do.data ( cp -- data ) 2 + ;
: $defer r> @ >r ;
: defer word@ create ' $defer , :| |; , ;
: redef 1 + ! ;

17
in.asm
View file

@ -1,6 +1,15 @@
\ The simplest possible COM file: just return 1
: .EXIT ax &h4c00 | # mov &h21 int ;
: d" begin in@ dup [ in@ " lit ] != while outb! repeat drop ;
\ 1 trace
\ mov \ should fail and yelp
ax &h4c01 # mov
cs push \ copy code segment to data segment
ds pop
tell 1 + dx 0 # mov
ah 9 # movb
&h21 int
0 .EXIT
tell
d" Hello World!$"
&h100 + swap seek outw!

BIN
out.com

Binary file not shown.

15
qf.bas
View file

@ -90,6 +90,8 @@ CONST O.BITAND = -32
CONST O.BITOR = -33
CONST O.MESSAGE = -34
CONST O.TRACE = -35
CONST O.TELL = -36
CONST O.SEEK = -37
CONST P.HERE = 0
CONST P.LATEST = 1
@ -166,6 +168,8 @@ CALL opcode("*", O.MUL)
CALL opcode("/", O.DIV)
CALL opcode("<", O.LT)
CALL opcode("=", O.EQ)
CALL opcode("&", O.BITAND)
CALL opcode("|", O.BITOR)
CALL opcode("jz_", O.JZ)
CALL opcode("jmp_", O.JMP)
CALL opcode(">r", O.RPUSH)
@ -177,6 +181,9 @@ CALL opcode(",", O.COMMA)
CALL opcode("message", O.MESSAGE)
CALL opcode("yelp", O.YELP)
CALL opcode("trace", O.TRACE)
CALL opcode("seek", O.SEEK)
CALL opcode("tell", O.TELL)
CALL assemble("<rot", ">rot >rot ret")
CALL assemble("over", "swap dup >rot ret")
CALL assemble("2dup", "over over ret")
@ -208,7 +215,7 @@ SUB execute (op%)
IF trace% > 0 AND tracevm THEN
tp$ = "N/A"
IF sp > 0 THEN tp$ = STR$(top)
PRINT #trace%, "ip:"; ip; " sp:"; sp; " rp:"; rsp; " tp:"; tp$; " fn:"; guessdef$(ip); " op:"; lookupop$(op%);
PRINT #trace%, "ip:"; ip; " sp:"; sp; " rp:"; rsp; " tp:"; tp$; " fn:"; guessdef$(ip); " op:"; lookupop$(op%)
END IF
SELECT CASE op%
CASE IS >= 0
@ -257,6 +264,11 @@ SUB execute (op%)
CASE O.OUT
byte$ = CHR$(pop)
PUT #1, , byte$
CASE O.TELL
CALL push(SEEK(1) - 1)
CASE O.SEEK
SEEK #1, pop + 1
CASE O.LOOKUP
istr% = pop
iword = lookup(strings$(istr%))
@ -404,6 +416,7 @@ SUB interpret (st$)
END SUB
SUB loadfile (filename$)
PRINT "Building "; filename$
inline% = 0
OPEN filename$ FOR INPUT AS #2
WHILE EOF(2) = 0

386
trace.txt
View file

@ -1,346 +1,52 @@
read: array
read: ops
read: 2
read: allot
read: array
read: optypes
read: 2
read: allot
read: var
read: currop
read: :
read: op1
read: ops
read: @
read: ;
read: :
read: op2
read: ops
read: 1
read: +
read: @
read: ;
read: 0
read: const
read: OP_NONE
read: 1
read: const
read: OP_REG8
read: 2
read: const
read: OP_REG16
read: 3
read: const
read: OP_SREG
read: 4
read: const
read: OP_IMM
read: :
read: op!
read: (
read: currop
read: @
read: >r
read: optypes
read: r@
read: +
read: !
read: ops
read: r@
read: +
read: !
read: 1
read: r>
read: +
read: currop
read: !
read: ;
read: :
read: assembled
read: 0
read: currop
read: !
read: ;
read: :
read: mkreg
read: makedo
read: ,
read: does>
read: @
read: swap
read: makedo
read: ,
read: ,
read: does>
read: dup
read: @
read: swap
read: 1
read: +
read: @
read: op!
read: ;
read: OP_REG8
read: mkreg
read: reg8
read: OP_REG16
read: mkreg
read: reg16
read: OP_SREG
read: mkreg
read: sreg
read: 0
read: reg16
read: .EXIT
read: ax
read: 0
read: reg8
read: al
read: 4
read: reg8
read: ah
read: 1
read: reg16
read: cx
read: 1
read: reg8
read: cl
read: 5
read: reg8
read: ch
read: 2
read: reg16
read: dx
read: 2
read: reg8
read: dl
read: 6
read: reg8
read: dh
read: 3
read: reg16
read: bx
read: 3
read: reg8
read: bl
read: 7
read: reg8
read: bh
read: 4
read: reg16
read: sp
read: 5
read: reg16
read: bp
read: 6
read: reg16
read: si
read: 7
read: reg16
read: di
read: 0
read: sreg
read: es
read: 1
read: sreg
read: cs
read: 2
read: sreg
read: ss
read: 3
read: sreg
read: ds
read: :
read: #
read: OP_IMM
read: op!
read: ;
read: :
read: read-impl
read: (
read: dup
read: @
read: swap
read: dup
read: 1
read: +
read: @
read: swap
read: 2
read: +
read: ;
read: :
read: match-impl
read: (
read: begin
read: dup
read: >
read: 0
read: while
read: 1
read: -
read: 2dup
read: +
read: @
read: over
read: optypes
read: +
read: @
read: !=
read: if
read: drop
read: drop
read: 0
read: ret
read: then
read: repeat
read: drop
read: drop
read: 1
read: ;
read: :
read: inst
read: (
read: makedo
read: ,
read: 0
read: ,
read: does>
read: dup
read: @
read: currop
read: @
read: !=
read: if
read: 0
read: message
read: yelp
read: ret
read: then
read: 1
read: +
read: @
read: begin
read: dup
read: while
read: read-impl
read: currop
read: @
read: match-impl
read: if
read: execute
read: drop
read: assembled
read: ret
read: else
read: drop
read: then
read: repeat
read: drop
read: 1
read: message
read: yelp
read: ;
read: :
read: do.data
read: (
read: 2
read: +
read: ;
read: :
read: inst-nextimpl
read: do.data
read: 1
read: +
read: ;
read: :
read: inst-opcount
read: do.data
read: @
read: ;
read: :
read: impl
read: (
read: here
read: >r
read: >r
read: (
read: r@
read: inst-nextimpl
read: @
read: ,
read: ,
read: r@
read: inst-opcount
read: begin
read: dup
read: while
read: 1
read: -
read: swap
read: ,
read: repeat
read: drop
read: r>
read: inst-nextimpl
read: r>
read: swap
read: !
read: ;
read: :
read: int
read: &hcd
read: outb!
read: outb!
read: assembled
read: ;
read: 2
read: inst
read: mov
read: 2
read: inst
read: movb
read: :
read: outw!
read: dup
read: &hff
read: and
read: outb!
read: 256
read: /
read: outb!
read: ;
read: OP_IMM
read: OP_REG16
read: :noname
read: &hb8
read: op1
read: +
read: outb!
read: op2
read: outw!
read: ;
read: '
read: mov
read: impl
read: OP_IMM
read: OP_REG8
read: :noname
read: &hb0
read: op1
read: +
read: outb!
read: op2
read: outb!
read: ;
read: '
read: movb
read: impl
read: \
read: \
read: \
read: ax
read: &h4c01
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: push
read: \
read: ds
read: pop
read: tell
read: 1
read: +
read: dx
read: 0
read: #
read: mov
read: ah
read: 9
read: #
read: movb
read: &h21
read: int
read: 0
read: .EXIT
read: tell
read: d"
read: &h100
read: +
read: swap
read: seek
read: outw!