4\XLDCPM3 COPYRIGHT (C) 1979, DIGITAL RESEARCH _͌> ͒> Ò> Ò͘~#͌ì _2<ү2 Ӈ!ٶ2:2a{_:ٷʖ:ٷ>Ľʖ:=2–!B!6#5ʖ:ٷĽ!ͬʧ )!F#xʺ~0wëw!" !~6ͽ:ý(!#͘*~ "Է"͌#>?͌͘ =_.:;<> Oԅo$>!Y2*O"ʉ@G:ʐ:wÖx2p0ʹ#*©6?ëw˜0ï#6 ¹.0#*6?w0#6 #6" #~?  xDIR ERA TYPESAVEREN USER!yO#< Ty#O 3կ21y_͸2y2ͽ:ҷ˜1͘A͌>>͌92^ :ٷ¥.!_~#fow]׭؎إ!v"!çREAD ERRORçNO FILE^:ٷ ! ~ 3#0 Wx x Ԁ Ԃ G ~ # 3x~#B!Y~ɯ2:ٷ=!پý:ٷ=!پ:ý^T!~  6?#ˆ:`O> K{͘A͒>:͒͢>:͒͢xK > K > ͒x  ͢ØÆ^ BRͧ9!5‚#~Y‚#"T<ÆALL (Y/N)?^ Tʧ͘!6!~ڇ ׯw4!Y~ʆ͌†t=ʆf ^ T ׯ2o&)|+!<ͧÆNO SPACE^ :Ty!B*O=?_s#"^sG!~Yظpsp2mÆÆf ͧÆFILE EXISTS _: É: :ٷʉ=2)ͽÉ T!@k!}|q=qf^!~2>`~2ٯ2\!!B!~> >#0~O#Cx2͘1)ͽÂf zͧÆBAD LOADCOMf^: !ٶ Â$$$ SUBڙڥګڱ"C{2!"E9"1Aݯ22!ty)K!G_^#V*Cܐ~E ,&-AGMSݛ!!ô!ô!Bdos Err On : $Bad Sector$Select$File R/O$:BA2!~6 O͐  :ݷE B 2>: ݷb# : ݷy! 4 5~yy5 6yҐ^H@Oy H H: –ͬ  #H: ! ݾ Hù H H $O͐: 2 *CN# x: 2 p&x~+é7ۯ2 H! >w_: ! ݾ5ͤNkͱ¦ͱxʊ#Nx: ݷ! ݖ2 ͤ! 5™#wO~x½p Hy<< ʑ :!qMD#2E>! ^#V w#P:BO|^#V#"##"##"##"!O*!O*|!6ʝ6>*w#w*w#w'û*! J*""!N#F*^#V*~#foyx*{_zW+*yx#*DM*s#r*s#ryOxG*0MD!!N: EG>O: \޷Sހ*C :qn& ^#V>O^"*}:*)=":O:硵o"*C *C!ͮ~2~2ͦ:2ͮ:ޯO:w:w |g}o*篆# ):BO!yoxg*:BO}!N#F "*#*s#r^ ~!J! J*:o$*C~i6iw**{#zr+s{ozg**͕** ߾,w͜͸Ͳ!!N#F$**O!~#:Aݾ#~$=2Ek͌::/GyO>2!q*C"͡ʔ*JҔ^:Oyʃ?|x | s-|N-# S:2E!~Яw>T D^6k-äPYy 5*{zBK5ڋ>*Cw~#+w#w+ɯ2E22i^ *C :~w~͔͔# #  w ~>2!E5T*C!"C"C!w# F! w͌x߯2͢*C ~<wʃG:!ʎì 4~ʶ¬:<ʶ$ʶïZͻޯx>2>2ͻ:!Z2:Eݷẅ́͊Ͳ>2>2T*CGͻ:ẅ́n>2;O ^DM;}H>"*C ::ddslO s#r:Eݷ͊:==»y==»*Ww#*"͸*:G#š"͸:!w4!iw:Z!E~=26ޯ2*C!!~~#~O~G#n,-.‹! w! yG!x͢.:E<ʄ! q!pQ:E<. ʄ$.:E<ʄi6}2ExN! ~态O>G~G!~G} *C!r#r#r ^ͥ_y#x#{s+p+q-*C ͥ!!q#p#w*:BOYG}*MD "ã:!Bݾw!>2*C~=2u:B2~2wE:A*Cݶw>"!""2B!"!rQQQâ~?ͦ~?rQ*"CQ-Q͜QüQrQ$Q*):B"*)*)Q;*"E:;:A2AQÓQÜQ*C}/_|/*W}_*"}o|g":ʑ*C6:ʑw:2E**E}DQ>2ê:Û50+ÍÑÕÙÝáëPý0123456789-, ., D D|͉2:32!JF#N#~ :G:H KAYPRO 60K CP/M Version 2.2H !"t>!2"!2"!"!"!T":OyO:|͍͉͑ Warm Boot 1͕Cx͝,͙͡ *xDM"x͝2 *t+"t|:q :.3.*>͛(:q /:.6.-!5O ~!ay''O "o>2q*oN#"o:q=2qy~y2qy.':.9.E.6.9:.9c.E@.9:.B.

y>O#>#>J!.4. 0.,.(.$. !"t.!"t.:4(.!sv1&{v˿~#O  8 >1͌0͌>>Ì 2r2s2<:r(!2s:s_ 2:r_ :<:s_ :r_ 4\XMASMENU COPYRIGHT (C) 1979, DIGITAL RESEARCH _͌> ͒> Ò> Ò͘~#͌ì _2<ү2 Ӈ!ٶ2:2a{_:ٷʖ:ٷ>Ľʖ:=2–!B!6#5ʖ:ٷĽ!ͬʧ )!F#xʺ~0wëw!" !~6ͽ:ý(!#͘*~ "Է"͌#>?͌͘ =_.:;<> Oԅo$>!Y2*O"ʉ@G:ʐ:wÖx2p0ʹ#*©6?ëw˜0ï#6 ¹.0#*6?w0#6 #6" #~?  xDIR ERA TYPESAVEREN USER!yO#< Ty#O 3կ21y_͸2y2ͽ:ҷ˜1͘A͌>>͌92^ :ٷ¥.!_~#fow]׭؎إ!v"!çREAD ERRORçNO FILE^:ٷ ! ~ 3#0 Wx x Ԁ Ԃ G ~ # 3x~#B!Y~ɯ2:ٷ=!پý:ٷ=!پ:ý^T!~  6?#ˆ:`O> K{͘A͒>:͒͢>:͒͢xK > K > ͒x  ͢ØÆ^ BRͧ9!5‚#~Y‚#"T<ÆALL (Y/N)?^ Tʧ͘!6!~ڇ ׯw4!Y~ʆ͌†t=ʆf ^ T ׯ2o&)|+!<ͧÆNO SPACE^ :Ty!B*O=?_s#"^sG!~Yظpsp2mÆÆf ͧÆFILE EXISTS _: É: :ٷʉ=2)ͽÉ T!@k!}|q=qf^!~2>`~2ٯ2\!!B!~> >#0~O#Cx2͘1)ͽÂf zͧÆBAD LOADCOMf^: !ٶ Â$$$ SUBڙڥګڱ"C{2!"E9"1Aݯ22!ty)K!G_^#V*Cܐ~E ,&-AGMSݛ!!ô!ô!Bdos Err On : $Bad Sector$Select$File R/O$:BA2!~6 O͐  :ݷE B 2>: ݷb# : ݷy! 4 5~yy5 6yҐ^H@Oy H H: –ͬ  #H: ! ݾ Hù H H $O͐: 2 *CN# x: 2 p&x~+é7ۯ2 H! >w_: ! ݾ5ͤNkͱ¦ͱxʊ#Nx: ݷ! ݖ2 ͤ! 5™#wO~x½p Hy<< ʑ :!qMD#2E>! ^#V w#P:BO|^#V#"##"##"##"!O*!O*|!6ʝ6>*w#w*w#w'û*! J*""!N#F*^#V*~#foyx*{_zW+*yx#*DM*s#r*s#ryOxG*0MD!!N: EG>O: \޷Sހ*C :qn& ^#V>O^"*}:*)=":O:硵o"*C *C!ͮ~2~2ͦ:2ͮ:ޯO:w:w |g}o*篆# ):BO!yoxg*:BO}!N#F "*#*s#r^ ~!J! J*:o$*C~i6iw**{#zr+s{ozg**͕** ߾,w͜͸Ͳ!!N#F$**O!~#:Aݾ#~$=2Ek͌::/GyO>2!q*C"͡ʔ*JҔ^:Oyʃ?|x | s-|N-# S:2E!~Яw>T D^6k-äPYy 5*{zBK5ڋ>*Cw~#+w#w+ɯ2E22i^ *C :~w~͔͔# #  w ~>2!E5T*C!"C"C!w# F! w͌x߯2͢*C ~<wʃG:!ʎì 4~ʶ¬:<ʶ$ʶïZͻޯx>2>2ͻ:!Z2:Eݷẅ́͊Ͳ>2>2T*CGͻ:ẅ́n>2;O ^DM;}H>"*C ::ddslO s#r:Eݷ͊:==»y==»*Ww#*"͸*:G#š"͸:!w4!iw:Z!E~=26ޯ2*C!!~~#~O~G#n,-.‹! w! yG!x͢.:E<ʄ! q!pQ:E<. ʄ$.:E<ʄi6}2ExN! ~态O>G~G!~G} *C!r#r#r ^ͥ_y#x#{s+p+q-*C ͥ!!q#p#w*:BOYG}*MD "ã:!Bݾw!>2*C~=2u:B2~2wE:A*Cݶw>"!""2B!"!rQQQâ~?ͦ~?rQ*"CQ-Q͜QüQrQ$Q*):B"*)*)Q;*"E:;:A2AQÓQÜQ*C}/_|/*W}_*"}o|g":ʑ*C6:ʑw:2E**E}DQ>2ê:Û50+ÍÑÕÙÝáëPý0123456789-, ., D D|͉2:32!JF#N#~ :G:H KAYPRO 60K CP/M Version 2.2H !"t>!2"!2"!"!"!T":OyO:|͍͉͑ Warm Boot 1͕Cx͝,͙͡ *xDM"x͝2 *t+"t|:q :.3.*>͛(:q /:.6.-!5O ~!ay''O "o>2q*oN#"o:q=2qy~y2qy.':.9.E.6.9:.9c.E@.9:.B.

y>O#>#>J!.4. 0.,.(.$. !"t.!"t.:4(.!sv1&{v˿~#O  8 >1͌0͌>>Ì 2r2s2<:r(!2s:s_ 2:r_ :<:s_ :r_ -TÊÑ*1zzzzzzzzz|B7B6=8 System Status 01C6>|B7B6=8 System Status 02C6>ɷ~#OE>2k>2k:g _:i WzdGz?W{_>8( 2m{_*bBKPY|W]Sn| >2l:m3[n2d(:k:d[nʹ:l/7:k:dʹ:l/$[n #:k( :m/G:l:lG:m[n͆:k( :mG:l:m/G:lzW͒zW͒ͤ >yxA Q A Y:_͒̀!|g{ _z W0D2k>2k[iSi2r[gSg2sW:r_:iW:j>8>2p:g_:h>8>2q:rO:sDM!8(. :h:q_ 0:pW :j:pW 0:q_ :j:pW:q_-TÊÑ*1zzzzzzzzz|B7B6=8 System Status 01C6>|B7B6=8 System Status 02C6>ɷ~#OE>2k>2k:g _:i WzdGz?W{_>8( 2m{_*bBKPY|W]Sn| >2l:m3[n2d(:k:d[nʹ:l/7:k:dʹ:l/$[n #:k( :m/G:l:lG:m[n͆:k( :mG:l:m/G:lzW͒zW͒ͤ >yxA Q A Y:_͒̀!|g{ _z W0D2k>2k[iSi2r[gSg2sW:r_:iW:j>8>2p:g_:h>8>2q:rO:sDM!8(. :h:q_ 0:pW :j:pW 0:q_ :j:pW:q_DIR COMr DATE COM ERASE COM PIP COMDGET COM3PUT COM7RENAME COMSETDEF COM SHOW COMBSID COM>SUBMIT COM*TYPE COMSET COMS !INITDIR COMz"#$%&'()DEVICE COM:*+MODE COM,GENCPM COM(-12345MOVCPM COMT./0RMAC COMj6789LINK COM{:;<=MAC COM\>?GED COMIHIJCOPYSYS COMKDUMP COMLCPM3 SYS   OBASIC COM  ROCKET BASSTRTRK BASeTAXMAN BAS&TRADE BASWUMP BAS? !MASMENU COM"#$%&MASMENU DAT'()*+MASMENU TXT&,-./01MASPREP COM23456CANDR-C COM-78CBAS2 COM&9:;<=>CRUN2 COM ?@ABCCRUN238 COM DEFGHXREF COM8IJBASICLIBRELKLMNOPQRBASICLIBRELDSTUCANDR-S COM.VWDPLAY BASXFAC BASYGRAPHICSBASZGRAPHICSDOCC[\]OVERLAYBCOM6^_SBASIC COML`abcdefUSERLIB RELgXAMN BAShijklSP-MAIN CMD mZIP COMhnopqAUTOMITECOMhrstuvwxyAUTOMITEHLPzDATASOLVHEX{KAYINT HEX%|}KPRO484 HEX~MINSTALLCOM5MITE COMkMITE HLPMITE HLPMITE HLPyMITE/U COMkTEXTP FOR+BATCH OVRCLIENTSRDEF CLIENTSRDTACLIENTSRNDXCUSTOMERDTACUSTOMERNDXDATASTARCOMPFORMGEN COMFORMGEN COMFORMSORTCOM FORMSORTOVRgINVCE DEFINVCE DTAINVCE NDXOKSTATESDTAOKSTATESNDXORDER DEFPAYMENTSDEF PAYMENTSDTAPAYMENTSNDXPRODUCTRDEF PRODUCTRDTAPRODUCTRNDXPRODUCTSDTAPRODUCTSNDXPUTEOF COMREDIT COM`REMSGS OVRREMSGS OVR6REPORT COM|RGEN COMRINSTALLCOMpRSMSGS OVR>STAFF DEF STAFF DTASTAFF NDXCS COMCS OV1xCS OV2 CS OVRn    CSDUMP COMCSDUMP OVRCSMASK MSK4DEMO CSDTERMCAP SYSCHECKC CMDCHECKC1 CMDCHECKS CMDCLEAR@ CMDCLIENT DBFCLIENTLSCMDCOMPUTE DBFCOMPUTE FRMCOMPUTE1DBF DBASE COM!"#$%DBASEOVRCOM&'()*+,-DBASEOVRCOMD./0DEPTMASTDBF1DEPTMASTFRM2EMP8 DBF3EMPBAK DBF4EMPBAK1 DBF5EMPMAST DBF6EMPMAST FRM7EMPMASTRFRM8EMPMFRM FRM 9EMPMSRT DBF:EMPNAME DBF;EMPNAME FRM<EMPNOINDNDX=EMPTBAK DBF>EMPTRANSDBF?EMPTSRT DBF@JJFRM FRMAJOBHFRM FRMBJOBHIST DBFCJOINJOB DBF DJOINPAY1DBFEJOINPAY2DBF FJOINPAY3DBF GLESSONS CMD(HIMASTE DBFJNAMEADDRDBFKNAMEIND NDXLREGFRM FRM MT1RDBF DBF NTAXMAST DBFOTAXMAST FRMPTEACH1 CMDPQRSTEACH10 CMD(TUTEACH11 CMD(VWTEACH1R CMD(XYTEACH1R1CMDHZ[\TEACH1S CMD]TEACH2 CMD0^_TEACH21 BAK`TEACH21 CMDaTEACH2R CMD bTEACH3 CMD(cdTEACH3C CMD$efTEACH3F CMD$ghTEACH3F1CMDiTEACH4 CMD8jkTEACH4B CMDlTEACH4L CMDmTEACH5 CMD\nopTEACH6 CMD,qrTEACH6M CMD,stTEACH6U CMD uTEACH7 CMD?PUTSYS COMH@ABCDEFREAD COMGSAFETY COMHSTAT COM)IJSUBMIT COM KTERM COMLXSUB COMMYESMENU COM'NOLDCPM3 COMPANAGRAM COM SDICTSORTCOMTFIND COM UHOMONYMSTXT/VWHYEXCEPTTXT$XYHYPHEN COM@Z[KAYPRO LRN\]^_`LOOKUP COMaMAILMRGEOVRhbcdeMAINDICTCMPfghijklmMAINDICTCMPnopqrstuMAINDICTCMPvwxyz{|}MAINDICTCMP~MAINDICTCMPAMARKFIX COMPRINT TST REVIEW COM*SPELL COM TW COMUPDICT CMPWC COM WINSTALLCOMhWORDFREQCOMWS COM WS INSWS INS`WSMSGS OVRkWSOVLY1 OVRWSOVLY1 OVRINCOME LOGINCOME TBLMPERROR FILMPFORM OVLYMPHELP FILaMPLOGIC OVL[MPMENU FILMPPRINT OVL[MPSERIALNUMMPSET OVLMPSETUP FILMPSHOW OVL[MPSTAT OVL8PLAN COMCALIENS COMrBIO BAS#BLKJK BAS4CATCHUM COMeCATCHUM DATCHASE BASCLONE COMRCLONE DATHORSE BAS+LADDER COMLADDER COM;LADDER DATMBASIC COM>   OBASIC COM  ROCKET BASSTRTRK BASeTAXMAN BAS&TRADE BASWUMP BAS? !MASMENU COM"#$%&MASMENU DAT'()*+MASMENU TXT&,-./01MASPREP COM23456CANDR-C COM-78CBAS2 COM&9:;<=>CRUN2 COM ?@ABCCRUN238 COM DEFGHXREF COM8IJBASICLIBRELKLMNOPQRBASICLIBRELDSTUCANDR-S COM.VWDPLAY BASXFAC BASYGRAPHICSBASZGRAPHICSDOCC[\]OVERLAYBCOM6^_SBASIC COML`abcdefUSERLIB RELgXAMN BAShijkl SP-MAIN CMD m ZIP COMhnopqAUTOMITECOMhrstuvwxyAUTOMITEHLPzDATASOLVHEX{KAYINT HEX%|}KPRO484 HEX~MINSTALLCOM5MITE COMkMITE HLPMITE HLPMITE HLPyMITE/U COMkTEXTP FOR+BATCH OVRCLIENTSRDEF CLIENTSRDTACLIENTSRNDXCUSTOMERDTACUSTOMERNDXDATASTARCOMPFORMGEN COMFORMGEN COMFORMSORTCOM FORMSORTOVRgINVCE DEFINVCE DTAINVCE NDXOKSTATESDTAOKSTATESNDXORDER DEFPAYMENTSDEF PAYMENTSDTAPAYMENTSNDXPRODUCTRDEF PRODUCTRDTAPRODUCTRNDXPRODUCTSDTAPRODUCTSNDXPUTEOF COMREDIT COM`REMSGS OVRREMSGS OVR6REPORT COM|RGEN COMRINSTALLCOMpRSMSGS OVR>STAFF DEF STAFF DTASTAFF NDXCS COMCS OV1xCS OV2 CS OVRn    CSDUMP COMCSDUMP OVRCSMASK MSK4DEMO CSDTERMCAP SYS CHECKC CMD CHECKC1 CMD CHECKS CMD CLEAR@ CMD CLIENT DBF CLIENTLSCMD COMPUTE DBF COMPUTE FRM COMPUTE1DBF  DBASE COM!"#$% DBASEOVRCOM&'()*+,- DBASEOVRCOMD./0 DEPTMASTDBF1 DEPTMASTFRM2 EMP8 DBF3 EMPBAK DBF4 EMPBAK1 DBF5 EMPMAST DBF6 EMPMAST FRM7 EMPMASTRFRM8 EMPMFRM FRM 9 EMPMSRT DBF: EMPNAME DBF; EMPNAME FRM< EMPNOINDNDX= EMPTBAK DBF> EMPTRANSDBF? EMPTSRT DBF@ JJFRM FRMA JOBHFRM FRMB JOBHIST DBFC JOINJOB DBF D JOINPAY1DBFE JOINPAY2DBF F JOINPAY3DBF G LESSONS CMD(HI MASTE DBFJ NAMEADDRDBFK NAMEIND NDXL REGFRM FRM M T1RDBF DBF N TAXMAST DBFO TAXMAST FRMP TEACH1 CMDPQRS TEACH10 CMD(TU TEACH11 CMD(VW TEACH1R CMD(XY TEACH1R1CMDHZ[\ TEACH1S CMD] TEACH2 CMD0^_ TEACH21 BAK` TEACH21 CMDa TEACH2R CMD b TEACH3 CMD(cd TEACH3C CMD$ef TEACH3F CMD$gh TEACH3F1CMDi TEACH4 CMD8jk TEACH4B CMDl TEACH4L CMDm TEACH5 CMD\nop TEACH6 CMD,qr TEACH6M CMD,st TEACH6U CMD u TEACH7 CMD;<WIN3KP ASM\=>?CRT RELDGENCPM DATEBNKBIOS3SPR]FGHLOAD COMILDCPM3 HEX nRESBDOS3SPRKKEYBD RELLSERIAL RELMSCB ASMNLDCPM3 COMOSCB RELPCCP COMQ/ COM RSUBMIT COM*STSNIOS3 ASMUKEYBD ASM#VWRM SUBXCENTR ASM YZ80 LIB.Z[SERIAL ASM\WORK CRT ASM]^_`aWIN3KP PRNbcdghLPTBL ASMeMBIOS BAKfWIN3KP RELjWIN3KP SYM iLPTBL PRNLDCPM3 SYMoLPTBL SYMkLDCPM3 ASM%MBIOS SUBpMBIOS3KPPRN&+BCqrsTYPECR ASM zRSXRM ASM{TR ASM5|}NTPDATE ASM(~NETSTAT ASMtNDOS3 PRNNDOS3 RELNDOS3 PRNNDOS3 SYMTYPECR PRNTYPECR HEXTYPECR SYMRSXRM PRN RSXRM HEXRSXRM SYMTR PRNtTR HEXTR SYMNTPDATE PRNZNTPDATE HEXNTPDATE SYMNETSTAT PRN:NETSTAT HEXNETSTAT SYMTYPECR COMRSXRM COMTR COM NTPDATE COMNETSTAT COMSNIOS3 PRN,SNIOS3 RELSNIOS3 SYMNDOS3 RSXNDOS3 COMFDC3KP ASMMBIOS3KPPRN>MBIOS3KPSYMFDC3KP PRNFDC3KP PRNFDC3KP SYMMBIOS3KPASMVRMAC COMj LINK COM{ GENCPM COM(CPM3 SYS<FDC3KP RELCENTR RELEND RELLPTBL RELlGETDP3KPREL END ASM!FDC3KP ASM "#$%&PIP COM:'(DDT COM&)*MBIOS3KPREL+LDCPM3 PRN;,JEDIT COM-./0MAC COM\123STAT COM)45LPTBL BAK6BNKBDOS3SPRj789:GETDP3KPASM>;<MBIOS3KPASMU=>?@ABCCRT RELDGENCPM DATEBNKBIOS3SPR]FGHLOAD COMILDCPM3 HEX nRESBDOS3SPRKKEYBD RELLSERIAL RELMSCB ASMNLDCPM3 COMOSCB RELPCCP COMQ/ COM RSUBMIT COM*STMBIOS BAKUKEYBD ASM#VWRM SUBXCENTR ASM YZ80 LIB.Z[SERIAL ASM\WORK CRT ASM]^_`aWIN3KP PRNbcdghLPTBL ASMeMBIOS SUBfWIN3KP RELjWIN3KP SYM iLPTBL PRNLDCPM3 SYMoLPTBL SYMkWIN3KP ASMKmqrLDCPM3 ASMpLDCPM3 ASMs DSORT COM] FILEGEN CMD FORMGEN CMDO IN-ADD CMD IN-CHNG CMD  IN-CLEANCMD  IN-DATE CMD IN-DELTECMD IN-DTAILCMD  IN-HELP CMD IN-INIT CMD IN-MAIN CMD IN-MAIN DBF IN-PDESCNDX IN-PNUM NDX IN-REODRCMD  IN-RPT CMD IN-RPT1 FRM IN-RPT2 FRM IN-UPDTECMD IN-VIEW CMD IN-VWED CMD  INSTALL COMp LABELGENCMD LB-NAMESDBF LB-PRINTCMD MENUGEN CMD& REV-OFF CMD REV-ON CMDWS COM WSOVLY1 OVRWSOVLY1 OVRWSMSGS OVRkWS COM WSMSGS OVRkWSOVLY1 OVR     WSOVLY1 OVR DBASE COM DBASEOVRCOM DBASEOVRCOMDCCP COM#CPM3 SYS<$&'()*LDCPM3 COMQDSORT COM]FILEGEN CMDFORMGEN CMDOIN-ADD CMDIN-CHNG CMD IN-CLEANCMD IN-DATE CMDIN-DELTECMDIN-DTAILCMD IN-HELP CMDIN-INIT CMDIN-MAIN CMDIN-MAIN DBFIN-PDESCNDXIN-PNUM NDXIN-REODRCMD IN-RPT CMDIN-RPT1 FRMIN-RPT2 FRMIN-UPDTECMDIN-VIEW CMDIN-VWED CMD INSTALL COMpLABELGENCMDLB-NAMESDBFLB-PRINTCMDMENUGEN CMD&REV-OFF CMDREV-ON CMDWS COM WSOVLY1 OVRWSOVLY1 OVRWSMSGS OVRkWS COM WSMSGS OVRkWSOVLY1 OVR     WSOVLY1 OVRDBASE COMDBASEOVRCOMDBASEOVRCOMDCCP COM#CPM3 SYS<$&'()*LDCPM3 COMQ(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE) COPYRIGHT (C) 1979, DIGITAL RESEARCH, PIP VERS 1.5$$$ SUB =.:,<> _[]INPIRDPTRUR1UR2RDROUTLPTUL1PRNLSTPTPUP1UP2PUNTTYCRTUC1CONNULEOFDISK READ ERROR$DISK WRITE ERROR$VERIFY ERROR$NOT A CHARACTER SINK$READER STOPPING $NOT A CHARACTER SOURCE$ABORTED$BAD PARAMETER$INVALID USER NUMBER$RECORD TOO LONG$INVALID DIGIT$END OF FILE, CTL-Z?$CHECKSUM ERROR$CORRECT ERROR, TYPE RETURN OR CTL-Z$INVALID FORMAT$HEX$$$$NO DIRECTORY SPACE$NO FILE$COM$START NOT FOUND$QUIT NOT FOUND$CANNOT CLOSE DESTINATION FILE$DESTINATION IS R/O, DELETE (Y/N)?$**NOT DELETED**$$$$$$$NOT FOUND$COPYING -$REQUIRES CP/M 2.0 OR NEWER FOR OPERATION.$UNRECOGNIZED DESTINATION$CANNOT WRITE$INVALID PIP FORMAT$CANNOT READ$INVALID SEPARATOR$1 :2L> ̈́M9 221@:2!o6+6+6!6#6!6#6:G*o .!N6:^*M^!K6!6!6+6' :$::=2K  :ʤ\:ҷ\x'Ͳ:!\͢  :͈'! Ͳ:$: $͈Ͳ!N6' :!Cwͯ !6:^͢c!6{:/>!/H{ͯ :<2Š ::=HҮͯ !6:Ҿ:2 !6::/H͈;!6:> !/>HHͯ :!^w:<2:0}:@E}:!S!W6: z!]6:cm!c6:_z!_6l ::,: HHҰͯ : 2ó:E:1:2v!q!*8!*6: >ͦ>ͦ!q:_  !p+q.*   !q*&!p+q*2!p+q*2!p+q*22!p+q*!p+q*!p+q*!p+q*2!p+q*16O CP/M Version 3.0Copyright 1998, Caldera, Inc. 101198654321ERROR: Illegal Option or Modifier. $File Spec Limit is $ERROR: Illegal Global/Local Drive Spec Mixing. $Requires CP/M 3 $ERROR: Options not grouped together. $ERROR: Illegal command tail. $No File $1616|27}27:70:7H҂Y0uÅl92w88͟8͓,T27!868y6:8:8Y0u:8@K #Y0uä/ !l8͐2w8*w8M)*h8"8!"j8h8͐2v8!f86>h8́6:n8HҌ!\6?\$28!"8:8n*8#"8428V*8DMl!*8) !͏6Ҍ!f86!g86!"j8:v8*v88*j885>`6:n8:f8/!g8H !g86!86:u8$-h8͐2v8×*8"h8:Q9/:q8/HBY0uv o&!x8q*x8& !y8q:y82z8!{86z81m!~8q:~80/>9!~8/H!8r+s+q+p+q*8>w#6!"8}28:8!8!8:8O*8 N~>*8!8:8O*8 ~0_*8%65+s#r!86+s#r!84¸>!8s+p+q:87*8>:6+s#rN*8*8M!J6>6+s#r!8p+q!86:8!85>`6HҌ!8P6+s#r#4Z:8!8p+q*8N#FO28O>Ҭ>!"8>!8*8M!8F6+s#r*88͚6s#r:88y6:8H; :8,*8#~A!t86#*8#~D*8##~IH;!76#*8#~D*8##~AHe!n86!s86#*8#~Ew!76#*8#~F­*8##~F”!r86ê*8##~U§!n86êA #*8#~G:8*8##~028*8##~0o&6*8 ~0_!8s:8/>!8/H*8h8A #*8#~M,!q86#*8#~N{*8 ~XK!76x*8 ~P`!76x*8 ~Su!u86xA #*8#~R*8##~OHҠ!76#*8#~R*8##~WH!76#*8#~S*8##~Y!76 *8##~I!n86 *8##~O!u86 A #*8#~X !76#A 8͓8 *8#~L|8͓:8 v*8#*8Mo8͖p>o8́6gA 8͓sA yA 8 *8#~Ur 8͓:8:7 HҧA :88y6Ho *8#~A*8##~LH!"h8f :8 :8Hè COPYRIGHT (C) 1980 DIGITAL RESEARCH @: 5@%65432115252'5h+U"!""*"5j"2u3>2v3*5"3-ͩ-:5Z!""$"5"5"5"5"5" " 522>2 5:4 b:4$M:(5-C+C*M:(5!,5M[!35PMp%M(ʡͣ#v#ƒ$:5}% }!"&:5ʦ>%*#5}| V AX*|:5(#$*#5"A*#5"&#v#% RØV AR*&*R"A*5"%5!4NA#~ͫ% p"5*5N"%5!4q#͢%w 3:4(x *#5:,5o"#5V%2*5Ô; !:V :4:4{%͉"">2!:4:424*o,kÊo:4:4{,ʊ:k*%5#!(5~́ w23@:2(4y""3"323>2v3 :u3L!P46+(0>24:u3:v3"U24͋$͇%ͩ$!5*}*#5":4:4: =X!^#fk:Vj&AW y ~   8 ; C :4:4=G!4F#I ,*5͘EIr,o͉n2"5~2 r,Yo :K4 ͉:K4 " : 52> 2K4::4M:4 Mg %U!P46+:v3Ϳ$ý*3*3"3Ϳ$"3½:v3*3^#V{ʽr+s*3^#V ʽ-:v3:r+s!46#w4> 24͋$í!94~6!(5~6"3~,_#!4w͋$ÏV *3o6͋$*3~6 Þ*3:4,"3~ š62:4*3s#r2(5294*3#"%5͇%ͩ$@*3"5":(42:32(5Ģ >24*3"32(5 ͉r!Q4wM>=n2*5~2%! 5%~2͉:K4 v }>v S M:5p*#5*gu>%"u> %2 :5O%:4©:5[%! 4:4©:4,ʀ>:5: O%% 2)5:4:4 !*%5"-5>2'5*%5"&:4:4(:)5N:5N:4=N N*&"%52)ͫ%:(5ī%x;c!'54!'55:)5ž!":*5ʍ!5%Ù*5%*#5":5*%5~ *%56 ͫ%<͉:K4 "5~2o M%(>@%>#*55%!".!/è COPYRIGHT (C) 1980 DIGITAL RESEARCH @: 5@%65432115252'5h+U"!""*"5j"2u3>2v3*5"3-ͩ-:5Z!""$"5"5"5"5"5" " 522>2 5:4 b:4$M:(5-C+C*M:(5!,5M[!35PMp%M(ʡͣ#v#ƒ$:5}% }!"&:5ʦ>%*#5}| V AX*|:5(#$*#5"A*#5"&#v#% RØV AR*&*R"A*5"%5!4NA#~ͫ% p"5*5N"%5!4q#͢%w 3:4(x *#5:,5o"#5V%2*5Ô; !:V :4:4{%͉"">2!:4:424*o,kÊo:4:4{,ʊ:k*%5#!(5~́ w23@:2(4y""3"323>2v3 :u3L!P46+(0>24:u3:v3"U24͋$͇%ͩ$!5*}*#5":4:4: =X!^#fk:Vj&AW y ~   8 ; C :4:4=G!4F#I ,*5͘EIr,o͉n2"5~2 r,Yo :K4 ͉:K4 " : 52> 2K4::4M:4 Mg %U!P46+:v3Ϳ$ý*3*3"3Ϳ$"3½:v3*3^#V{ʽr+s*3^#V ʽ-:v3:r+s!46#w4> 24͋$í!94~6!(5~6"3~,_#!4w͋$ÏV *3o6͋$*3~6 Þ*3:4,"3~ š62:4*3s#r2(5294*3#"%5͇%ͩ$@*3"5":(42:32(5Ģ >24*3"32(5 ͉r!Q4wM>=n2*5~2%! 5%~2͉:K4 v }>v S M:5p*#5*gu>%"u> %2 :5O%:4©:5[%! 4:4©:4,ʀ>:5: O%% 2)5:4:4 !*%5"-5>2'5*%5"&:4:4(:)5N:5N:4=N N*&"%52)ͫ%:(5ī%x;c!'54!'55:)5ž!":*5ʍ!5%Ù*5%*#5":5*%5~ *%56 ͫ%<͉:K4 "5~2o M%(>@%>#*55%!".!/c :8 *8#~0289 *8#~0o&6*8##~0_!8s:8/>!8/H] *8h8` A f A 8͓ç8 *8#~D*8##~R~IHH5 8͓:8¬ A :88y6H2 *8#~A*8##~LH !"l8Bl85+s#r) *8#~A/>P/H& *8#~A_l8) A 8͓ì 8 A !86Y0u:7  . *8# *7&%67  ,y -u  *7&%67  ~  ~ H  *7&%67  6  *7&%67  6*8~  *7&%67 6 *8~= *7&%67 Hq!74( Y0 d0o08͓:7!7B !76#6:7!7U !76+6:7!7p :n8m !n86x !76+6:7«  *7&%67  6 *7&%67 6!76>l8́6 !86:7=!8  *8&%67 ~  *8&%67 :w8w *8&%67 ^l8!84¼ S !86:7=!8S  *8&%67 ~:w8HL Y0u!84 >h8́6i K_h8>0!7Ң :r8ڢ o8y6¢ To&"o8>o8́6Ң !"o8 state8, char = $ state7, char = $ state6, char = $ state5, nxtchar = $ state4, char = $ state3, char = $ state2, char = $ state1, char = $ startstate, char = $!8p+q!86*8&*8~ ~ H| !84W :8!8q:8[:8]H:8(H:8)H:8=H:8,H:8H >>!8p+q!86*8#DML 28O>)*8~!8*8&*8~!8'*8&*8~" *8& *8~"*8~!8*8&*86 *8& *8"8>!8Җ:8=O*8 Ǹ :8!8O*8 Ǹ HҖ*8+"8*8~<:8!8=Oo:8!8O*8 DM*8, -*8&*8~"!86!84.:8=O*8 ~ :8=O*8 6!8p+q!86*8&*8~Q*8&*8~a/>z/HJ*8&*8~ w!84!8q:80/>9!8/H!8q:8A/>Z!8/H:8<28O*8 ~28*8& *8~28!8q*8 ͏6:8<28O*8 :8w!8q!86*8Mj/:8$H:8*8Mj*8MRH:8_H:8$H:8!8/H@*8Mͧ͂!84*8Mj*8MRH:8_H:8$Hx͂!84@*8 6*8 :8w:8!8q*8Mj*8MRH:8*H:8?H:8_H:8$H!8q:8!8w*8M͎!8:8Hp:8*c:828*8&"8͂*8M͎&!84͂!8:8;*8!8s>!86!8:8+X?ͧ!84@*8!8sj*8Mͧ͂>!86> !8ڔ*8&*86 !84x:8::8A/>P!8/H:8Aͧ*8Mj:8$H:8_H:8*H:8?H*8~>$>:8.K͂*8M͎K!86K>*8 6 *8 6@>!8q*8MRp>*8MR*8 :8/H:8Hҭ*8Mͧ͂*8 4p:8H:8DH:8BH*8 ~!8*8Mͧ͂*8 4>*8 6 >!8q:8\>͂:8\:8H*8 ~ HR*8Mͧ͂*8 4:8\:8Hp͂R:8\{>*8 6͂>:828sҚ>:8=28͂!86ͧ   ^>>:8,:8)H:8H*8 6>͊*8 >w>>ͧ O>K*8 >w*8 > H*8 6 >>:8,:8)H:8H~*8 6>͊ғ*8 >w>>:8ҩ*8q#p>*8 6*8##q#p>:8  *8MI0:8͖:8](͂:8,:8(H:8)H2:8!͖G:8 :8,HG͂:8a  *8MI0:8m͖:8 :8,Hҏ͂͡Þ:8)ž͂>:8ҷ  *8MI0:8*8q#p *8 6>28K>:8  *8MI0:8( ͂͡:8%*8q#p *8 6>283>;:8M  *8MI0:8Z͖3:8!9w͂!9~,~ H҂3!9~]:8(:8,H:8)Hҵ23:8͖33!9~=3>3:8  *8MI0:8 *8q#p *8 6>*8 :8wO>!>28/6>:8H  *8MI0:8):8Hv:8l͖͂!85H:8[…͂:8 :8,H:8(HҼ:8(µ!84͂:8$  *8MI0:8 *8 6*8q#p>:8(!84͂*8 :8wO>>N28'2>:8@I!86͂6  *8MI0:8U͖:8)`>:8(s!84͂:8[‚͂N28Ґ2>!8p+q*8"8##^#V"8*8 ^#V"8!86!86͂!86 *8 6*8 6*8 ~*8*͏6*28o*8͏628o*8͏6(28o*8͏6>28o*8͏6T͡28o*8͏6j͖28o!86:8*8 6*8##͏6ʞ*8##:85+s#r!8p+q*8"8*8##N#F *8##N#F*8##q#p*8*q#p Scanning Directory... $Out of Memory $Not Enough Memory $ !8p+q*8M28u!8r+s+p+q+q!86:8=!8ڦ*8&*8>*8&*8>H~?Hҟ>!84b>*8>28!v8:f8>!"8*88*h885>`6>>h8́6:8H:g8H*8j8!86:7=!8ڜ *8&%67 ~:w8Hҕ *8&%67  ~l:7/ *8# *8&%67  Nҕ:7/!84:7!86!86> !8*8&*8>!8w!84ª:v8!8wwO!9 "8O!9 ^#V"8!86>8́6:8/HV*8*8> *8#*8#NH>!86S*8 "8*8 ^#V"8>8́6e>>*8~!&͠&*8#DMl!"88̈́6ґ>88t6Ҡ>*8"8"8*8#"8. *8#*8#, -*8>*8w *8 >w#6*8 w#6*8 w#6*8 w*8 w#6*8 w#6*8*8s#r:8Ҭ*8>©*8~!ʩ *8 Ͳ1ڦ*8 8y6c6o> 8y6+s#r. *8*8DM,Ò -Ž*8 *8s#rý*8>ʺý>. *8#*8#, - *8 *8 ~w!86!861>`6!86!86>!8k&:8!8w k*8&*8n&"8:8X*8& *8~896+s#r>8́6h!84>!8 *8 Ͳ1<_*8&%6*8 >Ͳ1Hj6ͳ/ *8 *9&*8&%65*8 >Ͳ1HPYj6+s#r*8 *9&*8&%65+s#rY08y6"8!86>!8C *8&9) >w#6!84# *"81!86!"8"8!\6?\$28!"8~!| !86Á !86:8 :8o&"8:8ҷ *8&6a "8*8~ *8#"8*8~  *8 ~28 ͩ i Y0=428Á !:"8:y6!Y0u Sort Stack Overflow $Not Enough Memory for Sort $ Sorting Directory... $!9p+q*9))))*9)) *9) *9 *8 !9r+s+p+q!96> !9!*9&*9>29*9&*9>2 9H!! 9:9!94¤!>!9r+s+p+q!N96* 9"9*9"9:N9 #*N9&))9 ^#V" 9  ^#V"9!N959 9t6#* 9"9*9"9*9* 9T6)* 9N#Fl!"899t6O#*9)* 9N#Fl!"8*8DM*8͕!Ҭ"*9#"9*9)* 9N#Fl!"8À"*9)* 9N#Fl!"8*8DM*8͕!"*9+"9*9)* 9N#Fl!"8þ"99t6L#*9)* 9^#V"9*9)* 9*9)* 9N#Fq#p*9)* 9*9s#r*9#"9>!9͌6L#*9+"9b" 99t699t6c6ҩ#99t6Ҡ#!N94n&))9 *9s#r*N9&))  *9s#r*9"9#9 9t6#!N94n&))9 * 9s#r*N9&))  *9s#r*9" 9."":N9#!Y0$!86*8" 9>8́6$ 98t6T6!8͏68$5!Y0!"O9*8+!O9͏6k$*O9)* 9*O9s#r*O9"O9>$R!Y0*8+!!86 Name Bytes Recs Attributes $------------ ------ ------ ------------$ Prot Update $ ------ -------------- --------------$ Access $ Create $ Press RETURN to Continue $Sys$Dir$RO$RW$Arcv $ $Read $Write $Delete$None $ $Directory For Drive $ User $: $k$ERROR: Illegal Format Value. $ERROR: Date and Time Stamping Inactive. $Total Bytes = $ Total Records = $ Files Found = $ Total 1k Blocks = $ Used/Max Dir Entries For Drive $No File $w&2X9:X9—&w&2X9Æ&:X9¢&u:7&*o8+:Y9j6&2%Y0*d9#"d9̀&!Y96o0!Y94*8 ^#VZ9ͳ/*8 ]9/ *8 ^#V`9ͳ/*8#DMz0i0*8 N#F'0kI0i0*8 DMD1i0 *8 ~T'N%Y0Z'R%Y0i0 *8 ~s'V%Y0y'Y%Y0i0:t8ڢ' *8 ~ҙ'\%Y0ß'b%Y0( *8 ~ҷ'AI0ú'i0*8#~'1I0'i0*8##~'2I0'i0*8 ~'3I0'i0*8 ~(4I0(i0*8 >͌6(i0*8 ^#V"8 >L(h%Y0Â(*8 >@d(o%Y0Â(*8 > |(v%Y0Â(}%Y0i0*8 ~*8 ~HҴ(*8 DM̈́5ú(%Y0i0i0*8~*8#~H(*8DM̈́5:r8( I0(:f9(ͣ&%Y0:w8AOI0:I0:7 -)%Y0*v8& 0ͣ&!"d9!f96!h9p+q*R9*c9&5>`6ž)*d9*o85>`6!V9͏6H҈)ͣ&(ͣ&Ë)ͣ&*d9#"d9:w8AOI0á)i0%Y0*g9DMz0=*R9#"R9*V9#"V9!k9s+q+q:i9ր!j9)>:i9ր!k9)>>!m9p+q*l9 N*7M*7) *l9 N*7M*7)H!\6?!c96\$2n9:n9ʬ*:n9o&"8> *8 ~HͲ1ᖟ/Hң*ͩң**8#DM)ң**8#DM<)42n9?*!s96:8#+*q9#"q9*q9)* 9N#Fl!"8*8:v88q9t6H +*q9#"q9*q9)* 9N#Fl!"8*8q9t6 +*o9"8Y+*8"8*8:v8o98t6HY+*8"8-+:n8l+!c96q+!c96o98t6+*8 >͌6!7>́6!7H*8#DM)H+&*8#DM<)*8 N#F'0%Y0ͭ*q+!c96!"V9o98t6,*8 >͌6!7>́6!7H*8#DM)H,*R9*c9&5>`6,*d9*o85>`6,:7>V9́6Hҵ,ͣ&(ͣ&$Y0i0$Y0ͣ&$Y0i0$Y0ͣ&*d9"d9*V9#"V9ÿ,ͣ&*d9#"d9,ͣ&*d9#"d9,i0'*R9#"R9&=ͭ*+!c96!"V9o98t6-*8 >͌6!7>́6!7H*8#DM)H-*d9*o85>`6¸-:7>V9́6HҸ-ͣ&(ͣ&$Y0$Y0:8@ʏ-%Y0Õ-!%Y0ͣ&$Y0$Y0ͣ&*d9"d9*V9#"V9ͣ&*d9#"d9'(*R9#"R9=&ͭ*,!"d9"R9"Z9}2\9o&"]92_9o&"`92b98y6"8*8 "o9!"q9ͭ*>!n8,.%Y0u*n8M!. ^#V,*.Z+.:s8ҝ.:8:8@:8 H:8HH!8ґ.,Ú.%Y0uø.:8!8ҵ.,ø.+.<.B.H.:n8>!R9͌6H~/*d9o8̈́6!r8. I0 I0/ͣ&ͣ&%Y0Z9D1kI0&Y0 ]9D1$&Y0*R905&Y0`9D1J&Y0:w8AOI0:I0i0*80/I01#0>R9́6£/:q8ҝ/ͣ&(m&Y0=ò/!Q96:r8ڲ/ͣ&!w9r+s+p+q*t9^#V"x9*t9v95s#r!x9͏6/*t9##4!}9r+s+p+q*|9^#V*z9DMͳ/*|9##*z9##~`iw!9p+q*~9##~29*~9##~w*~9P6+s#r*~9#:9w!9q*9&!9p+q*9  I0 I0 I0!9p+q!96>!9ڦ0*9&*9>OI0!94…0 I0!96> !90*9&*9>OI0!94°0!9s+p+q+p+q>9́6C1*9*95!9s*95"9PY! 5"9>`6!9#~H21i0@1!96:90OI00!9r+s+p+q*9##~~1*9##N*9DM0*9N#F'0ñ1!969:9́6ڢ1i0*9&6!9sÃ1*9N#F'0!9q*9&*9~!9q*9&*9*9& *9N`iJ6n&"9Ͳ1<o&"9;Zx0NSun$Mon$Tue$Wed$Thu$Fri$Sat$!9q:9<29O*9 :9w!9p+q*9~$ʆ2*9:9<29O*9 w*9#"9^2!9q:90OA2!9q:9O͇2:9O͇2!9q*9M͕2:A2!9q*9&!d5!9s*9&! 5K͇2*9&! 5M͇2!9q*9M2/A2!9q*9M2-A2!9s+q:929:9*9& 2) >;́6HQ3:9=:9*9! 5!9s*95"9:9!9q*9&! 5))))*9&5 }!9s+q:9!9!96N!m"9:93!n"999t6399t6+s#r!94í3!96 >!9#4:9=294!96*9& 2) :95!9͏6 43*9 ~29*9 ~29*9 ~29*9#^#V"9+!5!9sͨ3!96:9>;!9͌6Hҁ4!963*9& 2) :959̈́6!9s+4*9~4:9O!%2 DMX2 A2 T4*9M3*9M3*9M25 T 5*9M2*9M2*9M25*9M2*9M2*9M2 A2*9MͰ2*9MͰ2*9~A5*9M͕2!9p+q!"9*9"9 "9*9~~HҀ5$4!96͢4Ã5u!9p+q!96.*9DM9,ã5 -Ÿ59B5!96> !95*9& 9 NI0!94²5i`N#Fog_og_ogDM!>))덑o|g6 =6^#V))) DM!>))46 =,6_og^#V) J6^#V|g}o T6_{ozgO{ozgi`N#Fogo&og_{_z#Wi`N#Fog\4# ' 4! *~^ ^33G# Pv:dv6 y#*~w>2*p@! ~*"v@*w# ) 6#̲͙N)@ u:G*g`~Ͱ>2lyPLnR>UX:l̅2l͓*>ERʵ2C!" """ :ʼ:*1 |R|ͦ0FIL: R  R* } *" :¿::¿üX!C^#fk[@ :Œ:=ʌG!ʆF#H vÛc*| EH ͺ,^1 ͦ *""1 EH DH ͺ,1 ͦ :  1:  " > 2 :|: |Ë  |*" ͩ !6="1 :  1}1:n:>BʋSSͦSSxS 1:  1"" ͦ 1 |͍ >O U!" 1 1!|_!^#fk $8AP`ixH ñññ81Ľ y0îH ñGîG  ñH ñ(Ľ yîH ñîîĽ y0îîH ñG 1: :,; c*| } 8OĽ y0G G t :):,.>C :|: Jü;r :R: ʼʋ!ʼR!ʼʋ>SR{ozg!~4ʧͦ !6 ! **̈́**̈́\iͩ !w#H USE FACTOR !* "z{*"* "I !" :1 R O*UR X* G:xl :  *̩ : l x͖ *#"EH DH 0:~ ! ^4! w͆ Æ *! 6z͖ {͖ 4>R>V>D >P >L >N1, ð CP/M Version 3.0Copyright 1998, Caldera, Inc. 101198654321;Zx0NSun$Mon$Tue$Wed$Thu$Fri$Sat$::Enter today's date ($YY-MM-DD): $DD/MM/YY): $MM/DD/YY): $Enter the time (HH:MM:SS): $Press any key to set time $Strike key to set time$ERROR: Requires CP/M3.$ERROR: Illegal time/date specification.$1, 1, " * }! /* |! H1" 1X" :]C9:]C6i* DM  ͼ :3o&" !]6:] Gͼ :]SLWiÀWzÀ.7  ,Ð -Œ5 *>!6 . 7 ,ó -¯! "N  "P !R 6*P ~2\ ͕.*  , -L .7 *, -5 *>!6 y. 7 ,& -"! "N  "P !R 6*P ~2\  L+o&" .* ## ,m -iF2L. ,Ï -‹! 6 O LNo&" .*  , -¿e2LCLmLC1, LCv !, q*, &!. p+q*-  !0 p+q*/     !1 6 #61 1!S q:R <2R O*P :S w!U p+q*T ~$ʯ*T :R <2R O*P w*T #"T Ç!V q:V 0Oj!W q:W OͰ:W OͰ!X q*X M;:j!Y q*Y &! g KͰ*Y &! g MͰ!Z q*Z M/j![ q*[ M-j:\ ::R H!\ 6:R <2R O*P ~2\ :\ i1[:\ 0 !^ s+q!_ 6[jڋj:_ ʟ:_ :_ H2_ Ҹ:\ 0!_ w1Ë!] :_ #~!_ H:_ !b s+q+q[!` :\ 1*a M*b s!d s+q:c 2e :c *d &) >;ͱ HP:e =:e *f ! g !h s*f i "f :h !i q*i &! g ))))*i &i }Wcs2l - =2j :j 2q !p 6*j & ~2p -*p 2k ×WLs2k / =2j :j 2q "!p 6/*j & ~2p :p !k </c2l × s=2j :j 2q n!p 6{*j & ~2p /*p 2k /c2l :l Nҧ:l d2l :k !q :l H*j &) :l N_!m͆ _ *k & N͚ *l M*j _*N #q#psOr*N w:;Or*N w*N ~g :\ :[ :;2 *N 6} :;Or*N w!s s+q:r !s !l 6N!m"t :l « !n"t t f ͤ ڸ t f ͤ +s#r!l 4Õ !j 6 >!j :j =2j  !w 6*j &) :w [ !f Ϳ  *N ~2m *N  ~2n *N  ~2o *N #^#V"f +!g !v s͐ !w 6:l >;!f ͼ Hi !w 6 *j &) :w [ f ʹ !k s+4!{ 6:v O! DḾ j*l &!dg *{ &!{ s*l &i !l sW *j M*k M*{ M*l M4 W *k M*j M*{ M*l M4 *{ M*l M *j M *k M j*m M*n M*o M;!} p+q!"~ *| "N  "P *N ~ !R 6͊ û *N ~~HҸ !R 6*P ~2\ ͕ *R &*P "~ û ! 62.* DM , -  O  ! 6>!  * &  N ! 4 ! r+s+p+q+q! 6: =! W * &* * &*  P >! 4' >_ogDM!>))덑o|gҀ =n DM!>))ҕ = O{ozgi`N#Fogo&og_{_z#W5",:4M:'5M*,~#T :5T !4N*5*,s#r+"%5yP  ͫ%> ͫ%%g >v % 222:4¦ :4 – ì !ʬ ¦ À :4:4€ ( :4 :4:€ :4€ (€ € x !4À  :€ :>S %2 !~5€ :%j B !4À € !~5€ úG!~4_!p!~5^!~>À >2)5:4 *5" +"%5:4ڥ >ͫ%ͫ%[%:4 :4, V :4  + !4N#~ͫ% > ͫ%ͫ%*5"#5:)5- :)5%͉}*5" +"%5ͫ%ͫ%*5"#5>@:2(4:(5 H 23y"*5"3*%5! {#zt ~+"%5*5+"5wT #"5*5"3:)5ʑ N]T s#r+*#5* {_zW"3:)52v3 > > >2 5n2"5 %: 5*#5* 5"#5*55%"#5:5KBn2: 5O0!*", ++ *5:K4 0@:5Ĩ/ú>2) :u3ʭ :4­ *5+"%5[%2!<24*$#"$""*:40!??"4͋$"5+"%5͇%ͩ$+:4­ :4,J "*} :*5 :5%:4 +:25Ĩ/:4 :4  @S+ >2):4„ ͣ#v#: :5$:)%k %G I k :)%:)c %k %+:4„ :4, " :4 :4/ :4 :5 $*#5^#V*S"s#r*5*#5s#r+"5 |#v#*#5" 5:4 :4/ !"5:5> %AB,#*#5 :4:4 !;*M_!Q^#fkox Iͻ8ʗy0IͻGͰͻHIͻ(yIͰͻͻy0ͻIH'd ! ^#V#*"0}o|gF 9"":!`x=`y0l2!!4^4!4q/:4:4,; *5͉: 5ª|}$ªo͕Ͱ8Oͻy0H͕H͉: 5në:4:4,>C0:4M:4  ;C:4#:4 ! #! #{ozgBB**}j!]~ } #ymy>2(>2v3͖*5|EB"#5>%0,# ^#VÕJB*50MB*50!".*5} "#5^#V"5*.s#r+".*."5:u32'5!5~4P!"*|"#5>%*5%"".o!P46 !L4*>2(>2v3͖>2(>2v3͖NB:O* 0:+5ʘ0*5*!5S*5*!5S\gr!P4w#þH USE FACTOR !M4** "5A1z{*5~2*"#5v#!":5(%! 5%n25%%%>%n2G:5x:L4 o:x_*5#"5:5ʽ*5|ʉIB0>%%O%O: 5%*55%ý:5ʽ: 5O*5*5ESS͎2O=>O͎2N=#y{#* 5* 5 "#5" 5͎21͎2=HÎ2Î20:G!^4!K4wOOn2!6z_{_4A_A?*!5"#5*#5*5{z*/5+"%5**+"%5% V%=͇%͢%*%5#þ!v3ʲ:(O! ^#V4@B%GFB>%%O0*#5##~<##ò*#5"|3#"%5͇%:15^:4^!4~?^#ʲ:4͆!~3"z3^#V"#5}ʝ##~2v32w322(!~38w# ͖!~3"z3>2y3*z3^#V#"z3"#5*#5}ʩ##~<2x3G*#5###"%5:w37> ͺ!w3~w7>w> ͺ:w3Pd!5^!K4~ B!~624(02w3%!>%|_}_> ͺ!w3~w:x3ʜ=͢%ͺ!w34È*#5^#V"#5!y35:24(0!^4!K4w>R0>V0>D>P>L>O>B>S>N0!u~ڇK6N4!E s#r!U :mw* 5!] s#r!t~ ڹ6K^4!1w!;p!u~K!5N!E ~#fo!U ~2n!] ^#V"pK2oo&) ^#fkN]ivKzV{K>ɯo>g"!6ů{_zW5>)D*OxGғ !?uDM!xGyOڱò)â͝ddJ)=J|g}o=2o2o*p"rOxKxGyKxGy0KG*p*r}|K\\z{W¢Ü}|ڜâWʜllyWœâ!!#Qzg{ozg{ozg{ol&:oO:n2m*p" 52n2ox:4:4 ;!,ɯ2t2u2 52o=20!"5" 52m{!t~Q5_!1~9:uK:K4 *E"5:U2 5*]" 5*v"#5:K4 $:4§:4KK!4^#=ʣV²*4(—ҌV :4:4V !!*/O:0K>20y_j:t:_!;~:!ts!1~y_!t~X=w_!1~[Kdͪ>20$y$zU0!%2m*#5"v:mP>U0%4>%:m!>2m*202m!" 5/:0Kx*#5DM*5" 5}|^#V<>E0:u3ʛ*3~Œ:v3ʁ!\4>A!(0":3]#"3,ž"3Þ-2\  :4x_<24!K4w:94͜:94ɯ2:4284]294:4:94K)2:4;4~#!͜,!:4~*4!;4_:94w]294ɯ<*#5"W͉#4#*W"#5ɯ2[![4Y5!!:46"3!:4~q5!84^4!;4~â:u3:94†G³]âʻ^¨^·:94&·!:44#wó&G294xâG:94&:4G/G&ʷ/&ʷG/G!94~&>623y"!v36*5"3$"32:4*W"#5GJ2:42942(524> 2S(0>24ɯ242T!4~@`65!^4#:(5O:4yD(w~$w:(50 |:(5D(A:(5?ʱ@ʱD(Aɷ͙| ;!Cͻ2(5:'5:)5:5:(5ͫ%:(5 !J24:(5 ʞ;{>24:'5ʋ:)5.:5‹;Ž*-5*%5++{Iz]~ T++]!]+?"%5:'52'5hͫ%2'5ä:(5*—:S —ʤË ¤24͙ʳ>|ʾ>:(5'2(5> :u3>+2P4(0!K46 >24>24:(52SR:4Z:'5:4=!EQM<8!LE:(5=I!NE>I!LTM>!GT:(5=M!GE2(5"4!44>24!(5:4ruͳ u͇:(5D(OʓQ˜>ßH©>2T2(5:SD(B¹>D> !452T!"4!4N#~#A07O!T/!~*4! ) "4 :(5 5!'':(5 :(5,;%:(5 !:(5; ,J242Z$ l ` / ‰ >24#!:(52S:4; ¡ :4/!:Z/!)!:4 :(5'#!R:(5'z 24É :(5' >24#!^ :(5 #! #!;!)!<!!Z~4z #!>!!Z~#!5z #!:Z#!G )!Rz >24>VG!>OG!>IG!>BG!0!P!w#w#["!"#5!U3w#w#p"!u3~#4^!v3~w!3ͷ"!3ͷ"!3ͷ"!3~w!3ͷ"!4~w!(4~wN#Fp+q!u3~#^!v3"!3#!3#!3#!3"!3#!4"!(4"5~wN#Fq#p>B0!4"%*%F# #2P"*#5##~G=#w#6#w]$*5!4n& {ozg"#5!5{#z$"5f$*5!4N#yʦ$ ~Ù$f$!U3"Q"/$:P"%*5!3{#z"#5%_!U3*#5~#~&%~#$"5ÿ$&%!%*A1SYMBOL TABLE OVERFLOW *#5###w*#5###~,#*#5_####&%s#r&%^#V&%##"%5F%wF%~#!4~l%6~=ͫ%ͫ%!4N#~ͫ% y%͢%͢%2P"*ÿ*:?*ÿ*:@*ÿ*~x/~# *> x/\ ?-$-w#+!\64 #+>GO#w %+>O # <+6 2+6L#6I#6B#w2|*\+>2*5!"B*!(5~2A*w͹*!1*>826*27*!"/5*"5!5"h*"*"*#"5"!5\, _#~ͨ+ ¶+:;*Aͨ+>:ͨ+Ͷ+>.ͨ+Ͷ+>-ͨ+*!1+!32*!1+:=* D,> D,:D*6,_!D* W,6 4ɯ2D*2*522521528*:\ -2;*2@*O:\ʋ,=Ì,y!<*w#w#w#w#>2+52,5:m$>-!~#$ª,~>-# ʱ,<*A-P-S-R-L-*,+,-,-+5~S-M-25L-15Q-8*1,-x#ñ,~A,-#ñ,#6 !1*!*!E**e !N*+-!j**%,r-6* ,,:=*ʂ-:>*…-2:?*ʨ-!***ѯ2:*29* ,,!3*60#60#60#>235!"*:5ͨ/-!"f*2Q*2e**E*+!1*z{:*5G.*B*-.!"B**\..*B*#"B*+~¤.:u32*5G.*\!F2+*f*-•.*!"f**h*ʹ*E*€.a.Ò.Ҫ.ʒ.6# ‹.͹**h**f*#"f*~!2*G:=*..xx/.x.1,..****w#"*!-*!"***j*!*-/~5/ʹ*9//͹*!2*1L/****w#"*!-*!"****/_!5*~ ͳ.27**/5}!1~ /ͳ.#/> ͳ.>#ͳ.ͅ/> ͳ.*/5~/ͳ.#/> ͳ.> ͳ.> ó.}26*!7*è/Oͳ.:K4 :5:=*yx/:8*!5I0:25!*5—0~0:K4 0!K4~ —0:350:P4+—0:,50ʗ0:Q4#0:L4 0:,5=ʗ0!K4~ ʇ0!4s!7*~!6*Ԩ/4:4!K4ʺ0G~ 0#x=ë0> 0> 024!K4>x6 #=0G!K4~ p%,**}0>ͳ.0*j*+:+5ʨ/0!s*6S#6Y#6M#w!*w:>*2=*!"*%,ʨ/26**j*կ ,,0:?*1::*Z1ͬ2L1͎2**}1}w1>B/a1}|Gd/:?*ʓ1**+![2*CP/M RMAC ASSEM 1.1 NO SOURCE FILE PRESENT NO DIRECTORY SPACE SOURCE FILE NAME ERROR INVALID PARAMETER: SOURCE FILE READ ERROR OUTPUT FILE WRITE ERROR CANNOT CLOSE FILES UNBALANCED MACRO LIB END OF ASSEMBLY : 5O!5 ~#fo: 5O!5 s#r:?*yʟ2š2ͬ2Ž2G:9*29*!:*4>6:9*L/29*2%#333/3 3333#332E3 3   MXList WAITING FOR PRINTER $PRINTER READY $çCOPYRIGHT (C) 1980 DIGITAL RESEARCH 654321? OVL LINKING $ $ 1L9M9!96w:o9!9D:!""!""!"9*9^#V"9"q::u9 ͥ6**=;"`:"b:q:b:͞8.96`:q:͞8"9|!96wj1:9R,v!!]:ڤ*]:&f;) N#F͋41!]:4:u92:2:2;2E;2u;2;2;2;!D:6+6!E:6!"p9!"m9}2o9!z962v92x92w9!t96X!"y:"{:"}:":":":":":":":":":":":":":"i:"k:"m:"o:}2:!:6#6#6*9"q:2C:2D:2E:2R:!"X:o&"Z:|!"s:!"p;";";";":":";"7;*+":*+":*+" ;*+"9;!":":";"?;!":":";"A;:9*b::9=o&))9  ^#V!!<4*<&^<) <͞8-*<&^<) ^#V"d:M*<&^<) q#p!<4*9&))9  *`:s#r*A:)8"p9*9&))9 q#p:9<29O>D:9=29D:9ڗ*9&))9 ^#V"p9  ^#V"`:*`:DM!96#~ͬ . ":\ -:+: .+: -:9":5*.:~=ͬ :9('*.:~(*.:~)H^*.:~,NDͬ :9['(:9vC()!o96>5!B".:ͬ . ":\ -ˆ*.:~=Ÿͬ ï.+: -§:9ҹ'*.:~*.:~(H*.:~,Dͬ :9'ù:w92y9:9F:9(C(͆7:9):o9:o9H4!"p9>:o929*p9"95*.:~(*.:~ʐn*.:~)p̀^*.:~*.:~(HҍDO:9ʛD*Ͳ!6~̈́6*& 6:[],()?$! : @: <_2 <: !#<ڲ*#<& :<«>!#<4>*.:#".:*.:N2<&õ͵:< ͵!<6 !%<6+6:%< :%<  !<6͸ !\6͊ !!%<6͊> :%<5 !͸ ͵" :<:„ :\:%<Hb !:]A<2\O>v !*%<&\ 6 ô !%<6:<.° ͵͊ڰ :%< ڧ !͸ ͵Ô ! :%<<2% :<02<> : :>!"&<͵͊6 - *&<))))*<& "&<0 D͵ *&<:/͵: W :ZD͵:ڎ :!Q: D*Q:&J: :))덑o|g6 =6^#V))) DM!>))46 =,6_og^#V) J6^#V|g}o T6_{ozgO{ozgi`N#Fogo&og_{_z#Wi`N#Fog1CP/M Version 3.0COPYRIGHT 1982, DIGITAL RESEARCH151282654321PASSWORD0CONFIRM []=,  *** Aborted by ^C ***$ Disk I/O $ Drive $Read Only$Currently Opened$Password Error$Password: $ $Not erased, $ ERROR: Missing Delimiter or$ Unrecognized Option $Near: $Requires CP/M 3.0 $Enter filename: $ $ERROR: Invalid file name $Confirm delete all user files (Y/N)?$No File $ (Y/N)? $ *** Aborted by ^C ***$11͢}0͢|HSb4 ڑ!16fb(r2:<<2}wb!6 *}& 6!u6:}!uڑ*u& ~aڊ*u& ~}Ҋ*u& ~ w!u4U!"+!\"-+5 "{{͔zb>{͜*{~ *{#"{*{#"HR :\Oy<2\2y.3l -:1/Ҁ!u6:u<2uO!\ ~??(> !uҀ:2/Ҁb@2x:xy:xYH/} .l\ -ˆͫlͻ2z:zµb:z6:z`O! "/E";G"=I"?"A"C"E:1Ҷ*/:y³:\A=OI:I I!v6> !vW:v ?.I*v&*/NI:v<2v)b@2x I I:xƒb:xy:xYHҳ. */#DM] -¨ . */#DM] -  ͫ*;E*=G*?I*A*C*E!=lͪ-.*=l -%2zõv!q*&!p+q* !s+p+q*:w#6* *#"N#Fy  !p+q*! p+q*!"p+q*! -!'q:'2#!$6#1!*r+s+q:(2#!$6*)#s#r#1m!Nq!O6*O& X>*O& :Nl:O!O4F!Ur+s+p+q+p+qͪ !\6*T~*T~2\*YM=2L!`6:L :`*YM=2LïÐ:V2KN :V2K2_*T~2]!`6*T~2\*T~j*TN! *R*R =2^!_^!`6!W6:_!W[ :`T!W4=a*T6N *T:]w:KH͂+s#rͪ :Lʔ*H#"HÙ!L6:\2aO*R ~2X*X&*P:!a4*T:aw*X&*P:Y*a&*R~2Xë*T6*H~2Y͚:X2Z!V6*H#~2Y!Z4N*P :M( !`6> *Z&*P:Y> !`6!V4N*H ~2Y*V&*H~2Y*YM=2L:L>!LHҗ !V4N*H ~2Y*YM=2Lf :V2KH͂#+s#r*HN=2L! *H#"Hê ͙ b I I!es+q+p+q:e=2e *b:dw*b#"b !fq I:f) b:f7 b:f:fHU b:fc b:fq b:fҁ !hp+q:2Қ *g >w3ͫ*g:\w*gDM"i*g >w*i} *i|2k:kH *kM :k>Y2la :l{ :l :lb3 !m6>!mڗ 2n D *m&3 :nw:n O × :nZ  :n€ :mm  :m=2mO!3 6 , :n !m4# ͙2n!oq:1 :\A=OI:I I!v6> !v :v .I*v&*/NI!v4 bb*oM \͂ 2wQ :w$ *wM B :wB *wM͞ \͂ 2w:wQ *wM͞ !L6!J6:L:LH:LH Jt:J b.bLb:KH͜+"p!r6:K!r *pNI*p#"p!r4¹ :J !26:J !16\ !tp+q*s~ ~ H% *s#"s *s~1 >>!`i^#V#~#for0V y wÇ G:„ xA  a{k_  ~ ~r_ogi`N#Fogo&og_{_z#W0$¡.*|$ :$w[œ !#5:$2$!$49:p#[¼ _ :q#!q#6+~. 2p#Oc  :q# :p#* Ͳ ͒ !q#6+~;= 2p#Oc = :q#$ *q#&$ *|$:p#w!q#4 :p#[H !#5.*|$ 6 *|$ 6å!$q!$6> !$ڏ *$&> :$ˆ >!$4l >:q#<2q#O*|$ :p#w:p#?± !d#6!$q!p#6?!$:q# ͒ û 2p#:p# :p#]H!:p#A2$O>!:p# GET 1âCP/M Version 3.0COPYRIGHT 1982, DIGITAL RESEARCH151282654321SYSIN $$$Getting console input from $INPUT~FROM~FILE~STATUS~CONDITIONAL~FALSE~TRUE~CONSOLE~CONIN:~AUXILIARY~AUXIN:~END~CON:~AUX:~NOT~ECHO~FILTERED~SYSTEM~PROGRAM #).6=GNRW\`enu|[]=, ./;Error at the '^': $Error at end of line: $Invalid option or modifier$End of line expected$Invalid file specification$Invalid command$Invalid delimiter$File not found$Enter Password: $file: $SUBMIT of $GET from $ stopped$console$GET from $ stopped$console$Requires CP/M 3.0$CP/M 3 GET Version 3.0 $Get console input from a file $Enter file: $11N}0N|HG+\Yr'2ͅ !6 *& 6+!6:!D*& NZ *& w!4!":2"ͱ!6*& ~ w!4a!"+~2*& "!6!6%*: : H:HI%*:%*:%*:!6*DMͱF: : H:HÀ Fͻ : T :: H: Hғ: †̀ Ó%*:¨%*:½%*:*DMͱ:: H: H̀ ͻ v!q*&!p+q* !s+p+q*:w#6* *#"N#Fy  !p+q*!p+q*!q*&-!q:2!61!s+q:2!6*&"1m!p+q*m!p+q*<!q!6*&: >*&: :":!4!r+s+p+q+p+q: Di !6ͯ*~ʙ*~2*M2!6::ڃÓ*M2nãͯO:2 :22*~2!6*~2ͯ*~)*N! ** =2!!6!6:!:ø!4 ø*6 *:w:+s#ri :S*#"X!6:2O* ~2*&*:9ʩ!4*:w*&*:˜*&*~2j*6*~2Y:2!6*#~2!4N* :!6*&*:!6!4N* ~2*&*~2*M2:> !HV !4N* ~2*M2% :2#+s#r*N2!E„ *#"i   !s+q+p+q:=2ʺ *:w*#"Ý !q!6*""͐2:( !6(*&*&!s*&!s:C ::H, *+"C :C :++s#rͅ !6:!i *"*M !4K *M :Ҁ FÆ Y:Aґ ͅ *M! ^#Vp      ͅ !q!6:! *N*#"!4 ͅ !6:!V *!C !6^H  *#"!4 ͅ !q:at :{t : :OZ 2:ͅ ͅ l ͐ !6>! x 2 *&l :w:  : Ò : : Ò :=2O!l 6 ë : !4¢ W2!p+q*~A *~@O:!6> !ڄ : \ .*&*~ } *&*>O!4F ">ʰ *++"~Ұ "lp̀\`"̀*} *|2 : ͆ ͅ lp\`" *"ͻ ͐0 ͅ \ ͯ!p+q!6+6>!W *M[ :O[ !47 :!q*&*>*& z !6: ʍ ͻ "> "*DM) ҽ  *DM ͅ Í #: ͻ ">7*DM) 7"+*DM 6ͅ ">[?p͐0hͅ *DM !q"!+s#r:ʨ:=+s#r*DM!p+q*"!\"b"ͻ >ͅ *#"*~[ͻ :: H'%*:„:?ͻ %*:\yÁ:lyÁ:|yÁͻ $!6:£!6%*::Һ!6ÿ!6$::!6!6$::!6!6$::!6!6$ͻ ͅ !p+q*~ ~ HR*#"1*~^>>!`i^#V#~#fo͟]ƒywôG:±xAa{Ҙ_ ʫ ʫß`i~#~2#~2#~2*| \!\~2.n~`>26!.t~:s}>26!N#F#*"^q#Vp"N#F##"^q#Vp"4!7 !6ë7 \\m>_ 1:~# yɍWARNING: Cannot redirect from BIOS $ERROR: Auxiliary device redirection not implemented $ERROR: Insufficient Memory $""SYSIN SUB_og_ogDM!>))덑o|g =_og_{ozgi`N#Fogo&og~FGET :<***.n6.t6 LL!p:~y !6 <ʊ~"x!F#fh!:~!«!>w~:!5*.~w:; :~!9"1W:.~ !5< W@w.tEy!h g ={  ͩ* . +6.w   *ͩ2*.6#6*.~w#~=~# Ʌo$x(\!54  !F6ȷx(\>^\@_: N#x€ʹ> ʹ ʹŸ*.>wm#wM~xµmp> \ 8>""SYSIN SUB hhhhhhhhhhhhhh 151282 COPYR '82 DRI gggggggggggggggggggggggggggggg"D! BH!!$@ !HA@  H!@  @BPJt:J b.bLb:KH͜+"p!r6:K!r *pNI*p#"p!r4¹ :J !26:J !16\ !t> S>Mn> T>^ : K A Y P R O C O N F I G U R A T I O N P R O G R A M!# ͞xMn> U>Mn> V>Ò  ! ͞x!j͞x> W| Help Function Change IOBYTE .........................i I Redefine the vector pad ...............v V Redefine the number pad ...............n N Set the write safe flag ...............w W Change the printer baud rate ..........p P Change the modem baud rate ............m M Exit the CONFIG program ...............x X Please enter your selection ===>> r> uk> v}> w| In order to understand this command you should read the CP/M manual "AN INTRODUCTION TO CP/M FEATURES AND FACILITIES", in particular the section on the STAT command and logical and physical devices. The logical CP/M devices are CON:, LST:, RDR:, and PUN:. The physical devices are: CRT: -- Video and keyboard. TTY: -- Serial port. (See manual for connector wiring) LPT: -- Centronics port. > $Foreign!! tty> >i# UL1: -- User-defined list device.!E͞xMnó> >æ UL1: -- Same as TTY: above.!͞xMn> | Possible logical to physical assignments that are meaningful are: CON: = TTY: or CRT: RDR: = TTY: PUN: = TTY: > NForeign!!F ttʤ> >Ô$ LST: = TTY: or LPT: or CRT: or UL1:!o͞xMn> > LST: = TTY: or LPT: or CRT:!͞xMn> >Mn> >91"CP/M Version 3.0COPYRIGHT 1982, DIGITAL RESEARCH151282654321͈͋> (12/06/82) CP/M 3 PIP VERS 3.0 DISK READ$DISK WRITE$VERIFY$INVALID DESTINATION$INVALID SOURCE$USER ABORTED$BAD PARAMETER$INVALID USER NUMBER$INVALID FORMAT$HEX RECORD CHECKSUM$FILE NOT FOUND$START NOT FOUND$QUIT NOT FOUND$INVALID HEX DIGIT$CLOSE FILE$UNEXPECTED END OF HEX FILE$INVALID SEPARATOR$NO DIRECTORY SPACE$INVALID FORMAT WITH SPARCE FILE$MAKE FILE$OPEN FILE$PRINTER BUSY$CAN'T DELETE TEMP FILE$ *5<P_lz)<\fp}NO DIRECTORY SPACE$NO DATA BLOCK$CAN'T CLOSE CURRENT EXTENT$SEEK TO UNWRITTEN EXTENT$RANDOM RECORD OUT OF RANGE$RECORDS DON'T MATCH$RECORD LOCKED$INVALID FILENAME$FCB CHECKSUM$2FTe$NONRECOVERABLE$R/O DISK$R/O FILE$INVALID DISK SELECT$INCOMPATIBLE MODE$INVALID PASSWORD$ALREADY EXISTS$LIMIT EXCEEDED$eT     =.:;,<> _[]OUTPRNLSTAXOAUXCONAXIINPNULEOFERROR: $ - $$$$DESTINATION IS R/O, DELETE (Y/N)? $**NOT DELETED**$COPYING -$ (Y/N)? $REQUIRES CP/M 3$CP/M 3 PIP VERSION 3.0$:"Q}#( :}#2m#}1͖-m:m#8ͺk 2#2$M 2"!\#6!z#6:z#b:m#2}#!$6+6+6!o#6!"6!"_#"X#}2d#2g#2h#2c#2z#!n#6!e#6#6!j#6!"6:m#ҹ*ͨͺ!#6:}#͑ ͖%#:d#%# :p#=:p#_HH ":S# N:"H ͵!S#6:d#<"$\( K"#&#( Az:S#:" H҃͵!"6&#,"( Az>!S#Ҕͥ z:S#ʡ!e#6:j#z!f#6:p#,:p# Hͥ :p#,2j#!c#w:S#!$6:$!$6:$!$6:"> !"H!d#"ͥ :"/!f#6:" T!f#6>'!f#Q!f#4<g:" dgA2:j#w"á:m#2}#b! $p+q*$}2{#|2x#!!$q:!$_ ͨ ͨ!#$p+q*"$ !%$p+qͺ*$$DM!|#6|#  !'$p+q*&$!)$p+q$*($ DM!+$p+q**$DM **$DM̈́:{#**$ ~Hi **$!{#6!x#6!-$p+q*,$DM̈́!/$p+q*.$DM̈́DM̈́!1$p+q*0$DM *0$DM̈́!3$p+q*2$DM̈́!5$p+q*4$DM̈́!7$p+q$*6$ ~ *6$ >w! *6$ >w$*6$ DM*6$DM̈́!9$p+q*8$DM *8$DM̈́!;$p+q*:$DM̈́ !<$q!<$:$ʐ :<$2$_ *#Mt *R#Mt *"Mt !>$p+q*=$!DM̈́:{#!@$p+q*?$"DM̈́:{#!B$p+q*A$#!D$p+q*C$$!E$q!E$:\# :E$2\#_,0!J$s+p+q+p+q:J$=2J$^ *F$*H$ w*F$#"F$*H$#"H$7  !z#6:h#~ ͡ "j !h#6:g#Ҕ ͙ "j "͢ !}#6!"6l!K$q_ *K$&) N#Fͺ!N$r+s+q:{#2Q$:x#2R$_ :L$:Q$H !R$6 :R$2R$*L$& N! N#F> !L$~H:Q$H> !Q$/H^  ͨ:Q$=O!r N#F!R$6:R$ {  ͨ*R$&) N#Ft>M$H" *M$~A=Oͨ:ͨ!P$6> !P$ *P$&*M$>2O$ :P$ .ͨ*O$Mͨ!P$4¢ ͺ:Q$:Q$H:Q$H:Q$H :d#2z#D :R$>!R$~ HH> HD :d#2z#ͥ  m m ͥ !V#:"{ >!V#:"© !U#:"Ғ >!U#:"© !T#:"ҩ >>͙ %#-"( x"( :+#2+#%#! :{#2y# %#j :x# %# "͢ :{#:x#H!" " :{#L:x#D" L" !#6!g#6͡ :"2""! :{#u!h#6:$/:"HҊ!{#6:{#¯:x#§" ï" :"2r#:"2s#:"2t#:"2u#:"2v#:"2w#" 2{#"T#( !"6#6#6#6!"]#:g#ͬ !_#!"Y$>'")!"W$͙ :k#!l#we *W$$ DM" b" k" :a#Ҁ!@"Z# Ë!"Z# W$Y$;">'"W$Y$;"!@*"!a#W$Y$;""Z#!Z#"}O *W$$ DM" :{#" *Z#*W$"W$Ë:$ң !"W$ Y$W$;"ҝ"ͩ 2V$*##"#>'"G!#4!U$6:U$ր!V$ҁ*U$& :U$W$!$ 2V$!U$4L*W$"W$:V$ښ" "Ϳ " *W$$ W$_#;"+s#r{_$( N :a#!@"Z# !"Z# ͡ *X#"]#X#";">:DM9͏5*:@ ~ !92(< !92)<7 :)<ր2) >!:*!^:6+":^:$t 8'> *0< ~L*0< DMB5*0< 6*0w#6!4w#6*0<##N#F*.< ~O`i~8p8!6Ͷ8ikS*0< DMv5*0< DMd5*0< *0<##N#Fq#pä*0<##q#p*u:#^#V*u: ^#V*u: ^#V*u:~*u:~*u:>*u:~*u: ^#V*w: ^#V!8:=<Hw!>:><Hw!?:?<Hw!@:@<Hw!B͔8>ͥG<ͮ8'*u:"w:*E<#"E<ͺ"u:>͔8$>ͥG<ͮ8!TJ<ͫ8:P<Hr:Q<ҁ!U<6 Æ!U<6:U<q:ͫ8+s#r!`:͹8ң96:T<Һ*JE<ͫ8*P<&i:) N#F,DM,*LE<ͫ8F*P<&i:) *q:s#rN*q:DMͷ!V<6>!V<ڷ!"Y<*V<&i:) ^#V"u:>u:ͫ8ʝͺ"W<*Y![<,*[<&i:) ^#V"u:*[<&<) N#F.>u:ͫ8%OkͥDMͪͮDMͪDMͪͺ"u:![<4!"i:"k:"m:"o:*d:##6*d: 6*d:^#V!`=p+q*d:*_=s#r*d: >!a=q*d: :a=w*d:##>?!b=q*d:##:b=w*d:##~*d:##>w*d:##~*d:##>w*d: ~!c=q*d: >:c=Hẅ́d:8++"\<*\<^#V!e=p+q̈́d:8++"\<*\<*d=s#r*d: ^#V!g=p+q*d: *f=s#r*d: ~!h=q*d: >:h=Hw!k=s+p+q!^=6:k==2k=ʱ*i=:^=2^=*i=#"i=Ñ:^=2^=!n=s+p+qͽ"d:`:d:͞8͹h!n=*l=*d: DM*n=>*>̈́d:8+s#r!r=s+q+p+q*o=DM*q=̈́*^=&^<) ^#V"d:>d:ͫ8ʆh!q=}*o=*d: DM*q=>*}U!r=}>M"d:<>!|=r+s+q+q+q+p+q+q+p+q:u=2}=:z=Һ!}=44*`:"d:*}=& "`:q:ͮ896<*s=DM*u=̈́*^=&^<) N#FU*^=&^<) *d:s#r*}=M͍*v=DM>*y=M*u=Ms*x=Mf*u=*d: *s=DM -B:z=Y*{=DM*d: ~#k!{96 MODULE TOP $UNDEFINED START SYMBOL: $YY???? $$$XX???? $$$RQST$ UNDEFINED SYMBOLS: $ABSOLUTE $CODE SIZE $DATA SIZE $COMMON SIZE $USE FACTOR $!=q*=MͲ!~=4!=q> !=8:=0OͲC:= AOͲ!=q:=O:=O!=p+q!=̈́8MD>=08MD:;!t;!;!;:u;2\. ] -Ÿ\ͩ6!t;6!;6!;6!;6!=6+6>!=*=&f;) ^#V"= *= ~ *= DMv5 *= 6!=6:=<2=:=7::2\. ] -)\ͩ6*p9###H:ͮ8!D:U!\:6*p9###F:ͮ8!C:r!\:6*p9###X:ͮ8҉!\:6:R:>S:ͫ8:U:H:C:/HҼ!\:6!\:6:E:!C:!\:6!\:6:C:*F:"::\:*p9###":*p9"::D:*H:":8*:*:"::r98*:)8":*:*:":Z:X:͞8_X:Z:͞8#"y:e!"y:!:6*X:":!=6>!=ڞ*=&y:) >Ͷ8Ҕͥ:=<2=v!":::2=!=6:=#w:==2= *=&:) *=&: N!: ͠8*=&: ~2=*=& :=w:=2=:=<2=õ*=&: :=w::<2:*b:"d:`:d:͞8q͜/!9H`2UO!: 8DM>ͪ̈́d:8+s#r&!]:6>!]:7*]:&f;) N#F͋4:*]:&<) N#F.B2=:="="=:=O>"=n2=ð-*]:&i:) ^#V"u:>u:ͫ8-2=ͥ"=ͮ"=!"=nͺ"u::]:<2]:w!=r+s+p+q*=}*=_DM͘4*=#*=|_͘4!=p+q*="d:2:=2=:=O>Ґ*=DM^"=ã*=&:) =8"=:=O>:=O>==͞8UO!: ͹8"=*=*="=*=DM*=8*d: ~*d: :!z9/H!"=ͽ"d:`:d:͞8HҴ>=08>͔8S6!~=6U`/wUp/>=08 \8 M`͹ҖÞ2DM_   *=#"=̈́d:8+s#r >!=Ͷ86!=6>#w#62~=ͽ"d:`:d:͞8N/=:=!=6>=08>͔8'6!~=6w*=#"=>&8)))M`̈́d:8+s#r>!=Ͷ8\66!=q!=:~=v d!=6h!=ڤ:==O! *d:N:=<2=|:E:J:*Q:M2"V:!"V:|!=6:Q:!=:==O!J: NͲ:=<2=6D:R:*U:&:) S:8"V:D>!{:Ͷ81*:"V:DX:ͣ8D*X:"V:Z:X:͞8mX:Z:͞8#DM*X:v6*:DM*:6*:DM*:6*:DM*:6`:s:͞89ͮ8*9|=ͫ8 Ͳ(Ͳ*=DM_-Ͳ*=*=+DM_)Ͳl*|9DM_68f ͥOr:t9Z^E.:n~:x9ZyU/?OVLAY?OVLA0RELIRLIRLREL))O`i~8p8>!:!>6::!>:>=O!: NͲ!>4½)2:͕":)2::: !:6!>6::!>. ):>=O!: Hq!>4 *h&\8*|& "9>*7:DM\͏5*9+"9!>q:>2]:*]:&f;) N#F͋4!>q:]:!f:Ҏ *]:&y:) N#F*>͘4:]: Z:y:͞8Ҽ *y:"Z:X:y:͞8 *y:"X:*]:&y:) N#F+q#p!>s+p+q::2>O!: :8">*>DM*>h!ͮ"!>2>:>>!>ͫ8HA!ͱ!">G!*!>">*>DM*>MC:>e!*]:M͋!*>*>*]:*>*>5:=Ҭ!ͱ!"!>>͔8ž!*!>">!>6í!!:]:2%>*>M^ *>DM4*>#DM4O`i~8p8"#>*%>M^ *#>*b:"d:`:d:͞8%"*d: ~#"*d: 6̈́d:8+s#r!!{96:*:MH"H"!^:6:*:Mi"2"g:͜2f:o"=6*:::: -y"::29:*::ͺ/Ҵ":*:͉:*:M"!:͹8"/Ͳͯ/Ͳ Ͳ=6#:*:*:*:*:͉*:*:"::*:M/I#:*:͉*d:DM :*:Mҟ#{#=ͯ6Ü#*:&:) :8DM>*:Mf#:*:*:&:) :8*:͉*]:&y:) N#F*]:*:DM5!=6#!=6*:":*:M^ :]:$$*g:*:":C$*]:&:) :8*]:&y:) q#p:]:P$!=6*]:&y:) N#F *:":>!:Ͷ8::HҲ$:R:Ҕ$=6ò$*:&:) :8"S:::2U:!R:6:0:$)$ò$!&>6>!&>%%*&>&:) *&>&:) 8*&>&:) q#p*&>&y:) q#p*&>&:) >w#6:&><2&>$s:q:͞87%*q:"s::G%͸*9"q:^ :_:/2^::{9]%!!)>s+p+q:)>ˆ%*g:*'>"'>:f:҅%!)>6Ý%*)>&:) '>8+s#r*]:&y:) N#F*]:%*'>DM*)>M͋%*]:&y:) N#F*'>*)>*]:5y y !*>q:*> &>!*>&:*>#&+"ÿ&:*>1&p"ÿ&:*>?&k$ÿ&:^:ҿ&:*>=O!& ^#VI"ÿ&ÿ&͈"ÿ&>ÿ&͵"ÿ&#ÿ&T#ÿ&#ÿ&#ÿ&$ÿ&$ÿ&Q$ÿ&d$ÿ&W&]&`&f&o&u&{&&&&&&&!+>6)&)2->:^:&*->My (')2,>')2+>:+> '*+>M%('͕".>:^:('*.>DM*,>^%:+>&7','!0:6&H'='!0:6!"1:"7::!:'*:͗8"1:"7:. 9\ -u')29!hʦ':92h\͕6¦'\=45)2|29!:6*7:"1:!"9"9^ :_:/2^::!:!_:' ',':e (.e -'e>*2!:\d5I'}/B(}͉ͽ"d:`:d:͞8)͹(:v92\!0>6>!0>گ(h!0>҈(*0>&\ 6 å(:0>=O! *d:*0>&\ w:0><20>g(!!:6.e -¼(\W5/(!!:6.e -(\d5*d:"1>!_:6I'*1>"d:̈́d:8+s#rI(.: -)!:6!:6^ ͽ"d:`:d:͞8)/)*{:DM>fy ^%y !":y y *d:"4>#*4>"d:!3>6>!3>)h!3>ڶ):3>=O! *d:Ny û) y :3><23>Œ)*:"::)͸*9"q:̈́d:8+s#r5)!0:4~ (*6*1:#"1:*7:{z*!"1:/ *1:!>~26>xG:6>26>G )x{_ P*#B*>ɯ`iq#zV*COMPRLRSPSPROVLSYM!;>q*5:> :;>w*5:#"5:!3:͹8ڦ*>*3:DM\͔5!"5:!<>q:8>!<>28>:7><27>*!7>6*8>Mq*!8>6!=>q*=>Mq**A:#"A:!?>p+q*>>}O**>>|O*::+:o9+h,*p9"A::\:,+**V:DM**X:":!@>6::=!@>q+*@>&: N!: p9͞8j+*@>&: N͍+!@>47+:o9:o9HҌ+ -!C>q:C>¢+*X:"D>ó+*C>&:) ^#V"D>D>A:͞8+96D>A:͞8+*+*C>&f;) N#F͋4*C>&y:) >Ͷ8,:C>,*X:DM',,',|9A:͞8&,*A:"|9!G>p+q*F>"H>*C>&y:) F>8+!H>͹8g,*H>DM4O**H>"H>3,::=O!: N!: !y: 8*p9͗8"A>**A>DM**:o9,***p9DM*,*m9DM****:r9,*:DM*,*!J>6>!J> -*!J>4,*p9"A::\:(-ͦ-ͦ-ͦ-!L>6::=!L>|-*L>&: ~2K>u-*K>&:) A:͠8e-ͦ-J-:r-.u--!L>4--*p9*A>A:ͮ8ҕ-ͦ-|-:7>ʥ-ͦ-Õ-!O>q*O>Mͧ**A:#"A:M>A:͞8-ͦ-ù-ͦ-*K>&i:) ^#V"u:>u:ͫ8.ͥ*K>&:) 8"M>͹-ͺ"u:-*K>&<) N#F.*0< ~R.*0< DMd5*0< *0<##N#Fq#p].*0<##q#p2P>:P>ʤ.*K>&:) 8"M>"9:P>O>Ҙ."9͹-2P>c.>5:08>͔8ʾ.q*å.>*5:DM\͔5\v5:w9Z.. \": -.:e /.*o9&\8_* DMe - /:w9#/:w92\\B5:9 A/. ~9\ -9/!"5:}28>27>*ͥ.:x9Z^/. \": -f/.en* -v/:x9ʌ/:x92\\B5!"5:}2R>ͽ"d:`:d:͞8(0͹/H02DMv0 q*!Q>6h!Q>/:Q>=O! *d:Nq*:Q><2Q>/:R><2R>0 q* q*0 q*̈́d:8+s#râ/ q* q*ͥ.!S>q> !S>O0:S>0Oq*Z0:S> AOq*!T>q:T>O60:T>O60!V>p+q*U>|O[0*U>}O[0*9>!=8"W>*W>!=8!Y>s:h0:Y>2h\͕60\>645*W>!=8!|s2*9͗8"9>. \~9 -0:9 1*9>"9>\d5͍0C\͏5!Z>s*9>!=8C "9*9*|9s#r͍0C*Z>&\8DM\͔5:j2j\v5:9ҁ1*|9)8"|9:y9ZŠ1a9ҟ10ñ1g9ұ10!_>q.*[> :_>w*[> ~!`>q*[> :`>w*[> *[> ^#VN#FR* *[> 6*[>^#V!=8"b>?8!a>s1!a>P2*[> DMv5*a>M1*[> DM͕6P2*[> DML5*b>!=8MͲ1*[>  *[> ͞8ҍ2*[>  *[> N#Fq#p *[> ~ڮ2*[> DMB5 *[> 61*[> N#F*[> *[> N#F͔51!e>p+q*[> N#F*d>?8^8*[>q#p*[>*[> 8+*[>##q#p*[>*[> N#F^#V?8*[> s#r *[> N#F`i"h>*[> N#F `i"j>*h>"f>j>f>͞8ڐ3*f>+*[> ^#V\8DM2_2*f>"f>\3*[> ^#V*j>\8DM2*[>  *[> ͞8Ҿ31*[> N#F*[> *[> N#F͏5!n>s+p+q*[>l>͠84 *[> ~4_2*l>DM2ͦ3Ê4*[>##l>͞8Ҋ4 *[> ~34_2*l>DM2:n>j4*[>  *[> N#FPY͹8d463g4ͦ3Ê4*[>  *[> ͞8҇41Ê4ͦ3!p>p+q*o>"[>!s>s+p+q*q>DM3*[> ^#V"]>*[> N#F*q>?8*]>:s>w *[> 6!u>p+q*t>DM3*[> ^#V"]>*[> N#F*t>?8*]>~   +5{>.+55OͲ5w66ͩ6́5;6<566́5͕6<>́5͕6<>645͜6<H66! w #ˆ5>Ö5>2,6""6"$6yo`"&6!"*6͋6-66*&6|6 "&6*"6MD6*$6DM:,65ͷ6g666Ͱ66**6|6U6*$645*"6""6**6#"*6ú56**6ABORTED$NO SPACE$NO FILE: $CANNOT CLOSE$DISK READ ERROR: $DISK WRITE ERROR$YYYP   YP6YPYPYPYPYPYP Ͳ ò!>6#6͐6">*>|$7>9ͫ8"|>##*|> ~!7!>6D7*>|?7!>66"|>D7!>6:>Y7!~>6#6#6Å7*|>~2~>*|> ~2>:>z7:>2>*|> ~2>!>6>!>ڰ7*>&v> ~/*>&: w!>4‹7:72"g:^ *:"|> *g:":*9My *9My *9My *~>My *>My *>My *|>":i`N#Fog_og_{ozg_ogDM!>))덑o|gV8 =D8DM!>))k8 =c8_{ozg^#V) ~8^#V|g}o ˆ8_{ozgi`N#Fogo&og_{_z#W LINK 1.31 $01/04/83?MEMRY$MEMRYX MEMORY OVERFLOW, USE [A] SWITCH$INSUFFICIENT MEMORY$OVERLAPPING SEGMENTS$ XXABS $$$XXPROG $$$XXDATA $$$XXCOMM $$$::;7;YYABS $$$YYPROG $$$YYDATA $$$YYCOMM $$$n;;;;INDEX ERROR$MULTIPLE DEFINITION: $MAIN MODULE ERROR$FIRST COMMON NOT LARGEST$COMMON ERROR$UNRECOGNIZED ITEM $1TdCP/M Version 3.0COPYRIGHT 1982, DIGITAL RESEARCH1512826543210123456789ABCDEF ERROR: $Reading file: $Writing file: $Directory full$Reading file: $Writing file: $Invalid drive.$) ? $) ? $) ? $Bad character, re-enter $ $ Disk read error: $File cannot fit into GENCPM buffer: $Unable to open: $BDOS3 BIOS3 Setting up directory hash tables: $ Enable hashing for drive $: $Unable to allocate space for hash table.$ Setting up Allocation vector for drive $ Setting up Checksum vector for drive $ *** Bank 1 and Common are not included *** *** in the memory segment table. *** $Number of memory segments $ CP/M 3 Base,size,bank ($) $ Enter memory segment table: $ Base,size,bank $Zero length segment not allowed.$Bank one not allowed.$ ERROR: Memory conflict - segment trimmed. $Memory conflict - cannot trim segment.$ ERROR: Memory conflict - segment trimmed. $ ERROR: Memory conflict - segment trimmed. $ CP/M 3 Sys $ Memseg No. $ Bank $ Accept new memory segment table entries $Default entries are shown in (parens). Default base is Hex, precede entry with # for decimal $ Use GENCPM.DAT for defaults $Create a new GENCPM.DAT file $Display Load Map at Cold Boot $Number of console columns $Number of lines in console page $Backspace echoes erased character $Rubout echoes erased character $Initial default drive ($:) ? $Top page of memory $Bank switched memory $Common memory base page $Long error messages $Double allocation vectors $Accept new system definition $ CP/M 3.0 System Generation Copyright (C) 1982, Digital Research $ BNKBIOS3 SPR$BIOS3 SPR$BNKBIOS3 SPR$BDOS3 SPR$RESBDOS3 SPR$BNKBDOS3 SPR$ 64K TPA Copyright (C) 1982, Digital Research *** CP/M 3.0 SYSTEM GENERATION DONE ***$!Tq:UM*T&!Tp+q:Ud*T !Tp+q*T#6:UҀ:Tڀ*T *T#N! *T6 7 7!Tr+s+q+q!U6N*TDMN:TTN͜:T.:T/!U!]6 !m6 !Tp+q *T 6 *T 6*T!Tp+q*T!Tp+q*T!Tp+q*T] ͧ!Tp+q*T} ͧ!Tp+q*T ͧ *T 6!Tp+q*T!Tp+q*T! ͧ!Tp+q*T" ͧ!Up+q*T$!Vr+s+p+q+q:V *V*VDM*V -- !Vs+p+q:VJ *V*VM!VLS!Vq:V e > :Va/>z!V/H҄ :V_2V:V!Vq:V/>!V/HҦ >ͧ>!Vp+q(7*V~ Y7 N7NTe:T *TMV Y*Vw!Vq:VO! N7:VO! N7!Vp+q 7*V|O *V}O H7!Vq*V&+SDM$ !Vp+q!V6!V60!'"V>V͇S† *VM7 !V6>!V VVzSڽ !V6:V<2VVVzS+s#rÔ :V *VM7!V60*V! S"V:V<2V‹ !Vs+q(7:V  #7*V&DMZ  *VM N!Vs+p+q+p+q :T: ͜*V6:V<2VO!T NV 2V  :V,u *V#"V*V6!V6 :V#… !V6  :V02V:V> !VHҽ >!VҸ :V2Vý !V6!V:V *V^*V&+S*V& *Vq !V6*V6ͧ *V6? ͜*VDMN*V~  (7*VN !V6>!Vn *V#"V:V:-Q/HX *V6d ,7*VN :V<2V, *V++"VNÊ *VN*V !V6!V6Te!Vr+s+q:-Q/Ү >!V6#q#p!V6:5Q!Vڳ*V&+SFQ  VzSک:VM*V&+SFQ  ~*V&+SFQ  VzSHJ:V2V*V&+SFQ  ^#V"Vé*V&+SFQ  ~*V&+SFQ  VzSHҩ:V2V*V&+SFQ  ^#V"V:V<2V¿ :V:VH`!V6:5Q!V`*V&+SFQ  VzS/*V&+SFQ  ~H*V&+SFQ  VzSHV:V2V*V&+SFQ  ^#V"V:V<2V:V!$V6!U6ͬ#Q$!H> U͇Sʔ* U|2Uß*U|2U!U:.Q2T*U|!UO:/Q2T*U|O:T2TUTI:-Q/!$V>O:T2T* U|O:T!$V2T:T=2T* U|O:T2TҮ:-Qқ*nV*U*V |!UO:/Q2T*U|O:T2T2Uͬ:U/Ҙ!!V6>!!Vژ*!V&$SQ  6:!V<2!Vsà!U6:V/ҫ*:U2T:T2TTͩ:-Q*T&+SDM*U*T&+SDM*U:-Q/'"X#";"!@*"!a#=X#";"!"Z#!Z#"}O *X#*"DM:"2W#"Ϳ :{#:{#n" :a#҇*x#&"*X#"X#!W#:":"րHҦ!"6" n /2k#:a#/!c#" "j !h#6!i#6*X#*"6*Z#*X#"X#![$q:[$ !"4>!$:$!":$1*[$&*S#M! ^#V*[$M̈́ø*[$&ø*[$&ø*[$&ø"_#;"ڄ *_#$ :[$w*_##"_#øg*[$&øAKYgu!\$q:\$ *\$M:$*\$M:"2]$!$:]$!$:]$2]$!]$:$w>!]$!]$5 :\$ (!"6!^$q:^$!$wF ͹O:^$0O͹!_$q:_$O):_$O)!`$6:$2$:$'2$:$'2$:$'2$*$MP*$MP*$MP:$¿:͹ ͹ ͹!a$q:$:a$ :n#9:a$ :a$H9:$2b$(:b$!b$6<:"<2"!b$(!"6 ͹>!$4k!n#6:a$ F!"6*a$M͹:a$ Z!n#6!c$q:c$a/>z!c$/H~:c$_2c$:c$!d$q:d$A/>Z!d$/Hҥ:d$ 2d$:d$!f$6*"M!N ^#Vͥ `"]#;" :e#/!b#!"X#]#@" *_#"X#*]#*"~2e$*]##"]#`5!f$62e$`2e$`̀2e$`"5E:f$ҕ:$Ҁ:o#<2o#2f$Ë:e$ 2f$:f$ҕN :$Ҥ:e$2e$:$ҳ*e$M[: $*e$M͂:e$>!":"=2"> >>!"!"5+N!~# ~2g$!"4ͩ2g$ >>!$;*$Mk8:$2"!$6:"<2"!"6g>!$c*$Mk\!$6!"6> :g$g:g$!h$q:"!h$wO!~# ~2i$—*h$&~# :g$w>!g$:i$¨!"4í!"6>2p#:$X#]#;"!i#:p#!o$62j$:j$::j$:o$" *j$M2j$2j$2l$:j$2k$2j$!l$w:l$D!o$6I!o$6: $!o$x:j$::j$Hu2j$T:*k$M*j$M:l$2m$"p$2n$:l$ʲ!l$52k$Ý" 2j$:j$0O> :j$0:j$AO>" :j$A 2j$OH!m$wO`i"">!$@ ͥ >!$N ͥ *_#}bO2 ͙ "j :{#" :y#:.#:$:{#Y:{#NH{͟O[2{#Ø:{#Yͺ"͢ ͺ:.#2.#:/#2/#%#V %#͢ %##( "0 :&#!r#2&#:'##2'#:(##2(#:)##2)#:-#2-#:.##2.#:/##2/#:0#20#%#V :$}͡ :"2"!"6"V :b#ڦ!$""K"!>1"""""$@""!>1"""""$ """_#;" !"X#:$/>X#H"H@>X#H"""!r$6>!r$@:r$"!*"~9:r$"!"X#!r$4:e#!f#2a#!i#6!b#6!l#6+6!s$6>!s$ڶ*s$&$ ~ʯ*s$&$ ~‘!a#6ï*s$&$ ~¯:e#!f#2b#!a#6!s$4b~:f#W:a#:i#:c#!i#*X#"_#:j#*X#"_# *_#"X#:k#!i# RG: $!$$5Ͱ5*p#M$:j#!c#G*_#"X#:e#QO͡ "  "ͩ 2{#n Hґ*""#:"2#!i#6:{#°*"#"">'"­!"4:{#*"!"">'"!"4" f:z#!"t$"x$͡ !h6\ !"v$:{#t$v$;"H6*v$#"v$͔ :{#]>x$H"R\ : $\ͺ*v$#"t$:{#_!#&#( &#"( f#!1#6!"6:/#/!$#: $>x$H"!{#6:{#Y:{#NH':$͟O[2{#!{#6Y*x$#"x$!g#6:{#Y! $#Aͺ!z$6> !z$e*z$&%# ~2{$ ^:z$ W.ͨ*{$Mͨ!z$4/:$p>͡ !"6?" :{#ʲ:{#_!# "( :"ڬ>͔ ~>!":R#!":%#HH :#<2#!}#> *#&~# N[2p# :p# H !}$p+q.*|$ 6 !p#6 #6:q#,T:q# A!p#6N:q#$N!p#6 ͒ )$*|$ 6,*|$ 6:"<*|$w*|$ :#w!~$6>!~$ڗ*~$&$ 6!~$4|!"6#6#6!q#6*p#Mc :q#ھ:p#*Ͳ ͒ 2p#ê:p#:¿:q#(*|$#~A<*|$wO>*p#Mc %:p#[ !#5.*|$ 6 ñ:q#1!$6#6> !$ڰ!$6:$<2$O>/:$!$O!J *$&*|$ H~G:$¡.*|$ :$w[œ !#5:$2$!$49:p#[¼ _ :q#!q#6+~. 2p#Oc  :q# :p#* Ͳ ͒ !q#6+~;= 2p#Oc = :q#$ *q#&$ *|$:p#w!q#4 :p#[H !#5.*|$ 6 *|$ 6å!$q!$6> !$ڏ *$&> :$ˆ >!$4l >:q#<2q#O*|$ :p#w:p#?± !d#6!$q!p#6?!$:q# ͒ û 2p#:p# :p#]H!:p#A2$O>!:p# !2p#!ͥ !:p#S:p#QHX!:#<2$2p#:p# HO!1!2p#Ü!2p#02$O> r!!$6Ü!2p#02$O> ڜ!*$&!*$& !$sr!*$&$ :$w:$!>!$ҿ!ͥ -*|$ :$w 2p#_og_{ozg_og^#V))) _{ozg^#V) "^#V|g}o "_{ozgO{ozgi`N#Fogo&og3*3͍t53> 2>+3 CON: = CRT:!3͞x53>> 5E3*D3&O3*N3& > 6*>Ͷm3*k3͍t3> 7>Ó3 LST: = LPT:!3͞xK4>Ͷç3*3͍t3> 8>3 LST: = TTY:!3͞xK4>Ͷ3@*3͍t4> 9>4 LST: = CRT:!3͞xK4>Ͷ4*4͍tK4> @>A4 LST: = UL1:!54͞xK4>> D*чv> E*Ӈv> Gw4 *v4&Á4*4& > H>æ4 CON: = CRT:!4͞x> P*ч> Q*Ӈ> S> S> T>M~2 > U* >Ͷ*ˇ͍tŠ:> V> W* >Ͷ#5*!5͍t5> X> Y?5 *>5&I5*H5& > `>n5 CON: = CRT:!b5͞x> a}7>ͶÉ5*5͍t5> b> cå5 *5&ï5*5& > d>5 CON: = TTY:!5͞x> e}7>Ͷ5*5͍tK6> f> g 6* 6&6*6& > h>:6 LST: = LPT:!.6͞x> i}7>ͶU6*S6͍t±6> p> qq6*p6&{6*z6& > r>à6 LST: = TTY:!6͞x> s}7>Ͷû6*6͍t7> t> u6*6&6*6& > v>7 LST: = CRT:!6͞x> w}7>Ͷ!7*7͍t}7> x> y=7*<7&G7*F7& > >l7 LST: = UL1:!`7͞x> }7>> * *Istʵ7> æ7*7>! 7> 7* *7ys>! > *чv> *Ӈv> * >Ͷ8*8͍ta8> > !8 * 8&+8**8& > >P8 CON: = CRT:!D8͞x> _:>Ͷk8*i8͍t8> > Ç8 *8&Ñ8*8& > >ö8 CON: = TTY:!8͞x> _:>Ͷ8*8͍t-9> > 8*8&8*8& > >9 LST: = LPT:!9͞x> _:>Ͷ79*59͍t“9> > S9*R9&]9*\9& > >Â9 LST: = TTY:!v9͞x> _:>ͶÝ9*9͍t9> > ù9*9&9*9& > >9 LST: = CRT:!9͞x> _:>Ͷ:*:͍t_:>  > :*:&):*(:& > >N: LST: = UL1:!B:͞x> _:>> *Ӈ> *ч> ù=>Ͷ*χ͍t¹=> > * >Ͷõ:*:͍t:> :*:>!;>Ͷ:*:͍t ;>  :*:>!;>Ͷ;*;͍t8;> !);*';>!;>ͶB;*@;͍tg;> "X;*V;>!;>Ͷq;*o;͍t–;> #Ç;@*;>!;>Ͷà;*;͍t;> $ö;*;>!;>> ';*;&; *;& > (*>Ͷ;*;͍t-<> )>#< CON: = TTY:!<͞xg<>Ͷ7<*5<͍tg<> 0>]< CON: = CRT:!Q<͞xg<>> 3w<*v<&Á<*<& > 4*>Ͷß<*<͍t<> 5>< LST: = LPT:!<͞x}=>Ͷ<*<͍t => 6>< LST: = TTY:!<͞x}=>Ͷ=@*=͍tC=> 7>9= LST: = CRT:!-=͞x}=>ͶM=*K=͍t}=> 8>s= LST: = UL1:!g=͞x}=>> A*!w%**ysrr2>> Bù=>> D=X=x* *=&st* *=&stst4> F>2؃> G*Շv> H> QA%!>2> R=>**<>&s#um>> R>f>ERROR!`>͞x> Sx>|>**w>&st**{>&stst>> S>ú>CTR-!>͞x>@**>ysr͞x> T>**>&s#u?> T> ? ESC !?͞x> U?**?&s#uM?> U>F? FS !@?͞x> VX?**W?&s#uʈ?> V>Á? GS !{?͞x> WÓ?**?&s#u?> W>ü? RS !?͞x> X?**?&s#u?> X>? US !?͞x> Y @ **@&s#u9@> Y>2@SPACE!,@͞x> `D@!H@~**C@&st**G@&ststʟ@> `>Ä@ !@͞x*̀xØ@ !@͞x> aê@**@&s#u@> a>@ DEL !@͞x> b@**@&s#uA> bɀ3PUT 1$CP/M Version 3.0COPYRIGHT 1982, DIGITAL RESEARCH151282654321WARNING: $OUTPUT~TO~FILE~CONSOLE~CONOUT:~AUXILIARY~AUXOUT:~END~CON:~AUX:~LIST~LST:~PRINTER~INPUT )15:?DIQVNOT~ECHO~RAW~FILTERED~SYSTEM~PROGRAM $[]=, ./;Error at the '^': $Error at end of line: $Invalid option or modifier$End of line expected$Invalid file specification$Invalid command$Invalid delimiter$File is Read Only$ (Y/N)? $PUT aborted$Enter Password: $Putting $list$console$ input to $ output to $file: $ Do you want another file$File already exists; Delete it$PUT completed for $printer$console$Requires CP/M 3.0$CP/M 3 PUT Version 3.0 $Put console output to a file$ Enter file: $1$1$n}0n|H 7/ң777G2*͵ !6 **& 6/[!&6:*!&ڋ*&& N *&& w:&<2&`!"':*2)".͉!&6*&& ~ :&<2&è!"'+~2)*&& ".!06!260Z:0:0H:0 Hғ!860Z:090Z:0N0Z:0a*.DM͉Ð:0:0H:0 Hҋ)Ð :0 :0 H:0 H@!86#6!,6+60Z:00Z:00Z:0*.DM͉:0 :0 H:0 H8)= :0:0H:0 H:2 r)0Z:0—0Zÿ:0¿!86#6#6!,6+60Z:00Z:0*.DM͉:0:0H:0 H) v!Hq*H&!Jp+q*I !Ms+p+q*K:Mw#6*K *K#"KN#Fy  !Op+q*N!Qp+q*P!Sp+q*R!Tq*T&-!Uq:U24!5641!Ws+q:V24!56*W&"641!Yp+q*X<m![p+q*Zm!\q!]6*]& >>*]& :\R:]!]4,!cr+s+p+q+p+q:2 t͙ !j6 *b~*b~2j*gM#22!n6:2 :nڳ*gM#22Þ :d21= :d212m*b~2k!n6*b~2j *b~Y *bN! *`*` =2l!mM !n6!e6:m!eJ :nC !e4, P *b6= *b:kw:1.r+s#r͙ :2ʃ *.#".È !26:j2oO*` ~2f*f&*^: !o4*b:ow*f&*^:g *o&*`~2fÚ *b6*.~2g͉ :f2h!d6*.#~2g!h4N*^ :3 !n6- *h&*^:g- !n6!d4N*. ~2g*d&*.~2g*gM#22:2> !2H҆ !d4N*. ~2g*gM#22U :d21.r#+s#r*.N#22!)´ *.#".Ù   !ss+q+p+q:s=2s *p:rw*p#"p !tq!}6*'"y"{2%:%( !%6(*)&*%&!ws*)&́!xs:ts :t:tH\ *.+".s :ts :1.͵++s#r͵ !u6:w!uڙ *y"{*%M !u4{ *xM :}Ұ *7ö =7:%A ͵ *tM! ^#VT7 o7 7 7 7 7 !~q!v6:~!vD *yN*y#"y!v4% ͵ !v6:~!vڃ *{.͸p !}6^u  *{#"{!v4L ͵ !p+q*DM772͵ :y:YH 7!q:a :{ : :.O 2:͵ ͵ 7@ !6>!څ 2 4 *&@ :w: = :H  :n :[  :=2O!@ 6  :~ !4 7:8 7ã 7:8´ 7ú 7!p+q0 ͵ &7*~ *~@O:!6> !,: .*&*~ %*&*N!4 ,">͵r*++"~[+"r7͆ *DMͻ -͇ Ͱ@͠:@ ʍ:b2b\͐"*}*|27H͇ \̀"*}*|2 : ͵ Ͱ\̀"Ͱ:@ :b2b\͐"Ͱ͆ \ͻ 8̈́:2 :2HF ,">͞u+"g7*DMͻ ͵ F͆ :8‰z7Ï7:2:2 H҈!60Z:0!60Z:0:0H :0:!96!96:01:,!:61!:6:0M:H!:6M!:6:0i:d!;6i!;6:0…:Ҁ!;6Å!;6Ø!p+q*"<!\"><7"ͭ¼*<". .@l ->͵-*#".*~[ ͘-!p+q*~ *~ H'*#"*~3>>!`i^#V#~#fot2XywÉG:†xAa{m_ ʀ ʀt`i~•2F2G#~2H#~2I#~2N*| !\~=w4_P 12O'"&###~2M:G 9!!<1>27>2"> 2#!H:FH!I1>27>t2">2#2H*&.~@!"J<V<W^#V###*#*~~*&.~‡>28í.h"5~ʗ>286!:"o".~>286!N#F*#*#",^q#Vp"*#N#F*#"3^q#Vp"14!&L1 \\:8«X !86>_ 1/:~# y1p   %co %c WARNING: Cannot redirect from BIOS $ ERROR: Auxiliary device redirection not implemented $ ERROR: Insufficient Memory $ ERROR: You cannot PUT INPUT to a file when using GET or SUBMIT. $z K   %coSYSOUT $$$_ogDM!>))덑o|gҘ =†_{ozgi`N#Fogo&og~4PUT :ʜ4Y:O>52:[y<jbj%j:!F#fh!~}#$ 151282 COPYR '82 DRI ggggggggggggggggggggggggggggggggBD$H$$I! D $DA HH$@ H!@D! A ((F#fh!:~!«!>w~:!5*.~w:; :~!9"1W:.~ !n>  ]* ]&] ]*]&*'*]&ͅsys >  >L]-------!D]͞xMn>  ![Ur>  r]*p]>!'%2*%Î]!]>>  >è]í]**#*ms*]ͅsys*'ys*]ms!w%M~2w>  ]*]&]!^*]&*'*]&ͅsys >  %^*^**#*ms*#^ͅsys*'ys*(^ms!w">>  !]Ur>  >  y^1*!*x^&s#u^>  >  >*#!w%M~2w>  ^*^&^)*^& >  *#!w">>  >  ^X^x*!*^&st*!*^&ststʣV>  *Շv>  >2؃>  > ×a> > > > }> | Enter a '1' to set the write safe flag on, any other character to set it off. > >MN}M~2+Myn>  `1*+*`&s#u`>  > !*!w>!)> "*)* s>!)> #*!w%*)2>> $>ù`" Write safe flag is now ON.!`͞xMn> %ra> &> '*!w>!)> (*)*1 üCP/M Version 3.0COPYRIGHT 1982, DIGITAL RESEARCH151282654321 ERROR: Not renamed, $ ERROR: Drive read only.$Invalid wildcard.$ERROR: No such file to rename.$ Disk I/O.$Currently Opened.$Bad password.$file already exists$Enter password: $, delete (Y/N)?$ERROR: Invalid File. $Requires CP/M 3.0$Enter New Name: $ ERROR: Incorrect file specification. $Enter Old Name: $1 1 q"6 *6 }0*6 |H\7!" !\" " ͫ  " B ̈́ ùn7(G29 >!9 E7!6 *9 & ": )7*: DM(G29 )*: 6 *: #": *: 6=:9 : 2 #+s#r*: 6 !" !\" "  " B ʹ̈́  N o :\: ! :\o * ~2 J  . v! q* &! p+q*  ! s+p+q* : w*  * #" ~  ! p+q* ! p+q* ! p+q* ! p+q* ! q* &-! q: 2 ! 6 1! q: 2 ! 6 1&:U2!V!""V*!VM"V͟:!V2U! U6Û*U|!U2!V* U|!Uo&)##""V*T&+SDM*!V*!VM"V͟:!V2 U:U2!V!""V>T͇S+s#r*!VM"V͟:!V2U* U|!$V2T:T2T U(T(TͩC*$V&+ST͊S+s#r* U|!$V2!V:-Q/ *T&+SDM*!V"*T&+SDM*!V*!VM"V͟:!V!Uw:-QҢ!T6:T2TULTLTͩ*U|2!V*U|!Uo&)*"V""V*T&+SDM*!V*!VM"V͟:!V! Uw:,Q/Ҳ:V2V *V&U  :T2T*T&! S!0*V& U q*T&! S0*V&!U q:V 2V*T&+S"!U$-U RUW !T6#6#6:.Q2U:/Q2UTqT TyT Uͧ pT !T6Uͧ pT pT :;Rһ!;R6:%V2.Q:4Q/24QTT TT L!U6N!Vr+s+p+q*V6 *V#6 *V|O! *V## w*V|O! *V w*V}O! *V w*V}O! *V w!T:TO`iPSW "V*V :0Qw*V :2Qw*V :1Qw.*V :3Qw*V :4QwX*V   :+Q/ҼW*V >*V w:@*V wW*V >*V w^*V :/Qw!)X"V*VN#F!W "V*V"V*V͕S(!$V6-!$V6*VSD*VWR!"&V!V6&VS!V6>!Vڷ*V&)*&V>͒Sʭ*V&)*&VWR"(V*(V ͕Sʭ!V6:V<2Vf:-Q/!V!$V6!$V6V>X W*V"V*V~>>!Vs+p+q+p+q%N*VDMN 7*VDM$  7*VME :,QҨ *V&U *VDM :V 2V*V&U DM*V:V2V*V&U *V&+S:V2V*V&U ) :V2V!Vp+q*V"TͣN,ͧ*VDM !Vr+s+p+q*V^#V"T*V##^#V"T*V ^#V"T*V#DMT  *VDMT *TZSU͊S@?ͧ*T+ZS}<2V!V6!V:V҆*V&+SW "TDMͧ *VDM> :V<2VS*TDMO W*T"T!Vr+s+q:VGTqT TyT *Vn}2T*V#~2TpT WTS}pS}TR+s#r*V&)+!Vs+6:V!V4>T͇S+s#rBKͧ pT^ :V<2VpT *VT :-Q/k)Tw T z!LT"V!U"V͙!T"V!U"V͙!(T"V! U"V͙*V#DMT  *VDMT *VDMeͧWͧ *VDM> *V*Ws#r*V##*Ws#r*V *Ws#r*VDM> !V6&VS(>!V6>!V*V&)*&V>͒S*V&)*&VWR"(V *(V## *(V ͕S*(V ͕SH*(V ͕SH*(V ͕SH*(V ͕SH!V6:V<2V-:V!V6!V6!V6>!V*V&)*&VWR"(V*V&)*&V>͒S*(V S?!V6*(V ͕S:V/c!V6N:VO!=R ~2T *(V WR"*V**V N#F`i))"VN:VAO7N*V&6Q DMʹ ͜*V&6Q ~/*(V q#p:-Q/!V6*V&,V) *Vs#r*V*LV"LV*V͛ 2V'ͧ*V&+SFQ  *(V w*V&+SFQ N`iPS*V&+SFQ  N`iPS*V&+SFQ  ͕S *(V q#p*V&+SFQ  VzS*V&+SFQ  q#p:V<2V:-Q/!V!$V6:T<<2T:T<<2T!V6>!V8*V&NV) >w#6*V&pV) >w#6:V<2V:!Vڡ*V&)*&V>͒Sʗ*V&)*&VWR"(V *(V WR"*V*(V ͕SN:VAO7:7!V6**V ^#V!S*V&+S*V&NV) q#p*V&NV) nVR+s#r*(V ͕S—'N:VAO7:7!V6**V >R!S*V&pV) s#r*V&) VR+s#r **V R*V&pV) CS **V q#p:V<2Vk:Vҫ͜:T2FQ!T:/Q2GQ!"IQ!HQ6!V6ON:GR2T 5Q N*FQM ,7*GQM ,7*HQM N:V/҈!N!V6:5Q!V !V6:V/ :V =O!=R ~2T*V&+SFQ DM *V&+SFQ  N`iPS*V&+SFQ  q#p*V&+SFQ  ~ͧ *V&+SFQ  ~7ͧ *V&+SFQ ~2V*V&*V&+SFQ  N "V*V|*V}O:/QH҆MN!V:/Q*V&+SFQ  Hq!V:/QO`iPS*V&+SFQ  q#p *V}2V!V6!V6!V:V# *V&+SFQ ~2V*V&+SFQ  :V2V*V&+SFQ  *V&+SFQ  !V:V/+~!V/H+ |ͧ!V6 :V!V+~!VHc N*V&+SFQ :Vw!V6 :V!V+~!VH N!V:V*V&+SFQ  Hq!V:VO`iPS*V&+SFQ  q#p!V6:V<2V×1:V<2V"͜!V6:5Q!Vo!:V!N!N:V=O *V&+SFQ NE *V&+SFQ  NE :-Qb!N*V&+SFQ  N ͜:V<2V !T6!V6%NVʹ ͜PNT2V!TT TT N!V6Vʹ ͜:V!FT !!U6+6!W6͌!:W/җ#:R2T͜N;Rʹ :=R2T͜͜N,Qʹ ͜͜:>R2T:2Q<22Q  2Q :2Q=22Q:?R2T:1Q<21Q' 1Q :1Q=21Q:@R2THN3Qʹ ͜:AR2TkN4Qʹ ͜͜:BR2TN:0QAO7NTe:T"*TMV A2W*WM͈ /"Þ":W20Q͜͜:CR2T.Q *.Q&PS"U:DR2TN-Qʹ ͜:-Q/2T:-Q[#:ER2T/Q ͜:FR2TN+Qʹ ͜x#:R2T͜N!W#*W&U 6:W<2W#!W6>!W $*W&U 6$:W<2W#!V6*V&U  !V6TqT TyT Wͧ pT^ pT^ WS#ZS"U!W6>!Wڋ$*W&,V) >w#6:W<2Wh$!"LV:]A$!U6#6!W6>!W$*W&=R 6:W<2W¦$$!U6#6:mD$!U6!T6 Available space in 256 byte pages: $TPA =$, Bank 0 =$, Other banks =$Unable to allocate Dir deblocking buffer space.$Unable to allocate Data deblocking buffer space.$Unable to allocate Data deblocking buffer space.$Drive specified has not been defined. $0FFFFH is an invalid value in the DPH directory BCB address field.$ Setting up Blocking/Deblocking buffers: $ The physical record size is$: $ *** Directory buffer required *** *** and allocated for drive $: *** $ Overlay Directory buffer for drive $: $ Number of directory buffers for drive $: $Minumum number of buffers is 1. $ Number of directory buffers for drive $: $ *** Maximum number of directory buffers *** *** for the current drive is$. *** *** Number of directory buffers reduced *** *** accordingly. *** $ Share buffer(s) with which drive ($:) ? $ *** Data buffer required and *** *** allocated for drive $: *** $ Overlay Data buffer for drive $: $ Number of data buffers for drive $: $Minumum number of buffers is 1. $ Number of data buffers for drive $: $ Share buffer(s) with which drive ($:) ? $ Allocate buffers outside of Common $ Accept new buffer definitions $!W6>!W**W&)*&V>͒S**W&)*&VWR"(V ͕S*(V ͕SHҸ* *(V WR"*V**V ^6 *W&$SQ q#p*W&$SQ  6*(V ͕S*%ͧ!W4*!W6>!W+!"HW}2W>!W=+*W&$SQ HW|S ~H6+*W&$SQ ^#V"HW!W4**W&))lW *HWs#r*W&))  >w#6!W6>!W+*W&$SQ HW|S>͇SH+*W&))lW  *W6 DS+s#r*W&$SQ  6!W4h+!W4*!W6>!W7,*W&+SFQ  *W&W) N#Fq#p*W&+SFQ  *W&7W w!W4+:-QF,!fW6K,!fW6 !W6:W4:fW=2iW!"gW"dW}2 W! W6*T&PS*LViS"bW:-Qڞ,nVbWzS*ViS"bW!W6>!W,*W&W) *W&+SKQ  N#Fq#p*W&$SQ  6!W4£,!W6! W6#6!W6n&))lW  ^#V"JW*W&))lW >͒S:WH3:WE-1&N!W6]&N*W&))lW N#F$ {&N!W6>JWR>fS:WHҚ-!JWVS+s#r!W4g-!JWVS+s#r:W3*W&)*&VWR"(V WR"*V >RZS"^W **V ͕S-!W6-!W6*(V ͕Sc0bB*W&$SQ  >w:-Q.: Wd.! W6*W&$SQ  6&N:WAO7&N.:W{O!=R ~2T&N:WAO7'N*W&$SQ  DMʹ ͜*W&$SQ  ~.*W&$SQ  6.*W&$SQ  6t/:W;O!=R ~2T'N:WAO7>'*W&$SQ  DM  : Wt/! W6*W&$SQ  ~t/A'ͧb'N:WAO7'*W&$SQ  DM  &/*W&$SQ  ~^W͇Sҹ/'N*^WDM$ 'N*W&$SQ  *^Ws*W&$SQ  ~R0:W[O!=R ~2TM(N*W&$SQ  ~AO7(NTe:TL0*TMV A2 W* WM͈ *0/* WMF80/*W&$SQ  : Ww͜c0*WMTCc0 4*(V ͕Sn3!W6*W&$SQ >͒S°0*(V q#p*W&$SQ  6n3bB*W&$SQ  >w:-Qګ1: W1:W1! W6!W6*W&$SQ  6(N:WAO7(N1: W1!W6! W6:Wʨ1:WƋO!=R ~2T(N:WAO7)N*W&$SQ  DMʹ ͜*W&$SQ  ~ґ1*W&$SQ  6è1*W&$SQ  6! W6S2:WKO!=R ~2T)N:WAO76)*W&$SQ  DM  *W&$SQ  >w: WS2! W6*W&$SQ  ~S29)ͧZ)N:WAO7)*W&$SQ  DM  2*W&$SQ  ~$3: WҌ2! W6*W&$SQ  :Ww 3:WkO!=R ~2T)N*W&$SQ  ~AO7)NTe:T 3*TMV A2 W* WM͈ 2Ü2* WMF2Ü2*W&$SQ  : Ww͜*W&$SQ  :Wwn3:U!W]3:W+O!=R ~2T)N*W&$SQ  DMʹ ͜*WMTCn3 4! W6*W6 dWDS+s#r!W4>JWR>fS:WHҿ3!JWVS+s#r!W4Ì3!JWVS+s#rç-!W4n&))lW  ^#V"JW-!T6!W6:W 4bB)NWʹ ͜P,!"PW}2Wo&"TW2W>!Wu5*W&$SQ  ~n5*W&$SQ  ~ >Hһ4:-Q|4!W4á4*W&$SQ !^N#F-S*TW"TW*W&$SQ  ^*PW"PW*W&$SQ  ~ >Hn5:-Q/5!W4*W&$SQ  ~,5*W&$SQ !^N#F-S*TW"TWT5*W&$SQ !^N#F-S*TW"TW*W&$SQ  ^*PW"PW!W4#4*fW&*PW+S*W&) "RW:-Q9W*U"jW*RW*U*TW *LV *V *nV |O:.QO:T2UO:T2T:T2T:T2T|2U!T2.QW"T*T&PS*U "ZW*RW "VW*T"`W*`WW !T͕SC6*`WW 6*`W#"`W6!W6n&))lW  ^#V"JW*W&))lW >͒S:WH9!W6>JWR>fS:WHҶ6!JWVS+s#r!W4Ã6!JWVS+s#r:W8*W&)*&VWR"(V*W&$SQ  >«7*W&$SQ  ~h7*jW6 *jW *VWs#r*W&$SQ VWR+s#r*(V *ZWs#r:fWZWR+s#r:fWjWR+s#rë7*(V"LW*W&$SQ  n&)*&VWR"(V ^#V"NW*LW"(V *NWs#r*W&$SQ  >£8*W&$SQ  ~48*jW6 *jW *VWs#r*W&$SQ VWR+s#r*(V *ZWs#r:fWZWR+s#r:fWjWR+s#rã8*(V"LW*W&$SQ  >o&)*&VWR"(V!Q  >ʂ8*(V ^#V"NWÐ8*(V ^#V"NW*LW"(V *NWs#r!W4>JWR>fS:WH8!JWVS+s#r!W4ç8!JWVS+s#r6!W4n&))lW  ^#V"JW\6!W6>!Wc9*W&,V) >͒S\9*W&)*&VWR"(V *VWs#r*W&,V) VWR+s#r!W4 9!W6>!W9*W&)*&VWR"(V*W&NV) >͒Sʽ9*(V *VWs#r*W&NV) VWR+s#r*W&pV) >͒S9*(V *VWs#r*W&pV) VWR+s#r!W4h9aB!W6>!W::*W&W) *W&+SFQ  N#Fq#p!W4:*V*RW*nV "RW> U͇SUzSH҇:*TW*U|O:.QO:T2Uá:*TW* U|O:.QO:T2U!U:T2T:T2T:T2T:.Q2.Q* U}pS} URU͊S"`W> U͇SUzSHB;*RW|O:/Q2T*U}pS}URW"\W*T&PS"XW*T&PS*U "VWÇ;*RW*`W|O:/Q2TW*U"\WO`iPS*`W "XW*T&PS* U "VW*RW*\W"T*U|O:T2T*W&)*\W"jW*XW"ZWWTS"U*T"`W*`WW !T͕S;*`WW 6*`W#"`W;!W6!W6!W6:5Q!WS<*W&+SFQ  2W!FQ  ~:W!WHL<:W2W:W2W!W4;:T2FQ!T:/Q2GQ:W<*W&+SFQ  O:T<*W&+SFQ  N`iPS!͕S"`W!FQ :T w*W&+SFQ  N`iPS*`WiS!q#p!W6n&))lW  ^#V"JW*W&))lW >͒S:WHғA!W6>JWR>fS:WHh=!JWVS+s#r!W45=!JWVS+s#r:WxA*W&)*&VWR"(V*W&$SQ  >0?*W&$SQ  ~>*(V"LW*W&$SQ  n&)*&VWR"(V ^#V"NW*LW"(V *NWs#r0?*\W*ZWs#r*(V *XWs#r*XW##"XW*\W##"\W!W6*W&$SQ  ~!W ?*W&$SQ ^#V͛ 2W*jW6*W&+SFQ N`iPS!N`iPS!͕S  *jW q#p *jW 6*W&+SFQ  *W&$SQ |S+s#r:fWZWR+s#r *jW s#r:fWjWR+s#r!W46>:fWjW͇S+s#r! >w#6:fWjWR+s#r*W&$SQ  >1A*W&$SQ  ~¤?*(V"LW*W&$SQ  n&)*&VWR"(V ^#V"NW*LW"(V *NWs#r1A*\W*ZWs#r*(V *XWs#r*XW##"XW*\W##"\W!W6*W&$SQ  ~!W A*W&$SQ  ~ҩ@*W&$SQ ^#V͛ 2W*jW6*W&+SFQ N`iPS!N`iPS!͕S  *jW q#p*W&+SFQ   *jW w*W&+SFQ  *W&$SQ |S+s#r@*jW6 *jW *VWs#r*W&$SQ VWR+s#r *jW 6:fWZWR+s#r *jW s#r:fWjWR+s#r!W4?:fWjW͇S+s#r! >w#6:fWjWR+s#r!W4>JWR>fS:WHhA!JWVS+s#r!W45A!JWVS+s#ru=!W4n&))lW  ^#V"JW=!W6>!WA*W&7W *W&+SFQ  w!W4˜A!W6>!WaB*W&)*&VWR"(V*W&NV) >͒S"B*(V *ZWs#r*W&NV) ZWR+s#r*W&pV) >͒SZB*(V *ZWs#r*W&pV) ZWR+s#r!W4A!"W"W!W6:5Q!WB*W&+SFQ  ~¶B*W&+SFQ  VS*W"WB*W&+SFQ  VS*W"W!W4pB$N%N!bWVSDM$ :-QMC%N*WDM$ :U C$%N*WDM$ >W͇S>W͇SHHC!W6MC!W6͜͜!Ws+q*W&$SQ ^#V"W:-QڋC:fWWRbW͊S+s#rF!iW55:W®D*W&$SQ  ~2W!W6:W!WګD!fW:iWYD!iW6*gW#"gW!W6!W6!W6:5Q!W7D*W&+SFQ  2W!FQ  ~:W!WH0D:W2W:W2W!W4C*W&+SFQ  S+s#rcD!fW:iW2iW*W͛ 2W…D4%ͧ>äD*W&+SFQ  WzS+s#r!W4±CF*W&$SQ  ~2W!W6:W!WF!fW:iWoE!iW6*gW#"gW!W6!W6!W6:5Q!WME*W&+SFQ  2W!FQ  ~:W!WHFE:W2W:W2W!W4D*W&+SFQ  S+s#ryE!fW:iW2iW*W&$SQ  ~ڼEWbWzS+s#rYS:/QpSҹEd%ͧ>E*W͛ 2WE%ͧ>E*W&+SFQ  WzS+s#r!W4D>!Wq*W6 dWR>fS'F>%ͧ>ERROR: $ at line $Missing parameter variable$Equals (=) delimiter missing$Invalid drive ignored$Invalid character$Invalid parameter variable$!"WWͧ !W6!W6:W GG:WG͈K2W:WFIGF GF!Wr+s+q:U2W!U65FN*WDMN>FN*WDMZ :WCG.͜:W2U:WoG!W6TlG!W6sG!W4MG*W&W ~2W:W :W H:W HG:W ·G*W#"WMG*W&W ~2WÄG:Wa/>z!W/HG:W_2W:WG!W6:W!W6:W/:W/HI!W6>!W/H*W&W 6 !W4HtG2W!W6:W:W=H:W H:W/H~H*W&W :WwtG2W!W4:H:W=:W H:W/HҧHtG2W~H:W I:W=>!WHH!W6 I:W=HHF GH:WHcF G:W :W/H ItG2WHGtG2W!W6!T:W:W H:W/H[I*W&T :Ww!W4~`i+wtG2WI:W :W/HxItG2W[I!W6#6>!W҇K *W&+S P  ^#V"W! P  ~2WJ:WI:WA2WI:W0/>9!W/HI:W02WI:WA 2W *W&+S P  ^*W&+S*W"W*W&T ~?[J *W&+S P  :WO!=R 6!U6!W4!T5>!T҇K:WʧJ*W&T ~A/>P/HҜJ*W&T ~A*WwäJF GÇK:WJ*W&T ~Y*WwÇK!W6*W6!W6:T=!WڇK:W!WO!T ~2W, K*W#"W6!W6ÀK:W#K!W6 ÀK:W02W:W> !WHQK>!WLK:W2WQK!W6!W:WxK*W^*W&+S*W& sÀKF G!W4J!W6!W6:W:W/HK!W6:W *W&+S P *W& *W&W HK!W4éK:WK!W6K!W4ÒK:WL>:WWͧ T. T~ !W6!W6>!WN!W6#n& +S P  ~2W!W6:W:W/H N!W6>!WڞL'N *W&+S P *W& *W&W w!W4gL:W°L!W6L:WL:WA*W&W wL:W L:W0*W&W wL:WA *W&W w'N*W&W 6 'N*W&W 6='N*W&W 6  *W&+S P  !^*W&+SR"W:WmM'N*W~A*W&W wM:WʞM'N*W~ҐM*W&W 6YÛM*W&W 6NM*WNbN:WM'N*W&W 6,*W#"W*WNbN'N*W&W 6,*W#"W*WNbN'N*W&W 6 'N*W&W 6 !W4PL!W4'L>!W NT^ T :W]NT^ !W6>!WUN*W&W 6!W4:N!W6aN!W4!Wq'N:WO! *W&W w'N:WO! *W&W wO*TDM}oN*T†O]!O> 2 PW:TgxʀO { O: PO*T!O†O~#o}o|O<O:TzO<.O:TƜzO<8O:TzO:TzO:TotOzO:TgN!|!|PRTMSG ,QPAGWID 2QPAGLEN 1QBACKSPC 3QRUBOUT 4QBOOTDRV 0QMEMTOP .QBNKSWT -QCOMBAS /QLERROR  +QNUMSEGS  5QMEMSEG00 KQHASHDRVA6QALTBNKSA +QNDIRRECA ;QNDTARECA KQODIRDRVA [QODTADRVA kQOVLYDIRA {QOVLYDTAA QCRDATAF ;RDBLALV ))덑o|gS =S^#V))) DM!>)):S =2S_og^#V) PS^#V|g}o ZS_{ozgO{ozgi`N#Fogo&og_{_z#WBNKBIOS3SPRRESBDOS3SPRBNKBDOS3SPRCPM3 SYSGENCPM DAT . $! r+s+q: 2 ! 6* #s#r 1 ' '! s+q+p+q: =2 ^* : w* #" A! q: y7: 7: ¥7: ³7: 7: 7: 7: 7! p+q! 6> ! -: .'* &* >O'! 4! p+q.* * DM -E ͳ* DMͣ" * }‹* |2 : ҇* M_: >! q: aڨ: {Ҩ: : )#7  4! 6>! CO͎2 * & : w: )C: õ: ): õ: =2 O! 6 : 9: <2 h2 ! 6+6> ! ڠ* & ~?–* &* ~?ʑ77Ö! 6: <2 R: ! p+q* : w!! 6> !! *! & ~?*! &* *! &*  w:! <2! ¶ͳ z2# _:# M :# o&"$ E"& G"( I"* ", ". "0 *$ DMͤ*$ DM.2" Ÿ* DMN 47O͎Yœ* DM͓*$ DM.2" ß:" ½*$ DMN ͬ*$ DM.2" :" *$ DMN )* DM='*$ DMͳ*& E*( G** I*, *. *0 !(  Y D .*(  -< ͊2# !3 p+q7*2 DM '*" M_7D7* #" ! "  " .  -¢ !5 p+q*4 ~ *4 ~ H *4 #"4 ñ *4 ~ >>!`i^#V#~#fo"  yˆ w7 G:4 xAڈ ҈ a{ _È  . . " _og_{ozgi`N#Fog_{_z#W*1o:*1[:{*/4^4@_!~#s4aĜ2!5_Ĝ!~+w*.+6.inate. > (ͱ> )> 2> 4> 6R> 8Jm*Hm> 9*ͤ> A*% > B*ۇͦ > C' > E*% > F*݇ͦ > G' > I> Q> R> S > T>M~2ɇMyn> V*ɇ>Ͷmi*m&͍tn> W` ïo>Ͷ nI*n&͍t9n> X͕.ïo>ͶBnv*An&͍t[n> `ïo>ͶdnV*cn&͍t}n> a5Fïo>ͶÆnn*n&͍tŸn> c^ïo>ͶènN*n&͍tn> dRïo>Ͷnw*n&͍tn> fuïo>ͶnW*n&͍to> gT_ïo>Ͷop* o&͍t'o> iïo>Ͷ0oP*/o&͍tIo> p͡aïo>ͶRom*Qo&͍tko> rnïo>ͶtoM*so&͍to> s͚fïo>ͶÖox*o&͍t¯o> u͑kïo>> wÿoX*ɇ*o&s#uʼm> >M|Do you really want the requested changesMN}M~2ɇMyn> 0pY4py*ɇ*/p&st*ɇ*3p&stst`q> > *% > *ۇͦ > ͅ > *% > *݇ͦ > ͅ > > p*pͤ> ' > >q1Changes now recorded. They1CP/M Version 3.0COPYRIGHT 1982, DIGITAL RESEARCH151282654321TEMPORARY~ORDER~PAGE~DISPLAY~NO~COM~SUB~NOPAGE~NODISPLAY~ON~OFF  $(/9!6#6#6#6#6!"+~2*& "*& ~[”*#" â' :¢ V v!q*&!p+q*  !q:2!61!s+q:2!6*&"1!q!6*& ->*& :A:!4!r+s+p+q+p+q!6*~ʯ*~2*M2!6:¦:ڙé*M2Äùe:2#:22*~2!6*~2*~?*N! ** =2!3!6!6:!0:)!46*6#*:w:+s#r:i*#"n!6:2O* ~2*&*:ʿ!4*:w*&*:®*&*~2À*6*~2o:2!6*#~2!4N* :!6*&*:!6!4N* ~2*&*~2*M2:> !Hl!4N* ~2*M2;:2#+s#r*N2!š*#" ͯ ͯ!q!6*""2:(!6(*&*&!s*&!s::H*+":++s#r͛!6:!D*"*M!4&*M:[Ϳa2Ϳ:Al͛*M! ^#VIͿiͿ{ͿͿͿͿͿͿ Ϳ|͛!q!6:! *Nͯ*#"!4͛!6:!R *? !6^ͯD  ͯ*#"!4 ͛L2M2N2O2P2,22:2:2:W ͛Ϳ!6*& ~:HW :1Oͯ*M! ^#V1Ϳ 4Ϳ 7Ϳ :Ϳ =Ϳ*& ~8 RͿM *& >@Oͯ:ͯ͛!4ø :Ҙ ͛ZͿ*M! ^#VrͿØ vͿØ ͿØ w : ͛Ϳ>!Ҷ !6: Ϳ :@Oͯ:ͯ: ͛Ϳ: Ϳ Ϳ:# ͛Ϳ: Ϳ# Ϳ͛!6!6!6!6>!V *& 6!4; !6:: H I>!Ҏ ͦ:› ͦ!6>! *& :=¿ ͦ!4  :=*& w!4[ !6>! :L*& ^O!4 :: Hұ!6!6I*M! ^#Vͦî!6:] ͦI:w ͦ:=_Pî!6!6#6:ʞ ͦ*~ ~ Hҿ *#"Þ *~( !6*#"I::H ͦ: !6:2: :/H!0 ͦ: !҇ I::Hj ͦ:2:!҇ ͦ2:¢ :2ê :2:½ :2 :2*: : ͦ *#" : ͦ*~]~H!6 î!6!6:WI: W: R!6Wͦ*,*-î!6!6:¨I: ʨ: £!6èͦ2::2:2*îI::Hͦ:!6,-<!62:2*îͦîͦî!6,-î!62:2*îͦîͦîC K l?GOe !p+q*~ ~ H*#"ø*~>>_ogDM!>))덑o|g =o&og~1}CP/M Version 3.0COPYRIGHT 1982, DIGITAL RESEARCH151282654321 Copyright (c) 1982, Digital Research 10/27/82Show 3.1ERROR: INPUT: OPTION: DRIVE: Unrecognized Option.Unrecognized drive.Requires CP/M 3 or higher.No directory label exists on drive Unrecognized input.A:0B:0C:0D:0E:0F:0G:0H:0I:0J:0K:0L:0M:0N:0O:0P:SPACE0DIRECTORY0DRIVES0LABEL0USERS0PAGE0NOPAGE !$'*-/#(.[]=, :;<>%\|"()/#!@&+-*?;Zx0NSun$Mon$Tue$Wed$Thu$Fri$Sat$?????????????Directory Passwds Stamp StampLabel Reqd Update Label Created Label Updated------------ ------- ------ ------ -------------- --------------Press RETURN to continue.: Drive Characteristics128 Byte Record CapacityKilobyte Drive Capacity32 Byte Directory EntriesChecked Directory EntriesRecords / Directory EntryRecords / BlockSectors / TrackReserved TracksBytes / Physical Record, Space: Number of time/date directory entries: Number of free directory entries: Active User : Active Files: # of files : Label for drive AccessCreate on off on on off on off 1}1}{o&" >0 ͑*!& ~ :!<2!*!& " 2 h2 !!6>!!Y*!& 6:!<2!;6f!$ 6(2! 6D~!% 6ͱ!!6>!!*!& ~2 ʺ*!& N*!Mz:!<2!†v! q* & ! p+q* ~* N* #"     :$ e! 4~<<+~He  MC]! 6  ! p+q * DM }! q* &:~ҝ:}¦:}`O! : ½2}Õ! p+q* ~?2~* 2}͕2}͕! p+q* !Z 6Z 1!Z 6,Z 1!Z 6]Z 1|"  ! q* &.! q* &e! p+qi* DM! q: <2 O* : w! p+q* ~$* : <2 O* w* #" ! q: 0Oͦ! q: O: O! q* M:ͦ! q* &! ͆K* &! ͆M! q* M& /ͦ: e : s ! 6: <2 O* ~2 : ” \ Æ : 0 ! s+q! 6͆ ͕ ڶ ͕  : : : H2  : 0! w \ ö ! : #~! H : ! s+q+q͆ ! : 4 \ * M* ͞ ! s+q: 2 : * &) >;H{ : =: ! q* &! ͆))))* &͈ } ͞ =2 : 2! !!6 * & ~2!/*! 2 /cN 2 : !!: H * &) : N_!mͥq* & NC * M* C _* #q#p͞ O * w:; O * w* ~¬ : :  :; 2!* 6 :; O * w!!s+q:!!!! 6N!m"!:  !n"!!  ! +s#r! 4 ! 6 >! P : =2 2 ! !6* &) : !m! M  * ~2!*  ~2!*  ~2!* #^#V" +!͆! !s ! !6: >;! HҮ ! !6 * &) : !m ! s+4* ~ : !O! DMͽ ͦ* MK * MK * M&  ͦ*!M *!M * ~& *!M! !p+q!" !* !"  " * ~~He Q ! 6 Þ * ~~Hқ ! 6* ~2 ͢ * &* " !Þ !-!p+q!!6.*,!DM! -¶ !' !.!6> !.! *.!& ! N:.!<2.! \* ##N!ͥ"/!!1!q:1!2 Oͅ !3!p+q!2!* >2!y#M͹!7!s+q+p+q:7!=27!f*4!:6!w*4!#"4!I!!s+p+q+p+q>!*!*!͆!!s*!*!͆"!*!! ͆"!>!º:!:!!!6:!0Ov!!p+q!'"!!!6>!8*!*!͆:!=2!O!8! s*!*!͆"!*!! ͆"!!!6#6:!=2!}*!&8! ~0O~:!:!Hz,~A!!q*!&8! ~¤:!Ҥ:!ʤ*!M!!6!!r+s+p+q!!6#6>!!0*!&*!*!&*!~!!#N*! w*!&*!^! ͆!!s#N*! ^! ͆*!&*!q:!<2!!!p+q8!<?!<*!N#F*!##~2!!!6>!!ڙ:!҇*!&w!) N#F?!ͱ:!2!:!<2!d8!?!ͱ9!!p+q*!##~2!*!##~*!##w*!*!q#p*!#:!*!#w!!p+q*!#* ##N͹* *!##* ##NH*!##w*!* ##N*!q#p: AO !!r+s+p+q*!/!a*!q#p*!ڒ*!*!q#p*!N#F*!q#pc!!q!"!"!!!6!"!* !:!*!DM2!:!/!!H*!"!ҫ*!!"! i8*!##6* N#F*!q#p,ͦE* N#F^ * ^#V))DMy* ~* N!!+s#r*!DM  1:!!p+q*!##6*!*!s#r!!p+q!'"!!!6>!ʚ*!*!͆{2!*!*!͆"!*!! ͆"!>!!!+~Hҗ!!6:!0O5>0 ҹ" ͓DM$* Mqͦ1k!!p+q 8R*!}OW͛: : 2!"!S"!!!6>!ʈ*!}g: /X!!:!U*!DMg*!M*!DM!!+s#r!!+s#r#~!X *X g 8)*V g !!6>!! *!&& 6*!&6 ) >w#6:!<2!!"X 5!"!:}:}2!*!& ~2!:!!*!& "!*!##"!*!#"!:!2!:!2!O!& 6>!!Ґ*!* ~Ҥ*!~*!&6 ) N#F*!&6 ) q#p*X #"X %* & 6>!X * N#F`i"X * N#FPY*X *!"V 8QhOg 8`* & ~/\!!6>!!ڐ*!&& ~҆*!&g:!<2!a 8o!!6>!!*!&& ~*!&6 ) N#Fg:!<2!¡͘* & ~/͘!!qD>!! :}0:}`O! ~ * * Ḿ2!>!!/:}o&"!~i8 Eiji:!@@†Ìi B:% /:!րHҽ:!@@:!:! *! DM͟ *! DM͟ >͑: AO !!6> !!x:! ].*!&*!>O:!<2!G!!q!!6*!& :•>*!& :!©:!:!<2!Â!!r+s+p+q)!!6?:!:!2!*!My2 !!6: ]:!/ *!My2 ?:!2 ͩ:!:!2 : 2!:!2!!!6:!2!?:!Jñ*!& *!*!&*!=2!!!:!£!!6!!6:!!!ڠ]:!/Җ6:!<2!~æ6!!6ͩ>:!2!:  l+s#r): * #" :2 :!:!2!*!&*!~2!*!&*!:9:!<2!:!2!*!&*!:!(*!&*!~2!!!6* ~2!:!2!!!6* #~2!:!<2!*!&*!:}!!6Ó*!&*!:!ʓ!!6:!<2!*!&* ~2!*!&* ~2!*!My2 : : H: H: H:!<2!*!&* ~2!*!My2 :!2 :  l#+s#r* Ny2 !D* #" ):  +"!!!6: !!y*!N*!#"!:!<2!W!!q*!&ͥ^ *V& ~ʞ*!&ͥ^ *U& ~ʾ1*!&ͥ^ *T& ~*!&ͥ^ *W& ~#*!&ͥ^ *S& ~: :: 2 * & : w* #" * Ny2 : ZÔ!: q!: qÔ* &ͥ^ *V& 6* #" >* &ͥ^ *V& ~* &ͥ^ *V& 6ʹ2 !X: !$ 6!Y: !$ 6* &ͥ^ : =O 6-͑iE!: :>!: G>Zʹ2!_Þ:!=2 * & : w* &ͥ^ *V& 6!: ʝ* +" ͑iE! 6* Ny2 !* &ͥ^ *V& 6! 6!: ;2 -: K-!: !!: !L! 6* #" !: K* Ny2 !K?͑iEi`N#Fog_og_ogDM!>))덑o|gҟ =DM!>))Ҵ =¬~ º~ ^#V) ^#V|g}o _{ozgO{ozgi`N#Fogo&og_{_z#W  F!M!T![!b!i!p! :: Hұ!6!6I*M! ^#Vͦî!6:] ͦI:w ͦ:=_Pî!6!6#6:ʞ ͦ*~ ~ Hҿ *#"Þ *~( !6*#"I::H ͦ: y=!z{w# % w!P͠ y͓}*w#"͌ @.@<!Eͷ~P !ͷ’P͌Q!ͷªP}QxQ!ͷ͓G@Q! ͷ y͓Gþ!ͷ ͓Q!ͷ͓Q͌Q!.ͷ6y#G͙Qà!2ͷQ͓͌Q!>ͷq eg͙Q:zJEËC–EQyQxQRQ** {zҷ*~#" <AOGƐ'@'OxƐ'@'ON# z8O!B N#N ¾SP.* |} !9":q!"28!"9:] !í 1NCopyright (C) 1982, Digital Research654321 BNKBIOS3 SPR F700 0900 BNKBIOS3 SPR C000 2000 RESBDOS3 SPR F100 0600 BNKBDOS3 SPR 9200 2E00 60K TPA $$$$$?Par @UW X-X> FMT8 FMT9 FMT10 FMT11 FMT12 FMT13 FMT14 Q1q . 0#^#V#N#F## O>w#O>pw!r#######~ !r=KAYPRO KAYPROX MMS Z37 Z37X Z100 EPSON ASSOC?ÃãÄÜÇ{;KAYPRO Parallel Printer v3.100c$23! ;N#F#~_#~pW~# ~(<#~#总 6~pO Keyboard handler v3.100e$4?4\PKAYPRO Z80-SIO handler v3.100e$ 4 (4(4 vv8>:2f>Q{b""%B^KAYPRO CRT driver v3.100g$MàÁôë{EܝKAYPRX:>2:Q!f~62*s{Yvvv:.>(>2$:Q*s Q)!lr/VF5mKAYPRO Floppy Disk Controller 3.100c$PXPXP COM02?b˼KAYPRO Winchester Disk Interface 3.100a$De?S[úx2(:((?:A2( KAYPRO CP/M 3.100u (c) 1985 DRI and DRM $ No CCP$CCP $> | (***$> ( | G({.x:A( s.1._>#Wo>g2AG>Y!! ^#VA**$J>| **9(>M*** @>y$A{CM^#V#zy8#0#!nodev nodev nodev nodev nodev nodev nodev nodev MsC1C!4!~#|~(5 #~#fo~ +6####>*}D0000000000000000001R*SmwrXZ#]bg~ÃÜrÒ/×ï) n×AQ@Ã1Oj$|Ãà à ÃBB+"}{_}o>2~77ø~7"9:OG#Q{ozg# ""!2*%DM**ѵ+)) H~#+}#<:<ʲ<77:<ʢ=2(*f*(}DɯQ"(>QKQKQ>Q"%Q!*$K*"x!*!@$@hK\K:K ~#~ w*NK*NK^#V#N#F!x>QGQx3ڰbڼqҼo5p5"""*!yb! ~G*!NKկ2}!,"**NK6 :+OK2$^#V#N#FxNp:$p:Gjxj Y# A>QFQKK{<<ʽ! ~6 69BK! OS654321$Nwy!"(9"f1f! Ҕ2! ~#foCOPYRIGHT (C) 1982, DIGITAL RESEARCH 151282Kj P (?(?( $I$I$I$H@HUUUUR$D  ;@(@   @   ;@P (   @(@?  (  >͜(y@@$R_$_$U $ [? ~@G+~悳_##N >yAyQNˑV~ 0=y?(NxN yxy\(NyN++ >yx+8 xɯLPT ͠ʁְ!wgNO ~ɯʹ(y>DCE DTE MODEM xO_P!! +~~0_Wzy{>ܯ+| ɯ2.2-*2ýKEYBD !~~0_W~@G+~悳_##N >yAyQM:/  :-ܑ0DGP!ͧ )!P[0:.OGB:/2/[0! (!xzWy{>> xW:B_͗:9W::ܺ>8>2@:7_:8ܻ>8>2A:BO:CܹDM!8(.:8ܻ:A܃_ 0:@܂W::ܺ:@܂W 0:A܃_::ܺ:@܂W:A܃_ͧg{ _z W0D2;>2;[9͇S92B[7͇S72C:8:;ܷ( :=G:<ܰ:=/G:<ܠzWDzWDV >yxOA Q A Y{D{2!|KPY|W]S>.ڷ >2<:=ܷ[>q24(:;ܷ:4[>c:q #:;ܷ( :=/G:<ܠ|W] |g! = DM*0T]:.O>PO |g͎:.o&~>2;>2;:7 _:9 WzdG::{_>8(2={_*2B*20|g!P|g͎*0PB|g:.O!PB*0:._R|W]*0͎!PB*2PB|g"2ý(*~D*2/P|W]*2 |gGMR0!R DM*0͎*20|W]!P:- *2PR|g )*0K2ܷB0!B|gK0 |GM! |GMzy{>++ x͎:-ܷ[0!P 0DO |gDMR|g[2R0#!R|`G}iO1*0PýPYDM> x“Ýxx|y}>4xzy{>#zW|g\x|y}>tx|g!Pxx|y}>xzy{>#zW|gx|y}>xzy{ʃʷ  7>2,:/ (6*2P|gT] |g͎!P*2P|g"2 )*2P|g"2 )*2E;AG246 :4B5Cʏy296 y27:4=*? F6 y2:6y28:4LD(> ʎ ʢ(~ PO2.{2- [2ý) >yx"A Q A YzW:/cc6!|g!,6 yRʤ-"5:/ 2/!/y0(=(=(=(=(=(=(!=(0~w~w~w~w ~w*5| 27} 29:/2/!M:9 G( P_:72->P=2.[0>O2.*0O:.Oҟ[0<2.*!/y0(=(=(=(=(=(%=(0=(4~w~w~w~w`> y:/2/>@2D*:/ܱK>@2D*0:._W2.R͎:-82<2-*0PzW"0K2B0 ):-ȷ=2-*0PR:.ܷ :-ܷ(=!, w#*A"-*D"0*F"2>:,ܷoyV y[0  .Hͺ - ͺ>>:Ұ082c>:O滱CRT 6#6 :Oyʉ:gx0XDol( ˠͺ .ͺ %- oͶg}:c0|! 57!#57~ 0|>2͉:ҷ 7ɯO& { % 7ɷO*q >_#>W2*N#~/ 2:Ʒ &*:Ʒ F(2  N(>2!!O F#N#fi!:lO*# ͋bC {2c[sR:c :ҷ : <>(2͉8>2*o##"!ͭ8:<:ҷ >2!!*n(#n(ͭ82c@ *#~!G(*oX*qqpn f * *~G? q#p>2>!68͉8HͺͺͶ:c0 :ҷ~w*FN66~ .` !V( *~  pq~_( O(2~ğ~ :ҷ:ҷ!""*"s222>2>22~>22~w2( ~wϯ*#<(J*o##"( >Ӆ>1ӄ>pӇ>ӆ&ۇw&ۇ/@&$̤&$&$$(ۇG ɯ<& ˏ&`ۇ( =2-ہ(  (>Ӈ$(ۇG կ2-ɯӆz%ۄ ۅ1ӆ>Ӂ*:/3 }( }8o}ӄ|Ӆ:Ӄ>ӂ> 2.(H:.Ӈ$(>ۇG 8_(4>02.(%:.Ӈ&ۇ_  2-:P2/͔:-*o~G#~`G:9=A&$&$D=2>22ɯd(!7%F)U-1s5Å 2* "*""*o~ ###v(~!O N#fi{*m:?O!~O/q!>!ŷ!:ƆwK:ƹ! ~#fo#))MD*B8"* "!q#p#6^#V+*o~X7*qq#p N#fiC C"Cs:A2i`z n&+:Ʒ88:jO! [qs#r!:jO! ^#VSq*o~ #>(#~(>MOG#n( !C[q! N#F ! F?2!~#,&$y2j!A ~(k2kOC͗8a2l"m^#V#N#F:lo& "o@ AO :lO "q88)2>͵ŷ  A~$# w++~'w0#~'w+ GOxGd0d 0 !!!!! 2{Ͷ2:ͨW:ͨB(0 O= 0 :ͨ88O:ͨG ??OUD(0y xy(DGy<2> >$ !>g"::2:2:2*m>2x 7R0x >27ZxNd8dͶ2xͶ2!{Oz8 YW#x 8xͶ2 A$w#Y$  :!þܐ:2:2:2>2:ͨG:x(dNG2!m :ͨO :ͨ=(Go2!"*"!@)!@)!@)!~((#### y p#q#s#ro ͏v ʍ !O:2B ͏|>2z͏<2͏@,͏z͏|2y2fÇ|f*u|Ç:yG8!)>2 Gy ҳs#r#<GyOx!  N#fiOf”ïfM  *"*}"*"*"*"!x:|1!|G^>">"!}">">"!E"> $> >$>O#>#>J!!}#>!}!}!^#V#z~##ںO+~#!9bڗ>2#×:#<ֻ2#*!""++"29Cw*{}<^#Vz!c!>c! Jw*q~69!͐=‡*":*}®:=::<>2*i^#V+ d!K*}@*)): K:) O "!w [O?WGzO:VxGyOGxwq*}}ʴ>2d:#Ͻ>29཯2~2#!   )xð*}*}"*x"xm*^#V* s#r**s#r*:ﺾY4Y̓**~#ng* s#r ^#V랠a##)0"xx!"""XC*~<μ*":!::9*"x"*"g*3:= :Oi :=H:Gi a6:G/O**W :T=ҍ aʚ~»6*:X)!:T>qkֻ!:6>X*{Q:_2{2Ē"͂"X~<»#cdfg!"()*N!r)!N!)z<*)"!":X*:w:w#:w*2*}D̓¡>2ͱԲ߱?~¾¾ʹƹ>w͙=2͜:wÚ~̓ʑpá!6NwͧBpͧȾÚgsr͐-͜ġͤS)_ͤ̓~?w͐s-?F͜pN͆p# Þ͐*6!¿?~p*6 >2ͱݲԲ߱ͷw*oq͋"@6Ⱦ͚Xͤ͋͗wO~<: g~w#w#6##)͋@ * g~?G++͓ !" >- Ͷ Aګ ҫ _!7^#V~  \p Z z ů2[\͓͢ ҫ ͐ =« f " ͓ ҫ ͐ ʻf " =ʻf "=« ý> 2͐ f "]=f =« *]}o"_  *]"a. ~ #E }"]*a 6 *]}#|#*]E ͐ « f f f {zA|« W}d ͐ f f f DMʡڏ"=ʡͲ=ʡYPͲ1**!O~4#~#F#x~#s#r#w>͐ « f f  . ᯕo>g. 2|2\  !]w# ʫ .&  0 6 #& .K !e K w# ʫ : U 6 #K 6AW w#] !e~H#~E#~X*}|́ "!́ ͐ !ʬ =« f kʫ j \͢F w# ͋ t ʫ : W& _& & O { `i"F & & w# & ͋ « t Y t Y GтWx ͢!o ~Z #N  *. *.  NEXT PC͐ =« f  . ~ Ͷ ʻ .͓ =« f |« }w#Ä >2L͐ ! =« f }ʫ +"MD Å D  !  # ë «   Ͷ ͐ =« f xY |« }ҫ gA>S Ag}S S i |« }!w s#r:[ʔ _!~ʦ ![4ç \͢¦ 2[ 7 >?  e͢!g"c> _͢a_!f~> 5*c~#"c 0 7   > >  ͢| } @ >. *_}o| , 0 ë ^#V#!Y ))))o P q s#r#!V4 !V6# ,® >2Vñ m ͅ m ͅ m ͅ « Vʫ ! XN!~  ! _^! ^#V~ x+ >= = !~  . !   #x f L L ͓ͅ ҆ *" !6ï +"_*~ #E گ ʫ ^#V. ï ~ CZMEIABDHSP!"M"+"!91*~!O~6=G#^#V#~x (#"!N#FW( *J>7Å*M|N+"M N:LHͅÅD Å >* *͓ b" . *"] !/~##ʁtZ*F#n!Is!^#V&&##&))::^#V#*^#V>+)x-8_yÙCP/M Version 3.0COPYRIGHT 1982, DIGITAL RESEARCH151282654321CP/M 3 SID - Version 3.0$1 !~=W!x ~#ôbx {~#o}o.ÃO$ y͏ , $  ͌ 9!z6 # L!zw͌j# X:z 0 ͘=N#Fy}80*z{¯#z+++ ¥ z#½# · 9!`͠ y9!rͷ y=!z{w# % w!P͠ y͓}*w#"͌ @.@<!Eͷ~P !ͷ’P͌Q!ͷªP}QxQ!ͷ͓G@Q! ͷ y͓Gþ!ͷ ͓Q!ͷ͓Q͌Q!.ͷ6y#G͙Qà!2ͷQ͓͌Q!>ͷq eg͙Q:zJEËC–EQyQxQRQ** {zҷ*~#" <AOGƐ'@'OxƐ'@'ON# z8O!B N#N ¾SP.* |} !9":q!"28!"9:] ,:e &͟:l &:u &ͮ!I 1lĤ>#J ,!6-X5AڔҔ_!o^#V - G  + Q  1ͳҔ~½:,=”͍" ,~ڔʔ͍=͍=͍!,o͍ "c=͍=”)*c)!"f,*f*c"h ,*cL>::ʗ^#V#L cxZy y~ #*f ڵ™y ¶"c:,*hT*f , ,T:e,>2e,:ʔ%:e  ͟:u ' ͮ!I Y|”,,}5 2l~2m͍͍"n͍"pDMs !l6ʏ } "v=ʏ =ʏ YP !~ #^#V:l *v{ z "r~62t #w6 ” 1l*v*t!~4 #~#F# x ~#s#r#w>~ʽ ͍=; =”͍Lᯕo>gL,>#!u^#V#0}o|ge X x| y0ʃ GÏ yÏ  G| Q z,{ ,<,>'{>',*##V+^+N+y,L ~+ , :”%,ͳҔ~ ͍" = ͍"=”" > 2,Y,!|G }G , w#. ~ڔ ͍!=:r ”͍| !| !|”"!~ʩ #~#V§ z§ :w, ‰ :ʔ!~ :w#s#r, ¾ Ô!~ : 6 ~#^#V ,:ʔ!\6#>  w# ' >w# 1 6~!I =”*"!l6~# T :]?2 7ʔ!">HXE͆*ʾ \ͤ2 w# ™ ͥ͝* ҆ !""Ô\ʔ:¾ W$ _$ $ O { x! i`"v2 $ $ w# $ ͥ͝”þ \̀\̀ GтWx!͓B :>ULT͆!6\~# S 2|:] !7<ʔ\ !t   _*\ ʣ \ w Ø *+\ !ڔw{Ҕè *#^#Vr+s+6͓Ҕ*"s#s#rt ! *v*",!*L*L*vL*+L,o=”͍L:X^#VL\~J ʯ.y:,>."Ž! ;w#́=”͍:ʨs#r#;”}w#:;#;>>2o!"#͍}ʔ==”͍""2mNl :ʔ!\>2|!"*"~:8”*"*"*͠ڔ!"\zn<ʔ*ͯ~# _\V”*#"͠:W\J!*L!,:2:2>2::>2 N, !9# Ô ”J~,=”͍xA|”}ҔgA>;Ag};,;Q|”}!qw,s#r,:[|_!~ʐ![4Ð\ͤŽ2[g>>?,!e>Cw#>Ow#>Mw!u>Sw#>Yw#>Mw., * ͽw#  ͽ  * ?r# {zPY! |}>2!""!Ow #w 0q!\6 ͤ!"~”͍͍͍!6W6!6# ,œ>2ß͓ͣ ͓ͣ ͓ͣ ”ʔ   :@w# G6#. 6# x!a_!~> 55*~#"ů2[\ͤͤͤͤͤͤ!ex#y#*}|͓"*}|":!͓> _ͤ~# 07> >  ͤL:8>.^+~+:8*>:|}^ >.*f}o|/+- , 0 Ô^#V#*NyҔ** n +ñ q#^#V""~/o>g++Û!.ʔ@͔^#V= ͔^'D! ڔ'?!q'”S_&#hqf0 Ҕ)DM)) O I^*r^#V#^q̀))))oqh"s#r#!4-®+»*+ þ-y_xWþ!IXN!p~ !D_^!x^#Vx1>-~~>=G!q~L!9#x sYYͳғ*v" !6û+"f*v~#cڻʷ^#Vû~*v~Gx5@xv5 x805 x6 45>=*t~*t$5x*l$*n:585"CZMEIABDHSP!"2"t+"v!91t*v~:t2l!~ʐ#^#V#~ ƒ!~6ʳ=G#^#V#~xâ#"v!N#FN*>7l :|!~9#~#V*v9z9~==2wͲ:l <!*vNl  |Ͳd=Xl *v5Nl :l|*pMD*n:m7l !"N2>**vͳҟ" *t"c, PASS !~*+"|w=2~ !~##Z:t*rw2t*vF#!s! ^#V&N&N,`r<¦Gæ::^#V#2*r^#V<[>èæxjê8_æ*t2¦,:?*v###æG>è><7*|!N*v!>#> :!>=_~/w/w{G=YP"*##F+N+~a/o>g{\z\<33=>!y$ڇ *y$&>'d !y$4d SYMBOLS NEXT MSZE PC END 6!z$q!h#6?! h record(s) written. h#H!:#A{$O !:h# !2h#!@ !:h#S:h#QHP!:#<2|$2h#:h# HG!)!2h#Ô!2h#02|$O> j!!|$6Ô!2h#02w$O> @!!BH @@ABH B! "BHI$$BI$BI $ HI D$HD$$ H B!$D$"$B$DA!ABI$H B$I $HI$H$! $I $I$I $I $BBHHA"HI$H!$HH$ IDH$$H$"BD $$$HH$B@@D!@H" H " "BI$DI$I $H @HI"$AD@@HA$ $@ $@D IB!  $H $I$$HD H!"A""! I$DDI"I$ @$I"DH BH" !I B  B$H$@"IHBI $$@H@ @@@D !@BA$!" D!$A$B@$@@$"$"@  D@@"DH $I!"DH$BB$"H@ $!D$$I$I$$"A$$I  D UUTH@@!@H@ !$   K-!: !!: !L! 6* #" !: K* Ny2 !K?͑iEi`N#Fog_og_ogDM!>))덑o|gҟ =DM!>))Ҵ =¬~ º~ ^#V) ^#V|g}o _{ozgO{ozgi`N#FoASUB 1xCP/M Version 3.0COPYRIGHT 1982, DIGITAL RESEARCH151282654321Invalid file name $Error On Line $Enter Password: $ERROR: No 'SUB' File Found$CP/M 3 SUBMIT Version 3.0 $Enter File to SUBMIT: $SUBDisk Write Error$Random Read $.$Invalid ASCII Character$Parameter Error$ERROR: Directory Full$Requires CP/M 3.0 $11G"*}0|HҤbP2IK 1">d*++"~"!\. v!q*&!p+q* !s+p+q*:w#6* *#"N#Fy !p+q*!p+q*2 !p+q*!p+q*!p+q*!p+q*!!p+q*2 !p+q*!q*-!q:2!61!s+q:2!6*&"1!p+q*<!s+p+q+p+q:=2d** w*#"*#"=  !s+q+p+q:=2ʩ*:w*#"Ì!p+qe*DM!\.\s!q:a:{: :O2:eel !6>!ڜ2 K*&l :w: T:_:…:r:=2O!l 6 3:•!4**& ~ ~ H!4Ýl :S*Q*Sl.l\P"*}=*|&el\P"=*|5.*& 6!6͝*& ~( 2*& 6e!"!\" "\p.e.:\2O>:2\*& ~ ~H~ H.!4͝*& ~2!6>!`\̓[>!6:<2=O! ~2 ½:<2O>9ҽ!60+~9ҽ!60+~9ҽ!60+~9ҽ!60+4:͓ͪ!"!6:= !6!6#6D2: H% : " :#$ͪ:;!6+~<;!6:$¨D2$X*M å:02O> p<ͪå!6͝:ʔ!5K ҎÄ͝xK ҥ*M Ô" :^D2:^^ :@: O :`:@O :`O " :!:/H     " *M : 2    *++" *& ~2 :Ht !4>>!""\ !6>!ڷ :+ ~° !4‘ * DM*"À * DM!" }2 ͣ2 :  ͪõ!q!r- "w * :w:C w *#" "*#~22_! 8!0!s*&:0!s!6ͳ:  sͳ:  L!`i^#V#~#fo yo w G: xAo o a{ _o     `i~< #~2#~2#~2*| W \!\~R 2 .n~ >2 6!.t~: +  >2 6!N#F#*" ^q#Vp" N#F##"^q#Vp" 4! 7o |  ! 6   \\ ? >_ 1m :~# yo ɍWARNING: Cannot redirect from BIOS $ERROR: Auxiliary device redirection not implemented $ERROR: Insufficient Memory $""SYSIN SUB_ogDM!>))덑o|gQ =?i`N#Fogo&og_{_z#W00001 : $SYSIN $$$FGET :<***.n6.t6 LL!p:~y !6 <ʊ~"x!=F#fh!:~!«!>w~:!5*.~w:; :~!9"1A#u.t.~@w :&/3͖!~6 :~wucy! ʎB d{<ʑ  '*2.2+6.w 22*2$*.6#6*.~w#~=~#4Ʌo$͖O̓!54  !F6#ȷxO҃>^̓@_: N#͖§>  *.>wÔ#wt~xڔp> ̓ 8>""SYSIN SUB hhhhhhhhhhhhhhWARNING: PROGRAM INPUT IGNORED $ 151282 COPYR '82 DRI gggggggggggggggggggggggggggggg"D! BH!H@ $!!$"A! D$DHH$B!"  @A  !@ !:h#S:h#QHP!:#<2|$2h#:h# HG!)!2h#Ô!2h#02|$O> j!!|$6Ô!2h#02w$O> @!!BH @@ABH B! "BHI$$BI$BI $ HI D$HD$$ H B!$D$"$B$DA!ABI$!o#~>T}! 6**#K"G*~ xr͐-xą@˯7(͚Sʀw: :<RHͥ:>~c!o#~E^#V)G#~#~!~ b k##N#F#^#V#~#fo~o2{2g*wޥʪҢÞ+}*#}o|g:O*s#r#w!~w/~@w//Hͥ*>=)_g:0"ök*w)*c)-}ͤÀk*s":;:r2͚΢ù͚΢¯͚}/_|/*W}_*c"}o|g"c>2{—>2—͇ͱ* «>2͙wBp+ҵ:w͚AP{ 2W>O2ø}R*):r͚΢c2ZT͐-ک3͗@YsY̓YײYͅ:߱Asҵ:@ҵ@ҵ$͚̓Aآ=:<~?¯kô?~?ʾZT͐ڴ*>o"͒"!ä:Oݦ"Ý}6͚ ~2Asv@NN~v$̓W+vw̚v$̓rrͅ:r߱>2+A@2r!Z2!"ög:2T͐-:ʹ>2<2ک!w: >2*6ݦݩO~<w:*)@ u:G*g`~!x_<_@*oy<:/G?~##~? 6K@?F6##N6ⲯ2p##q:#*~w>2*p@! ~*"v@*w# ) 6#̲͙N#FxT]## #~ ȷ  *4# ' 4! *~^ ^33G# Pv:dv6 y2@ !׺)#w*~"ұ!Fw䱨ұ̓ұ:w̚":>嵯2̓*~wć"̀!~$6:03i"!~6*>=)Q!QX@˯ >2 ˯!!q#p#w2wW*_3ҫ-!s:!xQ*:<œ. ʩ.ʩAܟrr##sܟ<}rcN! ~态O>G~G!~G~o>_yG~.|°! w:ck[!x?[! ~ʤ͆[͗PPvqO-á=.:<ʰ! Vq##~_@wںͶ:WMںʛ>úͶ >TJ:!ʷ͞x!Ǯw4 ϮPWޮPܟÂ՟Â*!!~~#~O~#FsO s#r:(„y==„*!^W*y^#Vx7=2wͼկw#KWK*"J T͞*:["+SX:ڜq:ʺ!ʵ>2ܟͤ2ѭO ̡DM͸}ޭ>r""2:2* :::29:>:>*ڈ>F6:_/G:ʧ:ڨ|OͤG:_O̡̡zW{¬|:*}|BKN¬ zyG:!vq:v՟vMڂ?Ͷ >T͓Â!">Â:G:O:h=27ryy/W!:l=:<>w##~2 4~?ɫ̓¹:<ɫɫüީAX2rK:w++~=wv4͗O5:2X!"*>o+"v *!b"ݦ": r#~?w#>r# L=J Lv wȾbܟ?~O ͆ګ†wŒ~è# # x ͗w ٪ڪ٪ڪw@ ~wb͐Úݤ!x>w~6:6~#+w#w+~;wɯ2KOFq-yl?Npg:ʓ~( ȾˆʀHÈ2xą ):@ΩO~#w͚ʀô̓b_++V@* )͗Os++r~Gw#* #~$%+@*9>  #>? ;*~ w-xąH"0 *ĊHEʀ@~›:6¦w͚̋ȾÇPY*{zBKNyʺ Nú2: *~w *" ݦ2>ʄ@~k:(s~*9~Ês~Բ~ͅ<G:<ާ2x# W:<­:22G?>Grx~:2Ô##~*$*">2̀2kºʺ**iҺ@:O~2~WW:2Ôyʛ?ʔx ʔ |̷ǧÔN:r:/GyOOA +¬ ¢y2:x¹o&:W>OͫE:ڟ?N/*"y2ͦ>2 ݦRXޥDM*w6# x *ow**ws#r̀*i6#6*}"j@*|<ď>!8>8> t>nͦv8 ~*ownT] KKͦޥ*w"wͦ"w@ :åNɥ N#Fyإ*}|h#ð*ͫ# 6*q@!"@**#":&2͒:È0:+Òy<_W`iͫDM*w ~bNpwޥDM*we ^#V#~2>â9͆>!"*y³*X*ÿ͂"*g*K!~<:wb##>w#wġ> r!~#22Zw*q>ww:c *#*is#r*:!:):O!*c:Oͫ}@2æ ~á*g:o$*~K6?~wKw**i{#zir+s{O:w:Ғ4~:w?r##rp# ä |g}oì*g #G ¾1*q:*w***> r 2":O:G2!w*~zWw+ !z?#~*!* *G!O~2~m͗O~t>2?:2g͝DM*0MD"!*MD$:Oë!N: «G>O: ¡ù*ġ :ڡn` ~#foͤ2O̡"}:O*"!s#r#p*kN#F*m^#V#F*:O}|y9*+"*}|yP#9**DM"*ks#r*ms#r#pyox*kw#w*mw#w#w>2'å2*OͶyڲò<*Ͳ:0!::ò2*>*ͫ"4#4#4)7 #  w#*J|^#V#"i##"k##"m###"o#"q##"!s )*s!)*|!6~67rrorFile Exists? in Filenameòò>2a.":2:<:55;:2ɯ22{_zW{_zW )7CP/M Error On : Disk I/OInvalid DriveRead/Only FileRead/Only DiskPassword E)"!z<~rs^#V#N#FxN:oʲ̀õ(# Þry< <<%zrͷr6r9rMDÌ:o!6!h: ʚnt2 r62>rz<*9ʌ^:—~x ):*:śś>*(+"(w++2+2+ɗpؗ!" >2+2*jx.#NzW::!2W!5=^x^z:m:*;#wO:͂^2¢ů͠Ě:!ڽ*(~ݘט5Wè՚ؗjטM2ͨxΚ*(+w"(j͖ !%"(^-:*$P:<\:W:2xM s:<9>2:*9x~+q’x2:**&~2+o#"&!+6Mř:W:2x ͺ*(+"(w  :ܙ>2*2:*(:+w"(ͺ:G::+̜2 5*(~o#"(Mš*(~`Uoj*(~#"(Ñ!*~6s!+6:+‚xoڊ{2Ó#w:2.+:.2-!%"(2*!"&!*~4:2-Ԃ:Gͳͨ^2+>2:2*N#G2 2GH)+6:2,:!- ͖:,!͖+*(~L#Bxz:*:*(~ʓOr ͖ ͖! O(Ì*(~2**}ʷ!#¶!""÷:_:*(#wΗxH!)6"&:! x5~y 5 6y(^͖@O:=7:͖y ͖:I ͖:=e: zz#͖͂:! ͖ G:Ҏ>xʝʝw>ɯw̩z:»!>wɯ:=zxzz::G:=/ͽx:Āy!4 šn!6@G:x: P:<: P n6 t6! ^6 t6u:)<͠^!Ó*"r*r"ÿ<:g:!͐*f}D! ~6t!rͷ֕O(^ƕƕƕ  :Function = File = !,$"h!9"f! ͉:2t™:!=Hgo:O*;*͂:A2=/::0! dگ61#d ڸïp#:w#6 !6:6 *#!)6.#)͂ O(BDOS > wM  2*7w#6?#7 .,:;[]=<>|!?]45#Ra{i_p# l s s l ls:¬MA 2YP<6Q̷iQm1c Q 20PP'1 ÊCP/M Version 3.0COPYRIGHT 1982, DIGITAL RESEARCH151282654321 Press RETURN to Continue $ ERROR: Not typed: $Password: $No File$ BDOS Bad Sector$ Invalid Drive$Currently Opened$Password Error$ERROR: $Invalid or missing delimiter(s) $Try 'PAGE' or 'NO PAGE' $Requires CP/M 3.0$Enter file: $ $ERROR: Invalid file name. $1 1 u" * }0* |HҴJ>O/4\>(N2 i>!6 * & 6! 6: ,v! 6> W ʹ * ~‘ù* ~[ʟ* #" * ~N* #" * ~O* ~ H* #" ! 6 * ~P! 6* #" * ~]* ~H$ù* ~A0×* #" * ~]* ~HTù* ~G`×* #" * ~]* ~H҄ù* ~Eʐ×* #" * ~]* ~Hҹ: : /2 : ==2 : ! 6! 6\O2 :  . \ - v! q* &! p+q*  ! s+p+q* : w#6*  * #" N#Fy  ! p+q* ! p+q* ! p+q* ! p+q* ! q* &-! p+q* ! q: 2 ! 6 1! q: 2 ! 6 1! r+s+q: 2 ! 6* #s#r 1m % %!% s+q+p+q:% =2% ʍ*" :$ w*" #"" p52& aڧ:& {ҧ:& :& XX>l c!' 6>!' 6͎2( *' &l :( w:( 6:( ÷:( $:' ÷:' =2' O!l 6 :( /!' 4~2( !) q:) R>:) c>:) t>:) ‚>:) >!+ p+q** ~ʯ** >@O%:%!, 6> !, :, .%*, &** >2- *- M%!, 4´!. q>:. >:. 1>!0 p+q*/ ~ ~ H?*/ #"/ */ ~K>>!2 p+q!3 6#6:3 ҁ*1 ~?s!4 6!3 4*1 #"1 ]:4 : : <2 ! >52  %: ·: ! 6! 6lͷ: 2 ! 6 ͇" * }= * |2 % ͫXlͷ: 2  ͇" = > ͑ %* M=* } ͷ! 6! 6: / ͧH ! 6>! * & ~2 — ! 6:  ~Ү 52 : : ͅ* M%! 4w [ =ͷ\26 =:6 :6 o&"7 E"9 G"; I"= "? "A "C .*7 DM -J :\2 ͅX ͑:%ͅXͷ*9 E)*; G)*= I)*? )*A )*C )!; \e .*; \ - 26 * ~ * ~ H * #" !`i^#V#~#fo:  y  wO G:L xAڠ Ҡ a{3 _à  F F : i`N#Fogo&og_{_z#W:7 e !p+q*DM  =? ) !p+q.*DMF -L *9"`!"b!h6!j6!|6.!=\ -x !e:dʥ *eM \R :xʥ @ *dM \, :x \͕ :x - V :e _ :f w : =e !e:d*eM =e : =e =͕ !]6:x>- !"!76!6!6!66*dM  *dM !6:8!*`*;DM \u 2xʻ>!xҨ- *`*;6:82*`"`:<2w!"`9`h*`*;~2*`#"`:*eM !b+!s{!f!6:!b*b*^DM =ͅ N- *b"b:<2)f!"b!q9bڀ*b*^:w*b#"b!q:6ڶZͅ ʱ- !66*6& :w:6<26!J6*b}:J<2Jm=? :x- : ;*dM .=\ -=ͨ ;: *eM =ͨ .M= -C!q:Y*M !q:a/>z!/H!q*MaҎ:_:!q:ҥ*My:!p+q!'"!6>**ͪ{2**ͪ"*! ͪ":!!ɀ"#DIRLBL 1!M CP/M Version 3.0COPYRIGHT 1982, DIGITAL RESEARCH151282654321!`i^#V#~#foͽ{¡y#wG:xA##6?)@w){#{s333333.;;33,;;#wD{_#6 sO O ڹ.:;=,/[]<>a{Ҷ_#  ý Copyright (c) 1982 Digital Research File not found or no directory spaceInvalid file name.Directory Label attribute set Read Only (RO)Read Write (RW), set to ERROR: READWRITEDELETENONE on off LABEL @ @Option requires a file referenceOption only for drives.Assign passwords to input files.Assign a password to this file.Directory needs to be re-formatted for time/date stamps. Please see INITDIR.Protection not enabled for disk.Unrecognized option.There are no modifiers for this option.Modifier missing or unrecognizable.Not a valid modifier for this option.This option needs a modifier.Only first 8 characters of default password used.Only first 11 characters of label name used.Only first 8 characters of password used.Cannot have both create and access time stamps.Cannot set both sys and dir.Cannot set RO and RW.No options specified.Page and nopage option selected. Nopage in effect.Cannot set local options for file.Protection modifier is only ON/OFF for drives.Password protection is not supported in NON-BANKED SYS.Requires CP/M 3 or higher.ACCESS0ARCHIVE0CREATE0DEFAULT0DIR0F10F20F30F40NAME0PASSWORD0PROTECT0RO0RW0SYS0UPDATE0PAGE0NOPAGE"%(+.3%\|"()/#!@&+-*??Directory Passwds Stamp Stamp Stamp Label Reqd Create Access Update -------------- ------- ------- ------- ------- Press RETURN to continue. ?Password ? Disk I/ODrive Invalid Drive.Wrong Password? in filespec.?ONOFFsystem (SYS)directory (DIR), Drive Default password = Password = Label for drive Protection = or protection not enabled for disk.Modifier: Option: FILE: 1!1!1 ""*"}2W#|2X#̀ 2"!"6:W#0w n ͎ 2!ͽ l 2"*U#& ~ œ !U#4Æ *U#& ""*U#& ~[ *"#""B!:" o ! !!6 S :" *"""B Q͟ 9 :"!"" g͟ !!6= :"1 !!6= :"= !!6]B |M !"6 :"k *"""!"6o P &͟ v!!q*!& y !!p+q*!~ʯ *!Ny *!#"!Õ   y  y ͹ :! !"4~<<+~H ͹ ͹ 0 ͏ Ͱ  2!:! !"6͹ ͹ !!p+q *!DM͏  !!q*!&!!p+q*!!!p+q*! !!q*!&-!!p+q"u *!"!!!p+q"u *!d!!q*!&e!!p+q"u *!f!!p+q"u *!g!!q*!&) ^#V%!!p+q*!! #q: #2"!"6"1!#r+s+q:#2"!"6*##s#r"1!"6#6"1x >"9!® *"DM͏ ö *"DM͏ J ͏  "̀"##1! ͑ >#9!*#~[ !"6 *#~] !"6*##"#!"6*#!#s+q+p+q:#=2#J*#:#w*##"#-!#s+p+q+p+q:#=2#ʁ*#*# w*##"#*##"#Z: 2#aڛ:#{қ:# :#!#p+qx *#DM͏ M  " !#6>!#?͂2 # *#&" : #w: # ?: #ý: #-:#ý:#=2#O!" 6 : #8 !#4Ͱ 2 #:"AOy :y F!!#6> !!#ڋ:!# s.y *!#&*!>Oy !!#4]x *"|2"#x F͉ :"#¸Y ͏ :"#b ͏ M͏ :"#M͏ :"#i ͏ :"#x ͏ :"#  ͏ !##q&"u  S 2##!$#q:$#>:$#o&&""!:\w!"6!"6&"u *#EZ *#GZ *#IZ *#Z * #Z * #Z "*#DMKc 2%#¡>*%#M>!'#q=͏ :'# ͏  ͏ p͏  Z ͏  ͏  ͏  ZM͏ W͏ ]͏  y  Z!Ay Z/1y Z=2y ZK3y ZY4y !(#q*(#&*!~q>>:"ڒ:"ڒ&"u \S O!)#q:)# ¨ͅ 2*#ò*"M 2*#:*#  F͉ p͏ :)# M͏ W͏ ]͏ :"*"M 2+#!"6>!+#Ia:,#o&&""! >w*! ~ F*! ~F!"6[!\"!]K!"6&"u S 2,#:,#ʗ:,#`O!&" ~ Žc 2,#p U͉ ͉ :"!"6*! !K!"6+6! ""}*"|͌͘͟:!2"!"6:" ͟" *"*""K"j  ! "6"͏ :"b:"Tͥ͟:"2"p *! >w " :"‰!"6!"6*"*" "K:"ҥ:"Ҹ͟!"6*!#  >!"3!-#6:"=!-#"*-#&*"~.*"*!#DM*-#K:-#"!# *! DMK!-#4*"*!#DM*"K!0#s+q+q:"G:"Z!"6͟*.#&" ~z *! :/#wÆ *! :0#w:"ͥ:"21#¤!"6:1#´!"6@:1#!"6 !"6 " :":"2"!:"͟:"21#O>͟ 4*!  !3#s+q:"0:"C!"6͟*2#&" ~b*3#&*!>wp*3#&*!>w!"6 ͏ !"6 "͏   F  U *! >µ͏ û͏  *! >@@25#*! >͏ ͏ :5#͏ ͏  *! > ͏ ͏  *! ~1 v ͏ :"K͏ Ô:"@@^͏ Ô:" q͏ Ô:"/: " HҎ͏ Ô͏ :"Ҥm͏ v!6#q*"|. :6#͘, ͷ:" :6#*!DMͧ "" :6#*!DM "" ! ""*"|.͌:6#(, +͘>>*!DMͧ ""*"}t*"|kͥX*"|h͌͘t͘͟*"}ʘ *! *! ~ژ͘*!DM ""*"}*"|ͥ*"|͌, J͈͟>!"(:"(:"(:" :" ͟"*͘͟!"6:"?:"?:"2":"2!! ""*"}Š*"|}ͥj*"|z͌͘Ê͟  :"¦:!2!!2 o&""͘2:!:!=2"*"MC ͽ !7#6> !7#*7#&\ ~?>!7#4>ͭ! \K!"K:] :e HY!"6&"u \S 28#O!\"!͘͟ *8#M^!"6!:#s+q*9#&)))A *:#& ~!;#q!<#6*<#&u :s—>*<#&u :;#«:<#!<#4Ä!@#r+s+p+q!G#6:H#:H#2G#*D#M{2"!L#6:"=:L# *D#M{2":A#2"}>:A#2"2K#:H#2I#!L#6:H#2G#:H#Dß*H#& *?#*H#&*?#=2J#!K#–!L#6!B#6:K#!B#ړ=:L#ڌ0!B#4uÙ0}>:""!+s#r:"*"#"":2":I#:G#2M#O*?# ~2C#*C#&*=#:s!M#4~2H#*C#&*=#:D#*M#&*?#~2C#!H#6*"~2D#:C#2E#!A#6*"#~2D#!E#4N*=# :tW!L#6m*E#&*=#:D#m!L#6!A#4N*" ~2D#*A#&*"~2D#*D#M{2":":"H:"H:"H!A#4N*" ~2D#*D#M{2"Õ:A#2""!#+s#r*"N{2"!*"#"":""9!+"O#!N#6:"!N#A*O#Ny *O##"O#!N#4"!"6!"6!"6:"Z!:"e!:"p:ͳ2"„"!:":"#H!:":"=o&)))A ~ھ+:"=o&)))A  ~ lNͳ2"4:"=o&)))A *"& ~=*"""!"6#6!Q#6:"=*"N{2"*"#""!Q#4!:"X*"N{2"*"#""!Q#5>:"=Œ*""":Q#2"O>҉e͟!"6:"= ¶*""":Q#2"O> ҳ!"6 ͟*""":Q#2"O>͟!"6:":"=o&)))A ~HF:"=O!" 6>!":"=:"=O!" HqQ͟X͟X͟O!͟OG͟X/  ^:  Q:"s ":"ҁ":"ҏ":"ҝ":"ҫ":"ҵ͝:"ҿ?:"͇:":"!":"!":"͟͟ P:"):"!"64@4:"P:"F!"6@44:"!"t:"h͟͟ Ø:"҅ "Ø:"Ҙ!"6 ":"ҩ 4:"!";͟  :":"!"6  " ͓ :" :" !"6  "  ͓EB "#GB "#IB "#B "#B " #B " #2"O ! "K!T#p+q*S#""""!!"" ""*"DMS :"Ҙ ͟!!6C  !͏ >"9!ʬ !"6ñ !"6!\K9 :"!:"  e͗ :" ͙ :" 1:" ͗ :"!!"6!?!!"6 _ogi`N#Fogo&ogDIRLBL yd'* !9"1>"#2#:Og}**Ip2~w2i#1#":RͶ :O~!ʫ:<2Ž:"2"x2*# O:ļ:<:G>O*# :<t tIw!/>!/>!*6 #:_#:*Y" Y" Y" >*Y"#####Y"##Y"Y"Yz2*Kg"ɯ22!"*DM6:O* 2~ ~ †:<~:2>2:<** "_?:<2>!/:<}:2* ~b W6 y2> # vwm>2>!/ N *~O²+—">2>!/*:< "~G # p *~w#  : *8*:*8yO:O*}O= ~ w#P^#V#ɷ{ozg |g}oh:<͉̉O<OBKBK$'-*!*^#V"DD  $$HD@" @@ $B $$H$H$HH$$! HD$D$D@AD HD$!A" :4 : : <2 ! >52  %: ·: ! 6! 6lͷ: 2 ! 6 ͇" * }= * |2 % S%P h8FDC3KP RELCENTR RELEND $$$ public @lptbl cseg 0000 323321FF @lptbl: db 50, 51, 33,255 0004 FFFFFFFF db 255,255,255,255 0008 FFFFFFFF db 255,255,255,255 000C FFFFFFFF db 255,255,255,255 0010 end WIN3KP ASMGbcdLPTBL $$$֎ ctUDEMIBQR5]@K0ޠ+T##d|F~s B #s bp]2#'ηFu_oK42# xX- db1F#??{Br+ǬYP)YP)i4 n nX`0)@O' LO!148149141141141141141( q8UG3@ i(uP: w @i ,qy \ec;@X \$` _0 P ?Ā(|a@ -  %  @( 0 x<08~D < @"a@`p ` @P   xl<@x6? <;e^@@2* @ @  P,@( `ctUDE?SERDP @( 0 x<08~D < @"a@`p ` @P   xl<@x6? <;e^@@2* @ @  P,@( `ctUDE?SERDP; Thread terminator for CP/M 3 I/O modules. cseg ;common memory dw 0 ;terminate thread end C COMFDC3KP RELCENTR RELEND RELLPTBL RELGETDP3KPREL END $$$Ã"zw"|z !aF6c#6FCP/M Version 3.0COPYRIGHT 1982, DIGITAL RESEARCH151282654321A͑"w*w}1ҫ!wE><0;!w!w6!w6!w"'x!%xy2w:w!)x"w*w~2w*w~og |2w:w !+x!/x!F:w_>͉:G!w>A;2wRf%!DB$![D>6;!!D;!!w>;!!-E> ;!@%*}!w;@!7Ewx͛:!8Ewx͛:"w*w:wog<,;!3x!rx*7C~og#))+"w*w#"w!HG"wbj"w!txDͺ(xx~# RE%!E>;%!F>;%@Ra%>B'!F>;%@*xx~2|x!F"w*w+:|xog!Gx͛:*w+:|xog*wx͛:R%!(DB$*w+:|xog>;!@!|x4nR%>B'@÷}x~# R%>B'!G> ;%@@%*=*w+*}x~og;@*w+*}x~og>;!9E>;!SE>;ͥ*w+*}x~og;*w+*}x~og#G>GA;*w+*}x~ogF>k}*xwÑ ̀*zw"w*w+"w*w+"w:w*w"w:w2w*w*w*w>og^<"w*7C^#V*w<*w<"w*w>og;#"w*w*w*w>og^<"w*7C^#V*w<!xE><0;!x*w>og;#"w*w*w*w>og^<"w*w*w^+++*w>og^}2w!Hg"w*w"w!HW"w*w*w<*!xͨ*w*w<"w*w+"w*w+*7C^#V<|z*w"w*w"xw!xD:w2w!x͂ :ww!xD!x͂ aÀ!xͨ!|w# À}!"w*7C^#V*w<|!xD*w"x2x:w2x:xog:xogw!F6*w:xog)))))~!Fe!HG:xog)))))6*w#"w!x4!xͨÚ!w6!"w"w"zw"|w!w6*w`~!F­!w6*7C^#V*w<2x:w2x:xog:xogog;#"w ^#V"x*vw*zw< *zw#"zw:w*~w*zw`;w*w#*x~og)))))*~w*zw`;> GA;*w *x~og)))))~*~w*zw`;w*w*x~og)))))*~w*zw`;>GA; *|w#"|w "x*x | !x/F><,;!x!8yC"~w*x)>og;"vw :w R9 %>B'!E>;%@!<,;!:ySx !w6!w6!{yD><,0;!yySu !w6{ ͔( ^#V"y*y^#V"y:y *w*y)))))~2w*w*y)))))*w:wog)))))> GA;:w!F :w *w:wog)))))6 :w *w#:wog)))))og^|n !w55r !w5*y+"y*w+"w:w *w | *w#*w^|± *w#"y!yͨ!yͨ*w*w<"w:w=2w:w !w4Ó ^#V"y>2y:zw2y:yog:yog< *~w:yog`;~c *~w:yog`;~*w*y~og))))) >2y:yog | *w*y~og))))):yog*~w:yog`;:yogx͛:ʳ !y4W *~w:yog`;6c*zw+"zw:y!y4 >I*xw"w!yL! *w#"w*w"w:yog#"w*xw*w< :y<2y:w2y:yog:yog*w+"w*y4nS^#V"y*7C~og*w *y~og)))))~og<*y"y!y 2y:y:wog#>og^"w*w<:wog"w*~w:yog`;*w*w)))))*w `;>GA;*~w:yog`;~*w+*w)))))*w `;w!w6P^#V"yR;%!-DB$!E>;!*y;!!E>;!@RL%>B'@(^#V"yR%>B'*y;%!-E> ;%@%*!w;@!7Ewx͛:!8Ewx͛:>m2y:w2y:yog:yogog^|*w:yog)))))6+:F*w:yog)))))w>2y:yog |e*w:yog))))):yog6!y40!y4^#V"y!F6*w*y~og)))))"y!z"y>2z:zog |*y+:zog~g.*w *y~og)))))~g.`|!z:zogw!z4á*yGx͛:R-%>B'!G> ;%@RI%>B'!2G>;%@c%*`! z;@! z>;!9E>;!SE>;ͥ! z;>2z>2z:zog |! z:z_>͉:*y+:zog>͛:!zF><0;!z!z5!z4Ò!"w"w"w2Rz2Vz2Wz"w*w*w"Szgo"w!HW"w!Hg"w*Sz*w<!XzD2Uz:w2\z:\zog:Uzog*w#"w:Vzog*w<|!mz͜:Wzog*w<|!qz͜!*w+"w:Rz!uz!yzÙ}z~# %*w*z~og)))))*}z^#V*z~og)))))> GA;*w#"w*z4*z~og*w<|˜*z~og#>og^}*zwz~# ¡*z"z!zͨ*w*w"w*z6*w#"w%z~# *z~2z:w2z:zog:zog<\*z^#V:zog)))))6>2z:zog |U*z^#V:zog))))):zog6!z4!z4*w+"w*z~og+"w*z"z*z"z!z͜2z:w2z:zog:zog<*z^#V:zog)))))6>2z:zog |*z^#V:zog))))):zog6!z4ý!z4Ë*w*w<$*z"z!zͨ*w*w"wA!z͵"Hw͖!z͛"twåz~# I*z^#V*w;͍6!z>͓7!z͚"w!z͌!zp"w!z͘*z"z!zͤʤ!G͊= z~# ­*z^#V*w;͍6!z>͓7!z͚"w!z͌!zp"w!z͘*z"z!z!zͩ ![͊=m^#V"z!z*zr::z52z9!z5!z͛"tw!z͵"Hw*Hw|f!zF><0;!z*Hw^#V"Jw*Hw ^#V"7C*7C^#V*7C~og#;͍6!Lw>͓7*7C###"{!{A#͍6!Pw>͓7!Tw"z*7C ~gj"z*7C~!z W#:>2z:zog |l*z++:zog)w#w*z!zF:|e*7C^#V |H:z=*z+:zogwe:zog+*z++:zog)s#r!z4×^#V"{*{>l7!Lw>l785"{!{^#V"{*{>l7>5!Lw>l78>55*7C ^#V^#V"{*{>l7>5!Pw>l78>55>^#V" {*7C^#V* {^#V<&!S͊=* {^#V͍6!Pw>l779`^#V""{!${"&{!"${*"{~*&{w*${ruq!U͊=Û͇!({;!GG({x͛:ʙ>ɯB^#V^͞#V ͪͪ"  Later CP/M or MP/M Version Required$*}**}{ozg|g}o!\!l!*:3>:͞!L*3>͞K* !*ͤ͞ ͤ  >  ͤͤͤͤͤͤͤͤͤ͞ͲͲͲͤͲͲ Ͳ͞ Ͳͤ!Ͳͤ"Ͳͤ#Ͳͤ$ͻͤ%ͻͤ(ͤ1^#V#^#V́"> ́"> > ́">́{2> ́"́">́"> 2!2`iPY*}~##~#fo##^#V#{_z/!T]W{_z<KB ^#V^#V)F<*}!9{ozg| #~wþ))o |O#"9C[4BZ!9SJ~#$:> $J&9}x2LCy j2MC"){AE$:RC+-/x2LCy2MC"){Aͯ:LC!MCP& G7!9~#$&*){7<$2;C2PC2SC<2KC!9 V+iv-v>2PC#ҏ… ʉ ,v.¦#Ҧ,×eʰE+-#2QC$!LC5¡:MC!OC<_!;C>w w>+!NC~5>. G:QCx0:NC> !PC~ 5!NC4!KC5-2QCx!KC^4{# # !;C~0>0"+{*9C~2/{:PCA Ϳ"A <:/{20{>Vͬ"!0{S 5~/o :SC‰ >9ͬ"ʉ >*ͬ"w  y *:0{!9q#=€ Ï">21{<22{23{ 2.{:2{_:/{"*9C~2-{:-{9 :1{ :1{21{͟" :3{=O:1{##:3{O:.{#͖"Õ Z *A!O:1{!y21{:1{)!:.{0)!:3{O:-{*#!> #;!:1{21{:3{O:.{#͖"Õ :-{͟"!:-{"†!:-{"o!:3{O:-{##͖"Û :-{21{:3{O> #͖"Û :1{!:.{0¢!:3{O> #!:3{=O:-{##:3{O:.{#:1{21{!:3{O:.{#͖"Õ :-{V":1{":1{21{͟"":3{=O:1{##:1{ "<21{͚"Û :3{O:-{"H":1{3":-{B="?":1{*?"> #͖"Û :3{O:-{CV"D:PCi"> # #Æ":-{C}"# >R#Æ"# >B#͖"͖"Û :0{*+{!3{4!2{4S+-$G:/{Ox*9C## ¶"<>Sͬ">+ͬ">-ͬ">Cͬ">Dͬ":/,.B!2{N*9C# Ⱦ"G:2{_:/{O x*9C# Ⱦ#!i#9w$G:PC8#x+-L#SF#x+L#-SI#>+>-> F$ h#x=b#G#O# #:kCx#ډ#!ZCxO#ډ#$O#'O# £#O#> $Õ# µ#x¯#>$O# ##O#x#>O#='#$x!XC#$#:iC#$:XC> $#>29{!7{K':iC+$!XC+$> 3$> 3$3$26{!4{'!:{Ú=ê$$^$^#Vʃ$a$ͪ$F$#F|$#N|$#^#r+s#^#V++r+s~F$5F$$5^$q#pF$O$4~ $_$s#r#s#r#q!$Ú=$$C$$ Format Overflow*C-&C![{.%O:Cy+%!9G'%~#'%%y.%O:C=%Æ%͹%F%{N%*iC|w%j& *iC*XC<#<> %> %͹%> %{=>'%!9ʨ%=~#'¡%{>'%%Ì%{=>'%{>b%*XC++|2{!{'ɯ%>%>2|" |" |`i" |!9"|!{%[| ~# %*[|~n&*[|~C&!U|>;G3!!!C(!C"i|!g|͋*k&!U|>;G3!R.!!C(!C"m|!k|͋*À&*]|"o|!o|͋*!q|(*a|^#V!aCs#r*c|^#V!cCs#r*_|^#V:|*qC:|G&!u|('*_|^#V}*qC}G&!w|(':C '*_|^#V}*qC}G '!y|(':C''*_|^#V}''!{|('^#V"}|!C"|*}|"|!|͚=2|!|K'^#V"|:CZ':C'*|'*|5!|6:| ʀ'ͳ'r'a'ò'!|'*|'*|5!`C6!|':`Cʯ'*|6Ì'g,2|:|'!C"|!"|!|͚=!XC6#6!|6 :C'!|'^#V"|!TC"|*|"|!|K1%(!C"|!"|!|͚="((:C(*|~ ?(*XC#"XC(*|~ S(!XC6#6(:C(*|~ u(*\C#"\C!ZC6#6(*|~ (*ZC#"ZC!ZC#(!ZC6#6*ZC*kC#<|(!C"|!"|!|͚=('!`C6"|!9"|!|(! 9^|~# (*|^#V|)*|*| r:*| nb5)*| !|>=;O)!|>;*|:!|;*|~#{)*|^#V)))|{)*|6P#6*|~#µ)*|^#V))|)*|6#6õ)*|6<#6*|6#6*|6#6*|6#6*| 6*|^#V}4}2|*|^#V} *!|44*|^#V}"*>2|*|^#V}M**|~#M**|6#6*|"|*|"|*|"|!|(0*|^#V|Š**|"|!"|!|͚=^#V^#VOA:Cڨ*!*͚=2CO!C·*6ü* +~#w!C s#r!C4A**C** I/O Stack Overflow!9"|!|*+!9$>'+%~T]O ++~+>x^#V"|*|6͌+;,T+!C"}!" }!}͚=M,]+^,2}:}+,ͩ+:|> b€+,Æ+ͩ++>,;,+V,+D,+Ì+V,+:}+^,+,^,++D,+M,+,,é+!`C6M,+V,+D, ,:|!`Cw,+g,2|*|~!,:|*|#*|~ogw*|4:|:| :|,:| ?:|':`C‡,!TC"}! }81,! }6Ò,:`C2 }!`C6: } ڡ,*XC#"XC: } ±,!XC6#6: }"3" 3*3^#V#"3^#VͿ,,"$3,"(3|,|~Ϳ,,ya-A =.:;<>[]y *"3, -(-,$-,1J- o&))))\xH  g-#w g--"-*(3#ʖ-AҖ-G-,:ʛ- 6à-p4-+4--#,-#*½-6?-w-¬-,---#6 -..- 4-.,.#*-6?.w--,.-.#6 .%#6.*(3##^ ~?1.# *.xCON CON RDR PUN LST M!L. ~"-$.-,1ҕ.\|.l.$.!~ .-!9.,°. ʾ.-#Ý.x=GÚ.->ɯ*(3+.^#V.#{#z.6#6. r+s!}F#~*/!}6P  eA eA!}^r+s6 #6 !}4^N*(3|Z/}=G/.V/R.R/O>~f/f/>ͨ/N*(3|’/YR.=/y‹/eAÎ/>~ʞ/=ʞ/>ͨ/q2-3*(3/"*3./{..**3*(3#:-3O/.#s#r/../.è/.r+s{0!'34**3+>|0+}o͵,Ϳ,~2&3Ϳ,""3,:&3.1[.a0G:&3.1*$3p[04#63,:&3|00*3++"3Å0}+ʉ00}|23"3,0"31F<|.1##"(36*$3s#rv-š2{ ʚ2*(3:&3w060*3"3<1:&3š20<ʚ2!"3*(3(3w# 1*(3~#3*(3 B>3*$3w#w3͵,,34/Ϳ,q3͵,,3Ϳ,Nm/3*(3~" 4#4#4͵,,3~Œ11K43.>13͵,,3~.>13*(3~ʹ1>31P43*(3!*~!/2,3*(3|1(^#V,,{z1z]22'3z(2:,324/q#2Nm/#2*(3|]2*~]2=!'3Z2:,3ͨ/W2S2w:2^1>͵,,3|}3~> 3<3͵,,3|”2*$3w=3*(3$B*$3^#V6+6++<3͵,,3>3"N#F#~Ϳ,q#p#w>3͵,,3>3*~,!2=2>!*(3" s#r#w=3* 3 }!m}6 4>2l}*i}!4#4#4~#N#F#y#x#:l}*i}!!:k}ʈ3]3G3:m}~G~#~O?3#~3! p! y! q<33.3~3#!!3! 6?<04= _!x$4*4FN4wxG>O>G!$q#p#6R4"f}"i}2h}x2k}.32l}>3!h}~54m3ʘ4=4:k}4*i}<˜4G34*f}:k}O*i}:m}´4y O4:k}G3*f}w# 4N3:l}4*i}!]343*f}"f}g4:l}/g.>Gx|g}o5@5!9VzwzO#5<599! 9/GO~9O9~q+d5!96#=w5O!9Fx7yҮ5! 9~WwzO+›55_ /!9~#=557"n}>6*n}"p}56*p}"p}56*p}G!9!xb6 ]6+/6$%?'w#6-!9~R7&7~#R77! 9~.87+60D70D76 #,7+r>o&9y>o&90w+i76.7w#Ì7 O~#¢7Gxڵ77 9> 79#7!9!97>?'w#7!9͛8! 9͛89! y@88!9o>g~18Gx8f848!9!w# L898!9!9!'#s8!9^{w{W#‡8~W8~+¶8ê87>?'w# þ88!9~#88!99#8>/?'w#•9'w#¦97>?'w##´9^{w{W#9!9Ú=9999!9MD^#V# + w9ȇ :):Wf.0:r~#fo0:s#r!>O @:)8:|W}_ W:|}o|gG:yx/Wy/_{zW{_e:yw# r:~#É:~#W #ÿ:F#"r}x;:*r}!9G_>WObk++:~+:y~#//); ;=;);ɯo>g{ozg!<Ú=<<=!C{#z*aC*cC@xyx >c>_!?^#Vͺ>]>>(_>y͖>>)_>|@>R>'?|L>R>ͺ>>B>,_>]>> _eA eA eA0:_>_>m>m>]>|{>}{> ڦ>dԨ> ͨ>ڳ>ê>xm>N #~_>ü>!?ͺ>*}!9{_z>{> ?>]>>#_>*}>=^#V#͇>??>: "?>?_>!?ͺ>ͺ>>=_>^#V|W?}N?.))@ú>#F>A?> #r?~ >.?~ ?=c?^#V# File: Traceback:???????@ ERROR FIXED OVERFLOW OVERFLOW UNDERFLOW ZERO DIVIDE END OF FILE UNDEFINED FILE KEYNULCONCONRDRPUNLSTBADG!C~N@3@B Condition Stack Overflow$4Ox!t} w#s#r#s#r!9!C s#r!CN!t} +++++‡@#{ @#zʥ@++~Ç@++!C5!~# ´@ð@!CN!t} +++++@#~#@+{@#z@++~@#^#V=!C~OA5:C_!C^#V"CTC.~# !A*qC)))))C )| 6A*TC|}*D"XC:C*CTCw# \A*D{ vA zA!#"DìACopyright (c) 1980 Digital Research, v1.3 !"}"}"}2C2C*} A"}q#p##}o"}*}o|ABB+w+w+r+s4w#w#s#r<2}++*}s#r"}*}#"}*}DM!}x~¾B#~+¾B+F+Nq#p*}+"}ʹBҼB=oB!+~O~#~G!/x—ByʴB >O6# ŽB ~B=ɯ ~#fo++-B!}~#B*}$BBCBC  Insufficient Memory$ Invalid I/O List End of Execution$(CdSYSINSYSPRINT    30INITDIR WILL ACTIVATE TIME STAMPS FOR SPECIFIED DRIVE.1Do you want to re-format the directory on drive: Do you want the existing time stamps cleared0Do yovers equ '0a' ; March 1, 2017 19:20 drm "WIN3KP.ASM" ;********************************************************* ; Winchester Disk I/O module for CP/M 3.1 on KAYPRO ; Copyright (c) 2017 Douglas Miller ;********************************************************* MACLIB Z80 extrn @dph,@rdrv,@side,@trk,@sect,@dma,@dbnk,@dstat extrn @dtacb,@dircb,@scrbf,@rcnfg,@cmode extrn ?bnksl,?timot,?getdp false equ 0 true equ not false ; Ports and Constants sysctl equ 014h ;winchester disk control bits dev0 equ 50 ; first drive in system ndev equ 2 ; # of drives is system ; ********************************************************* ; * * ; * D a t a D e f i n i t i o n s * ; * * ; ********************************************************* ; windta equ 80h ;1002 data port winpcmp equ 81h ;1002 precomp port winerr equ 81h ;1002 error port winsc equ 82h ;1002 sector count port winsec equ 83h ;1002 sector number port winlsb equ 84h ;1002 lsb of cylinder port winmsb equ 85h ;1002 msb of cylinder port winsdh equ 86h ;1002 size/drive/head port winstat equ 87h ;1002 status port wincmd equ 87h ;1002 command port ; rstcmd equ 10h ;1002 restore command seekcmd equ 70h ;1002 seek command rdcmd equ 20h ;1002 read command wrcmd equ 30h ;1002 write command ; wincfg equ 10100000b ;ecc and sector size bits nosel equ 10111000b ;winchester de-select ; TODO: abstract all this to allow other drive types ; ST412 drive parameters (as used by Kaypro): ncyl equ 306 ; total number of cylinders lcyl equ ncyl-1 ; last cylinder number pcmpcyl equ ncyl/2 ;starting precomp cylinder number nhed equ 4 nsec equ 17 zsec equ 512 fsec equ zsec/128 ;--------- Start of Code-producing Source -------------- cseg ;put only whats necessary in common memory... dw thread db dev0,ndev jmp init$win jmp login$win jmp read$win jmp write$win dw string dw dphtbl,modtbl string: DB 'KAYPRO ',0,'Winchester Disk Interface ',0,'3.10' dw vers db '$' ; Both partitions use cyls 0-305, but different heads. ; head = (PTN << 1) + (track & 1) ; track >>= 1 modtbl: ; -PTN LUN--------addr------------- DB 10000000b,00000000b,00000000B,00000000B ; db 11111111b,11111111b,11111111b,11111111b DB 10000001b,00000000b,00000000B,00000000B ; db 11111111b,11111111b,11111111b,11111111b ; currently, both (all) partitions are identical, ; due to head-slice algorithm for partitioning. dpb0: dw nsec*fsec ; SPT db 5,01fh,1 ; BSH,BSM,EXM dw 1125,1023 ; DSM,DRM db 0ffh,000h ; ALV0 dw 08000h,4 ; CKS,OFF db 2,003h ; PSH, PSM ; Controller is already done by now win$rw: lda cmdbuf ani 010h mvi a,0b2h ; inir jrz nread mvi a,0b3h ; outir nread: sta here+1 lda @dbnk call ?bnksl lhld @dma lxi b,windta mvi e,2 here: inir dcr e jrnz here xra a call ?bnksl ret offline db 0 ; fatal error prevents use cmdbuf db 0 romid db 0 thread equ $ dseg ; HASH/HBANK is set by main bios... dphtbl: dw 0,0,0,0,0,0,dpb0,0,alv0,@dircb,@dtacb,0 db 0 ; HBANK dw 0,0,0,0,0,0,dpb0,0,alv1,@dircb,@dtacb,0 db 0 ; HBANK alv0: ds 512 ; really only need about 283 alv1: ds 512 ; ; driver init init$win: xra a sta offline lda 0050h ; gift from loader: ROM id sta romid ; TODO: move to login code, for each LUN... call winrest ret login$win: lda offline ora a rnz ; This should prevent read/write from ; ever being called ; TODO: check init flag (per LUN, not partition) ; and call winrest (anything else?). ; Could always select LUN and test READY. ret setup$win: lhld @cmode mov a,m ; PTN ani 00000011b ; max 4 partitions add a mov b,a ; -----HH- inx h mov a,m ; LUN ani 01100000b ; only 4 LUNs, not 8 rrc rrc ; in position for SDH ora b mov b,a ; ---DDHH- lda @trk ani 1 ora b ; ---DDHHH ori wincfg ; eSSDDHHH out winsdh call winrdy rz ; timeout mvi a,pcmpcyl out winpcmp ; This is horrible, but since 302C ROM does it ; we also must to keep compatible on disk: ; if (trk > 7) trk += 4; ; else if (trk >= 4) trk += (trk - 4); ; trk >>= 1; ; putCyl(trk); lhld @trk lda romid cpi '3' jrnz setup2 mov a,l ani 11111000b ora h jrz setup1 lxi d,4 dad d jr setup2 setup1: mov a,l cpi 4 jrc setup2 sui 4 add l mov l,a setup2: ora a rarr h rarr l mov a,l out winlsb mov a,h out winmsb lda @sect out winsec mvi a,1 out winsc ora a ret read$win: mvi a,rdcmd sta cmdbuf call setup$win jrz error ; timeout on READY lda cmdbuf out wincmd call winbusy jrz error ; timeout on BUSY in winstat bit 0,a jrnz error ; ERROR set bit 3,a jrz error ; no DRQ ; no more errors from here on... call win$rw ; xfer from common memory... xra a ret write$win: mvi a,wrcmd sta cmdbuf call setup$win jrz error ; timeout on READY lda cmdbuf out wincmd lxi d,0 mvi h,3 write1: in winstat bit 3,a ; DRQ jrnz write2 call timer jrnz write1 ; timeout - no failure here? we'll get error from winbusy? write2: call win$rw ; xfer from common memory... call winbusy jrz error in winstat bit 0,a ; ERROR jrnz error xra a ret error: ; possible retry... ; possible recovery - step, restore, etc. xra a inr a ret ; ; WD 1002 interface routines. ; ; Written by: T. Hayes ; ; These routines provide the physical interface between the system ; and the WD 1002 winchester controller. ; winrest: ; ; Reset and restore the winchester disk ; ; On entry: ; B contains the configuration byte of the drive to be accessed ; ; On exit: ; A and B contain the configuration byte altered as follows: ; Bits 2 and 3 will be set if the drive is off line ; or reset if the controller is ready ; ; in sysctl ;first issue a controller reset setb 1,a out sysctl push psw ; mvi h,1 ;hold reset for > 50 ms lxi d,0 winrest1: call timer jrnz winrest1 pop psw ; res 1,a ;select controller (MR off) out sysctl ; mvi h,3 lxi d,6000h winrest11: in winstat ;Check busy bit 7,a ; jrz winrest3 ;go on if not busy ; call timer ;else count down jrnz winrest11 ; disable: xra a dcr a sta offline ; disable drive... ret ;and return that status to caller winrest3: in winerr ;check for diagnostic errors cpi 1 ;if error jrz winrest31 ;ignore "diagnostic only" errrors ; ana a ;believe all others jrnz disable ;abort if an error shown ; winrest31: call winpsel ; call winrdy ;ready wait jrnz winrest32 call winrdy ;wait for device ready (again?) jrz disable ;abort if timed out (twice) ; winrest32: mvi a,rstcmd ;issue the restore command out wincmd ; call winbusy ;wait for not busy jrz disable ;abort if timed out ; in winstat ;get device status ; bit 0,a ;if there was an error jrnz disable ;abort winrest6: xra a sta offline ret ;return that status to caller ; winpsel: ; ; WD 1002 physical select routine ; ; TODO: get LUN from somewhere... (head too?) ; for now, assume only LUN 0. ; xra a ori wincfg ;select ecc and sector size options ; out winsdh ;and issue the select ret ;return to caller timer: ; ; General down counter routine ; ; On entry: ; HDE are a 24 bit counter ; On exit: ; The counter will have been decremented ; zero is set if the counter is done ; zero is reset if the counter is not at 000000h ; ; Typical timings are 25 t states in the loop with an additional ; overhead of 29 t states in the calling routine. This assumes ; that the calling routine is using a call xxx and jr nz,xxxx. ; This gives a time of 13.5 usec for each iteration of the loop. ; Times when de goes 0 will be marginally longer but should not ; be significant. ; dcx d mov a,d ora e rnz dcr h ret ; TODO: make use of this somehow... winoff: ; ; If the 1002 is not at 305, seek track ; 305 then select physical unit 3. It is assumed that ; the host buffer has been flushed. ; in winlsb ;see if the drive is at 305 already cpi high lcyl jrnz winoff1 in winmsb cpi low lcyl jrz winoff2 winoff1: ; mvi a,high lcyl out winmsb mvi a,low lcyl out winlsb ; mvi a,seekcmd ;now issue a seek to that cylinder out wincmd ; ret ;return to caller winoff2: mvi a,nosel ;now deselect the drive out winsdh ; ret ;and return to caller winrdy: ; ; Wait for device ready ; mvi h,5 lxi d,0 winrdy1: in winstat ;check for ready bit 6,a rnz ;return if it is ; call timer ;else count down rz ;return if timed out jr winrdy1 ;else try again ; ; winbusy: ; ; Wait for device not busy ; mvi h,7 ;set up dead man counter lxi d,0 winbusy1: in winstat ;get status cma bit 7,a ;if not busy rnz ;return call timer ;else count down rz ;and return if timed out jr winbusy1 ; end NB: IN fdcstat ; poll controller for function-complete RAR ; Busy? JRC WNB ; wait until not busy. RAL STA @dstat ;SIZE POPRET: POP d mvi a,0 ;signal "no error" to BDOS. jrz done ; RETURN IF CORRECT JR TRYAGN ; RETRY IF INCORRECT IOERR: POP B JM ERROR ; ERROR IF NO READY SIGNAL TRYAGN: LXI H,RETRYS ; decrement retry count DCR M JZ ERROR ; NO MORE RETRIES MOV A,M CPI 10 JNC RETRY ; LESS THAN TEN RETRYS LEFT => STEP HEAD LDA SELOP ORA A jnz RETRY ; DO NOT STEP HEAD IF SELECT OPERATION PUSH d ; SAVE REGISTERS CALL STEPIN ; STEP IN COMMAND CALL SEEK ; SEEK WILL REPOSITION HEAD POP d JMP RETRY ; TRY AGAIN rtbl: db 128 ;128 bytes dw rd1 db 0 ;256 bytes dw rd1 db 0 ;512 bytes dw rd2 db 0 ;1024 bytes dw rd4 type$II$com: ;command in E mov a,e ani 00100000b ; 1 if write rlc! rlc! rlc ; 0000000w ori 0a2h ;A2/A3 for INI/OUTI sta rd12+1 sta rd22+1 sta rd32+1 sta rd42+1 call setside sspd savSTK ; lxi sp,rwSTK ; lda blcode mov c,a add a ; *2 add c ; *3 lxi h,rtbl mov c,a mvi b,0 dad b mov b,m inx h mov c,m inx h mov h,m mov l,c push h jmp type$II$ext SELECT: mvi c,0 mvi b,dev0 call ?timot ;clear any pending "motor off" LDA @rdrv ; get the RELATIVE drive number MOV C,A ; relative drive number in (C) (rel. to driv0) lhld cmode INX H ; POINT TO MODE BYTE 2 inr a ; 1,2,3,4 cma ; 111111xx ani 00000011b ; 2,1,0,3 bit 4,m ;single density ? jrnz se1 ori 00100000b ;select single density data rate. se1: ori 00010000b ;motor on, also mov e,a di in sysctl ; ani 10011100b ora e ; out sysctl ; ei dcx h MOV A,M ANI 00001100B ; setup steprate bits for seek-restore commands rrc rrc STA STEPRA ; RATE FOR SUBSEQUENT SEEK/RESTORE LXI H,LOGDSK ; save position (track) of current drive MOV E,M ; in 'trks' array addressed by contents of MOV M,C ; location 'logdsk'. MVI B,0 MOV D,B LXI H,TRKS DAD D IN fdctrk MOV M,A ; SAVE CURRENT TRACK # LXI H,TRKS ; identify position (track) of requested drive DAD B ; from 'trks' array addressed by new 'logdsk'. MOV A,M OUT fdctrk ; set track number mov a,c sub e ;same drive as last time? sui 1 ! sbb a ;.true. if same drive cma di lxi h,motor$off ;if diff. drive, must check ready. ora m ;if same but motor off, must check ready. mvi m,true ;this prevents the motor from being turned off sta mtflg ; test drive for ready. cma ! ora a ;[NC] jrnz fb3 ;[NZ] if motor still on. ; mvi a,11010000b out fdccomd in fdcstat mvi b,10 ;must be ready within 10 rev. fb1: call find$NE lxi d,Ivers equ '0c' ; March 5, 2017 08:39 drm "LDCPM3.ASM" maclib Z80 cpm equ 0 bdos equ 5 tbuff equ 80h msgout equ 9 reset equ 13 openf equ 15 read equ 20 sdma equ 26 lf equ 10 cr equ 13 org 100h LOADER: ; ***** this should be part of COLD BOOT in CPM3LDRK ; lxi h,0fd74h ; lxi d,00040h ; lxi b,16 ; ldir ; ***** ; ROM 81-292 uses 0fd74h ; U-ROM 81-478 uses 0fe9ah ; ROM 81-302 uses 0fd5ch ; Identify ROM by... ; we can't map ROM in, we are in low memory. ; can't call ROM, either. ; U-ROM places '2.01' in 0fff8h... ; 81-292 places copyout in 0fde5h (DB 14 CB BF D3 14 ED B0 DB 14 CB FF D3 14 C9) ; 81-302 places copyout in 0f919h (DB 14 CB BF D3 14 ED B0 DB 14 CB FF D3 14 C9) call chkuni lxi h,0fe9ah mvi a,'U' jrz gotrom lxi h,0f919h call chksig lxi h,0fd5ch mvi a,'3' jrz gotrom lxi h,0fde5h call chksig lxi h,0fd74h mvi a,'2' jrz gotrom lxi d,badrom mvi c,msgout call bdos jmp cpm gotrom: shld romcrt sta romid lxi d,rommsg mvi c,msgout call bdos mvi c,reset call bdos MVI C,openf LXI D,cpm3$sys CALL bdos CPI 255 LXI D,nofile JZ errmsg LXI D,tbuff CALL dmaset CALL readfile LXI H,tbuff LXI D,topres lxi b,6 ldir CALL readfile MVI C,msgout LXI D,tbuff CALL bdos LDA reslen MOV d,A ; LDA topres mvi e,0 lxi h,buffer dad d shld resend xchg call loadf LDA bnklen ORA A JZ nobnk MOV d,A ; LDA topbnk mvi e,0 lhld resend dad d shld bnkend xchg CALL loadf nobnk: di ; ***** this should be part of COLD BOOT in CPM3LDRK lhld romcrt lxi d,00040h lxi b,16 ldir lda romid stax d ; ROM identifer char at 0050h ; ***** lda reslen mov b,a ;B=reslen mvi c,0 lhld resend dcx h lda topres mov d,a mvi e,0 dcx d lddr lda bnklen ora a jz nobnk0 mov b,a mvi c,0 lhld bnkend dcx h lda topbnk mov d,a mvi e,0 dcx d lddr nobnk0: lhld cstart pchl loadf: ;ORA A ;DE = top address (max+1) ;MOV D,A ;MVI E,0 MOV A,H RAL MOV H,A read0: XCHG LXI B,-128 DAD B XCHG PUSH D PUSH H CALL dmaset CALL readfile POP H POP D DCR H JNZ read0 RET dmaset: MVI C,sdma CALL bdos RET readfile: MVI C,read LXI D,cpm3$sys CALL bdos ORA A LXI D,rderr RZ errmsg: MVI C,msgout CALL bdos jmp cpm chkuni: lxi h,0fff8h mov a,m inx h cpi '2' rnz mov a,m inx h cpi '.' rnz mov a,m inx h cpi '0' rnz mov a,m inx h cpi '1' ret ; HL = prospective location chksig: lxi d,signature mvi b,siglen chk0: ldax d cmp m rnz inx h inx d djnz chk0 xra a ret cpm3$sys: DB 0,'CPM3 SYS',0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0 nofile: DB cr,lf,'error: File not found: CPM3.SYS',cr,lf,'$' rderr: DB cr,lf,'error: Read failure: CPM3.SYS',cr,lf,'$' topres: db 0 reslen: db 0 topbnk: db 0 bnklen: db 0 cstart: dw 0 resend: dw 0 bnkend: dw 0 signature: in 014h res 7,a out 014h ldir in 014h setb 7,a out 014h ret siglen equ $-signature badrom: db cr,lf,7,'Unknown ROM version!',cr,lf,'$' rommsg: db cr,lf,'Got ROM id ' romid db '.',cr,lf,'$' romcrt dw 0 buffer: ds 0 end ake use of this somehow... winoff: ; ; If the 1002 is not at 305, seek track ; 305 then select physical unit 3. It is assumed that ; the host buffer has been flushed. ; in winlsb ;see if the drive is at 305 already cpi high lcy htflag ora a ; CHECK HALF TRACK mode MVI B,01001000B ; STEP IN WITHOUT UPDATE CNZ TYPE$I ; STEP A SECOND TIME (W/O UPDATE) FOR HALF-TRK MVI B,01011000B ; STEP IN AND UPDATE TRACK REGISTER JR TYPE$I HOME: ;POSITION HEAD AT TRACK ZERO... mvi a,11010000b ;force TYPE$I status out fdccomd in fdcstat ANI 00000100B ;TEST TRACK ZERO SENSOR, JRNZ @TRK0 ;SKIP ROUTINE IF WE'RE ALREADY AT TRACK 0. IN fdctrk ;DOES THE SYSTEM THINK WE'RE AT TRACK 0 ?? ORA A JRNZ HOME1 ;IF IT DOESN'T, I 7530 = vers equ '0u' ; June 28, 1986 11:30 drm "MBIOS3KP.ASM" ;**************************************************************** ; Main BIOS module for CP/M 3 (CP/M plus) on the KAYPRO computer* ; Copyright (c) 1985 Douglas Miller * ;**************************************************************** maclib Z80 FFFF = true equ -1 0000 = false equ not true 0038 = bnksiz equ 56 ;size of banks, in "K". Either 48 or 56. 00E0 = compag equ bnksiz*4 ; C0 or E0, for MMU common page select E000 = bnktop equ compag shl 8 ;C000 or E000 000D = cr equ 13 000A = lf equ 10 0007 = bell equ 7 0000 = cpm equ 0 0005 = bdos equ 5 0100 = ccp equ 0100h ; Console Command Processor gets loaded into the TPA ; SCB registeru want to recover time/date directory space (Y/N)? YyABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzEnd of PASS 1. ERROR: INITDIR TERMINATED. Requires CP/M 3.0 or higher. Directory already re-formatted.Not enough room in directory. Wrong password.No time stamps present. Not enough available memory. Disk is READ ONLY. Cannot find last XFCB. 3Cannot re-format the directory with RSXs in memory. Unrecognized drive.Cannot select drive.! ABCDEFGHIJKLMNOPDRIVE: Enter Drive: :Directory is password protected.Password, please. >w'xFwwww5xwwwxwwwwwwwwGwwwxxwxxwwxx2:<** "_?:<2>!/:<}:2* ~b W6 y2> # vwm>2>!O ?A*2|?*2!!mE9P1?!:o&HPʨ@:Ko&!9s!:Ko&Q}2K:3o&|ʎ@!DMu?`i#DM`i*2sP?!`i)2^#V#s:3o&`i)2^#V##n&s:3o&`i)2~#fos#rp?:!3o&#}2!3!ͭB~D!ͭB;DO?A*2|@*2!!mE9P @!!DM-@`i#DM`i*2sPʋ@!`i)2^#V#s:3o&`i)2^#V##n&MQs:3o&`i)2~#foMQs#r(@Ü@:3o&|ʜ@cN!9^}2KTNï>! 9~@*M5K!"M*2O!@#*2sPA)2^#V##^1bCP/M Version 3.0COPYRIGHT 1982, DIGITAL RESEARCH151282654321NAMES~VALUES~HELP~CON:~CONIN:~CONOUT:~LST:~AUX:~AUXIN:~AUXOUT:~CONSOLE~KEYBOARD~PRINTER~AUXILIARY~AXI:~AXO: &+07?GPXbgkXON~NOXON~NULL~50 ~75 ~110~134~150~300~600~1200~1800~2400~3600~4800~7200~9600~19200 #'+/49>CHMRWCOLUMNS~LINES~PAGESIZE[]=, NONE 50 75 110 134 150 300 600 1200 1800 2400 3600 4800 7200 9600 19200"$*&("*&(INPUT $OUTPUT $SOFT-BAUD$SERIAL $XON-XOFF $Error at the '^'; $Error at end of line; $Invalid number$End of line expected$Invalid delimiter$Invalid option$Baud rate can not be set for this device$Invalid physical device$Physical device does not have input capability$Physical device does not have output capability$Physical device does not have input/output capability$A NULL device can not be assigned to CONIN$Ambiguous assignments to a NULL device are not allowed$Physical Devices: $I=Input,O=Output,S=Serial,X=Xon-Xoff $ $ Bad Logical Device Assignment; $Physical Device Does Not Exist$ $File$Null Device$Current Assignments: $CONIN: = $CONOUT: = $AUXIN: = $AUXOUT: = $LST: = $Console width set to $ columns Console page set to $ lines $CONIN: = $CONOUT: = $AUXIN: = $AUXOUT: = $CONIN: = $CONOUT: = $AUXIN: = $AUXOUT: = $LST: = $Physical Device: $Baud Rate: $Characteristics: $PARALLEL$Requires CP/M 3.0$Device Reassignment Not Supported$Enter new assignment or hit RETURN $1b1b͏}0͏|HX "g:>gH|!"}Z :: H:H|b>g–X͘2e͘2f.x*gDM -²A/;SX }h2i !~6 *i& 6~A/!l6:i!l5*l&~ Nͬ *l&~ w:l<2l :i2dbv!q*&! p+q* ! s+p+q* : w#6*  * #" N#Fy ! q: 2!61!q:2!61!s+q:2!6*&"1!r+s+q:2!6*s extrn @covec,@civec,@aovec,@aivec,@lovec,@ermde extrn @mxtpa,@sec,@min,@hour,@date extrn @lptbl ; External routines extrn ?getdp,?serdp ; Variables for use by other modules public @adrv,@pdrv,@rdrv,@side,@trk,@sect,@login public @dma,@dbnk,@cnt,@scrbf,@dtacb,@dircb public @dstat,@cmode,@dph,@rcnfg public @ctbl,@cbnk,bnkdos,resdos,wbtrap public @vect,sio1vec,sio2vec,piovec ; Routines for use by other modules public ?timot public ?dvtbl,?drtbl public ?bnksl,?stbnk ********************************************************* ** I/O port base addresses ********************************************************* 0004 = sio1 equ 004h ;z80-sio/0 000C = sio2 equ 00ch ; " 0020 = pio equ 020h ;modem and rtc functions 0024 = rtc equ 024h ;real-time clock 0010 = fdc equ 010h ;floppy disk controller 003F = mmu equ 03fh ;memory management 0014 = sysctl equ 014h ;system control (and floppy disk control bits) ********************************************************* ** SIO's ********************************************************* 0004 = sio1datA equ sio1+0 0006 = sio1ctlA equ sio1datA+2 0005 = sio1datB equ sio1+1 0007 = sio1ctlB equ sio1datB+2 000C = sio2datA equ sio2+0 000E = sio2ctlA equ sio2datA+2 000D = sio2datB equ sio2+1 000F = sio2ctlB equ sio2datB+2 ********************************************************* ** PIO ********************************************************* 0020 = pioAdat equ pio+0 0022 = pioActl equ pioAdat+2 0021 = pioBdat equ pio+1 0023 = pioBctl equ pioBdat+2 ********************************************************* ** RTC (MM58167 Real-Time Clock) ********************************************************* 0024 = RTCDTA equ RTC 0020 = RTCADR equ pioAdat 0002 = RTCSEC equ 2 0003 = RTCMIN equ 3 0004 = RTCHRS equ 4 0005 = RTCDAY equ 5 0006 = RTCDAT equ 6 0007 = RTCMON equ 7 000A = lastmon equ 10 ;month last accessed (used to detect year change) 0008 = rtcyrs equ 8 ;years (decade) 0009 = rtcent equ 9 ;century 0012 = clrcnt equ 18 0014 = rtcsts equ 20 0010 = rtcis equ 16 ;interupt status 0011 = rtcic equ 17 ;interupt control ; NETWORK DISK OPERATING SYSTEM FOR CP/NET on CP/M Plus v3 ; ; 1982.12.31. exact date unknown ; 2016.05.20. adapted for RSX on CP/M Plus ; Dropped support for remote console/list, due to BIOS intercept issues. ; BIOS intercept is a problem because of the transient nature of RSXs. ; Could add back support for "well-behaved" LIST OUTPUT users, ; provided BIOS intercept is not required. ; ;TITLE NETWORK DISK OPERATING SYSTEM FOR CP/NET SLAVE maclib z80 extrn NTWKIN, NTWKST, CNFTBL, SNDMSG, RCVMSG, NTWKBT, CFGTBL ; ; ; EQUATIONS OF DATA ; LF EQU 0AH ;LINE FEED CR EQU 0DH ;CARRIAGE RETURN EOF EQU 1AH ;CTRL-Z IS END OF FILE LEOF EQU 0ffh ;-1 is logical end of file ; TOP equ 0000h CDISK equ 0004h BDOS equ 0005h SYSDMA equ 0080h TPA equ 0100h SCTLNG equ 128 ;ONE SECTOR LENGTH ; ; EQUATIONS OF DOS FUNCTION ; CCNDIN EQU 3 ;CONSOLE INPUT WITH DEVICE CODE CCNDOT EQU 4 ;CONSOLE OUTPUT WITH DEVICE CODE CBUFPR EQU 9 ;BUFFER PRINT CRDBUF EQU 10 ;READ BUFFER CCONST EQU 11 ;GET CONSOLE STATUS CGETVR EQU 12 ;GET VERSION NUMBER CRSDSK EQU 13 ;RESET DISK COPEN EQU 15 ;OPEN FILE CCLOSE EQU 16 ;CLOSE FILE CSRFST EQU 17 ;SEARCH FIRST CSRNXT EQU 18 ;SEARCH NEXT DIRECTORY CREAD EQU 20 ;READ SEQ CWRITE EQU 21 ;WRITE SEQ CSTDMA EQU 26 ;SET DMA ADDRESS CGTALL EQU 27 ;get alloc vector addr CGTDPB EQU 31 ;get DPB addr CSTUSC EQU 32 ;SET USER CODE CRREAD EQU 33 ;READ SEQ CRWRIT EQU 34 ;WRITE SEQ CRSDSN EQU 37 ;RESET DISK BY DISK VERCTOR CFRSP equ 46 ; get disk free space scbf equ 49 ; get/set SCB CBIOS equ 50 ; direct BIOS call COVLY equ 59 ; load overlay CRSX equ 60 ; call RSX function CDEFPW EQU 106 ;set default password CLSBLK equ 112 ; List Block - does not fit in table... CBMAX EQU 50 ;MAX OF BDOS FUNCTION - CXMIN.. collapsed here CXMIN EQU 98 ;extended bdos functions base - collapse into CBMAX ; CNMIN EQU 64 ;MIN OF NDOS FUNCTION CLOGIN EQU 64 ;LOGIN CLOGOF EQU 65 ;LOGOFF CNMAX EQU 72 ;MAX OF NDOS FUNCTION ; ; SLAVE CONFIGRATION TABLE ; ; -1 NETWORK STATUS ; 0 SLAVE PROCESSOR ID ; 1-32 A - P DISK DEVICE CODE ; 33-34 CONSOLE DEVICE ; 35-36 LIST DEVICE ; 37 LIST BUFFER COUNTER ; 38-42 MESSAGE HEADER FOR LIST OUT ; 43 LISTER DEVICE NUMBER ; 44-171 LIST OUT DATA BUFFER ; ; EACH DEVICE DATA USED 2 BYTES ; IN 1-36 ; 1B:BIT 7 H ON NETWORK ; BIT 6 H SET UP IN DISK ; BIT 0-3 DEVICE NUMBER IN MASTER ; 2B:MASTER ID ; ; BIAS TO DATA IN CONFIGRATION TABLE ; BSRID equ 1 ;client ID BSDSKS equ 2 ;first byte in disk table BSDSKE equ 33 ;last byte in disk table BSCONS EQU 34 ;BIAS TO CONSOLE DATA BSLIST EQU 36 ;BIAS TO LISTER DATA FCBRR0 equ 33 ; offset of RR0 field in FCB (not FCB in MSG) scbase equ 09ch ; base address of SCB within page org 0 ; RSX Prefix serial: db 0,0,0,0,0,0 start: jmp COLDST next: jmp 0 prev: dw 0 remove: db 0 ; 0ffh for remove nonbank: db 0 rsxnam: db 'NDOS3 ' loader: db 0,0,0 db 'COPYRIGHT (C) 1980-82, DIGITAL RESEARCH ' db 0,0,0,0,0,0 NDERRM: db CR,LF,'NDOS Err $' NDERR2: db ', Func $' BDOSE: dw 0 CURSID: db 0 scbadr: dw 0 MSGTOP: db 0 MSGID: db 0 db 0 ; We assume network hw/sw sets this. MSGFUN: db 0 MSGSIZ: db 0 MSGDAT: ds 256 db 0c7h,0c7h,0c7h,0c7h,0c7h,0c7h db 0c7h,0c7h,0c7h,0c7h,0c7h,0c7h db 0c7h,0c7h,0c7h,0c7h,0c7h,0c7h db 0c7h,0c7h,0c7h,0c7h,0c7h,0c7h db 0c7h,0c7h,0c7h,0c7h,0c7h,0c7h db 0c7h,0c7h,0c7h,0c7h,0c7h,0c7h db 0c7h,0c7h,0c7h,0c7h,0c7h,0c7h db 0c7h,0c7h,0c7h,0c7h,0c7h,0c7h db 0c7h,0c7h,0c7h,0c7h,0c7h,0c7h db 0c7h,0c7h,0c7h,0c7h,0c7h,0c7h STACK: ds 0 USTACK: dw 0 FUNCOD: db 0 PARAMT: dw 0 RETCOD: db 0 MCRPNT: dw 0 LSTUNT: db 0 F5SETF: db 0 FNTMPF: db 0 ORGBIO: dw 0 HEXMSG: db 0,0,'$' CLDERR: db 'Init err$' COLDSE: ; BC and DE are pushed... lxi d,CLDERR mvi c,CBUFPR call next lxi h,next shld start+1 ; only until remove takes place... mvi a,0ffh sta remove pop b pop d jmp next ; pass to BDOS and hope for the best... ; Not a true cold start - we are in context of a valid BDOS call... COLDST: push d push b call NTWKIN ora a jnz COLDSE lxi h,NDOSE shld start+1 xra a ; sta remove ; is the required? lxi h,MSGDAT shld MCRPNT ; Apparently, it is passe to use BDOS calls for certain things... lxi d,scbadd mvi c,scbf call next shld scbadr lxi d,CSTUP mvi c,CBUFPR call next pop b pop d jmp next scbadd: db 03ah, 0 BDERMD: lhld scbadr mvi l,scbase+4bh mov a,m ret SYSMSC: lhld scbadr mvi l,scbase+4ah mov a,m ret CURUSR: lhld scbadr mvi l,scbase+44h mov a,m ret ; Some sneaky programs, like ERASE.COM, use the "saved search address" from the SCB. ; so we must put the address there if the BDOS does not (i.e. networked drive). SETSRA: lhld PARAMT xchg lhld scbadr mvi l,scbase+47h mov m,e inx h mov m,d ret SETDSK: lhld scbadr mvi l,scbase+3eh lda PARAMT mov m,a ret CURDSK: lhld scbadr mvi l,scbase+3eh mov a,m ret DMAADD: lhld scbadr mvi l,scbase+3ch mov a,m inx h mov h,m mov l,a ret CSTUP: DB 'NDOS3 Started.',CR,LF,'$' CSTDN: DB 'NDOS3 Ending.',CR,LF,'$' ;wbmsg: DB 'NDOS3 Warm-boot.',CR,LF,'$' NDOSE: mov a,c ; must save REAL function code! sta FUNCOD sta MSGFUN ora a jz WARMST cpi COVLY jz LDOVLY ; LOAD OVERLAY (RSX SCRUB) - indication of warm boot cpi CRSX jz CALRSX ; used to unload CP/Net cpi CBIOS jz next ; DIRECT BIOS CALL - might need to trap for LIST OUT lxi h,FUNTBS NDOSE1: mov a,c sub m jc next inx h cmp m inx h jc NDOSE2 inx h inx h mov a,m ora a jnz NDOSE1 jmp next NDOSE2: sspd USTACK lxi sp,STACK mov c,a ; modified func code! mov a,m inx h mov h,m mov l,a ; HL = func table push h xchg shld PARAMT call DMAADD shld DMAADR ; cache DMA address for this call... lxi h,MSGSIZ mvi m,0 ; assume 1-byte payload inx h shld MCRPNT ; MSGDAT xra a mov b,a mov d,a pop h ; specific func table in HL dad b mov e,m ; don't need HL anymore sub e ; assumes A=0 jz tnextp ; code 0 = not handled by CP/Net NDOSE4: lxi h,NDENDR push h lxi h,FUNTB2 dad d push h NDOSE5: pop b ldax b mov d,a ani 07fh ; strip off EOP bit mov e,a mov a,d mvi d,0 lxi h,FUNTB3 dad d mov e,m inx h mov d,m inx b ral jc NDOSE6 push b lxi h,NDOSE5 push h NDOSE6: xchg pchl FUNTB3: dw 0 ; 0 000h 080h - never called dw SNDHDR ; 2 002h 082h dw RCVPAR ; 4 004h 084h dw SNDFCB ; 6 006h 086h dw CKSFCB ; 8 008h 088h dw RENTMP ; 10 00ah 08ah dw WTDTC2 ; 12 00ch 08ch dw WTDTC8 ; 14 00eh 08eh dw WTDTCP ; 16 010h 090h dw CKSTDK ; 18 012h 092h dw BCSTFN ; 20 014h 094h dw BCSTVC ; 22 016h 096h dw RCVEC ; 24 018h 098h dw GTFCB ; 26 01ah 09ah dw GTFCCR ; 28 01ch 09ch dw GTFCRR ; 30 01eh 09eh dw GTDIRE ; 32 020h 0a0h dw GTOSCT ; 34 022h 0a2h dw GTMISC ; 36 024h 0a4h dw GTLOGV ; 38 026h 0a6h dw LIST1 ; 40 028h 0a8h dw SELDSK ; 42 02ah 0aah dw LSTBLK ; 44 02ch 0ach dw GETVER ; 46 02eh 0aeh dw 0 ; 48 030h 0b0h - to be removed dw RESET ; 50 032h 0b2h dw NWSTAT ; 52 034h 0b4h dw NWCFTB ; 54 036h 0b6h dw SDMSGU ; 56 038h 0b8h dw RVMSGU ; 58 03ah 0bah dw LOGIN ; 60 03ch 0bch dw LOGOFF ; 62 03eh 0beh dw STSF ; 64 040h 0c0h dw STSN ; 66 042h 0c2h dw 0 ; 68 044h 0c4h - to be removed dw CKSTDP ; 046h 0c6h dw CHKMSC ; 048h 0c8h ; hi bit is "end" signal, else keep executing routines in list... ; byte & 07fh is index into FUNTB3, routine to call. FUNTB2: db 080h ; - never called fgtvr equ $-FUNTB2 db 0aeh ; frssy equ $-FUNTB2 db 0b2h ; frsvc equ $-FUNTB2 db 096h ; fsldk equ $-FUNTB2 db 0aah ; fopfi equ $-FUNTB2 db 008h, 00eh, 018h, 09ah ; fdlfi equ $-FUNTB2 db 006h, 098h ; fsrfs equ $-FUNTB2 db 040h, 018h, 0a0h ; fsrnx equ $-FUNTB2 db 042h, 018h, 0a0h ; frdsq equ $-FUNTB2 db 048h, 006h, 018h, 01ch, 0a2h ; READ SEQ fwrsq equ $-FUNTB2 db 048h, 008h, 010h, 018h, 09ch ; WRITE SEQ frefi equ $-FUNTB2 db 008h, 00ah, 002h, 098h ; flgvc equ $-FUNTB2 db 0a6h ; fgtal equ $-FUNTB2 db 012h, 002h, 018h, 0a4h ; fwrpr =COPYRIGHT (C) 1980, DIGITAL RESEARCH DDT VERS 2.2$10 !~=W!xe ~#Xbxʇ {z~#o}o҃i.2_!fp+q*e2_2_!hp+q*g!jp+q*i!lp+q*k!np+q*m2_!pp+q*oÃO$*sy͏ , $  ͌ 9!z6 # L!zw͌j# X:z 0 ͘=N#Fy}80*z{¯#z+++ ¥ z#½# · 9!`͠ y9!rͷ y=!z{w# % w!P͠ y͓}*w#"͌ @.@<!Eͷ~P !ͷ’P͌Q!ͷªP}QxQ!ͷ͓G@Q! ͷ y͓Gþ!ͷ ͓Q!ͷ͓Q͌Q!.ͷ6y#G͙Qà!2ͷQ͓͌Q!>ͷq eg͙Q:zJEËC–EQyQxQRQ** {zҷ*~#" <AOGƐ'@'OxƐ'@'ON# z8O!B N#N ¾SP.* |} !9":q!"28!"9:] !í 1͓ !" >- Ͷ Aګ ҫ _!7^#V~  \p Z z ů2[\͓͢ ҫ ͐ =« f " ͓ ҫ ͐ ʻf " =ʻf "=« ý> 2͐ f "]=f =« *]}o"_  *]"a. ~ #E }"]*a 6 *]}#|#*]E ͐ « f f f {zA|« W}d ͐ f f f DMʡڏ"=ʡͲ=ʡYPͲ1**!O~4#~#F#x~#s#r#w>͐ « f f  . ᯕo>g. 2|2\  !]w# ʫ .&  0 6 #& .K !e K w# ʫ : U 6 #K 6AW w#] !e~H#~E#~X*}|́ "!́ ͐ !ʬ =« f kʫ j \͢F w# ͋ t ʫ : W& _& & O { `i"F & & w# & ͋ « t Y t Y GтWx ͢!o ~Z #N  *. *.  NEXT PC͐ =« f  . ~ Ͷ ʻ .͓ =« f |« }w#Ä >2L͐ ! =« f }ʫ +"MD Å D  !  # ë «   Ͷ ͐ =« f xY |« }ҫ gA>S Ag}S S i |« }!w s#r:[ʔ _!~ʦ ![4ç \͢¦ 2[ 7 >?  e͢!g"c> _͢a_!f~> 5*c~#"c 0 7   > >  ͢| } @ >. *_}o| , 0 ë ^#V#!Y ))))o P q s#r#!V4 !V6# ,® >2Vñ m ͅ m ͅ m ͅ « Vʫ ! XN!~  ! _^! ^#V~ x+ >= = !~  . !   #x f L L ͓ͅ ҆ *" !6ï +"_*~ #E گ ʫ ^#V. ï ~ CZMEIABDHSP!"M"+"!91*~!O~6=G#^#V#~x (#"!N#FW( *J>7Å*M|N+"M N:LHͅÅD Å >* *͓ b" . *"] !/~##ʁtZ*F#n!Is!^#V&&##&))::^#V#*^#V>+)x-8_)*)þ))>+><7"9.Yͯ * M^2U :2:2ͳ:_³ͯ !6! @!!BH @@ABH B! "BHI$$BI$BI $ HI D$HD$$ H B!$D$"$B$DA!ABI$H B$I $HI$H$! $I $I$$A !A@$I$"!$H$I$I "! $A$  HHAA"I @BB $A"$$$I$$H!!! BH" !I B  $$!BD! $!BI D@"!$I$$H"!I$I$I$UUU$$A$ D$HD$$ H B!$D$"$B$DA!ABI$H B$I $HI$H$! $I $I$$A !A@$I$"!$H$I$I "! $A$  HHAA"I @BB $A"#s#r1!q:22!q!6*& > >*& :R :!4, !r+s+p+q+p+q͐ !#6 *~ *~2#* M# 2!'6:· :'ڪ ú * M# 2Õ v :24 :22&*~2$!'6*~2# *~ P *N! ** =2%!&D !'6!6:&!A :': !4# G *64 *:$w:}{+s#r͐ :z *}#"} !6:#2(O* ~2*&*: !(4*:(w*&*: ¿ *(&*~2Ñ *6*}~2 ̀ :2!!6*}#~2 !!4N* : !'6$ *!&*: $ !'6!4N*} ~2 *&*}~2 * M# 2:>!H} !4N*} ~2 * M# 2L :2}{#+s#r*}N# 2!« *}#"}Ð !)q:)a :){ :) :) H H!-s+q+p+q:-=2- **:,w**#"* !.q!76*b"3"5:e( !e6(*d&*e&͈!1s*d&͊!2s:.:.Ha *}+"}p :}++s#r !/6:1!/ږ *3"5*eMS !/4x *2MS :7ҭ Xó /X:e?Ҿ *.M!1 ^#VFXG UXG jXG |XG XG XG XG XG +XG aXG XG    ( !8q!06:8!0{ *3NH*3#"3!04\ !06:8!0ں *5}§ !76^Hì  H*5#"5!04ƒ !;s+p+q!"<!;>w *;M!<+s#r*<9+s#r!>q!"@}2?>!?3*?&m ~,*@DM*?; "@!?4*>M*@!Bq!C6>!Cp*B&))) *C& NH!C4H!Dq*D&)))  ~2FO>ҕ!F6!E6>!E*F&Ͳ *E& NH!E4š!Gq!I6*G&)))  ~2H2HIH!I4:H2HOH!I4:H2H'SH!I4:H2H>XH!I4:IR H!I4> XX:e2J(r!J6(*J&!͈!Ls+6!J6*K&))) ~  *KM? H*KMq H*KMX!K4+~!L Å!J4Ê!Qp+q:e2c(!c6(:c _!͈!es!c6>!c/*P)"P*c&S w!c4 !c6*c&))) ~X:cQX!c44:c2f!R6!d6+6>!c*c&S ~:f!cҝX%X !R6*cM? H!d4:e!d6 DX!c4k:b!R6OX:RTX `X"Ͱ"gxX*gDM$Ͱ"gX*gDM&Ͱ"gX*gDM(Ͱ"gX*gDM*Ͱ"gX*gDM !jp+q>!Ҁ>m !k6:=!kڹ*k&*i*k&m w!k4!k6*k&))) ~ !l6>!l *l&m *k&))) *l& !l4:k!k4>>þ>!sq*s&)))  ~2u!  ~2v!6!6::HHUZ :… :’ :°:u*s&)))  w::u*s&)))  w>!2:2:u2t2t *s&)))  :w.x*g -*s&" "wE.x*g -=S!{s+p+q>!{_ !"|!~6:{!~ڵ*y~0*y>9Hҏ !|ͧ*y~0_"|*y#"y:~<2~j>!| *|}!q*&!d͈!s^!dͲ:!s^! ͈!sn&ͫ:!s>!":0OH>!>#H?:0OH:0OH!6!6::HhZ :… ::ʝ hZ :}+DM*I=2*:: hZ :}+DM*I=2*S͘2e͘2f X:e!g:"O!C ^#VXUU$XUU/XUU:XUUEXU "+.7:*MͰ"*DM :2::Hқ*MS:::H:H: HI : !6!6UZ :O! ~2:J:- G:"= G*M!6#6>!p*&m 6:<2R:/:}+DMn2:— *&m 6:±*M#::H:*}~HH!6:*}~,H*}#"}:/UZ p::Hd*&)))  >\" $ a ::Hҩ*&)))  >¡& ( æ :":&H*&)))  > *M *&)))  >  *M !q*&)))  ~2*&)))  ~2 PX*M? cX*Mq vX!6>!:2¸*&ͫ DMX !6>!ڵ H:<2:X !6>! H:<2:<2m!p+q::H!6$!6*DMn2:< :J*M:\*M#a !6!6:€!"b"}Ï!"}+"b+~2dZ ::H:H!6!6::H:}+DMS@::S @:7:/4 @sS!p+q*~ *~ Hk*#"G*~w>>_ogDM!>))덑o|gҡ =^#V))) DM!>)) =¹_og^#V) _{ozgo&og_{_z#W~zwwwUzVzRzwUzWzRzVzwWzwwVzwWzwwwwzwzwzwzwFGzzzf"]"] "]!{]6666û_!{]6q~^~( ~ y ~w~w~w~w~w~(@5~ݾ 5~ݾ -~ݾ %~ݾ 4~8 64 4666*f"_!E"f~^_!"f6.Nq~0q~!6!('~ݾ" ~#ݾ ~$ݾ ~ݾ%(*~ c~w"~w#~w$~w%~tc6 ~^N~=g.lf^ V ~ 6 ~( ~/#~~.6 c~.y2N *G cAcQc2 2 2 2 AGc:cx2O  `+Dyʴ¬#ʌ |~ʛ,ʛ ¬:P cy02P ; rDSHcGcTcx2Q ;>SGcTDScx2R ;x2S ;~0c:0G~7,7 70c:c0OxGx2T ^,O ;+j^ O+j2N >:P ʃ0!<=()tu:R ʙ/ݶw:S ʱ/ݶw:Q D(S(:T ~!4 #xݶwD!? >KC [E #=%[C ~#? *e rf:I  k^ G!00 }0w> o"  :N ʈ    *C ~¥##~^ ʫq    g ͪ###f   ###v   ###n+n# 2    ##~ ~(!$ _^#V"    : H k  V#^D:8 ^#ͪ:O *ar_~2I W* Ofڃ"< 2> >>>+~$>*< r:> _"C !"E !? !? :I  r"J 2L 2M :L E"J d~#$)) !>2L E:M GEx2M +~#"J ![J :L :O <=`#U%*<  ^#VN#fi à à à à*  Xà  {U h  The MODE utility is called in one of the following ways: MODE Outputs HELP information MODE d: Displays the present drive status to the user MODE d:arg1,arg2,arg3 Updates the present status and displays it. Valid arguments are: DS or SS = double or single sided DT, ST or HT = double (96 tpi), single (48 tpi), or half track half track is 48 tpi media in a 96 tpi drive. DD or SD = double or single density S6, S30, etc. = step rate in milliseconds MMS, Z37, Z37X etc. (media formats); the X implies extended format. $Drive A: has a fixed configuration which cannot be determined by MODE. $5.25 inch floppy $8 inch floppy $ Controller - $ Sides - 1 $ Sides - 2 $Recording Density - Single $Recording Density - Double $ Tracks per Inch - 48 $ Tracks per Inch - 96 $ Tracks per Inch - 48 tpi media in 96 tpi drive (R/O) $ Format Type - $ Step Rate - $00 milliseconds $ Drive - A: ( ) $PRESENT Configuration is: $NEW Configuration is: $Invalid command line or command line arguments. $The requested format is invalid for the specified drive. The complete configuration must be supplied $A: does not exist. $The driver module for A: is incompatible with MODE. $ inoperative. $Drive is specified but not linked - ERROR IN SYSTEM- $ 6122030 3 61015  !"}+"b+~2dZ ::H:H!6!6::H:}+DMS@::Dn Hʹn(:.6n.-n[!2O ~!2[^!! "Bn>2Dn*BnN#"Bn:Dn=2Dny~y2Dny:Dn(!En5 $#5 .'n!In[@n!Gn[>n:.3(.*s-o1-o:]Oxy o&{-ox˿yy2]C]C]a];o/o5o_*_     !{]"!">22!o~A2op!op!ep~ݾ(!pp~A!owp!op!0fp!pp!~8wN ?:= Ny#]]]]]]]]] ^!^+^:^=^B^F^I^`^g^^^^^^^^^^^^^_ ___(_,_9____"`A`K`]``````````a2a5a?aBaZa`acakauaaaaaaaa bb#bPb`bbbbc7c:c=cCcFcyc|ccccccccc d"d5d=dQdYdwd}ddddddddddeeee1TdCP/M Version 3.0COPYRIGHT 1982, DIGITAL RESEARCH1512826543210123456789ABCDEF ERROR: $Reading file: $Writing file: $Directory full$Reading file: $Writing file: $Invalid drive.$) ? $) ? $) ? $Bad character, re-enter $ $ Disk read error: $File cannot fit into GENCPM buffer: $Unable to open: $BDOS3 BIOS3 Setting up directory hash tables: $ Enable hashing for drive $: $Unable to allocate space for hash table.$ Setting up Allocation vector for drive $ Setting up Checksum vector for drive $ *** Bank 1 and Common are not included *** *** in the memory segment table. *** $Number of memory segments $ CP/M 3 Base,size,bank ($) $ Enter memory segment table: $ Base,size,bank $Zero length segment not allowed.$Bank one not allowed.$ ERROR: Memory conflict - segment trimmed. $Memory conflict - cannot trim segment.$ ERROR: Memory conflict - segment trimmed. $ ERROR: Memory conflict - segment trimmed. $ CP/M 3 Sys $ Memseg No. $ Bank $ Accept new memory segment table entries $Default entries are shown in (parens). Default base is Hex, precede entry with # for decimal $ Use GENCPM.DAT for defaults $Create a new GENCPM.DAT file $Display Load Map at Cold Boot $Number of console columns $Number of lines in console page $Backspace echoes erased character $Rubout echoes erased character $Initial default drive ($:) ? $Top page of memory $Bank switched memory $Common memory base page $Long error messages $Double allocation vectors $Accept new system definition $ CP/M 3.0 System Generation Copyright (C) 1982, Digital Research $ BNKBIOS3 SPR$BIOS3 SPR$BNKBIOS3 SPR$BDOS3 SPR$RESBDOS3 SPR$BNKBDOS3 SPR$ 64K TPA Copyright (C) 1982, Digital Research *** CP/M 3.0 SYSTEM GENERATION DONE ***$!Tq:UM*T&!Tp+q:Ud*T !Tp+q*T#6:UҀ:Tڀ*T *T#N! *T6 7 7!Tr+s+q+q!U6N*TDMN:TTN͜:T.:T/!U!]6 !m6 !Tp+q *T 6 *T 6*T!Tp+q*T!Tp+q*T!Tp+q*T] ͧ!Tp+q*T} ͧ!Tp+q*T ͧ *T 6!Tp+q*T!Tp+q*T! ͧ!Tp+q*T" ͧ!Up+q*T$!Vr+s+p+q+q:V *V*VDM*V -- !Vs+p+q:VJ *V*VM!VLS!Vq:V e > :Va/>z!V/H҄ :V_2V:V!Vq:V/>!V/HҦ >ͧ>!Vp+q(7*V~ Y7 N7NTe:T *TMV Y*Vw!Vq:VO! N7:VO! N7!Vp+q 7*V|O *V}O H7!Vq*V&+SDM$ !Vp+q!V6!V60!'"V>V͇S† *VM7 !V6>!V VVzSڽ !V6:V<2VVVzS+s#rÔ :V *VM7!V60*V! S"V:V<2V‹ !Vs+q(7:V  #7*V&DMZ  *VM N!Vs+p+q+p+q :T: ͜*V6:V<2VO!T NV 2V  :V,u *V#"V*V6!V6 :V#… !V6  :V02V:V> !VHҽ >!VҸ :V2Vý !V6!V:V *V^*V&+S*V& *Vq !V6*V6ͧ *V6? ͜*VDMN*V~  (7*VN !V6>!Vn *V#"V:V:-Q/HX *V6d ,7*VN :V<2V, *V++"VNÊ *VN*V !V6!V6Te!Vr+s+q:-Q/Ү >!V6#q#p!V6:5Q!Vڳ*V&+SFQ  VzSک:VM*V&+SFQ  ~*V&+SFQ  VzSHJ:V2V*V&+SFQ  ^#V"Vé*V&+SFQ  ~*V&+SFQ  VzSHҩ:V2V*V&+SFQ  ^#V"V:V<2V¿ :V:VH`!V6:5Q!V`*V&+SFQ  VzS/*V&+SFQ  ~H*V&+SFQ  VzSHV:V2V*V&+SFQ  ^#V"V:V<2V:V!$V6!U6ͬ#Q$!H> U͇Sʔ* U|2Uß*U|2U!U:.Q2T*U|!UO:/Q2T*U|O:T2TUTI:-Q/!$V>O:T2T* U|O:T!$V2T:T=2T* U|O:T2TҮ:-Qқ*nV*U*V |!UO:/Q2T*U|O:T2T2Uͬ:U/Ҙ!!V6>!!Vژ*!V&$SQ  6:!V<2!Vsà!U6:V/ҫ*:U2T:T2TTͩ:-Q*T&+SDM*U*T&+SDM*U:-Q/,COPYRIGHT (C) DIGITAL RESEARCH, 1980 1] ʑ?ʑ! __0 r))) O @|r}r.g))å{u INVALID MEMORY SIZE$!$ʡ~/w/wʔ|g*"z|?¸>@G!>0w#w!4~:60+4~u!N#F! x, # =!v"z!w6!u#+w+wz >ZxG}o|g"|! :m c p!"xp ~#c*|!:m ʅ xä SYNCRONIZATION ERROR$ {°~#o}oҼüÅ*zZ# :m m! ~ #* DM! x  w#!N#F! D!_>0w#w1!`4~:60+4*"e@u READY FOR "SYSGEN" OR "SAVE 00 CPM00.COM"$*|  CONSTRUCTING 00k CP/M vers 2.2$>ͦ!q:_  !p+q.*   !q*&!p+q*2!p+q*2!p+q*22!p+q*!p+q*!p+q*!p+q*2!p+q*4\X COPYRIGHT (C) 1979, DIGITAL RESEARCH _͌> ͒> Ò> Ò͘~#͌ì _2<2 !2:2a{_:ʖ:>Ľʖ:=2–!B!6#5ʖ:Ľ!ͬʧ )!F#xʺ~0wëw!" !~6ͽ:ý(!#͘*~ ""͌#>?͌͘ =_.:;<> Oo$>!Y2*O"ʉ@G:ʐ:wÖx2p0ʹ#*©6?ëw˜0ï#6 ¹.0#*6?w0#6 #6" 0002 = hbnk equ 2 ;bank to use for Hash tables. 0100 = hstart equ 100h ;reserve page 0 for interupt vectors, etc. 0DF0 = hsize equ (bnktop-hstart)/16 ;allocate space equally to each drive. ;-------- Start of Code-producing source ----------- cseg ; GENCPM puts CSEG stuff in common memory 0000 = BIOS$0 equ $ FC00 = bnkdos equ bios$0+0fc00h ;dummy values, reloc "Fxxx", GENCPM will FD00 = resdos equ bios$0+0fd00h ; substitiute real values. 0000 C30600 jmp boot ; initial entry on cold start 0003 C3C400 jmp wboot ; reentry on program exit, warm start 0006 C32A02 jmp const ; return console input status 0009 C35302 jmp conin ; return console input character 000C C36D02 jmp conout ; send console output character 000F C37702 jmp list ; send list output character 0012 C37202 jmp auxout ; send auxilliary output character 0015 C35802 jmp auxin ; return auxilliary input character 0018 C35A05 jmp home ; set disks to logical home 001B C32304 jmp seldsk ; select disk drive, return disk parameter info 001E C35D05 jmp settrk ; set disk track 0021 C36205 jmp setsec ; set disk sector 0024 C36705 jmp setdma ; set disk I/O memory address 0027 C37E05 jmp read ; read physical block(s) 002A C38305 jmp write ; write physical block(s) 002D C39C02 jmp listst ; return list device status 0030 C37205 jmp sectrn ; translate logical to physical sector 0033 C39202 jmp conost ; return console output status 0036 C32F02 jmp auxist ; return aux input status 0039 C39702 jmp auxost ; return aux output status 003C C3AF01 ?dvtbl: jmp devtbl ; return address of device def table 003F C31702 jmp cinit ; change baud rate of device 0042 C3E603 ?drtbl: jmp getdrv ; return address of disk drive table 0045 C30F06 jmp multio ; set multiple record count for disk I/O 0048 C31306 jmp flush ; flush BIOS maintained disk caching 004B C32903 movev: jmp move ; block move memory to memory 004E C30903 jmp timex ; Signal Time and Date operation 0051 C3FB02 ?bnksl: jmp bnksel ; select bank for code execution and default DMA 0054 C36E05 ?stbnk: jmp setbnk ; select different bank for disk I/O DMA operations. 0057 C31E03 jmp xmove ; set source and destination banks for one operation 005A C39701 jmp search ; reserved for OEM: search for module. 005D C30000 jmp 0 ; reserved for future expansion 0060 C30000 jmp 0 ; reserved for future expansion 0063 @dstat: ds 1 0064 0000 dw @lptbl ;logical/physical drive table 0066 A603 dw thread ;module thread 0068 0000 dw ?serdp ;test mode validity, HL=memory address of ?serdp 006A @adrv: ds 1 ; currently selected disk drive 006B @pdrv: ds 1 ; physical drive number 006C @rdrv: ds 1 ; module relative disk drive number 006D curmdl: ds 2 ; currently selected Disk I/O module address 006F @cmode: ds 2 0071 @dph: ds 2 0073 0000 @dma: dw 0 0075 0000 wbtrap: dw 0 0077 00 tmpdrv: db 0 0078 00FFFFFF defsrc: db 0,0ffh,0ffh,0ffh 007C 00 srctyp: db 000$00$000b ;only bits 3,4 are used (others ignored) 007D 0040 icivec: dw 0100000000000000b 007F 0080 icovec: dw 1000000000000000b 0081 0000 iaivec: dw 0000000000000000b 0083 0000 iaovec: dw 0000000000000000b 0085 0002 ilovec: dw 0000001000000000b 0087 3E01 goccp: mvi a,1 ;select bank 1 (where CCP is) 0089 CDFB02 call bnksel 008C C30001 jmp ccp ; then exit to ccp 008F 2A0000 bdose: lhld @mxtpa 0092 CDFA02 call ical 6330 = VERS EQU '0c' ; MARCH 5, 2017 08:39 DRM "LDCPM3.ASM" MACLIB Z80 0000 = CPM EQU 0 0005 = BDOS EQU 5 0080 = TBUFF EQU 80H 0009 = MSGOUT EQU 9 000D = RESET EQU 13 000F = OPENF EQU 15 0014 = READ EQU 20 001A = SDMA EQU 26 000A = LF EQU 10 000D = CR EQU 13 0100 ORG 100H LOADER: ; ***** THIS SHOULD BE PART OF COLD BOOT IN CPM3LDRK ; LXI H,0FD74H ; LXI D,00040H ; LXI B,16 ; LDIR ; ***** ; ROM 81-292 USES 0FD74H ; U-ROM 81-478 USES 0FE9AH ; ROM 81-302 USES 0FD5CH ; IDENTIFY ROM BY... ; WE CAN'T MAP ROM IN, WE ARE IN LOW MEMORY. ; CAN'T CALL ROM, EITHER. ; U-ROM PLACES '2.01' IN 0FFF8H... ; 81-292 PLACES COPYOUT IN 0FDE5H (DB 14 CB BF D3 14 ED B0 DB 14 CB FF D3 14 C9) ; 81-302 PLACES COPYOUT IN 0F919H (DB 14 CB BF D3 14 ED B0 DB 14 CB FF D3 14 C9) 0100 CD0802 CALL CHKUNI 0103 219AFE LXI H,0FE9AH 0106 3E55 MVI A,'U' JRZ GOTROM 0108+2825 DB 28H,GOTROM-$-1 010A 2119F9 LXI H,0F919H 010D CD1F02 CALL CHKSIG 0110 215CFD LXI H,0FD5CH 0113 3E33 MVI A,'3' JRZ GOTROM 0115+2818 DB 28H,GOTROM-$-1 0117 21E5FD LXI H,0FDE5H 011A CD1F02 CALL CHKSIG 011D 2174FD LXI H,0FD74H 0120 3E32 MVI A,'2' JRZ GOTROM 0122+280B DB 28H,GOTROM-$-1 0124 11B002 LXI D,BADROM 0127 0E09 MVI C,MSGOUT 0129 CD0500 CALL BDOS 012C C30000 JMP CPM GOTROM: 012F 22DB02 SHLD ROMCRT 0132 32D702 STA ROMID 0135 11CA02 LXI D,ROMMSG 0138 0E09 MVI C,MSGOUT 013A CD0500 CALL BDOS 013D 0E0D MVI C,RESET 013F CD0500 CALL BDOS 0142 0E0F MVI C,OPENF 0144 112D02 LXI D,CPM3$SYS 0147 CD0500 CALL BDOS 014A FEFF CPI 255 014C 115102 LXI D,NOFILE 014F CA0002 JZ ERRMSG 0152 118000 LXI D,TBUFF 0155 CDED01 CALL DMASET 0158 CDF301 CALL READFILE 015B 218000 LXI H,TBUFF 015E 119702 LXI D,TOPRES 0161 010600 LXI B,6 LDIR 0164+EDB0 DB 0EDH,0B0H 0166 CDF301 CALL READFILE 0169 0E09 MVI C,MSGOUT 016B 118000 LXI D,TBUFF 016E CD0500 CALL BDOS 0171 3A9802 LDA RESLEN 0174 57 MOV D,A ; LDA TOPRES 0175 1E00 MVI E,0 0177 21DD02 LXI H,BUFFER 017A 19 DAD D 017B 229D02 SHLD RESEND 017E EB XCHG 017F CDD501 CALL LOADF 0182 3A9A02 LDA BNKLEN 0185 B7 ORA A 0186 CA9701 JZ NOBNK 0189 57 MOV D,A ; LDA TOPBNK 018A 1E00 MVI E,0 018C 2A9D02 LHLD RESEND 018F 19 DAD D 0190 229F02 SHLD BNKEND 0193 EB XCHG 0194 CDD501 CALL LOADF NOBNK: 0197 F3 DI ; ***** THIS SHOULD BE PART OF COLD BOOT IN CPM3LDRK 0198 2ADB02 LHLD ROMCRT 019B 114000 LXI D,00040H 019E 011000 LXI B,16 LDIR 01A1+EDB0 DB 0EDH,0B0H 01A3 3AD702 LDA ROMID 01A6 12 STAX D ; ROM IDENTIFER CHAR AT 0050H ; ***** 01A7 3A9802 LDA RESLEN 01AA 47 MOV B,A ;B=RESLEN 01AB 0E00 MVI C,0 01AD 2A9D02 LHLD RESEND 01B0 2B DCX H 01B1 3A9702 LDA TOPRES 01B4 57 MOV D,A 01B5 1E00 MVI E,0 01B7 1B DCX D LDDR 01B8+EDB8 DB 0EDH,0B8H 01BA 3A9A02 LDA BNKLEN 01BD B7 ORA A 01BE CAD101 JZ NOBNK0 01C1 47 MOV B,A  :T_>2T! % **<:7 "E:7%E÷ LH# SR5 UJ BP PL= MTI MBO HMU FM[ CWa PCr POi PA CP PN OP HE FO !<>wͱ n!<>(PPÓóçáíÿKayPro Custom KP (08@HP   ==7 =6 "!͓O~!~6* "!" * "! " }** *  *  M|N+"M N:LHͅÅD Å >* *͓ b" . *"] !/~##ʁtZ*F#n!Is!^#V&&##&))::^#V#*^#V>+)x-8_ B NN Please don't use * or ? in a file name.Sorry. That output file type is not allowed.ASM@LIB@COB@FOR@BAS@PRN@PLI@C @ASCSUB@COM$$$BAKO HMU FM[ CWa PC: |}!͉.wͱ n!<>( 88002687!<>(-<WORK ---------------  Complim || Small Business Applications, Inc  3220 ana Suite 209 ouston, 7006 (713)528-51-------- ----------------;;;;;;;;;; B NN! **************************************** ns, Inc  3220 a8800 Mount disks and press return. -------- ---------------;;;;;;;;;; B $$$BAKSAVE H(6#P#l#'%&b%%$%&%!E"N""'!,{+/""&"}!'%#y!RE WDE4FQ MTFBPSLbIyKsC X *"R :. d:!v  d O! ~ :] w:Y)4~@:$ :v$ O~4 ͜ A ; *&--"A  ͻ O!  w# x2  > $ Ox1  2 V !S4 ^#V#N ~#ʎ 4 \ > i 5 i 6~v  ʋ +4~ڋ 6###͙ #~w>>4ѧ>V>< ͙ >>~  W # xj4 $ 4 o+ ! > ~3 @Y >:Y #~ Y #6 ~ >.Y ~ Y #L ͜ :z@t M4 Ya ͳ*z 2* !| ʮ G2!xʩ ###ß #^#VT0 ͻ  ;   ͜ ͻ ɋa{ a *"'*"%!"):G< B :P< / C/ :W("'< !").")*)*%r1:?ʲ :@;ʲ r1² *DM*%z<„ *n.ڄ 1ò ~ !" x h.ڹ x< *%ß  w# Ÿ w#x<ʙ Ù 6"::1ͳ1ò !@ 5:?ʲ !N ʲ ##* !ͯ 7² 2!"V!_*>: $##͉.^#V͉.!$͉.^#V!͉.2!~B.~R«26!5 2² *"% !" *)"*+":-2@+^8\!T!͉.!._*")*"+:2- +2%:ȯ2f ͳ2;ò *%DM*I.DM!" *""͓.6"zp͝p^!\!͉.:*͉.͟*!͉.*%~ ʯʯ#à*'h.һ*DM*%~#"%  :> y> > '"!6W~zw2`i"@>2 »!":,/2=!~R> p5H!~p~6 n+> #wR*:B.w#6!4~ڕ͟ژ!6!57>!\!͉./ȯ217>*"%*"'!2͉.:32!N H?##~B 8 ʲ #8~=² ʲ #* H.Y ͻ 7:H:0:t2S:`!?!3T!͉..~:'H~'!6ò  # :7:Ҋ{2!" 4 *&- !N## ~ P2-!,6#6#6!k6 T2-!,6#6#6:+2k# A1BC:5Ͳ ~YN >2,/2-~Y#N ):+G>2-x2k~Y@NB>2.4:?ʲ !C6=OWk6 !3͛Gw :ڗʑ5͛Gڏ“x#t#6.}H6:?ʲ !5##~@G:6ڲ x2!6?T]# ͉.6>H2!<6ʲ H!:!B.:w$ !:G~3+4:==0iH!#>wͫM2!<ic !"6 :@OAԵͻ ͻ 6\+o+6:?ʲ !N## ʲ * >H<7ʲ 7 !$ 87 NY¡%:2² :?ʲ Kʕ !" :D("!*%h.>*'h.>k7ò 2#C1DiM2² 1͉*%DM*'+I.=U7ڲ :#]*% "%*' "'*%#*!͓.*%DM*'I.+-2  NYi*'*%i*T]ʞw#ž+":?3ʲ =-:z@p3² *"%*"'h.!N# #~ B!3² :#Y*%**'h.+P.yO"%@*'*%h.!~#G:%n:!Oĸͨ: <=d*}‹!:$ҋ{!"$:"N3 YN— ~#  ¨>  ¸ :2%2TU:T}$%>***$$,:og"$;&!"'!"'2A -:G:!j: 2"YʰNʰ.|}*#$2"_:!{22!ң2{! Ұ>2 *'^#V:"*'~+"'66Q9 N-Yc 8 ͻ ͻ *'^#V #~2!#^#V"##^#V"%:!28 D*#}k-͵|k8 *%:!`N͵ ͵d~k8 !00_ z,rgM͵L͵8c8A 9A 9c!/9YN"@9YN#::z7 @2z:X7² :z2z:O !* !v%͉.!"v{ͯ 2z> 2T> 2u!z67ò 2!T]6 # ͉.!"""2>yhyh~.yŽ:G:ڎ!͗Ž!͗7 =~ ʹ*?:.# —x> #ɯ=F#~+: ##x@2~.# # ~# )*~+# "' >"%y02 87  **%h.*!DM*I.#DM"ͨ.#"wu#i"i5:?ʲ !N ʙ##~@v ʏ#!~i5 ~@̏~ !" ("!*DMA8*%n.Ҳ I."#=y~@# ͏:===G c :==G9*'|: W8\+ AY*%"!*'"#:k*#|k~8\+2A k!N#**!i* !͆͏%͉.!w#w2!"""!ͯ !w67ò :2!@  2"%y2' *%w#"%*'+"'|J͵ ʏ O:OO26:?ʲ !N ##ͮc o9 49!ͅ9!2:(.x!+͉.!9ͅ9!ͅ9!zͅ#~?  xDIR ERA TYPESAVEREN USER!yO#< Ty#O 321y_͸2y2ͽ:˜1͘A͌>>͌92^ :¥.!_~#fow]!v"!çREAD ERRORçNO FILE^: ! ~ 3#0 Wx x   G ~ # 3x~#B!Y~ɯ2:=!ý:=!:ý^T!~  6?#ˆ:`O> K{͘A͒>:͒͢>:͒͢xK > K > ͒x  ͢ØÆ^ BRͧ9!5‚#~Y‚#"T<ÆALL (Y/N)?^ Tʧ͘!6!~ڇ w4!Y~ʆ͌†t=ʆf ^ T 2o&)|+!<ͧÆNO SPACE^ :Ty!B*O=?_s#"^sG!~Ypsp2mÆÆf ͧÆFILE EXISTS _: É: :ʉ=2)ͽÉ T!@k!}|q=qf^!~2>`~22\!!B!~> >#0~O#Cx2͘1)ͽÂf zͧÆBAD LOADCOMf^: ! Â$$$ SUB"C {2!"E 9" 1A 22!ty)K!G_^#V*C   ~E , &-AGMS  !!ô!ô!Bdos Err On : $Bad Sector$Select$File R/O$ :B A2 ! ~6  O͐  : E  B 2 >: b # : y! 4 5~yy 5 6y Ґ ^H @Oy H  H : – ͬ   #H : !  H ù  H  H $O͐ : 2 *C N#  x : 2 p & x ~+é 7 2 H ! >w _ : ! 5ͤ N k ͱ ¦ ͱ xʊ #N x : ! 2 ͤ ! 5™ #wO ~x½  p H    y< < ʑ  : !qMD # 2E > ! ^#V w#P :B O|^#V#"##"##"##"!O *!O *|!6ʝ 6>*w#w*w#w'û *! J * ""!N#F*^#V*~#foyx *{_zW+ * yx # *DM*s#r*s#ryOxG*0MD!!N: E G>O: \ S *C  :q n& ^#V> O^ "*}:*)= ":O:o"*C  *C !ͮ ~2~2ͦ :2ͮ : O:w:w |g}o *# ) :B O! yoxg*:B O }!N#F "*#*s#r^  ~!J  ! J *:o$*C ~i 6i w**{#z r+s{ozg**͕ **  , w͜ ͸ Ͳ ! !N#F$**O !~#:A #~$=2E k͌ : :/GyO>2!q*C " ͡  ʔ*J Ҕ^ :Oyʃ?|x | s-|N-# S:2E !~Яw > T   D ^ 6k -äPYy 5*{zBK5ڋ>*C w~#+w#w+ɯ2E 22 i  ^ *C :~w~͔͔# #  w ~>2!E 5T *C !"C  "C !w# F! w͌ x 2͢ *C  ~<wʃG:!ʎì 4~ʶ ¬:<ʶ$ ʶïZͻ   x >2>2ͻ :!Z2:E w ̈́ ͊ Ͳ  >2>2T *C G ͻ : w ̈́ n> 2;O ^ DM;}H> "*C  ::dd slO s#r:E ͊ :==»y==»*Ww# *" ͸ *:G#š" ͸ :!w4!i w: Z!E ~=26 2*C !!~~#~O~G#n,-.‹! w! yG!x͢.:E <ʄ! q!pQ:E <. ʄ$.:E <ʄ i 6}2E x N! ~态O>G~G!~G} *C !r#r#r ^ ͥ_y#x#{s+p+q-*C  ͥ!!q#p#w*:B O Y G }*MD "ã:!B w!>2*C ~=2u:B 2~2wE:A *C w>" !""2B !" !r QQQâ~?ͦ ~?r Q *"C Q- Q͜QüQr Q$Q*):B  " *)*)Q;*"E :;:A  2A QÓQÜQ*C }/_|/*W}_*"}o|g":ʑ*C 6:ʑw:2E* *E }DQ>2ê:Û50+ÍÑÕÙÝáëPý0123456789-, ., D D|͉2:32!JF#N#~ :G:H KAYPRO 60K CP/M Version 2.2H !"t>!2"!2"!"!"!T":OyO:|͍͉͑ Warm Boot 1͕Cx͝,͙͡ *xDM"x͝2 *t+"t|:q :.3.*>͛(:q /:.6.-!5O ~!ay''O "o>2q*oN#"o:q=2qy~y2qy.':.9.E.6.9:.9c.E@.9:.B.<P y˟O>y>O#>#>J!.4. 0.,.(.$. !"t.!"t.:4(.!sv1&{v˿~#O  8 >1͌0͌>>Ì 2r2s2<:r(!2s:s_ 2:r_ :<:s_ :r_ $@B B HH II$@DI ABI$"$H$H@$$I! H*  $H@@A I $D!!$I"BI"I"@$BIIH$$$$BBI$@BI!"$$A DI$@ A$@$$@H! "!$$" @B$!!!DH$$"H @@BHH  !$$A"D@ "A" "BHA " !$ D B I $ !$$ H@BD D$ HI DIA!$$$ $" "$D ! $"  $AB " BDD $$D!"DI$!$BH!"IB I$"D HD" " $"! @H !BI " I  $I$I$DI$ !I$@"$"$! $I$I @BI HBID B@  @$$@!!@@ $ HB"F32CD08CDE977 :1008600001CA6D0711CD08CD0E02C38608CDEA047A :10087000C38608CD6605C30903018207CDA701C35E :10088000860846494C452045584953545300CDF8F5 :1008900004FE10D209035F3ACE08FE20CA0903CD38 :1008A0001502C38908CDF5023ACE08FE20C2C4075E :1008B0003AF008B7CA89083D32EF08CD2902CDBD0C :1008C00001C3890811D6081AFE20C20903D5CD54E8 :1008D00005D1218308CD4005CDD001CA6B08210088 :1008E00001E5EBCDD80211CD08CDF901C20108E137 :1008F000118000191100017D937C9AD27108C3E127 :1009000007E13DC27108CD6605CD5E0321F008E523 :100910007E32CD083E10CD6003E17E32DD08AF327D :10092000ED08115C0021CD080621CD42052108010A :100930007EB7CA3E08FE20CA3E0823C33008060020 :100940001181007E12B7CA4F08042313C3430878ED :10095000328000CD9801CDD502CD1A02CD000131F3 :10096000AB08CD2902CDBD01C38204CD6605C30904 :1009700003017A08CDA701C38608424144204C4FA9 :10098000414400434F4DCD6605CD5E033ACE08D6B7 :100990002021F008B6C20903C&:U2!V!""V*!VM"V͟:!V2U! U6Û*U|!U2!V* U|!Uo&)##""V*T&+SDM*!V*!VM"V͟:!V2 U:U2!V!""V>T͇S+s#r*!VM"V͟:!V2U* U|!$V2T:T2T U(T(TͩC*$V&+ST͊S+s#r* U|!$V2!V:-Q/ *T&+SDM*!V"*T&+SDM*!V*!VM"V͟:!V!Uw:-QҢ!T6:T2TULTLTͩ*U|2!V*U|!Uo&)*"V""V*T&+SDM*!V*!VM"V͟:!V! Uw:,Q/Ҳ:V2V *V&U  :T2T*T&! S!0*V& U q*T&! S0*V&!U q:V 2V*T&+S"!U$-U RUW !T6#6#6:.Q2U:/Q2UTqT TyT Uͧ pT !T6Uͧ pT pT :;Rһ!;R6:%V2.Q:4Q/24QTT TT L!U6N!Vr+s+p+q*V6 *V#6 *V|O! *V## w*V|O! *V w*V}O! *V w*V}O! *V w!T:TO`iPSW "V*V :0Qw*V :2Qw*V :1Qw.*V :3Qw*V :4QwX*V   :+Q/ҼW*V >*V w:@*V wW*V >*V w^*V :/Qw!)X"V*VN#F!W "V*V"V*V͕S(!$V6-!$V6*VSD*VWR!"&V!V6&VS!V6>!Vڷ*V&)*&V>͒Sʭ*V&)*&VWR"(V*(V ͕Sʭ!V6:V<2Vf:-Q/!V!$V6!$V6V>X W*V"V*V~>>!Vs+p+q+p+q%N*VDMN 7*VDM$  7*VME :,QҨ *V&U *VDM :V 2V*V&U DM*V:V2V*V&U *V&+S:V2V*V&U ) :V2V!Vp+q*V"TͣN,ͧ*VDM !Vr+s+p+q*V^#V"T*V##^#V"T*V ^#V"T*V#DMT  *VDMT *TZSU͊S@?ͧ*T+ZS}<2V!V6!V:V҆*V&+SW "TDMͧ *VDM> :V<2VS*TDMO W*T"T!Vr+s+q:VGTqT TyT *Vn}2T*V#~2TpT WTS}pS}TR+s#r*V&)+!Vs+6:V!V4>T͇S+s#rBKͧ pT^ :V<2VpT *VT :-Q/k)Tw T z!LT"V!U"V͙!T"V!U"V͙!(T"V! U"V͙*V#DMT  *VDMT *VDMeͧWͧ *VDM> *V*Ws#r*V##*Ws#r*V *Ws#r*VDM> !V6&VS(>!V6>!V*V&)*&V>͒S*V&)*&VWR"(V *(V## *(V ͕S*(V ͕SH*(V ͕SH*(V ͕SH*(V ͕SH!V6:V<2V-:V!V6!V6!V6>!V*V&)*&VWR"(V*V&)*&V>͒S*(V S?!V6*(V ͕S:V/c!V6N:VO!=R ~2T *(V WR"*V**V N#F`i))"VN:VAO7N*V&6Q DMʹ ͜*V&6Q ~/*(V q#p:-Q/!V6*V&,V) *Vs#r*V*LV"LV*V͛ 2V'ͧ*V&+SFQ  *(V w*V&+SFQ N`iPS*V&+SFQ  N`iPS*V&+SFQ  ͕S *(V q#p*V&+SFQ  VzS*V&+SFQ  q#p:V<2V:-Q/!V!$V6:T<<2T:T<<2T!V6>!V8*V&NV) >w#6*V&pV) >w#6:V<2V:!Vڡ*V&)*&V>͒Sʗ*V&)*&VWR"(V *(V WR"*V*(V ͕SN:VAO7:7!V6**V ^#V!S*V&+S*V&NV) q#p*V&NV) nVR+s#r*(V ͕S—'N:VAO7:7!V6**V >R!S*V&pV) s#r*V&) VR+s#r **V R*V&pV) CS **V q#p:V<2Vk:Vҫ͜:T2FQ!T:/Q2GQ!"IQ!HQ6!V6ON:GR2T 5Q N*FQM ,7*GQM ,7*HQM N:V/҈!N!V6:5Q!V !V6:V/ :V =O!=R ~2T*V&+SFQ DM *V&+SFQ  N`iPS*V&+SFQ  q#p*V&+SFQ  ~ͧ *V&+SFQ  ~7ͧ *V&+SFQ ~2V*V&*V&+SFQ  N "V*V|*V}O:/QH҆MN!V:/Q*V&+SFQ  Hq!V:/QO`iPS*V&+SFQ  q#p *V}2V!V6!V6!V:V# *V&+SFQ ~2V*V&+SFQ  :V2V*V&+SFQ  *V&+SFQ  !V:V/+~!V/H+ |ͧ!V6 :V!V+~!VHc N*V&+SFQ :Vw!V6 :V!V+~!VH N!V:V*V&+SFQ  Hq!V:VO`iPS*V&+SFQ  q#p!V6:V<2V×1:V<2V"͜!V6:5Q!Vo!:V!N!N:V=O *V&+SFQ NE *V&+SFQ  NE :-Qb!N*V&+SFQ  N ͜:V<2V !T6!V6%NVʹ ͜PNT2V!TT TT N!V6Vʹ ͜:V!FT !!U6+6!W6͌!:W/җ#:R2T͜N;Rʹ :=R2T͜͜N,Qʹ ͜͜:>R2T:2Q<22Q  2Q :2Q=22Q:?R2T:1Q<21Q' 1Q :1Q=21Q:@R2THN3Qʹ ͜:AR2TkN4Qʹ ͜͜:BR2TN:0QAO7NTe:T"*TMV A2W*WM͈ /"Þ":W20Q͜͜:CR2T.Q *.Q&PS"U:DR2TN-Qʹ ͜:-Q/2T:-Q[#:ER2T/Q ͜:FR2TN+Qʹ ͜x#:R2T͜N!W#*W&U 6:W<2W#!W6>!W $*W&U 6$:W<2W#!V6*V&U  !V6TqT TyT Wͧ pT^ pT^ WS#ZS"U!W6>!Wڋ$*W&,V) >w#6:W<2Wh$!"LV:]A$!U6#6!W6>!W$*W&=R 6:W<2W¦$$!U6#6:mD$!U6!T6 Available space in 256 byte pages: $TPA =$, Bank 0 =$, Other banks =$Unable to allocate Dir deblocking buffer space.$Unable to allocate Data deblocking buffer space.$Unable to allocate Data deblocking buffer space.$Drive specified has not been defined. $0FFFFH is an invalid value in the DPH directory BCB address field.$ Setting up Blocking/Deblocking buffers: $ The physical record size is$: $ *** Directory buffer required *** *** and allocated for drive $: *** $ Overlay Directory buffer for drive $: $ Number of directory buffers for drive $: $Minumum number of buffers is 1. $ Number of directory buffers for drive $: $ *** Maximum number of directory buffers *** *** for the current drive is$. *** *** Number of directory buffers reduced *** *** accordingly. *** $ Share buffer(s) with which drive ($:) ? $ *** Data buffer required and *** *** allocated for drive $: *** $ Overlay Data buffer for drive $: $ Number of data buffers for drive $: $Minumum number of buffers is 1. $ Number of data buffers for drive $: $ Share buffer(s) with which drive ($:) ? $ Allocate buffers outside of Common $ Accept new buffer definitions $!W6>!W**W&)*&V>͒S**W&)*&VWR"(V ͕S*(V ͕SHҸ* *(V WR"*V**V ^6 *W&$SQ q#p*W&$SQ  6*(V ͕S*%ͧ!W4*!W6>!W+!"HW}2W>!W=+*W&$SQ HW|S ~H6+*W&$SQ ^#V"HW!W4**W&))lW *HWs#r*W&))  >w#6!W6>!W+*W&$SQ HW|S>͇SH+*W&))lW  *W6 DS+s#r*W&$SQ  6!W4h+!W4*!W6>!W7,*W&+SFQ  *W&W) N#Fq#p*W&+SFQ  *W&7W w!W4+:-QF,!fW6K,!fW6 !W6:W4:fW=2iW!"gW"dW}2 W! W6*T&PS*LViS"bW:-Qڞ,nVbWzS*ViS"bW!W6>!W,*W&W) *W&+SKQ  N#Fq#p*W&$SQ  6!W4£,!W6! W6#6!W6n&))lW  ^#V"JW*W&))lW >͒S:WH3:WE-1&N!W6]&N*W&))lW N#F$ {&N!W6>JWR>fS:WHҚ-!JWVS+s#r!W4g-!JWVS+s#r:W3*W&)*&VWR"(V WR"*V >RZS"^W **V ͕S-!W6-!W6*(V ͕Sc0bB*W&$SQ  >w:-Q.: Wd.! W6*W&$SQ  6&N:WAO7&N.:W{O!=R ~2T&N:WAO7'N*W&$SQ  DMʹ ͜*W&$SQ  ~.*W&$SQ  6.*W&$SQ  6t/:W;O!=R ~2T'N:WAO7>'*W&$SQ  DM  : Wt/! W6*W&$SQ  ~t/A'ͧb'N:WAO7'*W&$SQ  DM  &/*W&$SQ  ~^W͇Sҹ/'N*^WDM$ 'N*W&$SQ  *^Ws*W&$SQ  ~R0:W[O!=R ~2TM(N*W&$SQ  ~AO7(NTe:TL0*TMV A2 W* WM͈ *0/* WMF80/*W&$SQ  : Ww͜c0*WMTCc0 4*(V ͕Sn3!W6*W&$SQ >͒S°0*(V q#p*W&$SQ  6n3bB*W&$SQ  >w:-Qګ1: W1:W1! W6!W6*W&$SQ  6(N:ͻ 9 *-9 * -: ͻ : *DM*I.-!: *I.-+: I.-6: ͻ A: !,~<‘#~#‘P:<ʈH: ͻ U: ͻ o: :.': :,']: :-'ͻ : *&-ͻ ::C<: 3<O:xy ͵o&-ͻ :û :< : * | :G!@ :jOV  :\+!$ 4 o+x3!~ڲ O##~ N² #~ D² yʿ#~=² ʲ #* :32H3<² !\3͉.\H!\<̞ H!͉.3! ͳ.9>2(!;~<!" *"%*"'>21Ͷ:@*f ÿ:(D a :4ڲ Ҳ O!G4^.² :A >H2%3%a a >H.!<ͳ.3%<!.ͳ.3! ͉.!+͉.!.͒ 3!+͒ !͉. ͉.9c !" *"*h. ""!"R"  **h. `i"*"P/* "(*h.!!"ͯ))!:]2w>2]'+ͫ !!2]2v D!(&*X^!^! ^!: 2 !Dl! #c!!ByB.^#V:G:R/%#> ’!!R/52v(&%#:=%#͔#)*" *T/""*P/">2]:C 2v(&> 2v(&>2v:  2 (&2 :  2 : ":G:R/ҁ":S/ x"͖((6 !R/4Á":26#(*6*P/***" ~2*:¬" !q#͉.Ͷ'>w2S/'q1\+!NA#͸ >2 ͫ':  #*~* :w*͵* #:c )#'!:<+'q1\+2 :=2#P#:2!:N#r#!:M/w2M/4͔#:="&* +2~*+͔#(:S/#:R/*!:ʥ%4͵*+͛##:S/#<: #:]G:G#:P#:E#*P/*> 2S/6 :R/<2R/*g:k ͮ͜ ͫ*" }!"*T/=b$*P/:R/"P/*͵**P/h.+$:R/1$+'T/:_zW!4:*P$w+$~͔#S#=$͔#:=Gr#:S/$͔#"c )*"!"ͯ))͔#"c )*:_M%+~#M%J*9%"!:w#6ͯ))͛#c :=G*~ʘ%*.͵*+*G/Ϳ.**I/.m%*T/")͔#:S/²%:R/*.͵*+*T/"*I/Ϳ.**K/.A͸ ͛#c :=G*J*x&* /"T/"~*%!ͮ)͔#:c %͖(:  Y&( )!R/4:Y&Fw*P/B.~6*+"w(~h&:R/<2R/ q&2S/:vw }&2S/ƒ&> ͜ :  Ķ'͕&6#:.*N/~!Ԥ&:G~!ڷ& +ê&x2R/> 2S/#*y6."~6# &*`$"ͫl '":R/G|2M/:2:wG:]͖((6*͵*ͫ'!6(~ r2!'~j' j'rG'#3'#~rG':!'j'~j' j'rj'#V':G:2}!T/B.*((((*K/.* "OG*(y|}!4ͫ*A͸ 7͖((:=[(~ ʌ(*6 : 6 (#6 :R/<2R/:k *`ͮ> ͜ ͮ2S/:*P/=B.*P/*:  (y(*h.~p#G )!Y)6*}!"ͫ*T/[):=G:D)*[)}|"!06!X)6}|*:0G͆)!4#6:X)̫=[)!~ʥ)#:\ʥ):]¥)2Y)2X):X)̸ :&=2&*:=)*þ)"P/DM*I.DM*ͨ.#"͵*:&<2&"*P/**DM*I.DM*P/͓.+""P/:_~Gȧ# !4*Q"*:.yȹ6.J*+~#++~ e*X*#*{_zWy*f*y6.*P/J*y"P/B.**I."z*:R/g"Ͷ'"ͫ**"*P/͉.*x2S/y2R/:<6#=*++"N/*P/*"P/*P/**y6."͉.*P/:=T/_zW}|:*P/B.*P.|:I+:\+!"4!P+ͤ!ͳ:  :͜ 2 },w,!"8"6#"4!:<O},:V~+# +x28},6#":y, ,#:V~,+x29y, ,A."4* "*4"2*4|G,+"4,*" G,*6#"6%,*6|ʵ,* "c )*2h.K;\+-R; q1À,`;\+* "͔#":8!"6,ʩ,:Y)ʯ,c )͵,;\+!<:8O G:,O:=G͸ :G:R/,:26#*~,:9,**B.*h.h--͵*:91-:< 1-#͵*+*R-h.R-.*1-DMI.:R/<2*T/":8GH<^.ž-:9G:8ʏ--Ԫ-:9O*:͉.~#l-+T]B.*I.#DMͨ.#"#*:.DMI.#DM"͓.++".2.....:.0͜ *. '."..:.2.>0͜ ɧ/22/>!2/~6/3/Y;=O͞.:2/>22/>!2/~6/3/Y;Commands are Read, Write, Include, Filelist, Kill, Display, Change input, eXtract (X to backup, X=filename to extract), Block, Print, Spool, Mode, Tab, Linesize, END, and QUIT. Type the capital letter only, followed by any additional data required, or by '?' for more information.Specify R (Read some text) or Rn (Read n lines).Too little workspace. Specify number of lines. More text on file -- use R to Read as needed.Specify W (Write all) or WC (to Cursor) or Wn (n lines). Type R at the end to Read after Writing.Specify Ln to set screen width to n columns.Specify BM for Block Move, BC to Copy, BD to Delete, or BK to Kill Block Markers. characters to be deleted. Confirm (Y/N)? Specify P (Print all) or PB (Print Block). P! or PB! starts a new page, P= displays options.Printer in use.Continue New Page (Y/N)? END or END=filename must be typed exactly to end the edit.That file exists. Kill it or choose another name.Type QUIT to cancel the edit, QUITX to save the workfiles.ENDQUITXFlush background print (Y)? Non-text characters found in :: Type Return to continue, Escape to stop. Maximum width is Tn sets tabs every n columns: Tn,...,n,0 sets tabs at specific columns. (Use TW instead of T to tab by word).Mode Option must be T,P,AY,AN,BY,BN,CY, or CN.Ifilename opens an Include file: I@ resets the current one. Use I or I@section-name to start including text.Enter Cfilename to change to a new Input file. must be mounted on drive File is marked Read-Only. Check disk.Type F (or Fdrive-letter) to list all files on the disk.Dfilename displays a file screen by screen.Press Return to Continue Invalid driveDisk is EmptyList of files on disk Specify Kfilename to delete a file.Please confirm that file is to be deleted (Y or N): Not enough workspace.Cursor is inside block.Nothing to print.Type S to start, SX to stop, Sfilename to set up.File not found.Invalid file name.**Need 2 Block Markers. Found .**Specify X to Backup, X(or XB)=filename to Extract.Not enough workspace.Press Return to Continue, Y to Accept Escape to Stop, Return or Section Name to Continue - Not Found. Quick-Print Options Y-N ) is --> Page Size (Bottom Margin (Line Spacing (Left Margin (Single Sheet (Start New Page ( Print Options Okay (Y/N)? Edit System Status Updating Reading Writing Including Printing Finished Inactive Active Workspace contains Lines/Paragraphs Words Characters: -Total -In Use -RemainingMode: ProgramTextSpecial C/R Display: Auto Return: Blank Packing: Line Width: Tab Columns: 1Tab By Word: 1YesNo Display of ** Workspace nearly full! ** Workspace full! Use the W command to write some text to disk before continuing.Found occurrences.Search/replace request ignored.Cannot find exists. Write over it (Y/N)? Nothing to input. Disk is full!Sorry. Too many files on disk already. * is a new file (Y/N)? Loading input file *."z %"#"*P."* |…<:j2:ʡ 2N?2k?2?2?2?2?2>2o9:<2)@! """?*&)!T/!K/.!I/.!G/.:2C2! ͉.:k2+:T2 2]!J=>21i=!͉.m!m=\i=m=2(!3͉.! ͹=!4͹=:2<Ž=:322͍>>X>=!| :< !$ ͻ f  ~?= #û=+  !ͯ 2> !(4:1>!$ < N Y=:(><!+͉.<!+ͳ.>j>S>:<$P>!3$ ; N Y8>v>2S:H:_3H<|>3%3*<;  +$™><!~ʴ>^.ʴ>####Ü>###F~>!.>>6!,>@>w/2-!-> 6> 2kS  !!?͉.!@͉.#͉.c N? >(!B͉.> =?:G? o+ ͻ  The Magic Wand (tm) Text Editor - Release 1.11 Copyright 1979, 1981 by Peachtree Software Incorporated Atlanta, Georgia Version: **************** Serial Number: 0000 0000 wMQs#r(@Ü@:3o&|ʜ@cN!9^}2KTNï>! 9~@*M5K!"M*2O!@#*2sPA)2^#V##^( COPYRIGHT (C) 1977 DIGITAL RESEARCH 112O02Z0̀%!"K2.>2.*M0"$/̓%!"":g0i!"P0"R0"2:0v: 0$  :[0-ʬ+ʬ* :[0!_0M!f0P p  !   :O0Ĝ!":O0*V0}|<r ͪ*|Ĵ:O0_͑H *V0"Ù*V0"E V» ͪ»**»"Ù*K0"X0!0NA#~' ~p"K0*K0N"X0!0q#*w œ:0!x ͜ *V0*R0:_0̍"V02*M0r; !:r :0F: 0e%;m ">2:0b: 020 W,F:0b: 0e,ʹ:re*X0#![0~ʇww2/ͬ:2T/-"."$/2/>2.v:.ʸ!/6+͕%>20:.ʮ:.0209$<!5*}Ģ*V0":0y: 0:yv! X! ^#fkX _~ 0^ Z   2 5 8  :0‰:0=ʉG! 0ʃF#2sÖ*I0| E2V ,[ ͊m *R0"R0"P0 m E2D2V ,ʾ ͊:/ m :/ "> 2/:Į:0 : 0 -Ͳ !/6+:.;?*$/*."$/?"$/:.l*.^#V{r+s5*.^#V ʓ:. r+s!06#wÚ> 209!e/~6![0~6".~,#!0w9 9*.~6 *: 0,Ĵ2f/*.s#r2[02e/*.#"X0$<5ͬ*$/"M00:T/2:/2[0 v>20*.".2[0v*R0m "R0͍"R0!/w >=G*R0*I0"R0"R0 m :/ }>͞ ¥͢ :O0*V0*ʿ͜">2:O0:0:O0!!4:0: 0,>"4:O0: 2\0:0=: 0 F!Fʹ%*X0"`0>2Z0*X0":0k: 0T!T:\0¦:O0¦:0=ʦ ʦ*"X0 !':[0'Tx»!Z04TT!Z05T:\0!":]0!**V0":O0*X0~ Ĵ*X06 '>#G*I0!" :0 :Z0 !0N*K0:O0Ÿ"b0+"X0yʛ 'É' Ͳ >ͮ 222:0: 0 !ͮ-:0:0!4 :0& : 0::0!xI !4̨ e ::̮>͞ } !~5:Į ͵ !4̨!~5 G!~Ҩ4_!p!~ʮ5^!~> >2\0:0N *K0"+"X0:0 >''!:0N : 0,N :0 >  > !0N#~' ) > ''*K0"V0:\0x ʹ:\0" m }*K0"+"X0''*K0"V0>"4ͬ:2T/:[0 “ 2/-*M0"$/*X0!{#zڿ ~+"X0*M0+"M0wß #"K0*M0".:\0 N]T s#r+*V0*{_zW".:\02.R     % *I0:/ ͪ% ͬ:O0ĭ%  :.ʢ :0¢ *K0+"X0!2<20*#"" : 00Ĩ!??" 09"K0+"X0$< :0¢ : 0,? ʹ  *} :]0 :O0 :0 ͤ%:e0ĭ%:0 : 0  ͬͧ%vʹ   ͺ :0: 0 !;* _!5 ^#fkS \ h n 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D y0P 2!0^4! 0q :0Ė: 0,; Ė*I0m |}$† ͌oy Ԍ͋ 8O͖ Ăy01y 1m X:0 : 0, >C͘%:0 : 0 v;:0 : 0 v-!v !v-ʹ {ozg:.7ͮ2Z0!O0~4l!"*|>"V0*""J͊!/6 !/͒%:^0ʏ>2.͡%ͱ*K0*T0&*M0*T0&\ ͍!/w#õH USE FACTOR !/͒%*"P0Þ%z{*P0"R0*"V0 !":O0Ģ*R0̜*R0ĜG:O0xě%:/ *R0̍:xz*P0#"P0E2D20:b!^4!/wjj*R0!6zz{z4A_A?ɯ2.2*T0"V0!.8w# *V0*K0{zҤ*b0+"X0 =$**X0#Þ!.*V0".#"X0$:d0<:0<! 0~?<#ʐ: 0͡!.".^#V"V0}{##~2.*.^#V#"."V0*V0}d##~<2.G*V0##"X0:.> u!.~w>w> u:.P'!5^!/~ !~620͕%2.|z}z> u!.~w:.W=*u!.4C*V0^#V"V0ý!.5¯:20͕%!^4!/w>R͘%>V͘%>Dý>Pý>Lý>Oý>Bý>Sý>N͘%*6".~ 6654321-!2~B6~44O!! s#r!1~ _6^4! w!p!2~~!55N!! N#fiooo&)^#fk9BIO[ov ͌z{>ɯo>g͌"!6ů{_zW5>)D*OxG !?DM!xGyO23)#͌)=R|g}o=^͌͌roz{͉͌͌}|͉͌Þ͌Þ͌ë͉͌!!o#Ã͌zg{o͌zg{o͌zg{oolo&3:0: 0 ;!,ɯ2122=2 !"I0&q!1~\5_! ~͔D:2:/ *!"I0:/ :0:0! 0^#=ʙV¨*0!҂ :0:0& !!>O: >2 yU`:10_!~0!1s! ~͔ yU!1~N=w_! ~QZP>2 ypP͘% >U̘%>: 2 3>E͘%óf:.O*.~H:.=!4>͕%0:/#". ͆%2G:0xa{_ ʇ ʇ:0x҇_<20!/w:e/S:e/9ɯ2f/2d/2e/:0:e/ !2f/g/~#»S͉!f/~4!g/_:e/w2e/ɯ<*V0"36*"V0ɯ2!4!f/6".!f/~55!d/^4!g/~f:.:e/JGwf^l͗^{:e/&{!f/4#ww&ʞGʱ2e/xf͗ :e/&ʕ:0  ý͗&{&{ý͗  !e/~&>62/-!.6*M0"$/B".2f/*"V0͗ 2f/2e/2[020> 2͕%>20ɯ202!0~@$6^4#:[0w~$w:[00 6:[0A:[0?e@eAɷP6 o2[0:Z0ʦ:\0 :O0¦:[0':[0 !20:[0 R;/>20:Z0?:\0:O0?́;B*`0*X0++{z~ ++!+"X0:Z02Z0́ͪ'2Z0X:[0*K: ḰͪX? X́ö20Pg>ã6r>ã:[0'ƒ2[0>ã ¡:.ʔ>+2/͕%!/6 >20>20:[02́:0:Z0: 0=!EQ<!LT:[0=!LE>!GT:[0=!GE2[0" 0!04>20![0:0/ʦg¦´/ʦA¦:[0O<QA>HHR>22[0m:B_>fD> j!052!"0!0N#~#A҄0Æ7O!~*0!ʩң)Ú "0 x:[0 '¦́'æ:[0 :[0,;%:[0 !:[0; ,202́/>20:[02́:0G:0::0l:[0'́:[0' 20/:[0'|>20^—́:[0  <¨!~4 >¼!~5 : >20>V>O>I>B͘%!QéÉ $ ? H Y ` e Ò ü ò ~ÏGÇåûfD?<==:e>?; ><>; ;<=R>>>F>;>G==<==>=s;=P=*>=$?P:-?]>*<<==<;=>>y> ;: =;>?>P?<=?>>=<<i;m=>c==>o>v<=<;8?N!Nw#w#W!"V0!.w#w#l2N!.~4^!.~w!.ͼ!.ͼ!.ͼ!/~w!$/ͼ!D/~w!T/~wN#Fp+q!.~^!.!. !. !. !/!$/ !D/!T/5~wN#Fq#p>BØ%!0" * F#%2NG*V0##~w*V0##~<͉:.t!.N!. yq~t +aG=#w#wY*M0!0n& {ozg"V0!K0{#z"M0b*M0!0N#yʢ ~Õb!."O1:N *M0!$/{#z"V0$ _!.*V0~#~1 ~#"M0û1 !͒%Þ%SYMBOL TABLE OVERFLOW G*V0##~w*V0##~=*V0_###1 s#r1 ^#V1 ##"X0P wP ~O!0~z 6~=ͼ !0N#~ͼ „ Ͳ O2Nyw: WS2! W6*W&$SQ  ~S29)ͧZ)N:WAO7)*W&$SQ  DM  2*W&$SQ  ~$3: WҌ2! W6*W&$SQ  :Ww 3:WkO!=R ~2T)N*W&$SQ  ~AO7)NTe:T 3*TMV A2 W* WM͈ 2Ü2* WMF2Ü2*W&$SQ  : Ww͜*W&$SQ  :Wwn3:U!W]3:W+O!=R ~2T)N*W&$SQ  DMʹ ͜*WMTCn3 4! W6*W6 dWDS+s#r!W4>JWR>fS:WHҿ3!JWVS+s#r!W4Ì3!JWVS+s#rç-!W4n&))lW  ^#V"JW-!T6!W6:W 4bB)NWʹ ͜P,!"PW}2Wo&"TW2W>!Wu5*W&$SQ  ~n5*W&$SQ  ~ >Hһ4:-Q|4!W4á4*W&$SQ !^N#F-S*TW"TW*W&$SQ  ^*PW"PW*W&$SQ  ~ >Hn5:-Q/5!W4*W&$SQ  ~,5*W&$SQ !^N#F-S*TW"TWT5*W&$SQ !^N#F-S*TW"TW*W&$SQ  ^*PW"PW!W4#4*fW&*PW+S*W&) "RW:-Q9W*U"jW*RW*U*TW *LV *V *nV |O:.QO:T2UO:T2T:T2T:T2T|2U!T2.QW"T*T&PS*U "ZW*RW "VW*T"`W*`WW !T͕SC6*`WW 6*`W#"`W6!W6n&))lW  ^#V"JW*W&))lW >͒S:WH9!W6>JWR>fS:WHҶ6!JWVS+s#r!W4Ã6!JWVS+s#r:W8*W&)*&VWR"(V*W&$SQ  >«7*W&$SQ  ~h7*jW6 *jW *VWs#r*W&$SQ VWR+s#r*(V *ZWs#r:fWZWR+s#r:fWjWR+s#rë7*(V"LW*W&$SQ  n&)*&VWR"(V ^#V"NW*LW"(V *NWs#r*W&$SQ  >£8*W&$SQ  ~48*jW6 *jW *VWs#r*W&$SQ VWR+s#r*(V *ZWs#r:fWZWR+s#r:fWjWR+s#rã8*(V"LW*W&$SQ  >o&)*&VWR"(V!Q  >ʂ8*(V ^#V"NWÐ8*(V ^#V"NW*LW"(V *NWs#r!W4>JWR>fS:WH8!JWVS+s#r!W4ç8!JWVS+s#r6!W4n&))lW  ^#V"JW\6!W6>!Wc9*W&,V) >͒S\9*W&)*&VWR"(V *VWs#r*W&,V) VWR+s#r!W4 9!W6>!W9*W&)*&VWR"(V*W&NV) >͒Sʽ9*(V *VWs#r*W&NV) VWR+s#r*W&pV) >͒S9*(V *VWs#r*W&pV) VWR+s#r!W4h9aB!W6>!W::*W&W) *W&+SFQ  N#Fq#p!W4:*V*RW*nV "RW> U͇SUzSH҇:*TW*U|O:.QO:T2Uá:*TW* U|O:.QO:T2U!U:T2T:T2T:T2T:.Q2.Q* U}pS} URU͊S"`W> U͇SUzSHB;*RW|O:/Q2T*U}pS}URW"\W*T&PS"XW*T&PS*U "VWÇ;*RW*`W|O:/Q2TW*U"\WO`iPS*`W "XW*T&PS* U "VW*RW*\W"T*U|O:T2T*W&)*\W"jW*XW"ZWWTS"U*T"`W*`WW !T͕S;*`WW 6*`W#"`W;!W6!W6!W6:5Q!WS<*W&+SFQ  2W!FQ  ~:W!WHL<:W2W:W2W!W4;:T2FQ!T:/Q2GQ:W<*W&+SFQ  O:T<*W&+SFQ  N`iPS!͕S"`W!FQ :T w*W&+SFQ  N`iPS*`WiS!q#p!W6n&))lW  ^#V"JW*W&))lW >͒S:WHғA!W6>JWR>fS:WHh=!JWVS+s#r!W45=!JWVS+s#r:WxA*W&)*&VWR"(V*W&$SQ  >0?*W&$SQ  ~>*(V"LW*W&$SQ  n&)*&VWR"(V ^#V"NW*LW"(V *NWs#r0?*\W*ZWs#r*(V *XWs#r*XW##"XW*\W##"\W!W6*W&$SQ  ~!W ?*W&$SQ ^#V͛ 2W*jW6*W&+SFQ N`iPS!N`iPS!͕S  *jW q#p *jW 6*W&+SFQ  *W&$SQ |S+s#r:fWZWR+s#r *jW s#r:fWjWR+s#r!W46>:fWjW͇S+s#r! >w#6:fWjWR+s#r*W&$SQ  >1A*W&$SQ  ~¤?*(V"LW*W&$SQ  n&)*&VWR"(V ^#V"NW*LW"(V *NWs#r1A*\W*ZWs#r*(V *XWs#r*XW##"XW*\W##"\W!W6*W&$SQ  ~!W A*W&$SQ  ~ҩ@*W&$SQ ^#V͛ 2W*jW6*W&+SFQ N`iPS!N`iPS!͕S  *jW q#p*W&+SFQ   *jW w*W&+SFQ  *W&$SQ |S+s#r@*jW6 *jW *VWs#r*W&$SQ VWR+s#r *jW 6:fWZWR+s#r *jW s#r:fWjWR+s#r!W4?:fWjW͇S+s#r! >w#6:fWjWR+s#r!W4>JWR>fS:WHhA!JWVS+s#r!W45A!JWVS+s#ru=!W4n&))lW  ^#V"JW=!W6>!WA*W&7W *W&+SFQ  w!W4˜A!W6>!WaB*W&)*&VWR"(V*W&NV) >͒S"B*(V *ZWs#r*W&NV) ZWR+s#r*W&pV) >͒SZB*(V *ZWs#r*W&pV) ZWR+s#r!W4A!"W"W!W6:5Q!WB*W&+SFQ  ~¶B*W&+SFQ  VS*W"WB*W&+SFQ  VS*W"W!W4pB$N%N!bWVSDM$ :-QMC%N*WDM$ :U C$%N*WDM$ >W͇S>W͇SHHC!W6MC!W6͜͜!Ws+q*W&$SQ ^#V"W:-QڋC:fWWRbW͊S+s#rF!iW55:W®D*W&$SQ  ~2W!W6:W!WګD!fW:iWYD!iW6*gW#"gW!W6!W6!W6:5Q!W7D*W&+SFQ  2W!FQ  ~:W!WH0D:W2W:W2W!W4C*W&+SFQ  S+s#rcD!fW:iW2iW*W͛ 2W…D4%ͧ>äD*W&+SFQ  WzS+s#r!W4±CF*W&$SQ  ~2W!W6:W!WF!fW:iWoE!iW6*gW#"gW!W6!W6!W6:5Q!WME*W&+SFQ  2W!FQ  ~:W!WHFE:W2W:W2W!W4D*W&+SFQ  S+s#ryE!fW:iW2iW*W&$SQ  ~ڼEWbWzS+s#rYS:/QpSҹEd%ͧ>E*W͛ 2WE%ͧ>E*W&+SFQ  WzS+s#r!W4D>!Wq*W6 dWR>fS'F>%ͧ>ERROR: $ at line $Missing parameter variable$Equals (=) delimiter missing$Invalid drive ignored$Invalid character$Invalid parameter variable$!"WWͧ !W6!W6:W GG:WG͈K2W:WFIGF GF!Wr+s+q:U2W!U65FN*WDMN>FN*WDMZ :WCG.͜:W2U:WoG!W6TlG!W6sG!W4MG*W&W ~2W:W :W H:W HG:W ·G*W#"WMG*W&W ~2WÄG:Wa/>z!W/HG:W_2W:WG!W6:W!W6:W/:W/HI!W6>!W/H*W&W 6 !W4HtG2W!W6:W:W=H:W H:W/H~H*W&W :WwtG2W!W4:H:W=:W H:W/HҧHtG2W~H:W I:W=>!WHH!W6 I:W=HHF GH:WHcF G:W :W/H ItG2WHGtG2W!W6!T:W:W H:W/H[I*W&T :Ww!W4~`i+wtG2WI:W :W/HxItG2W[I!W6#6>!W҇K *W&+S P  ^#V"W! P  ~2WJ:WI:WA2WI:W0/>9!W/HI:W02WI:WA 2W *W&+S P  ^*W&+S*W"W*W&T ~?[J *W&+S P  :WO!=R 6!U6!W4!T5>!T҇K:WʧJ*W&T ~A/>P/HҜJ*W&T ~A*WwäJF GÇK:WJ*W&T ~Y*WwÇK!W6*W6!W6:T=!WڇK:W!WO!T ~2W, K*W#"W6!W6ÀK:W#K!W6 ÀK:W02W:W> !WHQK>!WLK:W2WQK!W6!W:WxK*W^*W&+S*W& sÀKF G!W4J!W6!W6:W:W/HK!W6:W *W&+S P *W& *W&W HK!W4éK:WK!W6K!W4ÒK:WL>:WWͧ T. T~ !W6!W6>!WN!W6#n& +S P  ~2W!W6:W:W/H N!W6>!WڞL'N *W&+S P *W& *W&W w!W4gL:W°L!W6L:WL:WA*W&W wL:W L:W0*W&W wL:WA *W&W w'N*W&W 6 'N*W&W 6='N*W&W 6  *W&+S P  !^*W&+SR"W:WmM'N*W~A*W&W wM:WʞM'N*W~ҐM*W&W 6YÛM*W&W 6NM*WNbN:WM'N*W&W 6,*W#"W*WNbN'N*W&W 6,*W#"W*WNbN'N*W&W 6 'N*W&W 6 !W4PL!W4'L>!W NT^ T :W]NT^ !W6>!WUN*W&W 6!W4:N!W6aN!W4!Wq'N:WO! *W&W w'N:WO! *W&W wO*TDM}oN*T†O]!O> 2 PW:TgxʀO { O: PO*T!O†O~#o}o|O<O:TzO<.O:TƜzO<8O:TzO:TzO:TotOzO:TgN!|!|PRTMSG ,QPAGWID 2QPAGLEN 1QBACKSPC 3QRUBOUT 4QBOOTDRV 0QMEMTOP .QBNKSWT -QCOMBAS /QLERROR  +QNUMSEGS  5QMEMSEG00 KQHASHDRVA6QALTBNKSA +QNDIRRECA ;QNDTARECA KQODIRDRVA [QODTADRVA kQOVLYDIRA {QOVLYDTAA QCRDATAF ;RDBLALV ))덑o|gS =S^#V))) DM!>)):S =2S_og^#V) PS^#V|g}o ZS_{ozgO{ozgi`N#Fogo&og_{_z#WBNKBIOS3SPRRESBDOS3SPRBNKBDOS3SPRCPM3 SYSGENCPM DAT . $D. RESTORE ABORTED$CANNOT OPEN OUTPUT FILE, RESTORE ABORTED$ERROR IN WRITING OUTPUT FILE. RESTORE ABORTED$1 ͢c:–͉:qL *, !>LE 22@2go"<":!) ʹE ͉<M d!C~#~Y8N/2@.<MÙ<Ù:*#"2!!~G+~G~G!$E ͉ͤ<¼|s!"9(!~<L@#:2!@LôL :!"&2A:G*&W**P>ͽc>!5J2G2!"<l*&"&*<#"<!A4ͽ2@:c!"&:A *"2G:*>%Id!C~?#~2A?<?o7Ɛ'@'|}B V!CFʅ#~ao{o_wo~@#ʹʹ͉~#´͉_  **<P ! *9#"97:@ "*#"|3 }< G_w#E c!"&:A *"2G:*>%Id!C~?#~2A?<?o7Ɛ'@'|}B V!CFʅ#~ao{o_wo~@#ʹʹ͉~#´͉_  **<P !è COPYRIGHT (C) 1980 DIGITAL RESEARCH @: 5@%65432115252'5h+U"!""*"5j"2u3>2v3*5"3-ͩ-:5Z!""$"5"5"5"5"5" " 522>2 5:4 b:4$M:(5-C+C*M:(5!,5M[!35PMp%M(ʡͣ#v#ƒ$:5}% }!"&:5ʦ>%*#5}| V AX*|:5(#$*#5"A*#5"&#v#% RØV AR*&*R"A*5"%5!4NA#~ͫ% p"5*5N"%5!4q#͢%w 3:4(x *#5:,5o"#5V%2*5Ô; !:V :4:4{%͉"">2!:4:424*o,kÊo:4:4{,ʊ:k*%5#!(5~́ w23@:2(4y""3"323>2v3 :u3L!P46+(0>24:u3:v3"U24͋$͇%ͩ$!5*}*#5":4:4: =X!^#fk:Vj&AW y ~   8 ; C :4:4=G!4F#I ,*5͘EIr,o͉n2"5~2 r,Yo :K4 ͉:K4 " : 52> 2K4::4M:4 Mg %U!P46+:v3Ϳ$ý*3*3"3Ϳ$"3½:v3*3^#V{ʽr+s*3^#V ʽ-:v3:r+s!46#w4> 24͋$í!94~6!(5~6"3~,_#!4w͋$ÏV *3o6͋$*3~6 Þ*3:4,"3~ š62:4*3s#r2(5294*3#"%5͇%ͩ$@*3"5":(42:32(5Ģ >24*3"32(5 ͉r!Q4wM>=n2*5~2%! 5%~2͉:K4 v }>v S M:5p*#5*gu>%"u> %2 :5O%:4©:5[%! 4:4©:4,ʀ>:5: O%% 2)5:4:4 !*%5"-5>2'5*%5"&:4:4(:)5N:5N:4=N N*&"%52)ͫ%:(5ī%x;c!'54!'55:)5ž!":*5ʍ!5%Ù*5%*#5":5*%5~ *%56 ͫ%<͉:K4 "5~2o M%(>@%>#*55%!".!/5",:4M:'5M*,~#T :5T !4N*5*,s#r+"%5yP  ͫ%> ͫ%%g >v % 222:4¦ :4 – ì !ʬ ¦ À :4:4€ ( :4 :4:€ :4€ (€ € x !4À  :€ :>S %2 !~5€ :%j B !4À € !~5€ úG!~4_!p!~5^!~>À >2)5:4 *5" +"%5:4ڥ >ͫ%ͫ%[%:4 :4, V :4  + !4N#~ͫ% > ͫ%ͫ%*5"#5:)5- :)5%͉}*5" +"%5ͫ%ͫ%*5"#5>@:2(4:(5 H 23y"*5"3*%5! {#zt ~+"%5*5+"5wT #"5*5"3:)5ʑ N]T s#r+*#5* {_zW"3:)52v3 > > >2 5n2"5 %: 5*#5* 5"#5*55%"#5:5KBn2: 5O0!*", ++ *5:K4 0@:5Ĩ/ú>2) :u3ʭ :4­ *5+"%5[%2!<24*$#"$""*:40!??"4͋$"5+"%5͇%ͩ$+:4­ :4,J "*} :*5 :5%:4 +:25Ĩ/:4 :4  @S+ >2):4„ ͣ#v#: :5$:)%k %G I k :)%:)c %k %+:4„ :4, " :4 :4/ :4 :5 $*#5^#V*S"s#r*5*#5s#r+"5 |#v#*#5" 5:4 :4/ !"5:5> %AB,#*#5 :4:4 !;*M_!Q^#fkox Iͻ8ʗy0IͻGͰͻHIͻ(yIͰͻͻy0ͻIH'd ! ^#V#*"0}o|gF 9"":!`x=`y0l2!!4^4!4q/:4:4,; *5͉: 5ª|}$ªo͕Ͱ8Oͻy0H͕H͉: 5në:4:4,>C0:4M:4  ;C:4#:4 ! #! #{ozgBB**}j!]~ } #ymy>2(>2v3͖*5|EB"#5>%0,# ^#VÕJB*50MB*50!".*5} "#5^#V"5*.s#r+".*."5:u32'5!5~4P!"*|"#5>%*5%"".o!P46 !L4*>2(>2v3͖>2(>2v3͖NB:O* 0:+5ʘ0*5*!5S*5*!5S\gr!P4w#þH USE FACTOR !M4** "5A1z{*5~2*"#5v#!":5(%! 5%n25%%%>%n2G:5x:L4 o:x_*5#"5:5ʽ*5|ʉIB0>%%O%O: 5%*55%ý:5ʽ: 5O*5*5ESS͎2O=>O͎2N=#y{#* 5* 5 "#5" 5͎21͎2=HÎ2Î20:G!^4!K4wOOn2!6z_{_4A_A?*!5"#5*#5*5{z*/5+"%5**+"%5% V%=͇%͢%*%5#þ!v3ʲ:(O! ^#V4@B%GFB>%%O0*#5##~<##ò*#5"|3#"%5͇%:15^:4^!4~?^#ʲ:4͆!~3"z3^#V"#5}ʝ##~2v32w322(!~38w# ͖!~3"z3>2y3*z3^#V#"z3"#5*#5}&À# $b${$*!:!X!!M"p"""""4#\#j# ()*+,-/ABCDEHLMDBDIDSDWEIEQGEGTIFINLELTNEORSPACIADCADDADIANAANDANICMACMCCMPCPIDAADADDCRDCXENDEQUHLTINRINXIRPJMPLDALOWLXIMODMOVMVINOPNOTNULORAORGORIOUTPOPPSWRALRARRETRLCRRCRSTSBBSBISETSHLSHRSTASTCSUBSUIXORXRAXRIASEGCALLCSEGDSEGELSEENDMHIGHIRPCLDAXLHLDNAMEPAGEPCHLPUSHREPTSHLDSPHLSTAXXCHGXTHLENDIFEXITMEXTRNLOCALMACROSTKLNTITLEINPAGEMACLIBPUBLIC7 PF FPA A A* A A A(#&&#&2#/?&#' '( v'( %:P!@"<& #*)&# PP%27&#(&#  $ %*%"$  NZZ NCC POPEP M x#_BH!™# 0#³# £#{ڽ#KÅ#CÅ#<: 0 JCR:0 $# $! 06 p#! 0$# # ɯ<:0O=_^$!"F!!V#fjQ̀#G$2!!!^#Vo&)O~#F##xGyѯ *\ ?=)$=)w#Ž&!\60 ڱ&>GO#w ³&>O # &6 &6L#6I#6B#w2|r&\u'>2]0!"%![0~2%wG&!,x&>82%2%!"b0*"M0!1"%"&"@&#"K0"T0' _#~6' D':%A6'>:6'D'>.6'D'>-6'x&!,N'!k-x&!,N':% '> ':%'_!% '6 4ɯ2%2]02e02d02g02%:\ =)!%w#w#w#w#w#w#>2^02_0:m$(!~#$,(~(# 3(%Aʩ(Pʩ(Sʩ(Hʩ(Lʩ(*t(+t(-¶(^0~Sʣ(Mʣ(e0Lʣ(d0Qʣ(g0Rʣ(%1¶(x#3(~AҶ(#3(#6 !)-x&!x&!%͉&!%͉&ͳ'(`&͛'͠':%)!&͉&l&͛'͠'!%60#60#60#>2f0!"&:O0*!"%2%2%2%Z&%u'!-x&z{:]0ʢ)*%F)w)!"%r&\‰)*%#"%+~):.2]0ʢ)r&\!~-N'*%F))Z&!"%*%B&%)¼))*)6# )G&*%*%#"%~!<-x&G:%7*$*x*7*x2*Ϳ'5*9**&*&w#"&!F)`&!"&*&%~ʅ*B&Œ*`*G&`*!S-x&ö,͟**>&*@&w#">&!F)l&!">&*@&&`*_!%~ *2%*b0}!,~ +*#+> *>#**> **b0~>+*#2+> *> *> *}2%!%*O*:/ :O0:%y*:%!O0•+:e0!]0+~,:/ ,!/~ +:f0,:/++:_0,+:/#,:/ ,:_0=+!/~ +!0s!%~!%*4:0!/,G~Y+#x=+> Y+> Y+20!/>x6 #=,G!/~ pͳ'*&}?,>*/,`&%͈':^0*+,!&6S#6Y#6M#w!&w:%2%!"&ͳ'*2%`&%͛'͠'+,:%ʶ,:%.*P0"%.*>&}ʶ,>͕*æ,:%,l&&͈'!-x&CP/M MACRO ASSEM 2.0 NO SOURCE FILE PRESENT NO DIRECTORY SPACE SOURCE FILE NAME ERROR INVALID PARAMETER: SOURCE FILE READ ERROR OUTPUT FILE WRITE ERROR CANNOT CLOSE FILES UNBALANCED MACRO LIB END OF ASSEMBLY G:%x-!%~--.-*P0*%O {-z-.*P0"%!%^4!%w..WƐ'@'Õ*>:͕*!%^Ww*%{-|-}--{?.!%~#-6.-> ͕*> ͕*͞*> ͞*ws3 Copyright (c) 1979, Digital Research????????????CON:RDR:PUN:LST:DEV:VAL:USR:DSK:TTY:CRT:BAT:UC1:TTY:PTR:UR1:UR2:TTY:PTP:UP1:UP2:TTY:CRT:LPT:UL1:R/OR/WSYSDIRR/O R/W SYS DIR ** Aborted **Active User :Active Files: Drive Characteristics65536: 128 Byte Record CapacityKilobyte Drive Capacity32 Byte Directory EntriesChecked Directory EntriesRecords/ ExtentRecords/ BlockSectors/ TrackReserved Tracks is Temp R/O Disk: d:=R/OSet Indicator: d:filename.typ $R/O $R/W $SYS $DIRDisk Status : DSK: d:DSK:User Status : USR:Iobyte Assign: =Bad DelimiterInvalid AssignmentBad Delimiter: Bytes Remaining On R/, Space: Invalid File Indicator** Too Many Files **File Not Found Size Recs Bytes Ext Acc65536 set to R/O Invalid Disk AssignmentWrong CP/M Version (Requires 2.0)!9"2!T OË!]6:\:] Hr3 Ë:\ʀË͇ /ҋͺ *2!"q*"&L ͐ ͐ ͐!$p+q*#~*#N͐*##"#÷!&p+q͠*%DMͱ O O!(q*(&L!*p+q*)O2'!,p+q*+O2'O2'O!.p+q*-LRRLR\LR" O!/q*/& L!1p+q*0#L~*##N!ͽ͞"T!Vq*VMͳ!Xp+q!W* >Wr#MͲ!_p+q!`6>!`6*`&*^*`&Y />!`4 >*]& ~ O!]49!a6:a*]& ~2bO>z*bM >!b/~,H~:H~*H~.H~>H~<H~=H*]& 6!]4T!]4!cq*a&Y :cw!a4!gr+s+p+q!h6>fr*d*f!is*d́"dPY! "f>!h#~Haͫo!h6:i0O͐!mr+s+p+q*lTZs#r*lڶ*l+s#r*jN#F+q#pÌ!nq!"o"q}2uo&"s* s:n*sDM2u:uqos*s"s*o͊O !v6>!vQ*v&w 6`i+46)A*:'ʓ:'O!) ~2vʍ:vO!w 6,]!v6>!v*v&w ~һ*vM !v4˜8AO͐:͐ͱ*##N!ͽ"* N#F*͠">!H% - *DM ͱͷDM  ͱ* N#F 9ͱ * ^#V))DM Tͱ* ~ *} *M!+s#r#4 !s+p+q!6!66:!ڄ !6!6>!r *&**&Y i !6!4+4A :} :!4- >!699 2¨ :!4: :2!6+6>! :O!9 DMi ͱ:!O!Y DMi :2:2͠!4 F :® )!6>!ګ ͠:O!9 DMi 8ͱ!6> !ڤ Å :2k ä  ͐:!O!Y DMi w !4C F :¿ >F : F :=229:Y= ;>9*&Y DM =2 I>!6:=28 :2:2 :!!29:Y T >:Y,e \>Ì !p+q*~:ʉ *N͐*#"o :͐!p+q!'"!6> **{2*́"PY! ">!+~H !6:0O͐à k͐͠Q" 8AO͐jͱͷDM͏ m  Z"l"!6>ʥ *}҆ *M ͱ*}x O͐} W͐ͱ !+s#r!+s#r#4D ͠:\ʹ :\=Oͳͩ !6!)6l :) :)=2) :] & !"}2\!h6?!j6?\:'C:'ƀo&")!)6!"):)/)HҘ]!)6> !)ڎ*)&*)*)&*) y!)6 Ä:) 2):)<2)M*)#")/:)ҩ*)+")`*")#"]!*)!/H!")!"]*)) *)s#r!)6> !).*)&*)*)&*) w:)<2)*)) >w#6*)) w#6*)!) w#6*)%) w#6*)) N#F*)) q#p*)%) *) ~e *) * ~o&͞ *)%) q#p!)6* >!)6!)6>!)=:)!)w=*)&*)~2):)*)& *):)2):):*)!) *)) s, >X\:)“>!d!")>!)d!")!")*++!)a*)) ^#V")]*)")*)) ^#V")]!)6> !)T*)&*)~2)*)&*)~2)O;*)) ^#V")*)) *)) N#Fq#p*)) *)s#r*)#")!)6 J:)!)J!)6 :)<2)*)")҈q:tw͠ͱ!"))ҍ*)) ^#V")]͠.*)DM\ -°!\6:\ͣ:ͱ*}DM'ͫ*)%) N#F'ͫ*)!) N#F'k͐ͫ*)) N#FͫR͐/͐ *) ~IO͐NW͐ͫ8AO͐:͐ *) ~2)t(͐:)҃)͐*)#")Ã& \!"))\Ұ*)")]͠*)M! ^#V *) >*) w *) >*) w *) >*) w *) >*) w.*)DM\ -+!\6uͱ:)O! DMͱ*)#")Ù*))))))"):m w>.Yn -:YS:Z Hҧ!6> 2)½>!)6> !)*)&*)>2) :) .͐*)M͐:)<2)99:Y=/9&ͩ c,Hͩ 9 EHͺ i`N#Fog_og_ogDM!>))덑o|gҘ =†DM!>))ҭ =¥~ ³^#V) ½^#V|g}o _{ozgi`N#Fogo&og_{_z#W-:YS:Z Hҧ!6> 2)½>!)6> !)*)&*)>2) :) .͐*)M͐:)<2)99:Y=/9&ͩ c,Hͩ 9 EHͺ i`N#Fog_og_ogDM!>))덑o|gҘ =†DM!>))ҭ =¥~ ³^#V) ½^#V|g}o _{ozgi`N#Fogo&og_{_z#W public @lptbl cseg @lptbl: db 33, 34, 35,255 db 255,255,255,255 db 255,255,255,255 db 255,255,255,255 end .654321"y2;!"(:2(=2(:=;!~;4#.{2(!" "9"2!;(y3]K!o\b!,_^#V* !J ^#V̀:#!"(COPYRIGHT (C) 1982, DIGITAL RESEARCH 151282/(  + 1 7 = }!!!!"""""# ####$$$$#$-$A$J$S$@Y$u u J$u u }$$$$$*%P%$%&'('d'''(('({ A g X J v !)$*^#V#^#Vw# ll l ls:¬MA wM  2*7w#6?#7 .,:;[]=<>|!?]45#Ra{i_p# l s s͂:(A2= / ::0! dگ61#d ڸïp#:w#6 !6:6 *#!)6.#)͂ O(BDOS ʩ##~<2x3G*#5###"%5:w37> ͺ!w3~w7>w> ͺ:w3Pd!5^!K4~ B!~624(02w3%!>%|_}_> ͺ!w3~w:x3ʜ=͢%ͺ!w34È*#5^#V"#5!y35:24(0!^4!K4w>R0>V0>D>P>L>O>B>S>N0!u~ڇK6N4!E s#r!U :mw* 5!] s#r!t~ ڹ6K^4!1w!;p!u~K!5N!E ~#fo!U ~2n!] ^#V"pK2oo&) ^#fkN]ivKzV{K>ɯo>g"!6ů{_zW5>)D*OxGғ !?uDM!xGyOڱò)â͝ddJ)=J|g}o=2o2o*p"rOxKxGyKxGy0KG*p*r}|K\\z{W¢Ü}|ڜâWʜllyWœâ!!#Qzg{ozg{ozg{ol&:oO:n2m*p" 52n2ox:4:4 ;!,ɯ2t2u2 52o=20!"5" 52m{!t~Q5_!1~9:uK:K4 *E"5:U2 5*]" 5*v"#5:K4 $:4§:4KK!4^#=ʣV²*4(—ҌV :4:4V !!*/O:0K>20y_j:t:_!;~:!ts!1~y_!t~X=w_!1~[Kdͪ>20$y$zU0!%2m*#5"v:mP>U0%4>%:m!>2m*202m!" 5/:0Kx*#5DM*5" 5}|^#V<>E0:u3ʛ*3~Œ:v3ʁ!\4>A!(0":3]#"3,ž"3Þ-2\  :4x_<24!K4w:94͜:94ɯ2:4284]294:4:94K)2:4;4~#!͜,!:4~*4!;4_:94w]294ɯ<*#5"W͉#4#*W"#5ɯ2[![4Y5!!:46"3!:4~q5!84^4!;4~â:u3:94†G³]âʻ^¨^·:94&·!:44#wó&G294xâG:94&:4G/G&ʷ/&ʷG/G!94~&>623y"!v36*5"3$"32:4*W"#5GJ2:42942(524> 2S(0>24ɯ242T!4~@`65!^4#:(5O:4yD(w~$w:(50 |:(5D(A:(5?ʱ@ʱD(Aɷ͙| ;!Cͻ2(5:'5:)5:5:(5ͫ%:(5 !J24:(5 ʞ;{>24:'5ʋ:)5.:5‹;Ž*-5*%5++{Iz]~ T++]!]+?"%5:'52'5hͫ%2'5ä:(5*—:S —ʤË ¤24͙ʳ>|ʾ>:(5'2(5> :u3>+2P4(0!K46 >24>24:(52SR:4Z:'5:4=!EQM<8!LE:(5=I!NE>I!LTM>!GT:(5=M!GE2(5"4!44>24!(5:4ruͳ u͇:(5D(OʓQ˜>ßH©>2T2(5:SD(B¹>D> !452T!"4!4N#~#A07O!T/!~*4! ) "4 :(5 5!'':(5 :(5,;%:(5 !:(5; ,J242Z$ l ` / ‰ >24#!:(52S:4; ¡ :4/!:Z/!)!:4 :(5'#!R:(5'z 24É :(5' >24#!^ :(5 #! #!;!)!<!!Z~4z #!>!!Z~#!5z #!:Z#!G )!Rz >24>VG!>OG!>IG!>BG!0!P!w#w#["!"#5!U3w#w#p"!u3~#4^!v3~w!3ͷ"!3ͷ"!3ͷ"!3~w!3ͷ"!4~w!(4~wN#Fp+q!u3~#^!v3"!3#!3#!3#!3"!3#!4"!(4"5~wN#Fq#p>B0!4"%*%F# #2P"*#5##~G=#w#6#w]$*5!4n& {ozg"#5!5{#z$"5f$*5!4N#yʦ$ ~Ù$f$!U3"Q"/$:P"%*5!3{#z"#5%_!U3*#5~#~&%~#$"5ÿ$&%!%*A1SYMBOL TABLE OVERFLOW *#5###w*#5###~,#*#5_####&%s#r&%^#V&%##"%5F%wF%~#!4~l%6~=ͫ%ͫ%!4N#~ͫ% y%͢%͢%2P"*ÿ*:?*ÿ*:@*ÿ*~x/~# *> x/\ ?-$-w#+!\64 #+>GO#w %+>O # <+6 2+6L#6I#6B#w2|*\+>2*5!"B*!(5~2A*w͹*!1*>826*27*!"/5*"5!5"h*"*"*#"5"!5\, _#~ͨ+ ¶+:;*Aͨ+>:ͨ+Ͷ+>.ͨ+Ͷ+>-ͨ+*!1+!32*!1+:=* D,> D,:D*6,_!D* W,6 4ɯ2D*2*522521528*:\ -2;*2@*O:\ʋ,=Ì,y!<*w#w#w#w#>2+52,5:m$>-!~#$ª,~>-# ʱ,<*A-P-S-R-L-*,+,-,-+5~S-M-25L-15Q-8*1,-x#ñ,~A,-#ñ,#6 !1*!*!E**e !N*+-!j**%,r-6* ,,:=*ʂ-:>*…-2:?*ʨ-!***ѯ2:*29* ,,!3*60#60#60#>235!"*:5ͨ/-!"f*2Q*2e**E*+!1*z{:*5G.*B*-.!"B**\..*B*#"B*+~¤.:u32*5G.*\!F2+*f*-•.*!"f**h*ʹ*E*€.a.Ò.Ҫ.ʒ.6# ‹.͹**h**f*#"f*~!2*G:=*..xx/.x.1,..****w#"*!-*!"***j*!*-/~5/ʹ*9//͹*!2*1L/****w#"*!-*!"****/_!5*~ ͳ.27**/5}!1~ /ͳ.#/> ͳ.>#ͳ.ͅ/> ͳ.*/5~/ͳ.#/> ͳ.> ͳ.> ó.}26*!7*è/Oͳ.:K4 :5:=*yx/:8*!5I0:25!*5—0~0:K4 0!K4~ —0:350:P4+—0:,50ʗ0:Q4#0:L4 0:,5=ʗ0!K4~ ʇ0!4s!7*~!6*Ԩ/4:4!K4ʺ0G~ 0#x=ë0> 0> 024!K4>x6 #=0G!K4~ p%,**}0>ͳ.0*j*+:+5ʨ/0!s*6S#6Y#6M#w!*w:>*2=*!"*%,ʨ/26**j*կ ,,0:?*1::*Z1ͬ2L1͎2**}1}w1>B/a1}|Gd/:?*ʓ1**+![2*CP/M RMAC ASSEM 1.1 NO SOURCE FILE PRESENT NO DIRECTORY SPACE SOURCE FILE NAME ERROR INVALID PARAMETER: SOURCE FILE READ ERROR OUTPUT FILE WRITE ERROR CANNOT CLOSE FILES UNBALANCED MACRO LIB END OF ASSEMBLY : 5O!5 ~#fo: 5O!5 s#r:?*yʟ2š2ͬ2Ž2G:9*29*!:*4>6:9*L/29*2%#333/3 3333#332E3 3   MXList WAITING FOR PRINTER $PRINTER READY $PRTMSG ,QPAGWID 2QPAGLEN 1QBACKSPC 3QRUBOUT 4QBOOTDRV 0QMEMTOP .QBNKSWT -QCOMBAS /QLERROR  +QNUMSEGS  5QMEMSEG00 KQHASHDRVA6QALTBNKSA +QNDIRRECA ;QNDTARECA KQODIRDRVA [QODTADRVA kQOVLYDIRA -TÊÑ*1zzzzzzzzz|B7B6=8 System Status 01C6>|B7B6=8 System Status 02C6>ɷ~#OE>2k>2k:g _:i WzdGz?W{_>8( 2m{_*bBKPY|W]Sn| >2l:m3[n2d(:k:d[nʹ:l/7:k:dʹ:l/$[n #:k( :m/G:l:lG:m[n͆:k( :mG:l:m/G:lzW͒zW͒ͤ >yxA Q A Y:_͒̀!|g{ _z W0D2k>2k[iSi2r[gSg2sW:r_:iW:j>8>2p:g_:h>8>2q:rO:sDM!8(. :h:q_ 0:pW :j:pW 0:q_ :j:pW:q_çCOPYRIGHT (C) 1980 DIGITAL RESEARCH 654321? OVL LINKING $ $ 1L9M9!96w:o9!9D:!""!""!"9*9^#V"9"q::u9 ͥ6**=;"`:"b:q:b:͞8.96`:q:͞8"9|!96wj1:9R,v!!]:ڤ*]:&f;) N#F͋41!]:4:u92:2:2;2E;2u;2;2;2;!D:6+6!E:6!"p9!"m9}2o9!z962v92x92w9!t96X!"y:"{:"}:":":":":":":":":":":":":":"i:"k:"m:"o:}2:!:6#6#6*9"q:2C:2D:2E:2R:!"X:o&"Z:|!"s:!"p;";";";":":";"7;*+":*+":*+" ;*+"9;!":":";"?;!":":";"A;:9*b::9=o&))9  ^#V!!<4*<&^<) <͞8-*<&^<) ^#V"d:M*<&^<) q#p!<4*9&))9  *`:s#r*A:)8"p9*9&))9 q#p:9<29O>D:9=29D:9ڗ*9&))9 ^#V"p9  ^#V"`:*`:DM!96#~ͬ . ":\ -:+: .+: -:9":5*.:~=ͬ :9('*.:~(*.:~)H^*.:~,NDͬ :9['(:9vC()!o96>5!B".:ͬ . ":\ -ˆ*.:~=Ÿͬ ï.+: -§:9ҹ'*.:~*.:~(H*.:~,Dͬ :9'ù:w92y9:9F:9(C(͆7:9):o9:o9H4!"p9>:o929*p9"95*.:~(*.:~ʐn*.:~)p̀^*.:~*.:~(HҍDO:9ʛD*Ͳ!6~̈́6*& 6:[],()?$! : @: <_2 <: !#<ڲ*#<& :<«>!#<4>*.:#".:*.:N2<&õ͵:< ͵!<6 !%<6+6:%< :%<  !<6͸ !\6͊ !!%<6͊> :%<5 !͸ ͵" :<:„ :\:%<Hb !:]A<2\O>v !*%<&\ 6 ô !%<6:<.° ͵͊ڰ :%< ڧ !͸ ͵Ô ! :%<<2% :<02<> : :>!"&<͵͊6 - *&<))))*<& "&<0 D͵ *&<:/͵: W :ZD͵:ڎ :!Q: D*Q:&J: : >!:*!^:6+":^:$t 8'> *0< ~L*0< DMB5*0< 6*0w#6!4w#6*0<##N#F*.< ~O`i~8p8!6Ͷ8ikS*0< DMv5*0< DMd5*0< *0<##N#Fq#pä*0<##q#p*u:#^#V*u: ^#V*u: ^#V*u:~*u:~*u:>*u:~*u: ^#V*w: ^#V!8:=<Hw!>:><Hw!?:?<Hw!@:@<Hw!B͔8>ͥG<ͮ8'*u:"w:*E<#"E<ͺ"u:>͔8$>ͥG<ͮ8!TJ<ͫ8:P<Hr:Q<ҁ!U<6 Æ!U<6:U<q:ͫ8+s#r!`:͹8ң96:T<Һ*JE<ͫ8*P<&i:) N#F,DM,*LE<ͫ8F*P<&i:) *q:s#rN*q:DMͷ!V<6>!V<ڷ!"Y<*V<&i:) ^#V"u:>u:ͫ8ʝͺ"W<*Y![<,*[<&i:) ^#V"u:*[<&<) N#F.>u:ͫ8%OkͥDMͪͮDMͪDMͪͺ"u:![<4!"i:"k:"m:"o:*d:##6*d: 6*d:^#V!`=p+q*d:*_=s#r*d: >!a=q*d: :a=w*d:##>?!b=q*d:##:b=w*d:##~*d:##>w*d:##~*d:##>w*d: ~!c=q*d: >:c=Hẅ́d:8++"\<*\<^#V!e=p+q̈́d:8++"\<*\<*d=s#r*d: ^#V!g=p+q*d: *f=s#r*d: ~!h=q*d: >:h=Hw!k=s+p+q!^=6:k==2k=ʱ*i=:^=2^=*i=#"i=Ñ:^=2^=!n=s+p+qͽ"d:`:d:͞8͹h!n=*l=*d: DM*n=>*>̈́d:8+s#r!r=s+q+p+q*o=DM*q=̈́*^=&^<) ^#V"d:>d:ͫ8ʆh!q=}*o=*d: DM*q=>*}U!r=}>M"d:<>!|=r+s+q+q+q+p+q+q+p+q:u=2}=:z=Һ!}=44*`:"d:*}=& "`:q:ͮ896<*s=DM*u=̈́*^=&^<) N#FU*^=&^<) *d:s#r*}=M͍*v=DM>*y=M*u=Ms*x=Mf*u=*d: *s=DM -B:z=Y*{=DM*d: ~#k!{96 MODULE TOP $UNDEFINED START SYMBOL: $YY???? $$$XX???? $$$RQST$ UNDEFINED SYMBOLS: $ABSOLUTE $CODE SIZE $DATA SIZE $COMMON SIZE $USE FACTOR $!=q*=MͲ!~=4!=q> !=8:=0OͲC:= AOͲ!=q:=O:=O!=p+q!=̈́8MD>=08MD:;!t;!;!;:u;2\. ] -Ÿ\ͩ6!t;6!;6!;6!;6!=6+6>!=*=&f;) ^#V"= *= ~ *= DMv5 *= 6!=6:=<2=:=7::2\. ] -)\ͩ6*p9###H:ͮ8!D:U!\:6*p9###F:ͮ8!C:r!\:6*p9###X:ͮ8҉!\:6:R:>S:ͫ8:U:H:C:/HҼ!\:6!\:6:E:!C:!\:6!\:6:C:*F:"::\:*p9###":Function = File = !,$-"h!9"f! ͉:2(t™:! =Hgo:O*;*Ó*"r*r"ÿ<:g:!͐*f}D! ~6t!r ͷO(^  : šn!6@G:x: P:<: P n6 t6! ^6 t6u:)<͠^! G:Ҏ>xʝʝw>ɯw̩z:»!>wɯ:=zxzz: :G:=/ͽx:Āy!4 5~y 5 6y(^@O:=7:y :I :=e:  zz#͂:!  r  ! O(Ì*( ~2* *}ʷ!#¶!""÷:_:*( #wxH! )6"& :!  x2 GH)+6:2, :!-  :, !+*( ~L#Bxz:* : *( ~ʓOڊ{2Ó#w:2. +:. 2- !% "( 2* ! "& !* ~4:2- Ԃ: Gͳͨ^2+ >2:2 *N#G2  :+ ̜2 5*( ~o#"( M š*( ~`Uoj*( ~#"( Ñ!* ~6s!+ 6:+ ‚xoͳ*& ~2+ o#"& !+ 6M : W:2 x ͺ*( +"( w  : >2* 2 :*( : +w"( ͺ:G:  !% "( ^-:* $P:<\: W:2 xM s:<9>2 :* 9x~+q ’x2 :* ͂^2 ¢ů͠: !ڽ*( ~5WèjM 2 ͨx*( +w"( j>2+ 2* jx. #NzW:  : !2 W! 5= ^x^ z: m :* ;#wO: 9ʌ ^:— ~x  ) :* :   >*( +"( w++2+ 2+ p!" r y< < <% zr ͷr 6r 9r MDÌ:o !6!h : ʚnt2 r 62 >r z<*)$"!z<~r s^#V#N#FxN:oʲ ̀õ (# Þ CP/M Error On : Disk I/OInvalid DriveRead/Only FileRead/Only DiskPassword ErrorFile Exists? in Filenameò ò >2(a." :(2:<:5(5(;(:(2ɯ2(2{_zW{_zW ) 74#4#4)7( #  w#*J|^#V#"i(##"k(##"m(###"o(#"q(##"(!s( )*s(!()*(|!(6~67*k(w#w*m(w#w#w>2('å2(*OͶyڲ ò <*.Ͳ:0!(:(:(ò 2*(>*ͫ"(!(s#r#p*k(N#F*m(^#V#F*(:(O}|y9*( +"*( }|yP#9*( *(DM"(*k(s#r*m(s#r#pyoxg͝DM*(0MD"(!*MD$:(Oë!(N:( «G>O:( ù* :(n` ~#foͤ2(O"(}:(O*( "(2("(:(O:(G2(!(w*~zWw+ !z?#~*!* *G!O~2(~m͗O~t>2(?:(2(O:(w:Ғ4~:(w?r##rp# ä |g}oì*g( #G ¾1*q(:(*w***> r ).:(O!*c(:(Oͫ}@2æ  ~á *g(:(o$*~K6?~wKw**i({#zir+s{ozg*(*(|g͸*u(*(  R>22Z$w*q(>ww:(c( *(#*i(s#r*:(!(:G~#<*q(#~!;(!(!(!~6k!"2(*q(N1q*{(]*{([*y(}<^#V(t6 ^#V}e ^#V#~2(>â9͆>!"(*y(³*(X)*ÿ͂"*g(*K! ~<:wb##>w#w> r !~#!8>8> t>nͦv8 ~*o(wn:(r :(/GyOOA +¬ ¢y2(:(x¹o&:(W>OͫE:(ڟ?N/*"(y2ͦ+>2( ̀2(k,ºʺ*(*iҺ@:O~2(~WW:2(Ôyʛ?ʔx ʔ |̷ÔN͆G:(<2(x# W:(<­:2(2 G?>Gr x~:(2(Ô##~*$*">2>2: *(~w *" 2(>ʄ@~k:((s~*9~Ês~ ~ͅ<Eʀ@~›:(6!¦w͚̋,ÇPY*({zBKNyʺ Nú # #>? ;*~ w-xąH"(0 *(#ĊH( ,ˆʀHÈ2(xą ):(@O~#w͚ʀô̓-b_++V@* )͗Os++r!x>w~6:(6~#+w#w+~;wɯ2 K,OFq-yl?Npg&:(ʓ~†wŒ~è# # x ͗w w@ ~wb͐Ú!"*>o+"v- *!b("": r#~?w#>r# L=J! Lv w,b ?~O ͆=: <>w##~2( 4~?̓-¹:(<üAX2(r K:(w++~=wv 4͗O5:(2(X:(!(v q: v v Mڂ?Ͷ >T͓Â!"(>(Â:(G:(O:(h=2(7ryy/W!(:(lڈ>F6:(_/G:(ʧ:(ڨ|OͤG:(_OzW{|:(*(}|BKN zyG:(2(9:(>#:(>#*+S!X:(ڜq: ʺ!((ʵ>2( ͤ2(O DM͸}>r "("(2(:(2(* :(:(FsO s#r:(„y==„*(!(^W*y(^#Vx+7=2(wͼկw#KWK*("(J T͞*(:(["(Ͷ:(WMںʛ>(úͶ >TJ:(!(ʷ͞x!(w4 PWP  Â*!!~~#~O~#G~.|°! w:ck[!x?[! ~ʤ͆[͗PPv qO-á=.: <ʰ! Vq##~_@w: <œ. ʩ.ʩA r r##s <}r cN! ~态O>G~G!~G~o>_yW#x#W{s+p+q7r#r#r>@ >2  !!q#p#w2(wW*._3ҫ -!(s:(!(xQ*q(~wɯ2(2(ù*~2(~w#~2(~wZ!""2(=2*~2(=2(2(k:*wX/ 6X*̀!~$6:03i"!~6*.>=)Q!(QX<k*{(}<^#V{!~! _*o(~s̓  2@ !()#w*~"!!(Fw̓ :(w̚":>#2(̓ *~wć"#Fx T]## #~ ȷ   *4 # '  4 !( *~^ ^ 33G# P v :dv 6 y #*~w>2 *p@! ~*"v@*w# ) 6# ͙   !N)@ u :G*g(`~!x_<_@!*o(y<:(/G?~##~? 6!K@?F6##N6 2 p##q:r !Z$2!"ög:(2T͐-:ʹ!>2<2(!!(w: >2(*6!O~2(+A@2! ͚A=: <%~?¯"k"?~?ʾ"ZT͐"*>o"͒"!:O"(Ý"}-6͚͚c2(ZT͐-3#͗#@!Y#sY#̓ Y# Y#ͅ:(As#:(@#@!#$̓ —#>2—#͇ͱ * «#>2(͙ wB p'+!#:(w͚AP{" 2! W>O2 ø }-R*.)$:(r "ök*w()$*c()$-}-ͤÀk*s(" :(;$:r 2͚ù͚͚}/_|/*.W}_*c(".}o|g"c(>2({2{2g*w(ʪ$Ң$Þ$+}$*(#}o|g:(O *s#r#w!~w/~@w//Hͥ*.>=)%_g:0%w:- %:(<%R$Hͥ:(>(~c!o#~E%^#V)$G#~#~!%~ b%% k%%##N#F#^#V#~#fo~o!o#~>T}! 6**#K" G*~ xr ͐-xą@7(͚S!ʀq&&͋"&@6,͚%Xͤ͋&͗wO~<:( g&~w#w#6##)͋&@ * g&~?G++N͆p# Þ&͐*6!¿&?~p*6 &>2ͱ ! ! ͷ w*o(w'ͧ B pͧ ,Úgsr ͐-ͤ͜!S')_'ͤ̓ ~?w͐s-?F͜p!'̓ ¡'>2ͱ ?~¾'¾''''>w'͙ =2(͜!:(wÚ~̓ ʑ'pá'!(6NN!(r )!(N !)z<*)$"!" :X(*:(w:(w#:(w*2* }D#cdfg!"()*{(X)^#V!"(:(<)!~<<)^#V*(<)"("(x+)!(*(>X)*{()Q*:(_2({2(Ē*"(͂"X*~<)ҍ) -)a*ʚ)~)6*(:(X*)!(:(T>q*k)!(:()-6>)ʴ+>2d,:+#++>29+2~2#! , , ,)x,) ,O +"!w [,O?WGzO:(V,xGyOG,xwq*}(}2*i(^#V+ d,!(K*}(@+*)):( K:(ڗ>2#-×:#-<)2#-*(!""++"(29-C-%w*{(}<^#Vz!(c-!>c-! J-w*q(~69!͐9bBI$"" HB@ UUUUUUUUUUUUUUUUUAPDA$! @I !@D@BDI@!B$ @$I$$ "@$$@@HHBD"D$H D@!IB@ A"B HBIB$$ "$ D$!"D$H$D$I@D BD" H$BHHBDHB"H!"!!$$HH !"BB$HHDA! "D"H $B!$!AI!$ $ H  H A$I! I" $$BD"$H "AHD @ I  B"$$H @@@@" BHB  !I$ @ $@$"$AI$$IBI$I H@@I!$DA $ $@$ !$!!" !$I@I $@ $ @!H"BI"HI DIHA DD$HH $  B D$ "I$I$H$ I !  $I$I$I $@HD$@!$"A$A DBIDB  @$$DD""I $BHI$IB !@"BD BBD "@B @$ $BI I B$@" ! "H !$B I$D@! !$ @H!$$D"@A@ DHII  D@@ $ DHI"D$ @ $""@ B! @@D $$A$ $D "@I $A$$I!HI$ BA$ $DH $I$I"HI$I!$DB$"B I$$I$ !I$@DBB$@D@"I A!$ @  @  "$ $I$I$ B!$@ I @I$ HBDH$ A$H!$D$ $I"B IIBB"$B@DH"$$ IH $$ !I"AD B!B  BI$A$"@$I$!!""@H! $!@I$ @ $""@ B! @@D $$A$ $D "@I $A$$I!HI$ BA$ $DH $I$I"HI$I!$DB$"B I$$I$ !I$@DBB$@D@"I A!$ @  @  "$ $I$I$ B!$@ I @I$ HBDH$ A$H!; December 21, 1985 10:46 drm "GETDP3KP.ASM" maclib Z80 ; $-MACRO @ equ -1 ; CP/M 3.0 system routine to select a DPB and sector translation table ; given the mode bytes (4) **************************************************** * label: calcdpb spt,spb,bpd,dpd,nst,pss,exd[,flg] * * spt = Sectors per Track * spb = Sectors per allocation Block * bpd = allocation Blocks per Disk (max (DS)) * dpd = Directory entries per Disk * nst = Number of System Tracks * pss = Physical Sector Size (bytes) * exd = Extra Directory entries reserved * [flg]= optional flag to intentionally produce incorrect EXM * (used to maintain compatability with previous formats) * calcdpb macro ?spt0,?spb0,?dsm0,?drm0,?off0,?pss0,?exd0,?flg ?bsm set ?spb0-1 ?exm set ?bsm shr 3 if ?dsm0 gt 256 ?exm set ?exm shr 1 endif if not NUL ?flg ?exm set ?exm shr 1 endif ?cks set ?drm0/4 ?exs set ?exd0/4 ?bsh set 0 ?@ set ?spb0 rept 8 ?@ set ?@ shr 1 if ?@ eq 0 exitm endif ?bsh set ?bsh+1 endm ?al0 set 0 rept (?cks+?exs+?bsm)/?spb0 ?al0 set (?al0 shr 1) or 10000000$00000000b endm ?al1 set low ?al0 ?al0 set high ?al0 ?psh set 0 ?psm set 0 ?@ set high ?pss0 rept 8 if ?@ eq 0 exitm endif ?psh set ?psh+1 ?psm set (?psm shl 1) or 1 ?@ set ?@ shr 1 endm dw ?spt0 db ?bsh,?bsm,?exm dw ?dsm0-1,?drm0-1 db ?al0,?al1 dw ?cks,?off0 db ?psh,?psm endm ; Entry: HL = points to Mode bytes ; Exit: A = error code (0 if DPs found) ; DE = points to DPB ; BC = points to sector translation table (or BC=0) ; HL = offset from ?serdp to beginning of format string table ; Uses 2 levels of stack. ; public ?getdp,?serdp cseg ;for now we'll put it all in common memory. ?serdp: ;user has to tell us where we are. lxi b,PTRTBL-?serdp ;HL=memory address of "?serdp" dad b ;DE=mode bytes xchg jr gd1 ?GETDP: lxi d,ptrtbl gd1: PUSH H ; save mode byte pointer push d ;save parameter table address mov c,m ;no need to mask format origin cod*p9"::D:*H:":8*:*:"::r98*:)8":*:*:":Z:X:͞8_X:Z:͞8#"y:e!"y:!:6*X:":!=6>!=ڞ*=&y:) >Ͷ8Ҕͥ:=<2=v!":::2=!=6:=#w:==2= *=&:) *=&: N!: ͠8*=&: ~2=*=& :=w:=2=:=<2=õ*=&: :=w::<2:*b:"d:`:d:͞8q͜/!9H`2UO!: 8DM>ͪ̈́d:8+s#r&!]:6>!]:7*]:&f;) N#F͋4:*]:&<) N#F.B2=:="="=:=O>"=n2=ð-*]:&i:) ^#V"u:>u:ͫ8-2=ͥ"=ͮ"=!"=nͺ"u::]:<2]:w!=r+s+p+q*=}*=_DM͘4*=#*=|_͘4!=p+q*="d:2:=2=:=O>Ґ*=DM^"=ã*=&:) =8"=:=O>:=O>==͞8UO!: ͹8"=*=*="=*=DM*=8*d: ~*d: :!z9/H!"=ͽ"d:`:d:͞8HҴ>=08>͔8S6!~=6U`/wUp/>=08 \8 M`͹ҖÞ2DM_   *=#"=̈́d:8+s#r >!=Ͷ86!=6>#w#62~=ͽ"d:`:d:͞8N/=:=!=6>=08>͔8'6!~=6w*=#"=>&8)))M`̈́d:8+s#r>!=Ͷ8\66!=q!=:~=v d!=6h!=ڤ:==O! *d:N:=<2=|:E:J:*Q:M2"V:!"V:|!=6:Q:!=:==O!J: NͲ:=<2=6D:R:*U:&:) S:8"V:D>!{:Ͷ81*:"V:DX:ͣ8D*X:"V:Z:X:͞8mX:Z:͞8#DM*X:v6*:DM*:6*:DM*:6*:DM*:6`:s:͞89ͮ8*9|=ͫ8 Ͳ(Ͳ*=DM_-Ͳ*=*=+DM_)Ͳl*|9DM_68f ͥOr:t9Z^E.:n~:x9ZyU/?OVLAY?OVLA0RELIRLIRLREL))O`i~8p8>!:!>6::!>:>=O!: NͲ!>4½)2:͕":)2::: !:6!>6::!>. ):>=O!: Hq!>4 *h&\8*|& "9>*7:DM\͏5*9+"9!>q:>2]:*]:&f;) N#F͋4!>q:]:!f:Ҏ *]:&y:) N#F*>͘4:]: Z:y:͞8Ҽ *y:"Z:X:y:͞8 *y:"X:*]:&y:) N#F+q#p!>s+p+q::2>O!: :8">*>DM*>h!ͮ"!>2>:>>!>ͫ8HA!ͱ!">G!*!>">*>DM*>MC:>e!*]:M͋!*>*>*]:*>*>5:=Ҭ!ͱ!"!>>͔8ž!*!>">!>6í!!:]:2%>*>M^ *>DM4*>#DM4O`i~8p8"#>*%>M^ *#>*b:"d:`:d:͞8%"*d: ~#"*d: 6̈́d:8+s#r!!{96:*:MH"H"!^:6:*:Mi"2"g:͜2f:o"=6*:::: -y"::29:*::ͺ/Ҵ":*:͉:*:M"!:͹8"/Ͳͯ/Ͳ Ͳ=6#:*:*:*:*:͉*:*:"::*:M/I#:*:͉*d:DM :*:Mҟ#{#=ͯ6Ü#*:&:) :8DM>*:Mf#:*:*:&:) :8*:͉*]:&y:) N#F*]:*:DM5!=6#!=6*:":*:M^ :]:$$*g:*:":C$*]:&:) :8*]:&y:) q#p:]:P$!=6*]:&y:) N#F *:":>!:Ͷ8::HҲ$:R:Ҕ$=6ò$*:&:) :8"S:::2U:!R:6:0:$)$ò$!&>6>!&>%%*&>&:) *&>&:) 8*&>&:) q#p*&>&y:) q#p*&>&:) >w#6:&><2&>$s:q:͞87%*q:"s::G%͸*9"q:^ :_:/2^::{9]%!!)>s+p+q:)>ˆ%*g:*'>"'>:f:҅%!)>6Ý%*)>&:) '>8+s#r*]:&y:) N#F*]:%*'>DM*)>M͋%*]:&y:) N#F*'>*)>*]:5y y !*>q:*> &>!*>&:*>#&+"ÿ&:*>1&p"ÿ&:*>?&k$ÿ&:^:ҿ&:*>=O!& ^#VI"ÿ&ÿ&͈"ÿ&>ÿ&͵"ÿ&#ÿ&T#ÿ&#ÿ&#ÿ&$ÿ&$ÿ&Q$ÿ&d$ÿ&W&]&`&f&o&u&{&&&&&&&!+>6)&)2->:^:&*->My (')2,>')2+>:+> '*+>M%('͕".>:^:('*.>DM*,>^%:+>&7','!0:6&H'='!0:6!"1:"7::!:'*:͗8"1:"7:. 9\ -u')29!hʦ':92h\͕6¦'\=45)2|29!:6*7:"1:!"9"9^ :_:/2^::!:!_:' ',':e (.e -'e>*2!:\d5I'}/B(}͉ͽ"d:`:d:͞8)͹(:v92\!0>6>!0>گ(h!0>҈(*0>&\ 6 å(:0>=O! *d:*0>&\ w:0><20>g(!!:6.e -¼(\W5/(!!:6.e -(\d5*d:"1>!_:6I'*1>"d:̈́d:8+s#rI(.: -)!:6!:6^ ͽ"d:`:d:͞8)/)*{:DM>fy ^%y !":y y *d:"4>#*4>"d:!3>6>!3>)h!3>ڶ):3>=O! *d:Ny û) y :3><23>Œ)*:"::)͸*9"q:̈́d:8+s#r5)!0:4~ (*6*1:#"1:*7:{z*!"1:/ *1:!>~26>xG:6>26>G )x{_ P*#B*>ɯ`iq#zV*COMPRLRSPSPROVLSYM!;>q*5:> :;>w*5:#"5:!3:͹8ڦ*>*3:DM\͔5!"5:!<>q:8>!<>28>:7><27>*!7>6*8>Mq*!8>6!=>q*=>Mq**A:#"A:!?>p+q*>>}O**>>|O*::+:o9+h,*p9"A::\:,+**V:DM**X:":!@>6::=!@>q+*@>&: N!: p9͞8j+*@>&: N͍+!@>47+:o9:o9HҌ+ -!C>q:C>¢+*X:"D>ó+*C>&:) ^#V"D>D>A:͞8+96D>A:͞8+*+*C>&f;) N#F͋4*C>&y:) >Ͷ8,:C>,*X:DM',,',|9A:͞8&,*A:"|9!G>p+q*F>"H>*C>&y:) F>8+!H>͹8g,*H>DM4O**H>"H>3,::=O!: N!: !y: 8*p9͗8"A>**A>DM**:o9,***p9DM*,*m9DM****:r9,*:DM*,*!J>6>!J> -*!J>4,*p9"A::\:(-ͦ-ͦ-ͦ-!L>6::=!L>|-*L>&: ~2K>u-*K>&:) A:͠8e-ͦ-J-:r-.u--!L>4--*p9*A>A:ͮ8ҕ-ͦ-|-:7>ʥ-ͦ-Õ-!O>q*O>Mͧ**A:#"A:M>A:͞8-ͦ-ù-ͦ-*K>&i:) ^#V"u:>u:ͫ8.ͥ*K>&:) 8"M>͹-ͺ"u:-*K>&<) N#F.*0< ~R.*0< DMd5*0< *0<##N#Fq#p].*0<##q#p2P>:P>ʤ.*K>&:) 8"M>"9:P>O>Ҙ."9͹-2P>c.>5:08>͔8ʾ.q*å.>*5:DM\͔5\v5:w9Z.. \": -.:e /.*o9&\8_* DMe - /:w9#/:w92\\B5:9 A/. ~9\ -9/!"5:}28>27>*ͥ.:x9Z^/. \": -f/.en* -v/:x9ʌ/:x92\\B5!"5:}2R>ͽ"d:`:d:͞8(0͹/H02DMv0 q*!Q>6h!Q>/:Q>=O! *d:Nq*:Q><2Q>/:R><2R>0 q* q*0 q*̈́d:8+s#râ/ q* q*ͥ.!S>q> !S>O0:S>0Oq*Z0:S> AOq*!T>q:T>O60:T>O60!V>p+q*U>|O[0*U>}O[0*9>!=8"W>*W>!=8!Y>s:h0:Y>2h\͕60\>645*W>!=8!|s2*9͗8"9>. \~9 -0:9 1*9>"9>\d5͍0C\͏5!Z>s*9>!=8C "9*9*|9s#r͍0C*Z>&\8DM\͔5:j2j\v5:9ҁ1*|9)8"|9:y9ZŠ1a9ҟ10ñ1g9ұ10!_>q.*[> :_>w*[> ~!`>q*[> :`>w*[> *[> ^#VN#FR* *[> 6*[>^#V!=8"b>?8!a>s1!a>P2*[> DMv5*a>M1*[> DM͕6P2*[> DML5*b>!=8MͲ1*[>  *[> ͞8ҍ2*[>  *[> N#Fq#p *[> ~ڮ2*[> DMB5 *[> 61*[> N#F*[> *[> N#F͔51!e>p+q*[> N#F*d>?8^8*[>q#p*[>*[> 8+*[>##q#p*[>*[> N#F^#V?8*[> s#r *[> N#F`i"h>*[> N#F `i"j>*h>"f>j>f>͞8ڐ3*f>+*[> ^#V\8DM2_2*f>"f>\3*[> ^#V*j>\8DM2*[>  *[> ͞8Ҿ31*[> N#F*[> *[> N#F͏5!n>s+p+q*[>l>͠84 *[> ~4_2*l>DM2ͦ3Ê4*[>##l>͞8Ҋ4 *[> ~34_2*l>DM2:n>j4*[>  *[> N#FPY͹8d463g4ͦ3Ê4*[>  *[> ͞8҇41Ê4ͦ3!p>p+q*o>"[>!s>s+p+q*q>DM3*[> ^#V"]>*[> N#F*q>?8*]>:s>w *[> 6!u>p+q*t>DM3*[> ^#V"]>*[> N#F*t>?8*]>~   +5{>.+55OͲ5w66ͩ6́5;6<566́5͕6<>́5͕6<>645͜6<H66! w #ˆ5>Ö5>2,6""6"$6yo`"&6!"*6͋6-66*&6|6 "&6*"6MD6*$6DM:,65ͷ6g666Ͱ66**6|6U6*$645*"6""6**6#"*6ú56**6ABORTED$NO SPACE$NO FILE: $CANNOT CLOSE$DISK READ ERROR: $DISK WRITE ERROR$YYYP   YP6YPYPYPYPYPYP Ͳ ò!>6#6͐6">*>|$7>9ͫ8"|>##*|> ~!7!>6D7*>|?7!>66"|>D7!>6:>Y7!~>6#6#6Å7*|>~2~>*|> ~2>:>z7:>2>*|> ~2>!>6>!>ڰ7*>&v> ~/*>&: w!>4‹7:72"g:^ *:"|> *g:":*9My *9My *9My *~>My *>My *>My *|>":i`N#Fog_og_{ozg_ogDM!>))덑o|gV8 =D8DM!>))k8 =c8_{ozg^#V) ~8^#V|g}o ˆ8_{ozgi`N#Fogo&og_{_z#W LINK 1.31 $01/04/83?MEMRY$MEMRYX MEMORY OVERFLOW, USE [A] SWITCH$INSUFFICIENT MEMORY$OVERLAPPING SEGMENTS$ XXABS $$$XXPROG $$$XXDATA $$$XXCOMM $$$::;7;YYABS $$$YYPROG $$$YYDATA $$$YYCOMM $$$n;;;;INDEX ERROR$MULTIPLE DEFINITION: $MAIN MODULE ERROR$FIRST COMMON NOT LARGEST$COMMON ERROR$UNRECOGNIZED ITEM $5O!5 s#r:?*yʟ2š2ͬ2Ž2G:9*29*!:*4>6:9*L/29*2%#333/3 3333#332E3 3 ( COPYRIGHT (C) 1977 DIGITAL RESEARCH 112O02Z0̀%!"K2.>2.*M0"$/̓%!"":g0i!"P0"R0"2:0v: 0$  :[0-ʬ+ʬ* :[0!_0M!f0P p  !   :O0Ĝ!":O0*V0}|<r ͪ*|Ĵ:O0_͑H *V0"Ù*V0"E V» ͪ»**»"Ù*K0"X0!0NA#~' ~p"K0*K0N"X0!0q#*w œ:0!x ͜ *V0*R0:_0̍"V02*M0r; !:r :0F: 0e%;m ">2:0b: 020 W,F:0b: 0e,ʹ:re*X0#![0~ʇww2/ͬ:2T/-"."$/2/>2.v:.ʸ!/6+͕%>20:.ʮ:.0209$<!5*}Ģ*V0":0y: 0:yv! X! ^#fkX _~ 0^ Z   2 5 8  :0‰:0=ʉG! 0ʃF#2sÖ*I0| E2V ,[ ͊m *R0"R0"P0 m E2D2V ,ʾ ͊:/ m :/ "> 2/:Į:0 : 0 -Ͳ !/6+:.;?*$/*."$/?"$/:.l*.^#V{r+s5*.^#V ʓ:. r+s!06#wÚ> 209!e/~6![0~6".~,#!0w9 9*.~6 *: 0,Ĵ2f/*.s#r2[02e/*.#"X0$<5ͬ*$/"M00:T/2:/2[0 v>20*.".2[0v*R0m "R0͍"R0!/w >=G*R0*I0"R0"R0 m :/ }>͞ ¥͢ :O0*V0*ʿ͜">2:O0:0:O0!!4:0: 0,>"4:O0: 2\0:0=: 0 F!Fʹ%*X0"`0>2Z0*X0":0k: 0T!T:\0¦:O0¦:0=ʦ ʦ*"X0 !':[0'Tx»!Z04TT!Z05T:\0!":]0!**V0":O0*X0~ Ĵ*X06 '>#G*I0!" :0 :Z0 !0N*K0:O0Ÿ"b0+"X0yʛ 'É' Ͳ >ͮ 222:0: 0 !ͮ-:0:0!4 :0& : 0::0!xI !4̨ e ::̮>͞ } !~5:Į ͵ !4̨!~5 G!~Ҩ4_!p!~ʮ5^!~> >2\0:0N *K0"+"X0:0 >''!:0N : 0,N :0 >  > !0N#~' ) > ''*K0"V0:\0x ʹ:\0" m }*K0"+"X0''*K0"V0>"4ͬ:2T/:[0 “ 2/-*M0"$/*X0!{#zڿ ~+"X0*M0+"M0wß #"K0*M0".:\0 N]T s#r+*V0*{_zW".:\02.R     % *I0:/ ͪ% ͬ:O0ĭ%  :.ʢ :0¢ *K0+"X0!2<20*#"" : 00Ĩ!??" 09"K0+"X0$< :0¢ : 0,? ʹ  *} :]0 :O0 :0 ͤ%:e0ĭ%:0 : 0  ͬͧ%vʹ   ͺ :0: 0 !;* _!5 ^#fkS \ h n 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D y0P 2!0^4! 0q :0Ė: 0,; Ė*I0m |}$† ͌oy Ԍ͋ 8O͖ Ăy01y 1m X:0 : 0, >C͘%:0 : 0 v;:0 : 0 v-!v !v-ʹ {ozg:.7ͮ2Z0!O0~4l!"*|>"V0*""J͊!/6 !/͒%:^0ʏ>2.͡%ͱ*K0*T0&*M0*T0&\ ͍!/w#õH USE FACTOR !/͒%*"P0Þ%z{*P0"R0*"V0 !":O0Ģ*R0̜*R0ĜG:O0xě%:/ *R0̍:xz*P0#"P0E2D20:b!^4!/wjj*R0!6zz{z4A_A?ɯ2.2*T0"V0!.8w# *V0*K0{zҤ*b0+"X0 =$**X0#Þ!.*V0".#"X0$:d0<:0<! 0~?<#ʐ: 0͡!.".^#V"V0}{##~2.*.^#V#"."V0*V0}d##~<2.G*V0##"X0:.> u!.~w>w> u:.P'!5^!/~ !~620͕%2.|z}z> u!.~w:.W=*u!.4C*V0^#V"V0ý!.5¯:20͕%!^4!/w>R͘%>V͘%>Dý>Pý>Lý>Oý>Bý>Sý>N͘%*6".~ 6654321-!2~B6~44O!! s#r!1~ _6^4! w!p!2~~!55N!! N#fiooo&)^#fk9BIO[ov ͌z{>ɯo>g͌"!6ů{_zW5>)D*OxG !?DM!xGyO23)#͌)=R|g}o=^͌͌roz{͉͌͌}|͉͌Þ͌Þ͌ë͉͌!!o#Ã͌zg{o͌zg{o͌zg{oolo&3:0: 0 ;!,ɯ2122=2 !"I0&q!1~\5_! ~͔D:2:/ *!"I0:/ :0:0! 0^#=ʙV¨*0!҂ :0:0& !!>O: >2 yU`:10_!~0!1s! ~͔ yU!1~N=w_! ~QZP>2 ypP͘% >U̘%>: 2 3>E͘%óf:.O*.~H:.=!4>͕%0:/#". ͆%2G:0xa{_ ʇ ʇ:0x҇_<20!/w:e/S:e/9ɯ2f/2d/2e/:0:e/ !2f/g/~#»S͉!f/~4!g/_:e/w2e/ɯ<*V0"36*"V0ɯ2!4!f/6".!f/~55!d/^4!g/~f:.:e/JGwf^l͗^{:e/&{!f/4#ww&ʞGʱ2e/xf͗ :e/&ʕ:0  ý͗&{&{ý͗  !e/~&>62/-!.6*M0"$/B".2f/*"V0͗ 2f/2e/2[020> 2͕%>20ɯ202!0~@$6^4#:[0w~$w:[00 6:[0A:[0?e@eAɷP6 o2[0:Z0ʦ:\0 :O0¦:[0':[0 !20:[0 R;/>20:Z0?:\0:O0?́;B*`0*X0++{z~ ++!+"X0:Z02Z0́ͪ'2Z0X:[0*K: ḰͪX? X́ö20Pg>ã6r>ã:[0'ƒ2[0>ã ¡:.ʔ>+2/͕%!/6 >20>20:[02́:0:Z0: 0=!EQ<!LT:[0=!LE>!GT:[0=!GE2[0" 0!04>20![0:0/ʦg¦´/ʦA¦:[0O<QA>HHR>22[0m:B_>fD> j!052!"0!0N#~#A҄0Æ7O!~*0!ʩң)Ú "0 x:[0 '¦́'æ:[0 :[0,;%:[0 !:[0; ,202́/>20:[02́:0G:0::0l:[0'́:[0' 20/:[0'|>20^—́:[0  <¨!~4 >¼!~5 : >20>V>O>I>B͘%!QéÉ $ ? H Y ` e Ò ü ò ~ÏGÇåûfD?<==:e>?; ><>; ;<=R>>>F>;>G==<==>=s;=P=*>=$?P:-?]>*<<==<;=>>y> ;:e. inx h mov b,m inx h MOV A,M ; get first mode byte ani srm0 ; mask FIRST BYTE MOV E,A INX H ; and point to the second MOV A,M ani srm1 ; mask SECOND BYTE MOV D,A pop h ; table lookup... NXDPB: MOV A,M ; format origin code. inx h ana c ;compare it: if the format requested matches jrnz got1 ;(if the bit is set in both DPB and requested mov a,m ; mode ([NZ] condition) then we have a match.) ana b ;check for possible extend format origin jrz nxd1 ;... got1: inx h MOV A,M ; get first byte INX H ani srm0 ;mask it also CMP E ;compare to target mode jrnz NXD3 MOV A,M ; and the second ani srm1 ;mask it CMP D ;compare it jrnz NXD3 inx h mov e,m ;pick up DPB inx h mov d,m inx h mov c,m ;pick up XLAT also inx h mov b,m xchg ;DE=table pointer, HL=DPB xthl ;put DPB on stack, get HL=requested mode inx h inx h ;point past "format origin" push b ;put XLAT on stack. xchg lxi b,-5 dad b ;point back to table's modes xchg ; ldax d ;get "excess" mode bits. ani xsm0 ;mask in bits to give caller. mov c,a mvi a,(not xsm0) and 0ffh ana m ;clear callers bits prior to setting again ora c ;complete callers mode bytes mov m,a inx h inx d ldax d ;get "excess" mode bits. ani xsm1 ;mask in bits to give caller. mov c,a mvi a,(not xsm1) and 0ffh ana m ;clear callers bits prior to setting again ora c ;complete callers mode bytes mov m,a pop b ;restore XLAT pop d ;restore DPB lxi h,strtbl-?serdp ; load address of string table XRA A ; and clear the accumulator RET ; as this is the successful return NXD1: INX H NXD2: INX H nxd3: inx h inx h inx h inx h inx h MOV A,M CPI 11111111B jrnz NXDPB ; loop if more entries in table POP H ; restore mode byte pointer lxi h,strtbl-?serdp ; load address of string table xra a ! dcr a ; return [NZ] if DPs not found. RET ; as this is the error return ; ; (10-256 byte) ; Format string name table - all formats must have a entry here ; strtbl db 'KAYPRO ' ;bit 0 - must be 8 characters wide db 'KAYPROX ' ;bit 1 db 'MMS ' ; 2 db 'Z37 ' ; 3 db 'Z37X ' ; 4 db 'Z100 ' ; 5 db 'EPSON ' ; 6 db 'ASSOC ' ; 7 db 'FMT8 ' ; 8 db 'FMT9 ' ; 9 db 'FMT10 ' ; 10 db 'FMT11 ' ; 11 db 'FMT12 ' ; 12 db 'FMT13 ' ; 13 db 'FMT14 ' ; 14 ; ;---------------------------------------------------------------------- ; ; ;---------------------------------------------------------------------- ; ; SRM0: equ 10000000B ; SRM1: equ 01110000B ;SEARCH MODES MASKS XSM0: equ 00000011B ; XSM1: equ 10001111B ;EXCESS MODES MASKS PTRTBL: DB 00000000b,00000100B,00000000B,00010001B ; 5" mms,dd,ss,st dw mms0,0 DB 00000000b,00000100B,00000000B,01010001B ; 5" mms,dd,ds,st dw mms1,0 DB 00000000b,00000100B,00000000B,00110001B ; 5" mms,dd,ss,dt dw mms2,0 DB 00000000b,00000100B,00000000B,01110001B ; 5" mms,dd,ds,dt dw mms3,0 DB 00000000b,00001000B,00000000B,10000001B ; z37,sd,ss,st dw z370,0 DB 00000000b,00001000B,00000000B,10010001B ; z37,dd,ss,st dw z371,0 DB 00000000b,00010000B,00000000B,10010001B ; z37x,dd,ss,st dw z372,0 DB 00000000b,00001000B,00000000B,11000011B ; z37,sd,ds,st dw z373,0 DB 00000000b,00001000B,00000000B,11010011B ; z37,dd,ds,st dw z374,0 DB 00000000b,00010000B,00000000B,11010011B ; z37x,dd,ds,st dw z375,0 DB 00000000b,00001000B,00000000B,10100001B ; z37,sd,ss,dt dw z376,0 DB 00000000b,00001000B,00000000B,10110001B ; z37,dd,ss,dt dw z377,0 DB 00000000b,00010000B,00000000B,10110001B ; z37x,dd,ss,dt dw z378,0 DB 00000000b,00001000B,00000000B,11100011B ; z37,sd,ds,dt dw z379,0 DB 00000000b,00001000B,00000000B,11110011B ; z37,dd,ds,dt dw z37a,0 DB 00000000b,00010000B,00000000B,11110011B ; z37x,dd,ds,dt dw z37b,0 DB 00000000b,00100000B,00000000B,10010001B ; z100,dd,ss,st dw z100a,0 DB 00000000b,00100000B,00000000B,11010011B ; z100,dd,ds,st dw z100b,0 DB 00000000b,00100000B,00000000B,10110001B ; z100,dd,ss,dt dw z100c,0 DB 00000000b,00100000B,00000000B,11110011B ; z100,dd,ds,dt dw z100d,0 DB 00000000b,01000000B,00000000B,01010101B ; 5" EPSON,dd,ds,st dw epson,0 DB 00000000b,10000000B,00000000B,01010111B ; 5" GNAT,dd,ds,st dw gnat,0 DB 00000000b,00000001B,00000000B,00011000B ; 5" KAYPRO ss,st dw kaypro0,0 DB 00000000b,00000001B,00000000B,01011000B ; 5" KAYPRO ds,st dw kaypro1,0 DB 00000000b,00000010b,00000000b,01011000b ; 5" KAYPROX ds,st dw kaypro2,0 DB 11111111B ;FLAG FOR END OF TABLE $*MACRO dseg ;DPBs and SECTRN tables in banked mem MMS0: calcdpb 36,16, 83, 96,3,512,0 MMS1: calcdpb 36,16,173, 96,3,512,0 MMS2: calcdpb 36,32, 86,128,3,512,0 MMS3: calcdpb 36,32,176,128,3,512,0 Z370: calcdpb 20, 8, 92, 64,3,256,0 Z371: calcdpb 32, 8,152,128,2,256,0 Z372: calcdpb 40, 8,186,128,2,1024,0 Z373: calcdpb 20, 8,188,128,3,256,0 Z374: calcdpb 32,16,156,256,2,256,0,@ Z375: calcdpb 40,16,195,256,2,1024,0,@ Z376: calcdpb 20, 8,192, 64,3,256,0 Z377: calcdpb 32,16,156,128,2,256,0 Z378: calcdpb 40,16,195,128,2,1024,0 Z379: calcdpb 20,16,196,128,3,256,0 Z37A: calcdpb 32,16,316,256,2,256,0 Z37B: calcdpb 40,16,395,256,2,1024,0 Z100a: calcdpb 32, 8,152,128,2,512,0 ;; 5" disks Z100b: calcdpb 32,16,156,256,2,512,0,@ Z100c: calcdpb 32,16,156,128,2,512,0 Z100d: calcdpb 32,16,316,256,2,512,0 epson: calcdpb 80,16,190,128,2,512,0 gnat: calcdpb 80,16,169,128,1,512,0,@ kaypro0: calcdpb 40,8,195,64,1,512,64 kaypro1: calcdpb 40,16,197,64,1,512,64 kaypro2: calcdpb 40,16,197,128,1,512,0 ; ; NOTE: skew tables are for physical sector numbers. ; end 197,64,1,512,64 kaypro2: calcdpb 40,16,197,128,16,2,1024,0 Z100a: calcdpb 32, 8,152,128,2,512,0 ;; 5" disks Z100b: calcdpb 32,16,156,256,2,512,0,@ Z100c: calcdpb 32,16,156,128,2,512,0 Z100d: calcdpb 32,16,316,256,2,512,0 epson: calcdpb 80,16,190,128,2,512,0 gnat: calcdpb 80,16,169,128,vers equ '0d' ; March 11, 2017 21:35 drm "WIN3KP.ASM" ;********************************************************* ; Winchester Disk I/O module for CP/M 3.1 on KAYPRO ; Copyright (c) 2017 Douglas Miller ;********************************************************* MACLIB Z80 extrn @dph,@rdrv,@side,@trk,@sect,@dma,@dbnk,@dstat extrn @dtacb,@dircb,@scrbf,@rcnfg,@cmode extrn ?bnksl,?timot,?getdp extrn ?halloc false equ 0 true equ not false ; Ports and Constants sysctl equ 014h ;winchester disk control bits dev0 equ 50 ; first drive in system ndev equ 2 ; # of drives is system ; ********************************************************* ; * * ; * D a t a D e f i n i t i o n s * ; * * ; ********************************************************* ; windta equ 80h ;1002 data port winpcmp equ 81h ;1002 precomp port winerr equ 81h ;1002 error port winsc equ 82h ;1002 sector count port winsec equ 83h ;1002 sector number port winlsb equ 84h ;1002 lsb of cylinder port winmsb equ 85h ;1002 msb of cylinder port winsdh equ 86h ;1002 size/drive/head port winstat equ 87h ;1002 status port wincmd equ 87h ;1002 command port ; rstcmd equ 10h ;1002 restore command seekcmd equ 70h ;1002 seek command rdcmd equ 20h ;1002 read command wrcmd equ 30h ;1002 write command ; wincfg equ 10100000b ;ecc and sector size bits nosel equ 10111000b ;winchester de-select ; TODO: abstract all this to allow other drive types ; ST412 drive parameters (as used by Kaypro): ncyl equ 306 ; total number of cylinders lcyl equ ncyl-1 ; last cylinder number pcmpcyl equ ncyl/2 ;starting precomp cylinder number nhed equ 4 nsec equ 17 zsec equ 512 fsec equ zsec/128 ;--------- Start of Code-producing Source -------------- cseg ;put only whats necessary in common memory... dw thread db dev0,ndev jmp init$win jmp login$win jmp read$win jmp write$win dw string dw dphtbl,modtbl string: DB 'KAYPRO ',0,'Winchester Disk Interface ',0,'3.10' dw vers db '$' winlun equ 00001000b ; Kaypro convention winpt0 equ 00000000b winpt1 equ 00000010b winpt2 equ 00000100b winpt3 equ 00000110b ; Both partitions use cyls 0-305, but different heads. ; head = (PTN << 1) + (track & 1) ; track >>= 1 modtbl: ; -PTN cfg-byte-template ---not-used-------- DB 10000000b,wincfg+winlun+winpt0,00000000B,00000000B db 11111111b,11111111b,11111111b,11111111b DB 10000001b,wincfg+winlun+winpt1,00000000B,00000000B db 11111111b,11111111b,11111111b,11111111b ; currently, both (all) partitions are identical, ; due to head-slice algorithm for partitioning. ; But, Universal ROM pulls DSM from partition info on disk, ; So each could be different... Also, ROM version selects OFF... dpb0: dw nsec*fsec ; SPT db 5,01fh,1 ; BSH,BSM,EXM dw 1125,1023 ; DSM,DRM db 0ffh,000h ; ALV0 dw 08000h,4 ; CKS,OFF db 2,003h ; PSH, PSM dpb1: dw nsec*fsec ; SPT db 5,01fh,1 ; BSH,BSM,EXM dw 1125,1023 ; DSM,DRM db 0ffh,000h ; ALV0 dw 08000h,4 ; CKS,OFF db 2,003h ; PSH, PSM ; Controller is already done by now win$rw: lda cmdbuf ani 010h mvi a,0b2h ; inir jrz nread mvi a,0b3h ; outir nread: sta here+1 lda @dbnk call ?bnksl lhld @dma lxi b,windta mvi e,2 here: inir dcr e jrnz here xra a call ?bnksl ret offline db 0 ; fatal error prevents use cmdbuf db 0 romid db 0 thread equ $ dseg ; HASH/HBANK is set by main bios... dphtbl: dw 0,0,0,0,0,0,dpb0,0,alv0,@dircb,@dtacb,0ffffh d0h: db 0 ; HBANK dw 0,0,0,0,0,0,dpb1,0,alv1,@dircb,@dtacb,0ffffh d1h: db 0 ; HBANK alv0: ds 512 ; really only need about 283 alv1: ds 512 ; ptnoff equ 302 ; offset in sector of ptn tbl partns: d0dsm: dw 0 d0cyl: dw 0 d1dsm: dw 0 d1cyl: dw 0 partnz equ $-partns ptnend equ zsec-ptnoff-partnz curptn: dw 0 ; cyl offset of current partition ; driver init. DRM+1 is fixed at 1024 init$win: lxi b,1024*4 lxi d,d0h-2 call ?halloc lxi d,d1h-2 call ?halloc xra a sta offline lda 0050h ; gift from loader: ROM id sta romid ; TODO: move to login code, for each LUN... call winrest ; TODO: Universal ROM uses track xlat (spares) table... ; For virtual hardware it should not matter. ; But, partition info is also stored there. Need that now. lda romid cpi 'U' rnz ; done if not Universal ROM lxi h,2 ; new OFF shld dpb0+13 shld dpb1+13 lda modtbl+1 ; spares must be on "drive 0" out winsdh call winrdy jz disable xra a out winlsb out winmsb ; Cyl 0 inr a out winsc ; 1 sector mvi a,nsec-1 out winsec ; last sector on track mvi a,rdcmd out wincmd call winbusy jz disable ; TODO: checksum verification... ; surgically read partition info from buffer... lxi b,ptnoff initw0: in windta dcx b mov a,b ora c jrnz initw0 mvi b,partnz mvi c,windta lxi h,partns inir mvi b,ptnend ; rest of sector initw1: in windta dcr b jrnz initw1 lhld d0dsm shld dpb0+5 lhld d1dsm shld dpb1+5 ret login$win: lda offline ora a rnz ; This should prevent read/write from ; ever being called ; TODO: check init flag (per LUN, not partition) ; and call winrest (anything else?). ; Could always select LUN and test READY. lda romid cpi 'U' mvi a,0 rnz lhld @cmode mov a,m ani 00000011b ; ptn add a add a ; 4 bytes per drive inr a inr a ; +2 for cyl offset mov e,a mvi d,0 lxi h,partns dad d mov a,m inx h mov h,m mov l,a shld curptn ; cyl offset of current partition xra a ret setup$win: lhld @cmode inx h mov b,m ; SDH template eSSDDHH- lda @trk ani 1 ora b ; eSSDDHHH out winsdh call winrdy rz ; timeout mvi a,pcmpcyl out winpcmp ; This is horrible, but since 302C ROM does it ; we also must to keep compatible on disk: ; if (trk > 7) trk += 4; ; else if (trk >= 4) trk += (trk - 4); ; For universal ROM: ; if (trk > 1 || ptn > 0) trk += 12; ; All: ; putHd((trk & 1) | (ptn << 1)); ; putCyl(trk >> 1); lhld @trk lda romid cpi '3' jrnz setup2 mov a,l ani 11111000b ora h jrz setup1 lxi d,4 dad d jr setup2 setup1: mov a,l cpi 4 jrc setup2 sui 4 add l ; CARRY not possible mov l,a setup2: srlr h rarr l ; from here on, use cyl lda romid cpi 'U' jrnz setup3 ; probably wrong, but should not have WD1002 ; B is still eSSDDHH- from above lded curptn ; cyl offset dad d mov a,l ora h ; cyl 0 is special case jrnz setup4 mov a,b ani 00000110b jz setup3 ; partition 0 no xlat setup4: lxi d,6 dad d setup3: mov a,l out winlsb mov a,h out winmsb lda @sect out winsec mvi a,1 out winsc ora a ret read$win: mvi a,rdcmd sta cmdbuf call setup$win jrz error ; timeout on READY lda cmdbuf out wincmd call winbusy jrz error ; timeout on BUSY in winstat bit 0,a jrnz error ; ERROR set bit 3,a jrz error ; no DRQ ; no more errors from here on... call win$rw ; xfer from common memory... xra a ret write$win: mvi a,wrcmd sta cmdbuf call setup$win jrz error ; timeout on READY lda cmdbuf out wincmd lxi d,0 mvi h,3 write1: in winstat bit 3,a ; DRQ jrnz write2 call timer jrnz write1 ; timeout - no failure here? we'll get error from winbusy? write2: call win$rw ; xfer from common memory... call winbusy jrz error in winstat bit 0,a ; ERROR jrnz error xra a ret error: ; possible retry... ; possible recovery - step, restore, etc. xra a inr a ret ; ; WD 1002 interface routines. ; ; Written by: T. Hayes ; ; These routines provide the physical interface between the system ; and the WD 1002 winchester controller. ; winrest: ; ; Reset and restore the winchester disk ; ; On entry: ; B contains the configuration byte of the drive to be accessed ; ; On exit: ; A and B contain the configuration byte altered as follows: ; Bits 2 and 3 will be set if the drive is off line ; or reset if the controller is ready ; ; in sysctl ;first issue a controller reset setb 1,a out sysctl push psw ; mvi h,1 ;hold reset for > 50 ms lxi d,0 winrest1: call timer jrnz winrest1 pop psw ; res 1,a ;select controller (MR off) out sysctl ; mvi h,3 lxi d,6000h winrest11: in winstat ;Check busy bit 7,a ; jrz winrest3 ;go on if not busy call timer ;else count down jrnz winrest11 ; disable: xra a dcr a sta offline ; disable drive... ret ;and return that status to caller winrest3: in winerr ;check for diagnostic errors cpi 1 ;if error jrz winrest31 ;ignore "diagnostic only" errrors ; ana a ;believe all others jrnz disable ;abort if an error shown winrest31: call winpsel ; call winrdy ;ready wait jrnz winrest32 call winrdy ;wait for device ready (again?) jrz disable ;abort if timed out (twice) ; winrest32: mvi a,rstcmd ;issue the restore command out wincmd ; call winbusy ;wait for not busy jrz disable ;abort if timed out ; in winstat ;get device status ; bit 0,a ;if there was an error jrnz disable ;abort winrest6: xra a sta offline ret ;return that status to caller ; winpsel: ; ; WD 1002 physical select routine ; ; for now, assume "drive 0" has valid LUN ; lda modtbl+1 ; fully-formed SDH byte from "drive 0" ; out winsdh ;and issue the select ret ;return to caller timer: ; ; General down counter routine ; ; On entry: ; HDE are a 24 bit counter ; On exit: ; The counter will have been decremented ; zero is set if the counter is done ; zero is reset if the counter is not at 000000h ; ; Typical timings are 25 t states in the loop with an additional ; overhead of 29 t states in the calling routine. This assumes ; that the calling routine is using a call xxx and jr nz,xxxx. ; This gives a time of 13.5 usec for each iteration of the loop. ; Times when de goes 0 will be marginally longer but should not ; be significant. ; dcx d mov a,d ora e rnz dcr h ret ; TODO: make use of this somehow... winoff: ; ; If the 1002 is not at 305, seek track ; 305 then select physical unit 3. It is assumed that ; the host buffer has been flushed. ; in winlsb ;see if the drive is at 305 already cpi high lcyl jrnz winoff1 in winmsb cpi low lcyl jrz winoff2 winoff1: ; mvi a,high lcyl out winmsb mvi a,low lcyl out winlsb ; mvi a,seekcmd ;now issue a seek to that cylinder out wincmd ; ret ;return to caller winoff2: mvi a,nosel ;now deselect the drive out winsdh ; ret ;and return to caller winrdy: ; ; Wait for device ready ; mvi h,5 lxi d, =;>?>P?<=?>>=<<i;m=>c==>o>v<=<;8?N!Nw#w#W!"V0!.w#w#l2N!.~4^!.~w!.ͼ!.ͼ!.ͼ!/~w!$/ͼ!D/~w!T/~wN#Fp+q!.~^!.!. !. !. !/!$/ !D/!T/5~wN#Fq#p>BØ%!0" * F#%2NG*V0##~w*V0##~<͉:.t!.N!. yq~t +aG=#w#wY*M0!0n& {ozg"V0!K0{#z"M0b*M0!0N#yʢ ~Õb!."O1:N *M0!$/{#z"V0$ _!.*V0~#~1 ~#"M0û1 !͒%Þ%SYMBOL TABLE OVERFLOW G*V0##~w*V0##~=*V0_###1 s#r1 ^#V1 ##"X0P wP ~O!0~z 6~=ͼ !0N#~ͼ „ Ͳ O2Ny"2[*< ͑!"2! >"2[*< ͂ mj DISK WRITE FAULT $:Oͫ:O͹ͽ>ӇͤӄӅ>pӇۇ *<}ӄ|ӅyӃ:ӆͽۄӄ*>0Ӈͤ PUTSYS VER 1.4H $4\XMASMENU COPYRIGHT (C) 1979, DIGITAL RESEARCH _͌> ͒> Ò> Ò͘~#͌ì _2<ү2 Ӈ!ٶ2:2a{_:ٷʖ:ٷ>Ľʖ:=2–!B!6#5ʖ:ٷĽ!ͬʧ )!F#xʺ~0wëw!" !~6ͽ:ý(!#͘*~ "Է"͌#>?͌͘ =_.:;<> Oԅo$>!Y2*O"ʉ@G:ʐ:wÖx2p0ʹ#*©6?ëw˜0ï#6 ¹.0#*6?w0#6 #6" #~?  xDIR ERA TYPESAVEREN USER!yO#< Ty#O 3կ21y_͸2y2ͽ:ҷ˜1͘A͌>>͌92^ :ٷ¥.!_~#fow]׭؎إ!v"!çREAD ERRORçNO FILE^:ٷ ! ~ 3#0 Wx x Ԁ Ԃ G ~ # 3x~#B!Y~ɯ2:ٷ=!پý:ٷ=!پ:ý^T!~  6?#ˆ:`O> K{͘A͒>:͒͢>:͒͢xK > K > ͒x  ͢ØÆ^ BRͧ9!5‚#~Y‚#"T<ÆALL (Y/N)?^ Tʧ͘!6!~ڇ ׯw4!Y~ʆ͌†t=ʆf ^ T ׯ2o&)|+!<ͧÆNO SPACE^ :Ty!B*O=?_s#"^sG!~Yظpsp2mÆÆf ͧÆFILE EXISTS _: É: :ٷʉ=2)ͽÉ T!@k!}|q=qf^!~2>`~2ٯ2\!!B!~> >#0~O#Cx2͘1)ͽÂf zͧÆBAD LOADCOMf^: !ٶ Â$$$ SUBڙڥګڱ"C{2!"E9"1Aݯ22!ty)K!G_^#V*Cܐ~E ,&-AGMSݛ!!ô!ô!Bdos Err On : $Bad Sector$Select$File R/O$:BA2!~6 O͐  :ݷE B 2>: ݷb# : ݷy! 4 5~yy5 6yҐ^H@Oy H H: –ͬ  #H: ! ݾ Hù H H $O͐: 2 *CN# x: 2 p&x~+é7ۯ2 H! >w_: ! ݾ5ͤNkͱ¦ͱxʊ#Nx: ݷ! ݖ2 ͤ! 5™#wO~x½p Hy<< ʑ :!qMD#2E>! ^#V w#P:BO|^#V#"##"##"##"!O*!O*|!6ʝ6>*w#w*w#w'û*! J*""!N#F*^#V*~#foyx*{_zW+*yx#*DM*s#r*s#ryOxG*0MD!!N: EG>O: \޷Sހ*C :qn& ^#V>O^"*}:*)=":O:硵o"*C *C!ͮ~2~2ͦ:2ͮ:ޯO:w:w |g}o*篆# ):BO!yoxg*:BO}!N#F "*#*s#r^ ~!J! J*:o$*C~i6iw**{#zr+s{ozg**͕** ߾,w͜͸Ͳ!!N#F$**O!~#:Aݾ#~$=2Ek͌::/GyO>2!q*C"͡ʔ*JҔ^:Oyʃ?|x | s-|N-# S:2E!~Яw>T D^6k-äPYy 5*{zBK5ڋ>*Cw~#+w#w+ɯ2E22i^ *C :~w~͔͔# #  w ~>2!E5T*C!"C"C!w# F! w͌x߯2͢*C ~<wʃG:!ʎì 4~ʶ¬:<ʶ$ʶïZͻޯx>2>2ͻ:!Z2:Eݷẅ́͊Ͳ>2>2T*CGͻ:ẅ́n>2;O ^DM;}H>"*C ::ddslO s#r:Eݷ͊:==»y==»*Ww#*"͸*:G#š"͸:!w4!iw:Z!E~=26ޯ2*C!!~~#~O~G#n,-.‹! w! yG!x͢.:E<ʄ! q!pQ:E<. ʄ$.:E<ʄi6}2ExN! ~态O>G~G!~G} *C!r#r#r ^ͥ_y#x#{s+p+q-*C ͥ!!q#p#w*:BOYG}*MD "ã:!Bݾw!>2*C~=2u:B2~2wE:A*Cݶw>"!""2B!"!rQQQâ~?ͦ~?rQ*"CQ-Q͜QüQrQ$Q*):B"*)*)Q;*"E:;:A2AQÓQÜQ*C}/_|/*W}_*"}o|g":ʑ*C6:ʑw:2E**E}DQ>2ê:Û50+ÍÑÕÙÝáëPý0123456789-, ., D D|͉2:32!JF#N#~ :G:H KAYPRO 60K CP/M Version 2.2H !"t>!2"!2"!"!"!T":OyO:|͍͉͑ Warm Boot 1͕Cx͝,͙͡ *xDM"x͝2 *t+"t|:q :.3.*>͛(:q /:.6.-!5O ~!ay''O "o>2q*oN#"o:q=2qy~y2qy.':.9.E.6.9:.9c.E@.9:.B.

y>O#>#>J!.4. 0.,.(.$. !"t.!"t.:4(.!sv1&{v˿~#O  8 >1͌0͌>>Ì 2r2s2<:r(!2s:s_ 2:r_ :<:s_ :r_ 0 winrdy1: in winstat ;check for ready bit 6,a rnz ;return if it is ; call timer ;else count down rz ;return if timed out jr winrdy1 ;else try again ; ; winbusy: ; ; Wait for device not busy ; mvi h,7 ;set up dead man counter lxi d,0 winbusy1: in winstat ;get status cma bit 7,a ;if not busy rnz ;return call timer ;else count down rz ;and return if timed out jr winbusy1 ; end requested drive DAD B ; from 'trks' array addressed by new 'logdsk'. MOV A,M OUT fdctrk ; set track number mov a,c sub e ;same drive as last time? sui 1 ! sbb a ;.true. if same drive cma di lxi h,motor$off ;if diff. drive, must check ready. ora m ;if same but motor off, must check ready. mvi m,true ;this prevents the motor from being turned off sta mtflg ; test drive for ready. cma ! ora a ;[NC] jrnz fb3 ;[NZ] if motor still on. ; mvi a,11010000b out fdccomd in fdcstat mvi b,10 ;must be ready within 10 rev. fb1: call find$NE lxi d,IP$count fb2: in fdcstat ani 00000010b jrnz got$IP dcx d mov a,e ora d jrnz fb2 djnz fb1 stc fb3: ei ret IP$count equ 17250 ; 200mS +10%, timed to "fb2" loop got$IP: xra a ei ret find$NE: in fdcstat ani 00000010b mov c,a mvi h,4 ;wait even longer... (3.67 sec) fb00: lxi d,0 ;wait a long time for any edge fb01: in fdcstat ani 00000010b cmp c jrnz got$edge dcx d mov a,e ora d jrnz fb01 dcr h jrnz fb00 pop d ;discard address from "fb1" loop stc ei ret got$edge ora a rz mov c,a ;if not NE, go find another jr fb00 ACCESS$R: lhld @dph lxi d,12 dad d mvi a,15 ;PSH add m mov e,a inx h mvi a,0 adc m mov d,a ldax d sta blcode ;get physical sector size lhld cmode mov c,m ; mode byte 2 inx h mov a,m ; mode byte 3 cma ; get "NOT MDT... ana c ; ... AND DDT" ani 00100000b ; flag is in bit 5 sta htflag ; half track flag CALL SELECT rc SEEK: lda @trk ora a ;see if we're on physical track 0 jrnz xf0 lhld cmode lda @side ora a ;see which side we're on. jrnz xf1 bit 0,m ;check TRK-0,SID-0 density bit. jrz xf0 xra a sta blcode ;select 128 bytes/sector di in sysctl ani 10111111b ori 00100000b ;select SD media out sysctl ei jr xf0 xf1: bit 1,m ;check TRK-0,SID-1 format (may be 256 bytes/sector) jrz xf0 mvi a,1 sta blcode ;select 256 bytes/sector ;leave DD as is. xf0: LXI H,SEKERR ; initialize seek error counters MVI M,4 ; 4 ERRORS ON SEEK IS FATAL INX H MVI M,10 ; RESTORE once, then 9 errors are fatal call setside lda @trk mov c,a RETRS: MOV A,C ; get track number back ORA A ; FORCES "RESTORE" IF "seek to track 0" jz HOME ;RESTORE HEAD TO TRACK 0 lda htflag mov h,a ; get half-track flag in h IN fdctrk ;CURRENT HEAD POSITION, SUB C ;SEE HOW FAR WE WANT TO GO. RZ ;IF ZERO TRACKS TO STEP, WERE FINISHED MVI B,01111000B ;ASSUME STEP-OUT + UPDATE + HEADLOAD JRNC STOUT ;ASSUMPTION WAS CORRECT... MVI B,01011000B ;ELSE MUST BE STEP-IN NEG ;AND NUMBER OF TRACKS WOULD BE NEGATIVE STOUT: MOV L,A ;COUNTER FOR STEPING SEEK5: BIT 5,H ; CHECK FOR 48 TPI DISK IN 96 TPI DRIVE JRZ NOTHT RES 4,B ;SELECT NO-UPDATE CALL TYPE$I ;STEP HEAD ANI 00000100B SHL 1 ;DID THIS STEP PUT US AT TRACK 0 ? JRNZ TRK0ERR SETB 4,B ;SELECT UPDATE TO TRACK-REG notht: CALL TYPE$I ;STEP HEAD ANI 00000100B SHL 1 ;DID THIS STEP PUT US AT TRACK 0 ? JRNZ TRK0ERR DCR L JRNZ SEEK5 IN fdcsec ;SAVE CURRENT SECTOR NUMBER MOV L,A CALL READ$ADDR ; GET ACTUAL TRACK UNDER HEAD (IN SECTOR REG) in fdcsec ;GET TRACK NUMBER FROM MEDIA MOV H,A MOV A,L OUT fdcsec ;RESTORE SECTOR NUMBER LDA @dstat ;GET TRUE ERROR STATUS OF READ-ADDRESS RLC RC ;DRIVE NOT READY ANI 00011000B SHL 1 ; CRC ERROR + REC-NOT-FOUND MOV A,H ; ACTUAL TRACK FROM READ-ADDRESS LXI H,SEKERR ;POINT TO ERROR COUNTERS JRNZ RESTR0 CMP C ; (C) MUST STILL BE VALID DEST. TRACK RZ ;NO ERRORS RTS00: DCR M ; SHOULD WE KEEP TRYING ? STC RZ ;NO, WE'VE TRYED TOO MUCH OUT fdctrk ; re-define head position accordingly JR RETRS ; RETRY SEEK TRK0ERR: XRA A LXI H,SEKERR JR RTS00 RESTR0: INX H ; RESTORE ERROR COUNT DCR M STC RZ ; If count 0, return with Carry set. MOV A,M CPI 9 JRNC RESTR1 ; RESTORE ONLY FIRST TIME CALL STEPIN ; OTHERWISE STEP HEAD IN 1 TRACK JR RETRS RESTR1: ; RESTORE HEAD TO TRACK 0 MVI A,00000011B STA STEPRA ; RETRY WITH MAXIMUM STEP RATE CALL HOME JR RETRS ; RETRY SEEK STEPIN: lda htflag ora a ; CHECK HALF TRACK mode MVI B,01001000B ; STEP IN WITHOUT UPDATE CNZ TYPE$I ; STEP A SECOND TIME (W/O UPDATE) FOR HALF-TRK MVI B,01011000B ; STEP IN AND UPDATE TRACK REGISTER JR TYPE$I HOME: ;POSITION HEAD AT TRACK ZERO... mvi a,11010000b ;force TYPE$I status out fdccomd in fdcstat ANI 00000100B ;TEST TRACK ZERO SENSOR, JRNZ @TRK0 ;SKIP ROUTINE IF WE'RE ALREADY AT TRACK 0. IN fdctrk ;DOES THE SYSTEM THINK WE'RE AT TRACK 0 ?? ORA A JRNZ HOME1 ;IF IT DOESN'T, ITS PROBEBLY ALRIGHT TO GIVE "RESTORE" MVI L,6 ;(6 TRKS) ;ELSE WE COULD BE IN "NEGATIVE TRACKS" SO... MVI B,01001000B ;WE MUST STEP-IN A FEW TRACKS, LOOKING FOR THE HOME0: CALL TYPE$I ;TRACK ZERO SIGNAL. ANI 00000100B SHL 1 ;"SHL 1" BECAUSE TYPE$I DOES AN "RLC" JRNZ @TRK0 DCR L JRNZ HOME0 HOME1: MVI B,00001000B ;RESTORE COMMAND, WITH HEADLOAD CALL TYPE$I XRI 00000100B SHL 1 ;TEST TRACK-0 SIGNAL RAR RAR RAR RAR ;[CY] = 1 IF NOT AT TRACK 0 @TRK0: MVI A,0 OUT fdctrk ;MAKE SURE EVERYONE KNOWS WERE AT TRACK 0 RET ; READ$ADDR: mvi a,11000100B ; READ-ADDRESS COMMAND WITH SETTLE DELAY jr PUT$I TYPE$I: LDA STEPRA ; STEP-RATE BITS ORA B ; MERGE COMMAND PUT$I: OUT fdccomd ; SEND command TO CONTROLLER WB: IN fdcstat ; WAIT FOR BUSY SIGNAL RAR ; TO COME UP JRNC WB WNB: IN fdcstat ; poll controller for function-complete RAR ; Busy? JRC WNB ; wait until not busy. RAL STA @dstat ;SAVE TYPE II (III) STATUS FOR ERROR DETECTION. MVI A,11010000B ;TERMINATE COMMAND (RESET STATUS TO TYPE 1) OUT fdccomd IN fdcdata ; in fdcstat ; rlc ret setside: lda @side xri 00000001b rlc ! rlc mov c,a di in sysctl ani 10111011b ora c out sysctl ei ret STEPRA DB 0 ; STEP RATE CODE RETRYS DB 0 SEKERR DB 0,0 ; SEEK,RESTORE ERROR COUNTS CMODE DW 0 ; POINTER TO MODE BYTE LOGDSK DB 2 ; CURRENT DRIVE SELECTED BY THIS MODULE BLCODE DB 0 SELERR: DB 0 SELOP: DB false MODFLG: DB 0 TRKS: DB 255,255,0 htflag: db 0 mtflg: db 0 END tracks on side 0 lda @trk ;(for all except Z17, B=C) cmp c rc neg add c add b dcr a sta @trk side1: mvi a,1 sside: sta @side dsret: ret multio: sta @cnt ! ret flush: xra a ! ret ; return with no error @side: ds 1 ; current side of media (floppy only) @trk: ds 2 ; current track number @sect: ds 2 ; current sector number @cnt: db 0 ; record count f lhld @date lxi d,365 mvi a,28 sta mondays+1 ;set february=28 mvi b,0 ;start counting years since 1978 ti6: mov a,b ; check for leap year ani 11b ;every 4 years, xri 10b ;starting with 1980 jrnz ti7 stc ;one extra day for leap years ti7: dsbc d ;does this year fit in @date? inr b ;count a year. jrnc ti6 ;yes, keep taking out more days (by years) mov a,b ;is this year a leap year? ani 11b xri 10b jrnz ti8 mvi a,29 sta mondays+1 ;February=29 stc ti8: dadc d ;normalize @date (we subtracted one too many) dcr b mov a,b adi 78 ;adjust year to 1900 mvi b,19 ;century cpi 100 jrc ti8@0 inr b sui 100 ti8@0: call binbcd sta timeyrs mov a,b call binbcd sta timecnt xchg ;remainder into DE mvi b,1 ;start taking out months. lxi h,mondays ti9: mov a,e sub m mov c,a mov a,d sbi 0 jrc ti10 mov e,c mov d,a inx h inr b mov a,b cpi 13 jrc ti9 ti10: mov a,b call binbcd sta timemon sta lstmnth ;also set last accessed month mov a,e ;left-over must be date of month call binbcd sta timedat ; set day-of-week using Zeller's congruence: lda timeyrs ;E=([2.6m-.2]+K+D+[D/4]+[C/4]-2C) mod 7 call bcdbin ;0=sunday mov d,a lda timemon call bcdbin mov b,d sui 2 jrz ti11 jrnc ti12 ti11: adi 12 dcr b ti12: mov c,a add a add c ;*3 add a add a ;*12 add c ;*13 dcr a mvi c,0 ti13: inr c sui 5 jrnc ti13 dcr c lda timedat push b call bcdbin pop b add c ;[2.6m-.2]+K add b ;+D srlr b srlr b ; [D/4] add b ;+[D/4] mov c,a lda timecnt ;century call bcdbin mov b,a slar b ; 2*C srlr a ;; srlr a ; [C/4] add c ;+[C/4] sub b ;-2*C mov c,a jp ti14 neg ti14: mvi b,0 ti15: inr b sui 7 jrz ti16 jrnc ti15 bit 7,c jrnz ti16 dcr b ti16: mov a,b add a add b ;*3 add a add b ;*7 bit 7,c jrz ti17 neg ti17: mov b,a mov a,c sub b inr a sta timeday mvi a,clrcnt ; out rtcadr ; mvi a,00000011b ;reset fractional seconds out rtcdta ;we now havel 0095 AF xra a 0096 CDFB02 call bnksel 0099 7D mov a,l 009A 44 mov b,h 009B C9 ret 009C # @@ set ($-BIOS$0) if (@@ and 0fh) ne 0 009C ds 16-(@@ and 0fh) endif ;put vectors on req. boundary, xxxxx000x for SIOs ; and xxxxxxx0 for PIO. @vect: sio1vec: 00A0 3001 dw nullsio ; chB TxE 00A2 3001 dw nullsio ; Ext/Sts 00A4 3001 dw nullsio ; RxA 00A6 3001 dw nullsio ; Spcl 00A8 3001 dw nullsio ; chA TxE 00AA 3001 dw nullsio ; Ext/Sts 00AC 3001 dw nullsio ; RxA 00AE 3001 dw nullsio ; Spcl sio2vec: 00B0 3001 dw nullsio ; chB TxE 00B2 3001 dw nullsio ; Ext/Sts 00B4 3001 dw nullsio ; RxA 00B6 3001 dw nullsio ; Spcl 00B8 3001 dw nullsio ; chA TxE 00BA 3001 dw nullsio ; Ext/Sts 00BC 3001 dw nullsio ; RxA 00BE 3001 dw nullsio ; Spcl piovec: 00C0 3001 dw nullpio ;ch A 00C2 3001 dw nullpio ;ch B 00A0 # @v set @vect-BIOS$0 00C4 # @@ set $-BIOS$0 if (@v shr 8) ne (@@ shr 8) ds 'Vect X page bound' endif 00C4 310E01 wboot: lxi sp,stack 00C7 AF xra a 00C8 CDFB02 call bnksel 00CB C35201 jmp wboot1 00CE ds 64 010E = stack equ $ 010E ds 32 012E = iostk equ $ 012E 0000 iostkp: dw $-$ nullsio: nullpio: 0130 FB ei reti 0131+ED4D DB 0EDH,4DH 0133 ds 16 ;8 levels of stack 0143 intstk: ds 0 0143 0000 istk: dw 0 tick: sspd istk 0145+ED73 DB 0EDH,73H 0147+4301 DW ISTK 0149 314301 lxi sp,intstk 014C F5 push psw 014D E5 push h 014E C5 push b 014F 210000 lxi h,@sec 0152 34 inr m 0153 219E03 lxi h,tictbl 0156 0602 mvi b,numtic 0158 7E to4: mov a,m 0159 23 inx h 015A FEFF cpi true 015C CA7C01 jz to3 015F 7E mov a,m 0160 B7 ora a jrz to5 0161+2815 DB 28H,TO5-$-1 0163 35 dcr m jrnz to3 0164+2016 DB 20H,TO3-$-1 0166 C5 push b 0167 D5 push d 0168 E5 push h 0169 23 inx h 016A 7E mov a,m 016B 23 inx h 016C 66 mov h,m 016D 6F mov l,a 016E CDFA02 call icall 0171 E1 pop h 0172 D1 pop d 0173 C1 pop b 0174 7E mov a,m 0175 B7 ora a jrnz to3 0176+2004 DB 20H,TO3-$-1 0178 2B to5: dcx h 0179 36FF mvi m,true 017B 23 inx h 017C 23 to3: inx h 017D 23 inx h 017E 23 inx h djnz to4 017F+10D7 DB 10H,TO4-$-1 too3: 0181 0E20 mvi c,rtcadr inp b ;save existing rtcadr 0183+ED40 DB 0EDH,B*8+40H 0185 3E10 mvi a,rtcis ;clear rtc INT flag outp a ; 0187+ED79 DB 0EDH,A*8+41H 0189 DB24 in rtcdta ; outp b ;restore rtcadr 018B+ED41 DB 0EDH,B*8+41H 018D C1 pop b 018E E1 pop h 018F F1 pop psw lspd istk 0190+ED7B DB 0EDH,07BH 0192+4301 DW ISTK 0194 FB ei reti ;resets PIO interupt 0195+ED4D DB 0EDH,4DH ; SEARCH for a module by device #. ; entry: C = device # (0-249) ; exit: [CY] = not found ; else HL=module address ("init" entry) ; A=device number (relative to module's #0) ; 0197 11A603 search: lxi d,thread ;C=device number 019A EB snext: xchg 019B 5E mov e,m 019C 23 inx h 019D 56 mov d,m 019E 23 inx h 019F 7A mov a,d 01A0 B3 ora e 01A1 D601 sui 1 ;produce [CY] if DE=0000 01A3 D8 rc ;return if device not found, DE=0000 01A4 79 mov a,c 01A5 96 sub m jrc snext 01A6+38F2 DB 38H,SNEXT-$-1 01A8 23 inx h 01A9 BE cmp m jrnc snext 01AA+30EE DB 30H,SNEXT-$-1 01AC 23 inx h ;point to "init" vector 01AD B7 ora a ;set [NC] condition 01AE C9 ret 01AF 21B301 devtbl: lxi h,@ctbl 01B2 C9 ret 01B3 6E6F646576@ctbl: db 'nodev ',0,0 ;character table, filled at cold-start. 01BB 6E6F646576 db 'nodev ',0,0 01C3 6E6F646576 db 'nodev ',0,0 01CB 6E6F646576 db 'nodev ',0,0 01D3 6E6F646576 db 'nodev ',0,0 01DB 6E6F646576 db 'nodev ',0,0 01E3 6E6F646576 db 'nodev ',0,0 01EB 6E6F646576 db 'nodev ',0,0 01F3 00 db 0 ;table terminator cdtbl: rept 8 ;character device table, filled at cold-start. dw cnull endm 01F4+0402 DW CNULL 01F6+0402 DW CNULL 01F8+0402 DW CNULL 01FA+0402 DW CNULL 01FC+0402 DW CNULL 01FE+0402 DW CNULL 0200+0402 DW CNULL 0202+0402 DW CNULL 0204 C31602 cnull: jmp null ;init 0207 C31302 jmp nulli ;input status 020A C31302 jmp nulli ;input 020D C31302 jmp nulli ;output status 0210 C31602 jmp null ;output 0213 3E1A nulli: mvi a,1ah ;E.O.F. character, also [NZ] to be always ready. 0215 B7 ora a ;sets [NZ] condition. 0216 C9 null: ret 0217 0600 cinit: mvi b,0 ;C=device number (0-11) bit 3,c ;devices 8-11? 0219+CB59 DB 0CBH,3*8+C+40H 021B C0 rnz ;cannot init those 021C 0600 mvi b,0 ;C=device number (0-7) slar c ;*2 for table index 021E+CB21 DB 0CBH,20H+C 0220 21F401 lxi h,cdtbl 0223 09 dad b 0224 5E mov e,m 0225 23 inx h 0226 56 mov d,m 0227 41 mov b,c 0228 EB xchg 0229 E9 pchl ;jump to modules "init" with B=device # const: 022A 2A0000 lhld @civec ; get console input bit vector jr ist$scan0 022D+1803 DB 18H,IST$SCAN0-$-1 auxist: 022F 2A0000 lhld @aivec ; get aux input bit vector ist$scan0: 0232 CDC902 call swtosys 0235 11BA02 lxi d,xitusr 0238 D5 push d ist$scan: 0239 11F401 lxi d,cdtbl 023C 0600 mvi b,0 cis$next: slar h ; check next bit 023E+CB24 DB 0CBH,20H+H 0240 D24A02 jnc is0 0243 3E03 mvi a,3 ; assume device not ready 0245 CDE002 call indjmp1 ; check status for this device 0248 B7C0 ora a ! rnz ; if any ready, return true 024A 13 is0: inx d 024B 13 inx d 024C 04 inr b 024D 7CB7 mov a,h ! ora a ; see if any more selected devices jrnz cis$next 024F+20ED DB 20H,CIS$NEXT-$-1 0251 AF xra a ; all selected were not ready, return false 0252 C9 ret conin: 0253 2A0000 lhld @civec jr in$scan0 0256+1803 DB 18H,IN$SCAN0-$-1 auxin: 0258 2A0000 lhld @aivec in$scan0: 025B CDC902 call swtosys in$scan: 025E E5 push h 025F CD3902 call ist$scan ;see if there is a character ready 0262 E1 pop h 0263 B7 ora a jrz in$scan ;wait untill one is ready. 0264+28&À# $b${$*!:!X!!M"p"""""4#\#j# ()*+,-/ABCDEHLMDBDIDSDWEIEQGEGTIFINLELTNEORSPACIADCADDADIANAANDANICMACMCCMPCPIDAADADDCRDCXENDEQUHLTINRINXIRPJMPLDALOWLXIMODMOVMVINOPNOTNULORAORGORIOUTPOPPSWRALRARRETRLCRRCRSTSBBSBISETSHLSHRSTASTCSUBSUIXORXRAXRIASEGCALLCSEGDSEGELSEENDMHIGHIRPCLDAXLHLDNAMEPAGEPCHLPUSHREPTSHLDSPHLSTAXXCHGXTHLENDIFEXITMEXTRNLOCALMACROSTKLNTITLEINPAGEMACLIBPUBLIC7 PF FPA A A* A A A(#&&#&2#/?&#' '( v'( %:P!@"<& #*)&# PP%27&#(&#  $ %*%"$  NZZ NCC POPEP M x#_BH!™# 0#³# £#{ڽ#KÅ#CÅ#<: 0 JCR:0 $# $! 06 p#! 0$# # ɯ<:0O=_^$!"F!!V#fjQ̀#G$2!!!^#Vo&)O~#F##xGyѯ *\ ?=)$=)w#Ž&!\60 ڱ&>GO#w ³&>O # &6 &6L#6I#6B#w2|r&\u'>2]0!"%![0~2%wG&!,x&>82%2%!"b0*"M0!1"%"&"@&#"K0"T0' _#~6' D':%A6'>:6'D'>.6'D'>-6'x&!,N'!k-x&!,N':% '> ':%'_!% '6 4ɯ2%2]02e02d02g02%:\ =)!%w#w#w#w#w#w#>2^02_0:m$(!~#$,(~(# 3(%Aʩ(Pʩ(Sʩ(Hʩ(Lʩ(*t(+t(-¶(^0~Sʣ(Mʣ(e0Lʣ(d0Qʣ(g0Rʣ(%1¶(x#3(~AҶ(#3(#6 !)-x&!x&!%͉&!%͉&ͳ'(`&͛'͠':%)!&͉&l&͛'͠'!%60#60#60#>2f0!"&:O0*!"%2%2%2%Z&%u'!-x&z{:]0ʢ)*%F)w)!"%r&\‰)*%#"%+~):.2]0ʢ)r&\!~-N'*%F))Z&!"%*%B&%)¼))*)6# )G&*%*%#"%~!<-x&G:%7*$*x*7*x2*Ϳ'5*9**&*&w#"&!F)`&!"&*&%~ʅ*B&Œ*`*G&`*!S-x&ö,͟**>&*@&w#">&!F)l&!">&*@&&`*_!%~ *2%*b0}!,~ +*#+> *>#**> **b0~>+*#2+> *> *> *}2%!%*O*:/ :O0:%y*:%!O0•+:e0!]0+~,:/ ,!/~ +:f0,:/++:_0,+:/#,:/ ,:_0=+!/~ +!0s!%~!%*4:0!/,G~Y+#x=+> Y+> Y+20!/>x6 #=,G!/~ pͳ'*&}?,>*/,`&%͈':^0*+,!&6S#6Y#6M#w!&w:%2%!"&ͳ'*2%`&%͛'͠'+,:%ʶ,:%.*P0"%.*>&}ʶ,>͕*æ,:%,l&&͈'!-x&CP/M MACRO ASSEM 2.0 NO SOURCE FILE PRESENT NO DIRECTORY SPACE SOURCE FILE NAME ERROR INVALID PARAMETER: SOURCE FILE READ ERROR OUTPUT FILE WRITE ERROR CANNOT CLOSE FILES UNBALANCED MACRO LIB END OF ASSEMBLY G:%x-!%~--.-*P0*%O {-z-.*P0"%!%^4!%w..WƐ'@'Õ*>:͕*!%^Ww*%{-|-}--{?.!%~#-6.-> ͕*> ͕*͞*> ͞*ws1I"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!I"!^ ͵ #I"!++s#r!#ͧ!+s#r!"#*#ͺ!"L#*I"% 6*I"+"K"ͫ!"M":] sr ͡ !#6\Mڀs:#Ҷ\S:h2y#!h6*"%|¶12!%¶!!%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\֎ % a3S h9dXx xx` jK J"xC)Ce9ab0Ā.! 01^wEED@8 dL:A+vu<6[,܄Ch<Ze]la05 s J ss˘2A,J [E{-`nBdxYD|@dUGX$+K Pu_q!d3q`<c0V6 Y+X%K. X8a!3  v@eEX$"P;JN4uVx"=c0@z2Ɓ.6 xHD 4 Z[!1l<`!ơ'P@hz(EJ= $'?=vI;A)<5 {X$|@dHK$uB^5 dqI0P@xz(E`?9vI;Ogݒ~s=p0?9vH= >,~`#joK$BGX% le(!|uBZ'IeA.8 {  3qx4|v]2]c ;H ieàM%zs:i#jzsH7ãL8-Z aL:yim0>aώ`9[>= 0>ãL8-[ aZaL:>À} <,XZd `:Őm,> 0iO-0aqn@ vta}41+s;l8yf CL8|{aL8}iGq[#l><4Ç!<Çt|i 0V+ g 6Ëwdt[["im`,`DuII3 ґ3]p) b!n)4C'0G>I7 3qJ˭ !5sO`9\* |srk0@ "EX%Ҁbp'0] =:a/cKyHD[JG0^*.^8 [HCx[HG0%`I#D($ɢp'0gf@1V6 wichO%rvC*#h_ ґ+EX%"n!16@J|s,pa0XP*ih@i*!xPO`9\ >9w[!#Mpp  hO$0|snc@xbm`Y$0?Y$uBZss,t{(8Q@?Y $?X$K@2~+]<ƀw֩!J,t㬂dK-@nid x`n:!+v,:A"[ȁ,cY $^Gd `:A$qC X=D fvH C #J0d0yuT+rP;l>zr7%ZaH8fph>46qnߡp4çp0l8yaP{L>+>-D fJeFX$U]l=T5D$@VECTKvAn#L<"Pp8 $n(C 9aH`=6Kff EY$0?Y$0vK7FJx$e]zѠҞ= d$ٺtuJ㬀?!eGX$:+pFY$uI㬒"D 2(3v8/FF And uPEpH:(2a`㬀d0J:PRTMSG = Y PAGWID = 4F PAGLEN = 17 BACKSPC = N RUBOUT = Y BOOTDRV = A MEMTOP = FF BNKSWT = Y COMBAS = E0 LERROR = N NUMSEGS = 03 MEMSEG00 = 00,80,00 MEMSEG01 = 00,C0,02 MEMSEG02 = 00,C0,03 MEMSEG03 = 00,C0,04 MEMSEG04 = 00,C0,05 MEMSEG05 = 00,C0,06 MEMSEG06 = 00,C0,07 MEMSEG07 = 00,C0,08 MEMSEG08 = 00,C0,09 MEMSEG09 = 00,C0,0A MEMSEG0A = 00,C0,0B MEMSEG0B = 00,C0,0C MEMSEG0C = 00,C0,0D MEMSEG0D = 00,C0,0E MEMSEG0E = 00,C0,0F MEMSEG0F = 00,C0,10 HASHDRVA = Y HASHDRVB = Y HASHDRVC = Y HASHDRVD = Y HASHDRVE = Y HASHDRVF = Y HASHDRVG = Y HASHDRVH = Y HASHDRVI = Y HASHDRVJ = Y HASHDRVK = Y HASHDRVL = Y HASHDRVM = Y HASHDRVN = Y HASHDRVO = Y HASHDRVP = Y ALTBNKSA = N ALTBNKSB = N ALTBNKSC = N ALTBNKSD = N ALTBNKSE = N ALTBNKSF = N ALTBNKSG = N ALTBNKSH = N ALTBNKSI = N ALTBNKSJ = N ALTBNKSK = N ALTBNKSL = N ALTBNKSM = N ALTBNKSN = N ALTBNKSO = N ALTBNKSP = N NDIRRECA = 01 NDIRRECB = 01 NDIRRECC = 01 NDIRRECD = 01 NDIRRECE = 01 NDIRRECF = 01 NDIRRECG = 01 NDIRRECH = 01 NDIRRECI = 01 NDIRRECJ = 01 NDIRRECK = 01 NDIRRECL = 01 NDIRRECM = 01 NDIRRECN = 01 NDIRRECO = 01 NDIRRECP = 01 NDTARECA = 01 NDTARECB = 01 NDTARECC = 01 NDTARECD = 01 NDTARECE = 01 NDTARECF = 01 NDTARECG = 01 NDTARECH = 01 NDTARECI = 01 NDTARECJ = 01 NDTARECK = 01 NDTARECL = 01 NDTARECM = 01 NDTARECN = 01 NDTARECO = 01 NDTARECP = 01 ODIRDRVA = A ODIRDRVB = A ODIRDRVC = A ODIRDRVD = A ODIRDRVE = A ODIRDRVF = A ODIRDRVG = A ODIRDRVH = A ODIRDRVI = A ODIRDRVJ = A ODIRDRVK = A ODIRDRVL = A ODIRDRVM = A ODIRDRVN = A ODIRDRVO = A ODIRDRVP = A ODTADRVA = A ODTADRVB = A ODTADRVC = A ODTADRVD = A ODTADRVE = A ODTADRVF = A ODTADRVG = A ODTADRVH = A ODTADRVI = A ODTADRVJ = A ODTADRVK = A ODTADRVL = A ODTADRVM = A ODTADRVN = A ODTADRVO = A ODTADRVP = A OVLYDIRA = Y OVLYDIRB = Y OVLYDIRC = Y OVLYDIRD = Y OVLYDIRE = Y OVLYDIRF = Y OVLYDIRG = Y OVLYDIRH = Y OVLYDIRI = Y OVLYDIRJ = Y OVLYDIRK = Y OVLYDIRL = Y OVLYDIRM = Y OVLYDIRN = Y OVLYDIRO = Y OVLYDIRP = Y OVLYDTAA = Y OVLYDTAB = Y OVLYDTAC = Y OVLYDTAD = Y OVLYDTAE = Y OVLYDTAF = Y OVLYDTAG = Y OVLYDTAH = Y OVLYDTAI = Y OVLYDTAJ = Y OVLYDTAK = Y OVLYDTAL = Y OVLYDTAM = Y OVLYDTAN = Y OVLYDTAO = Y OVLYDTAP = Y CRDATAF = N DBLALV = Y D = Y OVLYDIRE = Y OVLYDIRF = Y OVLYDIRG = Y OVLYDIRH = Y OVLYDIRI = Y OVLYDIRJ = Y OVLYDIRK = Y OVLYDIRL = Y OVLYDIRM O( *SmwrXZ# ]bg~ÃÜrÒ/×ï ) n×AQ@>*}D0000000000000000001R MsC1C!4!~#|~(5 #~#fo~ +6#### @>y$A{CM^#V#zy8#0#!nodev nodev nodev nodev nodev nodev nodev nodev >Y!! ^#VA**$J>| **9(>M***$> | (***$> ( | G({.x:A( s.1._>#Wo>g2AG?S [úx2(:((?:A2( KAYPRO CP/M 3.100u (c) 1985 DRI and DRM $ No CCP$CCP COM02?bKAYPRO Winchester Disk Interface 3.100a$De:.>(>2$:Q*s Q)!lr/VF5mKAYPRO Floppy Disk Controller 3.100c$PXPXPX:>2:Q!f~62*s{Yvvvvv8>:2f>Q{b""%B^KAYPRO CRT driver v3.100g$M%à%Á%ô%ë%{E%KAYPRO Keyboard handler v3.100e$4%?&4&\&P&%KAYPRO Z80-SIO handler v3.100e$ 4 (4(4 ?Ã&ã&Ä&Ü&Ç&{&;KAYPRO Parallel Printer v3.100c$23! ;N#F#~_#~pW~# ~(<#~#总 6~p 0#^#V#N#F## O>w#O>pw!r#######~ !r=KAYPRO KAYPROX MMS Z37 Z37X Z100 EPSON ASSOC FMT8 FMT9 FMT10 FMT11 FMT12 FMT13 FMT14 &Q&1&q&&& ''.'?'P'a'r'''' ' ' ' '@U'W ((X-(X>(1!|G^ >">"!}">">"!E"> $> >$>O#>#>J!!}#>!}!}!^#V#z ~##ں O+~#! Gy ҳ s#r#<GyOx!  N#fiOf ” ï f M  *"*}"*"*"*"!x:|O:2B ͏| >2z͏< 2͏@,͏z͏|2y2f Ç| f *u|Ç:yG8!)>22!"*"!@)!@)!@)!~((#### y p#q#s#ro ͏v ʍ  !  A$w#Y$  : ! ܐ : 2: 2: 2>2 : ͨ G: x(dNG2 !m : ͨ O : ͨ =(G o>g"::2 :2 :2 *m>2 x 7R0x >2 7ZxNd8dͶ 2 xͶ 2 ! {Oz8 YW#x 8xͶ 2 2 {Ͷ 2 : ͨ W: ͨ B(0 O= 0 : ͨ 88O: ͨ G ??OU D(0y xy(DGy<2 > >$ !  A~$# w++~'w0#~'w+ GOxGd0d 0 !!!!! &$y2j!A ~(k2kOC͗8a2l"m^#V#N#F:lo& "o@ AO :lO "q88)2>͵ :88:jO! [qs#r!:jO! ^#VSq*o~ #>(#~(>MOG#n( !C[q! N#F ! F ?2!~#,! ~#fo#))MD* B8" * " !q#p#6^#V+*o~X7*qq#p N#fiC C"Cs:A2i`z n&+Å 2* "*""*o~ ###v(~!O N#fi{*m:?O!~O/q!>!!:wK:D=2>22ɯd(!7%F)U-1s59=A&$&$2-:P2/͔:-*o~G#~`G:ӆ>Ӂ*:/3 }( }8o}ӄ|Ӆ:Ӄ>ӂ> 2.(H:.Ӈ$(>ۇG 8_(4>02.(%:.Ӈ&ۇ_  $(ۇG ɯ<& ˏ&`ۇ(  =2-ہ(  (>Ӈ$(ۇG կ2-ɯӆz%ۄ ۅ1( >Ӆ>1ӄ>pӇ>ӆ&ۇw&ۇ/@&$&$&$J*o##"2~ğ~ ::!""*"s222>2>22~>22~w2( ~w*#<(:~w*FN66~ .` !V( *~  pq~_( O(G(*oX*qqpn f * *~G? q#p>2>!68͉8HͺͺͶ:c0 ( *#nˮ>2͉8>2*o##"!ͭ8:<: >2! !*n(#n(ͭ82c@ *#~!2c[sR:c : : <>(<!5<~ ҃:ƒ|Ã{ 2222s1:O!O F#N#fi! :lO*# ͋bC { 7ɯO& { % 7ɷO*q >_#>W2*N#~/ 2: &*: F(2  N(>2!6#6 :Oyʉ:gx0XDol( ˠͺ .ͺ %- oͶg}:c0|! 57!#57~ 0|>2͉:HĺX1>  .Hͺ - ͺ>>:082c>:O滱CRT !,% w#*A"-%*D"0%*F"2%>:,%oyV y[0%<H:.%@2D%*0%:.%_W2.%R͎:-%82<2-%*0%PzW"0%K2%B0 ):-%ȷ=2-%*0%PR:.% :-%(=2-%>P=2.%[0%>O2.%*0%O:.%Oҟ[0%<2.%*!/%y0(=(=(=(=(=(%=(0=(4~w~w~w~w`> y:/%2/%>@2D%*-%"5%:/% 2/%!/%y0(=(=(=(=(=(=(!=(0~w~w~w~w ~w*5%| 27%} 29%:/%2/%!M:9% G( P_:7% PO2.%{2-% [2%ý) >yx"A Q A YzW:/%cc6!|g!,%6 yRʤ E;!AG24%6 :4%B5Cʏy29%6 y27%:4%=*?" F"6 y2:%6y28%:4%L#D#(> ʎ ʢ(~$ʃ$ʷ$  %7>2,%:/% (6*2%P|gT] |g͎!P$*2%P|g"2% )*2%P|g"2% )*2%|g!P$xx|y}>xzy{>#zW|gx|y}>xzy{> x“Ý x x|y}>4 xzy{>#zW|g\ x|y}>t xzy{>++ x  ͎:-% [0%!P$ 0DO |gDMR|g[2%R0#!R|`G}iO 1*0%PýPYDM|W]*2% |gGMR0!R DM*0%͎*2%0|W]!P$:-% !*2%PR|g )*0%K2%B0!B|gK0% |GM! |GM*2%0|g!P|g͎*0%PB|g:.%O!PB$*0%:.%_R|W]*0%͎!PB$*2%PB|g"2%ý(*~$D*2%/P|W] |g! = DM *0%T]:.%O>PO |g͎:.%o&$~$>2;%>2;%:7% _:9% WzdG::{_>8(2=%{_*2%BKPY|W]S>%.#" >2<%:=%"[>%q#24%(:;%:4%[>%c#:<%/7:;%:4%c#:<%/$[>%q# #:;%( :=%/G:<%#+#3\+#!t#6ð :%I`!#: $: %H2z#i!#6!"%}2%*%+% ~ fiW?:%<:%:%H:%H:%­ ͋:% :#!# :%^> :#2#O> w:#!#?!w#6!#6!w#6:#2#!#&:#2#:#2#:#!#< ,V*%+% ~ P !%6:%ƒ> *%% ~2%O͟ !%6:% *%+% ~ HҬ ͟ - *%Mo ^w:%@Ow:% :z#/H- : % :% !#4 :% :#O>!#w-:% :% /!%6  w4!%6!#6pi:%O- !#6:~#!z#] ð O͸ u\Kð :%RRP"m2 %Ғ!v#6:v#: %ڬ P"r"!\"6!p"6#6P"!v#6Y2%-!v#6P"Kð Q͸ +#ͺ:t#/!s# #+#3+#ͺsð :%-&͂ !%6:%#7ͻ͂ t!T!:%:Q!%6L=!t:%:t͂ !=!:%t*%#"%Ҁ!%6:%B¡!%>w!"%*K""%ͅð :%C²Ͳͅð :%DͲ͋ð :%K͋ð :%L͑ð :%P !%6w  ͎ð :%T ð :%U6 :%2}#ð :%V… f %%!DMt/͟ *K"DMt  :%2~#} !#6 !#6ð :% ± :%: %HҮ ͑ð :%Hҭ :%A !%6*%"%*K""%ͅ   !%6ͅê :%F M \ ê :%J¤ Mx: %2 %xҡ \: %=2%:%<2%! %f *%&$ ~2%-E *%"%* %M* %~ ! %: %%!"%!%6ͅ*%DM͘4 ê :%M: %H !%6>%! L:%<2%O!%$ Hqy :%2 %!%6*%#s#rê :%Nf Mc * %` ͭ/ @̀ !%6!"%͇ͅ!%6K"%!]   ê :%S¶ Mxҳ \: %2%%!DM͘! %:%Ұ *%&$ ~2%!%4-Ï t ê :%W ê :%Xu 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:'%  !#6*'%M :#    !#55!(%q:(% :#O>H2)%yQ !(%6 !*%6:)%!*%n *(%M !*%4V !+%q:+% ~ >:+% :+% H:+% H!,%q*,%Mo ڻ ^+ :,%@2,%*,%M+  ͟  ͟ !.%p+q*-% !0%p+q */%DM !2%p+q *1%DM !4%p+q*3% !6%p+q*5%:! %6O!"$%@!8%p+q*7%!:%p+q*9%2#!<%p+q*;%2#!>%p+q*=%!@%p+q*?%!B%p+q*A%!#6# >>!D%p+q*C%!F%p+q*E%!K%r+s+p+q+q:G%=2G%+*H%*J% w*H%#"H%*J%#"J%!M%p+q###*L%gR !O%p+q*N%f!P%q*P%&-:u#Ҁ#^͵  !R%p+q*Q%DM s+#K͍:#ҹ#!T%p+qͬ*S%DM^!V%p+q*U%DMͺͬ*U%DM͑!X%p+q*W%DMͺͬ*W%2#!\%s+q+p+q:\%=2\%2*Y%:[%w*Y%#"Y%!`%r+s+p+q *]%*_%DM"͹!a%6:#!a%ڵ*N#*#DM\q2#ʤ>!#ґ͟*N#*#6:#2a%î*N#"N#!a%4`͹!"N#:s#>#N#!X*N#*#~2b%*N##"N#:b%:t#):s#)!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%4S!"P#!f%q#P#!,*P#*L#:f%w*P##"P#!g%q:#,Q:~"2":"2"r"́'$$!#6*#&" :g%w!#4:#2h%>!h%Y!h%4Dr"K!i%6 :i%=2i%ʐ*i%&r" *i%&P" ʍ>e>:"2~"r":"2"Qr"q:"2"!#6>!#*#&" ~!#4¾*P#},:s#\K+#K:#͟:x#+:5#25#ͬ+#:t#G\]#l3\+#]#;#3+#!k%p+q*j%*j%DM!l%q: %ʄ*l%M͟ !m%q:m%a/>z!m%/H!n%q*n%M͌ҹ:n%_:n%  # !o%6>!o%I Oͤ2p% *o%&# :p%w:p% I:p%:p%7:o%$:o%=2o%O!# 6 :p%Bs!o%4ͭ2p%!q%q:q%a!q%6:|#p*q%Mͤ:q%!s%p+q!'"v%!u%6>v%!*r%*v%~!{2t%*r%̀!"r%PY! ~!"v%:t%!u%!u%6:t%0O͟  ͟ Å!y%p+q:~#*x%DMt:͟  ͟ :z# ͟ *͟ *!$DM: %&*%& ~I:%<2%O! ~> >! %ҡͭ_! %:%ڍ>%!ʈ*%+"%>ͷ!ˆ!%6:%<2%=O!%$ NP:z#Ұ; OP:{#!{#6:#!~#K"%!*͟ ͡! $6 ͟ !#6!#: $2{#* $&# 6 : $<2 $=O!# NP:#B*Oͤ2%LLOͤ2%!{%p+q!~%6! %6!#6.:% ʏ:%ʏ *z%*z%#  :% ž.Ð͹y!|%6͹>!|%ҽÓ͡.ê:%::|%Ó*z%#~A<*z%wO>Ó*z%#6 .:%.)!|%6!#6.͹)> !|% Ó͡. :%;v*z% !|%6.͹d>!|%[Ó͡.H*z%DM#Þ>!}%҅Ó:~%ڏÓ:~% ! %6>:|%<2|%O*z% :%w!~%6!}%6>!}%*}%& :%> !}%  >!}%4¾>:#' ͡! $6!{#6 +#M9!t#6:,# 6,#]E+#\#4#:q"wRP"qr>!q"6:q"<2q"=O! NP!h6!j6!|6:#ҩcͬ\;"#:#c*#}|Hͽ ͬ\;"#*#}|H͍*#}2#:t#C:e&;͍C:fC:d>!#6C!x#6:#f:t#X͍!s#6M #+#3!7#6+#:#…͟:y#ʞ:y#27#ͬ+#,!7#6!K#6*#"N#!"P#!"!$!"%>%!!"%*%+"%>>!"#$:%*%#"%*%"%!"%+"%$*%"%*K""%!"%!%6:%Ҭ%%!2%*%v!"%% ~ He*%"%0*%+"%>ͷ!2%:%ڕ!%6%%!+s#ré*#$+"#$:%ҩ*%"%):%*%"%*%+"%*%#"%*%#"%*!$#"!$*!$+"!$*%#"%*%#"%*%+"%% ~ *%+"%!%q:%Y%%!V:%S*%% ~2% E*%% :%wÄ%%!҄:%ҁ*%% *% wYͅ!%p+q%%!ʱÞ:%*%"%%%!!"%%%!"%*%"%%I"!%!*K""%*%*%"%%%! OQ2%3*%% :%w:% M!%q:}#d*%MP:%K"%!x*%% ~2%O:% –hͻ%K"!M"!ڼÿhÝ!%6!"%*%"%͚ͅh%%!!%6ͅͻ:s#)2%)*%M%%!=*%% :%w:% VL2%:% :z#/HH/Wҥ:% ”!%6 ͦ!%6 :%Ÿͦx* %&$ :%w: %<2 %d!%s+q*%"%!%6:%/%K"!H8*%#"%"%:%2%*%&$ *%% !%:%2%/H5!%4*%#"%:%I*%+"%ͅ:%! %6x: %2 %* %l!%p+q*%DMM2%: %ڍ! %6O@ *% ~ :#/Hҷ *%#*%#~ *%##:%*#$*!$DM!z#6:%!"#$*%"%*%"%*%+% ~2% %:#" ,*#$#"#$*%"%%%!v:% Z*#$#"#$ͭZ*%% ~2%O͟ *%"%2*!%&"%*%"%*%"%̀w͑:%2%!%6w:%2%K"%!>%!H͇!%6>!%ͭ@>!!%4!%6!"%ͻ, M"%!& )  !%6 -!%6 -:#>%!H] @!|#6*%M͌2%*%MP2%:%/!}#+w!|#6L2%^ !%q!%:%:#H: %H!%q*%M͑  *%M V ; Oͤ2% :%N à:%Y > >:%02O"O> /!"%!))덑o|gҗ! =…!^#V) ¡!^#V|g}o «!_{ozgi`N#Fogo&og H !=! LIBX$$$$$$$LIBX$$$$$$$LIB$$$BAK~):.2]0ʢ)r&\!~-N'*%F))Z&!"%*%B&%)¼))*)6# )G&*%*%#"%~!<-x&G:%7*$*x*7*x2*Ϳ'5*9**&*&w#"&!F)`&!"&*&%~ʅ*B&Œ*`*G&`*!S-x&ö,͟**>&*@&w#">&!F)l&!">&*@&&`*_!%~ ì COPYSYS v3.102 (c) 1983 Magnolia Microsystems$ Get System from what Drive (RETURN to quit) ? $ Getting System from file "d:filename.typ"...$ Insert disk in Drive @: and push RETURN (^C aborts) $ Put System to what Drive (RETURN to quit) ? $ PERMANENT ERROR reading drive @:$ PERMANENT ERROR writing drive @:, Disk will not be bootable.$read from$written to$ System Successfully $ drive @:$ Can't COPYSYS to destination drives's media format$ INVALID DRIVE for current system$ Source File INCOMPLETE$ System is too Large for Drive @:$ Must run under CP/M 2 or 3$ 'S' option and command line mode changes not allowed together$ Bad command line option$ Wrong boot loader for destination drive$ Wrong boot loader for physical drive number specified$ Wrong version boot loader-COPYSYS can not reconfigure for destination drive $ No Directory Space$ Disk Full$ Verify-Read Error$ Verify Error$ File renaming error$ Boot loader has been reconfigured to $sd$dd$ss$ds$st$dt$ "d:filename.typ" not Found$ "d:filename.typ" Copied Sucessfully to drive d:$-C:lf@2Zx:m x2Z:\ʁ@2Y:] ʓ>2Y7ɯ!:O>[![͕VS 9͕ V_+OD T SVD 1͕OD T SN_ONd͕VC OE OS ͕ʭ! Ð !N0V:V0G͕ʌ0V:V0OxGx2\O~#,](7!0 1n!  } ڣ! 0! @ң  ]͕:Y–>C2e>O2f>M2g!\!g \<"!\! Ð !"|\#*}Bne*KB )L!ne>A2M! Ð "}!\!*}#"} xq:Yº!5 ʐ ʐ AQ2MO!G=ͤ  Ý:Y!  2A2<0 !b *[R)|2A:Z4! ʐ ʐ AJQJ2LO!O{ =ͤ P *?^ Fx!mkbme:AO|}ҍ!  ! Ð ) ͞ I ͦ $ :Z´!  !<60 !l :Z ! Ý!" ^#V#zy~#= A~#   ~#    :[O W! :[g(!! >, :[w(!! :[>, :[o(!! !=ʇ ) ]T%>ͤ T ã ÿ Ú __*. C S " 2  2*?:D a :D2Na f„#v nʄ:[OWv- ˧^8 ˯V(˿+nN ˷2[*.p~#fo~( :[ 2[###~„^„V„:[OW~pG+~(:[2[!"B*?~#NG!ʼ )ô "B <:= O> Ϳ y2D| ^#fk"?_"?*.l~2D<: ! :[2[>2\:[_:D!ݖ@ ݾ! Ð :[OT W:r :r :[r !Ô !!~ ʎ ###y nf:[p_~2:\!ݖڼ ݾ ! Ð :\2! a{__> > !w  # ~$ # > Û > Û > Û > Û >Û !"=*?^ Fx!S kbS K :A] o&͡ 2:<2;::O :;O *=MD :<ʒ ) Õ $ *=[B"=z !;4~t 6!:4k :<$ 7:[G!["G*.[GR}|o>g"I! :Y!  ͜:M@2!6$#6$#6$#͜:L@22Kiy*G"E*I[E!"E§+| *I| *G"E$[E!"E‚+| n*G"E!‹*En‘# "E+| :Ke ! !& +6$+6$+6$2%ʗ!:L2D! !! !_ Ð (!u!!!6T]ɯ/2K[IRÔ !.CCP COMCPM3 SYS??????????? !>))덑o|gҗ! =…!^#V) ¡!^#V|g}o «!_{ozgi`N#Fogo&og H !=! LIBX$$$$$$$LIBDUMP VERSION 3.0 DUMP.COM COPYRIGHT 1982, DIGITAL RESEARCH151282654321Ҋ ҏ>.Ï_ Ҧ0Ï7Ï͜Ü\2|::Iͺ>2 :2f>2>û>!6 #=!~a1{1 w##:Ƃ2*6 2fl:<2!G\:>2 *|ͫ}*ͫ>:Ï:> ͏> Ï> Ï:_:<2>2ͺ >Ï*}o|*!""ͮͷ͇*"͛~ͫ#*}#"%"*̀*}K|K*ͺ-m121=2#\:}mͺ2>o:  /\ͺ 1gn~ͻ͙D.:ܰg+":>2 CP/M 3 DUMP - Version 3.0$ ERROR: File Not Found $ Enter Password: $ Password Error$ ERROR: No Records Exist$ Press RETURN to continue $,:<%G:=%[>%8#:;%( :=%G:<%:=%/G:<%zWD#zWD#V# >yxO#A Q A Y{#D#{#2#!|g{ _z W0D2;%>2;%[9%͇#S9%2B%[7%͇#S7%2C%W:B%_͗#:9%W::%>8>2@%:7%_:8%>8>2A%:B%O:C%DM!8(.#:8%:A%_ 0:@%W#::%:@%W 0:A%_#::%:@%W:A%_ͧ$M:/%  :-%0DGP!ͧ$ )!P[0%:.%OGB%:/%2/%[0%! (!$xzWy{>$> $xzy{>%+| ɯ2.%2-%*2%ýKEYBD !~~0_W~@G+~悳_##N >yAyQ͠%ʁ%ְ!wgNO ~ɯʹ%(y>DCE DTE MODEM xO_P!%! %+~~0_W~@G+~悳_##N >yAyQNˑV~ 0=y?&(Nx%N yxy\&(Ny%N++ >yx+8 xɯLPT >͜&(y@@$R_$_$U $ [?  (   @(@?  (   ;@(@   @   ;@P P (?(?( $I$I$I$H@HUUUUR$D@@URI I!$@!IBHD  %P@ $BIT A !!$@JJBI*  @ "DHI$I$HHHD@@H$$A@ "I$  H$@@"A "I"$ @@B@ BA"! $ B$ I* H@ @  B @*P A  $II@"H@$@@ @@ HH@HB HDHH$$@ @$H@ @B  ABH$DD"@H  B! H@ B! @D  @!!B H@@  @@@"D@@ $$D @H$  H@H$D B@ D @   "DH$@B @ HD@I!@@͠%ʁ%ְ!wgNO ~ɯʹ%(y>DCE DTE MODEM xO_P!%! %+~~0_W~@G+~悳_##N >yAyQNˑV~ 0=y?&(Nx%N yxy\&(Ny%N++ >yx+8 xɯLPT >͜&(y@@$R_$_$U $ [? @ COPYRIGHT (C) 1978, DIGITAL RESEARCH ERROR: $, LOAD ADDRESS $DISK READ$INVERTED LOAD ADDRESS$DISK WRITE$LOAD ADDRESS $ERROR ADDRESS $BYTES READ:$INVALID HEX DIGIT$CHECK SUM ERROR $FIRST ADDRESS $LAST ADDRESS $BYTES READ $RECORDS WRITTEN $HEXCANNOT OPEN SOURCE$COMNO MORE DIRECTORY SPACE$CANNOT CLOSE FILE$*!9"!e !" !" \!""͊: ƒde"\\\͊: ²d\͝: )d;! q* &f  ! q> ! : A O: 0O! q: O: O! p+q* |O* }O! p+q*  f! p+q* DMB! p+q)R* DMB1B* DM+;! p+q* i2 ! p+q* i2 ! p+q* i2 i2 !" p+q*! f!$ p+q*# i!& p+q*% i!( p+q*' i2 !* p+q*) f!/ s+p+q+p+q:/ =2/ X*+ *- w*+ #"+ *- #"- 1* #" ͖r*   ~!" ! ͸×* " x20 º*   DM":0 Ad*   6!" Ç!" : !"6 "8 ": }2< !"4 "= ! 6Y: !2 6=21 á:1 : r+s#r==_HL"4 " >6 ͪS* "6 =23 :1 =21 v=O* #" Y8  ͝҉* +"8 .!2 ʞR̀* "4 4 = ͝* #" çR*6 DM+R*8 DM+R*: DM+R*< M!? q=  ͝Kd*= ! ͸p!@ 6>!@ X*= }O!< *@ & w*= #"= !@ 4)!< 4\mad* }O!< :? wlR*4 DM+{R* DM+R 4 ͝*4 }¿= 4 ͝< N*4 #"4  å;*4 DM+: Y2A 0O> :A 0:A AO>&R̀:A A H.2B !2 w:B !D s+q*C &͍:D _og_{ozg^#V) _{ozgi`N#Fogo&og_{_z#Wq=  ͝Kd*= ! ͸p!@ 6>!@ X*= }O!< *@ & w*= #"= !@ 4)!< 4\mad* }O!< :? wlR*4 DM+{R* DM+R 4 ͝*4 }¿= 4 ͝< N*4 #"4  å;*4 DM+: Y2 01C2 0E00 MVI C,0 01C4 2A9F02 LHLD BNKEND 01C7 2B DCX H 01C8 3A9902 LDA TOPBNK 01CB 57 MOV D,A 01CC 1E00 MVI E,0 01CE 1B DCX D LDDR 01CF+EDB8 DB 0EDH,0B8H NOBNK0: 01D1 2A9B02 LHLD CSTART 01D4 E9 PCHL LOADF: ;ORA A ;DE = TOP ADDRESS (MAX+1) ;MOV D,A ;MVI E,0 01D5 7C MOV A,H 01D6 17 RAL 01D7 67 MOV H,A 01D8 EB READ0: XCHG 01D9 0180FF LXI B,-128 01DC 09 DAD B 01DD EB XCHG 01DE D5 PUSH D 01DF E5 PUSH H 01E0 CDED01 CALL DMASET 01E3 CDF301 CALL READFILE 01E6 E1 POP H 01E7 D1 POP D 01E8 25 DCR H 01E9 C2D801 JNZ READ0 01EC C9 RET 01ED 0E1A DMASET: MVI C,SDMA 01EF CD0500 CALL BDOS 01F2 C9 RET READFILE: 01F3 0E14 MVI C,READ 01F5 112D02 LXI D,CPM3$SYS 01F8 CD0500 CALL BDOS 01FB B7 ORA A 01FC 117502 LXI D,RDERR 01FF C8 RZ 0200 0E09 ERRMSG: MVI C,MSGOUT 0202 CD0500 CALL BDOS 0205 C30000 JMP CPM CHKUNI: 0208 21F8FF LXI H,0FFF8H 020B 7E MOV A,M 020C 23 INX H 020D FE32 CPI '2' 020F C0 RNZ 0210 7E MOV A,M 0211 23 INX H 0212 FE2E CPI '.' 0214 C0 RNZ 0215 7E MOV A,M 0216 23 INX H 0217 FE30 CPI '0' 0219 C0 RNZ 021A 7E MOV A,M 021B 23 INX H 021C FE31 CPI '1' 021E C9 RET ; HL = PROSPECTIVE LOCATION CHKSIG: 021F 11A102 LXI D,SIGNATURE 0222 060F MVI B,SIGLEN 0224 1A CHK0: LDAX D 0225 BE CMP M 0226 C0 RNZ 0227 23 INX H 0228 13 INX D DJNZ CHK0 0229+10F9 DB 10H,CHK0-$-1 022B AF XRA A 022C C9 RET CPM3$SYS: 022D 0043504D33 DB 0,'CPM3 SYS',0,0,0,0 023D 0000000000 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 024D 00000000 DB 0,0,0,0 0251 0D0A657272NOFILE: DB CR,LF,'error: File not found: CPM3.SYS',CR,LF,'$' 0275 0D0A657272RDERR: DB CR,LF,'error: Read failure: CPM3.SYS',CR,LF,'$' 0297 00 TOPRES: DB 0 0298 00 RESLEN: DB 0 0299 00 TOPBNK: DB 0 029A 00 BNKLEN: DB 0 029B 0000 CSTART: DW 0 029D 0000 RESEND: DW 0 029F 0000 BNKEND: DW 0 SIGNATURE: 02A1 DB14 IN 014H RES 7,A 02A3+CBBF DB 0CBH,7*8+A+80H 02A5 D314 OUT 014H LDIR 02A7+EDB0 DB 0EDH,0B0H 02A9 DB14 IN 014H SETB 7,A 02AB+CBFF DB 0CBH,7*8+A+0C0H 02AD D314 OUT 014H 02AF C9 RET 000F = SIGLEN EQU $-SIGNATURE 02B0 0D0A07556EBADROM: DB CR,LF,7,'Unknown ROM version!',CR,LF,'$' 02CA 0D0A476F74ROMMSG: DB CR,LF,'Got ROM id ' 02D7 2E0D0A24 ROMID DB '.',CR,LF,'$' 02DB 0000 ROMCRT DW 0 02DD BUFFER: DS 0 02DD END 654321$Nwy!"(9"f1f! Ҕ2! ~#foCOPYRIGHT (C) 1982, DIGITAL RESEARCH 151282KK{<<ʽ<K : >! ~6 69BK! OS}!,"**NK6 :+OK2$^#V#N#FxNp:$p:Gjxj Y# A>QFQx>QGQx3ڰbڼqҼo5p5"""*!yb! ~G*!NKկ2!*$K*"x!*!@$@hK\K:K ~#~ w*NK*NK^#V#N#F!",!."*K6*}ʴ}<ʴ.}o|g "($Kt>=2(*f*(}DɯQ"(>QKQKQ>Q"%Q!2*%DM**ѵ+)) H~#+}#<:<ʲ<77:<ʢ2~77ø~7"9:OG#Q{ozg# ""BBÃà à ÃÃ1j$|@ "H$UUT$$ $I D$BA@! B$$A IA $!"  @$@$BI!!@""$DA  $I$@!֎ %`U hXdXx xy` vK J"xK2LF 4MCa b`eC@( pD@ \K"HDA, ! ++?9K2FNGiA;O. FMT8 FMT9 FMT10 FMT11 FMT12 FMT13 FMT14 Q1q . 0#^#V#N#F## O>w#O>pw!r#######~ !r=KAYPRO KAYPROX MMS Z37 Z37X Z100 EPSON ASSOC?ÃãÄÜÇ{;KAYPRO Parallel Printer v3.100c$23! ;N#F#~_#~pW~# ~(<#~#总 6~pO Keyboard handler v3.100e$4?4\PKAYPRO Z80-SIO handler v3.100e$ 4 (4(4 vv8>:2f>Q{b""%B^KAYPRO CRT driver v3.100g$MàÁôë{EܝKAYPRX:>2:Q!f~62*s{Yvvv:.>(>2$:Q*s Q)!lr/VF5mKAYPRO Floppy Disk Controller 3.100c$PXPXP COM02?b˼KAYPRO Winchester Disk Interface 3.100a$De?S[úx2(:((?:A2( KAYPRO CP/M 3.100u (c) 1985 DRI and DRM $ No CCP$CCP $> | (***$> ( | G({.x:A( s.1._>#Wo>g2AG>Y!! ^#VA**$J>| **9(>M*** @>y$A{CM^#V#zy8#0#!nodev nodev nodev nodev nodev nodev nodev nodev MsC1C!4!~#|~(5 #~#fo~ +6####>*}D0000000000000000001R*SmwrXZ#]bg~ÃÜrÒ/×ï) n×AQ@Ã1Oj$|Ãà à ÃBB+"}{_}o>2~77ø~7"9:OG#Q{ozg# ""!2*%DM**ѵ+)) H~#+}#<:<ʲ<77:<ʢ=2(*f*(}DɯQ"(>QKQKQ>Q"%Q!*$K*"x!*!@$@hK\K:K ~#~ w*NK*NK^#V#N#F!x>QGQx3ڰbڼqҼo5p5"""*!yb! ~G*!NKկ2}!,"**NK6 :+OK2$^#V#N#FxNp:$p:Gjxj Y# A>QFQKK{<<ʽ! ~6 69BK! OS654321$Nwy!"(9"f1f! Ҕ2! ~#foCOPYRIGHT (C) 1982, DIGITAL RESEARCH 151282Kj P (?(?( $I$I$I$H@HUUUUR$D  ;@(@   @   ;@P (   @(@?  (  >͜(y@@$R_$_$U $ [? ~@G+~悳_##N >yAyQNˑV~ 0=y?(NxN yxy\(NyN++ >yx+8 xɯLPT ͠ʁְ!wgNO ~ɯʹ(y>DCE DTE MODEM xO_P!! +~~0_Wzy{>ܯ+| ɯ2.2-*2ýKEYBD !~~0_W~@G+~悳_##N >yAyQM:/  :-ܑ0DGP!ͧ )!P[0:.OGB:/2/[0! (!xzWy{>> xW:B_͗:9W::ܺ>8>2@:7_:8ܻ>8>2A:BO:CܹDM!8(.:8ܻ:A܃_ 0:@܂W::ܺ:@܂W 0:A܃_::ܺ:@܂W:A܃_ͧg{ _z W0D2;>2;[9͇S92B[7͇S72C:8:;ܷ( :=G:<ܰ:=/G:<ܠzWDzWDV >yxOA Q A Y{D{2!|KPY|W]S>.ڷ >2<:=ܷ[>q24(:;ܷ:4[>c:q #:;ܷ( :=/G:<ܠ|W] |g! = DM*0T]:.O>PO |g͎:.o&~>2;>2;:7 _:9 WzdG::{_>8(2={_*2B*20|g!P|g͎*0PB|g:.O!PB*0:._R|W]*0͎!PB*2PB|g"2ý(*~D*2/P|W]*2 |gGMR0!R DM*0͎*20|W]!P:- *2PR|g )*0K2ܷB0!B|gK0 |GM! |GMzy{>++ x͎:-ܷ[0!P 0DO |gDMR|g[2R0#!R|`G}iO1*0PýPYDM> x“Ýxx|y}>4xzy{>#zW|g\x|y}>tx|g!Pxx|y}>xzy{>#zW|gx|y}>xzy{ʃʷ  7>2,:/ (6*2P|gT] |g͎!P*2P|g"2 )*2P|g"2 )*2E;AG246 :4B5Cʏy296 y27:4=*? F6 y2:6y28:4LD(> ʎ ʢ(~ PO2.{2- [2ý) >yx"A Q A YzW:/cc6!|g!,6 yRʤ-"5:/ 2/!/y0(=(=(=(=(=(=(!=(0~w~w~w~w ~w*5| 27} 29:/2/!M:9 G( P_:72->P=2.[0>O2.*0O:.Oҟ[0<2.*!/y0(=(=(=(=(=(%=(0=(4~w~w~w~w`> y:/2/>@2D*:/ܱK>@2D*0:._W2.R͎:-82<2-*0PzW"0K2B0 ):-ȷ=2-*0PR:.ܷ :-ܷ(=!, w#*A"-*D"0*F"2>:,ܷoyV y[0  .Hͺ - ͺ>>:Ұ082c>:O滱CRT 6#6 :Oyʉ:gx0XDol( ˠͺ .ͺ %- oͶg}:c0|! 57!#57~ 0|>2͉:ҷ 7ɯO& { % 7ɷO*q >_#>W2*N#~/ 2:Ʒ &*:Ʒ F(2  N(>2!!O F#N#fi!:lO*# ͋bC {2c[sR:c :ҷ : <>(2͉8>2*o##"!ͭ8:<:ҷ >2!!*n(#n(ͭ82c@ *#~!G(*oX*qqpn f * *~G? q#p>2>!68͉8HͺͺͶ:c0 :ҷ~w*FN66~ .` !V( *~  pq~_( O(2~ğ~ :ҷ:ҷ!""*"s222>2>22~>22~w2( ~wϯ*#<(J*o##"( >Ӆ>1ӄ>pӇ>ӆ&ۇw&ۇ/@&$̤&$&$$(ۇG ɯ<& ˏ&`ۇ( =2-ہ(  (>Ӈ$(ۇG կ2-ɯӆz%ۄ ۅ1ӆ>Ӂ*:/3 }( }8o}ӄ|Ӆ:Ӄ>ӂ> 2.(H:.Ӈ$(>ۇG 8_(4>02.(%:.Ӈ&ۇ_  2-:P2/͔:-*o~G#~`G:9=A&$&$D=2>22ɯd(!7%F)U-1s5Å 2* "*""*o~ ###v(~!O N#fi{*m:?O!~O/q!>!ŷ!:ƆwK:ƹ! ~#fo#))MD*B8"* "!q#p#6^#V+*o~X7*qq#p N#fiC C"Cs:A2i`z n&+:Ʒ88:jO! [qs#r!:jO! ^#VSq*o~ #>(#~(>MOG#n( !C[q! N#F ! F?2!~#,&$y2j!A ~(k2kOC͗8a2l"m^#V#N#F:lo& "o@ AO :lO "q88)2>͵ŷ  A~$# w++~'w0#~'w+ GOxGd0d 0 !!!!! 2{Ͷ2:ͨW:ͨB(0 O= 0 :ͨ88O:ͨG ??OUD(0y xy(DGy<2> >$ !>g"::2:2:2*m>2x 7R0x >27ZxNd8dͶ2xͶ2!{Oz8 YW#x 8xͶ2 A$w#Y$  :!þܐ:2:2:2>2:ͨG:x(dNG2!m :ͨO :ͨ=(Go2!"*"!@)!@)!@)!~((#### y p#q#s#ro ͏v ʍ !O:2B ͏|>2z͏<2͏@,͏z͏|2y2fÇ|f*u|Ç:yG8!)>2 Gy ҳs#r#<GyOx!  N#fiOf”ïfM  *"*}"*"*"*"!x:|1!|G^>">"!}">">"!E"> $> >$>O#>#>J!!}#>!}!}!^#V#z~##ںO+~#!!>U(%!!\>3(!!t>2(  "2  -Q! :W!":ʗW*"*@::G*+:W:G*+:W*|g %-u !~#2~#.~#0~#1#CPM3 SYS error: File not found: CPM3.SYS $ error: Read failure: CPM3.SYS $˿ Unknown ROM version! $ Got ROM id . $ Z37 Z37X Z100 EPSON ASSOC FMT8 FMT9 FMT10 FMT11 FMT12 FMT13 FMT14 0QA1RN#F#~_#~pW~# ~(<#~#总 6~p 0#^#V#N#F## O>w#O>pw!r#######~ !r=KAYPRO KAYPROX MMSԊԦKAYPRO CRT driver v3.100g$ -&KAYPRO Parallel Printer v3.100c$23! vv8>:2f>Q{qNCk_AaKAYPROZ80-SIO handler v3.100c$0? 0?0? :>2:Q!f~62*s{Yvvv:.>(>2$:Q*s Q(!;>"ElKAYPRO Floppy Disk Controller 3.100b$PXPXPX COM/2ðø1̼~KAYPRO Winchester Disk Interface 3.100a$De?S[úx2(:((?:A2( KAYPRO CP/M 3.100u (c) 1985 DRI and DRM $ No CCP$CCP $> | (***$> ( | G({.x:A( s.1._>#Wo>g2AG>Y!! ^#VA**$J>| **9(>M*** @>y$A{CM^#V#zy8#0#!nodev nodev nodev nodev nodev nodev nodev nodev MsC1C!4!~#|~(5 #~#fo~ +6####>*}D0000000000000000001N*SmwrX69>CZ_ÜNÒ/×ï) J×@Ã1Oj$|Ãà à ÃBB+"}{_}o>2~77ø~7"9:OG#Q{ozg# ""!2*%DM**ѵ+)) H~#+}#<:<ʲ<77:<ʢØfp0v]0O/Vn>$iX i\+S9C2J8KEYBD RELLSERIAL $$$; System Control Block definitions public @civec,@covec,@aivec,@aovec,@lovec public @mxtpa,@ermde,@date,@hour,@min,@sec scb equ 0fb9ch @civec equ scb+22h @covec equ scb+24h @aivec equ scb+26h @aovec equ scb+28h @lovec equ scb+2ah @ermde equ scb+4bh @date equ scb+58h @hour equ scb+5ah @min equ scb+5bh @sec equ scb+5ch @mxtpa equ scb+62h end  @ermde KEYBD RELLSERIAL RELMSCB $$$!>U(%!!\>3(!!t>2(  "2  -Q! :W!":ʗW*"*@::G*+:W:G*+:W*|g %-u !~#2~#.~#0~#1#CPM3 SYS error: File not found: CPM3.SYS $ error: Read failure: CPM3.SYS $˿ Unknown ROM version! $ Got ROM id . $Рd4dT8 =Y@AIVECSՑPddT85aQA@ERMDEPU`TU(5%:@SECM@#y %Y9ՑP_y%Y9SՑPy1=Y9VcyI59PUcu!=UJ9RSqMp",!."*K6*}ʴ}<ʴ.}o|g "($Kt>=2(*f*(}DɯQ"(>QKQKQ>Q"%Q!*$K*"x!*!@$@hK\K:K ~#~ w*NK*NK^#V#N#F!x>QGQx3ڰbڼqҼo5p5"""*!yb! ~G*!NKկ2}!,"**NK6 :+OK2$^#V#N#FxNp:$p:Gjxj Y# A>QFQKK{<<ʽ! ~6 69BK! OS654321$Nwy!"(9"f1f! Ҕ2! ~#foCOPYRIGHT (C) 1982, DIGITAL RESEARCH 151282P P (?(?( $I$I$I$H@HUUUUR$   ;@(@   @   ;@9bڗ>2#×:#<ֻ2#*!""++"29Cw*{}<^#Vz!c!>c! Jw*q~69!͐=‡*":*}®:=::<>2*i^#V+ d!K*}@*)): K:) O "!w [O?WGzO:VxGyOGxwq*}}ʴ>2d:#Ͻ>29཯2~2#!   )xð*}*}"*x"xm*^#V* s#r**s#r*:ﺾY4Y̓**~#ng* s#r ^#V랠a##)0"xx!"""XC*~<μ*":!::9*"x"*"g*3:= :Oi :=H:Gi a6:G/O**W :T=ҍ aʚ~»6*:X)!:T>qkֻ!:6>X*{Q:_2{2Ē"͂"X~<»#cdfg!"()*N!r)!N!)z<*)"!":X*:w:w#:w*2*}D̓¡>2ͱԲ߱?~¾¾ʹƹ>w͙=2͜:wÚ~̓ʑpá!6NwͧBpͧȾÚgsr͐-͜ġͤS)_ͤ̓~?w͐s-?F͜pN͆p# Þ͐*6!¿?~p*6 >2ͱݲԲ߱ͷw*oq͋"@6Ⱦ͚Xͤ͋͗wO~<: g~w#w#6##)͋@ * g~?G++!o#~>T}! 6**#K"G*~ xr͐-xą@˯7(͚Sʀw: :<RHͥ:>~c!o#~E^#V)G#~#~!~ b k##N#F#^#V#~#fo~o2{2g*wޥʪҢÞ+}*#}o|g:O*s#r#w!~w/~@w//Hͥ*>=)_g:0"ök*w)*c)-}ͤÀk*s":;:r2͚΢ù͚΢¯͚}/_|/*W}_*c"}o|g"c>2{—>2—͇ͱ* «>2͙wBp+ҵ:w͚AP{ 2W>O2ø}R*):r͚΢c2ZT͐-ک3͗@YsY̓YײYͅ:߱Asҵ:@ҵ@ҵ$͚̓Aآ=:<~?¯kô?~?ʾZT͐ڴ*>o"͒"!ä:Oݦ"Ý}6͚ ~2Asv@NN~v$̓W+vw̚v$̓rrͅ:r߱>2+A@2r!Z2!"ög:2T͐-:ʹ>2<2ک!w: >2*6ݦݩO~<w:*)@ u:G*g`~!x_<_@*oy<:/G?~##~? 6K@?F6##N6ⲯ2p##q:#*~w>2*p@! ~*"v@*w# ) 6#̲͙N#FxT]## #~ ȷ  *4# ' 4! *~^ ^33G# Pv:dv6 y2@ !׺)#w*~"ұ!Fw䱨ұ̓ұ:w̚":>嵯2̓*~wć"̀!~$6:03i"!~6*>=)Q!QX@˯ >2 ˯!!q#p#w2wW*_3ҫ-!s:!xQ*:<œ. ʩ.ʩAܟrr##sܟ<}rcN! ~态O>G~G!~G~o>_yG~.|°! w:ck[!x?[! ~ʤ͆[͗PPvqO-á=.:<ʰ! Vq##~_@wںͶ:WMںʛ>úͶ >TJ:!ʷ͞x!Ǯw4 ϮPWޮPܟÂ՟Â*!!~~#~O~#FsO s#r:(„y==„*!^W*y^#Vx7=2wͼկw#KWK*"J T͞*:["+SX:ڜq:ʺ!ʵ>2ܟͤ2ѭO ̡DM͸}ޭ>r""2:2* :::29:>:>*ڈ>F6:_/G:ʧ:ڨ|OͤG:_O̡̡zW{¬|:*}|BKN¬ zyG:!vq:v՟vMڂ?Ͷ >T͓Â!">Â:G:O:h=27ryy/W!:l=:<>w##~2 4~?ɫ̓¹:<ɫɫüީAX2rK:w++~=wv4͗O5:2X!"*>o+"v *!b"ݦ": r#~?w#>r# L=J Lv wȾbܟ?~O ͆ګ†wŒ~è# # x ͗w ٪ڪ٪ڪw@ ~wb͐Úݤ!x>w~6:6~#+w#w+~;wɯ2KOFq-yl?Npg:ʓ~( ȾˆʀHÈ2xą ):@ΩO~#w͚ʀô̓b_++V@* )͗Os++r~Gw#* #~$%+@*9>  #>? ;*~ w-xąH"0 *ĊHEʀ@~›:6¦w͚̋ȾÇPY*{zBKNyʺ Nú2: *~w *" ݦ2>ʄ@~k:(s~*9~Ês~Բ~ͅ<G:<ާ2x# W:<­:22G?>Grx~:2Ô##~*$*">2̀2kºʺ**iҺ@:O~2~WW:2Ôyʛ?ʔx ʔ |̷ǧÔN:r:/GyOOA +¬ ¢y2:x¹o&:W>OͫE:ڟ?N/*"y2ͦ>2 ݦRXޥDM*w6# x *ow**ws#r̀*i6#6*}"j@*|<ď>!8>8> t>nͦv8 ~*ownT] KKͦޥ*w"wͦ"w@ :åNɥ N#Fyإ*}|h#ð*ͫ# 6*q@!"@**#":&2͒:È0:+Òy<_W`iͫDM*w ~bNpwޥDM*we ^#V#~2>â9͆>!"*y³*X*ÿ͂"*g*K!~<:wb##>w#wġ> r!~#22Zw*q>ww:c *#*is#r*:!:):O!*c:Oͫ}@2æ ~á*g:o$*~K6?~wKw**i{#zir+s{O:w:Ғ4~:w?r##rp# ä |g}oì*g #G ¾1*q:*w***> r 2":O:G2!w*~zWw+ !z?#~*!* *G!O~2~m͗O~t>2?:2g͝DM*0MD"!*MD$:Oë!N: «G>O: ¡ù*ġ :ڡn` ~#foͤ2O̡"}:O*"!s#r#p*kN#F*m^#V#F*:O}|y9*+"*}|yP#9**DM"*ks#r*ms#r#pyox*kw#w*mw#w#w>2'å2*OͶyڲò<*Ͳ:0!::ò2*>*ͫ"4#4#4)7 #  w#*J|^#V#"i##"k##"m###"o#"q##"!s )*s!)*|!6~67rrorFile Exists? in Filenameòò>2a.":2:<:55;:2ɯ22{_zW{_zW )7CP/M Error On : Disk I/OInvalid DriveRead/Only FileRead/Only DiskPassword E)"!z<~rs^#V#N#FxN:oʲ̀õ(# Þry< <<%zrͷr6r9rMDÌ:o!6!h: ʚnt2 r62>rz<*9ʌ^:—~x ):*:śś>*(+"(w++2+2+ɗpؗ!" >2+2*jx.#NzW::!2W!5=^x^z:m:*;#wO:͂^2¢ů͠Ě:!ڽ*(~ݘט5Wè՚ؗjטM2ͨxΚ*(+w"(j͖ !%"(^-:*$P:<\:W:2xM s:<9>2:*9x~+q’x2:**&~2+o#"&!+6Mř:W:2x ͺ*(+"(w  :ܙ>2*2:*(:+w"(ͺ:G::+̜2 5*(~o#"(Mš*(~`Uoj*(~#"(Ñ!*~6s!+6:+‚xoڊ{2Ó#w:2.+:.2-!%"(2*!"&!*~4:2-Ԃ:Gͳͨ^2+>2:2*N#G2 2GH)+6:2,:!- ͖:,!͖+*(~L#Bxz:*:*(~ʓOr ͖ ͖! O(Ì*(~2**}ʷ!#¶!""÷:_:*(#wΗxH!)6"&:! x5~y 5 6y(^͖@O:=7:͖y ͖:I ͖:=e: zz#͖͂:! ͖ G:Ҏ>xʝʝw>ɯw̩z:»!>wɯ:=zxzz::G:=/ͽx:Āy!4 šn!6@G:x: P:<: P n6 t6! ^6 t6u:)<͠^!Ó*"r*r"ÿ<:g:!͐*f}D! ~6t!rͷ֕O(^ƕƕƕ  :Function = File = !,$"h!9"f! ͉:2t™:!=Hgo:O*;*͂:A2=/::0! dگ61#d ڸïp#:w#6 !6:6 *#!)6.#)͂ O(BDOS > wM  2*7w#6?#7 .,:;[]=<>|!?]45#Ra{i_p# l s s l ls:¬MAGET FILE XINPUT A>MYPROG Tells the system to activate the GET utility. Since SYSTEM is not specified, the system reads the next input line from the console and executes MYPROG. If MYPROG program requires console input, it isNCopyright (C) 1982, Digital Research BNKBIOS3 SPR F700 0900 BNKBIOS3 SPR C000 2000 RESBDOS3 SPR F100 0600 BNKBDOS3 SPR 9200 2E00 60K TPA $$$$$XXìӽ#4 E V g x@UW EPSON ASSOC FMT8 FMT9 FMT10 FMT11 FMT12 FMT13 FMT14 5QF1Wqhy~(<#~#总 6~p 0#^#V#N#F## O>w#O>pw!r#######~ !r=KAYPRO KAYPROX MMS Z37 Z37X Z100100e$ 4 (4(4 P2+* LKAYPRO Parallel Printer v3.100c$23! LN#F#~_#~pW~# C:݌ܮKAYPRO Keyboard handler v3.100e$4|OKAYPRO Z80-SIO handler v3.vvv vv8>:2f>Q{sÑñîñôSoKAYPRO CRT driver v3.100g$/PXPXPX:>2:Q!f~62*s{YDe:?>(>25:Q*s Q:!þW~KAYPRO Floppy Disk Controller 3.100d$ COMA2ü/ù˼KAYPRO Winchester Disk Interface 3.100d$De?S[úx2(:((?:A2( KAYPRO CP/M 3.101b (c) 1985 DRI and DRM $ No CCP$CCP $> | (***$> ( | G({.x:A( s.1._>#Wo>g2AG>Y!! ^#VA**$J>| **9(>M*** @>y$A{CM^#V#zy8#0#!nodev nodev nodev nodev nodev nodev nodev nodev MsC1C!4!~#|~(5 #~#fo~ +6####>*}D0000000000000000001R*SmwrX8#;@E\aÜPÒ/×ï) L×Rb@Ã1Oj$|Ãà à ÃBB+"}{_}o>2~77ø~7"9:OG#Q{ozg# ""!2*%DM**ѵ+)) H~#+}#<:<ʲ<77:<ʢ=2(*f*(}DɯQ"(>QKQKQ>Q"%Q!*$K*"x!*!@$@hK\K:K ~#~ w*NK*NK^#V#N#F!x>QGQx3ڰbڼqҼo5p5"""*!yb! ~G*!NKկ2}!,"**NK6 :+OK2$^#V#N#FxNp:$p:Gjxj Y# A>QFQKK{<<ʽ! ~6 69BK! OS$Nwy!"(9"f1f! Ҕ2! ~#foCOPYRIGHT (C) 1982, DIGITAL RESEARCH 151282LOADER y; !91""|0!~ʞz=_: _* ""*og*%|}D S#N#F:ʒ#4ʝ^#V{‚:¿*.~w*DM!&_*.& >k s#rr+6.""1*D`.45. F.~. ^#Vx>`. s#rz 6#N#fi%$g1:=<@v_}v=p{_3;{<g"T=X3*j ~P#~R#~L{gbk#N#Fk$&Zcx {~#o}o1!;!"Ï:= w*wWx ~#&*.~s*"ѷ\ Cannot load Program 221282 COPYR '82 DRI <bHA$@DH   A@!" $$@X X X S 1-! j 1".~2.~2 :Xck*kͮ  b < .~=>$.w.6#w.6#w.61.~  .~~w@.p T~º>+~.~~! yͮ Ë.~~w2g !PROFILE.S !+2 !  +~d {   O! w+w+: =w! 5 c ʋ  :p  m>> ͧ  N Ĩ –.~+w.~2  9 : ! ~##~ !7 : !Կ : x*l " !ZXچ! 6  zz: 6 : %2p  ͆ : =̀ 2r  DIR TYPE ERASE RENAME DIRSYS USER u"Q}:\=p:r Aæ R ÂN ͙ʸ} !M 545 x ]  ̵ 6 : oG! ~怹>2M  xf>:ͦ ͤ ͍ ͤ f ¹2 lf   ͫR  L͞L I *  *  A }_Yl !ͮ ͒6 \&đ %* "l ͍  ûȷ45: w ? A I N   SUBMIT COM ! ͮ ! 6 #"l  !cͿ  O!:r :ͦ ͍ !~B I !pͰ ^#VCOM SUB PRL y!cͰ  î !" * %.2P#ͮ !g 4*l +"l ͷ 2 "Qx2Sl "Tx2V!q ~ :p ͆ .ڶ2* og$2| .w#w#w#w.~ .w#w~?w; ; ! ~#49 w#~$ A  < > _I  ! 6 ! ~#Ͱ 6 m   _  ! 6=  { *.pѯ:r x , \<=!Ͱ =ɯ2 \s 2 ! D ;! : .44 #4"l ~[* 2 a7 {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# !( | !( : x. +"l ! ͮ   ͮ ~!G8 * ~;#1 կA *l ~:g #I ѯ*l  *l ~0څ :҅ q X x<Ü AX QX X ~@#~:k #^ *jT~# ® wy#ù ! 4 : !Ͱ ~@*h~ yw y/w*hw*h~I E> ͦ > æ % 0  < : ~ȹͦ #* A !g ~6*  * >? A *l " ~0: :: q "l x~0 xG#Gs : &͘ ͤ &ͦ %˜ >  Ʌo$>?· !  > # ͮ x> # ~ Enter User #: $No File$ required$ERASE $ (Y/N)? $ Press RETURN to Continue $ (User 0)$NON-SYSTEM FILE(S) EXIST$: $$$ SUB<Ü AX QX X ~@#~:k #^ *jT~# ® wy#ù ! 4 : !Ͱ ~@*h~ yw y/w*hw*h~I E> ͦ > æ % 0  < : ~ȹͦ #* A !g ~6*  * >? A *l " ~0: :: q "l x~0 xG#Gs : &͘ ͤ &ͦ %˜ >  Ʌo$>?· !  > # ͮ x> # ~ Enter User #: copyright(c) 1977, digital research $Error On Line $SUBNo 'SUB' File Present$Disk Write Error$Command Buffer Overflow$Command Too Long$Parameter Error$Invalid Control Character$Directory Full$Cannot Close, Read/Only?$!9"!͇͊!p+q* ͊!p+q*͍2!p+q*͍2!p+q*͊!p+q*͍!p+q*͍!p+q*͍2!s+p+q+p+q:=2ʦ** w*#"*#"!p+q(+*DM*p*& 6:ep\:=ͧ!t6>!t%\= >!t6:t<2t=O! ~2u b:<2O>9b!60+~9b!60+4:uat:u_2u:uMʉSͧ!v6!"v!|6:|Ҁ!x6 2}:} Hk:} h:}$6 2}$*}M3:}02}O> ͧ3!z6ͭ:}"!}5́ͭ́3*yM"h:}^a A2}O>Vͧ^:}>*z& ~ !z4í!{q*v#"v͙dͧ*vv :{w:x<2xO>}|ͧ-!6]:ͧz2~e:~2O! 6*~& 6$>!~_z*~& w!~5Bx:yͧ*v+"vv ~_{ozg001 $$$$ SUB6ͭ:}"!}5́ͭ́3*yM"h:}^a A2}O>Vͧ^:}>*z& ~ !z4í!{q*v#"v͙dͧ*vv :{w:x<2xO>}|ͧASUB 1xCP/M Version 3.0COPYRIGHT 1982, DIGITAL RESEARCH151282654321Invalid file name $Error On Line $Enter Password: $ERROR: No 'SUB' File Found$CP/M 3 SUBMIT Version 3.0 $Enter File to SUBMIT: $SUBDisk Write Error$Random Read $.$Invalid ASCII Character$Parameter Error$ERROR: Directory Full$Requires CP/M 3.0 $11G"*}0|HҤbP2IK 1">d*++"~"!\. v!q*&!p+q* !s+p+q*:w#6* *#"N#Fy !p+q*!p+q*2 !p+q*!p+q*!p+q*!p+q*!!p+q*2 !p+q*!q*-!q:2!61!s+q:2!6*&"1!p+q*<!s+p+q+p+q:=2d** w*#"*#"=  !s+q+p+q:=2ʩ*:w*#"Ì!p+qe*DM!\.\s!q:a:{: :O2:eel !6>!ڜ2 K*&l :w: T:_:…:r:=2O!l 6 3:•!4**& ~ ~ H!4Ýl :S*Q*Sl.l\P"*}=*|&el\P"=*|5.*& 6!6͝*& ~( 2*& 6e!"!\" "\p.e.:\2O>:2\*& ~ ~H~ H.!4͝*& ~2!6>!`\̓[>!6:<2=O! ~2 ½:<2O>9ҽ!60+~9ҽ!60+~9ҽ!60+~9ҽ!60+4:͓ͪ!"!6:= !6!6#6D2: H% : " :#$ͪ:;!6+~<;!6:$¨D2$X*M å:02O> p<ͪå!6͝:ʔ!5K ҎÄ͝xK ҥ*M Ô" :^D2:^^ :@: O :`:@O :`O " :!:/H     " *M : 2    *++" *& ~2 :Ht !4>>!""\ !6>!ڷ :+ ~° !4‘ * DM*"À * DM!" }2 ͣ2 :  ͪõ!q!r- "w * :w:C w *#" "*#~22_! 8!0!s*&:0!s!6ͳ:  sͳ:  L!`i^#V#~#fo yo w G: xAo o a{ _o     `i~< #~2#~2#~2*| W \!\~R 2 .n~ >2 6!.t~: +  >2 6!N#F#*" ^q#Vp" N#F##"^q#Vp" 4! 7o |  ! 6   \\ ? >_ 1m :~# yo ɍWARNING: Cannot redirect from BIOS $ERROR: Auxiliary device redirection not implemented $ERROR: Insufficient Memory $""SYSIN SUB_ogDM!>))덑o|gQ =?i`N#Fogo&og_{_z#W00001 : $SYSIN $$$FGET :<***.n6.t6 LL!p:~y !6 <ʊ~"x!=F#fh!:~!«!>w~:!5*.~w:; :~!9"1A#u.t.~@w :&/3͖!~6 :~wucy! ʎB d{<ʑ  '*2.2+6.w 22*2$*.6#6*.~w#~=~#4Ʌo$͖O̓!54  !F6#ȷxO҃>^̓@_: N#͖§>  *.>wÔ#wt~xڔp> ̓ 8>""SYSIN SUB hhhhhhhhhhhhhhWARNING: PROGRAM INPUT IGNORED $ 151282 COPYR '82 DRI gggggggggggggggggggggggggggggg"D! BH!H@ $!!$"A! D$DHH$B!"  @A  SYSIN SUB hhhhhhhhhhhhhhWARNING: PROGRAM INPUT IGNORED $@P P (?(?( $I$I$I$H@HUUUUR$(   ;@(@   @   ;?  (   @(@?  xɯLPT >+(y@@$R_$_$U $ [~~0_W~@G+~悳_##N >yAyQNˑV~ 0=y(NxgN yxy(NygN++ >yx+8 yAyQ/ְ!wgNO ~ɯC(y>DCE DTE MODEM xO_P!U! g+> xzy{>ܯ+| ɯ22*LKEYBD !~~0_W~@G+~悳_##N >:܂W:܃_6M:  :ܑ0DGP!6 )!P[:OGBͭ:2[! (!bxzWy{>{[S2W:_&:W:ܺ>8>2:_:ܻ>8>2:O:ܹDM!8(.\:ܻ:܃_ 0:܂W\:ܺ:܂W 0:܃_\:ܺ !8|g{ _z W0D2>2[S2ܷ( :/G:ܠ:G:ܰ[:ܷ( :G:ܰ:/G:ܠzWzW >yxA Q A Y ɇ2{_*BKPY|W]Sͽڷ2 >2:ܷt[2(:ܷ:[:/7:ܷ::/$[ #: D*/P|W] |g! = DM͢*T]:O>PO |g:o&_ >2>2: _: WzdG::{_>8( |GM! |GM*0|g!P|g*PB|g:O!PB_*:_R|W]*!PB_*PB|g"L(*ҿPLPYDM|W]* |gGMR0!R DM**0|W]!P_: {*PR|g ͸*KܷB0!B|gKxzy{>++ x§,:ܷ|[!P_ 0DO |gDMR|g[R0#!R|`G}iO͢*xzy{> x",xx|y}>xzy{>#zW|gx|y}>g" ͸*|g!P_x#x|y}><xzy{>#zW|gbx|y}>z 1( F ʮ hʭ>2: (6*P|gT] |g!P_*P|g" ø*P|6 yR3EAG26 :BCy26 y2:=t* 6 y26y2:LfDm(> P_: PO2{2 [L͸ >yxA Q A YͦzWͦ:ͦ!|g!:2>@2*": 2!y0(=(=(=(=(=(=(!=(0~w~w~w~w ~w*| 2} 2t:2!M: G(ܷ :ܷ(=2>P=2[>O2*O:O.[<2ù!y0(=(=(=(=(=(%=(0=(4~w~w~w~w`> y/[:O:ܱ>@2*:_W2R:8<2*PzW"KB0 ø:ȷ=2*PR:CRT ! w#*A"*D"*F">:ܷy }y[:2y:ӷHIX1>  .HI - I>>:yӰ082c>:O滱 N(>2!{6#6 g:Oy:gx0XDol( ˠI .I %- oEg}:c0|!{ 57!{#57~ 0  bC { 7ɯO& { % 7ɷO*q >_#>W2*}N#~/ 2͡:ŷ &*}:ŷ F(2 gs1:O!`O F#N#fi!:lO*}# *}#~!ņl2c[sR:c :ӷ : <>(!z5~ :ӷ aр { 222 2IE:c0 ( *}#nʩˮ>28>2z*o##"}Ͱ<8:<:ӷ >2!Ͱ*}n(#n(<82c@O(G(*oic*qqpn f *~ *~~G?] q#p>2!6͡88HI*~#<(:ӷh~wc*~FN66~ .` !V( *~~  pqh~_( *o##"}ӯ2~.~ :ӷq:ӷ!""*~"s222>2>2z~~c>2z2~w( ~wcЯ>1ӄ>pӇ>ӆ&ۇwj&ۇ/j̺:z͂(ۇG ɯ<&j ˏ&`ۇ( j =2>ہ( d͎ ͎(>Ӈ͞(ۇG կ2>:ӆz%ۄ ۅ1( >Ӆ }8o<:@U [} xʨ}ӄ|Ӆ:Ӄ>ӂ> 2?V(H:?Ӈ͞(>ۇG 8_(4>02?V(%:?Ӈ&ۇ_ j ͞Ӈ͞4.ۀ x !ۀ *"*" :>:@U>*o~<<_!~#fo"ʯ*o#F:ӆ͎>Ӂ*:@3 }(ů2>:P2@:@U!"":ӆ͎4̯ӄӅ<ӂ>Ӄ> B!%$)3-1Q5`9o=A~!O N#fi{*mžŸũ:?O!~O/ͩq!>!;ŷ!:ņwK:ŹD=2>22ɯ~i7*qq#p N#fi*B"*s#r#6 "CCCs:A2i`z n&+c 2*"*"*o~ ###v(:ŷ8:jO! [qs#r!:jO! ^#VSq*o~ #>(#~(>MOG#n( !C[q! N#F ! F?2^#V+ɷ*oy2j!R ~(k2kOC͗8a2l"m^#V#N#F:lo& "o@ AO :lO "q8)2>͓ŷ  A~$# w++~'w0#~'w+ GOxGd0d 0 !!!!! 2{Ͷ2:ͨW:ͨB(0 O= 0 :ͨ88O:ͨG ??OUD(0y xy(DGy<2> >$ !>g"::2:2:2*m>2x 7R0x >27ZxNd8dͶ2xͶ2!{Oz8 YW#x 8xͶ2 A$w#Y$  :!þܐ:2:2:2>2:ͨG:x(dNG2!m :ͨO :ͨ=(Go2!"*"!@)!@)!@)!~((#### y p#q#s#ro ͏v ʍ !O:2B ͏|>2z͏<2͏@,͏z͏|2y2fÇ|f*u|Ç:yG8!)>2 Gy ҳs#r#<GyOx!  N#fiOf”ïfM  *"*}"*"*"*"!x:|1!|G^>">"!}">">"!E"> $> >$>O#>#>J!!}#>!}!}!^#V#z~##ںO+~#!9bڗ>2#×:#<ֻ2#*!""++"29Cw*{}<^#Vz!c!>c! Jw*q~69!͐=‡*":*}®:=::<>2*i^#V+ d!K*}@*)): K:) O "!w [O?WGzO:VxGyOGxwq*}}ʴ>2d:#Ͻ>29཯2~2#!   )xð*}*}"*x"xm*^#V* s#r**s#r*:ﺾY4Y̓**~#ng* s#r ^#V랠a##)0"xx!"""XC*~<μ*":!::9*"x"*"g*3:= :Oi :=H:Gi a6:G/O**W :T=ҍ aʚ~»6*:X)!:T>qkֻ!:6>X*{Q:_2{2Ē"͂"X~<»#cdfg!"()*N!r)!N!)z<*)"!":X*:w:w#:w*2*}D̓¡>2ͱԲ߱?~¾¾ʹƹ>w͙=2͜:wÚ~̓ʑpá!6NwͧBpͧȾÚgsr͐-͜ġͤS)_ͤ̓~?w͐s-?F͜pN͆p# Þ͐*6!¿?~p*6 >2ͱݲԲ߱ͷw*oq͋"@6Ⱦ͚Xͤ͋͗wO~<: g~w#w#6##)͋@ * g~?G++!o#~>T}! 6**#K"G*~ xr͐-xą@˯7(͚Sʀw: :<RHͥ:>~c!o#~E^#V)G#~#~!~ b k##N#F#^#V#~#fo~o2{2g*wޥʪҢÞ+}*#}o|g:O*s#r#w!~w/~@w//Hͥ*>=)_g:0"ök*w)*c)-}ͤÀk*s":;:r2͚΢ù͚΢¯͚}/_|/*W}_*c"}o|g"c>2{—>2—͇ͱ* «>2͙wBp+ҵ:w͚AP{ 2W>O2ø}R*):r͚΢c2ZT͐-ک3͗@YsY̓YײYͅ:߱Asҵ:@ҵ@ҵ$͚̓Aآ=:<~?¯kô?~?ʾZT͐ڴ*>o"͒"!ä:Oݦ"Ý}6͚ ~2Asv@NN~v$̓W+vw̚v$̓rrͅ:r߱>2+A@2r!Z2!"ög:2T͐-:ʹ>2<2ک!w: >2*6ݦݩO~<w:*)@ u:G*g`~!x_<_@*oy<:/G?~##~? 6K@?F6##N6ⲯ2p##q:#*~w>2*p@! ~*"v@*w# ) 6#̲͙N#FxT]## #~ ȷ  *4# ' 4! *~^ ^33G# Pv:dv6 y2@ !׺)#w*~"ұ!Fw䱨ұ̓ұ:w̚":>嵯2̓*~wć"̀!~$6:03i"!~6*>=)Q!QX@˯ >2 ˯!!q#p#w2wW*_3ҫ-!s:!xQ*:<œ. ʩ.ʩAܟrr##sܟ<}rcN! ~态O>G~G!~G~o>_yG~.|°! w:ck[!x?[! ~ʤ͆[͗PPvqO-á=.:<ʰ! Vq##~_@wںͶ:WMںʛ>úͶ >TJ:!ʷ͞x!Ǯw4 ϮPWޮPܟÂ՟Â*!!~~#~O~#FsO s#r:(„y==„*!^W*y^#Vx7=2wͼկw#KWK*"J T͞*:["+SX:ڜq:ʺ!ʵ>2ܟͤ2ѭO ̡DM͸}ޭ>r""2:2* :::29:>:>*ڈ>F6:_/G:ʧ:ڨ|OͤG:_O̡̡zW{¬|:*}|BKN¬ zyG:!vq:v՟vMڂ?Ͷ >T͓Â!">Â:G:O:h=27ryy/W!:l=:<>w##~2 4~?ɫ̓¹:<ɫɫüީAX2rK:w++~=wv4͗O5:2X!"*>o+"v *!b"ݦ": r#~?w#>r# L=J Lv wȾbܟ?~O ͆ګ†wŒ~è# # x ͗w ٪ڪ٪ڪw@ ~wb͐Úݤ!x>w~6:6~#+w#w+~;wɯ2KOFq-yl?Npg:ʓ~( ȾˆʀHÈ2xą ):@ΩO~#w͚ʀô̓b_++V@* )͗Os++r~Gw#* #~$%+@*9>  #>? ;*~ w-xąH"0 *ĊHEʀ@~›:6¦w͚̋ȾÇPY*{zBKNyʺ Nú2: *~w *" ݦ2>ʄ@~k:(s~*9~Ês~Բ~ͅ<G:<ާ2x# W:<­:22G?>Grx~:2Ô##~*$*">2̀2kºʺ**iҺ@:O~2~WW:2Ôyʛ?ʔx ʔ |̷ǧÔN:r:/GyOOA +¬ ¢y2:x¹o&:W>OͫE:ڟ?N/*"y2ͦ>2 ݦRXޥDM*w6# x *ow**ws#r̀*i6#6*}"j@*|<ď>!8>8> t>nͦv8 ~*ownT] KKͦޥ*w"wͦ"w@ :åNɥ N#Fyإ*}|h#ð*ͫ# 6*q@!"@**#":&2͒:È0:+Òy<_W`iͫDM*w ~bNpwޥDM*we ^#V#~2>â9͆>!"*y³*X*ÿ͂"*g*K!~<:wb##>w#wġ> r!~#22Zw*q>ww:c *#*is#r*:!:):O!*c:Oͫ}@2æ ~á*g:o$*~K6?~wKw**i{#zir+s{O:w:Ғ4~:w?r##rp# ä |g}oì*g #G ¾1*q:*w***> r 2":O:G2!w*~zWw+ !z?#~*!* *G!O~2~m͗O~t>2?:2g͝DM*0MD"!*MD$:Oë!N: «G>O: ¡ù*ġ :ڡn` ~#foͤ2O̡"}:O*"!s#r#p*kN#F*m^#V#F*:O}|y9*+"*}|yP#9**DM"*ks#r*ms#r#pyox*kw#w*mw#w#w>2'å2*OͶyڲò<*Ͳ:0!::ò2*>*ͫ"4#4#4)7 #  w#*J|^#V#"i##"k##"m###"o#"q##"!s )*s!)*|!6~67rrorFile Exists? in Filenameòò>2a.":2:<:55;:2ɯ22{_zW{_zW )7CP/M Error On : Disk I/OInvalid DriveRead/Only FileRead/Only DiskPassword E)"!z<~rs^#V#N#FxN:oʲ̀õ(# Þry< <<%zrͷr6r9rMDÌ:o!6!h: ʚnt2 r62>rz<*; SNIOS for fictitious CPNetDevice ; maclib z80 public NTWKIN, NTWKST, CNFTBL, SNDMSG, RCVMSG, NTWKER, NTWKBT, CFGTBL cseg ; Slave Configuration Table CFGTBL: ds 1 ; network status byte ds 1 ; slave processor ID number ds 2 ; A: Disk device +2 ds 2 ; B: " ds 2 ; C: " ds 2 ; D: " ds 2 ; E: " ds 2 ; F: " ds 2 ; G: " ds 2 ; H: " ds 2 ; I: " ds 2 ; J: " ds 2 ; K: " ds 2 ; L: " ds 2 ; M: " ds 2 ; N: " ds 2 ; O: " ds 2 ; P: " ds 2 ; console device +34 ds 2 ; list device: +36... ds 1 ; buffer index +2 db 0 ; FMT +3 db 0 ; DID +4 db 0ffh ; SID (CP/NOS must still initialize) db 5 ; FNC +6 db 0 ; SIZ +7 ds 1 ; MSG(0) List number +8 ds 128 ; MSG(1) ... MSG(128) +9... ioport: db 038h ; possibly configured here... ; Network Status Byte Equates ; active equ 0001$0000b ; slave logged in on network rcverr equ 0000$0010b ; error in received message senderr equ 0000$0001b ; unable to send message ; Utility Procedures ; ; Network Initialization NTWKIN: lxix CFGTBL mvi a,active stx a,+0 ; network status byte lda ioport mov c,a inr c ; status port xra a outp a dcr c inp a stx a,+1 ; our slave (client) ID xra a sta CFGTBL+36+7 ret ; Network Status NTWKST: lda CFGTBL+0 mov b,a ani not (rcverr+senderr) sta CFGTBL+0 mov a,b ret ; Return Configuration Table Address ; Still need this for BDOS func 69 CNFTBL: lxi h,CFGTBL ret ; Send Message on Network SNDMSG: ; BC = message addr mov h,b mov l,c ; HL = message address push h popix lda CFGTBL+1 stx a,+2 ; Set Slave ID in header lda ioport mov c,a mvi b,5 ; length of header outir ldx b,+4 ; msg siz field (-1) inr b ; might be 0, but that means 256 outir inr c ; status port inp a ; ani 02h ; cmd overrun rz mvi a,0ffh ret ; Receive Message from Network RCVMSG: ; BC = message addr mov h,b mov l,c ; HL = message address push h popix lda ioport mov c,a inr c ; status port rcvwait: inp a ani 01h ; data ready jz rcvwait dcr c ; data port mvi b,5 ; header length inir ; Could compare SLVID with "LDX r,1" and ignore messages. ; But this "hardware" is point-to-point (connection oriented) ; so the only messages we see are intended for us. ldx b,+4 ; msg siz inr b inir inr c ; status port inp a ani 04h ; rsp overrun rz mvi a,0ffh NTWKER: ret NTWKBT: ; NETWORK WARM START lda ioport mov c,a xra a ; Future hardware might expect data outp a inp a ; this is our Slave ID, but we already have it ret end : lhld scbadr lxi d,058h ; date/time dad d xchg lxi h,gottime+5 lxi b,5 ; length of date/time di ldir ei lxi d,done mvi c,PRINT call BDOS lxi h,gottime+5 call prdate ret error: lxi d,errmsg mvi c,PRINT call BDOS ret badvers: lxi d,vermsg mvi c,PRINT call BDOS ret done: db 'Time was set to: $' errmsg: db 7,'Error retrieving nnz sid1 jmp start1 ; no params, use defaults sid0: ; scan hex number as server ID xchg lxi h,0 sid2: ldax d inx d call hexnum jc sid3 dcr c jnz sid2 sid3: mov a,l sta gettime+1 start1: ; TODO: handle MP/M... lxi d,scbpb mvi c,SGSCB call BDOS shld scbadr lhld vers mvi a,2 ; bit for CP/Net ana h jz nocpnet lxi d,gettime mvi c,NSEND call BDOS ora a jnz error lxi d,gottime mvi c,NRECV call BDOS ora a jnz error jmp settime nocpnet: call netinit lxi b, gettime call sendmsg ora a jnz error lxi b, gottime call receivemsg ora a jnz error settime: lhld scbadr lxi d,058h ; date/time dad d xchg lxi h,gottime+5 lxi b,5 ; length of date/time di ldir ei lxi d,done mvi c,PRINT call BDOS lxi h,gottime+5 call prdate ret error: lxi d,errmsg mvi c,PRINT call BDOS ret badvers: lxi d,vermsg mvi c,PRINT call BDOS ret done: db 'Time was set to: $' errmsg: db 7,'Error retrieving nvers equ '0e' ; December 23, 1985 21:40 drm "KEYBD.ASM" ;******************************************************** ; KEYBOARD module for CP/M plus on the KAYPRO * ; Copyright (C) 1985 Douglas Miller * ;******************************************************** maclib Z80 false equ 0 true equ not false dbase equ 200 ;base for all char I/O devices dev0 equ 001 ;first device, rel. to base ndev equ 1 int equ false ;Keyboard input via interupts? bufsiz equ 16 ;use only 2,4,8,16,32,64,128,256. bufmsk equ bufsiz-1 sio1 equ 004h ;z80-sio/0 keyb equ sio1+1 ;CONSOLE keyboard ctrlA equ 1 ctrlB equ 2 ctrlD equ 4 ctrlE equ 5 ctrlF equ 6 ctrlG equ 7 lf equ 10 cr equ 13 ctrlN equ 14 ctrlO equ 15 ctrlP equ 16 ctrlQ equ 17 ctrlR equ 18 ctrlS equ 19 ctrlT equ 20 ctrlU equ 21 ctrlV equ 22 ctrlW equ 23 ctrlX equ 24 ctrlY equ 25 cls equ 26 extrn sio1vec cseg ;common memory, other parts in banked. dw thread db dbase+dev0,ndev jmp intkey jmp instkey jmp inputkey jmp outstkey jmp outputkey dw strkey dw tblkey dw modkey strkey: db 'KAYPRO ',0,'Keyboard handler ',0,'v3.10' dw vers db '$' modkey: db 00000000b,10000010b,00110100b,keyb ;primary conversion table for cursor and numberpad keys ; --0-- --1-- --2-- --3-- --4-- keycnv: db 0,ctrlP,ctrlU, 0, 0 ; B db ctrlV,ctrlW,ctrlY,ctrlQ, 0 ; C db ctrlR,ctrlO,ctrlF,ctrlB, 0 ; D db 0,ctrlA,ctrlN,ctrlG,ctrlT ; E db 0,ctrlE,ctrlX,ctrlS,ctrlD ; F ; ; * 0 . * * e = enter ; 1 2 3 e * u = up arrow ; 4 5 6 , * d = down ; * 7 8 9 - l = left ; * u d l r r = right ; if int index: lxi d,keybd mov a,e add m mov e,a push psw mov a,m inr a ani bufmsk mov m,a pop psw rnc inr d ret spclRx: sspd ustk lxi sp,istk push psw mvi a,00110000b ;error reset out keyb+2 pop psw lspd ustk ei reti interupt: sspd ustk lxi sp,istk push psw push b push d push h xra a out keyb+2 in keyb+2 bit 7,a jnz break rrc jnc exit lxi h,keypt0 lda keypt1 dcr a ani bufmsk cmp m push psw call index in keyb ani 01111111b stax d pop psw jnz exit gobl: mov a,m dcr a ani bufmsk mov m,a exit: pop h pop d pop b pop psw lspd ustk ei reti break: mvi a,00010000b ;reset ext/status (& break) out keyb+2 in keyb xra a sta keybd sta keypt1 inr a sta keypt0 jmp exit ustk: dw 0 dw 0,0,0,0,0,0,0,0 istk: ds 0 keypt0: db 0 keypt1: db 0 keybd: ds bufsiz endif thread equ $ dseg ;banked memory. tblkey: ;initial values only, copied by BIOS to its table. if int db 'IKEYBD',00001011b,6 ;I/O, hard-baud, no protocal, 300 else ;serial db 'KEYBD ',00001011b,6 ;I/O, hard-baud, no protocal, 300 endif ;serial intkey: if int call is1 lxi h,interupt shld sio1vec+4 lxi h,spclRx shld sio1vec+6 xra a sta keypt0 sta keypt1 mvi a,1 out keyb+2 mvi a,00011100b ;int on receive character, sts eff vect. out keyb+2 ret endif is1: lxi h,modkey+2 bit 7,m rnz mov a,m ani 00110000b ; --bb---- bits per char rlc ; -bb----- mov e,a ; Tx image setb 3,e ; Tx Enable rlc ; bb------ ori 00000001b ; Rx Enable mov d,a ; Rx image mov a,m ani 00001111b ori 01000000b ; 16x clock mov b,a ; WR4 image dcx h mov a,m ; ani 10000010b ; DTR, RTS ora e mov e,a ; Tx control, with RTS/DTR inx h inx h mov c,m inr c inr c mvi a,4 outp a outp b ; WR4 inr a outp a outp e ; WR5 mvi a,3 outp a outp d ; WR3 ret inputkey: inp1: call instkey jz inp1 if int lxi h,keypt1 call index ldax d else in keyb ; get data endif ora a rp sui 0B0H lxi h,keycnv ; first loc. is not used mov m,a xra a rrd mov c,m add c add c add c add c add c mov c,a mvi b,0 dad b mov a,m ret instkey: if int lxi h,keypt0 lda keypt1 sub m else xra a out keyb+2 in keyb+2 ; read from status port ani 1 ; isolate RxRdy endif rz ; return with zero ori true ret outputkey: outp0: call outstkey jrz outp0 ; wait for TxEmpty, HL->port mov a,c out keyb ; send data ret outstkey: mvi a,00010000b ;reset ext/status change out keyb+2 in keyb+2 ani 00000100b ; test xmit holding register empty rz ; ori true ret ; return true if ready end b+2 in keyb+2 a lxi h,keypt0 lda keypt1 sub m else xra a out keyb+2 in keyb+2 ; read from status port ani 1 ; isolate RxRdy RMAC $1 $$SZPZ-M LINK BNKBIOS3=MBIOS3KP,FDC3KP,CRT,KEYBD,SERIAL,CENTR,END,& *(+"(w++2+2+ɗpؗ!" >2+2*jx.#NzW::!2W!5=^x^z:m:*;#wO:͂^2¢ů͠Ě:!ڽ*(~ݘט5Wè՚ؗjטM2ͨxΚ*(+w"(j͖ !%"(^-:*$P:<\:W:2xM s:<9>2:*9x~+q’x2:**&~2+o#"&!+6Mř:W:2x ͺ*(+"(w  :ܙ>2*2:*(:+w"(ͺ:G::+̜2 5*(~o#"(Mš*(~`Uoj*(~#"(Ñ!*~6s!+6:+‚xoڊ{2Ó#w:2.+:.2-!%"(2*!"&!*~4:2-Ԃ:Gͳͨ^2+>2:2*N#G2 2GH)+6:2,:!- ͖:,!͖+*(~L#Bxz:*:*(~ʓOr ͖ ͖! O(Ì*(~2**}ʷ!#¶!""÷:_:*(#wΗxH!)6"&:! x5~y 5 6y(^͖@O:=7:͖y ͖:I ͖:=e: zz#͖͂:! ͖ G:Ҏ>xʝʝw>ɯw̩z:»!>wɯ:=zxzz::G:=/ͽx:Āy!4 šn!6@G:x: P:<: P n6 t6! ^6 t6u:)<͠^!Ó*"r*r"ÿ<:g:!͐*f}D! ~6t!rͷ֕O(^ƕƕƕ  :Function = File = !,$"h!9"f! ͉:2t™:!=Hgo:O*;*͂:A2=/::0! dگ61#d ڸïp#:w#6 !6:6 *#!)6.#)͂ O(BDOS > wM  2*7w#6?#7 .,:;[]=<>|!?]45#Ra{i_p# l s s l ls:¬MARSXRM NDOS3 ///1SAVE Syntax: SAVE Explanation: SAVE copies the contents of memory to a file. To use SAVE, first issue the SAVE command, then run your program which reads a file into memory. Your program exits to the SAVE utility which prompts you for a filespec to which it copies the contents of memory, and the beginning and ending address of the memory to be SAVEd. ///2Example A>SAVE Activates the SAVE utility. Now enter the name of the program which loads a file into memory. A>SID dump.com Next, execute the program. #g0 When the program exits, SAVE intercepts the return to the system and prompts the user for the filespec and the bounds of memory to be SAVEd. SAVE Ver 3.0 Enter file (type RETURN to exit):dump2.com If file DUMP2.COM exists already, the system asks: Delete dump2.com? Y Then the system asks for the bounds of memory to be saved: Beginning hex address: 100 Ending hex address: 400 The contents of memory from 100H (Hexadecimal) to 400H is copied to file DUMP2.COM. ///1SET Syntax: SET [options] SET d: [options] SET filespec [options] Explanation: SET initiates password protection and time stamping of files. It also sets the file and drive attributes Read-Write, Read-Only, DIR and SYS. It lets you label a disk and password protect the label. To enable time stamping of files, you must first run INITDIR to format the disk directory. ///2Label Syntax: SET {d:} [NAME=labelname.typ] SET [PASSWORD=password] SET [PASSWORD= ///3Examples A>SET [NAME=DISK100] Labels the disk on the default drive as DISK100. A>SET [PASSWORD=SECRET] Assigns SECRET to the disk label. A>SET [PASSWORD= Nullifies the existing password. ///2Passwords SET [PROTECT=ON] SET [PROTECT=OFF] SET filespec [PASSWORD=password] SET filespec [PROTECT=READ] SET filespec [PROTECT=WRITE] SET filespec [PROTECT=DELETE] SET filespec [PROTECT=NONE] SET filespec [attribute-options] ///3Modes Password Protection Modes Mode Protection READ The password is required for reading, copying writing, deleting or renaming the file. WRITE The password is required for writing, deleting or renaming the file. You do not need a password to read the file. DELETE The password is only required for deleting or renaming the file. You do not need a password to read or modify the file. NONE No password exists for the file. If a password password exists, this modifier can be used to delete the password. ///2Attributes RO sets the file attribute to Read-Only. RW sets the file attribute to Read-Write. SYS sets the file attribute to SYS. DIR sets the file attribute to DIR. ARCHIVE=OFF means that the file has not been backed up (archived). ARCHIVE=ON means that the file has been backed up (archived). The Archive attribute can be turned on by SET or by PIP when copying a group of files with the PIP [A] option. SHOW and DIR display the Archive option. F1=ON|OFF turns on or off the user-definable file attribute F1. F2=ON|OFF turns on or off the user-definable file attribute F2. F3=ON|OFF turns on or off the user-definable file attribute F3. F4=ON|OFF turns on or off the user-definable file attribute F4. ///3Examples SET [PROTECT=ON] Turns on password protection for all the files on the disk. You must turn on password protection before you can assign passwords to files. SET [PROTECT=OFF] Disables password protection for the files on your disk. A>SET MYFILE.TEX [PASSWORD=MYFIL] MYFIL is the password assigned to file MYFILE.TEX. B>SET *.TEX [PASSWORD=SECRET, PROTECT=WRITE] Assigns the password SECRET to all the TEX files on drive B. Each TEX file is given a WRITE protect mode to prevent unauthorized editing. A>SET MYFILE.TEX [RO SYS] Sets MYFILE.TEX to Read-Only and SYStem. ///2Default A>SET [DEFAULT=dd] Instructs the system to use dd as a password if you do not enter a password for a password-protected file. ///2Time-Stamps Syntax: SET [CREATE=ON] SET [ACCESS=ON] SET [UPDATE=ON] Explanation: The above SET commands allow you to keep a record of the time and date of file creation and update, or of the last access and update of your files. ///3Options [CREATE=ON] turns on CREATE time stamps on the disk in the default or specified drive. To record the creation time of a file, the CREATE option must be turned on before the file is created. [ACCESS=ON] turns on ACCESS time stamps on the disk in the default or specified drive. ACCESS and CREATE options are mutually exclusive; only one can be in effect at a time. If you turn on the ACCESS time stamp on a disk that previously had CREATE time stamp, the CREATE time stamp is automatically turned off. [UPDATE=ON] turns on UPDATE time stamps on the disk in the default or specified drive. UPDATE time stamps record the time the file was last modified. ///3Examples A>SET [ACCESS=ON] A>SET [CREATE=ON,UPDATE=ON] ///2Drives Syntax: SET {d:} [RO] SET {d:} [RW] Example: A>SET B: [RO] Sets drive B to Read-Only. ///1SETDEF Syntax: SETDEF { d: {,d: {,d: {,d:}}}} {[ TEMPORARY = d: ] | [ ORDER = (typ {,typ}) ]} SETDEF [DISPLAY | NO DISPLAY] SETDEF [PAGE | NOPAGE] Explanation: SETDEF allows the user to display or define up to four drives for the program search order, the drive for temporary files, and the file type search order. The SETDEF definitions affect only the loading of programs and/or execution of SUBMIT (SUB) files. SETDEF turns on/off the system Display and Console Page modes. When on, the system displays the location and name of programs loaded or SUBmit files executed, and stops after displaying one full console screen of information. ///2Examples A>SETDEF Displays current SETDEF parameters. A>SETDEF [TEMPORARY=C:] Sets disk drive C as the drive to be used for temporary files. A>SETDEF C:,* Tells the system to search for a program on drive C, then, if not found, search for it on the default drive. A>SETDEF [ORDER=(SUB,COM)] Instructs the system to search for a SUB file to execute. If no SUB file is found, search for a COM file. A>SETDEF [DISPLAY] Turns on the system display mode. Henceforth, the system displays the name and location of programs loaded or submit files executed. A>SETDEF [NO DISPLAY] Turns off the system Display mode. ///1SHOW Syntax: SHOW {d:}{[SPACE |LABEL |USERS |DIR |DRIVE]} Explanation: The SHOW command displays the following disk drive information: Access mode and the amount of free disk space Disk label Current user number and Number of files for each user number on the disk Number of free directory entries for the disk Drive characteristics ///2Examples A>SHOW A>SHOW [SPACE] Instructs the system to display access mode and amount of space left on logged-in drives. A>SHOW B: Show access mode for drive B and amount of space left on drive B. A>SHOW B:[LABEL] Displays label information for drive B. A>SHOW [USERS] Displays the current user number and all the users on drive A and the corresponding number of files assigned to them. A>SHOW C:[DIR] Displays the number of free directory entries on drive C. A>SHOW [DRIVE] Displays the drive characteristics of drive A. ///1SID Syntax: SID {pgm-filespec} {,sym-filespec} Explanation: The SID symbolic debugger allows you to monitor and test programs developed for the 8080 microprocessor. SID supports real-time breakpoints, fully monitored execution, symbolic disassembly, assembly, and memory display and fill functions. SID can dynamically load SID utility programs to provide traceback and histogram facilities. ///2Commands Command Meaning As (Assemble) Enter assembly language statements s is the start address Cs{b{,d}} (Call) Call to memory location from SID s is the called address b is the value of the BC register pair d is the value of the DE register pair D{W}{s}{,f} (Display) Display memory in hex and ASCII W is a 16-bit word format s is the start address f is the finish address Epgm-filespec (Load) Load program and symbol table {,sym-filespec} for execution E*sym-filespec (Load) Load a symbol table file Fs,f,d (Fill) Fill memory with constant value s is the start address f is the finish address d is an eight-bit data item G{p}{,a{,b}} (Go) Begin Execution p is a start address a is a temporary breakpoint H (Hex) Displays all symbols with addresses in Hex H.a Displays hex, decimal, and ASCII values of a where a is a symbolic expression Ha,b Computes hex sum and difference of a and b where a and b are symbolic expressions Icommand tail (Input) Input CCP command line L{s}{,f} (List) List 8080 mnemonic instructions s is the start address f is the finish address Ms,h,d (Move) Move Memory Block s is the start address h is the high address of the block d is the destination start address P{p{,c}} (Pass) Pass point set, reset, and display p is a permanent breakpoint address c is initial value of pass counter Rfilespec{,d} (Read) Read Code/Symbols d is an offset to each address S{W}s (Set) Set Memory Values s is address where value is sent W is 16 bit word T{n{,c}} (Trace) Trace Program Execution n is the number of program steps c is the utility entry address. T{W}{n{,c}} (Trace) Trace Without Call W instructs SID not to trace subroutines n is the number of program steps c is the utility entry address U{W}{n{,c}} (Untrace) Monitor Execution without Trace n is the number of program steps c is the utility entry address W instructs SID not to trace subroutines V (Value) Display the value of the next available location in memory (NEXT), the next location after the largest file read in (MSZE), the current value of the Program counter (PC), and the address of the end of available memory (END) Wfilespec,s,f (Write) Write the contents of a contiguous block of memory to filespec. f is finish address X{f}{r} (Examine) Examine/alter CPU state. f is flag bit C,Z,M,E or I. r is register A,B,D,H,S or P. ///2Examples A>SID CP/M 3 loads SID from drive A into memory. SID displays the # prompt when it is ready to accept commands. A>B:SID SAMPLE.HEX CP/M 3 loads SID and the program file SAMPLE.HEX into memory from drive B. ///2Utilities SID utilities, HIST.UTL and TRACE.UTL are special programs that operate with SID to provide additional debugging facilities. Th ; send data di in sysctl ani 10110111b out sysctl ori 00001000b out sysctl ei ret outst: in sysctl xri 01000000b ani 01000000b rz nullst: ori true ret ; return true if ready end  ret outst: in sysctl xrinked memory. tblcnt: ;initial value only, copied by BIOS to its table. db 'LPT ',00000010b,0 ;Output, no baud, no protocal init: ret nullin: mvi a,1ah ret output: outp0: call outst jrz outp0 ; wait for not busy mov a,c out port@CHK MACRO ?DD ;; USED FOR CHECKING RANGE OF 8-BIT DISP.S IF (?DD GT 7FH) AND (?DD LT 0FF80H) 'DISPLACEMENT RANGE ERROR - Z80 LIB' ENDIF ENDM @CHKR MACRO ?NN,?DD @CHK ?DD DB ?NN,?DD ENDM LDX MACRO ?R,?D @CHK ?D DB 0DDH,?R*8+46H,?D ENDM LDY MACRO ?R,?D @CHK ?D DB 0FDH,?R*8+46H,?D ENDM STX MACRO ?R,?D @CHK ?D DB 0DDH,70H+?R,?D ENDM STY MACRO ?R,?D @CHK ?D DB 0FDH,70H+?R,?D ENDM MVIX MACRO ?N,?D @CHK ?D DB 0DDH,36H,?D,?N ENDM MVIY MACRO ?N,?D @CHK ?D DB 0FDH,36H,?D,?N ENDM LDAI MACRO DB 0EDH,57H ENDM LDAR MACRO DB 0EDH,5FH ENDM STAI MACRO DB 0EDH,47H ENDM STAR MACRO DB 0EDH,4FH ENDM LXIX MACRO ?NNNN DB 0DDH,21H DW ?NNNN ENDM LXIY MACRO ?NNNN DB 0FDH,21H DW ?NNNN ENDM LDED MACRO ?NNNN DB 0EDH,5BH DW ?NNNN ENDM LBCD MACRO ?NNNN DB 0EDH,4BH DW ?NNNN ENDM LSPD MACRO ?NNNN DB 0EDH,07BH DW ?NNNN ENDM LIXD MACRO ?NNNN DB 0DDH,2AH DW ?NNNN ENDM LIYD MACRO ?NNNN DB 0FDH,2AH DW ?NNNN ENDM SBCD MACRO ?NNNN DB 0EDH,43H DW ?NNNN ENDM SDED MACRO ?NNNN DB 0EDH,53H DW ?NNNN ENDM SSPD MACRO ?NNNN DB 0EDH,73H DW ?NNNN ENDM SIXD MACRO ?NNNN DB 0DDH,22H DW ?NNNN ENDM SIYD MACRO ?NNNN DB 0FDH,22H DW ?NNNN ENDM SPIX MACRO DB 0DDH,0F9H ENDM SPIY MACRO DB 0FDH,0F9H ENDM PUSHIX MACRO DB 0DDH,0E5H ENDM PUSHIY MACRO DB 0FDH,0E5H ENDM POPIX MACRO DB 0DDH,0E1H ENDM POPIY MACRO DB 0FDH,0E1H ENDM EXAF MACRO DB 08H ENDM EXX MACRO DB 0D9H ENDM XTIX MACRO DB 0DDH,0E3H ENDM XTIY MACRO DB 0FDH,0E3H ENDM LDI MACRO DB 0EDH,0A0H ENDM LDIR MACRO DB 0EDH,0B0H ENDM LDD MACRO DB 0EDH,0A8H ENDM LDDR MACRO DB 0EDH,0B8H ENDM CCI MACRO DB 0EDH,0A1H ENDM CCIR MACRO DB 0EDH,0B1H ENDM CCD MACRO DB 0EDH,0A9H ENDM CCDR MACRO DB 0EDH,0B9H ENDM ADDX MACRO ?D @CHK ?D DB 0DDH,86H,?D ENDM ADDY MACRO ?D @CHK ?D DB 0FDH,86H,?D ENDM ADCX MACRO ?D @CHK ?D DB 0DDH,8EH,?D ENDM ADCY MACRO ?D @CHK ?D DB 0FDH,8EH,?D ENDM SUBX MACRO ?D @CHK ?D DB 0DDH,96H,?D ENDM SUBY MACRO ?D @CHK ?D DB 0FDH,96H,?D ENDM SBBX MACRO ?D @CHK ?D DB 0DDH,9EH,?D ENDM SBBY MACRO ?D @CHK ?D DB 0FDH,9EH,?D ENDM ANAX MACRO ?D @CHK ?D DB 0DDH,0A6H,?D ENDM ANAY MACRO ?D @CHK ?D DB 0FDH,0A6H,?D ENDM XRAX MACRO ?D @CHK ?D DB 0DDH,0AEH,?D ENDM XRAY MACRO ?D @CHK ?D DB 0FDH,0AEH,?D ENDM ORAX MACRO ?D @CHK ?D DB 0DDH,0B6H,?D ENDM ORAY MACRO ?D @CHK ?D DB 0FDH,0B6H,?D ENDM CMPX MACRO ?D @CHK ?D DB 0DDH,0BEH,?D ENDM CMPY MACRO ?D @CHK ?D DB 0FDH,0BEH,?D ENDM INRX MACRO ?D @CHK ?D DB 0DDH,34H,?D ENDM INRY MACRO ?D @CHK ?D DB 0FDH,34H,?D ENDM DCRX MACRO ?D @CHK ?D DB 0DDH,035H,?D ENDM DCRY MACRO ?D @CHK ?D DB 0FDH,35H,?D ENDM NEG MACRO DB 0EDH,44H ENDM IM0 MACRO DB 0EDH,46H ENDM IM1 MACRO DB 0EDH,56H ENDM IM2 MACRO DB 0EDH,5EH ENDM BC EQU 0 DE EQU 2 HL EQU 4 IX EQU 4 IY EQU 4 DADC MACRO ?R DB 0EDH,?R*8+4AH ENDM DSBC MACRO ?R DB 0EDH,?R*8+42H ENDM DADX MACRO ?R DB 0DDH,?R*8+09H ENDM DADY MACRO ?R DB 0FDH,?R*8+09H ENDM INXIX MACRO DB 0DDH,23H ENDM INXIY MACRO DB 0FDH,23H ENDM DCXIX MACRO DB 0DDH,2BH ENDM DCXIY MACRO DB 0FDH,2BH ENDM BIT MACRO ?N,?R DB 0CBH,?N*8+?R+40H ENDM SETB MACRO ?N,?R DB 0CBH,?N*8+?R+0C0H ENDM RES MACRO ?N,?R DB 0CBH,?N*8+?R+80H ENDM BITX MACRO ?N,?D @CHK ?D DB 0DDH,0CBH,?D,?N*8+46H ENDM BITY MACRO ?N,?D @CHK ?D DB 0FDH,0CBH,?D,?N*8+46H ENDM SETX MACRO ?N,?D @CHK ?D DB 0DDH,0CBH,?D,?N*8+0C6H ENDM SETY MACRO ?N,?D @CHK ?D DB 0FDH,0CBH,?D,?N*8+0C6H ENDM RESX MACRO ?N,?D @CHK ?D DB 0DDH,0CBH,?D,?N*8+86H ENDM RESY MACRO ?N,?D @CHK ?D DB 0FDH,0CBH,?D,?N*8+86H ENDM JR MACRO ?N @CHKR 18H,?N-$-1 ENDM JRC MACRO ?N @CHKR 38H,?N-$-1 ENDM JRNC MACRO ?N @CHKR 30H,?N-$-1 ENDM JRZ MACRO ?N @CHKR 28H,?N-$-1 ENDM JRNZ MACRO ?N @CHKR 20H,?N-$-1 ENDM DJNZ MACRO ?N @CHKR 10H,?N-$-1 ENDM PCIX MACRO DB 0DDH,0E9H ENDM PCIY MACRO DB 0FDH,0E9H ENDM RETI MACRO DB 0EDH,4DH ENDM RETN MACRO DB 0EDH,45H ENDM INP MACRO ?R DB 0EDH,?R*8+40H ENDM OUTP MACRO ?R DB 0EDH,?R*8+41H ENDM INI MACRO DB 0EDH,0A2H ENDM INIR MACRO DB 0EDH,0B2H ENDM IND MACRO DB 0EDH,0AAH ENDM INDR MACRO DB 0EDH,0BAH ENDM OUTI MACRO DB 0EDH,0A3H ENDM OUTIR MACRO DB 0EDH,0B3H ENDM OUTD MACRO DB 0EDH,0ABH ENDM OUTDR MACRO DB 0EDH,0BBH ENDM RLCR MACRO ?R DB 0CBH,00H+?R ENDM RLCX MACRO ?D @CHK ?D DB 0DDH,0CBH,?D,06H ENDM RLCY MACRO ?D @CHK ?D DB 0FDH,0CBH,?D,06H ENDM RALR MACRO ?R DB 0CBH,10H+?R ENDM RALX MACRO ?D @CHK ?D DB 0DDH,0CBH,?D,16H ENDM RALY MACRO ?D @CHK ?D DB 0FDH,0CBH,?D,16H ENDM RRCR MACRO ?R DB 0CBH,08H+?R ENDM RRCX MACRO ?D @CHK ?D DB 0DDH,0CBH,?D,0EH ENDM RRCY MACRO ?D @CHK ?D DB 0FDH,0CBH,?D,0EH ENDM RARR MACRO ?R DB 0CBH,18H+?R ENDM RARX MACRO ?D @CHK ?D DB 0DDH,0CBH,?D,1EH ENDM RARY MACRO ?D @CHK ?D DB 0FDH,0CBH,?D,1EH ENDM SLAR MACRO ?R DB 0CBH,20H+?R ENDM SLAX MACRO ?D @CHK ?D DB 0DDH,0CBH,?D,26H ENDM SLAY MACRO ?D @CHK ?D DB 0FDH,0CBH,?D,26H ENDM SRAR MACRO ?R DB 0CBH,28H+?R ENDM SRAX MACRO ?D @CHK ?D DB 0DDH,0CBH,?D,2EH ENDM SRAY MACRO ?D @CHK ?D DB 0FDH,0CBH,?D,2EH ENDM SRLR MACRO ?R DB 0CBH,38H+?R ENDM SRLX MACRO ?D @CHK ?D DB 0DDH,0CBH,?D,3EH ENDM SRLY MACRO ?D @CHK ?D DB 0FDH,0CBH,?D,3EH ENDM RLD MACRO DB 0EDH,6FH ENDM RRD MACRO DB 0EDH,67H ENDM DM SRLY MACRO ?D @CHK ?D DB 0FDH,0CBO ?D @CHK ?D DB 0DDH,0CBH,?D,26H ENDM SLAY MACRO ?D @CHK ?D DB 0FDH,0CBH,?D,26H ENDM SRAR MACRO ?R DB 0CBH,28H+?R ENDM SRAX MACRO ?D @CHK ?D DB 0DDH,0CBH,?D,2EH ENDM SRAY MACRO ?D @CHK ?D DB 0FDH,0CBH,?D,2EH ENDM SRLR vers equ '0e' ; December 23, 1985 21:38 drm "SERIAL.ASM" ;******************************************************** ; Z80-SIO I/O module for CP/M plus on the KAYPRO * ; Copyright (C) 1985 Douglas Miller * ;******************************************************** maclib Z80 false equ 0 true equ not false dbase equ 200 ;base for all char I/O devices dev0 equ 002 ;first device, rel. to base ndev equ 3 sio1 equ 004h ;z80-sio/0 sio2 equ 00ch ;another sio dce equ sio2+0 ;auxiliary printer dte equ sio1+0 ;terminal equip. modem equ sio2+1 ;modem cseg ;common memory, other parts in banked. dw thread db dbase+dev0,ndev jmp intsio jmp instsio jmp inputsio jmp outstsio jmp outputsio dw strsio dw tblsio dw modsio strsio: db 'KAYPRO ',0,'Z80-SIO handler ',0,'v3.10' dw vers db '$' ; 7=DTR, 6=, 5=CTS, 4=sync 3=DCD : 2=, 1=RTS, 0= modsio: db 00100000b,10100010b,00110100b,dce db 00101000b,10101010b,00110100b,dte db 00101000b,10101010b,00110100b,modem thread equ $ dseg ;banked memory. tblsio: ;initial values only, copied by BIOS to its table. db 'DCE ',00001111b,14 ;I/O, soft-baud, no protocal, 9600 db 'DTE ',00001111b,14 ;I/O, soft-baud, no protocal, 9600 db 'MODEM ',00001011b,6 ;I/O, hard-baud, no protocal, 300 ; all serial vector: mov a,b ;device number sui dev0 add a add a ;*4 mov c,a add a ;*8 mov e,a mvi b,0 mov d,b lxi h,tblsio+6 dad d xchg lxi h,modsio+3 dad b ret intsio: call vector dcx h is1: bit 7,m rnz push d mov a,m ani 00110000b ; bits per char rlc ; -bb----- mov e,a ; Tx image setb 3,e ; Tx Enable rlc ; bb------ ori 00000001b ; Rx Enable mov d,a ; Rx image mov a,m ani 00001111b ori 01000000b ; 16x clock mov b,a ; WR4 image dcx h mov a,m ; ani 10000010b ; DTR, RTS ora e mov e,a ; Tx control, with RTS/DTR inx h inx h mov c,m inr c inr c mvi a,4 outp a outp b ; WR4 inr a outp a outp e ; WR5 mvi a,3 outp a outp d ; WR3 ; init baud rate mov c,m res 2,c ; baud rate port pop h bit 2,m ; soft baud? rz mov a,m ; 0; 1,2,3..15 ora a rz cpi 10 ; 1,2,3..15 jrnc is0 dcr a ; 0,1,2,3,4,5,6,7,8,10,11,12,13,14,15 is0: outp a ret inputsio: inp0: call instsio jrz inp0 ; wait for character ready mov c,m inp a ; get data ani 7Fh ; mask parity ret instsio: call vector ins0: mov c,m inr c inr c xra a outp a inp a ; read from status port ani 1 ; isolate RxRdy rz ; return with zero ori true ret outputsio: mov a,c push psw outp0: call outstsio jrz outp0 ; wait for TxEmpty, HL->port pop psw mov c,m outp a ; send data ret outstsio: call vector os0: mov c,m dcx h dcx h inr c inr c mvi a,00010000b ;reset ext/status change outp a inp a xra m dcx h ; ana m ; [ZR] = ready ani 00111000b jrnz nrdy inp a ani 04h ; test xmit holding register empty rz ; ori true ret ; return true if ready nrdy: xra a ret ;speed$table: ; DTE,DCE ;0 db 00h ;no baud rate ;1 db 0 ;50 ;2 db 1 ;75 ;3 db 2 ;110 ;4 db 3 ;134.5 ;5 db 4 ;150 ;6 db 5 ;300 ;7 db 6 ;600 ;8 db 7 ;1200 ;9 db 8 ;1800 ;10 db 10 ;2400 ;11 db 11 ;3600 ;12 db 12 ;4800 ;13 db 13 ;7200 ;14 db 14 ;9600 ;15 db 15 ;19200 end 0 ;11 db 11 ;3600 ;12 db 12 ;4800 ;13 db 13 ;7200 ;14 db 14 ;9600 ;15 db 15 ;192vers equ '0g' ; January 20, 1986 11:06 drm "CRT.ASM" ;******************************************************** ; CRT module for the KAYPRO * ; Copyright (C) 1985 Douglas Miller * ;******************************************************** maclib Z80 false equ 0 true equ not false external equ false ;actual driver in EPROM? dev0 equ 200 ndev equ 1 sysctl equ 014h ;status/ctrl bits if not external line25n equ 00100000b crtadr equ 1ch vidctl equ crtadr crtreg equ 1dh viddat equ 1fh sio1 equ 4 keyb equ sio1+1 ; CRTC register addresses curst equ 10 curen equ 11 startH equ 12 startL equ 13 cursrH equ 14 cursrL equ 15 ramioH equ 18 ramioL equ 19 nulla equ 31 ctrlD equ 4 bell equ 7 bs equ 8 lf equ 10 ctrlK equ 11 ff equ 12 cr equ 13 ctrlW equ 23 ctrlX equ 24 ctrlZ equ 26 esc equ 27 rs equ 30 endif extrn @ctbl,@vect cseg ;common memory, other parts in banked. dw thread db dev0,ndev jmp init jmp nullst jmp nullin jmp nullst jmp output dw strcrt dw tblcrt dw modcrt strcrt: db 'KAYPRO ',0,'CRT driver ',0,'v3.10' dw vers db '$' modcrt: db 00000000b,00000000b,10000000b,0 thread equ $ dseg ;banked memory. tblcrt: ;initial value only, copied by BIOS to its table. db 'CRT ',00000010b,0 ;Output, no baud, no protocal init: if not external LXI H,escflg MVI B,12 XRA A L06E0 MOV M,A INX H DJNZ L06E0 lhld 0041h ;gifts from the loader... shld line lhld 0044h ; shld curpos lhld 0046h ; shld starta endif ret nullin: mvi a,1ah ret nullst: ori true ret ; return true if ready if external output: di in sysctl ani 10111111b ori 10000000b out sysctl call 0045h in sysctl ani 00111111b out sysctl ei ret else ;internal CRT driver code: ;CTR controlling code output: LDA escflg ORA A JNZ L09CB ;ESC codes MOV A,C ORA A RZ ;ignore nulls JM L07AE ;Block graphics CPI ' ' JC L0A44 ;CTRL codes ;Displayable char L078F MOV A,C LDe mechanisms for system initialization, data collection, and data display are described in the CP/M SID User's Guide. The HIST utility creates a histogram (bar graph) showing the relative frequency of execution of code within selected program segments of the test program. The HIST utility allows you to monitor those sections of code that execute most frequently. The TRACE utility obtains a backtrace of the instructions that led to a particular breakpoint address in a program under test. You can collect the addresses of up to 256 instructions between pass points in U or T modes. ///1SUBMIT Syntax: SUBMIT {filespec} {argument} ... {argument} Explanation: The SUBMIT command lets you execute a group (batch) of commands from a SUBmit file (a file with filetype of SUB). ///2Subfile The SUB file can contain the following types of lines: Any valid CP/M 3 command Any valid CP/M 3 command with SUBMIT parameters ($0-$9) Any data input line Any program input line with parameters ($0 to $9) The command line cannot exceed 135 characters. The following lines illustrate the variety of lines which may be entered in a SUB file: DIR DIR *.BAK MAC $1 $$$4 PIP LST:=$1.PRN[T$2 $3 $5] DIR *.ASM PIP SUBMIT A>SUBMIT SUBA A>SUBMIT AA ZZ SZ A>SUBMIT B:START DIR E: ///2PROFILE.SUB Everytime you power up or reset your computer, CP/M 3 looks for a special SUBmit file named PROFILE.SUB to execute. If it does not exist, CP/M 3 resumes normal operation. If the PROFILE.SUB file exists, the system executes the ÀCP/M Version 3.0COPYRIGHT 1982, DIGITAL RESEARCH251082654321!9"k1G \!m!w# š!v6H#6E#6X!e6C#6O#6M<<&:g.".g"?S:2n!`w #4o"c*e{ozg"hj:]@*c"\y!5C*^N{zb+"^*^*`*h"!j4&"h"y:b<5*kG!gwxS0  *cN,*cN{zҽ{,*c*e{ozg ~*c#"c> :[ >  X N*c>:> !:q#G*eDM*h ERROR: $DISK READ$LOAD ADDRESS LESS THAN 100$DISK WRITE$LOAD ADDRESS $ERROR ADDRESS $INVALID HEX DIGIT$CHECKSUM ERROR $FIRST ADDRESS $LAST ADDRESS $BYTES READ $RECORDS WRITTEN $CANNOT OPEN SOURCE FILE$DIRECTORY FULL$CANNOT CLOSE FILE$HEXCOM VERS: 3.00 $text, where n normally defaults to 24 lines per page. [NOPAGE] Turns off Console Page Mode and continuously displays a typed file on the screen. ///2Examples A>TYPE MYPROG.PLI Displays the contents of the file MYPROG.PLI on your screen. A>TYPE B:THISFILE [PAGE] Displays the contents of the file THISFILE from d--------------------------------------------------------------- REN (Rename) REN provides a quick and easy way of changing the name of a file. For example, the command: A0>ren newname.doc=oldname.doc ^ ^ | | replacement name to be replaced causes the file 'oldname.doc', located on drive 'A', to be renamed as 'newname.doc'. Note that the old (or original) file name is placed to the RIGHT of the equal sign, and the new file name is placed to the LEFT. Following a name change, only the new (or replacement) file name will appear on the disk directory. To change the name of a file located on the diskette in drive 'B', use the command form: A0>ren b:newname.doc=b:oldname.doc ................................................................. ----------------------------------------------------------------- ERA (Erase) You will often want to free-up diskette space by deleting old, unwanted files. The CP/M command to do this is ERA. For example, the command: A0>era b:thisfile.doc erases "thisfile.doc" on the diskette in drive B. Clearly, you will want to use this command CAUTIOUSLY. ERA can also erase groups of files. For example, the command: A0>era *.doc erases all files on the diskette in drive A having names ending with the '.DOC' extension. The asterisk "*" is used like a 'wild card' to represent all filenames. Finally, to erase all files on a disk, use the command form: A0>era *.* Before erasing all the files on the diskette, CP/M will ask: "ALL (Y/N)?" This confirmation is requested to insure that you are aware of the (rather drastic) consequences of the command. ................................................................. ----------------------------------------------------------------- TYPE (Display File) TYPE allows you to inspect a document directly from CP/M without having to enter WordStar. For example, the command: A0>type b:thisfile.doc causes the contents of "thisfile.doc", located on drive B, to be scrolled across the screen. To temporarily halt the scroll, type: CTRL--S To resume scrolling hit any key. To quit prior to reaching the end of the document, type: CTRL--C ...................................................................... ...................................................................... ɀSAVE SAVE y<1!~ʋ;:* ͩ".~>2`*.h~`>26!*#~2#~2r+s-* 1!~ʀ#_6|ʉ#6?#6 #6$\<8Y‰\>!|w\:V"8: V "**Ͳ\h}}€!*:2\<T}Q**#s#r>2:Ÿ*.h6 1>2::>2}2|2!"  !!\( yŽw=G::xAڎҎa{!_Î 4 4(!~> L5*~#"a_:f7ñ8 ʱ0vñ@7ñ҇0ÒGڐ7ñ7o:O& ʦ))))ÛzW{_f: CP/M 3 SAVE - Version 3.0$ Enter file (type RETURN to exit): $ Delete $ Beginning hex address $ Ending hex address $ $ ERROR: Bad close.$ ERROR: No directory space.$ ERROR: No disk space.$@$ $H I$I!$HI"$$"$ I ! A  !B B@@ $ABH$!"D$"B!`w #4o"c*e{ozg"hj:]@*c"\y!5C*^N{zb+"^*^*`*h"!j4&"h"y:b<5*kG!gwxS0   1 R/W B THISFILE.DOC In this display: "RECS" indicates the number of 128 byte records used by the file. "BYTES" means the length of the file in bytes. "EXT" indicates the number of 'logical extents' taken up by the file. "ACC" stands for the "accessibility of the file--whether it is 'read-only' or 'read-write'". "D" is the drive name. (NOTE: "Bytes" is the figure you will generally be most interested in.) STAT will also display statistics of any identifiable group of files. For example, the command A0>stat *.com will display the amount of space occupied by all the files on drive A whose file names have the extension ".com"--e.g., STAT.COM, PIP.COM, WS.COM, etc. Finally, you can use the wild card symbol "*" to have STAT display the status of all files on a diskette. A0>stat *.* STAT will respond with a display like this: Recs Bytes Ext Acc 136 18k 2 R/W A:MASMENU.COM 16 2k 1 R/W A:FINDBAD.COM 189 24k 2 R/W A:MFDISK.COM 18 4k 1 R/W A:COPY.COM If the listing is longer than one screenful, use 'Control--S' to temporarily halt the display, afterwards hitting any key to continue. ................................................................. ----------------------------------------------------------------- PIP (File Copying) Filename: 'PIP.COM' PIP, or 'Peripheral Interchange Program', is the CP/M utility program used for copying individual files and programs from one diskette to another, or onto free space on the same diskette. To copy a file from one diskette to another, use the command form: A0>pip b:=a:thisfile.doc -- -------------- ^ ^ | | {destination} {source} In this command 'thisfile.doc', which is located on drive 'A', is being copied to drive 'B'. Note that the file name does noÞCOPYRIGHT (C) 1980 DIGITAL RESEARCH RELIRLFATAL ERROR$l$l1 ͺ!"!6͓*~=:!ͣ !6:/::!ͣ !6:!!/ͣ < ͧv! s+p+q> ͍"̀ځ*>! q** DM* 1q>> ͍+s#r=>!r+s+q+q+p+q> ͍"!6> !*&*6!4¦:! *w* * * DM -* *s#r*"̀*":*. Tu -". u -2:~ l:\.~ -Ql.~ -dup. du -zT!"u*M: *M: !6>}!: :<2¨#u{u>!͘,T>͍)*DMTT"*%DMu{̀+s#r;'*DMu{̀N*"'ͅ>v":2T2u:ҙu͟!6>!ڙ: :<2:ҦT͟:!/Ҵ:͍ >>l͍ >!͘:/H*!*"'*DMT{T:lͪ : >>l?: &#*DMu{:2:2u͉Tp*>@O>*>@*w*~!s+q*&%*& *&%*2& "*DMT*+"*DM3T"!p+q!\#s>!s:+&:2̀&ͣ :22ͧ!s+q+q*M*͍"̀̀Hm*DM̀%*& "!6|*#:w*##:w* :w!6!6\2!:!H÷:!!6l+6**͍!6\* ^#V""!3"$"!o2ͣ :< J.< -B3!6#6!6*#s#r!6\wl!6!6!6\ʒÇ.  -›!&6:!&:&=O! N,:&<2&©**pH*#N*##* ^N0Jͭ1 Gͤͣ  <_1D**M*0G!'q:w**M0*"!6}!6:'҄Çͭ1Ҙ**͇H* >͘ҿ:'/**M*0} <_1K!6#6#6:  . - 12(:( T}L :2:2!:y :2̀y ͣ :22!""*"!6!6: *")*"*K: *: !6#6l: *)"ï !6l+6!6͔ :  G. - !"!\"!"*^#V" $!^q> !^] :^0O,h :^ AO,!_q:_OD :_OD !ap+q>`Mi !`\Mi !cp+q*bDMG!ep+q!d\+J<!hr+s+q*f&4 N,*gDM͵ DM̈́  ,*3&+) >>l!C9 < ,*3&+) ^#V*3M  ,!iq*# :iw*#"!͛o #*DMu{!"*!*"D*!s*D!s*D!s!6*!*"D*!s*D!s*D!s!6*M: *M: *M: O`iN928 "92;!j6:;!jU :j=O!< Hq!j40 *8M*9 !k6:;!kڇ :k=O!< N,!k4g  ,!lq*' :lw*#"!͛ '*DMT{*!*"!"!ns+q: ͪ :n!O> !>O:n2nO!mT!w& 8 !w:o2% & *M͍ !6!6:n!2oK :m!o>O!mC!pq*pM !rp+q*q}OY *q|OY *8M *9DMg *;M !s6:;!sھ :s=O!< NY !s4ž !t6:;!t :t=O!< N: !t4 : 2u: :* *uMi  ,*3&+) N#F+q#p!C6:? *uMY !vq "w:R:ҕ *vM*w *3&+) N#F+q#p*3&+) >>l2C:Ҵ *vM *wDMg !yq:y/:yH >!y# :y::::y8*;< -*:;2:@:<!C6*y&>) N#FG>!ykb :y/:yH҅V :y ¦:823*3&+) *9s#r:y!"+"-"/"1!36<::y<@ Gb :!:y<b :I:y/ *yM :y#~ >!y/͐ :yI:I 7:[:y[Ϳ o >á2zO>Ҏ*zM@:zá2z*zM͵:z,=>)-,),>,=*#"!|p+q*{~**{ >*{#"{>ʹ*~>~,H !6)!\""!o)ͣ !6!6ʹͼi**& w:<2cͣ ʹ7*~-w!6*~)…!6:ғͣ !6*"*~)*:º!6***̈́:*:!6!6lͼͣ Þ!6*~>ʤ*#"}!6*:3ͣ *~=X!6*#"}:X!"}**Ҁ* *}s#r*>wÑ**}̈́ͼҡͣ ʹ*~]*~D!6*~I!6*~M!6*~P!6ͣ ʹè!q!6!6*"ʹ!""!o8ͣ >͍J!"ͼҍ*~(c͆Ç*~_[],()!q: > :a/>z!/H:_2:!p+q*^#V"*##^#V"!6 !6+6:W: Q!6l<*6+: m+_Ax!!6Aڙ:ڐ!l+}::*~:Hھ!*#~A<*wO>!*&*6 '!6:.+A: !l+: !*&*\:<2O* N2!6> !i*& :b>!4F>:<2O* :w:!4~ʶ 6*#"*{zڶ!"ͧ*!~2xG:2G:p ˆx!4~ 6*#"*{z!"*!~2xG:2G x{_ C#5>ɯ$!p+q!6> !ڌ*&*~ x*&*N,:….,!4Q!r+s+p+q*DMG*DMFEͣ !s+p+q+p+q+p+qWͣ !">͍+s#r!oM*DM`:$*DM͐O>!>͍ ͣ !9*DM͠O>9ͣ *"*#"`!r+s+p+q+p+q***DMͮ*!r+s+p+q+p+q***DMͮ!p+q*DMp!6 > !*&*6!4²*DMͰͣ !p+q * 6 * 6*DM̀*͍!p+q*DM+ͣ !q*& , ,!p+q*  !p+q*!p+q*!p+q*! p+q*! p+q* ! p+q* !p+q`*!p+q*_{ozg_ogDM!>))덑o|g = DM!>))4 =,_{ozg~ D^#V) N~ U^#V|g}o `_{ozgO{ozgi`N#Fogo&og_{_z#WLIB 1.1 $REL $$$IRL $$$INDEX ERROR$NO MODULE: $SYNTAX ERROR$APDCentry symbol $select common block $program name $request $error 4 $define common size $chain external $define entry point $error 8 $external + offset $define data size $set program counter $chain address $define program size $end program $end file$FTiw(5ABORTED$DISK READ ERROR$DISK WRITE ERROR$CANNOT CLOSE$DIRECTORY FULL$NO FILE: $ED curpos CALL L0998 CALL L09A4 ;advance cursor L079A LDA column INR A CPI 80 JNC L07F7 ;wrap STA column LDED curpos INX D JMP L0815 ;Block graphics codes L07AE LDA attrib ANI 00010000b JRZ L078F ;normal char LDA LFD8C ANI 01000000b JRZ L07C3 MOV A,C ANI 00000001b STA LFD8C RET L07C3 LDA LFD8C ORA A MOV A,C JRZ L07CB CMA L07CB ORI 10000000b LDED curpos CALL L0998 LDA LFD8C MOV C,A LDA attrib ORA C CALL L09A7 MVI A,01000000b STA LFD8C JR L079A ;advance cursor pos L07E6 LHLD curpos LDA column MOV E,A XRA A MOV D,A STA column DSBC D XCHG JR L0815 ;wrap to next line L07F7 CALL L07E6 ; L07FA LDA line CPI 23 JRC L0809 L0801 CPI 24 RZ CALL L088A JR L080D L0809 INR A STA line L080D LHLD curpos LXI D,80 DAD D XCHG L0815 MOV A,D ANI 00000111b MOV D,A XCHG SHLD curpos LBCD starta DSBC B JRNC L0829 LXI D,2048 DAD D L0829 DAD B XCHG LXI B,crtadr + (cursrH shl 8) JMP L0981 L0831 LDA line CPI 24 RZ ORA A RZ DCR A STA line LHLD curpos LXI D,80 DSBC D XCHG JR L0815 L0848 LDA column ORA A JRNZ L085D LDA line ORA A RZ CPI 24 JRZ L0868 DCR A STA line MVI A,80 L085D DCR A STA column LDED curpos DCX D JR L0815 L0868 MVI A,79 STA column LHLD curpos LXI D,79 DAD D XCHG JR L0815 L0877 LDA column CPI 79 JNC L07F7 LDED curpos INX D INR A STA column JR L0815 L088A JMP L0A8C ;set modes L088D LXI H,attrib MOV A,C SUI '0' JRZ L08AB DCR A JRZ L08B0 DCR A JRZ L08B5 DCR A JRZ L08BA DCR A JRZ L08BF DCR A JRZ L08C9 DCR A JRZ L08D7 DCR A JRZ L08DE RET ;Rev Vid L08AB MOV A,M ORI 00000001b MOV M,A RET L08B0 MOV A,M ORI 00000010b MOV M,A RET L08B5 MOV A,M ORI 00000100b MOV M,A RET L08BA MOV A,M ORI 00001000b MOV M,A RET ;Cursor on L08BF MVI C,01100000b ; L08C1 MVI A,curst OUT crtadr MOV A,C OUT viddat RET ;Vid Mode L08C9 LDA attrib ORI 00010000b STA attrib MVI A,01000000b STA LFD8C RET L08D7 LHLD line SHLD LFD7D RET L08DE LDA attrib ORI 00100000b STA attrib RET ;reset mode L08E7 LXI H,attrib MOV A,C SUI '0' JRZ L0905 DCR A JRZ L090A DCR A JRZ L090F DCR A JRZ L0914 DCR A JRZ L0919 DCR A JRZ L091D DCR A JRZ L0922 DCR A JRZ L0934 RET L0905 MOV A,M ANI 11111110b MOV M,A RET L090A MOV A,M ANI 11111101b MOV M,A RET L090F MOV A,M ANI 11111011b MOV M,A RET L0914 MOV A,M ANI 11110111b MOV M,A RET ;Cursor off L0919 MVI C,00100000b JR L08C1 L091D MOV A,M ANI 11101111b MOV M,A RET ;restore cursor pos L0922 LHLD LFD7D MOV A,H ADI ' ' STA LFD7F MOV A,L ADI ' ' STA LFD81 JMP L093D L0934 LDA attrib ANI 11011111b STA attrib RET ;direct cursor control L093D LXI H,0 MOV C,L LDA LFD81 SUI ' ' RC MOV B,A JRZ L0953 CPI 25 RNC LXI D,80 L0950 DAD D DJNZ L0950 L0953 MOV E,A LDA LFD7F SUI ' ' RC CPI 80 RNC MOV C,A STA column MOV A,E STA line DAD B LDED starta DAD D XCHG JMP L0815 L096F LXI B,crtadr + (ramioH shl 8) CALL L0981 DCR C MVI A,nulla OUTP A L097A INP A ORA A JP L097A RET L0981 OUTP B INR C OUTP D DCR C INR B OUTP B INR C OUTP E RET L0992 CALL L096F IN viddat RET L0998 PUSH PSW MOV A,D ANI 7 MOV D,A CALL L096F POP PSW OUT viddat RET L09A4 LDA attrib L09A7 PUSH H PUSH PSW CALL L09BF CALL L096F POP PSW OUT viddat XCHG POP H RET PUSH H CALL L09BF CALL L0992 XCHG POP H RET L09BF LXI H,0801h DAD D MOV A,H ANI 7 ORI 8 MOV H,A XCHG RET ;ESC sequences L09CB LXI H,escflg MVI M,0 CPI 1 JRNZ L09ED MOV A,C ANI 01111111b CPI 'R' JZ L0C06 CPI 'E' JZ L0C9D CPI 'A' RZ CPI 'G' RZ STA LFD7C MVI M,2 RET ;more than 1 in sequence L09ED CPI 2 JRNZ L0A05 LDA LFD7C CPI 'B' JZ L088D CPI 'C' JZ L08E7 MOV A,C STA LFD81 MVI M,3 RET ;more than 2 in sequence L0A05 CPI 3 JRNZ L0A22 MOV A,C STA LFD7F LDA LFD7C CPI '=' JZ L093D CPI '*' JZ L0DA1 CPI ' ' JZ L0DA8 MVI M,4 RET ;more than 3 L0A22 CPI 4 JRNZ L0A2D MOV A,C STA LFD82 MVI M,5 RET ;5 sequential char L0A2D MOV A,C STA LFD80 LDA LFD7C CPI 'L' JZ L0F41 CPI 'D' JZ L0F48 RET L0A3F in keyb+2 ani 00000100b jrz L0A3F mvi a,ctrlD out keyb ret ;CTRL codes L0A44 CPI cr JZ L07E6 CPI lf JZ L07FA CPI bell JRZ L0A3F CPI ctrlX JZ L06A1 CPI ctrlW JZ L06A6 CPI ctrlZ JZ L06F8 CPI bs JZ L0848 CPI ff JZ L0877 CPI ctrlK JZ L0831 CPI rs JZ L075F CPI esc JNZ L078F MVI A,1 STA escflg RET L0A8C LDA attrib ANI 00100000b JRZ L0AC9 L0A93 LHLD starta LXI D,1920 LXI B,80 DAD D MOV A,H ANI 00000111b MOV H,A MOV D,H MOV E,L DAD B MOV A,H ANI 00000111b MOV H,A XCHG PUSH H CALL L0AF0 POP D LXI H,80 CALL L0711 LHLD starta LXI D,80 DAD D MOV A,H ANI 00000111b MOV H,A SHLD starta XCHG LXI B,crtadr + (startH shl 8) JMP L0981 L0AC9 LHLD starta LXI D,80 DAD D MOV A,H ANI 00000111b MOV H,A SHLD starta XCHG LXI B,crtadr + (startH shl 8) CALL L0981 LHLD starta LXI D,1920 DAD D MOV A,H ANI 00000111b MOV H,A XCHG LXI H,80 JMP L0711 L0AF0 MOV A,B ANI 00000111b ORA C RZ L0AF5 PUSH B L0AF6 IN vidctl ORA A JP L0AF6 LXI B,ramioL + (ramioH shl 8) MOV A,B OUT crtadr MOV A,H OUT crtreg MOV A,C OUT crtadr MOV A,L OUT crtreg MVI A,nulla OUT crtadr L0B0F IN vidctl ORA A JP L0B0F IN viddat EXAF MOV A,B OUT crtadr MOV A,D OUT crtreg MOV A,C OUT crtadr MOV A,E OUT crtreg MVI A,nulla OUT crtadr EXAF OUT viddat INX D INX H MOV A,D ANI 00000111b MOV D,A MOV A,H ANI 00000111b MOV H,A L0B35 IN vidctl ORA A JP L0B35 MOV A,B OUT crtadr MOV A,H ORI 00001000b OUT crtreg MOV A,C OUT crtadr MOV A,L OUT crtreg MVI A,nulla OUT crtadr L0B4D IN vidctl ORA A JP L0B4D IN viddat EXAF MOV A,B OUT crtadr MOV A,D ORI 00001000b OUT crtreg MOV A,C OUT crtadr MOV A,E OUT crtreg MVI A,nulla OUT crtadr EXAF OUT viddat POP B DCX B MOV A,B ORA C JNZ L0AF5 JMP L0BFF L0B75 MOV A,B ANI 00000111b ORA C RZ L0B7A PUSH B L0B7B IN vidctl ORA A JP L0B7B LXI B,ramioL + (ramioH shl 8) MOV A,B OUT crtadr MOV A,H ANI 00000111b OUT crtreg MOV A,C OUT crtadr MOV A,L OUT crtreg MVI A,nulla OUT crtadr L0B96 IN vidctl ORA A JP L0B96 IN viddat EXAF MOV A,B OUT crtadr MOV A,D ANI 00000111b OUT crtreg MOV A,C OUT crtadr MOV A,E OUT crtreg MVI A,nulla OUT crtadr EXAF OUT viddat INX D INX H MOV A,D ANI 00000111b MOV D,A MOV A,H ANI 00000111b MOV H,A L0BBE IN vidctl ORA A JP L0BBE MOV A,B OUT crtadr MOV A,H ORI 8 OUT crtreg MOV A,C OUT crtadr MOV A,L OUT crtreg MVI A,nulla OUT crtadr L0BD6 IN vidctl ORA A JP L0BD6 IN viddat EXAF MOV A,B OUT crtadr MOV A,D ORI 00001000b OUT crtreg MOV A,C OUT crtadr MOV A,E OUT crtreg MVI A,nulla OUT crtadr EXAF OUT viddat POP B DCX H DCX H DCX D DCX D DCX B MOV A,B ORA C JNZ L0B7A L0BFF IN vidctl ORA A JP L0BFF RET L0C06 CALL L07E6 LDA line ORA A JZ L0C4F LDED curpos LXI H,80 CPI 23 JNC L0711 CPI 11 JRNC L0C64 XCHG LXI B,79 DAD B MOV A,H ANI 00000111b MOV H,A MOV B,H MOV C,L DSBC D MOV A,H ANI 00000111b MOV H,A PUSH H LDED starta DSBC D JRNC L0C5D LXI H,2048 ORA A DSBC D POP D DAD D MOV A,H ANI 00000111b MOV H,B MOV B,A MOV A,L MOV L,C MOV C,A XCHG L0C4B INX B CALL L0B75 L0C4F CALL L0A93 LHLD curpos LXI D,80 DAD D XCHG JMP L0815 L0C5D MOV D,B MOV E,C MOV B,H MOV C,L POP H JR L0C4B L0C64 DAD D MOV A,H ANI 00000111b MOV D,A MOV E,L LHLD starta LXI B,1920 DAD B MOV A,H ANI 00000111b MOV H,A MOV B,A MOV C,L DSBC D JRNC L0C82 LXI H,2048 ORA A DSBC D DAD B L0C82 MOV B,H MOV C,L LHLD curpos XCHG CALL L0AF0 LHLD starta LXI D,1840 DAD D MOV A,H ANI 00000111b MOV D,A MOV E,L LXI H,80 JMP L0711 L0C9D LDA line CPI 12 JNC L0D4E LHLD starta LXI D,80 ORA A DSBC D MOV A,H ANI 00000111b MOV H,A XCHG LXI B,crtadr + (startH shl 8) CALL L0981 LHLD curpos LBCD starta ORA A DSBC B JRNC L0CD4 LXI H,2048 ORA A DSBC B MOV A,H ANI 00000111b MOV H,A LBCD curpos DAD B L0CD4 MOV A,H ANI 00000111b MOV B,A MOV C,L LXI H,128 DAD B MOV A,H ANI 00000111b MOV B,A MOV C,L LHLD starta LXI D,1840 DAD D MOV A,H ANI 00000111b MOV H,A XCHG LXI H,80 DAD D MOV A,H ANI 00000111b MOV H,A CALL L0AF0 LHLD curpos LXI B,80 ORA A DSBC B MOV A,H ANI 00000111b MOV H,A XCHG LDA column MOV C,A MVI B,0 LXI H,80 DSBC B PUSH D PUSH H CALL L0711 POP B PUSH B LHLD curpos LDA column MOV E,A MVI D,0 ORA A DSBC D MOV A,H ANI 00000111b MOV D,A MOV E,L LHLD curpos CALL L0AF0 POP B LXI H,80 ORA A DSBC B CNZ L0711 LHLD starta LXI B,80 ORA A DSBC B MOV A,H ANI 00000111b MOV H,A SHLD starta POP D JMP L0815 L0D4E SUI 22 JRZ L0D7C JNC L06A1 NEG PUSH PSW LHLD starta LXI D,1839 LXI B,80 DAD D MOV A,H ANI 00000111b MOV D,A MOV E,L DAD B MOV A,H ANI 00000111b MOV H,A XCHG POP PSW PUSH H LXI H,0 L0D72 DAD B DCR A JRNZ L0D72 MOV B,H MOV C,L POP H CALL L0B75 L0D7C LHLD curpos MOV D,H MOV E,L LDA column MOV C,A MVI A,80 SUB C MOV C,A MVI B,0 DAD B MOV A,H ANI 00000111b MOV H,A XCHG CALL L0AF0 LDA column MOV L,A MVI H,0 ORA A CNZ L0711 JMP L06A1 L0DA1 MVI A,0 STA LFD83 JR L0DAD L0DA8 MVI A,-1 STA LFD83 L0DAD LDA LFD7F SUI ' ' MOV E,A LDA LFD81 SUI ' ' MOV D,A L0DB9 MOV A,D CPI 100 RNC ANI 0011b MOV B,A srlr d srlr d MOV A,E CPI 160 RNC RRC MOV E,A MVI A,1 JRC L0DD1 ADD A L0DD1 INR B DCR B JRZ L0DDA L0DD5 ADD A ADD A djnz L0DD5 L0DDA STA LFD85 MOV A,E ANI 01111111b MOV E,A LHLD starta MOV B,D MOV C,E LXI D,80 INR B JR L0DED L0DEC DAD D L0DED DJNZ L0DEC MVI D,0 MOV E,C DAD D MOV A,H ANI 00000111b MOV D,A MOV E,L SDED LFD86 CALL L0E93 ORA A JM L0E08 CPI ' ' RNZ MVI A,128 L0E08 STA LFD84 LDA LFD85 ORA A JP L0E4A LDED LFD86 CALL L0ED9 STA LFD7C ANI 00000001b JRZ L0E37 LDA LFD83 ORA A RZ LDA LFD7C ANI 11111110b LDED LFD86 CALL L0ECB LDA LFD84 CMA JR L0E6E L0E37 LDA LFD83 ORA A RNZ LDA LFD7C ORI 00000001b CALL L0ECB LDA LFD84 CMA JR L0E6E L0E4A LDED LFD86 CALL L0ED9 ANI 00000001b JRNZ L0E78 LDA LFD83 ORA A JRZ L0E66 LDA LFD85 CMA MOV B,A LDA LFD84 ANA B JR L0E6E L0E66 LDA LFD84 MOV B,A LDA LFD85 ORA B L0E6E ORI 10000000b LDED LFD86 CALL L0E9D RET L0E78 LDA LFD83 ORA A JRZ L0E88 LDA LFD85 MOV B,A LDA LFD84 ORA B JR L0E6E L0E88 LDA LFD85 CMA MOV B,A LDA LFD84 ANA B JR L0E6E L0E93 MOV A,D ANI 00000111b MOV D,A L0E97 CALL L0EA9 IN viddat RET L0E9D PUSH PSW MOV A,D ANI 00000111b MOV D,A CALL L0EA9 POP PSW OUT viddat RET L0EA9 LXI B,crtadr + (ramioH shl 8) CALL L0EBB DCR C MVI A,nulla OUTP A L0EB4 INP A ORA A JP L0EB4 RET L0EBB OUTP B INR C OUTP D DCR C INR B OUTP B INR C OUTP E RET L0ECB PUSH H PUSH PSW CALL L0EE3 CALL L0EA9 POP PSW OUT viddat XCHG POP H RET L0ED9 PUSH H CALL L0EE3 CALL L0E97 XCHG POP H RET L0EE3 LXI H,L0801 DAD D MOV A,H ANI 00000111b ORI 00001000b MOV H,A XCHG RET L0EF1 MOV A,E SUI ' ' MOV E,A MOV A,D SUI ' ' MOV D,A SUB E RZ JRNC L0EFF NEG L0EFF INR A RET L0F01 LXI H,0 MOV A,D ORA A RZ MOV A,E ORA A RZ INX H CMP D JRC L0F10 MOV A,D MOV D,E L0F10 MVI E,0 L0F12 MOV B,H MOV C,L ADD A JRNC L0F18 INR E L0F18 DAD B JRC L0F2F SUB D JRNC L0F2C PUSH PSW MOV A,E ORA A JRZ L0F28 POP PSW MVI E,0 JR L0F2C L0F28 POP PSW ADD D JR L0F12 L0F2C INX H JR L0F12 L0F2F SUB D JRNC L0F35 MOV A,E ORA A RZ L0F35 INX H RET L0F37 PUSH H PUSH D PUSH B CALL L0DB9 POP B POP D POP H RET L0F41 MVI A,0 STA LFD83 JR L0F4F L0F48 MVI A,-1 STA LFD83 JR L0F4F L0F4F LDED LFD81 CALL L0EF1 SDED LFD81 STA LFD8A LDED LFD7F CALL L0EF1 SDED LFD7F STA LFD8B MOV D,A LDA LFD8A MOV E,A CALL L0F01 LDA LFD81 MOV D,A LDA LFD82 CMP D MVI A,-1 JRC L0F81 MVI A,1 L0F81 STA LFD88 LDA LFD7F MOV E,A LDA LFD80 CMP E MVI A,-1 JRC L0F92 MVI A,1 L0F92 STA LFD89 LDA LFD8A MOV C,A LDA LFD8B CMP C MOV B,H MOV C,L LXI H,0 JRC L0FBD JRZ L0FD4 L0FA6 CALL L0F37 LDA LFD80 CMP E RZ LDA LFD89 ADD E MOV E,A DAD B JRNC L0FA6 LDA LFD88 ADD D MOV D,A JR L0FA6 L0FBD CALL L0F37 LDA LFD82 CMP D RZ LDA LFD88 ADD D MOV D,A DAD B JRNC L0FBD LDA LFD89 ADD E MOV E,A JR L0FBD L0FD4 CALL L0F37 LDA LFD82 CMP D RZ LDA LFD88 ADD D MOV D,A LDA LFD89 ADD E MOV E,A JR L0FD4 L06A1 CALL L06CA JR L0711 L06A6 MVI C,23 LDA attrib ANI line25n JRNZ L06B0 INR C L06B0 LDA line SUB C JRNC L06A1 NEG MOV B,A LXI D,80 LXI H,0 L06BF DAD D DJNZ L06BF PUSH H CALL L06CA POP B DAD B JR L0711 L06CA LXI H,80 LDED curpos LDA column MOV C,A XRA A MOV B,A DSBC B RET L06F8 CALL L075F LDA attrib ;reset attributes ANI 11110000b STA attrib ; ; clear rest of screen LDED curpos LXI H,80*25 ANI line25n ;test 25th line JRZ L0711 LXI H,80*24 L0711 LXI B,ramioL + (ramioH shl 8) ; L0714 IN vidctl ;wait for ??? ORA A ; JP L0714 ; MOV A,B OUT crtadr MOV A,D ANI 00000111b MOV D,A OUT crtreg MOV A,C OUT crtadr MOV A,E OUT crtreg MVI A,nulla OUT crtadr L072D IN vidctl ORA A JP L072D MVI A,' ' OUT viddat INX D L0738 IN vidctl ORA A JP L0738 MOV A,B OUT crtadr MOV A,D ORI 00001000b OUT crtreg MOV A,C OUT crtadr MOV A,E OUT crtreg MVI A,nulla OUT crtadr L0750 IN vidctl ORA A JP L0750 XRA A OUT viddat DCX H MOV A,H ORA L JRNZ L0714 RET L075F XRA A STA column STA line LHLD starta XCHG JMP L0815 escflg db 0 line db 0 column db 0 attrib db 0 curpos dw 0 starta dw 0 LFD7C db 0 LFD7D dw 0 LFD7F db 0 LFD80 db 0 LFD81 db 0 LFD82 db 0 LFD83 db 0 LFD84 db 0 LFD85 db 0 LFD86 dw 0 LFD88 db 0 LFD89 db 0 LFD8A db 0 LFD8B db 0 LFD8C db 0 endif end 0 LFD83 db 0 LFD84 db 0 LFD85 db 0 LFD86 dw 0 LFD88 db r L0750 IN vidctl ORA A JP L0750 XRA A OUT viddat DCX H MOV A,H ORA L JRNZ L0714 RET L075F XRA A STA column STA line LHLD starta XCHG JMP L0815 escflg db 0 line db 0 column db 0 attrib db 0 curpos dw 0 starta dw 0 LPATCH VERSION3.0 PATCH.COM COPYRIGHT 1982, DIGITAL RESEARCH151282654321:o2! *m" -< |#}0#:] <>2   : : :3! ]~. a{ ##e~ a{ ##~ 2m#~2n*m" : aB{B @2\! :\Ҥ!e~ #Z!CO"e>M2g>2 zÖ: *e}C|O:gM>2 *e}P|R:gL>2 \2 |: @: ,?<2 L*>2 ó!>2 6 =++w: #<: +=6 ?>!6 #=D!~a_{_ w#Q: Ƃ2 * 6 : ʝʯ>2 '0: =„>2 '0:S ʂ>2 '0: =±! 3 #:! ]* } 1]:]>2 >2 A: N* | :02# }0 _'_:# 2$ !]}02$ * " * " ? <͍ <ͭ* |́* }́* |́* }́2 >:" '2" {2 z2 : 2 ܻ: WÈ* |}* |}: _:$ d:$ G* |}* |}2 : {2 x < <͍ C?C C >2% % :' YPyPtz\ V xw <͍ <:$ ڶҏکÜ:$ 2) >:$ 2) >:$ 2) >:$ =2) >2* ! :* O "+ !9 :) O F*+ ~w x <͍: > > 2}!"~"\ʽtS \ _" 2 ~ B* : #=I" 2 ^C* : #=b<* }B* | B!]>I.C!e>I<:\̹@B:C<: 0B C:" 2( :" 00B:( 0B C: 9:<!e>b  9O9$9p<!>b9f<:] ͍ͣ9<!m>I#   <9ͣ< <9͍9<:\@B:C|zʒt< <1Q ̓ͮUtͳr CP/M 3 PATCH - Version 3.0$ ERROR: $PATCH requires CP/M 3$Invalid file type: .$Serial number mismatch$No file: $False password: $Invalid patch number: $Drive $ is R/O$ on $Illegal drive: $ Enter File: $ Enter Password: $ Do you want to indicate that patch $ Valid file types: COM or PRL$ Valid patch numbers: 1-32$ Current patches for $ WARNING: Patches greater than $ exist for $ has been installed$ already exists for $ Patch $None$ for $ Patch installed$ Patch not installed$ $ $: $ COMPRL151282 @!p+q*! p+q*! p+q* ! p+q* !p+q`*!p+q*_{ozg_ʊLLͿLNMLOK;LK;LJSRLOK͏ 5L N:hj!UjNLN!Oj:TjVL~2Tj2Uj%N:Ej{L!k:3sL~OS:HjK͵M N:hj:Tj!Uj©L!OjqM%N!"Fj"Ij2Sj!Sj4LO LO{ʽL!Rj6{L4+OLOL{ʽLL+OLOLLͿK:RjOS:SjOS:Tj2Uj~L>2Ej!Lj4!k4qM*k$$$*k͠HM:Kj!MjԘML{+OwM2Hj:Fj2Tj{>!IjpM#wOS:Ij†MzqM{>2Kj!Mj~4R:Tj2Nj2Oj!Mj~M66:LjM:Kj:Tj!UjʏMMM:Tj!UjM:Tj!Oj!Mj~5:Tj!Oj:Nj!Tj:vjN:{j!N:Mj>!N2hj:Lj5N:Tj2Nj2Oj:hj‡NO\N*Fj@R\N=!OjpNYNÎNM҇NOԕNMxN:LjҘM͇N:Oj!NjwOw:Tj!Njw:Kj7O:k!LjN:Pj!TjNN:Nj!Pj~N2Oj:Nj!Tj:Kj:k!LjO!PjO:Nj!Pj~2OjxN:Tj!OjO~:k.==. -g-%}O|-!FjɖІwɖHOHOІwSUOJS*k~gO#"kjOO_!DjF ʃO ʃOʃO q!{ UO!E߾ʫO!EʫO!EʫO!E·OUO#þOUO ʻOoO JS} OR} UOUO O#";*;#";;E:;!k!k(PR͙KNP*;#}%P#";kE*;}AP}DP#DP*;*;͠XP2};͙PO*k45>O(R;QQrP2};͢POͷQ;E!kog";";2;";!"~;";GP:<;; Q*~;";7>2; x*;";2;*;";";P!8͞QW *~;)|! wQ!8͞Q:};PQQ5Q!8H@!8HHP:4̬!8ͤQ>2;HP5Q:};/G:4/:;̙Q:i7ęQ:06ęQ:W6ęQ!;ĒQʏQ:k/!k̒Q͠P~ͤQHHM##H:;*;Q*k~*k#*7;̠> Q*k:};w*;*;+!*;d|i!v"/!Q/+>c!K-6*/K>XG!+>yC!Q/+>c!+Q/>r–!}o|g}ʖ!#"/!/–!/ʖ!/+>c!/ͷ~g"B,U"G-!,,> c!o0ͷX:F-!,,> c!q0ͷ~*G-w#w:F-X!s0͡!F-6*G-*G-^#V#)))"I-*B,*G-^#V))W+"B,*B,>og"@,:F-f!,,> c!y0ͷ~!{0!+Q/>r2K-*I-w#w2P/>2O/2N/!/(,>t!"N-:F-X!D,LG!),>y :#!#6!Q/D,>_:O/!N/:N/2O/2N/!P/4!}0!0*L-#"L-!0A !/*!/>X!/>Xt!D,KLG!.,>y:O/!N/f:N/2O/2N/!/>X!.,!,@!D,KL(,tî!N/4!,/>c!0!0!0n !N-~#!0̓ ã!0ͬ!D,/,>c!0~U!9"0:#Z!#6!#"/r*/>$Gt!##>Gt!#0,>Gt!#6!#6!#"0!0T!F-6!"#!D,6!06:0}͐3>!D,ͧd*0!F-6!#6*##"#*# |.!"0}20!0>!#*0"0!0U!#"0!0+!#*06*0 "0!04í!"#:+.!+6:# :# :#.~!#*#~20:0 20:0Q~:0Þ:K-z"/!0Ur"/*/ 3,>Gt!0#!D,6,> c!0ͷ~Ͳ"0~# ¦*0^#V"0*0^#V"0͕!1"1!216>261251:!12:1::1!51!!1:51og~271:21!216{:71!61281*0:61o:81OLG!1>c:81og>og}281*0:81ogW"0*0:81og####"0*0*0W*00>c*0";1!;1ͷ~>291!1n&}2=1:=1!91*1:91og"1*1~og |*1>ߦw*1~?*16_*1~@*16`!914å*0++*0)"1*11>_*0^#V"31*0^#V#r+s*1*0*0^#V)))s#r*0:61_L*0*0^#V)))>t*0*0^#V)))w#w!31#`*0*31)))^#V1j`*0*0^#V)))"1*1!1>Gt*0*31)))"1*1*1>Gt*31+"31*0*31)))^#V1j!31#T*1"1*0*31)))"1*1*1>Gt*31+"31*11>Gt:71%^}2C1:C1!A1$ *0:A1_LG!>1>t!0>1xy!0>1xy !B14:A1!!1:B1ogw!0>1xy :B12!1!A14ì*00>c*0"D1!D1ͷ~^#V"F1*F1^#V> ͍!H1 *!H1> XÓ1~# s !9"2!1"1!16*1w#w*1ng | *1KLG!1>yº !1**1~ogQ1~og)1^#V*1^#V#r+sH !11>c !1*>22*1~ogQ1~Y !11xyK !24H :2K !1!1> !1* *1*1^#Vͯ1>_ *1~ogQ1~ !1*{ !1*!11xy !1*é !1**1~ogQ1~ !1* *2:1 !16!"1*1n&"1*1"1' *1#"1*1*1W7 *1*1>Ó*1~og |c !1>ߦw !1~?t !16_ !1~@‚ !16`Y2 ~# ˆ *_2^#V"e2*c2^#V"g2!"2*[2^#V"2*2*2W *]2*2ͯ"2!2 :2 *e2*2)))~# *g2^#V#*e2*2)))s#rc *e2*2)))^#V"2*g2*2))~#K *g2*2))^#V"2% *g2^#V#*g2*2))s#r*g2^#V#r+s*a2^#V*g2^#VW !i272>!c!2ͷ~*2+|´ *Y2^#VO"2þ *Y2^#V"2*2*g2++*g2^#V))s#r*g2*g2^#V))w#w*2#"2ô 2~# *26*2LG!X2>yC *2"3*3#~>!3w:3og2~C :2 !26*e2^#V#"3!3"323!3> *3++| !"3Ñ *3>og"3*3:3og)2s#r!34d !" 3*e2^#V" 323*2"3!3"3* 3* 3W_!34:3og)2^#V" 3*e2*3)))^#V"3*2*3j/*3+" 3* 3* 3"3!36\*3*2jY*3#" 3* 3* 3W"3!36\Û :3o* 3"3u* 3"3*e2*3)))^#V"3*2*3jʛ*26*3*2s#r3 ~# ±*3^#V"#3*!3^#V"%3! ÷>2.3*3~ʟ*34*3~og"3!3A !/3*!/3>XG!3>y.!/3>X3t!/3>XG!3>y[!/3>X3t*3!3>}23:3ʐ!/3>S*3:3<_Lt*3"3!3ö*33>_*3"3!3!;3"93!3*3>!t!<3"53!L33>Gt!Q33>Gt!"'32.3*'3*#3^#VW*'3#"'3*#3*'3)))^#V!<3>p!")3*)3 |*53+*)3"73*73~ ]Æ*73~_n*736?|*73~`|*736@*)3#")38*#3*'3)))!M3>Gt*#3*'3)))^#V")32-3!)3~#ʖ:-3 ͟!<33>t!M33>t2-3!-34*%3++*)3))^#V"+3:,31!Q3:-3ogͯ3>Gt*+3O"+3M!Q3:-3ogͯ3>Gt!3A !/3*!/3>S!L3:-3ogͯ>t*%3*)3))^#V")3ø͟!.34*3~!.3!t:-3ogͯ}!;3w!;3~w*93:;3=_L3t*93!3>_!3^#V"<:F4!F46*<KLG!H<>y+!E46ð!E46!4"$Gt!'4I<>Gt!*46!>46z"!4*<@*<"r2<:E4:<>2<>2<*Gt!^<<xy;!<8!<5!<͛#E!<͛!<5:22%^}2<:!4*<@*<"!4*<@*<"2<*t!<͆!<4!<͆^#V^#V  $ "/  Later CP/M or MP/M Version Required$*#=**#={ozgY|g}o!\!l!ÍÝ3>Ý!*3>K* !*   >    !"#$%(^#V^#VF3O3*# 72gl*<"?'w#-!9~sG~#s4! 9~.Y+60e0e6 #M+r>o&9y>o&90w+Š6./G! >0 >-3T]))寕iO>`G>0 <  DM0 > Ew#E~#X~#W #Ý!9Oo>gy~#o>gxGGtwF#"WObk++~+ y~#/~!>)< D=M)6ɯo>g{ozg!dÄlmnpr Conversion2!Ä*%=|^#V"%=###^#V#N#Fxʿ #~ò*%=|^#V#N#F!9yx"%=:L# !9!#{z#  !!9:]#O!^# {#z!]#5#}OD*#=~r##~#fo9!NÄVWXZ\ Free Space Exhausted##^#V#{_zW;{_zW>4z˜{##^#V# ##s#rs#r#s#r+++~sw#r####}*#=}|5*{z5+F+N+V+5^{;{z;}|;{i`~sw#r##q#p i`N#F#^#V~;q4#p+i`##s#rA"]" FREE Request Out-of-Range$ Free Space Overwrite$GKҜMbkÜiFhNhN#Fh^#V"#y2#xүi&ͩ x>!J#{#z*#*# xyxM_!^#VͤG>(Iỳ>)I|*<|6<ͤͶò">,IG> _O! O! O!0:IIWWG|e}e ڐdԒ ͒ڝÔxWN #~Iæ!wͤ*=!9{_z{ G>#I*=>=^#V#q>: >?I!oͤͤ>=I^#V|A}8.))ä#F>A> #\~ >.~ =M^#V# File: Traceback: ERROR FIXED OVERFLOW OVERFLOW UNDERFLOW ZERO DIVIDE END OF FILE UNDEFINED FILE KEYNULCONCONRDRPUNLSTBADG!]#~8  " Condition Stack Overflow$4Ox!< w#s#r#s#r!9!^# s#r!]#N!< +++++q #{Š #zʏ ++~q ++!]#5!~# ž Ú !]#N!< +++++¹ #~# +{ #z ++~ù #^#V=!L#~9!5:L#_!M#^#V"J#~#.~# !*#)))))# )| !*~#|}*#"#:L#*J#~#w# F!*#{ `! d!!#"#Ö!Copyright (c) 1980 Digital Research, v1.3 !"!="="%=2]#2L#*'= !"=q#p##}o"#=*}o|!""+w+w+r+s4w#w#s#r<2)=++*!=s#r"!=*=#"=*=DM!!=x~¨"#~+¨"+F+Nq#p*=+"=ʣ"Ҧ"=Y"!+~O~#~G!>w!/x"yʞ" >O6# x" h"=ɯ ~#fo++"!=~#"*!="²""""  Insufficient Memory$ Invalid I/O List End of Execution$#dd(Copyright (c) 1980 Digital Research V1.3MXList SYMd$PlPRINTER busy XREF 1.3 no SYM file no PRN file CP/M PRNXRFABORTED. V́ + 1@+>  FG1"z*QS cE5T @///,,D,B,G-,Q/D,D,L-,D,D,N-P-L-N-P-G-@,I-P/O/Q/G-I-D,000//D,symbol table overflow ' invalid SYM file format 6130 = vers equ '0a' ; March 1, 2017 19:20 drm "WIN3KP.ASM" ;********************************************************* ; Winchester Disk I/O module for CP/M 3.1 on KAYPRO ; Copyright (c) 2017 Douglas Miller ;********************************************************* MACLIB Z80 extrn @dph,@rdrv,@side,@trk,@sect,@dma,@dbnk,@dstat extrn @dtacb,@dircb,@scrbf,@rcnfg,@cmode extrn ?bnksl,?timot,?getdp 0000 = false equ 0 FFFF = true equ not false ; Ports and Constants 0014 = sysctl equ 014h ;winchester disk control bits 0032 = dev0 equ 50 ; first drive in system 0002 = ndev equ 2 ; # of drives is system ; ********************************************************* ; * * ; * D a t a D e f i n i t i o n s * ; * * ; ********************************************************* ; 0080 = windta equ 80h ;1002 data port 0081 = winpcmp equ 81h ;1002 precomp port 0081 = winerr equ 81h ;1002 error port 0082 = winsc equ 82h ;1002 sector count port 0083 = winsec equ 83h ;1002 sector number port 0084 = winlsb equ 84h ;1002 lsb of cylinder port 0085 = winmsb equ 85h ;1002 msb of cylinder port 0086 = winsdh equ 86h ;1002 size/drive/head port 0087 = winstat equ 87h ;1002 status port 0087 = wincmd equ 87h ;1002 command port ; 0010 = rstcmd equ 10h ;1002 restore command 0070 = seekcmd equ 70h ;1002 seek command 0020 = rdcmd equ 20h ;1002 read command 0030 = wrcmd equ 30h ;1002 write command ; 00A0 = wincfg equ 10100000b ;ecc and sector size bits 00B8 = nosel equ 10111000b ;winchester de-select ; TODO: abstract all this to allow other drive types ; ST412 drive parameters (as used by Kaypro): 0132 = ncyl equ 306 ; total number of cylinders 0131 = lcyl equ ncyl-1 ; last cylinder number 0099 = pcmpcyl equ ncyl/2 ;starting precomp cylinder number 0004 = nhed equ 4 0011 = nsec equ 17 0200 = zsec equ 512 0004 = fsec equ zsec/128 ;--------- Start of Code-producing Source -------------- cseg ;put only whats necessary in common memory... 0000 8A00 dw thread 0002 3202 db dev0,ndev 0004 C33204 jmp init$win 0007 C34004 jmp login$win 000A C39D04 jmp read$win 000D C3C004 jmp write$win 0010 1600 dw string 0012 00004000 dw dphtbl,modtbl 0016 4B41595052string: DB 'KAYPRO ',0,'Winchester Disk Interface ',0,'3.10' 003D 3061 dw vers 003F 24 db '$' ; Both partitions use cyls 0-305, but different heads. ; head = (PTN << 1) + (track & 1) ; track >>= 1 modtbl: ; -PTN LUN--------addr------------- 0040 80000000 DB 10000000b,00000000b,00000000B,00000000B ; 0044 FFFFFFFF db 11111111b,11111111b,11111111b,11111111b 0048 81000000 DB 10000001b,00000000b,00000000B,00000000B ; 004C FFFFFFFF db 11111111b,11111111b,11111111b,11111111b ; currently, both (all) partitions are identical, ; due to head-slice algorithm for partitioning. 0050 4400 dpb0: dw nsec*fsec ; SPT 0052 051F01 db 5,01fh,1 ; BSH,BSM,EXM 0055 6504FF03 dw 1125,1023 ; DSM,DRM 0059 FF00 db 0ffh,000h ; ALV0 005B 00800400 dw 08000h,4 ; CKS,OFF 005F 0203 db 2,003h ; PSH, PSM ; Controller is already done by now win$rw: 0061 3A8800 lda cmdbuf 0064 E610 ani 010h 0066 3EB2 mvi a,0b2h ; inir jrz nread 0068+2802 DB 28H,NREAD-$-1 006A 3EB3 mvi a,0b3h ; outir nread: 006C 327E00 sta here+1 006F 3A0000 lda @dbnk 0072 CD0000 call ?bnksl 0075 2A0000 lhld @dma 0078 018000 lxi b,windta 007B 1E02 mvi e,2 here: inir 007D+EDB2 DB 0EDH,0B2H 007F 1D dcr e jrnz here 0080+20FB DB 20H,HERE-$-1 0082 AF xra a 0083 CD0000 call ?bnksl 0086 C9 ret 0087 00 offline db 0 ; fatal error prevents use 0088 00 cmdbuf db 0 0089 00 romid db 0 008A = thread equ $ dseg ; HASH/HBANK is set by main bios... dphtbl: 0000 0000000000 dw 0,0,0,0,0,0,dpb0,0,alv0,@dircb,@dtacb,0 0018 00 db 0 ; HBANK 0019 0000000000 dw 0,0,0,0,0,0,dpb0,0,alv1,@dircb,@dtacb,0 0031 00 db 0 ; HBANK 0032 alv0: ds 512 ; really only need about 283 0232 alv1: ds 512 ; ; driver init init$win: 0432 AF xra a 0433 328700 sta offline 0436 3A5000 lda 0050h ; gift from loader: ROM id 0439 328900 sta romid ; TODO: move to login code, for each LUN... 043C CDF204 call winrest 043F C9 ret login$win: 0440 3A8700 lda offline 0443 B7 ora a 0444 C0 rnz ; This should prevent read/write from ; ever being called ; TODO: check init flag (per LUN, not partition) ; and call winrest (anything else?). ; Could always select LUN and test READY. 0445 C9 ret setup$win: 0446 2A0000 lhld @cmode 0449 7E mov a,m ; PTN 044A E603 ani 00000011b ; max 4 partitions 044C 87 add a 044D 47 mov b,a ; -----HH- 044E 23 inx h 044F 7E mov a,m ; LUN 0450 E660 ani 01100000b ; only 4 LUNs, not 8 0452 0F rrc 0453 0F rrc ; in position for SDH 0454 B0 ora b 0455 47 mov b,a ; ---DDHH- 0456 3A0000 lda @trk 0459 E601 ani 1 045B B0 ora b ; ---DDHHH 045C F6A0 ori wincfg ; eSSDDHHH 045E D386 out winsdh 0460 CD7205 call winrdy 0463 C8 rz ; timeout 0464 3E99 mvi a,pcmpcyl 0466 D381 out winpcmp ; This is horrible, but since 302C ROM does it ; we also must to keep compatible on disk: ; if (trk > 7) trk += 4; ; else if (trk >= 4) trk += (trk - 4); ; trk >>= 1; ; putCyl(trk); 0468 2A0000 lhld @trk 046B 3A8900 lda romid 046E FE33 cpi '3' jrnz setup2 0470+2015 DB 20H,SETUP2-$-1 0472 7D mov a,l 0473 E6F8 ani 11111000b 0475 B4 ora h jrz setup1 0476+2806 DB 28H,SETUP1-$-1 0478 110400 lxi d,4 047B 19 dad d jr setup2 047C+1809 DB 18H,SETUP2-$-1 setup1: 047E 7D mov a,l 047F FE04 cpi 4 jrc setup2 0481+3804 DB 38H,SETUP2-$-1 0483 D604 sui 4 0485 85 add l 0486 6F mov l,a setup2: 0487 B7 ora a rarr h 0488+CB1C DB 0CBH,18H+H rarr l 048A+CB1D DB 0CBH,18H+L 048C 7D mov a,l 048D D384 out winlsb 048F 7C mov a,h 0490 D385 out winmsb 0492 3A0000 lda @sect 0495 D383 out winsec 0497 3E01 mvi a,1 0499 D382 out winsc 049B B7 ora a 049C C9 ret read$win: 049D 3E20 mvi a,rdcmd 049F 328800 sta cmdbuf 04A2 CD4604 call setup$win jrz error ; timeout on READY 04A5+2848 DB 28H,ERROR-$-1 04A7 3A8800 lda cmdbuf 04AA D387 out wincmd 04AC CD8205 call winbusy jrz error ; timeout on BUSY 04AF+283E DB 28H,ERROR-$-1 04B1 DB87 in winstat bit 0,a 04B3+CB47 DB 0CBH,0*8+A+40H jrnz error ; ERROR set 04B5+2038 DB 20H,ERROR-$-1 bit 3,a 04B7+CB5F DB 0CBH,3*8+A+40H jrz error ; no DRQ 04B9+2834 DB 28H,ERROR-$-1 ; no more errors from here on... 04BB CD6100 call win$rw ; xfer from common memory... 04BE AF xra a 04BF C9 ret write$win: 04C0 3E30 mvi a,wrcmd 04C2 328800 sta cmdbuf 04C5 CD4604 call setup$win jrz error ; timeout on READY 04C8+2825 DB 28H,ERROR-$-1 04CA 3A8800 lda cmdbuf 04CD D387 out wincmd 04CF 110000 lxi d,0 04D2 2603 mvi h,3 write1: 04D4 DB87 in winstat bit 3,a ; DRQ 04D6+CB5F DB 0CBH,3*8+A+40H jrnz write2 04D8+2005 DB 20H,WRITE2-$-1 04DA CD4E05 call timer jrnz write1 04DD+20F5 DB 20H,WRITE1-$-1 ; timeout - no failure here? we'll get error from winbusy? write2: 04DF CD6100 call win$rw ; xfer from common memory... 04E2 CD8205 call winbusy jrz error 04E5+2808 DB 28H,ERROR-$-1 04E7 DB87 in winstat bit 0,a ; ERROR 04E9+CB47 DB 0CBH,0*8+A+40H jrnz error 04EB+2002 DB 20H,ERROR-$-1 04ED AF xra a 04EE C9 ret error: ; possible retry... ; possible recovery - step, restore, etc. 04EF AF xra a 04F0 3C inr a 04F1 C9 ret ; ; WD 1002 interface routines. ; ; Written by: T. Hayes ; ; These routines provide the physical interface between the system ; and the WD 1002 winchester controller. ; winrest: ; ; Reset and restore the winchester disk ; ; On entry: ; B contains the configuration byte of the drive to be accessed ; ; On exit: ; A and B contain the configuration byte altered as follows: ; Bits 2 and 3 will be set if the drive is off line ; or reset if the controller is ready ; ; 04F2 DB14 in sysctl ;first issue a controller reset setb 1,a 04F4+CBCF DB 0CBH,1*8+A+0C0H 04F6 D314 out sysctl 04F8 F5 push psw ; 04F9 2601 mvi h,1 ;hold reset for > 50 ms 04FB 110000 lxi d,0 winrest1: 04FE CD4E05 call timer jrnz winrest1 0501+20FB DB 20H,WINREST1-$-1 0503 F1 pop psw ; res 1,a ;select controller (MR off) 0504+CB8F DB 0CBH,1*8+A+80H 0506 D314 out sysctl ; 0508 2603 mvi h,3 050A 110060 lxi d,6000h winrest11: 050D DB87 in winstat ;Check busy bit 7,a ; 050F+CB7F DB 0CB public @lptbl cseg @lptbl: db 50, 51, 33,255 db 255,255,255,255 db 255,255,255,255 db 255,255,255,255 end MBIOS SUBUKEYBD ASM#VWRM SUBXCENTR ASM YZ80 LIB.Z[SERIAL ASM\WORK CRT ASM]^_`aWIN3KP ASMGbcdLPTBL $$$ { *$'symbol table reference overflow 22i2 0# +333lXRF.XRF make error  '.XRF close error .XRF write error <<<_<<b:$ 2) >:$ 2) >:$ =2) >2* ! :* O "+ !9 :) O F*+ ~w x <͍: > > 2}!"~"\ʽtS \ _" 2 ~ B* : #=I" 2 ^C* : #=b<* }B* | B!]>I.C!e>I<:\̹@B:C<: 0B C:" 2( :" 00B:( 0B C: 9  g h   n qQU  v( DF S  .   O dl s `   dh d4h Q  h  R UH  CFM(Q. dRL'-mrY.m48'a   m N ( $` bdh lm    'N(F1 H Mt-Q$ (8+ CT 1 1?:P2ÄCP/M Version 3.0COPYRIGHT 1982, DIGITAL RESEARCH151282654321 ERROR: $ $ Press RETURN to continue $ $Reading HELP.HLP index.$Too many entries in Index Table. Not enough memory.$ $ Creating HELP.HLP....$$ HELP DATHELP.DAT not on current drive.$Too many entries in Index Table. Not enough memory.$$ HELP HLPUnable to Make HELP.HLP.$Writing file HELP.HLP.$Writing file HELP.HLP.$Closing file HELP.DAT.$Closing file HELP.HLP.$HELP.HLP created $ Extracting data....$HELP HLPUnable to find file HELP.HLP.$HELP DATUnable to Make HELP.DAT.$Writing file HELP.DAT.$Unable to Close HELP.HLP.$Unable to Close HELP.DAT.$Extraction complete HELP.DAT created $ Topics available:$ ENTER .subtopic FOR INFORMATION ON THE FOLLOWING SUBTOPICS:$ $ $ $Reading file HELP.HLP.$ HELP> $Requires CP/M Version 3$,HELP HLP HELP UTILITY V1.1 At "HELP>" enter topic {,subtopic}... EXAMPLE: HELP> DIR BUILT-IN $? HELP Topic:$Not found$No HELP.HLP file on the default drive.$1?1?!E6!,6͈"-*-|*-}0HҷN1=2/1<_! p{201!C6!C6ͷ 2j:A+::BJ: \u\͡2 :?/;1X:j\!)6X!,62j:j&!)61x͛zdʛ͚=x͛˜!)6,V 2E H:E/ ,V 2E:E/ IX,V 2E H*jM.,V 2E H,V 2E HPX,V 2E H!)6:E/2j\\2D:ZNEv!Kq*K&!Mp+q*L !Op+q*N !Pq*P& !Rp+q*Q!Tp+q *S 6 *S 6*S!Vp+q*U!Xp+q*W!Zp+q*Y!\p+q *[ 6 *[ 6*[!^p+q*]!!`p+q*_!bp+q*a$!er+s+qX*dDMXX:ctE!jr+s+p+q+q*f*gDM*i -’!nr+s+p+q!o6#6:p *p&*k~ H *p&*k*p&*m  *p&*k*p&*m !o6 !o6!p6 :p<2pí:o!qq:q<2q>!qR \H !q6R !E6!q6:q!sp+q!t6:@/!C *r~<*rwO:/ X*r6*r~ž x*rwÉ X*r~½ \*rwE *r~ !t6*r6  H *r6 H:tͼ"u*u"w!{6!"y:{/>!wH҇ >y)))) DM%\O \o&"yN*y)))) ~$e !{6:{/҄ >w+s#r*y"y %>w:{/HҶ \o&"yN!|6:! !|6:!| *|& ~ *|& 6 *|& ~, *|& 6 :|<2| !|6!:|*|& ~ HA :|<2| *|& ~.d :)2}*|& 6 i !}6:}2|> !|ڛ *|&͏x u:|<2|o :}2|!~6!6#6*~& ~:/H! *~& ~  !6*~& ~ *~& ~[H*~& ~H: :| HHҥ *~& >`*~& ~{Hp *~& ~ *|&͏x *& HqÔ *~& *|&͏x *& w:~<2~:<2 :|<2|> !|! !6 *~& ~[ :|=o&͏x ~ :|=2|*|&͏x 6[:~<2~:|<2|!6 :~<2~î !?6#6#6#6>!|'!6: '*&͏x ~[*&͏ ~C !A6:|==2|*&͏ ~E¤ !B6:|==2|*&͏ ~N !@6:|==2|*&͏ ~L !?6#6:|==2|*&͏ ~ :|==2|:|=2|!6 :<2= :|&X!6>!` *&)))) >u:<26!6>#w#6ͼ"*" \Ju\͡WN!E6:E/\H"!6:ր:E/H*& ~!E6*& ~/!6:E/*& ~/H**M! 2:<2::E/H*& ~0*))))  w*M! 2!6: :E/H*& ~ H*& >`*& ~{H*& ~ *)))) *& w*& *)))) *& w*M! 2:<2i:E/\5*))))  }u*))))  #~u*))))  N#F *))))  q#p*))))  :w*#"*!p>ͭ:<2>+s#r>:E/H\2vN*"*! *)))) u*"*M! 2þâ%:<2 u͑lF2F͑\2NfuF2!"*+!*))))  :d*))))  q#p*"҇!":=!6!ͣ DM%)2͑F2F͑\2N*"|u\2!E6:E/!"*":E/>!HҴ!ͣ DM%\ʝ!E6ñ>+s#r*#"d!"*+!!ͣ DM%2͑\2N*"ҺP\02NC*NBXUX \ku\͡oxN FuF͑F\2N%!6\2:/H:Y$!6è!E6:!E6F2ͼ":E/ҽ!"*":E/>!H]!ͣ DM%\F!E6Z>+s#r*#" !"*+!ں!ͣ DM%FʭF2F͑\2N*"c\NFF͑NX!"}22:)<2: ,:)!"#**"!"1!6*"!":/G*)))) ~$^!6D*))))  :!:/Ұ!6,V 2:›0XáCX,V 2X**0&p>ͭ,V 2 H!6> !*& 6 :<2!6$ *)))) DMuX*#"=*))))  ~!=!6*#"=:],V 2X%!6#6!6#6!":/:/HҼ*)))) ~$ʴ*))))  :)<{*)&͏x *)))) ͛2:q *)))) *)&͏x u:)<2):/:)2!6>!)n&͏x ~ H*)&͏x ~[Hb!6!6n*#"!6x*#"ñ:Ҫ*))))  :Ң*#"ç!6ñ*#"ù!6z:**#"**))))  DM}u*))))  #DM~u!6*))))  ~2D*))))  ~2):!q!6!::E/Hҙ,V 2E:E/Җ!6:!{X:<2a*&͏x DMX:<27 H*)M.:E/ҷ,V 2E:E/\\2DN!6:/:E/H\H:D=2:<2O>/:/H*& ~29!E6!6:/:E/H:*& ~/HHҗ:<2*M! 2*& :=O! w>:§!6ò*& 6$:E/:/H: :@/H,V 2E*MH>!X!6 !D6!E6u,V 2Xh*& 6!,6ͷ 2::?/H_1X:_ogDM!>))덑o|g҉ =wDM!>))Ҟ =–^#V) §_{ozgi`N#Fogo&og_{_z#W $h    KU   &(S) -2G9 m rh "$   E&n(* R+,@ q GHmN R12Q 8k s (D , ./ b N @DHNDKN(1 ND3   H N6H dh QkQh (     S .  M DH Rh +H n    Q $* . 48 #HmK( Q  B4  n&rH'-.dq (  S&'( fNDA DE HmnN   .  M  QTDH K&. L  &  +  , / R $+ . "dB H$  , 3cdh1n$'CP/M Version 3.0COPYRIGHT 1982, DIGITAL RESEARCH151282654321!`i^#V#~#foͽ{¡y#wG:xA##6?)@w){#{s333333.;;33,;;#wD{_#6 sO O ڹ.:;=,/[]<>a{Ҷ_#  ý Copyright (c) 1982, Digital Research 11/02/82 @ @NULL0LOADER0SCB []=, :;<>%\|"()/#!@&+-*? COMHEXRSX1###~ERROR: FILE: File not found.No directory space.Invalid file name.First submitted file must be a COM file.Duplicate input RSX...Duplicate RSX in header. Replacing old by new.Invalid RSX type.No more RSX files to be used.Error on copy.There are not enough available RSX slots.Disk read.Disk write.Total file size exceeds 64K.COM file found and NULL option.No header or RSXs to strip.Invalid 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$" %* %|<Ó* %}0HÓ::$]Ç:$jZÇ:$wÇ:$҄ZÇer ͺv!n$q*n$& ͤ!p$p+q*o$~*o$Nͤ*o$#"o$  ͤ ͤ!r$p+q*q$DMͺ !t$p+q*s$!v$p+q*u$!x$p+q*w$!}$p+q*|$"y$*y$}2$|2{$!~$q*~$&,2$!$p+q*$!$p+q*$!$p+q*$!$p+q*$!$p+q*$!$q*$&-!;6:$!; *;&') N#F:2$!;4%:2$%ͻ2$!;6>!;S*;&/% 6!;48!/%6 !;6#6:; *;&*(~ HҞ*;&*(*;&/% w!;4#4`*;&/% 6.!;6 :; *;&*(~ H!;4#N*( *;&/% w!;4î!;p+q3r*;DMͺz/%ͺ!;p+q*;DM *y$}2;|2;:; F  :; T   :;x :;j $ :;x 4 !;q!;6*;&1 :/• >*;&1 :;© :;!;4 !;r+s+p+q+p+q !;6. *;~ *;~2;*;My 2$!;6:$ L :;  *;My 2$ ! . :;2$͌ :;2$2;*;~2;!;6*;~2;. *;~L ç *;N! *;*; =2;!;› !;6!;6:;!;ژ L :;ڑ 6 !;4z Þ 6 *;6͌ *;:;w:$$͂#+s#r :$ *$#"$ :L2$:;2;O*; ~2;*;&*;:/( !;4*;:;w*;&*;:; *;&*;~2; *;6*$~2; :;2;!;6*$#~2;!;4N*; :0f !;6| *;&*;:;| !;6!;4N*$ ~2;*;&*$~2;*;My 2$:$:$H:$H:$H !;4N*$ ~2;*;My 2$ä :;2$$͂##+s#r*$Ny 2$!L *$#"$ :$$#+";!;6:$!;P *;Nͤ*;#";!;41 !;p+qr*;DMͺ!;r+s+p+q*;DM͗ *;DM͗ *;~w*;*;~!;p+q*;>9Ұ *;~7w÷ *;~0w!;r+s+q+q*;:;~!;H IQ !;60!$6!;6*$#"$;+ͱ :;" rͺ :;2 !%6? :;? !%6:$H :$Q :$ˆ :;} rͺ;+ͱ È aͧ !%6:$‘ :$š :$£ *$#";*;Ny 2$ *$DM*;i *:&: w*$##"$ *$;i *:&: w*;"$!:4*$Ny 2$\Q *$#"$*$Ny 2$:$1*$#"$*$Ny 2$!L:$IY!M:$YwQ *$#"$*$Ny 2$!N*$#"$9*$0͸ *$#";*;Ny 2$!L:$£!M:$°6*$0͸ F*;0͸ *$DM*;i *:&v: w*$##"$2*$;i *:&v: w*;#"$Q !;p+q*;DM*O>0*;"( !;p+q*;DM:O>R*;"( !;p+q*;DMJ2$>!$y*;"( *( >Š*(DMͻO>ҟ*("(!;p+q*$"%*;"%*$"'%̀"$$#*'"( !;q!;6>!;*;&)))=% *;& *;& w!;4!;6 >!;F:;2;*;&; 6*;& 6!;4!;6> !;ڍ:;2;*;&% *;&; w*;&*(*;& w!;4K;ͫ2$>!$ҥ*'"(!;p+q!;6 >!!;*;&*;6!;4±!̓#+s#r!<5&*<$T :{$]*(DMZ!#:Q! <#:Q2<* !<ړ*<&* (6!<4w* (" (!<6*<&') ^#V"(x*(DM͋2$!)"<*<*<&$) N#Fq#px*(DM͋2$:)!)6*<&9 :)w!)6!)6!)6%͛2$!"$$*$*$"$!<4:$GT*<$#ã!!<ڸ*<&: 6!<4!\"<$w#s#r!n"<$w#s#r.:[ -!<6>!:H!<6::=! 50 ms 04D5 110000 lxi d,0 winrest1: 04D8 CD2705 call timer jrnz winrest1 04DB+20FB DB 20H,WINREST1-$-1 04DD F1 pop psw ; res 1,a ;select controller (MR off) 04DE+CB8F DB 0CBH,1*8+A+80H 04E0 D314 out sysctl ; 04E2 63 mov h,3 04E3 110060 lxi d,6000h winrest11: 04E6 DB87 in winstat ;Check busy bit 7,a ; 04E8+CB7F DB 0CBH,7*8+A+40H jrz winrest3 ;go on if not busy 04EA+280B DB 28H,WINREST3-$-1 ; 04EC CD2705 call timer ;else count down jrnz winrest11 04EF+20F5 DB 20H,WINREST11-$-1 ; disable: 04F1 AF xra a 04F2 3D dcr a 04F3 328700 sta offline ; disable drive... 04F6 C9 ret ;and return that status to caller winrest3: 04F7 DB81 in winerr ;check for diagnostic errors 04F9 FE01 cpi 1 ;if error jrz winrest31 ;ignore "diagnostic only" errrors 04FB+2803 DB 28H,WINREST31-$-1 ; 04FD A7 ana a ;believe all others jrnz disable ;abort if an error shown 04FE+20F1 DB 20H,DISABLE-$-1 ; winrest31: 0500 CD2105 call winpsel ; 0503 CD4B05 call winrdy ;ready wait jrnz winrest32 0506+2005 DB 20H,WINREST32-$-1 0508 CD4B05 call winrdy֎ %`X hxzt( dR'sIh2ΆSi9qr3LfQf."??LG  ubP,Ut3@P@'j: }ٵ%T d* )q"eaEĀ3w#$uaH?9hr808sVeM @eepAՉ S @d0 >#X7aXtBhQA-4ݒ> @7# Ct(|C,(3k> @7# C@0 eVnN=YEGx 20L ܜ }YhPL ;,(rp(8%E58 s(>4 (m8XpJi!̀%dЏ B"hB-4 CGˆ&@w`3rp+ 0 m/e ܜ =#A"0PM%4 R`M R2Pc. 9.0U#EQ 4VTУM I 0ӑH 5=3Г#Q%5=R0U'NB: IN fdcstat ; poll controller for function-complete RAR ; Busy? JRC WNB ; wait until not busy. RAL STA @dstat ;S ( w*<&') ^#V"(!<6>!!%(z:$/H!"$$#͞%U!$6̓!"<6:"<#ڀ*"<&( 6:"<<2"<_!"<6:$!"<ک*"<&$) >w#6:"<<2"<…!(" (* (:Ow:%/* ( :Ow* ( 6* ( :$w!"$:%:O2)x* (DM%͛2$>!$!%"( ):%/i:$R%͛2$*("(!"$$fx%͛2$!"$o!"$*$*$"$/!##"$*$DM*#w#6!)" (%͛2$* (##"*<**!(<ڋ*&<&)))9 *(<& *'<&)))9 *(<& w:(<<2(!(!%< *%<& * (*$<&)))9 *%<& w:%<<2%<!)" (!$6!,<6:$!,<*,<&$ 6!-<6:$!-<ں*-<&') ^#V"(!.<6>!.<ڑ*.<& * (*.<& *(ʇð:.<<2.!$:$_!)" (!,<6:$!,<r:,<<2,<* (#^#V"0<:$5~ *( 6x*(DM͋2$!0<#"$%͛2$*$DMi*0<"$/>>!)" (* ( ~2$ʃ҃* ( :$* ( w*("(* ( >Ҭf %͛2$:$~!"$$!"$$#*$"$*(DM1͞%U̓!)" (*("(!"$:%N:%/!$N!)6 *( 6*(DM͛2$:$H !"$:%1:$d~õ:$ʚ x*(DMZ:$ʚ:{$$͂#+s#r*(DMZy:{$$͂#+s#r!$#+s#r*(DMU:$/1*(DM1x*(DMͦ*(DM*(DM͋2$.)$ -:% !)6:O2) *( 6*(DM͛2$:$1 *(DM1!"$!3<6>$#_"*(DM͠*$~[h*( ~25<>!5<!6<6!4<6:5<=!4<*6<&*(*3<&)))=% *4<& w:6<<26<:4<<24<†*3<&% :5!%**(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<Ÿ :3<<23<0 !$:$ !9!3<6!$:3<҄!*3<&$ ~24<:$=2$:4<26<:$!6!$ҹ! !O:) ":$!!$6!:%!%!!$6!!$6:)"!$6.;) -!2":$"!$62":%!%,"!$62" :"!$6:$/^"%ͦ%ͻ2$*(~2%%S!*3<&ͮ#% "(*3<&') q#p!4<6> !4<ڱ"!*3<&ͮ#% *4<& 6:4<<24<…" *$&$ :3 !6<#*5<&*7<*6<&*( w:5<<25<:6<<26<"!: !6:5<<25<:6<<26<:#>i`N#Fog_ogDM!>))덑o|gҨ# =–#DM!>))ҽ# =µ#^#V) #^#V|g}o #O{ozgi`N#Fogo&og_{_z#WTEMP $$$n  (    !N$dh ' HH ,. / K" +-.(rKMA"dh k o# h %dh  F(Lh d-Hmth  rMR2dh dkm3H 5 H  6dh 8N9Hkmdh dRh Sh   nt#  H     T  $`dh ,. R/2  de 3H5DLA" $,H   h R -h J  /  2HhkmR 3H     pSdh " dN T( , -H.d dh Oh 02adgh lnq  v 34 hAdh DH dh 9 a e #kmrH$dks(h + ,k LOk- /@ dh N`3( . R/` h n2     ! (`kMRӲ 4 # h &   ,   /  QHu  T     (4  n  t '-  m !" %(/H   BShnDH ңKh ҤS%(Mt TDHm1 D  H 7 CP/NET 1.2 Status ================= $Requester ID = $ Network Status Byte = $ Disk device status: $ Drive $ = Drive $ on Network Server ID = $ = LOCAL$Console Device = $Console #$ on Network Server ID = $LOCAL$List Device = $List #$ on Network Server ID = $LOCAL$ CP/NET 1.2 has not been loaded.$1?!9"g!g.>5ʐͰ"p,Ͱ*p#N <ͰO UͰ!n6>!nmͰ:nAO͠:͠*n&) *pn}2ovͰ:oAO͠:͠Ͱ*n&) *p#~O Ͱ!n4†Ͱ"*p n}2o@Ͱ:oOͰ"*p #~O FͰͰ$*p n}2oʇͰ:oOͰ$*p #~O Í ͰÖͰ͛v*g!iq*i&!kp+q*j  DE ͠ ͠!lq> !l:lA O͠ :l0O͠!mq:mO:mOH͠_{ozg_{ozgNDOS3 COPYRIGHT (C) 1980-82, DIGITAL RESEARCH NDOS Err $, Func $h T$  (   .  Q1HN4M `  h   LM OS tdh $ C H u K LM    O (C h tLOR  DGH +lq  rD H   u.K L    M  `    ntT1  l or Hh  4h     ҬDH D rKMұR   h Lh T $  B M  r    d  l q  (  B   DK  h M h    + D. Q1 NKM4 H r$    1  D h8  &dh 3 $ T  d$ F  Sh A    B h F   LM  p  Q U  ./ 3N4h Fh RW5H    M Q $MQ(KRB  F Kh      Q   Sh 4 q8    (DY,-.      Sh T  m   krH @DHmrT4M  5H      $        Q  ( + D N     .  Rh   1 D   c r    H  34hM   !$K(Ch R U  h ,H.1d5"D    Q   $ F MQ u ' (F    Q  h nR, .   / sD  H r sN  m   23   sQ  t   4K   H  $   Mf  h  l       q  R ' .  T1 H  N3  R    R  $     ( s  Bdh N  Rh . KS h T  #$(  Q N  " #&   N *|?  W{'_z 'J|g>?%'%,.Ja SƐ'@'_K TPA $ 4h M  (     t+,rH /  &HmK( *-H .#& X1 7' +  . /H B       EKR&(   k   tC   E    F    K O          Q   q R  s U!    D   T   @D    G  H     K n  Nklm              q  s t       u   Q      h      T r   #  $LM f  s  %H   &Q  t  T r @  D   uN    V (     M   e gs     )T DH +  N   c  x, m    D    H N  - .   Q   f  h V/    r  s  D  m ead too?) ; for now, assume only LUN 0. ; 0521 AF xra a 0522 F6A0 ori wincfg ;select ecc and sector size options ; 0524 D386 out winsdh ;and issue the select 0526 C9 ret ;return to caller timer: ; ; General down counter routine ; ; On entry: ; HDE are a 24 bit counter ; On exit: ; The counter will have been decremented ; zero is set if the counter is done ; zero is reset if the counter is not at 000000h ; ; Typical timings are 25 t states in the loop with an additional ; overhead of 29 t states in the calling routine. This assumes ; that the calling routine is using a call xxx and jr nz,xxxx. ; This gives a time of 13.5 usec for each iteration of the loop. ; Times when de goes 0 will be marginally longer but should not ; be significant. ; 0527 1B dcx d 0528 7A mov a,d 0529 B3 ora e 052A C0 rnz 052B 25 dcr h 052C C9 ret ; TODO: make use of this somehow... winoff: ; ; If the 1002 is not at 305, seek track ; 305 then select physical unit 3. It is assumed that ; the host buffer has been flushed. ; 052D DB84 in winlsb ;see if the drive is at 305 already 052F FE01 cpi high lcyl jrnz winoff1 0531+2006 DB 20H,WINOFF1-$-1 0533 DB85 in winmsb 0535 FE31 cpi low lcyl jrz winoff2 0537+280D DB 28H,WINOFF2-$-1 winoff1: ; 0539 3E01 mvi a,high lcyl 053B D385 out winmsb 053D 3E31 mvi a,low lcyl 053F D384 out winlsb ; 0541 3E70 mvi a,seekcmd ;now issue a seek to that cylinder 0543 D387 out wincmd ; 0545 C9 ret ;return to caller winoff2: 0546 3EB8 mvi a,nosel ;now deselect the drive 0548 D386 out winsdh ; 054A C9 ret ;and return to caller winrdy: ; ; Wait for device ready ; 054B 65 mov h,5 054C 110000 lxi d,0 winrdy1: 054F DB87 in winstat ;check for ready bit 6,a 0551+CB77 DB 0CBH,6*8+A+40H 0553 C0 rnz ;return if it is ; 0554 CD2705 call timer ;else count down 0557 C8 rz ;return if timed out 0000 @LPTBL A$w#Y$  : ! ܌ : 2: 2: 2>2 : ͤ G: x(dNG2 !m : ͤ O : ͤ =(G o>g"::2 :2 :2 *m>2 x 7R0x >2 7ZxNd8dͲ 2 xͲ 2 ! {Oz8 YW#x 8xͲ 2 2 {Ͳ 2 : ͤ W: ͤ B(0 O= 0 : ͤ 88O: ͤ G ??OQ D(0y xy(DGy<2 > >$ !  A~$# w++~'w0#~'w+ GOxGd0d 0 !!!!!  y2j! ~(k2kOC͗8a2l"m^#V#N#F:lo& "o@ AO :lO "q 8)2 >͑ :  8:jO! [qs#r!:jO! ^#VSq*o~ #>(#~(>MOG#n( !C [q! N#F ! F ?2 :j! <=( MD!q#p#6^#V+ɷ*o~7*qq#p N#fiC C Cs:A2 i`z n&+a  2 * " * " *o~ ###v(~! O N#fi{*m : ?O! ~O/ͧ q! >!ͼ ! : wK : D=2 >2 2 ɯ@!%")1-1O5^9m=A2-K:-*o~G#~`G* }ӆ>Ӂ}ӄ|Ӆ: Ӄ>ӂ> 2.;(H:.Ӈ(>ۇG 8_(4>02.;(%:.Ӈ&ۇ_ ͧ (ۇG ɯ<&ͧ ˏ&`ۇ( ͧ =2-ہ( ͡ (>Ӈ(ۇG կ2-ɯӆz%ۄ ۅ1( >Ӆ>1ӄ>pӇ>ӆ&ۇwͧ&ۇ/ͧ7w[*o##"2~S~ :̖:!" " *|"s2 2 2>2>2ʣ~ˆ>22~w( ~wÈ*|#<(:ʍ~wÈ*|FN66~ .` !V( *|~  pqÍ~_( O(G(*oˆ*qqpn f *| *|~G?ڂ q#p>2!68=8Hnnj:c0 ( *#nˮ>2 =8>2*o##"a8:<: >2S dD$@@Z2_ I0|! 57!#57~ 00>2=:HnX1>  .Hn - n>>:082c>: O滱KEYBD DCE DTE MODEM !dxO +~~0W_~G><@G~ ː+~_##N >yAyQ6(NxN yxyS(NyN++ >yx8g(˧_(+p xɯ@ CRT !$ w#*A"$*D"$*F"$>:$y ږy[$:$@2$*$:$_W2$R6:$8<2$*$PzW"$K$B0 :$ȷ=2$*$PR:$ :$(=2$>P=2$[$>O2$*$O:$OG[$<2$!$y0(=(=(=(=(=(%=(0=(4~w~w~w~w`> y:$2$>@2$*$"$:$ 2$!$y0(=(=(=(=(=(=(!=(0~w~w~w~w ~w*$| 2$} 2$Í:$2$!M:$ G( P_:$ PO2${2$ [$e >yxA Q A YͿzWͿ:$ Ϳ !|g!$6 yRL E AG2$6 :$BC7y2$6 y2$:$=ʍ*! !6 y2$6y2$:$L#Dʆ#(> 6 J(&$+$_$ʘ  ʁ$>2$:$ (6*$P|gT] |g6!Px$*$P|g"$ *$P|g"$ *$|g!Px$x<x|y}>Uxzy{>#zW|g{x|y}>xzy{> x;E xx|y}>xzy{>#zW|g x|y}> xzy{>++ xE 6:$ʕ [$!Px$ 0DO |gDMR|g[$R0#!R|`G}iOͻ*$PePYDM|W]*$ |gGMR0!R DM*$6*$0|W]!Px$:$ Ҕ!*$PR|g *$K$B0!B|gK$ |GM! |GM*$0|g!P|g6*$PB|g:$O!PBx$*$:$_R|W]*$6!PBx$*$PB|g"$e(*&$D*$/P|W] |g! = DMͻ*$T]:$O>PO |g6:$o&x$&$>2$>2$:$ _:$ WzdG::{_>8(2${_*$BKPY|W]S$"K" >2$:$"[$#2$(:$:$[$ #:$/7:$:$ #:$/$[$# #:$( :$/G:$:$G:$[$":$( :$G:$:$/G:$zW"zW"" >yx"A Q A Y##"##"!Q|g{ _z W0D2$>2$[$/#S$2$[$/#S$2$W:$_?#:$W:$>8>2$:$_:$>8>2$:$O:$DM!8(.u#:$:$_ 0:$Wu#:$:$W 0:$_u#:$:$W:$_O$M:$  :$0DGP!O$ )!P[$:$OGB$:$2$[$! (!{$xzWy{>$> $xzy{>$+| ɯ2$2$*$eLPT >%(y@@$R_$_$U $ [?  (   @(@?  (   ;@(@   @   ;@P P (?(?( ֎ TE%hAIZ@RDRVPQ`DE$M R@LOGINP`TD$ 9R@SCRBFPРdD$4(MQR@CMODE d$4dx Q 2@CBNKe$U4D8] QIB@VECTSU`e4%dXA%=Y?TIMOT cE%D$ 9-M2?STBNKQMi < ø :Tê`L:îL:ëL< `< @< = óL< ò@L:^òL;^âL=<& å l:ÿ`L< ãl;.``Z-mK\@%`?@>o  f߰#-4`Li 04`Li 04cCU@2ipve`20s`#rD Cg#eWPVF~hOqV6b1A;H;H, {`/i4#ieXFzY-Xpݒ!`,qe;qe;qe;qe;qe;qe;qe;qe;T P@*A 00KvH,XC}A%Xt T3nHF5B7 eU(|f%&j*`A3nHN@+qC|fޠ 4T0 ے `,H>7/L&>- U[Us U r@7 e[!0;;n(oKO vKDuP@kKF4f߰'ժrXhY.1||J># AbuY.ҝfܐ'+7{]8÷@R3{8T -)R5ݫZuP@ؗ ^2l4%K%<@C( ɢb0D@1!H 0!H  98 !@C(O&h %  >;H7a1n"-b!"Pbؐ|iF|Oiv|JiD7M0;L!֘Cl0{Ci2elpFd6T 7XA$s`1F<=a9C`ـ]`$#3Pt9=ڰp0EzͿ@NffPi4 bh "`B"B "B"B" B(ڰW0`:{3b2{ BY<Gנ0p=cY0 3lxx3lxF|W5x @ nfapn|,*ū086eaXt | (C@@ͣb"Hm)L<! fҐ0ͣb"H)jB<?? Pb0<f%pDg10p%cg`c+FBN$;ݥؑn tDP5sHʨm1> qu@u25q=9e\7 @F[D BMA n6n'f1G0M opD$u[x u@[t u[p U&82 ``w<` -7v18 0#Xc-xf`1u"{KMY+4p<3up(훭[ uٺ : lPBk! :=`( n6+7TP(X8@[ ,~RUv#X(,Ȁā`PnD'i~iaQْw`0`+ "@aGs3GKX0~1X >k,B, Œ|>upP &Ā2@O2`6ˀ #*" P8/2p:t:&DU .x GU Wn8 U,> >u*@ae' vFr  $uZ0C%YS gXF>g@|M'6YPebi;KuB I23!$` ce!`d#[0`+!'#IAV[HC "@ X81 ^lH :?0݀*  I31$;Hx! fK\U e&fuM`0((xaPaV a`aV"aaUoeF; '08CI`$#3Y* ;w.``l :À̱3$e*LX\0 .%àiq4\H @313203231g0g5h g9ig= u )+GZ*"u)")+GAJ",xX *)%dž*x &'G\""j xl"!'%džrz )!#G" x "$!GX2" u !"\@""Dx| )!##ljdu!'%@?2rZ"zt)"']@2 v+"Gh2Jy,v)+"p2Jz*{$GO1"du)*!>@1rZduP!'%Ƶ2z*h  !"ƺ2 z*k "Ƹ2bz*i "&"Ƣrj¢ jh )ƥjJtj8 $'F" ,h &(*!&Fq:*"e"(Nvent read/write from ; ever being called ; TODO: check init flag (per LUN, not partition) ; and call winrest (anything else?). ; Could always select LUN and test READY. ret setup$win: lhld @cmode mov a,m ; PTN ani 00000011b ; max 4 partitions add a mov b,a ; -----HH- inx h mov a,m ; LUN ani 01100000b ; only 4 LUNs, not 8 rrc rrc ; in position for SDH ora b mov b,a ; ---DDHH- lda @trk ani 1 ora b ; ---DDHHH ori wincfg ; eSSDDHHH out winsdh call winrdy rz ;:10010000CD0802219AFE3E5528252119F9CD1F025E :10011000215CFD3E33281821E5FDCD1F022174FD31 :100120003E32280B11B0020E09CD0500C30000229B :10013000DB0232D70211CA020E09CD05000E0DCD29 :1001400005000E0F112D02CD0500FEFF115102CA50 :100150000002118000CDED01CDF301218000119747 :1001600002010600EDB0CDF3010E09118000CD05AE :10017000003A9802571E0021DD0219229D02EBCDA4 :10018000D5013A9A02B7CA9701571E002A9D021953 :10019000229F02EBCDD501F32ADB021140000110B2 :1001A00000EDB03AD702123A9802470E002A9D029B :1001B0002B3A9702571E001BEDB83A9A02B7CAD1E4 :1001C00001470E002A9F022B3A9902571E001BED91 :1001D000B82A9B02E97C1767EB0180FF09EBD5E5A4 :1001E000CDED01CDF301E1D125C2D801C90E1ACD63 :1001F0000500C90E14112D02CD0500B7117502C8F6 :100200000E09CD0500C3000021F8FF7E23FE32C099 :100210007E23FE2EC07E23FE30C07E23FE31C91118 :10022000A102060F1ABEC0231310F9AFC900435034 :100230004D332020202053595300000000000000BF :1002400000000000000000000000000000000000AE :10025000000D0A6572726F723A2046696C65206EF5 :100260006F7420666F756E643A2043504D332E5381 :1002700059530D0A240D0A6572726F723A20526545 :100280006164206661696C7572653A2043504D3334 :100290002E5359530D0A24000000000000000000F6 :1002A00000DB14CBBFD314EDB0DB14CBFFD314C9E8 :1002B0000D0A07556E6B6E6F776E20524F4D20768C :1002C000657273696F6E210D0A240D0A476F7420E1 :0D02D000524F4D206964202E0D0A240000BD :0000000000 de5h call chksig lxi h,0fd74h mvi a,'2' jrz gotrom lxi h,0fd74h ; bad guess mvi a,'?' gotrom: lxi d,00040h lxi b,16 ldir stax d ; ROM identifer char at 0050h ; ***** lda reslen mov b,a ;B=reslen mvi c,0 lhld resend dcx h lda topres mov d,a mvi e,0 dcx d lddr lda bnklen ora a jz nobnk0 mov b,a mvi c,0 lhld bnkend dcx h lda topbnk mov d,a mvi e,0 dcx d lddr nobnk0: lhld cstart pchl loadf: ;ORA A ;DE = top address (max+1) ;MOV D,A ;MVI E,0 MOV A,H RAL MOV H,A read0: XCHG LXI B,-128 DAD B XCHG PUSH D PUSH H CALL dmaset CALL   q   HK    d  Nr    Q   T   0    h 1 D   o r NT  2   D l     m   qH l  o  N k  m   T 3 m r D mH  m       N Q   d  h     t T   4 R"d,3Mf            (  h M h R n.4  b k kmh     hDX3Q  4   &H MH !&  qH '+,s 36 - "# E ( @HN./3 s ( M   d h; Sh *-DH rX. +H DcA I JmLdsV( / C"$(Ҭ@ H.22 Q( 3H  h nde h  k"&mKK2H S # $h ABDE F Gh H OQsS nqtVh 12 s( AKM"%dh Fh MN n(`dh *l s    -/H 2 4AqDH dh s de mdh  k Q  #h &- 2dh l    K$%dh v+dh -` dh Oh 5   vH 9   ,-H .dh KN1bMAIL Version 1.2COPYRIGHT 1982, DIGITAL RESEARCH080282654321 Waiting for File$ Enter message: $ Must Run Under MP/M or CP/NET. $No More Messages$1b1b- 2  |2b*bM! ^#V ʹÊ "*^#V"*"*~2 .*DM -]! "dÊE"Ê'v!6#6O! ^#V2c:c½^  :b“!d6:dҐ 2c:c!d6Í:cʍ:c2j!"h!c6>!cs* h> ^*#*c& *^*c& *NP X.^j*h*h"h:c<2c*##NP ʇ.Íj!"h*~2j!c6>!c* h> *c& *NP .j*h*h"h:c<2c¥ï2d2c:c^ ! :b!g6 2c!gҿ:cʼ*##:d[ü!"h!f6:f!gҼ* h> ʧ*f& *:d§!g6:f<2f*h*h"hf.:g 2c:c:c2j*dMP j.!g6 R ʹÿ4*~2j*dMP 1j.ï!d6!g6:dF:bZ 2cf*~2c!d6:cv!d6C:cC!e6!"":eC:b§*#~2fð*##~2f:c2j*fMP :ͷ/O!  ^#V!e6+6!g6,*fMN,,*fMN,*",,7!e6@jÌA:g/aI  Þ:bž!c6> !cڞ*c& *>*c& *w:c<2cnïʹï7Òv*& ! qI I ! 5* & ) ^#V  !6 :* & ~=:02 * & ~! HI* & ~=: =! p+q* ~=A_:! 6>! ږ* & * ^! 4p.! 6>! * & * ^! 4£I ! p+qv * DMNʹ! p+q * DMNʹ! p+q * DMNʹ! 6! 6#6#6 ! 6> ! O: 2 5* & *>! 2 ˜! 6* & *~2 * &G"*~2 : ր: ֠H* & *: * & *>@w* & *>! : <2 A: < ! 6! 6> ! 9 $ : 2 9 * & *>w > /L >: ! q.#k -\ : 2 : ҃ : 02kÍ : A 2k: 2 : Ҩ : 02lò : A 2l! 6j ! 6* Mj2 : !0" j2 > 7H4 * +" > > 1   : ! q: a/>z! /HY : : *&  !6 .$ -† ! 6#6::° *M8 A<2! 6* &  ~.: H!: H * &  N8 * &  w: <2 : <2 ð : <2 ! 6: !: H_ * &  N8 * &  w: <2 : <2  T ! 6!62 W ! >~o*&  * &  -¶ *&  6:<2 : <~O! *&   - : <<2 T :=o&  6:=o&   6~ ~ : K ! 6: ~:==o&  * & ~HҠ : <2 d : ~ :==o&  6:==o&   : w7 ! 6:=o&  * & ~ : <2 :=o&  6:=o&   : w Q Z ! q: <2 O>}Ҿ ! 6*&  6:<2O> Ҿ :=o&  6:=o&   6~>:  !6N!6! 6  ! 6!: }* &  ~7*&  6*&   : wc* &  *&  * & w: <2 * M[ 2 z *&  * & 6 * M[ 2 ª*&  * & 6 * M[ 2  !6P  !6:<#w* -:b*#~2(*##~2!6j#Aj!6! 6: ҥ*&  ~l! 6*&  j"ʔj*#":<2Kj¸j! q>9! /~0/H: 0: A/>F! /H: A >!6! 6  *M!k ^#Vs*M8 O͹2 s*M8 O͹2 e: *M8 O͹H2 ss%(9h: :  ! q: ҧ: 0_ö: A_!6! 6j#j*jj>*": ҉*&  j!€*#"*&  ~i! 6*"*"jfj}:<2O> }jÆj:ʗjI * :O͋:O͋= ! 6:=! * &  ^: <2 I !6:<2*&  ~b! 6>}! _*&  * & ^: <2 )*&   ~! 6*&   ~=! *&  * & ^: <2 €>:b*#~2 *##~2 * MP j!6*"*:j"0j*#"jMj! q! 6>x! ڐ! >yO!  ! >}O!  w: <2 W:2O>~Ҥ!6~.N -¬ :2 : 2* MP .j.$j -.s -!6!6!6!6!v6!x65jHj2 v:sjsjH: j‘j¤.z -¬jj!g6:c2j*dMP j.i`N#Fog_ogDM!>)) =_{ozgi`N#Fogo&ogxxMAIL TEX Input Filename: $ Enter Subject: >$ Destination ID: $ ILLEGAL DESTINATION $ Mail From Node #$ Subject: $ $RE: SERVER MAIL DRIVE NOT NETWORKED $ ERROR OPENING FILE $ ERROR READING FILE $ ERROR WRITING FILE $$$$ >$ Mail Program Main Menu Select one of the following: 1 - Broadcast 2 - Send Mail 3 - Receive Mail 4 - Exit From Program$ Select source of message: 1 - File 2 - Console Input$ Select response: 1 - Stop Receiving Mail 2 - Answer Message 3 - Delete Message From Mail File 4 - Answer Message, Then Delete 5 - Re-Examine Last Message 6 - Get Next Message$f9MAIL Version 1.2COPYRIGHT 1982, DIGITAL RESEARCH0802821l- 2  " |w|¨ : _ ]T ~#fo!~2 ! : 2 dõE" #~2 !6#6>ͧ=G==iý͇>ͧ͐: : 2ý}ʽ2: G! * }==#Gͽ "V2 ͇>ͧ_b͐: €: 2: #Gͽý}ʀ2: G: ©x#Gͽ! * : G}x#Gͽ ¶À}2: #Gͽ}ý d: : 2/: ʽ}:2E=ʽ  ý!" " : #Gͭ†>ͧʌ=ʒ=ʘ=ʞ=N* " N/ >/ > N͙ N ͙ N=    _!#^#V g  >2 _!)::0=~==A_:0.0  _ 0lJ!  ild! Mls! M>2z2yG 2{* ##~2|#F+XG}»| »> : 2y:|#~+>@w_:y:{<2z##:{<2{ڑx2z2{* ##>w## :z! #2222Y!0+}…  }e>: _ 1  >2 !:_#6! l$m!::~##A<2l~#. ~# lA~ !2l„"!44>n!! *:O">>~l [%~>§w#>~wu#N#>w#>~wu:<2*#"~*6:<2"##"26#6~>D    >N2>2!"##"2   !^#6!~_|#*wE*6 *6 (*6#:w>P2W   !6#:O2k   :ʏҏ!:O;ڏ }~  [y^# #a* *Rʉ "!!a*#"~ a* " *" a:a    :   !   !:=O͚  ! ~#p Nr ~#͚~> c aa>: #G!6* ""p*#"* Rڿ p!u! ! !>z >zw:G: 2x#Gͽɯ222!l$!- lAGl” :q pq [pl[!lp: 0 iw#w#w#w^#V#Nx{ !my #R R x'G ! y !  ++6 ~#foR}! Dx//x  ~# :~ ;Zx0N<[y1OxxMAIL TEX Waiting for File$ No More Messages$ Input Filename: $ Enter message: $ Enter Subject: >$ Destination ID: $ ILLEGAL DESTINATION $ Mail From Node #$ Subject: $ Date: $ $RE: SERVER MAIL DRIVE NOT NETWORKED $ ERROR OPENING FILE $ ERROR READING FILE $ ERROR WRITING FILE $$$$ Mail Program Main Menu Select one of the following: 1 - Broadcast 2 - Send Mail 3 - Receive Mail 4 - Exit From Program$ Select source of message: 1 - File 2 - Console Input$ Select response: 1 - Stop Receiving Mail 2 - Answer Message 3 - Delete Message From Mail File 4 - Answer Message, Then Delete 5 - Re-Examine Last Message 6 - Get Next Message$ Must Run Under MP/M or CP/NET. $0 @ *** Reset Failed *** $ @ @1!6:Y!"å:<2O:ڥ*& ~A/>P/HҢ*& ~AO!  +s#rY*DMͺµv!p+q*% i`N#FogILLEGAL DESTINATION $ Mail From Node #$ Subject: $ Date: $ $RE: SERVER MAIL DRIVE NOT NETWORKED $ ERROR OPENING FILE DnqH tu  N vs T.R5   D6 Kh NBS(r,4 DK O Q sV3( @DKh "N# & Kh N ( MR  + H, -H  1HrNT 34  5" $ҧD*+.  DH  2H 3Qn      V' ( . #k&H T-k2h39(.D$AK S( DH ( 292 H ( @   Q        h n hSUh( ShT.1DHkK   Q4  H   G #s%&  + , N  / N 1h  MQ!'( @Hm  .  1l 234  osH    T  3 X  2 9 1 3dk4h -d.NtҤ( +1 2km$D & h .  DH $H,  +,/& G-H D DH KGHr3@mS(  9 dCHn  KMX,t-h dt 1H  2dkv4 9Hmdh dE C AKM#H ,  O -dh 2 S 3S   dh @ sT "  .h  1 de n h 2`d3h45kD H ( KL@ DH Sh nNr d2h DH  NDҳD! h +H" # tD%Q'(+Hjm,/ D NO6 3& h  3Qn ADE R VDH +  # .!AHKLMV $D2&n H ( M/2 H 'H3H 1L      DAh "e  kHmn  @ H mT  %'(h L   N -b ce h   kl readfile POP H POP D DCR H JNZ read0 RET dmaset: MVI C,sdma CALL bdos RET readfile: MVI C,read LXI D,cpm3$sys CALL bdos ORA A LXI D,rderr RZ errmsg: MVI C,msgout CALL bdos jmp cpm chkuni: lxi h,0fff8h mov a,m inx h cpi '2' rnz mov a,m inx h cpi '.' rnz mov a,m inx h cpi '0' rnz mov a,m inx h cpi '1' ret ; HL = prospective location chksig: lxi d,signature mvi b,siglen chk0: ldax d cmp m rnz inx h inx d djnz chk0 xra a ret cpm3$sys: DB 0,'CPM3 SYS',0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0 nofile: DB cr,lf,'error: File not found: CPM3.SYS',cr,lf,'$' rderr: DB cr,lf,'error: Read failure: CPM3.SYS',cr,lf,'$' topres: db 0 reslen: db 0 topbnk: db 0 bnklen: db 0 cstart: dw 0 resend: dw 0 bnkend: dw 0 signature: in 14 res 7,a out 14 ldir in 14 setb 7,a out 14 ret siglen equ $-signature buffer: ds 0 end  dcr e jrnz here xra a call ?bnksl ret offline db 0 ; fatal error prevents use cmdbuf db 0 thread equ $ dseg dphtbl: dw 0,0,0,0,0,0,dpb0,0,alv0,@dircb,@dtacb,0 db 0 dw 0,0,0,0,0,0,dpb0,0,alv1,@dircb,@dtacb,0 db 0 alv0: ds 512 alv1: ds 512 ; driver init init$win: xra a sta offline ; TODO: move to login code, for each LUN... call winrest ret login$win: lda offline ora a rnz ; This should prevent read/write from ; ever being called ; TODO: check init flag (per LUN, not partition) ; and call winrest (anything else?). ; Could always select LUN and test READY. ret setup$win: lhld @cmode mov a,m ; PTN ani 00000011b ; max 4 partitions add a mov b,a ; -----HH- inx h mov a,m ; LUN ani 01100000b ; only 4 LUNs, not 8 rrc rrc ; in position for SDH ora b mov b,a ; ---DDHH- lda @trk ani 1 ora b ; ---DDHHH ori wincfg ; eSSDDHHH out winsdh call winrdy rz ; timeout mvi a,pcmpcyl out winpcmp ; This is horrible, bu02B0 BADROM 0000 BC 0005 BDOS 029F BNKEND 029A BNKLEN 02DD BUFFER 0224 CHK0 021F CHKSIG 0208 CHKUNI 0000 CPM 022D CPM3SYS 000D CR 029B CSTART 0002 DE 01ED DMASET 0200 ERRMSG 012F GOTROM 0004 HL 0004 IX 0004 IY 000A LF 0100 LOADER 01D5 LOADF 0009 MSGOUT 0197 NOBNK 01D1 NOBNK0 0251 NOFILE 000F OPENF 0275 RDERR 0014 READ 01D8 READ0 01F3 READFILE 029D RESEND 000D RESET 0298 RESLEN 02DB ROMCRT 02D7 ROMID 02CA ROMMSG 001A SDMA 000F SIGLEN 02A1 SIGNATURE 0080 TBUFF 0299 TOPBNK 0297 TOPRES 6330 VERS 1BEDB82A8102E97C1767EB018C :1001C00080FF09EBD5E5CDD301CDD901E1D125C221 :1001D000BE01C90E1ACD0500C90E14111302CD05BA :1001E00000B7115B02C80E09CD0500C3000021F85D :1001F000FF7E23FE32C07E23FE2EC07E23FE30C053 :100200007E23FE31C9118702060F1ABEC0231310C8 :10021000F9AFC90043504D332020202053595300DB :1002200000000000000000000000000000000000CE :10023000000000000000000D0A6572726F723A2023 :1002400046696C65206E6F7420666F756E643A2027 :1002500043504D332E5359530D0A240D0A657272C3 :100260006F723A2052656164206661696C757265CF :100270003A2043504D332E5359530D0A24000000A9 :1002800000000000000000DB0ECBBFD30EEDB0DBA2 :060290000ECBFFD30EC9E6 :0000000000 etry... ; possible recovery - step, restore, etc. xra a inr a ret ; ; WD 1002 interface routines. ; ; Written by: T. Hayes ; ; These routines provide the physical interface between the system ; and the WD 1002 winchester controller. ; winrest: ; ; Reset and restore the winchester disk ; ; On entry: ; B contains the configuration byte of the drive to be accessed ; ; On exit: ; A and B contain the configuration byte altered as follows: ; Bits 2 and 3 will be set if the drive is off line ; or reset if the controller is ready ; ; in sysctl ;first issue a controller reset setb 1,a out sysctl push psw ; mvi h,1 ;hold reset for > 50 ms lxi d,0 winrest1: call timer jrnz winrest1 pop psw ; res 1,a ;select controller (MR off) out sysctl ; mvi h,3 lxi d,6000h winrest11: in winstat ;Check busy bit 7,a ; jrz winrest3 ;go on if not busy ; call timer ;else count down jrnz winrest11 ; disable: xra a dcr a sta offline ; disable drive... ret ;and return that status to caller winrest3: in winerr ;check for diagnostic errors cpi 1 ;if error jrz winrest31 ;ignore "diagnostic only" errrors ; ana a ;believe all others jrnz disable ;abort if an error shown ; winrest31: call winpsel ; call winrdy ;ready wait jrnz winrest32 call winrdy ;wait for device ready (again?) jrz disable ;abort if timed out (twice) ; winrest32: mvi a,rstcmd ;issue the restore command out wincmd ; call winbusy ;wait for not busy jrz disable ;abort if timed out ; in winstat ;get device status ; bit 0,a ;if there was an error jrnz disable ;abort winrest6: xra a sta offline ret ;return that status to caller ; winpsel: ; ; WD 1002 physical select routine ; ; TODO: get LUN from somewhere... (head too?) ; for now, assume only LUN 0. ; xra a ori wincfg ;select ecc and sector size options ; out winsdh ;and issue the select ret ;return to caller timer: ; ; General down counter routine ; ; On entry: ; HDE are a 24 bit counter ; On exit: ; The counter will have been decremented ; zero is set if the counter is done ; zero is reset if the counter is not at 000000h ; ; Typical timings are 25 t states in the loop with an additional ; overhead of 29 t states in the calling routine. This assumes ; that the calling routine is using a call xxx and jr nz,xxxx. ; This gives a time of 13.5 usec for each iteration of the loop. ; Times when de goes 0 will be margLINK BNKBIOS3=MBIOS3KP,WIN3KP,FDC3KP,CRT,KEYBD,SERIAL,CENTR,END,LPTBL,GETDP3KP,SCB[B,OS,$$SZ]  either. ; U-ROM places '2.01' in 0fff8h... ; 81-292 places copyout in 0fde5h (DB 14 CB BF D3 14 ED B0 DB 14 CB FF D3 14 C9) ; 81-302 places copyout in 0f919h (DB 14 CB BF D3 14 ED B0 DB 14 CB FF D3 14 C9) call chkuni lxi h,0fe9ah mvi a,'U' jrz gotrom lxi h,0f919h call chksig lxi h,0fd5ch mvi a,'3' jrz gotrom lxi h,0fde5h call chksig lxi h,0fd74h mvi a,'2' jrz gotrom lxi h,0fd74h ; bad guess mvi a,'?' gotrom: shld romcrt sta romid lxi d,rommsg mvi c,msgout call bdos mvi c,reset call bdos MVI C,openf LXI D,cpm3$sys CALL bdos CPI 255 LXI D,nofile JZ errmsg LXI D,tbuff CALL dmaset CALL readfile LXI H,tbuff LXI D,topres lxi b,6 ldir CALL readfile MVI C,msgout LXI D,tbuff CALL bdos LDA reslen MOV d,A ; LDA topres mvi e,0 lxi h,buffer dad d shld resend xchg call loadf LDA bnklen ORA A JZ nobnk MOV d,A ; LDA topbnk mvi e,0 lhld resend dad d shld bnkend xchg CALL loadf nobnk: di ; ***** this should be part of COLD BOOT in CPM3LDRK lhld romcrt lxi d,00040h lxi b,16 ldir lda romid stax d ; ROM identifer char at 0050h ; ***** lda reslen mov b,a ;B=reslen mvi c,0 lhld resend dcx h lda topres mov d,a mvi e,0 dcx d lddr lda bnklen ora a jz nobnk0 mov b,a mvi c,0 lhld bnkend dcx h lda topbnk mov d,a mvi e,0 dcx d lddr nobnk0: lhld cstart pchl loadf: ;ORA A ;DE = top address (max+1) ;MOV D,A ;MVI E,0 MOV A,H RAL MOV H,A read0: XCHG LXI B,-128 DAD B XCHG PUSH D PUSH H CALL dmaset CALL readfile POP H POP D DCR H JNZ read0 RET dmaset: MVI C,sdma CALL bdos RET readfile: MVI C,read LXI D,cpm3$sys CALL bdos ORA A LXI D,rderr RZ errmsg: MVI C,msgout CALL bdos jmp cpm chkuni: lxi h,0fff8h mov a,m inx h cpi '2' rnz mov a,m inx h cpi '.' rnz mov a,m inx h cpi '0' rnz mov a,m inx h cpi '1' ret ; HL = prospective location chksig: lxi d,signature mvi b,siglen chk0: ldax d cmp m rnz inx h inx d djnz chk0 xra a ret cpm3$sys: DB 0,'CPM3 SYS',0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0 nofile: DB cr,lf,'error: File not found: CPM3.SYS',cr,lf,'$' rderr: DB cr,lf,'error: Read failure: CPM3.SYS',cr,lf,'$' topres: db 0 reslen: db 0 topbnk: db 0 bnklen: db 0 cstart: dw 0 resend: dw 0 bnkend: dw 0 signature: in 14 res 7,a out 14 ldir in 14 setb 7,a out 14 ret siglen equ $-signature rommsg: db 13,10,'Got ROM id ' romid db '.',13,10,'$' romcrt dw 0 buffer: ds 0 end PM3 SYS',0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0 nofile: DB cr,lf,'error: File not found: CPM3.SYS',cr,lf,'$' rderr: DB cr,lf,'error: Read failure: CPM3.SYS',cr,lf,'$' topres: db 0 reslen: db 0 topbnk: db 0 bnklen: db 0 cstart: dw 0 resend: dw 0 bnkend: dw 0 signature: in 14 res 7,a out 14 ldir in 14 setb 7,a out 14 ret siglF8 DB 28H,IN$SCAN-$-1 0266 3E06 mvi a,6 0268 CDEA02 call indjmp ;get character jr xitusr 026B+184D DB 18H,XITUSR-$-1 conout: 026D 2A0000 lhld @covec ; fetch console output bit vector jr out$scan0 0270+1808 DB 18H,OUT$SCAN0-$-1 auxout: 0272 2A0000 lhld @aovec ; fetch aux output bit vector jr out$scan0 0275+1803 DB 18H,OUT$SCAN0-$-1 list: 0277 2A0000 lhld @lovec ; fetch list output bit vector out$scan0: 027A CDC902 call swtosys out$scan: 027D 11F401 lxi d,cdtbl 0280 0600 mvi b,0 co$next: slar h ; shift out next bit 0282+CB24 DB 0CBH,20H+H 0284 3E0C mvi a,12 0286 DCE002 cc indjmp1 0289 13 inx d 028A 13 inx d 028B 04 inr b 028C 7CB7 mov a,h ! ora a ; see if any devices left jrnz co$next ; and go find them... 028E+20F2 DB 20H,CO$NEXT-$-1 jr xitusr 0290+1828 DB 18H,XITUSR-$-1 conost: 0292 2A0000 lhld @covec ; get console output bit vector jr ost$scan0 0295+1808 DB 18H,OST$SCAN0-$-1 auxost: 0297 2A0000 lhld @aovec ; get aux output bit vector jr ost$scan0 029A+1803 DB 18H,OST$SCAN0-$-1 listst: 029C 2A0000 lhld @lovec ; get list output bit vector ost$scan0: 029F CDC902 call swtosys ost$scan: 02A2 11F401 lxi d,cdtbl 02A5 0600 mvi b,0 ;B = device number cos$next: slar h ; check next bit 02A7+CB24 DB 0CBH,20H+H 02A9 3E09 mvi a,9 ; [NZ] will assume device ready (in case no call made) 02AB DCE002 cc indjmp1 ; check status for this device 02AE B7 ora a ; see if device ready jrz xitusr ; if any not ready, return false 02AF+2809 DB 28H,XITUSR-$-1 02B1 13 inx d 02B2 13 inx d 02B3 04 inr b 02B4 7CB7 mov a,h ! ora a ; see if any more selected devices jrnz cos$next 02B6+20EF DB 20H,COS$NEXT-$-1 02B8 F6FF ori true ; if all selected were ready, return true ; jr xitusr 02BA 47 xitusr: mov b,a 02BB F1 pop psw 02BC B7 ora a jrz xu0 02BD+2807 DB 28H,XU0-$-1 02BF CDFB02 call bnksel ;preserves BC. lspd iostkp 02C2+ED7B DB 0EDH,07BH 02C4+2E01 DW IOSTKP 02C6 78 xu0: mov a,b 02C7 B7 ora a 02C8 C9 ret swtosys: 02C9 D1 pop d ;routine return address 02CA 3A4103 lda @cbnk 02CD B7 ora a jrz sw0 02CE+280D DB 28H,SW0-$-1 sspd iostkp 02D0+ED73 DB 0EDH,73H 02D2+2E01 DW IOSTKP 02D4 312E01 lxi sp,iostk 02D7 F5 push psw 02D8 AF xra a 02D9 CDFB02 call bnksel 02DC F1 pop psw 02DD F5 sw0: push psw 02DE D5 push d 02DF C9 ret indjmp1: 02E0 E5 push h 02E1 D5 push d 02E2 C5 push b 02E3 CDEA02 call indjmp 02E6 C1 pop b 02E7 D1 pop d 02E8 E1 pop h 02E9 C9 ret 02EA EB indjmp: xchg 02EB 86 add m ;a=0,3,6,9,12,... 02EC 5F mov e,a 02ED 3E00 mvi a,0 02EF 23 inx h 02F0 8E adc m 02F1 57 mov d,a 02F2 EB xchg 02F3 E9 pchl ;indirect call 02F4 85 addjmp: add l ;a=0,3,6,9,... 02F5 6F mov l,a 02F6 3E00 mvi a,0 02F8 8C adc h 02F9 67 mov h,a 02FA E9 icall: pchl ;indirect call bnksel: 02FB 324103 sta @cbnk ; remember current bank 02FE C5 push b 02FF 47 mov b,a 0300 87 add a 0301 87 add a 0302 B0 ora b 0303 F6E0 ori compag 0305 D33F out mmu 0307 C1 pop b 0308 C9 ret timex: ;time get/set. sded savede 0309+ED53 DB 0EDH,53H 030B+1C03 DW SAVEDE 030D CDC902 call swtosys ;destroys DE 0310 E5 push h 0311 CDF701 call gett 0314 E1 pop h lded savede 0315+ED5B DB 0EDH,5BH 0317+1C03 DW SAVEDE 0319 C3BA02 jmp xitusr 031C savede: ds 2 xmove: 031E 78 mov a,b ;WR bnk 031F 87 add a 0320 87 add a 0321 B1 ora c ;RD bnk 0322 F6E0 ori compag 0324 322803 sta xmbnk 0327 C9 ret 0328 xmbnk: ds 1 0329 3A2803 move: lda xmbnk 032C B7 ora a jrz xxm0 032D+2802 DB 28H,XXM0-$-1 032F D33F out mmu 0331 EB xxm0: xchg ldir 0332+EDB0 DB 0EDH,0B0H 0334 EB xchg 0335 B7 ora a ;test xmbnk again 0336 3A4103 lda @cbnk 0339 C4FB02 cnz bnksel 033C AF xra a 033D 322803 sta xmbnk 0340 C9 ret 0341 00 @cbnk: db 0 ; bank for processor operations 0342 0D0A074B41signon: db 13,10,7,'KAYPRO CP/M 3.10' 0355 3075 dw vers 0357 2028632920 db ' (c) 1985 DRI and DRM',13,10,'$' 036F 0D0A074E6Fccp$msg db 13,10,7,'No CCP$' 0379 00 ccprecs db 0 037A 0143435020ccp$com db 1,'CCP COM',0,0,0,0 038A ds 16 039A 00000000 fcb$nr db 0,0,0,0 039E FF00 tictbl: db true,0 03A0 0000 dw $-$ 03A2 FF00 db true,0 03A4 0000 dw $-$ 0002 = numtic equ ($-tictbl)/4 ;must be at end of all "cseg" code. 03A6 = thread equ $ dseg ; this part can be banked 0000 @login: ds 2 ;position is assumed by special BNKBDOS3.SPR... ; must be first item in DSEG. 0002 0001 hlast: dw hstart 0004 00DF hleft: dw bnktop-hstart 0006 310E01 boot: lxi sp,stack 0009 21A000 lxi h,@vect 000C 7C mov a,h stai 000D+ED47 DB 0EDH,47H im2 000F+ED5E DB 0EDH,5EH ; Verify that we have banked RAM... ; init PIO,RTC and tick interupt 0011 CDC200 call clrpio ;reset any PIO interupts pending 0014 3ECF mvi a,11$001111b ;bit control mode 0016 D322 out pioActl 0018 3EC0 mvi a,11000000b ;7,6 inputs 001A D322 out po r FHMdh T   /eu dh MO  2dh dg k q3e  H m sT 5 x Hdls ظA DH r9H h bdkm"$h ag h k mnu vdh &N, - N 23BDG H C H$U  h n %+@ KdMحdh  Mh үOh 2 kl Sh 9  dh "F (, .dh  Uh /H  2klm3  S4M  dh R5 DH dh tSAh #h  $h R   %km,  O -dh  D - 1   d  gh  3 5  Q 2dh v  # ak o H +ekE!91 |g!~XO#~ - X[m# m~]X0 Km{__2A'l"!6u!O! ^#V͏2: =ʡ0u͏2 *&) *" K* #w: ƀ* w$ͨ$* " 2!K* #w:!ƀ* w$ͨ"* " 2!K* #w:!ƀ* w$- S>1#S>v*!q*&!p+q*  E*& ~ ‹!4u!6:*& ~2O>Ҷ*M û >!/~:H~[H~]H~=H*& 6!4Ð!4!q*&  :w!4!s+p+q!6!66:!ڌ!q!6>!z*&**&  q!6!4+4I:҅:!43>: :ʚ0: A2O>Ҭ0u:!q:A/>F!/H:A :02 ::0A2: 0:  : [H>:  : [HG* Mͳ2: 2 :0: [a:  ^0>u: ]o>: ]* Mͳ:]¤* Mͳo&))))* Mͳ_}0u: =¶u_{ozg^#V|g}o _{ozgtU   4 L     % / O 1  F  4H r 4  hS "  t  $ t L  M  s O Q  '(h Fm  Mt   O R   .K  t u L  tT  /  H  3       m   DH  km s    Q        4  r E   K  h O o Q f  h l  nq F JM $q     K        L  M  r          `   ab                   c           d e      f  hi  k       l             o               q           r       s tu      v  R  (    h  K   M W   1 lm  rt u D H f m N   r u T r  4     13 h K t Q  R$H M  Q R        S(F  M  N   R S h  .HJh K   u   4     M M(Yh . 2 3k%+ -  HDl2 B DH dm0 S  V$   n    C   t E F  K  L O k q  R n   o   S U   n ( S     4 ! #( 3 hM +   C,s2 3 N oQ  H  '    2DH H 1  $ ILST:CON: CP/Net is not loaded.$ Illegal parameter specification.$1!9"!|>͓"!6 !͇O! ^#VXO! *>w#6$* >w#6"* >w#6 1#v*!q*&!p+q*  E*& ~ 6!4 !6:*& ~2O>a*Mf >!/~,H~:H~*H~.H~>H~<H~=H*& 6!4;!4!q*& :w!4!s+p+q!6!66:!U!q!6>!C*&**& :!6!4+4:N:!4>::c:A2O>u:_{ozg^#V|g}o ‡_{ozg ILLEGAL DESTINATION $ Mail From Node #$ Subject: $ Date: $ $RE: SERVER MAIL DRIVE NOT NETWORKED $ ERROR OPENING FILE  4  (m T  h ίDH  t@&K(ODHҮ3DR o   .He   KM(3H  h      H   (  * 2/4$(,H-  / ' D KQ1 8 .DRDH KMDH ` 2  35#-DsH خT 8 ,D. 1dt.3 ! $' -S q 6 1 (ADH N#H -   D DH ҭB FGL SVD. DrGKh MQ$ RsSCEK OksV2E GL6+ /.2h DH "B3H  7/   v/5HdBdh O+Ӷ  j %H & 2Sh 5A"cdh n+G Sh H   K  ҷU   3 ( * $M N      $dh k(KN .` dh 18   Q  ( @DH K. 013 HN#$(+H AK R$&DH .3 Vѡ@CDsJҤM  R(  ,H A KNQ "kH @DH KntLN  b  k ҦTh  n. 2 3G 83$(+/sH H  " D$&kr(H o58  "H$DH DHsdDH KdKM`Rק(S1 3H@ mD &` dh   s- C q 1DmH2 SM(  .% &+,  D1 T8 (-$dh S( ,D.T(rKMA "dD H lDGHK&@DحCDH MүDEH ӱdh 2dH v3 5 H  n3NT &"#DH ز6G  HN hkSh$ &H ( kNR      S  4 h  "#&s+2 3   H .`4 DH &  ( f.DH@N/N 31Nt3(+H.D ND"#'q3  H T  Ndh k`@DShsH K(nM K(!$nQ    hs  ( 1 D 8M sioActl 001C 21C000 lxi h,piovec+0 ;bit-0 of vector must be 0 001F 7D mov a,l 0020 D322 out pioActl 0022 3EB7 mvi a,1011$0111b ;EI, OR, HI, mask follows 0024 D322 out pioActl ; 0026 3EBF mvi a,10111111b ;bit 6 only 0028 D322 out pioActl 002A 214501 lxi h,tick 002D 22C000 shld piovec+0 0030 3E10 mvi a,rtcis 0032 D320 out rtcadr 0034 DB24 in rtcdta 0036 3E11 mvi a,rtcic 0038 D320 out rtcadr 003A 3E04 mvi a,00000100b ;enable INT on 1-second interval 003C D324 out rtcdta ; 003E 3E4F mvi a,01$001111b ;input mode 0040 D323 out pioBctl 0042 3E07 mvi a,0000$0111b ;no interupts 0044 D323 out pioBctl 0046 3E4A mvi a,01001010b 0048 D321 out pioBdat 004A 21C200 lxi h,piovec+2 004D 7D mov a,l 004E D323 out pioBctl ; 0050 3E02 mvi a,2 0052 D307 out sio1ctlB 0054 D30F out sio2ctlB 0056 21A000 lxi h,sio1vec 0059 7D mov a,l 005A D307 out sio1ctlB 005C 21B000 lxi h,sio2vec 005F 7D mov a,l 0060 D30F out sio2ctlB 0062 FB ei ; Initialize all modules and build tables. 0063 21A603 lxi h,thread ;thread our way through the modules, 0066 5E in0: mov e,m ;initializing as we go. 0067 23 inx h 0068 56 mov d,m ;next module, or "0000" if we're past the end. 0069 23 inx h 006A 7A mov a,d 006B B3 ora e 006C CAC700 jz init$done 006F 7E mov a,m ;device base number 0070 23 inx h 0071 23 inx h ;thread+4 = init entry (JMP) 0072 D6C8 sui 200 ;if Char I/O module, build entry(s) in tables. 0074 DABA00 jc notchr 0077 D5 push d ;save NEXT module address 0078 4F mov c,a 0079 0600 mvi b,0 007B 2B dcx h 007C 7E mov a,m ;number of devices 007D 23 inx h 007E EB xchg ;DE=init entry point 007F 21F401 lxi h,cdtbl 0082 09 dad b 0083 09 dad b 0084 47 mov b,a 0085 79 mov a,c 0086 FE0C in1: cpi 12 0088 D2B300 jnc in4 ;if device # overflows, adjust next step. 008B 73 mov m,e ; 008C 23 inx h ; 008D 72 mov m,d ; 008E 23 inx h ; 008F 3C inr a djnz in1 0090+10F4 DB 10H,IN1-$-1 0092 1B dcx d 0093 1A ldax d ;number of devices 0094 47 in3: mov b,a 0095 79 mov a,c ;DE=module address, C=device base 0096 87 add a ; *2 0097 87 add a ; *4 0098 87 add a ; *8 0099 4F mov c,a 009A 78 mov a,b ;number of devices 009B 0600 mvi b,0 009D 21B301 lxi h,@ctbl 00A0 09 dad b 00A1 EB xchg ;DE=@ctbl indexed by device base 00A2 0E12 mvi c,17+1 ;B=0 still, point to CHRTBL vector 00A4 09 dad b ;point to chrtbl location 00A5 4E mov c,m 00A6 23 inx h 00A7 66 mov h,m 00A8 69 mov l,c ;HL=chrtbl 00A9 87 add a 00AA 87 add a 00AB 87 add a ;num.dev * 8 = number of bytes in module's table. 00AC 4F mov c,a ;B=0 still ldir ;copy modules chrtbl into system table. 00AD+EDB0 DB 0EDH,0B0H 00AF E1 in2: pop h 00B0 C36600 jmp in0 00B3 91 in4: sub c ;compute number of devices that will fit. 00B4 C29400 jnz in3 ;continue with initialization of tables 00B7 C3AF00 jmp in2 notchr: ;HL point to init entry 00BA D5 push d 00BB CDFA02 call icall ;"call" (HL) 00BE E1 pop h 00BF C36600 jmp in0 00C2 CDC500 clrpio: call twice twice: reti 00C5+ED4D DB 0EDH,4DH init$done: ;all Disk I/O modules are initialized. 00C7 0E0B mvi c,11 00C9 C5 in5: push b 00CA CD1702 call cinit 00CD C1 pop b 00CE 0D dcr c 00CF F2C900 jp in5 00D2 2A7F00 lhld icovec 00D5 220000 shld @covec ;set console I/O 00D8 2A7D00 lhld icivec 00DB 220000 shld @civec ; 00DE 2A8500 lhld ilovec 00E1 220000 shld @lovec ;set list output device 00E4 2A8300 lhld iaovec 00E7 220000 shld @aovec ;set auxiliary I/O device 00EA 2A8100 lhld iaivec 00ED 220000 shld @aivec ; 00F0 217800 lxi h,defsrc 00F3 110100 lxi d,@ermde+1 ;location of default search chain in SCB 00F6 010500 lxi b,5 ldir 00F9+EDB0 DB 0EDH,0B0H 00FB 3A7C00 lda srctyp 00FE E618 ani 000$11$000b 0100 4F mov c,a 0101 3AF6FF lda @civec-10 ;location of search type flags in CCP section 0104 E6E7 ani 111$00$111b 0106 B1 ora c 0107 32F6FF sta @civec-10 010A 114203 lxi d,signon 010D 0E09 mvi c,9 010F CD8F00 ; A version of CPNETSTS that minimizes output org 00100h jmp start l0103h: db 13,10,'CP/NET Status' db 13,10,'=============' db 13,10,'$' l012ch: db 'Requester ID = $' l013ch: db 13,10,'Network Status Byte = $' l0155h: db 13,10,'Device status:' db 13,10,'$' l016dh: db ' Drive $' l0176h: db ' = Drive $' l0180h: db ' on Network Server ID = $' l01a2h: db ' Console Device = $' l01b4h: db 'Console #$' l01ddh: db ' List Device = $' l01ech: db 'List #$' l01hhh: db ' All LOCAL$' l0212h: db 13,10,'CP/NET has not been loaded.$' start: lxi h,0 dad sp shld usrstk lxi sp,stack call getver mov a,h ani 02h jz nocpnt lxi b,l0103h ; Intro call msgout call getcfg shld nettbl lxi b,l012ch ; Req ID (client ID) call msgout lhld nettbl inx h mov c,m call hexout lxi b,l013ch ; Net Sts Byte call msgout call getsts mov c,a call hexout lxi b,l0155h ; Disk device status: call msgout xra a sta count sta curdrv drvlup: lda curdrv cpi 16 jnc trycon ; Done with drives A-P... mov l,a mvi h,0 dad h ; *2 - 2 bytes per drive inx h inx h ; +2 - 2 bytes before drives xchg lhld nettbl dad d mov a,m ani 080h jz locdrv ; drive is local... push h lda count ora a cnz crlf lxi h,count inr m lxi b,l016dh ; Drive... call msgout lda curdrv adi 'A' mov c,a call chrout mvi c,':' call chrout lxi b,l0176h ; = Drive... i.e. REMOTE call msgout pop h push h mov a,m ani 00fh ; remote drive number adi 'A' mov c,a call chrout mvi c,':' call chrout lxi b,l0180h ; on server... call msgout pop h inx h mov a,m ; server ID mov c,a call hexout locdrv: ; Drive is LOCAL... lxi h,curdrv inr m jmp drvlup trycon: lxi b,00022h lhld nettbl dad b mov a,m ani 080h jz trylst push h lda count ora a cnz crlf lxi h,count inr m lxi b,l01a2h ; Console Device = ... call msgout lxi b,l01b4h ; Console # call msgout pop h push h mov a,m call hexdig lxi b,l0180h ; on Network Server ID = call msgout pop h inx h mov a,m mov c,a call hexout trylst: lxi b,00024h lhld nettbl dad b mov a,m ani 080h jz done push h lda count ora a cnz crlf lxi h,count inr m lxi b,l01ddh ; List Device = call msgout lxi b,l01ech ; List # call msgout pop h push h mov a,m call hexdig lxi b,l0180h ; on Network Server ID = call msgout pop h inx h mov a,m mov c,a call hexout done: lda count ora a jnz exit lxi b,l01hhh call msgout jmp exit nocpnt: lxi b,l0212h ; CP/NET has not been loaded call msgout exit: lhld usrstk sphl ret chrout: mov e,c mvi c,002h call 00005h ret msgout: mov d,b mov e,c mvi c,009h call 00005h ret getver: mvi c,12 call 00005h ret getsts: mvi c,044h call 00005h ret getcfg: mvi c,045h call 00005h ret crlf: mvi c,13 call chrout mvi c,10 call chrout ret hexout: push b mov a,c rrc rrc rrc rrc call hexdig pop b mov a,c call hexdig mvi c,'H' call chrout ret hexdig: ani 0fh adi 90h daa aci 40h daa mov c,a jmp chrout ds 40 stack: ds 0 usrstk: dw 0 count: db 0 curdrv: db 0 nettbl: dw 0 end means 256 outir inr c ; status port inp a ; ani 02h ; cmd overrun rz mvi a,0ffh ret ; Receive Message from Network RCVMSG: ; BC = message addr mov h,b mov l,c ; HL = message address push h popix lda ioport mov c,a inr c ;  @(@?  (   ;@(@   @   ;@P P (?(?( equ $-FUNTB2 db 012h, 002h, 098h ; fstfi equ $-FUNTB2 db 006h, 018h, 09ch ; frdrr equ $-FUNTB2 db 048h, 006h, 018h, 01eh, 0a2h ; READ RAND fwrrr equ $-FUNTB2 db 048h, 008h, 010h, 018h, 09eh ; WRITE RAND [ZEROFIL] fgtsz equ $-FUNTB2 db 006h, 018h, 09eh ; flkrc equ $-FUNTB2 db 008h, 00ch, 018h, 09eh ; fstpw equ $-FUNTB2 db 094h ; flgin equ $-FUNTB2 db 03ch, 098h ; flgof equ $-FUNTB2 db 03eh, 098h ; fsdnw equ $-FUNTB2 db 0b8h ; frvnw equ $-FUNTB2 db 0bah ; fnwst equ $-FUNTB2 db 0b4h ; fnwcf equ $-FUNTB2 db 0b6h ; fstcp equ $-FUNTB2 ; ***** DUPLICATE of fstpw ***** db 094h ; fsvcf equ $-FUNTB2 db 03eh, 018h, 0a4h ; fgtdl equ $-FUNTB2 db 046h, 098h ; fdkms equ $-FUNTB2 db 046h, 002h, 018h, 0a4h ; flst1 equ $-FUNTB2 db 0a8h flstbk equ $-FUNTB2 db 0ach ; table of message handlers? per BDOS func? ; -1 = ERROR, 0 = PASSTHRU, else index into FUNTB2 FUNTB1: db 0 ; 0 - db 0 ; 1 - db 0 ; 2 - db 0 ; 3 - db 0 ; 4 - db flst1 ; 5 - db 0 ; 6 - db 0 ; 7 - db 0 ; 8 - db 0 ; 9 - db 0 ; 10 - db 0 ; 11 - db fgtvr ; 12 - GET VERSION db frssy ; 13 - RESET DISK SYSTEM db fsldk ; 14 - SELECT DISK db fopfi ; 15 - OPEN FILE db fopfi ; 16 - CLOSE FILE db fsrfs ; 17 - SEARCH FIRST db fsrnx ; 18 - SEARCH NEXT db fdlfi ; 19 - DELETE FILE db frdsq ; 20 - READ SEQUENTIAL db fwrsq ; 21 - WRITE SEQUENTIAL db fopfi ; 22 - MAKE FILE db frefi ; 23 - RENAME FILE db flgvc ; 24 - GET LOGIN VECTOR db 0 ; 25 - GET CURRENT DISK db 0 ; 26 - SET DMA ADDR db fgtal ; 27 - GET ALLOC ADDR db fwrpr ; 28 - WRITE PROTECT DISK db flgvc ; 29 - GET R/O VECTOR db fstfi ; 30 - SET FILE ATTR db fgtal ; 31 - GET DPB ADDR db 0 ; 32 - GET/SET USER CODE db frdrr ; 33 - READ RANDOM db fwrrr ; 34 - WRITE RANDOM db fgtsz ; 35 - GET FILE SIZE db fgtsz ; 36 - SET RAND RECORD db frsvc ; 37 - RESET DRIVE db frsvc ; 38 - ACCESS DRIVE db frsvc ; 39 - FREE DRIVE db fwrrr ; 40 - WRITE RAND ZERO FILL db 0 ; 41 - TEST & WRITE RECORD db flkrc ; 42 - LOCK RECORD db flkrc ; 43 - UNLOCK RECORD db 0 ; 44 - SET MULTISECTOR COUNT db 0 ; 45 - SET BDOS ERR MODE db fdkms ; 46 - GET DISK FREE SPACE db 0 ; 47 - CHAIN TO PROGRAM (***? can't chain to remote program) db fstcp ; 48 - FLUSH BUFFERS db 0 ; 49 - GET/SET SCB ; 50..63 - handled by special case NFTB1 equ $-FUNTB1 ; if any are passed to server, must preserve FUNCOD as real code FUNTBX: db fstcp ; 98 - FREE BLOCKS db fopfi ; 99 - TRUNCATE FILE db 0 ; 100 - SET DIR LABEL ****support?**** db fgtdl ; 101 - GET DIR LABEL BYTE db fgtdl ; 102 - READ FILE DATE-PWD MODE db 0 ; 103 - WRITE FILE XFCB ****support?**** db 0 ; 104 - SET DATE & TIME db 0 ; 105 - GET DATE & TIME - can't support here, use SEND NW MESG db fstpw ; 106 - SET DEF PASSWORD db 0 ; 107 - GET SERIAL NUMBER db 0 ; 108 - GET/SET PGM RET CODE db 0 ; 109 - GET/SET CONS MODE db 0 ; 110 - GET/SET OUT DELIM db 0 ; 111 - PRINT BLOCK db flstbk ; 112 - LIST BLOCK NFTBX equ $-FUNTBX ; CP/Net functions, not known to BDOS FUNTBN: db flgin ; 64 - LOGIN db flgof ; 65 - LOGOFF db fsdnw ; 66 - SEND NW MESG db frvnw ; 67 - RECV NW MESG db fnwst ; 68 - GET NW STATUS db fnwcf ; 69 - GET NW CFG db fstcp ; 70 - SET COMP ATTR db fsvcf ; 71 - GET SERVER CFG NFTBN equ $-FUNTBN FUNTBS: db 0,NFTB1 dw FUNTB1 db CNMIN,NFTBN dw FUNTBN db CXMIN,NFTBX dw FUNTBX dw 0 SNDHDR: lxi h,MSGTOP mvi m,0 ; FMT = CP/Net inx h ; DID (server ID) already set inx h ; SID, our node ID, will be set by SNIOS inx h inx h inx h xchg ; DE = MSGDAT lhld MCRPNT xra a ; negate DE sub e mov c,a mvi a,0 sbb d mov b,a dad b ; HL -= DE mov a,l ora h jz SNDHD1 ; size set already dcx h xchg dcx h mov m,e ; SIZ = length - 1 SNDHD1: lxi b,MSGTOP SDMSGE: call SNDMSG inr a rnz jmp NERROR RVMSGE: call RCVMSG inr a rnz NERROR: lxi h,-1 mov a,h jmp NDEND NDENDR: lda RETCOD NDEND: xchg lhld USTACK sphl xchg mov l,a mov b,h ret RCVPAR: lxi b,MSGTOP call RVMSGE lxi h,MSGDAT shld MCRPNT ret tnextp: ; abandon call to real BDOS lhld USTACK sphl TBDOSP: lhld PARAMT xchg lda FUNCOD mov c,a jmp next CKFCBD: lhld PARAMT mov a,m dcr a jp CKFCB1 call CURDSK CKFCB1: mov e,a mvi d,0 call CHKDSK cpi 0ffh rnz call TBDOSP jmp NDEND CHKDSK: lxi h,CFGTBL+BSDSKS dad d dad d mov a,m ral jc CHKDS1 ; remote disk mvi a,0ffh ret CHKDS1: rar ani 00fh ; remote server disk number inr a mov c,a inx h mov a,m ; remote server node ID sta MSGID ret SNDFCB: call CKSFCB jmp SNDHDR CKSFCB: call CKFCBD ; check FCB disk for local/remote (local does not return) STFCB: call CURUSR lhld MCRPNT mov m,a ; put USR in msg buf inx h mov m,c ; put DSK in msg buf inx h xchg lhld PARAMT inx h xchg mvi b,35 call MCPYTS ; copy FCB to msg buf xra a sta FNTMPF sta F5SETF lhld MCRPNT lxi d,-35 dad d ; point to start of FCB name in msg buf SUBTMP: call CKDOL ; substitute $NN for $$$ at start of name mvi b,0 dad b ; skip rest of 3 chars inx h mov a,m ani 080h ; check f5' attr - partial close/delete XFCBs only inx h jz SUBTM1 mov a,m ani 080h ; check f6' attr - assign passwd/set byte count jnz SUBTM1 dcr a sta F5SETF SUBTM1: lda FNTMPF add a sta FNTMPF inx h inx h inx h CKDOL: mvi c,3 mvi a,'$' CKDOL1: cmp m rnz inx h dcr c jnz CKDOL1 xchg lxi h,FNTMPF inr m dcx d lda CFGTBL+BSRID ; client (slave) ID mov b,a call HEXDIG dcx d mov a,b rar rar rar rar call HEXDIG inx d inx d xchg ret HEXDIG: ani 00fh cpi 10 jnc HEXDG1 adi '0' stax d ret HEXDG1: adi 'A'-10 stax d ret RENTMP: lhld MCRPNT lxi d,-19 dad d jmp SUBTMP MCPYTS: ldax d mov m,a inx h inx d dcr b jnz MCPYTS shld MCRPNT ret WTDTC2: mvi b,2 jmp WTDTCS WTDTC8: mvi b,8 jmp WTDTCS WTDTCP: mvi b,SCTLNG WTDTCS: lhld DMAADR xchg lhld MCRPNT call MCPYTS jmp SNDHDR CKSTDP: lda PARAMT jmp STDSK0 CKSTDK: call CURDSK STDSK0: mov e,a mvi d,000h call CHKDSK cpi 0ffh jnz STDSK1 call TBDOSP jmp NDEND STDSK1: sta MSGID lhld MCRPNT dcr c mov m,c inx h shld MCRPNT ret ; Handle multi-sector count CHKMSC: call CKFCBD ; does not return if disk is local ; From here on, we know the disk is remote call SYSMSC cpi 1 ; skip multi-sector handling if count == 1 rz ; returns to NDOSE5, goto next opcode. sta CURMSC pop h ; NDOSE5 ret addr shld MSCRET pop h ; FUNTB2 pointer (past CHKMSC) shld MSCTBP lda FUNCOD cpi CRREAD jc CKMSC2 ; save rand rec position lhld PARAMT ; FCB lxi b,FCBRR0 dad b mov e,m inx h mov d,m inx h mov a,m sta SAVRR+2 xchg shld SAVRR jmp CKMSC2 CKMSC0: lda RETCOD ora a jnz CKMSC1 lda CURMSC dcr a sta CURMSC jz CKMSC1 lxi h,MSGDAT shld MCRPNT lhld DMAADR lxi b,128 dad b shld DMAADR lda FUNCOD cpi CRREAD jc CKMSC2 ; advance random record number... lhld PARAMT ; FCB lxi b,FCBRR0 dad b inr m jnz CKMSC2 inx h inr m jnz CKMSC2 inx h inr m CKMSC2: lxi h,CKMSC0 push h lhld MSCTBP push h lhld MSCRET pchl ; jmp NDOSE5 - do next opcode. Returns to CKMSC0 when done. ; done with multi-sec read/write, restore everything. CKMSC1: ; could be EOF, or some physical error lda FUNCOD cpi CRREAD jc CKMSC3 ; restore file position... lda SAVRR+2 lhld SAVRR xchg lhld PARAMT ; FCB lxi b,FCBRR0 dad b mov m,e inx h mov m,d inx h mov m,a ; If the program's next op is random read/write, then we are ; finished now. But, if the next op is sequential then ; we must set the file position back to where it started. ; Use READ RAND to set file position. Response is ignored. mvi a,CRREAD sta MSGFUN lxi h,MSGDAT shld MCRPNT call SNDFCB call RCVPAR ; ignore data/error returned by CRREAD CKMSC3: lda CURMSC ; if error ended us early, need num sec cɀT NDOS3 NDOS3 COPYRIGHT (C) 1980-82, DIGITAL RESEARCH NDOS Err $, Func $$Init err$ ! ">2  ¼!e"2!g"1 "`D  :*`.~*`.~*`.~**`.s#r*`.:w*`.~*`.~#foNDOS3 Started. $NDOS3 Ending. $y22e ; < 2 !y ##ڗ##~‚ s1O~#fo":" !f6#"GW ^&! !0 W_z!^#V!gm 7  Y Y f m u ?@BHH HH <>>FFN   $' */44/77JDDHH;O<>@ABCDE2@b!b6#####*O>G }++sb <% $# ¹!4:+ Gx 07*Ów#"  * *:!3_O2*2c* q#"52 " " :!ڬ*! ^#V#~2 " ì:¸: =2 ʸ!g"*  " :!ڬ*! 4¬#4¬#4!q* * :!: * *! s#r#w>!2e!g"g: _gry 2c**:8s*ry <:%O 22c!gs#r#":&k=!:g2<!7!!, ~Ҽڼ#yʔʕ+üN+~@w~2_*~?p *#"m:c2_:_%*2c*#w#"!h"V+~2+~=& J ! P !* P ! Ͱ}2K !O)s a }2ڄ *à Gy2c!g"*^#Vxʯ zW{_¥ {_:_O*)* q#"7!g"  *^#V#N#Fy!N ~&!W ^w#4% % x ~w~wQ  6<b!W  *`.n&}2 2 }2*~2c#*:2c*DM 2*DM% 2>J kb~#q ~# ^#V! # U ! ">2!}8!* >w: O y xw2U :* G2* x!* `i:+ w: OF x>`i: O x/ F x>: OyxB"I !@ BB$$ UUUUUTUUE@@ H @I$$@ $I$IH"$$D"I HHB"!$@$ $"IH"@$H@   $BI$I"$$A@!"  DD A H!D@DD!$I$HHH@ @HI"@ g^#V|g}o ‡_{ozg>2\2 š c No File $MORE:$ $:2c*DM 2*DM% 2>J kb~#q ~# ^#V! # U ! ">2!}  O Q S.2   M  dfh!N "$( NR+ N. q  ͳDH 5   Q $ HQ    h  / h  FQ"J@DH mN(MR-N  .DG S  T 3 GH N   DmG   He k TؤCKRS&H CMdn+,1kl l  5X6"  $ D,  @Dm HdmA   k t v  L  O  RN    dh ' c mN    T X(  D1 m o    3  $   2 VK 'D  HDH1` ab   e l n  o  r   v  #K &+ -/ 12 qT 36Dr  Hm8Dh -1 ms   DKMQ@s '(S    h DLVث@D    H cf lmn r s خQ0 HN6  NRS j qM Q"lH @ DEH KҤ`  us & h @ B E L h tMNR  U-D rHN.h`2D4 b S  h B t  FM(M13ek  M  O   !gQ "   qD k   G h H N   t Q #l  H $` hk%N & T'dL(  s   )  +D ,   s- N . /    Q n   01b o   DGH mn r uNO   S  dس@    DKNQ  hto4     R ( .1ijD$( 3   DH ҳ!H ( h S4DqH   hdh Q       (E   F  R4   tL  V 12d mt R@ADH ؤB G R (He Tb .SD48 $  ,BQ  RT#Q$`adk l  &N nQ(DSn DH,.  k F q K nL dM O n    QR  S n  W12NSq3h mmquF kH LO QR4    Hkm$@AKg H rҲij( /H hkRS U!# N&DT( +,H .hR / h n    1N2@  F H e lNT"$ <q]g^#V|g}o ‡_{ozg        r s  u  ! h ,He/ dh # &(h  E  S.# N(H, /1NK h NT TQ (` h n  MDQ+DN  q س@emqD H M kMSK(  MhnD N4   h  .K  /2(.13  3 H e pHN   !(M  &H  DH 15ks km K` (M"$-3   '*+. /H زNs1 s  N   h" 'U 2D3kmhR"' (     Uh3 4     n  12n3kIˤ(    -/ ADrH KMR DKM 4 n   DH Kh S1 ors3 DEH K h M h  + H   .    1dha     R23 H2 $h # ,@/'.3 5kN  DH Kh N' 3H Kh 6 1r HN  o rs3Q   h n$ls (  !" N $R%  N  +v-/ABK LdO  q QR N4 h KMRS'N DM  . KS 3h& Db  ce fh  kl s     +  T " ShsU3H/H Kز 1HN  t6.$h( +lm. T  #H Ҳ4 k l  HkN  $  (   d B Ci Fq K h S s  !   Q  " G  N         m      nq# m   r H   Q x M sP   R tS W h  o %HK  T  ' (   s + u , s - ./ x  KN kQ 1D m s  u H2 h DkmL OS nTX 3 D NX4 R5H n   Nk s 69 ҭCS 2C !#L %   s12l3` d    k qt  v  N6DAkF( 3 Q ht  kQS"dh AV'  ( h E MN. 6  1   $hksLM(S '  ! (  n tH&H (Sy1Io&6"u!'"wu|1~=1#"u!"wu|1~[1#~UC12p#~]1#~1!͛:( (! :( 1!'͛1͹:( 1!"r2ty_!#*r 6$#"r:t<2tCA !:tK   !( ͹ =ƒ223!'K!T6$#6$#6$y2#KKT2oͦF :p> ::p8:o8> ͽ> ͽz2o:pY>ͽ:RM:RO>2q :pʅ:q2k!Q~wK'!'[Ks:U:U=2U*V~#"V:R:R=2R*Sw#"SK`!"S>2RZ>2!"V>2UK o&6$  cc K||:tʒ    ~?#7Invalid: $Error reading input$Error writing output$No file found for input$Error creating temp$Error renaming temp$ Usage: TR A:{outfile}=B:infile[U|C]$Copying -$ $š c No File $MORE:$ $:2c*DM 2*DM% 2>J kb~#q ~# ^#V! # U ! ">2!}    + K   ( D 0  DH KM1a ms  D  -H4  Q    Rh 1 N$(` hL h tN .    K-t3HN(`h D   H  $dh k (     - 4& Sch     R(D $   %&   -. 2  $    S $(    DHN   f   o q    (     4     . RS(   s  N  ( 1  H  v  $L m) D DH !HNt QT"KN Q#Hr   mn$l%H  KN&  h QnT'( +   rDH  uNX , N-  / KNt T 1 DH TD G n HyJLO  qS  q 6 DHN1d3ұ@   bfkvA knt B gn     q   tC  h  q  tD l  r  w   E k F q G   d  t H   IK  n  M O  kn     q   Qd  h nt R g  h    jkn o s t `  g h kn t TUV  g   nq%  ĬҲ $($ (   sH   L '( M@ qDH ҳ#HmKh N+12h @ 48ii:0 ' 0x[[0 C))))o? <Xa_Ɛ'@'^#V#Nx{y!myƒ#RҙR x'Gy!y¦!4 ++~#foR}ҨDx//xO ~#O:~#O:~O;Zx0N<[y1O "}!N#~ U# Gi!4e Y}2 1"*>ʘBCï8Ea*X! !j  Time was set to: $Error retrieving network time.$This program requires BDOS >= 3.0.$:O yx2 `i:OF x>`i:O xk F x> :( 1!'͛1͹:( 1!"r2ty_!#*r 6$#"r:t<2tCA !:tK   !( ͹ =ƒ223!'K!T6$#6$#6$y2#KKT2oompleted. mov e,a ; save where SYSMSC won't destroy it call SYSMSC sub e mov h,a ret ; NDENDR BCSTFN: ; broadcast func (set default password, set compat attrs) lxi d,0 call FORALL mov a,c inr c jz RSTALL ; no (more) servers, reset and return sta MSGID lhld PARAMT xchg lhld MCRPNT lda FUNCOD cpi CDEFPW-CBMAX ; a.k.a. 106 - set def password jz BCST1 ; fn 70 - set compat attr mov m,e jmp BCST2 BCST1: mvi b,8 call MCPYTS BCST2: call SNDHDR call RCVPAR jmp BCSTFN BCSTVC: ; broadcast "drive vector" funcs to all servers lhld PARAMT xchg BCSTV1: call FORALL push h mov a,c inr c jnz BCSTV2 ; some remote drives to do call RSTALL pop d lda FUNCOD cpi CRSDSN ; reset drive rnz ; only reset drive is passed to local mov c,a call next sta RETCOD ret BCSTV2: sta MSGID lxi h,MSGDAT mov m,e inx h mov m,d inx h shld MCRPNT call SNDHDR lda FUNCOD sui 38 ; access drive jz BCSTV3 push psw call RCVPAR pop psw pop d dcr a jz BCSTV1 lda MSGDAT sta RETCOD inr a jz RSTALL jmp BCSTV1 BCSTV3: call RCVEC pop d jmp BCSTV1 ; Returns vector of all disks for given server, ; each call skips servers already reported. FORALL: lxi h,CFGTBL+BSDSKS push d lxi d,0 lxi b,010ffh FORAL1: mov a,m ral jnc FORAL6 ; local ral jc FORAL6 ; "already did" flag inx h mov a,c cpi 0ffh jz FORAL2 cmp m jz FORAL3 dcx h jmp FORAL6 FORAL2: mov c,m FORAL3: dcx h mov a,m ori 040h ; mark this one done... mov m,a xthl call RHLR0 jnc FORAL7 xthl mov a,m ani 00fh inr a push h lxi h,1 FORAL4: dcr a jz FORAL5 dad h jmp FORAL4 FORAL5: mov a,e ora l mov e,a mov a,d ora h mov d,a pop h jmp FORAL8 FORAL6: xthl call RHLR0 jnc FORAL7 mov a,h ori 080h mov h,a FORAL7: xthl FORAL8: inx h inx h dcr b jnz FORAL1 pop h ret RHLR0: ora a mov a,h rar mov h,a mov a,l rar mov l,a ret ; Reset from FORALL RSTALL: lxi h,CFGTBL+BSDSKS mvi b,16 RSTAL1: mov a,m ani 08fh ; clear FORALL iterator flag(s) mov m,a inx h inx h dcr b jnz RSTAL1 ret STSF: ; setup Search First mvi a,0ffh sta CURSID ; assume local lhld PARAMT mov a,m cpi '?' jnz STSF1 call CKSTDK mvi c,'?'+080h ; "drive" code with CP/M3 flag call STFCB jmp STSF2 STSF1: lhld MCRPNT inx h shld MCRPNT call CKSFCB ; if remote, set FCB in msg STSF2: lda MSGID sta CURSID call SETSRA jmp SNDHDR STSN: ; setup Search Next lda CURSID cpi 0ffh ; was Search First a local op? jnz STSN1 call TBDOSP jmp NDEND STSN1: sta MSGID call CURUSR lhld MCRPNT inx h mov m,a inx h shld MCRPNT jmp SNDHDR RCVEC: call RCVPAR lxi h,MSGDAT+1 shld MCRPNT mov d,m ; D = ext err code dcx h mov a,m sta RETCOD dcx h mov a,m ; SIZ dcr a mvi h,0 ; ensure H=0 to avoid confusion with extended errors rnz ; not extended error - skip rest call BDERMD inr a jnz NDERR xchg jmp NDENDR NDERR: push d lxi d,NDERRM call PRMSG pop psw ; A = (D), ext err code push psw ; Fix bug in NDOS.ASM call HEXOUT lxi d,NDERR2 call PRMSG lda FUNCOD call HEXOUT call BDERMD pop h ; H = ext err code cpi 0feh jz NDENDR jmp TOP ; abort program HEXOUT: lxi d,HEXMSG+1 ; do low nibble first push psw call HEXDIG pop psw rar rar rar rar dcx d ; back to hi nibble call HEXDIG PRMSG: mvi c,CBUFPR jmp next GTFCB: lda F5SETF inr a jnz GTFCCR GTFCRR: mvi b,35 ; FCB+CR+RR (-drive) jmp GTFC1 GTFCCR: mvi b,32 ; FCB+CR, not RR GTFC1: call RSTMP ; un-do temp file subst lhld MCRPNT inx h xchg lhld PARAMT inx h call MCPYFS mvi h,0 ; ensure H=0 to avoid confusion with extended errors ret MCPYFS: ldax d mov m,a inx d inx h dcr b jnz MCPYFS xchg shld MCRPNT ret RSTMP: ; restore TMP filename lda FNTMPF rar rar jnc RSTMP1 lhld MCRPNT inx h inx h mvi m,'$' inx h mvi m,'$' RSTMP1: ral rnc lhld MCRPNT lxi d,10 dad d mvi m,'$' inx h mvi m,'$' ret GTDIRE: lda RETCOD inr a mvi h,0 ; ensure H=0 to avoid confusion with extended errors rz lhld MCRPNT ; Special case for CP/M3 full search, although really ; any SEARCH that wants to be fully compatible with CP/M ; neuances - specifically that the DMA buffer contains the ; full directory sector after a search. ; ; CP/Net breaks SEARCH funcs 17/18 by only returning ; one DIRENT at a time, while the local BDOS calls ; actually fill the DMA buffer with the directory sector. ; DIR.COM depends on this for getting timestamps. lda MSGSIZ ora a ; 00 = 1 byte, dir code only, DMA buf implied rz ; NDENDR will return dir code to user cpi 32+4 ; anything 1 < x < 128 really, pick a number (expect 32). jnc STOSC0 ; assume 128 bytes, copy all to DMA buffer. ; single DIRENT returned, copy to correct location. xchg lhld DMAADR lda RETCOD inr a lxi b,32 GTDIR1: dcr a jz GTDIR2 dad b jmp GTDIR1 GTDIR2: mov b,c call MCPYFS ret GTOSCT: lda RETCOD ora a rnz lxi h,MSGDAT+37 STOSC0: xchg lhld DMAADR mvi b,SCTLNG call MCPYFS mvi h,0 ; ensure H=0 to avoid confusion with extended errors ret GTMISC: lhld MCRPNT dcx h ; drop error byte lda FUNCOD cpi CGTALL ; get alloc addr jz GTMSC3 ; for alloc vec, just leave in message buffer xchg cpi CFRSP ; get disk free space jz GTMSC4 cpi CGTDPB ; get DPB addr jnz GTMSC1 ; fn 31 - get DPB lxi h,CURDPB push h mvi b,16 ; should be 15 for CP/M 2.2, 17 for CP/M 3 jmp GTMSC2 GTMSC4: lxi h,0 push h lhld DMAADR mvi b,3 jmp GTMSC2 GTMSC1: ; fn 71 - get server config lxi h,CURSCF push h mvi b,23 GTMSC2: call MCPYFS pop h GTMSC3: mov a,l sta RETCOD ret GTLOGV: lxi d,CFGTBL+BSDSKE lxi h,0 mvi b,16 GTLGV1: ldax d dcx d mov c,a ldax d dcx d dad h call DRVSTS dcr b jnz GTLGV1 mov a,l sta RETCOD ret ; Get a drive's status (i.e. GET LOGIN VECTOR) ; B = local drive num ; A = net cfg byte, bit-7 = remote, bit-0:3 = remote drive num ; Returns DE bit-0 = drive's status DRVSTS: push d push b push h ral jc DRVST1 ; drive is local push b call TBDOSP pop b dcr b xchg jmp DRVST2 DRVST1: ; drive is remote rar ani 00fh mov b,a ; remote drive number mov a,c ; server ID sta MSGID lxi h,MSGDAT shld MCRPNT push b call SNDHDR call RCVPAR pop b lhld MCRPNT mov e,m inx h mov d,m DRVST2: ; DE = vector of active drives mov a,b ora a jz DRVST4 DRVST3: ; get drive 'B' bit to LSB mov a,d rar mov d,a mov a,e rar mov e,a dcr b jnz DRVST3 DRVST4: mvi d,000h mov a,e ani 001h mov e,a pop h dad d pop b pop d ret SELDSK: lda PARAMT mvi d,000h mov e,a call CHKDSK cpi 0ffh ; local disk jz TBDOSP ; let BDOS handle call SETDSK lhld MCRPNT dcr c mov m,c inx h shld MCRPNT call SNDHDR jmp RCVEC RESET: ; anything to do? BDOS will be called... but BDOS does not call 0005 (us)? lxi h,MSGDAT shld MCRPNT ; A: cannot be remote... jmp next LIST1: lxi d,PARAMT lxi b,1 jmp lstbk2 LSTBLK: lhld PARAMT mov e,m inx h mov d,m ; address of data inx h mov c,m inx h mov b,m ; length mov a,c ora b rz lstbk2: lxix CFGTBL+BSLIST bitx 7,+0 jz tnextp lxi h,CFGTBL+BSLIST+9 push d ldx e,+7 mvi d,0 dad d pop d lstbk0: ldax d inx d mov m,a inx h inrx +7 ; dirty == not-zero jm lstbk3 ; send data cpi 0ffh ; stop at 0ffh? or need to continue if more? jz lstbk3 ; this will continue if more chars exist... lstbk1: dcx b mov a,b ora c jnz lstbk0 ret lstbk3: ; must send buffer ldx a,+0 ani 0fh stx a,+8 ; SIZ already len-1, incl LST unit ldx a,+1 ; LST server stx a,+4 ; DID push d push b pushix lxi b,CFGTBL+BSLIST+3 ; MSG buffer call SNDMSG popix pushix mvix 0,+7 ; clear dirty flag, setup for next char inr a jz NERROR lxi b,MSGTOP call RVMSGE popix pop b pop d lxi h,CFGTBL+BSLIST+9 jmp lstbk1 GETVER: lhld scbadr mvi l,scbase+05h mov l,m mvi h,002h mov a,l sta RETCOD ret NWSTAT: call NTWKST sta RETCOD ret NWCFTB: call CNFTBL mov a,l sta RETCOD ret LOGIN: lhld PARAMT mov a,m sta MSGID inx h xchg lhld MCRPNT mvi b,8 call MCPYTS jmp SNDHDR LOGOFF: lda PARAMT sta MSGID jmp SNDHDR SDMSGU: lhld PARAMT mov b,h mov c,l call SNDMSG sta RETCOD ret RVMSGU: lhld PARAMT mov b,h mov c,l call RCVMSG sta RETCOD ret LDERR: mvi a,-1 pop h ret SAVDMA: dw 0 SAVRR: db 0,0,0 MSCRET: dw 0 MSCTBP: dw 0 CURMSC: db 0 DMAADR: dw 0 CURDPB: ds 15 CURSCF: ds 23 ; this is used to do warm boot initialization, since most ; programs do not call BDOS Function 0 but instead just ; JMP 0. The CCP then makes this call, either upon startup ; and/or immediately prior to running a program. ; Perportedly, the CPP calls this with DE=NULL in order ; to scrub RSXs on warm boot. LDOVLY: WARMST: push d push b call NTWKBT ; TODO: any other re-init? reset some context? ; lxi d,wbmsg ; mvi c,CBUFPR ; call next pop b pop d jmp next ; An example of how to process BDOS Func 60 RSX Func 113 ; and remove one's self. CALRSX: mov l,e mov h,d mov a,m inx h cpi 113 ; Check for RSX Func 113 jnz next mov a,m inx h cpi 1 ; Check param count to be sure jnz next push d mov e,m inx h mov d,m lxi h,rsxnam mvi b,8 rsxf0: ; Compare paramter to our name ldax d cmp m jnz rsxf1 inx d inx h dcr b jnz rsxf0 rsxf1: pop d jnz next lxi d,CSTDN mvi c,CBUFPR call next lxi h,next shld start+1 ; only until remove takes place... mvi a,0ffh sta remove lxi h,0 mov a,l ret end !4Q>!қ:=2á:2:Ҭ\>!ҿ:=2K:2K!:!:K\: \!p+q͈* org 0100h mvi a,23 sta lcount lxi d,005ch mvi c,0fh call 0005h inr a jz error lxi d,0080h mvi c,01ah call 0005h rdloop: lxi d,005ch mvi c,014h call 0005h ora a jnz done lxi h,0080h mvi d,080h outloop: mov a,m inx h cpi 01ah jz done push h push d cpi 00ah jnz notlf mvi e,00dh mvi c,002h call 0005h mvi e,00ah mvi c,02h call 0005h lda lcount dcr a sta lcount cz more jmp waslf notlf: mov e,a mvi c,002h call 0005h waslf: pop d pop h dcr d jnz outloop jmp rdloop done0: pop h ; discard return addr done: lxi d,005ch mvi c,010h call 0005h ret error: lxi d,errmsg mvi c,09h call 0005h ret more: mvi a,23 sta lcount lxi d,moremsg mvi c,09h call 0005h mvi c,01h call 0005h cpi 0003h; Ctrl C jnz clearmsg pop h ; ret addr pop h ; saved DE pop h ; saved HL lxi d,crlf mvi c,09h call 0005h jmp done clearmsg: lxi d,clrmsg mvi c,09h call 0005h ret lcount: db 23 errmsg: db 'No File' crlf: db 13, 10, '$' moremsg: db 'MORE:$' clrmsg: db 13, ' ',13,'$' end  CURMSC: db 0 DMAADR: dw 0 CURDPB: ds 15 CURSCF: ds 23 ; this is used to do warm boot initialization, since most ; programs do not call BDOS Function 0 but instead just ; JMP 0. The CCP then makes this call, either upon startup ; and/or immediately prior to running a program. ; Perportedly, the CPP calls this with DE=NULL in order ; to scrub RSXs on warm boot. LDOVLY:; This program can be used to remove an RSX that is persistent. ; The RSX must trap function 60 (CALL RSX) and honor sub function 113. ; The RSXPB is defined as: ; ; rsxpb: db 113 ; function code ; db 1 ; num params ; db name ; param: name of RSX to remove ; ; name: db 'TOREMOVE' ; must be 8 chars, blank padded ; ; This program expects the CCP to format the single commandline ; parameter into the default FCB, which will produce an 8-char ; (actually, 11) blank padded field. ; ; Usage: RSXRM ; Example: RSXRM RSXTEST ; ; A compatible RSX must accept BDOS Function 60 RSX Function 113, ; compare it's name to the parameter, and if matching then set ; it's own REMOVE flag. ; ; See RSXTEST.ASM for an example, in the RSXFUN routine. ; org 100h start: lxi d,rsxpb mvi c,60 call 5 jmp 0 rsxpb: db 113 db 1 dw 005dh end  call 0005h lda lcount dcr a sta lcount cz more jmp waslf notlf: mov e,a mvi c,002h call 0005h waslf: pop dW01N 2H  KMN@  DG  H b         dmrs KMNQ "G'@ f m qH n u  NOVqt Hk lMNQ hT    "dv K   m  rD KNk  V(  MR1 bl  n N     3HmNDH -/2H L ( M+( A g  "#$( +,D -.1 !"` e  l  s dNDҫH -n@  " DH .3N4   MM# h $R (  BFL DH DH үDG H @DH K5H r  6 !&H ز    @DT DH Q5   hsM"G H# D H T $ S   &( M S   * ,- DkHkmR  ز@ Hu @lD G4  LQ SH/ h /  H 23cy " D  m  o   ` dHN T#s$ L  M  %      HN       T  m  r'( FG n LN  O R   s V ) H +,m   D  Hr   T-./  s      K 012   u   G He l  r   N          O h  T     @ H     T Rh U5 r D  2   D H k  K dd(h 1qe N3H dkmr4  M$3&+ Kt- n1HL  X 2H  -    s 1  + m   D G  H r KN   r      F.$M-ls HdmN  k 2 O    3b   cd    f    k   l  s   h $  KT2    n      p  e9X " CP/NET Status ============= $Requester ID = $ Network Status Byte = $ Device status: $ Drive $ = Drive $ on Network Server ID = $ Console Device = $Console #$ List Device = $List #$ All LOCAL$ CP/NET has not been loaded.$!9"10|(<"$(*#NM4(6OMM(22:Җo&)##*~ʏ:B!4`(:AO!:!i(~AO!:!s(#~OM!43"* ~:B!4((~as(#~OM$* ~:B!4((~as(#~OM:((*YPY  DE ! !yayaH!Ɛ'@'O!021000B500D400F300110130014E0100001F00B1 :100220003C005B0079009800B600D500F400120194 :1002300031014F010E0CCD05002204017DFE1EDAB6 :10024000D9022180004E237EFE20C25502230DC21A :100250004702C36902EB2100001A13CD3401DA65AD :10026000020DC259027D3209011118010E F G H LQS h V 9dh `    h  t  d!hHrFh -H sSh T347 M$Q&Ch  O2Sh 4 DH Lgdh Fh Ҭ@dh H L dkm-  Fh dh 1 3m( ,6  n dD L (sT2H y Q   -d  h k 2H N  e(  h nBL(  h Ml R S  h    *DH vNsT  خMh38 s  F knqGLdM n  g R S n T  $ Q ,@mDNrt   GD (3e  tNS d# DH үDDrGK"(+H/Hmز4     n dT &( f  .T /1@  fD E  G HbnK L Q lTHTD(Mh    2   H   T@BCnDFGt  H  L dOn     bT   q V  FRrS!  $     ' (+T. /CG3DH d& +q-dh DH 2DH #$ de  k        &  T(Rh -h 2 3E k D H  L o Q " t  D   oH n o     K N m    n T#D r s  H          fk r N     $    odh W% bsD        HK& 'm H) +H   sT,s D   HrtN  -.    Q  @ hq     N    r T1pN 2A Bnq   D          q  H    dh t   ST     o 3    rwS   Y5 k  q   D    commands in the file. This file is convenient to use if you regularly execute a set of commands before you do your regular session on the computer. ///1TPA Syntax: TPA Explanation: The TPA Command displays the amount of memory available for TPA. The amount of memory is a direct translation of the current BDOS entry page, including any active RSXs. This can be used to determine if RSXs are resident, by comparing the TPA to the value seen immediately after boot. Example: A>TPA 57.25K TPA ///1TR Syntax: TR d:{filespec}=filespec[C|U] Explanation: The TR Command copies one or more files and translates line endings between Unix and CP/M conventions. The option C causes every line feed character to be prefixed with a carriage return, unless already present. The U option removes all carriage returns from the file. Neither source nor destination drive is required to be networked, although that would be the normal case. The source filespec cannot be ambiguous if a destination filespec in given. Example: A>TR C:=P:*.ASM[C] ///1TYPE Syntax: TYPE {filespec {[ PAGE | NOPAGE ]}} Explanation: The TYPE command displays the contents of an ASCII character file on your screen. [PAGE] Causes the console listing to be displayed in paged mode; i.e., stop automatically after listing n lines of text, where n normally defaults to 24 lines per page. [NOPAGE] Turns off Console Page Mode and continuously displays a typed file on the screen. ///2Examples A>TYPE MYPROG.PLI Displays the contents of the file MYPROG.PLI on your screen. A>TYPE B:THISFILE [PAGE] Displays the contents of the file THISFILE from drive B on your screen twenty four lines at a time. ///1USER Syntax: USER {number} Explanation: The USER command sets the current user number. The disk directory can be divided into distinct groups according to a "User Number." User numbers range from 0 through 15. ///2Examples A>USER Enter User#:5 5A> The current user number is now 5 on drive A. A>USER 3 3A> This command changes the current User Number to 3. ///1XREF Syntax: XREF {d:} filename {$P} Explanation: XREF provides a cross-reference summary of variable usage in a program. XREF requires the .PRN and .SYM files produced by MAC or RMAC for input to the program. The SYM and PRN files must have the same filename as the filename in the XREF command tail. XREF outputs a file of type .XRF. Examples: A>XREF b:MYPROG A>XREF b:MYPROG $P word to read the file. DELETE The password is only required for deleting or CTRL-A moves cursor one character to the left. Banked system only. CTRL-B moves cursor from beginning to end of command line and back without affecting command. Banked system only. CTRL-C stops executing program when entered at the system prompt or after CTRL-S. CTRL-E forces a physical carriage return without sending command to CP/M 3. CTRL-F moves cursor one character to the right. Banked system only. CTRL-G deletes character at current cursor position if in the middle of a line. Banked system only. CTRL-I same as the TAB key. CTRL-H delete character to the left of cursor. CTRL-J moves cursor to the left of the command line and sends command to CP/M 3. Line feed, has same effect as carriage return. CTRL-K deletes character at cursor and all characters to the right. CTRL-M same as carCOMMANDS CONVENTIONS 3CNTRLCHARS COPYSYS &VCPNET (eEXTENSIONS ,@NDOS3 35CPNETSTS 6 DATE =YEXAMPLES ?(DEVICE A/OPTIONS FyEXAMPLES LDIR VIBUILT-IN YKEXAMPLES ]WITHOPTIONS eOPTIONS hsEXAMPLES y_DSKRESET DUMP ]ED COMMANDS EXAMPLES 7ERASE 9OPTION <EXAMPLES 8FILESPEC UGENCOM 1OPTIONS dEXAMPLES HGET ]OPTIONS AEXAMPLES cHELP 6HEXCOM &INITDIR jLIB vOPTIONS MODIFIERS vEXAMPLES LINK ZOPTIONS ;EXAMPLES bLOCAL aLOGIN "ILOGOFF (?MAC +?EXAMPLES 0OPTIONS 0PNETSTAT ; NETWORK >NTPDATE CQPATCH EvPIP (COPY) H\EXAMPLES OOOPTIONS VBPUT _@OPTIONS efEXAMPLES nFRENAME tREXAMPLES w1RMAC OPTIONS kEXAMPLE uRSXRM SAVE zEXAMPLE SET LABEL _EXAMPLES jPASSWORDS bMODES #ATTRIBUTES &EXAMPLES DEFAULT YTIME-STAMPS OPTIONS -EXAMPLES ^DRIVES 4SETDEF MEXAMPLES mSHOW WEXAMPLES pSID COMMANDS bEXAMPLES eUTILITIES uSUBMIT 4SUBFILE EXECUTE  PROFILE.SUB  TPA )TR JTYPE 2EXAMPLES OUSER QEXAMPLES bXREF $ HEL$ $ $ $  ///1commands CP/M 3 Command Format: A>COMMAND {command tail} A CP/M 3 command line is composed of a command, an optional command tail, and a carriage return. The command is the name or filename of a program to be executed. The optional command tail can consist of a drive specification, one or more file specifications, and some options or parameters. ///2conventions COMMAND CONVENTIONS The following special symbols define command syntax. {} surrounds an optional item. | separates alternative items in a command line. indicates a carriage return. ^ indicates the Control Key. n substitute a number for n. s substitute a string (group) of characters for s. o substitute an option or option list for o. [] type square brackets to enclose an option list. () type parens to enclose a range of options within an option list. RW Read-Write attribute - opposite of RO RO Read-Only attribute - opposite of RW SYS System attribute - opposite of DIR DIR Directory attribute - opposite of SYS ... preceding element can be repeated as many times as desired. * wildcard: replaces all or part of a filename and/or filetype. ? wildcard: replaces any single character in the same position of a filename and/or filetype. ///1cntrlchars Control Character Function CTRL-A moves cursor one character to the left. Banked system only. CTRL-B moves cursor from beginning to end of command line and back without affecting command. Banked system only. CTRL-C stops executing program when entered at the system prompt or after CTRL-S. CTRL-E forces a physical carriage return without sending command to CP/M 3. CTRL-F moves cursor one character to the right. Banked system only. CTRL-G deletes character at current cursor position if in the middle of a line. Banked system only. CTRL-I same as the TAB key. CTRL-H delete character to the left of cursor. CTRL-J moves cursor to the left of the command line and sends command to CP/M 3. Line feed, has same effect as carriage return. CTRL-K deletes character at cursor and all characters to the right. CTRL-M same as carriage return. CTRL-P echoes console output to the list device. CTRL-Q restarts screen scrolling after a CTRL-S. CTRL-R retypes the characters to the left of the cursor on a new line; updates the command line buffer. CTRL-S stops screen scrolling. CTRL-U updates the command line buffer to contain the characters to the left of the cursor; deletes current line. CTRL-W recalls previous command line if current line is empty; otherwise moves cursor to end of line. CTRL-J,-M,-R,-U and RETURN update the command line buffer for recall with CTRL-W. Banked system only. CTRL-X deletes all characters to the left of the cursor. ///1COPYSYS Syntax: COPYSYS Explanation: COPYSYS copies the CP/M 3 system from a CP/M 3 system diskette to another diskette. The new diskette must have the same format as the original system diskette. Example: A>COPYSYS ///1CPNET CP/NET on CP/M 3 CP/NET on CP/M 3 uses an RSX that combines the functions of the NDOS and SNIOS from CP/NET on CP/M 2.2. It also provides support for more functions, particularly those available to CP/M 3 programs. The RSX may be removed, allowing dynamic switching between CP/NET (with reduced TPA) and normal operation. CP/NET on CP/M 3 does not (currently) support networked console. ///2EXTENSIONS EXTENSIONS TO NDOS FOR CP/M 3 The following BDOS 3 functions are now supported on networked drives: 17 - SEARCH FIRST (enhancement) 18 - SEARCH NEXT (enhancement) 46 - GET DISK FREE SPACE 48 - FLUSH BUFFERS 98 - FREE BLOCKS 99 - TRUNCATE FILE 101 - GET DIR LAEL BYTE 102 - READ FILE DATE/PASSWORD MODE 105 - GET TIME AND DATE SEARCH functions were enh; Translate text file between CP/M and Unix line-ends maclib z80 WBOOT equ 0000h BDOS equ 0005h CMDLINE equ 0080h CR equ 13 LF equ 10 EOF equ 26 CONOUT equ 2 PRINT equ 9 OPEN equ 15 CLOSE equ 16 SERFST equ 17 SERNXT equ 18 DELETE equ 19 READ equ 20 WRITE equ 21 MAKE equ 22 RENAME equ 23 SETDMA equ 26 SETATR equ 30 PARSE equ 152 BUFLEN equ 128 org 0100h jmp start infile: ds 36 outfile: ds 36 tmpfile: ds 36 sawcr: db 0 conv: db 0 bytcnt: db 0 flptr: dw 0 flcnt: db 0 pfcb: dw 0 ; text to parse dw 0 ; output FCB ; TODO: support things like A:=B:*.asm[u] start: lxi sp,stack lxi d,CMDLINE ldax d inx d ora a jz help mov l,a mvi h,0 dad d mvi m,0 ; ensure NUL terminated xchg shld pfcb lxi h,outfile shld pfcb+2 lxi d,pfcb mvi c,PARSE call BDOS mov a,h ana l cpi 0ffh jz parerr mov a,m ; HL point to next, unparsed, char cpi '=' jnz parerr inx h shld pfcb lxi h,infile shld pfcb+2 lxi d,pfcb mvi c,PARSE call BDOS mov a,h ana l cpi 0ffh jz parerr mov a,m ; HL point to next, unparsed, char cpi '[' jnz parerr ; make this optional, default is no conversion? inx h mov a,m ani 0dfh ; toupper cpi 'U' jz convok cpi 'C' jnz parerr convok: ani 010h ; 0=to-cp/m, ~0=to-unix sta conv inx h mov a,m cpi ']' jnz parerr inx h mov a,m ora a jnz parerr lxi h,infile call chkafn jnc multcp lda outfile+1 cpi ' ' jnz noblank lxi d,outfile+1 lxi h,infile+1 lxi b,11 ldir lda outfile+1 cpi ' ' jz parerr noblank: lxi h,outfile call chkafn jnc parerr call trfile ; errors abort, do not return here jmp WBOOT multcp: lda outfile+1 cpi ' ' jnz parerr ; make list of matching files, then ; translate each one... lxi h,flist shld flptr xra a sta flcnt lxi d,inbuf mvi c,SETDMA call BDOS lxi d,infile mvi c,SERFST call BDOS cpi 0ffh jz inofile serloop: rlc rlc rlc rlc rlc ; * 32 mov e,a mvi d,0 lxi h,inbuf dad d inx h xchg lhld flptr xchg lxi b,11 ldir xchg mvi m,'$' inx h shld flptr lda flcnt inr a sta flcnt lxi d,0 mvi c,SERNXT call BDOS cpi 0ffh jnz serloop ; got list of 'flcnt' files at 'flist' ; There must be at least one if we get here... lxi d,cpying mvi c,PRINT call BDOS lxi h,flist lda flcnt floop: push psw push h lxi d,fprefx mvi c,PRINT call BDOS pop d push d mvi c,PRINT call BDOS pop h push h lxi d,infile+1 lxi b,11 ldir lxi h,infile+1 lxi d,outfile+1 lxi b,11 ldir call trfile pop h pop psw lxi b,12 dad b dcr a jnz floop jmp WBOOT ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Translate file infile => outfile trfile: xra a sta infile+12 sta outfile+12 lxi h,outfile lxi d,tmpfile lxi b,16 ldir lxi h,tmpfile+9 mvi m,'$' inx h mvi m,'$' inx h mvi m,'$' ; FCBs all setup. lxi d,infile mvi c,OPEN call BDOS cpi 0ffh jz inofile xra a sta infile+32 lxi d,tmpfile mvi c,DELETE call BDOS lxi d,tmpfile mvi c,MAKE call BDOS cpi 0ffh jz mkerr sta sawcr call infill call outinit chrloop: call getchr cpi EOF jz ineof mvi d,0 cpi CR jnz notcr lda conv ora a jnz chrloop ; to-unix: drop all CR inr d mvi a,CR notcr: cpi LF jnz notlf lda conv ora a jnz crlfok ; to-unix: do not add back CR lda sawcr ora a jnz crlfok mvi a,CR call putchr mvi d,0 crlfok: mvi a,LF notlf: push d call putchr pop d mov a,d sta sawcr jmp chrloop ineof: lda conv ora a jnz done0 ; Unix file, set byte count instead... ineof0: mvi a,EOF call putchr ; fill buffer and force flush... lda outcnt ora a ; zero means next putchr will flush... jnz ineof0 done0: lda outcnt mov c,a mvi a,BUFLEN sub c sta bytcnt ; 0..128 call outflush ; flushes full 128 byte record done: ; close all and rename tmpfile... call closeall lda conv ora a jz iscpm lda bytcnt sta tmpfile+32 lxi h,tmpfile+6 mov a,m ori 80h mov m,a lxi d,tmpfile mvi c,SETATR call BDOS ; trim file back to exact byte count ; check error? aborting doesn't help iscpm: lxi d,outfile mvi c,DELETE call BDOS ; check error? do anything different? lxi h,outfile lxi d,tmpfile+16 lxi b,16 ldir lxi d,tmpfile mvi c,RENAME call BDOS cpi 0ffh jz renerr ret getchr: lda incnt ora a cz infill lda incnt dcr a sta incnt lhld inptr mov a,m inx h shld inptr ret putchr: push psw lda outcnt ora a cz outflush lda outcnt dcr a sta outcnt pop psw lhld outptr mov m,a inx h shld outptr ret outflush: lxi d,outbuf mvi c,SETDMA call BDOS lxi d,tmpfile mvi c,WRITE call BDOS ora a jnz outerr outinit: lxi h,outbuf shld outptr mvi a,BUFLEN sta outcnt ret infill: lxi d,inbuf mvi c,SETDMA call BDOS lxi d,infile mvi c,READ call BDOS ora a jz inok cpi 1 jnz inerr mvi a,EOF ; should never happen for text files, but handle anyway sta inbuf inok: lxi h,inbuf shld inptr mvi a,BUFLEN sta incnt ret closeall: lxi d,tmpfile mvi c,CLOSE call BDOS lxi d,infile mvi c,CLOSE call BDOS ret parerr: lxi d,perrm mvi c,PRINT call BDOS lxi d,CMDLINE ldax d inx d mov l,a mvi h,0 dad d mvi m,'$' mvi c,PRINT call BDOS help: lxi d,usage mvi c,PRINT call BDOS jmp WBOOT mkerr: ; infile open, partial cleanup lxi d,merrm jmp abort inerr: ; both files open lxi d,ierrm jmp abort outerr: ; both files open lxi d,oerrm abort: push d call closeall lxi d,tmpfile mvi c,DELETE call BDOS pop d jmp errmsg renerr: ; files are all closed, no cleanup lxi d,rerrm jmp errmsg inofile: ; files not open yet, no cleanup lxi d,nerrm errmsg: push d lda flcnt ora a jz nocrlf mvi e,CR mvi c,CONOUT call BDOS mvi e,LF mvi c,CONOUT call BDOS nocrlf: pop d mvi c,PRINT call BDOS jmp WBOOT ; Check for '?' (ambiguous file name) in FCB HL ; Return CY set if unambiguous chkafn: mvi b,13 qchk: mov a,m cpi '?' rz inx h dcr b jnz qchk stc ret perrm: db 'Invalid: $' ierrm: db 'Error reading input$' oerrm: db 'Error writing output$' nerrm: db 'No file found for input$' merrm: db 'Error creating temp$' rerrm: db 'Error renaming temp$' usage: db CR,LF,'Usage: TR A:{outfile}=B:infile[U|C]$' cpying: db 'Copying -$' fprefx: db CR,LF,' $' outcnt: db 0 outptr: dw 0 incnt: db 0 inptr: dw 0 stack equ $+64 outbuf equ stack inbuf equ outbuf+BUFLEN flist equ inbuf+BUFLEN end he parameter, and if matching then set ; it's own REMOVE flag. ; ; See RSXTEST.ASM for an example, in the RSXFUN routine. ; org 100h start: lxi d,rsxpb mvi c,60 call 5 jmp 0 rsxpb: db 113 db 1 dw 005dh end  call 0005h lda lcount dcr a sta lcount cz more jmp waslf notlf: mov e,a mvi c,002h call 0005h waslf: pop d; ntpdate program for Kaypro CP/M 3 maclib z80 BDOS equ 0005h CMDLN equ 0080h ; BDOS functions CONOUT equ 2 PRINT equ 9 GETVER equ 12 SGSCB equ 49 ; CP/NET NDOS functions NSEND equ 66 NRECV equ 67 org 0100h jmp start ioport: db 038h vers: dw 0 scbadr: dw 0 gettime: db 0, 0, 2, 105, 0, 0 gottime: db 1, 2, 0, 105, 4, 0, 0, 0, 0, 0 ; just prediction of what will be received scbpb: db 03ah ; offset of SCB address (reserved area) db 0 ; get word, (SCB address) dw 0 ; assume < 100 decout: mvi b,'0' decot0: sui 10 jc decot1 inr b jmp decot0 decot1: adi 10 adi '0' push psw mov a,b call prout pop psw jmp prout ; Keeps number in HL - caller must preserve/init ; Returns CY for invalid hexnum: sui '0' rc cpi 9+1 jnc hexnm1 hexnm2: dad h dad h dad h dad h ora l mov l,a ret hexnm1: sui 'A'-'9' rc cpi 5+1 cmc rc adi 10 jmp hexnm2 hexout: push psw rrc rrc rrc rrc call hexdig pop psw hexdig: call tohex prout: mov e,a mvi c,CONOUT jmp BDOS tohex: ani 0fh adi 90h daa aci 40h daa ret ; HL = CP/M Date-time field, w/o seconds ; Print date and time to console. prdate: mov e,m inx h mov d,m inx h push h ; compute year mvi c,78 ; base year, epoch, binary mvi b,078h ; year, BCD ; special-case date=0... mov a,e ora d jnz prdat0 inx d prdat0: lxi h,365 mov a,c ani 03h ; Not strictly true, but works until year 2100... jnz prdat1 inx h prdat1: push h ora a dsbc d pop h jnc prdat2 ; done computing year... xchg ora a dsbc d xchg inr c mov a,b adi 1 daa mov b,a jmp prdat0 prdat2: ; DE = days within year 'C' push b ; save (2-digit) year, B = BCD, C = binary (until 2155) lxi h,month0+24 mov a,c ani 03h jnz prdat3 lxi h,month1+24 prdat3: ; compute month, DE = days in year,HL = mon-yr-days table adj for leap mvi b,12 prdat4: dcx h dcx h dcr b jm prdat5 ; should never happen... push h push d mov a,m inx h mov h,m mov l,a ; DE = days in year, HL = ytd[month] ora a dsbc d mov a,l ; potential remainder (neg) pop d pop h jnc prdat4 prdat5: ; B = month, 0-11; A = -dom neg push psw inr b mov a,b call decout mvi e,'/' mvi c,CONOUT call BDOS pop psw call decout mvi e,'/' mvi c,CONOUT call BDOS pop b mov a,b ; already BCD call hexout mvi e,' ' mvi c,CONOUT call BDOS pop h ; -> BCD hours mov a,m inx h push h call hexout mvi e,':' mvi c,CONOUT call BDOS pop h ; -> BCD minutes mov a,m inx h push h call hexout mvi e,':' mvi c,CONOUT call BDOS pop h ; -> BCD seconds mov a,m jmp hexout ; J F M A M J J A S O N D month0: dw 0, 31, 59, 90,120,151,181,212,243,273,304,334 month1: dw 0, 31, 60, 91,121,152,182,213,244,274,305,335 start: mvi c,GETVER call BDOS shld vers mov a,l cpi 30 jc badvers lxi h,CMDLN mov c,m inx h sid1: mov a,m cpi ' ' jnz sid0 inx h dcr c jnz sid1 jmp start1 ; no params, use defaults sid0: ; scan hex number as server ID xchg lxi h,0 sid2: ldax d inx d call hexnum jc sid3 dcr c jnz sid2 sid3: mov a,l sta gettime+1 start1: ; TODO: handle MP/M... lxi d,scbpb mvi c,SGSCB call BDOS shld scbadr lhld vers mvi a,2 ; bit for CP/Net ana h jz nocpnet lxi d,gettime mvi c,NSEND call BDOS ora a jnz error lxi d,gottime mvi c,NRECV call BDOS ora a jnz error jmp settime nocpnet: call netinit lxi b, gettime call sendmsg ora a jnz error lxi b, gottime call receivemsg ora a jnz error settime: lhld scbadr lxi d,058h ; date/time dad d xchg lxi h,gottime+5 lxi b,5 ; length of date/time di ldir ei lxi d,done mvi c,PRINT call BDOS lxi h,gottime+5 call prdate ret error: lxi d,errmsg mvi c,PRINT call BDOS ret badvers: lxi d,vermsg mvi c,PRINT call BDOS ret done: db 'Time was set to: $' errmsg: db 7,'Error retrieving network time.$' vermsg: db 7,'This program requires BDOS >= 3.0.$' ; These are only used if CP/Net is not running. netinit: lda ioport mov c,a inr c outp a inp a sta gettime+2 ret ; Send Message on Network sendmsg: ; BC = message addr mov h,b mov l,c ; HL = message address push h popix lda ioport mov c,a mvi b,5 ; length of header outir ldx b,4 ; msg siz field (-1) inr b ; might be 0, but that means 256 outir inr c ; status port inp a ; ani 02h ; cmd overrun rz mvi a,0ffh ret ; Receive Message from Network receivemsg: ; BC = message addr mov h,b mov l,c ; HL = message address push h popix lda ioport mov c,a inr c ; status port rcvwait: inp a ani 01h ; data ready jz rcvwait dcr c mvi b,5 ; header length inir ldx b,4 ; msg siz inr b inir inr c inp a ani 04h ; rsp overrun rz mvi a,0ffh ret end anced to return a full sector of directory entries in the case of searching with the drive set to '?', as is done by DIR.COM with the [FULL] option. This allows retrieval of SFCB data from the last directory entry of each block (which is not otherwise returned). GET TIME AND DATE does not require networked disks and is not used by NDOS3, but may be used by other programs such as NTPDATE. ///2NDOS3 Syntax: NDOS3 The NDOS3 command is a simple loader for the NDOS3 RSX. It loads NDOS3 regardless of whether it is already loaded. Once loaded and resident, NDOS3 implements CP/NET - all calls to BDOS function 12 GET VERSION return H with bit 02H set to indicate CP/NET is active. ///1CPNETSTS Syntax: CPNETSTS Explanation: The CPNETSTS command displays the requester configuration table. The requester configuration table indicates the status of each logical device that is either local or assigned to a specific server on the network. Example: A>NETSTAT CP/NET 1.2 Status ================= Requester ID = 02H Network Status Byte = 10H Disk device status: Drive A: = LOCAL Drive B: = LOCAL Drive C: = LOCAL Drive D: = LOCAL Drive E: = LOCAL Drive F: = LOCAL Drive G: = LOCAL Drive H: = LOCAL Drive I: = LOCAL Drive J: = LOCAL Drive K: = LOCAL Drive L: = LOCAL Drive M: = LOCAL Drive N: = LOCAL Drive O: = LOCAL Drive P: = Drive F: on Network Server ID = 00H Console Device = LOCAL List Device = LOCAL ///1DATE Syntax: DATE {CONTINUOUS} DATE {time-specification} DATE SET Explanation: The DATE command lets you display and set the date and time of day. ///2Examples A>DATE Displays the current date and time. A>DATE C Displays the date and time continuously. A>DATE 08/14/82 10:30:0 Sets the date and time. A>DATE SET Prompts for date and time entries. ///1DEVICE Syntax: DEVICE { NAMES | VALUES | physical-dev | logical-dev} DEVICE logical-dev=physical-dev {option} {,physical-dev {option},...} DEVICE logical-dev = NULL DEVICE physical-dev {option} DEVICE CONSOLE [ PAGE | COLUMNS = columns | LINES = lines] Explanation: DEVICE displays current logical device assignments and physical device names. DEVICE assigns logical devices to peripheral devices attached to the computer. DEVICE also sets the communications protocol and speed of a peripheral device, and displays or sets the current console screen size. ///2Options [ XON | NOXON | baud-rate ] XON refers to the XON/XOFF communications protocol. NOXON indicates no protocol and the computer sends data to the device whether or not the device is ready to receive it. baud-rate is the speed of the device. The system accepts the following baud rates: 50 75 110 134 150 300 600 1200 1800 2400 3600 4800 7200 9600 19200 ///2Examples A>DEVICE Displays the physical devices and current assignments of the logical devices in the system. A>DEVICE NAMES Lists the physical devices with a summary of the device characteristics. A>DEVICE VALUES Displays the current logical device assignments. A>DEVICE CRT Displays the attributes of the physical device CRT. A>DEVICE CON Displays the assignment of the logical device CON: A>DEVICE CONOUT:=LPT,CRT Assigns the system console output (CONOUT:) to the printer (LPT) and the screen (CRT). A>DEVICE AUXIN:=CRT2 [XON,9600] Assigns the auxiliary logical input device (AUXIN:) to the physical device CRT using protocol XON/XOFF and sets the transmission rate for the device at 9600. A>DEVICE LST:=NULL Disconnects the list output logical device (LST:). A>DEVICE LPT [XON,9600] Sets the XON/XOFF protocol for the physical device LPT and sets the transmission speed at 9600. A>DEVICE CONSOLE [PAGE] Displays the current console page width in columns and length in lines. A>DEVICE CONSOLE [COLUMNS=40 LINES=16] Sets the screen size to 40 columns and 16 lines. ///1DIR The DIR command displays the names of files and the characteristics associated with the files. The DIR command has three distinct references: DIR DIRS DIR with Options DIR and DIRS are built-in utilities. DIR with Options is a transient utility and must be loaded into memory from the disk. ///2Built-in Syntax: DIR {d:} DIR {filespec} DIRS {d:} DIRS {filespec} Explanation: The DIR and DIRS Built-in commands display the names of files cataloged in the directory of an on-line disk. DIR lists the names of files in the current user number that have the Directory (DIR) attribute. DIR accepts the * and ? wildcards in the file specification. ///3Examples A>DIR Displays all files in user 0 on drive A that have the Directory attribute. A>DIR B: Displays all DIR files in user 0 on drive B. 2A>DIR C:ZIPPY.DAT Displays the name ZIPPY.DAT if the file is in user 2 on drive C. 4A>DIR *.BAS Displays all DIR files with filetype BAS in user 4 on drive A. B3>DIR X*.C?D Displays all DIR files in user 3 on drive B whose filename begins with the letter X, and whose three character filetype contains the first character C and last character D. A>DIRS Displays all files for user 0 on drive A that have the system (SYS) attribute. A>DIRS *.COM Displays all SYS files with filetype COM on drive A in user 0. A command (.COM) file in user 0 with the system attribute can be accessed from any user number on that drive, and from any drive in the search chain (see SETDEF). ///2withOptions Syntax: DIR {d:} [options] DIR {filespec} {filespec} ... [options] Explanation: The DIR command with options is an enhanced version of the DIR built-in command and displays your files in a variety of ways. DIR can search for files on any or all drives, for any or all user numbers. One or two letters is sufficient to identify an option. You need not type the right hand square bracket. ///3Options Option Function ATT displays the file attributes. DATE displays date and time stamps of files. DIR displays only files that have the DIR attribute. DRIVE=ALL displays files on all on-line drives. DRIVE=(A,B,C,...,P) displays files on the drives specified. DRIVE=d displays files on the drive specified by d. EXCLUDE displays files that DO NOT MATCH the files specified in the command line. FF sends an initial form feed to the printer device if the printer has been activated by CTRL-P. FULL shows the name, size, number of 128-byte records, and attributes of the files. If there is a directory label on the drive, DIR shows the password protection mode and the time stamps. If there is no directory label, DIR displays two file entries on a line, omitting the password and time stamp columns. The display is alphabetically sorted. (See SET for a description of file attributes, directory labels, passwords and protection modes.) LENGTH=n displays n lines of printer output before inserting a table heading. n is a number between 5 and 65536. MESSAGE displays the names of drives and user numbers DIR is searching. NOSORT displays files in the order it finds them on the disk. RO displays only the files that have the Read-Only attribute. RW displays only the files that are set to Read-Write. SIZE displays the filename and size in kilobytes (1024 bytes). SYS displays only the files that have the SYS attribute. USER=ALL displays all files in all user numbers for the default or specified drive. USER=n displays the files in the user number specified by n. USER=(0,1,...,15) displays files under the user numbers specified. ///3Examples A>DIR C: [FULL] Displays full set of characteristics for all files in user 0 on drive C. A>DIR C: [DATE] Lists the files on drive C and their dates. A>DIR D: [RW,SYS] Displays all files in user 0 on drive D with Read-Write and System attributes. 3A>DIR [USER=ALL, DRIVE=ALL] Displays all the files in all user numbers (0-15) in all on- line drives. B6>DIR [exclude] *.DAT Lists all the files on drive B in user 6 that do not have a filetype of .DAT. 3B>DIR [SIZE] *.PLI *.COM *.ASM Displays all the files of type PLI, COM, and ASM in user 3 on drive B in size display format. A>DIR [drive=all user=all] TESTFILE.BOB DIR displays the filename TESTFILE.BOB if it is found on any drive in any user number. A>DIR [size,rw] D: DIR lists each Read-Write file that resides on Drive D, with its size in kilobytes. Note that D: is equivalent to D:*.*. ///1DSKRESET Syntax: DSKRESET {drive(s)} Explanation: The DSKRESET command functions exactly like the PRL that executes under MP/M II. DSKRESET resets the specified drive, so a disk can be changed. drive(s) is a comma-separated list of the drive names to be reset. Example: A>DSKRESET P: ///1DUMP Syntax: DUMP filespec Explanation: DUMP displays the contents of a file in hexadecimal and ASCII format. Example: A>DUMP ABC.TEX ///1ed Format: ED input-filespec {d:|output-filespec} Explanation: Character file editor. To redirect or rename the new version of the file specify the destination drive or destination filespec. ///2commands ED Command Summary Command Action nA append n lines from original file to memory buffer 0A append file until buffer is one half full #A append file until buffer is full (or end of file) B, -B move CP to the beginning (B) or bottom (-B) of buffer nC, -nC move CP n characters forward (C) or back (-C) through buffer nD, -nD delete n characters before (-D) or from (D) the CP E save new file and return to CP/M-86 Fstring{^Z} find character string H save new file, reedit, use new file as original file I enter insert mode Istring{^Z} insert string at CP Jsearch_str^Zins_str^Zdel_to_str juxtapose strings nK, -nK delete (kill) n lines from the CP nL, -nL, 0L move CP n lines nMcommands execute commands n times n, -n move CP n lines and display that line n: move to line n :ncommand execute command through line n Nstring{^Z} extended find string O return to original file nP, -nP move CP 23 lines forward and display 23 lines at console Q abandon new file, return to CP/M-86 R{^Z} read X$$$$$$$.LIB file into buffer Rfilespec{^Z} read filespec into buffer Sdelete string^Zinsert string substitute string nT, -nT, 0T type n lines U, -U upper-case translation V, -V line numbering on/off 0V display free buffer space nW write n lines to new file 0W write until buffer is half empty nX write or append n lines to X$$$$$$$.LIB nXfilespec{^Z} write n lines to filespec; append if previous xcommand applied to same file 0x{^Z} delete file X$$$$$$$.LIB 0xfilespec{^Z} delete filespec nZ wait n seconds Note: CP points to the current character being referenced in the edit buffer. Use {^Z} to separate multiple commands on the same line. ///2Examples A>ED TEST.DAT A>ED TEST.DAT B: A>ED TEST.DAT TEST2.DAT A>ED TEST.DAT B:TEST2.DAT ///1erase Syntax: ERASE {filespec} {[CONFIRM]} Explanation: The ERASE command removes one or more files from the directory of a disk. Wildcard characters are accepted in the filespec. Directory and data space are automatically reclaimed for later use by another file. The ERASE command can be abbreviated to ERA. ///2Option [CONFIRM] option informs the system to prompt for verification before erasing each file that matches the filespec. CONFIRM can be abbreviated to C. ///2Examples A>ERASE X.PAS Removes the file X.PAS from the disk in drive A. A>ERA *.PRN Confirm (Y/N)?Y All files with the filetype PRN are removed from the disk in drive A. B>ERA A:MY*.* [CONFIRM] Each file on drive A with a filename that begins with MY is displayed with a question mark for confirmation. Type Y to erase the file displayed, N to keep the file. A>ERA B:*.* Confirm (Y/N)?Y All files on drive B are removed from the disk. ///1filespec FILESPEC FORMAT CP/M 3 identifies every file by its unique file specification, which can consist of four parts: the drive specification, the filename, the filetype and the password. The term "filespec" indicates any valid combination of the four parts of a file specification, all separated by their appropriate delimiters. A colon must follow a drive letter. A period must precede a filetype. A semicolon must precede a password. The symbols and rules for the parts of a file specification follow: d: drivespec optional single alpha character (A-P) filename filename 1-8 letters and/or numbers typ filetype optional 0-3 letters and/or numbers password password optional 0-8 letters and/or numbers Valid combinations of the elements of a CP/M 3 file specification are: filename d:filename filename.typ d:filename.typ filename;password d:filename;password filename.typ;password d:filename.typ;password If you do not include a drive specifier, CP/M 3 automatically uses the default drive. Some CP/M 3 commands accept wildcard (* and ?) characters in the filename and/or filetype parts of the command tail. A wildcard in the command line can in one command reference many matching files on the default or specified user number and drive. (See Commands). ///1GENCOM Syntax: GENCOM {COM-filespec} {RSX-filespec} ... {[LOADER | NULL | SCB=(offset,value)]} Explanation: The GENCOM command creates a special COM file with attached RSX files. The GENCOM command can also restore a previously GENCOMed file to the original COM file without the header and RSX's. GENCOM can also attach header records to COM files. ///2Options LOADER sets a flag to keep the program loader active. NULL indicates that only RSX files are specified. GENCOM creates a dummy COM file for the RSX files. The output COM filename is taken from the filename of the first RSX-filespec. SCB=(offset,value) sets the System Control Block from the program by using the hex values specified by (offset,value). ///2Examples A>GENCOM MYPROG PROG1 PROG2 Generates a ; NETWORK DISK OPERATING SYSTEM FOR CP/NET on CP/M Plus v3 ; ; 1982.12.31. exact date unknown ; 2016.05.20. adapted for RSX on CP/M Plus ; Dropped support for remote console/list, due to BIOS intercept issues. ; BIOS intercept is a problem because of the transient nature of RSXs. ; Could add back support for "well-behaved" LIST OUTPUT users, ; provided BIOS intercept is not required. ; ;TITLE NETWORK DISK OPERATING SYSTEM FOR CP/NET SLAVE maclib z80 extrn NTWKIN, NTWKST, CNFTBL, SNDMSG, RCVMSG, NTWKBT, CFGTBL ; ; ; EQUATIONS OF DATA ; 000A = LF EQU 0AH ;LINE FEED 000D = CR EQU 0DH ;CARRIAGE RETURN 001A = EOF EQU 1AH ;CTRL-Z IS END OF FILE 00FF = LEOF EQU 0ffh ;-1 is logical end of file ; 0000 = TOP equ 0000h 0004 = CDISK equ 0004h 0005 = BDOS equ 0005h 0080 = SYSDMA equ 0080h 0100 = TPA equ 0100h 0080 = SCTLNG equ 128 ;ONE SECTOR LENGTH ; ; EQUATIONS OF DOS FUNCTION ; 0003 = CCNDIN EQU 3 ;CONSOLE INPUT WITH DEVICE CODE 0004 = CCNDOT EQU 4 ;CONSOLE OUTPUT WITH DEVICE CODE 0009 = CBUFPR EQU 9 ;BUFFER PRINT 000A = CRDBUF EQU 10 ;READ BUFFER 000B = CCONST EQU 11 ;GET CONSOLE STATUS 000C = CGETVR EQU 12 ;GET VERSION NUMBER 000D = CRSDSK EQU 13 ;RESET DISK 000F = COPEN EQU 15 ;OPEN FILE 0010 = CCLOSE EQU 16 ;CLOSE FILE 0011 = CSRFST EQU 17 ;SEARCH FIRST 0012 = CSRNXT EQU 18 ;SEARCH NEXT DIRECTORY 0014 = CREAD EQU 20 ;READ SEQ 0015 = CWRITE EQU 21 ;WRITE SEQ 001A = CSTDMA EQU 26 ;SET DMA ADDRESS 001B = CGTALL EQU 27 ;get alloc vector addr 001F = CGTDPB EQU 31 ;get DPB addr 0020 = CSTUSC EQU 32 ;SET USER CODE 0021 = CRREAD EQU 33 ;READ SEQ 0022 = CRWRIT EQU 34 ;WRITE SEQ 0025 = CRSDSN EQU 37 ;RESET DISK BY DISK VERCTOR 002E = CFRSP equ 46 ; get disk free space 0031 = scbf equ 49 ; get/set SCB 0032 = CBIOS equ 50 ; direct BIOS call 003B = COVLY equ 59 ; load overlay 003C = CRSX equ 60 ; call RSX function 006A = CDEFPW EQU 106 ;set default password 0070 = CLSBLK equ 112 ; List Block - does not fit in table... 0032 = CBMAX EQU 50 ;MAX OF BDOS FUNCTION - CXMIN.. collapsed here 0062 = CXMIN EQU 98 ;extended bdos functions base - collapse into CBMAX ; 0040 = CNMIN EQU 64 ;MIN OF NDOS FUNCTION 0040 = CLOGIN EQU 64 ;LOGIN 0041 = CLOGOF EQU 65 ;LOGOFF 0048 = CNMAX EQU 72 ;MAX OF NDOS FUNCTION ; ; SLAVE CONFIGRATION TABLE ; ; -1 NETWORK STATUS ; 0 SLAVE PROCESSOR ID ; 1-32 A - P DISK DEVICE CODE ; 33-34 CONSOLE DEVICE ; 35-36 LIST DEVICE ; 37 LIST BUFFER COUNTER ; 38-42 MESSAGE HEADER FOR LIST OUT ; 43 LISTER DEVICE NUMBER ; 44-171 LIST OUT DATA BUFFER ; ; EACH DEVICE DATA USED 2 BYTES ; IN 1-36 ; 1B:BIT 7 H ON NETWORK ; BIT 6 H SET UP IN DISK ; BIT 0-3 DEVICE NUMBER IN MASTER ; 2B:MASTER ID ; ; BIAS TO DATA IN CONFIGRATION TABLE ; 0001 = BSRID equ 1 ;client ID 0002 = BSDSKS equ 2 ;first byte in disk table 0021 = BSDSKE equ 33 ;last byte in disk table 0022 = BSCONS EQU 34 ;BIAS TO CONSOLE DATA 0024 = BSLIST EQU 36 ;BIAS TO LISTER DATA 0021 = FCBRR0 equ 33 ; offset of RR0 field in FCB (not FCB in MSG) 009C = scbase equ 09ch ; base address of SCB within page 0000 org 0 ; RSX Prefix 0000 0000000000serial: db 0,0,0,0,0,0 0006 C3D401 start: jmp COLDST 0009 C30000 next: jmp 0 000C 0000 prev: dw 0 000E 00 remove: db 0 ; 0ffh for remove nonbank: 000F 00 db 0 0010 4E444F5333rsxnam: db 'NDOS3 ' 0018 000000 loader: db 0,0,0 001B 434F505952 db 'COPYRIGHT (C) 1980-82, DIGITAL RESEARCH ' 0043 0000000000 db 0,0,0,0,0,0 0049 0D0A4E444FNDERRM: db CR,LF,'NDOS Err $' 0055 2C2046756ENDERR2: db ', Func $' 005D 0000 BDOSE: dw 0 005F 00 CURSID: db 0 0060 0000 scbadr: dw 0 0062 00 MSGTOP: db 0 0063 00 MSGID: db 0 0064 00 db 0 ; We assume network hw/sw sets this. 0065 00 MSGFUN: db 0 0066 00 MSGSIZ: db 0 0067 MSGDAT: ds 256 0167 C7C7C7C7C7 db 0c7h,0c7h,0c7h,0c7h,0c7h,0c7h 016D C7C7C7C7C7 db 0c7h,0c7h,0c7h,0c7h,0c7h,0c7h 0173 C7C7C7C7C7 db 0c7h,0c7h,0c7h,0c7h,0c7h,0c7h 0179 C7C7C7C7C7 db 0c7h,0c7h,0c7h,0c7h,0c7h,0c7h 017F C7C7C7C7C7 db 0c7h,0c7h,0c7h,0c7h,0c7h,0c7h 0185 C7C7C7C7C7 db 0c7h,0c7h,0c7h,0c7h,0c7h,0c7h 018B C7C7C7C7C7 db 0c7h,0c7h,0c7h,0c7h,0c7h,0c7h 0191 C7C7C7C7C7 db 0c7h,0c7h,0c7h,0c7h,0c7h,0c7h 0197 C7C7C7C7C7 db 0c7h,0c7h,0c7h,0c7h,0c7h,0c7h 019D C7C7C7C7C7 db 0c7h,0c7h,0c7h,0c7h,0c7h,0c7h 01A3 STACK: ds 0 01A3 0000 USTACK: dw 0 01A5 00 FUNCOD: db 0 01A6 0000 PARAMT: dw 0 01A8 00 RETCOD: db 0 01A9 0000 MCRPNT: dw 0 01AB 00 LSTUNT: db 0 01AC 00 F5SETF: db 0 01AD 00 FNTMPF: db 0 01AE 0000 ORGBIO: dw 0 01B0 000024 HEXMSG: db 0,0,'$' 01B3 496E697420CLDERR: db 'Init err$' COLDSE: ; BC and DE are pushed... 01BC 11B301 lxi d,CLDERR 01BF 0E09 mvi c,CBUFPR 01C1 CD0900 call next 01C4 210900 lxi h,next 01C7 220700 shld start+1 ; only until remove takes place... 01CA 3EFF mvi a,0ffh 01CC 320E00 sta remove 01CF C1 pop b 01D0 D1 pop d 01D1 C30900 jmp next ; pass to BDOS and hope for the best... ; Not a true cold start - we are in context of a valid BDOS call... COLDST: 01D4 D5 push d 01D5 C5 push b 01D6 CD0000 call NTWKIN 01D9 B7 ora a 01DA C2BC01 jnz COLDSE 01DD 216502 lxi h,NDOSE 01E0 220700 shld start+1 01E3 AF xra a ; 01E4 320E00 sta remove ; is the required? 01E7 216700 lxi h,MSGDAT 01EA 22A901 shld MCRPNT ; Apparently, it is passe to use BDOS calls for certain things... 01ED 110502 lxi d,scbadd 01F0 0E31 mvi c,scbf 01F2 CD0900 call next 01F5 226000 shld scbadr 01F8 114402 lxi d,CSTUP 01FB 0E09 mvi c,CBUFPR 01FD CD0900 call next 0200 C1 pop b 0201 D1 pop d 0202 C30900 jmp next 0205 3A00 scbadd: db 03ah, 0 0207 2A6000 BDERMD: lhld scbadr 020A 2EE7 mvi l,scbase+4bh 020C 7E mov a,m 020D C9 ret 020E 2A6000 SYSMSC: lhld scbadr 0211 2EE6 mvi l,scbase+4ah 0213 7E mov a,m 0214 C9 ret 0215 2A6000 CURUSR: lhld scbadr 0218 2EE0 mvi l,scbase+44h 021A 7E mov a,m 021B C9 ret ; Some sneaky programs, like ERASE.COM, use the "saved search address" from the SCB. ; so we must put the address there if the BDOS does not (i.e. networked drive). 021C 2AA601 SETSRA: lhld PARAMT 021F EB xchg 0220 2A6000 lhld scbadr 0223 2EE3 mvi l,scbase+47h 0225 73 mov m,e 0226 23 inx h 0227 72 mov m,d 0228 C9 ret 0229 2A6000 SETDSK: lhld scbadr 022C 2EDA mvi l,scbase+3eh 022E 3AA601 lda PARAMT 0231 77 mov m,a 0232 C9 ret 0233 2A6000 CURDSK: lhld scbadr 0236 2EDA mvi l,scbase+3eh 0238 7E mov a,m 0239 C9 ret 023A 2A6000 DMAADD: lhld scbadr 023D 2ED8 mvi l,scbase+3ch 023F 7E mov a,m 0240 23 inx h 0241 66 mov h,m 0242 6F mov l,a 0243 C9 ret 0244 4E444F5333CSTUP: DB 'NDOS3 Started.',CR,LF,'$' 0255 4E444F5333CSTDN: DB 'NDOS3 Ending.',CR,LF,'$' ;wbmsg: DB 'NDOS3 Warm-boot.',CR,LF,'$' NDOSE: 0265 79 mov a,c ; must save REAL function code! 0266 32A501 sta FUNCOD 0269 326500 sta MSGFUN 026C B7 ora a 026D CAE009 jz WARMST 0270 FE3B cpi COVLY 0272 CAE009 jz LDOVLY ; LOAD OVERLAY (RSX SCRUB) - indication of warm boot 0275 FE3C cpi CRSX 0277 CAEA09 jz CALRSX ; used to unload CP/Net 027A FE32 cpi CBIOS 027C CA0900 jz next ; DIRECT BIOS CALL - might need to trap for LIST OUT 027F 21C903 lxi h,FUNTBS NDOSE1: 0282 79 mov a,c 0283 96 sub m 0284 DA0900 jc next 0287 23 inx h 0288 BE cmp m 0289 23 inx h 028A DA9702 jc NDOSE2 028D 23 inx h 028E 23 inx h 028F 7E mov a,m 0290 B7 ora a 0291 C28202 jnz NDOSE1 0294 C30900 jmp next NDOSE2: sspd USTACK 0297+ED73 DB 0EDH,73H 0299+A301 DW USTACK 029B 31A301 lxi sp,STACK 029E 4F mov c,a ; modified func code! 029F 7E mov a,m 02A0 23 inx h 02A1 66 mov h,m 02A2 6F mov l,a ; HL = func table 02A3 E5 push h 02A4 EB xchg 02A5 22A601 shld PARAMT 02A8 CD3A02 call DMAADD 02AB 22B809 shld DMAADR ; cache DMA address for this call... 02AE 216600 lxi h,MSGSIZ 02B1 3600 mvi m,0 ; assume 1-byte payload 02B3 23 inx h 02B4 22A901 shld MCRPNT ; MSGDAT 02B7 AF xra a 02B8 47 mov b,a 02B9 57 mov d,a 02BA E1 pop h ; specific func table in HL 02BB 09 dad b 02BC 5E mov e,m ; don't need HL anymore 02BD 93 sub e ; assumes A=0 02BE CA2604 jz tnextp ; code 0 = not handled by CP/Net NDOSE4: 02C1 210D04 lxi h,NDENDR 02C4 E5 push h 02C5 213003 lxi h,FUNTB2 02C8 19 dad d 02C9 E5 push h NDOSE5: 02CA C1 pop b 02CB 0A ldax b 02CC 57 mov d,a 02CD E67F ani 07fh ; strip off EOP bit 02CF 5F mov e,a 02D0 7A mov a,d 02D1 1600 mvi d,0 02D3 21E602 lxi h,FUNTB3 02D6 19 dad d 02D7 5E mov e,m 02D8 23 inx h 02D9 56 mov d,m 02DA 03 inx b 02DB 17 ral 02DC DAE402 jc NDOSE6 02DF C5 push b 02E0 21CA02 lxi h,NDOSE5 02E3 E5 push h NDOSE6: 02E4 EB xchg 02E5 E9 pchl FUNTB3: 02E6 0000 dw 0 ; 0 000h 080h - never called 02E8 D703 dw SNDHDR ; 2 002h 082h 02EA 1904 dw RCVPAR ; 4 004h 084h 02EC 6704 dw SNDFCB ; 6 006h 086h 02EE 6D04 dw CKSFCB ; 8 008h 088h 02F0 E904 dw RENTMP ; 10 00ah 08ah 02F2 FF04 dw WTDTC2 ; 12 00ch 08ch 02F4 0405 dw WTDTC8 ; 14 00eh 08eh 02F6 0905 dw WTDTCP ; 16 010h 090h 02F8 1E05 dw CKSTDK ; 18 012h 092h 02FA EE05 dw BCSTFN ; 20 014h 094h 02FC 1D06 dw BCSTVC ; 22 016h 096h 02FE 3707 dw RCVEC ; 24 018h 098h 0300 9007 dw GTFCB ; 26 01ah 09ah 0302 9C07 dw GTFCCR ; 28 01ch 09ch 0304 9707 dw GTFCRR ; 30 01eh 09eh 0306 DE07 dw GTDIRE ; 32 020h 0a0h 0308 0A08 dw GTOSCT ; 34 022h 0a2h 030A 1E08 dw GTMISC ; 36 024h 0a4h 030C 5908 dw GTLOGV ; 38 026h 0a6h 030E E308 dw LIST1 ; 40 028h 0a8h 0310 BA08 dw SELDSK ; 42 02ah 0aah 0312 EC08 dw LSTBLK ; 44 02ch 0ach 0314 5909 dw GETVER ; 46 02eh 0aeh 0316 0000 dw 0 ; 48 030h 0b0h - to be removed 0318 DA08 dw RESET ; 50 032h 0b2h 031A 6609 dw NWSTAT ; 52 034h 0b4h 031C 6D09 dw NWCFTB ; 54 036h 0b6h 031E 9209 dw SDMSGU ; 56 038h 0b8h 0320 9E09 dw RVMSGU ; 58 03ah 0bah 0322 7509 dw LOGIN ; 60 03ch 0bch 0324 8909 dw LOGOFF ; 62 03eh 0beh 0326 E806 dw STSF ; 64 040h 0c0h 0328 1707 dw STSN ; 66 042h 0c2h 032A 0000 dw 0 ; 68 044h 0c4h - to be removed 032C 1805 dw CKSTDP ; 046h 0c6h 032E 3F05 dw CHKMSC ; 048h 0c8h ; hi bit is "end" signal, else keep executing routines in list... ; byte & 07fh is index into FUNTB3, routine to call. FUNTB2: 0330 80 db 080h ; - never called 0001 = fgtvr equ $-FUNTB2 0331 AE db 0aeh ; 0002 = frssy equ $-FUNTB2 0332 B2 db 0b2h ; 0003 = frsvc equ $-FUNTB2 0333 96 db 096h ; 0004 = fsldk equ $-FUNTB2 0334 AA db 0aah ; 0005 = fopfi equ $-FUNTB2 0335 080E189A db 008h, 00eh, 018h, 09ah ; 0009 = fdlfi equ $-FUNTB2 0339 0698 db 006h, 098h ; 000B = fsrfs equ $-FUNTB2 033B 4018A0 db 040h, 018h, 0a0h ; 000E = fsrnx equ $-FUNTB2 033E 4218A0 db 042h, 018h, 0a0h ; 0011 = frdsq equ $-FUNTB2 0341 4806181CA2 db 048h, 006h, 018h, 01ch, 0a2h ; READ SEQ 0016 = fwrsq equ $-FUNTB2 0346 480810189C db 048h, 008h, 010h, 018h, 09ch ; WRITE SEQ 001B = frefi equ $-FUNTB2 034B 080A0298 db 008h, 00ah, 002h, 098h ; 001F = flgvc equ $-FUNTB2 034F A6 db 0a6h ; 0020 = fgtal equ $-FUNTB2 0350 120218A4 db 012h, 002h, 018h, 0a4h ; 0024 = fwrpr equ $-FUNTB2 0354 120298 db 012h, 002h, 098h ; 0027 = fstfi equ $-FUNTB2 0357 06189C db 006h, 018h, 09ch ; 002A = frdrr equ $-FUNTB2 035A 4806181EA2 db 048h, 006h, 018h, 01eh, 0a2h ; READ RAND 002F = fwrrr equ $-FUNTB2 035F 480810189E db 048h, 008h, 010h, 018h, 09eh ; WRITE RAND [ZEROFIL] 0034 = fgtsz equ $-FUNTB2 0364 06189E db 006h, 018h, 09eh ; 0037 = flkrc equ $-FUNTB2 0367 080C189E db 008h, 00ch, 018h, 09eh ; 003B = fstpw equ $-FUNTB2 036B 94 db 094h ; 003C = flgin equ $-FUNTB2 036C 3C98 db 03ch, 098h ; 003E = flgof equ $-FUNTB2 036E 3E98 db 03eh, 098h ; 0040 = fsdnw equ $-FUNTB2 0370 B8 new COM file MYPROG.COM with attached RSX's PROG1 and PROG2. A>GENCOM PROG1 PROG2 [NULL] Creates a COM file PROG1.COM with RSX's PROG1 and PROG2. A>GENCOM MYPROG GENCOM takes MYPROG.COM, strips off the header and deletes all attached RSX's to restore it to its original COM format. A>GENCOM MYPROG PROG1 PROG2 GENCOM looks at the already-GENCOMed file MYPROG.COM to see if PROG1.RSX and PROG2.RSX are already attached RSX files in the module. If either one is already attached, GENCOM replaces it with the new RSX module. Otherwise, GENCOM appends the specified RSX files to the COM file. ///1GET Syntax: GET {CONSOLE INPUT FROM} FILE filespec{[{ECHO|NO ECHO} | SYSTEM]} GET {CONSOLE INPUT FROM} CONSOLE Explanation: GET directs the system to take console input from a file for the next system command or user program entered at the console. Console input is taken from a file until the program terminates. If the file is exhausted before program input is terminated, the program looks for subsequent input from the console. If the program terminates before exhausting all its input, the system reverts back to the console for console input. With the SYSTEM option, the system immediately goes to the specified file for console input. The system reverts to the console for input when it reaches the end of file. Re-direct the system to the console for console input with the GET CONSOLE INPUT FROM CONSOLE command as a command line in the input file. ///2Options ECHO specifies that input is echoed to the console. This is the default option. NO ECHO specifies that file input is not echoed to the console. The program output and the system prompts are not affected by this option and are still echoed to the console. SYSTEM specifies that all system input is immediately taken from the disk file specified in the command line. GET takes system and program input from the file until the file is exhausted or until GET reads a GET console command from the file. ///2Examples A>GET FILE XINPUT A>MYPROG Tells the system to activate the GET utility. Since SYSTEM is not specified, the system reads the next input line from the console and executes MYPROG. If MYPROG program requires console input, it is taken from the file XINPUT. When MYPROG terminates, the system reverts back to the console for console input. A>GET FILE XIN2 [SYSTEM] Immediately directs the system to get subsequent console input from file XIN2 because it includes the SYSTEM option. The system reverts back to the console for console input when it reaches the end of file in XIN2. Or XIN2 may redirect the system back to the console if it contains a GET CONSOLE command. A>GET CONSOLE Tells the system to get console input from the console. This command may be used in a file (previously specified in a GET FILE command), which is already being read by the system for console input. It is used to re-direct the console input back to the console before the end-of-file is reached. ///1HELP Syntax: HELP {topic} {subtopic1 ... subtopic8} {[NOPAGE|LIST]} Explanation: HELP displays a list of topics and provides summarized information for CP/M 3 commands. HELP topic displays information about that topic. HELP topic subtopic displays information about that subtopic. One or two letters is enough to identify the topics. After HELP displays information for your topic, it displays the special prompt HELP> on your screen, followed by a list of subtopics. - Enter ? to display list of main topics. - Enter a period and subtopic name to access subtopics. - Enter a period to redisplay what you just read. - Press the RETURN key to return to the CP/M 3 system prompt. - [NOPAGE] option disables the 24 lines per page console display. - Press any key to exit a display and return to the HELP> prompt. Examples: A>HELP A>HELP DATE A>HELP DIR OPTIONS A>HELP>.OPTIONS HELP>SET HELP>SET PASSWORD HELP>.PASSWORD HELP>. HELP> ///1HEXCOM Syntax: HEXCOM filename Explanation: The HEXCOM Command generates a command file (filetype .COM) from a .HEX input file. It names the output file with the same filename as the input file but with filetype .COM. HEXCOM always looks for a file with filetype .HEX. Example: A>HEXCOM B:PROGRAM Generates a command file PROGRAM.COM from the input hex file PROGRAM.HEX. ///1INITDIR Syntax: INITDIR {d:} Explanation: The INITDIR Command initializes a disk directory to allow date and time stamping of files on that disk. INITDIR can also recover time/date directory space. Example: A>INITDIR C: INITDIR WILL ACTIVATE TIME-STAMPS FOR SPECIFIED DRIVE. Do you want to re-format the directory on C: (Y/N)?Y ///1LIB Syntax: LIB filespec{[I|M|P|D]} LIB filespec{[I|M|P]}=filespec{modifier} {,filespec{modifier} ... } Explanation: A library is a file that contains a collection of object modules. Use the LIB utility to create libraries, and to append, replace, select or delete modules from an existing library. Use LIB to obtain information about the contents of library files. LIB creates and maintains library files that contain object modules in Microsoft REL file format. These modules are produced by Digital Research's relocatable macro-assembler program, RMAC, or any other language translator that pruduces modules in Microsoft REL file format. You can use LINK-80 to link the object modules contained in a library to other object files. LINK-80 automatically selects from the library only those modules needed by the program being linked, and then forms an executable file with a filetype of COM. ///2Options I The INDEX option creates an indexed library file of type .IRL. LINK-80 searches faster on indexed libraries than on non-indexed libraries. M The MODULE option displays module names. P The PUBLICS option displays module names and the public variables for the new library file. D The DUMP option displays the contents of object modules in ASCII form. ///2Modifiers Use modifiers in the command line to instruct LIB to delete, replace, or select modules in a library file. Angle brackets enclose the modules to be deleted or replaced. Parentheses enclose the modules to be selected. LIB Modifiers Delete Replace If module name and filename are the same this shorthand can be used: Select (modFIRST-modLAST,mod1,mod2,...,modN) ///2Examples A>LIB TEST4[P] Displays all modules and publics in TEST4.REL. A>LIB TEST5[P]=FILE1,FILE2 Creates TEST5.REL from FILE1.REL and FILE2.REL and displays all modules and publics in TEST5.REL. A>LIB TEST=TEST1(MOD1,MOD4),TEST2(C1-C4,C6) Creates a library file TEST.REL from modules in two source files. TEST1.REL contributes MOD1 and MOD4. LIB extracts modules C1, C4, and all the modules located between them, as well as module C6 from TEST2.REL. A>LIB FILE2=FILE3 Creates FILE2.REL from FILE3.REL, omitting MODA which is a module in FILE3.REL. A>LIB FILE6=FILE5 Creates FILE6.REL from FILE5.REL, FILEB.REL replaces MODA. A>LIB FILE6=FILE5 Module THISNAME is in FILE5.REL. When LIB creates FILE6.REL from FILE5.REL the file THISNAME.REL replaces the similarly named module THISNAME. A>LIB FILE1[I]=B:FILE2(PLOTS,FIND,SEARCH-DISPLAY) Creates FILE1.IRL on drive A from the selected modules PLOTS, FIND, and modules SEARCH through the module DISPLAY, in FILE2.REL on drive B. ///1LINK Syntax: LINK d:{filespec,{[options]}=}filespec{[options]}{,...} Explanation: LINK combines relocatable object modules such as those produced by RMAC and PL/I-80 into a .COM file ready for execution. Relocatable files can contain external references and publics. Relocatable files can reference modules in library files. LINK searches the library files and includes the referenced modules in the output file. See the CP/M 3 Programmer's Utilities Guide for a complete description of LINK- 80. ///2Options Use LINK option switches to control execution parameters. Link options follow the file specifications and are enclosed within square brackets. Multiple switches are separated by commas. LINK-80 Options A Additional memory; reduces buffer space and writes temporary data to disk B BIOS link in banked CP/M 3 system. 1. Aligns data segment on page boundary. 2. Puts length of code segment in header. 3. Defaults to .SPR filetype. Dhhhh Data origin; sets memory origin for common and data area Gn Go; set start address to label n Lhhhh Load; change default load address of module to hhhh. Default 0100H Mhhhh Memory size; Define free memory requirements for MP/M modules. NL No listing of symbol table at console NR No symbol table file OC Output .COM command file. Default OP Output .PRL page relocatable file for execution under MP/M in relocatable segment OR Output .RSP resident system process file for execution under MP/M OS Output .SPR system page relocatable file for execution under MP/M Phhhh Program origin; changes default program origin address to hhhh. Default is 0100H. Q Lists symbols with leading question mark S Search preceding file as a library $Cd Destination of console messages d can be X (console), Y (printer), or Z (zero output). Default is X. $Id Source of intermediate files; d is disk drive A-P. Default is current drive. $Ld Source of library files; d is disk drive A-P. Default is current drive. $Od Destination of of object file; d can be Z or disk drive A-P. Default is to same drive as first file in the LINK-80 command. $Sd Destination of symbol file; d can be Y or Z or disk drive A-P. Default is to same drive as first file in LINK-80 command. ///2Examples A>LINK b:MYFILE[NR] LINK-80 on drive A uses as input MYFILE.REL on drive B and produces the executable machine code file MYFILE.COM on drive B. The [NR] option specifies no symbol table file. A>LINK m1,m2,m3 LINK-80 combines the separately compiled files m1, m2, and m3, resolves their external references, and produces the executable machine code file m1.COM. A>LINK m=m1,m2,m3 LINK-80 combines the separately compiled files m1, m2, and m3 and produces the executable machine code file m.COM. A>LINK MYFILE,FILE5[s] The [s] option tells LINK-80 to search FILE5 as a library. LINK-80 combines MYFILE.REL with the referenced subroutines contained in FILE5.REL on the default drive A and produces MYFILE.COM on drive A. ///1LOCAL Syntax: LOCAL local-dev Explanation: The LOCAL command enables a requester to reassign selected I/O back to local from the network. The LOCAL command updates the requester configuration table. local-dev is the specification of a local device such as LST:, A:,... CON:. Example: A>LOCAL P: ///1LOGIN Syntax: LOGIN {password}{[mstrID]} Explanation: The LOGIN command allows a requester to log in to a specified server. A requester must log in before any resources on the server can be accessed. Once a requester has logged in, it is not necessary to log in again even though the requester might power down and then power up again. A requester can only be logged off a server by an explicit LOGOFF command issued from the requester. password is an optional 8 ASCII-character password; the default password is PASSWORD. [mstrID] is an optional two-digit server processor ID; the default is [00]. Not all servers require login. Example: A>LOGIN mypasswd[02] ///1LOGOFF Syntax: LOGOFF {[mstrID]} Explanation: The LOGOFF command allows a requester to log off from a specified server. Once a requester has logged off, the server cannot be accessed again until you issue a LOGIN command. [mstrID] is an optional two-digit server processor ID; the default is [00]. Example: A>LOGOFF [02] ///1mac Syntax: MAC filename {$options} Explanation: MAC, the CP/M 3 macro assembler, reads assembly language statements from a file of type .ASM, assembles the statements, and produces three output files with the input filename and filetypes of .HEX, .PRN, and .SYM. Filename.HEX contains INTEL hexadecimal format object code. Filename.PRN contains an annotated source listing that you can print or examine at the console. Filename.SYM contains a sorted list of symbols defined in the program. ///2Examples A>MAC SAMPLE A>MAC SAMPLE $PB AA HB SX ///2options Use options to direct the input and output of MAC. Use a letter with the option to indicate the source and destination drives, and console, printer, or zero output. Valid drive names are A thru O. X, P and Z specify console, printer, and zero output, respectively. Assembly Options That Direct Input/Output A source drive for .ASM file (A-O) H destination drive for .HEX file (A-O, Z) L source drive for macrolibrary .LIB files called by the MACLIB statement. P destination drive for .PRN file (A-O, X, P, Z) S destination drive for .SYM file Assembly Options That Modify Contents Of Output File +L lists input lines read from macrollibrary .LIB files -L suppresses listing (default) +M lists all macro lines as they are processed during assembly -M suppresses all macro lines as they are read during assembly *M lists only hex generated by macro expansions +Q lists all LOCAL symbols in the symbol list -Q suppresses all LOCAL symbols in the symbol list (default) +S appends symbol file to print file -S suppresses creation of symbol file +1 produces a pass 1 listing for macro debugging in .PRN file -1 suppress listing on pass 1 (default) ///1NETSTAT Syntax: NETSTAT Explanation: The NETSTAT command is a terse version of CPNETSTS. It only shows networked devices. Example: A>NETSTAT CP/NET Status ============= Requester ID = 02H Network Status Byte = 10H Device status: Drive P: = Drive F: on Network Server ID = 00H ///1NETWORK Syntax: NETWORK local-dev=server-dev{[srvrID]} Explanation: The NETWORK command enables a requester to assign selected I/O to the network. The NETWORK command updates the requester Configuration table. local-dev db 0b8h ; 0041 = frvnw equ $-FUNTB2 0371 BA db 0bah ; 0042 = fnwst equ $-FUNTB2 0372 B4 db 0b4h ; 0043 = fnwcf equ $-FUNTB2 0373 B6 db 0b6h ; 0044 = fstcp equ $-FUNTB2 ; ***** DUPLICATE of fstpw ***** 0374 94 db 094h ; 0045 = fsvcf equ $-FUNTB2 0375 3E18A4 db 03eh, 018h, 0a4h ; 0048 = fgtdl equ $-FUNTB2 0378 4698 db 046h, 098h ; 004A = fdkms equ $-FUNTB2 037A 460218A4 db 046h, 002h, 018h, 0a4h ; 004E = flst1 equ $-FUNTB2 037E A8 db 0a8h 004F = flstbk equ $-FUNTB2 037F AC db 0ach ; table of message handlers? per BDOS func? ; -1 = ERROR, 0 = PASSTHRU, else index into FUNTB2 FUNTB1: 0380 00 db 0 ; 0 - 0381 00 db 0 ; 1 - 0382 00 db 0 ; 2 - 0383 00 db 0 ; 3 - 0384 00 db 0 ; 4 - 0385 4E db flst1 ; 5 - 038֎ %Rh ;D'bHG$@1X "H䒡 )JdR HH 򘀊r9n1cv;cv;cv;cv;cv;cv;cv;c` q 2B@Y$CB@T|P EB@Vha[ ePpxʇk8Ԁh(8b͡ *@K60Z,:: ~d~d~d0 UX3VshuiNU`6̑U`631N"c1La9 Ap4$' 1n2Mqp4$<(ʲ-W%;e^z_&U ܐ3YB@kjˁg 0HhF6~WXik0#ZylL!Q 0 X _=/0j1D7( t\VpJ zA/% xjnd=("Un/`EY .Ef 6H&Pz8Fi*\K*h  € D@@0I0HRI0a8H"@ O @00Jt[%!0F` @@@(BP| qT/ `07D ; HD2!2dE1!@`F#bRI}Z2+9k40tâPZ0ˬDdk6k8ԀEV*.ե'H*ͦ`ES60 HC'j<'*fFfPFmZ#u0o"ek@FVUj@B-emAH@V@0X ekGV2"1 5nAbZ4 @ͻ@|>n L&dSJ1&KndHE h# XWEj@Y ` : @ KUj@YuVHAY3jx#¦@Tâ** ӈEj@Y,j͡O em\"+f[Pե[VUi@"$#++d[Z HemYVCYVUn@($EnGV!mZQU@ ƌ+X #k+UmB\fZPyGV$Ul]bL'1FwFUCYVYdumK3B 6A 2`LZեT<â`C63n60p(ٵy0364GV%`ٴ$ejY#*!1F" ,ۮ:-a3*=Yd0곀 @vtM,:B !\pFDJVFy?VP|ʲ¶' bͺ+ ?9(0jkRhWp@3tW@b1_,>g> 2<#XWt>fPr\t,Uj@Db+Rͭ2 8úc(;60 ʱ3hԀ1ap6mր+ +P+?D6U\áPIfذw՛^5TbV^ٴ 2h# 6@ % @ %FV*'cV f0FZ`cap1U"Y$ejY"LD&h G $%!20Z,:k1o o 5K2 `V hHF,! *>p>c:99Q]-%:2#-9 9Q 230ӑT49I Y5M3Е#*9 Q 2p6 00 db 0 ; 6 - 0387 00 db 0 ; 7 - 0388 00 db 0 ; 8 - 0389 00 db 0 ; 9 - 038A 00 db 0 ; 10 - 038B 00 db 0 ; 11 - 038C 01 db fgtvr ; 12 - GET VERSION 038D 02 db frssy ; 13 - RESET DISK SYSTEM 038E 04 db fsldk ; 14 - SELECT DISK 038F 05 db fopfi ; 15 - OPEN FILE 0390 05 db fopfi ; 16 - CLOSE FILE 0391 0B db fsrfs ; 17 - SEARCH FIRST 0392 0E db fsrnx ; 18 - SEARCH NEXT 0393 09 db fdlfi ; 19 - DELETE FILE 0394 11 db frdsq ; 20 - READ SEQUENTIAL 0395 16 db fwrsq ; 21 - WRITE SEQUENTIAL 0396 05 db fopfi ; 22 - MAKE FILE 0397 1B db frefi ; 23 - RENAME FILE 0398 1F db flgvc ; 24 - GET LOGIN VECTOR 0399 00 db 0 ; 25 - GET CURRENT DISK 039A 00 db 0 ; 26 - SET DMA ADDR 039B 20 db fgtal ; 27 - GET ALLOC ADDR 039C 24 db fwrpr ; 28 - WRITE PROTECT DISK 039D 1F db flgvc ; 29 - GET R/O VECTOR 039E 27 db fstfi ; 30 - SET FILE ATTR 039F 20 db fgtal ; 31 - GET DPB ADDR 03A0 00 db 0 ; 32 - GET/SET USER CODE 03A1 2A db frdrr ; 33 - READ RANDOM 03A2 2F db fwrrr ; 34 - WRITE RANDOM 03A3 34 db fgtsz ; 35 - GET FILE SIZE 03A4 34 db fgtsz ; 36 - SET RAND RECORD 03A5 03 db frsvc ; 37 - RESET DRIVE 03A6 03 db frsvc ; 38 - ACCESS DRIVE 03A7 03 db frsvc ; 39 - FREE DRIVE 03A8 2F db fwrrr ; 40 - WRITE RAND ZERO FILL 03A9 00 db 0 ; 41 - TEST & WRITE RECORD 03AA 37 db flkrc ; 42 - LOCK RECORD 03AB 37 db flkrc ; 43 - UNLOCK RECORD 03AC 00 db 0 ; 44 - SET MULTISECTOR COUNT 03AD 00 db 0 ; 45 - SET BDOS ERR MODE 03AE 4A db fdkms ; 46 - GET DISK FREE SPACE 03AF 00 db 0 ; 47 - CHAIN TO PROGRAM (***? can't chain to remote program) 03B0 44 db fstcp ; 48 - FLUSH BUFFERS 03B1 00 db 0 ; 49 - GET/SET SCB ; 50..63 - handled by special case 0032 = NFTB1 equ $-FUNTB1 ; if any are passed to server, must preserve FUNCOD as real code FUNTBX: 03B2 44 db fstcp ; 98 - FREE BLOCKS 03B3 05 db fopfi ; 99 - TRUNCATE FILE 03B4 00 db 0 ; 100 - SET DIR LABEL ****support?**** 03B5 48 db fgtdl ; 101 - GET DIR LABEL BYTE 03B6 48 db fgtdl ; 102 - READ FILE DATE-PWD MODE 03B7 00 db 0 ; 103 - WRITE FILE XFCB ****support?**** 03B8 00 db 0 ; 104 - SET DATE & TIME 03B9 00 db 0 ; 105 - GET DATE & TIME - can't support here, use SEND NW MESG 03BA 3B db fstpw ; 106 - SET DEF PASSWORD 03BB 00 db 0 ; 107 - GET SERIAL NUMBER 03BC 00 db 0 ; 108 - GET/SET PGM RET CODE 03BD 00 db 0 ; 109 - GET/SET CONS MODE 03BE 00 db 0 ; 110 - GET/SET OUT DELIM 03BF 00 db 0 ; 111 - PRINT BLOCK 03C0 4F db flstbk ; 112 - LIST BLOCK 000F = NFTBX equ $-FUNTBX ; CP/Net functions, not known to BDOS FUNTBN: 03C1 3C db flgin ; 64 - LOGIN 03C2 3E db flgof ; 65 - LOGOFF 03C3 40 db fsdnw ; 66 - SEND NW MESG 03C4 41 db frvnw ; 67 - RECV NW MESG 03C5 42 db fnwst ; 68 - GET NW STATUS 03C6 43 db fnwcf ; 69 - GET NW CFG 03C7 44 db fstcp ; 70 - SET COMP ATTR 03C8 45 db fsvcf ; 71 - GET SERVER CFG 0008 = NFTBN equ $-FUNTBN FUNTBS: 03C9 0032 db 0,NFTB1 03CB 8003 dw FUNTB1 03CD 4008 db CNMIN,NFTBN 03CF C103 dw FUNTBN 03D1 620F db CXMIN,NFTBX 03D3 B203 dw FUNTBX 03D5 0000 dw 0 SNDHDR: 03D7 216200 lxi h,MSGTOP 03DA 3600 mvi m,0 ; FMT = CP/Net 03DC 23 inx h ; DID (server ID) already set 03DD 23 inx h ; SID, our node ID, will be set by SNIOS 03DE 23 inx h 03DF 23 inx h 03E0 23 inx h 03E1 EB xchg ; DE = MSGDAT 03E2 2AA901 lhld MCRPNT 03E5 AF xra a ; negate DE 03E6 93 sub e 03E7 4F mov c,a 03E8 3E00 mvi a,0 03EA 9A sbb d 03EB 47 mov b,a 03EC 09 dad b ; HL -= DE 03ED 7D mov a,l 03EE B4 ora h 03EF CAF603 jz SNDHD1 ; size set already 03F2 2B dcx h 03F3 EB xchg 03F4 2B dcx h 03F5 73 mov m,e ; SIZ = length - 1 SNDHD1: 03F6 016200 lxi b,MSGTOP SDMSGE: 03F9 CD0000 call SNDMSG 03FC 3C inr a 03FD C0 rnz 03FE C30604 jmp NERROR RVMSGE: 0401 CD0000 call RCVMSG 0404 3C inr a 0405 C0 rnz NERROR: 0406 21FFFF lxi h,-1 0409 7C mov a,h 040A C31004 jmp NDEND NDENDR: 040D 3AA801 lda RETCOD NDEND: 0410 EB xchg 0411 2AA301 lhld USTACK 0414 F9 sphl 0415 EB xchg 0416 6F mov l,a 0417 44 mov b,h 0418 C9 ret RCVPAR: 0419 016200 lxi b,MSGTOP 041C CD0104 call RVMSGE 041F 216700 lxi h,MSGDAT 0422 22A901 shld MCRPNT 0425 C9 ret tnextp: ; abandon call to real BDOS 0426 2AA301 lhld USTACK 0429 F9 sphl TBDOSP: 042A 2AA601 lhld PARAMT 042D EB xchg 042E 3AA501 lda FUNCOD 0431 4F mov c,a 0432 C30900 jmp next CKFCBD: 0435 2AA601 lhld PARAMT 0438 7E mov a,m 0439 3D dcr a 043A F24004 jp CKFCB1 043D CD3302 call CURDSK CKFCB1: 0440 5F mov e,a 0441 1600 mvi d,0 0443 CD4F04 call CHKDSK 0446 FEFF cpi 0ffh 0448 C0 rnz 0449 CD2A04 call TBDOSP 044C C31004 jmp NDEND CHKDSK: 044F 210200 lxi h,CFGTBL+BSDSKS 0452 19 dad d 0453 19 dad d 0454 7E mov a,m 0455 17 ral 0456 DA5C04 jc CHKDS1 ; remote disk 0459 3EFF mvi a,0ffh 045B C9 ret CHKDS1: 045C 1F rar 045D E60F ani 00fh ; remote server disk number 045F 3C inr a 0460 4F mov c,a 0461 23 inx h 0462 7E mov a,m ; remote server node ID 0463 326300 sta MSGID 0466 C9 ret SNDFCB: 0467 CD6D04 call CKSFCB 046A C3D703 jmp SNDHDR CKSFCB: 046D CD3504 call CKFCBD ; check FCB disk for local/remote (local does not return) STFCB: 0470 CD1502 call CURUSR 0473 2AA901 lhld MCRPNT 0476 77 mov m,a ; put USR in msg buf 0477 23 inx h 0478 71 mov m,c ; put DSK in msg buf 0479 23 inx h 047A EB xchg 047B 2AA601 lhld PARAMT 047E 23 inx h 047F EB xchg 0480 0623 mvi b,35 0482 CDF304 call MCPYTS ; copy FCB to msg buf 0485 AF xra a 0486 32AD01 sta FNTMPF 0489 32AC01 sta F5SETF 048C 2AA901 lhld MCRPNT 048F 11DDFF lxi d,-35 0492 19 dad d ; point to start of FCB name in msg buf SUBTMP: 0493 CDB504 call CKDOL ; substitute $NN for $$$ at start of name 0496 0600 mvi b,0 0498 09 dad b ; skip rest of 3 chars 0499 23 inx h 049A 7E mov a,m 049B E680 ani 080h ; check f5' attr - partial close/delete XFCBs only 049D 23 inx h 049E CAAB04 jz SUBTM1 04A1 7E mov a,m 04A2 E680 ani 080h ; check f6' attr - assign passwd/set byte count 04A4 C2AB04 jnz SUBTM1 04A7 3D dcr a 04A8 32AC01 sta F5SETF SUBTM1: 04AB 3AAD01 lda FNTMPF 04AE 87 add a 04AF 32AD01 sta FNTMPF 04B2 23 inx h 04B3 23 inx h 04B4 23 inx h CKDOL: 04B5 0E03 mvi c,3 04B7 3E24 mvi a,'$' CKDOL1: 04B9 BE cmp m 04BA C0 rnz 04BB 23 inx h 04BC 0D dcr c 04BD C2B904 jnz CKDOL1 04C0 EB xchg 04C1 21AD01 lxi h,FNTMPF 04C4 34 inr m 04C5 1B dcx d 04C6 3A0100 lda CFGTBL+BSRID ; client (slave) ID 04C9 47 mov b,a 04CA CDDA04 call HEXDIG 04CD 1B dcx d 04CE 78 mov a,b 04CF 1F rar 04D0 1F rar 04D1 1F rar 04D2 1F rar 04D3 CDDA04 call HEXDIG 04D6 13 inx d 04D7 13 inx d 04D8 EB xchg 04D9 C9 ret HEXDIG: 04DA E60F ani 00fh 04DC FE0A cpi 10 04DE D2E504 jnc HEXDG1 04E1 C630 adi '0' 04E3 12 stax d 04E4 C9 ret HEXDG1: 04E5 C637 adi 'A'-10 04E7 12 stax d 04E8 C9 ret RENTMP: 04E9 2AA901 lhld MCRPNT 04EC 11EDFF lxi d,-19 04EF 19 dad d 04F0 C39304 jmp SUBTMP MCPYTS: 04F3 1A ldax d 04F4 77 mov m,a 04F5 23 inx h 04F6 13 inx d 04F7 05 dcr b 04F8 C2F304 jnz MCPYTS 04FB 22A901 shld MCRPNT 04FE C9 ret WTDTC2: 04FF 0602 mvi b,2 0501 C30B05 jmp WTDTCS WTDTC8: 0504 0608 mvi b,8 0506 C30B05 jmp WTDTCS WTDTCP: 0509 0680 mvi b,SCTLNG WTDTCS: 050B 2AB809 lhld DMAADR 050E EB xchg 050F 2AA901 lhld MCRPNT 0512 CDF304 call MCPYTS 0515 C3D703 jmp SNDHDR CKSTDP: 0518 3AA601 lda PARAMT 051B C32105 jmp STDSK0 CKSTDK: 051E CD3302 call CURDSK STDSK0: 0521 5F mov e,a 0522 1600 mvi d,000h 0524 CD4F04 call CHKDSK 0527 FEFF cpi 0ffh 0529 C23205 jnz STDSK1 052C CD2A04 call TBDOSP 052F C31004 jmp NDEND STDSK1: 0532 326300 sta MSGID 0535 2AA901 lhld MCRPNT 0538 0D dcr c 0539 71 mov m,c 053A 23 inx h 053B 22A901 shld MCRPNT 053E C9 ret ; Handle multi-sector count CHKMSC: 053F CD3504 call CKFCBD ; does not return if disk is local ; From here on, we know the disk is remote 0542 CD0E02 call SYSMSC 0545 FE01 cpi 1 ; skip multi-sector handling if count == 1 0547 C8 rz ; returns to NDOSE5, goto next opcode. 0548 32B709 sta CURMSC 054B E1 pop h ; NDOSE5 ret addr 054C 22B309 shld MSCRET 054F E1 pop h ; FUNTB2 pointer (past CHKMSC) 0550 22B509 shld MSCTBP 0553 3AA501 lda FUNCOD 0556 FE21 cpi CRREAD 0558 DAAC05 jc CKMSC2 ; save rand rec position 055B 2AA601 lhld PARAMT ; FCB 055E 012100 lxi b,FCBRR0 0561 09 dad b 0562 5E mov e,m 0563 23 inx h 0564 56 mov d,m 0565 23 inx h 0566 7E mov a,m 0567 32B209 sta SAVRR+2 056A EB xchg 056B 22B009 shld SAVRR 056E C3AC05 jmp CKMSC2 CKMSC0: 0571 3AA801 lda RETCOD 0574 B7 ora a 0575 C2B805 jnz CKMSC1 0578 3AB709 lda CURMSC 057B 3D dcr a 057C 32B709 sta CURMSC 057F CAB805 jz CKMSC1 0582 216700 lxi h,MSGDAT 0585 22A901 shld MCRPNT 0588 2AB809 lhld DMAADR 058B 018000 lxi b,128 058E 09 dad b 058F 22B809 shld DMAADR 0592 3AA501 lda FUNCOD 0595 FE21 cpi CRREAD 0597 DAAC05 jc CKMSC2 ; advance random record number... is the specification of a local device such as A:, B: ... P:, CON: or LST:. server-dev is the specification of a server device such as A:, B: ... P: in the case of a disk device, or 0, 1 ... 15 in the case of CON: or LST:. A missing server-dev defaults to 0 in the case of CON: or LST:. [srvrID] is an optional two-digit hexadecimal server processor ID. The default is [00]. Example: A>NETWORK P:=F: ///1NTPDATE Syntax: NTPDATE {server} Explanation: The NTPDATE Command sets the local time to that of the specified server. Default server is 00. Server ID is specified in hexadecimal. Example: A>NTPDATE 2 Time was set to: 04/16/16 18:34:12 ///1PATCH Syntax: PATCH filename{.typ} {n} Explanation: The PATCH command displays or installs patch number n to the CP/M 3 system or command files. The patch number n must be between 1 and 32 inclusive. Example: A>PATCH SHOW 2 Patches the SHOW.COM system file with patch number 2. ///1PIP (copy) Syntax: DESTINATION SOURCE PIP d:{Gn} | filespec{[Gn]} = filespec{[o]},... | d:{[o]} Explanation: The file copy program PIP copies files, combines files, and transfers files between disks, printers, consoles, or other devices attached to your computer. The first filespec is the destination. The second filespec is the source. Use two or more source filespecs separated by commas to combine two or more files into one file. [o] is any combination of the available options. The [Gn] option in the destination filespec tells PIP to copy your file to that user number. PIP with no command tail displays an * prompt and awaits your series of commands, entered and processed one line at a time. The source or destination can be any CP/M 3 logical device. ///2Examples COPY A FILE FROM ONE DISK TO ANOTHER A>PIP b:=a:draft.txt A>PIP b:draft.txt = a: B3>PIP myfile.dat=A:[G9] A9>PIP B:[G3]=myfile.dat COPY A FILE AND RENAME IT A5>PIP newdraft.txt=oldraft.txt C8>PIP b:newdraft.txt=a:oldraft.txt COPY MULTIPLE FILES A>PIP b:=draft.* A>PIP b:=*.* B>PIP b:=c:.*.* C>PIP b:=*.txt[g5] C>PIP a:=*.com[wr] B>PIP a:[g3]=c:*.* COMBINE MULTIPLE FILES A>PIP b:new.dat=file1.dat,file2.dat COPY, RENAME AND PLACE IN USER 1 A>pip newdraft.txt[g1]=oldraft.txt COPY, RENAME AND GET FROM USER 1 A>PIP newdraft.txt=oldraft.txt[g1] COPY TO/FROM LOGICAL DEVICES A>PIP b:funfile.sue=con: A>PIP lst:=con: A>PIP lst:=b:draft.txt[t8] A>PIP prn:=b:draft.txt ///2options PIP OPTIONS A Archive. Copy only files that have been changed since the last copy. C Confirm. PIP prompts for confirmation before each file copy. Dn Delete any characters past column n. E Echo transfer to console. F Filter form-feeds from source data. Gn Get from or go to user n. H Test for valid Hex format. I Ignore :00 Hex data records and test for valid Hex format. K Kill display of filespecs on console. L Translate upper case to lower case. N Number output lines O Object file transfer, ^Z ignored. Pn Set page length to n. (default n=60) Qs^Z Quit copying from source at string s. R Read files that have been set to SYStem. Ss^Z Start copying from the source at the string s. Tn Expand tabs to n spaces. U Translate lower case to upper case. V Verify that data has been written correctly. W Write over Read Only files without console query. Z Zero the parity bit. All options except C,G,K,O,R,V and W force an ASCII file transfer, character by character, terminated by a ^Z. ///1PUT Syntax: PUT CONSOLE {OUTPUT TO} FILE filespec {option} | CONSOLE PUT PRINTER {OUTPUT TO} FILE filespec {option} | PRINTER PUT CONSOLE {OUTPUT TO} CONSOLE PUT PRINTER {OUTPUT TO} PRINTER Explanation: PUT puts console or printer output to a file for the next command entered at the console, until the program terminates. Then console output reverts to the console. Printer output is directed to a file until the program terminates. Then printer output is put back to the printer. PUT with the SYSTEM option directs all subsequent console/printer output to the specified file. This option terminates when you enter the PUT CONSOLE or PUT PRINTER command. ///2Options [ {ECHO | NO ECHO} {FILTER | NO FILTER} | {SYSTEM} ] ECHO specifies that output is echoed to the console. This is the default option when you direct console output to a file. NO ECHO specifies that file output is not echoed to the console. NO ECHO is the default for the PUT PRINTER command. FILTER specifies filtering of control characters, which means that control characters are translated to printable characters. For example, an ESCape character is translated to ^[. NO FILTER means that PUT does not translate control characters. This is the default option. SYSTEM specifies that system output as well as program output is written to the file specified by filespec. Output is written to the file until a subsequent PUT CONSOLE command redirects console output back to the console. ///2Examples A>PUT CONSOLE OUTPUT TO FILE XOUT [ECHO] Directs console output to file XOUT with the output echoed to the console. A>PUT PRINTER OUTPUT TO FILE XOUT A>MYPROG Directs the printer output of program MYPROG to file XOUT. The output is not echoed to the printer. A>PUT PRINTER OUTPUT TO FILE XOUT2 [ECHO,SYSTEM] Directs all printer output to file XOUT2 as well as to the printer (with ECHO option), and the PUT is in effect until you enter a PUT PRINTER OUTPUT TO PRINTER command. A>PUT CONSOLE OUTPUT TO CONSOLE Directs console output back to the console. A>PUT PRINTER OUTPUT TO PRINTER Directs printer output back to the printer. ///1RENAME Syntax: RENAME {new-filespec=old-filespec} Explanation: RENAME lets you change the name of a file in the directory of a disk. To change several filenames in one command use the * or ? wildcards in the file specifications. The RENAME command can be abbreviated REN. REN prompts you for input. ///2Examples A>RENAME NEWFILE.BAS=OLDFILE.BAS The file OLDFILE.BAS changes to NEWFILE.BAS on drive A. A>RENAME The system prompts for the filespecs: Enter New Name:X.PRN Enter Old Name:Y.PRN Y .PRN=X .PRN A> File X.PRN is renamed to Y.PRN on drive A. B>REN A:PRINTS.NEW = PRINCE.NEW The file PRINCE.NEW on drive A changes to PRINTS.NEW on drive A. A>RENAME S*.TEX=A*.TEX The above command renames all the files matching A*.TEX to files with filenames S*.TEX. A>REN B:NEWLIST=B:OLDLIST The file OLDLIST changes to NEWLIST on drive B. Since the second drive specifier, B: is implied by the first one, it is unnecessary in this example. The command line above has the same effect as the following: A>REN B:NEWLIST=OLDLIST or A>REN NEWLIST=B:OLDLIST ///1RMAC Syntax: RMAC filespec {$Rd | $Sd | $Pd} Explanation: RMAC, a relocatable macro assembler, assembles .ASM files of into .REL files that you can link to create .COM files. ///2options RMAC options specify the destination of the output files. Replace d with the destination drive letter for the output files. Option d=output option R- drive for REL file (A-O, Z) S- drive for SYM file (A-O, X, P, Z) P- drive for PRN file (A-O, X, P, Z) A-O specifies drive A-O. X means output to the console. P means output to the printer. Z means zero output. ///2Example A>RMAC TEST $PX SB RB Assembles the file TEST.ASM from drive A, sends the listing file (TEST.PRN) to the console, puts the symbol file (TEST.SYM) on drive B and puts the relocatable object file (TEST.REL) on drive B. ///1RSXRM Syntax: RSXRM name Explanation: The RSXRM Command instructs a cooperating RSX to schedule itself for removal. The target RSX must intercept and understand BDOS function 60 with an RSX PB FUNC of 113 and PARAMETER1 pointing to an 8-character blank-padded string representing the name of the RSX to remove. If an RSX is loaded multiple times, only the first instance will remove itself. Example: A>RSXRM NDOS3 ///1SAVE Syntax: SAVE Explanation: SAVE copies the contents of memory to a file. To use SAVE, first issue the SAVE command, then run your program which reads a file into memory. Your program exits to the SAVE utility which prompts you for a filespec to which it copies the contents of memory, and the beginning and ending address of the memory to be SAVEd. ///2Example A>SAVE Activates the SAVE utility. Now enter the name of the program which loads a file into memory. A>SID dump.com Next, execute the program. #g0 When the program exits, SAVE intercepts the return to the system and prompts the user for the filespec and the bounds of memory to be SAVEd. SAVE Ver 3.0 Enter file (type RETURN to exit):dump2.com If file DUMP2.COM exists already, the system asks: Delete dump2.com? Y Then the system asks for the bounds of memory to be saved: Beginning hex address: 100 Ending hex address: 400 The contents of memory from 100H (Hexadecimal) to 400H is copied to file DUMP2.COM. ///1SET Syntax: SET [options] SET d: [options] SET filespec [options] Explanation: SET initiates password protection and time stamping of files. It also sets the file and drive attributes Read-Write, Read-Only, DIR and SYS. It lets you label a disk and password protect the label. To enable time stamping of files, you must first run INITDIR to format the disk directory. ///2Label Syntax: SET {d:} [NAME=labelname.typ] SET [PASSWORD=password] SET [PASSWORD= ///3Examples A>SET [NAME=DISK100] Labels the disk on the default drive as DISK100. A>SET [PASSWORD=SECRET] Assigns SECRET to the disk label. A>SET [PASSWORD= Nullifies the existing password. ///2Passwords SET [PROTECT=ON] SET [PROTECT=OFF] SET filespec [PASSWORD=password] SET filespec [PROTECT=READ] SET filespec [PROTECT=WRITE] SET filespec [PROTECT=DELETE] SET filespec [PROTECT=NONE] SET filespec [attribute-options] ///3Modes Password Protection Modes Mode Protection READ The password is required for reading, copying writing, deleting or renaming the file. WRITE The password is required for writing, deleting or renaming the file. You do not need a password to read the file. DELETE The password is only required for deleting or renaming the file. You do not need a password to read or modify the file. NONE No password exists for the file. If a password password exists, this modifier can be used to delete the password. ///2Attributes RO sets the file attribute to Read-Only. RW sets the file attribute to Read-Write. SYS sets the file attribute to SYS. DIR sets the file attribute to DIR. ARCHIVE=OFF means that the file has not been backed up (archived). ARCHIVE=ON means that the file has been backed up (archived). The Archive attribute can be turned on by SET or by PIP when copying a group of files with the PIP [A] option. SHOW and DIR display the Archive option. F1=ON|OFF turns on or off the user-definable file attribute F1. F2=ON|OFF turns on or off the user-definable file attribute F2. F3=ON|OFF turns on or off the user-definable file attribute F3. F4=ON|OFF turns on or off the user-definable file attribute F4. ///3Examples SET [PROTECT=ON] Turns on password protection for all the files on the disk. You must turn on password protection before you can assign passwords to files. SET [PROTECT=OFF] Disables password protection for the files on your disk. A>SET MYFILE.TEX [PASSWORD=MYFIL] MYFIL is the password assigned to file MYFILE.TEX. B>SET *.TEX [PASSWORD=SECRET, PROTECT=WRITE] Assigns the password SECRET to all the TEX files on drive B. Each TEX file is given a WRITE protect mode to prevent unauthorized editing. A>SET MYFILE.TEX [RO SYS] Sets MYFILE.TEX to Read-Only and SYStem. ///2Default A>SET [DEFAULT=dd] Instructs the system to use dd as a password if you do not enter a password for a password-protected file. ///2Time-Stamps Syntax: SET [CREATE=ON] SET [ACCESS=ON] SET [UPDATE=ON] Explanation: The above SET commands allow you to keep a record of the time and date of file creation and update, or of the last access and update of your files. ///3Options [CREATE=ON] turns on CREATE time stamps on the disk in the default or specified drive. To record the creation time of a file, the CREATE option must be turned on before the file is created. [ACCESS=ON] turns on ACCESS time stamps on the disk in the default or specified drive. ACCESS and CREATE options are mutually exclusive; only one can be in effect at a time. If you turn on the ACCESS time stamp on a disk that previously had CREATE time stamp, the CREATE time stamp is automatically turned off. [UPDATE=ON] turns on UPDATE time stamps on the disk in the default or specified drive. UPDATE time stamps record the time the file was last modified. ///3Examples A>SET [ACCESS=ON] A>SET [CREATE=ON,UPDATE=ON] ///2Drives Syntax: SET {d:} [RO] SET {d:} [RW] Example: A>SET B: [RO] Sets drive B to Read-Only. ///1SETDEF Syntax: SETDEF { d: {,d: {,d: {,d:}}}} {[ TEMPORARY = d: ] | [ ORDER = (typ {,typ}) ]} SETDEF [DISPLAY | NO DISPLAY] SETDEF [PAGE | NOPAGE] Explanation: SETDEF allows the user to display or define up to four drives for the program search order, the drive for temporary files, and the file type search order. The SETDEF definitions affect only the loading of programs and/or execution of SUBMIT (SUB) files. SETDEF turns on/off the system Display and Console Page modes. When on, the system displays the location and name of programs loaded or SUBmit files executed, and stops after displaying one full console screen of information. ///2Examples A>SETDEF Displays current SETDEF parameters. A>SETDEF [TEMPORARY=C:] Sets disk drive C as the drive to be used for temporary files. A>SETDEF C:,* Tells the system to search for a program on drive C, then, if not found, search for it on the default drive. A>SETDEF [ORDER=(SUB,COM)] Instructs the system to search for a SUB file to execute. If no SUB file is found, search for a COM file. A>SETDEF [DISPLAY] Turns on the s059A 2AA601 lhld PARAMT ; FCB 059D 012100 lxi b,FCBRR0 05A0 09 dad b 05A1 34 inr m 05A2 C2AC05 jnz CKMSC2 05A5 23 inx h 05A6 34 inr m 05A7 C2AC05 jnz CKMSC2 05AA 23 inx h 05AB 34 inr m CKMSC2: 05AC 217105 lxi h,CKMSC0 05AF E5 push h 05B0 2AB509 lhld MSCTBP 05B3 E5 push h 05B4 2AB309 lhld MSCRET 05B7 E9 pchl ; jmp NDOSE5 - do next opcode. Returns to CKMSC0 when done. ; done with multi-sec read/write, restore everything. CKMSC1: ; could be EOF, or some physical error 05B8 3AA501 lda FUNCOD 05BB FE21 cpi CRREAD 05BD DAE405 jc CKMSC3 ; restore file position... 05C0 3AB209 lda SAVRR+2 05C3 2AB009 lhld SAVRR 05C6 EB xchg 05C7 2AA601 lhld PARAMT ; FCB 05CA 012100 lxi b,FCBRR0 05CD 09 dad b 05CE 73 mov m,e 05CF 23 inx h 05D0 72 mov m,d 05D1 23 inx h 05D2 77 mov m,a ; If the program's next op is random read/write, then we are ; finished now. But, if the next op is sequential then ; we must set the file position back to where it started. ; Use READ RAND to set file position. Response is ignored. 05D3 3E21 mvi a,CRREAD 05D5 326500 sta MSGFUN 05D8 216700 lxi h,MSGDAT 05DB 22A901 shld MCRPNT 05DE CD6704 call SNDFCB 05E1 CD1904 call RCVPAR ; ignore data/error returned by CRREAD CKMSC3: 05E4 3AB709 lda CURMSC ; if error ended us early, need num sec completed. 05E7 5F mov e,a ; save where SYSMSC won't destroy it 05E8 CD0E02 call SYSMSC 05EB 93 sub e 05EC 67 mov h,a 05ED C9 ret ; NDENDR BCSTFN: ; broadcast func (set default password, set compat attrs) 05EE 110000 lxi d,0 05F1 CD7206 call FORALL 05F4 79 mov a,c 05F5 0C inr c 05F6 CAD806 jz RSTALL ; no (more) servers, reset and return 05F9 326300 sta MSGID 05FC 2AA601 lhld PARAMT 05FF EB xchg 0600 2AA901 lhld MCRPNT 0603 3AA501 lda FUNCOD 0606 FE38 cpi CDEFPW-CBMAX ; a.k.a. 106 - set def password 0608 CA0F06 jz BCST1 ; fn 70 - set compat attr 060B 73 mov m,e 060C C31406 jmp BCST2 BCST1: 060F 0608 mvi b,8 0611 CDF304 call MCPYTS BCST2: 0614 CDD703 call SNDHDR 0617 CD1904 call RCVPAR 061A C3EE05 jmp BCSTFN BCSTVC: ; broadcast "drive vector" funcs to all servers 061D 2AA601 lhld PARAMT 0620 EB xchg BCSTV1: 0621 CD7206 call FORALL 0624 E5 push h 0625 79 mov a,c 0626 0C inr c 0627 C23C06 jnz BCSTV2 ; some remote drives to do 062A CDD806 call RSTALL 062D D1 pop d 062E 3AA501 lda FUNCOD 0631 FE25 cpi CRSDSN ; reset drive 0633 C0 rnz ; only reset drive is passed to local 0634 4F mov c,a 0635 CD0900 call next 0638 32A801 sta RETCOD 063B C9 ret BCSTV2: 063C 326300 sta MSGID 063F 216700 lxi h,MSGDAT 0642 73 mov m,e 0643 23 inx h 0644 72 mov m,d 0645 23 inx h 0646 22A901 shld MCRPNT 0649 CDD703 call SNDHDR 064C 3AA501 lda FUNCOD 064F D626 sui 38 ; access drive 0651 CA6B06 jz BCSTV3 0654 F5 push psw 0655 CD1904 call RCVPAR 0658 F1 pop psw 0659 D1 pop d 065A 3D dcr a 065B CA2106 jz BCSTV1 065E 3A6700 lda MSGDAT 0661 32A801 sta RETCOD 0664 3C inr a 0665 CAD806 jz RSTALL 0668 C32106 jmp BCSTV1 BCSTV3: 066B CD3707 call RCVEC 066E D1 pop d 066F C32106 jmp BCSTV1 ; Returns vector of all disks for given server, ; each call skips servers already reported. FORALL: 0672 210200 lxi h,CFGTBL+BSDSKS 0675 D5 push d 0676 110000 lxi d,0 0679 01FF10 lxi b,010ffh FORAL1: 067C 7E mov a,m 067D 17 ral 067E D2BC06 jnc FORAL6 ; local 0681 17 ral 0682 DABC06 jc FORAL6 ; "already did" flag 0685 23 inx h 0686 79 mov a,c 0687 FEFF cpi 0ffh 0689 CA9406 jz FORAL2 068C BE cmp m 068D CA9506 jz FORAL3 0690 2B dcx h 0691 C3BC06 jmp FORAL6 FORAL2: 0694 4E mov c,m FORAL3: 0695 2B dcx h 0696 7E mov a,m 0697 F640 ori 040h ; mark this one done... 0699 77 mov m,a 069A E3 xthl 069B CDD006 call RHLR0 069E D2C706 jnc FORAL7 06A1 E3 xthl 06A2 7E mov a,m 06A3 E60F ani 00fh 06A5 3C inr a 06A6 E5 push h 06A7 210100 lxi h,1 FORAL4: 06AA 3D dcr a 06AB CAB206 jz FORAL5 06AE 29 dad h 06AF C3AA06 jmp FORAL4 FORAL5: 06B2 7B mov a,e 06B3 B5 ora l 06B4 5F mov e,a 06B5 7A mov a,d 06B6 B4 ora h 06B7 57 mov d,a 06B8 E1 pop h 06B9 C3C806 jmp FORAL8 FORAL6: 06BC E3 xthl 06BD CDD006 call RHLR0 06C0 D2C706 jnc FORAL7 06C3 7C mov a,h 06C4 F680 ori 080h 06C6 67 mov h,a FORAL7: 06C7 E3 xthl FORAL8: 06C8 23 inx h 06C9 23 inx h 06CA 05 dcr b 06CB C27C06 jnz FORAL1 06CE E1 pop h 06CF C9 ret RHLR0: 06D0 B7 ora a 06D1 7C mov a,h 06D2 1F rar 06D3 67 mov h,a 06D4 7D mov a,l 06D5 1F rar 06D6 6F mov l,a 06D7 C9 ret ; Reset from FORALL RSTALL: 06D8 210200 lxi h,CFGTBL+BSDSKS 06DB 0610 mvi b,16 RSTAL1: 06DD 7E mov a,m 06DE E68F ani 08fh ; clear FORALL iterator flag(s) 06E0 77 mov m,a 06E1 23 inx h 06E2 23 inx h 06E3 05 dcr b 06E4 C2DD06 jnz RSTAL1 06E7 C9 ret STSF: ; setup Search First 06E8 3EFF mvi a,0ffh 06EA 325F00 sta CURSID ; assume local 06ED 2AA601 lhld PARAMT 06F0 7E mov a,m 06F1 FE3F cpi '?' 06F3 C20107 jnz STSF1 06F6 CD1E05 call CKSTDK 06F9 0EBF mvi c,'?'+080h ; "drive" code with CP/M3 flag 06FB CD7004 call STFCB 06FE C30B07 jmp STSF2 STSF1: 0701 2AA901 lhld MCRPNT 0704 23 inx h 0705 22A901 shld MCRPNT 0708 CD6D04 call CKSFCB ; if remote, set FCB in msg STSF2: 070B 3A6300 lda MSGID 070E 325F00 sta CURSID 0711 CD1C02 call SETSRA 0714 C3D703 jmp SNDHDR STSN: ; setup Search Next 0717 3A5F00 lda CURSID 071A FEFF cpi 0ffh ; was Search First a local op? 071C C22507 jnz STSN1 071F CD2A04 call TBDOSP 0722 C31004 jmp NDEND STSN1: 0725 326300 sta MSGID 0728 CD1502 call CURUSR 072B 2AA901 lhld MCRPNT 072E 23 inx h 072F 77 mov m,a 0730 23 inx h 0731 22A901 shld MCRPNT 0734 C3D703 jmp SNDHDR RCVEC: 0737 CD1904 call RCVPAR 073A 216800 lxi h,MSGDAT+1 073D 22A901 shld MCRPNT 0740 56 mov d,m ; D = ext err code 0741 2B dcx h 0742 7E mov a,m 0743 32A801 sta RETCOD 0746 2B dcx h 0747 7E mov a,m ; SIZ 0748 3D dcr a 0749 2600 mvi h,0 ; ensure H=0 to avoid confusion with extended errors 074B C0 rnz ; not extended error - skip rest 074C CD0702 call BDERMD 074F 3C inr a 0750 C25707 jnz NDERR 0753 EB xchg 0754 C30D04 jmp NDENDR NDERR: 0757 D5 push d 0758 114900 lxi d,NDERRM 075B CD8B07 call PRMSG 075E F1 pop psw ; A = (D), ext err code 075F F5 push psw ; Fix bug in NDOS.ASM 0760 CD7B07 call HEXOUT 0763 115500 lxi d,NDERR2 0766 CD8B07 call PRMSG 0769 3AA501 lda FUNCOD 076C CD7B07 call HEXOUT 076F CD0702 call BDERMD 0772 E1 pop h ; H = ext err code 0773 FEFE cpi 0feh 0775 CA0D04 jz NDENDR 0778 C30000 jmp TOP ; abort program HEXOUT: 077B 11B101 lxi d,HEXMSG+1 ; do low nibble first 077E F5 push psw 077F CDDA04 call HEXDIG 0782 F1 pop psw 0783 1F rar 0784 1F rar 0785 1F rar 0786 1F rar 0787 1B dcx d ; back to hi nibble 0788 CDDA04 call HEXDIG PRMSG: 078B 0E09 mvi c,CBUFPR 078D C30900 jmp next GTFCB: 0790 3AAC01 lda F5SETF 0793 3C inr a 0794 C29C07 jnz GTFCCR GTFCRR: 0797 0623 mvi b,35 ; FCB+CR+RR (-drive) 0799 C39E07 jmp GTFC1 GTFCCR: 079C 0620 mvi b,32 ; FCB+CR, not RR GTFC1: 079E CDBD07 call RSTMP ; un-do temp file subst 07A1 2AA901 lhld MCRPNT 07A4 23 inx h 07A5 EB xchg 07A6 2AA601 lhld PARAMT 07A9 23 inx h 07AA CDB007 call MCPYFS 07AD 2600 mvi h,0 ; ensure H=0 to avoid confusion with extended errors 07AF C9 ret MCPYFS: 07B0 1A ldax d 07B1 77 mov m,a 07B2 13 inx d 07B3 23 inx h 07B4 05 dcr b 07B5 C2B007 jnz MCPYFS 07B8 EB xchg 07B9 22A901 shld MCRPNT 07BC C9 ret RSTMP: ; restore TMP filename 07BD 3AAD01 lda FNTMPF 07C0 1F rar 07C1 1F rar 07C2 D2CF07 jnc RSTMP1 07C5 2AA901 lhld MCRPNT 07C8 23 inx h 07C9 23 inx h 07CA 3624 mvi m,'$' 07CC 23 inx h 07CD 3624 mvi m,'$' RSTMP1: 07CF 17 ral 07D0 D0 rnc 07D1 2AA901 lhld MCRPNT 07D4 110A00 lxi d,10 07D7 19 dad d 07D8 3624 mvi m,'$' 07DA 23 inx h 07DB 3624 mvi m,'$' 07DD C9 ret GTDIRE: 07DE 3AA801 lda RETCOD 07E1 3C inr a 07E2 2600 mvi h,0 ; ensure H=0 to avoid confusion with extended errors 07E4 C8 rz 07E5 2AA901 lhld MCRPNT ; Special case for CP/M3 full search, although really ; any SEARCH that wants to be fully compatible with CP/M ; neuances - specifically that the DMA buffer contains the ; full directory sector after a search. ; ; CP/Net breaks SEARCH funcs 17/18 by only returning ; one DIRENT at a time, while the local BDOS calls ; actually fill the DMA buffer with the directory sector. ; DIR.COM depends on this for getting timestamps. 07E8 3A6600 lda MSGSIZ 07EB B7 ora a ; 00 = 1 byte, dir code only, DMA buf implied 07EC C8 rz ; NDENDR will return dir code to user 07ED FE24 cpi 32+4 ; anything 1 < x < 128 really, pick a number (expect 32). 07EF D21208 jnc STOSC0 ; assume 128 bytes, copy all to DMA buffer. ; single DIRENT returned, copy to correct location. 07F2 EB xchg 07F3 2AB809 lhld DMAADR 07F6 3AA801 lda RETCOD 07F9 3C inr a 07FA 012000 lxi b,32 GTDIR1: 07FD 3D dcr a 07FE CA0508 jz GTDIR2 0801 09 dad b 0802 C3FD07 jmp GTDIR1 GTDIR2: 0805 41 mov b,c 0806 CDB007 call MCPYFS 0809 C9 ret GTOSCT: 080A 3AA801 lda RETCOD 080D B7 ora a 080E C0 rnz 080F 218C00 lxi h,MSGDAT+37 STOSC0: 0812 EB xchg 0813 2AB809 lhld DMAADR 0816 0680 mvi b,SCTLNG 0818 CDB007 call MCPYFS 081B 2600 mvi h,0 ; ensure H=0 to avoid confusion with extended errors 081D C9 ret GTMISC: 081E 2AA901 lhld MCRPNT 0821 2B dcx h ; drop error byte 0822 3AA501 lda FUNCOD 0825 FE1B cpi CGTALL ; get alloc addr 0827 CA5408 jz GTMSC3 ; for alloc vec, just leave in message buffer 082A EB xchg 082B FE2E cpi CFRSP ; get disk free space 082D CA3E08 jz GTMSC4 0830 FE1F cpi CGTDPB ; get DPB addr 0832 C24A08 jnz GTMSC1 ; fn 31 - get DPB 0835 21BA09 lxi h,CURDPB 0838 E5 push h 0839 0610 mvi b,16 ; should be 15 for CP/M 2.2, 17 for CP/M 3 083B C35008 jmp GTMSC2 GTMSC4: 083E 210000 lxi h,0 0841 E5 push h 0842 2AB809 lhld DMAADR 0845 0603 mvi b,3 0847 C35008 jmp GTMSC2 GTMSC1: ; fn 71 - get server config 084A 21C909 lxi h,CURSCF 084D E5 push h 084E 0617 mvi b,23 GTMSC2: 0850 CDB007 call MCPYFS 0853 E1 pop h GTMSC3: 0854 7D mov a,l 0855 32A801 sta RETCOD 0858 C9 ret GTLOGV: 0859 112100 lxi d,CFGTBL+BSDSKE 085C 210000 lxi h,0 085F 0610 mvi b,16 GTLGV1: 0861 1A ldax d 0862 1B dcx d 0863 4F mov c,a 0864 1A ldax d 0865 1B dcx d 0866 29 dad h 0867 CD7308 call DRVSTS 086A 05 dcr b 086B C26108 jnz GTLGV1 086E 7D mov a,l 086F 32A801 sta RETCOD 0872 C9 ret ; Get a drive's status (i.e. GET LOGIN VECTOR) ; B = local drive num ; A = net cfg byte, bit-7 = remote, bit-0:3 = remote drive num ; Returns DE bit-0 = drive's status DRVSTS: 0873 D5 push d 0874 C5 push b 0875 E5 push h 0876 17 ral 0877 DA8408 jc DRVST1 ; drive is local 087A C5 push b 087B CD2A04 call TBDOSP 087E C1 pop b 087F 05 dcr b 0880 EB xchg 0881 C3A008 jmp DRVST2 DRVST1: ; drive is remote 0884 1F rar 0885 E60F ani 00fh 0887 47 mov b,a ; remote drive number 0888 79 mov a,c ; server ID 0889 326300 sta MSGID 088C 216700 lxi h,MSGDAT 088F 22A901 shld MCRPNT 0892 C5 push b 0893 CDD703 call SNDHDR 0896 CD1904 call RCVPAR 0899 C1 pop b 089A 2AA901 lhld MCRPNT 089D 5E mov e,m 089E 23 inx h 089F 56 mov d,m DRVST2: ; DE = vector of active drives 08A0 78 mov a,b 08A1 B7 ora a 08A2 CAAF08 jz DRVST4 DRVST3: ; get drive 'B' bit to LSB 08A5 7A mov a,d 08A6 1F rar 08A7 57 mov d,a 08A8 7B mov a,e 08A9 1F rar 08AA 5F mov e,a 08AB 05 dcr b 08AC C2A508 jnz DRVST3 DRVST4: 08AF 1600 mvi d,000h 08B1 7B mov a,e 08B2 E601 ani 001h 08B4 5F mov e,a 08B5 E1 pop h 08B6 19 dad d 08B7 C1 pop b 08B8 D1 pop d 08B9 C9 ret SELDSK: 08BA 3AA601 lda PARAMT 08BD 1600 mvi d,000h 08BF 5F mov e,a 08C0 CD4F04 call CHKDSK 08C3 FEFF cpi 0ffh ; local disk 08C5 CA2A04 jz TBDOSP ; let BDOS handle 08C8 CD2902 call SETDSK 08CB 2AA901 lhld MCRPNT 08CE 0D dcr c 08CF 71 mov m,c 08D0 23 inx h 08D1 22A901 shld MCRPNT 08D4 CDD703 call SNDHDR 08D7 C33707 jmp RCVEC RESET: ; anything to do? BDOS will be called... but BDOS does not call 0005 (us)? 08DA 216700 lxi h,MSGDAT 08DD 22A901 shld MCRPNT ; A: cannot be remote... 08E0 C30900 jmp next LIST1: 08E3 11A601 lxi d,PARAMT 08E6 010100 lxi b,1 08E9 C3F908 jmp lstbk2 LSTBLK: 08EC 2AA601 lhld PARAMT 08EF 5E mov e,m 08F0 23 inx h 08F1 56 mov d,m ; address of data 08F2 23 inx h 08F3 4E mov c,m 08F4 23 inx h 08F5 46 mov b,m ; length 08F6 79 mov a,c 08F7 B0 ora b 08F8 C8 rz lstbk2: lxystem display mode. Henceforth, the system displays the name and location of programs loaded or submit files executed. A>SETDEF [NO DISPLAY] Turns off the system Display mode. ///1SHOW Syntax: SHOW {d:}{[SPACE |LABEL |USERS |DIR |DRIVE]} Explanation: The SHOW command displays the following disk drive information: Access mode and the amount of free disk space Disk label Current user number and Number of files for each user number on the disk Number of free directory entries for the disk Drive characteristics ///2Examples A>SHOW A>SHOW [SPACE] Instructs the system to display access mode and amount of space left on logged-in drives. A>SHOW B: Show access mode for drive B and amount of space left on drive B. A>SHOW B:[LABEL] Displays label information for drive B. A>SHOW [USERS] Displays the current user number and all the users on drive A and the corresponding number of files assigned to them. A>SHOW C:[DIR] Displays the number of free directory entries on drive C. A>SHOW [DRIVE] Displays the drive characteristics of drive A. ///1SID Syntax: SID {pgm-filespec} {,sym-filespec} Explanation: The SID symbolic debugger allows you to monitor and test programs developed for the 8080 microprocessor. SID supports real-time breakpoints, fully monitored execution, symbolic disassembly, assembly, and memory display and fill functions. SID can dynamically load SID utility programs to provide traceback and histogram facilities. ///2Commands Command Meaning As (Assemble) Enter assembly language statements s is the start address Cs{b{,d}} (Call) Call to memory location from SID s is the called address b is the value of the BC register pair d is the value of the DE register pair D{W}{s}{,f} (Display) Display memory in hex and ASCII W is a 16-bit word format s is the start address f is the finish address Epgm-filespec (Load) Load program and symbol table {,sym-filespec} for execution E*sym-filespec (Load) Load a symbol table file Fs,f,d (Fill) Fill memory with constant value s is the start address f is the finish address d is an eight-bit data item G{p}{,a{,b}} (Go) Begin Execution p is a start address a is a temporary breakpoint H (Hex) Displays all symbols with addresses in Hex H.a Displays hex, decimal, and ASCII values of a where a is a symbolic expression Ha,b Computes hex sum and difference of a and b where a and b are symbolic expressions Icommand tail (Input) Input CCP command line L{s}{,f} (List) List 8080 mnemonic instructions s is the start address f is the finish address Ms,h,d (Move) Move Memory Block s is the start address h is the high address of the block d is the destination start address P{p{,c}} (Pass) Pass point set, reset, and display p is a permanent breakpoint address c is initial value of pass counter Rfilespec{,d} (Read) Read Code/Symbols d is an offset to each address S{W}s (Set) Set Memory Values s is address where value is sent W is 16 bit word T{n{,c}} (Trace) Trace Program Execution n is the number of program steps c is the utility entry address. T{W}{n{,c}} (Trace) Trace Without Call W instructs SID not to trace subroutines n is the number of program steps c is the utility entry address U{W}{n{,c}} (Untrace) Monitor Execution without Trace n is the number of program steps c is the utility entry address W instructs SID not to trace subroutines V (Value) Display the value of the next available location in memory (NEXT), the next location after the largest file read in (MSZE), the current value of the Program counter (PC), and the address of the end of available memory (END) Wfilespec,s,f (Write) Write the contents of a contiguous block of memory to filespec. f is finish address X{f}{r} (Examine) Examine/alter CPU state. f is flag bit C,Z,M,E or I. r is register A,B,D,H,S or P. ///2Examples A>SID CP/M 3 loads SID from drive A into memory. SID displays the # prompt when it is ready to accept commands. A>B:SID SAMPLE.HEX CP/M 3 loads SID and the program file SAMPLE.HEX into memory from drive B. ///2Utilities SID utilities, HIST.UTL and TRACE.UTL are special programs that operate with SID to provide additional debugging facilities. The mechanisms for system initialization, data collection, and data display are described in the CP/M SID User's Guide. The HIST utility creates a histogram (bar graph) showing the relative frequency of execution of code within selected program segments of the test program. The HIST utility allows you to monitor those sections of code that execute most frequently. The TRACE utility obtains a backtrace of the instructions that led to a particular breakpoint address in a program under test. You can collect the addresses of up to 256 instructions between pass points in U or T modes. ///1SUBMIT Syntax: SUBMIT {filespec} {argument} ... {argument} Explanation: The SUBMIT command lets you execute a group (batch) of commands from a SUBmit file (a file with filetype of SUB). ///2Subfile The SUB file can contain the following types of lines: Any valid CP/M 3 command Any valid CP/M 3 command with SUBMIT parameters ($0-$9) Any data input line Any program input line with parameters ($0 to $9) The command line cannot exceed 135 characters. The following lines illustrate the variety of lines which may be entered in a SUB file: DIR DIR *.BAK MAC $1 $$$4 PIP LST:=$1.PRN[T$2 $3 $5] DIR *.ASM PIP SUBMIT A>SUBMIT SUBA A>SUBMIT AA ZZ SZ A>SUBMIT B:START DIR E: ///2PROFILE.SUB Everytime you power up or reset your computer, CP/M 3 looks for a special SUBmit file named PROFILE.SUB to execute. If it does not exist, CP/M 3 resumes normal operation. If the PROFILE.SUB file exists, the system executes the commands in the file. This file is convenient to use if you regularly execute a set of commands before you do your regular session on the computer. ///1TPA Syntax: TPA Explanation: The TPA Command displays the amount of memory available for TPA. The amount of memory is a direct translation of the current BDOS entry page, including any active RSXs. This can be used to determine if RSXs are resident, by comparing the TPA to the value seen immediately after boot. Example: A>TPA 57.25K TPA ///1TR Syntax: TR d:{filespec}=filespec[C|U] Explanation: The TR Command copies one or more files and translates line endings between Unix and CP/M conventions. The option C causes every line feed character to be prefixed with a carriage return, unless already present. The U option removes all carriage returns from the file. Neither source nor destination drive is required to be networked, although that would be the normal case. The source filespec cannot be ambiguous if a destination filespec in given. Example: A>TR C:=P:*.ASM[C] ///1TYPE Syntax: TYPE {filespec {[ PAGE | NOPAGE ]}} Explanation: The TYPE command displays the contents of an ASCII character file on your screen. [PAGE] Causes the console listing to be displayed in paged mode; i.e., stop automatically after listing n lines of text, where n normally defaults to 24 lines per page. [NOPAGE] Turns off Console Page Mode and continuously displays a typed file on the screen. ///2Examples A>TYPE MYPROG.PLI Displays the contents of the file MYPROG.PLI on your screen. A>TYPE B:THISFILE [PAGE] Displays the contents of the file THISFILE from drive B on your screen twenty four lines at a time. ///1USER Syntax: USER {number} Explanation: The USER command sets the current user number. The disk directory can be divided into distinct groups according to a "User Number." User numbers range from 0 through 15. ///2Examples A>USER Enter User#:5 5A> The current user number is now 5 on drive A. A>USER 3 3A> This command changes the current User Number to 3. ///1XREF Syntax: XREF {d:} filename {$P} Explanation: XREF provides a cross-reference summary of variable usage in a program. XREF requires the .PRN and .SYM files produced by MAC or RMAC for input to the program. The SYM and PRN files must have the same filename as the filename in the XREF command tail. XREF outputs a file of type .XRF. Examples: A>XREF b:MYPROG A>XREF b:MYPROG $P e command syntax. {} surrounds an optional item. | separates alternative items in a command line. indicates a carriage return. ^ indicates the Control Key. n substitute a number for n. s substitute a string (group) of characters for s. o substitute an option or option list for o. [] type square brackets to enclose an option list. () type parens to enclose a range of options within an option list. RW Read-Write attribute - opposite of RO RO Read-Only attribute - opposite of RW SYS System attribute - opposite of DIR DIR Directory attribute - opposite of SYS ... preceding element can be repeated as many times as desired. * wildcard: replaces all or part of a filename and/or filetype. ? wildcard: replaces any single character in the same position of a filename and/or filetype. ///1cntrlchars Control Character Function CTRL-A moves cursor one character to the left. Banked system only. CTRL-B moves cursor from beginning to end of command line and back without affecting command. Banked system only. CTRL-C stops executing program when entered at the system prompt or after CTRL-S. CTRL-E forces a physical carriage return without sending command to CP/M 3. CTRL-F moves cursor one character to the right. Banked system only. CTRL-G deletes character at current cursor position if in the middle of a line. Banked system only. CTRL-I same as the TAB key. CTRL-H delete character to the left of cursor. CTRL-J moves cursor to the left of the command line and sends command to CP/M 3. Line feed, has same effect as carriage return. CTRL-K deletes character at cursor and all characters to the right. CTRL-M same as carriage return. CTRL-P echoes console output to the list device. CTRL-Q restarts screen scrolling after a CTRL-S. CTRL-R retypes the characters to the left of the cursor on a new line; updates the command line buffer. CTRL-S stops screen scrolling. CTRL-U updates the command line buffer to contain the characters to the left of the cursor; deletes current line. CTRL-W recalls previous command line if current line is empty; otherwise moves cursor to end of line. CTRL-J,-M,-R,-U and RETURN update the command line buffer for recall with CTRL-W. Banked system only. CTRL-X deletes all characters to the left of the cursor. ///1COPYSYS Syntax: COPYSYS Explanation: COPYSYS copies the CP/M 3 system from a CP/M 3 system diskette to another diskette. The new diskette must have the same format as the original system diskette. Example: A>COPYSYS ///1CPNET CP/NET on CP/M 3 CP/NET on CP/M 3 uses an RSX that combines the functions of the NDOS and SNIOS from CP/NET on CP/M 2.2. It also provides support for more functions, particularly those available to CP/M 3 programs. The RSX may be removed, allowing dynamic switching between CP/NET (with reduced TPA) and normal operation. CP/NET on CP/M 3 does not (currently) support networked console or list devices. ///2EXTENSIONS EXTENSIONS TO NDOS FOR CP/M 3 The following BDOS functions are now supported on networked drives: 17 - SEARCH FIRST (enhancement) 18 - SEARCH NEXT (enhancement) 46 - GET DISK FREE SPACE 48 - FLUSH BUFFERS 98 - FREE BLOCKS 99 - TRUNCATE FILE 101 - GET DIR LAEL BYTE 102 - READ FILE DATE/PASSWORD MODE SEARCH functions were enhanced to return a full sector of directory entries in the case of searching with the drive set to '?', as is done by DIR.COM with the [FULL] option. This allows retrieval of SFCB data from the last directory entry of each block (which is not otherwise returned). ///2NDOS3 Syntax: NDOS3 The NDOS3 command is a simple loader for the NDOS3 RSX. It loads NDOS3 regardless of whether it is already loaded. Once loaded and resident, NDOS3 implements CP/NET - all calls to BDOS function 12 GET VERSION return H with bit 02H set to indicate CP/NET is active. ///1CPNETSTS Syntax: CPNETSTS Explanation: The CPNETSTS command displays the requester configuration table. The requester configuration table indicates the status of each logical device that is either local or assigned to a specific server on the network. Example: A>NETSTAT CP/NET 1.2 Status ================= Requester ID = 02H Network Status Byte = 10H Disk device status: Drive A: = LOCAL Drive B: = LOCAL Drive C: = LOCAL Drive D: = LOCAL Drive E: = LOCAL Drive F: = LOCAL Drive G: = LOCAL Drive H: = LOCAL Drive I: = LOCAL Drive J: = LOCAL Drive K: = LOCAL Drive L: = LOCAL Drive M: = LOCAL Drive N: = LOCAL Drive O: = LOCAL Drive P: = Drive F: on Network Server ID = 00H Console Device = LOCAL List Device = LOCAL ///1DATE Syntax: DATE {CONTINUOUS} DATE {time-specifix CFGTBL+BSLIST 08F9+DD21 DB 0DDH,21H 08FB+2400 DW CFGTBL+BSLIST bitx 7,+0 08FD+DDCB007E DB 0DDH,0CBH,+0,7*8+46H 0901 CA2604 jz tnextp 0904 212D00 lxi h,CFGTBL+BSLIST+9 0907 D5 push d ldx e,+7 0908+DD5E07 DB 0DDH,E*8+46H,+7 090B 1600 mvi d,0 090D 19 dad d 090E D1 pop d lstbk0: 090F 1A ldax d 0910 13 inx d 0911 77 mov m,a 0912 23 inx h inrx +7 ; dirty == not-zero 0913+DD3407 DB 0DDH,34H,+7 0916 FA2509 jm lstbk3 ; send data 0919 FEFF cpi 0ffh ; stop at 0ffh? or need to continue if more? 091B CA2509 jz lstbk3 ; this will continue if more chars exist... lstbk1: 091E 0B dcx b 091F 78 mov a,b 0920 B1 ora c 0921 C20F09 jnz lstbk0 0924 C9 ret lstbk3: ; must send buffer ldx a,+0 0925+DD7E00 DB 0DDH,A*8+46H,+0 0928 E60F ani 0fh stx a,+8 092A+DD7708 DB 0DDH,70H+A,+8 ; SIZ already len-1, incl LST unit ldx a,+1 ; LST server 092D+DD7E01 DB 0DDH,A*8+46H,+1 stx a,+4 ; DID 0930+DD7704 DB 0DDH,70H+A,+4 0933 D5 push d 0934 C5 push b pushix 0935+DDE5 DB 0DDH,0E5H 0937 012700 lxi b,CFGTBL+BSLIST+3 ; MSG buffer 093A CD0000 call SNDMSG popix 093D+DDE1 DB 0DDH,0E1H pushix 093F+DDE5 DB 0DDH,0E5H mvix 0,+7 ; clear dirty flag, setup for next char 0941+DD360700 DB 0DDH,36H,+7,0 0945 3C inr a 0946 CA0604 jz NERROR 0949 016200 lxi b,MSGTOP 094C CD0104 call RVMSGE popix 094F+DDE1 DB 0DDH,0E1H 0951 C1 pop b 0952 D1 pop d 0953 212D00 lxi h,CFGTBL+BSLIST+9 0956 C31E09 jmp lstbk1 GETVER: 0959 2A6000 lhld scbadr 095C 2EA1 mvi l,scbase+05h 095E 6E mov l,m 095F 2602 mvi h,002h 0961 7D mov a,l 0962 32A801 sta RETCOD 0965 C9 ret NWSTAT: 0966 CD0000 call NTWKST 0969 32A801 sta RETCOD 096C C9 ret NWCFTB: 096D CD0000 call CNFTBL 0970 7D mov a,l 0971 32A801 sta RETCOD 0974 C9 ret LOGIN: 0975 2AA601 lhld PARAMT 0978 7E mov a,m 0979 326300 sta MSGID 097C 23 inx h 097D EB xchg 097E 2AA901 lhld MCRPNT 0981 0608 mvi b,8 0983 CDF304 call MCPYTS 0986 C3D703 jmp SNDHDR LOGOFF: 0989 3AA601 lda PARAMT 098C 326300 sta MSGID 098F C3D703 jmp SNDHDR SDMSGU: 0992 2AA601 lhld PARAMT 0995 44 mov b,h 0996 4D mov c,l 0997 CD0000 call SNDMSG 099A 32A801 sta RETCOD 099D C9 ret RVMSGU: 099E 2AA601 lhld PARAMT 09A1 44 mov b,h 09A2 4D mov c,l 09A3 CD0000 call RCVMSG 09A6 32A801 sta RETCOD 09A9 C9 ret LDERR: 09AA 3EFF mvi a,-1 09AC E1 pop h 09AD C9 ret 09AE 0000 SAVDMA: dw 0 09B0 000000 SAVRR: db 0,0,0 09B3 0000 MSCRET: dw 0 09B5 0000 MSCTBP: dw 0 09B7 00 CURMSC: db 0 09B8 0000 DMAADR: dw 0 09BA CURDPB: ds 15 09C9 CURSCF: ds 23 ; this is used to do warm boot initialization, since most ; programs do not call BDOS Function 0 but instead just ; JMP 0. The CCP then makes this call, either upon startup ; and/or immediately prior to running a program. ; Perportedly, the CPP calls this with DE=NULL in order ; to scrub RSXs on warm boot. LDOVLY: WARMST: 09E0 D5 push d 09E1 C5 push b 09E2 CD0000 call NTWKBT ; TODO: any other re-init? reset some context? ; lxi d,wbmsg ; mvi c,CBUFPR ; call next 09E5 C1 pop b 09E6 D1 pop d 09E7 C30900 jmp next ; An example of how to process BDOS Func 60 RSX Func 113 ; and remove one's self. CALRSX: 09EA 6B mov l,e 09EB 62 mov h,d 09EC 7E mov a,m 09ED 23 inx h 09EE FE71 cpi 113 ; Check for RSX Func 113 09F0 C20900 jnz next 09F3 7E mov a,m 09F4 23 inx h 09F5 FE01 cpi 1 ; Check param count to be sure 09F7 C20900 jnz next 09FA D5 push d 09FB 5E mov e,m 09FC 23 inx h 09FD 56 mov d,m 09FE 211000 lxi h,rsxnam 0A01 0608 mvi b,8 rsxf0: ; Compare paramter to our name 0A03 1A ldax d 0A04 BE cmp m 0A05 C20E0A jnz rsxf1 0A08 13 inx d 0A09 23 inx h 0A0A 05 dcr b 0A0B C2030A jnz rsxf0 rsxf1: 0A0E D1 pop d 0A0F C20900 jnz next 0A12 115502 lxi d,CSTDN 0A15 0E09 mvi c,CBUFPR 0A17 CD0900 call next 0A1A 210900 lxi h,next 0A1D 220700 shld start+1 ; only until remove takes place... 0A20 3EFF mvi a,0ffh 0A22 320E00 sta remove 0A25 210000 lxi h,0 0A28 7D mov a,l 0A29 C9 ret 0A2A end 0BD8 NTWKIN 0BF4 NTWKST 0BFF CNFTBL 0C03 SNDMSG 0C25 RCVMSG 0C4A NTWKBT 0B2A CFGTBL 0C49 NTWKER !g"*  " :!ڬ*! 4¬#4¬#4!q* * :!: * *! s#r#w>!2e!g"g: _gry 2c**:8s*ry <:%O 22c!gs#r#":&k=!:g2<!7!!, ~Ҽڼ#yʔʕ+üN+~@w~2_*~?p 1E CKSTDK 0518 CKSTDP 01B3 CLDERR 0040 CLOGIN 0041 CLOGOF 0070 CLSBLK 0000 CNFTBL 0048 CNMAX 0040 CNMIN 01BC COLDSE 01D4 COLDST 000F COPEN 003B COVLY 000D CR 000A CRDBUF 0014 CREAD 0021 CRREAD 000D CRSDSK 0025 CRSDSN 003C CRSX 0022 CRWRIT 0011 CSRFST 0012 CSRNXT 001A CSTDMA 0255 CSTDN 0244 CSTUP 0020 CSTUSC 09BA CURDPB 0233 CURDSK 09B7 CURMSC 09C9 CURSCF 005F CURSID 0215 CURUSR 0015 CWRITE 0062 CXMIN 0002 DE 023A DMAADD 09B8 DMAADR 0884 DRVST1 08A0 DRVST2 08A5 DRVST3 08AF DRVST4 0873 DRVSTS 001A EOF 01AC F5SETF 0021 FCBRR0 004A FDKMS 0009 FDLFI 0020 FGTAL 0048 FGTDL 0034 FGTSZ 0001 FGTVR 003C FLGIN 003E FLGOF 001F FLGVC 0037 FLKRC 004E FLST1 004F FLSTBK 01AD FNTMPF 0043 FNWCF 0042 FNWST 0005 FOPFI 067C FORAL1 0694 FORAL2 0695 FORAL3 06AA FORAL4 06B2 FORAL5 06BC FORAL6 06C7 FORAL7 06C8 FORAL8 0672 FORALL 002A FRDRR 0011 FRDSQ 001B FREFI 0002 FRSSY 0003 FRSVC 0041 FRVNW 0040 FSDNW 0004 FSLDK 000B FSRFS 000E FSRNX 0044 FSTCP 0027 FSTFI 003B FSTPW 0045 FSVCF 01A5 FUNCOD 0380 FUNTB1 0330 FUNTB2 02E6 FUNTB3 03C1 FUNTBN 03C9 FUNTBS 03B2 FUNTBX 0024 FWRPR 002F FWRRR 0016 FWRSQ 0959 GETVER 07FD GTDIR1 0805 GTDIR2 07DE GTDIRE 079E GTFC1 0790 GTFCB 079C GTFCCR 0797 GTFCRR 0861 GTLGV1 0859 GTLOGV 081E GTMISC 084A GTMSC1 0850 GTMSC2 0854 GTMSC3 083E GTMSC4 080A GTOSCT 04E5 HEXDG1 04DA HEXDIG 01B0 HEXMSG 077B HEXOUT 0004 HL 0004 IX 0004 IY 09AA LDERR 09E0 LDOVLY 00FF LEOF 000A LF 08E3 LIST1 0018 LOADER 0975 LOGIN 0989 LOGOFF 090F LSTBK0 091E LSTBK1 08F9 LSTBK2 0925 LSTBK3 08EC LSTBLK 01AB LSTUNT 07B0 MCPYFS 04F3 MCPYTS 01A9 MCRPNT 09B3 MSCRET 09B5 MSCTBP 0067 MSGDAT 0065 MSGFUN 0063 MSGID 0066 MSGSIZ 0062 MSGTOP 0410 NDEND 040D NDENDR 0757 NDERR 0055 NDERR2 0049 NDERRM 0265 NDOSE 0282 NDOSE1 0297 NDOSE2 02C1 NDOSE4 02CA NDOSE5 02E4 NDOSE6 0406 NERROR 0009 NEXT 0032 NFTB1 0008 NFTBN 000F NFTBX 000F NONBANK 0000 NTWKBT 0000 NTWKIN 0000 NTWKST 096D NWCFTB 0966 NWSTAT 01AE ORGBIO 01A6 PARAMT 000C PREV 078B PRMSG 0737 RCVEC 0000 RCVMSG 0419 RCVPAR 000E REMOVE 04E9 RENTMP 08DA RESET 01A8 RETCOD 06D0 RHLR0 06DD RSTAL1 06D8 RSTALL 07BD RSTMP 07CF RSTMP1 0A03 RSXF0 0A0E RSXF1 0010 RSXNAM 0401 RVMSGE 099E RVMSGU 09AE SAVDMA 09B0 SAVRR 0205 SCBADD 0060 SCBADR 009C SCBASE 0031 SCBF 0080 SCTLNG 03F9 SDMSGE 0992 SDMSGU 08BA SELDSK 0000 SERIAL 0229 SETDSK 021C SETSRA 0467 SNDFCB 03F6 SNDHD1 03D7 SNDHDR 0000 SNDMSG 01A3 STACK 0006 START 0521 STDSK0 0532 STDSK1 0470 STFCB 0812 STOSC0 06E8 STSF 0701 STSF1 070B STSF2 0717 STSN 0725 STSN1 04AB SUBTM1 0493 SUBTMP 0080 SYSDMA 020E SYSMSC 042A TBDOSP 0426 TNEXTP 0000 TOP 0100 TPA 01A3 USTACK 09E0 WARMST 04FF WTDTC2 0504 WTDTC8 0509 WTDTCP 050B WTDTCS  0037 FLKRC 004E FLST1 004F FLSTBK 01AD FNTMPF 0043 FNWCF 0042 FNWST 0005 FOPFI 067C FORAL1 0694 FORAL2 0695 FORAL3 06AA FORAL4 06B2 FORAL5 06BC FORAL6 06C7 FORAL7 06C8 FORAL8 0672 FORALL 002A FRDRR 0011 FRDSQ 001B FREFI 0002 FRSSY 0003 FRSVC 0041 FRVNW 0040 FSDNW 0004 FSLDK 000B FSRFS 000E FSRNX 0044 FSTCP 0027 FSTFI 003B FSTPW 0045 FSVCF 01A5 FUNCOD 0380 FUNTB1 0330 FUNTB2 0100 ORG 0100H 0100 3E17 MVI A,23 0102 32A301 STA LCOUNT 0105 115C00 LXI D,005CH 0108 0E0F MVI C,0FH 010A CD0500 CALL 0005H 010D 3C INR A 010E CA6C01 JZ ERROR 0111 118000 LXI D,0080H 0114 0E1A MVI C,01AH 0116 CD0500 CALL 0005H RDLOOP: 0119 115C00 LXI D,005CH 011C 0E14 MVI C,014H 011E CD0500 CALL 0005H 0121 B7 ORA A 0122 C26301 JNZ DONE 0125 218000 LXI H,0080H 0128 1680 MVI D,080H OUTLOOP: 012A 7E MOV A,M 012B 23 INX H 012C FE1A CPI 01AH 012E CA6301 JZ DONE 0131 E5 PUSH H 0132 D5 PUSH D 0133 FE0A CPI 00AH 0135 C25301 JNZ NOTLF 0138 1E0D MVI E,00DH 013A 0E02 MVI C,002H 013C CD0500 CALL 0005H 013F 1E0A MVI E,00AH 0141 0E02 MVI C,02H 0143 CD0500 CALL 0005H 0146 3AA301 LDA LCOUNT 0149 3D DCR A 014A 32A301 STA LCOUNT 014D CC7501 CZ MORE 0150 C35901 JMP WASLF NOTLF: 0153 5F MOV E,A 0154 0E02 MVI C,002H 0156 CD0500 CALL 0005H WASLF: 0159 D1 POP D 015A E1 POP H 015B 15 DCR D 015C C22A01 JNZ OUTLOOP 015F C31901 JMP RDLOOP DONE0: 0162 E1 POP H ; DISCARD RETURN ADDR DONE: 0163 115C00 LXI D,005CH 0166 0E10 MVI C,010H 0168 CD0500 CALL 0005H 016B C9 RET ERROR: 016C 11A401 LXI D,ERRMSG 016F 0E09 MVI C,09H 0171 CD0500 CALL 0005H 0174 C9 RET MORE: 0175 3E17 MVI A,23 0177 32A301 STA LCOUNT 017A 11AE01 LXI D,MOREMSG 017D 0E09 MVI C,09H 017F CD0500 CALL 0005H 0182 0E01 MVI C,01H 0184 CD0500 CALL 0005H 0187 FE03 CPI 0003H; CTRL C 0189 C29A01 JNZ CLEARMSG 018C E1 POP H ; RET ADDR 018D E1 POP H ; SAVED DE 018E E1 POP H ; SAVED HL 018F 11AB01 LXI D,CRLF 0192 0E09 MVI C,09H 0194 CD0500 CALL 0005H 0197 C36301 JMP DONE CLEARMSG: 019A 11B401 LXI D,CLRMSG 019D 0E09 MVI C,09H 019F CD0500 CALL 0005H 01A2 C9 RET 01A3 17 LCOUNT: DB 23 01A4 4E6F204669ERRMSG: DB 'No File' 01AB 0D0A24 CRLF: DB 13, 10, '$' 01AE 4D4F52453AMOREMSG: DB 'MORE:$' 01B4 0D20202020CLRMSG: DB 13, ' ',13,'$' 01BC END 019A CLEARMSG 01B4 CLRMSG 01AB CRLF 0163 DONE 0162 DONE0 01A4 ERRMSG 016C ERROR 01A3 LCOUNT 0175 MORE 01AE MOREMSG 0153 NOTLF 012A OUTLOOP 0119 RDLOOP 0159 WASLF I A,23 0177 32A301 STA LCOUNT 017A 11AE01 LXI D,MOREMSG 017D 0E09 MVI C,09H 017F CD0500 CALL 0005H 0182 0E01 MVI C,01H 0184 CD0500 CALL 0005H 0187 FE03 CPI 0003H; CTRL C 0189 C29A01 JNZ CLEARMSG 018Cication} DATE SET Explanation: The DATE command lets you display and set the date and time of day. ///2Examples A>DATE Displays the current date and time. A>DATE C Displays the date and time continuously. A>DATE 08/14/82 10:30:0 Sets the date and time. A>DATE SET Prompts for date and time entries. ///1DEVICE Syntax: DEVICE { NAMES | VALUES | physical-dev | logical-dev} DEVICE logical-dev=physical-dev {option} {,physical-dev {option},...} DEVICE logical-dev = NULL DEVICE physical-dev {option} DEVICE CONSOLE [ PAGE | COLUMNS = columns | LINES = lines] Explanation: DEVICE displays current logical device assignments and physical device names. DEVICE assigns logical devices to peripheral devices attached to the computer. DEVICE also sets the communications protocol and speed of a peripheral device, and displays or sets the current console screen size. ///2Options [ XON | NOXON | baud-rate ] XON refers to the XON/XOFF communications protocol. NOXON indicates no protocol and the computer sends data to the device whether or not the device is ready to receive it. baud-rate is the speed of the device. The system accepts the following baud rates: 50 75 110 134 150 300 600 1200 1800 2400 3600 4800 7200 9600 19200 ///2Examples A>DEVICE Displays the physical devices and current assignments of the logical devices in the system. A>DEVICE NAMES Lists the physical devices with a summary of the device characteristics. A>DEVICE VALUES Displays the current logical device assignments. A>DEVICE CRT Displays the attributes of the physical device CRT. A>DEVICE CON Displays the assignment of the logical device CON: A>DEVICE CONOUT:=LPT,CRT Assigns the system console output (CONOUT:) to the printer (LPT) and the screen (CRT). A>DEVICE AUXIN:=CRT2 [XON,9600] Assigns the auxiliary logical input device (AUXIN:) to the physical device CRT using protocol XON/XOFF and sets the transmission rate for the device at 9600. A>DEVICE LST:=NULL Disconnects the list output logical device (LST:). A>DEVICE LPT [XON,9600] Sets the XON/XOFF protocol for the physical device LPT and sets the transmission speed at 9600. A>DEVICE CONSOLE [PAGE] Displays the current console page width in columns and length in lines. A>DEVICE CONSOLE [COLUMNS=40 LINES=16] Sets the screen size to 40 columns and 16 lines. ///1DIR The DIR command displays the names of files and the characteristics associated with the files. The DIR command has three distinct references: DIR DIRS DIR with Options DIR and DIRS are built-in utilities. DIR with Options is a transient utility and must be loaded into memory from the disk. ///2Built-in Syntax: DIR {d:} DIR {filespec} DIRS {d:} DIRS {filespec} Explanation: The DIR and DIRS Built-in commands display the names of files cataloged in the directory of an on-line disk. DIR lists the names of files in the current user number that have the Directory (DIR) attribute. DIR accepts the * and ? wildcards in the file specification. ///3Examples A>DIR Displays all files in user 0 on drive A that have the Directory attribute. A>DIR B: Displays all DIR files in user 0 on drive B. 2A>DIR C:ZIPPY.DAT Displays the name ZIPPY.DAT if the file is in user 2 on drive C. 4A>DIR *.BAS Displays all DIR files with filetype BAS in user 4 on drive A. B3>DIR X*.C?D Displays all DIR files in user 3 on drive B whose filename begins with the letter X, and whose three character filetype contains the first character C and last character D. A>DIRS Displays all files for user 0 on drive A that have the system (SYS) attribute. A>DIRS *.COM Displays all SYS files with filetype COM on drive A in user 0. A command (.COM) file in user 0 with the system attribute can be accessed from any user number on that drive, and from any drive in the search chain (see SETDEF). ///2withOptions Syntax: DIR {d:} [options] DIR {filespec} {filespec} ... [options] Explanation: The DIR command with options is an enhanced version of the DIR built-in command and displays your files in a variety of ways. DIR can search for files on any or all drives, for any or all user numbers. One or two letters is sufficient to identify an option. You need not type the right hand square bracket. ///3Options Option Function ATT displays the file attributes. DATE displays date and time stamps of files. DIR displays only files that have the DIR attribute. DRIVE=ALL displays files on all on-line drives. DRIVE=(A,B,C,...,P) displays files on the drives specified. DRIVE=d displays files on the drive specified by d. EXCLUDE displays files that DO NOT MATCH the files specified in the command line. FF sends an initial form feed to the printer device if the printer has been activated by CTRL-P. FULL shows the name, size, number of 128-byte records, and attributes of the files. If there is a directory label on the drive, DIR shows the password protection mode and the time stamps. If there is no directory label, DIR displays two file entries on a line, omitting the password and time stamp columns. The display is alphabetically sorted. (See SET for a description of file attributes, directory labels, passwords and protection modes.) LENGTH=n displays n lines of printer output before inserting a table heading. n is a number between 5 and 65536. MESSAGE displays the names of drives and user numbers DIR is searching. NOSORT displays files in the order it finds them on the disk. RO displays only the files that have the Read-Only attribute. RW displays only the files that are set to Read-Write. SIZE displays the filename and size in kilobytes (1024 bytes). SYS displays only the files that have the SYS attribute. USER=ALL displays all files in all user numbers for the default or specified drive. USER=n displays the files in the user number specified by n. USER=(0,1,...,15) displays files under the user numbers specified. ///3Examples A>DIR C: [FULL] Displays full set of characteristics for all files in user 0 on drive C. A>DIR C: [DATE] Lists the files on drive C and their dates. A>DIR D: [RW,SYS] Displays all files in user 0 on drive D with Read-Write and System attributes. 3A>DIR [USER=ALL, DRIVE=ALL] Displays all the files in all user numbers (0-15) in all on- line drives. B6>DIR [exclude] *.DAT Lists all the files on drive B in user 6 that do not have a filetype of .DAT. 3B>DIR [SIZE] *.PLI *.COM *.ASM Displays all the files of type PLI, COM, and ASM in user 3 on drive B in size display format. A>DIR [drive=all user=all] TESTFILE.BOB DIR displays the filename TESTFILE.BOB if it is found on any drive in any user number. A>DIR [size,rw] D: DIR lists each Read-Write file that resides on Drive D, with its size in kilobytes. Note that D: is equivalent to D:*.*. ///1DSKRESET Syntax: DSKRESET {drive(s)} Explanation: The DSKRESET command functions exactly like the PRL that executes under MP/M II. DSKRESET resets the specified drive, so a disk can be changed. drive(s) is a comma-separated list of the drive names to be reset. Example: A>DSKRESET P: ///1DUMP Syntax: DUMP filespec Explanation: DUMP displays the contents of a file in hexadecimal and ASCII format. Example: A>DUMP ABC.TEX ///1ed Format: ED input-filespec {d:|output-filespec} Explanation: Character file editor. To redirect or rename the new version of the file specify the destination drive or destination filespec. ///2commands ED Command Summary Command Action nA append n lines from original file to memory buffer 0A append file until buffer is one half full #A append file until buffer is full (or end of file) B, -B move CP to the beginning (B) or bottom (-B) of buffer nC, -nC move CP n characters forward (C) or back (-C) through buffer nD, -nD delete n characters before (-D) or from (D) the CP E save new file and return to CP/M-86 Fstring{^Z} find character string H save new file, reedit, use new file as original file I enter insert mode Istring{^Z} insert string at CP Jsearch_str^Zins_str^Zdel_to_str juxtapose strings nK, -nK delete (kill) n lines from the CP nL, -nL, 0L move CP n lines nMcommands execute commands n times n, -n move CP n lines and display that line n: move to line n :ncommand execute command through line n Nstring{^Z} extended find string O return to original file nP, -nP move CP 23 lines forward and display 23 lines at console Q abandon new file, return to CP/M-86 R{^Z} read X$$$$$$$.LIB file into buffer Rfilespec{^Z} read filespec into buffer Sdelete string^Zinsert string substitute string nT, -nT, 0T type n lines U, -U upper-case translation V, -V line numbering on/off 0V display free buffer space nW write n lines to new file 0W write until buffer is half empty nX write or append n lines to X$$$$$$$.LIB nXfilespec{^Z} write n lines to filespec; append if previous xcommand applied to same file 0x{^Z} delete file X$$$$$$$.LIB 0xfilespec{^Z} delete filespec nZ wait n seconds Note: CP points to the current character being referenced in the edit buffer. Use {^Z} to separate multiple commands on the same line. ///2Examples A>ED TEST.DAT A>ED TEST.DAT B: A>ED TEST.DAT TEST2.DAT A>ED TEST.DAT B:TEST2.DAT ///1erase Syntax: ERASE {filespec} {[CONFIRM]} Explanation: The ERASE command removes one or more files from the directory of a disk. Wildcard characters are accepted in the filespec. Directory and data space are automatically reclaimed for later use by another file. The ERASE command can be abbreviated to ERA. ///2Option [CONFIRM] option informs the system to prompt for verification before erasing each file that matches the filespec. CONFIRM can be abbreviated to C. ///2Examples A>ERASE X.PAS Removes the file X.PAS from the disk in drive A. A>ERA *.PRN Confirm (Y/N)?Y All files with the filetype PRN are removed from the disk in drive A. B>ERA A:MY*.* [CONFIRM] Each file on drive A with a filename that begins with MY is displayed with a question mark for confirmation. Type Y to erase the file displayed, N to keep the file. A>ERA B:*.* Confirm (Y/N)?Y All files on drive B are removed from the disk. ///1filespec FILESPEC FORMAT CP/M 3 identifies every file by its unique file specification, which can consist of four parts: the drive specification, the filename, the filetype and the password. The term "filespec" indicates any valid combination of the four parts of a file specification, all separated by their appropriate delimiters. A colon must follow a drive letter. A period must precede a filetype. A semicolon must precede a password. The symbols and rules for the parts of a file specification follow: d: drivespec optional single alpha character (A-P) filename filename 1-8 letters and/or numbers typ filetype optional 0-3 letters and/or numbers password password optional 0-8 letters and/or numbers Valid combinations of the elements of a CP/M 3 file specification are: filename d:filename filename.typ d:filename.typ filename;password d:filename;password filename.typ;password d:filename.typ;password If you do not include a drive specifier, CP/M 3 automatically uses the default drive. Some CP/M 3 commands accept wildcard (* and ?) characters in the filename and/or filetype parts of the command tail. A wildcard in the command line can in one command reference many matching files on the default or specified user number and drive. (See Commands). ///1GENCOM Syntax: GENCOM {COM-filespec} {RSX-filespec} ... {[LOADER | NULL | SCB=(offset,value)]} Explanation: The GENCOM command creates a special COM file with attached RSX files. The GENCOM command can also restore a previously GENCOMed file to the original COM file without the header and RSX's. GENCOM can also attach header records to COM files. ///2Options LOADER sets a flag to keep the program loader active. NULL indicates that only RSX files are specified. GENCOM creates a dummy COM file for the RSX files. The output COM filename is taken from the filename of the first RSX-filespec. SCB=(offset,value) sets the System Control Block from the program by using the hex values specified by (offset,value). ///2Examples A>GENCOM MYPROG PROG1 PROG2 Generates a new COM file MYPROG.COM with attached RSX's PROG1 and PROG2. A>GENCOM PROG1 PROG2 [NULL] Creates a COM file PROG1.COM with RSX's PROG1 and PROG2. A>GENCOM MYPROG GENCOM takes MYPROG.COM, strips off the header and deletes all attached RSX's to restore it to its original COM format. A>GENCOM MYPROG PROG1 PROG2 GENCOM looks at the already-GENCOMed file MYPROG.COM to see if PROG1.RSX and PROG2.RSX are already attached RSX files in the module. If either one is already attached, GENCOM replaces it with the new RSX module. Otherwise, GENCOM appends the specified RSX files to the COM file. ///1GET Syntax: GET {CONSOLE INPUT FROM} FILE filespec{[{ECHO|NO ECHO} | SYSTEM]} GET {CONSOLE INPUT FROM} CONSOLE Explanation: GET directs the system to take console input from a file for the next system command or user program entered at the console. Console input is taken from a file until the program terminates. If the file is exhausted before program input is terminated, the program looks for subsequent input from the console. If the program terminates before exhausting all its input, the system reverts back to the console for console input. With the SYSTEM option, the system immediately goes to the specified file for console input. The system reverts to the console for input when it reaches the end of file. Re-direct the system to the console for console input with the GET CONSOLE INPUT FROM CONSOLE command as a command line in the input file. ///2Options ECHO specifies that input is echoed to the console. This is the:100100003E1732A301115C000E0FCD05003CCA6CF6 :10011000011180000E1ACD0500115C000E14CD05F2 :1001200000B7C2630121800016807E23FE1ACA63D5 :1001300001E5D5FE0AC253011E0D0E02CD05001EBB :100140000A0E02CD05003AA3013D32A301CC750190 :10015000C359015F0E02CD0500D1E115C22A01C3CA :100160001901E1115C000E10CD0500C911A4010EAA :1001700009CD0500C93E1732A30111AE010E09CD0C :1001800005000E01CD0500FE03C29A01E1E1E11177 :10019000AB010E09CD0500C3630111B4010E09CDF9 :1001A0000500C9174E6F2046696C650D0A244D4F36 :0C01B00052453A240D20202020200D2470 :0000000000  0192 0E09 MVI C,09H 0194 CD0500 CALL 0005H 0197 C36301 JMP DONE CLEARMSG: 019A 11B401 LXI D,CLRMSG 019D 0E09 MVI C,09H 019F CD0500 CALL 0005H 01A2 C9 RET 01A3 17 LCOUNT: DB 23 01A4 4E6F204669ERRMSG: DB 'No File' 01AB 0D0A24 CRLF: DB 13, 10, '$' 01AE 4D4F52453AMOR ; THIS PROGRAM CAN BE USED TO REMOVE AN RSX THAT IS PERSISTENT. ; THE RSX MUST TRAP FUNCTION 60 (CALL RSX) AND HONOR SUB FUNCTION 113. ; THE RSXPB IS DEFINED AS: ; ; RSXPB: DB 113 ; FUNCTION CODE ; DB 1 ; NUM PARAMS ; DB NAME ; PARAM: NAME OF RSX TO REMOVE ; ; NAME: DB 'TOREMOVE' ; MUST BE 8 CHARS, BLANK PADDED ; ; THIS PROGRAM EXPECTS THE CCP TO FORMAT THE SINGLE COMMANDLINE ; PARAMETER INTO THE DEFAULT FCB, WHICH WILL PRODUCE AN 8-CHAR ; (ACTUALLY, 11) BLANK PADDED FIELD. ; ; USAGE: RSXRM ; EXAMPLE: RSXRM RSXTEST ; ; A COMPATIBLE RSX MUST ACCEPT BDOS FUNCTION 60 RSX FUNCTION 113, ; COMPARE IT'S NAME TO THE PARAMETER, AND IF MATCHING THEN SET ; IT'S OWN REMOVE FLAG. ; ; SEE RSXTEST.ASM FOR AN EXAMPLE, IN THE RSXFUN ROUTINE. ; 0100 ORG 100H START: 0100 110B01 LXI D,RSXPB 0103 0E3C MVI C,60 0105 CD0500 CALL 5 0108 C30000 JMP 0 010B 71 RSXPB: DB 113 010C 01 DB 1 010D 5D00 DW 005DH 010F END 010B RSXPB 0100 START he parameter, and if matching then set ; it's own REMOVE flag. ; ; See RSXTEST.ASM for an example, in the RSXFUN routine. ; org 100h start: lxi d,rsxpb mvi c,60 call 5 jmp 0 rsxpb: db 113 db 1 dw 005dh end  call 0005h lda lcount dcr a sta lcount cz more jmp waslf notlf: mov e,a mvi c,002h call 0005h waslf: pop d:0F010000110B010E3CCD0500C3000071015D0025 :0000000000 0 (CALL RSX) AND HONOR SUB FUNCTION 113. ; THE RSXPB IS DEFINED AS: ; ; RSXPB: DB 113 ; FUNCTION CODE ; DB 1 ; NUM PARAMS ; DB NAME ; PARAM: NAME OF RSX TO REMOVE ; ; NAME: DB 'TOREMOVE' ; MUST BE 8 CHARS, BLANK PADDED ; ; THIS P default option. NO ECHO specifies that file input is not echoed to the console. The program output and the system prompts are not affected by this option and are still echoed to the console. SYSTEM specifies that all system input is immediately taken from the disk file specified in the command line. GET takes system and program input from the file until the file is exhausted or until GET reads a GET console command from the file. ///2Examples A>GET FILE XINPUT A>MYPROG Tells the system to activate the GET utility. Since SYSTEM is not specified, the system reads the next input line from the console and executes MYPROG. If MYPROG program requires console input, it is taken from the file XINPUT. When MYPROG terminates, the system reverts back to the console for console input. A>GET FILE XIN2 [SYSTEM] Immediately directs the system to get subsequent console input from file XIN2 because it includes the SYSTEM option. The system reverts back to the console for console input when it reaches the end of file in XIN2. Or XIN2 may redirect the system back to the console if it contains a GET CONSOLE command. A>GET CONSOLE Tells the system to get console input from the console. This command may be used in a file (previously specified in a GET FILE command), which is already being read by the system for console input. It is used to re-direct the console input back to the console before the end-of-file is reached. ///1HELP Syntax: HELP {topic} {subtopic1 ... subtopic8} {[NOPAGE|LIST]} Explanation: HELP displays a list of topics and provides summarized information for CP/M 3 commands. HELP topic displays information about that topic. HELP topic subtopic displays information about that subtopic. One or two letters is enough to identify the topics. After HELP displays information for your topic, it displays the special prompt HELP> on your screen, followed by a list of subtopics. - Enter ? to display list of main topics. - Enter a period and subtopic name to access subtopics. - Enter a period to redisplay what you just read. - Press the RETURN key to return to the CP/M 3 system prompt. - [NOPAGE] option disables the 24 lines per page console display. - Press any key to exit a display and return to the HELP> prompt. Examples: A>HELP A>HELP DATE A>HELP DIR OPTIONS A>HELP>.OPTIONS HELP>SET HELP>SET PASSWORD HELP>.PASSWORD HELP>. HELP> ///1HEXCOM Syntax: HEXCOM filename Explanation: The HEXCOM Command generates a command file (filetype .COM) from a .HEX input file. It names the output file with the same filename as the input file but with filetype .COM. HEXCOM always looks for a file with filetype .HEX. Example: A>HEXCOM B:PROGRAM Generates a command file PROGRAM.COM from the input hex file PROGRAM.HEX. ///1INITDIR Syntax: INITDIR {d:} Explanation: The INITDIR Command initializes a disk directory to allow date and time stamping of files on that disk. INITDIR can also recover time/date directory space. Example: A>INITDIR C: INITDIR WILL ACTIVATE TIME-STAMPS FOR SPECIFIED DRIVE. Do you want to re-format the directory on C: (Y/N)?Y ///1LIB Syntax: LIB filespec{[I|M|P|D]} LIB filespec{[I|M|P]}=filespec{modifier} {,filespec{modifier} ... } Explanation: A library is a file that contains a collection of object modules. Use the LIB utility to create libraries, and to append, replace, select or delete modules from an existing library. Use LIB to obtain information about the contents of library files. LIB creates and maintains library files that contain object modules in Microsoft REL file format. These modules are produced by Digital Research's relocatable macro-assembler program, RMAC, or any other language translator that pruduces modules in Microsoft REL file format. You can use LINK-80 to link the object modules contained in a library to other object files. LINK-80 automatically selects from the library only those modules needed by the program being linked, and then forms an executable file with a filetype of COM. ///2Options I The INDEX option creates an indexed library file of type .IRL. LINK-80 searches faster on indexed libraries than on non-indexed libraries. M The MODULE option displays module names. P The PUBLICS option displays module names and the public variables for the new library file. D The DUMP option displays the contents of object modules in ASCII form. ///2Modifiers Use modifiers in the command line to instruct LIB to delete, replace, or select modules in a library file. Angle brackets enclose the modules to be deleted or replaced. Parentheses enclose the modules to be selected. LIB Modifiers Delete Replace If module name and filename are the same this shorthand can be used: Select (modFIRST-modLAST,mod1,mod2,...,modN) ///2Examples A>LIB TEST4[P] Displays all modules and publics in TEST4.REL. A>LIB TEST5[P]=FILE1,FILE2 Creates TEST5.REL from FILE1.REL and FILE2.REL and displays all modules and publics in TEST5.REL. A>LIB TEST=TEST1(MOD1,MOD4),TEST2(C1-C4,C6) Creates a library file TEST.REL from modules in two source files. TEST1.REL contributes MOD1 and MOD4. LIB extracts modules C1, C4, and all the modules located between them, as well as module C6 from TEST2.REL. A>LIB FILE2=FILE3 Creates FILE2.REL from FILE3.REL, omitting MODA which is a module in FILE3.REL. A>LIB FILE6=FILE5 Creates FILE6.REL from FILE5.REL, FILEB.REL replaces MODA. A>LIB FILE6=FILE5 Module THISNAME is in FILE5.REL. When LIB creates FILE6.REL from FILE5.REL the file THISNAME.REL replaces the similarly named module THISNAME. A>LIB FILE1[I]=B:FILE2(PLOTS,FIND,SEARCH-DISPLAY) Creates FILE1.IRL on drive A from the selected modules PLOTS, FIND, and modules SEARCH through the module DISPLAY, in FILE2.REL on drive B. ///1LINK Syntax: LINK d:{filespec,{[options]}=}filespec{[options]}{,...} Explanation: LINK combines relocatable object modules such as those produced by RMAC and PL/I-80 into a .COM file ready for execution. Relocatable files can contain external references and publics. Relocatable files can reference modules in library files. LINK searches the library files and includes the referenced modules in the output file. See the CP/M 3 Programmer's Utilities Guide for a complete description of LINK- 80. ///2Options Use LINK option switches to control execution parameters. Link options follow the file specifications and are enclosed within square brackets. Multiple switches are separated by commas. LINK-80 Options A Additional memory; reduces buffer space and writes temporary data to disk B BIOS link in banked CP/M 3 system. 1. Aligns data segment on page boundary. 2. Puts length of code segment in header. 3. Defaults to .SPR filetype. Dhhhh Data origin; sets memory origin for common and data area Gn Go; set start address to label n Lhhhh Load; change default load address of module to hhhh. Default 0100H Mhhhh Memory size; Define free memory requirements for MP/M modules. NL No listing of symbol table at console NR No symbol table file OC Output .COM command file. Default OP Output .PRL page relocatable file for execution under MP/M in relocatable segment OR Output .RSP resident system process file for execution under MP/M OS Output .SPR system page relocatable file for execution under MP/M Phhhh Program origin; changes default program origin address to hhhh. Default is 0100H. Q Lists symbols with leading question mark S Search preceding file as a library $Cd Destination of console messages d can be X (console), Y (printer), or Z (zero output). Default is X. $Id Source of intermediate files; d is disk drive A-P. Default is current drive. $Ld Source of library files; d is disk drive A-P. Default is current drive. $Od Destination of of object file; d can be Z or disk drive A-P. Default is to same drive as first file in the LINK-80 command. $Sd Destination of symbol file; d can be Y or Z or disk drive A-P. Default is to same drive as first file in LINK-80 command. ///2Examples A>LINK b:MYFILE[NR] LINK-80 on drive A uses as input MYFILE.REL on drive B and produces the executable machine code file MYFILE.COM on drive B. The [NR] option specifies no symbol table file. A>LINK m1,m2,m3 LINK-80 combines the separately compiled files m1, m2, and m3, resolves their external references, and produces the executable machine code file m1.COM. A>LINK m=m1,m2,m3 LINK-80 combines the separately compiled files m1, m2, and m3 and produces the executable machine code file m.COM. A>LINK MYFILE,FILE5[s] The [s] option tells LINK-80 to search FILE5 as a library. LINK-80 combines MYFILE.REL with the referenced subroutines contained in FILE5.REL on the default drive A and produces MYFILE.COM on drive A. ///1LOCAL Syntax: LOCAL local-dev Explanation: The LOCAL command enables a requester to reassign selected I/O back to local from the network. The LOCAL command updates the requester configuration table. local-dev is the specification of a local device such as LST:, A:,... CON:. Example: A>LOCAL P: ///1LOGIN Syntax: LOGIN {password}{[mstrID]} Explanation: The LOGIN command allows a requester to log in to a specified server. A requester must log in before any resources on the server can be accessed. Once a requester has logged in, it is not necessary to log in again even though the requester might power down and then power up again. A requester can only be logged off a server by an explicit LOGOFF command issued from the requester. password is an optional 8 ASCII-character password; the default password is PASSWORD. [mstrID] is an optional two-digit server processor ID; the default is [00]. Not all servers require login. Example: A>LOGIN mypasswd[02] ///1LOGOFF Syntax: LOGOFF {[mstrID]} Explanation: The LOGOFF command allows a requester to log off from a specified server. Once a requester has logged off, the server cannot be accessed again until you issue a LOGIN command. [mstrID] is an optional two-digit server processor ID; the default is [00]. Example: A>LOGOFF [02] ///1mac Syntax: MAC filename {$options} Explanation: MAC, the CP/M 3 macro assembler, reads assembly language statements from a file of type .ASM, assembles the statements, and produces three output files with the input filename and filetypes of .HEX, .PRN, and .SYM. Filename.HEX contains INTEL hexadecimal format object code. Filename.PRN contains an annotated source listing that you can print or examine at the console. Filename.SYM contains a sorted list of symbols defined in the program. ///2Examples A>MAC SAMPLE A>MAC SAMPLE $PB AA HB SX ///2options Use options to direct the input and output of MAC. Use a letter with the option to indicate the source and destination drives, and console, printer, or zero output. Valid drive names are A thru O. X, P and Z specify console, printer, and zero output, respectively. Assembly Options That Direct Input/Output A source drive for .ASM file (A-O) H destination drive for .HEX file (A-O, Z) L source drive for macrolibrary .LIB files called by the MACLIB statement. P destination drive for .PRN file (A-O, X, P, Z) S destination drive for .SYM file Assembly Options That Modify Contents Of Output File +L lists input lines read from macrollibrary .LIB files -L suppresses listing (default) +M lists all macro lines as they are processed during assembly -M suppresses all macro lines as they are read during assembly *M lists only hex generated by macro expansions +Q lists all LOCAL symbols in the symbol list -Q suppresses all LOCAL symbols in the symbol list (default) +S appends symbol file to print file -S suppresses creation of symbol file +1 produces a pass 1 listing for macro debugging in .PRN file -1 suppress listing on pass 1 (default) ///1NETSTAT Syntax: NETSTAT Explanation: The NETSTAT command is a terse version of CPNETSTS. It only shows networked devices. Example: A>NETSTAT CP/NET Status ============= Requester ID = 02H Network Status Byte = 10H Device status: Drive P: = Drive F: on Network Server ID = 00H ///1NETWORK Syntax: NETWORK local-dev=server-dev{[srvrID]} Explanation: The NETWORK command enables a requester to assign selected I/O to the network. The NETWORK command updates the requester Configuration table. local-dev is the specification of a local device such as A:, B: ... P:, CON: or LST:. server-dev is the specification of a server device such as A:, B: ... P: in the case of a disk device, or 0, 1 ... 15 in the case of CON: or LST:. A missing server-dev defaults to 0 in the case of CON: or LST:. [srvrID] is an optional two-digit hexadecimal server processor ID. The default is [00]. Example: A>NETWORK P:=F: ///1NTPDATE Syntax: NTPDATE {server} Explanation: The NTPDATE Command sets the local time to that of the specified server. Default server is 00. Server ID is specified in hexadecimal. Example: A>NTPDATE 2 Time was set to: 04/16/16 18:34:12 ///1PATCH Syntax: PATCH filename{.typ} {n} Explanation: The PATCH command displays or installs patch number n to the CP/M 3 system or command files. The patch number n must be between 1 and 32 inclusive. Example: A>PATCH SHOW 2 Patches the SHOW.COM system file with patch number 2. ///1PIP (copy) Syntax: DESTINATION SOURCE PIP d:{Gn} | filespec{[Gn]} = filespec{[o]},... | d:{[o]} Explanation: The file copy program PIP copies files, combines files, and transfers files between disks, printers, consoles, or other devices attached to your computer. The first filespec is the destination. The second filespec is the source. Use two or more source filespecs separated by commas to combine two or more files into one file. [o] is any combination of the available options. The [Gn] option in the destination filespec tells PIP to copy your file to that user number. PIP with no command tail displays ; TRANSLATE TEXT FILE BETWEEN CP/M AND UNIX LINE-ENDS MACLIB Z80 0000 = WBOOT EQU 0000H 0005 = BDOS EQU 0005H 0080 = CMDLINE EQU 0080H 000D = CR EQU 13 000A = LF EQU 10 001A = EOF EQU 26 0002 = CONOUT EQU 2 0009 = PRINT EQU 9 000F = OPEN EQU 15 0010 = CLOSE EQU 16 0011 = SERFST EQU 17 0012 = SERNXT EQU 18 0013 = DELETE EQU 19 0014 = READ EQU 20 0015 = WRITE EQU 21 0016 = MAKE EQU 22 0017 = RENAME EQU 23 001A = SETDMA EQU 26 001E = SETATR EQU 30 0098 = PARSE EQU 152 0080 = BUFLEN EQU 128 0100 ORG 0100H 0100 C37901 JMP START 0103 INFILE: DS 36 0127 OUTFILE: DS 36 014B TMPFILE: DS 36 016F 00 SAWCR: DB 0 0170 00 CONV: DB 0 0171 00 BYTCNT: DB 0 0172 0000 FLPTR: DW 0 0174 00 FLCNT: DB 0 0175 0000 PFCB: DW 0 ; TEXT TO PARSE 0177 0000 DW 0 ; OUTPUT FCB ; TODO: SUPPORT THINGS LIKE A:=B:*.ASM[U] START: 0179 319805 LXI SP,STACK 017C 118000 LXI D,CMDLINE 017F 1A LDAX D 0180 13 INX D 0181 B7 ORA A 0182 CA4904 JZ HELP 0185 6F MOV L,A 0186 2600 MVI H,0 0188 19 DAD D 0189 3600 MVI M,0 ; ENSURE NUL TERMINATED 018B EB XCHG 018C 227501 SHLD PFCB 018F 212701 LXI H,OUTFILE 0192 227701 SHLD PFCB+2 0195 117501 LXI D,PFCB 0198 0E98 MVI C,PARSE 019A CD0500 CALL BDOS 019D 7C MOV A,H 019E A5 ANA L 019F FEFF CPI 0FFH 01A1 CA3104 JZ PARERR 01A4 7E MOV A,M ; HL POINT TO NEXT, UNPARSED, CHAR 01A5 FE3D CPI '=' 01A7 C23104 JNZ PARERR 01AA 23 INX H 01AB 227501 SHLD PFCB 01AE 210301 LXI H,INFILE 01B1 227701 SHLD PFCB+2 01B4 117501 LXI D,PFCB 01B7 0E98 MVI C,PARSE 01B9 CD0500 CALL BDOS 01BC 7C MOV A,H 01BD A5 ANA L 01BE FEFF CPI 0FFH 01C0 CA3104 JZ PARERR 01C3 7E MOV A,M ; HL POINT TO NEXT, UNPARSED, CHAR 01C4 FE5B CPI '[' 01C6 C23104 JNZ PARERR ; MAKE THIS OPTIONAL, DEFAULT IS NO CONVERSION? 01C9 23 INX H 01CA 7E MOV A,M 01CB E6DF ANI 0DFH ; TOUPPER 01CD FE55 CPI 'U' 01CF CAD701 JZ CONVOK 01D2 FE43 CPI 'C' 01D4 C23104 JNZ PARERR CONVOK: 01D7 E610 ANI 010H ; 0=TO-CP/M, ~0=TO-UNIX 01D9 327001 STA CONV 01DC 23 INX H 01DD 7E MOV A,M 01DE FE5D CPI ']' 01E0 C23104 JNZ PARERR 01E3 23 INX H 01E4 7E MOV A,M 01E5 B7 ORA A 01E6 C23104 JNZ PARERR 01E9 210301 LXI H,INFILE 01EC CD9B04 CALL CHKAFN 01EF D21C02 JNC MULTCP 01F2 3A2801 LDA OUTFILE+1 01F5 FE20 CPI ' ' 01F7 C20D02 JNZ NOBLANK 01FA 112801 LXI D,OUTFILE+1 01FD 210401 LXI H,INFILE+1 0200 010B00 LXI B,11 LDIR 0203+EDB0 DB 0EDH,0B0H 0205 3A2801 LDA OUTFILE+1 0208 FE20 CPI ' ' 020A CA3104 JZ PARERR NOBLANK: 020D 212701 LXI H,OUTFILE 0210 CD9B04 CALL CHKAFN 0213 D23104 JNC PARERR 0216 CDB902 CALL TRFILE ; ERRORS ABORT, DO NOT RETURN HERE 0219 C30000 JMP WBOOT MULTCP: 021C 3A2801 LDA OUTFILE+1 021F FE20 CPI ' ' 0221 C23104 JNZ PARERR ; MAKE LIST OF MATCHING FILES, THEN ; TRANSLATE EACH ONE... 0224 219806 LXI H,FLIST 0227 227201 SHLD FLPTR 022A AF XRA A 022B 327401 STA FLCNT 022E 111806 LXI D,INBUF 0231 0E1A MVI C,SETDMA 0233 CD0500 CALL BDOS 0236 110301 LXI D,INFILE 0239 0E11 MVI C,SERFST 023B CD0500 CALL BDOS 023E FEFF CPI 0FFH 0240 CA7904 JZ INOFILE SERLOOP: 0243 07 RLC 0244 07 RLC 0245 07 RLC 0246 07 RLC 0247 07 RLC ; * 32 0248 5F MOV E,A 0249 1600 MVI D,0 024B 211806 LXI H,INBUF 024E 19 DAD D 024F 23 INX H 0250 EB XCHG 0251 2A7201 LHLD FLPTR 0254 EB XCHG 0255 010B00 LXI B,11 LDIR 0258+EDB0 DB 0EDH,0B0H 025A EB XCHG 025B 3624 MVI M,'$' 025D 23 INX H 025E 227201 SHLD FLPTR 0261 3A7401 LDA FLCNT 0264 3C INR A 0265 327401 STA FLCNT 0268 110000 LXI D,0 026B 0E12 MVI C,SERNXT 026D CD0500 CALL BDOS 0270 FEFF CPI 0FFH 0272 C24302 JNZ SERLOOP ; GOT LIST OF 'FLCNT' FILES AT 'FLIST' ; THERE MUST BE AT LEAST ONE IF WE GET HERE... 0275 114105 LXI D,CPYING 0278 0E09 MVI C,PRINT 027A CD0500 CALL BDOS 027D 219806 LXI H,FLIST 0280 3A7401 LDA FLCNT FLOOP: 0283 F5 PUSH PSW 0284 E5 PUSH H 0285 114B05 LXI D,FPREFX 0288 0E09 MVI C,PRINT 028A CD0500 CALL BDOS 028D D1 POP D 028E D5 PUSH D 028F 0E09 MVI C,PRINT 0291 CD0500 CALL BDOS 0294 E1 POP H 0295 E5 PUSH H 0296 110401 LXI D,INFILE+1 0299 010B00 LXI B,11 LDIR 029C+EDB0 DB 0EDH,0B0H 029E 210401 LXI H,INFILE+1 02A1 112801 LXI D,OUTFILE+1 02A4 010B00 LXI B,11 LDIR 02A7+EDB0 DB 0EDH,0B0H 02A9 CDB902 CALL TRFILE 02AC E1 POP H 02AD F1 POP PSW 02AE 010C00 LXI B,12 02B1 09 DAD B 02B2 3D DCR A 02B3 C28302 JNZ FLOOP 02B6 C30000 JMP WBOOT ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; TRANSLATE FILE INFILE => OUTFILE TRFILE: 02B9 AF XRA A 02BA 320F01 STA INFILE+12 02BD 323301 STA OUTFILE+12 02C0 212701 LXI H,OUTFILE 02C3 114B01 LXI D,TMPFILE 02C6 011000 LXI B,16 LDIR 02C9+EDB0 DB 0EDH,0B0H 02CB 215401 LXI H,TMPFILE+9 02CE 3624 MVI M,'$' 02D0 23 INX H 02D1 3624 MVI M,'$' 02D3 23 INX H 02D4 3624 MVI M,'$' ; FCBS ALL SETUP. 02D6 110301 LXI D,INFILE 02D9 0E0F MVI C,OPEN 02DB CD0500 CALL BDOS 02DE FEFF CPI 0FFH 02E0 CA7904 JZ INOFILE 02E3 AF XRA A 02E4 322301 STA INFILE+32 02E7 114B01 LXI D,TMPFILE 02EA 0E13 MVI C,DELETE 02EC CD0500 CALL BDOS 02EF 114B01 LXI D,TMPFILE 02F2 0E16 MVI C,MAKE 02F4 CD0500 CALL BDOS 02F7 FEFF CPI 0FFH 02F9 CA5404 JZ MKERR 02FC 326F01 STA SAWCR 02FF CDF603 CALL INFILL 0302 CDEA03 CALL OUTINIT CHRLOOP: 0305 CDA603 CALL GETCHR 0308 FE1A CPI EOF 030A CA4603 JZ INEOF 030D 1600 MVI D,0 030F FE0D CPI CR 0311 C21E03 JNZ NOTCR 0314 3A7001 LDA CONV 0317 B7 ORA A 0318 C20503 JNZ CHRLOOP ; TO-UNIX: DROP ALL CR 031B 14 INR D 031C 3E0D MVI A,CR 031E FE0A NOTCR: CPI LF 0320 C23A03 JNZ NOTLF 0323 3A7001 LDA CONV 0326 B7 ORA A 0327 C23803 JNZ CRLFOK ; TO-UNIX: DO NOT ADD BACK CR 032A 3A6F01 LDA SAWCR 032D B7 ORA A 032E C23803 JNZ CRLFOK 0331 3E0D MVI A,CR 0333 CDBD03 CALL PUTCHR 0336 1600 MVI D,0 CRLFOK: 0338 3E0A MVI A,LF NOTLF: 033A D5 PUSH D 033B CDBD03 CALL PUTCHR 033E D1 POP D 033F 7A MOV A,D 0340 326F01 STA SAWCR 0343 C30503 JMP CHRLOOP INEOF: 0346 3A7001 LDA CONV :03010000C37901BF :10016F000000000000000000000031980511800021 :10017F001A13B7CA49046F2600193600EB2275010E :10018F002127012277011175010E98CD05007CA55D :10019F00FEFFCA31047EFE3DC231042322750121C8 :1001AF0003012277011175010E98CD05007CA5FE84 :1001BF00FFCA31047EFE5BC23104237EE6DFFE55AB :1001CF00CAD701FE43C23104E610327001237EFE0E :1001DF005DC23104237EB7C23104210301CD9B04DC :1001EF00D21C023A2801FE20C20D0211280121045F :1001FF0001010B00EDB03A2801FE20CA310421277E :10020F0001CD9B04D23104CDB902C300003A2801BD :10021F00FE20C23104219806227201AF32740111FF :10022F0018060E1ACD05001103010E11CD0500FEA3 :10023F00FFCA790407070707075F16002118061979 :10024F0023EB2A7201EB010B00EDB0EB36242322D6 :10025F0072013A74013C3274011100000E12CD0587 :10026F0000FEFFC243021141050E09CD0500219882 :10027F00063A7401F5E5114B050E09CD0500D1D5F0 :10028F000E09CD0500E1E5110401010B00EDB021D0 :10029F000401112801010B00EDB0CDB902E1F1010C :1002AF000C00093DC28302C30000AF320F0132338D :1002BF0001212701114B01011000EDB0215401362E :1002CF00242336242336241103010E0FCD0500FEFF :1002DF00FFCA7904AF322301114B010E13CD050074 :1002EF00114B010E16CD0500FEFFCA5404326F01EB :1002FF00CDF603CDEA03CDA603FE1ACA46031600B8 :10030F00FE0DC21E033A7001B7C20503143E0DFE67 :10031F000AC23A033A7001B7C238033A6F01B7C243 :10032F0038033E0DCDBD0316003E0AD5CDBD03D11A :10033F007A326F01C305033A7001B7C259033E1AEF :10034F00CDBD033A5205B7C24D033A52054F3E8019 :10035F0091327101CDD603CD20043A7001B7CA8511 :10036F00033A7101326B012151017EF68077114BF7 :10037F00010E1ECD05001127010E13CD05002127FB :10038F0001115B01011000EDB0114B010E17CD05EE :10039F0000FEFFCA7304C93A5505B7CCF6033A55A8 :1003AF00053D3255052A56057E23225605C9F53AD5 :1003BF005205B7CCD6033A52053D325205F12A53B6 :1003CF00057723225305C91198050E1ACD05001183 :1003DF004B010E15CD0500B7C260042198052253BD :1003EF00053E80325205C91118060E1ACD050011AF :1003FF0003010E14CD0500B7CA1404FE01C25A043E :10040F003E1A3218062118062256053E803255052F :10041F00C9114B010E10CD05001103010E10CD05B2 :10042F0000C911A8040E09CD05001180001A136F21 :10043F0026001936240E09CD0500111B050E09CD16 :10044F000500C3000011F304C3630411B204C363B6 :10045F000411C604D5CD2004114B010E13CD050098 :10046F00D1C37C04110705C37C0411DB04D53A7496 :10047F0001B7CA92041E0D0E02CD05001E0A0E0210 :10048F00CD0500D10E09CD0500C30000060D7EFE7F :10049F003FC82305C29D0437C9496E76616C6964F4 :1004AF003A20244572726F722072656164696E67BB :1004BF0020696E707574244572726F72207772693D :1004CF0074696E67206F7574707574244E6F206633 :1004DF00696C6520666F756E6420666F7220696E39 :1004EF00707574244572726F7220637265617469DE :1004FF006E672074656D70244572726F722072651D :10050F006E616D696E672074656D70240D0A557389 :10051F006167653A20545220413A7B6F7574666962 :10052F006C657D3D423A696E66696C655B557C43CF :10053F005D24436F7079696E67202D240D0A20208A :09054F002020240000000000003F :0000000000  0349 B7 ORA A 034A C25903 JNZ DONE0 ; UNIX FILE, SET BYTE COUNT INSTEAD... INEOF0: 034D 3E1A MVI A,EOF 034F CDBD03 CALL PUTCHR ; FILL BUFFER AND FORCE FLUSH... 0352 3A5205 LDA OUTCNT 0355 B7 ORA A ; ZERO MEANS NEXT PUTCHR WILL FLUSH... 0356 C24D03 JNZ INEOF0 DONE0: 0359 3A5205 LDA OUTCNT 035C 4F MOV C,A 035D 3E80 MVI A,BUFLEN 035F 91 SUB C 0360 327101 STA BYTCNT ; 0..128 0363 CDD603 CALL OUTFLUSH ; FLUSHES FULL 128 BYTE RECORD DONE: ; CLOSE ALL AND RENAME TMPFILE... 0366 CD2004 CALL CLOSEALL 0369 3A7001 LDA CONV 036C B7 ORA A 036D CA8503 JZ ISCPM 0370 3A7101 LDA BYTCNT 0373 326B01 STA TMPFILE+32 0376 215101 LXI H,TMPFILE+6 0379 7E MOV A,M 037A F680 ORI 80H 037C 77 MOV M,A 037D 114B01 LXI D,TMPFILE 0380 0E1E MVI C,SETATR 0382 CD0500 CALL BDOS ; TRIM FILE BACK TO EXACT BYTE COUNT ; CHECK ERROR? ABORTING DOESN'T HELP ISCPM: 0385 112701 LXI D,OUTFILE 0388 0E13 MVI C,DELETE 038A CD0500 CALL BDOS ; CHECK ERROR? DO ANYTHING DIFFERENT? 038D 212701 LXI H,OUTFILE 0390 115B01 LXI D,TMPFILE+16 0393 011000 LXI B,16 LDIR 0396+EDB0 DB 0EDH,0B0H 0398 114B01 LXI D,TMPFILE 039B 0E17 MVI C,RENAME 039D CD0500 CALL BDOS 03A0 FEFF CPI 0FFH 03A2 CA7304 JZ RENERR 03A5 C9 RET GETCHR: 03A6 3A5505 LDA INCNT 03A9 B7 ORA A 03AA CCF603 CZ INFILL 03AD 3A5505 LDA INCNT 03B0 3D DCR A 03B1 325505 STA INCNT 03B4 2A5605 LHLD INPTR 03B7 7E MOV A,M 03B8 23 INX H 03B9 225605 SHLD INPTR 03BC C9 RET PUTCHR: 03BD F5 PUSH PSW 03BE 3A5205 LDA OUTCNT 03C1 B7 ORA A 03C2 CCD603 CZ OUTFLUSH 03C5 3A5205 LDA OUTCNT 03C8 3D DCR A 03C9 325205 STA OUTCNT 03CC F1 POP PSW 03CD 2A5305 LHLD OUTPTR 03D0 77 MOV M,A 03D1 23 INX H 03D2 225305 SHLD OUTPTR 03D5 C9 RET OUTFLUSH: 03D6 119805 LXI D,OUTBUF 03D9 0E1A MVI C,SETDMA 03DB CD0500 CALL BDOS 03DE 114B01 LXI D,TMPFILE 03E1 0E15 MVI C,WRITE 03E3 CD0500 CALL BDOS 03E6 B7 ORA A 03E7 C26004 JNZ OUTERR OUTINIT: 03EA 219805 LXI H,OUTBUF 03ED 225305 SHLD OUTPTR 03F0 3E80 MVI A,BUFLEN 03F2 325205 STA OUTCNT 03F5 C9 RET INFILL: 03F6 111806 LXI D,INBUF 03F9 0E1A MVI C,SETDMA 03FB CD0500 CALL BDOS 03FE 110301 LXI D,INFILE 0401 0E14 MVI C,READ 0403 CD0500 CALL BDOS 0406 B7 ORA A 0407 CA1404 JZ INOK 040A FE01 CPI 1 040C C25A04 JNZ INERR 040F 3E1A MVI A,EOF ; SHOULD NEVER HAPPEN FOR TEXT FILES, BUT HANDLE ANYWAY 0411 321806 STA INBUF INOK: 0414 211806 LXI H,INBUF 0417 225605 SHLD INPTR 041A 3E80 MVI A,BUFLEN 041C 325505 STA INCNT 041F C9 RET CLOSEALL: 0420 114B01 LXI D,TMPFILE 0423 0E10 MVI C,CLOSE 0425 CD0500 CALL BDOS 0428 110301 LXI D,INFILE 042B 0E10 MVI C,CLOSE 042D CD0500 CALL BDOS 0430 C9 RET PARERR: 0431 11A804 LXI D,PERRM 0434 0E09 MVI C,PRINT 0436 CD0500 CALL BDOS 0439 118000 LXI D,CMDLINE 043C 1A LDAX D 043D 13 INX D 043E 6F MOV L,A 043F 2600 MVI H,0 0441 19 DAD D 0442 3624 MVI M,'$' 0444 0E09 MVI C,PRINT 0446 CD0500 CALL BDOS HELP: 0449 111B05 LXI D,USAGE 044C 0E09 MVI C,PRINT 044E CD05an * prompt and awaits your series of commands, entered and processed one line at a time. The source or destination can be any CP/M 3 logical device. ///2Examples COPY A FILE FROM ONE DISK TO ANOTHER A>PIP b:=a:draft.txt A>PIP b:draft.txt = a: B3>PIP myfile.dat=A:[G9] A9>PIP B:[G3]=myfile.dat COPY A FILE AND RENAME IT A5>PIP newdraft.txt=oldraft.txt C8>PIP b:newdraft.txt=a:oldraft.txt COPY MULTIPLE FILES A>PIP b:=draft.* A>PIP b:=*.* B>PIP b:=c:.*.* C>PIP b:=*.txt[g5] C>PIP a:=*.com[wr] B>PIP a:[g3]=c:*.* COMBINE MULTIPLE FILES A>PIP b:new.dat=file1.dat,file2.dat COPY, RENAME AND PLACE IN USER 1 A>pip newdraft.txt[g1]=oldraft.txt COPY, RENAME AND GET FROM USER 1 A>PIP newdraft.txt=oldraft.txt[g1] COPY TO/FROM LOGICAL DEVICES A>PIP b:funfile.sue=con: A>PIP lst:=con: A>PIP lst:=b:draft.txt[t8] A>PIP prn:=b:draft.txt ///2options PIP OPTIONS A Archive. Copy only files that have been changed since the last copy. C Confirm. PIP prompts for confirmation before each file copy. Dn Delete any characters past column n. E Echo transfer to console. F Filter form-feeds from source data. Gn Get from or go to user n. H Test for valid Hex format. I Ignore :00 Hex data records and test for valid Hex format. K Kill display of filespecs on console. L Translate upper case to lower case. N Number output lines O Object file transfer, ^Z ignored. Pn Set page length to n. (default n=60) Qs^Z Quit copying from source at string s. R Read files that have been set to SYStem. Ss^Z Start copying from the source at the string s. Tn Expand tabs to n spaces. U Translate lower case to upper case. V Verify that data has been written correctly. W Write over Read Only files without console query. Z Zero the parity bit. All options except C,G,K,O,R,V and W force an ASCII file transfer, character by character, terminated by a ^Z. ///1PUT Syntax: PUT CONSOLE {OUTPUT TO} FILE filespec {option} | CONSOLE PUT PRINTER {OUTPUT TO} FILE filespec {option} | PRINTER PUT CONSOLE {OUTPUT TO} CONSOLE PUT PRINTER {OUTPUT TO} PRINTER Explanation: PUT puts console or printer output to a file for the next command entered at the console, until the program terminates. Then console output reverts to the console. Printer output is directed to a file until the program terminates. Then printer output is put back to the printer. PUT with the SYSTEM option directs all subsequent console/printer output to the specified file. This option terminates when you enter the PUT CONSOLE or PUT PRINTER command. ///2Options [ {ECHO | NO ECHO} {FILTER | NO FILTER} | {SYSTEM} ] ECHO specifies that output is echoed to the console. This is the default option when you direct console output to a file. NO ECHO specifies that file output is not echoed to the console. NO ECHO is the default for the PUT PRINTER command. FILTER specifies filtering of control characters, which means that control characters are translated to printable characters. For example, an ESCape character is translated to ^[. NO FILTER means that PUT does not translate control characters. This is the default option. SYSTEM specifies that system output as well as program output is written to the file specified by filespec. Output is written to the file until a subsequent PUT CONSOLE command redirects console output back to the console. ///2Examples A>PUT CONSOLE OUTPUT TO FILE XOUT [ECHO] Directs console output to file XOUT with the output echoed to the console. A>PUT PRINTER OUTPUT TO FILE XOUT A>MYPROG Directs the printer output of program MYPROG to file XOUT. The output is not echoed to the printer. A>PUT PRINTER OUTPUT TO FILE XOUT2 [ECHO,SYSTEM] Directs all printer output to file XOUT2 as well as to the printer (with ECHO option), and the PUT is in effect until you enter a PUT PRINTER OUTPUT TO PRINTER command. A>PUT CONSOLE OUTPUT TO CONSOLE Directs console output back to the console. A>PUT PRINTER OUTPUT TO PRINTER Directs printer output back to the printer. ///1RENAME Syntax: RENAME {new-filespec=old-filespec} Explanation: RENAME lets you change the name of a file in the directory of a disk. To change several filenames in one command use the * or ? wildcards in the file specifications. The RENAME command can be abbreviated REN. REN prompts you for input. ///2Examples A>RENAME NEWFILE.BAS=OLDFILE.BAS The file OLDFILE.BAS changes to NEWFILE.BAS on drive A. A>RENAME The system prompts for the filespecs: Enter New Name:X.PRN Enter Old Name:Y.PRN Y .PRN=X .PRN A> File X.PRN is renamed to Y.PRN on drive A. B>REN A:PRINTS.NEW = PRINCE.NEW The file PRINCE.NEW on drive A changes to PRINTS.NEW on drive A. A>RENAME S*.TEX=A*.TEX The above command renames all the files matching A*.TEX to files with filenames S*.TEX. A>REN B:NEWLIST=B:OLDLIST The file OLDLIST changes to NEWLIST on drive B. Since the second drive specifier, B: is implied by the first one, it is unnecessary in this example. The command line above has the same effect as the following: A>REN B:NEWLIST=OLDLIST or A>REN NEWLIST=B:OLDLIST ///1RMAC Syntax: RMAC filespec {$Rd | $Sd | $Pd} Explanation: RMAC, a relocatable macro assembler, assembles .ASM files of into .REL files that you can link to create .COM files. ///2options RMAC options specify the destination of the output files. Replace d with the destination drive letter for the output files. Option d=output option R- drive for REL file (A-O, Z) S- drive for SYM file (A-O, X, P, Z) P- drive for PRN file (A-O, X, P, Z) A-O specifies drive A-O. X means output to the console. P means output to the printer. Z means zero output. ///2Example A>RMAC TEST $PX SB RB Assembles the file TEST.ASM from drive A, sends the listing file (TEST.PRN) to the console, puts the symbol file (TEST.SYM) on drive B and puts the relocatable object file (TEST.REL) on drive B. ///1RSXRM Syntax: RSXRM name Explanation: The RSXRM Command instructs a cooperating RSX to schedule itself for removal. The target RSX must intercept and understand BDOS function 60 with an RSX PB FUNC of 113 and PARAMETER1 pointing to an 8-character blank-padded string representing the name of the RSX to remove. If an RSX is loaded multiple times, only the first instance will remove itself. Example: A>RSXRM NDOS3 ///1SAVE Syntax: SAVE Explanation: SAVE copies the contents of memory to a file. To use SAVE, first issue the SAVE command, then run your program which reads a file into memory. Your program exits to the SAVE utility which prompts you for a filespec to which it copies the contents of memory, and the beginning and ending address of the memory to be SAVEd. ///2Example A>SAVE Activates the SAVE utility. Now enter the name of the program which loads a file into memory. A>SID dump.com Next, execute the program. #g0 When the program exits, SAVE intercepts the return to the system and prompts the user for the filespec and the bounds of memory to be SAVEd. SAVE Ver 3.0 Enter file (type RETURN to exit):dump2.com If file DUMP2.COM exists already, the system asks: Delete dump2.com? Y Then the system asks for the bounds of memory to be saved: Beginning hex address: 100 Ending hex address: 400 The contents of memory from 100H (Hexadecimal) to 400H is copied to file DUMP2.COM. ///1SET Syntax: SET [options] SET d: [options] SET filespec [options] Explanation: SET initiates password protection and time stamping of files. It also sets the file and drive attributes Read-Write, Read-Only, DIR and SYS. It lets you label a disk and password protect the label. To enable time stamping of files, you must first run INITDIR to format the disk directory. ///2Label Syntax: SET {d:} [NAME=labelname.typ] SET [PASSWORD=password] SET [PASSWORD= ///3Examples A>SET [NAME=DISK100] Labels the disk on the default drive as DISK100. A>SET [PASSWORD=SECRET] Assigns SECRET to the disk label. A>SET [PASSWORD= Nullifies the existing password. ///2Passwords SET [PROTECT=ON] SET [PROTECT=OFF] SET filespec [PASSWORD=password] SET filespec [PROTECT=READ] SET filespec [PROTECT=WRITE] SET filespec [PROTECT=DELETE] SET filespec [PROTECT=NONE] SET filespec [attribute-options] ///3Modes Password Protection Modes Mode Protection READ The password is required for reading, copying writing, deleting or renaming the file. WRITE The password is required for writing, deleting or renaming the file. You do not need a password to read the file. DELETE The password is only required for deleting or renaming the file. You do not need a password to read or modify the file. NONE No password exists for the file. If a password password exists, this modifier can be used to delete the password. ///2Attributes RO sets the file attribute to Read-Only. RW sets the file attribute to Read-Write. SYS sets the file attribute to SYS. DIR sets the file attribute to DIR. ARCHIVE=OFF means that the file has not been backed up (archived). ARCHIVE=ON means that the file has been backed up (archived). The Archive attribute can be turned on by SET or by PIP when copying a group of files with the PIP [A] option. SHOW and DIR display the Archive option. F1=ON|OFF turns on or off the user-definable file attribute F1. F2=ON|OFF turns on or off the user-definable file attribute F2. F3=ON|OFF turns on or off the user-definable file attribute F3. F4=ON|OFF turns on or off the user-definable file attribute F4. ///3Examples SET [PROTECT=ON] Turns on password protection for all the files on the disk. You must turn on password protection before you can assign passwords to files. SET [PROTECT=OFF] Disables password protection for the files on your disk. A>SET MYFILE.TEX [PASSWORD=MYFIL] MYFIL is the password assigned to file MYFILE.TEX. B>SET *.TEX [PASSWORD=SECRET, PROTECT=WRITE] Assigns the password SECRET to all the TEX files on drive B. Each TEX file is given a WRITE protect mode to prevent unauthorized editing. A>SET MYFILE.TEX [RO SYS] Sets MYFILE.TEX to Read-Only and SYStem. ///2Default A>SET [DEFAULT=dd] Instructs the system to use dd as a password if you do not enter a password for a password-protected file. ///2Time-Stamps Syntax: SET [CREATE=ON] SET [ACCESS=ON] SET [UPDATE=ON] Explanation: The above SET commands allow you to keep a record of the time and date of file creation and update, or of the last access and update of your files. ///3Options [CREATE=ON] turns on CREATE time stamps on the disk in the default or specified drive. To record the creation time of a file, the CREATE option must be turned on before the file is created. [ACCESS=ON] turns on ACCESS time stamps on the disk in the default or specified drive. ACCESS and CREATE options are mutually exclusive; only one can be in effect at a time. If you turn on the ACCESS time stamp on a disk that previously had CREATE time stamp, the CREATE time stamp is automatically turned off. [UPDATE=ON] turns on UPDATE time stamps on the disk in the default or specified drive. UPDATE time stamps record the time the file was last modified. ///3Examples A>SET [ACCESS=ON] A>SET [CREATE=ON,UPDATE=ON] ///2Drives Syntax: SET {d:} [RO] SET {d:} [RW] Example: A>SET B: [RO] Sets drive B to Read-Only. ///1SETDEF Syntax: SETDEF { d: {,d: {,d: {,d:}}}} {[ TEMPORARY = d: ] | [ ORDER = (typ {,typ}) ]} SETDEF [DISPLAY | NO DISPLAY] SETDEF [PAGE | NOPAGE] Explanation: SETDEF allows the user to display or define up to four drives for the program search order, the drive for temporary files, and the file type search order. The SETDEF definitions affect only the loading of programs and/or execution of SUBMIT (SUB) files. SETDEF turns on/off the system Display and Console Page modes. When on, the system displays the location and name of programs loaded or SUBmit files executed, and stops after displaying one full console screen of information. ///2Examples A>SETDEF Displays current SETDEF parameters. A>SETDEF [TEMPORARY=C:] Sets disk drive C as the drive to be used for temporary files. A>SETDEF C:,* Tells the system to search for a program on drive C, then, if not found, search for it on the default drive. A>SETDEF [ORDER=(SUB,COM)] Instructs the system to search for a SUB file to execute. If no SUB file is found, search for a COM file. A>SETDEF [DISPLAY] Turns on the system display mode. Henceforth, the system displays the name and location of programs loaded or submit files executed. A>SETDEF [NO DISPLAY] Turns off the system Display mode. ///1SHOW Syntax: SHOW {d:}{[SPACE |LABEL |USERS |DIR |DRIVE]} Explanation: The SHOW command displays the following disk drive information: Access mode and the amount of free disk space Disk label Current user number and Number of files for each user number on the disk Number of free directory entries for the disk Drive characteristics ///2Examples A>SHOW A>SHOW [SPACE] Instructs the system to display access mode and amount of space left on logged-in drives. A>SHOW B: Show access mode for drive B and amount of space left on drive B. A>SHOW B:[LABEL] Displays label information for drive B. A>SHOW [USERS] Displays the current user number and all the users on drive A and the corresponding number of files assigned to them. A>SHOW C:[DIR] Displays the number of free directory entries on drive C. A>SHOW [DRIVE] Displays the drive characteristics of drive A. ///1SID Syntax: SID {pgm-filespec} {,sym-filespec} Explanation: The SID symbolic debugger allows you to monitor and test programs developed for the 8080 microprocessor. SID supports real-time breakpoints, fully monitored execution, symbolic disassembly, assembly, and memory display and fill functions. SID can dynamically load SID utility programs to provide traceback and histogram facilities. ///2Commands Command Meaning As 00 CALL BDOS 0451 C30000 JMP WBOOT MKERR: ; INFILE OPEN, PARTIAL CLEANUP 0454 11F304 LXI D,MERRM 0457 C36304 JMP ABORT INERR: ; BOTH FILES OPEN 045A 11B204 LXI D,IERRM 045D C36304 JMP ABORT OUTERR: ; BOTH FILES OPEN 0460 11C604 LXI D,OERRM ABORT: 0463 D5 PUSH D 0464 CD2004 CALL CLOSEALL 0467 114B01 LXI D,TMPFILE 046A 0E13 MVI C,DELETE 046C CD0500 CALL BDOS 046F D1 POP D 0470 C37C04 JMP ERRMSG RENERR: ; FILES ARE ALL CLOSED, NO CLEANUP 0473 110705 LXI D,RERRM 0476 C37C04 JMP ERRMSG INOFILE: ; FILES NOT OPEN YET, NO CLEANUP 0479 11DB04 LXI D,NERRM ERRMSG: 047C D5 PUSH D 047D 3A7401 LDA FLCNT 0480 B7 ORA A 0481 CA9204 JZ NOCRLF 0484 1E0D MVI E,CR 0486 0E02 MVI C,CONOUT 0488 CD0500 CALL BDOS 048B 1E0A MVI E,LF 048D 0E02 MVI C,CONOUT 048F CD0500 CALL BDOS NOCRLF: 0492 D1 POP D 0493 0E09 MVI C,PRINT 0495 CD0500 CALL BDOS 0498 C30000 JMP WBOOT ; CHECK FOR '?' (AMBIGUOUS FILE NAME) IN FCB HL ; RETURN CY SET IF UNAMBIGUOUS CHKAFN: 049B 060D MVI B,13 QCHK: 049D 7E MOV A,M 049E FE3F CPI '?' 04A0 C8 RZ 04A1 23 INX H 04A2 05 DCR B 04A3 C29D04 JNZ QCHK 04A6 37 STC 04A7 C9 RET 04A8 496E76616CPERRM: DB 'Invalid: $' 04B2 4572726F72IERRM: DB 'Error reading input$' 04C6 4572726F72OERRM: DB 'Error writing output$' 04DB 4E6F206669NERRM: DB 'No file found for input$' 04F3 4572726F72MERRM: DB 'Error creating temp$' 0507 4572726F72RERRM: DB 'Error renaming temp$' 051B 0D0A557361USAGE: DB CR,LF,'Usage: TR A:{outfile}=B:infile[U|C]$' 0541 436F707969CPYING: DB 'Copying -$' 054B 0D0A202020FPREFX: DB CR,LF,' $' 0552 00 OUTCNT: DB 0 0553 0000 OUTPTR: DW 0 0555 00 INCNT: DB 0 0556 0000 INPTR: DW 0 0598 = STACK EQU $+64 0598 = OUTBUF EQU STACK 0618 = INBUF EQU OUTBUF+BUFLEN 0698 = FLIST EQU INBUF+BUFLEN 0558 END 0463 ABORT 0000 BC 0005 BDOS 0080 BUFLEN 0171 BYTCNT 049B CHKAFN 0305 CHRLOOP 0010 CLOSE 0420 CLOSEALL 0080 CMDLINE 0002 CONOUT 0170 CONV 01D7 CONVOK 0541 CPYING 000D CR 0338 CRLFOK 0002 DE 0013 DELETE 0359 DONE0 0366 DONE 001A EOF 047C ERRMSG 0174 FLCNT 0698 FLIST 0283 FLOOP 0172 FLPTR 054B FPREFX 03A6 GETCHR 0449 HELP 0004 HL 04B2 IERRM 0618 INBUF 0555 INCNT 0346 INEOF 034D INEOF0 045A INERR 0103 INFILE 03F6 INFILL 0479 INOFILE 0414 INOK 0556 INPTR 0385 ISCPM 0004 IX 0004 IY 000A LF 0016 MAKE 04F3 MERRM 0454 MKERR 021C MULTCP 04DB NERRM 020D NOBLANK 0492 NOCRLF 031E NOTCR 033A NOTLF 04C6 OERRM 000F OPEN 0598 OUTBUF 0552 OUTCNT 0460 OUTERR 0127 OUTFILE 03D6 OUTFLUSH 03EA OUTINIT 0553 OUTPTR 0431 PARERR 0098 PARSE 04A8 PERRM 0175 PFCB 0009 PRINT 03BD PUTCHR 049D QCHK 0014 READ 0017 RENAME 0473 RENERR 0507 RERRM 016F SAWCR 0011 SERFST 0243 SERLOOP 0012 SERNXT 001E SETATR 001A SETDMA 0598 STACK 0179 START 014B TMPFILE 02B9 TRFILE 051B USAGE 0000 WBOOT 0015 WRITE  ; NTPDATE PROGRAM FOR KAYPRO CP/M 3 MACLIB Z80 0005 = BDOS EQU 0005H 0080 = CMDLN EQU 0080H ; BDOS FUNCTIONS 0002 = CONOUT EQU 2 0009 = PRINT EQU 9 000C = GETVER EQU 12 0031 = SGSCB EQU 49 ; CP/NET NDOS FUNCTIONS 0042 = NSEND EQU 66 0043 = NRECV EQU 67 0100 ORG 0100H 0100 C33402 JMP START 0103 38 IOPORT: DB 038H 0104 0000 VERS: DW 0 0106 0000 SCBADR: DW 0 0108 0000026900GETTIME: DB 0, 0, 2, 105, 0, 0 010E 0102006904GOTTIME: DB 1, 2, 0, 105, 4, 0, 0, 0, 0, 0 ; JUST PREDICTION OF WHAT WILL BE RECEIVED 0118 3A SCBPB: DB 03AH ; OFFSET OF SCB ADDRESS (RESERVED AREA) 0119 00 DB 0 ; GET WORD, (SCB ADDRESS) 011A 0000 DW 0 ; ASSUME < 100 DECOUT: 011C 0630 MVI B,'0' DECOT0: 011E D60A SUI 10 0120 DA2701 JC DECOT1 0123 04 INR B 0124 C31E01 JMP DECOT0 DECOT1: 0127 C60A ADI 10 0129 C630 ADI '0' 012B F5 PUSH PSW 012C 78 MOV A,B 012D CD5B01 CALL PROUT 0130 F1 POP PSW 0131 C35B01 JMP PROUT ; KEEPS NUMBER IN HL - CALLER MUST PRESERVE/INIT ; RETURNS CY FOR INVALID HEXNUM: 0134 D630 SUI '0' 0136 D8 RC 0137 FE0A CPI 9+1 0139 D24301 JNC HEXNM1 HEXNM2: 013C 29 DAD H 013D 29 DAD H 013E 29 DAD H 013F 29 DAD H 0140 B5 ORA L 0141 6F MOV L,A 0142 C9 RET HEXNM1: 0143 D608 SUI 'A'-'9' 0145 D8 RC 0146 FE06 CPI 5+1 0148 3F CMC 0149 D8 RC 014A C60A ADI 10 014C C33C01 JMP HEXNM2 HEXOUT: 014F F5 PUSH PSW 0150 0F RRC 0151 0F RRC 0152 0F RRC 0153 0F RRC 0154 CD5801 CALL HEXDIG 0157 F1 POP PSW HEXDIG: 0158 CD6101 CALL TOHEX PROUT: 015B 5F MOV E,A 015C 0E02 MVI C,CONOUT 015E C30500 JMP BDOS TOHEX: 0161 E60F ANI 0FH 0163 C690 ADI 90H 0165 27 DAA 0166 CE40 ACI 40H 0168 27 DAA 0169 C9 RET ; HL = CP/M DATE-TIME FIELD, W/O SECONDS ; PRINT DATE AND TIME TO CONSOLE. PRDATE: 016A 5E MOV E,M 016B 23 INX H 016C 56 MOV D,M 016D 23 INX H 016E E5 PUSH H ; COMPUTE YEAR 016F 0E4E MVI C,78 ; BASE YEAR, EPOCH, BINARY 0171 0678 MVI B,078H ; YEAR, BCD ; SPECIAL-CASE DATE=0... 0173 7B MOV A,E 0174 B2 ORA D 0175 C27901 JNZ PRDAT0 0178 13 INX D PRDAT0: 0179 216D01 LXI H,365 017C 79 MOV A,C 017D E603 ANI 03H ; NOT STRICTLY TRUE, BUT WORKS UNTIL YEAR 2100... 017F C28301 JNZ PRDAT1 0182 23 INX H 0183 E5 PRDAT1: PUSH H 0184 B7 ORA A DSBC D 0185+ED52 DB 0EDH,D*8+42H 0187 E1 POP H 0188 D29901 JNC PRDAT2 ; DONE COMPUTING YEAR... 018B EB XCHG 018C B7 ORA A DSBC D 018D+ED52 DB 0EDH,D*8+42H 018F EB XCHG 0190 0C INR C 0191 78 MOV A,B 0192 C601 ADI 1 0194 27 DAA 0195 47 MOV B,A 0196 C37901 JMP PRDAT0 PRDAT2: ; DE = DAYS WITHIN YEAR 'C' 0199 C5 PUSH B ; SAVE (2-DIGIT) YEAR, B = BCD, C = BINARY (UNTIL 2155) 019A 211C02 LXI H,MONTH0+24 019D 79 MOV A,C 019E E603 ANI 03H 01A0 C2A601 JNZ PRDAT3 01A3 213402 LXI H,MONTH1+24 PRDAT3: ; COMPUTE MONTH, DE = DAYS IN YEAR,HL = MON-YR-DAYS TABLE ADJ FOR LEAP 01A6 060C MVI B,12 PRDAT4: 01A8 2B DCX H 01A9 2B DCX H 01AA 05 DCR B 01AB FABD01 JM PRDAT5 ; SHOULD NEVER HAPPEN... 01AE E5 PUSH H 01AF D5 PUSH D 01B0 7E MOV A,M 01B1 23 INX H 01B2 66 MOV H,M 01B3 6F MOV L,A ; DE = DAYS IN YEAR, HL = YTD[MONTH] 01B4 B7 ORA A DSBC D 01B5+ED52 DB 0EDH,D*8+42H 01B7 7D MOV A,L ; POTENTIAL REMAINDER (NEG) 01B8 D1 POP D 01B9 E1 POP H 01BA D2A801 JNC PRDAT4 PRDAT5: ; B = MONTH, 0-11; A = -DOM NEG 01BD+ED44 DB 0EDH,44H 01BF F5 PUSH PSW 01C0 04 INR B 01C1 78 MOV A,B 01C2 CD1C01 CALL DECOUT 01C5 1E2F MVI E,'/' 01C7 0E02 MVI C,CONOUT 01C9 CD0500 CALL BDOS 01CC F1 POP PSW 01CD CD1C01 CALL DECOUT 01D0 1E2F MVI E,'/' 01D2 0E02 MVI C,CONOUT 01D4 CD0500 CALL BDOS 01D7 C1 POP B 01D8 78 MOV A,B ; ALREADY BCD 01D9 CD4F01 CALL HEXOUT 01DC 1E20 MVI E,' ' 01DE 0E02 MVI C,CONOUT 01E0 CD0500 CALL BDOS 01E3 E1 POP H ; -> BCD HOURS 01E4 7E MOV A,M 01E5 23 INX H 01E6 E5 PUSH H 01E7 CD4F01 CALL HEXOUT 01EA 1E3A MVI E,':' 01EC 0E02 MVI C,CONOUT 01EE CD0500 CALL BDOS 01F1 E1 POP H ; -> BCD MINUTES 01F2 7E MOV A,M 01F3 23 INX H 01F4 E5 PUSH H 01F5 CD4F01 CALL HEXOUT 01F8 1E3A MVI E,':' 01FA 0E02 MVI C,CONOUT 01FC CD0500 CALL BDOS 01FF E1 POP H ; -> BCD SECONDS 0200 7E MOV A,M 0201 C34F01 JMP HEXOUT ; J F M A M J J A S O N D 0204 00001F003BMONTH0: DW 0, 31, 59, 90,120,151,181,212,243,273,304,334 021C 00001F003CMONTH1: DW 0, 31, 60, 91,121,152,182,213,244,274,305,335 START: 0234 0E0C MVI C,GETVER 0236 CD0500 CALL BDOS 0239 220401 SHLD VERS 023C 7D MOV A,L 023D FE1E CPI 30 023F DAD902 JC BADVERS 0242 218000 LXI H,CMDLN 0245 4E MOV C,M 0246 23 INX H SID1: 0247 7E MOV A,M 0248 FE20 CPI ' ' 024A C25502 JNZ SID0 024D 23 INX H 024E 0D DCR C 024F C24702 JNZ SID1 0252 C36902 JMP START1 ; NO PARAMS, USE DEFAULTS SID0: ; SCAN HEX NUMBER AS SERVER ID 0255 EB XCHG 0256 210000 LXI H,0 SID2: 0259 1A LDAX D 025A 13 INX D 025B CD3401 CALL HEXNUM 025E DA6502 JC SID3 0261 0D DCR C 0262 C25902 JNZ SID2 SID3: 0265 7D MOV A,L 0266 320901 STA GETTIME+1 START1: ; TODO: HANDLE MP/M... 0269 111801 LXI D,SCBPB 026C 0E31 MVI C,SGSCB 026E CD0500 CALL BDOS 0271 220601 SHLD SCBADR 0274 2A0401 LHLD VERS 0277 3E02 MVI A,2 ; BIT FOR CP/NET 0279 A4 ANA H 027A CA9802 JZ NOCPNET 027D 110801 LXI D,GETTIME 0280 0E42 MVI C,NSEND 0282 CD0500 CALL BDOS 0285 B7 ORA A 0286 C2D002 JNZ ERROR 0289 110E01 LXI D,GOTTIME 028C 0E43 MVI C,NRECV 028E CD0500 CALL BDOS 0291 B7 ORA A 0292 C2D002 JNZ ERROR 0295 C3AF02 JMP SETTIME NOCPNET: 0298 CD3803 CALL NETINIT 029B 010801 LXI B, GETTIME 029E CD4503 CALL SENDMSG 02A1 B7 ORA A 02A2 C2D002 JNZ ERROR 02A5 010E01 LXI B, GOTTIME 02A8 CD6103 CALL RECEIVEMSG 02AB B7 ORA A 02AC C2D002 JNZ ERROR :10010000C334023800000000000002690000010250 :1001100000690400000000003A0000000630D60A22 :10012000DA270104C31E01C60AC630F578CD5B018B :10013000F1C35B01D630D8FE0AD24301292929290F :10014000B56FC9D608D8FE063FD8C60AC33C01F52C :100150000F0F0F0FCD5801F1CD61015F0E02C305E6 :1001600000E60FC69027CE4027C95E235623E50E32 :100170004E06787BB2C2790113216D0179E603C284 :10018000830123E5B7ED52E1D29901EBB7ED52EBD4 :100190000C78C6012747C37901C5211C0279E60303 :1001A000C2A601213402060C2B2B05FABD01E5D5B0 :1001B0007E23666FB7ED527DD1E1D2A801ED44F503 :1001C0000478CD1C011E2F0E02CD0500F1CD1C01BF :1001D0001E2F0E02CD0500C178CD4F011E200E024C :1001E000CD0500E17E23E5CD4F011E3A0E02CD057F :1001F00000E17E23E5CD4F011E3A0E02CD0500E160 :100200007EC34F0100001F003B005A00780097009A :10021000B500D400F300110130014E0100001F00B1 :100220003C005B0079009800B600D500F400120194 :1002300031014F010E0CCD05002204017DFE1EDAB6 :10024000D9022180004E237EFE20C25502230DC21A :100250004702C36902EB2100001A13CD3401DA65AD :10026000020DC259027D3209011118010 (Assemble) Enter assembly language statements s is the start address Cs{b{,d}} (Call) Call to memory location from SID s is the called address b is the value of the BC register pair d is the value of the DE register pair D{W}{s}{,f} (Display) Display memory in hex and ASCII W is a 16-bit word format s is the start address f is the finish address Epgm-filespec (Load) Load program and symbol table {,sym-filespec} for execution E*sym-filespec (Load) Load a symbol table file Fs,f,d (Fill) Fill memory with constant value s is the start address f is the finish address d is an eight-bit data item G{p}{,a{,b}} (Go) Begin Execution p is a start address a is a temporary breakpoint H (Hex) Displays all symbols with addresses in Hex H.a Displays hex, decimal, and ASCII values of a where a is a symbolic expression Ha,b Computes hex sum and difference of a and b where a and b are symbolic expressions Icommand tail (Input) Input CCP command line L{s}{,f} (List) List 8080 mnemonic instructions s is the start address f is the finish address Ms,h,d (Move) Move Memory Block s is the start address h is the high address of the block d is the destination start address P{p{,c}} (Pass) Pass point set, reset, and display p is a permanent breakpoint address c is initial value of pass counter Rfilespec{,d} (Read) Read Code/Symbols d is an offset to each address S{W}s (Set) Set Memory Values s is address where value is sent W is 16 bit word T{n{,c}} (Trace) Trace Program Execution n is the number of program steps c is the utility entry address. T{W}{n{,c}} (Trace) Trace Without Call W instructs SID not to trace subroutines n is the number of program steps c is the utility entry address U{W}{n{,c}} (Untrace) Monitor Execution without Trace n is the number of program steps c is the utility entry address W instructs SID not to trace subroutines V (Value) Display the value of the next available location in memory (NEXT), the next location after the largest file read in (MSZE), the current value of the Program counter (PC), and the address of the end of available memory (END) Wfilespec,s,f (Write) Write the contents of a contiguous block of memory to filespec. f is finish address X{f}{r} (Examine) Examine/alter CPU state. f is flag bit C,Z,M,E or I. r is register A,B,D,H,S or P. ///2Examples A>SID CP/M 3 loads SID from drive A into memory. SID displays the # prompt when it is ready to accept commands. A>B:SID SAMPLE.HEX CP/M 3 loads SID and the program file SAMPLE.HEX into memory from drive B. ///2Utilities SID utilities, HIST.UTL and TRACE.UTL are special programs that operate with SID to provide additional debugging facilities. The mechanisms for system initialization, data collection, and data display are described in the CP/M SID User's Guide. The HIST utility creates a histogram (bar graph) showing the relative frequency of execution of code within selected program segments of the test program. The HIST utility allows you to monitor those sections of code that execute most frequently. The TRACE utility obtains a backtrace of the instructions that led to a particular breakpoint address in a program under test. You can collect the addresses of up to 256 instructions between pass points in U or T modes. ///1SUBMIT Syntax: SUBMIT {filespec} {argument} ... {argument} Explanation: The SUBMIT command lets you execute a group (batch) of commands from a SUBmit file (a file with filetype of SUB). ///2Subfile The SUB file can contain the following types of lines: Any valid CP/M 3 command Any valid CP/M 3 command with SUBMIT parameters ($0-$9) Any data input line Any program input line with parameters ($0 to $9) The command line cannot exceed 135 characters. The following lines illustrate the variety of lines which may be entered in a SUB file: DIR DIR *.BAK MAC $1 $$$4 PIP LST:=$1.PRN[T$2 $3 $5] DIR *.ASM PIP SUBMIT A>SUBMIT SUBA A>SUBMIT AA ZZ SZ A>SUBMIT B:START DIR E: ///2PROFILE.SUB Everytime you power up or reset your computer, CP/M 3 looks for a special SUBmit file named PROFILE.SUB to execute. If it does not exist, CP/M 3 resumes normal operation. If the PROFILE.SUB file exists, the system executes the commands in the file. This file is convenient to use if you regularly execute a set of commands before you do your regular session on the computer. ///1TPA Syntax: TPA Explanation: The TPA Command displays the amount of memory available for TPA. The amount of memory is a direct translation of the current BDOS entry page, including any active RSXs. This can be used to determine if RSXs are resident, by comparing the TPA to the value seen immediately after boot. Example: A>TPA 57.25K TPA ///1TR Syntax: TR d:{filespec}=filespec[C|U] Explanation: The TR Command copies one or more files and translates line endings between Unix and CP/M conventions. The option C causes every line feed character to be prefixed with a carriage return, unless already present. The U option removes all carriage returns from the file. Neither source nor destination drive is required to be networked, although that would be the normal case. The source filespec cannot be ambiguous if a destination filespec in given. Example: A>TR C:=P:*.ASM[C] ///1TYPE Syntax: TYPE {filespec {[ PAGE | NOPAGE ]}} Explanation: The TYPE command displays the contents of an ASCII character file on your screen. [PAGE] Causes the console listing to be displayed in paged mode; i.e., stop automatically after listing n lines of text, where n normally defaults to 24 lines per page. [NOPAGE] Turns off Console Page Mode and continuously displays a typed file on the screen. ///2Examples A>TYPE MYPROG.PLI Displays the contents of the file MYPROG.PLI on your screen. A>TYPE B:THISFILE [PAGE] Displays the contents of the file THISFILE from drive B on your screen twenty four lines at a time. ///1USER Syntax: USER {number} Explanation: The USER command sets the current user number. The disk directory can be divided into distinct groups according to a "User Number." User numbers range from 0 through 15. ///2Examples A>USER Enter User#:5 5A> The current user number is now 5 on drive A. A>USER 3 3A> This command changes the current User Number to 3. ///1XREF Syntax: XREF {d:} filename {$P} Explanation: XREF provides a cross-reference summary of variable usage in a program. XREF requires the .PRN and .SYM files produced by MAC or RMAC for input to the program. The SYM and PRN files must have the same filename as the filename in the XREF command tail. XREF outputs a file of type .XRF. Examples: A>XREF b:MYPROG A>XREF b:MYPROG $P ad the file. DELETE The password is only required for deleting or renaming the file. You do not need a password to read or modify the file. NONE No password exists for the file. If a++(, ***** INSTALLATION MENU *****  If you are installing a new copy of WordStar, you must select letter A to install your printer. If your printer is not listed on the Menu of Printers, return to this menu and select letter B. If you want to change a particular WordStar feature, choose letter C. ,A Menu of Printers B Custom Installation of Printers ,C Menu of WordStar Features ,X Exit from INSTALL ,Enter the letter of your choice (A/B/C/X). +A Menu of PrintersA M+B Custom Installation of PrintersB 9+C Menu of WordStar FeaturesC p++ Custom modification of WordStar+ +X Exit from INSTALLX +   ,The changes made during this session of INSTALL are stored in a temporary file. You may now save these changes in your installed file .  These are your current values:  + 2Terminal : COMMANDS CONVENTIONS 3CNTRLCHARS COPYSYS &VCPNET (eEXTENSIONS ,SNDOS3 2CPNETSTS 4nDATE <=EXAMPLES > DEVICE @OPTIONS E]EXAMPLES JeDIR U-BUILT-IN X/EXAMPLES [lWITHOPTIONS dOPTIONS gWEXAMPLES xCDSKRESET nDUMP AED {COMMANDS gEXAMPLES ERASE OPTION EXAMPLES FILESPEC 9GENCOM OPTIONS HEXAMPLES ,GET AOPTIONS %EXAMPLES GHELP HEXCOM INITDIR NLIB ZOPTIONS wMODIFIERS ZEXAMPLES gLINK >OPTIONS EXAMPLES FLOCAL ELOGIN !-LOGOFF '#MAC *#EXAMPLES .lOPTIONS /4NETSTAT 9oNETWORK <dNTPDATE B5PATCH DZPIP (COPY) G@EXAMPLES N3OPTIONS U&PUT ^$OPTIONS dJEXAMPLES m*RENAME s6EXAMPLES vRMAC }sOPTIONS OEXAMPLE YRSXRM xSAVE ^EXAMPLE SET lLABEL CEXAMPLES NPASSWORDS FMODES ATTRIBUTES  EXAMPLES DEFAULT =TIME-STAMPS iOPTIONS EXAMPLES BDRIVES SETDEF 1EXAMPLES QSHOW ;EXAMPLES TSID fCOMMANDS FEXAMPLES IUTILITIES YSUBMIT SUBFILE EXECUTE nPROFILE.SUB nTPA  TR .TYPE EXAMPLES 3USER 5EXAMPLES FXREF $ HEL$ $ $ $  ///1commands CP/M 3 Command Format: A>COMMAND {command tail} A CP/M 3 command line is composed of a command, an optional command tail, and a carriage return. The command is the name or filename of a program to be executed. The optional command tail can consist of a drive specification, one or more file specifications, and some options or parameters. ///2conventions COMMAND CONVENTIONS The following special symbols define command syntax. {} surrounds an optional item. | separates alternative items in a command line. indicates a carriage return. ^ indicates the Control Key. n substitute a number for n. s substitute a string (group) of characters for s. o substitute an option or option list for o. [] type square brackets to enclose an option list. () type parens to enclose a range of options within an option list. RW Read-Write attribute - opposite of RO RO Read-Only attribute - opposite of RW SYS System attribute - opposite of DIR DIR Directory attribute - opposite of SYS ... preceding element can be repeated as many times as desired. * wildcard: replaces all or part of a filename and/or filetype. ? wildcard: replaces any single character in the same position of a filename and/or filetype. ///1cntrlchars Control Character Function CTRL-A moves cursor one character to the left. Banked system only. CTRL-B moves cursor from beginning to end of command line and back without affecting command. Banked system only. CTRL-C stops executing program when entered at the system prompt or after CTRL-S. CTRL-E forces a physical carriage return without sending command to CP/M 3. CTRL-F moves cursor one character to the right. Banked system only. CTRL-G deletes character at current cursor position if in the middle of a line. Banked system only. CTRL-I same as the TAB key. CTRL-H delete character to the left of cursor. CTRL-J moves cursor to the left of the command line and sends command to CP/M 3. Line feed, has same effect as carriage return. CTRL-K deletes character at cursor and all characters to the right. CTRL-M same as carriage return. CTRL-P echoes console output to the list device. CTRL-Q restarts screen scrolling after a CTRL-S. CTRL-R retypes the characters to the left of the cursor on a new line; updates the command line buffer. CTRL-S stops screen scrolling. CTRL-U updates the command line buffer to contain the characters to the left of the cursor; deletes current line. CTRL-W recalls previous command line if current line is empty; otherwise moves cursor to end of line. CTRL-J,-M,-R,-U and RETURN update the command line buffer for recall with CTRL-W. Banked system only. CTRL-X deletes all characters to the left of the cursor. ///1COPYSYS Syntax: COPYSYS Explanation: COPYSYS copies the CP/M 3 system from a CP/M 3 system diskette to another diskette. The new diskette must have the same format as the original system diskette. Example: A>COPYSYS ///1CPNET CP/NET on CP/M 3 CP/NET on CP/M 3 uses an RSX that combines the functions of the NDOS and SNIOS from CP/NET on CP/M 2.2. It also provides support for more functions, particularly those available to CP/M 3 programs. The RSX may be removed, allowing dynamic switching between CP/NET (with reduced TPA) and normal operation. CP/NET on CP/M 3 does not (currently) support networked console or list devices. ///2EXTENSIONS EXTENSIONS TO NDOS FOR CP/M 3 The following BDOS functions are now supported on networked drives: 17 - SEARCH FIRST (enhancement) 18 - SEARCH NEXT (enhancement) 46 - GET DISK FREE SPACE 48 - FLUSH BUFFERS 98 - FREE BLOCKS 99 - TRUNCATE FILE 101 - GET DIR LAEL BYTE 102 - READ FILE DATE/PASSWORD MODE SEARCH functions were enhanced to return aE31CD056E :10027000002206012A04013E02A4CA9802110801C4 :100280000E42CD0500B7C2D002110E010E43CD05BE :1002900000B7C2D002C3AF02CD3803010801CD457B :1002A00003B7C2D002010E01CD6103B7C2D0022A4A :1002B000060111580019EB211301010500F3EDB0FF :1002C000FB11E2020E09CD0500211301CD6A01C91F :1002D00011F4020E09CD0500C91114030E09CD0554 :1002E00000C954696D65207761732073657420744B :1002F0006F3A2024074572726F72207265747269BA :100300006576696E67206E6574776F726B207469AD :100310006D652E2407546869732070726F6772616F :100320006D2072657175697265732042444F532068 :100330003E3D20332E302E243A03014F0CED79ED53 :1003400078320A01C96069E5DDE13A03014F06052B :10035000EDB3DD460404EDB30CED78E602C83EFFD4 :10036000C96069E5DDE13A03014F0CED78E601CAA9 :100370006B030D0605EDB2DD460404EDB20CED781D :06038000E604C83EFFC9BF :0000000000  SETTIME: 02AF 2A0601 LHLD SCBADR 02B2 115800 LXI D,058H ; DATE/TIME 02B5 19 DAD D 02B6 EB XCHG 02B7 211301 LXI H,GOTTIME+5 02BA 010500 LXI B,5 ; LENGTH OF DATE/TIME 02BD F3 DI LDIR 02BE+EDB0 DB 0EDH,0B0H 02C0 FB EI 02C1 11E202 LXI D,DONE 02C4 0E09 MVI C,PRINT 02C6 CD0500 CALL BDOS 02C9 211301 LXI H,GOTTIME+5 02CC CD6A01 CALL PRDATE 02CF C9 RET ERROR: 02D0 11F402 LXI D,ERRMSG 02D3 0E09 MVI C,PRINT 02D5 CD0500 CALL BDOS 02D8 C9 RET BADVERS: 02D9 111403 LXI D,VERMSG 02DC 0E09 MVI C,PRINT 02DE CD0500 CALL BDOS 02E1 C9 RET 02E2 54696D6520DONE: DB 'Time was set to: $' 02F4 074572726FERRMSG: DB 7,'Error retrieving network time.$' 0314 0754686973VERMSG: DB 7,'This program requires BDOS >= 3.0.$' ; THESE ARE ONLY USED IF CP/NET IS NOT RUNNING. NETINIT: 0338 3A0301 LDA IOPORT 033B 4F MOV C,A 033C 0C INR C OUTP A 033D+ED79 DB 0EDH,A*8+41H INP A 033F+ED78 DB 0EDH,A*8+40H 0341 320A01 STA GETTIME+2 0344 C9 RET ; SEND MESSAGE ON NETWORK SENDMSG: ; BC = MESSAGE ADDR 0345 60 MOV H,B 0346 69 MOV L,C ; HL = MESSAGE ADDRESS 0347 E5 PUSH H POPIX 0348+DDE1 DB 0DDH,0E1H 034A 3A0301 LDA IOPORT 034D 4F MOV C,A 034E 0605 MVI B,5 ; LENGTH OF HEADER OUTIR 0350+EDB3 DB 0EDH,0B3H LDX B,4 ; MSG SIZ FIELD (-1) 0352+DD4604 DB 0DDH,B*8+46H,4 0355 04 INR B ; MIGHT BE 0, BUT THAT MEANS 256 OUTIR 0356+EDB3 DB 0EDH,0B3H 0358 0C INR C ; STATUS PORT INP A ; 0359+ED78 DB 0EDH,A*8+40H 035B E602 ANI 02H ; CMD OVERRUN 035D C8 RZ 035E 3EFF MVI A,0FFH 0360 C9 RET ; RECEIVE MESSAGE FROM NETWORK RECEIVEMSG: ; BC = MESSAGE ADDR 0361 60 MOV H,B 0362 69 MOV L,C ; HL = MESSAGE ADDRESS 0363 E5 PUSH H POPIX 0364+DDE1 DB 0DDH,0E1H 0366 3A0301 LDA IOPORT 0369 4F MOV C,A 036A 0C INR C ; STATUS PORT RCVWAIT: INP A 036B+ED78 DB 0EDH,A*8+40H 036D E601 ANI 01H ; DATA READY 036F CA6B03 JZ RCVWAIT 0372 0D DCR C 0373 0605 MVI B,5 ; HEADER LENGTH INIR 0375+EDB2 DB 0EDH,0B2H LDX B,4 ; MSG SIZ 0377+DD4604 DB 0DDH,B*8+46H,4 037A 04 INR B INIR 037B+EDB2 DB 0EDH,0B2H 037D 0C INR C INP A 037E+ED78 DB 0EDH,A*8+40H 0380 E604 ANI 04H ; RSP OVERRUN 0382 C8 RZ 0383 3EFF MVI A,0FFH 0385 C9 RET 0386 END 02D9 BADVERS 0000 BC 0005 BDOS 0080 CMDLN 0002 CONOUT 0002 DE 011E DECOT0 0127 DECOT1 011C DECOUT 02E2 DONE 02F4 ERRMSG 02D0 ERROR 0108 GETTIME 000C GETVER 010E GOTTIME 0158 HEXDIG 0143 HEXNM1 013C HEXNM2 0134 HEXNUM 014F HEXOUT 0004 HL 0103 IOPORT 0004 IX 0004 IY 0204 MONTH0 021C MONTH1 0338 NETINIT 0298 NOCPNET 0043 NRECV 0042 NSEND 0179 PRDAT0 0183 PRDAT1 0199 PRDAT2 01A6 PRDAT3 01A8 PRDAT4 01BD PRDAT5 016A PRDATE 0009 PRINT 015B PROUT 036B RCVWAIT 0361 RECEIVEMSG 0106 SCBADR 0118 SCBPB 0345 SENDMSG 02AF SETTIME 0031 SGSCB 0255 SID0 0247 SID1 0259 SID2 0265 SID3 0234 START 0269 START1 0161 TOHEX 0314 VERMSG 0104 VERS  ; BC = MESSAGE ADDR 0361 60 MOV H,B 0362 69 MOV L,C ; HL = MESSAGE ADDRESS 0363 E5 PUSH H POPIX 0364+DDE1 DB 0DDH,0E1H 0366 3A0301 LDA IOPORT 0369 4F MOV C,A 036A 0C INR C ; A VERSION OF CPNETSTS THAT MINIMIZES OUTPUT 0100 ORG 00100H 0100 C3EC01 JMP START 0103 0D0A43502FL0103H: DB 13,10,'CP/NET Status' 0112 0D0A3D3D3D DB 13,10,'=============' 0121 0D0A24 DB 13,10,'$' 0124 5265717565L012CH: DB 'Requester ID = $' 0134 0D0A4E6574L013CH: DB 13,10,'Network Status Byte = $' 014D 0D0A446576L0155H: DB 13,10,'Device status:' 015D 0D0A24 DB 13,10,'$' 0160 2020447269L016DH: DB ' Drive $' 0169 203D204472L0176H: DB ' = Drive $' 0173 206F6E204EL0180H: DB ' on Network Server ID = $' 018C 2020436F6EL01A2H: DB ' Console Device = $' 01A0 436F6E736FL01B4H: DB 'Console #$' 01AA 20204C6973L01DDH: DB ' List Device = $' 01BB 4C69737420L01ECH: DB 'List #$' 01C2 2020416C6CL01HHH: DB ' All LOCAL$' 01CE 0D0A43502FL0212H: DB 13,10,'CP/NET has not been loaded.$' START: 01EC 210000 LXI H,0 01EF 39 DAD SP 01F0 229503 SHLD USRSTK 01F3 319503 LXI SP,STACK 01F6 CD3003 CALL GETVER 01F9 7C MOV A,H 01FA E602 ANI 02H 01FC CA1603 JZ NOCPNT 01FF 010301 LXI B,L0103H ; INTRO 0202 CD2803 CALL MSGOUT 0205 CD3C03 CALL GETCFG 0208 229903 SHLD NETTBL 020B 012401 LXI B,L012CH ; REQ ID (CLIENT ID) 020E CD2803 CALL MSGOUT 0211 2A9903 LHLD NETTBL 0214 23 INX H 0215 4E MOV C,M 0216 CD4D03 CALL HEXOUT 0219 013401 LXI B,L013CH ; NET STS BYTE 021C CD2803 CALL MSGOUT 021F CD3603 CALL GETSTS 0222 4F MOV C,A 0223 CD4D03 CALL HEXOUT 0226 014D01 LXI B,L0155H ; DISK DEVICE STATUS: 0229 CD2803 CALL MSGOUT 022C AF XRA A 022D 329703 STA COUNT 0230 329803 STA CURDRV DRVLUP: 0233 3A9803 LDA CURDRV 0236 FE10 CPI 16 0238 D29602 JNC TRYCON ; DONE WITH DRIVES A-P... 023B 6F MOV L,A 023C 2600 MVI H,0 023E 29 DAD H ; *2 - 2 BYTES PER DRIVE 023F 23 INX H 0240 23 INX H ; +2 - 2 BYTES BEFORE DRIVES 0241 EB XCHG 0242 2A9903 LHLD NETTBL 0245 19 DAD D 0246 7E MOV A,M 0247 E680 ANI 080H 0249 CA8F02 JZ LOCDRV ; DRIVE IS LOCAL... 024C E5 PUSH H 024D 3A9703 LDA COUNT 0250 B7 ORA A 0251 C44203 CNZ CRLF 0254 219703 LXI H,COUNT 0257 34 INR M 0258 016001 LXI B,L016DH ; DRIVE... 025B CD2803 CALL MSGOUT 025E 3A9803 LDA CURDRV 0261 C641 ADI 'A' 0263 4F MOV C,A 0264 CD2103 CALL CHROUT 0267 0E3A MVI C,':' 0269 CD2103 CALL CHROUT 026C 016901 LXI B,L0176H ; = DRIVE... I.E. REMOTE 026F CD2803 CALL MSGOUT 0272 E1 POP H 0273 E5 PUSH H 0274 7E MOV A,M 0275 E60F ANI 00FH ; REMOTE DRIVE NUMBER 0277 C641 ADI 'A' 0279 4F MOV C,A 027A CD2103 CALL CHROUT 027D 0E3A MVI C,':' 027F CD2103 CALL CHROUT 0282 017301 LXI B,L0180H ; ON SERVER... 0285 CD2803 CALL MSGOUT 0288 E1 POP H 0289 23 INX H 028A 7E MOV A,M ; SERVER ID 028B 4F MOV C,A 028C CD4D03 CALL HEXOUT LOCDRV: ; DRIVE IS LOCAL... 028F 219803 LXI H,CURDRV 0292 34 INR M 0293 C33302 JMP DRVLUP TRYCON: 0296 012200 LXI B,00022H 0299 2A9903 LHLD NETTBL 029C 09 DAD B 029D 7E MOV A,M 029E E680 ANI 080H 02A0 CACE02 JZ TRYLST 02A3 E5 PUSH H 02A4 3A9703 LDA COUNT 02A7 B7 ORA A 02A8 C44203 CNZ CRLF 02AB 219703 LXI H,COUNT 02AE 34 INR M 02AF 018C01 LXI B,L01A2H ; CONSOLE DEVICE = ... 02B2 CD2803 CALL MSGOUT 02B5 01A001 LXI B,L01B4H ; CONSOLE # 02B8 CD2803 CALL MSGOUT 02BB E1 POP H 02BC E5 PUSH H 02BD 7E MOV A,M 02BE CD6103 :10010000C3EC010D0A43502F4E45542053746174C3 :1001100075730D0A3D3D3D3D3D3D3D3D3D3D3D3D04 :100120003D0D0A24526571756573746572204944EA :10013000203D20240D0A4E6574776F726B20537436 :10014000617475732042797465203D20240D0A4442 :100150006576696365207374617475733A0D0A245A :10016000202044726976652024203D2044726976FF :10017000652024206F6E204E6574776F726B20535C :100180006572766572204944203D20242020436F0B :100190006E736F6C6520446576696365203D20242D :1001A000436F6E736F6C6520232420204C69737439 :1001B00020446576696365203D20244C6973742072 :1001C00023242020416C6C204C4F43414C240D0AC9 :1001D00043502F4E455420686173206E6F74206227 :1001E00065656E206C6F616465642E2421000039A2 :1001F000229503319503CD30037CE602CA16030134 :100200000301CD2803CD3C03229903012401CD280D :10021000032A9903234ECD4D03013401CD2803CD8C :1002200036034FCD4D03014D01CD2803AF32970367 :100230003298033A9803FE10D296026F26002923C3 :1002400023EB2A9903197EE680CA8F02E53A9703C9 :10025000B7C4420321970334016001CD28033A98C3 :1002600003C6414FCD21030E3ACD2103016901CDD3 :100270002803E1E57EE60FC6414FCD21030E3ACDBE :100280002103017301CD2803E1237E4FCD4D0321CE :10029000980334C333020122002A9903097EE680C1 :1002A000CACE02E53A9703B7C4420321970334014B :1002B0008C01CD280301A001CD2803E1E57ECD61AD :1002C00003017301CD2803E1237E4FCD4D030124AB :1002D000002A9903097EE680CA0603E53A9703B728 :1002E000C442032197033401AA01CD280301BB01B5 :1002F000CD2803E1E57ECD6103017301CD2803E143 :10030000237E4FCD4D033A9703B7C21C0301C201B0 :10031000CD2803C31C0301CE01CD28032A9503F980 :10032000C9590E02CD0500C950590E09CD0500C9A5 :100330000E0CCD0500C90E44CD0500C90E45CD05F6 :1003400000C90E0DCD21030E0ACD2103C9C5790FB9 :100350000F0F0FCD6103C179CD61030E48CD21038D :0D036000C9E60FC69027CE40274FC32103EA :0603950000000000000062 :0000000000  full sector of directory entries in the case of searching with the drive set to '?', as is done by DIR.COM with the [FULL] option. This allows retrieval of SFCB data from the last directory entry of each block (which is not otherwise returned). ///2NDOS3 Syntax: NDOS3 The NDOS3 command is a simple loader for the NDOS3 RSX. It loads NDOS3 regardless of whether it is already loaded. Once loaded and resident, NDOS3 implements CP/NET - all calls to BDOS function 12 GET VERSION return H with bit 02H set to indicate CP/NET is active. ///1CPNETSTS Syntax: CPNETSTS Explanation: The CPNETSTS command displays the requester configuration table. The requester configuration table indicates the status of each logical device that is either local or assigned to a specific server on the network. Example: A>NETSTAT CP/NET 1.2 Status ================= Requester ID = 02H Network Status Byte = 10H Disk device status: Drive A: = LOCAL Drive B: = LOCAL Drive C: = LOCAL Drive D: = LOCAL Drive E: = LOCAL Drive F: = LOCAL Drive G: = LOCAL Drive H: = LOCAL Drive I: = LOCAL Drive J: = LOCAL Drive K: = LOCAL Drive L: = LOCAL Drive M: = LOCAL Drive N: = LOCAL Drive O: = LOCAL Drive P: = Drive F: on Network Server ID = 00H Console Device = LOCAL List Device = LOCAL ///1DATE Syntax: DATE {CONTINUOUS} DATE {time-specification} DATE SET Explanation: The DATE command lets you display and set the date and time of day. ///2Examples A>DATE Displays the current date and time. A>DATE C Displays the date and time continuously. A>DATE 08/14/82 10:30:0 Sets the date and time. A>DATE SET Prompts for date and time entries. ///1DEVICE Syntax: DEVICE { NAMES | VALUES | physical-dev | logical-dev} DEVICE logical-dev=physical-dev {option} {,physical-dev {option},...} DEVICE logical-dev = NULL DEVICE physical-dev {option} DEVICE CONSOLE [ PAGE | COLUMNS = columns | LINES = lines] Explanation: DEVICE displays current logical device assignments and physical device names. DEVICE assigns logical devices to peripheral devices attached to the computer. DEVICE also sets the communications protocol and speed of a peripheral device, and displays or sets the current console screen size. ///2Options [ XON | NOXON | baud-rate ] XON refers to the XON/XOFF communications protocol. NOXON indicates no protocol and the computer sends data to the device whether or not the device is ready to receive it. baud-rate is the speed of the device. The system accepts the following baud rates: 50 75 110 134 150 300 600 1200 1800 2400 3600 4800 7200 9600 19200 ///2Examples A>DEVICE Displays the physical devices and current assignments of the logical devices in the system. A>DEVICE NAMES Lists the physical devices with a summary of the device characteristics. A>DEVICE VALUES Displays the current logical device assignments. A>DEVICE CRT Displays the attributes of the physical device CRT. A>DEVICE CON Displays the assignment of the logical device CON: A>DEVICE CONOUT:=LPT,CRT Assigns the system console output (CONOUT:) to the printer (LPT) and the screen (CRT). A>DEVICE AUXIN:=CRT2 [XON,9600] Assigns the auxiliary logical input device (AUXIN:) to the physical device CRT using protocol XON/XOFF and sets the transmission rate for the device at 9600. A>DEVICE LST:=NULL Disconnects the list output logical device (LST:). A>DEVICE LPT [XON,9600] Sets the XON/XOFF protocol for the physical device LPT and sets the transmission speed at 9600. A>DEVICE CONSOLE [PAGE] Displays the current console page width in columns and length in lines. A>DEVICE CONSOLE [COLUMNS=40 LINES=16] Sets the screen size to 40 columns and 16 lines. ///1DIR The DIR command displays the names of files and the characteristics associated with the files. The DIR command has three distinct references: DIR DIRS DIR with Options DIR and DIRS are built-in utilities. DIR with Options is a transient utility and must be loaded into memory from the disk. ///2Built-in Syntax: DIR {d:} DIR {filespec} DIRS {d:} DIRS {filespec} Explanation: The DIR and DIRS Built-in commands display the names of files cataloged in the directory of an on-line disk. DIR lists the names of files in the current user number that have the Directory (DIR) attribute. DIR accepts the * and ? wildcards in the file specification. ///3Examples A>DIR Displays all files in user 0 on drive A that have the Directory attribute. A>DIR B: Displays all DIR files in user 0 on drive B. 2A>DIR C:ZIPPY.DAT Displays the name ZIPPY.DAT if the file is in user 2 on drive C. 4A>DIR *.BAS Displays all DIR files with filetype BAS in user 4 on drive A. B3>DIR X*.C?D Displays all DIR files in user 3 on drive B whose filename begins with the letter X, and whose three character filetype contains the first character C and last character D. A>DIRS Displays all files for user 0 on drive A that have the system (SYS) attribute. A>DIRS *.COM Displays all SYS files with filetype COM on drive A in user 0. A command (.COM) file in user 0 with the system attribute can be accessed from any user number on that drive, and from any drive in the search chain (see SETDEF). ///2withOptions Syntax: DIR {d:} [options] DIR {filespec} {filespec} ... [options] Explanation: The DIR command with options is an enhanced version of the DIR built-in command and displays your files in a variety of ways. DIR can search for files on any or all drives, for any or all user numbers. One or two letters is sufficient to identify an option. You need not type the right hand square bracket. ///3Options Option Function ATT displays the file attributes. DATE displays date and time stamps of files. DIR displays only files that have the DIR attribute. DRIVE=ALL displays files on all on-line drives. DRIVE=(A,B,C,...,P) displays files on the drives specified. DRIVE=d displays files on the drive specified by d. EXCLUDE displays files that DO NOT MATCH the files specified in the command line. FF sends an initial form feed to the printer device if the printer has been activated by CTRL-P. FULL shows the name, size, number of 128-byte records, and attributes of the files. If there is a directory label on the drive, DIR shows the password protection mode and the time stamps. If there is no directory label, DIR displays two file entries on a line, omitting the password and time stamp columns. The display is alphabetically sorted. (See SET for a description of file attributes, directory labels, passwords and protection modes.) LENGTH=n displays n lines of printer output before inserting a table heading. n is a number between 5 and 65536. MESSAGE displays the names of drives and user numbers DIR is searching. NOSORT displays files in the order it finds them on the disk. RO displays only the files that have the Read-Only attribute. RW displays only the files that are set to Read-Write. SIZE displays the filename and size in kilobytes (1024 bytes). SYS displays only the files that have the SYS attribute. USER=ALL displays all files in all user numbers for the default or specified drive. USER=n displays the files in the user number specified by n. USER=(0,1,...,15) displays files under the user numbers specified. ///3Examples A>DIR C: [FULL] Displays full set of characteristics for all files in user 0 on drive C. A>DIR C: [DATE] Lists the files on drive C and their dates. A>DIR D: [RW,SYS] Displays all files in user 0 on drive D with Read-Write and System attributes. 3A>DIR [USER=ALL, DRIVE=ALL] Displays all the files in all user numbers (0-15) in all on- line drives. B6>DIR [exclude] *.DAT Lists all the files on drive B in user 6 that do not have a filetype of .DAT. 3B>DIR [SIZE] *.PLI *.COM *.ASM Displays all the files of type PLI, COM, and ASM in user 3 on drive B in size display format. A>DIR [drive=all user=all] TESTFILE.BOB DIR displays the filename TESTFILE.BOB if it is found on any drive in any user number. A>DIR [size,rw] D: DIR lists each Read-Write file that resides on Drive D, with its size in kilobytes. Note that D: is equivalent to D:*.*. ///1DSKRESET Syntax: DSKRESET {drive(s)} Explanation: The DSKRESET command functions exactly like the PRL that executes under MP/M II. DSKRESET resets the specified drive, so a disk can be changed. drive(s) is a comma-separated list of the drive names to be reset. Example: A>DSKRESET P: ///1DUMP Syntax: DUMP filespec Explanation: DUMP displays the contents of a file in hexadecimal and ASCII format. Example: A>DUMP ABC.TEX ///1ed Format: ED input-filespec {d:|output-filespec} Explanation: Character file editor. To redirect or rename the new version of the file specify the destination drive or destination filespec. ///2commands ED Command Summary Command Action nA append n lines from original file to memory buffer 0A append file until buffer is one half full #A append file until buffer is full (or end of file) B, -B move CP to the beginning (B) or bottom (-B) of buffer nC, -nC move CP n characters forward (C) or back (-C) through buffer nD, -nD delete n characters before (-D) or from (D) the CP E save new file and return to CP/M-86 Fstring{^Z} find character string H save new file, reedit, use new file as original file I enter insert mode Istring{^Z} insert string at CP Jsearch_str^Zins_str^Zdel_to_str juxtapose strings nK, -nK delete (kill) n lines from the CP nL, -nL, 0L move CP n lines nMcommands execute commands n times n, -n move CP n lines and display that line n: move to line n :ncommand execute command through line n Nstring{^Z} extended find string O return to original file nP, -nP move CP 23 lines forward and display 23 lines at console Q abandon new file, return to CP/M-86 R{^Z} read X$$$$$$$.LIB file into buffer Rfilespec{^Z} read filespec into buffer Sdelete string^Zinsert string substitute string nT, -nT, 0T type n lines U, -U upper-case translation V, -V line numbering on/off 0V display free buffer space nW write n lines to new file 0W write until buffer is half empty nX write or append n lines to X$$$$$$$.LIB nXfilespec{^Z} write n lines to filespec; append if previous xcommand applied to same file 0x{^Z} delete file X$$$$$$$.LIB 0xfilespec{^Z} delete filespec nZ wait n seconds Note: CP points to the current character being referenced in the edit buffer. Use {^Z} to separate multiple commands on the same line. ///2Examples A>ED TEST.DAT A>ED TEST.DAT B: A>ED TEST.DAT TEST2.DAT A>ED TEST.DAT B:TEST2.DAT ///1erase Syntax: ERASE {filespec} {[CONFIRM]} Explanation: The ERASE command removes one or more files from the directory of a disk. Wildcard characters are accepted in the filespec. Directory and data space are automatically reclaimed for later use by another file. The ERASE command can be abbreviated to ERA. ///2Option [CONFIRM] option informs the system to prompt for verification before erasing each file that matches the filespec. CONFIRM can be abbreviated to C. ///2Examples A>ERASE X.PAS Removes the file X.PAS from the disk in drive A. A>ERA *.PRN Confirm (Y/N)?Y All files with the filetype PRN are removed from the disk in drive A. B>ERA A:MY*.* [CONFIRM] Each file on drive A with a filename that begins with MY is displayed with a question mark for confirmation. Type Y to erase the file displayed, N to keep the file. A>ERA B:*.* Confirm (Y/N)?Y All files on drive B are removed from the disk. ///1filespec FILESPEC FORMAT CP/M 3 identifies every file by its unique file specification, which can consist of four parts: the drive specification, the filename, the filetype and the password. The term "filespec" indicates any valid combination of the four parts of a file specification, all separated by their appropriate delimiters. A colon must follow a drive letter. A period must precede a filetype. A semicolon must precede a password. The symbols and rules for the parts of a file specification follow: d: drivespec optional single alpha character (A-P) filename filename 1-8 letters and/or numbers typ filetype optional 0-3 letters and/or numbers password password optional 0-8 letters and/or numbers Valid combinations of the elements of a CP/M 3 file specification are: filename d:filename filename.typ d:filename.typ filename;password d:filename;password filename.typ;password d:filename.typ;password If you do not include a drive specifier, CP/M 3 automatically uses the default drive. Some CP/M 3 commands accept wildcard (* and ?) characters in the filename and/or filetype parts of the command tail. A wildcard in the command line can in one command reference many matching files on the default or specified user number and drive. (See Commands). ///1GENCOM Syntax: GENCOM {COM-filespec} {RSX-filespec} ... {[LOADER | NULL | SCB=(offset,value)]} Explanation: The GENCOM command creates a special COM file with attached RSX files. The GENCOM command can also restore a previously GENCOMed file to the original COM file without the header and RSX's. GENCOM can also attach header records to COM files. ///2Options LOADER sets a flag to keep the program loader active. NULL indicates that only RSX files are specified. GENCOM creates a dummy COM file for the RSX files. The output COM filename is taken from the filename of the first RSX-filespec. SCB=(offset,value) sets the System Control Block from the program by using the hex values specified by (offset,value). ///2Examples A>GENCOM MYPROG PROG1 PROG2 Generates a new COM file MYPROG.COM with attached RSX's PROG1 and PROG2. A>GENCOM PROG1 PROG2 [NULL] Creates a COM file PROG1.COM with RSX CALL HEXDIG 02C1 017301 LXI B,L0180H ; ON NETWORK SERVER ID = 02C4 CD2803 CALL MSGOUT 02C7 E1 POP H 02C8 23 INX H 02C9 7E MOV A,M 02CA 4F MOV C,A 02CB CD4D03 CALL HEXOUT TRYLST: 02CE 012400 LXI B,00024H 02D1 2A9903 LHLD NETTBL 02D4 09 DAD B 02D5 7E MOV A,M 02D6 E680 ANI 080H 02D8 CA0603 JZ DONE 02DB E5 PUSH H 02DC 3A9703 LDA COUNT 02DF B7 ORA A 02E0 C44203 CNZ CRLF 02E3 219703 LXI H,COUNT 02E6 34 INR M 02E7 01AA01 LXI B,L01DDH ; LIST DEVICE = 02EA CD2803 CALL MSGOUT 02ED 01BB01 LXI B,L01ECH ; LIST # 02F0 CD2803 CALL MSGOUT 02F3 E1 POP H 02F4 E5 PUSH H 02F5 7E MOV A,M 02F6 CD6103 CALL HEXDIG 02F9 017301 LXI B,L0180H ; ON NETWORK SERVER ID = 02FC CD2803 CALL MSGOUT 02FF E1 POP H 0300 23 INX H 0301 7E MOV A,M 0302 4F MOV C,A 0303 CD4D03 CALL HEXOUT DONE: 0306 3A9703 LDA COUNT 0309 B7 ORA A 030A C21C03 JNZ EXIT 030D 01C201 LXI B,L01HHH 0310 CD2803 CALL MSGOUT 0313 C31C03 JMP EXIT NOCPNT: 0316 01CE01 LXI B,L0212H ; CP/NET HAS NOT BEEN LOADED 0319 CD2803 CALL MSGOUT EXIT: 031C 2A9503 LHLD USRSTK 031F F9 SPHL 0320 C9 RET CHROUT: 0321 59 MOV E,C 0322 0E02 MVI C,002H 0324 CD0500 CALL 00005H 0327 C9 RET MSGOUT: 0328 50 MOV D,B 0329 59 MOV E,C 032A 0E09 MVI C,009H 032C CD0500 CALL 00005H 032F C9 RET GETVER: 0330 0E0C MVI C,12 0332 CD0500 CALL 00005H 0335 C9 RET GETSTS: 0336 0E44 MVI C,044H 0338 CD0500 CALL 00005H 033B C9 RET GETCFG: 033C 0E45 MVI C,045H 033E CD0500 CALL 00005H 0341 C9 RET CRLF: 0342 0E0D MVI C,13 0344 CD2103 CALL CHROUT 0347 0E0A MVI C,10 0349 CD2103 CALL CHROUT 034C C9 RET HEXOUT: 034D C5 PUSH B 034E 79 MOV A,C 034F 0F RRC 0350 0F RRC 0351 0F RRC 0352 0F RRC 0353 CD6103 CALL HEXDIG 0356 C1 POP B 0357 79 MOV A,C 0358 CD6103 CALL HEXDIG 035B 0E48 MVI C,'H' 035D CD2103 CALL CHROUT 0360 C9 RET HEXDIG: 0361 E60F ANI 0FH 0363 C690 ADI 90H 0365 27 DAA 0366 CE40 ACI 40H 0368 27 DAA 0369 4F MOV C,A 036A C32103 JMP CHROUT 036D DS 40 0395 STACK: DS 0 0395 0000 USRSTK: DW 0 0397 00 COUNT: DB 0 0398 00 CURDRV: DB 0 0399 0000 NETTBL: DW 0 039B END 0321 CHROUT 0397 COUNT 0342 CRLF 0398 CURDRV 0306 DONE 0233 DRVLUP 031C EXIT 033C GETCFG 0336 GETSTS 0330 GETVER 0361 HEXDIG 034D HEXOUT 0103 L0103H 0124 L012CH 0134 L013CH 014D L0155H 0160 L016DH 0169 L0176H 0173 L0180H 018C L01A2H 01A0 L01B4H 01AA L01DDH 01BB L01ECH 01C2 L01HHH 01CE L0212H 028F LOCDRV 0328 MSGOUT 0399 NETTBL 0316 NOCPNT 0395 STACK 01EC START 0296 TRYCON 02CE TRYLST 0395 USRSTK >2\2 š c No File $MORE:$ $ <q] 0192 0E09 MVI C,09H 0194 CD0500 CALL 0005H 0197 C36301 JMP DONE CLEARMSG: 019A 11B401 LXI D,CLRMSG 019D 0E09 MVI C,09H 019F CD0500 CALL 0005H 01A2 C9 RET 01A3 17 LCOUNT: DB 23 01A4 4E6F204669ERRMSG: DB 'No File' 01AB 0D0A24 CRLF: DB 13, 10, '$' 01AE 4D4F52453AMOR's PROG1 and PROG2. A>GENCOM MYPROG GENCOM takes MYPROG.COM, strips off the header and deletes all attached RSX's to restore it to its original COM format. A>GENCOM MYPROG PROG1 PROG2 GENCOM looks at the already-GENCOMed file MYPROG.COM to see if PROG1.RSX and PROG2.RSX are already attached RSX files in the module. If either one is already attached, GENCOM replaces it with the new RSX module. Otherwise, GENCOM appends the specified RSX files to the COM file. ///1GET Syntax: GET {CONSOLE INPUT FROM} FILE filespec{[{ECHO|NO ECHO} | SYSTEM]} GET {CONSOLE INPUT FROM} CONSOLE Explanation: GET directs the system to take console input from a file for the next system command or user program entered at the console. Console input is taken from a file until the program terminates. If the file is exhausted before program input is terminated, the program looks for subsequent input from the console. If the program terminates before exhausting all its input, the system reverts back to the console for console input. With the SYSTEM option, the system immediately goes to the specified file for console input. The system reverts to the console for input when it reaches the end of file. Re-direct the system to the console for console input with the GET CONSOLE INPUT FROM CONSOLE command as a command line in the input file. ///2Options ECHO specifies that input is echoed to the console. This is the default option. NO ECHO specifies that file input is not echoed to the console. The program output and the system prompts are not affected by this option and are still echoed to the console. SYSTEM specifies that all system input is immediately taken from the disk file specified in the command line. GET takes system and program input from the file until the file is exhausted or until GET reads a GET console command from the file. ///2Examples A>GET FILE XINPUT A>MYPROG Tells the system to activate the GET utility. Since SYSTEM is not specified, the system reads the next input line from the console and executes MYPROG. If MYPROG program requires console input, it is taken from the file XINPUT. When MYPROG terminates, the system reverts back to the console for console input. A>GET FILE XIN2 [SYSTEM] Immediately directs the system to get subsequent console input from file XIN2 because it includes the SYSTEM option. The system reverts back to the console for console input when it reaches the end of file in XIN2. Or XIN2 may redirect the system back to the console if it contains a GET CONSOLE command. A>GET CONSOLE Tells the system to get console input from the console. This command may be used in a file (previously specified in a GET FILE command), which is already being read by the system for console input. It is used to re-direct the console input back to the console before the end-of-file is reached. ///1HELP Syntax: HELP {topic} {subtopic1 ... subtopic8} {[NOPAGE|LIST]} Explanation: HELP displays a list of topics and provides summarized information for CP/M 3 commands. HELP topic displays information about that topic. HELP topic subtopic displays information about that subtopic. One or two letters is enough to identify the topics. After HELP displays information for your topic, it displays the special prompt HELP> on your screen, followed by a list of subtopics. - Enter ? to display list of main topics. - Enter a period and subtopic name to access subtopics. - Enter a period to redisplay what you just read. - Press the RETURN key to return to the CP/M 3 system prompt. - [NOPAGE] option disables the 24 lines per page console display. - Press any key to exit a display and return to the HELP> prompt. Examples: A>HELP A>HELP DATE A>HELP DIR OPTIONS A>HELP>.OPTIONS HELP>SET HELP>SET PASSWORD HELP>.PASSWORD HELP>. HELP> ///1HEXCOM Syntax: HEXCOM filename Explanation: The HEXCOM Command generates a command file (filetype .COM) from a .HEX input file. It names the output file with the same filename as the input file but with filetype .COM. HEXCOM always looks for a file with filetype .HEX. Example: A>HEXCOM B:PROGRAM Generates a command file PROGRAM.COM from the input hex file PROGRAM.HEX. ///1INITDIR Syntax: INITDIR {d:} Explanation: The INITDIR Command initializes a disk directory to allow date and time stamping of files on that disk. INITDIR can also recover time/date directory space. Example: A>INITDIR C: INITDIR WILL ACTIVATE TIME-STAMPS FOR SPECIFIED DRIVE. Do you want to re-format the directory on C: (Y/N)?Y ///1LIB Syntax: LIB filespec{[I|M|P|D]} LIB filespec{[I|M|P]}=filespec{modifier} {,filespec{modifier} ... } Explanation: A library is a file that contains a collection of object modules. Use the LIB utility to create libraries, and to append, replace, select or delete modules from an existing library. Use LIB to obtain information about the contents of library files. LIB creates and maintains library files that contain object modules in Microsoft REL file format. These modules are produced by Digital Research's relocatable macro-assembler program, RMAC, or any other language translator that pruduces modules in Microsoft REL file format. You can use LINK-80 to link the object modules contained in a library to other object files. LINK-80 automatically selects from the library only those modules needed by the program being linked, and then forms an executable file with a filetype of COM. ///2Options I The INDEX option creates an indexed library file of type .IRL. LINK-80 searches faster on indexed libraries than on non-indexed libraries. M The MODULE option displays module names. P The PUBLICS option displays module names and the public variables for the new library file. D The DUMP option displays the contents of object modules in ASCII form. ///2Modifiers Use modifiers in the command line to instruct LIB to delete, replace, or select modules in a library file. Angle brackets enclose the modules to be deleted or replaced. Parentheses enclose the modules to be selected. LIB Modifiers Delete Replace If module name and filename are the same this shorthand can be used: Select (modFIRST-modLAST,mod1,mod2,...,modN) ///2Examples A>LIB TEST4[P] Displays all modules and publics in TEST4.REL. A>LIB TEST5[P]=FILE1,FILE2 Creates TEST5.REL from FILE1.REL and FILE2.REL and displays all modules and publics in TEST5.REL. A>LIB TEST=TEST1(MOD1,MOD4),TEST2(C1-C4,C6) Creates a library file TEST.REL from modules in two source files. TEST1.REL contributes MOD1 and MOD4. LIB extracts modules C1, C4, and all the modules located between them, as well as module C6 from TEST2.REL. A>LIB FILE2=FILE3 Creates FILE2.REL from FILE3.REL, omitting MODA which is a module in FILE3.REL. A>LIB FILE6=FILE5 Creates FILE6.REL from FILE5.REL, FILEB.REL replaces MODA. A>LIB FILE6=FILE5 Module THISNAME is in FILE5.REL. When LIB creates FILE6.REL from FILE5.REL the file THISNAME.REL replaces the similarly named module THISNAME. A>LIB FILE1[I]=B:FILE2(PLOTS,FIND,SEARCH-DISPLAY) Creates FILE1.IRL on drive A from the selected modules PLOTS, FIND, and modules SEARCH through the module DISPLAY, in FILE2.REL on drive B. ///1LINK Syntax: LINK d:{filespec,{[options]}=}filespec{[options]}{,...} Explanation: LINK combines relocatable object modules such as those produced by RMAC and PL/I-80 into a .COM file ready for execution. Relocatable files can contain external references and publics. Relocatable files can reference modules in library files. LINK searches the library files and includes the referenced modules in the output file. See the CP/M 3 Programmer's Utilities Guide for a complete description of LINK- 80. ///2Options Use LINK option switches to control execution parameters. Link options follow the file specifications and are enclosed within square brackets. Multiple switches are separated by commas. LINK-80 Options A Additional memory; reduces buffer space and writes temporary data to disk B BIOS link in banked CP/M 3 system. 1. Aligns data segment on page boundary. 2. Puts length of code segment in header. 3. Defaults to .SPR filetype. Dhhhh Data origin; sets memory origin for common and data area Gn Go; set start address to label n Lhhhh Load; change default load address of module to hhhh. Default 0100H Mhhhh Memory size; Define free memory requirements for MP/M modules. NL No listing of symbol table at console NR No symbol table file OC Output .COM command file. Default OP Output .PRL page relocatable file for execution under MP/M in relocatable segment OR Output .RSP resident system process file for execution under MP/M OS Output .SPR system page relocatable file for execution under MP/M Phhhh Program origin; changes default program origin address to hhhh. Default is 0100H. Q Lists symbols with leading question mark S Search preceding file as a library $Cd Destination of console messages d can be X (console), Y (printer), or Z (zero output). Default is X. $Id Source of intermediate files; d is disk drive A-P. Default is current drive. $Ld Source of library files; d is disk drive A-P. Default is current drive. $Od Destination of of object file; d can be Z or disk drive A-P. Default is to same drive as first file in the LINK-80 command. $Sd Destination of symbol file; d can be Y or Z or disk drive A-P. Default is to same drive as first file in LINK-80 command. ///2Examples A>LINK b:MYFILE[NR] LINK-80 on drive A uses as input MYFILE.REL on drive B and produces the executable machine code file MYFILE.COM on drive B. The [NR] option specifies no symbol table file. A>LINK m1,m2,m3 LINK-80 combines the separately compiled files m1, m2, and m3, resolves their external references, and produces the executable machine code file m1.COM. A>LINK m=m1,m2,m3 LINK-80 combines the separately compiled files m1, m2, and m3 and produces the executable machine code file m.COM. A>LINK MYFILE,FILE5[s] The [s] option tells LINK-80 to search FILE5 as a library. LINK-80 combines MYFILE.REL with the referenced subroutines contained in FILE5.REL on the default drive A and produces MYFILE.COM on drive A. ///1LOCAL Syntax: LOCAL local-dev Explanation: The LOCAL command enables a requester to reassign selected I/O back to local from the network. The LOCAL command updates the requester configuration table. local-dev is the specification of a local device such as LST:, A:,... CON:. Example: A>LOCAL P: ///1LOGIN Syntax: LOGIN {password}{[mstrID]} Explanation: The LOGIN command allows a requester to log in to a specified server. A requester must log in before any resources on the server can be accessed. Once a requester has logged in, it is not necessary to log in again even though the requester might power down and then power up again. A requester can only be logged off a server by an explicit LOGOFF command issued from the requester. password is an optional 8 ASCII-character password; the default password is PASSWORD. [mstrID] is an optional two-digit server processor ID; the default is [00]. Not all servers require login. Example: A>LOGIN mypasswd[02] ///1LOGOFF Syntax: LOGOFF {[mstrID]} Explanation: The LOGOFF command allows a requester to log off from a specified server. Once a requester has logged off, the server cannot be accessed again until you issue a LOGIN command. [mstrID] is an optional two-digit server processor ID; the default is [00]. Example: A>LOGOFF [02] ///1mac Syntax: MAC filename {$options} Explanation: MAC, the CP/M 3 macro assembler, reads assembly language statements from a file of type .ASM, assembles the statements, and produces three output files with the input filename and filetypes of .HEX, .PRN, and .SYM. Filename.HEX contains INTEL hexadecimal format object code. Filename.PRN contains an annotated source listing that you can print or examine at the console. Filename.SYM contains a sorted list of symbols defined in the program. ///2Examples A>MAC SAMPLE A>MAC SAMPLE $PB AA HB SX ///2options Use options to direct the input and output of MAC. Use a letter with the option to indicate the source and destination drives, and console, printer, or zero output. Valid drive names are A thru O. X, P and Z specify console, printer, and zero output, respectively. Assembly Options That Direct Input/Output A source drive for .ASM file (A-O) H destination drive for .HEX file (A-O, Z) L source drive for macrolibrary .LIB files called by the MACLIB statement. P destination drive for .PRN file (A-O, X, P, Z) S destination drive for .SYM file Assembly Options That Modify Contents Of Output File +L lists input lines read from macrollibrary .LIB files -L suppresses listing (default) +M lists all macro lines as they are processed during assembly -M suppresses all macro lines as they are read during assembly *M lists only hex generated by macro expansions +Q lists all LOCAL symbols in the symbol list -Q suppresses all LOCAL symbols in the symbol list (default) +S appends symbol file to print file -S suppresses creation of symbol file +1 produces a pass 1 listing for macro debugging in .PRN file -1 suppress listing on pass 1 (default) ///1NETSTAT Syntax: NETSTAT Explanation: The NETSTAT command is a terse version of CPNETSTS. It only shows networked devices. Example: A>NETSTAT CP/NET Status ============= Requester ID = 02H Network Status Byte = 10H Device status: Drive P: = Drive F: on Network Server ID = 00H ///1NETWORK Syntax: NETWORK local-dev=server-dev{[srvrID]} Explanation: The NETWORK command enables a requester to assign selected I/O to the network. The NETWORK command updates the requester Configuration table. local-dev is the specification of a local device such as A:, B: ... P:, CON: or LST:. server-dev is the specification of a server device such as A:, B:y1Io&6"u!'"wu|1~=1#"u!"wu|1~[1#~UC12p#~]1#~1!͛:( (! :( 1!'͛1͹:( 1!"r2ty_!#*r 6$#"r:t<2tCA !:tK   !( ͹ =ƒ223!'K!T6$#6$#6$y2#KKT2oͦF :p> ::p8:o8> ͽ> ͽz2o:pY>ͽ:RM:RO>2q :pʅ:q2k!Q~wK'!'[Ks:U:U=2U*V~#"V:R:R=2R*Sw#"SK`!"S>2RZ>2!"V>2UK o&6$  cc K||:tʒ    ~?#7Invalid: $Error reading input$Error writing output$No file found for input$Error creating temp$Error renaming temp$ Usage: TR A:{outfile}=B:infile[U|C]$Copying -$ $8 :10046F00D1C37C04110705C37C0411DB04D53A7496 :10047F0001B7CA92041E0D0E02CD05001E0A0E0210 :10048F00CD0500D10E09CD0500C30000060D7EFE7F :10049F003FC82305C29D0437C9496E76616C6964F4 :1004AF003A20244572726F722072656164696E67BB :1004BF0020696E707574244572726F72207772693D :1004CF0074696E67206F7574707574244E6F206633 :1004DF00696C6520666F756E6420666F7220696E39 :1004EF0070757424457248ii:0 ' 0x[[0 C))))o? <Xa_Ɛ'@'^#V#Nx{y!myƒ#RҙR x'Gy!y¦!4 ++~#foR}ҨDx//xO ~#O:~#O:~O;Zx0N<[y1O "}!N#~ U# Gi!4e Y}2 1"*>ʘBCï8Ea*X! !j  Time was set to: $Error retrieving network time.$This program requires BDOS >= 3.0.$:O yx2 `i:OF x>`i:O xk F x>021000B500D400F300110130014E0100001F00B1 :100220003C005B0079009800B600D500F400120194 :1002300031014F010E0CCD05002204017DFE1EDAB6 :10024000D9022180004E237EFE20C25502230DC21A :100250004702C36902EB2100001A13CD3401DA65AD :10026000020DC259027D3209011118010 CP/NET Status ============= $Requester ID = $ Network Status Byte = $ Device status: $ Drive $ = Drive $ on Network Server ID = $ Console Device = $Console #$ List Device = $List #$ All LOCAL$ CP/NET has not been loaded.$!9"10|(<"$(*#NM4(6OMM(22:Җo&)##*~ʏ:B!4`(:AO!:!i(~AO!:!s(#~OM!43"* ~:B!4((~as(#~OM$* ~:B!4((~as(#~OM:((*YPY  DE ! !yayaH!Ɛ'@'O!021000032A9903234ECD4D03013401CD2803CD8C :1002200036034FCD4D03014D01CD2803AF32970367 :100230003298033A9803FE10D296026F26002923C3 :1002400023EB2A9903197EE680CA8F02E53A9703C9 :10025000B7C4420321970334016001CD28033A98C3 :1002600003C6414FCD21030E3ACD21030 ; SNIOS for fictitious CPNetDevice ; maclib z80 public NTWKIN, NTWKST, CNFTBL, SNDMSG, RCVMSG, NTWKER, NTWKBT, CFGTBL cseg ; Slave Configuration Table CFGTBL: 0000 ds 1 ; network status byte 0001 ds 1 ; slave processor ID number 0002 ds 2 ; A: Disk device +2 0004 ds 2 ; B: " 0006 ds 2 ; C: " 0008 ds 2 ; D: " 000A ds 2 ; E: " 000C ds 2 ; F: " 000E ds 2 ; G: " 0010 ds 2 ; H: " 0012 ds 2 ; I: " 0014 ds 2 ; J: " 0016 ds 2 ; K: " 0018 ds 2 ; L: " 001A ds 2 ; M: " 001C ds 2 ; N: " 001E ds 2 ; O: " 0020 ds 2 ; P: " 0022 ds 2 ; console device +34 0024 ds 2 ; list device: +36... 0026 ds 1 ; buffer index +2 0027 00 db 0 ; FMT +3 0028 00 db 0 ; DID +4 0029 FF db 0ffh ; SID (CP/NOS must still initialize) 002A 05 db 5 ; FNC +6 002B 00 db 0 ; SIZ +7 002C ds 1 ; MSG(0) List number +8 002D ds 128 ; MSG(1) ... MSG(128) +9... 00AD 38 ioport: db 038h ; possibly configured here... ; Network Status Byte Equates ; 0010 = active equ 0001$0000b ; slave logged in on network 0002 = rcverr equ 0000$0010b ; error in received message 0001 = senderr equ 0000$0001b ; unable to send message ; Utility Procedures ; ; Network Initialization NTWKIN: lxix CFGTBL 00AE+DD21 DB 0DDH,21H 00B0+0000 DW CFGTBL 00B2 3E10 mvi a,active stx a,+0 ; network status byte 00B4+DD7700 DB 0DDH,70H+A,+0 00B7 3AAD00 lda ioport 00BA 4F mov c,a 00BB 0C inr c ; status port 00BC AF xra a outp a 00BD+ED79 DB 0EDH,A*8+41H 00BF 0D dcr c inp a 00C0+ED78 DB 0EDH,A*8+40H stx a,+1 ; our slave (client) ID 00C2+DD7701 DB 0DDH,70H+A,+1 00C5 AF xra a 00C6 322B00 sta CFGTBL+36+7 00C9 C9 ret ; Network Status NTWKST: 00CA 3A0000 lda CFGTBL+0 00CD 47 mov b,a 00CE E6FC ani not (rcverr+senderr) 00D0 320000 sta CFGTBL+0 00D3 78 mov a,b 00D4 C9 ret ; Return Configuration Table Address ; Still need this for BDOS func 69 CNFTBL: 00D5 210000 lxi h,CFGTBL 00D8 C9 ret ; Send Message on Network SNDMSG: ; BC = message addr 00D9 60 mov h,b 00DA 69 mov l,c ; HL = message address 00DB E5 push h popix 00DC+DDE1 DB 0DDH,0E1H 00DE 3A0100 lda CFGTBL+1 stx a,+2 ; Set Slave ID in header 00E1+DD7702 DB 0DDH,70H+A,+2 00E4 3AAD00 lda ioport 00E7 4F mov c,a 00E8 0605 mvi b,5 ; length of header outir 00EA+EDB3 DB 0EDH,0B3H ldx b,+4 ; msg siz field (-1) 00EC+DD4604 DB 0DDH,B*8+46H,+4 00EF 04 inr b ; might be 0, but that means 256 outir 00F0+EDB3 DB 0EDH,0B3H 00F2 0C inr c ; status port inp a ; 00F3+ED78 DB 0EDH,A*8+40H 00F5 E602 ani 02h ; cmd overrun 00F7 C8 rz 00F8 3EFF mvi a,0ffh 00FA C9 ret ; Receive Message from Network RCVMSG: ; BC = message addr 00FB 60 mov h,b 00FC 69 mov ... P: in the case of a disk device, or 0, 1 ... 15 in the case of CON: or LST:. A missing server-dev defaults to 0 in the case of CON: or LST:. [srvrID] is an optional two-digit hexadecimal server processor ID. The default is [00]. Example: A>NETWORK P:=F: ///1NTPDATE Syntax: NTPDATE {server} Explanation: The NTPDATE Command sets the local time to that of the specified server. Default server is 00. Server ID is specified in hexadecimal. Example: A>NTPDATE 2 Time was set to: 04/16/16 18:34:12 ///1PATCH Syntax: PATCH filename{.typ} {n} Explanation: The PATCH command displays or installs patch number n to the CP/M 3 system or command files. The patch number n must be between 1 and 32 inclusive. Example: A>PATCH SHOW 2 Patches the SHOW.COM system file with patch number 2. ///1PIP (copy) Syntax: DESTINATION SOURCE PIP d:{Gn} | filespec{[Gn]} = filespec{[o]},... | d:{[o]} Explanation: The file copy program PIP copies files, combines files, and transfers files between disks, printers, consoles, or other devices attached to your computer. The first filespec is the destination. The second filespec is the source. Use two or more source filespecs separated by commas to combine two or more files into one file. [o] is any combination of the available options. The [Gn] option in the destination filespec tells PIP to copy your file to that user number. PIP with no command tail displays an * prompt and awaits your series of commands, entered and processed one line at a time. The source or destination can be any CP/M 3 logical device. ///2Examples COPY A FILE FROM ONE DISK TO ANOTHER A>PIP b:=a:draft.txt A>PIP b:draft.txt = a: B3>PIP myfile.dat=A:[G9] A9>PIP B:[G3]=myfile.dat COPY A FILE AND RENAME IT A5>PIP newdraft.txt=oldraft.txt C8>PIP b:newdraft.txt=a:oldraft.txt COPY MULTIPLE FILES A>PIP b:=draft.* A>PIP b:=*.* B>PIP b:=c:.*.* C>PIP b:=*.txt[g5] C>PIP a:=*.com[wr] B>PIP a:[g3]=c:*.* COMBINE MULTIPLE FILES A>PIP b:new.dat=file1.dat,file2.dat COPY, RENAME AND PLACE IN USER 1 A>pip newdraft.txt[g1]=oldraft.txt COPY, RENAME AND GET FROM USER 1 A>PIP newdraft.txt=oldraft.txt[g1] COPY TO/FROM LOGICAL DEVICES A>PIP b:funfile.sue=con: A>PIP lst:=con: A>PIP lst:=b:draft.txt[t8] A>PIP prn:=b:draft.txt ///2options PIP OPTIONS A Archive. Copy only files that have been changed since the last copy. C Confirm. PIP prompts for confirmation before each file copy. Dn Delete any characters past column n. E Echo transfer to console. F Filter form-feeds from source data. Gn Get from or go to user n. H Test for valid Hex format. I Ignore :00 Hex data records and test for valid Hex format. K Kill display of filespecs on console. L Translate upper case to lower case. N Number output lines O Object file transfer, ^Z ignored. Pn Set page length to n. (default n=60) Qs^Z Quit copying from source at string s. R Read files that have been set to SYStem. Ss^Z Start copying from the source at the string s. Tn Expand tabs to n spaces. U Translate lower case to upper case. V Verify that data has been written correctly. W Write over Read Only files without console query. Z Zero the parity bit. All options except C,G,K,O,R,V and W force an ASCII file transfer, character by character, terminated by a ^Z. ///1PUT Syntax: PUT CONSOLE {OUTPUT TO} FILE filespec {option} | CONSOLE PUT PRINTER {OUTPUT TO} FILE filespec {option} | PRINTER PUT CONSOLE {OUTPUT TO} CONSOLE PUT PRINTER {OUTPUT TO} PRINTER Explanation: PUT puts console or printer output to a file for the next command entered at the console, until the program terminates. Then console output reverts to the console. Printer output is directed to a file until the program terminates. Then printer output is put back to the printer. PUT with the SYSTEM option directs all subsequent console/printer output to the specified file. This option terminates when you enter the PUT CONSOLE or PUT PRINTER command. ///2Options [ {ECHO | NO ECHO} {FILTER | NO FILTER} | {SYSTEM} ] ECHO specifies that output is echoed to the console. This is the default option when you direct console output to a file. NO ECHO specifies that file output is not echoed to the console. NO ECHO is the default for the PUT PRINTER command. FILTER specifies filtering of control characters, which means that control characters are translated to printable characters. For example, an ESCape character is translated to ^[. NO FILTER means that PUT does not translate control characters. This is the default option. SYSTEM specifies that system output as well as program output is written to the file specified by filespec. Output is written to the file until a subsequent PUT CONSOLE command redirects console output back to the console. ///2Examples A>PUT CONSOLE OUTPUT TO FILE XOUT [ECHO] Directs console output to file XOUT with the output echoed to the console. A>PUT PRINTER OUTPUT TO FILE XOUT A>MYPROG Directs the printer output of program MYPROG to file XOUT. The output is not echoed to the printer. A>PUT PRINTER OUTPUT TO FILE XOUT2 [ECHO,SYSTEM] Directs all printer output to file XOUT2 as well as to the printer (with ECHO option), and the PUT is in effect until you enter a PUT PRINTER OUTPUT TO PRINTER command. A>PUT CONSOLE OUTPUT TO CONSOLE Directs console output back to the console. A>PUT PRINTER OUTPUT TO PRINTER Directs printer output back to the printer. ///1RENAME Syntax: RENAME {new-filespec=old-filespec} Explanation: RENAME lets you change the name of a file in the directory of a disk. To change several filenames in one command use the * or ? wildcards in the file specifications. The RENAME command can be abbreviated REN. REN prompts you for input. ///2Examples A>RENAME NEWFILE.BAS=OLDFILE.BAS The file OLDFILE.BAS changes to NEWFILE.BAS on drive A. A>RENAME The system prompts for the filespecs: Enter New Name:X.PRN Enter Old Name:Y.PRN Y .PRN=X .PRN A> File X.PRN is renamed to Y.PRN on drive A. B>REN A:PRINTS.NEW = PRINCE.NEW The file PRINCE.NEW on drive A changes to PRINTS.NEW on drive A. A>RENAME S*.TEX=A*.TEX The above command renames all the files matching A*.TEX to files with filenames S*.TEX. A>REN B:NEWLIST=B:OLDLIST The file OLDLIST changes to NEWLIST on drive B. Since the second drive specifier, B: is implied by the first one, it is unnecessary in this example. The command line above has the same effect as the following: A>REN B:NEWLIST=OLDLIST or A>REN NEWLIST=B:OLDLIST ///1RMAC Syntax: RMAC filespec {$Rd | $Sd | $Pd} Explanation: RMAC, a relocatable macro assembler, assembles .ASM files of into .REL files that you can link to create .COM files. ///2options RMAC options specify the destination of the output files. Replace d with the destination drive letter for the output files. Option d=output option R- drive for REL file (A-O, Z) S- drive for SYM file (A-O, X, P, Z) P- drive for PRN file (A-O, X, P, Z) A-O specifies drive A-O. X means output to the console. P means output to the printer. Z means zero output. ///2Example A>RMAC TEST $PX SB RB Assembles the file TEST.ASM from drive A, sends the listing file (TEST.PRN) to the console, puts the symbol file (TEST.SYM) on drive B and puts the relocatable object file (TEST.REL) on drive B. ///1RSXRM Syntax: RSXRM name Explanation: The RSXRM Command instructs a cooperating RSX to schedule itself for removal. The target RSX must intercept and understand BDOS function 60 with an RSX PB FUNC of 113 and PARAMETER1 pointing to an 8-character blank-padded string representing the name of the RSX to remove. If an RSX is loaded multiple times, only the first instance will remove itself. Example: A>RSXRM NDOS3 ///1SAVE Syntax: SAVE Explanation: SAVE copies the contents of memory to a file. To use SAVE, first issue the SAVE command, then run your program which reads a file into memory. Your program exits to the SAVE utility which prompts you for a filespec to which it copies the contents of memory, and the beginning and ending address of the memory to be SAVEd. ///2Example A>SAVE Activates the SAVE utility. Now enter the name of the program which loads a file into memory. A>SID dump.com Next, execute the program. #g0 When the program exits, SAVE intercepts the return to the system and prompts the user for the filespec and the bounds of memory to be SAVEd. SAVE Ver 3.0 Enter file (type RETURN to exit):dump2.com If file DUMP2.COM exists already, the system asks: Delete dump2.com? Y Then the system asks for the bounds of memory to be saved: Beginning hex address: 100 Ending hex address: 400 The contents of memory from 100H (Hexadecimal) to 400H is copied to file DUMP2.COM. ///1SET Syntax: SET [options] SET d: [options] SET filespec [options] Explanation: SET initiates password protection and time stamping of files. It also sets the file and drive attributes Read-Write, Read-Only, DIR and SYS. It lets you label a disk and password protect the label. To enable time stamping of files, you must first run INITDIR to format the disk directory. ///2Label Syntax: SET {d:} [NAME=labelname.typ] SET [PASSWORD=password] SET [PASSWORD= ///3Examples A>SET [NAME=DISK100] Labels the disk on the default drive as DISK100. A>SET [PASSWORD=SECRET] Assigns SECRET to the disk label. A>SET [PASSWORD= Nullifies the existing password. ///2Passwords SET [PROTECT=ON] SET [PROTECT=OFF] SET filespec [PASSWORD=password] SET filespec [PROTECT=READ] SET filespec [PROTECT=WRITE] SET filespec [PROTECT=DELETE] SET filespec [PROTECT=NONE] SET filespec [attribute-options] ///3Modes Password Protection Modes Mode Protection READ The password is required for reading, copying writing, deleting or renaming the file. WRITE The password is required for writing, deleting or renaming the file. You do not need a password to read the file. DELETE The password is only required for deleting or renaming the file. You do not need a password to read or modify the file. NONE No password exists for the file. If a password password exists, this modifier can be used to delete the password. ///2Attributes RO sets the file attribute to Read-Only. RW sets the file attribute to Read-Write. SYS sets the file attribute to SYS. DIR sets the file attribute to DIR. ARCHIVE=OFF means that the file has not been backed up (archived). ARCHIVE=ON means that the file has been backed up (archived). The Archive attribute can be turned on by SET or by PIP when copying a group of files with the PIP [A] option. SHOW and DIR display the Archive option. F1=ON|OFF turns on or off the user-definable file attribute F1. F2=ON|OFF turns on or off the user-definable file attribute F2. F3=ON|OFF turns on or off the user-definable file attribute F3. F4=ON|OFF turns on or off the user-definable file attribute F4. ///3Examples SET [PROTECT=ON] Turns on password protection for all the files on the disk. You must turn on password protection before you can assign passwords to files. SET [PROTECT=OFF] Disables password protection for the files on your disk. A>SET MYFILE.TEX [PASSWORD=MYFIL] MYFIL is the password assigned to file MYFILE.TEX. B>SET *.TEX [PASSWORD=SECRET, PROTECT=WRITE] Assigns the password SECRET to all the TEX files on drive B. Each TEX file is given a WRITE protect mode to prevent unauthorized editing. A>SET MYFILE.TEX [RO SYS] Sets MYFILE.TEX to Read-Only and SYStem. ///2Default A>SET [DEFAULT=dd] Instructs the system to use dd as a password if you do not enter a password for a password-protected file. ///2Time-Stamps Syntax: SET [CREATE=ON] SET [ACCESS=ON] SET [UPDATE=ON] Explanation: The above SET commands allow you to keep a record of the time and date of file creation and update, or of the last access and update of your files. ///3Options [CREATE=ON] turns on CREATE time stamps on the disk in the default or specified drive. To record the creation time of a file, the CREATE option must be turned on before the file is created. [ACCESS=ON] turns on ACCESS time stamps on the disk in the default or specified drive. ACCESS and CREATE options are mutually exclusive; only one can be in effect at a time. If you turn on the ACCESS time stamp on a disk that previously had CREATE time stamp, the CREATE time stamp is automatically turned off. [UPDATE=ON] turns on UPDATE time stamps on the disk in the default or specified drive. UPDATE time stamps record the time the file was last modified. ///3Examples A>SET [ACCESS=ON] A>SET [CREATE=ON,UPDATE=ON] ///2Drives Syntax: SET {d:} [RO] SET {d:} [RW] Example: A>SET B: [RO] Sets drive B to Read-Only. ///1SETDEF Syntax: SETDEF { d: {,d: {,d: {,d:}}}} {[ TEMPORARY = d: ] | [ ORDER = (typ {,typ}) ]} SETDEF [DISPLAY | NO DISPLAY] SETDEF [PAGE | NOPAGE] Explanation: SETDEF allows the user to display or define up to four drives for the program search order, the drive for temporary files, and the file type search order. The SETDEF definitions affect only the loading of programs and/or execution of SUBMIT (SUB) files. SETDEF turns on/off the system Display and Console Page modes. When on, the system displays the location and name of programs loaded or SUBmit files executed, and stops after displaying one full console screen of information. ///2Examples A>SETDEF Displays current SETDEF parameters. A>SETDEF [TEMPORARY=C:] Sets disk drive C as the drive to be used for temporary files. A>SETDEF C:,* Tells the system to search for a program on drive C, then, if not found, search for it on the default drive. A>SETDEF [ORDER=(SUB,COM)] Instructs the system to search for a SUB file to execute. If no SUB file is found, search for a COM file. A>SETDEF [DISPLAY] Turns on the system display mode. Henceforth, the system displays the name and location of programs loaded or submit files executed. A>SETDEF [N l,c ; HL = message address 00FD E5 push h popix 00FE+DDE1 DB 0DDH,0E1H 0100 3AAD00 lda ioport 0103 4F mov c,a 0104 0C inr c ; status port rcvwait: inp a 0105+ED78 DB 0EDH,A*8+40H 0107 E601 ani 01h ; data ready 0109 CA0501 jz rcvwait 010C 0D dcr c ; data port 010D 0605 mvi b,5 ; header length inir 010F+EDB2 DB 0EDH,0B2H ; Could compare SLVID with "LDX r,1" and ignore messages. ; But this "hardware" is point-to-point (connection oriented) ; so the only messages we see are intended for us. ldx b,+4 ; msg siz 0111+DD4604 DB 0DDH,B*8+46H,+4 0114 04 inr b inir 0115+EDB2 DB 0EDH,0B2H 0117 0C inr c ; status port inp a 0118+ED78 DB 0EDH,A*8+40H 011A E604 ani 04h ; rsp overrun 011C C8 rz 011D 3EFF mvi a,0ffh NTWKER: 011F C9 ret NTWKBT: ; NETWORK WARM START 0120 3AAD00 lda ioport 0123 4F mov c,a 0124 AF xra a ; Future hardware might expect data outp a 0125+ED79 DB 0EDH,A*8+41H inp a ; this is our Slave ID, but we already have it 0127+ED78 DB 0EDH,A*8+40H 0129 C9 ret 012A end 0010 ACTIVE 0000 BC 0000 CFGTBL 00D5 CNFTBL 0002 DE 0004 HL 00AD IOPORT 0004 IX 0004 IY 0120 NTWKBT 011F NTWKER 00AE NTWKIN 00CA NTWKST 0002 RCVERR 00FB RCVMSG 0105 RCVWAIT 0001 SENDERR 00D9 SNDMSG  ani 02h ; cmd overrun 00F7 C8 rz 00F8 3EFF mvi a,0ffh 00FA C9 ret ; Receive Message from Network RCVMSG: ; BC = message addr 00FB 60 mov h,b 00FC 69 mov֎ dEt9Q]-MRCNFTBLӑTe$5d4x9Q]-JNTWKBTё%RhZ-KB%@ hp@Z$-KF%@ hZD-$KI--ր>7Nխ'5xn*+dP$C@&KP:0ڳnGj<9L`4[խ'0A@A`+d#Ր1xs$uk@ ixdk2rZJtw('*+Gu@2r2dwd)"&~2j2  ¼!e"2!g"1 "`D  :*`.~*`.~*`.~**`.s#r*`.:w*`.~*`.~#foNDOS3 Started. $NDOS3 Ending. $y22e ; < 2 !y ##ڗ##~‚ s1O~#fo":" !f6#"GW ^&! !0 W_z!^#V!gm 7  Y Y f m u ?@BHH HH <>>FFN   $' */44/77JDDHH;O<>@ABCDE2@b!b6#####*O>G }++sb <% $# ¹!4:+ Gx 07*Ów#"  * *:!3_O2*2c* q#"52 " " :!ڬ*! ^#V#~2 " ì:¸: =2 ʸ!g"*  " :!ڬ*! 4¬#4¬#4!q* * :!: * *! s#r#w>!2e!g"g: _gry 2c**:8s*ry <:%O 22c!gs#r#":&k=!:g2<!7!!, ~Ҽڼ#yʔʕ+üN+~@w~2_*~?p *#"m:c2_:_%*2c*#w#"!h"V+~2+~=& J ! P !* P ! Ͱ}2K !O)s a }2ڄ *à Gy2c!g"*^#Vxʯ zW{_¥ {_:_O*)* q#"7!g"  *^#V#N#Fy!N ~&!W ^w#4% % x ~w~wQ  6<b!W  *`.n&}2 2 }2*~2c#*:2c*DM 2*DM% 2>J kb~#q ~# ^#V! # U ! ">2!}8!* >w: O y xw2U :* G2* x!* `i:+ w: OF x>`i: O x/ F x>: OyxB"I !@ BB$$ UUUUUTUUE@@ H @I$$@ $I$IH"$$D"I HHB"!$@$ $"IH"@$H@   $BI$I"$$A@!"  DD A H!D@DD!$I$HHH@ @HI"@ ɀT NDOS3 NDOS3 COPYRIGHT (C) 1980-82, DIGITAL RESEARCH NDOS Err $, Func $$Init err$ ! ">2  ¼!e"2!g"1 "`D  :*`.~*`.~*`.~**`.s#r*`.:w*`.~*`.~#foNDOS3 Started. $NDOS3 Ending. $y22e ; < 2 !O DISPLAY] Turns off the system Display mode. ///1SHOW Syntax: SHOW {d:}{[SPACE |LABEL |USERS |DIR |DRIVE]} Explanation: The SHOW command displays the following disk drive information: Access mode and the amount of free disk space Disk label Current user number and Number of files for each user number on the disk Number of free directory entries for the disk Drive characteristics ///2Examples A>SHOW A>SHOW [SPACE] Instructs the system to display access mode and amount of space left on logged-in drives. A>SHOW B: Show access mode for drive B and amount of space left on drive B. A>SHOW B:[LABEL] Displays label information for drive B. A>SHOW [USERS] Displays the current user number and all the users on drive A and the corresponding number of files assigned to them. A>SHOW C:[DIR] Displays the number of free directory entries on drive C. A>SHOW [DRIVE] Displays the drive characteristics of drive A. ///1SID Syntax: SID {pgm-filespec} {,sym-filespec} Explanation: The SID symbolic debugger allows you to monitor and test programs developed for the 8080 microprocessor. SID supports real-time breakpoints, fully monitored execution, symbolic disassembly, assembly, and memory display and fill functions. SID can dynamically load SID utility programs to provide traceback and histogram facilities. ///2Commands Command Meaning As (Assemble) Enter assembly language statements s is the start address Cs{b{,d}} (Call) Call to memory location from SID s is the called address b is the value of the BC register pair d is the value of the DE register pair D{W}{s}{,f} (Display) Display memory in hex and ASCII W is a 16-bit word format s is the start address f is the finish address Epgm-filespec (Load) Load program and symbol table {,sym-filespec} for execution E*sym-filespec (Load) Load a symbol table file Fs,f,d (Fill) Fill memory with constant value s is the start address f is the finish address d is an eight-bit data item G{p}{,a{,b}} (Go) Begin Execution p is a start address a is a temporary breakpoint H (Hex) Displays all symbols with addresses in Hex H.a Displays hex, decimal, and ASCII values of a where a is a symbolic expression Ha,b Computes hex sum and difference of a and b where a and b are symbolic expressions Icommand tail (Input) Input CCP command line L{s}{,f} (List) List 8080 mnemonic instructions s is the start address f is the finish address Ms,h,d (Move) Move Memory Block s is the start address h is the high address of the block d is the destination start address P{p{,c}} (Pass) Pass point set, reset, and display p is a permanent breakpoint address c is initial value of pass counter Rfilespec{,d} (Read) Read Code/Symbols d is an offset to each address S{W}s (Set) Set Memory Values s is address where value is sent W is 16 bit word T{n{,c}} (Trace) Trace Program Execution n is the number of program steps c is the utility entry address. T{W}{n{,c}} (Trace) Trace Without Call W instructs SID not to trace subroutines n is the number of program steps c is the utility entry address U{W}{n{,c}} (Untrace) Monitor Execution without Trace n is the number of program steps c is the utility entry address W instructs SID not to trace subroutines V (Value) Display the value of the next available location in memory (NEXT), the next location after the largest file read in (MSZE), the current value of the Program counter (PC), and the address of the end of available memory (END) Wfilespec,s,f (Write) Write the contents of a contiguous block of memory to filespec. f is finish address X{f}{r} (Examine) Examine/alter CPU state. f is flag bit C,Z,M,E or I. r is register A,B,D,H,S or P. ///2Examples A>SID CP/M 3 loads SID from drive A into memory. SID displays the # prompt when it is ready to accept commands. A>B:SID SAMPLE.HEX CP/M 3 loads SID and the program file SAMPLE.HEX into memory from drive B. ///2Utilities SID utilities, HIST.UTL and TRACE.UTL are special programs that operate with SID to provide additional debugging facilities. The mechanisms for system initialization, data collection, and data display are described in the CP/M SID User's Guide. The HIST utility creates a histogram (bar graph) showing the relative frequency of execution of code within selected program segments of the test program. The HIST utility allows you to monitor those sections of code that execute most frequently. The TRACE utility obtains a backtrace of the instructions that led to a particular breakpoint address in a program under test. You can collect the addresses of up to 256 instructions between pass points in U or T modes. ///1SUBMIT Syntax: SUBMIT {filespec} {argument} ... {argument} Explanation: The SUBMIT command lets you execute a group (batch) of commands from a SUBmit file (a file with filetype of SUB). ///2Subfile The SUB file can contain the following types of lines: Any valid CP/M 3 command Any valid CP/M 3 command with SUBMIT parameters ($0-$9) Any data input line Any program input line with parameters ($0 to $9) The command line cannot exceed 135 characters. The following lines illustrate the variety of lines which may be entered in a SUB file: DIR DIR *.BAK MAC $1 $$$4 PIP LST:=$1.PRN[T$2 $3 $5] DIR *.ASM PIP SUBMIT A>SUBMIT SUBA A>SUBMIT AA ZZ SZ A>SUBMIT B:START DIR E: ///2PROFILE.SUB Everytime you power up or reset your computer, CP/M 3 looks for a special SUBmit file named PROFILE.SUB to execute. If it does not exist, CP/M 3 resumes normal operation. If the PROFILE.SUB file exists, the system executes the commands in the file. This file is convenient to use if you regularly execute a set of commands before you do your regular session on the computer. ///1TPA Syntax: TPA Explanation: The TPA Command displays the amount of memory available for TPA. The amount of memory is a direct translation of the current BDOS entry page, including any active RSXs. This can be used to determine if RSXs are resident, by comparing the TPA to the value seen immediately after boot. Example: A>TPA 57.25K TPA ///1TR Syntax: TR d:{filespec}=filespec[C|U] Explanation: The TR Command copies one or more files and translates line endings between Unix and CP/M conventions. The option C causes every line feed character to be prefixed with a carriage return, unless already present. The U option removes all carriage returns from the file. Neither source nor destination drive is required to be networked, although that would be the normal case. The source filespec cannot be ambiguous if a destination filespec in given. Example: A>TR C:=P:*.ASM[C] ///1TYPE Syntax: TYPE {filespec {[ PAGE | NOPAGE ]}} Explanation: The TYPE command displays the contents of an ASCII character file on your screen. [PAGE] Causes the console listing to be displayed in paged mode; i.e., stop automatically after listing n lines of text, where n normally defaults to 24 lines per page. [NOPAGE] Turns off Console Page Mode and continuously displays a typed file on the screen. ///2Examples A>TYPE MYPROG.PLI Displays the contents of the file MYPROG.PLI on your screen. A>TYPE B:THISFILE [PAGE] Displays the contents of the file THISFILE from drive B on your screen twenty four lines at a time. ///1USER Syntax: USER {number} Explanation: The USER command sets the current user number. The disk directory can be divided into distinct groups according to a "User Number." User numbers range from 0 through 15. ///2Examples A>USER Enter User#:5 5A> The current user number is now 5 on drive A. A>USER 3 3A> This command changes the current User Number to 3. ///1XREF Syntax: XREF {d:} filename {$P} Explanation: XREF provides a cross-reference summary of variable usage in a program. XREF requires the .PRN and .SYM files produced by MAC or RMAC for input to the program. The SYM and PRN files must have the same filename as the filename in the XREF command tail. XREF outputs a file of type .XRF. Examples: A>XREF b:MYPROG A>XREF b:MYPROG $P rriage returns from the file. Neither source nor destination drive is required to be networked, although that would be thany  time during the same edit.  To remove the from the display: type ^Kn when the  cursor is already at the marker position.  Press SPACE bar for next frame:  ***** OTHER MARKER & RELATED COMMANDS *****   The block beginning marker, ¾, and the block end marker,  ˾, are set and moved to in a similar manner; the  text between these markers can be moved (^KV), copied  (^KC), deleted (^KY), or written to a file (^KW).   ^QP moves cursor to its position before preceding command.   ^QV moves cursor to start of last find/replace, or to  source of text for last block move or copy.  Press SPACE bar to return to editing:  If this displays, you are using the wrong version of WSMSGS.OVR.  text between these markers can be moved (^KV), copied  (^KC), deleted (^KY), or written to a file (^KW).  COPYRIGHT (C) 1983, MicroPro International Corporation. All rights reserved. WordStar release 3.30 overlay file number 1. NOSEY, AREN'T YOU? Bý<>AE>x ʡ</{/:<><2/;!:: *;<6#";=Ae@ !> :=%>:=A6#J= J=~*:::O ~!:ͥ>!":*;ͮ>========!=F6#>=J=~6# Ox͡?ç=":!::! ;"@2;::?Y>͗2:2:ALe x4>!:~6)>::ͪA2'6L>2:2;:;!:’>*:*:d*:P*:P͠Ғ>2;?T?e:J= > +~<>*;++~:>>>>>ġ?#*:\A! >!:ͥ>*:ͮ>9?F#>.?J=~ O#x͡?{?> ͡?":";{2:!::: ;2 ;!2>!:ͥ>*:\A*:::_>G{ʛ?H>G>y”?ʕ? O>xF͡?w?*:\A2;WG ҙ@ʙ@ʙ@?2;:?:?:?q>2;@@@>@A?::=$@<<=͖B@9@´2:>3@N@?::)>@!:1A#oHͿ@::x :=*/;>AͿ@î@Q::@:::=@@z@z :::@:::! ZBZBZBZB*{;#"{;e*:&]>A~1APYð*A*:&:;HA]*:":*:":!*:dEA]*:":*:*9<|d":::_jA*:|*9 –B>!,<*:-,=AҵBAÙB!"{;ý0y ##ڗ##~‚ s1O~#fo":" !f6#"GW ^&! !0 W_z!^#V!gm 7  Y Y f m u ?@BHH HH <>>FFN   $' */44/77JDDHH;O<>@ABCDE2@b!b6#####*O>G }++sb <% $# ¹!4:+ Gx 07*Ów#"  * *:!3_O2*2c* q#"52 " " :!ڬ*! ^#V#~2 " ì:¸: =2 ʸ!g"*  " :!ڬ*! 4¬#4¬#4!q* * :!: * *! s#r#w>!2e!g"g: _gry 2c**:8s*ry <:%O 22c!gs#r#":&k=!:g2<!7!!, ~Ҽڼ#yʔʕ+üN+~@w~2_*~?p *#"m:c2_:_%*2c*#w#"!h"V+~2+~=& J ! P !* P ! Ͱ}2K !O)s a }2ڄ *à Gy2c!g"*^#Vxʯ zW{_¥ {_:_O*)* q#"7!g"  *^#V#N#Fy!N ~&!W ^w#4% % x ~w~wQ  6<b!W  *`.n&}2 2 }2*~2c#*:2c*DM 2*DM% 2>J kb~#q ~# ^#V! # U ! ">2!}8!* >w: O y xw2U :* G2* x!* `i:+ w: OF x>`i: O x/ F x>: OyxB"I !@ BB$$ UUUUUTUUE@@ H @I$$@ $I$IH"$$D"I HHB"!$@$ $"IH"@$H@   $BI$I"$$A@!"  DD A H!D@DD!$I$HHH@ @HI"@ vers equ '0d' ; March 11, 2017 21:36 drm "FDC3KP.ASM" ;********************************************************* ; Floppy Disk I/O module for CP/M 3.1 on KAYPRO ; Copyright (c) 1986 Douglas Miller ;********************************************************* MACLIB Z80 extrn @dph,@rdrv,@side,@trk,@sect,@dma,@dbnk,@dstat extrn @dtacb,@dircb,@scrbf,@rcnfg,@cmode extrn ?bnksl,?timot,?getdp extrn ?halloc false equ 0 true equ not false ; Ports and Constants fdc equ 010h ;floppy disk controller sysctl equ 014h ;floppy disk control bits ********************************************************* ** FDC (WD1793-02 Floppy Disk Controller) ********************************************************* FDCSTAT equ FDC+0 FDCCOMD equ FDC+0 FDCTRK equ FDC+1 FDCSEC equ FDC+2 FDCDATA equ FDC+3 dev0 equ 33 ; first drive in system ndev equ 3 ; # of drives is system LABLEN EQU 19H ; LENGTH OF Z37 DISK LABEL LABEL EQU 04H ; POSITION OF LABEL IN SECTOR 0 LABHTH EQU 05H ; START OF "HEATH EXTENSION" IN SECTOR 0 MODE2S EQU 00000001H ; DOUBLE SIDED LABDPB EQU 0DH ; START OF DPB IN SECTOR 0 LABVER EQU 00 ; LABEL VERSION NUMBER DPEH37 EQU 60H ; I.D. ;--------- Start of Code-producing Source -------------- cseg ;put only whats necessary in common memory... dw thread db dev0,ndev jmp init jmp login jmp read$fdc jmp write$fdc dw string dw dphtbl,modtbl string: DB 'KAYPRO ',0,'Floppy Disk Controller ',0,'3.10' dw vers db '$' modtbl: DB 00000000b,00000001b,01010000B,01011000B ; drive 33 kaypro,DS,ST,5" db 10000000b,00000000b,11110000b,00000000b DB 00000000b,00000001b,01010000B,01011000B ; drive 34 kaypro,DS,ST,5" db 10000000b,00000000b,11110000b,00000000b DB 00000000b,00000001b,01010000B,01011000B ; drive 35 kaypro,DS,ST,5" db 10000000b,00000000b,11110000b,00000000b motor$off: db 0 ;must be directly after MODTBL motoff: lda motor$off cpi true rz in sysctl ani 10101111b out sysctl mvi a,true sta motor$off ret dpb0: ds 17 ;disks may have labels. dpb1: ds 17 ; dpb2: ds 17 ; savNMI: ds 1 savSTK: ds 2 ds 8 rwSTK: ds 0 type$II$ext: lda @dbnk call ?bnksl lxi h,0066h mov a,m mvi m,(RET) sta savNMI lhld @dma mov a,e mov e,c mvi c,fdcdata di out fdccomd ret ;jump to appropriate routine rd4: hlt rd42: INI ; or OUTI jnz rd4 rd3: hlt rd32: INI ; or OUTI jnz rd3 rd2: hlt rd22: INI ; or OUTI jnz rd2 rd1: hlt rd12: INI ; or OUTI jnz rd1 ei hlt rd0: in fdcstat rrc jrc rd0 rlc ana d push psw mvi a,11010000b ;reset 1797 to TYPE$I status out fdccomd ; in fdcstat ; lda savNMI sta 0066h mvi a,0 call ?bnksl pop psw lspd savSTK ret thread equ $ ;must be last statement in "cseg" dseg ;put most everything in banked memory... dphtbl: dw 0,0,0,0,0,0,dpb0,csv0,alv0,@dircb,@dtacb,0ffffh d0h: db 0 ;(hash buffer bank number) dw 0,0,0,0,0,0,dpb1,csv1,alv1,@dircb,@dtacb,0ffffh d1h: db 0 dw 0,0,0,0,0,0,dpb2,csv2,alv2,@dircb,@dtacb,0ffffh d2h: db 0 csv0: ds (256)/4 ;max dir entries: 256 csv1: ds (256)/4 csv2: ds (256)/4 alv0: ds (400)/4 ;max dsk blocks: 400 alv1: ds (400)/4 alv2: ds (400)/4 ; Max DRM+1 is 256 (getdp3kp.asm) init: ; TODO: detect Kaypro 10 (only one floppy) and do not init all 3. lxi b,256*4 lxi d,d0h-2 call ?halloc lxi d,d1h-2 call ?halloc lxi d,d2h-2 call ?halloc ; IN fdcstat ; CLEAR WD-1793 from power-on (or whatever) push psw jmp setmot ; set timeout in case no more activity ; RET login: pushix ;save IX lixd @cmode inxix inxix sixd cmode ;save cmode+2 for faster access to modes xra a sta selerr ; NO SELECT ERROR (YET) bitx 7,+1 ; SHOULD WE READ TRACK 0 SECTOR 0 ? cnz physel bitx 7,+0 ; IS IT A 5.25" DISK ? jrnz login1 lda selerr ora a ; was there a select error cz physel3 ; CHECK FOR HALF TRACK: must update DPB. login1: popix lda selerr ;return error code, error during configuration. ora a ret physel: lxi h,0 ; shld @trk ; TRACK 0 shld @sect ; SECTOR 0 lhld @scrbf ;use BIOS scratch buffer to read Z37 label. shld @dma ;we must also make sure that bank 0 is selected. xra a sta @dbnk ;set disk bank=0 (the bank we're in now) sta @side ;side=0 STA MODFLG ; RESET CHANGED MODE FLAG mvi a,true ; flag a select operation sta selop MVI A,5 ; 5 RETRYS FOR A SELECT OPERATION STA RETRYS CALL READ ; TRY READING LABEL AT DENSITY ; CURRENTLY INDICATED IN TABLES JZ PHYSEL1 ; BR IF SUCCESSFUL bitx 7,+0 jnz physel6 ; if 8" error out MVI A,5 ; RESET RETRYS TO 5 STA RETRYS STA MODFLG ; SET CHANGED MODE FLAG ; IX=mode bytes ldx a,+1 ; TRY OTHER DENSITY XRI 00010000b stx a,+1 CALL READ ; TRY TO READ LABEL jrz physel1 ldx a,+1 xri 00010000b ; return mode bytes to former state stx a,+1 jmp physel6 ; jmp to error PHYSEL1:XRA A ; ZERO ACCUM. MVI B,LABLEN ; GET LENGTH OF LABEL lhld @scrbf LXI d,LABEL dad d CHKLAB1:ADD M INX H DJNZ CHKLAB1 INR A JRZ PHYSEL2 ; BR IF CORRECT CHECKSUM LDA MODFLG ORA A ; MODE BEEN CHANGED ? jz physel7 ; NO KEEPING OLD MODE BYTES ldx a,+1 xri 00010000b ; return mode bytes to former state stx a,+1 jmp physel6 ; jmp to error ; ; EXTRACT MODE INFORMATION FROM LABEL ; physel2: lhld @scrbf lxi d,LABHTH dad d ; HL POINTS TO HEATH EXTENSION IN LABEL ldx b,-1 ; keep old format ldx c,-2 mvix 0,-1 mvix 0,-2 mov a,m ani 111$00000b cpi 001$00000b ; z100 formats jrnz nf1 setx 5,-1; ; set mode byte jr setmode nf1: cpi 011$00000b ; z37 jrnz nf2 bit 2,m ; check for extended density jrz gf1 setx 4,-1 ; z37x jr setmode gf1: liyd @scrbf ; get cpm sectors per physical sector ldy a,+labhth+2 cpi 4 ; see if 512 byte sectors - if so set to z100 jrnz gf0 ; this is in here because the Z100 puts the setx 5,-1 ; device type code in the label on 5" jr setmode gf0: setx 3,-1 ; z37 jr setmode ;; currently no 8" support in this module nf2: ; cpi 100$00000b ; z47 ; jrnz nf3 ; bit 2,m ; check for extended density ; jrz gf2 ; setx 6,-1 ; z47x ; jr setmode ;gf2: setx 5,-1 ; jr setmode nf3: ; cpi 110$00000b ; z67 ; jrz f1 ; keep old mode if device type not valid stx b,-1 stx c,-2 jmp physel7 ;f1: setx 7,-1 ; z67 setmode: mov a,m ; get flag byte bit 3,a ; track density bit jrz gs0 setx 5,+0 ; set drive and media to dt setx 5,+1 jr gs2 gs0: resx 5,+0 resx 5,+1 gs2: bit 1,a ; density bit jrz gs1 setx 4,+1 jr gs3 gs1: resx 4,+1 gs3: bit 0,a ; sides bit jrz gs4 setx 6,+1 jr gs6 gs4: resx 6,+1 gs6: lhld @cmode call ?getdp ; setup mode bytes jnz physel6 ; error if format doesnt exists liyd @dph ; set dpb addr in dph sty c,+0 ; store XLAT address in DPH sty b,+1 ldy l,+12 ; get DPB address in DPH ldy h,+13 xchg lhld @scrbf lxi b,labdpb dad b lxi b,15 ldir ; move dpb xchg ; hl points to psh byte (15) liyd @scrbf ldy a,+labhth+2 mov b,a ; save CP/M sectors per physical sector mvi c,0 pshlp srlr a ; rolate LSB into [cy] jc psh1 inr c jr pshlp psh1 mov m,c ; set PSH byte inx h ; mode pointer to PSM dcr b mov m,b ; put in dpb JR PHYSEL7 PHYSEL6:MVI A,1 STA SELERR ; FLAG A SELECT ERROR PHYSEL7: call done ; setup motor turn-off lxi h,selop mvi m,false ; SELECT OPERATION IS OVER ret PHYSEL3: CALL SELECT JRC PHYSEL6 ; ERROR IF NOT READY CALL HOME ;RESTORE HEAD TO TRACK 0 JRC PHYSEL6 MVI B,01001000B ;STEP IN, NO UPDATE CALL TYPE$I CALL TYPE$I ;STEP IN TWICE call read$addr ; READ ADDRESS lda @dstat ANI 00011000B SHL 1 ;check for FDC error. JRNZ PHYSEL6 in fdcsec ;track number, from read-addr CPI 2 JRZ PHYSEL4 CPI 1 JRNZ PHYSEL6 lhld cmode setb 5,m ;make drive "DT" inx h bit 5,m ;test for 40 track already jz physel4 res 5,m ;make disk "ST" and reconfigure mvi a,0ffh sta @rcnfg ;set "re-configure" flag so BIOS will get new DPB/XLAT PHYSEL4: CALL HOME JRC PHYSEL6 JR PHYSEL7 setup$rw: MVI A,21 ; 21 RETRYS FOR A READ/WRITE OPERATION STA RETRYS lhld @cmode inx h inx h shld cmode ret read$fdc: call setup$rw READ: CALL ACCESS$R ; START DRIVE AND STEP TO PROPER TRACK JRC ERROR lxi d,10011111$10001000B ; status mask + read command JR TYPE$II error: xra a ; [NZ] to indicate error inr a done: push psw lda selop ora a jrnz retrn mvi a,false ;motor off false sta motor$off setmot: lxi d,motoff mvi c,15 ;15 seconds mvi b,dev0 ;I.D. call ?timot retrn: pop psw ret write$fdc: call setup$rw WRITE: LHLD CMODE ; CHECK FOR HALF TRACK R/O bit 5,m ;see if drive is DT. jrz ht0 inx h bit 5,m ;see if media is not DT. jrz ERROR ; R/O ERROR ht0: CALL ACCESS$R ; ACCESS DRIVE FOR WRITE JRC ERROR in fdcstat sta @dstat ; save DISK STATUS BYTE ani 01000000b ; WRITE PROTECT BIT jrnz ERROR ; WRITE PROTECT ERROR lxi d,11111111$10101000B ; status mask + write command TYPE$II: lhld cmode inx h mov a,m ani 1 ;sector offset lxi h,@sect ; GET SECTOR NUMBER add m ;others use sectors 1-n OUT fdcsec ; give to controller RETRY: PUSH d ; save registers CALL TYPE$II$COM ; execute disk transfer routine. STA @dstat ; save status of transfer XRA A ; CLEAR CARRY FOR DSBC lded @dma DSBC D ; HL NOW CONTAINS # OF BYTES TRANSFERRED LDA @dstat ; check for successful transfer ANI 11111111B ; WP is 0 for any read command. JRNZ IOERR ; RETRY IF ERROR LDA SELOP ; IS THIS A SELECT OPERATION ? ORA A jrnz POPRET ; THEN DON'T CHECK SECTOR SIZE LDA BLCODE ; CHECK IF CORRECT NUMBER OF BYTES TRANSFERRED CPI 3 JRNZ NOTED ; BLCODE=3 => 1024 BYTE SECTOR EXPECTED INR A ; INCREMENT BECAUSE (H) FOR 1024 IS 4 NOTED: CMP H ; COMPARE TO EXPECTED SIZE POPRET: POP d mvi a,0 ;signal "no error" to BDOS. jrz done ; RETURN IF CORRECT JR TRYAGN ; RETRY IF INCORRECT IOERR: POP B JM ERROR ; ERROR IF NO READY SIGNAL TRYAGN: LXI H,RETRYS ; decrement retry count DCR M JZ ERROR ; NO MORE RETRIES MOV A,M CPI 10 JNC RETRY ; LESS THAN TEN RETRYS LEFT => STEP HEAD LDA SELOP ORA A jnz RETRY ; DO NOT STEP HEAD IF SELECT OPERATION PUSH d ; SAVE REGISTERS CALL STEPIN ; STEP IN COMMAND CALL SEEK ; SEEK WILL REPOSITION HEAD POP d JMP RETRY ; TRY AGAIN rtbl: db 128 ;128 bytes dw rd1 db 0 ;256 bytes dw rd1 db 0 ;512 bytes dw rd2 db 0 ;1024 bytes dw rd4 type$II$com: ;command in E mov a,e ani 00100000b ; 1 if write rlc! rlc! rlc ; 0000000w ori 0a2h ;A2/A3 for INI/OUTI sta rd12+1 sta rd22+1 sta rd32+1 sta rd42+1 call setside sspd savSTK ; lxi sp,rwSTK ; lda blcode mov c,a add a ; *2 add c ; *3 lxi h,rtbl mov c,a mvi b,0 dad b mov b,m inx h mov c,m inx h mov h,m mov l,c push h jmp type$II$ext SELECT: mvi c,0 mvi b,dev0 call ?timot ;clear any pending "motor off" LDA @rdrv ; get the RELATIVE drive number MOV C,A ; relative drive number in (C) (rel. to driv0) lhld cmode INX H ; POINT TO MODE BYTE 2 inr a ; 1,2,3,4 cma ; 111111xx ani 00000011b ; 2,1,0,3 bit 4,m ;single density ? jrnz se1 ori 00100000b ;select single density data rate. se1: ori 00010000b ;motor on, also mov e,a di in sysctl ; ani 10011100b ora e ; out sysctl ; ei dcx h MOV A,M ANI 00001100B ; setup steprate bits for seek-restore commands rrc rrc STA STEPRA ; RATE FOR SUBSEQUENT SEEK/RESTORE LXI H,LOGDSK ; save position (track) of current drive MOV E,M ; in 'trks' array addressed by contents of MOV M,C ; location 'logdsk'. MVI B,0 MOV D,B LXI H,TRKS DAD D IN fdctrk MOV M,A ; SAVE CURRENT TRACK # LXI H,TRKS ; identify position (track) of requested drive DAD B ; from 'trks' array addressed by new 'logdsk'. MOV A,M OUT fdctrk ; set track number mov a,c sub e ;same drive as last time? sui 1 ! sbb a ;.true. if same drive cma di lxi h,motor$off ;if diff. drive, must check ready. ora m ;if same but motor off, must check ready. mvi m,true ;this prevents the motor from being turned off sta mtflg ; test drive for ready. cma ! ora a ;[NC] jrnz fb3 ;[NZ] if motor still on. ; mvi a,11010000b out fdccomd in fdcstat mvi b,10 ;must be ready within 10 rev. fb1: call find$NE lxi d,IP$count fb2: in fdcstat ani 00000010b jrnz got$IP dcx d mov a,e ora d jrnz fb2 djnz fb1 stc fb3: ei ret IP$count equ 17250 ; 200mS +10%, timed to "fb2" loop got$IP: xra a ei ret find$NE: in fdcstat ani 00000010b mov c,a mvi h,4 ;wait even longer... (3.67 sec) fb00: lxi d,0 ;wait a long time for any edge fb01: in fdcstat ani 00000010b cmp c jrnz got$edge dcx d mov a,e ora d jrnz fb01 dcr h jrnz fb00 pop d ;discard address from "fb1" loop stc ei ret got$edge ora a rz mov c,a ;if not NE, go find another jr fb00 ACCESS$R: lhld @dph lxi d,12 dad d mvi a,15 ;PSH add m mov e,a inx h mvi a,0 adc m mov d,a ldax d sta blcode ;get physical sector size lhld cmode mov c,m ; mode byte 2 inx h mov a,m ; mode byte 3 cma ; get "NOT MDT... ana c ; ... AND DDT" ani 00100000b ; flag is in bit 5 sta htflag ; half track flag CALL SELECT rc SEEK: lda @trk ora a ;see if we're on physical track 0 jrnz xf0 lhld cmode lda @side ora a ;see which side we're on. jrnz xf1 bit 0,m ;check TRK-0,SID-0 density bit. jrz xf0 xra a sta blcode ;select 128 bytes/sector di in sysctl ani 10111111b ori 00100000b ;select SD media out sysctl ei jr xf0 xf1: bit 1,m ;check TRK-0,SID-1 format (may be 256 bytes/sector) jrz xf0 mvi a,1 sta blcode ;select 256 bytes/sector ;leave DD as is. xf0: LXI H,SEKERR ; initialize seek error counters MVI M,4 ; 4 ERRORS ON SEEK IS FATAL INX H MVI M,10 ; RESTORE once, then 9 errors are fatal call setside lda @trk mov c,a RETRS: MOV A,C ; get track number back ORA A ; FORCES "RESTORE" IF "seek to track 0" jz HOME ;RESTORE HEAD TO TRACK 0 lda htflag mov h,a ; get half-track flag in h INzÇvýv}vÑy]ya !.; ?delete? rename? New name? copy from? copy to ? *w vh%:=5!78:=508$02=526%:=5!77!6@*Ͷ$:626'%7$!75f#ͶvQv@_#~:w#Ͷwv>;͂y{þ6!4͂$'%Qw!z~Nw4w#Ewz~#$O*&+1*D5"6"6*6͘!ͫ${#Ͷ$~@xy:6GxTxTxMy=wҹw$9nw$8nwywoxwEnwyw!6w8nw>܍&w8nwy>xoxxEnw>x8$I' !1x#~>xEnwͫ$}!&Đ)8~gx#[x$8nw!06ͭx:6ʑx!ͭx!ͭx!7ͭx:%6ʩx!;ͭx:4!;ĭx# ͔8éxկ x=yxy.x#y xͶ7!yy y!yy>  y~,y#.:*? пͶ#~+:Xy~?Q?@##*w"v9w$v]y͂y!6 6+:%6!4!6ʬz*w&v9w(vʕy'z͂y>2zGOyy*763yx2)6vcLv:2,:2]1%24:6«v 8͍y?%÷v8͓yyI'EvvQyv7v2626:&2C5:B5͐)K-EhNw:6wͥ!4~6-ww!% E!2v! h%!7:72w!7 swI'͌wswQw!7H*7yCJͦE!7xEKJ`Jy’J`J!"6!7gH*7wC͎Iҡw`Jv:%67-%$ 8.| I':&6:%67-ÿw8w8>25G*$6|!8z:%6z%:=5x!8ͫ$:626̅$!4/x,v2,]1'%$*&+1*D5"6"6*6͘!ͫ${#+w#Ͷ$~ʌxͻxڠxʃx1yڠxGͶ xxGMxͫ$}!&Đ)8~ʳx#çx$8Jxկ x1yxx.x#x xͶ7y y xyy>  y~ y#.:*? пͶ#~+:Ly~?Q?@##%:%6%zfy$8uy:%6z҈y$8.| I':%6xy$.v͓y.0v!4:4̩y*$~ʿy ʿy.#yìy6.#7 yw# y+~.y#6*vy!y#~$I' *7*7d!'͠?!(8",6!C7)z!; ͔7?x JvQvWv4EDBACKUP$$$BAKNEW FILE:x/25bv͒v͡vKw]1:4:O2J5>,w:j2M52K5:3!kڈv~<2O5>24!@>2%!v!͒ʾv!v!͒v!8",6Ç-!@!6@22(2+2=K-*7""7*7*7d|<2626|D!"6>26!w)"6(w26!5wȷ! @>2 !m:%6!4̬!~ͪxw:,ywͪxw:ʅw>26C7 !v!~7!v !:4=w!%5!7!4M:6w6 #:@!4M!4~M:4= x!5%:6>܍&> č&>܍&>7x2Bx26v?%!v!:5,w:&2B5:C5͐)͠):%6ĕxsx!8",6:=5=?*,6!N!>5”x5!p8",6;! ͔7?دɛ{ vcvtv:%/Wͳv̇v!ʂ|k͵LzWLj!7H*7:%x̢G1!jnvͳvnv,v!ʂvk͇v:%ʤv:G2Häv&w͆xI'͵k:%ƒwCÐvnv!Dk!Dk&w7v*7*7dv!U*͠> ܍&10MGI'W ixg"6!7G*7*7w# w"7zwCCv!"6Uw!vk:>wnv>͍&:%|z!H:G6w:%nw*"|> č&}> ԍ&:>č&:>͍&͉wÐv*h*7͠ҥx:{®wïw͠ҥxzWx|¦wwzwww:ILx={xڦwwLxæw{xæw!D:I7ȷ:I=4xLx;x:Go&A> zxx1x{(x;x>2IxwÏw{xA%xQx*7#"7{>2IwC>z:I={xLxnxæwgo2D2I#C>2D>2D2I*G&"h|2{| xx+!Df:Io=Lx{x}2I|2D"h>2{*G|g*GͣR8͵L̓V*G"G2A"E`i"B2?<2I2DLy:&ogyy&"GDynxzyz=y͈zz$y"ELy*EDy*G&[zv{ʨ{zyTyv{[z}{qy33"E!yKâz͚zځ{Šynx͚zڛ{ʕ{*G"+:&g$o"G2D2Iz*+"G7z|Ҙy˜y:&y+Lxy[z:Gg:HG{|yDM v{{my"E:G&oA:HzyGw{>2DmymyTywC'LyG;xQ'LQz*LNzwCy͈zz |z |z͈zGx*B}”z7+"BxwCKz!Azʾz z6 6Úz6GͿz>xɯx z#z+:D2IG{x G{ #|z͝x+z:D1{||z:G){|z>2D7=|z>2D:H|z|z){> z`{e{}J{W{# }e{ Gx*EâGâGwC>ZD> ZD!Þ{wC'LwC:&{y  ¶{ v{:H{|yJ{o|{{%{E{8pw{8{ ×vÞv(wz#9IWWFIND? REPLACE WITH? OPTIONS? (? FOR HELP) *** NOT FOUND: "REPLACE (Y/N):  ???R5"2äv2>25O͂$'%v$!R5f#25yv>,}v$!r5f#25>)}ͫ$*D5!5 @>2525:5w͘!v!5 f#Fyv͉!(kUw.(!(k25:5Kw:5Uw>dxUw:BUw^x:5hw:5̘kĞk*5"5uxI'wҋw*5|!v!v÷&:5 x*5|ʞw+"5:5!(k:5»w:5^xqw:5qw>dxqw}:5JÃJ+1!CywxxwCI'ww:5̞kĘk7;!:5Wxx+x:5:B*7wwCh:5*7wC*7!r5ͤx*7͝G:5:q5dxW /KwC*7*7͠~wC!R5C:5ŠxͤxÜxͤx>+wx+w#y25~xºx>  > x # èx+p#:5K?wC! v"6Ͳ0ͤ'/y! y#~:5 y:5 y>dx!H5 7*7~ -% *6͘!3%=yͫ!͘!yI' Ͷ#Gyy?gy$77!|vy>25#‚y>25#”y>25:525#Ÿy25#«y>25> }"v$v$7+~#bk))y0_y"5y!:5z!7z*7(zwC!7z*7MzzH:B {zȮ>{~>z~>ɛwvvvv%v7vÅvÖvͷKK4v(vC[gL*LJv=v#D*P:6O~`lvyͪ`lvlv Wv~~wyͪ`‚vDM26PjͷKKhÈv:p*K5͒iڰv*O5+++mڳv*M5"K52p!ւ-kH)*6"6!6ð!\ev!e"6>26!"6:6*:vXK/w!ڂ|k*ͷK/ww[g!΂ e>267ɯ2{Ͷww3w{Ͷw*w7?@wͤw{uwͶwwʃwͤw>2ͶwwpwE7:7ͶwSʚwDwͶw-7+ڂL"#{ʼwI'K? | ڼw7*wɾ#45wɛy6BwXwgwÁwxCxwwwwwwÛxxwwx9s{IQ0 ENTER space OR NEW LINE SPACING (1-9): LEFT MARGIN COLUMN NUMBERumn)? (ESCAPE for cursor col RIGHT For decimal tab stop enter "#" and decimal point column  SETJUMNF TAB AT COL CLEAR./; A for all)? =*2L&bj «=$Bv1< 2$!6~6dw6H)!5Dvͦw2M52K5<<<2O5===!K5w!M5wsyH)=xʸw*"|}w>w<>!w!ð!ð!ð!ð! Ͱ+1!!H)ð:"!#w!48",6!%wHv!5xyͩw_z#/xXxXxH)y!54@zxJv!5Azy4xͩw_{w!54wsx)))){/w!4+ʒx~ʁx’x{244H)k yx+C!ނ-k0y**M5d*O5*|x͕_}x!ނ|k> ZD-x!ڂ|kk y y+wC-y:qw:=͋wH)xͷK*s"lͿ7(ly *"sͷK*s":s_lͿ(lCy;y!*x#/x-Vx;yzy'%ͫ$f#Gy¨yͶ#ʦy!¨yW#Ͷ7yyͶ{|y|y~:0#bk))wy{&1wzYzSPELSTAROVRSTARINDXOVR%3 COMMAND? WHAT???   NOT FOUND  Enter the name of the program you wish to Run,  optionally followed by appropriate arguments.  Example (shows disk space): STAT check / add to dictionary? Index? 24:%6Cw!8",6g-̓͠!8?w26̓1!с!@ !!8?wE>1:2!M!"~2!tE":4zaz!:v7z'%4vͫ$!{?6yy> 6y 6y~Hy#.: пկ YyͰy y~y.vy#~yx͜yʑy ~y͜yŠy>  ’y~ͧy#*?HyͶ#~+:y~?Q?@##~#fo"d{#d"f{z*zzo*z4zg*f{s#r+|z~w#+|y*d{F#"d{xG z8%:=5͹$:626ͅ$'%$2v>245w24%~!#v z>/͍&E!77z!4{'%>vͫ$!{:f#Ͷ~Syz6vÖzz8vÖzE!{x>245w%~!v {>/͍&E!87z!4{'%21Îyʈ 7*>212͟E:E1!͢È!~"*!`͏!!͏!"ÔG:x~# ×^#V+~#ʸÀé!ͩéO> π2>*_yN#!5x>4!E!E!E!! ͢͢!͢ɀ8d Hit any key to return to WordStar: Replace diskette with file , hit any key: *** file  still not found *** *** file  bad (too big ??!@&*) *** *** file  bad (too short) *** ***  found is bad or incompatible version *** ^C Cannot return to WordStar. Replace system disk (if removed), Hit any key to return to Operating System: Hit any key to return to Operating System: iz(vv:6:%6W6g2>uv:%6uv!&6~6Cv:$6]1 >2:%:6]v8!4*8w>2:2&6/2:2$6:6NzC!:@4!%;!4:$6ʮv/x8ôv/x8:6ĥwv+~!8v",64v~#v!4~v]1!9"gz$8:6<26x:6͌!Ͷ$=͌!8!4ͺw/x,8w:5w?w(x!%58y"3;w!+5*8y"5;w!15.8:$6y"7;wx8!4:̺w 8#ͺw#:4/"8̺ww$8$I'!; ͔7?$ xwN!w#+wAxw#~xp*gz xw>;!x#~$7I' ?:62626:626̅$'%$O*&+1*D5"6"6*6͘!ͫ${#Ͷ$+w#~xUyxxMyxyʾxyQxxʾx8$I' !ʷx#~Qxͫ$}!&Đ)8~x#x$8Qxx$9Qx$8Qx!;;y!06;y!W6;y!i7;y:67y!;y!;y!7;y# ͔87yկ [yyڍy͑y.xy#͑y ʍyͶ7ͯyʤy ‘yͯyy>  ¥y~ͺy#.:*? пͶ#~+:y~?Q?@##$*D5&͘!bkͫ$f#Ͷ)zͶzyͶ$7ȷ~:0#bk))Jz_Jz,z!*7*7d!'͠?!&8",6kp ÖMIZ"&,48PAGE\ LINE\FC= FL= COL\MAR\RELINSERT\ONdecimalLINE\SPACING\cFG?ALʡCڤC*7m"7`i͟LiL͉D*7mF*7 "7"7iL~GÞC*7"7dDͫL C   QDCGÞC|ÞC*7m"7F`iDͫL W W >D FD zLQD*D~GD G*7w#"7+͟D`iD͟L'D͉DrD*7"7ãD2xʽ0:y*7d:"/̫ED|D D D#D*7+ m!"""͏Fxʽ0 k%dEExʽ0  ^E 0E Exʽ0  Eg*#"*#":"QE*͠YE> ͖ED>͖EnED:yĽED*͈Es#r!"*#"*&)*g:"2l|bk+_:**:"EͫE!EE!Et%EELHCFPLXFMT^FMBdFCPFPA F% nE> ͖E*#"% E>͖EFnE;%E% E**#͠FE;%EE%g}2 ÀF! gF!gF!;%EE%yW{͇F͟F|EO: & !Q *** d|F`h: /<_F Fi`" 2xG  GG F9GOGF:"G9GOG"GF:O`G*+":yGG9G>2!454k%*+"*+"͈E͍"*7dA|#O zG fGxͬ&>26!7YH**6͠H"6!7YHHHd*6͠6H"6*6͠DH"6*=7*=dH`i)\fH!7#͠+HͶHͩHnH!7͠H++++ÂH!7H ͩHҚH####7͠H++͉s#r+##s#r++H͉#r+s +r+s!7͉m.II>܇I I:6GO I+I IbI͎I>eI1I!64F!6II=O:6=G͎IbI WI*7+:V7!W~zI6!-kwC*7#iI*6*7d*7͠**6͠ҸIͽIͦ*6#"6"7*7JI:@7W~zCJI*6*7͠J*6HH͠J:J*6HH͠7-Jͽ:Jͦ*6+"6J"7:G+~# OJ> XJJ͒H.I?K*6!72KÒJJ`J!7K*7ͫJJڡJ2@7"7 •JbI}77:73~J#J7>J>:!77:7`JI!7K*7}:bI"7 JbI.I*6͒H͠DK*6)$$EK=KO>ͬ&gH͒H͠TK)|Lɯ2 'M:WnKwC}K*72 /2 *7ڇK*7m:WʭK:­K*|ʰKPY͠ڬKDMɯ2WH*72 ͷKxK~# ! ~6K2 *7*7mx‚LcJ\Kx7*7ɯ2 'M*7L*7m>2 *7LLx4L+~ ! ~6RL=2 !7͉mx‚LJLx7͵L͟LͫLyLnL    7L?L L ɯo>g>_:mCW o g _ Wz}|{ L*7͠*7͠>ͬ&LLL M*7M*7}o|g_P}!\M͵L0M{fM>Ĭ&zʅM*7*7d͠[M̓JBM*7>ÎM<>Ĭ&*7*7d҅͠MJlM*7z7>2 }:2!uCڢM~=26=26ڳM~26=26``i"R "T͏F>26Ç-N*6<͠N:6N!6~6̭N /c N:6*6*67LN2626^N'* .4NyN!fx N*6"6"6"6y26x26:6!6[N26-ʂ͵LL-k:=5ڥNͤ'9%:6> 0Ͳ026W %͂0͉͹$:626ɯ2626:=5͉!$88'L KwCKʻNNN! |  7N!6~6ʐO͞P+O`i+~+++O6! ^#V{\Oʹ`?G1G:6EO>JOx=`͍RckL7>~͌`P̓QҜO*R~~O͞_PlO` ʜO_wQ~O͞P+O~QPͰP+OP΂P{<[g҂P{[gւP{gW 2l:K5!‚-kͯEO!|k*TDM͵kwC|k2K5:l~QÜO͵L :6``i"P͵L̓V:%26*&" "":(2:|6@P̓1 W :`b^:W!|k2WLP2$!6~6/W |Pͫ! ͘!:6=ʋP͗PڒP7ԗPH)!65mmͣRoR7ȷ͂^P͞P:ͪ`P!6s^wQðP>P:6`2&:W!tC)Q! 45P͙RP=6++++!tCP/Q! ~Q͙R!tC)Q Q QLP͵LcUlQ̓V͆L_QI`ͺ_yR:Qzbg 整yR͍RzWLI`L:6=ÀQ>`! ʖQ~wçQ ʡQ~§QͶQêQ͍RoRQLP͵LoR̓V ͍RoRiRz9R iR iR͆LSQI` R̓V͆LRͩ^yR͍RSQoRiRQyRQ hR͆L.RiR͎^SQRI` IRiR TR WL͍RoRIRiRLùQ:6!͵LzWL:<2I`:=ÕRLP*pC!&####:S~ʰR°R###~R+++Rzͪ`R~ʰRR+~G+++Rx:S~:S~:S~Sz!tC:S++++~:S:SDMz!sC:S!uC:S226LP7JS>2? T mS> GSbX:hYS‰S: 'TSBS:!I5”SSGS| S: S>^BSSS@BS^VʯS@GSôS*h#"h*E+"E*h+"h!TSS'T>T>͂ST> }T>~!kU: 1T: 1Tɯ2 :Wz2%*h:?JT+"&:k2(>2=:>T:U+zT*7M*7wT*7M*7*-wTzU*7:wTzU*0͠UU*h͠UUjVM*7+++++{TTU}~+TU!H5! F6BSOx2 y>2VL*LԌU2VLL͢Ux̿U+~  U#x̿U+~ # +åU>*L#:hG:?!:US#~\V*0}=V#6{="V=2>2;!k:22[\V:=2;2VW*-p#"-w#>2@[\V#54+U:i\V*0*h͠UGxG"026=2/*+ ÃV!"h9"+!W~ʚV6>2VLz2]>2\:22!:#:% 2j fdctrk ;CURRENT HEAD POSITION, SUB C ;SEE HOW FAR WE WANT TO GO. RZ ;IF ZERO TRACKS TO STEP, WERE FINISHED MVI B,01111000B ;ASSUME STEP-OUT + UPDATE + HEADLOAD JRNC STOUT ;ASSUMPTION WAS CORRECT... MVI B,01011000B ;ELSE MUST BE STEP-IN NEG ;AND NUMBER OF TRACKS WOULD BE NEGATIVE STOUT: MOV L,A ;COUNTER FOR STEPING SEEK5: BIT 5,H ; CHECK FOR 48 TPI DISK IN 96 TPI DRIVE JRZ NOTHT RES 4,B ;SELECT NO-UPDATE CALL TYPE$I ;STEP HEAD ANI 00000100B SHL 1 ;DID THIS STEP PUT US AT TRACK 0 ? JRNZ TRK0ERR SETB 4,B ;SELECT UPDATE TO TRACK-REG notht: CALL TYPE$I ;STEP HEAD ANI 00000100B SHL 1 ;DID THIS STEP PUT US AT TRACK 0 ? JRNZ TRK0ERR DCR L JRNZ SEEK5 IN fdcsec ;SAVE CURRENT SECTOR NUMBER MOV L,A CALL READ$ADDR ; GET ACTUAL TRACK UNDER HEAD (IN SECTOR REG) in fdcsec ;GET TRACK NUMBER FROM MEDIA MOV H,A MOV A,L OUT fdcsec ;RESTORE SECTOR NUMBER LDA @dstat ;GET TRUE ERROR STATUS OF READ-ADDRESS RLC RC ;DRIVE NOT READY ANI 00011000B SHL 1 ; CRC ERROR + REC-NOT-FOUND MOV A,H ; ACTUAL TRACK FROM READ-ADDRESS LXI H,SEKERR ;POINT TO ERROR COUNTERS JRNZ RESTR0 CMP C ; (C) MUST STILL BE VALID DEST. TRACK RZ ;NO ERRORS RTS00: DCR M ; SHOULD WE KEEP TRYING ? STC RZ ;NO, WE'VE TRYED TOO MUCH OUT fdctrk ; re-define head position accordingly JR RETRS ; RETRY SEEK TRK0ERR: XRA A LXI H,SEKERR JR RTS00 RESTR0: INX H ; RESTORE ERROR COUNT DCR M STC RZ ; If count 0, return with Carry set. MOV A,M CPI 9 JRNC RESTR1 ; RESTORE ONLY FIRST TIME CALL STEPIN ; OTHERWISE STEP HEAD IN 1 TRACK JR RETRS RESTR1: ; RESTORE HEAD TO TRACK 0 MVI A,00000011B STA STEPRA ; RETRY WITH MAXIMUM STEP RATE CALL HOME JR RETRS ; RETRY SEEK STEPIN: lda htflag ora a ; CHECK HALF TRACK mode MVI B,01001000B ; STEP IN WITHOUT UPDATE CNZ TYPE$I ; STEP A SECOND TIME (W/O UPDATE) FOR HALF-TRK MVI B,01011000B ; STEP IN AND UPDATE TRACK REGISTER JR TYPE$I HOME: ;POSITION HEAD AT TRACK ZERO... mvi a,11010000b ;force TYPE$I status out fdccomd in fdcstat ANI 00000100B ;TEST TRACK ZERO SENSOR, JRNZ @TRK0 ;SKIP ROUTINE IF WE'RE ALREADY AT TRACK 0. IN fdctrk ;DOES THE SYSTEM THINK WE'RE AT TRACK 0 ?? ORA A JRNZ HOME1 ;IF IT DOESN'T, ITS PROBEBLY ALRIGHT TO GIVE "RESTORE" MVI L,6 ;(6 TRKS) ;ELSE WE COULD BE IN "NEGATIVE TRACKS" SO... MVI B,01001000B ;WE MUST STEP-IN A FEW TRACKS, LOOKING FOR THE HOME0: CALL TYPE$I ;TRACK ZERO SIGNAL. ANI 00000100B SHL 1 ;"SHL 1" BECAUSE TYPE$I DOES AN "RLC" JRNZ @TRK0 DCR L JRNZ HOME0 HOME1: MVI B,00001000B ;RESTORE COMMAND, WITH HEADLOAD CALL TYPE$I XRI 00000100B SHL 1 ;TEST TRACK-0 SIGNAL RAR RAR RAR RAR ;[CY] = 1 IF NOT AT TRACK 0 @TRK0: MVI A,0 OUT fdctrk ;MAKE SURE EVERYONE KNOWS WERE AT TRACK 0 RET ; READ$ADDR: mvi a,11000100B ; READ-ADDRESS COMMAND WITH SETTLE DELAY jr PUT$I TYPE$I: LDA STEPRA ; STEP-RATE BITS ORA B ; MERGE COMMAND PUT$I: OUT fdccomd ; SEND command TO CONTROLLER WB: IN fdcstat ; WAIT FOR BUSY SIGNAL RAR ; TO COME UP JRNC WB WNB: IN fdcstat ; poll controller for function-complete RAR ; Busy? JRC WNB ; wait until not busy. RAL STA @dstat ;SAVE TYPE II (III) STATUS FOR ERROR DETECTION. MVI A,11010000B ;TERMINATE COMMAND (RESET STATUS TO TYPE 1) OUT fdccomd IN fdcdata ; in fdcstat ; rlc ret setside: lda @side xri 00000001b rlc ! rlc mov c,a di in sysctl ani 10111011b ora c out sysctl ei ret STEPRA DB 0 ; STEP RATE CODE RETRYS DB 0 SEKERR DB 0,0 ; SEEK,RESTORE ERROR COUNTS CMODE DW 0 ; POINTER TO MODE BYTE LOGDSK DB 2 ; CURRENT DRIVE SELECTED BY THIS MODULE BLCODE DB 0 SELERR: DB 0 SELOP: DB false MODFLG: DB 0 TRKS: DB 255,255,0 htflag: db 0 mtflg: db 0 END bank for disk DMA operations @pspt: ds 1 @tps: ds 2 @rcnfg: ds 1 trk: ds 2 sect: ds 2 @dtacb: dw dtacb1 @dircb: dw dircb1 dircb1: db 0ffh ;drive db 0,0,0,0,0 dw 0,0,2100h ;directly after CCP image (max 8K CCP) db 0 dw dircb2 dircb2: a @min sta timemin lda @sec sta timesec lhld @date lxi d,365 mvi a,28 sta mondays+1 ;set february=28 mvi b,0 ;start counting years since 1978 ti6: mov a,b ; check for leap year ani 11b ;every 4 years, xri 10b ;starting with 1980 jrnz ti7 stc ;one extra day for leap years ti7: dsbc d ;does this year fit in @date? inr b ;count a year. jrnc ti6 ;yes, keep taking out more days (by years) mov a,b ;is this year a leap year? ani 11b xri 10b jrnz ti8 mvi a,29 sta mondays+1 ;February=29 stc ti8: dadc d ;normalize @date (we subtracted one too many) dcr b mov a,b adi 78 ;adjust year to 1900 mvi b,19 ;century cpi 100 jrc ti8@0 inr b sui 100 ti8@0: call binbcd sta timeyrs mov a,b call binbcd sta timecnt xchg ;remainder into DE mvi b,1 ;start taking out months. lxi h,mondays ti9: mov a,e sub m mov c,a mov a,d sbi 0 jrc ti10 mov e,c mov d,a inx h inr b mov a,b cpi 13 jrc ti9 ti10: mov a,b call binbcd sta timemon sta lstmnth ;also set last accessed month mov a,e ;left-over must be date of month call binbcd sta timedat ; set day-of-week using Zeller's congruence: lda timeyrs ;E=([2.6m-.2]+K+D+[D/4]+[C/4]-2C) mod 7 call bcdbin ;0=sunday mov d,a lda timemon call bcdbin mov b,d sui 2 jrz ti11 jrnc ti12 ti11: adi 12 dcr b ti12: mov c,a add a add c ;*3 add a add a ;*12 add c ;*13 dcr a mvi c,0 ti13: inr c sui 5 jrnc ti13 dcr c lda timedat push b call bcdbin pop b add c ;[2.6m-.2]+K add b ;+D srlr b srlr b ; [D/4] add b ;+[D/4] mov c,a lda timecnt ;century call bcdbin mov b,a slar b ; 2*C srlr a ;; srlr a ; [C/4] add c ;+[C/4] sub b ;-2*C mov c,a jp ti14 neg ti14: mvi b,0 ti15: inr b sui 7 jrz ti16 jrnc ti15 bit 7,c jrnz ti16 dcr b ti16: mov a,b add a add b ;*3 add a add b ;*7 bit 7,c jrz ti17 neg ti17: mov b,a mov a,c sub b inr a sta timeday mvi a,clrcnt ; out rtcadr ; mvi a,00000011b ;reset fractional seconds out rtcdta ;we now have one second to set time mvi d,numrtc lxi h,time lxi b,rtcadr+(rtcsec shl 8) ti18: outp b ;select reg inr b mov a,m out rtcdta inx h dcr d jrnz ti18 ret setyear$1: mov m,a ;set last-month dcx h dcx h mov a,m adi 1 daa mov m,a jrnc sy0 inx h mov a,m adi 1 daa mov m,a dcx h sy0: mvi d,3 ;3 registers to update lxi b,rtcadr+(rtcyrs shl 8) jr ti18 bcdbin: mov b,a ani 00001111b mov c,a mov a,b ani 11110000b rrc mov b,a rrc rrc add b add c ret binbcd: sui 100 jrnc binbcd adi 100 mvi c,0 bb0: sui 10 inr c jrnc bb0 adi 10 dcr c slar c slar c slar c slar c ora c ret mondays: db 31,28,31,30,31,30,31,31,30,31,30,31 time: timesec: db 0 timemin: db 0 timehrs: db 0 timeday: db 0 timedat: db 0 timemon: db 0 db 0 ;thousandths of seconds, 4 bits only timeyrs: db 0 timecnt: db 0 lstmnth: db 0 numrtc equ $-time getdrv: lxi h,@dtbl ! ret @dtbl: dw dnull,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 dnull: dw 0,0,0,0,0,0,0,0,0,@dircb,@dtacb,0 db 0 seldsk: mov a,c ! sta @adrv ; save drive select code lxi h,@lptbl mvi b,0 ! dad b ; create index from drive code mov a,m cpi 255 jrz selerr sta @pdrv mov c,a mov b,e ;save login flag thru "search" routine call search jrc selerr sta @rdrv shld curmdl push b ;save login bit lxi d,14 dad d ;point to dphtbl mov e,m ;DE=dphtbl inx h mov d,m inx h mov c,m ;BC=modtbl inx h mov b,m lda @rdrv add a add a add a ;*8 mov l,a mvi h,0 dad b ;select mode bytes shld @cmode ;set current mode pointer pop b ;get login bit back. bit 0,b ;test for initial select. jrnz notlgi xchg ;DE=modes mov c,a mvi b,0 dad b ;+*8 dad b ;+*16 dad b ;+*24 lda @rdrv mov c,a dad b ;+*1 = +*25 shld @dph call setup$dph jrc selerr xra a sta @rcnfg mvi a,3 call calmod ;call module's "login" routine. ora a ;see if an error occured. jrnz selerr lda @rcnfg ora a cnz setup$dph jrc selerr lda @adrv add a mov c,a mvi b,0 lxi h,@dtbl dad b lded @dph mov m,e ;set current DPH in @dtbl inx h mov m,d jr selcom ;DE=dph selerr: lxi h,0 ret notlgi: lda @adrv add a mov c,a mvi b,0 lxi h,@dtbl dad b mov e,m ;get current DPH from @dtbl inx h mov d,m ;DE=dph sded @dph selcom: lhld @cmode lxi b,0 ; bit 7,m ;Tracks-per-side not valid for Hard disks. jrnz selxit inx h ; ; bit 1,m ;unless its Z17... ; ; jrz sc0 ; ; mvi b,4 ;then side 1 has 4 less tracks (8 on DT) sc0: mvi a,40 ;assume 5" ST inx h bit 7,m ;check 5" drive jrz sc1 mvi a,77 ;8" drives have 77 tracks sc1: mov c,a ;set side 0 tracks sub b mov b,a inx h ;fix for HT bug bit 5,m ;check for DT jrz selxit slar b ;multiply # of tracks by 2 if DT slar c ; selxit: sbcd @tps lded @dph lxi h,+12 dad d ;point to DPB entry mov c,m inx h mov b,m push b ;save DPB ldax b ;sectors-per-track, byte value lxi h,+15 dad b mov b,m ;psh inr b gh2: dcr b jz gh3 srlr a jr gh2 gh3: sta @pspt ;physical sectors per track lxi h,+22 ; HASH dad d mov a,m inx h ora m jnz ghz ; already have HASH pop b push b lxi h,+7 ; DRM dad b mov a,m inx h mov h,m mov l,a inx h ; HL = num dir ent dad h dad h ; for Kaypro there should always be enough space... mov c,l mov b,h ; BC = size of HASH needed lhld hleft ora a dsbc b jrc nohash shld hleft lhld hlast push h dad b shld hlast pop b ; HASH alloc'd for this drive gh0: lxi h,+22 dad d ;point to hash address mov m,c ;set hash buffer address for this drive. inx h mov m,b inx h mvi m,hbnk ;set hash bank also. ghz: xchg ;put DPH in (HL) for BDOS mov e,m inx h mov d,m ;DE=sectrn dcx h pop b ;BC=dpb ret nohash: lxi b,0ffffh jr gh0 setup$dph: ora a ;reset [CY] lhld @cmode ;HL=modes bit 7,m ;check for hard-disk drive (modes not standard) rnz call ?getdp stc rnz lhld @dph ;restore dph mov m,c ;set XLAT table inx h mov m,b lxi b,12-1 dad b ;point to dpb mov c,m ;get DPB addr inx h mov h,m ;(HL=dpb) mov l,c xchg lxi b,17 ldir ora a ;reset [CY] ret home: lxi b,0 ; same as set track zero settrk: sbcd trk ret setsec: sbcd sect ret setdma: sbcd @dma lda @cbnk ; default DMA bank is current bank setbnk: sta @dbnk ret sectrn: mov l,c ! mov h,b mov a,d ! ora e ! rz xchg ! dad b ! mov l,m ! mvi h,0 dcx h ;sectors numbered 0 - (n-1) ret read: mvi e,6 ;read entry is +6 jmp rw$common ; use common code write: mvi e,9 ;write entry is +9 rw$common: ;do any track/sector/side conversion... xra a sta @side lhld trk shld @trk lhld sect shld @sect lhld @cmode bit 7,m ;floppy or hard-disk? jrnz rw0 inx h inx h inx h bit 6,m ;DS jrz rw0 mov a,m ani 01110b ;DSALG lxi h,dstbl mov c,a mvi b,0 dad b mov c,m inx h mov h,m mov l,c call icall rw0: mov a,e calmod: lhld curmdl jmp addjmp ; leap to driver ;; 0 1 2 3 4 5 6 7 dstbl: dw wrap,alt1,cont1,cont2,alt2,dsret,dsret,dsret cont2: lda @pspt ;as done by Gnat srlr a ;SPT must be EVEN mov c,a lxi h,@sect mov a,m sub c ;don't change the sector number on side 1 rc mov c,a ;save for cont1 jr side1 cont1: call cont2 rc mov m,c ret ;side1 already set alt1: lxi h,@trk rarr m mvi a,0 ral jr sside alt2: call alt1 ;Kaypro ora a ;side 0? rz ;yes, done. lxi h,@sect ;for KAYPRO, sectors on side 1 lda @pspt ;are numbered PSPT+1 to PSPT*2. add m ; mov m,a ret wrap: lbcd @tps ;B=tracks on side 1, C=tracks on side 0 lda @trk ;(for all except Z17, B=C) cmp c rc neg add c add b dcr a sta @trk side1: mvi a,1 sside: sta @side dsret: ret multio: sta @cnt ! ret flush: xra a ! ret ; return with no error @side: ds 1 ; current side of media (floppy only) @trk: ds 2 ; current track number @sect: ds 2 ; current sector number @cnt: db 0 ; record count for multisector transfer @dbnk: db 0 ; bank for disk DMA operations @pspt: ds 1 @tps: ds 2 @rcnfg: ds 1 trk: ds 2 sect: ds 2 @dtacb: dw dtacb1 @dircb: dw dircb1 dircb1: db 0ffh ;drive db 0,0,0,0,0 dw 0,0,2100h ;directly after CCP image (max 8K CCP) db 0 dw dircb2 dircb2: db 0ffh ;drive db 0,0,0,0,0 dw 0,0,2500h db 0 dw dircb3 dircb3: db 0ffh ;drive db 0,0,0,0,0 dw 0,0,2900h db 0 dw dircb4 dircb4: db 0ffh ;drive db 0,0,0,0,0 dw 0,0,2d00h ;dir buffers: 2100-3100 db 0 dw 0000 ;end of DIR buffers dtacb1: db 0ffh ;drive db 0,0,0,0,0 dw 0,0,3100h db 0 dw dtacb2 dtacb2: db 0ffh ;drive db 0,0,0,0,0 dw 0,0,3500h db 0 dw dtacb3 dtacb3: db 0ffh ;drive db 0,0,0,0,0 dw 0,0,3900h db 0 dw dtacb4 dtacb4: db 0ffh ;drive db 0,0,0,0,0 dw 0,0,3d00h ;data buffers: 3100-4100 db 0 dw 0000 ;end of data buffers @scrbf dw 4100h ;scratch buffer 4100-4500 ; Max. system space: 4500h to "bnktop", 38K if 8K common. end  call bdose ; was there enough RAM? 0112 CD7C01 call set$jumps ;setup system jumps and put in all banks ; fetch CCP for first time, system will put it in bank 1. 0115 3EFE mvi a,0feh ;don't try warm boot on error... 0117 320000 sta @ermde ; 011A 117A03 lxi d,ccp$com 011D 0E0F mvi c,15 ;open file 011F CD8F00 call bdose 0122 3C inr a 0123 CAED01 jz noccp 0126 AF xra a 0127 329A03 sta fcb$nr 012A 110001 lxi d,ccp 012D 0E1A mvi c,26 ;set DMA address 012F CD8F00 call bdose 0132 1E40 mvi e,64 ;read upto 64 records (8K) 0134 0E2C mvi c,44 ;set multi-sector count 0136 CD8F00 call bdose 0139 117A03 lxi d,ccp$com 013C 0E14 mvi c,20 ;read record(s) 013E CD8F00 call bdose 0141 7C mov a,h ;H=number of records actually read 0142 327903 sta ccprecs 0145 AF xra a ;back to 0146 320000 sta @ermde ;default mode for user 0149 010100 lxi b,0001h ; save CCP in bank 0 for warm boots. 014C CD6601 call xmovccp ;NOTE: this restricts banked OS size. 014F C38700 jmp goccp ; (allowing 8K for "CCP" and reserving page 0) 0152 CD7C01 wboot1: call set$jumps ; initialize page zero, selects bank 0 0155 010001 lxi b,0100h 0158 CD6601 call xmovccp 015B 2A7500 lhld wbtrap ; allow I/O modules to partake in the warm$boot. 015E 7C mov a,h ; 015F B5 ora l ; 0160 C4FA02 cnz icall ; 0163 C38700 jmp goccp xmovccp: 0166 CD1E03 call xmove 0169 3A7903 lda ccprecs 016C 47 mov b,a 016D 0E00 mvi c,0 srlr b 016F+CB38 DB 0CBH,38H+B rarr c ;BC=number of bytes in CCP 0171+CB19 DB 0CBH,18H+C 0173 210001 lxi h,ccp 0176 110001 lxi d,ccp 0179 C32903 jmp move set$jumps: 017C 3EC3 mvi a,(JMP) 017E 3200003205 sta cpm ! sta bdos ; set up jumps in page zero 0184 2103002201 lxi h,BIOS$0+3 ! shld cpm+1 ; BIOS warm start entry 018A 2A00002206 lhld @mxtpa ! shld bdos+1 ; BDOS system call entry 0190 010001 lxi b,0100h ;source bank 0, dest bank 1 0193 CD1E03 call xmove 0196 210000 lxi h,0 0199 110000 lxi d,0 019C 014000 lxi b,64 019F CD2903 call move 01A2 010002 lxi b,0200h ;source bank 0, dest bank 2 01A5 CD1E03 call xmove 01A8 210000 lxi h,0 01AB 110000 lxi d,0 01AE 014000 lxi b,64 01B1 CD2903 call move 01B4 010003 lxi b,0300h ;source bank 0, dest bank 3 01B7 CD1E03 call xmove 01BA 210000 lxi h,0 01BD 110000 lxi d,0 01C0 014000 lxi b,64 01C3 C32903 jmp move ?timot: ; (B)=I.D. (C)=count, (DE)=routine address 01C6 D5 push d 01C7 1E02 to1: mvi e,numtic 01C9 219E03 lxi h,tictbl 01CC F3 di 01CD 7E to0: mov a,m 01CE FEFF cpi trW:D=&XOy@X @X@X -XxgêWWxAX!X*h|}/<7:EjX=rZ:A:%2E-[:ͨXY:͓XY:;ʠX:2 2j͓X:\2\#̀\X:͓X:Y:͓XỲ\> #WGSͫX üX:X:͓XK Y Y Ỳ\YY#:ͨX@+:@[> O2?:]'TX:\LwN\AY͊\:%OY:AtY:kGYYw#WY:jwW 2VX͵L:COY:<«Y*0"h|}ªY!GڪY>2CS!YZbX:E=W:kGS]Yw#·YjXîY:`<2a=YYY*hZj73ZL͍ZWO$%Z.}Z.Ey=!G1Zx.Zw:%0y#QZ!CFZQZw!45!w~[>>HU:F:B3ZZ2`2F=2E=2_:]¿Z \zZ!_4:% [ZZ:Z>2k:]̆L`X?ԆL[[:%[:G<[:H<[2Aɯ:`=ZZZ:I/!ꂦ!Z*hM|D!G~®[\[=2D>2k:Cg[ڝ[:Hڪ[ʢ[O:`‰[:_=ڪ[ʪ[y!Bp!E2BGy/? ]͓X\`i{=)]~)]# ]w#]!k!H5:ÓX:ÓX\:":#7 ^l8\LH7]PL7]MT7]MB7]HM\FM\PC\PO\SR\UJ\BP\CW\PA\CP\PN\OP\HE\FO\IG\PF+]OJ+]IJ+]LS+]CS+]DM+]SV+]AV+]RP+]DF+]RV+]FI+]IF+]EF+]EX+]IA1]IB1]IC1]ID1]IE1]II1]IL1]IM1]IN1]IO1]IP1]IR1]IT1]!L*Lk%^*Lv\^`W P^ \^͍R!6:^LPý0\^LP͵L̓V *1V`$__S`͞_1^h``!6_ͪ`1$__S``͡_!6^V`^W:G5^:^^z`^^n"!^j&͘!Ò":6WJ#!*7m*7ͣ ͩm;!WN`:G5u_:W|_>E_z`:&?_:6!6]_:6?_26)H)Ϳ"> Ͷh`ͅ_ͅ_!W^:6WJ#Ñ ͕_||g}o&PY!>m! pý0`i&_&_PY!>m!ö__=_L`DM͵L`a`ý0ͣRa``*:oCW 8`8`͆LB`I`%`7 I` ::6`a` ~&!rCÇ`:qC`!vC/Ö`W:pC&_ʦ` Ø`G1Ox1!6/<12og))B DM!BS ͒_}!77Fwx# `͂$:$a>!J5FO:6a *6|a:&6!6O! #~ :a 2a:3'Pam(!4(̀\ta͸(C*#]b(C*#]bÝa͸(C:_*͟L Ҍa'b(C*#'b(C*"#$%aS>-z(]b:$z(*6|a>+G((*7*6de."6:J5!6m(~a>͸(C:pb>͸(#Cb>%͸(!C:$&b>0͸('C0z(3bb:b+|:bx]b`i3bz(~v :6:6WV)O*7:3=G:!“b:&:I5b:1b:0ʥbҾbb{!K5zҶb!I5w# b“b6+b> bw#b6 ͗,z26>26{!M5cbͪ`:6` V^:&!6)*R++++~ e:6!6d͂^͇e:^!G5`V^*R~0_~Q eÇe!~6ʮeq1 K+!J5ð:K5:ӂ=[gͫg*7++wC>2ӂ2K5 f.(oN /*D526264(͘! fÁf!fh!m626-Ef!645Cfk!45Ef>́f!045]f#Mf:;́f̈́ ~:6/!m!6^NR26!fLgLlGggxԳhڟf!ͶxZD h!65 g͘lhf26Kf hgg:J5h~ hC*P~###g~gw+w+w###A͠f gg!Ƃ-k!΂|k'L 7g*L7g#>g!q4HgD*"+""|k*ӂ-Wg!z!"p"6:p:J57:ӂ=ȷ[ggmҏg!6~6H)!65:$=ͣg=g!J545ʻgh> ZD> ZDfͷKKgg+G_w#¾gwCwC `îg:M5!K5wH).(!6h͞_=gP͇e j0.(!6h_~Q`  h͞_P e!hʹ`g?<:ς[g'LcDyh*P~~whKͳeOh!ӂ~yyh4 :p!q~ʍh5!Ƃ-k!΂|k> ZD-k:ɂ|kK'LͷKkd̍d[gCj*P:!h: h~~w++++~~w>2m[g i:p!"Ԃ$"҂L*Li i#΂L͏i6i!""͑gz:J5iiͷK*"mwCKfi+fi#!"@iwC `> Ll:> ʟf*"mf> ZDÀi*":§i{_izʽii} 7 Öi{үiiʕi2p31i*O5mүi*M5mڕi 7ȷ{!54w~io&" *P~j++++j~dj"PDM#^#V###N#fid>2VXKQj2W2VwC!")* |dj{K+zʕj#!)#:!j]j+: ]j+wC'Lj9k0j*&Z~###Dk6_/k_j!w+1k:H5͵Lz> >͆L>:%#$k=w<6j6#w#w#wd}))~wj~~wjYk9kKk>̍&>+1WDM͵kzI'wC26Ãk!vkKI'+1!]0MwCÞkW ͵L{k{kk|k!kZD 7> ijԶ€lO31!"ym3l>2m2r$mljm `l*~*O5d"+|lNp:po `[gͧn `l}wC26*"*K5m*O5*"mz!m7?{kͷK*smKͿ7Mm+oSm~w#(l*mwC*s*K5"sdEp÷K}ނ>L!u@ mʄm> 2}:y:|ʣm!:8",6m!}5m*z"~*"*"oo mͳe7Ϳ7m>+w#_+nW*s(l*O5*sn#m$n:z$n"z+>L:z{joBnzjo>Mn{Fn2|z>G}!u~p#wzxdnO#~q#wz2*sxn#"~!y4+x>L=¢n: L*Lw2 }L*LW¹n6XK2onoWʿnͿ7+wC:$=_}>ZD> ZDnI'*K5"sEp÷K:rLڂ͆L7K(o(o+wCͷKKLo/o `Hoͳe/o+RoCK zjo+6 -:vG:!64~o!xҎowOҞo!4ʞo<552x!x2ނXK}Koo}!v5o:o!x5o!5o!5o=<ʳooͷKóo:wC!p~G~w(p}xp>OxG͢G p>p p :/!r:v!!]1 oͷKóo:wC! /c N:6*6*67LN2626^N'* .4NyN!fx N*6"6"6"6y26x26:6!6[N26-ʂ͵LL-k:=5ڥ~|!! ͠8~:61~̓1~!&8",6!7Q*7";";";";";";";";6#";";@6#";";";";">; s#r":2;:4::~>2-;=/~2+;2,;>:>:>/2.;/!6̬:4./2'6>:4! W:-;! 2%6:$6| ]1 q1&ͭ *;;w#6*;w#62::S;2::l2:2o;*":!"D;:2:;>29;S;!Q;#:3ODN +y=!7#͠+i͓͠X!7͠;++++l!7ހ ͓҄####7͠ހ++͉s#r+##s#r++ހ͉#r+s +r+s͉mɯ2k2k*k"kw#wɛe{ÓvÓvv.zÿvzt.7Kj]Action(F/B/I/D/S)?Spelling Check Completed Add to Dictionary:  Add to Supplement: (Y/N)? #x25<8$I' v!|“v>25v>2425>2#x:=5v>8$!"zyI'!(k'wwz!%v!#v÷&ͫw;xw:5x x+1!vTwFwwCI'x'w:5̞kĘk7Ow>2|6;!:5nw!7́w*7د͇w+wC!7́w*7د+͙w#jwH7 Ïw# ŒwŒw7 áw+ žwžw7*7#C*7W /!!v"6ͤ'*6"zw!H5 *7~ -% *z͘!3%wͫ!͘!wI'w'LwCKwC}:5JÃJ:=52=5͂$2=5'%!Ø!!7́wy'xx͝xdyʗxͼw2|62z!ʌx#}x#ʆx#}x#}xSx yʗxSxz*7z͝G7>2|6*7zG2z+#]zx{x'x`x_>&y2zéxxx x x x xy2zéx:z2zxx2z*z͘!:zG:$y'v0y:_y)v$:z}+v-v*D5"zw*z"D5$G:͓y!zz~ʑy#F‚y#ty~2zz!z"zæ͌x!z:z(z zzE:H5 *7+*7:6w~/G~w#͠]zEz~'!G~vzʇz#izxA{?a[?ɯxWyO\*h"h!_~w!E~w"b"d ADDz B<:xĔA!::>!"<2:ez=*;S<<6#";!&*;":#>2:2:B~5I=BLe xq=!:~6i=::B2'6L2:::G::W*::.;==!}>>x=!:y=!:zU=2:)>}>>| >x= >y=z!:5 >z=I=|xOzO>2:2:K>::?>ɷH>::33ɯ2:d>::?>::2:z>C>::z>::!:4><2:͚>::::!:ڃ>!:@?e:-;!:!: @:>: ͵< > :>?>?>?~>?>i?#::E=2:! >!:ͽ>*:>Y?F#>N?͌WG +@+@+@:”?qBBBB¿?C>i=%@!:ʭB#z=:-;<̆B::!:A@ ::O::U@W@>!:`@ H::̔@:-;::@x :=@B͔@|@@ ::=Q::@:-;::@:=@B@ë@¾@ ::=::zA:O::@:O::@ɷ@z @ :-;@A::;By! %A+A *A*A!:4x!:4::ͰA!:x=AG]ÀA!"{;e:enAͦA]A:='=DM:Ox 2 GP:$=6=JY*{;#WA::=2:> ;AðA:x=A͔AA!1;A6A6:1;ͦAAB!2;4:y=>22;ͦAB~A5>KA͔A!1;~4:x=:2;?5B!yA:-;B:-;@B!:~5N*:!:+#{ 2:yeB!:{|Bw::!:5*:!:::+ʛBҒB#<2:w":~ʭBPYͰJ 6ͦBBͦB:.;= B<=/AB B<2/;!:: !8!:>!":*; >N=N=N=N=N=N=N=N=!N=F6##>G=ͨ<~6# Ox>=":!::! ;"@2;::;?ͷ=͗2:2:ALe x’=!:~6=::ͱA2'6L>2:2;:;!:=*:*:d*:P*:P͠=2;^>į>e:ͨ< .> +~*;++~:>V>>V>>>#*:A! D>!:>*: >ʔ>F##>‰>͛{u>> >":";{2:!::: ;2 ;!2D>!:>*:A*:::_7>G{>H7>G#>y>> O7>xF>>*:A2;WG ???!?2;:9?:9?:A?q>2;a?a?a?j?A;?PAz?;?::Ç=?!:7A#<€?x$AAA!::APY+:A@ 8::AÛ=oH?::x :=*/;aA??Q::@:::=@?z@z :::@:::! úA::!:x=@GW@z@!"{;e:eh@͠@W@:='=DM:Ox 2 GP:$=6=JY*{;#Q@:x=@͎@@!1;@6@6:1;͠@ê@@!2;4:y=>22;͠@@~@5>E@͎@!1;~4:x=:2;?A!y@*:&]aA~7APYð0A*:&!:0A A<=,@UA:;kA]*:":*:":!*:dhA]*:":::_ÍA>2:2:PAAPAADA ,@AA 82:!::|A2B!:~6B͢B͈B**:ͻB":!:ywz:įBPA!xnBB**:͸B":!:~RBRBNVB!2B͢B!:~6vB!:x!sBPA!:xpx!nBʝBʝB,@PA!:yw:OPAy,@:O|J͠B!BdyKByOB#zxSɛ <<<"<5<ɯL̍&>͍&!Dk!Dkxwv!ƂjI'6!:3ڭvJO:͢Gڍv6E!Ƃvkxx>wvxI'!0M!͆Lv*76͑wCv*7:CJ6ͦEx6!4͂$'%$O*&+1*D5"6"6*6͘!ͫ${#Ͷ$~ʡwwڵwµwMywyʟwyx5wwʟw8$I' !ʘw#~5wͫ$}!&Đ)8~w#üw$85ww$95w$85wկ wYxxx.x#x xͶ7=x2x x=x+x>  3x~Hx#.:*? пͶ#~+:tx~?Q?@##!06Ͱx!Ͱx!Ͱx!7Ͱx:%6ʬx!;Ͱx:4!;İx# ͔8ìxx!vk:x>͍&:>č&:>͍&!ʂvk:%> ͍&> ͍&ue jrz to2 01D0+2811 DB 28H,TO2-$-1 01D2 B8 cmp b jrz to2 01D3+280E DB 28H,TO2-$-1 01D5 23 inx h 01D6 23 inx h 01D7 23 inx h 01D8 23 inx h 01D9 1D dcr e jrnz to0 01DA+20F1 DB 20H,TO0-$-1 01DC FB ei 01DD 79 mov a,c ;don't wait if all it wants is to clear a possible 01DE B7 ora a ;existing entry, since none exists for that module. jrnz to1 ;-- maybe we should "ei hlt" and then jump -- 01DF+20E6 DB 20H,TO1-$-1 01E1 D1 pop d 01E2 C9 ret to2: 01E3 D1 pop d 01E4 70 mov m,b 01E5 23 inx h 01E6 71 mov m,c 01E7 23 inx h 01E8 73 mov m,e 01E9 23 inx h 01EA 72 mov m,d 01EB FB ei 01EC C9 ret 01ED 116F03 noccp: lxi d,ccp$msg 01F0 0E09 errx: mvi c,9 01F2 CD8F00 call bdose 01F5 F376 di ! hlt 01F7 0C gett: inr c ;test for "FF" 01F8 CA8D02 jz sett ;FF=set time 01FB 11140A ti0: lxi d,rtcsts+(numrtc shl 8) 01FE 21DC03 lxi h,time 0201 012002 lxi b,rtcadr+(rtcsec shl 8) ti1: outp b ;select reg 0204+ED41 DB 0EDH,B*8+41H 0206 04 inr b 0207 DB24 in rtcdta 0209 77 mov m,a 020A 23 inx h outp e ;select status reg 020B+ED59 DB 0EDH,E*8+41H 020D DB24 in rtcdta 020F B7 ora a jrnz ti0 0210+20E9 DB 20H,TI0-$-1 0212 15 dcr d jrnz ti1 0213+20EF DB 20H,TI1-$-1 0215 3AE103 lda timemon ;if last accessed month is greater 0218 21E503 lxi h,lstmnth ;than current month, the year must be 021B BE cmp m ;changed. 021C DC9003 cc setyear$1 ;assumes 1 year elapsed 021F 3ADC03 lda timesec 0222 320000 sta @sec 0225 3ADD03 lda timemin 0228 320000 sta @min 022B 3ADE03 lda timehrs 022E 320000 sta @hour 0231 3E1C mvi a,28 0233 32D103 sta mondays+1 ;set February=28 0236 3AE303 lda timeyrs 0239 CDA803 call bcdbin 023C 47 mov b,a 023D 3AE403 lda timecnt 0240 D619 sui 19h 0242 78 mov a,b jrz ti1@0 0243+2802 DB 28H,TI1@0-$-1 0245 C664 adi 100 ;adjust for century 0247 D64E ti1@0: sui 78 ;years since 1978 (base year) 0249 47 mov b,a ; 024A 3C inr a ;adjustment for leap year calc. 024B 4F mov c,a ; srlr c ; 024C+CB39 DB 0CBH,38H+C srlr c ;divide by 4 = number of leap years (exclusive) 024E+CB39 DB 0CBH,38H+C 0250 E603 ani 11b 0252 FE03 cpi 11b ;is this year a leap year? jrnz ti2 0254+2005 DB 20H,TI2-$-1 0256 3E1D mvi a,29 0258 32D103 sta mondays+1 ;set february=29 025B 210000 ti2: lxi h,0 025E 116D01 lxi d,365 0261 19 ti3: dad d ;find number of days since 1978 djnz ti3 0262+10FD DB 10H,TI3-$-1 0264 09 dad b ;(B=0) add in 1 day for each leap year 0265 3AE003 lda timedat 0268 CDA803 call bcdbin 026B 4F mov c,a 026C 0600 mvi b,0 026E 09 dad b ;add in days of this month 026F 3AE103 lda timemon 0272 CDA803 call bcdbin 0275 3D dcr a ;if January, nothing left to add. jrz ti4 0276+280E DB 28H,TI4-$-1 0278 47 mov b,a 0279 11D003 lxi d,mondays ;add in days of each month upto this. 027C 1A ti5: ldax d 027D 13 inx d 027E 85 add l 027F 6F mov l,a 0280 3E00 mvi a,0 0282 8C adc h 0283 67 mov h,a djnz ti5 0284+10F6 DB 10H,TI5-$-1 0286 220000 ti4: shld @date 0289 3A0000 lda @sec 028C C9 ret 028D 3A0000 sett: lda @hour 0290 32DE03 sta timehrs 0293 3A0000 lda @min 0296 32DD03 sta timemin 0299 3A0000 lda @sec 029C 32DC03 sta timesec 029F 2A0000 lhld @date 02A2 116D01 lxi d,365 02A5 3E1C mvi a,28 02A7 32D103 sta mondays+1 ;set february=28 02AA 0600 mvi b,0 ;start counting years since 1978 02AC 78 ti6: mov a,b ; check for leap year 02AD E603 ani 11b ;every 4 years, 02AF EE02 xri 10b ;starting with 1980 jrnz ti7 02B1+2001 DB 20H,TI7-$-1 02B3 37 stc ;one extra day for leap years ti7: dsbc d ;does this year fit in @date? 02B4+ED52 DB 0EDH,D*8+42H 02B6 04 inr b ;count a year. jrnc ti6 ;yes, keep taking out more days (by years) 02B7+30F3 DB 30H,TI6-$-1 02B9 78 mov a,b ;is this year a leap year? 02BA E603 ani 11b 02BC EE02 xri 10b jrnz ti8 02BE+2006 DB 20H,TI8-$-1 02C0 3E1D mvi a,29 02C2 32D103 sta mondays+1 ;February=29 02C5 37 stc ti8: dadc d ;normalize @date (we subtracted one too many) 02C6+ED5A DB 0EDH,D*8+4AH 02C8 05 dcr b 02C9 78 mov a,b 02CA C64E adi 78 ;adjust year to 1900 02CC 0613 mvi b,19 ;century 02CE FE64 cpi 100 jrc ti8@0 02D0+3803 DB 38H,TI8@0-$-1 02D2 04 inr b 02D3 D664 sui 100 02D5 CDB603 ti8@0: call binbcd 02D8 32E303 sta timeyrs 02DB 78 mov a,b 02DC CDB603 call binbcd 02DF 32E403 sta timecnt 02E2 EB xchg ;remainder into DE 02E3 0601 mvi b,1 ;start taking out months. 02E5 21D003 lxi h,mondays 02E8 7B ti9: mov a,e 02E9 96 sub m 02EA 4F mov c,a 02EB 7A mov a,d 02EC DE00 sbi 0 jrc ti10 02EE+3809 DB 38H,TI10-$-1 02F0 59 mov e,c 02F1 57 mov d,a 02F2 23 inx h 02F3 04 inr b 02F4 78 mov a,b 02F5 FE0D cpi 13 jrc ti9 02F7+38EF DB 38H,TI9-$-1 02F9 78 ti10: mov a,b 02FA CDB603 call binbcd 02FD 32E103 sta timemon 0300 32E503 sta lstmnth ;also set last accessed month 0303 7B mov a,e ;left-over must be date of month 0304 CDB603 call binbcd 0307 32E003 sta timedat ; set day-of-week using Zeller's congruence: 030A 3AE303 lda timeyrs ;E=([2.6m-.2]+K+D+[D/4]+[C/4]-2C) mod 7 030D CDA803 call bcdbin ;0=sunday 0310 57 mov d,a 0311 3AE103 lda timemon 0314 CDA803 call bcdbin 0317 42 mov b,d 0318 D602 sui 2 jrz ti11 031A+2802 DB 28H,TI11-$-1 jrnc ti12 031C+3003 DB 30H,TI12-$-1 031E C60C ti11: adi 12 0320 05 dcr b 0321 4F ti12: mov c,a 0322 87 add a 0323 81 add c ;*3 0324 87 add a 0325 87 add a ;*12 0326 81 add c ;*13 0327 3D dcr a 0328 0E00 mvi c,0 032A 0C ti13: inr c 032B D605 sui 5 jrnc ti13 032D+30FB DB 30H,TI13-$-1 032F 0D dcr c 0330 3AE003 lda timedat 0333 C5 push b 0334 CDA803 call bcdbin 0337 C1 pop b 0338 81 add c ;[2.6m-.2]+K 0339 80 add b ;+D srlr b 033A+CB38 DB 0CBH,38H+B srlr b ; [D/4] 033C+CB38 DB 0CBH,38H+B 033E 80 add b ;+[D/4] 033F 4F mov c,a 0340 3AE403 lda timecnt ;century 0343 CDA803 call bcdbin 0346 47 mov b,a slar b ; 2*C 0347+CB20 DB 0CBH,20H+B srlr a ;; 0349+CB3F DB 0CBH,38H+A srlr a ; [C/4] 034B+CB3F DB 0CBH,38H+A 034D 81 add c ;+[C/4] 034E 90 sub b ;-2*C 034F 4F mov c,a 0350 F25503 jp ti14 neg 0353+ED44 DB 0EDH,44H 0355 0600 ti14: mvi b,0 0357 04 ti15: inr b 0358 D607 sui 7 jrz ti16 035A+2807 DB 28H,TI16-$-1 jrnc ti15 035C+30F9 DB 30H,TI15-$-1 bit 7,c 035E+CB79 DB 0CBH,7*8+C+40H jrnz ti16 0360+2001 DB 20H,TI16-$-1 0362 05 dcr b 0363 78 ti16: mov a,b 0364 87 add a 0365 80 add b ;*3 0366 87 add a 0367 80 add b ;*7 bit 7,c 0368+CB79 DB 0CBH,7*8+C+40H jrz ti17 036A+2802 DB 28H,TI17-$-1 neg 036C+ED44 DB 0EDH,44H 036E 47 ti17: mov b,a 036F 79 mov a,c 0370 90 sub b 0371 3C inr a 0372 32DF03 sta timeday 0375 3E12 mvi a,clrcnt ; 0377 D320 out rtcadr ; 0379 3E03 mvi a,00000011b ;reset fractional seconds 037B D324 out rtcdta ;we now have one second to set time 037D 160A mvi d,numrtc 037F 21DC03 lxi h,time 0382 012002 lxi b,rtcadr+(rtcsec shl 8) ti18: outp b ;select reg 0385+ED41 DB 0EDH,B*8+41H 0387 04 inr b 0388 7E mov a,m 0389 D324 out rtcdta 038B 23 inx h 038C 15 dcr d jrnz ti18 038D+20F6 DB 20H,TI18-$-1 038F C9 ret setyear$1: 0390 77 mov m,a ;set last-month 0391 2B dcx h 0392 2B dcx h 0393 7E mov a,m 0394 C601 adi 1 0396 27 daa 0397 77 mov m,a jrnc sy0 0398+3007 DB 30H,SY0-$-1 039A 23 inx h 039B 7E mov a,m 039C C601 adi 1 039E 27 daa 039F 77 mov m,a 03A0 2B dcx h 03A1 1603 sy0: mvi d,3 ;3 registers to update 03A3 012008 lxi b,rtcadr+(rtcyrs shl 8) jr ti18 03A6+18DD DB 18H,TI18-$-1 03A8 47 bcdbin: mov b,a 03A9 E60F ani 00001111b 03AB 4F mov c,a 03AC 78 mov a,b 03AD E6F0 ani 11110000b 03AF 0F rrc 03B0 47 mov b,a 03B1 0F rrc 03B2 0F rrc 03B3 80 add b 03B4 81 add c 03B5 C9 ret 03B6 D664 binbcd: sui 100 jrnc binbcd 03B8+30FC DB 30H,BINBCD-$-1 03BA C664 adi 100 03BC 0E00 mvi c,0 03BE D60A bb0: sui 10 03C0 0C inr c jrnc bb0 03C1+30FB DB 30H,BB0-$-1 03C3 C60A adi 10 03C5 0D dcr c slar c 03C6+CB21 DB 0CBH,20H+C slar c 03C8+CB21 DB 0CBH,20H+C slar c 03CA+CB21 DB 0CBH,20H+C slar c 03CC+CB21 DB 0CBH,20H+C 03CE B1 ora c 03CF C9 ret 03D0 1F1C1F1E1Fmondays: db 31,28,31,30,31,30,31,31,30,31,30,31 time: 03DC 00 timesec: db 0 03DD 00 timemin: db 0 03DE 00 timehrs: db 0 03DF 00 timeday: db 0 03E0 00 timedat: db 0 03E1 00 timemon: db 0 03E2 00 db 0 ;thousandths of seconds, 4 bits only 03E3 00 timeyrs: db 0 03E4 00 timecnt: db 0 03E5 00 lstmnth: db 0 000A = numrtc equ $-time getdrv: 03E6 21EA03C9 lxi h,@dtbl ! ret 03EA 0A04000000@dtbl: dw dnull,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 040A 0000000000dnull: dw 0,0,0,0,0,0,0,0,0,@dircb,@dtacb,0 0422 00 db 0 seldsk: 0423 79326A00 mov a,c ! sta @adrv ; save drive select code 0427 210000 lxi h,@lptbl 042A 060009 mvi b,0 ! dad b ; create index from drive code 042D 7E mov a,m 042E FEFF cpi 255 jrz selerr 0430+286B DB 28H,SELERR-$-1 0432 326B00 sta @pdrv 0435 4F mov c,a 0436 43 mov b,e ;save login flag thru "search" routine 0437 CD9701 call search jrc selerr 043A+3861 DB 38H,SELERR-$-1 043C 326C00 sta @rdrv 043F 226D00 shld curmdl 0442 C5 push b ;save login bit 0443 110E00 lxi d,14 0446 19 dad d ;point to dphtbl 0447 5E mov e,m ;DE=dphtbl 0448 23 inx h 0449 56 mov d,m 044A 23 inx h 044B 4E mov c,m ;BC=modtbl 044C 23 inx h 044D 46 mov b,m 044E 3A6C00 lda @rdrv 0451 87 add a 0452 87 add a 0453 87 add a ;*8 0454 6F mov l,a 0455 2600 mvi h,0 0457 09 dad b ;select mode bytes 0458 226F00 shld @cmode ;set current mode pointer 045B C1 pop b ;get login bit back. bit 0,b ;test for initial select. 045C+CB40 DB 0CBH,0*8+B+40H jrnz notlgi 045E+2041 DB 20H,NOTLGI-$-1 0460 EB xchg ;DE=modes 0461 4F mov c,a 0462 0600 mvi b,0 0464 09 dad b ;+*8 0465 09 dad b ;+*16 0466 09 dad b ;+*24 0467 3A6C00 lda @rdrv 046A 4F mov c,a 046B 09 dad b ;+*1 = +*25 046C 227100 shld @dph 046F CD3805 call setup$dph jrc selerr 0472+3829 DB 38H,SELERR-$-1 0474 AF xra a 0475 321F06 sta @rcnfg 0478 3E03 mvi a,3 047A CDB505 call calmod ;call module's "login" routine. 047D B7 ora a ;see if an error occured. jrnz selerr 047E+201D DB 20H,SELERR-$-1 0480 3A1F06 lda @rcnfg 0483 B7 ora a 0484 C43805 cnz setup$dph jrc selerr 0487+3814 DB 38H,SELERR-$-1 0489 3A6A00 lda @adrv 048C 87 add a 048D 4F mov c,a 048E 0600 mvi b,0 0490 21EA03 lxi h,@dtbl 0493 09 dad b lded @dph 0494+ED5B DB 0EDH,5BH 0496+7100 DW @DPH 0498 73 mov m,e ;set current DPH in @dtbl 0499 23 inx h 049A 72 mov m,d jr selcom ;DE=dph 049B+1816 DB 18H,SELCOM-$-1 049D 210000 selerr: lxi h,0 04A0 C9 ret 04A1 3A6A00 notlgi: lda @adrv 04A4 87 add a 04A5 4F mov c,a 04A6 0600 mvi b,0 04A8 21EA03 lxi h,@dtbl 04AB 09 dad b 04AC 5E mov e,m ;get current DPH from @dtbl 04AD 23 inx h 04AE 56 mov d,m ;DE=dph sded @dph 04AF+ED53 DB 0EDH,53H 04B1+7100 DW @DPH 04B3 2A6F00 selcom: lhld @cmode 04B6 010000 lxi b,0 ; bit 7,m ;Tracks-per-side not valid for Hard disks. 04B9+CB7E DB 0CBH,7*8+M+40H jrnz selxit 04BB+2016 DB 20H,SELXIT-$-1 04BD 23 inx h ; ; bit 1,m ;unless its Z17... ; ; jrz sc0 ; ; mvi b,4 ;then side 1 has 4 less tracks (8 on DT) 04BE 3E28 sc0: mvi a,40 ;assume 5" ST 04C0 23 inx h bit 7,m ;check 5" drive 04C1+CB7E DB 0CBH,7*8+M+40H jrz sc1 04C3+2802 DB 28H,SC1-$-1 04C5 3E4D mvi a,77 ;8" drives have 77 tracks 04C7 4F sc1: mov c,a ;set side 0 tracks 04C8 90 sub b 04C9 47 mov b,a 04CA 23 inx h ;fix for HT bug bit 5,m ;check for DT 04CB+CB6E DB 0CBH,5*8+M+40H jrz selxit 04CD+2804 DB 28H,SELXIT-$-1 slar b ;multiply # of tracks by 2 if DT 04CF+CB20 DB 0CBH,20H+B slar c ; 04D1+CB21 DB 0CBH,20H+C selxit: sbcd @tps 04D3+ED43 DB 0EDH,43H 04D5+1D06 DW @TPS lded @dph 04D7+ED5B DB 0EDH,5BH 04D9+7100 DW @DPH 04DB 210C00 lxi h,+12 04DE 19 dad d ;point to DPB entry 04DF 4E mov c,m 04E0 23 inx h 04E1 46 mov b,m 04E2 C5 push b ;save DPB 04E3 0A ldax b ;sectors-per-track, byte value 04E4 210F00 lxi h,+15 04E7 09 dad b 04E8 46 mov b,m ;psh 04E9 04 inr b 04EA 05 gh2: dcr b 04EB CAF204 jz gh3 srlr a 04EE+CB3F DB 0CBH,38H+A jr gh2 04F0+18F8 DB 18H,GH2-$-1 04F2 321C06 gh3: sta @pspt ;physical sectors per track 04F5 211600 lxi h,+22 ; HASH 04F8 19 dad d 04F9 7E mov a,m 04FA 23 inx h 04FB B6 ora m 04FC C22C05 jnz ghz ; already have HASH 04FF C1 pop b 0500 C5 push b 0501 210700 lxi h,+7 ; DRM 0504 09 dad b 0505 7E mov a,m 0506 23 inx h 0507 66 mov h,m 0508 6F mov l,a 0509 23 inx h ; HL = num dir ent 050A 29 dad h 050B 29 dad h ; for Kaypro there should always be enough space... 050C 4D mov c,l 050D 44 mov b,h ; BC = size of HASH needed 050E 2A0400 lhld hleft 0511 B7 ora a dsbc "2491Enter Operating Income ($000)121" "34492Purchase Price ($000)51" "34492Mortgage Amount ($000)32" "34492Term of Mortgage (years)34" "34492Interest Rate (%)35" "34492Depreciable Value42" "34492Salvage Value43" "34492Depreciable Life (years)44" "146700" "120600" WSMSGS OVRkWSOVLY1 OVRWSOVLY1 OVRINCOME $$$50,20,300 24,8,1,5 0,1,0,1 0,0,0,0 15,10,1 0,0,0,0,0 "","","","","" 1,81,11,18 "Real Estate Investment Analysis" "Income Property" "($000)" 1,24 1,5 3 1,1,"Assumptions:",2,"" 2,2,"Net Operating Income",0,"24911215" 3,3,"Mortgage Inputs",0,"" 4,4,"Depreciation Inputs",0,"" 5,5,"Purchase Price",32,"" 6,6,"Tax Shelter Impact",33,"" 7,7,"Net Operating Income",0,"7141202" 8,8," Depreciation Allowance",0,"81046804" 9,9," Interest Expense",8,"91046903" 10,10,"Taxable Income",0,"1012432L7-L8-L900" 11,11," Income Tax (Shelter)",8,"1112432V5,2/100*L1000" 12,12,"After Tax Income (Loss)",32,"1234021011" 13,13,"Cashflow Impact",33,"" 14,14,"Net Operating Income",0,"14141202" 15,15," Mortgage Payments",0,"1512432V3,600" 16,16," Income Tax (Shelter)",8,"161412011" 17,17,"Cashflow (Outflow)",0,"1712432L14-L15-L1600" 18,18,"Cashflow Rate",4128,"1812432L17/(V5,1-V3,2)*10000" 19,19,"Equity Impact",33,"" 20,20,"Net Operating Income",0,"20141202" 21,21," Interest Expense",0,"21141209" 22,22," Income Tax (Shelter)",8,"221412011" 23,23,"Equity Income",0,"2312432L20-L21-L2200" 24,24,"Equity Rate",4096,"2412432L23/(V5,1-V3,2)*10000" 25,25,"",0,"" 26,26,"",0,"" 27,27,"",0,"" 28,28,"",0,"" 29,29,"",0,"" 30,30,"",0,"" 31,31,"",0,"" 32,32,"",0,"" 33,33,"",0,"" 34,34,"",0,"" 35,35,"",0,"" 36,36,"",0,"" 37,37,"",0,"" 38,38,"",0,"" 39,39,"",0,"" 40,40,"",0,"" 41,41,"",0,"" 42,42,"",0,"" 43,43,"",0,"" 44,44,"",0,"" 45,45,"",0,"" 46,46,"",0,"" 47,47,"",0,"" 48,48,"",0,"" 49,49,"",0,"" 50,50,"",0,"" 1,1,"Year 1",0,"" 2,2,"Year 2",0,"" 3,3,"Year 3",0,"" 4,4,"Year 4",0,"" 5,5,"Year 5",0,"" 6,6,"",0,"" 7,7,"",0,"" 8,8,"",0,"" 9,9,"",0,"" 10,10,"",0,"" 11,11,"",0,"" 12,12,"",0,"" 13,13,"",0,"" 14,14,"",0,"" 15,15,"",0,"" 16,16,"",0,"" 17,17,"",0,"" 18,18,"",0,"" 19,19,"",0,"" 20,20,"",0,"" 2,5 12 13.8 15.87 18.2505 20.988075 3,6 1 150 0 30 16 24.2056259481 4,4 2 120 20 15 5,2 200 40 7,5 12 13.8 15.87 18.2505 20.988075 8,5 12.5 11.6666666667 10.8333333333 10 9.16666666667 9,5 23.9842300342 23.9460899834 23.9013795156 23.8489667398 23.7875247733 10,5 -24.4842300342 -21.8127566501 -18.8647128489 -15.5984667398 -11.9661164399 11,5 -9.79369201369 -8.72510266003 -7.54588513957 -6.23938669591 -4.78644657597 12,5 -14.6905380205 -13.08765399 -11.3188277093 -9.35908004387 -7.17966986396 14,5 12 13.8 15.87 18.2505 20.988075 15,5 24.2056259481 24.2056259481 24.2056259481 24.2056259481 24.2056259481 16,5 -9.79369201369 -8.72510266003 -7.54588513957 -6.23938669591 -4.78644657597 17,5 -2.41193393441 -1.68052328807 -0.789740808532 0.284260747816 1.56889562787 18,5 -4.82386786882 -3.36104657614 -1.57948161706 0.568521495632 3.13779125575 20,5 12 13.8 15.87 18.2505 20.988075 21,5 23.9842300342 23.9460899834 23.9013795156 23.8489667398 23.7875247733 22,5 -9.79369201369 -8.72510266003 -7.54588513957 -6.23938669591 -4.78644657597 23,5 -2.19053802053 -1.42098732337 -0.485494376016 0.640919956129 1.98699680271 24,5 -4.38107604106 -2.84197464674 -0.970988752032 1.28183991226 3.97399360542 -99 104657614 -1.57948161706 0.568521495632 3.13779125575 20,5 12 13.8 15.87 18.2505 20.988075 21,5 23.9842300342 23.9460899834 23.9013795156 23.8489667398 23.7875247733 22,5 -9.79369201369 -8.72510266003 -7.54588513957 -6.23938669591 -4.7Value is either too large or too small. Re-enter. "Use cursor keys to position cursor (UP,DOWN,RIGHT,LEFT,CAN) " Improper filename. Examples: S82BUDG, B:ACTUAL, VERS12 "Expecting a number. You entered non-numeric characters." Choose any command and enter the command number like 111 Cannot use FIX on this command. Please see manual. "Attempt to delete program steps when there is no program." "Too many steps in a program. You can have 100 steps." No program steps in memory. "Press any cursor key to recover your display. " "This report may be too wide for the normal width printer " "There is no file on this diskette with this name." "The content of this file is incorrect. (e.g. old version?)" "Hit RETURN to see the available tables or programs " cancelled. "No more tables/programs on this drive." "This report is too wide to print. Maximum width is 254 cols" "Use cursor keys to select a row (UP, DOWN, CANCEL)" "Use cursor keys to select a column (RIGHT,LEFT,CANCEL)" "Current table does not have enough columns for DEPR/LOAN." "Improper method. Use SET DEPR to enter proper values." "W-22 Sum of cashflows is less than 0. IRR is negative." "W-23 Interest rate is 0. Use SET LOAN to enter LOAN inputs." "W-24 Use SET LOAN to enter proper inputs for LOAN command." "W-25 Cashflows have no change in signs. No solution for IRR." "W-26 Cashflows have more than one change in sign. CAUTION." "W-27 Life value less than 1. Cannot compute loan/depr." "Improper tax schedule. Use SET SCHED to enter schedule." "New table is smaller than current table dimensions. Enlarge?" Program steps in memory have been cleared. "Formula is too complex. Symbol table is full." Cannot use the SET DEPR/LOAN/SCHED or DO TAX commands in cols. "IRR: Can only handle 50 values. " This add-on option is not available in your copy of MicroPlan. Cannot load different size tables in a program. The table has different dimensions from current. Changing size Program mode on. Command has been saved. Please SAVE PGM. Cannot load row and column titles from different size tables. "null command." Your program already exists. Continue with save? "saved." "Syntax Error." Your file already exists. Continue with save? OK to erase current data? OK to erase current program? No help files. SET PAPER; HIT RETURN. hit RETURN; to continue. IRR: Divergence. Cannot get solution after 50 trials. W-50 Write error - is disk full? W-51 null W-52 null OK to erase current program? No help files. SET PAPER; HIT RETURN. hit RETURN; to continue. JP.DIRERASED CURRENT= UNDEFINED NAMESTEPSNUMBER OF COLUMNSMENUROWSCOLSSTEPTO STEPDRIVE DESCRIPTION)TYPE (DATA=0,SUBT=1,HEAD=2,NOTE=3,OMIT=4) UNDERLINE !TRAILING BLANK LINES (NEW PAGE=9)DECIMAL PLACES (0-3 OFF=4)FORMAT COLUMN WIDTHFOLLOWING WHICH STEP!ERROR IF:FILETABLEPROG.DIRERASED.TBL##############,###.####BB<BB<@PBxYMPSET.TBL.TBL//xTABLE.LOG.LOG.LOGPROG (A-P):(NO=0,[-]=1,[=]=2,[_]=3)(NO=0,[%]=1,[$]=2,NO,=3)12E`SeEv2xMPSET.TBL.LOG.TBLTABLEPROG.DIR.FILMPMENU MPHELP.FIL.HLPz!M"}"}!M"}!M5%!M5%!M5%!M5%!M5%!M5%!M5%!M5%!M5%!N5%! N5%!N5%!N5%!!N5%!.N5%!YN5%!eN5%!N5%!N5%!N5%!N5%}Q>!%'qQ*{*%!*ziD"'*z|MQ*#*'*{{ozqQ*z*')^#V"#*#* {|+Q*#Q>!+'Q*{*+!*ziD"'*z|ʮQ*)*'*{{ozQ*z*')^#V")*)* {|ŒQ*)rR>!5'fR*5!!!͖A75%*7Ϳ%|'R-!{͉*975%!-*z|3R!-!N*7!G)|_R*7!-͎*975%!-!4* {|Q!-!dS͠*z|*z++|җR͙iÚRi*z#R+)R~#foSSSTT*z*z{ozg|RÚR*z|RJG*z+++++++|R* {*{{ozg"{äS*z++++++|"S!"z!"zJG*z"z9:ÚR*z+++++|8S!"zäS*z*z{ozKSxR*z"zj *z*z)^#V "!!ͦ2!NmͰmͰ!N$S!4!"z* {"z* {"zÚR* {"zJGÚR4KvH"z͖L*z|SͼI"z*z|S!"zL*zq:*z|SI*z|S͟JvH"z*z*z)^#V#"Y*Y"[NT*[J"z*z{zGT*z*[)^#Vq:GU*[#"[*z}|T*z+++|ƒT!"z*{+*z^#Vog"zÆTU*zog*z^#V#"Y*Y"[T*[ogJ"z*z{zT*z*[)^#Vogq:GU*[#"[*{}|T*z++++|U!"z*z+*z^#V"zT*z"zJG*z^#Vq:*z|7UL!"zHH* {"z͖L*z|SU^Uu*]ÄU*z!! &!N$/W_"_*_GW>!c'e!N5%*9z5%*c+|½Ue!N5%*{z5%*c++|Ue!N5%*{z5%*z*9$U*z5%!"g!!8Vͷ*{*ë́$!N̈́$!P!!>!4!"g!!3Wͷ*c{z[V**z̈́$!!U4**{̈́$*{̈́$!-!U4*e*̈́$!!!͖A͹&i5%*z|ʦVôV*iͿ%|´VV*ia5%*9e5%*9i5%JG*zq:*g{zV!' *a*g|W!4xV!!iix*i!N$!WV*i!!U4xV!4!' U*avW*zͿ%{zrWaU|rW*{*z̈́$z5%*kWaU|W*z\%A}o|g"o!"q!"sõW*q "q*s#"s*o}|W*qW!*mY>!w'!"s!"[aU|6X*y!͉%*ẅ́$w5%*y!! &y5%*{!!P &{5%!!Xͷ*w*̈́$!P!!>!!XͷX!!iix*i*yͿ%͉%*y$˜X*s"[X*[|*i*$ҺX*s"[*s#"s* {|hX*w*̈́$!P!!>q*[|X*s"[!!Yͷ!*[*{͐!' !)4*uhY!"z!"z*9{5%!"sWY*z*s)*95%*s#"s*z}|@Y*}yZ*9{5%!"sÔY*h{*s)*95%*s#"s}Y!"sY*z*s)*ss#r*z*s)*ss#r*z*s)*95%*z*s)6#6*z*s)*95%*s#"s*z}|Y!"shZ*z*s)*ss#r*z*s)*ss#r*z*s)*95%*z*s)6#6*z*s)*95%*s#"s*z}|Z*ÖZ*z*z!!!z(*Á[*z{zZ!4kY"Y!!!!!z(!!!!z(!!!!z(!!!!z(!!!!z(!!!!z(!!!!z(!!!!z(!!!!z(!!!!z(!!!!z(*Îb>!'* {"!!aͷ*!Ö́$!!!>!!naͷ!!]!]!]x**z{oz**z{oz \͖a \|Z*z|\!' *!!p{]!r{]!t{]!v{]x!!x{]!z{]!|{]!~{]x!!{]!{]!{]!{]x!!{]!{]!{]x!!{]!{]!{]!{]!{]x!!j{i!l{i!i!i!ix!!`{]!b{]!d{]!f{]x!*h{ix!*h{ix!*h{ix!!z]!z]x!!{]!{]x!!z]x!"s^*s*z}|]!!o]!o]!i!o]!ix^!*z*s)]*z*s)]*z*s)i*z*s)]*z*s)ix*s#"s*}|]!"sè^*s*z}|\^!!o]!o]!i!o]!ixá^!*z*s)]*z*s)]*z*s)i*z*s)]*z*s)ix*s#"s*}|$^V_!!s]x*s*{{oz^^_!!]x!"qI_*s*z}|*q*z}|#_!!cxB_!*z*s)^#V*q)))cx*q#"q*}|^* {|¸^!' ! O5%*Ϳ%*{*{{ozg"o*{|”_*o+"o**o*{++ &"Ö́${5%*{+*{{ozg"o*{++*{{ozg"*{{z_*o+"o*+"*o!U *o}o|g"o*!U *}o|g"*o!%Oy-*{og!-Oy-!ͷ!5Oa!{͎*!=Oy-*{og!EOy-!ͷ$!MO !{͎*{og!]Oy-!UOI!{͎*{}o|g*{{ozg*{U +"{*{*z{z`*z+"{*{}o|g*{#*{b 0512+ED42 DB 0EDH,B*8+42H jrc nohash 0514+381D DB 38H,NOHASH-$-1 0516 220400 shld hleft 0519 2A0200 lhld hlast 051C E5 push h 051D 09 dad b 051E 220200 shld hlast 0521 C1 pop b ; HASH alloc'd for this drive gh0: 0522 211600 lxi h,+22 0525 19 dad d ;point to hash address 0526 71 mov m,c ;set hash buffer address for this drive. 0527 23 inx h 0528 70 mov m,b 0529 23 inx h 052A 3602 mvi m,hbnk ;set hash bank also. ghz: 052C EB xchg ;put DPH in (HL) for BDOS 052D 5E mov e,m 052E 23 inx h 052F 56 mov d,m ;DE=sectrn 0530 2B dcx h 0531 C1 pop b ;BC=dpb 0532 C9 ret nohash: 0533 01FFFF lxi b,0ffffh jr gh0 0536+18EA DB 18H,GH0-$-1 setup$dph: 0538 B7 ora a ;reset [CY] 0539 2A6F00 lhld @cmode ;HL=modes bit 7,m ;check for hard-disk drive (modes not standard) 053C+CB7E DB 0CBH,7*8+M+40H 053E C0 rnz 053F CD0000 call ?getdp 0542 37 stc 0543 C0 rnz 0544 2A7100 lhld @dph ;restore dph 0547 71 mov m,c ;set XLAT table 0548 23 inx h 0549 70 mov m,b 054A 010B00 lxi b,12-1 054D 09 dad b ;point to dpb 054E 4E mov c,m ;get DPB addr 054F 23 inx h 0550 66 mov h,m ;(HL=dpb) 0551 69 mov l,c 0552 EB xchg 0553 011100 lxi b,17 ldir 0556+EDB0 DB 0EDH,0B0H 0558 B7 ora a ;reset [CY] 0559 C9 ret 055A 010000 home: lxi b,0 ; same as set track zero settrk: sbcd trk 055D+ED43 DB 0EDH,43H 055F+2006 DW TRK 0561 C9 ret setsec: sbcd sect 0562+ED43 DB 0EDH,43H 0564+2206 DW SECT 0566 C9 ret setdma: sbcd @dma 0567+ED43 DB 0EDH,43H 0569+7300 DW @DMA 056B 3A4103 lda @cbnk ; default DMA bank is current bank 056E 321B06 setbnk: sta @dbnk 0571 C9 ret 0572 6960 sectrn: mov l,c ! mov h,b 0574 7AB3C8 mov a,d ! ora e ! rz 0577 EB096E2600 xchg ! dad b ! mov l,m ! mvi h,0 057C 2B dcx h ;sectors numbered 0 - (n-1) 057D C9 ret 057E 1E06 read: mvi e,6 ;read entry is +6 0580 C38505 jmp rw$common ; use common code 0583 1E09 write: mvi e,9 ;write entry is +9 rw$common: ;do any track/sector/side conversion... 0585 AF xra a 0586 321506 sta @side 0589 2A2006 lhld trk 058C 221606 shld @trk 058F 2A2206 lhld sect 0592 221806 shld @sect 0595 2A6F00 lhld @cmode bit 7,m ;floppy or hard-disk? 0598+CB7E DB 0CBH,7*8+M+40H jrnz rw0 059A+2018 DB 20H,RW0-$-1 059C 23 inx h 059D 23 inx h 059E 23 inx h bit 6,m ;DS 059F+CB76 DB 0CBH,6*8+M+40H jrz rw0 05A1+2811 DB 28H,RW0-$-1 05A3 7E mov a,m 05A4 E60E ani 01110b ;DSALG 05A6 21BB05 lxi h,dstbl 05A9 4F mov c,a 05AA 0600 mvi b,0 05AC 09 dad b 05AD 4E mov c,m 05AE 23 inx h 05AF 66 mov h,m 05B0 69 mov l,c 05B1 CDFA02 call icall 05B4 7B rw0: mov a,e 05B5 2A6D00 calmod: lhld curmdl 05B8 C3F402 jmp addjmp ; leap to driver ;; 0 1 2 3 4 5 6 7 05BB F805E005DAdstbl: dw wrap,alt1,cont1,cont2,alt2,dsret,dsret,dsret 05CB 3A1C06 cont2: lda @pspt ;as done by Gnat srlr a ;SPT must be EVEN 05CE+CB3F DB 0CBH,38H+A 05D0 4F mov c,a 05D1 211806 lxi h,@sect 05D4 7E mov a,m 05D5 91 sub c ;don't change the sector number on side 1 05D6 D8 rc 05D7 4F mov c,a ;save for cont1 jr side1 05D8+182F DB 18H,SIDE1-$-1 05DA CDCB05 cont1: call cont2 05DD D8 rc 05DE 71 mov m,c 05DF C9 ret ;side1 already set 05E0 211606 alt1: lxi h,@trk rarr m 05E3+CB1E DB 0CBH,18H+M 05E5 3E00 mvi a,0 05E7 17 ral jr sside 05E8+1821 DB 18H,SSIDE-$-1 05EA CDE005 alt2: call alt1 ;Kaypro 05ED B7 ora a ;side 0? 05EE C8 rz ;yes, done. 05EF 211806 lxi h,@sect ;for KAYPRO, sectors on side 1 05F2 3A1C06 lda @pspt ;are numbered PSPT+1 to PSPT*2. 05F5 86 add m ; 05F6 77 mov m,a 05F7 C9 ret wrap: lbcd @tps ;B=tracks on side 1, C=tracks on side 0 05F8+ED4B DB 0EDH,4BH 05FA+1D06 DW @TPS 05FC 3A1606 lda @trk ;(for all except Z17, B=C) 05FF B9 cmp c 0600 D8 rc neg 0601+ED44 DB 0EDH,44H 0603 81 add c 0604 80 add b 0605 3D dcr a 0606 321606 sta @trk 0609 3E01 side1: mvi a,1 060B 321506 sside: sta @side 060E C9 dsret: ret 060F 321A06C9 multio: sta @cnt ! ret 0613 AFC9 flush: xra a ! ret ; return with no error 0615 @side: ds 1 ; current side of media (floppy only) 0616 @trk: ds 2 ; current track number 0618 @sect: ds 2 ; current sector number 061A 00 @cnt: db 0 ; record count for multisector transfer 061B 00 @dbnk: db 0 ; bank for disk DMA operations 061C @pspt: ds 1 061D @tps: ds 2 061F @rcnfg: ds 1 0620 trk: ds 2 0622 sect: ds 2 0624 6406 @dtacb: dw dtacb1 0626 2806 @dircb: dw dircb1 0628 FF dircb1: db 0ffh ;drive 0629 0000000000 db 0,0,0,0,0 062E 0000000000 dw 0,0,2100h ;directly after CCP image (max 8K CCP) 0634 00 db 0 0635 3706 dw dircb2 0637 FF dircb2: db 0ffh ;drive 0638 0000000000 db 0,0,0,0,0 063D 0000000000 dw 0,0,2500h 0643 00 db 0 0644 4606 dw dircb3 0646 FF dircb3: db 0ffh ;drive 0647 0000000000 db 0,0,0,0,0 064C 0000000000 dw 0,0,2900h 0652 00 db 0 0653 5506 dw dircb4 0655 FF dircb4: db 0ffh ;drive 0656 0000000000 db 0,0,0,0,0 065B 0000000000 dw 0,0,2d00h ;dir buffers: 2100-3100 0661 00 db 0 0662 0000 dw 0000 ;end of DIR buffers 0664 FF dtacb1: db 0ffh ;drive 0665 0000000000 db 0,0,0,0,0 066A 0000000000 dw 0,0,3100h 0670 00 db 0 0671 7306 dw dtacb2 0673 FF dtacb2: db 0ffh ;drive 0674 0000000000 db 0,0,0,0,0 0679 0000000000 dw 0,0,3500h 067F 00 db 0 0680 8206 dw dtacb3 0682 FF dtacb3: db 0ffh ;drive 0683 0000000000 db 0,0,0,0,0 0688 0000000000 dw 0,0,3900h 068E 00 db 0 068F 9106 dw dtacb4 0691 FF dtacb4: db 0ffh ;drive 0692 0000000000 db 0,0,0,0,0 0697 0000000000 dw 0,0,3d00h ;data buffers: 3100-4100 069D 00 db 0 069E 0000 dw 0000 ;end of data buffers 06A0 0041 @scrbf dw 4100h ;scratch buffer 4100-4500 ; Max. system space: 4500h to "bnktop", 38K if 8K common. 06A2 end 02F4 ADDJMP 05E0 ALT1 05EA ALT2 0258 AUXIN 022F AUXIST 0297 AUXOST 0272 AUXOUT 03BE BB0 0000 BC 03A8 BCDBIN 0005 BDOS 008F BDOSE 0007 BELL 03B6 BINBCD 0000 BIOS0 FC00 BNKDOS 02FB BNKSEL 0038 BNKSIZ E000 BNKTOP 0006 BOOT 05B5 CALMOD 0100 CCP 037A CCPCOM 036F CCPMSG 0379 CCPRECS 01F4 CDTBL 0217 CINIT 023E CISNEXT 0012 CLRCNT 00C2 CLRPIO 0204 CNULL 00E0 COMPAG 0282 CONEXT 0253 CONIN 0292 CONOST 026D CONOUT 022A CONST 05DA CONT1 05CB CONT2 02A7 COSNEXT 0000 CPM 000D CR 006D CURMDL 0002 DE 0078 DEFSRC 01AF DEVTBL 0628 DIRCB1 0637 DIRCB2 0646 DIRCB3 0655 DIRCB4 040A DNULL 060E DSRET 05BB DSTBL 0664 DTACB1 0673 DTACB2 0682 DTACB3 0691 DTACB4 01F0 ERRX 0000 FALSE 039A FCBNR 0010 FDC 0613 FLUSH 03E6 GETDRV 01F7 GETT 0522 GH0 04EA GH2 04F2 GH3 052C GHZ 0087 GOCCP 0002 HBNK 0004 HL 0002 HLAST 0004 HLEFT 055A HOME 0DF0 HSIZE 0100 HSTART 0081 IAIVEC 0083 IAOVEC 02FA ICALL 007D ICIVEC 007F ICOVEC 0085 ILOVEC 0066 IN0 0086 IN1 00AF IN2 0094 IN3 00B3 IN4 00C9 IN5 02EA INDJMP 02E0 INDJMP1 00C7 INITDONE 025E INSCAN 025B INSCAN0 0143 INTSTK 012E IOSTK 012E IOSTKP 024A IS0 0143 ISTK 0239 ISTSCAN 0232 ISTSCAN0 0004 IX 0004 IY 000A LASTMON 000A LF 0277 LIST 029C LISTST 03E5 LSTMNTH 003F MMU 03D0 MONDAYS 0329 MOVE 004B MOVEV 060F MULTIO 01ED NOCCP 0533 NOHASH 00BA NOTCHR 04A1 NOTLGI 0216 NULL 0213 NULLI 0130 NULLPIO 0130 NULLSIO 000A NUMRTC 0002 NUMTIC 02A2 OSTSCAN 029F OSTSCAN0 027D OUTSCAN 027A OUTSCAN0 0020 PIO 0022 PIOACTL 0020 PIOADAT 0023 PIOBCTL 0021 PIOBDAT 00C0 PIOVEC 057E READ FD00 RESDOS 0024 RTC 0020 RTCADR 0006 RTCDAT 0005 RTCDAY 0024 RTCDTA 0009 RTCENT 0004 RTCHRS 0011 RTCIC 0010 RTCIS 0003 RTCMIN 0007 RTCMON 0002 RTCSEC 0014 RTCSTS 0008 RTCYRS 05B4 RW0 0585 RWCOMMON 031C SAVEDE 04BE SC0 04C7 SC1 0197 SEARCH 0622 SECT 0572 SECTRN 04B3 SELCOM 0423 SELDSK 049D SELERR 04D3 SELXIT 056E SETBNK 0567 SETDMA 017C SETJUMPS 0562 SETSEC 028D SETT 055D SETTRK 0538 SETUPDPH 0390 SETYEAR1 0609 SIDE1 0342 SIGNON 0004 SIO1 0006 SIO1CTLA 0007 SIO1CTLB 0004 SIO1DATA 0005 SIO1DATB 00A0 SIO1VEC 000C SIO2 000E SIO2CTLA 000F SIO2CTLB 000C SIO2DATA 000D SIO2DATB 00B0 SIO2VEC 019A SNEXT 007C SRCTYP 060B SSIDE 010E STACK 02DD SW0 02C9 SWTOSYS 03A1 SY0 0014 SYSCTL 03A6 THREAD 01FB TI0 0204 TI1 02F9 TI10 031E TI11 0321 TI12 032A TI13 0355 TI14 0357 TI15 0363 TI16 036E TI17 0385 TI18 0247 TI1@0 025B TI2 0261 TI3 0286 TI4 027C TI5 02AC TI6 02B4 TI7 02C6 TI8 02D5 TI8@0 02E8 TI9 0145 TICK 039E TICTBL 03DC TIME 03E4 TIMECNT 03E0 TIMEDAT 03DF TIMEDAY 03DE TIMEHRS 03DD TIMEMIN 03E1 TIMEMON 03DC TIMESEC 0309 TIMEX 03E3 TIMEYRS 0077 TMPDRV 01CD TO0 01C7 TO1 01E3 TO2 017C TO3 0158 TO4 0178 TO5 0181 TOO3 0620 TRK FFFF TRUE 00C5 TWICE 7530 VERS 00C4 WBOOT 0152 WBOOT1 0075 WBTRAP 05F8 WRAP 0583 WRITE 02BA XITUSR 0328 XMBNK 0166 XMOVCCP 031E XMOVE 02C6 XU0 0331 XXM0 0051 ?BNKSL 0042 ?DRTBL 003C ?DVTBL 0000 ?GETDP 0000 ?SERDP 0054 ?STBNK 01C6 ?TIMOT 006A @ADRV 0000 @AIVEC 0000 @AOVEC 0341 @CBNK 0000 @CIVEC 006F @CMODE 061A @CNT 0000 @COVEC 01B3 @CTBL 0000 @DATE 061B @DBNK 0626 @DIRCB 0073 @DMA 0071 @DPH 0063 @DSTAT 0624 @DTACB 03EA @DTBL 0000 @ERMDE 0000 @HOUR 0000 @LOGIN 0000 @LOVEC 0000 @LPTBL 0000 @MIN 0000 @MXTPA 006B @PDRV 061C @PSPT 061F @RCNFG 006C @RDRV 06A0 @SCRBF 0000 @SEC 0618 @SECT 0615 @SIDE 061D @TPS 0616 @TRK 00A0 @VECT OHASH 00BA NOTCHR 04A1 NOTLGI 0216 NULL 0213 NULLI 0130 NULLPIO 0130 NULLSIO 000A NUMRTC 0002 NUMTIC 02A2 OSTSCAN 029F OSTSCAN0 027D OUTSCAN 027A OUTSCAN0 0020 PIO 0022 PIOACTL 0020 PIOADAT 0023 PIOBCTL 0021 PIOBDAT 00C0 PIOVEC 057E READ FD00 RESDOS 00 INI ; or OUTI 00C7+EDA2 DB 0EDH,0A2H 00C9 C2C600 jnz rd3 00CC 76 rd2: hlt rd22: INI ; or OUTI 00CD+EDA2 DB 0EDH,0A2H 00CF C2CC00 jnz rd2 00D2 76 rd1: hlt rd12: INI ; or OUTI 00D3+EDA2 DB 0EDH,0A2H 00D5 C2D200 jnz rd1 00D8 FB ei 00D9 76 hlt 00DA DB10 rd0: in fdcstat 00DC 0F rrc jrc rd0 00DD+38FB DB 38H,RD0-$-1 00DF 07 rlc 00E0 A2 ana d 00E1 F5 push psw 00E2 3ED0 mvi a,11010000b ;reset 1797 to TYPE$I status 00E4 D310 out fdccomd ; 00E6 DB10 in fdcstat ; 00E8 3A9B00 lda savNMI 00EB 326600 sta 0066h 00EE 3E00 mvi a,0 00F0 CD0000 call ?bnksl 00F3 F1 pop psw lspd savSTK 00F4+ED7B DB 0EDH,07BH 00F6+9C00 DW SAVSTK 00F8 C9 ret 00F9 = thread equ $ ;must be last statement in "cseg" dseg ;put most everything in banked memory... 0000 0000000000dphtbl: dw 0,0,0,0,0,0,dpb0,csv0,alv0,@dircb,@dtacb,0 ;hash buffers 0018 00 db 0 ;(hash buffer bank number) ;are allocated 0019 0000000000 dw 0,0,0,0,0,0,dpb1,csv1,alv1,@dircb,@dtacb,0 ;by main BIOS 0031 00 db 0 ;during LOGIN. 0032 0000000000 dw 0,0,0,0,0,0,dpb2,csv2,alv2,@dircb,@dtacb,0 004A 00 db 0 004B csv0: ds (256)/4 ;max dir entries: 256 008B csv1: ds (256)/4 00CB csv2: ds (256)/4 010B alv0: ds (400)/4 ;max dsk blocks: 400 016F alv1: ds (400)/4 01D3 alv2: ds (400)/4 init: 0237 DB10 IN fdcstat ; CLEAR WD-1793 from power-on (or whatever) 0239 F5 push psw 023A C31504 jmp setmot ; set timeout in case no more activity ; RET login: pushix ;save IX 023D+DDE5 DB 0DDH,0E5H lixd @cmode 023F+DD2A DB 0DDH,2AH 0241+0000 DW @CMODE inxix 0243+DD23 DB 0DDH,23H inxix 0245+DD23 DB 0DDH,23H sixd cmode ;save cmode+2 for faster access to modes 0247+DD22 DB 0DDH,22H 0249+B906 DW CMODE 024B AF xra a 024C 32BD06 sta selerr ; NO SELECT ERROR (YET) bitx 7,+1 ; SHOULD WE READ TRACK 0 SECTOR 0 ? 024F+DDCB017E DB 0DDH,0CBH,+1,7*8+46H 0253 C46A02 cnz physel bitx 7,+0 ; IS IT A 5.25" DISK ? 0256+DDCB007E DB 0DDH,0CBH,+0,7*8+46H jrnz login1 025A+2007 DB 20H,LOGIN1-$-1 025C 3ABD06 lda selerr 025F B7 ora a ; was there a select error 0260 CCAD03 cz physel3 ; CHECK FOR HALF TRACK: must update DPB. login1: popix 0263+DDE1 DB 0DDH,0E1H 0265 3ABD06 lda selerr ;return error code, error during configuration. 0268 B7 ora a 0269 C9 ret physel: 026A 210000 lxi h,0 ; 026D 220000 shld @trk ; TRACK 0 0270 220000 shld @sect ; SECTOR 0 0273 2A0000 lhld @scrbf ;use BIOS scratch buffer to read Z37 label. 0276 220000 shld @dma ;we must also make sure that bank 0 is selected. 0279 AF xra a 027A 320000 sta @dbnk ;set disk bank=0 (the bank we're in now) 027D 320000 sta @side ;side=0 0280 32BF06 STA MODFLG ; RESET CHANGED MODE FLAG 0283 3EFF mvi a,true ; flag a select operation 0285 32BE06 sta selop 0288 3E05 MVI A,5 ; 5 RETRYS FOR A SELECT OPERATION 028A 32B606 STA RETRYS 028D CDFD03 CALL READ ; TRY READING LABEL AT DENSITY ; CURRENTLY INDICATED IN TABLES 0290 CABA02 JZ PHYSEL1 ; BR IF SUCCESSFUL bitx 7,+0 0293+DDCB007E DB 0DDH,0CBH,+0,7*8+46H 0297 C29F03 jnz physel6 ; if 8" error out 029A 3E05 MVI A,5 ; RESET RETRYS TO 5 029C 32B606 STA RETRYS 029F 32BF06 STA MODFLG ; SET CHANGED MODE FLAG ; IX=mode bytes ldx a,+1 ; TRY OTHER DENSITY 02A2+DD7E01 DB 0DDH,A*8+46H,+1 02A5 EE10 XRI 00010000b stx a,+1 02A7+DD7701 DB 0DDH,70H+A,+1 02AA CDFD03 CALL READ ; TRY TO READ LABEL jrz physel1 02AD+280B DB 28H,PHYSEL1-$-1 ldx a,+1 02AF+DD7E01 DB 0DDH,A*8+46H,+1 02B2 EE10 xri 00010000b ; return mode bytes to former state stx a,+1 02B4+DD7701 DB 0DDH,70H+A,+1 02B7 C39F03 jmp physel6 ; jmp to error 02BA AF PHYSEL1:XRA A ; ZERO ACCUM. 02BB 0619 MVI B,LABLEN ; GET LENGTH OF LABEL 02BD 2A0000 lhld @scrbf 02C0 110400 LXI d,LABEL 02C3 19 dad d 02C4 86 CHKLAB1:ADD M 02C5 23 INX H DJNZ CHKLAB1 02C6+10FC DB 10H,CHKLAB1-$-1 02C8 3C  {ozg"{*+|(a*z"z*z"{!"*{5%!!ͦ2*&{wJG*z^#Vq:!"{!"{ͨ>*z͍6*!' ! 4*{"*! 4*{"**z+|*z++|a!#4* {"z!' ***z}|**z}|a_b!4*zx&!eÖ́$*zx&̈́$!!U4*{!!!͖A͹&75%*z|Bb**7!hO$_bkY|Z!"*!' !$4͙Z*"z*"z!"zj !kO "*ñf>!'* {"!"o*z+|²bb!!bͷyW*!rÖ́$!!!>!' !+4vE"o*z|b**!xÖ́$!!!>q!*z̀*z̀*z͹!*p{̀*r{̀*t{̀*v{͹!*x{̀*z{̀*|{̀*~{͹!*{̀*{̀*{̀*{͹!*{̀*{̀*{͹!*{̀*{̀*{̀*{̀*{͹!*j{W*l{W*W*W*͐!*`{̀*b{̀*d{̀*f{͹!*h{^#V͐!*h{^#V͐!*h{^#V͐!*z̀*z͹!*{̀*{͹!*z͹!"sd!*z*s)^#V̀*z*s)^#V̀*z*s)^#VW*z*s)^#V̀*z*s)^#V͐*s#"s*z}||d!"sLe!*z*s)^#V̀*z*s)^#V̀*z*s)^#VW*z*s)^#V̀*z*s)^#V͐*s#"s*z}|d!"se*z"q~e*q+|wee*q+"q*z*s)^#V*q)))̀!ke!*s̀*q͹!"e!*z*s)^#V*)))̀Ͱ*#"*q}|e*s#"s*z}|be!*{͹!' *{5%*! 3*h{^#V!~Ö́$*h{^#V̈́$!Ö́$*h{^#V̈́$!7͉%̈́$*{̈́$*zx&̈́$!Ö́$*zx&̈́$5%**{!OW*jg>!'* {"!!Ygͷ*!Ö́$!!!>!!$gͷ!"sg!*z*s)ix*s#"s*z}|f!' *{5%*s+"z*zx&*{̈́$*̈́$ͨ4*! 4*{"*Óh>!'* {"*z|•g! 4* {"z*yW*z+|¤gg!!gͷ*!Ö́$!!!>!' !(4vE"o*z|g**!Ö́$!!!>q!"s)h!*z*s)^#V͐*s#"s*z}| h!' *{5%*! 3*̈́$*{̈́$*zx&̈́$*{̈́$*̈́$5%**{!OW* i>!'*{ozg"*!U {ozg"*! U {ozg"*!U {ozg"*!U {ozg"*li>!À'*À!U "* *À}o|g"*! U "*  *}o|g"*Ùi>!ǀ'*ǀx&*̈́$!2!U4*ŀ*z#i+)i~#fo* {|*o9:ͽKJG* {"z*z͑b* {"z*z"s'q*{"qq*z*s)^#V*z^#V*z*q)^#V)))!͛*q#"q*{}|p*s#"s*z}|p* {"ziq!!ͦ2*z{5%yW* {"zJG*zq:* {"zJG*zq:ͨ>cq!4*z"z*z|үq9:*z*{)^#Vq:* {"z*{7r*9!!*{͖A5%*z|qìp*Ϳ%{zr*z*z)*5%*z*z)^#V7!!J;|rͨ>* {|²q* {"z*ˀ"z!"z*{*{̈́$*z#x&̈́$ͨ4* {"z!"z*π*̀{ozg#"o*oog*z"z*̀"sðr*z*s)*s*o*z^#V5%*s#"s*z}|r!"sr*s*z*z*95%*s#"s*o}|r*{ͨ4*z*z{oz s!%4!!ͦ2*z}{oz*sL*.{m*zmj ͝* {"z*z++|Ts!%4*zʹf!"z*zmg* {"z"Y*9{5%!"z* {"z*{ͨ4* {"{͙ZN!͎!!sO!!͎!z!y!ͷ"׀O!ـ͎!!ـtـ!O͉!!ـy!ͷ"*׀*}|1t*"׀*׀c{zDt!c"׀*!!*׀iD"*z|kt*{"zçu**{{oz™t*z}{oz“t! "Ùt!"*)))!ـy! *))) ͷ"!!y*F *)))Fͷ"**}| u*"*!<!*iD"*z|3u*{"zDt**{{ozIu*"*x&*{̈́$*̈́$!Ö́$*x&̈́$*{̈́$*̈́$ͨ4vE*z|ʛu*{"zDt*"z*"z*{"{!"z!"z!"z!"zj !O "* {"z!"z!"z*z"z!"{*z"{!"z*z"z!"z*z"z|ZkY"Y!"z*{"{!"z!"`{!"b{!"d{!"f{!"{!"{iq* {"z!!ͦ2*&{wJG*zq:*zͿ%|ƒvͨ>*z͍6*{"z* {"z*z̈́["*|«vͨ>*z͍6*z++|½v!%4*zʹf|v!"z!"z*z"z9:JG*z͑b*zmg* {"ze!P5%we! P5%* {"zyW!!Lwͷ*z*ë́$!!!>!͑ *{ͨ4Sw! 4*e!P$lwe!P5%uwe!P5%aU|ʨw*z!͉%*ë́$e5%*z!! &z5%!!0xͷ*e!$P̈́$!P!!>!!*xͷ!"s"x!!рix*р*zͿ%͉%*z$x!*s*͐*x*s#"s* {|w!' !"4* {"z* {"z*z++|Px!!(yͷ*z!*P̈́$!!!>*z!!!z(*z!!!z(!!xͷx!!s]x*s*{{ozxx!*z*s)i*z*s)]x* {|¦x!' *z!0P$y {!8P5% y*z!DP̈́$ {5%!͍6! 4* {"z*{z5%ͽp*z|Kyrj ͝w!9-ʜ-DM͑+w ʹG--ʘ-!͉%*ë́$e5%*z!! &z5%!!0xͷ*e!$P̈́$!P!!>!!*xͷ!"s"x!!рix*р*zͿ%͉%*z$x!*s*͐*x*s#"s* {|w!' !"4* {"z* {"z*z++|Px!!(yͷ*z!*P̈́$!!!>*z!!!z(*z!!!z(!!xͷx!!s]x*s*{{ozxx!*z*s)i*z*s)]x* {|¦x!' *z!0P MicroPlan is a financial planning worksheet. MicroPlan allows you to do row and column calculations electronically. Most of the screen displays your table. The commands on the right allow you to write titles and data into the table. You choose a command by typing the command number followed by the carriage return key. Some commands are not listed on the command menu. They are: 1. Backspacing: Use the DEL key. 2. Cancellation: Use the ESCAPE key. 3. Cursor movement: Use the arrow keys. 4. Function keys: Use any function key for commands or any alpha key for calculation commands. 1 format: Display format commands. Enter row & column titles, set row or column print options, look at options and move rows or columns 2 data: Display data entry commands. Enter data, move the data pointer fix, nullify and goto commands. 3 math: Display math commands. Arithmetic, cumulate, negate, get, ceiling, floor, and row and column summations. 4 finance: Display finance commands. Depreciaion, mortgages, internal rate of return, ratios, percentages, growth and tax schedules. 5 print: Display print commands. Set report options, titles and print reports. Reports can be sent to disk files. 6 status: Display status commands. Range settings, mode selection, and selection of compute order. 7 HELP command Explains each command. Describes the commands and explains usage. 9 STOP verify Clears the display and exits to CP/M. The current table is not automatically saved. 10 utility: Display utility commands. Save/load tables, re-dimension table size, select drive, reset and redisplay screen. 11 program: Display program commands. Save, load, clear, print, list and erase programs. 12 stats: (This section is an add on module) Display statistical commands. Smoothing, moving averages, mean variance, standard deviations and curve fitting. 13 tables: (This section is an add on module) Display external table access commands. Consolidations, variance analysis, and commands to link tables or to G/L. 14 link: (This section is an add on module) Display external data access commands. DIF interface, link to G/L or data management files, Posting and Tabulation. 16 format: Display format commands. Enter row & column titles, set row or column print options, look at options and move row or columns. 17 INSERT Insert a row or column at the current data pointer position. (Insert really gets an empty row/col from the end of the tbl) 18 DELETE Delete a row or column at the current data pointer position. (Delete really moves row/col to the end of the table) 19 rows: Row section of format commands. 20 ROW TITLE title ... ESCAPE (DOWN, UP, ESCAPE) Enter or change row titles. Each title entered is placed in the current row. The cursor keys move the current row pointer. 21 SET TYPE row option ... ESCAPE Allows you to specify the type of row, underlining, decimal places, spacing and special formatting for each row. 22 SHOW ROWS Display the current options for each row. Also shows the commands stored for each row. 23 REORDER old-row new-row Move old-row into the position new-row. Use this command to insert new rows or delete rows from your table. 24 cols: Column section of format commands. 25 COL TITLE title1 title2 ... ESC (RIGHT, LEFT, ESCAPE) Enter or change col titles. Each title entered is placed in the current col. The cursor keys move the current col pointer. 26 SET TYPE column option ... ESCAPE Allows you to specify the column width, decimal places and special column formatting for each column. 27 SHOW COLS Display the current options for each column. Also shows the commands stored for each column. 28 REORDER old-column new-column Move old-column into the position new-column. Use this command to insert new columns or delete columns from your table. 29 data: Display data entry commands. Enter data, move the data pointer fix, nullify and goto commands. 30 ENTRY value ... ESC (UP, DOWN, RIGHT, LEFT, ESCAPE) Enter values into table. Cursor keys allow movement to any cell in the current table range settings. 31 ENTER value ... ESC (UP, DOWN, RIGHT, LEFT, ESCAPE) Enter values into table. Constant, grow and increase options allow quick entry. Cursor keys allow individual data entry. 32 CHANGE row, column <-- value Change one value in your table. 33 SELECT ROW row Move the data pointer to a new row of the table. Also, use the up and down cursor keys to move the data pointer. 34 SELECT COL column Move the data pointer to a new column of the table. Also, use the right and left cursor keys to move the data pointer. 35 FORMULA RESULT <-- formula Use a formula. Formulas may reference a row or column (Ln), values (Vr,c) or positive constants in the formula. 36 GOTO row column Position the display screen with row,column in the upper left corner of your terminal. 37 PLUG row, column <-- formula Use a formula to calculate results for a particular cell. The formula may reference table values (Vr,c) or constants. 38 FIX Re-computes the current row or column. Use cursor keys to move the data pointer to the right row or column before using FIX. 39 NULLIFY row/col Nullify command associated with a row or column. The data in the table is not affected. 40 math: Display math commands. Arithmetic, cumulate, negate, get, floor, ceiling and row and column summations. 41 ADD RESULT <-- row/col1 + row/col2 Add two rows or columns of values. 42 SUBTRACT RESULT <-- row/col1 - row/col2 Sutract the second row/col from the first row/col. 43 MULTIPLY RESULT <-- row/col1 * row/col2 Multiply two rows or columns of values. 44 DIVIDE RESULT <-- row/col1 / row/col2 Divide the first row/col by the second row/col. 45 NEGATE RESULT <-- - (row/col) Negate a row or column of values. 46 INVERSE RESULT <-- 1 / (row/col) Compute the inverse for a row or column of values. 47 INTEGER RESULT <-- INT(row/col) Compute the integer part of a row or column of values by dropping the fractional portion of a number. 48 ROUND RESULT <-- INT(row/col + 0.5) Round a row or column of values to the nearest whole number. 49 CUMULATE RESULT(t) <-- RESULT(t-1) + row/col(t) Compute cumulative sums for a row or column. Cumulate prompts for year zero value. Use for ending balance calculations. 50 ABSOLUTE RESULT <-- ABS(row/col) If a value is negative, the result is positive. If the value INR A JRZ PHYSEL2 ; BR IF CORRECT CHECKSUM 02C9+2812 DB 28H,PHYSEL2-$-1 02CB 3ABF06 LDA MODFLG 02CE B7 ORA A ; MODE BEEN CHANGED ? 02CF CAA403 jz physel7 ; NO KEEPING OLD MODE BYTES ldx a,+1 02D2+DD7E01 DB 0DDH,A*8+46H,+1 02D5 EE10 xri 00010000b ; return mode bytes to former state stx a,+1 02D7+DD7701 DB 0DDH,70H+A,+1 02DA C39F03 jmp physel6 ; jmp to error ; ; EXTRACT MODE INFORMATION FROM LABEL ; physel2: 02DD 2A0000 lhld @scrbf 02E0 110500 lxi d,LABHTH 02E3 19 dad d ; HL POINTS TO HEATH EXTENSION IN LABEL ldx b,-1 ; keep old format 02E4+DD46FF DB 0DDH,B*8+46H,-1 ldx c,-2 02E7+DD4EFE DB 0DDH,C*8+46H,-2 mvix 0,-1 02EA+DD36FF00 DB 0DDH,36H,-1,0 mvix 0,-2 02EE+DD36FE00 DB 0DDH,36H,-2,0 02F2 7E mov a,m 02F3 E6E0 ani 111$00000b 02F5 FE20 cpi 001$00000b ; z100 formats jrnz nf1 02F7+2006 DB 20H,NF1-$-1 setx 5,-1; ; set mode byte 02F9+DDCBFFEE DB 0DDH,0CBH,-1,5*8+0C6H jr setmode 02FD+182E DB 18H,SETMODE-$-1 02FF FE60 nf1: cpi 011$00000b ; z37 jrnz nf2 0301+2021 DB 20H,NF2-$-1 bit 2,m ; check for extended density 0303+CB56 DB 0CBH,2*8+M+40H jrz gf1 0305+2806 DB 28H,GF1-$-1 setx 4,-1 ; z37x 0307+DDCBFFE6 DB 0DDH,0CBH,-1,4*8+0C6H jr setmode 030B+1820 DB 18H,SETMODE-$-1 gf1: liyd @scrbf ; get cpm sectors per physical sector 030D+FD2A DB 0FDH,2AH 030F+0000 DW @SCRBF ldy a,+labhth+2 0311+FD7E07 DB 0FDH,A*8+46H,+LABHTH+2 0314 FE04 cpi 4 ; see if 512 byte sectors - if so set to z100 jrnz gf0 ; this is in here because the Z100 puts the 0316+2006 DB 20H,GF0-$-1 setx 5,-1 ; device type code in the label on 5" 0318+DDCBFFEE DB 0DDH,0CBH,-1,5*8+0C6H jr setmode 031C+180F DB 18H,SETMODE-$-1 gf0: setx 3,-1 ; z37 031E+DDCBFFDE DB 0DDH,0CBH,-1,3*8+0C6H jr setmode 0322+1809 DB 18H,SETMODE-$-1 ;; currently no 8" support in this module nf2: ; cpi 100$00000b ; z47 ; jrnz nf3 ; bit 2,m ; check for extended density ; jrz gf2 ; setx 6,-1 ; z47x ; jr setmode ;gf2: setx 5,-1 ; jr setmode nf3: ; cpi 110$00000b ; z67 ; jrz f1 ; keep old mode if device type not valid stx b,-1 0324+DD70FF DB 0DDH,70H+B,-1 stx c,-2 0327+DD71FE DB 0DDH,70H+C,-2 032A C3A403 jmp physel7 ;f1: setx 7,-1 ; z67 setmode: 032D 7E mov a,m ; get flag byte bit 3,a ; track density bit 032E+CB5F DB 0CBH,3*8+A+40H jrz gs0 0330+280A DB 28H,GS0-$-1 setx 5,+0 ; set drive and media to dt 0332+DDCB00EE DB 0DDH,0CBH,+0,5*8+0C6H setx 5,+1 0336+DDCB01EE DB 0DDH,0CBH,+1,5*8+0C6H jr gs2 033A+1808 DB 18H,GS2-$-1 gs0: resx 5,+0 033C+DDCB00AE DB 0DDH,0CBH,+0,5*8+86H resx 5,+1 0340+DDCB01AE DB 0DDH,0CBH,+1,5*8+86H gs2: bit 1,a ; density bit 0344+CB4F DB 0CBH,1*8+A+40H jrz gs1 0346+2806 DB 28H,GS1-$-1 setx 4,+1 0348+DDCB01E6 DB 0DDH,0CBH,+1,4*8+0C6H jr gs3 034C+1804 DB 18H,GS3-$-1 gs1: resx 4,+1 034E+DDCB01A6 DB 0DDH,0CBH,+1,4*8+86H gs3: bit 0,a ; sides bit 0352+CB47 DB 0CBH,0*8+A+40H jrz gs4 0354+2806 DB 28H,GS4-$-1 setx 6,+1 0356+DDCB01F6 DB 0DDH,0CBH,+1,6*8+0C6H jr gs6 035A+1804 DB 18H,GS6-$-1 gs4: resx 6,+1 035C+DDCB01B6 DB 0DDH,0CBH,+1,6*8+86H gs6: 0360 2A0000 lhld @cmode 0363 CD0000 call ?getdp ; setup mode bytes 0366 C29F03 jnz physel6 ; error if format doesnt exists liyd @dph ; set dpb addr in dph 0369+FD2A DB 0FDH,2AH 036B+0000 DW @DPH sty c,+0 ; store XLAT address in DPH 036D+FD7100 DB 0FDH,70H+C,+0 sty b,+1 0370+FD7001 DB 0FDH,70H+B,+1 ldy l,+12 ; get DPB address in DPH 0373+FD6E0C DB 0FDH,L*8+46H,+12 ldy h,+13 0376+FD660D DB 0FDH,H*8+46H,+13 0379 EB xchg 037A 2A0000 lhld @scrbf 037D 010D00 lxi b,labdpb 0380 09 dad b 0381 010F00 lxi b,15 ldir ; move dpb 0384+EDB0 DB 0EDH,0B0H 0386 EB xchg ; hl points to psh byte (15) liyd @scrbf 0387+FD2A DB 0FDH,2AH 0389+0000 DW @SCRBF ldy a,+labhth+2 038B+FD7E07 DB 0FDH,A*8+46H,+LABHTH+2 038E 47 mov b,a ; save CP/M sectors per physical sector 038F 0E00 mvi c,0 pshlp srlr a ; rolate LSB into [cy] 0391+CB3F DB 0CBH,38H+A 0393 DA9903 jc psh1 0396 0C inr c jr pshlp 0397+18F8 DB 18H,PSHLP-$-1 0399 71 psh1 mov m,c ; set PSH byte 039A 23 inx h ; mode pointer to PSM 039B 05 dcr b 039C 70 mov m,b ; put in dpb JR PHYSEL7 039D+1805 DB 18H,PHYSEL7-$-1 039F 3E01 PHYSEL6:MVI A,1 03A1 32BD06 STA SELERR ; FLAG A SELECT ERROR PHYSEL7: 03A4 CD0904 call done ; setup motor turn-off 03A7 21BE06 lxi h,selop 03AA 3600 mvi m,false ; SELECT OPERATION IS OVER 03AC C9 ret PHYSEL3: 03AD CDDD04 CALL SELECT JRC PHYSEL6 ; ERROR IF NOT READY 03B0+38ED DB 38H,PHYSEL6-$-1 03B2 CD5406 CALL HOME ;RESTORE HEAD TO TRACK 0 JRC PHYSEL6 03B5+38E8 DB 38H,PHYSEL6-$-1 03B7 0648 MVI B,01001000B ;STEP IN, NO UPDATE 03B9 CD8506 CALL TYPE$I 03BC CD8506 CALL TYPE$I ;STEP IN TWICE 03BF CD8106 call read$addr ; READ ADDRESS 03C2 3A0000 lda @dstat 03C5 E630 ANI 00011000B SHL 1 ;check for FDC error. JRNZ PHYSEL6 03C7+20D6 DB 20H,PHYSEL6-$-1 03C9 DB12 in fdcsec ;track number, from read-addr 03CB FE02 CPI 2 JRZ PHYSEL4 03CD+2816 DB 28H,PHYSEL4-$-1 03CF FE01 CPI 1 JRNZ PHYSEL6 03D1+20CC DB 20H,PHYSEL6-$-1 03D3 2AB906 lhld cmode setb 5,m ;make drive "DT" 03D6+CBEE DB 0CBH,5*8+֎ %_ hx @{ A( dR'cap<@C7#ye91p`01axaxaxaG2?UT-yKf% m0t3@ ~2FVlT ͦd&;;TL+vvW0Q0:>h4 ̀ j.ݜdˀd +8H @,i Z%` pX ].7m<*rE@tFDZ^2נX@MX 2ݙ@ۮֽ[D Em+N2Z|kae Qkf7Nnۧ ;Xz| ^ D aPke+ROpAw_@tnѳ?3 0.YXPn`*O0n%pN/?2Suw7Y`p`eX\'X7Y`3,(7Y``eV¬Z| *~05*`h[Uߧ9eZd |D`S` >37u0fAõ1!AA@` k6O,r wfVeʀÅap> 00b-r f6nxB(`t=GZn *xB,nkfYP†7<MaHEPka$3L$fA8WKy Re0G3@ke:׀<^4GBH0`8 [ YX4p _-Y8: aD] \ۘ@!\\ nv1=Bx #31ôBà* 1e'/aG2qf >g00kPa/@`[a`O0&1 U[ - /[L Lܬ 1a0@ BA7}UKl @9K06{YQ7}Vxa*`a`2>1W 0\gz l0fnlp@&ka~[02kgl(_ 00 eQe:lLF :ݕ[ Yc,;HYP e nnsQh ٺ3Za!][@niC x[b1ݐ~FVnG &1f@`DubCB6` <p HfPg0 @`C7B;|>>4,0kPeL @>8}XP|ia6@jpWp'aG2b > X HJѪ@j IqJX1*j*` D*HhQ< Hi <Iji L~d誈M+0C0H 03D8 23 inx h bit 5,m ;test for 40 track already 03D9+CB6E DB 0CBH,5*8+M+40H 03DB CAE503 jz physel4 res 5,m ;make disk "ST" and reconfigure 03DE+CBAE DB 0CBH,5*8+M+80H 03E0 3EFF mvi a,0ffh 03E2 320000 sta @rcnfg ;set "re-configure" flag so BIOS will get new DPB/XLAT PHYSEL4: 03E5 CD5406 CALL HOME JRC PHYSEL6 03E8+38B5 DB 38H,PHYSEL6-$-1 JR PHYSEL7 03EA+18B8 DB 18H,PHYSEL7-$-1 setup$rw: 03EC 3E15 MVI A,21 ; 21 RETRYS FOR A READ/WRITE OPERATION 03EE 32B606 STA RETRYS 03F1 2A0000 lhld @cmode 03F4 23 inx h 03F5 23 inx h 03F6 22B906 shld cmode 03F9 C9 ret read$fdc: 03FA CDEC03 call setup$rw 03FD CD7805 READ: CALL ACCESS$R ; START DRIVE AND STEP TO PROPER TRACK JRC ERROR 0400+3805 DB 38H,ERROR-$-1 0402 11889F lxi d,10011111$10001000B ; status mask + read command JR TYPE$II 0405+183A DB 18H,TYPE$II-$-1 0407 AF error: xra a ; [NZ] to indicate error 0408 3C inr a 0409 F5 done: push psw 040A 3ABE06 lda selop 040D B7 ora a jrnz retrn 040E+200F DB 20H,RETRN-$-1 0410 3E00 mvi a,false ;motor off false 0412 325500 sta motor$off setmot: 0415 115600 lxi d,motoff 0418 0E0F mvi c,15 ;15 seconds 041A 0621 mvi b,dev0 ;I.D. 041C CD0000 call ?timot 041F F1 retrn: pop psw 0420 C9 ret write$fdc: 0421 CDEC03 call setup$rw 0424 2AB906 WRITE: LHLD CMODE ; CHECK FOR HALF TRACK R/O bit 5,m ;see if drive is DT. 0427+CB6E DB 0CBH,5*8+M+40H jrz ht0 0429+2805 DB 28H,HT0-$-1 042B 23 inx h bit 5,m ;see if media is not DT. 042C+CB6E DB 0CBH,5*8+M+40H jrz ERROR ; R/O ERROR 042E+28D7 DB 28H,ERROR-$-1 0430 CD7805 ht0: CALL ACCESS$R ; ACCESS DRIVE FOR WRITE JRC ERROR 0433+38D2 DB 38H,ERROR-$-1 0435 DB10 in fdcstat 0437 320000 sta @dstat ; save DISK STATUS BYTE 043A E640 ani 01000000b ; WRITE PROTECT BIT jrnz ERROR ; WRITE PROTECT ERROR 043C+20C9 DB 20H,ERROR-$-1 043E 11A8FF lxi d,11111111$10101000B ; status mask + write command TYPE$II: 0441 2AB906 lhld cmode 0444 23 inx h 0445 7E mov a,m 0446 E601 ani 1 ;sector offset 0448 210000 lxi h,@sect ; GET SECTOR NUMBER 044B 86 add m ;others use sectors 1-n 044C D312 OUT fdcsec ; give to controller RETRY: 044E D5 PUSH d ; save registers 044F CDA804 CALL TYPE$II$COM ; execute disk transfer routine. 0452 320000 STA @dstat ; save status of transfer 0455 AF XRA A ; CLEAR CARRY FOR DSBC lded @dma 0456+ED5B DB 0EDH,5BH 0458+0000 DW @DMA DSBC D ; HL NOW CONTAINS # OF BYTES TRANSFERRED 045A+ED52 DB 0EDH,D*8+42H 045C 3A0000 LDA @dstat ; check for successful transfer 045F E6FF ANI 11111111B ; WP is 0 for any read command. JRNZ IOERR ; RETRY IF ERROR 0461+2016 DB 20H,IOERR-$-1 0463 3ABE06 LDA SELOP ; IS THIS A SELECT OPERATION ? 0466 B7 ORA A jrnz POPRET ; THEN DON'T CHECK SECTOR SIZE 0467+2009 DB 20H,POPRET-$-1 0469 3ABC06 LDA BLCODE ; CHECK IF CORRECT NUMBER OF BYTES TRANSFERRED 046C FE03 CPI 3 JRNZ NOTED ; BLCODE=3 => 1024 BYTE SECTOR EXPECTED 046E+2001 DB 20H,NOTED-$-1 0470 3C INR A ; INCREMENT BECAUSE (H) FOR 1024 IS 4 0471 BC NOTED: CMP H ; COMPARE TO EXPECTED SIZE POPRET: 0472 D1 POP d 0473 3E00 mvi a,0 ;signal "no error" to BDOS. jrz done ; RETURN IF CORRECT 0475+2892 DB 28H,DONE-$-1 JR TRYAGN ; RETRY IF INCORRECT 0477+1804 DB 18H,TRYAGN-$-1 IOERR: 0479 C1 POP B 047A FA0704 JM ERROR ; ERROR IF NO READY SIGNAL TRYAGN: 047D 21B606 LXI H,RETRYS ; decrement retry count 0480 35 DCR M 0481 CA0704 JZ ERROR ; NO MORE RETRIES 0484 7E MOV A,M 0485 FE0A CPI 10 0487 D24E04 JNC RETRY ; LESS THAN TEN RETRYS LEFT => STEP HEAD 048A 3ABE06 LDA SELOP 048D B7 ORA A 048E C24E04 jnz RETRY ; DO NOT STEP HEAD IF SELECT OPERATION 0491 D5 PUSH d ; SAVE REGISTERS 0492 CD4706 CALL STEPIN ; STEP IN COMMAND 0495 CD9D05 CALL SEEK ; SEEK WILL REPOSITION HEAD 0498 D1 POP d 0499 C34E04 JMP RETRY ; TRY AGAIN 049C 80 rtbl: db 128 ;128 bytes 049D D200 dw rd1 049F 00 db 0 ;256 bytes 04A0 D200 dw rd1 04A2 00 db 0 ;512 bytes 04A3 CC00 dw rd2 04A5 00 db 0 ;1024 bytes 04A6 C000 dw rd4 type$II$com: ;command in E 04A8 7B mov a,e 04A9 E620 ani 00100000b ; 1 if write 04AB 070707 rlc! rlc! rlc ; 0000000w 04AE F6A2 ori 0a2h ;A2/A3 for INI/OUTI 04B0 32D400 sta rd12+1 04B3 32CE00 sta rd22+1 04B6 32C800 sta rd32+1 04B9 32C200 sta rd42+1 04BC CDA306 call setside sspd savSTK ; 04BF+ED73 DB 0EDH,73H 04C1+9C00 DW SAVSTK 04C3 31A600 lxi sp,rwSTK ; 04C6 3ABC06 lda blcode 04C9 4F mov c,a 04CA 87 add a ; *2 04CB 81 add c ; *3 04CC 219C04 lxi h,rtbl 04CF 4F mov c,a 04D0 0600 mvi b,0 04D2 09 dad b 04D3 46 mov b,m 04D4 23 inx h 04D5 4E mov c,m 04D6 23 inx h 0 is positive, the result is positive. 51 ADD K RESULT <-- row/col + value Add a constant amount to a row or column. 52 SUB K RESULT <-- row/col - value Subtract a constant amount from a row or column. 53 MULT K RESULT <-- row/col * value Multiply a row or column by a constant amount. 54 DIV K RESULT <-- row/col / value Divide a row or column by a constant amount. 55 SUM RESULT <-- SUM( row/col1 THROUGH row/col2 ) Sum a group of rows or a group of columns. 56 GET RESULT <-- row/col Get the values from a row or column. 57 FLOOR RESULT <-- MAX(row/col, value) If row/col is less than value, then the RESULT is value. Otherwise RESULT is row/col. 58 CEILING RESULT <-- MIN(row/col, value) If row/col is greater than value, then the RESULT is value. Otherwise RESULT is row/col. 60 finance: Display finance commands. Depreciation, mortgages, internal rate of return, ratios, percentages, growth and tax schedules. 61 SET DEPR RESULT <-- method amount salvage life Prompt for inputs for the depreciation command. Straight line, sum of years, double declining and switch over is supported. 62 DEPRECIATE RESULT <-- DEPR(row/col) Calculate period by period depreciation schedule using the parameters stored in row/col. See SET DEPR 63 SET LOAN RESULT <-- period PV FW N R PMT Mortgage loan analysis. Supports annual,quarterly,monthly. Given 4 values, SET LOAN solves for the fifth parameter. 64 LOAN RESULT <-- LOAN(row/col) Calculate the interest schedule on a loan using the parameters stored in row/col. See SET LOAN 65 DCF RESULT <-- row/col / (1 + rate/100)^t Discount cashflows in row/col by rate. The first period is not discounted. Use CUMULATE to calculate net discounted cashflow. 66 IRR RESULT <-- IRR(row/col) Calculate internal rate of return for row/col. 67 RATIO RESULT <-- row/col1 / row/col2 * 100 Calculate percentage ratios. 68 % OF TOT RESULT <-- row/col / value * 100 Calculate row/col as a percentage of value. 70 PCT RESULT <-- row/col1 / 100 * row/col2 Take percentages. The percentages in row/col1 are applied to the values in row/col2. 71 K PCT RESULT <-- rate / 100 * row/col Take constant percentages. The values in row/col are multiplied by rate. 72 LAG RESULT(t) <-- row/col(t-period) Shift row/col backwards by period. Use for cashflow calcs. (e.g. receipts is a lag function of posted orders.) 73 LEAD RESULT(t) <-- row/col(t+period) Shift row/col forward by period. Use for cashflow calculations (e.g. inventory is a function of expected sales.) 74 GROW RESULT(t) <-- RESULT(t-1) * (1+row/col(t) / 100) Grow values using growth rates in row/col. GROW prompts for a year zero value, if needed. 75 SAVINGS RESULT(t) <-- RESULT(t-1)*rate/100 + row/col(t) Calculate savings balances. Rate is the compounding rate for savings and row/col contains period by period cashflows. 76 SET SCHED RESULT <-- bracket tax-rate ... Prompts for tax computation schedule. Inputs are a series of tax bracket limits and the marginal tax rates. 77 DO TAX RESULT <-- TAX(row1, row2) Calculate taxes using the tax schedule stored in row1 and the pre tax figures stored in row2. (see SET SCHED) 80 print: Display print commands. Set report options, titles and print reports. Resports can be sent to disk files. 81 OPTIONS option ... Global report options. Row title width, column width, number of columns, negative numbers, commas, line numbers, zeros, etc 82 TITLES page date row-range col-range 3-line-title Set page number, dates, row and column ranges and a 3 line title. A report will follow. 83 REPORT Print report on your printer. Report options, title should be set prior to printing report. 84 SHOW OPTS Display report options and title information. 85 SAVE REP filename Print report to a disk file. Interface with word processors, or spool output to printer. 86 SET CRT row-width col-width decimal-places Set display parameters. You can control the row title area, the column widths, and the number of decimal places. 90 status: Display status commands. Range settings, mode selection, and selection of compute order. 91 range: Range selection commands for rows and columns. 92 ROW RANGE row1 TO row2 Set row range on status line (top line). Impacts calculations, printed reports, and general data manipulation. 93 COL RANGE row1 TO row2 Set column range on status line (top line). Impacts calculations, printed reports and general data manipulation. 95 mode: Mode selection commands. (top line) 96 RUN PGM Set mode to run program. The current program will start execution. 97 PROGRAM step Set mode to program mode. Each future command will automatical be memorized as a step of a program. Can also insert commands. 98 COMPUTE Set mode to compute. Re-compute your table to update for any changes in the data. 99 NORMAL Set mode to normal mode. Any computation command will still be memorized as part of your table. 100 DEL STEP step1 TO step2 Delete steps from programs. 101 PROTECT Toggles the protect mode on & off. In protect mode, data can be changed, but the model logic will not change. 102 ORDER option Set the computing order for your table. Select ROW/ONLY, COL/ONLY, ROW/COL or COL/ROW. 105 utility: Display utility commands. Load, save, list, print, erase, clear and reset tables. Also redisplay screen. 106 LOAD ALL filename Load table and program from diskettes and set to RUN PGM mode. On prompting for filename, the available files will be shown. 107 SAVE ALL filename Save table and program onto diskettes for permanent storage. 108 SET DRIVE drive Select drive for saving and loading your files. Normally, the current drive is used for saving and loading files. 109 SET UP number-of-columns number-of-rows Redimension tables to a different number of rows and columns. Generally, each table can have up to about 1000 entries. 111 LOAD TBL filename Load your table from your diskettes. On prompting for file- names, the available files will be shown. 112 SAVE TBL filename Save your table on diskettes. The descriptions, data, logic, and all print options will be saved as part of the file. 113 CLR DATA verify Clear all data in table range. Row and column titles, and table logic will be maintained. 114 RESET verify Reset table values, row and column titles, table logic, program steps. 115 REDISPLAY Clear the screen and redisplays your table, menu and status information. No data will be changed. 116 LIST TBLS Print a list of the tables you have on your current diskette. Listing will go to the printer. 117 ERASE TBL filename Erase a table from your current diskette. 118 PRINT TBL Print a description of your model. Listing will include row titles, options, table commands and global options. 120 program: Display program utility commands. Load, save, clear, list and print program files. 121 LOAD PGM filename Load program from your diskettes into the computer. 122 SAVE PGM filename Save program onto diskettes for permanent storage. 123 PRINT PGM Print a copy of the current program on the printer. 124 CLEAR PGM verify Clear the current program from the computer. 125 SHOW PGM Display the current program on your screen. 126 LIST PGMS Print a list of the available programs on your diskettes. The list will go to the printer. 127 ERASE PGM filename Erase a program on your diskette. 130 stats: Display statistical commands. Smoothing, moving averages, mean variance, standard deviations and curve fitting. 131 DELTA RESULT(t) <-- row/col(t) - row/col(t-period) Calculate the change in value between periods of a row or col. 132 % GROWTH RESULT(t) <-- PCT(row/col, period) Calculate the % rate of growth in values between periods of a row or column. 133 MOV AVG RESULT(t) <-- (row/col(t)+row/col(t-1)+...)/per Compute the moving average for a row or column. The average is calculated over a variable number of periods. 134 SMOOTH RESULT(t) <-- f* RESULT(t-1) + (1-f)*row/col(t) Compute exponential smoothing for a row or column. The f is an smoothing coefficient entered as a percentage. 135 MEAN RESULT <-- MEAN(row/col1 THROUGH row/col2) Calculate the mean values for a series of rows or columns. Mean values are calculated row by row or column by column. 136 SIGMA RESULT <-- SIGMA(row/col1 THROUGH row/col2) Compute the standard deviation for a series of rows or columns 137 VARIANCE RESULT <-- VARIANCE(row/col1 THROUGH row/col2) Compute the variances for a series of rows or columns. 138 LOG RESULT <-- LOG(row/col) Compute the natural logarithm for a row or column. 139 EXP RESULT <-- EXP(row/col) Calculate the exponents for a row or column. 140 POWER RESULT <-- row/col1 ^ row/col2 Raise values in row/col1 to the power of the values in row/col2. 141 MAX RESULT <-- MAX(row/col1 THROUGH row/col2) Find the largest value in a series of rows or columns. Result is the largest value in the range. 142 MIN RESULT <-- MIN(row/col1 THROUGH row/col2) Find the smallest value in a series of rows or columns. Result is the smallest value in the range. 143 COUNT RESULT <-- COUNT(row/col1 THROUGH row/col2) Count the number of values included in the mean, sigma and variance calculations. 144 TOTAL RESULT <-- SUM(row/col1 THROUGH row/col2) Calculate the total of values for a series of rows or columns. Result is the same as SUM. 150 tables: Display external table access commands. Consolidations, variance analysis, and commands to link tables or to G/L. 151 ADD filename Add corresponding values from two tables. (e.g. consolidation of branch budgets to derive total sales department budget.) 152 SUBTRACT filename Subtract corresponding values from two tables. (e.g. derive the change between two scenarios.) 153 MULT filename Multiply corresponding values from two tables. 154 DIVIDE filename Divide corresponding values from two tables. 155 GET RESULT <-- row/col OF filename Retrieve a row or column of data from a table on the diskette. 157 CURRENT RESULT <-- END OF filename Retrieve the current row or column from a table on the diskett Use with TBL ROWS and TBL COLS. 158 Y-T-D RESULT <-- SUM(BEGIN THROUGH END) OF filename Sum rows or columns from a table on your diskette. Use with TBL ROWS and TBL COLS. 159 MERGE filename (NOT AVAILABLE IN V3.0) Perform row by row consolidation by matching row titles. If titles match, the values are added to the values in the curren 161 TBL ROWS row1 THROUGH row2 Set the row range for all TABLES commands. 162 TBL COLS col1 THROUGH col2 4D7 66 mov h,m 04D8 69 mov l,c 04D9 E5 push h 04DA C3A600 jmp type$II$ext SELECT: 04DD 0E00 mvi c,0 04DF 0621 mvi b,dev0 04E1 CD0000 call ?timot ;clear any pending "motor off" 04E4 3A0000 LDA @rdrv ; get the RELATIVE drive number 04E7 4F MOV C,A ; relative drive number in (C) (rel. to driv0) 04E8 2AB906 lhld cmode 04EB 23 INX H ; POINT TO MODE BYTE 2 04EC 3C inr a ; 1,2,3,4 04ED 2F cma ; 111111xx 04EE E603 ani 00000011b ; 2,1,0,3 bit 4,m ;single density ? 04F0+CB66 DB 0CBH,4*8+M+40H jrnz se1 04F2+2002 DB 20H,SE1-$-1 04F4 F620 ori 00100000b ;select single density data rate. 04F6 F610 se1: ori 00010000b ;motor on, also 04F8 5F mov e,a 04F9 F3 di 04FA DB14 in sysctl ; 04FC E69C ani 10011100b 04FE B3 ora e ; 04FF D314 out sysctl ; 0501 FB ei 0502 2B dcx h 0503 7E MOV A,M 0504 E60C ANI 00001100B ; setup steprate bits for seek-restore commands 0506 0F rrc 0507 0F rrc 0508 32B506 STA STEPRA ; RATE FOR SUBSEQUENT SEEK/RESTORE 050B 21BB06 LXI H,LOGDSK ; save position (track) of current drive 050E 5E MOV E,M ; in 'trks' array addressed by contents of 050F 71 MOV M,C ; location 'logdsk'. 0510 0600 MVI B,0 0512 50 MOV D,B 0513 21C006 LXI H,TRKS 0516 19 DAD D 0517 DB11 IN fdctrk 0519 77 MOV M,A ; SAVE CURRENT TRACK # 051A 21C006 LXI H,TRKS ; identify position (track) of requested drive 051D 09 DAD B ; from 'trks' array addressed by new 'logdsk'. 051E 7E MOV A,M 051F D311 OUT fdctrk ; set track number 0521 79 mov a,c 0522 93 sub e ;same drive as last time? 0523 D6019F sui 1 ! sbb a ;.true. if same drive 0526 2F cma 0527 F3 di 0528 215500 lxi h,motor$off ;if diff. drive, must check ready. 052B B6 ora m ;if same but motor off, must check ready. 052C 36FF mvi m,true ;this prevents the motor from being turned off 052E 32C406 sta mtflg ; test drive for ready. 0531 2FB7 cma ! ora a ;[NC] jrnz fb3 ;[NZ] if motor still on. 0533+201C DB 20H,FB3-$-1 ; 0535 3ED0 mvi a,11010000b 0537 D310 out fdccomd 0539 DB10 in fdcstat 053B 060A mvi b,10 ;must be ready within 10 rev. fb1: 053D CD5605 call find$NE 0540 116243 lxi d,IP$count 0543 DB10 fb2: in fdcstat 0545 E602 ani 00000010b jrnz got$IP 0547+200A DB 20H,GOT$IP-$-1 0549 1B dcx d 054A 7B mov a,e 054B B2 ora d jrnz fb2 054C+20F5 DB 20H,FB2-$-1 djnz fb1 054E+10ED DB 10H,FB1-$-1 0550 37 stc 0551 FB fb3: ei 0552 C9 ret 4362 = IP$count equ 17250 ; 200mS +10%, timed to "fb2" loop got$IP: 0553 AF xra a 0554 FB ei 0555 C9 ret find$NE: 0556 DB10 in fdcstat 0558 E602 ani 00000010b 055A 4F mov c,a 055B 2604 mvi h,4 ;wait even longer... (3.67 sec) 055D 110000 fb00: lxi d,0 ;wait a long time for any edge 0560 DB10 fb01: in fdcstat 0562 E602 ani 00000010b 0564 B9 cmp c jrnz got$edge 0565+200C DB 20H,GOT$EDGE-$-1 0567 1B dcx d 0568 7B mov a,e 0569 B2 ora d jrnz fb01 056A+20F4 DB 20H,FB01-$-1 056C 25 dcr h jrnz fb00 056D+20EE DB 20H,FB00-$-1 056F D1 pop d ;discard address from "fb1" loop 0570 37 stc 0571 FB ei 0572 C9 ret got$edge 0573 B7 ora a 0574 C8 rz 0575 4F mov c,a ;if not NE, go find another jr fb00 0576+18E5 DB 18H,FB00-$-1 ACCESS$R: 0578 2A0000 lhld @dph 057B 110C00 lxi d,12 057E 19 dad d 057F 3E0F mvi a,15 ;PSH 0581 86 add m 0582 5F mov e,a 0583 23 inx h 0584 3E00 mvi a,0 0586 8E adc m 0587 57 mov d,a 0588 1A ldax d 0589 32BC06 sta blcode ;get physical sector size 058C 2AB906 lhld cmode 058F 4E mov c,m ; mode byte 2 0590 23 inx h 0591 7E mov a,m ; mode byte 3 0592 2F cma ; get "NOT MDT... 0593 A1 ana c ; ... AND DDT" 0594 E620 ani 00100000b ; flag is in bit 5 0596 32C306 sta htflag ; half track flag 0599 CDDD04 CALL SELECT 059C D8 rc SEEK: 059D 3A0000 lda @trk 05A0 B7 ora a ;see if we're on physical track 0 jrnz xf0 05A1+2026 DB 20H,XF0-$-1 05A3 2AB906 lhld cmode 05A6 3A0000 lda @side 05A9 B7 ora a ;see which side we're on. jrnz xf1 05AA+2014 DB 20H,XF1-$-1 bit 0,m ;check TRK-0,SID-0 density bit. 05AC+CB46 DB 0CBH,0*8+M+40H jrz xf0 05AE+2819 DB 28H,XF0-$-1 05B0 AF xra a 05B1 32BC06 sta blcode ;select 128 bytes/sector 05B4 F3 di 05B5 DB14 in sysctl 05B7 E6BF ani 10111111b 05B9 F620 ori 00100000b ;select SD media 05BB D314 out sysctl 05BD FB ei jr xf0 05BE+1809 DB 18H,XF0-$-1 xf1: bit 1,m ;check TRK-0,SID-1 format (may be 256 bytes/sector) 05C0+CB4E DB 0CBH,1*8+M+40H jrz xf0 05C2+2805 DB 28H,XF0-$-1 05C4 3E01 mvi a,1 05C6 32BC06 sta blcode ;select 256 bytes/sector ;leave DD as is. 05C9 21B706 xf0: LXI H,SEKERR ; initialize seek error counters 05CC 3604 MVI M,4 ; 4 ERRORS ON SEEK IS FATAL 05CE 23 INX H 05CF 360A MVI M,10 ; RESTORE once, then 9 errors are fatal 05D1 CDA306 call setside 05D4 3A0000 lda @trk 05D7 4F mov c,a RETRS: 05D8 79 MOV A,C ; get track number back 05D9 B7 ORA A ; FORCES "RESTORE" IF "seek to track 0" 05DA CA5406 jz HOME ;RESTORE HEAD TO TRACK 0 05DD 3AC306 lda htflag 05E0 67 mov h,a ; get half-track flag in h 05E1 DB11 IN fdctrk ;CURRENT HEAD POSITION, 05E3 91 SUB C ;SEE HOW FAR WE WANT TO GO. 05E4 C8 RZ ;IF ZERO TRACKS TO STEP, WERE FINISHED 05E5 0678 MVI B,01111000B ;ASSUME STEP-OUT + UPDATE + HEADLOAD JRNC STOUT ;ASSUMPTION WAS CORRECT... 05E7+3004 DB 30H,STOUT-$-1 05E9 0658 MVI B,01011000B ;ELSE MUST BE STEP-IN NEG ;AND NUMBER OF TRACKS WOULD BE NEGATIVE 05EB+ED44 DB 0EDH,44H 05ED 6F STOUT: MOV L,A ;COUNTER FOR STEPING SEEK5: BIT 5,H ; CHECK FOR 48 TPI DISK IN 96 TPI DRIVE 05EE+CB6C DB 0CBH,5*8+H+40H JRZ NOTHT 05F0+280B DB 28H,NOTHT-$-1 RES 4,B ;SELECT NO-UPDATE 05F2+CBA0 DB 0CBH,4*8+B+80H 05F4 CD8506 CALL TYPE$I ;STEP HEAD 05F7 E608 ANI 00000100B SHL 1 ;DID THIS STEP PUT US AT TRACK 0 ? JRNZ TRK0ERR 05F9+202E DB 20H,TRK0ERR-$-1 SETB 4,B ;SELECT UPDATE TO TRACK-REG 05FB+CBE0 DB 0CBH,4*8+B+0C0H 05FD CD8506 notht: CALL TYPE$I ;STEP HEAD 0600 E608 ANI 00000100B SHL 1 ;DID THIS STEP PUT US AT TRACK 0 ? JRNZ TRK0ERR 0602+2025 DB 20H,TRK0ERR-$-1 0604 2D DCR L JRNZ SEEK5 0605+20E7 DB 20H,SEEK5-$-1 0607 DB12 IN fdcsec ;SAVE CURRENT SECTOR NUMBER 0609 6F MOV L,A 060A CD8106 CALL READ$ADDR ; GET ACTUAL TRACK UNDER HEAD (IN SECTOR REG) 060D DB12 in fdcsec ;GET TRACK NUMBER FROM MEDIA 060F 67 MOV H,A 0610 7D MOV A,L 0611 D312 OUT fdcsec ;RESTORE SECTOR NUMBER 0613 3A0000 LDA @dstat ;GET TRUE ERROR STATUS OF READ-ADDRESS 0616 07 RLC 0617 D8 RC ;DRIVE NOT READY 0618 E630 ANI 00011000B SHL 1 ; CRC ERROR + REC-NOT-FOUND 061A 7C MOV A,H ; ACTUAL TRACK FROM READ-ADDRESS 061B 21B706 LXI H,SEKERR ;POINT TO ERROR COUNTERS JRNZ RESTR0 061E+200F DB 20H,RESTR0-$-1 0620 B9 CMP C ; (C) MUST STILL BE VALID DEST. TRACK 0621 C8 RZ ;NO ERRORS 0622 35 RTS00: DCR M ; SHOULD WE KEEP TRYING ? 0623 37 STC 0624 C8 RZ ;NO, WE'VE TRYED TOO MUCH 0625 D311 OUT fdctrk ; re-define head position accordingly JR RETRS ; RETRY SEEK 0627+18AF DB 18H,RETRS-$-1 TRK0ERR: 0629 AF XRA A 062A 21B706 LXI H,SEKERR JR RTS00 062D+18F3 DB 18H,RTS00-$-1 062F 23 RESTR0: INX H ; RESTORE ERROR COUNT 0630 35 DCR M 0631 37 STC 0632 C8 RZ ; If count 0, return with Carry set. 0633 7E MOV A,M 0634 FE09 CPI 9 JRNC RESTR1 ; RESTORE ONLY FIRST TIME 0636+3005 DB 30H,RESTR1-$-1 0638 CD4706 CALL STEPIN ; OTHERWISE STEP HEAD IN 1 TRACK JR RETRS 063B+189B DB 18H,RETRS-$-1 RESTR1: ; RESTORE HEAD TO TRACK 0 063D 3E03 MVI A,00000011B 063F 32B506 STA STEPRA ; RETRY WITH MAXIMUM STEP RATE 0642 CD5406 CALL HOME JR RETRS ; RETRY SEEK 0645+1891 DB 18H,RETRS-$-1 0647 3AC306 STEPIN: lda htflag 064A B7 ora a ; CHECK HALF TRACK mode 064B 0648 MVI B,01001000B ; STEP IN WITHOUT UPDATE 064D C48506 CNZ TYPE$I ; STEP A SECOND TIME (W/O UPDATE) FOR HALF-TRK 0650 0658 MVI B,01011000B ; STEP IN AND UPDATE TRACK REGISTER JR TYPE$I 0652+1831 DB 18H,TYPE$I-$-1 HOME: ;POSITION HEAD AT TRACK ZERO... 0654 3ED0 mvi a,11010000b ;force TYPE$I status 0656 D310 out fdccomd 0658 DB10 in fdcstat 065A E604 ANI 00000100B ;TEST TRACK ZERO SENSOR, JRNZ @TRK0 ;SKIP ROUTINE IF WE'RE ALREADY AT TRACK 0. 065C+201E DB 20H,@TRK0-$-1 065E DB11 IN fdctrk ;DOES THE SYSTEM THINK WE'RE AT TRACK 0 ?? 0660 B7 ORA A JRNZ HOME1 ;IF IT DOESN'T, ITS PROBEBLY ALRIGHT TO GIVE "RESTORE" 0661+200E DB 20H,HOME1-$-1 0663 2E06 MVI L,6 ;(6 TRKS) ;ELSE WE COULD BE IN "NEGATIVE TRACKS" SO... 0665 0648 MVI B,01001000B ;WE MUST STEP-IN A FEW TRACKS, LOOKING FOR THE 0667 CD8506 HOME0: CALL TYPE$I ;TRACK ZERO SIGNAL. 066A E608 ANI 00000100B SHL 1 ;"SHL 1" BECAUSE TYPE$I DOES AN "RLC" JRNZ @TRK0 066C+200E DB 20H,@TRK0-$-1 066E 2D DCR L JRNZ HOME0 066F+20F6 DB 20H,HOME0-$-1 0671 0608 HOME1: MVI B,00001000B ;RESTORE COMMAND, WITH HEADLOAD 0673 CD8506 CALL TYPE$I 0676 EE08 XRI 00000100B SHL 1 ;TEST TRACK-0 SIGNAL 0678 1F RAR 0679 1F RAR 067A 1F RAR 067B 1F RAR ;[CY] = 1 IF NOT AT TRACK 0 067C 3E00 @TRK0: MVI A,0 067E D311 OUT fdctrk ;MAKE SURE EVERYONE KNOWS WERE AT TRACK 0 0680 C9 RET ; READ$ADDR: 0681 3EC4 mvi a,11000100B ; READ-ADDRESS COMMAND WITH SETTLE DELAY jr PUT$I 0683+1804 DB 18H,PUT$I-$-1 TYPE$I: 0685 3AB506 LDA STEPRA ; STEP-RATE BITS 0688 B0 ORA B ; MERGE COMMAND PUT$I: 0689 D310 OUT fdccomd ; SEND command TO CONTROLLER 068B DB10 WB: IN fdcstat ; WAIT FOR BUSY SIGNAL 068D 1F RAR ; TO COME UP JRNC WB 068E+30FB DB 30H,WB-$-1 0690 DB10 WNB: IN fdcstat ; poll controller for function-complete 0692 1F RAR ; Busy? JRC WNB ; wait until not busy. 0693+38FB DB 38H,WNB-$-1 0695 17 RAL 0696 320000 STA @dstat ;SAVE TYPE II (III) STATUS FOR ERROR DETECTION. 0699 3ED0 MVI A,11010000B ;TERMINATE COMMAND (RESET STATUS TO TYPE 1) 069B D310 OUT fdccomd 069D DB13 IN fdcdata ; 069F DB10 in fdcstat ; 06A1 07 rlc 06A2 C9 ret setside: 06A3 3A0000 lda @side 06A6 EE01 xri 00000001b 06A8 0707 rlc ! rlc 06AA 4F mov c,a 06AB F3 di 06AC DB14 in sysctl 06AE E6BB ani 10111011b 06B0 B1 ora c 06B1 D314 out sysctl 06B3 FB ei 06B4 C9 ret 06B5 00 STEPRA DB 0 ; STEP RATE CODE 06B6 00 RETRYS DB 0 06B7 0000 SEKERR DB 0,0 ; SEEK,RESTORE ERROR COUNTS 06B9 0000 CMODE DW 0 ; POINTER TO MODE BYTE 06BB 02 LOGDSK DB 2 ; CURRENT DRIVE SELECTED BY THIS MODULE 06BC 00 BLCODE DB 0 06BD 00 SELERR: DB 0 06BE 00 SELOP: DB false 06BF 00 MODFLG: DB 0 06C0 FFFF00 TRKS: DB 255,255,0 06C3 00 htflag: db 0 06C4 00 mtflg: db 0 06C5 END 0578 ACCESSR 010B ALV0 016F ALV1 01D3 ALV2 0000 BC 06BC BLCODE 02C4 CHKLAB1 06B9 CMODE 004B CSV0 008B CSV1 00CB CSV2 0002 DE 0021 DEV0 0409 DONE 0068 DPB0 0079 DPB1 008A DPB2 0060 DPEH37 0000 DPHTBL 0407 ERROR 0000 FALSE 055D FB00 0560 FB01 053D FB1 0543 FB2 0551 FB3 0010 FDC 0010 FDCCOMD 0013 FDCDATA 0012 FDCSEC 0010 FDCSTAT 0011 FDCTRK 0556 FINDNE 031E GF0 030D GF1 0573 GOTEDGE 0553 GOTIP 033C GS0 034E GS1 0344 GS2 0352 GS3 035C GS4 0360 GS6 0004 HL 0654 HOME 0667 HOME0 0671 HOME1 0430 HT0 06C3 HTFLAG 0237 INIT 0479 IOERR 4362 IPCOUNT 0004 IX 0004 IY 000D LABDPB 0004 LABEL 0005 LABHTH 0019 LABLEN 0000 LABVER 06BB LOGDSK 023D LOGIN 0263 LOGIN1 0001 MODE2S 06BF MODFLG 003D MODTBL 0056 MOTOFF 0055 MOTOROFF 06C4 MTFLG 0003 NDEV 02FF NF1 0324 NF2 0324 NF3 0471 NOTED 05FD NOTHT 026A PHYSEL 02BA PHYSEL1 02DD PHYSEL2 03AD PHYSEL3 03E5 PHYSEL4 039F PHYSEL6 03A4 PHYSEL7 0472 POPRET 0399 PSH1 0391 PSHLP 0689 PUTI 00DA RD0 00D2 RD1 00D3 RD12 00CC RD2 00CD RD22 00C6 RD3 00C7 RD32 00C0 RD4 00C1 RD42 03FD READ 0681 READADDR 03FA READFDC 062F RESTR0 063D RESTR1 041F RETRN 05D8 RETRS 044E RETRY 06B6 RETRYS 049C RTBL 0622 RTS00 00A6 RWSTK 009B SAVNMI 009C SAVSTK 04F6 SE1 059D SEEK 05EE SEEK5 06B7 SEKERR 04DD SELECT 06BD SELERR 06BE SELOP 032D SETMODE 0415 SETMOT 06A3 SETSIDE 03EC SETUPRW 0647 STEPIN 06B5 STEPRA 05ED STOUT 0016 STRING 0014 SYSCTL 00F9 THREAD 0629 TRK0ERR 06C0 TRKS FFFF TRUE 047D TRYAGN 0685 TYPEI 0441 TYPEII 04A8 TYPEIICOM 00A6 TYPEIIEXT 6330 VERS 068B WB 0690 WNB 0424 WRITE 0421 WRITEFDC 05C9 XF0 05C0 XF1 0000 ?BNKSL 0000 ?GETDP 0000 ?TIMOT 0000 @CMODE 0000 @DBNK 0000 @DIRCB 0000 @DMA 0000 @DPH 0000 @DSTAT 0000 @DTACB 0000 @RCNFG 0000 @RDRV 0000 @SCRBF 0000 @SECT 0000 @SIDE 0000 @TRK 067C @TRK0  TRKS: DB 255,255,0 06C3 00 htflag: db 0 06C4 00 mtflg: db 0 06C5 END  = " " EXPLAIN (13,7) = " " EXPLAIN (13,8) = " " EXPLAIN (13,9) = " " EXPLAIN (13,10) = " " EXPLAIN (13,11) = " " EXPLAIN (13,12) = " " EXPLAIN (13,13) = " " EXPLAIN (13,14) = " " EXPLAIN (14,1) = " " EXPLAIN (14,2) = " " EXPLAIN (14,3) = " " EXPLAIN (14,4) = " " EXPLAIN (14,5) = " " EXPLAIN (14,6) = " " EXPLAIN (14,7) = " " EXPLAIN (14,8) = " " EXPLAIN (14,9) = " " EXPLAIN (14,10) = " " EXPLAIN (14,11) = " " EXPLAIN (14,12) = " " EXPLAIN (14,13) = "  " EXPLAIN (13,7) = " " EXPLAIN (13,8) = " " EXPLAIN (14,6) = " " EXPLAIN (14,7) = " " EXPLAIN (14,8) = " " EXPLAIN (14,9) = " " EXPLAIN (14,10) = " " EXPLAIN (14,11) = " " EXPLAIN (14,12) = " " EXPLAIN (14,13) = " ÄN Divide by 0VALUERATEPERIODSBEGINEND, (ROW/ONLY=1,COL/ONLY=2,ROW/COL=3,COL/ROW=4) PROMPTING MSG)CHOOSE (VALUE=0,CONSTANT=1,GROW=2,INCR=3)BASE!ERROR IF% A@P|@Pz!M"}"}!M"}! !!!(*!M5%*!M5%*!M5%*!M5%*!M5%*!M5%*!M5%*!N5%*! N5%* !KN5%âO>!'ÖO*{*!*ziD"*z|rO***{{ozʖO*z*)^#V"** {|PO*P>!'O*{*!*ziD"*z|O***{{ozO*z*)^#V"** {|±O*×P>! 'ËP* !!!͖A5%*Ϳ%|LP!{͉*5%!*z|XP!!QN*!G)|„P*!͎*5%!!4* {|P!úP*z*)^#V*)))̀!͎!P*z*')^#V*))))̀!͎!úQ>!3'!!+͎<4|Q\Q*z*7)^#V*3"9*9{z*9*z}|/XQ*z*9)^#V*z^#V*5)))̀!+͎!+*z*5)^#V*3"9*9{z*9*z}|/ҶQ*z*7)^#V*z*9)^#V)))̀!+͎!+Q>!='*z*?)^#V*=)))!A͉*?*=u8*;9R>!K'<4|R*z*z*K)^#VͽQ5R*z*K)^#V*zogͽQ*I|R!!OiR!!A͎*^#Vͨ4xRW!O͟!A͎*MS>!a'*a|ҟR*aog"a>S*c*a)^#Vz*e*a)^#VzR* {"z*_*g#"g*g{zR* {"z*_*i*g)*k*a)^#Vs#r*m*g)*c*a)^#Vs#r*o*g)*e*a)^#Vs#r*a*q{ozQSS*a"9òS*c*9)*9#*c^#Vs#r*e*9)*9#*e^#Vs#r*k*9)*9#*k^#Vs#r*9#"9*q+*9{zZS*q+"q*a+*e*gs#r*c*a)*gs#r*_DT*u#"u*u*w}|T!"s*s*y*u! &͹&\%"9*9 {oz:TS*9"s*sT*y*u#! &!{͎!."9ÖT*u#"u*u*w{zT!{*y*u#! &\%"9*90}|/*99{z/*9.{ozhT!{wU>!'GT̀"9*+|T?U*++|TU<4|U?U*9+|*9*z}|+U* {"z**z*9)^#V"**9+|*9*z}|cU* {"z**z*9)^#V"*Z!!!!i(!!!!m(!!!!o(!!!!k(!!!!c(!!!!e(*zy5%!"g!"q!"u*yͿ%"w*w|V* {"zXS"*|2V* {"zX*q#"q*q{zIVX*L{oz™V*i*g)6#6*m*g)GT̀s#r*q+*e*gs#r* {"õW*V{ozW*i*g)6#6*m*g)GT̀s#r*u#"u*o*g)GT̀s#r*q+*e*gs#r* {"õW*0}|/*9{z/*.{oz҆W*i*g)6#6*u+"u*z*g)^#V!)))GT̀͛*q+*e*gs#r* {"õW*({oz¬W*k*q)6#6*{"V* {"zX*g#"g*g{zWX*q{zWXS"*|WX**{oz X*k*q)6#6ãX*/{oz-X*k*q)6#6ãX*+{ozMX*k*q)6#6ãX*-{ozmX*k*q)6#6ãX*){ozšX*k*q)6 #6*q#"q*{"W* {"zX*|ʾX*c*q)*g+s#r*{"V*g+"g*q+"q*g{z*g*z}|*q{zY!4* {"z**z|1Y!*4*ym*{m**q|=Y**q+|PY!RX!"*q")!"åY*k*)^#V! {oz‡Y*+")ÉZ*k*)^#VzžY*"*#"*q}|eY*{zY* {"zX*#"Z*k*)^#V++++|*k*)^#V+++++|Z*RX*#"*)}|Y*#"uZ*k*)^#V++++++|*k*)^#V+++++++|nZ*RX*#"*)}|,Z* {"zX*|šZ* {"zX**){oz­ZZ*#*){ozZ*)RZY*ogR*ogRX*[*m*)^#V*z^#V!)))̀!͎!B[*o*)^#V*z^#V!)))̀!͎!l[>!'*z*)^#V!)))!͉*\!"ë[*i*)^#V[+)[~#fo[2\c\g\}\\\\*#"*g}|x[*z*g)^#V!)))̀!A͎**z{z \*z*')^#V*m*)^#V)))̀E[.\*m*)^#V*z^#V*))))̀E[**m*)^#V*z^#V*o*)^#V)))̀E[**Z̀[̀RE[*Z̀!W͎[̀!O͎]JG*z+++++++|`]* {*{{ozg"{^*z++++++|‰]!"z!"zJG*z"z9:]*z+++++|Ÿ]!"z^*z*z{oz²]\*z"z*z*z)^#V "!!ͦ2!TNmͰmͰ!\N$]!4!"z* {"z* {"z]* {"zJG]4KvH"z͖L*z|*^ͼI"z*z|B^!"zL*zq:*z|`^I*z|`^͟JvH"z*z*z)^#V#"ˀ*ˀ"ò^*J"z*z{z^*z*)^#Vq:ë_*#"*z}|^*z+++|^!"z*{+*z^#Vog"z^x_*zog*z^#V#"ˀ*ˀ"G_*ogJ"z*z{z@_*z*)^#Vogq:ë_*#"*{}| _*z++++|x_!"z*z+*z^#V"zg^*z"zJG*z^#Vq:*z|›_L!"zHH* {"z͖L*z|ʷ_*z#_+)_~#fo`` aaab`cZaccccePe_ek``*z|_!z"̀!z"π<4|!`*{"ˀ*{"р-`*z"ˀ*z"р*z}o|g! U #j`+)V`~#focecececesskkkIv*z^#V!z͎*z^#V!z͎*z*z)^#V!z͎*z*z)^#V!z͎*^#VP̀!z͎*z|`z!{ͱ``<4|a!7DO!z͎a!7ͥO!z͎*^#V`N̈́$P̀!z͎*z|Haz!{ͱWa a`*^#V!!! iD!z͎*z|ʇa*{!z¢a!!z͎`<4|a!DO!z͎a!ͥO!z͎*z|a`!DO!z͎*z|a!2ͥO!z͎*z{ozW_<4}/o|/g{ozg|0bc*{*{̈́$*^#V̈́$!!*ziD"ˀ*z|gb*ˀ*{{oz›b*z{oz˜b!"ˀ*z"рbÛbb*^#V!7*ˀ*ziD"р*z|b*р*{{ozb*ˀ"р*z*ˀ)^#V!z͎*z*р)^#V!z͎*{*{̈́$*^#V̈́$!!*ziD"ˀ*z|zU*z|lo[*̀*πͽQ!z"zür*z"z/v*z+|*z+++|m!"z*z+*z^#Vq:* {"z<4|s*z*π)^#V*z*̀)^#V}o|g#"s*z*π)^#V*z*̀)^#V}o|g#"*ˀ"t!!A͎*z{oztA!{͉*z{oz,tA!{͉!!͎<4|Vt*z*)^#V"2uit*z*)^#V"t*z{oz*z{ozҬt*!AI!AI!y!A͎*z{ozt*+!Aͱ!|NX-!A͎*Q*#"*р}|s*z*̀)^#V"zu*z*z)^#V"vu*z#"z*z*π)^#V*z{zu*z*̀)^#V"z_u*z*z)^#V"vu*z#"z*z*π)^#V*z{zEu*z}o|gu+)u~#fouuuuuuv͚P͚̀P̀R! !͎͚P̀*ͷ!A !A͎*!A͎͚P̀!A !A͎͚P̀!AͿv͚P̀!A͎͚P̀!AͿ.v͚P̀!A͎*z*z{ozHv*z"z9:*z+++|Uv*z+||v*z!!U4*!!U4*z}o|gv+)v~#fovxx*z}/o|/g*z++|/W_{ozg|v*^#V!!!͖Az5%*^#V!!!iD"*z| w*{zwx<4|Lw*z*z)^#V*z*{)^#V)))̀!O͎xw*z*z)^#V*z^#V*zog)))̀!O͎* ^#V*{̈́$*^#V̈́$P̀!A͎*z|ʰwA!{ͱwA!O͉*ˀQ*{zw*^#VP̀!z͎*z|wz!{ͱx!!z͎*ˀ#"ox*++|Gx!!d!zͱ$!AI!A͎*+++|axA!z!A͎*Q*#"*р}|x* {"z/v* {"z*̀*πu8*^#VP̀!A͎*z|ʸxx* {"zA!{ͱxx*̀*πͽQ*̀*πu8ͽK* {"z/v!4<4|Ly!"z*z*z)^#V"z*z*z}|*z*z{z=y*z"zIy*z"z!"zÜy!"z*zog*z^#V"z*z*{}|*z*{{zҐy*{"zÜy*zog"z!!O͎<4|y!!J;"y!!J;"*|yͨ>*^#VP̀!A͎*z|z*{"z*{"z*z*zu8ͽKürA!{ͱ,zA!O͉*z*z)^#V*z)))!A͉O!A͉èy͝ffffA>533333>=ii<0$;9"s/v* {"z*̀*πu8*^#VP̀!A͎*z|ʸxx* {"zA!{ͱxx*̀*πͽQ*̀*πu8ͽK* {"z/v!4<4|Ly!vers equ '1b' ; March 11, 2017 21:34 drm "MBIOS3KP.ASM" ;**************************************************************** ; Main BIOS module for CP/M 3 (CP/M plus) on the KAYPRO computer* ; Copyright (c) 1985 Douglas Miller * ;**************************************************************** maclib Z80 true equ -1 false equ not true bnksiz equ 56 ;size of banks, in "K". Either 48 or 56. compag equ bnksiz*4 ; C0 or E0, for MMU common page select bnktop equ compag shl 8 ;C000 or E000 cr equ 13 lf equ 10 bell equ 7 cpm equ 0 bdos equ 5 ccp equ 0100h ; Console Command Processor gets loaded into the TPA ; SCB registers extrn @covec,@civec,@aovec,@aivec,@lovec,@ermde extrn @mxtpa,@sec,@min,@hour,@date extrn @lptbl ; External routines extrn ?getdp,?serdp ; Variables for use by other modules public @adrv,@pdrv,@rdrv,@side,@trk,@sect,@login public @dma,@dbnk,@cnt,@scrbf,@dtacb,@dircb public @dstat,@cmode,@dph,@rcnfg public @ctbl,@cbnk,bnkdos,resdos,wbtrap public @vect,sio1vec,sio2vec,piovec ; Routines for use by other modules public ?timot public ?dvtbl,?drtbl public ?bnksl,?stbnk public ?halloc ********************************************************* ** I/O port base addresses ********************************************************* sio1 equ 004h ;z80-sio/0 sio2 equ 00ch ; " pio equ 020h ;modem and rtc functions rtc equ 024h ;real-time clock fdc equ 010h ;floppy disk controller mmu equ 03fh ;memory management sysctl equ 014h ;system control (and floppy disk control bits) ********************************************************* ** SIO's ********************************************************* sio1datA equ sio1+0 sio1ctlA equ sio1datA+2 sio1datB equ sio1+1 sio1ctlB equ sio1datB+2 sio2datA equ sio2+0 sio2ctlA equ sio2datA+2 sio2datB equ sio2+1 sio2ctlB equ sio2datB+2 ********************************************************* ** PIO ********************************************************* pioAdat equ pio+0 pioActl equ pioAdat+2 pioBdat equ pio+1 pioBctl equ pioBdat+2 ********************************************************* ** RTC (MM58167 Real-Time Clock) ********************************************************* RTCDTA equ RTC RTCADR equ pioAdat RTCSEC equ 2 RTCMIN equ 3 RTCHRS equ 4 RTCDAY equ 5 RTCDAT equ 6 RTCMON equ 7 lastmon equ 10 ;month last accessed (used to detect year change) rtcyrs equ 8 ;years (decade) rtcent equ 9 ;century clrcnt equ 18 rtcsts equ 20 rtcis equ 16 ;interupt status rtcic equ 17 ;interupt control hbnk equ 2 ;bank to use for Hash tables. hstart equ 100h ;reserve page 0 for interupt vectors, etc. hsize equ (bnktop-hstart)/16 ;allocate space equally to each drive. ;-------- Start of Code-producing source ----------- cseg ; GENCPM puts CSEG stuff in common memory BIOS$0 equ $ bnkdos equ bios$0+0fc00h ;dummy values, reloc "Fxxx", GENCPM will resdos equ bios$0+0fd00h ; substitiute real values. jmp boot ; initial entry on cold start jmp wboot ; reentry on program exit, warm start jmp const ; return console input status jmp conin ; return console input character jmp conout ; send console output character jmp list ; send list output character jmp auxout ; send auxilliary output character jmp auxin ; return auxilliary input character jmp home ; set disks to logical home jmp seldsk ; select disk drive, return disk parameter info jmp settrk ; set disk track jmp setsec ; set disk sector jmp setdma ; set disk I/O memory address jmp read ; read physical block(s) jmp write ; write physical block(s) jmp listst ; return list device status jmp sectrn ; translate logical to physical sector jmp conost ; return console output status jmp auxist ; return aux input status jmp auxost ; return aux output status ?dvtbl: jmp devtbl ; return address of device def table jmp cinit ; change baud rate of device ?drtbl: jmp getdrv ; return address of disk drive table jmp multio ; set multiple record count for disk I/O jmp flush ; flush BIOS maintained disk caching movev: jmp move ; block move memory to memory jmp timex ; Signal Time and Date operation ?bnksl: jmp bnksel ; select bank for code execution and default DMA ?stbnk: jmp setbnk ; select different bank for disk I/O DMA operations. jmp xmove ; set source and destination banks for one operation jmp search ; reserved for OEM: search for module. jmp 0 ; reserved for future expansion jmp 0 ; reserved for future expansion @dstat: ds 1 dw @lptbl ;logical/physical drive table dw thread ;module thread dw ?serdp ;test mode validity, HL=memory address of ?serdp @adrv: ds 1 ; currently selected disk drive @pdrv: ds 1 ; physical drive number @rdrv: ds 1 ; module relative disk drive number curmdl: ds 2 ; currently selected Disk I/O module address @cmode: ds 2 @dph: ds 2 @dma: dw 0 wbtrap: dw 0 tmpdrv: db 0 defsrc: db 0,0ffh,0ffh,0ffh srctyp: db 000$00$000b ;only bits 3,4 are used (others ignored) icivec: dw 0100000000000000b icovec: dw 1000000000000000b iaivec: dw 0000000000000000b iaovec: dw 0000000000000000b ilovec: dw 0000001000000000b goccp: mvi a,1 ;select bank 1 (where CCP is) call bnksel jmp ccp ; then exit to ccp bdose: lhld @mxtpa call icall xra a call bnksel mov a,l mov b,h ret @@ set ($-BIOS$0) if (@@ and 0fh) ne 0 ds 16-(@@ and 0fh) endif ;put vectors on req. boundary, xxxxx000x for SIOs ; and xxxxxxx0 for PIO. @vect: sio1vec: dw nullsio ; chB TxE dw nullsio ; Ext/Sts dw nullsio ; RxA dw nullsio ; Spcl dw nullsio ; chA TxE dw nullsio ; Ext/Sts dw nullsio ; RxA dw nullsio ; Spcl sio2vec: dw nullsio ; chB TxE dw nullsio ; Ext/Sts dw nullsio ; RxA dw nullsio ; Spcl dw nullsio ; chA TxE dw nullsio ; Ext/Sts dw nullsio ; RxA dw nullsio ; Spcl piovec: dw nullpio ;ch A dw nullpio ;ch B @v set @vect-BIOS$0 @@ set $-BIOS$0 if (@v shr 8) ne (@@ shr 8) ds 'Vect X page bound' endif wboot: lxi sp,stack xra a call bnksel jmp wboot1 ds 64 stack equ $ ds 32 iostk equ $ iostkp: dw $-$ nullsio: nullpio: ei reti ds 16 ;8 levels of stack intstk: ds 0 istk: dw 0 tick: sspd istk lxi sp,intstk push psw push h push b lxi h,@sec inr m lxi h,tictbl mvi b,numtic to4: mov a,m inx h cpi true jz to3 mov a,m ora a jrz to5 dcr m jrnz to3 push b push d push h inx h mov a,m inx h mov h,m mov l,a call icall pop h pop d pop b mov a,m ora a jrnz to3 to5: dcx h mvi m,true inx h to3: inx h inx h inx h djnz to4 too3: mvi c,rtcadr inp b ;save existing rtcadr mvi a,rtcis ;clear rtc INT flag outp a ; in rtcdta ; outp b ;restore rtcadr pop b pop h pop psw lspd istk ei reti ;resets PIO interupt ; SEARCH for a module by device #. ; entry: C = device # (0-249) ; exit: [CY] = not found ; else HL=module address ("init" entry) ; A=device number (relative to module's #0) ; search: lxi d,thread ;C=device number snext: xchg mov e,m inx h mov d,m inx h mov a,d ora e sui 1 ;produce [CY] if DE=0000 rc ;return if device not found, DE=0000 mov a,c sub m jrc snext inx h cmp m jrnc snext inx h ;point to "init" vector ora a ;set [NC] condition ret devtbl: lxi h,@ctbl ret @ctbl: db 'nodev ',0,0 ;character table, filled at cold-start. db 'nodev ',0,0 db 'nodev ',0,0 db 'nodev ',0,0 db 'nodev ',0,0 db 'nodev ',0,0 db 'nodev ',0,0 db 'nodev ',0,0 db 0 ;table terminator cdtbl: rept 8 ;character device table, filled at cold-start. dw cnull endm cnull: jmp null ;init jmp nulli ;input status jmp nulli ;input jmp nulli ;output status jmp null ;output nulli: mvi a,1ah ;E.O.F. character, also [NZ] to be always ready. ora a ;sets [NZ] condition. null: ret cinit: mvi b,0 ;C=device number (0-11) bit 3,c ;devices 8-11? rnz ;cannot init those mvi b,0 ;C=device number (0-7) slar c ;*2 for table index lxi h,cdtbl dad b mov e,m inx h mov d,m mov b,c xchg pchl ;jump to modules "init" with B=device # const: lhld @civec ; get console input bit vector jr ist$scan0 auxist: lhld @aivec ; get aux input bit vector ist$scan0: call swtosys lxi d,xitusr push d ist$scan: lxi d,cdtbl mvi b,0 cis$next: slar h ; check next bit jnc is0 mvi a,3 ; assume device not ready call indjmp1 ; check status for this device ora a ! rnz ; if any ready, return true is0: inx d inx d inr b mov a,h ! ora a ; see if any more selected devices jrnz cis$next xra a ; all selected were not ready, return false ret conin: lhld @civec jr in$scan0 auxin: lhld @aivec in$scan0: call swtosys in$scan: push h call ist$scan ;see if there is a character ready pop h ora a jrz in$scan ;wait untill one is ready. mvi a,6 call indjmp ;get character jr xitusr conout: lhld @covec ; fetch console output bit vector jr out$scan0 auxout: lhld @aovec ; fetch aux output bit vector jr out$scan0 list: lhld @lovec ; fetch list output bit vector out$scan0: call swtosys out$scan: lxi d,cdtbl mvi b,0 co$next: slar h ; shift out next bit mvi a,12 cc indjmp1 inx d inx d inr b mov a,h ! ora a ; see if any devices left jrnz co$next ; and go find them... jr xitusr conost: lhld @covec ; get console output bit vector jr ost$scan0 auxost: lhld @aovec ; get aux output bit vector jr ost$scan0 listst: lhld @lovec ; get list output bit vector ost$scan0: call swtosys ost$scan: lxi d,cdtbl mvi b,0 ;B = device number cos$next: slar h ; check next bit mvi a,9 ; [NZ] will assume device ready (in case no call made) cc indjmp1 ; check status for this device ora a ; see if device ready jrz xitusr ; if any not ready, return false inx d inx d inr b mov a,h ! ora a ; see if any more selected devices jrnz cos$next ori true ; if all selected were ready, return true ; jr xitusr xitusr: mov b,a pop psw ora a jrz xu0 call bnksel ;preserves BC. lspd iostkp xu0: mov a,b ora a ret swtosys: pop d ;routine return address lda @cbnk ora a jrz sw0 sspd iostkp lxi sp,iostk push psw xra a call bnksel pop psw sw0: push psw push d ret indjmp1: push h push d push b call indjmp pop b pop d pop h ret indjmp: xchg add m ;a=0,3,6,9,12,... mov e,a mvi a,0 inx h adc m mov d,a xchg pchl ;indirect call addjmp: add l ;a=0,3,6,9,... mov l,a mvi a,0 adc h mov h,a icall: pchl ;indirect call bnksel: sta @cbnk ; remember current bank push b mov b,a add a add a ora b ori compag out mmu pop b ret timex: ;time get/set. sded savede call swtosys ;destroys DE push h call gett pop h lded savede jmp xitusr savede: ds 2 xmove: mov a,b ;WR bnk add a add a ora c ;RD bnk ori compag sta xmbnk ret xmbnk: ds 1 move: lda xmbnk ora a jrz xxm0 out mmu xxm0: xchg ldir xchg ora a ;test xmbnk again lda @cbnk cnz bnksel xra a sta xmbnk ret @cbnk: db 0 ; bank for processor operations signon: db 13,10,7,'KAYPRO CP/M 3.10' dw vers db ' (c) 1985 DRI and DRM',13,10,'$' ccp$msg db 13,10,7,'No CCP$' ccprecs db 0 ccp$com db 1,'CCP COM',0,0,0,0 ds 16 fcb$nr db 0,0,0,0 tictbl: db true,0 dw $-$ db true,0 dw $-$ numtic equ ($-tictbl)/4 ;must be at end of all "cseg" code. thread equ $ dseg ; this part can be banked @login: ds 2 ;position is assumed by special BNKBDOS3.SPR... ; must be first item in DSEG. hlast: dw hstart hleft: dw bnktop-hstart boot: lxi sp,stack lxi h,@vect mov a,h stai im2 ; Verify that we have banked RAM... ; init PIO,RTC and tick interupt call clrpio ;reset any PIO interupts pending mvi a,11$001111b ;bit control mode out pioActl mvi a,11000000b ;7,6 inputs out pioActl lxi h,piovec+0 ;bit-0 of vector must be 0 mov a,l out pioActl mvi a,1011$0111b ;EI, OR, HI, mask follows out pioActl ; mvi a,10111111b ;bit 6 only out pioActl lxi h,tick shld piovec+0 mvi a,rtcis out rtcadr in rtcdta mvi a,rtcic out rtcadr mvi a,00000100b ;enable INT on 1-second interval out rtcdta ; mvi a,01$001111b ;input mode out pioBctl mvi a,0000$0111b ;no interupts out pioBctl mvi a,01001010b out pioBdat lxi h,piovec+2 mov a,l out pioBctl ; mvi a,2 out sio1ctlB out sio2ctlB lxi h,sio1vec mov a,l out sio1ctlB lxi h,sio2vec mov a,l out sio2ctlB ei ; Initialize all modules and build tables. lxi h,thread ;thread our way through the modules, in0: mov e,m ;initializing as we go. inx h mov d,m ;next module, or "0000" if we're past the end. inx h mov a,d ora e jz init$done mov a,m ;device base number inx h inx h ;thread+4 = init entry (JMP) sui 200 ;if Char I/O module, build entry(s) in tables. jc notchr push d ;save NEXT module address mov c,a mvi b,0 dcx h mov a,m ;number of devices inx h xchg ;DE=init entry point lxi h,cdtbl dad b dad b mov b,a mov a,c in1: cpi 12 jnc in4 ;if device # overflows, adjust next step. mov m,e ; inx h ; mov m,d ; inx h ; inr a djnz in1 dcx d ldax d ;number of devices in3: mov b,a mov a,c ;DE=module address, C=device base add a ; *2 add a ; *4 add a ; *8 mov c,a mov a,b ;number of devices mvi b,0 lxi h,@ctbl dad b xchg ;DE=@ctbl indexed by device base mvi c,17+1 ;B=0 still, point to CHRTBL vector dad b ;point to chrtbl location mov c,m inx h mov h,m mov l,c ;HL=chrtbl add a add a add a ;num.dev * 8 = number of bytes in module's table. mov c,a ;B=0 still ldir ;copy modules chrtbl into system table. in2: pop h jmp in0 in4: sub c ;compute number of devices that will fit. jnz in3 ;continue with initialization of tables jmp in2 notchr: ;HL point to init entry push d call icall ;"call" (HL) pop h jmp in0 clrpio: call twice twice: reti init$done: ;all Disk I/O modules are initialized. mvi c,11 in5: push b call cinit pop b dcr c jp in5 lhld icovec shld @covec ;set console I/O lhld icivec shld @civec ; lhld ilovec shld @lovec ;set list output device lhld iaovec shld @aovec ;set auxiliary I/O device lhld iaivec shld @aivec ; lxi h,defsrc lxi d,@ermde+1 ;location of default search chain in SCB lxi b,5 ldir lda srctyp ani 000$11$000b mov c,a lda @civec-10 ;location of search type flags in CCP section ani 111$00$111b ora c sta @civec-10 lxi d,signon mvi c,9 call bdose ; was there enough RAM? call set$jumps ;setup system jumps and put in all banks ; fetch CCP for first time, system will put it in bank 1. mvi a,0feh ;don't try warm boot on error... sta @ermde ; lxi d,ccp$com mvi c,15 ;open file call bdose inr a jz noccp xra a sta fcb$nr lxi d,ccp mvi c,26 ;set DMA address call bdose mvi e,64 ;read upto 64 records (8K) mvi c,44 ;set multi-sector count call bdose lxi d,ccp$com mvi c,20 ;read record(s) call bdose mov a,h ;H=number of records actually read sta ccprecs xra a ;back to sta @ermde ;default mode for user lxi b,0001h ; save CCP in bank 0 for warm boots. call xmovccp ;NOTE: this restricts banked OS size. jmp goccp ; (allowing 8K for "CCP" and reserving page 0) wboot1: call set$jumps ; initialize page zero, selects bank 0 lxi b,0100h call xmovccp lhld wbtrap ; allow I/O modules to partake in the warm$boot. mov a,h ; ora l ; cnz icall ; jmp goccp xmovccp: call xmove lda ccprecs mov b,a mvi c,0 srlr b rarr c ;BC=number of bytes in CCP lxi h,ccp lxi d,ccp jmp move set$jumps: mvi a,(JMP) sta cpm ! sta bdos ; set up jumps in page zero lxi h,BIOS$0+3 ! shld cpm+1 ; BIOS warm start entry lhld @mxtpa ! shld bdos+1 ; BDOS system call entry lxi b,0100h ;source bank 0, dest bank 1 call xmove lxi h,0 lxi d,0 lxi b,64 call move lxi b,0200h ;source bank 0, dest bank 2 call xmove lxi h,0 lxi d,0 lxi b,64 call move lxi b,0300h ;source bank 0, dest bank1,"format:",9016 2,"data:",9029 3,"math:",9040 4,"finance:",9060 5,"print:",9080 6,"status:",9090 7,"HELP",6016 9,"STOP",1136 10,"utility:",9105 11,"program:",9120 12,"stats:",9130 13,"tables:",0147 14,"link:",0147 16,"format:",9016 17,"INSERT",313 18,"DELETE",1314 19," rows:",9016 20,"ROW TITLE",0122 21,"SET TYPE",6129 22,"SHOW ROWS",0302 23,"REORDER",2311 24," cols:",9016 25,"COL TITLE",0124 26,"SET TYPE",7132 27,"SHOW COLS",0303 28,"REORDER",2312 29," data:",9029 30,"ENTRY",0493 31,"ENTER",0491 32,"CHANGE",4492 33,"SELECT ROW",10472 34,"SELECT COL",11473 35,"FORMULA",12432 36,"GOTO",4461 37,"PLUG",14462 38,"FIX R/C",0463 39,"NULLIFY",15464 40," math:",9040 41,"ADD",3401 42,"SUB",3402 43,"MULT",3403 44,"DIV",3404 45,"NEGATE",1405 46,"INVERSE",1406 47,"INTEGER",1407 48,"ROUND",1408 49,"CUMULATE",6409 50,"ABSOLUTE",1410 51,"ADD K",6413 52,"SUB K",6414 53,"MULT K",6415 54,"DIV K",6416 55,"SUM",5445 56,"GET",1412 57,"FLOOR",6435 58,"CEILING",6436 60," finance:",9060 61,"SET DEPR",1011 62,"DEPRECIAT",10468 63,"SET LOAN",2012 64,"LOAN",10469 65,"DCF",2424 66,"IRR",3013 67,"RATIO",3425 68,"% OF TOT",6426 70,"PCT",3427 71,"K PCT",2428 72,"LAG",8430 73,"LEAD",8429 74,"GROW",6433 75,"SAVINGS",2434 76,"SET SCHED",4014 77,"DO TAX",5015 80," print:",9080 81,"OPTIONS",3203 82,"TITLES",1207 83,"REPORT",0206 84,"SHOW OPTS",0201 85,"SAVE REP",2208 86,"SET CRT",4204 90,"status:",9090 91," range:",9090 92,"ROW RANGE",5470 93,"COL RANGE",7471 95," mode:",9090 96,"RUN PGM",1006 97,"PROGRAM",8133 98,"COMPUTE",0467 99,"NORMAL",0005 100,"DEL STEPS",10135 101,"PROTECT",0007 102,"ORDER",13466 105," utility:",9105 106,"LOAD ALL",2141 107,"SAVE ALL",2142 108,"SET DRIVE",4128 109,"SET UP",1140 111,"LOAD TBL",2121 112,"SAVE TBL",2126 113,"CLR DATA",1127 114,"RESET",1130 115,"REDISPLAY",0131 116,"LIST TBLS",0309 117,"ERASE TBL",2144 118,"PRINT TBL",0304 120," program:",9120 121,"LOAD PGM",5137 122,"SAVE PGM",5138 123,"PRINT PGM",0305 124,"CLEAR PGM",12139 125,"SHOW PGM",0308 126,"LIST PGMS",0310 127,"ERASE PGM",5146 130," stats:",9130 131,"DELTA",8417 132,"% GROWTH",8418 133,"MOV AVG",8419 134,"SMOOTH",2420 135,"MEAN",5441 136,"SIGMA",5443 137,"VARIANCE",5442 138,"LOG",1421 139,"EXP",1422 140,"POWER",3423 141,"MAX",5447 142,"MIN",5446 143,"COUNT",5444 144,"TOTAL",5445 -99  117,"ERASE TBL",2144 118,"PRINT TBL",0304 120," program:",9120 121,"LOAD PGM",5137 122,"SAVE PGM",5138 123,"PRINT PGM",03%Q CURRENT=NAME PAGE NUMBERDATE (YEAR AS YY)MONTHDAY -RANGE BEGINENDTITLEDISPLAY ZERO VALUESNOYES REPORT OPTIONSDATE$PAGE., (NO=0,YES=1)ROW TITLE WIDTH COLUMN WIDTHCOLUMNS PER PAGEDECIMAL PLACESOMIT ZERO ROWS'SUPPRESS ZERO VALUES (NO=0,[-]=1,[ ]=2)"PRINT ROW TITLE AFTER WHICH COLUMN"NEGATIVE NUMBERS (-N=0,N-=1,(N)=2)#PAGE CONTROL (OFF=0,FEED=1,PAUSE=2) OMIT COMMAS DOUBLE SPACEOMIT LINE NUMBERSERROR IF:FILETABLEPROG.DIRERASED&&#1#2 TOP MARGIN LEFT MARGIN ENHANCEMENT: //: :X TOP MARGIN:  LEFT MARGIN: : : : : : : : : : : : : ##############,###.####BB<BB<@PB/X   -------@PB?0.00E***.000000--()%%***-___-=_*- z!M"}"}!M"}!M5%!M5%!M5%!M5%!M5%!M5%!M5%!M5%!N5%! N5%! N5%!$N5%!)N5%!>N5%!DN5%!GN5%!"!MN5%!PN5%!SN5%! !!!(*!bN5%*!sN5%*!N5%*!N5%*!N5%*!N5%*!N5%*!O5%* !$O5%* !IO5%* !VO5%* !dO5%!S͠*z|*z++|RYRY*z#R+)R~#foSS%TBTT*z*z{ozg| SR*z|SJG*z+++++++|8S* {*{{ozg"{S*z++++++|aS!"z!"zJG*z"z9:R*z+++++|wS!"zS*z*z{ozŠS÷R*z"zj *z*z)^#V "!!ͦ2!wOmͰmͰ!O$S!4!"z* {"z* {"zR* {"zJGR4KvH"z͖L*z|TͼI"z*z|T!"zL*zq:*z|;TI*z|;T͟JvH"z*z*z)^#V#"A*A"CÍT*CJ"z*z{zT*z*C)^#Vq:ÆU*C#"C*z}|\T*z+++|T!"z*{+*z^#Vog"zTSU*zog*z^#V#"A*A"C"U*CogJ"z*z{zU*z*C)^#Vogq:ÆU*C#"C*{}|T*z++++|SU!"z*z+*z^#V"zBT*z"zJG*z^#Vq:*z|vUL!"zHH* {"z͖L*z|ʒUÝUu*EU*z!! &!O$/W_"G*GÆW>!K'M!O5%*Oz5%*K+|UM!O5%*{z5%*K++|VM!O5%*{z5%*z*O$.V*Qz5%!"S!!wVͷ*{*M̈́$!Ö́$!P!!>!4!"S!!rWͷ*K{zV**z̈́$!!U4*U*{̈́$*{̈́$!-!U4*M*̈́$!!!͖A͹&W5%*z|VV*WͿ%|V/W*WI5%*OM5%*OW5%JG*zq:*S{z+W!' *I*S|AW!4÷V!!Wix*W!O$`W/W*W!!U4÷V!4!' .V*IõW*zͿ%{zW͠U|±W*{*z̈́$z5%*YX*]Ϳ%{zW*{*{3*]̈́$]5%*_|W!O"!*]͐ X!O"*]w*O]5%!"a*[iX*e#"e*_|5X͸W*c*{++|QX>ͮ!/42"g*z|`X!4>ͮ*cÖX>!k'*kx&*̈́$!2!U4*iX>!o'!*oͦ2*,{m*q!A3w*m^Y>!u'*z*u)^#V*z^#V"w*w!U "y*y *w}o|g"{*{! U "}*}  *{}o|g"{*}|JY*r{"}*z*u)^#V"w*sY>!'*{ozg"*!U {ozg"*! U {ozg"*!U {ozg"*!U {ozg"**z#Y+)Y~#fo)Z*Z\\`I\*z|Y*z}o|g(Z+)Z~#fo.beeegrUyy*`{lX*!!!iD"*z|RZ`**{{ozhZ*"`{*b{lX*!!!ciD"*z|ʐZ`**{{oz£Z%[*"b{*d{lX*!!! iD"*z|Z`**{{ozZ*"d{*f{lX*!!!iD"*z|[`**{{oz%[*"f{`*{*̈́$!!*ziD"A*z|N[*A*{{oza[ù[*!<*A*ziD"*z|ʀ[**{{oz–[*z"**A{z[*A"*A"z*"zJG*{*̈́$!!*ziD"A*z|[*A*{{oz[*!<*A*ziD"*z|\**{{oz%\*{"**A{z9\*A"*A"{*"{JG!O!!!(͖A5%*z|k\!O!!!(͖A5%*z|ʍ\*j{5%*l{5%* {"z!Uz5%*{lX!O!!!2iD"*z|\`**{{oz\*"{*{lX!O!!!2iD"*z|]`**{{oz0]*"{*z}{oz\]*{lX!O!!!iD"*z|g]`*z}{oz**{{ozғ]*"{*p{lX*^#V!!*{iD"*z|]`**{{oz]*"p{*r{lX*^#V!!*{iD"*z| ^`**{{oz^*"r{*v{lX*^#V!!*ziD"*z|O^`**{{oze^*"v{*t{lX*^#V!!!iD"*z|ʕ^`**{{ozʫ^*"t{*x{lX*^#V*̈́$!!!iD"*z|^`**{{oz^*"x{*z{lX*^#V!!!iD"*z|'_`**{{oz=_*"z{*|{lX*^#V!!*v{+iD"*z|n_`**{{ozʄ_*"|{*{lX*^#V!!!iD"*z|ʴ_`**{{oz_*"{*{lX* ^#V!!!iD"*z|_`**{{oz`*"{*{lX* ^#V*̈́$!!!iD"*z|F``**{{oz\`*"{*{lX* ^#V*̈́$!!!iD"*z|ʒ``**{{ozʨ`*"{*~{lX* ^#V*̈́$!!!iD"*z|``**{{oz`*"~{*zq:*{lX*^#V!!!iD"*z|-a`*{lX*^#V!!!iD"*z|]a`*{lX*^#V!!*{iD"*z|ʍa`*{|ʟa!lXæa!lX**̈́$!!!iD"*z|a`*|a* {"{*+|a*{"{**{{ozb*"{**{{ozb*"{**{{oz-b*"{* {"z* {"z*!͙X*!Ö́$*d{x&̈́$!Ö́$*f{x&̈́$!Ö́$*b{x&̈́$!*{&̈́$*̈́$!Ö́$*`{x&̈́$!͙X!"Ac**{̈́$*x&̈́$!Ö́$*{̈́$5%*h{*)^#V͹&!O$c**͙X:c*h{*)^#V*̈́$*͙X*#"b*O! ͙X*{x&Ö́$!Ö́$*{x&̈́$! ͙X*^#V!P̈́$*p{x&̈́$! ͙X*^#V!P̈́$*r{x&̈́$!͙X*^#V!P̈́$*v{x&̈́$!͙X*^#V!P̈́$*t{x&̈́$!͙X*^#V*̈́$!P̈́$*x{x&̈́$!͙X*^#V!"P̈́$*z{x&̈́$!͙X*^#V!&P̈́$*|{x&̈́$!͙X*^#V!*P̈́$*{x&̈́$!͙X* ^#V!.P̈́$*{x&̈́$!͙X*O!͙X*{|e*5% e*5%!(!ͦ2* ^#Vm!2Pm*m*{|Ge*5%Pe*5%!(!ͦ2* ^#Vm!6Pm*m*~{|Še*5%Óe*5%!(!ͦ2* ^#Vm!:Pm*m! 4*zq:*z|*z++|e* {"z* {"z*v{*|{{zf*v{"|{!>P5%*Ϳ%*{*{{ozg"*{|3f*+"***{++ &VP̈́${5%*{+*{{ozg"*{++*{{ozg"*{{zf*+"*+"*!U *}o|g"*!U *}o|g"*!YPy-*{og!aPy-!ͷ!iPa!{͎*!qPy-*{og!yPy-!ͷ$!P !{͎*{og!Py-!PI!{͎*{}o|g*{{ozg*{U +"{*{*z{zg*z+"{*{}o|g*{#*{ {ozg"{!!ͦ2*&{wJG<4|g*zog*z^#V"{*zq:ͨ>*z͍6!"h͸W*#"*{}|g!P5%*b{"*b{c{ozph*n{!͉%"b{*n{!! &"d{*n{!! &"f{*b{|*b{*{{ozҒh`i*|h*d{x&*{̈́$*̈́$*f{x&̈́$*̈́$*b{x&̈́$]5%*+|i*f{x&*̈́$*d{x&̈́$*̈́$*b{x&̈́$]5%*++|`i*b{x&*̈́$*d{x&̈́$*̈́$*f{x&̈́$]5%*"b{*`{|ʩi**{̈́$*ex&̈́$*]Ϳ%*S}o|g3*]̈́$]5%͸W!"Fj*h{*)^#VͿ%"**S{zi*S"*{z*h{*)^#V͹&!P$?j*O*S*{ozg!U 3*h{*)^#V̈́$]5%͸W*#"ҵi͸W*~{|bj]!P5%*A"j*X*z*w)^#V5%*Ϳ%|™j*{5%**{*!G)+͉%*}͉%5%**}3*]̈́$]5%*#"*A*|{+*{zkj*]*{̈́$*j{*3̈́$]5%*A*|{"Ïk*X*z*w)^#V5%*Ϳ%|Lk*{5%**{*!G)+͉%*}͉%5%**}3*]̈́$]5%*#"*}|k͸W*~{|®k]!P5%*A"%l*X*z*w)^#V5%*Ϳ%|k*{5%**{*!G)#*{ &5%**}3*]̈́$]5%*#"*A*|{+*{zk*]*{̈́$*l{*3̈́$]5%*A*|{"l*X*z*w)^#V5%*Ϳ%|•l*{5%**{*!G)#*{ &5%**}3*]̈́$]5%*#"*}|gl͸W*~{|l]!P5%*A"Ãm*X*~{+|0m*]*{̈́$*}+!P&̈́$]5%|m*}!U +!P&*{̈́$*x&̈́$*}!P&̈́$*}͉%*]̈́$]5%*#"*A*|{+*{zl*]*{̈́$*!P&̈́$]5%*A*|{"Jn*X*~{+|m*]*{̈́$*}+!P&̈́$]5%Cn*}!U +!P&*{̈́$*x&̈́$*}!P&̈́$*}͉%*]̈́$]5%*#"*}|m͸W͸W!"*X*z*)^#V*w)))̀!͎*z{{z!!Ҳn*5%üq*t{"*{zn*+"*{{zn*{+"!P͉!"o!P͟!͎*#"**{zn!!7o!X!͎Fo!!͎!̀/x&5%!̀/!PͿґo!̀/!Rx&P̈́$5%!P*!G){zo!P5%üq!P*!G)"*|o**+͉%ŀ5%*!P̈́$*#* &5%p*ŀ5%!P*͉%5%*|/p**̈́$5%*{+|*y+++|*+++|[pìp*ŀͿ%"ßp*ŀ!%*̈́$*̈́$5%*+++"*ŀ*͉%ŀ5%*{zgp*ŀ*̈́$5%!!p*q*{|p*P̈́$5%*{+|q*!P̈́$5%!"*{++|*q*P̈́$!P̈́$5%!"*+|*y|Yq*!Q̈́$5%*#"*++|*y|҂q**̈́$5%*y+|¢q*!Q̈́$5%*#"*y++|¼q**̈́$5%*Ϳ%*}*a{ozg*}|q!Q5%!"**}*a{ozg*3*]̈́$]5%*"a!/4*z*z{oz*{++|Lr2"gJG*z|\r!4* {"z!I|{r!54* {"z*O]5%>ͮ*{m*{*{)^#Vm*`{"e*~{|¹r*p{+++"ÿr*p{"*z{+|r! Q5%*z{++|r!Q5%*z{+++|r!Q5%!"ǀ*{"A*v{x*A*v{+*{{z0s*A*v{+"6s*{"*p{"S*A"^s*X*S*}"S*#"*}|Es*S*ǀ}|s>ͮ! 4*S{zs>ͮ* {"z!4y*_|²s>ͮgQj*z"ɀÞx1|s>ͮ* {"z!4y*z*ɀ)^#V"*z*)^#VaY*++++| t×x*x{|*{z*t{t*{"Mt**{{ozFt÷u*#"*z*)^#V*z*)^#V)))̀!3t*~{|št*ɀx&!3]5%*+|t*O*z*)^#VͿ%*S}o|g!U 3*]̈́$]5%*++|u*O*r{*|{ 3*]̈́$]5%*+|?*{z/Du*]*{̈́$*z*)^#V̈́$]5%÷u*A"Wu\n*#"*A*|{+*{zMu*]*{̈́$*z*)^#V*3̈́$]5%*A*|{"ìu\n*#"*}|u*+++|*]Ϳ%{zu͸W*|uw!(!Q*! &&ˀ5%*+++|Lv*_|)v!(!Q&ˀ5%͸WLv! s%*]̈́$*{*{&̈́$]5%*~{|dv*]! Q̈́$]5%*+|¨v*O*z*)^#VͿ%*S}o|g͛3!U 3*]̈́$]5%*++|v*O*r{*|{ 3*]̈́$]5%*+| w*]*{̈́$*ˀ*z*)^#VͿ%͉%̈́$]5%͸Ww*A"Cw*X*{*ˀ̈́$*}͉%*]̈́$]5%*#"*A*|{+*{zw*]*{̈́$*O*3̈́$]5%*A*|{"òw*X*{*ˀ̈́$*}͉%*]̈́$]5%*#"*}|w͸W*{+|w͸W*{z* }| x!"w͸W*#"*}|w* {oz-x*{+|-x! s%]5%* {oz?x͸W*ɀ*z{z* {ozdxX*z|oxy*ɀ*z{z* {ozҗxgQj*ɀ#"ɀ*z}|s*{|´x͸W*{+|x! s%]5%͸W**{{zxX*z|xy*v{*A"A*{x}| s*Oˀ5%*O5%*O5%*Oŀ5%*_|2y>ͮ*{m>͖ͮU*z|Ty*{ͨ4!"y*h{*)^#V!!U4**{̈́$*x&̈́$!!!(͖A5%*z|ʯy`*Ϳ%{zy*h{*)*5%*#"^yr* {"_͠U|y*z5% z*{*z̈́$5%*!!!>q͟r!' *z|0z*{"_*{ͨ4* {"zj ͝A͉èy͝ffffA>533333>=ii<0$;9"s {ozҗxgQj*ɀ#"ɀ*z}|s*{|´x͸W*{+|x! s%]5%͸W**{{zxX*z|xy*v{*A"A*{x}Chang Labs ,MP-3 # 5086, 7044 MPLOGIC OVL[MPMENU FILMPPRINT OVL[MPSERIAL$$$ 3 call xmove lxi h,0 lxi d,0 lxi b,64 jmp move ?timot: ; (B)=I.D. (C)=count, (DE)=routine address push d to1: mvi e,numtic lxi h,tictbl di to0: mov a,m cpi true jrz to2 cmp b jrz to2 inx h inx h inx h inx h dcr e jrnz to0 ei mov a,c ;don't wait if all it wants is to clear a possible ora a ;existing entry, since none exists for that module. jrnz to1 ;-- maybe we should "ei hlt" and then jump -- pop d ret to2: pop d mov m,b inx h mov m,c inx h mov m,e inx h mov m,d ei ret noccp: lxi d,ccp$msg errx: mvi c,9 call bdose di ! hlt gett: inr c ;test for "FF" jz sett ;FF=set time ti0: lxi d,rtcsts+(numrtc shl 8) lxi h,time lxi b,rtcadr+(rtcsec shl 8) ti1: outp b ;select reg inr b in rtcdta mov m,a inx h outp e ;select status reg in rtcdta ora a jrnz ti0 dcr d jrnz ti1 lda timemon ;if last accessed month is greater lxi h,lstmnth ;than current month, the year must be cmp m ;changed. cc setyear$1 ;assumes 1 year elapsed lda timesec sta @sec lda timemin sta @min lda timehrs sta @hour mvi a,28 sta mondays+1 ;set February=28 lda timeyrs call bcdbin mov b,a lda timecnt sui 19h mov a,b jrz ti1@0 adi 100 ;adjust for century ti1@0: sui 78 ;years since 1978 (base year) mov b,a ; inr a ;adjustment for leap year calc. mov c,a ; srlr c ; srlr c ;divide by 4 = number of leap years (exclusive) ani 11b cpi 11b ;is this year a leap year? jrnz ti2 mvi a,29 sta mondays+1 ;set february=29 ti2: lxi h,0 lxi d,365 ti3: dad d ;find number of days since 1978 djnz ti3 dad b ;(B=0) add in 1 day for each leap year lda timedat call bcdbin mov c,a mvi b,0 dad b ;add in days of this month lda timemon call bcdbin dcr a ;if January, nothing left to add. jrz ti4 mov b,a lxi d,mondays ;add in days of each month upto this. ti5: ldax d inx d add l mov l,a mvi a,0 adc h mov h,a djnz ti5 ti4: shld @date lda @sec ret sett: lda @hour sta timehrs lda @min sta timemin lda @sec sta timesec lhld @date lxi d,365 mvi a,28 sta mondays+1 ;set february=28 mvi b,0 ;start counting years since 1978 ti6: mov a,b ; check for leap year ani 11b ;every 4 years, xri 10b ;starting with 1980 jrnz ti7 stc ;one extra day for leap years ti7: dsbc d ;does this year fit in @date? inr b ;count a year. jrnc ti6 ;yes, keep taking out more days (by years) mov a,b ;is this year a leap year? ani 11b xri 10b jrnz ti8 mvi a,29 sta mondays+1 ;February=29 stc ti8: dadc d ;normalize @date (we subtracted one too many) dcr b mov a,b adi 78 ;adjust year to 1900 mvi b,19 ;century cpi 100 jrc ti8@0 inr b sui 100 ti8@0: call binbcd sta timeyrs mov a,b call binbcd sta timecnt xchg ;remainder into DE mvi b,1 ;start taking out months. lxi h,mondays ti9: mov a,e sub m mov c,a mov a,d sbi 0 jrc ti10 mov e,c mov d,a inx h inr b mov a,b cpi 13 jrc ti9 ti10: mov a,b call binbcd sta timemon sta lstmnth ;also set last accessed month mov a,e ;left-over must be date of month call binbcd sta timedat ; set day-of-week using Zeller's congruence: lda timeyrs ;E=([2.6m-.2]+K+D+[D/4]+[C/4]-2C) mod 7 call bcdbin ;0=sunday mov d,a lda timemon call bcdbin mov b,d sui 2 jrz ti11 jrnc ti12 ti11: adi 12 dcr b ti12: mov c,a add a add c ;*3 add a add a ;*12 add c ;*13 dcr a mvi c,0 ti13: inr c sui 5 jrnc ti13 dcr c lda timedat push b call bcdbin pop b add c ;[2.6m-.2]+K add b ;+D srlr b srlr b ; [D/4] add b ;+[D/4] mov c,a lda timecnt ;century call bcdbin mov b,a slar b ; 2*C srlr a ;; srlr a ; [C/4] add c ;+[C/4] sub b ;-2*C mov c,a jp ti14 neg ti14: mvi b,0 ti15: inr b sui 7 jrz ti16 jrnc ti15 bit 7,c jrnz ti16 dcr b ti16: mov a,b add a add b ;*3 add a add b ;*7 bit 7,c jrz ti17 neg ti17: mov b,a mov a,c sub b inr a sta timeday mvi a,clrcnt ; out rtcadr ; mvi a,00000011b ;reset fractional seconds out rtcdta ;we now have one second to set time mvi d,numrtc lxi h,time lxi b,rtcadr+(rtcsec shl 8) ti18: outp b ;select reg inr b mov a,m out rtcdta inx h dcr d jrnz ti18 ret setyear$1: mov m,a ;set last-month dcx h dcx h mov a,m adi 1 daa mov m,a jrnc sy0 inx h mov a,m adi 1 daa mov m,a dcx h sy0: mvi d,3 ;3 registers to update lxi b,rtcadr+(rtcyrs shl 8) jr ti18 bcdbin: mov b,a ani 00001111b mov c,a mov a,b ani 11110000b rrc mov b,a rrc rrc add b add c ret binbcd: sui 100 jrnc binbcd adi 100 mvi c,0 bb0: sui 10 inr c jrnc bb0 adi 10 dcr c slar c slar c slar c slar c ora c ret mondays: db 31,28,31,30,31,30,31,31,30,31,30,31 time: timesec: db 0 timemin: db 0 timehrs: db 0 timeday: db 0 timedat: db 0 timemon: db 0 db 0 ;thousandths of seconds, 4 bits only timeyrs: db 0 timecnt: db 0 lstmnth: db 0 numrtc equ $-time getdrv: lxi h,@dtbl ! ret @dtbl: dw dnull,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 dnull: dw 0,0,0,0,0,0,0,0,0,@dircb,@dtacb,0 db 0 seldsk: mov a,c ! sta @adrv ; save drive select code lxi h,@lptbl mvi b,0 ! dad b ; create index from drive code mov a,m cpi 255 jrz selerr sta @pdrv mov c,a mov b,e ;save login flag thru "search" routine call search jrc selerr sta @rdrv shld curmdl push b ;save login bit lxi d,14 dad d ;point to dphtbl mov e,m ;DE=dphtbl inx h mov d,m inx h mov c,m ;BC=modtbl inx h mov b,m lda @rdrv add a add a add a ;*8 mov l,a mvi h,0 dad b ;select mode bytes shld @cmode ;set current mode pointer pop b ;get login bit back. bit 0,b ;test for initial select. jrnz notlgi xchg ;DE=modes mov c,a mvi b,0 dad b ;+*8 dad b ;+*16 dad b ;+*24 lda @rdrv mov c,a dad b ;+*1 = +*25 shld @dph call setup$dph jrc selerr xra a sta @rcnfg mvi a,3 call calmod ;call module's "login" routine. ora a ;see if an error occured. jrnz selerr lda @rcnfg ora a cnz setup$dph jrc selerr lda @adrv add a mov c,a mvi b,0 lxi h,@dtbl dad b lded @dph mov m,e ;set current DPH in @dtbl inx h mov m,d jr selcom ;DE=dph selerr: lxi h,0 ret notlgi: lda @adrv add a mov c,a mvi b,0 lxi h,@dtbl dad b mov e,m ;get current DPH from @dtbl inx h mov d,m ;DE=dph sded @dph selcom: lhld @cmode lxi b,0 ; bit 7,m ;Tracks-per-side not valid for Hard disks. jrnz selxit inx h ; ; bit 1,m ;unless its Z17... ; ; jrz sc0 ; ; mvi b,4 ;then side 1 has 4 less tracks (8 on DT) sc0: mvi a,40 ;assume 5" ST inx h bit 7,m ;check 5" drive jrz sc1 mvi a,77 ;8" drives have 77 tracks sc1: mov c,a ;set side 0 tracks sub b mov b,a inx h ;fix for HT bug bit 5,m ;check for DT jrz selxit slar b ;multiply # of tracks by 2 if DT slar c ; selxit: sbcd @tps lded @dph lxi h,+12 dad d ;point to DPB entry mov c,m inx h mov b,m push b ;save DPB ldax b ;sectors-per-track, byte value lxi h,+15 dad b mov b,m ;psh inr b gh2: dcr b jz gh3 srlr a jr gh2 gh3: sta @pspt ;physical sectors per track xchg ;put DPH in (HL) for BDOS mov e,m inx h mov d,m ;DE=sectrn dcx h pop b ;BC=dpb ret setup$dph: ora a ;reset [CY] lhld @cmode ;HL=modes bit 7,m ;check for hard-disk drive (modes not standard) rnz call ?getdp stc rnz lhld @dph ;restore dph mov m,c ;set XLAT table inx h mov m,b lxi b,12-1 dad b ;point to dpb mov c,m ;get DPB addr inx h mov h,m ;(HL=dpb) mov l,c xchg lxi b,17 ldir ora a ;reset [CY] ret ; Allocate space from hash pool. ; Does nothing if space exhausted (caller must init for "no hash") ; BC = size of hash, DE = &DPH.HASH ; Preserves BC, A ?halloc: lhld hleft ora a dsbc b rc ; no space shld hleft lhld hlast xchg mov m,e inx h mov m,d inx h mvi m,hbnk xchg dad b shld hlast ret home: lxi b,0 ; same as set track zero settrk: sbcd trk ret setsec: sbcd sect ret setdma: sbcd @dma lda @cbnk ; default DMA bank is current bank setbnk: sta @dbnk ret sectrn: mov l,c ! mov h,b mov a,d ! ora e ! rz xchg ! dad b ! mov l,m ! mvi h,0 dcx h ;sectors numbered 0 - (n-1) ret read: mvi e,6 ;read entry is +6 jmp rw$common ; use common code write: mvi e,9 ;write entry is +9 rw$common: ;do any track/sector/side conversion... xra a sta @side lhld trk shld @trk lhld sect shld @sect lhld @cmode bit 7,m ;floppy or hard-disk? jrnz rw0 inx h inx h inx h bit 6,m ;DS jrz rw0 mov a,m ani 01110b ;DSALG lxi h,dstbl mov c,a mvi b,0 dad b mov c,m inx h mov h,m mov l,c call icall rw0: mov a,e calmod: lhld curmdl jmp addjmp ; leap to driver ;; 0 1 2 3 4 5 6 7 dstbl: dw wrap,alt1,cont1,cont2,alt2,dsret,dsret,dsret cont2: lda @pspt ;as done by Gnat srlr a ;SPT must be EVEN mov c,a lxi h,@sect mov a,m sub c ;don't change the sector number on side 1 rc mov c,a ;save for cont1 jr side1 cont1: call cont2 rc mov m,c ret ;side1 already set alt1: lxi h,@trk rarr m mvi a,0 ral jr sside alt2: call alt1 ;Kaypro ora a ;side 0? rz ;yes, done. lxi h,@sect ;for KAYPRO, sectors on side 1 lda @pspt ;are numbered PSPT+1 to PSPT*2. add m ; mov m,a ret wrap: lbcd @tps ;B=tracks on side 1, C=tracks on side 0 lda @trk ;(for all except Z17, B=C) cmp c rc neg add c add b dcr a sta @trk side1: mvi a,1 sside: sta @side dsret: ret multio: sta @cnt ! ret flush: xra a ! ret ; return with no error @side: ds 1 ; current side of media (floppy only) @trk: ds 2 ; current track number @sect: ds 2 ; current sector number @cnt: db 0 ; record count for multisector transfer @dbnk: db 0 ; bank for disk DMA operations @pspt: ds 1 @tps: ds 2 @rcnfg: ds 1 trk: ds 2 sect: ds 2 @dtacb: dw dtacb1 @dircb: dw dircb1 dircb1: db 0ffh ;drive db 0,0,0,0,0 dw 0,0,2100h ;directly after CCP image (max 8K CCP) db 0 dw dircb2 dircb2: db 0ffh ;drive db 0,0,0,0,0 dw 0,0,2500h db 0 dw dircb3 dircb3: db 0ffh ;drive db 0,0,0,0,0 dw 0,0,2900h db 0 dw dircb4 dircb4: db 0ffh ;drive db 0,0,0,0,0 dw 0,0,2d00h ;dir buffers: 2100-3100 db 0 dw 0000 ;end of DIR buffers dtacb1: db 0ffh ;drive db 0,0,0,0,0 dw 0,0,3100h db 0 dw dtacb2 dtacb2: db 0ffh ;drive db 0,0,0,0,0 dw 0,0,3500h db 0 dw dtacb3 dtacb3: db 0ffh ;drive db 0,0,0,0,0 dw 0,0,3900h db 0 dw dtacb4 dtacb4: db 0ffh ;drive db 0,0,0,0,0 dw 0,0,3d00h ;data buffers: 3100-4100 db 0 dw 0000 ;end of data buffers @scrbf dw 4100h ;scratch buffer 4100-4500 ; Max. system space: 4500h to "bnktop", 38K if 8K common. end  G:Ҏ>xʝʝw>ɯw̩z:»!>wɯ:=zxzz::G:=/ͽx:Āy!4 šn!6@G:x: P:<: P n6 t6! ^6 t6u:)<͠^!DNE`Se(New matrix may not fit in current memory1You may have to set matrix to size of your table )using SETUP command before loading table.z!M"}"}!M"}O!͎!!҃NM!!͎*z#)))*z# *z)##!!!N*&{w!Mm!̀?!Mw!Nw*z*z!!!z(*z!!!z(*z!!!z(*z!!!z(*z!!!z(*z!!!z(*z!!!z(*z!!!z(*z!!!z(*z!!!z(*z!!!z(!"O*z*)*s#r*z*)*s#r*#"*z}|O!"P*z*)*s#r*z*)*s#r*#"*z}|O*{*z{z\P*z+"{*{}o|g*{#*{ {ozg"{!"{*{*{"{!"{*{*{"{*{*z}|P*z"{*{*z}|P*z"{!"z*z"z!"{*z"{!"z*z"z!"z*z"z!"z*z*z)^#V "͝!eN5%!N5"MicroPlan" 50,20 15,10,1,"" 0,0,0 "KAYPRO" 9,80,24 2,27,0,0,0 61,32 0 0 0 0 0 0 0 0 27,67,48,27,67,51,27,67,49,0 0 0 27,66,51,0 0 0 32,27,66,48,0 0 32,27,66,48,0 0 27,66,48,0 27,58,0 0 5,24,4,19,27 0,127,13 "COMMAND KEY SECTION" 37 65,51,66,52,67,53,68,54,69,30,70,35,71,36,72,79,73,46,74,79,75,71,76,138,77,135,78,39,79,79,80,37,81,32,82,67,83,55,84,68,85,79,86,137,87,79,88,38,89,79,90,79,43,41,45,42,42,43,47,44,61,56,37,70,36,49,94,139,62,73,60,72,64,74 "FUNCTION KEY SECTION" 0,0,0 0 0 0 27,66,51,0 0 0 32,27,66,48,0 0 32,27,66,48,0 0 27,66,48,0 27,58,0 0 5,24,4,19,27 0,127,13 "COMMAND KEY SECTION" 37 65,51,66,52,67,53,68,54,69,30,70,35,71,36,72,79,73,46,74,79,75,71,76,138,77,135,78,39,79,79,80,37,81,32,82,67,83,55,84,68,85,79,86,137,87,79,88,38,89,79,90,79,43,41,45,42,42,43,47,44,61,56,37,70,36,49,94,139,62,73,60,72,64,74 "FUNCTION KEY SECTIR OLD NUMBER NEW NUMBERROWS COLS  PER.  UNDER BLANK DEC FOR TYPE LINE LINES SIZ MAT COLUMN DEC FOR WIDTH SIZ MAT data subt head note omitNAMETITLEREPORT OPTIONS SECTION: STEPCOMMAND PARAMETERS DIRECTORYDATEPAGE (NO=0,YES=1)ROW TITLE WIDTH COLUMN WIDTHCOLUMNS PER PAGEDECIMAL PLACESOMIT ZERO ROWSSUPPRESS ZERO VALUES"PRINT ROW TITLE AFTER WHICH COLUMNNEGATIVE NUMBERS#PAGE CONTROL (OFF=0,FEED=1,PAUSE=2) OMIT COMMAS DOUBLE SPACEOMIT LINE NUMBERSERROR IF,%  - K= -  - USE -$ ---- ---- ----- --- --- --------- - ---- ==== ____ page - # - # - % $ No,-$ ----- --- --- --------- - - % $ No,  V ##.## Table: ### x ##C TABLE NAME=- : ##/##/###: ###:  -  :  -  1:  2:  3: --- TOP MARGIN: LEFT MARGIN: : : : : :  (NO=0,[-]=1,[ ]=2): :  (-N=0,N-=1,(N)=2): : : : : PROGRAM FILENAME= - ### V(###/##)###  ## PROGRAM=  STEPS.- ### V(###/##)### ##TABLEPROG.DIR-ERASEDFROM TERMINAL #: B:MULTI.SYSMSG # I.D. OF RECEIVERALLSEND TO TERMINAL #. USE TO END. B:MULTI.SYSMSG # USE TO END.MSG # z!M"}"}!M"}!M5%!M5%!M5%!M5%!M5%!M5%!M5%!N5%!-N5%!BN5%!]N5%!cN5%!jN5%!zN5%!N5%!N5%!N5%!N5%!N5%!N5%! !!!(*!N5%*!N5%*!N5%*!N5%*! O5%*!O5%*!0O5%*!TO5%* !fO5%* !O5%* !O5%* !O5%!NU͠*z|*z++|ҁTi`ÄT͋`*z#T+)T~#foUUUUpV*z*z{ozg|ʶTÄT*z|TJG*z+++++++|T* {*{{ozg"{ÎU*z++++++| U!"z!"zJG*z"z9:ÄT*z+++++|"U!"zÎU*z*z{oz5UbT*z"zj *z*z)^#V "!!ͦ2!OmͰmͰ!O$yU!4!"z* {"z* {"zÄT* {"zJGÄT4KvH"z͖L*z|ʰUͼI"z*z|U!"zL*zq:*z|UI*z|U͟JvH"z*z*z)^#V#"A*A"C8V*CJ"z*z{z1V*z*C)^#Vq:1W*C#"C*z}|V*z+++|mV!"z*{+*z^#Vog"zpVV*zog*z^#V#"A*A"CV*CogJ"z*z{zV*z*C)^#Vogq:1W*C#"C*{}|V*z++++|V!"z*z+*z^#V"zU*z"zJG*z^#Vq:*z|!WL!"zHH* {"z͖L*z|=WHWu*EuW*{"G1|qW>ͮ!4* {"z* {"G*GòW*K#"K*K*M}|W!"I*I*O*K! &͹&\%"I*IìX>!S'*O*K#! &!U͎!0"]X*K#"K*K*M{zW!"]X*O*K#! &\%"]*]0}|/*]9{z/W*S+|QX!U*z^#V"Q*Q*S++|rX!U*z^#V"Q*Q*z{zX!U*z^#V"QèX!U*z^#V"Q*Q*Y>!a'*z{zX*{*{̈́$*z*a)^#Vx&̈́$*{̈́$_5%&Y*{*{̈́$*z*a)^#Vx&̈́$*{̈́$_5%*_j_*ge5%*gi5%!z"k!z"m*z~8{ozŸY*z*k)^#Vx&!Ö́$*z*m)^#Vx&̈́$*{̈́$i5%*z0{oz*z~8{ozY*zͿ%"M*zO5%!"K1]!"oZ*o#"o*o*z}|Z*c*z*o)^#V*z{ozY*z*o)^#V! 3i5%*zͿ%{zZZ*i*z̈́$*{̈́$i5%*z|eZ]*z+++++|uZH^*zͿ%{z*z++++|*z|*z}|/ҴZ*c*zZ+)Z~#foZ[-[S[[$\P\\\\\]]-]*i*ë́$i5%*c*mͯXe5%*c!z̀x&!Ö́$*mͯẌ́$e5%*c*kͯXe5%*mͯX*ë́$e5%*c*{*{̈́$!z*z^#Vx&̈́$*{̈́$*{̈́$*{̈́$!z*z^#Vx&̈́$e5%*c*z}|/*z{z/*z|[P\ \*z*k)^#Vx&*̈́$!Ö́$*z*m)^#Vx&̈́$e5%*c!z̀x&Ö́$*{̈́$*mͯẌ́$e5%*c*z*k)^#Vx&*̈́$!Ö́$*z*m)^#Vx&̈́$e5%*c!z̀x&*̈́$*mͯẌ́$e5%*c*c*{*{̈́$*z*m)^#Vx&̈́$e5%*c*{*{̈́$*z*m)^#Vx&̈́$e5%*c*c*mx&e5%*c*cxW"q*q|e]*i*ë́$i5%*gz5%*gO5%*c*qs%*ë́$e5%*qL{oz£]!͵Wx&*ë́$e5%*qV{oz]!͵Wx&*ë́$xWs%̈́$!͵Wx&̈́$e5%1]*z+++| ^*mͯX*ḯ$i5%*z+++++|D^*kͯX*ḯ$i5%*mͯX*ḯ$i5%*c*z++||^*zc{ozy^*mͯX*ḯ$i5%|^_*z++++|*z+++|^*kx&*ḯ$!Ö́$*mx&̈́$i5%*z+++++|_*mͯX*ḯ$i5%*i!Ö́$*kͯẌ́$i5%*c*z{z=_*i*{̈́$*{̈́$*mx&̈́$i5%b_*i*{̈́$*{̈́$*mx&̈́$i5%*c*c_>!u'*z*u)^#V*z^#V"w*w!U "y*y *w}o|g"{*{! U "}*}  *{}o|g"{*}|_*r{"}*si`>!'*{ozg"*!U {ozg"*! U {ozg"*!U {ozg"*!U {ozg"**z#`+)|`~#fo```*z|ʋ`*z,}o|g`+)`~#foNaOac+f kq2s4moo tvxyCz!,4vEJG*z8{oz`*z"]`*z"]*!!*]iD"*z|a**{{oz$a`*!4!*]iD"**{{ozMa`* {"z* {"z*{"*{"A*{*{"**z}|a*z"!!ͦ2*4{m!!ͦ2*!23w*{!3m*!3m*!3w!!O&m!Om!!P&w*A"C]cKW| b*|b*,{m*Cx&*{̈́$*z*C)^#V*z^#V̈́$!3m*z*C)^#V*z^#V_** #! &m!P* #! &m* {oz¯b!+Pmb*|b!3Pmb!;P"**|b!CPmb!IP"*+!OP* #! &m*CJ"z*z| c-Y)ci!aP5%*|Ac*{*ḯ$wVc*{*ḯ$!3w*C#"C*}|b*gz5%*gi5%*|‰c! 4* {"z* {"z*{"*{"A*{*{"**z}|c*z"!!ͦ2*4{m!!ͦ2*!23w*{!3m*!3m*!3w!!cP&m!fPm!!P&w*A"CÜeKW|Gd*|Ud*,{m*Cm_*z*C)^#V*z^#Vi5%*{*i!G)"*{zd*i*+͉%*{̈́$*i*#*{ &̈́$i5%*Cx&*{̈́$*ḯ$!3m*}x&! 3m*{|e*{"{e*{+"{*{x&!3m!P*y #! &m!Pm*CogJ"z*z|_e-Yhei!P5%*|ʀe*{*ḯ$wÕe*{*ḯ$!3w*C#"C*}|>d*gi5%*gz5%*|e! 4f>!'>ͮ*42"*z|e!4*JG>ͮ*+f!I|!f!54* {"z*z"* f|4f* {"!/e*z|Lfhj*z!P̈́$"*z!PͨZ*zT*z9B!Pm*{wB*m*w!!P&wB*!P̈́$"*d{T*f{T*b{T!7͎*!P̈́$"*`{9B*m!Pm*zx&m!Pm*zx&m!Pm*m!Qm*{x&m!Qm*{x&wB*m! Qm*h{^#Vw*m!Qm*h{^#Vw*m!Qm*h{^#VwBB*{{zg!/e*z|ʳghj*{m*w!!Q&wB!"A*z"!͎͢a*z|ghjBB*{{z h!/e*z|hhj*{m*w!! Q&wB!"A*{"!͎c*z|PhhjBB*{{zjh!/e*z|uhhj*m*w!!#Q&wB!&Qm*{x&w!4Qm*{x&w*^#Vm!CQm*p{x&w*^#Vm!GQm*r{x&w*^#Vm!KQm*v{x&w*^#Vm!OQm*t{x&w*^#Vm*m!SQm*x{x&w*^#Vm!WQm*z{x&w*^#Vm!nQm*|{x&w*^#Vm!rQm*{x&w* ^#Vm!Qm*{x&w* ^#Vm*m!Qm*{x&w* ^#Vm*m!Qm*{x&w* ^#Vm*m!Qm*~{x&wB>ͮ*{ͨ4>ͮAW*{"* {"z k*z{oz*z{oz*z{oz*z{oz*z{oz*z+|*z++|*z+++|go"**z|k* {"z! 4 f|(k!/e*z|:khj!Qm*{wB*m!#͎*w!Qm!<!Q&w*z"!"z!"ClKW|ʎkmͼI"z!Q"*C̀j|ʮk}l*z{ozk*{Q̈́$"!z*z^#VT!z*z^#V}l*z{z8l*{!Q̈́$"*z*z)^#V*z*z)^#V5mwl*{!Q̈́$"*zog*z^#V*zog*z^#V5m*{m!#͎-Y*iw*C! U   *C}o|g|´lB*C2{oz*{{zl!/e*z|lm*C#"C*z}|kBB>ͮ*gi5%*gz5%*{ͨ4>ͮAW* {"z*"z*z|Jm! 4* {"z* {"z*{Q̈́$!Q̈́$*zx&̈́$!Q̈́$ͨ4!!ͦ2*,{m*!3m*!!3m!!ͦ2*,{m*{m!1!Q&m*z"!"z!"!"CYo*z|m*"zͼI"z*C* {ozg"!*ͦ2*,{m*,{!23m!*ͦ2!Q"*C̀j|Ynn*z{ozšn!Q"!z*z^#VT!z*z^#Vn*z{zn*{!Q̈́$*{̈́$"*z*z)^#Vn*{!R̈́$*{̈́$"*zog*z^#V! *ͦ2-Y*i!!3m*C!U  *C}o|g|Ro!0e>ͮ*#"*C#"C*z}|m*C!U  *C}o|g|ʹo!*C* {ozgͦ2*g!23m*"z*gi5%*gz5%! 4* {"z!R5%o!R5% f|o!/e*z|p×p* {"z!!pͷ*{*̈́$!R̈́$!!!>!!pͷ*m*w!@!R&wÉp!!ix*!R$ʉp*w* {|gp!' >ͮAW*{ͨ4>ͮ!4p>!'!*#*x&&R̈́$!7R̈́$*̈́$͐*æq*{"!;R!!!>!!!ix*!! &"*!%! &"*|**{ozzq!' *!*#!ix!' * {"*"**z }|q!"4* {"zp"*|q*x&HR̈́$!OR̈́$*̈́$!!U4*z }o|g"!RR!!*iD"*z|&r**{{ozBre!dR5%Qr*x&e5%*eiR̈́$!}R̈́$ͨ4*s*g!!!-͖A5%*z|ʍrJG*Ϳ%|›rr!R!!!>**{{ozr!"r*ͷp*#"*}|rr*ͷp!' p"*|*s*x&R̈́$!R̈́$*̈́$!!U4* {|hr*z }|Ms!"4* {"z!Rͨ4sp"*|ʵs*!U  "**{ozg"*x&R̈́$!R̈́$*̈́$!*U4!"s1|s* {"z! 4*#" Ҿs* {|Ws t*z*)^#V*zF5%**z"z**{oz#tu**}|:t!"]@t!"]*z*)^#V"*"Ãt*z*)**]*z^#Vs#r**]"**{ozYt*z*)*s#r!"t*z*)^#V*z*s#r*#"*z}|t!"u*J"z*z{z*z}|u*!zz!zͱnu*]+|Qu*z*)^#V!z͎sku*#*z^#V!z͎su*!zz!zͱu*]+|¶u*+*z^#V!z͎su*z*)^#V!z͎s*#"*z}|tͽKͨ>* {"zv*z*)^#V*zF5%**z"z**{oz)vu**}|@v!"]Fv!"]*z*)^#V"*"Év*z*)**]*z^#Vs#r**]"**{oz_v*z*)*s#r!"v*z*)^#V*z*s#r*#"*z}|v!"w*ogJ"z*z{z*z}|w*!zz!zͱzw*]+|]w*z*)^#V!z͎uww*#*z^#V!z͎uw*!zz!zͱw*]+|w*+*z^#V!z͎uw*z*)^#V!z͎u*#"*z}|vujx>!'*z*)*g5%*z*)*g5%*z*)6#6!"Yx*z*)^#V*)))!͛*#"*z}|5x*x>!ŀ'*z*ŀ)*g5%*z*ŀ)*g5%*z*ŀ)6#6!"x*z*)^#V*ŀ)))!͛*#"*z}|x*À<4|xLy*z*z)^#V*z^#VͿ%{zy!44* {"z*z*z)^#Vmx*zog*z^#V"*z"v*z*z)^#V*z^#VͿ%{z|y!34* {"z*z*z)^#Vw*z*z)^#V"*z" t<4|ʰyz*zogmx*z"*zog*z^#V"**{ozy*#*z^#Vog"zv*z"*z*z)^#V"*zw**{oz@z*#*z^#V"z tj ͝A͉èy͝ffffA>533333>=ii<0$;9"s*g5%*z*ŀ)*g5%*z*ŀ)6#6!"x*z*)^#V*ŀ)))!͛*#"*z}|x*À<4|xLy*z*z)^#V*z^#àO"CHOOSE (SL=1,SYD=2,DDB=3,DDB-SW=4) BOOK VALUE SALVAGE VALUELIFE (IN YEARS) LOAN AMOUNTTERMINAL BALLOON PAYMENT AMOUNTTERM OF LOAN (YEARS)ANNUAL INTEREST RATE (%)ANNUAL PAYMENTNUMBER OF BRACKETSUPPER LIMIT FOR BRACKETMARGINAL TAX RATE (%)ENDING MARGINAL TAX RATE (%)SCHEDULEEARNINGSTRIAL WHICH COMMAND!ERROR IF(CHOOSE (ANNUAL=1,QUARTERLY=4,MONTHLY=12)PV= FV= R=% N= PMT=? PLEASE WAIT@<A #@>IRR: z!M"}"}!M"}!M5%!M5%!M5%!M5%!N5%!N5%!2N5%!HN5%!bN5%!rN5%!N5%!N5%!N5%!N5%!N5%!N5%!N5%ïP>!'ãP*{*!*ziD"*z|P***{{ozʣP*z*)^#V"** {|]P*Q>!#'Q*{*#!*ziD"*z|P*!**{{ozQ*z*)^#V"!*!* {|¾P*!äQ>!-'ØQ*-!!!͖A/5%*/Ϳ%|YQ%!{͉*1/5%!%*z|eQ!%!N*/!G)|‘Q*/!%͎*1/5%!%!4* {|Q!%!R͠*z|*z++|Q͆TQͰT*z#Q+)Q~#foRRS5SS*z*z{ozg|QQ*z| RJG*z+++++++|+R* {*{{ozg"{R*z++++++|TR!"z!"zJG*z"z9:Q*z+++++|jR!"zR*z*z{oz}RêQ*z"zj *z*z)^#V "!!ͦ2!OmͰmͰ! O$R!4!"z* {"z* {"zQ* {"zJGQ4KvH"z͖L*z|RͼI"z*z|S!"zL*zq:*z|.SI*z|.S͟JvH"z*z*z)^#V#"Q*Q"SÀS*SJ"z*z{zyS*z*S)^#Vq:yT*S#"S*z}|OS*z+++|µS!"z*{+*z^#Vog"zøSFT*zog*z^#V#"Q*Q"ST*SogJ"z*z{zT*z*S)^#Vogq:yT*S#"S*{}|S*z++++|FT!"z*z+*z^#V"z5S*z"zJG*z^#Vq:*z|iTL!"zHH* {"z͖L*z|ʅT*z#T+)T~#foTTUWWYwZ*z|ʰT*z }o|gT+)T~#foZ][_ddf*z+++++|T!4* {"z*z{zU! 4* {"z*!!!iD"U*z|.U*U*{{ozDU!"U*Q̀!W͎*z|]U!!WxU!!W͎*Q̀!_͎*z|ʑU!!_ҬU!!_͎*Q̀!g͎*z|U!!gU!!g͎!!o͎*z++++++| V!4* {"z*z{z$V! 4* {"z! O!!! iD"U*z|CV*U{zVV!"U!"w*Q̀!W͎*z|uV!!WҖV!!W͎!"w*Q̀!_͎*z|ʯV!!_V!!_͎!"w*Q̀!g͎*z|V!!g W!!g͎!"w*Q̀!o͎*z|#W!!oDW!!o͎!"w*w{zaW*Q̀!y͎!!y҂W!!y͎!"w<4|ʞW!QP!z͎îW!ͲP!z͎<4|W! 4* {"z*z++++++|W!4* {"z*z++!U "*!!*iD"U*U*{{oz/W_*z{ozg|(X!"Y**{̈́$*x&̈́$Q̀!W͎*z|_XW!{ͱwX!!W͎*Q̀!o͎*z|ʐX!!oҫX!!o͎*z*z)^#V* )))!W͉*z*z)^#V* #)))!o͉*z* u8*z* #u8*#"*U}|1X*Q̀!o͎*z|@Y!!o[Y!!o͎*z*z)^#V*U ##)))!o͉*z*z)^#V!)))*U͛*z!u8*z*U ##u8*z{zY! 4* {"z*!!*ziD!z͎*z|Y*{!z ZûY!z*z^#V!z͎*!7!*ziD!z͎*z|KZ*{!z]ZûY!z*z^#V!z͎*!!*ziD"* {"z*z*z)^#V!)))*U͛*z*z)^#V!)))!W͉*z*z)^#V!)))!_͉*z*z)^#V!)))!g͉*z*z)^#V!)))!o͉*z!u8*z!u8*z!u8*z!u8*z!u8*z!u8!!oͱ!o͎!!o !͎!!gI!y-!͎! !yͱ!y͎*w#[+)[~#foh\\]]|^!!oI!o͎! !yI!y͎*z|[!Ẁx&7Ö́$!!!ͦ2!"[g!!*,{m*!A3w*#"4g!' ! 4*z*)^#Vz‰g!'4!"!"þg*z*)^#V!}|g*###"*#"**{zg* {!@!!>!!hͷ!*!!*!!*!!' !!ͦ2*1!A3w*,{m*!A3w*,{m*!A3w*,{m*!A3w*15%*15%*15%! 4!' !.4j ͝#Vm!CQm*p{x&w*^#Vm!GQm*r{x&w*^ÀQMPLAN ;`@V`dRB!"{͖* d  =""6#}|B=!"{ "}00-!~G#~ }q+ph##a"p#w *}"}" }"}* }*}*}}!a6#6#q#p*}" }* }|`i"}* ,X5 }HƐ'@'_ ERROR $ AT PC $"DM6#6#!"*{w#zw!">2DM}|*ڄ"^#V{^#V{_zWڄ{zҾ*w#ww#w###s#rq#p#!5#ʄOM+F+N*}|!"~#fo{z }|~#~#~#O~G!}|*##^#V}|?s#r##q#pw#w#~w#~w7!N#F#~#foho}|p`i}W:0!9BKÞ DM!9͞ !9! 9N#F#͞ ͷÖBKw !9DMw ͖DMw !9DM! 9DMw !9DM͖ͷͮ!9DMË ͮË DMw !9DM*!9DMw !9DMͷʹʹ*Lͷͫjͫ!9DMw d͌ͫ! 9DMw !9DMͷ̓j̓ë͌̓ÅDMZ!9DMw ͼ !9!9!9DM w ͮü @PP"4}̀*4}!9~w{_!y+##!}2*7}  |g"7}!HU >'-lw# M>@2}2} #}͋ À*%*}§#}*&}"7}>26}:}Ww !}:6}w #}͋ w !}#}͞ !#}:6}w:#}W!}2#}w r24}2}o&G>Ow# $q#,:#}!}V$}Ϳ M>u}g b!*}< }!$}{7>' #i +>'w#>'w #†:#}2} !}~PM:4}M6!}~ U+w# @ }6w{26}$}!}~#!$}~#!}q#!}"4}~#M/G$}*4} +#4?MG+}*4}'w# :!6}5*4}#  }g !"}~ȯw+6+wo:}<2}OF!} 怮w J_#~ȓAPw>26}`i"4}2+}}*4}>'#>'#>'#>'#>'#>'#>'>'wڮ*4}Ϳ #~'w!+}~w:6}=826}!}ì}͞  }g bDZA}2}x2}iOG>F2}!}r#ti`)!}~'w#… ~ !} +» #?µ! < !}=> pT]w+ ~w!}}G# :!}з! !}!}5q!!} }w+) p!}55 p!} + + + + + + 'm P'> 'm o g"}`i}â *}|• ɵ!}â ~#~#~#~#~#~#~#~#!}'w#'w#'w#'w#'w#'w#'w!9~A 6/OG #6= x>#w| DM!x& y), )2 )8 )> )D )J )P )| | ʖ zp x)yOxGyxڈ GyO#=t ogeop p )ګ #£ OÍ U `i!:}A$:Y}ä * ͏*# >*ø . ͏#>.¸ 2N}S - ͏# .>-¸ >2C}2N}OS >2C}+ \̏͏ä 2E}3 > 2E} ͏#2 ,H >2M}2 !N}q.d >2=}͏#d X !?}q^w ͏j !A}q-ˆ >2D}͏>26}Z}͋ :}O 2@}2B}!}r#§ :N}ʵ =2F}:C}> â :C} :A}!B}67 y@G /%2M}2C}2D}Z}w 2:N}2@}Gy@w:C}!D}>_ >_ 4!@}5<2F}:@}!?}G:A}x :B}OxGxҢ "}W?< =… z` zg !"}~ʢ bÈ :F} :D}!C}:@} :N} >-G:E}OW* $ $ :D}!C}  Oz y:N}ʩ—:C}—:}©×:}2> >0> 26}}g b!<}~2>}6:}@2B}!A} lr6!B}p2@}/O!} #~ ʌ y2?}=/2=}:@}>0é:6}=!@}5:@}2M}!=}~>.:<}!=}/:A}:B}G:?}G2?}x:6} !?}5:?}:A}M>E!B}:<}'5~ 2/<-Gyx/ : Gyx0:D}^2D}2C}:<}:>}2<}":}|ƒ:<}~W#^#:<}¬zʢ~# Ò|~:K}2<}9NS"I}"G}:Y}/!&\̏͏͏ʳ/͏âͼͳI g :<}> !{4O:9}3* YI Bg >2{> #> #I ]g :<}:{e> k͎b͎B!9}:{=B29}!6}~5*O}~+"O}0G>0 0:M}:A}:@}>,*:}:}> >-*U}|*F>2<}~G#N#"U}"W}`i"Q}"S}w!#\&Å/ʃ&ʃ!ʃ\… x…2<}9UN. xQ"K}*S}|£*Q}"S}*U}ì+"S}*W}~#"W}2Y}*I}~#"I}*G}|+"G}ͼ> ij":}!<}454!9:Y}#/!&$͏$>$*͏*>*-)͏#.>-\̏͏*U}++!"U}ã:00!{~Gwog:00! !*|ʭF#N#èNͅ# xž ͅP"}2}z͋*}#"} {  >2{:}d2}2b}GW2}͖~"B͖3͖~"92}~,^͖R*}A:|ʏo&##a6#|Gw#†*}s#r:|#ʠ:}+~ʲ"·:} !c}q~!| w !s}rimproper input - reenter $AY|'##ap#q#w xs#rAgxB! w#wYDMgYDMg*}DM*}}|ODF#N# "}͈go͂ ڢOͅo&͂o&}2o&E{2xn&}!9>OP"}>2}y2}w# +2}2}+ +-!>2}+0.P:}/2}y“+0&:}=2}>Eʙeʙ7gyGʅ :}2}ҁxÅ:}ړ:}<2}+&y+ ʙG-_ʲxµ+7G+7OxG{G:}@*}wɯ2}y2}++->2})DM)) O +7:}&z/W{/_s#r:}=2}~#0:?^#V* }||~!b}N q!c} ^!|!s} n&*}"}*}!4#Çuu2~zW{_!~5ʏ*}w |g}o"}*~|g}o"~b*~*}DM*};͙"}*}"}BN|>>>)=; a"};p#z *} "}"}}2}á}*}$ ~#$*} } w#%f}~#DF*}r+s"}:}=|!}~@w"})|v>(>NF|ʠ~ #~#ʟG*}:ʣz6#> 6 #=©x:Ҡw#2&~K .2&~K N"~!~"~xҟw#p~|Ÿ*}!DM!:+ w7 G>w:&~r._# X7*x:}>*x>2&~6?#`ڄ{҄_:ʟ*ʟ?ʘw#:}ڧIF>?Ó*}*}}O|Gr# x½*}*}#{z"}2'~͹.}z:'~*}!~w:'~*}!~w͍>*}!^w#Vw*}. s#rͬ>6zQ|EX*})}w#w}^#f|OEk2'~͹.}uzک*}!:~ʩ!~wͨ¬MEf} s#rf} ^#VzFU"}*})} ^#V"}*}"}!9"}á} :}RB="RU"|IR"+DM*}W*}{o>g+{z_yW͋!*} s#r!}~w"}zm!!9"}*u*u+uzҶ!!9"}+u+u*}*}s#r͡*}!0! ~#~!}>w:}2(~!!(~53ͫ :}2}*}+"}ì*}"}!}~wS͙͋"}:}*}~A *}|eRE"!9"}*}*}#{zڧ"}:}*}n&:}͙͋"}Ý!|e , Gy2 p#*}|A|!")~ e"!0~6,!-~6!|".~?20~!|".~2-~:0~ <A K{e!0~f s*.~w#".~!-~~ s#r~#fo,F#NyOxO<*}as#rr#sOA#wzEAA;;<>"s#r*}|A €!}~ЇwWR"͡*}*}{_zW{z<ͫ=³͡Ҭ!}>w*}*}|DW"G:<}x *}| *}|ER"+"}͋*}"}:}7*}! N#F p+q*}w!}>w!9"}}:<}e>"p:<}>"Æj ÆL :<}>,:<}ڞ>"p:<}>"ÿj ÿL :<}*}|++> +|> > *}!0! w#w*}+"}!}~w*}*}|EFf} ^w#VwzCU""}͋ͭ͡͡z^ EX} w#w6!à })~#fo' *1~#"1~{zp f} ^w#VwzDU""}ͭ͡zڿ EX͒^ !9"}!͹}u<FR"*}"3~!͹}u<.!*} *3~~# !u6*3~"}6!6*3~"}6!!͹>2}}*} 6?##6?!"5~_*}~ʁ!=_"}<EX]"}<EX##FNu!`*}O yŷ!~##!!!~#!!*5~"5~å!62}*5~)!*}!\"}}!hw#"!e~ 8"6O#6V#6Ld"CQ"#~OK"#~Md"CTOK"#~VK"#~LK"\:00ڀ"!b~w<CM*}*#¥" "¯"##"N#F#x" g o" ="  GO" _ W"yx "Ó""* {z#*|#+~w*"9~!";~*9~"7~j$T#*7~";~##^#V*7~"9~*{z*#h#*7~^#~W>##'#!";~*j$ʂ##~w+Ç#";~##^#V*{zq#:eO#]!!$#ª#*{z#\!ʻ#a$*\!*{z#\a$CX!9$(~#)$!À\ʀ\! "\\*;~}ʂ${Ozر~#foo$=`'PY`' |¿$##a"=~n'v'v'''*=~! 9SLz%|#%`'PY`'y_xW/%x$$# x$''%%ɯ>`'$7$`'$7?$z$N#FyA%x+͵'|V%~&~ws#r`'l%n&'AC!an'q++*zSS`'yxҢ%PY##a"?~n'BKv''*?~|`'++'zSS`'yOxG& ##a"A~n'BKv''*A~|~&DMxg&zg&|~#+/&'!`'yOxGm&yxJ&PYa"C~n'BKv''*C~SS!"C~_&!<}~2E~w2|&j *|&##axw#q#|v':E~2<} !|4^w|~&`'&a~&~_w# x&`'! an'BKv'++"H~|!"F~X'`'X'`i ##a"F~n' xB'G*H~p#z7'X'v'*H~+|"H~C''*F~|DM~G#N#zw#s#xʇ'@͠'|'yʙ'Ow# 'yOw#w#w#w#  '^#V* }||~!9 ''~#fo5%##('~#'='`i"J~^#V* }|)(*J~w#w}6(;(>=(>2O~!_~"}~!9N#F# y2T~~(2L~+~+ng# *}~s#r#"}~DM:L~=](+~+ng# :O~_ "U~a"W~*U~"[~)"Y~*W~+F+N ##6# x¼(~#fo#:O~_ og"]~:T~,)2L~*}~+V+^"}~)*[~*]~"[~*Y~+r+s"Y~*M~+"M~|(#~#fo#)og"]~:L~=(*W~*J~s#r:T~=@)"~"~"~ů>MP*~k*ʿ)`i"~*~yx+"~ڿ)*~k*ʿ)`i"~\“)+ x‹)"~*~í)#))*~*~}|)!*~b**~b*"~2~!"~*~*~}|?*~*~~\!~*6 *!**~#"~*~#"~*~#}|)*~*~F*~*~#N!~~Z*x?^*#M*y0 !\*y_A6x7?|~|DM~G#N#/ *SQ.w ʹ~͋ w !}~G w!}!-o|g~x-ܴ>~͋ .ʹ~͋ ~w ~̓~ͮ=*Ë / 2~ w +͖x+ ͫ~!.͞ 2~>.͵/~͋ w ͼ ~w }.!6.m+`+ʹL+#P+:~',Ë :~}UË CbQYDes/ 2~=+LN>A.w ʹ͒/~͋ 2~~!.͞ ʹ/>͵/~͋ ~w ~!.͞ .>͵/~̓~ʹ~͋ :~AO> ,/GZ.ͮ.ʹ~ͮË ~͋ .w Ã/ :W zw  /ͫ/:}L,/ͮ:}s,ͮ/w,ͫ҂,!}~w:}:ک,~͋ /̓~͋ ʹB/>͵/Ë /w /ͮ͋ ;,/w !}~>w2~:}A,~͋ ~͋ -͒/~͋ /ͮ~͋ ~w ʹ>/͵/:~!}wË -O-~͞ ͑+w ʹ!9DM͋ *!9w!9-ʜ-DM͑+w ʹG--ʘ-~͞ ͑+w !9DMq-!9w! 9-S-DM͑+w !9DMʹD-~NE~!9͞ /;,~Ͱ,/w ~̓/Ë 07HWgtA1A@P\d5bEHyed"BA1PYTAE(('@ @@I@hfffff?hfffffA>533333>=ii<0$;9"sU':9"sU'9BT8!%8hxVg 7"hC60wYEG417Gv@`v'b1AAPX#C`QI"U&Àe(HBCTbDvRWaGv"C%T$a'ÙH%Csrb"(HdA1AAXS&YA1AIy&cypt dYd?Sh&&iyv&3uF=84SY592xXT(E133@P5D @cbe@(u?Bp6W>W"f(@E3Sx~͋ .ͮ~͋ w .ͫ~Ã~͋ /ͮ~ʹ! DM=/~ Ĵ~î!9DM MPERROR.FIL--, --Y#NORMAL RUN PGMPROGRAMCOMPUTECOMPUTE R/OC/OR/CC/R - - P 2*{"~2͋}/o|/g*~}/o|/g{ozg|;1*~ͦ"~*{"~*~*J{{ozs1* {"~!"{!"{*{"{*~*~*B{{ozŽ1*{#"{*~*~*D{{oz©1*{+"{*~*~*F{{oz1*{+"{*~*~*H{{oz1*{#"{*~*{*{)*~s#r*{{oz2!"{2*{#"{* {|1*~ã2!"~* {"~Z21|?2* {"z*~*{|*{|Z2*~*{*{{oz-2*{"~*{*{)^#V"~*{{oz˜2!"{ß2*{#"{*~Ø3>!~'*~*${"~*~*${"~*{|2*{m*"{s%m*~s%m*~s%m*{+|(3*{m*~x&m* {s%m*~x&m*"{s%m*{++|S3*{m*"{s%m*~s%m*~s%m*{+++|”3!s%m!Hs%m*~s%m!s%m!Vs%m*~s%m*~3>!~'*~{z3*~"~3!"~*~3>!~'*~͛3*{&*~̈́$*~͉%~5%*~94>!~'*~Ϳ%*~}o|g͛3*{&*~*~͉%̈́$~5%*~R4*z{zW_"~*~å4>!~'*~*~ͦ2*({Ϳ%{z4*~m*({má4*~*~P{ozg3m*~4>!~'*2{*~̈́$!!U4*,{m* {"z*~&5>!~'!0!@!!>!*~!~ix!' *~ͨ4*~~5%*~5>!~'*{|d5*z|d5!!~d5*~*{+3m*~*z|5!!~ҁ5*>{m~!{ͱ~!{ͱ?Ү5*{*{+%m5*{"!~̀*z|5!!~5*:{m*~Ê6>!'*Ϳ%|6*~5%**{*!G)"*{zh6!(s%**+͉%̈́$*{̈́$**#*{ &̈́$!)s%̈́$5%Æ6!(s%*̈́$!)s%̈́$5%*7>! '* "z*@{m*z" 7*{ }o|g* *z{ozg###ͦ2* x&*{̈́$*z* )^#V̈́$! 3m* #" *z* {z6*,{m* 7>!'!**{{ozgͦ2*z*)^#V*z^#V!{ozg|u7*{}o|g"{7*{"*z|ʓ7*8{m*+"Ù7*6{m*x&*{̈́$*z*)^#V*z^#V̈́$*3m*,{m*{"z*r8>!'**{{ozg*{ *{!ͦ2*z|8*8{m(8*6{m*{m*{!U +!0&*x&̈́$*{!0&̈́$*{+͉%m*,{m*{"z*9>!'*z*)^#V!{ozg|ʣ8*{"z**z*)^#V"*z*)^#V"**{{z**{}|**{{z**{}| 9*{"z***{{ozg*{ *{**{{ozgͦ2*z|J9*<{mV9*:{m*{m*z*)^#V*)))̀)5*,{m*{"z*6:>!!'*z*#)^#V"z*z*!)^#V"z*{*{̈́$*#x&̈́$*{̈́$*z*z)^#V5̈́$!0̈́$*{̈́$*{̈́$*!x&̈́$*{̈́$*z*z)^#V5̈́$*{̈́$!!U4*n:<4|T:*z*z)^#V7j:*zog*z^#V7*%G;>!)'*){z:*{*{̈́$*z*))^#Vx&̈́$*{̈́$*z*))^#V5̈́$*{̈́$!!U4*)|=;*{*{̈́$*)og*z^#Vx&̈́$*{̈́$*)og*z^#V5̈́$*{̈́$!!U4*)"z*'Ç>>!-'!"+*/|*-|u;*+*{|ʀ;k>*z|ʋ;*=<4|ʖ;f<*/|W_*1{ozg|ʷ;*{"z<*zog*z^#V*-"z*z*z}|;*z"z*z{z;!"z*z*{{z<*z"{* {"z*z*{}|5<*z*{{ozg"{* {"z*z|M<9:* {"z*z7*z*z)^#Vogq:k>*-|W_*1{ozg|ʇ<*{"z;*z*z)^#V*/"z*z*z}|<*z"z*z{z*z*z)^#V*-"3*z*z)^#V*/"5*3*{}|k=*5#"5*{"3*5*z}|=*3#"3*z"5*3*{}|=*{"3*5*z}|=*z"5*5*{{z=*5"{* {"z*5*{}|=*5*{{ozg"{* {"z*3*{{z>*3"{* {"z*3*{}|*>*3*{{ozg"{* {"z*z|`>*z*zu8* {"z*z*5)^#V*z*3)^#Vu8*5*3͂9!"{!"{*z"+* {"7*+å>1*,{m*{*{J;"9*9ÓA*{"z͊>|ʹ>è>*z*{{ozg*{{z>*z*{{ozg"{*z*{{ozg*{{z ?*z*{{ozg"{*{+|?!"{*{+|'?!"{*{*{"{*{*{"{*{*z}|Q?*z"{*{*z}|e?*z"{!!ͦ2*4{m*6{m*~*{3m*{!ͦ2*{" ?KA**{}|?*{"*~*+͉%*{3m* #" *{}|?͊>|?è>!!ͦ2*6{m*{*{3m*{" 5@KA*~*#*{+ &*{3m* #" *{}|@͊>|K@è>!!ͦ2*6{m*{!0&m*{" À@* 7* #" *{}|r@͊>|ʖ@è>*{" A* 7*A}|@ A*:{m*{"@*{m*z* )^#V*z^#V*z*)^#V)))̀)5*#"*{}|@͊>|Aè>* #" *{}|@* {"z*z|DA*z*zu8*;9:*;*z* )^#V*z^#V~5%*~Ϳ%|zA*{~5%*{*~!G)"*;*;fD>!?'!:s%*Ë́$*C*AU4*~G5%*EͿ%*C##"I*{"7*GͿ%*I*Aͦ22"~*~s%K5%*{*{J;|Bͨ>*7|$B*{"7A*z|0B*=*~0}|/W_*1{ozg*~9{z/W_{ozg|gB×C*1|ŸB*~ }|/*~~{z/*~{zҟB×C*~*R{{oz²BC*~*L{{oz*~ {ozB!O'*Ox&Ϳ%"W*S|•D* {"1D!(s%*U!G)|D*U*{̈́$!(s%̈́$*Qx&̈́$!0̈́$*Ox&̈́$!)s%̈́$U5%*U*S!*W͖AG5%*z|E*M*GͿ%|.E*{"M*M*G"I*I*Q{z/*I*O}|/eE*I"M*M!4D*MéE*{!!!͖A͹&G5%*G!0$ʥE* {"z*YF>!]'*]Ϳ%|E!"[*[*]"z*{*]!G)#"_*]*_! &"z*{*]*_G)#"_*{*]*_G)"a*]*_*a*_{ozg &z5%*]*a#! &!z͎*{*]*a#G)#"_*]*_! &!z͎*z!U "z*z!dU *z  {ozg"z*z *z}o|g"[*[GG*z *z"z*zx&*{̈́$*zx&̈́$*{̈́$*z̈́$*{̈́$!z̀x&̈́$*{̈́$!z̀x&̈́$c5%*cEH!!ͦ2*0{m*{!3m*{m*{m!0*z #! &m*{m*{m!0*z ++! &m!0m*{m*{m*zx&m!0m*zx&m!0m*{m*{m*{x&m!0m*{x&m!1m*{|)H!1m/H*{m!1m*,{m*{"z*esH!!z͎!!z͎!"z*~z5%*gùIHH*{"z*{"z*{!!*ziD"_*z|ʩHJGyH*_*{{oz*z+|H!4yH*_*{{ozH!͍6yH*z*_)^#VzI!'4yH*z*_)^#V5w*z*_)^#V!U "z*z*_)^#V!dU *z  {ozg"z*z*_)^#V*z {ozg"i*z {ozµI*z*_)^#V*z {ozg͍6yH*iI*{"z*z*z{zI* {"z*k*z#"z*z*z)^#VͬE"k*kÜJ*z*z{zJ!4* {"m*m*z#"z*z#"z*z"TJ*z*)*+*z^#V5%*+"**z}|1J*z*z)F5%*z|˜J*{*{̈́$*z#x&̈́$ͨ4*mJ<4|ʸJ!!J;"J!!J;"*|Jͨ>*o1K>!s'*s{z K*z*s)^#V*z^#VͬE"q-K*sog*z^#V*z^#VͬE"q*qúK*z{oz*z{oz`K͟J*u*{*z{ozg*z{ozg|ʀK*u<4|ʜK*z*z)F5%óK*zog*zF5%͟J*uÓL*z*z{ozK*w*z{zK7L*zog*z^#V"I*I*{{z L*{"I*I*{}|L*{"I*z*I)^#Vog"zL*z*z)^#V"I*I*{{z[L*{"I*I*{}|oL*{"I*z*I)^#V"z*zq:* {"z9:*wL1*z{ozg|ʾL* {"z!"z!4ͽK*yL*{ͨ4ͽK*{L*}L*0-!~G#~ }q+ph# ORDERMODE ROWCOL= ENTER COMMAND NEXT STEPVERIFY (Y OR N) <--DONE.Purchased from: Copy number: Copyright Version,(C) COPYRIGHT, CHANG LABORATORIES,INC. 1981 . #Hewlett Packard 100 series )12345678901234576789012345678901234567890MPSTATMPFORMMPPRINTMPSHOWMPLOGICMPEXTMPPOSTMPSPECMPDIFMPREG MPSERIAL.NUM MPSETUP.FIL A.01.00 ###.##C# (C), 1981 Chang Laboratories, Inc.E`SehJ&me800R&a79c23R&a0cR&dJh***##############,###.####BB<BB<@PBX MPHELP.FIL UTLDATES.DAT CURRDFLT.FIL MPMENU.FIL PPMENU.FIL PPHELP.FIL::.Error while trying to load file from diskette.You may have a bad diskette.-SERIAL number is missing or has been altered.)MPSETUP.FIL is missing. Check Appendix A.The menu list is missing.Error in MPSETUP.FIL#Contact your dealer for assistance.z!M"}"}!M"}/R{!M5%{!M5%{!M5%{!M5%{!M5%{!M5%{!M5%{!M5%!s%{5%{!M5%{!M5%{!N5%! N5%!N5%!,N5%!7N5%*!AN5%!oN5%!N5%!N5%*5%͘Q!"z!"!"z!"z!"z!"z!"z!" {!"{!"{!d"z*z!!!z(!"z*+|R!"z*z!!!z(*z!!!z(!!!!{(!("{!"{! !!!z(*z!N5%*z!N5%*z!N5%*z!O5%*z!O5%*z!O5%*z! O5%*z!(O5%*z!0O5%*z !7O5%!!!!{(!s%{5%!s%{5%!!aͷ*{zT!>O!!!>!!aͷ*{z?T!!i!i!]x!' !"RTB*#"HT!"!"*Ϳ%"!"âT**! &\% **"*#"*}|wT*Ϳ%"!"T**! &\% ** "*#"*}|T**{ozg"*{z0U**{oz0UaÃU*5%wU!!]x*|cU*5%**s%*̈́$5%* {|?U*!!aͷ!LO!!!>!!aͷ!!zix!!z]!z]x!!{]!{]!{]!{ix!!i!{]!ix*"{*"{!!i!z]!{]!]x!!{]!]!]!]! {]x!!"{]!${]x3U{5%3U{5%*{3U5%*{3U5%*{3U5%*{3U5%3U5%3U.{5%3U,{5%3U5%3U0{5%3U2{5%3U4{5%3U6{5%3U8{5%3U:{5%3U<{5%3U>{5%3U@{5%3U&{5%3U({5%!!F{]!H{]!B{]!D{]!J{]x!!Z{]!N{]!L{]x!!i!]x!s%\{5%!s%^{5%X!!]!]x*s%*\{̈́$\{5%*s%*^{̈́$^{5%*+"*|W!!i!R{]!T{]!]xX!!]!]x*s%*V{̈́$V{5%*s%*X{̈́$X{5%*+"*|;X!' *z}{oz±X*zm*m!YOwX*z*̈́$!cÖ́$"*z!lOͨ?*m!tOw*wBBB*m*w*m*wBBBBB*5%*5%!"N!͎!!XYO!!͎*z*z !!ͱY!" b*z{z/*z{z/*zc{z*z{zY!" b*{++++|*{*{}|Y!" b*{++++|*{*{}|Z!" b*{|*{{z1Z!" b*{P}|GZ!" b* }|*c{zmZ!" b*s%{5%*|ʕZ*s%*{̈́${5%*|ʱZ*s%*{̈́${5%*m*,{m*z}{ozX[L!s%5%*m!Om*m!Om*m!Om*m!Om!"E[*m!Om*x&m!Om*m!Om*#"[*m!Om! "v{*{"r{*{"t{!"p{!*{&!Ö́$*{%{5%!O5%*Ϳ%*{*{{ozg"*{|¾[*+"***{++ &Ö́${5%*{+*{{ozg"*{++*{{ozg"*{{z\*+"*+"*!U *}o|g"*!U *}o|g"*!Oy-*{og!Oy-!ͷ!Oa!{͎*!Py-*{og! Py-!ͷ$!P !{͎*{og!#Py-!PI!{͎*{}o|g*{{ozg*{U +"{*{*z{z]*z+"{*{}o|g*{#*{ {ozg"{!!!!h{(*h{!+P5%*h{*h{^#V5%*h{*h{^#V5%*5%!"z!"z*{"z*{"z!"z*z"z!"{*z"{!"z*z"z!"z*z"z*}o|g"{!"{*{*{"{!"{*{*{"{*{*z}| ^*z"{*{*z}|4^*z"{!"z {!.P5%!!^ͷ!:P!!!>!!i!i!i!i!i!ix!' **̈́$*̈́$*̈́$*̈́$*̈́$n{5%!!5_ͷ!HP!!!>!!i!i!i!ix!' *"z*"z*"z*"z!!_ͷ!VP!!!>!!aͷé_!!]x**{{ozˆ_!' _!*z*)i*z*)]x* {|`_!!bͷ!bP!!!> {!nP5%S_*{Ϳ%{z`*{!͉%͹&!zP̈́${5%ͅ%Ϳ%{z!`ͅ%z5%*`z!}P5%*z!! &!P$K`! "Q`!"*z*͉%z5%*z*z!!!z(*z!!!z(*z!!!z(*z!!!z(*z!!!z(*z!!!z(*z!!!z(*z!!!z(*z!!!z(*z!!!z(*z!!!z(!"]a*z*)*s#r*z*)*s#r*#"*z}|4a!"Üa*z*)*s#r*z*)*s#r*#"*z}|sa!"z!"z!"z!"z!"zj *z^#V "!' !Pw!Pwb!Pwb!Pwb!*Qwb!EQm*9![Qwj ͝j ͝uu2^>2a>2`2c>2s2t>2r>2v!"@!"D!@"B!"F !F#x:~#!|2i~# :" 2i +}|~#:G:ix."2i+w# +6#!6#@A2n2?*j**|+`!#"0!#"2!>ڌo&͖=}  w~2ʸͼ56!+W ?_!~7z?ͧ:>͞@w#5.ww#w#w#w*>?@͌>w#͌5> w#@ͧ͵g 2q&0OxG͵j/ʆSx\͞.7:77!a{  ʨ ʨ0:?ŷO !y$ 7o&))T])))!y 2p_ :p.'-ʌ&A*Œ&4͐8>2@,~Ė<#^#V#͢&̓6)))Y~0̿7G~`2@2@#~2@~?>&=2@#^#V#^#V#"@^#V"@:@ '*{@!:@@'"@*@#w"@*@~9'D'/Ϳ7͈?+"@*@+"@!6D"@6!^D"@*@~*@*@s#r#*@s#r#*@s#r#*@s#r#*@s#r#:@w#"@'*@*@s#r#*@s#r#*@s#r#*@s#r#*@s#r#:@w#"@'|E'}X27*@+~2@+V+^+"@V+^+"@V+^+"@V+^+"@V+^"@"@*@+~2@+V+^+"@V+^+"@V+^+"@V+^+"@V+^"@"@p';(ͯ''͋(!"@"K@2@<2@2@2@ͥ)( æ)s"&)(,!9DM*(w#wͻ;\ ++++| \ ++|" \|1 4 E h19!h ? ! ? ! ? !B Usage: aliens is the level of difficulty from 0 to 9 level 0 is the easiest and is the default 9Ú11`0/æ! *w#w* w#w*&w#w! ** !a * ! *n ! * !A*; !H*J !R*Y !^*h !e*w !p* !z* !* !* !* !* !* !* !* !* !* ! * w#w\ |š Ë *w#w*6#6*6#60,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,00,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,00,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,00,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0rookieearthlingspace cadetyeomanlieutenantcommandercaptainvice admiraladmiraladmiral OXO XOX \o/ /o\ "M" wMw 7/h1!!!Z!!!!!<!r!!!!'!a!!!Attention: Alien invasion in progress! Type: <,> to move the laser base left as above, for lefties <.> to halt the laser base for lefties to move the laser base right for lefties to fire a laser beam <1> to play "Bloodbath" <2> to play "We come in peace" <3> to play "The Aliens strike back" <4> to play "Invisible Alien Weasels" <5> to play "Klinker" <6> to play "The Black Hole" to quit 37/,2h1.0Jn9!!!\(!m$\!x$\ >p>ʯ>|>ʺ>ˆ>>”>> >>¬>!'!'!'!'!='!k'!*!C*!4*!F!!\ |1\!$*67#6\( *s#r\\q\*s#r\(*"s#r\"|ڞ*"6 #6\(*$s#r*w#w\|ұ!\\)!* w#w\ |Ҡ\ \|g}o\)-!'\ ?\ ))*\\)s#r\ ?\ ))*##\ ?s#r* ^#Vr+s*^#Vr+s*66#6*w#w*w#w*w#w*6#6*6H#60|*6#6*w#w*w#w\ |JMM!!-* w#w\ \"Ҋ\ ))*w#w* ^#Vr+sU*w#w* w#w* w#w\ |^!\ !*w#w\|M\ k*\)\ k**\)~#fos#rz4!-<!'*^#Vr+s* ^#Vr+së* w#wLevel:%2d Score: %-5d B L O O D B A T H W E C O M E I N P E A C E ! T H E A L I E N S S T R I K E B A C K !I N V I S I B L E A L I E N W E A S E L S ! K L I N K E R T H E B L A C K H O L E ! Bases: %d òQ0B0ñ-\ +|M\(H*6#6M|*6#6ͩ|ͬ*:sk:&|g}o>Z.>!>z:>!>,F>!>CR>=>c^>=>/j>=>Xv>Y>x‚>Y>.Ž>Y> š>t>¦>ʍ>²>ʍ>Q¾>ʍ>q>ʍ>>ʍ>1>ʓ>2>ʮ>3>>4>>5>>6>5\ +|.5*6#65\ +|J5*6#65\ +|f5*w#w5M|Š*6#65ͯ5\ |ʟ5* 6#65\ |ʺ5* 6#65\ |5* 6#65\ |5* 6#65\ | 5* 6#65\ |&5* 6#65=h1!H:Sh1.0!9DM\ |ڇ͐|ڇ͐|҇! 6#6͐>—>>£>>¯>>»>>>&>>1>><>>G>>ʲ!M!M! M!M!M!M!#M! P!P!BP!0P!P!P!P!P!P!P!CP!0P! P\ |!P!BP!0P!P!P!CP!0P շ շ н й 2/JM|?*~#foMs#rM|Ҁ*6#6*w#wåM|ڥ*6H#6*w#w\ |MM,!//h1Ö,J!9DMM>>>>> >XÆM!!D"M!!E"M!!F";"M###*s#rM!!G"üMM!I"MM#!K"ü* w#w\ |a\ ))*~#foMP\ ))*##~#fo#MP\ ))*##~#fo###MP\ \(\  ?`is#r\ +|ʉ͐\&`is#r͐|ҝ`i6#6*~#fo͐s#rMM#!M"\ |!O"\ ))*##~#fo\ ))*~#fo!*w#w\ ))*w#w*^#Vr+s;"* ^#Vr+s* w#w\ \"4 M\ ))*~#fo# M\ ))*##~#fo# MM!Q"MM#!S"*w#w* ^#Vr+s\ ))*w#w;"* ^#Vr+slM|!M|!Mk*M)~#fo|!MM\ ++|¢ ! Mk*M)w#w!U"M| MM#!W"*w#w;"M |!M+|!MM M * s#r!M\ !\ !!Y"\ !!d"* w#w*~#foMs#rM!!m"*w#w;"*^#Vr+sz8"M!!o"M!!q"*~#fo\(#s#r;"!9||   Î"/h1J,2Ö,ñ-Ö9n9*w#w\\"ң&\ |µ"\))*~#fo|"Ò&\))*^#Vr+s\))*~#fo|z$\))*##~#fo\))*~#fo+v"!&y"\))*w#w\))*##~#foMw$\))*##~#foMw$\ |#MMv"!|"*^#Vr+s!F!v"\!&"*~#fos#r͂"\|$ͅ"!͈"M!v"!&y"*6H#6͋"8|S$*6#6\ |w$M!v"!|"Ò&\))*~#fo|%\))*~#fo|%\))*~#fok*\))*##~#fo)~#fo|%\))*##~#fo\))*~#fo+v"!&y"\))*##~#fo\))*~#fov"!&y"\))*~#fok*\))*##~#fo)w#w\))*w#w* ^#Vr+sÒ&\))*##~#fo\))*~#fo+v"!&y"\))*~#fo|Y&* ^#Vr+s\))*w#wÊ&\))*##~#fo\))*~#fov"!&y"*^#Vr+sÚ" Bases: %d *&n9/,2h1!9DM`i6P#6M |X'&* s#r!|U'\ |)'* 6#6* 6#6I'* 6#6͐* s#r*6Z#6 (M !&\ |Ҋ'M!(&*^#Vr+s* ~#foM s#rM * s#r͐'\ | (M M !&! (&* w#w!9 <=%d=> 8(Ö,ñ-/J\#*s#r!|ګ(\|^(*w#w\|ʠ(\*s#r*6#6*w#w*w#w\))*~#fo* s#r!|((9(\ |)*~#fos#r,(/(\|')\))*##^#Vr+s@)\))*##^#Vr+s\))*##~#fo*s#rzʕ)\\&K\(?ڡ)*6#6\\ 2(\|)!5(\))*^#Vr+s* s#r\\ 2(\\ |g}o\)5(\))*~#fo|+\))*~#fo|+\))*##~#fo*s#r* 6#6\ |+\\ |+\))*~#fok*\))*##~#fo\ )w#w* ^#Vr+sÊ*\ +|+\ ++|+\* s#r\ |l+\ ))*~#fo|T+* ~#fos#r0+\))*##~#foM\$ڔ,\))*##~#foM###\$Ҕ,\))*~#fo|Ҕ,* w#w\ \"Ҕ,\ ))*~#fo|ƒ,\ ))*\))*~#fo#s#r\ ))*##\))*##~#fo##s#r* ^#Vr+sÔ,* ^#Vr+s+ß,/,2!!͙,\!,͜,%d ,7/,2Ö9,! ! ,\(|,*-\(k*;!W-,*(^#Vr+s!k-,! ! ,\(!-,!2,Congratulations %s - you have won at level %dNow let's see how good you are at level %d-/Jh1Ö9.09!9DM\ |ڞ.\ `is#r* 6#6* w#w\ |Ҏ.!\ ʹ-*w#w\|}.\ k*\)~#fo+|d.!ͷ-l.!/ͺ-*^#Vr+s&.* ^#Vr+s-͐* s#r\ |ڝ/\ `is#r* 6#6* w#w\ |҅/\ ))*~#fo|t/\ ))*##~#fo\ ))*~#foʹ-\ ))*##~#fo\ ))*~#fo|g}o\ )ͷ-* ^#Vr+s.͐* s#r!2ͽ-!!ʹ-!-!B-!4--!9 *6*6=*6/h1!9DM͐ *s͐ *s*/40t0 !10H0t0!E0W0t0!T0f0t0 !c0z097P10O:rGyʑ0Ox ʨ0y  ʨ0  ʨ0Oxʵ0:vw0x0y02s000:t0<2ty2uxY1:P1=1:s~0:ROY1 1:r1 Y1*R=,1:t~02t:uo&=61:t'1=1:ro:R2rL12s&Y n1.0!9DM͐n}ʘ1! ^#Vr+sn&k1v1à1M2!9DM! ͝1`is#r!|1! ^#Vr+s͐s#rè1!9!9DM͐`is#r! ^#Vr+s! ^#Vr+sns{21͐#2!952.0÷2!9DM*02! 22S2ß6!9DM͐~#fon}o2!î2͐~#foP2`is#r͐~#fon}ʧ2͐^#Vr+sn},ʧ2Â2͐î2!92_7868Ù8!Y9DM! ^#Vr+s~#fo! s#r͐! s#r! ^#Vr+sn`is{ʖ6`in}%g6! ! s#r! 6#6! s! s! s͐n}-V3! ^#Vr+s! 4͐n}0f3! 4͐n&ͽ2}ʃ3! 2Æ3!! s#r! ^#Vr+sn`is{.3! 2! s#r! 4! ^#Vr+sn`is`in&2}D3U64X?4OH4Cʎ4Sʿ486͐~#fo|64! ^#Vr+s6-͐͐~#fos#r! ^#Vr+s! 6 N4! 6N4! 6! ~#fo! n&! ^#Vr+s~#fo! ͺ2ѯgs#r75! ^#Vr+s! ^#Vr+s~#fos! ^#Vr+s75! n}4! 6#6! ^#Vr+s~#fo! s#r͐n}75͐|75! ^#Vr+s! ^#Vr+sns! ^#Vr+s! ^#Vr+s4͐6! ! s#r! n}¥5! ^#Vr+s!|ڥ5͐͐! n}ʂ5!0Å5! !5!9~#fo#|¢5!Ö6S5͐n}5͐͐! ^#Vr+sn&!5!9~#fo#|5!Ö6å5! n}56! ^#Vr+s!|56͐͐! !#6!9~#fo#|26!Ö65d6͐͐`in&!U6!9~#fo#|d6!Ö6Ó6͐͐`in&!6!9~#fo#|“6!Ö62!9å68!9DM`iw#w! 6#6͐ n! s{ 6! n} 6! ^#Vr+sü6! n}-7! 6#6! ^#Vr+s! ^#Vr+sn! s͢6|F7͐ ?! nѯg`is#r7͐͐?V7!9e7_7!9DM͐͐ ҳ7͐^#Vr+s͐ڠ7͐0è7͐7s!&7͐ ͐͐ ͉͐b7`is͐ ͐͐ )͐b7`in&#&7!9!9DM! n&|ͯ28! n&|ͩ<88!9DM`iw#w͐~#fon&98}ʉ8͐ ?͐^#Vr+snѯg`is#rJ8͐Ð8!9ß88!9DM! n&͜8|8! n&8! n&&!9DM! n&|ͯ8! n&|ͩ  |9"H"JJ9 ! ### 9"H"J  Wait a few seconds, and type a CR: $*H>H|9|97*J|g}o"Jzg{o"H|g #+|£9'z¦9 ʛ9 Û9|9!9DM! n&|ͯ28! n&|ͩ<88!9DM`iw#w͐~#fon&98}ʉ8͐ ?͐^#Vr+snѯg`is#rJ8͐Ð8!9ß88!9DM! n&͜8|8! n&8! n&&!9DM! n&|ͯ8! n&|ͩ10 LET R1=(360/33)/57.2958 20 LET R2=(360/28)/57.2958 30 LET R3=(360/23)/57.2958 40 PRINT CHR$(26):PRINT:PRINT:PRINT 50 PRINT "******************** BIO-RHYTHM ********************" 60 PRINT:PRINT 70 PRINT "TO GENERATE A BIO-RHYTHM:" 80 PRINT 90 PRINT " - Type in the subject's birthday, a comma and the " 100 PRINT " current date." 110 PRINT " - Enter the number of days you want to cover." 120 PRINT " - Enter the name of the subject." 130 PRINT:PRINT:PRINT:PRINT 140 DATA 0,31,59,90,120,151,181,212,243,273,304,334 150 DATA 365 160 DIM L$(50) 170 GOTO 240 180 PRINT "Do you want another Bio-rhythm?"; 190 INPUT " (YES or NO)";ANS$ 200 IF LEFT$(ANS$,1)="N" THEN SYSTEM 210 IF LEFT$(ANS$,1)="n" THEN SYSTEM 220 PRINT CHR$(26); 230 PRINT:PRINT:PRINT 240 RESTORE 250 PRINT"Enter birthday - comma - current date (YYMMDD,YYMMDD)" 260 LET P1=0 270 LET J6=1 280 INPUT D1,D2 290 LET D9=D2 300 PRINT"Enter duration " 310 INPUT J5 320 PRINT"Enter name of subject " 330 INPUT A$ 340 GOSUB 1310 350 IF D1>D2 THEN PRINT" INVALID DATES " 360 LET X1=D1 370 GOSUB 430 380 LET Y1=X2:LETM1=X3:LET D1=X4 390 LET X1=D2 400 GOSUB 430 410 LET Y2=X2:LETM2=X3:LETD2=X4 420 GOSUB 470 430 LET X2=INT(X1/10000) 440 LET X3=INT(X1/100)-(X2*100) 450 LET X4=X1-((X3*100)+(X2*10000)) 460 RETURN 470 LET D4=(INT((Y2-1)*365.25)-INT((Y1-1)*365.25)) 480 FOR I=1 TO M1 490 READ J1 500 NEXT I 510 RESTORE 520 FOR I =1 TO M2 530 READ J2 540 NEXT I 550 LET J1=J1+D1 560 LET J2=J2+D2 570 LET L1=(Y1/4)-(INT(Y1/4)) 580 IF L1=0 THEN LET L1=1:GOTO 600 590 LET L1=0 600 LET L2=(Y2/4)-(INT(Y2/4)) 610 IF L2=0 THEN LET L2=1:GOTO 630 620 LET L2=0 630 IF M1>2 THEN LET J1=J1+L1 640 IF M2>2 THEN LET J2=J2+L2 650 LET D4=D4+J2-J1 660 LET D1=(D4-(INT(D4/33)*33)) 670 LET D2=(D4-(INT(D4/28)*28)) 680 LET D3=(D4-(INT(D4/23)*23)) 690 FOR L3=1 TO 50 700 FOR I= 1 TO 50 710 LET L$(I)=" " 720 NEXT I 730 LET X=SIN(R1*D1) 740 LET Y=SIN(R2*D2) 750 LET Z=SIN(R3*D3) 760 LET L$(X*20+25)="M" 770 LET L$(Y*20+25)="E" 780 LET L$(Z*20+25)="P" 790 PRINT": "; 800 FOR I=1 TO 50 810 LET L$(25)="I" 820 PRINT L$(I); 830 NEXT I 840 PRINT": "; 850 GOSUB 1130:PRINT D5;" : "; 860 IF D1=0 THEN LET C=1:PRINT"M "; 870 IF D1=16 THEN LET C=1:PRINT"M "; 880 IF D2=0 THEN LET C=1:PRINT"E "; 890 IF D2=14 THEN LET C=1:PRINT"E "; 900 IF D3=0 THEN LET C=1:PRINT"P "; 910 IF D3=12 THEN LET C=1:PRINT"P "; 920 IF C=1 THEN LET C=0 930 PRINT 940 LET D1=D1+1 950 LET D2=D2+1 960 LET D3=D3+1 970 IF D1=33 THEN LET D1=0 980 IF D2=28 THEN LET D2=0 990 IF D3=23 THEN LET D3=0 1000 LET J2=J2+1 1010 LET J6=J6+1 1020 IF J559 THEN LET J3=J3+L2 1180 IF J2<=J3 GOTO 1260 1190 NEXT I 1200 LET Y2=Y2+1 1210 LET L2=(Y2/4)-(INT(Y2/4)) 1220 IF L2=0 THEN LET L2=1:GOTO 1240 1230 LET L2=0 1240 LET J2=J2-365 1250 GOTO 1130 1260 LET M2=I-1 1270 LET D6=J2-J4 1280 IF J2=60 THEN LET D6=D6+L2 1290 LET D5=Y2*10000+(M2*100)+D6 1300 RETURN 1310 FOR I=1 TO 70 1320 PRINT"-"; 1330 NEXT I 1340 PRINT 1350 PRINT": Computerized study of Biorhythmic curves by Elmer "; 1360 GOSUB 1540 1370 PRINT": Subject, ";A$; 1380 GOSUB 1540 1390 PRINT ": Date of study- ";D9;"- Duration ";J5;"days "; 1400 GOSUB 1540 1410 FOR I=1 TO 70:PRINT"-";:NEXT I:PRINT 1420 PRINT": P=PHYSICAL E=EMOTIONAL M=MENTAL "; 1430 PRINT TAB(69)":" 1440 FOR I=1 TO 70:PRINT"-";:NEXT I 1450 PRINT 1460 PRINT": LOW : HIGH :"; 1470 PRINT" DATE :CRTICL"; 1480 PRINT":" 1490 FOR I=1 TO 70 1500 PRINT"-"; 1510 NEXT I 1520 PRINT 1530 RETURN 1540 LET J=70-POS(X) 1550 FOR I=1 TO J-1 1560 PRINT" "; 1570 NEXT I 1580 PRINT":" 1590 RETURN 1600 FOR I=1 TO 70:PRINT"-";:NEXT I:PRINT 1610 PRINT": HIGH - Days of full vitality, efficiency, "; 1620 PRINT"and high endurance"; 1630 GOSUB 1540 1640 PRINT": LOW - Days of reduced efficiency, recuperation, "; 1650 PRINT"tire easily"; 1660 GOSUB 1540 1670 PRINT": CRITICAL - Days to avoid situations that might "; 1680 PRINT"lead to trouble"; 1690 GOSUB 1540 1700 FOR I=1 TO 70:PRINT"-";:NEXT I:PRINT 1710 PRINT TAB(31);"PAGE ";P1 1720 RETURN T"lead to trouble"; 16URN 1600 FOR I=1 TO 70:PRINT"-";:NEXT I:PRINT 1610 PRINT": HIGH - Days of full vitality, efficiency, "; 1620 PRINT"an10 PRINT CHR$(26):PRINT:PRINT:PRINT:PRINT:PRINT 20 DIM C(52),V$(10) 30 INPUT "Do you want instructions (Y or N)";ANS$ 40 IF LEFT$(ANS$,1)="Y" THEN 2310 50 IF LEFT$(ANS$,1)="y" THEN 2310 60 C=0 70 FOR K=0 TO 3 80 FOR J=1 TO 10 90 C(J+10*K)=J 100 NEXT J:NEXT K 110 FOR J=41 TO 52:C(J)=10:NEXT J 120 V$(1)=" A" 130 V$(2)=" 2" 140 V$(3)=" 3" 150 V$(4)=" 4" 160 V$(5)=" 5" 170 V$(6)=" 6" 180 V$(7)=" 7" 190 V$(8)=" 8" 200 V$(9)=" 9" 210 V$(10)="10" 220 L=40 230 IF L<40 THEN 320 240 FOR J=1 TO 52 250 Z=C(J) 260 R=INT(RND(J)*52+1) 270 C(J)=C(R) 280 C(R)=Z 290 NEXT J 300 L=1 310 PRINT " - - NEW DECK - - ":PRINT 320 T=0 330 T1=0 340 S=0 350 S1=0 360 PRINT:PRINT:INPUT"BET = ";B 370 IF B=0 THEN 240 380 IF B=999 THEN SYSTEM 390 IF B>500 THEN 360 400 IF B<1 THEN 360 410 IF B<> INT(B) THEN 360 420 GOSUB 2050 430 GOSUB 2200 440 PRINT " ";V$(C(L-1)) 450 GOSUB 2050 460 GOSUB 2200 470 H=C(L-1) 480 IF C(L-3)=1 THEN 1930 490 IF T=21 THEN 1800 500 IF T1=21 THEN 1880 510 INPUT D$ 520 IF LEFT$(D$,1)="G" THEN 1500 530 IF LEFT$(D$,1)="g" THEN 1500 540 IF LEFT$(D$,1)="D" THEN 1470 550 IF LEFT$(D$,1)="d" THEN 1470 560 IF LEFT$(D$,1)="H" THEN 1360 570 IF LEFT$(D$,1)="h" THEN 1360 580 IF LEFT$(D$,1)="S" THEN 620 590 IF LEFT$(D$,1)="s" THEN 620 600 PRINT" RETYPE: "; 610 GOTO 510 620 IF C(L-2)<>C(L-4) THEN 600 630 PRINT"FIRST HAND" 640 B1=B 650 PRINT V$(C(L-2)) 660 X=C(L-2) 670 T1=X 680 GOSUB 2050 690 IF X<>1 THEN 720 700 T1=T1+10 710 GOTO 960 720 INPUT D1$ 730 IF LEFT$(D1$,1)="G" THEN 960 740 IF LEFT$(D1$,1)="g" THEN 960 750 IF LEFT$(D1$,1)="D" THEN 930 760 IF LEFT$(D1$,1)="d" THEN 930 770 IF LEFT$(D1$,1)="H" THEN 800 780 IF LEFT$(D1$,1)="h" THEN 800 790 PRINT" RETYPE: ";:GOTO 720 800 GOSUB 2050 810 IF T1>0 THEN 870 820 X1=0 830 C=C-B1 840 B1=0 850 PRINT"BUST" 860 GOTO 980 870 INPUT D1$ 880 IF LEFT$(D1$,1)="G" THEN 960 890 IF LEFT$(D1$,1)="g" THEN 960 900 IF LEFT$(D1$,1)="H" THEN 800 910 IF LEFT$(D1$,1)="h" THEN 800 920 PRINT" RETYPE: ";:GOTO 870 930 B1=2*B 940 GOSUB 2050 950 IF T1=0 THEN 820 960 PRINT:PRINT T1 970 X1=T1 980 PRINT"SECOND HAND" 990 B2=B 1000 PRINT V$(X) 1010 T1=X 1020 GOSUB 2050 1030 IF X<>1 THEN 1060 1040 T1=T1+10 1050 GOTO 1320 1060 INPUT D1$ 1070 IF LEFT$(D1$,1)="G"THEN 1320 1080 IF LEFT$(D1$,1)="g"THEN 1320 1090 IF LEFT$(D1$,1)="D" THEN 1300 1100 IF LEFT$(D1$,1)="d" THEN 1300 1110 IF LEFT$(D1$,1)="H" THEN 1140 1120 IF LEFT$(D1$,1)="h" THEN 1140 1130 PRINT " RETYPE: ";:GOTO 1060 1140 GOSUB 2050 1150 IF T1>0 THEN 1230 1160 X2=0 1170 C=C-B2 1180 B2=0 1190 PRINT"BUST"; 1200 IF X1>0 THEN 1510 1210 PRINT " ";V$(H) 1220 GOTO 1610 1230 INPUT D1$ 1240 IF LEFT$(D1$,1)="G" THEN 1320 1250 IF LEFT$(D1$,1)="g" THEN 1320 1260 IF LEFT$(D1$,1)="H"THEN 1140 1270 IF LEFT$(D1$,1)="h"THEN 1140 1280 PRINT " RETYPE: ";:GOTO 1230 1290 B2=2*B 1300 GOSUB 2050 1310 IF T1=0 THEN 1160 1320 PRINT:PRINT T1 1330 B=B1+B2 1340 X2=T1 1350 GOTO 1510 1360 GOSUB 2050 1370 IF T1>0 THEN 1410 1380 PRINT"BUST"; 1390 PRINT" ";V$(H) 1400 GOTO 1670 1410 INPUT D$ 1420 IF LEFT$(D$,1)="G" THEN 1500 1430 IF LEFT$(D$,1)="g" THEN 1500 1440 IF LEFT$(D$,1)="H" THEN 1360 1450 IF LEFT$(D$,1)="h" THEN 1360 1460 PRINT " RETYPE: ";:GOTO 1410 1470 B=2*B 1480 GOSUB 2050 1490 IF T1=0 THEN 1380 1500 PRINT:PRINT T1; 1510 PRINT" ";V$(H); 1520 GOTO 1550 1530 GOSUB 2200 1540 PRINT" ";V$(C(L-1)); 1550 IF T<17 THEN 1530 1560 IF T>21 THEN 1590 1570 PRINT":";T 1580 GOTO 1630 1590 PRINT": BUST" 1600 C=C+B 1610 PRINT"YOU HAVE $";C 1620 GOTO 230 1630 IF LEFT$(D$,1)="S" THEN 1690 1640 IF LEFT$(D$,1)="s" THEN 1690 1650 IF T1>T THEN 1600 1660 IF T1=T THEN 1610 1670 B=-B 1680 GOTO 1600 1690 IF T>X1 THEN 1780 1700 IF T=X1 THEN 1720 1710 C=C+B1 1720 IF T>X2 THEN 1760 1730 IF T=X2 THEN 1610 1740 C=C+B2 1750 GOTO 1610 1760 C=C-B2 1770 GOTO 1610 1780 C=C-B1 1790 GOTO 1720 1800 IF T1=21 THEN 1850 1810 C=C-B 1820 PRINT" ";V$(H); 1830 PRINT" BLACKJACK" 1840 GOTO 1610 1850 PRINT"BLACKJACK" 1860 PRINT " "; 1870 GOTO 1820 1880 PRINT"BLACKJACK" 1890 PRINT" ";V$(H); 1900 PRINT 1910 C=C+1.5*B 1920 GOTO 1610 1930 INPUT" INSURANCE ";I$ 1940 IF LEFT$(I$,1)="Y" THEN 1980 1950 IF LEFT$(I$,1)="y" THEN 1980 1960 PRINT " "; 1970 GOTO 490 1980 IF T=21 THEN 2010 1990 C=C-.5*B 2000 GOTO 1960 2010 PRINT " 10"; 2020 IF T1<>21 THEN 1830 2030 C=C+B 2040 GOTO 1830 2050 IF T1>10 THEN 2090 2060 IF C(L)<>1 THEN 2090 2070 T1=T1+10 2080 S1=1 2090 T1=T1+C(L) 2100 PRINT V$(C(L));" "; 2110 L=L+1 2120 IF T1<=21 THEN 2190 2130 IF S1=0 THEN 2170 2140 T1=T1-10 2150 S1=0 2160 GOTO 2190 2170 T1=0 2180 PRINT 2190 RETURN 2200 IF T>10 THEN 2240 2210 IF C(L)<>1 THEN 2240 2220 T=T+10 2230 S=1 2240 T=T+C(L) 2250 L=L+1 2260 IF T<=21 THEN 2300 2270 IF S=0 THEN 2300 2280 T=T-10 2290 S=0 2300 RETURN 2310 PRINT CHR$(26):PRINT:PRINT 2315 PRINT"This blackjack program enables the operator to play head-" 2320 PRINT"to-head with the computer, simulating the exact rules as those" 2330 PRINT"on the Las Vegas strip. The cards are dealt from one 52-card" 2340 PRINT"deck until a hand starts with less than 12 cards remaining, in" 2350 PRINT"which case it reshuffles. The dealer MUST hit through a total" 2360 PRINT"of 16 and stand on all totals of 17 and above." 2370 PRINT:PRINT:INPUT"TYPE TO GO ON";W9 2380 PRINT CHR$(26); 2385 PRINT"The INSURANCE bet is offered at half the player's bet when" 2390 PRINT"the dealer's up-card is an Ace.":PRINT 2400 PRINT"You may DOUBLE-DOWN on any two cards, and receive one more" 2410 PRINT"card while the original bet is doubled.":PRINT 2420 PRINT"You may split any hand, but resplitting is not allowed." 2430 PRINT"Also, only one card is dealt on each of a pair of aces.":PRINT 2440 PRINT"Your cards appear in the far left column; the dealer's on the" 2450 PRINT"far right. ":PRINT 2460 PRINT" THE COMMANDS ARE AS FOLLOWS:" 2470 PRINT" HIT (draw another card)" 2480 PRINT" GOOD (stand on current total)" 2490 PRINT" DOUBLE (double your bet and draw one card)" 2500 PRINT" SPLIT (form two hands from a pair with the original" 2510 PRINT" bet on each hand)" 2520 PRINT:PRINT"Commands may be typed in as the FIRST LETTER" 2530 PRINT "To exit program enter 999 as a bet":PRINT" - GOOD LUCK! - ":PRINT 2535 INPUT "PRESS TO START GAME";W9:PRINT CHR$(26) 2540 GOTO 60  enter 999 as a bet":PRINT" - GOOD LUCK! - ":PRINT 25P8)CATCHUM x&'#&F'#)!"s͖* d  =""6#}|B=!"s "}00-!~G#~ }q+ph##a"p#w *t"t"t"t*t*t*t}!a6#6#q#p*t"t*t|`i"t* ,X5 }HƐ'@'_ ERROR $ AT PC $"DM6#6#!"*{w#zw!">2DM}|*ڄ"^#V{^#V{_zWڄ{zҾ*w#ww#w###s#rq#p#!5#ʄOM+F+N*}|!"~#fo{z }|~#~#~#O~G!}|*##^#V}|?s#r##q#pw#w#~w#~w7!N#F#~#foho}|p`i}W!9BKá DM!9͡ !9! 9N#F#͡ ͱÒBKz !9DMz ͒DMz !9DM! 9DMz !9DM͒ͱͪ!9DMÎ ͪÎ DMz !9DM$ !9DMz !9DMͱͰͰ $Fͱͧdͧ !9DMz ^͆ͧ! 9DMz !9DMͱd å͆DMV!9DMz !9!9!9DM  z ͪ @PP"tz*t!9~w{_!y+##!t2*t  |g"t!H[ >'-fw# G>@2t2t t͎ z %*t£t*t"t>2t:tWz !t:tw t͎ z !tt͡ !t:tw:tW!t.tz r2t.to&G>Ow# q#(:t!tRt I>qtj ^!t? t!tw7>' #e +>'w#>'w #‚:t2t !t~PI:tI6!t~ Q+w# @ y6w{2tt!t~#!t~#!tq#!t"t~#I+Gt*t '#4?IGt*t'w# 6!t5*t# tj !t~ȯw+6+wk:t<2tOF!t 怮w F_#~ȓALw>2t`i"t2tt*t>'#>'#>'#>'#>'#>'#>'>'wڪ*t #~'w!t~w:t=42t!tèt͡ tj ^DZAy2tx2teOG>F2t!tr#pi`)!t~'w# z !t +· #?±! ? !tڽ=>q# pT]w+ ~w!ttG# :tз$ !t!t5q!ttw+, p!t55 pt + + + + + + 'p P'> 'p o g"t`itå *t|˜ ɵ!tå ~#~#~#~#~#~#~#~#!t'w#'w#'w#'w#'w#'w#'w!9~A 6G>Mw|! DM!x, y)2 )8 )> )D )J )P )V )| | ʜ zv x)yOxGyxڎ GyO#=z ogeov v )ڱ #© OÓ [ `i!:tA$Ͳ:tp *Ÿ U* >*Ä .· U#>.„ 2t - U# .>-„ >2t2tO >2t \UIJUp 2t > 2t U# , >2t !tq.0 >2tU#0 $ !tq^C U6 !tq-T >2tU>2tt͎ :tO 2t2t!tr#s :tʁ =2t:t> IJn :tʝ Ͳ:t!t6 y@Gʷ /%Ͳ2t2t2ttz :t2tGy@w:t!t>+ >+ 4!t5<2t:t!tG:tD :tOxGxn tW?< =Q zc zj !t~n ^T :tœ :t!t  :t :t >-Ͳ G:tOW*ʰ $° $ :t!t  O zͲ yͲ:tuc:tc:tuc:t > Ͳ>0ò> 2ttj ^!t~2t6Ͳ:t@2t!t 8<7w>>6!tp2t/O!t #J X y2t=/2t:t>0̲u͊Ͳ:t=!t5o:tͧ2t!t~>.ܲ:t!t/:t¿:tG:tҷGø2txͧ:t!t5͊Ͳÿ:tͧ:t>EͲ!t:t5~ /<-GyͲx/  GyͲx0Ͳ:t*Ͳ2t2t:t:t2t"t|O:tÐ~W#^#:txzn~#^|~:tŒ2tNS"t"t:t/ʴ!&\UIJUÖ͍U/´͍Un͂yͲ 3 :t> !s4O:t*. Y 3 ͘>2s> >  '3 :t:s/> <59 9:t,*s&:s5 >5X,X !t:s= 2t!t~5*t~Ҟ+"tâ0G>0Ͳè0:t:t:t>,*t:t> >-*t|*F>2t~G#N#"t"t`i"t"t!#"&K/I&I!I\K xK2tUN. x"t*t|i*t"t*tr+"t*t~#"t2t*t~#"t*t|+"t͂> yò"t!t454!:t#/!&$U$>$Ͳê*U*>*-U#.>-\UͲUí*t++!"to:00!{~Gwog:00> !> !>*o|qF#N#lNK# xb K " u2u:00ҘS*t#"tҀ s  >2s:u,2 u2tGW2 u^͊~" ͖^^~"2 uͥ~,&^* u:sWo&##a6#sGw#N* us#r:s#hͥ: u+~z":u À!tq~!s w !trimproper input - reenter $|##ap#q#w xs#r/x ! w#wDMâ/âDMÜ/Ü*tDM*t}|GODF#N# "tNgoHOKo&Ho&}2uo&E{2xn&}!9O͢ "u>2uy2uw# ±+2 u2u +->2u0. : uڑ/2 uyN0:u=2uETeT"yÑG@ :u2u<x@: uN:u<2uy TG-_mxpڑGڊOxG{‘G:u@*uwɯ2uy2u+->2u)DM)) O Ҿ:uz/W{/_s#r:u=2u~#0:?^#V* }||~!tN q!t ^!s!t n&*hu"t*hu!4#B0000<CE!0;"0;:00*hu0t:00ڛ| "tWEX:00ڻZ"tWEX:00%"t<EX*hu^w#Vw* }||~!"u>2uzW{_!u5@*u( |g}o"u*u|g}o"u*u*uDM*hu9J"jut*ju"jutBN|>>>)=~9 a"hu9p#z“͵ *hu "ou"qu}2suRlu*hu$ ~#$*hu lu w#͵u~#DF*hur+s"lu:su=|!nu~@w"tu)|'>(>NF|P~P#~#OG*hu:00Ҩ#> 6 #=Uxs:sw#2uʤڌ zʤ.ˆ2uʤ ™"u!u"uxOw#·pu|O*hu!~!86w!DM!0 w#ä:u".# 7*(:|u>*(>2u6?#`4{4_:O*O?Hw#:|uWIF>?C*ju*qu}O|Gr# xm*qu*ou#{z"ou2uj.:00:uҶ*hu!~w:u*hu!~wyH*hu!^w#Vw"}u\>*tu)uw#w>u^#f|OEk2uj.yM:00I*hu!8~I!~wyR\ME>u s#ru ^#VzFU"hu*tu)>u ^#V"vu͵*lu"zu!9"xuRnu ڻ:suRB=!RU!|IR!+DM*lu*ju{o>g+{z_yW͞!*hu s#r!nu~w"ou:0!e͝z*0͝z*0͝z+0:0W!e͝z+0͝z+0*}u*jus#rR*hu!.! ~#~!nu>w:su2udº!u5\è:nu2nu\v͞J"ouͅ:nuԅ*ou~ *lu|RE!ev:nu͞J"ouͅ:nuԅ*oun&!s 6,a WGy24 p#4*lu|s!"u ʌ"ʌ!u6,!u6!s"uï2u!s"u2u:u ¬ »!u *uw#"u!u~ fs#r.Ü.â>"fs#r*lu| “!nu~ЇwWR!R*ou*ju{_zW{zw*xu*vu|DW!G:tx *lu|*zu|ER!+"zuv,͞*ju"ou:nuJͅ*hu! N#F p+q*ouw!nu>we}:tq>"<:t>"Ò6 Ò :t>,:tڪ>"<:t>"6  :tܛ*zu|++> +|> > ͛*hu!.! w#w*ou+"ou!nu~w*xu*vu|EFu ^w#VwzCU!"huR͵͞RW>u w#w!Áu)~#fo3*u#"u{znu ^w#VwzDU!"huRWyM\!9"xu!j.0<FR!*hu"u!j.0< *hu *u~# y0*u"hu!*u"hu!!j>2|u.*hu 6?##6?!"u_*hu~| =_"tWEX:00| ]"tWEX:00ڝ ##FN0 `*juO yŷ ~##  ~#  *u"uë 2|u*u)!*xu!\"hu.!hw#$!!e~ >!6O#6V#6Lj!CW!#~OQ!#~Mj!CTOQ!#~VQ!#~LQ!\:00چ!!b~w<CM*t*"«! !µ!##!N#F#x" g o! =!  GO! _ W!yx !Ù!!* {z "*|!"+~w*"u!"u*u"u͋#Z"*u"u##^#V*u"u*{z0"n"*u^#~WD"#-"!"u*͋#ʈ"#~w+Í""u##^#V*{zw":eO"]!H##°"*{z"\!"͂#*\!*{z"\‚#*#  overlay does not match root$!`#"~#P#!À\ʀ\\*u}ʣ#{Ozر~#foÐ#=&PY& |###a"u)&1&1&&&*u! 9SLz:$|D$&PY&y_xWP$x$$# x$&&4$6$ɯ>&$7$&$7?$z$N#Fyb$x+p&|w$~&~ws#r&ʍ$n&&AC!a)&q++*zSS&yx$PY##a"u)&BK1&&*u|&++&zSS&yOxG$% ##a"u)&BK1&&*u|~&DMx%zʈ%|~#+P%&!&yOxGڎ%yxk%PYa"u)&BK1&&*uSS!"uÀ%!t~2uw2s%6 *s&##axw#q#s1&:u2t !s4^w|~&&%a~%~_w# x%&! a)&BK1&++|DM~G#N#zw#s#xB&@[&7&yT&Ow# K&yOw#w#w#w# [&^#V* }||~!9 ʲ&ʭ&~#foV$##ü&ô&~#´&=Ž&`i"u^#V* }|&*uw#w}&&>&>2u!u"u!9N#F# y2u9'2u+~+ng# *us#r#"uDM:u='+~+ng# :u_ "ua"u*u"u)"u*u+F+N ##6# xw'~#fo#:u_ og"u:u'2u*u+V+^"u'*u*u"u*u+r+s"u*u+"u|°'#~#fo#)og"u:u=Ÿ'*u*us#r:u='"v"u"vů>MP*u))}(`i"u*vyx+"u}(*v))!ʀ(`i"v\Q(+ xI("v*uk(#͏(ڀ(*v*u}|a(!*v )*u )" v2 v!" v* v*u}|?* v*v~\! v(6((* v#" v* v#" v*v#}|Ҝ(* v*vF*u* v#N! v~)x?)# )y0 !)y_A6x7?|~|DM~G#N#=""6#}|B=!"s "}00-!~G#~ }q+ph#1+-------------------+/^/+/^/+-------------------+1|/. . . . . J . . . . J/|/J . . . . J . . . . ./|1|/./+-----+/./+-----+/./|/./+-----+/./+-----+/./|1|/o/|/////|/./|/////|/./|/./|/////|/./|/////|/o/|1|/./+-----+/./+-----+/./|/./+-----+/./+-----+/./|1|/J . . . . J . J . . ./|/. . . J . J . . . . J/|1|/./-------/./|/./------+------/./|/./-------/./|1|/. . . . . J/|/. . . ./|/. . . ./|/J . . . . ./|1+---------+/./+------/ /|/ /------+/./+---------+1//////////|/./|/ j j /|/./|//////////1----------+/./|/ /+-----=-----+/ /|/./+----------1< J j/|///////////|/j J >1----------+/./|/ /+-----=-----+/ /|/./+----------1//////////|/./|/j j/|/./|//////////1+---------+/./|/ /------+------/ /|/./+---------+1|/. . . . . J . J . . ./|/. . . J . J . . . . ./|1|/./------+/./-------/./|/./-------/./+------/./|1|/o . . ./|/J . J . . J J . . J . J/|/. . . o/|1+------/./|/./|/./-------------/./|/./|/./------+1|/. . . J . ./|/. . . J . J . . ./|/. . J . . ./|1|/./----------+------/./|/./------+----------/./|1|/. . . . . . . . . . J/|/J . . . . . . . . . ./|1+-------------------+/v/+/v/+-------------------+ #Linking to configuration program...Unable to link to &CatChum configuration program missing.CatChum not configuredYY0 Bonus! \ .oJj=/<>^v-+|\-+|Hyper'sDifficulty level: NO HYPERSPACE FUEL!!SHECKY, GET THE JET! C C \ Press RETURN to continue -GET SET!@PMA AYou are now in the dimension of computer games ... a dimension of0spaces and escapes; a matrix of BIOS and memory.ATo survive, move the CAT (shown as a 'C') by typing the directionAbuttons (specified in the configuration). Escape the backspacing*CHUMS which will delete you lickety-split.BYou will receive a new CAT for every 10,000 points and on each newlevel.>When times are bad, type ESCape to pause the game. If you areBlucky, hyperspace can be achieved with a SPACE, then YAHOO you aresafe ... or are you?>Just remember, its only a game ... only a game ... only a game$Type RETURN to return to main menu: SORRY SUCKER!NICE TRY, PAL!YOU'RE OUT OF HERE, DADDY!AW, FOR CRIPE'S SAKE RICKY!FORGET IT, PAL!GET THIS GUY OUTTA HERE!WHO IS THIS GUY ANYWAY ???5.13 CATCHUM.DAT CATCONF.COM$ .o. $    AAmMCcG CCCCCC tt CCCCCC hh tm&CC CC tt CC CC hhACC aaaa tttttt CC hhhhhh uu uu mmmmmmmmmmBCC aa aa tt CC hh hh uu uu mm mm mmBCC aa aa tt CC hh hh uu uu mm mm mmBCC CC aa aa tt CC CC hh hh uu uu mm mm mmB CCCCCC aaa aa ttt CCCCCC hh hh uuuuu mm mm mm(c) 1982, 1983 Yahoo Software10970 Ashton Av Suite 312C4Los Angeles, Ca 900241 = 1 player game2 = 2 player gameL = Change level of difficultyI = Instructions E = Exit CatChum Version : Terminal: Up = Down = Left = Right = High Scores) 0 Last Play : 0Enter one of the above: Go for it!What are you waiting for???E ExitingB412CILLEVELMENSCOREHYPERPlayer 1 2Score 0 0Level ###### ######Cats>> HYPERSPACE ACTIVE << Press Any Key to Start Game! vGET SET! I DON'T BELIEVE IT!  POWER THROUGH!!! THANK YOU! Cc^<-_ YOU LOSE! YOU CHEAT!!!9 YAHOO! YAHOO! YAHOO! YAHOO! YAHOO! YAHOO! YAHOO!Player , you belong in history!Enter your name: Updating high scores...*@ HOOKA ! ----'!YOU BROKE THE GAME, DOG BREATH!!!I don't know what to do now. I got it!s!)"t"t!."t!1"dv!"fv!"vv*dv*fv!!!v&!!!!v&!!!!v&!!!!v&!!!!v&!!!!v&!!!!v&!!!!v&!!!!v&! !!!v&*vv!!!v&!!!!v&! !!!v&!!!!v&!!!!v&!!!!v&!!!!v&!!!!v&!*dv*fv!!!v&!!!!v&!!!!v&!!!!v&! !!!v&!!!!v&!!!!v&!!!!v&*dv*fv!!!v&z:!"w*wÍ:p:}/o|/g"w*wé:>!w͈&* w*wͱn*w:>!w͈&*wm* w::i"wS|:*w;>!w͈&*w*w{z:*w"w;*w"w*w4;>!w͈&*w*w}|*;*w"w0;*w"w*wÁ;>! w͈&"w!.V$\;*"w*"wͥ#"wV$*"w$* w{zL;*"w* wͪ$wV$*wî;>!&w͈&*&w7;*(wͥ#*&wͪ$$wV$*$w<>!,w͈&*,w![ ".w*,w|;*.w}o|g".w*,w{ozg͔$*.w͔$ͥ#*wV$**w<<>!2w͈&*2w!ͪ$}$*2w!!.%}$ "0w*0wÉ<*v. {zg<  !.Ah*v!Å<  !A.9*vA!U.Ah͝*4wÜ< !}.A?<*6w=!!!@w͈&!e*Bw͝!"DwA=!*@w*Dw!.%}$T*Dw#"Dw**v}|"=*>wy=>!Hw͈&*Hw!*Hw}$.%FwV$*Fw'?*v. |Š=͌<*v**v!!>͇͟!͔$vV$>v!.V$*Pw!!.%!.#6>! ":v<>!":v*Pw!!.%}$*Pw!!.%<*Pw!!.%<͟n͟*v*Nw)6#6*v*Nw)!.V$?*v*Nw)*Pw!!.%!3*JwÍ?>!Tw͈&*v*v)^#V*nv+*.v[ "Zw!"Vw|?!"Xwh?*Xw#"Xw*Zw}|a?*Vw#"Vw*Tw}|X?*Rwñ?>!^w͈&*jv*lv͐:9*^w9*\w?>!bw͈&*bw$7;͐?*`w?>!fw͈&*fw͐?!*?*fwʹ?*dwJ@>!jw͈&*:v{zF@!"lw9@*jw͐?!*?*jwʹ?!*?*lw#"lw*:v}|@*hwç@*v*v)*v*v)^#V#s#r*v*v)^#V!{ozg!͐:9*v9*v*v)^#Vͬ:9*nw@>!rw͈&!5!͐:9*rwͬ:9!.9*v9! *?!5!͐:9!.9*pwA>!vw͈&*vw{ozg"tw*twËB*v"|v*v"~vp:"v*4v#+)9A~#foABRBAA*v*v)^#V*v)^#V++++++|lA*v+"~v*xw*v*v)^#V"v*v|ʥA*|v{ozœA!"|vâA!"|vëA!"~v*xw*v*v)^#V*v)^#V+++++++|A*v#"~v*xw*v*v)^#V"v*v|B*|v{oz B!"|vB!"|vB!"~v*xw*v*v)^#V*v)^#V++++++|GB!1"|vNB*v+"|v*xw*v*v)^#V*v)^#V+++++++||B!"|vÃB*v#"|v*xw*xwèD>!|w͈&*w"v*w"vp:"v*@v|W_*&v{ozg*|w{ozg"|w*v|Br{zBHDC*w*w{ozg"w*wͺ)"w*w|C*~w"w.C*w|(C!"w.C!"w*w*w{ozg"w*wͺ)"w*w|^C*~w"wuC*w|oC!"wuC!"w*w"4v*w"w*w*w}|Cr{zC*4v"w*w"4v*w"w*|w|C*4v@"4v*v|C*|w|C*~w@*4v{ozCHDA*v*|v)^#V*~v)^#V! {oz,D*4v*w{oz#DHDuC,D*w"4vC*v|>D*4v@"4v*4v"rv*zwr!͹ "4v*4v"w*4v"w*~w@*4v{oz”Dr{zW_*v{ozg|ʔDHD!"w!"w*zw*zwE*v {ozD*v{oz*v{oz*v{ozDûE*v{oz2E*v{oz2E*v{z*v}|2EûE*v{ozpE*v{ozpE*v}|*v{zpEûE*v*v*v*v*v* v)^#V*v* v)^#V+++|W_͎B*v* v)*rvs#r*w*v* v)^#V"4vA*v*|v)^#V*~v)^#V! {ozEpE*wF>!w͈&*w.ͥ#!.!(#EF+)'F~#foFbFlF}FFFFFFFFFFFF*v*w)^#V*w)*ws#r*w!"w*w!"w*v#"v*w!"w*v#"v*w!"w*v#"v*w!"w*w!"w*w!"w*w! "w*w*w5G!"v͖!"w$G!w!"wG*w*w!.%*w*wE*w#"w*dv}|F*w#"w*fv}|F*wG>!w͈&*v*w)*vs#r!"wñG!"wÝG*v*w)^#V*w)^#V*w)*v*w)^#V*w)^#Vs#r*w#"w*dv}|dG*w#"w*fv}|[G*w>H>!w͈&!"w-H!"wH*v*w)^#V*w)^#V*w)*v*w)^#V*w)^#Vs#r*w#"w*dv}|G*w#"w*fv}|G*w(I*v*v)^#V! "v*v*v)^#V"w*w++++++|}H!"xvÃH!"xv*v*v)*w+++|*w{z*w!͹ |gos#r*v*v)*w{zW_s#rp:"Pv*w{zW_"v*Xv"^v*w+++++|/W_"Xv*w++++++|/W_"&v*wI*v|!w͈&*wc/ͥ#ͦ$!("w*w{zW_*v{ozg"v*w|R*w"w Sͦ$*w###*w$ͦ$$.%͎"w*wÓS*vA   !h/A!/A !/A! 0A!c0A !0A!0A !0A!1A!_1A !u1A   !19ÀSi {oz€S*x*v!1V$*v!1V$*v!1V$*v!2V$*v!32V$*v!D2V$*v!^2V$v!z2V$v!2V$! "*vv!2V$!"Fv!"Hvv!2V$!5"jv!"lv!d"Nv!"3A*v9!3A*v9!3A*v9! 4A*v9!M4A !4A!4A!4A  !4A!4A! 5A!,5A!C5A!U5A!(! ͐:9!g59*v9!(! ͐:9!s59*v9ͬL!(! ͐:9!59*v!!.%9!59*v!ͪ$9!59*v!!.%9!59*v!!.%9!(!͐:9!59!"RvÚX!(*Rv͐:9*Rv0͔$9!59*v*Rv)^#VzړX*v*Rv)^#Vͬ:9!59*v*Rv)^#V9*Rv#"Rv4X*`v{zX!(!͐:9!59*`vͬ:9!59r  N",v*,v"v!"$vp:"v!"v*v6#6v!5V$!!͐:9*v9:îY*,v+",v*vog*,v{ozJYîY*$v|aY}:"v!"zvfZr{zxY!5?Y!5?r  N",v*,v"v*v$#!͐:9*$v+"$vS|*Yi͔$%vV$*v!6#Y!6Ah͝*v!!6#Y!"zvfZ*v!$6# Z!"zvfZ*v!'6#Z?<*v!*6#-ZSV*v!-6#cZ*nv! ͹ #"nvͬL*v$#!͐:9!"$v$Y*zvͺ͙%9p:"v!"v[*v*v)!06!͘Rs#r*v*v)!76!͘Rs#r*v*v)!<6!͘R! [ s#r*v*v)!C6!͘Rs#r*v*v)6#6*v8G+I*v#"vҁZ!"v*v9!!͐:9}:">vp:"^vp:"Xv*v8G+I!5! ͐:9!J69!5! ͐:9!`69*v^#Vͬ:9!h69*v^#Vͬ:9!m69!5! ͐:9!p69!x6*v^#V*v^#V͘AH*v*v)^#V"bv*bv*nv+"v!5!͐:9!69!"RvU\*v*Rv)^#V!{ozg!͐:9*v*Rv)^#Vͬ:9*Rv#"Rv\GLp:"Pv*v*v)^#Vzʍ\!5!͐:9!69á\!5!͐:9!69*v|ʽ\!5!͐:9!69!@! ͐:9!69*v*v)^#V!{ozg! ͐:9!69!"Rvh]*v*Rv)*Rv s#r*v*Rv)6 #6*v*Rv)6#6*v*Rv)6#6*v*Rv)*Rv+LR s#r*Rv#"Rv*xv}|]*Dv"@v!"Lv*Xv*^v{oz/W_*>v}/o|/g{ozg|ʰ]Ió]Kp:">v!!͐:9!69*v9:! *?!!͐:9!69!"v!"v!"v!"v!"Vv*dv*fv ;"2v!" v cS|ʻ^i"\v*v|B^Vû^*\v͔$%*v!(+ͺ)"Vv*\v+++|t^Vû^*\v {ozž^*v*v)^#V*Pv{ozg"Pvû^*\v{oz»^Q*v|ʻ^V*v }|^!"(v^*(v#"(v*v*v)^#V*(v{z^*v* v)^#V"v*v* v)^#V"v*v*v{oz*v*v{oz:_+b*v*v͐:9*v*v)^#V*v)^#V*v^#V9*v* v)^#V#|_*v* v)*v* v)^#V+s#r*v* v)^#Vzʻ_*v"|v*v"~va_*v* v)uRs#r*v* v)^#Vzҙ`*v* v)*v* v)^#V+s#r*v* v)^#V!}|#`*v"|v*v"~vaÙ`*v* v)r!͹ #s#r*v* v)*v* v)^#Vͺ)s#r!"|vr{zW_*v{ozg|ʐ`!"~vaÙ`! "~va*v*v)^#V*v)^#V+++|*v*v)^#V*v)^#V++++|`ͫDa*v* v)^#V"4vA*v*|v)^#V*~v)^#V! {ozaͫD*v|>a*v* v)*v* v)^#V@s#r*v* v)*|vs#r*v* v)*~vs#r*|v*~v͐:9*v* v)^#Vͺ)*v^#V9*v|b*v* v)^#V!}|b*v*|v{ozgͺ)*v*~v{ozgͺ)!ͺͱ"0v*0v*2v{zb*0v"2v* v""v*|v*v{oz*~v*v{oz+bc*v* v)^#V+++|Cb3g*v* v)6#6*v* v)6#6*v* v)LRs#r*v* v)* v)s#r*v* v)6 #6*v* v)^#V*v* v)^#V͐:9*v^#V9*8v"Tv*8v "8v*Tvͪ@ͣl*xv *6v *8v{ozc!7?* v#" v*xv}|&^OP*v|*cõc*v*v)^#V*v)^#V+++|*v*v)^#V*v)^#V++++|ocõc*v*v*v*"v)^#V*v*"v)^#V*v*v*"v)^#V+++|/W_͎B*rv"Vv*Pv|cL*Vv"4v*v"v*v"v!"TvA*v*|v)^#V*~v)^#V! {ozd*Vv"vd*v|ʒd*v@"4vp:"hvVd*4v#!͹ "4vA*v*|v)^#V*~v)^#V! {ozW_"hv*v@*4v{oz/W_*hv}/o|/g{ozg|d*4v"Vv*4v"vd*v"4vA*v*|v)^#V*~v)^#V! {ozd*v"|v*v"~v*v*v͐:9!79if*v*v͐:9!79*v|e*v@"v*Vv@"Vv*|v"v*~v"v*v#{ozg"v*v*|v)^#V*~v)^#V*v^#V"Tv*Tv#|›e*bv! :*v^#V"Tv*v*|v)^#V*~v)6#6*Dv"@v*Tvͪ@!7?ͣlg*Tv+++++|if!-7?!" ve*v* v)*v* v)^#Vͺ1 s#r*v* v)uRs#r* v#" v*xv}|e*bv "8v*8v"6v*Nv*bv[ "Lv*Lv*xv[ "Jv!"Tv*v*v)^#Vzif*v*v)*v*v)^#V#s#rGLͣl*Tv|wfg*v*v)*v*v)^#V+s#r*v*v)^#Vz¨fRk*v*|v)^#V*~v)^#V+++|f*v*|v)^#V*~v)6#6g*v*|v)^#V*~v)^#V++++|g*v*|v)^#V*~v)6#6*|v*~v͐:9*v*v)^#V9^*v*v)*v*v)^#V+s#r*v9*v*Fv)^#V*Hv)6#6v!97V$!"Rvëg*v*v͐:9*v*Rv!.%9!*?*Rv#"Rv*v$*Rv{z~g*vG*v*v)^#V!}|gr*vv͹ #*v^#V?!"RvVh*v*Rv)^#V*v*Rv)^#V͐:9*v*Rv)^#V*v^#V*v*Rv)^#V^#V*v^#V9*Rv#"Rv*xv}|g:*v#*zv͹ "tv*v*v)^#Vz´h!E7?*v|´h*v*v)^#V*v*tv)^#V ;"`v*v*tv)^#V!}|h*tv"v*v*v)^#Vz*v*tv)^#Vzh[*v|iVp:"v!"Rvj!"Zvqj*v*Rv)^#V*v*Zv)^#V}|Cijj*v|Ui!P7?Ðj}:"v*v9     !^7A !79*Rv1͔$9!7A !79:!7U!v>z*v!ͪ$vV$*v$|ip:"vÐj*Zv+++++|=j!"pv,j*pv#*v*v*pv)^#Vs#r*pv#*v*v*pv)^#VV$*pv"pv*Zv6j}|i*v*Zv)*v*Rv)^#Vs#r*v*Zv)*vV$xj*Zv#"Zvi*Rv#"Rv*zv+*Rv{zi*v|Ok     !7A*v**v!!>͇!"Rv(k*v*Rv)^#V$͔$*v*Rv)^#Vͱ;ͥ#*v*Rv)^#Vͥ#vV$*Rv*v**v̈́;=*Rv#"Rvj!3*v**v!!>͇!3V!"RvØk*v*v͐:9!79!*?*v*v͐:9!79!*?*Rv#"Rv[k*:v{zlv!7V$*v͐?!"Rvl!@!͐:9!79!*?!@!͐:9!89!*?*Rv#"Rvk*vʹ?*v*v)*v*v)^#V#s#r!"RvÐl*v*Rv)^#V*v*Rv)^#V͐:9*v*Rv)^#V*v^#V*v*Rv)^#V^#V*v^#V9*Rv#"Rv*xv}|6lM@B[*v*v)*v*v)^#V*Tvs#r*v*v)^#V"v*v*v)^#V!{ozg! ͐:9*vͬ:9*v0u}|vm!*?!"Rv@mr  r!]͹ !͔$9*Rv#"Rv;m  !89*vA!'8A!*?!E8A!*?h*v*v{zm*v*v)*v*v)^#V#s#r*v*v)^#V! "vM@h͝(c)1982 Yahoo Software"@n7n2?nog*@n|n "@nm>0_:?nn{0n n>2?nm*@n]>0_vaVn{Vn w#wotnptnq{ʑnwʑn#Ow# †nÕnw}~}2r}2r}2r}G:r2r}G:r2r:on!oGUo:ronn:r_oo:r_oo:rͰoo:rͰo:poG!pUo:rCo:o1o:r_oIo:r_oIo:rͰoIo:rͰo:qG!qUo~Ͱo#Uo_!|uo fo>0Ox„oy0ʉoͰo!|šo Ëox¤oyʪo>0Ͱo>0ðo_@116wL@117wL@118xL@119xTL@120!xL@1210x]L@122?xL@123NxL@124]xL@125lxk L@126{xL@127xL@128x` L@129x L@130xO L@131x$ L@132x!L@133xy!L@134xw L@135ye!L@136y L@137 y L@138/yN!L@139>y L@140MyG!L@141\y"L@142ky"L@143zy!L@144y"L@145y!L@146y "L@147y"L@148y7"L@149y"L@150yu"L@151y"L@152z&#L@153z#L@154z"L@155.zN#L@156=zU&L@157Lz#L@158[z#L@159jz$L@160yz#L@161z#L@162z$L@163z$L@164z$L@165z($L@166z$L@167:r<2rG_!rNxyro&4FTiex8#9A7C5Iqh$(9Z)!'6ZFCE(WJQ#!hs4K{%L@175Z{I&L@176i{&L@177x{I&L@178{X'L@179{&L@146y "L@147y"L@148y7"L@149y"L@150yu"L@151y"L@152z&#L@153z#L@154z"L@155.zN#L@156=zU&L@157Lz#L@158[z#L@159jz$L@160yz#L@161z#L@162z$L@163z$L@164z$L@165z($L@166z$L@167:r<2rG_!rNxyro&4FTiex8#9A7C Kaypro =  YY 2468 0 REM C H A S E V 1.0 1/16/77 GCC III 1 REM BY HERMAN DEMONSTOY FEB 77 ISSUE KILOBAUD MAG 5 PRINT CHR$(26):PRINT:PRINT:PRINT:PRINT:PRINT 20 Z2=0 50 PRINT"This is the game of CHASE" 100 PRINT"You are in a high voltage maze with five" 110 PRINT"security machines (+) trying to destroy you (X)." 120 PRINT"You must maneuver the security machines into" 130 PRINT"the high voltage fence posts (O), or into each other" 140 PRINT"in order to survive. GOOD LUCK. 145 PRINT 160 PRINT"MOVES ARE: 1 2 3" 165 PRINT" 8 * 4 0 IS NO MOVE" 170 PRINT" 7 6 5 9 GIVE UP" 175 PRINT 199 REM ----------------------------------------------> SET UP THE GAME 200 DIM A(10,20),E(21),F(21) 210 G=5:M=0 220 FOR B=1 TO 10 230 FOR C=1 TO 20 240 LET A(B,C)=0 250 IF B=1 THEN A(B,C)=1 260 IF B=10 THEN A(B,C)=1 270 IF C=1 THEN A(B,C)=1 280 IF C=20 THEN A(B,C)=1 290 NEXT C 295 PRINT" . ";:REM -------------> KEEPS SCREEN GOING WHILE TABLE SET UP 300 NEXT B 310 FOR D=1 TO 21 320 B=INT(RND(1)*8)+2 330 C=INT(RND(1)*18)+2:REM --------------------> ....................... 340 IF A(B,C)<>0 GOTO 320 350 A(B,C)=1 360 IF D<6 THEN A(B,C)=2 370 IF D=6 THEN A(B,C)=3 380 E(D)=B 390 F(D)=C 400 NEXT D 410 PRINT:PRINT 499 REM ------------------------------------------------> PRINT PATTERN 500 FOR B=1 TO 10 510 FOR C=1 TO 20 520 IF A(B,C)=0 THEN PRINT" "; 530 IF A(B,C)=1 THEN PRINT"O"; 540 IF A(B,C)=2 THEN PRINT"+"; 550 IF A(B,C)=3 THEN PRINT"X"; 560 NEXT C 565 IF B=3 THEN PRINT" ";G;"Security machine";:IF G>1 THEN PRINT"s"; 566 IF B=3 THEN PRINT" left"; 567 IF B=7 THEN PRINT" 1 2 3"; 569 IF B=8 THEN PRINT" 8 * 4 0 IS NO MOVE"; 571 IF B=9 THEN PRINT" 7 6 5 9 GIVE UP"; 573 PRINT 580 NEXT B 599 REM -------------------------------------------------> MAKE MOVE 600 B=E(6) 610 C=F(6) 620 A(B,C)=0 630 INPUT"MOVE";Y 635 M=M+1 640 IF Y=0 GOTO 800 650 ON Y GOTO 660,660,660,690,680,680,680,690,1400 660 B=B-1 670 GOTO 690 680 B=B+1 690 ON Y GOTO 700,800,720,720,720,800,700,700 700 C=C-1 710 GOTO 800 720 C=C+1 799 REM ----------------------------------------> CALCULATE THE RESULTS 800 IF A(B,C)=1 GOTO 1500 810 IF A(B,C)=2 GOTO 1600 820 A(B,C)=3 830 E(6)=B 840 F(6)=C 850 FOR D=1 TO 5 860 IF A(E(D),F(D))<>2 GOTO 960 870 A(E(D),F(D))=0 880 IF E(D)B THEN E(D)=E(D)-1 900 IF F(D)C THEN F(D)=F(D)-1 920 IF A(E(D),F(D))=3 GOTO 1600 930 IF A(E(D),F(D))<>0 THEN G=G-1 940 IF A(E(D),F(D))=0 THEN A(E(D),F(D))=2 950 IF G=0 GOTO 1700 960 NEXT D 970 GOTO 500 1000 PRINT"Type Y or N please...":GOTO 980 1400 PRINT:PRINT"Sorry to see you quit" 1405 PRINT"after only";M;"move";:IF M>1 THEN PRINT"s";:PRINT"." 1410 PRINT:GOTO 1710 1500 PRINT:PRINT"You touched the fence !!!!" 1505 PRINT" After only";M;"moves." 1510 GOTO 1710 1600 PRINT:PRINT"** You have been destroyed by a lucky computer **" 1605 PRINT"after only";M;"moves. Too bad." 1610 GOTO 1710 1700 PRINT:PRINT"You are lucky * * You destroyed all the enemy * *" 1705 PRINT"in only";M;"moves." 1707 Z2=Z2+1 1710 PRINT"So far you have won";Z2;"game(s)!!!" 1715 PRINT:PRINT:PRINT"Do you want to play again (Y OR N)" 1720 INPUT Y$ 1725 PRINT:PRINT 1730 IF LEFT$(Y$,1)="Y" GOTO 210 1735 IF LEFT$(Y$,1)="y" GOTO 210 1740 PRINT:PRINT"Hope you don't feel fenced in." 1750 PRINT"Try again sometime." 1760 PRINT"This time you won";Z2;"game(s)." 1765 Z2=Z2+1 1770 PRINT"Next time you may win";Z2;", or more!!!!!" 2000 SYSTEM 1760 PRINT"This time you won";Z2;"game(s)." 1765 Z2=Z2+1 1770 PRINT"Next time you may+1 1710 PRINT"So far you have won";Z2;"game(s)!!!" 1715 PRINT:PRINT:PRINT"Do you want to play again (Y OR N)" 1720 INPUT Y$ 1725 PRINT:PRINT 1730 IF LEFT$(Y$,1)="Y" GOTO 210 1735 IF LEFT$(Y$,1)="y" GOTO 210 1740 PRINT:PRINT"Hope you don't feel fenced in." 1750 PRINT"Try again sometime." 1760 PRINT"This time you won";Z2;"game(s)." 1765 Z2=Z2+1 1770 PRINT"Next time you mayQZZZX^VcVhVmVrVwV|VVVV%U%U%UUUUUUUUU<2f6f,+:,= *F=+qN1,4O=2,=*F=~#"F=!5, () 'U ') )@ :<:=x,>=!]?G~µw#„,p, /U ,/@ #~µ~$w2'+"=>2=!"=ñ&>2=:=U - -~w#~d -~w,,͝-w͵,~Bدw#w#w#wU ~#~>-,"C=m->21=Ux¯x 20=*C="?= x4:>"C=~w|21=m-x¯*C=-#~µ~@ w#s#r#*=s#r4͸K:?w/:<Ĩ/!<4~=Z.!]?~-!1>~-!@#]?~# . .. . -!V?p#"?=ͩ2'!5O"@ A."?=~w#~@k/~.#^#Vͩ.*= ͩ *={ĩn*F=ԃ +!"4="6=}2/=p!/!3=44!r?>͗;Z:3=8p!3=44!/!?>͗;Zʹ/*<|.:@<2[?2[?.!L//!O//*<|/>,vL:@<>,J:@<2[?2[?!_//ʹ//̓ͩ*>|,/F/ͩ+:@C/>vLKLNo GLWa * B0C0B0C0B0C0B0C0B0C0 B0C0B0C0B0C0  0U 0"F=B0πC0B0 C0B0C0 a*! ! #@":*:|W! p,!T!Vf̓f*:͊A!9!DMÀ`i#DM+`i*`iX+! *:,`i))2! *:,`i))2Vf1ͯf]fogpfz!Vf̓f*:͊A!9!DM `i#DM+`i*%*:!ͨD!ͭ)'ͬ!DMA`i#DM+`i|G*P;']!!(! p,!!(!ͧ'!"!"**ʫ((q"(ô(q"(***M********|ʏ!"!"*+"#*+"#**Œ0!!(!ͭ)! p,!"!!-Q!9s!nͯ*ʛ !9^!Nͯ*ʛ !9^!yͯ*ʛ !9^!Yͯ*ʛ L !ͭ)!9^!y͠*†!9^!Y͠*†!ͭ)( clone.datr+No file CLONE.DAT%20s%ldhit a key when readydo you wish to play again? a*!Vf̓f*:͊A!9!DMV `i#DM+`i*5 `iX+d!Ç #+*ʹ `iX+^!X *:͓, # #+* ! ![ *:͓, `i))2Vf1ͯf]fogpf!`i))2]f̓f!^ *:͓,! 9P ! !d *:͓,*:G!T%c%c%ld%c%ca**| *ͯ* *"**"**ʪ *+" ** *###" *"*͠* *+" *| *###" *#" a**|! #+***(!!-Q*+"#**c *+"#x **x *#"+*͠*ʏ *+"#ß *|Ÿ *#"+** ** *Ϳ* *O* **(!!-Q !"!!DM `i#DM+`i***`i)D^#V*Ϳ*`i)D^#V##**`i)b^#V*Ϳ*`i)b^#V###****(!!-Q!x'* *'!"!*ʹ+"`i)b^#V`i)D^#V(ͷ&!`)`i)b^#V`i)D^#V(ͩ&!`)!"!*"`i)b^#V`i)D^#V(ͷ&*+"#*)D^#V`i)Ds#r*)b^#V`i)bs#r!"!*iͯf]fgpf!!(!]f̓f!p,!]f!OfͪiA  score: %lda*'**&!Vfpf!"!Vfpf!"!"! "!("!"!"!"!"!"!!\!!'!9!!\!!\'!9!!!!\'!9!!!!'!9**(ͩ&*,X+X"*#"+*2X+!Xʹ+"**! "ͬ!DM*+**#"!.#+**!*X+"!]fi*"!*P*"**"**###)Ds#r**"!PYX+DM**X+()bs#r)b^#V)D^#V(ͩ&&*͠*!"* ͠* !"* ͠*!"*͠*/! "*"~!!(*!p,!!(!]f̓f!p,!]f!OfͪiʄA)!-!(*+!p,level: %dscore: %ldmen: %da****ʫ**"!*P*"*@P***ʫ**"*P*DMx!]fi*"P*DM`i)^#V*)Ds#r*?P**)bs#r*)D^#V*ʹ+X+*)b^#V*ʹ+X+R*`i6,)^#V*)Ds#rÃ**"P*DM`i)^#V*)bs#r*P*##*)Ds#r*)D^#V*ʹ+X+*)b^#V*ʹ+X+R*ʃ`i6,)^#V*)bs#r*)b^#V*)D^#V(ͩ&*#"+a***"**"*P*DM`i)^#V"**"!*P*"*P*)^#V"*͠*B**͠*B6,)^#V"**(!!-Qa*!!(!5&D!I!(!@&D!G&D!&D!&D!!&D!k&D!&D! &D!>&D!&D!&D! &D!j&D!&D!p,!!-Q!p,ͩ&!-!(!p,ͩ&!&DCLONE WARSv 1.0 You (the good guy) are a human trapped inside the maze of the evil (boo)CLONE MASTER. Your mission is to escape from his nasty bad clutches.Unfortunately (for you) there is one slight problem. The clone master'sminions (clones) are trying to kill you. They have a slight advantage - being incredibly strong they will kill you if they catch you. You, never beingone for a fair fight, have brought along a gun. Luckily, the bullets seem tocause an allergic reaction in the clones - they die. The CLONE MASTER's maze is a tough one to get out of - to leave a room youmust gather all the keys that are in the room. When you have gotten onekey another will appear until you have gotten all the ones from that level. Beware, clones are not as dumb as they look (nothing personal, but theywere cloned from you) and given the chance they will combine to formsuper-clones which take more than one shot to kill. Key: You: Clone: Use the 10 key pad to move and the space bar to shoot. GOOD LUCK!a**#"+!Vfͯf]fgpf!!!!p,!9!-!(*+!p,%c%c%cmen: %da*'!!(!&D!!(!&D!DM`i#DM+`i*\*+"#*#"+**(ͩ&*###*(!**(!N**(ͩ&!*"!DMu`i#DM+`i*ʺ*#"+**(&!*ʹ+"**(ͩ&o!DM`i#DM+`i*C*#"+**(&!*ʹ+"**(ͩ&*#"+**(&!*ʹ+"**(ͩ&!DMQ`i#DM+`i***()'*#"+**(ͩ&**(!*"**()'!*ʹ+"**(ͩ&KKAYPRO Proudly Presents:by Rick A. Smitha*! 9~#fo##s#r++~#/! 9^#V^#V!-Qa*!"!!DMO`i+DM#`iͿ*`i))2]f̓f!]f͛fͪiʿ*|'!!(!*!e!i&D!"û*#"+* *!!-Qó!p,!ͭ)!!,!ͭ)!"`iͯ*h`i#))2`i))2]fpf!*`i#X+e!`iX+`i#X+e`i))2!]fpf!*`iX+e!!`iX+ex¼!`i#!DMI'!!(!&D!&D!&D!DM`i#DM+`i*h`i͠*"!)`i#!p,`iX+!p,`i))2]f̓f! p,!)Congratulations, human, you have achieved a high score. Please enter your name: %sClone Masters to Date: rank: name: score:---- -------------------- ----- %d %20s %ld a***a**a**a*L*bc')*͠*ʂ'!ͭ)( *.͠*ʦ!!-Q"|¦Î*0*ʿ* ͯ**9**"* ͠**|g *" *|e"* * !0*ʹ+" *"*"**"**g *#"+**(&!*ʹ+"Ì **ʌ **(&*#"+*͠* !*"**()'!*ʹ+" *| **()'*#"+**!**!**!*L*!**(ͩ&!DM7!`i#DM+`i**ʡ!`i)^#V*Ϳ*ʞ!*##`i)^#V*ʞ!`i)^#V*Ϳ*ʞ!*###`i)^#V*ʞ!!"1!**Ϳ*e"*#**e"**Ϳ*e"*##**e"*#"+!Vfͯf]fgpf!!(!]f̓f!f"p,!]f!Ofͪi3"A**͠*b"!*iͯf]fgpf'e"ͬscore: %lda***P*"*X+**"*Ϳ*"*F*#")s#r*d*)s#r!*|6,"|!DM"`i#DM+`i**K#`i)^#V`i)^#V(*||+#!!-QH#!)!!-Q!)"!"*+"#*l#!"!DMz#`i#DM+`i**ʨ&`i)D^#V"@`i)b^#V"B!""""x#*|#!""""!`)!"#*#"+***$*)^#V*)^#V*@+͠*C$*BͿ*C$*B###*C$!"*@##͠*x$*BͿ*x$*B###*x$!"*B###͠*ʭ$*@Ϳ*ʭ$*@##*ʭ$!"*B++͠*$*@Ϳ*$*@##*$!"#**@*%*|%*B*@(&*@#"@+O%**@*O%*|O%*@#"@+*B*@(&!*@ʹ+"@**B*%*|%*B*@()'*B#"B+ý%**B*ʽ%*|ʽ%!*B"B*B*@()'!*Bʹ+"B*B*@(ͩ&*@`i)Ds#r*B`i)bs#r!`)*|¥&*##"*###"*@##"*B###"*B**7&*B*Ϳ*W&***Q&**Ϳ*W&!Z&!"*|ʥ&*@**&*@*Ϳ*Ÿ&***ʙ&**Ϳ*Ÿ&!â&!"t#a*!&a*! &a*! 9^#V^z&! 9~#fo#s#r+^!-Q&a*!!-Q!!-Q!!-Qa*!!-Q!!-Q! !-Q!!-Qa*!!9s#r!!-Q"|¦'!9~#fo#s#r+**ʦ's'a*!"!!-Q'*#"+ò'a*!!-Qa*!!-Q!L!-Q! 9^#V! !-Q!9^#V! !-Q!9^#V! !-Q!9^#V! !-Qa*!!-Q!D!-Q! 9^#V! !-Q!9^#V! !-Q!9^#V! !-Q!9^#V! !-Qa*!!-Q!=!-Q! 9^#V! !-Q!9^#V! !-Qa*!!-Q! 9^!͠*E)!C!-QR)!B!-Q!0!-Qa*!!-Q! 9^!͠*ʒ)!C!-Qß)!B!-Q!1!-Qa*!!-Q! 9^!͠*)!C!-Q)!B!-Q!4!-Qa**+"#**~*<*!!(*~!=*p,!d*~ʹ+"~bonus: %4d"S|g}o|/g}/o^#V#DM!99`i`*|z2I*+:I*p+}+}}ª*|ʹ*!}¹*|ʪ*!}|*}|?>o&zo&|*}|>o&|o&z2I*+:I*p+||+/g}/o#z+/W{/_+DM!>2H*))1+#}o|gI+ :H*=2H*)+}:H*=2H*)+}DM!>))h+ =`+}}/o|/g#}|ʹ*ê*|g}o{_ʱ+|),|7g}o—+{_ʱ+)¬+}}o|gN#F# N#F#z+{+##^#VBK^#Vz+#y+###+#x+#~#fo}|>?o&}|>o&{_ʱ+|g}o),|g}o~# x>,!9J*~#Y,!f,|ra*!"n,!9!9^#V!,Ja*! 9^#V"n,!9!9^#V!,Ja**n,!9^#VͨDVECLa*! ",!",!9!9^#V!--6.a*! 9^#V",!",!9!9^#V!--6.a*! 9~#f-*,^!P*X-!",c-*,C",v-*,*,H",*,56S.78VXABCDEFabcdef9876543210   a*! 9^#V"-!}2-!9!9^#V!-6.a*! 9~#.*-~ .*-#"-+^!P*!}2-2.:-o&|2.*-+"-^!P*!a*f!9N#F!!9s#r!9^#V"-`i#DM+^!9s#rzʀ3!9^#V!%͠*%3!!9s#r!9s#r!"-`i^!*͠*ʳ.`i#DM!!9s#r`i^e.!"-*- X+`i^"-`i#DM^e.`i^!l͠* /!!9s#r`i#DM`i#DM+^2!%!9s#rT3!!9s#r@/!!9s#r! !9s#r! !9s#rÞ/!!9s#r!!9s#r!!9s#rÞ/!!9s#r!!9s#r!!9s#r͉3:3!9!9^#V!9^#V!-!9^#V!-͹4pf!9~#A0!9~# 0!9~#fo##s#r++^#V!9]fpf20!9]fi!9~#fo##s#r++^#Vs#r!9~#fo#s#r"3!!9s#r͉3:3!9!936!9~#0!9~#ʠ0!9~#fo##s#r++^#V!9͡660!9~#fo##s#r++^#V!9I6n6!9~#fo#s#r"3!!9s#r`i^!^͠*0`i^!~͠* 1`i#DM!!9s#r!9!9s#r`i#DM+^!9s#r!]ͯ*N1!9^#V!9~#fo#s#r+s1!!9^#VsÎ1!!9s#r! !9s! !9s! !9s!!9s͉3:3!9~#»1!9~#fo##s#r++^#V!9s#r*-+"-#|\2!*-`*!9s#r!͠*\2!9~# 2!9^#V!9ieͯ*!2!9^#V!9ie͠*|42!*-`*\2!9~#Y2!9^#V!9~#fo#s#r+sû1!9~#ƒ2!!9^#Vs!9~#fo#s#r"3!*-`*!9s#r!͠*:3!9~#2!9^#V!9~#fo##s#r++^#Vs!9~#fo#s#r"3+%/D5/ED0FD0O}/XY/[0c2d@/eO0fO0h'/o/s_1xd/"3}3!9^#VͲeT3͉3Q3!9~#H3!!9^#V}3͉3:3!*-`*!9~#foͯ*}3!9^#VX.!9^#Va*!*-`*Ͳeʤ3Î3!*-`*͠*ʼ3!!a*!9^#V!!9s!9s!9s*-+"-#|ʦ4!*-`*DM!9~'4`i-͠*4`i+͠*'4!!9sÖ4!9~G4`i.͠*G4!!9sÖ4!9~€4`ie͠*f4`iE͠*ʀ4!!9s!!9s!9sÖ4e–4!*-`*æ4`i#+s3!u!9^#V3ca**-*4Vf!9!!9s#ripf!*-`*! 9s#r!-͠*5!!9s#r*-+"-A5! 9^#V!+͠*65*-+"-A5!*-`**-+"-#|5!*-`*!9^#VieDM||5!*-`*5!9!9^#Viͯf]fipf!9`i!9~#foʹ+!9~#fo^iͯf]fgpfA5!9~#5!9!9]f;fpf!9]f@SSCANF_!TS.189!S.190!S.191`!S.19*|-M6*z-w#@w#6#w[6#wf6*z-~G#~@##~‚6!*|-å6!*z-w#@w#6#w³6#6Ͳ:*z-~G#~@##~6"5Ͳ:*z- V+^+V+^+V+^+V++~@_+~怳_*5"5*|-s#{@w#6#r#s#r#s#r#s#r#6*5*|-*z-"|-"z-*z-~w*z-#~4:):=ɯ<*z-*|-~7f7Ã7b7#b7f7 #b7f77*|-~w*z- w#²7*|- w#7*z-*|-#7/<+"|-"z- :O _"5! "5^8%8*5*5+8 8@8*5*5w+.8>w+ 78#~>W8>w+L8>*z-w:*5*5+g8 p8:*z-*|-#O~ž8>2~-y;##8¢8 q#6#62~-;q8 q+ *6~+8 26~+8!"6w#8>@2!6!"6~w#9O*6!26#9y69!"64!!658h9!!65h9!"6~w#C9O*6!26#V9y69(9*z- 6+6"6+wy9:*z-*|-#:~: 26~+©9 *6~+»9!"6w#9>@2!6!"6~w#9:"6!26#9:9!!659*z- (6 w+::j74:!j7):!G(;+y>O~# ;!;5;@:;t;[;>2~- y!T]w+M;6(;>2~-͔;*z-#6#w#6;>2~-͔;*z-#6?#6>#w‰;#6*|ʱ;!9N#F*~-Ͱ;O#‹<>:~#œ<:*<T]w#w#w#w*z-N#~:;:;w#<:;y=6#6#6#6h=6#6#6#6h==*z-F#~%=+=!:;O=#o7=$^+Vy:;x:;|/g}/o#:;yZ=!h=xe=!h=!>2~-@@ @GzH? ěT?F]cf>S#>c{Z=ֿzf=y0==%}<6{<_^Y&; oP;4$C;hIj:$_=ά3:VR8! 9^#V":6!9͡6!9~<>>2<6o&"=6*z-~4>M7*:66-#":6U7ʺ>͌6A *z-#~>ʚ>b>##~'ڢ>?͌6@?::p>?*z-###~ ں> ?ú>*z-#~¢>##~ ں>|8Ð>*z-#~>? é>!9~>*=6 "=6*=6+|>!>>}>!)))o=͓6ͧ7͌6A O:?!d:!9~?*=6#"=6`i"?6!9~V?xyV?*:660#6.#:>6C?y/F?:<6Q?60#=J?":6>O:>6?:=6ڒ?ʒ?*z-#~>0|?##6*:6w#x‰?6.#":6?`?!9~?*:66e#6+:@6:?6?6-/<#dڼ?61#d ? þ?0_>0w#s#":6*:66>7!d:|8*z-#4 ^&)DM)) #wz++?#w:++~!@@t;a*! DM`i~Q@`i DM,N@!-@!9^#V#^!+͠*!9^#V^IA|ʃ@!Æ@!!9^#VͰV! s!͠*ʧ@!\A|ʸ@!û@!͂+!9^#VͰV! s!͠*@!\A|@!@!͂+!9^#VͰV! s!͠*A!!Vf̓f! ^Da!9\A!"!+ru@w@a@?A!! s!! s#r!`is#r! s#r! s#r`ia*!9N#F! ^!P*ʺA!ͶGʷA!A!9^#V!͠*A`i~#A!9`i^#V! ^#Vʹ+iͯf]f/gpf!! s#r`is#r!9^#V!9]f̓f! ^Da!9Hf͕i=B!!a*!9N#F!9!Vf̓f! ^Da!9pf! ^!P*ʯB!9! ^#V`i^#Vʹ+iͯf]fgpfB`i~#B!9`i^#V! ^#Vʹ+iͯf]f/gpf!9]fa*! 9^#VBK! Cͯ*$C ͯ*$C`i#DM+sB!`is͠*LC`i! 9~#fo͠*LC!! 9^#Va*! 9^#V!9~#fo+s#r!*ʮC!9^#VCDMͯ*ʮC`i#+s`i ͠*®CdC!u`i͠*C! 9~#fo͠*C!! 9^#Va*! 9N#F9s#r#+^!0Ϳ*ʿK9*ʿK!>9^#V! X+!>9s#r{K.͠*L!!@9s#r#+^!0Ϳ*L9*L!@9^#V! X+!@9s#rKl͠*ZL#+^!:9!T9~#fos#r]fpfLd͠*ʌL!:9!T9~#fo##s#r++^#VipfLe͠*°Lf͠*°Lg͠*L!9!T9~#fos#r͡66L!:9!T9~#fo##s#r++^#VͿipfãN!9!!>9]f̓fEP!9!49s#rN!:9]fHf͕ixM!9! !>9]f;f̓fO!9!49s#r!-!69~#fo+s#rsÛM!9! !>9]f̓fO!9!49s#rN!9! !>9]f̓fEP!9!49s#rN!9!!>9]f̓fEP!9!49s#rN!:9]fi!49s#rd!89s#rNe͠*N!!N!!B9^#V!͠*8N!@N!B9^#V!9! 9͡66=!9! 9!49s#rd!89s#r!!@9s#rN!:9]fi!9!69s#rsN+oLd%MuMxMsMe Nf NcNN!9!49~#foʹ+!89s#r!89^#V!@9~#fo*O!@9^#V!89s#r!D9~#@O!>9~#fo+s#r#!89~#fo*@O!B9^#V`i`*O!!69s#r]O!69~#fo#s#r!49^#V~ʝO!69^#V!@9~#fo*ʝO!49~#fo#s#r+^`i`*NO!D9~#O!>9~#fo+s#r#!89~#fo*O! `i`*çOO`i`*Ja*!9N#F!9^#V`ii̓f!9]f͛fChipJ^+s! 9`iiͯf]f hpffOa*!9N#F!9^#V! 9]fHf͕iP! 9]fiP*! 9!9]fHfgHfEgpf`i͊+i̓f!9]f͛fChi)pJ^+s! 9`i͊+iͯf]f hpf!9]f̓fO!9i*RQI,0QI,*J*DM*L*o&I,NQo&I,*J**+++*L*DM*N*!9N#F#^#Vkb6#> 6 #=yQ>6#=‚Q : >µQ AQ[ҦQ@òQaQ{Q`w# .QQʸQQw#ùQ{o|g QQw#Q!!|a{ !9^#V*Q!9}|!R*Q"Q|!! "ͬ!DM*+*͎ #"!.#+*!*"!;*"!*"**"*###)Ds#r**"!PYCDM*y͜(a*!!!bRMd!:o&P*bRs!T"&R!bRDM!"R*R*ʶT`i^! ͠*KS`i^! ͠*SS`i#DM/S`i^zʶT`i^!>͠*tS!ÈS`i^!<͠*gT!`i#DM^! ͠*§S`i^! ͠*ʪSÈS`i`i#DM~S`i^! ͠*S`i^! ͠*S!`i#DM+sSïSX|T!͐VT!ͰV͠*dT!T!d!-e!T!-e!d!!r^! TóT`i*R#"R+)&Rs#r`i#DM~ʳT`i^! ͠*¡T`i^! ͠*ʰT!`i#DM+sóT{T"S!&R*R*TCan't open file for redirection: a*F! 9~#U! UcQA:$$$.SUBa*!"!a*!##*)Ds#r*)D^#V*͝*)b^#V*$0Rͮʃ`i͹)^#V*)bs#r*)b^#V*)D#V(ͩ&*#"+**"*"*DM`i)^#V"**"!*"*^#V"*$B**Bcon:CON:lst:LST:prn:PRN:pun:PUN:rdr:RDR:a*!9^#V!!9^#VͰVa*!!!9s#rV!9~#fo#s#r!9^#V! *WnfU͠*WV!"!!DMW`iDM`i~#?W!9^#V`i^#V͉d?WW! ^#V!9^#V!P*#!9s#r!9^#V!P*ʆWn&u|†W!"!!9^#V!P*ʭWn&u|­W!"!! ^#Vsrn&un&u!Zut!9^#V!9^#V!9^#Vnf`*! 9!* X!!9^#Va*! 9^#V!*8X! 9^#V! *BX!"!! 9^#V)))DM! ^#V! ^#V`*! 9s#r!! s! s! s`is!U! s#r! 9^#Va*!.UDMîX`i&DM`i^V,X!% ^zXæX!"!!9^#VfQX!"!!9^#V!P*Y!-Q!-Q͠*KY!9^#V!P*>Y!-Q͠*HY!"!kY!9^#V!P*͠*kY!"!!!! s#r!# s!$ s`i!9^#V!s#r!9^#V!P*#!% s!P*Y!Y!9^#V!s#rY!Y!9^#V!s#r!a*!!9^#V!%s!a*! 9N#F!-Q!!% s!a*!U[:]^ all the ones from that level. Beware, clones are not as dumb as they look (nothing personal, but theywere cloned from you) and given the chance they will combine to formsuper-clones which take more than one shot to kill. Key: You: Clone: a*! 9^#V!*S[! 9^#V! *][!"!! 9^#V)))DM!9^#V!9^#V! ^#V`i^)"Z^#V`*a*!DM!9^#V$~[n$&!ʹ+DM!9~#fo,[!9^#VBK!9^#Vͳ\[!!9^#V`iʹ+!,!9s#rza\!9^#V!9^#V`iͷb!9s#rza\!9^#V!9~#foʹ+ͤ+PY!9^#V!ͤ+PYDM`i!9~#fo,ʪ\!9^#V`iʹ+!9^#V`iͳ\ʪ\`i!9^#Va*! 9N#F!!-Q!!-Q"|\!!9^#V!$ ^!!9^#VMd!$ ^!9~#foP*!$ sz6]`i!~#fo#s#r!a*:+Zo&|]!}2*Z!}2,Z}2+Z!*Z! -Q! !-Q:,Zo&͠*ʐ]!}2+Z!! :+Zo&#}2+Z*Z#s! :+Zo&#}2+Z*Z#s!",[:+Zo&DM!9~#fo*]!9^#VBK*,[*Z!9^#VMd`i*,[",[`i:+Zo&ʹ+}2+Z`ia*!9N#F!3^#!9~#fo*f^! 9^#V-Q`i#DM+s!͠*f^,^U^``a*! 9^#V!*—^! 9^#V! *ʡ^!"!! 9^#V)))DM!9^#V!9^#V! ^#V! ^)j^^#V`*a*!DM!9^#V$~B_n$&!ʹ+DM!9~#fo,*_!9^#VBK!9^#V_B_!!9^#V`iʹ+!,!9s#rzʧ_!9^#V!9^#V`iͿb!9s#rzʧ_!9^#V!9~#foʹ+ͤ+PY!9^#V!ͤ+PYDM`i!9~#fo,_!9^#V`iʹ+!9^#V`i__`i!9^#Va*! 9N#F!!-Q!!-Q"͠*4`*͠*O`!"!!!md[`*|[`!!9^#V!9^#V!$ ^!Md!"-Q"|ʓ`!!$ ^!9~#foP*!$ sz``i!~#fo#s#r!a*!9N#F!`#!9~#fo*@a`i#DM+^!9s#r!9^#V! ͠*(a! !9^#V-Q!9^#V!9^#V-Q`a*! 9^#V!*€a! 9^#V! *€a! 9^#V)))^zŽa!"Vf! 9^#V)))^#VBK!9^#V/b!-Q͠*a!"Vf!#-Q!!$ s!9!! ^#VͿiHf͒g̓f!$ ^i͛fgͯf]fgpfBb!"Vf+aab!b!!# s!9]fHf͕i}b!!! s#r!$ s!"Vf!9]fiP*!$ s!9]fHfgi!! s#r!9]fI,!bI,"*L*!"L**J*b*J*!4b#4*N*+"N*}bo&"*N*a*!9!29^#VfQ!9!-Qů2.c2/c20c!"1cd:!9N#F -Zc2.c_c+`c 0ڏc:ҏc?>70o&d:ͧ7:0c_c*1c+"1c_c.œc!0c6_c! ec -³c2/cøc+¹c 0c:c0)T]))_øc:/cc|/g}/o#*1c"1c*1c|/dKd}/7!d:? d>7|8?dKd}?dO? 8d:.cIdM7! 9F+N+V+^+~+ngxkdw# ^d!9^#V#N#F#nxʇds# |d!9^#V#~#foxʭd²dʭd# Ùd!ڼd!}!}!9^#V#~#foxd~d# d!9~#fod#d}!9^#V#^#V#N#FÙd!9^#V#^#V#N#Fd!9^#V#~#foxd~Ne# ?ed!9^#V#^#V#N#F?e!9^#V#n~ʁeʇe#te!|!9^#V#nʣe#Úexʁe +~£eÇe!9~ e e ee!9~Ae[e!}!9~ae{e!!9~0e:ee!9~af{f o&!9~A+f[+f o&!*>af!*<w#w#w#w*<~#~#~#~"0f*<V+^+V+^*0f"0f*>s#r#s#r*0f*>*<">"<*<>w#f*<~i#fÄi=ɯ<*<*>###gfgfff+g*<*>#$g*<*>#:g*<*>#Og*<*>#dg*<*>#yg*<~/w#‰g*>~?G*<^#V#~#fo))Үg#¦gDM*<s#r#q#p*>~?W*<###~g~w+gg7~w+gg~#gOf*<Dfg::f2:fvhDfgvh@f*<w#eh::ff!@fw#|h> 2;f!Df~# i*<@f~#i! 2;f!Dfg::f2:fvhDfgvh@f*<w#eh::ff!@fw#|h> 2;f!8 THEN 26 22 IF T(S)<1 THEN 26 23 LET U(S)=ABS(INT(U(S))) 24 IF U(S)>3 THEN 26 25 IF U(S)>0 THEN 29 26 PRINT"HORSE NO. OR WIN-PLACE-SHOW BET IN ERROR" 27 LET R = 3*(J-1) 28 INPUT V(S) 29 IF V(S) -2=ABS(V(S)-2) THEN 32 30 PRINT"Bet must be between $2 and $300, bet again"; 31 GOTO 28 32 IF V(S)>300 THEN 30 33 IF Y1 = 1 THEN 17 34 PRINT 35 PRINT" They're off and running -" 36 PRINT 37 LET M(1) = 62.25 38 M(2) = 60 39 M(3) = 350/6 40 M(4) = 500/9 41 M(5) = 55 42 M(6) = 650/12 43 M(7) = 1100/21 44 M(8) = 1600/31 45 LET O(1) = 6 46 O(2) = 8 47 O(3) = 10 48 O(4) = 16 49 O(5) = 18 50 O(6) = 22 51 O(7) = 40 52 O(8) = 60 53 FOR N = 1 TO 8 54 LET H(N)=0 55 NEXT N 56 LET K = 0 57 LET G=1 58 LET J = 1 59 LET N = 4*T(1)-U(1) 60 FOR Z5=S TO 5*V(S)+N 61 LET Z1=RND(1) 62 NEXT Z5 63 FOR Z5=1 TO 500000! 64 IF INT(Z5/N)-G<>0 THEN 82 65 LET H(J)=H(J)+RND(1)*M(J) 66 LET J=J+1 67 LET G=G+1 68 IF J <> 9 THEN 81 69 LET J = 1 70 GOSUB 134 71 LET D = H(B(1)) 72 LET K=K+1 73 PRINT 74 IF K = 8 THEN 78 75 GOSUB 194 76 GOSUB 159 77 GOTO 82 78 PRINT"- - - FINISH - - -" 79 LET Z5=500001! 80 GOSUB 159 81 LET Z1=RND(1) 82 NEXT Z5 83 PRINT 84 PRINT 85 PRINT"$2 Mutuals paid:" 86 PRINT" STRAIGHT PLACE SHOW" 87 LET K = 0 88 FOR I = 1 TO 3 89 GOSUB 165 90 LET J=I 91 IF J = 1 THEN 95 92 PRINT" "; 93 LET J=J-1 94 GOTO 91 95 FOR J = I TO 3 96 LET L=I+I+J 97 IF J > 1 THEN 100 98 LET R = 1 99 GOTO 101 100 LET R = 3*(J-1) 101 LET H(L)=1.5+.01*INT((O(B(I))/R+RND(1))*100) 102 PRINT H(L); 103 NEXT J 104 PRINT 105 NEXT I 106 PRINT 107 LET Q=0 108 FOR J=1 TO S 109 PRINT "Bet no. ";J 110 LET P=0 111 FOR I = 1 TO 3 112 IF B(I) <> T(J) THEN 119 113 IF U(J) < I THEN 125 114 LET P = .01*INT((V(J)*50)*H(I+I+U(J))) 115 PRINT "You collect";P;"on "; 116 GOSUB 165 117 PRINT 118 GOTO 127 119 NEXT I 120 LET I = T(J) 121 PRINT"Tear up your ticket on "; 122 FOR I = 4 TO 8 123 IF B(I) = T(J) THEN 116 124 NEXT I 125 PRINT"Next time, purchase a show ticket on "; 126 GOTO 116 127 LET Q = Q+P-V(J) 128 NEXT J 129 GOTO 7000 130 PRINT"Your total winnings amount to $";Q2 131 GOTO 300 132 PRINT"Your total losses amount to $";ABS(Q2) 133 GOTO 300 134 LET Q = 1 135 FOR L1 = 1 TO 8 136 LET B(L1) = 1 137 LET A(L1) = 1 138 NEXT L1 139 FOR L1 = 1 TO 8 140 FOR L2 = 1 TO 8 141 IF L1=L2 THEN 145 142 IF H(L1)<>H(L2) THEN 145 143 PRINT" - - - TYPE `RUN' TO START OVER - - -" 144 STOP 145 IF H(L1)L1 THEN 156 153 LET B(Q) = L2 154 LET Q=Q+1 155 LET L2 = 9 156 NEXT L2 157 NEXT L1 158 RETURN 159 REM 160 IF K = 8 THEN 193 161 PRINT"POS. HORSE LENGTHS BEHIND" 162 PRINT 163 FOR I = 1 TO 8 164 PRINT I; 165 IF B(I)=1 THEN 186 166 IF B(I)=2 THEN 184 167 IF B(I)=3 THEN 182 168 IF B(I)=4 THEN 180 169 IF B(I)=5 THEN 178 170 IF B(I)=6 THEN 176 171 IF B(I)=7 THEN 174 172 PRINT"Coaltown "; 173 GOTO 187 174 PRINT"Stymie "; 175 GOTO 187 176 PRINT"Gallant Fox"; 177 GOTO 187 178 PRINT"Seabiscuit "; 179 GOTO 187 180 PRINT"Assault "; 181 GOTO 187 182 PRINT"Whirlaway "; 183 GOTO 187 184 PRINT"Citation "; 185 GOTO 187 186 PRINT"Man O'War "; 187 IF K = 0 THEN 193 188 IF I > 1 THEN 191 189 PRINT 190 GOTO 192 191 PRINT .1*INT(D-H(B(I))) 192 NEXT I 193 RETURN 194 IF K=1 THEN 204 195 IF K=2 THEN 206 196 IF K=3 THEN 208 197 IF K=4 THEN 210 198 IF K=5 THEN 212 199 IF K=6 THEN 214 200 IF K = 7 THEN 202 201 GOTO 215 202 PRINT" Coming down the stretch -" 203 GOTO 215 204 PRINT" As they break from the gate -" 205 GOTO 215 206 PRINT" At the 1/4 mile pole -" 207 GOTO 215 208 PRINT" Nearing the halfway mark -" 209 GOTO 215 210 PRINT" Midway in the race -" 211 GOTO 215 212 PRINT" At 5/8 of a mile -" 213 GOTO 215 214 PRINT " Rounding the turn -" 215 RETURN 216 SYSTEM 300 PRINT:INPUT"Do you want to bet on the next race (Y OR N)";W$ 305 PRINT:PRINT:PRINT 310 IF W$="N" THEN 340 315 IF W$="n" THEN 340 320 IF W$="Y" THEN 5 325 IF W$="y" THEN 5 330 GOTO 300 340 IF Q2>0 THEN 380 350 IF Q2<0 THEN 390 360 PRINT"Bye now!!!!" 370 GOTO 216 380 PRINT"Put the money I owe you on my tab!!":GOTO 216 390 PRINT"Put the money you owe me on the terminal!!!" 400 GOTO 216 7000 Q2=Q+Q2 7010 IF Q2=0 THEN 7300 7020 IF Q2<0 THEN 132 7030 GOTO 130 7300 PRINT"Well, how 'bout that! You broke even!" 7310 GOTO 300 "y" THEN 5 330 GOTO 300 340 IF Q2>0 THEN 380 350 IF Q2<0 THEN 390 360 PRINT"Bye now!!!!" 370 GOTO 216 380 PRINT"Put t$ $]Tx2$(#6~+%5HA$.%a."/#!9"$ v$v$+~#G#P$+GO>#ͳ&`iGí$*$ ʢ$.&""$/@$#~+$!"k+s#r#&$$/$/"%͜*s#r#"%/!]>#ͳ&q#p!w+~F%a./~GO#^#Vz>a>0ͳ&xGxʬ%^#V#O"/yk+F(6s#r#s#r#&¡%k%ü%>¾%¼%s#rw+>a/a..%2.#6+>1ͳ&s#r>w+a.)a.>#V>Æ(&F(F('O&3%`& `& &%?A#"$"a.]&7#yͿ*.&X{&&>a*6#~ž&3&s#r>#+6#6#6#6@="#wɧø&7?'w##&4##p#.2b ** "|& } +++:~?'4'`':,X/~2,?'**s#r"*##s#r:/*}o|g"*>(G}|v'!"(!("**"*}|ڄ'"6# x…'* ">a:y|ʽ'z+ï'*yr,##~>'> ͳ&s#r w+.>2 (#w+>3ͳ&s#rw+ͳ&xDM"/(*(s#r#(! C(>2ͷ&@(ͳ&(&~#Z(#~+Z(~+x ͳ&s#rw+ɯ2(x_Oͷ&Ô(2(x_Oͳ&9w#w+xʭ(+r+s=¤(w>#w+&~7^#V((!~ѧ7.&.~7!~#fo~)7)#~+~w}D#wx#a.&G!)!9*?>a:c)2>2:o) L))K:)!uLҘ)͑M!)bM)*xʸ)ͳML)͇M!8L͇L)@]T}_|))).&">4W*/y=*/#~+)*x *xG>k+x8*>k+xG F*>k+x#~+>k+>Xͳ&s#r+&W!x*G^#V#~ì*3 < E N !3> ì*!<> ì*!W> ì*!`> ì*!i> ì*O?'yG !T+GF.*x2j+*(+#N+.*N+x +#~++k+ +yk+ (w!~#fo#~#w:j+,+6~+;+~ ;+6 H+~H+6ͤ/P+ɀ @ PPPPPP X#ʌ+̏+~̏++(w#w+*R#~6+´+&6#s#r>6###s#r#6@"R=#w:G+!<,####~#+F#N#~#fo~#fo,CH+##~>O3)6#p#6 ####yGS)+w~!_,H~͞.>a"n-:ʗ,ͤ/͔*ͤ/>Ϳ*.&v,ʪ,w-`i)9^#V!~)y~-#~#fo##A:-ͤ/x>Ŀ* ,^#V#F(ͤ/> Ϳ*,#~U,o&">2+F(ͤ/> Ϳ*"3-xGO>$ͳ&H"-s#r# (-H +V+^F(s#r# =-U,w*-w+ͤ/yOn-n-n-**}_|WҚ-\H7I Bytes Free ͞.-::g .>a~>a:-###^#V*{z-">?W*/>?W*:b *c ;2b "c **5H +V+^"&D.J.F(N.'~=w2_.~#fo&~#!y.H~aX[&#~+>>2e .>2e &|½.!T~#.~#fo..##~#~#..Ô+.„*&""> 2q"/y2/2/O&#s#r+++++~5/ }|x]/!^#Vz<̕/z̝/͚Hĕ/DM!/55/xʌ/~U,! ܕ/=w/DM͒'+r+s:/OÕ!*s#r#"#~+*++"!9"/!/"h 0W1*"!"(""h !("*2,?'"/!(~#fo_0"9##~#fo9990 111'0~YA0=f0 8: >*/ćI#r+s++0*/>ͦ0!~#fo~~Z̫9 ' ͳ& >G>G!N#F*9~#fo##^#VX!~#fo"1++~+ng##^#V~4#####~#~*9w#w#~#fo>wq#p>1>1>*d02e0&12e0~q199>1&121L1x?1:e0=e1h1q141̀22N2q142~Ҕ1¾1^#V>ʾ1>þ19ڠ1>þ1#~ʛ1ʛ1####^#VҾ1>###w~2ʐ99GB2N#^#V#~#fo (B2(1F6Fx B2~B2O!~#fo(A2"J2"L2~#F!E2w#p+6! s#r`iF~ !N#F# }25! F+N+p+q 1s#r ~ ʉ2 22^#V#~#fo7(2"2!N#F#~#fo(2"2!q#p!!Åh:cmmmmmmmmþ.. " H=============== ==================== H"// " H |===== \ / V =====H=========="d/i/ " H \/ H"ò// " H | $ H"00 " H H | H H"N0S0 " H ====H======= g |&H H H"Ü00 " H H ======================H ======"00 " H H &| H H"D1I1 " H H &| H H }{ =====H===="Ö11 "===H===& H =====================H H H"11 " H H H H":2?2 " H H & H"Ì22 " ======H=== ======= H <> & H"22 " H========== ===== = ============"33 " }i{ H"g3l3 "* H *"ÿ33 "==============================================================================="33 3233 0,6"4'4 " =Gang Land= V ."r4w4 " == _ == ."44 " g H | [] |_| | & . H"55 "===========H | |_| | H === ===================H"k5p5 " V H ============= H====== H"þ55 " H H & H"66 " H H | | H"d6i6 " H H ^^^&&^^^ & ^ ^^^ H H | =============H"÷66 " H======H =======================H===========H===== & H" 77 " H H H | &&& H"]7b7 " H H H | &&&&& H"ð77 " H H H | =============H"78 " =====------================= H | $ $"O8T8 " | H | $$$ $$$"à88 "====------=== | H | $$$$$ $$$$$"88 " | = | ============= ============"0959 " | $ ^ &"q9v9 " |^^^^^^^^^^^^^^ $ ^ ======"99 "* . & ^ H*^ ^ ^ ^^^^^^^^^^^^"!:&: "==============================================================================="*:9c -1:o&"!bͰv*"!e:*!n&͊wCrͰv*!#"!*!*z|y:}|H:h!b͉b! ͱ!ͬo#! o!!I|/g}/o|n;!ɇ!b̈́Ϳq!cgpͿq!cgpͿq!bgp!b͉b! ͱ!ͬo#! o!!I|/g}/o|P;!ɇ!b̈́Ϳq!cgpͿq!cgpͿq!zbgpͿq!Sbgp͐j!ɇͿq!cgpͿq!-bgp!#b)i#!"vʹs"&#*&Tv(Ͱv!#!"vʹs"&#*&Tv+Ͱv!#!"vʹs"&#*&Tv.Ͱv!#!"vʹs"&#*&Tv1Ͱv!#!"vʹs"&#*&Tv4Ͱv!#!"vʹs"&#*&Tv7Ͱv!#!"v:Ͱv#!Tv=Ͱv#!Tvr"@#!Tvr"B#!Tvʹs"D!#!"vFͰvF!7vF!"vCrFͰv!À=*!#!"vʹs"&*&|C=*!)s#r*!cx bv|=#bkTvr*!)s#r*!cx#*&Tvv*!#"!*!|ڐ=)?go"N*!|)>!"PC> *!!Tvtw"P!b+s"!*!|Z>?go*N|g}o"N*!||>* "RÖ>*!!Tvtw"R!a+s"!*!|ڭ>?go*N|g}o"N*!|>!"T> *!!Tvtv.cw"TͿq!7Cp!EwVͰvͿq!VCpͿq!agpͿq!VCpͿq!agpͿq!VCpͿq!^agpͿq!VCpͿq!&agpͿq!VCpͿq!`gpͿq!VCpͿq!`gpͿq!VCpͿq!`gpͿq!cgpͿq!cgpͿq!p`gpͿq!Q`gpͿq!8`gpͿq!cgpͿq!cgpͿq!(`gpͿq!`gpͿq!_gpͿq!_gpͿq!_gp!("Y! "[[!Y@dͿq!_Cp!Cp!("Y! "[[!Y@dͿq!_Cp!(Cp!("Y! "[[!Y@dͿq!_CpF!"vCp!_CpF!TvCpͿq!_CpF!TvCp!_CpF!TvCp! "[[!Y@dͿq!f_Cp!("Y!"[[!Y@dͿq!X_Cp!=A*[#"[[!Y@dͿq0*!͊wCp!S_Cp*!)^#V)9A*!)}cͿq!L_Cp*!cxCp*!#"!*!|MA)@*|څAʅA*[##"[[!Y@dͿq!=_Cp!}cͿq!8_Cp!("Y! "[[!Y@dͿq!#_Cp0*͊wCp!nu&c!Z͝s;u"cw"]*"_ͧX!"[!"Y[!Y@dͿq!_Cp!aRc*a|VB*]+"]*]|BA!n2uc-Bc!^Ͱv6Bc!^Ͱv͹X*a|ʰA!"[!"Y[!Y@d*a͊wfͰvf!^nuf!^nu|g}o|ʍBͿq!^Cp͐jf!^nuf!^nu|g}o| Df!^nuf!^nu|g}o|:f!^nuf!^nu|g}o| Cf!^nuf!^nu|g}o|CAͿq!7CpͿq!cgpͿq!\^gpͿq!^gpͿq!^gpͿq!cgpͿq!]gpͿq!]gpͿq!@]gpͿq!)]gpͿq!cgpͿq!\gpͿq!\gpͿq!\gpͿq!Q\gpͿq!cgpͿq!\gpͿq!cgpͿq![gpͿq!cgpͿq![gpͿq!cgpͿq![Cp! fͰv! ͊w!f͍uC>*x#"ÅA*"_*R"i!"k*T"!"m!d"o*P"q*"s!"unt!"w!yt*y|ƒD!"q*s##"s*s|wD)ڀD!"sAD*w*qzzD{zڪD*q#"q*u##"uAD*u*y}o|g"y*y"{!}t!t*svEDDEE*}cxwucw"}E*}͞w"}E*}wucw"}E!"}!"Ϳq!7Cp*"!7F!#-tͿq!#gp!jE*!cxQ*) s#r*#"*|zE)NE!#ͪs"!F#*!Tv+s+"*|·E*"*!"*|E!"*!cxQ*) *s#r*|F*#"*)*s#r*!s#r*#"**z|/F}|ҌE*!#"!*!*z|KF}|9E*w#"w!nF*!) s#r*!#"!*!|~F)\F*"!ïF*!cx s#rs#r*!#"!*!*z|F}|ҍF*"*"*"*"*""!"!"*"!G*!)s#r*!#"!*!*z|&G}|G!""*"*{"y!"!@dͿq![Cp!i}cͿq![Cp!k}cͿq![Cp!}cͿq!8_Cp!<"!@dͿq![Cp!y}cͿq!8_CpͧXc!{[Ͱv͹X**zzG{zzH!nw*wu!Z͝s;u*cw"*"!H*!)^#V|5H*!#"!*!*z|.H}|HzH*)^#V*!)"hs#r^#V*~s#r*#"*!)s#r*"*"!qL!Rc*͊wͰv*|RI*|¸HsYRI*|>! ͒uHF!+s"RI*|H*"RI*cxQ*)^#V|go"|I)?go*|g}o|RI*"!"*|II)RI!"*)^#V|mL*)h^#V"~^#V"*"*"*cxQ*) ^#V|I*)s#r*+"!@dͿq!w[CpmL*cxQ*) ^#V|LJ!nuc!Z͝sw"*#vJ;JJ*)^#V)^^#Vs#rÍJ*)s#rÍJ*cxQ*)^#V|go"|xJ)?go*|g}o|;J*)^#VvJJKK*#"*cxQ*) ^#V|go"|J)?go*|g}o|–K!n͞v!Z͝s;ucw*)s#rÊK*)^#V)T^#V*"*cxQ*) ^#V|go"|\K)?go*|g}o|–K*)^#V)^^#Vs#r*"*"!@dͿq*cxQ*) ^#V#!TvCp!@dͿq!s[Cp*)h*s#r~*s#r**}o|go**}o|go|g}o|R*|/g}/o|mL*+"ͫW*cxQ*) ^#V|mL*+"*)mLͫW*#"**z|L}|ҌHUX sw"!*+"*|ڨLL*y+"y?X*y|R*y|L)LͿq!ICp*"*"*"*|N*"*"*cxQ*) ^#V|^M*cxQ*)^#V|go"|@M)?go*|g}o|^M!"M*#vPpMMCNCN*+"*cxQ*) ^#V|ڙM)?go"|go*|g}o|¾P*"**}o|ʾP*"^M*#"*cxQ*) ^#V|go"|go*|g}o"|+N)?go*|g}o|¾PýM*#"*cxQ*) ^#V|”N*cxQ*) s#r!@dͿq!cCp*)T^#V*"*cxQ*) ^#V|go"|go*|g}o|¾P*"þP*"*|O)O!"*)T^#V*"*#"FW*cxQ*) ^#V|dO*#"**z|]O}|dOFW*|oOW*vOOOOOO*+"ÓO*#"*cxQ*) ^#V#v?P?PO?PO?PO?P*""!"*|O)O!"þP*"*"RP*"*"*|go*|go|g}o|RP*)^^#V"*"þP*+"*|RP¾P*|/g}/o|µP*cxQ*)^#V|go"|go*|g}o|¦PõP!"*"þP*""!@dͿq*cxQ*) ^#V#!TvCp!@dͿq*#!TvCp*"*"*cxQ*) ^#V"*|eQ**y"W*cxQ*) s#rQ*|QR*|R*|Q!nuc!Z͝sw"*#vQQQ*)^^#V"Q*"!"*"!6R*!)^#V|2R*!)h^#V*}o|go"~^#V*}o|go*|g}o|R*!#"!*!*z|JR}|QúGͿq!ICp*y|RR*y"!ûR*y+"y*#"W?X!"!@d*!}o|g|«R~X÷Rc!j[ͰvX*!#"!*!*z|R}|rR*k#"kJDͿq!ICp!ͪs"!S!@dͿq*!!TvCp~X*!#"!*!*z|,S}|R!@dͿq!ICp*cxQ*) ^#V#!TvCp*"!S*!)^#V|S*!)~"h*@dͿq*!)~^#VcxQ"h^#V*) ^#V#!TvCp*!#"!*!*z|S}|rS*i+"i*i| TF*"!-V*)^#V*z|0T}|)V*N|/g}/o|QTc!H[Ͱv͹X@V*"Ϳq!7gpͿq!cgpͿq!cgpͿq!cgpͿq!cgpͿq!cgpͿq! [gpͿq!cgp*w|ڬT)ڻTͿq!ZgpPU*;|T)TͿq!ZgpPU*|T)TͿq!ZgpPU* |U)UͿq!ZgpPU*|U)+UͿq!tZgpPU*|8U)GUͿq!ZZgpPUͿq!3ZgpͿq!cgpͿq!ZCpͧX!c`n!f̓nf!"vfͰv!fͪs|•U*"@V*|V*"!U*)^#V"*s#r*cx"*v*+"**zzU{zҭU*)*s#r*cxfv@V*#"*|=V)T*|/g}/o|>Ϳq!cgpͿq!cgpͿq!cgpͿq!cgpͿq!cgpͿq!Zgp!b͉b! ͱ!ͬo#! o!W*!cxͪs͊w*!)^#VsCr"*CrfͰv#!f͖r*!*!#"!*!|W)ګV!ɇ!b͉b! ͱ!ͬo#! o!ɇ>*"!ÒW*)h^#V*}o|ŽW*)~^#V*}o|ŽW*##"*"*#"**z|W}|RW**}o|ʼW**}o|W*##"*"!$"!@d!}cͿq!ICp**ozz X{zX*m#"m*mcxd"o*i#"i!"!@d!i}c!G"!@d!y}c*}"!eX*#"**z|yX}|aX*"!ÎX*#"**z|X}|ҊX!Rc*|¶XçX!"X!"4Y*"!X!aRc*a|Y~X*#"**z|Y}|X*_|Y!"Y*"!@dͿq!cͪsEwCp*L|/g}/o|CY*_|TY!"ZY*"!"!@dͿq!cCp!ZͰv!"!@dc!YͰvͿq!cCp! fͰv!͊w!f͒u>! ͊w!f͍uY!@dͿq!cͪsEwCp͐jYType RETURN to continue: ZZUpdating high scores..."ZEnter your name: $6ZYou really don't deserve this but...]ZNot bad for a young LadwZAmazing! You rate!!ZLooks like we have a Lad-Der hereZYeah! Now you are a Lad-Wiz!ZWow! You are now a Lad-Guru!ZYou are a true Lad-Master!!!:[ YAHOO! YAHOO! YAHOO! YAHOO! YAHOO! YAHOO! YAHOO!K[YOU CHEATED!!! You don't rate.m[Hooka!v[oz[* ~[Get ready! [Bonus time [ Score [ Level[Lads$[Type RETURN to return to main menu: [Good luck Lad.![Type an ESCape to pause the game.:\Remember, there is more than one way to skin a cat. (Chum)/T\that are left when you have finished the level.=\statues (shown as &). You will receive the bonus time points.\Extra points are awarded for touching the gold2\A new Lad will be awarded for every 10,000 points.,]bonus time runs out.]You control Lad by typing the direction buttons and jumping by^treasures and riches.>^dark corridors never before seen by human eyes and find hidden@_^You are a Lad trapped in a maze. Your mission is to explore the^l^L^i^I^c^C^p^P ^ExitingB4^e^E^You eat quiche!^Come on, we don't have all day! _Enter one of the above: &_Difficulty level: ;_00 @_Last Score: O_00 V_) [_High Scoresi_Jump = Space Stop = Other _ Right = _ Left = _ Down = _Up = _Terminal: _Version : _E = Exit Ladder_I = Instructions_  `L = Change level of difficulty +`P = Play game;`Los Angeles, Ca 90024T`10970 Ashton Av Suite 312C4s`(c) 1982, 1983 Yahoo Software/`LLLLLLLL aaa aa ddd dd ddd dd eeee rr/`LL aa aa dd dd dd dd ee rr/`LL aa aa dd dd dd dd eeeeee rr5)aLL aa aa dd dd dd dd ee ee rr rr4aaLL aaaa ddddd ddddd eeee rrrrrrr:aLL dd dd tm"aLL dd dd aPRO SCOREbPRO MEN bPRO LEVELbbY#b&bLADCONF#0bLinking to configuration program...$VbLadder configuration program missing}bUnable to link to LADCONF.COM bLADCONF.COMbLadder not configured bLADDER.DATbRb bpbdqPbdbPpo-_bgpbqp b -=$|VH*^.& bg-=$|VH*^.& c c1.31c@PCzףp= #z͐j(c)1982 Yahoo Softwareafc{fc w#w |xc=w#w^#V"cc2cog*c|©c "cÏc>0_:cc{0c c>2cc*c]>0_ ~2HedG#^#V!Iew#c~2HfG#^#V!Ifw#d~2HgG#^#V!Igw#*d~2Hh2Ih 2Jh~G:Ih2LhG:Jh2Kh:He`d!IeGd:Hhʍdʄd{d:KhdÓd:LhdÓd:Kh;eÓd:Lh;e:HfʡdG!Ifd:Hhddʼd:Lhdd:Khdd:Lh;ed:Kh;e:HgG!Igd~;e#d_!|e d>0Oxey0e;e!|%e ex/ey5e>0;e>0;e_*:9c -1:o&"!b͎*"!e:*!n&::*!#"!*!*z|y:}|H:!bb! !#! !!|/g}/o|n;!!b!c:!c::!b:!b̈́:b! ͐:!͖:#! ͟:!ͨ:!ͮ:|/g}/o|P;!Ϳ:!b::!c:*;!c0;3;!zb9;<;!SbB;!!;E;!cK;W;!-b];!#b#!"&#*&(_:! ;#!u;x;"&#*&͇;+͍;!͖;#!͟;͢;"&#*&ͱ;.ͷ;!;#!;;"&#*&;1;!;#!;;"&#*&<4 <!<#!< <"&#*&/<75<!><#!G<:_<#!Y<=w<#!̓<"@#!͕<͘<"B#!ͧ2h2h*^#V"h##^#V"h 2h!h!!""h!j" j6#6P>2j>2j>2j͉h"i͌h"ii_m=i!&6C#6O#6M!\>!k!\> L\AL.iʇiot|i!#&\ѷ!>/ *OUT OF MEMORY* $?go*N|g}o"N*!|>!"T> *!!͋>͎>.c͑>"T!9"i** ,j!6#},j|,j6!i6#z?j*|`j> j6#s#r#=Uj>2i>2i>2i2i"i!&i"iͫh{| STOYmÐjm*i.. . ........Ͷz*i|—j:ik*i|kl*  s#r*  {w#6"i*i*i>2im|Error -!-k~<&k=&k#~#kk#!|ÊjSyntax Error in DATRETURN without GOSU Type MismatcOut of DatIllegal Function CalOverfloOut of Memor Subscript Out of Rang Division By ZerOut of String SpacString Formula Too CompleRESUME without Erro2Field Overflo3Internal Erro4Bad File Numbe5File Not Foun6Bad File Mod7File Already Ope9Disk I/O Erro:File Already Exist=Disk Ful>Input Past En?Bad Record Numbe@Bad File NamCToo Many FileUnprintable Erro!9N#F*~#~m~+m~#~m+^#V###l###l|(m~#fo!0m| Internal Error - No Line Number &i*~#m| at linelwmm>ͫm<ڐmͤmzmͫm<ڐm0wͤmҌm}_|W!mG~#fo>| at address|r}rm> w> w!9"i*i)Pn|*i*i7n))]n) )]n ]n ]n"i"iK!"]]7n!n~2_n#~#^#V |++ͬz͎ځj:nm*i|¢n!n͌z͛zͳv*iCyC!\C͂C!Q\͈C͋C!c͑C͔C!\͚C͝C!cͣCͦC![ͬCͯC!c͵C͸C![;CC!cCC![C!f`B! ZB!f=C>*#"ÅA*"_*R"i!"k*T"!"m!d"o*P"q*"s!"u!"w!y*y|ƒD!"q*s##"s*s|wD)ڀD!"sAD*wm}eb! ~#fo"o! "om|­j*o}o|gw"o*o"o,{#s#r++smppQqm{pQqm͆pQqmFpQqmppnqm{pnqm͆pnqmp|qmpp!qm{p!qm͆p!qmp!qZÑpVÑp"ZÚpH~# ’px2T|:jHqqpJ͌z<͈q~p#÷pJ~p #p>2T|:jHqF#~#foxq̈qqq~#pqìzq>"G: jxqʋ* j+~ q>,W* j#^ ̫qʥq+=ڥq͋z{ڽq{_ïq!j" j!"i2jq! j~6#w~!q rNqmi&øj G~#r# r++%r0:0rw|­j}ڭj!jwmڭj3zdrdrͬzͬz~#~#foLږr#N#fiͽr~#N#fiLìzFOҤrG#~#fo#~#foxLyͽrìz6 #ýr~ڭj#~#fo~#foͬzZ>rV>=s#~#foLͬzíj2]Ϳy*x#V#NX!"]4sx­jű?s y<2*sF~ډsډs#~#foyGO #~#foxʍs}s#lsÍs!*s4 is2*sͬzͬz**s&ڝʛ~ͬzo&~ʭj#^#V++ͬzo&I*>"s!ss>s>mÛzmͳt͉|Z>$tmͼtu~t͠|V>$tmͳt}Z>Lmͼt~,"At#"~XtXt# Dtmíj"^t#ty͛zͳv*^#V#{t!i"i"i>2intN#F#*i~=ʮt}|ҮttÙtͼt|~t:int*i;~=mðj;~,t#"iɧt*i"i+V+^"imöjm~<ʭj3z~#~#foL6+͐u~͠|ͬzìz>Hu>Hu>Hu>Hu>Hu>^#V#!Zã>pu>pu>pu>pu>pu>{x!+>Ôu>Ôu>Ôu>Ôu>Ôu>{xʣu~#fo## ^#V#mQíu^#óu ^#V#mRu^#u^#V#mu^#vm|­jBK\vPYm|­jBK Mv o_0vmz­jzdv jv_pvo _ W}͛zͬzDM :]ʗv2]#êj:]ʪv2]#êjmuzv~##++,{>L+V+^+v+r+sv{mͳv~#^#VÛz!v>2v|:w+})N#6w~#fo :v)w!9"i!i4 ~G#íjm hw~ʭj#~#fon&ͬzmz„w}3z~ځws#wwmíjm|­j!9>͛z^#V#mͿwmRmʹw^#Væw^#Z)2mxmx!nQʛô!mܖ1y^#V#m;xm;xmzUx|Ux|Ry^#V#x^#V#sx͞GNʧxyʧx#~#fo~#fo°x#ʦx –x yʰxy<.ںx)ʺx)ͬzͬz|xxxxgxoxx*x"x*xxxoxxPx_!x4y5*x"x~#N#F#Oy)y Gyyx4y y+++6@#yw#xw+++6###!x~6`yuyyͿy*x#~#~ymäj!*x"x~#^#V#ڼyyGÂy|§yÂy++~_w#~Ww#Âyuy*xDM~#^#V#zyy+zz+{z##{z~#q#p_yyzxzDMy~#zyYP+++"x6@###{_zW+r+sɷhz*x|Fzmçjx^#V+"xw#s#r+++r+s##!oztz*|{z* |?Ҋz}|~# zyG3zxLuz,{v{*|* |Zzͯ{z,{v{###üz{| during G.C. &i{| &i| Internal Error - String Space Corrup#N#F*xyxq{*xyxq{++`i+V+^Zz##6+6+~6  >@++*x"xs#r+Ϳy*x#~_#~Wҟ{mójr+s##6"x###!x~#fo{Z³{<*x"x*x}o|g6@#s#r#6"x* |*|"x}w>#w##Z{++6+6xxr~w#=|!|~w#!|PP*"*"*PQ*) ^#V"*ͪ||*Z}/o|/g#"Z|ͭ|2||!\~wɯ2]ͪ|͂ͭ|*Zͭ|2ͪ|b>>R~~i#ò|iK|!`|>!`V2|# |!`ܖ!`ͷ}t>>|>|}+!m~}͹+6!\>%2U!i~ƚ!e~!`~_#~W#~OT!.QR}ɇ<o&ͭ|2*Z*\͂}"Z`i"\!Z^#V#N#F#!i~Rx{!^6Ɯwg>N û}:T|Gw#»}}}!`}ZͪVͪ}*Z||<ͪ*Z ~}!*}|͐| ~D}:\2\:]҇͑}:].~3~9~|/g}/oM~!:]V~͑}"Z>2T|J}ajL~ L}̈́|ͪ|r>2-|`hM~~&Ņ-ʤ~+ʤ~+͐ڋ.1eʶ~E~͐l~L~q~Q~:T|~>~~%>#O!Pd~DY͐ͻ͐_{_hx[|ͪ!Y}V~ͪ Yä~͐!Y}!}Y͐̉|Ġ|ͪ}&}=ͪ }}}{ 0_G!\ͪ':f(yG:^C:\G:^/GÇӀU6+}g6-[|#60:W|W:T|܀ۄ!1|F :W|_ ʠx* { Aq͐ED0ʠ,ʠ.À+60{̀+6${+p2W|!1|6 d}*V*X2/|͇E~(:0 #~>DG"V`i"X#~+o-F0OxGo#~-`xEdy >2/|t|\"V`i"Xt}#W}:/|ìҰ60̉}C+~0ʿ.ĉ}ͪ>"w#6+6-/</ :#p#w#6!1|#zrzۄ{}=̓'p#6!0|#:U|~ ,*,+@͐-+$0j#͐j++w`-j6%ʎ2|J+6%J}ͮ}}_xC/_yv̂x΂{_xꂒy3OGOC*U|=P͗|ѯͮ}7}yvOzWOx //>|l>|p#=c!Vq}ßD}>͑}t}?/}/{_#zW#yO++ҳ2}#t}p#ڥ>>/N#F#*Z/}o|g"Zp#=/w1_cƤ~@zZrN vH Tʚ;@B''d #~: ʐ ʐ ʐ0?<=:T|ҷ7-++͐MOօHօ+M~H#mêjM!}0?)))صoM!)'}M0? ?? ))))صo)a{ }ͪ:]:\>}:-|2.|2-|mêjmêjm}eb!' ~ʄ ʄ#~y`i`Z>O #~goPY!' ůw͔:hZʀ=z=¸ѯk<ʀ!% ^#Vr+sm}!"@} PY!`i>\!' ~ď͔ʹm}e!&+! ~+ngm}e! n&*i~_tDM'~̌4N#V pʀzw w+s#r#6#6DM:hʫ!" s#r#6! {zVw<<ʀ!! {w:O`!! ~!) ͌V~#!*i~ʢ( ~K+~#5O ~+~W]-7>*iT]% N#F+q#p###6 u͔:hZ>>w+w!(+7?*i' 6#67~}#^#fk_݉N#~:++@}y@}} #2~. 7#2)ͬzz }}> > 7m L:! ƒ~b#N#F++ͬz OˊIˊRb*@|ˊ!"@}_ފʹ{qz "i#> L66͔~*<ʀ?.Ͱ :j W:j:> ͰͰܭ~*6?# RO!!4r#4r#4y"‡ʀ><">>2i!ݏ"i:i<2i*i"B!Ռ"im"@͒*i|ӌ##nчŒ.̇*Bmm2D"Emm2D"Ee!)x)#y))҇ ҆#=n}_}la)ڃҞ#xƒ"! "!) "!}o|gP͎bk:P0DM**g"PY/}o|g*#"°0DM**g"PY2O*! ~#foPs#rV:Oc!c!& Ç~# xhDMЏwŏ! w!( V6 ʝzwΏwŏ! ~!! ^#V! s#rDMͽͷP}eb`i"i!"i-ͥm!>øjm|­j,'-:ie*i!i"i{3zf$%K!D*i6|}!"i>6>4>?>=>:>7>5>2>3>@>C>mo&øj!"i!n"oͤ:_nµ|?õpۑ:>\2ϐʴͰ+~Ͱ+ͰͰͭ!n2ۑOʻ:>\Ͱ2yz̳7 ʡ z 4ʵz̳ʵRʵͰ> Ͱ>ܐ\>#u6ͭ!nő x<>ʅyq#Ͱ > Ͱۑʒ :_ṋwmw>^Ͱ@Ͱͭ~ ԑ> ͰͰ#ői|* j #~+<=܋ be 4+~#<:=^ ii :jG7i*:iS<2i*i"!"i ii*i654> ~=i* j!j" j" j> > > i> i*î Gǒ’~#foĒ##ђ>ޒ~+~?~+#+ &))) ^#V#!Z)^#V#!V&)w#w#w#w##~ : :Ʌo$ɧGw#P{z}!*}|͐| ~D}:{}2~:~͑}:~.~3~9~|/g}/oM~!~:#~V~͑}"}>2T|J}ajL~ L}̈́|ͪ|>2-|`hM~~&-ʤ~+ʤ~+uڋ.1eʶ~E~ͥ~l~L~q~Q~:T|~>~~%>#O!Pd~DYͻ~6#h͗gʣ Oʨ!!\y# +“ ?͋ڝb͋Yn!`͗-:] :g/%?2U:V͌ x/F+N+=«!`ÿ!V>q#p#=•!V"Ͷͥ͑*͗:]!fN#Fͪq!GSQx Ì!\-j0 TeB׳]h!I.k ͋ڝbh͋Y!`q!]q#~++w+qƒ DNn"~`35zr1{r1h!I͗ yO2f͗ :]n/ɘq!^6Ɯg>N|ԇ>ØakڝLʛL Z bΜ*͛|6!LGΜƙXi>O!]~+>w QYu :]ҠhژΜʛƁʠ͕͹!&J\QY Ð|Yt&wz^Pc|u~r1Йq>2]!&Μog2W }}{(qnz ΜX&XΜ~#ڝ=xUW1DT :]㝐g/<͕ ͹gN!Z~_#~W#~Oҡ#4ʐ.dáG~_#~W#~O܁Dö >OWDɚu ȯGͪ"Cy2EFo͕͌!D*Z:\O]4ʐ.g.*C:EOz.g.*Z:\x<=E{_zWxG)yOHGáDU ͪy+F+F+Fw`h|ʢgy҆:ZO|g}oxG-|z}uElaOt!]~Gx›ƀw͹w+ɷx{!^6Ɯwgz >N|Գ{>2]/))Ҵ =¬!\~7w?##wy7O*Z*\"\"ZajSX*JS\E!]/GPejSXWWch|l{_zW}o|gX"8"6x!6~w#|uˆqJ!]qx!]F#~怩O 4Ôgo"Z"\s#r#q#p"Z`i"\*Z*\DM^#V#N#F#xy:]:\7|/G}/O!>5 47>{_zW}o|g=+|g}o]CZQP o-yOzW{_xG`Z*\DM^#V#N!^~/woG}_}W}OΜ||DM!>))Ҵ =¬!\~7w?##wy7O*Z*\"\"ZajSX*JS\E!]/7@?2C: * "   *" 2 2 |< "  * âC{K2* " * |< " " * |! 4 4 5wY2B!{DP 2R U >(_#U * ~?o !P #GC!BʻY|<1>DA2MSB!E :* > @(K 2 Ç 2 *  C " :b ʢ >(Kڢ <=ʢ (ͬ~ ̾(" ҊSe]" ;5$ܢ"ʇ: \*v " * ͶB" t##s#r## w# y}ͯ!6"*" 7C*"* "â *bk~####~ ҷ ڷù#s#rïC *DM~#+##~#foC`i~#fo??2i 2h ;#~=!@}O|G!""y O:h ~ʂ#Y:aJg>2h 2i U%~|*O~#Ym?>HjZEڗ;;>ʸ;>HOZ#þGO TOUBZ!AO ^#V#ZOd#<y(!!!Z.!>dG>Y2i Y%=+ZOiMk֢ύ>2i W„Y>5W>Y{~.ʧ:"0":i ~O.O>Y(ͬ}Y|Y%~.ͬ:g * |>}e. Y! d! ~Y#=%iʎ%à&O[H> K> Yi>: y +=2i ZY#ZEo:ҋ0o.o%~ Ҡ ʠ ʠ> :i <ʩ=m+~ ʬ ʬ ʬ#>d2 ͋9C" :g ͬ! (" !9T  +V+^##* C" B* *Cd Nz)~S ͒(q)ʹ(QZ~>r)ʹ(E(OdG+ $* "* 3àE3\B" !9" ~: #~#ʅ #^#V": >[@1>]@ցLO! N#F#~: ҆ ځ#:l `#2l f>R~#"j &o"n >2m !~##"j +fC͎*j <2m n G("j ! 0?<=:l ҫ ګ*n ¨###^#V,:m 2g *n " *p " !n (E AOGEAGx3Ø(:l  *j #*C > 2 ,$`i P "  "!>:yHG+ȸ#"<֌W-͋9C" :g G:g x=ͬ:g  H * #^#V*Cs* C{! C{>HͣFH(µC(zʢPY" : {:_ u ~GC+K x),  <2~(z˜<* * "~ #####u   =>C,* =( |" 2 " â ~,dC+͆(~ʕ *n €€l>2á Q+!B>ee,%;d)1F6 * 4TF* ::G<:?=:G<:e ?=!B&Gá(* TF~\:I:G<:\V:G:e \!B\/V tz|TF›:::o<ʛ& ,C)+(* TF~:::e /<!B{= @è2go"C#ʧQHLo͋9;*0KDF>-?Redo from start #~ "4N: !!#G* Q!a ;#YHL">2>2 F~,2 ÓC;&G: ʫ>?@> @0KDů2 6,+>2 ͉:~+[(# "4([]), ~,B>2 d: =Bd̨H+~,ʿ+N6,E* 2 QC,͋9~,c: 2 TF—Qd¢WG"ʌ: Wʉ:,+FO: y!...+ʽ,G+M: C#~# #^#V" cCC(+B͓2 " * ~" ڎ_4:g {[H !xVzʬQںzʺ! :g  N#F#N#F! N#F#N#FKG* W " Ð)͙(6Çz)uÇxdd!BdX* \FÇy2h :g g+Wx(zOxdz o! N#F* *(" " ͩ( *!:h og~#fox(2g 6" ;)!A͙(*ʹ(" " i*͙(*g' .EJ ]<=ʓ<"FO&i:* ,C(#r PQ͉:C)|)IoBI'UTC)}* k(͋9" d(~a{_&([OʭH¬#~[Eҗ:0ÞG7))))o~ +8  )))0O í)#~ց(7>OyC,;** u )4} )H>2  N#fi-++<(aZz)}/o|/g" :g q7xz)z ,{ʨ+F•{o|P {o|<«{o|2¸{/o|/}//o|//}o|g,::e 2 ͋9:g " " ͬB!9(:g * ~)C,* C,Á2N 2g !9(!9.,:g G:N Od}!P O:* * C)>" : OBO/2 OÐ9~ #~#`J x 2b b + C,u W : u 2_H 2u 2_H 2H /<z)zu 2 2 C,u Y +{>2e]!"N#F#xʇ TFQBN#F#Cچ " 1~ > @ !b !BÑ ~ͥB# b 2 e] #~ ! _!A!_.!!!/!: -!<-!> >2 { =! ! <~J!#~#X! k*l!~#>l!+!:G@ #T]~u!#y!~v!ʏ!y_¢!: >2 ÷![®!2 !: >2 !> XG{!~#_XG!!2 E0:?+͎ " o6 r6*n )1:l O " H*">&{:m ;"!;"#~ ̾(~#m":m A" ^".h"Dh"EA"A"{v"*j 5$Ҕ"T]C!E #G!* C¦"`i" "\]~"\]C,u "z)d: E()È% PX/#,#BK/#C,/#C,( z`iC[# !C^#Vzn#~#+K#͑#^#Vzʌ##s#r u# 2 *+#~##^#Vʚ#O: y$#¦#¦#3z##£#3 > %$B!$#G11+ã#Undefined line #3###N#F>!#*j +p+q+w: Ò#CBCACSCE: * * C ~0  2 <2 ~̓$#y$\Aʔ$z)ð$!$#G KD#~.~•$z)"j87Random number seed (-32768 to 32767)$*" +%%$%#~#Y #^#V" y~.%$$$$$%** "͋9+%c%C,+8%": 2 2 ! 6ͷ(È%ͷ(t(x: ʩ(Ң%/<͙(ͩ((gb&|! %B&#ʈ0.͉&#&G~_#~W#~ON&hcGy&JTeox%2 |&y%O&)zWyO%x\E#&! w%%x! 5&F#~怩Oé( 4Ç0~_#~W#~O! ~/woG}_}W}Oq&CZQd& oz…&y-O{&Ë&-yOzW{_xGÅ&$cCu͍M r5E(&1r'ʹ(>2 ͙(!&ͧ7͙(ͩ(!&ͧ7i'͙(T(È%E(.(y2<'"7'PX!%!%'! ~#Y'Wy='O|g}oxGQ'x Gz/'CZQO͙(!-ͦ(E(ʐ0.(4g04g0+~2'+~2'+~2'AOW_2'}o|gxG>?ұ'2'7y<=':'x'> $&{_zWyO)xG:'2'y”'! 5”'%>.! N#G.x'(}! Gx&(ƀwW'(w+E(/%g0ʹ(xڀ0G͈%! 4À0: : /<! Op#6%͆(d+ ! ~w͆(og)d E(* ||O(* * ͷ(" `i" ! ^#V#N#F# (:g Gw#(! ~7w?##wy7O! ((! ( d xE(!N(E(y! y )#x+y+z+{z|O(@)}P(! ( E(!N(E(O! y#)+f)I)N(d* )(! 6(&,)Ü)y%: 2 : B*: ½)))|/g}/o)! : )B*" >2g )aj)d* ʹ(6*x(! F#&* 6*|UY(d *!" " >>)d GOW_ʹ((gf*>b&|5&N&z< dE(*t(̀*k(dҦ* )! ~: ~B*6{y%! ~*O+~+¶*!*) *yʹ((+6+q*: O! >%-,2 Ñ,! ~5#*!x"+>);)+ ;=+|G+y4+|Gz)*͙(,N0|)+DM!>)ډ+)q+ ډ+=c+|+x+ʚ+*͙(*'x)*t(| ++DM!>+ +7>{_zW}o|g=+w+|G+|)Ooyg)* +|6*Y(ͨ+g{o)+! ~w! ~G+N (R,/<#Fwx+ B,F+N9(! G>w2 ! %-x,: 2 ,,4ʈ0Q-,>,! -G: º,! Vwz# Ÿ,x’,%! Y-,x,! w%: ,! ~++w! 4#,4ʈ0+60 ! ->!  2 -# -~/w! Oyw#-q<-NsY+1-'- W~w+F-?-! C-~w# [-E(: %'͝.qʙ-G,Q-x ‚-y-Ñ,! --Ñ-L} : A--! (d-: -2 !t(. ! (.&, ! (>.".&,! 3.=-..! 5%! >5=.>! N#F#=(.>! p+q+=9.: ʔ0: %'44ʈ0͝.!7 qA>,?t.>,: <=,! [-!0 Y-xb.! 5b.%y2 +6 ~q+¨.(+~ڈ0w&,4È0%3*j%>2 `h)~&i-.+.+/.ʆ/e /E5/l#/L#/q#/Q4/:g N/>N/~%ʓ/#ʤ/!ʥ/dN/De/ͮ/2S0e/_{_//i/k(d!W')d e/ܮ/.!W'!z)e/ͮ/e/) *d.(.=d^'- ̓$> ̓$!  101(d0! 1(* |* "1C !@ #G"G)Ͳ1F1Ͳ1416+͆(F16-k(#60: W:g 22һ1ͺ5! F : _ 1x*1{1Aqʟ1Eʟ1Dʟ101,1.¢1+60{ʫ1+6${+p2 ! 6 ͙(* * 2 f2E~2:101 #~1>DG1" `i" #~+N2-%20OxGN2#~ 2`xEC2y 1>2 S2|1;21" `i" ͩ(#W\4: 2Ë22ҏ2460̾("5+~0ʞ2.ľ(2d>"w#6+26-/</ 2:#p#w#6! #zQ334z4ͺ5{(=4b13p#6! #: ~ 3* 3+3-+$0I3#I3++w?3 3I36%3m36C){3)1+6%)d3E(\43_x44"5452_y/3/3{_x34434y5O4GO"53* =4P2*ѯ3E(7\4y/OzWO/4)4/< 5/>,K5>,p#=B5! ͦ(~5y%>B*ͩ(_6?5ʹ(/{_#zW#yO++Ғ5B&#ͩ(p#ڄ5>5e6>5N#F#* /}o|g5" p#=55w1_cƤ~@zZrN vH Tʚ;@B''d G" կʎ6))))Ÿ6y=ʟ6ʫ60:ڨ6 ʸ6ʊ6È6!t(͙(! 6ͦ(6)!r%>2 E(x+76ʗ0%yʹ(7: 77͍*)|" " ܻ6t(ͽ&'8;': `7hr7͙(͍*Ɓc7ͅ%!{7ͧ7J'͙(: o7%~0é(|Yt&wz^Pc|u~r1͙(+ʹ('͙(~#ͦ(='ͷ(͈%ð7RO!&ͦ(76*E(!H8>8!i8ͦ(!H8Ȇw#O ͷ(':G8<2G8!i8O |%ʹ({YOO6+F6!F84~֫58w %!i8(w+w+w85Jʙ9v" GSљ e͘w>ROhFhiuh!8|%: w: 82 t("~'͙(͍*ͅ%)8͈%͈%E(t(͈%t(: 82 !9͘7: 2 "~Ie&X4#]I͙(8͙(ͩ(y8g'E(6t(: N9QYi'!%!X9͘7!8 J;xn{/|t1}=Z}~L~l+C,}92f NE G2#~.9ʵ9:ү90ҵ9E9G#~:90Ҽ9EҼ9.ʼ9x' 2~&9 :%$!#y_! V+z2g : =ʒ;):~(;3;2 : 2 }:*  " c:o[::g [::&* C;^#~#¸;:g ¸;~;#^^#V#˜;:f DMW']< #:¹;#ʾ;+͸<þ;:g w#_ʖ!@1> @!b  ~#=GA"=[0A= A=_zW"=! =L=ʺ>O>>ʨ=1g= !>=#ʻ=>>= >>(9>ʵ=6>>@!B<~ͥB#¨=!>7A_>~=ͥB܁>=#~== !B<~>\ͥB~>ͥB́>=>\@~A +> +>+> +>>@ >wͥB# >6Hͨ=Aq>s> >s> ʑ>ʑ> ʑ> >>_‘>>_ʙ>ͥB+>> ~7W'#~+w#Ã>yڡ>>@>> o&DM#͹BwͥB#Þ>x+>ͥB>x+~ͥB> !Bz\@@_W@W~#!ʎ@#ʡ?&ʉ@g@+>H?+~#.?_}@\&???$ʚ?*??x#ڒ?~$> ž?#W?~#.?#ʡ?,?z@Wá?~#>.??# ?~##??T]^###xG#z+@x@~-@@>Wr@Cxz*1#G+7N@2 ;K@, ~#_~#foxE?m@@@?!BͫH@~#@_@Ò@>@r@;** AxxOI&G* 5@G> 5@@@z>+@TFfV:\A@:@27A A> @:A 3A6A:<:-A!MA6A<2Oɯ2:> 7A> 7A2:XG{A:e ʍA=2e >îA A> @:e €A ڮA:G:e ʥA!BʮA<2e OTFAWMS: 0P:A!7C!E #G:AD/2AD:e !B6!a > @> @TF3B:?B2ɯ2e :=@FBAA2CDD͙BƒBʌBAͷF_H!D " >2g :2@ > @+B> BC~ +üB*v  >ƕo>gB9*++"  BgGBB* C:G!^#V#C T*}D2 2 2 w#w#" *+" : XC2 2 ! 6#QC7!i8(!F8w#w#w2 og" " *v : ƒC" C* " " : T*++" ##!z "x r%DAgo" 2 "N " " 2 * |}~C##~:  *C(`i+" < D T" !z "x !*}<-D" * " 2DAB!J b Æ >OD22>^@@@!B* | * "u <2>2 ͋9! (* dC,͋9Gd * CD( (>2 ͋9D2 `i D * CD `i" ~,D~A[?;C E, E+ EC, E*,4EyE+ʅEC,ʅEyE+ !NC҂E͗EڂE*  C҂E"v " E"zB**v {_zWME}_|W2 " ċ9" P ^#V#* C ~#~#Eͦ(: E! ͦ(|%(ͷ()/F####N#F#^#Vi`: F* F1+:g  r+s^#V#3)ͷ(AF"i`Ü" * ~, ͨE*|ͥH~#N#FͬHW^#N#F{zد< #rF?P(o6ÙFr6ÙF)1FͨHH~#*x " >2g ( C"x ~ #FͨH͹( @ +B-G* * /O #CZG" # >G*v " !* !z *x CxGH!L " * " * * CʹG~###͚<²GH_ÕG* ^#Vz* G" ##^#V#" ÕG* C7H~###͚ {͹FGH* w#?IHIO>~XIxIx C,;*C,* C)ͥHW'ͫHG=O>x~#F#fh GN#^#VUJ LJ#7Jѯx<#4JIJC(͋9;*#^#V* CڍJ*CҍJͣF(C,u ~JͥHG!W'y~?@> @(KͿAzK68Kp22 ͿAoK!B!=:>\2UK'K@+iK~@K+@K@!B!b 2OAK:ʐK>\@2yKCD7 ;L K ´K(KKCD(KK0K@> @>bKK>#iKK6!B!b K KxL*|>L!b ("_yq#@ K2e > @ͿA,L KzK: Bw!a >2 ;2 " $L33oL " ** áL LL" *" ##^#V#~#fo"͆(ʵLA3à* "à!9~#L L~#foC L >2 ͋9d(""  B!9 +" _MC(͋9s#r#~,=M #MC)" >!=_M=_M=_M!9DM!jM* * * à2 2 ~‡M2 #+͔R!" +NC,,ʸM"" +NC,MCACLCLNOC, 2 5$`i" NT]" CNO**+#~#N#^#V"N:N2 ͉:ʢNxG͒;>2 hN~(nNþN~(͉:zNxGN::g W):zBK!N N 2 ~(nN ͖N+"N(NC)"NC,BN"* * C#ON##~w#͚< NO* " N* C Oy_xW `i" * CNO##~w#͚2 : mS:2ùR2 2 * DM* " * #* " CNP `i" * *+zʠ `ià Q+PdP)1F* #^#V ªPr+s+5&G+P;ʿPC,+>,@ÇP>"@&G>"@íP*|Q~Q\}o|gQ> @+|P!B#*QѻQ  C,PY"+#x _:ڦ !N#F :Q!)^Q! >>>ͬ͹F* (H>>>ͥH<2g #~#fo(d ,»QZûQ Q͋9;*W_Wڬ Q¾Q"QG{,xQPXW1R!b Oz"yR QR RO{,yĊRW1R R{ +R,> +R+R1R1R͊RWQ"hV* *CMS~#hVSV:SS=S~,~#u SůSѯ*Qʦ   ! ~#fo" !"o]| G~,r CACS͋9;*O*o] "o]* Cڸ q#s#r9T7͋9;*ͥHF~O#^#VT*CT* CTY* * CUy  U!Ux͹FFTC$C(u ~,KU*Qʠ "QC)}͹FʅU͙BlUA~Uw# ^UF* DWڬ qU6Qʦ ʠ !' ~U U#~¸U`i}WÙU>O #~(PY!' ůwͱW:!͞Zʻ =ʝ =UѯÚ <ʻ !% ^#Vr+s9Q6V PY,V!#V`i>yV!' ~UͱW)9V6Qʦ !&QV! ~+n6Qʦ ! ~*~Ee\DM'~U4N#V pʝVzw w+s#r#6#6DM:V!" s#r#6 W! {zVWw<W<ʻ !! {w:W}W!! ~!) ;WU;W~#>W*~ʖ\( ~hW+~#5O ~+~tWzWJW7>*T]% N#F+q#p###6 ’WͱW: ͞Z>ªW>w+w!(HW7?*' 6#67ͥH~ʲ #^#fk_XN#~:X++@bXy@bXbX #RX~.0X>X7X#X2 z bXbX> >X7X> WX7Xò W<ʣ ! w#…XCACSW:!<¾ ͥH~ʠ #N#F OXIXR  C,#u C,{ʦ _9Q¯ WzZ" 1Y{1Y!~ 1Y6B#6A#6Sz"# w# >YwwͱWoY<ʻ ÅY<…Y£ cY!%w#w#w#w~ʨYCzW* ) p# ®YC T T _W<Yʣ Z!6# ͖ZW2 !͒Z!͒Zʣ O!  ~#@ygZ~ dZ>.@ QZ:e W:ڀZ> @@!BAZ~*6?# –ZO!!4¶Z#4¶Z#4y"Zʻ ><+Z* C! s#r#wZ2u]*Q  ! ^#V~,+ zʵ +s#r! w#w! ~#fo!CT[Ò[BK>!)g[)#h[))v[ u[#=][}_}la)ҍ[#x"o]! "q]!) "s]!}o|gCڼ[bk:u]\C[ \DM*s]*q]X\"q]PY\*o]#"o]}o|g|Ÿ[ \DM*q]*s]X\"q]PY[2*o]! ~#foCs#rG\:T\!T\!& äV~# xY\DM\ʓ\͹\! w!( V6 ʎ\zwø \ʓ\͹\! ~!ô\! ^#V! s#rDMͱ\ͫ\C" ͒#\>;S"]C ** C!X9}o|g!9}o|g ] \ \ ** C!9}o|g!X9}o|g S] )] )]*|<:  C*+6* ~šRÇ !?`2 "!"6:͗C2e " * ^#V"zB"UB"##^#V"A##^#V"A##^#V"=A 2!]!!"" !"22d 2 2 2!"!" !z "x ! "L *"v >2!^" :^^<2^!~" ^F#~+w##D^+6" !^/x^+6"" #/x^i^^6ZS^Mʐ^F C:dʯ^z{2ô^"v +^C/}^C:d" ô^+*v +"v +:!]"2<s#r# *  DM=^#"" {ozgB|g}o_|0_!{ozgB"v "" " *B}o|g++!_#G1!_#G!#G" !B! v] Owned by Microsoft Bytes freeBASIC-80 Rev. 5.21 [CP/M Version] Copyright 1977-1981 (C) by Microsoft Created: 28-Jul-81 2!"!" !z "x ! "L *"v >2!^" :^^<2^!~" ^F#~+w##D^+6" !^/x^+6"" #/x^i^^6ZS^Mʐ^F C:dʯ^z{2ô^"v +^C/}^C:d" ô^+*v +"v +:!]"2<s#r# * G:%:,}O!Uej"&- V.& 3(  (&b&K&  M,*',Q1i05O.N.43g410q1V5U54X1g$$$ 9:8DE)Fv7D#FFF< &f #"$#$,(J$!"` :=:i::222_--.222;LMx  C\o(267NBTSUTϫLOSONԚLEAҒINSNDBV+V,V-O HRATI͆EFSTҭEFINԮEFSNǯEFDB̰EƘELETŪNāLSŢRASŦDIԧRROҨRRX O/QO҂IELILERIOTωO TωOSUEEXNPUԅƋNSTNNMILEԈINűOASEPRINԞLISԟPOISԓO O0EEFTO1ERGOKI2KS3KD4IDEXԃUL̖AMEהOUԝΕPEοCTUOKřRINԑOEEEAćUΊESTORŌETURΎE͏ESUMũSEIGHTNENUͬESETOАWAХAVPCTEGQI TRTRINGPACEYSTEͽROΣROFƤABHEA SINSAARPTIDTȡAIԗO۾yy||PF<2(z{i:::=:f<_<==:z6w6789q;e;;9NEXT without FORSyntax errorRETURN without GOSUBOut of DATAIllegal function callOverflowOut of memoryUndefined line numberSubscript out of rangeRedimensioned arrayDivision by zeroIllegal directType mismatchOut of string spaceString too longString formula too complexCan't continueUndefined user functionNo RESUMERESUME without errorUnprintable errorMissing operandLine buffer overflowFIELD overflowInternal errorBad file numberFile not foundBad file modeFile already open?Disk I/O errorFile already exists??Disk fullInput past endBad record numberBad file nameMode-mismatchDirect statement in fileToo many filesH8jII, in Ok Break!9~#N#F#i`zʳ ʹ Ý ʹ~ + *,  >>ƕo> g9*+++" $  0 *-|< :! $ à* "-  *-" " 6 * À {K2#* " * |/_#‰ * |"|2*X4! :#*!"-:  * ? >* >  2 â *  ʹ " +ڽ ͫ<=ʽ ~ K9ͦ " ҕ4ͫ" G ʯW-(ʆ *( ͼ "( t##s#r# w# y| ͮ !6"9*5"" A *7"9*" "5ý */bk~####~ Ҷ ڶ ͬͫø #s#rî   ͺ */DM~#+##~#foʹ`i~#fo?? :YG!9^#V# 5*/ 2 2 w#w#"( */+" !0 6#M 2! og" "& * " U*( "* ", 5*+++" ##! " ͆go2 * >?> 2 2 ;~"n Dw: ~D?>D8͗ڇ!AO ^#V#͗Oʢ#  +>͌2 ͌ó ! +``>2 ~t͊%͊>͌p~.ʗ:0: ~D.D>͌}͌|͌ó ~i>: *X |>}e. ҷü͌!X !T ~͌#=ó 7ʫý&DͫH> 8> ͌õ#͌:VJ\>2 2 U³ ~|wD~#͌b!@}O|G!>: y$ ~a{_w+=2 g~ ҽ ʽ ʽ> : \2)>+#~+!2)O:)J>\2)yʊ7  ʊ nÊ@#_ x<>ʕyq# 2 > oʥ 4|}~#ʫ *5|.:&) > :% :%<2%Oɯ2&:%> > 2%:*±" H> : 8 \:'G: <2 O*5|ʠz/7X4:1!FA ! |":*/2*>d2 ͙  "  *-ͺʈ:҈:̀:~d&94=:A9QZ~>5́=:A98OG* 3{" !9" ~:ʋ #~# #^#V"-:R ʊ>[?>]ͫFցL%O! N#F#~: ʫ : * ì#2 ~#o&" >2 <2  GZ9" !$  ҫ0?<=: F F* @###^#VC<! : 2 {9*/j `iү+". oo<Ó5" ! " !*-}<ʴ"$ * "& 2*! – á >2&2*>^@*& |$ *$ "-͆&:'G{<2">2R 1!J V9** ͺ,1ˆ:** ʹV9J V9>2 12 `i *, ʹe `i", ~,ͫM AOGͫ¯ͫAGͫx3À: * *-ʹ# ү > 2 N-`i$ ͙ " $ "-!F>:yHG+ͫȸ#"<֌W1ͺ" ̀ͧ!͈9P*X #^#V*/ʹD*+ʹL*( ʹL>#"#V9…ͫͺzs PYү" :! :#_- ͆&~Gʔͺ+K xʓ,Õ! " <2#~z€<ͫ* * "-~#####͆&$  ͺ,*  |" 2 " ý ̀~,̫4ͺ+9Lͫ} }ÒͫNN<>2&o\2+ͫʆa(BB,;̀?5"*5|*X :&ʿ:%:'G: "> "o: 6!> > *5|:"=2 *5|% ~9:&+:%p3:(G: 9/t̓&ͺ)+o*5|% ~o:&l:%o: / xͫv2&go"5ͺ#21̈́:ڝ8"?REDO FROM START : !|"* Z2!#">2*6"ͺ;"͙ ڝ#~+6,!*. 2 -ͺ,1~,U: >?͙ ڝ#~+*5|2‚ͫWG"u:,+9"!ͫxi>b>+ͫʝ,+ͫ): k*5|!|"Æ?Extra ignored #~#$ #^#V" ͫU1" ͙  " ~#~#.39n6M9D9͓9W####N#F#^#Vi`q;: 7r+s^#V#9D9i"-i`B" * ~,Fͫͺ(+ "" *" ~ڲҲW " ͫÖzG~" _: y#!MxVz-Q;z;!X : === !N#F#N#F#!T N#F#N#F*!KGd* Ã=:&9D&:&xdd!*X w&y2 xʗ: ʿWxzʈ:!w N#F*X i:́9"V "T 69i:!c: O ~#fó92 ʥ"X ê=:!mð&9]:A9"Z "X ]:&9]:8ͫ$ i> &<.=Ҷʨ"6"ʱ&Gͫ:#i Xͫ* C<‡ͫͺ(#t̓&͚2w1ͺ)|%:o $$ 6 |ͺ)}̓*" 81"X {9&ͫOH#:)0)G)7))))o7+ͫ)8 7)))0O %:#~ցOͫyY|ͺ,̈́:*X ͆&n͠} j=: N#fi#~#N#F#^#N#F{zد< #ʌ?8< 9Z̓:}/o|/g"X Ï: 7:zM<{;k F{o|P{o|< {o|2{/o|/}//o|//+ͫͺ,#2 F OͫJWOͫKK~%$!#xA_!0 V+z2 ͫ: =d~(1312 *( ** ʹo>&ã|wʹʹO*, ͼ ", `i"* +6ʹs#s#rW_2[ go"X /! "X * W*, ʹ: ʦ#‡~#ˆ~>##^#V#j:  DM7  $ w#_q#p#O ##" q#: y q#p#E;=BKڡ ", +6ʹW* ^) ++s#r#8 GO~#^#V#ʹҡE;=DM : DM)0 )5 )5 *" *, !9W #Ϳ"*+* }o|gC<:%i : og%:͎ ͠N#F!7: #!X ͫҦ ڦ ͫ: O! ͎ ͺg&s#rʭ !!s#r~(ͫ1~)ͺ, !: "" ~#fo ~(`!ͫ" !ͺ, >2 17҈:["ѯ~) !*" ͺ(* 1 ~)W!ͺ,ͺ,>!ͫͺ)>ͺ̀+ͫ ʶ!!Қ!p+qv!+p+qv!+p+q+p+qv! ["!YO q* *X ʹ!"u!! #~" w#q#pv!*-#| $ ͺ>2 G6QD "TD "?5"#$~#͕"N#F*"o͸#͕"! w#s#r+"P#~ K"K"<""̫#y*" >* "X >2 V9 ʹ" ~$ #5"#F9  Æ"*+* /O #ʹڳ"" #$ "* " !*+! * ʹ"0#*( ** ʹ#~###"1#_"*, ʹU#~#D9 #" N #* ʹ#"#ů#^#V#DM* ʹ`iʹ`i}+F+N+n& PY+DM* Ϳ q#pi`+"*X ̈́:~*X $ '"##* Ͱ#Ͱ#!W"~#N#Fo,- ù#̈́:*X #PYN* ʹ#G " * +F+N+ʹ" i #W~i ##^#V>'"͉&* sW"ͫͺ(͆&ͺ,̀ͺ)C$͉&F$$O$͉&> {'"_$* w#^$$$O>~w$x͕"#F#fh DM*"o͸##W"$k$~$ &o$=O~GC#i _#~#foFr~b>pͺ)Cͫ|> %͉&ͺ,̀̈́:ͺ,*X ̀ͺ)#7i #G=O>~x~#F#fh GN#^#Vt% k%#V%ѯx<#h%S%~ #~ #ͺ(1̈́:#^#V*+ʹڰ%"V9ͺ,͆&~ &ͺ̀#G!7y~<%yH #^#fk GN#~#foyw# %)&ͺ,͆&ͺ)͉&2$&i s&s&+ͫB&ͺ,͆&C&͆&2'V&/<2(ͫ̀:z͆&2D&2,&ͺ,Æ&ͫ̀j&+ͫ{>2& !"-N#F#xʢ *5|pN#F#ʹڡ " ?> &!&ß&~+#&&#~ ' c'&<~'#~#'' ̶:!:G@ #T]~5'#9'~6'y[R'~#_!+P'&+ͫ&' QD TD* ?: O ʕ' H '>&{: ڱ'!ʱ'#~ K9~#': ڷ' '.'D'E·'÷'{'* & W- (T]ʹ! |"! *( ʹ(`i"( E(~i ̀E(ͺ,͆&::[ :Z z6́̈́:ͺ;*X {(: ʅ(2 F#N#fiï(X~#\) ¥( ”(C>\*_W*W~#!)#))+>ʲ(+~#. )\ʐ(©($(*©(x#(~$> (#WV)~#.+)#),7)z@W)~#>.©(# V)~##+)T)T]^###xG#z+v)xv)~-q)v)>W)̀Cxz?|"+ͫ7ʮ)2 ;ʫ), ͫ~#N#fi_x¯()*r(#Æ>*)̀̈́:*X An$"*X G> ʕ) *z>+2#* <0*" ү`i##N#F#&|<>!?> ! ~#`*Gok*0ڇ* ҇*_zWk*!i*’*O++*1ڨ* ! ,#+#*c+-+J++(^+*[+>1*~+#*!D+7o_D+~!++ܡ++#~++&H*~>\+~D++͡+5+>\~ow+#J+6H*oʑ+ +ʓ+ ʱ+ʱ+ ʱ+ c+_±+>_ʹ+++c+ ~77#~+w#ã+y+>c+ o&DM#Ϳ w+#c+x+~++&z z G-!#-|"??+,Undefined line ,###N#F>!-* +p+q+w: ó,̀2ʡ1!$ ~}-#N>O #~ 9PY!$ 6i/ʞ1«-ѯÛ1<ʼ1!" ^#Vr+s̓2- PY-!-`i>".!$ ~Ć-i/&-̀2ʧ1!# ~+nk ̀2ʧ1! ~i *5~ʀDM$~̃-4~O#V pG.zw w23t2¡1!" ^#V~,+ͫ {ʶ1+s#r#6#6DM! {zV.w<.<ʼ1!! {w:3.9/!! ~!& .̓-.Æ~# .*5% ~#/+~#5O ~+~0/6/ /7>*5T]" N#F+q#p###6 N/i/=c/>w+w!% /7?*5$ 6#67̀#~ʳ1#^#fk_ڸ/N#~:ʼ/++@ʳ1y@ڳ1ҳ1l #0~.//7/#/z ʳ1ڳ1> //>  0/͕/l<ʤ1!\l w# 40ͺAͺS͕/:l!\l<¿1\̀#~ʡ1#N#F Oʓ0Iʓ0R¡1ͺ,#̫͆&ͺ,{ʧ1_̓2°1z͕/" 0{0!u~ 06B#6A#6S"5#l w# 0i/~ 1<ʼ1!17@?2C:$ 1!l6# R2ĕ/!mN2!uN2lʤ1O!  ~#y#2~ 2>. 2: W:'<2> l1~*6?# R2#t2ѻ¡1ͺ,`i"5+ͫ#̫͉̀&_:Yڧ1!9N#F ̈́2!& >>>ͧ!'"* ̈́9$>>>#<#N#fi2 {9x ,2Z2Z21̈́:W_z/ڭ1 33"%3G{,x%3PXz/s3!Oz"y^3 ʓ3 ^3O{,y3z/s3 ^3{ m3,> m3m3s3s33z/*3"~3 ¦3z/ڦ3 ~3,ʦ3 ž3z/ڦ3 ʦ3*5% 46!{ ʹ38"ͫi>ɷw#ç3ë03:Y22+ͫ3ͺ,ͺR 2Y21!6"9. :22Y*7"9"5z/<…4*/*+ ʹa4 /w#4ͪ ##"( !Y~226A :22Y:1ʢ F͆ͼ-Õ . 3+ͫz4X4 21z/<ʡ1*5% ~ʽ 4ý *5|B$ Ë3+ͫʻ4ͺ,ͺAÚ&ͳ,>.*( */ʹX4~#.4-:Y44=4~,ͫ͆&4ů4ѯt2ʧ1¡1& G~,̓&ͺAͺS1̈́:Oڹ1ҹ1q#s#r 571̈́:ͺ̀#F~O#^#V5*/ʹҶ5*( ʹڶ5Y*+* ʹ5y͕"##s#r#^#V#^#Vyx5yGyO55~#55> 56x'"W"ß5ͫͺ$ͺ(͆&~,06ͫt2¡1l2ͺ)}'"b6͡]6w# C6͆W"Éz/ڭ1P6!CD9z6D99x:[ 69Ҕ6/<&969c9gA7!X 6!77#47.W77G~_#~W#~O-7hcGy6JTeox62[ )zWyO6x\E7![ w6x![ 7F#~怩O69 4$ ~_#~W#~O!\ ~/woG}_}W}OP7CZQC7 o-yOzW{_xGS7V"vE88![ ~5pz68!e7t6!i7WEz6͸?1r8.͐8y27"7PX!6!7!X ~#8Wy7O|g}oxGz7CZQO&9!=398 .͐844+~2B8+~2>8+~2:8AOW_2E8}o|gxG>?S82E87y<=7{_zWyO)xG:E82E8y68![ 5687>.!d N#G.xʴ8}![ Gx8ƀw7c9w+8/67A9x7Gz6![ 47:[ :Z /<![ Op#6698<ʈ:!Z ~w9og%:ʈ:8*X ||8*X *Z D9"X `i"Z !X ^#V#N#F#X Z9: Gw#Z9!Z ~7w?##wy7O!^ U9Ç9!^ V9X T x8!88y!Z yͭ9#x+y+z+{z|88}8!^ V9e 8!88O!Z y#ª9+998*X ʈ:G:!7:[ .:͍:"X >2 ͓9aj$:Z:ʈ:A9:xc9!W F7*X :|U8ʈ:Z:!"T "V >>*: $ GOW_A9c9g:>A7|7-7z< 8:9:8:ʈ::![ ~:X ~͍:6{y6![ ~:;O+~+;!%:yA9c9+6:;!Z >_==2S )ڡ)^; ڡ=P;|G.);)ұ; ;=£;|;x*<;]:&9]:ô7x%:]:9| "<. < <7>{_zW}o|g=<÷;|G)<|%:Ooyg%:*X .<|:8;g{o(:*6=!\ L=G:Z !^ T 2C=# B=~/w!S Oyw#V=qv=NsY+k=a= W~w+€=y=!Z }=~w# •=8͆85>q=G4=͋=x µ=¬=! qA>+=? >>+=:Z <==!T ͕=! ͓=x=![ 5=7y2d + ~q+@>́9+~7wf<476|:`h%:~&-ʆ>+ʆ>+ͫP?.?E£>ͫL>·>~% ?#?!?D>?!>ͫ-++ͫ?>_{-?=?>8!7.: >?Æ> #>??=:i:8J>=8=yZ:7ҥ?t$͓9?ͻ8͸?}?s:J>́98s:f<}?&98z6{ ?0_2>! |"%:p@ @{"p@?6+9 @6-8#60: W: @@y@͜C!g F : _ =@x*=@Aqͫ]@E]@D]@0=@,=@.`@+60{i@+6${+p2 !g 6 WRB@Ҕ@B60K9C+~0ʣ@.K9@>"w#6+@6-/</ @:#p#w#6!g #zVAABzB͜C{̬8=B&@ Ap#6!f #:" ~ A*A+$Aͫ-+$0NA#ͫNA++wDAANA6%ArAC9A?+6%͓9iA8RBA_xBBCBB@_y;?A=?A{_xABBAByBOBGOCA*" =BPAZ:ѯB87RBy;?OzWO=? B.B/< B/>9=.C>9=p#=%C!T 39`Ck6<͍:69AD?BA9/{_#zW#yO++tC!7#69p#fC>âCGD>BN#F#*X /}o|gҵC"X p#=¢CBw1_cƤ~@zZrN vH Tʚ;@B''d GE(f կpD))))Dy=ʁDʍD0:ڊD ʚDlDjD!9&9!C39ñD=:8xDD 6yA9D:͓9|"Z "X ܝD9v7ʹ7&98;ʹ7:[ Ү8:ƀڮ8!e7n6ͮ7w69!6EfEJô7@.tpO.wnz*|P~&9;A9ʹ7&9~#39=ʹ7D9z6oE8!EE!F39!EȆw#O D9ʹ7:E<2E!FO n6A9{YOO6+F6!E4~֫Ew 6!FM9w+w+wE5Jʙ9v" GSљ e͘w>ROhFhiuh!mFn6&9I698&9:w6!qFt687YFk689!qFn69!uFWEId&X4#]I&9)F&969#F88D9:[ ڼFQY8!t6!FWE!mF J;xn{/|t1}=Z}~L~l */+6*Z~3â !I"+" * ^#V"t"H##^#V"##^#V"h##^#V" !"-2*2 2##"%! " *" !~>2Y"ZGF#~+w##lG+p"Z!ͫG/ʟG+6""Z#/ʟGͫGGpͫMʮGF ͫͺ:Gz{2YG" +ͫGͺ/ãG* +"  +:Y!F"792Y<s#r# =H#"/Iʹ "+" {ozg ?!pH|"!|"" ! "F Owned by Microsoft Memory size Bytes free BASIC Rev. 4.51 [CP/M Version] Copyright 1977 (C) by Microsoft 0 REM R O C K E T L A N D E R 2 PRINT CHR$(26):PRINT:PRINT:PRINT:PRINT:PRINT 5 OUT 2,26 10 P=1 11 REM ....P IS THE INPUT PORT NUMBER FOR YOUR KEYBOARD...... 15 REM 20 REM 70 PRINT "LUNER LANDING SIMULATIONS" 80 PRINT "----- ------- -----------" 100 PRINT:INPUT "Do you want instructions (Y or N)";ANS$ 110 IF ANS$="N"THEN 390 120 IF ANS$="n"THEN 390 160 PRINT 200 PRINT"You are landing on the moon and have taken over manual" 210 PRINT"control 500 feet above a good landing spot. You have a" 220 PRINT"downward velocity of 50 FT/SEC. 120 units of fuel remain." 225 PRINT 230 PRINT"Here are the rules that govern your space vehicle:" 240 PRINT"(1) After each second, the height, velocity and remaining" 250 PRINT" fuel will be reported." 260 PRINT"(2) After the report, a `?' will be typed. Enter the" 270 PRINT" number of units of fuel you wish to burn during the " 280 PRINT" next second. Each unit of fuel will slow your descent." 290 PRINT"(3) The maximum thrust of your engine is 30 FT/SEC/SEC or" 300 PRINT" 30 units of fuel per second" 310 PRINT"(4) When you contact the lunar surface, your engine will" 320 PRINT" automatically shut off and you will be given a" 330 PRINT" report of your landing speed and remaining fuel" 340 PRINT"(5) If you run out of fuel, the `?' will no longer appear," 350 PRINT" but your second by second report will continue until" 360 PRINT" you contact the lunar surface.":PRINT 365 PRINT:INPUT "HIT TO CONTINUE...";W9 390 PRINT CHR$(26):PRINT:PRINT"BEGINING LANDING PROCEEDURE.........":PRINT 410 PRINT"G O O D L U C K ! ! ! " 420 PRINT:PRINT 440 PRINT"SEC FEET SPEED FUEL PLOT OF DISTANCE" 450 PRINT 455 T=0:H=500:V=50:F=120 490 PRINT T;TAB(4);H;TAB(12);V;TAB(20);F;TAB(29);"I";TAB(H/12+29);"*" 500 INPUT B 510 IF B<0 THEN 650 520 IF B>30 THEN B=30 530 IF B>F THEN B=F 540 V1=V-B+5 560 F=F-B 570 H=H-.5*(V+V1) 580 IF H<=0 THEN 670 590 T=T+1 600 V=V1 610 IF F>0 THEN 490 615 IF B=0 THEN 640 620 PRINT:PRINT"* * * OUT OF FUEL * * *" 640 PRINT T;TAB(4);H;TAB(12);V;TAB(20);F;TAB(29);"I";TAB(H/12+29);"*" 650 B=0 660 GOTO 540 670 PRINT:PRINT"* * * * CONTACT * * * *" 680 H=H+.5*(V+V1) 690 IF B=5 THEN 720 700 D=(-V+SQR(V*V+H*(10-2*B)))/(5-B) 710 GOTO 730 720 D=H/V 730 V1=V+(5-B)*D 760 PRINT" Touchdown at";T+D;"seconds." 770 PRINT" Landing velocity =";V1;"FT/SEC" 780 PRINT F;"units of fuel remaining." 790 IF V1<>0 THEN 810 800 PRINT:PRINT"Congratulations!!! A perfect landing!" 805 PRINT"Your license will be renewed ....... later." 808 GOTO 845 810 IF ABS(V1)<2 THEN 840 820 PRINT:PRINT" * * * Sorry, but you blew it Kiddo!!!!" 825 PRINT" This was our only chance to make contact with Extraterrestrial" 827 PRINT" beings. Inappropriate condolences might be sent to your" 830 PRINT" next of kin." 835 GOTO 845 840 PRINT:PRINT"Well .... that was OK. But not too spectacular..." 845 PRINT:PRINT 850 INPUT "Another mission, anyone";ANS$ 855 IF ANS$="Y" THEN 390 860 IF ANS$="y" THEN 390 880 PRINT:PRINT "Control out. ":PRINT 999 SYSTEM u blew it Kiddo!!!!" 825 PRINT" This was our only chance to make contact with Extraterrestrial" 827 PRINT" beings. Inappropriate condolences might be sent to your" 830 PRINT" next of kin." 835 GOTO 845 840 PRINT:PRINT"Well .... that was OK. But not too spectacular..." 845 PRINT:PRINT 850 INPUT "Another mission, anyone";ANS$ 855 IF ANS$="Y" THEN 390 860 IF ANS$="y" THEN 310 'EXPANDED APRIL 1977 BY W.A. BURTON 20 'PIRATED JAN. 1978 BY ZOSO 30 DIM G(8,8),S(8,8),K(3,3) 40 PRINT CHR$(26) 50 GOSUB 5470 60 PRINT 70 INPUT "What is your security clearance number (1 TO 1000)";T9 80 E8=T9 90 IF T9<1 OR T9>1000 THEN PRINT AR$;"INVALID!! REENTER!!":GOTO 70 100 FOR A=1 TO T9/2 110 R9=RND(1):R9=RND(2) 120 NEXT 130 CLEAR:PRINT CHR$(26):INPUT" Enter rank (1=Low,12=High)";R9 140 IF (R9<1 OR R9>12) THEN GOTO 130:RR=R9 150 X4=R9:R9=R9+1E-03:W1=W1+1E-03 160 PRINT CHR$(26) 170 PRINT "Command order : STAND BY !" 180 PRINT "You are presently being assigned to a mission..." 190 PRINT " with a failure factor of"; (RR*20) 200 PRINT" Good-bye, Captain..." 210 CX=.017453:AR$=" ---> " 220 XA=INT(X4*50):AC=(1/(X4+.1)) 230 IF X4>=9 THEN 3800 240 E=3000-XA+100:P=10:S9=200 250 DEF FND(D)=SQR((K(I,1)-S1)^2+(K(I,2)-S2)^2) 260 Q1=INT(RND(1)*8+1):Q2=INT(RND(1)*8+1) 270 S1=INT(RND(1)*8+1):S2=INT(RND(1)*8+1) 280 DATA Warp Engines,Short Range Sensors,Long Range Sensors 290 DATA Phasers, Photon Torpedoes,Shield Control 300 DATA Damage Control, Computer,Damage Repair,Communications 310 FOR A=1 TO 10:READ D$(A):NEXT A 320 A$(0)=" . ":A$(1)=" E ":A$(2)=" * ":A$(3)=" K ":A$(4)=" B " 330 F1=.86:F2=.01:F3=.95:F4=.99:K9=0:B9=K9 340 FOR I=1 TO 8:FOR J=1 TO 8:R1=RND(1):R2=RND(1):R3=INT(8*RND(1)+1) 350 K3=-(R1>F1-F2*R9)-(R1>F3-F2*R9)-(R1>F4-F2*R9):K9=K9+K3 360 B3=-(R2>F3):B9=B9+B3:G(I,J)=100*K3+10*B3+R3:NEXT J,I 370 IF NOT(B9>0 AND K9>0)THEN 330 380 PRINT"Objective:Destroy"K9"Klingons using"B9"starbase"; 390 U=K9:Y=B9 400 IF B9=1 THEN PRINT" ";:GOTO 420 410 PRINT"s "; 420 T9=K9+RND(1)*K9/R9+10-R9:PR=T9/K9:PRINT"in"T9"stardays." 430 GOSUB 4270 440 S3=0:B3=S3:K3=B3:FOR A=1 TO 8:FOR B=1 TO 8:S(A,B)=0:NEXT B,A 450 FOR A=1 TO 3:FOR B=1 TO 3:K(A,B)=0:NEXT B,A:S(S1,S2)=1 460 X=.01*G(Q1,Q2):K3=INT(X):Y=(X-K3)*10:B3=INT(Y) 470 S3=G(Q1,Q2)-100*K3-10*B3 480 IF K3=0 THEN FOR A=1 TO 3:FOR B=1 TO 3:K(A,B)=0:NEXT B,A:GOTO 520 490 PRINT AR$;"CONDITION RED !!!!!":FOR A=1 TO K3 500 R1=INT(RND(1)*8+1):R2=INT(RND(1)*8+1):IF S(R1,R2)<>0 THEN 500 510 S(R1,R2)=3:K(A,1)=R1:K(A,2)=R2:K(A,3)=S9:NEXT A:IF B3=0 THEN 550 520 IF B3=0 THEN 550 530 R1=INT(RND(1)*8+1):R2=INT(RND(1)*8+1):IF S(R1,R2)<>0 THEN 530 540 S(R1,R2)=4 550 IF S3=0 THEN 590 560 FOR A=1 TO S3 570 R1=INT(RND(1)*8+1):R2=INT(RND(1)*8+1):IF S(R1,R2)<>0 THEN 570 580 S(R1,R2)=2:NEXT A 590 G(Q1,Q2)=INT(G(Q1,Q2))+.5 600 PRINT 610 PRINT"QUADRANT (";MID$(STR$(Q1),2,1);",";MID$(STR$(Q2),2,1);")" 620 PRINT"SECTOR (";MID$(STR$(S1),2,1);",";MID$(STR$(S2),2,1);")" 630 IF KP<>0 THEN 4060 640 IF DT=1 THEN 2680 650 IF S<200*K3 THEN PRINT AR$;"Shield Energy too low":SL=1:A=6:GOTO 750 660 A=2: GOTO 750 670 PRINT 680 PRINT D$(2):FOR A=1 TO 8:FOR B=1 TO 8:PRINT A$(S(A,B));:NEXT B:PRINT:NEXT A 690 PRINT:PRINT"Shields";S;SPC(4);"Energy";E;SPC(4);"Photons";P; 700 PRINT SPC(4);"Stardays";T9-T 710 GOSUB 3220:INPUT"Command";A 720 IF A>10 OR A<0 THEN INPUT" ----> COMMAND";A 730 IF A>10 OR A<0 THEN PRINT"WARNING - PROPER COMMANDS ONLY !! ":GOTO 710 740 IF A=1 THEN 780 750 IF D(A)>=0 THEN 780 760 PRINT AR$;"Captain, we don't have ";D$(A);" anymore." 770 IF DT=1 THEN 2680 ELSE 710 780 ON A GOTO 820,670,1470,1530,1790,2140,2230,2680,4910,3910 790 PRINT:FOR A=1 TO 9:PRINT A;" = ";D$(A):NEXT A 800 A=10 810 PRINT A;"= ";D$(A):GOTO 710 820 INPUT"COURSE";C1:IF C1<0 OR C1>359.99 THEN 850 830 INPUT"WARP FACTOR";W1 840 SL=0:KP=0:GOTO 860 850 PRINT AR$"REJECTED ! Course must be in range of o to 359.99 degrees." 860 IF NOT(W1>0)THEN 710 870 IF D(1)>=0 OR W1<=AC THEN 900 880 PRINT AR$;"Warp Engines are damaged, maximum speed = ";AC 890 GOTO 820 900 TEC=TEC+1:C$="":IF K3>0 THEN GOSUB 2290 910 IF E>5*W1 THEN 980 920 IF S<1 THEN 2450 930 PRINT"Captain, you only have"E"units of energy. " 940 PRINT"Refuel from your Shield reserves, which have"S"units"; 950 Q9$="NO":INPUT " ";Q9$:IF (Q9$="Y" OR Q9$="YES") THEN GOSUB 6860 960 A=6:IF D(A)<0 THEN 2450 970 GOTO 710 980 FOR I=1 TO 10:IF D(I)>=0 THEN 1020 990 D(I)=D(I)+1:IF D(I)<0 THEN 1020 1000 IF D(7)<0 THEN 1020 1010 PRINT"Damage Control report: "D$(I)" repaired." 1020 NEXT I:IF RND(1)>.1 THEN 1130 1030 IF RND(1)>.1 THEN 1130 1040 GOTO 1100 1050 IF RND(1)>R9/10 THEN RETURN 1060 R1=INT(RND(1)*8+1):IF D(R1)<0 THEN RETURN 1070 D(R1)=D(R1)-10*RND(1)-1:IF D(7)<0 THEN RETURN 1080 IF D(7)<0 THEN RETURN 1090 PRINT:PRINT"Damage Control report: "D$(R1)" out.":PRINT:RETURN 1100 R1=INT(RND(1)*8+1):IF D(R1)>=0 THEN 1130 1110 IF D(7)<0 THEN 1130 1120 PRINT:D(R1)=0:PRINT"Damage Control report: "D$(R1)" repaired.":PRINT 1130 W1=W1*8:A1=8*Q2+S2-9:B1=72-8*Q1-S1:IF W1<1 THEN W1=W1*1.25 1140 E=E-2*W1:T=T+W1/25:IF T>T9 THEN 2520 1150 A2=INT(A1+W1*COS(C1*CX)+.5) 1160 B2=INT(B1+W1*SIN(C1*CX)+.5) 1170 IF NOT(A2<0 OR A2>63 OR B2<0 OR B2>63)THEN 1200 1180 PRINT AR$;"Captain, heed Starfleet regulations! ( STAY IN GALAXY ) !! 1190 T=T+W1/24:GOTO 710 1200 DEF FNA1(X)=INT(.5+A1+X*COS(C1*CX)) 1210 DEF FNB1(X)=INT(.5+B1+X*SIN(C1*CX)) 1220 FOR X=0 TO INT(W1) 1230 IF NOT(Q1=8-INT(FNB1(X)/8)AND Q2=INT(FNA1(X)/8+1))THEN X=W1:GOTO 1400 1240 S3=8-FNB1(X)+8*INT(FNB1(X)/8):S4=FNA1(X)+1-8*INT(FNA1(X)/8) 1250 IF S(S3,S4)<2 THEN 1400 1260 S(S1,S2)=0:S1=8-FNB1(X-1)+8*INT(FNB1(X-1)/8) 1270 S2=FNA1(X-1)+1-8*INT(FNA1(X 1)/8):S(S1,S2)=1 1280 PRINT AR$;"Navigational error :Engines shut down at ("; 1290 PRINT MID$(STR$(S1),2,1);","MID$(STR$(S2),2,1);")" 1300 T=T+(W1/24) 1310 PRINT" You lost "T" units startime restarting engines." 1320 PRINT 1330 IF S(S3,S4)<>4 THEN 710 1340 PRINT"Shields lowered for refueling" 1350 S=0:P=10:C$="D":E=3000-XA+100 1360 GOSUB 2290 1370 FOR R1=1 TO 10 1380 IF D(R1)>=0 THEN NEXT R1:GOTO 710 1390 D(R1)=D(R1)+(11*RND(1)/R9):NEXT R1:GOTO 710 1400 NEXT X:S(S1,S2)=0:S1=8-B2+8*INT(B2/8):S2=A2+1-8*INT(A2/8) 1410 Q3=8-INT(B2/8):Q4=INT(A2/8)+1 1420 IF NOT(Q1=Q3 AND Q2=Q4)THEN Q1=Q3:Q2=Q4:GOTO 440 1430 S(S1,S2)=1:FOR A=S1-1 TO S1+1:FOR B=S2-1 TO S2+1 1440 IF A>8 OR B>8 OR A<1 OR B<1 THEN 1460 1450 IF S(A,B)=4 THEN 1340 1460 NEXT B,A:GOTO 710 1470 PRINT 1480 FOR A=(Q1-1) TO (Q1+1):FOR B=(Q2-1) TO (Q2+1) 1490 IF A<1 OR B<1 OR A>8 OR B>8 THEN PRINT" ***";:NEXT B:PRINT" ":PRINT:NEXT A:GOTO 710 1500 PRINT" "SPC(3-LOG(G(A,B)+1)/LOG(10)); 1510 PRINT MID$(STR$(G(A,B)),2,LOG(G(A,B))/LOG(10)+1); 1520 G(A,B)=INT(G(A,B))+.5:NEXT B:PRINT" ":PRINT:NEXT A:GOTO 710 1530 PRINT 1540 IF K3<=0 THEN 2270 1550 IF D(8)>=0 THEN 1570 1560 PRINT AR$;" Computer failure hampers accuracy" 1570 PRINT"Phasers locked on target. Energy available="E 1580 PRINT"Number of units to fire:"; 1590 INPUT X 1600 IF E-X<0 THEN PRINT"NOT ENOUGH POWER":GOTO 710 1610 T=T+.05:IF T>T9 THEN 2520 1620 E=E-X 1630 IF C$<>"D"THEN GOSUB 2290 1640 IF D(8)>=0 THEN 1660 1650 X=X*RND(1) 1660 FOR I=1 TO 3 1670 IF K(I,3)<=0 THEN 1770 1680 H=(X/FND(0))+SGN(RND(1)-.5)*8*RND(1) 1690 K(I,3)=K(I,3)-H 1700 PRINT H"Unit hit on vessel at (";MID$(STR$(K(I,1)),2,1);","; 1710 PRINT MID$(STR$(K(I,2)),2,1);"), leaving"K(I,3)" 1720 IF K(I,3)>0 THEN 1770 1730 PRINT"Klingon at (";MID$(STR$(K(I,1)),2,1);",";MID$(STR$(K(I,2)),2,1); 1740 PRINT") destroyed":K3=K3-1:K9=K9-1:IF K9=0 THEN 2650 1750 G(Q1,Q2)=G(Q1,Q2)-100:S(K(I,1),K(I,2))=0:K(I,1)=0:K(I,2)=0 1760 K(I,3)=0 1770 NEXT I 1780 GOTO 710 1790 PRINT 1800 IF P>0 THEN 1830 1810 PRINT AR$;"All Photon Torpedoes expended" 1820 GOTO 710 1830 INPUT"DIRECTION";C1 1840 T=T+.05:IF T>T9 THEN 2520 1850 P=P-1:IF C$<>"D" THEN GOSUB 2290 1860 A1=8*Q2+S2-9:B1=72-8*Q1-S1:IF C1=90*INT(C1/90)THEN 2090 1870 DEF FNA1(W1)=INT(.5+A1+W1*COS(C1*CX)) 1880 DEF FNB1(W1)=INT(.5+B1+W1*SIN(C1*CX)) 1890 FOR W1=0 TO 10 STEP .9 1900 IF W1=0 THEN S3=S1:S4=S2:GOTO 1950 1910 IF NOT(Q1=8-INT(FNB1(W1)/8)AND Q2=INT(FNA1(W1)/8+1))THEN 710 1920 S3=8-FNB1(W1)+8*INT(FNB1(W1)/8):S4=FNA1(W1)+1-8*INT(FNA1(W1)/8) 1930 IF FNA1(W1)=A2 AND FNB1(W1)=B2 THEN 2070 1940 A2=FNA1(W1):B2=FNB1(W1) 1950 PRINT"(";MID$(STR$(S3),2,1);",";MID$(STR$(S4),2,1);")";A$(S(S3,S4)) 1960 ON S(S3,S4)+1 GOTO 2070,2070,2050,1970,2040 1970 IF RND(1)<(.1*X4) THEN PRINT"Shields deflect Torpedo":GOTO 710 1980 PRINT"Klingon destroyed":S(S3,S4)=0:G(Q1,Q2)=G(Q1,Q2)-100 1990 K3=K3-1:K9=K9-1:IF K9=0 THEN 2650 2000 FOR A=1 TO 3 2010 IF K(A,1)=S3 AND K(A,2)=S4 THEN K(A,1)=0:K(A,2)=0:K(A,3)=0 2020 NEXT A 2030 GOTO 710 2040 PRINT AR$;"Starbase destroyed":B3=0:B9=B9-1:S(S3,S4)=0:GOTO 2060 2050 PRINT AR$;"You can't destroy a star":GOTO 710 2060 G(Q1,Q2)=G(Q1,Q2)-10:GOTO 710 2070 NEXT W1 2080 GOTO 710 2090 FOR W1=0 TO 8 2100 S3=INT(S1-W1*SIN(C1*CX)) 2110 S4=INT(S2+W1*COS(C1*CX)) 2120 IF S3>8 OR S4>8 OR S3<1 OR S4<1 THEN 710 2130 GOTO 1950 2140 PRINT 2150 PRINT"Energy available="E+S" Number of units to Shields"; 2160 INPUT X 2170 IF X<0 THEN 710 2180 IF E+S-X<0 THEN 2150 2190 E=E+S-X 2200 S=X 2210 IF SL=1 THEN 660 2220 GOTO 710 2230 PRINT 2240 PRINT"DEVICE STATE OF REPAIR" 2250 FOR R1=1 TO 10:PRINT D$(R1);TAB(21) D(R1):NEXT R1 2260 IF DT=1 THEN 2680 ELSE 710 2270 PRINT"Short Range Sensors report no Klingons in this quadrant" 2280 IF DT=1 THEN 2680 ELSE 710 2290 IF C$="D" AND K3<>0 THEN PRINT"Starbase protects Enterprise" ELSE 2310 2300 GOTO 710 2310 PRINT 2320 FOR I=1 TO 3 2330 IF K(I,3)<=0 THEN 2430 2340 H=K(I,3)/FND(0)+SGN(RND(1)-.5)*RND(1)*7 2350 S=S-H:PRINT H"Unit hit from ("MID$(STR$(K(I,1)),2,1);","; 2360 PRINT MID$(STR$(K(I,2)),2,1);"), leaving"S 2370 IF S<0 THEN 2550 2380 GOSUB 1050 2390 IF RND(1)>R9/10 THEN 2430 2400 R1=INT(8*RND(1)+1):R2=INT(8*RND(1)+1) 2410 IF NOT(S(R1,R2)=0)THEN 2400 2420 S(R1,R2)=3:S(K(I,1),K(I,2))=0:K(I,1)=R1:K(I,2)=R2 2430 NEXT I 2440 RETURN 2450 PRINT AR$;" Enterprise dead in space" 2460 PRINT 2470 CY=1:PRINT:GOTO 2590 2480 IF K3<=0 THEN 2590 2490 GOSUB 2290 2500 GOTO 2480 2510 PRINT 2520 PRINT:PRINT:PRINT:PRINT:PRINT:PRINT AR$; 2530 PRINT"It is stardate"T:PRINT 2540 GOTO 2590 2550 PRINT 2560 PRINT:PRINT:PRINT:PRINT:PRINT:PRINT AR$; 2570 PRINT"Enterprise disabled !!":PRINT:PRINT 2580 CY=0 2590 PRINT"There are"K9"Klingons remaining.":IF CY<>0 THEN 3560 2600 PRINT"You have failed !!":PRINT 2610 L=INT(RND(1)*5) 2620 ON L+1 GOTO 3440,3470,3490,3510,3540 2630 PRINT:INPUT"Do you want to try again";X$ 2640 IF LEFT$(X$,1)="Y" THEN 130 ELSE 5430 2650 PRINT"The Federation is saved !!" 2660 PRINT"You are hereby promoted to Admiral!!!!":PRINT 2670 GOTO 2630 2680 DT=1 2690 INPUT"Computer on--COMMAND";A: IF A=0 THEN GOTO 2720 2700 IF A<0 OR A>=10 THEN PRINT AR$;" NO SUCH COMMAND !!":GOTO 2690 2710 ON A GOTO 2900,2950,3000,2840,600,3400,3420,5120,710 2720 PRINT"FUNCTIONS AVAILABLE FROM COMPUTER" 2730 PRINT" 1 = Galactic Memory Map" 2740 PRINT" 2 = General Status Report" 2750 PRINT" 3 = Photon Trajectory" 2760 PRINT" 4 = New Mission" 2770 PRINT" 5 = Present Position" 2780 PRINT" 6 = Self-Destruct" 2790 PRINT" 7 = Warp-Compass" 2800 PRINT" 8 = Mission Progress Report" 2810 PRINT" 9 = Exit Computer" 2820 GOTO 2680 2830 PRINT:PRINT"--TEMPORARY MALFUNCTION--":GOTO 710 2840 IF XM<0 THEN 2880 2850 PRINT AR$;"Safety check -- Do you wish to abort mission":INPUT AN$ 2860 IF LEFT$(AN$,1)<>"Y" THEN 2890 ELSE 130 2870 PRINT 2880 PRINT"You have not been authorized for new mission !!":PRINT 2890 GOTO 2680 2900 PRINT"QUADRANT CODE MEMORY MAP" 2910 FOR A=1 TO 8:FOR B=1 TO 8:IF G(A,B)=INT(G(A,B))THEN PRINT" ???";:GOTO 2940 2920 PRINT" "SPC(3-LOG(G(A,B)+1)/LOG(10)); 2930 PRINT MID$(STR$(G(A,B)),2,LOG(G(A,B))/LOG(10)+1); 2940 NEXT B:PRINT" ":NEXT A:GOTO 2680 2950 PRINT" STATUS REPORT" 2960 PRINT"Number of Klingons left ="K9 2970 PRINT"Number of stardates left ="T9-T 2980 PRINT"Number of Starbases left ="B9 2990 A=7:GOTO 750 3000 IF K3=0 THEN 2270 3010 IF D(2)<0 THEN A=2:GOTO 740 3020 PRINT"COORD","LOWDIR","HIGHDIR","DIST" 3030 FOR A=1 TO 47:PRINT"-";:NEXT A 3040 PRINT 3050 FOR I=0 TO 3 3060 IF NOT(K(I,3)>0)THEN 3190 3070 W1=SQR((S1-K(I,1))^2+(S2-K(I,2))^2) 3080 IF W1=0 THEN PRINT"--->MALFUNCTION !":GOTO 710 3090 ON ERROR GOTO 2830 3100 C1=1.5708-ATN((K(I,2)-S2)/W1/SQR(1-((K(I,2)-S2)/W1)^2)) 3110 ON ERROR GOTO 2830 3120 C1=C1*SGN(S1-K(I,1))/CX 3130 C2(I)=C1-(10*RND(1)) 3140 C3(I)=C1+(10*RND(1)) 3150 IF C3(I)<0 THEN C3(I)=C3(I)+360 3160 IF C2(I)<0 THEN C2(I)=C2(I)+360 3170 PRINT"(";MID$(STR$(K(I,1)),2,1);",";MID$(STR$(K(I,2)),2,1); 3180 PRINT")",C2(I),C3(I),W1 3190 NEXT I 3200 IF DT=1 THEN 2680 ELSE 710 3210 RETURN 3220 MR=(T9-T)/K9:DT=0 3230 XM=((MR-PR)/PR)*100 3240 IF KA=1 THEN PRINT TK-T"stardates left to save Starbase.":GOTO 3330 3250 IF RND(1)>.01*R9 OR B9=0 THEN RETURN 3260 KA=1:FOR A=1 TO 8:FOR B=1 TO 8 3270 IF G(A,B)-100*INT(G(A,B)/100)>9 THEN K1=A:K2=B:IF RND(1)>.5 THEN A=8:B=8 3280 NEXT B,A:TK=T+.09*SQR((Q1-K1)^2+(Q2-K2)^2)*(10-R9) 3290 TK=TK+1 3300 PRINT AR$;"!!! Starbase in quadrant ("MID$(STR$(K1),2,1)","; 3310 PRINT MID$(STR$(K2),2,1)") is under attack!!" 3320 PRINT"You have"TK-T"stardates to save it!":RETURN 3330 IF T1 THEN 4230 ELSE 5320 3410 GOTO 710 3420 GOSUB 3660 3430 GOTO 2680 3440 PRINT"You have screwed up once too often !" 3450 PRINT"Off to the Vulcan torture camps !!" 3460 IF T<= 0 THEN 2630ELSE 3560 3470 PRINT"You will be executed at sunrise" 3480 GOTO 3560 3490 PRINT"You will be put to death for your incompetence" 3500 GOTO 3560 3510 PRINT"You will be confined to your quarters until" 3520 PRINT"Vulcan's moons become tourist traps !!" 3530 IF T<=0 THEN 2630ELSE 3560 3540 PRINT"Imbecile !! We hope you consider suicide!" 3550 IF T<=0 THEN 2630ELSE 3560 3560 L=(U-K9)*10+((U-K9)*500/T)-100*(Y-B9) 3570 IF E<=0 OR S<0 THEN L=L-200 3580 IF K9=0 THEN L=L+(R9*100) 3590 PRINT:PRINT 3600 PRINT"Your mission rating is: ";L 3610 PRINT:PRINT:PRINT:PRINT:PRINT 3620 GOSUB 5450 3630 PRINT CHR$(26) 3640 GOTO 5460 3650 GOTO 2630 3660 PRINT 3670 PRINT" O9O" 3680 PRINT" 135 . O45" 3690 PRINT" . . ." 3700 PRINT" . . ." 3710 PRINT"18O . . . E . . .OOO WARP-COMPASS" 3720 PRINT" . . ." 3730 PRINT" . . ." 3740 PRINT" 225 . 315" 3750 PRINT" 27O" 3760 PRINT 3770 RETURN 3780 XX=INT(RND(2)*10)+1 3790 RETURN 3800 PRINT:IF X4>12 THEN 3900 3810 PRINT"Command Central advises that your ranking-";X4;"-is in the expert" 3820 PRINT"category. Be advised that if you are not properly qualified" 3830 PRINT"your chances of avoiding failure are nil." 3840 PRINT 3850 PRINT"Do you wish reassignment to a less hazardous mission (Y or N)" 3860 INPUT AN$ 3870 IF LEFT$(AN$,1)="Y"THEN 130 3880 IF LEFT$(AN$,1)="y" THEN 130 3890 PRINT CHR$(26):GOTO 240 3900 PRINT"You have requested a suicide mission":GOTO 3840 3910 PRINT"--COMMUNICATIONS ACTIVE--" 3920 PRINT 3930 GOSUB 3780 3940 PD=XX 3950 GOSUB 3780 3960 PE=XX 3970 GOSUB 3780 3980 PF=XX 3990 GOSUB 3780 4000 PG=XX 4010 PH=PD*10+PE 4020 PJ=PF*10+PG 4030 IF PH=PJ THEN 2830 4040 KP=1:IF PD=PE OR PF=PG THEN 4050ELSE 4070 4050 PRINT"Sunspots block transmission at : ":GOTO 610 4060 PRINT"Move elsewhere and try again":PRINT:GOTO 820 4070 PRINT"Authorized frequencies":PRINT 4080 PRINT"Federation Command Base = ";PH 4090 PRINT"Klingon Command Central = ";PJ 4100 PRINT 4110 INPUT"Communication on channel ";XF 4120 IF XF=PH THEN 4340 4130 IF XF=PJ THEN 4630 4140 PRINT 4150 PRINT AR$;"ALERT !!" 4160 PRINT"Attempted communication on unauthorized frequency" 4170 PRINT 4180 PRINT"While security check is conducted on enterprise" 4190 GOSUB 3780:A=XX 4200 GOSUB 3780:I=(XX/2)+(X4/7) 4210 PRINT"Your ";D$(A);" will be inoperative for ";I "units of startime" 4220 D(A)=D(A)-I:GOTO 710 4230 PRINT 4240 PRINT"Security Control advises that no authorization has been" 4250 PRINT"given to activate Self- Destruct system." 4260 PRINT"Proceed with assigned mission":PRINT:GOTO 2690 4270 PRINT 4280 PRINT"Be advised, your mission progress factor is";PR 4290 GOSUB 3780 4300 TF=(XX*X4)/1.6:IF TF<10 THEN TF=TF+10 4310 PRINT" The tolerance factor for this mission is [+/-]";TF;"percent" 4320 PRINT 4330 RETURN 4340 ON SGN(XM)+2 GOTO 4350,4390,4410 4350 IF ABS(XM)>(TF*1.5)THEN 4470 4360 IF ABS(XM)>TF THEN 4440 4370 PRINT:PRINT"Captain, you are behind schedule - Let's go !!" 4380 GOTO 710 4390 PRINT:PRINT"You are exactly on computed schedule; Proceed with mission" 4400 GOTO 710 4410 IF XM>TF THEN 4560:IF XM>(TF*1.5)THEN 4590 4420 PRINT:PRINT"You are ahead of computed schedule, keep up the good work !!" 4430 GOTO 710 4440 PRINT:PRINT"You are behind schedule and out of tolerance factor !!" 4450 PRINT"Command Control projects failure...you may surrender to enemy" 4460 EQ=1:SD=1:GOTO 3910 4470 YY=AC^X4 4480 PRINT CHR$(26) 4490 PRINT AR$;"---------COMPUTER PROJECTION----------":PRINT 4500 PRINT"Projected likelihood of success for your mission =";YY;"percent" 4510 PRINT"We have auto activated Self-Destruct system on your vessel" 4520 PRINT"Goodbye, Captain.............":PRINT 4530 PRINT"End of message from Federation Command":PRINT:PRINT 4540 GOSUB 5450 4550 GOTO 5320 4560 PRINT:PRINT"You are ahead of schedule and beyond tolerance factor" 4570 PRINT"Call Klingon leaders and request their surrender":KQ=1 4580 PRINT:GOTO 3910 4590 PRINT AR$;"Message from Command base" 4600 PRINT:PRINT"Enemy has surrendered to Federation Command !!" 4610 PRINT:PRINT:PRINT:PRINT 4620 GOTO 2650 4630 IF KQ=1 THEN 4880:IF EQ=1 THEN 4660 4640 ON SGN(XM)+2 GOTO 4650,4710,4760 4650 IF ABS(XM)<=TF THEN 4710 4660 PRINT:PRINT"Klingon command on frequency" 4670 PRINT"Naturally, we are pleased that you are conceding, Captain" 4680 PRINT"We are presently boarding your craft" 4690 PRINT:PRINT"Here is a message from your leaders-":PRINT:GOSUB 5450 4700 PRINT CHR$(26):GOTO 2610 4710 GOSUB 3780 4720 IF XX<=5 THEN 4750 4730 PRINT:PRINT"Message from Klingon Command...." 4740 PRINT"Eat Phaser Death, Federation dogs!!":GOTO 4840 4750 PRINT:PRINT"We'll talk with our weapons, Earth-swine !!":GOTO 4840 4760 GOSUB 3780 4770 AQ=INT((XX+1)/2) 4780 ON AQ GOTO 4730,4750,4790,4790,4760 4790 GF=TF*1.5 4800 IF XM>GF THEN 4880 4810 IF XM>TF THEN 4850 4820 PRINT:PRINT"Captain, despite your slight advantage, you are no match for" 4830 PRINT"the glorious Klingon Fleet" 4840 PRINT TAB(25)"End of message from Klingon Command":GOTO 710 4850 GOSUB 3780 4860 IF XX<=5 THEN PRINT" Klingon command to Enterprise..":GOTO 4750 4870 GOTO 4890 4880 PRINT CHR$(26) 4890 PRINT:PRINT"Message from Klingon leaders..." 4900 PRINT:PRINT"We concede the war, Sir, congratulations !!":GOTO 3610 4910 AV=INT(X4/2)+1:DR=-1 4920 IF TEC"D" THEN 4980 ELSE 5000 4940 AU=AV-TEC:IF AU=1 THEN KF$=""ELSE KF$="s" 4950 PRINT:PRINT"Damage Repair inactive !!" 4960 PRINT"Requires";AU;"more recharge unit";KF$ 4970 PRINT:GOTO 710 4980 PRINT:PRINT AR$"You must be docked at Starbase for Damage Repair !!" 4990 PRINT:GOTO 710 5000 PRINT 5010 PRINT:FOR A=1 TO 10 5020 IF D(A)<0 THEN PRINT TAB(10)A;TAB(20)D$(A);TAB(40)"damaged" 5030 NEXT 5040 PRINT:PRINT"If no damage indicated above, answer with 0 (ZERO)" 5050 INPUT "Which one to repair ";A 5060 IF A<1 OR A>10 THEN PRINT AR$;:GOTO 710 5070 IF D(A)<0 THEN 5090 5080 PRINT:PRINT D$(A);" not damaged !!":GOTO 5050 5090 PRINT:PRINT TAB(20)D$(A);"-- repaired":PRINT 5100 D(A)=0:TEC=0:GOTO 710 5110 PRINT:PRINT AR$;"Nothing damaged at present":GOTO 710 5120 PRINT 5130 GOSUB 4310 5140 PRINT"Initial mission progress factor was";PR 5150 PRINT"Current mission progress factor is ";MR 5160 IF XM<0 THEN PW$=" worsened "ELSE PW$=" improved " 5170 PRINT 5180 PRINT"Your combat situation has";PW$;"by a factor of";XM;"percent" 5190 IF ABS(XM)>=TF THEN EG$=" not "ELSE EG$=" " 5200 IF EG$=" "THEN EH$=""ELSE EH$=AR$ 5210 PRINT EH$;"Your progress is";EG$;"within tolerance for this mission" 5220 PRINT 5230 IF EG$=" not "THEN 5240 ELSE 2680 5240 IF XM<0 THEN 5250 ELSE 5290 5250 PRINT:SD=1:KD=0 5260 PRINT"Captain, Command Central projects defeat by enemy. You are now" 5270 PRINT"authorized to surrender or to activate Self-Destruct system" 5280 GOTO 2680 5290 PRINT:SD=0:KD=1 5300 PRINT"Captain, Federation Command projects success for your mission." 5310 GOTO 4560 5320 PRINT CHR$(26) 5330 GOSUB 5440 5340 PRINT"Self Destruct System activated" 5350 PRINT:PRINT:PRINT:GOSUB 5440 5360 PRINT"COUNTDOWN BEGUN !":PRINT:PRINT 5370 PRINT TAB(25)"FIVE":PRINT:GOSUB 5440 5380 PRINT TAB(20)"FOUR":PRINT:GOSUB 5440 5390 PRINT TAB(15)"THREE":PRINT:GOSUB 5440 5400 PRINT TAB(10)"TWO":PRINT:GOSUB 5440 5410 PRINT TAB(5)"ONE":PRINT:GOSUB 5440 5420 PRINT"ZERO":GOSUB 5440 5430 PRINT CHR$(26):GOTO 5460 5440 FOR I=1 TO 50:A=A+1:NEXT:RETURN 5450 FOR I=1 TO 1200:A=A+1:NEXT:RETURN 5460 GOTO 6910 5470 REM INTRODUCTION TO GAME. R.SCHRADER, 1/12/83 5480 REM WITH ADDITIONS AND CORRECTIONS BY V. STAPEL 5490 PRINT:PRINT:PRINT:PRINT 5500 PRINT " SPACE - THE FINAL FRONTIER!":PRINT 5510 PRINT " THESE ARE THE VOYAGES OF THE STARSHIP ENTERPISE. THE MISSION: " 5520 PRINT " TO SEEK NEW LIFE AND NEW CIVILIZATIONS; TO BOLDLY GO WHERE NO" 5530 PRINT " MAN HAS GONE BEFORE.":PRINT:PRINT:PRINT:PRINT 5540 PRINT:PRINT:PRINT:PRINT:PRINT:PRINT:INPUT "Do you need instructions";Q9$ 5550 IF LEFT$(Q9$,1)="N" THEN RETURN 5560 IF LEFT$(Q9$,1)="n" THEN RETURN ELSE PRINT CHR$(26) 5570 PRINT " ********** WELCOME TO STARTREK **********":PRINT 5580 PRINT " You are in control of the Starship Entrprise. Your mission" 5590 PRINT "will be to rid the galaxy of Klingons." 5600 PRINT " The known galaxy is mapped into 64 quadrants (8 X 8). Each" 5610 PRINT "quadrant is composed of 64 sectors (also 8 X 8)." 5620 PRINT " A map of the galaxy, as represented by your on-board Com-" 5630 PRINT "puter, looks like this:":PRINT 5640 FOR Q8=1 TO 3:PRINT " ??? ??? ??? ??? ??? ??? ??? ???":NEXT Q8 5650 PRINT " ??? ??? ??? ??? 316 ??? ??? ???" 5660 FOR Q8=1 TO 4:PRINT " ??? ??? ??? ??? ??? ??? ??? ???":NEXT Q8 5670 PRINT 5680 PRINT "The question marks represent unexplored quadrants. The 3-digit" 5690 PRINT "numbers encode information about quadrants. The first digit" 5700 PRINT "tells how many Klingons are in the quadrant; the second, how" 5710 PRINT "many friendly bases; the third, how many stars." 5720 PRINT:INPUT "HIT RETURN TO CONTINUE";Q8:PRINT CHR$(26):PRINT 5730 PRINT " When you are in a quadrant, it will be displayed as:" 5740 PRINT:PRINT 5750 PRINT " . . . . . . . ." 5760 PRINT " . K . . . . * ." 5770 PRINT " . . . . . . . ." 5780 PRINT " * . . * . . . ." 5790 PRINT " . . . . . E . ." 5800 PRINT " . . . K . . . B" 5810 PRINT " . * K . . . . ." 5820 PRINT " . . . * . . . *" 5830 PRINT:PRINT 5840 PRINT "The Klingons are represented by 'K', stars by '*', Your ship by" 5850 PRINT "an 'E', bases by 'B', and empty sectors by '.'" 5860 PRINT:INPUT "HIT RETURN TO CONTINUE";Q8:PRINT CHR$(26):PRINT 5870 PRINT " In your pursuit of Klingons, you will have a large number of" 5880 PRINT "units of energy. These can by used to move the ship, to defend" 5890 PRINT "the ship, or to fire at Klingons. In executing any of the afore-" 5900 PRINT "mentioned functions, energy is expended. If you ever run out of" 5910 PRINT "energy, you will be immobile and defenseless.":PRINT:PRINT 5920 PRINT " A SUMMARY OF TOP LEVEL COMMANDS FOLLOWS:" 5930 PRINT 5940 PRINT "---> LIST TOP LEVEL COMMANDS (Activated by a '0') 5950 PRINT " This will list the commands you have available to you in" 5960 PRINT " response to `COMMAND?'. 5970 PRINT 5980 PRINT "---> WARP (Activated by entering a '1')" 5990 PRINT " WARP moves the starship. Upon entering the command, you" 6000 PRINT " will be asked for a direction of travel ( 0 to 360 degrees," 6010 PRINT " 0 is right, 90 is up, etc), and the warp speed." 6020 PRINT 6030 PRINT "---> SHORT-RANGE SCAN (Activated by a '2')" 6040 PRINT " Displays the local quadrant." 6050 PRINT:INPUT "HIT RETURN TO CONTINUE";Q8 6060 PRINT CHR$(26) 6070 PRINT "---> LONG-RANGE SCAN ('3')" 6080 PRINT " Displays information about your quadrant and it's eight" 6090 PRINT " immediate neighbors:":PRINT 6100 PRINT " 103 8 104 (Numbers are interprteted" 6110 PRINT " 203 316 4 like on a galactic map)" 6120 PRINT " 106 505 207":PRINT 6130 PRINT " The computer updates your galactic map after every " 6140 PRINT " Long-Range scan." 6150 PRINT 6160 PRINT "---> PHASERS ('4')" 6170 PRINT " Computer-controlled high energy beams are fired at all" 6180 PRINT " Klingons in the quadrant." 6190 PRINT 6200 PRINT "---> PHOTON TORPEDOES ('5')" 6210 PRINT " One of ten Torpedoes can be fired at a Klingon. They must" 6220 PRINT " be manually aimed." 6230 PRINT:INPUT "HIT RETURN TO CONTINUE";Q8:PRINT CHR$(26) 6240 PRINT 6250 PRINT "---> SHIELDS ('6')" 6260 PRINT " As the Klingons have weapons like yours, your ship has" 6270 PRINT " shields to protect it. This command controls the energy" 6280 PRINT " in the shields." 6290 PRINT 6300 PRINT "---> DAMAGE CONTROL ('7')" 6310 PRINT " Enables you to check the operational status of any of the" 6320 PRINT " ship's functions. " 6330 PRINT 6340 PRINT "---> COMPUTER ('8')" 6350 PRINT " Accesses the on-board Computer. (See the list of computer" 6360 PRINT " commands at the end of this list.)" 6370 PRINT 6380 PRINT "---> DAMAGE REPAIR ('9')" 6390 PRINT " This will allow you to repair damage to the Enterprise" 6400 PRINT " if you are docked at a Starbase." 6410 PRINT:INPUT "HIT RETURN TO CONTINUE";Q8:PRINT CHR$(26) 6420 PRINT:PRINT "LIST OF COMPUTER COMMANDS" 6430 PRINT " These are the options available to you in response" 6440 PRINT "to `Computer on---COMMAND?'":PRINT:PRINT 6450 PRINT "---> `0' Lists available commands from the Computer.":PRINT 6460 PRINT "---> GALACTIC MEMORY MAP (`1')" 6470 PRINT " This option lists all quadrants that the Enterprise has" 6480 PRINT " been to or has seen through a Long-Range Scan.":PRINT 6490 PRINT "---> GENERAL STATUS REPORT (`2')" 6500 PRINT " This will list the number of Klingons, Stardates and" 6510 PRINT " Starbases left, as well as the state of repair of all" 6520 PRINT " devices on the ship.":PRINT 6530 PRINT "---> PHOTON TRAJECTORY (`3')" 6540 PRINT " This will assist in telling the Captain what direction" 6550 PRINT " to aim the Photon Torpedoes.":PRINT 6560 INPUT "HIT RETURN TO CONTINUE";Q8:PRINT CHR$(26) 6570 PRINT "---> NEW MISSION (`4')" 6580 PRINT " This is to be used on the first couple of turns to abort" 6590 PRINT " a mission that is too much (or too little) for the" 6600 PRINT " player's experience or skill.":PRINT 6610 PRINT "---> PRESENT POSITION (`5')" 6620 PRINT " If your Short-Range Scanners are out, this will give your" 6630 PRINT " present position, but NOT what is in the quadrant.":PRINT 6640 PRINT "---> SELF-DESTRUCT (`6')" 6650 PRINT " If Security Control authorizes it, you may destroy the" 6660 PRINT " Enterprise to avoid take-over by the Klingons.":PRINT 6670 PRINT "---> WARP-COMPASS (`7')" 6680 PRINT " With the Enterprise in the middle, this will help deter-" 6690 PRINT " mine direction for movement and Photon Trajectory.":PRINT 6700 PRINT "---> MISSION PROGRESS REPORT (`8')" 6710 PRINT " This gives the Initial and Current Progress Factors as " 6720 PRINT " well as the tolerance factor for this mission.":PRINT 6730 INPUT "HIT RETURN TO CONTINUE";Q8:PRINT CHR$(26) 6740 PRINT "---> EXIT COMPUTER (`9')" 6750 PRINT " This returns you to the top level of commands." 6760 PRINT 6770 PRINT 6780 PRINT " Some free advice for beginners:" 6790 PRINT " 1) Put enery in the shields before warping." 6800 PRINT " 2) When in doubt, consult the Computer (COMMAND 8)" 6810 PRINT " 3) Choose a low Security Clearance and a low Rank." 6820 PRINT 6830 INPUT "HIT RETURN TO START";Q8 6840 PRINT CHR$(26) 6850 RETURN 6860 PRINT " Amount to transfer from Shields";: INPUT Q8 6870 IF Q8<0 OR Q8>S THEN GOTO 6860 6880 S=S-Q8:E=E+Q8:PRINT 6890 PRINT E;" units of energy now - Try again." 6900 RETURN 6910 RESET  6860 PRINT " Amount to transfer from Shields";: INPUT Q8 6870 IF Q8<0 OR Q8>S THEN GOTO 6860 6880 S=S-Q8:E=E+Q8:PRINT 6890 PRINT E;" units of energy now - Try again." 6900 RETURN 10 DIM T(10) 20 DIM L(50) 30 PRINT CHR$(26):PRINT:PRINT 40 PRINT "Hi, I'm the Taxman" 50 INPUT "Do you want the regulations (type Y or N)";ANS$ 60 IF LEFT$(ANS$,1)="Y" THEN 1330 70 IF LEFT$(ANS$,1)="y" THEN 1330 80 '---------------------------------------> INITIALZATION 90 GOSUB 1100 100 '----------------------------> THE HUMAN TAKES A NUMBER 110 GOSUB 240 120 '-------------> COMPUTE THE HUMAN'S AND TAXMAN'S TOTALS 130 GOSUB 520 140 '----------------------------------> PRINT THE NEW LIST 150 GOSUB 630 160 '-------------> CHECK IF ANY NUMBERS STILL HAVE FACTORS 170 GOSUB 740 180 IF M=1 THEN 110 190 '-------------------------------------> FIND THE WINNER 200 GOSUB 960 210 '----------------------------------------------> AGAIN? 220 GOTO 1030 230 '-------------------------------------> THE HUMAN MOVES 240 PRINT 250 PRINT 260 PRINT"You take"; 270 INPUT K 280 LET K=INT(K) 290 IF K <= 0 THEN 1030 300 IF K <=N THEN 330 310 PRINT K;"is not in the list -- try again." 320 GOTO 250 330 IF L(K)=0 THEN 310 340 '--------------------------------> FIND ALL THE FACTORS 350 IF K>1 THEN 390 360 PRINT"There are no factors of";K;"for me!" 370 PRINT"Are you trying to short-change the Taxman?" 380 GOTO 250 390 LET M=0 400 FOR I=1 TO K/2 410 IF L(I)=0 THEN 460 420 IF K <> I*INT(K/I) THEN 460 430 LET M=M+1 440 LET T(M)=I 450 LET L(I)=0 460 NEXT I 470 '----------------> CHECK WHETHER THERE WERE ANY FACTORS 480 IF M=0 THEN 360 490 LET L(K)=0 500 RETURN 510 '--------------> COMPUTE THE HUMAN'S AND TAXMAN'S TOTALS 520 LET Y=Y+K 530 PRINT"Your total is";Y 540 PRINT"I get"; 550 FOR I=1 TO M 560 PRINT T(I); 570 LET Z=Z+T(I) 580 NEXT I 590 PRINT 600 PRINT"My total is";Z 610 RETURN 620 '----------------------------------> PRINT THE NEW LIST 630 PRINT 640 PRINT"NEW LIST:"; 650 LET M=0 660 FOR I=1 TO N 670 IF L(I)=0 THEN 700 680 PRINT I; 690 LET M=1 700 NEXT I 710 RETURN 720 '-------------> CHECK IF ANY NUMBERS STILL HAVE FACTORS 730 '--------------------------> CHECK IF THE LIST IS EMPTY 740 IF M=0 THEN 940 750 FOR I=N TO 4 STEP -1 760 FOR J=2 TO I/2 770 IF L(J)=0 THEN 810 780 IF I<> J*INT(I/J) THEN 810 790 LET M=1 800 RETURN 810 NEXT J 820 NEXT I 830 '-------------> THE TAXMAN GETS THE REST OF THE NUMBERS 840 PRINT 850 PRINT"I get"; 860 FOR I=1 TO N 870 IF L(I)=0 THEN 900 880 PRINT I; 890 LET Z=Z+I 900 NEXT I 910 PRINT"because no factors of any number are left." 920 PRINT"My total is";Z 930 LET M=0 940 RETURN 950 '------------------------------------> FIND THE WINNER 960 PRINT 970 IF Z>Y THEN 1000 980 PRINT"You have";Y;" The Taxman has";Z;" YOU WIN!!!" 990 RETURN 1000 PRINT"The Taxman has";Z;" You have";Y;" THE TAXMAN WINS." 1010 RETURN 1020 '----------------------------------------------> AGAIN? 1030 PRINT 1040 PRINT 1050 INPUT"Again (Type Y or N)";ANS$ 1060 IF LEFT$(ANS$,1)="N" THEN 1600 1070 IF LEFT$(ANS$,1)="n" THEN 1600 1080 GOTO 90 1090 '--------------------------------------> INITIALIZATION 1100 PRINT 1110 PRINT"HOW MANY NUMBERS DO YOU WANT IN THE LIST"; 1120 INPUT N 1130 LET N=INT(N) 1140 IF N <= 0 THEN SYSTEM 1150 IF N<=50 THEN 1180 1160 PRINT"At this time, regulations allow a maximum of 50 numbers." 1170 GOTO 1100 1180 LET Y=0 1190 LET Z=0 1200 PRINT 1210 PRINT"The list is:"; 1220 FOR I=1 TO N 1230 PRINT I; 1240 LET L(I)=1 1250 NEXT I 1260 IF N>1 THEN 1310 1270 PRINT 1280 PRINT"How very generous of you to forfeit all to the Taxman." 1290 PRINT"The Taxman has 1 You have 0 THE TAXMAN WINS." 1300 GOTO 1030 1310 RETURN 1320 '----------------------------------------> INSTRUCTIONS 1330 PRINT 1340 PRINT"You try to beat the Taxman." 1350 PRINT 1360 PRINT"We start with a list of whole numbers in numerical" 1370 PRINT"order (You decide how many)." 1380 PRINT 1390 PRINT"You take a number from the list -- The Taxman gets" 1400 PRINT"all the factors of your number that are still left." 1410 PRINT"Your number and all of its factors are then deleted" 1420 PRINT"from the list." 1430 PRINT 1440 PRINT"Example: Suppose you want ten numbers to be in the list." 1450 PRINT"The list would be: 1 2 3 4 5 6 7 8 9 10" 1460 PRINT 1470 PRINT"If you took 8, the Taxman would get: 1, 2, AND 4" 1480 PRINT"and the new list would be: 3 5 6 7 9 10" 1485 PRINT 1490 INPUT"TYPE TO GO ON";W 1495 PRINT 1500 PRINT"The Taxman must get something every time, so you can" 1510 PRINT"only pick a number that has factors left." 1520 PRINT 1530 PRINT"When none of the remaining numbers have factors," 1540 PRINT"the Taxman gets them!!!" 1550 PRINT 1560 PRINT"Your score is the sum of numbers you take." 1570 PRINT"If you want to give up, take 0." 1580 PRINT"GOOD LUCK !!!" 1590 GOTO 90 1600 SYSTEM  sum of numbers you take." 1570 PRINT"If you want1485 PRINT 1490 INPUT"TYPE TO GO ON";W 1495 PRINT 1500 PRINT"The Taxman must get something every time, so you can" 1510 PRINT"only pick a number that has factors left." 1520 PRINT 1530 PRINT"When none of the remaining numbers have factors," 5 REM STAR TRADERS 10 REM - MODIFIED FOR 'ALTAIR BASIC 4.0' BY - S J SINGER 20 REM 30 REM 35 DEFINT C 36 DEFINT I 40 DIM M(10,13),S(5,4),N$(5),D1(5),S1(5),Q(5),M$(12),C$(25) 50 DIM C1$(25),C2$(25) 60 DATA 1,"`Altair Starways'" 70 DATA 2,"`Betelgeuse,LTD.'" 80 DATA 3,"`Capella Freight Co.'" 90 DATA 4,"`Denebola Shippers'" 100 DATA 5,"`Eridani Expediters'" 110 Z1$=CHR$(26)+CHR$(0) 120 PRINT Z1$ 130 FOR I=1 TO 5 140 FOR J=1 TO 4 150 S(I,J)=0: D1(I)=0: S1(I)=100: Q(I)=0: B(I)=6000 160 NEXT J 170 NEXT I 180 L$=".+*ABCDE" 190 M$="ABCDEFGHIJKL" 195 PRINT" ********** STAR TRADERS **********":PRINT 197 PRINT:PRINT 200 INPUT "Type a 3 digit number ";R1 220 R1=RND(-R1/1000) 230 FOR I=1 TO 9 240 FOR J=1 TO 12 250 IF INT(20*RND(R1)+1)<>10 THEN M(I,J)=1 ELSE M(I,J)=3 260 NEXT J 270 NEXT I 280 PRINT Z1$ 290 INPUT "How many players (1-4) ";P1 300 PRINT:PRINT 310 INPUT "Does any player need instructions (Type Y or N)";ANS$ 320 IF LEFT$(ANS$,1)="Y" THEN GOSUB 3410 321 IF LEFT$(ANS$,1)="y" THEN GOSUB 3410 330 PRINT Z1$ 340 FOR I=1 TO P1 350 PRINT "Player",I, 370 INPUT " what is your name ";P$ 380 IF I=1 THEN P1$=P$ 390 IF I=2 THEN P2$=P$ 400 IF I=3 THEN P3$=P$ 410 IF I=4 THEN P4$=P$ 420 NEXT I 430 PRINT Z1$ 440 PRINT TAB(10),"...Now I will decide who goes first...":: PRINT:PRINT 445 PRINT:PRINT 450 PRINT:PRINT:PRINT 460 I=INT(P1*RND(R1)+1) 470 GOSUB 490 480 GOTO 550 490 PRINT 500 ON I GOTO 510,520,530,540: REM - IDENTIFY PLAYER 510 PRINT P1$;:P5$=P1$: RETURN 520 PRINT P2$;:P5$=P2$: RETURN 530 PRINT P3$;:P5$=P3$: RETURN 540 PRINT P4$;:P5$=P4$: RETURN 550 PRINT " is the first player to move." 560 FOR W=1 TO 2000: NEXT 570 K=0 580 P=I:GOTO 610 590 K=K+1: IF K=48 THEN 4450 600 P=P+1: IF P=P1+1 THEN P=1 610 FOR I=1 TO 5: REM ----------------> SELECT 5 LEGAL MOVES 620 R(I)=INT(9*RND(R1)+1) 630 C(I)=INT(12*RND(R1)+1) 640 FOR I1=I-1 TO 0 STEP -1 650 IF R(I)=R(I1) AND C(I)=C(I1) THEN 620 660 NEXT I1 670 IF M(R(I),C(I))>1 THEN 620 680 FOR I1=1 TO 5 690 IF Q(I1)=0 THEN 870 700 NEXT I1 710 IF M(R(I),C(I)+1)>3 THEN 870 720 IF M(R(I),C(I)-1)>3 THEN 870 730 IF M(R(I)+1,C(I))>3 THEN 870 740 IF M(R(I)-1,C(I))>3 THEN 870 750 A1=M(R(I),C(I)+1) 760 A2=M(R(I),C(I)-1) 770 A3=M(R(I)+1,C(I)) 780 A4=M(R(I)-1,C(I)) 790 IF A1=2 AND A2<4 AND A3<4 AND A4<4 THEN 620 800 IF A2=2 AND A1<4 AND A3<4 AND A4<4 THEN 620 810 IF A3=2 AND A1<4 AND A2<4 AND A4<4 THEN 620 820 IF A4=2 AND A1<4 AND A2<4 AND A3<4 THEN 620 830 IF A1=3 AND A2<4 AND A3<4 AND A4<4 THEN 620 840 IF A2=3 AND A1<4 AND A3<4 AND A4<4 THEN 620 850 IF A3=3 AND A1<4 AND A2<4 AND A4<4 THEN 620 860 IF A4=3 AND A1<4 AND A2<4 AND A3<4 THEN 620 870 NEXT I 880 GOSUB 2060 890 PRINT 900 I=P 910 GOSUB 490 920 PRINT ", Here are your legal moves for this turn" 930 PRINT 940 FOR I=1 TO 5 950 PRINT R(I);MID$(M$,C(I),1);" "; 960 NEXT I 970 PRINT:PRINT 980 INPUT "What is your move ";R$ 990 IF LEN(R$)=0 THEN R$="S" 1000 IF LEFT$(R$,1)="M" THEN R$="" ELSE 1030 1010 GOSUB 2060 1020 GOTO 900 1030 IF LEFT$(R$,1)="S" THEN R$="" ELSE 1060 1040 GOSUB 3230 1050 GOTO 900 1060 IF LEN(R$)<>2 THEN 1110 1070 IF ASC(MID$(R$,2,1))-64<1 THEN 1110 1080 IF ASC(MID$(R$,2,1))-64>12 THEN 1110 ELSE 1120 1090 IF VAL(R$)<1 THEN 1110 1100 IF VAL(R$)>9 THEN 1110 1110 PRINT "I didn't understand that - Try again ": GOTO 980 1120 R=VAL(LEFT$(R$,1)) 1130 C=ASC(RIGHT$(R$,1))-64 1140 FOR I= 1 TO 5 1150 IF R=R(I) AND C=C(I) THEN 1190 1160 NEXT I 1170 PRINT "That space was not included in the list..." 1180 GOTO 980 1190 A1=M(R-1,C) 1200 A2=M(R+1,C) 1210 A3=M(R,C+1) 1220 A4=M(R,C-1) 1230 IF A1<=1 AND A2<=1 AND A3<=1 AND A4<=1 THEN M(R,C)=2 ELSE 1250 1240 GOTO 1760 1250 IF A1>3 AND A2>3 AND A2<>A1 THEN GOSUB 2220:REM - LINE 2090 IS 1260 IF A1>3 AND A3>3 AND A3<>A1 THEN GOSUB 2220\REM THE MERGER SUB. 1270 IF A1>3 AND A4>3 AND A4<>A1 THEN GOSUB 2220 1280 IF A2>3 AND A3>3 AND A3<>A2 THEN GOSUB 2220 1290 IF A2>3 AND A4>3 AND A4<>A2 THEN GOSUB 2220 1300 IF A3>3 AND A4>3 AND A4<>A3 THEN GOSUB 2220 1310 IF A1<4 AND A2<4 AND A3<4 AND A4<4 THEN 1410 1320 IF M(R,C)>3 THEN 1760 1330 IF A1>3 THEN I=A1-3 1340 IF A2>3 THEN I=A2-3 1350 IF A3>3 THEN I=A3-3 1360 IF A4>3 THEN I=A4-3 1370 Q(I)=Q(I)+1 1380 S1(I)=S1(I)+100 1390 M(R,C)=I+3 1400 GOTO 1570 1410 FOR I=1 TO 5 1420 IF Q(I)=0 THEN 1460 1430 NEXT I 1440 IF M(R,C)<3 THEN M(R,C)=2 1450 GOTO 1760 1460 PRINT Z1$ 1470 GOSUB 3370 1480 PRINT "A new shipping company has been formed !" 1490 PRINT "It's name is ", 1500 RESTORE 1510 READ N,C$ 1520 IF I<>N THEN 1510 1530 PRINT C$ 1540 S(I,P)=S(I,P)+5 1550 Q(I)=1 1560 PRINT:PRINT:PRINT:PRINT 1570 IF A1=3 THEN S1(I)=S1(I)+500 1580 IF A2=3 THEN S1(I)=S1(I)+500 1590 IF A3=3 THEN S1(I)=S1(I)+500 1600 IF A4=3 THEN S1(I)=S1(I)+500 1610 IF A1=2 THEN S1(I)=S1(I)+100 ELSE 1640 1620 Q(I)=Q(I)+1 1630 M(R-1,C)=I+3 1640 IF A2=2 THEN S1(I)=S1(I)+100 ELSE 1670 1650 Q(I)=Q(I)+1 1660 M(R+1,C)=I+3 1670 IF A3=2 THEN S1(I)=S1(I)+100 ELSE 1700 1680 Q(I)=Q(I)+1 1690 M(R,C+1)=I+3 1700 IF A4=2 THEN S1(I)=S1(I)+100 ELSE 1730 1710 Q(I)=Q(I)+1 1720 M(R,C-1)=I+3 1730 IF S1(I)>=3000 THEN T1=I ELSE 1750 1740 GOSUB 3100 1750 M(R,C)=I+3 1760 FOR I=1 TO 5 1770 B(P)=B(P)+INT(.05*S(I,P)*S1(I)) 1780 NEXT I 1790 FOR I=1 TO 5 1800 IF Q(I)=0 THEN 2040 1810 PRINT:PRINT "Your current cash= $";B(P) 1820 PRINT:PRINT "Buy how many shares of "; 1830 RESTORE 1840 READ N,C$ 1850 IF I<>N THEN 1840 1860 PRINT C$; 1870 PRINT " at $";S1(I) 1880 PRINT TAB(5); "You now own ";S(I,P); 1890 INPUT R3$:IF LEN(R3$)=0 THEN R3$="0" 1900 IF R3$(1,1)="M" THEN R3$="" ELSE 1930 1910 GOSUB 2060 1920 GOTO 1810 1930 IF R3$(1,1)="S" THEN R3$="" ELSE 1960 1940 GOSUB 3230 1950 GOTO 1810 1960 R3=VAL(R3$) 1970 R3$="" 1980 IF R3*S1(I)<=B(P) THEN 2010 1990 PRINT "You only have $";B(P);" - Try again" 2000 GOTO 1810 2010 IF R3=0 THEN 2040 2020 S(I,P)=S(I,P)+R3 2030 B(P)=B(P)-(R3*S1(I)) 2040 NEXT I 2050 GOTO 590 2060 PRINT Z1$: REM SUBROUTINE - PRINT MAP 2070 PRINT TAB(22);"MAP OF THE GALAXY" 2080 PRINT TAB(21);"*******************" 2090 PRINT TAB(13);" A B C D E F G H I J K L" 2100 FOR R2=1 TO 9 2110 PRINT" ";R2;" "; 2120 FOR C2=1 TO 12 2130 PRINT" "; 2140 Z2=M(R2,C2) 2150 IF Z2=0 THEN Z2=Z2+1 2160 PRINT MID$(L$,Z2,1)" "; 2180 NEXT 2190 PRINT 2200 NEXT 2210 RETURN 2220 F1=A1-3: IF F1<0 THEN F1=0:REM SUBROUTINE - CALCULATES THE 2230 F2=A2-3: IF F2<0 THEN F2=0:REM SURVIVOR IN THE EVENT 2240 F3=A3-3: IF F3<0 THEN F3=0:REM OF A MERGER 2250 F4=A4-3: IF F4<0 THEN F4=0 2260 T=Q(F1) 2270 T1=F1 2280 IF Q(F2)>Q(F1) THEN T=Q(F2) ELSE 2300 2290 T1=F2 2300 IF Q(F3)>T THEN T=Q(F3) ELSE 2320 2310 T1=F3 2320 IF Q(F4)>T THEN T=Q(F4) ELSE 2340 2330 T1=F4 2340 IF F1=T1 OR A1<4 THEN 2370 2350 X=F1 2360 GOSUB 2470 2370 IF F2=T1 OR A2<4 THEN 2400 2380 X=F2 2390 GOSUB 2470 2400 IF F3=T1 OR A3<4 THEN 2430 2410 X=F3 2420 GOSUB 2470 2430 IF F4=T1 OR A4<4 THEN 2460 2440 X=F4 2450 GOSUB 2470 2460 RETURN 2470 PRINT Z1$ 2480 GOSUB 3370: REM SUBROUTINE - PERFORMS CALCULATIONS 2490 RESTORE: REM TO ACCOMPLISH A MERGER 2500 READ N,C$ 2510 IF X<>N THEN 2500 2520 C1$=C$ 2530 PRINT C1$; 2540 PRINT " has just been merged into "; 2550 RESTORE 2560 READ N,C$ 2570 IF T1<>N THEN 2560 2580 C2$=C$ 2590 PRINT C2$;"!" 2610 PRINT "Please note the following transactions." 2620 PRINT 2630 PRINT TAB(3);"OLD STOCK = ";C1$;" NEW STOCK = "; 2640 PRINT C2$ 2650 PRINT 2660 PRINT "PLAYER";TAB(10);"OLD STOCK";TAB(22);"NEW STOCK"; 2670 PRINT TAB(34);"TOTAL HOLDINGS";TAB(53);"BONUS PAID" 2680 FOR I=1 TO P1 2690 GOSUB 490 2700 PRINT TAB(10);S(X,I);TAB(22);INT((.5*S(X,I))+.5); 2710 PRINT TAB(34);S(T1,I)+INT((.5*S(X,I))+.5); 2720 X1=0 2730 FOR I1=1 TO P1 2740 X1=X1+S(X,I1) 2750 NEXT 2760 PRINT TAB(53);" $";INT(10*((S(X,I)/X1)*S1(X))) 2770 NEXT I 2780 FOR I=1 TO P1 2790 S(T1,I)=S(T1,I)+INT((.5*S(X,I))+.5) 2800 B(I)=B(I)+INT(10*((S(X,I)/X1)*S1(X))) 2810 NEXT I 2820 FOR I=1 TO 9 2830 FOR J=1 TO 12 2840 IF M(I,J)=X+3 THEN M(I,J)=T1+3 2850 NEXT J 2860 NEXT I 2870 A1=M(R-1,C) 2880 A2=M(R+1,C) 2890 A3=M(R,C+1) 2900 A4=M(R,C-1) 2910 F1=A3-3 2920 IF F1<0 THEN F1=0 2930 F2=A2-3 2940 IF F2<0 THEN F2=0 2950 Q(T1)=Q(T1)+Q(X) 2960 S1(T1)=S1(T1)+S1(X) 2970 IF S1(T1)=>3000 THEN GOSUB 3100 2980 F3=A3-3 2990 IF F3<0 THEN F3=0 3000 F4=A4-3 3010 IF F4<0 THEN F4=0 3020 S1(X)=100 3030 Q(X)=0 3040 FOR I=1 TO P1 3050 S(X,I)=0 3060 NEXT I 3070 PRINT:PRINT 3080 M(R,C)=T1+3 3090 RETURN 3100 GOSUB 3370: REM SUBROUTINE - CALCULATES STOCK SPLITS 3110 PRINT "The stock of ", 3120 RESTORE 3130 READ N,C$ 3140 IF T1<>N THEN 3130 3150 PRINT C$, 3160 PRINT " has split 2 for 1 !" 3170 S1(T1)=INT(S1(T1)/2) 3180 PRINT:PRINT 3190 FOR I1=1 TO P1 3200 S(T1,I1)=2*S(T1,I1) 3210 NEXT I1 3220 RETURN 3230 PRINT Z1$ 3240 PRINT 3250 PRINT "STOCK";TAB(30);"PRICE PER SHARE"; 3260 PRINT TAB(50);"YOUR HOLDINGS" 3270 FOR I3=1 TO 5 3280 IF S1(I3)=100 THEN 3340 3290 RESTORE 3300 READ N,C$ 3310 IF I3<>N THEN 3300 3320 PRINT C$, 3330 PRINT TAB(30);S1(I3);TAB(50);S(I3,P) 3340 NEXT I3 3350 RESTORE 3360 RETURN 3370 PRINT CHR$(7) 3380 PRINT TAB(22);"SPECIAL ANNOUNCEMENT !!!":PRINT 3390 PRINT 3400 RETURN 3410 PRINT Z1$ 3420 PRINT " Star lanes is a game of interstellar trading." 3430 PRINT "The object of the game is to amass the greatest amount" 3440 PRINT "of money. This is accomplished by establishing vast," 3450 PRINT "interstellar shipping lanes, and purchasing stock in" 3460 PRINT "the companies that control those trade routes. During" 3470 PRINT "the course of the game, stock appreciates in value as" 3480 PRINT "the shipping companies become larger. Also, smaller" 3490 PRINT "companies can be merged into larger ones, and stock" 3500 PRINT "in the smaller firm is converted into stock in the larger" 3510 PRINT "one as described below.":PRINT 3520 PRINT "Each turn, the computer will present the player with" 3530 PRINT "five prospective spaces to occupy on a 9 X 12 matrix" 3540 PRINT "(rows 1-9, columns A-L). The player, after examining the" 3550 PRINT "map of the galaxy to decide which space he or she wishes" 3560 PRINT "to occupy, responds with the row and column of that" 3570 PRINT "space (I.E., 7E, 8A, ETC). There are five possible moves" 3580 PRINT "a player can make.":PRINT:PRINT 3590 PRINT 3600 GOSUB 3620 3610 GOTO 3660 3620 INPUT "PRESS TO CONTINUE";X2$:PRINT CHR$(26) 3650 RETURN 3660 PRINT Z1$ 3670 PRINT " 1. A player can establish an unattached outpost - if" 3680 PRINT "he/she selects a space that is not adjacent to a star," 3690 PRINT "another unattached outpost, or an existing shipping lane," 3700 PRINT "that space will be designated with a `+'. He/she will" 3710 PRINT "then proceed with stock transactions, as listed below.":PRINT 3720 PRINT " 2. A player can add to an existing lane - if he/she" 3730 PRINT "selects space that is adjacent to one - and only one -" 3740 PRINT "existing shipping lane, the space he/she selects will be" 3750 PRINT "that shipping lane and will be designated with the first" 3760 PRINT "letter of the company that owns that lane. if there are" 3770 PRINT "any stars or unattached outposts also adjacent to the" 3780 PRINT "selected space, they, too, will be incorporated into the" 3790 PRINT "existing lane. Each new square adjacent to a star adds" 3800 PRINT "$500 per share, and each new outpost adds $100 per share" 3810 PRINT "to the market value of the stock of that company." 3820 PRINT:PRINT 3830 GOSUB 3620 3840 PRINT Z1$ 3850 PRINT " 3. He/she may establish a new shipping lane - if there" 3860 PRINT "are five or less existing shipping lanes established." 3870 PRINT "The player may, given the proper space to play, establish" 3880 PRINT "a new shipping lane. He/she may do this by occupying a" 3890 PRINT "space adjacent to a star or another unattached outpost," 3900 PRINT "but not adjacent to an existing shipping lane. If he/she" 3910 PRINT "establishes a new shipping lane, he/she is automatically" 3920 PRINT "issued 5 shares of the new company as a reward. He/she" 3930 PRINT "may then proceed to buy stock in any active company," 3940 PRINT "including the one just formed, as described below.":PRINT 3950 PRINT "The market value of the new stock is established by the" 3960 PRINT "number of stars and occupied spaces as described in #2" 3970 PRINT "above." 3980 PRINT:PRINT 3990 GOSUB 3620 4000 PRINT Z1$ 4010 PRINT " 4. He/she may merge two existing companies - if a player" 4020 PRINT "selects a space adjacent to two existing shipping lanes, a" 4030 PRINT "merger occurs. The larger company takes over the smaller" 4040 PRINT "company. (If both companies are the same size prior to the" 4050 PRINT "merger, then the survivor is determined by alphabetical order" 4060 PRINT "of the two company names - the earlier survives.)" 4070 PRINT "The stock of the surviving company is increased in value" 4080 PRINT "according to the number of spaces and stars added to its" 4090 PRINT "lane. Each players stock in the defunct company is exchanged" 4100 PRINT "for shares in the survivor on a ratio of 2 for 1. Also, each" 4120 PRINT "player is paid a cash bonus proportional to the percentage" 4130 PRINT "of outstanding stock he held in the defunct company." 4140 PRINT "NOTE: After a company becomes defunct through the merger" 4150 PRINT "process, it can reappear elsewhere on the board when, and if" 4160 PRINT "a new company is established." 4170 PRINT:PRINT 4180 GOSUB 3620 4190 PRINT Z1$ 4200 PRINT " Next the computer adds stock dividends to the player's" 4210 PRINT "cash on hand (5% of the market value of the stock in his" 4220 PRINT "possession), and offers him the opportunity to purchase" 4230 PRINT "stock in any of the active companies on the board." 4240 PRINT "Stock may not be sold, but the market value of each" 4250 PRINT "player's stock is taken into account at the end of the" 4260 PRINT "game to determine the winner. If the market value of a" 4270 PRINT "given stock exceeds $3000 at any time during the game," 4280 PRINT "that stock splits 2 for 1. The price is cut in half, and" 4290 PRINT "the number of shares owned by each player is doubled." 4300 PRINT 4310 PRINT "NOTE: The player may look at his/her portfolio at any" 4320 PRINT "time during the course of his/her turn by responding with" 4330 PRINT "`STOCK' to an input statement. Likewise, he/she can review" 4340 PRINT "the map of the galaxy by typing `MAP' to an input statement." 4350 PRINT:PRINT 4360 GOSUB 3620 4370 PRINT Z1$ 4380 PRINT:PRINT:PRINT:PRINT:PRINT:PRINT:PRINT:PRINT 4390 PRINT TAB(16);"** GAME ENDS AFTER 48 MOVES **" 4400 PRINT:PRINT:PRINT:PRINT 4410 PRINT "The player with the greatest net worth at that point is the winner." 4420 PRINT:PRINT 4430 FOR W=1 TO 2000:NEXT W 4440 RETURN 4450 PRINT Z1$ 4460 GOSUB 3370 4470 FOR W=1 TO 500:NEXT W:PRINT CHR$(7) 4480 FOR W=1 TO 500:NEXT W:PRINT CHR$(7) 4490 PRINT TAB(10)," THE GAME IS OVER - HERE ARE THE FINAL STANDINGS" 4500 PRINT:PRINT:PRINT:PRINT 4510 PRINT CHR$(7) 4520 PRINT "PLAYER";TAB(10);"CASH VALUE OF STOCK";TAB(33);"CASH ON HAND", 4530 PRINT TAB(50);"NET WORTH" 4540 PRINT 4550 FOR I=1 TO P1 4560 FOR J=1 TO 5 4570 D1(I)=D1(I)+(S1(J)*S(J,I)) 4580 NEXT J 4590 NEXT I 4600 FOR I=1 TO P1 4610 GOSUB 490 4620 PRINT TAB(10);"$";D1(I);TAB(33);"$";B(I); 4630 PRINT TAB(50);"$";D1(I)+B(I) 4640 NEXT I 4650 PRINT:PRINT:PRINT:PRINT 4655 INPUT "Do you want to play again (type Y or N)";ANS$ 4660 IF LEFT$(ANS$,1)="N" THEN SYSTEM 4670 IF LEFT$(ANS$,1)="n" THEN SYSTEM 4680 RESET 4685 PRINT CHR$(26) 4690 GOTO 195  4660 IF LEFT$(ANS$,1)="N" THEN SYSTEM 4670 IF LEFT$(ANS$,1)="n" THEN SYSTEM 4680 RESET 4685 PRINT CHR$(26) 4690 GOTS(J,I)) 4580 NEXT J 4590 NEXT I 4600 FOR I=1 TO P1 4610 GOSUB 490 4620 PRINT TAB(10);"$";D1(I);TAB(33);"$";B(I); 461 PRINT CHR$(26):PRINT:PRINT:PRINT:PRINT:PRINT 5 REM *** HUNT THE WUMPUS *** 10 DIM P(5) 15 INPUT "Do you want instructions (type Y or N)";ANS$ 17 IF LEFT$(ANS$,1)="N" THEN 35 18 IF LEFT$(ANS$,1)="n" THEN 35 22 PRINT:PRINT:PRINT 30 GOSUB 375 35 GOTO 80 80 REM *** SET UP CAVE (DODECAHEDRAL NODE LIST) *** 85 DIM S(20,3) 90 FOR J=1 TO 20 95 FOR K=1 TO 3 100 READ S(J,K) 105 NEXT K 110 NEXT J 115 DATA 2,5,8,1,3,10,2,4,12,3,5,14,1,4,6 120 DATA 5,7,15,6,8,17,1,7,9,8,10,18,2,9,11 125 DATA 10,12,19,3,11,13,12,14,20,4,13,15,6,14,16 130 DATA 15,17,20,7,16,18,9,17,19,11,18,20,13,16,19 135 DEF FNA(X)=INT(20*RND(1))+1 140 DEF FNB(X)=INT(3*RND(1))+1 145 DEF FNC(X)=INT(4*RND(1))+1 150 REM *** LOCATE L ARRAY ITEMS *** 155 REM *** 1-YOU, 2-WUMPUS, 3&4-PITS, 5&6-BATS *** 160 DIM L(6) 165 DIM M(6) 170 FOR J=1 TO 6 175 L(J)=FNA(0) 180 M(J)=L(J) 185 NEXT J 190 REM *** CHECK FOR CROSSOVERS (IE L(1)=L(2), ETC) *** 195 FOR J=1 TO 6 200 FOR K=1 TO 6 205 IF J=K THEN 215 210 IF L(J)=L(K) THEN 170 215 NEXT K 220 NEXT J 225 REM *** SET NO. OF ARROWS *** 230 A=5 235 L=L(1) 240 REM *** RUN THE GAME *** 245 PRINT:PRINT:PRINT "HUNT THE WUMPUS" 250 REM *** HAZARD WARNING AND LOCATION *** 255 GOSUB 585 260 REM *** MOVE OR SHOOT *** 265 GOSUB 670 270 ON O GOTO 280,300 275 REM *** SHOOT *** 280 GOSUB 715 285 IF F=0 THEN 255 290 GOTO 310 295 REM *** MOVE *** 300 GOSUB 975 305 IF F=0 THEN 255 310 IF F>0 THEN 335 315 REM *** LOSE *** 320 PRINT:PRINT "HA HA HA - You lose!" 325 GOTO 340 330 REM *** MOVE *** 335 PRINT:PRINT "HEE HEE HEE - The wumpus will get you next time!!" 340 FOR J=1 TO 6 345 L(J)=M(J) 350 NEXT J 355 PRINT:PRINT:INPUT "Do you want to play again (type Y or N)";A$ 356 IF LEFT$(A$,1)="N" THEN 1150 357 IF LEFT$(A$,1)="n" THEN 1150 360 PRINT:INPUT "Do you want the same setup (type Y or N)";AN$ 361 IF LEFT$(AN$,1)="N" THEN 170 362 IF LEFT$(AN$,1)="n" THEN 170 370 GOTO 230 375 REM *** INSTRUCTIONS *** 377 PRINT CHR$(26):PRINT:PRINT 380 PRINT "Welcome to `HUNT THE WUMPUS'" 385 PRINT " The wumpus lives in a cave of 20 rooms. Each room" 390 PRINT "has 3 tunnels leading to other rooms. (Look at a" 395 PRINT "dodecahedron to see how this works - if you don't know" 400 PRINT "what a dodecahedron is, ask someone)" 405 PRINT 410 PRINT " HAZARDS:" 415 PRINT " BOTTOMLESS PITS - Two rooms have bottomless pits in them." 420 PRINT " If you go there, you fall into the pit (and lose!)" 425 PRINT " SUPER BATS - Two other rooms have super bats. If you" 430 PRINT " go there, a bat grabs you and takes you to some other" 435 PRINT " room at random. (Which may be troublesome.)" 440 PRINT:INPUT "TYPE TO CONTINUE ";W9:PRINT CHR$(26) 441 PRINT:PRINT 445 PRINT " WUMPUS:" 450 PRINT " The wumpus is not bothered by hazards (he has sucker" 455 PRINT " feet and is too big for a bat to lift). Usually" 460 PRINT " he is asleep. Two things wake him up - You shooting an" 465 PRINT " arrow or you entering his room." 470 PRINT " If the wumpus wakes he moves (75% chance) one room" 475 PRINT " or stays still (25% chance). After that, if he is where you" 480 PRINT " are, he eats you up and you lose!" 485 PRINT 490 PRINT " YOU:" 495 PRINT " Each turn you may move or shoot a crooked arrow" 500 PRINT " MOVING: You can move one room (thru one tunnel)" 505 PRINT " ARROWS: You have 5 arrows. You lose when you run out" 510 PRINT " Each arrow can go from 1 to 5 rooms. You aim by telling" 515 PRINT " the computer the room numbers you want the arrow to go to." 520 PRINT " If the arrow can't go that way (if no tunnel), it moves" 525 PRINT " at random to the next room." 530 PRINT " If the arrow hits the wumpus, you win." 535 PRINT " If the arrow hits you, you lose." 540 PRINT:INPUT "TYPE TO CONTINUE ";W9:PRINT CHR$(26) 545 PRINT " WARNINGS:" 550 PRINT " When you are one room away from a wumpus or hazard," 555 PRINT " the computer says:" 560 PRINT " WUMPUS: `I smell a wumpus!'" 565 PRINT " BAT : `Bats nearby!'" 570 PRINT " PIT : `I feel a draft!'" 575 PRINT 580 RETURN 585 REM *** PRINT LOCATION & HAZARD WARNINGS *** 590 PRINT 595 FOR J=2 TO 6 600 FOR K=1 TO 3 605 IF S(L(1),K)<>L(J) THEN 640 610 ON J-1 GOTO 615,625,625,635,635 615 PRINT "I smell a wumpus!" 620 GOTO 640 625 PRINT "I feel a draft!" 630 GOTO 640 635 PRINT "Bats nearby!" 640 NEXT K 645 NEXT J 650 PRINT "You are in room "L(1) 655 PRINT "Tunnels lead to "S(L,1);S(L,2);S(L,3) 660 PRINT 665 RETURN 670 REM *** CHOOSE OPTION *** 675 PRINT:PRINT "Shoot or move " 680 INPUT "(Type 0 for SHOOT or 1 for MOVE)";I 685 IF I<>0 THEN 700 690 O=1 695 RETURN 700 IF I<>1 THEN PRINT CHR$(7):GOTO 675 705 O=2 710 RETURN 715 REM *** ARROW ROUTINE *** 720 F=0 725 REM *** PATH OF ARROW *** 735 PRINT "No. of rooms (1-5)"; 740 INPUT J9 745 IF J9<1 THEN 735 750 IF J9>5 THEN 735 755 FOR K=1 TO J9 760 PRINT "Room #"; 765 INPUT P(K) 770 IF K<=2 THEN 790 775 IF P(K)<>P(K-2) THEN 790 780 PRINT "Arrows aren't that crooked - try another room" 785 GOTO 760 790 NEXT K 795 REM *** SHOOT ARROW *** 800 L=L(1) 805 FOR K=1 TO J9 810 FOR K1=1 TO 3 815 IF S(L,K1)=P(K) THEN 895 820 NEXT K1 825 REM *** NO TUNNEL FOR ARROW *** 830 L=S(L,FNB(1)) 835 GOTO 900 840 NEXT K 845 PRINT "Missed" 850 L=L(1) 855 REM *** MOVE WUMPUS *** 860 GOSUB 935 865 REM *** AMMO CHECK *** 870 A=A-1 875 IF A>0 THEN 885 880 F=-1 885 RETURN 890 REM *** SEE IF ARROW IS AT L(1) OR AT L(2) 895 L=P(K) 900 IF L<>L(2) THEN 920 905 PRINT:PRINT "Aha! You got the wumpus!" 910 F=1 915 RETURN 920 IF L<>L(1) THEN 840 925 PRINT:PRINT "Ouch! Arrow got you!" 930 GOTO 880 935 REM *** MOVE WUMPUS ROUTINE *** 940 K=FNC(0) 945 IF K=4 THEN 955 950 L(2)=S(L(2),K) 955 IF L(2)<>L THEN 970 960 PRINT:PRINT "Tsk tsk tsk - Wumpus got you!" 965 F=-1 970 RETURN 975 REM *** MOVE ROUTINE *** 980 F=0 985 PRINT "Where to"; 990 INPUT L 995 IF L<1 THEN 985 1000 IF L>20 THEN 985 1005 FOR K=1 TO 3 1010 REM *** CHECK IF LEGAL MOVE *** 1015 IF S(L(1),K)=L THEN 1045 1020 NEXT K 1025 IF L=L(1) THEN 1045 1030 PRINT "Not possible -"; 1035 GOTO 985 1040 REM *** CHECK FOR HAZARDS *** 1045 L(1)=L 1050 REM *** WUMPUS *** 1055 IF L<>L(2) THEN 1090 1060 PRINT:PRINT "... Oops! Bumped a wumpus!" 1065 REM *** MOVE WUMPUS *** 1070 GOSUB 940 1075 IF F=0 THEN 1090 1080 RETURN 1085 REM *** PIT *** 1090 IF L=L(3) THEN 1100 1095 IF L<>L(4) THEN 1120 1100 PRINT:PRINT "YYYYIIIIEEEE . . . Fell in pit" 1105 F=-1 1110 RETURN 1115 REM *** BATS *** 1120 IF L=L(5) THEN 1130 1125 IF L<>L(6) THEN 1145 1130 PRINT:PRINT "Zap -- Super Bat Snatch! Elsewhereville for you!" 1135 L=FNA(1) 1140 GOTO 1045 1145 RETURN 1150 SYSTEM  1130 PRINT:PRINT "Zap -- Super Bat Snatch! Elsewhereville for you!" 1135 L=FNA(1) 1140 GOTO 10 *** PIT *** 1090 IF L=L(3) THEN 1100 1095 IF L<>L(4) THEN 1120 1100 PRINT:PRINT "YYYYIIIIEEEE . . . FÐ9Copyright (c) 1984, Kaypro Corporation MASMENU V. 5.226#> 6 #=+>6#=Ll$lQLlXlAڅ+[<+@H+aڅ+{҅+`w# .f++N+͌+w#O+{o|g +͌+w#p+!|a{9^#V*>>9}|ڷ+**"MASMENU:!"N""!"!! 9"!9^#V!0;w!9^#V##^#VBK?`i#DM`i~w`i^͔>\!"Nw*N ;`i^"N:!Ç#!9~#fo[;>)!9~#fo^#V^!-!;;)!9~#fo^#V#^ͼ>d!;!";)!9~#fo^#V#^ͼ>x!;!";)!9~#fo^#V#^ͼ>s!;;!À!U!!])"f|n!!B)!!&!=!S"<!S">!!2!!͎!9"@!!2!!͎!9"H!!2!!͎!9"D!!!8!͎!9"B!!!8!͎!9"F*f+!9s#r!9^#V!:0;*<"|b!"!9^#V!:"*f!!!ͮ*!9*fz-"W!W!W!*D͜W!"dW!"bW!*<#s#r"`!*fx*?!C!4!*D0!B!0!*< "<*<~!C!0!!"L*<[ !*<!!".!;"h|ʉ!9!9!l!j͂.!9*j+"jE%!"J!ß#*NA; \;+)*<^#V~#!"NØ*N|*N+"Lͪ MASMENU.DATr Can't find MASMENU.DAT:L":no&|’:no&|*|y!#+ [;s!!9DM|sJE%Ï!L"ʌ"DMÏ1×"DM!"`i!;ʮͱ9*J!;*<*>`i/ n&+*L[;O!B!0!*L#"L+[ !C!0!*L[ *Ln&#*L"!*L)^#V!>?*L|!B!0!*L+"L#[ !C!0!*L[ *Ln&#*L"!*L)^#V!>?*Lͪ *J!;FUͫ!"J!B!0!*<~!C!0!*N"L*<[ *Ln&#*L"!"N*L#X#n&@;{)~#!*L!;, ͦ>)^#V^#V^ͦ>!;) !B!0!*L[ !C!0!"L[ *Ln&#*L"!*L)^#V!>?, QZ `<  P P  G:! 9N#F!9^#V`i^#"!")PY^#V^#V! !9*|ʔ !L"n&!; #+^!9#+^!9Ñ n&| n& !;( ! !9*+"Ñ n&:u n&:"N *+"*|r ! !9*+"|r G Ñ #+^!9*+"î `i^#":! 9N#F*J!; *< *>`i)^#V##~ʵ !B!1!!B!0!*L"N*<~!C!1!!"J!`i)^#V!>%?*f*!9*> ">*L)*<^#V^#V*>#s#r!C!1!*>~!"L!C!0!*L*>[ *L*>`i)^#Vh !C!4!*D0*L[ :!9N#F*f+!) ) 4!9s#r=`i^!9^#Vs! ^#V!9^#V#s#r!9^#V###s! ^#V͈6͈6!9^#VBK;4+#|ʿ )!9~#fos#rÊ ! #! ^[;e !L")PY^#VW!ut*f+u*f+u*f!!ͮ*!9*f!!ͮ*!9!u t `i:!!r9^#V!>%?*f*!9W!DM|™ !ù !#+)!V9s#r [; â !p9^#V###^U2!!P!9=!`i~`i^! !;;!9~!93!!P!9=!`i^!!;x!9!V9`i#DM-DMxo!U!`i^!!;`i#DM^!)!T9~#ʽ)!T9^#V!9=!|`i^! \;`i^!9͉=!9s!`i#DM !9~!93!!P!9=!!9d=!9͉=!9DM*J!;ʒ*N#"N! `i#DM+s*N ;0`i#DM+s*N u;0`i#DM+s! `i#DM+s!-`i#DM+s*|ʸ!xû!s`i#DM+s*|! `i#DM+s!-`i#DM+s!d`i#DM+s!93!p9^#V###^*!;!"!*sN4ͱ9:!\9N#F!^9^#V`i#DM+^!! !9s!9"z`i#DM+^*#"+s`i^!0;ʋf!*s!9*H͜*H0!9͉=*@#^*@^#"!B!4!)~#)^#V͈6*@#^!9͉=!25<5<͑)s#r)~#:!)^#V!b9^#V=`iL!!!L!L!L!!!L2!2L2Lq!q*#T;*~/w#d;*~?G*^0123456789ABCDEF:!!9!VDM`i#DM+^!9`i~!!"*dDM$`i#DM+^!9`i~.!5!"*bDMH`i#DM`i~ʛ`i^!%!;ʉ!7{#+^!9~ʆfØ`i^!9C:! 9N#F!9^#V! ^#V"|*͈6! s#r!! s~#+^! !;`in&#s:! 9N#F! !!=!}2! ^K#*B^[;t!)s#rD*B~#ʐ*B^#V͈6! ^*Bs"*@;ʹ*+"! ^#V"*Bs#r!*~/*)s#r*^! 0;*^z*#"*~%*#"#:! 9N#F! ^P#*@^[;ʧ!"!"Ç*#"*2[;ʤ! !9ÀI*@~#*@^#V͈6! ^*@s! ^#V*@s#r!~R!#+"!2V ~:n& 0;:#n& !;O#:!4DM!!=!4! s#r! 9^`is`i:!4DM!!=! 9^`is!9^! s!9^! s!9^! s`i:!9^#V)! 9~#fo^#V! ^#VBKzk!!9^#V)!9~#fo^#V!>%?*f*!9W!!9^#V)!9~#fo^#V! s#rBK*F͜*F:! 9N#Fx$!ß+\;!"!#[;! !9Ø!!"!#[;!!!9ê`i^!"! !9!B!3!! ^#V͉=!5<;+[;ʁ!+#|ʥ! !9#Á! ^#V"ú*#"*~*^!9ó!#[;! !9!C!3!! !9`i^!"!?! !9#+[;T2!"!j# [;T`i^"! !9! !9! ^@;!! !9#[;!"Q!)PY^#V^#V"+*~0*#"+^!9 +\;Q! !90c`i^!"!C!0!!À#[;ʝ!!9y!B!0!:!DMý`i#DM*>###^`i[;`i)*>^#V~#nf͈6 ~#n f ͈6!u t ø:*|**LDM!*L)*<^#V^#V[;ʡ#+"!C!0!! !9!B!0!!vP!B!0!!B!1!!"! !9!C!1!`i\;T`i+DM#"!C!0!!"! !9*#"+[;1!B!0!"!v:!~*|ʅ!!"!!v!DM!*N)*<^#V^#V*N`i0;!`i#DM+"!C!0!!"! !9*#"+[;!B!0!"!vç*<^\;ʅ"!C!0!! !9!B!0!+#"!v!!C!0!"!!B!0!!"! !9 :!C!0!!B!4!!C!3!!C!1!!!9*0;J!! 9DM*U!K͟-UA:$$$.SUB:!DM! 9^! 9! 9^))))`i^!:<`is:! 9^#V!4DM!L"¹ë" !;!;͈6!!;!;F`i0;C!!9! !9!!9+! 9~#fo#s#r!;ʠ`i0;ʝ!!9! !9!!9+! 9~#fo#s#rR [;ʽ!!9! 9~#!!9#+s!9! 9~#fo+s#rë!u`i:! 9N#F`i [;5`i0!9:;:! 9N#F`i ;0!9`i u;0!9:! 9N#F!9^#V`i~ʰ`i#DM+^!9+Ì+#\;! !9ð:! 9N#F`i~`i#DM+^!9:! 9^#V͉=##4DM|3 !G !B)!9^#Vd=`i Out of memory:! 9N#F!9^#V`i~!!`i^! 0;!!`i^!: `i#DM+^!:ë +| ! !9+ä !`i^!!;!`i#DM+^!9`i#DM+^!9!`i#DM+^!9+l `i^! !;4!`i#DM+#\;V!! !94!:*|‡!!4"|‡!!!!B)*DMÔ!`i#DM*f+`iszʨ!Ï!`i*!;ʺ!!ý!* Out of memory:!!9!9^!9! 9^!9:!!9!=!9! 9^! !9!9^! !9:!"! 9~#d"E%!!9DM|":o&\;ʸ"!n͉=n`i#+s!u:o&+}2"!!9:no&|"!! 9~#"#!::no&DM|#!o!nd=:o&#}2`i:*|%#!"*|#*)~#ʷ#!8*"*)^#V^! !;!9s#r!*)^#VV !*)s#r*!;ʣ#!"ê#*#"!9~#-##!"#*#"*A;#*)~###!"!":%*J!;$*< $*>!$#n&[;ʔ$)^#V! ~#‘$!)^#V!>%?*f*!9W!)^#V! s#r$**[;$!*#"+oB>4@%?*f*!9!>p?%!!>%?*f*!9*f+!>?*0;4%*U!;%͟-!U!":%!"A:$$$.SUB:*h|F'! 9! 9!9!9͂.!9!9!9!97.!9^#V*j0;)'!!"!9^#V"j!9^#V! \;%*|%! !9~#fo5uû) :!9!;)͈6!!u$t%!u*t+u&t'u(t)!>%?*!9:! 9N#F!9>>?͂B!( s#r!9>>b@͂B!$ ^#V0;r*!$ s#r",x*:! 9N#F!( ^#VoB%?!$ ^#VaB>4@=?ͻ?:!9N#F!9^#V!!9s#r!9^#V!9~#fo;|!+(~#!+++`i#DM+s!9~#fo#s#r*@;ʃ+!,!9s.!9!29^#V :!9!9:!9.0! 9^!9^#Vs#r!9^!9^#Vs#r! 9^!9^#Vs#r:!9.0!9^!9^#Vs#r!9^!9^#Vs#r!9^!9^#Vs#r!9^!9^#Vs#r:!!"Z2!!"Z2!!"Z2!! Z2!$L2DM!4/#[;V/!$L2`i0;V/-/!;f/!! Ͷ1!;}/!À/!:! 9N#F`i^! 2! ^! 2! ^! 2! ^! 2! ^! 2! ^! 2! ^! 2! ^! 2!! 2! ! Z2:! 9N#F.P0!!=!Ͷ1`is!Ͷ1! s!Ͷ1! s!Ͷ1! s!Ͷ1! s!Ͷ1! s! Ͷ1! s!Ͷ1! s! ! Z2:!9^#V!:0!0!"!.!9^#V+DM! 9^#V!0;)1! 9~#fo+s#r+).^#V`iDM0!9^#V!N0;a1!9~#fo+s#r!:V1`i#DM!mPYDM)1`iu;#:.!! Z2!!$Z2!! Z2!!$Z2! ! Z2:! 9^#V! Z2!$L2DM!! Z2!$L2»1`i:`i < ;:!9N#F! 9^#V! Z2`i u;`i ;))))4+##^! A;:4!##s;44nf"2͈6:*2|\4*2|ʿ4!!!9=*2##͉=!9s*2##!9d=!9!9!2!9*2^#V"2\4!2!999999:!9^#V!͕<4!!9s#r;9*4!4DM~#5++nf!9~#fo͇<5nf!9~#fo5<͕ 6 #=:>6#=%: : >X: Aڒ:[I:@U:aڒ:{Ғ:`w# .s:ʌ:[:͙:w#\:{o|g ʌ:͙:w#}:!!|a{ !9^#V*9!9}|:*9"9|!¯d`i#D|g}o|/g}/o^#V#DM!99`i:|z2:͆;::;}͟;}}+;|:;!}:;|+;!}|S;}|?>o&zo&|m;}|>o&|o&z2:͆;::;||;/g}/o#z;/W{/_ß;DM!>2:))Ҳ;#}o|g; ::=2:ª;}::=2:ª;}DM!>)); =;}}/o|/g#}|:;+;|g}o{_2<|<|7g}o<{_2<)-<}}o|gN#F# N#F#zV<{Z<##^#VBK^#Vz<#yz<###h<#xu<#~#fo}|>?o&}|>o&{_2<|g}oª<|g}o~# x¿)>#>!|!9^#V#nE>#<>x#> +~E>)>!9~ z> z> z>Ï>!9~Aڏ>[ҏ>!}!9~aڏ>{z>!!9~0ڏ>:ҏ>z>!9~aڷ>{ҷ> o&!9~A>[> o&*݊h`i^!*?!*w#w#w#w*~#~#~#~">*V+^+V+^*>">*s#r#s#r*>**""*>w#f?*~1B#u?&B=ɯ<**###??è??ڂ?†?+ª?**#?**#?**#?**#@**#@*~/w#+@*~?G*^#V#~#fo))P@#H@DM*s#r#q#p*~?W*###~@~w+y@u@7~w+‹@‡@~#œ@Oc?*>͙@y2>*>͙@:>2>A>*w#@:>`?*>͙@y2>*>͙@A>*w#A:>`?!>w#A> 2>!>~w#/AO>!>#DAy_A!>4!>5)A!>5ʑA!>~w#lAO>!>#Ay_ASA>!>#šA*>~#­A*>~#½A!>w#A> 2>!>~w#AB>!>#ABA!>5A*>w#B͊?1B!͊?&B!<͊?1B&B͊?1B1B&B͊?&B1B͊?&B&B1B*s#r#6#6*s#r#ziB6#6*^#V5A*>w#B͊?1B!͊?&B!<͊?1B&B͊?1B1B&B͊?&B1B͊?&B&B1B*s#r#6#6*s#r#ziB6#6/Do not try to edit this file with a Word Processor!See instructions and edit MASMENU.TXTUsetheup-arrow and down-arrow keys to move the darkenedbartoyourchoice. Then, press the right-arrow key. To exit this menu, press ESCMaster MenuVersion % / 6.8Main Menu InstructionsWord processing }Spreadsheets}dBase II InfoStarMBasic & Games More Games\ CBasic Compiler SBasic CompilerTelecommunicationsHUtilities"Thismenuwill guide you in the use of your Kaypro.The highlighted portion of thescreenis a list ofthe major types of programs that you have onyourcomputer. Whenyouchoosean optiononthemain menu,a sub-menu will appear to the right of it.Choosing one of the options will run a program. Use the left arrowkeyto leave a sub-menuwithout running a program.Instructions Thischoicewill put onthescreen a file thatwilltellyou somethingaboutyour computer.Itwill displaythe text one pageata time. When youarethrough readingonepage, press to view the next page. WordStard Install WordStar:kThe Word PlusxCheck SpellingnnAlphabetic Sort}HyphenationAnagramFind a Word; Look up a WordS 1!Word CountH!"WordStaris a popular wordprocessing programdevelopedby MicroPro.Itcanbe customizedtoyour desireswiththe installation program.Micro Plan/"CalcStar"#CalcStar Dump#I$MicroPlanisa spreadsheetprogram producedbyChang Labs.It is easy to useand has a command menu on the screen. Run dBase II Q$Run dSort i$V%Run dGen ]%&Run Zip &'dBase Tutorial '(List Command Files ( )List Data Files ))d)List Index Files ))Install dBase II )*Install Zip (*o*dBaseIIisan information management toolthat allows easy manipulationof small andmedium size data- basesusingEnglish- likecommands. With dBaseIIyoucan createcomplete informationsystems andeasilyadd, delete, edit, display, sortandprintdata baseduponany criteria.Included withyourKAYPRO are severalsampledBase programs. Create a Form v*DataStar*:+Quick ReportsD+@,Report EditorF,#-Report Print*--Form Sort-.List Data Files/q/List Index Files/0List DEF Files 00List Report Files01List Reports411Thisprogramcreates theformsthatare usedbyDataStar. Notethat a form must becreated before any datacanbe entered. Itishighly recommendedfor this, and all other InfoStar programs,thatyou createallofyour files on the B: disk. MBasic 1OBasic2c2Biorhythm2,3Blackjackt34Horse RacesV44Rocket55Star Trek66Taxman77Star Traders 8u8Wumpus8%9MBasicisaBASIC interpreter.Itis easytouse for both thebeginnerand experienced programmer. It is an excellent language for thoseinterestedin learningabout programming.Clone Wars h9Alienso99Ladder9:Catchum:;Battlethe evil Clone Masterandtryto escapehisnasty clutches in this game of dexterity and wits.List Source Files ;List Programs;<Edit a program<<Compile a program<=Run a program9==Compile and Run=u>Thiswill list all of theCBasicsource files.Theyare signifiedbytheir .BAS extension.List source files>List programs>>Edit a program>a?Compile program??Run a program @_@Compile and Runw@@Thiswilllistall fileswitha.BAS extension.Automite AM.I.T.E.AAInstall new modemAkBThiscommunications program has everything thenovice and expert will ever need. It is the most user friendly package available, yet itisalsothe most powerful. If you are inexperienced in using telecommunications, we recommend that you use this version of MITE. Turn Off Computer=uBSpace on DiskvBBPrinter data rateCCSerial PrinterCDParallel PrinterDEConfigurationE{FBackup InstructionsFFBackup filesF!GRestore files*GfGExamine filesoGGFloppy FormatGHBeforeturningoff yourcomputeryou shouldwait until the lightlabeled'10 MB READY' goes out. This willinsurethat the diskisdeselected. Turningoffthe computerwiththe lightoncancause damagetoyourhard disk.This option leads to a sub-menu that contains programstohandle yourwordprocessing needs.Thisoption takes you to a sub-menu with two spread-sheet programs: CalcStarandMicro Plan.dBaseIIisAshton- Tate'sAssembly LanguageRelational DatabaseManagement System. It allows you tomanipulatedata- basesusingEnglish- like commands. You can createandmaintain databases,write programs,generate reports,andmuch more.InfoStarisadata basemanagement package which consists oftwoproducts: DataStarand ReportStar.Each of theseconsistof severalprograms. Theyarecompatible with both WordStar and CalcStar.MBasicis Microsoft's versionof BASIC. It isinterpretiveand easy to use. A variety of games is included.Theseare games which do not require a BASIC interpretertorun. They are all real time gamesthatchallenge your dexterity.CBasicisDigital Research'sversion of BASIC.Itisa pseudo-compiler.SBasicis a compiled, structuredversion of BASIC.Itismore difficultto learn, butismore powerful than the other BASICS.Thisoptionleads to programswhichallow yourKayproto interactwithother computers via a modem.Thischoice will take youtoasub-menu containingvarious CP/MandKaypro utility programs.read kaypro.lrn pause b: a:ws 0file name? a: Thisprogramallows youto customize your versionofWordStar howeveryouwant it. WordStarshouldbe installedon A:. The nameofthefile to installisWS.COM. Thenameforthe installedWordStar is alsoWS.COM. If you change the name of the installedversionit willnolongerwork with this menu.winstall ws TheWordPlusisa spellingchecker. It willtake a file, and findall the words it doesnotrecognize fromthefile.It thenshowsyoueach word and allows you to lookupthecorrect spellingofthe word andreplacethe misspellingwiththe correction. Any words which change length in yourfilearethen markedwith a special character.: :The Word Plus will not return to MASMENU by itself. After it is :done, type MASMENU and return when you see the A1> prompt. : pause tw b:0file to check? This program will take afileand check all ofthewords,then giveyoualistof thosewordswhich it doesn'tknow.Note that this merely gives you a list of possible misspellings, but does notallowyouto interactivelycorrect themlikeTheWord Plus.spell b:0file to check? pause Thisprogramtakes a fileand sorts all of thewordsinit alphabetically. CAUTION: This program will take the file you specifyandturnit intoa sorted list of allthewords in it. Youroriginalfile willberenamed as a .BAK file!b: a:dictsort 0file? a: Thisprogramwill hyphenatewordsthat arelongerthan10 characters.Youcan controlthe length of words to be hyphenated bytyping$n(for wordslongerthatn letters)afterthe filename. If you do notspecifyafile nameyoucantype wordsdirectlyinto theprogramandit willtellyou how to hyphenate them.hyphen b:0file to hyphenate? a: Anagramtakesan arbitrarystringand findsall anagrams of it. You can use wild cardswith this. For example,typing ???ee willfindall five letterwords have two two e's.anagram 0string of letters? pause Thisisan excellent toolforcrossword puzzle buffs. Given a patternofletters, thiswillfindall wordsthatmatch the pattern. It uses wild cards?and*. For example,thepattern do?willfindall threeletterwords beginningwithdo, while'do*' will find allwordsstarting with'do'. '?'s can be put anywhere in the word;'*'smayonly appear at the end.find 0pattern? pause Thisworkslikea spellingdictionary. You type in a word and thiswillfindall words that are spelled similarly.Thisis veryusefulwhen you don't know exactly how tospell a particular word,buthavea general idea.lookup 0word? pause Thisutilitywill countthenumberof wordsina file. It will display the total numberofwords, the number of unique words inthefile, and the numberofwords appearingonce.It will also build a .FRQ filewhichwill list allthe words in your file and the number of timeseachone appears.Typing$A afterthefilename willsortthe.FRQ file alphabetically.b: a:wordfreq 0file name? a: pause plan CalcStar is MicroPro's spreadsheetprogram. Itworksverymuch likeWordStar,and hence is easy to learn touse. It uses many ofthesame commands that WordStar does.cs Thisprogram lets you print out a listing of aCalcStar file. The listing can be written eithertoanother file, for editing with WordStar,orcanbe printeddirectlyto the printer.csdump dbase 0command file? dSortisfast, flexibleutilityfor sortingdBaseII databases.You may sortupto 32 fields atthesame time, in eitherascendingor descendingorder. Sortingtimeis very rapidandnot appreciably affected bythenumberof fields.dsort dGenmakes it easy to createandrun programsthat facilitateuseof a dBase II database. To createtheprograms, yousimply answer the questions displayed by thedGenutilities. dGenallowsyouto createprogramsto view,add to and edit files, create reports, makemailinglabels, andcreatemenus for yourdBaseII programs.dbase dgen Zipallowsyouto design the screens and printedforms used in yourprogramsby simplytyping them as youwantthemto appear.Itis recommendedthatyou putallzip files on yourB: drive. To do thiswhen asked for a filename,prefix it with b:zip Thiswill take you to acopy of dBase and a set of files geared to helpingyou learn all aboutdBase II. Once youfeelconfident withyourability to usedBase,youmay wanttoerasethis copyof dBase and all ofthefiles to give you more disk space.dbase lessons This will show you all ofthe command (.CMD) filesthatyouhave created.d 0Drive A or B?:*.cmd pause Thiswilldisplaya listofallof your data (.DBF) files.d 0Drive A or B?:*.dbf pause Thiswill list all of the index (.NDX) files that you have.d 0Drive A or B?:*.ndx pause Thisallowsyouto customizedBase II to your personal tastes.install Thisenablesyouto customizethescreen formatterto your own tastes.zipin formgen DataStaristhe data entrypartof InfoStar.Onceyou havecreateda DataStarform,use thisprogram to enter yourdata. Remember that your all of your files should be on the B: disk.datastar TheQuickReport programwill help you producereportsfrom yourdata base. This programprovidesfor reports which are easy tobuild, and quickly generated.Ifyou needamorecomplex reportthanthis programcan make, use theReportEdit Program.rgen Thisprogramis used togeneratereports thataretoo complex fortheQuick Report programtohandle. Thisincludes reports that have complicated headings,multiple filesinvolved,or require special print formatting.redit Thisprogramis used to prepare your report for printing according to the instructions in yourreport specification file.report 0report file? FormSortisthe ReportStar program for sorting data files and performingfile maintenance. All your file sorting needs can beaccomplishedwith thissimpleyet powerfulprogram. Pleasenoteboth the formtosort and the destinationform must already be defined.formsort 0Output file name? 1Input filename(s) to sort? Thiswill list all of theDataFiles generatedthrough DataStar.Theyare indicatedbytheir .DTA extension.d 0Drive A or B?:*.dta pause Thiswill list all of yourIndexFiles. Theyareusedby ReportStartoprint outinformationin sorted order.d 0Drive A or B?:*.ndx pause Thesearethefiles thatarecreatedby theformgenerator program.They contain thegeneralform informationneeded by DataStarand ReportStar.d 0Drive A or B?:*.def pause Thesearethefiles whichtell ReportStar howtoprintyour data.d 0Drive A or B?:*.rpt pause Thiswill list all of thereportsthat you havegeneratedand senttodisk instead of to the printer.d 0Drive A or B?:*.prn pause b: : :When you are done, type SYSTEM to return to menu : a:mbasic a: OBasicisanolder versionofMBasic. Severalofthe games thatarelistedare written in OBasic.b: : :When you are done, type SYSTEM to return to menu : a:obasic a: Biois a computerized biorhythmcalculator. Itwillplotyour mental,physicaland emotionalcyclesfor asmanydaysas you want.: :When you are done, type SYSTEM to return to menu : pause obasic bio Challenge the computer toagameof blackjack. The stakes arehigh,andthe rulesarestandard casinorules, includinginsurance, splits,anddoubling down.: :When you are done, type SYSTEM to return to menu : obasic blkjk Cometotrackand placeyourbets. Decidewhowill win, placeandshow. And don'tforgetyour binoculars!: :When you are done, type SYSTEM to return to menu : obasic horse Trytolandyour rocketonthemoon. Youcontrolyour velocityasyou descendtowardthe rockysurface.But don'tburnyour fuel too soon, as a lunar crashcanbemost unpleasant!: :When you are done, type SYSTEM to return to menu : obasic rocket Takecommandofthe Starship Enterprise in it'sneverending battleagainstthe KlingonEmpire. This gameincludeslevels ofdifficulty to make itchallengingfor everyonefromSpace CadetstoGalactic Admirals!: :When you are done, type SYSTEM to return to menu : obasic strtrk Try to beat the taxman at his own game. Pick numbersfrom the list provided,butdon't forget,thetaxman alwaysgetshis cut! Trytoend up with more than the Taxman.: :When you are done, type SYSTEM to return to menu : obasic taxman Becomeagalactic traderinthis excitinggameof multi-milliondollar, interstellarstock transactions.: :When you are done, type SYSTEM to return to menu : obasic trade Chasedowntheever elusive wumpus through histwenty-cave lair. Bewarethe bottomless pits and super bats!: :When you are done, type SYSTEM to return to menu : obasic wump clone SavetheEarthfrom invadingaliens. Six levelsofdifficulty keepthisgame challengingforall fledglingGalactic Defenders.aliens Help your lad traverse the maze of ladders in hispursuitof$. Grab the &'s but avoid theeverdangerous o's.Use the keypad to move around.ladder Catchum puts your cats (C)intoamazeof dots which you want to eat.Butbewarethe evilA's which try to putanendtoyour munching.Eat the tastymice(M) and $ forextrapoints. Thereare nine levels ofdifficultywhich canbesetbefore running the game.catchum d b:*.bas pause Thiswill show all of theCBasiccompiled programs.Theyall havea.INT extension.d b:*.int pause Thisallowsyouto edita CBasic program usingWordStar.Type theprogram name (1-8 letters)withoutthe .BAS extension.b: a:ws 0program name?.bas a: This turns a .BAS file intoanexecutable .INTfile.Typethe programnamewithout the .INT extension.b: a:cbas2 0program name? a: This runs a .INT file. Typethe program name withoutthe.INT extension.b: a:crun2 0program name? a: Thistakesa.BAS file,compilesit, then runs it. Even if thecompilationis notsuccessful,an attemptwillbe made torunthe .INT file ofthesamename. Typethe program name withoutthe.BAS extension.b: a:cbas2 0program name? a:crun2 0 a: d b:*.bas pause Thiswilllistall .COMfilesinthe current user.d b:*.com pause Thisallowsyouto edit an SBasic program usingWordStar.Type theprogramname withoutthe.BAS extension.b: a:ws 0program name?.bas a: Thiswillcompilea .BASfileintoan executable.COM file. Typethe program name withoutthe.BAS extension.sbasic 0program name?.bbx Thiswillexecutea .COMfile. Type the programnamewithout the .COM extension.b: 0program name? a: Thisoptiontakesa .BAS file and compiles then executes it. Type theprogramname withoutthe.BAS extension.sbasic 0program name?.bbx b: 0 a: AUTOMITE Thisversionofthe telecommunications package should be used onlyby those who are proficientinthe fieldof telecommunications, or byexperienced programmers only!MITE Runthis when you buy amodemforyour Kaypro computer. This willtellthe communications packagesexactly what kindofmodemyou have,so it will know how to use it.MINSTALL Thisoption will tell youhow much space is leftona disk. Type theoneletter drive name; 'A' or 'B', when asked.STAT 0Drive name?: pause Thisallowsyouto changethedata rate (Baudrate)fora serialprinter.If youareusinga parallelprinteryou don't need to do this. Tochangethebaud ratepermanently, use theconfiguration program.BAUDP Run this when you want toswitch to a serial printer.This assignmentis temporary,andgoes away the next time you eitherreset, or turn off your computer. To permanentlyswitch to aserial printer, use theconfiguration program.stat lst:=tty: Run this when you want toswitchtoa parallel printer. This assignmentis temporary, and will go awaywhenyour computerisreset or turnedoff.To permanentlyselecta parallelprinter, use theconfiguration program.stat lst:=lpt: This option allows you tochange the meaning ofthevectorkeys, (10key pad and arrow keys),thedefault printerassignment (serialvs parallel), andtheinitial baud rate assignments.Config Theoptiondisplays instructionsfor backing up large files onfloppies using the MUFBAR backup system.MUFDESC Thisoptionwill backupfilesonto floppies.MUFBACK Thisoption will copy files from floppy onto the hard disk.MUFREST This option allows you toexaminefiles backedupusingthe MUFBAR system.MUFLOOK This option allows you toformatafloppy diskette in Drive C:.FLPYFMT g Theoptiondisplays instructionsfor backing up large files onfloppies using the MUFBAR backup system.MUFDESC Thisoptionwill backupfilesonto floppies.MUFBACK Thisoption will copy files from floppy onto the hard disk.MUFREST This option allows you toexaminefiles backedupusingthe MUFBAR system.MUFLOOK This option allows you toformatafloppy diskette in Drive C-- -- -- English Language Menu Text File -- -- This file is processed by MASPREP to generate MASMENU.DAT. -- The .DAT file is used by MASMENU to control its actions. -- -- Version for the Kaypro Ten -- -- Revised: 04-19-84 -- Revised: 08-07-84 -- Revised: 8-29-84 sgr 6.6 -- Revised: 09-05-84 RWB 6.7 - Revised 9-06-8 sg 6.8 -- -- First, we have to define the ever-present cursor prompt -- "Use the up-arrow and down-arrow keys to move the darkened bar to your choice. Then, press the right-arrow key. To exit this menu, press ESC" -- -- Main menu title -- "Master Menu" -- -- Current version -- "Version % / 6.8" -- -- Main menu title -- "Main Menu" -- -- Clock time. This must be included even if the system has -- no clock. The format is: -- -- 12 for normal AM/PM time. -- 24 for military/European time. -- 12 -- -- Date format. The first character is the date separator, -- the next three are M, D, and Y in the order desired. -- Normal US format is "/MDY". Normal European format is "/DMY". -- "/mdy" -- -- Start defining menu groups -- "Instructions" "This menu will guide you in the use of your Kaypro. The highlighted portion of the screen is a list of the major types of programs that you have on your computer. When you choose an option on the main menu, a sub-menu will appear to the right of it. Choosing one of the options will run a program. Use the left arrow key to leave a sub-menu without running a program." { "Instructions",1 -- instruct file is in user #1 "This choice will put on the screen a file that will tell you something about your computer. It will display the text one page at a time. When you are through reading one page, press to view the next page." ** read kaypro.lrn pause ** } -- -- Word processing menu -- "Word processing" "This option leads to a sub-menu that contains programs to handle your word processing needs." { "WordStar",1 "WordStar is a popular word processing program developed by MicroPro. It can be customized to your desires with the installation program." ** b: a:ws $"file name?" a: ** "Install WordStar",1 "This program allows you to customize your version of WordStar however you want it. WordStar should be installed on A:. The name of the file to install is WS.COM. The name for the installed WordStar is also WS.COM. If you change the name of the installed version it will no longer work with this menu." ** winstall ws ** "The Word Plus",1 "The Word Plus is a spelling checker. It will take a file, and find all the words it does not recognize from the file. It then shows you each word and allows you to look up the correct spelling of the word and replace the misspelling with the correction. Any words which change length in your file are then marked with a special character." ** : :The Word Plus will not return to MASMENU by itself. After it is :done, type MASMENU and return when you see the A1> prompt. : pause tw b:$"file to check?" ** "Check Spelling",1 "This program will take a file and check all of the words, then give you a list of those words which it doesn't know. Note that this merely gives you a list of possible misspellings, but does not allow you to interactively correct them like The Word Plus." ** spell b:$"file to check?" pause ** "Alphabetic Sort",1 "This program takes a file and sorts all of the words in it alphabetically. CAUTION: This program will take the file you specify and turn it into a sorted list of all the words in it. Your original file will be renamed as a .BAK file!" ** b: a:dictsort $"file?" a: ** "Hyphenation",1 "This program will hyphenate words that are longer than 10 characters. You can control the length of words to be hyphenated by typing $n (for words longer that n letters) after the file name. If you do not specify a file name you can type words directly into the program and it will tell you how to hyphenate them." ** hyphen b:$"file to hyphenate?" a: ** "Anagram",1 "Anagram takes an arbitrary string and finds all anagrams of it. You can use wild cards with this. For example, typing ???ee will find all five letter words have two two e's." ** anagram $"string of letters?" pause ** "Find a Word",1 "This is an excellent tool for crossword puzzle buffs. Given a pattern of letters, this will find all words that match the pattern. It uses wild cards ? and *. For example, the pattern do? will find all three letter words beginning with do, while 'do*' will find all words starting with 'do'. '?'s can be put anywhere in the word; '*'s may only appear at the end." ** find $"pattern?" pause ** "Look up a Word",1 "This works like a spelling dictionary. You type in a word and this will find all words that are spelled similarly. This is very useful when you don't know exactly how to spell a particular word, but have a general idea." ** lookup $"word?" pause ** "Word Count",1 "This utility will count the number of words in a file. It will display the total number of words, the number of unique words in the file, and the number of words appearing once. It will also build a .FRQ file which will list all the words in your file and the number of times each one appears. Typing $A after the file name will sort the .FRQ file alphabetically." ** b: a:wordfreq $"file name?" a: pause ** } -- -- Spreadsheets -- "Spreadsheets" "This option takes you to a sub-menu with two spread-sheet programs: CalcStar and Micro Plan." { "Micro Plan",2 "Micro Plan is a spreadsheet program produced by Chang Labs. It is easy to use and has a command menu on the screen." ** plan ** "CalcStar",8 "CalcStar is MicroPro's spreadsheet program. It works very much like WordStar, and hence is easy to learn to use. It uses many of the same commands that WordStar does." ** cs ** "CalcStar Dump",8 "This program lets you print out a listing of a CalcStar file. The listing can be written either to another file, for editing with WordStar, or can be printed directly to the printer." ** csdump ** } -- -- dbase II -- "dBase II",10 "dBase II is Ashton- Tate's Assembly Language Relational Database Management System. It allows you to manipulate data- bases using English- like commands. You can create and maintain databases, write programs, generate reports, and much more." { "Run dBase II",10 "dBase II is an information management tool that allows easy manipulation of small and medium size data- bases using English- like commands. With dBase II you can create complete information systems and easily add, delete, edit, display, sort and print data based upon any criteria. Included with your KAYPRO are several sample dBase programs." ** dbase $"command file?" ** "Run dSort",10 "dSort is fast, flexible utility for sorting dBase II databases. You may sort up to 32 fields at the same time, in either ascending or descending order. Sorting time is very rapid and not appreciably affected by the number of fields." ** dsort ** "Run dGen",10 "dGen makes it easy to create and run programs that facilitate use of a dBase II database. To create the programs, you simply answer the questions displayed by the dGen utilities. dGen allows you to create programs to view, add to and edit files, create reports, make mailing labels, and create menus for your dBase II programs." ** dbase dgen ** "Run Zip",10 "Zip allows you to design the screens and printed forms used in your programs by simply typing them as you want them to appear. It is recommended that you put all zip files on your B: drive. To do this when asked for a file name, prefix it with b:" ** zip ** "dBase Tutorial",9 "This will take you to a copy of dBase and a set of files geared to helping you learn all about dBase II. Once you feel confident with your ability to use dBase, you may want to erase this copy of dBase and all of the files to give you more disk space." ** dbase lessons ** "List Command Files",10 "This will show you all of the command (.CMD) files that you have created." ** d $"Driv o B?":*.cmd pause ** "List Data Files",10 "This will display a list of all of your data (.DBF) files." ** d $"Driv o B?":*.dbf pause ** "List Index Files",10 "This will list all of the index (.NDX) files that you have." ** d $"Driv o B?":*.ndx pause ** "Install dBase II",10 "This allows you to customize dBase II to your personal tastes." ** install ** "Install Zip",10 "This enables you to customize the screen formatter to your own tastes." ** zipin ** } -- -- InfoStar -- "InfoStar",7 "InfoStar is a data base management package which consists of two products: DataStar and ReportStar. Each of these consist of several programs. They are compatible with both WordStar and CalcStar." { "Create a Form",7 "This program creates the forms that are used by DataStar. Note that a form must be created before any data can be entered. It is highly recommended for this, and all other InfoStar programs, that you create all of your files on the B: disk." ** formgen ** "DataStar",7 "DataStar is the data entry part of InfoStar. Once you have created a DataStar form, use this program to enter your data. Remember that your all of your files should be on the B: disk." ** datastar ** "Quick Reports",7 "The Quick Report program will help you produce reports from your data base. This program provides for reports which are easy to build, and quickly generated. If you need a more complex report than this program can make, use the Report Edit Program." ** rgen ** "Report Editor",7 "This program is used to generate reports that are too complex for the Quick Report program to handle. This includes reports that have complicated headings, multiple files involved, or require special print formatting." ** redit ** "Report Print",7 "This program is used to prepare your report for printing according to the instructions in your report specification file." ** report $"report file?" ** "Form Sort",7 "Form Sort is the ReportStar program for sorting data files and performing file maintenance. All your file sorting needs can be accomplished with this simple yet powerful program. Please note both the form to sort and the destination form must already be defined." ** formsort $"Output file name?" $1"Input filename(s) to sort?" ** "List Data Files",7 "This will list all of the Data Files generated through DataStar. They are indicated by their .DTA extension." ** d $"Driv o B?":*.dta pause ** "List Index Files",7 "This will list all of your Index Files. They are used by ReportStar to print out information in sorted order." ** d $"Driv o B?":*.ndx pause ** "List DEF Files",7 "These are the files that are created by the form generator program. They contain the general form information needed by DataStar and ReportStar." ** d $"Driv o B?":*.def pause ** "List Report Files",7 "These are the files which tell ReportStar how to print your data." ** d $"Driv o B?":*.rpt pause ** "List Reports",7 "This will list all of the reports that you have generated and sent to disk instead of to the printer." ** d $"Driv o B?":*.prn pause ** } -- -- Basic and games -- "MBasic & Games" "MBasic is Microsoft's version of BASIC. It is interpretive and easy to use. A variety of games is included." { "MBasic",3 "MBasic is a BASIC interpreter. It is easy to use for both the beginner and experienced programmer. It is an excellent language for those interested in learning about programming." ** b: : :When you are done, type SYSTEM to return to menu : a:mbasic a: ** "OBasic",3 "OBasic is an older version of MBasic. Several of the games that are listed are written in OBasic." ** b: : :When you are done, type SYSTEM to return to menu : a:obasic a: ** "Biorhythm",3 "Bio is a computerized biorhythm calculator. It will plot your mental, physical and emotional cycles for as many days as you want." ** : :When you are done, type SYSTEM to return to menu : pause obasic bio ** "Blackjack",3 "Challenge the computer to a game of blackjack. The stakes are high, and the rules are standard casino rules, including insurance, splits, and doubling down." ** : :When you are done, type SYSTEM to return to menu : obasic blkjk ** "Horse Races",3 "Come to track and place your bets. Decide who will win, place and show. And don't forget your binoculars!" ** : :When you are done, type SYSTEM to return to menu : obasic horse ** "Rocket",3 "Try to land your rocket on the moon. You control your velocity as you descend toward the rocky surface. But don't burn your fuel too soon, as a lunar crash can be most unpleasant!" ** : :When you are done, type SYSTEM to return to menu : obasic rocket ** "Star Trek",3 "Take command of the Starship Enterprise in it's never ending battle against the Klingon Empire. This game includes levels of difficulty to make it challenging for everyone from Space Cadets to Galactic Admirals!" ** : :When you are done, type SYSTEM to return to menu : obasic strtrk ** "Taxman",3 "Try to beat the taxman at his own game. Pick numbers from the list provided, but don't forget, the taxman always gets his cut! Try to end up with more than the Taxman." ** : :When you are done, type SYSTEM to return to menu : obasic taxman ** "Star Traders",3 "Become a galactic trader in this exciting game of multi-million dollar, interstellar stock transactions." ** : :When you are done, type SYSTEM to return to menu : obasic trade ** "Wumpus",3 "Chase down the ever elusive wumpus through his twenty-cave lair. Beware the bottomless pits and super bats!" ** : :When you are done, type SYSTEM to return to menu : obasic wump ** } -- -- Games -- "More Games" "These are games which do not require a BASIC interpreter to run. They are all real time games that challenge your dexterity." { "Clone Wars",3 "Battle the evil Clone Master and try to escape his nasty clutches in this game of dexterity and wits." ** clone ** "Aliens",3 "Save the Earth from invading aliens. Six levels of difficulty keep this game challenging for all fledgling Galactic Defenders." ** aliens ** "Ladder",3 "Help your lad traverse the maze of ladders in his pursuit of $. Grab the &'s but avoid the ever dangerous o's. Use the keypad to move around." ** ladder ** "Catchum",3 "Catchum puts your cats (C) into a maze of dots which you want to eat. But beware the evil A's which try to put an end to your munching. Eat the tasty mice (M) and $ for extra points. There are nine levels of difficulty which can be set before running the game." ** catchum ** } -- -- CBasic and its accomplices -- "CBasic Compiler" "CBasic is Digital Research's version of BASIC. It is a pseudo-compiler." { "List Source Files",4 "This will list all of the CBasic source files. They are signified by their .BAS extension." ** d b:*.bas pause ** "List Programs",4 "This will show all of the CBasic compiled programs. They all have a .INT extension." ** d b:*.int pause ** "Edit a program",4 "This allows you to edit a CBasic program using WordStar. Type the program name (1-8 letters) without the .BAS extension." ** b: a:ws $"program name?".bas a: ** "Compile a program",4 "This turns a .BAS file into an executable .INT file. Type the program name without the .INT extension." ** b: a:cbas2 $"program name?" a: ** "Run a program",4 "This runs a .INT file. Type the program name without the .INT extension." ** b: a:crun2 $"program name?" a: ** "Compile and Run",4 "This takes a .BAS file, compiles it, then runs it. Even if the compilation is not successful, an attempt will be made to run the .INT file of the same name. Type the program name without the .BAS extension." ** b: a:cbas2 $"program name?" a:crun2 $0 a: ** } -- -- SBasic and friends -- "SBasic Compiler" "SBasic is a compiled, structured version of BASIC. It is more difficult to learn, but is more powerful than the other BASICS." { "List source files",5 "This will list all files with a .BAS extension." ** d b:*.bas pause ** "List programs",5 "This will list all .COM files in the current user." ** d b:*.com pause ** "Edit a program",5 "This allows you to edit an SBasic program using WordStar. Type the program name without the .BAS extension." ** b: a:ws $"program name?".bas a: ** "Compile program",5 "This will compile a .BAS file into an executable .COM file. Type the program name without the .BAS extension." ** sbasic $"program name?".bbx ** "Run a program",5 "This will execute a .COM file. Type the program name without the .COM extension." ** b: $"program name?" a: ** "Compile and Run",5 "This option takes a .BAS file and compiles then executes it. Type the program name without the .BAS extension." ** sbasic $"program name?".bbx b: $0 a: ** } -- -- Telecommunications -- "Telecommunications" "This option leads to programs which allow your Kaypro to interact with other computers via a modem." { "Automite",6 "This communications program has everything the novice and expert will ever need. It is the most user friendly package available, yet it is also the most powerful. If you are inexperienced in using telecommunications, we recommend that you use this version of MITE." ** AUTOMITE ** "M.I.T.E.",6 "This version of the telecommunications package should be used only by those who are proficient in the field of telecommunications, or by experienced programmers only!" ** MITE ** "Install new modem",6 "Run this when you buy a modem for your Kaypro computer. This will tell the communications packages exactly what kind of modem you have, so it wil know how to us it." ** MINSTALL ** } -- -- CP/M Utilities -- "Utilities" "This choice will take you to a sub-menu containing various CP/M and Kaypro utility programs." { "Turn Off Computer",0 "Before turning off your computer you should wait until the light labeled '10 MB READY' goes out. This will insure that the disk is deselected. Turning off the computer with the light on can cause damage to your hard disk." ** ** "Space on Disk",0 "This option will tell you how much space is left on a disk. Type the one letter drive name; 'A' or 'B', when asked." ** STAT $"Drive name?": pause ** "Printer data rate",0 "This allows you to change the data rate (Baud rate) for a serial printer. If you are using a parallel printer you don't need to do this. To change the baud rate permanently, use the configuration program." ** BAUDP ** "Serial Printer",0 "Run this when you want to switch to a serial printer. This assignment is temporary, and goes away the next time you either reset, or turn off your computer. To permanently switch to a serial printer, use the configuration program." ** stat lst:=tty: ** "Parallel Printer",0 "Run this when you want to switch to a parallel printer. This assignment is temporary, and will go away when your computer is reset or turned off. To permanently select a parallel printer, use the configuration program." ** stat lst:=lpt: ** "Configuration",0 "This option allows you to change the meaning of the vector keys, (10 key pad and arrow keys), the default printer assignment (serial vs parallel), and the initial baud rate assignments." ** Config ** "Backup Instructions",0 "The option displays instructions for backing up large files on floppies using the MUFBAR backup system." ** MUFDESC ** "Backup files",0 "This option will backup files onto floppies." ** MUFBACK ** "Restore files",0 "This option will copy files from floppy onto the hard disk." ** MUFREST ** "Examine files",0 "This option allows you to examine files backed up using the MUFBAR system." ** MUFLOOK ** "Floppy Format",0 "This option allows you to format a floppy diskette in Drive C:." ** FLPYFMT ** } tion displays instructionMUFBAR backup system." ** MUFDESC ** "Backup files",0 "This option will backup files onto floppies." ** MUFBACK ** "Restore files",0 "This option will copy files from floppy onto the hard disk." ** MUFREST ** "Examine file,8MASMENU Preprocessor Version 5.0 05-04-84 Copyright (c) 1984, Kaypro Corporation >K+ A0A0A0A?u=z=========<<<<<<-<-<-<-<-<-<-<-<ͤ !!!+(8!:o&*L.Lsmdy%!'! !"!9^#V!9^#V,!͔" !<%!E!y!!'!"!"!"9)&ʌ!'!'!'!!'!'|!!*$*9)&|* )&ʏ*)&ʏ!'!@'|*"9)&ʴ!Z'!'|*J)&á*#^L*#s*##^L*##s*###^L*###s*!ͺJ!m*aKʡ!d*aKʡ!y*aKʡDo not try to edit this file with a Word Processor!See instructions and edit MASMENU.TXT Pass 1: Reading %s [1] The first line in the .TXT file must be the cursor movement line Check the instructions and try againcursor movement line The second line in the .TXT file must be amenu screen titlemenu title The third line in the .TXT file must be a version header.menu version The fourth line in the .TXT file must be the main menu titlemain menu title The fifth line in the .TXT file must be the 24/12 hour indicator The sixth line in the .TXT file must be the date format%!*#"U&!|*! '*!! 'G *+"!!!9s#r99*)&ʨ *|¨ *)&/*!? 'G !9~#fo#s#r+ U&j*!] 'G *+"!9^#V! !*$ͨ *hL|ʧutò!9s#r NLhL!utut9& 9)&*! '*DMU& *! '!DM9% !DM`iu*)&F *! 'G ! !!*͹!9 *hL9&ʐ !͔utß  + hL*| !9~# *! ' *| !9~# *! '*+"!9^#V Missing closing '}' at line %d Menus nested more than %d at line %d Expected a string at line %d Too many menu entries at line %dmenu title User number expected at line %d User number too big, line %d Expected a description at line %ddescriptive text Missing '}' at line %d Extra '}' at line %d%*)&M *! 'G *J) !!9s#r!*DMy `i#DM`i~ |ʖ `i^! :&t `i^!$&ʵ ! ^K ! ^!"&ʵ `i#DM^K `i#DM+^!9s#r !0!9s#r`i^!")&' !#+s!9^#V#+s`i+DMò !#+s!9^#V#+s`i#DM`i~ʆ `i^! )&ʆ `i^!")&ʆ `i#DM+^#+sL `i^!")&ʤ *!" 'G !#+s `i^#+s!t !u!9!9^#VhL!9^#Vͼ"!9UL Expected '**' submit lines, line %d Line %d, $" line not ended with a "%*#"T&^ !| '!! '!< Too many fatal errors! %s file unchanged.%*| ! !"!"*+"*"%!!'!"!"! !L("**& !#!*|2!5!n.*:o&n.*:o&!aK.'n.*:o&!aK.'n.*:o&!aK.'n.!9*n+hL*!.!NL{L*ͷ*!9!DM`i#DM`iT&0**-| *n.*!n.*1*!n.*!n.*!n.*;!9*n+hL!! 9UL{L*ͷ*!9*!9UL@LNO.!9UL@LN@LM{L!'*/*/!%J Pass 2: Building %s [2]w+ Final file size, %ldkMASMENU.$$$%!!9^#VBKO`i^#VBKx^#H*n.!9^#VBK|`i^#VBKx`iUL{Lͱ`i ULLʱ*!n.þ*!n.*! ^n.`i*n+hL*!! u*!n.!9*n+hL!9^#V! UL{Lͱ!9^#V! NLhL!9*n+hL!!9^#V!UL{L*ͷ*!9*!!9 !! 9UL{L*ͷ*!9!9^#VBKö`i^#VBKx:`i##~#7!9*n+hL!`iUL@LM{L*ͷ*!9*!!9 !!9UL{L*ͷ*!9! ^#V1ï%!9^#VBKS`i^#VBKx`i ULL!9*n+hL`i UL{Lͱ!9*n+hL!`iUL{L*ͷ*!9*!!9 !! 9UL{L*ͷ*!9`i ULL|!9*n+hL`i UL{Lͱ!9*n+hL!`iUL@LM{L*ͷ*!9*!!9 !! 9UL{L*ͷ*!9L!9^#VBKÒ`i^#VBKxʰ`i##~#ʭ! ^#V;Ë%!!9UL{L*ͷ*!9**-DM|`i&!'*n.*!n. Bizarre end of file!=_=:j=  %*|J!DM*|[!`i!"!"!" DM*&ʍe!"!*DM DM-&ʺ  )&ʷèJ!-DM!"Y',`{g}n*u-"K0`i" DMK!"* &PY"*!F'G J Didn't expect '%c' at line %d%*DM`i*&ʣ DM*&ʕ!u!*#+s`i#+s DMu%! 9N#F!9^#V!9^#V+`i"'~ʛ`i^! &!`is`i#DM*'#"'`i^z!")"+*)T&ʹ`i^zʹ`i^! &d`i^! &d`i#DM*)#")G*+#"+`i^! )&ʶ`i^z‘*):&ʑ`i^!&ʧ`i#DMî*)#")`i#DMk"*+&*!'! *'s*'#DMe`i~d*)U&U`i+DM^! )&*)+")`i+DM^! &6*)+")`i#DM! `i#DM+s*'a! `i#DM+se+T&ʘ*!9^#V!'!`i+DMs Word too long at line %d Too many %s lines, at line # %d%!69N#F!49^#V!"1#n& )&Un& &3#+)!9s#rn&&K#R*1#"1|^h+`i*1.'"-|*-&"/*-U&ʮ*/|®*-U&ʮ!"/*/U&*/+)!9^#Vs*/*1"1a% DM`i )&`i )&`i )&`i )&`i%*|1!*DM|S* &J͆!"`i**-%DM)&`i &z͆`i &`i &ʘ*3|S`i &S`i &¿`i &¿!!"3`i &! `i!"!%!9N#F!9*n+hL*!J#I*!9!9UL%! 9N#FJ!9~#foU&m*!9^#V!n'!`i!9~#fo+s %s too long at line %d%*#"*2n&¯*!'ü!l!.͖, [%d]%! 9^" &*+"%!*DM*|j `is!")&jT&+T&C*!r'G V &V! `is )&g`i#DM!`is String too long at line %d%! 9N#FJ#*7T&ʽ!"7 !"5*5ͺJ*5"5.'%!9N#F!9^#V!@!ͺJ!L!ͺJ!"!9s#r!9s#r`i+DM|m##nf^!-&nf#^!?&nf#^KO&ʢ|Ž!9~#ʙ!X'!nf#^KX&*|!m'!"nf!'j|!9~#!'|#!9~##!'|Onf!ͺJ!!!9s#rjnf!ͺJ!!9s#r-|ʀ!'!!L("|¥!'!o&zo&|f&}|>o&|o&z2%&:%&||&/g}/o#z&/W{/_Ø&DM!>2%))ҫ&#}o|g& :%=2%£&}:%=2%£&}DM!>))& =&}}/o|/g#}|3&$&|g}o{_+'|'|7g}o'{_+')&'}}o|gN#F# N#F#zO'{S'##^#VBK^#Vzy'#ys'###a'#xn'#~#fo}|>?o&}|>o&{_+'|g}o£'|g}o~# x¸'!9%~#'!'|Q%!l"'!9!9^#V!5(1%! 9^#V"'!9!9^#V!5(1%*'!9^#V͖,%!aDM`i~z(`i DM̀'w(!V(!9^#V#^!+&!9^#V^r)|ʬ(!ï(!!9^#V=! s!&(!Å)|(!(!&!9^#V=! s!& )!Å)|)!)!&!9^#V=! s!&F)!!NL{L! ^[H!9Å)!"W!Y'r(w(a)h)!! s!! s#r!`is#r! s#r! s#r`i%!9N#F!!9s#r)!9~#fo#s#r!9^#V!9~#foT&@*!9^#V*+|=*!9^#V*-&.*!9^#V`i#DM+s))!9^#V%! 9N#F!9^#V!9~#fo&!z*#͎'ʮ*!9^#V`i#DM+^n.&ʫ*!s*!9^#V%!9N#F! ^!%*!ͤ/*!'+!9^#V!&'+`i~#'+!9`i^#V! ^#V.'OͧLUL'MhL!! s#r`is#r!9^#V!9UL{L! ^[H!9@L͍Oj+!!%!9N#F!9!NL{L! ^[H!9hL! ^!%+!9! ^#V`i^#V.'OͧLULMhL ,`i~# ,!9`i^#V! ^#V.'OͧLUL'MhL!9UL%! 9N#F`i~J,!l`i#DM+^͖,&G,! ,!l! ͖,%! 9N#F`i~ʒ,!9^#V`i#DM+^͖,&ʏ,!d,!%! 9N#F!9^#V!PY%DM`i &,! n.&,!n.%! 9^#V*-DM&-! 9^#V*-&-!'PY&%! 9N#F! ^#V`i^#V̀'-! ^!%^-!!`in&%s`i~#„-0! ^#V! ^#V! ^EB:&-|½-!-!`in&&s!! ^#V`is#r! s#r`i~#fo#s#r+^!%%!w!9^#Vn.%! 9N#F!9^#Vn.T&F.!!9^#V`i͛'n.T&k.!`i%!9N#F! ^#V`i^#V̀'ʣ.! 9^#V!%ͤ/! 9^#V`i~#fo#s#r+s!%%!!9^#Vͤ/%!aDM`i͎'/`i DM/.%!9N#F!!9s#r`i~ʒ/! ^!%I/!ͤ/!9s#r! ^*?!9~#fo&s#r! ^!%ʒ/*! ^#Vs#r! ^#V"!! s!9^#V%! 9N#F! ^!%0! ^#V`i^#V.'! ^#V! ^͉E&0!`in&&s!!9^#V!&G0!`in&%s!`is#r! s#r!`i~#X00! ^#V!&ʑ0!!9! ^͉E&/!9^#V! ^#V`is#r! ^#V! ^#V! s#r!`in&&s!9^#V`i~#fo#s#r+s!%%!9N#F! ^#V!&1`i! s#r*|61*!9s#r*^#V"]1! ^#V !!9s#rz]1!! s#r1!`in&&s!9^#V! s#r1060123456789abcdef%! 9^#V"1!9!9^#V!11!*1s%! 9^#V*1#"1+s!%%!N9N#F!P9^#V#+^z6%&6!!9s!!D9s#r! !B9s#r!!@9s#rn&-&p2!!D9s#r#+^0&ʇ2!0!B9s#r!!>9s#r#+^!09&29:&2!>9^#V! &!>9s#rÒ2.&13!!@9s#r#+^!09&139:&13!@9^#V! &!@9s#r2l&q3#+^!:9!T9~#fos#rULhL4d&ʣ3!:9!T9~#fo##s#r++^#VOhL4e&3f&3g&3!9!T9~#fos#rOO4!:9!T9~#fo##s#r++^#VͷOhLú5!9!!>9UL{L\7!9!49s#r5!:9UL@L͍Oʏ4!9! !>9ULͶL{L6!9!49s#r!-!69~#fo+s#rsò4!9! !>9UL{L6!9!49s#r5!9! !>9UL{L\7!9!49s#r5!9!!>9UL{L\7!9!49s#r5!:9ULO!49s#rJ!89s#r5e&55!85!!B9^#V!&O5!W5!B9^#V!9! 9OOO!9! 9!49s#rJ!89s#r!!@9s#r5!:9ULO!9!69s#rs5Y'o4d<4u4x4s5e#5f#5c55!9!49~#fo.'!89s#r!89^#V!@9~#foU&6!@9^#V!89s#r!D9~#W6!>9~#fo+s#r#!89~#foU&W6!B9^#V`i%&6!!69s#rt6!69~#fo#s#r!49^#V~ʴ6!69^#V!@9~#foT&ʴ6!49~#fo#s#r+^`i%e6!D9~#6!>9~#fo+s#r#!89~#foU&6! `i%þ66`i%1%!9N#F!9^#V`iO{L!9UL͓L;NO1^+s! 9`iOͧLULNhLL7%!9N#F!9^#V! 9UL@L͍O8! 9ULO%! 9!9UL@L͸M@L=MhL`i'O{L!9UL͓L;NO)1^+s! 9`i'OͧLULNhL!9UL{L6!9O*938'G8'*%DM*%o&'e8o&'*%*+++*%DM*%!9N#F#^#Vkb6#> 6 #=8>6#=™8 : >8 A9[ҽ8@8a9{9`w# .898 9w#8{o|g 9 9w#8!!|a{ !9^#V**8!9}|89**8"*8|!c a b b"b'b(b)5b,bca`i!9~#foOc!b(e"B!="$!9~#fo#s#r^zc~‹c[ýc~)!9^#V#+^zʽc[ác[c͏! %!!!y9EJ!:o&%y9s!;"=9!y9DM!"9*9T&;`i^! &b:`i^! &j:`i#DMF:`i^z;`i^!>&ʋ:!ß:`i^!<&~;!`i#DM^! &¾:`i^! &:ß:`i`i#DM~:`i^! &:`i^! &:!`i#DM+s::*?|;!ͧ=+;!=&{;!;!ͺJ!%K!nf-<&%>=!"W!!DM5>`iDM`i~#V>!9^#V`i^#V́JV>->! ^#V!9^#V!%#!9s#r!9^#V!%ʝ>n&u|>!"W!!9^#V!%>n&u|>!"W!! ^#Vsrn&un&u!0Aut!9^#V!9^#V!9^#Vnf%! 9!T&!?!!9^#V%! 9^#V!T&O?! 9^#V! U&Y?!"W!! 9^#V)))6DM! ^#V! ^#V%! 9s#r!! s! s! s`is!-w#¼L*~‡O#L|O=ɯ<**###LLLLLL+M**#M**#2M**#GM**#\M**#qM*~/w#M*~?G*^#V#~#fo))ҦM#žMDM*s#r#q#p*~?W*###~M~w+MM7~w+MM~#MOùL*4LMy22L* 23L!4L~w#…NO8L! 23L!4L~w#2O]O4L! 23L!4L~w#…NO8L!n n N$ WRITTEN BY ROBERT SCHRADER !)! !"c*a*~"wÓ...............................Ù !Þ"ÿ#$%&'()*+,-./0123456789:;<=>? @ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_ `ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~!s!͕*/͕!͕!͕!͕! Z$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$` !e"Æ#$%&'()$+$-$/0123456789$$$$$$ê @ABCDEFGHIJKLMNOPQRSTUVWXYZ$\$^_ `ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~!:!]͕*c/͕!h͕!͕!͕! l͆ ! ! !X ! ͓ & !$!X͕!X !M"K!P"N!S"Q!V"T!Y"W!\"Z`\*^*K~"Kwr\*p"Q\Ä*}*7 "WØ\Ý **7 "Zñ**N~"Nw*"T!*c*K *&>*W*&>*Z @!* &+ >*Q!X!ͧ*N !X>*T!C b!!>;k!;q**oc* Ç***+ <* ͟ õ A4>CBAS2 !L *L ͮ ͟  A4>CRUN2 !L *L ͮ ** CBAS2.COM!CRUN2 ! *͕Copyright (C) 1979, By Topaz programming. All rights reserved. From here on protected by End User License.  "͐2! ͐2! !+ !+ !~#w#xy2 22!"!6 x 2> 2 !",!6 :_!>"^"a!6 :a2!+ !""͐2! !+ !:N ! ڣ2͹:!!Ø" ͐2! ͐2! !+ !+ 2!""*~#"O! ~*w#"!4 !"8͐2! !+ !~#-!ʰaz:va2͐2! !:O~ʜ# 6x2>2w $$$ SUB!6 *%%"x * w#~=_*6 6*-!F * 6*%{/_z/W"!~_#Vf#N#F* r+sK*"< $"3 :w 2*% w#z‰**%CHAIN/EXECUTE OPE   $ ) / N Q >!# + P + _+ *P {P >!+ w#= |" + +| + w## y9 ! ~\+ [  PROGRAM CHAIN/EXECUTE ERROR$! > 6 #=} !6! ::>© ~##`ڧ @~ #. ­ ~ #. þ ( ~ # !  !(  !  w# ~* > _y{  >?w# }o|g}o|g|>" ͐2! :_!6:% } !:O>ͅ * 2 ~ʦ 2 #~ʦ ʹ! 5ʦ Ð : ʳ y 2% " ͐2( !( !) "& !( + :!*&  ~#.,-$*^+/&!\ #~:O~ʹ# N# 6~> #4 6#> ^"#:k c  : **l 2 ~2#~2#: ! ʲ :O>[ʹ5 >]ʹ> ʹ: =2 ² >2 y  : /2  ^"# ! n : WARNING ONL:O n !& n :!, n 5 ERRO IN LINE*|0ʹ|0ʹ}0ʹ}0ʹ!>w~ ʹ!4#n ʹ* s#r#" * +V+^" y2  :O! ~Һ > ʹ< O> ʹ> ʹ2^#V#" ~2 #͹: !!"wz1OFxHy#6H#wHH #6HO~NC #6#y*w"u|b}bq3!y2*uyHFO #6 wÁzʚ  ! 4 6!/ 4 6y2 >P 2 ^#V!! >: O: n!A \#~#^#VN#!A z~#‡"^#=V#=**"__{s+=r+=s+=!:X> !!D !'F %BAD CHANNEL NUMBEÂ::öþ:::?y(1::::::::_|›*:­ʢ2×!Ã:|*7>|22*&|! "&__7:\\!F >2:{\!F _<2!~ɀ&INPUT FILE REAPPPPPPPtPPPPH2 COPYRIGHT 1977,1981 COMPILER SYSTEMS, INC'd  END # ()*+, -/: ;<= > ^ASEQ GEGOGT IFLELTNEONORTOABSANDASCATNCOSDEFDIMENDEXPFORFREINPINTLENLETLOGNOTOUT POSREMbRNDSGNSINSQRSUB!TABTANVALXOR"BUFF(CALL#CHR$DATAcELSE$FEND%FILE&GOTO'INT%LINE)MID$NEXT*OPEN+PEEKPOKE,READ-RECL.RECS/SADDSIZESTEP0STOP1STR$THEN2WEND3%LIST%PAGECHAINICLOSE4FLOATGOSUB5INPUT6LEFT$LO###7MATCHPRINT8USING9WHILE:WIDTH;%CHAIN%EJECTCOMMONREMARKbRENAMERETURN?RIGHT$UCASE$VARPTR%NOLISTCONSOLEBRESTORECSAVEMEMD%INCLUDECOMMAND$CONCHAR%CONSTAT%LPRINTERGRANDOMIZEHINITIALIZEIJh}>ku  PAGE$OUT OF DISK SPACE$OUT OF DIRECTORY SPACE$DISK ERROR $BASNO SOURCE FILE: $.BAS$ERROR $ IN LINE$ AT POSITION$WARNING: INVALID CHARACTER IGNORED IN LINE$INCLUDE NESTING TO DEEP NEAR LINE$FILE: $!mOs+q+p+q:mO=2mOʏ*jO:lOw*jO#"jOrNO!O6!nOq*O&N :nOw:O<2O͐!oOq*oO&!pOq:L!L:L*pOM:pO !?O4:L*pOMͦ:L!*pO&!rOp+q*qO~$B*qON*qO#"qO(!tOp+q!vO6+6>!uOڶ!wO60*uO&9) sOLLڑ*uO&9) sOLL+s#r!vO6#4_:uO/!vOҪ*wOMï !uO4Q:L2xO:L2yO!L6!L6 L"BO""*@O#"@ODMC!?O6   :xO2L:yO2L!{Oq:{O 6 :M<2M3A!M4*{OM:{O V!>O:?OVͷ  !L6!L6W: €"×: ‘"×" . *M -ª! N6 *M 6 *M 6*MN!L6#6!L6!L6"*M~*M>@O:!|O6>!|OE*|O&*M~ ;*|O&*MN:|O<2|O" :Lfͦ͐O:L/vM:L҇  :LN. *MDMO -£:Nʹ:N2OOOb!3O6!S"N. *MDMM -:N:N2M:L MM$b!;M6*MO>Eb: :LQ!S"O*N+*L!~Os+6:~O!}Oڣ*OMʏb*O"O:}O<2}Ol!L6#6!O6!O6!L6!L6!L6!Oq:L*N#"N!9LI!"N*N*N:Ow!Or+s+q+p+q:L] *L#"L:L2O!L6"*O|O*O}O"*ODMC"*OMCW:O2L!O6!L6! N !iO6=% !iO6::L2LP 2L >! Nҙ : N=2 N.!"* N&L?M DM*M -` "* N&L?M ! ~2>M*ʉ v: N– !iO6: .*M6 !>M6L :L :L h !4O6*M<2>Ml !>M6*l >*>M&*ڬ *OM! ^#V!L6ì !L6!L6ì !L6ì !L6ì !L6ì !L6!L6*O& ~(l :O<2O!>O6:O<2OO! ~02OO> l :>O:>OH!O2>O9 ì !L6+6*O& ~(› :O<<2OO! >2Nì   o à :l2N͛!M6#6!;O6!4O6!"M6!iO6:!L6 x !L6!L6!L6#6:M/:;O2:O*1!Oҫ$!M6:O<2Oˆ:M!M!L6:M$p.:L=2L!L6:LN"L:M !L6:L !L60!L6#60#NB*8ODM*;O )͸LLf?:L$_!L6fw:L%r!L6fw!L6S/ҷ:LF:LNH:LHҫ!L6Mð!L6J#I:Lb:L ͦ ͯ & 2LÿI:Lc34:L *LM4& 2L,44*L+"LI:LMw*M# e:L::L*Mw:L==2LoLL ->!L!L6*L*M#L -!>M6͛: N<2 N͖!L6 x ͔ :L3!L6+6!L6:L2L:L2L:L2L͔ :L!L\ͷ͔ 2!>Os>@L!MҁuÄ͔ !O6:L :O<2OH2*O&L) q#p:Mu:L & 2LÌ͔ 6Nbu)ͦ ͯ ͖)-Sx :L!L6*4O&N 6?x :M/^:L<2LO!L :Lw:L!L?w:L^!M6-x -& 2L*L&L ~:L0O> /:La/>z!L/H:L.͇!Lҷ:L_2Lͤ:LAO>/͇H{͸H͛H{f͸:LAO>:LE !M6f:M<2M:L .x !M6!Oq*L#"L:LM*OM!"O!M6pH’!O6:L=!Oڎ*O))))3_"O:O<2Of*OpB!O6:L=!O*O)3_"O:O<2OŸ*O>!L~>3#HH!M6!!O6:L!O!*O)))*O) 3_"O:O<2O*O|/!M6*O*O&L ~2OAM:O 2O:O> !L_>!O6*L& ~2O:O!O/:O!O2O!O6*L&) :O=:Lñ*O&L :O=O*O ~%:O<2O,:O=2Oq>:L =x !L6:LHP_:L,:L Hq& 2LPNTI:L!:O*8O_DM 1.CONSTANT AREA: $CODE SIZE: $DATA STMT AREA: $VARIABLE AREA: $AQGFKLPBTNOCDEIJHXRrU[qZWpS\YVsvwxq     && PROD $FUNCTION REFERENCE BEFORE DEF: $PROGRAM CONTAINS $ UNMATCHED $ STATEMENTS$FOR$WHILE$DEF$NO$ ERROR$ DETECTED$:LO>@_e!V"tP*++"rP"O#6!|P6#6*O~=!}P *}P& *O:|P2|P!}P4:|P?*O^*O*O ^"O*O"O^*O"O!~Pq:~PtPK!rPeLq!L6OT*w*O >*zP&O) ^#V"O>OWL*O~2P*xP͒!{P>*O#^#V"Oî>:P=O! *O*P&*xP ":P=2P>>*xP>2POD*tP"O*xP*O wo*xP#*O -S*O :{Pw*zP&O) *O#N#Fq#p*O 6*zP&O) *Os#r:PtPK+s#r*O~!Pq*O :P*O w*O ~*O ^#V!Pq*O :Pw*O ~2P!P6:P!PMo&O"P*POLL3*PN#F`i"P*O#*PN#Fq#p:P<2P2P!P6:P!PڜO!O *O#N#Fq#pO!O *Os#r:P<2PY!Rq:Lү*RM!"O}2O2O2Oo&"Oo&"Oo&"L2R2Ro&"O2O!O6!R6#!"Oͤ:L$͈!"xP!zP6#6%1͝$͝r!Rq:O/8*O#"O:L/G*RM!Rp+q*R|O%*R}O%!Rp+q!RLDMH:O/!L:O/Hҕ* !Rړ*RM!z ^#VÐÐP0*RMb1,OZLLDͼ0)*ODMrͭ:O$*OM)1!iO6*͖ÐÐ͖Ð:OO!O6T!O6Ð!O6ÐÐ!O6Ð!O6Ð!O6Ð7:@W_bjr|/>+!Rڟ|/:R,O!". ^#V!O6|/|/ORJL:RH2%4|/:R*RDM_*R"ODM60|/ ͆0*RMb1OOJLH>/*ON#F_*ON#F60DAF0|/|/*RMO3|/ P0|/_P0|/|/ O3|/|/N2 % ͆0|/|/́2*RM%t0|/|/:Rʮ!R6́2|/́2|/:RFMͼ0*RM͆0*RMt0|/:R%:R 0%FMͼ0 ͆0*RMt0|/|/!R6́2|/́2|/|/ ́2|/:Ox:Rp*R&P) N#F_!O6Ø:R“*R&P) N#F1Ø%|/P0|/ P0|/ P0*RMt0|/:O*R&Q 6*RMb1P0*R&P) q#p*RM6 *RM6|/:L IF0r2*R"O* *RM!R: NS0DM1*RM͚3!%9L!Li SI0|/͆0*RMq1/ҍ ͭr͆0*ODM60|/r2|/ 9*R&-Q) *R&) N#Fq#p9|/9|/8|/ 98|/ P0*RMb13!OOJL!O !FRͼ00!*R&-Q) *Os#r*R&P) s#rOͪ0|!:Lv!!L6E"! S6:L! Sk!* S&L N: S<2 SJ!W!L6|!UFͼ0|/*L& Nb0:L*L& >HOP0*L& ~Oͪ0:L!!O6!:L#!!O6|/7|/L|7|/P0|/͆0|/P0|/͆0|/P0|/P0|/P0|/͆0|/P0|/:R=O!Q :R:RHV"EF0*rP ^#V"O:R/:RH҃".%H:Rҏ"%DM1:R§"%û":RҶ"%û" %:R"DM_%%:R #%_x:%_8%x:%_9%x:%7%*rPN#FH*rP##*Os#r|/*R&Q *R& w6%*rP##N#FH*rP *Os#r:R2ROt0t|/!L6>rPWL+s#r"O*O#>*O#wD:O<2O|/:Rµ#FMͼ0:R:RH#p%#:R:RH#:%͆0*RMt0|/:R:R=O!Q ~H*$p%P$:R:R=O!Q ~HP$:%:R=O!Q :Rw*rP ^#V"ODM_P0|/͝1|/͝1|/*R&Q ~¡$]%`%6DMH|/|/f6|/͝16%1|/:R$EI0:R$:%7%1|/*R"O:L%*RM:O/%%74%*R"R͝1|/*RMt0|/:LG%/1*Oq#p*O#"O!O6|/:Of%MPͼ0%6% P01*O"R*RMq12 S*RMt0*O"O*ODM60:L! SҬ%DFͼ0%:L%D*tP##"tP*O 6 ͭ*ODMr%OZL!L%DFͼ0%N|/D:|/P0|/P0|/D:|/|/|/|/͆0*RM6:R<&FI0*R&P) N#F1-%|//2|/_|/|/3|/3|/*R"O:O&:Rʒ&VC0!O6*R&P) nM:R¾&*R&P) n}%!L6|/m͕4!L6|/|/'%!L6|/h͕4|/:Rʩ'PI0n%͊4|/_n%͊4|/4|/4|/!L6|/|/?%!L6|/:R=O!Q ~!(SM:R=O!Q :R=O!Q ^N#F &(c%|/|/}8|/}8|/|/}8|/}8|/d%|/d%4%|/!L6/2&%|/!L6:R=O!Q ~¦(FM:R=O!Q :R=O!Q ^N#F :R=O!Q ~¼(]%%/2%%|/|/|/|/5%|/f6|/{5|/{5͝1:O(%|/G5|/ͽ1%DMHb%G5|/f6P0|/f6:R!Sچ**S&L) N#FH:S<2Sc**ODMH:OҞ**O"Ow+!L6:L2L:L2L͔ :O**O͎::O**O͎::O*͎:%%>!LbL+*LDMC+"">LWL%+S"!S6>!Sf+W*S&R) N#F"*S&L) N#FC:S<2S0+*DM_IO |//%|/M%|/j%|/|/j%|/|/:Rʮ+SM0|/N2|/_|/N2|/|/__|/N2|/N2|/k%|/|/k%|/|/N2e%|/N2e%|//2i%|/|/lO3|/f%|/|/N2o%|/g%|/:Ol,*O"Ot%*R"R͝1!O6r,DNͼ0|/:O<2O ڊ,NWͼ0í,*O&O) >w#6*O&O) *Os#rt|/:R,EWͼ0:R,:%7%1*O&O) *Os#r|/:O,UWͼ0;-6%*O&O) N#FH*O&O) ^#V"O>6L4-*ODMr:O=2O|/|/:RR-SMͼ0W-y%|/u%|/|/~%!O6|/:R‚-%Ç-%*RM6*O#"O|/*O#"O|/:R²-%÷-%*RM6*O#"O|/*O#"O|/:R-CS0-*R&P) ^#V"O:R.FSͼ0 .z%:O.DS0.!O6|/GJT\dgor"4ADQ l !!!!!!!""""&"."3#v##$}$$$$$$$$(%2%V%%& &&&&&"&T&Z&c&f&l&r&&.'I'L'W'b'v'''''''''''')(,(2(8(;(A(G(O(\(l(((((((())!),):)V)Y)\)_)b)h)n)q)w))))z+++++++++++++++++++,,,,&,.,1,<,D,u,,,>-A-Z-b-e-r-----*R&Q ~2R*R& ~2R*R& ~2R*R&Q ~2R*R& ~2R*R& ~2R*R&P) ^#V"R*R&P ~2R*R& ~2R*R& ~2R*R&Q) ^#V"R*R&) ^#V"R*R&) ^#V"R*R&Q ~2R*R& ~2R!Rp+q*R&P) *Rs#r!Rq*R&Q :Rw!Rq*R&Q :Rw!Rq*R&Q :Rw!Rq*R&Q :Rw!Rq*R&P :Rw!Rq*R&P :Rw!Rp+q*R*R&Q ^*RDM !Rp+q*R*RDM*R !Rp+q*R*RDM*R *O#"O!Rp+q!RLDMH!Rq*R&mQ n&-R!Rq*RM$1"xP*R&P ~2zP*R&Q ~2{P!Rq*RM91͝!Rq*RMb1҃1>%>!R"xP:R?2zP!{P6 !Rq:LҼ1*R"O:ROKDMr:R<2R1:R<2R͉1͝/1%*ODM60ͽ1DMH!R:R2MMͼ0>>:R2FM0>:R+2FMͼ0>1:R@2FM0M2:RM2]%:R_2FMͼ0l2:Rl2]%t0/2:R<2RO͆0!Rs+q+q ͆0!R:R3:R:RHһ2p%2:R:RH2%p%:R/2%!R6t02MMͼ03:R:RH3FM0:R03*RM%I3:RB3*RM%I3*RM%!R6!Sq ͆0:Rj3:%!R6:R‹3%:%%!R6t0 2ҙ3*SM%!Sq:S¯3_3:S3_3_2S!R:SH3NSͼ03*RM*RM͚3 %*RM%%!Sq:S!4%64:S14%64%:R:RHW4p%~4:R:RHw4:%~41~474*RM 4!L6;%!Sq:Rʧ4SMͼ0:R¿4*R&P) N#F_*SM%%!L6:R4*R&P) N#F_:L4"1'55:L 5)*'55=<'5:R5:%*RM 4!Ss+q:R?5*SM%F5*SM%/2:R<2R)\5OOͼ0*R&R N_^%9%!O6!O6*R&R :Rw:O=2O¨5!O6UN056%*O N#FH!OL*Oq#p*O#>5*O"O5*R&Q 6*RMb1*O OLLH6͎56IN0P0*RMq1e6!O/!Le6:L M6*?BCDEGHIJKM/E  J J  "2"'5 " "". "" " " """0"2""  EFJLM )J #%&'*+,-1345678:<=>?BCDGHIJKM( #&'*+,-134568:=>?BCDGHIJKM)J J  $   AE $ $J JEF9; $  $ """""""""0"""""""""/""  $ )J  $( )J     N%F  '(),./02679<E!&X  %*+-FN3: #Wdd8lhcdbaf$&cdba&cdba}>Dcdbaucd67[~@ p%'(,29:w:D/ ?CDyCD CD CDCD.Z\CDXCD]`CDCDCDCDCD0CD1CDCD&cdba*"#p%'(,2489::D)_p%'(,29::D+B!x egim kj--335;<=Y?@ACHHKIINJJOKKLLLMNQPRQSR[^_`bffhhiijjkllmmnn>uuvvvwwyyzz{{||}}{q     ^  ABvtIJa=o p~sxcdegtroqEFEHGTSYYYYYYUWTUVX!VFnsz#Z$%)&',PW(GM"\/+*-.2]O345601789;$&   #$%&(&&02356537899:;<9>&?@@@@@BCcdeeefghd(ijklmmmnopsxp{ppp~pppppppppppppppppp !#%')+.147:>@BDFHJLNQTWZ\_behlorux{~<<r<<| 33446688:::::<<<AADDDDFFSSTTUUVVWWZZZZZZZZZ[\]^^___``abcddeffgghiijkklmmnrrsttuuuvvwwxxx{{||}}}~~                     &    -3;<@N[kvCBASIC COMPILER VER 2.08 $$$$$$$$$$$$$$$$$$$$$$$$$COPYRIGHT 1981 COMPILER SYSTEMS INC. $1LrH"H"oKͷ!L6:L!LbK!L6!R6!"P!R6!R6!mQ6:L_K>!PbL4J͑K*R&P) *Ps#ryK"SͮK͆K*S+"S*S"SSSJL1J*S: :LJ*R&mQ :Rw!S6:L!SڝI*S&L NK!S4I*R&P :Lw*R&Q :Lw*R&Q) *8Os#r;K*R&Q w*R&P) *Ls#r*So=) ^#V"P!R6*S"S$JSSJL$JES;K*8O_DM *S"SSI\K!PeLJ͆K:R6L!Rs:R<2RPOLM͚:LJ:R2RyK"S*R&mQ ~2R*R&P) ^#V"S*S< n&"S}SSJLHJ*S#"SÓJ*SKA) ^#V"P>6LJ!L6\K>!PbLAKyK"SͮK*S; n&"S}!S:LbLH/K*S#"SJ*S?) ^#V"P\K͑K͆K*R&P) q#pyK"PIHoK!L6HvͱL Ͱ*PB) ^#V*PF n&:R<2R ­KOS*8ODM*:O :RҽK !R6:L!:O!Sq*R&-R :Sw:R<2RO>dKOV;K*8O_DM _ogDM!>))L = L_og^#V|g}o *L_{ozgO{ozgi`N#Fogo&og_{_z#WCBASIC V2.08 COMPILATION OF $\ INT LST@ $:#~#VZ{+_~#F!{w!rN,F!vq#p{,q#prYP͵7!rN,F!fwq#p7rYE!{~,FOx'T.6#6.N,F.O!{w#p.~}SOx.q#w.~,F.ޖ,OxҖS.N,F.q#p.6#6*{+{!{,_zS-N,F*{ ~!{w.N,F! "{ÝS!rN,F!vq#p!{N,F!vq#prYP!{N,F͵7!rN,F!fwq#p7r#t PCOPYRIGHT (C) 1978, 1979, 1980 COMPILER SYSTEMS INCxw #^        !q!q{`i!N#F+͸!!q#xw6 ɗyOxG~O#~G+~#q#0:?ɇ:=2:<2Я/2ɯ2!K +T]~ fG+~Qs+T] Gʌ#~w!~!BÓz/g{/o# |>|>!  + ! > W!z#?>!> ' P'> '!~ȯw+6>+6='$`i~G2x2#:W:_!ɯ' #b7>'w #n7>'w #Á>Ø2i2:W³1!:iw `I1!`!`:iw:`G2hxW!`1r!q= :hG:8!aa!>q$ a3!aTmÓ:h2Ó"L:!A!:!AH2H!!"I>2K*L~#"L:*Ia4=³A*Ia=!K5*I#"Iá: 3W!w#zW@13w`i#j͓ !z@3- W-_!~ȓ_Aw3o{3-z+w>2`i22?G!ҤmÒa!~w:=2K:!KÏ!qÏ!͓ ů28>@2>2 :=2~#ɯ : 2 :x{22 M+d-g>20dr.ʗEʥeʥG&:$o:/2o ʥG-_ʺx½GOxG{G!~+ 2!xw-͓ !"g|3|)}/o|/g#>2]^#V#}o|gB5*g&$"g{-Ó'd !} ~5*~ ~z+"~ 0:} ɷG>0͔x=È*p w#:{ :n :m ʿʿ6,#"p :> >-!"~ >2} `i"p :i g: 2m 2l 2n 2k 2o > ͔ > 2}  !i ~2k w͔:@2o !n OO6>2m > 2l 6!o pZ2m /<2l  I:O•2m 2o 8:| ʆ=2u :r > Ĕs :r ʢ͔:n !o 6 y@Gʺ/%͔2{ 2r 2s  1 :| 2m Gy@w:r !s >0 >0 4!m 5<2u :m !l G:n I :o OxGxs W?< =V zz !~s g:u ¡ :s !r  :m :| >-͔ G:t OW*ʵ $µ $ :s !r  O z͔ y͔:i :|  :r : :m >0̔͂ !m ~ 5i͔ :m ͇2{ :i 2 !j ~ҕ 6>.͔:n V :o G:l N GO 2l x͇͂n !l ~n 5i͔V :l ͇:i • *p +~0Š 6 ~ .ʐ #6 "p :n >E͔!o :i ¬ 5~ /<-Gy͔x/ Gy͔x0͔:s ͔2s 2r :i > ͔:k 2i *p 2 2 `i#" " GOW~# < /: &: !: \< #< NUa# y2z z2y ! ~\ : w* b 5* ~#" 2 ɯ2j :z z NNa`i"p : # $Ÿ I $ >$͔:  *± I * >*Ö . I #>.– 2| 1 - I # .>-– >2r 2| O1 >2r \I ĔI  2t  > 2t  I # ,& >2{  !| q.B >2j I #B 6 !l q^U I H !n q-f >2s I *p DM*w #"w ~:v =2v >w > n Ô:y œ SNa`i"w xʧ 2v bk"p : / ! & \I ĔI ò ̓ I ʖ / ̓ I *p w  n ͔ `i"p : #e /e !e &e $* I $e >$͔ *< I *e >*$ -S I #e .e >-$ \I e ͔I  *p `i~AҜ 6G>Mw!:A<2 )T])i_: =2 :}/o|/g# WzQS͑1I1!~G w!o|g~x>II1N͗=FI W2z1͏ D͒!2>]iI1ͺ 1|}!#:ēI:-3 2>Ae1FI2!>iI1!u>iNI:AO>y/G ͗m͗II1N :W z1͒/:ҵ͗:͗/͒!~w::INI>iI1͗Iä1!~>w2:AQIIfFI>͗I1>6i:!wI07HWgtA1A@P\d5bEHyed"BA1PYTAE(('@ @@I@hfffff?hfffffA>533333>=ii<0$;9"sU':9"sU'9BT8!%8hxVg 7"hC60wYEG417Gv@`v'b1AAPX#C`QI"U&Àe(HBCTbDvRWaGv"C%T$a'ÙH%Csrb"(HdA1AAXS&YA1AIy&cypt dYd?Sh&&iyv&3uF=84SY592xXT(E133@P5D @cbe@(u?Bp6W>W"f(@E3SxI͗I1͒NI~͗! DM=v ×xʯ ʯ< O*C4|ͅ"q**Cs#r#6LSaF#~ Oͅ*Cs#r~# **C {_zW*Cs#r#w#w#w*Cw#w#s#r!C^#V^#Vz###~X#{_zW{_zW+++++UMOax!R"&6 #x’+6{z+++Fr+Nsq#p#s#r#6`i##s#r*&^#VN#Fx###~p+q`is#rR*a+6++++^#Vz!~*C~2C*C#"C]:E4 ] :CFù:C:CTH:CRHҳ!C6] ,}"C]*C~,¡] }"Cð>CzB°ö]>2!C!C62:C2fCgC*CM*C\!fC"C:C=2C*C#"C!Cs+q!C6:C2C*C"C:C*C:CH:CH\:C V*CNͺ:C<2CO!C Hq:C*C~ H|]!"C!C6:C!C*C&C >9~0Hү*C!CB*C&C >_"C!C4ˆ*C:C2C*C"C*C##~*CN#F!Cp+q>CzB>*C~!Cq:C_AO>/!Cq:C0O> /!Cp+q*C~2C:C=2Cd*C#"C*CNͺ*CwCu*C"C*C^#V"C ҏ*C"CÙ*C^#V"C*C~2C!C6:C!C*C*C >*C*C~>*C#"C*C#"C!C4¥>#HPMa*C>ͅB>*C~2C*C^#V"CDMͣ*C^#V"CDMͣHO>*C~2C2C!C6:C!Cڇ*C&*C~\€!C4!C5!C4^*C~2C!CҘ>:C=2C:C!CO:C:C<2CO:Cß>!Cq!C6+6:C!C&:C!C>:C/*C&*C~\H!C6)!C4>!C4>*C&*C~2C:Cw:C?I>:C#`*C&*CN&:C!w*C&*CN!C6*C&*C:C!Cq!"C:C* HҴSSa*C^#V"C*C*CN#Fq#p#SSa*CN#F!CͅB*CN#FͣH*C>w#61*C*CN#F*CYB!Cs͈BL:CE:C<*CwL*C:Cw:Ca*C^#V"CÎ:C*C:CͿA*C~cB"CÎ*CCͳA+"C*C>CzBN4"C>YB·DMͅ"C*CDM*C\*C*C w*C*Cs#r1*CN#F`id @PEv2(<PdxPRINTER BUSY?$ IN LINE $ERROR $WARNING $IMPROPER INPUT - REENTER $AT LINE $1fC;5%1fCͥ%"v!MEq*ME& !NEq:;E!;E6*C|!WE!XE60*WE&) UEoBڼ*WE&) UEoB+s#r!XE4Í*XEM!WE4!]Er+s+q+p+q*\E+"\E\B*YE:[Ew*YE#"YE!_Ep+q*^E|O*^E}O>!%DͅB,7F*%DDMt;;!"6E>!6EͅBH0:5E] ͈ ͈`0!aEp+q::5Ey;!5E6;AF*`EDM !cEp+q:5E2dE!5E6;HF*bEDM:dE25E!eEq*eEM:eE_:eE*C#"C*C"C>cB"C*C"C"C!gEp+qCfEmB!iEp+q*hECoB3*hEN#Fg*C*hEq#p!lEr+s+q*C#~œ*kE^#V"kEC}Bi*kEDMg*C"kE*kE^#V"mEDMҜ*mE~!jEڜ*mE+"mE~œ*kE^#V!*CDM*Ci*CDM*Ci*CDMoEiͭ*CoEi*CDM *CN#F*Ci*C~*C~*C>ͅB*C>ͅB*C~*C~*C#~*C#~!wEq*C##:wEw!xEq*C:xE^*Cq#pg*C>w#6:҄FO͑*C i!6*CDM1ҝ͒ã͗ͺ *Cq#p*CDM1*CDM*C"yE!"{E*yE>ͅB *yE ~*yEyEmB>cB*{E"{E*yE^#V"yE*{E*C~2E!"}E*C"E*C"E!E6*C~!Ec*CN#F*}EB+s#r"}E!E45*E"C*E"C*}E*E& B*C~<_DMͅ"E"E*C*E w#6!E6*C~!E*E##"E*C*EN#Fq#p!E4¤*C*Es#r*C~2E*C^#V"E>YB EAa*C^#V"E*EN#F!Eq+6:E!EN ̀ *C*E^#VN#FB*E "E!E4 ̀ *EEoBc BSa*E##*E*E& B *Cq#p*E##"E*CDM *C^#V*CDMi*CDM 1*C^#V"E*CoB6!*EN#F *EN#F `i"E~=w *EN#F*CN#F%!*CN#F `i"E~!!*E#DM *CN#F `i"E*E4*CN#F*C\*CCͳA++s#r W!7!Z!*C^#V"C*D *CDM1:i Қ!+Di !+D\B!*Dsì!+D!+D\B!*Ds!*D:i !*CN#F+D͏ !+D\B!*Ds!*D!*C^#V!Ep+qE6EmB" *6E#"6E!!Ep+q*EDMͣ"*E~2E!E6:E!EU"*E#"E*EN*6E#"6E1E}BN"0!E4#"*C"4*C"4!Eq:i ҡ"+D !+D\B!*Ds:EҐ"*D4:Ö"*D"!i 6!E6:E<2EO>"*E&4) >ͅB"*EM:ç"͢": *C|# #*"D#""D")D :+D:*DH##"!*D"-E**D& 6 **D&*D -E}B*8E"C;QF}*'D#"'D!C͈Bs#DOa*'D~*-E#"-E~::E¨#+ErBҡ#8*+E*D w8#::E´#x#::E#\#!"+É#2E ##::E#!*D"/E#::E#*-E"/E#*'D"/E:E" $!E6,'$!E6"::E!$*/E#"/É#2E!E:E+~ HP$*+E#"+É#2E'$:E"v$́#2E,:E Hv$X$#>+EzB•$*C>w#6$*+EM*C4"E>YB¸$*+E#DMͅ"E*E#*+EDM*/E\*E*+Es*C*Es#r1#>!+EͅB%>!+EͅB%!"+E*/EDM*+E?*CDMIh4%::E/%F#4%*C6 "Ck_*C"C"C*C"C+"'D*C"C*C"C"C"C*C"C"C*C~%*C#*C w*C>?*C#w*C~%4*CN!3 ^#V*CDM1*CDM͗*CDMIh4*CDM1*CDM͒*CDMIh4*CDM1*CDM*CDMIh4S44l&*Ci*C6A&҇&҄&*C i&қ&EN͑*C>w*CDM*CDM1*CDM*CDMI*CDMth4*C*CͳAs#r4*C*CoB+s#r44*C*C^#VN#FB+s#r:E*'*C/B#+s#r44I'ZD͑*Cq#p`'*C*CN#F^#VA+s#r:Ev'*C/B#+s#r4Ҍ'*C>w#6'#ҟ'*C>w#6'*C^#V"E!"E*CEmB'*C^#V*E B+s#r*E"Eү'4*CN#F+q#p4*C/B+s#r4*C*CA+s#r4*C*CDB+s#r44͉ ͠44ͭ4ͺ4͉ 4ͯO?4eO?4*C*C^#VN#FͧO?4*C#B+s#r4*C#"C*C*CN#Fq#p*C#"C4*CDM *C^#V"E*C*EN#Fq#p4͠ 4*C*Cs#r*Cn&"C14*CN#Fͣ+)U)*CN#FͣD)ͺU)*C*C^#VN#Fͱ4*C#:$D<2$DO!C q#p*C^#V"C4*$D&C) ^#V"C:$D=2$Dң)GRa4445#ڼ)F#$4v!DM"4Ͱ!DM":i )4*CN#FͰ7*CN#F7V"4*CN#FͰ7V"45#(*F#+*I4*C*C^N͏4!:E6$4!:E6z$4v!DM :4Ͱ!DM9:i z*4!E6:E<2EO!4 >ͅBʠ*Å*ͪ5*CN#F*E&6*CN#F͖74*CN#F*Ci4*C+"'D4*C>w45#+F#z$4*C^#V"EDM/>EzBH3+*EDM 4404:i ڟ+!E6:E<2EO! ^#V"E!6E͈Bn+K+ErB…+*EMß+1EEmBҗ+0ß+*EDM!4^!4ҵ+^!ý+*C##"C4J!47!4ͅ4!:E6*C"8E"4!:E6z$4!:E6$4 94c"J:4*CN#F:4*C>w4*CDM͏ 4͚*DM N*CDMI4c,*Cq#p,v,*C>w#6,*C>w#64*CDMͤ4*CDM4*CDM)4ͭ*CDM*CDMͤS44*CDM 4*C1EoB>zBH,LTa*C6EmB,:*CN#F!4*CDMt4"EADM *E|:-͗*CDMI4*C|r-HE *LE&SB*KE& >8B"x-*"D"4HҒ-NL͑Ú-*CDM4*C*6Es#r4*CN͈*Cw#64*C^#V"EDMͣ-CAa*E#~2E*C:Ew#64ͅ"E*E6*C*E# w*C*Es#r14͎4*CN#F2E*E&*Cq#p4͎4͎4:i 2E!i 6v!!Es!*D5#~ ƒ.:*D=2+D+D É.*D 1:E2i 4*CN#F*CN#F_?*CDMI4*C*C^#VN#F;"E*C*Es#r4*CN#F;"E*C*Es#r4*C^#V"EN*Cq#p42E*C:Ew#64ͅ4*C~=w*C~=HU/IOa*C~YB™0!"1E!5E64l!I4*CN#F͗4*CN#Fͪ5*C*C^#VN#F6*CN#FJ72E:E0}4*CN#Fͪ5*C*C^#VN#F6*CN#F͂74*C^#V"E*C*E w4*D8l!4*C^#V"E>YBʠ1*E~2E!E6:E!Eڝ1*E&*EN͈!E4~1å1?͈ ͈4*C^#V"3E>YB1!"3E4*CN#F *CDMI4*CDM 4*CDM͏ *CDM1ͺ *Cq#p4*CN#Fͣ72.2*CN#F 1*CN#F64XIa4 2E *E& 4*C*Cs#r14 Җ2*Cq#pß2*C>w#64 *Cw#64͢"!C6!\"4*CN#F`6 *C"C"Ck25zW{_!55{5*5c5 |g}o"5*5|g}o"5N5*5*5DM*4>͊5"465*4"465xʸ5>@>Ҿ5NBa`i>)=5> DMͅ"45 *4 "4"4}245Ò54*4!!*4 DM!45H64~#FDa*4r+s"4:4=5|5!4~@w5`i"4)xZ6>>FNax7*4#  *4G7ڑ6:’6w#>266ڨ6 š6.¦6266 õ6:66.6# 67*6:4>*6>266?#`6{6_:7*7? 7w#:47FIa>?7*4*4}O|Gxr# 07*4*4#{z"4`64[77>;5*4)4w#w4^#VzEOa#"C`65 57EMa`64<ʈ77H64 s#rH64 ^#VzUFa"4*4)4 ^#V"45*4"4!46Ò5!4~w8:4BR=aURax8RIa *4C5*4{o>g+{z_zGyW*4  P8~f8395r͙7sn839s!4~w"45͒5*4!)DM! !4>w:428%5±8!85͜5ß87:4*4 497839͊5"4|8:4|8*4~u:8 *4|8ERa`i68 9V8r8 555*4|58 (95!4~ЇwRWa͒5*4*4{_zW{z<*5{9͜5=[9͒57!4>w*4|WDa#"C*4"C*4"C5}*4|ʶ9*4|REa+"497939*4"4:49|8*4 5*4q!4>w:i 4:,!4~6Ԟ9"͞94:"Þ9:i 4:,!4~6Ԟ9 `i#~ OĞ9=#:x `i#N͞9=<:*4}_|Wh:zh: ͞9X: ͞9 ͞95*4|FEa#"C*4"C*4"C*4!=~:! DM!)*4+"4!4~w5}! 6í:H64 ^w#Vwz:UCa"4͒5539͒55;54 w#wH64 ^w#VwzUDa"4͒554 w#w;5*}o|gyx"465!ͅ"4ͣv;`64OSa%5v;͜5=f;*4DMͪ5*4"4`64<RFa"4`64<ʿ;4;5!;5!ͪ5>24`6*4 6?4 <`*4O ~O ;;524NO INTERMEDIATE LANGUAGE FILE $CRUN VER 2.08 $COPYRIGHT 1981 COMPILER SYSTEMS INC. $!*E"F!\"F:Cڷ<4<VIa @2E*;=!E6@:E<2EO!E Hqy$=<*EE?:=CNa*EDMI*E"E*C͈B8=A<:Cү=AE}BT=FCaAE}Bf=CCaAE}Bx=DCaAE}BҊ=PCaAC}Bʝ=SCa*C"E*C"E&A>A"EF"E"CA"E*E"E"CA"E*C"CA"E*C "C*C*CA"C}B\B>A*C"E@@:E3=>@*Ew:>*E#"E$> @:EQ>@͆@@ @:E„>@*E"F*F6@@ʁ>@*F~<*Fwj> @:E~ˆ?@~ʅ?:C҂?:Ex?*E"F*F^#V"FC}Bx?>FzB+s#r*F ~<*F w>*F 6:E=2Ex?*F*E& "F*F^#V" F*F##"F!" F F FmBx?*F^#V"FC}Bb?>FzB+s#r*F ~<*F wb?*F 6*F###"F* F" F?*E"EÌ> @@:E6:E7H:E`H:EH?@*ECͳA+*Eq#p@ @:E.?@*E^#V)))F*Eq#p@ @:E @@@>:C+@OA*EECmB *F 6I*F 6N*F 6T*F 6 *F 6*F {@:Cr@  FzBNA*F 6*F^#V"F,A*C"F*F^#V"F>YBʰA*F>ͅBuA*F ~*F ~HңA*F DMíA*F^#V"FUAi`N#Fog_og_{ozgi`N#FogDM!>))덑o|gA =A^#V))) DM!>))B =BYP뗖_>#Wi`/o/g_{ozgi`N#Fog^#V) SB_{ozgO{ozgi`N#Fogo&og_{_z#Wi`N#FogPMXList F STACKSIZECODEDATASTACKMEMORYSTARTSYMBOLSPUBLICS LINES MAP NAME PURGE PRINTORDERRESTART0!fw6#6.pN,FYE!}wq.nN,F=!pww#p.nw#p*nw~!}w¹F*nw#KB=!nww#püFqF(̈́Fnw28!~ww#p)̈́F!~w~,F-N,F,q#p.nN,Fz=!nw,Ox.|q.y6.{6!ywt PCOPYRIGHT (C) 1978, 1979, 1980 COMPILER SYSTEMS INCxw #^        !q!q{`i!N#F+͸!!q#xw6 ɗyOxG~O#~G+~#q#0:?ɇ:=2:<2Я/2ɯ2!K +T]~ fG+~Qs+T] Gʌ#~w!~!BÓz/g{/o# |>|>!  + ! > W!z#?>!> ' P'> '!~ȯw+6>+6='$`i~G2x2#:W:_!ɯ' #b7>'w #n7>'w #Á>Ø2i2:W³1!:iw `I1!`!`:iw:`G2hxW!`1r!q= :hG:8!aa!>q$ a3!aTmÓ:h2Ó"L:!A!:!AH2H!!"I>2K*L~#"L:*Ia4=³A*Ia=!K5*I#"Iá: 3W!w#zW@13w`i#j͓ !z@3- W-_!~ȓ_Aw3o{3-z+w>2`i22?G!ҤmÒa!~w:=2K:!KÏ!qÏ!͓ ů28>@2>2 :=2~#ɯ : 2 :x{22 M+d-g>20dr.ʗEʥeʥG&:$o:/2o ʥG-_ʺx½GOxG{G!~+ 2!xw-͓ !"g|3|)}/o|/g#>2]^#V#}o|gB5*g&$"g{-Ó'd !} ~5*~ ~z+"~ 0:} ɷG>0͔x=È*p w#:{ :n :m ʿʿ6,#"p :> >-!"~ >2} `i"p :i g: 2m 2l 2n 2k 2o > ͔ > 2}  !i ~2k w͔:@2o !n OO6>2m > 2l 6!o pZ2m /<2l  I:O•2m 2o 8:| ʆ=2u :r > Ĕs :r ʢ͔:n !o 6 y@Gʺ/%͔2{ 2r 2s  1 :| 2m Gy@w:r !s >0 >0 4!m 5<2u :m !l G:n I :o OxGxs W?< =V zz !~s g:u ¡ :s !r  :m :| >-͔ G:t OW*ʵ $µ $ :s !r  O z͔ y͔:i :|  :r : :m >0̔͂ !m ~ 5i͔ :m ͇2{ :i 2 !j ~ҕ 6>.͔:n V :o G:l N GO 2l x͇͂n !l ~n 5i͔V :l ͇:i • *p +~0Š 6 ~ .ʐ #6 "p :n >E͔!o :i ¬ 5~ /<-Gy͔x/ Gy͔x0͔:s ͔2s 2r :i > ͔:k 2i *p 2 2 `i#" " GOW~# < /: &: !: \< #< NUa# y2z z2y ! ~\ : w* b 5* ~#" 2 ɯ2j :z z NNa`i"p : # $Ÿ I $ >$͔:  *± I * >*Ö . I #>.– 2| 1 - I # .>-– >2r 2| O1 >2r \I ĔI  2t  > 2t  I # ,& >2{  !| q.B >2j I #B 6 !l q^U I H !n q-f >2s I *p DM*w #"w ~:v =2v >w > n Ô:y œ SNa`i"w xʧ 2v bk"p : / ! & \I ĔI ò ̓ I ʖ / ̓ I *p w  n ͔ `i"p : #e /e !e &e $* I $e >$͔ *< I *e >*$ -S I #e .e >-$ \I e ͔I  *p `i~AҜ 6G>Mw!:A<2 )T])i_: =2 :}/o|/g# WzQS͑1I1!~G w!o|g~x>II1N͗=FI W2z1͏ D͒!2>]iI1ͺ 1|}!#:ēI:-3 2>Ae1FI2!>iI1!u>iNI:AO>y/G ͗m͗II1N :W z1͒/:ҵ͗:͗/͒!~w::INI>iI1͗Iä1!~>w2:AQIIfFI>͗I1>6i:!wI07HWgtA1A@P\d5bEHyed"BA1PYTAE(('@ @@I@hfffff?hfffffA>533333>=ii<0$;9"sU':9"sU'9BT8!%8hxVg 7"hC60wYEG417Gv@`v'b1AAPX#C`QI"U&Àe(HBCTbDvRWaGv"C%T$a'ÙH%Csrb"(HdA1AAXS&YA1AIy&cypt dYd?Sh&&iyv&3uF=84SY592xXT(E133@P5D @cbe@(u?Bp6W>W"f(@E3SxI͗I1͒NI~͗! DM=v ×xʯ ʯ< O*C4|ͅ"q**Cs#r#6LSaF#~ Oͅ*Cs#r~# **C {_zW*Cs#r#w#w#w*Cw#w#s#r!C^#V^#Vz###~X#{_zW{_zW+++++UMOax!R"&6 #x’+6{z+++Fr+Nsq#p#s#r#6`i##s#r*&^#VN#Fx###~p+q`is#rR*a+6++++^#Vz!~*tC~2C*tC#"tC]:E4 ] :vCFù:vC:wCTH:xCRHҳ!C6] ,}"C]*tC~,¡] }"Cð>CUB°ö]>2!C!C62:C2ACBC*CM*tC\!AC"tC:C=2C*tC#"tC!Cs+q!vC6:C2C*tC"C:C*tC:CH:CH\:vC V*tCNͺ:vC<2vCO!vC Hq:C*tC~ H|]!"C!C6:vC!C*C&vC >9~0Hү*C!CA*C&vC >_"C!C4ˆ*C:C2C*C"tC*C##~*CN#F!Cp+q>CUB>*C~!Cq:C_AO>/!Cq:C0O> /!Cp+q*C~2C:C=2Cd*C#"C*CNͺ*CwCu*C"C*C^#V"C ҏ*C"CÙ*C^#V"C*C~2C!C6:C!C*C*C >*C*C~>*C#"C*C#"C!C4¥>#HPMa*C>`B>*C~2C*C^#V"CDMͣ*C^#V"CDMͣHO>*C~2C2C!C6:C!Cڇ*C&*C~\€!C4!C5!C4^*C~2C!CҘ>:C=2C:C!CO:C:C<2CO:Cß>!Cq!C6+6:C!C&:C!C>:C/*C&*C~\H!C6)!C4>!C4>*C&*C~2C:Cw:C?I>:C#`*C&*CN&:C!w*C&*CN!C6*C&*C:C!Cq!"C:C* HҴSSa*C^#V"C*C*CN#Fq#p#SSa*CN#F!C`B*CN#FͣH*C>w#61*C*CN#F*C4B!CscBL:CE:C<*CwL*C:Cw:Ca*C^#V"CÎ:C*C:C͚A*C~>B"CÎ*CC͎A+"C*C>CUBN4"C>4B·DMͅ"C*CDM*C\*C*C w*C*Cs#r1*CN#F`id @PEv2(<PdxPRINTER BUSY?$ IN LINE $ERROR $WARNING $IMPROPER INPUT - REENTER $AT LINE $1AC;5%1ACͥ%"v!(Eq*(E& !)Eq:E!E6*C|E !*E6E :*E) !*E6  ý*)E& *C|:E/HE !E6!+Eq:E/*+EM͘:*+E&   !-Ep+q*,E~$f*,EN*,E#",EL!/Ep+q*.E)))!1Ep+q!2E6>!2E!3E60*2E&) 0EJBڼ*2E&) 0EJB+s#r!3E4Í*3EM!2E4!8Er+s+q+p+q*7E+"7E7B*4E:6Ew*4E#"4E!:Ep+q*9E|O*9E}O>!D`B,7F*DDMt;;!"E>!E`BH0:E] ͈ ͈`0!Ep+q:E2?E!E6;HF*=EDM:?E2E!@Eq*@EM:@E_:@E*C#"C*C"C>>B"C*C"C"C!BEp+qCAEHB!DEp+q*CECJB3*CEN#Fg*C*CEq#p!GEr+s+q*C#~œ*FE^#V"FECXBi*FEDMg*C"FE*FE^#V"HEDMҜ*HE~!EEڜ*HE+"HE~œ*FE^#V!*CDM*Ci*CDM*Ci*CDMJEiͭ*CJEi*CDM *CN#F*Ci*C~*C~*C>`B*C>`B*C~*C~*C#~*C#~!REq*C##:REw!SEq*C:SE^*Cq#pg*C>w#6:҄FO͑*C i!6*CDM1ҝ͒ã͗ͺ *Cq#p*CDM1*CDM*C"TE!"VE*TE>`B *TE ~*TETEHB>>B*VE"VE*TE^#V"TE*VE*C~2aE!"XE*C"[E*C"]E!ZE6*C~!ZEc*CN#F*XEA+s#r"XE!ZE45*[E"C*]E"C*XE*aE&A*C~<_DMͅ"[E"_E*C*_E w#6!ZE6*C~!ZE*_E##"_E*C*_EN#Fq#p!ZE4¤*C*[Es#r*C~2fE*C^#V"bE>4B EAa*C^#V"gE*bEN#F!eEq+6:eE!dEN ̀ *C*bE^#VN#FA*gE "gE!dE4 ̀ *bEgEJBc BSa*bE##*gE*fE&A *Cq#p*bE##"bE*CDM *C^#V*CDMi*CDM 1*C^#V"iE*CJB6!*iEN#F *iEN#F `i"kE~=w *iEN#F*CN#F%!*CN#F `i"kE~!!*kE#DM *CN#F `i"kE*kE4*CN#F*C\*CC͎A++s#r W!7!Z!*C^#V"CD *CDM1:i Қ!Di !D7B!Dsì!D!D7B!Ds!D:i !*CN#FD͏ !D7B!Ds!D!*C^#V!nEp+qmEEHB" *E#"E!!pEp+q*oEDMͣ"*oE~2qE!rE6:qE!rEU"*oE#"oE*oEN*E#"E EXBN"0!rE4#"*C"4*C"4!sEq:i ҡ"D !D7B!Ds:sEҐ"D9Ö"D"!i 6!tE6:tE<2tEO>"*tE&4) >`B"*tEM|:ç"͢": *C|# #*C#"C"D :D:DH##"!D"E*D& 6 *D&D EXB*E"C;QF}*D#"D!CcBs#DOa*D~*E#"E~:E¨#EMBҡ#ͦ8*ED wͦ8#:E´#x#:E#\#!"É#2uE ##:E#!D" E#:E#*E" E#*D" E:uE" $!vE6,'$!vE6":E!$* E#" É#2uE!vE:uE+~ HP$*E#"É#2uE'$:vE"v$́#2uE,:uE Hv$X$#>EUB•$*C>w#6$*EM*C4"wE>4B¸$*E#DMͅ"wE*wE#*EDM* E\*wE*Es*C*wEs#r1#>!E`B%>!E`B%!"E* EDM*E?*CDMIh4%:E/%F#4%*C6 "C7_*C"C"C*C"C+"D*C"C*C"C"C"C*C"C"C*C~%*C#*C w*C>?*C#w*C~%4*CN!3 ^#V*CDM1*CDM͗*CDMIh4*CDM1*CDM͒*CDMIh4*CDM1*CDM*CDMIh4S44l&*Ci*C6A&҇&҄&*C i&қ&EN͑*C>w*CDM*CDM1*CDM*CDMI*CDMth4*C*C͎As#r4*C*CJB+s#r44*C*C^#VN#FA+s#r:yE*'*C B#+s#r44I'ZD͑*Cq#p`'*C*CN#F^#VͿA+s#r:yEv'*C B#+s#r4Ҍ'*C>w#6'#ҟ'*C>w#6'*C^#V"|E!"zE*CzEHB'*C^#V*|EA+s#r*zE"zEү'4*CN#F+q#p4*C B+s#r4*C*CͲA+s#r4*C*CB+s#r44͉ ͠44ͭ4ͺ4͉ 4ͯO?4eO?4*C*C^#VN#FͧO?4*CA+s#r4*C#"C*C*CN#Fq#p*C#"C4*CDM *C^#V"~E*C*~EN#Fq#p4͠ 4*C*Cs#r*Cn&"C14*CN#Fͣ+)U)*CN#FͣD)ͺU)*C*C^#VN#Fͱ4*C#:C<2CO!C q#p*C^#V"C4*C&C) ^#V"C:C=2Cң)GRa4445#ڼ)F#$4v!DM"4Ͱ!DM":i )4*CN#FͲ7*CN#F7V"4*CN#FͲ7V"45#(*F#+*I4*C*C^N͏4!E6$4!E6z$4v!DM94Ͱ!DMͬ9:i z*4!E6:E<2EO!4 >`Bʠ*Å*ͬ5*CN#F*E&6*CN#F͘74*CN#F*Ci4*C+"D4*C>w45#+F#z$4*C^#V"EDM/>EUBH3+*EDM 4404:i ڟ+!E6:E<2EO! ^#V"E!EcBn+K+EMB…+*EMß+ EEHBҗ+0ß+*EDM!4^!4ҵ+^!ý+*C##"C4J!47!4ͅ4!E6*C"E"4!E6z$4!E6$484c":4*CN#F|:4*C>w4*CDM͏ 4͚*DM N*CDMI4c,*Cq#p,v,*C>w#6,*C>w#64*CDMͤ4*CDM4*CDM)4ͭ*CDM*CDMͤS44*CDM 4*C EJB>UBH,LTa*CEHB,:*CN#F!4*CDMt4"EͩADM *E|:-͗*CDMI4*C|r-#E *'E&.B*&E& >B"x-*C"4HҒ-NL͑Ú-*CDM4*C*Es#r4*CN͈*Cw#64*C^#V"EDMͣ-CAa*E#~2E*C:Ew#64ͅ"E*E6*C*E# w*C*Es#r14͎4*CN#F2E*E&*Cq#p4͎4͎4:i 2E!i 6v!!Es!D5#~ ƒ.:D=2DD É.D 1:E2i 4*CN#F*CN#F_?*CDMI4*C*C^#VN#F1;"E*C*Es#r4*CN#Fx;"E*C*Es#r4*C^#V"EN*Cq#p42E*C:Ew#64ͅ4*C~=w*C~=HU/IOa*C~4B™0!" E!E64l!I4*CN#F͗4*CN#Fͬ5*C*C^#VN#F6*CN#FL72E:E0}4*CN#Fͬ5*C*C^#VN#F6*CN#F̈́74*C^#V"E*C*E w4Dͺ8l!4*C^#V"E>4Bʠ1*E~2E!E6:E!Eڝ1*E&*EN͈!E4~1å1?͈ ͈4*C^#V"E>4B1!"E4*CN#F *CDMI4*CDM 4*CDM͏ *CDM1ͺ *Cq#p4*CN#Fͣ72.2*CN#F 1*CN#F64XIa4 2E *E& 4*C*tCs#r14 Җ2*Cq#pß2*C>w#64 *Cw#64͢"!C6!\"4*CN#Fb6 *C"C"C725zW{_!55}5*5e5 |g}o"5*5|g}o"5P5*5*5DM*4.͌5"485*4"485xʺ5>@>5NBa`i>)=5. DMͅ"45 *4 "4"4}246Ô54*4$$*4 DM!45J64~#FDa*4r+s"4:4=6|6!4~@w6`i"4)x\6>>FNax7*4#  *4G7ړ6:”6w#>266ڪ6 œ6.¨6266 ÷6:66.6# 67*6:4>*6>266?#`6{6_:7*7?7w#:47FIa>? 7*4*4}O|Gxr# 27*4*4#{z"4b6 5]7!7>=5*4)4w#w4^#VzEOa#"Cb655!7EMab6 5<ʊ7!7J64 s#rJ64 ^#VzUFa"4*4)4 ^#V"45*4"4!46Ô5!4~w8:4BR=aURax8RIa *4E5*4{o>g+{z_yW8!*4 s#r!4~w"46͔5*4!,! ~#~!4>w:428(5!7!85͞5o8;7Ҕ88͌5"4L8:4L8*4~::͂8 *4|ʦ8ERa`i6͂8 8Vʾ8rþ8 656*4|6͂8 86!4~ЇwRWa͔5*4*4{_zW{z<05:9͞5=9͔5!7!4>w*4|WDa#"C*4"C*4"C6}*4|u9*4|REa+"4;7҄98*4"4:4¢9L8*4! N#F p+q*4q!4>w:i 9,!4~6]9"]99"]9:i 9,!4~6]9 `i#~ O]9=9x `i#N]9=:*4}_|W-:z-: ]9: ]9 ]96*4|FEa#"C*4"C*4"C*4!,! w#w*4+"4!4~w6}J64 ^w#Vwz•:UCa"4͔558͔55=54 w#wJ64 ^w#VwzUDa"4͔554 w#w=5*}o|gyx"485$ͅ"4ͣ(;b6 5OSa(5(;͞5=;*4DMͬ5*4"4b64<RFa"4b6424b6*4 6?4ʾ;`*4O ~O ×;=524NO INTERMEDIATE LANGUAGE FILE $CRUN VER 2.38 $COPYRIGHT 1981 COMPILER SYSTEMS INC. $ REQUIRES CP/M V2 OR MP/M$!E"E!\"E:Cڒ<;F;F "C}s<Ү<VIa ͼ@2E*=!E6ͼ@:E<2EO!E Hqy$<þ<*EE?:<CNa*EDMI*E"E*CcB=@î<:CҊ=@EXB/=FCa@EXBA=CCa@EXBS=DCa@EXBe=PCa@CXBx=SCa*C"E*C"EA=@"EE"E"C@"E*E"E"C@"E*C"C@"E*C "C*C*C@"CXB7B=@*C"Eͼ@?:E3>ͼ@*Ew>*E#"E=?:E,>ͪ@a@ͪ@?:E_>ͪ@*E"E*E6ͪ@ͼ@\>ͪ@*E~<*EwE>?:E~c?ͼ@~`?:C]?:ES?*E"E*E^#V"ECXBS?>EUB+s#r*E ~<*E w¿>*E 6:E=2ES?*E*E& "E*E^#V"E*E##"E!"EEEHBS?*E^#V"ECXB=?>EUB+s#r*E ~<*E w=?*E 6*E###"E*E"E>*E"Eg>?ͪ@:E6:E7H:E`H:EHұ?@*EC͎A+*Eq#p@?:E.?@*E^#V)))E*Eq#p@?:E?@@=:C@*A*EECHB *E 6I*E 6N*E 6T*E 6 *E 6*E V@:CM@  ;F *E *E#"E!E7Bک@!D"ED W@ʐ@*E6é@D W@ʩ@*E 6*E*E w*E#"Ea@*E~2Eͼ@*E#wͼ@*Ew*E##"Eͼ@O`i.Bͼ@_MNa *C"E>EUB)A*E 6*E^#V"EA*C"E*E^#V"E>4BʋA*E>`BPA*E ~*E ~H~A*E DMÈA*E^#V"E0Ai`N#Fog_og_{ozgi`N#FogDM!>))덑o|gA =A^#V))) DM!>))A =AYP뗖_>#Wi`/o/g_{ozgi`N#Fog^#V) .B_{ozgO{ozgi`N#Fogo&og_{_z#Wi`N#FogPMXList F STACKSIZECODEDATASTACKMEMORYSTARTSYMBOLSPUBLICS LINES MAP NAME PURGE PRINTORDERRESTART0!fw6#6.pN,FYE!}wq.nN,F=!pww#p.nw#p*nw~!}w¹F*nw#KB=!nww#püFqF(̈́Fnw28!~ww#p)̈́F!~w~,F-N,F,q#p.nN,Fz=!nw,Ox.|q.y6.{6!yw2 COPYRIGHT 1978,1979,1981 COMPILER SYSTEMS INCd  # ()*+, -/: ;<= > ^ASEQ GEGOGT IFLELTNEONORTOABSANDASCATNCOSDEFDIMENDEXPFORFREINPINTLENLETLOGNOTOUT POSREMbRNDSGNSINSQRSUB!TABTANVALXOR"BUFF(CALL#CHR$DATAcELSE$FEND%FILE&GOTO'INT%LINE)MID$NEXT*OPEN+PEEKPOKE,READ-RECL.RECS/SADDSIZESTEP0STOP1STR$THEN2WEND3CHAINCLOSE4FLOATGOSUB5INPUT6LEFT$L#CALaMATCHPRINT7USING8WHILE9WIDTH:COMMONCREATE;DELETE  DISK ERROR $BASXREF06: NO SOURCE FILE: $.BAS$XREF07: INVALID PAGE LENGTHXREF05: INCLUDE NESTING TO DEEP NEAR LINE$XREF03: OUT OF MEMORYXREF01: OUT OF MEMORY$XREF04: TO MANY FUNCTIONSXREF02: OUT OF MEMORY $PAGE NO$ NAME TYPE$.BASPARAMETER $ FUNCTION $ GLOBAL $XREF V2.08 $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$COPYRIGHT 1981 COMPILER SYSTEMS INC.$1r  ͓Ϳi^ v!s+p+q+p+q:=2C** w*#"*#"!s+q+p+q:=2n*:w*#"Qc!_6!q*_& :w:_<2_ڥo!q*&!q*& Ͷ Ͷ!q:*Mͦ:*Mͅ: !4!6 !4!p+q*~$**NͶ*#"j  v *DM !6 * 6 * 6*y *~ʜ*>@_:!6>!*&*~ *&*^!4¡  :ͅoc:;* c :a:a2ccc6+!6*2O>Z+:    !p+q!6+6>!!60*&=) .*&=) .+s#r!6#4Ö:/!*M !4ˆ:y2z͔2yc>!W!5"*& *DM! "*& ! ~2<Gv:T!6:`!6:yÐ:y w!`6*#":y „!y6 :y ʐ:y:<2ڰ!6<°>*&* ~ :yHü:y 2y:y\ͼ!6!6:<2O! ~$*& ~'H!:H=  *& ~$f :<2O! ~2'!:Hf :A2O>c *M!S ^#V!6c !6c !6#6c !6!6P!6$!6c !6c *& ~( !4!6:<2O! ~02O>  ::H!2 :-   *& ~)@ !4c !6c !6c C K L !6+~! :<2O! ~':!/H#~!H *& *& w!4t :l2a5!6!y6 ͼ!{6!x6!r6!t6:y" !r6B" :y ͼ:y" 7H !r6A:y0C 2y2 |7S |:yH:yhHq ÿ :y :y+H:y-H EHҿ Ҵ ÿ :y ¿ ͼͫ T҃ j  :y$  :y% ͷ> :|F:}NH:{H& !r6H+ !r6F!{"::x2<ͫÀ :rb] :y Z 2yF À :rc| :y y 2ye À ͫ :y%:z Hҹ ͼ@:|I³ :y ʽ 2yì ͼ!{6:y :y.H:y H @  * 5:<2  *DMz *:=o&" DM! :=o&" ! :w*# D:}:‚ :|*w~:{==2{_| >!{Ґ !{6|*# _DM !65!y6 ͼö  :y\  ͷ !r6ͼ :{<2{O!{ :yw:y!x?w ͼ 2y*{&{ ~:y0O> /:ya/>z!y/H:y.#!S:y_2y@:yAO>/#HTH7H҉|TҦ:yAO>ڢãç|:y ¶ͼ> !{>!6*{&_ ~2:!ڐ:!2!6*{&I) =:{*&{ :=O* ~҆:<2Í:=2>>@_D!s"8*++"!>6#6*~=!?*?& *:>2>!?4·:>?*^*"> 9+s#r!8G  #*!Ap+q:y 9*@+"@* >DZ* ^#V"9*~=O! *@. H҇*~ ¹* q#p* ^#V"6* >w#6*N! **@s#r*4*<&) ^#V!Bq:B8!G   !Dp+q* *Cs#r* >w* >">9q*~2E*:ctc>*#^#V"=>:E=O! **E&*: §:E=2E¤>t>*:>2FO*8"*:#* *:*w_ * 6*#q#p*<&) *s#r:F8+s#r!Gq* :Gw*~!Hq* :Hw* ~* ^#V!Iq* :Iw* ~\2L!M6:L!Mھͯo&"J*J.ʧ*JN#F`i"JË*#*JN#Fq#p!M4p: :rF27/!T!ͪ"DM *6* >w#6:T!4*M%!%@"*DM$ :rH²:sš*#">"^  ͪ"DM *6* >w#6!6*M%!T6*"7ү@"*DM$ :r !T!6*"*ML!T6 :r :T!T6!6: *"e!6:r2sÿ~*8"P"N!"R!s"8,}*N*s#r*N##"N*+%s  *RDMz *R#"R0*P++"P*R"U>!UDR!U+s#rR<"W!Y6:YO!Y6!"\W\,L*U*\"Z*\)*P*Z)*P^#VN#F[?*\)*P^#V"^*Z)*P*\)*PN#Fq#p*Z)*P*^s#r!Y6*\"\óÌ*P##"P!cr+s+p+q*` *b ~z>*` *b ҏ>*` *b ~Ҥ>*` *b ҹ>*`*b *b~2f*`~2f!g6:g<2g!f>*g& *`*g& *b~ᖟ*`:g5*g& *`~2d:!d6 *b:gY*g& *b~2e^!e6 !e:d!h6!l6*~ʤ*>@:l<2lO! Hq:l<2lO! 6:!m6>!m*m&*~ *m&*:l<2lO! w!m4©h*l& DM :͞*P"N!"jRj,L*N^#V"!m6*~!mP:m=O! *N!m4**>!O~,klMÂ,|wMÂM@"!i6: >9 !m6*~!m:i, !i6:!^!:/!͞+~:m=O! *N#Fz!m4¥* ^#V"Ô^!:/!7͞*N##"N*j"j!op+q!p6*p&*n~$}*p&*nN!p4X!qq!r6:q!rڝ !r4‡ MM~M:+~7M:h<2hOz^^?M^^!6_ogDM!>))  =^#V|g}o _{ozgi`N#Fogo&og_{_z#WCBASIC XREF LISTING OF $ $ $\ INT XRF;:$$$I"I$! !$I@!B B"D$!D $I$!.MAIN.\.PROG..DATA..BLNK.FORRD $\FORRS FORBN FORI mFORW -\REPX 1LOG DEPX CSW M\CWS SRD RDS RSRD .\RDRS .CBNI cBNRD 7RDBN \RDW CIRD QRDI NFINT 7U\FFIX &SADD bIEXP :EXP \RND fINT 6FIX hSGN C\ABS !$SQR "xATN # TAN $-v\COS %SIN &IMP ' FRE (^ \POS )$SETMID*RFCB$ +!TAB$ ,\HEX$ -EPEEK .ASCII /CHR$ 0 Y\STRING1$LEFT 2'RGHT$ 3YRIGHT 4D\MID 5?XLATE 6kINSTR 7iSPACE$8\LEN 9)VAL :KNUM$ ;BGTE <B\BLTE =BLT >BGT ?BEQU @k\BNEQU ABABS BBNEG C PNUM D\P$ EEXC FCHAIN GSIZE H\RENAM IXFCREATJFDEL K=FOPN L6\FCLOS MRSET NRREAD OGRWRITEP\SWRITEQ^SREAD RSETFCBSIIMP Tl\IEQV U IXOR V IOR W IAND X \INOT Y IGTE ZILTE [ILT \\IGT ]IEQU ^INEQU _IABS `\ISUB a IADD b IMUT cIDIV d)l\INEG e WGTE f WLTE gWLT h \WGT iWEQU j WNEQU kWABS l #\WNEG mDGTE nDLTE oDLT p\DGT qDEQU rDNEQU sDABS tA\DNEG u RGTE vRLTE wRLT x9\RGT yREQU zRNEQU {RABS |\RNEG } SGTE ~SLTE SLT \SGT SEQU SNEQU PRS Q\PRD qCMPSTR^CMPRD cCMPRS c\CMPEX CMPBN ICMPI CLS s\RSTR CLBN RBN #CLRD \RRD %CLRS RRS RI .\CLW RW CRSL CRDL \CBNL CIL CWL CSL \TSTRS TSTRD TSTBN 'TSTI \TSTSTR%TSTW $PBN BDIV i\BMUT &BSUB BADD  DRD \DRS DBN DINT DCHAR \DST iDNUM SDSET IRS 2\RADD RSUB +RMUT KRDIV d|\RSNORMmIRD /DADD DSUB 3p\DMUT `DDIV yRDNORMlREDIM I<\BASET 0MAT ARRAY IBN -;\PCHR APST 1PST 9PI \\CI lCBN uICHR +IIN \IS ERR20 dMPY ]COVDECrp\GETVALIBUF STRPMT"PSTR 2\PRMPT ONERR FMT tSTRCLR\MPOP MPUSH 7ERR1 (LN p\ERR2 SAVHL GETHL SAVIO \GETIO TAB TAB1 RETN \IWRD 8DUBL =SCLEAN6STRPUT 9\SPUSH SPOP |SMOV %SCHNL17\SCHNL2FCNTLCECHO BASOUT\ASCIO iZP XP !PHRS <\PHRD PHBN ZPOP XPOP +\SYSIN SYSOUTf;D"f"!>@!> ;b">! >/;(dͷ*>2!> ;;C*>!:0͇;NHi*!>@!>;b`!C*> !>>;u3͸!*>!n;2͇QHQi4; V;D"f"!>@!>;b">! >7;(dͱ*>2!>;;C*>!:0͈;NHi*!>@!>;b`!C*> !>C;u3Ͳ!*>!y;2͈QHQi2;\;D"e"!>@!>;b">! >2;(dͧ*>2!>;;C*>":`͊;Nh*! >!>;b!*>@!>D;ufͦC*>!;d͊PʐPh;X;D"G"ZD"k"iH"!"%;I"K"W*k*"*i/;+:l]2͋J@*!*;?i*k!**ka;U"!d͋:ʐ:J;i;D"""~wy%{o;!~w!~;*@; $"!>2! >; B:#2#B:2,2;* C!>3";< C!>!!>B;O dͲ! >3 0ͳ;` C!$>!!$>!(;s >!$ >!->"; ͱ!$>@!(>; f2B*|@!->; b*|g}o" !; >dͳ*| !'; >C! >0ͳ5; C! >&îͳ@:, ; !>!->`!l; >dʹ*"; A; $"!>0!H":V; $t:Ht!>`!;) >d͈[*#"E;= C!>!!>ʹn;P C!>$ *| ž!;d >C!>0͈;v HҞ*+"!>!; >ͳ!>c; C!>3!z; y=´ >!V; >! >ʹ ; C!>2Ͳ!>C; C!>!!>!; >! >!>͢; !>d!>0;# C!> >2! >;8 fͳͱD:=-!>ͼ;K ͳȱ*|@p;] !>`ͳ͒;n ȱ*!zLOG <= ; 0 OR A^X A<=; ; <цxAr; RrX^; R]@; $"!>2! >; B:2B: 22 -;* C!>30=;; C!>!!>!;N >͸!>:';a $p!">2ô@!>;u d! >2)`͹!; >C!> !">; 3ͷ!!>!; >&":@!>o; f$"! >0; I*b͹: !>; 2!">! >h; dͺ*; ;# "d!p>!;7 $"h"f!"j!>v;L C!p>2͇@*f#";_ f!p>!>`;r Ⱥ!p>dD*f|; !p>!>``; ɇ*f+"f!p>V; C!>2͹!p>K; HÇ!p>d!>0@; d͇*h#"h!p >; C! >2͹!p>; H!p>d!>0; d͸!~>2!~>O; C!~>!!p>!;3 >!!"n>2l !p>L;G 2!~>! >+;[ d͹!~>2*n";n n>C!~>0͹; dͷ:l=I2lK!p >; $2l:l=I$2l!p >n; C!w>!!~>!O; >͹!~>!~; >! >*j|; +#e"jͺ; d͹!p>3ͷ !p>; 2!p>!w >~; d͇™!p>@*f|;1 FFC!>0͹Q;C dͷ*h|#` !>/;V 3͹2͸*d;h r;} ; ; I$I ; 88.; ؝I$I}; F; ; ]ݪrs;% >2>",![>!.;: >!$"<!T>0';M C!M>!!?>!?O;` >!F >!.5;s ~#u!.>*<:; 3͹!!.>!MR; >!T >ȹ!M; >![ >!.>͙; ͺ!M>`͹!; ?>dͷ!?>0; C!?>!!F>͇; I !.5#<; D:>= 2>*<#"< ]!;! ?>@*,h;5 ;J  ;_ ""!>!;t >*|g}oH"Ҝo; C!>2͹*|ʺ; C!>!!>͹; C!>$y*; ; &"!6&`:ox; !; >;&" :`!^;&" `;![;$"$!'>2:*W2* ; z2-!' >!;);$"$!'>2:-W:*; 2*!' >!k;);$"O!]>0!@:`t;R:`R:_;) R:_ R:^;>R:bNe!;RDM)) )O L;&"->2G!g ;w#L!0"ȶ!0;'>!;!"}>2ͅ!>;~% !#@x~;'f2,f!,:w!;8'>1:6| K/@;J$<2!>2: =n2;^!>ͥØV:6;q3:6!o;d;&"``|ʀ!;!;!"F|2Pe)};lg"N!I>6#=>/!Ie;*2wͻ:P$=:O 2O!;>I>!;$">!G>2*H}lg:G; !B=A 5Gu;*|g}ox!5;3"! >:%; ! >2!1>;#fͧ! > Q;4;$"! >1! w#>\;w+>!h;&"_f2!` ;2!!;"f!`!~ 8#;4&.wG# ;xR;H Ny22.; [`2!;z5!z8zW#;{_'`z@8q;)`iDM!;$"d!o>2!o>;C!s>!!o>!;'>ͱK>2"d;;C!s>!!o>!g;N>! >!w>͊;a!>d!>0;sC!g>!!k>!w;@{~#‹!w>;C!>2ͳ!w>;C!o>!!s>ͳ;C!o>!!g>!ok;>! >!w> ;ʹ̳ͱ!g>;!g>d!k>0r; d͈[!w{ -#;:$=[2!g>͕;3!k>d!>0;EC!>2ͱ!>2;XHÃ!g>`!;l_; R;&"W͝HN!Z>`!;b>dͳ!^>0A;%dʹ!b>2!b>o;8C!b>3Ͳ !b>P;J2!b>!e; ]PT;3"P!_ >:b6;f !_>!2 >!;$fͱ!_> ;5;$"P!_>2:bH2g:_;!S3 !_4#~w;*I%:_$!b:gG~";?w!_͵!!_>!;R!!c>*P;fx; 3"!!! >:!!; /:!#@>!>H2B!?;& >*!!;>`*;8 !2;!$"! >2:#2#g;!C! >!+;"!"h>2w!!k>!k;">!o >ȴ!s#;'">!k >!s>;:"ʹ!s>`ͱ!9;K"o>dʹ!w5Hg!s;_">,!;s"e;#$"!>2: 2:;#2!>@!>;(#f͈H]!>`! ;:#>dʹ!>0;L#C!>&cͲHc2;`#D"!>@!>b;t#d! >2!>;#C!>!!>!;#>>H2!>`;#ȳ!>fͳ`ͱ:;#=¡! >!a;#:!!>:-;#2!>!u;#;#":u;$$"&!)>2!)>;$d&!)>3%0ʹ;; %$!;%3"&~!& >̱&;&$"~!>2: 2;&2!>! >D;)&d͈M!>@!>I;<&fͲC!> !;N&>C!>0͈;`&Hҥ!>d!>0;s&d͈ڗ!>@!>;&fͲC!> å!;&>I!Ä:l;&B:2D:22';&C!>!!>ͳ ;&C!>!!>!;&>ͳ!>!b;&>! >!>͞; &!>d!>0;&C!>3ͳͲ !>3;1&3ͳ2Ͳ!>;C&fͳͲC!>0ͳY;T&dͲ!>3ͳ !>;f&2:!w@!>:;z&`!o;&]3;&|%;'{2_N;(}!9* |/g}/oF;(# |! <?;*(^#V"`i ;>(O! N# I\; S(+|F;)x!ZCe !{T;) y!{ NI;*&"Kf2!`;*D"N"PF*P|€Jx<;&*J:OaJw#@;9*DJ J:N=2N0!B;N*;+&"!6S2;+> 2!;,&"!Z N{%; , O8!;-&":!z@=w#;-z=w#{̀=w#{ ;)-=w>f2!; ;-0:; .N*;/&"!6:_T;/!;0>A;1""""1"E:"0!Q;1 w#!;2""""%a!6:%;2f2!f!;#2;3&"T` &"W2;3f!f!!(;$3#~${b2*W`:;73H>2Wo`e:W;K3@:W!!;4"";">f2`!͌;4!!>:N ;#40! ړ@2> :>T;64!!5;5""8"=&";`2!I;5!!:;r;$5O :=d:=!!;85;6&"df2!`;62!!;"6f!32! "g";36i*i~ʈ^#"iO0!;G6 ~5B*gw#"g`!4C;[6M5!;7&"ff2!`!;72!;"7f!K!:;47G:ʘa:Œ[v;H7T e#ʀH# ;]7 =!J;8#""}!6 #= M; 8l!;9&"&f2!`!;9!~# ;#9!;:&"=f2!`!;:!D"Ͷ!@;":H7:J g:G2G!D;7:>!W;;!">2P̈́;;!;<3"A͊ >AA ;=3"A͊ >AAA b;>3"A͊ >AA ;?3"A͊ >AA>@;?`A9;@3"A͊ >AA ;A&"͊>>!};A;B3"C! >: ;B`C1;C&"!>: 2y;C !>0!;D`:_!6>H22S;DI222$2222^;)DB2>02B2> 2!";?DI"""&"*o@"~R;SDHg:‰/2!ӐrN;gDHʀ~$\w*~H *;}DHQ*+"*#~͐1;DB*$!*|$B;DHm:„m>2͐**;D##"Ç**|;D*m:m>H2*;DB*##"$‡> 2;D2*Ç,%*|;DB*|m>22@Ç-;;'DHI*|B:>2HÇ:];=D!>2!+w *|\;RD!c>2 >+2Ç :;gDB>2>+2^¬i;|DD**|m*#~^Y;D*É>2~-@‡>;DH2Ç.H¿:ˆ/2;DBÇ#‡B::2;DHÇ*#"o!"";D ~ *!- *>X;D 2~.ʄ# # E#o;DH#*w#I"B*~;#D.*~ BHEH H*;8Dw#"͒J*(E¹;MD>+2*~-e @e+U;bDIk2*#~+~|>0*c;xD$+"2͉*~2:0o&;D! c:0o &b;D$":$-¹*`eL;DH"*6B*|@:;D*|**a ;DF*͋IR*\ *;De*a*͋l;DHR*eͦ͐*e;D#*͋$Ґ*"* ;0D#*"~w~:R;DD w!͋*;WD#*+~#w+0!;jD1͋` >12͘B!];}DI"@*+"~ *#";^DHF**͋> $ :;rDʸ**+ȋҖ;D>* *$#"{**;D2͋Ҹ@:>$̐ :";D>* :g:*2;D#*͋!> *#;DI":g:g:/;D:>$- : :;D !"":ʁ@**;DaH"*|H?*C;-D~#" D*+"Ð%*;BD|ʛ*1!͋>,;UD *>~ # =\";jD*a"*:;~DH?*|Dʛ+"*~#"8;D Á@:>.̐ *;D|*|*~#"';DH *+"*+" è*;D|+B">0 H:l;D*|C>E͐ :;D>+ >- *|;D1e" *! 0dW;%D}0 ! c@*-;9D`a}0H : :;MD>- H: "*;bD!* "*";vDF*a$"*@*;Da"*|#" *6;D0#"ÐH"**u;D" "*1a" *;DD*"**"*;D|*+~#w+"!>;Dȋ>0d2*#H"B;D@#.,-$*;D^+:O*;-D"#"*"#"* #"ɇ;BDD*#"D*#">% |;WD> *I"*"|>;lDBq>2>22H22;DI222 b;D; D;Ed*o"~$:@·>;EL2!r"*~!L5:C;)E!/> !Ç/v *;>E#~/N"ʷ ?L"!;TE~h́# T Ç;iE> hÇ&˜:3;~E0O!>*~ !ʲ;E!/ʲ&ʲ#"G\@©F#;EB"x##"o:o;E0O!>!r"om;Ea:O;F0u}͸;F&}Ð?:3;)F };È&2;?Ff2f!`!};OF0:O~Aa# T6x2;cF}}>E;wFf2GG$$$ SUB;F;F;G0!6*%%L"S;GL* w#€~ ;(G@7=_*6 6;=G@* Q!0;QG@* 6*%{/_z/;fG W"!~_#Vʊ#N7;{G#F* r+so*"`;G$"W:@2f;G *% w#z€*;G*%CHAIN/EXEC;GUTE OPEΪ F;G5;>DHMSru;G>!$GO t͜;GO_O*t{€t<;$G>! Ow#=@,|;9G$FO+|=Ow#GG;OGy]! ~\;dGO@ ;yGPROGRAM CHAIN/E;GXECUTE ERROR$;HfK!@"2;H:@#=_2;'H! |A ;6#=+!;9K!m;L M>@~RʀSʧ;L&!(FILE OPE";)L!6"!6`ͬ;6#=6#6!;LR-TYPE FILE NOT;0L FOUN`;M }2M>ʀ~J;M!RʰS-&!")FILE;'M CLOS"%~~;QS-T;MYPE FILE CLOS"N3$X;M0N ~#¼:N ;Ma:N3N+;M0*N3 *N3(6;M;NGx !2:O>;Nb-~R- ";(Nw! |2@"3A;=ND""@"!$ 2;RN~#HU: @9;gN$:ʯI£ **6;|N6 #{|+6 +6 *3$/;N  w#—!6;NIʟ+rʹ+H;NIË >2 9;NË+BË:*;N *|}*KH!;Nd:I9=* "*L;N"*H":>';&N"/2*IK7!0;:NH]*3$w#BDM*5;PN }2zW{_|;eNg}o\z1" "~";zNZ22\D:*;N|1}@1}O*3 ;N~@*3q*;N3! *3R;ND!9]!~w##;N$:!d:i2!\;N:*}2; N}2Y:] =_*M; N!"7!"5* !;5N}o":S ͅ¹;IN=‰Dͅ+|;^NHS:5Iͅa ;sN:Ÿ:}Ÿ9;N!w#`3;N]:ʭ";N"_:ʿD*~#"~{o;N xs*5;Nw#"5 }耄;N]:"_:;N*~#"~{€!7;N@"5}$G:@8Ϳ;.N=’,ͅ+|;CND89 :~;XN_!_:ʐq*Z';mN #"Z{@ x&;NHK:8>*7};N`$9:ʭ;N!_:ʿ*Z #"Z{+;N$28!F&;N #"7ѯx|g}o;N>!) #=;N@)) #Ð!;Nd!2!];'NL!!3;:N\;ONG;dN2;yN;NR-TYPE REAE;NXTENDING FILEND OF ;NDISK DAT RANDOM RECO;NR R-TYPE FILE NOT OP;NE NO MORE DIR SPAC*q;NWRONG TYPE FIL;O1P=P*P 4;OP2!Pw#;#O&=!3*P0P,;4OaPkPw#=˜7P,;P"=ʪ!*~};P ~#k~}#=;,PH* w#4 ":;APO>~Rª ~;TP!$"@ ~#a ;iP=_!x~*;~PD͗*w"#"͗@*~#;PD"*|"ʤ+" !;P!׀D;P READ/WRITE PAST EO;P+READ/WRITE SEQUENC;QF"+: O>@~`;Q S ~R>Ww";(Q@+~#-HI*+;>Q~͋~#@U=_!~*;SQ+~͋#=U*;hQ+w#‰j͢!-0-;|QI*!"&*#$"(Ì@*&|z;QDs+"&*(w#"( :%!;Q::*¸/2**!;Q "@*#:-;Q =_;Q x!R;Q;Q;#Q S-FILE WRI;8QTWRITE ON UN-OPENEDD;MQ FIL,S TYPE FIL;RF"Z: O>@#~;R S# ~W#>Rw".;(R@0*~#-H^͞);>Rf2!͞w#=D;QRb!*Zdw=_!);eR~*Z̀w#=j*.;zR@0*w#ͳ!\;Rd*Q"V*S"X@*V|;RDʈ+"V*X~#"XH:U!jh;R2*Q "@*S=;R:0 =_0;RB x;RÄ*Q"; R}>M6# ;!R!;5R`;JRRE;_RAD PAST EOREAD ON U;tRN-OPENED FIL,S TYPE *;RFIL;S@!> 6 # =!6k;S2!`::>@1~#;'S#`/ @~@T#; ;S_y{ʠ  >?w#ˆ;S/;TzW{_x/Wy/_;Ux/Wy/_; VzW{_`; WzW{__; XzW{_~; Yz/W{/_";Z3"_͋ >__ ;[3"_͋ >___ ;\3"_͋ >__ ;]3"_͋ >__>;]`_;^3"_͋ >__ ;_&"͋>>!Y;_;`| /g}/o#;a}o|gɯ;b}o|g;c3"dd 0e;c`*d;d$"0"e!;d| |exŷe ;'d; e|/g}/o#;fy>k k X;gy>k k k I;hy>k k N;iy>k k >0k ;jy>k k \;ky>ƒ >͖;l{ /<_; m{/<_;n3"s͇ >ss ;o3"s͇ >sss k;p3"s͇ >ss ;q3"s͇ >ss>{;q`s;r3"s͇ >ss ;s&"͇>>!L;s;t3"u! >: ;t`u;u&"!>: 24;u !>0!_;v3"{͈ >{{ ;w3"{͈ >{{{ B;x3"{͈ >{{ ;y3"{͈ >{{>Z;y`{;z3"{͈ >{{ ;{&"͈>>!A;{;|3"}! >:;|`};}&"!>:22;}!>0!];~3"͆ >҃ ;3"͆ >ڃ̃à ;3"͆ >ڃ ;3"͆ >ʃ><;`Ã;3"͆ >ʃ ;&"͆>>!A;~;>2P"022. 23!l;6>D:7ʘ:92/N;) 29!6 >>0X;2͈\@!@>;OfʹD!.47>0;aC!H>2͈ҁ@!@>;tfͳD!.5\:3šZ;$/23!L>3ͱ 7!;6>B!.~/<; Ҵ^~w>25{24!:;Ąw#@+~0;لA:/> >-2:4;$1:4=B2.>24>25;L!::4=24~#L;  >.D:5X=@25~;,#!$::4/<6.#6;@0=>:4 G:5G#wN;V+~0ʄX.f#6:.v;k ʘ6E# +{/<-p#T;" ڈ:Oxʔ0w#q-;#6!~¯60#6>;d2ú#~¯x2:P;:n :O>;Єf!A*0!6 >;C!@>2ͳ!6>;$22!6~$  = w!9;; ~w+ ‘:222 ! ;!6͵:20;5?;J7+;>2"82262<;C!?>":@ʠ@:E2;'72EC!?> >{;2͇\@!S>;OfͺD!647>0;aC!a>2͇ҁ@!S>f;tf͹D!65\:<šB;$/2<!h>3ͷ 7!;?>B!6~/< ; Ҵ^~w> 2>{2=!F;ą w#@+~0;مA:7> >-2:=;$1:==B26>2=> 2>;L!F:==2=~#-;  >.D:>X=@2>~;,#!$F:=/<6.#6;@0=>:= G:>G#wN;V+~0ʄX.f#6:6m;k ʠ6E# +{/<-p#K;" ڈ 2p0O x2oQ;@ʜ0w#q#6!~·;60#6>2#~·i;3x2: :Ӏn>;Ѕ:O>3! *8;!?>!S>`;ȹ!?>b2:@!?~.;H((=w@!E~w+ ;D::2:Ó!?ͻ ::c;20;G;\Ѵ$5 `;&"3!6!6j;!~ʀKO;$D62#! ~;9 1Oz„2#8À1 ;N"12M1l;&"`!>! >;!: &~n;$_:  !͉9;5F*`! `~w!;H @R@_#r; [ T!;&"`!>!>;! :&~v;$_:!͉9;5F*`!` ~w!;H @R@_#w; [ T!; Oy;?;&"F! >!> ;!: .~>*;%7EE0 ~7l;9E+@9!;zz>7zR; {; }Í;$"!H!!; TrueFalse; }Ï;$"!H!>`!X;c; }Ñ;$"!H!>`!T;; }Ó;$"!H!>`!X; ;! !; }Ö;&.T .F;&"͝!!!;j;&"͞!!!;i;&"͟!!!;h;&"͠!!!;g;&"͢!!!;f;&"͡!!!;e;>Þ; >"!:>; @/!;!"$>!!;# O~#>!; |>; "#{ʃâ!2;6*#:â;}T t Yʀ yY; >>2;""!>:2;C!>0:nʐ0!;(>ͧ!> 6#=5;:5Ƙh! 0R6;L #E.@v#~##;a0v>6 #=h60##É=;v`:gw-ʀ6 #w +9;a:nʓ#6 #6>0 !+;0w:nʘ:O>0; *;aͧ2ͧͥ >2;y!#L !B;&#)&`!;:7>'# ?3;NLf! ȥ!y5:xʟ;a3z!2ͥ!y4>2x;uB6:y! 򧀟<C;'# •HүE@Ë Z;F!`ͥxw`! ̈́;äɥÉ!:`2;Ԥpw x*".;a!>!>`̀;̧*a!>*q; &! DIVISION; BY ZER :0:;1 !̥!;B(!7>Π;U'wG# QxK;aͧ2ͧ>H2ͽ8; > 2 $͗D@>;(3!0ͧD+~0§;9=&L!͘!;Ma:2]pw:5;aPڃ*&"!> ;tC!>2ͧ*0!;>*:u; G:<7C2!O=; ~Ҹ!;¥~+ ~~$;ץ!~w# ; `ç~w+?;!! !f;§`!w# ;`ͧ~@>w`ç>; wç3;B >U>2n;8!@:@*pN;*w>*̀;>H!'w# Dù;S:>!HjC;i27>5;~'w## @v>Hj!;@ !ِ!;@OVERFLOW/UNDERFLOe;י~w> 2;ҧ""">!>!;d*H!;M; 1ͮö; 1ͮð; 1ͮ; 1ͮȀ;3ͭ!~w;#3* ~;BP""'"+>,O#~ʚ;'33 #x2~);;AFy,E ##" !";O&!VOUT OF STRIN|;cG DAT;f* ~9~ " ; ",ʄ(+# ;( #" xf2!`" ;9L!?OUT OF NUMERI ;MC DAT;@" ~,#H" ;I")!+Ͷ:1W@:.;$2.*)+w#  >; );>ò{;>2/",!!7>!2x;>262;<@!2>;(`!;20!57wҦ+š;@:0G!5~w!2͵;A:325!5~_w!j;в:~W w:/W"0!2;@7NG x 1;H4#~w€6;~/w+~w+~;$w !;$"!>2!>;D::!~_;) w!~Ww":H2!;? w#BTʐo;THM!w+ ;iIcM:G:O2xc;~: x*!A;>:!>*{;D*!::!>;!!>2*j;г;!~w+ !;~w# D!7wy;B+ 0!~+~=w!;$~w+) 2;9zW~ww;$"!^>2!Z>;D:_:[!a~_;) w!]~Ww"b:ZH2V%;?U!YD: ʀH!]:;UH!a]+ˆ^?D;kH!a]+sD};D:^o:VgG2V| x;!x"*b!$>E;C!!>"*!Y7;!w+»$!W.!V4#>c;Ӵ w!V͵*b!Y :Wͮ;紐E!V>!!>i;*!<RS> D;IVISION BY ZER;#!_.@![~w# 1;9~w+@<zW~*;Nww-;c;~2@#~ -+~=w;~w~w+ $;*6:@+~6# 8;?>w+>K;T~+2~;; #"> +2~#ʀ ʱ;P ʅ EG~+ʀj-;ej+>+2#~ʅ{;z_~_#Ap+6E:+{F;/<2́"x//2!dͻ: +ʿ:; 2 :!( /;Ͷ$<2!">@:= ;ᶒ2*>͹e;C!!>!!>͹O;a*>*ͻA*w;~w2 G!>;-6#=.A*~E#"Y;B.O>25 !;W ~#‰Y!  !;l  I!  ! ; $2!>6+=E;I’! $:@ʪ *;H5:‘*!Eʾ;.4$ü:H! ;ֶH ɯw+ ;0 >77a;0;1;*;>øo;>2/",!!:>!2l;>292AB@!2>;(`!;<$!2!:Q;QB*0|oD:0i!9,;fIo!A$!A9;{ +x*0}};H!9>H20!87w;+ :0G!8~>;&w!2ͻA:328!8V;θ~_w!@~W w:/;W"0!2@:NG ;;xH~<w#^; ~w ~/w+@*;"~w+~w )\;$"!>2!>;D::!~_v;) w!~Ww":H2!;?w#B0Tʐo;TH M! w+ ;iIcM:G:O2xB;~: x*!;>O!>*6;D*!:O!>;!!>2*R;й_;;! ~w+ !o;~w# D! 7w8;$B,+ `!~+~=w!;9 ~w+> .2;NzW~wwɨ;$"!p>2!i>;D:q:j!v~_N;) w!o~Ww"w:iH2b1;?0U!hDF ʀH!oF;UH!vo+ˆ^?D;kH!vo+sDM;D:po:bgG2b| x;!x"*w!0>Q;C!*>"*!h7;!w+»$!c:!b4#>9;Ӻ w!bͻ!bͻA *w ;I!h:cQ!!b>!q;!!#>*! 0O;  DIVISION BY ZER;"!q:;7@!j~w# =~w+;L HzW~ww?;a;v;0~2@#~ -+~=w;~w~w+ ;*6:@+~6# 8;?>w+> JЋ;T~@]}>Ҁb/2@;c#}o|g@"DM:#¨;y*  " |!92͐,;L!,:w>!'`*{;$>> 2> 2!;7'w#L<!`2~;J+Y-†Z>2#~ʏ;_0rʄ#@Z 1;tBB„  !(; w#Z!  ; #~:³: o;~0 B@!';wÞ:!(;~w#D !5:;(!'~w#@ J;:(gH2(!5;&H ; }2f2!6:n;:O>0?;#"/32!0;`:_!6!:/;# O>@*/;#"732!0;`:_!6:Ӏn;;#Ù1!:O>*7;5W;#"Z f0;& !6 :e+@%w#7;&1wA%x;60#<2;;62:ӄnT!:_;N O>@*ZP;""Y!f|>+2e@}/&;o|/g#>-2e[N#F;* |7,+y/Ox/G ;?y0w#R@&V;T@*Y;i; "^>!a2`:f.; >+2g" >-2g!as;*~0@H~01;? #*X":`W /2`;T*^;i.;1:#0*~#0!; 5,ƒ#5" ;' I;33 ;s#r ;*:OG~ "T#; r~"ʂ9# r+;(A~"; # r+~#t;=! F,; yK"y2;R,9# h~HT;{;h FÓF! !;|ِ::í;ɀSTRING INPU??;H!%ERROR IN INPUT,; RE-ENTER PLEAS0:;)c:Oِy!E;;fِ:`??H!N%;NNUMBER TO LARGE/SMALA;c;y!Dx+; )! "[>2Z;+7?{_zW!Z5ʀWyOj;@xG#yO# xG/*[ DM; Uˀ/BK;02 +B->2N;`i"p! 8T])))֛;)0 ?F_:z;=|/g}/o# *pDM! ;RHȷ707 b?_"; g))))P;#"]:ON`*~a; #ʐN~,@h ;(Bh hE~C+h;>-h #"u ~,V ;T# >0u~,N C5;i _~,†u# "0y2S;|);O>O2!;c"2ar;' aʄw ʨq;;d`26:>E6;wx+ ~ x ;+ >>0 p;>Ba>#;f!>@>#1;fd:!;c:O2:TOO ;MANY CHARECTERS. MAX ;IS 252!"2;^#V"> !+P;#F**0*~ @N;6Fi#"a:2Q;HL!>"!\*0*;[0*6!"#";ma:2\>2\@;-ASCII FILL;~#d#~#;y ;B21~!A20#~!;"!05!$ :10; ) y; L!ِ?; f2%"&ɧ;D2n"(&+H2q!q;d!r"o!q0:;'!*o$~#.;<,-$*^+/;Q&!\€_#~`:OE;e0~#À.;y;;r;];H;3;; ;!;6;K;`;N# 6~#@ ;6#;y/Ox/G*  " ~#; x6;* w# x" $!;9z! `! *** OUT;) OF MEMORY **%;^"!#:%0&;f:**&;';C2m~2 #~2# :m!;؂nD`:O>[W`;'>]> d:o=H2oD,;;>2oyz;N_":n/2n;c0€b8;^"$#&!͘:;` WARNING ONL:;)O͒!H͐`:;<!N͐@W ERRO IN ;Q LINE*|0;e|0}o;x0}0!5;>w~!4; !#Ð~;* s#r#" ;* +V+^" ; y2 #;`:Oz;> ;`!Z ~> ; <.; O> >1 2c; >$^#V;>!!7:7`;(a:5 ;&":f:!`:; `:!0:;#f!a:90:; 4!!;&"2"!1O  ;3~2!0!0 ;%f2!dF; {;^#V#"~2#:[; !!; "zz@4OFx@Ky;A#6K#wKK;* #6ÁKO~Q F,;? #6#1y*z"x;Ta|e}eqØ6!};h3y2&*x@KF;z;0FO #6 w;@zʀ! ;;;*;?;T;i;~;m;X;C;.;;;;;*;?;T;i;~;l;W;B;-;; ;; ; $ !Z 4 '=;6'!{ 4 '6y2X;,>F: 2Y;?^#V!P!Y> :XO;T@:Y;i~;~i; m; !A  7N;#~#^#VN#!A ;**7~#7;?;T;i;~};h;S;>;);;;;&;;;P;e;~#^#V#0;"(^#=ʀV#=;&*(*(;^#V#N#F#N#FG;^#V#N#F#N#F#N#F#T;N;^#V#N#F#N#F#N#F;;~#^#V#0;"(__{ s{;+='r+ ='s+=€!b;*;*J>͔ ͔ N$ WRITTEN BY ROBERT SCHRADER !)!#!&"$c*a*$~"$wÓ...............................Ù !Þ"ÿ#$%&'()*+,-./0123456789:;<=>? @ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_ `ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~!s!ͻ*Uͻ!ͻ!ͻ!ͻ!#Z$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$` !e"Æ#$%&'()$+$-$/0123456789$$$$$$ê @ABCDEFGHIJKLMNOPQRSTUVWXYZ$\$^_ `ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~!:!]ͻ*cUͻ!hͻ!ͻ!ͻ!+#lͬ ! #!#!~#!-#͹ & !$!~ͻ!~#!s"q!v"t!y"w!|"z!"}!"`\*^*q~"qwr\*p"w\Ä*}*] "}Ø\Ý **] "ñ**t~"tw*"z!-*͉*q#*&>*}*&>* @!->* &Q >*w!~!*t#!~8>*z! 8i b!! >ak!aq*$*$8*oQ b*$#ÑÙ.AAX*$*͉!ͻ*$#  A5>SBASIC !r *$r  A5>!r *$*$8*Q br *$*$& SBASIC.COM!/*$*$8*-Q bCopyright (C) 1979, By Topaz programming. All rights reserved. From here on protected by End User License.  "Ͷ2!#Ͷ2!#!Q !Q !~#w#x y222!";!6#͞ 2> 2!"R!6#:_!>""!6#:2!Q !""Ͷ2!#!Q !:N ! 2:!!þ"1Ͷ2!#Ͷ2!#!Q !Q 2!"4"6*6~+#"6O! ~*4w#"4!4!"^Ͷ2!#!Q !~#S!‡à:ʜÇ2Ͷ2!#!:O~# µ6x2>2 $$$ SUB!6#*%%"͞ * w#~9=_*6 6*S!l * 6*%{/_z/W"!~_#Vʌ#N#F* r+sq*"b $"Y : 2*% w#z¯**%CHAIN/EXECUTE OPE     ! 7 = @ F J O U t w >!I Q v Q _Q *v {v >!Q w#=. |H Q +|? Q w#I y_ ! ~\Q   PROGRAM CHAIN/EXECUTE ERROR$!F > 6 #=£ !6!E ::> ~##` @~ #.  ~ #. N ~ # !F $ !N $ !E  w# ~*0 > _y{> > >?w#& }o|g}o|g|>" Ͷ2!#:_!6:K ʣ !:O>ͫ * 2 ~ 2 #~ ! 5 ö :  y 2K "  Ͷ2N !N #!O "L !N Q :!*L  ~#.,-$*^+/&!\< #~:O~# N# 6~d #Z 6#d ^"#: ʉ * : ** 2 ~2#~2#: ! :O>[[ >]> : =2 >2 y + : /2 + ^"#* ! ͔ : WARNING ONL:O ͔ !L ͔ :!R ͔ [ ERRO IN LINE*|0|0}0}0!>w~ !4#Ô * s#r#" * +V+^" y2 1:O!4 ~ > < O> > 2^#V#"~2"#:"!!"zWOFxnyA#6n#wnn A#6nO~ti #6#y*"|ˆ}ˆqY!y2*͟nFO #6 wçz  !4 4 6!U 4 6y22>v123^#V!*!3>:2O:3ʔ!A ‚#~#^#VN#!A  ~#­"(^#=V#=*(*("(__{s+='r+='s+=!`4~> G!D !Ml %BAD CHANNEL NUMBEè`````eßNW````````_8|*:727ý!é:78|*7>|)2727*L|! "L__7:‚\!l >2:¡\!l _<2!~ɀ&INPUT FILE REAPPPPPPPtPPP REM USED TO "PLAY" WITH RANDOM DISK FILES var x,y=integer var xdata=integer files r(256) if size("JUNK")=0 then create "JUNK" open #0;"JUNK" 0 input "SEQ ON=0 OFF=1";x if x=0 then record.sequential on if x=1 then record.sequential off input "0=READ 1=WRITE";x input "RECORD #";y if x=1 then begin input "DATA=";xdata write #0,y; xdata end if x=0 then begin read #0,y; xdata print "DATA=";xdata end goto 0  Rem This function finds X! Function fac(i=real)=real If i=0 then i=1 else i=fac(i-1)*i End =i Var x=real 0Loop Input x Print fac(x) Goto 0Loop End XREF COM8IJBASICLIBRELKLMNOPQRBASICLIBRELDSTUCANDR-S COM.VWDPLAY BASXFAC $$$PROCEDURE SET.ON (ATT=CHAR) PRINT CHR(27); 'B'; ATT; END PROCEDURE SET.OFF (ATT=CHAR) PRINT CHR(27); 'C'; ATT; END PROCEDURE POSITION (VERT, HORZ = CHAR) PRINT CHR(27); '=' ; VERT+31; HORZ+31; END PROCEDURE PIXON (VERT1,HORZ1=CHAR) PRINT CHR(27);'*';(VERT1+31);(HORZ1+31); END PROCEDURE PIXOFF (VERT1,HORZ1=CHAR) PRINT CHR(27);' ';(VERT1+31);(HORZ1+31); END PROCEDURE LINEON (VERT1,HORZ1,VERT2,HORZ2=CHAR) PRINT CHR(27);'L';(VERT1+31); (HORZ1+31); (VERT2+31); (HORZ2+31); END PROCEDURE LINEOFF (VERT1,HORZ1,VERT2,HORZ2=CHAR) PRINT CHR(27);'D';(VERT1+31);(HORZ1+31);(VERT2+31);(HORZ2+31); END PROCEDURE CLEAR.SCREEN PRINT CHR(26) END FUNCTION SQRT(N=INTEGER) =INTEGER VAR ROOT1,ROOT2 = INTEGER ROOT1 = N ROOT2 = 1 WHILE (ROOT1 > ROOT2) DO BEGIN ROOT1 = (ROOT1 + ROOT2)/2 ROOT2 = N/ROOT1 END END = ROOT1 PROCEDURE CIRCLE (CENTER.Y, CENTER.X, RADIUS = INTEGER) VAR X, Y, OFFSET = INTEGER OFFSET = (RADIUS * 100) / 141 PIXON CENTER.Y + RADIUS - 1, CENTER.X PIXON CENTER.Y - RADIUS + 1, CENTER.X FOR X = 1 TO OFFSET Y = SQRT(RADIUS^2 - X^2) PIXON CENTER.Y + Y , CENTER.X + X PIXON CENTER.Y + Y , CENTER.X - X PIXON CENTER.Y - Y , CENTER.X + X PIXON CENTER.Y - Y , CENTER.X - X NEXT PIXON CENTER.Y, CENTER.X + RADIUS - 1 PIXON CENTER.Y, CENTER.X - RADIUS + 1 FOR Y = 1 TO OFFSET X = SQRT(RADIUS^2 - Y^2 ) PIXON CENTER.Y + Y , CENTER.X + X PIXON CENTER.Y + Y , CENTER.X - X PIXON CENTER.Y - Y , CENTER.X + X PIXON CENTER.Y - Y , CENTER.X - X NEXT END PROCEDURE RECTANGLE (Y, X, HEIGHT, WIDTH = INTEGER) LINEON Y, X, Y + HEIGHT, X LINEON Y, X + WIDTH, Y + HEIGHT, X + WIDTH LINEON Y, X, Y, X + WIDTH LINEON Y + HEIGHT, X, Y + HEIGHT, X + WIDTH END PROCEDURE SQUARE (Y, X, SIDE = INTEGER) RECTANGLE Y, X, SIDE, SIDE END PROCEDURE BAR(REF.Y,REF.X,HEIGHT,WIDTH,DEPTH,INSIDE,VERT.P,HORZ.P=INTEGER) VAR I, TEMP, EMPTY, FULL, X, Y = INTEGER DIM INTEGER REF(2) CENTER(2) REAR(2) X = 1 Y = 2 FULL = 1 EMPTY = 0 REF(X) = REF.X REF(Y) = REF.Y CENTER(X) = REF.X + (WIDTH * HORZ.P) CENTER(Y) = REF.Y + (HEIGHT * VERT.P) REAR(X) = CENTER(X) + (DEPTH * HORZ.P) REAR(Y) = CENTER(Y) + (DEPTH * VERT.P) IF (INSIDE = EMPTY) THEN BEGIN FOR I = REF(X) TO CENTER(X) STEP HORZ.P LINEOFF REF(Y), I, CENTER(Y), I NEXT I FOR I = 0 TO (WIDTH*HORZ.P) STEP HORZ.P LINEOFF CENTER(Y), CENTER(X)-I, REAR(Y), (REAR(X)-I) NEXT I FOR I = 0 TO (HEIGHT*VERT.P) STEP VERT.P LINEOFF CENTER(Y)-I, CENTER(X), (REAR(Y)-I), REAR(X) NEXT I LINEON REF(Y),REF(X),CENTER(Y),REF(X) LINEON REF(Y),REF(X),REF(Y),CENTER(X) LINEON CENTER(Y),CENTER(X),CENTER(Y),REF(X) LINEON CENTER(Y),CENTER(X),REF(Y),CENTER(X) LINEON CENTER(Y),CENTER(X),REAR(Y),REAR(X) LINEON REF(Y),CENTER(X),(REAR(Y)-HEIGHT*VERT.P),REAR(X) LINEON CENTER(Y),REF(X),REAR(Y),(REAR(X)-WIDTH*HORZ.P) LINEON REAR(Y),REAR(X),(REAR(Y)-HEIGHT*VERT.P),REAR(X) LINEON REAR(Y),REAR(X),REAR(Y),(REAR(X)-WIDTH*HORZ.P) END IF (INSIDE = FULL) THEN BEGIN FOR I = REF(X) TO CENTER(X) STEP HORZ.P LINEON REF(Y), I, CENTER(Y), I NEXT I FOR I = 0 TO (WIDTH*HORZ.P) STEP HORZ.P LINEON CENTER(Y), CENTER(X)-I, REAR(Y),(REAR(X)-I) NEXT I FOR I = 0 TO (HEIGHT*VERT.P) STEP VERT.P LINEON CENTER(Y)-I, CENTER(X), (REAR(Y)-I),REAR(X) NEXT I LINEOFF CENTER(Y),CENTER(X),CENTER(Y),REF(X) LINEOFF CENTER(Y),CENTER(X),REF(Y),CENTER(X) LINEOFF CENTER(Y),CENTER(X),REAR(Y),REAR(X) END END Y)-I, CENTER(X), (REAR(Y)-I), REAR(X) NEXT I LINEON REF(Y),REF(X),CENTER(Y),REF(X) LINEON REF(Y),REER(Y), I NEXT I FOR I = 0 TO (WIDTH*HORZ.P) STEP HORZ.P LINEON CENTER(Y), CENTER(X)-I, REAR(Y),(REAR(X)-I) NEXT I FOR I = 0 TO (HEIGHT*VERT.P) STEP VERT.P LINEON CENTER(Y)-I, CENTER(X), (REAR(Y)-I),REAR(X) NEXT I LINEOFF CENTER(Y),CENTER(X),CENTER(Y),REF(X) LINEOFF CENTER(Y),CENTER(X),REF(Y),CENTER(X) LINEOFF CENTER(Y),CENTER(X),REAR(Y),REAR( G R A P H I C S D O C U M E N T A T I O N =============== ========================= In the S-Basic graphics package (graphics.bas), there are several procedures that allow the user to draw complicated figures with just one command. These are: - a circle drawing routine; it requires three parameters: the vertical coordinate of the center of the circle, the horizontal coordinate of the center, and the radius of the circle. - a rectangle drawing routine: it has four parameters: the vertical coordinate of the upper left corner, the horizontal coordinate of that corner, the height, and the width. - a square drawing routine: it needs three parameters: the vertical coordinate of the upper left corner, the horizontal coordinate of the upper left corner, and the length of a side. - a bar drawing routine; it requires eight parameters: the vertical coordinate of the base of the bar, the horizontal coordinate of the base, the height, the width, the depth, the interior of the bar filled or empty, vertical illusion of depth up or down, and horizontal illusion of depth up or down. The fifth parameter should be 0 for an empty bar, or 1 for a full one. The seventh parameter should be 1 for down, -1 for up. the eighth should be 1 for right, -1 for left. It is reccommended that the user run the following program to observe the use of these procedures: $INCLUDE GRAPHICS.BAS VAR V1, H1, RADIUS = INTEGER VAR V2, H2, HEIGHT, WIDTH = INTEGER VAR V3, H3, LENGTH = INTEGER VAR V4, H4, H, W, V.PERSPECTIVE, H.PERSPECTIVE, INTERIOR, DEPTH = INTEGER V1 = 15 H1 = 15 RADIUS = 10 CIRCLE V1, H1, RADIUS V2 = 30 H2 = 10 HEIGHT = 20 WIDTH = 40 RECTANGLE V2, H2, HEIGHT, WIDTH V3 = 60 H3 = 20 LENGTH = 30 SQUARE V3, H3, LENGTH V4 = 80 H4 = 80 H = 50 W = 15 DEPTH = 8 V.PERSPECTIVE = -1 H.PERSPECTIVE = 1 INTERIOR = 0 BAR V4, H4, H, W, DEPTH, INTERIOR, V.PERSPECTIVE, H.PERSPECTIVE V4 = 20 H4 = 130 H = 50 W = 10 DEPTH = 15 V.PERSPECTIVE = 1 H.PERSPECTIVE = 1 INTERIOR = 1 BAR V4, H4, H, W, DEPTH, INTERIOR, V.PERSPECTIVE, H.PERSPECTIVE VIDEO GRAPHICS AND ATTRIBUTES COMMAND SET FOR THE KAYPRO 10 =========================================================== INTRODUCTION The KAYPRO 10 has a graphics and attributes set that currently includes drawing and erasing lines, drawing and erasing pixels, inverse video, reduced intensity, blinking fields, graphics char- acters, cursor positioning, and cursor on/off. GRAPHICS To draw graphics on the KAYPRO 10, the screen is treated as an array 100 pixels high, and 160 pixels wide. Any spot on the screen can be addressed by a vertical coordinate (ranging from 32 to 131) and a horizontal coordinate (ranging from 32 to 191). The pixel in the upper left corner of the screen has coordinates of 32,32. Line and pixel graphics are drawn on the screen by writing an escape sequence to the console output. For the purpose of drawing lines and pixels, an escape sequence is a 4 or 6 byte sequence defined as follows: Escape sequence = ESC

[

] where: 1) ESC is an ascii 27 (1B hex). 2) is a character of the set { *, (space), L, D }. 3) V1, H1, V2, H2 are 1-byte values indicating locations on the screen. To write a pixel, the sequence-type must be a "*". H2 and V2 are not used. V1 is the vertical coordinate of the pixel. H1 is the horizontal coordinate. To erase a pixel, the sequence-type must be a space. H1, V1, H2, and V2 are the same as above. To draw a line, the sequence-type must be a "L". H1 is the horizontal coordinate of the first point of the line. V1 is the vertical coordinate of the first point. H2 is the horizontal coordinate of the last point. V2 is the vertical coordinate of the last point. To delete a line, the sequence-type must be a "D". H1, V1, H2, and V2 are the same as above. CURSOR POSITIONING When positioning the cursor on the KAYPRO 10, the screen is treated as an array 25 characters high, and 80 characters wide. Any spot on the screen can be addressed by a vertical coordinate (ranging from 32 to 66) and a horizontal coordinate (ranging from 32 to 111). The character in the upper left corner of the screen has coordinates of 32,32. The cursor can be moved to a desired position on the screen by writing an escape sequence to the console output. For the purpose of cursor positioning, an escape sequence is a 4 byte sequence defined as follows: Escape sequence = ESC EQUALSIGN

where: 1) ESC is an ascii 27 (1B hex). 2) EQUALSIGN is the character '=' (3D hex). 3) V1, H1 are 1-byte values indicating the location on the screen. GRAPHICS CHARACTERS Each of the character positions on the screen occupies the same area as eight pixels (4 high, 2 wide). Thus, pixels can be addressed in groups of eight at a time. To set pixels in a character position, the cursor is moved to that position, and then a byte is sent to the console output. This byte must have the high order bit set to 1 to distinguish it from normal characters. The remaining seven bits are use to set 7 of the 8 pixels. I.E: to write these pixels.... ------- Pixel # 1 ------> | | | <------ Pixel # 0 |---+---| Pixel # 3 ------> | | | <------ Pixel # 2 |---+---| Pixel # 5 ------> | | | <------ Pixel # 4 |---+---| Pixel # 7 (off)------> | | | <------ Pixel # 6 ------- output this byte: ------------------------------- must be '1' --> | | | | | | | | | <-- bit for # 0 ------------------------------- ^ ^ ^ ^ ^ ^ | | | | | | bit for # 6 | | | | bit for # 1 | | | | bit for # 5 | | bit for # 2 | | bit for # 4 bit for # 3 As shown above, pixel # 7 is off. To write a pixel with it on, send the inverse video command (ESC,B,0), then output the inverse for bits 0 through 6. I.e: 10000000b would print a blank graphics character; (ESC,B,0),10000000b would print a solid character. ATTRIBUTE COMMANDS A character can be set to inverse video, blinking, reduced intensity, or underlined. Also, the cursor can be turned off. These attributes are activated by sending a 3 byte escape sequence to the console output: Escape sequence = ESC where: 1) ESC is an ascii 27 (1B hex) 2) is a 'B' to set an attribute on, or a 'C' to set it off. 3) has a value of 0 through 4, as follows: 0 = inverse video, 1 = reduced intensity, 2 = blinking, 3 = underline, 4 = cursor. Default for these attributes is: 0 = off, 1 = off, 2 = off, 3 = off, 4 = on. COMMENTS 1) Examples of line and pixel drawing can be found in GRAPHICS.BAS. 2) All of the coordinates used are 32 or greater. At first glance, it would seem natural to start them at 1 or 0. However BDOS interprets some byte values of 32 or less as control keys. For example, an attempt to use a coordinate of 9 will result in eight spaces being printed on the screen (BDOS thinks that the 9 is a tab). 3) A line drawn from point a to point b will not always look the same as a line from b to a; it will be a mirror image. 4) Graphics characters, pixels, and lines cannot write over normal characters. SUMMARY Graphics commands: Set Pixel ESC, * , V1, H1 Clear Pixel ESC, , V1, H1 Set line ESC, L , V1, H1, V2, H2 Delete line ESC, D , V1, H1, V2, H2 Attribute commands: Inverse video on ESC, B, 0 Reduced intensity on ESC, B, 1 Blinking on ESC, B, 2 Underlining on ESC, B, 3 Cursor on ESC, B, 4 Inverse video off ESC, C, 0 Reduced intensity off ESC, C, 1 Blinking off ESC, C, 2 Underlining off ESC, C, 3 Cursor off ESC, C, 4 he coordinates used are 32 or greater. At first glance, it would seeC, * , V1, H1 Clear Pixel ESC, , V1, H1 Set line ESC, L , V1, H1, V2, H2 Delete line ESC, D , V1, H1, V2, H2 AtCopyright (C) 1979, By Topaz programming. All rights reserved. From here on protected by End User License.  ;<~#ʑÃ> > > > !ʻҵ)ì*>#">*<#"<*@#"@:x=##^#Vɯ2::y2y:w< 2wɯ2w1@2~2}2\!e>$w#w#w:e22!]~#I4̓͆I>2w*a"B!;"6!wڐڥں&1HOSZ^djpsz~  ()1>E^ery ; HHOOSSd  *w#*>s#r#"6#"6_W*@"@og|+ _W*<"<;; !zw#+ͬڌڞ:k>2̓UN-DEFINED LINE NUMBER(S)!z~#|n> > ^#V*D} | ^#V{ z :!y#òï#7!z"~#B#6 *"#># 7ɯ###);;_W*F} | ;;_W*B} | *>p">*]* |z*_*r |zj &:o:_" *<*B*>*~ >#=#F#Nx> r+s##  > #= * +" |">*<*B"D*>"F> *Dt !t *]t *_t *F*@t t !t !t !t !x4>2w:2 *~ > #=• ! 5 :2 ~ > #=± ! 5© !#~##š * := : Ú #~##¶ *: ö 2q "o *o #:q 6 =2q e #$ ~#~̓XREFF LIB TO LIB ERROR*o ~#U #e ## u} | !x4>2w!p~ #‘ !x4>2w#rͪ\° ; \ ̓I'M LOST.. . .ͪ! ͦͪ+| ͪͪø ͪ ͪͪͪ=! ͦ*~* Gͪ ͪͪø ^#V2 ͖ I y 8 A͖ c yHG } | 8 x=! ͦ*^#VA͖ syHG } | 8 : g{® ͪW%s| ͪOzW|=2 ͪͪø \ ; \ ̓I'M LOST.. . .! ͦ+|  =! ͦ*~G G7  ^#V2 ͳ f y U Aͳ ڀ yHG } | U x=! ͦ*^#VAͳ syHG } | U : g{ W%s| OzW|=2  *]|/ }/ *_|/ }/ *w}  )|% Ox͘:M ̓Compilation complete͆̓Compilation aborted*"lͪ\p ͪ2nͰ:n={ ͪͪ\x :o2\™ 2n:n=¤ \ʡ :o2  6##: 6 ̓UN-DEFINED LIB-REF.!c~# ͪWͪͪͪ2q=! ͦ*~Bͪ2ͪͪ ͪGTI:p_TITs:qҕ{=! ͦ*6I̓UN-RECOVERABLE ERROR¬̓GEN LIB ERROR̓REV-DEF LIB ERROR:q=! ͦ*#~#SW2q=! ͦ*~ G͂":p_͂"͂s:qҕ{=! ͦ*6"ygxͪGszxͪ2pxG ͪͪ y•ʦGszʦ2pxG *l6#ͪw#¸ͪ2oͪw#ͪw#"l"6#6*l6#w#2ow#w#"l6#6!c6 #!c4w#&w*c#>UX#G7#X##: COMBASICLIBRELUSERLIB REL:_22!"y̓CANNOT OPEN BASICLIB:2!"y:_22!"{̓CANNOT OPEN USERLIB:42!"{:~_2h\ʨ!"u2|̓CANNOT OPEN TEMP FILE:hƒ2|!"u:}_2!"w̓CANNOT OPEN-CREAT OBJ FILE:}_̓ERROR IN CLOSSING OBJ FILE:}_j2!"w̓CANNOT CREAT OBJ FILE:}_:~_\*y|¼͝!!y"y*u|0!!u"u*{| !!}"{*w| v!!w"wuK! 5:~_\~ym̓READ PAST EOF̓DISK READ ERROR TMP FILEy͸! ¢:_y̓READ PAST EOF̓DISK READ ERROR BASICLIB}%! :_XyG̓READ PAST EOF̓DISK READ ERROR USERLIBw͑! {:}_̓ERROR IN EXTENDING OBJ FILE̓END OF DISK DATA FOR OBJ FILE̓NO DIR SPACE FOR OBJ FILE___ :\=:=SICLIB}%! :_XyG̓READ PAST EOF̓DISK READ ERROR USERLIBw͑! {:}_̓ERROR IN EXTENDING OBJ FILE̓END OF DISK DATA FOR OBJ FILE̓NO DIR SPÙCopyright (c) 1980 By G.Ohnysty Structured BASIC (S-BASIC) Compiler All rights reservede1:e_12!"*"LʊOVERLAYBCOM~#"_  CANNOT OPEN OVERLAYBcREAD ERROR OVERLAYBi:|=_} $$$$$$FfGfHfIffff,*G' tm S-BASIC Compiler Version 5.4b Y'r&>22!9"\:j'&:w":8MY>XXYͯ4p=X:tXYX:uXY>2:Y2͇:Y:v;[Z:~ [:z[f:xb,$END.MODULExr&LXtYHҚ=o&)^#VʠHSc K d HS w HSHSk!!!!)}$$HSHS$HSVHSHSHSR HSc,Aid5JXq w  20 F 9~Nc7:8/28*&ͬ)MY!)MY&*&b,=S*&ͬ)!,R*L>2PS&ʓh,ON>ڗ/×:X/2Xr&>2&*&ͬ)"a*&:::=2?a!w#x6 #&L*r&!\>!͉K!\>͉K:!]~# a:, ʍ*t:X>2X&:OG'MODULE NOT FOUND2XØb,$MODULE|&:4!,|ʂ#nr&)r&2X"tͯ&>22ì\!\>ͫK!\>!ͫK͹&&h,ON>/:w/2wͯ4p=X>XYX>XYr&>2&> ͽX>2e> ͽX>2l 5 5MYMYMYyMY2/)MY}MYH)͈)MY>2l 5 5MYMYMY"/)MY{MY2H)͈)MYMY[&b,ERROR *&*&:Y» MY!*&LR%YtY>MY>XXYͯ4s=b,OFFHS>é >2l 5MYMY}2I :Y2J   NS*&:J  MYMYX:I <2I XY:J  MY$ MYLR%YtY:J < MY&* `SX>XY*&LR%YtY*&:YK w RX>P X>XY>2MY/)**͈)>$2[*x2M L"P "N QS=%*P *:*N ">2:::M r&&b,=SMYͯ4=?2M 2l 5TSͯ4C?MY222"b%"K "I X!I N):H *#">2MY/)**͈)>#2[*ͬM" " QS=%* *:* ">2::r&MY222"b%" " X! N): *#"!,QS>2 *| }~ " 3 >23 G2lx= 5-S * ~#9 MY%YtY: * |MYX* {XYzXY*MY!)ͯ4=>2 *}/_|/W*o" z MYX{XYzXY*MY!)ͯ4= :a ʊS/2a MY/)XtY& b," X>"XY͊(!_6"#6!~ XXY# r&j'[&L6 XtY&[&b,DATAP ,>,22 XXYH)͈)&L*&ʃ (*҃ ͨ(&ä !,ͺRESy MY*)ä MY!)x³ ͯ4x?  ͯ4|?  ͯ4?  ͯ4?  ͯ4? Sͯ4?:y *`Sb &!-w# LRMY!%YtYͯ4s?DATA[&R>2l(*d 5MYMY"/)MYH)͈)MYMY*& 5>*&!ͺRESxSMY*)MY*&=l:*6SMYMYMYMYMYMY"/)MYMYH)͈)MYMYMYMYMYMY")MYMYMY")MYMY")MYMY")>2l 5*,MYMY; 5MY>MYMYͯ4?:WS>22&:RmSmDZS&Á:22:2b,R>2l 5:RʬMY!MYMYMYͯ4o?MY*oYڿ.1*o"o{XYzXYMY>MYMY!!5):MYXXYͯ4i?:< ]S!*e+r+s+:wMYͯ4=X:XYX:XYX:A>A>XY/Y{XYzXY:Ro!=6#4!=6#4Á!=6#4!=6#4:<2:y *Q"*`Sr&j'Q*&b,#`S>2l 5R"**`SMYͯ4=?>2l 5R*>2l 5ͯ4C?ͯ4=?MY]MY>MYMY!!5)ͯ4i?ͯ4C?ͯ4=*&b,#`S>2l 5Rͯ4=*&b,ONPb,OFFHS>!>MY>XXYͯ4=>v[&b,#b >24*&b,#`S5$21Sʕ:y "*`S&;&"*ҵr&j'Û*`SÛL*[&(*,ͨ(!,ͺRSyMY*MY!)xMY>XXY:1R:4 ͯ4=ͯ4=+ͯ4=ͯ4=MYMY MYMYMY>2l 5ͯ4=>2l 5:YfS 5ͯ4=>2l 5ͯ4=>2l 5ͯ4=ɯ2l 5HS:Y$iS**͈)r&j'[&ʪ:Y ""X!N):lMY>XXYͯ4>:lMY>XXYͯ4> 5b,:lS:lͯ4>Q ͯ4>Q-ͯ4>Q:ͯ4>QGͯ4>QHSͯ4>MY/)**͈):l2l""""MY%Y!N)**X!N)ê*&>2ͯ4C?MY:YfS 5:Y  5mMY/)**͈)H):l!>*!>*!>* !>*HS!>GX~#XY,""X!N)MY!/)͈)MY>XXYͯ4=:l:>2H)**͈)ͯ&r&MY!%Y""!N)2¶ͯ4y=ͯ4=ͯ4=ͯ4=HSͯ4=:oS͹&H)**͈)&:Y2&&:YrS2l 5&MY"T"R%Y!RN)2lH)*͈)* 5>2:YuS&MY/)**͈)[&œ,r&j'""""MY%Y!N)X!N)2l 5>2:YxS:lͯ4>0ͯ4>0 ͯ4>0ͯ4>0&ͯ4>0HSͯ4>MY/)**͈)&͢:Yʃ:y c[&:Yʀr&j'[&:Yʀ>2&2',MY/)**͈)&͢[&LҽX>XY%YtY&""X!N):KS>2>2*&:Y>2*&%>2*&%Rx2`{2a&R:`x:Rh,:x*&ͬ)|3S}2a&Rxh,:h>2l 5&xMY!MYPMYMY:YS&R(*S>:>2l>2Q8!, ~#¨:`MYMYMY5HS!<:*!, w #HS&Rͬ)<&R*:*6S2bO:`G:aRN_:I{MYXXYMY!!5)MY>MYͯ4i?&x:`:MY*&!ͺRESy{Sx*&b,AT~S>2l 5´MY*)MY~MYMY")MYwMYMY")*&!]RESy{Sx*&b,AT~S>2l 5MYMY")MY!)ͯ4+?&*&!ͺRES>āS*&b,=S*&h,VAR҆!ͺRES>ʛMY!)ygMY")MYMY>MYMY*)ͯ4=h,ARRAYҥ!]RESMY*)Vh,SPECҼ!]RESOh,FILEb,#`S*&ͬ)}!*e~cS#^#V!#S!&Ûh,FCBԄSb,#`S*&ͬ)}!*e~cS#^#VO:KS>2!,"m2w# E!,*&:YSb,,Nb,=}"*tNr&j'N*&%*oR,ʻ7&ڌb,:*&ͬ)"|'S:_!,"mSRxPSMY!*o###"o+)MY")XXYXXYX{=XYS:KS>2!,"m2w# B!,*&:YSb,,Kb,=z"*qKr&j'K*&%*qR,ʸ7&ډb,:Ҿ*&ͬ)"|'S:_þ!,"mSRxPS*q"qxX{>XYXXYS>2!,"m22w# -!,*&:YSb,,6b,=e"*\6r&j'6*&%Rxux2l&b,:Ң*&ͬ)"|'S:_&:2!,"mSRx¾PS*o"oxX{>XYXXYSҾ!4ڇS*mw#"mH|HS*d9I#+#:##~7(#F#^*o*m~7#~^#"m:y͹&:s:sX>XYXXYXXY&(*S&!ͺRڿMY!)L*&(*ESͨ(MY&*`S>2l 5>2Q85&b,=S>2l 5ͯ4P>*&L*& (*v>2ͨ(x2l͝R*&b,=S:leͯ4C?yMY>XXYͯ4=ͯ4C?ͯ4>b,= !,ͺR ySx2l͝R:lyMY>XXYyMY*)MY!)ͯ4=:Yr&yMY*)MY!)ͯ4>:/2ͯ4=?:l2b 5::b2l5ͯ4>@ͯ4>Kͯ4$>Vͯ4->aͯ41>*&MY>Xb,ON>z>XYMY2!>4*&MY>Xb,ON>ڟ>XYMY2!>4!!&ͬ)}~>24:!>MY>XXYͯ4>>2![&>2!b,USING2 ,>2l 5>2!MY>XXYͯ4>/!2l[&:YN N ,&! 5!:ld ͯ4i> q ͯ4m> ~ ͯ4q> ‹ ͯ4u> ˜ ͯ4x>ò S:ʭ ͯ4> ͯ4}>:! ͯ4> :! ͯ4>* >2!:!5 ͯ4>5 "* >2!5 : !:Y!:y 9S>2!&!: :Y :!̀![&@!b!̀!,b,#b!,5$SY!"*`S:y {!:MYXXYMYͯ41?̀!:!ʞ!>2!MY>XXYͯ4>ͯ47?ͯ4?!!!>2.$24x2/$y20$:MYXXYMYͯ41?21$22$23$:.$]#&]#b,#^"b,"j"͊(23$L*#ͯ47?ͯ4\>:3$G!,xD"~XXY#-"XXYX:1$XY:2$!!5$"*`ST">24$L*[&(*ҍ"*&>24$2ͨ(Ù"!,ͺRS#:2$"/22$:/$ʹ"ͯ47?ͯ4c>:1$"xq#ʯ#ͯ47?MYyͯ4>:4$"ͯ4C? #y#MY*) #MY!)x#ͯ4?!)#ͯ4 ?!6#ͯ4 ?!C#ͯ4?!P#ͯ4?!Sͯ4?!:0$ͯ47?MYyͯ4?ͯ47?ͯ4 ?:4$ʑ#ͯ4C?MYw!y¥#MY*)MYw!MY2)!ͯ47?MYyͯ4>:4$#ͯ4C?ͯ4I?!y#MY*)ͯ4I?!MY!)ͯ4I?!&#$b,;>21$b,,$>21$:Y2.$>21$>2l 5ͯ41?:y >S*>S 5:yMY>XXYMY:4MY>XXYͯ4=>R>2r&ͯ&**o=%:>22b%"ͯ&r&j',ʯ$7&ڸ$:Y ²$͹&*&ͬ)}MYXXY*&*`S (2<%ͯ&ͯ4\> (G:<%%xXXY$͹&XXY&>3%"*>3%*>`SXXY*j+*h+*f+*d+*b+*`+*j"%"%*j*`+%!`>%*j*b+%!b>%*j*d+%!d>%*j*f+%!f>%*j*h+%!h>%#6*%"j6*%^#V r+s##=%}/o|/g# |&~z &{&#&,7&&,I&&,R7&*&b, b, b, h, h, h, ,g&7&[&>2: :&&/2&:,:y ʕ&,&,*t2x2y}<'o|'g"t:v<'2v:v='2v:y &[&,r&j':l&ͯ4>&ͯ4>&ͯ4> 'ͯ4>'ͯ4>Sͯ4>:|!}0'> ͽX!x~> ͽX4<6'~#U'dG'> d> d> d> d:'w'/2'*t|0ͽX|0ͽX}0ͽX}0ͽX:>:´'>*ͽX:v0ͽX:v0ͽX> ͽXMY*MYMYMYMY!5)!"XXY>2N?2S?2X?2^?:W(/2W:X ( c +( '> RͽX!x4 B(2X(:X( Q(͘&j'> 2X(XXY*o#ʅ(=XXY#l("o! ("wy #y SÑ(")!,]RS>2l( 5=ù(>2Q8>2l5MY!)ͯ4%?:(ͯ4=?*)y9Y/Y/Y*){XYzXY5)%YK)%YXY|}XYu)X!XY~XY# V)~u)XXY:XY:ʀ)XYXY>|)!~W+MY>XXYͯ4=:+=2+)+ͯ4C?MY:ʕ+:*{+&b,=S&%ES!+^#p*+*+!k,!,,~|,#m,/7#~#,/!,ʢ,#~ʞ,Ï,7;:[]<>{},()"=#-+/*%~^ '\  ,,,k,\,r&j',:,/2: bk2Y:W-/2W:X- c S͋,%--0-:-2X>2W/~Q-̀-2Y~ 2y z-e-ͽX!x4~`u- [u- w#;- 'e-~A-[-Ao&)-^#VM...v// 0000I1K1M1112L222L3364F4q4444k,$LINES>1k,$PAGE>2k,$TRACE>?k,$LOADPT>@k,$INCLUDE>Ak,$LIST>Bk,$CONSTANT>Ck,ABS>k,ATN>k,ASC>k,ASCII>k,AND>دk,BEGIN>k,BASE>%k,BASED>'دk,COM>k,COMMON>k,COMMENT>k,CASE>#k,CLOSE>*k,CREATE>0k,CHAIN>5k,CALL>:k,COS>k,CHR$>k,CHR>k,CONSOLE>Dk,CONTROL.C.TRAP>Fدk,DIM>k,DIMENSION>k,DO>k,DELETE>.k,DATA>8دk,END> k,ELSE>k,EXECUTE>;k,ECHO>Ek,EXP>k,EQV>دk,FOR>k,FUNCTION>"k,FILES>(k,FIX>k,FFIX>k,FINT>k,FCB>k,FCB$>k,FRE>دk,GOTO>k,GOSUB>k,GO>دk,HEX$>دk,INPUT> k,INPUT1> k,INPUT2> k,INPUT3>k,IF>k,INITIALIZE>-k,INT>k,INSTR>k,INP>k,IMP>دɯɯk,LOCATE>&k,LOCATION>4k,LET>6k,LPRINTER>7k,LOG>k,LOG10>k,LEFT$>k,LEFT>k,LEN>دk,MID$>k,MID>دk,NEXT>k,NUM$>k,NOT>دk,OF>$k,OPEN>)k,ON>3k,OUT>=k,OR>دk,PRINT>k,PROCEDURE>!k,POKE>>k,POS>k,PEEK>دɯk,REM>k,REMARK>k,RETURN>k,RET>k,REPEAT>k,READ>+k,RENAME>/k,RESTORE>9k,RECORD.SEQUENTIAL>Gk,RND>k,RIGHT>k,RIGHT$>دk,SUB>k,STOP>k,STEP> k,SGN>k,SIN>k,SQR>k,STRING$>k,STRING>k,SPC>k,SPACE$>k,STR$>k,SIZE>دk,TO>k,THEN>k,TEXT>k,TO>k,TAN>k,TAB>دk,UNTIL>دk,VAR>k,VARIABLE>k,VAL>دk,WHILE>k,WRITE>,دk,XLATE>k,XOR>دɯɯ"4"4^#V#6#4*4*44X>XY%Y~#4XY4XY6#%Y~#5XY4XY>2Q82>2 @!~7:7"525*5~a5|756y6 76 57S#~#"5Ҝ55!:l=*! *!R8~ʐS6#4ù5! *;ʱ5$Œ5>2Ì5:5BS<25#~ 725! ==*|;Ì5#~#"52l25#"5:5BS:l6ͯ45>6ͯ4:>6ͯ4?>$6ͯ4H>/6ͯ4L>>2l25#~#S6K6ͯ4=25ͯ4=25MYX~#XY~#"5XY*MY!)#^#V#!,w#‚6MY%YzY:5BS<25#~#"5 7*5~ 25#~25:l25ͯ4>25#^#V#~27#F#N###"5y6MY!)ͯ4e?:7G:5BS25!8:5BSG:l%7x<7ͯ4>x<7:l<7ͯ4>O7:lO7ͯ4 >x!=e7=*=6#4:l==!*E=6#4#~#F#N#^#V#"5x-8y8x77x´7ͯ4=77ͯ4=7Sͯ4=)!8MY*)x7y7MY&MYMY!8MY>XXYMY*)ͯ4=x 7!5425yC8MY!)MY!8MY*)MY!8DGTDLTDLDGDEQDNEQDSUDADDDIDMUDTDDPCDABDNEDEPRGTRLTRLRGREQRNEQRSURADRDIRMURTDRPCRABRNEREPBGTBLTBLBGBEQBNEQBSUBADBDIBMUBTDBPCBABBNEBEXIGTILTILIGIEQINEQISUIADIDIIMUITDIPCIABINEIEXWGTWLTWLWGWEQWNEQISUIADIDIIMUWTDWPCWABWNEIEXSGTSLTSLSGSEQSNEQSSUSADSDISMUSTDSPCSABSNESEXIIMIEQIXOIOIANINOABATCOEXFIINLOLOG1PRNSGSISQTAFFIFINASCICHRFRCVTFSIZCVT$CVT$STRINLEFRIGHMILEINSTSPACENUMVAXLATHEXIMPOTABPEERGHTFCBRSRBNRCIRCIRSRURRDRRDBRDRDRDRDLONERFORRFORRFORBFORFORCHAIFOPFCLOSREASWRITRREARWRITRSEASCIFDERENAFCREAMPUSMPOXPOXZPHRPHRPHBSPOSPUSCBNCWCSCLRCLRCLBCLCLCLCRDCRSCBNCICWCSSETMIPSTSTRPMPRMPPRPRPBPPCHPSAPSFMPNUPTATABSCLEADUBSTRPUCMPRCMPRCMPBCMPCMPSTTSTRTSTRTSTBTSTTSTTSTSTECHFCNTLIBURETIRIRIBIIICHIIIWRARRABASESAVIGETISAVHGETHSMOERRERRSYSISYSOUMAREDIMPDSEDRDRDBDINDCHADSEXCYͫ???XCY!R8 ~?#X~XY#? ñ?!=ñ?!p=~@X#~XY?#?#@#?*j#6"B!6#:lw#6"B2B2B26B>2C7B@:YG@@à@*@"*@b,:@:'/F͋,ڌ@:͏E/FB҄@!,[QCS>2B2@(*A:*Ab,"ڭE*B~@DA>AYBҼ@ͷB2@BBà@@>2x@2l*B6 #6"BDA>AͷB2@*B~SBB@>ͷB2@*B~1AB2@BA:C:Q8SD2@:B:YdA_A֖SÿAֿÿA:B˜Ab,NOT>ڿAb,%>ڿAb,+>ڿAb,->ڿA$SB!SʿAʿAʿAʿA ʿAʿAA2B2BG26BxG'BBA"A>A> A> A>7x!B :x<BG#B7<>=#-+/*~%+-^,7&'B>26B:6BKB26B2B: 2B,7&NB7777G*B~ҔBҙBҞBңBҨBҭBҲBx7x?x?x?x?x?x?x?*B#w"B@*B~+"B@*B6#w#6"BL*'B(*ҎC7B!,]R_:l:Q8>2Q8*B6#>w2l#6"BͷB{2@=@C*(C:*-SRBS:*0S*B6#2Q8kC"Cx*C2lw#6"B*B6#s#r#w#p#q#C!,ͺRyFx͝R*B:l¸C6#|2lw#6#q#p#q#s#r#"B6"DW2BzC(*S:lW:CGO2DͷB>2D*D*|AD}AD>2D*}/_|/W*o"D|AD*B6 #6#s#r#6"ByʐD*B6#w#6"B2l>2C*D:D:D2@2D2D"D:* ʍDID-S0S2D*BOzŸDy6#wO#6#s#r#:Dw#6#6"Bx2C>2BBSy2l:D2@*D|2@*B6 #:Dw#s#r#6"B2@2B7B(*S!*K_:lW:CGN#ͷBy_E~#*B6#w#6"B2l>2C2@:* \E/E-S0S~*BOzjEy6#wW#6#s#6"Bx2C>2BBSz2l!E#O~y’E/0123456789.,'MY/):¿E͛)e)!w ("Ew#6E S!@! ~#EXyXY*͛)e)G !áCMY/)e)!@ëFMY/)e)!@:'hF:lFFFʨFhF*SF:'†F (o*&:'HS&ÎFͬ)|3S" H* HG!áCͬ)" H* HG!áC=G*HG!áC H*"HG!áC!"H)H*"HG!áCy-GXXY GH)͈)͛)> 2H>2H!Hw#MG!~ʈG0sGʌG*S*&!VG *SͼG!Hw#VGͼGͼG#~ʰG0*S *SG!HwÑG:HGðG!H~w#G ¾G!H53S:H!H~w#G G:Hg2H!H53S!"H)H:(HW:%H2%H" J3H*S!~+DH-DH+>+2J#"J>+2J~#ʓHESH&:,+pH-pH>+2JyH&!,~ʖH{_~I_#~H+6E:J+{ʡH/<2'J0Ix//2J!J9K:J+H:J2J:'JI!8JH/<2'J!*J"(J>͉K:'J= I2'J*(J>͉K?JH!1J>͉K!J>͉K?J* J>ͫK* J^K* J~w2JG!J>6#=2JCI!JJ~#gI!JJI!JJI!JJI!JJII2J!J>6+= I!JJI:JʸI CI:JI*J!'JEI.I4I:JJ!JJIɯw+I0J >7ѯ7"J!J>ͫK!J>ͫK!J~_w!J~Ww"J:J2J!Jw#sJ0ÅJʠJJJ~J!JJ w+ ”J~J:JG:J2J K!J^K*J!J.K!J>͉K!!J ~w+ J!J~w# K`!J~+~=w!J ~w+K K2JzW~w0#~+~=w~w~w+QK ;K>w+>gK~O:P<2P=:PO(P ;P:MO:P!>!>!>!>!>!>!>!> !> !> !> !> !>!>!>!>!>!>!>!>!>!>!>!>!>!>!>!>!>!>!> !>!!>"!>#!>$!>%!>&!>'!>(!>)!>*!>+!>,!>-!>.!>/!>0!>1!>2!>3!>4!>5!>6!W>2~:y >22̕&ʻS>$ͽXr&>$ͽX½S!TS#~SS#~ͽX~SSS*\> ͽX> ͽX Not valid label numbe GO is reserved word / TO or SUB expecte End of line unexpecte TYPE does not exis No vars give Error code 0 Missing = sign, = sign expecte Missing left bracke No names give Line too lon Un-defined operan ERROR CODE 1 Name given is a reserved wor One of these VAR names in us Too many left parenthese Too many right parenthese Reserved symbol ex. ": Two symbols make no sense ex. "%+ Number too larg Error in numbe Not enough argument Too many argument This number too large/smal Missing right bracke Error in print statemen Cannot end like thi Intr. symbol overflo Does not balanc Var not define Cannot process this / Statement erro Local code onl Form: ON /ERROR GOTO/GOSUB B2e:f ZZZ@2|Z>2zZ:e2|>A2f:g HZZ@ZXHZYPZ@2>a8Z:e2>a>S2gXZ>2{8Z>2|8Z>2}8Z!]~~#`Z!]Aa~#pZa:z‹ZiaaÞZ>2,cÞZ>2,c!d"-c!|:}·Z:{Z>2bZ>2bZ!d"bZ!d"bb͟a!Z~[#ͽXZ ****** End of program ****** ͘?!|:}A[:{A[>b*[OQc͏b:z:~Q[iCYCY>,c*:`}W[)|p[O2d[b:|2\:e=2eG'Compilation complete G'Compilation aborted ͉!"e):g:[MYɯ2!"\!e ~#^#V#!&R\!#S\!>g\[ͣ\:P1\=2P*\^#V#"\>g\\MY͛)e)ͣ\:!V#~zX/YXY#~#XY=D\ɷʓ\*oMY!)MY")*o#"oXXY*\s#r#"\!4*\6#6#"\!4P PRN:|=_}ʃa2!":`G'CANNOT CREAT OBJ FILE:>a=_@aa2`a!"a=_@a2`a!"a=_@aG'ERROR IN CLOSING PRN FILE:>a=_@a:?a=_\*a=_@a¥cG'ERROR IN EXTENDING PRN FILEcG'END OF DISK DATA FOR PRN FILEG'OUT OF DIR SPACE FOR PRN FILE\:?a=_\d>2\G'DISK READ ERROR:]Kd! 5d:|=_}†dG'ERROR IN EXTENDING OBJ FILE¯dG'END OF DISK DATA FOR OBJ FILEG'NO DIR SPACE FOR OBJ FILE__:eLe!le!yele!]>~ee#=e!ele:e&e0ee:e0ee:e<'2e> ee> ee> ee>2eee :e<92eد2e> _~ee#~me Program: Page: REAL.DOUBLEREALFLOAT.DOUBLEFLOATFIXEDINTEGERCHARSTRINGPBYTE!.MAIN.\.PROG..DATA..BLNK.SYSIN \SYSOUTERR1 ERR2 ; f/};@M> !D ;&!%BAD CHANNEL ;)NUMBEw$//Ð;>Ió//$/4ÐnO;SI&//$//Ð//;hH//_@|Z;}@*:; ¢ʗ 2;@Ì!|;x:|;*7>|;  22;;È*|!w; "_ ;&_7:Q;<\!>2;QB:~p\;f!_<2~!;z~ɀ&INPUT FILE REA;ĥ;@|Z;}@*:; ¢ʗ 2;@Ì!|;x:|;*7>|;  22;;È*|!w; "_ $lines REM XAMN Disk track and sector editor. REM No warranty is made, expressed, or implied. var hl,de,bc,a_psw ; cpu registers dph ; location of disk parameter header block_size ; cp/m logical block size max_tracks ; number of tracks/disk seldsk ; bios select disk settrk ; bios set track routine setsec ; bios set sector routine setdma ; bios set dma address b_read ; bios read sector b_write ; bios write sector sectran ; bios sector skew disk_number ; disk number to examine = integer var crt ; logical device list ; logical device CR ; ASCII CR BS ; ASCII BS ascii_mask ; ASCII mask bit_0_mask ; mask used to look at bit 0 true, false ; true/false logical flags = integer var menu_selection ; prompt return = char var r1, r2, r3, r4 ; Real number for computations = real based spt ; sectors/track dsm ; max data block number drm ; number of dir blocks off ; number of reserved tracks wboot ; entry to bios dpb ; location of disk parameter block skew_table ; location of bios skew table (used by sectran) alv ; pointer to allocation table = integer based bsh ; block shift factor blm ; block mask exm ; extent mask alloc_byte ; used in searching allocation table = byte crt = 0 rem S-BASIC device # for con: list = 1 rem S-BASIC device # for lst: CR = 0DH BS = 8 ascii_mask = 007FH bit_0_mask = 1 true = -1 false = not true base wboot at 1 rem location of bios wboot entry seldsk = wboot + 0018H rem set up bios entry address settrk = wboot + 001BH setsec = wboot + 001EH setdma = wboot + 0021H b_read = wboot + 0024H b_write= wboot + 0027H sectran= wboot + 002DH rem dma buffer for read/write sector operations dim byte sector(128) var loc_sector = integer location array loc_sector = sector dim base char file_chars(11) fcb_name(11) byte_dm(15) dim base integer word_dm(7) based bios_return = byte rem high order byte of a_psw only location var hl = a_psw base bios_return at hl+1 0seldsk input "Disk number (0,1,...,15) ";disk_number bc = disk_number call ( seldsk, dph, de, bc, a_psw ) if dph=0 then 0seldsk base skew_table at dph base dpb at dph+10 base alv at dph+14 bc = loc_sector+1 call ( setdma, hl, de, bc, a_psw ) base spt at dpb base bsh at dpb+2 base blm at dpb+3 base exm at dpb+4 base dsm at dpb+5 base drm at dpb+7 base off at dpb+13 block_size = 1024*(2^(bsh-3)) r1 = ((dsm+1)*(block_size/128))/spt max_tracks = r1 + off function physical_sec ( sectr = integer ) = integer if skew_table=0 then sectr=sectr-1 end = sectr function skew ( sectr = integer ) = integer if skew_table<>0 then begin bc = sectr - 1 de = skew_table call (sectran, hl, de, bc, a_psw) end else hl = sectr - 1 end = hl procedure get_sector( track, sec = integer ) var x = integer for x=1 to 128 sector[x] = 0 next x bc = track call ( settrk, hl, de, bc, a_psw ) bc = sec call ( setsec, hl, de, bc, a_psw ) call ( b_read, hl, de, bc, a_psw ) sector[0] = bios_return end of get_sector procedure put_sector( track, sec = integer ) bc = track call ( settrk, hl, de, bc, a_psw ) bc = sec call ( setsec, hl, de, bc, a_psw ) call ( b_write, hl, de, bc, a_psw ) sector[0] = bios_return end of put_sector function ascii_character ( x = integer ) = char x = x and ascii_mask if x<32 then x = 46 end = x procedure display_sector ( device = integer ) var x, j = integer for x=1 to 128 step 16 print hex$(x-1);" "; for j=0 to 15 if j=8 then print ' '; print #device; right$(hex$(sector[x+j]),2);' '; next hex byte for j=0 to 15 if j=8 then print ' '; print #device; ascii_character(sector[x+j]); next ascii byte print #device next line of sector display end of display sector 0menu print print print "Drive number ...............";disk_number, "Current disk ";'A'+disk_number;':' print "Sectors/track ..............";spt, '['; hex$(spt) ;']' print "Tracks/Disk ................";max_tracks, '['; hex$(max_tracks) ;']',\ "XAMN Disk editor" print "Number of reserved tracks ..";off, '['; hex$(off) ;']',\ "Version 1.1" print "# of logical blocks ........";dsm+1, '['; hex$(dsm+1) ;']' print "# of directory entries .....";drm+1, '['; hex$(drm) ;']' print "Block size .................";block_size, '['; hex$(block_size) ;']' print "128 byte sectors/block .....";block_size/128, '['; hex$(block_size/128) ;']' print "Disk size in K .............";(dsm+1)*(2^(bsh-3)), '['; hex$( (dsm+1)*(2^(bsh-3)) ) ;']' text 0,% Help Examin a sector (physical)......... 1 A Examin a sector (logical skew)..... 2 B Move Sectors ...................... 3 C Produce a map of a file ........... 4 D Produce a map of disk ............. 5 E Find bad sectors .................. 6 F Compute Block from Trk & Sec ...... 7 G Compute Trk & Sec from Block ...... 8 H Select disk ....................... 9 I % input2 "Please enter selection ==>"; menu_selection var track, sectr =integer var letter = char function group ( trk, sec = integer ) = integer var sectrs, grp = real sectrs = ((trk-off)*spt)+sec-1 grp = sectrs/(block_size/128) end = grp procedure trk_sec ( grp = integer ) = integer var sectrs, sec, trk = real sectrs = grp*(block_size/128) trk = sectrs/spt track = trk + off sec = sectrs-((track-off)*spt) sectr = sec + 1 end procedure bump ( amount = integer ) sectr = sectr + amount if sectr>spt then begin track = track +1 if track>=max_tracks then track=max_tracks-1 sectr = 1 end if sectr<1 then begin track = track -1 if track<0 then track=0 sectr = spt end end of bump procedure dump_physical ( device = integer ) get_sector track, physical_sec(sectr) print #device; "Track=";track; " Physical sector=";sectr, \ " Logical sector=";skew(sectr); if sector[0]=1 then print #device; " {BAD}" else print #device display_sector device print end of dump_physical procedure dump_logical ( device = integer ) get_sector track, skew(sectr) print #device; "Track=";track; " Logical sector=";sectr, \ " Physical sector=";skew(sectr); if sector[0]=1 then print #device; " {BAD}" else print #device display_sector device print end of dump_logical function hex_byte ( c = char ) = char c = c-'0' if c>9 then c=c-7 end = c procedure modify ( t, s = integer ) var c=char var x=integer repeat begin x=1 repeat begin print hex$(x-1) ;' '; right$(hex$(sector[x]),2) ;' ';\ ascii_character(sector[x]);' '; input3 c if c<>'.' and c<>CR and c<>BS then begin sector[x]=hex_byte(c) input3 c if c<>'.' and c<>CR and c<>BS then sector[x]=(sector[x]*16)+hex_byte(c) end if c='.' then x=128 if c=BS then begin x = x-2 if x<0 then x=0 end if c=CR and x=128 then x=127 print x=x+1 end until x>128 print print t,s display_sector crt repeat begin print input "(W)rite to disk, (C)hange more bytes, (A)bort ";c if c='W' then begin print "Writing sector to disk..." put_sector t, s if sector[0]=1 then begin input2 "Write fault. to continue";c print display_sector crt c=' ' end else c='A' end of write end until c='A' or c='C' end until c='A' end of procedure modify $page case menu_selection of '1': begin input "Track, sectr"; track, sectr print dump_physical crt repeat begin input "(F)oward, (B)ackward, (R)ange, (C)hange, (E)xit ";letter case letter of 'F': begin bump 1 dump_physical crt end 'B': begin bump -1 dump_physical crt end 'R': begin var s, c, device =integer input "Number of sectors to display";c device = crt for s=1 to c dump_physical device bump 1 next Sector end of 'R' 'C': modify track, physical_sec(sectr) end of case end until letter='E' end of option #1 '2': begin input "Track, sectr"; track, sectr print dump_logical crt repeat begin input "(F)oward, (B)ackward, (R)ange, (C)hange, (E)xit ";letter case letter of 'F': begin bump 1 dump_logical crt end 'B': begin bump -1 dump_logical crt end 'R': begin var s, c, device =integer input "Number of sectors to display";c device = crt for s=1 to c dump_logical device bump 1 next Sector end of 'R' 'C': modify track, skew(sectr) end of case end until letter='E' end of option #2 '3': begin var t = char repeat begin t = ' ' while t<>'L' and t<>'P' and t<>'E' do input "Move (L)logical sectors, (P)hysical sectors, (E)xit ";t if t<>'E' then begin var ok = char var trk1, trk2, sec1, sec2, cnt, x = integer ok = ' ' while ok<>'Y' and ok<>'A' do begin input "Source Track, Sector ";trk1, sec1 input "Dest. Track, Sector ";trk2, sec2 input "Number of sectors to move";cnt print print "Source Track, Sector = ";trk1, sec1 print "Dest. Track, Sector = ";trk2, sec2 print "Number of sectors to move ";cnt print input "Is the above correct (Y/N/(A)bort) ";ok end if ok<>'A' then begin for x=1 to cnt print "Reading track";trk1;" Sector";sec1; if t='L' then print " Physical #";skew(sec1); if t='P' then get_sector trk1, physical_sec(sec1) else get_sector trk1, skew(sec1) if sector[0]<>0 then print " Fault" else print print "Writing track";trk2;" Sector";sec2; if t='L' then print " Physical #";skew(sec2); if t='P' then put_sector trk2, physical_sec(sec2) else put_sector trk2, skew(sec2) if sector[0]<>0 then print " Fault" else print track = trk1 sectr = sec1 bump 1 trk1 = track sec1 = sectr track = trk2 sectr = sec2 bump 1 trk2 = track sec2 = sectr next sector end end end until t='E' end of option #3 '4': begin var count ; number of sectors to search = integer var file_name ; file name to search for = string:12 location var count=file_name locate file_chars at count track = off rem starting track sectr = 1 rem starting sector input "File name ( only to skip) ";file_name if len(file_name)>0 then begin function match = integer var result, x = integer result = true if fcb_name[0]=0E5H then result=false else for x=1 to 11 if file_chars[x]<>(fcb_name[x]) and file_chars[x]<>'?' \ then result = false next x end = result procedure dump_fcb( device = integer ) var x = integer print #device; "Track";track; " Sector";sectr; ' '; for x=1 to 11 print #device; fcb_name[x]; next x print #device; ' '; if dsm>255 then for x=0 to 7 print #device; hex$(word_dm[x]); ' '; next x else for x=0 to 15 print #device; right$( hex$(byte_dm[x]),2 ); ' '; next x print #device end file_name = fcb$( file_name ) print "Search for file:";file_name for count = 1 to (drm+1)/4 get_sector track, skew(sectr) print "Searching Track:";track; " Sector:";skew(sectr);" ";chr(0DH); locate fcb_name at loc_sector+1 locate byte_dm at loc_sector+17 locate word_dm at loc_sector+17 if match then dump_fcb crt locate fcb_name at loc_sector+33 locate byte_dm at loc_sector+49 locate word_dm at loc_sector+49 if match then dump_fcb crt locate fcb_name at loc_sector+65 locate byte_dm at loc_sector+81 locate word_dm at loc_sector+81 if match then dump_fcb crt locate fcb_name at loc_sector+97 locate byte_dm at loc_sector+113 locate word_dm at loc_sector+113 if match then dump_fcb crt bump 1 next directory sector var x=char print input2 "Press to continue";x end end of option #4 '5': begin function bin( x = integer ) = string var bits = string:8 var y = integer bits = "" for y=1 to 8 if x and bit_0_mask then bits="1"+bits else bits="0"+bits x=x/2 next y end = bits bc = 14 de = disk_number call(5,hl,de,bc,a_psw) rem bdos seldsk function var x, y = integer print for x = 0 to (dsm/8) step 8 print hex$(x*8);": "; for y = 0 to 7 if x+y<=(dsm/8) then begin base alloc_byte at alv+x+y print bin(alloc_byte);' '; end next y print next x print "Last block is";dsm+1,'[';hex$(dsm+1);']' input2 "Press return to cont.";x end of option #5 '6': begin var x = real var t1, t2 = integer input "Starting track, last track ";t1,t2 track = t1 sectr = 1 for x = 1 to (t2-t1+1)*spt print "Track:";track; " Sector:";sectr; " "; get_sector track, physical_sec(sectr) if sector[0]<>0 then print "{BAD}" else print chr(0DH); bump 1 next x print input2 "Read complete, press to cont.";x end of option #6 '7': begin input "Track, Sector ";track,sectr print "Group #";group(track,sectr), hex$(group(track,sectr)) input "Press to cont. ";track end of #7 '8': begin var x = integer input "Group number";x trk_sec x print "Track:";track,"Sector:";sectr input "Press to cont.";x end of #8 end of function number menu selection if menu_selection = '9' then 0seldsk case menu_selection of 'A': begin text 0,% To examine a physical sector use this command. Sectors are numbered from 1 to the end of the track. Tracks are numbered from 0 to the end of the disk. The physical sector number displayed is the sector number from 1 to end of track, the logical sector number is the number your BIOS uses to access this physical sector. When you type this command you will be asked for the track and sector you wish to examine. After you respond the sector will be displayed. You will then be asked if you want to move forward or backward from your current position on the disk. You may, at this time, specify a range of sectors to be displayed from the current position on the disk. You may also edit the sector making changes to it in an buffer internal to XAMN. And last but not least you can exit to the main menu. Each option is selected by one key press. The letters are F, B, R, C, and E. When changing a sector the sector address in hex will be displayed along with the hex contents of the byte and the ASCII character it represents (Period if none). To enter a new value type it in, to move forward push return, backward push back space, and to exit push period. Upon exit you may re-edit, write the sector to the disk, or abort leaving the sector on the disk un-changed. % input2 "Press to cont.";track end of 'A' 'B': begin text 0,% Use this command to examine and edit logical sectors. Logical sectors are the sectors that the BDOS refers to, the physical sector number may be different. It is the physical sectors that the BIOS access. For more info see 'A' above. % input2 "Press to cont.";track end of 'B' 'C': begin text 0,% This command is used to move sectors around on the disk. It can be used to move physical sectors or logical sectors around. The main purpose for moving sectors around is to allow re-formatting of a track on the disk. First, move the data on the track you wish to re-format to an unused area of the disk. This area can be found by generating a map of the disk using another of XAMN's commands (Map disk, see also help 'E'). Second, exit XAMN and using your system format utility format ONLY the track with the bad sector. Re-enter XAMN. Third, move the data back onto the track. This command will start by asking you if this is a physical move or a logical move (use logical if you want to move CP/M groups around). You can exit at this point. Next, you will be asked for the starting track and sector number, the destination track and sector and the number of sectors to move. BEFORE each sector is read or written you will be told of it, if an error occurs you can see where it happens. AFTER the operation the program will move on to the next sector if all is well or print "Fault" to show a read or write error. % input2 "Press to cont.";track end of 'C' 'D': begin text 0,% This command generates a map of a file showing all the CP/M groups assigned to that file. It also reports on the directory sectors that contain that file's FCB. As each directory sector is searched a report of that operation is made sector by sector. % input2 "Press to cont.";track end of 'D' 'E': begin text 0,% This command generated a disk map showing allocated groups. A 0 is an empty group, un-used by any file. A 1 is a group in use by a file. WARNING: this command makes a BDOS disk select call. At the end of the map a few groups that do not exist may be displayed as empty. This is because the disk map is made up of bytes where each bit in the byte is a group, the last byte in the map may not be fully used up. At the end of the map the last group number is given, use this number. This command can be used to find unused disk space. % input2 "Press to cont.";track end of 'E' 'F': begin text 0,% This command is used to find a bad sector. It will ask for a starting track and an ending track. As it reads each track and sector it will report its progress. Any bad sectors will be reported. % input2 "Press to cont.";track end of 'F' 'G': begin text 0,% Use this command to compute a group number from the LOGICAL track and sector. Remember that logical groups start in the directory, NOT in the reserved, or 'OFF' tracks. % input2 "Press to cont.";track end of 'G' 'H': begin text 0,% Use this command to compute the track and LOGICAL sector number for a given group. % input2 "Press to cont.";track end of 'H' 'I': begin text 0,% Use this command to select another disk. XAMN commands are in reference to the current disk number (see the display above the menu). % input2 "Press to cont.";track end of 'I' end of help case statement if menu_selection=03H then stop goto 0menu  a given group. % input2 "Press to cont.";track end of 'H' 'I': begin text 0,% Use this command to select another disk. XAMN commands are in reference to the current disk number (see the display above the * Program.: SP-MAIN.CMD * Author..: Debby Moody * Date....: 02/06/84 * Notice..: Copyright 1984, ASHTON-TATE. All rights reserved. SET ESCAPE OFF SET TALK OFF SET BELL OFF SET INTENSITY OFF DO WHILE T ERASE @ 1, 0 SAY "========================================" @ 1,40 SAY "========================================" @ 2, 0 SAY "||" @ 2,78 SAY "||" @ 2,15 SAY "D B A S E I I S A M P L E P R O G R A M S" @ 3, 0 SAY "========================================" @ 3,40 SAY "========================================" @ 4, 0 SAY "||" @ 4,78 SAY "||" @ 5, 0 SAY "||" @ 5,78 SAY "||" @ 6, 0 SAY "||" @ 6,78 SAY "||" @ 7, 0 SAY "||" @ 7,78 SAY "||" @ 8, 0 SAY "||" @ 8,78 SAY "||" @ 9, 0 SAY "||" @ 9,78 SAY "||" @ 10, 0 SAY "||" @ 10,78 SAY "||" @ 11, 0 SAY "||" @ 11,78 SAY "||" @ 12, 0 SAY "========================================" @ 12,40 SAY "========================================" @ 5,29 SAY " 0. exit" @ 6,29 SAY " 1. mailing labels" @ 7,29 SAY " 2. inventory program" @ 8,29 SAY " 3. checkbook program" @ 9,29 SAY " 4. help" STORE 5 TO select DO WHILE select < 0 .OR. select > 4 STORE " " TO mselect @ 12,33 SAY " select : : " @ 12,41 GET mselect PICTURE "#" READ STORE VAL(mselect) TO select ENDDO DO CASE CASE select= 0 SET TALK ON SET INTENSITY ON SET ESCAPE ON SET BELL ON CLEAR RETURN CASE select= 1 DO Lb-print CASE select= 2 DO In-main CASE select= 3 DO Cb-main CASE select= 4 DO Sp-help ENDCASE ENDDO T * EOF SP-MAIN.CMD  select < 0 .OR. select > 4 STORE " " TO mselect @ 12,33 SAY " select : : " @ 12,41 GET mselect PICTURE "#" READ STORE VAL(mselect) TO select ENDDO DO CASE CASE select= 0 SET TALK ON SET INTENSITY ON SET ESCAPE ON SET BELL ON CLEAR RETURN CASE select= 1 DO Lb-print CASE select= 2 DO In-ma2#D/TBMEQSVH@#.-DI NPAK_FLCV  = y CABCD&s1a&s0aCOPYRIGHT 1982, PAWLUK CORPORATION5455 Wilshire BoulevardLos Angeles, CA 90036(213) 937-0551^#VN#F!}~#zo*!U.>)Þ!/.>S |2!/>͝!!.c!!C/P!=!C/.>P!!/>͝!!C/͛!!/e!w!!0L!!0͕ >3>!0GͰ!!0&  !B/Ͱ!!B//>!< !-.6!C/6!0.>)Ø!0/>L!!0͕ >3>!E1GͰ!!C1&  !C/P!!C/͛!!/>͝!!/>͝!͔ !/!”*_,>!/>ͅ>* .̓"7R;0!/>͝!` )!"-" .͜ !">/*."F1*F1*>/̓"!"@/*_,>!/>ͅ>"H1*H1*@/̓"*-*>/P"*@/"J1!J1& *@/#"@/Ã*>/#">/S*_,>>"@/!">/*_,>> X!/>ͪ> >"L1*L1*>/̓"4R*0>͛!/>͝!` )*>/#">/7RL0!-͛!` )Ra0!d,͛!` )!">/*>/ |3/#">/g ×< !{.>)!S1/>L"!!Q1͕ !{.9 R0!-͛!` )R0!d,͛!` )!">/*>/ |3/#">/ !{.>)#!}""_,!M0*_,&0>!*_,>!/>ͅ>" .*_,>!/>ͅ>".*_, >!x.>,!".*_,!..>G!*_,!/.>G!!""-!">/*>/ |*-*>/P"0>P!*>/#">/*_,~!C/P!!C/ ͝!|2a,!C/ ͝!|2b,!C/ ͝!|2c,!C/6!"@/">/."O0*O0*>/̓"*_,3*@/*_,**>/~O !1,*>/3">2!*_,**>/~_W*@/"@/*>/#">/W!,n&!,n&= }2.:.og!0-n&= }2.:.og!c-n&= }2.!c-K ͝!!0-K ͝!!,K ͝!!,K Ge!w!w!!.Ͱ!RW0!-͛!` ),*_, !0x!t&,å*_, !0x!Ž4,å*_, !0x!¥B,!{.9 < !S00>L!!Q0͕ !>06!?010>G!!G090>G!!">/*>/ |!I0*>/6*>/#">/!>0"<0!02 W* .".*-".R50!d,͛!` ):b,i!"1*1 |i3>+"1*1*1̓" *-*1P">P͝!!1>͝! +" .: .q ͜ *_,>!1>ͅ>"1* .#"1*1*1̓"/*-*1P"*1!1x!0 *1+"1* ."1*1"1*1*1̓"q *-*1P"*1"1!1& *1#"1< *-#"-*1#"1Ô*." .*."-!"1^#V"1*-".* .".*_,>>"-!" .͜ !1*1L>G!*_,>!1>ͅ>*1n&N " .!"1* ."1*1*1̓"; *1*1] G!1>!!1& *1#"1 RL 0͛)!"1*_,>!1>ͅ>"1*1*1̓" !1& *1#"1o *."-*." .͜ >22!,n&}22:2og:2og̓" !,:2_ G!1>! *-*_,#>>> m!12!; !,:2_ G!2>!6 * .*_,#>>> m!12!; !16!1n& :a, !1!1͛!!2>͝! G!1>2!>22!1n&}22:2og:2og̓" !1:2_ G! 2>!!2& !24 !1͛!N"2*2}3>! 2GͰ!! 2& !,:2_ G!2>!!2& !24ë ^#V^ #V! *3> K*  3 |G |{z= FZ ʆ Oʆ } # ʊ h Å e gl #~wí !9_#F#O >+ ~ !  # # H o&!2Ê&"42!22B ^#V"62*62"82!82\Y Ç O:.y !9Gʀ ~#'q q yÇ O:.   {§ *.| j& *.*.̓"#̓"> > > {=>'!9=~#' {>' {=>'{>b*.++|2<2!:2:ɯ7>7>2G2"H2"J2`i"L2!9"N2!=2S2 ~# X*2~*2~œ!2>͝!G3!!!0. !0."2!2!2>͝!G3!R.!!. !."2!2*2"2!2!2?*2^#V!.s#r*2^#V!.s#r*2^#V |*. |G!2́*2^#V}*.}GA!2́:.e*2^#V}*.}Ge!2́:.*2^#V}!2́^#V"2!."2*2"2!2͊&22!2ä^#V"2:.:.*2*25!26:2  ú !2:*2 *25!.6!2::.*26F22:29!."2!"2!2͊&!.6#6!26 ^#V"2!."2*2"2!2*p!."2!"2!2͊&m:.*2~ ڊ*.#".*2~ ž!.6#6:.*2~ *.#".!.6#6*2~ *.#".!.#!.6#6*.*.#̓"|!."2!"2!2͊& !.6:.!3:"3!9"3!3?! 9^ 3~# D* 3^#V|Y* 3*3 *3 nb*3 !3>!è!3>͝!* 3c!!3Ͱ!* 3~#* 3^#V)))|* 36P#6* 3~#* 3^#V))|* 36#6* 36<#6* 36#6* 36#6* 36#6* 3 6* 3^#V}}23* 3^#V}e!344* 3^#V}{>23* 3^#V}*3~#¦*36#6* 3"*3*3"&3*3"(3! 3* 3^#V|* 3"43!"63!,3͊&^#V^#V?*:.!&͊&2.O!/6 +~#w!. s#r!.4)./.02 I/O Stack Overflow:.f!."=3!93c!836q:.283!.6:83 ڀ*.#".:83 !.6#6:83""*^#V#"^#Vͪ͞"ͪ"|ͯ|~ͪ͞yaA =.:;<>[]y * $1) o&))))\xH  F#w F*#uAuG:z 6p4+ʤ#ʰ#*œ6?àw‹ʷä#6 °. #*6?w#6 %#6*##^ ~?# xCON CON RDR PUN LST M!+ ~$¨1t\[l¨$¨!~ ¨! ʝ#|x=Gy>ɯ*+ͪ^#VͲ#{#zͪ6#6Ͳ r+s!?3F#~ !?36P  U* U*!@3^r+s6 #6 !@34^N*|9}=&511O>~EE>͇N*|qY1=^yjU*m>~}=}>͇q2 */" ͹{Ͳ* *#: OͲ#s#r͹ڠÇͲr+s{!4* +>|+}o͔͞~2͞"ͯ: :@G: *p:4#6:[*++"d}+h}|2""1"| ##"6*s#rUy{ y*:wګ6*"<:y*w#w͔ͯ͞q͔ͯ͞NL*~" 4#4#4͔ͯ~k͡*>Ͱ͔ͯ~>Ͱ*~ʘ>͡/*!*~!/2 *|(^#V{zz<2z: qNL#*|<*~<=!9: ͇62w=>͔ͯ|}~> <͔ͯ|s*w=*+*^#V6+6++W#͔>"N#F#~͞q#p#w>͔>*~!=>!*" s#r#w=* }!36 4>23*3!4#4#4~#N#F#y#x#:3*3!!:3g<&:3~G~#~O?Ҧ#~¦! p! y! q<ª<&ɯ~#N#F#w#q#p ~#!!ͬ! 6?<= _!x FNwxG>O>G!$q#p#61"3"323x23 23!3~5Lw=¢:3¢*3Gx|g}o ""G!9!y??)0:1Š"# #yJ) ?xDMox&9`iɷ҈!9VzwzO#eʄ¶ ¶ ! 9/GO~¶ O¶ ~q+¬!96#=¿O!9Fxny! 9~WwzO+_ /!9~#= n"3>*3"3!N*3"3!N*3G!9!xʪ ʥ+w$%Š"gå-l0":"0T])ڊ")ڊ"ڊ")ڊ"o|gڊ"\{ʺ$%Š"}û|ڊ"z-{"o&9}O!9 w#60#60! 9~ !97>?'w#-!9~S'~#S! 9~.9+60E0E6 #-+r>o&9y>o&90w+j6./G! ¶>0 »>-3T]))寕iO>`G>0 < DM0 > %w#% O~#;GxNZ ¶ > f¶ #Z!9!97>?'w#v!9!7>?'w#‘ì!9~#¸!9#>ê"!9Z !9Z !9͝ !9͊ !45!9|  7 !9! 9k ! 9w#J !9~k <7>?'w#n 'w# 7>?'w## ^{w{W#¡ ! Ê& ȇ ) yw# ~# ~#W #;!~#o>gxG\!G!wF#"3x͝!w!*3!9G_>WObk++ʗ!~+!y~#/g{ozg!"Ê&""""" Conversion2"!"Ê&""""#}OD*4~###~#fo"!"Ê&""""" Free Space Exhausted##^#V#{_zW#{_zW"4z)#{R###^#V# ##s#rs#r#s#r+++~sw#r####}*4}|#*{z#+F+N+V+5^{#{z#}|#{ʦ#ڦ#i`~sw#r##q#p i`N#F#^#V~#q4#p+i`##s#r#+#+ FREE Request Out-of-Range$ Free Space Overwrite$:423i`"3!3~6"$_$ԓ$*3:423N#F#^#V : G$ %@23`i"3>23[$_$͓$>23!3~y$%‡$ :3=23g$^#V"3!3%:3?4M&3-&&!^#V"3!^#V+}o"3&*3*4{z$H4M&>23!3"35%~%^#V#N#F*30%%*3i`0%%*36*3 "3:3=23$}|!3~M%Q4M& :%*3MD%3 w#^%*3*3}O|G3|%"4" 4yo`" 4* 4|% " 4*4]Tu&* 4T]p&c4M&*4"4Í%u& %%#%>ɯ %w#%a{3 %:4@w#6:#   &w#{&6.#&!3|%?&k&<Z4M&! w #F& 24!(4 w#W&%!4͊&GKҢ&Mbkâ&o(Fn(Nn(N#Fn(^#V"/y2/xҵ&i&ͯ)&&x&>&!.{#z*.*.)xyx&S'_!(^#Vͪ'M'>(O'y͆'>)O'|0'B'(|<'B'ͪ'ͼ'ø+>,O'M'> _U* U* U*0:O'O']']'M'|k'}k' ږ'dԘ' ͘'ڣ'Ú'x]'N #~O'ì'!}(ͪ'*4!9{_z'{' ''M'>#O'*4>=^#V#w''(>: (>?O'!u(ͪ'ͪ'>=O'^#V|G(}>(.))(ê'#F>A(> #b(~ >.(~ (=S(^#V# File: Traceback:(((((((( ERROR FIXED OVERFLOW OVERFLOW UNDERFLOW ZERO DIVIDE END OF FILE UNDEFINED FILE KEYNULCONCONRDRPUNLSTBADG!/~>)#)+ Condition Stack Overflow$4Ox!l4 w#s#r#s#r!9!/ s#r!/N!l4 +++++w)#{)#zʕ)++~w)++!/5!~# ¤)à)!/N!l4 +++++¿)#~#)+{)#z)++~ÿ)#^#V=!.~?*5:._!.^#V"...~# **.))))). )| &**.|}*O6# ~+ n+=ɯ ~#fo+++!4~#+*4+¸+++,  Insufficient Memory$ Invalid I/O List End of Execution$P,,$ZSCRN ,,$MGEN :,$CGEN H,$DGEN b bb SYSININOUTSYSPRINT ..ZIPNo file (Return to continue).QUIT to system (Yes or No)?YyYes DISK IS FULL--returning to system. MCDReturning to ZIP screen. ????????$$$ _, S0 <00+ 1o+kk>   0'0hen Sign = ' 'E1P1S11 1 1 1  2 2 2 22.22 Invalid Format Item42<2G2H2J2L2N2 Stream/Record Sequen/Direct Input/Output Keyed Access P< $con 22.2P2^2l2z222>22 222222222222 3.dat33*3 3 34363=383 OVL44444OVERLAY, DRIVE SIZE NESTING NO FILE READ  -!-`i^!< -!`i#DM^! =-`i^! @--`i`i#DM~}-`i^! k-`i^! z-!`i#DM+s}-E-ͩ1|ʜ-!&0ê-!F0 -!`.!͝8!9!.!9!8!!3! ̈́.I.`i*x,#"x,+)+s#r`i#DM~I.`i^! 7.`i^! F.!`i#DM+sI..ø,!+*x,̈́.Can't open file for redirection: ͤ ]!! 9~#ʞ.!.6Ͳ*A:$$$.SUBͤ !"!ͤ !`i_ΊX!͏! 9N#F`iX`i9X!X!͏! ^#VVXX! 9^#VͧXX!Y!*/^"t͏*t|#Y!*/#^͏*tDM|IY*/#"/^"t`i͏!}2"1"t!"/͏*t|‰Y*~Y!!1[jY,Y͏*t|YY*|ʩY!,Y͏!"*ޖ#":lst c   !  9^# !rx0#fo#s#r!       !"!DMô0`iDi~#0!9^#V`i^d80ì0! ^#!9^#V! #!9s#r!  1! ͓ !" ( 4 6 7 8 9 3 #V!nfʠ1!? [ \ e o p z V !!DM! $%& !    s#r!ͤ !.DMDM`i/W _zi2<2!"  9^ !* 2 2!  1 2 3  "!# s!$!"#s#8 ^ _ a x y    # u  0  > Q  q 3              Run mite directlyErase a siteModify a siteChange a site nameSet up a new siteOther OptionsOther OptionsOff. Airline GuideDow JonesDialogNewsNetCompuServeThe SourceInstructionsMITESOURCECOMPSERVNEWSNETDIALOGDOWJONESOAGOFF^M^M@W^M@E@T=@P1d1^M@T@@P1c ^M@T?@P1id OFF^M@T*@WA@T:@P1cis02^M@T:@T:@P^M@T:@P1@W^C@T:@P^M@T:P1@NOFF^M@T*@WA@T:P1net^M@N@T>P1id ^M@W^M@E@T=@P1^M@T@@P1c 21566^M@N@T>@P1id DISC^M^M@W^M@T=@P1d1^M@T@@P1c 60942^M@T?@Wdjns^M@TE@W@T*@WA@T:@P1^Rdow1;;@T?@Wdjns^M@TE@W/Q^M^M@W^M@T=@P1d1^M@T@@P1c 312159^M@T;@W;@T*@WA@T:@P1oag^M@T;@W;M+LL3MMNO=QRSTUOVVVVWWW4XXYYxZ[[[[/\z\\\<]{]]]3^^^^ "* !" * 6*-o -o!A!A!A!!$!r*loE *|E s@+ !<hH!C!"L!ͤ s@DM|r e *|ʈ !A!"`ilo› ͤe !A-o! !! r!}2 !DM `i#DM`iͦo ! ͋A ! 9^#V)} ^#V -o!#9N#F!!" `i" ~`i^! lo=`i#DM* #" `i^zH!" " * ͦo`i^z`i^! loʓ`i^! loʓ`i#DM* #" v* #" `i^! {o`i^z* ͌o* * #" +͋A`i^!lo`i#DM* #" `i#DMÚQ* lo!* s* DM`i~* ͧoʕ`i+DM^! {oN* +" 3`i+DM^! loi* +" N`i#DM!9`i#DM+* ̀p!* !9ò`i#DM+* ̀p* !9͞s!!9s!9* #" +͋A+ͦo-o!T9N#F!V9^#V!T9^#V!9͞s!!X9^#V!9s!9!" ;#n&|ʌn& loj#+)!$9s#rn&loʂ#É* #" 4|`i* ̀p" |* Ro" * ͧo* |* ͧo!" * ͧo * +)!$9^#Vs* * " +Ô!9&#~ʕn&oyn&oT+|v! !Z9~#fo#s#r+sMÒn&!Z9~#fo#s#r+s!!Z9^#Vs-o!9N#F!`i*)^#V!9s#r*|s@!9^#V^!lo!9^#V!^#V(F9!9^#V^!lo-!9^#V#^G9!9^#V7!*lo]F*"!*|ʚ!B*L*+"*loʑ!(F×!*{o*{o*+"!(F**ͦo!B*L*#"*lo!(F!`i-lo9*|:*{o6*"!(F`i+log*{oa*"!(Fd*#*{o*ͧo–)~#Ÿ!)^#V##^#V^͢t͢tlo!B*L"!#nͫp   BB` ` |F!C*L*)^#V!^#Vͤ -o!!9s#r!C9^#V*|!C!0ͭ9!A!!!78!B!0ͭ9!!!78!C!0ͭ9!`E!"!!9s#r8!A!C!0ͭ9!B!4ͭ9!!!78! ! 9s! 9!"!ͤ5!C!4ͭ9! 9^zO!A!"!!!!9r!!9^!9##s!9!!DMÙ`i#DM+`iͦo n&|! `i!9sn&! `i!9s!#+s#+^͌t`i!9sÓ!!#9Js!9!Tq{oD!!!78!9!D>!ͻ!!i!-Js!!!]!O͈$!9!9!Tq!9?!!_j!9s#r!!!9! 9^#Vr!9^#Vv=* #" !!>8!}ʹ !!>5_!!>8!ʹ !!>e!!>8!ʹ H!}2-!!>b!9s#rz!!9^#V!^#V#!9͞s!!9s! 9!>!9^#V#^"!9^#V!^#V ?!9^#V#^!!!͈$!9!9^#V!^#V?!!>8! 8ͫpb   < 8!9^#VA!A*##^!loʦ*!99s#r*"*! 9s#r!<"! 9^#V(F!B!L!99^#V"î*hHThe file containing the instructions, AUTOMITE.HLP , is not on disk.Site name (1-8 letters/digits)? PARThere already is a site with that name!Setting up Save on diskThis saves the new file on diskerase.Deletingrename.Renamingmodify.ModifyingModifying Save on diskTo save these changes, press RETURN-o! 9^z!" ! 9^!#s!" * <>.,;:=?*[]_%|()/\-o! 9N#F`i~#{! ^ͻ!! ^+b$pi!-JsÎ!}2-! ^#V ?! ^"! ^!!!͈$!9ʝ`i~#…!!_j! s#r!!!! ^#Vr! ^++))E^#V!#ͦo_n&|=! ! ^#V#s\#+^͌t! ^#V#s !! ^#V! Js! ^#V!Tq! ^#V?! ^#V !A!A*hH ConnectGoes to mite and dialsPAR-o!!Tq!9!Tq!* s!*!Tqs!!9DM#+ͦop!`in&os`i^! lob`i#DM)`i^! loH! !Tq! !Tq#ͧoE!B!0ͭ9!B!1ͭ9!`E!`E!C!1ͭ9!C!0ͭ9!B!4ͭ9!!Tq!9sz! !Tq!C!4ͭ9!9^!lo2!!Tq!h`i^!loYs`i^!Tq`i#DM) !B!0ͭ9!B!1ͭ9!`E!C!0ͭ9!C!1ͭ9!B!4ͭ9!!Tq!9szü!C!4ͭ9Press RETURN for more -- To end, press ESCape. To go back to the menu, press RETURN.-o!!E!C!0ͭ9!C!1ͭ9! 9~#ʃ! 9^#V`EÐ!!͊E!!E!9~#!B!1ͭ9!B!0ͭ9!9^#V`E!!͊E!C!0ͭ9!C!1ͭ9 -o!Tq-o_!!!!9r!9! ͍q!9!TqloX!9!Tqz!9!Tq!9!Tqzf!!!9r! !9Js!!9s!9!Tq!9!Tq! !9Js!9~#Q ! 9DM! ! 9s!#ͦo7 !9^#V#^! {o7 !9^#V#^`i#DM+s!`i#DM+s! !9͵s!9os!9s!9!Tq!9!Tq!9!Tq!A!$$$.SUBautomitemite K-o* | !!A! !!78! 9^#V`E!"There are no files to ~# H!I!P!X!D_!Pl!Bz!P!P!S!U!M!*F+~ n,` %DirectTelenetTymnet Description Phone number Baud rate Parity/bits Password Service User code Machine #-o*'|!*' ?!#!JsÜ"!!"!r!M}2!'}2!#-!}2!}2}2}2}2! }2!}2!}2!}2!}2! }2!}2!}2!}2!}2!}2!}2!}2Ͳ#!Js! !!r! 9^#V!b$p" !! 9^#V!{o#*<"n f |#n&! 9~#folo#nf!Js#"* !F^#V!͋oJ#!#!Js!#!Js!#!AJs* !F#!=}2!}2!#!Js!=}2Q* !##^#Vos}2R* !##^#V!SJs300passworduser#99999^Kdir^M-o!#͸tlo#!!#AT DT-o! 9N#F`i^#V"! ^#V͎8! ^#V!Js`i~#9$!A8! ^#V8! ^#V!UJs`i~#j$!8! ^#V8! ^#V!iJs`i##~#ʄ$!8!$8^M-o!9^#V!b$p" !!!!r* !F̈́)$* !T̈́)* !^#V! 9s#r!9^#V#^͌t}2!!9^#V* !2s#r!9^#V"!!A!! 9s#r:o&'{ol%!C!0ͭ9!(!! 78!(!! 78!! 9s#r!C!0ͭ9!DMÆ%`i#DM`i! 9~#foͦo%.)!')`Ex%!B!1ͭ9!9^#V`E!C!1ͭ9%+Á%!,!!9s#r" !* !|&!!-#s!!9s#r" !#~&&!9~#z&!C!0ͭ9! 9^#V.)#^! 9s#r! 9^#V!{o!9s#rzw&!!-#sÅ&!!9s#r!B!0ͭ9! 9^#V.)! 9^#V)* !2^#Vͤ !9~#&s@|&&&!! 9^#V!9s#r͌t|(! 9~#Z'!͎8:Ao&| '!A8!U8:o&|;'!8!i8:o&|V'!8!+)8!!B!1ͭ9!B!0ͭ9! 9^#V.)!C!1ͭ9! 9^#V.ʢ'!u!B!0ͭ9! 9^#V.)×(!! 9~#'! 9~#fo+s#r×(! 9~#fo#s#r! 9~#foo! 9s#r×(! 9^#V#DM(`i#DM`i! 9~#fo{oy(`i! 9~#fo͋o@(!DMv(`i)* !^#V+$p!^lov(`i! 9s#ry((×(ͫp &&'''(!9^#V! 9~#fo{o(!C!0ͭ9!9^#V.)%This file was not created for MITE version 2.7,And so cannot be modified using this program. : ^M-o! !9^#V)* !^#V+$p!^#V!!9^#V)* ! ^#V!^8!9-o!S!9Js!*!9os!9s)!!9os!9Js!9DM!9^#V!^#Vos!9^#V!^#V͈s*!!9^#V!^#V!Js!osPYDM!9^#V!~#m*!9^#V! ^#V!A*DM!9^#V! ^#V!UJs!9^#V!~#ʲ*!9^#V! ^#V!*DM!9^#V! ^#V!iJs!9^#V##~#*!*!*DM!9^#V^#V"!@L7^M-o!9^#Vos!9s#r!9^#Vos!9s#r!9^#V!DM8+`i#DM#`i!9~#fo!9~#fo͌oʭ+!9^#V!9^#V͈sª+!9^#V!9^#V͞s!!9^#V`is!9^#V`i!9~#fo,+!!9^#Vs!9^#V-o!C!0ͭ9!!9^#V)* ! ^#V!E!9^#V)* !^#V-J-!#!͊EJ-!!͊EJ-*p5V-J-:o&7!Tq:o&|j,!NÂ,:o&lo,!OÂ,!E!Tq!B!1ͭ9:o&|ª,!K-,:o&loʿ,!O-,!R-`E!C!1ͭ9J-!#!͊EJ-!*) !^#V͊EJ-!#!͊EJ-! !A͊EJ-ͫp ,,%,5,E,,,, -J-oneddven-o! 9N#Fm-`E-o! 9~#ž-*0!|–-!}27!!0}26!!6!*8!#":!*0!|³-!}27!!6!"8!*0!#"0!*8!+"8!! 9^#V! Rom-*0!+"0!! 9^#V! o0*8!#"8!s*:!-o! 9^#VMr!DM.`i#DM`i p>.`i)..`i lo.!A!"!C!0ͭ9!.!!78!!E*9! 9^#Vos:Ro&:ͦo 9! !9^#VC9>9!!9^#VC9! !?9C9@L7-o!=!9^#V))))))s! 9^#V!9^#V))))))͵s!9^#V))))))os!9^#V))))))s-o!!Tq!9^!Tq! 9^!Tq[ác[c͏! 9^#V*=s*=*-Bc*=#"=! 9^#V͏!9WdͭSLY!9͉})*?^#V)dnf|Qd##DM!9Nd!`is d͏! 9^7L!!!L!L!L!!!L2!2Lq!qL2^#VSites page #KdK͏-o*:|m;!":!"!!!!i:r!3=!j:Js!i:!Tq{ol;!_j"9!!!i:*9r*9!"9"!"9*:|¿;!":!<"!9!Tq!!!!i:r!?=!j:Js!i:!TqDM;!9!Tq!i:!TqDM`ilo;!"*:+":#|!! s#r*:+":E>*#"! _j*s#r**^#V!s#r*^#V"!*s#r! 9^#VF>*s#r!*##s!*###s#r!":-o!_jDM!`is!! s!! s#r! 9^#V! s#r`i ! s#r!! s#r!! s#r!õ>#! 9^#V#^! {o?ͦo?|>! 9^#V#^ ?! 9^#V#^͢t#+sî>!u`i-o!!9^#Vs!!9^#V! s!!DMW?`i#DM`ipʌ?!Tq!9^#V!Tq!R?!"|?!9!Tq!9^#V!Tq!"!9r-o!!29^#Vs!!!29^#V!9r!!'9s!DM!!%9s#r@!%9~#fo#s#r!%9^#V!pM@!Tq!9!"Tq!PYDM @!!!9!49^#Vr!9!Tq-o*9)~#ʌ@A×@*|—@:!DMä@`i#DM`iͦo@!!Tq|@@!!!!ͫp @ @@@ @@ß@!-o*9)~#sA!C!0ͭ9!C!1ͭ9!*9)^#V!8*9^8!9*9)^#Vl!*9)s#r*9#"9͋oʊA!"9-o! 9^#V)~#ʸA! 9^#V)^#Vl!9^#V!9^#Vos#_j!9^#V)s#rJs!"9-o!C!0ͭ9! 9^#VÍC!C!4ͭ9!!Tq!:`E!!!78!"!B!4ͭ9!C!1ͭ9!!Tq*|ʰB!ÉB#ͦoʰB!3!C!^8!9ÂB!"!"!B#͌oB!2!C!^8!9B!2!C!!^8!9!2!C!!^8!9!2!D!!^8!9!2!DD!!^8!9!2!FD!!^8!9!2!HD!!^8!9ͫpBIBqBBBACC Use the up-arrow and down-arrow keys to move thedarkened bar to your choice. Then, press theright-arrow key. To exit this menu, press ESC -o*DM!*)^#V##^#VͦoD#+E!C!0ͭ9! !Tq!B!0ͭ9!͊ErD!B!1ͭ9!B!0ͭ9!*E! !Tq!C!1ͭ9`iͧo]E!C!0ͭ9!!^E`i+DM#^8!9!B!0ͭ9!^8!9E -o! 9N#F`i~ʉE`i#DM+^!TqlE-o! 9N#F!9^#V+#|E`i^zE! !TqE`i#DM+^!TqàE-o!!Tq!=!Tq! 9^! !Tq!9^! !Tq-o**loyF*+"|LF*"*~#_F*jF*^#VhH*+"F**loʦF*#"*^#VhH*#"F!B!1ͭ9*hH!C!1ͭ9JD*"! 9^#VhH*#"!C*L-o!C!0ͭ9!DMG`i+DM`iͧo6G!!_H!^8!9 G!B!0ͭ9!DM!*###^#V*`i{oʴG!C!0ͭ9!!aH`i#DM+^8!9!B!0ͭ9!^8!9ZGͧoHE!C!0ͭ9! !Tq!B!0ͭ9!+#^8!9ôG!C!0ͭ9!cH78!B!0ͭ9!E! !Tq!<hH -o!+9~#‚H!<!+9s#r!+9^#V!~#™H!"!+9^#V##^"*loʼH!ÿH!"!B!0ͭ9!+9^#V"*###~#H*###^#V!9JszI!:!9Js!9osDM*0`i!9s*{okI!/`i!9#s*0`i!9##s!`i!9###szI!`i!9#s!9os!̀pRo!!9s#r!!9^#V!ͦoʶI!!!9s#r*!E! !Tq!!Tq!B!Tq!3!Tq!!9^#V+!L͊E!9`E!9os!!9~#fo!̀p!L͊E!!Tq!C!Tq!3!Tq! !Tq!!L*!^8!9!!9s#r!!9s#r*~#J*{oJ!:"!"!9~#fo#s#r!9~#fo#s#rJ!"*^#VJn f |,K!9^#V)s#r!9~#fo#s#rJ*ͧo|K*##^!{o|K!9^#V"!:!9^#V)s#r!9~#fo#s#rÂK!"!9^#V+"!9^#V! ͦoʿK!!9~#fo#s#r+)s#rÎK!DMK`i#DM`i ͦoK!BLK-- Previous sites --++ Next site page ++ -o*!9^#V!E!B!0ͭ9! !Tq!9^!0ͭ9! 9^#V)~#‚L!!L͊EâL!!9^#V)^#V##^#V͊E!B!0ͭ9! !Tq No help here.To run MITE for a particular site, press RETURN. You may make changes before actually going to MITE.For instructions on how to use AUTOMITE and MITE, press RETURN. To view the next screen, press RETURN.The SOURCE is a major information utility. It features electronic mail, bulletin boards, conferencing, stocks, news, online shopping, and over 1200 other services. Sign-up kits are available at Computerland and B. Dalton's Bookstores, or contact the Source at (800) 336-3366.Compuserve Infor- mation Service is a major information utility. It features electronic mail, bul- letin boards, a CB simulator, online clubs (SIGs), news, stocks, downloadable software and main- frame programming services. Sign-up kits are available at Computerland, Radio Shack, Sears, and B. Daltons, or call CIS at (800) 848-8199.NewsNet is an online collection of num- erous newsletters covering a variety of topics such as: computing, grants, business, IRS, office automation, media, taxes, banking, etc. Cost depends on which newsletters you read, and is less if you are a subscriber to the 'hardcopy' version. To subscribe, call (800) 345-1301.Dialog is a col- lection of online databases covering a wide range of topics such as ads, books, microcomputers, career, government, science and education. To sign up call (800) 227-1927, or (800) 982-5838 in California. A sub- set of Dialog is available as Knowledge Index at lower cost, primarily for home use at night.Dow Jones News Ser- vice is a business news and financial database. It features news and data on thousands of companies and their stocks. To sign up, contact your nearest Radio Shack, or DJNS at (800) 257-5114 or (609) 452-1511 in New Jersey. Much of this data is also available via CIS or the Source.The Official Airline Guide has information on both passenger and cargo service on over 600 airlines in the US and abroad. Available data in- cludes take off and arrival times, inter- mediate stops, type of aircraft, and the number of flights per week. To subscribe, contact OAG at (312) 654-6000.These are special options that allow you to clear old or unused sites off your system, change the site name, change the values set up for a site, or run MITE directly.This will allow you to change the name of the .PAR (parameter) file for a site. Use 'modify' instead to change the site description. Position the lit bar over your choice using the arrow keys. Press RETURN.This will let you change the values known for a site.This erases old, out of date, or unwanted parameter files.This will take you directly to the MITE program.This allows you to set up new sites. Do not give a site name which has already been used. See the rules for naming files in the KAYPRO user's guide.Select this option when the values shown are as you want them.You may enter anything here to describe the site.The phone number can be up to thirty characters and digits.The baud rate is the speed at which your Kaypro communicates with the remote site. Valid rates are 110, 300, 1200, 2400, 4800, and 9600. Kaypro internal modems run at 300 baud.This selects the character size and parity. These values refer to the site. To enter this, put in a 7 or 8, for number of bits, followed by N, for no parity, E, for even parity, or O, for odd parity.Enter the password exactly as it was given to you.The user code tells the computer you are connecting with your account number. Enter this exactly as it was given to you when you acquired your account.To save any changes you have made and go to MITE, press RETURN or the right arrow key. MITE will automatically dial the number for you.To save the new information, press RETURN or the right arrow key . ESCape will take you back to the main menu without saving the file.Enter the password you received when you subscribed to the SourceThe Source may only use Telenet.Enter the user code you received when you subscribed to the Source. Enter the machine number you received when you subscribed to the Source. Enter the password you received when you subscribed to Compuserve. Compuserve may use either a direct connection or TymnetEnter the user number you received when you subscribed to CompuserveEnter the password you received when subscribed to Dow Jones. Dow Jones may use either Telenet or TymnetEnter the password you received when you subscribed to the Offical Airline Guide.The Offical Airline Guide may use either Telenet or TymnetEnter the user number you received when you subscribed to the Official Airline GuideEnter the password you received when you subscribed to Newsnet Newsnet may use either Telenet or TymnetEnter the user number you received when you subscribed to Newsnet. -ob!9s#rzK_!9^#V!^#V!9s#r!A!a!!78!B!0ͭ9! !Tq!9^#Vh! !Tq!?!Tq!!9s!B!4ͭ9!9&!ͤ5!C!4ͭ9!9^z`!9^͌tY{o`* +" !!9^#Vs!9^#V!Tq!<! 9s#rb`! 9^#V!^#V! 9s#r! 9~#a!! 9s#r! 9^#V^#V!9s#rá`!9^#V! ^#V!9s#r!9~#a!9^#V!^#V!9~#foloa!9^#V#^!{o`!! 9^#V!s#r! 9~#%a!9^#V! ^#V! 9^#V! s#r!9^#Vl!9^#V! ~#±a! 9^#V!^#V!9^#V!^#V!s#r! 9^#V!~#ʑa! 9^#V!^#V!9^#V!^#V!s#r*+"! 9^#Vl!9^#Vl!9^#V! ^#V!9^#Vs#r!9^#Vl!9^#V! 9s#rÌ`M`Are you sure you want to delete -o!!n!9r!A!!<!9s#rXb!9^#V!^#V!9s#r!9~#b!9^#V^#VBK{b! ^#VBKxʿb`i~#rb`i)!9s#r#+!9&e7lobrbCb+!! 9s#r!B!0ͭ9!9&es@!9s#rzcb!9^#Vâd)! 9^#V!! ͧoVc o#ͧoVc!d! ̀pͦoʾcloʄcþc!6ͧoʾc! ̀pͦoʻc!6Îcd!̀pͦocd!ͧoc!d!9^#V͌t!9s#r#!9s#r/d!9~#fo#s#r!9^#V{oʟd!9^#Vͧo]d!!9s#rÜd!9^#V)! 9^#V!^#V#^͌t!9~#foloʜd!9^#Vßd dd!c!d^#V!ccccYcccc!cccccccYccccccccc! 9^#V{o"e!C!0ͭ9! 9^#V!9&e! 9s#rb-o!9^#V! Ro $p##!9^#V! oE!9^#V)! 9~#fo^#V!^#V#!DMÇe`i#DM`iͦoex§e#+^÷e#+^͢t!TqÂe-ob!79s#rze!A!C!0ͭ9!h!!78!B!0ͭ9! !Tq!79^#V!^#Vh!9s#r! !Tq!C!0ͭ9!h`E!!9s!B!4ͭ9!9!9^#V!!ͤ5!C!4ͭ9!9^z¤f!!!!9r!9!DMf`i#DM`iͦo g!9^`iͦof#+^͌tf! `i!9sf!h!9Js!<!39s#r>g!39^#V!^#V!39s#r!39~#ʻg!39^#V^#V!59s#rrg!59^#V! ^#V!59s#r!59~#ʸg! !9!99^#V!^#V##͈sµg!h!!78e]g)g! !9!'9r! !99^#V!^#V#!9r!9!Tq! !%9!;9^#V!^#V#r!!99^#V!^#V#!;9^#V##^#Vr!!99^#V##^#V!s!79^#V##^#V#yh#~ʑhn&͢turhChange to what? PARThat name's already in use!-o! 9^#V#DM!h#ͦoi`i^! {oi`i#DM+^!Tqhs#r**^#V!s#r*^#V"!*s#r! 9^#VF>*s#r!*##s!*###s#r!":w=!=DM!`is!! s!! s#r! 9^#V! s#r`i ! s#r!! s#r!! s#r!õ>#! 9^#V#^! ͮ<?9?|>! 9^#V#^ ?! 9^#V#^1+ o o o o o-o!9^#V!pj!!9s#rn*Oj!OjDM~#\k++nf!9~#fopNknf!9~#fòppjnf`is#r!9~#fo!9s#rnf++!9~#fòp!9^#Vs#r!9^#Vsrnf!9~#fo##s#rs#r!9^#V`is#rDM^#VÍj!9̀p!9s#r!9^#V!9~#fopʢk mŸk!k! Tq!j!9^#V++s#r!9~#fo`is#r!9^#V##&r`i^#V+DM!! s#r`is#r## Out of Memory $-o! 9^#V++DM!Mj##^#Vz m++PYpm`i##ut##! s#rOj{oʳl++nf##PYloʳl`i^#V##~#fos#r##utDM`i^#V`i##lom##~#l!! s#rmnf##`i~#fos#rnf! s#r!%l-o*[j,o*Yj,o*Wj,o*Uj,oNpNpNp-o*Uj! 9~#fo{om*Wj! 9~#fo{om*Yj! 9~#fo{om*[j! 9~#fo{om*Uj*]jloʡm! 9^#V"Ujm*Wj*]jloʼm! 9^#V"Wjm*Yj*]jlom! 9^#V"Yjm*[j*]jlom! 9^#V"[j-o!DM*Oj++nnf++##~#)nnfPYDMn!9òpPY-o!DM*Oj++bnnf++##~#ʇnnfPYpʄnnfDMWn!9òp!9s#r!9^#V`ipʾn!9^#Vn`i-o*Oj| o!&r!9s#r!9^#V##"Oj!!9^#V##s#r!9^#Vs#r-o!changes |g}o|/g}/o^#V#DM!99`i,o|z2oo:oo&zo&|o}|>o&|o&z2oo:o2o))o#}o|gp :o=2oo}:o=2oo}DM!>))4p =,p}}/o|/g#}|ʅovo|g}o{_}p|p|7g}ocp{_}p)xp}}o|gN#F# N#F#zڡp{ҥp##^#VBK^#Vzp#yp###óp#xp#~#fo}|>?o&}|>o&{_}p|g}op|g}o~# x q!9o~#%q!2q|t* CqqWqq*oDM*oo&quqo&q*o*+++*oDM*o!9N#F#^#Vkb6#> 6 #= q>6#=©q : >q Ar[q@qar{r`w# .qrqrw#q{o|g rrw#r!!|a{ !9^#V*:q!9}|Hr*:q":q|!-o! 9N#F!`i^!-lo{r`i#DM!Îr`i^!+loʎr`i#DM!`i^ztr $p`i#DM+^Ôr|r҅ͦU~2RB#ž(BsB ͳͳ*i A[ ͳIͦͳ;!k BB ~2=B#~2>B#~2?B#~2@B#~2SB# FB~# : !b &ͦͳ! B ! GvT K@1b! "im2m! "iog7>͗INSTALL v2.8K - Mite Installation Program - Jun 28, 1984 Copyright (c) 1983,1984 Mycroft Labs Inc. $Syntax error in command $Illegal file name $Invalid option $Writing installed version to $ $ *** Installation Aborted *** $ MODEM SELECTION MENU - PLEASE CHOOSE ONE OF THE FOLLOWING INTERNAL MODEMS --------------- 1) Kaypro Internal Modem 2) Data Solvers 300 AD 3) Data Solvers 1200 SMT EXTERNAL MODEMS --------------- A) Anchor-Signalman Mark VII B) Anchor-Signalman Mark XII C) Bizcomp 1012 D) BYTCOM 212 E) Cermetek 212A F) CTS 212AH G) Datec 212 AD H) Hayes Smartmodem I) Incomm 212 J) Novation Smart-Cat K) Novation Smart-Cat PLUS L) Novation Auto-Cat 1200 M) Novation J-Cat N) Prentice POPCOM 1200 O) Prometheus PRO-MODEM 1200 P) Racal-Vadic 212 Q) Rixon 212A R) Toyocom 212 S) UDS 212A/D T) U.S. Robotics 212 U) U.S. Robotics Password X) Other Smart Modem Y) Manual Dial Modem Z) No modem - Direct Connect Enter modem selection: $12H3ABCD~ EF GgHIJKL M! NOP@ Q_ R~ S TUY Z ? ^NU 0^M^NP 44^M XY^ND ^Q^MDATAT DAT D%U 1,D ^E^MO^M16^M2^M^MI^M^E^MD^MQ^M^MQQ^M^MDOG0OG0ENDDTMITE/U.COMMITE.COM0123456789  KAYINT.HEXKPRO484.HEXDATASOLV.HEXI O !>ͳ  ͦ7 wx# !,>K M ͦ7~ j ͦ7# x PY4 T] j ͦ7PY<F 0 ͦ7T]vX  ͦ77?!<>ͳw  ͦ7  :w 2 2 2 2* " *w#"!5² : w v  ͦ7 7?*+ ͦ7222V}Unable to open input file $Unable to close input file $Unable to open output file $Error while writing file $Unable to close output file $Unable to open hex file: $Error while closing hex file: $Error while reading hex file: $EMULATE OVLJ. Bayt! B "@̓ڋ ͒ / >͗*ʅ Y~ 2@A* * <: o:@_* {ͧH:@͗ͳ! 4$ ͗ͳ@<͆ ͦ Y - Display Next Page * - Do Not Change Actual Terminal. Enter Option: $͆!H' ͦ&?ͦ Manufacturer's name: xxxxxxxxxxxxxxxxxxxx $ Y - Display Next Page X - Exit to Previous Menu. Enter Option: $yͦ Emulation Module vx.xx Copyright (c) 1984 DISCO-TECH. $ͽڋ >͗X$ Y*2@A <:  o:@_{ͳH :@͗ͳË ! 4*@DM@qlͳͳ@]ͦͦ7 IS NOT VALID.$! @7#q1د2@*@"@ڻ:@‘!@:@2ڑ@!@MÑ1د2@*@"@!@H͸@!@ M@72@!@@w#@2@@2@@2@ɷG*@͸ 94*X*@m"@~ͦͦ7 INSUFFICIANT MEMORY FOR OPERATION. $ Press any key to continue: $: ,:@2 xy @2: G:@xͧͦ >ͳ> >$2:  ,:@?2 xy@2:  G:@xxͳ ͦ >Cͳ>A x - xxxxxxxxxxxxxxxxxxxx$=*@ é~G# ¸7ɯ}o|g!)w#< >͋ @ɯ2@! @ @!@>ͳ>2@6@@D72@!w#O^iog"@i`i)|! ʗ! wy! w!*6#6!'6!,w! 6! 6!*6#6`i)|!&w!'6!$q#p!*~# &7!(N#F p+q!*N#F p+q2!,~>77!,w! 6! 6!*6#6`i)|!&w!$q#p!(q#p¬ͦ¬2cADisk Full - Job Aborted $ր:k_k=p=_k=2  :cA<2cAk!cA4 )2cA> _k=pk!*~#fo)|!&Sp!(N#Fp+q!*N#Fp+q7!,~‘>ˆªͦUnable to Close - Job Aborted $~###6####! "eA2vA2wA!eA=, w#:eA :eA.#:fA< ~##6#~#N#F^>2vAgA>mm>2wAgA>=2dA=~ʗ,ʗ:dA=2dA~`i:vAʰ!gA:wAgAͅ}|~##~#~####7կ > ~ #>  ~#:i"xA!O#9yT#~2*xA^~*xA.ʏ =*†>?! ~# =*»>?š7CONRDRPUNLSTNUL6<@͗>:͗ ͗x>.͗2րO!B ~#͗)CON:RDR:PUN:LST:NUL:ʻHʻ0:v0ÂAG7))))oY_$͗æ> ͗> ͗~#a{ G|}x+++*0~#!'~2րڊ…!$N#F>x!(q#p?   o& ##6 #6 !*w#6>!&~2~A!$N#F!(q#p!"|A "zA*zA!'w*zA "zA*|A "|A!~A5¬*|ADM!*q#px>! ~2A! ~2A!$~#fo"A"A!,F!*~#fox= )|2A2AʌW2 B[=_*A{kͦ*A "A!A5[: B_!*6#6!$N#F!(q#p!,~`2A:A! >2A! ~2A:Aw! ~2A:Aw*A"A:A2A`Ae*AAe#%"A!A5:A`! :Aw! :Aw>Disk Full - Job Aborted $ʏÆ0:+BOQD+HV: B}/o|/g#7!2 B+-2 BʻBʻ0)oʻOʻQʻ0)))oʻDʻ0 )T]))хo.$.Hʻ0:v0ÂAG "A!A5[: B_!*6#6!$N#F!(q#p!,~`2A:A! >2A! ~2A:Aw! ~2A:Aw*A"A:A2A`Ae*AAe#%"A!A5:A`! :Aw! :Aw>Disk Full - Job Aborted $ʏÆ0:+BOQD+HV: B}/o|/g#7!2 B+-2 BʻBʻ0)oXXX0000000123456789   * +7GSâÖÄØ!~6e>22222!P"*"}o|g}o"}o|g"!s#r#!9(!*m*+"}o|g"""+++"!t#:g:G/2:O|2yʐ͖M^*|G>>>>G2>>>>A2>>2>>*}!~ƒ6ͅ 9͙MÙʻ*w#*͐Ҹ*"*~#*͐*"!**͐7I 7ɷ>I7ɷL)>07ɷL@57ɷL E>07ɷ7>p _ Wn͐jV 72Kn,X `    %K«H=¹H777$@}>2@m>2ɷH7ɷ}mɷ}m>:2>x/G:2>:2Y>x/G:2>:>:>:2>x/G:2|}:Fʤg9~^¾#~.#̈́ `ì> .~#* ̈́0 > G>>̈́2͘$.#/^KZ.̈́ 9`9u͘ xda{͌„d͘*+|~#¦aabb E H6E6E *** MITE not installed *** Please run the Install program to select computer type. $!91v*z({(6E2H2w2;~2Bw2v2v2v2Hw2w2Pv2Qv>2v2w!"-~!:m2:~:] ʀ!\yq͈A% !,"v>O21~>2v2v2v2v2v2v2v2v:F²>2v>2w2v2v2v:12v:22v:32v:42v:G2v>2v>2v>2v>2v>2v>2v!Iw6# x 2w>2y>2y!y6# + c 8 :v; ̀:vͤ:v͡:vͧ*v͞:1~O>_ >ͪz :Qvz :Pvz Ô ͗D::~ ʙ !:~6 K¢ >2Pv>Gâ B6E;Fq?µ ́Ec BʝHC DF(F` G >2Qvh%H I LD MM O]3Pʂ1SCU>*X} >́Eß ́E͗D *Ev>PE:vc ʹq:v?:   ͗D9I v͐dp6EͷFʹqqXc ́E͗D&6E!yx0~aq6E~ ڗ > ́E~́Eâ >^́E~@́Eʹq#x q V6E;Fq? ` 0 : ́Eʹq0o&ͧGy w` Xc >́Eó !y # 7́E>Ͱ>ͭc ́E76Ev><E:vc G!vwqc ́E_Ac ́E͗D6E>2Aw> ́E:Aw0́E>:́E> ́E:Awo&))))))Kw*Eʹq:Aw<2Aw ^ 6EͷFqʹq?´ M Xc 0  2Awo&))))))IwK6Ev>=E:vM !vO ~  6+:v=2v :vG!vqM "EM !"( !%q!(7 !,q!<AG !?q!0^ !4^ !8q o > >^@Ô ́E6EͷFʹqqYc 2:vy.:v  6EͷFʹqqY >ͭ>ͰͿ r r >2Bw:v G ͼ *Cw~#"Cw ^ *Cw~#"Cw ^@*Cw~ #"CwqE: >2Ew NF 2Ew Wf ! Q ́EW-Q L ~#"Cw 0 !Kwʊ @=… "Cw P¸ ~#"Cw0 § > !d=­ Q T*Cw~#"Cw ^ ~#"Cw 2Fw͉  r r 6E 2/~́EW-:/~͆ ̓20~ ́EW-:0~G:Fw*0 ! :BwW W͌Ij2Bw:He r};FG:vxq2/~!vc !vš>ͳͼ‹>ͳ}!v;F!Kw"Cw! #*Cw@"Cw±>2Bw2Ew}:v:/~!v8}:1~O:v!v:/~>2Hw82Hw}:1~A#:v@:/~́EW- @:v@> ́EW-:/~͆:Bw`:Ew`́EW-@:1~O}:/~ }> ͱ́EW-͉@̓20~@G @:1~Oʼ:vʼ!v:0~¼>2Hw82Hw@:v:0~!Ky"Cw>2Bw2Ew@:v:0~q20~G:vxāEW-:0~ :v:v> āEW-:1~O@:v@:0~ͱ @> ͱ:v> āEW-:>Ͱ>ͭ6E:1~Aʗ%6EͷFc ! 6ʝ6EͷFʹqqYʝ7c$ͱæ͌ڵ͆*6~"8~ r r͉ *8~#|+ͼ+"8~|7̓:vʏ7"6~OFFON HALFFULLNONEODD EVENANSORG{MAIN MENU} G - Go Start Communications H - Hang Up Phone I - Enter Site ID L - Load Parameters from Disk File S - Save Parameters on Disk File Sub-Menus: P - Parameter O - Option U - Text File Upload D - Text File Download B - Binary File Xfer M - Macro Definition C - Command Processor F - Character Filter X - Exit to CP/M {Enter option (? for help):} ${MACRO STRING DEFINITION MENU} $ X - Exit to Main Menu {Enter option (? for help):} ${UNWANTED CHARACTER FILTER DEFINITION MENU} $ X - Exit to Main Menu {Enter option (? for help): }$ n: XXH = $Awaiting Carrier (ESC to abort) ${Carrier Detected} $No Carrier Detected ${Carrier Lost} $Illegal Option ${SYSTEM COMMAND PROCESSOR} Enter command, HELP or ? for details: {Explanation of symbols used:} {d:} stands for a drive name (A:,B:,etc.) {afn} stands for an ambiguous filename, for example: *.ASM, F*.*, etc. {ufn} stands for an unambiguous filename, for example: FRED.ASM, MITE.COM, etc. {$att} stands for a file attribute, which may be any of the following: {$DIR} - make file visible in directory {$SYS} - make file invisible in directory {$R/W} - make file Read/Write {$R/O} - make file Read/Only Type to return to SYSTEM COMMAND PROCESSOR{Command Error} $ Type to continue, X to exit to Main menu:$ Enter new value: $ Enter new ASCII character: $ Enter new phone number: ${Illegal Value} $ {Enter Filename:} ${No Directory Space} ${Filename Error} ${No Such File(s)} ${Unable to Close} $Capture complete. Now closing file ${Warning}... Carrier still present. Hangup (Y/N)? $Awaiting Incoming Call - abort with ESC $ Capture Buffer Reset to Empty $ {Not in Capture Mode, request ignored} $Now resuming previous call $ {*** Capture Buffer Overflow ***} $Transmission Complete $Now Dialing: ${There is already a file with that name.} Overwrite it (Y/N)? ${Maximum Error Count Exceeded} - Try again (Y/N)? $ {Send operation aborted} $Attempting to Synchronize $ Enter New Macro String: ${Receive Aborted} $File Received ${Timeout} {Send Aborted} $File Sent $ Are you sure (Y/N)? $Resuming Link $ {Disk Full} ${Invalid Parameter File} - Load aborted ${Warning}... old parameter file $ Enter Site ID: $Site ID = $nnnnn Compare Errors $The following special characters are available: @W Wait until no chars for 1 second @Pi Wait until no chars for "i"/10 second @Tn Trap on ASCII character "n" @E Turn on wait-for-echo @N Turn off wait-for-echo (default) @Li Link to Macro String "i" (0-9) ^M Carriage Return ^n Control character "n" If Macro String 9 is defined, it will be automatically sent once the connection has been established. If Macro String 8 is defined, it will be automatically sent in response to a Ctrl-E in TWX mode. Abort macro string transmission with ESC Type to continue$Type to continue${Insufficent Memory} $ {Macro String abort} $2> >2y2:<))06EͷF!:O͇6EͷFq2:O!͇:lgyKʹq: E͑2G~ʅ}####m#N#^#V7yO ^#Vy2ҥ06EͷF!~:O͇BK<~4b<~͹b́E÷<~b:6EͷF<~>!j~vb<7ɷ!<~Tm>2<~b7ɯ2!~<~͹bw# x<~b For the interactive help feature to work, MITE.HLP must be on the currently logged disk. - Press any key to continue -$MITE.HLPN 9!t"##$3$T$$$$$$%G% For help on a particular menu option press the letter of the option. For general help press "?" : $ MITE supports a variety of binary file transfer protocols. For more information press the letter of the protocol:$ Help is available on the following topics: A - General use of macros B - Special characters used in macros C - An example of macro usage D - Another sample macro Which topic interests you? $ Help is available on the following topics: A - What does the character filter do? B - How to enter a character to be filtered Which topic interests you? $ Help is available on the following topics: A - General information H - Ambiguous file name expressions B - Copy file I - Reset C - Dir J - Set file attributes D - Drive K - Size of file E - Era L - Space left on disk F - List M - Type file G - Ren N - User Which topic interests you?$ Help is available on the following topics: A - General information H - Menu of additional commands B - Append I - Protocol C - Buffer J - Read D - Capture K - Receive E - Echo L - Screen F - Exit M - Send G - Macros N - Write Which topic interests you?$GHILSPOUDB M C F XP?TTgBDPSRMANIHXS?UEMBKRCLTD Q!XS?VU"D#E$H%T&G'XS?WC(I)A*W+R,P-T.F/Q0S1XS?XP2S3R4XSCZ?YC5H6I7M8T9X:B[A;B<C\D]A=B>A?B@CADBECFDGEHFIGJHKILJMKNLAMB^CND_E`FPGaH IbJcKdLRMeNf?gVhBiCjNkMlHmIn͗D:v+ ҏ%5:v6E>Ͱ>ͭ::1~O&>ͪ*v͞6E>Ͱ>ͭ͹͛% rʷ% rc ÷%>ͭ>Ͱ>ͪ& rѷ& r&>Ͱ>ͭc ͹z%>ͭ>Ͱè%͹:v:'6E̓̓̓!'"*^#V#"z:&͞"v@&!'ڗ% z&͉@&̓n&>2Hw H6Ew*Eʹq:vʪ&;(:vaqA(c  (6E2Hw> ͱ́E> ͱ́E::w<2>ͪ>Ͱ>ͭ>Ͱ!H~ &#& '͹6EH*Eʹq!HͶ6Ez' rѷ-' rm'dͼ yH'͉0'̓́E0'z'"E>Ͱ>ͭ!5c ͹&>Ͱ>ͭc >Ͱ͹6E:v²'!y~: :"Cw>2Bw2Ew͹: ͹>ͱ!'́E'ʹq!>2yã*,X` %Incoming Call Answered -- Detecting Baud Rate $Remote Trigger Character = XXH = nn $́E͗D:v/ :w:/ :v/ :v/ :v0aq:v 0c :v+0aq:v10c .6E;Fq?°(́EF(C*)́E:v#):v)6Ev>PE:vF(!v|Tm(,"EF(|!-|>jF()"EF(>2v!"-~>2vF(2vF(I?)́E:w2wF(FT)́E:v2vF(Pi)́E:v2vF(Qz)́EͧG2vF(R‘)́E!"-~"EF(S¢)́EͧG2vF(W´)́E2y.F(A)́E>2y.F(T(*́E>2*-~DM!yOxGx*~#́E *:<2*>2ͷF*F( )ʹq6EͷFF(Xc >́EÚ("EF(́E͗D:v0 :v0 :vC1p:v1aq:v$1c :v0po06E;Fq?–*́E>*U“,́E>2y!"!:y*6Ev>PE:v>*!vyTm*,6EJ-y!z>vb*?6EJ-2:Hw22Hw r+ r\,͉D+̓D+! ND+3+!y͹b\,2/~:v_+:/~2/~:vn+:/~ +:/~ †+:> †+> ͱ> :vGʖ+ͼÌ+G:vxq2/~ͱ>2:v+:v++\,+!/~+*#"+:/~́EW-:/~ +2:v,,\, +> ́EW-:v6,! N6,́EW-!v#,!:v2: +=2B,́EW-B,:2Hwyb:vʁ,*T qʹqT6E:2Hwʹqy6EJ-G,́E6Ev>PE:v>*v~qA-|A-}2v>*T,́EͧG2v>*D -́E6Ev>PE:v>*v~qA-|A-}2v>*E-́E:v2v>*H4-́E:v2v>*Xc >́EÀ*"E>*!2Hw::vd-q:vw.*-~Î-w.w.w.w.w.w#"-~*}o|g«-R6E2v>:2|->*2:vc.*-~*r|c.-}c.:vͱ!,. -20~́E*-~w#"-~*|.}.R6E2v:v-:0~q-*-~}O|G|!xL.~͍c# >.!"-~!:vͱ w.:ww.:́E:v‡. "E*-~}O|G!|xʧ.~͍c# Ù.:.|9d.S"Eg6E|wpʹq ͹2v2v!"-~{TEXT FILE DOWNLOAD MENU} C - Capture Mode = XXX I - Capture Indicator = XXX A - Append Captured Data W - Write Captured Data R - Reset Capture Buffer P - Printer Echo = XXX T - Type Capture Buffer F - Flow Control = XXX Q - Flow Start Char. = XXH = NN S - Flow Stop Char. = XXH = NN X - Exit to Main Menu {Enter Option (? for help):} ${TEXT FILE UPLOAD MENU} U - Upload Text File D - Interchar. Delay = XXX E - Await Char. Echo = XXX H - CR/LF Handshaking = XXX T - Turnaround Char. = XXH = NN G - Garbage Char. Count = XXX X - Exit to Main Menu {Enter Option (? for help):} $́E͗D*vN5 q:wo&v qv!6w#w:v72p5:v5- !H16q!l6q!g6 q:v5L :v125:1~5< 56E;Fq?2Â1Xc BH2́E6Ev>PE:vʂ1v~qT3͞T3"vÂ1D`2́E:v2vͤÂ1Mu2́E:v2vÂ1NŽ2́E6E!H4Â1Pª2́E:v<ڡ22v͡Â1S2́E:v2vͧÂ1R2́E:1~A2>A21~Â1>O21~Â1H2́E76E!g 4Â1I3́E66E!4Â1AL3́E86Ev>PE:vʂ1v~qT3|T3}T32wÂ1>́E1"EÂ1́E͗D:v8 :vM7aq:vS7c :vr7aq:vx7c :v7aq:v7c :v7aq:v7c :v7aq:v7c :v(8 :vH8 :vh8 :w8  76E;Fq?4́E]3Xc C 4́E:v2v]3E44́EͧG42v]3MH4́EͧG42v]3B\4́EͧG42v]3Lq4́E:v2v]3T†4́E:v2v]3Kš4́EͧG42v]3R®4́EͧG42v]3D4́E:v2v]3Q4́E:w2w]3>́E3"E]36Ev>PE:v56 #5!v~5#5{PARAMETER MENU} B - Baud Rate = XXXXX D - Data Bits = X P - Parity = XXXX S - Stop Bits = X R - Role (ANS/ORG) = XXX M - Mode (Duplex) = XXXX A - Auto Redial Count = XX N - Phone Number = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX I - Modem Init String = XXXXXXXXXXXXXXXXXXXX H - Dial Prefix = XXXXXXXXXX X - Exit to main menu {Enter option (? for help):} $ Enter initialization string: $ Enter dial header string: ${OPTIONS MENU} E - Escape Trigger Char = XXH = NN M - Macro Trigger Char = XXH = NN B - Break Trigger Char = XXH = NN K - Local Command Char = XXH = NN R - Remote Command Char = XXH = NN C - Caps Lock = XXX L - Auto LF after CR = XXX T - TWX Mode = XXX D - Direct Connect Mode = XXX Q - Expand Tabs to CON = XXX X - Exit to Main Menu {Enter option (? for help):} $ Enter Auto Redial Count: $F=:Hw8a=6Ev>PEKE:vʹq!g9v C9C9q#O9yP9##~ 99v͐dʹq> #OC9(9[9 P9~#fo^6ECAPT+;APPE;WRIT;ECHO;EXIT!;MACR;READE:v!v:Tm;!(>vb;?"E>́E>2H,6E:Hwz `9qO`9qFC;2vN`9:vœ;6Ev>PE:v!v|Tmv;,6E|!-|>j‘;6E>2v!"-~>2vɯ2y.>2y.qO`9qF;2vN`9>2v!Iw#~#:́E> ́E~́E# ;ʹq@x ;ʹq>2yʣ*yTmң*,6E>2yʍIyTmҍI,6E>2y JyTm J,6E}=6EͷFqSŠ<ʹqʹqZA͐dLœ<ʹqʹq=6E?ª< ʹq>́Eʹq*-~}o|g;A q*}o|gHA q A6E:~q`9}2:=2<qO`9qF=2vN`9>2vqO`9qF;=2wN`9>2w {Local Command (or ?): }$ {Remote Command (or ?): }$Enter L for Local command options, S for System command options, ? for detailed descriptions : $ECHO ON Turn printer echo on ECHO OFF Turn printer echo off CAPTure ON Turn capture mode on CAPTure OFF Turn capture mode off CRC ON Turn XMODEM CRC mode on CRC OFF Turn XMODEM CRC mode off APPEnd Append capture buffer to file WRITe Write capture buffer to disk and close READ ufn Read disk file and upload it PROTocol Check/select binary protocol SEND ufn Send file using current protocol RECV ufn Receive file using current protocol MACR List defined macro strings BUFFer Print capture buffer statistics SCREen ON Allow incoming character to display SCREen OFF Disable console on incoming characters USE ufn Get "console" input from file EXIT Exit to System (Local command only) $Number of bytes captured = nnnnn out of nnnnn available $HELP6Ev>PE:v7!vyTm҈A,"E7:y ›A!Dyqy!z>vb¶A?"E7y͹bMA"E7͹bG>A"E!͹bw#A͹bg͹bo"v͞͹b2v͡͹b2vͤ͹b2vͧ͹b2v͹b2v͹b2v͹b2v͹b2v͹b2v͹b2v͹b2v͹b2v͹b2v͹b2v!w<͹bw#aB͹b2v͹b2v͹b2v͹b>OʇB>A21~͹b2v͹b2v͹b2v͹b2v͹b2v!y ͹bw#­B͹b2v!g ͹bw#B!Iw͹bw# xB!H͹bw#B͹b2w͹b2w͹b2w͹b2wb́E6Ev>PE:vc !vyTm6C,"Ec :y IC!Dyqy!z>jc hC"Ec y>M͍c>͍c!~͍c#€C*v|͍c}͍c:v͍c:v͍c:v͍c:v͍c:v͍c:v͍c:v͍c:v͍c:v͍c:v͍c:v͍c:v͍c:v͍c:v͍c!w<~͍c#C:v͍c:v͍c:v͍c:1~O>D>͍c:v͍c:v͍c:v͍c:v͍c:v͍c!y ~͍c#:D:v͍c!g ~͍c#ND!Iw~͍c# x]D!H~͍c#mD:w͍c:w͍c:w͍c:w͍c9dc PAR ECE H6E:vʰD!HüD!HڼD!HDHq*-~}o|g^H q*}o|gdH q:vuH DH6EKE|H6Ew*Eʹqʹq! F# E~#́EE6EùSE*E$SE6E>{SE>}SE{cE:Hw!:pE}E:Hw!@F#~́E#sEG:wxʥE ¥E> ́E:;~•EE ±E!;~5ûE »E!;~6Or!;~4:HwE:vE:5~EEͱO;F25~ }FFE ͋FE+FE ͣFE;F>#́EʹqMFQFMF͋FAFEsF>#́EʹqH oFͣFcFEͣF Eʹq25~x͑F >́E> ́E>́E ҁE>^́E@́E;F́E:BwF £G:HʄG͹brG F@HG͹b@ZGqDG͹b0 FFO ͹ GMF͹b0 F@!Kw2BwF^ZG͹brG^ZG:vnGGnGͼdGãG>2Hb rʣG rʑG rãG:HwʄG͉҄G̓6Ev>PE:v G^G:vG0G:Gv~q}ɷ rG rH;FH͉H̓G7HMITE v2.75 - Copyright (c) 1983, Mycroft Labs, Inc. $XXXXXXX. Bytes Captured = nnnnn/nnnnn. Capture = XXX. $Site ID = $DIRECT ONLINE OFFLINÉE͗D:vo&)))MKq:wK KK6E;Fq?H́EÝHCH́E:w<2wÝHPƒÍEʹqL6EͷF ʝHq?IHʹqC,I>2vÝHH9I>2vÝHIFI>2vÝHMSI>2vÝHT`I>2vÝHXmI>2vÝHBzI>2vÝH"EÝHSJ>2y/K:v£I>2CMI²I24~TII>24~TIIEXII.ZII,]II>2CMI2Hw6E:R}J>2y/K:v J>2CcPpJ/J24~͚UpJ?J>24~͚UpJJJOYpJUJ[pJ`J_pJpJ>2CcPpJ2Hw6E:X…Jc >́EH/KL6E;Fq?«JÍJ ʴqCJ́Eʹq>2vHJ́Eʹq>2vIJ́Eʹq>2vMJ́Eʹq>2vTḰEʹq>2vXḰEʹq>2vB'ḰEʹq>2v>́EÖJ:vo&)))MMqtM6E{BINARY FILE TRANSFER MENU} P - Protocol = XXXXXXXX C - CRC option (XMODEM) = XXX S - Send File and Return to Link R - Receive File and Return to Link X - Exit to Main Menu {Enter option (? for help):} $Now Sending $Now Receiving $All Files Sent $All Files Received $Checksum Error $ X - XMODEM (Single) B - XMODEM/B (Batch) C - CLINK & Crosstalk H - HAYES (Smartcom) I - IBMPC Async M - MITE Multi-file T - TEXT (mainframes) Enter new protocol code or CR for no change (? for help): $Unknown message type $Current Protocol is: XXXXXXXX $XMODEM CLINK HAYES IBMPC MITE TEXT XMODEM/B>2F:yN6Ev>PE:v9v"-Fn6N,6E:v2(:v2):v2*>ͤ>͡>ͧ2yy9"-o*-"+IN?6EOXS:Hw2>2Hw*+~Oyq"+y!z>vb:CP/6E>dRO>2/4L6Eywp:FS6Eʹq rN rN>ͱOy!0͹bڜOw#N:/<2/>26>ͱ:/ͱ/ͱ>2E!"G!0~ͱ͡S̓S#O:F"O:Eͱ-O*G|ͱ}ͱ!'FOʃO>T́EcOSO>.́EëN‘O>ŔE҈O:6<26 N6EͷFʹqqYN>ͱ6EOʈOͫSN>2=ʹq!':=ͱҿOڪOOªOybS6EVN:CO>dR>ͱ>ͱ>ͱS6E!ʹq:(2vͤ:)2v͡:*2vͧ>dR>ͱ!y >2E~ͱ͡S7P#.P>ͱ͡S!E>^P>uͱ>2J:w2FwP>C2J:v2(:v2):v2*>ͤ>͡>ͧ:Hw2>2HwXS:CP:yP6Ev>PE:v!vyTmP,6E!ͪRڂRʂRAL6Eywp:FS6Eʹqy!z>c>2//6E>2I:Jͱ!'dQVR>T́E҈R:I<2I#Q>2J>2FT6E#QʁQgR|Q6EgR>6R!6R27/G6R>6R>2E!"G!06Rw͡S̓S#®Q:FQ6R!ECRQ6R̓S6R̓S!G~#CR:7G:/R=.RVRy!0~͍cR6EVR# R:/<2/>.́E>ͱ)QVRͫSVR>ŔE>ͱ҈R)Q>ͱʹqf6EÈRʹqS6Ey9d>ͱ:CPS6E:(2vͤ:)2v͡:*2vͧ!>#Sد2y!y >2E͡SRRw#>ͱþR:Eͱ72D!SSCS:D=2DR6E7>2F2D!:Jͱ=SVS2SC2S:D=2D,S7!I!yg)sS|g}!ogSr$s%# ]S*GO!I ~W$^"G!Ew!ñSFile Sent $All Files Sent $File Received $All Files Received $ - using CRC$Switching to checksum $:yMT6Ev>PE:v!vyTmMT,6Ey!z>vbfT?6E:v2(:v2):v2*>ͤ>͡>ͧ:Hw2>2Hw28>2/:8^U!"2y!0͹bTw#*2#"2 x°TT>28*2|^U rT rT6E^U>29V0WU>ĆESU*8~|U>T́ET::iU9U>.́E:/<3U2/ÚTNU>ŔE:9^UT>ÚE>29VT>29VTybʹq6E!:(2vͤ:)2v͡:*2vͧ:yU6Ev>PE:v!vyTmU,6Ey!z>j:v2(:v2):v2*>ͤ>͡>ͧ:Hw2>2Hw>29 r!V r!Vf6EãV0W/V>ĆEfV*8~|GV:9V>T́EfV::WV>ŔEpVʣVvV>ÚE>mV>29VV*4DM!4yxʛV~͍cҖV6EãV# ÁV>.́EkV>29Vʹqz6Ey9d:(2vͤ:)2v͡:*2vͧ>ͱ!";:9*WW*2|*W}*W:4~W:/*W>*WDM!0~*W# xW>*W*;|ͱ}ͱͱX! MW8W!"8~X!X2:¨WXgXo"4DM:4~ʁW2/XW!4Xw# xWX XXWX_!";::XW*4|X}X:4~W:/X>XDM!4~X# xW>X*;{ Xz XX!7!G*;g)4X|g}o"; AXxG!X:ytX6Ev>PE:v!vyTmtX,6Ey!z>vbŽX?6E:Hw2>2Hw!`/6EҸX/Y"E/Y¤X>ͱ rX r/Yy!0͹b/Y Xw# XX!0͉Y̓9YY͉ Y̓ Y~#ͱ X>.́EX>ͱ> ͱybʹq6E!:y~Y6Ev>PE:v!vyTm~Y,6Ey!z>j:Hw2>2Hw/6E>ͱ!:һYZ>T́EÝYYY6EZ!!0Zw#Z Y>ͱ!0y~#͍c Y> ͍c>.́E>ͱY>ͱ> ͱy9dʹqz6E:yaZ6Ev>PE:v9v"KFnrZ,6Eɯ2yy9"Ko*K"MˆZ>ͱ?6E:v2(:v2):v2*>ͤ>͡>ͧ:Hw2>2Hw̓̓̓!/6EZq[>ͱq[ZZ!'*M~w[y~#Z"My!z>vb>ͱ!y ͞[q[4L6Eywpʹqy!0͹b`[w#<[>ͱ!0͞[q[>.́E4[>ͱybʹqüZ6E>ͱPL6E:(2vͤ:)2v͡:*2vͧ~#ͱO¢[ͱ[[Þ[[>ÚE7:v2(:v2):v2*>ͤ>͡>ͧ:Hw2>2Hw̓̓̓!`/6E\\>ͱ!'\\(\!y \2yy!z>c`\\AL6Eywpʹq>ͱ\Š\6E\ʗ\>ÚE\!0\\y!0~͍c#ª\>.́E>ͱt\y9dʹq \aL6E\>ͱ:(2vͤ:)2v͡:*2vͧ#]w#O\O ]>ŔE>ͱ\\:y[]6Ev>PE:v!vyTm[],6Ey!z>vbu]?6E:Hw2>2Hw2W͈_ڔ^y!0͹b{^ ʑ] ʬ]w#xڑ]6x2S:W02a:SapE_*Oa q!a~ ]>0w#]!ȯ a͝_ڔ^]:S0G͝_ڔ^^> ͝_ڔ^^ڔ^!ȯڔ^qR"^ڔ^q2Uk_ڔ^w_ڔ^^:UAn^:W< c^2W>.́EÃ]Xʔ^>ŔE]>E͝_> ͝_ybʹq6E!:vGʬ^ͼâ^:v^:v^^^7?7:v!^7 ^7?:v_! N _C__́E!v^!:v2T:T@_=2T:_C__́E_7?7!a^_:SG0^_"Ooe_$^_ k_:v |_ rʛ_ r›_7ɷ2V͉__!´_!ȯ:Vͱͯ^͛^:y`6Ev>PE:v!vyTm`,6Ey!z>j:Hw2>2Hw2X!ȯ>R͝_ژa>A͝_ژa> ͱژaw_ژa!ȯ!D"OژaqEʉaDN`͵aژa02W͵aژa }`>00yOOOp`y2S!ژa ¦`>00)DM)) oҶ`$—`"Q:SO!0y`͵aژaw# `6k_ژaw_ژa^ژa*O:Qa:Ra:WG:X勸:a= a> VaØa>R͝_ژa>N͝_ژa> ͝_ژa^ژa>ŔEB`!0y~La#͍c@a> ͍c> ͍c>R͝_ژa>A͝_ژa> ͝_ژa^ژa>.́E:X< ƒa2XB`y9dʹqz6E!ͱ*OoҰa$"Oa*Ooa$"O7?7D >2:*>2>2:*>2>22*>2>22*>2`i)|! Zb! wy! w!*6#6!'6!,w! 6! 6!*6#6`i)|!&w!'6!$q#pb!*~#b6rb!(N#F p+q!*N#F p+qb!,~>b7!,wfc! 6! 6!*6#6`i)|!&w!$q#p!(q#pocsc6Eoc2cDisk Full - Job Aborted $րc©c.d_.d=3d=»c_.d=c c :c<2cc.d!c4 c2c> _.d=3d.d!*~#fo)|!&ds3d!(N#Fp+q!*N#Fp+q7!,~Td>͍cKdsmdpd6EUnable to Close - Job Aborted $"Ì"nj!d6 # d!dd dqw#¬d5eɌ<~d#=d dd!ɌiTm~d#d!yTm!?edO#e ,e##~ e5e;e^#Vj6ECOPY eDIR fDRIVEfERA fHELP ygLIST gREN gRESETgSET gSIZE iSPACEiTYPE ,jUSER ]j!yq!C>vbej6Ei!>ceMk6E͹bei͍cebi9dfbk6EɌf:!f!f!fq2uh*Ì"Ō2*Ō~f ~f*Ō~Sf:<@́E:*Ō ~hf>x́E*Ō #~́Eyƒf> ́E qfGʴq:ʦf> ́E>|́E> ́E*Ō"Ō:<23fʹq/f*Ō"Ō3f:Ĵq*.*:ifDvÁEôq=_:q2h*Ì"Ō*Ō~mgiq:r`g:s`g>2iwp:QOg>?́E> ́EͷFqY]gik6Eʹq*Ō "Ōg:j6Ek6Ei!>vb™gj6E͹bڭgqG™g7vbigj6E!iyFwx# gij6E _ͅjhtk6E:z$:h!@h{qO#h 5h##~h:h^#Vj6EDIRUhSYSqhR/WhR/Ohh*Ì~h ~w\hh*Ì~h ~wxhh*Ì~h ~wÔhh*Ì~h ~wðh*njMDɌ*ÌFnhk6E7ɷh*Ìtj6E7*Ì~iqiiwpʹqhͅj#itk6EɌ8i:@i@i!fq2h!"*Ì"Ō*Ō~iiq:si>2iwpi###~#2~2 *: O :G}jŸi:=ʳi)ëi*"!k q!k6E*Ō "ŌVi:i*>k q0k6Ej6Eͅjitk6EDv2:ij=_͕tj qj6E:_i!>vbEjj6E͹bYj́EGEjôqb:j0pjpj _0́E>?́Eôq|g}o }No such file(s) $All files? $Filename conflict $Attribute error $System Command Error $nnnnnK Bytes Available $Filename Error $ erased$nnnnnk Bytes $Total size = nnnnnk Bytes $No directory space $Unable to close $Not available on this DOS $Available commands: COPY new=old copy one file to another DIR afnx list files in directory DRIVE d: set default drive ERA afnx erase file(s) HELP print available commands LIST ufn list file to printer REN new=old rename file RESET make all drives R/W SET afnx atr set attribute on file(s) SIZE d:afnx display size of file(s) SPACE d: display space remaining on disk TYPE ufn type file to console USER n set user number $կ > *n~"n nm#`m> *n ~q"n#:m"!!1nO#—myʲm#~m*!üm~*!nmnm.m "n="n*m>?*n|m|m&n! ~q"n# "n="n*n>?*n"nm&n7*nCONRDRPUNLSTNUL"i"k6`i"eDv<2o>+2m2h2n!#ʣnO:ny‰n+ʣn-ʣn"™n:n/2nqnw#qno6!#8Tmo:8n:o28n2o2D*eono6E8wpʹqóo2g:m-Lo*eʳo*k~,o# O# o #o####n!n*iw#2o"i6:h<2h*kn*k*e~ʲoʦo# #Oio Ÿo! ~#€o:h=2h*i "iPoUo ~Poo2mkn:h7No files match $"p62r2spq6>2r`pDv2tOp=p_>2s`po&)))))F*pp#w#Cp"p6!r4*p:spp:t_:rpˆpp<@́E>:́E ́Ex¤p>.́E”ppրO!p ~#́E¸pCON:RDR:PUN:LST:NUL:dp ppq py0ů2u'8q8qd8q 8q>2u8q}o|gHq;q zXq:u> ]q02upqpq yq0ʈqqq0 v:گuBfuOʇuQʇuDʯuHu v> ́E> ́E_~#qa{ G|q}x+++*r0~#qqqqqqqqqqqqqqqqq!'~Brրښr•r!$N#F>x!(q#p?   o& ##6 #6 !*w#6s>s!&~2z!$N#F!(q#p!"x "v*vr!'wr*v "v*x "x!z5¼r*xDM!*q#pxs>s! ~2! ~2~!$~#fo"{"!,F!*~#foxMs )|2}2ʜsDv2ks=_*{ʋs{t6E*{ "{!}5ks:_!*6#6!$N#F!(q#p!,~pt2:~! s>2! ~2:~w! ~2:w*"{:2}ptut*{ut#5t"{!}5"t:pt! :w! :w>Disk Full - Job Aborted $##~#2##^#V#"!" OyOt* #" tO*+"|»t* :)=to&"!" !* #" u# u7.uO~q#!u **#"qu *+* #" qt"vvqBv0 v v)oiu"vvqOvQv0 v v)))oÊu"vvqDv0 v v)T]))хoҲu$òu"vvqHv0 v:u0vA vG v7))))ou:v}/o|/g#7!2+5v-2> q> qN#F>x!(q#p?   o& Full - Job Aborted $##~#2##^#V#"!" OyOt* #" tO*+"|»t* :)=to&"!" !!'+.26;?CHPTX[]agkow~ &,247:>BMU\`hjprwx|  !"#$%&'()*/7<CHMPTW\dhjlmqs The G option takes you from the menu system to the terminal mode. If you are the originate system, and you have a phone number entered in the parameter menu, MITE will dial the phone and establish a connection to the remote system. MITE will not attempt to dial the phone if the direct option (option D in the option menu) is on. MITE will wait up to 45 seconds for the remote system to answer. Note that some modems will not wait 45 seconds for a carrier. If carrier is already present and you enter a 'G' command, MITE responds with "Now resuming previous call" and you are placed in the terminal mode. If you are not actually dialed into another system then this usually indicates that the modem switches are not properly set, or that the cable connecting the modem to the computer is not correct. For further information see the chapter in the MITE manual entitled "Modem and Cable Installation." If MITE is set to answer a call (option R in the parameter menu) a message indicating that it is awaiting a call is displayed. The call is detected by the modem answering the phone and raising the carrier detect signal.  The H option can be used to hang up the phone at any time. With some on-line systems, this may be the only way to terminate a session. Not all such systems support a "BYE" or "OFF" command that causes their carrier to go away. If you try to exit to CP/M with carrier still present, you will be reminded that it is still present, and asked if you wish to hang up at that time. Normally, when the carrier is lost, the phone is automatically hung up and control returns to the Main Menu. It is then possible to exit to CP/M. The proper functioning of this option depends on the actual implementation. Not all hardware systems will allow the software to hang up the phone.  The I option allows you to enter a one-line description of your site or the site you will be using. This "site ID" will be printed on the third line of each menu page. When using MITE in the ANSWER role, this site ID should be set to something identifying YOUR site. This ID will be sent to the user dialing into your system, along with the standard MITE greeting. If you are in the Originate role, the site ID is purely informational.  The L option allows you to load parameters from a previously saved parameter file. You will be prompted for a file name, which should be entered in the "d:fn.ft" format (e.g., B:SOURCE.PAR, RATOFF.1, B:CPMNET, etc.). If a file type is not specified, the default file type .PAR will be used. If the specified file is not found, you will be notified, and control will return to the Main Menu. If anything other than a valid parameter file is specified, MITE will abort the load command and issue the following message: "Invalid Parameter File" If a parameter file created with an earlier version of MITE is loaded, then you will be warned: "Warning - old parameter file." At this point you should check all parameters, change if necessary and resave them (on the same file, normally) with the new version of MITE.  The S option allows you to save the current parameters on a disk file for future use as a command line argument or as input for the L option. You will be prompted for a file name, which should be entered in the "d:fn.ft" format. If no file type is specified, the default file type .PAR will be used. Even though it is called a parameter file, it is not only the settings of the parameter menu that are saved. In fact, all parameters that can be configured from ANY of the menus will be saved. Once you determine how to access a particular system you can save a parameter file and in the future, by loading that file, you can instantly configure MITE to access the system again.  The P option selects the PARAMETER MENU. From this menu, you can easily check or set various communications parameters, such as the baud rate, the number of data bits, etc. Once control is transferred to this menu, it remains there until you exit to the Main Menu with the X option. For more information on the parameter menu go to the parameter menu and request help.  The O option selects the OPTION MENU. From this menu, you can select the "trigger characters", as well as several other options. Once control is transferred to this menu, it remains there until you exit to the Main Menu with the X option. For more information on the option menu go to the option menu and request help.  The U option selects the TEXT FILE UPLOAD MENU. From this menu, you can initiate the uploading of a text file to the remote system, or select various options which effect how this is to be done. Once control is transferred to this menu, it remains there until you exit to the Main Menu with the X option (with the exception of the "upload" function itself, which automatically returns control to the terminal mode once the upload is complete).  The D option selects the TEXT FILE DOWNLOAD MENU. From this menu, you can turn the text file capture mode ON or OFF. You can decide whether "flow control" (XON/XOFF handshaking) is used, and if so, what characters are used to start and stop the flow of data from the remote system. Once control is transferred to this menu, it remains there until you exit to the Main Menu with the X option.  The B option selects the BINARY FILE TRANSFER MENU. From this menu, you can initiate a transfer of any file (including executable files, etc.) to or from another system running MITE (or various other intelligent terminal programs) or an RCPM system. You can also select the protocol to be used. Once control has been transferred to this menu, it remains there until you exit to the Main Menu with the X option. As with the text file "upload", once the actual Send or Receive functions have completed, control is automatically returned to the terminal mode.  The M option selects the MACRO STRING DEFINITION MENU. From this menu, the user can view or change any of the ten macro strings which may be invoked via the "macro trigger" character. Macros are used to automatically login to the system you're accessing or to allow you to easily transmit frequently used commands. Once control has been transferred to this menu, it remains there until you exit to the Main Menu with the X option.  The C option selects the SYSTEM COMMAND PROCESSOR, from which the user can issue a number of commands similar to those available in the operating system command mode. These include such commands as DIR, ERA, and TYPE. Once control has been transferred to this menu, it remains there until you exit to the Main Menu with the X option, or enter an "empty" command line (i.e., immediate CR after prompt).  The F option selects the UNWANTED CHARACTER FILTER MENU. From this menu, you can view and modify up to 10 ASCII characters that should be discarded immediately upon receipt. These unwanted characters will not be displayed to the console or saved in memory. The first two of these characters default to 7FH (DEL) and 1AH (Control-Z). The NULL character (00H) is automatically discarded. Once control has been transferred to this menu, it remains there until you exit to the Main Menu with the X option.  The X option allows you to exit to CP/M. You will be asked to confirm this action before the exit is done: "Are you sure (Y/N)? " If you wish to exit at this time, type a "Y" or "y". Any other response will return control to the Main Menu. If you do elect to exit, and a capture file is currently open, MITE will automatically close it for you and inform you of this operation with the following message: "Capture Complete. Now closing file d:fn.ft" If the carrier is still present, MITE will inform you with the following message: "Warning... Carrier still present. Hang up (Y/N)? " If you are finished with the session, reply with anything starting with "Y" or "y", and MITE will hang up before exiting. If you merely wish to return to CP/M temporarily and plan to resume this link, reply with anything else (typically "N" or "n") and the hang up function will not be performed.  The B option allows you to select a new baud rate. You will be prompted as follows: "Enter New Value: " If an illegal value is entered (one not supported by your implementation and/or hardware), the message "Illegal Value" will be displayed, and the rate will remain unchanged. If an empty line (i.e., immediate CR) is entered, the rate will remain unchanged. The default value is 300.  The D option allows you to select the number of data bits in each character. This option toggles between the values 7 and 8. Most timesharing systems use 7 data bits, and most systems that support binary file transfers use 8. The default value is 7. Note that MITE will automatically make a temporary switch from 7 to 8 data bits if you request a binary file transfer.  The P option allows you to select the parity of each character. This option toggles between the values NONE, ODD and EVEN. Most systems that use 7 data bits will use EVEN parity, while most systems that use 8 data bits will use NONE. The default value is EVEN.  The S option allows you to select the number of stop bits on each character. This option toggles between the values 1 and 2. Most 110 baud (and slower) systems use 2 stop bits, virtually all other systems use 1. The default value is 1.  The R option allows you to select the "role" that MITE will play in a connection. The choices are ORG (originate) and ANS (answer). Selecting this option toggles between ORG and ANS. If you are dialing into another system, you should select the ORG role. If someone else is going to be dialing into your system, you should select the ANS role. Note that not all hardware will support the answer role. The default value is ORG.  The M option allows you to select the mode (or duplex) of the transmission. It toggles between the values FULL and HALF. When running in FULL-duplex, it is up to the remote system to echo any characters typed on the local keyboard back to the local display. In HALF-duplex, it is up to the local system to perform this echo function. If you are getting NO echoes of characters you type, you are probably running FULL-duplex on a HALF-duplex system. If you are getting TWO characters for every character you type, you are probably running HALF-duplex on a FULL-duplex system. Most on-line systems use FULL-duplex. The default value is FULL.  The A option allows the user to specify the number of times an auto-dial modem will automatically redial the Phone Number (specified in the N option) if the connection is not completed in the first dialing. The default is zero which means do not redial if the initial call is unsuccessful. The value can be set from zero to fifteen to indicate the number of desired retries before giving-up. A number above fifteen is flagged as an illegal value and is ignored.  The N option allows the user to specify the phone number of the remote site. If a "smart modem" is being used, consult its user manual for specifics as to legal characters. To enter a blank phone number, enter at least one blank character. If the phone number field is blank, the dialing procedure will be skipped. Thirty characters are reserved for this string.  The I option permits the user to initialize the modem with up to twenty characters. Some smart modems require software switches to be set before they will operate properly with MITE. If you are running MITE under CP/M, an appropriate string should be set by the INSTALL program. Recommended settings for some popular modems are: Modem Name Init String Dial Prefix ----- ---- ---- ------ ---- ------ Anchor Signalman Mark VII None None Anchor Signalman Mark XII None AT D BIZCOMP 1012 None None CTS 212AH None ^Q^MD Datec 212 None AT Hayes Smartmodems None AT D Novation Smart-Cat %I %D (space after D) Novation J-cat or Auto-cat None None Rixon 212A ^M^MNU AT D Toyocom (BYTCOM) 212AD Q^M^MQ Q^M^MD^W U.S. Robotics Modems None AT D Note: Additional modems may be found in the "Modem and Cable Installation" section of the MITE handbook.  The H option allows the user to specify a string of up to ten characters which are to precede the number in the dial string. For example, with the Hayes Smartmodem, an "AT D" must be sent to instruct the modem to dial a number. This string must be sent regardless of the number to be dialed. Therefore, the user may enter this string as the dial header string. Likewise, if a switchboard system is always used, part of the number may be included in the 10 characters allotted to the dial header, e.g., "AT DT9,". The combination of the dial header and the number string gives the user 40 characters to express the dial string. The recommended dial prefix for many popular modems may be found by requesting help on option I of this menu, or by looking in the "Modem and Cable Installation" section of the MITE handbook.  The E option allows the user to specify an "Escape Trigger" character that will allow control to be transferred from the link back to the Main Menu. Any time this user-specified character is typed while in link mode, the screen will be erased and the Main Menu will be displayed. From the Main Menu it is possible to initiate various functions, exit to CP/M, return to the link, or go to other menus. This "Escape Trigger" character should be specified as something not required on the remote system. The normal default value is 0AH (10 decimal), which is the ASCII Line Feed (LF) character.  The M option allows you to specify the "Macro Trigger" character. Any time this user-specified character is typed while in the link mode, a second character will be read. If it is a digit in the range 0 to 9, the corresponding macro string will be sent to the remote site as if it were coming from the keyboard. As with the "Escape Trigger" character, it should be specified as something not normally required for use on the remote site. A new value may be specified in the same manner as with the "Escape Trigger" character described above. The normal default value is usually 1BH (ESC). If the character selected is required by the remote site, it may be sent by typing it twice.  The B option allows you to specify the "Break Trigger" character. Any time this user-specified character is typed while in the link mode, a communications line BREAK function (SPACE condition for 150 milliseconds) will be performed. A BREAK is NOT a real character and is rather out-dated, but is still required by certain computer systems (mostly IBM).  The K option allows you to specify the "Local Command Trigger" character. Any time this user-specified character is typed while in the link mode, you will be prompted with "Local Command?". For further information, type the local command trigger while in terminal mode and request help. This function is disabled when the value 00H (null) is selected. The recommended value is ^K (0BH).  The R option allows you to specify the "Remote Command Trigger" character. Any time this user-specified character is typed on the ORIGINATE system while in the link mode, the ANSWER system will prompt you with "Remote Command?". In response, the ORIGINATE user can issue "local" commands on the ANSWER system. This allows an ANSWER system to be put on-line in an unattended mode, so that the ORIGINATE user can control both ends of a file transfer, check directory space, and perform other tasks all from the ORIGINATE system. The "Remote Command Trigger" character is specified by the ANSWER system operator. It is listed (if active, i.e., non-null) when an incoming call is answered, as part of the initial greeting. Output of "local" commands invoked via the "Remote Command Trigger" character actually goes to both systems, and as a matter of convenience, remote commands may be invoked and/or entered from either console. If you are the ORIGINATE system it is not possible for the remote system to issue commands that your system will process.  The C option allows you to select an automatic conversion of lower case characters to upper case both to and from the remote system. This affects only alphabetic characters and serves the same function as a CAPS LOCK key. The default value is OFF. Each time this option is selected, the value toggles between ON and OFF.  The L option allows you to select an Automatic LF (Line Feed) character to be sent on the local console any time a CR (Carriage Return) character is received. Some timesharing systems send only a CR at the end of each line, whereas most CP/M console terminals require both a CR and a LF to advance to the next line. The default value is OFF. Each time this option is selected, the value toggles between ON and OFF.  The T option allows you to enable or disable the Western Union TWX compatibility mode. It is possible to access any TELEX terminal in the world via either of two mechanisms supported by Western Union. When the TWX mode of operation is selected, the following differences are in effect: * Any time a Control-E is received, macro string number 8 will be sent as an "answerback" message. * On establishing a connection, MITE will send a Control-E and await the returned "answerback", echoing it to your console. Once this has been displayed, MITE will automatically ask for the name of the file to be uploaded and will send the file. * On detection of an incoming call, the normal header is suppressed. It should be sufficient to create a parameter file called TWX.PAR that will set up all parameters for accessing the TWX network. The TWX Mode requires the following options to be set: AUTO LF after CR = ON (option L on OPTIONS MENU) Mode(duplex) = HALF (option M on PARAMETER MENU) CR/LF Handshaking = OFF (option H on UPLOAD MENU) Baud Rate = 110 (option B on PARAMETER MENU)  The D option allows you to go into direct connect mode. This mode is used to "fool" the computer into thinking that a modem carrier signal has been received. This option should be used when connecting two computers together without the use of modems. Another use is direct communications with a "smart modem". In most cases, this option should remain OFF.  The Q option allows the user to expand tab characters to spaces or send the tabs themselves to the console. This will not expand tabs on transmission to the remote system, but only to the console. If this option is ON, any tab character sent to the console will be expanded to spaces to place the cursor at the next 8th character position. When receiving terminal control codes that MITE does not recognize, positioning of the cursor with tabs will cause invalid expansions. The escape codes will be counted as characters sent, but will have no effect on the cursor position. This option may be turned off to allow the terminal itself to position the cursor upon receipt of a tab. Each time this option is selected, the value toggles between ON and OFF. The default is ON.  The U option allows you to "upload" (send) a text file to the remote system as if it were coming from the keyboard of the local console. When this option is selected, you will be prompted for a file name, which should be entered in the "d:fn.ft" format. The specified file will be sent to the remote system, using the conventions selected by the other options on this menu. Once the file has been sent, the communications link will be resumed automatically. If an XOFF character (13H, or ^S) is received from the remote system during transmission, MITE will pause until an XON (11H or ^Q) is received before continuing to transmit the file. This will prevent many systems from losing data while transmitting. An upload can be aborted at any time by typing an ESC on the console keyboard. The READ local command performs the same function.  The D option allows you to specify an "intercharacter delay" of 0 to 255 milliseconds. This delay allows you to slow down the outgoing text to the point that a "slow" remote system can accept it. This function works in both FULL- and HALF-duplex. It is the only way to slow down text in HALF-duplex. The time starts with the actual transmission of the character, not counting the transmission time at whatever baud rate you are running. If the actual delay time is less than a single character time, there will be no effect. For example, at 300 baud, each character takes about 33 milliseconds to transmit, so values below 33 will have no effect. A value of 100 will result in about 10 characters per second being sent. This option does NOT affect baud rate, it merely inserts a variable length delay between characters which are being sent at the normal baud rate. The intercharacter delay works for text being sent through the macro strings as well as from a file. When this option is selected, you will be prompted for a new value. The default value is 0.  The E option allows you to enable or disable a "wait for character echo" mode. When this mode is enabled, MITE will wait for each character that it sends to be echoed back by the remote system before it sends the next character. This insures that data will not be lost even on the "slowest" remote systems. The overall throughput is much slower (usually about half) than the rate without the "wait-for-echo" enabled. When this option is enabled, MITE will compare each echoed character it receives against the character it sent and list the number of characters that didn't match at the end of the transmission (nnnnn Compare Errors). Each time this option is selected, the value will toggle between ON and OFF. The default value is OFF.  The H option allows you to select the end-of-line (CR/LF) handshaking mode. When this mode is enabled, any time a CR (Carriage Return) is sent, MITE will wait until the remote system sends back a LF (Line Feed) before sending the next line. This feature is required on most timesharing systems, as they are usually "deaf" during this interval. If the user wishes to communicate with a remote printer or simple data communications utility (such as those found on many commercial word processors), it may be necessary to turn this option OFF, as the remote site in these cases will not send a LF in response to a CR. Each time this option is selected, the value will toggle between ON and OFF. The default value is ON.  The T option allows you to specify a "turnaround" character. When set to 00H, this option is disabled. When set to any other value, MITE will wait at the end of each line until it sees the specified character before it begins to transmit the next line. This feature allows the user to upload text to remote systems that prompt with a question mark (?), or some other prompt. If the turnaround character is not seen within twenty seconds, MITE will send the next line. Typing the escape key during this twenty second timeout period will cancel the timeout and cause MITE to immediately send the next line. When this option is selected, you will be prompted to enter a new ASCII character. The default value is 0.  The G option allows you to set the "Garbage Character Count". This count refers to the number of characters that MITE will wait for, after transmitting a line, before starting to send the next line. Each such "garbage" character has a one-half (.5) second timeout. This feature allows the user to upload text to remote systems that send nulls, line numbers, or other extraneous characters at the start of each line before they are ready to receive the new line. When this option is selected, you will be prompted to enter a new value. The default value is 0. Note : The H, T and G options can be used in combination. The H option is processed first, then the T option, then the G option. This combination allows the user to select a mode such as "At the end of each line, wait for a '?', then ignore the next 2 characters with a one-half (.5) second timeout on each, then send the next line". Using the various options, it should be possible to upload text to virtually ANY on-line system.  The C option allows you to turn the text capture mode ON or OFF. The first time capture mode is enabled (or the first time after a Write operation), the user will be prompted for a file name: "Enter Filename: " This file name should be entered in the "d:fn.ft" format (e.g., FRED.TXT). Note that it is possible to specify a logical device ( e.g., LST:) in addition to disk file names. If the specified file already exists, you will be notified of this fact and asked if you wish to overwrite it. If you later exit to the operating system without writing the captured data to disk with the W option, MITE will automatically write it for you at that time. Each time this option is selected, the value will toggle between ON and OFF. The initial value is OFF. The CAPT local command performs the same function. The I option indicates to the user that the incoming data is being placed into the capture buffer. If capture is ON (C option above) and the I option is ON (default), the first column of the display will be used as a capture buffer indicator. Initially a colon (:) will be placed by MITE at the front of each captured line displayed to the screen. This colon is merely an indicator and does not go into the capture buffer; nor does it get saved on the disk. The colon indicates to you that the information on the screen is being captured and that more than 4K (4096) characters of yet unused capture buffer space is available. The indicator character (first of each line) is also used to let you know when the capture buffer is approaching capacity. When the space remaining in the buffer drops below 4K (4096) characters, the indicator character is changed to an asterisk (*). This is a warning to the user that some action needs to be taken at the earliest opportunity to avoid overflowing the capture buffer. If the sending system pauses before the capture buffer overflows, you can save the text either by going back to the download menu, or by issuing the appropriate local commands. Information on local commands may be obtained by issuing a help request while in terminal mode.  The A option allows the user to write a partial file from the capture buffer. The APPEND local command performs the same function. The data captured will be written to the file specified earlier and the buffer pointer will be reset to empty. Also, the capture mode will remain ON and the output file will remain open. This allows the user to capture several long sessions to the same file, flushing the buffer each time.  The W option is used to write any captured data to the file that was originally specified when capture mode was first enabled. If flow control is enabled, this may actually be the last (partial) buffer. When the write is complete, MITE will remind the user which file was being used: "Capture Complete. Now closing file d:fn.ft" The Write option will set the capture mode to OFF and reset the capture buffer to empty. When this option is selected, the write operation is performed at that time.  The R option allows you to reset the capture buffer to empty. This option is useful only when flow control is disabled.  The P option allows you to turn the "printer echo" function ON or OFF. Any time the printer echo is ON, any character that is written to the console during a link will also be written to the list device. In order for this to function properly, the list device must operate at an effective baud rate that is higher than that of the communications link. For slower printers, it may be necessary to use the "capture to LST:" mechanism or to capture the data to a disk file for later printing. Each time this option is selected, the value toggles between ON and OFF. The initial value is OFF.  The T option allows you to list the current contents of the capture buffer to the console. The listing will pause every 23 lines (and at the end of file), until you hit a CR to continue or ESC to abort the listing. Control-S can be used to cause a pause in listing at any time. This feature is normally of use only when flow control is disabled (otherwise you can only list the last "partial buffer").  The F option allows you to select whether "flow control" handshaking is to be used while capturing text. XON/XOFF (Control-S/Control-Q) characters are usually used to accomplish this handshaking. Many systems will pause when you type Control-S and start back up when you type Control-Q. If flow control is enabled, MITE will attempt to use this mechanism to cause the remote system to pause while it writes the data to disk it has captured since the last pause. This is normally done every 2048 bytes. When the flow stop character is sent, MITE will wait until a full second has elapsed since the last character arrived before writing to disk. This is necessary since some systems have characters in transmission when the flow stop character is read. If the remote system supports this convention, it is highly recommended that you take advantage of it. Each time this option is selected, the value will toggle between ON and OFF. The default value is OFF.  The Q option allows you to specify the flow start character as described under the F option. Most systems that have this feature use Control-Q. When this option is specified, the user will be prompted for a new ASCII character. The default value is ^Q.  The S option allows you to specify the flow stop character as described under the F option. Most systems that have this feature use Control-S. When this option is specified, the user will be prompted for a new ASCII character. The default value is ^S.  The P option allows you to select the protocol to be used in the transfer of binary files from one system to another. When the P option is selected, the list of available protocols will appear. To change the protocol, you may enter the character listed beside the desired protocol. Enter a CR (carriage return) if you wish to leave the protocol unchanged. Be sure that the system with which you plan to communicate supports at least one of these protocols. The default value is XMODEM. For more information on each protocol select the P option of this menu and request help.  The S option allows a file to be sent using the currently selected protocol. When this option is selected, you will be prompted for a file name, which should be entered in the "d:fn.ft" format. At this time, MITE will start sending the specified file to the remote system. A period (".") will be displayed on the console for each block sent and acknowledged as correct. An 'R' will be displayed for each block that was rejected. A 'T' (timeout) means that the remote system didn't respond in the required amount of time. A 'U' (unrecognized) means that your system received an unrecognizable message from the remote system. When the file has been completely sent, MITE will display the message: "File Sent" and the terminal mode will be resumed automatically.  The R option allows a file to be received using the currently selected protocol. When this option is selected, you will be prompted for a file name, which should be entered in the "d:fn.ft" format. At this time, MITE will start receiving the specified file from the remote system. A period (".") will be displayed on the console for each block received correctly. An 'R' will be displayed for each block that is received in error. Other characters that may appear are described in the help screen for the S option of this menu. When the file has been completely received, MITE will display the message "File Received" and the terminal mode will be resumed automatically.  CLINK The original Mycroft Labs binary file protocol. It is compatible with CLINK and CROSSTALK. MITE will also permit the user to receive an ambiguous file list from a CROSSTALK system if several conditions are met. Since CROSSTALK does not include the file name in the protocol, but uses the remote command feature to indicate the beginning of a new transmission, MITE's remote command trigger character must be set to "^C" in order to be compatible with CROSSTALK. MITE must also be the Answer system for the remote command to work. If MITE is the originating system, single file transmissions are required.  HAYES The Hayes Terminal Program Verification protocol. As used in the Smartcom communications package.  IBMPC The IBM Asynchronous Support Package text file protocol. This is not strictly a binary protocol, as only text files can be sent, and no error checking or retransmission is done.  MITE The native MITE protocol (as used in the Mycroft Labs SEND/RECV utilities, see the August, 1982 "Dr. Dobbs Journal"). This protocol supports multi-file transfers, e.g., all files of type .ASM. No file name is required on the receive end.  TEXT A simple ASCII text file protocol that can interact with a high-level language program on a minicomputer or mainframe to transfer text files with error checking and recovery. A sample program to interact with this protocol is provided on the MITE distribution disk. The program, written in FORTRAN, is on file TEXTP.FOR.  XMODEM The protocol used on most RCPM systems. It is compatible with MODEM7, XMODEM, MODEM80, and various other intelligent terminal programs. MITE supports either the checksum or CRC versions of this protocol. To select which will be used issue the CRC local command or set the C option in the binary file transfer menu.  This menu allows you to view and/or define up to 10 pre-stored macro strings each of which can be up to 62 characters in length. These strings are saved and loaded along with the parameters in the .PAR file. Typical uses for macro strings include semi- or fully automatic login or favorite commands. To define the "n"th string, type the number of the desired string (0 to 9). You will be prompted for a new string, which will then be displayed in the menu following the string number. To exit from this menu, use the X option. Any printable ASCII characters can be entered directly. To enter control codes (such as CR, LF, Control-X, Control-H), enter a caret (^) followed by the printable character corresponding to it. The MITE manual contains a list of control codes in the chapter discussing the macro string menu. To invoke a macro string during a session, enter the "Macro Trigger Character" (see Option Menu), followed by the "n"th index character as set up for your terminal (see Installation Notes). For most systems the index characters are set up as '0' - '9'. If the character following the "Macro Trigger Character" is NOT one of these index characters, then that second character is sent through normally. If the remote system needs the "Macro Trigger Character" itself, it can be sent by typing it twice.  There are several special control codes that may be used to automate the login process on many remote systems. The example in help option C is for The Source. The characters currently available are as follows: @E Turn on wait-for-echo mode @N No echo wait (default) @W Wait until no characters received for 1 full second @Pi Wait until no characters received for "i"/10 second @Tn Trap on the ASCII character "n" @Li Link to Macro String "i" (0-9) ^M Carriage Return (control-M is the ASCII character for a carriage return). The "wait-for-echo" mode forces MITE to wait for the echo of each character that it sends before proceeding to the next character. This mode defaults to OFF at the start of each string. Some systems will lose characters if this wait is not enabled. However, many systems do not echo initial CR characters, passwords, etc., and require a means of turning this mode on and off on a character-by-character basis.  This sub-menu gives the user the capability of ignoring certain characters received from the remote system. This feature may be useful when a micro is communicating with a mainframe that uses the delete character (7FH) as a pad character. Many microcomputers will do a character delete from the screen when the delete character is received. In order to prevent this deletion, the user would select the 7FH as a character to ignore from the remote system. The 7FH character is a standard character to be ignored. Another example of when the unwanted character filter is useful involves the Dow Jones Service. This service will sometimes send a 1EH code which will cause certain computers to home the cursor without clearing the screen which can cause havoc for the user.  Three methods of entering the value are allowed. The ASCII value of the character may be entered in decimal or in hexadecimal. The control character may be entered by pressing the Control key along with the appropriate character. In some cases the operating system will trap this and not return it to MITE. For these cases a third method of entry is needed. Enter "^" followed by the character (e.g., "^M" to indicate a carriage return, 0DH).  Available commands: COPY new=old copy one file to another DIR x:afnx list directory of files DRIVE x: select new drive as default ERA x:afnx [q] erase file(s) HELP print list of legal commands LIST x:ufn list file to printer REN new=old rename "old" file to "new" RESET make all drives read/write SET x:afnx $att give file(s) new attribute SIZE x:afnx list size of file(s) in k bytes SPACE x: show space available on d: TYPE x:ufn list text file on console USER n set user number The "system command processor" executes a number of commands similar to the CP/M "direct" commands (e.g., DIR, ERA, TYPE), as opposed to transient commands (e.g., STAT, ED). When this option is selected, any number of these commands may be entered, one at a time.  COPY new=old Simple file to file copy. Uses syntax similar to PIP (e.g., COPY DEMO=TEST.DAT to make a copy of TEST.DAT on the file DEMO).  DIR x:afnx List the names of all of the files on disk 'x' that satisfy the ambiguous file name expression (afnx). For example, "DIR *.ASM" will list the names of all files of type "ASM". If the drive (x:) is not specified, the current drive is assumed. Names of R/W files will be preceded with the standard ':'. Names of R/O files will be preceded with a '>'. SYS files are not listed. See help screen H for an explanation of ambiguous file name expressions.  DRIVE x: Equivalent to 'x:' by itself in CP/M command mode. This makes drive 'x' the new default (or current) drive.  ERA x:afnx [q] Erase all files on disk 'x' that satisfy the ambiguous file name expression (afnx). For example, "ERA *.ASM" will erase all files of type "ASM". If the drive (x:) is not specified, the current drive is assumed. If a second parameter of "q" is specified (ERA *.ASM Q), you will be asked YES or NO on each file before it is deleted.  LIST x:ufn List the specified unambiguous file to the printer.  REN new=old Give an existing file ("old") a new name ("new"). Note that both "old" and "new" must be unambiguous file names. Drive designations (x:) may be included in "old" and/or "new". For example, to change the name of the file "FRED.ASM" to "JOE.MAC", enter "REN JOE.MAC=FRED.ASM".  What is an afnx? An ambiguous file name expression is a list of ambiguous file names separated with + or - operators, for set inclusion or exclusion. A '+' means to include any of the file names covered by the following afn that are not already in the overall list. A '-' means to exclude any of the file names covered by the following "afn" that ARE currently in the overall list. Note that the drive name is not significant in the comparisons. As an example, the afnx "*.ASM+*.SRC-F*.*" would mean all files of type ".ASM" and all files of type ".SRC" except those beginning with 'F'. It is also possible to use an expression like "A:*.ASM-B:*.ASM" which means all files on drive A: of type ".ASM" except those that also occur on drive B:.  RESET Make all drives Read/Write again. Equivalent to a Control-C (^C) in CP/M command mode. Should be done any time a new disk is mounted.  SET x:afnx $att Give all files on disk 'x' that satisfy the ambiguous file name expression (afnx) the new attribute "att". If the drive (x:) is not specified, the current drive is assumed. Possible new attributes are: $DIR - make files visible in directory $SYS - make files invisible in directory $R/W - make files Read/Write $R/O - make files Read/Only For example, to make all files of type "COM" on the current disk Read/Only, use the command: "SET *.COM $R/O".  SIZE x:afnx List size of specified file(s) in K bytes, then list total size of those listed. This can be helpful for estimating transmission time for a file.  SPACE x: List space available on specified drive. If no drive is specified, the current drive is assumed.  TYPE x:ufn List specified file to the console. Control- S (^S) may be used to pause (once paused, any character will restart the listing). Any other character will abort the listing.  USER n Set user number (0 to 7).  To invoke the use of a Local Command in terminal mode, the user would type the "Local Command Trigger" character. The default (preset) and recommended character is ^K. This "Local Command Trigger" can be changed through option K on the OPTION MENU. Do not set the trigger value to 00H, since this effectively disables the function. Whenever the "Local Command Trigger" character is typed on the Local console while in terminal link mode, the prompt Local Command? is displayed. At this time, any system command (see SYSTEM COMMAND PROCESSOR) or any one of the Local Commands may be entered. Once the command has been processed, terminal mode will be automatically resumed. Note that only the first four characters of the Local Commands need be entered. If a file name is omitted, MITE will ask for it later.  BUFFer Prints the capture buffer statistics (i.e., number of bytes captured out of total space available).  ECHO ON or ECHO OFF Allows the user to turn the printer echo function ON or OFF. This is the same as the P option on the TEXT FILE DOWNLOAD MENU.  EXIT Exits to CP/M. Closes open files. Does not hang up the phone  READ d:fn.ft Reads specified file from disk and sends it as if it were coming from the local keyboard without interpretation by your system. 'd' is the drive name, "fn" is the file name, and "ft" is the file type. The drive name is optional; if it is not specified, the drive name is assumed to be the current logged drive. This is the same as the U option on the TEXT FILE UPLOAD MENU.  SCREen OFF or SCREen ON This option allows the user to turn screen output OFF or ON. When OFF, characters received over the communications link will not be displayed on the screen. It is useful on those systems whose video displays are too slow to keep up with communications. This most often occurs on machines without a separate terminal. Problems with losing characters at the beginning of lines would indicate this option might be necessary when uploading or capturing files.  The X option allows control to return to the Main Menu.  This is the principal menu which starts MITE and provides access to its other features through the sub-menus. If this is your first time using MITE, there are a couple of things you should know: 1) You can obtain help on any menu option by going to the menu containing the option and pressing a question mark. You will then be requested to enter a single character indicating the topic on which you wish help. In most cases the character will be the letter of the menu option. 2) While the large number of options available in MITE may seem imposing at first, every option exists to solve a specific communications problem. The general rule of thumb is "If you don't understand an option, don't change it." Each option has a default value that is appropriate for the vast majority of the systems with which you are likely to communicate. Most of the options that are likely to cause you confusion are intended to solve problems that you are not likely to encounter.  The current value of the parameter is displayed to the right of the option description for most options. If the value is changed, it is immediately updated on the menu display. Some of the options prompt the user for input (e.g., Baud). Others merely toggle between two or three states when selected (e.g., Mode). This approach makes it easy to determine the current setting of all parameters at a glance and gives immediate feedback when they are being changed. With all parameters, options, macro strings, etc., any change(s) you make will stay in effect only until you exit to CP/M, unless you use the S option on the Main Menu to make the change(s) permanent.  From this menu, you can select the "trigger characters", as well as several other options. Trigger characters are the characters you type while online to invoke some of the special features of MITE. Once control is transferred to this menu, it remains there until you exit to the Main Menu with the X option.  This menu is used to set the parameters that control how MITE will interact with the remote computer when trying to upload a text file.  This menu controls what MITE will do in terms of saving information as it is received from the remote computer.  This menu is used to control sending or receiving of binary files. A binary file may contain any type of information whatsoever, making this the recommended means of transferring information whenever possible. When files are transmitted using one of the protocols allowed by MITE you have the added advantage that if errors occur while transmitting the file the block in which the error occurred will be re-transmitted. MITE supports a variety of protocols to allow compatability with the widest possible range of programs to be running on the remote system.  The C option enables or disables the use of a CRC (cyclic redundancy check) for error detection. This option has no effect if a protocol other than XMODEM or XMODEM/B is in use. Many RCP/M systems default to using a CRC for error detection when transferring files. The advantage to using this option is that the probability of detecting a transmission error is somewhat improved.  This variant of the original XMODEM protocol is used to allow multiple files to be transmitted with a single command. It may use either a CRC or checksum for error detection. You may determine whether or not to use a CRC for error detection through the C option of the binary file transfer menu or the CRC local command.  As an example of an auto login, the following string may be used to logon to The Source via TELENET: ^M@W^M@E@T=d1^M@T@c 30128^M@T>id tcm495 xxxxx^M When invoked, this string performs the following functions: ^M First CR to get attention (not echoed) @W Wait until no characters have come in for 1 second. ^M Second CR to get attention (not echoed) @E Turn on wait-for-echo mode @T= Input and display characters until "=" is seen d1^M Response to "Terminal=" question on TELENET @T@ Input and display characters until "@" is seen c 30128^M Response to "@" prompt on TELENET @T> Input and display characters until ">" is seen id ...^M Source logon command  Another example of macro string usage is in automating commands used to control MITE. One common use for this is turning capture on and specifying the name of the capture file with the invocation of a single macro. A macro that will perform this function could look like the following: ^Kcapt on^Mexample.txt^M An explanation of this macro string follows: ^K Control-K. This is the local command trigger. It Tells MITE that a local command is comming. capt on The local command to turn capture on. ^M Carraige return. example.txt The name of the capture file. ^M Carraige return.  APPEnd Allows the user to write the captured data to the disk file without closing the file. Capture mode must be ON before you use APPEnd. The capture mode is left ON after the writing operation is completed. Since the file is not closed by APPEnd, another append or write to the same file is allowed. This is the same as the A option on the TEXT FILE DOWNLOAD MENU.  CAPTure ON or CAPTure OFF Allows user to turn text capture mode ON or OFF. he first time capture is enabled or the first time after a WRITe, MITE will ask for a file name. This is the same as the C option on the TEXT FILE DOWNLOAD MENU.  ECHO ON or ECHO OFF Allows the user to turn the printer echo function ON or OFF. This is the same as the P option on the TEXT FILE DOWNLOAD MENU.  MACRos Lists all non-blank macro strings to the console.  PROTocol Displays the current binary protocol, displays the list of available protocols and allows a new protocol to be selected. This is the same as the P option on the BINARY FILE TRANSFER MENU.  READ d:fn.ft Reads specified file from disk and sends it as if it were coming from the local keyboard without interpretation by your system. 'd' is the drive name, "fn" is the file name, and "ft" is the file type. The drive name is optional; if it is not specified, the drive name is assumed to be the current logged drive. This is the same as the U option on the TEXT FILE UPLOAD MENU.  RECV d:fn.ft Receives file transmission onto specified file using the currently selected binary protocol. 'd' is the drive name, "fn" is the file name, and "ft" is the file type. If you are using the MITE binary transfer protocol, the d:fn.ft (drive, file name and type) is ignored and the sending system will supply the file name. This is the same as the R option on the BINARY FILE TRANSFER MENU.  SEND d:fn.ft Sends specified file from disk using the currently selected binary protocol. 'd' is the drive name, "fn" is the file name, and "ft" is the file type. This is the same as the S option on the BINARY FILE TRANSFER MENU.  WRITe Allows the user to write the captured data (or the last part of it, if flow control is enabled) to disk. Capture mode must be ON before using WRITe. A WRITe closes the file and turns the capture mode OFF. This is the same as the W option on the TEXT FILE DOWNLOAD MENU.  The features available in the SPECIAL TERMINAL MENU are features that allow you to customize MITE by selecting menu options. The exact features available vary somewhat from one machine to the next. Features available on an IBM-PC may be different from those available on a Z-100. To see what features are available in your implementation select the T option of the MAIN MENU. While in the SPECIAL TERMINAL MENU help is available to explain how each of the features operates.  The V option, in association with the B option above, allows the user to re-define the location of the RS-232 port specified in the C option above. In particular, this option allows the user to change the Interrupt Vector Address. This option should normally be set to either 0030H(port 1) or 002CH(port 2) (as are the defaults). Extreme caution should be taken in changing these addresses to values other than those above. See descriptions of the C and B options above for a complete discussion of the port re-definition options. WARNING: This option should be used with caution.  The B option allows the user to re-define the location of the RS-232 serial port specified in the C option above. This option provides for the ability to change the Port Base Address from its pre-defined value. This is very useful when using an internal modem board in a PC "look-alike" such as the Columbia MPC. Some PC look-alike systems have the RS-232 ports on the main computer board and are not optional. Therefore, an alternate address must be used on the modem board. The B option, in conjunction with the V option (described below), allows this flexability. After selecting the B option, the user will be asked to enter the base address of the RS-232 port. Please check the documentation associated with the modem board or serial board being implemented for the appropriate address. This address should be entered in hexadecimal format, e.g., 03F8H. The address entered will be associated with the port number currently in the C option until the session is terminated unless the Save option (Main Menu) is used to save all parameters. WARNING: This option should be used with caution.  The C option allows the user to change between the three serial ports available on the PC. Entering a "C" will cause the port number to increment as well as change the Port Base Address and the Interrupt Vector Address. Each of these values may be changed individually and stored in association with the port number. See the following paragraphs on changing the Port Base Address and the Interrupt Vector Address. These values are stored on the parameter file when a "Save" is done.  The N option allows the user to change the normal foreground color if a color monitor is being used. After selecting the N option, the user will be shown the foreground color options below and can select the desired color. The color selected will be used for the normal foreground color for non-highlighted displays. COLOR SELECTION OPTIONS 0 - Black 1 - Blue 2 - Green 3 - Cyan 4 - Red 5 - Magenta 6 - Brown 7 - Yellow 8 - Dark Gray 9 - Light Blue A - Light Green B - Light Cyan C - Light Red D - Light Magenta E - Yellow F - White Enter Foreground Color Code:  The M option allows the user to change the normal background color if a color system is being used. After selecting the M option, the user will be shown the background color options below and can select the desired color. The color selected will be used for the normal background color for non-highlighted displays. COLOR SELECTION OPTIONS 0 - Black 1 - Blue 2 - Green 3 - Cyan 4 - Red 5 - Magenta 6 - Brown 7 - Yellow Enter Background Color Code:  The H option allows the user to change the highlighted foreground color if a color system is being used. After selecting the H option, the user will be shown the foreground color options above and can select the desired color. The color selected will be used for the highlighted foreground color for highlighted displays.  The I option allows the user to change the highlighted background color if a color system is being used. After selecting the I option, the user will be shown the background color options above and can select the desired color. The color selected will be used for the highlighted background color for highlighted displays. This is general help for the emulation menu. This option lets you select the manufacturer of the terminal you wish to emulate. This menu lets you select the model. This menu lets you select the keyboard overlay. This option turns the emulation feature on or off. This options toggles the debug flag. This option sets the intercharacter delay when sending function keys. Return to main menu. This selects no emulation and turns off the flag in the emulation menu. Go to the next list. Return to the emulation menu.  The E option allows the user to require a password when MITE is used in the answer role. When MITE answers the incoming call this value will be checked. If it is blank, any caller will be allowed access to the system. If this value is non-blank, the caller will be prompted with: ENTER PASSWORD: He will be given three attempts to enter the password that is entered via this option. The password may be up to three characters, upper or lower case. The default setting for the password parameter is blank. USE x:fn.ft The USE command specifies that instead of reading input from the keyboard, MITE should read from the specified file. Characters coming from the file are treated just as if they case from the keyboard. At the end of the file, control is returned to the keyboard. If a macro string is active at the same time as the USE file, the macro string has precedence. The following should be taken into account when creating a USE file: - All control characters in the file are ignored. This includes carraige returns and line feeds. - To issue a control character, use the '^' followed by the character. For example, a carraige return (control-M) is specified by ^M. - To delay 1 to 9 seconds, use a @Dn where 'n' is the number of seconds. - An ampersand (@) followed by any other character other than another ampersand or a 'D' will cause the ampersand and the other character to be ignored. The S option allows filtering of control characters from the text file as it is transmitted t he remote system. Only carriage returns (0DH) and (if necessary) line feeds (0AH) are passed through. This option also strips the high bit from the transmitted character before sending it. With this option "ON", WORDSTAR files may be transmitted to a mainframe or another microcomputer without first "Printing to a Disk File". This option should be "OFF" if transmitting files containing Tabs (09H) or other required control characters.  To allow for modification of macro strings, several special functions enable the user to move characters from the "old" string into the "new" string. These functions are defined below. ^L - Control L moves the next character from the "old" string into the "new" string. On the IBM, you may use the right arrow key. ^K - Control K moves all remaining characters from the "old" string into the "new" string. On the IBM, you may use the up arrow key. ^H - Control H delets the last character from the "new" string. On the IBM, you may use the left arrow key. ESC - The Escape key will reset the "old" string to the beginning and the "new" string to empty. This allows the user to abort and start again. The 'Starting Point' is where AUTOMITE gets the 'default' values from (i.e. the answers that will be accepted if just CR is typed). You can use either 'Internal Defaults', which is the set of values MITE uses if no .PAR file is loaded, or you can specify an existing site name. The latter option allows you to start with a file that may be just like you want with one or two minor exceptions, such as phone number or baud rate. When in doubt, use 'Internal Defaults' (just type CR in response to this question). A site 'filename' is up to 8 characters, any of which can be alphabetic or numeric (no special characters like slash). If you are defining a supported service, an appropriate default filename will be supplied for you. If you are creating more than one file for a given supported service / network combination (e.g. DJNS/Telenet), you should specify a unique name for each file. If possible, use the same first few characters for related files (e.g. SOURCE3 and SOURCE12 for 300 and 1200 baud files for the source). This name will be listed on the AUTOMITE main menu. The 'description of site' may be any phrase of up to 50 characters, and should be descriptive of the site you are defining. If you are defining one of the supported services, an appropriate default description will be supplied. This description will be displayed on the AUTOMITE main menu. The 'phone number' is the number of the site you are defining. It may include characters such as parentheses, dashes and spaces. Additional characters may be available for your particular smart modem (consult your modem manual). Some examples of such modem specific characters are: T - for forcing touch tone (instead of pulse) dialing (Hayes) , - to pause for 1 second before proceding (Hayes) The 'baud rate' refers to the speed at which you wish to communicate. Most modems support 110 and 300 baud (about 10 and 30 char/sec respectively). Some modems also support 1200 baud (about 120 characters per second). Be sure your computer, your modem AND the online service are all able to support the baud rate that you select. The 'character format' refers to the number of data bits and the parity. Your selection must be the same as that used by the remote online system in order to communicate properly. If you get gibberish on your screen, you may wish to try a different character format. Most online systems use 7 data bits and Even parity (7/EVEN). A few use 8 data bits and No parity (8/NONE). Virtually no other combination is found in practice. If you use 8/NONE and get greek characters, reverse video characters, etc, try switching to 7/EVEN. MITE has the capability of automatically logging in to many online services, such as Dow Jones, etc. In order to do this, it must know exactly how such a login procedure works. There is a flexible 'language' in MITE that allows you to specify exactly how to interact with such a login procedure, but it is somewhat complex to learn. AUTOMITE knows how these login procedures work on all the supported online services, and can ask you for just those items specific to your account (user number, password, etc.). If you want to have MITE login automatically for you, answer this question YES, and then answer all the specific questions asked for the service you are using. If you have a valid account on that service, you should have all of the information required. Once you have defined a site with auto login, KEEP CAREFUL TRACK OF THE .PAR FILE CREATED BY AUTOMITE. Anyone with that file (and MITE) can use your online account as easily as you can! AUTOMITE is a front-end menu system for the MITE communications program. It allows you to easily determine which online sites have been previously set up (defined), and allows MITE to be executed using the parameters for any of those listed sites. It furthermore allows you to easily define new sites, including automatic login. AUTOMITE knows how to set up parameter files for many online services, such as Dow Jones via Telenet. The site code (a single letter in the range A through J) is the first item on each line of the AUTOMITE main menu. To invoke MITE using that site, just enter the site code and sit back while MITE does its stuff. Option W allows you to advance to the next page of defined sites, if more than 10 sites are currently defined. When you are on the last page of sites, this option will return you to the first page. The X option allows you to exit to the operating system WITHOUT chaining to MITE. The Y option allows you to define a new online site. You will be asked a few short questions such as: - what online service (source, dow jones, etc.) - what phone number - what baud rate (300, 1200, etc.) - do you want to set up an auto login sequence If you select the last option, you will be asked for additional information, such as user number, password, etc. It is recommended that you have all such information handy before trying to define a new site. The Z option allows you to zap (delete) an existing site from the list of current sites. This will erase the .PAR file. You will be asked to confirm the action before it is done. The currently supported sites are those for which AUTOMITE knows how to set up parameter files. Note that a 'supported site' actually is a combination of an online service (such as Compuserve) with a network used to access it (such as Tymnet). The reason for this is that the details of the logon procedure are dependent on which network is used to access the given service. To choose one of the supported sites, select the one letter code to the left of the site name and description. If you want to set up a parameter file for some other site, select 'none of the above' (by typing CR). In this case, you will be prompted for character format, and will NOT be prompted to set up an auto login procedure. n for this is that the details of the logon procedure are dependent on which network is used to access the given service. To choose one of the supported sites, select the one letter code to the left of the site name and description. If you want to set up a parameter file for some other site, select 'none of the above' (by typing CR). In this case, you will be prompted for XXX000000E0123456789   ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌaabb E H6E6E *** MITE not installed *** Please run the Install program to select computer type. $!91v*z({(6E2H2w2;~2Bw2v2v2v2Hw2w2Pv2Qv>2v2w!"-~!:m2:~:] ʀ!\yq͈A% !,"v>O21~>2v2v2v2v2v2v2v2v:F²>2v>2w2v2v2v:12v:22v:32v:42v:G2v>2v>2v>2v>2v>2v>2v!Iw6# x 2w>2y>2y!y6# + c 8 :v; ̀:vͤ:v͡:vͧ*v͞:1~O>_ >ͪz :Qvz :Pvz Ô ͗D::~ ʙ !:~6 K¢ >2Pv>Gâ B6E;Fq?µ ́Ec BʝHC DF(F` G >2Qvh%H I LD MM O]3Pʂ1SCU>*X} >́Eß ́E͗D *Ev>PE:vc ʹq:v?:   ͗D9I v͐dp6EͷFʹqqXc ́E͗D&6E!yx0~aq6E~ ڗ > ́E~́Eâ >^́E~@́Eʹq#x q V6E;Fq? ` 0 : ́Eʹq0o&ͧGy w` Xc >́Eó !y # 7́E>Ͱ>ͭc ́E76Ev><E:vc G!vwqc ́E_Ac ́E͗D6E>2Aw> ́E:Aw0́E>:́E> ́E:Awo&))))))Kw*Eʹq:Aw<2Aw ^ 6EͷFqʹq?´ M Xc 0  2Awo&))))))IwK6Ev>=E:vM !vO ~  6+:v=2v :vG!vqM "EM !"( !%q!(7 !,q!<AG !?q!0^ !4^ !8q o > >^@Ô ́E6EͷFʹqqYc 2:vy.:v  6EͷFʹqqY >ͭ>ͰͿ r r >2Bw:v G ͼ *Cw~#"Cw ^ *Cw~#"Cw ^@*Cw~ #"CwqE: >2Ew NF 2Ew Wf ! Q ́EW-Q L ~#"Cw 0 !Kwʊ @=… "Cw P¸ ~#"Cw0 § > !d=­ Q T*Cw~#"Cw ^ ~#"Cw 2Fw͉  r r 6E 2/~́EW-:/~͆ ̓20~ ́EW-:0~G:Fw*0 ! :BwW W͌Ij2Bw:He r};FG:vxq2/~!vc !vš>ͳͼ‹>ͳ}!v;F!Kw"Cw! #*Cw@"Cw±>2Bw2Ew}:v:/~!v8}:1~O:v!v:/~>2Hw82Hw}:1~A#:v@:/~́EW- @:v@> ́EW-:/~͆:Bw`:Ew`́EW-@:1~O}:/~ }> ͱ́EW-͉@̓20~@G @:1~Oʼ:vʼ!v:0~¼>2Hw82Hw@:v:0~!Ky"Cw>2Bw2Ew@:v:0~q20~G:vxāEW-:0~ :v:v> āEW-:1~O@:v@:0~ͱ @> ͱ:v> āEW-:>Ͱ>ͭ6E:1~Aʗ%6EͷFc ! 6ʝ6EͷFʹqqYʝ7c$ͱæ͌ڵ͆*6~"8~ r r͉ *8~#|+ͼ+"8~|7̓:vʏ7"6~OFFON HALFFULLNONEODD EVENANSORG{MAIN MENU} G - Go Start Communications H - Hang Up Phone I - Enter Site ID L - Load Parameters from Disk File S - Save Parameters on Disk File Sub-Menus: P - Parameter O - Option U - Text File Upload D - Text File Download B - Binary File Xfer M - Macro Definition C - Command Processor F - Character Filter X - Exit to CP/M {Enter option (? for help):} ${MACRO STRING DEFINITION MENU} $ X - Exit to Main Menu {Enter option (? for help):} ${UNWANTED CHARACTER FILTER DEFINITION MENU} $ X - Exit to Main Menu {Enter option (? for help): }$ n: XXH = $Awaiting Carrier (ESC to abort) ${Carrier Detected} $No Carrier Detected ${Carrier Lost} $Illegal Option ${SYSTEM COMMAND PROCESSOR} Enter command, HELP or ? for details: {Explanation of symbols used:} {d:} stands for a drive name (A:,B:,etc.) {afn} stands for an ambiguous filename, for example: *.ASM, F*.*, etc. {ufn} stands for an unambiguous filename, for example: FRED.ASM, MITE.COM, etc. {$att} stands for a file attribute, which may be any of the following: {$DIR} - make file visible in directory {$SYS} - make file invisible in directory {$R/W} - make file Read/Write {$R/O} - make file Read/Only Type to return to SYSTEM COMMAND PROCESSOR{Command Error} $ Type to continue, X to exit to Main menu:$ Enter new value: $ Enter new ASCII character: $ Enter new phone number: ${Illegal Value} $ {Enter Filename:} ${No Directory Space} ${Filename Error} ${No Such File(s)} ${Unable to Close} $Capture complete. Now closing file ${Warning}... Carrier still present. Hangup (Y/N)? $Awaiting Incoming Call - abort with ESC $ Capture Buffer Reset to Empty $ {Not in Capture Mode, request ignored} $Now resuming previous call $ {*** Capture Buffer Overflow ***} $Transmission Complete $Now Dialing: ${There is already a file with that name.} Overwrite it (Y/N)? ${Maximum Error Count Exceeded} - Try again (Y/N)? $ {Send operation aborted} $Attempting to Synchronize $ Enter New Macro String: ${Receive Aborted} $File Received ${Timeout} {Send Aborted} $File Sent $ Are you sure (Y/N)? $Resuming Link $ {Disk Full} ${Invalid Parameter File} - Load aborted ${Warning}... old parameter file $ Enter Site ID: $Site ID = $nnnnn Compare Errors $The following special characters are available: @W Wait until no chars for 1 second @Pi Wait until no chars for "i"/10 second @Tn Trap on ASCII character "n" @E Turn on wait-for-echo @N Turn off wait-for-echo (default) @Li Link to Macro String "i" (0-9) ^M Carriage Return ^n Control character "n" If Macro String 9 is defined, it will be automatically sent once the connection has been established. If Macro String 8 is defined, it will be automatically sent in response to a Ctrl-E in TWX mode. Abort macro string transmission with ESC Type to continue$Type to continue${Insufficent Memory} $ {Macro String abort} $2> >2y2:<))06EͷF!:O͇6EͷFq2:O!͇:lgyKʹq: E͑2G~ʅ}####m#N#^#V7yO ^#Vy2ҥ06EͷF!~:O͇BK<~4b<~͹b́E÷<~b:6EͷF<~>!j~vb<7ɷ!<~Tm>2<~b7ɯ2!~<~͹bw# x<~b For the interactive help feature to work, MITE.HLP must be on the currently logged disk. - Press any key to continue -$MITE.HLPN 9!t"##$3$T$$$$$$%G% For help on a particular menu option press the letter of the option. For general help press "?" : $ MITE supports a variety of binary file transfer protocols. For more information press the letter of the protocol:$ Help is available on the following topics: A - General use of macros B - Special characters used in macros C - An example of macro usage D - Another sample macro Which topic interests you? $ Help is available on the following topics: A - What does the character filter do? B - How to enter a character to be filtered Which topic interests you? $ Help is available on the following topics: A - General information H - Ambiguous file name expressions B - Copy file I - Reset C - Dir J - Set file attributes D - Drive K - Size of file E - Era L - Space left on disk F - List M - Type file G - Ren N - User Which topic interests you?$ Help is available on the following topics: A - General information H - Menu of additional commands B - Append I - Protocol C - Buffer J - Read D - Capture K - Receive E - Echo L - Screen F - Exit M - Send G - Macros N - Write Which topic interests you?$GHILSPOUDB M C F XP?TTgBDPSRMANIHXS?UEMBKRCLTD Q!XS?VU"D#E$H%T&G'XS?WC(I)A*W+R,P-T.F/Q0S1XS?XP2S3R4XSCZ?YC5H6I7M8T9X:B[A;B<C\D]A=B>A?B@CADBECFDGEHFIGJHKILJMKNLAMB^CND_E`FPGaH IbJcKdLRMeNf?gVhBiCjNkMlHmIn͗D:v+ ҏ%5:v6E>Ͱ>ͭ::1~O&>ͪ*v͞6E>Ͱ>ͭ͹͛% rʷ% rc ÷%>ͭ>Ͱ>ͪ& rѷ& r&>Ͱ>ͭc ͹z%>ͭ>Ͱè%͹:v:'6E̓̓̓!'"*^#V#"z:&͞"v@&!'ڗ% z&͉@&̓n&>2Hw H6Ew*Eʹq:vʪ&;(:vaqA(c  (6E2Hw> ͱ́E> ͱ́E::w<2>ͪ>Ͱ>ͭ>Ͱ!H~ &#& '͹6EH*Eʹq!HͶ6Ez' rѷ-' rm'dͼ yH'͉0'̓́E0'z'"E>Ͱ>ͭ!5c ͹&>Ͱ>ͭc >Ͱ͹6E:v²'!y~: :"Cw>2Bw2Ew͹: ͹>ͱ!'́E'ʹq!>2yã*,X` %Incoming Call Answered -- Detecting Baud Rate $Remote Trigger Character = XXH = nn $́E͗D:v/ :w:/ :v/ :v/ :v0aq:v 0c :v+0aq:v10c .6E;Fq?°(́EF(C*)́E:v#):v)6Ev>PE:vF(!v|Tm(,"EF(|!-|>jF()"EF(>2v!"-~>2vF(2vF(I?)́E:w2wF(FT)́E:v2vF(Pi)́E:v2vF(Qz)́EͧG2vF(R‘)́E!"-~"EF(S¢)́EͧG2vF(W´)́E2y.F(A)́E>2y.F(T(*́E>2*-~DM!yOxGx*~#́E *:<2*>2ͷF*F( )ʹq6EͷFF(Xc >́EÚ("EF(́E͗D:v0 :v0 :vC1p:v1aq:v$1c :v0po06E;Fq?–*́E>*U“,́E>2y!"!:y*6Ev>PE:v>*!vyTm*,6EJ-y!z>vb*?6EJ-2:Hw22Hw r+ r\,͉D+̓D+! ND+3+!y͹b\,2/~:v_+:/~2/~:vn+:/~ +:/~ †+:> †+> ͱ> :vGʖ+ͼÌ+G:vxq2/~ͱ>2:v+:v++\,+!/~+*#"+:/~́EW-:/~ +2:v,,\, +> ́EW-:v6,! N6,́EW-!v#,!:v2: +=2B,́EW-B,:2Hwyb:vʁ,*T qʹqT6E:2Hwʹqy6EJ-G,́E6Ev>PE:v>*v~qA-|A-}2v>*T,́EͧG2v>*D -́E6Ev>PE:v>*v~qA-|A-}2v>*E-́E:v2v>*H4-́E:v2v>*Xc >́EÀ*"E>*!2Hw::vd-q:vw.*-~Î-w.w.w.w.w.w#"-~*}o|g«-R6E2v>:2|->*2:vc.*-~*r|c.-}c.:vͱ!,. -20~́E*-~w#"-~*|.}.R6E2v:v-:0~q-*-~}O|G|!xL.~͍c# >.!"-~!:vͱ w.:ww.:́E:v‡. "E*-~}O|G!|xʧ.~͍c# Ù.:.|9d.S"Eg6E|wpʹq ͹2v2v!"-~{TEXT FILE DOWNLOAD MENU} C - Capture Mode = XXX I - Capture Indicator = XXX A - Append Captured Data W - Write Captured Data R - Reset Capture Buffer P - Printer Echo = XXX T - Type Capture Buffer F - Flow Control = XXX Q - Flow Start Char. = XXH = NN S - Flow Stop Char. = XXH = NN X - Exit to Main Menu {Enter Option (? for help):} ${TEXT FILE UPLOAD MENU} U - Upload Text File D - Interchar. Delay = XXX E - Await Char. Echo = XXX H - CR/LF Handshaking = XXX T - Turnaround Char. = XXH = NN G - Garbage Char. Count = XXX X - Exit to Main Menu {Enter Option (? for help):} $́E͗D*vN5 q:wo&v qv!6w#w:v72p5:v5- !H16q!l6q!g6 q:v5L :v125:1~5< 56E;Fq?2Â1Xc BH2́E6Ev>PE:vʂ1v~qT3͞T3"vÂ1D`2́E:v2vͤÂ1Mu2́E:v2vÂ1NŽ2́E6E!H4Â1Pª2́E:v<ڡ22v͡Â1S2́E:v2vͧÂ1R2́E:1~A2>A21~Â1>O21~Â1H2́E76E!g 4Â1I3́E66E!4Â1AL3́E86Ev>PE:vʂ1v~qT3|T3}T32wÂ1>́E1"EÂ1́E͗D:v8 :vM7aq:vS7c :vr7aq:vx7c :v7aq:v7c :v7aq:v7c :v7aq:v7c :v(8 :vH8 :vh8 :w8  76E;Fq?4́E]3Xc C 4́E:v2v]3E44́EͧG42v]3MH4́EͧG42v]3B\4́EͧG42v]3Lq4́E:v2v]3T†4́E:v2v]3Kš4́EͧG42v]3R®4́EͧG42v]3D4́E:v2v]3Q4́E:w2w]3>́E3"E]36Ev>PE:v56 #5!v~5#5{PARAMETER MENU} B - Baud Rate = XXXXX D - Data Bits = X P - Parity = XXXX S - Stop Bits = X R - Role (ANS/ORG) = XXX M - Mode (Duplex) = XXXX A - Auto Redial Count = XX N - Phone Number = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX I - Modem Init String = XXXXXXXXXXXXXXXXXXXX H - Dial Prefix = XXXXXXXXXX X - Exit to main menu {Enter option (? for help):} $ Enter initialization string: $ Enter dial header string: ${OPTIONS MENU} E - Escape Trigger Char = XXH = NN M - Macro Trigger Char = XXH = NN B - Break Trigger Char = XXH = NN K - Local Command Char = XXH = NN R - Remote Command Char = XXH = NN C - Caps Lock = XXX L - Auto LF after CR = XXX T - TWX Mode = XXX D - Direct Connect Mode = XXX Q - Expand Tabs to CON = XXX X - Exit to Main Menu {Enter option (? for help):} $ Enter Auto Redial Count: $F=:Hw8a=6Ev>PEKE:vʹq!g9v C9C9q#O9yP9##~ 99v͐dʹq> #OC9(9[9 P9~#fo^6ECAPT+;APPE;WRIT;ECHO;EXIT!;MACR;READE:v!v:Tm;!(>vb;?"E>́E>2H,6E:Hwz `9qO`9qFC;2vN`9:vœ;6Ev>PE:v!v|Tmv;,6E|!-|>j‘;6E>2v!"-~>2vɯ2y.>2y.qO`9qF;2vN`9>2v!Iw#~#:́E> ́E~́E# ;ʹq@x ;ʹq>2yʣ*yTmң*,6E>2yʍIyTmҍI,6E>2y JyTm J,6E}=6EͷFqSŠ<ʹqʹqZA͐dLœ<ʹqʹq=6E?ª< ʹq>́Eʹq*-~}o|g;A q*}o|gHA q A6E:~q`9}2:=2<qO`9qF=2vN`9>2vqO`9qF;=2wN`9>2w {Local Command (or ?): }$ {Remote Command (or ?): }$Enter L for Local command options, S for System command options, ? for detailed descriptions : $ECHO ON Turn printer echo on ECHO OFF Turn printer echo off CAPTure ON Turn capture mode on CAPTure OFF Turn capture mode off CRC ON Turn XMODEM CRC mode on CRC OFF Turn XMODEM CRC mode off APPEnd Append capture buffer to file WRITe Write capture buffer to disk and close READ ufn Read disk file and upload it PROTocol Check/select binary protocol SEND ufn Send file using current protocol RECV ufn Receive file using current protocol MACR List defined macro strings BUFFer Print capture buffer statistics SCREen ON Allow incoming character to display SCREen OFF Disable console on incoming characters USE ufn Get "console" input from file EXIT Exit to System (Local command only) $Number of bytes captured = nnnnn out of nnnnn available $HELP6Ev>PE:v7!vyTm҈A,"E7:y ›A!Dyqy!z>vb¶A?"E7y͹bMA"E7͹bG>A"E!͹bw#A͹bg͹bo"v͞͹b2v͡͹b2vͤ͹b2vͧ͹b2v͹b2v͹b2v͹b2v͹b2v͹b2v͹b2v͹b2v͹b2v͹b2v͹b2v!w<͹bw#aB͹b2v͹b2v͹b2v͹b>OʇB>A21~͹b2v͹b2v͹b2v͹b2v͹b2v!y ͹bw#­B͹b2v!g ͹bw#B!Iw͹bw# xB!H͹bw#B͹b2w͹b2w͹b2w͹b2wb́E6Ev>PE:vc !vyTm6C,"Ec :y IC!Dyqy!z>jc hC"Ec y>M͍c>͍c!~͍c#€C*v|͍c}͍c:v͍c:v͍c:v͍c:v͍c:v͍c:v͍c:v͍c:v͍c:v͍c:v͍c:v͍c:v͍c:v͍c:v͍c!w<~͍c#C:v͍c:v͍c:v͍c:1~O>D>͍c:v͍c:v͍c:v͍c:v͍c:v͍c!y ~͍c#:D:v͍c!g ~͍c#ND!Iw~͍c# x]D!H~͍c#mD:w͍c:w͍c:w͍c:w͍c9dc PAR ECE H6E:vʰD!HüD!HڼD!HDHq*-~}o|g^H q*}o|gdH q:vuH DH6EKE|H6Ew*Eʹqʹq! F# E~#́EE6EùSE*E$SE6E>{SE>}SE{cE:Hw!:pE}E:Hw!@F#~́E#sEG:wxʥE ¥E> ́E:;~•EE ±E!;~5ûE »E!;~6Or!;~4:HwE:vE:5~EEͱO;F25~ }FFE ͋FE+FE ͣFE;F>#́EʹqMFQFMF͋FAFEsF>#́EʹqH oFͣFcFEͣF Eʹq25~x͑F >́E> ́E>́E ҁE>^́E@́E;F́E:BwF £G:HʄG͹brG F@HG͹b@ZGqDG͹b0 FFO ͹ GMF͹b0 F@!Kw2BwF^ZG͹brG^ZG:vnGGnGͼdGãG>2Hb rʣG rʑG rãG:HwʄG͉҄G̓6Ev>PE:v G^G:vG0G:Gv~q}ɷ rG rH;FH͉H̓G7HMITE v2.75 - Copyright (c) 1983, Mycroft Labs, Inc. $XXXXXXX. Bytes Captured = nnnnn/nnnnn. Capture = XXX. $Site ID = $DIRECT ONLINE OFFLINÉE͗D:vo&)))MKq:wK KK6E;Fq?H́EÝHCH́E:w<2wÝHPƒÍEʹqL6EͷF ʝHq?IHʹqC,I>2vÝHH9I>2vÝHIFI>2vÝHMSI>2vÝHT`I>2vÝHXmI>2vÝHBzI>2vÝH"EÝHSJ>2y/K:v£I>2CMI²I24~TII>24~TIIEXII.ZII,]II>2CMI2Hw6E:R}J>2y/K:v J>2CcPpJ/J24~͚UpJ?J>24~͚UpJJJOYpJUJ[pJ`J_pJpJ>2CcPpJ2Hw6E:X…Jc >́EH/KL6E;Fq?«JÍJ ʴqCJ́Eʹq>2vHJ́Eʹq>2vIJ́Eʹq>2vMJ́Eʹq>2vTḰEʹq>2vXḰEʹq>2vB'ḰEʹq>2v>́EÖJ:vo&)))MMqtM6E{BINARY FILE TRANSFER MENU} P - Protocol = XXXXXXXX C - CRC option (XMODEM) = XXX S - Send File and Return to Link R - Receive File and Return to Link X - Exit to Main Menu {Enter option (? for help):} $Now Sending $Now Receiving $All Files Sent $All Files Received $Checksum Error $ X - XMODEM (Single) B - XMODEM/B (Batch) C - CLINK & Crosstalk H - HAYES (Smartcom) I - IBMPC Async M - MITE Multi-file T - TEXT (mainframes) Enter new protocol code or CR for no change (? for help): $Unknown message type $Current Protocol is: XXXXXXXX $XMODEM CLINK HAYES IBMPC MITE TEXT XMODEM/B>2F:yN6Ev>PE:v9v"-Fn6N,6E:v2(:v2):v2*>ͤ>͡>ͧ2yy9"-o*-"+IN?6EOXS:Hw2>2Hw*+~Oyq"+y!z>vb:CP/6E>dRO>2/4L6Eywp:FS6Eʹq rN rN>ͱOy!0͹bڜOw#N:/<2/>26>ͱ:/ͱ/ͱ>2E!"G!0~ͱ͡S̓S#O:F"O:Eͱ-O*G|ͱ}ͱ!'FOʃO>T́EcOSO>.́EëN‘O>ŔE҈O:6<26 N6EͷFʹqqYN>ͱ6EOʈOͫSN>2=ʹq!':=ͱҿOڪOOªOybS6EVN:CO>dR>ͱ>ͱ>ͱS6E!ʹq:(2vͤ:)2v͡:*2vͧ>dR>ͱ!y >2E~ͱ͡S7P#.P>ͱ͡S!E>^P>uͱ>2J:w2FwP>C2J:v2(:v2):v2*>ͤ>͡>ͧ:Hw2>2HwXS:CP:yP6Ev>PE:v!vyTmP,6E!ͪRڂRʂRAL6Eywp:FS6Eʹqy!z>c>2//6E>2I:Jͱ!'dQVR>T́E҈R:I<2I#Q>2J>2FT6E#QʁQgR|Q6EgR>6R!6R27/G6R>6R>2E!"G!06Rw͡S̓S#®Q:FQ6R!ECRQ6R̓S6R̓S!G~#CR:7G:/R=.RVRy!0~͍cR6EVR# R:/<2/>.́E>ͱ)QVRͫSVR>ŔE>ͱ҈R)Q>ͱʹqf6EÈRʹqS6Ey9d>ͱ:CPS6E:(2vͤ:)2v͡:*2vͧ!>#Sد2y!y >2E͡SRRw#>ͱþR:Eͱ72D!SSCS:D=2DR6E7>2F2D!:Jͱ=SVS2SC2S:D=2D,S7!I!yg)sS|g}!ogSr$s%# ]S*GO!I ~W$^"G!Ew!ñSFile Sent $All Files Sent $File Received $All Files Received $ - using CRC$Switching to checksum $:yMT6Ev>PE:v!vyTmMT,6Ey!z>vbfT?6E:v2(:v2):v2*>ͤ>͡>ͧ:Hw2>2Hw28>2/:8^U!"2y!0͹bTw#*2#"2 x°TT>28*2|^U rT rT6E^U>29V0WU>ĆESU*8~|U>T́ET::iU9U>.́E:/<3U2/ÚTNU>ŔE:9^UT>ÚE>29VT>29VTybʹq6E!:(2vͤ:)2v͡:*2vͧ:yU6Ev>PE:v!vyTmU,6Ey!z>j:v2(:v2):v2*>ͤ>͡>ͧ:Hw2>2Hw>29 r!V r!Vf6EãV0W/V>ĆEfV*8~|GV:9V>T́EfV::WV>ŔEpVʣVvV>ÚE>mV>29VV*4DM!4yxʛV~͍cҖV6EãV# ÁV>.́EkV>29Vʹqz6Ey9d:(2vͤ:)2v͡:*2vͧ>ͱ!";:9*WW*2|*W}*W:4~W:/*W>*WDM!0~*W# xW>*W*;|ͱ}ͱͱX! MW8W!"8~X!X2:¨WXgXo"4DM:4~ʁW2/XW!4Xw# xWX XXWX_!";::XW*4|X}X:4~W:/X>XDM!4~X# xW>X*;{ Xz XX!7!G*;g)4X|g}o"; AXxG!X:ytX6Ev>PE:v!vyTmtX,6Ey!z>vbŽX?6E:Hw2>2Hw!`/6EҸX/Y"E/Y¤X>ͱ rX r/Yy!0͹b/Y Xw# XX!0͉Y̓9YY͉ Y̓ Y~#ͱ X>.́EX>ͱ> ͱybʹq6E!:y~Y6Ev>PE:v!vyTm~Y,6Ey!z>j:Hw2>2Hw/6E>ͱ!:һYZ>T́EÝYYY6EZ!!0Zw#Z Y>ͱ!0y~#͍c Y> ͍c>.́E>ͱY>ͱ> ͱy9dʹqz6E:yaZ6Ev>PE:v9v"KFnrZ,6Eɯ2yy9"Ko*K"MˆZ>ͱ?6E:v2(:v2):v2*>ͤ>͡>ͧ:Hw2>2Hw̓̓̓!/6EZq[>ͱq[ZZ!'*M~w[y~#Z"My!z>vb>ͱ!y ͞[q[4L6Eywpʹqy!0͹b`[w#<[>ͱ!0͞[q[>.́E4[>ͱybʹqüZ6E>ͱPL6E:(2vͤ:)2v͡:*2vͧ~#ͱO¢[ͱ[[Þ[[>ÚE7:v2(:v2):v2*>ͤ>͡>ͧ:Hw2>2Hw̓̓̓!`/6E\\>ͱ!'\\(\!y \2yy!z>c`\\AL6Eywpʹq>ͱ\Š\6E\ʗ\>ÚE\!0\\y!0~͍c#ª\>.́E>ͱt\y9dʹq \aL6E\>ͱ:(2vͤ:)2v͡:*2vͧ#]w#O\O ]>ŔE>ͱ\\:y[]6Ev>PE:v!vyTm[],6Ey!z>vbu]?6E:Hw2>2Hw2W͈_ڔ^y!0͹b{^ ʑ] ʬ]w#xڑ]6x2S:W02a:SapE_*Oa q!a~ ]>0w#]!ȯ a͝_ڔ^]:S0G͝_ڔ^^> ͝_ڔ^^ڔ^!ȯڔ^qR"^ڔ^q2Uk_ڔ^w_ڔ^^:UAn^:W< c^2W>.́EÃ]Xʔ^>ŔE]>E͝_> ͝_ybʹq6E!:vGʬ^ͼâ^:v^:v^^^7?7:v!^7 ^7?:v_! N _C__́E!v^!:v2T:T@_=2T:_C__́E_7?7!a^_:SG0^_"Ooe_$^_ k_:v |_ rʛ_ r›_7ɷ2V͉__!´_!ȯ:Vͱͯ^͛^:y`6Ev>PE:v!vyTm`,6Ey!z>j:Hw2>2Hw2X!ȯ>R͝_ژa>A͝_ژa> ͱژaw_ژa!ȯ!D"OژaqEʉaDN`͵aژa02W͵aژa }`>00yOOOp`y2S!ژa ¦`>00)DM)) oҶ`$—`"Q:SO!0y`͵aژaw# `6k_ژaw_ژa^ژa*O:Qa:Ra:WG:X:a= a> VaØa>R͝_ژa>N͝_ژa> ͝_ژa^ژa>ŔEB`!0y~La#͍c@a> ͍c> ͍c>R͝_ژa>A͝_ژa> ͝_ژa^ژa>.́E:X< ƒa2XB`y9dʹqz6E!ͱ*OoҰa$"Oa*Ooa$"O7?7D >2:*>2>2:*>2>22*>2>22*>2`i)|! Zb! wy! w!*6#6!'6!,w! 6! 6!*6#6`i)|!&w!'6!$q#pb!*~#b6rb!(N#F p+q!*N#F p+qb!,~>b7!,wfc! 6! 6!*6#6`i)|!&w!$q#p!(q#pocsc6Eoc2cDisk Full - Job Aborted $րc©c.d_.d=3d=»c_.d=c c :c<2cc.d!c4 c2c> _.d=3d.d!*~#fo)|!&ds3d!(N#Fp+q!*N#Fp+q7!,~Td>͍cKdsmdpd6EUnable to Close - Job Aborted $"Ì"nj!d6 # d!dd dqw#¬d5eɌ<~d#=d dd!ɌiTm~d#d!yTm!?edO#e ,e##~ e5e;e^#Vj6ECOPY eDIR fDRIVEfERA fHELP ygLIST gREN gRESETgSET gSIZE iSPACEiTYPE ,jUSER ]j!yq!C>vbej6Ei!>ceMk6E͹bei͍cebi9dfbk6EɌf:!f!f!fq2uh*Ì"Ō2*Ō~f ~f*Ō~Sf:<@́E:*Ō ~hf>x́E*Ō #~́Eyƒf> ́E qfGʴq:ʦf> ́E>|́E> ́E*Ō"Ō:<23fʹq/f*Ō"Ō3f:Ĵq*.*:ifDvÁEôq=_:q2h*Ì"Ō*Ō~mgiq:r`g:s`g>2iwp:QOg>?́E> ́EͷFqY]gik6Eʹq*Ō "Ōg:j6Ek6Ei!>vb™gj6E͹bڭgqG™g7vbigj6E!iyFwx# gij6E _ͅjhtk6E:z$:h!@h{qO#h 5h##~h:h^#Vj6EDIRUhSYSqhR/WhR/Ohh*Ì~h ~w\hh*Ì~h ~wxhh*Ì~h ~wÔhh*Ì~h ~wðh*njMDɌ*ÌFnhk6E7ɷh*Ìtj6E7*Ì~iqiiwpʹqhͅj#itk6EɌ8i:@i@i!fq2h!"*Ì"Ō*Ō~iiq:si>2iwpi###~#2~2 *: O :G}jŸi:=ʳi)ëi*"!k q!k6E*Ō "ŌVi:i*>k q0k6Ej6Eͅjitk6EDv2:ij=_͕tj qj6E:_i!>vbEjj6E͹bYj́EGEjôqb:j0pjpj _0́E>?́Eôq|g}o }No such file(s) $All files? $Filename conflict $Attribute error $System Command Error $nnnnnK Bytes Available $Filename Error $ erased$nnnnnk Bytes $Total size = nnnnnk Bytes $No directory space $Unable to close $Not available on this DOS $Available commands: COPY new=old copy one file to another DIR afnx list files in directory DRIVE d: set default drive ERA afnx erase file(s) HELP print available commands LIST ufn list file to printer REN new=old rename file RESET make all drives R/W SET afnx atr set attribute on file(s) SIZE d:afnx display size of file(s) SPACE d: display space remaining on disk TYPE ufn type file to console USER n set user number $կ > *n~"n nm#`m> *n ~q"n#:m"!!1nO#—myʲm#~m*!üm~*!nmnm.m "n="n*m>?*n|m|m&n! ~q"n# "n="n*n>?*n"nm&n7*nCONRDRPUNLSTNUL"i"k6`i"eDv<2o>+2m2h2n!#ʣnO:ny‰n+ʣn-ʣn"™n:n/2nqnw#qno6!#8Tmo:8n:o28n2o2D*eono6E8wpʹqóo2g:m-Lo*eʳo*k~,o# O# o #o####n!n*iw#2o"i6:h<2h*kn*k*e~ʲoʦo# #Oio Ÿo! ~#€o:h=2h*i "iPoUo ~Poo2mkn:h7No files match $"p62r2spq6>2r`pDv2tOp=p_>2s`po&)))))F*pp#w#Cp"p6!r4*p:spp:t_:rpˆpp<@́E>:́E ́Ex¤p>.́E”ppրO!p ~#́E¸pCON:RDR:PUN:LST:NUL:dp ppq py0ů2u'8q8qd8q 8q>2u8q}o|gHq;q zXq:u> ]q02upqpq yq0ʈqqq0 v:گuBfuOʇuQʇuDʯuHu v> ́E> ́E_~#qa{ G|q}x+++*r0~#qqqqqqqqqqqqqqqqq!'~Brրښr•r!$N#F>x!(q#p?   o& ##6 #6 !*w#6s>s!&~2z!$N#F!(q#p!"x "v*vr!'wr*v "v*x "x!z5¼r*xDM!*q#pxs>s! ~2! ~2~!$~#fo"{"!,F!*~#foxMs )|2}2ʜsDv2ks=_*{ʋs{t6E*{ "{!}5ks:_!*6#6!$N#F!(q#p!,~pt2:~! s>2! ~2:~w! ~2:w*"{:2}ptut*{ut#5t"{!}5"t:pt! :w! :w>Disk Full - Job Aborted $##~#2##^#V#"!" OyOt* #" tO*+"|»t* :)=to&"!" !* #" u# u7.uO~q#!u **#"qu *+* #" qt"vvqBv0 v v)oiu"vvqOvQv0 v v)))oÊu"vvqDv0 v v)T]))хoҲu$òu"vvqHv0 v:u0vA vG v7))))ou:v}/o|/g#7!2+5v-2> q> qN#F>x!(q#p?   o& Full - Job Aborted $##~#2##^#V#"!" OyOt* #" tO*+"|»t* :)=to&"!" !C C TEXTP - The Text Protocol C C This program is designed to run on a mainframe or minicomputer C and interact with the TEXT protocol in the MITE data communications C package. The protocol allows verified transmission of data into C environments that ordinarily are unable to perform verified transfers C of information. C C Because of the extreme variety of systems on which this program C may be implemented, this program is only a starting point. The C checksum routine will need extensive modification if the mainframe C is not using ASCII representations. The input/output will need to be C modified in most instances. What this program is intended to be is C complete documentation for the mainframe side of the protocol and an C aid in implementing a version in a specific environment. C C This version of TEXTP is written in Microsoft Fortran under CP/M-80. C C Developed October 1983 by: C C Donald Waldo C Mycroft Labs, Inc. C P.O. 6045 C Tallahassee, FL C 32314 C byte ifn(11) 5 write(1,10) 10 format(' Send (1) or Receive (2)?') read(1,15)iopt 15 format(i1) if((iopt.ne.1).and.(iopt.ne.2)) goto 5 write(1,20) 20 format(' Enter Filename') read(1,25)ifn 25 format(11a1) call open(5,ifn,0) if(iopt.eq.1)call send if(iopt.eq.2)call recv endfile 5 goto 5 end C C C C C Text file protocol - Receive C C This subroutine receives a file using the TEXT C file protocol. C subroutine recv integer*4 n,ick1,ick2,icksum,iconv,ick3 byte line(150) data iE/69/ iA/65/ iN/78/ iX/88/ C C Initialize expected message number C msgnum=0 C C Main loop - read lines and verify them. C Each line transmitted by MITE starts with a 'D'. This is followed C by a 1 digit message number which helps improve error detection. C Following the message number is a 3 digit count of the number of C data characters on the line. This is followed by a 5 digit (16 bit) C checksum. The checksum is a 16 bit sum of all characters on C the line not including the checksum itself. It is computed C by summing the ASCII representation of the characters and C ignoring overflow. The checksum is followed by the data characters. C 30 read(1,12)line 12 format(150a1) C C All done if 1st char = 'E' C if(line(1).eq.iE) goto 900 C C Aborted if 1st char = 'X' C if(line(1).eq.iX) goto 900 C C Get no. chars on line C n=iconv(line,3,3) if(n.lt.0) goto 40 C C compute checksum and verify against received value C ick1=iconv(line,6,5) if(ick1.lt.0) goto 40 ick2=icksum(line,1,5) j=n ick3=icksum(line,11,j) ick2=ick2+ick3 if(ick2.ne.ick1) goto 40 C C Verify message number C ick3=iconv(line,2,1) msg=ick3 if(msg.eq.msgnum)goto 34 if(msg.eq.msgnum-1)goto 36 if((msgnum.eq.0).and.(msg.eq.9)) goto 36 goto 50 C C Line is good. Write to disk and acknowlege. C 34 k=n+11 write(5,35)(line(i),i=11,k) 35 format(150a1) msgnum=msgnum+1 if(msgnum.eq.10)msgnum=0 36 write(1,37) 37 format(3h RA/) goto 30 C C Something went wrong. Request that the line be retransmitted. 40 write(1,42) 42 format(3h RN/) goto 30 C C Error - abort transmission C 50 write(1,52) 52 format(3h RX/) C C Transmission complete. C 900 return end C C C C C subroutine send C C Text file protocol send. C C The data lines sent to MITE follow the same format described above. C integer*4 icnt,ichk,iconv,icksum byte line(80),line2(80) data izero/48/ iblank/32/ iA/65/ iD/68/ iN/78/ iX/88/ C C Wait for OK from micro before sending first line. C read(1,20)line msgnum=-1 C C Get line from file C 15 read(5,20,end=50)line 20 format(80a1) C C Increment message number, but keep in range 0-9 C msgnum=msgnum+1 if(msgnum.eq.10)msgnum=0 C C determine count C i=80 24 if((line(i).ne.iblank).or.(i.eq.0)) goto 30 i=i-1 goto 24 30 icnt=i C C Blank-fill output buffer C do 32 i=1,80 32 line2(i)=iblank C C compute checksum C line2(1)=iD line2(2)=msgnum+izero call putnum(icnt,line2,3,3) j=10+icnt do 35 i=11,j 35 line2(i)=line(i-10) j=icnt+5 ichk=icksum(line2,1,5) ichk=ichk+icksum(line2,11,icnt) call putnum(ichk,line2,6,5) 40 write(1,45)line2 45 format(1X,80a1/) C C Get ack or nak C read(1,20)line if(line(2).eq.iN) goto 40 if(line(2).eq.iX) goto 60 if(line(2).ne.iA) goto 60 goto 15 50 write(1,55) 55 format(2h E) return 60 write(1,65) 65 format(2h X) return end C C C subroutine putnum(num,ibuf,ist,ilen) integer*4 ipwr,num,itemp byte ibuf(150) data izero/48/ iptr=ist itemp=num ipwr=1 j=ilen-1 do 5 i=1,j 5 ipwr=ipwr*10 10 j=itemp/ipwr ibuf(iptr)=j+izero itemp=itemp-j*ipwr ipwr=ipwr/10 iptr=iptr+1 if(iptr.lt.ist+ilen)goto 10 return end C C C integer*4 function icksum(ibuf,ist,len) byte ibuf(150) integer*4 k,maxint C C This function computes a checksum as described above. C maxint=2**16-1 k=0 j=ist+len-1 do 10 i=ist,j k=k+ibuf(i) if(k.gt.maxint)k=k-maxint-1 10 continue icksum=k return end C C C integer*4 function iconv(ibuf,ist,len) byte ibuf(150) data izero/48/ iblank/32/ ipw=10**(len-1) k=0 j=ist+len-1 do 10 i=ist,j ich=ibuf(i) C C Convert blanks to zeros C if(ich.eq.iblank)ich=izero n=ich-izero if((n.lt.0).or.(n.gt.9)) goto 99 k=k+ipw*n ipw=ipw/10 10 continue iconv=k return 99 iconv=-1 return end  maxint=2**16-1 k=0 j=ist+len-1 do 10 i=ist,j k=k+ibuf(i) if(k.gt.maxint)k=k-maxint-1 10 continue icksum=k retuATCH 1 Enter disk drive (A/B...): Enter name of batch file: #@CAP##A!GGGGGGGG#CLIENTSRO ----------------------------------------------------------------- | CUSTOMER RECORD | | | | NAME: ID: | | Street: | | City: | | State: Zip: Phone: () | | | | Balance: Last Update: // | ----------------------------------------------------------------- 򠱮 ҮƠ宠 Ү @ CUSTOMER NAME 0@ID@ADDRESS@CITY@STATE @ZIP4@AREA9@PHONE,  x$888888.99BALANCE,: @MO= @DA@ @YR Ү @ CUSTOMER NAME 0@ID@ADDRESS@CITY@STATE @ZIP4@AREA9@Joe Anybuyer,ASO,321 Easy Street,South Succotash,OR,84653,303,586-6542,6635.06,08,31,82 Barney Addsmore,AUM,1A Broadway,Upper Heights,ME,19631,101,234-8976,9275.81,08,31,82 John Goodguy,GBN,49 Main Street,Benkelman,NE,67465,218,341-9191,5715.98,08,31,82 Mary Ordersbodkins,OMC,593 E. Blissdale,Mill Valley,CA,94324,915,361-9203,8975.72,08,31,82 Fred Paysontime,PCI,2143 South 50th Street,Cameron,OH,60698,411,989-3426,6876.93,08,31,82 Sally Sendemback,SRC,88 Circle Road,Roundview,CO,63986,821,443-9901,8949.89,08,31,82 ,,,,,,,,,,, eights,ME,19631,101,234-8976,9275.81,08,31,82 John Goodguy,GBN,49 Main Street,Benkelman,NE,67465,218,341-9191,5715.98,08,31,82 Mary Ordersbodkins,OMC,593 E. Blissdale,Mill Valley,CA,94324,915,361-9203,8975.72,08,31,82 Fred Paysontime,PCI,2143 South 50th Street,Cameron,OH,60698,411,989-3426,6876.93,08,31,82 Sally Sendemback,SRC,88 Circle Road,Roundview,CO,63986,821,443-9901,8949 ASOJoAUMBaZGBNJo0OMCMaPCIFr^SRCSa9CLIENTSRDTACLIENTSR$$$Automated Products,23467 Hollywood Blvd,Los Angeles,CA,90039,1111111 Business Electronics,1700 Fifth Ave.,New York City,NY,10011,2222222 Computer Devices,1455 Van Ness,San Francisco,CA,94926,3333333 The Computer Center,1555 Fifth Avenue,New York,NY,10017,4444444 Electronic Ecstasy,3218 Collins Ave.,Miami,FL,33139,5555555 Futuristic Funthings,Five-fifty 55th St.,Fresno,CA,93706,6666666 Global Gizmos,36477 N. W. First St,Portland,OR,97231,7777777 Herb's Computer Co.,1980 Main Street,Scarsdale,NY,10583,8888888 Integrated Systems,9000 Main Street,Dallas,TX,75207,9999999 ,,,,, 1,2222222 Computer Devices,1455 Van Ness,San Francisco,CA,94926,3333333 The Computer Center,1555 Fifth Avenue,New York,NY,10017,4444444 Electronic Ecstasy,3218 Collins Ave.,Miami,FL,33139,5555555 Futuristic Funthings,Five-fifty 55th St.,Fresno,CA,93706,6666666 Global Gizmos,36477 N. W. First St,Portland,OR,97231,7777777 Herb's Computer Co.,1980 Main Street,Scarsdale,NY,10583,11111112222222G3333333 4444444K5555555 6666666I7777777 8888888I9999999  99999CLIENTSRDTACLIENTSRNDXCUSTOMERDTACUSTOMER$$$40ÌD@  Copyright (c) 1978, 1984, MicroPro International Corp.  DataStar Release 1.42 ID # 612203KP-00A  KAYPRO Computer    "eP= B0B1C0C1 *2!*2  :Ie2 ͔A F ͔A*," WpBĜL=B:N?F@ y چ> ~O!*~ZdI'PPU> 6 ͨ$>2 >2 ͕8*r/~"r/<#- "r/6 :s"> : /! ~ʒ5T* ~ //~: ʑ! 4^*x/~f#~{EHͦG_ 5…͠ 2 P!I? {* ~EH1> :»Fچ §: ʾ§: >j :† ! wtچg : †!I' g!P͒ځ>Á4P: g_ 5Q:sQZ?з4 ;د: wm: !I?7ʁ: "!I' gP͞=4g=P:!I^E, Ag!I^E.9_@YNʧ͞=gP͒ҒÁ,4   9͞=g9͒#Ç* 61* @1* 61* @1O: y7>V2 > ͽ*wC~#ͽ:uf> ͽ:vʐ> ͽGc> ͽG³: ³͵ ͆H^GG{  d>_ >:d> > * ,!&5O> F#~#~  x2&y: :*x/^! sT* F >~: {: fÚ͆&=B * ",22EJL͆g̓͠ ͆!EJ~µ6W *?" *?" g! 3g<*{" 61͆ !*v/: g|g|,E0g!I?Í! ~6 !s >:: +͠ ͨ$! ~2 #s > *r/\~ A#V<6:#]++ *IͰFq ~#z> +q#! ~y5! 6* "?* "?* "{@1>@í͵gG! ~w>͵\ 2 \ \ E0b ʍ:   :s: *v/! ~8 b zĒ 7~I ͒B ~z!I?B b g! p: r : څ „ : >ʅ <*IDM*IͰFʙ =” AM >*I: ʭ *IͰF*IͰF:IG >JAɯ22 2! ~~ 3 ʶ   2 *Iͭ 2 *x/#~*c6A7# - >7g5͌!I?>7*v/|ʝ 6 -: T A͆H94z ,G; : /2 G; >2N?͆! 6>\u1" "{g59&e2 !I?m͑ *c: 6>͑  -9 >2` *cZ:¶ ! Fw_ -9 A2! Fw  !I?ö !I?> 7? 77?ɯ*y## !~GZ xd l !~l !~w A :G>22   x22 2 *y## #^#V++~ĺ  › bAx*c !:~ : ~6# w# !SͭE*:IX ͭE !ͲE8 8 !IͺE8 ͺE\ >͟? \:>G!!J >! l >*Ì \!ʌ\ *:I:IDJ*,? ",d>2]:]_d>;>) ~+^{#' ! W++^##Ny зG#N+yw*y6## =I *a͏ *a*a*x/N: G#~#F> ; ͏ :G k *a2 ͢ > ʭ Ù ʹ 2͎ʹ 1:@ F#^#V#NbA~ ##H~ # *e>2`*c *r/>G*y##:`:0:0; ͢ ͭ > > 2`I=B^EN: z!~6D!IͭE!ISF!J~IHGO#~`ڑ_w#ˆ6!L~+:>³~@## EH\~> ~N0E[E:E~#º~E!gJ >Gi#~ x EJ >z"w!s:vG:u͞HBK*w"y e?e+N#yb ^A+N# <N ;>\:>!6: 8 !"W !h͒!IF!JFN# >>  ³!]h >*,"x/+~O#"ax "t/*W: &~# x"W "Y*%"[I9{/_z/W\d>!I:O?A28J ^E͆y5͟? ;>\ >\:>I9!"W*? *?*Y"?*["?:h>þ!JF# >!I^E!6_A>!QJL *t/#DM*Y6#"c"e ʹ1DM*Y"eDM*YK0g:  u1"{2^> !"t/:@*##~=!"x/6#:w#:w*:>T> u1"*\ >:^O2G>  !~ʱ! y±:wx2!~wʱy> ~w t* >*:@*\ l*  !^4 *{@1#D!aJ$*/"}/!dJ$Ͱ/OUyͻ1B̝y1y: d>   >*}/~2gr*/!E >#h >d>!I=BͭE!>.6N!I!IͭEGOCyN_AҎ< w#ɯ>#2;J"2@J"AJ2%!I:*r/6#6*e~# 2͡ 2>2# W@͡!#~6W@G2O2k?Ҝ2#͂y"~## >":_:K " ":OK " "7 "*bA"k:Q:V: Q: ] y: *v/}:ր1: F8 ć|2~:#>2:#ͪ@: !wI: !>I: !dI!QI!~<2>16ʩ w+wʩ:w͒4!:w]?yt *%7+1jOFx,f":͖yuwf1d=M1F:jJ7xQC+2Ŀ:y*~72O7y7:m7_7!jJp!yO#+}2:_!I͂&5Bb?_jq;[|x:m!F̈́~pÖy&',# y0 5ͫyA!6JFy457#O5ͫy 7BB5b55Bya!4JK5By 7Ā5Ԁ5ԕỳʺAO!6JFN*:_L2f1:X"/7?~"'/!:L': ::::::: :@LY~::*_Fg:=p~:*S̈́F,w͝kʙ:#7c F+*:OA]Tʽ8 # ± ]TA+~8 O7 #!y_^#Vѷ9&;wUFU?2V(&(2&o*r/: M: Zo27*  b^*!#"":G#u#‡!I: ʟ!I? ڒO2J!}J ʒ!" """"" !I? ?Ғ2J!}J#I ?Òo&): ʒ""" y27: 7J!~6ͩJ: 7͡fQ͡f[~=BA͡,͒4!~5͒ܩ!~75Ò7474é"C+ҿ:G#7}*2zO:͖yVu!Og1|@X? 8+*1"`*: >2#>  ~w: ~w2* >2#<:#s2*r/>>@b~~_:#_F_ Xh:#8 #=B:#!F@ʊ¦!$6.:@ʦxw:jJ!$wҴ:#@!$ :$:jJO+Ҵ!p Fb_~Oz͖8 #zb O ~8 rZV~R8 #>ɐ8 +~R8 +^1O!G*:_+<7F]:#8 Ĵ#=˜!46.:#@161 ͏Fb8 #=~ Fb&:#8 #=_ ['6+T#Q# AT~~[>2:#r1>|:@|>2#:*DM**r«ʫ#ʟ+x8 ̀~7 #³z+«ʫ+#ë~ȹ͡Ԇx!*J:"ĕ7W@?2b_:WF#DM~.4 !\##zebW +lyZ >+la͏7_~#l_~#y_:Ͱ:2;J2@J*"02$**:Gy ~ !$On>02$$`#!$6**:GyL>0!$J?>w45YNn`#6X:2<27G~Ox:͔!0J:"Ď7*G> ?ʭ p!p$:*,711 D! W 2*:G#G>  : Ԇxʁ!:W@:` Q | \!@ j!!.J?@ ( <k?͎:͎::W >2*| 2>2#*{61* >*@1*?"r/*?"t/*:GS 5!:?>: => ] : : :.!": *?~6# 61*{@1: !0J?F Ͱ å *r/G 5!5!ɯ> ~Z! H!ɷ*#:G >*#:G7#t!D!ʢ!: ʞ!ͦ!ž!<â!<ͳ! ~w>2#] ":8"*F#:!!"$L"͈"!#&L""͈"K#:%L"#k?ԆxI"y7!2J:"X"] "7y: *eMM!p"2u"J>*v"k??k?>2O:*q#=":G_:O!L**:jJʱ"~!ʱ"" ^»"i!jJ"a# "AY}"o|"O}:"ɷWxB*x/^+~"#> !10!9"o/2'D$$%$@$$($xG$%$x$f$DMͼ%͎$t)> N#^#VbA$=$${$V$*?~ʢ$ڠ( Ò$4#DM*?*?6 6 ï$$#x~x~$y$$!$#N#^#V#$(())+l++,x,%t)G+$3%+6#^)I%y$:%$ʣ%$n%$$W$_n%"%f${͊%Gͣ%iM*%J  ҝ%ɻ{~# ڤ% ä%{2&~&l/2&͔&+%-%>2\/͔&0%%͔&!jJ&E!&e!&c(U&G&:&̈(%:&U&/2&%͔&G-_1&x4&͔&c(U&G͔&c(N&OxG{U&G!l/~h&+ Z&2]/!]/xwڑ()e/5)E)ů2\/ͱ(>@2]/>2&:&=2&~#ڔ&+-!jJ0ڔ&:Ҕ&2'ɯ :&2&&x{("'`i"'2'3%͔''!':\/'~ʨ(5:'O:]/'@ '2'~$'/<0'450'4<4O Ҩ(:\/>-':'G :jJ'ͤ''F':'ʋ'>E':' p'/<-Gy'x/ x' Gy'x0'':'!l/"'>2'2':]/ʵ'!'~ʹ'5>0!'~ʵ'5*'~'+"'t(0*'w#"'`i~A'6G>Mw͔'!:]/A<2N()T])ͤ'_:N(=2N(((:\/}/o|/g#~#Q(q#\(0 ͔&c(ɇ:]/=2]/:]/<2]/>â(>â(>â(>*o/7>7ɯ2]/!^/Z(( +T]~{( (G+~t((t(+T]t( G)#~{(({(!l/~!_/ͻ(̀()! l/ + $) ';) P'> ';)!m/~ȯw+6>+6=R)È(`i~G2\/x2]/f/#O(:\/W:]/ʊ)!f/O(ɯ' #Í)7>'w #Ù)7>'w #ì)>)2*2e/:]/W)\)!\/:*w )*t)\)!\/**O(!*:*w:*G2*xW!]/*\)r:*!f/(='*e/5):*G:\/c*f/!*͌)!f/>(͈(e/5)*)ʬ(f/!**͘)):*2\/ͪ))"j+X+!f/O(_+!X+O(!_+(2f+!_/Z(!_/"g+>2i+*j+~#"j++*X+*g+͌)*4=*t(+_+*g+͌)=*!i+5*g+#"g+*:]/ ʬ(W!\/w#zW@O+w`i#͕*)e/5)E)z@ڬ(Ñ( Wʖ(_!]/~2*,ȓ_Aw+{ڬ(Ñ(z+w>2),`i,O(2!,2e/?Ge/!,+͘)ð+͌)!!,~w:),=2),+(:l/+!f/(í+!,(í+#+ +2*,e/!!,O()e/5)E):\/‘(͎$ t),+t) W2.z\)' D,ͽ)-!A.O(2.>."/.t)\)(.\)|,}.!=.,ڹ,+å,#é,:.-t):.ʑ(ì( 2!/>A.\)+-t)A.).t)\)A.ͽ).l+ .t)2.-!.O(+/>"/.t)T/\)-!.O(.>"/.l+ .+-t):!/AO>r-/G͌-I.).+-)t)!l/"-~&|ʬ(|ҫ-}/o|/g#>2\/-^#V#}o|g-÷-*-&͈("-{¯-)'d -t)A.\)l+\d5bEHyed"BA1PYTAE(('@ A@P@@I@hfffff?hfffffA>533333>=ii<0$;9"sU':9"sU'9BT8!%8hxVg 7"hC60wYEG417Gv@`v'b1A@PX#C`QI"U&Àe(HBCTbDvRWaGv"C%T$a'ÙH%Csrb"(HdA1AT/t)7/)T/+! DM=//. +-)!"/"/"/#"/"/"/"/9"?*x/V##/2z/*?_"{/͎1*t/6#"r/6 ͎1"/͎1"/2*/"/*/"/2*?"/͎1"/*/2*3:q/T0:N?>2/"?`i"?*?"r/*?"t/6x0:?ʢ0*/͎1X0*?ʹ1"/DM*/ͪ0͎16 #"}/ w#z—0!q/~w*?ʹ1*?"?"?*/DM*}/ +'1/:?*}/'1/:"%?"'?1'1*'??1/:000*%?/1/:~# 1 1xGyO*%? +~ '1#"r/9!q/F1q/Q1G >~ >?>>~ ^#V^#V*?:q/R1_͎161͞1>>*?A0*?"?"?*?ʹ1"?}o|g2q/*?"/!͞1 >:q/2q/:>1:q/>?>2:q/@>:q//?:>?>d>(>*}/"P?;>!"/+"+?#"/T2:q/d2ͨ2/22:q/ 2PY!~_2态Ou2*? >! ʑ2*? ͞2͎1!/4#ž2!-? >6d>2!-? >*P?n22/P͎1!/~w|2"/2/+3”1*/ #3+733x>1y   "v/"/"/|+"/C4”1͟3DM_T3:z/_2/>1*/~M3`i"v/go2/8*/~2/͊3^#V"v/#:z/###)˜3O͘3 :z/O >< ڸ3=¸3 > /<3>"/>3://<*/6*/"/>*/*/"X?*/"P?*}/!/4O$4l4! 35d>T5R>F/<>"/>P4>*/*/"X?*/"P?*/!/4x4~#v44#>4͠4Ͳ4~;4y4yN#>>4y! w`i)LGyq#»4xp#ɷGyO4*P?=4"P?(5 >y/w6(555!F~w(>p͞2 >7! *P?y~(5Q5 >!6~(5 >5>y5*}/>*/>*}/>*}/(>*/>(>"!?*!?!#?4µ5!N?6!9"?¾5>"7*?!#?65:N?ľ5!#?5:/͗555:q/0%65.64!7u66C76`i"/*/"/*/"/:z/o&+!"/"/+"%?"/*v/"'?_6[6͗6u6A6"%?D6"/*%?*'?##>+?97/:ړ682/"/:/:z/DMͱ6G}l`)ȷ#!)Ҿ6 ¶6͗565G6Z:687x6w7͗565l77*/:/7!72/"/7C778>2/7*/DM:/*/`i#v/<7"/͗6*{/~<6f7ͷ87>f7*r/~==2/:/7+"/͗6"/2/8ľ5:/G*/7¸7C772/5*)?G:+??x͗5l77*/:/ 875"/2/P7͗5&8>885:/>8*/"/:/2/>*/3ľ5:/"/2/O͌8p8T8p8i8[8 k8#y 8 ~8 |7+3ľ5*/ -8>2/*r/~#<*/"/:/2/:/8F9y2/*/"/*/3ķ5*r/*/:/O 9/)9*/+"/*/%-"/O84ķ5*{/*/ :z/G#9~ʼ5~# @9*/#84ľ5*/)9!"/ͫ9"ʀ9,i9͏9 ͫ9W9>͏9N9ͫ9,i9͏9 ͫ9"q9͏9À9*t/*/?2?ʩ9#"/~ʼ59 9~ ̫9> # */#3ľ5*/*{/9*x/N#~#F#:> : 92:~: :> +#:*r/~#":=!:*{/:z/G~=S:L:>S:#@:2/*y##"[?*r/̓::~ u:# h:2/ɯO2Z?~ ʵ:*[?####~2Z?*[? "[?ʵ::+::G::Z?:0:ʵ::µ::Z?#::~ #:~~ :Z?~ ;#+͗5!;5͗5G;59:/3;/:U;.6!7u66;`i"/6:/;:/ä;2/*%?|s;;;#||;"/;:/*/8>:/*/*/"/:/2/<"/2/9*/"/:/2/P<͡<ɯgo8ľ5:/*/P<"/2/*v/*/*{/6:z/;#s#rgo <"/+"/;*/:/84>*{/*/O :z/G<*/#"/*/$,"//<8y*/:/84>"/:/<2/6K4>"/*/4>*/3>:/<3>*/:/3>"/:/<2/63>"/*}/4>*r/O*/ =yw# =K4>*/#84>*/<`=/='={= T==>,{==y=Z=G="{={=2=y='={=> {= <Z=w=,v="d=>"w͂=# 3>*/#3>*/:/͗5*/"T?:/2S?8ľ5~2R?63>5͗5*T?"/:S?2/8ľ5:R?wþ=:/͗5*/*r/~# =zʈ|g}o>y/Ox/Gd>8>>ɯA>d>Ҽ5! w\>¼5>>y Ҝ>!ܤ>>G>2O?_ѯpɷ! ~*X? >!"X?>*V??"V?ʼ52N??>d>=:]-? >p+4z{Ͳ?g?oͦB*xA:gbA?Ͳ?OF:~A=O?*OIxGF:@=gBoͦB(BB:*yA*~A:*xA*BG:uG^EAy:}A?>F͆H!|A~/w@?W@A:|A!}A<2~A}AO~#GGA >MA@?W@Aů2yA2xA@k@͑@G@!xAB_:W:G:uڦ@x:Wæ@:@*~A_:W!yA:vҫ@@2wA~ʻ@@~Oz@:wA@>:wAO{_x@@yNwk@@*xAbA"zAA:Ho]?JA:~AFAO}?_*yA:v*~A4A}*zAF 7AAF*H!A:~AOG >DM:u͞H*w|/g}/o#wM:@2HG*"8IB*,µA"8I͍H"H:@_",:cA!M!V![27I*" H"H"Dͧ!ͻC:C=B:ͪ!ͻCC<=͗GB::A=ɯ2H:H*H怮w:2H*@*8I"H"H> 2HBqB!"HKDc%.ͦB*8IB6 #rBB‰B ͌D ͌DqB*H:@Gs#=–B!ͦB2HòB͹G:H“C\U:g)C*H{BzCG:7IB*HNE͌D#BC!MͻC*a:`C|eoMFCT!VͻCJFC![ͻC:CͩCKDC:A͞HLE:A͞HgC:cQC͌D==>cĉC> ͉Ci&fC oC |fC{0O͌Dɹ0͌D,BͩC*H"H~2Hw$C"HDM͍H"H>25IF#Ny~CDC*y怶O#~CB25Iy D FD*HͦB:5I"DE͌D*DyͩDO.DBXDy*HtD*HͲBE͌DtD*H"H*H"H*H*H?yiD2H:tD>O!H4*Hq#"H:HOF:šD>OyGұDƾҸDR B*HGD!p~DDD*H~6 O#DEͯBͻC:C:E:H$E*H~w:H2H:5IͻC:C25IwEGaErE^EOͦG ȹ`.͆HG̯BEG©E*HͺDDx/óEyo`FE2HF*HB_~O#E 'F?FGDE?FEFEG̺D*H$.G̯BF#^#V#|İFE EEFFEE*HG̺DͯBF##GhF> ~FOCq#\FsˆFwxF 6xF͕F\F{*H-ͦB CͦB+*͎GƒG͗G=ŽGO=›GGy!H456*HͲB:H<2H*H"HG*H6G"HG*H~#45!HG:HH*H~6H:H6H6H_!IF~+H^{*HwG"H:*H~6#^#V#jH:@MHͦG<͍HͱHʂHͯBCͺDEHʆH:A͞H*8IogWYxҫH)¤HGFͩDH #½H BH~ #HiHHOOOOO<OOxOOOOO<OOxOOOOO<O)OxOOOOO<O)OxTZx^+  B  e K Z x <_  `'4;S[p+K[p5mm{BATCH OVRFORMGEN COMDTANDXDEF.89ABCDEFGHabcdefgh  CURSOR: ^A=prev field ^S=left char ^D=right char ^F=next field ^T=first field ^L=last field FIELD EDIT: ^G=delete char ^V=insert hole ^C=copy from previous record OTHER: ^Z=restore screen ^U=print form ^O=print data ^J=help on/off END/EXIT: ^B=end entry ^E=exit current mode FIELD EDIT: ^G=delete char ^V=insert hole END/EXIT: ^B=end entry ^N=next record ^P=prev record ^E=exit mode _______________________________________________________________________________ADD MODE current form= ADD MODE LOCATE KEY MODE SCAN MODE (D) SCAN MODE (I)EDIT SCAN MASK VERIFY MODE MAINTENANCE , PLEASE ENTER KEY /BATCH Hit RETURN to file entered data, ^Y (or DEL) to erase all items on screenw. Type any other character to return to top of form and continue: , or control E to exit the current modeHit RETURN to file updated data or ^Y (or DEL) to leave filed data as it was and begin updating another form4 Hit RETURN to go to next form, ^Y (or DEL) to remove data from filew4 Remove data from file? (Y/N) Key not found. Hit ESC to re-enter key: End of file. # continue scan: File is empty so add mode is the only legal mode.  . The file does not contain any records to match the scan mask. # continue in EDIT SCAN MASK mode. The batch file has been verified. # enter another batch name. That file is in use. # e.nter the name of a file to use for temporary work space File maintenance is completeHit ESC key to Key already existsCan't read form definition file Cannot find file . Insufficient memory Directory on d Disk : full BATCH.OVR not found End of session. All work saved, but re-start is necessary to continue. (If disk is full, first remove something).  Length of key described in this form does not match file  or its index (.NDX) file is not properly terminated. Press return.Data (.DTA) Disk : read/write failure. Replace system disk, type return. The form definition file is where the specifications for your form are stored. If you have not yet designed a form, choose a name for the form definition file and enter it here.a A form definition name is eight (or less) letters and/or numbers, optionally preceeded by a disk drive (letter A-P followed by colon). Press RETURN key to enter form name or enter ^C to exit: Enter name of form definition file (or press RETURN): The form definition file, , does not exist yet. Do you want to create it (A) or enter a different form name (B)? Enter A or B:  data file () (A/B...)  indexa Enter disk drive to use for the The data file is used to store the data entered through the Datastar program by record. The index file is used for the select-by-key option and for scanning the file in index order. If these files don't exist yet, they will be created on the drive you select. A disk drive is specified by a letter A-P. Which command would you like explained? (A/K/E/I/D/M/B/V/R/F): i0NDiNeDi0NeEnter character to select new mode: A = ADD new records K = select records by KEY E = Exit current form I = SCAN in Index order D = SCAN in Data file order M = edit scan Mask B = select Batch file V = Verify batch file R = Restore main file F = File maintenance J = Help SPACE = current modeV=VERIFY MODE is used to CHECK THE VALIDITY OF CERTAIN FIELDS IN A BATCH FILE. When the form is presented, each datafield that the cursor stops at will require either a visual check or complete re-entry. In addition, certain illegal fields will require re-entry. When the record has been verified it will be removed from the batch file and placed in the main file.F=FILE MAINTENANCE is used to ORDER THE PRIMARY FILE and remove deleted records. When file maintenance is required, e when a batch file name is requested.R=RESTORE MAIN FILE is used to RETURN TO PRIMARY DATABASE OPERATION. It is only useful when a batch file has been selected as the current file.M=EDIT SCAN MASK is used to ALTER THE CURRENT SCAN MASK. When the mask is presented, any field may be altered. Only records that match the new SCAN MASK will be displayed in SCAN MODE(S). To allow all records to be displayed again, you must delete all alterations made to the SCAN MASK.K=SELECT BY KEY MODE is used to SELECT INDIVIDUAL RECORDS FROM THE FILE for screen display. When the form is presented, entry will be required at each "key" field that the cursor stops at. When entry is complete, the first record in the file that exactly matches in the entered positions will be displayed. This search mode is faster than the SCAN MODE search with mask.I=SCAN IN INDEX FILE ORDER is used to REVIEW THE CURRENT FILE IN SORT ORDER. The commands ^P and ^N can be used to display the Previous or Next record. The scan mask can be edited so that this mode will only present certain records out of the database.E=EXIT CURRENT FORM is used to CHANGE FORMS or EXIT DATASTAR ENTIRELY. After exitting current form (using the ^EE command): to change forms, enter a new form name to exit DATASTAR and return to the CP/M operating system, type ^CD=SCAN IN DATA FILE ORDER is used to REVIEW THE CURRENT FILE IN ENTRY ORDER.!B=SELECT BATCH FILE is used to SELECT AN ALTERNATE FILE for use in all database operations. Batch file processing is identical to primary file processing with the following two exceptions: When a batch file is selected, verification is not performed in ADD MODE. It is not possible to enter verify mode unless a batch file is selected.A=ADD MODE is used to ENTER NEW RECORDS INTO THE CURRENT FILE (primary or batch). When an empty form is first presented, each datafield that the cursor stops at will require entry by the operator. After entry is complete, verification may be required unless a batch file has been selected (see SELECT BATCH FILE message). "." is the only character allowed here.  0-9, "#$%()*+-." 0-9 a-z A-Z a-z A-Z A-Z and a-z A-Z, a-z a-z and 0-9 A-Z and 0-9 a-z} A-Z} A-Z, a-z and 0-9 A-Z, a-z}, 0-9 and space are the only characters allowed here.  ignored.  : ^ Unimplemented control character Illegal character;  Not enough memory to complete calculation Result of calculation larger than destination field Fatal program error. Please report occurrence Zero divisor in calculation Exponent overflow Field is not complete Field value must lie between  &   Field does not exactly match previous entry. Please enter field twice with the same value Illegal field. Please re-enter Operator entry not allowed  DM DataStar Release 1.42 ID # 612203KP-00A Copyright (c) 1978, 1984, MicroPro International Corp. All rights reserved. ts use. The software contains valuable trade secrets and proprietary information of MicroPro International Corporation and is protected by federal copyright law. It may not be copied or distributed in any form or medium, disclosed to third parties, or used in any manner not provided for in said License Agreement except with prior written authorization from MicroPro. d in any manner not provided for in said License Agreement except with prior written authorization from MicroPro. O{_x@@yNwk@@*xAbA"zAA:Ho]?JA:~AF40*4D  Copyright (c) 1978, 1984, MicroPro International Corp.  FormGen Release 1.42 ID # 612203KP-00A  KAYPRO Computer    "P= B0B1C0C1 *2!*2  822\  21^ M2\  21!9"Y ͱ Č 1* n:>p*@ +"@ U^*D 1"@ !D :d!E :45lw75>2$*@ ~~*9Gu<9ͨ9:> #:D O<9́_ͭB ~V_*!9N6s#r*9N6*9N6:#9G *D :> 9|9!)>͚6:C 2$c6r=. ͼ=A3 /ČNẍ́ zA+3*@ :D O:=_ A` /Nẍ́ zA#`2D K^K*@ ~|¥uN —*##ͣ^#V"D K"U ¼¼:D î¼*U *@ | ~ |*@ ~|uW *~=͊ ×"U &&:D &=:O`. 0:O=`. B` [.p0! :D _~*@ ~|ʈ>*@ ̈́ Č /ͬ:G~|¨̓ #™ /*@ :D G+~|ʴ#*@ ~|ͽ ͎*@ ~|zͣ0*@ ~|̓*@ ~O͎!'9 *@ ~w /*@ ~ /:D G~$+#~w:$:O:E G͌ͣ0:E O::!+9:=w/*D $.1:/<_́!5~!E Z̈́5Kã0ͣ0:E W !)9: :O~+ *"!4K͖0!S"L!E NS!E ~Y:=wK:E J!/9:=w/!C$8!5~!D ‡5K*T]:O:G # “:/<_́]' = A !+:Ҙ =/!o9Oy/ (@!a:* *| !19w/*Y ͘"͖0Ï!39!79!%9w/!X 5!59w/:T:2Y:*+"^ ! 6 #xQ ? 6.A !"D *"@  *1&"8"9:A2828$/z{ ^#V !99y/!W 5§ 4:.!W Fw̔/:W 0*9N6wR9 38 ҋ 1ʔ/8͹/~#   ! wɷy % G= :2] _ѯp% @!SK5*8xH K5 !P5̈́ ̈́ !C9X5̈́ X5\ =/A \ i7!! ! l *Ì \!ʌ\ *88*:*,| . ", 2:_ - u ~+^{#s m W++^##Y Ny зG#N+yw*q ##N =• ?914ʃ !~6? !;9K5!5!~=9ʢ GO#~` _w# 6!~+:> ~@## ʟ Ң \~> ) ~ʃ 0ڟ [ҟ :ڟ ~# ~Ÿ !;: G #~ @ x ҟ   "! :G:<8BK* "  "$Þ 6N "$ +N#y ҽ  A+N# Î N - \ !6Ą !"J ! !] *,"< +~O# "*< ~2_ @ *: a ~# x) " "Y *S "E9t {/_z/W\ !A9:] A2$: 4=/A >2̈́ !] *A-:@g"E<8*,"< 6#"BK@ 6 # x "w#w#w#"\!>:n l \!;:n 2h G9t !"!~*< ~O~!~*}D<8BK*~*~u xF~*6,X͔\ 2h  *w,̔ x‚"\ !I9t *@ ~|uʹ̹*D ,R*@ *D :o-"D 1"@ "D "@ ~|,*D R,fy\f=!B h*D ͊ʹʹ_͖uʹuͭ~w¡!4~6WuġWru͹yͻuʹruÓ͊*D ,͊x͐_)u {OzGͬ:D O**D h͊hN (ͨy_ʹN Y͖_ʹ *~ u )*Ͳ[͞:E wT]Ͳ"6>*4>Oy[*5͐_]TN DM*}o|g# +|"ɷW*##<N ͞:[ ͭ@ͭG#_>@M/ȺKwq[[[#~+[a[ma*##ͬʗ N „ͬ y*D g͊h2w!x4:wO:xWy͊ ͣ*Z o͊7 *Fx͊u(*@ *D  ,:#o$:7|u ͥ~> ́u Ͳ{/_z/Ẃͭ  OVlJWQWyO y ڜ<Ý }O|G|}~# x²~+ x½> !>!>~w2*##ͭwN Ƀ5~!~w*##͞ECC͹OIwN '~DM*##͞k+~kwN [*@ :D G̳*D hDM*##ͫʧN • {͞+~ͣO:D O+N>B>>>B>>ͨwͭw+++> > ẃOͭ]T :T:6#x# x7?ͭzځڊpxZ!Y~ͭ<>@B> >BÐ>Bͨͣwͭͭͭ~#¼! ~ _~6O~_JLɁOQz͐:@!}8 0կ_ ́@{r#=:u x=kzBK_*$"$ ́#́+) sur#s++|r+szBKͽz*#ͥ+"ͽͲ"*ͥ"*@ ~|uͭɯ:D *@ +~#|:D <**@ #~|:*##"< w+OOG*##͐Gh##~Io&)q#pxQ>G N 0x2y!~wͭ~@~2%!9"%:W 2 %>"͞ "u"$2$Hw͊ :ͫ͑:%͏$E$3!͘"R~¢:@2}8: %͞ ͭ 6!"$!9"$!&*$ͭ@>̐#~@w:E G,21/2}8͖0:$*8!@!$4:%2%:}8g -BF&`_^#V`:c:g:o::~#foͰ!G+#~$>2$!1!=4~=5dcB>2$$bk6?#=W:$<$k>2$*$& ~:+wy|*$ͨ2$2C #~#fo"D 1"@ G~w#°!%4>>2$O  > 2$FO#%x >  :$K>=y2$F#%7 >  *>: %Ž~#o͊ ͭ|,>#d}., i:,-dF#~#€yO~#¥>&K~#~>,>)~#odx>"  #"~!#<~+-*/^()?~#^#V#& +$Nbrr[*${ͱC~#R7CfC*$x/wRC!́R*$Vw> >5CRC{#RC*$xW>Đ#g:=QCbC!2%~RRRͱ7ȯ7C:% *$e" %:%/z2> ͆0$8n*8D2͹6O Z P?qͭ3#:$ʎ!E{#*%E*$ͭw#:$G+~ £˜ʱx2$Ҵ!W9*~##ͭ:$O#:$# ѯN 7* %:$_+~ Z,ɯ2%: %GBR#5% (>B#Aґ>-u ‚!T:n 0 n7*~##ͭN## ªğ#&N Ÿ7:$!%6x[A?:0?#=*$!%6*? )>$͟#yYG"ʫ#m͑q(7?>#Š<,>ž#)7>"­"ʭ&7> ,$%-w#!K9!M9!O9!&:?< !Q9!S9 w/: %*$eo(+,*%ͷ1G37*~*$k"$ʘʢʢ, ʘ ͘"*%{+*8ͷG3}ͼ1o%-Z#*8,G3*8ͼ1$>2%Ø͘"nÛ͘"̀*8.͹6G3*8*%{/G3!%4͘":%=G:$O:%C Hw͊ z:ͫ͑%ʃ:$u͏$E$z͐$͘"RJ"*%!þ!%4ͱͤ[$G3:*$&~ͱG`[$:$ W W   _ W 1 m _ %!W W W a f A A ,!W 8 !`:&  :% ~$ # ɷy2%a_O!c: {H y y0 ?& A?:% y0 & !o: ʹ X>x} HÄ <„ H*$#####~!V:ʗ ## y ͺ *C &6y_O*!9N6~![:O !A: ʹ ͺ :T:y*$ y*8!!U9w/D27!#:6 !!6^@#w!g: !: :$e!!u"""#3#""""k!K##?#T#q!##!!\#!`:t!!k:t!!o:Ͱ! #|!*$~2$x/w*$N!:2 %t!>͞{#yOʲ!^"=!$w͊ N *$(:$͊ "$n^"=!$͊ h*$*~=͊ ͨN#*$ͨO# YyĴ"$*$ͭ_>͐#*$ͭF *$"$ͽ*$=͊ (ͪ*N#ѷl"2> <2C !%5 *$xO!c:t!x_#>Q͐#>">!`:##xQ͐#x͐#*$MOt!GM_ɇO##*$V:$wr!x">ą"!x"> ą"#=*$w*$##:$G+~ o#d#{##x *$xV_͍#*$p:%*$z!4ʲ#5 #¥#57#^"=*$w:$L3$6*$?#-#,-:$_~#> ͤ###:$OG0 x$?$G0 $2$Я2$=!$wr*%G3/͒3E$~:%X4:$_[$:%…$*8Nͭ3#i$*8"%X4G3. /$8ɯG*$c6$~̵$#ͺ$~$*8"%!~$$Oí3X4*8$.G3 !8ͭ3~$                     `@@@ @@        @ >ͳ12.2.:![99):yy!u99)*~'##x2.".ͭ*(~e(~#(#~(~`@̪(~(~)N ‹'!~w:.'~w!k99)͹6 (]'c'ͣ0!m9y/ ('`( ? +~w#*.ͭ!s99)*.ͭG#P(!i99)_a(F(MP(*.ͭ}(!g99)â() N (#(!_99)2 )*.ͭͭGo&>)/)/)# )!]99)!.V6|7})c6zj) )! ͝)*Y9N6͚)́)~ T]:.k͚):.*8:@͹61c6|7~))¼)#F =*yO7)#xʡ)¡)#Ý)#~#foN6Ý)y ):.**1!D2*y  :.ʒ3:.E*y_ >!*:  * * =* *=*y V*2.:.<2.Qد2. )  =*>2.ͻ***;,H.>ͳ1|7Ĺ6 * *! ͝)!w9͗)!9͗)!y9+*!{9>+!}9>+*!9>+!9>+*~##y2 ++N *ͭ2.c6.)+2.͌*͙*c6͚)*TE*͑*+,T+,+ *6+~~f+#W+͎+:.ʡ+2+++ͭz +:oc͊*+~1#wÁ+6 #+BÊ+% !% ~ -,, *,~N~*,::O *# , **~##͑*xJ,-". * *xͤ- * *....>).>).>).ͭ¡, =*ä,,.$..!:.~­,.$..#. -. -$...ͭ, =*->.<,. =*> .<,.ͭ- =*'->).-.$..ͭʖ-`-!c:##yR-!:..> ).ͭ@ʖ-..ͭ-..Î--: *# ͝)N E, *5./ *ͭ@ͭG#N *½-͙*!9͗)y.^#V#-O *y -x.O *.F#^#V#N#.*.ͱx. . *. *.5..+k͝)*~Q*## ͑*ͭ¥.̻. * *# *x=2$<5.= *~2 %ͭ.͝)QN Y.*~Q. **~!9c6.͚) A> +.:ҙ*!9͗)P/g^/oD2*1:E g1l/P/OԚ6:1=Ol/*8xG͚6:@=gͼ1oD21ͦ1:E *1*1:D *1*> ͼ1G:G4ͣ0y:1Ë/>́6$8!1~/wͭ/̓//ͣ0:1!1<211O~#GG 1 0ͭ/̓//ͣ0ů2121͖0 0/0GĖ0!1ͼ1_:D W:C G:D0x:> WD0:@*1_:E W!1:I0ʂ021~Y0m0~Ozm0:1ڂ0>:1O{_x}0ڂ0yNw 0Ė0*11"1ͣ0:}8o.0:10O}l/_*1:*10}*1͚6 0Aā6*8!1:1OG DM:<8*|/g}/o#)>:@2}8G*"8͡1*,S1"8+8"8:@_",:ck1!M!V![28*"7"7">4ͧ!Y3:͊31:ͪ!Y3͍3<=57ô1::A=ɯ28:8*8怮w:28*@*8"8"8> 28͡12!"83c%.D2*8B6 #2͡1'2 *4 *42*8:@Gs#=42!D228P2W7:813\U:g2*8{Œ2zʻ2G:8ڌ2*8Nͼ4*4#}2û2!MY3*a:`ʠ2|eoM2T!VY3J2![Y3:͊3G33C:A<8LE:A<8gõ2:c2*4==>c'3> '3i&3  3 |3{0O*4ɹ0*41G3*8"8~28w2"8DM+8"8>28F#Ny~r3ͭ3`3*$y怶O#~x3ͳ128y ҡ3 ͠5ͭ3*8D2:83ͼ4*43yG4O3͡13y*84*8P2ͼ4*44*8"8*8"8*8*8| y428:4>O!84*8q#"8:8O͚6:84>Oy͜7O4ƾV4R ͼ1*8Gx4!p~|4ͭ3q4*8~6 O#‚4ʠ4M2Y3:͊3:²4:~84*8~w:~842~8!~4!4!4>2~8:8Y3:͊3285i7454OD7 ȹ`.$8|7M2`5|7G5*8X4Dx/<܁6$8P2>Q5yo`ͬ5`528c6*8ͼ1_~O#ʁ5 55|7̭3ʕ55t5͠5n5|7X4*8$.|7M2F#^#V#|N6t5 ʙ5Œ5ʵ5ʳ5Œ5s5*8|7X4M2F##͹66> 6O͒3q#5s&6w6 66365{*8-D2 ͒3D2+*8z<`68 9| ~6#:| ~6^#VN6Hͼ1G*9͚6 =6:@=ڷ6*8 p#s#ri767ʼ6D767i7676D7:7 F͡16:8Gͼ1x7#+ 7+*8DM+87ͤ4>,7!757=,7O=97|7y!8456*8P2:8<28*8"8|7*86͇7"8͜7*8~#45!877ñ7*8~7777_!q9c6~7^{*8w͇7"8:*8~6#^#V#8:@7D7<+8O8 8M2c3X47$8:A<8*8ogWYxI8)B8GN6G4z8 #[8 ͼ1z8~ #k8i88HHOO;OOO(OOO;OwOO(OOOdOOaio  BlBh Ui# +  5 O C1{-=Pdy/gbb~Phe !)!N#f#$$%%~'')9)2+h+C-a-..5/M/00!1:111Q3o333f557&78588899::%%;;=-=g>>??@@lBC{EGHIDATASTARCOMDEFBAKABCDEFGHabcdefgh98.YX!.'/~"NYSRFFFCFC-ABCDEFGHIJKLMNOPNS_N00NN0SF000 -N0 QCJ@@W OREPFBCURSOR: ^A=left item ^S=left char ^D=right char ^F=right item ^E=up line ^X=down line ^U=set/clear tab ^I=tab DELETE: DEL=char left ^G=char right ^T=entire column ^Y=entire line INSERT: ^P=line buffer ^V=char right ^B=entire column ^N=entire line OTHER: ^J=rotate help ^W=list form ^C=form done ^K=toggle key FIELD: ^Q,_=add/extend field ^Z=delete field ^R=define field HIGHLIGHT: ^O=set/clear ^L=delete block CURSOR: RETURN=next item ^S=left char ^D=right char ^E=prev item OTHER: ^A=previous field ^F=next field ^G=delete char ^V=insert char ^C=end definition ^R=start over ^Q=locate field ^J=more help _______________________________________________________________________________ LIN=000 COL=000 HELP SCREEN 2 NUM=000 LEN=000 POS=000 EDC=xx ^L Unimplemented control character. Hit ESC key: Cursor is not in a field, K ignored2At line limit[Cannot delete last }line2At columns}column2Not enough memory[Possible fatal program error. Please report occurrence[*** WARNING: Edit mask or range limits may need revision2The maximum number of fields is 245[Can't read form definition file Insufficient memoryDirectory on dDisk L: full. Replace system disk, type return. a literal enclosed in quotes, or a valid field name2 &2 a constant using only the digits 0 through 9, and optional decimal point and leading minus sign, or a valid field name2Illegal operand. Item must be a field between #001 and #N, or  +-*/^2Illegal operator. Item must be Unclosed left parenthesis2 K Illegal character2 Duplicate Field Name2This program is used to define a "form" for data entry. The form, much like a tax or license application form, will consist of a number of "boxes" to be filled in and background information to explain what goes in the boxes. An example of data fields with background explanation is: First Name: ________________ Last Name: _________________ In the following procedure, you will be able to create a form for data entry. You may move freely around the screen using the CURSOR commands at the screen top, inserting background text at will. The boxes/data fields are created using the underline or ^Q key. Note that 1. you will not get a chance to actually enter data in this step and 2. when the data is entered, only the data in the data fields will actually get recorded. The rest is simply background text. The help messages at the screen top list/explain most of the options available. Use ^J to rotate the help display. Data fields may be assigned various attributes via a special questionaire. To enter this phase, position the cursor at a datafield and type ^R. Type ^J at any question for further information in this phase. Type ^J now to rotate to the next help screen: Enter name of form definition file (or press RETURN): The form definition file is where the specifications for your form are stored. If you have not yet designed a form, choose a name for the form definition file and enter it here. A form definition name is eight (or less) letters and/or numbers, optionally preceeded by a disk drive (letter A-P followed by colon). Press RETURN key to enter form name or enter ^C to exit: errors and incomplete fields: Field Error description (position cursor at field to perform corrections)  ??? No key field has been established. (Choose at least 1 field as sort field, use ^K to assign key status.) 000 Illegal character(s) in the content control wordthe CCW is reached, correct the CCW.) 000 No file name specified for verify file"Enter file name:" is reached, enter name.) 000 Field must be defined as "file verify", since field 000 references it"Verify field?" is reached, enter Y, F.) 000 Unspecified index for a file derived field"Index field number:" is reached, enter index field or type ^J for additional help.) 000 Incomplete expression for calculated fieldexpression entry is reached, then complete expression entry, substituting valid field numbers for all "?".) 000 Invalid range check limitsrange check limits are reached, then edit range limits so that the minimum value is less than the maximum.) 000 Unspecified verify/calculate orderorder is reached, then enter order.)  ??? Key length is greater than 120 characters. (Position cursor at key field(s), use ^K to remove "*".) . (^R, RETURN key until  L=List errors on LST: deviceL D=save form and chain DatastarD/SPACE): Enter exit command: A=Abort without saving form B=save form & Boot operating system C=save form and Continue SPACE=continue without saving form (A/B/C/Abandon form edit? (Y/N) FORM LISTING AND FIELD ATTRIBUTE DEFINITIONSFIELD NUMBERS RANGE CHECK, LOW RANGE CHECK, HIGH ENTRY CONTROL MASK CONTENT CONTROL MASK FIELD ATTRIBUTE DEFINITIONS Q=required C=check dgt J=right just* * D E R I V E D * W=write ed c. LIST CALC *****VERIFICATION**** O=oper entry.. FIELD NUM/NAMER=range chk PAD/ . INDEX ITEM. FILE VERIFY LEN LIN COL KEY E=edit mask FLOAT . FIELD NUM ORDER . ORDER FILE NAME . ...CALCULATIONS Field name:You have entered the field definition phase by typing a ^R. The field definition phase is a questionnaire which allows you to set up controls over what data will be accepted during the data entry portion of this program. In the questions that follow, the answers you give will apply to the current field only. To return to background definition, type ^C. Field names are optional. The field name may contain from 1 to 32 characters and must begin with a letter. The remaining characters may be letters, numerals, or spaces. Field order:This attribute allows you to specify the order in which fields will be processed during the data entry phase. Key order:The key fields are the fields on which the index file is sorted. These fields are combined for sorting. The field with the key order #001 will be the most significant field in the sort. Tie breaker field? (Y/N)A tie breaker field is a key field entered by DataStar to create a unique key. Enter a Y here to have DataStar maintain the file by entering the lowest numeric value here that will create a unique key whenever necessary. Refuse duplicate keys? (Y/N)This attribute is used to to create files with unique keys. If the data entry operator attempts to enter a record with the same key as a record already in the file, an error message will be generated and the entry refused. Copy attributes of fieldThis attribute is used to save time when defining fields. If another field has been defined with the desired attributes, entering its field number here will cause its attributes to be used by this field also. Field derived? (Y/N)A field may be derived from other fields or from a file. The cursor will not stop at a derived field during data entry. A Y answer here will make this a derived field. You will define how data is to be derived for this field in the following prompts. Allow operator entry? (Y/N)A Y answer here will allow the operator to make adjustments to the data in this field. Otherwise, the cursor will not enter this field. Calculated/File? (C/F)A C answer here will make this a calculated field. Data for a calculated field is computed from constants and other fields on the form. You may define the calculation in the following prompt. An F answer here will make this a file derived field. Data for a file derived field is copied from a reference file. Another field on this form is used as an index into that file. For example, to derive vendor address for this field from a file of vendor names and addresses, you could use vendor name (entered elsewhere on this form) as the index field. Index field number:Enter the number of the field on this form that you want to be used as an index into the reference file. For the example in the previous prompt, you would enter the field number for vendor name. If you don't remember the number of the index field, use ^A or ^F to move to the index field. Its number will be displayed on the status line. Item number in file:This attribute designates the item (data) to be copied from the reference file to this field. For the example in the previous two prompts, if the vendor file has "name, address, city, state" for each vendor, you would enter "003" to extract city. Verify/calculate order:This attribute allows you to specify the verify/calculate sequence. In general, calculations should follow verifications unless the result of a calculation is being used as an index field. Fields can be calculated in any order. The calculation sequence will only make a difference when one calculation depends on the results of another. The field with verify/calculate order #001 will be processed first. Numeric/String? (N/S)A numeric calculated field uses an algebraic expression to derive a value for the field. The algebraic expression consists of fields and numeric constants combined arithmetically, using the operations: add(+), subtract(-), multiply(*), divide(/), exponentiation(^) A string expression consists of fields, sub-fields and string constants combined using the join(&) operation. Enter string expression for field:A string expression may contain fields, subfields or string constants (literals) combined using the join (&) operation. Fields are represented by either field number preceded by a "#", or field name. For example, #007 or fieldname. Subfields are used to extract only a portion of a field. The form is: field number (first character number, number of characters). For example, #7(1,2) or fieldname(1,2) Literals are represented by enclosing the characters in double quotation marks. For example, "A01". Enter algebraic expression for field calculation:An algebraic expression may contain fields and numeric constants combined with the arithmetic operations: add(+), subtract(-), multiply(*), divide(/) and exponentiation(^). Operations are performed from left to right in the usual manner with parentheses recognized. Fields are represented by either field number preceded by a "#", or field name. For example, #007 or fieldname. All constants and fields should contain only digits and optional minus sign and decimal point. Intermediate field? (Y/N)An intermediate field can keep redundant data from being stored on the disk or hold partial results in complicated calculations. An intermediate field is like any other field except that it is absent from the record that gets stored on the disk. A Y answer here will designate this field as intermediate. Required? (Y/N)This attribute determines if data must be entered in this field during data entry. A Y answer here will force the operator to make an entry. Right justify? (Y/N)This attribute determines on which side of the field the data will be placed if it does not fill the field. A Y answer here will align the data with the right side of the field. Pad field? (Y/N)A field can be extended to its full length by adding pad characters on the left of the data, for right justified fields, or vice versa. A Y answer here will pad the field with pad characters if it is not full. The pad character will be specified in the next prompt. Enter pad character:Any character may be used to extend the field to its maximum size. Commonly used characters are space and zero. Floating character? (Y/N)A 'floating character' can be inserted into the field, either on the left of the data for right justified fields or vice versa. For example if '$' is used as a floating character for a right justified field, a dollar sign will be added to the left of the data entered. A Y answer will provide a floating character in this field. The floating character will be specified in the next prompt. Enter floating character:Any character may be used as a floating character. Commonly used characters are '$', and '+' or '-'. Verify field? (Y/N)After the data entry for a form is complete, DataStar will enter a verify phase. In this phase all of the fields with the verify attribute will be checked for accuracy. You cannot assign the verify attribute to an intermediate field. A Y answer here will cause this field to be checked during the verify phase. The kind of verification will be specified in the next prompt. Sight/Retype/File? (S/R/F)Sight verify means the cursor will move to this field and allow the operator to take another look at the data. Retype verify means the field will be cleared before the cursor moves to it and the operator will be forced to type the same data again. File verify means the field will be checked against a reference file. File verify will be further specified in the following prompts. Keep file in memory? (Y/N) If the reference file is small enough (fewer than 500 characters) it will save space to keep it in memory during data entry. It will always speed processing to keep it in memory. A Y answer here will cause the reference file to be kept in memory. Enter file name:Enter the name of the reference file that contains the list of acceptable entries for this field. Enter file disk drive (-/A/B...): Enter "A-P" to specify the disk drive that holds the reference file. Enter "-" to use the current drive. In both cases, the operator will be asked to specify another disk drive if the file is not found. Enter file key field number:This attribute specifies the field in the reference file that DataStar will search to verify or match the data in this field. The field used must be the key field and be exactly the same length as this field. Enter the field number of the key field in the reference file. Batch verify? (Y/N)This attribute determines if the records created in DataStar will be verified immediately after data entry or later as a group. A Y answer here means the records will be verified later as a group. Check digit? (Y/N)A check digit is a digit added on to the end of a numeric field to make data obey some rule. The rule in DataStar is that the field must be divisible by eleven. A check digit is used to improve the accuracy of entered data, since incorrect data is not likely to obey the rule. Enter a Y to require that the data in this field be divisible by 11. Range check? (Y/N)This attribute is used to assure that only data within a certain range will be entered in this field. As an example, the two character field called month can only have values between 01 and 12. A Y answer here will allow you to specify the minimum and maximum values for this field in the following two prompts. Enter/change the minimum field value:A field is compared on a character by character basis to determine acceptablity. Characters are compared according to the following sequence: space !"#$%&'())*+,-./0-9:;<=>?@A-Z[\]^_`a-z{|}~ (highest) Enter the smallest acceptable value for this field. Enter/change the maximum field value:A field is compared on a character by character basis to determine acceptablity. Characters are compared according to the following sequence: space !"#$%&'())*+,-./0-9:;<=>?@A-Z[\]^_`a-z{|}~ (highest) Enter the largest acceptable value for this field. Edit mask? (Y/N)The edit mask allows you to control the entry and content of a field on a character by character basis. This includes inserting constants, copying data from the previous form, requiring entry at certain positions, as well as providing control over the actual characters that may be entered at each position. A Y answer will allow you to define the edit mask in two steps: entry and content control. Entry Control Character Codes: ! = must enter a character _ = may enter or leave blank X = automatic copy Y = auto-copy/may enter " = constant in this position ~ = constant/may enter ' = constant if data on / = constant if data on both sides of constant either side . = align decimal pointEnter/change the entry control mask:This attribute defines the entry control mask. This mask allows you to specify if data must be entered or how it is entered for each field position. Each character in the field may be entered by the operator, copied from the same position and field of the previous record, or be a constant. You may not use X or Y (automatic copy) in derived fields. Constants will be specified in the next prompt. Content Control Character Codes: A = A-Z only a = a-z only B = A-Z, space b = a-z, space C = A-Z, a-z -> A-Z c = A-Z, a-z D = A-Z, a-z -> A-Z, space d = A-Z, a-z, space E = A-Z, 0-9 e = a-z, 0-9 F = A-Z, 0-9, space f = a-z, 0-9, space G = A-Z, 0-9, a-z -> A-Z g = A-Z, 0-9, a-z H = same as G with space h = A-Z, 0-9, a-z, space 9 = 0-9 only 8 = 0-9, #$%()*+-. . = align decimal point _ = any character allowedEnter/change the content control mask:This attribute defines the content control mask. This mask allows you to specify the constant or type of data to be entered in each field position. For each position specified as a constant in the entry control mask (see the previous prompt), enter the desired constant in the same position in this mask. Record edit characters? (Y/N)Edit characters are constants and pad/float characters in the field. Usually they are removed from the field before the data is recorded. A Y answer here will include the edit characters in the disk record.   DM FormGen Release 1.42 ID # 612203KP-00A Copyright (c) 1978, 1984, MicroPro International Corp. All rights reserved. ctions on its use. The software contains valuable trade secrets and proprietary information of MicroPro International Corporation and is protected by federal copyright law. It may not be copied or distributed in any form or medium, disclosed to third parties, or used in any manner not provided for in said License Agreement except with prior written authorization from MicroPro. d in any manner not provided for in said License Agreement except with prior written authorization from MicroPro. number in file:This attribute designates the item (data) to be copied from the reference file to this field. For the example *K͞+DD9N'+FÎr ͖ 8{ Ăw#w#w^#V#*~#fo^#*~#fo^#V#*n^#*n^#V# ~#fo^#& ~#fo!+!#!+!#!+!+}|z{|}|z7||7zZZ)|/g}/o#|͉k|/g}/o#ɯ2qZZk:q|/g}/o#|/g}/o#:q<2qqDM!xxGyO҃)v|͔`i|)Öxڷz/W{/_ѯzW{_=yOxGæ2qZZ͉M|}ȯ|g}o)|/g}/o#z/W{/_!9~#fo! ! ! ! ! ! !9~#A"s!`*"!"!Y">2>2>22!"!"!@"!" ʞ!F#x±~#±!b2r~# "2r+}|~#G:rx"2r+w# +6#!6#2w2x*s!>r<o&F=-` r'~h6!+`W?_!~7z?` :>ª@w#G.¶ww#?*>?w#> w#.7:77!a{   `OE!y6$ -7rBo&))T])))!y)5=;A÷)Å;!A$AW+>6:'/+ó;0TAö,2.]6ø6v7åA!q9DM* w#w*!A s#r*! s#r*w#w! w#w͐R͐*6! ^#Vr+s'*6*6*w#w*6* 6* 6! w#w͐ڽ͐* 6! ^#Vr+sÒ* 6*6*6*6*6*6*6*6*6*,6#6*.! s#r*! s#r!!*0s#r!!*2s#r!!*4s#r!!*6s#r!!*8s#r!1"*:s#r!k"*<s#r!"*>s#r!"*@s#r!#*Bs#r!S#*Ds#r!#*Fs#r!#*Hs#r!#*Js#r!#*Ls#r!#*\ͧ!#*`ͧ!#*dͧ!#!7 ͧ!#!; ͧ!#!V ͧ!#!^ ͧ*!A s#r!$*ͧ*b6#6̓++`is#r*! s#r̓+! s#r!C 6#6! w#w! w#w͐7 ͐))*d##͐Cs#r͐))*d6#6! ^#Vr+s *a 6*b 6!2ͪ!,ͭ!T s#r!ͭ*m s#rMm | !$Ͱ!ͳ! ~#fo##~#fon!S s!|g}o|? ̓? ! 6#6! ~#fo̓n&#s#r! 6#6! ^#V!r+s͐#̓ns̓n*b s! ~#fo##~#fon&|g}osË ! Ͷ! w#w͐{ ͐͹! Ͷ! ^#Vr+sO ! Ͷ! Ͷ!*$*0s#r!r$*2s#r!$*4s#r!$*6s#r!$*8s#r!$*:s#r!$*<s#r!$*>s#r!=%*@s#r!~%*Bs#r!%*Ds#r!%*Fs#r!%*Hs#r!&*Js#r!=&*Ls#r!V&*Ns#r!&*Ps#r!&*Rs#r!&*Ts#r!&*Vs#r!'*Xs#r̓ !͹! w#w͐:*L!^ ͤ! s#rz,͐+|&!͹,!^ 6A! ^#Vr+s *Lͼ#|T!͹̓j!͹*! s#r! 6#6͐͐!͐! ~#fo͐)~#foͿ! s#rz!͹͐+|$͐n*a s͐n*b s! ~#fo͐)~#fo͐ ! s#rz$!͹!*͐*L*ͤ! s#rz!͹k}@€*Ì*ͳ!ͭ*c s#rMc #|¶!͹! Mc ͡Mc n&?! s#r͐ ͭ*e s#rMe #|!͹͐ Me ͐͡+|Me !& s#rMc n!E s#6! w#w͐͐E+ڒ͐))*d͐&n&#s#r!& ^#Vr+s! ^#Vr+sI͐*s#rM! s#r!2̓TMe ̓T!& s#r!!( ͐!0 6k}@! 6#6! w#wW͐! s#rMM!͹! ͶMe ͐}/o|/g|ʊ͐++|͝}/o|/g|ʊ͐#͐ns͐##͐ns! ^#V!r+s*Lͼ#|!͹! ^#Vr+s~Mm ͐MX|!͹MX|MZ|!͹̓5!͹! Ͷ͐+|[`i^#Vr+s!͐**! s#r! w#w͐ڭ͐ #͐͐͐ns! ^#Vr+sn! 6#6͐͐! ^#V!r+s! 6#6͐*͐*! s#r! ^#Vr+sn}.! w#w͐i! ^#Vr+s͐))*\͐ns! ^#Vr+s&*L*ͤ! s#rz§͐*͐i*Lͼ#|!͹͐͐k&s! ^#Vr+sö͐?(########͐E#?####! ?! s#r͐ͭ! s#r̓#|M!͹̓! s#r*! s#rMX|d! w#w͐گ͐*͐!7 ns! ^#Vr+sw͐#n*ska }ka *s*6͐+|*6*6* 6!&̓*! ~#fo&s#r̓!? s#r͐?͐s#r! ~#fo##s#r*! s#r! 6#6͐͐w! ^#V!r+s̓! s#r! w#w͐͐#͐͐͐ns! ^#Vr+så! w#w͐%͐ ͐͐*`ns! ^#Vr+s͐͐#ns͐ w#w͐w#w͐w#w! ~#fos#r! ^#Vr+so*! s#r! ^#V!r+s! w#w͐͐͐͐*ns! ^#Vr+sÛ͐##ks̓!? s#r!? ^#Vr+s6#6!? ^#Vr+sw#w!? ^#Vr+s6#6!? ^#Vr+s͐Es#r! w#w͐u! ^#Vr+s! ^#Vr+sO̓!" s#r͐&! s#r! w#w͐͐E+#͐"͐&n&#s#r͐"##͐&#ns#6! w#w͐"͐))*d##~#fos#r!& ^#Vr+s!" ^#V!r+s! ^#Vr+sÖ̓!& s#r͐"! s#r̓!? s#r!? ^#Vr+s6#6!? ^#Vr+s6#6͐?! s#r͐ 6͐ #6#6͐ ###6#6͐ 6͐ 6#6͐ 6͐  6C͐  w#w! ^#V! r+s͐ ! s#r͐+|v͐ 6͐ #6#6͐ ###6#6͐ 6͐ 6#6͐ 6͐  6͐  w#w! ^#V! r+s͐ ! s#r! ^#Vr+s6! ^#Vr+s6! ^#Vr+s6 ! ^#Vr+s6! ^#Vr+s6̓!? s#r*! s#r!*͐*! s#r! ^#Vr+sn}.! w#w͐E! ^#Vr+s͐!; ns! ^#Vr+s*L*#|h!͹̓! s#r! w#w͐͐ڹ*L! ^#Vr+sn&! ^#Vr+s}*L#|!͹*Lͼ#|!͹! 6#6! ^#Vr+s6! ^#Vr+s6 !̓*̓n&|g}os! ^#Vr+s! w#w! ^#Vr+sn}q! ^#Vr+sP! ^#Vr+s! ^#Vr+s6/! ^#Vr+s6N! ^#Vr+s6 ͐͐###! s#r!̓*! 6#6̓͐s! ~#fo͐s#r! ^#Vr+ska s! 6#6MZ|C! ^#Vr+s6! ^#Vr+s6 !͹!͹! Ͷ!^ *! s#r̓! s#rMZ|k!! w#w͐͐*͐*dns! ^#Vr+sÎ͐##n*skb }kb *s*6*6!&̓*! ~#fo&s#r̓!? s#r͐?6#6! ~#fo##s#r̓! s#r! ^#V!r+s! w#w͐ڷ͐#͐͐͐ns! ^#Vr+s|͐͐#ns! w#w͐͐ ͐͐!7 ns! ^#Vr+s͐ w#w͐w#w͐w#w! ~#fos#r̓!? s#r!? ^#Vr+s6#6!? ^#Vr+sw#w!? ^#Vr+s6#6!? ^#Vr+s͐E#s#r! w#w͐! ^#Vr+s! ^#Vr+så̓!" s#r! w#w͐͐E+[͐"͐&n&#s#r͐"##͐&#ns#6! w#w͐"͐Cs#r!& ^#Vr+s!" ^#V!r+s! ^#Vr+s͐"6#6͐"##6#6͐"6#6!" ^#V!r+s͐"! s#r̓!? s#r!? ^#Vr+s6#6!? ^#Vr+sw#w!? ^#Vr+s6#6*! s#r!*͐*! s#r! ^#Vr+sn}.)  ! w#w͐g ! ^#Vr+s͐!; ns! ^#Vr+s1 *L*#|Š !͹̓! s#r! w#w͐͐ *L! ^#Vr+sn&! ^#Vr+sß *L#| !͹*Lͼ#|!!͹! 6#6! ^#Vr+s6! ^#Vr+s6 !̓*!͹!͹! Ͷ!^ ̓ͳ!9MicroPro FormSort Release 1.01 Serial # FS9999XX COPYRIGHT 1982 MICROPRO INTERNATIONAL CORPORATION. FormSort Release 1.01 ID # 711303KP-00A Copyright (c) 1982, 1984, MicroPro International Corp. All rights reserved. nformation of MicroPro International Corporation and isrotected by federal copyright law. It may not be copiedr distributed in any form or medium, disclosed to thirdarties, or used in any manner not provided for in saidicense Agreement except with prior written authorizationrom MicroPro. DEFDTANDXDTA$$$FORM2 @:FORMSORT.OVR Too little memory. Formsort v1.0 COPYRIGHT (c) 1982 MicroPro International Corporation. Invalid file specification Invalid Option specified ) (A/B....) Cannot Open File Data fileIndex FileError: No input files specified. Example: A>FORMSORT OUTDEF/options INDEF1 INDEF2 ...No Input Files specified. Input file assumed same as output fileCannot create only a .NDX from a list of input files. Enter disk drive to use for the Data file (Enter disk drive to use for the Index file (More than 25 input files have been specifiedCan't find FormSort.OVR Please wait... SuperSort is now sorting the Invalid .DEF file. Check your form with FormGen.Too little memoryWarning: Mismatch on input and output form sizes.Close failureDirectory or Disk full while writing output file @';!9DM! w#w! w#w! w#w͐ڌ'͐ ͐6 ! ^#Vr+s`'! w#w͐'͐  ͐6 ! ^#Vr+sÔ'͐ ###6! w#w͐ ͐6͐ #n}:"(͐ ͐͐ n&='s! ~#fo##s#r! 6#6! ^#Vr+sn`is{, )`in}/ )`in} )! ^#Vr+s`in}.s(! 6#6! w#w )͐}/o|/g|(͐ڸ(͐ ! ^#Vr+s`in&='s(! 6#6 ) )͐(͐  ! ^#Vr+s`in&='s )! 6#6 )"(͐)!9+)ú8W+$A!A!9DM! w#w͐͐ ҅)*L)`is#rzʅ)! ^#Vr+s͐s! ^#Vr+s;)͐#|§)!")! %)!()͐î)!9)*Bö,!9DM͐ ###͉! s#rM ! s#rz&** ! s#r* s#r* s#r* w#w͐~#fo`is#r͐##~#fo͐*͐##~#fo͐u*͐͐~#fos#rú*͐##~#fo͐s#r`i~#fo͐##~#fo))s#r͐##͐s#r͐* s#r͐####N+͐M 1+͐?ͺ)! s#rz +!N+͐##͐s#r͐####ͽ)M `is#r͐! s#r͐~#fo`is#r4*!9c+<ó;!A!9DM`iw#w͐|+`i6#6͐Z+! s#r͐)*0~#fo]+͐|ʶ+`+ù+!9!9DM! w#w! ^#Vr+s͐͐ n&@s! ^#Vr+s6:͐͐n`is{ P,`in}P,! ^#Vr+s!P,! ^#Vr+s`ins,! ^#Vr+s6.! w#w͐ڪ,! ^#Vr+s͐ ))*\͐ns! ^#Vr+sg,í,!9!9DM͐++++`is#rM ! s#r͐͐,͐͐~#foK-͐͐~#fo8-͐͐5-͐͐~#fo8-K-͐~#fo! s#r,͐͐##~#fo))͐~#fo¨-͐##~#fo͐~#fo##~#fos#r͐͐~#fo~#fos#rú-͐͐~#fos#r͐͐##~#fo))͐ .͐##~#fo͐##~#fos#r͐͐~#fos#r.͐͐s#r͐* s#r!9M.W+ó;;[B!A$A5>6!9DM͐ `is#r`i^#Vr+sn}.t._.! w#w͐ڽ.`i^#Vr+s͐))*\͐ns! ^#Vr+s|.͐ ! s#r͐ `is#r`i~#fo##s#r͐5.͐8.!5.! 6#6͐|q/>.;.! s#r͐A>/͐P>/q/͐+++|M/A.!D.! D.!D.! 6#6/͐ ͐s*L*G.! s#r! D.͐#|.*LJ.û/!9/W+;!9DM͐ n}/0! w#w͐0͐)*V͐s#r! ^#Vr+s/U0! w#w͐U0͐)*Vw#w! ^#Vr+s'0! 6#6! ^#Vr+sn&/`is{0`in}/ʜ0 ʜ0Dʟ0Nʮ0Bʽ000*X6#60*Z6#60*X6#6*Z6#60! 6#60^0͐0!91)ñ9W+!9DM! w#w! w#wMc Q*g s#r!Mg 0Mg *k s#rMg ##nMg ###nѯgW?! s#r!͐*L0`is#rz 1!1!Mk 0Mm ####*q s#r* s#r* s#r*} s#r*{ s#r*y s#r*w s#r*u s#r*s s#r`i6#6͐Mk nѯg5!Mm 0Mm n}k2*q w#w!5Mm n&ڛ2Mm n*o s#6! 6#62!Mm #0Mm n&Mm #nѯg*o s#r! 6#6Mo ͐Mq 0! ~#foMq n&#s#r! w#w! w#wMq ! s#r͐+|¾5Mq n&@|g}o|¦4Mq n&|g}o|ʦ4͐*s s#rMs Mq nѯg*u s#r! w#w͐Mq n&+ڦ4*s ~#fo͐n}"44*s ~#fo͐n}/44*s ~#fo͐n}~44*s ~#fo͐n}.44*s ~#fo͐n}'B4! ^#Vr+sØ4*u ~#fo͐n}8ʍ4*u ~#fo͐n}.ʍ4*u ~#fo͐n}9˜4! ^#Vr+s! ^#Vr+sâ3͐ Mq n&15! w#w͐Mc n&+.5͐))*d~#fo͐ 5͐))*d##~#fo|g}os#r! ^#Vr+s4þ5Mq ###n&|g}o|ʾ5! w#w͐Mc n&+ھ5͐))*d~#fo͐°5͐))*d##~#fo@|g}os#r! ^#Vr+sR5`i^#Vr+s,2͐+5!95ÐB!9DM͐!͐5s#rz 6!͐͐##͐s#rs#rs#r͐~#foD6B!9DM͐~#foA6c6B!9DM͐͐`6s#rz‰6!͐͐ s#r͐6#6͐~#foþ6C!9DM͐^#Vr+sz7͐^#Vr+s! ns!|g}o!͐ ͐~#foͻ6++++|+7!͐6#6͐͐ s#r͐^#Vr+s! ns!|g}oÂ7CTApC!9DM͐~#fo¥7!ñ8͐~#fo`is#r͐͐ ͐~#foy7͐7!ñ8͐+?`is#r͐~#fo|ʈ8!͐ ͐ ͐|7͐~#fo͐s#r͐~#fo͐s#r!!͐~#fo7ñ8͐6#6͐͐ s#r!ñ8!98C!9DM͐^#Vr+sz8͐^#Vr+sn&|g}o͐!͐ ͐~#foͽ8s#r!49!͐##~#fo͐~#fo?s#r͐͐~#fo?+s#r͐͐ s#r͐^#Vr+sn&|g}oú9pCC!9DM͐ |9! ~#fo͐##~#fo͐~#fos#r͐ ͐##~#fo<:͐ ͐##~#fo͐~#fo?:!͐ ͉`is#r͐~#foʹ9#|m:!4;!͐ ͐~#foͷ9! s#r!ڠ:!4;͐͐s#r͐##͐͐?s#r͐͐##~#fo͐ s#r͐͐ ͐~#fo?͐~#fos#r!4;!9!9DM͐`is#r! ^#Vr+s! ^#Vr+sns{u;O;͐|;!9Î;@<ó;!y9DM! `i͈;`i͋;!9ù;$A!9DM͐n};! ^#Vr+sn&Ͷ;;;ï?!9DM! n&;|SH>t?͐~#fo|=! ^#Vr+s6-͐͐~#fos#r! ^#Vr+s! 6 =! 6=! 6! ~#fo! n&! ^#Vr+s~#fo! C<ѯgs#r>! ^#Vr+s! ^#Vr+s~#fos! ^#Vr+s>! n}[>! 6#6! ^#Vr+s~#fo! s#r͐n}>͐|>! ^#Vr+s! ^#Vr+sns! ^#Vr+s! ^#Vr+sv>͐6! ! s#r! n}?! ^#Vr+s!?! ^#Vr+s! n}?!0?! s>͐! ^#Vr+sns{@?! ^#Vr+s?! n}q?! ^#Vr+s!q?! ^#Vr+s6 J?Ç?! ^#Vr+s`insÝ?! ^#Vr+s`ins~<͐6!9!9DM! n&aͯ?! n&zͯ??!9DM͐͐ 4@͐^#Vr+s͐ !@͐0)@͐7s!&@͐ ͐͐ ͉͐?`is͐ ͐͐ )͐?`in&#&@!9!9DM! n&0ͯڳ@! n&9ͯý@È@!9DM`iw#w͐~#fon&ͺ@} A͐ ?͐^#Vr+snѯg`is#r@͐A!9 "   8A > _ HA7*|DM**͟AڃA>GoyD$v͠Fx0 T%uEEx0  oE AE Ex0  Efg*v#"v*v#"v:'bE*v͎jE> ͧEE>ͧEEE:EE*v͙Es#r!"v*v#"v*v&)*vg:'2lv|bk+Ó_:v*v*v:'FͼE!EE!E]% FFLHTFPLiFMToFMBuFCP0Ft a datafield and type ^R. Type ^J at any question for further information in this phase. Type ^J now to nexcreen: Enteefinition file (or pre RETURN): The form definition file is where the specifications for *!@w# '.'w#7&3ѷ_!4!?*&}o|gz$ p*2"9!33;ʹµ*zzA }o|g!U*w#$\!\*$,w# \O\>OA\òѷ!õ $$$FORMSORTCOM$97Can't find file FORMSORT.COM$No argument$SuperSort error$Internal error $Close failure $Directory or Disk full while writing output file $Too little memory $Formsort Finished $ /~/#~/+T]!0w#   " w!$>w> T$Tbk0w# G; P;w> COPYRIGHT (C) 1980 MICROPRO INTERNATIONAL Serial # SS9999XX ͈)*Us#r*.#."f/zͧ/+w-!9K-!9K-!K->4.""K->4.y/"Uy/"ʹ@, BYTES WORKING STORAGEp:Bj\ :U:7!!*h+G:!G:!! -!*)**t"*"e:Tĉ!SORT $$$&-! .*|>E4.! ->74.,~2O!>34.##" ͎ ~2 2O!>D4.##"͎ * ~ >U4. ##2>24.~O>44.y!>54.ͨ ͝ ~2!>64.##": : !"6!2 2 2 #2  2  2 *6DMyʬ :C2x:ʸ :2!@ ~@ > G27*: *| bkx@t +| #x w : x x@w D-% *"xz \ x@t "":z *:z D-##"2ym *" "*""&"*","."(ë x~ * ~ >C4.!\ yt t " *"""(! "*".*"0:-2*) :!>W4.x :* >V4.:_>84.7 2?,*"f"d!"V(@ K- +|#>94.@==>Y4.~#"6 >\4.{:=>[4.z: >^4.xk x#k ###:###++! 8- ʝ ,Ï ~##<>#4."!""y2^#V#N#F#~ x>?4. *K->>4. K->=4.   *" """$^#V# ¹ z>;4. ( >X4.{{< {@zt{F {{P {{Z {$78*$"$ *D"Z*D*XK->Q4.*Z*X+++J-ڭ ^#V#͠Ÿ "ZÁ :T!U!̦*D*ZK--͡-: @, @,͎-##"\"^!ͬ @,+*D^#Vͨ*dK-d :7 *Z^#V͠7 *D^#V8-*Z*DM "^*Z++"Z*DJ-v P #Fwx#Fwx+Ͳ *D##"D*ZK- @, *^*\-#+|ʞ Fwx#Ì "Z:T> k ô ++DM"("D*$""">-"  |g}o## !"*++"|d ^#V"\!"K)"+K-W5 ^#V#^#V8-!5##"+ ^#V*\8-W! s#r*+*K s#r !d:7Ĕ!"l*/*e#"8ͺͻ**D-"4e#"<͹ͽ "n !"j̀>4."n!͹͹"j̀@,WARNING SW1: MARGINAL SORT WORKING STORAGE%!)"h"n"<"8BÀ*4*"j̀ **8"8*4*<"<*n*h"nO͜">*nDM*j DM*l K-*8*<͔**->4.*0e#ͼ/ DM:7":*>:̔*(##͆-*P x"Ds#r# x"X"R:Ĕ*<T*-**>͔*-"N!-*":2: 2z""P!*:*2ɘ*DDM*Z^#V+"D-"Z*-*<*:͏K-"R͏*:z*-͝:7*Û!*fDM*"f*d-"d*N-"@*8*:͏g-"B6ͦ*D*ZK-҆ͭ *Da/ͩ͒/͑r͠/*Zͱ R*Z+~+~"ZK-i:W> '@G#x/!ʛ:>T] >R4. ͎-zÛ͎-~p:6px '*v"v##N#F'~#fo##q#p'x/~#~*h*ͽ*Bͩ-"`+->ڌPY*@ͩ-"4}>Q4.!#ͩ-##"`*4J-r2W*`*"_͎-*@:Wʴ*B*d"""*`)"X"Z"*`DM2*h|+"h*f####"f"$!5!4*"" x*ͩ-!~b5:****":@Á:**,*+V+^+F+N"!>2%"""`i" "(2$"*z"**##s#r"s#r#w#w*s#r#"+|+*X*`DM+V+^͑+r+s x"D**-"*">2*@, SORTING...!*Fw2,*J->Q>Q:,*|ž@, MERGING... :*@, ADDITIONAL MERGE... @, FINAL MERGE... :,@,, @,`*r*p".*t*l-"0**"4:-: -g"2*~*v-"6@,WARNING SW5: INSUFFICIENT FIELDS OR COLUMNS FOR KEY OR SELECT IN ONE OR MORE RECORDS, BLANKS ASSUMEDV(WARNING SW6: ONE OR MORE CR-DELIMITED INPUT RECORDS WERE LONGER THAN SPECIFIED MAXIMUM LENGTH, AND WERE DIVIDED INTO MULTIPLE RECORDS BEFORE SORT/MERGE: @,0l RECORD INPUT FOR SORTn  SORT RECORD EXCLUDED OR NOT SELECTEDp  SORT INPUT DELETIONr  SORT INPUT INSERTION.t RECORD SORTED: ʱ@,6v RECORD INPUT FOR MERGE ONLYx  MERGE-ONLY RECORDS EXCLUDED OR NOT SELECTEDz  MERGE-ONLY INPUT DELETION~ RECORD MERGED ONLY@,4  OUTPUT DELETION  OUTPUT INSERTION42 RECORD OUTPUT OUTPUT FILE SIZE 2 SORT RUN  MERGE RUN WORK FILE DISK SPACE USAGE *** SORT/MERGE COMPLETE ***¯͎-t̍:V*F'*N~-"P"L'2V!~6**!*F# ͞!"":$: <*R U͈:**=K:6>R4.͎-r*DM::'@ PY=—:•͎-p>2'*l"l*F(!}o"e*">"F"H* " G:2_*"Y:2`* "W~#!m!mgþ͔g| x½+|¢:6&#%q#p#s#r#%:PY6,#':̓.* DM*gK--V:o_N2ozW#~+zW{ m{Zd2og+V#))))y#v++z"‡y‡y6y߹ʓOzW> !m :o02o #~¼wt# +~w# >#f))),)!x3W-~))*W-~))/C*i*g:@ ##-z*~#""h, 2z:~# -+zU~#"h,@+ + xb~ UPY z~#"i ##"{!w6#6#6#6ʚ>o͉ w# ¤{ ʫ0{óN!y4{/ھ.{/N{ D!)͉g{ ./0}oo{|)o)$:yW-$$:x;!zw#{w 0!xX6+455!z4q55*{w*{w#"{x"{ { ʉ->+>:Uʹ*&*N@%>2T"*JͿ%":**e "**J%*R*e ">*% &͎-=7*DM-=_ ͎-:R Y! >*JͿ%":>% >e*J%"J*) ./ INSERT DISKETTE TO RECEIVE OUTPUT IN DRIVE:../, THEN TYPE RETURN*J.:)! :$, ,*"4 :2: :2; 2 z""L>2U@*b*ds#r#b*N%"d͎-h*b":7@p :7~ *"ʌ *Fͼ!*DM::'@ʺ :7 ʺ  ## -PY:! DM*K->  :7@ ̈́'PYz'BK*z'*DM:'6 #6 `i:&!00)!͎-n:! q/###<ƒ!6- a!1/ͬ!T])))):)<} .̈́(^#V#^#V*X("!"!J-">(_zWK-"~-/*h(*!"j(("*b(K-"͜$`i"l(*j(Þ(*!4"(*!"j(& "ʹ(m*):)<|F"! w#6#6#*d(o&͞!-"t("f"`ih"-*j":p"ҥ":r"ڤ"ҥ"##"`(H:r"ʸ"*t"*f"-:r"":p"*`(/|"l#"*`(-l#:r""*f""x"*t( .*h"ʹ( -*l""X(*p""Z(!"n(*n""p(*t("b((*x""d(*!X(-ʹ(:s"=y#=̹#͛(*x"J/|>4./ͭ):Z(&گ#*f(~¯##^#V*`(K->±###^#V"p(#"f(>ʹ(4.1*:Z(*`(*h(w#s#r#w#w#w#"h(̈́(*p(|#!Þ(&#͜$P$:Z(#$x$ +~$#$"f((#"f(`i"l(*l(*j(͔'#*t(*j(++s#r#*l(կw(:Z(#(*p(|#*h(*j(w-*`(/DM*t(( (/("j(&W$"f(#*j(:Z(@$*`(DM($*j(n-:Z(:'$*j("f(&ҝ$7$:Z($*j(/'$+ *h(-{$͍'BK{%z$*`(#K-ڮ$ʹ(>4.*t((BK*h(*j(- ͼ/6%̈́(*`(:Z(^% f%z'f%DM:'`i"v(*h(*d(w-*v(D-DM-"h(*v(-"v(ʞ%'i%:Z((*h(##('*h(6 #6 #"h((̈́(*`(%Þ(*h(('*h(̈́(*h("h((̈́(:Z(@ &%6#6#"h(*h(*f(ͼ/o-(&~("f( &!(*h(m&*f(~(*b("f("h(*t((s#r*n(s#r:Z(ܧ&ʹ(/!"n(Þ(:[(–&:[(ʢ&¢&*f(~(ͼ/"f(â&xr# xr# Ü&&*b(x(####*n(s#r&~(ʹ(!m*!(*h(x(&"h(ͼ/(&x7*f(*h(K-?&*f(:Z(~' ' '#"f(&*':[(?:Z("j(:'>2V(PYz~#?'4.z>4._'D-r#s+V#^+~ʰ'<:[(z7#~<ö':[(z7#~ʶ'*f(~(ͼ/"f(ͼ/('!(-~*t(@'6^#V6 s#r m* ~**f(*h(o-*b(-*f(*b(w-*j("j(*b("f("h(ʹ(/ʹ(/"t(*X(-*t(8!f(-×(*t(ɯ(Þ(*n(#|<(|("n(*p(|<(|(+"p(*b("f("h(*d(J-*h(J-! |2)}2)ʢ)>2))͹)>4.)d*~*):)<|) )! w/4.!*J*d*/d*/*)d*)/<>4.>/!)[*R*" s#r!"a/͕*~*#m**t+*:)<*/=*|*!)*ѯM+!ʱ***>*S*W**/DM- +‰*>4.>4.1*>t+|&+)*:)<9+/=M+"6+*>~#!#F6+Np+FqOp#q#pG~*}O):)<+ʙ+|! ʳ+*͹)³+x°+>)7+7*ʟ+! q!~w[*|d*+x8! 6/<,G*|!!w ,x ,7+>+/_/ /!=0,)(,/%"9,~#!H,, "/!e,W-a/z,w,9/,,,,,,9/,"=,Ç.*9,Ä,*;,Ä,*=,+|>S"/,ͩ-̈́,>K"/,";,|,G:?,#~==#,===,=,##,^#V#Ç/~a{ ~-w ->%4.#~+ -"-/<!--3A<>&4.x# 8-K-GzT-{xɅo>g{_zW{ozg}O|G}_|W}o|gɯo>g^#V#^#Vr+sɷ|g}oDM}ĺ-PY|-)ͺ-)yOxG-33. -~# --x-y -a/p/i/z.zq# .x>4.!9"-.~~2[."!.".*-.|:[.O.o&9/\.9//o&./ERROR͇.".!.͛.*.s.!"/͛.Ê.". ڦ.{:.|ğ.ý.!w#".~.@"/>:"//<6P/ o&6/~#.9/0?: ~ /#/~"/> _/G/?/./ G/~#$9/"/G/p/i/~#foy/~#fo o GM _ WÇ/^#V+Ù/++Ù/##^#V+s#r+*!~6#W-6ɀ*/)))))))}o&ɯ)lg/#ͅ**/**N#"g"i23*~<ʀ0=2-0# >@4.!E0!l0W-a/ɬ000/11000002^#V#339393^#V#339393^#V#N#F#*g33*i-+|#02!PYD-33Ñ03/31313130À03G3^#V#!$00-!0>16\3+r+s #1^#V#!01! 01]:0o"0:0o"0$0!0-*0*0D-:0r1##"+0*+0+"+0|>@ʝ1!0ͪ1!0ͪ1Ѻv1>ڝ1> !-03>3^#V#^#V#N#F#~2o".0I22oy1y# xt# BK*.0#}! "+0y92y# +y92y# ~2:o@2o>t2+~#)2xG:o2o~7+t2yI2+~z2ß:o@>t2y@f2*+0K-> t2z> t26zz2*.0:ow+p+q+r+s+r+s####!2"2!2"232*2K-2*2K-3>4.*2#w2K->4."2*22K->4.~+"293*2##"2s#r2K->4.\3*22K->4.^#V+++"27-./% <=2&?'"5@Z{[lP}M]\Nk`Kaz^L~no|_myjС*3vM{25v"6v:@v\*hv*-v:lT|\!"8vK"3v+"3v#*\Ê o  }!_vзG\z!avد2_vz2`v:/:]vF*0*3vow+p+q+r+s+r+s####!2"2!2"232*2K-2*2K-3>4.INVCE  O ----------------------------------------------------------------------- | ORDER RECORD | | | | Date (M/D/Y): // ORDER #: | | | |SALESPERSON: SELLER ID: | | Buyer: BUYER ID: | | Address: P. O. Number: | | City: | | State: Zip Code: SHIP VIA: | | | | Quantity Product Unit Cost Total Cost | | | | | | | | Tax Rate: % Sales Tax: TOTAL ORDER: | ----------------------------------------------------------------------- 򠱮 ŮƠ宠堠 Ů A@0!990112MO"A!!990131DA%A@"X89YR3@1ORDER@ SALESPERSON'?ASTAFF STAFF ID' @ CUSTOMER NAME &?ACLIENTSR CUST ID&@ SHIP ADDRESS?@PO NO@ SHIP CITY @SHIP ST! @SHIP ZIP? @SHIP VIA Q 999QUAN 1( APRODUCTR PRODUCT 1('( | $.COST 1'3 6 |  $',.TOTAL 13 P 999QUAN 2( @PRODUCTR PRODUCT 2('( | $.COST 2'3 6 |  $',.TOTAL 23! `.TAX RATE!: ` ',. 100 SALES TAX:9 6|  $ ',. TOTAL ORDER9Q 999QUAN 1( APRODUCTR PRODUCT 1('( | $.COST 1'3 6 |  $',.TOTAL 13 P 999QUAN 2( @PRODUCTR PRODUCT 2('( | $.COST 2'3 6 |  $',.TOTAL 23! `.TAX RATE!: ` ',.08,03,82,77781,,GSJ,John Goodguy,GBN,,450911,,,,GREYNHD,9,GADGETS,,,11,GIZMOS,,,3.5,127.13,3759.53 08,13,82,77790,,GSJ,John Goodguy,GBN,,471311,,,,RR EXP,3,GADGETS,,,1,WIDGETS,,,3.5,9.22,272.92 08,27,82,77800,,GSJ,John Goodguy,GBN,,478563,,,,P POST',6,WHATSITS,,,,,,,3.5,56.93,1683.53 09,01,82,77804,,GSJ,John Goodguy,GBN,,478604,,,,BUS,3,GADGETS,,,4,WIDGETS,,,3.5,37.22,1100.76 09,03,82,77809,,GSJ,John Goodguy,GBN,,478678,,,,BUS,3,GADGETS,,,2,WIDGETS,,,3.5,23.22,686.84 08,02,82,77777,,GSJ,Sally Sendemback,SRC,,820208,,,,UPS,3,GIZMOS,,,,,,,6.0,46.49,821.39 08,04,82,77784,,GSJ,Sally Sendemback,SRC,,820482,,,,AIR FRT,3,WHATSITS,,,,,,,6.,48.79,862.09 08,09,82,77787,,GSJ,Sally Sendemback,SRC,,820982,,,,P POST,3,GIZMOS,,,,,,,6.,46.49,821.39 08,23,82,77795,,GSJ,Sally Sendemback,SRC,,822382,,,,1 CLASS,3,WIDGETS,,,1,GADGETS,,,6.,41.26,729.04 09,02,82,77808,,GSJ,Sally Sendemback,SRC,,820209,,,,1 CLASS,3,WIDGETS,,,1,WHATSITS,,,6.,52.25,923.23 08,02,82,77778,,HBS,Barney Addsmore,AUM,,334267,,,,FED EXP,2,WIDGETS,,,4,GADGETS,,,4.0,30.06,781.58 08,09,82,77786,,HBS,Barney Addsmore,AUM,,334276,,,,AIR FRT,3,WIDGETS,,,2,GADGETS,,,4.,31.02,806.70 08,12,82,77789,,HBS,Barney Addsmore,AUM,,334305,,,,UPS,3,GIZMOS,,,4,GADGETS,,,4.0,45.06,1171.56 08,19,82,77793,,HBS,Barney Addsmore,AUM,,335001,,,,UPS,12,GADGETS,,,1,BODKINS,,,4.,68.24,1774.40 08,24,82,77797,,HBS,Barney Addsmore,AUM,,335543,,,,P POST,3,WHATSITS,,,,,,,4.,32.53,845.83 08,25,82,77799,,HBS,Barney Addsmore,AUM,,335580,,,,UPS,5,WHATSITS,,,2,BODKINS,,,4.0,106.32,2764.54 08,30,82,77803,,HBS,Barney Addsmore,AUM,,335693,,,,P POST,5,WIDGETS,,,1,GADGETS,,,4.,43.50,1131.20 09,01,82,77805,,HBS,Barney Addsmore,AUM,,335727,,,,UPS,6,WHATSITS,,,3,WIDGETS,,,4.0,89.05,2315.53 09,07,82,77810,,HBS,Barney Addsmore,AUM,,336504,,,,AIR FRT,3,WHATSITS,,,,,,,4.,32.53,845.83 09,09,82,77813,,HBS,Barney Addsmore,AUM,,339603,,,,RAIL,2,WIDGETS,,,1,BODKINS,,,4.0,42.05,1093.33 08,02,82,77780,,HBS,Fred Paysontime,PCI,,20802,,,,RR EXP,5,GADGETS,,,,,,,7.0,30.76,470.26 08,04,82,77783,,HBS,Fred Paysontime,PCI,,20804,,,,1 CLASS,7,WHATSITS,,,,,,,7.,132.83,2030.53 08,16,82,77791,,HBS,Fred Paysontime,PCI,,20816,,,,P POST,6,WHATSITS,,,1,BODKINS,,,7.,113.86,1740.46 08,23,82,77796,,HBS,Fred Paysontime,PCI,,20823,,,,P POST,3,GADGETS,,,4,WIDGETS,,,7.,74.44,1137.98 08,27,82,77801,,HBS,Fred Paysontime,PCI,,20827,,,,P POST,7,WIDGETS,,,,,,,7.,97.98,1497.70 08,02,82,77779,,STW,Joe Anybuyer,ASO,,0803ZI,,,,MAIL,10,WIDGETS,,,3,BODKINS,,,5.5,217.45,4171.13 08,05,82,77785,,STW,Joe Anybuyer,ASO,,080530,,,,1 CLASS,3,GADGETS,,,1,GIZMOS,,,5.5,14.50,278.20 08,18,82,77792,,STW,Joe Anybuyer,ASO,,081821,,,,1 CLASS,3,GIZMOS,,,,,,,5.5,42.61,817.51 08,25,82,77798,,STW,Joe Anybuyer,ASO,,082514,,,,GREYHND,3,GADGETS,,,4,GIZMOS,,,5.5,71.32,1368.22 09,02,82,77806,,STW,Joe Anybuyer,ASO,,090205,,,,GREYHND,4,GADGETS,,,,,,,5.5,19.33,370.93 09,08,82,77812,,STW,Joe Anybuyer,ASO,,090813,,,,MAIL,3,GADGETS,,,,,,,5.5,14.50,278.20 08,04,82,77782,,STW,Mary Ordersbodkins,OMC,,149561,,,,P POST,4,BODKINS,,,,,,,6.0,156.32,2761.76 08,11,82,77788,,STW,Mary Ordersbodkins,OMC,,149599,,,,UPS,3,BODKINS,,,,,,,6.,117.24,2071.32 08,19,82,77794,,STW,Mary Ordersbodkins,OMC,,149603,,,,P POST,5,BODKINS,,,,,,,6.0,195.40,3452.20 08,30,82,77802,,STW,Mary Ordersbodkins,OMC,,149854,,,,UPS,1,BODKINS,,,,,,,6.0,39.08,690.44 09,02,82,77807,,STW,Mary Ordersbodkins,OMC,,150006,,,,UPS,3,BODKINS,,,,,,,6.,117.24,2071.32 09,06,82,77810,,STW,Mary Ordersbodkins,OMC,,150032,,,,UPS,3,GIZMOS,,,3,WHATSITS,,,6.0,95.29,1683.49 09,07,82,77811,,STW,Fred Paysontime,PCI,,20907,,,,MSSGR,5,WIDGETS,,,2,GIZMOS,,,6.5,98.56,1614.96 ,,,77811,,,,,,,,,,,,,,,,,,,,, ,,149603,,,,P POST,5,BODKINS,,,,,,,6.0,195.40,3452.20 08,30,82,77802,,STW,Mary Ordersbodkins,OMC,,149854,,,,UPS,1,BODKINS,,,,,,,6.0,39.08,690.44 09,02,82,77807,,STW,Mary Ordersbodkins,OMC,,150006,,,,UPS,3,BODKINS,,,,,,,6.,117.24,2071.32 09,06,82,77810,,STW,Mary Ordersbodkins,OMC,,150032,,,,UPS,3,GIZMOS,,,3,WHATSITS,,,6.0,95.29,1683.49 09,07,82,77811,,STW,Fred Paysontime,PCI,,20GSJGBN7778108GSJGBN7779008eGSJGBN7780008EGSJGBN7780409!GSJGBN7780909GSJSRC7777708^GSJSRC77784087GSJSRC7778708GSJSRC7779508pGSJSRC7780809UHBSAUM7777808;HBSAUM7778608 HBSAUM7778908 HBSAUM7779308 eHBSAUM7779708 GHBSAUM7779908 #HBSAUM7780308 HBSAUM7780509 kHBSAUM7781009NHBSAUM7781309+HBSPCI7778008HBSPCI7778308iHBSPCI7779108GHBSPCI7779608,HBSPCI7780108STWASO7777908jSTWASO7778508LSTWASO7779208-STWASO7779808STWASO7780609hSTWASO7781209BSTWOMC7778208STWOMC7778808zSTWOMC7779408WSTWOMC77802088STWOMC7780709STWOMC7781009qSTWPCI7781109VBSAUM7779908 #HBSAUM7780308 HBSAUM7780509 kHBSAUM7781009NHBSAUM7781309+HBSPCI7778008HBSPCI7778308iHBSPCI7779108GHBSPCI7779608,HBSPCI7780108STWASO7777908jSTWASO7778508LSTWASO7779208-STWASO7779808STWASO7780609hST,. AK,0.0 AL,6.0 AR,3.0 AZ,5.0 CA,6.0 CO,6.5 CT,7.5 DC,8.0 DE,0.0 FL,4.0 GA,4.0 HI,4.0 IA,3.0 ID,3.0 IL,6.0 IN,4.0 KS,3.0 KY,4.0 LA,5.0 MA,5.0 MD,5.0 ME,5.0 MI,4.0 MN,5.0 MO,4.0 MS,5.0 MT,0.0 NC,4.0 ND,3.0 NE,4.5 NH,0.0 NJ,5.0 NM,4.0 NV,3.5 NY,8.0 OH,4.0 OK,4.0 OR,0.0 PA,6.0 RI,6.0 SC,4.0 SD,5.0 TN,4.5 TX,5.0 UT,4.5 VA,4.0 VT,3.0 WA,5.3 WI,4.0 WV,3.0 WY,3.0 ,  AKAL ARAZCA%CO-CT5DC =DE EFL MGA UHI ]IAeIDmILuIN}KSKY LAMAMD%ME-MI5MN=MOEMSMMTUNC]NDeNEmNH uNJ!}NM"NV# NY$OH%OK&%OR'-PA(5RI)=SC*ESD+MTN,UTX-]UT.eVA/mVT0uWA1}WI2WV3 WY4H%OK&%OR'-PA(5RI)=SC*ESD+MTN,UTX-]UT.eVA/mVT0uORDER  F #:  Date (M/D/Y): // #: Bill to: Ship to: Address: Address: City: City: State: Zipcode: State: Zipcode: P. O. #: Ship via: Terms: Quantity Product Description Unit Cost Total Cost Tax Rate: % Sales Tax: Total: 1 T099999991 ORDER NUMBER1 $U@0!990112MONTH 'A!!990131DAY*A@"X89YEAR<?QR9999999CUSTOMER CUSTOMER NUMBER< @ BILL NAME @ BILL ADDRESS @ BILL CITY) @OKSTATESDTA BILL STATE)@ BILL ZIPCODED/ACddddddddddddddddddd SHIP NAMED/@ SHIP ADDRESSD/@Cddddddddddddddddddd SHIP CITYD-/@CCOKSTATESDTA SHIP STATE-)>@99999 SHIP ZIPCODE)5 A2 HHHHHHHHHHHH P O NUMBER53 "A DDDDDDDDDDDDSHIP VIA3. ;A HHHHHHHHHHHTERMS.# Q999 QUANTITY 1#2 A@/CC-GCPRODUCTSDTA PRODUCT 12  @ DESCRIPTION 1 ,2 | $. UNIT COST 1,8 ; |  $',. TOTAL COST 18# P 999 QUANTITY 2#2 @@ /CC-GCPRODUCTSDTA PRODUCT 22  @ DESCRIPTION 2 ,2 | $. UNIT COST 2,8 ; |  $ ',. TOTAL COST 28!`.TAX RATE!: $`  ',. 100 SALES TAX:3 ;|  $ ',.TOTAL3PAYMENTSO --------------------------------------------------------- | PAYMENT RECORD | | | | ID: Name: | | | | DATE OF PAYMENT: | | | | AMOUNT OF PAYMENT: | | | --------------------------------------------------------- 򠱮 ӮƠ宠 Ӯ !ACLIENTSR ID! @ CUSTOMER NAME @MO!@DA$@YR+ x$.AMOUNT+ASO,,08,09,82,3233.91 ASO,,09,09,82,6635.06 AUM,,08,10,82,2315.53 AUM,,09,10,82,8144.61 GBN,,08,03,82,5443.06 GBN,,09,11,82,5715.98 OMC,,08,12,82,3452.20 OMC,,09,09,82,8285.28 PCI,,08,05,82,1787.60 PCI,,09,05,82,6786.93 SRC,,08,10,82,4171.13 SRC,,09,10,82,1683.48 ,,,,, ASOASO AUM/%AUMF.GBN]7GBNt@OMC IOMC"RPCI9[PCIPdSRCgmSRC~ on rive PAYMENTSDTAPAYMENTS$$$PRODUCTRO --------------------------------------- | PRODUCT RECORD | | | | Product Name: | | | | Wholesale Price: | | Retail Price: | | | | STOCK ON HAND: | | | --------------------------------------- 򠱮 ҮƠ宠 Ү *'AddddddddPRODUCT**'y $8999.99 WHOLESALE*''y $8999.99RETAIL'' T STOCK ҮƠ宠 Ү *'AddddddddPRODUCT**'y $8999.99 WHOLESALE*''y $BODKINS,325.68,651.36,46 GADGETS,43.95,87.90,214 GIZMOS,129.15,258.30,136 WHATSITS,135.55,271.10,134 WIDGETS,99.98,199.96,155 ,,, .68,651.36,46 GADGETS,43.95,87.90,214 GIZMOS,129.15,258.30,136 WHATSITS,135.55,271.10,134 WIDGETS,99.98,199.96,15BODKINS GADGETS GIZMOS 4WHATSITSNWIDGETS jz{|}~ (highst) Entr the lagest accptable vlue foPAYMENTSDTAPAYMENTSNDXPRODUCTRDEF PRODUCTRDTAPRODUCTR$$$DS-5D,"DataStar - 5"" Dynabyte",350.00 DS-5H,"DataStar - 5"" Heath",350.00 DS-5M,"Datastar - 5"" Micropolis",350.00 DS-5N,"DataStar - 5"" North Star",350.00 DS-8I,"DataStar - 8"" CP/M STD",350.00 DS-RM,DataStar Reference Manual,60.00 MM-5D,"MailMerge - 5"" Dynabyte",150.00 MM-5H,"MailMarge - 5"" Heath",150.00 MM-5M,"MailMerge - 5"" Micropolis",150.00 MM-5N,"MailMerge - 5"" North Star",150.00 MM-8I,"MailMerge - 8"" CP/M STD",150.00 MM-RM,MailMerge Reference Man.,20.00 WS-5D,"WordStar - 5"" Dynabyte",495.00 WS-5H,"WordStar - 5"" Heath",495.00 WS-5M,"WordStar - 5"" Micropolis",495.00 WS-5N,"WordStar - 5"" North Star",495.00 WS-8I,"WordStar - 8"" CP/M STD",495.00 WS-RM,WordStar Reference Manual,60.00 CS-8I,"CalcStar - 8"" CP/M STD",295.00 CS-5M,"CalcStar - 5"" Micropolis",295.00 CS-5N,"CalcStar - 5"" North Star",295.00 ,,  North Star",150.00 MM-8I,"MailMerge - 8"" CP/M STD",150.00 MM-RM,MailMerge Reference Man.,20.00 WS-5D,"WordStar - 5"" DynabyCS-5M }CS-5N 'CS-8I UDS-5D DS-5H )DS-5M NDS-5N xDS-8I "DS-RM JMM-5D qMM-5H MM-5M @MM-5N kMM-8I MM-RM ?WS-5D eWS-5H  WS-5M 2WS-5N \WS-8I WS-RM . QPRODUCTRNDXPRODUCTSDTAPRODUCTS$$$Jo|!9^#V!P!h!!!!!!ͤ!!9^#V##^#V!9s#r!ͦʈ!!ͤ!!9!9^#VX ʥÈ!!9s#r!9~#fo#s#r+!9^#V! !9^#V!9^!ͦ!ͤ!!9^#V!9só!!9s!!9!9^#V ͦB!"!ͤ!9^#V ͦg!<!ͤ THIS PROGRAM INSURES THAT AN INDEX FILE IS TERMINATED BY AN END OF FILE CHARACTER TO RUN: TYPE PUTEOF filename.NDX TYPE RETURN EXAMPLE: PUTEOF ORDER.NDX file not on disk fatal error - disk full fatal error - bad close on file |g}o|/g}/o^#V#DM!99`in|z2 : v}$}}°|ʿ!}¿|ʰ!}|}|?>o&zo&|}|>o&|o&z2 : v||/g}/o#z$/W{/_$DM!>2 ))7#}o|gO : =2 /}: =2 /}DM!>))n =f}}/o|/g#}|ʿð|g}o{_ʷ|/|7g}o{_ʷ)²}}o|gN#F# N#F#z{##^#VBK^#Vz#y####x#~#fo}|>?o&}|>o&{_ʷ|g}o/|g}o~# xD!9 ~#[!h|o!P!9s!9! b! !b!^9^#V!9s#r! 9^!ͦʷ!! 9^!9s#r! 9DM!9~#fo+s#r#|`i#DM+^!9~#fo#s#r+s!!9^#Vs!^9^#Vo!9^#V^zI!9~#fo#s#r+^f *WQOeO* DM* o&O̓o&O* *+++* DM* !9N#F#^#Vkb6#> 6 #=®>6#=· : > A$[@a${$`w# .+w#{o|g +w#!!|a{ !9^#V* !9}|R" |!o!" !!9s#r!9~#fo#s#r+^!9s#r! DM!"V Ý*V #"V *V ʐ!9^#Vz!9^#V^! ͦ!9^#V^! ͦ!9~#fo#s#r!9~#fo+s#rê!9^#V!`i*V ) s#r!9^#Vzʁ!9^#V^! ͵ʁ!9^#V^! ͵ʁ!9~#fo+s#r!9~#fo#s#r+^`i#DM+s!`i#DM+sÖ! *V ͤo͢ !9^#Vz! QA:$$$.SUBo!X !9s#r!9~#fo%s#r!9^#V!6 !9^#V!$^z# !">!!9^#V! 9^#V͛E !">!! 9^#Vù !9^#V!bͦt !">! !9^#V!b!9^#V!bͦʬ !">! !">!P P w ! 9^#V#!9^#V!$s!!9^#V!#s!9^#V!!s#r!9^#V!X ͺ%͟o!9^#V!%^X DM!$ ^!K !b!!$ s!o! 9^#V!%^X DM!!9s#rÑ !!9~#fos#r!9^#V!9~#fo ! 9^#V!9~#fo!b!!b">| `i!~#fo#s#r~ !9^#Vo! 9^#V!%^X DM!!9s#r( !!9~#fos#r!9^#V!9~#fo} ! 9^#V!9~#fo!b!"b">|} `i!~#fo#s#r !9^#Vo!9^#V!%^X DM! 9^#V!! s#r!!# s!o!9^#V!%^X DM!#b!! ^#Vo!9^#V!%^X o!9!.9^#V͛!9!bo!!bDM ͦS ! !b! DMc `iͦc !DM`io!9^#V! ͦʈ ! !b!9^#V!b!9^#VHI@ÉT\ Copyright (c) 1982, 1984, MicroPro International Corp.  REDIT Release 1.03 ID # 711303KP-00A  KAYPRO Computer    "O: WͱͺP2 Ñ! 6OG0: yK_ʉ %! ^#VͤO!`!_457#2  =9Dl 6 { F LD 2 2 2 2 <̀RVQP]" " `i" * DM* * n: ] #z : /<_͎Q͕É*BKPͰC: ¾+ ܨ~ ]+#͝QK͝Q++#~ ~ "+P: ]Cͼ̓P{/Cɻ/P{' “]WVbk#tM: l**I͟^#V͈C: : .PͲĩ™ͩʟC]gy~  ɴ ]gbk~=ytPͰͲ]CͰì&~ ̄]_ C&Pq#~ :.-PͰ_?CPq Z.pQq.: : ! ~͞:̥ʞ2* ͕ 2CVQ! ~/w*͵~ªz͝Qʼ~# ¼}|~2 ͵ n|: _<ҕ:"<"P +*+:G:WO_: : . ]͞: ʞ#~ l>O %͞[* #( LOͱ CP* .Қ #{=y* (  ͓LO!?]QP* ~ ͊>͍W!w]SPO_ʉ l!  0* ͓LO=G0!]QP ̊: H ̎* ͓LO=:_ck͓͝Q{LOɾĀ͓9!VQ*Y!Z<AV !~#y % : b (s >27 N < ZF ͤZF y : O*  +y<ZF B_>B ~V_!Z0s#r ! Z:Y :Y? * |<ZF : ZN : 27*YOGZV 0$F !Z00% !w^0~2 #h !{^e ʄ @>:>  ʭ ̊Ͱ* ʤ >͔LOͱ =ͫ  O ! LO͓# ) S!VQ!3]5 "ͰH: GQ VQ: O: !;]:=QP: /<_( : W͞!5!5~* M %͏!7]:V}UN*+YsT"+YW OsTy͔ b QNͤ ʠ O#~7ȹ  xQ: >!0!= %X͆ !YW*̀R2x!__OSPͤ? !K]QP*2!VQç* * O]!W] !]QP! 5!S]QP! 6 #c xPL L 6.N 6 >2 ͕ =: } 2Yt:>ʇ C*Y1Y2Y3YCYFYRYXYz{~#% 5 H F ! wɷyq  i Gw p" = :2 _i ! ^#V#N#F#{%X}U S ! C]G]!#|!{]nUnU}Y:@VY Oc_ O^#VzS#`̦r+s^#Vz!Bē)|2V}o&H 6H Hw. ͝S(*Yʿʹë*Y"Y :ƀz~#*Y Ϳ*Y"Y>w#c_  ..د  REMSGS OVR! f"H 2͆! "+Y~‚ͣڒ(WOͤͦ26sT6. >zp}Y*YDMM*YDM*Y*M":Y!Y#:Y^#V{ r+s=**| }Ny ĤT#@OͤT:ͤT!6~#.ͤT!GnU ???  xMH\ % ͯ͝SͫWw !:O!Y % !l% !*Ì:2ͤA<. ͣҾ. :<@2d_!m_0~# ̀R!/]CUͦڹ͝S͆ \!ʌ\ * 7B~#L*RU ~O@u_WRzg!O ~#b~#n:#> ng}R}% >-==-R>  ~<->>>>>ɁOb ~#+N#F+>=r<*#W=|:_H ͑ ywCU–!6!~!_] )}U!Y͔V>V!Y\> 3!c]ʖ!o]G0y!g] !k]NGw# w~# +:YOY#x2Y~# # #O~B~ط7##~+:>X͎A<## ~7s~q.#͎͇ s > ~#~0ͤw[?:~طa_)2͑ Q*"͆""͆͘"͆"͆"?:RPTBAKDEFͻOĻ\ % ɯ2\. !"!6\H 6H !ͻ:!\ O~#~i!\ ~#{ͻ++N#F#yˆ:2_Ͷ"ͻ+~# ¥¥ͻ:*|= x~#" *: ]}o|g\H !>2s]: A2d_ CU͑ v)<2*KT͕ͳ?ͻͻO>A8yq#_Ps)#yOĄ*ͻ4## Œͻ##F#Nͻ¤>E8#~u%ͻ+Ew?G% yͻĻ x ͻNy G#N:</( * 7<# >E86#~# M#N###~@#~~#V>y>y>@y N# ɢ !>2] ’*"":@226#"6.#6 #=¸6#""Qɯw#w#w#"͑ s!~6QH 2h3 ]•!"!l**b*~6>6 00Vʹ !4~6Wjʹ Wjr: ͻ * ,gy<Vcʹ cjrOBK_)b{OzG !: A_ #ڦ ž* hWOͤͅy_VW!y_͒_V& bPY`i)DM *~, y( O%b`q#p>͚: w*4>O>`*5K_\b x/Wy/_( Is\*5! Èb*++YP( A% ͚: w*4! b*++YP( A% *4*y\*5O > < }O|G|}~# x~ +xɷW*45/*45>t*45N*~>Ca2/!#܌ĖE5!/!4W>2/!#>Q>R2/!#Eg2/!#G܌xEz͚: > > >>>>>>~Ⱥwy<:.!ZKq>29N2.!B~5~64#=2.!BF#x+'~Ͷ͵'=W'GͶ~'ͶGw'Ͷ!N_~!Nws'Ͷs̈́^Ͷw͙ss7ͶWͶʥ=W{rͤɷ#~*~#> W~Ⱥw#w#w++:,!O:-!Wyr͟* o7 * g02,!!-!4g.L͇*#[ WH& yʹ Wj!>~w̚2*#>ڐwW…Ƀ5*~:Ĺ*r~Ĺ#͚~ɃwWºDM*~#͚+~wW* : O; !* i"!*#@<W)& {͚+~* DM*&͟O: O+gN>͈}>ͩ>ͩ͆ͤw>͟w>>>QUzRK:@!Y:  U _~6Ń  ( BK b s#r`iɯ  # w# BKz *S I  BK* "*ڡ "*ڡ "* ͥ ڡ " *ͥ ڡ "*ͥ ڡ "7 ¹ >ɯ* + ڿ * # * ; * ~ !!//ɷ7* : O; + !* : O # "!27>U!>U!27*~̰#" 7>U!>2-7! ~w!9"7: 2 7#" t!".7^"""!ͅ###(ک!͇"M6͜#T6̧([02{(~!2*7ͲA:@2Y! ~w: 7 +$!!!"27" 7:7͑3" 7I!"#""7ͯ#"".7!"7͕"+$."="L"U"!7"17!#Z8>"!7"17![38>! ]@:>!]F:>(+$i""i"": Gs"2R/2YVQ>2Y:7*+Y!@!74:727:Ygf$!_2#727:(7$$>ʎ$Ҏ$O>37͗$_~#foͽ1G+#¦$~37>27$$:#<37>27*7& $:+wy$ɯ27* 7>272 _* 7t* "%<2%7r#%:7EҊ%#~?_##={%ɷ! %ʴ%=͑3>Bô%:7<> !37%w#w#w#6/#G<&yO> %6$y27x:&7ͤ*2&7yͤ*w# %:#>8% !_% &>0&>bk8&27O F&X&w R&p# J&: Y3727FO#x% %ì&:#7#ʘ&>$2$7:7&>=Fy27#37&&'¸&%6~#>)'&>#2$7~#&͵u'='e'''}''K':$7'o,'r>}., $':,-''='â'~#* 7k% ':$7$'F#~#'W'yO~#!]0u%T'>('&>?'>$2$7~#ڟ'͵u'7'e'}''&~#>('~#'~'>,'~'#>)'o''x'>"  ~'#"'~'F*Z~#''~'#~(#~2*7~#^#V#O((+:)7:7H(oͤ*-@(>2*72)7͵k(w((w(((({8{8z{(c(~#{(7c({(w(=͑3>{(:#w(*7e"!7:%7(z2 >O.QtWO) !)E/ڲ(qy(_sT#²(:7( )!ͳ*ڲ(}G=4**ڪ(͛)v*ò(')ò(=50͵)50!)i))v*)50\)5050)505050X*))r)50**76!74:7=.x):7<.g}207:7o:7‹)-".72~!*7{+*+Yͬ)T}¶): Yo%-)#T(2)u!Ô)2*)+$)))50*:7<*=279:_)2*+$**'*50D.Qt<*=!746:_'*I27t*~=K*~y> :-75050*+Y>OWTͤ*͓*5ͤ*G~p#…*5+G~p+™*_*7&~!9"7*#7+"#7*!7:7_+~ *Z"/:777+,?!]!7<4/6*7T7ͳ4! ^=*:7,)37ͺ.R+Ԍ+_+-ͺ.+4+.x6,w+c+xx,t+.Gͺ.$ʇ+"ʇ+>/2#7*Zá+*Zͯ+..+++ ±+H~#++y*Z+<> yͺ.ͤ~#+~#+ɯ2+7G37,..:#7".6,F,.- .!,ͺ.(>.6,ͺ.#-AҐ,>.-i,.ͺ. ,b, 0 b,7.7?ͺ.0 ͚,ܻ,-:-77* 7(57>..,.*~,#>,,W,>7x~?7O#ͤ7# ,ͺ.ͤA :#7!-!]0,5͞-7O>.y.:#7Ͳ-ͺ.(‚->.~2#7yʌ-,͒-. x-w-# X- ʂ- 2#7 !^.* Zá+ :(7C> °-ɿy!-N# - =ö-ͺ.͎5=.*?-ͺ.)>.-ͺ.*Zͯ+.E..ͩ.".$7>.ͺ.AҐ,-ͺ."ʋ.0.ͺ.(7?>.ͺ.͎5j.<.ͺ.,>~.ͺ.͎5.ͺ.)7>.>.7"’."ʒ.ͺ.*Z. ú.$%.w#,!^.!].!]*~4/~.####.!].!]</ .6:!7*7*7eo/+"/7*7ͬ)'/Tf_*7$"7:7͵+0+0//000000030///////+0+0+0+0+0+0303030//'00'00//_/_/_/_/_/_y?50/_/:(7: `/:_50/_y_O//_//~#fo/!0~#/y2,7ͤO{0y y0 ?/A?:,760y y0 50yG0!]67!c_ U06^@#w#6:7͵410!1^4344h5h543000013033333h3-4-443322330!_1!_1!_1!_1!_>͡1* 7~>080686!_1qO=4q!_ͽ1 # 1* 7~2 7x/w0: 7Ď4+~#&O1>E8I1* 7+~w!^{1]́1:0x1!]b e)!] 6 H * 711!]6e)!m_>;&! 4J$! 52j_!_2#71: 7:(7>* 7yOʿ1͏2=!7wrW* 7ͅ:7r" 7t, > ~### % #*N2Ԁ5ڮ2«2:*7î2y4/!] {1!^ {1!]{1! 2>0%2&~0 2$-2|):%7=O* :7G2 2%7<2 ~ 3q#3*7T>!_73M3zQUzz* 7O1W_ɇOX3* 7V: 7w r!͒2* 7W:(7NQGyxyr*͞3*y"7*͒2* 7w*7>E͒25!3͒23}ķ5}=* 7w=.)3 1* 7w:7<º!w3 4*7E&+~ 43#64=4#x% :7Obk(4w# 4ͺ.8~w<**͒2=27!ͳ4* 7qh5;4y*~# >BR5W41* 7w3c%~?4T5x5%5EN#x>,N5~?O# #05xOc5#X5y:7_~z5> ͓*m5#m5:7͕5>7ů͕5OG0 =xҊ5G0 —5>$*7T/sT5:7*+YTT_5:%7LO*+Y"6*+Y"7T:%7:7_D6"6*7"+Y~)6>_O36#"6Ty ڤTTT*+Y"7!74͈65`6x<ʄ677*7}o"7T:727G*70~T~̾6̾6#6~›6*+Y"7 6#~#fo0~6O36~#*+YoT !+Y36~6*+YUPTcc  @    #B     € B C !!       "               "QR:2%N2$N27N28N2 :2#N:#N!O~w#:ͤ?  :#N/> :*"w+I;No&)p#qW2;*~^K#>w#~wW^;*27;~.đ;̕;ͣ<};<#~. ͤO#~ͤG##y#µ;x;#«;N#Fy< ;k͎5;;;;{!^KBPCWLH`MB`MT`OPPCPLPNPOSRBPCWPO `*27~ K<:K<͒@^<ͣ<-<^K~ ̴<͒@^<ͣ.:_͉< ͉02:N#x27" 7͢?=*=~>f@@QAW<2:ND2;NH=A>=27N!~^K#F#=*y>O!^K>E~!'_Kx!^Ky2;N–=D= ʽ=>A^##¢=_ =r>!/_K !^K !~^KO#F>#y=*y>O!^K>E~!+_Kx!^KyĖ=*#,>W>!_K>> #~D^h>~#Gv>c>^h>h>Q>> 2N@>`2N~##++Dw͕?DGDDo?ʪ>OҪ>45%?#œ>:N>~wy!^KN!^K!^K!^K@!_K!^K!^K!^K !^K@!_KO~!N 45=?=?Aw####~wc?P?h? Y? w P? ~w?!_?#?!N6#š?DO+~!^KF##~I@y=r>! _K:7@W@!8N~p0@!^K!9N6:7O~!^K*Z@Gͩ<S@~ !^KD^͇@3_:;NKD^ͣ@~ڸ@1 @¿@!:N:NGA:N>@:N@>@~¸@ AA8A kL7LK8A_% ~2_ɇ_!?_0ODwD0GD!_K* 7:7OQWȯ29N͖:9NmA>wmA*~#x27" 7A%BvB* 7W•A*~#>Ax~#+»AW»ADCDBBF'r>B~A^>@2NDC^͸@>2NDDA]TG#@B!_K~KB@BɷmBODE#~?_#~ YB #w#>B5DDBʦBGO##ͭBʡB ~˜B6 #‘BˆBq !^K~ ʵB>+B# ­B* 7_*~#" 7B* 7WBD27^>2N@>P2Nz*~#>Q__B>RD= C2N#_͸@>@2NWC:G! <G>E_D#~?#oC$DC>A_>D##C!>2%NdDDد2*N2$N2'N2)N͂E͐EͫE!*N:(Nw:'N1DG-G?GWJ2$NM>24N> V!]}U*+Y+"+Y!=N͔VVQ#~GͥDdD“Dy24N@ ,ͤD#yOҰDyOEO:(Nz_$D:+Y2+Y>.È5(D2(NVQ>V!]}U*>2)NFx$EH#~E_WWODE{4Ey0 iEyHbEhE) pE)sEVQNq#sT:+Y50D2+Y:4N!]E:4N>2)NE!]>E2)N:4NE!]>E!]>E* #~E*~#y2EEWE>2&NMF2&N͞MhL*L͜FͩF,FͩF M~ F!37 @F~# 1FGnFy ~#bFSF> + ,SF:&NʄF2FE>HFy$~0# ÎF37~# ŸFF F¸F:_F:)NF^F~@OF#ҬF>2'N MFM͌MO:(N!37:*NG #GF:)NFG+~@w:4N>*͉G]\78:4N*͉G][\8:4N*~*!]MlG*~*~!GkLxG*͉G]@:*͌G']F: 25N~H^#V#MLMG1HG͎H#27(".NԞH*.N#~©G!74* 7W" 7G* 7:5NG"7>>#G>$_:7<$^#V#"7^#Vɯ27#" 7!7"17" 7:5N"7~NH*177y4"7^H#*17#6"17*7F###6#͎H#{(~oH####*17+"17*7"0N####"7*0N0~#H*0N0~kL:7GnL:7H I!I BI eItIIT$tIIII!I"I I^I#^#V#H>:!_>I27* 7>~_$#~z_$#~v_$I3^BJ2_ BJI!~rI*J^!_I*J+^@@* 7͔I :7><v_$27PK>27* 7~|I!I".N=r>~G27#>/% !_I;^!_J:(7BJ!`BJ#JBJ2_1 BJ|I* 7N#F###BJ3Ji`0T] ~#KJy27:4N*~F!]M͓J!>NLMVLLz27Kz#pJ!>NHw#< ™JH26N>N.K J#~.KJJ^+Vs#r>26NîJ:6N JF#OJyJxJ# Jy:/!!7!OKK!VKhL:/!.K-%GKr>27*y>ͮ%GnL ** eK{Ko^Q^R^c^s^k^#N#F#ڑK|K`iKhLHK K KCK I:/!*y͔I!O^hLK![^hL+~_$+~=6K!_^hL!S^hL:/!6K!W^hL`iK:7<L:#N2#N:7<v_$;W)L!#N~45w6L-LhL:%NWLM! nL![_hL: YG=L L*+Y:@ẀR70~̙LʧLʬL̸LOWL#xnLnL#Fx Ly#nL#~#fo"nL#͌MG~L L~=GÜLxLL;WW!$Nw>24N Ly  L:%NʤTy M_2M!M!-N4M:$N{\MH !-N~6W !M :M!+N lMFGM4 xM2-N6# †M4~P QG~PP~~Q{_zQ QxNw:@* R_: W!R:P~# &QPVQ*͎Q:RO͒Q MQ:YG>OQ: ROҊQ>Q͎QʄQͦQO xnQxAV͝Q~# ’QÎQ: ~.* 7|ʳQ~#W:R_~ #Q/<_ûQP >: >* R*Y: RGO^#V#" QfOS2 Y:2Y:@2YG*"2Y"4YS[R"2YX"4YX"6Y:@_:M!V![2!Y*"W"X" Xͧ!gTT̀R>2$Y*@: Ygc%.RB*2Y""YRS¼RR*6Y+r T TžR:Y(T!R"+YP6 #R:YS\U:gES*)Y{Sz=SG:!YS*"YlT=S!MgT*aMT:`$SLU\S!VgTJ\S![gT:T͑S!CXZQDMg7S*c-Ty&~S / lSGT~+=xjS dT͑S~2$YwAS")YDMX""Y* Y:@=gR TSO͹Sy:$Y2YgTTF#NTiTyT*+YͤTS›TRT!)Y4*"Yq#""Y*+YRͪTy T : Y=!+YU͹S!+Y4: YTT*+Y$o"+Y2TyO XW*+YTT]!U U"+Y: YG {͹S#U*+Y|/UDMXOS@U*6Y 6*+Y;W_UWiUIUO"+Y}U ȹ*+YDM}U0!"'Y`i"%YU!UU*%Y"-Y*'Y|µU*%Y"+YUTDM"+Y"U}U>2U*U$~~#VV*V\VpVzV ̊V V U.VxUUɷ^#V#"UF#UU SVͯS!%Y4: YQVw#4~/U> 9VSV:%YSV>=9VcVSV:&YmV#*%Y"'Y ڿVOsTq#VsVwʹV#6ùV 6ʹVVÝV{!+Y5 sT5+`.T$=VW X«W͛T:/Y&W2WWͫWaWWͫWwW&W::)YO*"Y FSLW:$YG: YxWW#+ ]W+dWT͍WuWjW>͍W*0Y͆W*+YRgW͖W=WO=™W;Wy#45!&X2XSW*6Y~OXKX6#:@8XXXuX2XĚXrX# : Y=^X:p=: Yo&+~ X„XzڗX{`iR:X XO͉TWX#: Y¡X:XoO`RX6 # : YX!pgTT;WX*4YX*2Y: Y YogWYxY)Y<=>=<>=&+-*/^(),< < F I E L D D E F I N I T I O N > > press ^J for help on any item Field number/name:'Equivalent to field:'Control break level:'Copy attributes of field:'Field source: (File/Calc/Input)' File number/name:' Field number/name:' Index field number/name:' Numeric/String? (N/S)' Enter string expression:  Enter algebraic expression:  UNLESS THEN  Enter input prompt: Right justified? (Y/N)'Enter pad character:'Edit mask? (Y/N)'Edit Mask Condition Codes: F = float character position'T = trail character position 1 = float if first in column'C = trail if first in column - = float if negative'N = trail if negative + = float if positive'P = trail if positive ' = constant if data on one side'" = constant if data on both sides _ = constant or field data'. = decimal alignment position This mask defines positions only: floating, constant or decimal alignment. The next mask provides the actual characters to be used at each position. Enter the edit mask condition codes:This second edit mask is used to define the actual constants that will appear if the conditions of the first mask are met. When these conditions are satisfied, one character will appear in the field for every constant character in the mask. Combinations of floating characters may be used here; for example the characters "CR" used as constants in this mask with a corrsponding "NN" in the previous mask will print a CR after negative quantities. Enter the edit mask constants: When should the field be loaded with a new value: = always R = only at report start P = at each new page 1-9 = after control break * = when the following expression is satisfied Enter load condition ( /R/P/n/*): Enter expression for field load: LOAD WHEN Output field to file? (Y/N)' When should the field be cleared: = always . = never P = at each new page 1-9 = after control break * = when the following expression is satisfied Enter field clear condition ( /./P/n/*): Enter expression for clearing the field: CLEAR IF lowing expression is satisfied Enter field clear condition ( /./P/n/MLMG1HG͎H#27(".NԞH*.N#~©G!74* 7W" 7G* 7:5NG"7>>#G>$_:7<$^#V#"7^#Vɯ27#" 7!7"17" 7:5N"7~NH*177y4"7^H#*17#6"17*7F###6#͎H#{(~oH####*17+"17*7"0N####"7*0N0~#H*0N0~kL:7GnL:7H I!I BI eItIIT$tIIII!I"I I^I#^#V#H>:!_>REPORT COM == -}= = ] = =  = =  m = =  = = M }= X 2 e H   # + 3 5 8 9 D U S a e e  3; ) IzzIzzI66l HHl HHl KK"^^"^^"aa%zz%zz%}}')*,*0/3c2553HH36}};8__lAXXB966!HH!HH!KK$^^$^^$aaI&zzI&zzI&EFGJj|^ J LPRMP)W\rX`U#Y]d[ze[\g\\Q ),.0?OS~,!.8EGZgi7breh<Km!npnnnkjm;oo pSpσ ppq`sbsstdtwu'vvEwhxyzHzz&{r{{1||CHXmϘ|"}}}B~~~$8>EK_oxǙЙ 5EZ\q2pN8fŠNȋ8_%Y?͎VʏK 0i:ޒ9jĕ:DTAFT1C-N+P'".NYEAIOFCISR-ABCDEFGHIJKLMNOP?NS_00-- SINENNF0?0??0   *.1234567899PRRP123456789 :CURSOR: ^A=left item ^S=left char ^D=right char ^F=right item ^E=up line ^X=down line ^U=set/clear tab ^I=tab DELETE: DEL=char left ^G=char right ^T=entire column ^Y=entire line INSERT: ^P=line buffer ^V=char right ^B=entire column ^N=entire line OTHER: ^J=rotate help ^W=list form ^C=form done ^K=control break FIELD: ^Q,_=add/extend field ^Z=delete field ^R=define field OTHER: ^J=rotate help ^W=list form ^C=form done ^O=toggle ^ char CURSOR: RETURN=next item ^S=left char ^D=right char ^E=prev item OTHER: ^A=previous field ^F=next field ^G=delete char ^V=insert char ^C=end definition ^R=start over ^Q=locate field ^J=more help OTHER: ^A=previous line ^F=next line ^G=delete char ^V=insert char ^C=end definition ^Q=locate line ^J=more help OTHER: ^A=previous file ^F=next file ^G=delete char ^V=insert char ^C=end definition ^R=start over ^T=top of page ^J=more help OTHER: ^G=delete char ^V=insert char CURSOR: ^E=up line ^S=left char ^D=right char ^X=down line PRINT CNTL: SPACE=always print P=once/page R=once/report :=summaries only 1-9=print at control break n .=non-printing *=user defined _______________________________________________________________________________ LIN=001 CHR=001 HELP SCREEN # LIN=001 CHR=001 NUM=000 LEN=000 POS=000 EDC=xxCTL.AND..OR.<><=>=<>=&+-*/^(),< < F I E L D D E F I N I T I O N > > press ^J for help on any item Field number/name:'Equivalent to field:'Control break level:'Copy attributes of field:'Field source: (File/Calc/Input)' File number/name:' Field number/name:' Index field number/name:' Numeric/String? (N/S)' Enter string expression:  Enter algebraic expression:  UNLESS THEN  Enter input prompt: Right justified? (Y/N)'Enter pad character:'Edit mask? (Y/N)'Edit Mask Condition Codes: F = float character position'T = trail character position 1 = float if first in column'C = trail if first in column - = float if negative'N = trail if negative + = float if positive'P = trail if positive ' = constant if data on one side'" = constant if data on both sides _ = constant or field data'. = decimal alignment position This mask defines positions only: floating, constant or decimal alignment. The next mask provides the actual characters to be used at each position. Enter the edit mask condition codes:This second edit mask is used to define the actual constants that will appear if the conditions of the first mask are met. When these conditions are satisfied, one character will appear in the field for every constant character in the mask. Combinations of floating characters may be used here; for example the characters "CR" used as constants in this mask with a corrsponding "NN" in the previous mask will print a CR after negative quantities. Enter the edit mask constants: When should the field be loaded with a new value: = always R = only at report start P = at each new page 1-9 = after control break * = when the following expression is satisfied Enter load condition ( /R/P/n/*): Enter expression for field load: LOAD WHEN Output field to file? (Y/N)' When should the field be cleared: = always . = never P = at each new page 1-9 = after control break * = when the following expression is satisfied Enter field clear condition ( /./P/n/*): Enter expression for clearing the field: CLEAR IF This part of the program defines file usage. (^J = more help at any item) Enter the number of the next file to define or review:  This part of the program defines file usage. (^J = more help at any item) Enter the name of the associated definition file:  On which disk drive is the definition file located? (-/A/B...)?Access datafile in Sequence or as Reference file? (S/R)? Enter the condition(s) for record inclusion: INCLUDE IF Will the file include more than one volume? (Y/N)?How large should the disk buffer be??Will the datafile name(s) be entered at run time? (Y/N)? Enter the datafile name(s): Disk drive: (?/-/A/B...) File name: 2.9Change disks? (Y/N) Is the file going to be used for Input or Output? (I/O)?Should the file be read in index order? (Y/N)?Error if old version present or Add to it? (E/A)?Should an index file also be written?? < < F I L E D E S C R I P T I O N > > Access: If file exists: No. of buffers: Volume name: OPERATOR ENTERED, MULTI-VOLUMEVolume name:., CHANGE DISKSInclude if: Location: Line= Column= Length=Equivalent to: Control break level: Source:File="Field=Index=CALCULATED = Unless: Then: OPERATOR INPUTPrompt: RIGHT JUSTIFY Editing: EDIT MASKLoad if: Output: If: Clear if:  Enter the condition(s) under which this line should be printed: PRINT WHEN Print line  when Enter the condition(s) for a new page: PAGE WHEN Enter the condition(s) ending the report: END WHEN PAGE WHEN END WHEN < < D E F I N E C O N D I T I O N S > >You have entered the field definition phase by typing a ^R. The <2300> field definition phase is a questionaire which allows you to define how field information is to be derived and processed. In the questions that follow, the answers you give will apply to the current field only. To return to report layout definition, type ^C. This item allows you to specify the order in which fields will be processed during the report generation.This item is used to save time when entering field attributes. If <2330> another field is defined similarly, entering its field number here will cause its attributes to be used by this field also. CAUTION: If you answer Y here and you have already entered a definition for this field, it will be replaced by the new definition.Report field data may be read from a file, calculated from other <2340> fields in the report or entered by the operator. Decide how the data for this field is to be obtained and enter an F, C or I here.Files may be specified by name or number. In order to accept the <2341> entry, REDIT must recognize the name or number, i.e. there must be a file with that name or number in the list of defined files. Enter the name or number of a file that has already been defined or enter ^C^C^F to create a new file definition.Files may be specified by name or number. In order to accept the <2371> entry, REDIT must recognize the name or number, i.e. there must be a file with that name or number in the list of defined files. Enter the name or number of a file that has already been defined or enter ^C^C^F to create a new file definition.Fields may be specified only after the file has been specified. A <2342> field may be selected by number or name if it has been given a name (using FORMGEN) and the form definition file has been successfully read into memory; otherwise only the field number can be used.Fields may be specified only after the file has been specified. A <2372> field may be selected by number or name if it has been given a name (using FORMGEN) and the form definition file has been successfully read into memory; otherwise only the field number can be used.To retrieve data from a reference file, one field in the report must <2343> hold a key value of the file being searched. The report field which holds the key value is called the index field. Enter the name or number of the field in the report to use as an index to the file in selecting records.To update data from a reference file, one field in the report must <2373> hold a key value of the file being accessed. The report field which holds the key value is called the index field. Enter the name or number of the field in the report to use as an index to the file in selecting records for update.A numeric calculated field uses an algebraic expression to derive a <2344> value for the field. The algebraic expression consists of fields, functions and numeric constants combined using the operations: add(+), subtract(-), multiply(*), divide(/), exponentiation(^) A string expression consists of fields, sub-fields and string constants combined using the join(&) operation.A string expression may contain fields, subfields or constants. <2346> Fields are represented by field name or number preceded by "$": $7 Subfields are used to extract a portion of a field. The form is: $field (first character position, number of characters): $7(1,2) Constants are represented by characters enclosed in quotes("): "A01" The expression, $6(1,2) & $7(3,1), combines the first two characters of field 6 with the third character of field 7.An algebraic expression may contain fields, functions and constants <2345> combined with the arithmetic operations: add(+), subtract(-), multiply(*), divide(/) and exponentiation(^). Operations are performed from left to right with parentheses recognized. Fields are represented by name or by field number preceded by a # sign: #7 Constants may contain a decimal point and/or a leading minus: 1.23, -1.005 Recognized functions are: ABS, INT, MAX, MIN, REM, PAGE, FLDThe UNLESS expression provides the facility to omit the calculation <2348> in the line above it. If the UNLESS expression is true, the field value will be determined using the THEN expression (entered next). If the UNLESS expression is false or not entered, the field value will be determined using the expression in the line above it. If multiple UNLESS clauses are present, the field will be calculated using the expression immediately preceding the first missing or false UNLESS. The UNLESS expression must be a comparison of two values. The values compared may be fields, sub-fields, numeric constants, functions, character strings or arithmetic/string expressions. The following comparisons can be made: less than [<] less than or equal to [<=] equal to [=] not equal to [<>] greater than [>] greater than or equal [>=] Examples of comparisons are: $MONTH = "JANUARY" DAY = 1 Comparisons can be combined using the logical operators: .AND. and .OR.The input prompt is a message that will be displayed to the report <2347> program operator so that he/she knows what entry is required. Any message that will fit on a single line can be used. It will be displayed to the report program operator at the top of the screen. The cursor will blink back and forth between the message and the field to be entered.Right/left justification determines on which side of the field the <2351> data will be placed when it does not fill the field. A Y answer will align the field data with the right side of the field.Pad characters are used to fill the field when there aren't enough <2350> data characters to fill it. Any character can be used; the usual choice is the space character.An edit mask allows you to add fixed and floating characters to the <2352> data characters in the field and set a decimal alignment position. Fixed characters occupy fixed positions in the field; floating characters are characters whose position varies depending on how many data characters there are in the field. Decimal alignment is lining up data for output at the decimal point. You cannot put a non-integral calculated value into a field unless it has a decimal alignment position. A Y answer will allow you to enter an edit mask in two steps: positions/conditions and constants.The float codes are used to put character(s) in front of the data; <2353> the trail codes after the data. The codes for constants will insert characters at fixed positions into the data. Decimal alignment overrides right/left justification, putting data into the fields with decimal points aligned at that position. To use the float and trail codes, put one at every position in the field that the floating characters defined in the next mask may occupy. Some examples are: FFFFF, 11_.__NN, FFFF"FF_.__, ---"--_NCharacters that you want to float or trail must be put at the start <2354> or end of positions defined as floating/trailing in the first mask. Fixed characters and the decimal alignment character must be put at the constant and decimal alignment position. Some examples of mask combinations: FFFFF 11_.__NN FFFF"FF_.__ ---"--_N $____ $__.__CR $___,___.__ <__,___>The data generated for this field can be written to a file instead <2370> of or in addition to printing it. This feature can be used to make multiple reports, write audit trails, create data files for other programs, etc. If you choose to output this field, the next few questions will allow you to specify to which file and field the data should be written.Field names are optional. If a field name is entered here, then all <2300> references to this field will use the name as well as the number. A field name must start with a letter. The remaining characters may be letters, numbers, or spaces.Equivalent fields are used only in reports that read more than one <2310> record from a file as the report form is filled out. An example of this is telephone directories which list names and phone numbers in four columns. Assigning equivalence signals the report program that a new record must be read for each set of equivalent fields. To make this field equivalent to a field previously defined, enter the number of the field in the report that is appropriately defined. The field definition will be over for this field and any attributes previously assigned to this field will be lost.This field is a control break field. Control breaks are used to <2320> produce report summary lines and other special effects. This is done by specifying elsewhere in the report what should be done whenever the value of this (or any other control break) field changes. Notice that for this to actually produce summary lines, the input file(s) must be sorted in control break field order, so that when the value of a control break field changes, it is an appropriate time for a summary. Up to nine fields may be used for control breaks. These are given a number called the control break level, such that level 1 is most important and 9 is least important in the sort order. This allows nested summaries such as city (2) within state (1).The load condition specifies how often new values should be entered <2360> into the field. A load condition can be used when a field value is relatively constant or when the field is not on a report detail line (CTL character = space). Using the load condition can speed up report processing. In addition, using the "R" load condition enables the field to be used in an INCLUDE IF expression.The LOAD WHEN expression specifies the conditions under which this <2360> field should be loaded. The expression must be a comparison of two values. The values compared may be fields, sub-fields, numeric constants, functions, character strings or arithmetic expressions. The following comparisons can be made: less than [<] less than or equal to [<=] equal to [=] not equal to [<>] greater than [>] greater than or equal [>=] Examples of comparisons are: $MONTH = "JANUARY" DAY = 1 Comparisons can be combined using the logical operators: .AND. and .OR. An example of combining comparisons is: LOAD WHEN $MONTH="JANUARY" .AND. DAY=1 to load the field with a new value only on the first day of the year.Normally, fields are not cleared during processing. This is of no <2380> consequence since each pass will generate new field values. However, in order to produce counts and accumulated totals for summaries, you must clear the field at a new page or control break. Select one of the clear conditions if this field is a count or total field.The CLEAR IF expression specifies the conditions under which this <2380> field should be cleared. The expression must be a comparison of two values. The values compared may be fields, sub-fields, numeric constants, functions, character strings or arithmetic expressions. The following comparisons can be made: less than [<] less than or equal to [<=] equal to [=] not equal to [<>] greater than [>] greater than or equal [>=] Examples of comparisons are: $MONTH = "JANUARY" DAY = 1 Comparisons can be combined using the logical operators: .AND. and .OR. An example of combining comparisons is: CLEAR IF $MONTH="JANUARY" .AND. DAY=1 to clear the field on the first day of the year. Before a file can be used by ReportStar, you must describe how. <2100> These file usage descriptions are entered here, one per file. They are automatically numbered and saved. Enter the number of the next file description you would like to enter or review or press RETURN to accept the number given.The form definition file is read into memory and incorporated into <2110> the report specification at this step. If you change a definition (with the FORMGEN program), the new version should be put into the report specification. This is done by deleting and re-entering the disk drive. Enter the disk drive (A,B,...) where the data definition file is now located. A dash (-) may be used if it is on the logged drive.If your report uses only one file for input, access should usually <2130> be sequential. If it uses more than one file for input, as long as at least one of them is accessed sequentially, the remainder can be accessed either way. The considerations are: All sequential access files must be in the same order for merging to occur. Merging sequential files can be tricky if there are "missing" records in either file. Consult your reference manual if you are going to do this. For large files, reference file access is slower and requires more memory. Reference file access requires an index file.The report program can write files as it makes the report. These <2120> can be transaction summaries, audit trails, data for additional reports, etc.Sequential input files can be read in index file sequence as well <2135> as data file sequence if an index file is available. This saves a sorting step, but is usually slower and uses more memory. For large files, it is faster to sort them with SUPERSORT and read them in datafile sequence.If nothing is entered here, all records will be included. Otherwise, <2160> a LOGICAL EXPRESSION is used to select records for input or output. A logical expression specifies conditions under which a report process should occur. Each condition is expressed as a comparison of two values. An expression may compare the values of fields, sub-fields, numeric constants, functions, character strings or arithmetic expressions. The following comparisons can be made: less than [<] less than or equal to [<=] equal to [=] not equal to [<>] greater than [>] greater than or equal [>=] Examples of comparisons are: AGE > 30 $GENDER = "F" Comparisons can be combined using the logical operators: .AND. and .OR. An example of combining comparisons is INCLUDE IF AGE > 30 .AND. $GENDER = "F" to include only women over the age of 30 in your report or output file.An input file may be in several volumes. All volumes may be on one <2145> disk (each volume having a unique name) or on several disks (each volume having the same or different names). All volumes must use the same form definition file. The REPORT program inputs each volume one at a time, as it is needed. The report program can also create multi-volume output files. The usual reason for doing this is that the file is larger than the capacity of one disk.If the file is one that you want to re-create every time the report <2125> is run, enter E to report the presence of any old version. If you you want to add to the file whenever the report is run enter A.If the file will be accessed later by DATASTAR or used in REPORT <2133> as a reference file, an index file must also be created. If the file will always be read sequentially, the index is unnecessary. Writing an index along with the data is slower than writing just the data. For large files, it will save time to use SUPERSORT to write the index file.Datafile names can be specified now or entered later when the report <2150> is run. A Y answer here will be require that the datafile name be entered every time the report is run. An N answer permits you to enter the datafile name(s) here and have them built into the report specification. This means that the name(s) of the datafile(s) used must always be the same for this report.Specify the disk drive where this datafile will be found when the <2152> report is run. You may enter a question mark (?) to allow the disk drive to be entered at run time.A file name is 1-8 letters or numbers. <2153>A file type is 0-3 letters or numbers. <2154>A Y answer here will cause the report program to ask the operator <2155> to insert the correct diskette into the drive specified. For a single volume file, it is used to remind the operator which drive to use. For multi-volume files, it is the only way to continue the file on the same drive. To use the change diskette message, this must be the only file in use on this drive (including the error log, the message overlay and the print file).Every file description includes information about the structure and <2105> type of data in the file. This information is stored in the form definition file (.DEF) by the FORMGEN program. If there is no form definition file for this file, you must exit and use FORMGEN to create one; otherwise, you may enter its name here. Note that the data file(s) defined here may later be referred to by description number or form definition name. To remove a file description from the report specification, delete all the characters in the definition name.A disk buffer is an area in memory used to hold data while waiting <2140> for it to be used (in the case of input) or written (for output). The number you assign here determines how many 128 sectors of memory will be used for the buffer area. Always use at least 8, unless this does not leave enough memory to run the report. Only the following entries are acceptable: 1, 2, 4, 8, 16 or 32.The PRINT WHEN expression specifies the conditions under which this <2240> line should be printed. The expression must be a comparison of two values. The values compared may be fields, sub-fields, numeric constants, functions, character strings or arithmetic expressions. The following comparisons can be made: less than [<] less than or equal to [<=] equal to [=] not equal to [<>] greater than [>] greater than or equal [>=] Examples of comparisons are: $MONTH = "JANUARY" DAY = 1 Comparisons can be combined using the logical operators: .AND. and .OR. An example of combining comparisons is: PRINT WHEN $MONTH="JANUARY" .AND. DAY=1 to print the line only on the first day of the year.The PAGE WHEN expression specifies the conditions under which a new <2400> page should be started. The expression must be a comparison of two values. The values compared may be fields, sub-fields, numeric constants, functions, character strings or arithmetic expressions. The following comparisons can be made: less than [<] less than or equal to [<=] equal to [=] not equal to [<>] greater than [>] greater than or equal [>=] Examples of comparisons are: $MONTH = "JANUARY" DAY = 1 Comparisons can be combined using the logical operators: .AND. and .OR. An example of combining comparisons is: PAGE WHEN $MONTH="JANUARY" .AND. DAY=1 to start a new page on the first day of each year.The END WHEN expression specifies the conditions under which the <2400> report should be ended. The expression must be a comparison of two values. The values compared may be fields, sub-fields, numeric constants, functions, character strings or arithmetic expressions. The following comparisons can be made: less than [<] less than or equal to [<=] equal to [=] not equal to [<>] greater than [>] greater than or equal [>=] Examples of comparisons are: $MONTH = "JANUARY" DAY = 1 Comparisons can be combined using the logical operators: .AND. and .OR. An example of combining comparisons is: END WHEN $MONTH="JANUARY" .AND. DAY=1 to end the report on the first day of the year. REDIT Release 1.03 ID # 711303KP-00A Copyright (c) 1982, 1984, MicroPro International Corporation. All rights reserved. ay not be copied or distributed in any form or medium, disclosed to third parties, or used in any manner not provided for in aid License Agreement except with prior written authorization from MicroPro.** Error 01 ** .COM is not present on drive  Specify which drive (A-P) to try next:  ** Error 02 ** Cursor is not in a field,  ignored. Press ESC key:  ** Error 03 ** At line limit,  ignored. Press ESC key:  ** Error 04 ** Cannot delete last line. Press ESC key:  ** Error 05 ** At column limit,  ignored. Press ESC key:  ** Error 06 ** Not enough memory,  ignored. Press ESC key:  ** Error 07 ** Possible fatal program error. Please report occurrence,  ignored. Replace system disk, press RETURN:  ** Warning 08 ** Edit mask may need revision. Press ESC key:  ** Error 09 ** The maximum number of fields is 245,  ignored. Press ESC key:  ** Error 10 ** Can't read report specification file. Replace system disk, press RETURN:   < < < P R I N T C O N T R O L C H A R S > > > *Special Effects* | * Special Effects * | * Printing Changes * (begin and end) | (one time each) | ^A Alternate pitch ^B Bold ^D Double | | ^N Standard pitch ^S Underscore | ^H overprint character | ^C Printing pause ^X Strikeout | ^F Phantom space | ^Y Other ribbon color ^V Subscript | ^G Phantom rubout | * User Patches * ^T Superscript | | ^Q, ^W, ^E, ^R ** Error 11 ** Insufficient memory. Replace system disk, press RETURN:  ** Error 12 ** Directory on disk : full. Replace system disk, press RETURN:  ** Error 13 ** Disk : full. Replace system disk, press RETURN:  ** Error 14 ** Illegal string operand. Item must be: a field name starting with $ or field number in the range $001 to $, a sub-field: field name/number followed by "(number,number)", the function $FILE, or a literal enclosed in quotes. Press ESC key:  ** Error 15 ** Illegal string operand. There are no report fields, so item can only be: the function $FILE, or a literal enclosed in quotes. Press ESC key:  ** Error 16 ** Completion of the current command, ^B, will result in a field being split. Is this what you wanted to do? (Y/N)  YNY** Error 17 ** Completion of the current command, ^T, will remove a field byte. Is this what you wanted to do? (Y/N)  YNY** Error 18 ** Illegal operand. Item must be a field number in the range #001 to #, a numeric constant using only digits 0-9 and optional decimal point, one of the functions: ABS, INT, MAX, MIN, REM, PAGE, FLD, ERR, FERR, CB or a recognized field name. Press ESC key:  ** Error 19 ** Illegal operand. There are no report fields, so item must be: a numeric constant using only digits 0-9 and optional decimal point, one of the functions: ABS, INT, MAX, MIN, REM, PAGE, FLD, ERR, FERR, CB or a recognized file field name (INCLUDE IF only). Press ESC key:  ** Error 20 ** Illegal operator. Item must be one of the following:  Press ESC key:  ** Error 21 ** Unclosed left parenthesis. Press ESC key:  ** Error 22 **  - Illegal character. Press ESC key:  ** Error 23 ** The form definition file, , is not present on drive . Do you want to try Another disk drive or Change diskettes? (A/C)  AAC** Error 24 ** Field  already has this name. Press ESC key:  ** Error 25 ** Insert diskette containing  into drive  and press RETURN. ** Error 26 ** The form definition file, , is not present on drive . Press ESC key:  ** Error 27 ** Entry must be a number in the range 001 to . Press ESC key:  ** Error 28 ** The only entry allowed here is 001. Press ESC key:  ** Error 29 ** Can't recognize field name. Press ESC key:  ** Error 30 ** Intermediate fields cannot be used in ReportStar. Press ESC key:  ** Error 31 ** Can't read form definition file. Press ESC key:  ** Error 32 ** You must enter a file description before it can be used. Press ESC key followed by ^C^C^F:  ** Error 33 ** File  already has this name. Press ESC key:  ** Error 34 ** Expression too long. Press ESC key:  ** Error 35 ** Too many/missing function argument(s). Press ESC key:  This is a two-part program that is used to create a report specification file. The first part of this program consists of a series of questions about the data files used in the report. The answers to these questions will be stored in the report specification file, and used later when the report is produced. You may type ^J at any question for additional information about that item. The second part of this program defines the report format. The first column of each line specifies when and how often that line type will appear in the report; the remainder of the line is an image of what will actually be printed. Any line may contain heading and data descriptions and/or report data. Space for report data is called a field and is indicated by the underline character. An example format is shown below: R INVENTORY REPORT FOR THE WEEK OF ________ P Part Number Quantity Price/thousand Total Value _______ ______ ________ ___________ As you create the layout, you may move freely around the screen using the CURSOR commands that will be displayed at the top of the screen. Type ^J now to begin the first part of the program:Enter name of report specification file (or press RETURN): The report specification file is where the specifications for your report are stored. If you have not yet designed a report, choose a name for the report specification file and enter it here. A report specification name is eight (or less) letters and/or numbers, optionally preceded by a disk drive (letter A-P followed by colon). Press ESC to enter report name or ^C to exit: ** Error 36 ** ":" is not a legal disk drive. A report specification name is eight (or less) letters and/or numbers, optionally preceded by a disk drive (letter A-P followed by colon). Press ESC to enter report name or ^C to exit: ** Error 37 ** "" - illegal character. A report specification name is eight (or less) letters and/or numbers, optionally preceded by a disk drive (letter A-P followed by colon). Press ESC to enter report name or ^C to exit: A report specification name is eight (or less) letters and/or numbers, optionally preceded by a disk drive (letter A-P followed by colon). Press ESC to enter report name or ^C to exit: ERROR 01 No report fields have been specified. ERROR 02 No detail line type (" " or ":") is present. Field  ERROR 03 Input file not specified. Field  ERROR 04 Output file used for input. Field  ERROR 05 Input field not specified. Field  ERROR 06 Index field not specified. Field  ERROR 07 Output file not specified. Field  ERROR 08 Output field not specified. Field  ERROR 09 Equivalent field or its base cannot be a control break. Field   10  Field calculation error: Field   11  UNLESS/THEN error: Field  ERROR 12 Missing edit mask constant. Field  ERROR 13 Edit mask order is not float, data, trail. Field  ERROR 14 Equivalent field is base of an equivalent field. Field  ERROR 15 Number of equivalent fields not constant. Field  ERROR 16 Equivalent field is referenced. Field   17  LOAD IF error: Field   18  CLEAR IF error: File   19  INCLUDE IF error: Line   20  PRINT WHEN error: Ctlb  ERROR 21 Control break not specified. Field  ERROR 22 Illegal line type for equivalent field or its base. WARNING 23 End report condition has not been specified. Field  ERROR 24 Input file used for output. File  ERROR 25 Missing data file volume name. Line  ERROR 26 Dot command error. WARNING 27 Control column order not RP123... ...321RP. Field  ERROR 28 Missing edit mask float/trail constant. Field  ERROR 29 Missing edit mask decimal alignment constant. Field  ERROR 30 Multiple edit mask decimal alignment positions. Field  ERROR 31 Edit mask float/trail constants not packed. Field  ERROR 32 Multiple edit mask float/trial conditionals. File  ERROR 33 Missing sort order. Field  ERROR 34 Equivalent fields with different field lengths. Field  ERROR 35 Equivalent field base is forward referenced. Field  ERROR 36 Multiple outputs to the same field. WARNING 37 Possibly not enough memory to run REPORT program. Field  ERROR 38 Control break field is control break or page dependent.   39  PAGE WHEN error:   40  END WHEN error: Field  ERROR 41 Input field not present in file. Field  ERROR 42 Output field not present in file. Field  ERROR 43 File key different length than index field length. Field  ERROR 44 Load condition not permitted with sequential input. Field  ERROR 45 Base of equivalent field cannot be operator input. Line  ERROR 46 Non-equivalent field(s) on line. ERRORAmissing report field. ERRORBillegal sub-field. WARNINGCrestricted function. ERRORDillegal use if FERR. ERROREreport field reference not "R" LOADed. Enter exit command: A=Abandon form-> start over S=save form -> end edit C=save form -> Continue edit F=no save -> edit File definition X=no save -> edit conditions L=List errors on LST: device SPACE=no save -> Continue edit (A/S/C/F/X/L/SPACE): Enter exit command: A=Abandon form-> start over S=Save form -> end edit C=save form -> Continue edit F=no save -> edit File definition X=no save -> edit conditions R=save form -> Run the report SPACE=no save -> Continue edit (A/S/C/X/R/F/SPACE):   errors and incomplete fields: Item # Error # Error description  Abandon edit without saving form? (Y/N)   ABSINTMAXMINREMPAGEFLD$FILEERRFERRCB Please enter page width (in columns):  Which reports do you want? 1 = Field numbers and ctl chars 4 = Field definitions 2 = Edit masks 5 = Print line and other conditions 3 = File descriptions 6 = Cross reference N = none of the above A = All of the above Enter one or more of 1,2,3,4,5,6,N,A and/or RETURN: A 123456NA REPORT LISTING WITH FIELD AND FILE ATTRIBUTE DEFINITIONSFIELD NUMBERS CONTROL CHARACTERS FILE DEFINITIONS EDIT MASK CONDITIONS EDIT MASK CONSTANTS PRINT LINE AND OTHER CONDITIONS FIELD DEFINITIONS CROSS REFERENCE LISTINGREFERENCEOUTPUT, WRITE INDEX FILEOUTPUTINPUT (INDEX ORDER)INPUTADD TOERRORFIELD NOT PADDED PAD WITH   NEW PAGEREPORT START(ALWAYS)REPORT ENDCONTROL BREAK   +LINE  PRINT CONDITION +FILE INCLUDE CONDITION+INDEX FOR , FIELD +CALCULATION+OUTPUT IF CONDITION+CLEAR IF CONDITION+EQUIVALENT TO+FIELD LOAD CONDITION+NEW PAGE CONDITION+END REPORT CONDITIONN+OUTPUT IF CONDITION+CLEAR IF CONDITION+EQUIVALENT TO+FIELD LOAD CONDITION+NEW PAGE CONDITION+END REPORT CONCEOUTPUT, WRITE INDEX FILEOUTPUTINPUT (INDEX ORDER)INPUTADD TOERRORFIELD NOT PADDED PAD WITH   NEW PAGEREPORT START(ALWAYS)REPORT ENDCONTROL BREAK   +LINE  PRINT CONDITION +FILE INCLUDE CONDITION+INDEX FOR , FIELD +CAfbOfv Copyright (c) 1982, 1984, MicroPro International Corp.  REPORT Release 1.03 ID # 711303KP-001  KAYPRO Computer  Teletype-like printer  No communications protocol  CP/M List Output driver (LST:) "i~CklP= B0B1C0C1 *2!*2  CkoA   -__7777'i'ͷiiWx2z7W:G~~56   YZRCDTTVV2CCTTBT2STTTTTTTTTTCBTTTTVUUUVUUVVSSVUfVVTVVTUVVgVVUTVTVUTTTTTTSTTRRTRfTTTTSSSTTfTTTTVTVUB@ @.!ͤ2 ͤ_: W~K#<###,~6#^#VMͤ O O!Oڙʛ0ڙ ҙT])))_ͤڔʖ0ڔ u|7ͤÝx 7 7 77?.  ~# x 6#$%%$o>gDMxɅo|gg}o|g^#V#~#foGz7{x~/w:.,;?!\ d{:v|\<=G:Y7ʣ*L~7£p#~<"LxG:Yx*^!9"^x<ð*P#*!9"*WU {z!!TEz> W_ !z#>2{ ȯ2 x~ #7 !9"!mbbblͽ*LHSRUJvBPPLMTMBHMFMCWPCPOPACPPN%OPHEEFO?!>ͬẃ ny !7>û!ͬ Á ! !(!$!,>û!3ͬ!5ͬͬW > >2_; "  > !*HH*F>o w#ͤr eͤr rw#-_6> _څbË!͝y >xONOFObbͳ}_bbͤÿ  !Tv ͳ  >2!~6B  :U!6> :T! ͭ !@. *FG !=. !:. ** z.>2>*_:<=k c *8.:T*8 !(ͭ ڢ !:. ͬ !=. > ͳ 7*H#~+G :͒ :0 !5 * | } > ܳ / ͭ 20 " !- ij + < * " !& ~ ij # <   R> ͳ > ô #~+͒ :0 ~ͭ #~ \v #~ ç #† * / b § : b #~ ʒ ʒ +b ͳ b ! o:} >y ::0>!0w:~ > > o>y ^#~ͭ > *: |Q :.< : :N#)L  > ͳ > ; > ͳ +|#>a  !"u .gy |c ,-:R) }ڍ > G!~6!Tx!3^ ͭ x!GO! >  >~ >- !~<>  !"ÿ N Ϳ *&*"*.*| !"* #" 2 *>y *7>y ƒ :Sp *|:* < Z > *|; *   P ʧ !~ʦ 5!& G:#~^ @͒ !4 :S/!U!6> :7* *.̀)  ͧ! >2X + >̀ͧE :D7 !"V"XG!a ~x7Ɂ*!:*)*| !.ڧ "8!"?"A#"=~2:#^#V## 2@~2:+~2>##)";|"A";O:!<=  q#s#r#ww# w!0~#)#~:G:O:e<@rY:=V_x2:*w*w:g"ʀyHG*w:g":o&{2yʤ:y_!*:e< !5~<4!~5*:*! :y*@*! 2}~5*:dx d-> 4> d!f:{~N=<<*-b`<> ͅx_y2:¹!4!4x*§:"g"!4:w#4!4x:*"!Ͱx **"**g"!"""!~6y_!""g"!4@-!4!~:`5*":!2*"*|:*):G$%v͒==ixԒxԒy2>2× :=ʦ|g}o|*&**"æ":ZFZjQF" Z  Z" Q" *":Za*"*)*T]: 7:?*.*&p*pjj*p**|":w#~w+"P6#"L"J6#"N"F"H"&s#r"^zs#r#::@>2=/22>:o>:X>/2(>2Y>̀>2Wí *F w#6*Hw#62:2:7227*"`!" :82>2!; #:AOڇN +y=!V!\S;͔"`"\"Z "^>2EG:X/!W!Y*\p#"\x2E:W:X:E/!Z% x~^"Z+ *\*^+.^*`"Z;"\&>ɚ !)äñëûõ08@2 /::7>>x /{/:L2><2!w ;KB2eͩ*Ji6#"JͣKͰ      ʦʦ6#Ͷ Ͷ~<~Ͱû*:O ~<6#!9 BK!w;2/2e!2L! !"*J\\\\\\\\!\F6#+UͶ~6# Ox"!w;!"2:aFP;2`2aOͰ x !\~6:]2Yð>2e2:!e****.2fĺwþͶ 6 +~^>^>#*! L! *ʟF#+”Ͷ~ O#x{}> ""J{2!wþ:2!2L! **:_?G{H?G+y O?xF*2WG ,2DDLq>2yl~ll¤OF:e=̊<<=~ʟ>2>Ù´F:eÕ!wʗ#<ºxʄ!}ʚPY+ʚZ :eOé+H%:wx :A=*ͤ%Q:e@:x:B=@6zZz :y:Z:z:! *C#"C*&ä~ʗPY:͐*&:ʮ*"*"!*ë*"**|.":_*|*ͽÌO!:LO|.0!5yKGyOG#zx!:**w"!]**+.چ*"*)"*"{OzW{_!wO<`!!!~͗:~Û> >!*e-,ͣw!"C22+:2+1=:+;3V/og"{+"+"+":":2+2:.@>͹hBA¶Z:+ͤ11xbFd͍)#; ͎7cͥ%!"+͑#.'+:+*+,͑#*{+#"{+>2+.> 2+B$>2++ͧ#%r,͸%'> 2+͂(i5(d%!lb*ʘÌ>*B}BDM"+:6S*B^!T>=zz+6Ã!:"a>2+͡2ͺ20/:[9<2+>A"7RN#5# ´;/¤*`"9:+_͟TU0>EV#~?_#~?`i"3R>B>##K ] }2IR~+6#s#r>~<w͍Q:9R!+Qw+6_6#s#r*:R6>Eʋ#]T~?O# N#6#q#=v2+@ͿT*SR">R&qR&!0R~@wvTU0ͥ!kCgij+ C_!mC_:0RͿT*SR&>\0:0R'd.*>R!kQU0ʠʤ!kQ':+!k_!kͬ[####2+ͥ| :+˜ͬj%bkT&i͜_Á*>Rͥ>\0O:+_{=͗º*:::*:::<x}nT>͹h̀ͥͬ>\0AN!k3!)=G } o%͜_zg{w`>\0 ͜_@ͥ!k <͚ څ+#fo͗nT~A2m#m~ >.!m{G~ #=:BFd*`ѯ+~ !kf  !ki  !k3!k *jDM:@=A !kf ' =H <͹hmC_+~ wT .)_ < *`| > ͚ ̸ !k3| Cg!+Zh#@P*>7> 2+!j+6Q* >Q*6a! ͆D2~+2^92:2+2+*`"+*B#%!O! ? +6Ͳ!?!>~#^#F=2[9+p*B@>E+q͘!>V+^*g!s#r*`+~#s#r#~@wx2z+h&)#w#s#rŒ!*B#>="?Ÿ!>^#V=?>#fo#~##!+r+s!+ %y""!2y+<2z+:+""OPQ":+""MB>;'9":+""MT>'9"(">.͎'0"~ ͎'#:+/ ?":y͎'͎'> ͎'> ͎'2+n"_"+*BͿ"qy̨"y? ̚"ͱ"0&~"yM!+¥"#4:w+?2w+#~ ±"wñ"~.":"2+ "@yO ~!mi+ #"~wy O`:+::*` +͔:Wd2X#*B~oa)#*`"+#yx>??F#yPY"+*`"+"+"+"++p+p+p{#*+*+"+"+"+ͷ##p$$$!j+~w:y+2}+#~@w:y+ 2+#>QA(>2+:~+!w+~Rw*B~#>RA(!x+P~w!m+ P~w#a$:x+!j+~@!m+ ~@Aʐ$#|$!x+~@!j+~@w͡$#—$:y+O*+~# ^#V6 #=µ$:z+_Pê$:w+@%$%$5$&0&$~ ~ *+͸T*+*+͸T+C_*B2+*Bd%!w+ ( (> 2+R%:w+*B͔%r&&>%!w+~w:+͑#*+,͑#*B$T&͎%r&&m%!"+!~+6*+#"+~M~""LH<"*B~r&&¨%5%%%r&&&¾%~%O!j+ ~2+:+O*B#> &?%#c(!+4qi0&!l;&P*i~# 0&~͙,131Q"z*+͸TO&}͚%Q":+͚%$$ܨ&~ ʐ&&#("+:+<9"̻&#~͎'~ •&V":$%r,5%͎%&*+*+"+!~+4> ͎'&\"LH&PL&MT'MB/'PN'"+X'"+f'$%>2+2+}!+N'&'"+f'o&X'$%>2+2+}!+N'&'"+f'ɾS'~2+!:+=`'*+*+*+͸T"+*+ԸT>\0"+!:45º'!W45!X~6!l;&P*2`*a*:͈`LT ĪS?T:`>\04>02j+!m+ (#'+~ w>2+~(~w>4!k+~w#+(:x+ G(~[(_!j+~w:+ɯ:+Y(~ʀ(F#eCv(:H\0{=0/>2+Ğ(;/†(V/<)*1R>EFyD/#Fx<(2+~#N͐) °(> ) ?Tѯ:+*1R"k))> y=*7RN#)# (x?>#~F*͊)_!9\\*>Rͥ\02+.͊):+g)+=O$(y;*>-*1R*3R r)+w xz)"+:+2+ʥ)ͫ))>,ͱ)ß)ͱ)͊)*+~ ),#¹)"+:+;*~,*x2k"k:+)* *):+ )* '*,* *x~#*>F))+w>2+*+=+ G>Cc( lY* l*B!T2j*+}0/Ŀ**:mͯ**:mͯ**:*:mͯ*#Fd::022:+2 |TP!mC_.|*:0R~X;/¿**B*0&*:g+w#*>G#^#V#~@#:}+_^#V:[9^#*+<='+~*+=+ _O*+ N#F#~[~#_+T+ ,ȷ@2+j$>2:*+,>29*+*+`,"9*+"+`,*B#>2+2Y9ͽ,!Y94, -*9,*d9?0,!:6!96*+"+V/*+DM~# xg,*+*+`,>ͅ,V/29*BN l3yŒ,29:+:9ͅ,c:Y9?ͽ,29"d9>h9C_y*d9>"9!9C_ y,:k9@*d9*"i9*v9~A(6K0͔-ʍ1:k9ʑ/ҕ6:n9=2[9*B@"f9:p9-:+—1+ʍ1.:o9=["k:h9OGͼ[ͱ-x2k>Œ-T]A{- {-45‚-w o->\0~w:Y9>=.O2+C>--I-))I029x2kl3*i9"k.:Y9?ͽ,*:R/0.H~w# .:9C_*1R6 X>G".?T.YV.F*C.͖[?Td.C.*:R6?T>K ~X͑. ͜.Fd*>R͙͆,i+4+N#~#foʱ.y =©.<:@͹h!k| +^#VLT0/+w>.;/.0/*96f/C_;/.0/f/>/~</>+w;//*9~Q$ɯ2[9*B~#![94?o&mTP!m>*w#w#w#6>.:9RG*:R*9~7/#‚/*~9*|9N#y/F#:k9/eCE00G/Œ-~c(N# ]TN# /@!9"k>2HG}2k>EE0:h9OvEʌ-F0:h92HG:l9O*9*9H:m#50 )0y=45#90 90\06:h9G*>\0>ͷO:Y9*+>*:9怇څ0::G͓0ͻ0V1̈́1V*:`'!:ͭ0y?P1ͭ0y!:P1^#Vz·0r+sx ?*:*{+kTP!:ͭ0*:͈`:`A2m!mlL1͙,::11Cg*jiͣd>ùhů2`?T*:LTS̓g!I1̓g?TLT y?_̈́1`1x!j~6!ml4ghP*m112jx0د*h9&*+:Y9>*C_L21!Il 2O!Ql2O!Yl2AO!alx2!3P1^#V":y2:2::3!з2:B!=l Q;3>=] }2:Q;<2:B3;2̓g~2E33####CgɷT22B:Be2!B"9~/:4O<:5:B!Al 2>*9͕27“2͕2ܝ2"9~#/7ȷ+> ::>ek2":::2:!]rkC_::qk2":!#"3R2IRx͍::*:LT~X::*:|LT~X!:4* dCgN*j 9f"jh O9fyE33N*3Ͷ34:l93353 4:m9 AO3#3O3q~=#3igO+ 3!!>4xO3#4>*3:9x2k"k:Z9E\0ͪ4ͷ44Z4'55 õ5GyH Os4.s4 c4xOxڨ4ĵ5ڨ4#}Oʎ4 |G5*5:k97*9C_A->4 2:2:/2:2:ɯ2:2:*9>54#4H*9:m 5#4:l9y745G}6x6#5:m9w4  N5,5x7~F5w#,5w#65xH*9:h9O >2:i6# h5T]~ʎ55Ž5wy55+5#  65x7~6w+5w+5xH*9 >2:i6+ 6T]~B6Q6B6wy_2m9͞7 6̀bl7a8hO!8Һ67%9ں6a.7i2jy 7!Y9~75~̓3͔-7"77:k9ʕ6*9͚16:+*z9~> 29͡c*i9d7P7a =7=7^7d7U7P7":+~ *~9FX"j#9x2jC_> H͌a!kZb.7ͦ8;8N7q7Gʚ7*i93~#7´7+y7qz2^9y7*\9*i9:h9GOͶ3:l97*\9~-:_9<:mG*\9~ 8#8+p!`9:^9way2a9H8 U8;8~2b9qͦ8*\9*_9&:_9͸88!f8y_^#Vѷ888P*8888888888888888888888888888;8~!_94:h9= !_9~5 8~qO#82c9:h9!_9_;88+~qO82c9 7y 9!ilCg`1͡ca!k!9 96^#@w#6:a9O8:c9O79788R9!_95;8:b9w8ͦ89!:^#V#N#F#{iCg:S    *;!;:-l1l!#|-;!m4g6;4gCk:@ùh::@k; l~# xn;A!lͫ;>!Uk=>!kͫ;>!5lͫ;>!Ek=>\ͥ2 3=k͈`;l͈`;^#Vz;#;<*kcx<w#Ö<l ʹ< ¦<<<د  RSMSGS OVR!mX;"B͜_2B@! "j~=<>+==hOҌ>2<9f <̕= =Ck*kDM=*kDM*k*B͉B="B:k!k}=#:k^#V{ʊ= r+s=}=*B*|¥=}Ny jf#¨=@Ojf:jf!<~ĵ=#ͨ=.jfͨ=!=4g ??? c< x=A\ C_H>ceqi_!:BO!~k C_!>lC_!*Ì:2W>r_`>:B<@2m!kͿ;~# n>Fd!9l g?>R>ce@ \!ʌ\ ~#>*B>> ~O@?_WV??z>!0?O ~#>~#n*> ng}?}%œ?>?==??î?> ×? ~>>>>ɁO? ~#+N#F+*BZ0#?=@:B_͜__yw gʌ>@!B6!~Ċ@2BS@!l Q;Cg!}kZh>͹h!~k\> @!lo@@ʌ>!)l 9y!!l !%lNGw# w~# ʓ@+:}kOk͸@x2~kBC_~/# ʸ@ ø@O~@~ط7##~+:>@&AA<## ~7 A~ A.#&AA  A > ~#~02B!9")R2H2HͤC͸CͿD%EͫDʛCDyܟC{CxG*+R62.RJ>2-R!9"+R͟D6DDxC+DCKDVD͟DDͦDC͟D xCC"Dx2DDI IIMIRIIIIIII*D:DG_^#V͟DN+;D2+DM͞FlDKͭExGͦD=gD͟DYD;D*`~ʀDJ pD4#DM*`*`6 6 ÍDͦD#x~x~7ʹD~͟DyD͟D!D#N#^#V#DJJJ%L LMMNIHHHHHIHHy2/RxKE_:/RDEKG~C$%oE:/R*+R~dE2R  L+6#æK!9")R>2.R"+Ry2-RͪE:-RO*+R͟DE £E͟D͟DFECE2+{FGFͦDE͟D͟DW͟D_E"F͟DEN+E*FJ  Fɻ{~͡G"kx2k*+R:-RO@F"+Ry2-R>:.RcF~# HF 7 HF :R”F~# cF 72R<2R~#ÔFcG%RͩG ʥF+ʼF-¿F>2RͩG0ʼFFͩG!mFEGeG͘J:GGG:GJF:G:G/2GFͩG GG-_GxGͩG͘J:GGͩG͘J3GOxG{:GG!%R~MG+ ?G2R!RxwJOKR}KÍK ͡G{2G2Hů2G!Rw# xG"H#ƒGʛG>@2R>2G>2(R>J:G=2G~#کG0:2Hɯ :G2GGxJ"H`i"H2HoEgHH!H:HO:RWH:R H@eHH/<$H45$H4.̪HwHͪH1H:HfHͪHHH*H:H~J>-ĪH5!%R"H>2H2H:RʈH!H~ʌH5>0!H~ʈH5*H~ҡH+"HԼJ0!H455*Hw#"Hyy:R>H/H/:R:R>/:R:R>/H/ Jɯ2LI BI8IͦK L:R!LI8I IGI<>I J _~woE }I2RKѯɻ L:RI%L =}I!w+~w*+DMCPlDvI*B~J=6D*B~J=͟F>7J):N#FäI*B~J=+I> J};(I>OäIoEKJJ>HJJ7,-$%}`i~A-J6G>MwgH!:RA<2J)T])wH_:J=2J]J:R}/o|/g#~#ÆJq#ÑJ0 *H"k:H2k>2HͩGØJɇ:R=2R:R<2R>J>DJ>J>͆D*)R7>E7ɯ2R2R K +T]~J 'KG+~ͼJKͼJ+T]ͼJ GHK#~J3KJ!%R~!RKJOK! %R + lK 'ÃK P'> 'ÃK!&R~ȯw+6>+6=šKJ`i2(R~2RʴK2RR#„J~„J2(RÈJ:RWK:R!R:(R<„JK' #K7>'w #K7>'w #L>&L2L2R:RWALͤK!R:Lw [LLKͤK!RgLL̈́J!L:Lw:LG2LxW!RLҤKrʝL!R-K=ŠLR}K:LG:RLR!LK!R>-KJR}KLcKJR!LLKOK:L2R LOK"MM!R̈́JM!M̈́J!M K2M!R͏J!R"M>2M*M~#"MsMYMM*MKTM4=AMͼJsMM*MK=aM!M5*M#"M/M:R JW!Rw#zW@Mw`i#LOKR}KÍKz@JJ WJ_!R~2Nȓ_AwM{JJz+w>2N`i{N̈́J2N2R?GR!{N%NKNK!N~w:N=2NZN K:%RPN!R KN!|N-KN+ [N2NR!N̈́JOKR}KÍK WPlD KN ċOO&OP͂MKPK!PP̈́J O||g}oNPͤKONPͤKP͂MKͤKKJEP L2RK 2PgD O|O}2PP!P̈́J>zQQP!PyOlO͂MXO#\O:PP:PJJ 2Q>AQͤK͂MPKP%LPKͤKP LPMPK2PP!Q̈́J͂MQ>QPK RͤKP!Q̈́JQ>QPMP͂MPK:QA P/533333>=ii<0$;9"sU':9"sU'9BT8!%8hxVg 7"hC60wYEG417Gv@`v'b1A@PX#C`QI"U&Àe(HBCTbDvRWaGv"C%T$a'ÙH%Csrb"(HdA1A RKQ%L R͂M! DM=QP ĂMP%L9!"hR"GR"]R#"_R"`R"LR"MR9"`*7RV##–R29R*`_":R͑T*3R#"1R6 ͑T"ER:0RS͑T"@R%U*bR"OR*dR"QRV*`"[R͑T"UR*SR*UFV:`>2hR2a"``i"`SR5S:0RS%UHSScSHS!:IR=;S"JR͑T*>R!~]S=O:IR=/! w~ʊS# cS͝SxSZ ʱS͊S# x:0RS:IRG!`"`*>R*ER"`;WT ST6*JR"LRDM"GR:0R4T͝S6# y!T:IRS*>R`_*a!0RUT"a0R`TGC_~ >A>>^#V*`:0RaT_͟TBT͟T'`*`R*`"`"`*`͸T"`>}o|g20R*`"SR!͟T C_:0R20Rr_T:0R>w_ U:0R@>:0R/Q`k`4`r_w_̜_`_*>R"`_!"dR+"`#"bRbU:0RrUͶU=UU:0R UPY!~mU态O̓U*`C_! ʟU*` ͬU͑T!eR4#¬U!` C_6͜_U!` C_*`nU2dR!:a=U͑T!eR:a=w|V"CR2BR+V•T*ER #0V+7:VV>ʕTy   "5R"WR"YR|+"XRZW•TͺVDM_pV:9R_2WR>T*[R~iV`i"5Rgo2ZR͐Z*[R~2ZRͥV^#V"5R#:9R###)³VOͳV :9ROX_< V=VX_ GR;^V>"GR>WBR;^"GR*ER6>*GR*ER"`*@R"`*>R!OR͖WO;W̃W! JX͜_kXĊ_F]R;^>"]R>gW>*]R*[R"`*UR"`*SR!bR*Wx4~#W4#>WͷWW~WyWyN#>$`Wy! w`i)LGyq#Wxp#ɷGyOW*`=W"`?XC_y/w6?X5X'X!F~w`_pͬUC_7! *`y~?XhXC_!6~?XC_5>*>R)`:0RT*>R`_*SR)``_"`*`!`4X!`6!9"`X$`"7*`!`6X:`X!`5:hRͤXXX*Y53Y4 ZzYY,ZY`i"iR*oR"IR*mR"JR:9Ro&+!"_R"LR+"`"oR*5R"`dY`Y͜YzYFY"`IY"iR*`*`##L_+͈`ͰZ7[ژY͔Z2_R"`R:hR:9RDMͶYG}l`)ȷ#!)Y »YͤXYX:0RnSUZY*`R:_RY Z2_R"`RY,ZY͐Z>2hR7*iRDM:pR*kR`i#5R;^Z"iR͜Y*:R~<YOZ`Z7>OZ*1R~==2hR:hR ~:0RS# *GR#VX*ER*:R͟[*7RN#~#F#[> ͼ[ §[2[~,[ [> +#¿[*1R~ [#,[=[*:R:9RG~=\ \>\#[2hR*1R:\6\~ ,\# \2hRO\GO\:\:\~,~ ~#ͤXn\XͤX͜\X:0R“S͟[:ZRˆ\[Ҫ\3Y ZzYҋ\`i"iRY:ZR\:hR<¶\*5R#"5R>\2ZR*`|\\]#|\"iR]:_R*`R͐Z`:pR*kR*XR"kR:WR2pR[]"kR2pR͖[*CR"mR:BR2oRͥ]]ɯgo͐ZX:WR*XRͥ]"kR2pR*5R*mR*:R6:9RS]#s#rgoa]"mR+"mRH]*`R:_ROW$`s]bW$`*:R*[RO :9RGB^*mR#"mR*oR$,"oRkRB^͟Zy*XR:WROW`"]R:WRs]2WR6bW$`"XR*SRX$`*JRV$`:IR+^ W$`*CR:BRV`"GR:BR+^2BR6 W$`"CR*>RX$`*1RO*ER d^yw# _^bW$`*]R#OW`*[RB^ͭ^|^^,d^ ʡ^j^^ͧ^ʔ^"^^^^^ d^> ^, <ͧ^^^"±^>"w^:0RS#  W$`*GR#V`*ER:hRͤX*JR"`:IR2`wZX~2`6 W$`X:hRͤX*fR*1R~# *_z]͜\^YX~#C_|g}oL_y/Ox/G͜_p_>ɯy_͜_X! wʔ_X$`)`y _!_ `G_pɷ! ~*`C_K`2`_!"` `*`͈`"`X2`:0Rk`5Q``E`͜_=:B`~k`~d`~A~K`!`o$!`#`z{AA $$$IagWao͠f.::g*lcIaO͔a: A:c=*c&  O͌a::*c*c::*cda_*i9:^9sa{W~ ͑c_#=uaua+͔a:@=za.Efa ʽa aaëaXfaa!a#a#a~_**h+"a*a~#"a O b::y@^ bO:je# g&bcy*j|,-2b<Ĺh!c~/wNb̀bc:c!c<2cN#"c!c~qʤcNb̀bcɯ2c2c͔bbGc:j_::daW!c>ҫbbG~ʹbb~~b{_zbbxNw:@*c_::W!c:Bͦb~# b͔bc*BTc:cOXc c:jGa͡c:cOPccTcJclc͔a x4cxAĹhcc~# XcTc::~.*h+|yc~#W:c_~ #͑c/<_Áca >::>*c*9:cG͌a^#V#J; ±c,aͬe2j:2j:@2jG*"j"j͹e!d"jͽj"jͷj"j:@_:M!V![2j*"i"i"iͧ!-feFd>2j*@:jgc%.ͣdB*j"j͚d͹e‚d͚d*j+r ͤf ͤfdd:je!ͣd"jP6 #›d:jGe\U:g e*j{dzeG:jd*j2fe!M-f*aMT:`dLU"e!V-fJ"e![-f:eWe!CjZQDMgd*c-fy&De / 2eGͤf~+=x0e deWe~2jwe"jDMͽj"j*j:@=gͣde;eOey:j<ʘe*j͈`˜eyw͹eʪe:ªeywq:!:A=:ͪ!-f:<=\ie2j:je:e:je*j~w:jf2j!~f!$f!$f>2j-feF#Nͤf/f?f*jjf͹eafͣdͤf!j4*jq#"j*jͣdpfy ʗf :j=!jfe!j4:j̚f͸f*j$o"jeyOi͙i*jfT]ff"j:jG {e#f*j|fDMͷjO͹eg*j 6*j̈́i%gh/ggO"jCg ȹ*jDMCgͿ;!"j`i"j͑gf͛g*j"j*j|{g*j"j͑g̸fDM"j"gCg>2g*g$~~#ggg"h6h@h Ph g ڛggxʛg›gɷ^#V#J;͛gF#͑g˜g hue!j4:jhw#4~f> gh:jh>=g)hh:j3h#*j"jh3h:j3h#F##hoh> څhO9fq#chs–hwh#6h 6hͣhch{!j5 9f5+`.f$=»h͇iiqiaf:jhhiqi'ihqi=ih::jO*j F͹ei:jG:jxi#+ #i+*ieSi;i0i>Si*jLi*jͣd-i\i=SiO=_ḯiy#45!k̈́i*j6ii"j͙i*j~͇iâiͷiʳiiʳi*kwii"k:0i:0i͹ii>i2j͹e‡i*j~jj6#:@iͷjͽj;j2j`j8j# :j=$j:p=:jo&+~ VjJjz]j{`iͣd:j ڏjOOf͇iĊj#:jgj:joO`ͣdͽj6 # :j˜j!p-fë́iĊj*jj*j:jjogWYxj)jkkRGEN COMREDIT COMREPORT LOG PRN [mlm[mmBmnonnooBoBommnnQnQnnnmmCURSOR: CR=next item ^S=left char ^D=right char ^A=prev entry OTHER: ^G=delete char ^V=insert hole ^C=abort report ^R=restart ---------------------------------------------------------------------------- FT1C-N+P'".: No *.123456789FPRNDX NÄÃ:6:Lʔ><2!w ;!2e*J"6#"J!      6# ~<~Ͱ=&*:O ~<6#0!9 BK!w;2/2e!2ͪ!i!"*Jrʺʺʺʺʺʺʺʺ!ҺF6#͉³~6# Oxbq"!w;!"2:a̡#P;2`2aBͰ x!\~6:]2Yð>2e2:!e\****.\2wþ Ô +~<¨*N++~|>ͼ>ͼ>b#*! ͪ!i*rF#͉O#xb{> b""J{2!wþ:2!2ͪ!i**:_͝G{\H͝G͉yUV O͝xFb8*2WG ***2ʟʟ§q>2y~B͡ö͡:e$!wʝ#<xʊ!}ʠPY+ʠʅ 8:eB+HP:wx :A=*P?Q:ek:x:B=kazͅz :y:ą:z:! :e>!:6=Gͽ!"C:ý:==:Ox   :==*C#ͷ:6=;0!)606:^!4:7=>2^~M5>ë!~4:6=:?҄!7H*&~ʝPY:͖*&!~͖o<=͒û:*"*"!**":_ͽ>22öBöBʪ ʒ>> 82!:͒!~6g*E*"!yw>:Ce!jxg*O*"!~ڲ²NͶ!!~6!x[!`ö!xpxQ!VosÒͶG!yw:MOͶyÒ:LO|./!4yKFyOF#zxɛ ?~:6!w.!2e*JͿ/6#"J!!b455ð     6#!  # ~ɯ!b4!~<~Ͱ&!b~~62c̀2*_#!44~H"J*:q:O ~<6#s!9 BK!w;!.*J"͏;Q22.~5Fõͽ.Ͱ x!\~6:].2Yð2e:G:W*b:Q'!}̀xD!cy?!bz2d͕}̉̀|yxDyyDz!b5yzDXõ|xOzO>2d2eͷ:ͫ<2h:g:h!v!ḯ:!e! w. þ! V |>|>|>|~>{>#:ı2! \!#*4ʿF#K´O#x{ڠ"{2!w.WG ґʑʑqy.~...%ͯ!w#<+xʵePjWx2.!~ to!|&PY!}& Šͯ:<:t!hʧ :|O:}ʻ½>!d H:e::wx :A=ͩ :e=Q:f)::x:B=ͩ)$ :f=:gzm:O:yL:O:zLɷVz X :`i:gͤy! ʋґ ʐʐ!4x!4:e>!:6=*G!"C::==:Ox    :==*C#ͽ:=2> ͡:6=UJ!C6J6:*x!4:7=>2x~g5>ñ!~4:6=:?Ҟ!7b:_.:ʩ!s~5N*t!i+#{ 2ty!v{w:h!5*t!i:s+#<2sw"t~PY:J 6.:=͉<=͕3>û!3?XC_ͬU͑T!eR4#¬U!` C_6͜_U!` C_*`nU2dR!:a=U͑T!eR:a=w|V"CR2BR+V•T*ER #0V+7:VV>ʕTy   "5R"WR"YR|+"XRZW•TͺVDM_pV:9R_2WR>T*[R~iV`i"5Rgo2ZR͐Z*[R~2ZRͥV^#V"5R#:9R###)³VOͳV :9ROX_< V=VX_ GR;^V>"GR>WBR;^"GR*ER6>*GR*ENJ&@ Copyright (c) 1982, 1984, MicroPro International Corp.  RGEN Release 1.03 ID # 711303KP-00A  KAYPRO Computer    "A+P= B0B1C0C1 *2!*2  CkoA2 y R22 `$"$`!= Sy*: }`!= Sy*D}ͻW l * ʹ2y ʊ qͲچ̈́: w * * ͵͞ʰay†!,ͦí!,Hʆí * yʭ: ! -H!ÂN&>1-!+63>!+QxQ$`2}2!-Hq222 *$"$"{ yu"} u" uo" " :@=2 2 2 2 2 :t+=2 2 2 2 2 2 * "$! 6+ <=_!~#~wPz!,a8o ' !@$>R " >2 * ~<~w-{z/<O!gP Eu! 4͓û!z *$CA͇"$!,͓Æͪy .A lÓ* "$!k : *{ ~!,* ~io" " o2 2 2 !,ͦ7o" !,Q60#60#61" * Ny2 2 #qGQF#͇cZ )o~R!,! 5!,~#?_* 4~:60+f*$!# uɯ2 2 2 2 #* " * ~ͮ" !," !Y," !," !l," ~( X*$+"$ uͷ o! 4~: 2 * 2 &=$|: 2 2 o: 2 >@2 2 ![ P!] " " * ~_ [a .o" *{ ~<<2 O. €" : 2 O: G2 >_B œ"$!f Bo" " W " *{ F#~*  <WA +~  #> Byw##! -! -6#"$Q> <~#> BN!?,͇ =<Nw#w#w#w#WC~*  Xf2 ! * : 2 G~6_‡6* " " " 2 _͐y  1 2 " ͝ ~w#* ~ȷ! " : &*  7 ͝C ! ~# "$! 57 õ ~w#9 ! DM* > ̓ * <T] ~l #` >_ n G>ͪ G͖ ~* " ~ > ՐOxy6_# · * > ̓ ~ ͷ *+:@O: G:  *+y=2 _W   J yx G,͇x!,f -F !,a -" " `i"O ͓2 2 x " *+$$$" G* * _à 2 !u ͦ  Ҭ :+wyª P~2 2   ! wɷy  G p" =# : $2 _ x Sx x x x  x , ,,l  ; ,    C ,  ,      # K -W - ,     , ,,l ,u ,,,,,,,,,,,,,,,,,,,,,, S F,  [ 72* : ~*& >  :G~#O~G: #) x2Nwy#D 7*G:o&L! y ~e *G_ .O!l @! "*:G*ͅ ҩ "x2*> 7~(* ::+~ ~Ɏ$+24DFHJLx_^#Vy(7 *45#>4157x*Fq*:2W)͉ ҽ2""`i"ɯ2+**:ɯ2W).O)2l!#Û *6_*6_Ɏ$+vDFLxWWWWOO\:_*q:Gq͓*:G͉!,ڣ!,>G)!+~6͗'wy7x2͇!:G͇~:#*:_Đ:_"2+*"=*S*"+*:w*:w*~26*"~26*[>2^#V#oa˜{^#V#!͂ )06~P1;M: 2+"+:"::G)! ,?$V>G)F6#~ ʶx ҇ ,͇Ý~7ȯ##~+:> ##~7 ~>7> ~#~O0.w[?:~ط`_: $2 $_ 2 ͎ͬgͻ!,H$!+x͘$$$v~R" !"$ +-%?$͘RPT ͇ !"$!6\ 2 \ ͇ͬ!9"$*} "$* "$*$ /L"$ͻ\͘DEF*{ O*{ ~ -6 ##F#N=+k͒Ѷw?G͇S͇x Ny G#N~ ҙ# ^+V+~+~ ¯~+++N*$q#"$*$s#"$@>>>@ N# !"ɢ C*$|=  x~#"$\ !*$!%-7: A29, ͗''--)-- ͝"*%=f́ͲC1"*$*͐" $* ~w#v͗"7$~2($#q# =Í*$*{ ~!!k > !>!͗>!!k > !!+>!*} * ~G!#~#O!y?!!>ͧ!*9$#*$͐s#r>ͧ!>!! ,$~#<> +3*$"=$[wed>ͧ!2"2"2 #!">!>2U#*{ ~GTy<2_#=#F#N͵2T#y!#TT …2_#* _~x=K:,B_yO4)y: O: G<2$ :$?ɷOxByy B| B_B:$<2$O! * : Gy*=$~2$:,2T#* T͌ ~zͣ*} NGͰ?y* > ̓ _! z* : W~_>####>_: * G:,O͌   OyWx<2Z#y2S#!T#~w?2f#G!V#͓!T#zw +~ PE{!U#4* ~*{ ~GOxęnAęĉ͙TTTTTTx=:U#2$!%x=K"$P:$2U#TT~__#T~_#T~_#T~_*$T>2T#>2S#xuG2y#!g#͓>2T>2T#>2S#*=$~2#2#X2#xuG2#!|#͓#~+_*=$~2#X2#d2#͕2#y2#!#͘{* ͣ* ~ʬ2$:$O ##~2S##~2T####~w~#G+~_:U#==2U#*=$~2#e2U#d2#͓2#!#͘!,>!,>2##͇*=$~2#X2#d2#͓2#y2#!#͘x=a x=r:,:,1G* * ʐ_>2$#~w:$<ʭ~w:S#_x!R#6Ҽ44+w>!> !{y !x!*=$4:C,:D,G:$Oħ!!{=ħ! =*=$7#!=, ~#+N#F+!"$*$";$]ͭ, f ͉ >!>ͧ!:$2'$!-͕!! ,:,G~#k͢!!! ,͕!!-͕!!!:"=͢!> !"!!!:,2$*{ ~G> ! »y.y1G2$ !> !!y:!!!".!!-:$O!## !!F! y!͕!###:$O~Ģ!+~ͧ!!!N!#!!*$*=$#####~^!+~g!!N!7F!###s!-͕!i!>ͧ!!-͕!> !i!>ͧ!Q~!#Ø!ͱ! ͱ!ͱ!GN#y!¶!!G~!#!>!> !:,!:$!>!x*$w#"$!$4 "6#4* $+" $|=4͎~!$q"*7$~2x+*@:t+gc%.1%B*+"v+(%G&%(%*++r 2' 2'$:s+|&!1%"+P6 #)%:s+%\U:g™%*}+{c%zʑ%G:u+c%*v+&Ñ%!Mͻ&*aMT:`x%LUͰ%!Vͻ&JͰ%![ͻ&:X&%!CN+ZQDMgË%*c-2'y&% / %G2'~+=x¾% de&%~2x+wÕ%"}+DMK+"v+*t+:@=g1%a&L&O &y:x+<&&*v+́&&ywG&8&:8&ywq:!:A=:ͪ!ͻ&:<=)Y&2s+:x+|&:|&:r+Ì&*v+~w:r+ʤ&2r+!~Ÿ&!Ͳ&!Ͳ&>2r+ͻ&U&F#N2'ý&&*+&G&&1%2'!}+4*v+q#"v+*+1%&y %' :t+=!+r' &!+4:t+('F'*+$o"+͆&yO_*'**+O'T]u'`'"+:t+G { &#f'*+|̓'DME+OG&”'*+ 6*+*̳'W)ͽ''O"+' ȹ*+DM'Q!"{+`i"y+(u')(*y+"+*{+| (*y+"+(F'DM"+"'('>2((*'($~~#m(n(~(̰((( ( _( )(͂(x)()(ɷ^#V#p)(F#(&( ʧ(&!y+4:t+¥(w#4~̓'> ͍(§(:y+ħ(>=͍(·(ͧ(:z+(#*y+"{+͐((:z+(#F##W)(> )O&q#(s$)w )#6 ) 6 )1)({!+5 &5+`.O'$=I)*t*)&:+z)͆)*)͵)p)))z)::}+O*v+ FG&ʠ):x+G:t+xʫ)#+ ʱ)+͸)n&))¾)>)*+)*+1%ͻ))=)O=)*y#45!+**+6)"+'**+~*0*E*A*Q*A**+w)"+:0c*:0l*͹e*[*>z*2C+G&**+~*Ÿ*6#:@Œ*E+K+*2D+**# :t+=Ҳ*:p=:t+o&+~ **z*{`i1%:D+ +O&*+#:t+*:C+oO`1%K+6 # :t+&+!pͻ&U&*+*+N+*+:t+^+ogWYxk+)d+++REDIT COMREPORT COMDTA????????DEF :N ..-    YN TALSPRMAXMIN d,IcE$   & ) 3 N d J 4 Kr Q[cguj4`** Error 07 ** G.COM is not present on drive h Specify which drive (A-P) to try next:  Please enter your report name here (or press RETURN): Enter 1-8 letters and/or numbers. If you don't want the report stored on the logged drive, enter the new disk drive (A:-P:) before the report name. Press ESC key to re-enter the report name or ^C to exit.  ** Error 08 ** The report, ;, already exists. You may: E = Edit/examine it, or G = Generate a new report (with a different name). Press E or G:  GGE** Error 09 ** "k" is not allowed in a report name. ** Error 10 ** "k:" is not a legal disk drive. Report name: File name: Number of columns used: ______________________________________________________________________________ CURSOR: ^A=left item ^S=left char ^D=right char ^F=right item ^E=up line ^X=down line SCREEN: ^P=previous screen ^C=exit ^W=scroll down ^Z=scroll up SCREEN: ^P=previous screen ^N=next screen ^W=scroll down ^Z=scroll up HELP: ^J=remove/restore this menu ^K=remove/restore message below OTHER: RETURN=enter selection ^L=change logged disk OTHER: RETURN=enter selection ^L=toggle 2 <-> 4 column display OTHER: RETURN=enter selection ^G=delete selected character OTHER: ^V=replace selection ^T=remove selection Select the datafile for this report. To select a file: Move the cursor to the file name below and press RETURN, or Type enough characters to uniquely identify the file and press RETURN. Your choice of files on logged drive (h) is:  The current logged disk is h To change the logged disk, enter the new drive name (A-P) here:  ** Error 11 ** There are no file definitions on drive h Please enter the name (A-P) of an alternate drive to use:  (intermediate) FIELD #001 Select the fields you want on this report. THE FIELDS WILL APPEAR ON THE REPORT IN THE ORDER SELECTED. To select a field: Move the cursor to the field name below and press RETURN, or Type enough characters to uniquely identify the field and press RETURN. Your field choices are: You have selected: ** Error 12 ** The maximum report width is 255 columns. The enter command is being ignored. Press ESC key. ** Error 13 ** The file selected has no fields. Press ESC key to enter an alternate file name. ** Error 14 ** The maximum number of fields (250) has been exceeded. The enter command is being ignored. Press ESC key. ** Error 15 ** You must select at least one field to create a report. Press ESC key. ** Warning 16 ** The command just entered, ^P, will return you to the file selection step. This will erase all the field and summary selections that you have made. Is it OK to proceed with this command? (Y/N) YYN** Error 17 ** The file selected has no key fields. Press ESC key to enter an alternate file name. Do you want a record count by G? (Y/N) To select summaries by G: Enter any/none of the following letters and press RETURN: T(Total), A(Average), L(Largest value), S(Smallest value). Summaries selected: Record count: PAGEREPORTThe report specification is now complete. You may: A=Abandon form-> start over or exit S=Save form -> make another or exit L=save form -> edit report Layout F=save form -> edit File definition SPACE=no save -> field selection R=save form -> Run the report (A/S/L/F/R/SPACE):  RA RSLF Abandon report generation without saving form? (Y/N)  NYN.PO 0 P P REPORT = Summary for (Count = ) Total Average Maximum Minimum** Error 01 ** Can't read form definition file. Press ESC key. ** Error 02 ** Fatal progam error; please report occurrence. Report generation abandoned. Press RETURN.  ** Error 03 ** Insufficient memory. Report generation abandoned. Press RETURN.  ** Error 04 ** Directory on disk h full. Report generation abandoned. Press RETURN.   ** Error 05 ** Disk h full. Report generation abandoned. Press RETURN.   ** Error 06 ** k - illegal character. Press ESC key. RGEN Release 1.03 ID # 711303KP-00A Copyright (c) 1982, 1984, MicroPro International Corporation. All rights reserved. able trade secrets and proprietary information of MicroPro International Corporation and is protected by federal copyright law. It may not be copied or distributed in any form or medium, disclosed to third parties, or used in any manner not provided for in aid License Agreement except with prior written authorization from MicroPro.ies, or used in any manner not provided for in said License Agreement except w C*$|=  x~#"$\ !*$!%-7: A29, ͗''--)-- ͝"*%=f́ͲC1"*$*͐" $* ~w#v͗"7$~2($#q# =Í*$*{ ~!!k > !>!͗>!!k > !!+>!*} * ~G!#~#O!y?!!>ͧ!*9$#*R @E @  Copyright (c) 1981, 1984, MicroPro International Corp.  REPORT Release 1.03  no terminal yet selected  I/O Master / O.E.M. Printer   "@@@P=  @@A   -__7777'@'@@Wx2z7W:G~~56   YZRCDTTVV2CCTTBT2STTTTTTTTTTCBTTTTVUUUVUUVVSSVUfVVTVVTUVVgVVUTVTVUTTTTTTSTTRRTRfTTTTSSSTTfTTTTVTVU INSTALL version 4.4B for ReportStar Release 1.03 DATASTAR.COMDATASTAR.COM!9" 1 ͣ R : o | e : | | x  ͯ !9"ͣͪ : : 24ɯ2.R!R ": 2 p _g p !"N !"P + l + ͅ ERROR CLOSING FILEô *N  6 > *P `  ͅ UNEXPECTED END OF FILE DURING READô Gzi {x*N + g ʬ ʛ ʬ > *P ` o ͅ DISK FULL ͅ DISKETTE DIRECTORY FULL+ g ô )+ g ì *N }o|g)|! w#6Ʌo|g!"N !"P  g Z > 2 w<==_ [ p N#ͅ ͐ ~ ~~ E ~#Ð ͅ !͐ 8 !p! ͐ * " * * | }ͅ This version of INSTALL is incompatable with theversion of ReportStar you are trying to install.!S͐ ~ ! ͐ ô 2 2 e >2 x >2 : ͐ ʴ : Š : ͐ !@@}O|G@!v):5O) !@v)!:5O)  REPORT.COM!  4 REPORT.COM! + 4~  , ͅ  **** CAN NOT OPEN FILE: ! ͐ ~ ͅ Please Enter Disk Drive (A/B/...) Or : N @ڈʈ҈2 2+ ͅ **** DRIVE NAME MUST BE "A"-"P" PLEASE RE-ENTER ****6 RGEN.COM!  4 RGEN.COM! + 4 REDIT.COM!  4 REDIT.COM! + 4xw# )կ :;u.!qt mͶ7COM#͓ʈ u͓>  ‰~͞#.:*? п[A?~ #öͶ#~+:~ͯ@##p <7 ~# Ã>2>222^#V#N#3333;;;;Nʼ   ʯʯʯ *:ʎ0GA::ʡ0:x=****E â*E xͅ E ͎**^#V#~#=^#V#N#F#3333;;;;<1>2 b@@ʴ ̓ E :wp>r>2wO> 2 a{ >E > E >E 1 n$!S͐ ͅ  ***** ReportStar TERMINAL MENU #1 *****A Lear-Siegler ADM-3A C Lear-Siegler ADM-31D Hazeltine 1500 E Microterm ACT-IVG Imsai VIO H Hewlett-Packard 2621 A/PI Infoton I-100 K Soroc IQ-120N Televideo 912/920 2 Terminal Menu #23 Terminal Menu #3 :6ͅ U no changeͅ PLEASE ENTER SELECTION (1 LETTER):!b:6Q!e">26"ڣn$U!A1;#CiDEGIKHNPPQWXP 32!=)(*< > ] &`$-!@#+ [%Q+oYZ!ͅ  ***** ReportStar TERMINAL MENU #2 *****Q Vector Flashwriter II W Xerox 820= Intertec Superbrain ! Sanyo MBC-2000/3000) NorthStar Advantage + TRS-80/Lifeboat 2.24 CP/MY TeleVideo 910 % TRS-80/Lifeboat 2.25 CP/MP DEC VT100/ANSI Terminal 1 Original Menu3 Terminal Menu #3ͅ  ***** ReportStar TERMINAL MENU #3 *****1 Original Menu 2 Terminal Menu #2@ Hewlett Packard 87 # Hewlett Packard 125< ADDS Regent 20/25 > ADDS Regent 40/45/60/45$ IBM 3101 ( Hazeltine 1420& Televideo 950 ] ADDS ViewpointX Heath or Zenith H89/H19 [ TRS-80 II (P&T CP/M)Z none of the above $Lear-Siegler ADM-3A terminaͅ  The CLEAR SCREEN and CURSOR CONTROL switches inside the ADM-3A terminal must be ONY#= 2p222222c2222go"g>2i22>22!P"@ $Lear-Seigler ADM-31 termina*Tͧ#Rͭ#Eͮ#'ͻ#)ͯ#(õ# $Xerox 820 Compute $Sanyo MBC-2000/300>F2OKͧ#Lͮ#Mͭ# $Televideo 910 terminaTͧ#͏#[  $Televideo 912/920 termina*)ͯ#(͵#͏#qwC,!" $TeleVideo 950 Termina͈͏#rwCN $Intertec SuperBraiͅ This installation will work on SuperBrains andSuperBrain QDs only. It uses MORPAT: and otherareas in USER1, so be sure not to use those areasalready containing patches.'>2!"͙#g ͙#͙#͙#5=!R>3>2ɯ!4w#!""""ͅ DO YOU HAVE DOS 3.0, 3.1, OR 3.2 (0, 1, OR 2) ??#0 1 2¶E >2! "E E >2!" $NorthStar Advantag!"p&">2͙#% $DEC VT-100/ANSI Terminaͅ Terminal must be in 80 * 24 format for proper operation.Make sure it is in ANSI mode, not VT-52 mode.'Y#[;H>2c͙#p $Hazeltine 1500 terminaͅ  The AUTO LF switch (under the little cover above the keyboard) must be OFF for proper ReportStar operation.Y#~'~ͧ#ͭ#ͮ#ͯ##͵#û# $Hazeltine 1420 Termina! *" $Soroc IQ-120 termina*(ͯ#)͵# $NEC PC-800 $MicroTerm ACT-IV termina' Y#!"p&"""" $Lifeboat 2.25/TRS-80 I͈ $Lifeboat 2.24/TRS-80 I>2!"p $Pickles & Trout/TRS-80 I>Y2O!"p& &&"&" $Imsai VIO displaͅ  For IMSAI VDP-40, VDP-80, & other systems with IMSAI VIO-C or VIO-D (with firmware) at F000. Accesses Video RAM directly. 24 * 80 format must be selected before ReportStar is invoked.!">22222!M!""w# $Vector Flashwriter Iͅ Flashwriter must be addressed at F000H.!">22222 $Imsai-VIO-used-as-a-terminaͅ  This version accesses Imsai VIO through the operating system and the VIO firmware, as though it was a terminal, to demonstrate ReportStar operation on a terminal with line insert, line delete, and erase to end line. Normally use selection "G" instead.!"p&&&"">2 $INFOTON I-100 terminaY#f '! Mͭ#Lͮ#4ͯ#3õ# $Hewlett-Packard 2621 termina'Y#&ayC>2cKç# $Hewlett Packard 82p͏#&dA͏#&d@ $Hewlett Packard 12Lͮ#Mͭ# $Heath or Zenith H89/H19 TerminaY#Y 'Kͧ#Lͮ#Mͭ#pͯ#q͵# $Adds Regent 20/2'Y#Y Kͧ#͙#6 $ADDS Regent 40/45/60/6Ͱ lͭ#Mͮ# $ADDS Viewpoint TerminaͰ ͙#0A͏#͏# $IBM 3101 Termina'Y#Y >2ͅ  We have not tested this terminal or printer type. Please report any problems.!#~ ~ ͐ ~ ͅ For other terminals and video boards, ReportStar must be"patched" with DDT. Determine your terminal's controlsequences from the manufacturer's manual; refer to theMODIFICATION section of the ReportStar manual, and thelisting in the appendix, for patching information.>U"""331#?#++##45Ⱦ#"^#V~ #e$ͅ OK (Y/N):>YGx?#B7#N7,#Y#E E e$1#ãG@ Q# R#xʴ Ḿ#V́#[́#~#2`~#2a~#2b2g~#O ~#Æ#^#V#́#^#V#N# ͆#!p#!#!#!#!6#r#sͅ Previous selection kept unchanged7$$7$$$bk:56 #=$Ͷ!~4$~#&$bk:56 #==$Ͷ!~Z$~#L$b$e$e$~ ~ : bNb$ͅ ***** PRINTER MENU *****(More specific info is displayed after choice is entered)A Any "Teletype-like" printer (ie almost any printer)C "Teletype-like" printer that can BACKSPACED DIABLO 1610/1620 daisy wheel printerE DIABLO 1640/1650/630/Xerox 1700 series daisy wheel printerF QUME Sprint 5 daisy wheel printerG NEC Spinwriter 5510/5520 thimble printerI "Half-Line-Feed" PrintersM I/O Master / O.E.M. Printer CombinationR C. Itoh/TEC Starwriter PrinterU no changeZ none of the abovͅ PLEASE ENTER SELECTION (1 LETTER):!&""n$:7ʾbÃ:1{$2&A)B;#Cl*D 2E2Fb3G3I,L 9M6Q /R5U'Z'b$ͅ ***** PRINTER MENU 2 *****L DIABLO 1200 Hy-Type I OEM daisy wheel printerQ Fancy TTY-like printer simulated on Diablo 1610-50 for demo1 return to printer menu Ë&!í!ͅ Are you sure you mean "none of the above"? Almost any printerwill work with choice A, "Teletype-like".If your printer really is different, refer to the MODIFICATIONsection of the ReportStar manual for information on patching ina custom printer driver subroutine, and enter S at the DRIVERMENU (coming up soon).>_*$Teletype-like printeͅ This selection will drive almost any printer. The printermust be capable of responding to ASCII printing characters,carriage return, and line feed only.K:ͅ  If your printer is capable of backspacing, use CHOICE Cinstead for faster output.A+>2@>2A͏#F ͏#Q ! "!""X"e"j"o"t"">27!~6$Backspacing TTY-like printeͅ  This choice is for any printer that will respond to anAscii BACKSPACE character (code 08) as well as carriagereturn, line feed, and printing characters.K:~ A+!"_$*ͅ If you have a DAISY WHEEL or thimble printer shown on themenu, use the appropriate choice in order to obtain "Micro-justified" output and additional formatting capabilities.kͅ Refer to manual for instructions on patching in optionalcontrol sequences for ribbon color change, character pitchchange, and half-line roll (for subscripts and superscripts)if your printer has these capabilities.$"Half line feed" printerͅ  This choice is for printers that can advance in half-lineunits but cannot roll carriage upward, such as a Selectricwith a half-line ratchet. Use of this choice causes subscripts and superscripts tobe printed offset by half a line. Backspacing capability is also assumed. Patching of control sequences may be necessary to tailorthis choice to your printer; see manual. If run for demo purposes on TTY-like printer, this choicewill double-space and otherwise function correctly.K:7+͏#X ͏#F $Fancy TTY-like demo on Diablͅ  This choice tests and demonstrates ReportStar's abililityto print subscripts, superscripts, two character pitches,and red and black ribbon on a Teletype-like (non-Daisy)printer that has control sequences to roll the carriage up anddown partial lines, change pitch, and/or change ribbon color. This demonstration runs on a Diablo 1610-50 but treats itlike a Teletype-like printer with additional control sequences. To make use of these capabilities on a real non-daisyprinter, select choice A or C as appropriate, then patch inthe specific printer's control strings. See the"Modification" section of the ReportStar manual."*͏#  ͏#   ͏#F ͏#o ͏#t ͏#e ͏#j ͏#A͏#Bð2$Diablo 1610/1620 printe~ 5r6~ >$*>2A͏# 4B  !B2́#!>">2@>"G2I>5"Q2S>6"V2X> "j2l>A"2>B"22o2s2L<2C2M>~2E2O>N27>_*$Diablo 1640/1650/630 printe~ ͅ This selection also works for Xerox 1730/1740/1750 printers~ 5r6~ 32͏# P͏# B S P͏#e  !>Y"o2q>Z"s2u>27$Qume Sprint 5 printe~ 5r6~ 32͏#I͏#I!> "o2q>/"s2u>o27$NEC Spinwriter 5510/20 printe~ 5ͅ This selection for the specified printers only. If you haveModel 5515 or 5525 use selection "D" (Diablo 1610) instead. To prevent buffer overflow with these printers at 1200 baudwithout using a cable adapter, specify "ETX/ACK" or "XON/XOFF"protocol at the next menu, and configure the printerappropriately.K:~ 32͏# 4KO@ ͏#= >]2@2I>O2C>2E>@2M>2O>>2S><2X>92l>32>422o2s͍5>27͍5>_*!"y&"~$C. Itoh/TEC Starwrite~ ͆3>c2E2Oͅ This choice is for the indicated daisy printers only. The serial versions of these printers should be interfacedat 1200 baud, otherwise printout will be very slow.ͅ To prevent buffer overflow with these printersinterfaced at 1200 baud, specify "ETX/ACK" protocolat the next menu.K:$I/O Master / O.E.M. Printer8ͅ This selection supports the following "OEM" printers: NEC Spinwriter 5500 Qume Sprint 3 (with cable adaptor) Diablo Hy-Type II 1345, 1355, 1355WPUsing the Micropro "I/O Master" interface board and cable(or an IMSAI PIO-4 board or equivalent; see also selection L).e82L>226<2@<2A<2>27͍5ͅ This selection activates a driver which accesses parallelports F8 thru FA directly. This selection applies to noserial printers.!8!8:5==6 #=9$Diablo Hy-Type I O.E.M. printe8ͅ  This selection supports a Diablo 1200 Hy-Type I OEMprinter on an IMSAI PIO-4 board or a Micropro I/O Master. It is also appropriate for a Hy-Type II (or compatibleequivalent) if the "data 1/2" bit is not connected, e.g. ifan unmodified IMSAI cable is used.e8>D8ͅ Make sure any AUTO LF or LOCAL LF switch is OFFb$:7;ͅ FOR DIABLO / QUME AT 1200 BAUD, SPECIFY ETX/ACK PROTOCOL(NEXT), AND MAKE SURE DRIVER CAN INPUT CHARACTERS (BELOW).;;ͅ FOR NEC AT 1200 BAUD, SPECIFY ETX/ACK OR X-ON/X-OFF PROTOCOL,SET UP PRINTER TO MATCH, AND MAKE SURE DRIVER CAN INPUT (BELOW);OR SPECIFY NO PROTOCOL AND MAKE A CABLE ADAPTER.ͅ At 300 baud or less, no protocol is required.<4<ͅ Most Teletype-like printers use no communications protocol.ͅ  ***** COMMUNICATIONS PROTOCOL MENU *****A "Communications Protocol" is necessary with some printersto prevent printer buffer overflow and character loss.E "ETX/ACK" ProtocolX "X-ON/X-OFF" ProtocolN NONE required (or handled outside of ReportStar)U no changePLEASE ENTER SELECTION (E, X, N, B, or U):!P>"26`>#~ "ڃ:ó>#e$:6ɯ>>26#"ETX/ACK" protocol:7L>ͅ For ETX/ACK protocol, you must patch in your printer's buffersize, ESPECIALLY IF IT IS SMALLER THAN 256 BYTES -- see manuaÊ=B;#U=E=X=N=:6!>!==!v>=!>"X-ON/X-OFF" protocolNo communications protocoINVALID PATCb$:6>ͅ With no protocol, the usual driver selection (below) is LÕ?ͅ With a protocol, the driver must be able to input as well asoutput characters (such as T or C). If you use selection L,patching will be required.ͅ  ***** DRIVER MENU *****Or, how should ReportStar send characters to your printer?L CP/M "List" device (LST:)T CP/M primary console device (TTY:)C CP/M secondary console device (CRT:)P Port Driver (direct I/O to 8-bit ports)S User-installed driver subroutinesU no changePLEASE ENTER SELECTION (L,T,C,P,S,B or U):!b"x2y2"ڳ>:b͝I:6b>23b{b:Gͭ!y="ڳ>:6A:32/ͅ  In most systems this is a "physical" device that is theprimary console device and is capable of Input and Output.Thus it is suitable for use with communication protocols ifit is not being used for the actual console. You need onlyset the Baud rate to match the printer (usualy 1200 baud).p ͅ **** WARNING **** TTY: is currenty the console. You maywant C (CRT:) unless you are INSTALLing for another system.$CP/M Console driver (CRT:>2/ͅ  In most systems this is a "physical" device that is thesecondary console device and is capable of Input and Output.Thus it is suitable for use with communication protocols ifit is not being used for the actual console. You need onlyset the Baud rate to match the printer (usualy 1200 baud).p ͅ **** WARNING **** CRT: is currenty the console. You maywant T (TTY:) unless you are INSTALLing for another system).$ReportStar's Port Driveͅ  The port driver directly acceses hardware port(s) to controlprinter. This driver is normally used with serial printersand a protocol. As hardware ports are very non-standard withrespect to location and status information, you may have toprovide data (Note that ReportStar will try to determine the dataall by itself) so ReportStar can modify the port driver. Notethat the port driver contains a "busy test", resulting in thebest response when editing and printing simultaneously.ɯ2NͳMnL5Yͅ *************************************************************WHAT IS THE OUTPUT PORT FOR YOUR PRINTER?NW1JU1J/RҪIWͅ *************************************************************WHAT IS THE OUTPUT STATUS PORT FOR YOUR PRINTER?N`X܊_JYWJ/R1J`X:6ͅ *************************************************************WHAT IS THE INPUT PORT FOR YOUR PRINTER?NܫXMKg]MK/RJܫXͅ *************************************************************WHAT IS THE INPUT STATUS PORT FOR YOUR PRINTER?NXKԎ^K/RMKXͅ *************************************************************WHAT ARE THE INPUT STATUS PORT BITS FOR YOUR PRINTER?N܈`mLu[mL/RK܈``Y͐YY:6ʄL-ZwZͅ *************************************************************WHAT ARE THE OUTPUT STATUS PORT BITS FOR YOUR PRINTER?N܊_MZM/R҄L܊_:6ͅ *************************************************************WHAT ARE THE INPUT STATUS PORT BITS FOR YOUR PRINTER?N܈`ڰMu[ҰM/RM܈`ͅ Are the printer ports "I/O" or "Memory Mapped" (I or M): M:MBʣIM7M:N7ͅ DO YOU WISH REPORTSTAR TO DETERMINE THE VALUES OR SHOULDREPORTSTAR ACCEPT THEM FROM YOU (D OR A): >A?#Bʣͅ DʜNͅ A7ͅ  wN:.RPکNN0:NE 0:NE :N>IN>M2M!00"W"]X"X"X"Y"Y"Y"Y"(Z"*Z"rZ"tZ"_"_"`"`_͚O_͚O`͚O`͚O:qOYͽOYͽO(ZͽOrZͽOW͚O]X͚OX͚OX͚O 0:O0:O 0:O0:O 0:O0:Oͅ  *************** CAUTION *****************THE FOLLOWING PROCEDURE WILL NOT WORK ON ALL HARDWARE ANDMAY HAVE UNUSUAL RESULTS SOMETIMES. PLEASE REMOVE YOURDISKS FROM THE DRIVES AND REPLACE THEM ONLY WHEN TOLD TO.ͩS>2.Rͅ ****************************************************************************************************************************YOU MAY NOW REPLACE THE DISKS YOU REMOVED EARLER.****************************************************************************************************************************"د2.Rͅ  **************** FAILURE *******************REPORTSTAR HAS FAILED IN THE DETERMINATION IT WAS ATTEMPTING.PLEASE CHECK YOUR PRINTER AND IT CONNECTION TO YOUR SYSTEM.IF ALL ELSE FAILS RESET YOUR SYSTEM AND TRY INSTALLING AGAINkͩSͅ IF YOU WISH TO RETRY THIS OPERATION ANSWER "Y" TO THE "OK Y/N"QUESTION BELOW. YOU MAY ABORT INSTALATION WITH A CONTROL C."ͅ IN ORDER TO USE REPORTSTAR'S AID TO DETERMINE THE OUTPUT PORTTHE PRINTER MUST BE CONNECTED AND TURNED ON WITH PAPER, A PRINTWHEEL AND A RIBBON INSTALLED AND WITH THE COVER CLOSED. THESERIAL PORT THAT THE PRINTER IS ATTACHED TO MUST BE SET TO THESAME BAUD RATE AS THE PRINTER."ͅ ReportStar will now attempt to output to a number of ports and willask each time if anything printed on the printer. You answer "Y"to the "OK Y/N" question when something is printed on the printer>ãV2 V>Y#ڞV2ͅ What is the OUTPUT port number in HEX: WW]_22Z!T>2Z>2Zw=eW#<_W!TÂWr[#x22Z2 }W> ZʍWxͅ THE OUTPUT STATUS FOR THE PRINTER IS: ͮNͅ H2ͅ THE OUTPUT STATUS BIT MASK FOR THE PRINTER IS: ͮNͅ H2ͅ THE OUTPUT STATUS ONES MASK FOR THE PRINTER IS: ͮNͅ H7?ͅ What is the OUTPUT STATUS port number in HEX: ]X]X]_22Zͅ What is the INPUT port number in HEX: XX]_22Zͅ What is the INPUT STATUS port number in HEX: XX]_22Z:BY23>2Z2Z2Z222>2Z2:Z:mY23>:2Z2Z2Z222>22Z2*Yfͅ What is the OUTPUT address in HEX: YY]_""Z*Yfͅ What is the OUTPUT STATUS address in HEX: YY]_""Z*(Zfͅ What is the INPUT address in HEX: (Z(Z]_""Z*rZfͅ What is the INPUT STATUS address in HEX: rZrZ]_""ZZG2 r[> ZZ2ͅ THE OUTPUT STATUS BIT MASK FOR THE PRINTER IS: ͮNͅ H2ͅ THE OUTPUT STATUS ONES MASK FOR THE PRINTER IS: ͮNͅ H7?7:6=ʖ\d2Z [ҕ[r[Á[ZGx!Y\~ª[ ›[r[ڪ[~#ڵ[Zʞ[gZ|ž[2ͅ THE INPUT STATUS BIT MASK FOR THE PRINTER IS: ͮNͅ HO2ͅ THE INPUT STATUS ONES MASK FOR THE PRINTER IS: ͮNͅ H7?TEST ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz d2Z š\Ү\r[Ú\ZG2 r[ڸ\>\Zʴ\gZ|´\2ͅ THE INPUT STATUS BIT MASK FOR THE PRINTER IS: ͮNͅ HO2ͅ THE INPUT STATUS ONES MASK FOR THE PRINTER IS: ͮNͅ H7?:6=^>x]<ʉ]2Z2Z ~]o]o]x!Y\~ ] ‘]r[ڠ]~#ګ]>ü]=r[2ZZ·]2ͅ THE INPUT PORT FOR THE PRINTER IS: ͮNͅ H7?> ^<^2Z2Z ^ ^^2 r[*^>5^>F^<&^2ZZA^2ͅ THE INPUT PORT FOR THE PRINTER IS: ͮNͅ H7?!T>2Z>2Zw=š^#<”^!T÷^r[#_x22Z2 ʲ^>_r[Z^:ͅ THE INPUT STATUS PORT FOR THE PRINTER IS: ͮNͅ H7?.:6=0_>.2_!@"_>2_!2"_*_+"_}r[:_S_7?!v_x_)))) `_}0 ??ͅ What are the bit(s) that change at the OUTPUT STATUS portwhen the OUTPUT port becomes ready to accept a characterfor OUTPUT (enter HEX value): __]_2ͅ Which bit(s) change(s) from a 0 to a 1 (enter HEX value): __]_2ͅ What are the bit(s) that change at the INPUT STATUS portwhen the INPUT port has a chracter availiable for INPUT.(enter HEX value): ``]_2ͅ Which bit(s) change(s) from a 0 to a 1 (enter HEX value): ``]_2$User-installed printer driveͅ  See manual and listing in appendix re coding and instal-ling your custom printer busy test, printer output, andprinter input subroutines (the input subroutine is needed onlywhen a communications protocol is in use).:O!dA!G!wa¥b:/!C!Eq>B;#U%ALaATCCEPGSta:.RbP lͅ ARE THE MODIFICATIONS TO REPORTSTAR NOW COMPLETE? IF THEY ARE ANSWER YES TO THE NEXT QUESTION. IF YOU WISH TO MAKE ADDITIONAL PATCHES TO REPORTSTAR'S USER AREAS, ANSWER NO TO THE NEXT QUESTION."wkͅ YOU MAY NOW MODIFY ANY LOCATION DESCRIBED IN THE LISTINGAT THE END OF THE USER MANUAL OR THE CUSTOMIZATION NOTES.YOU MAY USE EITHER THE LABEL OR THE HEX ADDRESS TO SPECIFYTHE LOCATIONS YOU WISH TO CHANGE. IF YOU USE A LABEL THENYOU MAY APPEND AN OFFSET TO THE LABEL (I.E. LABEL:+31). THELABEL ALWAYS HAS A ":" APPENDED (LABEL:). YOU MAY SPECIFYTHE NEW VALUE ONLY AS A HEX NUMBER. A LOCATION OF ZERO (0)WILL CAUSE THE END OF THE MODIFICATIONSeͅ  OFFSET IS NOT A HEX NUMBEReͅ  ADDRESS IS NOT HEX OR : MISSINGeͅ  NO SUCH LABEL ?!?!?!ͅ LOCATION TO BE CHANGED (0=END): bf?f]_ڃe"f/geMfb]_ګe|wkͅ  ADDRESS : |ͮN}ͮNͅ H OLD VALUE: ~ͮNb͚Oͅ H NEW VALUE: bb]_wff*f#fe|f}fb#úfGfxf f0b>*g: g+ gf+g>++&g77?!vgbQg cg VgLg####qg ;gb~#Yg~Ig#^#V#F#N7?7ACBSACFIACINACSEN ACSTAACSTA'ASCUcBLDSTACB4LF`CLEADMCLEADVCLRSCBCNVKEٹCOLOFbCONFI/CRBLIַCSWTCCTRAI[DBAVDBLSTBDB`DELCLүDELCUӰDELMIӱDFWQDHMIFLDHMILGDHMIMDHRNODLeDMJW‚DNPROӁDPHRUsDPHSPoDRLjDS[DVMIL>DVMMICDVMRNEEAKBS7ECOUN5ERAEOpERFLA4FILOU3HAVBSHIBCUҶHIBIֵHIT@INITS7INISU§ITBI9ITHEL1ITPOP8IVOFƎIVO·LIBSLINOFaLISENLISINMEMADҳMEMAPֲMORPANUMXE6PALePBACK_PBGME,PISTAPOBSPOIPOINPOINSPOIPOMASPOOPOOPOSENPOSMT@POSTAPRFINPRINIԽPROTC6PSCQPSCRLFPSFINɨPSHALXPSINIԗPSTA†PSTjPUBSPUINPUSENRIBBO΍RIBOFƒROLDOtROLUoSOCHһSYSTE2TRMINɕTRMUNɞUCRPOgULCHҼUNISUªUSELSԭUSRyUSR~USRUSRWIAb$ͅ CONFIRM TERMINAL AND PRINTER SELECTIONS:!͐ !͐ :k!͐ !͐ "ڣ":@ͅ PRESS ANY KEY FOR NEXT SCREENFUL OF TEXT:?#> E !pl>20!qll.l!Qv͐ l!qll<21!rll:v2223!tll:vUʐlP>!ʍl!tll:v0ڍlʌlڌlʌl x23!*mll>24!mllO!nlO!]olA24!p>l25:vl͐ #@2vm:vE lN mmO#~"mm2vxy7Do you want error reporting options installed into your REPORT program or do you want to select them each time you run the program? (I/S): IIISWhere do you want error messages reported? D Display on terminal. R Display on terminal and require an operator response. L Log in disk file. B Display on terminal and log in disk file.(D/R/L/B) RRRDLBWhich errors do you want reported? A All errors and warnings E Only errors F Only fatal errors N Only non-recoverable fatal errors(A/E/F/N) AAAEFNWhich errors do you want to stop the report? A All errors and warnings E Only errors F Only fatal errors N Only non-recoverable fatal errors(A/E/F/N) FFAEFNWhat is the maximum number of errors to report? 0 don't report any 1 1 2 10 3 100 4 1000 A report all(0/1/2/3/4/A) AA01234ANon-standard options are available for: Running under MP/M, System disk drive, Initial help level, Output report to disk file, or Error reportingDo you want to select any of these? (Y/N): NNNYAre you running under MP/M? (Y/N): NNNYREDIT layout help levels: 1 = no help screen 2 = only help screen 2 or no help 3 = all help screens except 4 will be available 4 = all help screensEnter the initial help level desired: (1/2/3/4): 441234 The system disk drive is where ReportStar will look to find programs and overlays if it can't find them on the logged drive. Enter a disk drive (A-P) to be used as the system disk drive, or enter '0' if you don't want a system disk drive.Enter selection (A to P or 0): AAABCDEFGHIJKLMNOP0The report output can be written to a disk file instead being printed: D = write report to a disk file P = print report U = have the operator make the selection at run timeEnter selection for report output: (D/P/U): UUDPUHow much memory should be used for the printer buffer? 1 = 128 characters 2 = 256 characters 3 = 512 characters 4 = 1024 characters 5 = 2048 characters 6 = 4096 charactersUsing more memory may speed up the report writting.(Enter a number between 1 and 6): 11123456This version of REPORTSTAR will run under CP/M only up the report writting.(Enter a number between 1 and 6): 11123456This version of REPORTSTAR will run under CPicroPro International Corporation and is protected by federal copyright law. It may not be copied or distributed in any form or medium, disclosed to third parties, or used in any manner not provided for in said License Agreement except with prior written authorization from MicroPro. Enter name of report specification file (or press RETURN): RGEN COMREDIT COMREPORT LOG PRN ~eBFF!>OT ` C j    x[7wYY L@T@}_2)~(CURSOR: CR=next item ^S=left char ^D=right char ^A=prev entry OTHER: ^G=delete char ^V=insert hole ^C=abort report ^R=restart ---------------------------------------------------------------------------- FT1C-N+P'".: No *.123456789FPRNDX Abandon report? (Y/N) NYNEnter name of report specification file (or press RETURN): Do you want output to go to a disk file instead of the printer? (Y/N) NNYDo you want standard error reporting? (Y/N) YNY < completed.  warnings  errors  fatal errors < terminated.  warnings  errors  fatal errors < terminated by operator.  warnings  errors  fatal errorsPlease enter the name of the data volume to use for the file : Do you want to enter more volume names Now or Later (as required)? (Press N/L) NNLPlease enter the name of the first volume to use for the file : Please enter the name of the next volume to use for the file , or press RETURN to end the file: Please enter the rest of the volume names followed by RETURN. Press RETURN when the list is complete. A file name is 1-8 letters/numbers and an optional 1-3 letter/number extension, separated by a period. A file name may be preceded by a disk drive selection (letter, colon). Press ESC to re-enter the file name. The volume u of the file  is not present on the disk r. Enter the name of an alternate data file to use:  The volume u of the file  is not present on the disk r. Enter the name of an alternate data file to use or press RETURN to change disks:  The disk/directory in drive r is full. Enter the disk drive (A:-P:) to use to continue the volume u of the file : The disk/directory in drive r is full. Enter the disk drive (A:-P:) to use to continue the volume u of the file  or press RETURN to change disks: Please insert a diskette to use for the volume u of the file  in drive r and press RETURN.  Output volume u of the file  already exists on drive r. Enter the name of an alternate data file to use:  Output volume u of the file  already exists on drive r. Enter the name of an alternate data file to use or press RETURN to change disks: Please enter the drive number (A:-P:) to use for the volume u of the file : u already exists on drive r. Enter the name of an alternate file to use for the report or press RETURN to overwrite the existing file:    Opening u on drive r.  The report specification file, u, on drive r is unreadable. R = Re-enter the report drive/name X = Exit to operating system Press R or X:  RRXThe report specification file, u, on drive r contains errors. R = Re-enter the report drive/name L = List the errors so that they can be corrected Press R or L:  RRLPRINT PAUSED. Abandon or Continue? Press A or C: CAC The report specification file is where the specifications for your report are stored. If you have not yet designed a report, choose a name for the report specification file and enter it here. A report specification name is eight (or less) letters and/or numbers, optionally preceded by a disk drive (letter A-P followed by colon). Press ESC to enter report name or ^C to exit: "H:" is not a legal disk drive. A report specification name is eight (or less) letters and/or numbers, optionally preceded by a disk drive (letter A-P followed by colon). Press ESC to enter report name or ^C to exit: "H" - illegal character. A report specification name is eight (or less) letters and/or numbers, optionally preceded by a disk drive (letter A-P followed by colon). Press ESC to enter report name or ^C to exit: A report specification name is eight (or less) letters and/or numbers, optionally preceded by a disk drive (letter A-P followed by colon). Press ESC to enter report name or ^C to exit: REPORT Release 1.03 ID # 711303KP-00A Copyright (c) 1982, 1984, MicroPro International Corporation. All rights reserved. ied or distributed in any form or medium, disclosed to third parties, or used in any manner not provided for in aid License Agreement except with prior written authorization from MicroPro. The report specification file, u, is not present on drive r. R = Re-enter the report drive/name G = Generate a new report spec Press R or G:  RRG H.COM is not present on drive r Specify which drive (A-P) to try next: Where do you want error messages reported? (D/R/L/B) RRDLB D Display on terminal. R Display on terminal and require an operator response. L Log in disk file. B Display on terminal and log in disk file.Which errors do you want reported? (A/E/F/N) AAEFN A All errors and warnings E Only errors F Only fatal errors N Only non-recoverable fatal errorsWhich errors do you want to stop the report? (A/E/F/N) FAEFNWhat is the maximum number of errors to report? (0/1/2/3/4/A) A01234A 0 don't report any 1 1 2 10 3 100 4 1000 A report allIllegal character (H) ignored. Press ESC key. ** Warning #1 ** Pass V Output file, u, contains the following record with invalid data: R** Warning #2 ** Pass V Destination field, #, in report is too small for data: K** Warning #3 ** Pass V Alpha character(s) in numeric field, #, ignored: K** Error #4 ** Pass V Zero divide in calculation of field #.** Error #5 ** Pass V Destination field, #, in report is too small for numeric result: K** Error #6 ** Pass V Destination field, #, in file, u, is too small for data: K** Error #7 ** Pass V Reference file record for file, u, not found for index: K** Error #8 ** Pass V Function argument out of range in field #.** Fatal Error #9 ** Pass V Number out of range in field #.** Fatal Error #10 ** Pass V Expression too complicated for available memory in field #.** Fatal Error #11 ** Pass V Dot command error. Margins exceed or equal page length.** Fatal Error #12 ** Pass V Unknown fatal error.** Fatal Error #13 ** Pass V Can't read report specification file.** Fatal Error #14 ** Pass V The disk/directory on drive r is full.** Fatal Error #15 ** Pass V Insufficient memory.** Fatal Error #16 ** Pass V Illegal format, u, (on drive r)** Warning #17 ** Pass V Control character(s) present in input data for field # ignored.** Fatal Error #18 ** Pass V Change diskette message for u on drive r cannot be issued because drive is being used for other files.** Fatal Error #19 ** Pass V Change diskette message for u on drive r cannot be issued because file output is in progress.** Fatal Error #20 ** Pass V u on drive r has exceeded the maximum size for indexed output.n progress.** Fatal Error #20 ** Pass V u on drive r has exceeded the maximr #18 ** Pass V Change diskette message for u on drive r cannot be issued because drive is being used for other files.** Fatal Error #19 ** Pass V Change diskette message for u on drive r cannot be issSTAFF O ---------------------------------------------------------- | STAFF RECORD | | | | | | SALESPERSON ID: | | | | | ---------------------------------------------------------- 򠱮 ƮƠ宠堠 Ʈ ANAME8@IDJeremy S. Gogetter,GSJ Susan B. Hardsell,HBS Wyzell T. Softsell,STW ,  said icense Areement xcept wih prior ritten STAFF $$$GSJHBSSTW0pared ona characer by chracter bsis to dtermine cceptablty. Charcters ar compare accordigSTAFF DTASTAFF $$$*Y!\ x\F%CÚ LH SR UJ BP PL MT, MB2 HM8 FM> CWD PCU POL PAj CPd PNu OPo HE FO !J;>w͔ n!f;> !K; Ô !O;# !W;# !S;\ѷ-!>N d!\ xp!x* Not enough memory $CS OVR CS.OVRw#x`7PASCAL/M.xxx Copyright SORCIM Corp. 1981 S/N- 38,BCD 2.x804.01EV S.C.3740FilenameEXT&&(XÈP>P?CS OV2 T   WQjk#"ERlm)(>}>?}zz_z>}>=}z}{}!D J 9  O <  , F t T d _ o %4 Z f  =: i SrT8KDknt"@|KY!H}-<DKn2A"q )"4\hbp?+?? @o&L (!_^#V*MD2}~Bebob_x_*x@_*^#V!2"o&"*":ʝ!6u62::ʼ!6u6:! *)22!u6!"" 5!6u62*1.Å.Å:D:D.Åi`".Å.Å!"".Å"i`""!>À.Å!!*ù). Å. Å. Åi`"*~. …ý)*MDi`"> } "i`""!>À.Å.Å".Å"".ÅPCO o g o g1 o&1!1!1!1*w*ͻ11*Î*ͻ^#V2Ó*é*ͻs#r2î _րW _ *^#V=ͻ ͻ1Îïn&1s2ͻi`"`i{=Ļ )D)11ͻi`"{OzGn%D `iG^#V#=MD2^#V#~#fo2i`"q#p#s#rD 2o&)+V+^=w2 ʛo&)9^#Vs#r#=’2ͻi`"KBn%D O>G2᯲1Å 2i`"|}2!N: ~# DS#11 _ 2i`"K ) :o&E6oDi`"CK^#Vx]GjS]bllzW{_b! ~_#~WDi`"y! N#Fڟo`ALbS\¦öʶo{_zWyOxG-¦y/w#x/wD =11{ozg1}o|}/o}/o|/}{ozz܄$21i`" Di`" F i`"ͻ D7 }o|g1Y 12Y 1b Y ڄ Y 24Y 24Ê 2>}ͭ 2ä!.?%*?%yH ) y ̈́$`i<) MD!xGyO){_zW #= ɯ A A x& ̈́$; a z8 8 Ä$ ̈́$?%| !1Y | N V Y | N f ?%N !1 ʕ !D ʈ !D ڈ • È ڕ ˆ Õ ڕ È ڈ Õ i`"! ; O' 4 2 {_y| }! z {2N2G Ay" # :ͻi`"KB@ ͻi`")MDG a # J J z?%zɯO>G i`"_!} ^#Vz `   é | DP  x   D}o|g }o|g ** ** à 2 **DDí2 ? **D"""Y **?%_>W>o>gz Wt / |怺2 z!+~ "~ *D!""!9+x> ¸ wxGyOzW{_# :2#:2#:2#:2+++~w#~w#~w#~w++++5» *}lg*}lgD**P ""**P """ᯕo>g>o>g[ "<{_zWyOxG] !""72xGyOzW{_*)"*)қ #""}o|g"}o|g ** *#"} *#":={ ""*"z OOx*X =  H_>W>O>G|C㴵DW * = *+ [Gxʞ{/w#z/w#`Þ|GOxʏ{w#zw#‚yʞGw#w#–*Dxʞ{w#zw#±ÞO!9Axw#w#*H+~+~Di`"E#)9~"## ѻ2i`"'O)9o`9]%D)EO/ɔ>2ʭ{½#z½#œ:ºý$:O*D{/#z/#:~/ѣ#~/#:$O%y7Az9-i`"x! {zyoxgyGM{ozg{2&^#Vʛ×=–x! G{_#zWxʸ³:! yoxgy_z b ~9>o&D}K|K@}@|@KK2K@ ZO>G2*O ^#V7}O|G2i`N#F#^#V#""z}|DDxD}o|gD#)*N#F+}o|gMD2ͩ2ͩ*1ͩ**"*"N#Fq#p2ͩ*MD*#~=! V+^+F+N#KB21*+V+^" "*^#V TO* #~+~+ G*" ""*yvxʀ*~ĉ"2o&)) F+N q#p*$?%M*"*" i`"/<_**^#V7}o|g",~H^#V#N#Fo>g9͚  o>g9͚**##n%****!9" "**"*,"+V+^}O|G *c<*"*!òi`"͢>*MD"*!ò =i`"W*|ʚzFҚ #w""^#V*z"D!a {  wa{Q HA/[H_HQ?H#H$H0Q:Q #w *w$*s#r::<"?%ʩ!œ#|*##w#6ŽD! *p*##6#6###!~#¼DAO*| Ni` ) ) """*#!**s#rD,*^#V{=!* ^#V{=!yзO \w# Sw#G \pB +{'wzG y +'  7+>'w ž!& #!B ~!͇=~! ͇=+ ~1#  +s'G'w+>GG Jx=Š#6ÊP''w+ xҊ#6|@"@wʜÜ! ! 2O~22O#!BH!B!~@w/2""""!"p""""<o****i`"2UͬrUrUir<. rD<< rD<]Tͬr< **<v~@2v8rH@PU8r! ک!A &>2"UʹD<****DD<****D""!J *r"""![ *r͸*|N}2o~! ͇*}D!͸*|~}2N}! ͘ڠ! s!:G~22ͮ*}|@g}@Ox~w #r#  !!ͬi~#YP~#YP^#V|h h ^#V#^#Vh z| Goxgx_xW! Ͳ Ͳ w+zŒ  !))Ҿ zP OzyW#´ BzWx  "! }|{z>2E !!!"!DM!q#p#s#rq#p#s#r>2Jʹ$ ++**-( -,,-#-**E\......."$o$v"1bͻ"|Z"`i"t" w#"͆*/$>:$DxS}U$"y x%xD*%Do$MDy_xW{z/W{/_xzW{_Ì$$$$$$$$$}0>02$>0]T< $=kbG:$$> x>2$0~0~0#y$GN#x%%y_ѯ %#7# y:%'%%yz{x7# G%?%n% +~ xa%x~# n%x~aڋ%{ҋ%# {%~#Ó%7#Ü%zq#é%O:=@I·% ´%|%}%Ɛ'@'ɯ2&#~:+:%~@5&##%:<~>:77&.!&~.#!&y[&!7& [&:&7x7~f&#.[&*S&>?^&~# 7&G>  ^&x!5&|5&;5&=5&:5&@ʓ&#ʓ&*ʓ&?˜&2&a&{ w*%.*/$>*:õ&x:&Ƞ2&Ʉ&&OYy&OOy'_  'ɯ%'-' '^{#.'ͤ'6=(ͤ'#6^w#VwzW{_! 4!~oO ͧ%=(=(=(=( Y=(!!^#Vr+s=("',(' (,(( ( GCONSOLE#CON#CRT>READER5PUNCHGPRINTERLP5COMM1,COMM,NULL5TAPE15TAPE2/>2!"$ͧ%~|)|)O͘)X):|)~)# |*#A):"|)! 0)o^5)oV%|)X)!F(%>~)Oy~)~*w*T] FO>o)/Gwq#6D>2!9̈́$|D!"D#y% ʠ)>!%!s*)-'*`*%*k*%![*-''<2\!u*]͓%!\'! *-':@!6n% Pascal/M ABORT. ! Insufficient Memory. Feature not supported by DEMO. PC= FFFFh SP= FFFFh $$$ SUB*}2]*1{2*w#w2}2*{22y**29!(*&oS("6:8>*>2D͒-y*+!**.!+!D>+>28!`+">"<""A":͒-~ ʅ+:8I+~…+ͭ*~2@###^+*|ʻ+!~~+w*A*?%~+͠-w*Dx2~+ÿ+ï+]**<k.+:8).-!"û+2*>͂.**:{L,:8+NS,H,:@O ,y+͛,wH,,,&wH,͛,w{,,& $,> ,:t:H,6#{3,͠-wL,#+"û+:@ ,:Cy2Cu, = ͠,i,à,ƒ,>w  :7>â,>ʳ,YO,O,&ð,_>ê,*|~#"!"t-?',`'*, s#r> 2t-X'>,t-',t-͹'>,t-'"t-͠-> p-**N͘)n-!'> p-*!'> p->2>28͔-ͭ*~ !D*!""N*~ɯ2>28i`"<"":"!-"*<k.-:y.*:-!*'.-x2y.".*:":-!"*:!n%͠-w**:'K.F.x2y."].!"*:":/.|)!!q#p*w$*6#~2,#~2,<̀1r<ͯ2r<2r<.r<0r<̓/r<ͬ0r~7 / @4>@#!4{/4ͬ!4444!448!{/44ͬ4!4o/# U/!4#!44)/@P`i ~77AAҠ//< ڶ/ Ҩ/ ¿/Wr#w+4!46A!4#0ʹ/!4+04i4!+048!444!444ͬ!30{/`4YP!48AA1b'v`?)CW5?2ab$c?4t5XU"`?7vG7Uh?A6y"?EqRb?Q 4hE?WY04?fE5gt#?x&33?Ps@@vd@7y'a0@()eF@8P̓/PY!0ͬA#XPA~0PY!#04!4~w4#0!'1`4!444ͬ!444ͬ1!4BK4!#02YruT4&(W)$6Q"i77BP9P:3 ;8333='`Affg>&fffg?1%@%4!4~Gwx24-24 !=24ʹڻ1!4-24i1!E24ʹ1!4>w!4E24i1!524ʹ1!4E24i!4>w!4M24ͬ!444ͬU2!^2`4!4:4ͦ4AbSApyc&yIAG88GA1AY&SX@cfw#gYCwTg185`fW1cfQ 9V)!525!!=AG6FuA51?yi&&$agdYd u%Apyc&yI-2 PY!528DM̀1~2`i 4!4~w!4#0ʹ3@!#044!43ʹC3 !434ͬ!4#04i4!348!444!444ͬ!#0444!H448!4P44ͬ!4(4!448!444i44 ~y34!#048!444ͬ 3X4!448@3!5244i!4ͦ4!4@&yI$1A2V?aP?d3Fg1?hW(W)3333333@P"bD48@PBsPBsP@Q@`@EA4@R5wU0!4 448!~ʏ4!444ͬj4!444ͬ44845Ȯw:ʎ5i`":5*^#V{D{ O5*OWY5*MD2?%452y  5yo*MD}A: :ʈ5*~ʈ5i`"O*~^5m5ƒ5!9"5!v5u6Ã5y5i`"5*MD 5: 2͝5Di`"|5!@6 ͩ%*t"@6N#l%)6-'6͙$*n&5ʹ$*n&6ͫ$*#n& 6ʹ$5-' S:12 P#123 Lev 12 12345 - line executed. Entering Proc name - 12345678 :6!6@\6!7q6:!4n6!.6"2l%BKPpSTEP 95O7*7 7}|:A76~ 6 6,6;6|7 77a6{6 w#ï66#×6:A76~ 77#66#ï66go~7ѯx~ %7 )7#7~':7":72A76#2A79:~#]7<+w#_^#Vѯ71p?Z:!""""UC8 |•7}27>72,} :8-' *-'a:! Pascal Library not found. ! Pcode file not found. ! Pascal Library ill-formed. ! Pcode file ill-formed. PASCAL/M version NOT compatible with OS. !]͓%'<22\!"9:}2!:~o8 ;#T2p<%!9)!PC">O2p-͢!U~@/5"#l%*"K6!"*""+F+N}o|g"+F+N}o|g"* N#Fo>g9!9!!9"" ""!$$"}2:D*!9w$*Dé%!9)!p ii ` ii.gh i*ݚ iiiۣi4iidabba(i4ipci6iai.iacadadf2i4`*i0ii.e`i6ifei*i.i`ipi  i +2 `d e e (/`/d`b45b4bۡ#bb b6b b.ab`,bۡ`,b b`,&V vdddpdۡd &"<:<<c x0epdder6*d0 j1`/``d a`,d3`b1(adۡbdp`,b3U rA22Ar 22    T3A22Ar 22 <% R4b52bafDec,c0d ca dcA $`pd``peN ~5`bap5aeapf.$dGc`d62GUcd8 Z6A,Ap(8--+89A`A,`p `ۡA1A,`p+ B: 9A1 i72R3A,Apggpi472[ h;   :9 @ @;.8 ;Ee89;X#F6GgHGU !AU AaU a0U0728;x7a/22 7f6g g  g  dL ݚ$ ݝ$4  $а ݰ   e64g h fd5h dc5h >> $(>hh( h(    `4aۡ aۡa,02Yz2d2  `2 a a &`2 a   a ݰa  :d  e=e. ge  f e     j<dd*<  dd.<  bffff  fb)fef4ۥb+f0ݰf. fef.f*ݜfbf6fff.f*ݚ  e  `p ` `p ` `r  `p ` *(D4`Dp D `` D2B>dbbbae `eabababa>af4b``bfpc`d ` dc`bee>0 =ab`= cba`=!ba`a=#True Pa FalsePb`=0"a ``Ћb`=0$``Ћc`=0%a` l ml2   - Alg A`i iii(Aglg  = kn jnj ki 0`>.egZg#gg.i2g0.g0lmЋfa= &'`bЄcaЍacabbcbcbЃ2bPa#ca`dd`cab`b`6aabЌ`1a`bcd badbcbadbb`H`FabЄecЍce1b`d b`b`edbcb`ebbeTeSe deЄ egf3gfghdg gfdg e egg: fa`a-ݰ`    eaed0`eaea`a`W/zJ ~  z V (DzXPL  Dpjd H@6HLZ|>CONSOLE:P``CRT:P`PrrT<< <R4:/(AHardware parity error(Unknown device specified(Illegal I/O direction(Undefined hardware error( Device referenced is not on-line(File not found on CLOSE(Illegal file name(No space for file(Bad random access("File not found on volume specified(Duplicate file name(File already open( File not open(xError reading Real or Integer(RPut not at EOF(; End of file(' nG)rN9 IO error: (? .Unknown run-time error(BDivide by zero(Exit from uncalled proc(rArgument out of range(Floating point overflow(Illegal PCODE instruction(Integer overflow(Value range error(Non-existent Proc/Seg called(Stack overflow($String length exceeds declared limit(Can't read Pcode file(Programmed HALT(Program interrupted by User(String Index out of range(Non-existant External called(Case out of range(Set element out of range(fPointer invalid or Nil(HAssertion failure(/(H4gS) ~`D ! ##%V* tu Value= #%r60Enter new value: # iB`tJ@Value= #`t$`uJ , Limit= #`u$cVValue= #t$$Value = #sNil#s 16### T asCurrent dynamic length= #`$, Illegal index value= #at$" as`" v @@  File at 16### = #@   b+. P b :@b P #b B%F Bs 62 .*%, 24,.,&,.V` b`a`Ѝ b`Ѓa`Є (   a a*PASLIB* bnrа  nr nrk lnrknrk m`nrk  f``yEab kqabksFktgeH^beF ku  % H-& lk d  c cd  #ffgf N  b vxcw )At S#ss P#ppp procedur I#iiii sp=1234 < ! Line #$ ifrom  -cE=continue, =quit?# d d cc 2 Resuming...#dN`f Pb.! ;<: = Not impld. N JaJ ,2J;2J ;BBBB BJJ1 END 1Z TRUE 1C FALSE  1, CLEAR 1 DISPLAY 12J 1 OJ0J!2J< 11 111 1111111 ^C )IA\"$&(*,.0246j:<>^BDFHJLNPRTVXZ\^`bdfhjlnprtv15#expected# 41@XJ 4PS 8ddۣ BO 6l iveɀŃ jpgjq dgfhdpi֔vf dff) VCfe hqfeˀhsˀɀơ(hrˀ diɀgfˀɀgQ \deee  da e cʀ` ɀbbɀ"`e cʀbɀ be c P d fЇ lЃ klj kۃ k jc L Gaɀ`ɀˀ`(4 af gg GG `jk j k/  ` jʀ jˀ N)   h cmC C#oh  m m$Q'C%7m"+= ! W;% 9k-& ( afgg  I h   j   y i1 (1  Illegal value.#2/= ! uY q   M`E ЇЃll  2EˀG ɀɀˀ(G`E  E&V8 g֔vfptep eph e p p֔vfpt֔vfpv qffp֔vfpuuІ vv pd$d֔vfp$ Error in index#T& hb`/aˀ ɀCb  aCbab7 B bappɀ-2!`"ɀɣnEˀ< ɀ"E$> C " EG; ɀG;CGGEGCCGGE"EGE EˀɀG" EG|!֔vF  $ `)ppE`-2#= !.z Too long.#!F6>  pRp  feepfgf g dp eepfgd p hˀɀ Error in last index#epˀhG ` b   ֔v obbppn  $8bpp ab  C( bp babp`bpc.df֔vatdef֔vave`bdjHa`a9aˀɀ  ab b.b aC \b`hg /   Ѕ   l lˀ i ) ɀ  l Gkapl lGk$i Oap= !lGlm)`l C C#l ap aIˀI֔vn֔vnv֔vntn[ pp$, ]=#IIo= !m*s.!')n811`O&1;` Not an array#_5 , or ] D19` Not a record#$5 .,^,/,\ v1abOb Too many fields#1c  ?#1cb111 abx 3 ` D֔vI 1 Z1 tʀɀuɀG,ɀBBC C#ɀˀ%֔vID 1 ; ֔vID v5 /,\  p  ˀ֔vI  D1 Boh = !;  D< Unknown mode# acgosuw ?#X=^f(dy4[ceMdap`:acgdbdbpbddydyda8dyddy`ddydToo many#{ `BOrpa44 <: Xa4Ma4B ?#5BXI ` "dN(*,KE Crˀɀˀɀnv` q֡Րpb bb$: ;Ր b!( ֔ve ededed֔veCtmtn[e ֔vId/q֔veveq , e) K4nCbyˀbɀcsˀdɀcrˀ`ɀɀɀbdvaɀŃ e ev9b$: ;dՐ d֔vdvaɀŃ pcq d֡dՐ x+Ȁap apapBaȀbqaB| Break at ##ƀ$Ua-2Iƀ-2# ƀ$<> xvrMC PASDDT#<!2`1135 /,\,[,^ 15 ; 4j-4jƀƀƀƀ<: Line# #$Breaks: #ƀyȀƀˌ*B# ƀBp$, BȀƀ Trace on.#CA`< ?#/6> %3, "$10 Exit PASDDT.#6tiNV  ~ 0 Df :h6pV:-;;<<G(>@"< G+2>DR=BD`v a>aDBE`֔v=>==l`v a=$`CaaE>@> kv p = jidk֔vj j d'V ;=<G$empty symbol file#+2tȀEGM GE ECBbaȀE֔v=>===ȍGG=ȍToo many symbols.#Last symbol read: #>! in #vb !2Do you want to see the list of symbols available? #ȀƀcF`HJ  0 ihcdSeg##c$----- Procs -----#hceed khvb mmP# #mv$f#mf! lev#m$mq$ vars#mpmqnh֔vga`## !t$ u$ v$ $ $ $## !ab c  pA / Print .#.\ Print change it to .#);{-}B Set/clear break at .#;P Proceed.##;{-}S Set/clear step mode.#$;{-}T Set/clear trace mode.#%CLEAR Clear all debug modes.#DISPLAY Display status.#END Exit to system.#  PASDDT#` 1.00#*`s   .SYM(a,„IIvI֔v 0JJIbLLLbJJJIaaJIII֡ 3[ "L+ wJX,< X^R # ,49h C20/00/5500:01%Comp 4.02 CSV145,, COPYWRITpʑ#a ` #ʓ#7 Copyright (c) 1981, 1984, MicroPro International Corp.#" All rights reserved.#:#:#:#:#:#:#:#:##¸ a` 2`%\ ǀǁD8TEMPFILEǀSTOLENʓMicroPro CalcStar 7ȀʓȁƁȀƀʓƀЃȀƀȁƀˑ:ɑ:ˑʓSTOLEN SOFTWARE !!7Mʓȁǁʓ7ǁ1.46 <ǁ =ǁID # 511503KP-001 Rǁ7ʑ> CSMASK.MSKʑ> RNecessary file # CSMASK.MSK# not on default disk#2ʓJʓF˒ǀ TERMCAP.SYSǀ F3Terminal not configured... type "INSTCS" to do this#2ʑƀ8ʑ#ɑ˒ʑʑʑʑʑʑʑʑʑʑʑ ˑ7ɑ7ɑ7ˑ7ǁ}XXXXXǁ}ɑ7ʑ'ȁǁʑǁǁ} ǁʑǁǁ}ǁʑǁʑˑ3ɑ3ʑЃǁ}Ѓˑ4ɑɑ3Ȁɑ4ˑ3ƀˑ4ɑˑ6ɑˑ5ʑ^.ʑ^SUMʑ^AVGʑ^MINʑ^MAXʑ^ CNTʑ^SLOPEʑ^DEPDʑ^ REGRʑ^PROJʑ^ ABSʑ^ EXPʑ^ SQRTʑ^LNʑ^LOGʓ? ǀYRʑˑ92`Pʑ# # - hit space#ʑ# #+T^aɒa aɑ`ɒna `a``'ɑ` ``ɑrForm length : CONTINUOUS# ɒ˒kɒkbad form lengthɒk3Stop on each page (y,n) ? #YN#Y˒o˒o`Pʑ##ʑ#2R832top left corner : A1#   A1P gf Bad coord32  bottom right corner : # #  32  ed Bad coordepgpdpfp End < Start VTo which file ? #PRINTER:#  ɒˑ92>˒rɒrb``a`DISPLAY CON:PRINTER::.:.Iɒr#.DTA!.TXTʑʑ ?&File exists. Delete old file [y/n] ? #YN#Yʑʑcan't open fileʒhʒiʒfʒgɒr˒kOutput width : 132# ɒ˒nɒn˒n˒mɒiɒgbɒmʒ`ۃ˒m`ˑ8ɒiɒhMFix ordinates (y,n) ? #YN#Y˒pɒpYes# No#˒pReport Printing..#2#Make sure printer & paper are ready#ɒmɒn9ʑ# Printing in segments #ʑ#˒lTitle> #ɒl˒l ɒnЄDʑD#ʑ#ʑɒl˒jeAˑ9ɒpɒqAʑ#Cannot print empty worksheet#ʑ#ˑ92˒obhPrJ8ʑ2ˑ8Writing Data file..#ɒhcɒf. ɒidɒgdcJJJ|0J&J0(,0"0`ʑ" 0BB$0a"ʑ" ʑ0a aB`ʑ" JJJ ʒdJ ?n?PdJ 0Jbbbbb*ʒdJea ʑ#dɒgʑ, dʑc 468,ʑ# FILE WRITE ERROR - hit space#ʑ# #˒Ra`JJaʑʑ ,ʑ# Hit space to continue #ʑ# #`ɒRɒoʑ ˒lpʑɒl˒lɒk ɒlɒk(Kɒiɒr˒qɒiɒhɒpɒiɒhaɒq9Printing segment..#ɒj[[ e[ɒnɒqeɒpeʒۄʒcecɒgeʒcۄceɒpIɒqʑ 1:# bʑ#ɒqac[[ ee[`ɒf[[ɒidJJJ/PAGEdKKKd^ɒqdʑ#ʑ: bʑ#ɒpɒqdac]] ede]d[c˒i˒qcɒg..End of report#ʑ)@_ x*0^bBb(empty, but allocated)#numeric#text:#aZleft justified#P repeating#<right justified#"centered#4cN ` (Form mode set)#. ɑ;ɑ;#ɒ bɒ ʓ*ʓ*ɒʓ*ʓ*ʓ*.ɒiˑ;ˑ;"ɑ;dɒ}˒}ɒ}ɒ|ɒr˒`4ʑ# No form flags #ʑ#5%ʑ# Auto complete#ʑ#a˒}ɒ|˒|aɒɒ ɒ}ɒ|! ʑ# Form Control Mode #ʑ#˒}˒|˒fH Command> ##*?AMHPEIQRFSLCDOWG=#˒ɒ ʑ#2ɒs˒yɒt˒x˒ɒsɒt!ɒ˒˒ˑ82 Room for #ɑ $ entries.#tɒɒGˑ=ɒˑ<2W*Qo  "$&(*~.246:<>@BDFHJLNx] <ɑ;ˑ; ʓ*ˑ;"ɑ;O.ʓ*""& ʓ*ʓ*Fɒʓ*ɒɒ4˒ʑ# Auto aborted #ʑ#ɒ?ʓ*/ʑ# ? too long! #ʑ#ʒʒ  ? computing..#ʓ*dʓ*cʓ*cbc``ʓ*`ɐ'`% =#``)ʓ*# ʓ*# Z ɒk&ɑ;&Rˑ;ʑ#' data entered does not match cell type #ʑ# 2ɒɒ&&`ɒɒ&& 2ɑ;ʓ*/ʓ*bʓ*˒ʒʓ*ɒR:ɒL-ɒC ɒPʓ*/PAGE# ɒ=˒ʓ*&  2&&aʓ*Uʓ*#ʓ*#` &)ʓ*#&(&ɐ' &`ʓ*q&&`&!ʓ*! ʓNʓ*#9` &)&&ʓ*&ɐ'ʓ*! &&ɒɒ%ʓN#ʓ*#ɒɒ!ɒMɒvɒuʑ#> ʑ#&ɒʑ#< ʑ#ɒɑ;&ۡ+  4ɓEL-R# T-B#ʓN#ˑ8"ʓ*Ѓʓ**ɒs˒ɒt˒ɒɒ&""&&&&&&&' &&&(#' \&&7&ʒɒʒɒʓ*ʓ*#ʓ*# X`" ˒"˒"ʓ*ɒɒɒ Gˑ<ˑ=2ɑuʓ*GɓE ɒs ɒsɒt! ɒt!ɒt ɒsɒt! ɒs! 3ɓE ɒt! ɒs!)ɑʓ* ɑ?ɒ?ɑ .ɒ;#ɒ@ ɒtɒs" ɒ^KgkOQ^L<p b  :`a`a:`.`b`ab`baL`c`a`abaa#0`P ʑ##ʑ# 2RD"" 2 READ ERROR"" Load position : ## ɒʓ? 2@ Bad offset"Є"Є`ʑ˒˒~˓E"݃"܃" 2"݃"܃L ʑ#Array bounds exceeded#ʑ# 2"݃"܃2p%"&%&%&%&% & %&%& m""aЌ4a#aa݃aaa܃aɐ':-"#(ɐ'""c bʒ"݃cʒ"݃bɑ: ɑ . #J"ǀINF˒{&File name: (make sure file is saved)#  ɒ2. "#"ȁeǁeǁe.CSDǁe"  Not found" Password: #  "  QFIMQK~ȁeƁeȀƀƀƀƀȁe"QFIMQK9ʑ# Password does not match#ʑ#2`"rȀ"qȀ"Ȁʓ?ʓ? ʑ#ʑ#ȀȀȁeƁe:Ȁǀƀʒƀǀƀʒƀƀȁe`ȀȀƀƀ@ǀƀʒƀۉǀƀʒƀۉȀƀȀ`ƀAOverwrite current column formats with Merge file formats (y/n)? #YN#˒ɒNKȁeƁe:Ȁʒƀǀƀʒƀǀƀƀȁe˒{˒ƀ˒yƀ˒xƀƀ!""0w7V|L :`a`a:`.`b`ab`baL`c`a`abaa#0`Pʑ# SAVE error: ##ʑ# 2RRɒ Saving row# $qۣ򊥣,ɑ: ʒʒ!"!"!"!"! " !"! "M&0&(# T.  File Writepp79D`Pʑ##ʑ#2R832top left corner : A1#   A1P gf Bad coord32  bottom right corner : # #  32  ed Bad coordepgpdpfp End < StartVǀFɒpɒqCannot save empty worksheetǀʓ? File name: #ʓ?#ǀ ǀ ǀǀʓ?ǀǀɒ2ǀ.ǀ#ǀȀǀǀǀ.CSDǀǀ ʑ# File exists. # Destroy old contents (y,n) ?#ʑ#YN#˒ɒY 2`Verify password to remove: #ǀǀǀլǀ`ǀݙǀQFIMQK`ǀȀƀȀǀƀǀƀƀƀȀ`ǀՙǀQFIMQK Bad password!ǀʓ?ǀǀǀǀ Password ( = none): #ǀǀNAgain: #ǀǀǀ͙!Passwords do not match!ǀǀ,ǀ`,`ɒ~`ɒ`ɑɑ `ɓE`ǀͬ P)artial or A)ll #PA#AȀƀǀǀǀǀ 2ǀ`,``` ƀ`ƀ`ƀ ǀ File CloseSaved# p~`Pʑ# # ʑ#2RDcbda`eepe)edefeee!e&eɐ!'e&! egЌgrg!gЍgcagb`$ggb`ggcaggeɐ'ea`% ')+R ɒ2>        eg Bad coord1    Bad range coordgp ep fjgpdiep(From coord (>coord) :#  To coord (>coord) :#oigigeciga`Sizes don't agreeecigNot along row/column/jhmmm& R)elative or N)o adjustment ? #RN#nɒ2nR8igcea`)%Row --> row or column --> column onlyec b'ʑ#WAIT...#ʑ#kb;jhfdji hg fedcɑ b k ˒ɒsɒt!QSd <`Pʑ# # ʑ# 2RDɑ ˑ `)`ɑ `ˑ "ɒqbɒsdbp bpabpa`ɒqɒqɒcpc`ɒsdbpbcav `ɒɒb8b)ɑ ˑ bpbpb)ɑ ˑ bɑ aqˑ `+ɒpɒp˒aɑ aˑ ɑˑɒ'`ɒɒppaɑ aˑ ɑˑn ɒ˒dcɒ 2`3`cb!bpaap abapacb ɒbpbcm ɒeeqddd d& h Ќ h  b hX hh hgcfbgaf` hga hf`h d)dɐ 'dpep 4(ɑ ˒{˒ɒsɒt! 2 pl ˒{Insert: R)ow C)olumn #RC#˒ɒCɒsDɒsd3ʒcʒcʒcʒccʒɒsʒɒs ʑ#WAIT...#ʑ#d\ɒs(ɒscɒ?` `p `a&cɒɒq a`ɒacɒs˒{˒ɒsɒt!ɒRɑ sʑ#WAIT...#ʑ#bɒt bɒb˒ɒtbɒpɒbɒt˒{˒ɒsɒt! ʑ#ɒ iiq hhhh&oЌo  oooonggemffd  F ЃF,etc.#ʑ# 2,  # Ѓ7ERROR: would delete ref(s) at # # Ѓohp ip ʑ# G9')4682z ˒{$Delete: A)ll R)ow C)olumn E)ntry #RACE#˒ɒɒ 2ɒEQɒsɒta=aɒvɒuaɒsapaa)aɒA-  2ʑʓ? ˒{˒!ɒR_ɒt  2  2ɒtʑ#WAIT...#ʑ#ɒt˒ɒsɒt!ɒs  2  2ɒsDɒsb3ʒ`ʒ`ʒ`ʒ``ɒsʑ#WAIT...#ʑ#ɒs˒{˒ɒsɒt!  ` DI  &0.\   goto > A1#  ɒ 2ɑMA1 a`!+ʑ# Bad coord #ʑ#a4ɓET-B#˓E˓EL-R#6ɒtrow, column = #.&(# ---#, #ɒs.&(# ---#&Recalculate: A)ll E)ntry #AE#˒ɒE=ɒɒ`)``& `ɒsɒt%ɒA%apa`pa Lock: R)ow C)ol B)oth #RCB#˒ɒɒɒyɒ~˒yɒsɒyɒs˒yɒxɒ˒xɒtɒxɒt˒xɒRɒBʒʒtɒCɒBʒ~ʒs˒{˒ɒsɒt!`Pʑ# # ʑ# 2RD  F)orm mode (#ۥset) #clear) #N ɒsɒt P)recision (#``E `$ʒɒs$ ) or W)idth (#ʒɒs$) or # FPW#˒ɒF3ɒsɒt` Can't create ``ۡ ɒ 2Column #ɒs ɒP Precision (0..12):# Width (3..63):# E i.` ɒsɒt` Can't create ɒPyi `Eaa Prec. must be 0..12 i `a ʒɒsaiɒvɒu`ɒs 2˒;aa?Width must be 3..63 ʒɒsa˒˒{ɒsɒt!h $$ˑ8" `UQMI EA==W6 -7) "$3(*I.024?djR^~$ ɒcB`. cqbbba`%abp`cpL3 `*`gPc. ba2cbdddcb% ɒbc\D r+     @c2-a#``p`pЍ\`p`p$6/\! ʓN /# / .8.,2  0  0"1`,2 2 23..   .2!5#cb#c)ɐ#'c .!.`ddd ۡ`ddM 9 AZd9  >f  2.9j     2I=3!     4dgd       iidiij l:d d(d(Z ";09Ra# 0 0}1..a2.bE_.-`.092g 0.09`g-g<0g;C <2*2*-0&*& 2  ""*2=[2ʓFʓJ"e =dʓJ"ʓFʓFʓFʓJD >.:52--+.!"' !34\2!.(34)2.R3.3\` ``..09.<AZ!  3a.a.AZa.a19!` ` 39AZ.1.ʑ^111112(.21}1}:dd\2ʓJcb d44?cb2cfbe22]2ʓJ2ʓJ4z10d1 b1 D1 &-<-<0 1 ^2,.1 2)2.11&0'01% $>ʓJdd  ddʓJ_2ʓFʓJ;ʓJʓF#H|k 992 j,02W^`{WTj'x88**T.08 (%1&l77 `%d 7`/0Q`/'--<0%--<0. 66(i6=-;-;0`+z 55< h.>f.=g.hfgy!     5ghf 44de .?i4:= ?:\.\44:?\2A& ,cdd%2d#d&#!""  !,ʑ# Value range #ERROR #o$-> ## k#Ѝ? ʑ# hit space [#`a #] # #˒˒d ddb a`!da# #!d)d&ɓE*+˒ɒsɒt! R$-uV h%a``a`"&ʐapʐaʐ`pʐ`b(Aɐ `<`ɐ `da`ʐapʐbpabAacC;2 T@ɐ i$ʐdpgbcʐ dbd ɐ dWʐdp hhЃhddʐdp hdhcgfgɐfɐfgːɒ`t`qaea iReiʐepeɐ iʐep ieiiʐ epap`pː xd,B`e` ʐɐ `ɐ ː ɐ ` ?ɐ 4ʑ#WAIT...#ʑ#ɐ ː @Br)`ɑ ɑ ,ɐɐːɐ  )# H'`@aabcbcaacac baa%b#baЃa aaa#&p(ɑ !ɑ ` `ɑ ɑ pˑ ɑ ˑ ɑ ɑ<ɑ 4ɑ `ɑˑ `ɑ ɑ pˑ ɑ ˑɑ ˑ ɑ ɑN`Ќo k' " &ʓ< ʓ<# i  a#`p``p`pЊ`p& 0 d 2!R(@Ќ5 ? x  ʑ'ɑ7ɑ4ɑ6aɑ3ɑ5`Kaɑ6`ɑ5ɑ7o-ɑ4na 0a ɑ3n` 0` n#@aP"2a`ʑ ʑ#/` Oa# Pa#a`RZ"`Yʑ ʑ#!b a1ʑ  ʑ# `/O xʓ? [ #] 0`pa`pz ``paA dg0de0de9f2f deЃ0ef > Ndd  ˒" verify Y/N - #YN#˒ɒY6  ˑdJHd ˑ= ˑ7 ˑ1 ˑ+$  "/dɑdʑdʑЈdɑˑRdɑˑEdɑˑ8dɑˑ+dɑˑdɑˑdɑˑˑd ``Cɑ ɑɑ 5   ˑ 2PDɑ ɒ  gekk kp gk˒k'd2jD kCjkk ggek˒kqnhfnnph nYd2k oDoknonnnnnnnnh hfnN}`Pa 0``QPa a/T B` Pa`Aa`Aa.bP`a `a--aa-`a--T8`ʓ<ʓ< ʓ<  ʓ<#: `ɒtɒsʓ< ʓ<#(@  `/ j`j0jۃ`j0jۃjiabi*`0i> `iaa .`Piiia?i 0`Pj0.`Pa``ax`0`aa .`Pi  i 0i 0i-``PeQTP -`PRl ~a2bʒa db`#Ib&bI(I˒wId(b`(#ɒw `#*ɒwd`I#dɒwdId(`(#ɒwd `(# dɒw`I#`#bɒwd `(#Adɒwe e`#`I#dɒwee e`#^b ?n?d(b 5b(e(eee(e(d(Gb b ʒabdc((d !n!d((d(`(# xɒ{a˒˒zɒdɒ~g˒zab˒bʒdۃPdf\ɒ˒dɒ~ | * d ʒd  #bʒdۃdɒz˒zfɒɒz˒| bɒ"ɒ˒ɒ**dɒg`` cɒdd     ? #dɒ | * ɒTɒq eaɒzh5eɒea hebʒeۃhp eɒp˒bcɒ"dc* pRE˒zɒʒɒyɒzۃPɒzɒy#ʒɒyɒzۃɒz˒zL ^Fa`˒bɒ`bɒ`p˒%`bɒxɒɒ`pɒɒ`p˒ɒcɒ~4aceaapʒdۃdapɒ˒Ycɒycɒyɒz˒ɒBaɒɒyceaapʒdۃdapʒcۃP˒*: G`a`a!2a`Gɒɒɒ1ɒvʒɒsۃɒu ɒvɒu ɒɒ`˒x`ɒt`ɒɒ˒xFaɒyɒza˒yɒyɒ~ɒ~˒ye9Faɒyɒyɒ~ ɒy˒yaɒyɒz ɒy˒yɒxɒɒ˒xɒyɒ~ɒ~˒yɒyɒxEa˒s`˒ta`ʒvʒuGɒLɒɒvʒɒsۃɒuʑ#< ɒvɒu> ʑ#"CURSOR OFF SCREEN#˒˒˒ !dP//00//ɒ0/1V >#ǁCONǁCONSOLE:`ȁ%Ɓ%>ʑ>ac ǁcc$2abȁ%ǁSH$ˑ ˑ ʑɑˑ @ ɑˑ@ ˑaʒ` ʒ``˓E˒y˒x˒s˒t˒˒~˒˒˒ʒɒCˑː ː pedde Iɒɒɑɒxa``˒x˒xɒx˒tɒxaI˒xɒx˒tɒyɒzI˒yɒy˒sqɒySɒy˒yPɒʒɒyۄɒy`ʒɒyۄ`ʒɒyۄɒy˒yɒy˒s o˒ɒsɒt! ` Hɑ4HOɒsɒt!Cɒsɒt!7ɒsɒt!+ɒsɒt! 7-% KMOQ` ɒG@cPacЃcbd )ca"dɒd ccccdMASKF *ȑȑ8ȑ={Ƒ= Ƒ8Kfȑ=Ƒ<4Ƒ9OJD>9Ƒ< 1Ƒ< )CS #:6U MǑǑ>ʏF&bz  l$v%&"'J'(r  6)*&*N**v**T(++V RZH @p8nz`pvTKKF *ȑȑ8ȑ={Ƒ= Ƒ8Kfȑ=Ƒ<4Ƒ9OJD>9Ƒ< 1Ƒ< )CS #:6U MǑǑ>ʏF&bz  l$v%&"'J'(r  6)*&*N**v**T*Y!\ |\F%CÚ LH SR UJ BP PL MT, MB2 HM8 FM> CWD PCU POL PAj CPd PNu OPo HE FO !J;>w͔ n!f;> !K; Ô !O;# !W;# !S;\ѷ-!>N d!\ |p! |* Not enough memory $CSDUMP OVR CSDUMP.OVRw#|w 20/00/5500:01%Comp 4.02 CSDUMP,, REALTOSTb@  / j`j0jۃ`j0jۃj`iabi*`0i> `iaa .`Piiia?i 0`Pj0.`Pa``ax`0`aa .`Pi  i 0i 0i-``PeQTP -`PVl #R` Pa`Aa`Aa.`ʀʀ ʀʀ#*`P++Ќ@++ ++$++++JTZSd'c c`   `d cbcdcabc `b- a * `b+`a `a`a a5B  Password: #  V     ! not ok#2N& ǀINF'CalcStar file name ( to quit): #,  ȁ$ǁ$ǁ$.CSDǁ$ 8** # # not found on disk#  Comments ? #ʀ(B$Output file ( for printer): #ʀʀ=ʀ>3CSDUMP cannot create > files#ʀʀDISPLAYʀdisplayʀconsole:(ʀʀPRINTER:(ʀʀ:.ʀ#ʀȁ$ǁ$ʀ(ǁ$.DMP,ǁ$(ʀ CalcStar File # # - #ʀ#ʀЃ Ѓ FILE READ ERROR#2 Position #$ Width #$ Type:#ȁ$Ɓ$ F #  #Ɓ$ Text (#Ɓ$pRight justified): #cLeft justified) : #GCentered) : #+Repeating) : #w]C)Ɓ$Ɓ$#RʀƁ$#ʀƁ$ˀƁ$ʀɀʀɀʀ#ʀ# Numeric: #Ɓ$  = #Ɓ$ ?n? (error)#fƁ$ SƁ$Ȁƀƀ ƀȀƀȀƀ" #" Ɓ$  N ?.?N t0a `5Copyright(c) 1981, 1984, MicroPro International Corp.#! All rights reserved.#:#:#:#:#:#:#:#:## ǀPRINT CalcStar Dump vr_#1.45 #r Z`V  h , L  -Cursor Movement- | -Commands- ; followed by | -Misc- Right |A Auto F Format M Merge R Recalc * Extend |@ Curs Pos ^S Left ^D Right |C Copy H Help O Order S Save = Lock |? Evaluate ^E Up ^X Down |D Delete I Insert P Print W What ? Space |^ Data Togl ^Z Col A next row |E Edge L Load Q Quit G or Goto |Cancel Col> Row+-------------------------------------------------------------------------- +-------------------------------------------------------------------------- cursor: current: current|| type: data || contents: edit:Col> Row+-------------------------------------------------------------------------- +-------------------------------------------------------------------------- cursor: current: current|| type: data || contents: edit: ---- Help page 1 ---- hit to continue ________________Main entry mode_____________________________________________ Cursor is controlled with keys E, D, X, and S with the key held down. Direction is up, right, down, and left in that order. (Control Diamond) moves the cursor right if no data has just been typed. Z moves the cursor to the next row, first column. Data entry: digits 0-9, +, - signal numeric entry. alphabetic characters or blank signal text entry. /, followed by R, C, or L justifies text right, centered or left. ^ is used to switch between text and numeric if needed. /= duplicates entry across column. /P causes page break for print. ! sets special entry mode for arithmetic modification of input. Equations may contain numeric data, cell references, and functions. four-function arithmetic (+,-,*,/) may be used with any of these. @ refers to current cell location. Type one character and then move cursor to collect cell references without typing them. ! following a cell reference holds ref constant in relative copy. functions include: sum, avg, cnt, abs, exp, log, ln, min, max, regr, slope, proj, depd, sqrt.  ---- Help page 2 ----- Hit to continue ________________Extended commands_______________________________________ these commands are accessed by hitting the ';' key Auto enter Automatic entry mode. will abort. Copy Copy a (range) entry to another (range) entry Delete Delete a row, column, entry or the whole array Edge set the window top left corner to the cursor position Format change column size or precision under cursor Goto move cursor to a specific column and row Help display this information Insert Insert a row or column into the array Load Load a file into the array Merge overlay file onto array Order Change the evaluation (column/row) order of the array Print Print a report Quit exit the report generator Recalculate recompute entry at cursor or whole array in current order Save Save the array to a file What if text, prints 1st column & row entries of cursor position ? print approximate storage space in terms of entries = lock column A and row 1 onto display * Switch between 10 (with menu) and 15 row screen display PvNTv ݴ3򖸅R֋3p=PvNTv ݴ3򖸅R֋3p=5 Item.............................. ( ruck07:Il++"7"7="7+"75(Initial Value ($)...........3#* 02000*:c5£=*HL&bj <6Depreciation Rate (%).............. 007*H-3#"7"7Q"6(Year Acquired....................in 0981HͿ-=|!]=6:Residual Value ($).........~<" 0500O ~ + -!<=0:" ":++ 111  + -!<=0:" ":+ -2224~ > +-!<=0:" ":++1111%" >v +-!<=0:" ":+!%11!7 > +-!<=0:" ":++111  +-!<=0:" ":+-2224~ X? +-!<=0:" ":++1111%" ?v +-!<=0:" ":+!%11!7 ? +-!<=0:" ":++111  +-!<=0:" ":+-2224~ $@ +-!<=0:" ":++1111%" L@v +-!<=0:" ":+!%11!7 t@ +-!<=0:" ":++111  +-!<=0:" ":+-2224~ @ +-!<=0:" ":++1111%" Av +-!<=0:" ":+!%11!7 @A +-!<=0:" ":++111  +-!<=0:" ":+-2224~ A +-!<=0:" ":++1111%" Av +-!<=0:" ":+!%11!7  B +-!<=0:" ":++111  +-!<=0:" ":+-2224~ +-!<=0:" ":++111  +-!<=0:" ":+-2224~ A +-!<=0:" ":++1111%" Av +-!<=0:" ":+!%11!XKAYPRO ComputerM-3AC0B0$= y l:d d(d(Z ";09Ra# 0 0pCS OV2 CS OVRn    CSDUMP COMCSDUMP OVRCSMASK MSK4DEMO CSDTERMCAP $$$STORE 0 TO OK DO WHILE OK = 0 IF '&PROMPT' # ' ' ACCEPT '&PROMPT' TO COMMAND ELSE ACCEPT TO COMMAND ENDIF STORE !(COMMAND) TO COMMAND IF COMMAND = 'QUIT' QUIT ENDIF IF LESSON = '1' IF COMMAND # CHECK ?"You didn't enter:" ?" &CHECK" ?"Please try again." LOOP ELSE STORE 1 TO OK SET TALK ON &COMMAND SET TALK OFF LOOP ENDIF ENDIF IF COMMAND # CHECK ? ?"You didn't enter:" ?" &CHECK" ?"If you would like to try to correct the statement, enter Y when" ?"prompted. Otherwise, enter N, and then re-enter the entire command." DO TEACHC ENDIF IF COMMAND # CHECK ?"Please enter:" ?" &CHECK " LOOP ELSE STORE 1 TO OK SET TALK ON &COMMAND SET TALK OFF ENDIF ENDDO STORE ' ' TO PROMPT RETURN ?"You didn't enter &CHECK.. Please try again." LOOP "If you would like to try to correct the statement, enter Y when" ?"prompted. Otherwise, enter N, and then re-enter the entire command." DO TEACHC ENDIF IF COMMAND # CHECK ?"I'm afraid that's still not right. Please enter:" ?" &CHECK" LOOP ELSE STORE 1 TO OK SET TALK ON &COMMAND SET TALK OFF ENDIF ENDDO STORE ' ' TO PROMPT STORE 0 TO OK DO WHILE OK = 0 IF '&PROMPT' # ' ' ACCEPT '&PROMPT' TO COMMAND ELSE ACCEPT TO COMMAND ENDIF STORE !(COMMAND) TO COMMAND IF COMMAND = 'QUIT' QUIT ENDIF IF LESSON = '1' IF COMMAND # CHECK ?"You didn't enter:" ?" &CHECK" ?"Please try again." LOOP ELSE STORE 1 TO OK LOOP ENDIF ENDIF IF COMMAND # CHECK ? ?"You didn't enter:" ?" &CHECK" ?"If you would like to try to correct the statement, enter Y when" ?"prompted. Otherwise, enter N, and then re-enter the entire command." DO TEACHC ENDIF IF COMMAND # CHECK ?"Please enter:" ?" &CHECK " LOOP ELSE STORE 1 TO OK ENDIF ENDDO STORE ' ' TO PROMPT RETURN didn't enter &CHECK.. Please try a STORE 0 TO OK DO WHILE OK = 0 IF '&PROMPT' # ' ' ACCEPT '&PROMPT' TO COMMAND ELSE ACCEPT TO COMMAND ENDIF STORE !(COMMAND) TO COMMAND IF COMMAND = 'QUIT' QUIT ENDIF IF COMMAND # CHECK DO CLEAR@ ?"You didn't enter" ?" &CHECK" ?"Please try again." LOOP ELSE STORE 1 TO OK &COMMAND ENDIF ENDDO STORE ' ' TO PROMPT RETURN  ENDIF IF !(COMMAND) # CHECK DO CLEAR@ ?"You didn't enter" ?" &CHECK" ?"Please try again." LOOP ELSE STORE 1 TO OK &COMMAN@ 12,0 @ 13,0 @ 14,0 @ 15,0 @ 16,0 @ 17,0 @ 18,0 @ 19,0 @ 20,0 @ 21,0 @ 22,0 @ 11,0 RETURN XNAMEClADDRESSClWPHONEC mHPHONEC mPHPREFC'm ALBERT EINSTEIN LITTLE TOWN USA (201)555-1212(201)555-1313W ROBERT REDFORD LOS ANGELES CA. (213)555-0565(213)555-1000H KILGORE TROUT NOWHERE (312)555-0000(312)555-9999W BOB HOPE TOLUCA LAKE CA. (213)555-7777(213)555-8888H RONALD REAGAN WASHINGTON DC (212)555-5000CLASSIFIED Ho use a file called CLIENT, which" ?"contains client names anREMARK * USE CLIENT FILE REMARK USE CLIENT USE CLIENT WAIT ERASE REMARK * BEGIN THE DO LOOP TO READ THE CLIENT FILE UNTIL AN REMARK * END-OF-FILE CONDITION OCCURS REMARK DO WHILE .NOT. EOF DO WHILE .NOT. EOF REMARK * EXECUTE THE IF STATEMENT WHICH ANALYZES THE PHPREF REMARK * FIELD OF THE CURRENT RECORD TO SEE WHICH PHONE NUMBER REMARK * IS TO BE USED TO CONTACT THE CLIENT REMARK IF PHPREF = 'W' IF PHPREF = 'W' REMARK * IF IT'S THE WORK PHONE, STORE 'WPHONE' (WHICH IS THE REMARK * FIELD NAME ON THE CLIENT FILE FOR WORK PHONE) TO THE REMARK * MEMORY VARIABLE PREF REMARK STORE 'WPHONE' TO PREF STORE 'WPHONE' TO PREF ELSE REMARK ELSE REMARK * IF IT'S THE HOME PHONE, STORE 'HPHONE' (WHICH IS THE REMARK * FIELD NAME ON THE CLIENT FILE FOR HOME PHONE) TO THE REMARK * MEMORY VARIABLE PREF REMARK STORE HPHONE TO PREF STORE 'HPHONE' TO PREF ENDIF REMARK * DISPLAY THE CLIENT NAME AND PREFERRED TELEPHONE NUMBER, REMARK * SUBSTITUTING PREF (WHICH CONTAINS EITHER 'WPHONE' OR REMARK * 'HPHONE' DEPENDING ON THE IF STATEMENT ABOVE), AND DON'T REMARK * DISPLAY THE RECORD NUMBER (OFF PARAMETER) REMARK DISP NAME,&PREF OFF DISP NAME,&PREF OFF REMARK * SKIP TO THE NEXT RECORD REMARK SKIP SKIP WAIT ERASE REMARK * SEE IF THE DO LOOP SHOULD BE CONTINUED REMARK ENDDO ENDDO REMARK * AFTER EOF - RETURN TO CALLER - DBASE TUTOR IN THIS CASE WAIT SET ECHO OFF RETURN it is" ?"time to QUIT. Goodbye." ?"Please enter QUIT." STORE 'QUIT' TO CHECK DO CHECKC RETURN B=================================BB==BB==BB==BB==BB==BB}}BB==BB==BB==BB==B==BB=BB==BB==BB==JB==B==B==BB==B========B==BB}=B}}BB}}BB==BB}}BB}}BB==BB=======}=========}}}BB}}BB}}BB==B}}BB}=BB==BB==BB==BB==BB==BB==BB==BB=}BB==BB=}BB==BBB WASHINGTON DC LL WAIT ONE MORE TIME WAIT RETURN TAINS EITHER 'WPHONE' OR REMARK * 'HPHONE' DEPENDING ON THE IF STATEMENT ABOVE), AND DON'T REMARK * DISPLAY THE RECORD (OFF PARAMETER) REMARK DISP NAME,&PREF OFF DISP NAME,&PREF OFF REMARK * SKIP TO THE NEXT RECORD REMARK SKIP SKIP WAIT ERASE REMARK * SEE IF THE DO LOOP SHOULD BE CONTINUED REMARK ENDDO ENDDO REMARK * AFTER EOF - RETURN TO CALLER - DBASE TUTOR IN THIS CASE WAIT SET ECHO OFF RETURN it is" ?"!POSITIONC pYTDSALARYNpMONTHSALNpSALCLASSNpTAXESNpNETSALARYNp PRESIDENT 68800 2000 6 720 1280 VICE-PRES 57900 1500 4 360 1140 SEC-STATE 50875 1250 3 225 1025 JANITOR 87250 2500 1 150 2350TAXES and NET SALARY fields contain" ?"zeroes. I'm going to perform some comptations to" ?"place amounts in these fields." WAIT ERASE ?"Using the REPLACE command, I'm going to compute" ?"TAXES by multiplying the SALCLASS field by .06," ?"and then multiplying the MONTHSAL field by that" ?"product. The command to do that looks like this." ?"REPLACE ALL TAXES M=1,L=55,W=50 Y WHITE HOUSE PAYROLL LISTING Y Y N 10,POSITION POSITION TITLE 5,YTDSALARY YTD SAL Y 5,MONTHSAL MONTH SAL Y 5,SALCLASS SAL CLASS N 5,TAXES TAXES Y 5,NETSALARY NET SAL Y "called COMPUTE, which contains payroll information" ?"for some of the people in the White House." ?"This is what the structure of the file looks" ?"like." USE A:COMPUTE DISP STRU ?"I also created a report to print the file, and" ?"show some totals of the information." ?"I'll print the report for&POSITIONC pPHONECpYTDSALARYNpMONTHSALNpSALCLASSNpTAXESNpNETSALARYNp PRESIDENT 68800 2000 6 720 1280 VICE-PRES 57900 1500 4 360 1140 SEC-STATE 50875 1250 3 225 1025 JANITOR 87250 2500 1 150 2350u can DELETE files in dBASEII. The files may be dBASEII files" ?"or any other file (by using a file suffix, e.g., TXT)." ? ?"First let's make sure that the WHITEHSE file is still around." ?"Enter DISPLAY FILE" STORE 'DISPLAY FILE' TO CHECK DO CHECKC ?"Now, let's DELETE it." ?"Enter DELETE FILE WHITEHSE" STORE 'DELETE FILE WHITEHSE' TO CHECzG  =C1B1C1=7 PP &::Fx#Nͮ j! f:&E!f:&E!$f:&E!*f!0f:Vi©=§*& :O:_2 2 2% ! ͌ 6zä;:{ »:!W¢:!Xw#ʤ#N#ʸzL7zNLTNxwzNjzz_w#Z0"9zzzzz>_:% ʁ*& *# "& ʹ*! ~#"! O;: =2 72% >;*& "# "& ʹz: =h: k: _2 6zä2 * *& Z7N-:T=o%"& ʹ6zw* *& Z7ʹ6zä: E ø* "& ʹ >2 zAy z>2 : * wO;ä* : U7* " N:( 2) * Z7ByAB* ~qO&:) 2( * " wO;͖ ä: 2 k! n! !͌zî* +* Z7z6ʘz*& -"& :T=o%"& ʹ>2 : O* * yU7+" :( 2) * " * * Z7 6:* * NyA * q* 6 :) 2( * " ͖ z>2 * 6 * *& Z7H6',͖ z: _: _: •: *& * Z7•: •: _: N¸*& * Z7ʸ: ¸* 6: 2 z: z>@_: z>_: _: z: 0_: z: _͐: G: x: 2 ̓7"+ y7" xG:' 2' yO:& =2& ʹZ Ð͛!"& !Ѣ" !Ҥ" 2 2 2 ô*& ,"& :T=$."& * #" * | :( <2( U7~͸ 2* * +" * |/:( =2( U7~2͸ 2* :* ! 9O:* 9ʂ#ʂ!n_AgLxX7y 7y7?_Oy! 97y! 9yE7G*+  N##y7yʽ~µF÷T;͇5* |͸*+  p###q!" *+ N!3!#* |Nͮ #* " ʂ* w#" 9F#FAU!UXjwq~-qE7qnO~7jy!~q_wq~q> wOͮ #* 6#" ͐*& "& ʹͨ"& ʹz~Oͮ #è~#.»~ #: o&)))ѢÃ7: N; * : O.3:  *+  y7z5* | ͸ : G: O* 3* "& ʹ* Nͮ #1 : * ~_YW TW 66ͅ~| *+ |  ͮ :& l ͨ*+ |:Eʖ :bO;z*& * ~7" *+  ~͎*& - :T=o%* ~7*+ ~7* ~7" ͅ:E :cO;! 4ɯ2 " "& 2( ̓7" ̓7"+ y7" *+  ~O2 #~- <2 #̓7yv u v ͇5* |] ͸x2 y2 f : G2 O!" " 3À #" 2 " ʹ* |ʏ ~Ò ͸ 2* : 2 * "! * "# >2% ;: N >9L>X:E;DELETED INSERT TFYNtfyn.+- #9AXL!ѢҤ"!m"!m"Y:K !m"*~#"6 L7&/;DMY$0<JYl5o$4:  w Tu *+":C~ !"K *N9"K #"K *Y~7"Y̓7" F#N#y7xU m xC .3*z5M *9K *x` #y9 K xz ~*wÑ ~*_Tʏ Yʏ 6Ñ 6K OG"x ~@ڸ 2è +~ ʨ + — yû yû >2 y/<2ɯ2X2*6!m"͸6N#~2#^#V#~#F#"x2:X/<͢x2XW ʋ:_:<2X*~XK 7=å̓7̓7"! N#̓7> U7~#y7O9K ̓7"i##̓7NF9x@<<< > w> ##̓7NFxYH͏*9> ##y7~K ̓7"ڶ#F#̓7N~@ڝ >U < #F#̓7~4HG> ͔7# 9> ##̓7~N6T> 6F> I5MI5EI*p#3H K I5MI5E|¸"xҸyʟ=ڢ~O#xU7*q#9 K >{ < *w# K ~wK @}2VK >z < @*2VK @ 2VK @D1VK bbbbbbON#yU7F# 9xwU7#"K ON#F#x<ڟG7ʣ#å>*wK {{{{{{O*wK O*wK ~/wK I͡5VK ,ͭ4VK N#.3VK n&ͭ4VK **,ON#F#x<ڎG7xʤ#é/< < :*(*:65#q#p#657\xW͒Q<\xJ7>1ѷ.OR.͚x͒†<͚x|7>cѷ.AND.K8K8K8¶<x¹>7.NOT.exexɱ~$>#<ex7~= >]#*>]@>]> ^> ]>c#~=[>^> #<ɯ+ڹx~+“#<+ڸxʸͼ>q-ʜ#<+ڸxʸͼ>q7xG|GyMxGɱ~+#<+'x''yO> -##<+'x''yO>7ͥڢx:~*f#<ͥڡxʡyxGOxG>:/o#<ͥڡxʡx=|GڏGyҕMx:7ͨ~+-#<>#<Y-~È~![97l͔.€<PG>z>zC>zCA>z\*ځ1p*ځ1f>z~(€͈Ҁ66$#͈7|P>%zC>&z\eځxʁp͙8<~),{>2eځxʁ<~) peځxʁ~)>#<:O>3z\*ځ1peځxʁ~)|p͙8\<~)\{^>2eځxʁf:O>4z#<>>4zC>zP> z\f>!z͈xNyCL\O+ʁ<fU6+#6#p#|C>"z>z>zC>#z\f>'z\f>(z͈ڄ1Ä͈ڄxÄ~(„#<~)„#<~,„#<77~(¥#<*ڥ~)¥#<7Ϳx.36*#z5!<7~87x#ͺ7O6+## #<7~_TYFN7>6,#w##<͢VUU#F###N>)~7*V7͢{z#N6)#~7*V7͢ڟž6)#~7*V7O+ʼ<"V¼<7>#222~+-#~0:.2: >2:=2>w: O:+Hyx:<ɯ~ J J#=.F..T.CDEFILPRSTV#@$!*INT #VAL5LEN&@BTESTmPEEKRANKSTR$!CHRDATETYPETRIM*EOF FILELOCK#LOCKNDX3(k*!g!c*0~**0*0"0|-*0#"02020r7DM*0> U79 6xJ2t0y2q02r0_!|^x2s0p!"m0#"o0$20!H$$0ʹʥͮÙ:0ͮ#z!÷կ2{0,""%#20!""z*0"0*m0"y0$:0"*w0!:q0O9*w0:q0U76#6*0#6#6>2020t$E$>20*w0>2~0!:q0O8%E%+++̓7z_t$"y0$"t$*0"|0͉$"u0:0O:0ڗ<(%DM:0<ͱ$+:0ͱ$+*9*u0!:q0O9*u0:q0U7*z~7!04:s0E$:0$*|0"0~20<g:{0%|20*y0"H$:0g:{0$|2{020ͱ$:q09:020O:020(%DM:0<ͱ$++*w0++9*o0"zH$:0O:0[20*o0"y0t$͉$*o0#"o0>20*0*0Z7*0#!:r0O9*w0:q0U7*z~7>20*o0H$*o0"m0#"o0$*0*|0r7DM*|0+T]*9#"0*m0*0~76͉$$ͮ$m$A#| Z7 &"!# $"0z!"%!:g07 "0*0*0Z7M &"J "0ͮ$:g0O8%# !$#͉$ $:0O:0ʡ y !05X Û O(%DMͮ$++:0<ͱ$++9!05t$E$!05!05E$:0X ͮ$:q0O9͉$ $ͮ$!:q0O9E$:0O:0ʳ ɷO2~0"u0#*0"0*m0"y0$:0n!>20*0*u08%E!+!%!++̓7zn!t$"y0$ !++̓7z_!t$"y0$ !t$y720*0"0!$*0 *:ڷ!#̓7z>C+++61ʩ!>N6/2f0{2g0#[0~7$0!P z!ͷ!!!:0!#, |,P ͷ>O&" "ͮ$8% "y7!#͉$ڍ"$%ҁ"͉$ڍ"$:0O:0Q":":0<20ͱ$++̓7t$"y0>20t$$*0#̓7zc"Ä"t$ͮ$y7Ö">207ɷ#͉$#$:0=20#͉$#$:0ʲ"=20*0#"ʹ$̓7t$"y0$:0<20t$:0<ͱ$++̓7z"͉$!05t$ #t$ͮ$y7#>207ɷ20ͼ<y.:0*0nͼ<y.>20*0"0#*m0"y0$t$:0w#*0#y7|R#*0###y7>20!*0"0#*m0"y0$:0<20t$:0#<ͱ$++y7|Œ#:0ͱ$y7͉$!05t$!0#ͼ<y.#20O!0~###q:0*0k0 9*0###"w0*y0"0:00ͼ< y.:0*0ͼ<y.*0~20*y0"0:00ͼ< y.*0:0w:0ͼ<y.*y0*0~7:0w#"0*0*0Z7š$7+~20+V+^"y0"0ѷ:0*w0=O:r0W yO$x$G$ $33:0!0:0ͼ<y.*0!k0 9*0:0ͼ<y.:r0U7!04:0!- O:r0_! 2%##:t0i%͔5:~0V%.3Y%͇5 2vz57:"Eu%7A:q0O8:0O:0£%:0ʟ%a/2020:0ͼ<y.20! "0~ % ~#*0~7U7"0#þ%*0}o|g~7ͼ<% y.7ͩ'ͫ(!06ͼ< y.!U0͒7:F&00͔.E&*:!?&'&F&͌&>2U0͌&>2W0e&͌&>2X0:͙8z7*:"0>2Z0Å&>2V0}:Y0'=2Y0"0:U0ʥ&&:W0ʲ&*0&:X0&*0|&*0Z7 'T]' |'!&:V0&:Z0&*0|<9-!"0>3y.>~y.> y./E:0ͼ<y.:020:020:0ͼ<y.0ͼ<L'77c'c'v'~h' P'=:020:0!0U7y7:020w:020!00ͼ< y.:V0':Z0'=!}- !}- =7"0"0||-Ø,!0͒70:ʛ(#~:(+~7ڛ(͠(:͠(:9ʛ( ʛ(.ʛ( ʛ(͠(:ʆ( ʛ( ʆ(,ʆ(.h(͠(3(:ʆ( ʆ(,ʆ(.S(͠(:ʗ( ʗ(,ʗ(͠(m(Û(!0U797aڧ(_0~@>:#~ »(>.#~(O+G)x )(G):&1D)X)D):1D)L)D):0-):1 )P)D):&1G)\)D):&1:)\)D):1G)P)ɯ<## *1N'## *:1N'!c͒7!g͒7!g6 :0> <9"0!*: 6/E'>@R,ڷ)́'.9-*0*:> U7~2>1x*y*6A##̓7z*:>1D*D*+pJ*6#6*6#6 #̓7zJ*D*͏*[*p#+N͒7~7W*##W*͏*\*p#~7qg*6>   ;+O~7D+_# ;+~7ڢ+ #~.Š+ #_Pq+Ë+S{+Ë+M…+Ë+ +Ë+~7ҝ+E7ҝ+:¢+# Ë+yͬ6*0+"0}$+͘,: E+ʸ++&"+': E+++̀#7:)E,.$,͘,,.<&",'.<̀#.7ɯ<}N,##~N,++6#6#65!}- ~2C1570ͼ<e,20y.7"0|-x~,> ͅ6# yx,*0"0>20*0*0DM:0ͼ<ü,*0#"020< , y.>207 <9-7:0ͼ<,, y.7*0:0!090ͼ< %-y.!"0|-$^-20A#': Ez-&"'N-20!': Ez-͘,m-!0͒7*0|-+*0Z7-"0"0*0"0! "0!0-ҿ-0!0-!0-*0|­-0:0ͼ< y.> y.w# -~w# -~w+ .:0ͼ<y. .:0 *0ͼ<y.*0DM*0~^.#y7"0*0ͳ%*0++y7"0̓%́'>y.*0DM*0> ͔7 20:0*0#"0"0 . *06#*0~7:Dw#:Ew#:Ew:0ͼ<y.G92?1:2@1:2A1:2B1?1xͼ< y.*06#"00ͼ< y.!~"0*0:0w#:0w#:0w#:0w#"0*0+~/"0G*0~Z7.0+~<.0"0xͼ< y.ALLH&NEXTR&RECORD]&FOR&WHILEx&KEY C.DBF.CMD.FRM.MEM.TXT.NDX.FMT.$$$.HEX~01X|(qsX|(qsOwy!q~a1!q~2252G.~2ʩ1t1/< چ1~2qP1~ڔ1WXØ1P_i,]5z˜1i~怲w.Fq1.'w- »12.>^5.42.7>'w- 12.ƙw- 1.7~'w- 2.~w4.62!q~wD1!qq25.;5 .]5V2GD1O2.4 @2.~GO.~WIwxw2~w4!q~2q.~!32q.6@.6> 2qD1.~2 2ß2 2.~=wy.C5:q=š22y 2.C5:q=22q.C52> .C5:q=22q2:qG.N@._y怳wq2547:q2q!q ;5 G3 393.6?+X3-^36 30ʙ3ڽ3:3.6G.~4چ3ƾoxwÌ3ƾo~w.~X3.4X3.~ʰ3.4.~X3.4X3.~X3.5X3.3.~36X3.~3.wy3x=G!q~.6036-@>4/<.w>  44.~yʪ4>..F>0-4 4ê4.¯C50 -4ê4<.q/<^4Q4xڡ4O>  h4T4.~4t4.~-r4> .¯C50t4.~ʪ4O>..¯C50 4ê4>*¡47!q ;5'44d4 44>I2q4}o|g4 z!qC5!q~,,,,,-5!q~O,~%5 -5.C5.5.~怱w.w~#25ɯw,<5_~Wwz+F5ɯ_~Wwz,e5!q25q25q25!q~@6 5 / ͅ66yy>ͅ6+ 2:Í62:ͬ6::E;:Eʩ6:ͼ<v::!E/E> ͅ6> ͅ6͸6~ͅ6#66&o6&o6'77d7 77a7Å67777> Å6A[?a{?:,7:G'"[]0:?U7y7o$z{/}o|gd7 z}o|g~#fos#r#^#V#q#p#N#F#>Wxʢ7r# ×7> #ç7žʸ7# ®7 G~77# ¿7y7# 7~77_G77_8# 7x"88x2:$8y2:H$87H8xH838::O~ F8# 88H8xO~aV8_—888O~Ao8_y8#^8xڕ8~0ړ8;ڕ8Aړ8Õ8DM! ©8ß8 08:80Z78zT])))oҩ8$©87 `i);_8ͅ6> ͅ6N Y9ɷ7͸6>?ͅ68H99y'9~# 9x99~+ ,9͠9œ99ʛ9W`i9ʉ9u9G9ʚ9OT]xU79É9/ a;:CM;a;G:/D};xy;t>_Ô;O; ڊ;!C4Ô; ”;!C6O:4DyY ڭ;!C4 !C6!C4:a =ü;:4D;  2C2C:C:C2/D:/D;:4D24D2C6@:C2DC:e!:C4K>s>>>>>>m??@!DD"BD~ =͕Aʓ=%=:.D@%=͕A%=> dC y6=*BD<6@B<2C*BD!\$9*BD=:.Dt=*BD=>dC>*;D+6dC*BD~w*;D+6HCy<2C!"=D"?D2AD*BD6#";DHC?@fAҿ=> dC6@/@=>dC/@KCA>29D*C"5D;?HCA29D*C"5D;?HCA>29D*C"5D;?HCA>29D*C#"5D;?HCAz<>ͫA͔@HC!"?D"=D;@HCA29D!"5D*C!*D"C;?*=D+"=D"CHCA29DͫA͔@*;D+:_ʒ>6HC6HCA*=D}|*?D}|*BD"CKCA*CxN#F#^#V>"?D`i"=DHCixg"=Dz{gxo"?DHC:.DS?!DD"BD2C*BD~??^#VO:.D> dC?6:C<8?2C*BD"BD>!:.D=J?J?)=??%KC6@ _KC*C?@fA?> dCM!\9*C?@6@/@<ʢ?>dC]!\9MdC2-D:-D*5D|YB*5DZ7?DM*?D@*=D*'D*C:9D@nC"C*'Dr7"=D"@nC"C*'Dr7"=D͗B*5Dr7"5D?\!\6# > ͔7͒7: E2\!]w#:s@+~@2\.ʃ@ʑ@w#s@!eʑ@w#Æ@:AD@¡@:_6@*BD:_ʱ@:AD@2AD))*BD! ~7!D"+D~@A:.D@ @#y7Z7@###̓7"'D6*7D "7D~A!D"7D#####~%A5A#~:A dC!DD~:BB!DD~:B'B> dC#";D=D9!"=D"?D2AD>*=D!r7|*?D#"?D!"=D!~A#̓7y7"'DB##6#6 dC;@*'D*BD"7C2C*BD!̓7++~7B:AD@2AD>dC>dC*;D!=D9 dCx~ ʱC ʶCʷC# ÜC#>2-Dx~ # CýC>2-DDBASEOVRCOMDBASEOVRCOMDȖ4X|ė 0Tx!E~LE=5!EU7~}'̓%//E!$E~}'6̓%!D~}'6̓%2 E2%E2E͞'>!Gr<1ޙ:*Z7uHuH!G6INSUFFICIENT MEMORY IN SYSTEM, dBASE REQUIRES AT LEAST 41984 BYTES (0A400 HEX) OF MEMORY IN IN ADDITION TO THE SIZE OF THE OPERATING SYSTEM dBASE WILL OPERATE ON MOST 48K CP/M (tm) SYSTEMS THAT HAVE A STANDARD BIOS d)2c:H!*:U76>'R,H:E!EU7y'w2 E!E4Ϳ/:v <:`:I!HK6@I!VK65::I͙8{2D2FK*::͙8{2E2EK*::sI>wI͙8{2E2GK:`ʒI:EKG:FK2EKx2FK:FKII I:EKhJ:FKII I II:EK hJI:EKhJI:EKhJ:GKJI:FKI:EKhJ͸6͸6! JKJ@PR@brpf@Z@\TTT@@Ȅ@@@@@@@d\~XJE;#KJ!dK6: EhEdE͸6!uJ6IThirty days hath September April, June and November All the rest have thirty one Except February ... ERROR!J!KERRORK~@@ KE;#J##~#fo63(4/.!4% .#ERROR (DD/MM/YY) : (MM/DD/YY) :41 1 February 1984 hath September April, June and November All the rest have thirty one Except February ... ERROR!J!KERRORK~@@ !=Pad q ~!@(?ȷ:77x7:8A?<27Q(:.*(w#x:776?#:7[;7 OS:=2ya8{0 ͭ * !~#"dBASE II COPYRIGHT (C) 1983 BY ASHTON-TATE INC.10150 W. JEFFERSON CULVER CITY, CA 91204 *** dBASE II Ver 2. File is inaccessible, already open elsewhere File does not exist Unassigned file number File is currently open End of file found unexpectedly" Record out of range Too many files are open Disk is full Directory is full File already exists No find Too many memory variables Out of memory for memory variables Illegal variable name Too many characters No database file in use, enter filename:# Not a dBASE II database No room in system lock list System input/output error records added DO cancelled Bad name field Bad type field Bad decimal width field Bad width field Destroy existing file? (y/n)~ *** Unknown command Count = Enter record structure as follows:: Field Name, Type, Width, Decimal places Input data now? Macro is not a character string records copied Bad file name Command file cannot be found7 Nesting limit violation exceeded deletion(s) *** End run dBASE II *** , Too many returns encountered7 Enter record #, field (# or name), new value Illegal data type Called from Correct and retry? File has been deleted Illegal goto value2 Syntax error, re-enter Cannot insert - there are no records in database file End of file encountered End of locate scope Macro not found Pack complete records copied recall(s) Col Width, Contents Double space report? (y/n) replacement(s) Enter report form name: Enter heading: Data item not found WITH phrase not found Enter subtotals field: Subtotals in report? (y/n)& Page heading? (y/n) Enter page heading:  records sorted TO phrase not found ** Subtotal ** No expression to sum: Non-numeric expression> More than 5 fields to sum *** Syntax error *** Are totals required? (y/n) Record is locked... waiting Summary report only? (y/n)9 Index file cannot be opened Variable cannot be found Source and destination data types are different ON phrase not found *** Numeric field overflow Syntax error in format specification FIELD phrase not found Cannot open file Format file cannot be openedQ Coord: Correct and retry? (y/n) Change from: Change to: More corrections (y/n)? Enter filename: ** Total ** Record: No find Page no. Single step y:=step, n:=keyboard cmd, ESC:=cancel Waiting 7 Fld Name Type Width Dec Structure for file: = Enter options, m=left margin, l=lines/page, w=page width Enter subtotal heading: 7 Enter subtotal footing: Eject page after subtotals? (y/n) No FOR phrase Join attempted to generate more than 65,534 records No FROM phraseH Keys are not the same length Primary use databaseY Secondary use database Number of records: Database in use not indexed More than 7 index files selected4 Modify erases all records... proceed? (y/n) Enter today's date or return for none Date of last update: records indexed Record length exceeds maximum size (of 1000) *** Zero divide *** Beyond string *** Overlay cannot be opened Enter record # : Record not in index Index does not match database *** MAXIMUM RECORD LIMIT REACHED ***I Index does not match database Bad width field Destroy existing file? 1ޙ: Ej]29b: EʈG:"G:!E/E:,EhG: EEG<2Cb><;21b;>d <8: EaG:Cb<:1b;/EʈG: E/: Ef:eX9G#~ʖG/w}G͸6>.ͅ675:.::GG*G:%E H9G`K8G!:b4G9Gp`K8G::bG2%EG9GaK8G::bH2%EG=2:bG:\G:ʊH!H#~H!͒7!͒7#O+~.DH 9!k*„H ~C8J##y7N#9.:<9BJ2u H: H.:::E:I9ʴHm`K8»H,SaK8»H!.b4G:.b"I:E I9HaK8H*::.r]:r]G2EG9I,aK8I9I$aK8G2EG93I$aK8G!.b5G9zI:EzI: EdI<2Cb><;21b;ͧ:: EzI:Cb<:1b;.::IG^͔.’I*:~E73J̀)6S:L7SRGaQRNNRQ&R[TU XeXX'KGJJIN[NyNNNNNNN~OU|RRR3SRSSSYTdTlTxTTRU"U*UUU`V}VVVVWXXXXXZ[)\1\\\d\g\o\].RR>!d]>&d]> d]>8d]͢J>:ͅ65:9hJ:!E/E͸6KJͺ7wJ> >O!6+##yU76/#~765)G!- G͸6:87J:~r]#²J*:r7DM t,:`K8FT#,S*̀):``K8J>!Gr<͋,|K'͘,Ki.5/'z!͌,͏,͋,'͘,GͫK:-EʙK<2Cb><;21b;*MbDMxUKdK;/22b:r]b61#Ns#FrxbL2$by2'b>N2#bÀL2'byvLA2$b>C2#bÀL2$b>L2#b!xU76:aK8L,S87r]:xݠͺ7r]#*:!ݠU762ܠ>2/b:`K8"M,SDNO+DN"*bL>Rd],S"M`K8DN,S87r]:xAͺ7r]*:!A",bU762@:2b!- :/b!ݠ:#bNN~KM.KM#=M"Db!~_M._M#QM"Fb*Db+~M$ʨM*ʨM#ʲM9ʲM,gMʕM-ʲM gM+~$ʣM*ʣM> #wgMgM gMʻMwfM6 gM*Fb*Db~=NM#M~=N#M9MwM~=N#M9M#M60#M!ݠ~=NX N7Nw# N9*N#2NE77Nw# N6 # N!ݠ"(b>Vd]: G̀)> !Gr<:nNk*r] y7!G*E> 2EG̀)>!Gr<:ʲN`K8ʬN`K8r]ͼG>!Gr<̀)>!Gr<̀)>!Gr<>!Gr<&:`K8O*:'@'O͞':.EG>2 <G <͞'G̀)>*27b)O:.EG>+ <G&&r]:r]͋,|qO!͘&qO:7bW͵'hOqOhOr5/ͥ+qOPO`i:.E͸66!"3b!"5b`:K8¡Ò)>!Gr<*:`K8CQ`K8KQ`K8VQ̀)29b20b&!"=b:PP&&r]:PP`K8O>20b*:O}`K8P*:*=br]>29b:*E:P62#͍7x5Py0P66P6>Pp4>P6.###6#65"=b-7PPO:*EP:9bP"Db*Db~ P*=b6)#~762# ~#N###FNʥPCʜP6#6#6êPq#p#6ëPp#q#q4#6#65"=b*Db"DbdP*5b͘&G,|G͵'7QG*3b+"3b|P!"3b>e <);G͸6:0bQ,67ͅ6:9b1Q:*E1Q)DM #t,7Q!- ͥ+GPG>! Gr<*:>!Gr<*:>!Gr<:aK8&RaK8ʼQ9>'گQ:r]R,گQ:EҴQ!EU7y'w2 E!E4Ϳ/͞'G>)öQ>* ) <G>2EG:0_:0>R! Gr<>2%E2:bG2EG/28b: EG0G<;<GͳG̀)$'S:87RR:xͺ7O9y '|S: EGG9"R:.EG> <G>sd]*::̀)`:K8HS,SxS`K8WS9-Gf`K8xS$oS͋,'G̀#'G ,r]|ʟS͋,Z7=JT]' |ʤSG>3d]>~d]> !Gr<.r]:r]G>2%E2:bG̀):S>!Gr:ͅ65:9 T:!E/E͸6SNT6/#͍7++~7)KT:.E=T60#~765͸6!- G>Hd]G>4 <͸6S̀)>! Gr<> !Gr!Gr<̀)9ޙ~ʔT#ÉT!ޙ*:&&&r]9r]:Z0r]!͘&TͿ)"'E͵'Tͥ+TҺT:.EG>6 <G:.EG>7 <G:.EG>a <,6G!ޙ*:&&&r]*'E)T>!Gr<>!Gr< ,r]"Db-7r] ,r]}*Dbw#"Db-7G9UG!"=b:U?kU͸6nU:*=br]:*EŸU62#͍7xšUy•U6ÛU6ãUp4ãU6.###6#65"=b-7ʸUr]nU!- G͸6G>!Gr<20b:U`K8r]>20b: G:#E1V}' .͞'ͳ:#Ef:1V:V*V@:ͫK>*MbDM*(b!*bzV>GGy'G,|G5/:0bGͺ!G̀)&> 27b)O:.EG>; <G̀)>!Gr<96G:r]'-:r]`K8r],S'-G̀)20b,|W&!"=b!";b:ʑW`K8V*:>20bV&&r]9ʑW:O+W>d]9(W"Aba9yU7,SK8W*:*=br]N##~PWC+~PWL*Ab ~bW>Sd]*Ab61#~765"=b>29b-7ʑWڂWW\`K8V*:W:9bW!͘&W͵'WWW!- '5/:0bWͺ!%'ͥ+WҤW:.EG`i͸66>> <G>Ad]>Bd]>!Gr<>! Gr<:X`K8*X,S$X>!GrÕ]9k*HX**:-7Gr]*X:_X.G: EG}'̓%͞'/:EʨX=XʛX2E=!EU7~2 E2%EG2 E2E2%EG>- <G>!Gr<:`K8X.G`K8r]>.G:6a͔.X*:kZwGa͔. YHbK8r]G*:kZ;G:`K8YY*::D9Y}''̓%͞'2D:G>'>R,y'2D͞'GkZbY:D2EGkZ<G:`K8€Y*:<!c͒79cͺ72G\Z ,r]"EG:#EʽY}'̓%2#E͞'\ZY`K8Y`K8Y>'>R,Y>Yd]y'2#E͞'G2-EG>2-EG\Zr]~_@2 EG\Z͙8{2D*::͙8{2E*::͙8{2EG\Z ,r]}2aG\Z#9Gʹ\G:`K8r],S:`K8ʂZ`K8•]>̀):[X`K8}[ ,r]|G:C1[$Z,"Fb͚"Z"Fbz¼Z*Fb'̓[ʼZh[A#'h[,r7Z|Z'̓[Zh[9-h[$<[,"Fb&"-["Fbz[*Fb'̓[[h['̀#'%'h[,͋,Z7Y['>20h['̓[h[͘,\[:.EG>a <,6Gͥ+G: E>!Gr<r]"=b:`K8$\*:*=b#N#F:**=b6/#~7"=b"Ab9O+*:-7[r]*Ab*=b6)#~7"=bú[:.E\*Ab*=b60#~7"=b*=b65:.Eĸ6!- G>Hd]>!Gr !Gr<G> !Gr<͞' .̓%́'#:G'\>@R,\́'.9-:G`K8r],Sʹ\G>'\>@R,\y'#-7\\ ¶\>td]##z!\͞'9->d]>(d]>Qd]>d]>e <);]:!E/E:`]`K8r]*::r]k*;]** y76# T]> wͅ6> ͅ6GG <Õ]: Eʕ]>M <͸69.:r7M ]7Æ]>?ͅ6͞'2 E.::yNͧ:: E]:E28b!8b5]>0 <:8b!EU7~&ö]:]/E>[ <8/EG>\ ] ^ <8/E]1ޙ.:ÖGSTORE[?TUELSERENDDORENDIFGDOaQNOTEGLOOPRRELEASE XRETURNeXSELECTX@'KACCEPTGJAPPENDJCALL[NCANCELyNCHANGENCLEARNCOPYNCOUNTNCREATENDELETENDISPLAY~OCONTINUEUEDIT|REJECTRERASERGOTO3SGO3SHELPSIFSFINDRINDEXSINPUTSINSERTYTLISTlTLOADxTLOCATETUNLOCKd\MODIFYUPACK"UPOKE*UQUITUREADURECALL`VREINDEX}VREMARKVRENAMEVREPLACEVREPORTWRESETXXRESTOREXSAVEXSETXSKIPZSORT[SUM)\TEXT1\USEo\WAIT]CASENENDCASEROTHERWISENBROWSEINJOINdTTOTAL\\UPDATEg\ALLANDBLANKBOTTOMDOELSEENDTEXTFIELDSFILEFILESSCREENGETGETSIFINDEXMEMORYNOUPDATEOFFONPICTUREPRIMARYPRINTRECORDSAYSECONDARYSTATUSSTRUCTURETOTOPUSINGWHILEWITHENDDOENDIFCASEENDCASEOTHERWISEBELLECARRYECOLONECONFIRM EDEBUG EDELETED EECHOEEJECT+EESCAPE!EEXACT"EINTENSITY&ELINKAGE)ERAW*ESTEP,ESCREEN TALK.EALTERNATEYCALLYCONSOLEYDATEZDEFAULTZFORMATYHEADINGqYINDEXJZMARGIN:ZPRINThYdrNZqZrNCqrPOrPE.IDBASEMCOLORCONSOLEYDATEZDEFAULTZFORMATYHEADINGqYIN Number of records: Database in use not indexedGJK1OBQ:!E2Ỳ)2WY2SY2TY&:ʀG&&CX:ʀGXK8UG*:"eY'J>2WY%GYK8iG*:>2SY%GXK8CX*:>2SY2TY%G͋,"oY|ʎG'͘,ҎG:WYI!"~Y!d"xYz!:SY5I*eY*:>'>AR,Jy'2D͞'i.:TYʛH!*::D}'%ږJ"zY*zY~ ʯH ~NWH#F#̓79'H H"+HO:wH2H,ʈH,EH:ʯH2HwH:ʯHwH,EHÈH#F#̓7N9d.3*:39,ʈHy,ʈH:ʯH,}H:ʯH*zY"zYG#:D}'%ږJ͵'GږJ͞'5/͌*~Y#"~Y*oY#"oY*xY+"xY|G2XH:YHÐJ:.EG*~Y͸66> <:Y2!E!d"xYG͈S&Iz!͌*oY#"oYI'͋,'͘,J>AR,Jy'2D ,:J!ͳ%!Ң"jY!"zY~ J"GY(I"OY ~NʣI*jY6-#*GY~7*OY~765"jYI*GY ~NI*jY6)#*GY~76#61#*OY~765"jYI*jY6)#*GY~761#*OY~765"jYI*zY"zYiIi.z!*DM:D}',ږJ: J6 !Ң- ͵'JږJ͞'5/͌*~Y#"~Y*oY#"oY*xY+"xY|J2XlJ:YlJÐJ:.EJ*~Y͸66> <:Y2!E!d"xYJ:D}'̓%:.EʴJ*~Y͸66> <:Y2!E͞''͋,'͘,*oY͏,KX> <>2 EKX̓%> <>2 EKX̀)&2UY:~K&&CX:~KXK8K>W <>2 EKX>2UY*:!ݠ"~Y~7:O+EK> <>2 EKX9(\K>R <>2 EKX*~Y~7"~Y~7*::,J:/K:UY’K>W <>2 EKX!͘&͵'KKK͸6>a <,6͸6!ݠ"~Y*~Y̓7"~YzKgRKþK5/ͥ+KҘKKX̓%́'#́':L>_ <5:KXKX'KX>R,O2D:.LXK8CXðM># <>$ <͒7!"~Y!"zY*zY#"zY͸67*zY+))))"|Y:zY!gM675:9gMbk͒76 9O+~,N9N'N*|Y9~,L7ڽL_ #ïLyNN N*:! :_2YYCLNLLN>NM::͙8N{NzN{ *zY+|N!͏,a/'̓%>% <8KX>AR,.'9-i.͈SҞM'a/̓%KX*::')OR,)O.9"hY ͒7!"~Y*hY͘,ڢN~ M#*:9O+ 9 N: N9_C:NN:NL O>N:CY9*:!CY͙8O{NzN{9CY9*:!CY͙8O{*~YU7Z7!O"~Y*hY"hYM̓%*hY6 :D}'!͏, .a/'́'.9-KX>    y 2   <;X> <;X> <;X>y <;X>( <;X̀)!"qY,|KX"`Y"]Y>2XY:O2XY: fO>. <:XYKX: |O>Z <ÁO>} <5:OͼKX9 KX͙8*:͋,Z7:Q:|²O*`Y"`Y'*`Y : ʚP"vY:#EO͹TGfOGO͐PxfOxBP$P*`Y*vYͫW>fOGP͐PxfOxQPxBP$3P͚"fOòO*`Y+"`Y|fOòO$ʀP&"fOòOxnP*vYZ7$P"vYO*?Y~ BP*?Y"vYO͘,fO*`Y#"`YòO5/ͺ!9%Q,fO:,Q:P0Q͙8*:fOzfO{!fO+))))~fO fO"]YQ9O+fO9("]YfO*:9%Q:ͭ7r7M9*]YRfO1Q*]YgRKXfO5/fO> 2QY*:LQXK8CX>2RY*:LQ$G,:QYŒQ#"Y"~Yn,)DM,R*Yn,:RYʹQi.5/Q)Y!9͈SKX)!Y99,*Y#"Yn,5/Q͋,#͏,'9-*~Y'KX>5 <9-KX ~NJR#y=^RN#y7T]> ͔79.3#F#̓7N3> <7"cY V#~2bY#y7"lYzCʣRMS!X65:|SO9*cYRڃRvS!͒72_Y:bYG 9!"lYMS!X6! 6%S:qSS!$Y6! 6!<9ڀS>2_YR!͒7!$Y6! 6%S>2_YR:_Y|S:bYGCSw#4SvS6 #CSvS*cY͸66>:ͅ67*lY:bY_~ͅ6#eS7>ɯ> 2nY2gY"vY:#ES͹T>TҵT5/,#*vYͫW:nYTGO:gY2gYx>Tx"T*vYZ7>T"vY>2nYSx>T*?Y~ >T*?Y"vY>2nYS:gYLT5/7͸6! Y6,#6͸6*sY͸6 t,>:ͅ675:O9ʊS“TxʵTÞT*sYReT*sY"sY~ hT5/7}' .ͳ:#Ef:T:@T:T>*YDM*IY!KYzT͞'ɯ2VY2ZY:-EU: U!"KY!"MY:$)U:,./U ,CX}2Y-7ڞW:$PU: .VU ,CX}2Y22!"IY:YK8 V*:>2ZY:CXX61#Ns#FrxʨU2Xy2X>N2XU2XyʼUA2X>C2XU2X>L2X!xU76:.YK8 V*::87CX:xݠͺ7CX#*:!ݠU762ܠ>2VY:XK8|V*::ʞWO+ʞW"KY>V>R <>2 EKX*::|VYK8žW*::87CX:xAͺ7CX*:!A"MYU762@:ZY!- :VY!ݠ:XN_W~ʥV.ʥV#×V"zY!~ʹV.ʹV#ëV"~Y*zY+~W$W*W# W9 W,VV- W V+~$V*V> #wVV VWwV6 V*~Y*zY~ʗWFW#FW~ʗW#AW9,Ww+W~ʗW#YW9YW#FW60#FW!ݠ~ʗWXzWʑWw#eW9ʄW#ŒWE7ڑWw#eW6 #eW!ݠ"IY>V <>2 EKX"?Yͳ!Y66!"[Y*?Y N! :T_ r7Wy2uY*[YO:U!4Y > ͔7*?Y4Y~X#W4Y*[YDM!?Yz*[Y:uYg"[Y*?Y"?Y~ W>2!E:>2 EKX>2 EKXͼ>!Gr 0.*9͘.Ͱ+1 -;,'PICTURERECORD SAYSDFRECORD # TO USINGº0ͤ6++":9&i".9.> 0.*9͘.Ͱ+1 -;,G2LîM PûPÏQéRSêStT&2W2W2W2W2W2W9!",W:UH&&U:UHgVK8vG"W*:'L>2WFGVK8G>2W*:!6 ".W:O+G>$L9(ʭG>R$L*.W9!6 ".W*,W6-#~7~765",W*::,FG:ÏG]VK8H>2W*::VK8FG>2W*:FGVK8#H>2W*:FGUK8U>2W2W*::{VK8FG*::U2 W:FG:W"L*W*::WmHoH>'>R,y'2D:W´H!6#w#w#+++++9:WVK &/:WK͞'!ͳ%!͘&!".WK!d"*W,|K͵'JKKJK*.W#".W**W+"*W|I:.EI*.W͸66>' ͔7!- +J!"'W!"2W*'W~5 J#̓7##"'W ~NʿI#F#̓7*2Wy}I6,#: W,ʇIw# 9xU7+~ ›II#: W,ʬIw#"2W J+~ ¸I+­I#"2W J#F#̓7*2WyI6,#: W,I 9xU7"2W J~# IJII"2W J60#"2W OI*2W6 #6 #r7DM:D&JK:WFJ*DM:D}'&/͞'JK:WgJ*6 #6 :D*DM&JK!"2W",W*,W~ 3K ~NJ#F#̓7*2WyʙJ6,#: W,ʣJw# 9xU7+~ ·J¬J#: W,Jw#"2W%K+~ J+J#"2W%K#F#̓7*2WyJ6,#: W,K 9xU7"2W%K~# KKKK"2W%K60#"2W*,W",W uJ*2W6 #6 #r7DM:D&ͥ+KHK!VA9 &/""W!".W*"W~ K>  ~K> #‰K#~#~U###~U*"W""W&/*.W#".WwK:.EK*.W͸66>' <:D}'':WK:WL:WL .*.W!6#~7&/̓%2D͞'U>($L>H <͞'>2 EÙ)&!"'W>A2V21W20W2W24W!4W",W:&&U:@MgVK8L:0W<20WҩM*'WU>2W"'W#͍7xʤM!V4*! y7͒7*'W6)#~76#6/#~765"'W*,W60#~765",W9@M,VL:VL*:>21W!4W",W:@Mk*L**,W~ʟM#̓7",Wbk ͒7:O+9~7(M_# M*::,VL:L:WʟM!͘&nM͵'eMnMeM!- ͥ+nMPM:.E~M!4W͸6- >A2V:1WU!4W~5U#̓7*ÍM>J$L>K$L>L$L: E2\2W:vNZVK8M*::U_@2\::¸M:øM)VK8U*::U!V>  ͔7V9nN nN.=N*-Na$N_: N6?#.N:.nN:VnN nN*cNaZN_:EN6?#dN:>2WøM͸6:W›N!.V6!V] 9ͰN͸6U!V] 9ͰN͸6U!hW"fW6 \ON!UV6*fW:WN 9 "fW6 ON!hW"fW͸6*fW~ :W¶O]9"fW2h!]t,7t,72|\O\Oog676>/ͅ66>/ͅ66͸6:_N\N> <͸6:_N\N!jV6͸6Nt,>.ͅ6t,"fWO77N͸6NO\O7(ͅ6 ~ͅ6>)ͅ67~NfP#~2W\P<2!W2WwP#~2W###~2W>2!W! W- :!W*%WU7#"%W~ P͸6>` <7:$W6!U6*%W6!V6U2W2W:P$VK8P*:>'>2W>R,P>XUUK8U*:>2WP:WU:WQd)4W,چQ! ~7QEQ#Ny<2)WMQ#F###N>2)WMQ>2)W!4Wk*[Q**"W:)WOhW,*W ̓7:)WO!hW9Q̓%͞'U2W2W2W:RgVK8Q*:>'ڤR>R,ڤRy'2D""W>2WÙQUK8UQ)VK8QQ".W>2WR*::U VK8UQ",W>2W: RRÙQ:WʟR*"W~R:W?R*.WIUR*"W:WSR*,WIUR&/! F#N#̓7xsRxR zRzR&/*"W""W~ &R'̓%2D͞'U>HU>(U2W9)VK8R>2W9 VK8U*::U",W""W*"W~S*,W:WRIUSRIUS**"W""W~ RU&2W&&U:VSgVK8U*::U*".W>2W:VS HSS͋,|}S!͘&}S͵'tS}Sͥ+}SjS:.EʎS>" <`i6:WU`iͭ4*.W ̓7z5U>g <͞'y'&>r <͋,6>w <+++++6>/ͅ66>/ͅ66.S>p q <>f <~ ZT ͸6y67 t,7 ~ͅ67#~67###F~7xOT67T͸6>` <777)6U:>'>R,T2D:D%TT}2 WTT"WT}*Ww#"W! W5­TÇT̓%2D͞'U>XU!GT_0T O))))  T͞'>2 EU <>2 E>!Gr<&od6U 6U6U/}o|g9U zpU pU*rU?kU7gU_rU#KU~TTT@@Ȅ@@@PR@brpb@@@@@@@d\,ADDITIVEALLDELIMITED VARIABLES USED BYTES USEDEXCEPTEXTENDEDFIELDSFROMLIKEDATABASE FILES # RCDS LAST UPDATENoneONSTRUCTURETOFILE UNAVAILABLEWITHFIELD:NAMEC FIELD:TYPEC FIELD:LENN FIELD:DECN A::::::::ASDF ????????DBF$$$ SUB')#6.+5:TYPEC FIELD:LENN FIELD:DECN A::::::::ASDF ????????DBF$$$ SUB#ŒWE7ڑWw#eW6 #eW!ݠ"IY>V <>2 EKX"?Yͳ!Y66!"[Y*?Y N! :T_ r7Wy2uY*[YO:U!4Y > ͔7*?Y4Y~ GûG H:I2I2I:ʈGIK8^G*::"IIyeBG>)I9~KG+"I#~O#F>2IGIK8I#*::>'ҀG>( <,I>2IG:I>T)I:I>H)I>R,y'#*I*Iy''͞'͹H1I$1I$"I*I~G2I#:.EG͸6!I6:I&#p͹H*I#"IG##z!1Ì)!"I"I͋,!d"I!͏,*In,͘,|H*I#"I%H*In,5/*I*I#"I:.E%H*I+"I|%H͸6*I+6>: 9 <*I+"I͏,:.EʰH*I6>: <$1IûG!'Iz!!"I!d"Iͷ*I#"I*I+"I|I:.EI*I͸66>x x <͞'>2 E1I <>2 E>!Gr2eS2hS>92dS>P2oS<2kS2lS&:ʟG&&O:ʟGDPK8eG*:>'>2`S:GUPK8‹G*::OOPK8O*:>2lS:GIPK8O*:>2\S:G:`S¾G>? <5:9ʹOʹO>'>2[S>R,G>R,2[Sy'2$E2vS:[SG>h E 2vS:[S’H>F ʶHûH:>ûH:>@2cSͺ7ʆH2VO͜O!VyU762#q#:cSw#:hSG:oSw#p#652_S:[SH>= 2_S͜O2S:[S I>N 2S!9P*"iS2sS͜O:SXJ:[SXI>D 2rS͜O:rSXJ:[S€I>C 4 <{I͜O:[SªI>P 2yS͜O2zS:[SI>k 2zS͜O:[SI>i >7J.[9< J>(J-J:>-J:>@2cSͺ7IO2-[͜O!.[yU762#q#:cSw#q#:hSw#65:[SdJ>< 2xS:[SœJ͸6:xS67dO:L͙8{2wS*:~,O:*]SO:O:ySJ62#N#FxJw#:wSw#:hSw#65"]SJ"]S#͍7͜O:[S K>@ <*aS6+#"aSdO K1K*aS> 2cS>^K*aS#9OKTK:>TK:>@2cSͺ7JO͜O*aSqyU7#62#q#:cSw#:wSw#:hSw#65"aSxʸL:SʸL:[SK>N c <*fS#"fS67!c6ͨO:DM6>/ͅ6:E6>/ͅ6:E6͸6ͨO:vSM!V- ͸6ͨO!W- ͨO:rS+NͨO>*ͅ67!,[- !?U- rN:ZS™M;O:dSڙM͵'rNN:yS̨O!\- :hN>2O:_SrNͨOͥ+NNrN͵'rNN:rS+N! U- +N/O:ZS+N;O:dSڙM͸6ͨO>*ͅ67!,[- !?U- +N/O:S O:LT5 OͨO>` <ͨO!LT- !9Pk*N*!9P5~AN6A͸6:kS<ùO:[S%O>4 <ÉJ>V <>O:rS:qU5MOͨO>I <ͨO!qU- !S- :zS`O>2ZS͸6:[SƒO5:9:$E}'̓%͞'ùO:$Ef:9w:ŒO.:9:[S:$Eͭ:͸6:eSOy7 ïO>!Gr<>2 E:$E}'̓%͞'ùOTTT@@Ȅ@@@PR@brpb@@@@@@@d\,A::::::::AFORMPLAINPRINTTOZP=2 7*#7~#['{ (t['t t[ )t :[7"(>[~Œw#[~({ /t[/t ͨ [~$w#[27!"7[27:7[ ©(ͨ ͸[¯(~w[tã(w͌[8~w#w[" 7(x[27* 7"7̈́[":8ä\(x†* 7\Œ~@ \#*7s#r\D:+9*:\!64~=)!\W)!7~W)!$\8~# y)*\y) y)0\!8p"7ͩ6\G"K9z ڵ)<\w#~@*~B\^#VͩÎH\ ͩ *N\c*#7"T\!"7"7Z\!8>ͥ5`\+!8>ͥf\+*6|)*l\9<282r\!*/+!*/x\d*>,D:~\JC:9<\28!*/+\r*̓\*8|ʊ*\*ͩ\ʡ*>D7D\No Fatal\r(s) Warni\:7Gͩ\!28!*/+\r*̓\*8|ʎS>" <`i6:WU`iͭ4*.W ̓7z5U>g <͞'y'&>r <͋,6>w <+++++6>/ͅ66>/ͅ66.S>p q <>f:PK8GnPK84P*:TJ>u <8,P,P̀)!S > ͔7!5S w @G9!"Q!Q"Q!"Q*Q~ ʪG*Q y7 ~ʁG#{G~P###~P*Q"Q*Q"QdG!Q"Qͳ!"Q vP!Qz*Q"Q!"P*PDM*Q"Q!Qz*Q"Q~ H*P$"P:U=G:PG>x2PGjH,PH:P_:P!S8H=3H"P!$Vr7|YHDM ͔7+6ðGx I2PxʥH*Q"QQZ7ښH!Q"Q2PðG:P2PðG*Q"QRZ7һH I:P2PðG:P_:P!SH=H"P!$Vr7|HDM*P!9!$V> ͔7+6ðG!͒7!"P!"Q!Q"Q*Q~ J y7*::I*Q9O+~ ,J9~ iI7bI_ #TIy,J ,J*:! :_CʝINʝIL4J>I::͙8DJ{DJzDJ{*::I͙8    y _ <5:,P>'M>AR,҇J!P6>2PÍJy'2PPO>R,y'2Q:E2P2E:T=2 Q:T@J:U=2Q: Q=2 Q!(Q: Qw#~7!,Q6 #6 #"P"P"P"P#"P2Q*P!cr7DM*P>͔7Oͳ!"Q!"Q*P"P*PMkKO~ :K#~ :K#y"P&o6!: QU76!Qz:Q bK:U==!Kͼ!Q"Q*PM"P:QGP!Qz>GL®K!P68 M KKONjN*P*Pr7DM*P+T]*9#"P*P6 #6 vO K*P##*Pr7DM*P*P##9 "P*P~ K6 #6 #6#"P Kx2MxʒLONjN*P*PZ7kKM"P!Q5:Q LL5~kK2Q*P"P*P*PZ7҉LM"P:Q<2QG:Q ҃Lx2Qx [L*P"P KxLONjN*PM~´L6 #6 #6++##"P~L6 #6 #6#"PvO!Q4:Q L4:U===kK2Q*P"P KjN:Q > M>2Q*PM~%M##~%M"P:Q=2QM*P"P2Q KjN:PHM*P"PO5M*P*Pr7DM:Q}'&/'̓%:PM}'̓%PO@'QO-PO-PO-QO-ùM:PM}'̓%:Q}'̓%@'͞':P2Eͳ,P+~ M++~ M#~ #ͥ' >.ͭ7#"QQ9: QO> !͔76: QN~FN"Q*P+Z7O*Q~IN IN ?N> # N7y!"Q:QG!Qz*P~ ʁNʁN#qN: QO !U7 ʛN+~ʌN ʌNy2Q2QN*P*Pr7" QNy*PU7* QDM*P9:Q_*P"PN*P+U7* QDM*P+*9#"P*P:QO9vO*Q9:P^O*PaZ7-ÒOOT] "P:P}',xZO AO"P>2 Q*P+6 #6 #6#"P>2 Q*PbZ7*P*Pr7Z7O*P:Q}'&/*PT] *Pr7DM9*P"P*P"P*P"P*Q"Q*P> ͭ7#"P!P68ʠM5M>e <);êG&odP PP/}o|gP z>!Gr<>2 E,PCOMMANDNAME TYP LEN DECABORTING MODIFY (Y/N) NEW FILEBUFFER FULL, TYPE Y TO SAVE, OR N TO ABORTSTRUCTURE$$$BAK"7F#>27:7Þ ©(ͨ ͸(#~d¯FIELD 01 CSFIELD 02 C6SFIELD 03 COSFIELD 04 ChSFIELD 05 CSFIELD 06 CSFIELD 07 CSFIELD 08 CSFIELD 09 CSFIELD 10 CSFIELD 11 CTFIELD 12 C0TFIELD 13 CITFIELD 14 CbTFIELD 15 C{TFIELD 16 CTFIELD 17 CTFIELD 18 CTFIELD 19 CTFIELD 20 CTFIELD 21 CUFIELD 22 C*UFIELD 23 CCUFIELD 24 C\UFIELD 25 CuUFIELD 26 CUFIELD 27 CUFIELD 28 CUFIELD 29 CUFIELD 30 CUFIELD 31 C VFIELD 32 C$V >ELD 25 CuUFIELD 26 CUFIELD 27 CUFIELD 28 CUFIELD 29 CUFIELD 30 CUFIELʎS>" <`i6:WU`iͭ4*.W ̓7z5U>g <͞'y'&>r <͋,6>w <+++++6>/ͅ66>/ͅ66.S>p q <>f̀)> 2KL2L> 2LL!"HL2EL:ʙG*LK8GG*::O+ʃK(‹K"HL*:G-LK8UG\G*:G7LK8jG~G*:> 2KL2L>2LLGBLK8“K*:'ڛK>2ELG*HL|ʫK:ELʓK*+r7)|GG xGG>2SL*HL ~L{K2oL2L2LCH:KL2KL2L:LL2LL#~2pL2L2L#̓7~2sL2L2Lr7"XL:pLG:sLO:oLN9HxAO!L*"L"L9-,'y'2ZL>R,y'2Da/!"PL>2cL2TL͋,|¿H'2ZLÍJ2TL:D}'','*PL͏,a/.R,y'2ZL>2cL:SL_*PLr7"PL|ʍJ:cLʍJ2cL:TLH*PL&:SLor7H{2SL2RL2UL)DM!"VL:D}'+-:ZL}','+-:TL,I,ڋI I*PL#"PL2I,sK*XL*VL~7"VL`i!RL4:SLIJ*"L!tL"_L*HL"\L:TL—I:SL_*PLr7|sKRJ"PL"NL×I:RL2SLJRJ:ZL}':TLʺI͘,RJʤI*PL#"PLI͘,sK:LL2aL![L- I:D}'5/*HL y7HK?J:D}'*XL*r7)DM&/*LHK9*!:SL=O9y!U7~7:SLOJ*"L*HL"\L:TL—I*NL+"NL|—I:D}')DM!"VL:SL*VL̓7"VL*XLr7&/=fJ:TL€H,'ÿH:D}'̓%:ZL}'̓%͞'.*L*:.EʳK!J6óKSORT COMPLETE:SLOJ J:KL2aL:SLGyH==CK!tL"_L!dL"\L!蜁U7̓7y7"L"qL![L- /K*L~7*qL~7:K:UL:KCKCK=Jx:cL"L:ULfK!L- fK>2cL!L- >2UL> / <ãK> <ãK>R <ãK>H <ãK>( <ãK>2 EóK>2 EóK>!Gr2I͸6!K6y'&.+G>p <0G>q <͸6$~wG"`K!'K6͸67*`K~wG#"`K}'&7 .nK,! L6͸6GG͞'.y'G>2I͸6!IK6y'&.ʨG>p <íG>q <͸6$~G"`K!'K6͸67*`K~G#"`K}'&7 .nK,! L6͸6G.͸6:IH͸6͸6͸6>e <);lI͸6!I6:D6>/ͅ6:E6>/ͅ6:E6!J6: E@ͅ6>:ͅ6:DeH!I6:D&͸6!(J6:E[I7!5J6:E[I!BJ6:E[I7!OJ6:E[I!iJ6: E[I7!\J6;[I!vJ6: E[I7!J6: E[I!J6:E[I7!J6:+E[I!J6:!E[I7!J6:"E[I!J6:&E[I7!J6:)E[I!J6<[I7!J6:*E[I!J6:,E[I7!K6:.E[IlIeI!IhI!I6͞'>!Gr'>R,2D:H2 E:U2HG:Df:G9*DG#HK8DG>2H͸6G:Df:G9~*kGðGG:Df:G9yHK8G9tHK8DG~*ʽG.:6:H=2HƒG͸6>e <);G͸6:U2HÃG::!E:HG!H6:D}'̓%͞'G>!Gr<ʡ<ʡʡ Ę>GG<"8z½  "7"8y28  28DBASEMSG*END*EXITNO HELP MESSAGES FOUNDHELP Ę>GG<"8z½  "7"8y28  28DBASEMSG*END*EXITǸ).̀).2ZJ2YJ2XJ:ʤG:ZJBGUJK8BG*::'ڠI>2ZJG:YJiGQJK8iG*::I>2YJG:XJIJJK8I*:>2XJ:I"[J:O+I*::,G:ÊG:ZJʨI:YJʰI>R,y'2D͞'.:XJ‡H"]J!"_J!eJ"aJ*]J~ H*_J9*aJ6-#*]J~7*_J~765"aJ*]J "]J*_J "_JG>."]J*]J~ H N'zH*_J*]J9*aJ6-#*]J~7*_J~765"aJ*_J "_JZ7H*]J "]J+H!"_J!eJ"aJ*[J*::O+"cJ9(I"]J*_J9*aJ6-#*]J~7*_J~765"aJ*_J"_J*cJ*::,H:ÙH*_J6 !ͳ%> 2:D}' &/͞'>.9-.9-!"ᜯ.!- aI!eJ- :D}'*DM&/͞'*#"|<ʸI>.ͥ+oI,I9-.ͥ+I,I:D}'' .> &/̓%͞'I>( H l m  2 EI͞'>2 EI>!Gr!Gr2JG:JyGJK8yG>2J*:"J:O+?J*::,G:_G:JsJJK8sJ>2J*::GJ"KO+GJ2K9(GJ"K*:G:JOJ>R,Gy'2D ,G>R,y'2D 9&/͞'!ͳ%!"K65:JxH*J*::O+"J9(WJ! ~NdH*K6)#~7"K9N'WJ*K6)#~76#61#~765"K*J*::,H:H!" K* K~ H ~N½H* K(WJ*K6)#~7* K6)#~76#61#~765"K* K" K~H:JI*K#"K"J*K! ~NH*K6)#~7"K:KO*KN'GJ*K6)#~7p#65"K*K#"K"K!" K* K~ `I(SI*K6)#~761#* K~765"K* K" K*I!͘&*DM!> ͔79-~*ʅI͵'‘Iͥ+IvII*K- !"JI:JʱI*J- ʺI!- I:D}'*DM&/͞'*J#"J*K- ͥ+II͵'IàI*J":D}'*DM&/:D}'' . &/̓%͞':.E~J*J͸66>' <~J>( <_J>R <_J> <_J>H <_J>R <_J:D}'̓%͞'>2 E~J͞'>2 E~J>!Gr̀)2K2K2K2K2K:+H:K>GKK8>G*::'J>2KG:KkGKK8kG*::"KO+J2K*:>2KG:K¦GKK8¦G*::$K"K:O+J*:>2K:,G:ÇG:K HKK8 H*::$K"K:O+J*:>2K:,G:G:KK8G*::O+J*::,G:G:K$KKK8$K*:>2K$KG:KJ:KJ>R,Jy'2D ,!ͳ%:KœH*K(J F#y7"K*K:KON'J N#y7"KxJ2KûH*K:KON'J ~2K#y7"K!"K"K:KBI*K"K*K*::"K(J"K*KO+"K*KN'J*K6)#~76)#*K~76#61#*K~7"K*K*::~,9I:"KH*K65#"K:KI*K"K*K*::"K(J"K*KO+"K*::KK8‹I*::"KO+"K*KN'J!K ~*KNʱI6-#~7úI6)#~761#*K~7"K*K*::~,I:"KOI*K65:KcJ͞'!͘&J:D}'*DM,*K*K:KO7WJJ@J:K*J*K- :K7J*K- ͞'5/:D}'*DM,JJ͞'ͥ+JJ:D}'*DM,͞'*K:K '|ʪJ:KʗJ*K- :KʤJ*K- 5/:D}'*DM,JtJ:D}'̓%͞'5K>( <K> <$K>n <K>T <K>R <$K>o <K>s <K>S <K:D}'̓%͞'>2 E5K:D}'̓%>2 E5K>!Gr2M:O+:G> R 2M*M~ G͡JG!M4*M"MG:UO:MG:M2M#H*M:Mg."M!M4$H&"#H'öG͘,ҶG!"MK"M2M*M~ SHbKSH!M4*M"M3H: MO:MG!y=jHOxg^H"M* MM LL!Lz* M' K"M2M*M~ ʵHKڵH!M4*M"MÕH:M!MH~=2M:MG>2Mx2Mͼ2MK"M2M*M~ I͡JI!M4*M"MH:MILL2 M:MBI5/$BIͺ!2 MBI," M"M 2 M:MUJ:MI!M6#:M/2 M:M2MàG9-," M* M"M2 MÜG!M6#:Mw$J&"HJ" M: MHJ:MG:MO:M2MHJmH$%J&"HJ'+J͘,HJ* M#" M:MG:MO:M2MHJmH* M"M2 MÜG:M0ʞJsJ:M=J2M!M4ÑJK~ ʑJ:M<2M:M=J2M* M"M2 MÜGLL:TO ~ҶJ:MJ:MʿJ7~/2M7BK?~2M*MDML!Lz*M:M-!!M͔7!!MyU767~2MñK?~2MO>-!!M͔7!M~K#øK!!M:MU76*MDM!M!Lz*M:M2 ELL>OLͳ: M2E>!Gr<6 s#r27*7###:6$:7$*7 ͩ273{ "*$'¦$G *#7++J$ FIELDSRECORD # :00000 ͩ273{ "*$'¦$G *#7++J$ FIELDSRECORD -PO-PO-QO-ùM:PM}'̓%:Q}'̓%@'͞':P2Eͳ,P+~ M++~ M#~ #ͥ' >.ͭ7#"QQ9: QO> !GGH̓%#.̓%#>, <:D}''̓%:ʑH9IK8¡H*::87¡H~7:ʡHOG::pG,¡H::DG"I*I~ʥG#ÚG6#">IzG*>I6!ͽGʑH |G02III~G #Gy2I#~GI |DHO 6 .̓%́'#. .̓%́'#.:D}''̓%:#E}'̓%2#Ed)2c2D2E.ìH:d='$Z='͞'>2 EìH>!Gr<  { !![!!" :"E"Q"^"d"m""" """"""{!zW{_{!zW{_{!zW{TO$$$ SUB { !![!!" :"E"Q"^"d"m""" """"""{!zImH* M+" M|I:MG:M2MImH* MZ7I"M>2 M:M2MàG9-," M* M"M2 MÜG!M6#:Mw$J&"HJ" M: MHJ:MDEPTNONlDEPTNAMECl 1TECHNICAL DEVELOPMENT 2OFFICE ADMINISTRATION 3TRANSPORTATION 25.50 0.00 0.00 4 2 956.35 0.00 0.00 5 2 2400.55 0.00 0.00 6 3 742.45 0.00 0.00 7 3 450.75 0.00 0.00BBBBBBB5BBBBBBBBBBBBBBBBBBBBBBBM=1,L=55,W=35 Y DEPARTMENT LISTING N N 4,DEPTNO DEPT NO 25,DEPTNAME DEPARTMENT NAME !EMPNONlDEPTNONlTAXCODENlGROSSSALNlTAXESNlNETSALNl 1 1 4 1875.52 0.00 0.00 2 1 3 1555.97 0.00 0.00 3 1 3 1125.50 0.00 0.00 4 2 2 956.35 0.00 0.00 5 2 2 950.78 0.00 0.00 6 3 2 742.45 0.00 0.00 7 3 1 450.75 0.00 0.0000 7 3 450.75 0.00 0.00BBBBBBBBBBB BBBBBBBBBBBBBB BBBBBBBBBBBBBBBBBBBBBBB(EMPNONlLASTNAMEClDEPTNONlJOBCLASSNlTAXCLASSNlGROSSSALN l 5EINSTEIN 2 22 75 1500.05 2REDFORD 7 9 4 2000.50 8ROCKNE 1 65 34 1100.50 54GORT 99 99 39 500.00 78SMITH 903 49 61 1200.75 70JONES 235436456 3000.85 22SMITH 903876321 4576.82ber to indicate" ?"the type of work this employee does), and" ?"TAXCLASS and GROSSSAL for tax deduction and gross" ?"salary information. As we shall see in the" ?"advanced DBASE TUTOR lessons, the key fields" ?"in fi R(EMPNONlLASTNAMEClDEPTNONlJOBCLASSNlTAXCLASSNlGROSSSALN l 5EINSTEIN 2 22 75 1500.05 78SMITH 903 49 61 1200.75* 22SMITH 903876321 4576.82 54GORT 99 99 39 500.00 78SMITH 903 49 61 1200.75* 70JONES 235436456 3000.85 22SMITH 903876321 4576.82' TO CHECK DO CHECKC ?"? LASTNAME" STORE '? LASTNAME' TO CHECK DO CHECKC ?"There's another SMITH. Is it flagged for deletion?" ?"? *" STORE '? *' TO CHECK DO CHECKC ?"Yes, it is flagged for deletion, so we don't"(EMPNONpLASTNAMECpDEPTNONpJOBCLASSNpTAXCLASSNpGROSSSALN p 5EINSTEIN 2 22 75 1500.05 2REDFORD 7 9 4 2000.50 8ROCKNE 1 65 34 1100.50 54GORT 99 99 39 500.00 78SMITH 903 49 61 1200.75 70JONES 235436456 3000.85 22SMITH 903876321 4576.82 LESSON IF LESSON = 'QUIT' QUIT ENDIF IF LESSON = 'I' STORE 1 TO OK LOOP ENDIF STORE VAL(LESSON) TO LESSONN IF LESSONN < 1 .OR. LESSONN > 10 ?"I'm afraid you didn'M=1,L=55,W=40 Y EMPLOYEE MASTER PAYROLL N Y N 5,EMPNO EMP NO N 4,DEPTNO DEPT NO N 2,TAXCODE TX CD N 8,GROSSSAL GROSS SALARY Y 6,TAXES TAXES Y 8,NETSAL NET SALARY Y SE TUTOR" ?"manual, if you get involved in complex JOINS with" ?"many files, make sure that you do not violate any" ?"of the normailzation principles." ? ?"One more caution, too, when using JOIN. JOINs of" ?"larger files can take an extraordinary amount of" ?"time. If you find that run times for JOINs are" ?"becM=1,L=55,W=50 Y dBASE II PAYROLL REPORT N Y N 4,EMPNO EMP NO N 15,LASTNAME EMPLOYEE LAST NAME 4,DEPTNO DEPT NO N 5,JOBCLASS JOB CLASS N 5,TAXCLASS TAX CLASS N 10,GROSSSAL GROSS SALARY Y  ENDIF IF COMMAND # CHECK ?"You didn't enter:" ?" &CHECK" ?"Please try again." LOOP ELSE STORE 1 TO OK SET TALK ON &COMMAND SET TALK OFF ENDIF ENDDO M=1,L=55,W=50 Y PAYROLL INPUT LISTING N Y N 5,EMPNO EMP NO N 4,DEPTNO DEPT NO N 2,TAXCODE TX CD N 8,GROSSSAL GROSS SALRAY Y 6,TAXES TAXES Y 8,NETSAL NET SALARY Y ?"a report form called EMPMFRM for you to use to" ?"generate the report." STORE 'USE EMPMAST' TO CHECK DO CHECKC STORE 'DISPLAY STRUCTURE' TO CHECK DO CHECKC STORE 'REPORT FORM EMPMFRM' TO CHECK DO CHECKC WAIT ERASE ?"Now, let's issue the same three commands for the" ?"JOBHIST file using the report form JOBHFRM re ?"time. If you find that run times for JOINs are" ?"becoming excessive, you may want to accomplish" ?"the results of a JOIN by using the UPDATE command," ?"or by writing a command procedure." ? ?"It's time to QUIT." STORE 'QUIT' TO CHECK DO CHECKC RETURN  10.15 20.20 30.25 40.30FFICE ADMINISTRATIO 3TRANSPORTATION 0 3 1 1125.50 0.00 0.00 4 2 956.35 0.00 0.00 5 2 2400.55 0.00 0.00 (EMPNONpLASTNAMECpDEPTNONpJOBCLASSNpTAXCLASSNpGROSSSALN p 2REDFORD 7 9 4 3500.50 5EINSTEIN 2 22 75 1500.05 8ROCKNE 1 65 34 1100.50 22SMITH 903876321 4576.82 54ZOG 99 99 39 525.25 70JONES 235436456 2965.85 78SMITH 903 49 61 1200.75 &CHECK" ?"Please try again." LOOP ELSE STORE 1 TO OK SET TALK ON &COMMAND SET TALK OFF LOOP ENDIF ENDIF IF$EMPNONlEMPNAMECl 1JONES, SARAH P. 2SMART, JOHN H. 3SCHNERD, H. 4FINGERS, STEPHEN 5DUCK, D. 6TROUT, KILGORE 7SMITH, R. 75 0.00 0.00BBBBBBBBBBB BBBBBBBBBBBBBB BBBBBBBBBBBBBBBBBBBBBBBM=1,L=55,W=40 Y EMPLOYEE NAME LISTING N N 5,EMPNO EMP NO 30,EMPNAME EMPLOYEE NAME  03/30/81 1 1 4 1875.52 0.00 0.00 2SCIENTIST 01/25/68 2 1 3 1555.97 0.00 0.00 3ENGINEER 06/20/79 3 1 3 1125.50 0.00 0.00 4CLERK TYPIST 08/14/81 4 2 2 956.35 0.00 0.00 5COPY SPECIALIST 11/28/80 5 2 2 950.78 0.00 0.00 6DRIVER 09/21/76 6 3 2 742.45 0.00 0.00 7OFFICE ASSISTANT 05/21/82 7  2EMPNO@  @  ?   " @@ @P@A"ATApAx?   " @ @ @` EMPNONlLASTNAMEClGROSSSALN l 54ZOG 25.25 2 1500.00 70JONES -35.00 1 65 34 1100.50 22 0 0 0 9576.82 54GORT 99 99 39 500.00 70JONES 235436456 3000.85 78SMITH 903 49 61 1200.75r of system design, and each system will" ?"dictate which method should be used. The purpose" ?"of this lesson is to show you how to use SORT" ?"if you feel the circumstances warrant it." WAIT ERASE ?"Enough said. EMPNONpLASTNAMECpGROSSSALN p 54ZOG 25.25 2 1500.00 70JONES -35.00?"Now, tell me which disk drive contains lesson &LESSON, and press the" ?" key." STORE 0 TO OK1 DO WHILE OK1 = 0 ACCEPT 'WHICH DISK DRIVE CONTAINS LESSON &LESSON?' TO TDRIVE IF !(TDRIVE) = 'QUIT' QUIT ENDIF RESET STORE $(!(TDRIVE),1,1) TO TDRIVE IF TDRIVE >= 'A' .AND. TDRIVE <= 'P' IF FILE("&TDRIVE.:TEACH&LESSON..CMD") STORE 1 TO EMPNONpLASTNAMECpGROSSSALN p 2 1500.00 54ZOG 25.25 70JONES -35.00 order by EMPNO." ? ?"Type SORT ON EMPNO TO EMPTSRT " STORE 'SORT ON EMPNO TO EMPTSRT' TO CHECK DO CHECKC ?"Now, use EMPTSRT, and display all the records on it. I'll help you if" ?"you make errors in either of the two commands to do this." STORE 'USE EMPTSRT' TO CHECK DO CHECKC STORE 'DISPLAY ALL' TO CHECK DO CHECKC M=1,L=55,W=50 Y JOB HISTORY REPORT N N 5,EMPNO EMP NO 15,EMPNAME EMPLOYEE NAME 15,JOBTITLE JOB TITLE 8,STRTDATE START DATE 06/20/79 4CLERK TYPIST 08/14/81 5COPY SPECIALIST 11/28/80 6DRIVER 09/21/76 7OFFICE ASSISTANT 05/21/82BB5BBBBBBBBBBBBBBBBBBBBBBBM=1,L=55,W=40 Y JOB HISTORY FILE LISTING N N 5,EMPNO EMP NO 20,JOBTITLE JOB TITLE 8,STRTDATE START DATE results of a JOIN by using the UPDATE command," ?"or by writing a command procedure." ? ?"It's time to QUIT." STORE 'QUIT' TO CHECK DO CHECKC RETURN  10.15 20.20 30.25 40.30FFICE ADMINISTRATIO 3TRANSPORTATION 0 3 1 1125.50 0.00 0.00 4 2 956.35 0.00 0.00 5 2 2400.55 0.00 0.00 "EMPNONlJOBTITLEClSTRTDATECl 1SUPERVISOR 05/10/79 1MANAGER 03/30/81 2SCIENTIST 01/25/68 3ENGINEER 06/20/79 4CLERK TYPIST 08/14/81 5COPY SPECIALIST 11/28/80 6DRIVER 09/21/76 7OFFICE ASSISTANT 05/21/82BB5BBBBBBBBBBBBBBBBBBBBBBBEEMPNONțJOBTITLEC͛STRTDATECEMPNONEMPNAMEC 1SUPERVISOR 05/10/79 1JONES, SARAH P. 1MANAGER 03/30/81 1JONES, SARAH P. 2SCIENTIST 01/25/68 2SMART, JOHN H. 3ENGINEER 06/20/79 3SCHNERD, H. 4CLERK TYPIST 08/14/81 4FINGERS, STEPHEN 5COPY SPECIALIST 11/28/80 5DUCK, D. 6DRIVER 09/21/76 6TROUT, KILGORE 7OFFICE ASSISTANT 05/21/82 7SMITH, R. CHECK" ?"If you would like to try to correct the statement, enter Y when" ?"prompted. Otherwise, enter N, and then re-enter the entire command." DO TEACHC ENDIF IF COMMAND # CHECK ?"Please enter:" ?" &CHECK " LOOP ELSE STORE 1 TO OK SET TALK ON &COMMAND SET TALK OFF ENDIF ENDDO STORE ' ' TO PROMPT 'EMPNONțDEPTNON͛TAXCODENЛGROSSSALNқTAXESNڛNETSALNTAXCODENTAXPCTN 1 1 4 1875.52 0.00 0.00 40.30 2 1 3 1555.97 0.00 0.00 30.25 3 1 3 1125.50 0.00 0.00 30.25 4 2 2 956.35 0.00 0.00 20.20 5 2 2 950.78 0.00 0.00 20.20 6 3 2 742.45 0.00 0.00 20.20 7 3 1 450.75 0.00 0.00 10.15 JEMPNONțDEPTNON͛TAXCODENЛGROSSSALNқTAXESNڛNETSALNTAXCODENTAXPCTNEMPNONEMPNAMEC 1 1 4 1875.52 0.00 0.00 40.30 1JONES, SARAH P. 2 1 3 1555.97 0.00 0.00 30.25 2SMART, JOHN H. 3 1 3 1125.50 0.00 0.00 30.25 3SCHNERD, H. 4 2 2 956.35 0.00 0.00 20.20 4FINGERS, STEPHEN 5 2 2 950.78 0.00 0.00 20.20 5DUCK, D. 6 3 2 742.45 0.00 0.00 20.20 6TROUT, KILGORE 7 3 1 450.75 0.00 0.00 10.15 7SMITH, R.  fEMPNONpDEPTNONpTAXCODENpGROSSSALNpTAXESNpNETSALNpTAXCODENpTAXPCTNpEMPNONpEMPNAMECpDEPTNONqDEPTNAMECq 1 1 4 1875.52562.65 1312.87 40.30 1JONES, SARAH P. 1TECHNICAL DEVELOPMENT 2 1 3 1555.97388.99 1166.98 30.25 2SMART, JOHN H. 1TECHNICAL DEVELOPMENT 3 1 3 1125.50281.37 844.13 30.25 3SCHNERD, H. 1TECHNICAL DEVELOPMENT 4 2 2 956.35191.27 765.08 20.20 4FINGERS, STEPHEN 2OFFICE ADMINISTRATION 5 2 2 950.78190.15 760.63 20.20 5DUCK, D. 2OFFICE ADMINISTRATION 6 3 2 742.45148.49 593.96 20.20 6TROUT, KILGORE 3TRANSPORTATION 7 3 1 450.75 67.61 383.14 10.15 7SMITH, R. 3TRANSPORTATION  too, and you can" ?"compute tax and net salary amounts, and produce the payroll register." WAIT ERASE ?"Issue the commands to do all this. First, USE JOINPAY3." STORE 'USE JOINPAY3' TO CHECK DO CHECKC CLEAR SET TALK OFF SET CONFIRM ON SET EXACT ON STORE ' ' TO PROMPT ERASE @ 6,0 ?" dBASE II LESSONS RELEASE 2.0.1" ?" COPYRIGHT 1982, 1983 S. C. JENNER" ?" ALL RIGHTS RESERVED" STORE 0 TO COUNT DO WHILE COUNT < 100 STORE COUNT + 1 TO COUNT ENDDO ERASE ?"I'd like to know your name. Please enter your first name and press" ?"the key." STORE 0 TO OK DO WHILE OK = 0 ACCEPT "What's your first name?" to STUDENT IF LEN(STUDENT) > 10 ?"You have a long first name. Please enter up to 10 characters of" ?"your first name or a nickname." LOOP ENDIF IF STUDENT = ' ' ?"I'm afraid you didn't enter your name. Please try again." LOOP ENDIF STORE !(STUDENT) TO STUDENT IF STUDENT = 'QUIT' QUIT ENDIF ACCEPT "Did you spell it correctly (Y OR N)?" TO SPELL STORE !(SPELL) TO SPELL IF SPELL = 'QUIT' QUIT ENDIF IF SPELL = 'Y' STORE 1 TO OK ENDIF ENDDO ERASE ?"If you have a printer, &STUDENT, turn it on. It will keep track of" ?"all that you do during these training sessions." ? ?"If your printer is on, type Y and press the key. If it is not" ?"on, type N, and press the key." STORE 0 TO OK DO WHILE OK = 0 ACCEPT "Is your printer on (Y/N)?" TO PRINTER IF !(PRINTER) = 'QUIT' QUIT ENDIF IF !(PRINTER) = 'Y' .OR. !(PRINTER) = 'N' STORE 1 TO OK IF !(PRINTER) = 'Y' SET PRINT ON ENDIF ELSE ?"You didn't enter a Y or N. Please try again &STUDENT.." LOOP ENDIF ENDDO ERASE DO WHILE T STORE 0 TO OK DO WHILE OK = 0 ?"If this is the first time you've used dBASE II LESSONS, select the" ?"I option from the menu below. This introduction contains background" ?"material on computers, operating systems, and dBASE II." ? ?"If this is not the first time you've used dBASE II LESSONS, select" ?"the appropriate lesson number (or QUIT) from the menu below." ? ?" I - Introduction, definitions of basic computer terms (reference," ?" not interactive)" ?" 1 - Create files, generate Reports, and correct syntax errors" ?" 2 - Add, change, and delete data in files, and record positioning" ?" 3 - Selecting sub-sets of data on files, and computations" ?" 4 - Record keys, indexing, random processing, and Boolean operators" ?" 5 - File and system utilities, and intro to command procedures" ?" 6 - Sorting, updating, and use of memory" ?" 7 - Relational data base construction" ?" 8 - Other forms of accepting and displaying data, dBASE II functions," ?" and SET options" ?" 9 - Building custom reports and screens" ?" 10 - Command procedures (programming features in dBASE II)" ?" QUIT - In response to any prompt, to return to the operating system" ? ACCEPT 'ENTER THE LESSON NUMBER' TO LESSON STORE !(LESSON) TO LESSON IF LESSON = 'QUIT' QUIT ENDIF IF LESSON = 'I' STORE 1 TO OK LOOP ENDIF STORE VAL(LESSON) TO LESSONN IF LESSONN < 1 .OR. LESSONN > 10 ?"I'm afraid you didn't enter an I, or a number between 1 and 10." ?"Please try again." WAIT LOOP ELSE STORE 1 TO OK ENDIF ENDDO IF LESSON # 'I' IF LESSONN > 9 STORE STR(LESSONN,2) TO LESSON ELSE STORE STR(LESSONN,1) TO LESSON ENDIF ENDIF STORE 0 TO OK DO WHILE OK = 0 IF FILE('TEACH&LESSON..CMD') STORE 1 TO OK ELSE ?"You must have received several diskettes for dBASE II LESSONS. Insert" ?"the diskette which contains lesson &LESSON into another disk drive (not" ?"the one you started dBASE II on). I'll wait while you do that." WAIT ?"Now, tell me which disk drive contains lesson &LESSON, and press the" ?" key." STORE 0 TO OK1 DO WHILE OK1 = 0 ACCEPT 'WHICH DISK DRIVE CONTAINS LESSON &LESSON?' TO TDRIVE IF !(TDRIVE) = 'QUIT' QUIT ENDIF RESET STORE $(!(TDRIVE),1,1) TO TDRIVE IF TDRIVE >= 'A' .AND. TDRIVE <= 'P' IF FILE("&TDRIVE.:TEACH&LESSON..CMD") STORE 1 TO OK1 LOOP ELSE ?"I'm afraid drive &TDRIVE doesn't contain lesson &LESSON.. Please specify" ?"the correct drive, and make sure that you inserted the diskette which" ?"contains lesson &LESSON into that drive." ENDIF ELSE ?"The drive specification must be one of the letters A through P." ENDIF ENDDO SET DEFAULT TO &TDRIVE ENDIF ENDDO IF LESSON = 'I' DO TEACHI LOOP ENDIF DO TEACH&LESSON ENDDO RETURN characters of" ?"your first name or a nickname." LOOP ENDIF IF STUDENT = ' ' ?"I'm afraid you didn't enter your name. Please try again." LOOP ENDIF STORE !(STUDENT) TO STUDENT IF STUDENT = 'QUIT' QUIT ENDIF ACCEPT "Did you spell it correctly (Y OR N)?" TO SPELL STORE !(SPELL) TO SPELL IF SPELL = 'QUIT' QUIT ENDIF IF SPELL = 'Y' STORE 1 TO OK ENDIF ENDDO ERASE ?"If you have a printer, &STUDENT, turn FIELD:NAMEC pFIELD:TYPECpFIELD:LENNpFIELD:DECNp FIELD C 80 0ADDRESS C 20 0*CITY C 10 0STATE C 30 0*PHONE C 12 0BBBBBBBJBBBBBB@BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"BBBBBBBBB"BBBBBBBBBBBBBBBBBBBBBBBBBBBNAMECpADDR1CpADDR2CpADDR3CqADDR4C1qADDR5COq JOHN MOTT 1773 N. GROVER CIRCLE YUMA TEXAS 90009 USA HER THERE YES THERE YES YES THERE @ SAY" ?"commands will be displayed on the top half of the" ?"screen." WAIT ERASE @ 12,0 SAY "Here I am down here." @ 13,0 SAY "The scLASTNAME@  @  @ @P@A"ATApAx?   " @EINSTEIN GORT JONES REDFORD ROCKNE SMITH SMITH   " @ @ @` M=1,L=55,W=50 Y PAYROLL REPORT N Y N 10,EMPNAME EMPLOYEE NAME 11,DEPTNAME DEPARTMENT NAME 8,GROSSSAL GROSS SALARY Y 7,TAXES TAXES Y 8,NETSAL NET SALARY Y  1TECHNICAL DEVELOPMENT 3 1 3 1125.50 0.00 0.00 30.25 3SCHNERD, H. 1TECHNICAL DEVELOPMENT 4 2 2 956.35 0.00 0.00 20.20 4FINGERS, STEPHEN 2OFFICE ADMINISTRATION 5 2 2 950.78 0.00 0.00 20.20 5DUCK, D. 2OFFICE ADMINISTRAT1,L=55,W=50 Y PAYROLL REPORT N Y N 10,EMPNAME EMPLOYEE NAME 10,DEPTNAME DEPARTMENT NAME 8,GROSSSAL GROSS SALARY Y 7,TAXES TAXES Y 8,NETSAL NET SALARY Y  1TECHNICAL DEVELOPMENT 3 1 3 1125.50 0.00 0.00 30.25 3SCHNERD, H. 1TECHNICAL DEVELOPMENT 4 2 2 956.35 0.00 0.00 20.20 4FINGERS, STEPHEN 2OFFICE ADMINISTRATION 5 2 2 950.78 0.00 0.00 20.20 5DUCK, D. 2OFFICE ADMINISTRAT QFIELDCPp M=1,L=55,W=70 Y NAME AND ADDRESS REPORT Y N 15,NAME NAME OF PERSON 20,ADDRESS ADDRESS 10,CITY CITY REPLACE FIELD:LEN WITH 80 REPLACE FIELD:DEC WITH 0 IF FILE("T1RDBF") DELETE FILE T1RDBF ENDIF CREATE T1RDBF FRTAXCODENlTAXPCTNl 10.15 20.20 30.25 40.30FFICE ADMINISTRATIO 3TRANSPORTATION 0 3 1 1125.50 0.00 0.00 4 2 956.35 0.00 0.00 5 2 2400.55 0.00 0.00 6 3 742.45 0.00 0.00 7 3 450.75 0.00 0.00BBBBBBB5BBBBBBBBBBBBBBBBBBBBBBBM=1,L=55,W=10 Y TAX CODES N N 4,TAXCODE TAX CODE 4,TAXPCT TAX PCT AMECD AXCODENGGROSSSALNITAXESNQNETSALNW ERASE ?"In this module, you will learn how to CREATE a dBASE II file, DISPLAY" ?"its contents and STRUCTURE, write a REPORT, correct SYNTAX ERRORS, and" ?"how to QUIT, or exit from dBASE II. It's very easy to do. To start, we" ?"will CREATE a file. All you have to do is type CREATE and press the" ?" key." ? ?"If you're not sure what a file is, what records are, or what fields" ?"within records are, QUIT this lesson, and review the dBASE II LESSONS" ?"Introduction. Otherwise, &STUDENT, proceed with your CREATE." ? ?"Type CREATE ." STORE 'CREATE' TO CHECK DO CHECKC1 ERASE ?"Very good, &STUDENT!" ? ?"dBASE II will now ask you to enter a filename for this file, so it" ?"can be found later. You may call the file any name you wish, but the" ?"filename may not exceed 8 characters. Type up to an 8 character" ?"filename, and press the key." STORE 0 TO OK DO WHILE OK = 0 ACCEPT TO FILE IF !(FILE) = 'QUIT' QUIT ENDIF STORE !(FILE) TO FILE IF LEN("&FILE") > 8 ?"I'm afraid you entered a filename which is greater than 8 characters." ?"Please try again." LOOP ENDIF IF FILE = ' ' ?"I'm afraid you didn't enter a file name. Please enter a name with from 1" ?"to 8 characters." LOOP ENDIF IF @(' ','&FILE') # 0 ?"Imbedded blanks are not permitted in the file name." ?"Please try again." LOOP ENDIF STORE FILE TO T:NAME DO TEACHXC IF T:NAMEOK # 1 LOOP ENDIF STORE 1 TO OK ENDDO STORE 0 TO OK ERASE ?"Now, you must specify the fields contained in &FILE.. Each field" ?"specification must contain a fieldname, fieldtype (either C for" ?"character fields, N for numeric fields, or L for logical fields)," ?"fieldlength, and the number of decimal positions in the field MAY be" ?"specified if it is a numeric field. Commas separate the fieldname," ?"fieldtype, fieldlength, and decimal specifications." ? ?"A enters each field. After you have entered the last field," ?"press the key again, and the file will be CREATEd." ? ?"By the way, whenever appears at the end of an entry line," ?"it means you should press the key. Don't type the word ." ? ?"Here are a couple of examples of fields. A 30 position character" ?"field called NAME would be entered as follows:" ? ?" NAME,C,30" ? ?"A 5 position numeric field called AMOUNT with 2 decimal positions would" ?"be entered as follows:" ? ?" AMOUNT,N,5,2" ? WAIT ERASE ?"OK. Try to CREATE a file. Make the file a name and address file" ?"that contains names and addresses of some of your friends (you do" ?"have some friends, right?)." ? ?"I'm going to let you specify only three fields in your file &STUDENT," ?"even though dBASE II lets you have up to 32 fields per file. We're" ?"trying to keep this first file simple." WAIT ERASE ?"I'm going to enter the first field for you, so it's easier for you to do" ?"the rest of the fields on your own. I'm going to call the first field" ?"NAME, and make it a character type field with a length of 30." STORE 1 TO FIELDNO ?"ENTER RECORD STRUCTURE AS FOLLOWS:" ? ?" FIELD NAME,TYPE,WIDTH,DECIMAL PLACES" ? DO WHILE OK = 0 STORE ' ' TO FIELDDEF DO WHILE FIELDDEF = ' ' STORE STR(FIELDNO,1) TO FIELDX STORE ' ' TO FIELDDEF IF FIELDNO = 1 ?" 1:NAME,C,30" ?"Press the key, and I'll enter it." SET CONSOLE OFF WAIT SET CONSOLE ON ?"Now, you enter the remaining fields for &FILE." STORE 'NAME,C,30' TO FIELDDEF ENDIF IF FIELDNO > 3 ?"Press the key. You've entered 3 fields, and that's enough for now," ?"even though dBASE II permits up to 32 fields." ACCEPT "Press the key" TO END STORE 'END' TO FIELDDEF STORE FIELDNO - 1 TO FNOHOLD STORE 1 TO OK LOOP ENDIF IF FIELDNO # 1 ACCEPT " &FIELDX" TO FIELDDEF IF !(FIELDDEF) = 'QUIT' QUIT ENDIF ENDIF IF FIELDDEF = ' ' STORE 'END' TO FIELDDEF STORE FIELDNO - 1 TO FNOHOLD LOOP ENDIF STORE TRIM(FIELDDEF) TO FIELDDEF STORE LEN('&FIELDDEF') TO LENGTH STORE 1 TO S STORE LENGTH TO L STORE @(',',$(FIELDDEF,S,L)) TO COMMAL IF COMMAL = 0 ?"You didn't enter commas separating the fieldname, fieldtype, and" ?"fieldlength specifications. Please try it again." STORE ' ' TO FIELDDEF LOOP ENDIF STORE 0 TO COUNT STORE FIELDDEF+',' TO FIELDDEF STORE LEN('&FIELDDEF') TO LENGTH,L STORE ' ' TO PARSE1,PARSE2,PARSE3,PARSE4 STORE 0 TO PARSERR DO WHILE COUNT < 4 STORE COUNT + 1 TO COUNT STORE STR(COUNT,1) TO COUNTX IF L = 0 STORE 4 TO COUNT LOOP ENDIF STORE @(',',$(FIELDDEF,S,L)) TO COMMAL IF COMMAL = 1 ?"Don't enter 2 commas in a row, or end a field with a comma. Please try" ?"it again." STORE 1 TO PARSERR STORE 4 TO COUNT LOOP ENDIF STORE $(FIELDDEF,S,(COMMAL - 1)) TO PARSE&COUNTX STORE S + COMMAL TO S STORE L - COMMAL TO L ENDDO IF PARSERR = 1 STORE 0 TO PARSERR STORE ' ' TO FIELDDEF LOOP ENDIF IF (PARSE1 = ' ' .OR. PARSE2 = ' ' .OR. PARSE3 = ' ') ?"NAME, TYPE, and WIDTH must be specified. Please try it again." STORE ' ' TO FIELDDEF LOOP ENDIF STORE !(PARSE1) TO PARSE1 IF LEN(PARSE1) > 10 ?"NAME specification may not exceed 10 characters. Please try it again." STORE ' ' TO FIELDDEF LOOP ENDIF STORE !(PARSE2) TO PARSE2 IF (PARSE2 # 'C' .AND. PARSE2 # 'N' .AND. PARSE2 # 'L') ?"TYPE must be either C, N, or L. Please try it again." STORE ' ' TO FIELDDEF LOOP ENDIF IF !(PARSE2) = 'L' .AND. PARSE3 # '1' ?"LOGICAL types may only have a length of 1. Please try again." STORE ' ' TO FIELDDEF LOOP ENDIF IF (VAL(PARSE3) > 99 .AND. STR(VAL(PARSE3),3) # PARSE3) .OR.; (VAL(PARSE3) > 9 .AND. VAL(PARSE3) < 100 .AND. STR(VAL(PARSE3),2) # PARSE3); .OR. (VAL(PARSE3) < 10 .AND. STR(VAL(PARSE3),1) # PARSE3) ?"Only numbers, without decimal points, may be entered in the" ?"length specification. Please try again." STORE ' ' TO FIELDDEF LOOP ENDIF IF PARSE4 # ' ' IF (VAL(PARSE4) > 99 .AND. STR(VAL(PARSE4),3) # PARSE4) .OR.; (VAL(PARSE4) > 9 .AND. VAL(PARSE4) < 100 .AND. STR(VAL(PARSE4),2) # PARSE4); .OR. (VAL(PARSE4) < 10 .AND. STR(VAL(PARSE4),1) # PARSE4) ?"Only numbers, without decimal points, may be entered in the" ?"decimal specification. Please try again." STORE ' ' TO FIELDDEF LOOP ENDIF ENDIF IF (&PARSE3 < 1 .OR. &PARSE3 > 254) ?"Length must be between 1 and 254. Please try it again." STORE ' ' TO FIELDDEF LOOP ENDIF IF PARSE4 # ' ' IF &PARSE4 >= &PARSE3 ?"The decimal specification must be at least one position shorter" ?"than the length specification. Please try it again." STORE ' ' TO FIELDDEF LOOP ENDIF ENDIF IF PARSE2 = 'C' .AND. PARSE4 # ' ' ?"Character fields may not have a decimal specification. Please try it" ?"again." STORE ' ' TO FIELDDEF LOOP ENDIF STORE PARSE1 TO T:NAME DO TEACHXC IF T:NAMEOK # 1 STORE ' ' TO FIELDDEF LOOP ENDIF STORE PARSE1 TO F&FIELDX.:NAME STORE PARSE2 TO F&FIELDX.:TYPE STORE &PARSE3 TO F&FIELDX.:LEN IF PARSE4 = ' ' STORE 0 TO F&FIELDX.:DEC ELSE STORE &PARSE4 TO F&FIELDX.:DEC ENDIF STORE FIELDNO + 1 TO FIELDNO STORE ' ' TO FIELDDEF ENDDO IF FNOHOLD = 0 ?"I'm afraid you didn't enter any fields. Please try it again." LOOP ENDIF STORE 1 TO OK ENDDO ERASE ?"Immediately following the creation of a file, dBASE II asks:" ? ?"ENTER DATA NOW?" ? ?"To which you would reply Y if you wish to enter data into your file," ?"or N if you don't want to. The method and format for entering data" ?"using the APPEND command is identical to the ENTER DATA NOW? format." ?"We're going to use the APPEND format, so you will learn it, and the" ?"ENTER DATA NOW? format, at the same time." ? ?"I'm going to put your file definition away now in a safe place. I'll be" ?"back in a few moments." WAIT DO TEACH11 RETURN WAIT DO TEACH11 RETURN WAIT DO TEACH11 RETURN t" ?"again." STORE ' ' TO FIELDDEF LOOP ENDIF STORE PARSE1 TO F&FIELDX.:NAME STORE PARSE2 TO F&FIELDX.:TYPE STORE &PARSE3 Tt" ?"again." STORE ' ' TO FIELDDEF LOOP ENDIF STORE PARSE1 TO F&FIELDX.:NAME STORE PARSE2 TO F&FIELDX.:TYPE STORE &PARSE3 TLDDEF LDDEF LDDEF LDDEF E3) < 10 .AND. STR(VAL(PARSE3),1) # PARSE3) ?ERASE ?"In lesson 9, &STUDENT, screen building and custom report building" ?"capabilities of dBASE II were covered. @ SAY was demonstrated, and" ?"the ZIP package functions mentioned." ? ?"Now, you are at the last lesson, lesson 10. If you thought that dBASE II" ?"has a lot of power based on what you've seen so far, this lesson should" ?"convince you that there is very little that you can't do with it." ?"Unlike much microcomputer software, dBASE II has programming features" ?"found only in rather powerful languages." ? ?"Every command that has been demonstrated can be placed in command" ?"procedures, which are the same as source programs for other languages." WAIT ERASE ?"In addition to the commands demonstrated so far, dBASE II also has" ?"DO, IF, and macro substitution capability. With these additional" ?"commands, not only do you have full programming capability, quite" ?"literally, you can do things that you would be unable to do, or do as" ?"easily, in conventional programming languages." WAIT ERASE ?"I have a command procedure that contains the commands necessary to" ?"illustrate these things. It is called CLIENTLS. Do not expect to" ?"become a programmer by reviewing this command procedure. It only serves" ?"as an illustration of the programming power within dBASE II. If you do" ?"understand programming concepts, a review of this command procedure," ?"coupled with everything else learned in these lessons, may convince" ?"you that you do not have to know any other language." WAIT ERASE ?"You're going to use a file called CLIENT, which contains client names and" ?"phone numbers (work, and home). The file also contains a field that" ?"indicates whether the client prefers to be called at work or at home." ?"Take a look at the structure of the file, &STUDENT.." ? STORE 'USE CLIENT' TO CHECK DO CHECKC ? STORE 'DISPLAY STRUCTURE' TO CHECK DO CHECKC WAIT ERASE ?"The command procedure, essentially, reads every record on CLIENT, and" ?"displays the client's name and one of the phone numbers depending on the" ?"code contained in the work/home preference field. The command procedure" ?"contains a number of REMARK commands that do nothing but display items" ?"on the screen. Ignore them to determine the program flow." WAIT ERASE ?"The command procedure does not illustrate how to call other command" ?"procedures. You've been doing it every time you started me up by typing" ?"DO LESSONS. Now, I want you to start up the command procedure that" ?"illustrates DO, IF, and macro substitution." ? ?"Type DO CLIENTLS " STORE 'DO CLIENTLS' TO CHECK DO CHECKC WAIT ERASE ?"Well, that's all &STUDENT.. Remember, as I mentioned in lesson 4, you" ?"can create command procedures by using a line editor, a word processing" ?"package, or the MODIFY COMMAND command in dBASE II." WAIT ERASE ?"Before you QUIT for the last time though, I have a confession to make." ?"I didn't mention or show you all of the dBASE II commands. There are a" ?"few more, but I'm going to let you find out what they do on your own." ?"The commands I haven't mentioned are: COUNT, SUM, TOTAL, CANCEL," ?"CHANGE, EJECT, ERASE, LOOP, and NOTE (but REMARK, which is used in the" ?"CLIENTLS command procedure, is similar to NOTE)." WAIT ERASE ?"Well, it's time to QUIT for the last time. Please enter QUIT." STORE 'QUIT' TO CHECK DO CHECKC RETURN ?" NOTE an ?" NOTE an anguages." ? ?"Every command that has been demonstrated can be placed in command" ?"procedures, which are the same as source programs for other languages." WAIT ERASE ?"In addition to the commands demonstrated so far, dBASE II also has" ?"DO, IF, and macro substitution capability. With these additional" ?"commands, not only do you have full programming capability, quite" ?"literally, you can do things that you would be unable to do, or do as" ?"easily, in conventional programming langSET CONSOLE OFF USE MASTE DELETE ALL PACK STORE 0 TO COUNT DO WHILE COUNT < FNOHOLD STORE COUNT + 1 TO COUNT STORE STR(COUNT,1) TO COUNTX APPEND BLANK STORE !(F&COUNTX.:NAME) TO F&COUNTX.:NAME REPLACE FIELD:NAME WITH F&COUNTX.:NAME REPLACE FIELD:TYPE WITH F&COUNTX.:TYPE REPLACE FIELD:LEN WITH F&COUNTX.:LEN REPLACE FIELD:DEC WITH F&COUNTX.:DEC ENDDO IF FILE("&FILE") USE DELETE FILE &FILE ENDIF USE CREATE &FILE FROM MASTE USE SET CONSOLE ON ERASE ?"You've created &FILE., &STUDENT, and you're ready to USE it." ? ?"Type USE &FILE " STORE 'USE &FILE' TO CHECK DO CHECKC ?"Now DISPLAY the STRUCTURE of &FILE." ? ?"Type DISPLAY STRUCTURE " STORE 'DISPLAY STRUCTURE' TO CHECK DO CHECKC WAIT ERASE ?"There are several ways to add data to a file in dBASE II. You" ?"can APPEND, EDIT, or INSERT data. We're going to use the APPEND" ?"command. EDIT and INSERT work in a similar fashion, and we will use" ?"EDIT in lesson 2. For now, let's use APPEND. Type APPEND and press" ?", and the screen will be formatted to enter data in &FILE.." ?"Enter data into each field, and press to go to the next" ?"field. After you've entered several records, press before" ?"entering data in the first field of the next record. You will then come" ?"back to me, and we will continue the lesson." ? ?"Please don't enter more than 10 records into the file. dBASE II permits" ?"over 65,000 records per file, but that's too much for this example." ? STORE 0 TO AOK DO WHILE AOK = 0 ?"Type APPEND " STORE 'APPEND' TO CHECK DO CHECKC GOTO TOP STORE 0 TO RECCOUNT DO WHILE .NOT. EOF STORE RECCOUNT + 1 TO RECCOUNT SKIP ENDDO IF RECCOUNT = 0 ?"I'm afraid you didn't enter any records onto &FILE.. When the" ?"first entry screen appears, don't press the key immediately." ?"Instead, enter data for at least one of the screens." ? LOOP ELSE STORE 1 TO AOK GOTO TOP ENDIF ENDDO ERASE ?"Now you have some data on your file. You may view the data on &FILE" ?"using the DISPLAY command. A single record may be displayed, or you may" ?"see all of records in the file. DISPLAY, with no qualifier, shows you" ?"the record you are currently working with. DISPLAY ALL displays all" ?"of the records in the file. We're going to display all of the records" ?"in &FILE.." ? ?"Type DISPLAY ALL " STORE 'DISPLAY ALL' TO CHECK DO CHECKC ?"Now let's try a REPORT, &STUDENT.." WAIT ERASE ?"To generate a report, type REPORT and press the key. A file" ?"must be in USE when you do a report, but we are already USING &FILE.." ?"You will be asked for fields to be printed in the REPORT, and the fields" ?"must be within the file currently in USE. Right now, that's &FILE.. I'm" ?"going to DISPLAY the STRUCTURE of &FILE, so you use correct field names" ?"in your report. When you do a report on your own, you should DISPLAY the" ?"STRUCTURE of the file in USE, just like I'm going to do. Otherwise," ?"you're liable to be part way into the report definition, and have to" ?"cancel it because you can't remember how to spell a fieldname." WAIT ERASE DISP STRU ? ?"Type REPORT " STORE 'REPORT' TO CHECK DO CHECKC1 RELEASE PRINTER,DRIVE,TDRIVE,LENGTH,S,L,COMMAL,PARSE1,; PARSE2,PARSE3,PARSE4,PARSERR,END,AOK,RECCOUNT DO TEACH1R WAIT ?"Before you try dBASE II on your own, there is one other thing you should" ?"be aware of. When you make an error entering a command when I'm not" ?"around, dBASE II will not tell you what your mistake was." DO TEACH1S ERASE ?"I'd like you to QUIT now, but after you have, I would like you to try" ?"dBASE II on your own." ? ?"After you've QUIT, please: 1) Start up dBASE II again and enter a date," ?"2) CREATE a file (the same one you did with me if you'd like, 3) USE" ?"the file, 4) DISPLAY it's STRUCTURE, 5) DISPLAY it's contents, 6) prepare" ?"a REPORT, and 7) QUIT dBASE II" ? ?"all without my help, &STUDENT.." ? ?"Type QUIT " USE DELETE FILE &FILE DELETE FILE &RNAME..FRM STORE 'QUIT' TO CHECK DO CHECKC RETURN ?"You've created &FILE., &STUDENT, and you're ready to USE it." ? ?"Type USE &FILE " STORE 'USE &FILE' TO CHECK DO CHECKC ?"Now DISPLAY the STRUCTURE of &FILE." ? ?"Type DISPLAY STRUCTURE " STORE 'DISPLAY STRUCTURE' TO CHECK DO CHECKC WAIT ERASE ?"There are several ways to add data to a file in dBASE II. You" ?"can APPEND, EDIT, or INSERT data. We're going to use the APPEND" ?"command. EDIT and INSERT work in a similar fashion, and we will use" ?"EDIT in lesson 2. For nowERASE ?"Like files, dBASE II names REPORT formats. Like file names, report" ?"format names may not exceed 8 characters." ? ?"Please enter a formname for your REPORT and press the key." ? STORE 0 TO OK DO WHILE OK = 0 ACCEPT 'ENTER REPORT FORM NAME' TO RNAME STORE !(RNAME) TO RNAME IF RNAME = 'QUIT' QUIT ENDIF IF RNAME = ' ' ?"I'm afraid you didn't enter anything. Please try again." LOOP ENDIF STORE TRIM('&RNAME') TO RNAME IF LEN('&RNAME') > 8 ?"I'm afraid you entered a name with more than 8 characters. Please try" ?"again." LOOP ENDIF IF @(' ','&RNAME') # 0 ?"Imbedded blanks are not permitted in the REPORT name. Please try again." LOOP ENDIF STORE RNAME TO T:NAME DO TEACHXC IF T:NAMEOK # 1 LOOP ENDIF STORE 1 TO OK ENDDO ?"Now, dBASE II needs to know three things: 1)The print position of the left" ?"margin of the report (the M specification), 2)The number of lines that can" ?"be contained on one page of the report (the L specification), and 3)The" ?"width of the page in characters, or the right hand margin of the report" ?"(the W specification)." ? ?"If you don't enter these specifications, dBASE II automatically chooses" ?"(by default), M=1, L=60, W=80. We're going to change these defaults," ?"and set M to 1, L to 55, and W to 70." ? ?"Type M=1,L=55,W=70 " STORE 'M=1,L=55,W=70' TO CHECK STORE 'ENTER OPTIONS, M=LEFT MARGIN, L=LINES/PAGE,W=PAGE WIDTH' TO PROMPT DO CHECKC1 ERASE ?"You may optionally specify a page heading on the REPORT. Let's put one" ?"on it." ? ?"Type Y " STORE 'Y' TO CHECK STORE 'PAGE HEADING(Y/N)?' TO PROMPT DO CHECKC1 ?"You may now enter the heading that will appear at the top of each page" ?"of your report. dBASE II will automatically center the page heading for" ?"you. Since this is a name and address report, let's call the report" ?"just that." ? ?"Type NAME AND ADDRESS REPORT " STORE 'ENTER PAGE HEADING' TO PROMPT STORE 'NAME AND ADDRESS REPORT' TO CHECK DO CHECKC1 ERASE ?"Next, dBASE II will ask if you'd like to double space your report, and" ?"if you wish to have numeric fields totaled at the end of the report." ?"Besides report totals, dBASE II permits sub-totaling on a field in your" ?"file. Let's not ask for any totals for this report (they aren't rele-" ?"vant for a name and address file), but if you'd like to try some" ?"totaling after the lesson is over, do that." ? ?"Type Y " STORE 'DOUBLE SPACE REPORT?(Y/N)' TO PROMPT STORE 'Y' TO CHECK DO CHECKC1 ? ?"Type N " STORE 'TOTALS REQUIRED?(Y/N)' TO PROMPT STORE 'N' TO CHECK DO CHECKC1 ERASE ?"Next, dBASE II will ask which fields in &FILE are to be printed on the" ?"REPORT &RNAME.. You may include one or all of the fields in &FILE in the" ?"report. For each field, you must specify the number of print positions" ?"the field will occupy on the report. The width on the report may be less" ?"than the width of the field on the file. For example, if an address" ?"field is 40 characters wide on the file, you could request that it be" ?"printed in only 10 or 15 positions on the report. This automatic" ?"wraparound feature is very nice when there is limited width on your CRT" ?"or printer, and you have large width fields on your file." WAIT ERASE ?"One final caution before you start entering the width and field" ?"specifications for your report. Make sure that the sum of all the field" ?"widths does not exceed the width specified in the report width" ?"specification (W specification, 70 for our report). There is no auto-" ?"matic wraparound facility for this." WAIT ERASE ?"Well, let's give it a try. When prompted, enter the field print width," ?"followed by a comma, followed by the name of the field in &FILE.. Here's" ?"an example for a field called NAME which is 30 characters in width on" ?"the file, but which is to be printed within 20 characters on the report:" ?" 20,NAME" ?"After each field entry, press the key, and after you have entered" ?"all of the fields to be printed, press the RETURN key again. Then you'll" ?"see your report on the display screen." WAIT STORE 0 TO ROK DO WHILE ROK = 0 DO TEACH1R1 ENDDO RETURN ort. Make sure that the sum of all the field" ?"widths does s for your report. Make sure that the sum of all the field" ?"widths does r report. Make sure that the sum of all the field" ?"widths does ur report. Make sure that the sum of all the field" ?"widths does ort. Make sure that the sum of all the field" ?"widths does Make sure that the sum of all the field" ?"widths does . Make sure that the sum of all the field" ?"widths does our report. Make sure that the sum of all the field" ?"widths does STORE 0 TO ROK ure that the sum of all the field" ?"widths does STORE 0 TO ROK ure that the sum of all the field" ?"widths does STORE 0 TO ROK tion), 2)The number of liERASE ?"I'll enter the report specification for the NAME field for you, so you" ?"know how it's done. I'm going to use the wraparound feature and print" ?"NAME in 15 positions even though the field is 30 characters wide." ? ?"COL WIDTH,CONTENTS" STORE 1 TO RCOUNT STORE 0 TO OK STORE 0 TO FIRST DO WHILE OK = 0 IF RCOUNT = 1 ?" 1:15,NAME" ? ?"Press the key, and I'll enter it." SET CONSOLE OFF WAIT SET CONSOLE ON ENDIF STORE STR(RCOUNT,1) TO RCOUNTX IF RCOUNT # 1 IF FIRST = 0 STORE 1 TO FIRST ?"You're on your own now to enter fields and headings on your report." ?"Good luck &STUDENT.." ENDIF IF RCOUNT > 3 ?"I believe you have entered all of the fields for the report. Please press" ?"the key to continue." WAIT STORE 1 TO OK LOOP ENDIF ACCEPT ' &RCOUNTX' TO R&RCOUNTX IF !(R&RCOUNTX) = 'QUIT' QUIT ENDIF ELSE STORE '15,NAME' TO R&RCOUNTX ENDIF IF R&RCOUNTX = ' ' STORE 1 TO OK LOOP ENDIF STORE TRIM(R&RCOUNTX) TO R&RCOUNTX STORE !(R&RCOUNTX) TO R&RCOUNTX STORE @(',',R&RCOUNTX) TO COMMA IF COMMA = 1 ?"A comma cannot be the first character in a report field specification." ?"Please try again." LOOP ENDIF STORE COMMA + 1 TO COMMAN IF COMMA = 0 ?"You didn't enter a comma between the width and contents specifications." ?"Please try again." LOOP ENDIF STORE LEN(R&RCOUNTX) TO LR STORE LR - COMMA TO LR STORE @(',',$(R&RCOUNTX,COMMAN,LR)) TO COMMA2 IF COMMA2 # 0 ?"I,m afraid you entered more than 1 comma. Please try again." LOOP ENDIF STORE $(R&RCOUNTX,COMMAN,LR) TO FHNAME STORE 0 TO RLOOP DO WHILE RLOOP < FNOHOLD STORE RLOOP + 1 TO RLOOP STORE STR(RLOOP,1) TO RLOOPX IF $(R&RCOUNTX,COMMAN,LR) = F&RLOOPX.:NAME STORE 1 TO FOUND STORE FNOHOLD TO RLOOP ELSE STORE 0 TO FOUND ENDIF ENDDO IF FOUND # 1 ?"I'm afraid the fieldname &FHNAME does not exist on &FILE." STORE 0 TO RLOOP1 ?"Valid field name(s) is/are:" DO WHILE RLOOP1 < FNOHOLD STORE RLOOP1 + 1 TO RLOOP1 STORE STR(RLOOP1,1) TO RLOOPX STORE F&RLOOPX.:NAME TO HLDNAME ?" &HLDNAME" ENDDO LOOP ELSE STORE $(R&RCOUNTX,1,COMMA -1) TO R&RCOUNTX.LEN STORE VAL(R&RCOUNTX.LEN) TO R&RCOUNTX.LENN IF R&RCOUNTX.LENN > 99 STORE STR(R&RCOUNTX.LENN,3) TO RLENGTH ELSE IF R&RCOUNTX.LENN > 9 STORE STR(R&RCOUNTX.LENN,2) TO RLENGTH ELSE STORE STR(R&RCOUNTX.LENN,1) TO RLENGTH ENDIF ENDIF IF RLENGTH # R&RCOUNTX.LEN ?"The width must be numeric. Please try again." LOOP ENDIF IF R&RCOUNTX.LENN < 1 .OR. R&RCOUNTX.LENN > 254 ?"The width must be a number between 1 and 254. Please try again." LOOP ENDIF IF RCOUNT = 1 ?"I'll enter the heading for the NAME field for you." ?"ENTER HEADING: NAME OF PERSON." ? ?"Please press the key." STORE 'NAME OF PERSON' TO H&RCOUNTX SET CONSOLE OFF WAIT SET CONSOLE ON ENDIF IF RCOUNT # 1 ?"Now enter the report column heading for the &FHNAME field." ACCEPT 'ENTER HEADING' TO H&RCOUNTX IF !(H&RCOUNTX) = 'QUIT' QUIT ENDIF ENDIF ENDIF STORE RCOUNT + 1 TO RCOUNT ENDDO STORE 0 TO TOTLEN STORE 1 TO COUNT DO WHILE COUNT < RCOUNT STORE STR(COUNT,1) TO COUNTX STORE R&COUNTX.LENN + TOTLEN TO TOTLEN STORE COUNT + 1 TO COUNT ENDDO IF TOTLEN > 70 ?"I'm afraid the sum of the print field widths is greater than 70 (for" ?"this report, we set the report width to 70). You'll have to enter them" ?"again." WAIT RETURN ENDIF ?"I've got to put your report away now. dBASE II won't take as long as I" ?"do to show you your report, but I'm a little slower. I'll be back in a" ?"few moments." WAIT USE MASTE DELETE ALL PACK APPEND BLANK REPLACE FIELD:NAME WITH 'FIELD' REPLACE FIELD:TYPE WITH 'C' REPLACE FIELD:LEN WITH 80 REPLACE FIELD:DEC WITH 0 IF FILE("T1RDBF") DELETE FILE T1RDBF ENDIF CREATE T1RDBF FROM MASTE USE T1RDBF APPEND BLANK REPLACE FIELD WITH 'M=1,L=55,W=70' APPEND BLANK REPLACE FIELD WITH 'Y' APPEND BLANK REPLACE FIELD WITH ' NAME AND ADDRESS REPORT' APPEND BLANK REPLACE FIELD WITH 'Y' APPEND BLANK REPLACE FIELD WITH 'N' STORE 0 TO FRCOUNT DO WHILE FRCOUNT < RCOUNT - 1 STORE FRCOUNT + 1 TO FRCOUNT STORE STR(FRCOUNT,1) TO FRCOUNTX APPEND BLANK REPLACE FIELD WITH R&FRCOUNTX APPEND BLANK REPLACE FIELD WITH H&FRCOUNTX ENDDO COPY TO &RNAME..FRM SDF USE &FILE REPORT FORM &RNAME ?"Nice report, &STUDENT!" WAIT ERASE ?"Once you've created a report, you can request it again, without" ?"re-entering the report specifications, by referring to it's formname." ?"In our example, that's &RNAME.. Let's see the report one more time." ? ?"Type REPORT FORM &RNAME " STORE 'REPORT FORM &RNAME' TO CHECK DO CHECKC1 REPORT FORM &RNAME WAIT ERASE ?"By adding the phrase TO PRINT to the report request, you can direct the" ?"report to the printer, and it will appear on the CRT and the printer." ?"In our example, the command would be: REPORT FORM &RNAME TO PRINT." STORE 1 TO ROK RETURN e ra ?"Nice raE ?"Nice raME ?"Nice ra ?"Nice ra ?"Nice ra report, you can request it again, without" ?"re-entering the report specifica- tions, by referring to it's formname." ?"In our example, that's &RNAME. Let's see the report one more time." o put your report away now. dBASEII won't take as long as I" ?"do to show you your report, but I'm a little slower. I'll ?"Nice ra ?"Nice ra ?"Nice ra report, you can request it again, without" ?"re-entering the report specifica- tions, by referring to it's formname." ?"In our example, that's &RNAME. Let's see the report one more time." o put your report away now. dBASEII won't take as long as I" ?"do to show you your report, but I'm a little slower. I'll o put your report away now. dBASEII won't take as long as I" ?"do to show you your report, but I'm a little slower. I'll STORE STR(FRCOUNT,1) TO FRCOUNTX APPEND BLANK REPLACE FIELD WITH R&FRCOUNTX APPEND BLANK STORE STR(FRCOUNT,1) TO FRCOUNTX APPEND BLANK REPLACE FIELD WITH R&FRCOUNTX APPEND BLANK COUNT + 1 TO RCOUNT ENDDO STORE 0 TO TOTLEN STORE 1 TO COUNT DO WHILE COUNT < RCOUNT STORE STR(COUNT,1) TO COUNTX STORE R&COUNTX.LENN + TOTLEN TO TOTLEN STORE COUNT + 1 TO COUNT ENDDO IF TOTLEN > 70 ?"I'm afraid the sum of the print field widths is greater than 70 (for" ?"this reWAIT ERASE ?"Instead, an error message similar to the one below will appear." ? ?" *** SYNTAX ERROR ***" ?" ?" ?" command" ? ?"CORRECT AND RETRY?(Y/N)" ? ?"You then have the opportunity to correct the command if you wish." ?"Try this example. Let's say that you misspell USE when you wish to USE" ?"&FILE.. Instead of entering USE &FILE, you enter UES &FILE.." ? ?"Type UES &FILE " STORE 'UES &FILE' TO CHECK DO CHECKC1 ?"*** SYNTAX ERROR ***" ?" ?" ?" &COMMAND" ?"CORRECT AND RETRY? (Y/N)" WAIT ERASE ?"If you enter a Y, some messages will appear that are shown to give you" ?"the opportunity to change characters within the command. In our case," ?"we want to change the letters ES to SE, so USE is spelled properly." ?"Give it a try, &STUDENT.." ? ?"Type Y " STORE 'Y' TO CHECK STORE 'CORRECT AND RETRY (Y/N)?' TO PROMPT DO CHECKC1 ?"Now, dBASE II will display the message CHANGE FROM:. At this point, it" ?"wants to know which characters in the command have to be changed. For" ?"you, it's the letters ES." ? ?"Type ES " STORE 'ES' TO CHECK STORE 'CHANGE FROM' TO PROMPT DO CHECKC1 WAIT ERASE ?"Then dBASE II will display the message CHANGE TO: For us, ES has to be" ?"changed to SE." ? ?"Type SE " STORE 'SE' TO CHECK STORE 'CHANGE TO' TO PROMPT DO CHECKC1 WAIT ERASE ?"Then, dBASE II will display the corrected command, like this:" ? ?"USE &FILE" ? ?"Then dBASE II will ask if any more corrections are desired. We have no" ?"more to make, since the command is OK now, so you should enter N." ? ?"Type N " STORE 'N' TO CHECK STORE 'MORE CORRECTIONS' TO PROMPT DO CHECKC1 WAIT ERASE ?"Sometimes, it's easier to re-enter the entire command, rather than go" ?"through the CHANGE FROM, CHANGE TO procedure. To do this, respond N" ?"when the CORRECT AND RETRY (Y/N) message is displayed. A period (.) will" ?"then be displayed, and the command can be re-entered in it's entirety." ? ?"Generally, a spelling error is the cause of a SYNTAX ERROR message, so" ?"be very careful how you spell things. Some other frequent causes of" ?"errors are field names being used when they do not exist on the file" ?"being USEd, and attempting to USE a file which is not on the disk drive" ?"that dBASE II programs are on. For example, if dBASE II was initiated on" ?"drive B:, and &FILE is on drive A:, we would have had to enter USE" ?"A:&FILE in our example above." WAIT ERASE ?"One final thing for this lesson. To leave dBASE II, and return to the" ?"operating system, the QUIT command is used." WAIT ERASE RETURN is displayed. A period (.) will" ?"then be displayed, and the command can be re-entered in it's entirety." ? ?"GeneralERASE ?"In lesson 1, you learned how to CREATE a file, APPEND data to it, DISPLAY" ?"its STRUCTURE and contents, generate a REPORT, correct syntax errors," ?"and QUIT dBASE II." ? ?"In this second lesson, you will learn how to EDIT data in a file, DELETE" ?"records from a file, RECALL records which have been deleted, REPLACE" ?"the contents of fields, and also, how to position yourself in a file by" ?"using GO and SKIP commands. For this lesson, we'll use a name and" ?"address file that contains the names and addresses of some of my" ?"friends." ? ?"You can name the file. Remember, the name cannot exceed 8 characters." STORE 0 TO OK DO WHILE OK = 0 ? ACCEPT "Enter the filename" TO FILE STORE !(FILE) TO FILE IF FILE = 'QUIT' QUIT ENDIF IF LEN("&FILE") > 8 ?"Filename cannot exceed 8 characters. Please try again." LOOP ENDIF IF FILE = ' ' ?"You didn't enter a filename. Please try again." LOOP ENDIF IF @(' ','&FILE') # 0 ?"Imbedded blanks are not permitted in the filename. Please try again." LOOP ENDIF STORE FILE TO T:NAME DO TEACHXC IF T:NAMEOK # 1 LOOP ENDIF STORE 1 TO OK ENDDO USE TUTNABK COPY TO &FILE WAIT ERASE ?"You can now start USEing &FILE.. Remember the format of the USE command?" ?"In case you don't, I'll refresh your memory. Format of the USE command is:" ? ?" USE filename" ? ?"In this case, the command is USE &FILE.." ? ?"Type USE &FILE " STORE 'USE &FILE' TO CHECK DO CHECKC WAIT ERASE ?"Now, see what the structure of &FILE is." ? ?"Type DISPLAY STRUCTURE " STORE 'DISPLAY STRUCTURE' TO CHECK DO CHECKC ?"Now, DISPLAY ALL the records in &FILE.." ? ?"Type DISPLAY ALL " STORE 'DISPLAY ALL' TO CHECK DO CHECKC WAIT ERASE ?"Let's EDIT some records, to change the contents of some fields" ?"within the records. We'll start with record 1, but you may EDIT" ?"more records by pressing the key after editing the last field" ?"in a record. When you press the key while positioned at the" ?"the last field in a record, dBASE II will position you at the first" ?"field of the next record. You may then EDIT that record, or press" ?"the CONTROL (ctrl) and W keys at the same time to discontinue the" ?"EDIT." ? ?"NOTE: There are a number of ctrl functions to position the cursor while" ?"in EDIT (or BROWSE, APPEND, MODIFY, and other full screen commands)." ?"The dBASE II reference card which is packaged with dBASE II LESSONS" ?"contains a diagram and explanation of all keys, and their functions." ?"Please look at that section of the reference card now." WAIT ERASE ?"Type EDIT 1 " STORE 'EDIT 1' TO CHECK DO CHECKC ERASE ?"Let's DISPLAY the data in &FILE now, so you can see it with the" ?"changes you made." ? ?"Type DISPLAY ALL " STORE 'DISPLAY ALL' TO CHECK DO CHECKC DO TEACH2R ERASE ?"To look at the last record, use the GOTO command followed by the" ?"the DISPLAY command." ? ?"Type GOTO BOTTOM " STORE 'GOTO BOTTOM' TO CHECK DO CHECKC ?"Now, type DISPLAY " STORE 'DISPLAY' TO CHECK DO CHECKC ?"Now let's DELETE the last record." ? ?"Type DELETE " STORE 'DELETE' TO CHECK DO CHECKC WAIT ERASE ?"Now, let's DISPLAY ALL the records on &FILE.." ? ?"Type DISPLAY ALL " STORE 'DISPLAY ALL' TO CHECK DO CHECKC ?"Notice the * in the first position of the last record. That means it's" ?"flagged for deletion. Any record flagged for deletion will be" ?"physically deleted from the file when a PACK command is executed. Let's" ?"get rid of that last record." WAIT ERASE ?"Type PACK ." STORE 'PACK' TO CHECK DO CHECKC ? ?"Type DISPLAY ALL " STORE 'DISPLAY ALL' TO CHECK DO CHECKC ?"Notice the last record is no longer there. You can do that to any" ?"record with the DELETE command." WAIT ERASE ?"You can RECALL records flagged for deletion, &STUDENT, with the RECALL" ?"command. Let's try it. First, you will have to DELETE a record, then" ?"do a DISPLAY to see that it was flagged for deleteion, then, RECALL it." ?"Do a final DISPLAY to see that it is no longer flagged for deletion." ? ?"Type DELETE " STORE 'DELETE' TO CHECK DO CHECKC DO TEACH21 RETURN CHECK DO CHECKC DO TEACH21 RETURN SE ?"Now, let's look at the last record. The GOTO coSE ?"Now, let's look at the last record. The GOTO coSE ?"Now, let's look at the last record. The GOTO cole when a PACK command is executed. Let's" ?"get rid of that last record." WAIT le when a PACK command is executed. Let's" ?"get rid of that last record." WAIT le when a PACK command is executed. Let's" ?"get rid of that last record." WAIT TRUCTURE " STORE 'DISPLAY STRUCTURE' TO CHECK DO CHECKC ?"Now, DISPLAY ALL the records in &FILE.." ? ?"Type DISPLAY ALL " STORE 'DISPLAY ALL' TO CHECK DO CHECKC WAIT ERASE ?"Let's EDIT some records, to change the contents of some fields" ?"within the records. We'll start with record 1, but you may EDIT" ?"more records by pressing the key after editing the last ?"Now, let's see if the record is flagged for deletion." ? ?"Type DISPLAY ALL " STORE 'DISPLAY ALL' TO CHECK DO CHECKC ?"The record is flagged for deletion. Let's get it back." WAIT ERASE ?"Type RECALL " STORE 'RECALL' TO CHECK DO CHECKC ? ?"Now, type DISPLAY ALL " STORE 'DISPLAY ALL' TO CHECK DO CHECKC WAIT ERASE ?"Only one more thing in this lesson. You can SKIP forward and backward" ?"in a dBASE II file. Let's GOTO the first record in &FILE, and then" ?"SKIP to the second record." ? ?"Type GOTO TOP " STORE 'GOTO TOP' TO CHECK DO CHECKC ? ?"Now, type SKIP " STORE 'SKIP' TO CHECK DO CHECKC ? ?"Now, type DISPLAY " STORE 'DISPLAY' TO CHECK DO CHECKC ?"That's what record 2 looks like. You can also SKIP backwards any number" ?"of records by preceding the number of records to be SKIPped with a" ?"minus (-) sign." WAIT ERASE ?"Let's go back 1 record to the first record in the file." ? ?"Type SKIP - 1 " STORE 'SKIP - 1' TO CHECK DO CHECKC ?"Now, DISPLAY the first record, &STUDENT.." ? ?"Type DISPLAY " STORE 'DISPLAY' TO CHECK DO CHECKC ?"And that's it for lesson 2. After you QUIT this time, get back into" ?"dBASE II and practice with EDIT (and INSERT and BROWSE, which are other" ?"commands for data editing), DELETE, RECALL, REPLACE, GOTO, and SKIP." ?"I'm going to go away now." USE DELETE FILE &FILE ? ?"Type QUIT " STORE 'QUIT' TO CHECK DO CHECKC RETURN C C  ?"Now, let's see if the record is flagged for deletion." ? ?"Type DISPLAY ALL " STORE 'DISPLAY ALL' TO CHECK DO CHECKC ?"The record is flagged for deletion. Let's get it back." WAIT ERASE ?"Type RECALL " STORE 'RECALL' TO CHECK DO CHECKC ? ?"Now, type DISPLAY ALL " STORE 'DISPLAY ALL' TO CHECK DO CHECKC WAIT ERASE ?"Only one more thing in this lesson. You can SKIP forward and backward" ?"in a dBASE II file. Let's GOTO the first record in &FILE, and then" ?"SKIP to the second record." ? ?"Type GOTO TOP " STORE 'GOTO TOP' TO CHECK DO CHECKC ? ?"Now, type SKIP " STORE 'SKIP' TO CHECK DO CHECKC ? ?"Now, type DISPLAY " STORE 'DISPLAY' TO CHECK DO CHECKC ?"That's what record 2 looks like. You can also SKIP backwards any number" ?"of records by preceding the number of records to be SKIPped with a" ?"minus (-) sign." WAIT ERASE ?"Let's go back 1 record to the first record in the file." ? ?"Type SKIP -1 " STORE 'SKIP -1' TO CHECK DO CHECKC ?"Now, DISPLAY the first record, &STUDENT.." ? ?"Type DISPLAY " STORE 'DISPLAY' TO CHECK DO CHECKC ?"And that's it for lesson 2. After you QUIT this time, get back into" ?"dBASE II and practice with EDIT (and INSERT and BROWSE, which are other" ?"commands for data editing), DELETE, RECALL, REPLACE, GOTO, and SKIP." ?"I'm going to go away now." USE DELETE FILE &FILE ? ?"Type QUIT " STORE 'QUIT' TO CHECK DO CHECKC RETURN C C  WAIT ERASE ?"There's another way to change data in fields besides the EDIT command." ?"Unlike EDIT, the REPLACE command does not build a screen for you. It" ?"changes the field specified in the REPLACE command. I've positioned" ?"&FILE to the first record. Let's see what it contains, &STUDENT.." GOTO TOP ? ?"Type DISPLAY " STORE 'DISPLAY' TO CHECK DO CHECKC WAIT ERASE ?"Let's REPLACE the field NAME with your name, &STUDENT.. To do that" ?"type:" ? ?" REPLACE NAME WITH '&STUDENT' " ? ?"Notice the quotes around &STUDENT.. Since NAME is a character field," ?"quotation marks are necessary. Quotes are not required for numeric" ?"fields, however. Let's give it a try." STORE 0 TO OK DO WHILE OK = 0 ? ?"Type REPLACE NAME WITH '&STUDENT' " STORE "REPLACE NAME WITH '&STUDENT'" TO CHECK DO CHECKC ?"Now, let's DISPLAY the record to see the change." ? ?"Type DISPLAY " STORE 'DISPLAY' TO CHECK DO CHECKC WAIT RETURN ich are other" ?"commands for data editing), DELETE, RECALL, REPLACE, GOTO, and SKIP." ?"I'm going to go away now." USE DELETE FILE &FILE ? ?"Type QUIT " STORE 'QUIT' TO CHECK DO CHECKC RETURN ERASE ?"In lesson 2, you learned how to edit data in files using the EDIT," ?"DELETE, RECALL, and REPLACE commands. You also learned how to" ?"position the dBASE II record pointer using the GOTO and SKIP" ?"commands." ? ?"In lesson 3, we're going to learn about 'scope' and 'for' specifications" ?"in dBASE II. 'Scope' is used to tell dBASE II whether the current," ?"next n, or all records within a file are to be considered in the" ?"execution of a command. 'For' specifies which groups or sets of" ?"records are to be considered in the execution of a command. 'Scope'," ?"and 'for' can be used individually, or in the same command with each" ?"other." ? ?"You'll recall in lesson 2 that we used the command DISPLAY ALL to" ?"display all of the records in a file. ALL is a 'scope' qualifier. Had" ?"we just said DISPLAY, only the current record in the file would have" ?"been displayed. With ALL, everyone of the records in the file were" ?"displayed." ? WAIT ERASE ?"'Scope' has 3 possibilities. If it is omitted, only the current record" ?"is processed by the command. If ALL is specified, all records in the" ?"file in USE are processed. If NEXT n (where n is a number) is" ?"specified, the next n records are processed by the command." ? ?"Let's try some examples. I have a name and address file saved that we" ?"can use for this lesson. It's the same file we used in lesson 2. If" ?"you'll name it for me, we can use it again." ? STORE 0 TO OK DO WHILE OK = 0 ACCEPT "Enter the filename " to FILE STORE !(FILE) TO FILE IF FILE = 'QUIT' QUIT ENDIF IF LEN("&FILE") > 8 ?"Filename may not exceed 8 characters. Please try again." LOOP ENDIF IF FILE = ' ' ?"You didn't enter a filename. Please try again." LOOP ENDIF IF @(' ','&FILE') # 0 ?"Imbedded blanks are not permitted in the filename. Please try again." LOOP ENDIF STORE FILE TO T:NAME DO TEACHXC IF T:NAMEOK # 1 LOOP ENDIF STORE 1 TO OK ENDDO WAIT SET CONSOLE OFF USE TUTNABK COPY TO &FILE SET CONSOLE ON ERASE ?"First, tell dBASE II to USE &FILE.." ? ?"Type USE &FILE " STORE 'USE &FILE' TO CHECK DO CHECKC ?"Now DISPLAY the first 3 records in &FILE.." ? ?"Type DISPLAY NEXT 3 " STORE 'DISPLAY NEXT 3' TO CHECK DO CHECKC ?"Now let's DELETE the first 4 records in &FILE.. GOTO the TOP of" ?"&FILE.." ? ?"Type GOTO TOP " STORE 'GOTO TOP' TO CHECK DO CHECKC ? ?"Now, type DELETE NEXT 4 " STORE 'DELETE NEXT 4' TO CHECK DO CHECKC WAIT ERASE ?"Now let's DISPLAY ALL of the records again." ? ?"Type DISPLAY ALL " STORE 'DISPLAY ALL' TO CHECK DO CHECKC ?"Notice that the first 4 records are flagged for deletion." WAIT ERASE ?"To 'unflag' them you can RECALL ALL, or RECALL NEXT 4 (only after you" ?"GOTO TOP). RECALL ALL." ? ?"Type RECALL ALL " STORE 'RECALL ALL' TO CHECK DO CHECKC ? ?"Now, type DISPLAY ALL " STORE 'DISPLAY ALL' TO CHECK DO CHECKC ?"The first 4 records have been RECALLed." WAIT ERASE DO TEACH3F RETURN nd. 'Scope'," ?"and 'for' can be used individually, or in the same command with each" ?"other." ? ?"You'll recall in lesson 2 that we used the command DISPLAY ALL to" ?"display all of the records in a file. ALL is a 'scope' qualifier. Had" ?"we just said DISPLAY, only the current record in the file would have" ?"been displayed. With ALL, everyone of the records in the file were" ?"displayed." ? WAIT ERASE ?"'Scope' has 3 possibilitiesWAIT ERASE ?"Everything you have learned so far is nice, but what's a computer" ?"without computations? dBASE II can compute very well. It can add," ?"subtract, multiply, and divide. I've made a file to illustrate how" ?"computations work in dBASE II. Please be aware, however, that " ?"computations are not limited to the contents of files. Computations" ?"can be performed on memory variables, they can be performed right" ?"on the screen, and can be used within expressions (you'll learn" ?"what all of these things are in future lessons). For now though, we'll" ?"see how can they can be used with the things you've learned." ? ?"I've CREATEd a file called COMPUTE, which contains payroll information" ?"for some of the people in the White House." WAIT ERASE ?"This is what the structure of the file looks like." USE COMPUTE DISP STRU ?"I also created a report to print the file, and show some totals of the" ?"information. I'll print the report for you." WAIT TO WAITM REPLACE ALL TAXES WITH 0 REPLACE ALL NETSALARY WITH 0 REPORT FORM COMPUTE ?"Notice that the TAXES and NET SALARY fields contain zeroes. You're going" ?"to perform some computations to place amounts in these fields." WAIT ERASE ?"Using the REPLACE command, we're going to compute TAXES by multiplying the" ?"SALCLASS field by .06, and then multiplying the MONTHSAL field by that" ?"product. The * in the REPLACE command indicates multiplication." ? ?"Type REPLACE ALL TAXES WITH ((SALCLASS * .06) * MONTHSAL) " STORE 'REPLACE ALL TAXES WITH ((SALCLASS * .06) * MONTHSAL)' TO CHECK DO CHECKC ? ?"Now, you're going to compute NETSALARY by subtracting TAXES from MONTHSAL." ? ?"Type REPLACE ALL NETSALARY WITH MONTHSAL - TAXES " STORE 'REPLACE ALL NETSALARY WITH MONTHSAL - TAXES' TO CHECK DO CHECKC ? ?"Finally, you're going to compute YTDSALARY (year-to-date salary) by" ?"adding NETSALARY to YTDSALARY." ? ?"Type REPLACE ALL YTDSALARY WITH YTDSALARY + NETSALARY " STORE 'REPLACE ALL YTDSALARY WITH YTDSALARY + NETSALARY' TO CHECK DO CHECKC WAIT ERASE ?"Now, &STUDENT, print the report with the computed fields in the file." ? ?"Type REPORT FORM COMPUTE " STORE 'REPORT FORM COMPUTE' TO CHECK DO CHECKC ? ?"The only computation facility you didn't use was divide. A '/' is used to" ?"perform that operation.?" RETURN - date salary) by adding NETSALARY to YTDSALARY. The" ?"command to do that looks like this: REPLACE ALL YTDSALARY WITH YTDSALARY" ?"+ NETSALARY The + indicates addition. Now, I'll do all that, an- date salary) by adding NETSALARY to YTDSALARY. The" ?"command to do that looks like this: REPLACE ALL YTDSALARY WITH YTDSALARY" ?"+ NETSALARY The + indicates addition. Now, I'll do all that, an ry variables, they can be performed right" ?"on the screen, and can be used within expressions (you'll learn" ?"what ERASE ?"As I mentioned earlier, the 'for' clause is used to specify groups or" ?"sets of records, and may be used by itself or in conjunction with a" ?"'scope' specification. &FILE has a field called NAME in it. We can" ?"use it to demonstrate the 'for' clause. NAME is a character field, but" ?"numeric and logical fields can be used in a similar fashion." GOTO TOP STORE NAME TO F1 STORE TRIM(F1) TO F1 ?"The field NAME in record 1 of &FILE contains:" ? ?" &F1" WAIT ERASE ?"Now, try a 'for' clause with a DISPLAY ALL. You will display all" ?"records, but only if NAME is equal to &F1.." STORE '=' TO OP DO TEACH3F1 WAIT ERASE ?"To DISPLAY ALL if NAME is not equal to &F1," ?"the command changes slightly." STORE '#' TO OP DO TEACH3F1 WAIT ERASE ?"And, to DISPLAY ALL if NAME is less than &F1," ?"the command changes slightly again." STORE '<' TO OP DO TEACH3F1 WAIT ERASE ?"The 'scope' specification could be NEXT n, rather than ALL. Besides" ?"equal to (=), not equal to (#), and less than (<), the 'for' clause" ?"can contain the following operators:" ? ?" greater than - >" ? ?" greater than or equal to - >=" ? ?" less than or equal to - <= or" ? ?" substring equal to - $" ? DO TEACH3C WAIT ERASE ?"Well, that's it for 'scope', 'for', and computations. After you QUIT" ?"this time, try some 'scope' and 'for' exercises on your own. Do some" ?"computations if you'd like to." WAIT ERASE ?"You can use 'scope' and 'for' with the following commands:" ?" CHANGE" ?" COPY" ?" COUNT" ?" *DELETE" ?" *DISPLAY" ?" LOCATE" ?" *REPLACE" ?" *RECALL" ?" *REPORT" ?" SUM and" ?" TOTAL" ? ?"An asterisk (*) precedes the commands we have covered so far." WAIT ERASE ?"The only restriction for use of 'scope' and 'for' applies to the" ?"REPORT command. ALL is assumed as scope, NEXT n may be specified, and" ?"current record is not permitted. This applies to the REPORT command" ?"only." WAIT ERASE USE DELETE FILE &FILE ?"And that's the end of lesson 3. QUIT, and I'll return you to the operating" ?"system." ? ?"Type QUIT " STORE 'QUIT' TO CHECK DO CHECKC RETURN WAIT ERASE ?"Well, that's it for 'scope', 'for', and computations. After you QUIT" WAIT ERASE ?"Well, that's it for 'scope', 'for', and computations. After you QUIT" WAIT ERASE ?"Well, that's it for 'scope', 'for', and computations. After you QUIT" WAIT ERASE ?"Well, that's it for 'scope', 'for', and computations. After you QUIT" ? ?" greater than or equal to - =>" ? ?" less than or equal to - =< or" ? ?" substring equal to - $" ? ?"If you're not familiar with substring pr ? ?" greater than or equal to - =>" ? ?" less than or equal to - =< or" ? ?" substring equal to - $" ? ?"If you're not familiar with substring prssumed as scope, NEXT n may be specified, and" ?"current record is not permitted. This applies to the REPORT command" ?"only." WAIT " ?"use it to demonstrate the 'for' clause. NAME is a character field, but" ?"numeric and logical fields can be used in a similar fashion." GOTO TOP STORE NAME TO F1 STORE TRIM(F1) TO F1 ?"The field NAME in record 1 of &FILE contains:" ? ?" &F1" WAIT ERASE ?"Now, try a 'for?"Here's how you tell dBASE II to do that." ? ?"Type DISPLAY ALL FOR NAME &OP '&F1' " STORE "DISPLAY ALL FOR NAME &OP '&F1'" TO CHECK DO CHECKC RETURN ARY (year-to-date salary) by" ?"adding NETSALARY to YTDSALARY." ? ?"Type REPLACE ALL YTDSALARY WITH YTDSALARY + NETSALARY " STORE 'REPLACE ALL YTDSALARY WIERASE ?"In lesson 3, &STUDENT, you learned how to use scope and for clauses," ?"and how to perform computations in dBASE II. In lesson 4, you're" ?"going to see how files can be placed in order, and how data on files" ?"can be located randomly. Record keys and indices are used to" ?"accomplish these tasks." SET CONSOLE OFF DELETE FILE EMPMAST DELETE FILE EMPNOIND DELETE FILE NAMEIND.NDX USE EMPBAK COPY TO EMPMAST SET CONSOLE ON WAIT ERASE ?"First, what is a key, or more properly a key field? A key is a data" ?"item which uniquely identifies a record on a file. It, therefore, can be" ?"used to FIND a record, without having to scan through every record on" ?"the file. A typical example is a company payroll file, which has a key" ?"field EMPNO (employee number). Other information on the file might be" ?"LASTNAME (the employee's last name), DEPTNO (department number), JOBCLASS" ?"(a job classification number to indicate the type of work this employee" ?"does), and TAXCLASS and GROSSSAL for tax deduction and gross salary" ?"information. As we shall see in future dBASE II LESSONS, the" ?"key fields in files can be used to JOIN files into complete data bases." WAIT ERASE ?"I just happen to have a file like the one I just described. I've called" ?"the file EMPMAST (EMPloyee MASTer). Please issue the command to use it." ? STORE 'USE EMPMAST' TO CHECK DO CHECKC ?"Now, display its structure." ? STORE 'DISPLAY STRUCTURE' TO CHECK DO CHECKC WAIT ERASE ?"Now, I'd like you to display all of the records on EMPMAST." ? STORE 'DISPLAY ALL' TO CHECK DO CHECKC ?"Very good &STUDENT.." ? ?"Notice that the records are not in order by the employee number (EMPNO)." WAIT ERASE ?"There are two ways to put the records in order by employee number" ?"(EMPNO). You can INDEX the records, or you can SORT them. You'll SORT" ?"in a future lesson. Right now, you're going to INDEX them." ? ?"Type INDEX ON EMPNO TO EMPNOIND " STORE 'INDEX ON EMPNO TO EMPNOIND' TO CHECK DO CHECKC ?"The file EMPNOIND now contains key information for all records in the" ?"file EMPMAST. If we USE EMPMAST in conjunction with its INDEX file" ?"EMPNOIND, it will appear that all of the records on EMPMAST are in" ?"order by employee number." WAIT ERASE ?"Type USE EMPMAST INDEX EMPNOIND " STORE 'USE EMPMAST INDEX EMPNOIND' TO CHECK DO CHECKC ? ?"Now, type DISPLAY ALL " STORE 'DISPLAY ALL' TO CHECK DO CHECKC ? ?"Notice &STUDENT, that the records are in sequence by employee number." ? ?"Now, let's try to FIND a record. You may specify any employee number" ?"that exists on EMPMAST. You pick the number." ? ?"Type FIND n, where n is an employee number, and press " STORE 0 TO OK DO WHILE OK = 0 ACCEPT TO COMMAND IF !(COMMAND) = 'QUIT' QUIT ENDIF IF $(!(COMMAND),1,5) # 'FIND ' ?"FIND followed by a blank, must be the first 5 characters in the command." ?" Please try again." LOOP ELSE &COMMAND IF # = 0 ?"I'm afraid that employee number does not exist. Please try it again." LOOP ELSE STORE 1 TO OK ENDIF ENDIF ENDDO ? ?"Now, DISPLAY the record." STORE 'DISPLAY' TO CHECK DO CHECKC WAIT ERASE ?"Later versions of dBASE II permit up to 7 indices of a file to be active" ?"at one time. I'm going to assume that you do not have a recent version," ?"and permit only one index to be active." ? ?"Let's, index the file EMPMAST on another field though (the LASTNAME field)" ?"to see how that works. Since LASTNAME may not be unique (that is, there" ?"may be several SMITH records), we'll FIND SMITH, and then SKIP to see if" ?"there are more." ? ?"Type USE EMPMAST " STORE 'USE EMPMAST' TO CHECK DO CHECKC WAIT ERASE ?"Now, type INDEX ON LASTNAME TO NAMEIND " STORE 'INDEX ON LASTNAME TO NAMEIND' TO CHECK DO CHECKC ? ?"Now, type USE EMPMAST INDEX NAMEIND " STORE 'USE EMPMAST INDEX NAMEIND' TO CHECK DO CHECKC ? ?"Now, DISPLAY ALL " STORE 'DISPLAY ALL' TO CHECK DO CHECKC ?"Now the records on EMPMAST are in order by last name." WAIT ERASE ?"Now, type FIND SMITH " STORE 'FIND SMITH' TO CHECK DO CHECKC ? ?"Type DISPLAY " STORE 'DISPLAY' TO CHECK DO CHECKC ?"There's the first SMITH record." ? ?"Now, SKIP " STORE 'SKIP' TO CHECK DO CHECKC ?"Now, DISPLAY " STORE 'DISPLAY' TO CHECK DO CHECKC ? ?"And, there's the second SMITH record." WAIT DO TEACH4L ERASE ?"And that's all for INDEX, FIND, LOCATE, and CONTINUE. I want you to QUIT" ?"now, and try these commands on your own. Try some of the Boolean" ?"operators with any command that permits use of the FOR phrase as well." STORE 'QUIT' TO CHECK DO CHECKC RETURN ?"Now, DISPLAY ALL" ?"Now, DISPLAY ALL" ?"Now, DISPLAY ALL" ecord. You may specify any employee number" ?"that exists on EMPMAST. You pick the number." ? ?"Type FIND n, where n is an employee number, and press " STORE 0 TO OK DO WHILE OK = 0 ACCEPT TO COMMAND IF !(COMMAND) = 'QUIT' QUIT ENDIF IF $(!(COMMAND),1,5) # 'FIND ' ?"FIND followed by a blank, must be theERASE ?"Let's try one more thing before you leave this lesson. In lesson 3, I" ?"didn't tell you the whole truth about FOR clauses. Besides being able" ?"to use the arithmetic operators like =, <, >, =>, etc., you can also use" ?"the Boolean operators .AND., .OR., and .NOT.. In fact, you can use" ?"arithmetic and Boolean operators wherever dBASE II lets you use an" ?"expression (shown in dBASE II command examples as exp). Let's try" ?"some examples with the EMPMAST file. I've created a REPORT FORM to" ?"use with the examples. The formname is EMPMASTR. First, USE EMPMAST." STORE 'USE EMPMAST' TO CHECK DO CHECKC WAIT ERASE ?"Now, let's get a report of the entire file." ? ?"Type REPORT FORM EMPMASTR " STORE 'REPORT FORM EMPMASTR' TO CHECK DO CHECKC WAIT ERASE ? ?"Now, type REPORT FORM EMPMASTR FOR DEPTNO > 10 .AND. GROSSSAL < 1300" ?"" STORE 'REPORT FORM EMPMASTR FOR DEPTNO > 10 .AND. GROSSSAL < 1300' TO CHECK DO CHECKC WAIT ERASE ?"Now, type REPORT FORM EMPMASTR FOR TAXCLASS < 10 .OR. TAXCLASS > 75" ?"" STORE 'REPORT FORM EMPMASTR FOR TAXCLASS < 10 .OR. TAXCLASS > 75' TO CHECK DO CHECKC WAIT ERASE ?"The only limiting factor on the number of arithmetic and Boolean" ?"combinations in a command is the command length restriction in dBASE II." ?"Since commands can be up to 254 characters, it is most likely that you" ?"will get confused about what the expression means before you run out of" ?"positions to specify it." WAIT ERASE RETURN  WAIT ERASE ?"Let's LOCATE ALL FOR LASTNAME = 'SMITH'. Notice the quotation marks" ?"around SMITH. LASTNAME is a character field, and in the FOR phraseERASE ?"The INDEX command is useful for larger files where there is a need to" ?"access records randomly. For smaller files (50 records or less), you can" ?"accomplish the same results by using the LOCATE and CONTINUE commands." ? ?"LOCATE reads sequentially through the file in USE, and then presents" ?"record numbers that satisfy the FOR specification. Because LOCATE is" ?"LOCATEing records sequentially, it takes a long time to LOCATE" ?"records in larger files. INDEX on the other hand, does not take more" ?"than 2 or 3 seconds to FIND a record, no matter how big the file is." ?"Since our EMPMAST file is small, we can LOCATE records quickly too." WAIT ERASE ?"First, we have to use EMPMAST." STORE 'USE EMPMAST' TO CHECK DO CHECKC ?"Now, display all the records." STORE 'DISPLAY ALL' TO CHECK DO CHECKC WAIT ERASE ?"Now, LOCATE ALL FOR EMPNO = 22." STORE 'LOCATE ALL FOR EMPNO = 22' TO CHECK DO CHECKC STORE # TO REC STORE STR(REC,1) TO RECX ? ?"Record &RECX contains employee number 22 data. Now, DISPLAY." STORE 'DISPLAY' TO CHECK DO CHECKC ?"Enter CONTINUE now. dBASE II will see if any more records contain" ?"employee number 22." STORE 'CONTINUE' TO CHECK DO CHECKC ?"Since only one record contains employee number 22, an END OF FILE message" ?"is displayed. That would not be the case if you changed the locate" ?"slightly." WAIT ERASE ?"Let's LOCATE ALL FOR LASTNAME = 'SMITH'. Notice the quotation marks" ?"around SMITH. LASTNAME is a character field, and in the FOR phrase," ?"character fields must be enclosed in quotes." STORE "LOCATE ALL FOR LASTNAME = 'SMITH'" TO CHECK DO CHECKC STORE # TO REC STORE STR(REC,1) TO RECX ?"Record &RECX contains SMITH. Now, DISPLAY it." STORE 'DISPLAY' TO CHECK DO CHECKC ?"Now, CONTINUE." STORE 'CONTINUE' TO CHECK DO CHECKC ?"No END OF FILE message is displayed because there is another SMITH" ?"record on the file." STORE # TO REC STORE STR(REC,1) TO RECX ?"It's record number &RECX.. Let's look at that record. DISPLAY" STORE 'DISPLAY' TO CHECK DO CHECKC WAIT DO TEACH4B RETURN ?"Let's LOCATE ALL FOR LASTNAME = 'SMITH' Notice the quotation marks" ?"around SMITH. LASTNAME is a character field, and in the FOR phrase," ?"character fields must be enclosed in quotes. Try it." STORE "LOCATE ALL FOR LASTNAME = 'SMITH'" TO CHECK DO CHECKC s must be enclosed in quotes." STORE "LOCATE ALL FOR LASTNAME = 'SMITH'" TO CHECK DO CHECKC STORE # TO REC STORE STR(REC,1) TO RECX ?"Record &RECX contains SMITH. Now, DISPLAY it." STORE 'DISPLAY' TO CHECK DO CHECKC ?"Now, CONTINUE." STORE 'CONTINUE' TO CHECK DO CHECKC ?"No END OF FILE message is displayed because there is another SMITH" ?"record on the file." STORE # TO REC STORE STR(REC,1) TO RECX ?"It's record number &RECX.. Let's look at that record. DISPLAY" STORE ERASE ?"In lesson 4, &STUDENT, you learned about record keys, and their use" ?"with the INDEX and FIND commands. You also learned how to use LOCATE" ?"and CONTINUE for small files which were not indexed on a key." ? ?"In lesson 5, you're going to learn about some of the dBASE II file utility" ?"functions, a way to tell dBASE II that a new diskette has been placed in" ?"a disk drive (perhaps to back-up a file, like you'll do in this lesson)," ?"and finally, you'll see how to execute commands from disk, rather than" ?"entering them on the keyboard." WAIT ERASE ?"Remember in lesson 3, you had a file which contained payroll information" ?"for some of the people in the White House. If there is important" ?"information, this is it. Right? The janitor thinks so. I saved that" ?"file for this lesson too." ? ?"I called the file COMPUTE. We can see if it's still there with the" ?"DISPLAY FILE command. This command displays the file names for dBASE II" ?"files (and other files too) on disk." SET CONSOLE OFF DELETE FILE WHITEHSE USE COMPUTE1 DELETE ALL PACK SET CONSOLE ON WAIT ERASE ?"Type DISPLAY FILE " STORE 'DISPLAY FILE' TO CHECK DO CHECKC ?"Now, &STUDENT, start working with the file COMPUTE." ? ?"Type USE COMPUTE " STORE 'USE COMPUTE' TO CHECK DO CHECKC REPLACE ALL NETSALARY WITH 0 TAXES WITH 0 ? ?"Type DISPLAY ALL " STORE 'DISPLAY ALL' TO CHECK DO CHECKC WAIT ERASE ?"This is definitely important data. You wouldn't want to lose it." ?"To make sure that you don't lose the data, you're going to back-up" ?"COMPUTE. Essentially, what this amounts to is that you going to" ?"create a COPY of the file. Normally, the back-up copy would be made on" ?"a different diskette (other than the one the file is on), but since" ?"we're just demonstrating how a back-up is done, you'll put the back-up on" ?"the same disk as the file." ? ?"In a real back-up situation, where a different diskette is used to" ?"receive the file, the RESET command should be issued. This tells the" ?"system that a disk swap has occurred, and will eliminate the possibility" ?"of a disk error occurring." WAIT ERASE ?"OK. Let's make the back-up file, and let's call it WHITEHSE. The file" ?"currently in USE (COMPUTE) is copied to the back-up file with a COPY" ?"command." ? ?"Type COPY TO WHITEHSE " STORE 'COPY TO WHITEHSE' TO CHECK DO CHECKC ? ?"Now type DISPLAY FILE " STORE 'DISPLAY FILE' TO CHECK DO CHECKC ?"Now, both COMPUTE and WHITEHSE are on disk." WAIT ERASE ?"Before you continue with file utilities, let's take a look at how dBASE II" ?"lets you execute a number of commands without typing them all on the" ?"keyboard." ? ?"The DO command does this. It accesses a disk file, and executes all of" ?"the dBASEII commands in that Command Procedure." ? ?"You may create a Command Procedure through use of the operating" ?"system text editor, a word processing package, or the MODIFY COMMAND" ?"in dBASE II. I've created a Command Procedure that uses COMPUTE," ?"performs some calculations on the record contents, and produces a" ?"report to show the results." ? ?"I've called the Command Procedure WHITEHSE. If you enter DO WHITEHSE," ?"the Command Procedure will be accessed, and executed. I've set some" ?"things up so you can see the commands as they are executed, and then" ?"see the results of the execution. If this looks familiar to you," ?"it's because we did this in lesson 3, with you entering the commands from" ?"the keyboard." WAIT ERASE ?"Type DO WHITEHSE " STORE 'DO WHITEHSE' TO CHECK DO CHECKC WAIT ERASE ?"Now, let's examine two more utility functions. As I mentioned earlier," ?"the DISPLAY FILE command can display dBASE II files AND other files on disk" ?"(see the dBASE II TUTOR introduction for a description of the types of" ?"files supported by operating systems). The LIKE phrase is added to the" ?"command to display non-dBASE II files." ? ?"Type DISPLAY FILE LIKE *.CMD " STORE 'DISPLAY FILE LIKE *.CMD' TO CHECK DO CHECKC WAIT ERASE ?"dBASE II also lets you delete files. BE EXTREMELY CAREFUL WITH THIS" ?"COMMAND, however. ONCE DELETED, THE FILES CANNOT BE RETRIEVED. The" ?"files may be dBASE II files, or any other file type (through use of the" ?"file suffix, TXT for example)." ? ?"To illustrate, you're going to delete the WHITEHSE file. First, let's" ?"make sure that the WHITEHSE file is still around." ? ?"Type DISPLAY FILE " STORE 'DISPLAY FILE' TO CHECK DO CHECKC ?"Now, DELETE it, &STUDENT.." ? ?"Type DELETE FILE WHITEHSE " STORE 'DELETE FILE WHITEHSE' TO CHECK DO CHECKC WAIT ERASE ?"One last thing for this lesson. dBASE II permits file structures to be" ?"changed, or MODIFYd. This is very useful when you wish to add a (some)" ?"field to a file that already exists. I can't show you the MODIFY" ?"STRUCTURE command itself, you'll have to do that on your own, but I can" ?"show you how it can be used to change an existing file structure." ? ?"The COMPUTE file that we used earlier had several pieces of information" ?"about the White House staff. It did not have the phone extensions for" ?"them, however. By USEing COMPUTE, and then issuing the MODIFY" ?"STRUCTURE command we could add the PHONE field. After the structure" ?"has been modified, it will look like the structure in a file I have" ?"called COMPUTE1." WAIT ERASE ?"Type USE COMPUTE1 " STORE 'USE COMPUTE1' TO CHECK DO CHECKC ? ?"Now, type DISPLAY STRUCTURE " STORE 'DISPLAY STRUCTURE' TO CHECK DO CHECKC ? ?"Notice that the PHONE field is in it." WAIT ERASE ?"COMPUTE1, however, has no data in it. By using the APPEND FROM command" ?"we can get all of the data that was on COMPUTE onto COMPUTE1." ? ?"Type APPEND FROM COMPUTE " STORE 'APPEND FROM COMPUTE' TO CHECK DO CHECKC ? ?"Now, COMPUTE1 has all of the information that was on COMPUTE, and COMPUTE1" ?"has a field where we can enter PHONE extensions." ? ?"One word of caution. MODIFY STRUCTURE E R A S E S all of the data" ?"on the file being modified. So, before issuing the MODIFY STRUCTURE" ?"command, copy the file to a back-up file or you will L O S E all of" ?"the data that W A S on your file." ? WAIT ERASE ?"Well, that's it for file utilities, and Command Procedures. After you" ?"QUIT this time, try some exercises on your own. DISPLAY, and COPY" ?"files. MODIFY the STRUCTURE of a file, and APPEND data to a new" ?"file structure FROM a copied file. If you feel bold, create a" ?"command procedure using MODIFY COMMAND. In future sessions, I'll" ?"show you how you can create some really powerful Command Procedures" ?"that can do as much as most conventional programming languages," ?"and do it with far fewer instructions. Now, however, it's time" ?"to quit again." ? STORE 'QUIT' TO CHECK DO CHECKC RETURN culations on the record contents, and produces a report to show the" ?"culations on the record contents, and produces a report to show the" ?"culations on the record contents, and produces a report to show the" ?"culations on the record contents, and produces a report to show the" ?" cucu ERASE ?"In lesson 5, &STUDENT, you covered the DISPLAY FILE and COPY file" ?"utilities. We also learned about MODIFY STRUCTURE, and how to" ?"APPEND data onto a MODIFYd file structure. You learned, too, about" ?"the creation of command procedures (or programs) in dBASE II." SET CONSOLE OFF DELETE FILE EMPMAST DELETE FILE EMPTRANS DELETE FILE EMPTSRT DELETE FILE EMPMSRT DELETE FILE TUTMEM.MEM USE EMPBAK COPY TO EMPMAST USE EMPTBAK COPY TO EMPTRANS SET CONSOLE ON ? ?"In lesson 6, you're going to learn about SORT, (another method for" ?"putting records in sequence, other than INDEX), UPDATE (a method for" ?"changing information on a file from another file), and how to work" ?"with memory using STORE, DISPLAY MEMORY, SAVE, RESTORE, RELEASE, and" ?"CLEAR." WAIT ERASE ?"Remember, in lesson 4, you used two key fields on a file called EMPMAST." ?"One key was EMPNO, another was EMPNAME. SORT can put files in order just" ?"like INDEX, but there is one big difference. When INDEX is used, the file" ?"will automatically have its index(es) updated, and therefore, be kept in" ?"in order, whenever APPEND, EDIT, REPLACE, READ, OR BROWSE are used to" ?"update the file. That is not the case with SORT. If changes are made to" ?"key fields in a SORTed file, the file must be re-sorted to get it back in" ?"sequence." WAIT ERASE ?"There are times, however, when a SORTed file is preferrable to an" ?"INDEXed file. We will demonstrate one in this lesson. In this" ?"example, we want the operation of preparing updates to EMPMAST" ?"to be a separate operation and be contained on a separate file" ?"(EMPTRANS), because balancing of the input is required prior to the" ?"UPDATE process. We would also like to have the ability to back-out" ?"transactions after updates have taken place (if, for example we find" ?"that some of the input contained errors that had to be easily removed" ?"from the master file). Had all of the input been entered from the" ?"keyboard using EDIT, back-out may be quite difficult." WAIT ERASE ?"The choice between using SORT or INDEX is a matter of system design." ?"Each system will dictate which method should be used. The purpose" ?"of this lesson is to show you how to use SORT if you feel the" ?"circumstances warrant it." WAIT ERASE ?"Enough said. Let's look at EMPMAST. By now I'm sure you know that" ?"you must use it, display it's structure, and then display all the" ?"records on it. If you make a mistake, I'll tell you what to do, but I" ?"want you to try to perform these three operations without me telling" ?"you specifically what to do." STORE 'USE EMPMAST' TO CHECK DO CHECKC STORE 'DISPLAY STRUCTURE' TO CHECK DO CHECKC STORE 'DISPLAY ALL' TO CHECK DO CHECKC WAIT ERASE ?"Now, &STUDENT, SORT EMPMAST on employee number (EMPNO). SORT will" ?"sort the file in USE on the key specified, and place the SORTed file on" ?"another file." ? ?"Type SORT ON EMPNO TO EMPMSRT " STORE 'SORT ON EMPNO TO EMPMSRT' TO CHECK DO CHECKC ?"Now, EMPMSRT file contains the data that is on EMPMAST in EMPNO" ?"(employee number) sequence. Let's take a look at EMPMSRT. We first" ?"have to use it, and then to see it, I have retained the REPORT FORM" ?"EMPMASTR from lesson 4. Try the USE and REPORT. I'll tell you if you" ?"make any mistakes." STORE 'USE EMPMSRT' TO CHECK DO CHECKC STORE 'REPORT FORM EMPMASTR' TO CHECK DO CHECKC ?"All the records are in order by employee number." WAIT ERASE ?"In UPDATE, a file is needed, which contains the changes to be made." ?"This file is generally referred to as a transaction file. The UPDATE" ?"command requires that the master file (EMPMAST) and the transaction" ?"file be in the same sequence. Our transaction file is called EMPTRANS." ? ?"Let's take a look at it. First USE it, then DISPLAY it's STRUCTURE," ?"and then DISPLAY ALL of the records on it. Try these three commands." ?"I'll help you, if you make any mistakes." STORE 'USE EMPTRANS' TO CHECK DO CHECKC STORE 'DISPLAY STRUCTURE' TO CHECK DO CHECKC STORE 'DISPLAY ALL' TO CHECK DO CHECKC WAIT ERASE ?"Now we have to SORT EMPTRANS to get it in order by EMPNO." ? ?"Type SORT ON EMPNO TO EMPTSRT " STORE 'SORT ON EMPNO TO EMPTSRT' TO CHECK DO CHECKC ?"Now, use EMPTSRT, and display all the records on it. I'll help you if" ?"you make errors in either of the two commands to do this." STORE 'USE EMPTSRT' TO CHECK DO CHECKC STORE 'DISPLAY ALL' TO CHECK DO CHECKC ?"Now, the transaction file is also in employee number sequence." WAIT DO TEACH6U RETURN number sequence." WAIT DO TEACH6U RETURN u feel the" ?"circumstanu feel the" ?"circumstanST in EMPNO" ?"(emplST in EMPNO" ?"(empl fields in a SORTed file, the file must be re-sorted to get it back in" ?"sequence." WAIT ERASE ?"There are times, however, when a SORTed file is preferrable to an" ?"INDEXed file. We will demonstrate one in this lesson. In this" ?"example, we want the operationERASE ?"Up to now, you have been dealing with only data on files. You're now going" ?"to see how to use memory variables. Memory variables are used in much" ?"the same fashion as fields on records. However, unlike fields on records," ?"memory variables are always available for immediate use. It is not" ?"necessary to read them from a file to access them. dBASE II permits" ?"up to 64 memory variables in memory at any one time, and also permits" ?"memory variables to be SAVEd on disk, for later RESTOREing." ? ?"Several commands deal with memory variables. They are: STORE, DISPLAY" ?"MEMORY, SAVE, RESTORE, RELEASE, and CLEAR." WAIT ERASE ?"Remember how REDFORD lost his name. Let's get REDFORD's name back" ?"using a memory variable." ? ?"Type STORE 'REDFORD' TO MEMNAME " STORE "STORE 'REDFORD' TO MEMNAME" TO CHECK DO CHECKC ? ?"Now, &STUDENT, type DISPLAY MEMORY " STORE 'DISPLAY MEMORY' TO CHECK DO CHECKC ?"I've got some things in memory too, but notice that there is a memory" ?"variable called MEMNAME, which contains REDFORD." WAIT ERASE ?"Using the EMPMSRT file, you can give REDFORD his name back from the" ?"memory variable MEMNAME." ? ?"Type USE EMPMSRT " STORE 'USE EMPMSRT' TO CHECK DO CHECKC ? ?"Now, DISPLAY." STORE 'DISPLAY' TO CHECK DO CHECKC ?"That's the old REDFORD record all right, with no name in it. Now," ?"REPLACE LASTNAME WITH MEMNAME" STORE 'REPLACE LASTNAME WITH MEMNAME' TO CHECK DO CHECKC ?"Now, DISPLAY" STORE 'DISPLAY' TO CHECK DO CHECKC ?"And, REDFORD has his last name back." WAIT ERASE ?"There may be instances where 64 memory variables are not enough for the" ?"work you have to do. For these instances, and other occasions where you" ?"want to SAVE memory variables (perhaps to be RESTOREd to memory the next" ?"day from a previous day's work), dBASEII provides the SAVE command. All" ?"memory variables are put on the disk file specified in the SAVE command." ? ?"Type SAVE TO TUTMEM " STORE 'SAVE TO TUTMEM' TO CHECK DO CHECKC ?"Now all the memory variables are on the disk file TUTMEM." WAIT ERASE ?"If you're finished with some memory variables, and want to make room for" ?"some more, the RELEASE command is used. Let's RELEASE one of yours, and" ?"one of mine." ? ?"Type RELEASE MEMNAME,PRINTER " STORE 'RELEASE MEMNAME,PRINTER' TO CHECK DO CHECKC ?"Now, DISPLAY MEMORY." STORE 'DISPLAY MEMORY' TO CHECK DO CHECKC ?"MEMNAME and PRINTER are no longer in memory. To release all memory" ?"variables, enter RELEASE ALL" STORE 'RELEASE ALL' TO CHECK DO CHECKC1 ?"Now, DISPLAY MEMORY." STORE 0 TO OK DO WHILE OK = 0 ACCEPT TO COMMAND IF !(COMMAND) = 'QUIT' QUIT ENDIF IF !(COMMAND) # 'DISPLAY MEMORY' ?"You didn't enter DISPLAY MEMORY. Please try again." LOOP ELSE RELEASE ALL DISPLAY MEMORY STORE 1 TO OK STORE ' ' TO PROMPT ENDIF ENDDO WAIT ERASE RESTORE FROM TUTMEM ?"Oh no, &STUDENT.. All the memory variables are gone, and I still need" ?"some of them. Let's get them back!!!!!!!!!" ? ?"Type RESTORE FROM TUTMEM " STORE 'RESTORE FROM TUTMEM' TO CHECK DO CHECKC ? ?"Now, DISPLAY MEMORY." STORE 'DISPLAY MEMORY' TO CHECK DO CHECKC WAIT ERASE ?"You can also RELEASE ALL the memory variables by entering CLEAR, and" ?"CLEAR will also take the file in USE out of the USE state. For example," ?"if you enter CLEAR now, the EMPMSRT file would no longer be in USE." WAIT ERASE RETURN ERASE ?"Now you've done it. All the memory variables are gone, and I still need" ?"some of them. Let's get them back!!!!!!!!! Type RESTORE FROM TUTMEM." STORE 'RESTORE FROM TUTMEM' TO CHECK DO CHECKC ERASE ?"Now you've done it. All the memory variables are gone, and I still need" ?"some of them. Let's get them back!!!!!!!!! Type RESTORE FROM TUTMEM." STORE 'RESTORE FROM TUTMEM' TO CHECK DO CHECKC  CHECK DO CHECKC ?"That's the old REDFORD record all right, with no name in it. Now," ?"REPLACE LASTNAME WITH MEMNAME" STORE 'REPLACE LASTNAME WITH MEMNAME' TO CHERASE ?"Now you're ready to try UPDATE. Both the master and transaction files" ?"(EMPMAST and EMPTRANS) are in sequence by EMPNO on the files EMPMSRT and" ?"EMPTSRT. First, you have to USE EMPMSRT." STORE 'USE EMPMSRT' TO CHECK DO CHECKC ?"Type UPDATE FROM EMPTSRT ON EMPNO REPLACE LASTNAME ADD GROSSSAL " STORE 'UPDATE FROM EMPTSRT ON EMPNO REPLACE LASTNAME ADD GROSSSAL' TO CHECK DO CHECKC WAIT ERASE ?"To see what the UPDATE did, type REPORT FORM EMPMASTR " STORE 'REPORT FORM EMPMASTR' TO CHECK DO CHECKC ?"Notice that REDFORD (employee 2) lost his name, and that GROSSSAL has" ?"been changed in all three records that had transactions. REDFORD lost" ?"his name, because REPLACE was used for the LASTNAME field, and the" ?"LASTNAME field in the transaction file for his record was blank." ?"GROSSSAL was increased or decreased based on the amounts that were in" ?"the GROSSSAL field on the transaction file." WAIT ERASE ?"There are ways, using command procedures, to exercise complete control" ?"over updates to files. We'll see how that can be done, in lesson 10." WAIT DO TEACH6M ERASE ?"That's it for SORT, UPDATE, and dealing with memory variables. After" ?"you've QUIT, practice with these commands, so you'll be able to use them" ?"in the future." ? ?"Please QUIT now." STORE 'QUIT' TO CHECK DO CHECKC RETURN STORE 'REPORT FORM EMPMASTR' TO CHECK FORM EMPMASTR' TO CHECK ords on it. If you make a mistake, I'll tell you what to do, but I" ?"want you to try toERASE SET CONSOLE OFF USE EMP8 COPY TO EMPMAST SET CONSOLE ON ?"In lesson 6, &STUDENT, you learned how to use SORT and UPDATE commands" ?"to update master files from transaction files. You also covered" ?"memory variables and their use through STORE, DISPLAY MEMORY, SAVE," ?"RESTORE, RELEASE, and CLEAR." ? ?"In lesson 7, you're going to learn how to use the SELECT PRIMARY and" ?"SELECT SECONDARY commands, and also, how to JOIN files. The JOIN" ?"is a fundamental feature of relational systems (see the dBASE II" ?"LESSONS introduction for more details), and is, essentially, a match" ?"merge process that combines files into full-fledged data bases." WAIT ERASE ?"First, you're going to JOIN an employee name file (EMPNAME), with a job" ?"history file (JOBHIST), and produce a report that displays the job" ?"histories for all employees. You're using two files to do this, since it" ?"is possible that employees could have had many different job titles, and" ?"since relational systems do not permit repeating groups (repeating" ?"fields), you cannot permit multiple job history fields in the employee" ?"master file itself." ? ?"First, look at the file structures for EMPNAME, and JOBHIST, and" ?"produce reports that display the contents of each file." WAIT ERASE ?"Issue the commands to display the structure and print a report for" ?"EMPNAME, first. I have a report form called EMPNAME for you to use to" ?"generate the report." STORE 'USE EMPNAME' TO CHECK DO CHECKC STORE 'DISPLAY STRUCTURE' TO CHECK DO CHECKC STORE 'REPORT FORM EMPNAME' TO CHECK DO CHECKC WAIT ERASE ?"Now, issue the use, display structure, and report commands for" ?"JOBHIST. I have a report form called JOBHFRM you can use for the" ?"report." STORE 'USE JOBHIST' TO CHECK DO CHECKC STORE 'DISPLAY STRUCTURE' TO CHECK DO CHECKC STORE 'REPORT FORM JOBHFRM' TO CHECK DO CHECKC WAIT ERASE ?"Now JOIN the two files to produce a file that contains all job" ?"history information for all employees." ? ?"The JOIN command reads each record in the PRIMARY USE file, one at a" ?"time, and then interrogates every record in the SECONDARY USE file to see" ?"if the FOR expression is satisfied. If the FOR expression is satisfied," ?"a record is written to the file specified by the TO clause." ? ?"Let's go through the series of commands for the JOIN of EMPNAME and" ?"JOBHIST." WAIT ERASE ?"First, USE JOBHIST." STORE 'USE JOBHIST' TO CHECK DO CHECKC ?"Now, SELECT SECONDARY." STORE 'SELECT SECONDARY' TO CHECK DO CHECKC ?"Now, USE EMPNAME." STORE 'USE EMPNAME' TO CHECK DO CHECKC ?"Now SELECT PRIMARY to get back to the JOBHIST file." STORE 'SELECT PRIMARY' TO CHECK DO CHECKC ?"And now, JOIN TO JOINJOB FOR EMPNO = S.EMPNO (notice the S. preceding" ?"the second EMPNO). That indicates that dBASE II is to use EMPNO from" ?"the secondary file." STORE 'JOIN TO JOINJOB FOR EMPNO = S.EMPNO' TO CHECK DO CHECKC WAIT ERASE ?"Now, &STUDENT, let's use JOINJOB, display it's structure, and print a" ?"report using the report form JJFRM." STORE 'USE JOINJOB' TO CHECK DO CHECKC STORE 'DISPLAY STRUCTURE' TO CHECK DO CHECKC STORE 'REPORT FORM JJFRM' TO CHECK DO CHECKC WAIT DO TEACH7P ERASE ?"That's it for JOIN, SELECT, and Relational data base manipulation." ?"If you get involved in complex JOINS, with many files, make sure" ?"that you do not violate any of the relational data base normalization" ?"principles (see the dBASE II TUTOR introduction for more details)." ? ?"One more caution, when using JOIN. JOINs of larger files can take an" ?"extraordinary amount of time. If you find that run times for JOINs" ?"are becoming excessive, you may want to accomplish the results of a JOIN" ?"by using the UPDATE command, or by writing a command procedure." ? ?"And, speaking of command procedures, once you have all of your file" ?"structures defined and know the JOINs required to build your Relational" ?"Data Base, you can create a command procedure that contains all of the" ?"USE, SELECT, and JOIN commands, and let the command procedure do all of" ?"the work for you." ? ?"It's time to QUIT." STORE 'QUIT' TO CHECK DO CHECKC RETURN 'USE JOINJOB' TO CHECK DO CHECKC STORE 'DISPLAY STRUCTURE' TO CHECK DO CHECKC STORE 'REPORT FORM JJFRM' TO CHECK 'USE JOINJOB' TO CHECK DO CHECKC STORE 'DISPLAY STRUCTURE' TO CHECK DO CHECKC STORE 'REPORT FORM JJFRM' TO CHECKuired to build your Relational" ?"Data Base, you can create a command procedure that contains all of the" CCHECKuired to build your Relational" ?"Data Base, you can create a command procedure that contains all of the" C ORM JJFRM' TO CHECK DO CHECKC WAIT DO TEACH7P ERASE ?"That's it for JOIN, SELECT, and Relational data base manipulation." ?"If you get involved in complex JOINS, with many files, make sure" ?"that you do not violate any of the relational data base normalization" ?"principles (see the dBASE II TUTOR introduction for more details)." ? ?"One more caution, when using JOIN. JOINERASE ?"You'll be trying something a little more complicated this time. You're" ?"going to use an employee master file, join it to a tax code file to pick" ?"up deduction percentages, join that file to the employee name file, join" ?"that file to a department name file, and finally, using that final" ?"relational data base, compute tax and net salary amounts, and produce a" ?"payroll register report." WAIT ERASE ?"First, I'll show you the employee master file. It's called EMPMAST. Use" ?"it, display it's structure, and then produce a report using the report" ?"form EMPMAST." STORE 'USE EMPMAST' TO CHECK DO CHECKC STORE 'DISPLAY STRUCTURE' TO CHECK DO CHECKC STORE 'REPORT FORM EMPMAST' TO CHECK DO CHECKC WAIT ERASE ?"Now. &STUDENT, look at the file EMPMAST is going to be JOINed to." ?"It's called TAXMAST. Enter USE TAXMAST." STORE 'USE TAXMAST' TO CHECK DO CHECKC ?"Now, display it's structure." STORE 'DISPLAY STRUCTURE' TO CHECK DO CHECKC ?"Notice that it contains a TAXCODE field, which is also on the EMPMAST" ?"file, and that a tax % field is also present. After you have JOINed" ?"EMPMAST and TAXMAST, the JOINed file will have all the information" ?"needed to compute a tax, and net salary amount for every employee." WAIT ERASE ?"OK. Let's do the first JOIN. Enter, USE EMPMAST." STORE 'USE EMPMAST' TO CHECK DO CHECKC ?"Now, SELECT SECONDARY." STORE 'SELECT SECONDARY' TO CHECK DO CHECKC ?"Now, USE TAXMAST." STORE 'USE TAXMAST' TO CHECK DO CHECKC ?"Now, SELECT PRIMARY." STORE 'SELECT PRIMARY' TO CHECK DO CHECKC ?"And, finally, JOIN TO JOINPAY1 FOR TAXCODE = S.TAXCODE." STORE 'JOIN TO JOINPAY1 FOR TAXCODE = S.TAXCODE' TO CHECK DO CHECKC WAIT ERASE ?"Each record in JOINPAY1 now contains, for each employee that was on the" ?"EMPMAST file, a tax percentage amount. If you now use JOINPAY1, you can" ?"also include on our data base an employee name, by performing a JOIN to" ?"the EMPNAME file. which contains two fields, EMPNO, and EMPNAME." ? ?"First USE JOINPAY1, then SELECT SECONDARY, then USE EMPNAME, then" ?"SELECT PRIMARY, then JOIN TO JOINPAY2 FOR EMPNO = S.EMPNO." ? STORE 'USE JOINPAY1' TO CHECK DO CHECKC STORE 'SELECT SECONDARY' TO CHECK DO CHECKC STORE 'USE EMPNAME' TO CHECK DO CHECKC STORE 'SELECT PRIMARY' TO CHECK DO CHECKC STORE 'JOIN TO JOINPAY2 FOR EMPNO = S.EMPNO' TO CHECK DO CHECKC WAIT ERASE ?"Now, &STUDENT use and display the structure of JOINPAY2 to see what " ?"the data base has so far." STORE 'USE JOINPAY2' TO CHECK DO CHECKC STORE 'DISPLAY STRUCTURE' TO CHECK DO CHECKC ?"Notice that the fields EMPNO and TAXCODE appear twice. You could have" ?"removed the duplicates if you had used the FIELD specification in the" ?"JOINs, but since you're not nearing the 32 field limit for a file, the" ?"duplicates can exist, and the entry of the JOIN commands is easier" ?"without the FIELD specification." WAIT ERASE ?"Do a JOIN of JOINPAY2 and DEPTMAST, which has a DEPTNO and DEPTNAME" ?"field in it. Enter, USE JOINPAY2." STORE 'USE JOINPAY2' TO CHECK DO CHECKC ?"Now, enter SELECT SECONDARY." STORE 'SELECT SECONDARY' TO CHECK DO CHECKC ?"Now, USE DEPTMAST." STORE 'USE DEPTMAST' TO CHECK DO CHECKC ?"Now, SELECT PRIMARY." STORE 'SELECT PRIMARY' TO CHECK DO CHECKC ?"Now, JOIN TO JOINPAY3 FOR DEPTNO = S.DEPTNO." STORE 'JOIN TO JOINPAY3 FOR DEPTNO = S.DEPTNO' TO CHECK DO CHECKC ?"Now, the data base has department name data in it too, and you can" ?"compute tax and net salary amounts, and produce the payroll register." WAIT ERASE ?"Issue the commands to do all this. First, USE JOINPAY3." STORE 'USE JOINPAY3' TO CHECK DO CHECKC ?"Now, REPLACE ALL TAXES WITH GROSSSAL * TAXPCT." STORE 'REPLACE ALL TAXES WITH GROSSSAL * TAXPCT' TO CHECK DO CHECKC ?"Now REPLACE ALL NETSAL WITH GROSSSAL - TAXES." STORE 'REPLACE ALL NETSAL WITH GROSSSAL - TAXES' TO CHECK DO CHECKC ?"And, finally, ask for a REPORT using the report form REGFRM." STORE 'REPORT FORM REGFRM' TO CHECK DO CHECKC WAIT ERASE ?"If you change any of the structures for the files being used, by adding" ?"more fields or changing field lengths, the same commands that we used" ?"for this entire procedure will still work. Relational data base" ?"systems, like dBASE II, use this data independence or automatic" ?"navigation feature to make changes to file and data base structures" ?"transparent to the users of the system." WAIT RETURN ount for every employee." WAIT ERASE ?"OK. Let's do the first JOIN. Enter, USE EMPMAST." STORE 'USE ESET CONSOLE OFF DELETE FILE EMPMAST SET CONSOLE ON ERASE ?"In lesson 7, &STUDENT, you learned how simple files can be transformed" ?"into data bases through the JOIN command. Although the payroll" ?"system we used as an illustration was a rather simple example of the" ?"power of the relational JOIN, the power of such a tool is quite" ?"obvious." ? ?"In lesson 8, you're going to learn about some of functions that can be" ?"used in dBASE II. Functions, as we will see, permit near assembly" ?"operations to be performed, without having to call assembly language" ?"programs. I'm going to show you the functions available in the latest" ?"release of dBASE II. Most of them are available in earlier releases, but" ?"before you try them on your own, make sure that they are included in" ?"your release of dBASE II." ? ?"To illustrate the functions, I'm also going to cover some other" ?"commands. You'll look at ACCEPT, which is used to ACCEPT data from the" ?"keyboard. The INPUT statement can also be used to obtain data from the" ?"keyboard, but there are some differences, and ACCEPT is the generally" ?"favored method for keyboard data entry. We'll also be looking at the ?" ?"(question mark, or what is) command, which can be used to display data" ?"on the CRT." WAIT ERASE ?"First, you will look at the functions LEN, @, $, and !. You'll use ACCEPT" ?"to get the data for our illustration. Type ACCEPT 'ENTER A STATEMENT TO" ?"BE PARSED' TO STATEMENT first, then, when you are prompted, type" ?"NAME,N,20,5." ? ?"Type ACCEPT 'ENTER A STATEMENT TO BE PARSED' TO STATEMENT " STORE "ACCEPT 'ENTER A STATEMENT TO BE PARSED' TO STATEMENT" TO CHECK DO CHECKC1 STORE 0 TO OK DO WHILE OK = 0 ? ?"Now, type NAME,N,20,5 " ACCEPT 'ENTER A STATEMENT TO BE PARSED' TO STATEMENT STORE !(STATEMENT) TO STATEMENT IF STATEMENT = 'QUIT' QUIT ENDIF IF STATEMENT # 'NAME,N,20,5' ?"You didn't enter NAME,N,20,5. Please try again." LOOP ELSE STORE 1 TO OK ENDIF ENDDO WAIT ERASE ?"Now, &STUDENT, find where in STATEMENT, the first comma occurs, and STORE" ?"that location to a memory variable called COMMAL. The @ function (where" ?"is it at), does this. The field specified in the second parameter is" ?"scanned to see where the first parameter in the command occurs." ? ?"Type STORE @(',',STATEMENT) TO COMMAL " STORE "STORE @(',',STATEMENT) TO COMMAL" TO CHECK DO CHECKC ?"The first comma occurs in position 5 of STATEMENT. Now, take the" ?"characters preceding the comma, and STORE them to a memory variable" ?"called WORD1. You can use the $ (substring) function for this. The" ?"expression specified by the first parameter, starting at the position" ?"specfied by the second parameter, for a length of the third parameter is" ?"the result of the $ function." ? ?"Type STORE $(STATEMENT,1,COMMAL - 1) TO WORD1 " STORE 'STORE $(STATEMENT,1,COMMAL - 1) TO WORD1' TO CHECK DO CHECKC WAIT ERASE ?"The $ function can be used without the second and third parameters, in" ?"which case the first parameter will be analyzed to see if a substring" ?"occurs anywhere within it. For example, you could see if the string NAME" ?"occurs anywhere within STATEMENT." ? ?"Type ? 'NAME' $(STATEMENT) " STORE "? 'NAME' $(STATEMENT)" TO CHECK DO CHECKC ?"The .T. indicates that the substring NAME does occur within STATEMENT." ? ?"The $ function with the second and third parameters omitted is a very" ?"nice way to do keyword searching of files. For example, using the" ?"DISPLAY ALL or REPORT commands, a file of text could be searched like" ?"this:" ? ?"DISPLAY ALL FOR 'AGRICULTURE' $(ABSTRACT) .OR. 'PLANT' $(ABSTRACT)" ? ?"If you have textual data, and need a keyword searching facility for it," ?"the facility is already in dBASE II." WAIT ERASE ?"Whether you entered NAME in upper or lower case, I converted it to" ?"upper case. You may have noticed that I have performed this upper case" ?"conversion throughout these lessons. I've changed WORD1 (NAME) from" ?"upper to lower case, and I'm going to let you convert it back to upper" ?"case. You'll use the ! function to do this." ? ?"First, &STUDENT, make sure that WORD1 contains 'name'." STORE 'name' to WORD1 ? ?"Type ? WORD1 " STORE '? WORD1' TO CHECK DO CHECKC ? ?"Now, type STORE !(WORD1) TO WORD1U " STORE 'STORE !(WORD1) TO WORD1U' TO CHECK DO CHECKC ?"Consider that you have files with text in them, and want to break down" ?"the text into single words that are separated by blanks, commas, colons," ?"or something else, to produce an index. The preceding group of " ?"instructions does just that. When that sequence of instructions is put" ?"command procedure, it can be used to break down text on any file." WAIT DO TEACH8F DO TEACH8R ERASE ?"The functions can be most powerful when used in command procedures with" ?"IF's and DO LOOPS, but they do have value when being used from the" ?"keyboard." ? ?"I'm going to ask you to do something now that I have not asked you to do" ?"before, and will not ask you to do again. I'd like you to take the" ?"dBASE II reference card, which came with your system, and read about the" ?"the SET options. Once you've done that, try some of the dBASE II functions" ?"and experiment with the various SET commands." ? ?"Now, it's time to quit." STORE 'QUIT' TO CHECK DO CHECKC RETURN ASEII manual and R E A D (a dirty word) what it haASEII manual and R E A D (a dirty word) what it haASEII manual and R E A D (a dirty word) what it ha ENT,1,COMMAL - 1) TO WORD1' TO CHECK DO CHECKC WAIT ERASE ?"The $ funcERASE ?"Now, try the FILE, LEN, TRIM, #, EOF, *, and TYPE functions. The" ?"EMPMAST file from lesson 5 should be available. You'll use the FILE" ?"function, &STUDENT, to make sure it is." ? ?"I'll continue to use the ? (what is) command to show you how that works." ?"There is also a ?? command, which displays just like ?, but will not" ?"advance a line after the display. This is useful when you wish to print" ?"the results from several operations on one print line of a printer." WAIT ERASE ?"Type ? FILE('EMPMAST') " STORE "? FILE('EMPMAST')" TO CHECK DO CHECKC ?"That's not good. The .F. means that the file test was false, and" ?"EMPMAST is not around. Perhaps the back-up is still available." ? ?"Type ? FILE('EMPBAK1') " STORE "? FILE('EMPBAK1')" TO CHECK DO CHECKC ?"The .T. indicates true, so we can use that file." ? ?"Note - You could have STOREd the results of those tests (.T., or .F.)," ?"and used them to control the flow of a program. You'll see how that" ?"might be done in the last dBASE II LESSONS module." ? ?"Now, &STUDENT, use EMPBAK1, and try some other functions." STORE 'USE EMPBAK1' TO CHECK DO CHECKC ? ?"You're going to SKIP through EMPBAK1, looking for records that contain" ?"SMITH in them. When we are at a record that contains SMITH in the" ?"LASTNAME field, we want to STORE the record number of that record" ?"into a memory variable called RECNO, but only if the record is not" ?"flagged for deletion. I know this can be done easily in a DO LOOP," ?"but I'm going to wait until the last lesson to illustrate DO." ? ?"You're at the first record of EMPBAK1. See if LASTNAME is SMITH." WAIT ERASE ?"Enter ? LASTNAME" STORE '? LASTNAME' TO CHECK DO CHECKC ?"No, that one is not SMITH. Before you go to the next record though," ?"try the the LEN and TRIM functions." ? ?"Type ? LEN(LASTNAME) " STORE '? LEN(LASTNAME)' TO CHECK DO CHECKC ?"To remove trailing blanks in LASTNAME:" ? ?"type STORE TRIM(LASTNAME) TO TRIMNAME " STORE 'STORE TRIM(LASTNAME) TO TRIMNAME' TO CHECK DO CHECKC ?"Now, type ? LEN(TRIMNAME)" STORE '? LEN(TRIMNAME)' TO CHECK DO CHECKC STORE LEN(TRIMNAME) TO NL STORE STR(NL,2) TO NLX ?"TRIMNAME is only &NLX characters long, since trailing blanks were" ?"removed from &TRIMNAME.. Now, SKIP to the next record." STORE 'SKIP' TO CHECK DO CHECKC ?"You don't want to SKIP past the end of the file. Check for that." ? ?"Type ? EOF " STORE '? EOF' TO CHECK DO CHECKC ?"OK. You haven't hit end of file. See if this record has SMITH." ?"Type ? LASTNAME " STORE '? LASTNAME' TO CHECK DO CHECKC ?"There's SMITH. See if the record is flagged for deletion." ? ?"Type ? * " STORE '? *' TO CHECK DO CHECKC ?"No. It's not flagged for deletion. STORE The record number, so you" ?"can come back to this record later." ? ?"Type STORE # TO RECNO " STORE 'STORE # TO RECNO' TO CHECK DO CHECKC ?"OK, &STUDENT, see if there are any more SMITH records. SKIP" STORE 'SKIP' TO CHECK DO CHECKC ?"? EOF" STORE '? EOF' TO CHECK DO CHECKC ?"? LASTNAME" STORE '? LASTNAME' TO CHECK DO CHECKC ?"There's another SMITH. Is it flagged for deletion?" ?"? *" STORE '? *' TO CHECK DO CHECKC ?"Yes, it is flagged for deletion, so you don't want it. SKIP" STORE 'SKIP' TO CHECK DO CHECKC ?"? EOF" STORE '? EOF' TO CHECK DO CHECKC ?"That's end of file. Get back to the record that had SMITH, and was" ?"not flagged for deletion. Which one was it? That's right, you stored" ?"the record number in the memory variable RECNO." ? ?"Type GOTO RECNO " STORE 'GOTO RECNO' TO CHECK DO CHECKC ?"Now, DISPLAY" STORE 'DISPLAY' TO CHECK DO CHECKC ?"And there's the SMITH record that isn't flagged for deletion." WAIT RETURN DO CHECKC ?"? EOF EOF' TO CHEC" e e eEC" e EOF' TO CHEC" eC" e ed" ?"the record number in the memory in the memory ory HECK DO CHECKC ?"The .T. indicates true, so we can use that file." ? ?"Note - You could have STOREd the results of those tests (.T., or .F.)," ?"and used them to control the flow of a program. You'll see how that" ?"miERASE ?"There are only a few more functions. First let's look at the type" ?"function. It tells you whether an expression is C (character), N" ?"(numeric), or L (logical) type." ? ?"Type ? TYPE(EOF) " STORE '? TYPE(EOF)' TO CHECK DO CHECKC ?"Now, ? TYPE(LASTNAME) " STORE '? TYPE(LASTNAME)' TO CHECK DO CHECKC ?"NOW, ? TYPE(RECNO) " STORE '? TYPE(RECNO)' TO CHECK DO CHECKC ?"You can also see the date that was entered when dBASE II was started up." ?"? DATE() " STORE '? DATE()' TO CHECK DO CHECKC IF DATE() = '00/00/00' ?"You should have entered a date when you started dBASE II. Then it would" ?"have been displayed by the last command." ENDIF ?"You can convert numbers with decimals to integers." ? ?"Type ? INT(250.50) " STORE '? INT(250.50)' TO CHECK DO CHECKC ?"You can convert numbers and numeric expresions to characters and specify" ?"the length of the character field." ? ?"Type ? STR(234 + 123,3) " STORE '? STR(234 + 123,3)' TO CHECK DO CHECKC ?"And, finally, you can convert a numeric expression to an ASCII character" ?"(octal). You may find this function useful to control your printer to" ?"set it to compress mode, large type, etc.)." ? ?"I can't show you printer control characters, because they cannot be" ?"displayed on the screen. I can show you what an ASCII 41 is though." ? ?"Type ? CHR(41) " STORE '? CHR(41)' TO CHECK DO CHECKC ? ?"And, that's it for functions." WAIT RETURN 0/00' .50)" STORE '? INT(250.50)' TO CHECK DO CHECKC ?"You can convert numbers and numeric expresions to characters and specify" ?"the length of the character field. Enter ? STR(234 + 123,3)" STORE '? STR(234 + 123,3)' TO CHECK DO CHECERASE STORE; ' ' TO BLANKS ?"In lesson 8, &STUDENT, the dBASE II functions were reviewed. You also" ?"used ACCEPT to obtain input from the keyboard, and ? to display data" ?"on the CRT." ? ?"In lesson 9, you will learn how to format screens and print special" ?"reports or forms using the @ SAY command. This lesson will be rather" ?"brief, because a new feature called ZIP has been added to dBASE II, and" ?"it performs automatic generation of @ SAY commands based on 'painted'" ?"screens. Still, I am going to show you how the @ SAY command works." ?"By doing so, I will also demonstrate the functions available in ZIP." WAIT ERASE ?"With ZIP or @ SAY you have total flexibility in defining the screen" ?"layout. When used with SET FORMAT TO PRINT, @ SAY can be used to build" ?"custom forms or reports on the printer. For the lesson, I'm going to use" ?"@ SAY to keep my instructions and your responses on the bottom half of" ?"the screen. The results of the @ SAY commands will be displayed on the" ?"top half of the screen." WAIT ERASE @ 11,0 ?"Here I am down here, &STUDENT." ? ?"Using @ SAY or ZIP permits you to use the 24 rows and 80 columns of the" ?"screen any way you wish. When SET FORMAT TO PRINT is in effect, the" ?"printer can be viewed as a large piece of paper having 255 lines, and" ?"255 columns." ? ?"Let's try an example." WAIT DO CLEAR@ ?"In the example, you're going to use a file which contains, among other" ?"things, names and addresses that have to be updated from time to time." ?"We could use the standard screen formats provided by EDIT, APPEND, etc.," ?"but the user doesn't like the way these formats look on the screen, and" ?"the file being used contains a lot of other data on it that clutters the" ?"screen and makes it difficult for office personnel to make the changes." WAIT DO CLEAR@ ?"I have already issued the USE command for NAMEADDR and positioned it to" ?"the first record. NAMEADDR contains, among other fields, some fields" ?"called NAME, ADDR1, ADDR2, ADDR3, ADDR4, and ADDR5.These are the fields" ?"we will be using in our example. I'm going to start prompting you to" ?"enter commands, when I do, enter the command, and watch what happens in" ?"the upper portion of the screen." WAIT DO CLEAR@ USE NAMEADDR ?"Enter @ 1,0 SAY 'NAME OF PERSON' GET NAME" STORE "@ 1,0 SAY 'NAME OF PERSON' GET NAME" TO CHECK DO CHECKS DO CLEAR@ ?"Enter @ 3,5 SAY 'FIRST ADDRESS' GET ADDR1" STORE "@ 3,5 SAY 'FIRST ADDRESS' GET ADDR1" TO CHECK DO CHECKS DO CLEAR@ ?"Enter @ 4,5 SAY 'SECOND ADDRESS' GET ADDR2" STORE "@ 4,5 SAY 'SECOND ADDRESS' GET ADDR2" TO CHECK DO CHECKS DO CLEAR@ ?"Enter @ 6,5 SAY 'THIRD ADDRESS' GET ADDR3" STORE "@ 6,5 SAY 'THIRD ADDRESS' GET ADDR3" TO CHECK DO CHECKS DO CLEAR@ ?"Enter @ 7,5 SAY 'FOURTH ADDRESS' GET ADDR4" STORE "@ 7,5 SAY 'FOURTH ADDRESS' GET ADDR4" TO CHECK DO CHECKS DO CLEAR@ ?"Enter @ 8,5 SAY 'FIFTH ADDRESS' GET ADDR5" STORE "@ 8,5 SAY 'FIFTH ADDRESS' GET ADDR5" TO CHECK DO CHECKS DO CLEAR@ ?"Now that the screen is filled, if a READ command is issued, the cursor" ?"will be placed at the first outstanding GET (which is NAME for us). At" ?"this point, you can enter changes to the NAME field and press the " ?"key to go to the next field. Press after editing the last field," ?"to return to me. Try it &STUDENT.." ? ?"Type READ " STORE 'READ' TO CHECK DO CHECKS DO CLEAR@ ?"Obviously, this is a very simple illustration. In real life, the name" ?"and address file would probably be INDEXed on name or perhaps some other" ?"field or fields so FINDs could be issued randomly to position the file" ?"to the record to be changed. It does, however, illustrate the" ?"flexibility dBASE II provides for screen and printer formatting, and data" ?"entry from the screen." WAIT DO CLEAR@ ?"Don't forget to look at the ZIP package either. That makes screen" ?"building a snap." ? ?"It's time to quit again. After you have, try @ SAY and ZIP. I'll see" ?"you again in the final lesson, lesson 10. Enter QUIT." STORE 'QUIT' TO CHECK DO CHECKS RETURN field or fields so FINDs could be issued randomly to position the file" ?"to the recorfield or fields so FINDs could be issued randomly to position the file" ?"to the recorfield or fields so FINDs could be issued randomly to position the file" ?"to the recor 6,5 SAY 'THIRD ADDRESS' GET ADDR3" STORE "@ 6,5 SAY 'THIRD ADDRESS' GET ADDR3" TO CHECK DO CHECKS DO CLEAR@ ?"Enter @ 7,5 SAY 'FOURTH ADDRESS' GET ADDR4" STORE "@ 7,5 SAY 'FOURTH ADDRESS' GET ADDR4" TO CHECK DO CHECKS DO CLEAR@ ?"Enter @ 8,5 SAY 'FIFTH ADDRESS' GET ADDR5" STORE "@ 8,5 SAY 'FIFTH ADDRESS' GET ADDR5" TO CHECK DO CHECKS DO CLEAR@ ?"Now that the screen 6,5 SAY 'THIRD ADDRESS' GET ADDR3" STORE "@ 6,5 SAY 'THIRD ADDRESS' GET ADDR3" TO CHECK DO CHECKS DO CLEAR@ ?"Enter @ 7,5 SAY 'FOURTH ADDRESS' GET ADDR4" STORE "@ 7,5 SAY 'FOURTH ADDRESS' GET ADDR4" TO CHECK DO CHECKS DO CLEAR@ ?"Enter @ 8,5 SAY 'FIFTH ADDRESS' GET ADDR5" STORE "@ 8,5 SAY 'FIFTH ADDRESS' GET ADDR5" TO CHECK DO CHECKS DO CLEAR@ ?"Now that the screen . It does, however, illustrate the" ?"flexibility dBASEII provides for screen and printer formatting, and data" ?"entry from the screen." WAIT DO CLEAR@ ?"Don't forget to look at the ZIP package either. That makes screen" ?"building a snap." ? ?"It's time to quit again. After you have, try @ SAY and ZIP. I'll see" ?"you again in the final lesson, lesso. It does, however, illustrate the" ?"flexibility dBASEII provides for screen and printer formatting, and data" ?"entry from the screen." WAIT DO CLEAR@ ?"Don't forget to look at the ZIP package either. That makes screen" ?"building a snap." ? ?"It's time to quit again. After you have, try @ SAY and ZIP. I'll see" ?"you again in the final lesson, lessoADDR3" STORE "@ 6,5 SAY 'THIRD ADDRESS' GET ADDR3" TO CHECK DO CHECKS DO CLEAR@ ?"Enter @ 7,5 SAY 'FOURTH ADDRESS' GET ADDR4" STORE "@ 7,5 SAY 'FOURTH ADDRESS' GET ADDR4" TO CHECK DO CHECKS DO CLEAR@ ?"Enter @ 8,5 SAY 'FIFTH ADDRESS' GET ADDR5" STORE "@ 8,5 SAY 'FIFTH ADDRESS' GET ADDR5" TO CHECK DO ACCEPT 'CORRECT AND RETRY (Y/N)' TO CORRECT STORE !(CORRECT) TO CORRECT IF CORRECT = 'QUIT' QUIT ENDIF IF CORRECT = 'Y' STORE T TO OKC1 DO WHILE OKC1 STORE T TO OKC2 DO WHILE OKC2 ACCEPT 'CHANGE FROM' TO CFROM STORE !(CFROM) TO CFROM IF CFROM = 'QUIT' QUIT ENDIF STORE @(CFROM,COMMAND) TO LOC IF LOC # 0 STORE F TO OKC2 ELSE ?"&CFROM not found." ?"Please try again." ENDIF ENDDO ACCEPT 'CHANGE TO' TO CTO STORE !(CTO) TO CTO IF CTO = 'QUIT' QUIT ENDIF STORE LOC - 1 TO LENI STORE STR(LOC,2) TO LOCX STORE STR(LENI,2) TO LENIX STORE LEN(COMMAND) TO SLEN STORE LEN(CFROM) TO CFROMLEN STORE LOC + CFROMLEN TO SELOC STORE STR(SELOC,2) TO SELOCX STORE (SLEN - SELOC) + 1 TO ELEN STORE STR(ELEN,2) TO ELENX IF LENI # 0 STORE $(COMMAND,1,&LENIX) + CTO TO ISTATE ELSE STORE CTO TO ISTATE ENDIF IF ELEN # 0 STORE ISTATE + $(COMMAND,&SELOCX,&ELENX) TO COMMAND ELSE STORE ISTATE TO COMMAND ENDIF ? ?" &COMMAND" ACCEPT 'MORE CORRECTIONS (Y/N)' TO MOREC STORE !(MOREC) TO MOREC IF MOREC = 'QUIT' QUIT ENDIF IF MOREC = 'Y' LOOP ELSE STORE F TO OKC1 ENDIF ENDDO ENDIF RETURN  0 STORE $(COMMAND,1,LENIX) + CTO TOERASE ?"Throughout these lessons, I will pause to let you read items" ?"displayed on the screen. When I do, the message WAITING will" ?"appear on the screen. When it does, press the space bar to" ?"continue." ? ?"This is a test. Press the space bar when the WAITING message" ?"appears." WAIT ERASE ?" Table of Contents" ? ? ?" I Introduction" ? ?" II A Few New Words" ? ?" III More New Terms" ? ?" IV What Is A Relational Data Base?" ? ? WAIT ERASE ?"I Introduction" ? ?"There is something unusual about this product. There is no manual. Don't" ?"feel cheated. In keeping with the computer age, we have chosen to put" ?"information on magnetic disk, rather than on paper. We did this because" ?"we think that working interactively with a computer is a far better way" ?"to learn than by simply reading a manual." ? ?"In this course, you will be actively working with dBASE II. In many" ?"instances, you will decide the data to be used and the format of output." ?"Where data is supplied, you will have to issue the proper commands to act" ?"on the data. Don't worry though, the dBASE II Lessons give you a lot of" ?"help when you make errors, so if you make errors in dBASE II, you'll know" ?"how to correct them." WAIT ERASE ?"For the beginner, we believe you will find that the first four lessons will" ?"be all you need to really feel comfortable with dBASE II, and at that" ?"point, you will know all of the operations required to create files," ?"generate reports, change data on your files through editing, and perform" ?"computations on your data. Each lesson will probably not take more" ?"than a half hour to complete." ? ?"For the experienced programmer, you're in for a treat. If you think" ?"COBOL, PL/I, FORTRAN, PASCAL, or BASIC are nice programming languages," ?"wait until you try this. The combination of structured English, set" ?"processing, dBASE II functions, macros (substitutions within commands)," ?"stored command procedures (programs), nested DO and nested IF capability," ?"along with true relational data base capability is extremely powerful." ?"At the same time, dBASE II is very easy to use, and it runs on a " ?"microcomputer, which makes it even more attractive. We think you'll find" ?"lessons eight, nine, and ten most interesting." WAIT ERASE ?"II A Few New Words" ? ?"There are a few new terms that are essential to Data Base Management. You" ?"should become familiar with them before you begin the Lessons." ? ?" What Is A File?" ? ?"A file is a body of information about the same subject. Electronic files" ?"are a lot like the paper files in your file cabinet. For example, you" ?"might have a file folder labeled, 'Customers--Smith.' It holds all" ?"information you have on your customers named Smith. You may even have" ?"a personal file folder containing names and addresses of your friends" ?"and relatives." WAIT ERASE ?" What Is A Record?" ? ?"A record is a smaller unit of information within a file. An electronic" ?"record can be compared to a piece of paper which contains information" ?"pertinent to one of your customers. For example, David Smith's name," ?"address, phone number, and purchasing history." ? ?" What Is A Field?" ? ?"A field is a category or heading within a record. If the information" ?"you wanted in a record was NAME, ADDRESS, PHONE NUMBER, TITLE, PRODUCTS" ?"PURCHASED, BILLS OUTSTANDING, you would need to create a field for each" ?"item. The way you intend to use the file will help you to decide how " ?"many fields you have and what they are." WAIT ERASE ?" What Is Data?" ? ?"Data is what you get out of your computer from the information you have" ?"entered into your computer. For example, if you entered a customer's name" ?"as 'David Smith,' 'David Smith' is the data you would get out of your" ?"computer when you asked for that particular customer's name." ? ?"A FILE is the largest unit of information. A FILE contains RECORDS where" ?"DATA is stored under headings or categories called FIELDS." WAIT ERASE ?"III More New Terms" ? ?" Operating Systems" ? ?"The Operating System is essentially the software required to manage your" ?"computer. The most important function of a microcomputer operating system" ?"is to control the input of information and the output of data to computer-" ?"ized devices (such as, a printer, the terminal's display screen, and disk" ?"drives). All of your typed-in requests to print a document, display a" ?"report on the screen, or copy data to a disk pass through the Operating" ?"System. It knows the correct device addresses for requests and makes it" ?"easy for you to use these devices. The Operating System also performs" ?"input and output error checking and attempts error corrections whenever" ?"possible." ? ?"There are a few operating system facilities that you should become familiar" ?"with." WAIT ERASE ?"'DIR' is a command you give your computer to find out what files you have" ?"in a particular disk. When you enter the 'DIR' command at the B prompt" ?"('B>DIR'), you will get a screen display of all names of the files in your" ?"B drive (or on the disk in your B drive)." ? ?"'STAT' is a command that asks for the free space status of a particular" ?"drive (or disk inserted in that drive). When entered at a drive prompt," ?"(for example, 'A>STAT'), your computer will tell you in terms of BYTES" ?"(characters), how much room you have left to work with." WAIT ERASE ?"'PIP' is used to transfer data from one device (a disk, for example) to" ?"another device (another disk, for example). The command to transfer the" ?"file MYFILE from drive A to drive B looks like this:" ? ?" B>PIP B:=A:MYFILE" ? ?"One more command, 'ERA' is a command that should be used with caution." ?"'ERA' erases files you identify. Usually, this is used with text files" ?"you have written, like memos or letters, after they have been sent to the" ?"addressees, or data files that are no longer needed." ? ?"You will find more information on these operating system facilities and how" ?"they work on your computer in your computer operating manual." WAIT ERASE ?"IV What Is A Relational Data Base?" ? ?"First of all, a data base is a systemized organization of computer files" ?"for central access, retrieval, and editing. In a Relational data base," ?"the data base looks like a table. In other data base systems, the" ?"structures are rather complex, but dBASE II data bases all look something" ?"like this simplified example, which follows:" WAIT ERASE ?" Employee Roster" ? ?" EMPNAME EMPNO EMPDEPT EMPSAL EMPSTART" ? ?"REC1 Allen, F. G. 211 ACCT 18,000 01/23/79" ? ?"REC2 Brown, H. B. 354 ADMN 14,500 03/22/82" ? ?"REC3 Calendor, P. 134 PERS 21,000 12/17/77" ? ?"REC4 Calvin, J. 098 PRES 88,000 10/02/75" ? ?"The horizontal axis of this chart lists FIELD NAMES (EMPNAME, EMPNO," ?"EMPDEPT, EMPSAL, EMPSTRT), which read down each column. The vertical" ?"axis lists the records of this file, which read accross the page. With" ?"this type of organization, any or all data bases can be accessed by" ?"naming the coordinates of any particular cell of information. For" ?"example, you can find out the salary of P. Calendor by asking for the" ?"EMPSAL of Calendor, P.. We can also find out anything else about P." ?"Calendor if it is listed in the file. We could also ask for all EMPNAME" ?"(EMPloyees' NAMes) beginning with the letter 'C'." WAIT ERASE RETURN stem is essentially the software required to manage your" ?"computer. The most important function of a microcomputer operating system" ?"is to control the input of information and the output of data to computer-" ?"ized devices (such as, a printer, the terminal's display screen, and disk" ?"drives). All of your typed-inSTORE 0 TO T:NAMEOK STORE 0 TO COUNT STORE LEN(T:NAME) TO T:NAMELC DO WHILE COUNT < T:NAMELC STORE COUNT + 1 TO COUNT STORE STR(COUNT,2) TO COUNTX IF $(T:NAME,&COUNTX,1) < 'A' .OR. $(T:NAME,&COUNTX,1) > 'Z' IF $(T:NAME,&COUNTX,1) < '0' .OR. $(T:NAME,&COUNTX,1) > '9' STORE T:NAMELC TO COUNT STORE 0 TO T:NAMEOK LOOP ELSE STORE 1 TO T:NAMEOK ENDIF ELSE STORE 1 TO T:NAMEOK ENDIF ENDDO IF T:NAMEOK = 1 IF $(T:NAME,1,1) < 'A' .OR. $(T:NAME,1,1) > 'Z' STORE 0 TO T:NAMEOK ?"The first character in a name must be a letter." ?"Please try again." ? ENDIF ELSE ?"Although dBASE II permits some special characters in names, please" ?"use only letters and numbers now. Please try again." ? ENDIF RETURN  TO OK ENDDO ERASE ?"Immediately following the creation of a file, dBASE II asks:" ? ?"ENTER DATA NOW?" ? ?"To which you would reply Y if you wished to enter data intPROMPTd COUNT dBOK *d@STUDENTdKVJSPELLdYPRINTERdNLESSON d6LESSONN d@`OK1 8d@TDRIVE5dACHECKdSAVE TO TUTMEMCOMMANDdSAVE TO TUTMEMCORRECT'dNOKC1dOKC2dCFROMRdUTLOC VdACTO]dTLENI ydALOCX`d14LENIXd13SLEN dACFROMLEN d@ SELOC dASELOCXd16ELEN d@ ELENXd 2ISTATEdDISPLAY STRUCTMOREC?dNMEMNAMEIdREDFORD .NAMEClADDRCl JIM OVER THERE HAROLD RUSSIA GEORGE PENNSYLVANIA THROCKMORTON OUTER MONGOLIA GOD EVERYWHERE ITS OVER THERE SALLY RUSSIA LINDA PENNSYLVANIA HAROLD RUSSIA GEORGE PENNSYLVANIA 0 ITS OVER THERE 0.0 HAROLD RUSSIA 100.5 GEORGE PENNSYLVANIA 58.0DO WHILE OK = 0 ACCEPT TO COMMAND IF !(COMMAND = 'DISPLAY' STORE 1 TO OK ^COMMAND ELSE ?"Check your spelling, and try it again." ENDIF ENDDO ?"That's whSET TALK ON SET ECHO ON USE COMPUTE REPLACE ALL TAXES WITH ((SALCLASS * .06) * MONTHSAL) REPLACE ALL NETSALARY WITH MONTHSAL - TAXES REPLACE ALL YTDSALARY WITH YTDSALARY + NETSALARY WAIT REPORT FORM COMPUTE SET ECHO OFF SET TALK OFF RETURN etter name. Let's change the name of COMPBK" ?"to WHITEHSE. RENAME will do that for us." ?"Type RENAME COMPBK TO WHITEHSE (cr)" STORE 0 TO OK DO WHILE OK = 0 ACCEPT TO COMMAND IF !(COMMAND) # 'RENAME COMPBK TO WHITEHSE' ?"Check your spelling, and try again."  ACCEPT TO COMMAND IF !(COMMAND) # 'QUIT' ?"Check your spelling, and try again." LOOP ELSE STORE 1 TO OK ^COMMAND ENDIF ENDDO RETURN re on the same diskette," ?"and that diskette is unreadable, the back-up file" ?"is just as inaccessible as the original. Since " ?"we're just demonstrating the commands required to" ?"back-up a file, we'll put them on the samPOSITIONC lYTDSALARYNlMONTHSALNlSALCLASSNlTAXESNlNETSALARYNl DATECsAMTN sNUMNsCLEARLs 04/12/84 100000.00 1F mselect PICTURE "#" READ * reading user response STORE VAL(mselect) TO select ENDDO * process user's response DO CASE * test for exit condition CASE select = 0 RELEASE mselect,select * retain variables - 'balance', 'lastchk' and 'lastdep' SAVE TO Cb-book.mem * clear variables and return to calling program or dbase system CLEAR ERASE RETURN * test for new checBALANCE gDPLASTDEP g@LASTCHK g@FMENU.CMD (.PRG) TO loop2 ENDIF ENDDO loop2 IF !(answer)="Y" * data is correct - add to database APPEND BLANK REPLACE Chkno WITH mchkno REPLACE Date WITH mdate REPLACE Payto WITH mpayto REPLACE Amt WITH mamt REPLACE Memo WITH mmemo REPLACE Can WITH mcan * update balance and lastchk STORE balance - Amt TO ba* Program.: CB-CANCL.CMD (.PRG) * Author..: Anonymous * Date....: February 9, 1984 * Notice..: Copyright 1984, Ashton-Tate and RSP, Inc. * Notes...: Enter cancelled checks * Called from CB-MENU.CMD (.PRG) * enter cancelled check data * USE Cb-check * draw check mask DO Cb-mask @ 1,26 SAY "CHECK CANCELLATION ROUTINE" STORE T TO more DO WHILE more * more is designed for repeated check cancellations STORE 0 TO mcan * input check number to be cancelled @ 20, 0 @ 18,11 SAY "Enter Check Number to be cancelled (or 0 to exit)"; GET mcan PICTURE "####" READ * testing for exit condition IF mcan = 0 STORE F TO more LOOP ENDIF * search for cancelled check number LOCATE FOR Chkno = mcan IF .NOT. Can .AND. .NOT. EOF * if not already cancelled and not at end of file, display check data @ 4,71 SAY Chkno @ 6,68 SAY Date @ 8,25 SAY Payto @ 8,66 SAY Amt PICTURE "#######.##" @ 14,10 SAY Memo @ 18, 0 STORE " " TO answer @ 18,23 SAY "Is this the right check? [Y/N] " GET answer PICTURE "!" READ IF answer = "Y" REPLACE Can WITH T ENDIF ELSE * if not located, clear entry from previous check on screen @ 4,71 SAY " " @ 6,68 SAY " " @ 8,25 SAY " " @ 8,66 SAY " " @ 14,10 SAY " " IF EOF * check is not in file @ 20,21 SAY "Check "+STR(mcan,4)+" cannot be found." ELSE * check is already cancelled @ 20,19 SAY "Check "+STR(mcan,4)+" is already cancelled." ENDIF STORE " " TO wait @ 21,20 SAY "Press any key to continue " GET wait READ @ 20, 0 @ 21, 0 ENDIF CLEAR GETS ENDDO more ERASE * display to the screen a list of remaining uncleared checks ? " LIST OF REMAINING UNCLEARED CHECKS" ? ? "CHKNO PAID TO "+; "AMOUNT DATE MEMO" ? "----- ------------------------------- ---------- -------- --------------" DISPLAY OFF ALL FOR .NOT. Can Chkno, Payto, Amt, Date, TRIM(Memo) ? ? STORE " " TO answer @ 22,13 SAY "Press any key to return to the main menu " GET answer READ * close out open files and variables USE RELEASE mcan,answer,more,wait RETURN * EOF: CB-CANCL.CMD (.PRG) * Program.: CB-CHECK.CMD (.PRG) * Author..: Anonymous * Date....: February 9, 1984 * Notice..: Copyright 1984, Ashton-Tate and RSP, Inc. * Notes...: Enter checks * Called from CB-MAIN.CMD (.PRG) * enter new check data USE Cb-check * draw the check mask on the screen DO Cb-mask STORE T TO loop1 DO WHILE loop1 * loop1 is designed to continue entering checks into the database @ 1,60 SAY "LAST CHECK #"+STR(lastchk,4,0) * initialize memory variables STORE lastchk+1 TO mchkno STORE " " TO mdate STORE " " TO mpayto STORE 0 TO mamt STORE " " TO mmemo STORE F TO mcan STORE T TO loop2 DO WHILE loop2 * loop2 is designed to enter and reenter correct data STORE T TO loop3 DO WHILE loop3 * loop3 is designed to check for duplicate check numbers @ 4,42 SAY "(Enter 0 to exit)" @ 4,70 GET mchkno PICTURE "####" READ @ 4,42 SAY " " @ 18, 0 IF mchkno = 0 USE RELEASE loop1,loop2,loop3,answer,is:valid,valid,ans,taxchar,; mchkno,mdate,mpayto,mamt,mmemo,mcan,mtax,word1,word2 RELEASE amt:full,length,amt:word,is:error,count,true,string RETURN ENDIF * test for negative check number IF mchkno < 0 STORE lastchk+1 TO mchkno LOOP ENDIF * check for duplicate check number LOCATE FOR Chkno=mchkno IF .NOT. EOF @ 18,15 SAY "Check number already exists. Please reenter" ELSE STORE F TO loop3 @ 18,0 ENDIF ENDDO loop3 STORE F TO is:valid DO WHILE .NOT. is:valid @ 6,67 GET mdate PICTURE "##/##/##" READ * check for valid date DO Cb-date IF .NOT. is:valid @ 18,25 SAY "Invalid date - please reenter" ELSE @ 18, 0 ENDIF ENDDO STORE F TO valid DO WHILE .NOT. valid * test for name on check - no blank checks allowed @ 8,24 GET mpayto READ IF mpayto = " " @ 18,15 SAY "No blank checks allowed - please reenter" ELSE @ 18, 0 STORE T TO valid ENDIF ENDDO STORE F TO valid DO WHILE .NOT. valid * test for amount less than or equal to 0 @ 8,65 GET mamt PICTURE "#######.##" READ IF mamt = 0.00 @ 18,15 SAY "Check must have an amount - please reenter " ELSE IF mamt < 0.00 @ 18,15 SAY "Check must be a positive amount - "+; "please reenter" ELSE @ 18, 0 * put numbers into words!! STORE mamt TO amt:full DO Cb-nbwd IF is:error @ 20,20 SAY "Number is too large - please reenter" ELSE STORE T TO valid ENDIF ENDIF ENDIF ENDDO IF balance < mamt @ 18,10 SAY "There are not sufficient amount of funds "+; "to cover this check." * erase current check display @ 6,67 SAY " " @ 8,24 SAY " " @ 8,65 SAY " " STORE lastchk+1 TO mchkno STORE " " TO mdate STORE " " TO mpayto STORE 0.00 TO mamt LOOP ENDIF * display words on check STORE " "; TO string STORE LEN(amt:word) TO length IF length > 75 STORE 74 TO count STORE T TO true DO WHILE true IF $(amt:word,count,1)=" " .OR. $(amt:word,count,1)="-" STORE F TO true ELSE STORE count-1 TO count ENDIF ENDDO STORE $(amt:word,1,count)+$(string,1,75-count) TO word1 STORE $(amt:word,count+1,length-count) TO word2 @ 11,4 SAY word1 @ 12,10 SAY word2 ELSE STORE amt:word + $(string,1,75-length) TO word1 @ 11,4 SAY word1 @ 12,10 SAY " " ENDIF * enter memo data @ 14, 9 GET mmemo READ @ 18,0 STORE " " TO answer @ 18,10 SAY "IS THE ABOVE CHECK CORRECT? "+; "[ (Y)es / (N)o / (A)bort ] " GET answer PICTURE "!" READ CLEAR GETS @ 18,0 IF answer$"YA " STORE F TO loop2 ENDIF ENDDO loop2 IF answer $ "Y " APPEND BLANK REPLACE Chkno WITH mchkno,Date WITH mdate,Payto WITH mpayto,; Amt WITH mamt,Memo WITH mmemo,Can WITH mcan STORE balance - Amt TO balance STORE Chkno TO lastchk STORE " " TO answer @ 18,5 SAY "Do you need a record of this check for income"+; " tax purposes? [Y/N] " GET answer PICTURE "!" READ IF answer $ "Y " @ 18, 0 @ 18, 1 SAY "(1) Business expenses (4) Alimony" @ 18,55 SAY "(7) Contributions" @ 19, 1 SAY "(2) Medical or Dental (5) Child Care" @ 19,55 SAY "(8) Miscellaneous" @ 20, 1 SAY "(3) Medicine or Drugs (6) Automotive" STORE 9 TO mtax DO WHILE mtax < 0 .OR. mtax > 8 * enter respective tax deduction STORE " " TO taxchar @ 22, 5 SAY "Enter number which corresponds to tax "+; "deduction (or 0 for none) " GET taxchar READ STORE VAL(taxchar) TO mtax ENDDO ELSE STORE 0 TO mtax ENDIF REPLACE Tax WITH mtax @ 18,0 @ 19,0 @ 20,0 @ 22,0 ENDIF STORE " " TO answer @ 18,10 SAY "Would you like to enter another check? [Y/N] "; GET answer PICTURE "!" READ @ 18,0 IF answer = "N" STORE F TO loop1 ELSE @ 6,67 SAY " " @ 8,24 SAY " " @ 8,65 SAY " " @ 14, 9 SAY " " @ 11, 4 SAY "__________________________________________________" @ 11,54 SAY "_______________Dollars" @ 12,10 SAY " " ENDIF ENDDO loop1 USE RELEASE loop1,loop2,loop3,answer,is:valid,valid,ans,taxchar,mchkno,mdate,; mpayto,mamt,mmemo,mcan,mtax RELEASE amt:full,length,amt:word,is:error,count,true,word1,word2,string RETURN * EOF: CB-CHECK.CMD (.PRG)  SAY " " @ 14, 9 SAY " " @ 11, 4 SAY "__________________________________________________" @ 11,54 SAY "_______________Dollars" @ 12,10 SAY " " ENDIF ENDDO loPCHKNONsPAYTOCsAMTN sCANLtDATECtMEMOCtTAXN't 1JIM NOVAK 50000.00T04/12/84SERVICES 3ponse STORE VAL(mselect) TO select ENDDO * process user's response DO CASE * test for exit condition CASE select = 0 RELEASE mselect,select * retain variables - 'balance', 'lastchk' and 'lastdep' SAVE TO Cb-book.mem * clear variables and return to calling program or dbase system CLEAR ERASE RETURN * test for new chec* Program.: CB-CLEAR.CMD (.PRG) * Author..: Anonymous * Date....: February 9, 1984 * Notice..: Copyright 1984, Ashton-Tate and RSP, Inc. * Notes...: Clear deposits * Called from CB-MENU.CMD (.PRG) USE Cb-bank ERASE @ 1,20 SAY "Clear Deposits with Bank Statement" @ 2,20 SAY "----------------------------------" @ 3, 5 SAY " Date Amount " @ 4, 5 SAY "-------- ----------" IF lastdep>10 @ 3,45 SAY " Date Amount " @ 4,45 SAY "-------- ----------" ENDIF IF lastdep > 20 STORE 20 TO stop ELSE STORE lastdep TO stop ENDIF STORE 1 TO col,count STORE 5 TO row DO WHILE count <= stop LOCATE FOR Num=count @ row,col SAY Num @ row,col+4 SAY Date @ row,col+15 SAY Amt IF count = 10 STORE 41 TO col ENDIF STORE count+1 TO count IF count > 10 STORE count-6 TO row ELSE STORE count+4 TO row ENDIF ENDDO STORE T TO loop1 DO WHILE loop1 STORE -1 TO number DO WHILE number < 0 .OR. number > stop STORE " " TO mnumber @ 16,15 SAY "Enter number of corresponding deposit listed on" @ 17,21 SAY "bank statement (or 0 to exit) " GET mnumber READ STORE VAL(mnumber) TO number ENDDO @ 19,0 IF number = 0 STORE F TO loop1 LOOP ENDIF IF number > 10 STORE 39 TO col STORE number-6 TO row ELSE STORE 0 TO col STORE number+4 TO row ENDIF LOCATE FOR Num=number IF EOF @ 19,22 SAY "Already cleared - please reenter" ELSE STORE " " TO answer @ 19,25 SAY "Is this correct? [Y/N] " GET answer PICTURE "!" READ @ 19,0 IF answer $ "Y " REPLACE Clear WITH T,Num WITH 0 @ row,col SAY " " ELSE @ row,col SAY " " ENDIF ENDIF CLEAR GETS ENDDO STORE 0 TO count LOCATE FOR .NOT. Clear IF EOF @ 22,22 SAY "There are no deposits in transit" STORE 0 TO lastdep ELSE STORE T TO loop2 DO WHILE loop2 STORE count+1 TO count REPLACE Num WITH count CONTINUE IF EOF STORE count TO lastdep STORE F TO loop2 ENDIF ENDDO @ 22,22 SAY "There are "+STR(lastdep,2,0)+" deposits in transit" ENDIF USE * release memory variables RELEASE stop,col,row,count,loop1,number,mnumber,answer,loop2 * EOF: CB-CLEAR.CMD (.PRG) ar IF EOF @ 22,22 SAY "There are no deposits in transit" STORE 0 TO lastdep ELSE STORE T TO loop2 DO WHILE loo* Program.: CB-DATE.CMD (.PRG) * Author..: Luis A. Castro * Date....: 8/2/83, 11/20/83. * Notice..: Copyright 1983, ASHTON-TATE, All Rights Reserved. * May not be reproduced without permission. * Notes...: Subroutine to verify a date. * PARAMETERS------------------------------------------------+ * name typ len picture description * ========== === === ========== ======================= * mdate C 8 MM/DD/YY Calendar date * (or) mdate C 10 MM/DD/YYYY Calendar date * is:valid L 1 Validation flag. * ----------------------------------------------------------+ STORE F TO is:valid IF 0 = TEST(MDATE) .OR.; ( LEN(mdate) <> 8 .AND. LEN(mdate) <> 10 ) .OR.; @(" ",mdate) > 0 .OR. @("-",mdate) > 0 .OR.; @(".",mdate) > 0 .OR. @("+",mdate) > 0 * ---The memory variable "mdate" must exist and * ---must not contain special characters. RETURN ENDIF * STORE VAL( $(mdate,1,2) ) TO t:month STORE VAL( $(mdate,4,2) ) TO t:day IF LEN(mdate) = 8 STORE VAL( $(mdate,7,2) ) TO t:year ELSE STORE VAL( $(mdate,7,4) ) TO t:year ENDIF * DO CASE CASE t:month < 1 .OR. t:month > 12 .OR. t:day < 1 .OR.; t:day > VAL( $("312931303130313130313031",; ( t:month - 13*INT(t:month/13))*2 - 1, 2 ) ) * CASE LEN(mdate)= 8 .AND. t:month=2 .AND.; t:day > 28 .AND. t:year/4 > int(t:year/4) * CASE LEN(mdate)=10 .AND. t:month=2 .AND.; t:day > 28 .AND. ( (t:year/4 > INT(t:year/4) .AND.; t:year/100 = INT(t:year/100)) .OR.; t:year/400 > INT(t:year/400) ) * OTHERWISE STORE T TO is:valid ENDCASE * RELEASE t:month,t:day,t:year RETURN * EOF: CB-DATE.PRG (.CMD)  ( t:month - 13*INT(t:month/13))*2 - 1, 2 ) ) * CASE LEN(mdate)= 8 .AND. t:month=2 .AND.; t:day > 28 .AND. t:year/4 > int(t:year/4) * CASE LEN(mdate)=10 .AND. t:month=2 .AND.; t:day > 28 .AND. ( (t:year/4 > INT(t:year/4* Program.: CB-DEPST.CMD (.PRG) * Author..: Anonymous * Date....: February 9, 1984 * Notice..: Copyright 1984, Ashton-Tate and RSP, Inc. * Notes...: Enter deposits * Called from CB-MAIN.CMD * enter new deposit data USE Cb-depst GO BOTTOM STORE #+1 TO firstdep * initialize logical memory variables STORE F TO special,again STORE T TO continue DO WHILE continue * continue loop is for continuing entering a deposit slip ERASE @ 3, 0 SAY "+--------------------------------------------+" @ 4, 0 SAY "|" @ 5, 0 SAY "|" @ 6, 0 SAY "|" @ 7, 0 SAY "|" @ 8, 0 SAY "|" @ 9, 0 SAY "|" @ 10, 0 SAY "|" @ 11, 0 SAY "|" @ 12, 0 SAY "|" @ 13, 0 SAY "|" @ 14, 0 SAY "|" @ 15, 0 SAY "|" @ 16, 0 SAY "|" @ 17, 0 SAY "|" @ 18, 0 SAY "|" @ 19, 0 SAY "|" @ 20, 0 SAY "+--------------------------------------------+" @ 19,45 SAY "|" @ 18,45 SAY "|" @ 17,45 SAY "|" @ 16,45 SAY "|" @ 15,45 SAY "|" @ 14,45 SAY "|" @ 13,45 SAY "|" @ 12,45 SAY "|" @ 11,45 SAY "|" @ 10,45 SAY "|" @ 9,45 SAY "|" @ 8,45 SAY "|" @ 7,45 SAY "|" @ 6,45 SAY "|" @ 5,45 SAY "|" @ 4,45 SAY "|" @ 6, 3 SAY "========================================" @ 7,30 SAY "|" @ 8,30 SAY "|" @ 9,30 SAY "|" @ 10,30 SAY "|" @ 11,30 SAY "|" @ 12,30 SAY "|" @ 13,30 SAY "|" @ 14,30 SAY "|" @ 2,18 SAY "DEPOSIT SLIP" @ 5, 9 SAY "RECEIVED FROM" @ 5,34 SAY "AMOUNT" @ 16,15 SAY "SUBTOTAL" * initialize memory variables STORE 0.00 TO subtotal,total,cash @ 16,32 SAY subtotal * enter date if first time through loop IF .NOT. again STORE F TO is:valid,c DO WHILE .NOT. is:valid STORE " " TO mdate @ 4,5 SAY "ENTER DATE OF DEPOSIT " GET mdate PICTURE "##/##/##" READ @ 4,48 IF mdate=" / / " @ 4,55 SAY "NO DATE ENTERED" STORE " " TO ans @ 5,48 SAY "Do you wish to abort? [Y/N] " GET ans PICTURE "!" READ IF ans = "Y" USE RELEASE firstdep,special,again,continue,subtotal,total,; cash,is:valid,mdate,ans RETURN ENDIF @ 4,48 @ 5,48 ELSE DO Cb-date IF .NOT. is:valid @ 4,48 SAY "Invalid Date - please reenter" ELSE STORE " " TO answer @ 4,48 SAY "Is this correct? [Y/N] " GET answer PICTURE "!" READ @ 4,48 IF answer = "N" STORE F TO is:valid ENDIF ENDIF ENDIF ENDDO is:valid ENDIF @ 4,4 SAY " Date of Deposit: " @ 4,25 SAY mdate STORE 7 TO line STORE F TO restart STORE T TO loop2 DO WHILE loop2 * loop2 is for updating incorrect deposit slip STORE T TO more DO WHILE more * more is for entering and updating individual deposit entries IF line > 14 @ 16,15 SAY " " @ 20, 0 @ 23, 0 @ 0, 0 @ 19, 0 SAY "|" @ 19,45 SAY "|" @ 20, 0 SAY "+--------------------------------------------+" @ 14,30 SAY "|" @ 16,15 SAY "SUBTOTAL" @ 16,32 SAY subtotal STORE 14 TO line ENDIF * if second time through loop IF again IF .NOT. special STORE Paidfrom TO mpayfrom STORE Amt TO mamt ENDIF * display deposit information @ line,4 SAY mpayfrom @ line,32 SAY mamt IF .NOT. special STORE " " TO ans @ line,48 SAY "Is this correct? [Y/N] " GET ans PICTURE "!" READ ENDIF @ line,48 CLEAR GETS IF ans = "N" .OR. special STORE " " TO an @ line,52 SAY "Do you wish to delete" @ line+1,50 SAY "this transaction? [Y/N] " GET an PICTURE "!" READ @ line,48 @ line+1,48 IF an = "Y" * erase current deposit from screen... @ line,3 SAY " " @ line,31 SAY " " DELETE SKIP IF EOF STORE F TO more ENDIF LOOP ELSE IF special REPLACE Paidfrom WITH mpayfrom,Amt WITH mamt ENDIF ENDIF ELSE STORE subtotal + mamt TO subtotal @ 16,32 SAY subtotal SKIP IF EOF STORE F TO more ENDIF STORE line+1 TO line LOOP ENDIF ELSE STORE " " TO mpayfrom STORE 0.00 TO mamt STORE F TO loopamt ENDIF STORE F TO special * this routine is to enter deposit data @ line,3 GET mpayfrom READ IF mpayfrom=" " @ line,3 SAY " " @ line,29 SAY " " @ line,31 SAY " " IF again STORE T TO special LOOP ENDIF STORE F TO more LOOP ENDIF STORE T TO loopamt DO WHILE loopamt * make sure a positive amount is inputted @ line,31 GET mamt READ IF mamt <= 0 STORE 0.00 TO mamt ELSE STORE F TO loopamt ENDIF ENDDO * display subtotal to screen STORE subtotal + mamt to test @ 16,32 SAY test STORE " " TO ans @ line,48 SAY "Is this correct? [Y/N] " GET ans PICTURE "!" READ @ line,48 CLEAR GETS IF ans = "N" @ 16,32 SAY subtotal @ line,31 SAY " " LOOP ENDIF * delete colons from the screen surrounding each input @ line,3 SAY " " @ line,29 SAY " " @ line,31 SAY " " @ line,42 SAY " " STORE subtotal + mamt TO subtotal * now add a record (if first time through)... IF .NOT. again APPEND BLANK ENDIF REPLACE Paidfrom WITH mpayfrom,Date WITH mdate,Amt WITH mamt IF again SKIP IF EOF STORE F TO more ENDIF ENDIF STORE line+1 TO line ENDDO more IF subtotal = 0 @ line,52 SAY "NO DEPOSITS ENTERED" STORE " " TO ans @ line+1,48 SAY "Do you wish to abort? [Y/N] " GET ans PICTURE "!" READ @ line,52 @ line+1,48 IF ans = "Y" PACK USE RELEASE firstdep,special,again,continue,subtotal,total,cash,c,; is:valid,mdate,line,restart,loop2,more,mpayfrom,mamt RELEASE loopamt,test,ans,answer,an RETURN ELSE IF again PACK STORE T TO restart STORE F TO loop2 ELSE LOOP ENDIF ENDIF ELSE STORE F TO loop2 ENDIF ENDDO loop2 IF restart STORE F TO again,special RELEASE line,restart,loop2,more,mpayfrom,mamt,loopamt,test,answer,an LOOP ENDIF @ 18,30 SAY "-------------" @ 17,15 SAY "LESS CHANGE" STORE 0.00 TO total DO WHILE total <= 0.00 @ 17,31 GET cash READ @ 22,0 STORE subtotal-cash TO total IF total <= 0.00 @ 22,10 SAY "Cash withdrawal exceeds deposit - please reenter" ENDIF ENDDO IF cash <> 0 @ 17,31 SAY "<" @ 17,42 SAY " >" ELSE @ 17,31 SAY " " @ 17,42 SAY " " ENDIF @ 19,15 SAY "TOTAL DEPOSIT" @ 19,32 SAY total STORE " " TO answer @ 22, 6 SAY "Is the above deposit slip correct? "+; "[ (Y)es / (N)o / (A)bort ] " GET answer PICTURE "!" READ IF answer = "N" GOTO firstdep STORE T TO again LOOP ENDIF IF answer = "A" @ 22,0 @ 22,12 SAY "ABORTING ABOVE DEPOSIT" GOTO firstdep DO WHILE .NOT. EOF DELETE SKIP ENDDO PACK ENDIF IF answer$"Y " STORE balance + total TO balance IF cash > 0 APPEND BLANK REPLACE Date WITH mdate,Amt WITH -cash,Paidfrom WITH "Cash Withdrawal" ENDIF IF again PACK STORE F TO again ENDIF STORE lastdep+1 TO lastdep USE Cb-bank APPEND BLANK REPLACE Date WITH mdate,Amt WITH total,Num WITH lastdep,Clear WITH F USE Cb-depst ENDIF STORE " " TO answer @ 22,0 @ 22, 3 SAY "Would you like to enter another deposit? [Y/N] "; GET answer PICTURE "!" READ IF answer = "N" STORE F TO continue ELSE GO BOTTOM STORE #+1 TO firstdep RELEASE line,restart,loop2,more,mpayfrom,mamt,loopamt,test,answer,an ENDIF CLEAR GETS ENDDO continue USE RELEASE firstdep,again,continue,subtotal,total,cash,c,is:valid,mdate,; line,more,mpayfrom,mamt,loopamt,test,ans,an,answer RELEASE special,loop2,restart RETURN * EOF: CB-DEPST.CMD (.PRG) GET answer PICTURE "!" READ IF answer = "N" STORE F TO continue ELSE GO BOTTOM STORE #+1 TO firstdep RELEASE line,restart,loop2,more,mpayfrom,mamt,loopamt,test,answer,an ENDIF CLEAR GETS ENDDO continue USE RELEASE firstdep,again,continue,subtotal,total,cash,c,is:valid,mdate,; line,more,mpayfrom,mamt,loopamt,test,ans,an,,DATECsAMTN sPAIDFROMCs 04/12/84 100000.00KAYPRO Y "||" @ 4,78 SAY "||" @ 5, 0 SAY "||" @ 5,78 SAY "||" @ 6, 0 SAY "||" @ 6,78 SAY "||" @ 7, 0 SAY "||" @ 7,78 SAY "||" @ 8, 0 SAY "||" @ 8,78 SAY "||" @ 9, 0 SAY "||" @ 9,78 SAY "||" @ 10, 0 SAY "||" @ 10,78 SAY "||" @ 11, 0 SAY "||" @ 11,78 SAY "||" @ 12, 0 SAY "========================================" @ 12,40 SAY "========================================" @ 5,29 SAY " 0. exit" @ 6,29 SAY " 1. mailing labels"* Program.: CB-HELP.CMD (.PRG) * Author..: Stephen Kurasch * Date....: February 9, 1984 * Notice..: Copyright 1984, Ashton-Tate and RSP, Inc. * Notes...: Help screens called from CB-MENU.CMD ERASE SET COLON OFF ? TEXT Welcome to the Checkbook Management System. This system is designed to keep track of your deposits, your checks, balancing your checkbook and print- ing reports of several combinations. Listed below are the menu selections and a description of each. (1) Enter new checks: This selection will allow the user to enter checks. The special features of this entry are checking for duplicate check numbers, checking for a valid date, not allowing a blank check, making sure that a positive, non-zero amount exists, and categorizing the check into 8 different tax deductible fields (if needed). (2) Enter deposits: This selection is for entering a deposit slip. The special features included here are keeping track of the individual deposits as well as the entire deposit slip itself. It checks for positive, non-zero amounts and provides a place to deduct cash withdrawals. ENDTEXT STORE " " TO continue @ 23,25 SAY "Press any key to continue " GET continue READ ERASE ? TEXT (3) Enter cancelled checks: This selection allows you to cancel the checks you received with your bank statement. It checks to make sure that the check has already been cancelled or that the check is on file. (4) Entered cleared deposits: This selection allows you to clear the deposits that are listed on the bank statement. (5) Reconcile bank statement: This selection is a bank reconciliation. Preparing a bank recon- ciliation means determining those items which make up the difference between the balance on the bank statement and the balance in the checkbook. We must deduct from our records any charges that been made by the bank. We must add to our records any amount that the bank has credited to our account. This includes interest earned, or if you are lucky enough, a bank note that has come due to you. As in (3) and (4) above, these must be taken into account on the banks records. ENDTEXT STORE " " TO continue @ 23,25 SAY "Press any key to continue " GET continue READ ERASE ? TEXT (6) Reports: This selection will print several combinations of reports. These include listings of all checks, of all taxable checks, and of all deposits between two dates. All reports can be listed on the screen or to the printer. Have fun!!! ENDTEXT STORE " " TO continue @ 23,17 SAY "Press any key to return to the main menu " GET continue READ SET COLON ON RELEASE continue RETURN * Program.: CB-MAIN.CMD (.PRG) * Author..: Anonymous * Date....: February 9, 1984 * Notice..: Copyright 1984, Ashton-Tate and RSP, Inc. * Notes...: Main menu for checkbook management system * Turn off display of commands to the screen SET TALK OFF SET BELL OFF SET INTENSITY OFF * Pull retained variables from memory file CHXBOOK.MEM RESTORE FROM Cb-book.mem DO WHILE T * DO WHILE T means DO WHILE TRUE i.e. DO FOREVER * The DO WHILE will be terminated by a RETURN command * clear the screen and display the main menu ERASE @ 1, 0 SAY "========================================" @ 1,40 SAY "========================================" @ 2, 0 SAY "||" @ 3, 0 SAY "========================================" @ 3,40 SAY "========================================" @ 4, 0 SAY "||" @ 5, 0 SAY "||" @ 6, 0 SAY "||" @ 7, 0 SAY "||" @ 8, 0 SAY "||" @ 9, 0 SAY "||" @ 10, 0 SAY "||" @ 11, 0 SAY "||" @ 12, 0 SAY "||" @ 13, 0 SAY "||" @ 14, 0 SAY "||" @ 15, 0 SAY "========================================" @ 15,40 SAY "========================================" @ 14,78 SAY "||" @ 13,78 SAY "||" @ 12,78 SAY "||" @ 11,78 SAY "||" @ 10,78 SAY "||" @ 9,78 SAY "||" @ 8,78 SAY "||" @ 7,78 SAY "||" @ 6,78 SAY "||" @ 5,78 SAY "||" @ 4,78 SAY "||" @ 2,78 SAY "||" @ 2,12 SAY "C H E C K B O O K M A N A G E M E N T S Y S T E M" @ 5,25 SAY " 0 - Exit" @ 6,25 SAY " 1 - Enter new checks" @ 7,25 SAY " 2 - Enter deposits" @ 8,25 SAY " 3 - Enter cancelled checks" @ 9,25 SAY " 4 - Enter cleared deposits" @ 10,25 SAY " 5 - Reconcile bank statement" @ 11,25 SAY " 6 - Reports" @ 12,25 SAY " 7 - Help" * display the current checkbook balance @ 18,20 SAY "Current Checkbook balance $ "+STR(balance,10,2) STORE 8 TO select * check for non-valid entry to menu DO WHILE select < 0 .OR. select > 7 STORE " " TO mselect @ 15,33 SAY " select : : " @ 15,41 GET mselect PICTURE "#" READ * reading user response STORE VAL(mselect) TO select ENDDO * process user's response DO CASE * test for exit condition CASE select = 0 RELEASE mselect,select * retain variables - 'balance', 'lastchk' and 'lastdep' SAVE TO Cb-book.mem * clear variables and return to calling program or dbase system CLEAR ERASE RETURN * test for new checks CASE select = 1 DO Cb-check * test for new deposits CASE select = 2 DO Cb-depst * test for cancelled checks CASE select = 3 DO Cb-cancl * test for clearing deposits in transit CASE select = 4 DO Cb-clear * test for reconcile with bank statement CASE select = 5 DO Cb-recon * test for reports CASE select = 6 DO Cb-reprt * test for help screens CASE select = 7 DO Cb-help OTHERWISE ENDCASE ENDDO RETURN * EOF: CB-MAIN.CMD (.PRG) r cancelled checks CASE select = 3 DO Cb-cancl * test for clearing deposits in transit CASE select = 4 DO Cb-clear * test for reconcile with bank statement CASE select = 5 DO Cb-recon * test for reports CASE select = 6 DO Cb-reprt * test for help screens CASE select = 7 DO Cb-help * Program.: CB-MASK.CMD (.PRG) * Author..: Anonymous * Date....: February 9, 1984 * Notice..: Copyright 1984, Ashton-Tate and RSP, Inc. ERASE @ 2, 0 SAY "+-------------------------------------------------" @ 2,50 SAY "-----------------------------+" @ 3, 0 SAY "|" @ 4, 0 SAY "|" @ 5, 0 SAY "|" @ 6, 0 SAY "|" @ 7, 0 SAY "|" @ 8, 0 SAY "|" @ 9, 0 SAY "|" @ 10, 0 SAY "|" @ 11, 0 SAY "|" @ 12, 0 SAY "|" @ 13, 0 SAY "|" @ 14, 0 SAY "|" @ 15, 0 SAY "|" @ 16, 0 SAY "+-------------------------------------------------" @ 16,50 SAY "-----------------------------+" @ 15,79 SAY "|" @ 14,79 SAY "|" @ 13,79 SAY "|" @ 12,79 SAY "|" @ 11,79 SAY "|" @ 10,79 SAY "|" @ 9,79 SAY "|" @ 8,79 SAY "|" @ 7,79 SAY "|" @ 6,79 SAY "|" @ 5,79 SAY "|" @ 4,79 SAY "|" @ 3,79 SAY "|" @ 4,63 SAY "Number" @ 5,70 SAY "------" @ 6,63 SAY "Date" @ 7,68 SAY "--------" @ 8, 4 SAY "Pay To The Order Of" @ 8,64 SAY "$" @ 9,24 SAY "--------------------------------" @ 9,65 SAY "------------" @ 11, 4 SAY "__________________________________________________"+; "_______________Dollars" @ 14, 4 SAY "Memo" @ 14,51 SAY "_______________________" @ 15, 9 SAY "---------------------------" RETURN * EOF: CB-MASK.CMD (.PRG) 9 SAY "|" @ 4,79 SAY "|" @ 3,79 SAY "|" @ 4,63 SAY "Number" @ 5,70 SAY "------" @ 6,63 SAY "Date" @ 7,68 SAY "--------" @ 8, 4 SAY "Pay To The Order Of" @ 8,64 SAY "$" @ 9,24 SAY "--------------------------------" @ 9,65 SAY "----------* Program..: CB-NBWD.CMD (.PRG) * Author...: Tom Rettig * Date.....: August 26, 1983 * Revised..: January 11, 1984 * Notice...: Copyright 1983, ASHTON-TATE, All Rights Reserved. * May not be reproduced without written permission. * Notes....: Subroutine for converting a numeric dollar amount * (to $999,999.99) to words. * Parameters passed: * name type length description * ---------- ---- ------ --------------------------- * in: amt:full N 3 - 9 Including 2 decimal places. * out: amt:word C 23 -86 Depending on the amount. * is:error L 1 .T. if error in conversion. * Initialize memory variables... STORE "ONE TWO THREEFOUR FIVE SIX SEVENEIGHTNINE TEN " TO t:unit STORE "ELEVEN TWELVE THIRTEEN FOURTEEN FIFTEEN SIXTEEN "+; "SEVENTEEENEIGHTEEN NINETEEN " TO t:teen STORE "TEN TWENTY THIRTY FORTY FIFTY SIXTY SEVENTYEIGHTY NINETY"; TO t:decade STORE " " TO amt:word STORE F TO is:error * * Convert decimal places to a string containing cents amount... STORE STR((amt:full-INT(amt:full))*100,2) TO t:cent:str IF t:cent:str = " " STORE "0" + $(t:cent:str,2,1) TO t:cent:str ENDIF * Change tthe environment for upcoming branches... SET EXACT ON * Conditional branch... DO CASE * Branch for amounts too high or too low... CASE amt:full > 999999.99 .OR. amt:full < 0.00 STORE T TO is:error RELEASE ALL LIKE t:* SET EXACT OFF RETURN * Branch for zero dollars... CASE amt:full < 1.00 STORE " NO " TO amt:word * Branch for other conditions... OTHERWISE * Convert dollar amount to a character string... STORE STR(INT(amt:full),6) TO t:amt:str * Branch for hundred thousands... IF $(t:amt:str,1,1) > "0" STORE $(t:amt:str,1,1) TO t:hunthous STORE amt:word+TRIM($(t:unit,(VAL(t:hunthous)-1)*5+1,5))+; " HUNDRED " TO amt:word ENDIF * Branch for ten-thousands and thousands... IF $(t:amt:str,2,2) > " " STORE $(t:amt:str,2,1) TO t:tenthous STORE $(t:amt:str,3,1) TO t:thousand * Branch for combinations of ten-thousands and thousands... DO CASE CASE $(t:amt:str,1,1)>"0" .AND. VAL($(t:amt:str,2,2))=0 STORE amt:word + "THOUSAND" TO amt:word CASE t:tenthous=" " .OR. t:tenthous="0" STORE amt:word+TRIM($(t:unit,(VAL(t:thousand)-1)*5+1,5))+; " THOUSAND" TO amt:word CASE t:thousand="0" STORE amt:word+TRIM($(t:decade,(VAL(t:tenthous); -1)*7+1,7))+" THOUSAND" TO amt:word CASE t:tenthous="1" STORE amt:word+TRIM($(t:teen,(VAL(t:thousand)-1)*9+1,9))+; " THOUSAND" TO amt:word CASE t:tenthous>"1" STORE amt:word+TRIM($(t:decade,(VAL(t:tenthous); -1)*7+1,7))+"-"+TRIM($(t:unit,(VAL(t:thousand); -1)*5+1,5))+" THOUSAND" TO amt:word ENDCASE * Branch for comma or space after thousands... IF VAL($(t:amt:str,4,3)) > 0 STORE amt:word + ", " TO amt:word ELSE STORE amt:word + " " TO amt:word ENDIF ENDIF * Branch for hundreds... IF $(t:amt:str,4,1) > "0" STORE $(t:amt:str,4,1) TO t:hundred STORE amt:word+TRIM($(t:unit,(VAL(t:hundred)-1)*5+1,5))+; " HUNDRED " TO amt:word ENDIF * Branch for tens and ones... IF VAL($(t:amt:str,5,2)) > 0 STORE $(t:amt:str,5,1) TO t:tens STORE $(t:amt:str,6,1) TO t:ones * Branch for combinations of tens and ones... DO CASE CASE t:tens=" " .OR. t:tens="0" STORE amt:word+TRIM($(t:unit,(VAL(t:ones)-1)*5+1,5))+" "; TO amt:word CASE t:ones="0" STORE amt:word+TRIM($(t:decade,(VAL(t:tens)-1)*7+1,7))+" "; TO amt:word CASE t:tens="1" STORE amt:word+TRIM($(t:teen,(VAL(t:ones)-1)*9+1,9))+" "; TO amt:word CASE t:tens>"1" STORE amt:word+TRIM($(t:decade,(VAL(t:tens)-1)*7+1,7)); +"-"+TRIM($(t:unit,(VAL(t:ones)-1)*5+1,5))+" "; TO amt:word ENDCASE ENDIF ENDCASE * Branch for one dollar or more, and put the word string together IF amt:word = " ONE" STORE $(amt:word,2,LEN(TRIM(amt:word))+1) + "DOLLAR and " +; t:cent:str + "CENTS" TO amt:word ELSE STORE $(amt:word,2,LEN(TRIM(amt:word))+1) + "DOLLARS and " +; t:cent:str + " CENTS" TO amt:word ENDIF * Restore the environment and return to the calling program RELEASE ALL LIKE t:* SET EXACT OFF RETURN * EOF: CB-NBWD.CMD (.PRG) ENDCASE ENDIF ENDCASE * Branch for one dollar or more, and put the word string together IF amt:word = " ONE" ST* Program.: CB-RECON.CMD (.PRG) * Author..: Anonymous * Date....: February 9, 1984 * Notice..: Copyright 1984, Ashton-Tate and RSP, Inc. * Notes...: Reconcile the bank statement ERASE * total outstanding checks USE Cb-check SUM Amt TO outstand FOR .NOT. Can @ 2,15 SAY " PROGRAM TO RECONCILE WITH BANK STATEMENT" @ 3,15 SAY " ----------------------------------------" * total deposits in transit USE Cb-bank SUM Amt TO notclear FOR .NOT. Clear STORE -1.00 TO bank:bal STORE T TO loop1 DO WHILE loop1 DO WHILE bank:bal < 0.00 STORE 0.00 TO bank:bal @ 5,5 SAY "Enter ending balance from bank statement $ " GET bank:bal READ ENDDO STORE " " TO answer @ 7,25 SAY "Is this correct? [Y/N] " GET answer PICTURE "!" READ @ 7,0 IF answer $ "Y " STORE F TO loop1 ELSE STORE -1.00 TO bank:bal ENDIF ENDDO * erase colons surrounding bank:bal input @ 5,49 SAY " " @ 5,60 SAY " " @ 7,18 SAY "ADD: "+STR(lastdep,2,0)+" deposits in transit $" @ 7,50 SAY notclear @ 8,49 SAY "------------" @ 9,49 SAY bank:bal+notclear @ 11,11 SAY "SUBTRACT: Total outstanding checks $" @ 11,50 SAY outstand @ 12,49 SAY "------------" IF outstand > 0.00 @ 11,49 SAY "<" @ 11,61 SAY ">" ENDIF STORE bank:bal+notclear-outstand TO truebal @ 13,27 SAY "True cash balance = $" @ 13,50 SAY truebal @ 15,27 SAY "Checkbook balance = $" @ 15,50 SAY balance * initialize memory variables STORE F TO decision IF truebal = balance STORE T TO equal @ 19,14 SAY "Checkbook and bank statement exactly balance" STORE " " TO answer @ 21,16 SAY "Press any key to return to main menu " GET answer PICTURE "!" READ RELEASE outstand,notclear,bank:bal,loop1,answer,truebal,decision,equal USE RETURN ELSE STORE F TO equal @ 18,14 SAY "Bank Statement and Checkbook do not balance" USE Cb-depst IF truebal > balance STORE T TO greater ELSE STORE F TO greater ENDIF ENDIF STORE F TO is:valid DO WHILE .NOT. is:valid STORE " " TO mdate @ 20,17 SAY "Enter Bank Statement Date " GET mdate PICTURE "##/##/##" READ @ 21,20 DO Cb-date IF .NOT. is:valid @ 21,20 SAY "Invalid date - please reenter" ELSE STORE " " TO answer @ 21,22 SAY "Is this correct? [Y/N] " GET answer PICTURE "!" READ @ 21,20 IF answer = "N" STORE F TO is:valid ENDIF ENDIF ENDDO ERASE @ 2, 0 SAY "========================================" @ 2,40 SAY "========================================" @ 3, 0 SAY "||" @ 4, 0 SAY "========================================" @ 4,40 SAY "========================================" @ 5, 0 SAY "||" @ 6, 0 SAY "||" @ 7, 0 SAY "||" @ 8, 0 SAY "||" @ 9, 0 SAY "||" @ 10, 0 SAY "||" @ 11, 0 SAY "||" @ 12, 0 SAY "||" @ 13, 0 SAY "||" @ 14, 0 SAY "========================================" @ 14,40 SAY "========================================" @ 13,78 SAY "||" @ 12,78 SAY "||" @ 11,78 SAY "||" @ 10,78 SAY "||" @ 9,78 SAY "||" @ 8,78 SAY "||" @ 7,78 SAY "||" @ 6,78 SAY "||" @ 5,78 SAY "||" @ 3,78 SAY "||" @ 3,27 SAY "BANK CREDITS AND CHARGES" @ 5,17 SAY "Credits" @ 5,57 SAY "Charges" @ 6,17 SAY "-------" @ 6,57 SAY "-------" @ 12, 4 SAY "------------------------------------" @ 12,40 SAY "------------------------------------" @ 5,40 SAY "|" @ 6,40 SAY "|" @ 7,40 SAY "|" @ 8,40 SAY "|" @ 9,40 SAY "|" @ 10,40 SAY "|" @ 11,40 SAY "|" @ 13, 4 SAY "True cash balance" @ 13,43 SAY "Checkbook balance" @ 8, 4 SAY "Interest earned" @ 8,43 SAY "Service charges" @ 9, 4 SAY "Bank collections" @ 9,43 SAY "Collection fees" @ 10, 4 SAY "Miscellaneous addition" @ 10,43 SAY "Miscellaneous charge" @ 13,25 SAY truebal DO WHILE .NOT. equal .AND. .NOT. decision @ 13,65 SAY balance STORE balance TO test STORE 1 TO count STORE 8 TO row STORE 27 TO col STORE 0.00 TO n1,n2,n3,n4,n5,n6 STORE -1.00 TO amount DO WHILE count < 7 DO WHILE amount < 0.00 STORE 0.00 TO amount @ row,col GET amount READ ENDDO IF count = 1 STORE amount TO n1 ELSE IF count = 2 STORE amount TO n2 ELSE IF count = 3 STORE amount TO n3 ELSE IF count = 4 STORE amount TO n4 ELSE IF count = 5 STORE amount TO n5 ELSE STORE amount TO n6 ENDIF 5 ENDIF 4 ENDIF 3 ENDIF 2 ENDIF 1 IF count < 4 STORE test + amount TO test ELSE STORE test - amount TO test ENDIF IF amount > 0 @ 13,65 SAY test ENDIF STORE count+1 to count IF count = 4 STORE 8 TO row STORE 65 TO col ELSE STORE row + 1 TO row ENDIF STORE -1.00 TO amount CLEAR GETS ENDDO STORE " " TO answer @ 16,20 SAY "Are the above entries correct? [Y/N] "; GET answer PICTURE "!" READ IF answer = "N" @ 16, 0 @ 8,27 SAY " " @ 9,27 SAY " " @ 10,27 SAY " " @ 8,65 SAY " " @ 9,65 SAY " " @ 10,65 SAY " " LOOP ENDIF IF truebal = test @ 18,17 SAY "Checkbook and bank statement exactly balance" STORE T TO equal ELSE @ 18,15 SAY "Checkbook and bank statement still do not balance" IF truebal > test STORE truebal - test TO diff ELSE STORE test - truebal TO diff ENDIF @ 19,23 SAY "The difference is $"+STR(diff,10,2) STORE " " TO answer @ 21,11 SAY "Do you still want to include the above changes? [Y/N] "; GET answer PICTURE "!" READ IF answer = "N " USE RELEASE outstand,notclear,bank:bal,loop1,answer,truebal,decision,; equal,greater,is:valid,mdate,test,count,row,col,n1,n2,n3 RELEASE n4,n5,n6,amount,diff RETURN ELSE STORE T TO decision ENDIF ENDIF ENDDO IF n1 > 0 APPEND BLANK REPLACE Date WITH mdate,Amt WITH n1,Paidfrom WITH "Interest earned" ENDIF IF n2 > 0 APPEND BLANK REPLACE Date WITH mdate,Amt WITH n2,Paidfrom WITH "Bank Collections" ENDIF IF n3 > 0 APPEND BLANK REPLACE Date WITH mdate,Amt WITH n3,Paidfrom WITH "Miscellaneous addition" ENDIF IF n4 > 0 APPEND BLANK REPLACE Date WITH mdate,Amt WITH -n4,Paidfrom WITH "Service charge" ENDIF IF n5 > 0 APPEND BLANK REPLACE Date WITH mdate,Amt WITH -n5,Paidfrom WITH "Collection fees" ENDIF IF n6 > 0 APPEND BLANK REPLACE Date WITH mdate,Amt WITH -n6,Paidfrom WITH "Miscellaneous charges" ENDIF STORE test - balance TO mamt IF mamt <> 0 USE Cb-bank APPEND BLANK REPLACE Date WITH mdate,Amt WITH mamt,Num WITH 0,Clear WITH T ENDIF STORE test TO balance USE RELEASE outstand,notclear,bank:bal,loop1,answer,truebal,decision,equal,; greater,is:valid,mdate,test,count,row,col,n1,n2,n3,n4,n5,n6 RELEASE amount,mamt,diff RETURN * EOF: CB-RECON.CMD (.PRG)  APPEND BLANK REPLACE Date WITH mdate,Amt WITH -n6,Paidfrom WITH "Miscellaneous charges" ENDIF STORE test - balance TO mamt IF mamt <> 0 USE Cb-bank APPEND BLANK REPLACE Date WITH mdate,Amt WITH mamt,Num WITH 0,Clear WITH T ENDIF S* Program.: CB-REPRT.CMD (.PRG) * Author..: Anonymous * Date....: February 9, 1984 * Notice..: Copyright 1984, Ashton-Tate and RSP, Inc. * Notes...: Print reports DO WHILE T ERASE @ 2, 0 SAY "========================================" @ 2,40 SAY "========================================" @ 3, 0 SAY "||" @ 4, 0 SAY "========================================" @ 4,40 SAY "========================================" @ 5, 0 SAY "||" @ 6, 0 SAY "||" @ 7, 0 SAY "||" @ 8, 0 SAY "||" @ 9, 0 SAY "||" @ 10, 0 SAY "||" @ 11, 0 SAY "========================================" @ 11,40 SAY "========================================" @ 10,78 SAY "||" @ 9,78 SAY "||" @ 8,78 SAY "||" @ 7,78 SAY "||" @ 6,78 SAY "||" @ 5,78 SAY "||" @ 3,78 SAY "||" @ 3,34 SAY "REPORTS MENU" @ 6,25 SAY " 0 - Exit" @ 7,25 SAY " 1 - Checks" @ 8,25 SAY " 2 - Bank Deposits" @ 9,25 SAY " 3 - Individual Deposits" STORE 4 TO choice DO WHILE choice < 0 .OR. choice > 3 STORE " " TO mchoice @ 11,33 SAY " select : : " @ 11,41 GET mchoice READ STORE VAL(mchoice) TO choice ENDDO STORE 6 TO row STORE 0 TO count DO WHILE count < 4 @ row+count,25 SAY " " STORE count+1 TO count ENDDO IF choice = 0 RELEASE choice,mchoice,row,count USE RETURN ENDIF @ 3,30 SAY " " IF choice = 1 STORE "Checks" TO option STORE 31 TO col STORE 5 TO ub @ 11,0 @ 11, 0 SAY "||" @ 11,78 SAY "||" @ 12, 0 SAY "||" @ 12,78 SAY "||" @ 13, 0 SAY "========================================" @ 13,40 SAY "========================================" @ 7,24 SAY " " ELSE IF choice = 2 STORE "Bank Deposits" TO option STORE 28 TO col STORE 4 TO ub @ 11,0 @ 11, 0 SAY "||" @ 11,78 SAY "||" @ 12, 0 SAY "========================================" @ 12,40 SAY "========================================" @ 8,24 SAY " " ELSE STORE "Individual Deposits" TO option STORE 25 TO col STORE 3 TO ub @ 9,24 SAY " " ENDIF ENDIF @ 3,col SAY !(option) + " SUB-MENU" @ row+choice,24 SAY " " @ 6,20 SAY "0 - Return to REPORTS MENU" @ 7,20 SAY "1 - List all "+option @ 8,20 SAY "2 - List all "+option+" between two dates" @ 9,20 SAY "3 - List all "+option+" over a certain amount" IF choice = 1 @ 10,20 SAY "4 - List all taxable checks" @ 11,20 SAY "5 - List certain taxable checks" USE Cb-check STORE " CHKNO DATE PAY TO THE ORDER OF AMOUNT"; TO command1 STORE " ----- -------- ------------------------------ ----------"; TO command2 STORE "' '+STR(Chkno,4,0)+' '+Date+' '+Payto+' '+STR(Amt,10,2)"; TO command ELSE IF choice = 2 @ 10,20 SAY "4 - List all deposits in transit" USE Cb-bank STORE " DATE AMOUNT" TO command1 STORE " -------- ----------" TO command2 STORE "' '+Date+' '+STR(Amt,10,2)" TO command ELSE USE Cb-depst STORE " DATE PAIDFROM AMOUNT" TO command1 STORE " -------- ------------------------- ----------"; TO command2 STORE "' '+Date+' '+Paidfrom+' '+STR(Amt,10,2)" TO command ENDIF ENDIF STORE 6 TO choice2 DO WHILE choice2 < 0 .OR. choice2 > ub STORE " " TO mchoice2 @ 8+ub,33 SAY " select : : " @ 8+ub,41 GET mchoice2 READ STORE VAL(mchoice2) TO choice2 ENDDO IF choice2 = 0 * release some memory variables and return to the REPORTS MENU RELEASE option,col,ub,command1,command2,command,choice2,mchoice2 LOOP ENDIF STORE " " TO printer @ 22,6 SAY "Do you want the output sent to the printer "+; "or the screen? (P/S) " GET printer PICTURE "!" READ @ 22,0 IF printer = "P" SET PRINT ON ELSE STORE "S" TO printer ENDIF STORE row+ub+4 TO newrow IF choice2 = 1 STORE "LIST ALL "+!(option) TO header ERASE ? ? " "+header ? command1 ? command2 GO TOP DO WHILE .NOT. EOF ? &command SKIP ENDDO ENDIF IF choice2 = 2 STORE T TO sandy DO WHILE sandy STORE F TO is:valid DO WHILE .NOT. is:valid STORE " " TO mdate @ newrow,23 SAY "Enter starting date "; GET mdate PICTURE "##/##/##" READ DO CB-DATE IF is:valid STORE mdate TO date1 STORE $(mdate,7,2)+$(mdate,1,2)+$(mdate,4,2) to begin ENDIF ENDDO is:valid STORE F TO is:valid DO WHILE .NOT. is:valid STORE " " TO mdate @ newrow+2,23 SAY "Enter ending date "; GET mdate PICTURE "##/##/##" READ DO CB-DATE IF is:valid STORE mdate to date2 STORE $(mdate,7,2)+$(mdate,1,2)+$(mdate,4,2) to ending ENDIF ENDDO is:valid IF begin > ending @ 20,13 SAY "Ending date occurs before starting date - "+; "please reenter" LOOP ENDIF STORE F TO sandy ERASE STORE 0.00 TO amount GO TOP STORE "LIST ALL "+!(option)+" BETWEEN "+date1+" AND "+date2; TO header ? ? " "+header ? command1 ? command2 DO WHILE .NOT. EOF STORE $(Date,7,2)+$(Date,1,2)+$(Date,4,2) TO mdate IF mdate > begin .AND. mdate < ending ? &command STORE amount + Amt TO amount ENDIF SKIP ENDDO IF choice = 1 STORE " " TO first ELSE IF choice = 2 STORE " " TO first ELSE STORE " " TO first ENDIF ENDIF ? ? first+"TOTAL $"+STR(amount,10,2) ENDDO sandy RELEASE sandy,is:valid,mdate,date1,begin,date2,ending,amount,first ENDIF IF choice2 = 3 STORE -1.00 TO amount DO WHILE amount < 0.00 STORE 0.00 TO amount @ newrow,20 SAY "Enter in amount " GET amount READ ENDDO STORE newrow+3 TO newrow ERASE GO TOP STORE "LIST ALL "+!(option)+" OVER $"+STR(amount,10,2) TO header ? ? " "+header ? command1 ? command2 DO WHILE .NOT. EOF IF Amt > amount ? &command ENDIF SKIP ENDDO RELEASE amount,answer ENDIF IF choice2 = 4 .AND. choice = 2 STORE "LIST ALL DEPOSITS IN TRANSIT" TO header GO TOP LOCATE FOR .NOT. Clear IF EOF @ newrow,30 SAY "No Deposits in transit" ELSE ERASE STORE 0.00 TO amount ? ? " "+header ? command1 ? command2 DO WHILE .NOT. EOF IF .NOT. Clear ? &command STORE amount + Amt TO amount ENDIF SKIP ENDDO ? ? " TOTAL $"+STR(amount,10,2) ENDIF RELEASE amount ENDIF IF choice = 1 .AND. choice2 > 3 STORE " Business expenses " TO m1 STORE " Medical or Dental expenses " TO m2 STORE "Payments for Medicine or Drugs" TO m3 STORE " Alimony payments " TO m4 STORE " Child Care expenses " TO m5 STORE " Automotive expenses " TO m6 STORE " Contributions " TO m7 STORE " Miscellaneous tax deductions " TO m8 IF choice2 = 5 @ newrow, 1 SAY "(1) Business expenses (4) Alimony" @ newrow,55 SAY "(7) Contributions" @ newrow+1,1 SAY "(2) Medical or Dental (5) Child Care" @ newrow+1,55 SAY "(8) Miscellaneous" @ newrow+2,1 SAY "(3) Medicine or Drugs (6) Automotive" STORE 9 TO mtax DO WHILE mtax < 0 .OR. mtax > 8 STORE " " TO taxchar @ newrow+4,6 SAY "Enter specific tax expense (or 0 to return "+; "to the REPORTS MENU) " GET taxchar READ STORE VAL(taxchar) TO mtax ENDDO IF mtax = 0 RELEASE option,col,ub,command1,command2,command,choice2,; mchoice2,newrow,m1,m2,m3,m4,m5,m6,m7,m8,mtax,taxchar LOOP ENDIF STORE "m"+taxchar TO string2 STORE "LIST ALL "+&string2 TO header ELSE STORE "LIST ALL TAXABLE CHECKS" TO header ENDIF ERASE ? ? " " + header ? IF choice2 = 4 ? " "+m1 ENDIF ? command1 ? command2 IF choice2 = 4 STORE 1 TO count STORE T TO again DO WHILE again STORE 0.00 TO amount GO TOP DO WHILE .NOT. EOF IF Tax = count ? &command STORE amount+Amt TO amount ENDIF SKIP ENDDO ? ? " TOTAL $" +; STR(amount,10,2) * need routine to keep track of totalling print out totals ? ? STORE count+1 TO count IF count > 8 STORE F TO again ELSE STORE "m"+STR(count,1) TO string1 ? " "+&string1 ? command1 ? command2 ENDIF ENDDO again ELSE STORE 0.00 TO amount GO TOP DO WHILE .NOT. EOF IF Tax = mtax ? &command STORE amount+Amt TO amount ENDIF SKIP ENDDO ? ? " TOTAL $"+; STR(amount,10,2) ENDIF RELEASE m1,m2,m3,m4,m5,m6,m7,m8,amount IF choice2 = 4 RELEASE again,string1 ELSE RELEASE mtax,taxchar,string2 ENDIF ENDIF IF printer = "P" SET PRINT OFF ELSE ? ? ENDIF STORE " " TO ret @ 23,15 SAY "Press any key to return to the REPORTS MENU " GET ret READ RELEASE option,col,ub,command1,command2,command,choice2,; mchoice2,newrow,header,printer,ret ENDDO T 2,m3,m4,m5,m6,m7,m8,amount IF choice2 = 4 RELEASE again,string1 ELSE RELEASE mtax,taxchar,string2 ENDIF ENDIF IF printer = "P" SET PRINT OFF ELSE ? ? ENDIF STORE " " TO ret @ 23,15 SAY "Press any key to return to the REPORTS MENU " GET ret READ RELEASE option,col,ub,command1,command2,command,ÝZIP COMCOPYRIGHT 1982, PAWLUK CORPORATION5455 Wilshire BoulevardLos Angeles, CA 90036(213) 937-0551^#VN#F<%0  ZIP.COM NOT PRESENT ON DEFAULT DISK $:22!}~#z~!} w#z’s\!}:W"+^!hu>2Ra2Qa>2h:hog:QaogW7*+^3:Rao*+^*:Qaog~OUU!]:Qaog3ͩV>2]V*+^*:Qaog~!Ra2Ra!Qa42RaR]yB>C!`@!a>'V<[RyB>C!`@!a>#V<[RyB>C!`@!a>!V<[RyB>C[nV!h6:h!h6RyB>C!`@!b>VVVV VV(V%V$V$V%V!V V VVV<[!hJ:zR"_!_#*_ |u!_~#RyBC!`@!c>%V<[CP}*+^w*+^~$P!`a :V!`aUUV\P|2_!`aUUV\P|2_!`aUUV\P|2_a*+^36>2Qa>2h:hog:QaogW!]:Qaog3ͩVn&}*+^*:Qaogw!]:Qaog3ͩV*+^32͹U!Qa4g*+^~$P!`a :V:_$P:_$P:_$P!`aUUGUUU\P|*+^w(!h͉XRByB!`@!-^V<[>2Qa:Qaog |o32]V!`^d>2]V!^d>2]V!^d>2]V!^ d>2]V!,_!d>2]V!__6!_6!"d>1T*+^#>XT!$d>1T*+^>XT!&d>1T*+^>XT> CP}*+^wRByBC!`@!(d>'V<[þ>3>!OdU!-^2:V!`^Qd>2]V!^Ud>2]V!^d>2]V!^d>2]V!,_Vd>2]V!__6!_6!"d>1T*+^#>XT!$d>1T*+^>XT!&d>1T*+^>XTCP}*+^wR yBC!`@!Wd>'V<[þ>3>!dGU!-^2:V!`^Qd>2]V!^Ud>2]V!^d>2]V!^d>2]V!,_Vd>2]V!__6!_6!"d>1T*+^#>XT!$d>1T*+^>XT!&d>1T*+^>XTCP}*+^w*_+++|RyBC!`@!~d>'V<[ *_ | R yBC!`@!d>'V<[>CP}*+^wþ!-^d>2]V!`^d>2]V!^d>2]V!^d>2]V!^d>2]V!,_d>2]V!__d>2]V!_6!d>1T*+^#>XT!$d>1T*+^>XT!&d>1T*+^>XT>CP}*+^wR yBC!`@!d>'V<[þ!ua^#V*_ |2 !e>1T*+^>XTR/ yBC!`@!e>(V<[g !&d>1T*+^>XTRg yBC!`@!=e>(V<[!$d>1T*+^>XT>3>!eeU!-^2:V!`^Qd>2]V!^ge>2]V!^ie>2]V!^ke>2]V!,_me>2]V!__6!_6!"d>1T*+^#>XTCP}*+^wþ!-^oe>2]V!`^qe>2]V!^Ud>2]V!^d>2]V!^!d>2]V!,_Vd>2]V!__6!_6!te>1T*+^#>XT!$d>1T*+^>XT!&d>1T*+^>XTCP}*+^wR yBC!`@!ve>'V<[þ!-^e>2]V!`^d>2]V!^ke>2]V!^me>2]V!^ie>2]V!,_ge>2]V!__6!_6!"d>1T*+^#>XT!$d>1T*+^>XT!&d>1T*+^>XT> CP}*+^wRy yBC!`@!e>'V<[þ!-^e>2]V!`^e>2]V!^Od>2]V!^e>2]V!^e>2]V!,_e>2]V!__6!_6!"d>1T*+^#>XT!$d>1T*+^>XT!&d>1T*+^>XTCP}*+^wR9 yBC!`@!e>'V<[þ>3>!eeU!-^2:V!`^Qd>2]V!^e>2]V!^e>2]V!^e>2]V!,_e>2]V!__6!_6!"d>1T*+^#>XT!$d>1T*+^>XT!&d>1T*+^>XTCP}*+^wRyBC!`@!e>'V<[þ!-^%f>2]V!`^+f>2]V!^ke>2]V!^me>2]V!^ie>2]V!,_ge>2]V!__2f>2]V!_7f>2]V!te>1T*+^#>XT!$d>1T*+^>XT!&d>1T*+^>XT>CP}*+^wRyBC!a@!'V<[þ!-^cf>2]V!`^ef>2]V!^e>2]V!^e>2]V!^e>2]V!,_e>2]V!__6!_6!te>1T*+^#>XT!$d>1T*+^>XT!&d>1T*+^>XT>`CP}*+^wRyBC!a@!if>'V<[þ!-^f>2]V!`^d>2]V!^ke>2]V!^me>2]V!^ie>2]V!,_ge>2]V!__6!_6!"d>1T*+^#>XT!$d>1T*+^>XT!&d>1T*+^>XT> CP}*+^wRUyBC! a@!f>'V<[þ!-^f>2]V!`^d>2]V!^ke>2]V!^me>2]V!^ie>2]V!,_ge>2]V!__6!_6!"d>1T*+^#>XT!$d>1T*+^>XT!&d>1T*+^>XT> CP}*+^wRyBC!a@!f>'V<[þ!-^f>2]V!`^d>2]V!^Ud>2]V!^d>2]V!^ d>2]V!,_Vd>2]V!__6!_6!"d>1T*+^#>XT!$d>1T*+^>XT!&d>1T*+^>XTCP}*+^wRyBC!a@!f>'V<[þ>3>!eeU!-^2:V!`^Qd>2]V!^Ud>2]V!^d>2]V!^d>2]V!,_Vd>2]V!__6!_6!"d>1T*+^#>XT!$d>1T*+^>XT!&d>1T*+^>XTCP}*+^w*_ |®RyBC!a@! g>'V<[ *_ |RyBC!a@!4g>'V<[ *_ | R yBC!$a@![g>'V<[þ!oa^#V!a^#V>3>!dGU!-^2:V!`^Qd>2]V>3>!^2:V!^g>2]V!^g>2]V!,_g>2]V!__6!_6!"d>1T*+^#>XT!$d>1T*+^>XT!&d>1T*+^>XT> CP}*+^wRyBC!)a@!g>'V<[þ!-^d>2]V!`^d>2]V>3>!^2:V!^g>2]V!^g>2]V!,_g>2]V!__6!_6!"d>1T*+^#>XT!$d>1T*+^>XT!&d>1T*+^>XT> CP}*+^wRyBC!.a@!g>'V<[þ!a^#V>3>!eeU!-^2:V!`^Qd>2]V!^Ud>2]V!^g>2]V!^d>2]V!,_Vd>2]V!__6!_6!"d>1T*+^#>XT!$d>1T*+^>XT!&d>1T*+^>XTCP}*+^wRxyBC!3a@!g>'V<[þ!-^e>2]V!`^g>2]V!^!d>2]V!^g>2]V!^d>2]V!,_g>2]V!__6!_6!h>1T*+^#>XT!$d>1T*+^>XT!&d>1T*+^>XT> CP}*+^wR9yBC!8a@!h>'V<[þ!-^)h>2]V!`^d>2]V!^d>2]V!^d>2]V!^d>2]V!,_d>2]V!__6!_6!te>1T*+^#>XT!$d>1T*+^>XT!&d>1T*+^>XT>CP}*+^wRyBC!=a@!/h>'V<[þ!-^d>2]V!`^Qd>2]V!^Vh>2]V!^Wh>2]V!^Xh>2]V!,_e>2]V!__6!_6!"d>1T*+^#>XT!$d>1T*+^>XT!&d>1T*+^>XT> CP}*+^wRyBC!Ba@!Yh>'V<[þ^RyB>C!Ga@!h>$V<[VV<[!Sa>V!h>V!h>VMnVͼ]!m6:mRyB!h@!-^V<[>2 j: jog |322#j>2 j>2m:mog: jogW:#jog!]: jog3ͩVn&W}2#j! j4:#j!]*_3ͩV6ReyB>C!h@!1j>V<:#jog>͙SVV<[RvyB>C[!m͙"RyB>C!h@!oj>V<[:_RyB!h@!j>V<[RyB!h@!j>V<[RyB>C[!"_!`^"m!m͙"!"_R@yB>C!h@!j>V<*+^#>1T>R<[R]yB!h@!j>V<[:_RyB!i@!j> V<[áRyB!i@!j>V<[RyB>C! i@!j> V<[!^"m!m͙"RyB!i@!j> V<[!^"m!m͙"RyB>C!i@!j> V<[!^"m!m͙"RCyB!i@!j> V<[!,_"n!n͙"RqyB>C!"i@!j>V<[RyB>C[!__"n!n͙"RyB>C!'i@!j>V<[RyB>C[!_"n!n͙"RyB>C!,i@!k> V<*+^>1T!k>1TͱT>R<[RCyB!4i@!k> V<*+^>1T>R<[ReyB>C!>i@!k>V<[:_RyB!Ci@!0k>V<[éRyB!Hi@!7k>V<[RyB>C!Mi@!Fk>$V<[!nJ:zR"_RyBC!Ri@!mk>'V<[*_ |/*_+|!m6*_ |V!]*_3ͩV" n! n;$*_++|:mN!m6*_ |RyBC!Wi@!k>V<[! nJ:͡P*+^>XT*+^>1T!k>1TT*+^>XT*+^>1T!k>1TT!k>1T*+^>XT!k>1T*+^>1TT!k>1T*+^>XT*_ |RLyBC!\i@!k>V<[!nJ:͡P*+^>XT*+^>1T!k>1TT!k>1T*+^>XT!k>1T*+^>1TT!k>1T*+^>XT*_ |:_/2_fÖ"!m6RyB!ai@!-^V<[>2 j: jog |+3C!fi@!k>VV<[!`^"n!n͙"!m6:mP RyB>C!mi@!k>"V<[!nJ:zR}2 j: jog+|>2 j: jog |>22 jRyB>C!ri@!l>%V<[!nJ:zR}2!j:!jog+| >2!j" :!jog |" >22!j!`^: j_UUC!wi@!>l>V<[Þ R yB>C!|i@!Bl>V<[R yB!i@!Gl>!V<[V!hl>V!il>VMC!i@!jl>#V<*+^#>1T>R#V<[V!hl>V!il>VMC!i@!l>V<[!$nJ:͡P*+^#>XT!l>1T*+^#>1TT!!l>1T*+^#>XT"*+^#>1T!l>1TT"!l>1T*+^#>XT%(m!R"yB>C[:_>"R>"yB!i@!l>V<[R["yB!i@!l> V<[V!hl>V!il>VMnV*(nn&|"R"yB!i@!l>V<[7$>2 j*(nn&}2*n:*nog: jogW7$*(n: j_UUG!$j>nV!l$jx͋U $!l$jx͋UP#RM#yB!i@!l>V<[$!V<[$!=l$jx͋U*_++|#R#yB!i@!m>V<[$R$yB!i@!l>V!$jn&@ }3>>^3>UU<[0$R0$yB!i@!l>V!$jU<[! j4""(^#V"+nR]$yB!i@!-^V<[>2 j: jog |:_$3C[*+n"0n!0n͙"*_+|$R$yB>C!i@! m>V<[+&*_++| %R%yB>C!i@!m>V<[+&*_+++|9%R6%yB>C!i@!3m> V<[+&*_ |j%Rg%yB>C!i@!=m> V<[+&*_ |›%R%yB>C!i@!Im> V<[+&*_ |%R%yB>C!i@!Vm> V<[+&*_ |%R%yB>C!i@!bm> V<[+&*_ |+&R+&yB>C!i@!om> V<[RM&yB>C!i@!|m>V<[V!m>V!m>VM2 j*+n6!$jn& |'R&yB!i@!m>V<:#jog>͙S V<[R;'yB>C!i@!m> V<: jog>͙SV<[V<['R'yB! j@!$jn&@ }3>>^3>U<['R'yB!j@!$j>V<[!#j5! j4!$j*+n2>ͻUù&%(:m(:#jog*+nn&}2#j*+n6ã&(RG(yB>C!j@!m>V<[$V<[R(yBC[!$j>V!m>V!m>VMnV!n>1T*+^###>XT!n>1T*+^f>XT*+^ n>GnV*+^ n>GnV*+^n>GnV*+^n>GnV*+^n>GnV*+^n>GnV*+^n>GnV*+^n>GnV*+^n>GnV*+^n>GnV*+^n>GnV*+^n>GnV*+^n>GnV*+^n>GnV*+^n>GnV*+^n>GnV*+^n>GnV*+^n>GnV*+^n>GnV*+^n>GnV*+^ n>GnV*+^!n>GnV*+^"n>GnV*+^#n>GnV*+^$n>GnV*+^%n>GnV*+^&n>nV*+^'n>GnV!nn>nV!n>V!n>V!n>VM2n:nog |:_1+3C!7n@!n>V<[!no>nV!nnx͋U!nnx͋U+_w!nnx͋U!nnx͋U+>3>!rG$V!r V!n>V!n>VMnV!n>V!n>V!n>VM2n:nog |:_,3C!An@!n>V<[!no>nV!nnx͋U!nnx͋Ur-_w!nnx͋U!nnx͋Uo->3>!rG$V!r <,!n>V!n>V!n>VM#V<[R-yBC!Kn@!:o>%V<[!n6!nn>GnV!nnx͋U?!nn& |/!nnx͋U6._w!r <R.yB>C!Pn@!_o>V<[!nyo>nV!nnx͋U?!nn& |/!nnx͋U?/V<[!no>nV>3>!rG$V!r <Ô.!onx͋U?!nox͋U?h/!n>_w>2n>2r:rog:nogW/:n:n:n//*+^ :nog!nx͋U/*+^ :nogn>GnV>2n!n4r/9,X4R0yBC!o>$VͩA[%V<[!nV!n>V!o>VMVͩA[!nyo>GnV!yonx͋U!zonx͋U41VͩA[11!pnx͋U!npx͋U11*+^!n>GnVÉ0*+^n>GnVW4!nV!n>V!p>VMVͩA[!nyo>GnV!yonx͋U!zonx͋U?2VͩA[<2!pnx͋U!npx͋U<2*+^!n>GnVÔ1*+^n>GnVW4!nV!n>V!Hp>VM1T!Ip>1TT>R!n :V!n!nV!n>Vͫ ]VR2yBC!Kp>VͩA!nVͩA!\p>VͩA[!rJ:͡P*+^f>XT*+^f>1T!Ip>1TT:3!Ip>1T*+^f>XTÆ3*+^>1T!Ip>1TT*+^f>1TT3*+^>1T!Ip>1TT*+^f>XTW4!nV!n>V!bp>VM1T*+^###>XTR3yBC!cp>VͩA[!rJ:͡P*+^###>XT*+^###>1T!n>1TT+4!n>1T*+^###>XTW4!~p>1T*+^###>1TTW4!~p>1T*+^###>XT8R}4yB>C!_n@!p>V<[R4yB>C!dn@!p>V*+^>V!nUU V*+^>V!nUU<[R5yB>C!kn@!p>V V*+^ U<[R95yB>C!rn@*+^ >V<[*+^'!nx͋Um5Rj5yB!wn@!p>V<[Î5R5yB!|n@*+^'>V<[R5yB!n@!p>V V*+^$>V*+^ UU<[R76yB>C!n@!p>V*+^ >V*+^ UU V*+^>V*+^ UU<[R6yB>C!n@! q>V*+^>V*+^ UUV*+^>V*+^ UU<[R27yB>C!n@!>q>V*+^>V*+^ >V!4q> V*+^>V*+^ >V!+q> V*+^>V*+^ UUUUUUUU<[R7yB>C!n@!Yq>V*+^>V*+^ >V!Oq> V*+^>V*+^ >V!Fq> V*+^>V*+^ UUUUUUUU<[R^8yB>C!n@!zq> V*+^>V*+^ >V!pq> V*+^#>V*+^ >V!gq> V*+^">V*+^ UUUUUUUU<[R8yB>C!n@!q>V*+^>V*+^ >V!q> V*+^>V*+^ >V!q> V*+^>V*+^ UUUUUUUU<[I:RQ9yB>C!n@!q>V'V(V(VVV<[R9yB>C!n@*+^>V!DrU<[R9yB>C!n@*+^>V!\rU<[R:yB>C!n@!tr>V<*+^>1T!Ip>1TT>RV<*+^f>1T>R<[RH:yB>C!n@!r>V<*+^###>1T>R<[s~# O:!r>V!r4U!ssP:V*s~:*s^#V>ogH<*ss#r:*+^>1T! s>1TTjR*s^#VH<*ss#r!!s s>nV!"s!"s6!r6*s*s^#VW!!sn& |;V! s> Vͫ<|¡;!s#!!s>V!s>Vͫ<|:rq;>3>!sG$V!s <á;!s ͻU*s#"s!s!sx͋U¡;!r6;!!s>V!ssVͫ<|;!s ͻU*s#"s;>3>!sG$V!s <:!"s!"sVÍV^#V^;#V!<*3>;K* <@|A<|{z7 Ҟ<#~wf<~ <<#<#ü ͱ@=&9H=x2_y 5=2_"s ><8?*s=x2_=WA j=Aj=j=G:_=Wx2_"s >!_F6!_~#ʎ=x=2_8?>Eͱ@:_+=-/x2_y2_"s >z?:_!_?4!9~#ͱ@=*s>@2_2_2_<2_!9> !>+4>>A>-A>>2_>>Z>P> T> >>A>.q>>>q>>>b>e{>E¾>>+‹>>Ô>-”>>>WG>>Ҳ>xGGG>º>GyO> W>þ>:_>>>y2_>~#z0 0!__w!_~?4_!_sWW2_G:_<2_=W:_Wz?R?:_R?!_5!_4W:_G:_`?!_?>2_͝?ͱ@!_5l?:_!_<_!_>w w>+Ï?!_~5>.?G:_x0¼?:_> !_~?5!_4!_5-2_x!_^4{??!_~0>0@ @x=@Gy@? 1@:_@+@!_x?+@ͨ@?̓D? E@?> ͱ@7@ W@xQ@>ͨ@? b@y@?xl@>?=̓Dl@ʦ@x!_Ҏ@ͦ@y@:_ʙ@ڦ@:_> ͱ@Î@>2s!sC:_@!_@> @> @@2s!sÑD!sÎXLA͍A^͘A^#V%AALA@#FA#NA#^#r+s#^#V++r+s~@5@͍A5^͘Aq#p@O͍A4~ jA_͘As#r#s#r#q!pAÎXxAyA`zA|A Format Overflow*`-&&`!sAO:6`yA!9GA~#'ºAúAyAO:.`A(B[BA{A*_|Bj& *_*_W#W> cB> cB[B> cB{=>'cB!9JB=~#'CB{>'cBcB.B{=>'cB{>bcB*_++|2t!t͑DɯÀB>ÀB>2t"t"t`i"t!9"t!tÜBt ~# ¡B*t~C*t~B!t>VG3!!!7`iE!7`"u!u-G C!t>VG3!R.!!\`iE!\`" u! u-G"C*t" u! u-G!u͈E*t^#V!_s#r*u^#V!_s#r*t^#VDU|*`DU|GgC!uC*t^#V}*`}GʊC!uC:2`C*t^#V}*`}GʮC!uC:5`C*t^#V}C!uC^#V"u!`"!u*u"%u!u͎X2)u!'uC^#V".u:.`C:0`(D*.u%D*.u5!0u6:0u "DUDDDTD!1u͑D*.uTD*.u5!_6!3u͑D:_QD*.u6.D͏G20u:0u‚D!`"9u!"=u!5u͎X!_6#6!0u6 :6`D!@u͑D^#V"Fu!_"Lu*Fu"Ju!HusLD!`"Ru!"Vu!Nu͎XDhE:.`hE*Fu~ D*_#"_hE*Fu~ D!_6#6hE:6`hE*Fu~ E*_#"_!_6#6hE*Fu~ hE*_#"_!_#9E!_6#6*_*_#W|hE!`"\u!"`u!Xu͎XcE̓D!_6"bu!9"du!bu͈E! 9^lu~# E*lu^#V|ʢE*lu*nu JU*nu nbE*nu !qu>jVE!fu>V*luU!qu$V*lu~#F*lu^#V)))|F*lu6P#6*lu~#WF*lu^#V))|KF*lu6#6WF*lu6<#6*lu6#6*lu6#6*lu6#6*lu 6*lu^#V}CP}2pu*lu^#V}F!pu44*lu^#V}F>2pu*lu^#V}F*nu~#F*nu6#6*lu"u*nu"u*nu"u!uPK*lu^#V|,G*lu"u!"u!u͎X^#V^#VC\:`JG!oG͎X2`O!&`YG6^G +~#w!` s#r!`4[wGxG`yG{G I/O Stack Overflow:_¯G!_"u!u`LG!u6úG:_2u!_6:u G*_#"_:u G!_6#6:u"FN"HN*FN^#V#"FN^#VGG"LNG"PN|G|~GGya(HA =.:;<>[]y *JNH DHPHH$DHH1rH o&))))\xH  ʏH#w HDHJH*PN#ʾHAҾHGDHH:H 6Hp4DH+\HH#HH#*H6?HwDHHHIDHH#6 H.9IDH \H-IH9I#*%I6?)IwDHIH@IDH-I#6 9I%#6BI*PN##^ ~?YI# RIxCON CON RDR PUN LST M!tI ~JH$IDHH1ҽI\ʤIlI$I!~ IDH!aIHI IDH#Ix=GIDH>ɯ*PN+I^#VI#{#zI6#6I r+s!uF#~RJ!u6P  Y\ Y\!u^r+s6 #6 !u4^N*PN|‚J}=oJ"J~JzIzJO>~ʎJʎJ>JN*PN|ºJYzI=ʧJy³JY\öJ>~J=J>Jq2UN*PN/"RNJ'K{ JI*RN*PN#:UNOKI#s#rKJJJ JJIr+s{8K!ON4*RN+>|GK+}oGG~2NNG"JNG:NNVL̓IʉKG:NNVL*LNpƒK4#67NH:NNڤKAK*FN++"FNíK}+ʱKGK}|2AN"?NHAK"DN1:W|VL##"PN6*LNs#r͞HM{ M*PN:NNwK6L*DN"BN<-L:NNML7N*LNw#w7NGG7N\JGq7NGG7NGN͕J7N*PN~" 4#4#4GG7N~´LLsO7N J>L7NGG7N~ J>L7N*PN~L>7NLxO7N*PN!*~!/2TN*PN|M(^#VHH{z!MzM2ONzPM:TNDM\JqKMN͕J#+M*PN|ʅM*~ʅM=!ONڂM:TNJM{MwbM͆L>GG7N|}7N~> 7N<7NGG7N|¼M*LNw=7N*PN]*LN^#V6+6++W7NG H7N>7N"N#F#~Gq#p#w>7NG H7N>7N*~H!&N=N>!*PN" s#r#w=7N*HN }!u6 4>2u*u!4#4#4~#N#F#y#x#:u*u!!:uʰNͅNoN:u~G~#~O?N#~N! p! y! qO>G!$q#p#6zO"u"u2ux2uVN2ufN!u~5P͕NO=O:uO*uGx|g}oJP WWG!9!yʈPʈP)0ʃP1W# lPyʓP) ÈPxDMox&9`iO! 9xP~ P#ðPz,Q>o>g9~+PiQWP-P.PiQP0iQ:iQ0 QG!9~wG# QxiQP! 9~ 9Q_>W! 9+wYQylQW!QxQ##/<^#VQQҴQ!9VzwzO#‘QʰQ*U*U! 9/GO~*UO*U~q+Q!96#=QO!9FxTy"R! 9~WwzO+RGR_ /!9~#=6RART"u>R*u"uMRzR*u"uMRzR*uG!9!xR R+£R$%WgR-ʘR0W:W0T])W)WW)Wo|gWÈR{R$%W}R|Wz- Wo&9}O!9 w# S60#60! 9~ :S!97>?'w#+S-!9~SSS~#S@S! 9~.eS+60qS0qS6 #YS+r>o&9y>o&90w+–S6./G!S S>0S S>-3ST]))S寕iO>`G>0 T<T DM0 > QTw#QT O~#gTGxzTʆT *U> ʒT*U#ÆT!9!97>?'w#¢T!9!'w#½TT*U!9!7>?'w#TT!9!7>?'O# UG>!0UÎX8U9U:UU)DUyw# JU~#aU~#W #ïU~#o>gxGUGnVwF#"uxVU*u!9G_>WObk++ V~+Vy~#/g{ozg! WÎX(W)W*W,W.W Conversion#}OD*Vv~|W##~#foCW!XWÎX`WaWbWdWfW Free Space Exhausted##^#V#{_zWEX{_zWHW4z¢W{W##^#V# ##s#rs#r#s#r+++~sw#r####}*Vv}|?X*{z?X+F+N+V+5^{EX{zEX}|EX{XXi`~sw#r##q#p i`N#F#^#V~EXq4#p+i`##s#rKX]gX] FREE Request Out-of-Range$ Free Space Overwrite$GKҦXMbkæXsZFrZNrZN#FrZ^#V"`y2`xҹXi&ͳ[XXxX>X!`{#z*_*_[xyxXWY_!Z^#VͮYQY>(SYy͊Y>)SY|4YFYZ|@YFYͮYYü]>,SYQY> _Y\ Y\ Y\0:SYSYaYaYQY|oY}oY ښYdԜY ͜YڧYÞYxaYN #~SYðY!ZͮY*Pv!9{_zY{Y YYQY>#SY*Pv>=^#V#{YY Z>: Z>?SY!yZͮYͮY>=SY^#V|KZ}BZ.))ZîY#F>AZ> #fZ~ >. Z~ Z=WZ^#V# File: Traceback:ZZZZZZZZ ERROR FIXED OVERFLOW OVERFLOW UNDERFLOW ZERO DIVIDE END OF FILE UNDEFINED FILE KEYNULCONCONRDRPUNLSTBADG!`~B['[] Condition Stack Overflow$4Ox!v w#s#r#s#r!9!` s#r!`N!v +++++{[#{”[#zʙ[++~{[++!`5!~# ¨[ä[!`N!v +++++[#~#[+{[#z[++~[#^#V=!`~C\5:`_!`^#V"`_.~# \*`))))).` )| *\*_|}*`"_:`*`_w# P\*`{ j\ n\!#"`à\Copyright (c) 1980 Digital Research, v1.3 !"Tv"Rv"Xv2`2`*[v \"Pvq#p##}o"Vv*}o|\]]+w+w+r+s4w#w#s#r<2Zv++*Tvs#r"Tv*Rv#"Rv*RvDM!Tvx~²]#~+²]+F+Nq#p*Rv+"RvI]Ұ]=c]!+~O~#~G!/x‹]yʨ] >O6# ‚] r]=ɯ ~#fo++!]!Rv~#]*Tv]¼]]]^  Insufficient Memory$ Invalid I/O List End of Execution$^b bb SYSINSYSPRINT  E | < X{< ZIP 1.5 1982 Hal Pawluk TERMINAL INSTALLATION PROCEDURE Press any key to continue. 0. Custom install a terminal 1. ADDS 14. IBM 3101 2. ADM-31, Ampex 15. INTERTEC 3. ADM-3, -5 16. NEC 4. Ambassador 17. Osborne 1 5. Apple (24x40) 18. SOROC 6. Apple (24x80) 19. TRS80 II/Lifeboat 7. Apple III 20. TRS80 II/P & T 8. Cromemco 3102 21. Televideo 910 9. HDS 108 22. Televideo 92510. HP 86,87 23. Vector Graphic11. HP 125, 2621 24. Visual 10012. Hazeltine 1500 25. Xerox 82013. Heath 89 Enter a number or : Will skip listed terminals. Y  2#ADDS terminal installed. ;= ADM-31/Ampex terminal installed. ADM-3, -5 terminal installed. Osborne 1 installed. [; HPp\Ann Arbor terminal installed. @24 x 40 Apple installed. 24 x 80 Apple installed. *DCAB  Apple III installed. ECromemco 3102 installed. ?a <=>HDS 108 terminal installed. HP 86/87 installed. HJH&ay C&s1a&s0aHP-125, 2621 installed. ~~ Hazeltine 1500 terminall installed. EHHeath 89 installed. LIBM 3101 terminal installed. Superbrain/Compustar installed. NEC computer installed. Soroc terminal installed. Televideo 910/912/920 installed. TRS-80 with Lifeboat CP/M installed. TRS=80 with P & T CP/M installed. Televideo 925/950 installed.  (Vector Graphic installed. Visual 100 terminal installed. Xerox 820 installed. Type C to CHANGE entry or : Cc +^ cc +^h          2 INSTALLED VALUES: ( spaces available)1> Clear & Home cursor: 2> Cursor positioning: (ANSI)(ASCII)Offset: (Delay installed)not installed)3> Up : 4> Down: 5> Right: 6> Left: 7> (ANSI) Set-up: 8> (ANSI) Re-set: 9> Height: 10> Width: 11> Backspace key erases.will not erase.Enter number to change or :  New value for HEIGHT (24-60): #YNew value for WIDTH (40-80): @CURSOR POSITIONING SEQUENCE:ROW position is character number: COLUMN position is character number:  ANSIASCII addressing: change it (Y or N)? YyThe CURSOR OFFSET (in decimal) is: Do you want to change it (Y or N)? New CURSOR OFFSET (1-256): VNO DELAY used: Change it (Y or N)? ESC CLEAR SCREEN & HOME: CURSOR POSITIONING: CURSOR UP:CURSOR DOWN:CURSOR RIGHT:CURSOR LEFT:(ANSI) SETUP:(ANSI) RESET:Type C to CHANGE it: Cc* spaces leftCharacter: ESCC to CHANGE entry or : m -^ jklk jklkklkn jklkjklk$jklk /n        D/TBMEQSVH@#.-I NPAK_FLC fC to CHANGE, F if FINISHED: az Type the symbol or number to change: Now type the replacement: []RESERVED--Enter new choice: Enter L>etter to change or hNew horizontal marker: RESERVED--Enter new symbol: !~vNew vertical marker: RESERVED: Enter new symbol: tNew tab value (1-): mNew page margin (0 - 132): 2 ZIP COMMAND DEFAULTS:: DISPLAY value: INPUT value[]: EMBED commandsCommand mark: Edge: Center text: Kill Row/Col: Add Row/Col: Horizontal line: Vertical line: Top : Bottom : Middle: Delete : Insert : Prior Screen: First : Last : Next Screen: SAVE : ERASE : QUIT no save ZIP's DYNAMIC VALUES:ZIP will start any new session with thevalues you install now. You will be ableto change these temporarily during a ZIPsession. ertical marker: orizontal mark: abs (1 -) : argin, printer: r r nr r nnnr nn_pap_pap ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz.$:@%#/0123456789+-.0123456789+-.  + s!s!ss>ssss`ss Invalid Format Item$  tttttt Stream/Record Sequen/Direct Input/Output Keyed Access P< $conu u_ttttttt%u)u *u+u,u-u=u ?uLuBuCuVuDuEu`u.datpuquujukuuuuu]vtttttt Stream/Record Sequen/Direct Input/Output Keyed Access P< $con*DBASE HELP TEXT FILE DBASEMSG.TXT VERSION 1.17 FOR dBASE II v2.41 Copyright 1984 Ashton-Tate Written by Wayne Ratliff, Jim Taylor, and Howard Dickler INTRODUCTION This entry is intended to give you on-line information about your dBASE II Database Management System. It explains the disk files you have received, and gives suggestions on tapping the power now available to you for data management. Using the on-line HELP in conjunction with your Manual, you will soon be creating databases and writing command procedures to do your work. >>>>>>> type any key to continue <<<<<<< HOW TO USE THE 'HELP' FACILITY Information about your dBASE II system can be obtained by typing HELP and the name of a dBASE II command or HELP and any of the following key words. FULL SCREEN LIMITS NEW VIDEO ERRORS FUNCTIONS DBASE GLOSSARY HELP INSTALL RUNTIME >Note: Entire key words need not be entered. dBASE will then look up the entry for the key word and display it. If there is no information on the subject then dBASE will say "NO HELP MESSAGES FOUND". When there is more text to display beyond what's shown, then you will see the word WAITING (like this). >>>>>>> type any key to continue <<<<<<< The essential dBASE II files on this disk are: DBASE.COM -- main system program file DBASEOVR.COM -- all overlays and system messages DBASEMSG.TXT -- this HELP file (only necessary if you use HELP) INSTALL.COM -- terminal installation program (not necessary after terminal is installed). *EXIT *FULL SCREEN FULL-SCREEN CURSOR MOVEMENT CODES -- ALL COMMANDS ctrl-X moves cursor DOWN to the next field (also ctrl-F) ctrl-E moves cursor UP to the previous field (also ctrl-A) ctrl-D moves cursor AHEAD one character ctrl-S moves cursor BACK one character ctrl-G deletes character under cursor or deletes character to left of cursor ctrl-Y blanks out current field to right of cursor ctrl-V toggles between overwrite and INSERT modes ctrl-W save changes and returns to "." prompt IN EDIT MODE ctrl-U toggles the record DELETE mark on and off ctrl-C writes current record to disk and ADVANCES to next record ctrl-R writes current record to disk and BACKS to previous record ctrl-Q ignores changes to current record and returns to "." prompt ctrl-W writes all changes to disk and returns to "." prompt IN BROWSE MODE ctrl-B pans the window RIGHT one field ctrl-Z pans the window LEFT one field IN MODIFY MODE ctrl-T DELETES current line, moves all lower lines up ctrl-N INSERTS new line at cursor position ctrl-C scrolls down a half page ctrl-W writes all changes to disk and returns to "." prompt ctrl-Q ignores all changes and returns IN APPEND MODE terminates APPEND when cursor is in first position of first field ctrl-W writes record to disk and moves to next record ctrl-Q ignores current record and returns to "." prompt CONTROL KEY STROKES OPERABLE WHEN NOT IN FULL SCREEN ctrl-P toggles your printer ON and OFF ctrl-R repeats last executed command ctrl-X clears the command line without executing command ctrl-H backspace ctrl-M emulates a carriage return ctrl-S starts/stops CPU operation *VIDEO Your KAYPRO has a variety of video attributes including reverse and half intensity, blinking, underlining and cursor off. In- structions for using these are found in you User's Manual. In the meantime, we've included two examples of the possibilities with your dBASE II system. One program, REV-ON will turn on half-intensity reverse video and the other, REV-OFF, turns it off. To use, type: . DO REV-ON or . DO REV-OFF at the dBASE II (.) prompt. *EXIT *INSTALL In order to use dBASE II's Full-screen editing facility, your terminal must be properly installed. Many dBASE formats are pre- installed. If yours is not your screen will appear jumbled when you attempt to perform such full screen operations as APPEND or EDIT. To correct this you must install dBASE II by running the dBASE II installation program, INSTALL.COM, called from your system as INSTALL. Since you may diagnose your terminal's status at any time by running STARTUP.PRG (called from the dBASE II "." prompt by entering the command DO STARTUP), you would be wise to use it before attempting to INSTALL dBASE II. It will tell you if you need to run the installation program, and can be used later to check the results if you do. *EXIT *NEW > New commands and changes to dBASE II New commands: HELP -- user aid command. REINDEX -- realigns and updates existing index file. SET F -- sets value of function key on IBM PC, Victor, TI Professional, and IBM PC compatible terminals. SET COLOR -- alters display color on terminals listed above. TEXT -- displays multiple lines of text, terminated by ENDTEXT. RANK( ) -- function returns ASCII value of first character. TEST( ) -- function determines validity of Supplemented Commands: APPEND,INSERT,EDIT,CREATE -- can now use a format file for screen control. BROWSE -- can now be given a list of fields to work with. DISPLAY STATUS -- shows databases and indexes in use and SET settings. READ & REPLACE -- can be directed not to perform disk accesses when non-key data is changed. RELEASE -- can now release subsets of memory variables. RESTORE -- can restore additively to existing memory variables. SAVE -- can now save subsets of memory variables. SET RAW ON -- eliminates extra spaces in DISPLAY and ? commands. UPDATE -- replace clause can now include WITH phrases. *EXIT *GLOSSARY dBASE II TERMINOLOGY or - any valid dBASE command or function. -- character string(s). In most instances must be delimited with single quotes (''), double quotes (""), or brackets ([]). -- an whose content is defined as Character in type. May be a cstring, a memvar or field of type C or any combination of these items concatenated with the dBASE operators. -- any non-alphanumeric character used to demarcate data, e.g., single quotes (''), double quotes (""), brackets ([]), colons (::), commas (,,), etc. or -- an item or group of items and operators whose value can be determined by dBASE. s may be defin- ed as C,N, or L depending on the "type" of data they contain. -- a list of expressions delimited with commas. -- a record field name. -- a list of field names delimited with commas. -- name of file you wish to create or access. -- name of index file you wish to create or access. -- list of field(s) or portion(s) thereof used to create index files or sorted databases. -- the name of a memory variable. -- list of memory variables delimited with commas. -- a number which dBASE regards as a literal value. -- an whose content is defined as Numeric. -- command option specifies range of records dBASE must treat in executing command. has three possible values: ALL records in file; NEXT records in file; and RECORD . Default value varies from command to command. -- allows batch manipulation of files of same type and/or with matching characters in filename using operating system "wild cards," ? and *. Also allows batch manipulation of groups of with matching characters in name. -- the name of a database field or . *EXIT *? *?? > ? -- Evaluates and displays the value of an expression. In command files (and elsewhere) can be used without expression to space down a line at output. . ? 6/3 2 . ? 'CITY' CITY . ? CITY (field of file in use) Managua > ?? -- Same as ?, but displays result on same line as entry. *EXIT *@ > @ -- Displays user formatted data on screen or printer at spec- ified x,y coordinates (x=line,y=column). Syntax: @ [SAY [USING '']] [GET [PICTURE '']] Examples: @ 3,23 SAY AMOUNT * 1.06 USING '$$$,$$$.99' @ 14,23 SAY "ENTER PHONE" GET PHONE PICTURE '(###)###-####' @ LINE+2,45 SAY TOTAL USING '99999.99' *EXIT *ACCEPT > ACCEPT -- Prompts user to enter character string information into a designated memory variable. Syntax: ACCEPT [''] TO Example:. ACCEPT "What is your name?" to NAME What is your name?: [user's response stored to SIN] . ? NAME [user's response displayed] *EXIT *APPEND > APPEND FROM [FOR ] or APPEND FROM [SDF] [DELIMITED] [FOR ] -- appends data FROM a database or file in System Data Format file to the database in use. Records marked for deletion in FROM will not be appended. e.g., APPEND FROM MAILLIST FOR NAME='N' APPEND FROM TEST.TXT DELIMITED > APPEND BLANK -- appends a blank record to file in use. > APPEND -- allows user to add new records to database in use. (If index is also in use, the index file is automatically updated). *EXIT *BROWSE > BROWSE [FIELDS ] -- Brings up Full-screen viewing and editing of the database in use. *EXIT *CANCEL > CANCEL -- In a command file, stops command file execution and returns user to dBASE "." prompt. Command file fragment: ACCEPT "What should this humble machine do next?" to NEXT IF NEXT = 'Q' CANCEL ENDIF *EXIT *CHANGE > CHANGE -- Permits Non-Full-Screen editing of database in use by field. Hit ESCape key to terminate CHANGE mode. Syntax: CHANGE [] FIELD [FOR ] Example: CHANGE ALL FIELD ZIP FOR ZIP = '90045' RECORD: 00001 ZIP: 90045 CHANGE? (Enter the characters to be changed and hit return. Add new data at the TO prompt, or hit return to go to the next appro- priate record.) *EXIT *CLEAR > CLEAR -- closes all database in use, releases all memory vari- ables, and Selects Primary work area. > CLEAR GETS -- commands dBASE to forget all GET statements still active without erasing the screen. *EXIT *COPY > COPY -- Copies the database in use or only its structure TO another file. COPY will create the TO if it does not yet exist, but will destroy an already existing file of that name. Will not copy records marked for deletion. Command has three forms: COPY TO [] [FIELD ] [FOR ] COPY TO [SDF] [DELIMITED [WITH ]] [FOR ] COPY TO STRUCTURE [FIELD ] > COPY TO STRUCTURE EXTENDED -- special form of COPY creates database whose records represent the structure of file in use. *EXIT *COUNT > COUNT -- Counts the number of records in database in use which satisfy specified criteria. Default value is COUNT all records. Syntax: COUNT [scope] [FOR ] [TO ] Example: COUNT NEXT 25 FOR GRADE > 'B-' TO DEANLST *EXIT *CREATE > CREATE [] -- Creates a new database. User will be prompted for file structure. > CREATE FROM EXTENDED -- creates database whose structure is determined by the data contained in the records of . (Used with COPY STRUCTURE EXTENDED.) *EXIT *DELETE > DELETE FILE -- deletes specified file. > DELETE [] [FOR ] -- marks record(s) for deletion. Records marked for deletion (with *) will not be erased until the PACK command is given. Records may also be marked for deletion by record number. Examples: DELETE ALL FOR COMPANY = 'ZMB' DELETE RECORD 15 *EXIT *DISPLAY > DISPLAY FILES [ON ] [LIKE ] -- lists files on drive. For example, DISPLAY FILES ON B LIKE *.MEM. > DISPLAY [][][FOR][OFF] -- displays records of file in use. > DISPLAY STRUCTURE -- displays field names, types, lengths, and decimals (structure) of file in use. > DISPLAY MEMORY -- display names,types, and values of all cur- rently defined memory variables. > DISPLAY STATUS -- lists databases in use, system date, indexes in use, and current parameters SET. *EXIT *DO *ENDCASE *ENDDO *LOOP > DO -- opens and executes specified command file. > DO WHILE -- used in command files to open a structured loop. Commands in between are executed so long as the DO WHILE is found to be true. Syntax: DO WHILE Example: USE MAILLIST DO WHILE .NOT. EOF [LOOP] ? NAME ? PHONE ENDDO SKIP ENDDO > LOOP -- causes command file to jump processing back to the DO WHILE command. Example: USE MAILLIST DO WHILE .NOT. EOF IF ZIP = '90005' SKIP LOOP ENDIF ? NAME ? PHONE SKIP ENDDO *CASE > DO CASE -- used in command file to choose one and only one of several possible execution paths. OTHERWISE clause optional, and executes when no CASE is true. ENDCASE is needed to close command. Example: USE MAILLIST ACCEPT "WHICH MENU OPTION DO YOU PREFER?" to Choice DO CASE CASE Choice = '1' DO Clabels CASE Choice = '2' DO Cappend CASE Choice = '3' DO Cedit OTHERWISE Return ENDCASE *EXIT *EDIT > EDIT [] -- enables selective editing of database in use by record number. Requests record number if not supplied. When edit of particular record has been com- pleted, ctrl-W brings back EDIT's record number prompt (ENTER RECORD #:). To terminate EDIT mode, answer record number query with a return. *EXIT *EJECT > EJECT -- causes printer to do a form feed (page eject) if PRINT is SET ON or FORMAT is SET TO PRINT. When using @ SAY commands for direct page formatting, EJECT will zero out line and column counters. *EXIT *ERASE > ERASE -- clears the screen. In interactive mode, "." prompt will appear at top left corner of screen. *EXIT *FIND > FIND -- when using indexed files, positions to first record indexed by . *EXIT *GO *GOTO > GO or GOTO -- positions to a specific record or place in the database in use. Also positions to record number contained in memory variable. Syntax: GO or GOTO [RECORD ],,[TOP],[BOTTOM], or *EXIT *HELP dBASE II ON-LINE HELP FACILITY Below you will find a list of all dBASE commands. Each entry in this list corresponds to an entry in the HELP file proper. In the latter, you will find a brief synopsis of each command as well as a picture of that command's correct syntax. Please remember, however, that HELP file information is limited, and is only meant to cut down on the number of trips you will have to make to the dBASE II Manual. To access the entry for the dBASE command (or other Help File entry) you wish to review, simply respond to the dBASE "." prompt by entering HELP and a return (e.g. HELP CREATE ). dBASE will access the information you wish to see, and then return you to the "." prompt so you can go right back to work. In some cases the entry will take up more space than is provided by a single screen. (This is one of them.) To bring up the next screen of information, just hit any console character: this will tell dBASE to stop "WAITING." If you wish to exit the HELP file before viewing an entire entry, simply hit ESCape. >>>> Type 'HELP dBASE' for other <<<<<< >>>>> important information <<<<< > ? -- displays an expression, variable, or field. > ?? -- displays an expression list without a preceeding line feed. > @ -- displays user formatted data on screen or printer. > ACCEPT -- allows input of character strings into memory vari- ables. > APPEND -- append information from another dBASE II database or files in Delimited or System Data format. > BROWSE -- full screen window viewing and editing of database. > CANCEL -- cancels command file execution. > CHANGE -- Non-Full-Screen edit of fields of database. > CLEAR -- closes databases in use and releases current memory variables. > CONTINUE -- continue the searching action of a LOCATE command. > COPY -- creates a copy of an existing database. > COUNT -- counts the number of records in file which meet some criteria. > CREATE -- creates new database. > DELETE -- deletes a file or marks records for deletion. > DISPLAY -- display files, database records or structure, memory variables, or status. > DO -- executes command files or structured loops in same. > EDIT -- initiates edit of records in a database. > EJECT -- ejects a page on the printer. > ELSE -- alternate path of command execution within IF. > ENDCASE -- terminates a CASE command. > ENDDO -- terminates DO WHILE command. > ENDIF -- terminates an IF command. > ENDTEXT -- terminates a TEXT command. > ERASE -- clears the screen. > FIND -- positions to record corresponding to key in index file. > GO or GOTO -- positions to specific record or place in file. > HELP -- access help file overview or specific help file entry. > IF -- allows conditional execution of commands. > INDEX -- creates an index file. > INPUT -- allows input of expressions into memory variables. > INSERT -- insert new record in database. > JOIN -- joins output of two databases. > LIST -- lists files, database records or structure, memory variables, and status. > LOCATE -- find a record that fits a condition. > LOOP -- skips to beginning of DO WHILE command. > MODIFY -- create and/or edit command file or modify structure of existing database. > NOTE or * -- allows insertion of comments in command file. > PACK -- erases records marked for deletion. > QUIT -- exits dBASE and returns to operating system. > READ -- initiates full-screen editing of formatted screen by accepting input into variables accessed with @ GET. > RECALL -- erases mark for deletion. > REINDEX -- update existing index file. > RELEASE -- eliminates unwanted memory variables and releases memory space. > REMARK -- permits display of any characters. > RENAME -- rename a file. > REPLACE -- change information in record(s) or entire database field by field. > REPORT -- format and display a report of information. > RESET - reset operating system after placing new disk in drive. > RESTORE -- retrieves memory variables stored in MEM file. > RETURN -- ends a command file. > SAVE -- copies current memory variables to disk file. > SELECT -- switches between USE files in PRIMARY and SECONDARY areas. > SET -- sets dBASE control parameters. > SKIP -- position forwards or backwards in database. > SORT - write copy of database sorted on one of the data fields. > STORE -- creates memory variables. > SUM -- compute and display the sum of database field(s). > TEXT -- allows output of block of text from a command file. > TOTAL -- creates summary copy of database combining information from specified fields of records meeting some criteria. > UPDATE -- allows batch updates of a database. > USE -- specifies database to USE until next USE command is issued. > WAIT -- suspends command file processing until user input received. >>>>> Other key words <<<<< (e.g. type 'HELP RUNTIME' ) FULL SCREEN NEW ERRORS GLOSSARY FUNCTIONS INSTALL DBASE LIMITS RUNTIME *EXIT *IF *ELSE *ENDIF > IF -- in command file, IF structure permits conditional exe- cution of commands. ELSE clause is optional. Syntax: IF Example: IF STATE = 'CA' DO INSTATE (CMD file) [ELSE ELSE ] DO OUTSTATE (CMD file) ENDIF ENDIF *EXIT *INDEX > INDEX ON TO -- creates an index file for database in use based upon content of field(s) or portion(s) of field(s) specified by the or index . *EXIT *INPUT > INPUT [""] TO -- prompts user to enter numeric or logical information into the designated memory variable. Example: INPUT 'Prompt user for input' TO X Prompt user for input: 12 [user input, 12, stored to X] . ? X 12 *EXIT *INSERT > INSERT [[BEFORE] [BLANK]] -- inserts a record into the database in use immediately after or -- with BEFORE -- before the current record. Presents user with data entry format for use file unless BLANK record is requested. *EXIT *JOIN > JOIN -- creates a new database by combining the records of files in use in Primary and Secondary areas. Records are added where FOR evaluates as True. Command must be executed from primary area. Default value for FIELD is ALL. Syntax: JOIN TO FOR [FIELDS ] Example: . USE NAMES . SELECT SECONDARY . USE MAILLIST . SELECT PRIMARY . JOIN TO NAMEJ FOR LAST <> S.LAST *EXIT *LIST > LIST FILES [ON ] [LIKE ] -- lists all files on designated disk. Default to logged disk. Example: LIST FILES ON C LIKE *.FRM > LIST [][] [FOR ][OFF] -- displays records of file in use. Default value is ALL records. Example: LIST NEXT 25 NAME, PHONE FOR CONTRIB > 100 (i.e., NAME and PHONE of next 25 who contributed more than $100.) > LIST STRUCTURE -- displays structure of database in use. > LIST MEMORY -- lists names and values of all currently defined memory variables. > LIST STATUS -- lists databases open, indexes in use, system date, and current parameters SET. *EXIT *LOCATE *CONTINUE > LOCATE [] FOR -- finds first record of database for which FOR is True. Use CONTINUE to find next such record. (User may manipulate record before resuming search with CONTINUE.) . LOCATE ALL FOR ZIP >= '95000' .AND. ZIP < '96000' RECORD: 00123 . DISPLAY . CONTINUE RECORD: 00232 *EXIT *MODIFY > MODIFY STRUCTURE -- allows user to alter the structure of database in use. This command will destroy all data in the file in use. (To alter structure without loss of data, use COPY STRUCTURE, USE, and APPEND as illustrated below.) . USE NAMES . COPY STRUCTURE TO TEMP . USE TEMP . MODIFY STRUCTURE -- no data lost since file is empty . APPEND FROM NAMES -- brings data into modified database . DELETE FILE NAMES . USE -- close TEMP in order to: . RENAME TEMP TO NAMES > MODIFY COMMAND -- calls dBASE's text editor and brings up or creates designated file. Primarily used for creating and editing command (.PRG), text (.TXT), and format (.FMT) files, but may be employed as a simple full screen word processor. *EXIT *NOTE > NOTE or * -- permits the insertion of comments into a command file. Comments following NOTE or * will not be read when file is executed. *EXIT *PACK > PACK -- erases records marked for deletion in database in use. If index files are in use, they will be automatically updated. *EXIT *QUIT > QUIT [TO ] -- terminates dBASE and returns control to operating system. Optionally calls programs from system level. *EXIT *READ > READ -- initiates full-screen mode for entry or editing of variables. The Full-screen prompts and window are created by @ SAY commands with GET phrases. Command file fragment: STORE ' ' TO name STORE ' ' TO phone @ 4,4 SAY 'Name' GET name @ 6,4 SAY 'Phone' GET phone PICTURE '(###)###-####' READ *EXIT *RECALL > RECALL [] [FOR ] -- reinstates record(s) marked for deletion within use file. Default value is current record. *EXIT *REINDEX > REINDEX -- allows update of index files not automatically 'reindexed' after alteration of database file. Example: . USE MAILLIST INDEX INDEXA . APPEND [append operations performed] . SET INDEX TO INDEXB,INDEXC . REINDEX *EXIT *RELEASE > RELEASE -- erases unwanted memory variables and opens memory space for further use. ( uses ? to mask any single character, * to mask all remaining characters. Syntax: RELEASE [], or [ALL] RELEASE ALL LIKE RELEASE ALL EXCEPT Examples (where N, N1, N2, N10, V7 are variables in use): RELEASE ALL LIKE N? [N10 and V7 will remain] RELEASE ALL LIKE N?? [V7 will remain] RELEASE ALL EXCEPT ?1* [N1 and N10 will remain] *EXIT *REMARK > REMARK -- permits the display of any characters. In command file character entry is output. Example: . REMARK abracadabara!!! abracadabara!!! *EXIT *RENAME > RENAME TO -- renaming of file in DOS directory. Unless otherwise indicated, dBASE assumes that file type is DBF. Example: . RENAME REVIEW.FRM TO REVIEW2.FRM *EXIT *REPLACE > REPLACE -- allows user to replace contents of specified fields of database in use. If index file is keyed on field targeted for update, index in use will be automatically updated. Default is current record. Syntax: REPLACE [] WITH [, WITH ][FOR ] Example: . USE MXPROJ . REPLACE ALL COST WITH COST * 6.1 FOR ITEM = 'ELEC' *EXIT *REPORT > REPORT -- used for creating a Report Form File (FRM) for dis- playing specified information from a database in a user- defined format. Outputs results to screen or printed page. Syntax: REPORT [FORM
] [][TO PRINT] [FOR ] [PLAIN] *EXIT *RESET > RESET [] -- use this command after changing disks on any drive other than that containing dBASE. Command resets the DOS bit map, allowing uninterrupted operation of dBASE program. Close all files before issuing a RESET. *EXIT *RESTORE > RESTORE FROM [ADDITIVE] -- retrieves and activates the set of memory variables previously SAVEd to a memory file. ADDITIVE allows you to keep currently defined variables intact; otherwise they are lost. *EXIT *RETURN > RETURN -- may be used in a command file to return control to the command file which called it or to dBASE "." prompt if user called it. *EXIT *SAVE > SAVE TO [ALL LIKE ] or [ALL EXCEPT ] -- copies all memory variables currently in use, or only those specified by , to designated memory (MEM) file. uses ? to mask any single characters and * to mask all remaining characters. Examples (where N1, N2, N10, V1, V2, V10 are current variables): . SAVE TO NUMBER ALL LIKE N* [saves N1, N2, N10] . SAVE TO NUMBER ALL LIKE N? [saves N1, N2] . SAVE TO NUMBER ALL EXCEPT ?1* [saves N2, V2] *EXIT *SELECT *PRIMARY *SECONDARY > SELECT [PRIMARY / secondary] -- allows user to move between the two work areas dBASE provides, thus permitting user to work with two databases simultaneously and maintain record pointers in both. Primary area is active upon bringing up dBASE. *EXIT *SET > SET -- sets dBASE control parameters. Syntax: SET [ON or OFF] SET TO