From e45ce4000d133cc6aadf9d61395da6a32001e871 Mon Sep 17 00:00:00 2001 From: Peter Weingartner Date: Sun, 11 Aug 2024 17:48:00 -0400 Subject: [PATCH] Flash-ready version Tweaks needed to build a flashable version of the toolbox. --- roms/f256k/README.md | 12 + roms/f256k/toolbox-00.bin | Bin 0 -> 8192 bytes roms/f256k/toolbox-01.bin | Bin 0 -> 8192 bytes roms/f256k/toolbox-02.bin | Bin 0 -> 8192 bytes roms/f256k/toolbox-03.bin | Bin 0 -> 8192 bytes roms/f256k/toolbox-04.bin | Bin 0 -> 8192 bytes roms/f256k/toolbox-05.bin | Bin 0 -> 8192 bytes roms/f256k/toolbox-06.bin | Bin 0 -> 8192 bytes roms/f256k/toolbox-07.bin | Bin 0 -> 8192 bytes roms/f256k/toolbox-08.bin | Bin 0 -> 8192 bytes roms/f256k/toolbox-09.bin | Bin 0 -> 8192 bytes roms/f256k/toolbox-0A.bin | Bin 0 -> 8192 bytes roms/f256k/toolbox-0B.bin | Bin 0 -> 8192 bytes roms/f256k/toolbox-0C.bin | Bin 0 -> 8192 bytes roms/f256k/toolbox-0D.bin | Bin 0 -> 8192 bytes roms/f256k/toolbox-0E.bin | Bin 0 -> 8192 bytes roms/f256k/toolbox-0F.bin | Bin 0 -> 8192 bytes roms/f256k/toolbox-3F.bin | Bin 0 -> 8192 bytes roms/f256k/toolbox.bin | Bin 0 -> 524288 bytes roms/f256k/toolbox.csv | 17 ++ src/C256/addresses.csv | 55 ++++ src/C256/extras.s | 2 +- src/C256/f256-cstartup.s | 149 +++++++++++ src/C256/f256-flash.scm | 57 +++++ src/C256/{ld_lc_f256.scm => f256-ld_lc.scm} | 11 +- .../{flash-f256.scm => flash-f256-old.scm} | 15 +- src/C256/genaddresses.py | 19 ++ src/C256/iecll.s | 240 +++++++++--------- src/C256/interrupts.s | 144 +++++++++++ src/C256/macros.h | 86 +++++++ src/Makefile | 22 +- src/dev/interrupts_f256.c | 8 +- src/toolbox.c | 31 +-- src/toolbox.csv | 17 ++ src/version.h | 2 +- tests/make_test.bat | 2 + tests/test.csv | 1 + tests/test_boot.s | 65 +++++ utils/srec2bin.py | 66 +++++ 39 files changed, 859 insertions(+), 162 deletions(-) create mode 100644 roms/f256k/README.md create mode 100644 roms/f256k/toolbox-00.bin create mode 100644 roms/f256k/toolbox-01.bin create mode 100644 roms/f256k/toolbox-02.bin create mode 100644 roms/f256k/toolbox-03.bin create mode 100644 roms/f256k/toolbox-04.bin create mode 100644 roms/f256k/toolbox-05.bin create mode 100644 roms/f256k/toolbox-06.bin create mode 100644 roms/f256k/toolbox-07.bin create mode 100644 roms/f256k/toolbox-08.bin create mode 100644 roms/f256k/toolbox-09.bin create mode 100644 roms/f256k/toolbox-0A.bin create mode 100644 roms/f256k/toolbox-0B.bin create mode 100644 roms/f256k/toolbox-0C.bin create mode 100644 roms/f256k/toolbox-0D.bin create mode 100644 roms/f256k/toolbox-0E.bin create mode 100644 roms/f256k/toolbox-0F.bin create mode 100644 roms/f256k/toolbox-3F.bin create mode 100644 roms/f256k/toolbox.bin create mode 100644 roms/f256k/toolbox.csv create mode 100644 src/C256/addresses.csv create mode 100644 src/C256/f256-cstartup.s create mode 100644 src/C256/f256-flash.scm rename src/C256/{ld_lc_f256.scm => f256-ld_lc.scm} (81%) rename src/C256/{flash-f256.scm => flash-f256-old.scm} (72%) create mode 100644 src/C256/genaddresses.py create mode 100644 src/C256/interrupts.s create mode 100644 src/C256/macros.h create mode 100644 src/toolbox.csv create mode 100644 tests/make_test.bat create mode 100644 tests/test.csv create mode 100644 tests/test_boot.s create mode 100644 utils/srec2bin.py diff --git a/roms/f256k/README.md b/roms/f256k/README.md new file mode 100644 index 0000000..d0523cf --- /dev/null +++ b/roms/f256k/README.md @@ -0,0 +1,12 @@ +# ROM Files for the F256K + +This directory contains BIN files for programming the F256K flash memory with the Foenix Toolbox. + +## How to Install + +Currently, the toolbox must be installed by bulk programming the flash memory. +Using the FoenixMgr Python script, this can be done with the following command (substitute the device path or name for your F256K's USB debug port): + +``` +python FoenixMgr.zip --port {debug device name} --flash-bulk toolbox.csv +``` diff --git a/roms/f256k/toolbox-00.bin b/roms/f256k/toolbox-00.bin new file mode 100644 index 0000000000000000000000000000000000000000..cec34f66db3480b236c26074d7c3fcf224f9f92c GIT binary patch literal 8192 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 literal 0 HcmV?d00001 diff --git a/roms/f256k/toolbox-01.bin b/roms/f256k/toolbox-01.bin new file mode 100644 index 0000000000000000000000000000000000000000..80831b40f7ca5f53df3cb5942011b52feab9656a GIT binary patch literal 8192 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 literal 0 HcmV?d00001 diff --git a/roms/f256k/toolbox-04.bin b/roms/f256k/toolbox-04.bin new file mode 100644 index 0000000000000000000000000000000000000000..20db7a2b699a59c93426e45d1d805ed9876c6695 GIT binary patch literal 8192 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 ZVdAlHB8u2}`)2qii?=@u-;}BB{{T3@s=)vN literal 0 HcmV?d00001 diff --git a/roms/f256k/toolbox-06.bin b/roms/f256k/toolbox-06.bin new file mode 100644 index 0000000000000000000000000000000000000000..2e27cde59f07f83bfe33f9f788152e606e6a6545 GIT binary patch literal 8192 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 literal 0 HcmV?d00001 diff --git a/roms/f256k/toolbox-07.bin b/roms/f256k/toolbox-07.bin new file mode 100644 index 0000000000000000000000000000000000000000..cd2c586e4841c120f6b02ec7302af87d6ab42806 GIT binary patch literal 8192 zcmb7J4RBP~b-r)k+qZ9jwOYioNPyQ*fQ=I)h%qROF(wXV!Rs`2?1_y{YsY3H%1k|z zy8dCB`o)ixK$Gbzp4P}|60ddVA+Dwqk!dHHW-=iaB}JK}*{MmJrfEw=tiU*sO~%+y zgR%OZ`+l?%*d2>u@45G$d+zzU_uO;Nn>MD3T(#ASqLrO0jvBTyQN)NsBU~+W-OMuA zR{N$yyvk4i=ZtYCaVB*pvwQb$TX9%5^v?_lP@!PJ3+ zi310X{f<#(PNEv&YNDzY9JW`hvQaiR*n43G^Jpv=t5`qleckV76+GFHuu z!YX2RmUOG&C(xF;^O)=FdyI?>rVWqj?24)4iHBCjCW=k9(sK@*E3e4zpsf%lSF^gf zJX>iyhuv1s+pRpx%1)x}7-ZozS-4-XYCJizftkZ4x5~snc8|nZVXtJ++_BdkBfCQp z#-Qo0cR`a!2U0u+-jAesyslA`tm|l|iacF608HRGK^Cxr|GgKOcTlnwY}rLy79Lkf zd?!`aoJ>_OINH8Aqm!XMu2eM~Z8o4y6fw;(9l?R2X@(ZlI5=x&Sz`%TkAWO%b>30q zN~gE6RUMRu7^__QWnc%~fvKXrExD=Uq%~1Iu2#POD=`dvpUn9^o&)*b3l>Wx#!h^9 zTdbNn@g4l8q(q}BOq!2=#O*9KlS1)i)GQ5>Y9g*fdofmxh=-YZ^%0kA&5hSkOGs+Q zr~yLFC39=!0IixftSPP@ewH<#$CjYcK8GYWdxX`g;;vo0CW@f3<_0DOHt*c#LN;Xr z{@`$vHE(WN)nwfYP_bm!PJ^v!gLnoj>{};^wcxdRc)<+U8jI&SKr^AZ{<_kS;VV}x|l=JSl6%}8?@sNUI8a!M;*;hI=Y?aQF88ZXa+g71Pp=3Aopg#y&2UM?;K$f z^B1qWIIOrgFy$tB19b7T*-G-f$TA2jhZ?JR9K>Q|_()YF>+9y78}Y6U+EMxPz|C3) zkHO8wF``VuD{ln@IvCIbpCJm&ES`69>KkxMm`k?Iy^Fao(-n?_x~){M{#vBM{hP}; zIm}~O<%i@MLxM*n!E5$e8t(H)*e8K~403z$;Tm2%JzV}yu;=1}W9)-uKr6|ILg8wo zL1KEchAXc6D;iPhXo7LG^l_JWlJ6sHyr-!Wn1nxw!Hq6>^SPeA8^(UVJ4UnD*?1E+ zK2OdBR|8waHv%{wi(1+L20FNC47y_z#q2$A;({%s z5xw3?jTS@{^pdWIOT{V8;FhK83WavR+l)6Jlyw-p@*EL^q|a|Mq-%7)=HER3Qr3&0 zI96YQU-QrluB~tdEIsx{eI@M_shiX=_=hC?LmF2ig3VYxNi>T~*by)o+(*wnMBpA+ zJt3*Wdl;tr8JDNWc(Sl>nHMBw<>efYj&ZeRG$%)Krp=j>8~73ItdJX} zt$iuX_-uJf6H=Xn-wmOn$#|}B(JGSEDaHk#Z?EKqJ zMiZAG+CeC6{&b|gh-jaGH|t5RH{Ra`xN z8f!JOQg#EKi*y51zKDYsJg~L3(xA~2f)G70t{vh%hvv@~D{ zc;+{MK#+k9N} zw%f?hTeVoWDIXzL(|yRQMF}$ZbIQuhAAQOdhmfJP?qvRUlPm6kzneGsW7`#%;?Y;?`1?{vi!ML#VPn9Kjl71NmogG(QD#cR;tJj}kI$X8-|P;mXaU@d6ZMEFA25jv}VTW%2jf03BpWy`cMQA{g^jZg#iN5H@0( ze{V(ixOj4b+V)e7iQG)aTmBOWBak)WxD%rCW4w+6n{3dn1dEOMM61hgkL3E@5<=4r@j74ZQs z0X3yn%wN>X!VZ52#8I?h1h0D;`w)JW{fZ5Jz7=_Ah}_)WI)0BoK54PzD_bWXq=~Mo zpYh=4Igtwr8(L0b>Ldq5hgP`S?M85l1HULhf=vwW8?{D z{_Cr7BBMr`C#fgP41K8e*zgU0-ipYNM|>Djp$rZDE`mYNhk6+%9(n_9oYax%rIaM70dS1E;JC37j zFf~3^tocJ+tG(h)@<{C~J`}CJ>_d9(B_C31f9*rD+KWD9)P_80+@~?_QyBNxkNc~~ z{k7x%%5k}lf&j=3aU+taYs8Jy2P1s z;t(#0r6IglEDvE*+!(@nu}VRuikya(5Nm?*O5v@!oeR17JKq{$VdwQByhGd`!X@$1 z5MC>`gs>^Lg>YVM58;H^8N$!ZZG6XqjqeSS?h}6)!aKwRAzTsUDq+Fc)n+FgaFEOS;)ywzHr$-(E21t}!rCAmUXA$32uU1vbs;jEwl8L z+s~p5sW~p`nHiogQS4=>t%fW`HWEDTWrSyDkde1J3A;UrMtM5|Hv|`>a2u0b@rwTO zypdZlaxeC33w2C;p|FNAFSic%N9&--*645|r!tLgNqm(ge&qS1D)c-$dLLP?$$DHZ~0MOD2{E0s_Z7;KKV93^R9 zA&7Qmg_;Ttp3L)f4z0#X&Zb&gUZkyr+~^ufQ7 zRa?IOaF*QvJy(JmMDR!zjYbERAsD5rAmx*OmeLyVm&V~*gu}HM{3QeaASl#leqoUm zr}6Oxb7s#fZ=!`BmEa-zq{gsI;Bi_qdVk*EJ?sS-jlOyM`Q%ZVt~EYPXqm{2Z)&%KzCn8Zd0Bi}@jaXQ%-wLAn86nFj$lyxLMZ(> zzH7*9hDeO-BUvWvxD?#pcJ;kz+EMRYAxuIl2)SHWAr@7>auT6Jp6g|y!3oIhgIK|B zvQ}a;!Wzq+%$SqvY$)f!?>FWlfi~n*t<}Nq{`Vw$vSgMy_YFv1=O{vD^Uvi+o7GY= z^oj18wfL+>87dK8`QBJ!ZGZ(;;9;VYb_peb|D`aAQZ^EU(~f2FQmdB9QRto@lGds8 zymJi;3)rvZ-f8vkbP8<6bbDMl_ZXZzg;-UCzT(Q9qeIQ(`qgJQo5Sl|^Ix{R=5Kpk z>BDY?59(OQzhG{*jktDd(9SFv1Ga*@uHvqvT2W;XJ}d7#eSXZNBG7>{ll;7P@840P z@f=T`GI-|o#Lyms8abYU2SG`x_gvQdBD38~P0SbO_QrPtdfa#x$DAto_>5T|+#4C| zlV1WDC9Y0Dzwl) zj}A1Jw2%POxtTy=T#YwxM-OmQ>i7rptvrc-BSBpJK0 z_4l27&)r?HTWsyU=bZ0+=X;&+buU;KQWxwC*;AYQuPkA`$7{Y`v3;|Wty*lFRm`eM z4;`}%vuahPVQP|9tUzH^gKcE%7g@s${&ms)Pze?nFQ2b#?!PD>D6Fyi1C>_ZUvw`k zL79!(0b|&IjGi>bfR}zu-vaVfMGcb7DPC?8Le2e+vbj(=!Ptn2(8C&B6fA z_>IEVx#I1&-@aZuTbwJNQ_dFaFY+`tR~S#>fxX~iM1AL_hM8KYzEuC{q?+HyCX~w~ zYJ~+`*qUSrb*fuAUjrdnERF3`YeTetQuSG(9>UUlHN{3)h>8&^urnr@aqCLZ#nvQ% zvdq@lzu(TvVC51Wg(;1#NzWBiXNwpX3UfsdWb#x@cStSKkxIoIEHV83dbUWLNCXi* z@0YlNwf-wfc53LOk0%FwlzXJSoL6>3SPc!6@zlWQn;4$joZnCC9zL8MK5P#kP7NQn z4qS+A0j7{*y*`5>sFkd*dkNq4lB9aOqE6aS7V|V;^$eb@s2rS6GALlf*<$0qj+w7v zrmthBc(ypPnj6@qRai9-TY`#?+0_EQrSMiB=zs@KsM^pwCV^H=f(@~op0u|E2q#Ug zn=1z8>K#}*Tl9(SENqOCVK_hNS@0CDc#8Xq22mtvQdn99=KSHP0BD#5RDMQock){o zYCt({Uq0XH|3GK;+m94kBYy;Mnycz8`}=VVt4oAds@?Qp0aK$p<#e5B0tQBCLG?PW zmnr4$9R7Y&2yRS>&DAt1xp~rT0-8;_KT)MM?8HCVf(2Vhfg&RoRdgwxBV$cZ;~GfT z8k$=)t2s7JHrz28s0=i2r1`oTB$(@%M7mYA*?U%XDZORcht`DVu8bCzvK3Z+08+fp zOMvKUs|E(9E$2V~z3Gu7A$BZ!!VWA*PjjC&q{Wk&0e(5bKiju3lC6*f@)X}*n=RDS zaAT2LbP_v;_uEDm^J>RDSL&aGsjCno^X=+N_8!csx|)5+rq+oQ;40~ema{sU_3e;A zp>%d7tfH zM;HOJW{b?DqYf4HcKxC!8;p97vMPzn99+FZy71vo1+Qd z<@NBKw~RE?OFyfyzensRXWhEA;m)TM9m@)^u3hjlJOixXNYMTSPtYl+c%t@;G@IIb z+%t|BFnbqNxS_%zw?SxflA@P~tC$=scxh=dw3sB}b7K_Z=ZRB1T`RvSmq&B}?9&M# zU<3eHuzGBu_L_B=y_PzR8yKw%w+KhnnB^JIDC^uHlFq?Z^oXs{HIa(B)@thwtbE4u z$rkB_=RkND6rHP>c>AAPSAd*bCNCt0i@6#Ktjs^uf#5_ zjs7UcJgjYJD2!e^l&kZI$=;BaWW!$olAMxr2V9Hl@vgxdX%C9Q>0 z&pVag<0Gkx1zi0~l=6^Guu2xWCOK>=4`=%+N?=-Mq{XTqPh2%@^C(8&DaB-SD zlIAN$ZGMwT+<0$Qr>tQW0`M_=uE=i|K`}InkZBkxQ$izkf%;E`*aj66F$AC^pD^>j zzCVc&h3BABLHwU&qqt{MKF}O33xA_T{s!?63Gh)nmPPqxSU~fxCgy_QQMiLSnK&;a z{hzaDOA{hZ)!zR3?nK3W`ycVEcL4nJQ>2D)0}^JuYwepm(6&~t+Z9VJaLKej6=P{j z!JTleMZEj-6ls=JB*aQjk}Ew!!3N!tU~gdIdMOc~*hjvF45GuNLTiy_3NCn*l1QS1 zG;P%f3?`?RV_SX@o`y<>IRMeK3?E6E7B*#oGc(}j zAS;oQ0hZ_>ND;Jh4I4pKK~T-`uKG(Yuv`ch{0)IY+99c2naNE(Duqc7N0=*I0tK*v z8y1}Z=_4Ci!gB*NN~6%So~Z+aONt|SSAeiA%W zF?kx-a0ikA;o4zT&aSUCv7llB?iD_@UgTX`uCX+jI*5Hu+DG9%;U&u1;E#*$J>7Cl zNRvE?zXZ}Fqhj%7d+_^Ww@+Eny#n3ZU>&9L6i-k)I>9r|HvG|cR1LRguLJtyV)+F? z&RX>ZHqWLS3@IZwYFu;fd$(B|8l$+SJ4$%0V67>+fFwzMQa`AO zus7AFvDQqo(5Wl;`L3NigDOddymD~0JED(#6+FdQ{}n3^KnHuSpZR)^ykWQi?V#PA z3$0vec*(T|c5ULv!MBwYP3Fwjn>7C6rr==vcy~V7C&$o$&3XfqjX$^~5%|jZLwGdV z_!seba>MwS!qKC69M~}agK%^RkCWdV|9Uvug~z*l$M=P!C-GPq9N!a;2Jx8s>+${J z=l~wyeR%v}IQk|Y^DmBnHynKrk6%49{_Sw|93J=IJ^n&C`VJlsE`h?GJ-f)o4-X&U zTFX=d_Np+JHucNZSpC=q)gPlAvYH5=q3a5C)_*Yy(-yfH&GmBs7p8d`j_2V2g!_Qf7q~-B#!HpdP3=#2E zj_|+w4{LA>#tJp}k#PLgwbA&VTzdut6&^_(lBHOQ) z!3W`b;Lsu^3)DfQYTsvuiW~>aNtAj>Y|^MS(OW^ejJ6Hc%apSLsP0Tss*NBsk*|K5 z%1O0)Cq1wl)^cS_zHvp<>N`>X0I3mmz_zicL>|z_l83Co1bfjL+7p1!PwW5#Y0PD)ZGVj7|KhPu25#=wML6ZcVM}=gEskiDxb* zYeSwg2E+;u(n$7^0RArILWZ007-dgWa5VO@-1s`$7{|~%MIQiMqw7F@trd3N0Iu?W z(L@B7IyDiu=|Y4$wVd(-be~?L(%#-@)`r>+k!_w&XzYM3oR|VzBH=1)IEp+n8Pg5f z6VmLLMZGS1ce1Sq=&&FmFZ}qb1&q@&g~ofFECMr??uhxC`=vazvH>CcE<^ZF8o zL!5Bh>Ou{D;1u6^q>5JV36r5h*4&5l{2@R;D4@gM0M3LFQ{EOM2(#Bgi7dEVEW_MQ zgiksrUUF~_Vn&f~oH+=H8O$2WB?bllV1A-SsT*c{d+PBHAnFAu zJX7Q8{Qk#9OOq@0yQl<3ZF26@h{v}|cz&?P4>(#YuW6%K+&J92FoQ+>MWo4T2w>AyG)OMIim-w?Z~HkihRKr1h~y-E4-UNz5OADk}n z>A^GjdIGzZ(O@dWr}KlahjALVl*Sv{ZhKY!`YhvbfPoC3Apj~5WN%3cxhz|fF^;5+ z8V{jl(S&fHxQYL0)Z#y;ij(@jxaU_F$@0j|+AL3g+1jDT?SRYgqQ+HaKH0Gn zmg55Q{nE82yY?Ss7GDr`Z0Hu_j;OP3AF_JTZi+!c#kGkNf3o0k)-$xG-!Gn!kTm2m^|m=><@0;m!Myg*P10 z1a0(+k|G}$Sz)aa{9(~8q8ZiLgq?dklvSE!r5IgE+Eyu6(QUt!T^JfFZx8N`lQ!U_ z8tT6n%b)#!(MgxzLIpb@qay3+h^Ckm^2~?5Ao$JBG}2wuD^okTzHTJv@NzaKbja1v z&!W$%;v=h1zTDupd;Vs0j%+II=WXOR7FtXAN=Vjs7Qb*~sKO_ffI>uj^w()-0KWWu z{PrzmJ)SyAPQDMI8z*ssXeP|!r3aUHq%j?ncPIw)+>7Xw{)X$ zf`_k((Px6JY-eRfI}21{Ps%fW+XMGril-2itqL;LNlQo}8qZU$W&yG#ANuM5wDTb> zx^F@%d%*WC!7$?T41_qboLbIBj0l+!ts3=H6c2BlB)6xv1z4~}zitb*iWUs|M*;~p zHdaZ>Iq2e`i%y@xN?mhbS&ftEbtTV&e^MKX?2dRuYF)*%1yAR?m&Kn-XG-~N?zdKR vwKdK`J-!81P`^ASB!VC1jRO@|_ literal 0 HcmV?d00001 diff --git a/roms/f256k/toolbox-09.bin b/roms/f256k/toolbox-09.bin new file mode 100644 index 0000000000000000000000000000000000000000..0196a6ed9ab97c0476c749cb0c63279f5f8a6e93 GIT binary patch literal 8192 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 QPJI5082w4C983WAzj!iyuK)l5 literal 0 HcmV?d00001 diff --git a/roms/f256k/toolbox-0A.bin b/roms/f256k/toolbox-0A.bin new file mode 100644 index 0000000000000000000000000000000000000000..4b80763877730bb7b5b4f0ebafb5e7793847fd2d GIT binary patch literal 8192 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 J>{>-#{|DI4yV?K% literal 0 HcmV?d00001 diff --git a/roms/f256k/toolbox-0B.bin b/roms/f256k/toolbox-0B.bin new file mode 100644 index 0000000000000000000000000000000000000000..41a87eb59638d26ec52aad69f9b17e554a5c6f91 GIT binary patch literal 8192 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 literal 0 HcmV?d00001 diff --git a/roms/f256k/toolbox-0C.bin b/roms/f256k/toolbox-0C.bin new file mode 100644 index 0000000000000000000000000000000000000000..187bf71838e11acc285eef19c3e338f1c5e7dfef GIT binary patch literal 8192 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 literal 0 HcmV?d00001 diff --git a/roms/f256k/toolbox-0D.bin b/roms/f256k/toolbox-0D.bin new file mode 100644 index 0000000000000000000000000000000000000000..edbf3a0b9bb629ef1b4e87433524cf8798626661 GIT binary patch literal 8192 zcmcIpYiu0Xb-pvRkKyd@aCb?rR%=?B4qu`u(i>YgDYB{@(6m;Iftnyd8sq^aSUaUs z|1equ4U__%^lDvuf3%DKsGSx;XA7S&uv)kXS@j0Os;KP>q)L|Shtef zmQd-fM>6HSaH!1o?c(p%lfZ*Zy&8Pugj{ch)?e^`#Udmozqv=RCZ0Ts_S}{P~fCXud9*6L}3WlzQpziu2qXo)M1b*Y&Hn^jim1c$K7v@*oFB2fPDbI(UUV zazy9ceS)zTW7ilTUW?EpO9YIk*UA4ul*BNf6c!2^r%8!X-d{~U~tSIob$Rparn9K4}$Sy#3-o2lOBmybYP}9mg zyint#wf7eEUJE(@vadM2$~AH;@+MD;7XC-7E`@B+O=zSW8Tx;tUeEW(;QLYdz5w6n z`Bdoawj*ZKC8SqAtV+C3$@f?_az$fnj4i;FpG00^H*UO>{#Q?7n&s#EVb{3B!s0nG zi^$9%GSi666gR`lvkr#{DK0;zd6o}jRkKe6UmIx9n@4WjQ!jUcBc_C@pPPC7<*qlt zwyjNoTF8utz zL7~1HM%ih=;An{2B3=SiQD~*#$Vd@yim3gOFWg-Xb&?yz^~bt0)r@@rHXdNA;hSo> zH^YSMbEHnvB-FQ`5XR4Mms{@P@%{a$9q^y-UhXFo@qT0#(W)u5YSMY(OE>kK#?9nS zb7|rB0(;0FEp|zFMLfmh;%Po0N-(|*Y*&N=WE-IE(0=WaE?1CV{^*Y|io>@9NKVYQ zHRrA;6yWFtQd@IA{pJI?Qs5dSE}nt3jL!o854|aM;BlT1DLx_w`4MPrKw~O^47Wh7 z07v4$kpysLX6s4T`ZQO(e@ldWwiWEz1Qjz}v4@IXp}0>_Ke0cYLP%-I6?YKZOW&6i z^(L72`Jl$M^UqDJ!_>OwSWSVF+$wHZ_0M~!Q5>64sQ$dL7H$_Y;%G8Fri{&WX2q1j zH8@i<@XS{rP*5`=-=ydn5)Dr)&Yh;1elW4;l6IQp(ZHjSI;6x2>EnO!`~@EaiYo;E zfLskt3Br~h@O`PcDq^Vd6nc_DF@rUy5n07`?q%T#e>p`Y(j!#~y}PVQu7d$QUUOpt z4|slGo&s4@WF2(V0(+p{9MWOVSM7)xy^4fHjveZ=n6mG8=O2BmF2O1j{4d}c+qMv& zIqC$IEtPfhLfMM2&VcVfZ~&a10|n^3RZ7cki_%bL;AgRZ&SNUA;O+hU81(le>OKqU z)P$bES40X<(uoL8B2sXG^dQG$;8>O3=6~w3$bFb1KGT2hFB3#}3f?(_${FcZjz6Nx z$)E;?wxKRRx>yYsmHtw?Q)w8Wl7Qyhr&YcqtxnG!q&x z(418D!&k*5^nMmjtXE8bN{c12-KWVp$U3(5V@=t0tLLGFBwl@U`EK#BnL2AY* zHJy)t9ZOGA%w)7a3@tV1zrKcrD)M#fYlTG&ej}KdtD!jq(d%E9UoHj%3Sy!&Nh|xp zX?;LO43H7Q!qUlDIMs+D;i1eec8i5u0*sGSjUWdikTQx?7)!JxBJM^7RVy|0@fx6T z0NF7B_hwK+LvVFU4Ddnk?%r4e?y(W$aae^YcxEz$p~(=2-X$u9n%}rRL0ANqxbq)> zCdLs(yO$UKsE4T1EgwN7mwXJZvcKx7O@Kur(`-yZ2f?1y5L}tTG)FZUE-_dVgR4A9 z7ug|KV=ujQja4J~8^LKNQVn*;l8BbX5H!kE(K%OR>!7g>gtK$1%cHBS$UP0Y7eyDR zIL@2Y*(<&|?gS~4phEf-sRdU_<UW5nWHpfX?p=5YP*rEwcS|rRq7Nxmewes3BPV! z112Vr!g16NoV@SGxHiypr|?1TJag02pn)4fBV(OK(xFlko=k4Ug@R5Z35&6DgOEl%&&uQYIzzoZocKme9Iq3PCi%c%8eVV9V1Q=D7SB2 zXfc9S2o(=}Kn>0)5F;b~8AzRiO+l_&{W+N-%Tn+laVhQ%=u6?r@C3#w*Q6j|oRZ^F z;8CJaYEgn&0$L?VWsbOz&#lgfM5e$~vNDQ&t5FcG&K#+d@|ZPdwd3CB0GV#o`zRhf zLmVR0S28KY8QQrYCl6bl3)_|lbrD*XmZ6fKLCh&CGM$KqCTI62NfTc#dAUz?2BI@$ zx=>&iQby!WlD$dB8hoJ!LDtvask|c`#w96WQj!(Dee#Pzusd=p#O*h|8Xlt=_Swtb{r`HS4IFq+|tno zBpY|>NbP{j#7HN;2z4}9#b3FCM*X|rsbHlRkS7DY?QNfk72Jt`TIWHE;>1Xe>W`2Z zacn*V`vxNpZ>?h(hy8T=$Z+gC+tvn34fQAWQx58vaK5n~o_Ma}$a4YhD5nd$2-+~X zAJ=)YssT`n5Gcv>-$x(5%T=MKV_t$efAN<>HH_xBH6{MOs1olS^@n(^sx&E&%8ZW6 zP)FtG=t&zKR61w>^&_}Cknc*l9`iIQPI(#4Yz&P7WH?Tag+cH+GK)Iyg>R_SvGTaUX*c3P*G{)%UPi{{6X?J{Mz^~NNiau5W%}dbL~IC$Ct*H?!?`ycDq^Zg zL8o5US$o+#%QlI3$7xOAJy2>vly_N4T-a5ctGry}4l>a|CMHpm29`+jB%WvS{D7R1 zZ=$^AGU422tQGT2S_8+mO}fU~NwXo5h9!G*)kORkS{De4x567#F zgarbn|3$JXjQmBN)s?^JMh&i$6P40|ahQq+bBoAvKOWde=Au!;rL=cvZxa>Dc22bB z{rA1WofGw$o-gybl*v`;Ckv@Qe0vhUofBDpTnzIQ&YeH^!%cpLgTMEdaGIjLmPAqC zc&QV6ntk@A_D|nH29W~q;pN}yc^Pm2pI(;A+!@@YQrt98kdw{89Sg$PIa?Cu&T?~A2EPmxa(2}a za{=8u2`#~wIKs?x8t`oNGnsuYcUkrAkUX|D9 zCCAJmj)y{y@QEM#mhi*j8Rz@g`mBL@?X1@m7CKy%;4$65v4RHn!1=CMi3B%Hy$=ay z|8}_>4)Fu)#RT?4QL^tYqWNkh*HY{ieZ%S}Fo_`N6Ntyx(vl!7l#YRpRW>GQb_i2x zpX%q%5VuO)*q8C!nR8oVE&R&hD@qCs5k;9O+@t;T7R?ia+qb>|-MsGF$UVB{L4$UI znEP1^G>spn4^5Af#1AyZS(4bZKy#+Q)6cw2RFh3HPE`FL#_7XcQ=B~f;Uq1mQj>G| bOOd`P_bBoxO~>Rk40G3>l!oDTdhNdf$;;ci literal 0 HcmV?d00001 diff --git a/roms/f256k/toolbox-0E.bin b/roms/f256k/toolbox-0E.bin new file mode 100644 index 0000000000000000000000000000000000000000..cd73497f47616db3334f4b62296ac6043c151114 GIT binary patch literal 8192 zcmeHMZE%#;6+UM_-hFqoyV)!u2_fJbF+hlbhytowhUm(GqCuXXRfz4%2qDwm5C4IJNb)Ke~PH-TUso*?qUB zj{ayXnUizwJ%p0!-z4h{`Ut=yQ4}tn(9AjHs6d5Cr(e3!C}rk-H^?5#3|3Ld>(tSe=^c{ zkBDgRF&T@8G^2IMVxwqa)OqfL!EeT1a*xKYxI14zCn+OFYt4X0 zNBHtV&57EcpByHt_bh!MERFEA(E4b+*XRCvbgLBmK$1;bd^3QS}xk zYTptQ(ZeDPmQsnOSbK}QE71unN3DHbjG_~RNgj>888cYu#CoISB_gBq9i}6~tBvu_ zmrU1aOfo%Vd=a2!3@cWlHs(L2)5S$bN3z!FOxB6APZi&gx*a|2!6nmft{JEkU2)Kb z=2=#MVe1ES%bvq%W?CWD5JtBLZcdJi6s6 z7o0?^+%sx(r4o^n0g&=1mWZl3%FkJOW%G*=MiY*Cwgh}~t&zR=HMsZRMiE!gMN16teFgXFsBpeJQ0d1J4P)O zft|ot9$#n?{#kQ*%bLkZFWKVf@r+rK*JbnOd6xAyne+$9JCHv@{tWpGuS4F0OqyWQCFCBDoSSUYKOi^MnY0sf7V>@Ye*@7gO}ZYk9`ef? zlYGd%0J05o6yg-WrNX2wkc*H*kncbSCz|vEgvpIw z@ZvPYDVp?#$D|gYNiXUq&5M}i51X_jWKz_N^|?_C*t6k#2jg#H{4lUF*z+}$4wRX+ z9dkeQW3Jq!A7Jhk_)Y`g1>CEMy#@LW%%y`SUB>v=;JgNW6uG_!-231!0q+v*M-jsV z>|?AVb0e_x=!iYQm?^HuC~2mF?Ex>aC5C2yBaswI`h>y z(?)f!tH#*wbd$Q(tDyfgyHre(H~VUcH8kX25FM|u^&$uH5@qk?8p`fztEQwg55IagBo*}P7Y*$gm>V#+zE0d+am_rYY1O03c-9HZW zb2;?3aiH61>1nJ|t$pjb80|L3z2jmmvoW@ei_u|Y^o@gYh`ct&JvN4hSIs(uscQbI zG3Z{*S{`vimVI~(>TYY7w>*?>^8df8^~3#?mL03L40RM zivyz@46)`iuqHX?X?0+&wXs6V7X4=5eH*noFxMzl0Qtftmh=BjZpla9=lim4-Kq(n~iox?s?jDv|jbYL!5OdoPql*qY-_GVhQ#H7ajb_I6dIdx>x5$Fvkb$*Y}N9S*F` z#MQ`i+@BKbtaHrPAwTt^I9Ks9iI=224PFN)gKCwNOYlO#M&zU+#fBV=d_@mhWk=r8eo+{1C#T*bj^YaO#@sFwI9eiWRq@gCmbj(a2r zV_8w$JcqN$P&Kii@8+YP6d&gY`7Uoe?2GFb2kXPj;Fu{& zT+7?|1Xy3-d;IZ$!YP7xz}C`JByP+_RbHpV<6`cS!uKSDDLxRYBE+cS6n^ zbMQuU-m4wF6*+JH7;om}&rjy}d`*GxXVO;|=WbrW72Fg=?WYxBekw76IN!lB4&(3b z9=@s!IQ(X0JNL}V3lgWt`A)ut%UxkNagZDRKsMNrVxRaFO8Mfvf*U+x53!3U^Bf;= z(+hCbzD~o z&J*>ppIGCiyiZRx=1`f_ubf^^z7#);y)^RGT;U7j|2G1#X7MI|-j|wX!@dkG@;|@} z-Hkkxr*cHD6=+W*f0iH6QcX7WOIh?I-0E%Q>0HO;AJJ0R+0ZX$*Kv&d zd7i{ia)t4K9a;1O-oeLxso4rIDp5yx7Y}k5VqMEsT*mdV=5Q}R?@!IK;U*Jz@&RD) z=g)*1c?}Q3eu7ud9g7L!efctK^%dU2O@6sP;GV{N@0({s))CL(?R-L3wH+Dd$}l>L zm%92!iOigO{S^MX*v6m7{BhpJ^Id9Xa=epgFI2c+oLVbhjzgG#ibXexwLQd(ZdU%+ uPIZgVfIdE2k>baB*)3}R)l=(;Z{Xd0B9!7Gyu$7lctlm2h;Qe|0{;SKQ|Dv= literal 0 HcmV?d00001 diff --git a/roms/f256k/toolbox-0F.bin b/roms/f256k/toolbox-0F.bin new file mode 100644 index 0000000000000000000000000000000000000000..9a6c02ab712e2089916596b812f2e34228cdb9ef GIT binary patch literal 8192 zcmeIwhffz*0KoC@St!I&t76r@r3P@{1aG+9+Mq7=QTC`YkV!?%)*y2J!5Jjab zDJe^kz4wqU$VO!E>E4R#*9Y;BXp?uB@4L&p%S-O_&QozyER|u4Q1?=yLI*`%*`T<5 z>Zx2-tdxmMKF-fV8LMnnF8A|Pt}3>Qf!W7-U6lFC0mV)+S%J!{+$&6sWnST8EcJ>I zV@cnty(|B>&h5aTB76E_uc%@Fi5kcHX<)Ce$w~FW9Mc?#gN7Ez`wzxJb2z6pzreBo zNRAI0isOJ$I1Ts`r-7q!9yA8$&&G0M$Oujj9fiy1+PDmvz$vZKxDK1hS*^)9j2MsG z@F}9HIE>Wh+=ywS>6{DA!ksg=E&gP8v3_Qlo!DIZ_{G~lt zq|fCE2Dnbr`vPX>;+KZj8H*5f^5C!#^`k@YY$tCB5&&SE}%s zZH$lZB7F5s@t?DlEBXt$YPgsH{qOOdXDV7kpuuv2=B?!KZ_NlcT1DvmHFz7Z#77ii zybiwwtBEvOPt<~+2wc35n1$v9nyw>u@z2DWZX{%xIq^#@NLadw#ATaFG}}y)*{?*b zupoK)7E)JiC3=-5X)CQrU$u?+AFRk&y_3u}yGUBQgX|xz$yvLHwDs0xnA?!QVIKwN z`^o-gKZP3)lDEl@VvEC+Y&t@L~x@V*GZ~&J5aaVk!tJH)L1*xxaSOYzdKWB<4nEH8JcWdXs~sm+18cDy{j2?`1#I5?P) zkPt#cLkSBDBRo8uh=>RxBO{55iXu8XnwXdvVq;^8i;E*ZKAwbx1QHVyNlHp0IXRh> zloV1^Q%OrpBRxHx8#iu{k&!`WW+qu#S!8EtlarG}Zf-7ld3oHtd6WG7d2nj zM}2)g4Gj%6Ha61K)I@W0Gc7GGw6?a=*49RQdpjK+9dvef($&>PcXu~;@80F!y?flh zf1d{r9`NwtLmoYP#N)@0dGh25PoF;J*|TRnfBu{oFJAESfKahbKux^qqQym#y0^MTk%Y$!Gn8^7m3tS{CRYvi$+ iHtrh_%O-u@XE8ar)9&jttIMo3zh>^L7xnpMUu`cR-!tC; literal 0 HcmV?d00001 diff --git a/roms/f256k/toolbox.bin b/roms/f256k/toolbox.bin new file mode 100644 index 0000000000000000000000000000000000000000..37e4c53137cbc753fbf42074cf007ceb5cffbf2d GIT binary patch literal 524288 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 0: + line = line[index - 1:] + + line = line.strip() + + # Process only actual names + if len(line) > 0: + addresses.write("\"sys_{0}\",\"{1:06X}\"\n".format(line, address)) + address = address + 4 diff --git a/src/C256/iecll.s b/src/C256/iecll.s index 6d46218..41ce3ca 100644 --- a/src/C256/iecll.s +++ b/src/C256/iecll.s @@ -2,8 +2,8 @@ ;;; Low-level support code for the IEC port ;;; ;;; NOTE: routines will be split into private routines and public routines. -;;; Private routines will assume near JSRs, 8-bit accumulator and index registers, and interrupts disabled. -;;; Public routines will assume far JSRs and 16-bit accumulator and index registers. +;;; Private routines will assume near jsls, 8-bit accumulator and index registers, and interrupts disabled. +;;; Public routines will assume far jsls and 16-bit accumulator and index registers. ;;; Public routines will also assume Calypsi calling conventions. ;;; @@ -21,14 +21,14 @@ #include "F256/iec_f256.h" - .section data,data + .section ztiny,bss -eoi_pending: .byte 0 -rx_eoi: .byte 0 -delayed: .byte 0 -queue: .byte 0 +eoi_pending: .space 1 +rx_eoi: .space 1 +delayed: .space 1 +queue: .space 1 - .section code + .section farcode ;; ;; Macros @@ -40,7 +40,7 @@ assert_bit: .macro pin and #(\pin ^ 0xff) sta IEC_OUTPUT_PORT pla - rts + rtl .endm release_bit: .macro pin @@ -49,7 +49,7 @@ release_bit: .macro pin ora #(\pin) sta IEC_OUTPUT_PORT pla - rts + rtl .endm read_bit: .macro pin @@ -60,7 +60,7 @@ loop$ lda IEC_INPUT_PORT and #(\pin) cmp #1 pla - rts + rtl .endm emit: .macro char @@ -106,38 +106,38 @@ sleep_20us: phx _loop$ dex bne _loop$ plx - rts + rtl sleep_100us: phx ldx #5 -_loop$ jsr sleep_20us +_loop$ jsl sleep_20us dex bne _loop$ plx - rts + rtl -sleep_300us: jsr sleep_100us - jsr sleep_100us - jsr sleep_100us - rts +sleep_300us: jsl sleep_100us + jsl sleep_100us + jsl sleep_100us + rtl -sleep_1ms: jsr sleep_300us - jsr sleep_300us - jsr sleep_300us - jmp sleep_100us +sleep_1ms: jsl sleep_300us + jsl sleep_300us + jsl sleep_300us + jmp long: sleep_100us ;; ;; Code to handle the IEC port ;; -init: jsr sleep_1ms - jsr release_ATN - jsr release_DATA - jsr release_SREQ - jsr assert_CLOCK ; IDLE state - jsr sleep_1ms - jsr sleep_1ms - jsr sleep_1ms +init: jsl sleep_1ms + jsl release_ATN + jsl release_DATA + jsl release_SREQ + jsl assert_CLOCK ; IDLE state + jsl sleep_1ms + jsl sleep_1ms + jsl sleep_1ms ; Bail if ATN and SRQ fail to float back up. ; We'll have a more thorough test when we send @@ -145,18 +145,18 @@ init: jsr sleep_1ms nop nop nop - jsr read_SREQ + jsl read_SREQ bcc err$ - jsr read_ATN + jsl read_ATN bcc err$ - jsr sleep_1ms + jsl sleep_1ms clc - rts + rtl err$ sec - rts + rtl ; ; Send a command byte and release the DATA and CLOCK lines afterwards @@ -164,25 +164,25 @@ err$ sec ; A = the command byte to send ; atn_release_data - jsr release_DATA - jsr release_CLOCK ; TODO: makes /no/ sense; maybe we can remove... - jsr atn_common ; NOTE: does NOT release ATN! Does NOT release IRQs! - rts + jsl release_DATA + jsl release_CLOCK ; TODO: makes /no/ sense; maybe we can remove... + jsl atn_common ; NOTE: does NOT release ATN! Does NOT release IRQs! + rtl ; ; Send a command byte and release the ATN, DATA, and CLOCK lines ; ; A = the command byte to send ; -atn_release jsr atn_common +atn_release jsl atn_common - jsr release_ATN - jsr sleep_20us - jsr sleep_20us - jsr sleep_20us - jsr release_CLOCK - jsr release_DATA - rts + jsl release_ATN + jsl sleep_20us + jsl sleep_20us + jsl sleep_20us + jsl release_CLOCK + jsl release_DATA + rtl ; ; Send a command byte with ATN asserted @@ -193,41 +193,41 @@ atn_common ; Assert ATN; if we aren't already in sending mode, ; get there: - jsr assert_ATN - jsr assert_CLOCK - jsr release_DATA + jsl assert_ATN + jsl assert_CLOCK + jsl release_DATA ; Now give the devices ~1ms to start listening. - jsr sleep_1ms + jsl sleep_1ms ; If no one is listening, there's nothing on ; the bus, so signal an error. - jsr read_DATA + jsl read_DATA bcs err$ ; ATN bytes are technically never EOI bytes stz eoi_pending - jmp send + jmp long: send err$ ; Always release the ATN line on error; TODO: add post delay - jmp release_ATN + jmp long: release_ATN ; ; Send a byte over the IEC bus but mark it as the last byte ; ; A = the byte to send ; -send_eoi jsr set_eoi - jmp send +send_eoi jsl set_eoi + jmp long: send ; ; Set that the EOI byte is the next to be sent ; set_eoi stz eoi_pending dec eoi_pending - rts + rtl ; ; Sends the queued byte with an EOI @@ -237,9 +237,9 @@ flush bit delayed pha lda queue stz delayed - jsr send_eoi + jsl send_eoi pla -done$: rts +done$: rtl ; ; Send a byte over the IEC bus @@ -251,26 +251,26 @@ send ; the host is asserting CLOCK and the devices are asserting DATA. ; There must be at least 100us between bytes. - jsr sleep_300us + jsl sleep_300us ; ; Clever cheating (PJW: removed since we disable interrupts for all this code) ; ; Act as an ersatz listener to keep the other listeners busy ; ; until we are ready to receive. This is NOT part of the ; ; IEC protocol -- we are doing this in lieu of an interrupt. - ; jsr assert_DATA + ; jsl assert_DATA ; Release CLOCK to signal that we are ready to send ; We can do this without disabling interrupts because ; we are also asserting DATA. - jsr release_CLOCK + jsl release_CLOCK ; Now we wait for all of the listeners to acknowledge. wait$ - jsr sleep_20us + jsl sleep_20us ; Check to see if all listeners have acknowledged - jsr read_DATA + jsl read_DATA bcs ready$ ; Other listeners are still busy; go back to sleep. @@ -288,7 +288,7 @@ eoi$ ; already had the opportunity to delay before starting the ; ack, so hopefully it will stay in nominal 250us range. -TYE$ jsr read_DATA +TYE$ jsl read_DATA bcs TYE$ ; Now we're basically back to the point where we are waiting @@ -299,13 +299,13 @@ TYE$ jsr read_DATA ; The drive should hold DATA for at least 60us. Give it ; 20us, and then repeat our ersatz listener trick. - jsr sleep_20us - ; jsr assert_DATA (PJW: removed trick) + jsl sleep_20us + ; jsl assert_DATA (PJW: removed trick) bra wait$ send$ ; Give the listeners time to notice that the've all ack'd - jsr sleep_20us ; NOT on the C64 + jsl sleep_20us ; NOT on the C64 ; Now start pushing out the bits. Note that the timing ; is not critical, but each clock state must last at @@ -317,32 +317,32 @@ loop$ ; TODO: opt test for a frame error ; Clock out the next bit - jsr assert_CLOCK - jsr sleep_20us + jsl assert_CLOCK + jsl sleep_20us lsr a bcs one$ -zero$ jsr assert_DATA +zero$ jsl assert_DATA bra clock$ -one$ jsr release_DATA +one$ jsl release_DATA bra clock$ clock$ ; Toggle the clock - jsr sleep_20us ; TODO: Maybe extend this. + jsl sleep_20us ; TODO: Maybe extend this. - jsr sleep_20us ; 1541 needs this. - jsr release_CLOCK + jsl sleep_20us ; 1541 needs this. + jsl release_CLOCK - jsr sleep_20us + jsl sleep_20us dex bne loop$ plx ; Finish the last bit and wait for the listeners to ack. - jsr release_DATA - jsr assert_CLOCK + jsl release_DATA + jsl assert_CLOCK ; Now wait for listener ack. Of course, if there are ; multiple listeners, we can only know that one ack'd. @@ -352,10 +352,10 @@ clock$ ; TODO: ATN release timing appears to be semi-critical; we may need ; to completely change the code below. -ack$ jsr read_DATA +ack$ jsl read_DATA bcs ack$ clc - rts + rtl ; ; Wait for a byte of data to be read from the IEC port @@ -366,16 +366,16 @@ recv_data stz rx_eoi ; Wait for the sender to have a byte -wait1$ jsr read_CLOCK +wait1$ jsl read_CLOCK bcc wait1$ ; TODO: start and check a timer ; Signal we are ready to receive -ready$ jsr release_DATA +ready$ jsl release_DATA ; Wait for all other listeners to signal -wait2$ jsr read_DATA +wait2$ jsl read_DATA bcc wait2$ ; Wait for the first bit or an EOI condition @@ -383,7 +383,7 @@ wait2$ jsr read_DATA lda #0 ; counter wait3$ inc a beq eoi$ - jsr read_CLOCK + jsl read_CLOCK bcc recv$ adc #7 ; microseconds per loop bcc wait3$ @@ -392,10 +392,10 @@ eoi$ lda rx_eoi bmi error$ ; Ack the EOI - jsr assert_DATA - jsr sleep_20us - jsr sleep_20us - jsr sleep_20us + jsl assert_DATA + jsl sleep_20us + jsl sleep_20us + jsl sleep_20us ; Set the EOI flag. dec rx_eoi ; TODO: error on second round @@ -404,42 +404,42 @@ eoi$ lda rx_eoi bra ready$ error$ sec - rts + rtl recv$ ; Clock in the bits phx ldx #8 -wait_fall$ jsr read_CLOCK +wait_fall$ jsl read_CLOCK bcs wait_fall$ -wait_rise$ jsr read_CLOCK +wait_rise$ jsl read_CLOCK bcc wait_rise$ - jsr read_DATA + jsl read_DATA ror a dex bne wait_fall$ plx ; Ack - jsr sleep_20us - jsr assert_DATA + jsl sleep_20us + jsl assert_DATA ; Drives /usually/ work with a lot less, but ; I see failures on the SD2IEC on a status check ; after file-not-found when debugging is turned off. - jsr sleep_20us ; Seems to be missing the ack. - jsr sleep_20us ; Seems to be missing the ack. - jsr sleep_20us ; Seems to be missing the ack. - jsr sleep_20us ; Seems to be missing the ack. + jsl sleep_20us ; Seems to be missing the ack. + jsl sleep_20us ; Seems to be missing the ack. + jsl sleep_20us ; Seems to be missing the ack. + jsl sleep_20us ; Seems to be missing the ack. ; Return EOI in NV clc bit rx_eoi ora #0 - rts + rtl ;; ;; Public Functions @@ -458,7 +458,7 @@ iecll_ioinit php stz delayed - jsr init + jsl init bcs err$ plp @@ -481,8 +481,8 @@ iecll_talk php sep #0x30 ora #0x40 - jsr flush - jsr atn_release_data ; NOTE: does NOT drop ATN! + jsl flush + jsl atn_release_data ; NOTE: does NOT drop ATN! plp rtl @@ -498,12 +498,12 @@ iecll_talk_sa php sei sep #0x30 - jsr atn_common + jsl atn_common - jsr assert_DATA - jsr release_ATN - jsr release_CLOCK -1$ jsr read_CLOCK + jsl assert_DATA + jsl release_ATN + jsl release_CLOCK +1$ jsl read_CLOCK bcs 1$ ; TODO: should time out. plp @@ -521,8 +521,8 @@ iecll_listen php sep #0x30 ora #0x20 - jsr flush - jsr atn_release_data ; NOTE: does NOT drop ATN! + jsl flush + jsl atn_release_data ; NOTE: does NOT drop ATN! plp rtl @@ -538,8 +538,8 @@ iecll_listen_sa php sei sep #0x30 - jsr atn_common - jsr release_ATN + jsl atn_common + jsl release_ATN ; TODO: WARNING! No delay here! ; TODO: IMHO, should wait at least 100us to avoid accidental turn-around! @@ -569,8 +569,8 @@ iecll_untalk php ; TODO: track the state and cause calls to IECOUT to fail. ; pre-sets CLOCK IMMEDIATELY before the ATN ... again, TODO: makes no sense - jsr assert_CLOCK - jsr atn_release + jsl assert_CLOCK + jsl atn_release plp rtl @@ -587,8 +587,8 @@ iecll_unlisten php ; Detangled from C64 sources; TODO: compare with Stef's lda #0x3f - jsr flush - jsr atn_release + jsl flush + jsl atn_release plp rtl @@ -607,7 +607,7 @@ iecll_in php sei ; Disable interrupts sep #0x30 ; Switch to 8-bit registers - jsr recv_data + jsl recv_data ; NOTE: we'll just read from the eoi variable in a separate function ; We might need to return it here folded in with the data somwhow @@ -662,7 +662,7 @@ iecll_out php ; Send the old byte pha lda queue - jsr send + jsl send pla stz delayed @@ -680,9 +680,9 @@ iecll_reset: php sei sep #0x30 - jsr assert_RST - jsr sleep_1ms - jsr release_RST + jsl assert_RST + jsl sleep_1ms + jsl release_RST plp rtl \ No newline at end of file diff --git a/src/C256/interrupts.s b/src/C256/interrupts.s new file mode 100644 index 0000000..a5bfe0a --- /dev/null +++ b/src/C256/interrupts.s @@ -0,0 +1,144 @@ +;;; +;;; Assembly stubs for the interrupt handlers on the F256 +;;; +;;; NOTE: this is necessary since the F256 has only 256 bytes of flash mapped +;;; into bank 0, so we can have only the smallest amount of code there +;;; that we can get away with. +;;; + + .extern int_handle_nmi + .extern int_handle_irq + .extern _Dp, _Vfp + .extern _DirectPageStart + .extern _NearBaseAddress + + .section `$$interruptVector_0x00ffee`,text + .word hw_handle_irq + + .section `$$interruptVector_0x00ffea`,text + .word hw_handle_nmi + + .section code,root +hw_handle_irq: rep #48 + pha + phx + phy + pei dp:.tiny _Dp + pei dp:.tiny (_Dp+2) + pei dp:.tiny (_Dp+4) + pei dp:.tiny (_Dp+6) + pei dp:.tiny (_Dp+8) + pei dp:.tiny (_Dp+10) + pei dp:.tiny (_Dp+12) + pei dp:.tiny (_Dp+14) + pei dp:.tiny (_Dp+8) + pei dp:.tiny (_Dp+10) + + ; Save the caller's databank and direct page + ; TODO: this might change to being done only in the toolbox IRQ handler + phd + phb + + ; Set the toolbox's direct page + lda ##_DirectPageStart + tcd + + ; Set the toolbox's databank + lda ##.word2 _NearBaseAddress + stz dp:.tiny(_Vfp+2) + xba ; A upper half = data bank + pha + plb ; pop 8 dummy + plb ; set data bank + + ; Call the interrupt handlers + jsl int_handle_irq + + plb + pld + ply + sty dp:.tiny (_Dp+10) + ply + sty dp:.tiny (_Dp+8) + ply + sty dp:.tiny (_Dp+14) + ply + sty dp:.tiny (_Dp+12) + ply + sty dp:.tiny (_Dp+10) + ply + sty dp:.tiny (_Dp+8) + ply + sty dp:.tiny (_Dp+6) + ply + sty dp:.tiny (_Dp+4) + ply + sty dp:.tiny (_Dp+2) + ply + sty dp:.tiny _Dp + ply + plx + pla + rti + +hw_handle_nmi: rep #48 + pha + phx + phy + pei dp:.tiny _Dp + pei dp:.tiny (_Dp+2) + pei dp:.tiny (_Dp+4) + pei dp:.tiny (_Dp+6) + pei dp:.tiny (_Dp+8) + pei dp:.tiny (_Dp+10) + pei dp:.tiny (_Dp+12) + pei dp:.tiny (_Dp+14) + pei dp:.tiny (_Dp+8) + pei dp:.tiny (_Dp+10) + + ; Save the caller's databank and direct page + ; TODO: this might change to being done only in the toolbox IRQ handler + phd + phb + + ; Set the toolbox's direct page + lda ##_DirectPageStart + tcd + + ; Set the toolbox's databank + lda ##.word2 _NearBaseAddress + stz dp:.tiny(_Vfp+2) + xba ; A upper half = data bank + pha + plb ; pop 8 dummy + plb ; set data bank + + ; Call the interrupt handlers + jsl int_handle_nmi + + plb + pld + ply + sty dp:.tiny (_Dp+10) + ply + sty dp:.tiny (_Dp+8) + ply + sty dp:.tiny (_Dp+14) + ply + sty dp:.tiny (_Dp+12) + ply + sty dp:.tiny (_Dp+10) + ply + sty dp:.tiny (_Dp+8) + ply + sty dp:.tiny (_Dp+6) + ply + sty dp:.tiny (_Dp+4) + ply + sty dp:.tiny (_Dp+2) + ply + sty dp:.tiny _Dp + ply + plx + pla + rti diff --git a/src/C256/macros.h b/src/C256/macros.h new file mode 100644 index 0000000..5f1cd4f --- /dev/null +++ b/src/C256/macros.h @@ -0,0 +1,86 @@ +#ifndef __MACROS_H +#define __MACROS_H + +#ifdef __CALYPSI_ASSEMBLER__ + +#ifdef __CALYPSI_CODE_MODEL_SMALL__ + +#define libcode code + +call .macro dest + jsr \dest + .endm + +return .macro + rts + .endm + +jump .macro dest + jmp \dest + .endm + +#elif defined(__CALYPSI_CODE_MODEL_COMPACT__) + +#define libcode compactcode + +call .macro dest + jsr .kbank \dest + .endm + +return .macro + rts + .endm + +jump .macro dest + jmp .kbank \dest + .endm + +#else + +#define libcode farcode + +call .macro dest + jsl \dest + .endm + +return .macro + rtl + .endm + +jump .macro dest + jmp long:\dest + .endm + +#endif // __CALYPSI_CODE_MODEL_SMALL__ + +// ---------------------------------------------------------------------- +// +// Define code and data model used. This is to add a bit of safety in +// case the way a file is assembled is combined with the wrong run-time. +// +// ---------------------------------------------------------------------- + +#if defined(__CALYPSI_DATA_MODEL_SMALL__) + .rtmodel dataModel,"small" +#elif defined (__CALYPSI_DATA_MODEL_MEDIUM__) + .rtmodel dataModel,"medium" +#elif defined(__CALYPSI_DATA_MODEL_LARGE__) + .rtmodel dataModel,"large" +#elif defined(__CALYPSI_DATA_MODEL_HUGE__) + .rtmodel dataModel,"huge" +#else +#pragma GCC error "unexpected data model" +#endif + +#if defined(__CALYPSI_CODE_MODEL_SMALL__) + .rtmodel codeModel,"small" +#elif defined(__CALYPSI_CODE_MODEL_COMPACT__) + .rtmodel codeModel,"compact" +#elif defined(__CALYPSI_CODE_MODEL_LARGE__) + .rtmodel codeModel,"large" +#else +#pragma GCC error "unexpected code model" +#endif + +#endif // __CALYPSI_ASSEMBLER__ +#endif // __MACROS_H diff --git a/src/Makefile b/src/Makefile index c1c3ff7..bf20ec6 100644 --- a/src/Makefile +++ b/src/Makefile @@ -1,8 +1,8 @@ # VPATH=.:../../module/Calypsi-remote-debug/src DEBUGGER=../module/Calypsi-remote-debug/src -UNIT := F256 -MEMORY := RAM +UNIT := F256K +MEMORY := ROM # Define OS-dependent variables @@ -44,20 +44,20 @@ else ifeq ($(UNIT),F256) CFLAGS_FOR_UNIT=-DMODEL=2 -DCPU=255 --code-model large --data-model large ifeq ($(MEMORY),ROM) - LDFLAGS_FOR_UNIT=C256/flash-f256.scm clib-lc-ld.a --rtattr printf=medium + LDFLAGS_FOR_UNIT=C256/f256-flash.scm clib-lc-ld.a --rtattr printf=medium else - LDFLAGS_FOR_UNIT=C256/ld_lc_f256.scm clib-lc-ld.a --rtattr printf=medium + LDFLAGS_FOR_UNIT=C256/f256-ld_lc.scm clib-lc-ld.a --rtattr printf=medium endif else ifeq ($(UNIT),F256K) CPU=w65816 C_SRCS_DEBUGGER=$(DEBUGGER)/agent.c $(DEBUGGER)/c256-uart.c $(DEBUGGER)/low_level_WDC65816.s - SRCS_FOR_UNIT=C256/jumptable.s C256/io_stubs.c C256/extras.s C256/iecll.s - CFLAGS_FOR_UNIT=-DMODEL=2 -DCPU=255 --code-model large --data-model large + SRCS_FOR_UNIT=C256/jumptable.s C256/io_stubs.c C256/extras.s C256/iecll.s C256/interrupts.s C256/f256-cstartup.s + CFLAGS_FOR_UNIT=-DMODEL=17 -DCPU=255 --code-model large --data-model large ifeq ($(MEMORY),ROM) - LDFLAGS_FOR_UNIT=C256/flash-f256.scm clib-lc-ld.a --rtattr printf=medium + LDFLAGS_FOR_UNIT=C256/f256-flash.scm clib-lc-ld.a --rtattr printf=medium --cstartup=f256 else - LDFLAGS_FOR_UNIT=C256/ld_lc_f256.scm clib-lc-ld.a --rtattr printf=medium + LDFLAGS_FOR_UNIT=C256/f256-ld_lc.scm clib-lc-ld.a --rtattr printf=medium --cstartup=f256 endif endif @@ -69,8 +69,8 @@ ifeq ($(CPU),w65816) endif INCLUDES=-I. -I./include -CFLAGS=$(INCLUDES) $(CFLAGS_FOR_UNIT) # -l -D_CALYPSI_MCP_DEBUGGER -ASFLAGS=$(INCLUDES) +CFLAGS=$(INCLUDES) $(CFLAGS_FOR_UNIT) -l # -l -D_CALYPSI_MCP_DEBUGGER +ASFLAGS=$(INCLUDES) --data-model large --code-model large ifeq ($(MEMORY),ROM) LDFLAGS=--rom-code $(LDFLAGS_FOR_UNIT) --list-file toolbox.map @@ -89,7 +89,7 @@ toolbox.s37: $(OBJS) $(LIBS) $(LD) $(LDFLAGS) --output-format s37 -o $@ $^ toolbox.raw: $(OBJS) $(LIBS) - $(LD) $(LDFLAGS) --output-format raw -o $@ $^ + $(LD) $(LDFLAGS) --raw-multiple-memories --output-format raw -o $@ $^ dev/devices.a: $(MAKE) --directory=dev diff --git a/src/dev/interrupts_f256.c b/src/dev/interrupts_f256.c index 4c1ff87..c14e219 100644 --- a/src/dev/interrupts_f256.c +++ b/src/dev/interrupts_f256.c @@ -469,8 +469,10 @@ SYSTEMCALL void int_clear(unsigned short n) { * * NOTE: this routine might not be fast enough in C and have to be replaced by hand written * assembly code... but we will try it this way first. + * + * __attribute__((interrupt(0xffee))) */ -__attribute__((interrupt(0xffee))) void int_handle_irq() { +void int_handle_irq() { uint8_t mask_bits = 0; // Process any pending interrupts in group 0 @@ -525,6 +527,8 @@ __attribute__((interrupt(0xffee))) void int_handle_irq() { /** * @brief Handle incomming NMI signal + * + * __attribute__((interrupt(0xffea))) */ -__attribute__((interrupt(0xffea))) void int_handle_nmi() { +void int_handle_nmi() { } \ No newline at end of file diff --git a/src/toolbox.c b/src/toolbox.c index f91a8b2..fb48339 100644 --- a/src/toolbox.c +++ b/src/toolbox.c @@ -79,13 +79,6 @@ void initialize() { long target_jiffies; int i; short res; - - *vky_brdr_ctrl = 0x01; - *vky_brdr_col_red = 0x80; - *vky_brdr_col_green = 0x00; - *vky_brdr_col_blue = 0x00; - *vky_brdr_size_x = 0x08; - *vky_brdr_size_y = 0x08; /* Setup logging early */ log_init(); @@ -186,8 +179,8 @@ void initialize() { INFO("Timers initialized"); /* Initialize the real time clock */ - rtc_init(); - INFO("Real time clock initialized"); + // rtc_init(); + // INFO("Real time clock initialized"); /* Enable all interrupts */ int_enable_all(); @@ -487,24 +480,28 @@ int main(int argc, char * argv[]) { test_sysinfo(); - printf("Initializing IEC\n"); - result = iec_init(); - if (result != 0) { - printf("Error initializing IEC.\n"); - } + printf("Foenix Toolbox v%d.%04d.%04d\n", VER_MAJOR, VER_MINOR, VER_BUILD); + test_kbd(); + + // printf("Initializing IEC\n"); + // result = iec_init(); + // if (result != 0) { + // printf("Error initializing IEC.\n"); + // } // printf("Attempting to get status for IEC drive #8: "); // short n = iec_status(8, message, 256); // printf("\"%s\"\n", message); - printf("Attempting to write to the printer.\n"); - iec_print(4, "\e1THIS IS PRINTED FROM AN F256K OVER THE IEC PORT!\r"); - printf("Done.\n"); + // printf("Attempting to write to the printer.\n"); + // iec_print(4, "\e1THIS IS PRINTED FROM AN F256K OVER THE IEC PORT!\r"); // Attempt to start up the user code // log(LOG_INFO, "Looking for user startup code:"); // boot_launch(); + printf("Done.\n"); + #ifdef _CALYPSI_MCP_DEBUGGER extern int CalypsiDebugger(void); CalypsiDebugger(); // This will not return diff --git a/src/toolbox.csv b/src/toolbox.csv new file mode 100644 index 0000000..e299297 --- /dev/null +++ b/src/toolbox.csv @@ -0,0 +1,17 @@ +"00","toolbox-00.bin" +"01","toolbox-01.bin" +"02","toolbox-02.bin" +"03","toolbox-03.bin" +"04","toolbox-04.bin" +"05","toolbox-05.bin" +"06","toolbox-06.bin" +"07","toolbox-07.bin" +"08","toolbox-08.bin" +"09","toolbox-09.bin" +"0A","toolbox-0A.bin" +"0B","toolbox-0B.bin" +"0C","toolbox-0C.bin" +"0D","toolbox-0D.bin" +"0E","toolbox-0E.bin" +"0F","toolbox-0F.bin" +"3F","toolbox-3F.bin" diff --git a/src/version.h b/src/version.h index beac75c..6f591dc 100644 --- a/src/version.h +++ b/src/version.h @@ -7,6 +7,6 @@ #define VER_MAJOR 1 #define VER_MINOR 0 -#define VER_BUILD 0 +#define VER_BUILD 2 #endif diff --git a/tests/make_test.bat b/tests/make_test.bat new file mode 100644 index 0000000..0ee46a0 --- /dev/null +++ b/tests/make_test.bat @@ -0,0 +1,2 @@ +@echo off +64tass -x -f -b --list test_boot.lst -o test_boot.bin test_boot.s \ No newline at end of file diff --git a/tests/test.csv b/tests/test.csv new file mode 100644 index 0000000..4f5ebcb --- /dev/null +++ b/tests/test.csv @@ -0,0 +1 @@ +"3F","test_boot.bin" diff --git a/tests/test_boot.s b/tests/test_boot.s new file mode 100644 index 0000000..2e20700 --- /dev/null +++ b/tests/test_boot.s @@ -0,0 +1,65 @@ +;;; +;;; Test booting the F256k2e... +;;; + + .cpu "65816" + +vky_border_ctrl = $f01004 +vky_border_blue = $f01005 +vky_border_green = $f01006 +vky_border_red = $f01007 +vky_border_size_x = $f01008 +vky_border_size_y = $f01009 + +led_pwr_blue = $f016a7 +led_pwr_green = $f016a8 +led_pwr_red = $f016a9 + +* = $ff00 + +start: clc + xce + + sep #$30 + .as + .xs + + lda #$01 + sta @l vky_border_ctrl + + lda #$ff + sta @l vky_border_red + sta @l led_pwr_red + + lda #0 + sta @l vky_border_blue + sta @l led_pwr_blue + sta @l vky_border_green + sta @l led_pwr_green + + lda #16 + sta @l vky_border_size_x + sta @l vky_border_size_y + +loop: nop + bra loop + +not_impl: rti + +* = $ffe4 + +hcop: .word <>not_impl +hbrk: .word <>not_impl +habort: .word <>not_impl +hnmi: .word <>not_impl + .word 0 +hirq: .word <>not_impl + +* = $fff4 + +ehcop: .word <>not_impl + .word 0 +ehabort: .word <>not_impl +ehnmi: .word <>not_impl +hreset: .word <>start +ehirq: .word <>not_impl diff --git a/utils/srec2bin.py b/utils/srec2bin.py new file mode 100644 index 0000000..7ecdd6a --- /dev/null +++ b/utils/srec2bin.py @@ -0,0 +1,66 @@ +# +# Convert Motorola SREC to binary ROM files (both a 512KB main file and 8KB sector files for non-empty sectors) +# +# usage: python srec2bin.py +# + +import re + +def srec_add_data(rom, address, data): + """Add a line of data from an SREC file (hex digits) to the binary image at the given address""" + data_bytes = bytearray.fromhex(data) + for i in range(len(data_bytes)): + rom[address + i] = data_bytes[i] + +def srec_process(rom, line): + """Process a line of a Motorola SREC file""" + + m = re.match(r'^S(\d)([0-9a-fA-F]{2})([0-9a-fA-F]+)$', line) + if m: + type = int(m.group(1), 10) + size = int(m.group(2), 16) + addr_data_chk = m.group(3) + + if type == 3: + m2 = re.match(r'^([0-9a-fA-F]{8})([0-9a-fA-F]+)([0-9a-fA-F]{2})$', addr_data_chk) + if m2: + address = int(m2.group(1),16) + data = m2.group(2) + chksum = m2.group(3) + if address >= rom_base: + srec_add_data(rom, address - rom_base, data) + +def bank_has_data(rom, bank): + """Check to see if a bank is empty (all 0xFF)""" + start = bank * 8192 + end = start + 8192 + + for i in range(start, end): + if rom[i] != 0xff: + # Return True if we find a non-blank entry + return True + + return False + +rom_size = 512 * 1024 +rom_base = 0xf80000 + +input_file = "toolbox.s37" +output_file = "toolbox.bin" + +rom_image = bytearray(rom_size) +for i in range(rom_size): + rom_image[i] = 0xff + +with open(input_file, "r") as input: + for line in input: + srec_process(rom_image, line) + +with open("toolbox.bin", "wb") as output: + output.write(rom_image) + +for bank in range(0, 64): + if bank_has_data(rom_image, bank): + output_name = "toolbox-{:02X}.bin".format(bank) + with open(output_name, "wb") as output: + output.write(rom_image[bank * 8192:bank * 8192 + 8192]) \ No newline at end of file