ÍwÃ%Í %:ž(<Â%ÍRáñ·Âí$ÉÍHÿÍ¥:�(·È>Ãÿ(ë~þcÐë!œû…oë#~þþÒE%ë^#VëÃ)$G#~È#~É!°%åë~þÈþ Âb%‹%Õþ Âk%�%Õå##N#F#^#V#~#foã~åo‡…!ÿ…oã#~áãÉ>ÃTÿ}´Èë! 6*ùûÍëÐë*Ûû#åÍKÿáÉ"Ÿ G*Ûû~þ ÈþÈþÈþÈxÃr Í�Í-ÍxÄ…ÿÍäÂÀÍ@ÍËÍ7ÍþÚÀ²ÊÀÍ(ÍšÍS!ÍõÊ€Íq&Ú&õÍ‹ñÊ"&Í@6åÍÈ,ÍšÍÃþ%ÍXͤÍ‹&Í—¾wõÍO~<ñëÄ:Ÿ(·Ì Íg&ë~æw#w#6##Í)Í‹Ã&Í@ ë*Ûû ÉÍg&~æ?G¸À++N͆ȾɹÈp# Þ&Í�*Ûû6!Í÷¿&Í?~æpÂÀ*Ûû6 ÍÍ÷Âä&>ÿ2ýÍÈͱ Í!ÍÝ Í!Íâ ÍÔ ÂßÍ· öwå*oë!«(s#r#pÉ*k(N#FÅ*m(^#V#F*«(:­(O}“|šy˜åÒ9*€(Íä áã+ãÃ"*€(Íí á}“|šy˜ÚPã#ãåÃ9ãå*€(Íä áÕÅåë*�(DM"û(ÍÿÑ*k(s#rÁÑ*m(s#r#pÁy“oxšgÍ�DM*š(ëÍ0ÿMD"ý(Í!ÿ*ýMDÃ$ÿ:�(Oë!‚(N:¨(· «G>–O:¦( Ê·ù€É*ÛûÉÍÄ :£(·ÊÚn`É ~#foÉͤ2Ÿ(OÍÌ"«(}´É:‚(O*«(¯Íö "«(2­("±(:ƒ(O:¨(¡G2“(!«(¶wÉ*Ûû~‡õzWñw+ Â!zÉÍ?#~É*Ûû!É*Ûû É*ÛûÉÍGë!ÉÍO~2¨(ë~·ÂmÍ—OÍý~þ�Út>€2¥(Í?:„(¦2¦(ÉÍO:¨(w:ßûþÒ’4ë~þ€Ð:¥(wÉÍ?r##rÉp# Èä È|·g}oì*g( ¯†#ÂÁ¨G ¾ÉÍ1*q(¾Äã:µ(·È*Ûû¯wÉ*ýë*þûÍÒ÷*’ûÍÈáá> Ãr ~ ÅGæ°wÁ#ÃýÕ*Ûû #~Ö$Ì%+ëÍ@ÁɳûöÉ*ÛûÍ9À> Ãå# #>?–æÈ Â;·É*Ûû~ wÉÍ-ÍxÄ…ÍýÍH" (Í0 * (ÍãÍúÂã#ÍÄŠÍHÍýÍõÈÍ( Í÷ÍÈ,͈ÍÊ€ÍHÈÍ2³(ÍxÄ…ÍõÈ ÍÍ):³(æ@ÊÎåÍO~á#wÍšÍÊ€ôÍðÈÍb_å++VÕÍ@ë*Ûû Í)Í—OÑás++rë!‘ÊxÒ>€¶wÉ~·À6:Ÿ(·È6€É~#¶+Àw#w+Éå~þ�Ú;æwáɯ2Ÿ ÍÀÍKæ€ÀÍèÊòÍü,OFÅqÍ-y¸ÜýÍlÍ?ÁNpÃýÍðÈÍg&:£(·Ê“~·†w·ÂŒ~¾ÂòèÍëÍë¾Âò#¾Âò # Âxëìÿ åÍ—ÑÍøwÅ ë ÁÊÙÊÚ¾ÚÙ·ÂÚÍëwÍ@ ~æwÍbÍ�ÚÍÝÃÀ¾Àë¾ëûåÍ€ÍÍ!Þû~·Ê$6á:ßûþ0ÈÍ3ÃÍiÚá"áûÉ!ðû~·È6*e(>=)ÒQõå!©(ÍQÍXÄõáñ·Â<Ãk*{(}¤<È^#V{²È!~·À! Ã_*o(~ÉÍsæ€È̓ Èà ¯2ýÍ@ë !×(åÍ)#wÑ*Ûû~åë"ÛûÍðÊäÍ!·ÂÒë!ä(Fw·Ê䍿àÊÒ̓ ÊÒ:ä(wÍÌšá"Ûû:ßûþÈþÈ>Ãå#¯2ä(ÍÂý̓ õ*Ûû~öwñćá"ÛûÉ#Fx·Â T]## #~ È·Ê þ Ê ë ë*ý¨¾Â4 # Â' É Â4 !ç(Ãå ë*ý¯õ~·Ê^ þ Ê^ 33õ€G# ÂP ñ°áÂv :ßûþdÊv 6¨ Ây #É*Ûû~õöwÍõ>2Ÿ *ÛûÁpÈÍ@ë! ~æàöÉå*ý"ýáÉÍvÅÍ@ë*Ûûë°w# Í)Á È6#ÃÌ Í™ åÍ áÉÃä Í!·ÀšÕôûåÕÍNÿÍÑá(wáæÊ'ͧ ÍB pøÿͧ ÍÈ,ÚÍgÍsÃr Í�Í-ÍœÍðÈÍÄͤåÍ!·ÂS'ÑëÍ)Ã_'áͤ̓ È~Í?wÉÍ�ÍsÒÀÍ-Í?FåÅÍœÍðÁápÈÍÍ!·Êä'̓ ¡'>ÿ2ýÍõÈÍÈͱ ÍÔ ÂßåÍ?Ñë~·Â¾'æ¾'Í'ÃÊ'æàÂÆ'>€wÍ'Í™ =2ä(ÍœÍðÈÍ!·À:ä(wÚ~õ̓ ÁÊ‘'pá'!ôûÍ(6ÿÃNÿÍNÿ!ôûëÍ(Ãr Ã)!î(ëåÃN !ëÃ)z£<*¬ûÊ)$ë"¬ûÉ!ÿÿ"Ÿ :Ýû·ÊX(*Ûû:¿(w:¶(¶w#:µ(¶w*2ù*Ÿ }DÉåÿÿ#cdfg!"()*È)Ãÿe(:©(O!Íþµ´É*c(:©(OÍ«}æÉÍ@Í2Ðæ  ~ÉÍÈá *g(:·(…oÐ$É*Ûû~ÉÍK6ÉÍ?~æwÉÍKö€wÉ*áûë*i({–#zžÉÍiØr+sÉ{•ozœgÉþ*‘(ë*‹(|ægÍÐÅ͸*u(ë*‘(Á ÊÆ ÊѾÈÍÀÍR>ÿ2Þû2œûÍèÍÃZ$¾wÈ*q(>¶wÉwÉ:¤(c(Í *‡(#ë*i(s#rÉ*�ûÍÈ’ûÃ:Œ(æ€À!À(:ßûG~¸È#·Â<É*q(#~·É!;(å!Í(ÍþÊù!Ô(ÍþÊÀáÉ!Þû~·È6Ík!"áû¯2·(É*q(NÍ1qÉ*{(Ã]*{(Ã[*y(}¤<È^#VëåŪ(ÍÁáÂt6ÿ ^#Vë}´ÈÃeÕ ^#V#~2ú(ëÑÉÍõ>âÍ9͆>!"–(*y(þ³*ð(ÍX)*ØûÿÍ‚"ýÉ*g(ë*ý€ÍKÿ!Ÿ ~<È:áûæwÉÍb##>ÿw#wÉÍÄÃûÍèÀá> Ãr !áû~#¾À<ÀÉ!ÿÿ"ýÉ*ý>ü¥o+"áûÉ!ýÍûÄ *Ûûå!b("ÛûÍÝÍá"ÛûÈ:ý·À r#~õåæ?w#>r# ÂL=JÌ!· ÊLÍv ÍùáñwÍÈ,ÃbÍÜ Í?~O ͆ÊÚåÅÍ=Áá:Ÿ <È>¡w##~2§( 4~æ?ÊÉÍÍð¹:œ(<ÊÉÍÊÉüÍÞÍAÍX¯2¨(Ãr ÍK:§(w++~=æwÃv 4Í—O¾Òì5:œ(<Êv 4Í-ÍýüÍî>ÿ2œ(ÍX:¨(!¥(¾Úþ€Âv Íq:Ÿ ·Âv ÍÕ ÍàÊv ÍòÍMÚ‚Â?ͶÍ >ÍTÿÍ“Â!"–(>Íÿ(Â:“(G:�(O õ:˜(þÚh=2˜(ñ7À¯ÉñÊry·ÈöÉy/W!¨(:™(þÚl†þ€Úˆ>€ÅF6Ååõ:ƒ(_/ Gá:œ(·Ê§:¥(¢¼Ú¨|�O»ÚÅͤG:Ÿ(¸_ÊýOÅÍÌåÍÌÑz”W{•²ÊÂ|µÂõ:œ(·Âõ*…(}“|šÚõÅÕBKÍNáÁÒ Ñz¹Úýy“GÂ)áÉÍ@ u ÕÃí :áûæþÈG*g(`~Ö!Àx‡_‡‡ƒ<�_¯ÉÍ@!À*o(y¦Â<É:„(öà/GÍ?~ À##~æ?É Í6!ÀÍKæ@ÀÍ?F6å##N6ÅÍðÄâ ¯2Ÿ Ááp##qÉ:¡ûÃr !ÿÿÍZ$¯2Úû!€"ØûöÍg:¤(2ÚûÉÍTÍ�Í-:àû·Ê¹!>þ2ý<2½(ÍÚÍç!!½(¾Èw:ýþþÈÍ >€2µ(*Ûû6ÍÝÍÍÝÍç!ÉÍøÈÍO~<Â÷!wá:µ(Ò"*Ûû ~æ€Â"2µ(ÃÀÍAÍsæ€Êv"Í@!ÂN"Í!·ÂN"~æÀÊv"Í$̓ ÂW"Í+ÈÍ!·Âv"wÍÌšÃv"Í$̓ Êr"Í Êr"Í…:ä(æÀÊr"æ€Âß>€2¶(Í+ÈÍA@Í2!ÌÝ �ûÃÍšÍAÍØÍ=:Ÿ <ÈÃ%ë¯õ~þ?¯"ÍkÍéÃÃ"Í?~þ?ʾ"ÍZÍTÍ�ñõÊÚ"*áûå>ü¥o"áûÍ’á"áûñ!ÃåÊ÷:åûOÍÝÃë" (öÃ�"Í�Ã6ÍšÍÎ ; CALLVERS program bdos equ 5 ; entry point for BDOS prtstr equ 9 ; print string function vers equ 12 ; get version function cr equ 0dh ; carriage return lf equ 0ah ; line feed org 100h mvi d,5 ; Perform 5 times loop: push d ; save counter mvi c,prtstr lxi d,call$msg ; print call message call bdos mvi c,vers call bdos ; try to get version # ; CALLVERS will intercept mov a,l sta curvers pop d dcr d ; decrement counter jnz loop mvi c,ÃÃÃLOADER ÿyþ; ÁÅ!91¾"šÅë"˜|µõÌñÄ0Ñ!~þÉÊžz=³Â_: ·Â_* ""”Íø*šù¯ogÉþ*šùáå%|µë}DÀ SÍÃ#N#F:�·Ê’#4Ê�ÕÍáÍÊÍÐáå^#V{²Â‚Í:þÉ¿*�.³~öw*DM!Í&Ã_*.Í& >k s#rër+6.""”’1Ã*D`.45À. F.~·Ê. ^#Vx>`. s#rz·ÅÌðÁÃå�Íûëáå 6#N#fi%$ÊgåÕåÍ1áõ€:=”Úú<þ@Òv_}·Êv=úp{�Êú_ÕåÍ3áåÍ;áÑõ{<„g"–ñÊTÁ=XÍ3ÑõÍñ*œëÂjÑá ~æþPÀ#~æþRÀ#~æÖLÀ{·Âgbk#N#Fk$ÕÅÍ&ÁÑÕZåcx±Ê÷ {æÂêã~#ão}oÒó„ÃÙÑÑÉÍ1!€.³~æ€Â .¬w#w~æ?w;Ãþ Â; !˜ ~#4–Â9 w#~·$ ÌA þÊ Í< > _ÃÍI à Ã!ô 6çë Í!õ ~#Ͱ 6à Ím Èà Íë ÈÃë €Ã_ÃàÃù ­ ! 6ÅÕ =ô€ ¢ Í{ ÑÁÕ*�.çpåÍѯ:r ÚåÍx á,ÑÉÃÊ \Í<È=‡‡‡‡‡!€Í° ë¯=ɯ2Ÿ \Í·És Ãë Íî ë¯2¡ !ö ÍD ëþ;Èþ!Ê þ: .¬44Ê #4Èë"l ~þ[Â* 2¡ þaÚ7 þ{Ò7 Ö wþ!ÌY #·Â! *l "l "› ~·Èþ ÊU þ À#ÃD ]Tþ!õåÌ· áñÈ6ë*%.wå#wþ!Â} 6 ·Âr 6 #w.6Ã#6 #t#6Ã.woëÍÐ*�.±Ñs#r.®r¯É±ºÍ§ ·±¼Ì§ åÍm á.±ÂË ^#V45+ÊË ·À¯w#w.®f.5Ã\ÍA õÍä ñÉ"l "› Õl ˜ÍÑ|µF#Âþ !( |µ title 'Character I/O handler for z80 chip based system' ; Character I/O for the Modular CP/M 3 BIOS ; limitations: ; baud rates 19200,7200,3600,1800 and 134 ; are approximations. ; 9600 is the maximum baud rate that is likely ; to work. ; baud rates 50, 75, and 110 are not supported public ?cinit,?ci,?co,?cist,?cost public @ctbl maclib Z80 ; define Z80 op codes maclib ports ; define port addresses maclib modebaud ; define mode bits and baud equates max$devic0 jmp bdos call$msg: db cr,lf,'**** CALLVERS **** $' curvers db 0 end function cr equ 0dh ; carriage return lf equ 0ah ; line feed org 100h mvi d,5 ; Perform 5 times loop: push d ; save counter mvi c,prtstr lxi d,call$msg ; print call message call bdos mvi c,vers call bdos ; try to get version # ; CALLVERS will intercept mov a,l sta curvers pop d dcr d ; decrement counter jnz loop mvi c,Í;Â�!þ"œÃ�:= �þÚw*–¼ÚwWÉx±È ~#Ã&*�.æ~sÉëåÍ*˜ëÍ"œÑ·È\É Cannot load Program 221282 COPYR '82 DRI <bþ€€HA$@ˆDH €  A@‚!" $$@„1-! åj 1Í"�.ú~2�.™~2  :–ÂX”ÍckÍÊ*kÍ®  ÍëbͶÍÿ <æ— .¸~=¯>$.Ów.æ6#¯w.Ï6#w.¡61.´~æ  åÄá.³~æåÌá~æýwæ@å.°p Tà~ºÚÂÄ>ÿ+~.ì~á~æ€Êç!€õ yÍ® Ë.µ~æÂ~öw2g !üÃÙPROF !( Í: xþ. +"l !Ð ÕÍ® ¢  Í® Ñ~!·GÊ8 *› ~þ;#Â1 ÉÕ¯ÍA *l ÑÕ~þ:Êg ·ÊX #ÂI ѯ*l õÍä ñÉ*l ~þ0Ú… þ:Ò… Íq ÑÕ·ÂX x<Ü þAÚX þQÒX ÑÕ·ÂX ~Ö@#~þ:Âk #ÑÃ^ *�jT~# ® Éw·yÈ#ù ¯!Ÿ 4üâ ·À:Ÿ !€Í° ¯~É@´*�h~¡É ´ÍÝ y¶wÉ ´ÍÝ y/¦wÉ*�hwÉ*�h~ÉÍI E> ͦ > æ Ö Ú% 0Ö Ò õÍ< ñÆ:à ~·È¹Èͦ #Ã* ÍA È!g ~·6À*›  Í* >?Í ÃÍA *l "› È~þ0Ú: þ:Ò: Íq "l öxÉ~Ö0Øþ Ðõx‡‡€‡Gñ#€GþÚs Ã: &͘ ͤ &æͦ %˜ É> ÅÕåÍ áÑÁÉ…oÐ$É>?· ·ÉÿÕåæþ!ÚÐ ¾Âà  > ¾#ÂÄ áÑÍ® xÉ> ¾#Ââ ÑÑÿ~ÖÒ ÉEnter User #:es equ 6 cseg ?cinit: mov a,c ! cpi max$devices ! jz cent$init ; init parallel printer rnc ; invalid device mov l,c ! mvi h,0 ; make 16 bits from device number push h ; save device in stack dad h ! dad h ! dad h ; *8 lxi d,@ctbl+7 ! dad d ! mov l,m ; get baud rate mov a,l ! cpi baud$600 ; see if baud > 300 mvi a,44h ! jnc hi$speed ; if >= 600, use *16 mode mvi a,0C4h ; else, use *64 mode hi$speed: sta sio$reg$4 mvi h,0 ! lxi d,speed$table ! dad d ; point to counååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååILE.SÍä Í !+ù¯2™ ! åÍä +~æÊdõ Í{ Íð  Ìð ÂO!– w+w+å:‚ =w!ôð á5üð ·õcÍð ñÊ‹³Íñ Íð :p ·Ä Ím>>Í º±Í§ ·õ€´Äñ ÍN Íî ñĨ ÍÚ Â–.É~+w.È~2š Íö Ȭ Í9 :¶ þ Â!¬ ~#¶#~ !7® :° þ!Ô¿ Âè:¡ ·x*l "� !ZÊXþÚ†!± Âè6 ´ÍÝ Ê�ÊùÅÍzÍäñÍzÍäÃ: þ ÂèÍ6 :¬ ÖÚ%2p °Íù ͆ :­ =øõÍ€ ñ2r ¯Ãù DIR TYPE ERASE RENAME DIRSYS USER uô"Q}:\=òp:r ÆAæ R €N ÕÍ™Ñʸ}¸Ô !M 54È5à ÅÍx ÍØ ]þ  ̵ Í6 Íà ÁÈ:— oGå! ~áæ€¹ÊÎ>2M ÃåÌ x½Ìf>:ͦ ͤ Í� ͤ ÅåÍf ÍÈ áÁ¹<É!åÍØ >2Ÿ $No File$ required$ERASE $ (Y/N)? $ Press RETURN to Continue $ (User 0)$NON-SYSTEM FILE(S) EXIST$:Ð $$$ SUB<Ü þAÚX þQÒX ÑÕ·ÂX ~Ö@#~þ:Âk #ÑÃ^ *�jT~# ® Éw·yÈ#ù ¯!Ÿ 4üâ ·À:Ÿ !€Í° ¯~É@´*�h~¡É ´ÍÝ y¶wÉ ´ÍÝ y/¦wÉ*�hwÉ*�h~ÉÍI E> ͦ > æ Ö Ú% 0Ö Ò õÍ< ñÆ:à ~·È¹Èͦ #Ã* ÍA È!g ~·6À*›  Í* >?Í ÃÍA *l "› È~þ0Ú: þ:Ò: Íq "l öxÉ~Ö0Øþ Ðõx‡‡€‡Gñ#€GþÚs Ã: &͘ ͤ &æͦ %˜ É> ÅÕåÍ áÑÁÉ…oÐ$É>?· ·ÉÿÕåæþ!ÚÐ ¾Âà  > ¾#ÂÄ áÑÍ® xÉ> ¾#Ââ ÑÑÿ~ÖÒ ÉEnter User #:ter entry mov a,m ! sta speed ; get and save ctc count pop h ; recover lxi d,data$ports ! dad d ; point at SIO port address mov a,m ! inr a ! sta sio$port ; get and save port lxi d,baud$ports-data$ports ! dad d ; offset to baud rate port mov a,m ! sta ctc$port ; get and save lxi h,serial$init$tbl jmp stream$out cent$init: lxi h,pio$init$tbl stream$out: mov a,m ! ora a ! rz mov b,a ! inx h ! mov c,m ! inx h outir jmp stream$out ?ci: ; character input mov a,b ! ååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååÍlÍf ÍÄ ÀþÈÍ Ãó Í«ÍR ÈÃÍØ ÊLÍžÂL ÍI *›  Í*  ÍA Í }æ_þYÀ·ÃlÍØ õ!ëÕåÍ® ÍØ áÑÍ’ñõÄ6 ñ\ÿ&Ä‘ À%ú¸*� "l ÍäÍ�  û¾È·È45Â: wÉ þ?È ÉÍA ÀÍI ÍN Ãö  Í à SUBMIT COM«Íù !Á Í® !õ 6 #"l ¶ !cÍ¿ À¬ ·ÀOÅ·Â!ç:r :ͦ ÕÍ� ÑÕ!~æ€B ÄI Í Ññ!p‡Í° Õ^#VëÑéCOM SUB PRL ‰Í‰ÁyÉ!cͰ ¶ î !"Î *Ÿ %.Àå2Pë#Í® !g 4*l +�ë"l Í· 2€ÍØ "Qx2SlÍÛ "Tx2V!q ~·ô€ :p ͆ ‡‡‡‡.Ú¶2Ñ*Ÿ ¯oùgå$å2|ÏÍù .�w#w#w#wååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååEMP lda V3FLG cpi TRUE lda TEMP jnz TRK2 ; mvi a,00h sta BREG ;zero out B register mov a,c ;Acc = track # sta CREG ;set up PB mvi a,SETTRK ;settrk func # sta BIOSFC mvi c,DRBIOS lxi d,BIOSPB jmp BDOS TRK2: lhld WBOOT lxi d,SETTRK call MLTBY3 dad d pchl ;gone to set track ; SEC: ; Set up sector number sta TEMP lda V3FLG cpi TRUE lda TEMP jnz SEC2 ; mvi a,00h sta BREG ;zero out BREG mov a,c ; Acc = C sta CREG ;CREG = sector # mvi a,SETSECading CRLF push d call CRLF pop d ;drop through to OUTMSG OUTMSG: mvi c,9 jmp BDOS ; SELCT: ; Select disk given by rA mvi c,0Eh jmp BDOS ; DWRITE: ; Write for file copy mvi c,DWRITF jmp BDOS ; DREAD: ; Disk read function mvi c,DREADF jmp BDOS ; OPEN: ; File open function mvi c,OPENF jmp BDOS ; CLOSE: mvi c,CLOSEF jmp BDOS ; MAKE: mvi c,MAKEF jmp BDOS ; DELETE: mvi c,DELTEF jmp BDOS ; ; ; DSTDMA: mvi c,26 jmp BDOS ; SOURCE: lxi d,GETPRM ;s already selected lxi h,LOADP ;load point in RAM for DMA address shld DMADDR ; ; ; ; ; Clear track 00 mvi a,-1 ; sta TRACK ; RWTRK: ; Read or write next track lxi h,TRACK inr m ;track = track+1 lda OST ;# of OS tracks cmp m ;=track # ? jz ENDRW ;end of read/write ; ; Otherwise not done mov c,m ;track number call TRK ;set to track mvi a,-1 ;counts 0,1,2,...,25 sta SECTOR ; RWSEC: ; Read or write a sector lda SPT ;sectors per track lxi h,SECTOR inr mnumber to check compatability mvi c,12 ;version check call BDOS mov a,l ;version in Acc cpi 30h ;version 3 or newer? jc OLDRVR ; mvi a,TRUE sta V3FLG ; jmp FCBCHK OLDRVR: mvi a,FALSE sta V3FLG ; ; Check for default file liad instead of get FCBCHK: lda FCB+1 ;blank if no file cpi ' ' jz GETSYS ;skip to system message lxi d,FCB ;try to open it call OPEN inr a ;255 becomes 00 jnz RDOK ; ; File not present lxi d,NOFILE call CRMSG jmp REBOOT ; ;file prese sta BIOSFC ;set up bios call mvi c,DRBIOS lxi d,BIOSPB jmp BDOS SEC2: lhld WBOOT lxi d,SETSEC call MLTBY3 dad d pchl ; DMA: ; Set DMA address to value of BC sta TEMP lda V3FLG cpi TRUE lda TEMP jnz DMA2 ; mov a,b ; sta BREG ; mov a,c ;Set up the BC sta CREG ;register pair mvi a,SETDMA ; sta BIOSFC ;set up bios # mvi c,DRBIOS lxi d,BIOSPB jmp BDOS DMA2: lhld WBOOT lxi d,SETDMA call MLTBY3 dad d pchl ; READ: ; Perform read operation staask user for source drive call CRMSG call GETCHAR ;obtain response cpi CR ;is it CR? jz DFLTDR ;skip if CR only cpi CTLC ;isit ^C? jz REBOOT ; sui 'A' ;normalize drive # cpi NDISKS ;valid drive? jc GETC ;skip to GETC if so ; ; Invalid drive call BADDISK ;tell user bad drive jmp SOURCE ;try again ; GETC: ; Select disk given by Acc. adi 'A' sta GDISK ;store source disk sui 'A' mov e,a ;move disk into E for select func call SEL ;select the disk jmp GETVER ; ;set to next sector cmp m ;A=26 and M=0,1,..,25 jz ENDTRK ; ; Read or write sector to or from current DMA address lxi h,SECTOR mov e,m ;sector number mvi d,0 ;to DE lxi h,TRAN mov b,m ;tran(0) in B dad d ;sector translated mov c,m ;value to C ready for select push b ;save tran(0) call SEC pop b ;recall tran(0),tran(sector) mov a,c ;tran(sector) sub b ;--tran(sector) call MULTSEC ;*sector size xchg ;to DE lhld DMADDR ;base DMA dad d mov b,h mov c,l nt RDOK: xra a sta FCBCR ;current record = 0 lxi h,LOADP RDINP: push h mov b,h mov c,l call DMA ;DMA address set lxi d,FCB ;ready fr read call DREAD pop h ;recall ora a ;00 if read ok jnz PUTSYS ;assume eof if not ; More to read continue lxi d,SECSIZ dad d ;HL is new load address jmp RDINP ; GETSYS: call SOURCE ;find out source drive ; xra a ;zero out a sta RW ;RW = 0 to signify read call GETPUT ;get or read system lxi d,DONE ;end message of get or TEMP lda V3FLG cpi TRUE lda TEMP jnz READ2 ; mvi a,READF sta BIOSFC mvi c,DRBIOS lxi d,BIOSPB jmp BDOS READ