From ae80e9a596f10368d3bba871cc66c5bc5eb70147 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Fri, 1 Nov 2019 15:50:41 +0100 Subject: [PATCH] various turbo tape improvements --- CONFIG.md | 8 ++- STATUS.md | 3 +- 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/,,config_generic.s | 3 +- c64/,,config_mega65.s | 3 +- c64/,,config_testing.s | 3 +- c64/,,config_ultimate64.s | 3 +- c64/aliases/,aliases_config.s | 9 +++ c64/basic/basic_main_loop.s | 22 ++++--- c64/basic/wedge_tape.s | 36 +++++++++++ c64/kernal/tape/load_tape_turbo.s | 49 ++++++++++----- c64/kernal/tape/tape_common.s | 98 +++++++++++++++++++++++------- 19 files changed, 187 insertions(+), 50 deletions(-) create mode 100644 c64/basic/wedge_tape.s diff --git a/CONFIG.md b/CONFIG.md index ffef262c..5d2aad10 100644 --- a/CONFIG.md +++ b/CONFIG.md @@ -107,7 +107,7 @@ Needs over 1000 bytes in KERNAL segment. If unsure - enable. Adds a minimal turbo tape support - just LOAD command (device 7, like on _Action Replay_ and _Final_ cartridges) -Needs about 350 bytes in KERNAL segment. If unsure - enable. +Needs about 400 bytes in KERNAL segment. If unsure - enable. ## Multiple SID support @@ -211,6 +211,12 @@ If enabled, a simple DOS wedge is available from the direct mode - supports `@`, `@`, `@$`, `@$`, `@` NOTE: extra features and their syntax can change in the future! @@ -32,7 +33,7 @@ The following ROM features are currently missing: * BASIC expression parsing * floating point routines * tape (normal mode) support -* tape loading ignores secondary address +* tape loading ignores secondary address and has no pattern matching * IEC support for SAVE * RS-232 support * NMI handling is incomplete diff --git a/bin/basic_generic.rom b/bin/basic_generic.rom index 4df641d467182d1f4fd54639442bc34d8e2c16c9..92d9c9310b555727adfa63938f990a5ff5d64df0 100644 GIT binary patch delta 2020 zcmb_deQaCR6@T`#NU9urAgW}O+WI{P`4>ls1Xl|s+;%_AFq`Pu7>u< zr2XT7Ttr`0A)&>3R5A$4ljZB=+Hn^PRZ#=M(YjTB)&>uh{jmv&(OXdxSd{T_h#LeGX-p_hG+HysIvPE{+@05mLd=Vyw7+Z?o>DZ2RZn6jA>f0k~tMP<57+e|6sofDPWvbKQIN{%t%J2o;w za&6t3AuK&&w~dl{#|n}U*VkSb+!aNeQSl6(8sYq)e^GE_;_B9ycnlMA3x-M-9P~>M z1U4gG^q#;-ve%$f_EmHbGa17np06rq*>Erv>%Zw-B0H%pI*3WaBvuniF=d!>T+J~X zSum=8O>izihS}T${KXze)&`pMi#J(pvCd+srD9TK)Z31FqLMFjLys^NP9|yz%UzpP zX<{A1Ne-dP$!awU=zw+~9n%gHwnC%cLya{b z6Z{l5!{1lJ&<!!QmDN%whw+<$hBoR zS)OcvZYQ$zua3kkHQqbr&sRh4Ob3$a+^(|&WFN(*z}w7OPuK8<*>gT#0L0pmaUnb3 za$NOQpLOe+&#I#~_1S;SH3Y^H=(TCH6NhKZ`m$#vIZ~Jt$(uRq`;%mg0#BRZy2JX~nxkpu8k~Ep~KUu_xj#1fauT!7tvPI_fv%6IiDe~P&Q8`u2N>>Dz zKlr-fs!6EWP{R#>ab3exMVVw3gNzi_tb}5fvyy6t=C);JOK!%ev1mzIsaWscefi2@O}6&~O1e;NJq*tNRPfyY;#r@kd5luk*e-QyS_EnnBx-RthTl^(FpOp1D*>$4WyD0hLRH zPY3epnDWpi^_^7UU@)aNi^>G(*4DnR6tCn2Ho?DO6Ex`wyM+dM{gP@{iN25j`j(C^ zPlS?`ez@aT^5QI&%+Qp`FNVtbhz`>2X`7-aOO5+Xjn>Sq8tQQ>4Oyni!-b-?)J|%l~ WLk{o%q3h%a??wdtW3G+&%l`o!f0*$A delta 1929 zcmcgtd2AF_7=JT6vqyJrixz1;+Sg*ZsRg8z!a@N{7a31LKn11=clO(oHiR^QODm}CG=dXS{~;PH?IIx25f7p!tlv{+PZo3=PjAawu`j~_vCgvm|M7kXTU}Ylbr0$5e^;LB7xqj#IZ>(JW0%lq+8*$-&e_Pf$L+-OS^6Bg7LI@Ij9$)!E!=>jrHF!fj=JKlRItJz<}+9 zc-QptdDdtn&$=nm78uC0a!{l*^^c$U%Y&jprb~7Em1=eNWbVx?rs(L|MuVD8dQz9R z=yq_7YKt$Ft7L6=g+tm9wE=XC-nr23ST#l{oSTzKl_UbG;zR&f$rvdwt{a2v9MV3p z1vRr>o>ICqs?AhpY1PVXst;;@agOQ0$e>%h-tV+~?3AY{)U1c1l`sRUU?x<` zm@#zM&>WZxH82lO53P^RhXt^{=WeKlg-{0pSOoXL1sE7y3`>S2xEJn&vxE1;1Mna` z1WRBkEQ5z(Ijn${@CZB#kHIQf4QoJ#dRPmO!#Y?G8=wJ#un{(eU^8riC*VnV3Z8~% zU@JTe&%yKX0=x(>{SUWbZ^DYbMYWgy^Ci6kYCV9!%wYtk#4KO*07 zgz$t2gt!UkBo3Z91&(*)r066>**<~%&-bhrfv?{d0z(#|fp%0l0E z7hmzV&$}fas<)R7di&-ZyAw1`pK{~mGnMf6;#pgteHnY8=l)w z__TDUL&iO9k|Zq^o)qEH<_qRexQ$L?M^u>}$)aBDL-#1YA;ZqPXN(t)>S0<0 zun8vmq(gwD)zxVJ-WF?&Zj(}3g`jnVwidbfhUnC&ebB gw?EIi?XxF1E-YSmMDygG<#d{c#e@DqH~e}10XT|$QUCw| diff --git a/bin/basic_mega65.rom b/bin/basic_mega65.rom index fc64445fcea63f9deba76828b70bf512b50c2085..13b667d028927f0d798b58924efbcc08a501d39e 100644 GIT binary patch delta 2305 zcma)7e{2)i9l!I%_BrRoh9=+;NM0D@#}cw+D8Xcyg-uOU@v5<{5*yOgqlMPlAC)Tc zSG?9p;mM-H`2xdO`?wF&iOd2^-}n!0Vg1O;yjs$G@#)_jsRZxA9B%muVYASzEgjR21y}GyQ9dc`*upp$C{x&c#AHRK zCLb{v%TqR2@%f^B$h{>VqhW3DVtYmlFLt1#N^&bcpB2#@(NBRJNe2DZ&fPcatl+}o zggdzb&!xs0*E0UOHsZ}PE(4kCl5Bx-joa)p^_q9Dc+F+hw4!;fKc}i2`b`ewDWesJ zxe0Xmk|WfW=r{J|_G?~=*W--jg?NT_mlT6wwPDGd@`6Ip%q^RrjCdg_?ZXcdjq65-7O42drfLWuge&{aE{ zLFco`SWLD#W77)U$+h3&7d81^Ph0aVMNJsYpuLk(NzitO7X@jz)(QGML!#W|J;Dyj zFL-;OJDSQ}1+VaNRcn_bT8DH1s!-}%aDnZ~VwQCoxH^MKXB0N+MRT^=k!nZp*kDKe z99s@vw6k3tE)m40kx#|T6AA}~H=2)Rq5!O1&+m@Mq#pf-)cf+Tct)|&^=vd9HGXBf zKip9x{jF>k^p_x}vUw3Z2%4@iWK`lM0pLJ8bb~R!rwL}$vgS2di_`56eXW8nr=72t z)3{Do`B{eb1i#5Dp-Ms4PZ6xSOw)*ypWz3(wbm#OFSqp>rB-Jfce^c3udrX zpX177VyQXjK0X#2B4WAJY%W1BIdlMJ=0O*9JOJTY9;454g~YJbtn#C?32E!^-24YPPB;ofaw6FFbL4D zLKO)O)j+u&7=m(BTtE){9ENa;_!_xR=E-~H?_`0zPi_!Go>iYwDOn^-HVQqVlryveWgJL8bPcSB;8C8e1MygprYntW>&0icgRXff%J z4^{$DvL0xAe0y?f249;*U!@~+=+RWJ-eHayvDwOPDvD%GGi znl(RNKnXyb>Od$C zuQ~1Pln~T_J8Nu%VRIHpFlhAU{AH-DuR|TR0!Ddzs!EyW zQw|fvyUZWrm$DDLZ}35Pj>FlaGzZ)9YdSdle9Tn%syBdnF{8)jX5ZIb*R%3tzCG-`9P@47JHOx%ZaUwyD_{gHA1Ij=(eu;JA3rr+ z9vjT}R5ysuj?hqjW^522nigL@TfaZ>3R}xz;6QWBuC@z$wehE23M7uSy4U5F)-EfnINa9 z&#dG0;+gdv+Dh>ZkuL}>a!&BbMIp53i%uG?&#*0jvK0;;tuM6?*d2fX+^;%E0>k_d D^(HIU delta 2168 zcmcgteQX(Y{TYx1U9zm^Y@m8NM{cPZ0~r@cr;R4P;&T#>d|lRz4b zk0m7zYc7~>*=*l7+R${KcX!VD?9J|oLbACH5>&oO9k;4T18Kt4kGoVwaEw8PChd4$ zJLN;#-@HEG`@WB!-}C)EH!(ah9DcF9Q2ydWUpV;rgI~UHW<4QcjgWRSLvZ1S7ZQK9 zeSPf|ZYN~swc5fXA+9)sG8kJ`SUmX_V@FsfnXH|vbmVXQA0#S#_`#Vc5E~C`_^xs# z;}_P@Z{H?W1(S1C?3&V^>SAh{L2J-|Z#7A`mA=e??eTT%TyMsF?R;1uEue8EYLg=} zc{h{uk|RLQs!^W4q0_Hr6W+yq>I}z6nr|iQ77M8}Jcmb(PB-(~`RO}&O`l%RldV7( z%ABBdi2Cctx3-p{q9+jt-$U|z*$Bf>9i1WJAA}*mhi;Ub-C7W)f zEz%o`+9Ge*Zq~`&Y8R&Hx3(vUfeY=7y3#B3sy@{-*-LgSXg$VK>UZqz6qwd-tHB`F z-%;zJ&?<18kl^xxU@?#WhQxprs^9M8l&--W4slfJzQKuO(#E>Z&D$X79IUcVbB-!= zmUD;!Dy!1_^&RA_u6ToK^4MHR^eR1r6|dN%^dh*IX}~3Iavybsq$k}2BPi(#5^00{ zZ26>oLfM>x)YR+mz-2ha%-0?uSL{$4Yk?S*WCzh+W@SYH{E0wo-{XG?(AA%WriWe(TQk>0rrkHKNG+ zLP`3PuccvL6Ue+qRZaSqZ(}&FX&lx&`M}0<(EJHMS+X_E2CHROk(jShlc!T@;~v~* z(^&V-#!#-Qm>;!1i>d9RA8W*~lY&i_?I=%OIunIKJd&<dlX4J^4pr+I>FDss zr`1t;j23LE&AVwMHbjU#r6=9<-+1ZhO7lPQjE_{RyW1PluOC;AH~*F9b;<48A;sGF z_kUVhed^RfkFVHRTCrny_s24`PDf;=`EMcmxlAMyX|hO}NMB>R zFqsV&PG*CM5-^Wm#BE0$8yif}&5ShLKnT|TKJk8KNZe1fvJ!9|z#^EGt5u8H!%ly{ zVN>{KCM-V*--hqNQ}A8*9(*5u0AAT6KMkWW1}EShcuf8wjKc{f3={Apcm__wB!~d1 zQh5sWi$8`4`~-eqJ_XOhb1)6h!wV3F7{oz>7vUv%8GZ_<;S9{c&)_V~!Z~;a67VV{ z;Wdx}g{qK(InW>tI%FUVufrRVgFKvvH~$Ym4^x6;N5F5`e!n#AXyhr51ar%-j_zzV zIepQ~*fWN5+-g$%*w#GRtJA;*d`p|#I$RMJacQ{i2`^VtJVtYrXXAdp?W;S-ubGwA z;-x0@L)E*2J$&a%Vf-4lwwLY3Cz!2U7ZMYNacQ7^dt={y`+5&O*xQc-aI)^uw%X@l rUS}5k?xTz59hiH*Xnv?Qi7lE(+<;abfmnZs?`Fo%4D1;|57_z_#e(%@ diff --git a/bin/basic_testing.rom b/bin/basic_testing.rom index c5f9a87d19f6041b1f66a89c8a04b35adb74e922..4f7b7003b39782bf0e3cf7757e7b5288279a75e5 100644 GIT binary patch delta 1852 zcmZ`)eQXp}5Z{lsyX~I6L%yz5t`9KLLaD8!<$xBUQaRx94Ppr5QUh%HgJ_6R!FWVj ztj5HHwWLTI*7e@Cd%Yuf5adG-szJQH#JCVlB%*08cT^&h;fp0isu#>AJ~_c8OE zc{B57=6289J+={tkId2KU(Rw1ba1xEfybB)!okCq|=pdgMtNc1sQCq9bVC|Q(|)H z0mF*uM`e4_V;l5W)d=$SXpCBbTv>gsde%M_I46|s(m0g@I%*xlO_r!qS|f@vfiz6= zTuE*eH6J=0C$o*b<31UTjpGZsG=2j8}vpxN%LyE25bZJukaeD!J3>F*(?8LBsvdu_p8##MU62ESD{2 zvZ%QWWMEc=qDdPMbO8|GB%n*<+c#xA59L=xN<{bijVi0yK-L{p_^V&^f^~m82GJ_9 zeS;Nj@QVn>@)ga?(5mH2SEDt}tJf@Awh%R~U4$1X9~R9SO&SAaZh-LqEaz=43`EhM zu(E@j6Lj1a!PeP*3_Qv8RGelE?Cij?6DqB7=yX0@6`6*9$U_i-D4};C*vDJi*JV8S zVGlo*)hO@rmeC}$Aaj&P2U8T&nWqP@ za^{`$oH+G zk13)szA6;!1fWBiA8WHmNpCRpv&N=q+9(ORhAGQ@V%IQD=0tD zL2jOl5y4_}JZMhqlw$(a#pOfYrl+?w!KORJ-tt6YhqrY=O!t?#k?5R8{|4&m+MC)E0T31ttykO zGloqjleYDwK~I0K9$$%fcsJL{b)>$PawGsmS<9f?ErDjSq|&mQK;AMeYelkdF^p(O zAoWT2D!54Mwl!N*47W8JsC{m$1Pm<#?mtXm6~je6BHDh${_smj(j9?hodXbUac^rW z$l@hO#AEwP8{GTp5*FX;Q7%lJqTHTXR=YK;KVyTVP&nYGHtGL5BD~v0yV{jT-%4hE zL<#w7WvJA--$uyICZ?Y7$nQ&h6s>w_WXzVE4^ zAA%T_>p!RrM%6sJ5|_Fq<0G^1<`V_-rL=ice;Y1Ln+d!%yL^?kp!xag+F7-=HMP~x zJzHH%QBX;cV<%91e~865Qg&mU40&)p1x5D-*(HBDLb3ltil9~E&a=4__`S1e2ibcX zHAfPq6YK&V3nJH2WQ=?ol%2BaV}PuDRWWh$)~xhos5qMOFq#h+pV>QoPc@oBz*+Fn HNge7>!mle% delta 1765 zcmcIkZERCz6u!N;UAwhgySd?jt$P_N47RcX+q#dIZ7`^C`P@Vtn3O135@JmJLF}TP z!kxp2cDb5pNRy`N+q2uPqzgY#qywXa-6i715F`H3;Z_(%@n!@gAyCilATcri^xowC zJRk2l=Q&SbTVLCjkEYK|Z|&UF-qGH*I?O~|WP}yW6WVB{W@p+Zn5i}G#*OtBBQq+; zUrAB3Cr(^rKD?@Nrp-bPb=+bEN2z#Jf6~xBlbrCL9xN#5^1Y-a${&l8jwpXb5|102 z0}OuNM_xQxCvKnM@BNDrb7%n%YP8oz6V5Hs@C zzmPpc;yP1V+u<1X3&xlcRZy3kRsQTZ;$z91G|3T5m>S1TDo4D)zaNzt!7s5wFU~H( zEoFpeEu=Mu%>lYnaM5bP9p}Y{)5lNxM={9v zqFG*iYGXi9(%VBri`SVzt>`AItTKZW%IPQhR_T*cuT#qA-H#AK+~sKH>XERwa^z+W0ZuO+ ztmXKFQEU`V21}6KmR$!>fl=4XfnY&iJXI0*r0j7Is(Z1fX1u9F16r{(i$@SDS@j!! zg}u@1rGDovo#3av*s8e0W>YxqF4`ot&}N~PbVsSn;Le_f84a)5TUY5JJu0~mp;DL) z%+o_t7QI>r1fq*zF_b|$*r5UlEP=+EwKJ8l6rO^o;quIZ=rgbk4xC>ORj>k9LN(NY z1IEV+qO0IytQP8EHJGAnU@g=`12lpYnxGk4pcP!;hIP;e?a%@1VFPr+M%WYp4?GK- zVGHoE6}G{4*a16X7j!{4JO{hsdDsIlKo9JNegDf}^l!7G-Mmoz!(3K(VK~I<1}1HH zeEdtp0|Ntj7Xrbbec@$TtP)Q|Uy8tao8^GN3Su-IxTXM@AyUdxN8PnwRhdaX5( zI9shE(dBV`Aqn?YqTO#QO#970%6{XdRM+oWzID-#Ej+d!D>b`_GcjSh8RdvI{Lim76JA sESyDSpKIsEcr1QdQC`_K=UW~$#3%XOvHqH44zh+~pqPLx(PW3e0h7)0?*IS* diff --git a/bin/basic_ultimate64.rom b/bin/basic_ultimate64.rom index d6c333b7e72d5afd692186bf329f3a208d9a8efd..7466b691b6179c32f08a92dbd463a434ef1ff446 100644 GIT binary patch delta 2007 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 IGXC)T2erIdl>h($ diff --git a/bin/kernal_generic.rom b/bin/kernal_generic.rom index dc594837987a9d256e0c994a4e379e4942936d11..7134217e564acab52adb81158ace005cadf15516 100644 GIT binary patch delta 4343 zcmbtXYjjiBl|DLG56d8s9UkJDlLUgD5-=nI({_r@BN6QZdw`@SwCU|?S1MegEa6mj8J2)9EKN^NBza(3cHTz0r z*8G@%bC-Rz?>T$#bIyKzdtY0Tt;jn3|9+_JjJewELmo{%QrV4D7SH^U)iu{FVp9OC ze*1afF|4w88%HhlpZe@}dv?3kb<5&ek>RnbO#!6(ZKUrQ$flXzQJ6Apy&@M-sY2PV znbSyBIFx-%rJ~3Cx{bpg)P__{6Kq$r383@^$5u3@7*LMntXLTZGvkV=aKD-v>| zS!yMR;*uW*GMJ>gcgetiD&w5nwA3Bp_AXlI^Uol9FIoQw7e~Ek=s6!x*7<;LI^+JC z`bWA_U+Ud;PpotQlAHINUz~vOdrUbG6&{OnfY$xEpc}5Uk91iS%oPb?>3IW=+{+-tFDndNpHB} z8c#g^^xr1kOEoK&{mT^DINJ6i4)IJ&3gh(Th^9~QlCHR)Bj;oA%KM1BT(ed)n4sIn z-5$+qYsd)4K9tbQv}!~O7Y^kKVOWyFrgESNQ~0E7ny`$!l=+Am*}`ta zTIUff_mM1;vc7XjCymYe(p0767nTb1ELBg_2OK!^W zOKPH4a!VFGN^^hggTe z(&R)eV?08?it!MYgMpWZjIn$xy_{0Es~|I@ing#U=75ezjI+C0jC3SmAJ`UFMBO?c zG6Pq7b;|OB*|Q)`&a$T&EtW=0Q(+l|!51K75xmN~ZVDYpUm#y4W6@SE*Lu6^U%`7Z1pq zZezUQPIC>G)t}d3zWGfozw`NhbXGx!4hq9DW3RZHt{W=k8#=saO*{!EAeof0AtAY$+P7o|yX{+C$io4J z&)i!UKJjxy>CUaYc9BwAyoZ$RAiIl8w>k_@mOQ;I`h8XP-z@7io|{ABCS9mSNC z7Vp@0jyy_smTV{6x9!?qynAy{ks!OD-npq{CE2!hv*9P3wvaVz3mrU_Qtlr0DoXw? zK~AK|aEktJSbUi-8mK`%B38Vod|`FE4JSFAdv`cM5df#>>vt zjJH_mV}E=#`x&iONq__oV?l!VWZR8No~U8~L}W|9GPWe>@&QANgFjyQpt7y%LtZ#t z`Ek`pib#HuJjo*)g2%WF71>hlsZ?q@nTXxJb;epz>8Uy?h-G|**VAxP0)jpqtw3v7#)dNk+F=_{#af*qxkd>Xh{D`*C8GjhBIV8VX3YDMI5ZGlRnIx{MRW{8cee)NJkpp0OV}ZJix^{ zh9!2P>i0R1{j~V;XLoHy?w0#{)CU$Jo7*|(!M|@wNFRoDuoVV~ReV@JPM;k*clJVI zK|1SlT0aV&KW$>FLb(6w2)!^y{x-;y7ZTF-rhFdc!ndnKeSUqY-K7DDy>HyTNWa1Q z+=MsWUh2w*JBI1Lekh9M!8naZ!MXG;*ik8i{E#I>yp|v{hk(=$_;2|TDV+4*AfJx; zZ^G1-nE$em&saW05^?`|vV6e*aYLJog${*mO_OKI@*(A|fs79NPZG_RA*mz(em1k( zOpZ>HI}`px0MIUo`7g+3WhdBu$57>aRV_{LtAw-fBcWs8S`KUvOKBSvN5KZ}o+XP` zJqyTUk>^7r<-ufTzr_q7V+lduBR;PH4{{PVXiSP)_#I}ld%MY$d(YeSV!~&uzloq) zyZN~+hmG56zeBrP^=*Wm7;9@t|}J^UfLCJHnDu{ zFfrw@CZ@-16taNnA_q+t;ceaokrp{fQCzA|M>p9&A|1}eIRu~d8OxC_G6P)pf^ZRV z6}prQd=oHLLk#&cy%ls;N}$%6A)m4#pEhE0E=5b@mPYc}C~ZlA@IeK2pgKGm`|bs* zMDmQ)3Q!17B4INUwN0f`VRaU9cbW>U>29SWO4LcPuu3m%@)r~pp`B0f_&y+0@fK9H4AE`7b|b`TvS;VI@5|E9a=w+jF0u#@0(AB6AQFo)sCAJU0Q0 zjrP{jVC|^A^->UW=X{vmjoeVu2pHY#7Zg3CiZ$E-vBj~5Ff)3u$!ofm1gFrhR;x~9P5sQbc#BGn!D ztcB~{H#FOgyfha2f=x=Jp>{bNB;8l%yaHKWZI+n4urtUMuwxKVJ_8SN)fysCO+*-k z*Na0^m;43P&5(huC(kFKb}I0BNeD@og>K~tL3@EIecf2FG6+s$9&}FuRIs!{kQOz) zUrow0q0=JWQP4r3{WdVYcd{ukFex{|)F2zLxFMzvlg1e1_92^?=bXn#Ws3YhMXFO| zf2wRB@`$<3x$HtNgC;(gDT!g-1)Qw5>@#r|`qZ?$UcgrLg3WqtfNVJ9ca;zafk%O+zJac^$)f zoUdcvqpE0o1=s&84u19qW@BAlWjuT@LnqPb-m!G0wX*Pu18W~&zh=?*9(5SjZFme7 ztg6j9wgj4^{m?I}l%5Ov8cP{{Eg`A&gsCM}{w+bp6KPsH3g15TaI%>&;V7w1(mzaB zz_j={ln3}8UtEu_!1wsQGW0RX8QBO8Op{a7q8V5`n$}aqs(d*s-)MtL@<_`6jt8}# z5;}q~oK=PvWq401ae--wr@(X}G|He6%13U#QJyKu*4^7Wos<&EnBfP-mU@6emvWadUU$sOeUZJD#1{ z&4Vf0S7RYH^`W+?7~b-_zPh?}?ubP@3PR1x0liQxFjI_h?~~ zz2E)!yEosT-}g0CHdK0LD`hK)!U#6O(Z{gpU|ePBPh|%!9+j=CN#m5<3S}mW9*G;P zkHm3jJY?%-Ooc`5j45e@gZX2yfa9|#%u(1ART$VzLN?eHX|xg56)p`qsKX9lev;Zk zwqnNgYgm^Zcjp8LU7EB3M#!NR{r?4cecZSezz3`vhp&js4vkCN06C&C`6rMdbNb6T zb@k5)bCEXEUlO*o@wNXZk^T~zR2cH^9Me`-eAT{E+|I2n7dnX?w)AN8B!q-cxd$E2 z$YE&E;|bgtLL>h++WBX3lbGZlE~!((4pbOIZ*&AW9C#Z~D+JXkAiw&y_;d4*OikkJ z=BuuYWjEc&+;QgvtJbVr<6gUN)sJsqwT58`!7+uY4+T5+$WjdvIs2;lVQb@H(-5l3 zh6X!^2nr@J8WERTt}nfL8ezTn305Vv099o0o^eZD2%$gCggG>z!;mOWvDUKIa%KW= zNr^$rYMYd6VPY+-skp7A+S^uz%*kf-o*rJ?yM+b2xm8wM(fg1gu7nx%(RkR2xNMk* zIrMTm?1D+5o$vB=HWN=LKAZ4#qNPcE4tlH^%|zmVm}h1&V}N-|Wwb8=LyLWnS}+p! z9yDN|)WiD>*j+sSMUpgE0YK4IJ^FewP=I!%p+~kUw0}af%AubKp>P2zox)!w(V{72 z){P~z9(A3qk#gP4u*(*u88?St$l$FR;ulx~`hhjEe(F9G!QU_`J3BnpZM@Cf56U#=n~O?#Zk) z#b{x-pDq4N#_wl+t~eMZV!g)uY2qBLRLN7?`d|)i9Fwel%XK)|H&1t(Vrot+?$6QE zp!M`}offw7TbJpb`1Vns>w>!|>N?S%(`+aYpdklr)8 zFxmT+E==|QOYb~%SliHeSXt=b!O8-mF)Js+Usxd`q|84H)CB3aZ}X%Q?-Wzfh6jYvI! z4|_APJS?roAE%U}3es^PbdV>ru4}a4BxI4Al_m77a#aN(^^L)%JpzQ^^Fq@LzDB%h z!yU_(FJmg1`+in^3u6qK%2Ed3z4?BIvDu5}FG9>E^i~dy|kONYuJ7@ z?c17jnr<+RUjoKoI%|AK-uSf}I`LCuKG%7-HR?JJQAs==eBZlU?GF@)LHlpLc;iJz z9x$l3`)Sq)j3rr5r-vsDuAagpDLk6M=@fc1CGSHJPUnF=Co|zBdLk7bfhmaFxI$+6 z;3V2S9zKrVx)hFf^lGedz!3N6#e?X*lrj1T@}w~T~0j}v@dQbG85 z4!x$Uo2b3B=a`DXypN@V*UyTmdJ@(;eLd+&Yx+iC&#_4BG2fvDF&d&}5pFqzHOXe0IE7@9}V zBIAjE@ThdCt=|rck0s>y+aF@(eeGLVxwriZHqzK8@73&J1S9BhcZN5>+?OFY!ggRa z4Rhn-?kmrknG%K(Tjnpj&YXnZ`;FaOF5>g4pxp<&N8}0hb2=@j)qc$mDi*&ed3ru% zlv$?3hbNSV_R|a+m=J%r@HfkAvcXN=O>Ar0P`a;~B2Y zM692?irqLRcFtYqCBoju51T#!hS281b7AjD3dy-J%Y)jRt7NJzJ{+M21yD~HuQ&-f zO^=GIGf4`rvNyk6a!H)>}CDJ7yG?TWkaq%mow5%d8IZ@ z_*!p6fUVsRgjXf+)XWvYV;&-{>+WEIk#533M*CEjLS;nc!1vZ8fGk=1xQ5}(6y>6H zk^r5J_T72Or2}^!&wXnjWz!1fdf_t?uw3=l8%wX=z3r7(Uu$dM^*VTx-RHKReu$+R z-kaC5k$-ixJ`F8|!yKo>YPGWLncZi0r{R<4b@X2v`kGh!ZvIIGeQ^Eux!kZ*e@Ymb(oLILr29+oq8*SlYE$pze9tan&Pm9?FB@eEL#O=`*RY`1+MOP#| zRgl9ys)<^pdyKr!v>-a_%1Q;$k5LV-Ze-tip54)CP&27NRn^UN&SFk8d+K=3gYTND z%GZ?7h}BD1c=O`KBuW}8b{Ul-Xr0IZOg01SIN+b25KajnLxG~sryTy{w0y!c>nhD^ zE49mm6{)hkm#A~8Qy%1NVFa8BZlk_Q9rBQ6P-DS6V7P=@l6hes)D;c1Kz*5lZM}f~ zSW0c7j&7covyg3!;T&p(VIfN|NJYaPIxT2vVqre&8dnRc4T`T;W2o9dZunNd5(@rB zBgU)<(j5sy+DWJJ!g0hW@Y2Mstd(i3_`yqSZ@PI+$qg(0&L6J3k#VmQ{Y!0?8h$v3 z|D475X7Pe7UYy0PS^T7qUryueX7J7|mPRl;f@h|%uH%`DP~G8z5zJ-r79BfueAkrN qfAv+R%orX#TUW-_E$8Z1aCqS~zHJQK6Tz6o5Qe#F=BsaFXa5VRj@&)~ diff --git a/bin/kernal_mega65.rom b/bin/kernal_mega65.rom index 939e42e961388c56418393d53e52372224502160..cba79c6aaf308612aa26b8418504f34dbc309db0 100644 GIT binary patch delta 4232 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 TappKbB2a{)9$EP7r)vD~OT3v%rUjnV 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 diff --git a/bin/kernal_testing.rom b/bin/kernal_testing.rom index 9b10448d4dc2d30ee771615e7deae446dc85d910..622723fe01c34ffb1c54a8f29b961561ad8cb1c8 100644 GIT binary patch delta 5040 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 PjCh2eoV@vc@9qBss?aNF diff --git a/bin/kernal_ultimate64.rom b/bin/kernal_ultimate64.rom index e53f8efefb8b94cb4f197a6527181cf62f38b5d5..9eab09ccac08eb4253f6b60ed4a702e84bd95d20 100644 GIT binary patch delta 4198 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 G$NvZOMHc7) delta 3477 zcmYjTeN-IP6@NPe?6NEDfFxN$fTxlMVm?TW4QaK(7#q}A6OC>0MD43NHA}@~kN=3C zqq|WCk-BtoqCzxvGu`1ZSnOhYj2lZsNP^6sL?@7tq**H3?80JVCVUMTm+hS;+V0si z@4k<@b3cCf_pZC#UG9?1DpN*f#9Me<7h-VFu!7VFC7YT%Dw!3N#>$Bm@>~c%K5Xnh zK1|w%{gxmyrQ2JODQbZildr)B8J>S5B?MZpUlb>)eg@yG2cKpXs;1$%PWF$d4)cDzD-mGvhsKo38A4U++SIQ{ z$j+GHOD(a>nDi$cRcTlQcQH9AYQ*X&7Z=lD98)!E zfLqWz$fW?D2XSb`KNviZI2I&fGb(~VE#fUtM=dMb7lM*S^DSl~II@?}CRh9^I z4a#sJUFr6wmbi>$u356dwPVyj(7nxT1)By)bp%j@M|3iE6##$ipqAD7N#C)94%Ji! zI5`+4&%`k3^r5CBGy#6xNxSIjAdj7=7vmP%aoA{Ib3DMM8$B5R(*BFR=6GJvf@Po7Xy#yXhke9}g z8^Mn&sy$YB)K};=2Xok_qrx?Z?I!%}7$jDMyk4&c@}X`dJ58Y)@Roxfc*%Ms&9&(& zl6nmy>v)ba@RlEUwmBUXkq4&9NQ{g|$V3e9i%Ewtp!717_hVy$D1JH?7=a}yhhdq{ z>pzRP#{>OXn+=3ogBrshF~q}3u?K$?GiHCs^|8R;uqOtF4aFpHNx4=ziccHLp>V&9 z@n;RlTco`T3-L!WBj1_QS=^TJ+Ka)g_A;6rz_8>forSR8tINOn-ox#2N|pk1@h7NI zn49Z*g|BCWy@N3$0H(54wYGJhQn1F7 zCu6>4^CI3c3VUt!ofCac6ZM^^`T&>52GlFja|T4=pg|bL*9(~?TOxhkR&D{5a!Vx> z+$nsJo#j$2UbB+oWtBo&MtzJyy{J$9wgs^*i0M;x`40X=ndJ}2IUa}F!3?Fd9%cv% z7)CTCrZm`I|Ma9t=GGF@$(H(hc#L@Hcl`Atm96^l{50jC81FCnE)0o@V-L zo27%A71CprAo;@#gu6d6+V$2fr$e#zCptWgrx9H8co-iWd|3COaIjKeX$q_9u$B9$ z?(qm+Hx{{mo45pP_ej&)9lnHU?pke}?7DL-!xUB$T5fkjE%KSquh!M{X2*-m^fr<^ zS+hx`x(40lg_Hp6)ob@YHqTtS9!=0U1$>kUXr}P?~skje*inXc~ z{BxGr4e1>CCk*9Wx)tRiv;^fNR9Jw#X($z;EL6Rg{h_{w$*wUY$lNt5)MTwOKJi)3P9b5Z{p)mJ$KR0XPu0Sr)rWW}+%YG;3Vy)hPsC-JnDV5eZUH;4>{XA60ScncW+YhnQ~u-HVBI0Z z9VpJ(WOZ!>|B!`q;NsGquc@t64E~a*|?xC4!l?|y=)SJ5Gy>|-= z|GfLnx881U+4~M4)>>a`KK}@#g1=?+*CO0^8z^L>gAk0q{2cJ`Uz++U`I5|r~(cpH@|iM zzQUKA6f^6S=bTA0uB0LE0=(kn{l;AKJ1XgcChH#Nr!^w-EL6{h_TpMyWvh`J*Cz0* z3EYstyAzew$oK!fNICB(yAlpxTr4H`j0ySqx4FoP@#{G#olbT$%Q-VxSPb2ak%_2J zO^fbVQ==kTI40)bzJFpKaSZ(SiT2p zEsoPc#~EWh11&FZQ)9BrlQHDU2+O-YH^DQ@lNs*F2#bkECOq26h8vk7c_T100oXk| zA`~yaCHq<&igZHiFS}gNII7O^lT=t*P|Vco!q$RYU8vlh=uRXOVs=NidNNzpuEA*F zy8-Il29}=Y&+(r^ccSE|ED6m>r&H%M-=H+9R%xItR-8<_lBH%y1CA<~;Q^zCRraYi zX)tv_V*mg!&4)lFg=}al+-jQgh6>qpf$k?`N~3D)aHu5=+%3j5Q#Hdhol&od_Mta) zH4StyaKbax~Trg2iO6HX^vriJdpB}D@lNx5EK%vLXFt5>k(nK+r7Cf0~AEFy}~y1B2u H3t#*%wQY+Q diff --git a/c64/,,config_generic.s b/c64/,,config_generic.s index e997bf79..09774f1b 100644 --- a/c64/,,config_generic.s +++ b/c64/,,config_generic.s @@ -75,7 +75,7 @@ #define CONFIG_PROGRAMMABLE_KEYS -.const CONFIG_KEYCMD_RUN = @"LOAD\"*\"" +.const CONFIG_KEYCMD_RUN = @"\$5FL" .const CONFIG_KEYCMD_F1 = @"@" .const CONFIG_KEYCMD_F2 = @"" @@ -106,6 +106,7 @@ #define CONFIG_PANIC_SCREEN #define CONFIG_DOS_WEDGE +#define CONFIG_TAPE_WEDGE #define CONFIG_BCD_SAFE_INTERRUPTS diff --git a/c64/,,config_mega65.s b/c64/,,config_mega65.s index 220d86f7..b5e6855b 100644 --- a/c64/,,config_mega65.s +++ b/c64/,,config_mega65.s @@ -77,7 +77,7 @@ #define CONFIG_PROGRAMMABLE_KEYS -.const CONFIG_KEYCMD_RUN = @"LOAD\"*\"" +.const CONFIG_KEYCMD_RUN = @"\$5FL" .const CONFIG_KEYCMD_F1 = @"@" .const CONFIG_KEYCMD_F2 = @"" @@ -108,6 +108,7 @@ #define CONFIG_PANIC_SCREEN #define CONFIG_DOS_WEDGE +#define CONFIG_TAPE_WEDGE #define CONFIG_BCD_SAFE_INTERRUPTS diff --git a/c64/,,config_testing.s b/c64/,,config_testing.s index d0550369..cdba7f9d 100644 --- a/c64/,,config_testing.s +++ b/c64/,,config_testing.s @@ -76,7 +76,7 @@ #define CONFIG_PROGRAMMABLE_KEYS -.const CONFIG_KEYCMD_RUN = @"LOAD\"*\"" +.const CONFIG_KEYCMD_RUN = @"\$5FL" .const CONFIG_KEYCMD_F1 = @"@" .const CONFIG_KEYCMD_F2 = @"" @@ -107,6 +107,7 @@ #define CONFIG_PANIC_SCREEN #define CONFIG_DOS_WEDGE +#define CONFIG_TAPE_WEDGE #define CONFIG_BCD_SAFE_INTERRUPTS diff --git a/c64/,,config_ultimate64.s b/c64/,,config_ultimate64.s index db0e9eeb..091f1974 100644 --- a/c64/,,config_ultimate64.s +++ b/c64/,,config_ultimate64.s @@ -75,7 +75,7 @@ #define CONFIG_PROGRAMMABLE_KEYS -.const CONFIG_KEYCMD_RUN = @"LOAD\"*\"" +.const CONFIG_KEYCMD_RUN = @"\$5FL" .const CONFIG_KEYCMD_F1 = @"@" .const CONFIG_KEYCMD_F2 = @"" @@ -106,6 +106,7 @@ #define CONFIG_PANIC_SCREEN #define CONFIG_DOS_WEDGE +#define CONFIG_TAPE_WEDGE #define CONFIG_BCD_SAFE_INTERRUPTS diff --git a/c64/aliases/,aliases_config.s b/c64/aliases/,aliases_config.s index dbc3a540..c994c313 100644 --- a/c64/aliases/,aliases_config.s +++ b/c64/aliases/,aliases_config.s @@ -213,6 +213,15 @@ +// Check that features are configured correctly +{ +#if CONFIG_TAPE_WEDGE && !CONFIG_TAPE_TURBO + .error "CONFIG_TAPE_WEDGE requires CONFIG_TAPE_TURBO" +#endif +} + + + // Handle processor configuration #if CONFIG_CPU_WDC_65C02 || CONFIG_CPU_CSG_65CE02 || CONFIG_CPU_WDC_65816 diff --git a/c64/basic/basic_main_loop.s b/c64/basic/basic_main_loop.s index 0c93e2a8..55ea6dce 100644 --- a/c64/basic/basic_main_loop.s +++ b/c64/basic/basic_main_loop.s @@ -62,17 +62,25 @@ rsl_l1: lda __tokenise_work1 beq basic_read_next_line -#if CONFIG_DOS_WEDGE + // Check if a wedge should take over + +#if CONFIG_DOS_WEDGE || CONFIG_TAPE_WEDGE + + ldx __tokenise_work1 // here is the size of input // Check if DOS wedge should take over lda BUF - cmp #$40 // '@' - bne !+ - ldx __tokenise_work1 // here is the size of input - jmp wedge_dos -!: -#endif // CONFIG_DOS_WEDGE +#if CONFIG_DOS_WEDGE + cmp #$40 // '@' + beq_far wedge_dos +#endif +#if CONFIG_TAPE_WEDGE + cmp #$1F // left arrow + beq_far wedge_tape +#endif + +#endif // Else, tokenise the line jsr tokenise_line diff --git a/c64/basic/wedge_tape.s b/c64/basic/wedge_tape.s new file mode 100644 index 00000000..9eaffab5 --- /dev/null +++ b/c64/basic/wedge_tape.s @@ -0,0 +1,36 @@ + +#if CONFIG_TAPE_WEDGE + + +// .X has to contain size of the buffer + +wedge_tape: + + lda #$FF + sta CURLIN+1 // in case of error do not print line number + + cpx #$02 + bne_far do_SYNTAX_error + + lda BUF+1 + cmp #$4C // 'L' + bne_far do_SYNTAX_error + + // Execute 'arrow + L' + + lda #$00 + sta FNLEN + + ldy #$01 + ldx #$07 // turbo tape device + jsr JSETFLS + + ldy TXTTAB+1 + ldx TXTTAB+0 + + jsr JLOAD + + jmp basic_main_loop + + +#endif // CONFIG_TAPE_WEDGE diff --git a/c64/kernal/tape/load_tape_turbo.s b/c64/kernal/tape/load_tape_turbo.s index e3ebfebf..496d6f61 100644 --- a/c64/kernal/tape/load_tape_turbo.s +++ b/c64/kernal/tape/load_tape_turbo.s @@ -9,7 +9,7 @@ // XXX use calibration bits to improve reading // XXX handle load address from Kernal API -// XXX add name matching +// XXX finish pattern matching #if CONFIG_TAPE_TURBO @@ -32,14 +32,15 @@ load_tape_turbo_header: // Read file header - jsr tape_turbo_sync + jsr tape_turbo_sync_header - ldy #$15 + ldy #$00 !: jsr tape_turbo_get_byte sta (TAPE1), y - dey - bpl !- + iny + cpy #$15 + bne !- jsr tape_handle_header bcs load_tape_turbo_header // if name does not match, look for other header @@ -50,7 +51,7 @@ load_tape_turbo_payload: // Read file payload - jsr tape_turbo_sync // .X gets set to 0 + jsr tape_turbo_sync_payload ldy #$00 sty PRTY // initial checksum value @@ -121,23 +122,43 @@ tape_turbo_get_bit: lsr rts - -tape_turbo_sync: +tape_turbo_sync_common: jsr tape_turbo_get_bit - rol ROPRTY - lda ROPRTY - cmp #$02 - bne tape_turbo_sync + rol ROPRTY + lda ROPRTY + cmp #$02 + bne tape_turbo_sync_common + rts + +tape_turbo_sync_header: + + ldx #$FF +!: + ldy #$03 +!: + jsr tape_turbo_sync_common + dey + bne !- + dex + bne !-- + + // FALLTROUGH + +tape_turbo_sync_payload: + + jsr tape_turbo_sync_common +!: ldx #$09 // 9,8,... is real turboTape !: // I sometimes used 8,7,6... to avoid it being listed in vice :) jsr tape_turbo_get_byte cmp #$02 beq !- + ldy #$00 !: cpx ROPRTY - bne tape_turbo_sync - jsr tape_turbo_get_byte + bne tape_turbo_sync_payload + jsr tape_turbo_get_byte dex bne !- diff --git a/c64/kernal/tape/tape_common.s b/c64/kernal/tape/tape_common.s index 0a8f97e0..95ccc478 100644 --- a/c64/kernal/tape/tape_common.s +++ b/c64/kernal/tape/tape_common.s @@ -22,6 +22,18 @@ tape_ditch_verify: jmp lvs_device_not_found_error +// +// Loading terminated by user +// + +tape_break_error: + + pla + pla + cli + jmp kernalerror_ROUTINE_TERMINATED + + // // Handle tape deck motor // @@ -92,13 +104,8 @@ tape_wait_play_loop: jsr udtim_keyboard jsr STOP - bcc !+ + bcs tape_break_error - // Stop key pressed - pla - pla - cli - jmp kernalerror_ROUTINE_TERMINATED !: lda CPU_R6510 and #$10 // check for pressed button @@ -118,49 +125,52 @@ tape_handle_header: // Header structure described here: // - https://www.luigidifraia.com/c64/docs/tapeloaders.html#turbotape64 // - // 1 byte - file type (0 = data, odd value = relocatable, even value = non-relocatable) - // 2 bytes - start address - // 2 bytes - end address + 1 - // 1 byte - if $0B (tape timing) contained at the time of saving XXX handle this - // 16 bytes - filename, padded with 0x20 - // - // Out tape buffer contains header in reversed order + // 1 byte (skipped) - file type (0 = data, odd value = relocatable, even value = non-relocatable) + // 2 bytes - start address + // 2 bytes - end address + 1 + // 1 byte - if $0B (tape timing) contained at the time of saving + // 16 bytes - filename, padded with 0x20 // Print FOUND + file name ldx #__MSG_KERNAL_FOUND jsr print_kernal_message - ldy #$10 + ldy #$05 !: lda (TAPE1), y jsr JCHROUT - dey - bpl !- + iny + cpy #$15 + bne !- jsr print_return // Header, wait for user decision jsr tape_header_get_decision + bcs tape_break_error + + // Check if file name matches + +/* XXX does not work yet + jsr tape_match_filename bcs tape_handle_header_skip - - // XXX Perform filename matching - +*/ // Setup STAL and EAL - ldy #$15 + ldy #$00 lda (TAPE1), y sta STAL+0 - dey + iny lda (TAPE1), y sta STAL+1 - dey + iny lda (TAPE1), y sta EAL+0 - dey + iny lda (TAPE1), y sta EAL+1 @@ -172,6 +182,10 @@ tape_handle_header: jsr tape_screen_hide_motor_on + // FALLTROUGH + +tape_return_ok: + clc rts @@ -181,10 +195,47 @@ tape_handle_header_skip: jsr tape_screen_hide_motor_on + // FALLTROUGH + +tape_return_not_ok: + sec rts +// +// Check whether file name matches the pattern +// +/* XXX does not work yet +tape_match_filename: + + lda FNLEN + beq tape_return_ok // no pattern to match + + ldy $00 + +tape_match_loop: + + lda #$20 // default byte, for padding + cpy FNLEN + beq !+ // end of pattern + lda (FNADDR), y // byte from pattern +!: + .break + cmp #KEY_ASTERISK + beq tape_return_ok + + cmp (TAPE1 + 5),y + bne tape_return_not_ok + + iny + cpy #$10 + bne tape_match_loop + + clc + rts +*/ + // // Get user decision whether to load the file or not // @@ -228,6 +279,7 @@ tape_load_success: jsr tape_screen_show_motor_off jsr lvs_display_done + jsr print_return cli jmp lvs_success_end