Add emu_6800_alt, and fairly simple tests based on Altair 6800 BASIC
authorNick Downing <nick@ndcode.org>
Sun, 24 Jul 2022 03:46:15 +0000 (13:46 +1000)
committerNick Downing <nick@ndcode.org>
Sun, 24 Jul 2022 03:48:13 +0000 (13:48 +1000)
.gitignore
.gitmodules
Makefile
basic_6800.s19 [new file with mode: 0644]
basic_test.txt [new file with mode: 0644]
doc/BASIC Manual 75.pdf [new file with mode: 0644]
doc/Undocumented Flags · hoglet67_Z80Decoder Wiki.pdf [new file with mode: 0644]
doc/z80-documented.pdf [new file with mode: 0644]
emu_6800.c [new file with mode: 0644]
sim68xx [new submodule]

index e5ab023..e8b5b2c 100644 (file)
@@ -2,5 +2,7 @@
 *.o
 /emu_65c02
 /emu_65c02_alt
+/emu_6800
+/emu_6800_alt
 /emu_z80
 /emu_z80_alt
index 06f6c19..df13f4e 100644 (file)
@@ -10,3 +10,6 @@
 [submodule "ZEXALL"]
        path = ZEXALL
        url = https://github.com/nickd4/ZEXALL.git
+[submodule "sim68xx"]
+       path = sim68xx
+       url = https://github.com/nickd4/sim68xx.git
index 38482dd..7f2316d 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,8 @@
 BIN2HEX=bin2hex.py
 
 CFLAGS=-g -Og -Wall -Wno-attributes -Wno-unused-function
+ALT_65C02_CFLAGS=-DALT_BACKEND=1 -DVR_6502_EMU_STATIC=1
+ALT_6800_CFLAGS=-DALT_BACKEND=1 -DUSE_PROTOTYPES -DM6800 -Isim68xx/inc/arch/m6800 -Isim68xx/inc/arch/m68xx -Isim68xx/inc/base
 
 .PHONY: all
 all: \
@@ -8,11 +10,14 @@ emu_65c02 \
 emu_65c02_alt \
 6502_functional_test.ihx \
 65C02_extended_opcodes_test.ihx \
+emu_6800_alt \
 emu_z80 \
 emu_z80_alt \
 zexall.ihx \
 zexdoc.ihx
+#emu_6800
 
+# 65C02
 emu_65c02: emu_65c02.o cpu_65c02.o
        ${CC} ${CFLAGS} -o $@ $^
 
@@ -24,10 +29,10 @@ emu_65c02_alt: emu_65c02_alt.o vrEmu6502.o
        ${CC} ${CFLAGS} -o $@ $^
 
 emu_65c02_alt.o: emu_65c02.c vrEmu6502/src/vrEmu6502.h
-       ${CC} ${CFLAGS} -DALT_BACKEND=1 -DVR_6502_EMU_STATIC=1 -o $@ -c $<
+       ${CC} ${CFLAGS} ${ALT_65C02_CFLAGS} -o $@ -c $<
 
 vrEmu6502.o: vrEmu6502/src/vrEmu6502.c vrEmu6502/src/vrEmu6502.h
-       ${CC} ${CFLAGS} -DVR_6502_EMU_STATIC=1 -c $<
+       ${CC} ${CFLAGS} ${ALT_65C02_CFLAGS} -c $<
 
 6502_functional_test.ihx: \
 6502_65C02_functional_tests/bin_files/6502_functional_test.bin
@@ -41,6 +46,61 @@ vrEmu6502.o: vrEmu6502/src/vrEmu6502.c vrEmu6502/src/vrEmu6502.h
        ./entry_point.py 0x400 __temp__.ihx $@
        rm __temp__.ihx
 
+# 6800
+emu_6800: emu_6800.o cpu_6800.o
+       ${CC} ${CFLAGS} -o $@ $^
+
+emu_6800.o: cpu_6800.h
+
+cpu_6800.o: cpu_6800.h
+
+emu_6800_alt: \
+emu_6800_alt.o \
+m6800_callstac.o \
+m6800_cpu.o \
+m6800_error.o \
+m6800_instr.o \
+m6800_reg.o \
+m6800_symtab.o \
+m6800_opfunc.o \
+m6800_optab.o
+       ${CC} ${CFLAGS} -o $@ $^
+#m6800_alu.o
+
+emu_6800_alt.o: \
+emu_6800.c \
+sim68xx/inc/arch/m68xx/instr.h \
+sim68xx/inc/arch/m68xx/reg.h
+       ${CC} ${CFLAGS} ${ALT_6800_CFLAGS} -o $@ -c $<
+
+m6800_alu.o: sim68xx/src/arch/m68xx/alu.c
+       ${CC} ${CFLAGS} ${ALT_6800_CFLAGS} -o $@ -c $<
+
+m6800_callstac.o: sim68xx/src/base/callstac.c
+       ${CC} ${CFLAGS} ${ALT_6800_CFLAGS} -o $@ -c $<
+
+m6800_cpu.o: sim68xx/src/base/cpu.c
+       ${CC} ${CFLAGS} ${ALT_6800_CFLAGS} -o $@ -c $<
+
+m6800_error.o: sim68xx/src/base/error.c
+       ${CC} ${CFLAGS} ${ALT_6800_CFLAGS} -o $@ -c $<
+
+m6800_instr.o: sim68xx/src/arch/m6800/instr.c
+       ${CC} ${CFLAGS} ${ALT_6800_CFLAGS} -o $@ -c $<
+
+m6800_reg.o: sim68xx/src/arch/m68xx/reg.c
+       ${CC} ${CFLAGS} ${ALT_6800_CFLAGS} -o $@ -c $<
+
+m6800_symtab.o: sim68xx/src/base/symtab.c
+       ${CC} ${CFLAGS} ${ALT_6800_CFLAGS} -o $@ -c $<
+
+m6800_opfunc.o: sim68xx/src/arch/m68xx/opfunc.c
+       ${CC} ${CFLAGS} ${ALT_6800_CFLAGS} -o $@ -c $<
+
+m6800_optab.o: sim68xx/src/arch/m6800/optab.c
+       ${CC} ${CFLAGS} ${ALT_6800_CFLAGS} -o $@ -c $<
+
+# Z80
 emu_z80: emu_z80.o cpu_z80.o
        ${CC} ${CFLAGS} -o $@ $^
 
