From 919723032fb1bda50a8a8be50805441d7863c685 Mon Sep 17 00:00:00 2001
From: Robert Pengelly <robertapengelly@hotmail.com>
Date: Mon, 12 Aug 2024 04:51:06 +0100
Subject: [PATCH] Write data to file, bug fixes and improvements

---
 build/chimaera.img         |  Bin 368640 -> 368640 bytes
 build/chimaera.vhd         |  Bin 34120704 -> 34120704 bytes
 src/apps/hello/hello.asm   |  247 ++++++--
 src/apps/pcomm/del.asm     |  374 ++++++++++--
 src/apps/pcomm/dir.asm     |  267 +++++++-
 src/apps/pcomm/mkdir.asm   |  328 +++++++++-
 src/apps/pcomm/rmdir.asm   |  367 +++++++++--
 src/apps/pcomm/touch.asm   |  362 +++++++++--
 src/apps/pcomm/type.asm    |  387 ++++++++++--
 src/apps/pcomm/xstrcpy.asm |    6 +-
 src/kernel/file.asm        | 1173 +++++++++++++++++++++++++++++++-----
 src/kernel/int21.asm       |   19 +-
 12 files changed, 3038 insertions(+), 492 deletions(-)

diff --git a/build/chimaera.img b/build/chimaera.img
index 2979e9a6ab4ad936b400bfd86c80bf5a0f0bdb0b..1a20b316af9aa033ee77c59245a1204993a22ae1 100644
GIT binary patch
delta 9506
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

delta 6898
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

