diff --git a/asm/asm.go b/asm/asm.go index 6228fff..2c08902 100644 --- a/asm/asm.go +++ b/asm/asm.go @@ -71,8 +71,11 @@ func (a *Assembler) Load(filename string, prefix int) error { return parseErr } - if in.Type == inst.TypeOrg { + switch in.Type { + case inst.TypeOrg: a.Ctx.SetAddr(in.Addr) + case inst.TypeTarget: + return in.Errorf("target not implemented yet") } // Update address @@ -211,9 +214,18 @@ func (a *Assembler) Pass2() error { a.initPass() for _, in := range a.Insts { - if in.Type == inst.TypeOrg { + switch in.Type { + case inst.TypeOrg: a.Ctx.SetAddr(in.Addr) continue + case inst.TypeEqu: + val, err := in.Exprs[0].Eval(a.Ctx, in.Line) + if err != nil { + return err + } + in.Value = val + a.Ctx.Set(in.Label, val) + continue } err := in.Compute(a.Ctx) diff --git a/asm/cmd/a2as/runtest.sh b/asm/cmd/a2as/runtest.sh index 7e6029b..b6d2afb 100755 --- a/asm/cmd/a2as/runtest.sh +++ b/asm/cmd/a2as/runtest.sh @@ -1,36 +1,54 @@ go run a2as.go --in ../../../../goapple2/source/redbook/monitor.asm --out monitor.rom --flavor redbooka --listing monitor.lst --prefix=-1 -go run a2as.go --in ../../../../goapple2/source/redbook/miniasm.asm --out miniasm.rom --flavor redbooka --listing miniasm.lst --prefix=-1 -go run a2as.go --in ../../../../goapple2/source/redbook/sweet16.asm --out sweet16.rom --flavor redbooka --listing sweet16.lst --prefix=-1 -go run a2as.go --in ../../../../goapple2/source/redbook/fp.asm --out fp.rom --flavor redbookb --listing fp.lst --prefix=-1 -go run a2as.go --in ../../../../goapple2/source/redbook/misc-f669.asm --out misc-f669.rom --flavor redbooka --listing misc-f669.lst --prefix=0 -go run a2as.go --in ../../../../goapple2/source/redbook/intbasic.asm --out intbasic.rom --flavor merlin --listing intbasic.lst --prefix=-1 -go run a2as.go --in ../../../../goapple2/source/applesoft/S.acf --out applesoft.rom --flavor scma --listing applesoft.lst --prefix=-1 - -MD5_APPLESOFT=$(md5 -q applesoft.rom) -[[ $MD5_APPLESOFT == '84bfbe89c9cd96e589c4d4cb01df4c4a' ]] || echo 'Wrong checksum for applesoft.rom' -MD5_FP=$(md5 -q fp.rom) -[[ $MD5_FP == '76ae6287e5e96471dc95e95eb93ba06d' ]] || echo 'Wrong checksum for fp.rom' -MD5_INTBASIC=$(md5 -q intbasic.rom) -[[ $MD5_INTBASIC == 'c22d8f7ebb54608c8718b66454ca691f' ]] || echo 'Wrong checksum for intbasic.rom' -MD5_MINIASM=$(md5 -q miniasm.rom) -[[ $MD5_MINIASM == 'e64882d56c485ee88d2bfaf4b642c2f9' ]] || echo 'Wrong checksum for miniasm.rom' -MD5_MISC_F669=$(md5 -q misc-f669.rom) -[[ $MD5_MISC_F669 == 'eccaef17e6340b54c309b87ffb6f6f22' ]] || echo 'Wrong checksum for misc-f669.rom' MD5_MONITOR=$(md5 -q monitor.rom) -[[ $MD5_MONITOR == 'bc0163ca04c463e06f99fb029ad21b1f' ]] || echo 'Wrong checksum for monitor.rom' +[[ $MD5_MONITOR == 'bc0163ca04c463e06f99fb029ad21b1f' ]] || (echo 'Wrong checksum for monitor.rom'; false) || exit 1 +rm -f monitor.rom monitor.lst + +go run a2as.go --in ../../../../goapple2/source/redbook/miniasm.asm --out miniasm.rom --flavor redbooka --listing miniasm.lst --prefix=-1 +MD5_MINIASM=$(md5 -q miniasm.rom) +[[ $MD5_MINIASM == 'e64882d56c485ee88d2bfaf4b642c2f9' ]] || (echo 'Wrong checksum for miniasm.rom'; false) || exit 1 +rm -f miniasm.rom miniasm.lst + +go run a2as.go --in ../../../../goapple2/source/redbook/sweet16.asm --out sweet16.rom --flavor redbooka --listing sweet16.lst --prefix=-1 MD5_SWEET16=$(md5 -q sweet16.rom) -[[ $MD5_SWEET16 == '93e148f5e30cdd574fd1bb3c26798787' ]] || echo 'Wrong checksum for sweet16.rom' +[[ $MD5_SWEET16 == '93e148f5e30cdd574fd1bb3c26798787' ]] || (echo 'Wrong checksum for sweet16.rom'; false) || exit 1 +rm -f sweet16.rom sweet16.lst + +go run a2as.go --in ../../../../goapple2/source/redbook/fp.asm --out fp.rom --flavor redbookb --listing fp.lst --prefix=-1 +MD5_FP=$(md5 -q fp.rom) +[[ $MD5_FP == '76ae6287e5e96471dc95e95eb93ba06d' ]] || (echo 'Wrong checksum for fp.rom'; false) || exit 1 +rm -f fp.rom fp.lst + +go run a2as.go --in ../../../../goapple2/source/redbook/misc-f669.asm --out misc-f669.rom --flavor redbooka --listing misc-f669.lst --prefix=0 +MD5_MISC_F669=$(md5 -q misc-f669.rom) +[[ $MD5_MISC_F669 == 'eccaef17e6340b54c309b87ffb6f6f22' ]] || (echo 'Wrong checksum for misc-f669.rom'; false) || exit 1 +rm -f misc-f669.rom misc-f669.lst + +go run a2as.go --in ../../../../goapple2/source/redbook/intbasic.asm --out intbasic.rom --flavor merlin --listing intbasic.lst --prefix=-1 +MD5_INTBASIC=$(md5 -q intbasic.rom) +[[ $MD5_INTBASIC == 'c22d8f7ebb54608c8718b66454ca691f' ]] || (echo 'Wrong checksum for intbasic.rom'; false) || exit 1 +rm -f intbasic.rom intbasic.lst + +go run a2as.go --in ../../../../goapple2/source/applesoft/S.acf --out applesoft.rom --flavor scma --listing applesoft.lst --prefix=-1 +MD5_APPLESOFT=$(md5 -q applesoft.rom) +[[ $MD5_APPLESOFT == '84bfbe89c9cd96e589c4d4cb01df4c4a' ]] || (echo 'Wrong checksum for applesoft.rom'; false) || exit 1 +rm -f applesoft.rom applesoft.lst go run a2as.go --in ../../../../goapple2/source/progaid/hires.asm --out hires.rom --flavor redbooka -go run a2as.go --in ../../../../goapple2/source/progaid/verify.asm --out verify.rom --flavor redbooka -go run a2as.go --in ../../../../goapple2/source/progaid/ramtest.asm --out ramtest.rom --flavor redbooka -go run a2as.go --in ../../../../goapple2/source/progaid/music.asm --out music.rom --flavor redbooka - MD5_HIRES=$(md5 -q hires.rom) -[[ $MD5_HIRES == 'efe22f1a8c94458068fb12ae702b58c4' ]] || echo 'Wrong checksum for hires.rom' -MD5_MUSIC=$(md5 -q music.rom) -[[ $MD5_MUSIC == '0ffe796a73410e822fcae5e510374924' ]] || echo 'Wrong checksum for music.rom' -MD5_RAMTEST=$(md5 -q ramtest.rom) -[[ $MD5_RAMTEST == '0420635256a3b016323989e3a9fe4ce7' ]] || echo 'Wrong checksum for ramtest.rom' +[[ $MD5_HIRES == 'efe22f1a8c94458068fb12ae702b58c4' ]] || (echo 'Wrong checksum for hires.rom'; false) || exit 1 +rm -f hires.rom + +go run a2as.go --in ../../../../goapple2/source/progaid/verify.asm --out verify.rom --flavor redbooka MD5_VERIFY=$(md5 -q verify.rom) -[[ $MD5_VERIFY == '527f420462426e4851b942af46cc7f48' ]] || echo 'Wrong checksum for verify.rom' +[[ $MD5_VERIFY == '527f420462426e4851b942af46cc7f48' ]] || (echo 'Wrong checksum for verify.rom'; false) || exit 1 +rm -f verify.rom + +go run a2as.go --in ../../../../goapple2/source/progaid/ramtest.asm --out ramtest.rom --flavor redbooka +MD5_RAMTEST=$(md5 -q ramtest.rom) +[[ $MD5_RAMTEST == '0420635256a3b016323989e3a9fe4ce7' ]] || (echo 'Wrong checksum for ramtest.rom'; false) || exit 1 +rm -f ramtest.rom + +go run a2as.go --in ../../../../goapple2/source/progaid/music.asm --out music.rom --flavor redbooka +MD5_MUSIC=$(md5 -q music.rom) +[[ $MD5_MUSIC == '0ffe796a73410e822fcae5e510374924' ]] || (echo 'Wrong checksum for music.rom'; false) || exit 1 +rm -f music.rom diff --git a/asm/flavors/common/common.go b/asm/flavors/common/common.go index c187d92..036708b 100644 --- a/asm/flavors/common/common.go +++ b/asm/flavors/common/common.go @@ -8,8 +8,6 @@ import ( "github.com/zellyn/go6502/opcodes" ) -const xyzzy = false - // DecodeOp contains the common code that decodes an Opcode, once we // have fully parsed it. func DecodeOp(c context.Context, in inst.I, summary opcodes.OpSummary, indirect bool, xy rune, forceWide bool) (inst.I, error) { diff --git a/asm/inst/instruction.go b/asm/inst/instruction.go index d711e29..10e3555 100644 --- a/asm/inst/instruction.go +++ b/asm/inst/instruction.go @@ -160,9 +160,6 @@ func (i I) String() string { // Compute attempts to finalize the instruction. func (i *I) Compute(c context.Context) error { - if i.Type == TypeEqu || i.Type == TypeTarget { - return i.computeMustKnow(c) - } if i.Final { return nil } @@ -171,12 +168,10 @@ func (i *I) Compute(c context.Context) error { return i.computeOp(c) case TypeData: return i.computeData(c) - case TypeBlock: - panic("Compute called with TypeBlock") } - // Everything else is zero-width - i.Width = 0 + // Everything else is already final + // TODO(zellyn): warn if we reach here? i.Final = true return nil @@ -245,8 +240,6 @@ func (i *I) computeBlock(c context.Context, final bool) (bool, error) { } func (i *I) computeMustKnow(c context.Context) error { - i.Width = 0 - i.Final = true val, err := i.Exprs[0].Eval(c, i.Line) if err != nil { return err