diff --git a/basic_6800.s19 b/basic_6800.s19
new file mode 100644 (file)
index 0000000..27cda4d
--- /dev/null
@@ -0,0 +1,480 @@
+* see https://gitlab.com/retroabandon/altair-680-basic.git
+*
+* nick@jane:~/src/sim68xx/src/boards$ ./sim6800 basic.s19
+* Couldn't open symbol file
+* PC=ffd8 A:B=0000 X=0000 SP=0000 CCR=d0(11hInzvc)     [0]
+* ffd8 8e 00 f3        lds  #00f3
+* 
+* >g
+* ffd8: Running...
+* 
+* .J 0000
+* MEMORY SIZE? 32768
+* TERMINAL WIDTH? 80
+* WANT SIN-COS-TAN-ATN? Y
+* 
+* 26330 BYTES FREE
+* 
+* MITS ALTAIR 680 BASIC VERSION 1.1 REV 3.2
+* COPYRIGHT 1976 BY MITS INC.
+* 
+* OK
+
+ALTAIR BASIC for 6800 
+May 20, 2002
+MITS-RAW.BIN      
+
+S11300000D7600F37E18F97E033C00004838002C7E
+S113001000000000000000000000000000000000DC
+S113002000000000000000000000000000000000CC
+S113003000000000000000000000000000000000BC
+S113004000000000000000000000000000000000AC
+S1130050000000000000000000000000000000009C
+S1130060000000000000000000000000000000008C
+S1130070000000000000000000000000000000007C
+S1130080000000000000000000000000000000006C
+S1130090000000000000000000000000000000005C
+S11300A0000000000000000000000000000000004C
+S11300B00000000000000000000000000000007CC0
+S11300C000C926037C00C8B6EA60813A240881206E
+S11300D027ED803080D039FFEA607E03C70000003E
+S11300E006060606060604FFFDFFFDFFFFFFFDFDF5
+S11200F0FFFDFD00FDFFFDFDFDFFFDFFFF646053
+S11300FFFD00000000000000000000000000804F21
+S113010FC752007E18F90CD80E341490150414AA93
+S113011F0D4C0E150E4016FC17DC12D21768181270
+S113012F1818185E18A2118D10A90EF1114A10C9D2
+S113013F10B510D110EE10F57911C77911BC7B13DE
+S113014F0A7B13BE7F1705500B96460B95454EC47D
+S113015F464FD24E4558D4444154C1494E5055D4BC
+S113016F4449CD524541C44C45D4474F54CF5255C1
+S113017FCE49C6524553544F52C5474F5355C25299
+S113018F45545552CE5245CD53544FD04FCE4E5564
+S113019F4CCC574149D44445C6504F4BC550524996
+S11301AF4ED4434F4ED44C4953D4434C4541D24E75
+S11301BF45D7544142A854CF46CE535043A8544830
+S11301CF45CE4E4FD4535445D0ABADAAAFDE414EBE
+S11301DFC44FD2BEBDBC5347CE494ED44142D35572
+S11201EF53D24652C5504FD35351D2524EC44CE3
+S11301FE4FC74558D0434FD35349CE5441CE4154A3
+S113020ECE504545CB4C45CE535452A45641CC41C9
+S113021E53C3434852A44C454654A45249474854E8
+S113022EA44D4944A400062E056509B3070608DA51
+S113023E0C200900079106C906A30727061206AD6E
+S113024E06E0073A062D07470664119B0E4F1194DC
+S113025E07FA06520514067504E24EC653CE52C76B
+S113026E4FC446C34FD64FCD55D342D344C42FB0FB
+S113027E49C454CD4FD34CD353D443CE55C6204545
+S113028E52524FD20020494EA0000D0A4FCB0D0AF8
+S113029E000D0A42524541CB003008080808C6102A
+S11302AEDF71A60080812614EE01DF73DE9E27081F
+S11302BE9C7327088D4220E6DE73DF9EDE714D3976
+S11302CE8D2007369F780F9EA3DEA50809A600365B
+S11302DE9CA926F8319FA79E783206394F58DB81A8
+S11202EE9980CB268900251B9F789178250622BD
+S11302FD13D179220F394FDF71DB7299719773D74F
+S113030D74DE7339C60CBD05007F0111BD0834BD03
+S113031D0893CE02688DDFA600BD0895A601BD0821
+S113032D95CE028BBD0879DE8A082703BD15D77FCC
+S113033D0111CE0297BD0112862C970FBD03ECDF80
+S113034DC8BD00BF27F2250BCEFFFFDF8ABD042EEB
+S113035D7E05EFBD0767DE8EDF0EBD042ED75ABDB9
+S113036D04C42522D6AAE00186FFDB7D997C977C07
+S113037DD77D07369F780FAE003432A700089C7CDA
+S113038D26F89E7832069610272B967CD67D97A557
+S113039DD7A6DB5A890097A3D7A4BD02CE07369FF3
+S11303AD780F8E000B32A700089CA726F89E783292
+S11303BD07DEA3DF7CBD04EEDE7AA600AA012603C8
+S11303CD7E0345DFD80808080808A60026FB087E2A
+S11303DD00D7BD0895095A260BBD0895BD0834CE26
+S11203ED0010C6018D2B81072714810D27208155
+S11303FC2025F2817D24EE814027DF815F27D4A75D
+S113040C00C1482403085C8C8607BD089520D67E61
+S113041C082F37BDFF001733847F810F2603730128
+S113042C11397F005D7A00C9CE000FDFBD9F7807BC
+S113043C975F010F9EC833C1202732D759C1222799
+S113044C55965D2628C13F2604C6952020C130252B
+S113045C04C13C2518CE015B9EC85F08328120275D
+S113046CFBA00027F681802632CA80DEBD9FC89E81
+S113047C78965F0608DFBDE700272FC03A2704C132
+S113048C492602D75DC05426A9D7590F9EC8335D9F
+S113049C27DBD15927D708E70020F39EC85CA600B8
+S11304AC082AFBA60026B53320C1E701E702D6BE15
+S11304BCC00BCE000FDFC839968EDE7AE600EA0157
+S11304CC2710A1022208250BD68FE1032305EE0089
+S11304DC20EA0DDFA93926FBDE7A6F00086F0008CD
+S11204ECDF7CDE7A09DFC8DE88DF84BD0612DE1E
+S11304FB7CDF7EDF80CE0065DF6130EE009E824FB5
+S113050B3697909791975E6E0022ADBD076726A82C
+S113051B32328DA5A600AA0126037E033CBD061824
+S113052BBD0834A602E60308080808DF71BD15E010
+S113053B8620DE71BD0895A600084D27D72AF580C5
+S113054B7FDF71CE015C4A2707E600082AFB20F601
+S113055BA6002BDE08BD089520F68680975EBD07A6
+S113056B91BD02A731312604BD030635C608BD0271
+S113057BEABD070BDF71D67237D67137D68B37D6F8
+S113058B8A37C69BBD0B3FBD0A0DBD0A0BD6B3CA3A
+S113059B7FD4B0D7B0CE05A67E0AABCE12B1BD14B4
+S11305AB38BD00C781A02606BD00BFBD0A0BBD1414
+S11305BB83BD0AA5D69F37D69E378681368D4EDEF0
+S11305CBC8DF92A6002707813A27197E0B4908A694
+S11305DB0008AA000C07275408A600978A08A6004F
+S11205EB978BDFC8BD00BF8D0220D2276B8080A5
+S11305FA24037E0791811A24D34816CE0234BD03FC
+S113060A03EE00BD00BF6E00DE7A09DF9639BDFF36
+S113061A2424FABD041E36B6F00284023227028666
+S113062A0381030D263307DEC8DF923131DE8A08DF
+S113063A270709DF8CDE92DF907F0111CE029E0626
+S113064A24037E03317E033C260FC620DE90260354
+S113065A7E0313DFC8DE8CDF8A39BD113B26FA5CC0
+S113066AD10C24045AD70A397E0D4C2729BD0CD142
+S113067ABD00C726E49688D689D0B292B12514DE85
+S113068A829782D783C02882002506D07D927C2453
+S113069A05DF827E03117E04F326037E04EEBD0485
+S11306AAF32014C603BD02EAD6C937D6C837D68B97
+S11306BA37D68A37868C36BD00C78D037E05C8BDFA
+S11306CA07678D4008968E918A2202DE7ABD04C895
+S11306DA251509DFC83926FD86FF979EBD02A73571
+S11206EA810B270BC6048CC60E7E03137E0B49AF
+S11306F93233D78A33D78B33D7C833D7C98D03DF7E
+S1130709C839C63A865FD7585FDEC817D65897588E
+S1130719A60027ED1127EA08812227EF20F2BD0A56
+S113072919BD00C781882705C69EBD0B3F96AF2614
+S1130739058DD2DFC839BD00C725857E05F6BD11F3
+S11307493B36818C2704818826A37A00B226043299
+S11307597E05F8BD00BF8D06812C27EE3139CE0008
+S113076900DF8E24F880309758968ED68F81182210
+S1130779D758495849DB8F998E5849DB58890097CE
+S11307898ED78FBD00BF20DBBD0C29DF9EC6A9BD56
+S11307990B3F965C36BD0A193246BD0A0F2749DE5E
+S11307A9B19682A10222232506D683E103241B964E
+S11307B97C91B122152506D67CD1B2220DE600BD65
+S11307C90F01DEADBD105FCE00AFDFADBD109B07DD
+S11307D9369F780FDEAD35DE9E32A7003232A7028E
+S11207E932A7039E783206397E1452BD087CBDB8
+S11307F800C72738274E819A275C819D2758812C6A
+S11308082743813B2766BD0A19DEB1965C26DDBD08
+S113081815EFBD0F0ADEB1960BAB00910C23028DC8
+S11308280B8D518D6320C86F00CE000F860D970B7A
+S11308388D5B860A8D5737D60A27064F8D4F5A2661
+S1130848FBD70B3339D60BD10D25048DDF201DC002
+S11308580E24FC50201136BD1138812926673281B7
+S11308689D2704D00B23058D1F5A26FBBD00BF20EE
+S113087883BD0F0BBD107D5C5A27C9A6008D0E08D9
+S1130888810D26F48DB020F086208C863F7D0111E1
+S11308982617368120250B960B910C26028D8D4C3C
+S11308A8970B323716BDFF8133393F5245444F20E9
+S11308B846524F4D2053544152D40D0A00965F2797
+S11308C807DE94DF8A7E0B49CE08B18DA4DE92DF61
+S11308D8C8397F01118122260ABD0B0AC63BBD0B0C
+S11208E83F8D91BD0E458D099610260F0C077E8E
+S11308F706358D988D937E03ECDE96864F975FDFE2
+S113090798BD0C29DF9EDEC8DF8EDE98A600260977
+S1130917965F264EBD08938DD9DFC8BD00BFD65C50
+S1130927271CDEC897588122270709863A975886D5
+S11309372C9759BD0F11BD116CBD07A82006BD1515
+S113094726BD1452BD00C72707812C27037E08C57F
+S1130957DEC8DF98DE8EDFC8BD00C7272ABD0B3D82
+S1130967209FDFC8BD070B4D2614A601C606AA02A1
+S1130977274DA6039794A60497950808080808A680
+S113098700818326DD2092DE98D65F27037E061535
+S1130997A6002706CE09A17E0879393F4558545247
+S11309A7412049474E4F5245C40D0A002605CE0043
+S11309B7002003BD0C29DF9EBD02A72704C6002023
+S11309C74E35080808DF71BD143830A60797B3DE23
+S11309D79EBD11C4BD1452DE710808080808BD1471
+S11209E7AE30E007270CEE0CDF8A30EE0EDFC8CF
+S11309F67E05C8C610BD030335BD00C7812C26F08D
+S1130A06BD00BF8DAF8D0C6D0D76005C288DC618AC
+S1130A167E0313DEC809DFC84FC63736C601BD02DA
+S1130A26EABD0AEB7F00A2BD00C780A82514810396
+S1130A36241081014998A291A2255D97A2BD00BF09
+S1130A4620E8D6A2262D246B8B072467995C2603FF
+S1130A567E102589FF16481B16CE0147BD030332B7
+S1130A66A10024568DA1368D23DEA03226184D27EB
+S1130A7671205078005C59DEC809DFC8CE0A89D7D0
+S1130A86A220DC640BBCA100243920DAA60236A617
+S1130A9601368D07D6A220827E0B49D6B3A6003036
+S1130AA6EE00313137D6B237D6B137D6B037D6AFF6
+S1130AB6376E00CE0000324D272881642703BD0A15
+S1130AC60DDFA033815A271C817D271854D7603245
+S1130AD697B633D7B733D7B833D7B933D7BAD8B32A
+S1120AE6D7BBD6AF397F005C8D5624037E15260F
+S1130AF5BD0C85245C812E27F481A2274C81A12776
+S1130B05E881222608DEC8BD0F0B7E116C819F2665
+S1130B1511865ABD0A20BD0CD896B1D6B243537E70
+S1130B250E34819C26037E0E8D80AB24308D06BD4C
+S1130B350A19C6298CC6288CC62CDEC8A60011261F
+S1130B45037E00BFC6027E0313867DBD0A207E1781
+S1130B553BBD0C29DFB1965C268B7E143816588D67
+S1130B65E037C127251A8DCDBD0A198DCBBD0A0ED7
+S1130B7532D6B237D6B13736BD113B3237162003DC
+S1130B858DAB33CE0119BD0303EE00AD007E0A0D16
+S1130B95864F975ABD0CD8DEB1DF58BD1469BD0C1C
+S1130BA5D89658D6597D005A260694B1D4B2200455
+S1130BB59AB1DAB27E0E34BD0A0F261096BA8A7F30
+S1130BC594B797B7CE00B6BD14AE20407F005C7ACB
+S1130BD500A2BD107DD7AFDFB1DEB8BD107F96AFE3
+S1120BE510270786012403D6AF4097B307369F26
+S1130BF4780F35DEB15C095A2604D6B3200B3208CB
+S1130C04A10027F3C6FF2401509E783206CB015974
+S1130C14D4602702C6FF7E1492BD0B3D168D0ABD17
+S1130C2400C726F5395FBD00C7D75B979ABD00C7D7
+S1130C348D4F24037E0B495FD75CBD00BF25048D13
+S1130C4440250A16BD00BF25FB8D3624F7812426D2
+S1130C540873005CCB80BD00BFD79B9B5E802826B5
+S1130C64037E0CE97F005EDE7C969AD69B9C7E27ED
+S1130C7419A1002604E101274808080808080820E7
+S1130C84EC81412504805B80A5393236810B26042E
+S1130C94CE0D0539DE80DFA5C606BD0303DFA3DE62
+S1130CA47EDFA9BD02CEDEA3DF80DEA7DF7EDEA960
+S1130CB4969AD69BA700E7014FA702A703A704A708
+S1130CC4050808DF9C3990800000BD00BFBD0A0BF5
+S1130CD496B32B7496AF81902508CE0CCABD14AE7E
+S1120CE426667E14DA965B36965C365F37D69BAF
+S1130CF337D69A378DD533D79A33D79B3330A6015A
+S1130D0336A6003696B1A70096B2A7015CBD00C70C
+S1130D13812C27D9D75ABD0B3732975C32975BDEC8
+S1130D237E9C802729969AA1002606969BA10127DB
+S1130D3309A602E603BD030420E7C612965B260B4D
+S1130D43D65AE1042767C6108CC6087E03138604AB
+S1130D5397BE7F00BD969AA700969BA701D65AE734
+S1130D6304BD02EADFA3C60B4F7D005B27063233C3
+S1130D73CB018900A705E7068D6F97BDD7BE080889
+S1130D837A005A26E1BD030425BCBD02F0C02182CA
+S1130D93009780D7814F09A7059C7126F9DEA39696
+S1130DA380D0A4E70392A3A702965B263BE604D76D
+S1130DB35A4F5F97BDD7BE3297B133D7B2A105253A
+S1130DC306224CE106244896BE9ABD0C27048D19CD
+S1130DD3DBB299B108087A005A26D858495849CB46
+S1120DE3058900BD0304DF9C39861097A7A60578
+S1130DF29778A60697794F5F584925147800BE79EB
+S1130E0200BD2406DB79997825067A00A726E939FC
+S1130E127E0D499F789678D679CE00807D005C2736
+S1130E220DBD107DBD0F86CE00829684D685E0016D
+S1130E32A2007F005C97B0D7B1C6907E1499D60BFE
+S1130E424F20EFDE8A0826A1C6167E03138D298D54
+S1130E52F2BD0B3AC680D75EBD0C298D2BBD0B3774
+S1130E62C6A9BD0B3FDEAB96C8D6C9A700E701965B
+S1130E729CD69D8D757E0706C69CBD0B3FC680D74A
+S1130E825E8A80BD0C2FDFAB7E0A0D8DEBD6AC37AC
+S1130E92D6AB37BD0B328DF033D7AB33D7ACDEAB29
+S1130EA2C622EE0227A4DF9CA60336A60236A601BA
+S1130EB236A60036BD1454DEABD6C937D6C837EED3
+S1130EC200DFC8D69D37D69C37BD0A0B33D79C3377
+S1130ED2D79DBD00C727037E0B4933D7C833D7C973
+S1120EE2DE9C32A70032A7013233A702E703399F
+S1130EF1BD0A0DCE00FFBD15F23131CE00FE200A30
+S1130F01DFAD8D53DFB1D7AF390986229758975991
+S1130F1108DFBBDFB1C6FF5CA600270E0891582786
+S1130F2104915926F28122270109DFBDD7AF96BB6F
+S1130F3126078DCCDEBBBD1061DE618C00712605F8
+S1130F41C61E7E0313BD145486FF975CDF63DFB1B5
+S1130F5108080808DF61397F005D375386FFD985AA
+S1130F619984918225112204D183250B9784D785F5
+S1130F71DE8408DF863339C61A965D26C58D06736D
+S1130F81005D3320D5DE88DF84CE0000DFABDE8256
+S1130F91DFA9CE00659C6127048D3B20F8DE7C9C93
+S1130FA17E27048D2B20F8DFA3DEA39C80274EA689
+S1130FB102E603DBA499A397A3D7A4A6012AEAE630
+S1130FC1044F58CB05BD03049CA327DF8D0820F8EB
+S1130FD1A60108082A22E600271EA60291842218E7
+S1120FE1E6032504D185241091A9250C2204D1FF
+S1130FF0AA2306DFAB97A9D7AA0808080839DEABED
+S113100027FB4FE6005ADBAA99A997A5D7A6DE8449
+S1131010DFA3BD02D0DEAB96A7D6A8A702E703DE06
+S1131020A7097E0F8896B23696B136BD0AEBBD0A83
+S11310300E3297BB3297BCDEBBE600DEB1EB002478
+S113104005C61C7E0313BD0F01DEBBE6008D10DE5A
+S1131050AD8D2C8D0CDEBB8D26BD0F3A7E0A2DEE98
+S11310600207369F780F35DE865C200432A700081D
+S11310705A26F9DF869E78320639BD0A0EDEB1E6BD
+S1131080008D182613EE06099C84260A37DB859901
+S1131090849784D785330839EE02399C632609DFA7
+S11310A06109090909DF634F398D037E0E428DCA38
+S11310B07F005C5D39BD113EC601BD0F5896B2BDBF
+S11310C00F05A70031317E0F3A8DE32768E6002033
+S11310D0DA8D454FE1002303E6004F3736BD0F0399
+S11210E0DEAD8D9B33BD030333BD106120D88D6E
+S11310EF28A6001020DFC6FFD7B28D4C8129270513
+S11310FFBD0B3D8D378D125F4AA10024CF16E00042
+S113110F50D1B223C7D6B220C3BD0B3733D77833F0
+S113111FD77931313233D7AD33D7AEDEADD6793758
+S113112FD6783716263B7E0D4CBD00BFBD0A0BBDCE
+S113113F0CD496B126F0D6B27E00C7BD10AE2603EE
+S113114F7E122FBD0303A600366F00DEC8DFBDDE9F
+S113115F71DFC88DE3BD152632DE73A700DEBDDF58
+S113116FC839BD0A0B8D07DF8EBD0B3D20BE96B36C
+S113117F2BB496AF819022AEBD14DADEB1398DEE69
+S113118FE6007E0E428DDBDE8EE700398DD4D79ECE
+S113119F5FBD00C727028DD1D79FDE8EA600989F13
+S11311AF949E27F839CE16E6200BBD13557300B362
+S11311BF7300BB2003BD13555D26037E1469CE0057
+S11311CFB6162761D0AF275E2B0A97AF96BA97B39F
+S11211DFCE00AF50C1F82F4E4F6401BD12A8D6F9
+S11311EEBB2A0963016302630343890097BC96B269
+S11311FE99B997B296B199B897B196B099B797B085
+S113120E172A4025028D585F96B0262D96B197B0B9
+S113121E96B297B196BC97B27F00BCCB08C1202D75
+S113122EE74F97AF97B3398D650C20B35C7800BC4C
+S113123E7900B27900B17900B02AF196AF1097AF68
+S113124E23DF8C25057800BC200E7C00AF27277683
+S113125E00B07600B17600B224048D0F27EC3973FA
+S113126E00B37300B07300B17300B2DEB108DFB126
+S113127E26037C00B039C60A7E0313CE0074A6037F
+S113128E97BCA602A703A601A70296B5A701CB0891
+S113129E2FEC96BCC008270A670166026603465CFB
+S11312AE26F6398100000002801956AA807622F1B2
+S11312BE8238AA45803504F3813504F3808000001A
+S11312CE80317218BD14832E037E0D4CCE12C2963D
+S11212DEAF808036868097AFBD11C4CE12C6BDD7
+S11312ED13BCCE12B1BD11B9CE12B5BD17A1CE121C
+S11312FDCABD11C433BD15B1CE12CE8D4B27488D49
+S113130D638600977597769777D6B28D0ED6B18D85
+S113131D0AD6B08D0BBD142F7E121526037E1289AD
+S113132D0D9675562721241096779BB99777967647
+S113133D99B89776967599B746977576007676002F
+S113134D777600BC0C20DA39A60197BA168A8097F5
+S113135DB7D8B3D7BBA60297B8A60397B9A600977B
+S113136DB6D6AF394D27199BAF464928138B8097B5
+S113137DAF26037E123296BB97B33996B343200240
+S113138D32322B037E122F7E1284BD1476270F8BDF
+S113139D0225F47F00BBBD11D07C00AF27E9398451
+S11313AD200000BD1476CE13AC5FD7BB8D7D8C8D24
+S11313BD97276A7000AF8DAC7C00AF27CACE00753D
+S11313CDC603D75AC60196B091B7260D96B191B8FA
+S11213DD260796B291B926010D0759240CE70093
+S11313EC087A005A2B2E2728C60106250F7800B937
+S11313FC7900B87900B725E22BCD20DE96B990B2EE
+S113140C97B996B892B197B896B792B097B720DDC2
+S113141CC64020D6565656D7BC8D087E1215C61417
+S113142C7E0313DE75DFB0967797B239E601D7B336
+S113143CCA80D7B0E600EE02DFB1D7AF39CE00A731
+S113144C2006CE00A38CDE9E96AFA70096B38A7FAF
+S113145C94B0A70196B1A70296B2A7033996BA978E
+S113146CB3DEB6DFAFDEB8DFB139DEB0DFB7DEB284
+S113147CDFB996AF97B639D6AF2708D6B359C6FF9E
+S113148C250150398DF1D7B07F00B1C68896B08054
+S113149C80D7AF860097B297BC97B37E12117F00AA
+S11314ACB339E60027D1E601D8B32BCFD6AFE10090
+S11314BC2617E601CA7FD4B0E101260DD6B1E102AC
+S11314CC2607D6B2E00326013956D8B320AFD6AFDF
+S11214DC2741C09896B32A067300B5BD1270CE8F
+S11314EB00AFC1F82E07BD129C7F00B5397F00B544
+S11314FB96B3497600B07E12A8D6AFC198241B8D43
+S113150BCED7BC96B3D7B38080869897AF96B29755
+S113151B587E1211D7B0D7B1D7B239CE0000DFB392
+S113152BDFAFDFB1DFA9DFA7256B812D26057300A4
+S113153BB42004812B2605BD00BF2559812E272DF0
+S113154B8145262EBD00BF256981A2270E812D273B
+S113155B0A81A12709812B270520087300AABD0046
+S113156BBF254F7D00AA270A7000A920057300A888
+S113157B26C596A990A797A927142A0ABD13B07C50
+S113158B00A926F82008BD13977A00A926F896B46B
+S113159B2A887E173BD6A7D0A8D7A736BD13973377
+S11315ABC0308D022091BD144EBD1492CE00A37E8B
+S11315BB11C4D6A95858DBA95880301B97A9209E73
+S11315CB91434FF8947423F794742400CE02928DB4
+S11215DB10968AD68B97B0D7B1C6900DBD149DCC
+S11315EA8D037E0879CE01008620D6B32A02862D81
+S11315FAA70097B3DFBD088630D6AF26037E16DE72
+S113160A4FC1802208CE15D3BD130886FA97A7CEF8
+S113161A15CFBD14B82E10CE15CBBD14B82E10BDDF
+S113162A13977A00A720F0BD13B07C00A720E0BD71
+S113163A11B4BD14DAC60196A78B072B08810824B6
+S113164A044A1686024A4A97A9D7A72E11DEBD86EE
+S113165A2E08A7005D2705863008A700DFBDCE1631
+S113166AEAC68096B2AB0297B296B1A90197B1962F
+S113167AB0A90097B05C565928E92403C00B50CB93
+S113168A2F080808DF9CDEBD0817847FA7007A00AC
+S113169AA72605862E08A700DFBDDE9C53C4808CCE
+S11316AA16FC26BFDEBDA60009813027F9812E2744
+S11316BA0108862BD6A9271E2A03862D50A702863F
+S11316CA45A701862F4CC00A24FBCB3AA703E7049B
+S11216DA6F052004A7006F01CE010039800000C6
+S11316E900FE7960002710FFFC18000064FFFFF674
+S11316F9000001BD1476CE16E6BD143827614D26C7
+S1131709037E1230CE00ABBD14545F96BA2A10BDC5
+S11317191504CE00AB96BABD14B8260343D658BDFA
+S1131729146B37BD12D2CE00ABBD13088D313246CE
+S113173924AA96AF27037300B3398138AA3B0774E7
+S1131749942E40772E4F707A88026E7C2AA0E67E0A
+S1131759AAAA507F7FFFFF8180000081000000BD9D
+S1131769144ECE17438D3D96AF818825037E138889
+S1131779BD150496588B8127F436CE12B1BD11C418
+S1131789BD1305CE00A3BD11B98DA7CE17478D177B
+S11317997F00BB32BD137139DFBDBD144E8D058D7C
+S11317A908CE00A37E1308DFBDBD1449DEBDE600E3
+S11317B9D7B408DFBD8DEDDEBD08080808DFBDBD5F
+S11317C911C4CE00A77A00B426EB399835447A6857
+S11217D928B146BD1483172B14CE010DBD14384F
+S11317E84D27E8CE17D48DBDCE17D8BD11C4D6B2B7
+S11317F896B097B2D7B07F00B396AF97BC86809760
+S1131808AFBD1215CE010D7E1454CE1881BD11C47E
+S1131818BD1476CE1885D6BABD13B7BD1476BD15DA
+S1131828047F00BB96B6D6AFBD11BCCE1889BD11D6
+S1131838B996B3362A0ABD11B496B32B0673006061
+S1131848BD173BCE1889BD11C4324D2A03BD173BC1
+S1131858CE188D7E17A1BD144E7F00608DB2CE00C8
+S1131868AB8DA4CE00A3BD14387F00B396608D065B
+S1131878CE00AB7E13BC3620C781490FDB83490FEA
+S1131888DB7F00000004861ED7BA87992664872365
+S1131898345886A55DE083490FDA96B3362A028D5B
+S11318A82096AF3681812505CE12B18DC6CE18CDCE
+S11318B88DA13281812506CE1881BD11B9324D2AF8
+S11318C8037E173B3908783BD74A7B846E027C2F0A
+S11218D8C1FE7D9A31747D5A3D847E917FC87E16
+S11318E74CBBE47FAAAA6C8100000000CE1A1FBD7E
+S11318F70879CEFFFFDF8A8E1B1B9F827F0111BDF4
+S11319070834CE0065DF61CE1AAABD0879BD08F98F
+S1131917DFC8BD00BF814127D34D2615CE1AB708AE
+S11319278637A700A10026174AA700A10027F020A1
+S11319370EBD00C7BD07674D27037E0B49DE8E0921
+S1131947DF88DF84CE1A43BD0879BD08F9DFC8BD37
+S113195700BF16271CBD0767968E26E8968F811051
+S113196725E2970C800E24FC40800E9B0C970D20DB
+S1131977088648970C8638970DC6CE86FFDB89996B
+S11319878825037E03119782D783CE1A0ABD087967
+S1131997BD08F9DFC8BD00BFCE18F28159272481DD
+S11319A7412704814E26E3CE0D4CFF0133CE18A206
+S11319B78141270FCE0D4CFF012DFF0131FF012F70
+S11319C7CE18124FA70008DF7ADE822B058C1B1B6B
+S11219D72BB1DF82967AD67BBD02F0BD0834D6E1
+S11319E683D07B9682927ABD15E0CE1A52BD0879D1
+S11319F6CE0879FF0113BD04E486BD9704CE050025
+S1131A06DF057E033C57414E542053494E2D434F28
+S1131A16532D54414E2D4154CE000D0A0C575249B4
+S1131A265454454E20425920524943484152442079
+S1131A36572E205745494C414E44AE0D0A00544595
+S1131A46524D494E414C2057494454C800204259EE
+S1131A5654455320465245C50D0A0D0A4D49545363
+S1131A6620414C5441495220363830204241534992
+S1131A76432056455253494F4E20312E312052456C
+S1131A865620332EB20D0A434F50595249474854F3
+S1131A962031393736204259204D49545320494E76
+S1131AA643AE0D0A004D454D4F52592053495AC570
+S1131AB600002049532049542052455455524E0D96
+S1131AC620424551204F55540D2042524120494E43
+S1121AD65441504520474554204E455854204311
+S1131AE548415241435445520D20454E440D000092
+S10F1AF5000000000000000000000000E1
+S9
+ ALTAIR 680B PROM MONITOR
+ ACIA VERSION 1.0
+S113FF008D2224FCC67FD1F3F4F001247439018DD1
+S113FF10EFC0302B3CC1092F0AC1112B34C1162E5E
+S113FF2030C00739F6F00057398DD5C05326FA8D05
+S113FF30CFC139271CC13126F04F8D17C002D7F924
+S113FF408D208D0F7A00F92705E7000820F44C274F
+S113FF50D820588DBA585858581BD7F88DB11BDB88
+S113FF60F8398DEFD7FA8DEBD7FBDEFA39165454F6
+S113FF7054548D0116C40FCB30C1392304CB07016F
+S113FF80018CC620378D9D5724FB33F7F00139DEF1
+S113FF90FA08DFFA96FA8DD596FB8DD18C8DC38D38
+S113FFA0E1A6008DC88DDB8DAAE7009EF6C60D8DF7
+S113FFB0D0C60A8DCCC62E8DC8BDFF00178DC38157
+S113FFC04C278C814A26048D996E00814D27CE8161
+S113FFD04E27BC815026D43B8E00F3C6033737F737
+S113FFE0F000F6F0022B19C404CAD1F7F0009FF612
+S113FFF09FFAD6F22B0A20B30100FFEE0104FFD8CA
+S9
diff --git a/basic_test.txt b/basic_test.txt
new file mode 100644 (file)
index 0000000..6a007bd
--- /dev/null
@@ -0,0 +1,61 @@
+J0000
+80
+Y
+10 PRINT "HELLO"
+20 REM P9=X9^Y9 === GOSUB 60030
+30 X9=.3:Y9=.7:GOSUB 60030:PRINT .3^.7,P9
+40 REM L9=LOG(X9) === GOSUB 60090
+50 X9=.4:GOSUB 60090:PRINT LOG(.4),L9
+60 REM E9=EXP(X9) === GOSUB 60160
+70 X9=.5:GOSUB 60160:PRINT EXP(.5),E9
+80 REM C9=COS(X9) === GOSUB 60240
+90 X9=.6:GOSUB 60240:PRINT COS(.6),C9
+100 REM T9=TAN(X9) === GOSUB 60280
+110 X9=.7:GOSUB 60280:PRINT TAN(.7),T9
+120 REM A9=ATN(X9) === GOSUB 60310
+130 X9=.8:GOSUB 60310:PRINT ATN(.8),A9
+140 END
+60000 REM EXPONENTIATI0N: P9=X9^Y9
+60010 REM NEED: EXP, LOG
+60020 REM VARIABLES USED: A9,B9,C9,E9,L9,P9,X9,Y9
+60030 P9=1 : E9=0 : IF Y9=0 THEN RETURN
+60040 IF X9<0 THEN IF INT(Y9)=Y9 THEN P9=1-2*Y9+4*INT(Y9/2) : X9=-X9
+60050 IF X9<>0 THEN GOSUB 60090 : X9=Y9*L9 : GOSUB 60160
+60060 P9=P9*E9 : RETURN
+60070 REM NATURAL LOGARITHM: L9=LOG(X9)
+60080 REM VARIABLES USED: A9,B9,C9,E9,L9,X9
+60090 E9=0 : IF X9<=0 THEN PRINT "LOG FC ERROR"; : ST0P
+60095 A9=1 : B9=2 : C9=.5 : REM THIS WILL SPEED UP THE FOLLOWING
+60100 IF X9>=A9 THEN X9=C9*X9 : E9=E9+A9 : GOTO 60100
+60110 IF X9<C9 THEN X9=B9*X9 : E9=E9-A9 : GOTO 60110
+60120 X9=(X9-.707107)/(X9+.707107) : L9=X9*X9
+60130 L9=(((.598979*L9+.961471)*L9+2.88539)*X9+E9-.5)*.693147
+60135 RETURN
+60190 REM EXPONENTIAL: E9=EXP(X9)
+60150 REM VARIABLES USED: A9,E9,L9,X9
+60160 L9=INT(1.4427*X9)+1 : IF L9<1E7 THEN 60180
+60170 IF X9>0 THEN PRINT "EXP OV ERR0R"; : STOP
+60175 E9=0 : RETURN
+60180 E9=.693147*L9-X9 : A9=1.32988E-3-1.41316E-4*E9
+60190 A9=((A9*E9-8.30136E-3)*E9+4.16574E-2)*E9
+60195 E9=(((A9-.166665)*E9+.5)*E9-1)*E9+1 : A9=2
+60197 IF L9<=0 THEN A9=.5 : L9=-L9 : IF L9=0 THEN RETURN
+60200 FOR X9=1 TO L9 : E9=A9*E9 : NEXT X9 : RETURN
+60210 REM COSINE: C9=COS(X9)
+60220 REM N.B. SIN MUST BE RETAINED AT LOAD-TIME
+60230 REM VARIABLES USED: C9,X9
+60240 C9=SIN(X9+1.5708) : RETURN
+60250 REM TANGENT: T9=TAN(X9)
+60260 REM NEEDS COS. (SIN NUST BE RETAINED AT LOAD-TIME)
+60270 REM VARIABLES USED: C9,T9,X9
+60280 GOSUB 60240 : T9=SIN(X9)/C9 : RETURN
+60290 REM ARCTANGENT: A9=ATN(X9)
+60300 REM VARIABLES USED: A9,B9,C9,T9,X9
+60310 T9=SGN(X9): X9=ABS(X9): C9=0 : IF X9>1 THEN C9=1 : X9=1/X9
+60320 A9=X9*X9 : B9=((2.86623E-3*A9-1.61657E-2)*A9+4.29096E-2)*A9
+60330 B9=((((B9-7.5289E-2)*A9+.106563)*A9-.142089)*A9+.199936)*A9
+60340 A9=((B9-.333332)*A9+1)*X9 : IF C9=1 THEN A9=1.5708-A9
+60350 A9=T9*A9 : RETURN
+RUN
+                                                                                                                                                                                                
+PRINT "DONE"
diff --git a/doc/BASIC Manual 75.pdf b/doc/BASIC Manual 75.pdf
new file mode 100644 (file)
index 0000000..668d0af
Binary files /dev/null and b/doc/BASIC Manual 75.pdf differ
diff --git a/doc/Undocumented Flags · hoglet67_Z80Decoder Wiki.pdf b/doc/Undocumented Flags · hoglet67_Z80Decoder Wiki.pdf
new file mode 100644 (file)
index 0000000..d34ea65
Binary files /dev/null and "b/doc/Undocumented Flags \302\267 hoglet67_Z80Decoder Wiki.pdf" differ
diff --git a/doc/z80-documented.pdf b/doc/z80-documented.pdf
new file mode 100644 (file)
index 0000000..52be048
Binary files /dev/null and b/doc/z80-documented.pdf differ
diff --git a/emu_6800.c b/emu_6800.c
new file mode 100644 (file)
index 0000000..02b40b7
--- /dev/null
@@ -0,0 +1,244 @@
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#if ALT_BACKEND
+#include "sim68xx/inc/base/cpu.h"
+#include "sim68xx/inc/arch/m68xx/instr.h"
+#include "sim68xx/inc/arch/m68xx/reg.h"
+#else
+#include "cpu_6800.h"
+#endif
+
+#define REG_TRACE 0
+#define MEM_TRACE 0
+
+#define MEM_SIZE 0x10000
+uint8_t mem[MEM_SIZE];
+
+void load_s19(char *name) {
+  FILE *fp = fopen(name, "r");
+  if (fp == NULL) {
+    perror(name);
+    exit(EXIT_FAILURE);
+  }
+
+  char line[0x100];
+  while (fgets(line, 0x100, fp)) {
+    for (char *p = line; *p; ++p)
+      if (*p == '\n') {
+        *p = 0;
+        break;
+      }
+
+    // allow comments and concatenation
+    if (line[0] != 'S' || line[1] != '1')
+      continue;
+
+    uint8_t buf[0x7f];
+    int len;
+    for (len = 0; len < 0x7f; ++len) {
+      char *p = line + 2 + len * 2;
+      if (*p == 0)
+        break;
+      if (*p == '\n') {
+        *p = 0;
+        break;
+      }
+      uint8_t c = p[2];
+      p[2] = 0;
+
+      char *q;
+      buf[len] = (uint8_t)strtol(p, &q, 16);
+      p[2] = c;
+      if (q != p + 2) {
+        fprintf(stderr, "not hex byte: %s\n", p);
+        exit(EXIT_FAILURE);
+      }
+    }
+
+    if (len < 4) {
+      fprintf(stderr, "too short: %s\n", line);
+      exit(EXIT_FAILURE);
+    }
+
+    uint8_t checksum = 0;
+    for (int i = 0; i < len; ++i)
+      checksum += buf[i];
+    if (checksum != 0xff) {
+      checksum -= 0xff + buf[len - 1];
+      fprintf(
+        stderr,
+        "checksum %02x, should be %02x\n",
+        checksum,
+        buf[len - 1]
+      );
+      exit(EXIT_FAILURE);
+    }
+
+    if (len != buf[0] + 1) {
+      fprintf(stderr, "incorrect length: %s\n", line);
+      exit(EXIT_FAILURE);
+    }
+    len -= 4;
+
+    int addr = (buf[1] << 8) | buf[2], end_addr;
+    end_addr = addr + len;
+    if (end_addr < addr || end_addr > MEM_SIZE) {
+      fprintf(stderr, "invalid load range: [0x%x, 0x%x)\n", addr, end_addr);
+      exit(EXIT_FAILURE);
+    }
+    memcpy(mem + addr, buf + 3, len);
+  }
+
+  fclose(fp);
+}
+
+int read_byte(void *context, int addr) {
+  int data;
+  switch (addr) {
+  case 0xf001:
+    data = getchar();
+    switch (data) {
+    case '\n':
+      data = '\r';
+      break;
+    case 0x7f:
+      data = '\b';
+      break;
+    case EOF:
+      exit(EXIT_SUCCESS);
+      break;
+    }
+    break;
+  default:
+    data = mem[addr];
+    break;
+  }
+#if MEM_TRACE
+  fprintf(stderr, "addr=%04x rd=%02x\n", addr, data);
+#endif
+  return data;
+}
+
+void write_byte(void *context, int addr, int data) {
+#if MEM_TRACE
+  fprintf(stderr, "addr=%04x wr=%02x\n", addr, data);
+#endif
+  switch (addr) {
+  case 0xf000:
+    break;
+  case 0xf001:
+    data &= 0x7f;
+    switch (data) {
+    case '\r':
+      putchar('\n');
+      break;
+    case '\n':
+      break;
+    default:
+      putchar(data);
+      break;
+    }
+    break;
+  default:
+    mem[addr] = data;
+  }
+}
+
+#if ALT_BACKEND
+int nerrors;
+
+u_char mem_getb(u_int addr) {
+  return read_byte(NULL, addr);
+}
+
+u_int mem_getw(u_int addr) {
+  /* Make sure hi byte is accessed first */
+  u_char hi = mem_getb(addr);
+  u_char lo = mem_getb(addr + 1);
+  return (hi << 8) | lo;
+}
+
+void mem_putb(u_int addr, u_char value) {
+  write_byte(NULL, addr, value);
+}
+
+void mem_putw(u_int addr, u_int value) {
+  mem_putb(addr, value >> 8);          /* hi byte */
+  mem_putb(addr + 1, value & 0xFF);    /* lo byte */
+}
+#endif
+
+int main(int argc, char **argv) {
+  if (argc < 2) {
+    printf("usage: %s image.s19\n", argv[0]);
+    exit(EXIT_FAILURE);
+  }
+  load_s19(argv[1]);
+
+  mem[0xf000] = 3; // bit 0 = rdrf, bit 1 = tdre
+
+#if ALT_BACKEND
+  cpu_reset();
+
+  while (true) {
+#if REG_TRACE
+    fprintf(
+      stderr,
+      "pc=%04x d=%04x ix=%02x sp=%04x ccr=%02x hf=%d if=%d nf=%d zf=%d vf=%d cf=%d\n",
+      regs.pc,
+      (regs.accd.a << 8) | regs.accd.b,
+      regs.ix,
+      regs.sp,
+      regs.ccr | 0xc0,
+      (regs.ccr >> 5) & 1,
+      (regs.ccr >> 4) & 1,
+      (regs.ccr >> 3) & 1,
+      (regs.ccr >> 2) & 1,
+      (regs.ccr >> 1) & 1,
+      regs.ccr & 1
+    );
+#endif
+
+    instr_exec();
+  }
+#else
+  struct cpu_6800 cpu;
+  cpu_6800_init(&cpu, read_byte, NULL, write_byte, NULL);
+  cpu_6800_reset(&cpu);
+  cpu.regs.word.pc = entry_point;
+  cpu.regs.byte.s = 0xff;
+
+  while (true) {
+#if REG_TRACE
+    fprintf(
+      stderr,
+      "pc=%04x a=%02x x=%02x y=%02x s=%02x p=%02x cf=%d zf=%d if=%d df=%d vf=%d nf=%d\n",
+      cpu.regs.word.pc,
+      cpu.regs.byte.a,
+      cpu.regs.byte.x,
+      cpu.regs.byte.y,
+      cpu.regs.byte.s,
+      cpu.regs.byte.p,
+      cpu.regs.bit.cf,
+      cpu.regs.bit.zf,
+      cpu.regs.bit._if,
+      cpu.regs.bit.df,
+      cpu.regs.bit.vf,
+      cpu.regs.bit.nf
+    );
+#endif
+
+    int pc = cpu.regs.word.pc;
+    cpu_6800_execute(&cpu);
+    if (pc == cpu.regs.word.pc) {
+      printf("hung at %04x\n", pc);
+      break;
+    }
+  }
+#endif
+
+  return 0;
+}
diff --git a/sim68xx b/sim68xx
new file mode 160000 (submodule)
index 0000000..27b5518
--- /dev/null
+++ b/sim68xx
@@ -0,0 +1 @@
+Subproject commit 27b551853274856ca0f7c50c5a2108d98f00d11d