diff --git a/build/chimaera.vhd b/build/chimaera.vhd
index cb81b9896e35a529d13f514c119092e474b81155..3868ac93db139f313cd27c6f5df927a8404a7437 100644
GIT binary patch
delta 30420
zcmeHQdstIfwm;_tk{t~J<Wb%vA`w)ML>(0&5flPega8%@AZYD#rkzfC=-jqf(wkN}
zhBD6daayMjDQ%t7cE&0dG@XJ*MXLBfYPD#cR@>PzS|3<MMRM0UNdT2vzxnQW|2ll%
zdF-|KUVELje*3rA-uVOL-gkYBaBXTKJ-p3>k8b&#T%+)K{0O|IkFOVbwm1mlkuB$=
z^N~wPcg*lfBM3qVS2|q%4u|*4isky~B~U1Zs|>ECa4m!DLAaK~^$=VS!}W;i$>nRF
zTu#D8!6jm!T<-C^%@6vJ|Hmp{dj!d=7pi0inSmg<CyWh$^RlxSE1Z8mPPw~Y#MkR`
z)6z0ia}{}pJjJc`V!|*9Bx$)>X_<;q>ca?8K0(aSUbHABD^&qc1>wsN>>eP4s7l&G
zQV)`^J%;3qMw;dvnx<WbDHOMv##=_XO@mgq)q8;2_j$G1Bh`BF{eD^PtzSG}mwww9
zdlD6(xPjdI1d>dp!V+2OUlB{0=CE%+g&uB}yorL4%rc{{ttEv}ci~TGu#?|Iq0}og
z*o^nkDSyword=L(--z17b;tED>H74zSIZ{8k0$zksf8Mom0DmwZPxYGwc$S{G*`Wk
zG$eI1oo)I6O{hMtHS0X^N7_wua0R?lc!L&?yMeuLY*OF{wYW@+OSIUat=)^)XhD>%
z#hF^XK#O(S+GDtq6D4VJf)>xz;_2GjHoS}z#cHuii=(typ{+fHvp7+p7W-+jj~07z
zqnO&ncorwFc4+W`24B<QK8;yNaD86A4sxu)KWOmx8hlE_T!cO#`bvYlH29zf@7FN>
z___u}J2kjfgFn~cZJI*p0+LM{{D}rPYVbyo9OWc$Yw%w+_;n3_6(qYjNv#Gm8oXMA
zO`1YE-mJkBu4CnO+N1@aoY{yPsg0WEb$>(6lChVRbyjr`ZI<^cSz|StOu@5y6AGd(
zDcLtRf%npA2~MFU>NXW4p&jy{m64LtvLZvVx~<=umy?@cAdbLqOs|kdO3F$>+#({b
zSqt*;#wq0yxL93WRvygk$rIP^tFtmz)!J+%Del`5ROw@<ip$(xDCmN{9m6_2K%j3i
zazLQop2#MBiq@cjiKQRW^<e+LPf<u%ud>{?c5mG=vE`C756_y$p(DI@4{eSByUESS
zpZZzJ-nSXWl4WelW~Apn=jF}FR2|~7xm`C%5GvDivxzE^?PH|ufQQzT$v?|vol}`p
zwJP)CWL4tg)Rp77d!@)0OsNu6=dBdkd?;~&US-alrgqTvtgNmrzOA>huuQ^<u3loS
z%C1UsKB$-nDpFm-9h@+QDZNs?W*=0|fvO~?UHY}sQI$hG0%HOyM7D8=(OqZq2NvYz
zSR9UR{SK&@5@0A+G0>h_oRr74RDl56{wNXW<;0(-*UG&E;G4k;2qF%+Y$%r4gPdxV
zJ(Y6kFe#v1;>fzPU||(D>#m!9@&}Y1l?L~i??~8hK0~21rjMp>^CeKn>}9^W#T=KB
zRSj&&RumR6O>&1B4_#sxZbdrsW%h$66y@E2u~<Ua&j?VqRqA0FcE?r}Or>9BPi#eT
z)%6!)jCS1>f^Y`J?RnmpoYRsS-H*3A(<Q~DN5PzRj*n$0ITS@_T)yT)5qm8$>s+}A
z8YSv*#j{Mc)g29Rmly9Y@a|v8g;f`v-<dCt$QkMQ3Q`Y{&rz96bahtOmxJeXFBo#n
zE6(=5XMjmi7@KvD%o-%K&JH)&e!&3qMnz_7Ri?$sgssrQ4_wXRz$!hW?5WCg$0UGs
z4t*O89J(u`AtBszw9sW<;E?c?Q;`z|l>L%>ge^o~jy{(;!tAK#Fp)n16;lF=3Jt}-
zH1bFneC#pWh&?~Sh@7|doOe=noVT4*!%$WT9&>vqCvRv-RX}mIp*(sNZ~f_~TfG%G
z$d}#V;HIUFo0e69+?*`;845K6vyS0rUFtkW*9VVOM%NFIIq+fdNMdvY@VFnQUnUrs
zrD7NDL*pp(d3IwH8t;Aayc?-N25*a;NS%A0N9v3>&f9WC(Ahby6Bj4*%#aMs5J`d+
zTEI;pV6J42YHUdo#8YG&FJcovLkiZk1)Un#uKS53Y<d!&1i?d>o%9)+Ud?1(;p`iY
z5O$0Xgwas&8aY}_cH0dLeuWTxAo?Q-A&Wi!844Sn50=^Qfe*eT?%)GIJI@EyytBNU
zWgE}B-CSA7`#AKPt@U5vyELRSKQP9$>L;=siF8*?U4&iC{(CDLACq>LTPsxUsWV9e
z78%p7kbbjnaEbMHX|uW+JwQ@(adS-znoUujKQ`~&j`~Sz>RI;iK{SQMpQB4YIf*o*
z%1)#k^5BJjAd$8G6V3Kq8f*DyEUWqgC5O+C#jlT#EG(eg#g>H>feqvNHxHr=Tfb$e
zu0c`N#DQ4qNUWqM77fHo=S~`<pCqrE9K2<6NXz7C>*PttCr>Gu62EIo!oDeUg5nZi
zq?5|kn!xGWxzp#SO;6U&NLl`yc?~nuKb)C?W-XA<y5E1+!jM^+pUuj8X?FJRga?=(
z%EiV<#DjJZW0sg)axlKl_Pv+B<`Aw{79ONG+=!i|Xsbl@9`TJ>!tND+rZZ5{R^>_8
zsBXkINe&Y92Cch+b`qQ2id18Hff#ydCp8;eQM)L3)k)PJ&mRm$g}`4oP8Lf_T_j!V
z#C_&T_E{^MLTx<R{Gk=yM^drhJ6-tGE;NRUSF_i5AqDpg+l?NNi&t05RL1{ylvH`D
z_M|z8{0MG!ZYd%3E%9nSZVH73I<iy=Mz%ti&AZV=u4~V3RLVUQ_n@_pGDorF3e2L1
zN#<$`rNJ3LR3tMi2AEZYIrvnN0csWk`Qo2_;Y~;44+4t{%VEtX@g6xyW|HO=1LjqO
zTu=EAAc!GtGq?$)?lNJ~Hj23V9b={IAq}A05fkQfoJ(lZLg4a;D-5m(rz@(Dvq#zy
zP3<}6{C?$eR=pR6E!x`WN>@y~#`G_-ZR~r%l}W@qYOG*;NpHD?xr#qJZTH}EAXnoh
zwpD#tecJZNq2`c;L5j70FB;F~Bwy@BtEhjRbb7Y>OC%lF$0-nxP*Baj*nt#dt_3cz
zUv_r>M~AcXkq+p*{={(SWrt6fi|yXGbbsuM+Z1MRzpdyBV9Rt4*n-d8z;5{^a25ie
z<D&22jU3Hqb!{rsTrN@SVb6bw;>Z{_bRUWqsXKDm<b5d8=kc$Gq4eWd#S->ZJ6JgD
zE2jtl@)f&d9|{SK?H%%<7(5u#i}!wK^Jg#ZL#1;+yNnlk+5T}E_j=hryo{sewuZ|9
zaY+kFT(iA?+3jn6o)}Edx=<d*TveIVDagapJ@oh@TelxYkcI3g`_ZIiG6NDt5qI<C
zZjy|T>=GQ~LvL`T_q%;zLzm;v&<&1s+8lTjZjd$(=fU@NB4v!9SM4#_O~|}Pq`v$%
zqa9kyVD*ReFEK){W0!WK7}Clzok$ybGaWxKQ}@(aEj5J7F_riA7`Lyp`q|T+=mTm;
zLbLe*N+qd~ues2zo06S)ovsVaNo3C5Fr7nmJ<yUFXep5EzT2Z+M|4K*(NXK$b)xfg
z*q08WpvgDWiK@UBLfjmw?%1vm>hx)%;vMR)P9M7noAz^4&*G7UXZqk3``JT>Pyki7
zpZ)hCG(BL_emrqMzYicPJzJ_XJC!)Si=BEHE%)4}wVcqh>|qo?^^?OD4?p_k!@sXo
zJhkHC@<*O{YNgj0qV@=RtU;#h9QUdC$iEuoI<r=$Q@15*<+|5iK!L2R3$3Is9b#YX
zLOcC;?{6VIAbUSd&<%9J7f#j1N06G9W^mTkwJ|@a`_v9~o4QBcq3+uLSFPo5+7@DA
zr?Q-~OD%tdJ(w4+?O?YbK?_3*5(y%BZW2K#X2VUnE`}h+YvC=*Kao{*qZ~?fkWKjt
zjb~r&hONzS4m3ky5lPMZl3jNcwNqC+Si{$7DfMaxYxx?zMfL4vi;f{Bb^l)WzmK8$
zRNY>7=P?vVWu~&1j-g0Olgf@ej$)ECQ=Moj?6;b(jV%{%q8k_3-+SJXnOZ5~xQ?!J
zivGMwVY((-v9|I1{?^RY__l3hiQYyFXnW>3nj8X9X%jQY)Q;L6bfR3QgE{s*0dIhu
zR;ZWCbmfca#F<d+J&uyNO{@AFwBAFmt0-Z297p%DV_!ltu1GtJUOgy;g4S6tp*S|b
z2aQW4GZ-tLI#?lr-4}wLlcBiZ$|H}$>kn0kO}nUTORS7;5O4^awH9igxpa_oI`-{i
z8+uS|^^b>(z^XAMT`$eR&pIl+^*n+a({ZS0q3trnP?SM8NHSm%^vobgV1srsL3Aoq
z4HN;dMmQPZc4n%EK!P@F$qaSdM;}4k2APqdYsK%&;C3?|2CZ#_4O;}yVH}yfLYQud
zU|@FP2^1I(6Od<_%HOLYag)@wZ6m1d1PR@+{SdqA1PY_V53+BbK+1{!i7F<dmQdBo
z>-d2oOng#6^>Y~ke&QzA>8k_mnG<NPFPLstk#Gxy4=~U4%xIo*5{)IP)jQdgZ_x(o
z%mVg_mjOGTr;t)~W<fuDDMT8;YEPll!O08t_-6uEE@fL}VP(3WU(@nhG8eLQ{)OJ5
zEDPBKub{MM#doNHq`uB(b55gBHhG*hc&PB@_psN2nm><|&KMHTJna-h^I>6@--vF<
zTrE=kr6H`>83;J&fI=vH(bbGEJafjW2nsW(<2l^;!R$JJX%N+uH&hTehyQ?1i?{et
zI`Xx1sFkYsYu<4VwUdt(hsU2U$bsD}>{{shR}^%^>k7Jly#h9BUV2=a0KieV(GBYr
zI3T#VP}2V;Md<VLjj#|z(Hl-GJW`sdnw_1>CTjB>{$A3lw7jXnM`-*RVPDpwAoR?)
z`8X+oJ$xDXL3{y4hpnMa{i2ltrhcm2hv~(Cq;V1Cc$S48_(_^gzkpUy@5iyN7f?``
zIS%y3bt;WF##D&mHNI0Bf2QUbp!VrF_Gzg!kbUSf3QFdzky>)4xF*iV5_vdmHdx)7
zD`CE6cJ#g%-_~f!l|Y+HHJH+pDbeGdQy`vh+xE@kYzt4(OUM-j>`RjAM6q77G7{2;
z40V?)X%N%(nE*$?B(oFN5yF0y6X@}yvtTHgC~d8o5;m(B1y{G`qHP4p9S1Z8cPeXi
z1I*EUyp(IkeK2i&j+|2!v(_W&nU&*`mX*u5DEf{}Sq9Badnmh4Qqf9TQc5|RlH!zr
zvbDMakCetua~h3FC6!^DN*Z(X*X9o}gH7q3%F-feP=F~;JK4^sULlntXv6d}7h{i^
z`cqbjZ0m@RAukl!YFN!~6jUvxA+!kR#6ur@S)skem_$^za>}<Gljusyz7R|#D#dUw
zshYbj7nyd55)S@iVwa2bcuCxFVwa2TBBnhZQUSvDn4{75ki(e~lGzZ4rj+e-b5W<V
zVj8EnpQ`e-{EyV`1#p13r=@n0<z*>mCUfuz<h<o;$wm0TCgb9pb}?gZ(sn8h%}cMK
zu@q}W(nvPUTbfjDIyXk|T3p+810)<FTz8!#v?RmX5hRN@V!%AQp<5nN2heE>=~PB?
zh(VU4a_B(-U`nQgGg`Z4!+`0Q4FTqWOphr}g&Qzqp*65Ur5|J6BVkWmM&qixWaJ7@
zP)4}{)FrzUKnLKM$OWKzJb=38di*Y&T2Z+X+l>TAx4dyhbUim_4OhcM>wpZ_6EUnO
zuEeDfvd<+}eO_)vPHVRppskvN8-I3US~Wldn}(83@bz)vtKbyf6?}bnfRB@a?zOtU
zJHgjC1io&s0vrI^$Gg$@Yv2ou<-zyRWU%NSz}M|{ckp!sMg4&bjcZrY?R7i&IM8K5
zderR&sGGIii8;I6jk#~+fVly=0l%jL(7|N+lz=ASzz+#aw->Hc;Xm}--Xg%ORJk`N
zc~0eII$YRK*LTb7j+s^s5|v}Oc@Q91bSl5^XD{@k5OR<ma|K1Kt9l)}L1^Mxj`;B4
zpRP7#gC(!=-9-4*RRgaZnXZv5MEKBE4&D`1I&iQ#@D)YEA=uok2NWmsv}}%8uc+%$
z_W?n@qNoVU;kn5GGlQ;Qr{J+A0fhG{&Q}&dUb}%+upw8`Z>!fUs=!YZVUoJ2yf{)~
z6-VUJ^{*?`T?vQaICCGY*`ORwEN1J0VKIyd6X(70;9AC72*+Ydnt^(8K}3FzzRvnZ
zak$!1V~an}vumNDG_p*h?t=8-b;X@V`A9~wY8so?k7frrO{0O1N0`Qz0Uf(YJvspY
zS;>=nG}ov#+HZJ{M*9uT(MUf%-lrHbN4qCGNj=JMnAD^E?wpg6enWH8N$Q-YKXCBm
zXI`YAi`1k2?<Dodxn_5rSHD2&(f+?e>e2oMcr2&=UP*o2cz#|LO@Kc4Ft4Kh?>?`h
z{q^_}<?y_U_8)CtC2WuO2P}tKQbPmqr;!|s`&y#?@duH(=F+HyU3(o(G)xc2so@+w
z(eIvAeDS6tzKdJRAXTh|AB(V70_WKVNJ`wvNNaI8pPw`u%9>#5fTe6cV6_ggS{a##
zADjqZ3_o2kAYo-U(40_nB*)W$(0m*p0iOVl5ixso`FQ3;cG(T&UkzPBWZOZw*N56L
zXht{GDI#+9?iHf2DAHo)mkCeHnn=57(<Gipm~Y^NMYauuIG?VsgE{v_1fg2%Q7VCz
z^J)H|!yKu{jp3k>xlv|-qmEEelZQW6aly30z!LV#4Wy#L+OPo>GZA#S)}+G7B90o$
zqisv!Cxto%EIM2#F8PASzZ*c|{_c<NiXQRNZw{a(g~8m>3TU6m&(J*BY*^MQ@^EGd
zh;N;&#r$M7-lVG3P~pr*;?Jyw{qtMk1_~?|*^D=xl5Zl|oSP`Y|69d2Iq^wCd!_i3
zPrkoukI2K<Ca`bcM4{Cs5!^>J-{#>jTo%Z<MUlX75Riq;Z=s!)_0Gzw@p-tBgD97l
z@c}0Z(h57OP0JfMJ=M7B$ws?Z9<Fh>Ag#dO+e;$mGp8)YkxVsJTjt^19g1u(3|M{_
ziKp!hhK)q6f-LvrhO(4^X*0R8cq5>Q>w~e$ZYvnTKla&H58!}4_P2v*9#tI9{(TUI
zdig?Q_~yzJxp;gydvp*@@G1_s0)Z}e5vat0=->%Iw-5lb&DotkMa6}Ko!MM=W5r%S
zvsn%l>Gx6)e(EeN$NbK~k`#iU3u-nx&_*iZH3eN0$SMHB@og?x_cp@oyG7x5OP=2h
zV3$(TS>l;=!tD5I&2LjuMzq*NMi3U!<>v`P9&&UoLHymL^G$;A@XULQAR475Btc9F
zdGty6Im>(Z8w4>qWNRov-0-=QM-U%}rG*g0H09uj1QD%T1wW<Ns7lWggwN!WOuIT7
z7y0r``xEDs*40tNOuIU2h-r;cdi;tHxY(Tyy%p+Y+83gRnf8UKJDJuPbsN)ini9C7
zc&0T*xtMnKggcpb8rSSUVcOLbeuZgQPbk3MFiY;4X?uJDE(k~YL!WzK+SL>8&a|s1
z=<!rvaHlJSSv}!)rX86+&)J@~dIB)e>}{ZzPnzG4=296SNS|>uq%v|Yjj58X*@qW<
z!!6sJtMg&@;WTeN@w-tt*+MC0tVSvg3X{m3nT^pga<A17d#&?h@7QZ~Ou`;A9xSg1
zf+JcxVur!e5i<l9Ym6Ri$BqC?dY}_5?J>h(X^*)REY_IYz`|)d9RNe|V6n!yz|s+W
zCs<B!&HfXxbj1D&SUO@0@G4IGy)Mfy%6PDJ%AwCafTbh$?qKPN)#KxwJ6&Muh`k*w
zK$vj$y}ctAKr*FiTGBQJ;VdYeaKV!RB-bWkuQATmx+4}-WAK@tQINrJuY6gpH=I5^
zco~Jb5;CJ2KPTZM?=ud*s?``b9C>5hP~@M9)8nmh>NG?Xt-j94uZkOv{HnM+BmYd?
zZIS0R6~hd1M*f*NSLBWKosnP6HTzE@Z=`=E@<zG<_W|qObL4MI_{gV?fj;*Tc_V%I
z$Qx-r&XEj9-bnvK<c%~$eyV9Uzqj6`cJFiEQA6B!sPP(4i2KTUoR2gXBaK&jV#C+=
zX|T7RyUjstH%?_gkV#`mewXb<!Ew<b$#1orVXK`<Qo+;N-}*>%NCo@3kJQ0-g-8`_
z#cBBQG;r34b1!#+Klg$Hf9~ZL^5<U8!i=GA{JEFA1%K`Zh2e8AXTf#u<u35&Ue3Y{
zDkx#-s4IvHNgOKh=U!4VYw?xlvkUB~89wP^q;L~_AmBil1_BibOeip+z=Q%53QQ<4
zp}>R!6ADZyFrmPN0uu^MC@`VGgaQ)^Oeip+z=Q%53QQ<4p}>R!6ADZyFrmPN0uu^M
zC@`VGgaQ)^Oeip+z=Q%53QQ<4p}>R!6ADZyFrmPN0uu^MC@`VGgaQ)^Oeip+z=Q%5
z3QQ<4p}>R!6ADZyFrmPN0uu^MC@`VGgaQ)^Oeip+z=Q%53QQ<4p}>R!6ADZyFya3*
u6MFc){Vt+{MVa#)?}WkIMBi;?(%B+I?6Xg;ykDUzeK0Nv{$=UM<o^OxA{*rZ

delta 28020
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
JsPt>*e*ja0AesOG

diff --git a/src/apps/hello/hello.asm b/src/apps/hello/hello.asm
index 805c24e..5f26689 100644
--- a/src/apps/hello/hello.asm
+++ b/src/apps/hello/hello.asm
@@ -19,60 +19,188 @@ _main:
     mov     bx,     offset _msg_hello
     call    _writestr
     
-    mov     ah,     HEX (39)
-    mov     dx,     offset _new_dir
-    int     HEX (21)
-    jc      .exit
-    
-    mov     ah,     HEX (3A)
-    mov     dx,     offset _new_dir
-    int     HEX (21)
-    jc      .exit
-    
-    mov     bx,     offset _msg_status
-    call    _writestr
-    
-    mov     ah,     HEX (3C)
-    mov     cx,     HEX (20)
-    mov     dx,     offset _new_file
-    int     HEX (21)
-    jc      .exit
-    
-    call    _writehex
-    call    _crlf
-    
-    mov     bx,     ax
-    
-    mov     ax,     HEX (4202)
-    mov     cx,     4096
-    xor     dx,     dx
-    int     HEX (21)
-    jc      .exit
-    
-    call    _writehex
-    call    _crlf
-    
-    mov     ah,     HEX (40)
-    xor     cx,     cx
-    xor     dx,     dx
-    int     HEX (21)
-    jc      .exit
-    
-    mov     ax,     HEX (4200)
-    mov     cx,     1000
-    xor     dx,     dx
-    int     HEX (21)
-    jc      .exit
-    
-    call    _writehex
-    call    _crlf
-    
-    mov     ah,     HEX (40)
-    xor     cx,     cx
-    xor     dx,     dx
-    int     HEX (21)
-    jc      .exit
-    
+;    mov     ax,     offset _flags
+;    push    ax
+;    
+;    mov     ax,     offset _existing_file
+;    push    ax
+;    
+;    call    _fopen
+;    add     sp,     4
+;    
+;    and     ax,     ax
+;    jz      .exit
+;    
+;    mov     cs:[_file_pointer],     ax
+;    
+;    mov     bx,     offset _msg_status
+;    call    _writestr
+;    
+;    mov     ax,     cs:[_file_pointer]
+;    push    ax
+;    
+;    mov     ax,     512
+;    push    ax
+;    
+;    mov     ax,     1
+;    push    ax
+;    
+;    mov     ax,     offset _buffer
+;    push    ax
+;    
+;    call    _fread
+;    add     sp,     8
+;    
+;    and     ax,     ax
+;    jz      .exit
+;    
+;    mov     cs:[_to_write],     ax
+;    
+;    mov     ax,     cs:[_file_pointer]
+;    push    ax
+;    
+;    call    _fclose
+;    add     sp,     2
+;    
+;    mov     bx,     offset _msg_status
+;    call    _writestr
+;    
+;    mov     ax,     offset _flags
+;    push    ax
+;    
+;    mov     ax,     offset _new_file
+;    push    ax
+;    
+;    call    _fopen
+;    add     sp,     4
+;    
+;    and     ax,     ax
+;    jz      .exit
+;    
+;    mov     cs:[_file_pointer],     ax
+;    
+;    mov     bx,     offset _msg_status
+;    call    _writestr
+;    
+;    mov     cx,     5
+;
+;.write_loop:
+;
+;    mov     ax,     cs:[_file_pointer]
+;    push    ax
+;    
+;    mov     ax,     cs:[_to_write]
+;    push    ax
+;    
+;    mov     ax,     1
+;    push    ax
+;    
+;    mov     ax,     offset _buffer
+;    push    ax
+;    
+;    call    _fwrite
+;    add     sp,     8
+;    
+;    cmp     ax,     cs:[_to_write]
+;    jne     .exit
+;    
+;    mov     bx,     offset _msg_write
+;    call    _writestr
+;    
+;    loop    .write_loop
+;    
+;    mov     ah,     HEX (3C)
+;    mov     cx,     HEX (20)
+;    mov     dx,     offset _new_file
+;    int     HEX (21)
+;    jc      .exit
+;    
+;    call    _writehex
+;    call    _crlf
+;    
+;    mov     bx,     ax
+;    
+;    mov     ax,     HEX (4202)
+;    mov     cx,     4096
+;    xor     dx,     dx
+;    int     HEX (21)
+;    jc      .exit
+;    
+;    call    _writehex
+;    call    _crlf
+;    
+;    mov     ah,     HEX (40)
+;    xor     cx,     cx
+;    xor     dx,     dx
+;    int     HEX (21)
+;    jc      .exit
+;    
+;    mov     ax,     HEX (4200)
+;    xor     cx,     cx
+;    xor     dx,     dx
+;    int     HEX (21)
+;    jc      .exit
+;    
+;    mov     ah,     HEX (40)
+;    mov     cx,     15
+;    mov     dx,     offset _msg_hello
+;    int     HEX (21)
+;    jc      .exit
+;    
+;    mov     ah,     HEX (39)
+;    mov     dx,     offset _new_dir
+;    int     HEX (21)
+;    jc      .exit
+;    
+;    mov     ah,     HEX (3A)
+;    mov     dx,     offset _new_dir
+;    int     HEX (21)
+;    jc      .exit
+;    
+;    mov     bx,     offset _msg_status
+;    call    _writestr
+;    
+;    mov     ah,     HEX (3C)
+;    mov     cx,     HEX (20)
+;    mov     dx,     offset _new_file
+;    int     HEX (21)
+;    jc      .exit
+;    
+;    call    _writehex
+;    call    _crlf
+;    
+;    mov     bx,     ax
+;    
+;    mov     ax,     HEX (4202)
+;    mov     cx,     4096
+;    xor     dx,     dx
+;    int     HEX (21)
+;    jc      .exit
+;    
+;    call    _writehex
+;    call    _crlf
+;    
+;    mov     ah,     HEX (40)
+;    xor     cx,     cx
+;    xor     dx,     dx
+;    int     HEX (21)
+;    jc      .exit
+;    
+;    mov     ax,     HEX (4200)
+;    mov     cx,     1000
+;    xor     dx,     dx
+;    int     HEX (21)
+;    jc      .exit
+;    
+;    call    _writehex
+;    call    _crlf
+;    
+;    mov     ah,     HEX (40)
+;    xor     cx,     cx
+;    xor     dx,     dx
+;    int     HEX (21)
+;    jc      .exit
+;    
 ;    mov     ah,     HEX (3C)
 ;    mov     cx,     HEX (20)
 ;    mov     dx,     offset _new_file
@@ -194,7 +322,12 @@ _main:
 ;; Data area.
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 _msg_hello:                     db      "Hello, world!",        HEX (0D),   HEX (0A),   HEX (00)
-_msg_status:                    db      "File tests",           HEX (0D),   HEX (0A),   HEX (00)
-_new_dir:                       db      "temp",                                         HEX (00)
-_new_file:                      db      "temp.txt",                                     HEX (00)
+;_msg_write:                     db      "Bytes written",        HEX (0D),   HEX (0A),   HEX (00)
+;_msg_status:                    db      "File tests",           HEX (0D),   HEX (0A),   HEX (00)
+;_new_dir:                       db      "temp",                                         HEX (00)
+;_new_file:                      db      "temp.txt",                                     HEX (00)
 ;_existing_file:                 db      "\\boot\\freeldr\\freeldr.cfg",                 HEX (00)
+;_file_pointer:                  dw      HEX (0000)
+;_flags:                         db      "w+b",      HEX (00)
+;_buffer:                        db      512     dup (0)
+;_to_write:                      dw      HEX (0000)
diff --git a/src/apps/pcomm/del.asm b/src/apps/pcomm/del.asm
index d9c086e..abd4bd1 100644
--- a/src/apps/pcomm/del.asm
+++ b/src/apps/pcomm/del.asm
@@ -1,5 +1,5 @@
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; @file            type.asm
+;; @file            del.asm
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 %ifndef     HEX
 % define        HEX(y)                  0x##y
@@ -14,7 +14,7 @@ _handler_del:
     push    bp
     
     mov     bp,     sp
-    sub     sp,     4
+    sub     sp,     6
     
     push    ax
     push    bx
@@ -25,6 +25,7 @@ _handler_del:
     push    es
     push    ds
     
+    mov     word ptr [bp - 6],      0
     mov     word ptr [bp - 4],      0
     mov     word ptr [bp - 2],      0
     
@@ -57,7 +58,7 @@ _handler_del.ok:
 _handler_del.store_arg:
 
     cmp     byte ptr [bx],      0
-    je      _handler_del.next
+    je      _handler_del.check2
     
     mov     si,     bx
     push    si
@@ -80,7 +81,7 @@ _handler_del.check:
     add     sp,     4
     
     and     ax,     ax
-    jz      _handler_del.next
+    jz      _handler_del.check2
     
     mov     bx,     ax
     mov     byte ptr [bx],      0
@@ -90,7 +91,7 @@ _handler_del.check:
 _handler_del.skip:
 
     cmp     byte ptr [bx],      0
-    je      _handler_del.next
+    je      _handler_del.check2
     
     cmp     byte ptr [bx],      ' '
     ja      _handler_del.store_arg
@@ -98,15 +99,20 @@ _handler_del.skip:
     inc     bx
     jmp     _handler_del.skip
 
+_handler_del.check2:
+
+    cmp     word ptr cs:[_vec_files + 4],   1
+    jbe     _handler_del.next
+
 _handler_del.next:
 
-    mov     ax,     word ptr [bp - 4]
+    mov     ax,     word ptr [bp - 6]
     inc     ax
     
     cmp     ax,     cs:[_vec_files + 4]
     ja      _handler_del.cleanup
     
-    mov     word ptr [bp - 4],      ax
+    mov     word ptr [bp - 6],      ax
     dec     ax
     
     xor     dx,     dx
@@ -121,107 +127,363 @@ _handler_del.next:
     mov     es,     ax
     
     mov     ax,     es:[bx]
-    mov     bx,     ax
+    mov     dx,     ax
     
     pop     es
+    
+    call    _delete_file
+    jmp     _handler_del.next
+
+_handler_del.cleanup:
+
+    mov     ax,     cs:[_vec_files + 0]
+    push    ax
+    
+    call    _free
+    add     sp,     2
+    
+    mov     ax,     cs
+    mov     es,     ax
+    
+    mov     di,     offset _vec_files
+    xor     al,     al
+    
+    mov     cx,     6
+    rep     stosb
 
-_handler_del.delete:
+_handler_del.done:
 
+    pop     ds
+    pop     es
+    pop     di
+    pop     si
+    pop     dx
+    pop     cx
+    pop     bx
+    pop     ax
+    
+    add     sp,     6
+    pop     bp
+    
+    ret
+
+;******************************************************************************
+; @function         _delete_file
+;******************************************************************************
+_delete_file:
+
+    push    ax
     push    bx
+    push    dx
+    push    ds
+    push    cx
+    
+    mov     di,     offset _file_path
+    mov     cx,     256
+    
+    xor     al,     al
+    rep     stosb
+    
+    mov     ah,     HEX (19)
+    int     HEX (21)
+    
+    mov     byte ptr [bp - 4],      al
+    mov     si,     dx
+    
+    push    si
+    
+    call    _strlen
+    add     sp,     2
+    
+    cmp     ax,     2
+    jb      _delete_file.got_drive
+    
+    cmp     byte ptr [si + 1],      ':'
+    jne     _delete_file.got_drive
+    
+    mov     al,     [si]
+    
+    cmp     al,     HEX (7A)
+    ja      _delete_file.no_adjust
+    
+    cmp     al,     HEX (61)
+    jb      _delete_file.no_adjust
+    
+    mov     bl,     HEX (20)
+    not     bl
+    
+    sub     al,     'a'
+    
+    mov     byte ptr [bp - 4],      al
+    add     si,     2
+    
+    jmp     _delete_file.got_drive
+
+_delete_file.no_adjust:
+
+    cmp     al,     HEX (5A)
+    ja      _delete_file.got_drive
+    
+    cmp     al,     HEX (41)
+    jb      _delete_file.got_drive
+    
+    sub     al,     'A'
+    
+    mov     byte ptr [bp - 4],      al
+    add     si,     2
+
+_delete_file.got_drive:
+
+    mov     di,     offset _file_path
+    
+    mov     al,     byte ptr [bp - 4]
+    add     al,     'A'
+    stosb
+    
+    mov     al,     ':'
+    stosb
+    
+    cmp     byte ptr [si],      '\\'
+    je      _delete_file.initial_setup
+    
+    mov     al,     '\\'
+    stosb
+    
+    push    dx
+    push    si
+    
+    mov     dl,     byte ptr [bp - 4]
+    mov     si,     di
+    
+    mov     ah,     HEX (47)
+    int     HEX (21)
+    
+    pop     si
+    pop     dx
+    
+    mov     di,     offset _file_path
+    push    di
+    
+    call    _strlen
+    add     sp,     2
+    
+    add     di,     ax
+
+_delete_file.initial_setup:
+
+    cmp     byte ptr es:[di - 1],   '\\'
+    je      _delete_file.no_slash
+    
+    mov     al,     '\\'
+    stosb
+
+_delete_file.no_slash:
+
+    mov     bx,     si
+
+_delete_file.loop:
+
+    mov     ax,     si
+    sub     ax,     bx
     
+    cmp     ax,     65
+    ja      _delete_file.check_path
+    
+    lodsb
+    
+    and     al,     al
+    jz      _delete_file.check_path
+    
+    cmp     al,     '.'
+    je      _delete_file.check_curr
+    
+    cmp     al,     '\\'
+    jne     _delete_file.convert_alpha
+    
+    cmp     si,     bx
+    je      _delete_file.loop
+    
+    cmp     byte ptr es:[di - 1],   '\\'
+    je      _delete_file.loop
+
+_delete_file.convert_alpha:
+
+    xor     ah,     ah
+    push    ax
+    
+    call    _isalpha
+    
+    and     ax,     ax
+    jz      _delete_file.no_alpha
+    
+    call    _toupper
+    add     sp,     2
+    
+    jmp     _delete_file.char_ok2
+
+_delete_file.no_alpha:
+
+    pop     ax
+    jmp     _delete_file.char_ok2
+
+_delete_file.check_curr:
+
+    cmp     byte ptr [si],  0
+    je      _delete_file.loop
+    
+    cmp     byte ptr [si],  '\\'
+    je      _delete_file.loop
+    
+    cmp     byte ptr [si],  '.'
+    je      _delete_file.check_prev
+    
+    jmp     _delete_file.char_ok2
+
+_delete_file.check_prev:
+
+    cmp     byte ptr [si + 1],  0
+    je      _delete_file.get_prev
+    
+    cmp     byte ptr [si + 1],  '\\'
+    jne     _delete_file.char_ok2
+
+_delete_file.get_prev:
+
+    mov     cx,     offset _file_path
+    add     cx,     3
+    
+    cmp     di,     cx
+    je      _delete_file.no_slash2
+    
+    cmp     byte ptr es:[di - 1],   '\\'
+    jne     _delete_file.no_slash2
+    
+    mov     byte ptr es:[di - 1],   0
+
+_delete_file.no_slash2:
+
+    push    si
+    push    ds
+    
+    mov     ax,     cs
+    mov     ds,     ax
+    
+    mov     ax,     '\\'
+    push    ax
+    
+    mov     ax,     offset _file_path
+    push    ax
+    
+    call    _strrchr
+    add     sp,     4
+    
+    pop     ds
+    pop     si
+    
+    and     ax,     ax
+    jnz     _delete_file.got_index
+    
+    mov     di,     offset _file_path
+    jmp     _delete_file.zero
+
+_delete_file.got_index:
+
+    mov     di,     ax
+    inc     di
+
+_delete_file.zero:
+
+    mov     byte ptr es:[di],   0
+    jmp     _delete_file.loop
+
+_delete_file.char_ok2:
+
+    stosb
+    jmp     _delete_file.loop
+
+_delete_file.check_path:
+
+    cmp     byte ptr es:[di - 1],       '\\'
+    jne     _delete_file.null
+    
+    dec     di
+
+_delete_file.null:
+
+    xor     al,     al
+    stosb
+
+_delete_file.delete:
+
     mov     ah,     HEX (41)
-    mov     dx,     bx
+    mov     dx,     offset _file_path
     int     HEX (21)
-    jnc     _handler_del.close
+    jnc     _delete_file.close
+    
+    mov     cx,     offset _file_path
     
     cmp     ax,     2
-    jne     _handler_del.check3
+    jne     _delete_file.check
     
     mov     bx,     offset _err_no_file
-    jmp     _handler_del.error
-
-_handler_del.check3:
+    jmp     _delete_file.error
 
+_delete_file.check:
+    
     cmp     ax,     3
-    jne     _handler_del.unhandled
+    jne     _delete_file.unhandled
     
-    mov     bx,     offset _err_no_dir
-    jmp     _handler_del.error
+    mov     bx,     offset _err_no_path
+    jmp     _delete_file.error
 
-_handler_del.unhandled:
+_delete_file.unhandled:
 
-    pop     bx
     mov     bx,     offset _err_unhandled
 
-_handler_del.error:
+_delete_file.error:
 
     call    _writestr
     
     cmp     ax,     3
-    ja      _handler_del.next
+    ja      _delete_file.done
     
     cmp     ax,     2
-    jb      _handler_del.next
+    jb      _delete_file.done
     
-    pop     bx
+    mov     bx,     offset _file_path
     
     call    _writestr
     call    _crlf
     
-    jmp     _handler_del.next
+    jmp     _delete_file.done
 
-_handler_del.close:
+_delete_file.close:
 
-    pop     bx
     mov     bx,     ax
     
     mov     ah,     HEX (3E)
     int     HEX (21)
-    
-    jmp     _handler_del.next
 
-_handler_del.cleanup:
-
-    mov     ax,     cs:[_vec_files + 0]
-    push    ax
-    
-    call    _free
-    add     sp,     2
-    
-    mov     ax,     cs
-    mov     es,     ax
-    
-    mov     di,     offset _vec_files
-    xor     al,     al
-    
-    mov     cx,     6
-    rep     stosb
-
-_handler_del.done:
+_delete_file.done:
 
+    pop     cx
     pop     ds
-    pop     es
-    pop     di
-    pop     si
     pop     dx
-    pop     cx
     pop     bx
     pop     ax
-    
-    add     sp,     4
-    pop     bp
-    
     ret
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; Data area.
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 _vec_files:                     db      6       dup (0)
+
 _cmdline:                       db      256     dup (0)
+_file_path:                     db      256     dup (0)
 
 _err_invalid:                   db      "Invalid number of parameters",     HEX (0D),   HEX (0A),   HEX (00)
 
-_err_no_dir:                    db      "Path not found: ",     HEX (00)
+_err_no_path:                   db      "Path not found: ",     HEX (00)
 _err_no_file:                   db      "File not found: ",     HEX (00)
 
 _err_unhandled:                 db      "Unhandled error code",     HEX (0D),   HEX (0A),   HEX (00)
diff --git a/src/apps/pcomm/dir.asm b/src/apps/pcomm/dir.asm
index 8a86bf5..cbf62ac 100644
--- a/src/apps/pcomm/dir.asm
+++ b/src/apps/pcomm/dir.asm
@@ -14,7 +14,7 @@ _handler_dir:
     push    bp
     
     mov     bp,     sp
-    sub     sp,     6
+    sub     sp,     10
     
     push    ax
     push    bx
@@ -25,8 +25,9 @@ _handler_dir:
     push    es
     push    ds
     
+    mov     word ptr [bp - 4],      1
+    
     mov     word ptr [bp - 6],      0
-    mov     word ptr [bp - 4],      0
     mov     word ptr [bp - 2],      0
     
     mov     ax,     64
@@ -53,6 +54,7 @@ _handler_dir:
     jne     _handler_dir.got_path
     
     mov     bx,     offset _fn_wild
+    mov     word ptr [bp - 4],      0
 
 _handler_dir.got_path:
 
@@ -200,7 +202,7 @@ _handler_dir.done:
     pop     bx
     pop     ax
     
-    add     sp,     6
+    add     sp,     10
     pop     bp
     
     ret
@@ -216,22 +218,251 @@ _walk_dir:
     push    ds
     push    cx
     
+    mov     di,     offset _file_path
+    mov     cx,     256
+    
+    xor     al,     al
+    rep     stosb
+    
     mov     word ptr [bp - 2],      0
-    mov     si,     offset _file_path
+    
+    cmp     word ptr [bp - 4],      1
+    jb      _walk_dir.find_first
+    
+    mov     ah,     HEX (19)
+    int     HEX (21)
+    
+    mov     byte ptr [bp - 10],     al
+    mov     si,     dx
+    
+    push    si
+    
+    call    _strlen
+    add     sp,     2
+    
+    cmp     ax,     2
+    jb      _walk_dir.got_drive
+    
+    cmp     byte ptr [si + 1],      ':'
+    jne     _walk_dir.got_drive
+    
+    mov     al,     [si]
+    
+    cmp     al,     HEX (7A)
+    ja      _walk_dir.no_adjust
+    
+    cmp     al,     HEX (61)
+    jb      _walk_dir.no_adjust
+    
+    mov     bl,     HEX (20)
+    not     bl
+    
+    sub     al,     'a'
+    
+    mov     byte ptr [bp - 10],     al
+    add     si,     2
+    
+    jmp     _walk_dir.got_drive
+
+_walk_dir.no_adjust:
+
+    cmp     al,     HEX (5A)
+    ja      _walk_dir.got_drive
+    
+    cmp     al,     HEX (41)
+    jb      _walk_dir.got_drive
+    
+    sub     al,     'A'
+    
+    mov     byte ptr [bp - 10],     al
+    add     si,     2
+
+_walk_dir.got_drive:
+
+    mov     di,     offset _file_path
+    
+    mov     al,     byte ptr [bp - 10]
+    add     al,     'A'
+    stosb
+    
+    mov     al,     ':'
+    stosb
+    
+    cmp     byte ptr [si],      '\\'
+    je      _walk_dir.initial_setup
+    
+    mov     al,     '\\'
+    stosb
     
     push    dx
     push    si
     
-    call    _xstrcpy
+    mov     dl,     byte ptr [bp - 10]
+    mov     si,     di
+    
+    mov     ah,     HEX (47)
+    int     HEX (21)
+    
+    pop     si
+    pop     dx
+    
+    mov     di,     offset _file_path
+    push    di
+    
+    call    _strlen
+    add     sp,     2
+    
+    add     di,     ax
+
+_walk_dir.initial_setup:
+
+    cmp     byte ptr es:[di - 1],   '\\'
+    je      _walk_dir.no_slash
+    
+    mov     al,     '\\'
+    stosb
+
+_walk_dir.no_slash:
+
+    mov     bx,     si
+
+_walk_dir.loop:
+
+    mov     ax,     si
+    sub     ax,     bx
+    
+    cmp     ax,     65
+    ja      _walk_dir.check_path
+    
+    lodsb
+    
+    and     al,     al
+    jz      _walk_dir.check_path
+    
+    cmp     al,     '.'
+    je      _walk_dir.check_curr
+    
+    cmp     al,     '\\'
+    jne     _walk_dir.convert_alpha
+    
+    cmp     si,     bx
+    je      _walk_dir.loop
+    
+    cmp     byte ptr es:[di - 1],   '\\'
+    je      _walk_dir.loop
+
+_walk_dir.convert_alpha:
+
+    xor     ah,     ah
+    push    ax
+    
+    call    _isalpha
+    
+    and     ax,     ax
+    jz      _walk_dir.no_alpha
+    
+    call    _toupper
+    add     sp,     2
+    
+    jmp     _walk_dir.char_ok
+
+_walk_dir.no_alpha:
+
+    pop     ax
+    jmp     _walk_dir.char_ok
+
+_walk_dir.check_curr:
+
+    cmp     byte ptr [si],  0
+    je      _walk_dir.loop
+    
+    cmp     byte ptr [si],  '\\'
+    je      _walk_dir.loop
+    
+    cmp     byte ptr [si],  '.'
+    je      _walk_dir.check_prev
+    
+    jmp     _walk_dir.char_ok
+
+_walk_dir.check_prev:
+
+    cmp     byte ptr [si + 1],  0
+    je      _walk_dir.get_prev
+    
+    cmp     byte ptr [si + 1],  '\\'
+    jne     _walk_dir.char_ok
+
+_walk_dir.get_prev:
+
+    mov     cx,     offset _file_path
+    add     cx,     3
+    
+    cmp     di,     cx
+    je      _walk_dir.no_slash2
+    
+    cmp     byte ptr es:[di - 1],   '\\'
+    jne     _walk_dir.no_slash2
+    
+    mov     byte ptr es:[di - 1],   0
+
+_walk_dir.no_slash2:
+
+    push    si
+    push    ds
+    
+    mov     ax,     cs
+    mov     ds,     ax
+    
+    mov     ax,     '\\'
+    push    ax
+    
+    mov     ax,     offset _file_path
+    push    ax
+    
+    call    _strrchr
     add     sp,     4
     
-    cmp     word ptr [bp - 4],      1
-    jb      _walk_dir.find_first
+    pop     ds
+    pop     si
+    
+    and     ax,     ax
+    jnz     _walk_dir.got_index
+    
+    mov     di,     offset _file_path
+    jmp     _walk_dir.zero
+
+_walk_dir.got_index:
+
+    mov     di,     ax
+    inc     di
+
+_walk_dir.zero:
+
+    mov     byte ptr es:[di],   0
+    jmp     _walk_dir.loop
+
+_walk_dir.char_ok:
+
+    stosb
+    jmp     _walk_dir.loop
+
+_walk_dir.check_path:
+
+    ;cmp     byte ptr es:[di - 1],       '\\'
+    ;jne     _walk_dir.null
+    ;
+    ;dec     di
+
+_walk_dir.null:
+
+    xor     al,     al
+    stosb
 
 _walk_dir.find_first:
 
     mov     ah,     HEX (4E)
     xor     cx,     cx
+    mov     dx,     offset _file_path
     int     HEX (21)
     jnc     _walk_dir.check5
     
@@ -274,7 +505,7 @@ _walk_dir.error:
 _walk_dir.check5:
 
     cmp     word ptr [bp - 4],      2
-    jb     _walk_dir.setup
+    jb      _walk_dir.setup
     
     mov     bx,     offset _file_path
     call    _writestr
@@ -290,22 +521,20 @@ _walk_dir.setup:
     mov     ax,     cs:[_dta_addr]
     mov     ds,     ax
 
-_walk_dir.find:
+_walk_dir.found:
 
     cmp     word ptr [bp - 2],      0
     je      _walk_dir.ok
     
+    mov     cx,     4
+
+_walk_dir.seperate:
+
     mov     ah,     HEX (02)
     mov     dl,     ' '
     int     HEX (21)
     
-    mov     ah,     HEX (02)
-    mov     dl,     ':'
-    int     HEX (21)
-    
-    mov     ah,     HEX (02)
-    mov     dl,     ' '
-    int     HEX (21)
+    loop    _walk_dir.seperate
 
 _walk_dir.ok:
 
@@ -333,7 +562,7 @@ _walk_dir.check:
 
 _walk_dir.period_check:
 
-    cmp     byte ptr [si - 1],      '.'
+    cmp     byte ptr [si - 2],      '.'
     jne     _walk_dir.pad
 
 _walk_dir.output:
@@ -367,7 +596,7 @@ _walk_dir.final_pad:
     int     HEX (21)
     
     dec     cx
-    jmp     short   _walk_dir.final_pad
+    jnz     _walk_dir.final_pad
 
 _walk_dir.check2:
 
@@ -383,7 +612,7 @@ _walk_dir.next:
 
     mov     ah,     HEX (4F)
     int     HEX (21)
-    jnc     _walk_dir.find
+    jnc     _walk_dir.found
     
     cmp     word ptr [bp - 2],      0
     je      _walk_dir.check4
diff --git a/src/apps/pcomm/mkdir.asm b/src/apps/pcomm/mkdir.asm
index 416d917..2ecc9e9 100644
--- a/src/apps/pcomm/mkdir.asm
+++ b/src/apps/pcomm/mkdir.asm
@@ -14,7 +14,7 @@ _handler_mkdir:
     push    bp
     
     mov     bp,     sp
-    sub     sp,     4
+    sub     sp,     6
     
     push    ax
     push    bx
@@ -25,6 +25,7 @@ _handler_mkdir:
     push    es
     push    ds
     
+    mov     word ptr [bp - 6],      0
     mov     word ptr [bp - 4],      0
     mov     word ptr [bp - 2],      0
     
@@ -57,7 +58,7 @@ _handler_mkdir.ok:
 _handler_mkdir.store_arg:
 
     cmp     byte ptr [bx],      0
-    je      _handler_mkdir.next
+    je      _handler_mkdir.check2
     
     mov     si,     bx
     push    si
@@ -80,7 +81,7 @@ _handler_mkdir.check:
     add     sp,     4
     
     and     ax,     ax
-    jz      _handler_mkdir.next
+    jz      _handler_mkdir.check2
     
     mov     bx,     ax
     mov     byte ptr [bx],      0
@@ -90,7 +91,7 @@ _handler_mkdir.check:
 _handler_mkdir.skip:
 
     cmp     byte ptr [bx],      0
-    je      _handler_mkdir.next
+    je      _handler_mkdir.check2
     
     cmp     byte ptr [bx],      ' '
     ja      _handler_mkdir.store_arg
@@ -98,15 +99,20 @@ _handler_mkdir.skip:
     inc     bx
     jmp     _handler_mkdir.skip
 
+_handler_mkdir.check2:
+
+    cmp     word ptr cs:[_vec_files + 4],   1
+    jbe     _handler_mkdir.next
+
 _handler_mkdir.next:
 
-    mov     ax,     word ptr [bp - 4]
+    mov     ax,     word ptr [bp - 6]
     inc     ax
     
     cmp     ax,     cs:[_vec_files + 4]
     ja      _handler_mkdir.cleanup
     
-    mov     word ptr [bp - 4],      ax
+    mov     word ptr [bp - 6],      ax
     dec     ax
     
     xor     dx,     dx
@@ -121,29 +127,11 @@ _handler_mkdir.next:
     mov     es,     ax
     
     mov     ax,     es:[bx]
-    mov     bx,     ax
+    mov     dx,     ax
     
     pop     es
-
-_handler_mkdir.open:
-
-    mov     ah,     HEX (39)
-    mov     dx,     bx
-    int     HEX (21)
-    jnc     _handler_mkdir.next
-    
-_handler_mkdir.error:
-
-    push    bx
-    
-    mov     bx,     offset _err_failed
-    call    _writestr
-    
-    pop     bx
-    
-    call    _writestr
-    call    _crlf
     
+    call    _create_dir
     jmp     _handler_mkdir.next
 
 _handler_mkdir.cleanup:
@@ -174,16 +162,302 @@ _handler_mkdir.done:
     pop     bx
     pop     ax
     
-    add     sp,     4
+    add     sp,     6
     pop     bp
     
     ret
 
+;******************************************************************************
+; @function         _create_dir
+;******************************************************************************
+_create_dir:
+
+    push    ax
+    push    bx
+    push    dx
+    push    ds
+    push    cx
+    
+    mov     di,     offset _file_path
+    mov     cx,     256
+    
+    xor     al,     al
+    rep     stosb
+    
+    mov     ah,     HEX (19)
+    int     HEX (21)
+    
+    mov     byte ptr [bp - 4],      al
+    mov     si,     dx
+    
+    push    si
+    
+    call    _strlen
+    add     sp,     2
+    
+    cmp     ax,     2
+    jb      _create_dir.got_drive
+    
+    cmp     byte ptr [si + 1],      ':'
+    jne     _create_dir.got_drive
+    
+    mov     al,     [si]
+    
+    cmp     al,     HEX (7A)
+    ja      _create_dir.no_adjust
+    
+    cmp     al,     HEX (61)
+    jb      _create_dir.no_adjust
+    
+    mov     bl,     HEX (20)
+    not     bl
+    
+    sub     al,     'a'
+    
+    mov     byte ptr [bp - 4],      al
+    add     si,     2
+    
+    jmp     _create_dir.got_drive
+
+_create_dir.no_adjust:
+
+    cmp     al,     HEX (5A)
+    ja      _create_dir.got_drive
+    
+    cmp     al,     HEX (41)
+    jb      _create_dir.got_drive
+    
+    sub     al,     'A'
+    
+    mov     byte ptr [bp - 4],      al
+    add     si,     2
+
+_create_dir.got_drive:
+
+    mov     di,     offset _file_path
+    
+    mov     al,     byte ptr [bp - 4]
+    add     al,     'A'
+    stosb
+    
+    mov     al,     ':'
+    stosb
+    
+    cmp     byte ptr [si],      '\\'
+    je      _create_dir.initial_setup
+    
+    mov     al,     '\\'
+    stosb
+    
+    push    dx
+    push    si
+    
+    mov     dl,     byte ptr [bp - 4]
+    mov     si,     di
+    
+    mov     ah,     HEX (47)
+    int     HEX (21)
+    
+    pop     si
+    pop     dx
+    
+    mov     di,     offset _file_path
+    push    di
+    
+    call    _strlen
+    add     sp,     2
+    
+    add     di,     ax
+
+_create_dir.initial_setup:
+
+    cmp     byte ptr es:[di - 1],   '\\'
+    je      _create_dir.no_slash
+    
+    mov     al,     '\\'
+    stosb
+
+_create_dir.no_slash:
+
+    mov     bx,     si
+
+_create_dir.loop:
+
+    mov     ax,     si
+    sub     ax,     bx
+    
+    cmp     ax,     65
+    ja      _create_dir.check_path
+    
+    lodsb
+    
+    and     al,     al
+    jz      _create_dir.check_path
+    
+    cmp     al,     '.'
+    je      _create_dir.check_curr
+    
+    cmp     al,     '\\'
+    jne     _create_dir.convert_alpha
+    
+    cmp     si,     bx
+    je      _create_dir.loop
+    
+    cmp     byte ptr es:[di - 1],   '\\'
+    je      _create_dir.loop
+
+_create_dir.convert_alpha:
+
+    xor     ah,     ah
+    push    ax
+    
+    call    _isalpha
+    
+    and     ax,     ax
+    jz      _create_dir.no_alpha
+    
+    call    _toupper
+    add     sp,     2
+    
+    jmp     _create_dir.char_ok2
+
+_create_dir.no_alpha:
+
+    pop     ax
+    jmp     _create_dir.char_ok2
+
+_create_dir.check_curr:
+
+    cmp     byte ptr [si],  0
+    je      _create_dir.loop
+    
+    cmp     byte ptr [si],  '\\'
+    je      _create_dir.loop
+    
+    cmp     byte ptr [si],  '.'
+    je      _create_dir.check_prev
+    
+    jmp     _create_dir.char_ok2
+
+_create_dir.check_prev:
+
+    cmp     byte ptr [si + 1],  0
+    je      _create_dir.get_prev
+    
+    cmp     byte ptr [si + 1],  '\\'
+    jne     _create_dir.char_ok2
+
+_create_dir.get_prev:
+
+    mov     cx,     offset _file_path
+    add     cx,     3
+    
+    cmp     di,     cx
+    je      _create_dir.no_slash2
+    
+    cmp     byte ptr es:[di - 1],   '\\'
+    jne     _create_dir.no_slash2
+    
+    mov     byte ptr es:[di - 1],   0
+
+_create_dir.no_slash2:
+
+    push    si
+    push    ds
+    
+    mov     ax,     cs
+    mov     ds,     ax
+    
+    mov     ax,     '\\'
+    push    ax
+    
+    mov     ax,     offset _file_path
+    push    ax
+    
+    call    _strrchr
+    add     sp,     4
+    
+    pop     ds
+    pop     si
+    
+    and     ax,     ax
+    jnz     _create_dir.got_index
+    
+    mov     di,     offset _file_path
+    jmp     _create_dir.zero
+
+_create_dir.got_index:
+
+    mov     di,     ax
+    inc     di
+
+_create_dir.zero:
+
+    mov     byte ptr es:[di],   0
+    jmp     _create_dir.loop
+
+_create_dir.char_ok2:
+
+    stosb
+    jmp     _create_dir.loop
+
+_create_dir.check_path:
+
+    ;cmp     byte ptr es:[di - 1],       '\\'
+    ;jne     _create_dir.null
+    ;
+    ;dec     di
+
+_create_dir.null:
+
+    xor     al,     al
+    stosb
+
+_create_dir.create:
+
+    mov     ah,     HEX (39)
+    mov     dx,     offset _file_path
+    int     HEX (21)
+    jnc     _create_dir.done
+
+_create_dir.error:
+
+    mov     bx,     offset _err_failed
+    call    _writestr
+    
+    cmp     ax,     3
+    jne     _create_dir.done
+    
+    mov     bx,     offset _file_path
+    
+    call    _writestr
+    call    _crlf
+    
+    jmp     _create_dir.done
+
+_create_dir.close:
+
+    mov     bx,     ax
+    
+    mov     ah,     HEX (3E)
+    int     HEX (21)
+
+_create_dir.done:
+
+    pop     cx
+    pop     ds
+    pop     dx
+    pop     bx
+    pop     ax
+    ret
+
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; Data area.
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 _vec_files:                     db      6       dup (0)
+
 _cmdline:                       db      256     dup (0)
+_file_path:                     db      256     dup (0)
 
 _err_invalid:                   db      "Invalid number of parameters",     HEX (0D),   HEX (0A),   HEX (00)
 _err_failed:                    db      "Unable to create directory - ",    HEX (00)
diff --git a/src/apps/pcomm/rmdir.asm b/src/apps/pcomm/rmdir.asm
index bc06adc..4c50cd6 100644
--- a/src/apps/pcomm/rmdir.asm
+++ b/src/apps/pcomm/rmdir.asm
@@ -1,5 +1,5 @@
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; @file            type.asm
+;; @file            rmdir.asm
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 %ifndef     HEX
 % define        HEX(y)                  0x##y
@@ -14,7 +14,7 @@ _handler_rmdir:
     push    bp
     
     mov     bp,     sp
-    sub     sp,     4
+    sub     sp,     6
     
     push    ax
     push    bx
@@ -25,6 +25,7 @@ _handler_rmdir:
     push    es
     push    ds
     
+    mov     word ptr [bp - 6],      0
     mov     word ptr [bp - 4],      0
     mov     word ptr [bp - 2],      0
     
@@ -57,7 +58,7 @@ _handler_rmdir.ok:
 _handler_rmdir.store_arg:
 
     cmp     byte ptr [bx],      0
-    je      _handler_rmdir.next
+    je      _handler_rmdir.check2
     
     mov     si,     bx
     push    si
@@ -80,7 +81,7 @@ _handler_rmdir.check:
     add     sp,     4
     
     and     ax,     ax
-    jz      _handler_rmdir.next
+    jz      _handler_rmdir.check2
     
     mov     bx,     ax
     mov     byte ptr [bx],      0
@@ -90,7 +91,7 @@ _handler_rmdir.check:
 _handler_rmdir.skip:
 
     cmp     byte ptr [bx],      0
-    je      _handler_rmdir.next
+    je      _handler_rmdir.check2
     
     cmp     byte ptr [bx],      ' '
     ja      _handler_rmdir.store_arg
@@ -98,15 +99,20 @@ _handler_rmdir.skip:
     inc     bx
     jmp     _handler_rmdir.skip
 
+_handler_rmdir.check2:
+
+    cmp     word ptr cs:[_vec_files + 4],   1
+    jbe     _handler_rmdir.next
+
 _handler_rmdir.next:
 
-    mov     ax,     word ptr [bp - 4]
+    mov     ax,     word ptr [bp - 6]
     inc     ax
     
     cmp     ax,     cs:[_vec_files + 4]
     ja      _handler_rmdir.cleanup
     
-    mov     word ptr [bp - 4],      ax
+    mov     word ptr [bp - 6],      ax
     dec     ax
     
     xor     dx,     dx
@@ -121,99 +127,366 @@ _handler_rmdir.next:
     mov     es,     ax
     
     mov     ax,     es:[bx]
-    mov     bx,     ax
+    mov     dx,     ax
     
     pop     es
+    
+    call    _delete_dir
+    jmp     _handler_rmdir.next
+
+_handler_rmdir.cleanup:
+
+    mov     ax,     cs:[_vec_files + 0]
+    push    ax
+    
+    call    _free
+    add     sp,     2
+    
+    mov     ax,     cs
+    mov     es,     ax
+    
+    mov     di,     offset _vec_files
+    xor     al,     al
+    
+    mov     cx,     6
+    rep     stosb
+
+_handler_rmdir.done:
+
+    pop     ds
+    pop     es
+    pop     di
+    pop     si
+    pop     dx
+    pop     cx
+    pop     bx
+    pop     ax
+    
+    add     sp,     6
+    pop     bp
+    
+    ret
+
+;******************************************************************************
+; @function         _delete_dir
+;******************************************************************************
+_delete_dir:
+
+    push    ax
+    push    bx
+    push    dx
+    push    ds
+    push    cx
+    
+    mov     di,     offset _file_path
+    mov     cx,     256
+    
+    xor     al,     al
+    rep     stosb
+    
+    mov     ah,     HEX (19)
+    int     HEX (21)
+    
+    mov     byte ptr [bp - 4],      al
+    mov     si,     dx
+    
+    push    si
+    
+    call    _strlen
+    add     sp,     2
+    
+    cmp     ax,     2
+    jb      _delete_dir.got_drive
+    
+    cmp     byte ptr [si + 1],      ':'
+    jne     _delete_dir.got_drive
+    
+    mov     al,     [si]
+    
+    cmp     al,     HEX (7A)
+    ja      _delete_dir.no_adjust
+    
+    cmp     al,     HEX (61)
+    jb      _delete_dir.no_adjust
+    
+    mov     bl,     HEX (20)
+    not     bl
+    
+    sub     al,     'a'
+    
+    mov     byte ptr [bp - 4],      al
+    add     si,     2
+    
+    jmp     _delete_dir.got_drive
+
+_delete_dir.no_adjust:
+
+    cmp     al,     HEX (5A)
+    ja      _delete_dir.got_drive
+    
+    cmp     al,     HEX (41)
+    jb      _delete_dir.got_drive
+    
+    sub     al,     'A'
+    
+    mov     byte ptr [bp - 4],      al
+    add     si,     2
+
+_delete_dir.got_drive:
+
+    mov     di,     offset _file_path
+    
+    mov     al,     byte ptr [bp - 4]
+    add     al,     'A'
+    stosb
+    
+    mov     al,     ':'
+    stosb
+    
+    cmp     byte ptr [si],      '\\'
+    je      _delete_dir.initial_setup
+    
+    mov     al,     '\\'
+    stosb
+    
+    push    dx
+    push    si
+    
+    mov     dl,     byte ptr [bp - 4]
+    mov     si,     di
+    
+    mov     ah,     HEX (47)
+    int     HEX (21)
+    
+    pop     si
+    pop     dx
+    
+    mov     di,     offset _file_path
+    push    di
+    
+    call    _strlen
+    add     sp,     2
+    
+    add     di,     ax
+
+_delete_dir.initial_setup:
+
+    cmp     byte ptr es:[di - 1],   '\\'
+    je      _delete_dir.no_slash
+    
+    mov     al,     '\\'
+    stosb
+
+_delete_dir.no_slash:
+
+    mov     bx,     si
+
+_delete_dir.loop:
+
+    mov     ax,     si
+    sub     ax,     bx
+    
+    cmp     ax,     65
+    ja      _delete_dir.check_path
+    
+    lodsb
+    
+    and     al,     al
+    jz      _delete_dir.check_path
+    
+    cmp     al,     '.'
+    je      _delete_dir.check_curr
+    
+    cmp     al,     '\\'
+    jne     _delete_dir.convert_alpha
+    
+    cmp     si,     bx
+    je      _delete_dir.loop
+    
+    cmp     byte ptr es:[di - 1],   '\\'
+    je      _delete_dir.loop
+
+_delete_dir.convert_alpha:
+
+    xor     ah,     ah
+    push    ax
+    
+    call    _isalpha
+    
+    and     ax,     ax
+    jz      _delete_dir.no_alpha
+    
+    call    _toupper
+    add     sp,     2
+    
+    jmp     _delete_dir.char_ok2
+
+_delete_dir.no_alpha:
+
+    pop     ax
+    jmp     _delete_dir.char_ok2
+
+_delete_dir.check_curr:
 
-_handler_rmdir.delete:
+    cmp     byte ptr [si],  0
+    je      _delete_dir.loop
+    
+    cmp     byte ptr [si],  '\\'
+    je      _delete_dir.loop
+    
+    cmp     byte ptr [si],  '.'
+    je      _delete_dir.check_prev
+    
+    jmp     _delete_dir.char_ok2
+
+_delete_dir.check_prev:
+
+    cmp     byte ptr [si + 1],  0
+    je      _delete_dir.get_prev
+    
+    cmp     byte ptr [si + 1],  '\\'
+    jne     _delete_dir.char_ok2
+
+_delete_dir.get_prev:
+
+    mov     cx,     offset _file_path
+    add     cx,     3
+    
+    cmp     di,     cx
+    je      _delete_dir.no_slash2
+    
+    cmp     byte ptr es:[di - 1],   '\\'
+    jne     _delete_dir.no_slash2
+    
+    mov     byte ptr es:[di - 1],   0
+
+_delete_dir.no_slash2:
+
+    push    si
+    push    ds
+    
+    mov     ax,     cs
+    mov     ds,     ax
+    
+    mov     ax,     '\\'
+    push    ax
+    
+    mov     ax,     offset _file_path
+    push    ax
+    
+    call    _strrchr
+    add     sp,     4
+    
+    pop     ds
+    pop     si
+    
+    and     ax,     ax
+    jnz     _delete_dir.got_index
+    
+    mov     di,     offset _file_path
+    jmp     _delete_dir.zero
+
+_delete_dir.got_index:
+
+    mov     di,     ax
+    inc     di
+
+_delete_dir.zero:
+
+    mov     byte ptr es:[di],   0
+    jmp     _delete_dir.loop
+
+_delete_dir.char_ok2:
+
+    stosb
+    jmp     _delete_dir.loop
+
+_delete_dir.check_path:
+
+    cmp     byte ptr es:[di - 1],       '\\'
+    jne     _delete_dir.null
+    
+    dec     di
+
+_delete_dir.null:
+
+    xor     al,     al
+    stosb
+
+_delete_dir.delete:
 
     mov     ah,     HEX (3A)
-    mov     dx,     bx
+    mov     dx,     offset _file_path
     int     HEX (21)
-    jnc     _handler_rmdir.next
+    jnc     _delete_dir.close
     
-    mov     cx,     bx
+    mov     cx,     offset _file_path
     
     cmp     ax,     3
-    jne     _handler_rmdir.check3
+    jne     _delete_dir.check
     
     mov     bx,     offset _err_failed
-    jmp     _handler_rmdir.error
-
-_handler_rmdir.check3:
+    jmp     _delete_dir.check2
 
+_delete_dir.check:
+    
     cmp     ax,     16
-    jne     _handler_rmdir.unhandled
+    jne     _delete_dir.unhandled
     
     mov     bx,     offset _err_current
-    jmp     _handler_rmdir.error
+    jmp     _delete_dir.check2
 
-_handler_rmdir.unhandled:
+_delete_dir.unhandled:
 
     mov     bx,     offset _err_unhandled
 
-_handler_rmdir.error:
+_delete_dir.check2:
 
     cmp     ax,     3
-    jne     _handler_rmdir.error2
+    jne     _delete_dir.error
     
     xchg    bx,     cx
     call    _writestr
     
     xchg    bx,     cx
 
-_handler_rmdir.error2:
+_delete_dir.error:
 
     call    _writestr
     
     cmp     ax,     16
-    jne     _handler_rmdir.next
+    jne     _delete_dir.done
     
     mov     bx,     cx
     
     call    _writestr
     call    _crlf
     
-    jmp     _handler_rmdir.next
+    jmp     _delete_dir.done
 
-_handler_rmdir.cleanup:
+_delete_dir.close:
 
-    mov     ax,     cs:[_vec_files + 0]
-    push    ax
-    
-    call    _free
-    add     sp,     2
-    
-    mov     ax,     cs
-    mov     es,     ax
-    
-    mov     di,     offset _vec_files
-    xor     al,     al
+    mov     bx,     ax
     
-    mov     cx,     6
-    rep     stosb
+    mov     ah,     HEX (3E)
+    int     HEX (21)
 
-_handler_rmdir.done:
+_delete_dir.done:
 
+    pop     cx
     pop     ds
-    pop     es
-    pop     di
-    pop     si
     pop     dx
-    pop     cx
     pop     bx
     pop     ax
-    
-    add     sp,     4
-    pop     bp
-    
     ret
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; Data area.
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 _vec_files:                     db      6       dup (0)
+
 _cmdline:                       db      256     dup (0)
+_file_path:                     db      256     dup (0)
 
 _err_invalid:                   db      "Invalid number of parameters",     HEX (0D),   HEX (0A),   HEX (00)
 
diff --git a/src/apps/pcomm/touch.asm b/src/apps/pcomm/touch.asm
index ca254e9..2f8c2b4 100644
--- a/src/apps/pcomm/touch.asm
+++ b/src/apps/pcomm/touch.asm
@@ -14,7 +14,7 @@ _handler_touch:
     push    bp
     
     mov     bp,     sp
-    sub     sp,     4
+    sub     sp,     6
     
     push    ax
     push    bx
@@ -25,6 +25,7 @@ _handler_touch:
     push    es
     push    ds
     
+    mov     word ptr [bp - 6],      0
     mov     word ptr [bp - 4],      0
     mov     word ptr [bp - 2],      0
     
@@ -57,7 +58,7 @@ _handler_touch.ok:
 _handler_touch.store_arg:
 
     cmp     byte ptr [bx],      0
-    je      _handler_touch.next
+    je      _handler_touch.check2
     
     mov     si,     bx
     push    si
@@ -80,7 +81,7 @@ _handler_touch.check:
     add     sp,     4
     
     and     ax,     ax
-    jz      _handler_touch.next
+    jz      _handler_touch.check2
     
     mov     bx,     ax
     mov     byte ptr [bx],      0
@@ -90,7 +91,7 @@ _handler_touch.check:
 _handler_touch.skip:
 
     cmp     byte ptr [bx],      0
-    je      _handler_touch.next
+    je      _handler_touch.check2
     
     cmp     byte ptr [bx],      ' '
     ja      _handler_touch.store_arg
@@ -98,15 +99,20 @@ _handler_touch.skip:
     inc     bx
     jmp     _handler_touch.skip
 
+_handler_touch.check2:
+
+    cmp     word ptr cs:[_vec_files + 4],   1
+    jbe     _handler_touch.next
+
 _handler_touch.next:
 
-    mov     ax,     word ptr [bp - 4]
+    mov     ax,     word ptr [bp - 6]
     inc     ax
     
     cmp     ax,     cs:[_vec_files + 4]
     ja      _handler_touch.cleanup
     
-    mov     word ptr [bp - 4],      ax
+    mov     word ptr [bp - 6],      ax
     dec     ax
     
     xor     dx,     dx
@@ -121,100 +127,354 @@ _handler_touch.next:
     mov     es,     ax
     
     mov     ax,     es:[bx]
-    mov     bx,     ax
+    mov     dx,     ax
     
     pop     es
+    
+    call    _create_file
+    jmp     _handler_touch.next
+
+_handler_touch.cleanup:
+
+    mov     ax,     cs:[_vec_files + 0]
+    push    ax
+    
+    call    _free
+    add     sp,     2
+    
+    mov     ax,     cs
+    mov     es,     ax
+    
+    mov     di,     offset _vec_files
+    xor     al,     al
+    
+    mov     cx,     6
+    rep     stosb
+
+_handler_touch.done:
+
+    pop     ds
+    pop     es
+    pop     di
+    pop     si
+    pop     dx
+    pop     cx
+    pop     bx
+    pop     ax
+    
+    add     sp,     6
+    pop     bp
+    
+    ret
 
-_handler_touch.open:
+;******************************************************************************
+; @function         _create_file
+;******************************************************************************
+_create_file:
 
+    push    ax
     push    bx
+    push    dx
+    push    ds
+    push    cx
+    
+    mov     di,     offset _file_path
+    mov     cx,     256
+    
+    xor     al,     al
+    rep     stosb
+    
+    mov     ah,     HEX (19)
+    int     HEX (21)
+    
+    mov     byte ptr [bp - 4],      al
+    mov     si,     dx
     
+    push    si
+    
+    call    _strlen
+    add     sp,     2
+    
+    cmp     ax,     2
+    jb      _create_file.got_drive
+    
+    cmp     byte ptr [si + 1],      ':'
+    jne     _create_file.got_drive
+    
+    mov     al,     [si]
+    
+    cmp     al,     HEX (7A)
+    ja      _create_file.no_adjust
+    
+    cmp     al,     HEX (61)
+    jb      _create_file.no_adjust
+    
+    mov     bl,     HEX (20)
+    not     bl
+    
+    sub     al,     'a'
+    
+    mov     byte ptr [bp - 4],      al
+    add     si,     2
+    
+    jmp     _create_file.got_drive
+
+_create_file.no_adjust:
+
+    cmp     al,     HEX (5A)
+    ja      _create_file.got_drive
+    
+    cmp     al,     HEX (41)
+    jb      _create_file.got_drive
+    
+    sub     al,     'A'
+    
+    mov     byte ptr [bp - 4],      al
+    add     si,     2
+
+_create_file.got_drive:
+
+    mov     di,     offset _file_path
+    
+    mov     al,     byte ptr [bp - 4]
+    add     al,     'A'
+    stosb
+    
+    mov     al,     ':'
+    stosb
+    
+    cmp     byte ptr [si],      '\\'
+    je      _create_file.initial_setup
+    
+    mov     al,     '\\'
+    stosb
+    
+    push    dx
+    push    si
+    
+    mov     dl,     byte ptr [bp - 4]
+    mov     si,     di
+    
+    mov     ah,     HEX (47)
+    int     HEX (21)
+    
+    pop     si
+    pop     dx
+    
+    mov     di,     offset _file_path
+    push    di
+    
+    call    _strlen
+    add     sp,     2
+    
+    add     di,     ax
+
+_create_file.initial_setup:
+
+    cmp     byte ptr es:[di - 1],   '\\'
+    je      _create_file.no_slash
+    
+    mov     al,     '\\'
+    stosb
+
+_create_file.no_slash:
+
+    mov     bx,     si
+
+_create_file.loop:
+
+    mov     ax,     si
+    sub     ax,     bx
+    
+    cmp     ax,     65
+    ja      _create_file.check_path
+    
+    lodsb
+    
+    and     al,     al
+    jz      _create_file.check_path
+    
+    cmp     al,     '.'
+    je      _create_file.check_curr
+    
+    cmp     al,     '\\'
+    jne     _create_file.convert_alpha
+    
+    cmp     si,     bx
+    je      _create_file.loop
+    
+    cmp     byte ptr es:[di - 1],   '\\'
+    je      _create_file.loop
+
+_create_file.convert_alpha:
+
+    xor     ah,     ah
+    push    ax
+    
+    call    _isalpha
+    
+    and     ax,     ax
+    jz      _create_file.no_alpha
+    
+    call    _toupper
+    add     sp,     2
+    
+    jmp     _create_file.char_ok2
+
+_create_file.no_alpha:
+
+    pop     ax
+    jmp     _create_file.char_ok2
+
+_create_file.check_curr:
+
+    cmp     byte ptr [si],  0
+    je      _create_file.loop
+    
+    cmp     byte ptr [si],  '\\'
+    je      _create_file.loop
+    
+    cmp     byte ptr [si],  '.'
+    je      _create_file.check_prev
+    
+    jmp     _create_file.char_ok2
+
+_create_file.check_prev:
+
+    cmp     byte ptr [si + 1],  0
+    je      _create_file.get_prev
+    
+    cmp     byte ptr [si + 1],  '\\'
+    jne     _create_file.char_ok2
+
+_create_file.get_prev:
+
+    mov     cx,     offset _file_path
+    add     cx,     3
+    
+    cmp     di,     cx
+    je      _create_file.no_slash2
+    
+    cmp     byte ptr es:[di - 1],   '\\'
+    jne     _create_file.no_slash2
+    
+    mov     byte ptr es:[di - 1],   0
+
+_create_file.no_slash2:
+
+    push    si
+    push    ds
+    
+    mov     ax,     cs
+    mov     ds,     ax
+    
+    mov     ax,     '\\'
+    push    ax
+    
+    mov     ax,     offset _file_path
+    push    ax
+    
+    call    _strrchr
+    add     sp,     4
+    
+    pop     ds
+    pop     si
+    
+    and     ax,     ax
+    jnz     _create_file.got_index
+    
+    mov     di,     offset _file_path
+    jmp     _create_file.zero
+
+_create_file.got_index:
+
+    mov     di,     ax
+    inc     di
+
+_create_file.zero:
+
+    mov     byte ptr es:[di],   0
+    jmp     _create_file.loop
+
+_create_file.char_ok2:
+
+    stosb
+    jmp     _create_file.loop
+
+_create_file.check_path:
+
+    ;cmp     byte ptr es:[di - 1],       '\\'
+    ;jne     _create_file.null
+    ;
+    ;dec     di
+
+_create_file.null:
+
+    xor     al,     al
+    stosb
+
+_create_file.open:
+
     mov     ax,     HEX (3D02)
-    mov     dx,     bx
+    mov     dx,     offset _file_path
     int     HEX (21)
-    jnc     _handler_touch.close
+    jnc     _create_file.close
     
     mov     ah,     HEX (3C)
     mov     cx,     HEX (20)
-    mov     dx,     bx
+    mov     dx,     offset _file_path
     int     HEX (21)
-    jnc     _handler_touch.close
+    jnc     _create_file.close
     
     cmp     ax,     3
-    jne     _handler_touch.unhandled
+    jne     _create_file.unhandled
     
     mov     bx,     offset _err_no_path
-    jmp     _handler_touch.error
+    jmp     _create_file.error
 
-_handler_touch.unhandled:
+_create_file.unhandled:
 
-    pop     bx
     mov     bx,     offset _err_unhandled
 
-_handler_touch.error:
+_create_file.error:
 
     call    _writestr
     
     cmp     ax,     3
-    jne     _handler_touch.next
+    jne     _create_file.done
     
-    pop     bx
+    mov     bx,     offset _file_path
     
     call    _writestr
     call    _crlf
     
-    jmp     _handler_touch.next
+    jmp     _create_file.done
 
-_handler_touch.close:
+_create_file.close:
 
-    pop     bx
     mov     bx,     ax
     
     mov     ah,     HEX (3E)
     int     HEX (21)
-    
-    jmp     _handler_touch.next
 
-_handler_touch.cleanup:
-
-    mov     ax,     cs:[_vec_files + 0]
-    push    ax
-    
-    call    _free
-    add     sp,     2
-    
-    mov     ax,     cs
-    mov     es,     ax
-    
-    mov     di,     offset _vec_files
-    xor     al,     al
-    
-    mov     cx,     6
-    rep     stosb
-
-_handler_touch.done:
+_create_file.done:
 
+    pop     cx
     pop     ds
-    pop     es
-    pop     di
-    pop     si
     pop     dx
-    pop     cx
     pop     bx
     pop     ax
-    
-    add     sp,     4
-    pop     bp
-    
     ret
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; Data area.
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 _vec_files:                     db      6       dup (0)
+
 _cmdline:                       db      256     dup (0)
+_file_path:                     db      256     dup (0)
 
 _err_invalid:                   db      "Invalid number of parameters",     HEX (0D),   HEX (0A),   HEX (00)
 
-_err_no_path:                   db      "Path not found: ",         HEX (00)
+_err_no_path:                   db      "Path not found: ",     HEX (00)
 _err_unhandled:                 db      "Unhandled error code",     HEX (0D),   HEX (0A),   HEX (00)
diff --git a/src/apps/pcomm/type.asm b/src/apps/pcomm/type.asm
index da8d569..95c126a 100644
--- a/src/apps/pcomm/type.asm
+++ b/src/apps/pcomm/type.asm
@@ -14,7 +14,7 @@ _handler_type:
     push    bp
     
     mov     bp,     sp
-    sub     sp,     4
+    sub     sp,     6
     
     push    ax
     push    bx
@@ -25,6 +25,7 @@ _handler_type:
     push    es
     push    ds
     
+    mov     word ptr [bp - 6],      0
     mov     word ptr [bp - 4],      0
     mov     word ptr [bp - 2],      0
     
@@ -57,7 +58,7 @@ _handler_type.ok:
 _handler_type.store_arg:
 
     cmp     byte ptr [bx],      0
-    je      _handler_type.next
+    je      _handler_type.check2
     
     mov     si,     bx
     push    si
@@ -80,7 +81,7 @@ _handler_type.check:
     add     sp,     4
     
     and     ax,     ax
-    jz      _handler_type.next
+    jz      _handler_type.check2
     
     mov     bx,     ax
     mov     byte ptr [bx],      0
@@ -90,7 +91,7 @@ _handler_type.check:
 _handler_type.skip:
 
     cmp     byte ptr [bx],      0
-    je      _handler_type.next
+    je      _handler_type.check2
     
     cmp     byte ptr [bx],      ' '
     ja      _handler_type.store_arg
@@ -98,15 +99,20 @@ _handler_type.skip:
     inc     bx
     jmp     _handler_type.skip
 
+_handler_type.check2:
+
+    cmp     word ptr cs:[_vec_files + 4],   1
+    jbe     _handler_type.next
+
 _handler_type.next:
 
-    mov     ax,     word ptr [bp - 4]
+    mov     ax,     word ptr [bp - 6]
     inc     ax
     
     cmp     ax,     cs:[_vec_files + 4]
     ja      _handler_type.cleanup
     
-    mov     word ptr [bp - 4],      ax
+    mov     word ptr [bp - 6],      ax
     dec     ax
     
     xor     dx,     dx
@@ -121,80 +127,358 @@ _handler_type.next:
     mov     es,     ax
     
     mov     ax,     es:[bx]
-    mov     bx,     ax
+    mov     dx,     ax
     
     pop     es
+    
+    call    _read_file
+    jmp     _handler_type.next
+
+_handler_type.cleanup:
+
+    mov     ax,     cs:[_vec_files + 0]
+    push    ax
+    
+    call    _free
+    add     sp,     2
+    
+    mov     ax,     cs
+    mov     es,     ax
+    
+    mov     di,     offset _vec_files
+    xor     al,     al
+    
+    mov     cx,     6
+    rep     stosb
 
-_handler_type.open:
+_handler_type.done:
 
+    pop     ds
+    pop     es
+    pop     di
+    pop     si
+    pop     dx
+    pop     cx
+    pop     bx
+    pop     ax
+    
+    add     sp,     6
+    pop     bp
+    
+    ret
+
+;******************************************************************************
+; @function         _read_file
+;******************************************************************************
+_read_file:
+
+    push    ax
     push    bx
+    push    dx
+    push    ds
+    push    cx
+    
+    mov     di,     offset _file_path
+    mov     cx,     256
+    
+    xor     al,     al
+    rep     stosb
+    
+    mov     ah,     HEX (19)
+    int     HEX (21)
+    
+    mov     byte ptr [bp - 4],      al
+    mov     si,     dx
     
+    push    si
+    
+    call    _strlen
+    add     sp,     2
+    
+    cmp     ax,     2
+    jb      _read_file.got_drive
+    
+    cmp     byte ptr [si + 1],      ':'
+    jne     _read_file.got_drive
+    
+    mov     al,     [si]
+    
+    cmp     al,     HEX (7A)
+    ja      _read_file.no_adjust
+    
+    cmp     al,     HEX (61)
+    jb      _read_file.no_adjust
+    
+    mov     bl,     HEX (20)
+    not     bl
+    
+    sub     al,     'a'
+    
+    mov     byte ptr [bp - 4],      al
+    add     si,     2
+    
+    jmp     _read_file.got_drive
+
+_read_file.no_adjust:
+
+    cmp     al,     HEX (5A)
+    ja      _read_file.got_drive
+    
+    cmp     al,     HEX (41)
+    jb      _read_file.got_drive
+    
+    sub     al,     'A'
+    
+    mov     byte ptr [bp - 4],      al
+    add     si,     2
+
+_read_file.got_drive:
+
+    mov     di,     offset _file_path
+    
+    mov     al,     byte ptr [bp - 4]
+    add     al,     'A'
+    stosb
+    
+    mov     al,     ':'
+    stosb
+    
+    cmp     byte ptr [si],      '\\'
+    je      _read_file.initial_setup
+    
+    mov     al,     '\\'
+    stosb
+    
+    push    dx
+    push    si
+    
+    mov     dl,     byte ptr [bp - 4]
+    mov     si,     di
+    
+    mov     ah,     HEX (47)
+    int     HEX (21)
+    
+    pop     si
+    pop     dx
+    
+    mov     di,     offset _file_path
+    push    di
+    
+    call    _strlen
+    add     sp,     2
+    
+    add     di,     ax
+
+_read_file.initial_setup:
+
+    cmp     byte ptr es:[di - 1],   '\\'
+    je      _read_file.no_slash
+    
+    mov     al,     '\\'
+    stosb
+
+_read_file.no_slash:
+
+    mov     bx,     si
+
+_read_file.loop:
+
+    mov     ax,     si
+    sub     ax,     bx
+    
+    cmp     ax,     65
+    ja      _read_file.check_path
+    
+    lodsb
+    
+    and     al,     al
+    jz      _read_file.check_path
+    
+    cmp     al,     '.'
+    je      _read_file.check_curr
+    
+    cmp     al,     '\\'
+    jne     _read_file.convert_alpha
+    
+    cmp     si,     bx
+    je      _read_file.loop
+    
+    cmp     byte ptr es:[di - 1],   '\\'
+    je      _read_file.loop
+
+_read_file.convert_alpha:
+
+    xor     ah,     ah
+    push    ax
+    
+    call    _isalpha
+    
+    and     ax,     ax
+    jz      _read_file.no_alpha
+    
+    call    _toupper
+    add     sp,     2
+    
+    jmp     _read_file.char_ok2
+
+_read_file.no_alpha:
+
+    pop     ax
+    jmp     _read_file.char_ok2
+
+_read_file.check_curr:
+
+    cmp     byte ptr [si],  0
+    je      _read_file.loop
+    
+    cmp     byte ptr [si],  '\\'
+    je      _read_file.loop
+    
+    cmp     byte ptr [si],  '.'
+    je      _read_file.check_prev
+    
+    jmp     _read_file.char_ok2
+
+_read_file.check_prev:
+
+    cmp     byte ptr [si + 1],  0
+    je      _read_file.get_prev
+    
+    cmp     byte ptr [si + 1],  '\\'
+    jne     _read_file.char_ok2
+
+_read_file.get_prev:
+
+    mov     cx,     offset _file_path
+    add     cx,     3
+    
+    cmp     di,     cx
+    je      _read_file.no_slash2
+    
+    cmp     byte ptr es:[di - 1],   '\\'
+    jne     _read_file.no_slash2
+    
+    mov     byte ptr es:[di - 1],   0
+
+_read_file.no_slash2:
+
+    push    si
+    push    ds
+    
+    mov     ax,     cs
+    mov     ds,     ax
+    
+    mov     ax,     '\\'
+    push    ax
+    
+    mov     ax,     offset _file_path
+    push    ax
+    
+    call    _strrchr
+    add     sp,     4
+    
+    pop     ds
+    pop     si
+    
+    and     ax,     ax
+    jnz     _read_file.got_index
+    
+    mov     di,     offset _file_path
+    jmp     _read_file.zero
+
+_read_file.got_index:
+
+    mov     di,     ax
+    inc     di
+
+_read_file.zero:
+
+    mov     byte ptr es:[di],   0
+    jmp     _read_file.loop
+
+_read_file.char_ok2:
+
+    stosb
+    jmp     _read_file.loop
+
+_read_file.check_path:
+
+    ;cmp     byte ptr es:[di - 1],       '\\'
+    ;jne     _read_file.null
+    ;
+    ;dec     di
+
+_read_file.null:
+
+    xor     al,     al
+    stosb
+
+_read_file.open:
+
     mov     ax,     HEX (3D02)
-    mov     dx,     bx
+    mov     dx,     offset _file_path
     int     HEX (21)
-    jnc     _handler_type.file_open
+    jnc     _read_file.file_open
     
     cmp     ax,     2
-    jne     _handler_type.check3
+    jne     _read_file.check3
     
     mov     bx,     offset _err_no_file
-    jmp     _handler_type.error
+    jmp     _read_file.error
 
-_handler_type.check3:
+_read_file.check3:
 
     cmp     ax,     3
-    jne     _handler_type.unhandled
+    jne     _read_file.unhandled
     
     mov     bx,     offset _err_no_dir
-    jmp     _handler_type.error
+    jmp     _read_file.error
 
-_handler_type.unhandled:
+_read_file.unhandled:
 
-    pop     bx
     mov     bx,     offset _err_unhandled
 
-_handler_type.error:
+_read_file.error:
 
     call    _writestr
     
     cmp     ax,     3
-    ja      _handler_type.cleanup
+    ja      _read_file.done
     
     cmp     ax,     2
-    jb      _handler_type.cleanup
+    jb      _read_file.done
     
-    pop     bx
+    mov     bx,     offset _file_path
     
     call    _writestr
     call    _crlf
     
-    jmp     _handler_type.cleanup
+    jmp     _read_file.done
 
-_handler_type.file_open:
+_read_file.file_open:
 
-    pop     bx
     mov     bx,     ax
 
-_handler_type.clear_and_read:
+_read_file.clear_and_read:
 
     mov     ah,     HEX (3F)
     mov     cx,     255
     mov     dx,     offset _buffer
     int     HEX (21)
-    jc      _handler_type.close
+    jc      _read_file.close
     
     and     ax,     ax
-    jz      _handler_type.close
+    jz      _read_file.close
     
     mov     si,     dx
     mov     cx,     ax
 
-_handler_type.print_loop:
+_read_file.print_loop:
 
     lodsb
     
     cmp     al,     HEX (0A)
-    jne     _handler_type.char_ok
+    jne     _read_file.char_ok
     
     push    ax
     
@@ -204,66 +488,41 @@ _handler_type.print_loop:
     
     pop     ax
 
-_handler_type.char_ok:
+_read_file.char_ok:
 
     mov     ah,     HEX (02)
     mov     dl,     al
     int     HEX (21)
     
     dec     cx
-    jnz     _handler_type.print_loop
+    jnz     _read_file.print_loop
 
-_handler_type.read_done:
+_read_file.read_done:
 
-    jmp     _handler_type.clear_and_read
+    jmp     _read_file.clear_and_read
 
-_handler_type.close:
+_read_file.close:
 
     mov     ah,     HEX (3E)
     int     HEX (21)
-    
-    jmp     _handler_type.next
-
-_handler_type.cleanup:
-
-    mov     ax,     cs:[_vec_files + 0]
-    push    ax
-    
-    call    _free
-    add     sp,     2
-    
-    mov     ax,     cs
-    mov     es,     ax
-    
-    mov     di,     offset _vec_files
-    xor     al,     al
-    
-    mov     cx,     6
-    rep     stosb
 
-_handler_type.done:
+_read_file.done:
 
+    pop     cx
     pop     ds
-    pop     es
-    pop     di
-    pop     si
     pop     dx
-    pop     cx
     pop     bx
     pop     ax
-    
-    add     sp,     4
-    pop     bp
-    
     ret
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; Data area.
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 _vec_files:                     db      6       dup (0)
-
 _cmdline:                       db      256     dup (0)
-_buffer:                        db      256     dup (0)
+
+_file_path:                     db      256     dup (0)
+_buffer:                        dw      256     dup (0)
 
 _err_invalid:                   db      "Invalid number of parameters",     HEX (0D),   HEX (0A),   HEX (00)
 
diff --git a/src/apps/pcomm/xstrcpy.asm b/src/apps/pcomm/xstrcpy.asm
index cbe9400..4812b53 100644
--- a/src/apps/pcomm/xstrcpy.asm
+++ b/src/apps/pcomm/xstrcpy.asm
@@ -19,14 +19,14 @@ _xstrcpy:
     push    si
     push    di
     
-    mov     si,     [bp + 6]
-    mov     di,     [bp + 4]
+    mov     si,     word ptr [bp + 6]
+    mov     di,     word ptr [bp + 4]
 
 _xstrcpy.loop:
 
     lodsb
     
-    or      al,     al
+    and     al,     al
     jz      _xstrcpy.done
     
     cmp     al,     HEX (7A)
diff --git a/src/kernel/file.asm b/src/kernel/file.asm
index 92957e2..091aef0 100644
--- a/src/kernel/file.asm
+++ b/src/kernel/file.asm
@@ -566,6 +566,8 @@ _open_file.found_dir:
     ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
     test    cl,     HEX (18)
     jz      _open_file.got_file
+    
+    jmp     _open_file.error
 
 _open_file.name_error:
 
@@ -1162,7 +1164,7 @@ _write_file:
     push    bp
     
     mov     bp,     sp
-    sub     sp,     16
+    sub     sp,     26
     
     push    bx
     push    cx
@@ -1187,49 +1189,66 @@ _write_file:
     ;; If theres zero byte to write then truncate/extend.
     ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
     and     cx,     cx
-    jz      _write_file.zero
+    jz      .L5
     
     ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-    ;; For now we'll jump to error
+    ;; Check if the file needs expaning.
     ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-    jmp     _write_file.error
-
-_write_file.zero:
-
-    mov     ax,     es:[si + 66]
-    mov     dx,     es:[si + 68]
+    mov     word ptr [bp - 22],     dx
+    mov     word ptr [bp - 20],     cx
     
-    cmp     dx,     es:[si + 64]
-    ja      _write_file.truncate
+    mov     ax,     es:[si + 62]
+    mov     dx,     es:[si + 64]
     
-    cmp     dx,     es:[si + 64]
-    jne     _write_file.extend
+    cmp     dx,     es:[si + 68]
+    ja      .L20
     
-    cmp     ax,     es:[si + 62]
-    jb      _write_file.extend
+    cmp     dx,     es:[si + 68]
+    jne     .L19
+    
+    cmp     ax,     es:[si + 66]
+    jbe     .L19
 
-_write_file.truncate:
+.L20:
 
-    mov     bx,     es:[si + 58]
-    or      bx,     es:[si + 60]
+    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+    ;; Make sure the disk buffer is cleared.
+    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+    push    es
+    push    di
+    push    ax
     
-    and     bx,     bx
-    jz      _write_file.done
+    mov     cx,     es:[si + 50]
+    xor     di,     di
+    
+    mov     ax,     cs:[_disk_scratch]
+    mov     es,     ax
+    
+    xor     al,     al
+    rep     stosb
+    
+    pop     ax
+    pop     di
+    pop     es
     
+    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+    ;; Now we need to figure out how many clusters are in use and how many
+    ;; are in total.
+    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
     mov     cx,     es:[si + 50]
     div     cx
     
     mov     bx,     ax
     
     and     dx,     dx
-    jz      .L3
+    jz      .L21
     
     inc     bx
 
-.L3:
+.L21:
 
-    mov     ax,     es:[si + 62]
-    mov     dx,     es:[si + 64]
+    mov     ax,     es:[si + 66]
+    mov     dx,     es:[si + 68]
     
     mov     cx,     es:[si + 50]
     div     cx
@@ -1237,122 +1256,116 @@ _write_file.truncate:
     mov     cx,     ax
     
     and     dx,     dx
-    jz      .L3
+    jz      .L22
     
     inc     cx
 
-.L4:
+.L22:
 
+    mov     word ptr [bp - 12],     bx
     xchg    bx,     cx
     
+    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+    ;; Check if we have a starting cluster.
+    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
     mov     ax,     es:[si + 58]
     mov     dx,     es:[si + 60]
-
-_write_file.truncate_walk:
-
-    mov     word ptr [bp - 6],      ax
-    mov     word ptr [bp - 4],      dx
-    
-    and     bx,     bx
-    jz      _write_file.truncate_ok
-    
-    dec     cx
-    
-    call    cs:[_next_cluster]
-    jc      _write_file.truncate_ok
-    
-    dec     bx
-    jnz     _write_file.truncate_walk
-
-_write_file.truncate_ok:
-
-    mov     ax,     word ptr [bp - 6]
-    mov     dx,     word ptr [bp - 4]
-    
-    mov     word ptr [bp - 16],     ax
-    mov     word ptr [bp - 14],     dx
-    
-    mov     word ptr [bp - 12],     cx
-
-_write_file.truncate_loop:
-
-    and     cx,     cx
-    jz      _write_file.truncate_done
     
-    call    cs:[_next_cluster]
-    jc      _write_file.truncate_done
-    
-    push    si
-    push    di
+    mov     di,     ax
+    or      di,     dx
     
-    mov     si,     ax
-    mov     di,     dx
+    and     di,     di
+    jnz     .L27
     
-    mov     ax,     word ptr [bp - 6]
-    mov     dx,     word ptr [bp - 4]
+    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+    ;; Try find a new cluster.
+    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+    call    cs:[_find_free]
+    jc      _write_file.done
     
-    mov     word ptr [bp - 6],      si
-    mov     word ptr [bp - 4],      di
+    mov     word ptr [bp - 6],      ax
+    mov     word ptr [bp - 4],      dx
     
-    pop     di
-    pop     si
+    dec     cx
     
     push    bx
     push    cx
     
-    xor     bx,     bx
-    xor     cx,     cx
-    
+    mov     bx,     HEX (FFFF)
+    mov     cx,     HEX (FFF8)
     call    cs:[_update_cluster]
     
     pop     cx
     pop     bx
     
-    mov     ax,     word ptr [bp - 6]
-    mov     dx,     word ptr [bp - 4]
+    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+    ;; Update the file info.
+    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+    mov     es:[si + 58],       ax
+    mov     es:[si + 60],       dx
     
-    dec     cx
-    jnz     _write_file.truncate_loop
-
-_write_file.truncate_done:
-
-    mov     ax,     word ptr [bp - 6]
-    mov     dx,     word ptr [bp - 4]
+    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+    ;; Update the sector on disk.
+    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+    push    bx
+    push    cx
+    call    cs:[_convert_cluster]
+    
+    pop     cx
+    pop     bx
+    jc      _write_file.done
     
+    push    es
     push    bx
     push    cx
     
-    xor     bx,     bx
-    xor     cx,     cx
+    xor     ch,     ch
+    mov     cl,     cs:[_sectors_per_cluster]
     
-    call    cs:[_update_cluster]
+    mov     bx,     cs:[_disk_scratch]
+    mov     es,     bx
+    
+    xor     bx,     bx
+    call    _write_sectors
     
     pop     cx
     pop     bx
+    pop     es
     
-    xor     ax,     ax
-    xor     dx,     dx
-    
-    mov     bx,     es:[si + 62]
-    or      bx,     es:[si + 64]
+    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+    ;; Jump straight to writing the sectors.
+    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+    jmp     .L26
+
+.L27:
+
+    mov     word ptr [bp - 6],      ax
+    mov     word ptr [bp - 4],      dx
     
     and     bx,     bx
-    jz      _write_file.truncate_update
+    jz      .L26
     
-    mov     cx,     word ptr [bp - 12]
+    call    cs:[_next_cluster]
+    jc      .L26
     
-    cmp     cx,     2
-    jb      _write_file.truncate_expand_done
+    dec     word ptr [bp - 12]
+    dec     cx
     
-    sub     cx,     2
+    dec     bx
+    jnz     .L27
 
-_write_file.truncate_expand:
+.L26:
+
+    mov     ax,     word ptr [bp - 6]
+    mov     dx,     word ptr [bp - 4]
+
+.L28:
 
     and     cx,     cx
-    jz      _write_file.truncate_expand_done
+    jz      .L29
     
     call    cs:[_find_free]
-    jc      _write_file.truncate_expand_done
+    jc      _write_file.done
     
     push    bx
     push    cx
@@ -1360,44 +1373,97 @@ _write_file.truncate_expand:
     mov     bx,     dx
     mov     cx,     ax
     
-    mov     ax,     word ptr [bp - 16]
-    mov     dx,     word ptr [bp - 14]
+    mov     ax,     word ptr [bp - 6]
+    mov     dx,     word ptr [bp - 4]
     
     call    cs:[_update_cluster]
     
-    mov     word ptr [bp - 16],     cx
-    mov     word ptr [bp - 14],     bx
+    push    bx
+    push    cx
+    call    cs:[_convert_cluster]
+    
+    pop     cx
+    pop     bx
+    jc      .L29
+    
+    push    es
+    push    bx
+    push    cx
+    
+    xor     ch,     ch
+    mov     cl,     cs:[_sectors_per_cluster]
+    
+    mov     bx,     cs:[_disk_scratch]
+    mov     es,     bx
+    
+    xor     bx,     bx
+    call    _write_sectors
+    
+    pop     cx
+    pop     bx
+    pop     es
+    
+    mov     ax,     cx
+    mov     dx,     bx
+    
+    mov     bx,     HEX (FFFF)
+    mov     cx,     HEX (FFF8)
+    call    cs:[_update_cluster]
     
     pop     cx
     pop     bx
     
+    mov     word ptr [bp - 6],      ax
+    mov     word ptr [bp - 4],      dx
+    
     dec     cx
-    jnz     _write_file.truncate_expand
+    jnz     .L28
 
-_write_file.truncate_expand_done:
+.L29:
 
+    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+    ;; Preserve registers.
+    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+    push    es
     push    bx
     push    cx
     
+    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+    ;; Mark the current cluster as EOF.
+    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
     mov     bx,     HEX (FFFF)
     mov     cx,     HEX (FFF8)
     
-    mov     ax,     word ptr [bp - 16]
-    mov     dx,     word ptr [bp - 14]
+    mov     ax,     word ptr [bp - 6]
+    mov     dx,     word ptr [bp - 4]
     
     call    cs:[_update_cluster]
     
+    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+    ;; Update the sector on disk.
+    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+    call    cs:[_convert_cluster]
+    jc      _write_file.done
+    
+    xor     ch,     ch
+    mov     cl,     cs:[_sectors_per_cluster]
+    
+    mov     bx,     cs:[_disk_scratch]
+    mov     es,     bx
+    
+    xor     bx,     bx
+    call    _write_sectors
+    
+    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+    ;; Restore registers.
+    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
     pop     cx
     pop     bx
+    pop     es
     
-    mov     ax,     es:[si + 58]
-    mov     dx,     es:[si + 60]
-
-_write_file.truncate_update:
-
-    mov     es:[si + 58],       ax
-    mov     es:[si + 60],       dx
-    
+    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+    ;; Update the stack variables.
+    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
     mov     ax,     es:[si + 58]
     mov     word ptr [bp - 6],      ax
     
@@ -1462,11 +1528,15 @@ _write_file.truncate_update:
     mov     ax,     cs:[_info_sector]
     
     and     ax,     ax
-    jz      _write_file.done
+    jz      .L19
     
     ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
     ;; Update the free clusters.
     ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+    push    es
+    push    bx
+    push    cx
+    
     xor     dx,     dx
     
     add     ax,     cs:[_hidden_sectors]
@@ -1484,8 +1554,8 @@ _write_file.truncate_update:
     mov     ax,     es:[di + 8]
     mov     dx,     es:[di + 10]
     
-    add     ax,     word ptr [bp - 12]
-    adc     dx,     0
+    sub     ax,     word ptr [bp - 12]
+    sbb     dx,     0
     
     mov     es:[di + 8],    ax
     mov     es:[di + 10],   dx
@@ -1499,34 +1569,781 @@ _write_file.truncate_update:
     mov     cx,     1
     call    _write_sectors
     
-    jmp     _write_file.done
+    pop     cx
+    pop     bx
+    pop     es
 
-_write_file.extend:
+.L19:
 
-    push    es
-    push    di
-    push    ax
-    
-    xor     cx,     es:[si + 50]
-    
-    mov     ax,     cs:[_disk_scratch]
-    mov     es,     ax
-    xor     di,     di
-    
-    xor     al,     al
-    rep     stosb
+    mov     word ptr [bp - 12],     0
+    mov     word ptr [bp - 2],      0
     
-    pop     ax
-    pop     di
-    pop     es
+    mov     ax,     es:[si + 62]
+    mov     dx,     es:[si + 64]
     
     mov     cx,     es:[si + 50]
     div     cx
     
-    mov     bx,     ax
-    
     and     dx,     dx
-    jz      .L2
+    jz      .L30
+    
+    inc     ax
+
+.L30:
+
+    mov     word ptr [bp - 26],     ax
+    
+    mov     ax,     es:[si + 66]
+    mov     dx,     es:[si + 68]
+    
+    mov     cx,     es:[si + 50]
+    div     cx
+    
+    and     dx,     dx
+    jz      .L31
+    
+    inc     ax
+
+.L31:
+
+    mov     word ptr [bp - 24],     ax
+
+.L32:
+
+    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+    ;; Make sure the disk buffer is cleared.
+    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+    push    es
+    push    di
+    push    ax
+    
+    mov     cx,     es:[si + 50]
+    xor     di,     di
+    
+    mov     ax,     cs:[_disk_scratch]
+    mov     es,     ax
+    
+    xor     al,     al
+    rep     stosb
+    
+    pop     ax
+    pop     di
+    pop     es
+
+.L34:
+
+    mov     cx,     word ptr [bp - 20]
+    
+    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+    ;; If we don't have any data left then we're done.
+    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+    and     cx,     cx
+    jz      .L42
+    
+    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+    ;; Figure out what cluster we need to write to.
+    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+    mov     ax,     es:[si + 62]
+    mov     dx,     es:[si + 64]
+    
+    mov     cx,     es:[si + 50]
+    div     cx
+    
+    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+    ;; Copy the value in the dx register (offset into the cluster) into
+    ;; the di register.
+    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+    mov     di,     dx
+    
+    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+    ;; Calaculate how many bytes need to be write.
+    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+    mov     cx,     es:[si + 50]
+    sub     cx,     di
+    
+    cmp     cx,     word ptr [bp - 20]
+    jb      .L35
+    
+    mov     cx,     word ptr [bp - 20]
+
+.L35:
+
+    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+    ;; Are we writing to an existing cluster or a new one?
+    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+    cmp     ax,     word ptr [bp - 24]
+    jae     .L36
+    
+    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+    ;; Copy the cluster count to the bx register.
+    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+    mov     bx,     ax
+    
+    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+    ;; Get the starting cluster.
+    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+    mov     ax,     es:[si + 58]
+    mov     dx,     es:[si + 60]
+
+.L37:
+
+    and     bx,     bx
+    jz      .L38
+    
+    call    cs:[_next_cluster]
+    jc      .L42
+    
+    dec     bx
+    jnz     .L37
+
+.L38:
+
+    mov     word ptr [bp - 6],      ax
+    mov     word ptr [bp - 4],      dx
+    
+    push    si
+    push    es
+    push    ds
+    push    cx
+    
+    push    bx
+    push    cx
+    call    cs:[_convert_cluster]
+    
+    pop     cx
+    pop     bx
+    jc      .L43
+    
+    push    ax
+    push    dx
+    push    si
+    push    di
+    push    cx
+    
+    mov     bx,     es:[si + 70]
+    mov     es,     bx
+    
+    xor     ch,     ch
+    mov     cl,     cs:[_sectors_per_cluster]
+    
+    xor     bx,     bx
+    call    _read_sectors
+    
+    pop     cx
+    push    cx
+    
+    mov     si,     word ptr [bp - 22]
+    rep     movsb
+    
+    pop     cx
+    pop     di
+    pop     si
+    pop     dx
+    pop     ax
+    
+    sub     word ptr [bp - 20],     cx
+    add     word ptr [bp - 2],      cx
+    add     word ptr [bp - 22],     cx
+    
+    xor     ch,     ch
+    mov     cl,     cs:[_sectors_per_cluster]
+    
+    xor     bx,     bx
+    call    _write_sectors
+    
+    pop     cx
+    pop     ds
+    pop     es
+    pop     si
+    
+    add     es:[si + 62],       cx
+    adc     word ptr es:[si + 64],      0
+    
+    jmp     .L34
+
+.L36:
+
+    mov     ax,     es:[si + 58]
+    mov     dx,     es:[si + 60]
+    
+    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+    ;; Do we have a starting cluster?
+    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+    mov     bx,     ax
+    or      bx,     dx
+    
+    and     bx,     bx
+    jnz     .L39
+    
+    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+    ;; Try find a new cluster.
+    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+    call    cs:[_find_free]
+    jc      .L42
+    
+    mov     word ptr [bp - 6],      ax
+    mov     word ptr [bp - 4],      dx
+    
+    push    bx
+    push    cx
+    
+    mov     bx,     HEX (FFFF)
+    mov     cx,     HEX (FFF8)
+    call    cs:[_update_cluster]
+    
+    pop     cx
+    pop     bx
+    
+    inc     word ptr [bp - 12]
+    
+    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+    ;; Update the file info.
+    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+    mov     es:[si + 58],       ax
+    mov     es:[si + 60],       dx
+    
+    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+    ;; Update the sector on disk.
+    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+    push    bx
+    push    cx
+    call    cs:[_convert_cluster]
+    
+    pop     cx
+    pop     bx
+    jc      _write_file.done
+    
+    push    es
+    push    bx
+    push    cx
+    
+    xor     ch,     ch
+    mov     cl,     cs:[_sectors_per_cluster]
+    
+    mov     bx,     cs:[_disk_scratch]
+    mov     es,     bx
+    
+    xor     bx,     bx
+    call    _write_sectors
+    
+    pop     cx
+    pop     bx
+    pop     es
+    
+    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+    ;; Jump straight to writing the sectors.
+    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+    jmp     .L40
+
+.L39:
+
+    mov     word ptr [bp - 6],      ax
+    mov     word ptr [bp - 4],      dx
+    
+    call    cs:[_next_cluster]
+    jc      .L41
+    
+    jmp     .L39
+
+.L41:
+
+    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+    ;; Try find a new cluster.
+    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+    call    cs:[_find_free]
+    jc      .L42
+    
+    push    bx
+    push    cx
+    push    ax
+    push    dx
+    
+    mov     bx,     dx
+    mov     cx,     ax
+    
+    mov     ax,     word ptr [bp - 6]
+    mov     dx,     word ptr [bp - 4]
+    call    cs:[_update_cluster]
+    
+    pop     dx
+    pop     ax
+    pop     cx
+    pop     bx
+    
+    mov     word ptr [bp - 6],      ax
+    mov     word ptr [bp - 4],      dx
+    
+    push    bx
+    push    cx
+    
+    mov     bx,     HEX (FFFF)
+    mov     cx,     HEX (FFF8)
+    call    cs:[_update_cluster]
+    
+    pop     cx
+    pop     bx
+    
+    inc     word ptr [bp - 12]
+    
+    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+    ;; Update the sector on disk.
+    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+    push    bx
+    push    cx
+    call    cs:[_convert_cluster]
+    
+    pop     cx
+    pop     bx
+    jc      _write_file.done
+    
+    push    es
+    push    bx
+    push    cx
+    
+    xor     ch,     ch
+    mov     cl,     cs:[_sectors_per_cluster]
+    
+    mov     bx,     cs:[_disk_scratch]
+    mov     es,     bx
+    
+    xor     bx,     bx
+    call    _write_sectors
+    
+    pop     cx
+    pop     bx
+    pop     es
+
+.L40:
+
+    push    si
+    push    es
+    push    ds
+    push    cx
+    
+    push    ax
+    push    di
+    push    cx
+    
+    mov     ax,     es:[si + 70]
+    mov     cx,     es:[si + 50]
+    
+    mov     es,     ax
+    
+    xor     al,     al
+    rep     stosb
+    
+    pop     cx
+    pop     di
+    pop     ax
+    
+    push    si
+    push    di
+    push    cx
+    
+    mov     si,     word ptr [bp - 22]
+    rep     movsb
+    
+    pop     cx
+    pop     di
+    pop     si
+    
+    push    cx
+    push    bx
+    
+    mov     ax,     word ptr [bp - 6]
+    mov     dx,     word ptr [bp - 4]
+    call    cs:[_convert_cluster]
+    
+    pop     bx
+    pop     cx
+    jc      .L43
+    
+    sub     word ptr [bp - 20],     cx
+    add     word ptr [bp - 2],      cx
+    add     word ptr [bp - 22],     cx
+    
+    xor     ch,     ch
+    mov     cl,     cs:[_sectors_per_cluster]
+    
+    xor     bx,     bx
+    call    _write_sectors
+    
+    pop     cx
+    pop     ds
+    pop     es
+    pop     si
+    
+    add     es:[si + 62],       cx
+    adc     word ptr es:[si + 64],      0
+    
+    jmp     .L34
+
+.L43:
+
+    pop     cx
+    pop     ds
+    pop     es
+    pop     si
+
+.L42:
+
+    mov     ax,     es:[si + 62]
+    mov     dx,     es:[si + 64]
+    
+    cmp     dx,     es:[si + 68]
+    ja      .L44
+    
+    cmp     dx,     es:[si + 68]
+    jne     .L45
+    
+    cmp     ax,     es:[si + 66]
+    jb      .L45
+
+.L44:
+
+    mov     ax,     es:[si + 62]
+    mov     dx,     es:[si + 64]
+    
+    mov     es:[si + 66],       ax
+    mov     es:[si + 68],       dx
+
+.L45:
+
+    mov     ax,     es:[si + 66]
+    mov     word ptr [bp - 10],     ax
+    
+    mov     ax,     es:[si + 68]
+    mov     word ptr [bp - 8],      ax
+    
+    mov     ax,     es:[si + 58]
+    mov     word ptr [bp - 6],      ax
+    
+    mov     ax,     es:[si + 60]
+    mov     word ptr [bp - 4],      ax
+    
+    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+    ;; Update the entry on disk.
+    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+    mov     ax,     es:[si + 74]
+    mov     dx,     es:[si + 76]
+    
+    mov     cx,     es:[si + 78]
+    mov     di,     es:[si + 80]
+    
+    push    es
+    push    bx
+    push    ax
+    push    dx
+    push    cx
+    
+    mov     bx,     cs:[_disk_scratch]
+    mov     es,     bx
+    
+    xor     bx,     bx
+    call    _read_sectors
+    
+    mov     ax,     word ptr [bp - 6]
+    mov     es:[di + 26],       ax
+    
+    mov     ax,     word ptr [bp - 4]
+    mov     es:[di + 20],       ax
+    
+    mov     ax,     word ptr [bp - 10]
+    mov     es:[di + 28],       ax
+    
+    mov     ax,     word ptr [bp - 8]
+    mov     es:[di + 30],       ax
+    
+    pop     cx
+    pop     dx
+    pop     ax
+    
+    xor     bx,     bx
+    call    _write_sectors
+    
+    pop     bx
+    pop     es
+    
+    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+    ;; Check if we have an info sector.
+    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+    mov     ax,     cs:[_info_sector]
+    
+    and     ax,     ax
+    jz      _write_file.done
+    
+    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+    ;; Update the free clusters.
+    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+    xor     dx,     dx
+    
+    add     ax,     cs:[_hidden_sectors]
+    adc     dx,     cs:[_hidden_sectors + 2]
+    
+    mov     bx,     cs:[_disk_scratch]
+    mov     es,     bx
+    xor     bx,     bx
+    
+    mov     cx,     1
+    call    _read_sectors
+    
+    mov     di,     HEX (01E0)
+    
+    mov     ax,     es:[di + 8]
+    mov     dx,     es:[di + 10]
+    
+    sub     ax,     word ptr [bp - 12]
+    sbb     dx,     0
+    
+    mov     es:[di + 8],    ax
+    mov     es:[di + 10],   dx
+    
+    mov     ax,     cs:[_info_sector]
+    xor     dx,     dx
+    
+    add     ax,     cs:[_hidden_sectors]
+    adc     dx,     cs:[_hidden_sectors + 2]
+    
+    mov     cx,     1
+    call    _write_sectors
+    
+    jmp     _write_file.done
+
+.L5:
+
+    mov     ax,     es:[si + 66]
+    mov     dx,     es:[si + 68]
+    
+    cmp     dx,     es:[si + 64]
+    ja      .L18
+    
+    cmp     dx,     es:[si + 64]
+    jne     .L17
+    
+    cmp     ax,     es:[si + 62]
+    jb      .L17
+
+.L18:
+
+    mov     bx,     es:[si + 58]
+    or      bx,     es:[si + 60]
+    
+    and     bx,     bx
+    jz      _write_file.done
+    
+    mov     cx,     es:[si + 50]
+    div     cx
+    
+    mov     bx,     ax
+    
+    and     dx,     dx
+    jz      .L3
+    
+    inc     bx
+
+.L3:
+
+    mov     ax,     es:[si + 62]
+    mov     dx,     es:[si + 64]
+    
+    mov     cx,     es:[si + 50]
+    div     cx
+    
+    mov     cx,     ax
+    
+    and     dx,     dx
+    jz      .L3
+    
+    inc     cx
+
+.L4:
+
+    xchg    bx,     cx
+    
+    mov     ax,     es:[si + 58]
+    mov     dx,     es:[si + 60]
+
+.L7:
+
+    mov     word ptr [bp - 6],      ax
+    mov     word ptr [bp - 4],      dx
+    
+    and     bx,     bx
+    jz      .L8
+    
+    dec     cx
+    
+    call    cs:[_next_cluster]
+    jc      .L8
+    
+    dec     bx
+    jnz     .L7
+
+.L8:
+
+    mov     ax,     word ptr [bp - 6]
+    mov     dx,     word ptr [bp - 4]
+    
+    mov     word ptr [bp - 16],     ax
+    mov     word ptr [bp - 14],     dx
+    
+    mov     word ptr [bp - 12],     cx
+
+.L9:
+
+    and     cx,     cx
+    jz      .L10
+    
+    call    cs:[_next_cluster]
+    jc      .L10
+    
+    push    si
+    push    di
+    
+    mov     si,     ax
+    mov     di,     dx
+    
+    mov     ax,     word ptr [bp - 6]
+    mov     dx,     word ptr [bp - 4]
+    
+    mov     word ptr [bp - 6],      si
+    mov     word ptr [bp - 4],      di
+    
+    pop     di
+    pop     si
+    
+    push    bx
+    push    cx
+    
+    xor     bx,     bx
+    xor     cx,     cx
+    
+    call    cs:[_update_cluster]
+    
+    pop     cx
+    pop     bx
+    
+    mov     ax,     word ptr [bp - 6]
+    mov     dx,     word ptr [bp - 4]
+    
+    dec     cx
+    jnz     .L9
+
+.L10:
+
+    mov     ax,     word ptr [bp - 6]
+    mov     dx,     word ptr [bp - 4]
+    
+    push    bx
+    push    cx
+    
+    xor     bx,     bx
+    xor     cx,     cx
+    
+    call    cs:[_update_cluster]
+    
+    pop     cx
+    pop     bx
+    
+    xor     ax,     ax
+    xor     dx,     dx
+    
+    mov     bx,     es:[si + 62]
+    or      bx,     es:[si + 64]
+    
+    and     bx,     bx
+    jz      .L12
+    
+    mov     cx,     word ptr [bp - 12]
+    
+    cmp     cx,     2
+    jb      .L6
+    
+    sub     cx,     2
+
+.L11:
+
+    and     cx,     cx
+    jz      .L6
+    
+    call    cs:[_find_free]
+    jc      .L6
+    
+    push    bx
+    push    cx
+    
+    mov     bx,     dx
+    mov     cx,     ax
+    
+    mov     ax,     word ptr [bp - 16]
+    mov     dx,     word ptr [bp - 14]
+    
+    call    cs:[_update_cluster]
+    
+    mov     word ptr [bp - 16],     cx
+    mov     word ptr [bp - 14],     bx
+    
+    pop     cx
+    pop     bx
+    
+    dec     cx
+    jnz     .L11
+
+.L6:
+
+    push    bx
+    push    cx
+    
+    mov     bx,     HEX (FFFF)
+    mov     cx,     HEX (FFF8)
+    
+    mov     ax,     word ptr [bp - 16]
+    mov     dx,     word ptr [bp - 14]
+    
+    call    cs:[_update_cluster]
+    
+    pop     cx
+    pop     bx
+    
+    mov     ax,     es:[si + 58]
+    mov     dx,     es:[si + 60]
+
+.L12:
+
+    mov     es:[si + 58],       ax
+    mov     es:[si + 60],       dx
+    
+    mov     word ptr [bp - 18],     1
+    jmp     .L23
+
+.L17:
+
+    mov     word ptr [bp - 18],     0
+    
+    push    es
+    push    di
+    push    ax
+    
+    mov     cx,     es:[si + 50]
+    
+    mov     ax,     cs:[_disk_scratch]
+    mov     es,     ax
+    xor     di,     di
+    
+    xor     al,     al
+    rep     stosb
+    
+    pop     ax
+    pop     di
+    pop     es
+    
+    mov     cx,     es:[si + 50]
+    div     cx
+    
+    mov     bx,     ax
+    
+    and     dx,     dx
+    jz      .L2
     
     inc     bx
 
@@ -1546,6 +2363,8 @@ _write_file.extend:
     inc     cx
 
 .L1:
+
+    mov     word ptr [bp - 12],     cx
     
     mov     ax,     es:[si + 58]
     mov     dx,     es:[si + 60]
@@ -1554,7 +2373,7 @@ _write_file.extend:
     or      di,     dx
     
     and     di,     di
-    jnz     _write_file.extend_walk
+    jnz     .L13
     
     call    cs:[_find_free]
     jc      _write_file.done
@@ -1562,6 +2381,16 @@ _write_file.extend:
     mov     word ptr [bp - 6],      ax
     mov     word ptr [bp - 4],      dx
     
+    push    bx
+    push    cx
+    
+    mov     bx,     HEX (FFFF)
+    mov     cx,     HEX (FFF8)
+    call    cs:[_update_cluster]
+    
+    pop     cx
+    pop     bx
+    
     mov     es:[si + 58],       ax
     mov     es:[si + 60],       dx
     
@@ -1587,38 +2416,39 @@ _write_file.extend:
     call    _write_sectors
     
     pop     cx
+    dec     cx
+    
     pop     bx
     pop     es
     
-    jmp     _write_file.extend_no_walk
+    jmp     .L14
 
-_write_file.extend_walk:
+.L13:
 
     mov     word ptr [bp - 6],      ax
     mov     word ptr [bp - 4],      dx
     
     and     bx,     bx
-    jz      _write_file.extend_no_walk
+    jz      .L14
     
     call    cs:[_next_cluster]
-    jc      _write_file.extend_no_walk
+    jc      .L14
     
+    dec     word ptr [bp - 12]
     dec     cx
     
     dec     bx
-    jnz     _write_file.extend_walk
+    jnz     .L13
 
-_write_file.extend_no_walk:
+.L14:
 
     mov     ax,     word ptr [bp - 6]
     mov     dx,     word ptr [bp - 4]
-    
-    mov     word ptr [bp - 12],     cx
 
-_write_file.extend_loop:
+.L15:
 
     and     cx,     cx
-    jz      _write_file.extend_update
+    jz      .L16
     
     call    cs:[_find_free]
     jc      _write_file.done
@@ -1640,7 +2470,7 @@ _write_file.extend_loop:
     
     pop     cx
     pop     bx
-    jc      _write_file.extend_update
+    jc      .L16
     
     push    es
     push    bx
@@ -1659,16 +2489,23 @@ _write_file.extend_loop:
     pop     bx
     pop     es
     
-    mov     word ptr [bp - 6],      cx
-    mov     word ptr [bp - 4],      bx
+    mov     ax,     cx
+    mov     dx,     bx
+    
+    mov     bx,     HEX (FFFF)
+    mov     cx,     HEX (FFF8)
+    call    cs:[_update_cluster]
     
     pop     cx
     pop     bx
     
+    mov     word ptr [bp - 6],      ax
+    mov     word ptr [bp - 4],      dx
+    
     dec     cx
-    jnz     _write_file.extend_loop
+    jnz     .L15
 
-_write_file.extend_update:
+.L16:
 
     push    es
     push    bx
@@ -1697,7 +2534,9 @@ _write_file.extend_update:
     pop     cx
     pop     bx
     pop     es
-    
+
+.L23:
+
     mov     ax,     es:[si + 58]
     mov     word ptr [bp - 6],      ax
     
@@ -1784,9 +2623,21 @@ _write_file.extend_update:
     mov     ax,     es:[di + 8]
     mov     dx,     es:[di + 10]
     
+    cmp     word ptr [bp - 18],     1
+    jb      .L25
+    
+    add     ax,     word ptr [bp - 12]
+    adc     dx,     0
+    
+    jmp     .L24
+
+.L25:
+
     sub     ax,     word ptr [bp - 12]
     sbb     dx,     0
-    
+
+.L24:
+
     mov     es:[di + 8],    ax
     mov     es:[di + 10],   dx
     
@@ -1801,17 +2652,17 @@ _write_file.extend_update:
 
 _write_file.done:
 
-    mov     word ptr es:[si + 54],      1
-    
     pop     ds
     pop     es
     pop     di
     pop     si
+    mov     word ptr es:[si + 54],      1
+    
     pop     dx
     pop     cx
     pop     bx
     
-    add     sp,     16
+    add     sp,     26
     clc
     
     mov     ax,     word ptr [bp - 2]
@@ -1821,17 +2672,17 @@ _write_file.done:
 
 _write_file.error:
 
-    mov     word ptr es:[si + 54],      1
-    
     pop     ds
     pop     es
     pop     di
     pop     si
+    mov     word ptr es:[si + 54],      1
+    
     pop     dx
     pop     cx
     pop     bx
     
-    add     sp,     16
+    add     sp,     26
     stc
     
     mov     ax,     5
diff --git a/src/kernel/int21.asm b/src/kernel/int21.asm
index 7e3899a..eb28c8f 100644
--- a/src/kernel/int21.asm
+++ b/src/kernel/int21.asm
@@ -2588,9 +2588,6 @@ _int21_3C:
     push    es
     push    ds
     
-    xor     bh,     bh
-    mov     bl,     al
-    
     mov     si,     dx
     
     call    _get_disk_info
@@ -2610,7 +2607,11 @@ _int21_3C.create:
     mov     word ptr [bp - 4],      si
     mov     word ptr [bp - 2],      di
     
+    push    cx
+    
     call    _walk_path
+    pop     cx
+    
     jc      _int21_3C.error_path
     
     ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -3452,9 +3453,6 @@ _int21_41:
     push    es
     push    ds
     
-    xor     bh,     bh
-    mov     bl,     al
-    
     mov     si,     dx
     
     call    _get_disk_info
@@ -3521,7 +3519,7 @@ _int21_41.open:
     or      bx,     dx
     
     and     bx,     bx
-    jz      _int21_41.update
+    jz      _int21_41.no_start
     
     ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
     ;; Convert the size into the amount of cluster.
@@ -3578,6 +3576,11 @@ _int21_41.clear:
     dec     cx
     jnz     _int21_41.clear
 
+_int21_41.no_start:
+
+    xor     cx,     cx
+    push    cx
+
 _int21_41.update:
 
     ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -4183,6 +4186,8 @@ _int21_4E:
     push    es
     push    ds
     
+    mov     word ptr [bp -8],   cx
+    
     mov     ax,     cs:[_selected_disk]
     mov     word ptr [bp - 10],     ax
     
-- 
2.34.1