1I"ÃÁCP/M Version 3.0COPYRIGHT 1982, DIGITAL RESEARCH1512826543218/82Invalid Filename$DIRECTORY FULL$DISK FULL$Creating Password$File not found$File not available$  ,.;=:<>_[]*? ERROR - $Password ? $Cannot Edit Wildcard Filename$Enter Output file: $FILE IS READ/ONLY$NEW FILE$-(Y/N)?$Insufficient memory$Enter Input file: $Output File Exists, Erase It$ BREAK "$" AT $END OF LINE$1I"1I"Í„""%*"%}þ0ÚØ!#6©%ÍÆ!"I" Í«!+ë!#sÍ !ë#s#r!ÖÒ ÍŽÍÙÃÿð :%þT Íáð :%þUÂ6 :%ÖÖŸ2}#ð :%þVÂ… ÍÂÒf %%ÍÁ!DMÍt/ÍŸ *K"DMÍtÍà  :%ÖÖŸ2~#Ò} !š#6 !š#6ð :%þ ± :%ÖÖŸõ: %ÖÖŸÁH¡Ò® Í‘ÍþÍáð :%ÖÖŸõÍÂÁH±Ò­ :%þA !%6*%"%*K""%Í…ÍÂÒê Í ÍÖÒ÷ ÍÃê !%6Í…ê :%þF ÍMÍÖÒ Í\à ê :%þJ¤ ÍMÍx: %2 %ÍxÍÖÒ¡ Í\: %=2%:%<2%! %¾Òf *%&¥$ ~2%Í-ÃE *%"¥%* %M* %ëÍÃÚ~ Ã! %: %–%ÍÎ!"%!%6Í…*¥%DM͘Ã4 ê :%ÖMÖŸõ: %ÖÖŸÁH¡Ò !%6ÿ>%ÍÎ!µÂÐ ÍÏÍLõ:%<2%O!%$ ÁHqyþ Êî ÃÐ :%2 %!%6å*%ëá#Ò)!ÅR#+#Íõ”#R#Í3R#ͺ:�#þÿÊ)>É>É!P#ͧ!ë!d%s{þÂ@É*P#ë!e%s!"P#!c%6:d%!c%¾ÚÆ*P#ë*L#DMÍÕ+#Í�þʵÍõÒÃ]>P#ÍÎ!µÊ¦*P#:e%Í·!å*P#ë*L#DM*L#ëÍõ*P#:e%Í·!"P#Ã$€*P#"P#!c%4ÂS!"P#É!f%q#P#ÍÁ!ÚàÍ,*P#ë*L#:f%w*P##"P#É!g%q:#þ€Ú,ÍQ:~"2“":’"2”"r"Í�þÊ'ÍõÒ$ÃÃ$!#6*#&•" :g%w!#4É:#2h%>€!h%¾ÚYÍô!h%4ÂDr"ÍKÉ!i%6 :i%=2i%þÿÊ�*i%&r" å*i%&P" ѾÊ�>ÉÃe>É:“"2~"r"Í:”"2’"ÍQr"ÍqþÂÞ:”"2’"!#6>€!#¾ÚÞ*#&•" ~þÂ×É!#4¾É*P#}æþÊòÍÍÃßÍ,:s#Ú\Íi h,0 dad sp ;save stack shld ret$stack lxi sp,loc$stack mvi c,pstring lxi d,test$msg ; print message call next ; call BDOS lhld ret$stack ; restore user stack sphl lxi h,0031h ; return version number = 0031h ret test$msg: db cr,lf,'**** ECHOVERS **** $' ret$stack: dw 0 ds 32 ; 16 level stack loc$stack: end s function 12? mov a,c cpi 12 jz begin ; yes - intercept jmp next ; some other function begin: lxI"ÍÑ!Ò^Íð ͵ #I"ÍÁ!+ë+s#r!#ͧ!ë+s#rëÍÑ!"#ë*#ͺ!"L#*I"©% 6*I"+"K"Í«!"M":]þ ÂsrÍÞ Í¡Íà !€#6\ÍMÚ€Ís:#Ò¶\ÍS:h2y#!h6*"%|þ¶„1Í2!%þ¶!!%6Íó!€#6!+#:\–ÆÿŸõ:t#/ÁH±Òç+#ÍþÿÊç†Í�Í‹!©%6 !"%*K""%!™#6à1I"! %6#Ã@1I"! %6?Ã@1I"! %6>Ã@1I"! %6F!¦"$%Ã@! %6F!—"$%1I"!w#6£ÍÞ * %MÍŸ ¬ÍÎ :%Ö ÖŸõ:%Ö ÖŸÁH±Ò|²ÍΠÃ*%MÍŸ >$%ÍÎ!µÊ�*$%DMÍð !"$%Íà 1I"!{#6! %6!z#6Í‚ ! %6E: $2%EÍ‘ ÒÒÍ Ísð HÍ‘ ÒÍ !s#6#~Òþ:+#2%:\2+#:%2\Âs#rê :%þNÂf ÍMÍÖÒc * %ëÍÃÚ` Í­Ò/ Ã@Í€ÍÍ !%6!"%Í…͇!%6K"%ÍÁ!Ú] Ãà à ê :%þS¶ ÍMÍxÍÖÒ³ Í\: %2%%ÍÎ!DM͘! %:%¾Ò° *%&¥$ ~2%!%4Í-Ã� Ãt ê :%þWÂÄ ÍÃê :%þXÂu P"Ím2 %!#6ÍÂÒý !u#6P"Í^:�#þÿÂú ÂÍð Ãr Í`!u#¦Ò Í“ÃB !u#6 År"P"Íõ!“"6#6!~"6!’"6r"Íê:�#þÿÂB Ã5Íê*%"§%%§%ÍÁ!Úo *§%©% NÍô*§%"§%ÒK Í>ê :%þZŸ ÍÂÒ� ; þÂ� Ã@ÍÖÒœ ÍÙÃ� ê :%þʪ Ãð ÃíûvÍÉÍÉýÍÉ!&%q:w#ÒÜ É*&%&ëÍÉ!'%q:'%þ Úø !™#4:'%þ  !V6*H#~2YÉ!Z4N*P :M¾Â( !`6Ã> *Z&ë*P:Y¾Ê> !`6!V4N*H ~2YÉ*V&ë*H~2Y*YMÍ=2L:LÖŸõ>!L–ŸÁH±Ò— !V4N*H ~2Y*YMÍ=2LÃf :V2KHÍ‚#ë+s#rÉ*HNÍ=2L!�¾ÂÅ *H#"Hê ÉÍ™ÒÛ žÍbÍÉ ÍI ÍIÉ!es+q+ÑÁp+qÕ:e=2eþÿÊ *b:dw*b#"bÃô É!fq ÍI:fþÂ) ¶Íb:fþÂ7 ÂÍb:fÖÖŸõ:fÖÖŸÁH±ÒU ËÍb:fþÂc ÕÍb:fþÂq æÍb:fþÒ� ÍÉ!hp+q:2Òš *g >€¶w3Í«*g:\w*gDMÍÔ"i*g >¦w*i}þÿÂí *i|2kÖÖŸõ:kÖÖŸÁH±Òé *kMÍ :kÉ>ÿÉÍY2lþaÚ :lþ{ title 'wd1797 w/ Z80 DMA Single density diskette handler' ; CP/M-80 Version 3 -- Modular BIOS ; Disk I/O Module for wd1797 based diskette systems ; Initial version 0.01, ; Single density floppy only. - jrp, 4 Aug 82 dseg ; Disk drive dispatching tables for linked BIOS public fdsd0,fdsd1 ; Variables containing parameters passed by BDOS extrn @adrv,@rdrv extrn @dma,@trk,@sect extrn @dbnk ; System Control Block variables extrn @ermde ; BDOS error ged into for the purpose of density determination. ; It may adjust the parameters contained in the disk ; parameter header pointed at by ret ; we have nothing to do in ; simple single density only environment. ; disk READ and WRITE entry points. ; these entries are called with the following arguments: ; relative drive number in @rdrv (8 bits) ; absolute drive number in @adrv (8 bits) ; disk transfer address in @dma (16 bits) ; disk transfer bank in @dbnk (8 bi lxi b,16667 ; 100 ms / (24 t states*250 ns) spin$loop: ; wait for head/seek settling dcx b mov a,b ! ora c jnz spin$loop same$track: lda @trk ! out p$fdtrack ; give 1797 track lda @sect ! out p$fdsector ; and sector lxi h,dma$block ; point to dma command block lxi b,dmab$length*256 + p$zdma ; command block length and port address outir ; send commands to Z80 DMA in p$bankselect ; get old value of bank select port ani 3Fh ! mov b,a ; mask off DMA bank and save ldÒ :lÖ É:lÉõÍb3Å Íç !m6>!m¾Ú— Íð 2nþ ÚD *m&3 :nw:nþ ÂO × :nþÂZ à :nþ€ :mþÒm à :m=2mO!3 6 Ã, :nþÂ� Í!m4Â# Í™2nÉ!oq:1Úó :\ÆA=OÍI:ÍI ÍI!v6> !v¾Úí :vþ ÂØ .ÍI*v&ë*/NÍI!v4 ÍbÍb*oMÍ ÍÜ É\Í‚ 2wþÿÊQ :wþÒ$ *wMÍ ÃB :wþÂB *wMÍž Í ÍÜ \Í‚ 2w:wþÿÊQ *wMÍž É!L6!J6:LÖÆÿŸõ:LÖÆÿŸÁH¡õ:LÖÆÿŸÁH¡Òý €ÅJ‘Ít:JþÂà Íb.ÍbLÍb:KHÍœ+"p!r6:K!r¾ÚØ *pNÍI*p#"p!r4¹ Í:JþÂí !26:JþÂú !16Ã\ É!tmode ; Utility routines in standard BIOS extrn ?wboot ; warm boot vector extrn ?pmsg ; print message @ up to 00, saves & extrn ?pdec ; print binary number in from 0 to 99. extrn ?pderr ; print BIOS disk error header extrn ?conin,?cono ; con in and out extrn ?const ; get console status ; Port Address Equates maclib ports ; CP/M 3 Disk definition macros maclib cpm3 ; Z80 macro library instruction definitions maclib z80 ; common ts) ; disk track address in @trk (16 bits) ; disk sector address in @sect (16 bits) ; pointer to XDPH in ; they transfer the appropriate data, perform retries ; if necessary, then return an error code in fd$read: lxi h,read$msg ; point at " Read " mvi a,88h ! mvi b,01h ; 1797 read + Z80DMA direction jmp rw$common fd$write: lxi h,write$msg ; point at " Write " mvi a,0A8h ! mvi b,05h ; 1797 write + Z80DMA direction ; jmp wr$common rw$common: ; seek to ca @dbnk ! rrc ! rrc ; get DMA bank to 2 hi-order bits ani 0C0h ! ora b ; merge with other bank stuff out p$bankselect ; and select the correct DMA bank lda disk$command ; get 1797 command call exec$command ; start it then wait for IREQ and read status sta disk$status ; save status for error messages pop b ; recover retry counter ora a ! rz ; check status and return to BDOS if no error ani 0001$0000b ; see if record not found error cnz check$seek ; if a record not found, we mp+q*s~Ö ÖŸõ~Ö ÖŸÁH±Ò% *s#"sà *s~þÂ1 >É>ÉÉ!åå`i^#V#~#foÍrÍ0ÂV y·ÂØ wÇ Gþ:„ xÖAÚØ þÒØ ÈþaØþ{Òkæ_æÉáÃØ þ Ê~þ Ê~ÉÃrë_ë…oŒgÉi`N#F‘o˜gÉo&•oœgÉ_{–_z#žWëÉcontrol characters cr equ 13 lf equ 10 bell equ 7 ; Extended Disk Parameter Headers (XPDHs) dw fd$write dw fd$read dw fd$login dw fd$init0 db 0,0 ; relative drive zero fdsd0 dph trans,dpbsd,16,31 dw fd$write dw fd$read dw fd$login dw fd$init1 db 1,0 ; relative drive one fdsd1 dph trans,dpbsd,16,31 cseg ; DPB must be resident dpbsd dpb 128,26,77,1024,64,2 dseg ; rest is banked trans skew 26,6,1 ; Disk I/O routines for standardized BIOS inorrect track (if necessary), ; initialize DMA controller, ; and issue 1797 command. shld operation$name ; save message for errors sta disk$command ; save 1797 command mov a,b ! sta zdma$direction ; save Z80DMA direction code lhld @dma ! shld zdma$dma ; get and save DMA address lda @rdrv ! mov l,a ! mvi h,0 ; get controller-relative disk drive lxi d,select$table ! dad d ; point to select mask for drive mov a,m ! sta select$mask ; get select mask and save it out p$select ; selight need to seek dcr c ! jnz retry$operation ; suppress error message if BDOS is returning errors to application... lda @ermde ! cpi 0FFh ! jz hard$error ; Had permanent error, print message like: ; BIOS Err on d: T-nn, S-mm, , Retry ? call ?pderr ; print message header lhld operation$name ! call ?pmsg ; last function ; then, messages for all indicated error bits lda disk$status ; get status byte from last error lxi h,error$table ; point at0 Ç 6ÍÞ þ.Ê™ Í(Ã� ÍÞ #6Ÿ þ;ʳ Í(÷ ÍÕÍrÍ0ÂÆ 33ÃÇ Ñy·ÁyÁ#q#p#wëÀ!Éáá!ÿÿÉÍ0Ê(#þ*Âó 6?ÂÞ Ãõ wÂÞ Í0ÈáÃØ Í0Ê(333333Õå.ã;;33ã,ã;;#wÊù Í0Â#6 Â(ÉO·Èþ ÈOþ Èþ ÚnÈþ.Èþ:Èþ;Èþ=Èþ,Èþ/Èþ[Èþ]Èþ<Èþ>ÈþaØþ{Òkæ_æÉáÃØ þ Ê~þ Ê~ÉÃrë_ë…oŒgÉi`N#F‘o˜gÉo&•oœgÉ_{–_z#žWëÉterface ; Initialization entry point. ; called for first time initialization. fd$init0: lxi h,init$table fd$init$next: mov a,m ! ora a ! rz mov b,a ! inx h ! mov c,m ! inx h outir jmp fd$init$next fd$init1: ; all initialization done by drive 0 ret init$table db 4,p$zpio$1A db 11001111b, 11000010b, 00010111b,11111111b db 4,p$zpio$1B db 11001111b, 11011101b, 00010111b,11111111b db 0 fd$login: ; This entry is called when a logical drive is about to ; be logect drive more$retries: mvi c,10 ; allow 10 retries retry$operation: push b ; save retry counter lda select$mask ! lxi h,old$select ! cmp m mov m,a jnz new$track ; if not same drive as last, seek lda @trk ! lxi h,old$track ! cmp m mov m,a jnz new$track ; if not same track, then seek in p$fdmisc ! ani 2 ! jnz same$track ; head still loaded, we are OK new$track: ; or drive or unloaded head means we should . . . call check$seek ; . . read address and seek if wrong trackInvalid FCB.Media change occurred.Disk I/O error.Invalid drive error.Invalid SCB offsetMissing right parenthesis.Missing SCB value.Missing left parenthesis.Unrecognized option.No modifier for this option.OPTION: This file was not used.GENCOM completed.Requires CP/M 3 or higher.1n$1n$Í" %* %|þÂ<Ó* %}þ0ÒHÓþÍÛÍ::©$Ò]ÍëÇ:ª$ÒjÍZÇ:§$ÒwÍüÇ:¨$Ò„ÍZÇÍeÍ÷÷ÍÍërÍ ͺÍëûv!n$q*n$&ëÍÉ ͤÉ!p$p+q*o$~þÊÚ*o$Nͤ*o$#"o$ÃÀÉ ÍÉ ͤ ͤÍÛÒÍ+ͱ :Ï;þÂ" rͤͺÖÍÍ :Ï;þÂ2 !Ñ%6Ã? :Ï;þÂ? !Ò%6:¦$þÂH É:¦$þÂQ É:¦$þˆ :Ï;þÊ} r͹ͺÅÏ;+ͱ È Íaͧ !Ó%6:¦$þ‘ É:¦$þš É:¦$þ£ ÉÃø É*¢$#"Í;*Í;NÍy 2¦$þÂÞ *¢$DM*Í;ëÍi *ž:&Š: w*¢$##"¢$Ãø *¢$ëÐ;Íi *ž:&Š: w*Í;"¢$!ž:4*¢$NÍy 2¦$þÊ\ÍQ *¢$#"¢$*¢$NÍy 2¦$:¦$þÊ1*¢$#"¢$É*¢$NÍy 2¦$!L:¦$¾ÂIÃY!M:¦$¾ÊYwÍQ *¢$#"¢$É*¢$NÍy 2¦$!N¾Â*¢$#"¢$9Å*¢$ë0͸ *¢$#"Í;*Í;NÍy 2¦$!L:¦$¾Â£Ãê!M:¦$¾Â°Ãê6Å*¢$ë0͸ FÅ*Í;ë0͸ *¢$DM*Í;ëÍi *ž:&v: w*¢$##"¢$Í2É*¢$ëÐ;Íi *ž:&v: w*Í ( Ñw*<&æ') ^#Vë"(!<6>!<¾ÚO*<& ë*(å*<& ë* (Ñw:<<2<Â* (" (:<<2<³Ãs* (#å*È$ëás#r:Ò%Òƒ * ( 6:®$!Ó%¶Òž.’)Ê$ -–!.%6%Í›2±$%Í1:Ñ%/Ò½ÍzÍÉ!ž)" (!<6:´$!<¾Úê* (" (:<<2<ÃÌÉ!Ž)" (* (#^#V!€Í�#ë"È$*È$DMÍi*(DMÍ1%Í1>!½%¾Ò(ÍÛÍzÍÉ:¨$/ÒH!"Ð$È$Í#Íž%ÍUÍ!´$6̓É!"<6€:"<ÍÜ#Ú€*"<&( 6:"<<2"<Â_!"<6:¯$!"<¾Ú©*"<&Ð$) >w#6:"<<2"<Â…!(" (* (:Ow:Ó%/ÒÌ* ( :OwÃÕ* ( 6Ã* ( :¯$w!"Ê$:Ñ%Òø:O2)Íx* (DMÍË (*("(!"Ê$:Ò%ÒN:Ó%/!®$¶ÒN!›)6 *( 6*(DMÍ›2±$:±$þÊH›Í !"Ê$:Ó%Ò1:®$ÒdÍ~õ:°$þÊš Íx*(DMÍZ:°$þÊš:{$Ê$Í‚#ë+s#r*(DMÍZÃy:{$Ê$Í‚#ë+s#r!Ê$ÍÂ#ë+s#r*(DMÍU:®$/Ò1*(DMÍ1Íx*(DMͦ*(DMÍ*(DMÍ‹2°$.’)Ê$ -Âõ:Ò%Ò !›)6:O2‘) *( 6*(DMÍ›2±$:±$þÊ1›Í *(DMÍ1É!�"¢$!3<6>¢$Íó#µÊÛÍ_"*(DMÍ *¢$~þ[ÂhÃÛ*( ~25<>!5<¾ÒÑ!6<6!4<6:5<=!4<¾ÚÄ*6<&ë*(å*3<&)))=% å*4<&Á Á w:6<<26<:4<<24<†*3<&½% :5!¢;¾ÚS*¢;&/% 6!¢;4Â8!/%6 !¢;6#6:¢;Ö Ÿ*£;&ë*(õ~Ö ÆÿŸÁH¡Òž*£;&ë*(å*¢;&/% Ñw!¢;4#4Ã`*¢;&/% 6.!£;6 :¢;Ö Ÿ*£;&ë*(õ~Ö ÆÿŸÁH¡Òì!¢;4#N*( å*¢;&/% Ñw!£;4îÉ!¥;p+qÍ3rÍ*¤;D;#"¢$ÊÍQ É!Ò;p+q*Ñ;DMÍ*O>¹Ò0*Ñ;"(�Í É!Ô;p+q*Ó;DMÍ:O>¹ÒR*Ó;"(�Í É!Ö;p+q*Õ;DMÍJ2²$>!²$¾Òy*Õ;"(‘Í É*( >€¦þ€ÂŠÉ*(DMÍ»O>¹ÒŸ*("(É!Ø;p+q*¢$"Í%*×;"Ï%*¢$"ä'Í%Í€"¢$ÿÿ¢$Íë#µÂÚ*ä'"(¥Í É!Ù;q!Ú;6>!Ú;¾Ú*Ù;&)))=% å*Ú;&Á å*Ú;&€ Ñw!Ú;4ÂäÉ!Û;6 >!Û;¾ÚF:Û;Æ2Ü;*Û;&Ý; 6*Ü;& 6!Û;4Â!Û;6> !Û;¾Ú�:Û;Æ2Ü;*Û;&% å*Û;&Ý; Ñw*Û;&ë*(å*Ü;& Ñw!Û;4ÂKÝ;Í«2²$>!²$¾Ò¥*æ'"(É!þ;p+q!ÿ;6 >!!ÿ;¾ÚÍ*ÿ;&ë*ý;6!ÿ;4±É!!±$¾Ò!%"(›Í Ž)ÍË:Ñ%/Òi:°$þÊR%Í›2±$*("(!"È$È$ÍÎÃfÍx%Í›2±$!€"È$Ão!€"È$*È$ë*Ê$"Ê$Í/É!#ÍÜ#"È$*È$DM*#<ëÍi!È$ÍÂ#ë#s#r*(DMÍ‹2°$!Ÿ:Ž) +|µÂÀÉ*("(!ž)" (!®)"Ž9!'<6:´$!'<¾ÚS* (##å*'<&À9) ãN#Fáq#p*'w#6!ž)" (%Í›2±$* (#ÍÌ#"*<**!½%¾Ò*ÍÛ*(DMÍ*O>¹ÒS:Ñ%/ÒP�Í ¸ÍíÍëÃo:Ñ%Òo*( >€¦þ€ÊoÄÍ :Ñ%Ò :¯$<2¯$23<!*3<&Í®#Ô% å*3<&æ') Áq#p!4<6:¯$=!4<¾Ú !5<6> !5<¾Úú:3<=o&!Í®#Ô% å*5<&Á !å*3<&Í®#Ô% å*5<&Á Á w:5<<25<³:3<=23<:4<<24<£RÍÒ"*è'"(XÍÒ">!¯$¾Ò‰!!¶$6!3<6:¯$!3<¾Ú !*3<&æ') ^#Vë"(XÍ#/Òb 'ÍíͲ"Ã!*3<&½% >¾Òx *3!²$¾Ò˜ �ÍíͲ"Ã!:3<<24<:¯$!4<¾Ú!*4<&æ') ^#Vë"ä'!6<6>!6<¾Úð *6<&ë*(å*6<&ë*ä'Á ¾Êæ Ãù :6<<26<¿ áÍíͲ":4<<24