From 2110abf93275ddab28605258527203db87283e8b Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sun, 28 Feb 2021 22:02:13 +0100 Subject: [PATCH 01/32] fixed JiffyDOS broken on some configuurations --- bin/basic_generic.rom | Bin 8192 -> 8192 bytes bin/basic_generic_crt.rom | Bin 8192 -> 8192 bytes bin/basic_ultimate64.rom | Bin 8192 -> 8192 bytes bin/extrom_generic_crt.crt | Bin 32896 -> 32896 bytes bin/kernal_generic.rom | Bin 8192 -> 8192 bytes bin/kernal_generic_crt.rom | Bin 8192 -> 8192 bytes bin/kernal_ultimate64.rom | Bin 8192 -> 8192 bytes src/kernal/iec_fast/jiffydos_wait_line.s | 2 +- strings/FBA90085 | 3 +++ 9 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 strings/FBA90085 diff --git a/bin/basic_generic.rom b/bin/basic_generic.rom index a25f8f71bdc57563f3cd6df00501f40bb21d5c41..32eca3602680fe9f000b41550a2cd29dac161222 100644 GIT binary patch delta 68 zcmZp0XmHrDmWk=$_s#2>>exWEKBpR!@WJm3m=&fz^ymN*t1=Y$wkRB%oWcDFB=5r` SF3e~&IYr(V$eX-b-WLGqZ5(U> delta 68 zcmZp0XmHrDmWk=))6MId>exWEKBpR!@X4nOm=&fz^ymN*t1=Y$wkX`1oWcDFB=5r` SF3e~+IYr(V$eX-b-WLGlryNZH diff --git a/bin/basic_generic_crt.rom b/bin/basic_generic_crt.rom index 3bbe6e029662619dba580718d1893b87a09906f5..a6049934dc6e1829cdf38517550460e6cde9374f 100644 GIT binary patch delta 93 zcmZp0XmHqI&B8kCuR`PR%?>QLIGKR73|}uJ+mkm-Hz+*Wyq50e?u8GkhOd{A?cbZF8x;O+UeCXVQTE>(AN%(TrtcLT mmqHoh&!LQ-*PAN@WjGm?H&2y1$HHhhIYr(VXvXBt^1c8Ok0qf1 diff --git a/bin/basic_ultimate64.rom b/bin/basic_ultimate64.rom index 343bb505f6ee2c1c303345e3ee962406c0b788c2..3577d018f270f8199a9d7ac32d2bdb343d6a7b29 100644 GIT binary patch delta 72 zcmZp0XmHrj$i!CieUYp}@MK1I;mxy{zOXW~Oz!8H$5irtvp%O86Of*q&ixt0jp3Om Xz{s-sw@d~TqtWCPd0&v+W_e!#wFnwB delta 72 zcmZp0XmHrj$i#N?=^|N$;K_{a!kcF?ePLyknB31XkLl#o&H9{XOh9^aI`?M~H-=}P X0Heg_-!d6YjE0j_!79vm0AMgMG diff --git a/bin/kernal_generic.rom b/bin/kernal_generic.rom index 69d5ba3831f860f90f81088193d9fa63b59e2681..07fc29f21417adc430603ee57837e4210aae9c7e 100644 GIT binary patch delta 2336 zcmZ8jeQ*=U71!NKmgO(W7-Pv8yapU(K2i@1L@*^)DUC(5DP%en=Pz#POh%+`CeRi< zO%q$wD0S4zmAi%jAyhqdfILy6Nh#Dx9Ym8D%RqaMJzx@Ra0!wz2Kj6p>&}w6zLU#L zr+;X7-`;z>`+mRop;mjVJ>0LQ){!gPy=B*Cd(?`e zQT$dssBsUvucIV+S!XF~m~{uxCv#y2H_Q^E+i3G!I4kRPHsYoXPt}=36So2FA4d;n z!}nBK_$ElXBis&k?@|i8(&%8C+YS<;@)`}Uw3&r%18zQG^wK{mnv2FdQ|%wpcog z58iDvP1YOxO+yhy%tu#9Oa38?>XqczbbqNic2m@3(-wSU|xRya7?Potu^(}AYuoKZ^9aZZ(mO9e-$ z<)pE28!bxYWZ`m>EL=-2!EbTV){?uo5C8E*$KE~B;g3JeY$iV~VoOCSvJ!3$$bD}N znnn>AjTBu`ZG*+N>Le7`t`jAX?sCTfKP=L{!yc5CLT}O?4+Dc>60r(;R6diq9vF=5 zgb)kJs40&2kd-A{inS7MPV#5`nvPGAmh3NilhP8Y3@6^!*^E5*F!3NkDW$SEPs^D$F?zaZ5!I6Q|> z&*9glReY~N+t|<{TD^5i)_K-xW;OgVKzH{nDv`qsK9|DZQ=0xjH|HL9QF1(Xx(m@` z#8tW;Ao*+Q6T5QC6|xnM=(4f72@I``s?6Uovmr=^NpGnDvndTjeVSG8bjcpHP6igX z%iTYrMdSRX4Vfq-s)e9_!HS0eQ>mC&sfo|4sAlftc;hr&gk72DVMoZqh+1cpnQ`KV zM{s!93M#0Cyt81l1>VmG>Wp1IJ7jesI!<>2z^W(71)J%~6j@bPL%9epTfZphPzZ{H z!G|x(r-wyda3TH$Ib4R+7`srmp*A_;Ul~Ll1HvGSf)YFn+;}x(u)7061**d*bBXIX zNlF)%(~xA=g>7qHGXD_}4O-(-eQrVpD#km;@OI^Yk3d*E^OxAdQmRxnnOABQRi!eb zlv}7WVp;U0DaQzqd{P3Efl#u0(TZhRsSA+soPHZEz7K`%?l!Kw3iEP_F_v*s|jf-iq?XUw7>)vmiMtdWk7-!itsHr#X`PWecGer z*0T`}8(k*k^F!NP-9y1;Y&74ek7|8Pv>K`|e*>LW0F|jJe0z%1^)Rim^C^Mp7rtQw zN89T4H(#Iy$;{T+Sa1~mP6o_X?thulv?9Mf!j77J_2HeuD^SEbp zq*?x0E{4!~nLj=sO@=J%1l;)d9Q^wZKIGs(fZ+5vSk#gI{76{F9a&g~)38qYrX75z zpigv~o$kY|8AZiJCoY}qg3~;Z=)uv)$qlK^ddP;#HEWo5Z47YI#oG0;{`R~WSK3|@ zW4W?5n%GVwWF&ISkhPG_khR2HS+U$D10kK@RTofrQmv;s0X)rd{_7-qgckbBsDIdDB<77L*E*Xt6{Mkmyw_qD{I z@FD>}CpCjwZwLwQ6DU1}p=5U~u9@%4uV(mesAN7hu%T;xzW5pAr3q2jZ<1_m&)7s) zPamnQvX?w=-)#>;(@vaKFPkOBs~zdNpY`fS*yiD&#%p0XcX+PE6eTY7GknX$s7A?&5_BN7lE%~_oq_oxU;Y_22LeW`%NH;8Mk3teEOP(=I z%0LiQkQL;IOW#FP+1Gp4QD%9A=<` zlh>*%>)IaT+DG`i(>ObZf1kx|5;n}?^D;1kug&1pLwrNRvniZSkw|rQ%{HmY$~3KF cn$|FQ@D7f~aY5Wa!fDvUwXW&gnIGNz4+{r*nE(I) delta 2283 zcmZ8iacmRk75ClQaU7EPLgK^@A^8HNaR{{8P{E*4vaV|kd}^syM)+gm)=HJ>(rQ~Z zh{j414YM>_n6odTgwoYDIf$crvzR7GD|gOlgPp>3G#P|8k+TXrK&Ux~fbU|P+dD_} zkNshP-@AM7zVH2h@BLnTV|$~2OiO)_e4%}%xMSYM;Fsm$y|jTt=VPit8g&*EPZ^M) z<*B-elj6J@=eYA48X<4$EcsU!oCE07ML&bDED)mGX!91}FBONQ8MmatpA}ip(`bi` zzJ2JwquRm)FXaq+UR0ljqj+ZuHKshI!6`GIcDbV#@y`x_3$I24e)iu1I0 z-{VX6q=-r1RM0W+|JtiTzmEDR&;hbv@7q5ob!(=E?@8;aDZ$|DrY-lS?ryr1jrm-( zkb~@VcVxhP87at~V6tR%N)_$y8S4NWL$22|Re31nC#M#J{{k-08ApmY}1 zq@FnIk{v_*S&kbx(b=HCv6mL4EE=y%C?uhS$0PZ zgvooxxHk%H1w}m{6d1HGN_OS#uGk?v#4@{wcGD<7>ae54q9aTRI*&tTVI=Q3wTUz@ zdycM`$zPVOCh=wK$q4*bZFzr3#=MTIUp8Vuo`UUcfe6FZo4%Wh{7v#{9adrkl z&{X~xYOJ@QMqPx0n(x=kUAjv>SNTbi9-Zt$m9pp z7i82DMQ@SX!mR~n3Ae`ivu;h#MPw$wDm+S=iB$NEHj+df*l5&g5=oC< z(DSE723=p|2X;6I{5j~OIIc>d58{ZCR3AnfW4~_pC_c?g(`@dTAT==9zlhH);y+7k z`B8zkalV7JdTJ`+7<8C9j_(I__dGs`o@+Z1Adoe@C{y6C&^wR|CDB1v! z{G;fJ-C5_PWQ9)**|_Wif!1c#=C7MMH`O|PknTS~hc3TE3k##8&768>pWKDsxD71) zOdfuf7L7}XHl@Ris0u;D@-s+Vf{QnlW)t#(I6yUD z=FUutI&TT?Bz?t5t+DgPPuGmhxof?s=c+KSHvM&&}o#a$4#&inkR_-`OMTp;`yjeH9v zllMz^(y-hq9V2X6$tKJz7yos|)?jeqWwUOJ$I5vT=qXe-o8mmmG0hYQ`v%zOjj`?EEJ=vn^c zQuRb6&d&D=`dF{o;q2qgC@jW$@vMw`GM^v!%eW^4JAVrHN!L7ySWKoNi0*<$_Rc(R zUT9siq5Mfx@jA`)E+aG+>X)JUpedpG$i8wjIaXe}x=)7s>4nP;0UPI}#|B(DOZe~N z=m@z~zM6`Vx$@mFp}kT5R5udv&!tvy9rYo>c?zw};C-s7PBmjLfyUYA^}!bH5yXnsg<9Y&PjbWT^@F3nUFuoPv|B^ z?Fr~7W##h*%c4CChK;;Xd8BqnHXkt$k^!zm_}U|mf1gcxj64x(PZ>-MPn|k8h#H0RwzgQUCw| diff --git a/bin/kernal_generic_crt.rom b/bin/kernal_generic_crt.rom index c36887dfa153e1d84b4ec92a87e1cefad9dc0eb4..055f732ce0f94e40917c8c10fcf8f63d0dd1a9ae 100644 GIT binary patch delta 1814 zcmYjReN0rKt5I;M$ z6On4`Wf_}dYTJjrDvSh|Wm7iXma*<5d9H*p196hIY<-2jw!n<Y+DiwfB(=InUGhvnaVk*H{p)5e(ee(@xhIU&E4Jx>0S2 z)a6z`7!v(96cV}PVXagc)=PQZVRSvg4PY>*RPR^S>tVwF21vuN#=sx;-+@A8U+%qh z>z5Qco@;-gS>Y*H03W^4ubuJ^a6z|b>YQ*fb{L>4RdS$;wuu*P{fSVSJXta7BKf1_88gE)%5eN`_X?c}_3xu^ojuoFvSvwrv z4)lZ6h7QP{T=cn&4v=JCMQuR#>jga*fE|_-TyU!^IGBq@By1DWkc5uNCg}%>BG5$^Q?pG67;by zON(niYeA8CtP9_n;0~e_${>xX8SYTlQ%~QVZ!>p_tP0oAhOSB~j2`kqe!Vt82J&mo z*F|8Qq47sc5V7D`oGj;;Z}Qcuv!-_8FD}5Cc#WikbMjhOfCW%vt_jzuic`uv_PeG* z7aK=E&*24;Y%JJLZB7$+!M2S*iN|(OMix~?Jv9DF#BZly4CK-H;ncC$DReuXonJ|6 z&kjgY;Y(T{d9yIJb)fI%?K^keSKk%b_x@)mI?KvrSy67@RFqrr#Z&3oS#DgS&W@`s z8V~=+7mSck8MzCJEQsemi7?lYkMtH~EdnFM zB9J2$tpw&~!?XnKk%nSx^Z&wSE8z?OhSepmL->JIOJ57N&SmR?&~_>yH{7;_y2U}O zO8E(ed{cb4wP~@ro^0e!aDnBWw5&aQwVae8#O{J>r@anjQHF~gVrguWp@vHE9vcCkC`IJv0aKpMA zqmfWB(vB{s&#Iy(7fbBA&1n_XQpqpn-leb}$n!3ta{C_UoK`1Qka8P*N| zE*EGg!x?GKNJd!a(_f9tg0b83eoF4cx0lDvc7N?@aawsk{tq_mder~` delta 1839 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 NiJUjbzK;HA_&@CUX#W5J delta 2251 zcmZ8ieNa@_72o%EVOhTR@#(Heyih-ODHyCq(MF}#j%#zLSRJa&B;yO|SZtw_p&y#* zP|y+s}8bM%u@)F7A7Rqg@rZvK;*p#i`(;-A%FD! zaX;QY=iYOE=XcJjEv_y0_Gzfi%wxTD3J!Zbh_}Ay+00w7`XfRNx<1RRQT7r( z79fro^LBR$%(f_j~%8J=~}K zMpQLPdSlm{swTNR4R<}S(+!Wn(ofy#)_#^nHIh4G{lI<9>OyZWc-7dnNHVnL$!BK0 z|8c9(V8}a&&V`6odwYXUcBpQ43i0UIVRSFji%Wwn_dc`e)N@3jovXlTry1$U$+!&# zIvJl0!eO^F2YyG@;yV7OXz_DkZ|f!3W$>m_#wB4?N&4dQ4T>+4L)G#Qz!EkuKl z^Q7?LQT7sgEIJ}czvNMkn!lJrFOm;*JE+}cRJWd9SR$JEUHY;Bpy3m=oDV_;aXJ|P z8*QG1>Lj#}+>YNt)sfhQZ7}XiSWN}U(S)s8ia)#>w@83Q@6ApFPZhyihXi~+M5OG3 zO=vy@>^T(H3Co}|=*0-`pIbq=e~$Gt_EA1yADF#3T}b>Xr6b3Zj4-~E zv^9SFf`=MyxKxC8lg^}q?^I3J$J}bT%iR~~p8NG^O7gr0BybIYzR$#KQO4Z(5Wsm5 zthUOiGJuLnX7aA29ufa+nrm~Y8g8H-!Y02)^^l3=-5MgI0%F#Gn>tQP_01VTl?QH0 zp-KR#;vM5YL1$)(n%SPwB1PBkFQcxb{yEsTkP^nABceSPHH(OlmzgZ8g`8uuwH+cl zJ&ihum-*w~LsA~s!vj8^leDGDf)-~gE>;*=mTLybkIbV%$*ab{6Y=#R4uwwDDhRbx^0ePSVZ4rF(C`LGyDx zJx5vP!g9GDrOALvp4{~kE$EjY%?kU~f>Ij_Q`hbPKao|-A~}I&5k<}V4&F8k58=`< zq#B&VeI;QX!kRg_+-m|6G)Ue}-Dw2-IhR@A-o1ZbSqPTaMg&NMC)24rsSaXJ%caT* zPTP_h^=IFrL8(T!+1C3)j5{4$$b~dS0~b2ep82k{Hizn1$41rXb-qroT~8E_0vwDPE0lPWiRb3GoWzKcB$8!6@1g ztZE5$i1=3vS4PuQs1!wIS?J4$AcQ_6kqjgC88K#VVpO%rQS4*K7<-}jApf#Jj%2RO zos!xCm-^PX5&Zy)LER&+N4Nvw_9yW_Kx5+&a`JxWb2Lm-nKgu2m7a>Z$c^j$MTI&$ zPMB~QohJ6mE30Cu(_kyjtKAWnvwu_1_5d%IuAM$z%ODL!(Hf`&o($fpI-kL_+~??G z1iYD`>Gp1WzJ6a?1>OTH43zaO` zeM?|O^J#oqj^cG#^BX*X;Z>}Abje+#bZQj5p%H$mE~K408oQ#eHPqE?GE_g}V&wthcc3 zpj{8C<{n!~FG#M4@#&1TeAVbdeIGBO<1%`88nuY%{4~j5ZP?LdaWx6?bnwjJV7Ev;;Tr_oUVVjBIJG_L*@MaajiOS9m3(0bo`%QXb7i3ipc z#*9ZhqE#lQteo^{A1w)UT~HD13fYzZ@j}+~+iIk)D%#KTu_z?tKhMT2o9$IYU4U)t z&LAJ}j2&$Y2{C<)RK#}ohuXU@g~-FKJ;^I=`Bf2a%puRN`DI4uxJ@(CEk$fGBW#q# zaY`Y)wq`3OlDReJRA>O^hqe?RW@ZtF!bS3Q_ARnS4F)33I5(J z{{0htZV5jx;g4iYPe4n-XJ)bZ2oni^EaGeA+S=@OITDVQDoyIjJauKh8V~#z*NHej S;23eL*uBMt@>k)*Q~v`S!cIy6 diff --git a/src/kernal/iec_fast/jiffydos_wait_line.s b/src/kernal/iec_fast/jiffydos_wait_line.s index dbfb4356..44e85b1d 100644 --- a/src/kernal/iec_fast/jiffydos_wait_line.s +++ b/src/kernal/iec_fast/jiffydos_wait_line.s @@ -13,7 +13,7 @@ jiffydos_wait_line: -!ifdef CONFIG_MB_M65 { ; MEGA65 does not need to wait, but has to waste few cycles +!ifndef CONFIG_MB_M65 { ; MEGA65 does not need to wait, but has to waste few cycles ; One might try to optimize the code by checking for disabled screen ; (bit 4 of VIC_SCROLY); problem: VIC checks this bit only once per frame: diff --git a/strings/FBA90085 b/strings/FBA90085 new file mode 100644 index 00000000..e350e3e2 --- /dev/null +++ b/strings/FBA90085 @@ -0,0 +1,3 @@ +$FB + LDA #$00 + STA (zeropage address not included in similarity) + +Instruction + some parts. Trivial - not copyrightable. From 23c5e3e76613a76a7433255bb926cfc7d9b4fa8d Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sun, 28 Feb 2021 23:13:53 +0100 Subject: [PATCH 02/32] started work on MEGA65 floppy support --- src/,,config_mega65.s | 4 ++-- src/basic/init/initmsg_m65.s | 4 ++-- src/dos_m65/dos_init.s | 4 ---- tools/generate_strings.cc | 6 +++--- 4 files changed, 7 insertions(+), 11 deletions(-) diff --git a/src/,,config_mega65.s b/src/,,config_mega65.s index 37bca28b..aa4a87d8 100644 --- a/src/,,config_mega65.s +++ b/src/,,config_mega65.s @@ -90,8 +90,8 @@ ; --- Built-in DOS configuration -;; #CONFIG# UNIT_SDCARD 20 ; do not change, DOS is not implemented yet -;; #CONFIG# UNIT_FLOPPY 0 ; do not change, DOS is not implemented yet +;; #CONFIG# UNIT_SDCARD 20 +;; #CONFIG# UNIT_FLOPPY 21 ; work in progress ;; #CONFIG# UNIT_RAMDISK 0 ; do not change, DOS is not implemented yet diff --git a/src/basic/init/initmsg_m65.s b/src/basic/init/initmsg_m65.s index 72c1f2c0..7df683f5 100644 --- a/src/basic/init/initmsg_m65.s +++ b/src/basic/init/initmsg_m65.s @@ -31,11 +31,11 @@ INITMSG_native: ; Native mode - ldx #44 + ldx #46 ldy #0 jsr M65_SETWIN_XY - ldx #36 + ldx #34 ldy #9 jsr M65_SETWIN_WH diff --git a/src/dos_m65/dos_init.s b/src/dos_m65/dos_init.s index 93397519..2347587f 100644 --- a/src/dos_m65/dos_init.s +++ b/src/dos_m65/dos_init.s @@ -4,10 +4,6 @@ ; -!set CONFIG_UNIT_FLOPPY = 0 ; XXX floppy not supported yet -!set CONFIG_UNIT_RAMDISK = 0 ; XXX RAM disk not supported yet - - dos_INIT: ; Safer version of 'dos_ENTER' - does not affect speed related registers diff --git a/tools/generate_strings.cc b/tools/generate_strings.cc index 78191819..676d6594 100644 --- a/tools/generate_strings.cc +++ b/tools/generate_strings.cc @@ -306,8 +306,8 @@ const StringEntryList GLOBAL_MiscStrings = { ListType::STRINGS_BASIC, "misc", { false, true, true, false, false, "STR_MEM_STRS", "\r STRS" }, { false, true, true, false, false, "STR_MEM_FREE", "\r\r FREE" }, - { false, false, true, false, false, "STR_DOS_FD", ", FDD " }, - { false, false, true, false, false, "STR_DOS_RD", ", RAM " }, + { false, false, true, false, false, "STR_DOS_FD", ", FLOPPY " }, + { false, false, true, false, false, "STR_DOS_RD", ", RAM DISK " }, { false, false, true, false, false, "STR_SI_HEADER", "OPEN ROMS, " }, { false, false, true, false, false, "STR_SI_MODE64", "LEGACY MODE" }, @@ -1224,7 +1224,7 @@ void DataSet::generateConfigDepStrings() // CBDOS features - featureStrM65 += "CBDOS : SD CARD "; + featureStrM65 += "\rSD CARD "; // Keyboard support features From 413dfa8f25946087778c5e45fcb66edf8f41bc14 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Mon, 1 Mar 2021 19:45:39 +0100 Subject: [PATCH 03/32] some code for floppy sector reading --- src/aliases/,aliases_hardware_m65.s | 21 ++++++++ src/dos_m65/,aliases_dos.s | 6 +-- .../dev_floppy/dev_fd_util_readsector.s | 52 +++++++++++++++++++ 3 files changed, 76 insertions(+), 3 deletions(-) create mode 100644 src/dos_m65/dev_floppy/dev_fd_util_readsector.s diff --git a/src/aliases/,aliases_hardware_m65.s b/src/aliases/,aliases_hardware_m65.s index 4c5126e4..4fde6888 100644 --- a/src/aliases/,aliases_hardware_m65.s +++ b/src/aliases/,aliases_hardware_m65.s @@ -29,6 +29,27 @@ !addr VIC_PALSEL = $D070 ; - palette selection register + ; Floppy controller registers + + !addr FDC_CONTROL = $D080 + !addr FDC_COMMAND = $D081 + !addr FDC_STATUS_A = $D082 + !addr FDC_STATUS_B = $D083 + !addr FDC_TRACK = $D084 + !addr FDC_SECTOR = $D085 + !addr FDC_SIDE = $D086 + !addr FDC_DATA = $D087 + !addr FDC_CLOCK = $D088 + !addr FDC_STEP = $D089 + !addr FDC_PCODE = $D08A + + !addr FDC_DBG0 = $D6A0 + !addr FDC_DBG1 = $D6A1 + !addr FDC_DATARATE = $D6A2 + !addr FDC_LAST_TRACK = $D6A3 + !addr FDC_LAST_SECTOR = $D6A4 + !addr FDC_LAST_SIODE = $D6A5 + ; Palette memory areas !addr PALETTE_R = $D100 diff --git a/src/dos_m65/,aliases_dos.s b/src/dos_m65/,aliases_dos.s index 8a11c5f6..6416122c 100644 --- a/src/dos_m65/,aliases_dos.s +++ b/src/dos_m65/,aliases_dos.s @@ -48,10 +48,10 @@ !addr par_LDA_nnnn_Y = $8015 ; - 2 bytes; address in buffer, ram disk !addr code_RTS_04 = $8017 ; - RTS instruction - ; Parameters for utilities/helkpers + ; Parameters for utilities/helpers - !addr PAR_TRACK = $8018 ; track number for status/error - !addr PAR_SECTOR = $8019 ; sector number for status/error + !addr PAR_TRACK = $8018 ; track number, also for status/error + !addr PAR_SECTOR = $8019 ; sector number, also for status/error !addr PAR_FSIZE_BYTES = $801A ; 4 bytes - file size in bytes !addr PAR_FSIZE_BLOCKS = $801E ; 2 bytes - file size in blocks diff --git a/src/dos_m65/dev_floppy/dev_fd_util_readsector.s b/src/dos_m65/dev_floppy/dev_fd_util_readsector.s new file mode 100644 index 00000000..6d3747e7 --- /dev/null +++ b/src/dos_m65/dev_floppy/dev_fd_util_readsector.s @@ -0,0 +1,52 @@ + +; Read a single sector from a floppy drive + + +; XXX utilize this + +dev_fd_util_readsector: + + ; Select FDD sector as buffer + + lda #%10000000 ; select floppy buffer + trb SD_BUFCTL + + lda #%00000100 + trb FDC_CONTROL ; set side 0 + + ; Select physical track and sector based on logical ones from PAR_TRACK and PAR_SECTOR + + lda PAR_TRACK + dec + sta FDC_TRACK + + lda FDC_SECTOR + cmp #20 + bcc @side0 + +@side1: + + ldx #$01 + sec + sbc #20 + +skip_2_bytes_trash_nvz + +@side0: + + ldx #$00 + stx FDC_SIDE + clc + ror + sta FDC_SECTOR + + ; Ask the controller to read the sector + + lda #$40 + sta FDC_COMMAND +@lp: + lda FDC_STATUS_B ; XXX detect errors here + bpl @lp + + ; Copy sector to buffer in RAM + + ; XXX From 62f9b2d3d600d950c1266643569dd1f3711ab433 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Tue, 2 Mar 2021 21:43:37 +0100 Subject: [PATCH 04/32] sector reading fixes --- src/,,config_mega65.s | 2 +- src/dos_m65/dev_floppy/dev_fd_cmd_open.s | 60 ++++++++++++++++++- .../dev_floppy/dev_fd_util_readsector.s | 20 +++++-- 3 files changed, 74 insertions(+), 8 deletions(-) diff --git a/src/,,config_mega65.s b/src/,,config_mega65.s index aa4a87d8..45797b11 100644 --- a/src/,,config_mega65.s +++ b/src/,,config_mega65.s @@ -67,7 +67,7 @@ ;; #CONFIG# KEYCMD_F9 "@20$" ;; #CONFIG# KEYCMD_F10 "\5FL" -;; #CONFIG# KEYCMD_F11 "COLORSET 128" +;; #CONFIG# KEYCMD_F11 "@21$" ;; #CONFIG# KEYCMD_F12 "\5FHF" ;; #CONFIG# KEYCMD_F13 "JOYCRSR 2" ;; #CONFIG# KEYCMD_F14 "BOOTCPM" diff --git a/src/dos_m65/dev_floppy/dev_fd_cmd_open.s b/src/dos_m65/dev_floppy/dev_fd_cmd_open.s index 8029650e..38a14f9d 100644 --- a/src/dos_m65/dev_floppy/dev_fd_cmd_open.s +++ b/src/dos_m65/dev_floppy/dev_fd_cmd_open.s @@ -6,12 +6,68 @@ dev_fd_cmd_OPEN: - ; XXX provide implementation + lda #$01 ; mode: receive command or file name + sta FD_MODE - jmp dos_EXIT_SEC + jmp dos_EXIT_CLC dev_fd_cmd_OPEN_EOI: + ; XXX this dispatcher is temporary + + ; Erase filter pattern XXX this should be moved to common part + + ldy #$0F + lda #$A0 +@lp1: + sta PAR_FPATTERN, y + dey + bpl @lp1 + + ; XXX add support for second floppy + + lda FD_CMDFN_BUF + cmp #'$' + beq dev_fd_cmd_OPEN_dir + + ; FALLTROUGH + +dev_fd_cmd_OPEN_file: + ; XXX provide implementation jmp dos_EXIT_CLC + +dev_fd_cmd_OPEN_dir: + + lda #$02 ; mode: read directory + sta FD_MODE + + ; Copy the filter from command XXX this should be moved to common part and deduplicated with file opening + + ldy #$00 +@lp1: + lda FD_CMDFN_BUF+1, y + cmp #$A0 + beq @lp1_end + sta PAR_FPATTERN, y + iny + cpy #$10 + bne @lp1 + +@lp1_end: + + ; XXX experimental code below + + ; Try to read track 40, sector 0 (disk header) + + lda #40 + sta PAR_TRACK + lda #$00 + sta PAR_SECTOR + + jsr dev_fd_util_readsector + + ; XXX continue implementation + + jmp dos_EXIT_CLC diff --git a/src/dos_m65/dev_floppy/dev_fd_util_readsector.s b/src/dos_m65/dev_floppy/dev_fd_util_readsector.s index 6d3747e7..a06f494c 100644 --- a/src/dos_m65/dev_floppy/dev_fd_util_readsector.s +++ b/src/dos_m65/dev_floppy/dev_fd_util_readsector.s @@ -11,8 +11,11 @@ dev_fd_util_readsector: lda #%10000000 ; select floppy buffer trb SD_BUFCTL - lda #%00000100 - trb FDC_CONTROL ; set side 0 + lda #%00000111 + trb FDC_CONTROL ; set drive 0 (internal) XXX support multiple drives + + lda #%00001000 + trb FDC_CONTROL ; set side 0 by default ; Select physical track and sector based on logical ones from PAR_TRACK and PAR_SECTOR @@ -20,15 +23,20 @@ dev_fd_util_readsector: dec sta FDC_TRACK - lda FDC_SECTOR + lda PAR_SECTOR cmp #20 bcc @side0 @side1: + + lda #%00001000 + tsb FDC_CONTROL ; set side 1 - ldx #$01 + lda PAR_SECTOR sec sbc #20 + + ldx #$01 +skip_2_bytes_trash_nvz @side0: @@ -44,9 +52,11 @@ dev_fd_util_readsector: lda #$40 sta FDC_COMMAND @lp: - lda FDC_STATUS_B ; XXX detect errors here + lda FDC_STATUS_B ; XXX detect errors here XXX waiting is probably not corrent bpl @lp ; Copy sector to buffer in RAM ; XXX + + rts From 29db7340dd9bc208b2c8e3bffbd0acd53aff6a29 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Tue, 2 Mar 2021 23:21:30 +0100 Subject: [PATCH 05/32] CBDOS memory reorganization --- src/dos_m65/,aliases_dos.s | 71 +++++++++++++++++----- src/dos_m65/dev_floppy/dev_fd_init.s | 2 +- src/dos_m65/dev_ramdisk/dev_rd_init.s | 2 +- src/dos_m65/dev_sdcard/dev_sd_init.s | 2 +- src/dos_m65/dev_sdcard/fs_hvsr_read_dir.s | 36 +++++------ src/dos_m65/dev_sdcard/fs_hvsr_read_file.s | 10 +-- src/dos_m65/msg_acptr.s | 6 +- src/dos_m65/utils/util_status.s | 14 ++--- 8 files changed, 92 insertions(+), 51 deletions(-) diff --git a/src/dos_m65/,aliases_dos.s b/src/dos_m65/,aliases_dos.s index 6416122c..877b2072 100644 --- a/src/dos_m65/,aliases_dos.s +++ b/src/dos_m65/,aliases_dos.s @@ -109,26 +109,67 @@ !addr FD_STATUS_IDX = $806E ; - floppy !addr RD_STATUS_IDX = $806F ; - ram disk - !addr XX_STATUS_STR = $8070 - !addr SD_STATUS_STR = $8070 ; status string for SD card, terminated by 0 - !addr FD_STATUS_STR = $80A0 ; status string for floppy drive, terminated by 0 - !addr RD_STATUS_STR = $80D0 ; status string for ram disk, terminated by 0 + !addr SD_DESC = $8070 ; current file descriptor + + + + ; XXX Free space + ; - ; Further pages + ; Various buffers, caches, and other large memory chunks ; - !addr SD_CMDFN_BUF = $8100 ; buffer for command and/or file name, 128 bytes, SD card - !addr FD_CMDFN_BUF = $8180 ; buffer for command and/or file name, 128 bytes, floppy - !addr RD_CMDFN_BUF = $8200 ; buffer for command and/or file name, 128 bytes, ram disk + ; BAM cache for floppy drives; 2 KB (4 blocks) each, to cover up to ED floppies - XXX implementation to be written - !addr XX_DIR_ENTRY = $8280 ; directory entry in BASIC format - !addr SD_DIR_ENTRY = $8280 ; - SD card - !addr FD_DIR_ENTRY = $82B0 ; - floppy - !addr RD_DIR_ENTRY = $82E0 ; - ram disk + !addr FD_BAM_CACHE_0 = $8A00 ; - floppy drive 0 + !addr FD_BAM_CACHE_1 = $8E00 ; - floppy drive 1 - !addr SD_MEMSHADOW = $8310 ; 256 byte buffer for preserving original memory content - !addr SD_FILEBUF = $8410 ; 512 byte buffer for file reading + ; General purpose buffers, 512 bytes each, each starts at page start - XXX dynamic alllocation to be written - !addr SD_DESC = $8610 ; current file descriptor + !addr SHARED_BUF_0 = $9200 ; XXX temporarily hardcoded for usage by SD card + !addr SHARED_BUF_1 = $9400 + !addr SHARED_BUF_2 = $9600 + !addr SHARED_BUF_3 = $9800 + !addr SHARED_BUF_4 = $9A00 + !addr SHARED_BUF_5 = $9C00 + !addr SHARED_BUF_6 = $9E00 + !addr SHARED_BUF_7 = $A000 + !addr SHARED_BUF_8 = $A200 + !addr SHARED_BUF_9 = $A400 + !addr SHARED_BUF_A = $A600 + !addr SHARED_BUF_B = $A800 + !addr SHARED_BUF_C = $AA00 + !addr SHARED_BUF_D = $AC00 + !addr SHARED_BUF_E = $AE00 + !addr SHARED_BUF_F = $B000 + ; Memory shadow, needed for SD card support + + !addr SD_MEMSHADOW_BUF = $8200 ; 256 byte buffer for preserving original memory content + + ; Command/filename buffers, 128 bytes each - XXX extend to 256 bytes (change implementation) + + !addr SD_CMDFN_BUF = $B300 ; - SD card + !addr FD_CMDFN_BUF = $B400 ; - floppy + !addr RD_CMDFN_BUF = $B500 ; - ram disk + + ; Directory entry buffers, in BASIC format, $30 bytes each + + !addr XX_DIRENT_BUF = $B600 + !addr SD_DIRENT_BUF = $B600 ; - SD card + !addr FD_DIRENT_BUF = $B630 ; - floppy + !addr RD_DIRENT_BUF = $B660 ; - ram disk + + ; Status buffers, content terminated by 0, $30 bytes each + + !addr XX_STATUS_BUF = $B690 + !addr SD_STATUS_BUF = $B690 ; - SD card + !addr FD_STATUS_BUF = $B6C0 ; - floppy + !addr RD_STATUS_BUF = $B6F0 ; - ram disk + + ; + ; Reserved 18 KB for floppy track buffers + some area for track metadata + ; + + !addr XX_REMAINING = $B720 diff --git a/src/dos_m65/dev_floppy/dev_fd_init.s b/src/dos_m65/dev_floppy/dev_fd_init.s index 501bcc61..4be7c57a 100644 --- a/src/dos_m65/dev_floppy/dev_fd_init.s +++ b/src/dos_m65/dev_floppy/dev_fd_init.s @@ -20,7 +20,7 @@ dev_fd_init: @1: inx lda dos_sts_init_floppy,x - sta FD_STATUS_STR,x + sta FD_STATUS_BUF,x bne @1 ; End of initialization diff --git a/src/dos_m65/dev_ramdisk/dev_rd_init.s b/src/dos_m65/dev_ramdisk/dev_rd_init.s index e7be8d2c..964eae2a 100644 --- a/src/dos_m65/dev_ramdisk/dev_rd_init.s +++ b/src/dos_m65/dev_ramdisk/dev_rd_init.s @@ -20,7 +20,7 @@ dev_rd_init: @1: inx lda dos_sts_init_ramdisk,x - sta RD_STATUS_STR,x + sta RD_STATUS_BUF,x bne @1 ; End of initialization diff --git a/src/dos_m65/dev_sdcard/dev_sd_init.s b/src/dos_m65/dev_sdcard/dev_sd_init.s index 526e5d3a..4ee236a8 100644 --- a/src/dos_m65/dev_sdcard/dev_sd_init.s +++ b/src/dos_m65/dev_sdcard/dev_sd_init.s @@ -21,7 +21,7 @@ dev_sd_init: @1: inx lda dos_sts_init_sdcard,x - sta SD_STATUS_STR,x + sta SD_STATUS_BUF,x bne @1 ; Close all the files in the hypervisor, go to root directory diff --git a/src/dos_m65/dev_sdcard/fs_hvsr_read_dir.s b/src/dos_m65/dev_sdcard/fs_hvsr_read_dir.s index 91bb422e..fdcbaaa8 100644 --- a/src/dos_m65/dev_sdcard/fs_hvsr_read_dir.s +++ b/src/dos_m65/dev_sdcard/fs_hvsr_read_dir.s @@ -66,21 +66,21 @@ fs_hvsr_read_dir: jsr util_dir_filesize_bytes - ; Prepare output entry, starting from XX_DIR_ENTRY + initial offset + ; Prepare output entry, starting from XX_DIRENT_BUF + initial offset ldx #$00 ; offset for SD card unit lda #$01 ; link to the next line - dummy, will be regenerated by BASIC - sta XX_DIR_ENTRY, x + sta XX_DIRENT_BUF, x inx - sta XX_DIR_ENTRY, x + sta XX_DIRENT_BUF, x inx lda PAR_FSIZE_BLOCKS+0 ; store number of blocks - sta XX_DIR_ENTRY, x + sta XX_DIRENT_BUF, x inx lda PAR_FSIZE_BLOCKS+1 - sta XX_DIR_ENTRY, x + sta XX_DIRENT_BUF, x inx lda #' ' ; indent file name @@ -88,14 +88,14 @@ fs_hvsr_read_dir: @lp1: dey bmi @lp1_done - sta XX_DIR_ENTRY, x + sta XX_DIRENT_BUF, x inx bra @lp1 @lp1_done: lda #$22 ; opening quote - sta XX_DIR_ENTRY, x + sta XX_DIRENT_BUF, x inx ldy #$FF ; put file name @@ -108,14 +108,14 @@ fs_hvsr_read_dir: beq @lp2_done cpy #$10 beq @lp2_done - sta XX_DIR_ENTRY, x + sta XX_DIRENT_BUF, x inx bra @lp2 @lp2_done: lda #$22 ; closing quote - sta XX_DIR_ENTRY, x + sta XX_DIRENT_BUF, x inx ldy #$10 ; put spaces for indentation @@ -128,7 +128,7 @@ fs_hvsr_read_dir: bne @lp3_done lda #' ' - sta XX_DIR_ENTRY, x + sta XX_DIRENT_BUF, x inx bra @lp3 @@ -142,7 +142,7 @@ fs_hvsr_read_dir: @closed: lda #' ' - sta XX_DIR_ENTRY, x + sta XX_DIRENT_BUF, x inx lda PAR_FTYPE ; put file type @@ -156,7 +156,7 @@ fs_hvsr_read_dir: lda dir_types, y beq @lp4_done - sta XX_DIR_ENTRY, x + sta XX_DIRENT_BUF, x inx iny bra @lp4 @@ -167,21 +167,21 @@ fs_hvsr_read_dir: and #$40 beq @skipro lda #'<' - sta XX_DIR_ENTRY, x + sta XX_DIRENT_BUF, x inx @skipro: lda #$00 ; put end of the line - sta XX_DIR_ENTRY, x + sta XX_DIRENT_BUF, x inx stx SD_ACPTR_LEN+0 sta SD_ACPTR_LEN+1 - lda #<(XX_DIR_ENTRY) + lda #<(XX_DIRENT_BUF) sta SD_ACPTR_PTR+0 - lda #>(XX_DIR_ENTRY) + lda #>(XX_DIRENT_BUF) sta SD_ACPTR_PTR+1 clc @@ -227,7 +227,7 @@ fs_hvsr_direntmem_prepare: ldx #$00 @1: ldy $1000, x - sty SD_MEMSHADOW, x + sty SD_MEMSHADOW_BUF, x inx bne @1 @@ -239,7 +239,7 @@ fs_hvsr_direntmem_restore: ldx #$00 @1: - ldy SD_MEMSHADOW, x + ldy SD_MEMSHADOW_BUF, x sty $1000, x inx bne @1 diff --git a/src/dos_m65/dev_sdcard/fs_hvsr_read_file.s b/src/dos_m65/dev_sdcard/fs_hvsr_read_file.s index 61977c37..29c88fba 100644 --- a/src/dos_m65/dev_sdcard/fs_hvsr_read_file.s +++ b/src/dos_m65/dev_sdcard/fs_hvsr_read_file.s @@ -99,12 +99,12 @@ fs_hvsr_read_file: ; Set pointer to new data - lda #SD_FILEBUF + lda #>SHARED_BUF_0 sta SD_ACPTR_PTR+1 - ; Copy data to SD_FILEBUF + ; Copy data to SHARED_BUF_0 lda #%10000000 ; select SD card buffer tsb SD_BUFCTL @@ -131,8 +131,8 @@ fs_hvsr_read_file: !byte $00 ; operation: COPY !word $0200 ; data size if 512 bytes !byte $00, $6E, $0D ; src. addr is $xxD6E00 - !byte <(SD_FILEBUF - $8000) - !byte >(SD_FILEBUF - $8000) + !byte <(SHARED_BUF_0 - $8000) + !byte >(SHARED_BUF_0 - $8000) !byte $01 ; dst. addr is $xx1xxxx (internal buffer) fs_hvsr_file_not_found: diff --git a/src/dos_m65/msg_acptr.s b/src/dos_m65/msg_acptr.s index e3bffd87..f1e0dbe2 100644 --- a/src/dos_m65/msg_acptr.s +++ b/src/dos_m65/msg_acptr.s @@ -90,21 +90,21 @@ msg_ACPTR_status_SD: ; get next byte of status - SD card ldx SD_STATUS_IDX inc SD_STATUS_IDX - lda SD_STATUS_STR,x + lda SD_STATUS_BUF,x bra msg_ACPTR_status_got msg_ACPTR_status_FD: ; get next byte of status - floppy ldx FD_STATUS_IDX inc FD_STATUS_IDX - lda FD_STATUS_STR,x + lda FD_STATUS_BUF,x bra msg_ACPTR_status_got msg_ACPTR_status_RD: ; get next byte of status - ram disk ldx RD_STATUS_IDX inc RD_STATUS_IDX - lda RD_STATUS_STR,x + lda RD_STATUS_BUF,x ; FALLTROUGH diff --git a/src/dos_m65/utils/util_status.s b/src/dos_m65/utils/util_status.s index 126f7a96..209a73cd 100644 --- a/src/dos_m65/utils/util_status.s +++ b/src/dos_m65/utils/util_status.s @@ -50,7 +50,7 @@ util_status_common: @lp: jsr code_LDA_nnnn_Y beq @lp_end - sta XX_STATUS_STR, x + sta XX_STATUS_BUF, x iny inx bra @lp @@ -69,13 +69,13 @@ util_status_common: ; Mark end of status and quit lda #$00 - sta XX_STATUS_STR, x + sta XX_STATUS_BUF, x rts util_status_store_comma: ldy #',' - sty XX_STATUS_STR, x + sty XX_STATUS_BUF, x inx rts @@ -86,7 +86,7 @@ util_status_store_number: cmp #200 bcc @store_00_199 ldy #'2' - sty XX_STATUS_STR, x + sty XX_STATUS_BUF, x inx sec sbc #200 @@ -97,7 +97,7 @@ util_status_store_number: cmp #100 bcc @store_00_99 ldy #'1' - sty XX_STATUS_STR, x + sty XX_STATUS_BUF, x inx sec sbc #100 @@ -115,11 +115,11 @@ util_status_store_number: @store_finalize: ; first digit to store in .Y, second in .A (need no add '0') - sty XX_STATUS_STR, x + sty XX_STATUS_BUF, x inx clc adc #'0' - sta XX_STATUS_STR, x + sta XX_STATUS_BUF, x inx rts From d91e8365b633ac6511fccbb21497cfd8559f3f6c Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Wed, 3 Mar 2021 17:10:02 +0100 Subject: [PATCH 06/32] CBDOS wildcard improvements --- src/dos_m65/utils/util_dir_filter.s | 67 ++++++++++++++++++++++++++++- 1 file changed, 65 insertions(+), 2 deletions(-) diff --git a/src/dos_m65/utils/util_dir_filter.s b/src/dos_m65/utils/util_dir_filter.s index 9e20041b..181747b6 100644 --- a/src/dos_m65/utils/util_dir_filter.s +++ b/src/dos_m65/utils/util_dir_filter.s @@ -1,5 +1,5 @@ -; Check if file name matches the filter (if so - Zero flag set) +; Check if file name/type matches the filter (if so - Zero flag set) util_dir_filter: @@ -14,15 +14,78 @@ util_dir_filter: lda PAR_FPATTERN, y cmp #'*' - beq @done ; branch on wildcard + beq @asterisk ; branch on wildcard + + cmp #'?' + beq @lp1_next ; question mark substitutes any character cmp PAR_FNAME, y bne @done ; branch if does not match +@lp1_next: + iny cpy #$10 bne @lp1 ; next iteration if maximum length not reached +@done_match: + + lda #$00 + @done: rts + +@asterisk: + + iny ; check if the next character after asterisk is '=' + cpy #$10 + beq @done + lda PAR_FPATTERN, y + cmp #'=' + bne @done_match + + iny + cpy #$10 + beq @done + lda PAR_FPATTERN, y + + ; XXXthe comparisons below do not work; investigate, why + + cmp #$44 ; if 'D' - require a directory XXX document this + beq @require_dir + cmp #$50 ; if 'P' - require PRG file + beq @require_prg + cmp #$52 ; if 'R' - require REL file + beq @require_rel + cmp #$53 ; if 'S' - require SEQ file + beq @require_seq + cmp #$55 ; if 'U' - require USR file + bne @done + +@require_usr: + + lda #$03 + +skip_2_bytes_trash_nvz + +@require_seq: + + lda #$01 + +skip_2_bytes_trash_nvz + +@require_rel: + + lda #$04 + +skip_2_bytes_trash_nvz + +@require_prg: + + lda #$02 + +skip_2_bytes_trash_nvz + +@require_dir: + + lda #$05 + + cmp PAR_FTYPE + rts From 384d5a4fb2e50f3725c695e94c265c6d247885a2 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Wed, 3 Mar 2021 17:24:29 +0100 Subject: [PATCH 07/32] fixed filtering by file type --- src/dos_m65/utils/util_dir_filter.s | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/dos_m65/utils/util_dir_filter.s b/src/dos_m65/utils/util_dir_filter.s index 181747b6..1c0adcdd 100644 --- a/src/dos_m65/utils/util_dir_filter.s +++ b/src/dos_m65/utils/util_dir_filter.s @@ -50,9 +50,9 @@ util_dir_filter: beq @done lda PAR_FPATTERN, y - ; XXXthe comparisons below do not work; investigate, why + sta $1000 - cmp #$44 ; if 'D' - require a directory XXX document this + cmp #$44 ; if 'D' - require a directory XXX documment this extension beq @require_dir cmp #$50 ; if 'P' - require PRG file beq @require_prg @@ -87,5 +87,7 @@ util_dir_filter: lda #$05 - cmp PAR_FTYPE + eor PAR_FTYPE + and #%00111111 + rts From 93bf5afcee62615c4d8c2556a2b299423dee7a73 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Wed, 3 Mar 2021 17:41:46 +0100 Subject: [PATCH 08/32] preparation for CBM partitions support --- src/dos_m65/assets/dos_parts_dir.s | 1 + src/dos_m65/dev_sdcard/fs_hvsr_util_nextdirentry.s | 6 +++--- src/dos_m65/utils/util_dir_filter.s | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/dos_m65/assets/dos_parts_dir.s b/src/dos_m65/assets/dos_parts_dir.s index a81e9e89..309d3703 100644 --- a/src/dos_m65/assets/dos_parts_dir.s +++ b/src/dos_m65/assets/dos_parts_dir.s @@ -40,6 +40,7 @@ dir_types: !pet "prg", $00 ; PRG !pet "usr", $00 ; USR !pet "rel", $00 ; REL + !pet "cbm", $00 ; CBM-style partition !pet "dir", $00 ; directory ; File types below are not mandatory diff --git a/src/dos_m65/dev_sdcard/fs_hvsr_util_nextdirentry.s b/src/dos_m65/dev_sdcard/fs_hvsr_util_nextdirentry.s index 5db911a3..4aeef26c 100644 --- a/src/dos_m65/dev_sdcard/fs_hvsr_util_nextdirentry.s +++ b/src/dos_m65/dev_sdcard/fs_hvsr_util_nextdirentry.s @@ -114,7 +114,7 @@ fs_hvsr_util_nextdirentry: ; Set the type to directory - lda #$05 + lda #$06 bra @detect_attributes @entity_file: @@ -169,7 +169,7 @@ fs_hvsr_util_nextdirentry: @lpext_found: - cpy #$10 + cpy #$14 +beq fs_hvsr_util_nextdirentry ; file extension 'DIR' does not mean this is a directory tya @@ -179,7 +179,7 @@ fs_hvsr_util_nextdirentry: ror inc - cmp #$06 ; mark some file types (not SEQ/PRG/USR/REL/DIR) as read-only + cmp #$07 ; mark some file types (not SEQ/PRG/USR/REL/CBM/DIR) as read-only bcc @detect_attributes ora #$40 diff --git a/src/dos_m65/utils/util_dir_filter.s b/src/dos_m65/utils/util_dir_filter.s index 1c0adcdd..07751dee 100644 --- a/src/dos_m65/utils/util_dir_filter.s +++ b/src/dos_m65/utils/util_dir_filter.s @@ -85,7 +85,7 @@ util_dir_filter: @require_dir: - lda #$05 + lda #$06 eor PAR_FTYPE and #%00111111 From 3aa33f76ff6473a37a794d549248161889fecc69 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Wed, 3 Mar 2021 19:04:31 +0100 Subject: [PATCH 09/32] common DMA list in CBDOS --- src/dos_m65/,aliases_dos.s | 9 +++++- src/dos_m65/assets/dos_dmalist_template.s | 11 ++++++++ src/dos_m65/dev_sdcard/fs_hvsr_read_file.s | 32 ++++++++------------- src/dos_m65/dos_init.s | 9 ++++++ src/dos_m65/utils/util_dma_launch.s | 33 ++++++++++++++++++++++ 5 files changed, 72 insertions(+), 22 deletions(-) create mode 100644 src/dos_m65/assets/dos_dmalist_template.s create mode 100644 src/dos_m65/utils/util_dma_launch.s diff --git a/src/dos_m65/,aliases_dos.s b/src/dos_m65/,aliases_dos.s index 877b2072..bbdd8785 100644 --- a/src/dos_m65/,aliases_dos.s +++ b/src/dos_m65/,aliases_dos.s @@ -109,7 +109,14 @@ !addr FD_STATUS_IDX = $806E ; - floppy !addr RD_STATUS_IDX = $806F ; - ram disk - !addr SD_DESC = $8070 ; current file descriptor + !addr DMAJOB_LIST = $8070 ; 15 bytes, a general purpose DMA list + !addr DMAJOB_SRC_MB = DMAJOB_LIST+2 + !addr DMAJOB_DST_MB = DMAJOB_LIST+4 + !addr DMAJOB_SIZE = DMAJOB_LIST+7 ; keep $0200 here + !addr DMAJOB_SRC_ADDR = DMAJOB_LIST+9 + !addr DMAJOB_DST_ADDR = DMAJOB_LIST+12 + + !addr SD_DESC = $807F ; current file descriptor diff --git a/src/dos_m65/assets/dos_dmalist_template.s b/src/dos_m65/assets/dos_dmalist_template.s new file mode 100644 index 00000000..2a7954bb --- /dev/null +++ b/src/dos_m65/assets/dos_dmalist_template.s @@ -0,0 +1,11 @@ + +dos_dmalist_template: + + !byte $0A ; use F018A list format (it is shorter by 1 byte) + !byte $80, $00 ; src. address is $00xxxxx + !byte $81, $00 ; dst. address is $00xxxxx + !byte $00 ; end of options + !byte $00 ; operation: COPY + !word $0200 ; data size if 512 bytes + + ; 3 bytes of src address + 3 bytes of dst address - not included in template diff --git a/src/dos_m65/dev_sdcard/fs_hvsr_read_file.s b/src/dos_m65/dev_sdcard/fs_hvsr_read_file.s index 29c88fba..b7bc2daf 100644 --- a/src/dos_m65/dev_sdcard/fs_hvsr_read_file.s +++ b/src/dos_m65/dev_sdcard/fs_hvsr_read_file.s @@ -109,32 +109,22 @@ fs_hvsr_read_file: lda #%10000000 ; select SD card buffer tsb SD_BUFCTL - lda #$02 - sta DMA_ADDRBANK ; $D702 - lda #$00 - sta DMA_ADDRMB ; $D704 + ; Copy data using DMA job - lda #>(@dmalist-$4000) - sta DMA_ADDRMSB ; $D701 - lda #<(@dmalist-$4000) - sta DMA_ETRIG ; $D705 + lda #$00 + sta DMAJOB_DST_MB + lda #<(SHARED_BUF_0 - $8000) + sta DMAJOB_DST_ADDR+0 + lda #>(SHARED_BUF_0 - $8000) + sta DMAJOB_DST_ADDR+1 + lda #$01 + sta DMAJOB_DST_ADDR+2 + + jsr util_dma_launch_from_hwbuf ; execute DMA job clc rts -@dmalist: - - !byte $0A ; use F018A list format (it is shorter by 1 byte) - !byte $80, $FF ; src. address is $FFxxxxx - !byte $81, $00 ; dst. address is $00xxxxx - !byte $00 ; end of options - !byte $00 ; operation: COPY - !word $0200 ; data size if 512 bytes - !byte $00, $6E, $0D ; src. addr is $xxD6E00 - !byte <(SHARED_BUF_0 - $8000) - !byte >(SHARED_BUF_0 - $8000) - !byte $01 ; dst. addr is $xx1xxxx (internal buffer) - fs_hvsr_file_not_found: jsr fs_hvsr_direntmem_restore ; restore $1000 memory content diff --git a/src/dos_m65/dos_init.s b/src/dos_m65/dos_init.s index 2347587f..1b1c8911 100644 --- a/src/dos_m65/dos_init.s +++ b/src/dos_m65/dos_init.s @@ -45,6 +45,15 @@ dos_INIT: jsr dev_fd_init jsr dev_rd_init + ; Initialize DMA list + + ldy #$08 +@2: + lda dos_dmalist_template, y + sta DMAJOB_LIST, y + dey + bpl @2: + ; Initialize helper code in RAM lda #$AD ; LDA opcode, absolute diff --git a/src/dos_m65/utils/util_dma_launch.s b/src/dos_m65/utils/util_dma_launch.s new file mode 100644 index 00000000..9ea2bd7a --- /dev/null +++ b/src/dos_m65/utils/util_dma_launch.s @@ -0,0 +1,33 @@ + +; Launch the DMA list + + +util_dma_launch_from_hwbuf: + + ; Operation from source $FFD6E00 (hardware SD card / floppy buffer) + ; Destination has to be set by the caller + + lda #$FF + sta DMAJOB_SRC_MB + lda #$00 + sta DMAJOB_SRC_ADDR+0 + lda #$6E + sta DMAJOB_SRC_ADDR+1 + lda #$0D + sta DMAJOB_SRC_ADDR+2 + + ; FALLTROUGH + +util_dma_launch: + + lda #$01 + sta DMA_ADDRBANK ; $D702 + dec + sta DMA_ADDRMB ; $D704 + + lda #>(DMAJOB_LIST-$8000) + sta DMA_ADDRMSB ; $D701 + lda #<(DMAJOB_LIST-$8000) + sta DMA_ETRIG ; $D705 + + rts From 27c36bb5542986c01a226267bf937a7ecb456368 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Wed, 3 Mar 2021 21:45:07 +0100 Subject: [PATCH 10/32] more work towards floppy directory reading --- src/dos_m65/,aliases_dos.s | 2 +- src/dos_m65/dev_floppy/dev_fd_cmd_open.s | 4 ++ .../dev_floppy/dev_fd_util_readsector.s | 60 +++++++++++++------ src/dos_m65/dev_floppy/fs_1581_read_dir.s | 24 ++++++++ src/dos_m65/dev_floppy/fs_1581_read_file.s | 8 +++ src/dos_m65/dev_sdcard/fs_hvsr_read_file.s | 2 +- 6 files changed, 79 insertions(+), 21 deletions(-) create mode 100644 src/dos_m65/dev_floppy/fs_1581_read_dir.s create mode 100644 src/dos_m65/dev_floppy/fs_1581_read_file.s diff --git a/src/dos_m65/,aliases_dos.s b/src/dos_m65/,aliases_dos.s index bbdd8785..7268677e 100644 --- a/src/dos_m65/,aliases_dos.s +++ b/src/dos_m65/,aliases_dos.s @@ -135,7 +135,7 @@ ; General purpose buffers, 512 bytes each, each starts at page start - XXX dynamic alllocation to be written !addr SHARED_BUF_0 = $9200 ; XXX temporarily hardcoded for usage by SD card - !addr SHARED_BUF_1 = $9400 + !addr SHARED_BUF_1 = $9400 ; XXX temporarily hardcoded for usage by floppy !addr SHARED_BUF_2 = $9600 !addr SHARED_BUF_3 = $9800 !addr SHARED_BUF_4 = $9A00 diff --git a/src/dos_m65/dev_floppy/dev_fd_cmd_open.s b/src/dos_m65/dev_floppy/dev_fd_cmd_open.s index 38a14f9d..72794ff7 100644 --- a/src/dos_m65/dev_floppy/dev_fd_cmd_open.s +++ b/src/dos_m65/dev_floppy/dev_fd_cmd_open.s @@ -57,6 +57,10 @@ dev_fd_cmd_OPEN_dir: @lp1_end: + jmp fs_1581_read_dir_open + + + ; XXX experimental code below ; Try to read track 40, sector 0 (disk header) diff --git a/src/dos_m65/dev_floppy/dev_fd_util_readsector.s b/src/dos_m65/dev_floppy/dev_fd_util_readsector.s index a06f494c..72509372 100644 --- a/src/dos_m65/dev_floppy/dev_fd_util_readsector.s +++ b/src/dos_m65/dev_floppy/dev_fd_util_readsector.s @@ -2,26 +2,21 @@ ; Read a single sector from a floppy drive -; XXX utilize this - dev_fd_util_readsector: ; Select FDD sector as buffer lda #%10000000 ; select floppy buffer - trb SD_BUFCTL + trb SD_BUFCTL ; $D689 - lda #%00000111 - trb FDC_CONTROL ; set drive 0 (internal) XXX support multiple drives - - lda #%00001000 - trb FDC_CONTROL ; set side 0 by default + lda #%00001111 ; set drive 0 (internal) and side 0 + trb FDC_CONTROL ; $D080 ; Select physical track and sector based on logical ones from PAR_TRACK and PAR_SECTOR lda PAR_TRACK dec - sta FDC_TRACK + sta FDC_TRACK ; $D084 lda PAR_SECTOR cmp #20 @@ -29,8 +24,8 @@ dev_fd_util_readsector: @side1: - lda #%00001000 - tsb FDC_CONTROL ; set side 1 + lda #%00001000 ; set side 1 + tsb FDC_CONTROL ; $D080 lda PAR_SECTOR sec @@ -42,21 +37,48 @@ dev_fd_util_readsector: @side0: ldx #$00 - stx FDC_SIDE + stx FDC_SIDE ; $D086 clc ror - sta FDC_SECTOR + sta FDC_SECTOR ; $D085 - ; Ask the controller to read the sector + ; Ask the controller to read the sector XXX how to detect errors, missing disk, etc.? lda #$40 - sta FDC_COMMAND -@lp: - lda FDC_STATUS_B ; XXX detect errors here XXX waiting is probably not corrent - bpl @lp + sta FDC_COMMAND ; $D081 + + ; Wait for RDREQ (indicates sector found) + +@lp1: + lda FDC_STATUS_B ; $D083 + bpl @lp1 + + ; Wait for BUSY flag to clear + +@lp2: + lda FDC_STATUS_A ; $D082 + bmi @lp2 + + ; Wait for DRQ and EQ flags to go high + +@lp3: + lda FDC_STATUS_A ; $D082 + and #%01100000 + cmp #%01100000 ; XXX is this correct? .A seems to stay at $40 at this point + bne @lp3 ; Copy sector to buffer in RAM - ; XXX + lda #$00 + sta DMAJOB_DST_MB + lda #<(SHARED_BUF_1 - $8000) + sta DMAJOB_DST_ADDR+0 + lda #>(SHARED_BUF_1 - $8000) + sta DMAJOB_DST_ADDR+1 + lda #$01 + sta DMAJOB_DST_ADDR+2 + jsr util_dma_launch_from_hwbuf ; execute DMA job + + clc rts diff --git a/src/dos_m65/dev_floppy/fs_1581_read_dir.s b/src/dos_m65/dev_floppy/fs_1581_read_dir.s new file mode 100644 index 00000000..21ee8306 --- /dev/null +++ b/src/dos_m65/dev_floppy/fs_1581_read_dir.s @@ -0,0 +1,24 @@ + +; +; Hypervisor virtual filesystem - reading directory +; + + +fs_1581_read_dir_open: + + ; Try to read track 40, sector 0 (disk header) + + lda #40 + sta PAR_TRACK + lda #$00 + sta PAR_SECTOR + + jsr dev_fd_util_readsector ; XXX handle read errors + + + + + + ; XXX continue implementation + + jmp dos_EXIT_CLC diff --git a/src/dos_m65/dev_floppy/fs_1581_read_file.s b/src/dos_m65/dev_floppy/fs_1581_read_file.s new file mode 100644 index 00000000..0a3cdaf5 --- /dev/null +++ b/src/dos_m65/dev_floppy/fs_1581_read_file.s @@ -0,0 +1,8 @@ + +; +; Hypervisor virtual filesystem - reading the file +; + + +fs_1581_read_file_open: + diff --git a/src/dos_m65/dev_sdcard/fs_hvsr_read_file.s b/src/dos_m65/dev_sdcard/fs_hvsr_read_file.s index b7bc2daf..cddb95fb 100644 --- a/src/dos_m65/dev_sdcard/fs_hvsr_read_file.s +++ b/src/dos_m65/dev_sdcard/fs_hvsr_read_file.s @@ -1,6 +1,6 @@ ; -; Hypervisor virtual filesystem - opening the file +; Hypervisor virtual filesystem - reading the file ; From 70887cc53ca017ba8c6c63ec63a7bb290d681c72 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Wed, 3 Mar 2021 21:52:57 +0100 Subject: [PATCH 11/32] added some debug code --- .../dev_floppy/dev_fd_util_readsector.s | 43 +++++++++++-------- 1 file changed, 26 insertions(+), 17 deletions(-) diff --git a/src/dos_m65/dev_floppy/dev_fd_util_readsector.s b/src/dos_m65/dev_floppy/dev_fd_util_readsector.s index 72509372..bc837fa1 100644 --- a/src/dos_m65/dev_floppy/dev_fd_util_readsector.s +++ b/src/dos_m65/dev_floppy/dev_fd_util_readsector.s @@ -14,33 +14,42 @@ dev_fd_util_readsector: ; Select physical track and sector based on logical ones from PAR_TRACK and PAR_SECTOR - lda PAR_TRACK - dec - sta FDC_TRACK ; $D084 +; lda PAR_TRACK +; dec +; sta FDC_TRACK ; $D084 - lda PAR_SECTOR - cmp #20 - bcc @side0 +; lda PAR_SECTOR +; cmp #20 +; bcc @side0 @side1: - lda #%00001000 ; set side 1 - tsb FDC_CONTROL ; $D080 +; lda #%00001000 ; set side 1 +; tsb FDC_CONTROL ; $D080 - lda PAR_SECTOR - sec - sbc #20 +; lda PAR_SECTOR +; sec +; sbc #20 - ldx #$01 - +skip_2_bytes_trash_nvz +; ldx #$01 +; +skip_2_bytes_trash_nvz @side0: - ldx #$00 - stx FDC_SIDE ; $D086 - clc - ror +; ldx #$00 +; stx FDC_SIDE ; $D086 +; clc +; ror +; sta FDC_SECTOR ; $D085 + + ; XXX temporary code, just for testing (replacement for the commented-out code) + + lda #39 + sta FDC_TRACK ; $D084 + lda #00 sta FDC_SECTOR ; $D085 + lda #00 + sta FDC_SIDE ; $D086 ; Ask the controller to read the sector XXX how to detect errors, missing disk, etc.? From 52b2686f0e7730251f79589aa3ebd3c8f2d3c01f Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Thu, 4 Mar 2021 18:22:36 +0100 Subject: [PATCH 12/32] CBDOS can now return floppy header --- src/dos_m65/,aliases_dos.s | 82 ++++++++++--------- src/dos_m65/assets/dos_parts_dir.s | 6 +- src/dos_m65/dev_floppy/dev_fd_cmd_open.s | 17 ---- .../dev_floppy/dev_fd_util_readsector.s | 47 +++++------ src/dos_m65/dev_floppy/fs_1581_read_dir.s | 51 +++++++++++- src/dos_m65/msg_acptr.s | 34 ++++++-- 6 files changed, 144 insertions(+), 93 deletions(-) diff --git a/src/dos_m65/,aliases_dos.s b/src/dos_m65/,aliases_dos.s index 7268677e..503f2265 100644 --- a/src/dos_m65/,aliases_dos.s +++ b/src/dos_m65/,aliases_dos.s @@ -109,14 +109,7 @@ !addr FD_STATUS_IDX = $806E ; - floppy !addr RD_STATUS_IDX = $806F ; - ram disk - !addr DMAJOB_LIST = $8070 ; 15 bytes, a general purpose DMA list - !addr DMAJOB_SRC_MB = DMAJOB_LIST+2 - !addr DMAJOB_DST_MB = DMAJOB_LIST+4 - !addr DMAJOB_SIZE = DMAJOB_LIST+7 ; keep $0200 here - !addr DMAJOB_SRC_ADDR = DMAJOB_LIST+9 - !addr DMAJOB_DST_ADDR = DMAJOB_LIST+12 - - !addr SD_DESC = $807F ; current file descriptor + !addr SD_DESC = $8070 ; current file descriptor @@ -129,54 +122,63 @@ ; BAM cache for floppy drives; 2 KB (4 blocks) each, to cover up to ED floppies - XXX implementation to be written - !addr FD_BAM_CACHE_0 = $8A00 ; - floppy drive 0 - !addr FD_BAM_CACHE_1 = $8E00 ; - floppy drive 1 + !addr FD_BAM_CACHE_0 = $8200 ; - floppy drive 0 + !addr FD_BAM_CACHE_1 = $8600 ; - floppy drive 1 ; General purpose buffers, 512 bytes each, each starts at page start - XXX dynamic alllocation to be written - !addr SHARED_BUF_0 = $9200 ; XXX temporarily hardcoded for usage by SD card - !addr SHARED_BUF_1 = $9400 ; XXX temporarily hardcoded for usage by floppy - !addr SHARED_BUF_2 = $9600 - !addr SHARED_BUF_3 = $9800 - !addr SHARED_BUF_4 = $9A00 - !addr SHARED_BUF_5 = $9C00 - !addr SHARED_BUF_6 = $9E00 - !addr SHARED_BUF_7 = $A000 - !addr SHARED_BUF_8 = $A200 - !addr SHARED_BUF_9 = $A400 - !addr SHARED_BUF_A = $A600 - !addr SHARED_BUF_B = $A800 - !addr SHARED_BUF_C = $AA00 - !addr SHARED_BUF_D = $AC00 - !addr SHARED_BUF_E = $AE00 - !addr SHARED_BUF_F = $B000 + !addr SHARED_BUF_0 = $8A00 ; XXX temporarily hardcoded for usage by SD card + !addr SHARED_BUF_1 = $8C00 ; XXX temporarily hardcoded for usage by floppy + !addr SHARED_BUF_2 = $8E00 + !addr SHARED_BUF_3 = $9000 + !addr SHARED_BUF_4 = $9200 + !addr SHARED_BUF_5 = $9400 + !addr SHARED_BUF_6 = $9600 + !addr SHARED_BUF_7 = $9800 + !addr SHARED_BUF_8 = $9A00 + !addr SHARED_BUF_9 = $9C00 + !addr SHARED_BUF_A = $9E00 + !addr SHARED_BUF_B = $A000 + !addr SHARED_BUF_C = $A200 + !addr SHARED_BUF_D = $A400 + !addr SHARED_BUF_E = $A600 + !addr SHARED_BUF_F = $A800 ; Memory shadow, needed for SD card support - !addr SD_MEMSHADOW_BUF = $8200 ; 256 byte buffer for preserving original memory content + !addr SD_MEMSHADOW_BUF = $AA00 ; 256 byte buffer for preserving original memory content ; Command/filename buffers, 128 bytes each - XXX extend to 256 bytes (change implementation) - !addr SD_CMDFN_BUF = $B300 ; - SD card - !addr FD_CMDFN_BUF = $B400 ; - floppy - !addr RD_CMDFN_BUF = $B500 ; - ram disk + !addr SD_CMDFN_BUF = $AB00 ; - SD card + !addr FD_CMDFN_BUF = $AC00 ; - floppy + !addr RD_CMDFN_BUF = $AD00 ; - ram disk ; Directory entry buffers, in BASIC format, $30 bytes each - !addr XX_DIRENT_BUF = $B600 - !addr SD_DIRENT_BUF = $B600 ; - SD card - !addr FD_DIRENT_BUF = $B630 ; - floppy - !addr RD_DIRENT_BUF = $B660 ; - ram disk + !addr XX_DIRENT_BUF = $AE00 + !addr SD_DIRENT_BUF = $AE00 ; - SD card + !addr FD_DIRENT_BUF = $AE30 ; - floppy + !addr RD_DIRENT_BUF = $AE60 ; - ram disk ; Status buffers, content terminated by 0, $30 bytes each - !addr XX_STATUS_BUF = $B690 - !addr SD_STATUS_BUF = $B690 ; - SD card - !addr FD_STATUS_BUF = $B6C0 ; - floppy - !addr RD_STATUS_BUF = $B6F0 ; - ram disk + !addr XX_STATUS_BUF = $AE90 + !addr SD_STATUS_BUF = $AE90 ; - SD card + !addr FD_STATUS_BUF = $AEC0 ; - floppy + !addr RD_STATUS_BUF = $AEF0 ; - ram disk + + ; Common DMA list + + !addr DMAJOB_LIST = $AF20 ; 15 bytes, a general purpose DMA list + !addr DMAJOB_SRC_MB = DMAJOB_LIST+2 + !addr DMAJOB_DST_MB = DMAJOB_LIST+4 + !addr DMAJOB_SIZE = DMAJOB_LIST+7 ; keep $0200 here + !addr DMAJOB_SRC_ADDR = DMAJOB_LIST+9 + !addr DMAJOB_DST_ADDR = DMAJOB_LIST+12 ; - ; Reserved 18 KB for floppy track buffers + some area for track metadata + ; Reserved 20 KB for floppy track buffers + some area for track metadata ; - !addr XX_REMAINING = $B720 + !addr XX_REMAINING = $AF2F diff --git a/src/dos_m65/assets/dos_parts_dir.s b/src/dos_m65/assets/dos_parts_dir.s index 309d3703..d3d46c6a 100644 --- a/src/dos_m65/assets/dos_parts_dir.s +++ b/src/dos_m65/assets/dos_parts_dir.s @@ -9,9 +9,9 @@ dir_hdr: ; 32 bytes - header !byte $01, $01 ; link to the next line - dummy, will be regenerated by BASIC !byte $00, $00 ; line number 0 !byte $12, $22 ; reverse mode, quote - !pet " " ; space for disk/directory name + !pet " " ; space for disk/directory name XXX should be space, or shift+space? !byte $22, $20 ; quote, space - !pet "00 2a" ; default ID, disk format + !pet " 2a" ; default ID, disk format !byte $00 ; end of the line dir_hdr_sd: ; 32 bytes - header @@ -20,7 +20,7 @@ dir_hdr_sd: ; 32 bytes - header !byte $01, $01 ; link to the next line - dummy, will be regenerated by BASIC !byte $00, $00 ; line number 0 !byte $12, $22 ; reverse mode, quote - !pet "sd card " ; space for disk/directory name + !pet "sd card " ; space for disk/directory name XXX should be space, or shift+space? !byte $22, $20 ; quote, space !pet "fat32" ; filesystem !byte $00 ; end of the line diff --git a/src/dos_m65/dev_floppy/dev_fd_cmd_open.s b/src/dos_m65/dev_floppy/dev_fd_cmd_open.s index 72794ff7..9f66198b 100644 --- a/src/dos_m65/dev_floppy/dev_fd_cmd_open.s +++ b/src/dos_m65/dev_floppy/dev_fd_cmd_open.s @@ -58,20 +58,3 @@ dev_fd_cmd_OPEN_dir: @lp1_end: jmp fs_1581_read_dir_open - - - - ; XXX experimental code below - - ; Try to read track 40, sector 0 (disk header) - - lda #40 - sta PAR_TRACK - lda #$00 - sta PAR_SECTOR - - jsr dev_fd_util_readsector - - ; XXX continue implementation - - jmp dos_EXIT_CLC diff --git a/src/dos_m65/dev_floppy/dev_fd_util_readsector.s b/src/dos_m65/dev_floppy/dev_fd_util_readsector.s index bc837fa1..b4292cf7 100644 --- a/src/dos_m65/dev_floppy/dev_fd_util_readsector.s +++ b/src/dos_m65/dev_floppy/dev_fd_util_readsector.s @@ -14,42 +14,35 @@ dev_fd_util_readsector: ; Select physical track and sector based on logical ones from PAR_TRACK and PAR_SECTOR -; lda PAR_TRACK -; dec -; sta FDC_TRACK ; $D084 + lda PAR_TRACK + dec + sta FDC_TRACK ; $D084 -; lda PAR_SECTOR -; cmp #20 -; bcc @side0 + lda PAR_SECTOR + cmp #20 + bcc @side0 @side1: -; lda #%00001000 ; set side 1 -; tsb FDC_CONTROL ; $D080 + lda #%00001000 ; set side 1 + tsb FDC_CONTROL ; $D080 -; lda PAR_SECTOR -; sec -; sbc #20 + lda PAR_SECTOR + sec + sbc #20 -; ldx #$01 -; +skip_2_bytes_trash_nvz + ldx #$01 + +skip_2_bytes_trash_nvz @side0: -; ldx #$00 -; stx FDC_SIDE ; $D086 -; clc -; ror -; sta FDC_SECTOR ; $D085 - - ; XXX temporary code, just for testing (replacement for the commented-out code) - - lda #39 - sta FDC_TRACK ; $D084 - lda #00 + ldx #$00 + stx FDC_SIDE ; $D086 + clc + ror + inc sta FDC_SECTOR ; $D085 - lda #00 - sta FDC_SIDE ; $D086 + ; Ask the controller to read the sector XXX how to detect errors, missing disk, etc.? @@ -73,7 +66,7 @@ dev_fd_util_readsector: @lp3: lda FDC_STATUS_A ; $D082 and #%01100000 - cmp #%01100000 ; XXX is this correct? .A seems to stay at $40 at this point + cmp #%01000000 ; XXX is this correct? .A seems to stay at $40 at this point bne @lp3 ; Copy sector to buffer in RAM diff --git a/src/dos_m65/dev_floppy/fs_1581_read_dir.s b/src/dos_m65/dev_floppy/fs_1581_read_dir.s index 21ee8306..5488777c 100644 --- a/src/dos_m65/dev_floppy/fs_1581_read_dir.s +++ b/src/dos_m65/dev_floppy/fs_1581_read_dir.s @@ -15,10 +15,59 @@ fs_1581_read_dir_open: jsr dev_fd_util_readsector ; XXX handle read errors + ; Create the first directory listing entry (title, id) + ldx #$1F ; first fetch the template +@lp1: + lda dir_hdr,x + sta FD_DIRENT_BUF,x + dex + bpl @lp1 + ldx #$0F ; file name +@lp2: + lda SHARED_BUF_1+$04,x + sta FD_DIRENT_BUF+$08,x + dex + bpl @lp2 + lda SHARED_BUF_1+$16 ; disk ID XXX test this on a disk with ID + cmp #$A0 + beq @skip1 + sta FD_DIRENT_BUF+$1A +@skip1: + lda SHARED_BUF_1+$17 + cmp #$A0 + beq @skip2 + sta FD_DIRENT_BUF+$1B +@skip2: - ; XXX continue implementation + lda SHARED_BUF_1+$19 ; dos version + sta FD_DIRENT_BUF+$1D + lda SHARED_BUF_1+$1A + sta FD_DIRENT_BUF+$1E + + ; Provide pointer to the header + + lda #$20 + sta FD_ACPTR_LEN+0 + lda #$00 + sta FD_ACPTR_LEN+1 + + lda #FD_DIRENT_BUF + sta FD_ACPTR_PTR+1 + + ; Set directory phase to 'file name' + + lda #$01 + sta FD_DIR_PHASE + + ; XXX copy 1st half of BAM + ; XXX preload the next entry + ; XXX copy 2nd half of BAM + + ; End jmp dos_EXIT_CLC diff --git a/src/dos_m65/msg_acptr.s b/src/dos_m65/msg_acptr.s index f1e0dbe2..d22c7884 100644 --- a/src/dos_m65/msg_acptr.s +++ b/src/dos_m65/msg_acptr.s @@ -11,13 +11,13 @@ msg_ACPTR: ; Check if there is a talker active ldx IDX1_TALKER - bmi msg_ACPTR_fail_no_talker + +bmi msg_ACPTR_fail_no_talker ; Check if active channel is status one lda XX_CHANNEL, X cmp #$0F - beq msg_ACPTR_status + +beq msg_ACPTR_status ; XXX add support for read contexts (multiple channels) @@ -26,7 +26,7 @@ msg_ACPTR: ldx IDX2_TALKER lda XX_ACPTR_LEN+0,x ora XX_ACPTR_LEN+1,x - beq msg_ACPTR_fail_no_data + +beq msg_ACPTR_fail_no_data ; Read a byte of data from the buffer @@ -62,11 +62,35 @@ msg_ACPTR_read_SD: @3: jmp dos_EXIT_CLC - msg_ACPTR_read_FD: - ; XXX provide implementation + ; Read and return one byte + jsr FD_ACPTR_helper + sta TBTCNT + sta REG_A + + ; Increment pointer, decrement length + + inc FD_ACPTR_PTR+0 + bne @1 + inc FD_ACPTR_PTR+1 +@1: + dec FD_ACPTR_LEN+0 + lda FD_ACPTR_LEN+0 + cmp #$FF + bne @2 + dec FD_ACPTR_LEN+1 +@2: + ; If new length is 0, try to read next block of data + + ora FD_ACPTR_LEN+1 + bne @3 + jsr dev_fd_cmd_READ + bcc @3 + jsr kernalstatus_EOI +@3: + jmp dos_EXIT_CLC msg_ACPTR_read_RD: From f8c048fab3b23379d7cd305a164b32b5d938edaa Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Thu, 4 Mar 2021 22:16:40 +0100 Subject: [PATCH 13/32] work on floppy directory within CBDOS --- src/dos_m65/,aliases_dos.s | 47 ++++---- src/dos_m65/assets/dos_parts_dir.s | 5 +- src/dos_m65/dev_floppy/dev_fd_cmd_read.s | 10 +- src/dos_m65/dev_floppy/fs_1581_read_dir.s | 125 ++++++++++++++++++++- src/dos_m65/dev_floppy/fs_1581_read_file.s | 9 ++ 5 files changed, 169 insertions(+), 27 deletions(-) diff --git a/src/dos_m65/,aliases_dos.s b/src/dos_m65/,aliases_dos.s index 503f2265..776c4fa8 100644 --- a/src/dos_m65/,aliases_dos.s +++ b/src/dos_m65/,aliases_dos.s @@ -45,7 +45,7 @@ ; Helper subroutines to fetch data !addr code_LDA_nnnn_Y = $8014 ; - LDA nnnn, Y instruction - !addr par_LDA_nnnn_Y = $8015 ; - 2 bytes; address in buffer, ram disk + !addr par_LDA_nnnn_Y = $8015 ; - 2 bytes; address !addr code_RTS_04 = $8017 ; - RTS instruction ; Parameters for utilities/helpers @@ -111,6 +111,8 @@ !addr SD_DESC = $8070 ; current file descriptor + !addr FD_DIRENT = $8071 ; directory entry to read, 0-15 + ; XXX Free space @@ -120,29 +122,32 @@ ; Various buffers, caches, and other large memory chunks ; - ; BAM cache for floppy drives; 2 KB (4 blocks) each, to cover up to ED floppies - XXX implementation to be written - - !addr FD_BAM_CACHE_0 = $8200 ; - floppy drive 0 - !addr FD_BAM_CACHE_1 = $8600 ; - floppy drive 1 ; General purpose buffers, 512 bytes each, each starts at page start - XXX dynamic alllocation to be written - !addr SHARED_BUF_0 = $8A00 ; XXX temporarily hardcoded for usage by SD card - !addr SHARED_BUF_1 = $8C00 ; XXX temporarily hardcoded for usage by floppy - !addr SHARED_BUF_2 = $8E00 - !addr SHARED_BUF_3 = $9000 - !addr SHARED_BUF_4 = $9200 - !addr SHARED_BUF_5 = $9400 - !addr SHARED_BUF_6 = $9600 - !addr SHARED_BUF_7 = $9800 - !addr SHARED_BUF_8 = $9A00 - !addr SHARED_BUF_9 = $9C00 - !addr SHARED_BUF_A = $9E00 - !addr SHARED_BUF_B = $A000 - !addr SHARED_BUF_C = $A200 - !addr SHARED_BUF_D = $A400 - !addr SHARED_BUF_E = $A600 - !addr SHARED_BUF_F = $A800 + !addr SHARED_BUF_0 = $8200 ; XXX temporarily hardcoded for usage by SD card + !addr SHARED_BUF_1 = $8400 ; XXX temporarily hardcoded for usage by floppy + !addr SHARED_BUF_2 = $8600 + !addr SHARED_BUF_3 = $8800 + !addr SHARED_BUF_4 = $8A00 + !addr SHARED_BUF_5 = $8C00 + !addr SHARED_BUF_6 = $8E00 + !addr SHARED_BUF_7 = $9000 + !addr SHARED_BUF_8 = $9200 + !addr SHARED_BUF_9 = $9400 + !addr SHARED_BUF_A = $9600 + !addr SHARED_BUF_B = $9800 + !addr SHARED_BUF_C = $9A00 + !addr SHARED_BUF_D = $9C00 + !addr SHARED_BUF_E = $9E00 + !addr SHARED_BUF_F = $A000 + + ; BAM cache for floppy drives; 2 KB (4 blocks) each, to cover up to ED floppies + + !addr FD_BAM_CACHE_0 = $A200 ; - floppy disk 0 BAM + !addr SHARED_BUF_X0 = $A400 ; - buffer which can be used if disk is not ED + !addr FD_BAM_CACHE_1 = $A600 ; - floppy disk 1 BAM + !addr SHARED_BUF_X1 = $A800 ; - buffer which can be used if disk is not ED ; Memory shadow, needed for SD card support diff --git a/src/dos_m65/assets/dos_parts_dir.s b/src/dos_m65/assets/dos_parts_dir.s index d3d46c6a..0fc6f88c 100644 --- a/src/dos_m65/assets/dos_parts_dir.s +++ b/src/dos_m65/assets/dos_parts_dir.s @@ -9,7 +9,7 @@ dir_hdr: ; 32 bytes - header !byte $01, $01 ; link to the next line - dummy, will be regenerated by BASIC !byte $00, $00 ; line number 0 !byte $12, $22 ; reverse mode, quote - !pet " " ; space for disk/directory name XXX should be space, or shift+space? + !pet " " ; space for disk/directory name !byte $22, $20 ; quote, space !pet " 2a" ; default ID, disk format !byte $00 ; end of the line @@ -20,7 +20,8 @@ dir_hdr_sd: ; 32 bytes - header !byte $01, $01 ; link to the next line - dummy, will be regenerated by BASIC !byte $00, $00 ; line number 0 !byte $12, $22 ; reverse mode, quote - !pet "sd card " ; space for disk/directory name XXX should be space, or shift+space? + !pet "sd card" ; space for disk/directory name + !byte $A0, $A0, $A0, $A0, $A0, $A0, $A0, $A0, $A0 !byte $22, $20 ; quote, space !pet "fat32" ; filesystem !byte $00 ; end of the line diff --git a/src/dos_m65/dev_floppy/dev_fd_cmd_read.s b/src/dos_m65/dev_floppy/dev_fd_cmd_read.s index 1ef268af..aa5eb88b 100644 --- a/src/dos_m65/dev_floppy/dev_fd_cmd_read.s +++ b/src/dos_m65/dev_floppy/dev_fd_cmd_read.s @@ -6,7 +6,15 @@ dev_fd_cmd_READ: - ; XXX provide implementation + lda SD_MODE + cmp #$03 + +beq fs_1581_read_file + + lda SD_DIR_PHASE + cmp #$01 + +beq fs_1581_read_dir + cmp #$02 + +beq fs_1581_read_dir_blocksfree sec ; mark EOI rts diff --git a/src/dos_m65/dev_floppy/fs_1581_read_dir.s b/src/dos_m65/dev_floppy/fs_1581_read_dir.s index 5488777c..807973a7 100644 --- a/src/dos_m65/dev_floppy/fs_1581_read_dir.s +++ b/src/dos_m65/dev_floppy/fs_1581_read_dir.s @@ -64,10 +64,129 @@ fs_1581_read_dir_open: lda #$01 sta FD_DIR_PHASE - ; XXX copy 1st half of BAM - ; XXX preload the next entry - ; XXX copy 2nd half of BAM + ; Copy 1st BAM sector to the cache + + ldx #$00 +@lp3: + lda SHARED_BUF_1+$100, x + sta FD_BAM_CACHE_0,x + inx + bne @lp3 + + ; Load the next pair of sectors + + lda #$02 + sta PAR_SECTOR + + jsr dev_fd_util_readsector ; XXX handle read errors + + ; Copy 2nd BAM sector to the cache + + ldx #$00 +@lp4: + lda SHARED_BUF_1, x + sta FD_BAM_CACHE_0+$100,x + inx + bne @lp4 + + ; Set variables to point to the 1st directory entry in the 2nd sector of the buffer + + lda #$08 + sta FD_DIRENT ; End jmp dos_EXIT_CLC + + +fs_1581_read_dir: + + lda FD_DIRENT + + ; If first entry within sector - make sure it is present within the buffer + + cmp #$08 + beq @get_sector_lo + cmp #$10 + beq @get_sector_hi + + ; FALLTROUGH + +fs_1581_read_dir_cont: + + ; Set address of the RAW directory entry + + lda >SHARED_BUF_1 + sta par_LDA_nnnn_Y+1 + + asl + asl + asl + asl + asl + sta par_LDA_nnnn_Y+0 + + bcc @1 + inc par_LDA_nnnn_Y+1 +@1: + ; Set next directory entry + + inc FD_DIRENT + + ; Copy data to parameter variables + + ; XXX most likely copying is not necessary (compare all CBM and CMD filesystems) - + ; XXX just make the hypervisor file system emulate these structures + + ldy #$02 ; start from determining file type + jsr code_LDA_nnnn_Y + + tax + and #%00111111 ; for checking, filter out special bits + beq fs_1581_read_dir ; ignore deleted files + cmp #$06 + bcs fs_1581_read_dir ; ignore unknown file types + + stx PAR_FTYPE + + ldy #$1E ; now get file size in blocks + jsr code_LDA_nnnn_Y + sta PAR_FSIZE_BLOCKS+0 + iny + jsr code_LDA_nnnn_Y + sta PAR_FSIZE_BLOCKS+0 + + ldy #$05 ; copy the file name +@lp1: + jsr code_LDA_nnnn_Y + sta PAR_FNAME-5 + iny + cpy #$15 + bne @lp1 + + ; + + ; XXX + +@get_sector_lo: + + ; XXX + + +@get_sector_hi: + + ; XXX + + + + + ; XXX provide implementation + + jmp dos_EXIT_SEC + + +fs_1581_read_dir_blocksfree: + + ; XXX provide implementation + + jmp dos_EXIT_SEC diff --git a/src/dos_m65/dev_floppy/fs_1581_read_file.s b/src/dos_m65/dev_floppy/fs_1581_read_file.s index 0a3cdaf5..49998c2b 100644 --- a/src/dos_m65/dev_floppy/fs_1581_read_file.s +++ b/src/dos_m65/dev_floppy/fs_1581_read_file.s @@ -6,3 +6,12 @@ fs_1581_read_file_open: + ; XXX provide implementation + + jmp dos_EXIT_SEC + +fs_1581_read_file: + + ; XXX provide implementation + + jmp dos_EXIT_SEC From 57bdda7eb502506b1da5d9e6402a07da9b67ba5d Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Fri, 5 Mar 2021 19:15:41 +0100 Subject: [PATCH 14/32] floppy directory display starts working --- src/dos_m65/dev_floppy/dev_fd_cmd_read.s | 4 +- .../dev_floppy/dev_fd_util_readsector.s | 3 +- src/dos_m65/dev_floppy/fs_1581_read_dir.s | 65 +++++++--- src/dos_m65/dev_sdcard/fs_hvsr_read_dir.s | 115 +---------------- src/dos_m65/utils/util_dir_basic.s | 117 ++++++++++++++++++ 5 files changed, 173 insertions(+), 131 deletions(-) create mode 100644 src/dos_m65/utils/util_dir_basic.s diff --git a/src/dos_m65/dev_floppy/dev_fd_cmd_read.s b/src/dos_m65/dev_floppy/dev_fd_cmd_read.s index aa5eb88b..6a4f76f7 100644 --- a/src/dos_m65/dev_floppy/dev_fd_cmd_read.s +++ b/src/dos_m65/dev_floppy/dev_fd_cmd_read.s @@ -6,11 +6,11 @@ dev_fd_cmd_READ: - lda SD_MODE + lda FD_MODE cmp #$03 +beq fs_1581_read_file - lda SD_DIR_PHASE + lda FD_DIR_PHASE cmp #$01 +beq fs_1581_read_dir cmp #$02 diff --git a/src/dos_m65/dev_floppy/dev_fd_util_readsector.s b/src/dos_m65/dev_floppy/dev_fd_util_readsector.s index b4292cf7..d9fb7247 100644 --- a/src/dos_m65/dev_floppy/dev_fd_util_readsector.s +++ b/src/dos_m65/dev_floppy/dev_fd_util_readsector.s @@ -43,7 +43,6 @@ dev_fd_util_readsector: inc sta FDC_SECTOR ; $D085 - ; Ask the controller to read the sector XXX how to detect errors, missing disk, etc.? lda #$40 @@ -66,7 +65,7 @@ dev_fd_util_readsector: @lp3: lda FDC_STATUS_A ; $D082 and #%01100000 - cmp #%01000000 ; XXX is this correct? .A seems to stay at $40 at this point + cmp #%01000000 ; XXX is this correct? .A seems to stay at $40 at this point bne @lp3 ; Copy sector to buffer in RAM diff --git a/src/dos_m65/dev_floppy/fs_1581_read_dir.s b/src/dos_m65/dev_floppy/fs_1581_read_dir.s index 807973a7..a9f23b88 100644 --- a/src/dos_m65/dev_floppy/fs_1581_read_dir.s +++ b/src/dos_m65/dev_floppy/fs_1581_read_dir.s @@ -112,12 +112,12 @@ fs_1581_read_dir: ; FALLTROUGH -fs_1581_read_dir_cont: +@cont: ; Set address of the RAW directory entry - lda >SHARED_BUF_1 - sta par_LDA_nnnn_Y+1 + ldy #>SHARED_BUF_1 + sty par_LDA_nnnn_Y+1 asl asl @@ -154,39 +154,70 @@ fs_1581_read_dir_cont: sta PAR_FSIZE_BLOCKS+0 iny jsr code_LDA_nnnn_Y - sta PAR_FSIZE_BLOCKS+0 + sta PAR_FSIZE_BLOCKS+1 ldy #$05 ; copy the file name @lp1: jsr code_LDA_nnnn_Y - sta PAR_FNAME-5 + sta PAR_FNAME-5,y iny cpy #$15 bne @lp1 - ; + ; Prepare output entry, starting from XX_DIRENT_BUF + initial offset - ; XXX + jsr util_dir_filesize_blocks + ldx #(FD_DIRENT_BUF - XX_DIRENT_BUF) + ldx #$30 + jsr util_dir_basic + + ; Provide pointers and length + + sta FD_ACPTR_LEN+1 + txa + sec + sbc #$30 + sta FD_ACPTR_LEN+0 + + lda #<(FD_DIRENT_BUF) + sta FD_ACPTR_PTR+0 + lda #>(FD_DIRENT_BUF) + sta FD_ACPTR_PTR+1 + clc + rts @get_sector_lo: - ; XXX + ; XXX provide implementation + lda FD_DIRENT + bra @cont @get_sector_hi: - ; XXX - - - - ; XXX provide implementation - jmp dos_EXIT_SEC - fs_1581_read_dir_blocksfree: - ; XXX provide implementation + ; XXX calculate free blocks from BAM instead - jmp dos_EXIT_SEC + ; Set pointer to 'BLOCKS FREE.' line + + lda #$13 + sta FD_ACPTR_LEN+0 + lda #$00 + sta FD_ACPTR_LEN+1 + + lda #dir_end + sta FD_ACPTR_PTR+1 + + ; Mark end of directory + + lda #$00 + sta FD_DIR_PHASE + + clc + rts diff --git a/src/dos_m65/dev_sdcard/fs_hvsr_read_dir.s b/src/dos_m65/dev_sdcard/fs_hvsr_read_dir.s index fdcbaaa8..3b80ad80 100644 --- a/src/dos_m65/dev_sdcard/fs_hvsr_read_dir.s +++ b/src/dos_m65/dev_sdcard/fs_hvsr_read_dir.s @@ -68,120 +68,17 @@ fs_hvsr_read_dir: ; Prepare output entry, starting from XX_DIRENT_BUF + initial offset - ldx #$00 ; offset for SD card unit + ldx #(SD_DIRENT_BUF - XX_DIRENT_BUF) + jsr util_dir_basic - lda #$01 ; link to the next line - dummy, will be regenerated by BASIC - sta XX_DIRENT_BUF, x - inx - sta XX_DIRENT_BUF, x - inx - - lda PAR_FSIZE_BLOCKS+0 ; store number of blocks - sta XX_DIRENT_BUF, x - inx - lda PAR_FSIZE_BLOCKS+1 - sta XX_DIRENT_BUF, x - inx - - lda #' ' ; indent file name - -@lp1: - dey - bmi @lp1_done - sta XX_DIRENT_BUF, x - inx - bra @lp1 - -@lp1_done: - - lda #$22 ; opening quote - sta XX_DIRENT_BUF, x - inx - - ldy #$FF ; put file name - -@lp2: - - iny - lda PAR_FNAME, y - cmp #$A0 - beq @lp2_done - cpy #$10 - beq @lp2_done - sta XX_DIRENT_BUF, x - inx - bra @lp2 - -@lp2_done: - - lda #$22 ; closing quote - sta XX_DIRENT_BUF, x - inx - - ldy #$10 ; put spaces for indentation - -@lp3: - - dey - lda PAR_FNAME, y - cmp #$A0 - bne @lp3_done - - lda #' ' - sta XX_DIRENT_BUF, x - inx - bra @lp3 - -@lp3_done: - - lda PAR_FTYPE ; put 'damaged' mark if needed - bmi @closed - lda #'*' - +skip_2_bytes_trash_nvz - -@closed: - - lda #' ' - sta XX_DIRENT_BUF, x - inx - - lda PAR_FTYPE ; put file type - and #$3F - dec - asl - asl - tay - -@lp4: - - lda dir_types, y - beq @lp4_done - sta XX_DIRENT_BUF, x - inx - iny - bra @lp4 - -@lp4_done: - - lda PAR_FTYPE ; read-only mark (if needed) - and #$40 - beq @skipro - lda #'<' - sta XX_DIRENT_BUF, x - inx - -@skipro: - - lda #$00 ; put end of the line - sta XX_DIRENT_BUF, x - inx + ; Provide pointers and length stx SD_ACPTR_LEN+0 sta SD_ACPTR_LEN+1 - lda #<(XX_DIRENT_BUF) + lda #<(SD_DIRENT_BUF) sta SD_ACPTR_PTR+0 - lda #>(XX_DIRENT_BUF) + lda #>(SD_DIRENT_BUF) sta SD_ACPTR_PTR+1 clc @@ -191,8 +88,6 @@ fs_hvsr_read_dir_blocksfree: ; Set pointer to 'BLOCKS FREE.' line - ; XXX determine free space - lda #$13 sta SD_ACPTR_LEN+0 lda #$00 diff --git a/src/dos_m65/utils/util_dir_basic.s b/src/dos_m65/utils/util_dir_basic.s new file mode 100644 index 00000000..c01a9d7e --- /dev/null +++ b/src/dos_m65/utils/util_dir_basic.s @@ -0,0 +1,117 @@ + +; Create BASIC line from directory entry + + +; in: .X = offset from XX_DIRENT_BUF, .Y = characters to indent after line number +; out: .X (low byte) = current position, .A = 0 + + +util_dir_basic: + + lda #$01 ; link to the next line - dummy, will be regenerated by BASIC + sta XX_DIRENT_BUF, x + inx + sta XX_DIRENT_BUF, x + inx + + lda PAR_FSIZE_BLOCKS+0 ; store number of blocks + sta XX_DIRENT_BUF, x + inx + lda PAR_FSIZE_BLOCKS+1 + sta XX_DIRENT_BUF, x + inx + + lda #' ' ; indent file name + +@lp1: + dey + bmi @lp1_done + sta XX_DIRENT_BUF, x + inx + bra @lp1 + +@lp1_done: + + lda #$22 ; opening quote + sta XX_DIRENT_BUF, x + inx + + ldy #$FF ; put file name + +@lp2: + + iny + lda PAR_FNAME, y + cmp #$A0 + beq @lp2_done + cpy #$10 + beq @lp2_done + sta XX_DIRENT_BUF, x + inx + bra @lp2 + +@lp2_done: + + lda #$22 ; closing quote + sta XX_DIRENT_BUF, x + inx + + ldy #$10 ; put spaces for indentation + +@lp3: + + dey + lda PAR_FNAME, y + cmp #$A0 + bne @lp3_done + + lda #' ' + sta XX_DIRENT_BUF, x + inx + bra @lp3 + +@lp3_done: + + lda PAR_FTYPE ; put 'damaged' mark if needed + bmi @closed + lda #'*' + +skip_2_bytes_trash_nvz + +@closed: + + lda #' ' + sta XX_DIRENT_BUF, x + inx + + lda PAR_FTYPE ; put file type + and #$3F + dec + asl + asl + tay + +@lp4: + + lda dir_types, y + beq @lp4_done + sta XX_DIRENT_BUF, x + inx + iny + bra @lp4 + +@lp4_done: + + lda PAR_FTYPE ; read-only mark (if needed) + and #$40 + beq @skipro + lda #'<' + sta XX_DIRENT_BUF, x + inx + +@skipro: + + lda #$00 ; put end of the line + sta XX_DIRENT_BUF, x + inx + + rts From 02588f4952075b9352fde9f3b850b06fc767934c Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Fri, 5 Mar 2021 21:44:55 +0100 Subject: [PATCH 15/32] nearly complete floppy directory display --- src/dos_m65/,aliases_dos.s | 19 ++++-- .../dev_floppy/dev_fd_util_readsector.s | 10 +++ src/dos_m65/dev_floppy/fs_1581_read_dir.s | 68 +++++++++++++++++-- 3 files changed, 87 insertions(+), 10 deletions(-) diff --git a/src/dos_m65/,aliases_dos.s b/src/dos_m65/,aliases_dos.s index 776c4fa8..2bb91aeb 100644 --- a/src/dos_m65/,aliases_dos.s +++ b/src/dos_m65/,aliases_dos.s @@ -109,12 +109,12 @@ !addr FD_STATUS_IDX = $806E ; - floppy !addr RD_STATUS_IDX = $806F ; - ram disk + ; Various, most likely to be reworked + !addr SD_DESC = $8070 ; current file descriptor - !addr FD_DIRENT = $8071 ; directory entry to read, 0-15 - ; XXX Free space @@ -173,9 +173,16 @@ !addr FD_STATUS_BUF = $AEC0 ; - floppy !addr RD_STATUS_BUF = $AEF0 ; - ram disk - ; Common DMA list + ; Shared buffer metadata tables, 18 bytes each - !addr DMAJOB_LIST = $AF20 ; 15 bytes, a general purpose DMA list + !addr BUFTAB_UNIT = $AF20 ; which unit the buffer is assigned to + !addr BUFTAB_DEV = $AF32 ; which device within the unit + !addr BUFTAB_TRACK = $AF44 ; which track (or other kind of handle) + !addr BUFTAB_SECTOR = $AF56 ; which sector is stored in the first half of the buffer + + ; Common DMA list, 15 bytes + + !addr DMAJOB_LIST = $AF68 !addr DMAJOB_SRC_MB = DMAJOB_LIST+2 !addr DMAJOB_DST_MB = DMAJOB_LIST+4 !addr DMAJOB_SIZE = DMAJOB_LIST+7 ; keep $0200 here @@ -183,7 +190,7 @@ !addr DMAJOB_DST_ADDR = DMAJOB_LIST+12 ; - ; Reserved 20 KB for floppy track buffers + some area for track metadata + ; Reserved 20 KB for floppy track buffers + some area still free ; - !addr XX_REMAINING = $AF2F + !addr XX_REMAINING = $AF87 diff --git a/src/dos_m65/dev_floppy/dev_fd_util_readsector.s b/src/dos_m65/dev_floppy/dev_fd_util_readsector.s index d9fb7247..bf020b28 100644 --- a/src/dos_m65/dev_floppy/dev_fd_util_readsector.s +++ b/src/dos_m65/dev_floppy/dev_fd_util_readsector.s @@ -81,5 +81,15 @@ dev_fd_util_readsector: jsr util_dma_launch_from_hwbuf ; execute DMA job + ; Fill-in metadata for buffer #1 + + lda #$00 + sta BUFTAB_DEV+1 + lda PAR_TRACK + sta BUFTAB_TRACK+1 + lda PAR_SECTOR + and #%11111110 + sta BUFTAB_SECTOR+1 + clc rts diff --git a/src/dos_m65/dev_floppy/fs_1581_read_dir.s b/src/dos_m65/dev_floppy/fs_1581_read_dir.s index a9f23b88..474bd196 100644 --- a/src/dos_m65/dev_floppy/fs_1581_read_dir.s +++ b/src/dos_m65/dev_floppy/fs_1581_read_dir.s @@ -94,6 +94,13 @@ fs_1581_read_dir_open: lda #$08 sta FD_DIRENT + ; Make sure the 1st sector in buffer points to 2nd one + + lda #40 + sta SHARED_BUF_1+0 + lda #03 + sta SHARED_BUF_1+1 + ; End jmp dos_EXIT_CLC @@ -108,7 +115,7 @@ fs_1581_read_dir: cmp #$08 beq @get_sector_lo cmp #$10 - beq @get_sector_hi + +beq @get_sector_hi ; FALLTROUGH @@ -188,15 +195,68 @@ fs_1581_read_dir: @get_sector_lo: - ; XXX provide implementation + ; Check if this was the last sector + + lda SHARED_BUF_1+0 + beq fs_1581_read_dir_blocksfree + lda SHARED_BUF_1+1 + cmp #$FF + beq fs_1581_read_dir_blocksfree + + ; Transition from 1st half of the buffer, to (possibly) the second one + + lda SHARED_BUF_1+0 + cmp BUFTAB_TRACK+1 + bne @get_sector_lo_next + + lda SHARED_BUF_1+1 + dec + cmp BUFTAB_SECTOR+1 + bne @get_sector_lo_next + + ; It's OK, we can transition to the upper half of the buffer lda FD_DIRENT - bra @cont + jmp @cont + +@get_sector_lo_next: + + lda SHARED_BUF_1+0 + sta PAR_TRACK + lda SHARED_BUF_1+1 + sta PAR_SECTOR + bra @get_sector_common @get_sector_hi: - ; XXX provide implementation + ; Check if this was the last sector + lda SHARED_BUF_1+$100+0 + beq fs_1581_read_dir_blocksfree + lda SHARED_BUF_1+$100+1 + cmp #$FF + beq fs_1581_read_dir_blocksfree + + ; Load new sector + + lda SHARED_BUF_1+$100+0 + sta PAR_TRACK + lda SHARED_BUF_1+$100+1 + sta PAR_SECTOR + +@get_sector_common: + + jsr dev_fd_util_readsector ; XXX handle read errors + + ; Set new FD_DIRENT + + lda PAR_SECTOR + and #$01 + beq @2 + lda #$08 +@2: + sta FD_DIRENT + jmp @cont fs_1581_read_dir_blocksfree: From 04dfd8e40567a0e75b0bbbd39f6e39f45fbb9034 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Fri, 5 Mar 2021 21:58:20 +0100 Subject: [PATCH 16/32] floppy directory display only misses proper blocks free now --- src/dos_m65/assets/dos_parts_dir.s | 9 +++++---- src/dos_m65/dev_floppy/fs_1581_read_dir.s | 2 +- src/dos_m65/dev_sdcard/fs_hvsr_util_nextdirentry.s | 3 +-- src/dos_m65/utils/util_dir_basic.s | 1 - 4 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/dos_m65/assets/dos_parts_dir.s b/src/dos_m65/assets/dos_parts_dir.s index 0fc6f88c..deca85a0 100644 --- a/src/dos_m65/assets/dos_parts_dir.s +++ b/src/dos_m65/assets/dos_parts_dir.s @@ -37,10 +37,11 @@ dir_end: ; 19 bytes dir_types: - !pet "seq", $00 ; SEQ - !pet "prg", $00 ; PRG - !pet "usr", $00 ; USR - !pet "rel", $00 ; REL + !pet "del", $00 ; deleted file + !pet "seq", $00 ; sequential file + !pet "prg", $00 ; program (executable) + !pet "usr", $00 ; user type + !pet "rel", $00 ; random access file !pet "cbm", $00 ; CBM-style partition !pet "dir", $00 ; directory diff --git a/src/dos_m65/dev_floppy/fs_1581_read_dir.s b/src/dos_m65/dev_floppy/fs_1581_read_dir.s index 474bd196..05bad9f0 100644 --- a/src/dos_m65/dev_floppy/fs_1581_read_dir.s +++ b/src/dos_m65/dev_floppy/fs_1581_read_dir.s @@ -147,10 +147,10 @@ fs_1581_read_dir: ldy #$02 ; start from determining file type jsr code_LDA_nnnn_Y + beq fs_1581_read_dir ; ignore deleted files (but allow DEL files in some cases) tax and #%00111111 ; for checking, filter out special bits - beq fs_1581_read_dir ; ignore deleted files cmp #$06 bcs fs_1581_read_dir ; ignore unknown file types diff --git a/src/dos_m65/dev_sdcard/fs_hvsr_util_nextdirentry.s b/src/dos_m65/dev_sdcard/fs_hvsr_util_nextdirentry.s index 4aeef26c..f644b02d 100644 --- a/src/dos_m65/dev_sdcard/fs_hvsr_util_nextdirentry.s +++ b/src/dos_m65/dev_sdcard/fs_hvsr_util_nextdirentry.s @@ -169,7 +169,7 @@ fs_hvsr_util_nextdirentry: @lpext_found: - cpy #$14 + cpy #$18 +beq fs_hvsr_util_nextdirentry ; file extension 'DIR' does not mean this is a directory tya @@ -177,7 +177,6 @@ fs_hvsr_util_nextdirentry: ror clc ror - inc cmp #$07 ; mark some file types (not SEQ/PRG/USR/REL/CBM/DIR) as read-only bcc @detect_attributes diff --git a/src/dos_m65/utils/util_dir_basic.s b/src/dos_m65/utils/util_dir_basic.s index c01a9d7e..45dc5465 100644 --- a/src/dos_m65/utils/util_dir_basic.s +++ b/src/dos_m65/utils/util_dir_basic.s @@ -85,7 +85,6 @@ util_dir_basic: lda PAR_FTYPE ; put file type and #$3F - dec asl asl tay From 6f54a3f22549572c736c5a19927e989829e6e17e Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Fri, 5 Mar 2021 22:23:00 +0100 Subject: [PATCH 17/32] floppy directory display is now complete --- src/dos_m65/dev_floppy/fs_1581_read_dir.s | 50 +++++++++++++++++++++-- 1 file changed, 46 insertions(+), 4 deletions(-) diff --git a/src/dos_m65/dev_floppy/fs_1581_read_dir.s b/src/dos_m65/dev_floppy/fs_1581_read_dir.s index 05bad9f0..c1023604 100644 --- a/src/dos_m65/dev_floppy/fs_1581_read_dir.s +++ b/src/dos_m65/dev_floppy/fs_1581_read_dir.s @@ -260,18 +260,47 @@ fs_1581_read_dir: fs_1581_read_dir_blocksfree: - ; XXX calculate free blocks from BAM instead + ; Copy the 'BLOCKS FREE' line - ; Set pointer to 'BLOCKS FREE.' line + ldx #$13 +@lp1: + lda dir_end, x + sta FD_DIRENT_BUF, x + dex + bpl @lp1 + + ; Calculate free blocks from the BAM + + ldx #$10 +@lp2: + lda FD_BAM_CACHE_0+$100,x + jsr @sub_free_add + cpx #$FA + beq @lp2_end + lda FD_BAM_CACHE_0+$000,x + jsr @sub_free_add + inx + inx + inx + inx + inx + inx + bra @lp2 + +@lp2_end: + + + + ; Set pointer and length lda #$13 sta FD_ACPTR_LEN+0 lda #$00 sta FD_ACPTR_LEN+1 - lda #dir_end + lda #>FD_DIRENT_BUF sta FD_ACPTR_PTR+1 ; Mark end of directory @@ -281,3 +310,16 @@ fs_1581_read_dir_blocksfree: clc rts + + +@sub_free_add: + + ; Helper routine to calculate free blocks + + clc + adc FD_DIRENT_BUF+2 + sta FD_DIRENT_BUF+2 + bcc @noinc + inc FD_DIRENT_BUF+3 +@noinc: + rts From 659330c9f18ab821d1db5bde5f1171e528c2c1b4 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Fri, 5 Mar 2021 22:37:14 +0100 Subject: [PATCH 18/32] updated MEGA65 binaries --- bin/mega65.rom | Bin 131072 -> 131072 bytes bin/mega65_orfont.rom | Bin 131072 -> 131072 bytes src/dos_m65/dev_floppy/fs_1581_read_dir.s | 2 -- 3 files changed, 2 deletions(-) diff --git a/bin/mega65.rom b/bin/mega65.rom index 01106fb7f4211b9db9eeff572cdf737a1eb5bc98..d31d6a97b3f6508781d843ae33a3e13fcddb0127 100644 GIT binary patch delta 6630 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 GcmE&u5wrjR delta 5780 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 diff --git a/bin/mega65_orfont.rom b/bin/mega65_orfont.rom index 8249e7c525a870752f0834464bce7c11aa23211d..a3c548c25463aeefb9f5ae3b601dc564c208ad0a 100644 GIT binary patch delta 6630 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 GcmE&u5wrjR delta 5780 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 diff --git a/src/dos_m65/dev_floppy/fs_1581_read_dir.s b/src/dos_m65/dev_floppy/fs_1581_read_dir.s index c1023604..4916aef6 100644 --- a/src/dos_m65/dev_floppy/fs_1581_read_dir.s +++ b/src/dos_m65/dev_floppy/fs_1581_read_dir.s @@ -289,8 +289,6 @@ fs_1581_read_dir_blocksfree: @lp2_end: - - ; Set pointer and length lda #$13 From 4234591508eada7cf2ca8c2298ac20266f92df6e Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sat, 6 Mar 2021 20:57:56 +0100 Subject: [PATCH 19/32] CBDOS refactoring --- Makefile | 10 ++++-- src/dos_m65/dev_floppy/fs_1581_read_file.s | 17 ---------- src/dos_m65/dos_init.s | 6 ++-- src/dos_m65/dos_vectab_dev.s | 18 ---------- src/dos_m65/dos_vectab_unit.s | 18 ++++++++++ .../filesystem_cbm/fs_cbm_nextdirentry.s | 13 +++++++ .../fs_cbm_read_dir.s} | 26 +++++++------- src/dos_m65/filesystem_cbm/fs_cbm_read_file.s | 31 +++++++++++++++++ .../fs_vfs_nextdirentry.s} | 34 +++++++++---------- .../fs_vfs_read_dir.s} | 20 +++++------ .../fs_vfs_read_file.s} | 32 ++++++++--------- .../lowlevel_readsector.s} | 4 +-- src/dos_m65/{ => pseudoiec}/msg_acptr.s | 4 +-- src/dos_m65/{ => pseudoiec}/msg_ciout.s | 6 ++-- src/dos_m65/{ => pseudoiec}/msg_listen.s | 0 src/dos_m65/{ => pseudoiec}/msg_second.s | 0 src/dos_m65/{ => pseudoiec}/msg_talk.s | 0 src/dos_m65/{ => pseudoiec}/msg_tksa.s | 0 src/dos_m65/{ => pseudoiec}/msg_unlsn_untlk.s | 0 .../unit_fd_cmd_close.s} | 2 +- .../unit_fd_cmd_open.s} | 12 +++---- .../unit_fd_cmd_read.s} | 8 ++--- .../unit_fd_init.s} | 2 +- .../unit_rd_cmd_close.s} | 2 +- .../unit_rd_cmd_open.s} | 4 +-- .../unit_rd_cmd_read.s} | 2 +- .../unit_rd_init.s} | 2 +- .../unit_sd_cmd_close.s} | 2 +- .../unit_sd_cmd_open.s} | 14 ++++---- .../unit_sd_cmd_read.s} | 8 ++--- .../unit_sd_init.s} | 2 +- 31 files changed, 164 insertions(+), 135 deletions(-) delete mode 100644 src/dos_m65/dev_floppy/fs_1581_read_file.s delete mode 100644 src/dos_m65/dos_vectab_dev.s create mode 100644 src/dos_m65/dos_vectab_unit.s create mode 100644 src/dos_m65/filesystem_cbm/fs_cbm_nextdirentry.s rename src/dos_m65/{dev_floppy/fs_1581_read_dir.s => filesystem_cbm/fs_cbm_read_dir.s} (89%) create mode 100644 src/dos_m65/filesystem_cbm/fs_cbm_read_file.s rename src/dos_m65/{dev_sdcard/fs_hvsr_util_nextdirentry.s => filesystem_vfs/fs_vfs_nextdirentry.s} (79%) rename src/dos_m65/{dev_sdcard/fs_hvsr_read_dir.s => filesystem_vfs/fs_vfs_read_dir.s} (83%) rename src/dos_m65/{dev_sdcard/fs_hvsr_read_file.s => filesystem_vfs/fs_vfs_read_file.s} (70%) rename src/dos_m65/{dev_floppy/dev_fd_util_readsector.s => lowlevel/lowlevel_readsector.s} (95%) rename src/dos_m65/{ => pseudoiec}/msg_acptr.s (98%) rename src/dos_m65/{ => pseudoiec}/msg_ciout.s (87%) rename src/dos_m65/{ => pseudoiec}/msg_listen.s (100%) rename src/dos_m65/{ => pseudoiec}/msg_second.s (100%) rename src/dos_m65/{ => pseudoiec}/msg_talk.s (100%) rename src/dos_m65/{ => pseudoiec}/msg_tksa.s (100%) rename src/dos_m65/{ => pseudoiec}/msg_unlsn_untlk.s (100%) rename src/dos_m65/{dev_floppy/dev_fd_cmd_close.s => unit_floppy/unit_fd_cmd_close.s} (82%) rename src/dos_m65/{dev_floppy/dev_fd_cmd_open.s => unit_floppy/unit_fd_cmd_open.s} (84%) rename src/dos_m65/{dev_floppy/dev_fd_cmd_read.s => unit_floppy/unit_fd_cmd_read.s} (56%) rename src/dos_m65/{dev_floppy/dev_fd_init.s => unit_floppy/unit_fd_init.s} (95%) rename src/dos_m65/{dev_ramdisk/dev_rd_cmd_close.s => unit_ramdisk/unit_rd_cmd_close.s} (82%) rename src/dos_m65/{dev_ramdisk/dev_rd_cmd_open.s => unit_ramdisk/unit_rd_cmd_open.s} (76%) rename src/dos_m65/{dev_ramdisk/dev_rd_cmd_read.s => unit_ramdisk/unit_rd_cmd_read.s} (83%) rename src/dos_m65/{dev_ramdisk/dev_rd_init.s => unit_ramdisk/unit_rd_init.s} (95%) rename src/dos_m65/{dev_sdcard/dev_sd_cmd_close.s => unit_sdcard/unit_sd_cmd_close.s} (82%) rename src/dos_m65/{dev_sdcard/dev_sd_cmd_open.s => unit_sdcard/unit_sd_cmd_open.s} (84%) rename src/dos_m65/{dev_sdcard/dev_sd_cmd_read.s => unit_sdcard/unit_sd_cmd_read.s} (56%) rename src/dos_m65/{dev_sdcard/dev_sd_init.s => unit_sdcard/unit_sd_init.s} (97%) diff --git a/Makefile b/Makefile index bea33050..572a2fd0 100644 --- a/Makefile +++ b/Makefile @@ -63,9 +63,13 @@ SRCDIR_KERNAL = $(SRCDIR_COMMON) \ SRCDIR_DOS_M65 = $(SRCDIR_COMMON) \ src/dos_m65 \ src/dos_m65/assets \ - src/dos_m65/dev_floppy \ - src/dos_m65/dev_ramdisk \ - src/dos_m65/dev_sdcard \ + src/dos_m65/filesystem_cbm \ + src/dos_m65/filesystem_vfs \ + src/dos_m65/lowlevel \ + src/dos_m65/pseudoiec \ + src/dos_m65/unit_floppy \ + src/dos_m65/unit_ramdisk \ + src/dos_m65/unit_sdcard \ src/dos_m65/utils SRCDIR_MON_M65 = $(SRCDIR_COMMON) \ diff --git a/src/dos_m65/dev_floppy/fs_1581_read_file.s b/src/dos_m65/dev_floppy/fs_1581_read_file.s deleted file mode 100644 index 49998c2b..00000000 --- a/src/dos_m65/dev_floppy/fs_1581_read_file.s +++ /dev/null @@ -1,17 +0,0 @@ - -; -; Hypervisor virtual filesystem - reading the file -; - - -fs_1581_read_file_open: - - ; XXX provide implementation - - jmp dos_EXIT_SEC - -fs_1581_read_file: - - ; XXX provide implementation - - jmp dos_EXIT_SEC diff --git a/src/dos_m65/dos_init.s b/src/dos_m65/dos_init.s index 1b1c8911..85b48e5c 100644 --- a/src/dos_m65/dos_init.s +++ b/src/dos_m65/dos_init.s @@ -41,9 +41,9 @@ dos_INIT: ; Initialize device handlers - jsr dev_sd_init - jsr dev_fd_init - jsr dev_rd_init + jsr unit_sd_init + jsr unit_fd_init + jsr unit_rd_init ; Initialize DMA list diff --git a/src/dos_m65/dos_vectab_dev.s b/src/dos_m65/dos_vectab_dev.s deleted file mode 100644 index d11f837c..00000000 --- a/src/dos_m65/dos_vectab_dev.s +++ /dev/null @@ -1,18 +0,0 @@ - -; -; Vector tables to device-specific routines -; - - -dos_cmd_OPEN_vectab: - - !word dev_sd_cmd_OPEN - !word dev_fd_cmd_OPEN - !word dev_rd_cmd_OPEN - - -dos_cmd_CLOSE_vectab: - - !word dev_sd_cmd_CLOSE - !word dev_fd_cmd_CLOSE - !word dev_rd_cmd_CLOSE diff --git a/src/dos_m65/dos_vectab_unit.s b/src/dos_m65/dos_vectab_unit.s new file mode 100644 index 00000000..ee5bce48 --- /dev/null +++ b/src/dos_m65/dos_vectab_unit.s @@ -0,0 +1,18 @@ + +; +; Vector tables to device-specific routines +; + + +dos_cmd_OPEN_vectab: + + !word unit_sd_cmd_OPEN + !word unit_fd_cmd_OPEN + !word unit_rd_cmd_OPEN + + +dos_cmd_CLOSE_vectab: + + !word unit_sd_cmd_CLOSE + !word unit_fd_cmd_CLOSE + !word unit_rd_cmd_CLOSE diff --git a/src/dos_m65/filesystem_cbm/fs_cbm_nextdirentry.s b/src/dos_m65/filesystem_cbm/fs_cbm_nextdirentry.s new file mode 100644 index 00000000..2b06f078 --- /dev/null +++ b/src/dos_m65/filesystem_cbm/fs_cbm_nextdirentry.s @@ -0,0 +1,13 @@ + +; +; CBM/CMD filesystem - helper routine to get the next directory entry +; + + +; Fills-in: PAR_FNAME, PAR_FTYPE, PAR_FSIZE_BYTES + + + +; XXX work-in-progress, this should be used within directory reading code + +fs_cbm_nextdirentry: \ No newline at end of file diff --git a/src/dos_m65/dev_floppy/fs_1581_read_dir.s b/src/dos_m65/filesystem_cbm/fs_cbm_read_dir.s similarity index 89% rename from src/dos_m65/dev_floppy/fs_1581_read_dir.s rename to src/dos_m65/filesystem_cbm/fs_cbm_read_dir.s index 4916aef6..b14728c4 100644 --- a/src/dos_m65/dev_floppy/fs_1581_read_dir.s +++ b/src/dos_m65/filesystem_cbm/fs_cbm_read_dir.s @@ -1,10 +1,10 @@ ; -; Hypervisor virtual filesystem - reading directory +; CBM/CMD virtual filesystem - reading directory ; -fs_1581_read_dir_open: +fs_cbm_read_dir_open: ; Try to read track 40, sector 0 (disk header) @@ -13,7 +13,7 @@ fs_1581_read_dir_open: lda #$00 sta PAR_SECTOR - jsr dev_fd_util_readsector ; XXX handle read errors + jsr lowlevel_readsector ; XXX handle read errors ; Create the first directory listing entry (title, id) @@ -78,7 +78,7 @@ fs_1581_read_dir_open: lda #$02 sta PAR_SECTOR - jsr dev_fd_util_readsector ; XXX handle read errors + jsr lowlevel_readsector ; XXX handle read errors ; Copy 2nd BAM sector to the cache @@ -106,7 +106,7 @@ fs_1581_read_dir_open: jmp dos_EXIT_CLC -fs_1581_read_dir: +fs_cbm_read_dir: lda FD_DIRENT @@ -147,12 +147,12 @@ fs_1581_read_dir: ldy #$02 ; start from determining file type jsr code_LDA_nnnn_Y - beq fs_1581_read_dir ; ignore deleted files (but allow DEL files in some cases) + beq fs_cbm_read_dir ; ignore deleted files (but allow DEL files in some cases) tax and #%00111111 ; for checking, filter out special bits cmp #$06 - bcs fs_1581_read_dir ; ignore unknown file types + bcs fs_cbm_read_dir ; ignore unknown file types stx PAR_FTYPE @@ -198,10 +198,10 @@ fs_1581_read_dir: ; Check if this was the last sector lda SHARED_BUF_1+0 - beq fs_1581_read_dir_blocksfree + beq fs_cbm_read_dir_blocksfree lda SHARED_BUF_1+1 cmp #$FF - beq fs_1581_read_dir_blocksfree + beq fs_cbm_read_dir_blocksfree ; Transition from 1st half of the buffer, to (possibly) the second one @@ -232,10 +232,10 @@ fs_1581_read_dir: ; Check if this was the last sector lda SHARED_BUF_1+$100+0 - beq fs_1581_read_dir_blocksfree + beq fs_cbm_read_dir_blocksfree lda SHARED_BUF_1+$100+1 cmp #$FF - beq fs_1581_read_dir_blocksfree + beq fs_cbm_read_dir_blocksfree ; Load new sector @@ -246,7 +246,7 @@ fs_1581_read_dir: @get_sector_common: - jsr dev_fd_util_readsector ; XXX handle read errors + jsr lowlevel_readsector ; XXX handle read errors ; Set new FD_DIRENT @@ -258,7 +258,7 @@ fs_1581_read_dir: sta FD_DIRENT jmp @cont -fs_1581_read_dir_blocksfree: +fs_cbm_read_dir_blocksfree: ; Copy the 'BLOCKS FREE' line diff --git a/src/dos_m65/filesystem_cbm/fs_cbm_read_file.s b/src/dos_m65/filesystem_cbm/fs_cbm_read_file.s new file mode 100644 index 00000000..11090289 --- /dev/null +++ b/src/dos_m65/filesystem_cbm/fs_cbm_read_file.s @@ -0,0 +1,31 @@ + +; +; CBM/CMD virtual filesystem - reading the file +; + + +fs_cbm_read_file_open: + + ; Get the first sector of the directory + + lda #40 + sta PAR_TRACK + lda #$03 + sta PAR_SECTOR + + jsr lowlevel_readsector ; XXX handle read errors + + + + + + + ; XXX provide implementation + + jmp dos_EXIT_SEC + +fs_cbm_read_file: + + ; XXX provide implementation + + jmp dos_EXIT_SEC diff --git a/src/dos_m65/dev_sdcard/fs_hvsr_util_nextdirentry.s b/src/dos_m65/filesystem_vfs/fs_vfs_nextdirentry.s similarity index 79% rename from src/dos_m65/dev_sdcard/fs_hvsr_util_nextdirentry.s rename to src/dos_m65/filesystem_vfs/fs_vfs_nextdirentry.s index f644b02d..9a855961 100644 --- a/src/dos_m65/dev_sdcard/fs_hvsr_util_nextdirentry.s +++ b/src/dos_m65/filesystem_vfs/fs_vfs_nextdirentry.s @@ -9,9 +9,7 @@ ; NOTE: overrides page pointed by FS_HVSR_DIRENT! -; XXX work-in-progress, this should be used within directory reading code - -fs_hvsr_util_nextdirentry: +fs_vfs_nextdirentry: ; Clear the page which will be used @@ -47,26 +45,26 @@ fs_hvsr_util_nextdirentry: ; ldx FS_HVSR_DIRENT+$40 ; file name length - beq fs_hvsr_util_nextdirentry ; do not even try for empty file name + beq fs_vfs_nextdirentry ; do not even try for empty file name cpx #20 - bcs fs_hvsr_util_nextdirentry ; if longer than 16 characters + dot + extension - also skip this one + bcs fs_vfs_nextdirentry ; if longer than 16 characters + dot + extension - also skip this one dex @lpname: lda FS_HVSR_DIRENT,x cmp #$22 - beq fs_hvsr_util_nextdirentry ; quotation mark is illegal + beq fs_vfs_nextdirentry ; quotation mark is illegal cmp #$2A - beq fs_hvsr_util_nextdirentry ; asterisk is illegal, it is used for filtering + beq fs_vfs_nextdirentry ; asterisk is illegal, it is used for filtering cmp #$3F - beq fs_hvsr_util_nextdirentry ; the question mark - in the MS-DOS world it is illegal + beq fs_vfs_nextdirentry ; the question mark - in the MS-DOS world it is illegal cmp #$20 - bcc fs_hvsr_util_nextdirentry ; control characters are not allowed + bcc fs_vfs_nextdirentry ; control characters are not allowed cmp #$5B bcc @lpname_next ; up to PETSCII 'Z' is OK cmp #$61 - bcc fs_hvsr_util_nextdirentry ; some characters are not allowed + bcc fs_vfs_nextdirentry ; some characters are not allowed cmp #$7E bne @lpname_1 lda #$A6 ; replace tilde / pi with something more sane @@ -75,7 +73,7 @@ fs_hvsr_util_nextdirentry: @lpname_1: cmp #$7B - bcs fs_hvsr_util_nextdirentry ; PETSCII-art and control characters are illegal + bcs fs_vfs_nextdirentry ; PETSCII-art and control characters are illegal clc sbc #$20 ; make everything the same case @@ -102,7 +100,7 @@ fs_hvsr_util_nextdirentry: txa and #$10 - beq fs_hvsr_util_nextdirentry ; this type is unknown + beq fs_vfs_nextdirentry ; this type is unknown @entity_dir: @@ -110,7 +108,7 @@ fs_hvsr_util_nextdirentry: lda FS_HVSR_DIRENT+$40 cmp #$11 - bcs fs_hvsr_util_nextdirentry ; skip entry if file name longer than 16 characters + bcs fs_vfs_nextdirentry ; skip entry if file name longer than 16 characters ; Set the type to directory @@ -124,8 +122,8 @@ fs_hvsr_util_nextdirentry: lda FS_HVSR_DIRENT+$40 sec sbc #$04 ; strip 4 bytes - for dot and extension - bmi fs_hvsr_util_nextdirentry ; if name too short, try next entry - beq fs_hvsr_util_nextdirentry ; if name too short, try next entry + bmi fs_vfs_nextdirentry ; if name too short, try next entry + beq fs_vfs_nextdirentry ; if name too short, try next entry sta FS_HVSR_DIRENT+$40 ; store corrected file name length tax @@ -133,7 +131,7 @@ fs_hvsr_util_nextdirentry: lda FS_HVSR_DIRENT, x cmp #$2E - +bne fs_hvsr_util_nextdirentry + +bne fs_vfs_nextdirentry ; ; Detect file type by extension @@ -165,12 +163,12 @@ fs_hvsr_util_nextdirentry: cpy #(dir_types__end - dir_types) bcc @lpext - jmp fs_hvsr_util_nextdirentry ; file extension not detected + jmp fs_vfs_nextdirentry ; file extension not detected @lpext_found: cpy #$18 - +beq fs_hvsr_util_nextdirentry ; file extension 'DIR' does not mean this is a directory + +beq fs_vfs_nextdirentry ; file extension 'DIR' does not mean this is a directory tya clc diff --git a/src/dos_m65/dev_sdcard/fs_hvsr_read_dir.s b/src/dos_m65/filesystem_vfs/fs_vfs_read_dir.s similarity index 83% rename from src/dos_m65/dev_sdcard/fs_hvsr_read_dir.s rename to src/dos_m65/filesystem_vfs/fs_vfs_read_dir.s index 3b80ad80..f1ca167b 100644 --- a/src/dos_m65/dev_sdcard/fs_hvsr_read_dir.s +++ b/src/dos_m65/filesystem_vfs/fs_vfs_read_dir.s @@ -4,7 +4,7 @@ ; -fs_hvsr_read_dir_open: +fs_vfs_read_dir_open: ; Open the directory @@ -44,23 +44,23 @@ fs_hvsr_read_dir_open: jmp dos_EXIT_CLC -fs_hvsr_read_dir: +fs_vfs_read_dir: ; Read dirent structure into $1000, process it, restore the memory content. ; Starting at $1000 VIC sees chargen, so this should be a safe place - jsr fs_hvsr_direntmem_prepare - jsr fs_hvsr_util_nextdirentry - jsr fs_hvsr_direntmem_restore ; processor status is preserved + jsr fs_vfs_direntmem_prepare + jsr fs_vfs_nextdirentry + jsr fs_vfs_direntmem_restore ; processor status is preserved ; If nothing to read, output 'blocks free' - +bcs fs_hvsr_read_dir_blocksfree + +bcs fs_vfs_read_dir_blocksfree ; Check if file name matches the filter jsr util_dir_filter - bne fs_hvsr_read_dir ; if does not match, try the next entry + bne fs_vfs_read_dir ; if does not match, try the next entry ; Otherwise, convert the file length from bytes to blocks to display @@ -84,7 +84,7 @@ fs_hvsr_read_dir: clc rts -fs_hvsr_read_dir_blocksfree: +fs_vfs_read_dir_blocksfree: ; Set pointer to 'BLOCKS FREE.' line @@ -117,7 +117,7 @@ fs_hvsr_read_dir_blocksfree: ; Helper routines ; -fs_hvsr_direntmem_prepare: +fs_vfs_direntmem_prepare: ldx #$00 @1: @@ -128,7 +128,7 @@ fs_hvsr_direntmem_prepare: rts -fs_hvsr_direntmem_restore: +fs_vfs_direntmem_restore: php diff --git a/src/dos_m65/dev_sdcard/fs_hvsr_read_file.s b/src/dos_m65/filesystem_vfs/fs_vfs_read_file.s similarity index 70% rename from src/dos_m65/dev_sdcard/fs_hvsr_read_file.s rename to src/dos_m65/filesystem_vfs/fs_vfs_read_file.s index cddb95fb..db97b15f 100644 --- a/src/dos_m65/dev_sdcard/fs_hvsr_read_file.s +++ b/src/dos_m65/filesystem_vfs/fs_vfs_read_file.s @@ -4,7 +4,7 @@ ; -fs_hvsr_read_file_open: +fs_vfs_read_file_open: ; Open the directory @@ -28,12 +28,12 @@ fs_hvsr_read_file_open: ; Read dirent structures into $1000, find the first matching file ; Starting at $1000 VIC sees chargen, so this should be a safe place - jsr fs_hvsr_direntmem_prepare + jsr fs_vfs_direntmem_prepare @lp_find: - jsr fs_hvsr_util_nextdirentry ; fetch the next file name - +bcs fs_hvsr_file_not_found + jsr fs_vfs_nextdirentry ; fetch the next file name + +bcs fs_vfs_file_not_found ; Only accept files of type 'PRG', properly closed @@ -49,9 +49,9 @@ fs_hvsr_read_file_open: ; Found the file - load it - jsr fs_hvsr_direntmem_restore ; restore $1000 memory content + jsr fs_vfs_direntmem_restore ; restore $1000 memory content - lda #$18 ; dos_openfile + lda #$18 ; dos_openfile sta HTRAP00 +nop @@ -62,15 +62,15 @@ fs_hvsr_read_file_open: lda #$03 ; mode: read file sta SD_MODE - jsr fs_hvsr_read_file + jsr fs_vfs_read_file jmp dos_EXIT -fs_hvsr_read_file: +fs_vfs_read_file: ; Read chunk of data to SD card buffer ldx SD_DESC - lda #$1A ; dos_readfile + lda #$1A ; dos_readfile sta HTRAP00 +nop @@ -87,7 +87,7 @@ fs_hvsr_read_file: ora SD_ACPTR_LEN+0 bne @copy - lda #$20 ; dos_closefile + lda #$20 ; dos_closefile sta HTRAP00 +nop @@ -106,7 +106,7 @@ fs_hvsr_read_file: ; Copy data to SHARED_BUF_0 - lda #%10000000 ; select SD card buffer + lda #%10000000 ; select SD card buffer tsb SD_BUFCTL ; Copy data using DMA job @@ -120,21 +120,21 @@ fs_hvsr_read_file: lda #$01 sta DMAJOB_DST_ADDR+2 - jsr util_dma_launch_from_hwbuf ; execute DMA job + jsr util_dma_launch_from_hwbuf ; execute DMA job clc rts -fs_hvsr_file_not_found: +fs_vfs_file_not_found: - jsr fs_hvsr_direntmem_restore ; restore $1000 memory content + jsr fs_vfs_direntmem_restore ; restore $1000 memory content ldx SD_DESC - lda #$16 ; dos_closedir + lda #$16 ; dos_closedir sta HTRAP00 +nop - lda #39 ; file not found error + lda #39 ; file not found error jsr util_status_SD lda #K_ERR_FILE_NOT_FOUND diff --git a/src/dos_m65/dev_floppy/dev_fd_util_readsector.s b/src/dos_m65/lowlevel/lowlevel_readsector.s similarity index 95% rename from src/dos_m65/dev_floppy/dev_fd_util_readsector.s rename to src/dos_m65/lowlevel/lowlevel_readsector.s index bf020b28..c75e23ca 100644 --- a/src/dos_m65/dev_floppy/dev_fd_util_readsector.s +++ b/src/dos_m65/lowlevel/lowlevel_readsector.s @@ -1,8 +1,8 @@ -; Read a single sector from a floppy drive +; Read a single sector from a block device -dev_fd_util_readsector: +lowlevel_readsector: ; Select FDD sector as buffer diff --git a/src/dos_m65/msg_acptr.s b/src/dos_m65/pseudoiec/msg_acptr.s similarity index 98% rename from src/dos_m65/msg_acptr.s rename to src/dos_m65/pseudoiec/msg_acptr.s index d22c7884..c662618c 100644 --- a/src/dos_m65/msg_acptr.s +++ b/src/dos_m65/pseudoiec/msg_acptr.s @@ -56,7 +56,7 @@ msg_ACPTR_read_SD: ora SD_ACPTR_LEN+1 bne @3 - jsr dev_sd_cmd_READ + jsr unit_sd_cmd_READ bcc @3 jsr kernalstatus_EOI @3: @@ -86,7 +86,7 @@ msg_ACPTR_read_FD: ora FD_ACPTR_LEN+1 bne @3 - jsr dev_fd_cmd_READ + jsr unit_fd_cmd_READ bcc @3 jsr kernalstatus_EOI @3: diff --git a/src/dos_m65/msg_ciout.s b/src/dos_m65/pseudoiec/msg_ciout.s similarity index 87% rename from src/dos_m65/msg_ciout.s rename to src/dos_m65/pseudoiec/msg_ciout.s index 56ec372a..5f819460 100644 --- a/src/dos_m65/msg_ciout.s +++ b/src/dos_m65/pseudoiec/msg_ciout.s @@ -52,7 +52,7 @@ msg_CIOUT_cmdfn_SD: ; get next byte of status - SD card lda #$A0 sta SD_CMDFN_BUF,x plp - +bcs dev_sd_cmd_OPEN_EOI ; if EOI - execute command + +bcs unit_sd_cmd_OPEN_EOI ; if EOI - execute command jmp dos_EXIT_CLC msg_CIOUT_cmdfn_FD: ; get next byte of status - floppy @@ -67,7 +67,7 @@ msg_CIOUT_cmdfn_FD: ; get next byte of status - floppy lda #$A0 sta FD_CMDFN_BUF,x plp - +bcs dev_fd_cmd_OPEN_EOI ; if EOI - execute command + +bcs unit_fd_cmd_OPEN_EOI ; if EOI - execute command jmp dos_EXIT_CLC msg_CIOUT_cmdfn_RD: ; get next byte of status - ram disk @@ -82,7 +82,7 @@ msg_CIOUT_cmdfn_RD: ; get next byte of status - ram disk lda #$A0 sta RD_CMDFN_BUF,x plp - +bcs dev_rd_cmd_OPEN_EOI ; if EOI - execute command + +bcs unit_rd_cmd_OPEN_EOI ; if EOI - execute command jmp dos_EXIT_CLC msg_CIOUT_cmdfn_vectab: diff --git a/src/dos_m65/msg_listen.s b/src/dos_m65/pseudoiec/msg_listen.s similarity index 100% rename from src/dos_m65/msg_listen.s rename to src/dos_m65/pseudoiec/msg_listen.s diff --git a/src/dos_m65/msg_second.s b/src/dos_m65/pseudoiec/msg_second.s similarity index 100% rename from src/dos_m65/msg_second.s rename to src/dos_m65/pseudoiec/msg_second.s diff --git a/src/dos_m65/msg_talk.s b/src/dos_m65/pseudoiec/msg_talk.s similarity index 100% rename from src/dos_m65/msg_talk.s rename to src/dos_m65/pseudoiec/msg_talk.s diff --git a/src/dos_m65/msg_tksa.s b/src/dos_m65/pseudoiec/msg_tksa.s similarity index 100% rename from src/dos_m65/msg_tksa.s rename to src/dos_m65/pseudoiec/msg_tksa.s diff --git a/src/dos_m65/msg_unlsn_untlk.s b/src/dos_m65/pseudoiec/msg_unlsn_untlk.s similarity index 100% rename from src/dos_m65/msg_unlsn_untlk.s rename to src/dos_m65/pseudoiec/msg_unlsn_untlk.s diff --git a/src/dos_m65/dev_floppy/dev_fd_cmd_close.s b/src/dos_m65/unit_floppy/unit_fd_cmd_close.s similarity index 82% rename from src/dos_m65/dev_floppy/dev_fd_cmd_close.s rename to src/dos_m65/unit_floppy/unit_fd_cmd_close.s index cf2b6b6f..fc980641 100644 --- a/src/dos_m65/dev_floppy/dev_fd_cmd_close.s +++ b/src/dos_m65/unit_floppy/unit_fd_cmd_close.s @@ -4,7 +4,7 @@ ; -dev_fd_cmd_CLOSE: +unit_fd_cmd_CLOSE: ; XXX provide implementation diff --git a/src/dos_m65/dev_floppy/dev_fd_cmd_open.s b/src/dos_m65/unit_floppy/unit_fd_cmd_open.s similarity index 84% rename from src/dos_m65/dev_floppy/dev_fd_cmd_open.s rename to src/dos_m65/unit_floppy/unit_fd_cmd_open.s index 9f66198b..0de83174 100644 --- a/src/dos_m65/dev_floppy/dev_fd_cmd_open.s +++ b/src/dos_m65/unit_floppy/unit_fd_cmd_open.s @@ -4,14 +4,14 @@ ; -dev_fd_cmd_OPEN: +unit_fd_cmd_OPEN: lda #$01 ; mode: receive command or file name sta FD_MODE jmp dos_EXIT_CLC -dev_fd_cmd_OPEN_EOI: +unit_fd_cmd_OPEN_EOI: ; XXX this dispatcher is temporary @@ -28,17 +28,17 @@ dev_fd_cmd_OPEN_EOI: lda FD_CMDFN_BUF cmp #'$' - beq dev_fd_cmd_OPEN_dir + beq unit_fd_cmd_OPEN_dir ; FALLTROUGH -dev_fd_cmd_OPEN_file: +unit_fd_cmd_OPEN_file: ; XXX provide implementation jmp dos_EXIT_CLC -dev_fd_cmd_OPEN_dir: +unit_fd_cmd_OPEN_dir: lda #$02 ; mode: read directory sta FD_MODE @@ -57,4 +57,4 @@ dev_fd_cmd_OPEN_dir: @lp1_end: - jmp fs_1581_read_dir_open + jmp fs_cbm_read_dir_open diff --git a/src/dos_m65/dev_floppy/dev_fd_cmd_read.s b/src/dos_m65/unit_floppy/unit_fd_cmd_read.s similarity index 56% rename from src/dos_m65/dev_floppy/dev_fd_cmd_read.s rename to src/dos_m65/unit_floppy/unit_fd_cmd_read.s index 6a4f76f7..161b346a 100644 --- a/src/dos_m65/dev_floppy/dev_fd_cmd_read.s +++ b/src/dos_m65/unit_floppy/unit_fd_cmd_read.s @@ -4,17 +4,17 @@ ; -dev_fd_cmd_READ: +unit_fd_cmd_READ: lda FD_MODE cmp #$03 - +beq fs_1581_read_file + +beq fs_cbm_read_file lda FD_DIR_PHASE cmp #$01 - +beq fs_1581_read_dir + +beq fs_cbm_read_dir cmp #$02 - +beq fs_1581_read_dir_blocksfree + +beq fs_cbm_read_dir_blocksfree sec ; mark EOI rts diff --git a/src/dos_m65/dev_floppy/dev_fd_init.s b/src/dos_m65/unit_floppy/unit_fd_init.s similarity index 95% rename from src/dos_m65/dev_floppy/dev_fd_init.s rename to src/dos_m65/unit_floppy/unit_fd_init.s index 4be7c57a..45143cce 100644 --- a/src/dos_m65/dev_floppy/dev_fd_init.s +++ b/src/dos_m65/unit_floppy/unit_fd_init.s @@ -4,7 +4,7 @@ ; -dev_fd_init: +unit_fd_init: ; Copy status string diff --git a/src/dos_m65/dev_ramdisk/dev_rd_cmd_close.s b/src/dos_m65/unit_ramdisk/unit_rd_cmd_close.s similarity index 82% rename from src/dos_m65/dev_ramdisk/dev_rd_cmd_close.s rename to src/dos_m65/unit_ramdisk/unit_rd_cmd_close.s index 87575b81..60f9a9c3 100644 --- a/src/dos_m65/dev_ramdisk/dev_rd_cmd_close.s +++ b/src/dos_m65/unit_ramdisk/unit_rd_cmd_close.s @@ -4,7 +4,7 @@ ; -dev_rd_cmd_CLOSE: +unit_rd_cmd_CLOSE: ; XXX provide implementation diff --git a/src/dos_m65/dev_ramdisk/dev_rd_cmd_open.s b/src/dos_m65/unit_ramdisk/unit_rd_cmd_open.s similarity index 76% rename from src/dos_m65/dev_ramdisk/dev_rd_cmd_open.s rename to src/dos_m65/unit_ramdisk/unit_rd_cmd_open.s index 4e2b436e..dba16a23 100644 --- a/src/dos_m65/dev_ramdisk/dev_rd_cmd_open.s +++ b/src/dos_m65/unit_ramdisk/unit_rd_cmd_open.s @@ -4,13 +4,13 @@ ; -dev_rd_cmd_OPEN: +unit_rd_cmd_OPEN: ; XXX provide implementation jmp dos_EXIT_SEC -dev_rd_cmd_OPEN_EOI: +unit_rd_cmd_OPEN_EOI: ; XXX provide implementation diff --git a/src/dos_m65/dev_ramdisk/dev_rd_cmd_read.s b/src/dos_m65/unit_ramdisk/unit_rd_cmd_read.s similarity index 83% rename from src/dos_m65/dev_ramdisk/dev_rd_cmd_read.s rename to src/dos_m65/unit_ramdisk/unit_rd_cmd_read.s index 36a95300..cd9a0b0c 100644 --- a/src/dos_m65/dev_ramdisk/dev_rd_cmd_read.s +++ b/src/dos_m65/unit_ramdisk/unit_rd_cmd_read.s @@ -4,7 +4,7 @@ ; -dev_rd_cmd_READ: +unit_rd_cmd_READ: ; XXX provide implementation diff --git a/src/dos_m65/dev_ramdisk/dev_rd_init.s b/src/dos_m65/unit_ramdisk/unit_rd_init.s similarity index 95% rename from src/dos_m65/dev_ramdisk/dev_rd_init.s rename to src/dos_m65/unit_ramdisk/unit_rd_init.s index 964eae2a..f12dd15c 100644 --- a/src/dos_m65/dev_ramdisk/dev_rd_init.s +++ b/src/dos_m65/unit_ramdisk/unit_rd_init.s @@ -4,7 +4,7 @@ ; -dev_rd_init: +unit_rd_init: ; Copy status string diff --git a/src/dos_m65/dev_sdcard/dev_sd_cmd_close.s b/src/dos_m65/unit_sdcard/unit_sd_cmd_close.s similarity index 82% rename from src/dos_m65/dev_sdcard/dev_sd_cmd_close.s rename to src/dos_m65/unit_sdcard/unit_sd_cmd_close.s index 9d0c23da..ac427a74 100644 --- a/src/dos_m65/dev_sdcard/dev_sd_cmd_close.s +++ b/src/dos_m65/unit_sdcard/unit_sd_cmd_close.s @@ -4,7 +4,7 @@ ; -dev_sd_cmd_CLOSE: +unit_sd_cmd_CLOSE: ; XXX provide implementation diff --git a/src/dos_m65/dev_sdcard/dev_sd_cmd_open.s b/src/dos_m65/unit_sdcard/unit_sd_cmd_open.s similarity index 84% rename from src/dos_m65/dev_sdcard/dev_sd_cmd_open.s rename to src/dos_m65/unit_sdcard/unit_sd_cmd_open.s index 17a34318..56a2629d 100644 --- a/src/dos_m65/dev_sdcard/dev_sd_cmd_open.s +++ b/src/dos_m65/unit_sdcard/unit_sd_cmd_open.s @@ -4,14 +4,14 @@ ; -dev_sd_cmd_OPEN: +unit_sd_cmd_OPEN: lda #$01 ; mode: receive command or file name sta SD_MODE jmp dos_EXIT_CLC -dev_sd_cmd_OPEN_EOI: +unit_sd_cmd_OPEN_EOI: ; XXX this dispatcher is temporary @@ -28,11 +28,11 @@ dev_sd_cmd_OPEN_EOI: lda SD_CMDFN_BUF cmp #'$' - beq dev_sd_cmd_OPEN_dir + beq unit_sd_cmd_OPEN_dir ; FALLTROUGH -dev_sd_cmd_OPEN_file: +unit_sd_cmd_OPEN_file: ; Copy the filter from command XXX this should be moved to common part and deduplicated with directory opening @@ -48,10 +48,10 @@ dev_sd_cmd_OPEN_file: @lp1_end: - jmp fs_hvsr_read_file_open + jmp fs_vfs_read_file_open -dev_sd_cmd_OPEN_dir: +unit_sd_cmd_OPEN_dir: lda #$02 ; mode: read directory sta SD_MODE @@ -70,4 +70,4 @@ dev_sd_cmd_OPEN_dir: @lp1_end: - jmp fs_hvsr_read_dir_open + jmp fs_vfs_read_dir_open diff --git a/src/dos_m65/dev_sdcard/dev_sd_cmd_read.s b/src/dos_m65/unit_sdcard/unit_sd_cmd_read.s similarity index 56% rename from src/dos_m65/dev_sdcard/dev_sd_cmd_read.s rename to src/dos_m65/unit_sdcard/unit_sd_cmd_read.s index 9852d5b0..2a569b80 100644 --- a/src/dos_m65/dev_sdcard/dev_sd_cmd_read.s +++ b/src/dos_m65/unit_sdcard/unit_sd_cmd_read.s @@ -4,17 +4,17 @@ ; -dev_sd_cmd_READ: +unit_sd_cmd_READ: lda SD_MODE cmp #$03 - +beq fs_hvsr_read_file + +beq fs_vfs_read_file lda SD_DIR_PHASE cmp #$01 - +beq fs_hvsr_read_dir + +beq fs_vfs_read_dir cmp #$02 - +beq fs_hvsr_read_dir_blocksfree + +beq fs_vfs_read_dir_blocksfree sec ; mark EOI rts diff --git a/src/dos_m65/dev_sdcard/dev_sd_init.s b/src/dos_m65/unit_sdcard/unit_sd_init.s similarity index 97% rename from src/dos_m65/dev_sdcard/dev_sd_init.s rename to src/dos_m65/unit_sdcard/unit_sd_init.s index 4ee236a8..6f79c036 100644 --- a/src/dos_m65/dev_sdcard/dev_sd_init.s +++ b/src/dos_m65/unit_sdcard/unit_sd_init.s @@ -4,7 +4,7 @@ ; -dev_sd_init: +unit_sd_init: ; Copy initial status string From c0b7035100e329a35f3eacbc6021a7ed46502551 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sat, 6 Mar 2021 22:26:46 +0100 Subject: [PATCH 20/32] reenabled HyperRAM test --- src/zvm_m65/zvm.s | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/zvm_m65/zvm.s b/src/zvm_m65/zvm.s index 75f48c4b..0dd7b312 100644 --- a/src/zvm_m65/zvm.s +++ b/src/zvm_m65/zvm.s @@ -52,7 +52,7 @@ ZVM: ; entry point ; Check if extended memory is present - ; XXX enable test jsr ZVM_memtest + jsr ZVM_memtest ; Generate CPU tables, reset the CPU From df89e627615634fb5ec1ef8a1f7d727ca5acd1d7 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Mon, 8 Mar 2021 18:10:21 +0100 Subject: [PATCH 21/32] more work towards loading from internal drive --- .../filesystem_cbm/fs_cbm_nextdirentry.s | 138 +++++++++++++++++- src/dos_m65/filesystem_cbm/fs_cbm_read_dir.s | 130 +---------------- src/dos_m65/filesystem_cbm/fs_cbm_read_file.s | 20 ++- 3 files changed, 160 insertions(+), 128 deletions(-) diff --git a/src/dos_m65/filesystem_cbm/fs_cbm_nextdirentry.s b/src/dos_m65/filesystem_cbm/fs_cbm_nextdirentry.s index 2b06f078..fc500dac 100644 --- a/src/dos_m65/filesystem_cbm/fs_cbm_nextdirentry.s +++ b/src/dos_m65/filesystem_cbm/fs_cbm_nextdirentry.s @@ -10,4 +10,140 @@ ; XXX work-in-progress, this should be used within directory reading code -fs_cbm_nextdirentry: \ No newline at end of file +fs_cbm_nextdirentry: + + lda FD_DIRENT + + ; If first entry within sector - make sure it is present within the buffer + + cmp #$08 + beq @get_sector_lo + cmp #$10 + +beq @get_sector_hi + + ; FALLTROUGH + +@cont: + + ; Set address of the RAW directory entry + + ldy #>SHARED_BUF_1 + sty par_LDA_nnnn_Y+1 + + asl + asl + asl + asl + asl + sta par_LDA_nnnn_Y+0 + + bcc @1 + inc par_LDA_nnnn_Y+1 +@1: + ; Set next directory entry + + inc FD_DIRENT + + ; Copy data to parameter variables + + ; XXX most likely copying is not necessary (compare all CBM and CMD filesystems) - + ; XXX just make the hypervisor file system emulate these structures + + ldy #$02 ; start from determining file type + jsr code_LDA_nnnn_Y + beq fs_cbm_nextdirentry ; ignore deleted files (but allow DEL files in some cases) + + tax + and #%00111111 ; for checking, filter out special bits + cmp #$06 + bcs fs_cbm_nextdirentry ; ignore unknown file types + + stx PAR_FTYPE + + ldy #$1E ; now get file size in blocks + jsr code_LDA_nnnn_Y + sta PAR_FSIZE_BLOCKS+0 + iny + jsr code_LDA_nnnn_Y + sta PAR_FSIZE_BLOCKS+1 + + ldy #$05 ; copy the file name +@lp1: + jsr code_LDA_nnnn_Y + sta PAR_FNAME-5,y + iny + cpy #$15 + bne @lp1 + + clc + rts + +@get_sector_lo: + + ; Check if this was the last sector + + lda SHARED_BUF_1+0 + beq @end_of_dir + lda SHARED_BUF_1+1 + cmp #$FF + beq @end_of_dir + + ; Transition from 1st half of the buffer, to (possibly) the second one + + lda SHARED_BUF_1+0 + cmp BUFTAB_TRACK+1 + bne @get_sector_lo_next + + lda SHARED_BUF_1+1 + dec + cmp BUFTAB_SECTOR+1 + bne @get_sector_lo_next + + ; It's OK, we can transition to the upper half of the buffer + + lda FD_DIRENT + jmp @cont + +@get_sector_lo_next: + + lda SHARED_BUF_1+0 + sta PAR_TRACK + lda SHARED_BUF_1+1 + sta PAR_SECTOR + bra @get_sector_common + +@get_sector_hi: + + ; Check if this was the last sector + + lda SHARED_BUF_1+$100+0 + beq @end_of_dir + lda SHARED_BUF_1+$100+1 + cmp #$FF + beq @end_of_dir + + ; Load new sector + + lda SHARED_BUF_1+$100+0 + sta PAR_TRACK + lda SHARED_BUF_1+$100+1 + sta PAR_SECTOR + +@get_sector_common: + + jsr lowlevel_readsector ; XXX handle read errors + + ; Set new FD_DIRENT + + lda PAR_SECTOR + and #$01 + beq @2 + lda #$08 +@2: + sta FD_DIRENT + jmp @cont + +@end_of_dir: + + sec + rts \ No newline at end of file diff --git a/src/dos_m65/filesystem_cbm/fs_cbm_read_dir.s b/src/dos_m65/filesystem_cbm/fs_cbm_read_dir.s index b14728c4..5f07a556 100644 --- a/src/dos_m65/filesystem_cbm/fs_cbm_read_dir.s +++ b/src/dos_m65/filesystem_cbm/fs_cbm_read_dir.s @@ -108,68 +108,11 @@ fs_cbm_read_dir_open: fs_cbm_read_dir: - lda FD_DIRENT + jsr fs_cbm_nextdirentry + bcs fs_cbm_read_dir_blocksfree ; XXX handle errors - ; If first entry within sector - make sure it is present within the buffer - - cmp #$08 - beq @get_sector_lo - cmp #$10 - +beq @get_sector_hi - - ; FALLTROUGH - -@cont: - - ; Set address of the RAW directory entry - - ldy #>SHARED_BUF_1 - sty par_LDA_nnnn_Y+1 - - asl - asl - asl - asl - asl - sta par_LDA_nnnn_Y+0 - - bcc @1 - inc par_LDA_nnnn_Y+1 -@1: - ; Set next directory entry - - inc FD_DIRENT - - ; Copy data to parameter variables - - ; XXX most likely copying is not necessary (compare all CBM and CMD filesystems) - - ; XXX just make the hypervisor file system emulate these structures - - ldy #$02 ; start from determining file type - jsr code_LDA_nnnn_Y - beq fs_cbm_read_dir ; ignore deleted files (but allow DEL files in some cases) - - tax - and #%00111111 ; for checking, filter out special bits - cmp #$06 - bcs fs_cbm_read_dir ; ignore unknown file types - - stx PAR_FTYPE - - ldy #$1E ; now get file size in blocks - jsr code_LDA_nnnn_Y - sta PAR_FSIZE_BLOCKS+0 - iny - jsr code_LDA_nnnn_Y - sta PAR_FSIZE_BLOCKS+1 - - ldy #$05 ; copy the file name -@lp1: - jsr code_LDA_nnnn_Y - sta PAR_FNAME-5,y - iny - cpy #$15 - bne @lp1 + jsr util_dir_filter ; XXX consider moving these calls to fs_*_nextdirentry + bne fs_cbm_read_dir ; if does not match, try the next entry ; Prepare output entry, starting from XX_DIRENT_BUF + initial offset @@ -193,71 +136,6 @@ fs_cbm_read_dir: clc rts -@get_sector_lo: - - ; Check if this was the last sector - - lda SHARED_BUF_1+0 - beq fs_cbm_read_dir_blocksfree - lda SHARED_BUF_1+1 - cmp #$FF - beq fs_cbm_read_dir_blocksfree - - ; Transition from 1st half of the buffer, to (possibly) the second one - - lda SHARED_BUF_1+0 - cmp BUFTAB_TRACK+1 - bne @get_sector_lo_next - - lda SHARED_BUF_1+1 - dec - cmp BUFTAB_SECTOR+1 - bne @get_sector_lo_next - - ; It's OK, we can transition to the upper half of the buffer - - lda FD_DIRENT - jmp @cont - -@get_sector_lo_next: - - lda SHARED_BUF_1+0 - sta PAR_TRACK - lda SHARED_BUF_1+1 - sta PAR_SECTOR - bra @get_sector_common - -@get_sector_hi: - - ; Check if this was the last sector - - lda SHARED_BUF_1+$100+0 - beq fs_cbm_read_dir_blocksfree - lda SHARED_BUF_1+$100+1 - cmp #$FF - beq fs_cbm_read_dir_blocksfree - - ; Load new sector - - lda SHARED_BUF_1+$100+0 - sta PAR_TRACK - lda SHARED_BUF_1+$100+1 - sta PAR_SECTOR - -@get_sector_common: - - jsr lowlevel_readsector ; XXX handle read errors - - ; Set new FD_DIRENT - - lda PAR_SECTOR - and #$01 - beq @2 - lda #$08 -@2: - sta FD_DIRENT - jmp @cont - fs_cbm_read_dir_blocksfree: ; Copy the 'BLOCKS FREE' line diff --git a/src/dos_m65/filesystem_cbm/fs_cbm_read_file.s b/src/dos_m65/filesystem_cbm/fs_cbm_read_file.s index 11090289..6bc7e910 100644 --- a/src/dos_m65/filesystem_cbm/fs_cbm_read_file.s +++ b/src/dos_m65/filesystem_cbm/fs_cbm_read_file.s @@ -6,7 +6,7 @@ fs_cbm_read_file_open: - ; Get the first sector of the directory + ; Get the first sector of the directory XXX deduplicate code, create a separate open directory routine lda #40 sta PAR_TRACK @@ -15,6 +15,24 @@ fs_cbm_read_file_open: jsr lowlevel_readsector ; XXX handle read errors + ; Set variables to point to the 1st directory entry in the 2nd sector of the buffer + + lda #$08 + sta FD_DIRENT + + ; Make sure the 1st sector in buffer points to 2nd one + + lda #40 + sta SHARED_BUF_1+0 + lda #03 + sta SHARED_BUF_1+1 + + ; XXX deduplicate code above with fs_cbm_read_dir_open + + ; Try to find the file + + jsr fs_cbm_nextdirentry + +bcs dos_EXIT From 062c73a80979405260d323e4b86d28b177cbbe10 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Mon, 8 Mar 2021 21:47:51 +0100 Subject: [PATCH 22/32] initial (very primitive) general sector caching --- src/dos_m65/dos_init.s | 26 +++++++++++++----- .../filesystem_cbm/fs_cbm_nextdirentry.s | 27 +++++-------------- src/dos_m65/lowlevel/lowlevel_readsector.s | 24 ++++++++++++++++- 3 files changed, 49 insertions(+), 28 deletions(-) diff --git a/src/dos_m65/dos_init.s b/src/dos_m65/dos_init.s index 85b48e5c..f4c5c5d3 100644 --- a/src/dos_m65/dos_init.s +++ b/src/dos_m65/dos_init.s @@ -39,20 +39,28 @@ dos_INIT: sta IDX1_TALKER sta IDX2_TALKER - ; Initialize device handlers + ; Initialize buffer metadata - jsr unit_sd_init - jsr unit_fd_init - jsr unit_rd_init + lda #$0 + ldx #17 +@2: + sta BUFTAB_TRACK, x + dec + sta BUFTAB_UNIT, x + sta BUFTAB_DEV, x + sta BUFTAB_SECTOR, x + inc + dex + bpl @2 ; Initialize DMA list ldy #$08 -@2: +@3: lda dos_dmalist_template, y sta DMAJOB_LIST, y dey - bpl @2: + bpl @3: ; Initialize helper code in RAM @@ -70,6 +78,12 @@ dos_INIT: sta code_RTS_03 sta code_RTS_04 + ; Initialize device handlers + + jsr unit_sd_init + jsr unit_fd_init + jsr unit_rd_init + ; Safer version of 'dos_EXIT' - does not affect speed related registers clc diff --git a/src/dos_m65/filesystem_cbm/fs_cbm_nextdirentry.s b/src/dos_m65/filesystem_cbm/fs_cbm_nextdirentry.s index fc500dac..e53ee21e 100644 --- a/src/dos_m65/filesystem_cbm/fs_cbm_nextdirentry.s +++ b/src/dos_m65/filesystem_cbm/fs_cbm_nextdirentry.s @@ -78,7 +78,7 @@ fs_cbm_nextdirentry: clc rts -@get_sector_lo: +@get_sector_lo: ; processing the 1st half of the buffer finished ; Check if this was the last sector @@ -88,31 +88,16 @@ fs_cbm_nextdirentry: cmp #$FF beq @end_of_dir - ; Transition from 1st half of the buffer, to (possibly) the second one + ; Load the next sector lda SHARED_BUF_1+0 - cmp BUFTAB_TRACK+1 - bne @get_sector_lo_next - - lda SHARED_BUF_1+1 - dec - cmp BUFTAB_SECTOR+1 - bne @get_sector_lo_next - - ; It's OK, we can transition to the upper half of the buffer - - lda FD_DIRENT - jmp @cont - -@get_sector_lo_next: - - lda SHARED_BUF_1+0 - sta PAR_TRACK + sta PAR_TRACK lda SHARED_BUF_1+1 sta PAR_SECTOR + bra @get_sector_common -@get_sector_hi: +@get_sector_hi: ; processing the 2nd half of the buffer finished ; Check if this was the last sector @@ -122,7 +107,7 @@ fs_cbm_nextdirentry: cmp #$FF beq @end_of_dir - ; Load new sector + ; Load the next sector lda SHARED_BUF_1+$100+0 sta PAR_TRACK diff --git a/src/dos_m65/lowlevel/lowlevel_readsector.s b/src/dos_m65/lowlevel/lowlevel_readsector.s index c75e23ca..fc180823 100644 --- a/src/dos_m65/lowlevel/lowlevel_readsector.s +++ b/src/dos_m65/lowlevel/lowlevel_readsector.s @@ -1,9 +1,31 @@ -; Read a single sector from a block device +; Read a sector pair from a block device lowlevel_readsector: + ; XXX compare device and unit too + + ; Check if buffer contains data from given track + + lda PAR_TRACK + cmp BUFTAB_TRACK+1 + bne lowlevel_readsector_force + + ; Check if sectors match + + lda PAR_SECTOR + and #%11111110 + cmp BUFTAB_SECTOR+1 + bne lowlevel_readsector_force + + ; Data already loaded into buffer - do nothing + + clc + rts + +lowlevel_readsector_force: + ; Select FDD sector as buffer lda #%10000000 ; select floppy buffer From 898eb1e17f0c6a53dde6b16fec8808fd8151936b Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sat, 13 Mar 2021 00:23:37 +0100 Subject: [PATCH 23/32] more work towards CBDOS floppy support --- src/,,config_mega65.s | 8 ++++---- src/dos_m65/,aliases_dos.s | 2 ++ .../filesystem_cbm/fs_cbm_nextdirentry.s | 8 -------- src/dos_m65/filesystem_cbm/fs_cbm_read_file.s | 20 +++++++++++++++++-- 4 files changed, 24 insertions(+), 14 deletions(-) diff --git a/src/,,config_mega65.s b/src/,,config_mega65.s index 45797b11..77ba1b80 100644 --- a/src/,,config_mega65.s +++ b/src/,,config_mega65.s @@ -65,9 +65,9 @@ ;; #CONFIG# KEYCMD_HELP "LIST" -;; #CONFIG# KEYCMD_F9 "@20$" +;; #CONFIG# KEYCMD_F9 "@28$" ;; #CONFIG# KEYCMD_F10 "\5FL" -;; #CONFIG# KEYCMD_F11 "@21$" +;; #CONFIG# KEYCMD_F11 "@29$" ;; #CONFIG# KEYCMD_F12 "\5FHF" ;; #CONFIG# KEYCMD_F13 "JOYCRSR 2" ;; #CONFIG# KEYCMD_F14 "BOOTCPM" @@ -90,8 +90,8 @@ ; --- Built-in DOS configuration -;; #CONFIG# UNIT_SDCARD 20 -;; #CONFIG# UNIT_FLOPPY 21 ; work in progress +;; #CONFIG# UNIT_SDCARD 28 +;; #CONFIG# UNIT_FLOPPY 29 ; work in progress ;; #CONFIG# UNIT_RAMDISK 0 ; do not change, DOS is not implemented yet diff --git a/src/dos_m65/,aliases_dos.s b/src/dos_m65/,aliases_dos.s index 2bb91aeb..e5652ce5 100644 --- a/src/dos_m65/,aliases_dos.s +++ b/src/dos_m65/,aliases_dos.s @@ -114,6 +114,8 @@ !addr SD_DESC = $8070 ; current file descriptor !addr FD_DIRENT = $8071 ; directory entry to read, 0-15 + !addr FD_LOADTRACK = $8072 ; current track for file loading + !addr FD_LOADSECTOR = $8073 ; current sector for file loading ; XXX Free space diff --git a/src/dos_m65/filesystem_cbm/fs_cbm_nextdirentry.s b/src/dos_m65/filesystem_cbm/fs_cbm_nextdirentry.s index e53ee21e..20080bb2 100644 --- a/src/dos_m65/filesystem_cbm/fs_cbm_nextdirentry.s +++ b/src/dos_m65/filesystem_cbm/fs_cbm_nextdirentry.s @@ -84,13 +84,9 @@ fs_cbm_nextdirentry: lda SHARED_BUF_1+0 beq @end_of_dir - lda SHARED_BUF_1+1 - cmp #$FF - beq @end_of_dir ; Load the next sector - lda SHARED_BUF_1+0 sta PAR_TRACK lda SHARED_BUF_1+1 sta PAR_SECTOR @@ -103,13 +99,9 @@ fs_cbm_nextdirentry: lda SHARED_BUF_1+$100+0 beq @end_of_dir - lda SHARED_BUF_1+$100+1 - cmp #$FF - beq @end_of_dir ; Load the next sector - lda SHARED_BUF_1+$100+0 sta PAR_TRACK lda SHARED_BUF_1+$100+1 sta PAR_SECTOR diff --git a/src/dos_m65/filesystem_cbm/fs_cbm_read_file.s b/src/dos_m65/filesystem_cbm/fs_cbm_read_file.s index 6bc7e910..62199396 100644 --- a/src/dos_m65/filesystem_cbm/fs_cbm_read_file.s +++ b/src/dos_m65/filesystem_cbm/fs_cbm_read_file.s @@ -29,16 +29,32 @@ fs_cbm_read_file_open: ; XXX deduplicate code above with fs_cbm_read_dir_open - ; Try to find the file + ; Try to find the file, has to be PRG + +@lp_find: jsr fs_cbm_nextdirentry +bcs dos_EXIT + ; Only accept files of type 'PRG', properly closed XXX deduplicate with fs_vfs + + lda PAR_FTYPE + and #%10111111 + cmp #$82 + bne @lp_find + + ; Check if file name matches the filter XXX deduplicate with fs_vfs + + jsr util_dir_filter + bne @lp_find ; if does not match, try the next entry + + ; Found the file - load it, start from fetching initial track/sector - ; XXX provide implementation + + ; XXX provide implementation, use FD_LOADTRACK and FD_LOADSECTOR jmp dos_EXIT_SEC From 9f6c85a460bdf2830df7154b9cc68d473d8fe5f1 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sat, 13 Mar 2021 00:38:05 +0100 Subject: [PATCH 24/32] makefile improvements --- Makefile | 82 +++++++++++++++++++++++++++++--------------------------- 1 file changed, 42 insertions(+), 40 deletions(-) diff --git a/Makefile b/Makefile index 572a2fd0..0d33ce72 100644 --- a/Makefile +++ b/Makefile @@ -331,15 +331,17 @@ build/tools/%: tools/%.cc tools/common.h # Rules - CHARGEN $(TARGET_CHR_ORF): $(TOOL_PNGPREPARE) assets/8x8font.png - @$(TOOL_PNGPREPARE) charrom assets/8x8font.png $@ 1>build/pngprepare.log + @$(TOOL_PNGPREPARE) charrom assets/8x8font.png $@ 1>/dev/null $(TARGET_CHR_PXL): bin/chargen_pxlfont_2.3.rom @cp $< $@ -build/chargen_openroms.patched: $(TOOL_PATCH_CHARGEN) $(TARGET_CHR_ORF) +build/patched_chargen/openroms.pcg: $(TOOL_PATCH_CHARGEN) $(TARGET_CHR_ORF) + @mkdir -p build/patched_chargen @$(TOOL_PATCH_CHARGEN) -i $(TARGET_CHR_ORF) -o $@ -n 7px-OpenROMs -build/chargen_pxlfont.patched: $(TOOL_PATCH_CHARGEN) $(TARGET_CHR_PXL) +build/patched_chargen/pxlfont.pcg: $(TOOL_PATCH_CHARGEN) $(TARGET_CHR_PXL) + @mkdir -p build/patched_chargen @$(TOOL_PATCH_CHARGEN) -i $(TARGET_CHR_PXL) -o $@ -n 6px-PXLfont # Dependencies - BASIC, DOS, and KERNAL @@ -703,21 +705,21 @@ build/symbols_hybrid_u64.vs: $(DIR_U64)/KERNAL_combined.vs # Rules - padding files -build/padding_4_KB: - @mkdir -p build +build/padding/4_KB: + @mkdir -p build/padding @dd if=/dev/zero bs=4096 count=1 of=$@ status=none -build/padding_8_KB: - @mkdir -p build +build/padding/8_KB: + @mkdir -p build/padding @dd if=/dev/zero bs=8192 count=1 of=$@ status=none -build/padding_16_KB: - @mkdir -p build +build/padding/16_KB: + @mkdir -p build/padding @dd if=/dev/zero bs=8192 count=2 of=$@ status=none # Rules - external CRT images -$(TARGET_GENCRT_X): $(SEG_LIST_GENCRT) $(CRT_BIN_LIST) build/padding_8_KB +$(TARGET_GENCRT_X): $(SEG_LIST_GENCRT) $(CRT_BIN_LIST) build/padding/8_KB @echo @echo @echo @@ -728,14 +730,14 @@ $(TARGET_GENCRT_X): $(SEG_LIST_GENCRT) $(CRT_BIN_LIST) build/padding_8_KB @cat assets/cartridge/header-seg0.bin >> $@ @cat $(DIR_GENCRT)/basic.seg_1 >> $@ @cat assets/cartridge/header-seg1.bin >> $@ - @cat build/padding_8_KB >> $@ + @cat build/padding/8_KB >> $@ @cat assets/cartridge/header-seg2.bin >> $@ @cat $(DIR_GENCRT)/kernal.seg_1 >> $@ @cat assets/cartridge/header-seg3.bin >> $@ - @cat build/padding_8_KB >> $@ + @cat build/padding/8_KB >> $@ @echo -$(TARGET_U64CRT_X): $(SEG_LIST_U64CRT) $(CRT_BIN_LIST) build/padding_8_KB +$(TARGET_U64CRT_X): $(SEG_LIST_U64CRT) $(CRT_BIN_LIST) build/padding/8_KB @echo @echo @echo @@ -746,11 +748,11 @@ $(TARGET_U64CRT_X): $(SEG_LIST_U64CRT) $(CRT_BIN_LIST) build/padding_8_KB @cat assets/cartridge/header-seg0.bin >> $@ @cat $(DIR_U64CRT)/basic.seg_1 >> $@ @cat assets/cartridge/header-seg1.bin >> $@ - @cat build/padding_8_KB >> $@ + @cat build/padding/8_KB >> $@ @cat assets/cartridge/header-seg2.bin >> $@ @cat $(DIR_U64CRT)/kernal.seg_1 >> $@ @cat assets/cartridge/header-seg3.bin >> $@ - @cat build/padding_8_KB >> $@ + @cat build/padding/8_KB >> $@ @echo # Rules - MEGA65 platform specific @@ -767,43 +769,43 @@ $(TARGET_U64CRT_X): $(SEG_LIST_U64CRT) $(CRT_BIN_LIST) build/padding_8_KB # $1:$2000 - 24 KB - Z80 Virtual Machine for CP/M # $1:$8000 - 32 KB - unused for now, padding; most likely will be used for BASIC extensions -$(TARGET_M65_x_ORF) $(TARGET_M65_x_PXL): $(SEG_LIST_M65) build/padding_16_KB $(TARGET_CHR_ORF) build/chargen_openroms.patched $(TARGET_CHR_PXL) build/chargen_pxlfont.patched +$(TARGET_M65_x_ORF) $(TARGET_M65_x_PXL): $(SEG_LIST_M65) build/padding/16_KB $(TARGET_CHR_ORF) build/patched_chargen/openroms.pcg $(TARGET_CHR_PXL) build/patched_chargen/pxlfont.pcg @echo @echo @echo @echo //------------------------------------------------------------------------------------------- @echo // Making ROM image for MEGA65 - with Open ROMs chargen @echo //------------------------------------------------------------------------------------------- - @cat $(DIR_M65)/dos.seg_1 > $(TARGET_M65_x_ORF) - @cat $(DIR_M65)/kernal.seg_1 >> $(TARGET_M65_x_ORF) - @cat $(DIR_M65)/basic.seg_1 >> $(TARGET_M65_x_ORF) - @cat build/chargen_openroms.patched >> $(TARGET_M65_x_ORF) - @cat $(DIR_M65)/basic.seg_0 >> $(TARGET_M65_x_ORF) - @cat $(DIR_M65)/kernal.seg_C >> $(TARGET_M65_x_ORF) - @cat $(TARGET_CHR_ORF) >> $(TARGET_M65_x_ORF) - @cat $(DIR_M65)/kernal.seg_0 >> $(TARGET_M65_x_ORF) - @cat $(DIR_M65)/mon.seg_1 >> $(TARGET_M65_x_ORF) - @cat $(DIR_M65)/zvm.seg_1 >> $(TARGET_M65_x_ORF) - @cat build/padding_16_KB >> $(TARGET_M65_x_ORF) - @cat build/padding_16_KB >> $(TARGET_M65_x_ORF) + @cat $(DIR_M65)/dos.seg_1 > $(TARGET_M65_x_ORF) + @cat $(DIR_M65)/kernal.seg_1 >> $(TARGET_M65_x_ORF) + @cat $(DIR_M65)/basic.seg_1 >> $(TARGET_M65_x_ORF) + @cat build/patched_chargen/openroms.pcg >> $(TARGET_M65_x_ORF) + @cat $(DIR_M65)/basic.seg_0 >> $(TARGET_M65_x_ORF) + @cat $(DIR_M65)/kernal.seg_C >> $(TARGET_M65_x_ORF) + @cat $(TARGET_CHR_ORF) >> $(TARGET_M65_x_ORF) + @cat $(DIR_M65)/kernal.seg_0 >> $(TARGET_M65_x_ORF) + @cat $(DIR_M65)/mon.seg_1 >> $(TARGET_M65_x_ORF) + @cat $(DIR_M65)/zvm.seg_1 >> $(TARGET_M65_x_ORF) + @cat build/padding/16_KB >> $(TARGET_M65_x_ORF) + @cat build/padding/16_KB >> $(TARGET_M65_x_ORF) @echo @echo @echo @echo //------------------------------------------------------------------------------------------- @echo // Making ROM image for MEGA65 - with PXL font chargen @echo //------------------------------------------------------------------------------------------- - @cat $(DIR_M65)/dos.seg_1 > $(TARGET_M65_x_PXL) - @cat $(DIR_M65)/kernal.seg_1 >> $(TARGET_M65_x_PXL) - @cat $(DIR_M65)/basic.seg_1 >> $(TARGET_M65_x_PXL) - @cat build/chargen_pxlfont.patched >> $(TARGET_M65_x_PXL) - @cat $(DIR_M65)/basic.seg_0 >> $(TARGET_M65_x_PXL) - @cat $(DIR_M65)/kernal.seg_C >> $(TARGET_M65_x_PXL) - @cat $(TARGET_CHR_PXL) >> $(TARGET_M65_x_PXL) - @cat $(DIR_M65)/kernal.seg_0 >> $(TARGET_M65_x_PXL) - @cat $(DIR_M65)/mon.seg_1 >> $(TARGET_M65_x_PXL) - @cat $(DIR_M65)/zvm.seg_1 >> $(TARGET_M65_x_PXL) - @cat build/padding_16_KB >> $(TARGET_M65_x_PXL) - @cat build/padding_16_KB >> $(TARGET_M65_x_PXL) + @cat $(DIR_M65)/dos.seg_1 > $(TARGET_M65_x_PXL) + @cat $(DIR_M65)/kernal.seg_1 >> $(TARGET_M65_x_PXL) + @cat $(DIR_M65)/basic.seg_1 >> $(TARGET_M65_x_PXL) + @cat build/patched_chargen/pxlfont.pcg >> $(TARGET_M65_x_PXL) + @cat $(DIR_M65)/basic.seg_0 >> $(TARGET_M65_x_PXL) + @cat $(DIR_M65)/kernal.seg_C >> $(TARGET_M65_x_PXL) + @cat $(TARGET_CHR_PXL) >> $(TARGET_M65_x_PXL) + @cat $(DIR_M65)/kernal.seg_0 >> $(TARGET_M65_x_PXL) + @cat $(DIR_M65)/mon.seg_1 >> $(TARGET_M65_x_PXL) + @cat $(DIR_M65)/zvm.seg_1 >> $(TARGET_M65_x_PXL) + @cat build/padding/16_KB >> $(TARGET_M65_x_PXL) + @cat build/padding/16_KB >> $(TARGET_M65_x_PXL) @echo # Rules - platform 'Commander X16' specific From 0011b3eacf24c26984ac1b930a18dcb04b4a4c3b Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sat, 13 Mar 2021 22:25:23 +0100 Subject: [PATCH 25/32] added some missing floppy code --- src/dos_m65/filesystem_cbm/fs_cbm_read_file.s | 1 + src/dos_m65/unit_floppy/unit_fd_cmd_open.s | 17 +++++++++++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/dos_m65/filesystem_cbm/fs_cbm_read_file.s b/src/dos_m65/filesystem_cbm/fs_cbm_read_file.s index 62199396..9f7e22bc 100644 --- a/src/dos_m65/filesystem_cbm/fs_cbm_read_file.s +++ b/src/dos_m65/filesystem_cbm/fs_cbm_read_file.s @@ -50,6 +50,7 @@ fs_cbm_read_file_open: ; Found the file - load it, start from fetching initial track/sector + inc $D020 diff --git a/src/dos_m65/unit_floppy/unit_fd_cmd_open.s b/src/dos_m65/unit_floppy/unit_fd_cmd_open.s index 0de83174..68bd9821 100644 --- a/src/dos_m65/unit_floppy/unit_fd_cmd_open.s +++ b/src/dos_m65/unit_floppy/unit_fd_cmd_open.s @@ -34,9 +34,22 @@ unit_fd_cmd_OPEN_EOI: unit_fd_cmd_OPEN_file: - ; XXX provide implementation + ; Copy the filter from command XXX this should be moved to common part and deduplicated with directory opening + + ldy #$00 +@lp1: + lda FD_CMDFN_BUF, y + cmp #$A0 + beq @lp1_end + sta PAR_FPATTERN, y + iny + cpy #$10 + bne @lp1 + +@lp1_end: + + jmp fs_cbm_read_file_open - jmp dos_EXIT_CLC unit_fd_cmd_OPEN_dir: From 9eb00c675d8c8adb1a3610d838b07d1feb17414b Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Tue, 16 Mar 2021 21:46:00 +0100 Subject: [PATCH 26/32] file loading from floppy image should be complete, but not yet tested --- .../filesystem_cbm/fs_cbm_nextdirentry.s | 9 +- src/dos_m65/filesystem_cbm/fs_cbm_read_file.s | 109 ++++++++++++++++-- 2 files changed, 107 insertions(+), 11 deletions(-) diff --git a/src/dos_m65/filesystem_cbm/fs_cbm_nextdirentry.s b/src/dos_m65/filesystem_cbm/fs_cbm_nextdirentry.s index 20080bb2..c6734b2f 100644 --- a/src/dos_m65/filesystem_cbm/fs_cbm_nextdirentry.s +++ b/src/dos_m65/filesystem_cbm/fs_cbm_nextdirentry.s @@ -49,7 +49,14 @@ fs_cbm_nextdirentry: ; XXX most likely copying is not necessary (compare all CBM and CMD filesystems) - ; XXX just make the hypervisor file system emulate these structures - ldy #$02 ; start from determining file type + ldy #$00 ; start from getting track and sector of file beginning + jsr code_LDA_nnnn_Y + sta FD_LOADTRACK + iny + jsr code_LDA_nnnn_Y + sta FD_LOADSECTOR + + iny ; determining file type jsr code_LDA_nnnn_Y beq fs_cbm_nextdirentry ; ignore deleted files (but allow DEL files in some cases) diff --git a/src/dos_m65/filesystem_cbm/fs_cbm_read_file.s b/src/dos_m65/filesystem_cbm/fs_cbm_read_file.s index 9f7e22bc..e22d3ae6 100644 --- a/src/dos_m65/filesystem_cbm/fs_cbm_read_file.s +++ b/src/dos_m65/filesystem_cbm/fs_cbm_read_file.s @@ -48,19 +48,108 @@ fs_cbm_read_file_open: jsr util_dir_filter bne @lp_find ; if does not match, try the next entry - ; Found the file - load it, start from fetching initial track/sector + ; Found the file, load it - inc $D020 + lda FD_LOADTRACK + sta PAR_TRACK + lda FD_LOADSECTOR + sta PAR_SECTOR - - - - ; XXX provide implementation, use FD_LOADTRACK and FD_LOADSECTOR - - jmp dos_EXIT_SEC + bra fs_cbm_read_file_got_ts fs_cbm_read_file: - ; XXX provide implementation + ; Fetch the next track/sector - jmp dos_EXIT_SEC + lda FD_LOADSECTOR + and #$01 + bne @part_2 + +@part_1: + + ; We were reading from the 1st half of the buffer + + lda SHARED_BUF_1+1 + sta PAR_SECTOR + lda SHARED_BUF_1+0 + bra @common_chk + +@part_2: + + ; We were reading from the 2nd half of the buffer + + lda SHARED_BUF_1+$100+1 + sta PAR_SECTOR + lda SHARED_BUF_1+$100+0 + +@common_chk: + + bne @common_load + + lda #$00 ; end of file + sec + rts + +@common_load: + + sta PAR_TRACK + + ; FALLTROUGH + +fs_cbm_read_file_got_ts: + + ; Load next track/sector + + jsr lowlevel_readsector ; XXX handle read errors + + ; Store pointer and amount of data ready to fetch + + lda #$FE + sta FD_ACPTR_LEN+0 + lda #$00 + sta FD_ACPTR_LEN+1 + + lda #$02 + sta FD_ACPTR_PTR+0 + lda #>SHARED_BUF_1 + sta FD_ACPTR_PTR+1 + + lda PAR_SECTOR + and #$01 + bne @part_2 + +@part_1: + + ; Sector with data is located in the 1st half of the buffer + + lda SHARED_BUF_1+0 + beq @exit + + ; Less than a full sector is used + + lda SHARED_BUF_1+1 + bra @not_full_buf + +@part_2: + + ; Sector with data is located in the 2nd half of the buffer + + inc FD_ACPTR_PTR+1 + + lda SHARED_BUF_1+$100+0 + beq @exit + + ; Less than a full sector is used + + lda SHARED_BUF_1+$100+0 + +@not_full_buf: + + sta FD_ACPTR_LEN+0 + + ; FALLTROUGH + +@exit: + + clc + rts From 3c48d2eaf477e9cee978b5998a6fc7d3c1867d25 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Wed, 17 Mar 2021 21:23:11 +0100 Subject: [PATCH 27/32] fix for start track/sector retrieval --- .../filesystem_cbm/fs_cbm_nextdirentry.s | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/dos_m65/filesystem_cbm/fs_cbm_nextdirentry.s b/src/dos_m65/filesystem_cbm/fs_cbm_nextdirentry.s index c6734b2f..1762546d 100644 --- a/src/dos_m65/filesystem_cbm/fs_cbm_nextdirentry.s +++ b/src/dos_m65/filesystem_cbm/fs_cbm_nextdirentry.s @@ -49,14 +49,7 @@ fs_cbm_nextdirentry: ; XXX most likely copying is not necessary (compare all CBM and CMD filesystems) - ; XXX just make the hypervisor file system emulate these structures - ldy #$00 ; start from getting track and sector of file beginning - jsr code_LDA_nnnn_Y - sta FD_LOADTRACK - iny - jsr code_LDA_nnnn_Y - sta FD_LOADSECTOR - - iny ; determining file type + ldy #$02 ; determining file type jsr code_LDA_nnnn_Y beq fs_cbm_nextdirentry ; ignore deleted files (but allow DEL files in some cases) @@ -67,14 +60,21 @@ fs_cbm_nextdirentry: stx PAR_FTYPE - ldy #$1E ; now get file size in blocks + ldy #$1E ; get file size in blocks jsr code_LDA_nnnn_Y sta PAR_FSIZE_BLOCKS+0 iny jsr code_LDA_nnnn_Y sta PAR_FSIZE_BLOCKS+1 - ldy #$05 ; copy the file name + ldy #$03 ; get file starting track and sector + jsr code_LDA_nnnn_Y + sta FD_LOADTRACK + iny + jsr code_LDA_nnnn_Y + sta FD_LOADSECTOR + + iny ; copy the file name @lp1: jsr code_LDA_nnnn_Y sta PAR_FNAME-5,y From c2aabb19574a3d222632392f852191c790f50fd8 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Thu, 18 Mar 2021 22:57:14 +0100 Subject: [PATCH 28/32] loading from D81 starts working, end of file still broken --- src/dos_m65/filesystem_cbm/fs_cbm_read_file.s | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/dos_m65/filesystem_cbm/fs_cbm_read_file.s b/src/dos_m65/filesystem_cbm/fs_cbm_read_file.s index e22d3ae6..1950cdf2 100644 --- a/src/dos_m65/filesystem_cbm/fs_cbm_read_file.s +++ b/src/dos_m65/filesystem_cbm/fs_cbm_read_file.s @@ -50,6 +50,9 @@ fs_cbm_read_file_open: ; Found the file, load it + lda #$03 ; mode: read file + sta FD_MODE + lda FD_LOADTRACK sta PAR_TRACK lda FD_LOADSECTOR From 58d74157d372aaec99ab096eba2d1bbd05321ba3 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Fri, 19 Mar 2021 17:24:48 +0100 Subject: [PATCH 29/32] more file loading bugfixes --- src/dos_m65/filesystem_cbm/fs_cbm_read_file.s | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/dos_m65/filesystem_cbm/fs_cbm_read_file.s b/src/dos_m65/filesystem_cbm/fs_cbm_read_file.s index 1950cdf2..9e698758 100644 --- a/src/dos_m65/filesystem_cbm/fs_cbm_read_file.s +++ b/src/dos_m65/filesystem_cbm/fs_cbm_read_file.s @@ -64,7 +64,7 @@ fs_cbm_read_file: ; Fetch the next track/sector - lda FD_LOADSECTOR + lda PAR_SECTOR and #$01 bne @part_2 @@ -72,8 +72,7 @@ fs_cbm_read_file: ; We were reading from the 1st half of the buffer - lda SHARED_BUF_1+1 - sta PAR_SECTOR + ldx SHARED_BUF_1+1 lda SHARED_BUF_1+0 bra @common_chk @@ -81,8 +80,7 @@ fs_cbm_read_file: ; We were reading from the 2nd half of the buffer - lda SHARED_BUF_1+$100+1 - sta PAR_SECTOR + ldx SHARED_BUF_1+$100+1 lda SHARED_BUF_1+$100+0 @common_chk: @@ -96,6 +94,7 @@ fs_cbm_read_file: @common_load: sta PAR_TRACK + stx PAR_SECTOR ; FALLTROUGH From 8ae047b6823a87fb02bcb2bca8b7b3d9c0644881 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sun, 21 Mar 2021 17:35:22 +0100 Subject: [PATCH 30/32] small CBDOS refactoring --- .../filesystem_cbm/fs_cbm_nextfileblock.s | 101 ++++++++++++++++++ src/dos_m65/filesystem_cbm/fs_cbm_read_file.s | 95 +--------------- .../filesystem_vfs/fs_vfs_nextfileblock.s | 80 ++++++++++++++ src/dos_m65/filesystem_vfs/fs_vfs_read_file.s | 76 +------------ src/dos_m65/unit_floppy/unit_fd_cmd_read.s | 2 +- src/dos_m65/unit_sdcard/unit_sd_cmd_read.s | 2 +- 6 files changed, 185 insertions(+), 171 deletions(-) create mode 100644 src/dos_m65/filesystem_cbm/fs_cbm_nextfileblock.s create mode 100644 src/dos_m65/filesystem_vfs/fs_vfs_nextfileblock.s diff --git a/src/dos_m65/filesystem_cbm/fs_cbm_nextfileblock.s b/src/dos_m65/filesystem_cbm/fs_cbm_nextfileblock.s new file mode 100644 index 00000000..135af7db --- /dev/null +++ b/src/dos_m65/filesystem_cbm/fs_cbm_nextfileblock.s @@ -0,0 +1,101 @@ + +; +; CBM/CMD filesystem - helper routine to get the next file block +; + + +fs_cbm_nextfileblock: + + ; Fetch the next track/sector + + lda PAR_SECTOR + and #$01 + bne @part_2 + +@part_1: + + ; We were reading from the 1st half of the buffer + + ldx SHARED_BUF_1+1 + lda SHARED_BUF_1+0 + bra @common_chk + +@part_2: + + ; We were reading from the 2nd half of the buffer + + ldx SHARED_BUF_1+$100+1 + lda SHARED_BUF_1+$100+0 + +@common_chk: + + bne @common_load + + lda #$00 ; end of file + sec + rts + +@common_load: + + sta PAR_TRACK + stx PAR_SECTOR + + ; FALLTROUGH + +fs_cbm_nextfileblock_got_ts: + + ; Load next track/sector + + jsr lowlevel_readsector ; XXX handle read errors + + ; Store pointer and amount of data ready to fetch + + lda #$FE + sta FD_ACPTR_LEN+0 + lda #$00 + sta FD_ACPTR_LEN+1 + + lda #$02 + sta FD_ACPTR_PTR+0 + lda #>SHARED_BUF_1 + sta FD_ACPTR_PTR+1 + + lda PAR_SECTOR + and #$01 + bne @part_2 + +@part_1: + + ; Sector with data is located in the 1st half of the buffer + + lda SHARED_BUF_1+0 + beq @exit + + ; Less than a full sector is used + + lda SHARED_BUF_1+1 + bra @not_full_buf + +@part_2: + + ; Sector with data is located in the 2nd half of the buffer + + inc FD_ACPTR_PTR+1 + + lda SHARED_BUF_1+$100+0 + beq @exit + + ; Less than a full sector is used + + lda SHARED_BUF_1+$100+0 + +@not_full_buf: + + sta FD_ACPTR_LEN+0 + + ; FALLTROUGH + +@exit: + + clc + rts diff --git a/src/dos_m65/filesystem_cbm/fs_cbm_read_file.s b/src/dos_m65/filesystem_cbm/fs_cbm_read_file.s index 9e698758..ea9c1329 100644 --- a/src/dos_m65/filesystem_cbm/fs_cbm_read_file.s +++ b/src/dos_m65/filesystem_cbm/fs_cbm_read_file.s @@ -58,100 +58,7 @@ fs_cbm_read_file_open: lda FD_LOADSECTOR sta PAR_SECTOR - bra fs_cbm_read_file_got_ts + jmp fs_cbm_nextfileblock_got_ts -fs_cbm_read_file: - ; Fetch the next track/sector - lda PAR_SECTOR - and #$01 - bne @part_2 - -@part_1: - - ; We were reading from the 1st half of the buffer - - ldx SHARED_BUF_1+1 - lda SHARED_BUF_1+0 - bra @common_chk - -@part_2: - - ; We were reading from the 2nd half of the buffer - - ldx SHARED_BUF_1+$100+1 - lda SHARED_BUF_1+$100+0 - -@common_chk: - - bne @common_load - - lda #$00 ; end of file - sec - rts - -@common_load: - - sta PAR_TRACK - stx PAR_SECTOR - - ; FALLTROUGH - -fs_cbm_read_file_got_ts: - - ; Load next track/sector - - jsr lowlevel_readsector ; XXX handle read errors - - ; Store pointer and amount of data ready to fetch - - lda #$FE - sta FD_ACPTR_LEN+0 - lda #$00 - sta FD_ACPTR_LEN+1 - - lda #$02 - sta FD_ACPTR_PTR+0 - lda #>SHARED_BUF_1 - sta FD_ACPTR_PTR+1 - - lda PAR_SECTOR - and #$01 - bne @part_2 - -@part_1: - - ; Sector with data is located in the 1st half of the buffer - - lda SHARED_BUF_1+0 - beq @exit - - ; Less than a full sector is used - - lda SHARED_BUF_1+1 - bra @not_full_buf - -@part_2: - - ; Sector with data is located in the 2nd half of the buffer - - inc FD_ACPTR_PTR+1 - - lda SHARED_BUF_1+$100+0 - beq @exit - - ; Less than a full sector is used - - lda SHARED_BUF_1+$100+0 - -@not_full_buf: - - sta FD_ACPTR_LEN+0 - - ; FALLTROUGH - -@exit: - - clc - rts diff --git a/src/dos_m65/filesystem_vfs/fs_vfs_nextfileblock.s b/src/dos_m65/filesystem_vfs/fs_vfs_nextfileblock.s new file mode 100644 index 00000000..e787af5f --- /dev/null +++ b/src/dos_m65/filesystem_vfs/fs_vfs_nextfileblock.s @@ -0,0 +1,80 @@ + +; +; Hypervisor virtual filesystem - helper routine to get the next file block +; + + +fs_vfs_nextfileblock: + + ; Read chunk of data to SD card buffer + + ldx SD_DESC + lda #$1A ; dos_readfile + sta HTRAP00 + +nop + + ; XXX check error code + + ; Store number of bytes read + + stx SD_ACPTR_LEN+0 + sty SD_ACPTR_LEN+1 + + ; Check if any data was read + + tya + ora SD_ACPTR_LEN+0 + bne @copy + + lda #$20 ; dos_closefile + sta HTRAP00 + +nop + + lda #$00 + sec + rts + +@copy: + + ; Set pointer to new data + + lda #SHARED_BUF_0 + sta SD_ACPTR_PTR+1 + + ; Copy data to SHARED_BUF_0 + + lda #%10000000 ; select SD card buffer + tsb SD_BUFCTL + + ; Copy data using DMA job + + lda #$00 + sta DMAJOB_DST_MB + lda #<(SHARED_BUF_0 - $8000) + sta DMAJOB_DST_ADDR+0 + lda #>(SHARED_BUF_0 - $8000) + sta DMAJOB_DST_ADDR+1 + lda #$01 + sta DMAJOB_DST_ADDR+2 + + jsr util_dma_launch_from_hwbuf ; execute DMA job + + clc + rts + +fs_vfs_file_not_found: + + jsr fs_vfs_direntmem_restore ; restore $1000 memory content + + ldx SD_DESC + lda #$16 ; dos_closedir + sta HTRAP00 + +nop + + lda #39 ; file not found error + jsr util_status_SD + + lda #K_ERR_FILE_NOT_FOUND + jmp dos_EXIT_SEC_A diff --git a/src/dos_m65/filesystem_vfs/fs_vfs_read_file.s b/src/dos_m65/filesystem_vfs/fs_vfs_read_file.s index db97b15f..bf7ee626 100644 --- a/src/dos_m65/filesystem_vfs/fs_vfs_read_file.s +++ b/src/dos_m65/filesystem_vfs/fs_vfs_read_file.s @@ -62,80 +62,6 @@ fs_vfs_read_file_open: lda #$03 ; mode: read file sta SD_MODE - jsr fs_vfs_read_file + jsr fs_vfs_nextfileblock jmp dos_EXIT -fs_vfs_read_file: - - ; Read chunk of data to SD card buffer - - ldx SD_DESC - lda #$1A ; dos_readfile - sta HTRAP00 - +nop - - ; XXX check error code - - ; Store number of bytes read - - stx SD_ACPTR_LEN+0 - sty SD_ACPTR_LEN+1 - - ; Check if any data was read - - tya - ora SD_ACPTR_LEN+0 - bne @copy - - lda #$20 ; dos_closefile - sta HTRAP00 - +nop - - lda #$00 - sec - rts - -@copy: - - ; Set pointer to new data - - lda #SHARED_BUF_0 - sta SD_ACPTR_PTR+1 - - ; Copy data to SHARED_BUF_0 - - lda #%10000000 ; select SD card buffer - tsb SD_BUFCTL - - ; Copy data using DMA job - - lda #$00 - sta DMAJOB_DST_MB - lda #<(SHARED_BUF_0 - $8000) - sta DMAJOB_DST_ADDR+0 - lda #>(SHARED_BUF_0 - $8000) - sta DMAJOB_DST_ADDR+1 - lda #$01 - sta DMAJOB_DST_ADDR+2 - - jsr util_dma_launch_from_hwbuf ; execute DMA job - - clc - rts - -fs_vfs_file_not_found: - - jsr fs_vfs_direntmem_restore ; restore $1000 memory content - - ldx SD_DESC - lda #$16 ; dos_closedir - sta HTRAP00 - +nop - - lda #39 ; file not found error - jsr util_status_SD - - lda #K_ERR_FILE_NOT_FOUND - jmp dos_EXIT_SEC_A diff --git a/src/dos_m65/unit_floppy/unit_fd_cmd_read.s b/src/dos_m65/unit_floppy/unit_fd_cmd_read.s index 161b346a..3dad8028 100644 --- a/src/dos_m65/unit_floppy/unit_fd_cmd_read.s +++ b/src/dos_m65/unit_floppy/unit_fd_cmd_read.s @@ -8,7 +8,7 @@ unit_fd_cmd_READ: lda FD_MODE cmp #$03 - +beq fs_cbm_read_file + +beq fs_cbm_nextfileblock lda FD_DIR_PHASE cmp #$01 diff --git a/src/dos_m65/unit_sdcard/unit_sd_cmd_read.s b/src/dos_m65/unit_sdcard/unit_sd_cmd_read.s index 2a569b80..b9fad4c1 100644 --- a/src/dos_m65/unit_sdcard/unit_sd_cmd_read.s +++ b/src/dos_m65/unit_sdcard/unit_sd_cmd_read.s @@ -8,7 +8,7 @@ unit_sd_cmd_READ: lda SD_MODE cmp #$03 - +beq fs_vfs_read_file + +beq fs_vfs_nextfileblock lda SD_DIR_PHASE cmp #$01 From 8effc8d3e0e22c4a792b13513399a82cb0ae7ed4 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Wed, 24 Mar 2021 23:18:28 +0100 Subject: [PATCH 31/32] anothed internal fdd bugfix, loading still not fully correct --- src/dos_m65/filesystem_cbm/fs_cbm_nextfileblock.s | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/dos_m65/filesystem_cbm/fs_cbm_nextfileblock.s b/src/dos_m65/filesystem_cbm/fs_cbm_nextfileblock.s index 135af7db..27403902 100644 --- a/src/dos_m65/filesystem_cbm/fs_cbm_nextfileblock.s +++ b/src/dos_m65/filesystem_cbm/fs_cbm_nextfileblock.s @@ -69,7 +69,7 @@ fs_cbm_nextfileblock_got_ts: ; Sector with data is located in the 1st half of the buffer lda SHARED_BUF_1+0 - beq @exit + bne @exit ; Less than a full sector is used @@ -83,7 +83,7 @@ fs_cbm_nextfileblock_got_ts: inc FD_ACPTR_PTR+1 lda SHARED_BUF_1+$100+0 - beq @exit + bne @exit ; Less than a full sector is used From 5ae7f19f83485bd473b5d575b84361a65443d5bc Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Thu, 25 Mar 2021 19:39:57 +0100 Subject: [PATCH 32/32] loading from D81 image works now on MEGA65 --- CONFIG.md | 6 ++++++ bin/basic_generic.rom | Bin 8192 -> 8192 bytes bin/basic_generic_crt.rom | Bin 8192 -> 8192 bytes bin/basic_ultimate64.rom | Bin 8192 -> 8192 bytes bin/extrom_generic_crt.crt | Bin 32896 -> 32896 bytes bin/kernal_generic.rom | Bin 8192 -> 8192 bytes bin/kernal_generic_crt.rom | Bin 8192 -> 8192 bytes bin/kernal_ultimate64.rom | Bin 8192 -> 8192 bytes bin/mega65.rom | Bin 131072 -> 131072 bytes bin/mega65_orfont.rom | Bin 131072 -> 131072 bytes src/,,config_mega65.s | 4 ++-- .../filesystem_cbm/fs_cbm_nextfileblock.s | 14 +++++++++++--- 12 files changed, 19 insertions(+), 5 deletions(-) diff --git a/CONFIG.md b/CONFIG.md index 9b0c565f..befc3550 100644 --- a/CONFIG.md +++ b/CONFIG.md @@ -175,6 +175,12 @@ Enable this option if you are using a tape interface adapter with some audio sig Enable this option if you are using a tape interface adapter lacking tape motor control (most likely every adapter currently being sold) - this will eliminate the need to quickly press space when the program header information gets displayed. Note: if you are using a cassette player with REM port, and your adapter is connected to this port too, than you do not need this option. +## Additional storage + +### `UNIT_SDCARD`, `UNIT_FLOPPY`, `UNIT_RAMDISK` + +MEGA65 specific pseudo-IEC devices, handled by internal DOS (work in progress). If set to 0, given unit is disabled. Otherwise - assigns IEC unit number to the given storage. + ## Sound support The original Commodore 64 had one SID sound chip installed. However, mods exists to add more of them for improved sound capabilities. Emulators and FPGA machines typically allow to simulate more than one too. Unfortunately, there is no standard regarding how these additional chips are visible in the processor address space, and there is no sane way to detect it - thus, it has to be configurable. diff --git a/bin/basic_generic.rom b/bin/basic_generic.rom index 32eca3602680fe9f000b41550a2cd29dac161222..30d54dee02bb1b977dd310c439d49cb380184865 100644 GIT binary patch delta 20 bcmZp0XmHpNBhO)MWUA-ptY_sS)Vvek_ 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 delta 9417 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 W-~|U|<)f;hC@?PC`m=))zw}SZxc9*T diff --git a/bin/mega65_orfont.rom b/bin/mega65_orfont.rom index a3c548c25463aeefb9f5ae3b601dc564c208ad0a..b106ad9afeda7327ddafcbbe6fb806aee7f897c2 100644 GIT binary patch delta 9625 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 delta 9417 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 W-~|U|<)f;hC@?PC`m=))zw}SZxc9*T diff --git a/src/,,config_mega65.s b/src/,,config_mega65.s index 77ba1b80..d9fadbe2 100644 --- a/src/,,config_mega65.s +++ b/src/,,config_mega65.s @@ -91,8 +91,8 @@ ; --- Built-in DOS configuration ;; #CONFIG# UNIT_SDCARD 28 -;; #CONFIG# UNIT_FLOPPY 29 ; work in progress -;; #CONFIG# UNIT_RAMDISK 0 ; do not change, DOS is not implemented yet +;; #CONFIG# UNIT_FLOPPY 29 +;; #CONFIG# UNIT_RAMDISK 0 ; do not change, ram disk is not implemented yet ; --- Debug options diff --git a/src/dos_m65/filesystem_cbm/fs_cbm_nextfileblock.s b/src/dos_m65/filesystem_cbm/fs_cbm_nextfileblock.s index 27403902..8d2c2803 100644 --- a/src/dos_m65/filesystem_cbm/fs_cbm_nextfileblock.s +++ b/src/dos_m65/filesystem_cbm/fs_cbm_nextfileblock.s @@ -29,13 +29,17 @@ fs_cbm_nextfileblock: @common_chk: - bne @common_load + bne fs_cbm_nextfileblock_common_load + + ; FALLTROUGH + +fs_cbm_nextfileblock_eof: lda #$00 ; end of file sec rts -@common_load: +fs_cbm_nextfileblock_common_load: sta PAR_TRACK stx PAR_SECTOR @@ -87,10 +91,14 @@ fs_cbm_nextfileblock_got_ts: ; Less than a full sector is used - lda SHARED_BUF_1+$100+0 + lda SHARED_BUF_1+$100+1 @not_full_buf: + dec + cmp #$FF + beq fs_cbm_nextfileblock_eof + sta FD_ACPTR_LEN+0 ; FALLTROUGH