From 0e28f898062e263623028c691cd8888c9f033e51 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Thu, 7 Nov 2019 20:09:37 +0100 Subject: [PATCH] Kernal SAVE routine now works --- README.md | 5 +++- STATUS.md | 13 ++++------ bin/basic_generic.rom | Bin 8192 -> 8192 bytes bin/basic_mega65.rom | Bin 8192 -> 8192 bytes bin/basic_testing.rom | Bin 8192 -> 8192 bytes bin/basic_ultimate64.rom | Bin 8192 -> 8192 bytes bin/kernal_generic.rom | Bin 8192 -> 8192 bytes bin/kernal_mega65.rom | Bin 8192 -> 8192 bytes bin/kernal_testing.rom | Bin 8192 -> 8192 bytes bin/kernal_ultimate64.rom | Bin 8192 -> 8192 bytes c64/kernal/iec/save_iec.s | 35 ++++++++------------------ c64/kernal/iostack/load_save_common.s | 21 +++++++--------- c64/kernal/tape/tape_common.s | 5 +--- 13 files changed, 30 insertions(+), 49 deletions(-) diff --git a/README.md b/README.md index 86dc2978..fd201623 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,9 @@ # open-roms -A project to create unencumbered open-source ROMs for use on selected retro computers. For the current status check [this document](STATUS.md) +A project to create unencumbered open-source ROMs for use on selected retro computers. Besides this manifest, the following documents are available: + +* [implementation status](STATUS.md) of various APIs and functionalities +* [configuration options](CONFIG.md) for those willing to compile their own, customized build # Problem Statement and Motivation diff --git a/STATUS.md b/STATUS.md index 41e83c98..c2864db9 100644 --- a/STATUS.md +++ b/STATUS.md @@ -1,13 +1,13 @@ # New features -Here are the features of the Open ROMs not found in the original ROMs from the 80s (many of them are [configurable](CONFIG.md)): +Here are the features of the Open ROMs not found in the original ROMs from the 80s (many of them are [configurable](CONFIG.md) during compilation): * improved keyboard scanning, resistant to ghosting and joystick interference (one variant even supports multi-keyy rollover), supports additional C128 keys * joystick can be used to move text cursor * pre-defined function keys * uses RAM under ROM and I/O: 61438 bytes free -* cold/warm start silences multiple SID chips - all $D4xx and $D5xx addresses +* cold/warm start silences multiple SID chips - all $D4xx and $D5xx addresses, configured addresses * wark start due to BRK prints out the instruction address * extended `LOAD` command * start/end addresses are displayed, in the Final cartridge style @@ -24,7 +24,7 @@ NOTE: extra features and their syntax can change in the future! The following ROM features are currently missing and are not planned due to space considerations: * full tape support - VERIFY, SAVE, sequential files; tape is considered a legacy medium, so it's support is going to be limited -* mock 6551 emulation - this inly slows down the RS-232 support for original ROMs, probably noone needs it +* mock 6551 emulation - this only complicates the RS-232 support for original ROMs, probably noone needs it The following ROM features are currently missing: @@ -33,7 +33,6 @@ The following ROM features are currently missing: * BASIC expression parsing * floating point routines * tape (normal mode) support -* IEC support for SAVE * RS-232 support * NMI handling is incomplete @@ -54,8 +53,6 @@ For the current status of the low memory location implementation andd usage chec ### Official BASIC routines -Note: vectors at `$0300` are not supported yet - for now only the locations below can be used! -
| Entry | Unofficial | Name | Status | Remarks | @@ -140,7 +137,7 @@ NOTE: Even the 'DONE' routines won't support features described as missing in on | `$FFD5` | `$F49E` | `LOAD` | DONE | | | `($0330)` | `$F4A5` | `LOAD` | DONE | | | `$FFD8` | `$F5DD` | `SAVE` | DONE | | -| `($0332)` | `$F5ED` | `SAVE` | PARTIAL | not fully tested yet | +| `($0332)` | `$F5ED` | `SAVE` | DONE | | | `$FFDB` | | `SETTIM` | DONE | | | `$FFDE` | | `RDTIM` | DONE | | | `$FFE1` | `$F6ED` | `STOP` | DONE | | @@ -169,7 +166,7 @@ Not all of them - only these we want to have implemented. | `$E544` | clear screen | DONE | | | `$E50C` | set cursor position | PARTIAL | | | `$E566` | home cursor | NOT DONE | | -| `$E5A0` | setup VIC II & IO | DONE | | +| `$E5A0` | setup VIC II & I/O | DONE | | | `$E6B6` | advance cursor | NOT DONE | | | `$E701` | previous line | NOT DONE | | | `$E716` | screen CHROUT | NOT DONE | | diff --git a/bin/basic_generic.rom b/bin/basic_generic.rom index c31a9ff71c4eef411ba53e3c91ec4b8acdc232c7..2760d0579cf44efdd014a89a5454bbba28c2a51c 100644 GIT binary patch delta 173 zcmZp0XmFU|q51RMN_&M%|1(x8%wMaJ`*M*YkX~wa^8W{(Me<!_1WXa&j_v5Rf~0JNHu% oHIGLJM4jQW1X1j~CLqd|w+*Or^HJWJf{f;qS*-B`%W z!t~Z$35c@gZ3C*@e3W;lAfxf*c=>ve-~)LD0EAajHUIzs diff --git a/bin/basic_mega65.rom b/bin/basic_mega65.rom index b3d156e94fe36d3c3997ffd6634e3c3c48fa06a4..7ed322bc82b7c5891c9aa0635c1b252fd78fe130 100644 GIT binary patch delta 13 UcmZp0XmHpNC(md;IbMDt03hcCm;e9( delta 13 UcmZp0XmHpNC(md+IbMDt03g!@lmGw# diff --git a/bin/basic_testing.rom b/bin/basic_testing.rom index af98c3657c7ca0b5e31604e3006ec9f343b48d3d..89d34c309db3b3b338903a8c31013f2b420e0454 100644 GIT binary patch delta 83 zcmZp0XmHrz$HKDUosaV5AQl~_rSCR3u$*CHTJ>(SAA2~EJ9#;~0hh~%r5hAnJ}3aW h580hSic~qmSwM6hk1Hck@#dqvGX)vVC&$Y#1OSqyA_M>c delta 83 zcmZp0XmHrz$HJ2N(dYf-AQl~_^rxE}Sk5pp{rWiBk3Ag7oxGggfQ#?r(hUlH9~FSy hhwM%uMXDU(EFij$$CVMNc=J)-nSzYQljG$V0sx9&A#nfz diff --git a/bin/basic_ultimate64.rom b/bin/basic_ultimate64.rom index c8caf81cf6e4fa5ec035f053f9c9afe5bcfd93c3..05bf4fc70e56ebf4a2d6d064475342e1e1818528 100644 GIT binary patch delta 182 zcmZp0XmFU|p*j1*N_&M%|1(x8%wMap;KL$CAidP;u(6Pr zg=zMO%?&KC8Kto40;&O`$*pYt?9)E@D1K*1n5@WdGueQhZE`I8F_2bO4jX2s1s^6S ya|Z#rlecp}1yS>ObU@S@9!n6#&T9gqY{#9whicUI73%i%}E+ delta 182 zcmZp0XmFU|p?UJ@N_&M%|1(x8%wMaJ{&bNdkX~wa^8W{(Me<DcQeQx^wqN2{XN zu!&hj8gS`LBP1qWpZiiCQ(*BgA$G@2K$_j==Mqvv3@AEbAxz@Fg}^RLc3;nXD>F{t z?B09s|GDRU=R4O{W-D`_=F)bAB{$j;Msu^m5O;O+eRn>({?645LkK=6GxcKT=nZsH zt8~sVq$D@vrP}F{CUhm{QNg!#>iI_G^MeY#g-XAKLw@RxND$x5M7PA z1`Z7pE7}*_4I+CO#~JFi@>Ku!eevOg43|72CbX& zZKP?fUHv|!aG;6vwuFctpMkN~x~}OHP1AK<{U@6G>v{)hFfb&erhb@+{PQx?U>K3( z4ap-YHjf+uCy#y|X!_`cH;1xL#>-O$t-S6I$c%kIIuOvtdN%9_`HMK6f>zt5{TYvEFagSG_(c4<+~w!p0($>U?`3=vf)hjs<(Xw*+l zoh78+(riIOs2U9h9Vv(gp+>tyXgDYuCD+gGE_VuQ4dL$sXnzPz=tC1hKYyu0RNI*m zKGjbnB^=%o#+$vI-ot}fnKr_ZxmTdi%S6@Z6}u*7P2X>G}6 zt{}o&#^t${;Ra^7`w!uURkZu%@Eu9R)YRU<=DraYyvE{3HYr!2$0E%tYn>`WbE46c zqrd`>K}k;<_Nhv)SEb9H#tS(LH8q>xEKpkU@`*Y=Sd!uA&v{iP6>SpkNZr7?!or_Y zt7{$^1Bber>q?9lHnTKhCZz>WV(8OXn@D3VMU>$FO$F37Xg6vKC_V!8G&7emrS>@M;MG$fZ%s(K# z5qX+lR%4kF)kbExaTO)zN}GeN`~qjpNG+i4!y){1$Rh1gl1ss4R&9F|UwpoS86mQb zvY_O@K@$kCCXFJXYgYVK`yp0g#f_l3bQEHPlT{))h;$ycs%{R40Nx>As>A3@c5uF> z;6PNfIsyjR88wZ9LhWW+%r=-QYzLx=rPJ-1v^dz1NeKuhUK2neY7Fc#TkU@%nkxf) za7svOfk*(d*)b*U(e=;Hc$FEMaRQd*50CPqMf!gDy+-8 z$?|_|7AMw-ksqzuhwq)zR@6o{zy9tA-o@Kg0;jo)G{p5P!uwe(Q@=j=^}%WQgfm&s z)Z8Ct&`lw*O^eLg_Yn}z*@wWRS0bROt6Aae0H9wUp`dQm%ixXEu4ZoazRy;k?yc>qD&g#c)MGy;_3k9+kQw zx^)Qx9M?{xUq+?#ZN&uE3|y-Bjk--fufqTYm@y;VWxRjI<1?-S?-PzRxZi+wx2rK! z6apZ+2D>jXJckcQWn0Sy1|5kCfBeatXjf-#N86`K_T!&2_G49dak@qcRoKg*iV(}m zt9c6Lja!w)7Lj$bXwjI}0*TfN0d5d~49wXb<O;F?^ zRchjsWffReW{8{)L?;?NoNdG#q#UF*(gwj*4|>U?PcHBxFeUNjIWl}@jvIYj++3xN z_-t;@TvL|N^0MLG*BD?2X2@_3w)t00KI&c_;^Q(k0=n+W)g7Hl)wkn5D>8~ zB5cadN%^+nT~?kGs&dQ90VQwf9IT^hfrFnN13*=V@JmzDKM+Q@EZSY)-dwu*XU;Y3=?gS56Jk=Aa|(^}=aR{X?V9e=gN=;zOB zOl!5`H50C6g-pl<0n*^-G#ft!iNRxjjt)rT(O7$6gZXfp)Ld`(-DX zvggYVA|2qfMMgJ5?_tH%^|@vUd@-&K%!?V40BLlw#wNv3Xr!p5Nu9tmQU`|OxF#Lb zqyzjZaa#$@!JG<>W8zO2_DoIeNw0x@4t2OX!IXL~)5^vucsW@vpqJ!)u%3AgFB!8R zSm5qYLi&?)1#g7cVi7z!H3k=KOS5l(b__>DxG;{@5PoYM?~dUoCvjZCJEkDv;*@dR z6vO{ea4?8xgMxQy{_;B%e6Lbf#8s`}s&41-LlHa?!)asAVUZyWb9el^>)ho30DW+A A7ytkO delta 2995 zcmZ8j4NzNE7Jhk;5P~2N+76Eb?H#3-Xlv=#)i~>Hf3?~5uI`MxJK(JDb*eK#acBKo z**X=fJY<S{|hN@z=)tlDeAmafHiI!#EZ)t7`O57Ll5FVP)m znQ-5^f9IZi&Ue0ZTi3O&^L)V--m57dbgzcOX=#GH(y->%dp6#>nqdgR<8G!?F1>Ia zE$UasjT35KH%_VDlkr(<_Lk4tyv8{j3GnCTlF9#sY5vZ37H^vh@G)pTrna&6)96at zHP&~UAZHLiHY+VLE?>T74y}z3J<0kB%|~aFcz?`zL3E)PG!KWK)4Rlt@TrXSt+2`% zPT{RnlGC`V#LbAG5v7N6ctaFF9F-nl{F@g1y9oX+s2tX{kcd4ed=o@P5fJmIJm=jE zx^dPsfp%-2voItkJ*V6xca|T8G|y4=RLb*l-;m0RK3zPJ6-Usrh~Dc%@vvt9GBBaySZ9`JD8Fi|TeB@B!i*`iO8>(zl zT)!4wo_y3F#TP@UH;VeRQ~hdyzf>=02AN5|AV9S`4lmPirAF>zO$_)5ZAdye91EHe zel1B*LrOU_U?Jdvu}hu)3m&uCKkP7CTJWYRDZTJc;o*d9Z1}g1Lh#fWZVH0ukuQm( zQR!t93)wPpqR9>;BNNMn)GZz zbIaPedo5l$>yl``liB4Hh?Du!r)pLb@=-Q4LX>^{LYYBNB%RFBgR1$!N9a`M1TK&0 z6DhewkyKVLhiSPM8f65asrWE7`}j$D6}~-UC4D~Eh(J(H2>heBY)Fx4p1Yb}a#vXk z2tkD*{8UPM+PvIwT-+K3(;fVkI#Yl@wR06Eb~|1Ze*eY7jYi2?=)Xk|U5Y?kmm4n9rL1r@-L zHU*(A&T#M};-R*o_QTS(k_u@he?!Z*DLJ!~Ij3tA8e1J~(fAs&aoxmzg< z-Q%DD6q|X=nJ#9MxS6h9dUC;RLVjSdj|CUq2lv3^L86RO)=CDSXLShPHgE5@3xvt$ zO8qqek%z;~G~^15gR9KoF_7?dP--qEjpb9h6*b9P7#*;Z><3n7zsebiU4>jr9Qkj* z#J;ng-SHB;b304)g9<~Ps6j{Q)6t#(L!H`{tf~#BQJBAwAV}~GnLcw7M-ye5%4;O;*7lX>7o(5Jq z+_QyMhI*c4PqcMIPG`OLXhtCO=~VLj^Pjc=ybOBu!HxEM{7q0Xm=VoW43_hv0obh} zuDscWDBhbML{xke?Mmamcr$Xw<=X(lZpK;F!;E+Eb3ahX$FPy7F(6!gD2@i>vMrko z2j0^YVVI{0^p_dW9`wMBXQTA1s=JDTkPgKG@8L9jrPr%&c>I-FWfxy&;ngC!73HS` z@ZUir0Q7s@>PrH+pcA^c$E z$jIl`x10NW~kq;Qr*YqK@?$U~GdmFt^JzIBzSC4f#0nZ)Pb!lb>ddjTPp(H}eDA*r#v{>Eh*=n(KHp)A>!9{A|Q z(SrgtSRu0xhVUC2x*V1+l`ngA>y&cZIHneijwxdn4Qj~NDgF9j#lNE2B6Txw3eaRN z6e-;nFoJUUg_xd@`BUI(NO`cUNN0q`D1IjPzW}H|=J0b#sZJ280lNGBi)m7k{r6Md zTv^<&M%>}9S6TO*^q8=&1u(h z-SUv$NDB(g*YA9-ta@MRF0S>}-3yEN_pV&_RbWBMm5X2fJ3Q{Mb>*pQG&(aAjn2ZK zs%dj`QM7(>3=AvmKk%g=sT?GNb9qig4=1F{#wvE(l=R1nb=4Qtz6qF5seNOVcb!&O zkDf;BW6D=q!=#~#o63N$C&jDo88HFH)?ym)j!MyrzdfY8wONlU#I{qFOM&KZ=1ai0 zs5%6X1b8#RjBIi-<>pQaR?0USd_3-%m8n)O)m)=)gLcR3iVpsL% zM2G?yP6m}x^=l{${$hFu`h5zD13V+7=PPUO*qjgu0LERc*A3Y?`O>^v6yP-!h{7WL z;5F}C^8?7Vk zZYf|2cmdVcS*5K@ZhQzi;!yaElkWMhyh(H%9}hizw@4fGbrr9ruLL zhK!SG>(%FcclV0D`m=51*t_&Q#dqu-8iw&>y#T7N8N6o(63>gw8R?1@QyToGJ^Lc@%9+L9LD)mSWIFjiQiT6Y(g4d oT2=FfiqEJ`wOrH9T+<2;Z<@t(QCt{wo|75EFxBac*SP8b0-=cICIA2c diff --git a/bin/kernal_mega65.rom b/bin/kernal_mega65.rom index 10db46b38c21e704d8ca74cf9d9523116434c9fc..1808816e645a5005d7ca132e40b27bc5eade07e2 100644 GIT binary patch delta 2795 zcmZ8j3s6+o8NPcj`y!$Xf?Qs5sw9AUsCgKs%>!#vH}wQ<)27-^&1uq^EQ$6xX=syl zG2x;yVwN7vfY#}9-RrQ7!a5nNm=N(rT&$C0)}S;pF`4WFS|__G-n%St``^3T$#iGu zydVF6{_p$#TVGvY9eO^)c2!eC=qmMO{BrHX_x)hSeM>ox5d6BI+bU;YzJtx`P|jN~ z#xq*+n`-OuOHt9@k6^xW=Ij*&8B_gNRNBB6|l3 z@<(x)mRKuRpP59DU+>w-hY7QxKWVsq+yZ_?O;QFz2`HYF5nJp~7!^nzmRUxn?OKVh^?0rnlvRn%5 z@q#{`mHF*MH7awqif=rt(gMfxj@dV{f3(MTlfLEfc>M)(1@UxvQ0WvH1q~cc;T5`a zhzU5ELJM`}2(pcY{u8vI&B;&{J(vt#P7e(Qf0d38Q;tai5gm#t$I~_XaK_IaIB~0U zYKC2h9UI5YZNV?iO%PIZtXw1n9wqoVZcc7>D=c1k>NLv?auV}&ioq<>;psdOM%y&n z?40Z9O`(!$bSy>pIm^noX(CCl+5ajpTZbQ>jL#ZyX=oq;i}0&sz3V1Bdmo*os;F4zIo*Xzj}cdxulX;kI?Wa-{7AUg>Gu$e(U# z1&o<7__Z#YRCd&%`6gE(48ze1pk;1W$rh<`bM^y2TmInBpLvpd=>6`w7Rx;A6l`Ti z_^DXM1tOH+q{5IHgq?3bsn@x#}9JSu?_bN;M47!_%XPNPUjVQA3{^AC!X(? zc|VV4MLlkGRr7=`%qlO38JXLT*r;n-wn2S`#R>N=*Wj90P{h@94SD&6MF!r+QgAHD z=xW`QZVaVvb9!(FMu5{7gPg(Xa|WkBg`qMnbS6k3FwcVM9!D=HL%nE2B6LvdGO8}A zTj^mA;CdJEyc>NpV~p-XduBrKp@TC@S7j-iwbhOKZ=h>8L+=18eU;Vm&r!aiAYjO& zI=wb8KVuD^QmG?GXWG|o#G;fT6`e{Z`2Q(|qskFPz7^CnCZem{ZNC(^5=k0Bhv zdd5TdW9&7rb-F4qG;zalU{kY^qG0-_ashSd5cos_f0YP3eD-jLPY9QiDuVu=1e_&O z&dWe&+1e}A4{JA>Fu*1V`cxn7%^z{8fP+uyv(XiR)M_p>OqqCNAB2RVd}f?TtBT6`nhCnn{={quRdxSa*CPLSW+SFX%~xcIq~hvLoy9{`|F<1c57iIhA?p>f_T z=NsZv35C)Pf~0g|D2^MgV@7MYDD*bWf~4g>5Xd8Y@J=V2J=^$$_WOSVxS`Dtsq&WzrP8Dj@ z!5m5)P-ueFo3056>b&`7aa0;J#81*?BpD4j8smX!ehLu?VLPTnwG$k_r1SI6vtg_D zWZieK&pr2?bI*6a^J+?KN_w@qsA*j=b(#>1f!bxE+8pbHGfCmKJVUvNCL ziK{u%yf9;Vv3R_4)8T_Vx4&M#eanXR1$$%g$TDr#KKC^0Qt(xOeR)fHHCh`(FGtb* zn2>pr8DD0aHzdW-fPyNbXo)JJO_>Gx1B%t!VePb3g6}s$WVO50wdmq234J5$pv^T) z)YH(qXf+(=(4i+|@J6fELj=9(de!do=s*$Q4XDytV z zn?<+et*3|exqLuwU~YB)OK#8)cTdXCYHmr!lMQT+Ondb|EzAyru=mAShUS(x5zgsL zNK2ghvFxB^Y~lCq4$&OLI|i+cofF;h7(HOH+Q1L@OSp5!MJ1h+Y3k>RleyL(mMtXE zFR_6EA|5v_6d05xJDH2;!p2iyqU(vvI6I^Yz8B_+G|URwAQsFphyw_4(~n^|ZWe`vkAgVBh9`{JDsgyE z2omh!@NfP2jZj8{gCAX_H)}4@QvE8MeMAM6K|Jc^VDImusl5|1a}tOo`2xMNm^Qy!FeU zG0&auTAia#cu8Xc=g$Rj|3mcc1QGusl@4Apy&ztd zmLeAw@}8$(YfISOQL5D~&IOE#Bb~(ry!G9y_ulasy?qXCu??S~Y}Pu)56#H)^_esLw1-68d0Kc3K6_lBps4N45_XKr?#94)Px>C8>5f+uKB#K%6)1qoBf9)i~Iy3;0AdiSU;r zcv~bTv|oaYaMwsIEH9-FH=2q^8klj=ZfH{507$28Vvm=VICp}G4&pUI{(=4o(9h#} z7}rgrGczDKrWo(20)s>EO>=PGLSiA}2tMTA?4? z%1Sa18-b%Hdf$zhVvw`z2>@`4eXKTs@)0FT<-pN21{@7&VvaDirbRh12by`S{S(3iiUQ5pDvPa2n4M7i%fO0c9-3hEoV~-bb zRn*6CvK2;AT3qcZYCD0d;PKxAqR*(e`vN|EBPtGSePP3(PxKYb0M8rIB+pc%x1-5U zw9KT34rm5dwT{5D#Npphs&%Xj!mR^ifHP;+##AWd_x_iQ@Z-{dzC>0tr}L695Fbwh zPDvMNle7T=r_G9O-drgr3c#K!Fa&#BION{gaD;USsg#pP2Ny1W6$}8}IsB8P)u#A= ztqwf0x^hzVSwiNd^P-Qhf*IiZacJzI8dNe=x;=M!+6Iu&k8_JOf1y3OTk=0p+DF42 ze3Z2NB$I16ymD|D*j)TtJ&hLS6|p1H(@p97HTvpNA#oH%X()e{W)aOV*fal!ExFY0 z!X-2GPX(`ODE+Qrn{)E8d6v7XllaK zhO{BEzqnAETVIaSX3>Lb&mZB-!~vySaucmrErIpTA;kOflYaYg;yM@3O6BrXMeGLq zaKF%ZFFd6C3bUU&8^Z%Jyi~!72tFLdAH}iPkBN-;PvUPUur7$3;A diff --git a/bin/kernal_testing.rom b/bin/kernal_testing.rom index 118d094c5e8a68f615748df4385929b4a8784ab5..2c45f902c768db3baf09483f9d2ec0b1419ad92d 100644 GIT binary patch delta 3087 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 V5x{9~$LA79IBs3^t8av<{{U)n^LzjR delta 2878 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