IMD 1.16: 29/05/2007 11:54:25 FOGCPM.005 --FOGCPM005CPM3LIB DOCD CPM3LIB REL EPOXLINKCOMEPOXLINKDOCKEY2SCRNCOMKEY2SCRNDOCLBRDISK COM,LBRDISK DOCMAKEST20COM$ !MAKEST20DOC9"#$%&'()MAKEST20ASM*+,-./0123456789MAKEST20ASM[:;<=>?@ABCDE-10-00 85 MKWAIT20COM0FGHIJKMKWAIT20DOC`LMNOPQRSTUVWMKWAIT20ASMXYZ[\]^_`abcdefgMKWAIT20ASMhijklmnopqrstuvwMKWAIT20ASMx-CPM005 DOC SHOW1 COMySHOW1 DOCzSUB1 SUB{SUB2 SUB|WAIT0 COM}WAIT1 COM~WAIT2 COMWAIT3 COMWAIT4 COMWAIT5 COMWAIT6 COMQS COMQS DOCSCDATE COMSCDATE DOCSCDATE ASM&U3#102 COM U3#102 DOC U3 ASMdSERIF CHR.SERIF DOCULTIMATECHR.ULTIMATEDOC This is the disk name.  October 17, 1983 Jim Lopushinsky Edmonton, Alberta CPM3LIB.RE̠ i librar o subroutine tha mak us o CP/ Plu features Include ar routine t acces th tim an date se an interogat elapse time inspec physica an logica characte I/ devices an set/ge bau rate fo seria I/ devices. Thi i jus start I th future hop th librar wil b increased to include other CP/M Plus features. Al routine (excep BIOS adher t th Microsof paramete passin convention s tha the ma b calle directl b an Microsoft language compiler (FORTRAN-80, COBOL-80, BASIC-80). T includ an require modules searc CPM3LI durin th lin step. BIOS Direct bios call thru the BDOS using function 50. Input: Register D - Bios entry number (0-32). Al othe register - A expecte b th BIO routine. Output: Al register returne a appropriat fo th BIO routine. TIMERS Initiate time counter Input: none. Output: none Al register ar preserved Th interna tim counte i initialize t an incremente every second. Fortran calling convention: CALL TIMERS ITIMER Retur numbe o second elapse sinc th las cal t TIMERS. Input: none. Output: Register HL - Number of seconds elapsed. Register A - Copy of Register L. Z flag set - TIMERS not yet called. All other registers are preserved. Fortran calling convention: ITIME=ITIMER(0) Where: ITIME is either I*2 or I*1 variable. i dumm paramete s tha FORTRAN-8 wil kno tha thi i functio call. TIME Return date and time as 3 character strings. Input: Register HL points to 3 byte Day of Week field. Register DE points to 8 byte date field. Register BC points to 8 byte time field. Output: Th field ar se t th curren tim an date Day of Week - Abbreviation of Weekday. Date field - MM/DD/YY. Time field - HH:MM:SS. All registers are destroyed. Fortran calling convention: CALL TIME(WKDAY,DATE,TIMEX) Where:WKDAY is a 3 byte array. DATE and TIMEX are 8 byte arrays. TIMEB Return date and time in binary format. Input: Register HL points to Day of Week word. Register DE points to 3 words for date. Register BC points to 3 words for time. Output: The 3 fields are set to current date and time. Weekday is in the range 0-6 (0=Monday). Date is in the order Month,Day,Year. Time is in the order Hour,Minute,Second. All registers are destroyed. Fortran calling convention: CALL TIMEB(IWKDAY,IDATE,ITIME) Where: IWKDAY is I*2 variable for Weekday. IDATE and ITIME are I*2 arrays of 3 for date and time. IFNDEV Return th pysica devic numbe associate wit th devic name. Input: Registe H̠ point t characte strin whic contain th devic name. Output: Register HL contains the device number. Register A - copy of register L. All other registers are preserved. Error condition I registe H 0FFFF (-1 the th named device does not exist. Fortran calling convention: IDEV=IFNDEV(DEVNM) Where: IDEV is I*2 or I*1 variable for device number. DEVNM is 6 byte string containing the device name.  Example: IDEV=IFNDEV('MODEM ') IDE֠ wil contai th pysica devic numbe associate wit th nam MODEM o - i MODE could not be found. IBAUD Get or Set the baud rate for a pysical device. Input: Register HL points to the Baud rate word. If baud rate=0 then return current baud rate. Otherwise set the device to value at baud rate. Register DE points to device number byte. Output: Registe H contain th curren bau rat o th requested device. Error condition H - Invali bau rat o invali devic numbe o devic doe no suppor requeste baud rate. Fortran calling convention: IBD=IBAUD(IRATE,IDEVNO) Where:IBD is I*2 variable containing returned baud rate. IRATŠ i I* variabl whic contain fo ge o a baud rate for set. IDEVNϠ i I* o I* variabl containin th device number. Examples: IBD=IBAUD(0,1) Returns the current baud rate of device 1 IBD=IBAUD(1200,2) Sets the baud rate of device 2 to 1200 baud. IMXDEV Returns the maximum physical device number. Input: none. Output: Register L - Maximum device number. Register A - Copy of Register L. Register H - 0 All other registers are preserved. Fortran calling convention: MAXDEV=IMXDEV(0) Where: MAXDE֠ i I* o I* variabl tha wil contai the maximum physical device number. IGTMOD Returns a physical device Mode byte. Input: Register HL points to physical device number Output: Register L - Mode byte Register A - Copy of Register L.  Register H - 0 All other registers are preserved. Fortran calling convention: MODE=IGTMOD(IDEVNO) Where: IDEVNO is I*2 or I*1 physical device number. MOD i I* o I* variabl tha wil contai th mode byte. Th bit i th mod byt hav th followin meanings: Bit 0 Device may do input 1 Device may do output 2 Software selectable baud rates 3 Device may use XON/XOFF protocol 4 XON/XOFF protocol enabled 5-7 Reserved for future use IGTDEV Retur curren logica t physica devic assignmen vector. Input: Register HL points to logical device number. CP/M 3 has five logical devices: 0 CONIN Console input 1 CONOUT Console output 2 AUXIN Auxiliary input 3 AUXOUT Auxiliary output 4 LSTOUT List output Output: Registe H - curren physica assignmen vecto fo th requeste logica device Bit ar se correspondin t physica device fro lef t right (bit 15 = device 0, bit 0 = device 15). All other registers (except PSW) are preserved. Error condition: Registe H 0FFFF (-1 - Invali logica devic number. Fortran calling convention: IVEC=IGTDEV(DEVNO) Where: DEVNO is I*2 or I*1 logical device number. IVEC is I*2 variable for assignment vector. ISTDEV Set logical to physical device assignment vector. Input: Register HL points to logical device number. Registe DŠ point t ne physica assignmen vector. Output: none Al register excep PSנ an H̠ ar preserved. Error condition: Registe H 0FFFF (1- Invali logica devic number. Fortran calling convention: IERR=ISTDEV(DEVNO,IVEC) Where: DEVNO is I*2 or I*1 logical device number. IVEC is I*2 assignment vector. IERR is I*2 or I*1 error return code. FFF (-1 - Invali logica devic number. Fortran calling convention: IVEC=IGTDEV(DEVNO) Where: DEVNO is I*2 or I*1 logical device number. IVEC is I*2 variable for assignment vector. ISTDEV Set logical to physical device assignment vector. Input: Register HL points to logical device number. Registe DŠ point t ne physica assignmen vector. Output: none Al reRPUQ T$TI@֌jr@ ND\4xFV=,ULl FaS@P0k @j1Yʧ@Tuh [T=}S9L@xFVuX/HX(ͪ DCbX?FHK`X,K `8 r0ˈBIOST$THXIMXDEVQUddDUi@TQ:!inʧ@ QU@b `V`M`d\!@2XT8BP2S%9ZpQUduDDUh%MQZP5MzZC/ @M,%jV TYxFVuXͦ :,!@qX!#1a@Ԑ jP,Z(ꈈѠ 8QS duDI@Ԡ?9PQ:C.`z?a0+ 2XQջ[dhT:eWPaG9i@W: \uq@㫀͵E<-+ 2RwxG>ѝKo% n[-dDU(TIMERSSQ`UDT(Q%5P5 EqM&ܠ my\t2˔Uq]n0 bEW!,>b6mc A16 @ CtY|: l>b6mcd`S6 ax"ҭYd EmM&B6 ݀@m<=G+B F6«v+@'0 p+qpj>ѝvk FW !!`8^M7S)\d*ca:Φm [v-oe2n [-re2 n d:SQc Q%5 pSVUdՄDUi@Ԁ D*   `EɌD$8IMXDEVSD$9@ԌeGC*6" 0DTt2Ѱ-KG% 0BIOSP d4%%I@@?٠P 0:P'SD$9@ԌeGC*6" 0DTt2Ѱ-KG% 0BIOSP d4%%I@@?٠Puq@㫀͵E<-+ 2RwxG>ѝKo% n[-dDU(TIMERSSQ`UDT(Q%5P5 EqM&ܠ my\t2˔Uq]n0 bEW!,>b6mc A16 @ CtY|: l>b6mcd`S6REPOXLINK for the Osborne Executive - v1.1 - E. Meyer 6/22/85A program to transfer files with FILINK on the EPSON PX-8 and QX-10The MODEM RS-232C status is : bit rate = 19200$PRNTR >>=>>=:]P!!444444444>>>>J>>>>>> . *#"  ^q#Vp" 1@ @1@    2 S—;âR€I C³qX¢ù ͖. þ!p " O! *  " : <2 A;!p "  RMb 8AS[{# RMb HASHGM* ] " < ʘ | MA}.!] ^MA{_x².#•MA ·?} MAP.!^M{O#YMABGM3*! 5`M.Q ͖. _!\@  : 2  š - ʉ| AR‰SM| AGŸA¼.Q \!@  : 2 _XMêM!M  A w_M#A]!M  : ?~# .!M ͳ: ]!gAA]~+ XA~+ X#6$+M !]ͳ2 <ʦ  N“͖Y! 6 !eU ~6$#®< w>2  M !ABNMPMAwO#ABBM.:2  wGMAX| L!\L  2X 2[ : ʄL „ ã!L l<ʠ2 í .2 q ~_x.#µ ʬ _.n!hi6<. \ $ȷ_.   Ø ¾| A| rzQj r| f{û: 2  .Ð< !p q 6!\]6  2h2k2|!p  y 6 !y y:q :>@&~##:p @@2\]~0C:~*ʀ.WxÞlx: S#C~.ʞ>?#~.ʞ‹#s#e~Oʱxy.*#¤>?#~:] 2 2 p = S Ö{ w a{_| x! _ y5  ] O RM AS ]  AR >| d r ʒ nr  : ʫ : Rr  r N!s#rPress ESC to restart, or ^C to exit from EPOXLINK$Send or Receive (S/R) ? $Sender $Receiver is not ready.$Enter file name $DoneeXit or Continue (X/C) ? $ No file name specified$ File not found$ Sending $! Aborted$ Directory full$ $ Receiving $ ==> $Overwrite (Y/N) ? $ Disk full$ Rename error$ Delete error$ Close error$ Drive select error$ Bad file descriptor$RS-232C is not ready.$ $$p y:q :>@&~##:p @@2\]~0C:~*ʀ.WxÞlx: S#C~.ʞ>?#~.ʞ‹#s#e~Oʱxy.*#¤>?#~:] 2 2 p = S Ö EPOXLINK.DOC ------------ Documentation for EPOXLINK.COM v1.1 - 6/22/85 Eric Meyer EPOXLINK is an Osborne Executive ("OX") version of EPSNLINK, the generic CP/M machine's equivalent of the Epson FILINK program. It allows your Executive to exchange files (text or programs), either singly or in batch mode, with an Epson PX-8 or QX-10 computer running FILINK. In principle, you can transfer files back and forth with PIP on both machines. However, there are some nasty tricks to PIPing to the serial ports on the Exec, whereas EPOXLINK always works easily. Furthermore, EPOXLINK is also compatible with Portable Wordstar "T/C" commands for transmitting files. USAGE: A>EPOXLINK to transmit through Exec MODEM port A>EPOXLINK P to transmit through Exec PRNTR port To transfer files with EPOXLINK and FILINK: 1. Connect your Exec's serial port to the RS-232 port of the Epson with the appropriate cable, and null modem if required. (Example: the Epson #725 "serial printer cable" works with the PX-8.) Note: EPOXLINK will use the MODEM serial port of the Exec, unless you use the "P" option when you run it ("A>EPOXLINK P"), which tells it to use the PRNTR serial port. You can use either port you like. But these two ports are wired differently, so whatever cable you're using, it will work alone on one port, and will require a null modem on the other port. 2. Set the Epson's serial baud rate to 19200, 8 bits, no parity, which is what EPOXLINK will be using. (Use CONFIG on the PX-8.) This is quite fast! 3. Then run FILINK on the Epson, and EPOXLINK on the Osborne. Follow the instructions on FILINK in the Epson manual if in doubt on how to proceed - the program is really very simple to use. To transfer between EPOXLINK and PORTABLE WORDSTAR: Follow the same steps; but instead of running FILINK on the Epson, use the T or C command from the Portable Wordstar Main Menu. low the same steps; but ins. (Example: the Epson #725 "serial printer cable" works with the PX-8.) Note: EPOXLINK will use the MODEM serial port of the Exec, unless you use the "P" option when you run it ("A>EPOXLINK P"), which tells it to use the PRNTR serial port. You can use either port you like. But these two ports are wired differently, so whatever cable you're using, it will work alone on one port, and will require a null modem on the other port. 2. Set the Epson's serial baud rate to 19200, 8 bits, no parity, which is what EPOXLINK will be using. (Use CONFIG on the PX-8.) This is quite fast! 3. Then run FILINK on the Epson, and EPOXLINK on the Osborne. Follow the instructions on FILINK in the Epson manual if in doubt on how to proceed - the program is really very simple to use. To transfer between EPOXLINK and PORTABLE WORDSTAR: Follow the same steps; but ins!``1o-2`!U!UQ:`` UQ! 0-(_|``> ``$(&G 8&``> ``> ``_0`` ( >^``@N`><``>C``>R``>>>2 ASSIGNED KEYS ARE; $ KEY2SCRN.DOC Thi i jus t tel yo tha KEY2SCRN.CO i th sam a KEYS.CO excep tha i ha bee patche t writ th Specia Functio Key o th Executive t th scree an no t printer ɀ  LBR +:@  > LBRFILE LBR ARCDIR ~<=Q+:e8<2e8:e8:e8=2e8<#~=+:e8=+:o8=+7"X8:Z8=2Z8e &°+*R6~ ʮ+ ʮ+ ͼ+"R6®+>&2\8,&°+:\8µ+>&32\8*g8~+6+O++ +x+~++:p8*q8~,1+ 0fͭThis version of LBRDISK requires CP/M 3.xͭLBRDISK version 1.0 for CP/M Plus Copyright (c) 1983 Jim Lopushinsky 12/13/83 $1".~2&."~2:S*.6;*.~2(*:(ͭNo Library RSX to remove..~M.;ͼM.6. f.6*.w. f*"7*)"-!!\ͯ#}IͭExamples: B>LBRDISK C: * <--- Build C0: = Libraries/Archives from B0: B>LBRDISK C1: LIB1 FOOBAR <--- C1: = LIB1 and FOOBAR B>LBRDISK <--- Remove the last LBR RSX B>LBRDISK C: * 1: 1:* 2: 3:* 2:* <--- C0: = All libraries from B0:, C1: = All libraries from B1:, C2: = All libraries from B3: and B2: B>LBRDISK B: A6:* B4:FUM <--- B0: = All libraries from A6:, and FUM from B4: B>LBRDISK H <--- Lists this *.6+|o"+!]~ o+~=d:2+~k s#rr+6."*.s#r6#6 #t#6.w#w.!;K."*-ZxͭToo many Libraries/Archives specifiedZڈ~`i"":2 :2!*7! K ~#_íO~#ʿ![4:&5~wf#~: wÈ ڝ  * w#6?# !2 45# a{ _ɯw#      p#   % % .,:;[]=<>| ڝ  * w#6?# !2 45# a{2LBR : y :M*":wyh ck/  !s~#foc!b 8ooo       oS v  o      o oo$ 2;**" !",:&ʥ2 *$X“o͐“!)  ͤ“^#V" !=* +" |ʓ͍“!) ~ƒ" * ~w+V+^##s#r#;" *,#",*0* ʭ~<ʓ =$: =2 ʥ!):)Y2 *')XGo* +r+s͐G!) ~7" ~w* +V+^##^#V#s#r#!s#r#;" *,#",*0* ʭ͍: =2 Y!Rö Too many Library/Archive members Specify fewer Libraries/Archives Aborting.]2=2**.w* .6.::w "!9"1 1*  .,....~! ^#V# ^# * .w.w.w)  :_ * .6.6* .w! 6 ɯ!"w#w#w!'* s#r+w+w͘! !"4#4#4ʽ?ʸO~#ʧ~# |}}o|gɯ2=! :" "!9"b* .~2 1 oDa%$a" * .~<\:A2F CP/M Error on : ? in Filename<* }D1 ?uh>& *," **" * |“=+" * ?: G~³# ͤ+>" É* s#r#: w#T]s#r#{2 {<2 {z_>W" ~#_ * .~w! " w:>*2 :_ e|G&" * s#r#>  ++V+^* > ~~>&#6#6#>šš> ~wgͶ ~ڱ6g??: >?  : ?2( : * } >& ͉* #" :( @ڈ?ʈ* +" * " 2 ! (w4* .^#V* ~ _># >>##~!Qwg?: ! GG(! (G>&Ͷ !~! >&! n&)))))))! ~" !^#V###N#F! " !" q#p* * }ȷL* .N* y*  ~#foC* Me." * ! ~wjրw! 4~!j##~!w* } Invalid function call on Library/Archive drive: :ogͶ *  N#F *  N#F`i" s#r* !!N#Fyyx! w!> ##~!w! w* }շL, * .N* ~#fo|N }N * e." * }e|b & N#F!!q#p#wg :&! ~<> &>2**" *," 2 !N#F!!^#V`i>& D!D*$HI ! HDI!"$ @$"$ $D"@ D"B$ @ BDH@D D$ I@ $@ $@ $D@BAA"!!$$$!"@" I@H "@$$@HDH@@@ ! DH$unction call on Library/Archive drive: :ogͶ *  N#F *  N#F`i" s#r* !!N#Fyyx! w!> ##~!w! w* }շL, * .N* ~#fo|N }N * e." * }e|b & N#F!!q#p#wg :&! ~<> &>2**" *," 2 !N#F!!^#V`i>& Lbrdisk is a diskcataloging program for cpm3 only - will not run on 2.2 - default instructions - works on any drive such as lbrdisk d: etc - also covers user areas.... LBRDISK $$$1@n-,  +Z****************************** MAKEST Version 2.0 ******************************Copyright (c) 1985 by Peter C. Cole Duncanville, Texas. All commercial rights reserved. Released for free distribution only. Not to be sold. ******************************************************************************** MAKEST will create or edit a "Command File" on the disk drive of your choice. A "Command File" is a file that when run will send a command string to CP/M as if you had typed it in after the system prompt. Normal use of MAKEST is to create an EXECST file which is the first file CP/M Plus looks for when it first boots up. Use EXECST to autoload a favorite program on boot up. MAKEST will only run on the Osborne Executive. ʹ  bPlease select: A,B,etc - Read this disk drive for an existing ͑ pï command line. ^C or X - Exit to CP/M. 1 - Create a new ͑ { command line. 2 - Change to a different file name.  - Edit the below command line (if any). W - Write the below command line (if any) to a "to be selected" disk drive:     EXECST!Cg$w#« =' Y 1ʼ2ʍ_XW*AQ2gͣʹC6|•   Õ File not found. •  Gq Do you want to edit this file? (Y/N) Yʅyʅʹ!*H6~ʣʕ !*Hw#w#w#±!@6~#6#6!@w#w#w#ʹ!@6~ʕ !@é~" :2 ,You can use ! to chain several commands if needed. Example: DIR A:!DIR B: Enter up to 126 characters. Use these keys for editing: ^A - Go to far left. ^F - Go to far right. ^G or down arrow - delete character. ^- or ^left arrow - delete character on left. Use left and right arrow keys to move cursor. Only printable characters allowed. Push to exit without new edit. Push when finished.= :!G}oxg"* N#6#:G G   >Maximum characters desired is more than that allowed.:Sorry, this string has a nonprintable character.  >Sorry, this string is too long.* ~   >Sorry, this string exceeds its own maximum limit.* #p* ##" " "*""4 7 Ä 26 @*4 ~w|g~w* *Pd w#X > w#f *"4 ~w|g~ w:6  ʎ G        ڄ ҄ K >>*~ʄ #"*}O  #"7 Ä * #"  * *z! {! Ä +"*}= = +"7 Ä * +" 7 ** *~ʊ }O~ ~ ##~X "" "7 Ä #~ m Ä * DM*x£ y£ Ä ** *} ++x® y® "" "7 Ä +x y *~+ʄ ##~+w * #~=w7 Ä * *z { Ä *}ʄ ʄ +"*+"+##~+w5 * #~=w7 Ä O* ~#_ Ä ~This file was not made by MAKEST.   q This file was made by MAKEST before Version 1.5 ^It should be replaced.q!#~ʹ AcWhich drive do you want to write ͑ qê to? Select A,B,etc. or to return to main menu. _AڪQê2C2gͣʹC|•  Õ No directory space available. ʹ͑ *Ð already exists on drive A: Do you wish to overwrite this file with your new "command" file? (Y/N) YʤyʤC|ʹÕ   The file is Read/Only. Overwrite? (Y/N) Yy:L2LCä:O! 6#6$#CCEXECST COMEXECST COM1@1(.~w!,~#/:$Ver. 2.0$This EXECST.COM was created by MAKESTʹ What is the new file name to be? Enter up to an 8 character file name. !6##6/ʕ " :2 :!~OaK{K w#9> !Dw#V!D~m#b> !hw#t!h~ʋ#À>!w#’!~ʩ#Þctory space available. ʹ͑ *Ð already exists on drive A: Do you wish to overwrite this file with your new "command" file? (Y/N) YʤyʤC|ʹÕ   The file is Read/Only. Overwrite? (Y/N) Yy:L2LCä:O! 6#6$#CCEXECST COMEXECST COM1@1(.~w!,~#/:$MAKEST (MAKE execST) Version 2.0 For Osborne EXECUTIVE only. Copyright (C) Peter C. Cole March, 1985 Duncanville, TX All commercial rights reserved. Released for free distribution. Not to be sold. MAKES ca creat o edi a EXECS fil o th dis driv o you choice EXECS i th firs progra CP/ Plu look fo whe i firs boot u (col boot) I CP/ find EXECS the CP/ wil ru it MAKES take advantag o thi featur s tha th EXECS progra tha i creates wil sen you preloade comman lin t CP/ an the tell CP/ t execut tha comman line A furthe illustratio o ho EXECS work conside ho you WordSta dis autoload WordStar I i Osborne' EXECS tha autoload WordStar Al i doe i send th simpl comman o "WS (unfortunatel i als waste tim forcin yo t loo a th Osborn Logo) Pleas d no limi you us o MAKES t creatin EXECS file jus fo booting A wit an othe progra EXECS ca b ru  a an tim an ca b ru o an dis drive MAKES wil eve le yo us anothe fil nam besid EXECST i yo wish Thin o MAKES a creatin "Comman File an thi "Comman File whe run wil sen preloade comman lin t CP/ a i yo ha type i i afte th syste prompt Thi comman lin ca b a simpl o a complicate a yo wan (12 character max.) Yo ca eve hav on "Comman File ru anothe "Comman File" Jus remembe tha whe yo ru th secon "Comman File tha al remaining commands in the first "Command File" may be lost. 1. HOW TO RUN "MAKEST" 1.1 MAKES i ru b typin i it nam usin norma CP/ format 1.2MAKES doe no us comman tails Comman line ca onl b entere fro withi MAKEST. 1.3To exit from MAKEST push ^C or X from the Main Menu only. .pa 2.THE MAIN MENU OF "MAKEST" 2.1Whe MAKES i firs started fe word describin MAKES ar displaye o th screen Thes word ar remove an wil no reappea afte th firs use actio selectio i made. 2.2User action selections are: 1. Read a disk drive for an existing "Command File". 2. Create a new command line. 3. Change to a different file name. 4. Edit the "active command line". 5. Write the "active command line" to a disk drive. 6. Exit MAKEST. 2.3Th "activ comman lin" i displaye a th botto o th Mai Menu Ther i n "activ comman lin" whe MAKES i first started. 3.READING A DISK DRIVE FOR AN EXISTING "COMMAND FILE" 3.1Pus A B etc fro th Mai Men t rea th selecte dis driv fo a existin "Comman File" 3.2I "Comman File exist o th dis an i wa create b MAKES the it comman lin wil b displaye fo reference 3.3Th comman lin ca b edite i desired O, th comman lin ca b ignore an th use ca retur t th Mai Menu. 4.HOW TO CREATE A COMMAND LINE 4.1Pushin "1 fro th Mai Men wil allo yo t creat ne comman line 4.2Pushin A B etc fro th Mai Men wil rea i a command line from an existing "Command File". 4.3Pushin DI A:!DI B: (Command tails can be used if desired) Pleas note I fil nam o multipl comman i no foun b CP/ the CP/ wil continu o wit th res o th command an forge abou th missin fil name Thi coul b plu o pai s b careful 5.5MAKES no use 0 instea o "$ fo th "outpu delimiter (end flag of screen messages) Thi mean tha "$ ca b entere int th comman line. 5.6Th edite comman lin ca b save t becom th "activ comman line b pushin Th previou "activ comman line i replaced. 5.7Th edite comman lin ca b discarded i desired b pushin . 6. CHANGE TO A DIFFERENT FILE NAME 6.1 The default file name that MAKEST can create is EXECST. 6.2T chang t differen fil nam pus "2 fro th Mai Menu. 6.3Th fil typ o .CO i assume fo al fil name selected. .pa 7.WRITE THE ACTIVE COMMAND LINE TO DISK 7.1Pus "W t writ th "activ comman lin" t dis driv to be selected. 7.2I th comman lin ha n character the th "W optio canno b used Caution I th "activ comman lin" ha onl blank the i wil b writte t disk. 7.3I th "Comman File alread exist o th dis the MAKES wil questio i i i t b overwritten MAKES ca overwrit read/onl "Comman File i needed 8.SOME PROBLEMS 8.1 cosmeti nuisanc runnin "Comman File progra create b MAKES i tha i th las comman execute i fil nam tha CP/ canno find the pushin ^ (war boot wil caus CP/ t tr t fin th fil nam agai b tryin t reloa th director fro th dis eve i th dis ha no bee changed Normall CP/ know i th dis ha bee change o not Thi proble wil als occu i you las comman i t chang th defaul dis drive Thi proble i no shortcomin o MAKES bu seem t b fla o CP/ Plu BDO functio 4 (Chai t Pro gram) Don' le i sto yo fro usin MAKES a it' no tha seriou o problem Als th proble disappear afte runnin an program. 8.2"Comman Files create b MAKES Versio 1. o earlie hav fla i th "Comman File progra tha ca cause som strang happening t occu whe thes "Comman Files ar ru o dis othe tha th boo disk MAKES Version 1. an abov wil recogniz thes "Comman Files an tel yo t replac them Fo you convenienc th comman strin o thes "Comman Files ca b edited. 8.3Whe th o boar lin edito become ful wit 12 character the th "bell wil sound Yo ma notic tha whe th "bell sounds tha th fa lef characte o th scree wil flash Thi i becaus th BIO activate th CP/ curso whil th bel i goin of eve thoug th o boar edito turned it off so it could use it ow cursor Peter C. Cole  afte runnin an program. 8.2"Comman Files create b MAKES Versio 1. o earlie hav fla i th "Comman File progra tha ca cause som strang happening t occu whe thes "Comman Files ar ru o dis othe tha th boo disk MAKES Version 1. an abov wil recogniz thes "Comman Files an tel yo t replac them Fo you convenienc th comman strin o thes "Comman Files ca b edited. 8.3Whe th o boar lin edito become ful wit 12 character the th "bell wil sound Yo ma notic tha whe th "bell sounds tha th fa lef characte o th scree wil flash Thi i becaus th BIO activate th CP/ curso whil th bel i goin of eve thoug th o boar edito turned it off so it could use it ow cursor Peter CxVersion equ '2' yVersion equ '0' ;**** MAKEST Version x.y **** ; ;Copyright (c) Peter C. Cole March, 1985 Duncanville, TX ;All commercial rights reserved. ;Released for free distribution only. Not to be sold. ;**** Version Changes **** ; ;1.0 - Released March, 1985 ; ;1.1 - Added "user selectable drive" and ; "display existing EXECST.COM command line". ; ;1.2 - Added "exit MAKEST only on command". ; DO NOT USE THIS VERSION. ; ;1.3 - Corrected problem of not sending proper end flag for ; Bdos function 47. ; ;1.4 - Corrected problem that MAKEST sometimes recognizes a one sector ; EXECST that was not made by MAKEST. ; ;1.5 - Corrected the "chain flag" of Bdos Function 47 (Chain to ; Program). It was incorrectly set to 0FFh. Now set to 0h. ; Made "Program Data Assembly Area" more straightforward. ; ;2.0 - Added on board editor and file name change capability. ; PAGE ;**** Assembly Definations **** NL: equ 0A0Dh ;new line CPage: equ 5A1Bh ;clear page MsgEnd: equ 0 ;message end flag Bdos: equ 5 ;Bdos address Stack1: equ 4000h ;Location of MAKEST and FileName stack Temp: equ Stack1+2 ;Location to store temp string for editing Existing: equ 4800h ;Location to store existing FileName program org 100h ;**** Start Program **** ;Set stack lxi sp,Stack1 ;Set output delimiter mvi c,110 mvi d,0 mvi e,MsgEnd call Bdos ;Set Bdos error mode to "return and display error" mvi c,45 mvi e,0FEh call Bdos ;Set number of read/write sectors to 2 mvi c,44 mvi e,2 call Bdos ;Now continue with program jmp BeginMsg ;**** Exit Program **** Exit: jmp 0 PAGE ;**** Begin Message **** BeginMsg: mvi c,9 lxi d,BM2 call Bdos jmp BM10 BM2: dw CPage db '****************************** MAKEST Version ' db xVersion,'.',yVersion,' ******************************' db 'Copyright (c) 1985 by Peter C. Cole' dw NL db 'Duncanville, Texas.' dw NL db 'All commercial rights reserved.' dw NL db 'Released for free distribution only. Not to be sold.' dw NL db '****************************************' db '****************************************' dw NL db 'MAKEST will create or edit a "Command File" ' ;44 db 'on the disk drive of your choice.' ;33 dw NL db 'A "Command File" is a file that when run ' ;41 db 'will send a command string to CP/M as ' ;38 dw NL db 'if you had typed it in after the ' ;33 db 'system prompt. Normal use of MAKEST is to' ;41 dw NL db 'create an EXECST file which is the first ' ;41 db 'file CP/M Plus looks for when it first' ;38 dw NL db 'boots up. Use EXECST to ' ;24 db 'autoload a favorite program on boot up.' ;39 dw NL db 'MAKEST will only run on the Osborne ' ;36 db 'Executive. ' ;11 dw NL,NL db MsgEnd PAGE ;**** Main Menu **** Begin: call HomeIt BM10: mvi c,9 lxi d,BM11 call Bdos jmp BM12 BM11: db 'Please select:' dw NL db ' A,B,etc - Read this disk drive for an existing ' db MsgEnd BM12: call FileName mvi c,9 lxi d,BM1 3 call Bdos jmp BM14 BM13: db ' command line.' dw NL db ' ^C or X - Exit to CP/M.' dw NL db ' 1 - Create a new ' db MsgEnd BM14: call FileName mvi c,9 lxi d,BM15 call Bdos jmp BM16 BM15: db ' command line.' dw NL db ' 2 - Change to a different file name.' dw NL db ' - Edit the below command line (if any).' dw NL db ' W - Write the below command line (if any) to' db ' a "to be selected" disk drive:' dw NL,NL db MsgEnd BM16: mvi c,9 lxi d,String call Bdos mvi c,9 lxi d,BM20 call Bdos jmp Wait BM20: dw NL db MsgEnd PAGE ;**** Subroutine FileName **** ;Displays active file name FileName: mvi c,9 lxi d,FN1 call Bdos ret FN1: db 'EXECST',0,0 ;allow for max. of 8 characters db MsgEnd ;**** Subroutine Create **** ;Creates a fresh FCB Create: lxi h,FcbRun lxi d,FcbNew mvi b,FcbEnd-FcbNew Create1: ldax d mov m,a inx h inx d dcr b jnz Create1 ret ;**** Subroutine HomeIt **** ;Homes cursor to just under Header and clears to end of page. HomeIt: mvi c,9 lxi d,Clear call Bdos ret Clear: db 1Bh,3Dh ;move cursor db 27h,20h ;to just under header db 1Bh,59h ;clear from cursor to end db MsgEnd PAGE ;**** Wait for key **** Wait: mvi c,6 mvi e,0FDh call Bdos cpi 3 ;test if ^C jz Exit cpi 0Dh ; jz ReEdit cpi '1' jz New cpi '2' jz Diff ani 5Fh ;convert if small to cap. cpi 'X' ;test if X jz Exit cpi 'W' jz Write cpi 'A' ;is it less than 'A'? jc Wait ;jmp if yes (not A to P) cpi 'Q' ;is it less than 'Q'? jc ExistFile ;jmp if yes jmp Wait ;sorry, not A to P. ;**** Open Existing File **** ;Convert to drive code and store ExistFile: ani 1Fh sta FcbNew ;Create FcbRun call Create ;Clear screen call HomeIt PAGE ;Open Existing File mvi c,15 lxi d,FcbRun call Bdos ;Test if file opened ana a jz FileExists ;jmp if file opened with no problem mov a,h cpi 0 jnz BadWait ;File not found. Give message. mvi c,9 lxi d,NoFileMsg call Bdos jmp BadWait NoFileMsg: dw NL,NL db 'File not found.' dw NL db MsgEnd ;Test Existing file FileExists: call TestFile jnz BadWait ;Makest file - give message mvi c,9 lxi d,MSmsg1 call Bdos jmp MS2 MSmsg1: dw NL,NL db 'Do you want to edit this file? (Y/N) ' db MsgEnd PAGE ;Wait for Answer MS2: mvi c,6 mvi e,0FDh call Bdos cpi 'Y' jz ExistEdit cpi 'y' jz ExistEdit jmp Begin ;Edit existing command string ExistEdit: call HomeIt lxi h,Existing+Buffer-Data mvi m,126 ;only allow max of 126 char xchg call LineEdit cpi 0 jz LoadBuffer cpi 1 jz Begin cpi 2 jz BadWait jmp Begin ;Load from Makest file to "Buffer" LoadBuffer: lxi h,Buffer lxi d,Existing+Buffer-Data LB0: ldax d ;load max char mov m,a inx h inx d ldax d ;load char returned mov m,a inx h inx d LB1: ldax d ;load data mov m,a inx h inx d ana a ;is it end flag? jnz LB1 ;jmp if no jmp Begin PAGE ;**** Routine New **** ;Create a string with no data New: lxi h,Temp mvi m,126 inx h mvi m,0 inx h mvi m,0 ;Edit command string jmp ReEdit2 ;**** Routine ReEdit **** ;Move Buffer to new location ReEdit: lxi h,Temp lxi d,Buffer ldax d ;Load max char mov m,a inx h inx d ldax d ;load char returned mov m,a inx h inx d ReEdit1: ldax d mov m,a inx h inx d ana a jnz ReEdit1 ;Edit command string ReEdit2: call HomeIt lxi h,Temp mvi m,126 xchg call LineEdit cpi 0 jz ReEdit5 cpi 1 jz Begin cpi 2 jz BadWait jmp Begin ;Load new command line to Buffer ReEdit5: lxi h,Buffer lxi d,Temp jmp LB0 PAGE ;**** Subroutine LineEdit **** ; ;DE = Start address of string to edit (set by user) ; 1st byte = maximum number of characters (set by user) ; Does not include end flag of 0. ; 2nd byte = total number of characters returned (set by LineEdit) ; Does not include end flag of 0. ; 3rd byte = zero if string has no data (set by user) ; 3rd byte = not zero if string has data (string must end with 0) ; ;Preload "WhichRow" with the row number to be used for the displayed line. ; 00h = 1st row (Top row of screen) ; 01h = 2nd row ; etc ; 17h = 24th row (Bottom row of screen) ; ;CP/M cursor is moved to far left so LineEdit can remove it. ;LineEdit Cursor will start at far left. ;Cursor will be inverse, blinking, full intensity. ;Non-cursor characters will be black background, full intensity. ; ;Nonprintable characters will not be allowed in string. ; ;MsgEnd must be 0h. ; ;Returns with accumulator set to: ; 0 - good edit. (2nd byte equals 0 to maximum characters in string) ; 1 - edit not wanted (ESC pushed) ; 2 - problem opening line (one line message given) ; ;"String" is location of data . ;"Line" is location of video ram. ; LineMax: db 126 ;maximum number of characters allowed (max = 255) ;1st byte can be equal to or less than LineMax WhichRow: db 17h ;row that line editor will use StringStart: ds 2 ;start addre ss of string to edit StringBegin: ds 2 ;First char of string String1st: ds 2 ;Address of char in string that is 1st char in line StringCursor: ds 2 ;cursor location in string LineBegin: ds 2 ;start address of line LineCursor: ds 2 ;cursor location in line PAGE ;Store start address of string LineEdit: xchg shld StringStart ;Make CP/M cursor start location same as LineEdit location lda WhichRow ani 24 sta CursorY ;Send Edit header mvi c,9 lxi d,EditMsg call Bdos jmp Edit3 EditMsg: db 'You can use ! to chain several commands if needed. ' db 'Example: DIR A:!DIR B:' dw NL db 'Enter up to 126 characters. ' Edit1: dw NL,NL db 'Use these keys for editing:' dw NL,NL db ' ^A - Go to far left.' dw NL db ' ^F - Go to far right.' dw NL db ' ^G or down arrow - delete character.' dw NL db ' ^- or ^left arrow - delete character on left.' dw NL db ' Use left and right arrow keys to move cursor.' dw NL db ' Only printable characters allowed.' dw NL db ' Push to exit without new edit.' dw NL db ' Push when finished.' db 1Bh,3Dh ;position cursor CursorY db 0+32 CursorX db 0+32 db MsgEnd ;Create video bank start address Edit3: ora a ;clear carry lda WhichRow ;get row number lxi h,0C000h ;preload hl for video bank address rar ;get LSB of WhichRow for MSB of reg l mov b,a ;store LSB's for reg h mov a,l ;move LSB of WhichRow into MSB of reg l rar mov l,a mov a,b ;get LSB's for reg h ora h ;move MSB's of WhichRow into LSB's of reg h mov h,a ; shld LineBegin ;store line start address PAGE ;Test if max desired ok Edit5: lhld StringStart mov c,m ;load max char's inx h mvi m,0 ;set to 0 char returned for now inx h lda LineMax ;load max allowed cmp c ;test if equal to or less than jz Edit8 ;ok (equal) jnc Edit8 ;ok (less than) ;Max desired not ok - send message mvi c,9 lxi d,Edit6 call Bdos mvi a,2 ret Edit6: db 'Maximum characters desired is more than that allowed.' db MsgEnd ;Test if any nonprintable char found Edit8: mvi b,0 ;to keep track of number of char lda LineMax ;to test if max exceeded inr a ;account for end flag mov c,a Edit9: mov a,m ana a jz Edit20 ;jmp if end flag of 0 found cpi ' ' jc Edit11 ;jmp if control char cpi 7Fh jnc Edit11 ;jmp if equal to or greater than 7Fh inr b dcr c jz Edit16 ;jmp if max exceeded inx h jmp Edit9 ;nonprintable char found Edit11: mvi c,9 lxi d,Edit12 call Bdos mvi a,2 ret Edit12: db 'Sorry, this string has a nonprintable character.' db MsgEnd PAGE ;number of char's exceed limit Edit16: mvi c,9 lxi d,Edit17 call Bdos mvi a,2 ret Edit17: db 'Sorry, this string is too long.' db MsgEnd ;does string given exceed its own limit? Edit20: lhld StringStart mov a,m cmp b jnc Edit25 ;jmp if ok ;string given exceeds its own limit mvi c,9 lxi d,Edit22 call Bdos mvi a,2 ret Edit22: db 'Sorry, this string exceeds its own maximum limit.' db MsgEnd ;Load number of char's found Edit25: lhld StringStart inx h mov m,b ;display line lhld StringStart ;preload start address of string inx h inx h shld StringBegin shld String1st shld StringCursor lhld LineBegin ;preload start address of line shld LineCursor shld OldCursor call Display jmp Edit PAGE ;** Subroutine Display ** OldCursor: ds 2 Bank: ds 1 ;Turn on Video Bank Display: in 0 sta Bank ori 40h out 0 ;Turn off old cursor lhld OldCursor mov a,m ani 01111111b ;turn off reverse video mov m,a mov a,h ;go to DXXX address adi 10h mov h,a mov a,m ani 11011111b ;turn off blink mov m,a ;Load new line data until end flag lhld String1st xchg lhld LineBegin mvi b,80 Display1: ldax d ana a ;test if 0 end flag jz Display2 ;jmp if yes mov m,a inx h inx d dcr b jnz Display1 ;Finish with blanks Display2: mvi a,' ' Display3: mov m,a inx h dcr b jnz Display3 PAGE ;Turn on new cursor and store location as OldCursor lhld LineCursor shld OldCursor mov a,m ori 10000000b ;turn on inverse video mov m,a mov a,h ;go to DXXX address adi 10h mov h,a mov a,m ori 00100000b ;turn on blink mov m,a ;Turn off Video Bank lda Bank out 0 ret PAGE ;Wait for edit key Edit: mvi c,6 mvi e,0FDh call Bdos cpi 1Bh ;ESC jz ExitEdit cpi 01h ;^A (CP/M to left edge) jz LeftEdge cpi 06h ;^F (CP/M to right edge) jz RightEdge cpi 07h ;^G (CP/M and WS delete character) jz DeleteChar cpi 0Ah ;^J (CP/M Arrow down) jz DeleteChar cpi 18h ;^X (WS Arrow down) jz DeleteChar cpi 1Fh ;^_ (WS delete character on left - also ^ arrow left) jz DeleteLeft cpi 7Fh ;DEL jz DeleteLeft cpi 04h ;^D (WS arrow right) jz Right cpi 0Ch ;^L (CP/M arrow right) jz Right cpi 13h ;^S (WS arrow left) jz Left cpi 08h ;^H (CP/M arrow left) jz Left cpi 0Dh ;^M (Carriage Return) jz DoneEdit cpi ' ' jc Edit ;jmp if control char cpi 80h jnc Edit ;jmp if equal to or greater than 80h jmp EnterChar ;Return from Edit with flag of abandon edit ExitEdit: mvi a,1 ret ;Return from Edit with flag of good new edit DoneEdit: mvi a,0 ret PAGE ;**** Routine Right **** ;move cursor right ;can String move right? Right: lhld StringCursor mov a,m ana a jz Edit ;jmp if no ;move String right inx h shld StringCursor ;can Line move right? lhld LineCursor mov a,l cpi 4Fh jz RightMove ;jmp if no cpi 0CFh jz RightMove ;jmp if no ;move Line right inx h shld LineCursor ;display new line RightOut: call Display jmp Edit ;move String right RightMove: lhld String1st inx h shld String1st jmp RightOut PAGE ;**** Routine Left **** ;moves cursor left ;Can String move left? Left: lhld StringBegin xchg lhld StringCursor mov a,d cmp h jnz Left1 ;jmp if yes mov a,e cmp l jnz Left1 ;jmp if yes jmp Edit ;jmp if no ;Move String left Left1 dcx h shld StringCursor ;Can Line move left? lhld LineCursor mov a,l cpi 0h jz LeftMove ;jmp if no cpi 80h jz LeftMove ;jmp if no ;move Line left dcx h shld LineCursor ;display new line LeftOut: call Display jmp Edit ;move String left LeftMove: lhld String1st dcx h shld String1st jmp LeftOut PAGE ;**** Routine RightEdge **** ;Moves cursor to far right edge ;Can String move right? RightEdge: lhld LineCursor ;for top push h lhld String1st ;for de xchg lhld StringCursor ;for hl mov a,m cpi 0h jz REout ;jmp if no ;Move StringCursor and LineCursor right ;Can LineCursor move right RE1: xthl mov a,l cpi 4Fh jz RE5 ;jmp if no cpi 0CFh jz RE5 ;jmp if no ;move LineCursor right inx h RE2: xthl ;move StringCursor right inx h ;can String move right mov a,m cpi 0h jnz RE1 ;jmp if yes ;load new values RE3: shld StringCursor xchg shld String1st pop h shld LineCursor ;display new line call Display jmp Edit PAGE ;Move StringCursor and String1st right ;Return LineCursor RE5: xthl  ;move StringCursor and String1st right RE6: inx h inx d ;can String move right mov a,m cpi 0h jnz RE6 ;jmp if yes jmp RE3 REout: pop h jmp Edit PAGE ;**** Routine LeftEdge **** ;Moves cursor to far left edge ;Can String move left? LeftEdge: lhld StringBegin ;for bc mov b,h mov c,l lhld StringCursor mov a,b cmp h jnz LE0 ;jmp if yes mov a,c cmp l jnz LE0 ;jmp if yes jmp Edit ;jmp if no LE0: lhld LineCursor ;for top push h lhld String1st ;for de xchg lhld StringCursor ;for hl ;Move StringCursor and LineCursor left ;Can LineCursor move left LE1: xthl mov a,l cpi 0h jz LE5 ;jmp if no cpi 80h jz LE5 ;jmp if no ;move LineCursor left dcx h LE2: xthl ;move StringCursor left dcx h ;can String move left mov a,b cmp h jnz LE1 ;jmp if yes mov a,c cmp l jnz LE1 ;jmp if yes PAGE ;load new values LE3: shld StringCursor xchg shld String1st pop h shld LineCursor ;display new line call Display jmp Edit  ;Move StringCursor and String1st left ;Return LineCursor LE5: xthl ;move StringCursor and String1st left LE6: dcx h dcx d ;can String move left mov a,b cmp h jnz LE6 ;jmp if yes mov a,c cmp l jnz LE6 ;jmp if yes jmp LE3 ;jmp if no PAGE ;**** Routine DeleteChar **** ;Deletes character cursor is on ;Is StringCursor at end? DeleteChar: lhld StringCursor mov a,m dcx h ana a jz Edit ;jmp if yes ;Delete data at cursor DelChar1: inx h inx h mov a,m dcx h mov m,a ana a ;is it last char jnz DelChar1 ;jmp if no ;Decrement char count lhld StringStart inx h mov a,m dcr a mov m,a ;Display new line call Display jmp Edit PAGE ;**** Routine DeleteLeft **** ;Delete character on left of cursor ;Is StringCursor at end? DeleteLeft: lhld StringBegin xchg lhld StringCursor mov a,d cmp h jnz DelLeft1 ;jmp if no mov a,e cmp l jnz DelLeft1 ;jmp if no jmp Edit ;jmp if yes ;Is LineCursor at end? DelLeft1: lhld LineCursor mov a,l cpi 0h jz Edit ;jmp if yes cpi 80h jz Edit ;jmp if yes ;Decrement LineCursor position dcx h shld LineCursor ;Decrement StringCursor position lhld StringCursor dcx h shld StringCursor ;Delete data at left of cursor dcx h DelLeft2: inx h inx h mov a,m dcx h mov m,a ana a ;is it last char jnz DelLeft2 ;jmp if no ;Decrement char count lhld StringStart inx h mov a,m dcr a mov m,a ;Display new line call Display jmp Edit PAGE ;**** Routine EnterChar **** ;Enter character at cursor position. ;Cursor and all to right moves right. ;Store character EnterChar: mov c,a ;char stored in c ;Is String full? lhld StringStart mov a,m inx h cmp m jnz Char1 ;jmp if no ;Send bell mvi c,2 mvi e,7h call Bdos jmp Edit ;Increment String count Char1: mov a,m inr a mov m,a ;Increment StringCursor lhld StringCursor inx h shld StringCursor dcx h ;Move in new data Char2: mov a,m ;get data for next mov m,c ;write data mov c,a ;set up for next inx h ana a ;is it last jnz Char2 ;jmp if no mov m,c ;write end flag PAGE ;Can LineCursor move right? lhld LineCursor mov a,l cpi 4Fh jz Char5 ;jmp if no cpi 0CFh jz Char5 ;jmp if no ;move LineCursor right inx h shld LineCursor ;Display line Char4: call Display jmp Edit ;Increment String1st Char5: lhld String1st inx h shld String1st jmp Char4 ;**** Routine BadWait **** ;Will wait for any key (sends message) and then jmp to Begin BadWait: mvi c,9 ;send message lxi d,BadOpen1 call Bdos mvi e,0FDh ;wait for key mvi c,6 call Bdos jmp Begin BadOpen1: dw NL,NL db 'Push any key to continue.' dw NL db MsgEnd PAGE ;**** Subroutine TestFile **** ;Test existing file found on disk ;If MAKEST file then return with Zero Flag set ;Send message TestFile: call FileName mvi c,9 lxi d,FEmsg call Bdos jmp FEmsgOut FEmsg: db ' exists on the selected drive.' db MsgEnd FEmsgOut: db 0 ;Clear area for existing FileName lxi h,Existing lxi b,200h ;more than enough ClearArea: mvi m,0 inx h dcx b mov a,b ora c jnz ClearArea ;Load existing file mvi c,26 ;set DMA address lxi d,Existing call Bdos mvi c,15 ;open existing file lxi d,FcbRun call Bdos mvi c,20 ;read sequential lxi d,FcbRun call Bdos PAGE ;Test if embedded "MAKEST end message" is present lxi h,Existing+0FFh-(+EndS9-EndS8) ;first load "MsgEnd" to ;byte before embedded message mvi m,MsgEnd inx h ;now set HL to first byte of embedded message lxi d,EndS8 mvi b,EndS9-EndS8 Test: ldax d cmp m jnz NotFile ;jmp if embedded message not MAKEST's inx h !inx d dcr b jnz Test ;This is a MAKEST file - Test if before Version 1.5 lxi h,Existing+EndS7-Data ;Get 'V' mov a,m cpi 'V' jnz B15V ;jmp if before Version 1.5 ;This is a MAKEST file of Version 1.5 or after - Send message mvi c,9 lxi d,MFmsg1 call Bdos jmp MF2 MFmsg1: dw NL db 'This file was created by MAKEST ' db MsgEnd MF2: mvi c,9 ;Send Version number lxi d,Existing+EndS7-Data call Bdos MF3: mvi c,9 lxi d,MFmsg3 call Bdos jmp MF4 MFmsg3: dw NL db 'It',39,'s command line is:' dw NL db MsgEnd MF4: mvi c,9 ;Send String message lxi d,Existing+String-Data call Bdos xra a ;set zero flag ret PAGE ;Not a MAKEST file - Send message NotFile: mvi c,9 lxi d,NMmsg call Bdos mvi a,1 ;clear zero flag ana a ret NMmsg: db 'This file was not made by MAKEST. ' dw NL db MsgEnd ;File created before MAKEST Version 1.5 - Send message B15V: mvi c,9 lxi d,B15Vmsg1 call Bdos jmp MF3 B15Vmsg1: dw NL db 'This file was made by MAKEST before Version 1.5 ' db 27,94,'It should be replaced.',27,113 db MsgEnd PAGE ;**** Write File to Disk **** ;Is there data? Write: lxi h,Buffer inx h mov a,m ana a jz Wait ;jmp if none ;Ask which drive to select call HomeIt mvi c,9 lxi d,Write2 call Bdos jmp Write3 Write2: db 'Which drive do you want to write ' db MsgEnd Write3: call FileName mvi c,9 lxi d,Write5 call Bdos jmp Write6 Write5: db ' to?' dw NL db 'Select A,B,etc. or to return to main menu.' dw NL db MsgEnd ;Wait for key Write6: mvi c,6 mvi e,0FDh call Bdos cpi 1Bh ;ESC jz Begin ani 5Fh ;convert from small to cap. cpi 'A' ;is it less than 'A'? jc Write6 ;jmp if yes cpi 'Q' ;is it less than 'Q' jc Write10 ;jmp if yes jmp Write6 ;sorry, not A to P ;Convert to drive code and store Write10: sta Write17 ;store drive letter ani 1Fh sta FcbNew ;Create FcbRun call Create PAGE ;Clear screen Write11: call HomeIt ;Open New File mvi c,22 lxi d,FcbRun call Bdos ;Test if file opened ana a jz Write40 ;jmp if file opened with no problem mov a,h cpi 8h jz Write15 cpi 0 jnz BadWait ;No directory space available mvi c,9 lxi d,Write12 call Bdos jmp BadWait Write12: dw NL,NL db 'No directory space available.' dw NL db MsgEnd ;Ask if file to be overwritten? Write15: call HomeIt call FileName mvi c,9 lxi d,Write16 call Bdos jmp Write20 Write16: db ' already exists on drive ' Write17: db 'A: ' dw NL db 'Do you wish to overwrite this file with your new ' db '"command" file? (Y/N) ' db MsgEnd PAGE ;Wait for Erase Answer Write20: mvi c,6 mvi e,0FDh call Bdos cpi 'Y' jz Write22 cpi 'y' jz Write22 jmp Begin ;Erase file Write22: mvi c,19 lxi d,FcbRun call Bdos ana a ;test if erased jz Write11 ;jmp if erased mov a,h ;test if R/O cpi 3 jz Write30 ;jmp if R/O jmp BadWait ;Ask About Read/Only Write30: mvi c,9 lxi d,Write31 call Bdos jmp Write32 Write31: dw NL,NL db 'The file is Read/Only. Overwrite? (Y/N) ' db MsgEnd ;Wait for answer Write32: mvi c,6 mvi e,0FDh call Bdos cpi 'Y' jz Write35 cpi 'y' jz Write35 jmp Begin ;Erase Read/Only Write35:lda FcbRun+9 ;set FCB to R/W ani 7Fh sta FcbRun+9 mvi c,30 ;now set file on disk to R/W lxi d,FcbRun call Bdos jmp Write22 PAGE ;**** Load End Flags into Data **** ;Get next address after String Write40: mvi b,0 ;load number of char to bc lda Buffer+1 mov c,a lxi h,String ;load string start adr dad b ;offset ;add end flag of 0h mvi m,0 inx h ;add message end flag of $ mvi m,'$' inx h ;**** Write Data to Disk **** mvi c,26 ;set DMA address lxi d,Data call Bdos mvi c,21 ;write data lxi d,FcbRun call Bdos mvi c,16 ;close file lxi d,FcbRun call Bdos jmp Begin **** FCB "to be run" location *** FcbRun: ds 1 db 'EXECST COM' db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 **** FCB "to be read" location **** FcbNew: ds 1 db 'EXECST COM' db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 FcbEnd: ds 1 PAGE **** Program Data Assembly Area **** ;Set Stack Data: lxi sp,Stack1 ;0100h ;Get/Set System Control Block ;Without the following routine the system prompt may display on the ;same line last written to. This routine is the same format as found ;in the Osborne EXECST.COM. What it exactly does is unknown by this ;programmer. DR says that an offset of 3Ah is "Reserved for System Use". mvi c,49 ;get/set System Control Block ;0103h lxi d,SCB-Data+100h ;location of SCB Parameter Block call Bdos mvi l,0B5h mov a,m ori 2 mov m,a ;Move String to Default DMA lxi h,String-Data+100h ;address of String when ;0111h ; Data moved to 100h lxi d,80h ;Default DMA start address Data3: mvi b,128 ;maximum character count of string Data4: mov a,m ;get String stax d ;store String inx h ;go to next char inx d ;go to next char dcr b ;test if last char jnz Data4-Data+100h ;address of Data4 when Data moved to 100h ;Chain String to Program mvi c,47 ;chain to program ;0121h mvi e,0h ;use default CCP values of drive and user number jmp Bdos ;SCB Parameter Block SCB: db 3Ah ;offset of SCB ;0128 db 0 ;"get" operation ;Development Area for String Buffer: ds 2 ;2 bytes for number of characters in string ;012Ah String: db 0 ;Start of string of characters to be chained. ;012Ch db '$' ;At first command must be 0h then '$'. ds 124 ;A total of 126 characters. ds 2 ;String must end with 0h then '$'. ;Unused space ds 36 ;01CAh ;Version number EndS7: db 'Ver. ',xVersion,'.',yVersion,0,'$',0 ;01D0h ;Recognition message EndS8: db 'This EXECST.COM was created by MAKEST' ;01DBh EndS9: db 0 ;0200h PAGE ;**** Routine Diff **** ;Change to a different file name ;Send message Diff: call HomeIt mvi c,9 lxi d,Diff1 call Bdos jmp Diff2 Diff1: db 'What is the new file name to be?' dw NL db 'Enter up to an 8 character file name.' dw NL db MsgEnd ;Setup NewName Diff2: lxi h,NewName mvi m,8 ;8 characters max inx h inx h mvi m,0 ;no data to start jmp Diff4 NewName: ds 15 ;Get file name Diff4: lxi d,NewName call NameEdit cpi 0 jz Diff10 cpi 1 jz Begin cpi 2 jz BadWait jmp Begin ;Setup similar to LineEdit NameEdit: xchg shld StringStart lda WhichRow ani 24 sta CursorY mvi c,9 lxi d,Edit1 call Bdos jmp Edit3 PAGE ;Test if no data Diff10: lda NewName+1 ana a jz Begin ;Forget it if no data ;Convert small letters to caps lxi h,NewName+2 Diff11: mov a,m ana a jz Diff13 cpi 'a' jc Diff12 ;jmp if less than 'a' cpi 'z'+1 jnc Diff12 ;jmp if greater than 'z' sui 20h ;convert mov m,a Diff12: inx h jmp Diff11 ;Fill FcbRun file name with blanks Diff13: mvi b,8 mvi a,' ' lxi h,FcbRun+1 Diff15: mov m,a inx h dcr b jnz Diff15 ;Move new file name to FcbRun lxi h,NewName+2 lxi d,FcbRun+1 Diff17: mov a,m ana a jz Diff20 stax d inx h inx d jmp Diff17 PAGE ;Fill FcbNew file name with blanks Diff20: mvi b,8 mvi a,' ' lxi h,FcbNew+1 Diff21: mov m,a inx h dcr b jnz Diff21 ;Move new file name to FcbNew lxi h,NewName+2 lxi d,FcbNew+1 Diff23: mov a,m ana a jz Diff25 stax d inx h inx d jmp Diff23 ;Fill FN1 file name with 0's Diff25: mvi b,8 mvi a,0 lxi h,FN1 Diff27: mov m,a inx h dcr b jnz Diff27 ;Move new file name to FN1 lxi h,NewName+2 lxi d,FN1 Diff30: mov a,m ana a jz Diff33 stax d inx h inx d jmp Diff30 ;That's it. Lets go home. Diff33: jmp Begin end 100h mp if greater than 'z' sui 20h ;convert mov m,a Diff12: inx h jmp Diff11 ;Fill FcbRun file name with blanks Diff13: mvi b,8 mvi a,' ' lxi h,FcbRun+1 Diff15: mov m,a inx h dcr b jnz Diff15 ;Move new file name to FcbRun lxi h,NewName+2 lxi d,FcbRun+1 Diff17: mov a,m ana a jz Diff20 stax d inx h inx d jmp Diff17 PAGE ;Fill FcbNew file name with blanks Diff20: mvi b,8 mvi a,' ' lxi h,FcbNew+1 Diff21: mov m,a inx h dcr b jnz Diff21 ;Move new file name to FcbNew lxi h,NewName+2 lxi d,FcbNew+1 Diff23: mov a,m ana a jz Diff25 stax d inx h inx d jmp Diff23 ;Fill1@n-,&Z****************************** MKWAIT Version 2.0 ******************************Copyright (c) 1985 by Peter C. Cole Duncanville, Texas. All commercial rights reserved. Released for free distribution only. Not to be sold. ******************************************************************************** MKWAIT will create or edit a "Wait File" on the disk drive of your choice. MKWAIT will only run on the Osborne Executive.  R/Please select: A,B,etc - Read this disk drive for an existing 1;| file. X - Exit to CP/M. Also can use ^C 1 - Create a new 1 message. 2 - Change to a different file name. 3 - Create or Change "Check Line Above". It is now :ʄÙ!6"activated". It will look ~'Gx\0251:5_f0_o lines up for: Ù"disabled".ø W - Create a new 1 file on a "to be selected" disk drive. - Edit the below message (if any). .y 8WAIT!Ei$w#IY=' Y! 6# yf!"f ʵ 1v 2ʏ3ʲ_XWE AyQyR"Check Line Above" is now :6 Please push: - Return to Main Menu with conditions as shown above. D - Disable "Check Line Above" and return to Main Menu. E - Edit "Check Line Above" message. S - Set number of lines to look up. DdEʯeʯSs>2RàPlease select the number of lines to look up. For Example: ---------- XXXX A>WAIT ---------- XXXX is 2 lines up. Select 0 to 9. 2ò!@w#w#w#½R!@6ͣ'ʲʄ òEnter up to 31 characters for the "Enter Line Above" message.p!@e ò?ù"disabled". Please push: - Return to Main Menu without any changes. A - Activate "Check Line Above". Aaù>2ò2iARE |„  Ä  File not found. „ % N Do you want to use this file? (Y/N) Y: y: R !~I6ͣ: ʄ Enter up to 255 characters. Messages will automatically go to the next line after every 80 characters. Therefore, you may want to use spaces to finish a line in the right place.p!Jw#E !Je `! ~Ie w#w#w#m !@6#6#6   Push to continue. !@ w#w#w# R !@6ͣ ʄ `! @e 1 + exists on the selected drive. !H6# x2 HEE!Kk# #[ o Ò This file was created by MKWAIT K  "Check Line Above" is now :J !JJ  The file's message line is: I >This file was not made by MKWAIT. RQ s Which drive do you want to write 1 ø to? Select A,B,etc. or to return to main menu. _Aڸ Q ø 2M 2iARE|% „  Ä No directory space available. R14 × already exists on drive A: Do you wish to overwrite this file with your new "wait" file? (Y/N) Yʫ yʫ E | Ä   The file is Read/Only. Overwrite? (Y/N) Y y :N2NEë : O! 6#EEWAIT COMWAIT COM1@n 5: $8 ^READ NOTE:q   KÑ Push to continue or to terminate command string. ʠ<< ñ1g.612@*S:G}.%. #::Ver. 2.0This WAIT.COM was created by MKWAITRWhat is the new file name to be? Enter up to an 8 character file name. !6##6ͣʄ :!~8a4{4 w#"> !Fw#?!F~V#K> !jw#]!j~t#i>!8w#{!8~ʒ#Ç":2 Use these keys for editing: ^A - Go to far left. ^F - Go to far right. ^G or down arrow - delete character. ^- or ^left arrow - delete character on left. Use left and right arrow keys to move cursor. Only printable characters allowed. Push to exit without new edit. Push when finished.= :!G}oxg"*N#6#:jj4>Maximum characters desired is more than that allowed.:Sorry, this string has a nonprintable character.>Sorry, this string is too long.*~/>Sorry, this string exceeds its own maximum limit.*#p*##"""*""QTá2S@*Q~w|g~w**Pʁw#u> w#ƒ*"Q~w|g~ w:Sʫd $$ **  ڡҡh>>*~ʡ#"*}O  #"Tá*#"**z>{>á+"*}ZZ+"Tá*+"T***~ʧ}Oʛʛ##~u"""Tá#~œÊá*DM*xyá***}++xy"""Tá+xy*~+ʡ##~+w*#~=wTá**z8{8á*}ʡʡ+"*+"+##~+wR*#~=wTáO*~#|á~WAIT (This is the CP/M "Wait File" command line) XXX i line u fro th comman line Yo ca selec fro t lines Yo ca selec u t 1 line u i yo kno thi littl trick Th fou leas significan bit o th ASCI cod ar use t ente th number Fo exampl pus J,K,L,M, an fo 10,11,12,13,14 an 15. 5.5Yo ca loo fo u t 3 characters Remembe tha th firs characte i alway i th fa lef colum o th screen I ther ar blank ther the the mus b par o the message line to be looked for. 6.ON BOARD LINE EDITOR 6.1Th o boar lin edito i use t edi th "activ message" and the "Check Line Above" message. 6.2Th o boar lin edito wil allo mos CP/ an WordSta editin commands men o editin command i provide o the screen. 6.3MKWAI use 0 instea o "$ fo th "outpu delimiter (en fla o scree messages) Thi mean tha "$ ca b entere int th message. 6.4Th edite messag ca b save and replace the "active" message b pushin 6.5Th edite messag ca b discarded i desired b pushin . 6.6Th onboar edito wil no allo nonprintabl character to b entere int th message. .pa 7. CHANGE TO A DIFFERENT FILE NAME 7.1 The default file name that MKWAIT can create is WAIT. 7.2T chang t differen fil nam pus "2 fro th Mai Menu. 7.3 maximu o character wil b allowed Lowe cas wil b converte t uppe case Follo CP/ Plu rule fo creatin fil names Som character suc a an canno b use i th characte fil name MKWAI will allo yo t ente thes character bu the wil caus yo problem late whe th fil i actuall create o disk. 7.4Th fil typ o .CO i assume fo al fil name selected. 8.WRITE THE ACTIVE MESSAGE TO DISK 8.1Pus "W t writ th "activ message" t dis driv to be selected. 8.2MKWAIT will allow a message of no characters if desired. 8.3I th "Wai File alread exist o th dis the MKWAI wil questio i i i t b overwritten MKWAI ca overwrit read/onl "Wai File i needed .pa 9.ADDITIONAL NOTES 9.1 T creat CP/ "comman strings wit "Wai Files"i them the us somethin lik MAKES b your truely o setu specia functio key o jus typ i comman strin afte th syste prompt "Wai Files ca als b use i SUBMI file i desired Pushin th . ; Added flashing "READ NOTE:". ; Added feature to terminate SUBMIT files. ; Changed method on how CP/M command lines terminated. ; ;2.0 - Added feature to "Check Line Above". (8-10-85) ; PAGE ;**** Assembly Definations **** NL: equ 0A0Dh ;new line CPage: equ 5A1Bh ;clear page MsgEnd: equ 0 ;message end flag Bdos: equ 5 ;Bdos address Stack1: equ 4000h ;Location of MKWAIT and FileName stack Temp: equ Stack1+2 ;Location to store temp string for editing Existing: equ 4800h ;Location to store existing FileName program MaxChar: equ 255 ;Maximum number of characters allowed in message ;Also change number in message string EE2. Exit: equ 0 ;Where to jmp to return to CP/M CurPos: equ 0FD53h ;Adr to find present position of cursor in Video Bank org 100h ;**** Start Program **** Start: jmp Start1 ;Set stack Start1: lxi sp,Stack1 ;Set output delimiter mvi c,110 mvi d,0 mvi e,MsgEnd call Bdos ;Set Bdos error mode to "return and display error" mvi c,45 mvi e,0FEh call Bdos ;Set number of read/write sectors to 8 (1k) mvi c,44 mvi e,8 call Bdos PAGE ;**** Begin Message **** BeginMsg: lxi d,BM2 call Type jmp BM10 BM2: dw CPage db '****************************** MKWAIT Version ' db xVersion,'.',yVersion,' ******************************' db 'Copyright (c) 1985 by Peter C. Cole' dw NL db 'Duncanville, Texas.' dw NL db 'All commercial rights reserved.' dw NL db 'Released for free distribution only. Not to be sold.' dw NL db '****************************************' db '****************************************' dw NL db 'MKWAIT will create or edit a "Wait File" ' ;41 db 'on the disk drive of your choice.' ;33 dw NL db 'MKWAIT will only run on the Osborne ' ;36 db 'Executive. ' ;11 dw NL,NL db MsgEnd ;**** Subroutine Type **** ;DE must already be loaded Type: mvi c,9 call Bdos ret PAGE ;**** Main Menu **** Begin: call HomeIt BM10: lxi d,BM11 call Type jmp BM12 BM11: db 'Please select:' dw NL db ' A,B,etc - Read this disk drive for an existing ' db MsgEnd BM12: call FileName lxi d,BM13 call Type jmp BM14 BM13: db ' file.' dw NL db ' X - Exit to CP/M. Also can use ^C' dw NL db ' 1 - Create a new ' db MsgEnd BM14: call FileName lxi d,BM15 call Type jmp BM17 BM15: db ' message.' dw NL db ' 2 - Change to a different file name.' dw NL db ' 3 - Create or Change "Check Line Above". ' db 'It is now ' db MsgEnd BM17: lda SkipFlag ana a jz BM30 ;jmp if disabled call BM18 jmp BM40 BM18: lxi h,LinesUp lxi d,LineData jmp BM20 PAGE ;**** Subroutine BM20 **** ;HL=where to find LinesUp ;DE=where to find LineData BM20: push d push h lxi d,BM21 call Type jmp BM23 BM21: db '"activated".' dw NL db ' It will look ' db MsgEnd BM22: ds 1 ;to hold units digit below BM23: pop h ;Displays number of lines up mov a,m adi 0 ;daa doesn't seem to work on its own daa mov b,a ani 0F0h mov a,b jz BM24 ani 0Fh ;show two digits ori 30h sta BM22 mvi e,'1' mvi c,2 call Bdos lda BM22 mov e,a mvi c,2 call Bdos jmp BM25 BM24: ani 0Fh ;shows one digit ori 30h mov e,a mvi c,2 call Bdos BM25: lxi d,BM26 call Type jmp BM27 BM26: db ' lines up for: ' db MsgEnd BM27: pop d ;LineData call Type ret PAGE BM30: lxi d,BM31 call Type jmp BM40 BM31: db '"disabled".' db MsgEnd BM40: lxi d,BM41 call Type jmp BM42 BM41: dw NL db ' W - Create a new ' db MsgEnd BM42: call FileName lxi d,BM43 call Type jmp BM44 BM43: db ' file on a "to be selected" disk drive.' dw NL db ' - Edit the below message (if any).' dw NL,NL db MsgEnd BM44: lxi d,String call Type lxi d,BM45 call Type jmp Wait BM45: dw NL db MsgEnd PAGE ;**** Subroutine FileName **** ;Displays active file name FileName: lxi d,FN1 call Type ret FN1: db 'WAIT',0,0,0,0 ;allow for max. of 8 characters db MsgEnd ;**** Subroutine Create **** ;Creates a fresh FCB Create: lxi h,FcbRun lxi d,FcbNew mvi b,FcbEnd-FcbNew Create1: ldax d mov m,a inx h inx d dcr b jnz Create1 ret ;**** Subroutine HomeIt **** ;Homes cursor to just under Header and clears to end of page. HomeIt: lxi d,Clear call Type ret Clear: db 1Bh,3Dh ;move cursor db 27h,20h ;to just under header db 1Bh,59h ;clear from cursor to end db MsgEnd ;**** Subroutine ClearBuf **** ClearBuf: lxi h,Buffer lxi b,EndBuffer-Buffer ClearB1: mvi m,0 inx h dcx b mov a,c ora b jnz ClearB1 ret **** Subroutine ClearLD **** ClearLD: lxi h,LineData0 lxi b,EndData-LineData0 jmp ClearB1 PAGE ;**** Wait for key **** Wait: mvi c,6 mvi e,0FDh call Bdos cpi 3 ;test if ^C jz Exit cpi 0Dh ; jz ReEdit cpi '1' jz New cpi '2' jz Diff cpi '3' jz CLA ;"Check Line Above" ani 5Fh ;convert if small to cap. cpi 'X' ;test if X jz Exit cpi 'W' jz Write cpi 'A' ;is it less than 'A'? jc Wait ;jmp if yes (not A to P) cpi 'Q' ;is it less than 'Q'? jc ExistFile ;jmp if yes jmp Wait ;sorry, not A to P. PAGE ;**** Work on "Check Line Above" **** ;Clear Screen CLA: call HomeIt ;Start screen message lxi d,CLA2 call Type jmp CLA4 CLA2: db '"Check Line Above" is now ' db MsgEnd ;Is SkipFlag disabled? CLA4: lda SkipFlag ana a jz CLA30 ;jmp if disabled call BM18 ;Cont screen message lxi d,CLA6 call Type jmp CLA7 CLA6: dw NL,NL db 'Please push:' dw NL db ' - Return to Main Menu with conditions as ' db 'shown above.' dw NL db ' D - Disable "Check Line Above" and return to ' db 'Main Menu.' dw NL db ' E - Edit "Check Line Above" message.' dw NL db ' S - Set number of lines to look up.' dw NL,NL db MsgEnd PAGE ;Wait for key CLA7: mvi c,6 mvi e,0FDh call Bdos cpi 1Bh ; jz Begin cpi 'D' jz CLA10 cpi 'd' jz CLA10 cpi 'E' jz CLA20 cpi 'e' jz CLA20 cpi 'S' jz CLA15 cpi 's' jz CLA15 jmp CLA7 ;Sorry none of the above ;Clear "Skip Flag" CLA10: mvi a,0 sta SkipFlag jmp Begin ;Set number of lines to look above CLA15: call HomeIt lxi d,CLA16 call Type jmp CLA17 CLA16: db 'Please select the number of lines to look up. ' db 'For Example:' dw NL,NL db '----------' dw NL db 'XXXX' dw NL,NL db 'A>WAIT' dw NL db '----------' dw NL,NL,NL db 'XXXX is 2 lines up. Select 0 to 9.' dw NL,NL db MsgEnd CLA17: mvi c,6 mvi e,0FDh call Bdos ani 0Fh sta LinesUp jmp CLA PAGE ;Edit CLA ;Move message to new location CLA20: lxi h,Temp lxi d,LineData0 ldax d ;Load max char mov m,a inx h inx d ldax d ;load char returned mov m,a inx h inx d CLA21: ldax d mov m,a inx h inx d ana a jnz CLA21 ;Edit message string CLA22: call HomeIt lxi d,CLA23 call Type lxi h,Temp mvi m,31 xchg call LineEdit cpi 0 jz CLA25 cpi 1 jz CLA cpi 2 jz BadWait jmp CLA CLA23: db 'Enter up to 31 characters for the ' db '"Enter Line Above" message.' db MsgEnd ;Load new message line to LineData CLA25: call ClearLD lxi h,LineData0 lxi d,Temp call LB0 jmp CLA PAGE CLA30: lxi d,CLA31 call Type jmp CLA34 CLA31: db '"disabled".' dw NL,NL db 'Please push:' dw NL db ' - Return to Main Menu without any changes.' dw NL db ' A - Activate "Check Line Above".' dw NL,NL db MsgEnd ;Which key pushed? CLA34: mvi c,6 mvi e,0FDh call Bdos cpi 1Bh ; jz Begin cpi 'A' jz CLA35 cpi 'a' jz CLA35 jmp CLA34 ;Sorry none of the above ;Set SkipFlag CLA35: mvi a,0FFh sta SkipFlag jmp CLA PAGE ;**** Open Existing File ****  ;Convert to drive code and store ExistFile: ani 1Fh sta FcbNew ;Create FcbRun call Create ;Clear screen call HomeIt ;Open Existing File mvi c,15 lxi d,FcbRun call Bdos ;Test if file opened ana a jz FileExists ;jmp if file opened with no problem mov a,h cpi 0 jnz BadWait ;File not found. Give message. lxi d,NoFileMsg call Type jmp BadWait NoFileMsg: dw NL,NL db 'File not found.' dw NL db MsgEnd ;Test Existing file FileExists: call TestFile jnz BadWait ;MKWAIT file - give message lxi d,MSmsg1 call Type jmp MS2 MSmsg1: dw NL,NL db 'Do you want to use this file? (Y/N) ' db MsgEnd PAGE ;Wait for Answer MS2: mvi c,6 mvi e,0FDh call Bdos cpi 'Y' jz LoadCLA cpi 'y' jz LoadCLA jmp Begin ;Edit existing message string ExistEdit: call HomeIt lxi d,EE2 call Type lxi h,Existing+Buffer-Data mvi m,MaxChar ;only allow max number of char xchg call LineEdit cpi 0 jz LoadCLA cpi 1 jz Begin cpi 2 jz BadWait jmp Begin EE2: db 'Enter up to 255 characters. Messages will ' db 'automatically go to the next line' dw NL db 'after every 80 characters. Therefore, ' db 'you may want to use spaces to finish' dw NL db 'a line in the right place.' db MsgEnd ;Load "Check Line Above" data LoadCLA: call ClearLD lxi h,SkipFlag lxi d, Existing+SkipFlag-Data mvi b,EndCLA-SkipFlag LdCLA1: ldax d mov m,a inx h inx d dcr b jnz LdCLA1 lxi h,LineData0 lxi d,Existing+LineData0-Data call LB0 PAGE ;Load from MKWAIT file to "Buffer" LoadBuffer: call ClearBuf lxi h,Buffer lxi d,Existing+Buffer-Data call LB0 jmp Begin LB0: ldax d ;load max char mov m,a inx h inx d ldax d ;load char returned mov m,a inx h inx d LB1: ldax d ;load data mov m,a inx h inx d ana a ;is it end flag? jnz LB1 ;jmp if no ret ;**** Routine New **** ;Create a string with no data New: lxi h,Temp mvi m,MaxChar inx h mvi m,0 inx h mvi m,0 jmp ReEdit2  ;**** Routine BadWait **** ;Will wait for any key (sends message) and then jmp to Begin BadWait: lxi d,BadOpen1 call Type mvi e,0FDh ;wait for key mvi c,6 call Bdos jmp Begin BadOpen1: dw NL,NL db 'Push to continue.' dw NL db MsgEnd PAGE ;**** Routine ReEdit **** ;Move Buffer to new location ReEdit: lxi h,Temp lxi d,Buffer ldax d ;Load max char mov m,a inx h inx d ldax d ;load char returned mov m,a inx h inx d ReEdit1: ldax d mov m,a inx h inx d ana a jnz ReEdit1 ;Edit message string ReEdit2: call HomeIt lxi d,EE2 call Type lxi h,Temp mvi m,MaxChar xchg call LineEdit cpi 0 jz ReEdit5 cpi 1 jz Begin cpi 2 jz BadWait jmp Begin ;Load new message line to Buffer ReEdit5: call ClearBuf lxi h,Buffer lxi d,Temp call LB0 jmp Begin PAGE ;**** Subroutine TestFile **** ;Test existing file found on disk ;If MKWAIT file then return with Zero Flag set ;Send message TestFile: call FileName lxi d,FEmsg call Type jmp FEmsgOut FEmsg: db ' exists on the selected drive.' dw NL db MsgEnd FEmsgOut: db 0 ;Clear area for existing FileName so that old end message destroyed. lxi h,Existing lxi b,400h ;more than enough ClearArea: mvi m,0 inx h dcx b mov a,b ora c jnz ClearArea ;Load existing file mvi c,26 ;set DMA address lxi d,Existing call Bdos mvi c,15 ;open existing file lxi d,FcbRun call Bdos mvi c,20 ;read sequential lxi d,FcbRun call Bdos ;Test if embedded "MKWAIT end message" is present lxi h,Existing+400h-(+EndS9-EndS8) lxi d,EndS8 mvi b,EndS9-EndS8 Test: ldax d cmp m jnz NotFile ;jmp if embedded message not MKWAIT's inx h !inx d dcr b jnz Test PAGE ;This is a MKWAIT file - Send message lxi d,MF1 call Type jmp MF2 MF1: dw NL db 'This file was created by MKWAIT ' db MsgEnd MF2: lxi d,Existing+EndS7-Data ;Send Version number call Type lxi d,MF11 call Type jmp MF12 MF11: dw NL,NL db ' "Check Line Above" is now ' db MsgEnd MF12: lda Existing+SkipFlag-Data ana a jz MF20 ;jmp if disabled call MF15 jmp MF23 MF15: lxi h,Existing+LinesUp-Data lxi d,Existing+LineData-Data jmp BM20 MF20: lxi d,BM31 call Type MF23: lxi d,MF24 call Type jmp MF25 MF24: dw NL,NL db 'The file',39,'s message line is:' dw NL db MsgEnd MF25: lxi d,Existing+String-Data ;Send String message call Type xra a ;set zero flag ret PAGE ;Not a MKWAIT file - Send message NotFile: lxi d,NMmsg call Type mvi a,1 ;clear zero flag ana a ret NMmsg: db 'This file was not made by MKWAIT. ' dw NL db MsgEnd PAGE ;**** Write File to Disk **** ;Ask which drive to select Write: call HomeIt lxi d,Write2 call Type jmp Write3 Write2: db 'Which drive do you want to write ' db MsgEnd Write3: call FileName lxi d,Write5 call Type jmp Write6 Write5: db ' to?' dw NL db 'Select A,B,etc. or to return to main menu.' dw NL db MsgEnd ;Wait for key Write6: mvi c,6 mvi e,0FDh call Bdos cpi 1Bh ;ESC jz Begin ani 5Fh ;convert from small to cap. cpi 'A' ;is it less than 'A'? jc Write6 ;jmp if yes cpi 'Q' ;is it less than 'Q' jc Write10 ;jmp if yes jmp Write6 ;sorry, not A to P ;Convert to drive code and store Write10: sta Write17 ;store drive letter ani 1Fh sta FcbNew ;Create FcbRun call Create PAGE ;Clear screen Write11: call HomeIt ;Open New File mvi c,22 lxi d,FcbRun call Bdos ;Test if file opened ana a jz Write40 ;jmp if file opened with no problem mov a,h cpi 8h jz Write15 cpi 0 jnz BadWait ;No directory space available lxi d,Write12 call Type jmp BadWait Write12: dw NL,NL db 'No directory space available.' dw NL db MsgEnd ;Ask if file to be overwritten? Write15: call HomeIt call FileName lxi d,Write16 call Type jmp Write20 Write16: db ' already exists on drive ' Write17: db 'A: ' dw NL db 'Do you wish to overwrite this file with your new '  db '"wait" file? (Y/N) ' db MsgEnd PAGE ;Wait for Erase Answer Write20: mvi c,6 mvi e,0FDh call Bdos cpi 'Y' jz Write22 cpi 'y' jz Write22 jmp Begin ;Erase file Write22: mvi c,19 lxi d,FcbRun call Bdos ana a ;test if erased jz Write11 ;jmp if erased mov a,h ;test if R/O cpi 3 jz Write30 ;jmp if R/O jmp BadWait ;Ask About Read/Only Write30: lxi d,Write31 call Type jmp Write32 Write31: dw NL,NL db 'The file is Read/Only. Overwrite? (Y/N) ' db MsgEnd ;Wait for answer Write32: mvi c,6 mvi e,0FDh call Bdos cpi 'Y' jz Write35 cpi 'y' jz Write35 jmp Begin ;Erase Read/Only Write35:lda FcbRun+9 ;set FCB to R/W ani 7Fh sta FcbRun+9 mvi c,30 ;now set file on disk to R/W lxi d,FcbRun call Bdos jmp Write22 PAGE ;**** Load End Flags into Data **** ;Get next address after String Write40: mvi b,0 ;load number of char to bc lda Buffer+1 mov c,a lxi h,String ;load string start adr dad b ;offset ;add end flag of 0h mvi m,0 inx h ;**** Write Data to Disk **** mvi c,26 ;set DMA address lxi d,Data call Bdos mvi c,21 ;write data lxi d,FcbRun call Bdos mvi c,16 ;close file lxi d,FcbRun call Bdos jmp Begin **** FCB "to be run" location *** FcbRun: ds 1 db 'WAIT COM' db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 **** FCB "to be read" location **** FcbNew: ds 1 db 'WAIT COM' db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 FcbEnd: ds 1 PAGE **** Program Data Assembly Area **** ;Below is the program of the WAIT file. It always starts at 100h. Data: OffSet: equ Data-100h ;Set Stack lxi sp,Stack1 ;Set Output Delimiter to 0h. mvi c,110 mvi e,0h call Bdos ;Jmp one line down so cursor is always in far left column mvi c,9 lxi d,DataNL-Offset call Bdos ;Is SkipFlag set? lda SkipFlag-Offset ana a jnz TestLine-Offset ;Skip another line on screen and send flashing message Data0: mvi c,9 lxi d,Data1-OffSet call Bdos jmp Data2-OffSet Data1: dw NL db 27,94 ;start flash db 'READ NOTE:' db 27,113 ;stop flash db 7 ;Beep DataNL: dw NL db 0 ;Send message Data2: mvi c,9 lxi d,String-OffSet call Bdos ;Send waiting message mvi c,9 lxi d,Data4-OffSet call Bdos jmp Data5-OffSet Data4: dw NL,NL db 'Push to continue or ' db ' to terminate command string.' dw NL db 0 PAGE ;Wait for key Data5: mvi c,6 mvi e,0FDh call Bdos cpi 1Bh ;ESC jz Data7-OffSet jmp 0 ;jmp to cp/m ;Return to CP/M without finishing any command lines ;Find and remove any SUBMIT RSX's Data7: mvi c,60 lxi d,Data8-OffSet call Bdos ;will return code of FFh if none found. inr a jnz Data7-OffSet jmp Data10-OffSet ;RSX PB Address Data8: db 81h ;Code to SUBMIT to terminate db 0 ;Find and remove any command RSX. ;Test if another command Data10: mvi c,49 lxi d,Data15-OffSet ;Get High adr of next command call Bdos ana a ;test if 0h jz 0 ;jmp if no next command ;Set command RSX "remove flag" mov h,a mvi l,0Eh mvi m,0FFh ;Set next command address to 0000h Data11: mvi c,49 lxi d,Data16-OffSet call Bdos jmp 0 ;SCB PB Address for Data10 Data15: db 16h ;Offset to High adr of next command db 0 ;Get operation ;SCB PB Address for Data11 Data16: db 15h ;Offset to adr of next command db 0FEh ;Set word dw 0000h ;The word value PAGE ;Activate Video Bank TestLine: in 0 sta LineBank-Offset ori 40h out 0 ;Get present position of cursor lhld CurPos ;Go up so many lines lda LinesUp-Offset adi 2 ;go up at least 2 lines mov b,a TL1: mov a,l cpi 80h jz TL4-Offset ;jmp if Low = 80h mvi l,80h ;Set Low to 80h dcr h ;Decrement High TL2: dcr b jnz TL1-Offset ;jmp if not last line jmp TL10-Offset TL4: mvi l,0 ;Set Low to 00h jmp TL2-Offset ;Does data match? TL10: lxi d,LineData-Offset TL12: ldax d ana a ;is it end flag? jz TL16-Offset ;jmp if end flag cmp m jnz TL14-Offset ;jmp if no match inx h inx d jmp TL12-Offset ;Restore banks and show WAIT message TL14: lda LineBank-Offset out 0 jmp Data0-Offset ;Restore banks and return to CP/M TL16: lda LineBank-Offset out 0 jmp Exit PAGE ;Skip space to 027Eh (allows extra program space if needed) ds 27Eh-100h-($-Data) ;Development Area for Message. ;Message will be from 280h to 37Fh (up to 255 char's). Buffer: ds 2 ;2 bytes for number of characters in message ;027Eh String: db 0 ;Start of string of characters in message. ;0280h ds 0380h-100h-($-Data) ;skip space to 0380h EndBuffer: ;This label used by ClearBuf: ;Storage for data bytes and words ;0380h SkipFlag: db 0 ;Will test screen if this flag not zero LineBank: ds 1 ;Temp storage of bank LinesUp: db 0 ;Number of lines above CP/M command line ;skip space to 038Eh EndCLA: ds 38Eh-100h-($-Data) ;Storage for "Check Line Above" message (up to 31 characters) ;038Eh LineData0: ds 2 ;2 bytes for number of characters in message ;0390h LineData: db 0 ds 3B0h-100h-($-Data) ;skip space to 03B0h EndData: ;This label used by ClearLD: ;skip space to 04D2h (allows extra program or data space if needed) ;03B0h ds 4D2h-100h-($-Data) ;Version number EndS7: db 'Ver. ',xVersion,'.',yVersion,0,0,0 ;04D2h ;Recognition message EndS8: db 'This WAIT.COM was created by MKWAIT' ;04DDh EndS9: db 0 ;0500h PAGE ;**** Routine Diff **** ;Change to a different file name ;Send message Diff: call HomeIt lxi d,Diff1 call Type jmp Diff2 Diff1: db 'What is the new file name to be?' dw NL db 'Enter up to an 8 character file name.' dw NL db MsgEnd ;Setup NewName Diff2: lxi h,NewName mvi m,8 ;8 characters max inx h inx h mvi m,0 ;no data to start jmp Diff4 NewName: ds 15 ;Get file name Diff4: lxi d,NewName call LineEdit cpi 0 jz Diff10 cpi 1 jz Begin cpi 2 jz BadWait jmp Begin PAGE ;Test if no data Diff10: lda NewName+1 ana a jz Begin ;Forget it if no data ;Convert small letters to caps lxi h,NewName+2 Diff11: mov a,m ana a jz Diff13 cpi 'a' jc Diff12 ;jmp if less than 'a' cpi 'z'+1 jnc Diff12 ;jmp if greater than 'z' sui 20h ;convert mov m,a Diff12: inx h jmp Diff11 ;Fill FcbRun file name with blanks Diff13: mvi b,8 mvi a,' ' lxi h,FcbRun+1 Diff15: mov m,a inx h dcr b jnz Diff15 ;Move new file name to FcbRun lxi h,NewName+2 lxi d,FcbRun+1 Diff17: mov a,m ana a jz Diff20 stax d inx h inx d jmp Diff17 PAGE ;Fill FcbNew file name with blanks Diff20: mvi b,8 mvi a,' ' lxi h,FcbNew+1 Diff21: mov m,a inx h dcr b jnz Diff21 ;Move new file name to FcbNew lxi h,NewName+2 lxi d,FcbNew+1 Diff23: mov a,m ana a jz Diff25 stax d inx h inx d jmp Diff23 ;Fill FN1 file name with 0's Diff25: mvi b,8 mvi a,0 lxi h,FN1 Diff27: mov m,a inx h dcr b jnz Diff27 ;Move new file name to FN1 lxi h,NewName+2 lxi d,FN1 Diff30: mov a,m ana a jz Diff33 stax d inx h inx d jmp Diff30 ;That's it. Lets go home. Diff33: jmp Begin PAGE ;**** Subroutine LineEdit **** ; ;DE = Start address of string to edit (set by user) ; 1st byte = maximum number of characters (set by user) ; Does not include end flag of 0. ; 2nd byte = total number of characters returned (set by LineEdit) ; Does not include end flag of 0. ; 3rd byte = zero if string has no data (set by user) ; 3rd byte = not zero if string has data (string must end with 0) ; ;Preload "WhichRow" with the row number to be used for the displayed line. ; 00h = 1st row (Top row of screen) ; 01h = 2nd row ; etc ; 17h = 24th row (Bottom row of screen) ; ;CP/M cursor is moved to far left so LineEdit can remove it. ;LineEdit Cursor will start at far left. ;Cursor will be inverse, blinking, full intensity. ;Non-cursor characters will be black background, full intensity. ; ;Nonprintable characters will not be allowed in string. ; ;MsgEnd must be 0h. ; ;Returns with accumulator set to: ; 0 - good edit. (2nd byte equals 0 to maximum characters in string) ; 1 - edit not wanted (ESC pushed) ; 2 - problem opening line (one line message given) ; ;"String" is location of data . ;"Line" is location of video ram. ; LineMax: db MaxChar ;maximum number of characters allowed (max = 255) ;1st byte can be equal to or less than LineMax WhichRow: db 17h ;row that line editor will use StringStart: ds 2 ;start address of string to edit StringBegin: ds 2 ;First char of string String1st: ds 2 ;Address of char in string that is 1st char in line StringCursor: ds 2 ;cursor location in string LineBegin: ds 2 ;start address of line LineCursor: ds 2 ;cursor location in line PAGE ;Store start address of string LineEdit: xchg shld StringStart ;Make CP/M cursor start location same as LineEdit location lda WhichRow ani 24 sta CursorY ;Send Edit header lxi d,Edit1 call Type jmp Edit3 Edit1: dw NL,NL db 'Use these keys for editing:' dw NL,NL db ' ^A - Go to far left.' dw NL db ' ^F - Go to far right.' dw NL db ' ^G or down arrow - delete character.' dw NL db ' ^- or ^left arrow - delete character on left.' dw NL db ' Use left and right arrow keys to move cursor.' dw NL db ' Only printable characters allowed.' dw NL db ' Push to exit without new edit.' dw NL db ' Push when finished.' db 1Bh,3Dh ;position cursor CursorY db 0+32 CursorX db 0+32 db MsgEnd PAGE ;Create video bank start address Edit3: ora a ;clear carry lda WhichRow ;get row number lxi h,0C000h ;preload hl for video bank address rar ;get LSB of WhichRow for MSB of reg l mov b,a ;store LSB's for reg h mov a,l ;move LSB of WhichRow into MSB of reg l rar mov l,a mov a,b ;get LSB's for reg h ora h ;move MSB's of WhichRow into LSB's of reg h mov h,a ; shld LineBegin ;store line start address PAGE ;Test if max desired ok Edit5: lhld StringStart mov c,m ;load max char's inx h mvi m,0 ;set to 0 char returned for now inx h lda LineMax ;load max allowed cmp c ;test if equal to or less than jz Edit8 ;ok (equal) jnc Edit8 ;ok (less than) ;Max desired not ok - send message lxi d,Edit6 call Type mvi a,2 ret Edit6: db 'Maximum characters desired is more than that allowed.' db MsgEnd ;Test if any nonprintable char found Edit8: mvi b,0 ;to keep track of number of char lda LineMax ;to test if max exceeded inr a ;account for end flag mov c,a Edit9: mov a,m ana a jz Edit20 ;jmp if end flag of 0 found cpi ' ' jc Edit11 ;jmp if control char cpi 7Fh jnc Edit11 ;jmp if equal to or greater than 7Fh inr b dcr c jz Edit16 ;jmp if max exceeded inx h jmp Edit9 ;nonprintable char found Edit11: lxi d,Edit12 call Type mvi a,2 ret Edit12: db 'Sorry, this string has a nonprintable character.' db MsgEnd PAGE ;number of char's exceed limit Edit16: lxi d,Edit17 call Type mvi a,2 ret Edit17: db 'Sorry, this string is too long.' db MsgEnd ;does string given exceed its own limit? Edit20: lhld StringStart mov a,m cmp b jnc Edit25 ;jmp if ok ;string given exceeds its own limit lxi d,Edit22 call Type mvi a,2 ret Edit22: db 'Sorry, this string exceeds its own maximum limit.' db MsgEnd ;Load number of char's found Edit25: lhld StringStart inx h mov m,b ;display line lhld StringStart ;preload start address of string inx h inx h shld StringBegin shld String1st shld StringCursor lhld LineBegin ;preload start address of line shld LineCursor shld OldCursor call Display jmp Edit PAGE ;** Subroutine Display ** OldCursor: ds 2 Bank: ds 1 ;Turn on Video Bank Display: in 0 sta Bank ori 40h out 0 ;Turn off old cursor lhld OldCursor mov a,m ani 01111111b ;turn off reverse video mov m,a mov a,h ;go to DXXX address adi 10h mov h,a mov a,m ani 11011111b ;turn off blink mov m,a ;Load new line data until end flag lhld String1st xchg lhld LineBegin mvi b,80 Display1: ldax d ana a ;test if 0 end flag jz Display2 ;jmp if yes mov m,a inx h inx d dcr b jnz Display1 ;Finish with blanks Display2: mvi a,' ' Display3: mov m,a inx h dcr b jnz Display3 PAGE ;Turn on new cursor and store location as OldCursor lhld LineCursor shld OldCursor mov a,m ori 10000000b ;turn on inverse video mov m,a mov a,h ;go to DXXX address adi 10h mov h,a mov a,m ori 00100000b ;turn on blink mov m,a ;Turn off Video Bank lda Bank out 0 ret PAGE ;Wait for edit key Edit: mvi c,6 mvi e,0FDh call Bdos cpi 1Bh ;ESC jz ExitEdit cpi 01h ;^A (CP/M to left edge) jz LeftEdge cpi 06h ;^F (CP/M to right edge) jz RightEdge cpi 07h ;^G (CP/M and WS delete character) jz DeleteChar cpi 0Ah ;^J (CP/M Arrow down) jz DeleteChar cpi 18h ;^X (WS Arrow down) jz DeleteChar cpi 1Fh ;^_ (WS delete character on left - also ^ arrow left) jz DeleteLeft cpi 7Fh ;DEL jz DeleteLeft cpi 04h ;^D (WS arrow right) jz Right cpi 0Ch ;^L (CP/M arrow right) jz Right cpi 13h ;^S (WS arrow left) jz Left cpi 08h ;^H (CP/M arrow left) jz Left cpi 0Dh ;^M (Carriage Return) jz DoneEdit cpi ' ' jc Edit ;jmp if control char cpi 80h jnc Edit ;jmp if equal to or greater than 80h jmp EnterChar ;Return from Edit with flag of abandon edit ExitEdit: mvi a,1 ret ;Return from Edit with flag of good new edit DoneEdit: mvi a,0 ret PAGE ;**** Routine Right **** ;move cursor right ;can String move right? Right: lhld StringCursor mov a,m ana a jz Edit ;jmp if no ;move String right inx h shld StringCursor ;can Line move right? lhld LineCursor mov a,l cpi 4Fh jz RightMove ;jmp if no cpi 0CFh jz RightMove ;jmp if no ;move Line right inx h shld LineCursor ;display new line RightOut: call Display jmp Edit ;move String right RightMove: lhld String1st inx h shld String1st jmp RightOut PAGE ;**** Routine Left **** ;moves cursor left ;Can String move left? Left: lhld StringBegin xchg lhld StringCursor mov a,d cmp h jnz Left1 ;jmp if yes mov a,e cmp l jnz Left1 ;jmp if yes jmp Edit ;jmp if no ;Move String left Left1 dcx h shld StringCursor ;Can Line move left? lhld LineCursor mov a,l cpi 0h jz LeftMove ;jmp if no cpi 80h jz LeftMove ;jmp if no ;move Line left dcx h shld LineCursor ;display new line LeftOut: call Display jmp Edit ;move String left LeftMove: lhld String1st dcx h shld String1st jmp LeftOut PAGE ;**** Routine RightEdge **** ;Moves cursor to far right edge ;Can String move right? RightEdge: lhld LineCursor ;for top push h lhld String1st ;for de xchg lhld StringCursor ;for hl mov a,m cpi 0h jz REout ;jmp if no ;Move StringCursor and LineCursor right ;Can LineCursor move right RE1: xthl mov a,l cpi 4Fh jz RE5 ;jmp if no cpi 0CFh jz RE5 ;jmp if no ;move LineCursor right inx h RE2: xthl ;move StringCursor right inx h ;can String move right mov a,m cpi 0h jnz RE1 ;jmp if yes ;load new values RE3: shld StringCursor xchg shld String1st pop h shld LineCursor ;display new line call Display jmp Edit PAGE ;Move StringCursor and String1st right ;Return LineCursor RE5: xthl ;move StringCursor and String1st right RE6: inx h inx d ;can String move right mov a,m cpi 0h jnz RE6 ;jmp if yes jmp RE3 REout: pop h jmp Edit PAGE ;**** Routine LeftEdge **** ;Moves cursor to far left edge ;Can String move left? LeftEdge: lhld StringBegin ;for bc mov b,h mov c,l lhld StringCursor mov a,b cmp h jnz LE0 ;jmp if yes mov a,c cmp l jnz LE0 ;jmp if yes jmp Edit ;jmp if no LE0: lhld LineCursor ;for top push h lhld String1st ;for de xchg lhld StringCursor ;for hl ;Move StringCursor and LineCursor left ;Can LineCursor move left LE1: xthl mov a,l cpi 0h jz LE5 ;jmp if no cpi 80h jz LE5 ;jmp if no ;move LineCursor left dcx h LE2: xthl ;move StringCursor left dcx h ;can String move left mov a,b cmp h jnz LE1 ;jmp if yes mov a,c cmp l jnz LE1 ;jmp if yes PAGE ;load new values LE3: shld StringCursor xchg shld String1st pop h shld LineCursor ;display new line call Display jmp Edit ;Move StringCursor and String1st left ;Return LineCursor LE5: xthl ;move StringCursor and String1st left LE6: dcx h dcx d ;can String move left mov a,b cmp h jnz LE6 ;jmp if yes mov a,c cmp l jnz LE6 ;jmp if yes jmp LE3 ;jmp if no PAGE ;**** Routine DeleteChar **** ;Deletes character cursor is on ;Is StringCursor at end? DeleteChar: lhld StringCursor mov a,m dcx h ana a jz Edit ;jmp if yes ;Delete data at cursor DelChar1: inx h inx h mov a,m dcx h mov m,a ana a ;is it last char jnz DelChar1 ;jmp if no ;Decrement char count lhld StringStart inx h mov a,m dcr a mov m,a ;Display new line call Display jmp Edit PAGE ;**** Routine DeleteLeft **** ;Delete character on left of cursor ;Is StringCursor at end? DeleteLeft: lhld StringBegin xchg lhld StringCursor mov a,d cmp h jnz DelLeft1 ;jmp if no mov a,e cmp l jnz DelLeft1 ;jmp if no jmp Edit ;jmp if yes ;Is LineCursor at end? DelLeft1: lhld LineCursor mov a,l cpi 0h jz Edit ;jmp if yes cpi 80h jz Edit ;jmp if yes ;Decrement LineCursor position dcx h shld LineCursor ;Decrement StringCursor position lhld StringCursor dcx h shld StringCursor ;Delete data at left of cursor dcx h DelLeft2: inx h inx h mov a,m dcx h mov m,a ana a ;is it last char jnz DelLeft2 ;jmp if no ;Decrement char count lhld StringStart inx h mov a,m dcr a mov m,a ;Display new line call Display jmp Edit PAGE ;**** Routine EnterChar **** ;Enter character at cursor position. ;Cursor and all to right moves right. ;Store character EnterChar: mov c,a ;char stored in c ;Is String full? lhld StringStart mov a,m inx h cmp m jnz Char1 ;jmp if no ;Send bell mvi c,2 mvi e,7h call Bdos jmp Edit ;Increment String count Char1: mov a,m inr a mov m,a ;Increment StringCursor lhld StringCursor inx h shld StringCursor dcx h ;Move in new data Char2: mov a,m ;get data for next mov m,c ;write data mov c,a ;set up for next inx h ana a ;is it last jnz Char2 ;jmp if no mov m,c ;write end flag PAGE ;Can LineCursor move right? lhld LineCursor mov a,l cpi 4Fh jz Char5 ;jmp if no cpi 0CFh jz Char5 ;jmp if no ;move LineCursor right inx h shld LineCursor ;Display line Char4: call Display jmp Edit ;Increment String1st Char5: lhld String1st inx h shld String1st jmp Char4 end 100h 1@1(.~w!,~#/:~zDIR!WAIT0!WAIT1!SUBMIT SUB1!WAIT4!WAIT5!WAIT6!;THIS IS A WAY TO SEND A MESSAGE ALSO EXCEPT IT CANNOT BE THE FIRST COMMAND.$Ver. 2.0$This EXECST.COM was created by MAKESTLBRDISK DOCMAKEST20COM$ !MAKEST20DOC9"#$%&'()MAKEST20ASM*+,-./0123456789MAKEST20ASM[:;<=>?@ABCDEMKWAIT20COM0FGHIJKMKWAIT20DOC`LMNOPQRSTUVWMKWAIT20ASMXYZ[\]^_`abcdefgMKWAIT20ASMhijklmnopqrstuvwMKWAIT20ASMxSHOW1 $$$SHOW wil sho demonstratio o "Wai Files create b MKWAIT SHOW wa itsel create b MAKEST SHOW wil requir tha th progra SUBMI (supplie wit you Executive b o th defaul drive D no tr t us th ^ comman o CP/ (sen t printer whil runnin SHOW o fo tha matte whil runnin an "Wai File create b MKWAIT Thi i becaus th code sen t caus "REA NOTE t flas ma han u you printe an i tur hang up your Executive. You must have these files on the default drive to run SHOW1: SHOW1.COM SUB1 .SUB SUB2 .SUB SUBMIT.COM (you must add this file) WAIT0.COM WAIT1.COM WAIT2.COM WAIT3.COM WAIT4.COM WAIT5.COM WAIT6.COM Now sit back and start the show. Peter Cole WAIT2 SUBMIT SUB2 DIR EPOXLINKDOCKEY2SCRNCOMKEY2SCRNDOCLBRDISK COM,LBRDISK DOCMAKEST20COM$ !MAKEST20DOC9"#$%&'()MAKEST20ASM*+,-./0123456789MAKEST20ASM[:;<=>?@ABCDEMKWAIT20COM0FGHIJKMKWAIT20DOC`LMNOPQRSTUVWMKWAIT20ASMXYZ[\]^_`abcdefgMKWAIT20ASMhijklmnopqrstuvwMKWAIT20ASMxSHOW1 COMySHOW1 DOCzSUB1 $$$WAIT3 DIR EPOXLINKDOCKEY2SCRNCOMKEY2SCRNDOCLBRDISK COM,LBRDISK DOCMAKEST20COM$ !MAKEST20DOC9"#$%&'()MAKEST20ASM*+,-./0123456789MAKEST20ASM[:;<=>?@ABCDEMKWAIT20COM0FGHIJKMKWAIT20DOC`LMNOPQRSTUVWMKWAIT20ASMXYZ[\]^_`abcdefgMKWAIT20ASMhijklmnopqrstuvwMKWAIT20ASMxSHOW1 COMySHOW1 DOCzSUB1 SUB{SUB2 $$$1@n 5: $8 ^READ NOTE:q   KÑ Push to continue or to terminate command string. ʠ<< ñ1g.612@*S:G}.%. #::DIR should just had been run. Notice that DIR does not show up on a command line. This is because CP/M just won't show the first command of a "chained" command line such as that created by SHOW1.Ver. 2.0This WAIT.COM was created by MKWAIT1@n 5: $8 ^READ NOTE:q   KÑ Push to continue or to terminate command string. ʠ<< ñ1g.612@*S:G}.%. #::This "Wait File" could have been set up to tell you to change a disk. As it is only a demonstration then it will only show you just how long a message you can have. It can be up to three 80 character lines plus 15 characters on the fourth line. Ver. 2.0This WAIT.COM was created by MKWAIT1@n 5: $8 ^READ NOTE:q   KÑ Push to continue or to terminate command string. ʠ<< ñ1g.612@*S:G}.%. #::This file was loaded by SUBMIT and SUB1.SUB. Will WAIT2 allow you to teminate the rest of the commands of the SUBMIT program and the rest of the commands of the SHOW1 program? Push to find out or push to continue.Ver. 2.0This WAIT.COM was created by MKWAIT1@n 5: $8 ^READ NOTE:q   KÑ Push to continue or to terminate command string. ʠ<< ñ1g.612@*S:G}.%. #::This "Wait File" was loaded by the second SUBMIT program SUB2.SUB. Will pushing terminate the rest of both SUBMIT commands and the rest of the SHOW1 commands? Push to find out or push to continue.Ver. 2.0This WAIT.COM was created by MKWAIT1@n 5: $8 ^READ NOTE:q   KÑ Push to continue or to terminate command string. ʠ<< ñ1g.612@*S:G}.%. #::Above should show two runnings of DIR. The first is the rest of the commands of SUB2.SUB and the second is the rest of the commands of SUB1.SUB. Now both SUBMITfiles are gone.Ver. 2.0This WAIT.COM was created by MKWAIT1@n 5: $8 ^READ NOTE:q   KÑ Push to continue or to terminate command string. ʠ<< ñ1g.612@*S:G}.%. #::You should not see this "Wait File" as the "Check Line Above" has been activatedand it looks for a line that is always there when you run SHOW1.PushVer. 2.0This WAIT.COM was created by MKWAIT1@n 5: $8 ^READ NOTE:q   KÑ Push to continue or to terminate command string. ʠ<< ñ1g.612@*S:G}.%. #::Notice that WAIT5 did not wait. This is because its "Check Line Above" was activated and it looked 2 lines up for "Push". This "Wait File" (WAIT6) was also activated but it looked 2 lines up for "Sorry not here" which of course it did not find.Sorry not here Ver. 2.0This WAIT.COM was created by MKWAIT1:] ʶ222:m5:n5:o5\fRE2:e2eSU2:f2fAe2:g2g>$2h!\ͯ~!ͯ!ͯ!:ʑ!ͯ!:ʡ!ͯ!:į !ͯ not found. $ set to: $DIR $SYS $RW $RO $Archive$ QS usage is: QS filename options where legal options are: R - Sets RO attribute S - Sets SYS attribute A - Sets Archive attribute$MAKEST20ASM[:;<=>?@ABCDEMKWAIT20COM0FGHIJKMKWAIT20DOC`LMNOPQRSTUVWMKWAIT20ASMXYZ[\]^_`abcdefgMKWAIT20ASMhijklmnopqrstuvwMKWAIT20ASMxSHOW1 COMySHOW1 DOCzSUB1 SUB{SUB2 SUB|WAIT0 COM}WAIT1 COM~WAIT2 COMWAIT3 COMWAIT4 COMWAIT5 COMWAIT6 COMQS $$$ QS (Quick Set) is a program to set or reset file attribute bits. It is primarily intended for CP/M 3.0 to take the place of the SET program for setting file attributes. The SET program is 12K long and is somewhat slow for normal use. QS is invoked by specifying the file name and up to three options: QS filename.typ options An optional drive specifier can be used and the file must be in the current user area. The options are: R - Set RO attribute S - Set SYS attribute A - Set Archive attribute If an option is not given then it is reset. Any number of options can be given but only the first three are pro- cessed. Any options other than R, S or A are ignored. Examples: 1. QS X.Y Set X.Y to DIR, RW 2. QS X.Y R Set X.Y to DIR, RO 3. QS X.Y AS Set X.Y to SYS, RW, Archive 4. QS X.Y SG Set X.Y to SYS, RW 5. QS X.Y SAR Set X.Y to SYS, RO, Archive oSCDATE v1.0 - SuperCalc (tm) date set for CP/M+ - Carl Efird 06/85*n }0ʨ Must be CP/M 3.0 or higher$i*!> w!Fw#xwÿ/SC2"xNg|"xg>>2mx!O*xl>O"x <"G*x|B/?@ABCDEMKWAIT20COM0FGHIJKMKWAIT20DOC`LMNOPQRSTUVWMKWAIT20ASMXYZ[\]^_`abcdefgMKWAIT20ASMhijklmnopqrstuvwMKWAIT20ASMxSHOW1 COMySHOW1 DOCzSUB1 SUB{SUB2 SUB|WAIT0 COM}WAIT1 COM~WAIT2 COMWAIT3 COMWAIT4 COMWAIT5 COMWAIT6 COMQS COMQS DOCSCDATE $$$ SCDATE - a program to set the date for SuperCalc (tm) using the CP/M+ system date and chains SC2.COM with what ever command tail that was given. For example: A>SCDATE ... this sets the SuperCalc date and chains SC2.COM A>SCDATE TEST ... this sets the SuperCalc date and chains SC2.COM as if you had typed SC2 TEST If you don't have SuperCalc2, you can change the name of the command to be chained to SC.COM and recompile it. Carl Efird CompuServ [71066,676] you can change the name of the command to be chained to SC.COM and recompile it. Carl Efird ;SCDATE.ASM v1.0 06/18/85 ; Carl Efird ; ; This program reads the CP/M+ system date, ; sets the SuperCalc (tm) date and chains SC2.COM ; with the command line if provided. It will work ; the same way with SC.COM if you change the name ; below. ; ; The SuperCalc (tm) date is stored in BCD starting ; at 10h in month, day, year order. ; org 100h reset equ 0 bdos equ 5 prtstr equ 9 versn equ 12 setdma equ 26 chain equ 47 getdat equ 105 ; dcfld equ 10h month equ 10h day equ 11h year equ 12h ; jmp start ; db 'SCDATE v1.0 - SuperCalc (tm) date set for CP/M+ - ' db 'Carl Efird 06/85',1ah ds 40 ; start: lhld start-1 sphl ; set up stack mvi c,versn call bdos ; get CP/M version number mov a,l ani 0f0h ; strip off lower 4 bits cpi 30h jz cpm30 ; ; Must be CP/M 3.0 or higher ; lxi d,not30 mvi c,prtstr call bdos mvi c,reset call bdos ; not30: db 'Must be CP/M 3.0 or higher$' ; ; OK - proceed to get the system date ; cpm30: lxi d,date mvi c,getdat call bdos ; get the system date lhld date call dcvrt ; convert date ; ; insert command at begining of command tail in default dma ; lxi h,80h ; load default dma address mvi a,' ' mov m,a ; replace length with a blank lxi d,cmd ; load end of command address insert: lxi h,80h ; start at begining of dma dcx d ; back up 1 character in command ldax d ; load character cpi 0 jz scalc ; done if 0 move: mov b,m ; get character from dma mov m,a ; replace with preceeding character inx h ; point to next character mov a,b ; new preceeding character cpi 0 jnz move ; continue if not 0 mov m,a ; save the 0 jmp insert ; scalc: mvi e,0 mvi c,chain call bdos ; chain to SC2.COM ; date: db 0,0,0,0,0 db 'SC2.COM' ; name of command to chain cmd: db 0 ; ;------------------------------------------------------ ;DATE.ASM v1.10 10/26/83 ; S. Kluger El Paso RCPM ; ; This module will take the date in Digital Research ; format and change it into human-readable form. ; ;Input: The number of days since 01/01/78. DCFLD ; must be defined in the main module and be ; 3 bytes. ;Output:The structure at DCFLD will contain the ; date in BCD. ; ; The routine works, don't ask me why. If you think it's ; too kludgy or too big, feel free to change it. Just ; don't leave my name off the ASM file, ok? ; ; Enter with the number of days since 1-1-78 in HL ; ; Modified 06/18/85 - cre ; returns decoded date as BCD rather than ASCII ; for compatability with SuperCalc (tm) ; dcvrt: shld drtime ;save it for now mvi b,78 ;set years counter loop: call ckleap lxi d,-365 ;set up for subtract jnz nolpy ;skip if no leap year dcx d ;set for leap year nolpy: dad d ;subtract jnc ydone ;continue if years done mov a,h ora l jz ydone shld drtime ;else save days count inr b ;increment years count jmp loop ;and do again ; ; The years are now finished, the years count is in B ; and drtime holds the days (HL is invalid) ; ydone: call ckleap ;check if leap year mvi a,-28 jnz febno ;february not 29 days mvi a,-29 ;leap year febno: sta feb ;set february mov a,b ;get years count lxi h,dcfld+2 ;point to years field call stasha ;stash A into years field lhld drtime ;get days count lxi d,mtable ;point to months table mvi b,0ffh ;set up b for subtract mvi a,0 ;set a for # of months mloop: push psw ldax d ;get month mov c,a ;put in C for subtract pop psw shld drtime ;save days count dad b ;subtract inx d ;increment months counter inr a jc mloop ;and loop for next month ; ; The months are finished, days count is on stack. ; First, calculate month. ; mdone: mov b,a ;save months lhld drtime mov a,h ora l jnz nzd dcx d dcx d ldax d cma inr a mov l,a shld drtime dcr b nzd: mov a,b push h lxi h,dcfld ;point to months field call stasha ;put a into months field pop h ;get days count back mov a,l ;into a lxi h,dcfld+1 ;point to day field ; ; Plug the accumulator into as decimal ; stasha: push b ;save bc as counter mvi b,0 ;initialize tens stl: cpi 10 ; > 10? jc got10 ;no, done sui 10 ;subtract 10 from A inr b ;increment tens jmp stl ;and loop ; ; B has the tens, A has the units. ; got10: mov c,a ;save units mov a,b ;get tens rlc rlc rlc rlc ;move tens to upper nibble add c ;combine tens and units mov m,a ;store value pop b ;restore bc ret ; ; This routine checks for leap years. ; ckleap: mov a,b ani 0fch cmp b ret ; ; This is the months table ; mtable: db -31 ;January feb: db -28 ;February db -31,-30,-31,-30 ;Mar-Jun db -31,-31,-30 ;Jul-Sep db -31,-30,-31 ;Oct-Dec ; drtime: dw 0 ;temporary storage ; end db -31,-30,-31,-30 ;Mar-Jun db inr a mov l,a shld drtime dcr b nzd: mov a,b push h lxi h,dcfld ;point to months field call stasha ;put a into months field pop h ;get days count back mov a,l ;into a lxi h,dcfld+1 ;point to day field ; ; Plug the accumulator intoU3 ver 1.02FOR CPM 3.012/29/83 - gwRev 06/16/84, 12/24/84 - rs1&NYy͕ : G:@~Cl 0ڌ:\f<=2\:]! 2!m> 0N#ʛAN#>0ʪ< >/>9y02:2:2>2 C> 2:\OXCS> 2|^#V":\_^#VS^#V~2 #: y: ́: ̉: ̑}2*: ̟: ̢: ̥}2!^#VS:ͭK&:o "> 2:OC> 2> 2ɯ2 :G! :W~`:w>2 : <2  : QͭK&:o "> 2:OC> 2C>2:=2: <2 #] >?r# g> 2Ù>2Ü>2ß>2âͥͥͥͥ|g}o:G: ڿ ö2y2 B*CS>2M2 Error occurred during disk Write - ABORT$ Specified an illegal disk drive - ABORT$ File recovered.$ File user area changed.$ No File Name specified - ABORT$ File NOT found$ Invalid User Number - ABORT$ THIS VERSION OF U3 ONLY WORKS FOR CPM 3.0 OR LATER $2!m> 0N#ʛAN#>0ʪ< >/>9y02:2:2>2 C> 2:\OXCS> 2|^#V":\_^#VS^#V~2 #: y: ́: ̉: ̑}2*: ̟: ̢: ̥}2!^#VS:ͭK&:o "> 2:OC> 2> 2ɯ2 :G! :W~`:w>2 : <2  : QͭK&:o "> 2:OC> 2C>2:=2: <2 #] >?r# g> 2Ù>2Ü>2ß>2âͥͥͥͥ|g}o:G: ڿ ö2y2 B*CS>2M2U3 - CP/M PLUS UTILITY FOR RECOVERING ERASED FILES AND FOR CHANGING THE USER AREA OF A FILE. This program is based on UNERASE.COM in the public domain. It has been modified to work with CP/M 3.0 and later, to change the user area of a file, and to accept ambiguous files names. It currently works with sector sizes of 128, 256 512 and 1024 bytes. It is placed in the public domain by Advanced Logic Systems for public use. Advanced Logic Systems makes no warrantee on the operation or use of this program or its applicability for any given application. U3 DOES NOT DOES NOT WORK WITH VERSIONS OF CP/M PRIOR TO CP/M 3.0 The U3 command line takes the form: U3 [d:]afn.aft [user area] If no user area is specified U3 recoverers all erased files on drive d: (or the default if d: is not specified) matching afn.aft and places them is the current user area. If a user area is specified U3 moves all files in the current user area on drive d: (or the default if d: is not specified) matching afn.aft to the specified user area. Versions 1.01 and 1.02 of U3 were prepared by R. Saeks from Gale Wolfenbarger's code for version 1.00. Comments regarding these revisions may be passed to the author by leaving a message on either the Mesilla Valley RCP/M | (505)-524-6920 or the Lost Dutchman's Gold Mine RCP/M | (602)-848-6708 R. Saeks 12/24/84 in by Advanced Logic Systems for public use. Advanced Logic Systems makes no warrantee on the operation or use of this program or its applicability for any given application. U3 DOES NOT DOES NOT WORK WITH VERSIONS OF CP/M PRIOR TO CP/M 3.0 The U3 command line takes the form: U3 [d:]afn.aft [user area] If no user area is specified U3 recoverers all erased files on drive d: (or the default if d: is not specified) matching afn.aft and places them is the current user area. If a user area is specified U3 moves all files in the current user area on drive d: (or the default if d: is not specified) matching afn.aft to ; U3 - CP/M PLUS UTILITY FOR RECOVERING ERASED FILES AND FOR ; CHANGING THE USER AREA OF A FILE. This program is based on ; UNERASE.COM in the public domain. It has been modified to ; work with CP/M 3.0 and later, to change the user area of a ; file, and to accept ambiguous files names. It currently ; works with sector sizes of 128, 256 512 and 1024 bytes. It ; is placed in the public domain by Advanced Logic Systems for ; public use. Advanced Logic Systems makes no warrantee on the ; operation or use of this program or its applicability for any ; given application. ; U3 DOES NOT DOES NOT WORK WITH VERSIONS OF CP/M PRIOR TO CP/M 3.0 ; The U3 command line takes the form: ; ; U3 [d:]afn.aft [user area] ; ; If no user area is specified U3 recoverers all erased files on ; drive d: (or the default if d: is not specified) matching ; afn.aft and places them is the current user area. If a user area ; is specified U3 moves all files in the current user area on ; drive d: (or the default if d: is not specified) matching ; afn.aft to the specified user area. ; Versions 1.01 and 1.02 of U3 were prepared by R. Saeks from ; Gale Wolfenbarger's code for version 1.00. Comments regarding ; these revisions may be passed to the author by leaving a ; message on either the ; ; Mesilla Valley RCP/M | (505)-524-6920 ; or the ; Lost Dutchman's Gold Mine RCP/M | (602)-848-6708 ; HISTORY ;12/24/84 REVISED CODE TO PERMIT U3 TO BE USED TO EITHER ;Ver. 1.02 RECOVER AN ERASED FILE OR CHANGE THE USER AREA ; OF A FILE. ADDED AMBIGUOUS FILE SPECIFICATIONS ; REVISED CODE TO WORK ON DISKS WITH ; MORE THAN ONE DIRECTORY TRACK. MOVED CPM 3.0 ; VERSION CHECK CODE TO BEGINNING OF CODE AND ; CORRECTED ERROR TEST IN NODEF. - R. SAEKS ;06/16/84 REVISED TO WORK WITH 1024 BYTE SECTORS AND TO PLACE ;Ver. 1.01 RECOVERED FILES IN CURRENTLY LOGGED USER AREA. ; - R. SAEKS ;12/29/83 FIRST PASS AT DISASSEMBLY OF UNERASE.COM AND MODIFICATIONS ;Ver. 1.00 TO MAKE IT COMPATIBLE WITH CP/M PLUS ; I ALSO DID A SELECT DISK IN DSKPRM SO THAT IF YOU TRY TO ; RECOVER A FILE FROM A DISK THAT IS A DIFFERENT FORMAT FROM ; THE ONE THAT YOU ARE CURRENTLY LOGGED ON TO, ITS GETS THE ; RIGHT DPH. AT THE SAME TIME I CHANGED THE SIZE OF THE AREA ; WHERE THE NUMBER OF RESERVED SYSTEM TRACKS IS KEPT. THIS ; ALLOWS THE NUMBER OF RESERVED TRACKS TO BE GREATER THAN 256. ; - GALE WOLFENBARGER ; ADDRESSES BDOS: EQU 05H ;BDOS VECTOR ADDRESS WRMBOOT:EQU 00H ;WARM BOOT VECTOR ADDRESS DEFFCB: EQU 5CH ;ADDRESS OF THE DEFAULT FCB DEFFCB2:EQU 6CH ;ADDRESS OF THE SECOND DEFAULT FCB ; BDOS FUNCTIONS DIRCALL:EQU 32H ;CPM 3.0 DIRECT BIOS CALL DRESET: EQU 0DH ;RESET DISK SYSTEM GETCUR: EQU 19H ;GET CURRENTLY LOGGED IN DISK GETUSR: EQU 20H ;GET CURRENT USER CONIN: EQU 01H ;GET A CHARACTER FROM THE CONSOLE CONOUT: EQU 02H ;PRINT A CHARACTER TO THE CONSOLE SETDMA: EQU 1AH ;SET DMA FUNCTION GETVER: EQU 0CH ;GET CPM VERSION # GETPARM:EQU 1FH ;GET ADDRESS OF DISK PARAMETERS PRINT: EQU 09H ;PRINT STRING TO CONSOLE ; ASCII CHARACTERS CR: EQU 0DH ;CARRIAGE RETURN LF: EQU 0AH ;LINE FEED ; I USED MACROS FROM Z80.LIB TO IMPLEMENT SOME Z80 COMMANDS ; BECAUSE MAC.COM AND Z80.LIB COME WITH CP/M PLUS. ; IF YOU ARE USING ASM.COM OR NOT USING A Z80 PROCESSOR ; YOU WILL HAVE TO USE EQUATES OR INSERT INLINE CODE FOR THE ; Z80 MACROS - gw MACLIB Z80 ORG 100H JMP START DB 'U3 ver 1.02' DB 'FOR CPM 3.0' DB '12/29/83 - gw' DB 'Rev 06/16/84, 12/24/84 - rs' ORG 200H START: LXI SP,START CALL SETUP CALL RDDIR CALL FINISH JMP WRMBOOT SETUP: CALL CKVERS ;CHECK FOR CPM 3.0 OR LATER CALL CKNAME ;CHECK FOR VALID FILE NAME CALL SETSRCDST ;SET SOURCE AND DESTINATION USERS CALL SETBIOS ;COPY BIOS JUMP VECTOR RET RDDIR: CALL GETDIR ;READ A DIRECTORY SECTOR RZ ;END OR READ ERROR CALL CKENT ;CHECK ENTRIES FOR FILE JMP RDDIR FINISH: MVI C,DRESET ;RESET DISK SYSTEM CALL BDOS LDA NOREC ;GET NUMBER of DIR FOUND ORA A JZ NOTFND ;NON FOUND LDA SRCUSR CPI 0E5H JZ RECOVMSG LXI D,CHGMSG JMP PRINTMSG RECOVMSG: LXI D,RECMSG PRINTMSG: CALL PRTMSG ;PRINT SUCCESS MESSAGE RET NOTFND: LXI D,FILERR CALL PRTMSG RET CKVERS: MVI C,GETVER ;GET CPM VERSION # CALL BDOS CPI 30H ;IS IT 3.0 OR GREATER JC ONLY30 ;THIS VERSION FOR CPM 3.0 AND LATER RET CKNAME: LDA DEFFCB ;GET DRIVE FOR FILE ORA A ;USE DEFAULT? JNZ NODEF ;NO CONVERT TO FCB FORMAT MVI C,GETCUR ;GET CURRENT DISK CALL BDOS INR A ;SET UP FOR DECREMENT NODEF: DCR A ;CONVERT TO FCB FORMAT STA DEFFCB ;SAVE IT LDA DEFFCB+1 ;CHECK FOR NO FILE CPI ' '+1 RNC ;RETURN IF OK LXI D,NAMERR ;PRINT FILE ERROR CALL PRTMSG JMP WRMBOOT ;GIVE UP SETSRCDST: MVI C,GETUSR ;GET USER # MVI E,0FFH ;GET USER FLAG CALL BDOS STA CURUSR ;SAVE USER # LXI H,DEFFCB2+1 ;POINT TO 1ST DESTINATION CHAR. MVI A,' ' CMP M! JZ UNERASE ;UNERASE IF NO DEST. USER # MVI B,'0' MOV C,M INX H CMP M JZ CHGUSR ;SINGLE DIGIT ASCII USER # IN BC MOV B,C MOV C,M INX H CMP M JNZ USRERROR ;TWO DIGIT ASCII USER # IN BC IF ZERO CHGUSR: MVI D,0 ;INITIAL VALUE FOR HIGH DIGIT MVI A,'0' CMP B JZ CHGUSR1 ;OK IF HIGH DIGIT IS '0' INR A ;A = '1' CMP B JNZ USRERROR ;ERROR IF HIGH DIGIT NOT '0' OR '1' MVI D,10 ;VALUE FOR HIGH DIGIT IF '1' CHGUSR1: MVI A,'0'-1 CMP C JNC USRERROR ;ERROR IF LOW DIGIT < '0' MVI A,'9' CMP C JC USRERROR ;ERROR IF LOW DIGIT > 9 MOV A,C SBI '0' ;MAKE LOW DIGIT HEX ADD D CPI 16 JNC USRERROR ;ERROR IF USER # > 15 STA DSTUSR ;DEST. USER # IN HEX LDA CURUSR STA SRCUSR ;SOURCE USER # IS CURRENT USER # RET UNERASE: LDA CURUSR ;PLACE FILE IN CURRENT USER STA DSTUSR MVI A,0E5H ;E5H = ERASED FILE "USER #" STA SRCUSR RET USRERROR: LXI D,USRERR CALL PRTMSG JMP WRMBOOT SETBIOS: ;SET UP LOCAL BIOS JUMP VECTOR LXI B,LOCDMA ;GET DEFAULT DMA ADDRESS SBCD BCREG MVI A,12 ;SET DMA TO DEFAULT STA FUNC CALL CALLBIOS CALL DSKPRM ;GET DISK PARAMETERS FROM BDOS LDA DEFFCB ;SELECT DRIVE MOV C,A MVI B,0 MOV E,B SBCD BCREG ;BIOS SELDSK FUNCTION SDED DEREG MVI A,9 ;SELDSK STA FUNC CALL CALLBIOS MOV A,H ORA L ;CHECK FOR DRIVE ERROR JZ NODRV ;GO REPORT IT MOV E,M ;GET DPH ADDRESS INX H MOV D,M XCHG SHLD DPHADD ;SAVE ADDRESS TO DPH RET DSKPRM: LDA DEFFCB MOV E,A MVI C,14 ;SELECT DISK CALL BDOS MVI C,GETPARM ;GET ADDRESS OF DISK PARMS CALL BDOS MOV E,M ;GET LOGICAL SPT INX H MOV D,M SDED SPT LXI D,6 ;OFFSET TO DRM (# OF DIRECTORY ENTRIES) DAD D ;ADD OFFSET MOV E,M ;GET DRM INX H MOV D,M PUSH D PUSH H LXI D,7 ;POINT TO PSH DAD D MOV A,M ;GET IT STA PSH ;SAVE IT POP H POP D XCHG INX H ;ADD 1 FOR TOTAL DIRECTORY ENTRIES LDA PSH CPI 3 ;1024 BYTE SECTORS CZ PSH1024 LDA PSH CPI 2 ;512 BYTE SECTORS CZ PSH512 LDA PSH CPI 1 ;256 BYTE SECTORS CZ PSH256 LDA PSH ORA A ;128 BYTE SECTORS CZ PSH128 MOV A,L ;SAVE # OF DIRECTORY SECTORS STA DIRSECTS LHLD SPT ;LOGICAL SECTORS PER TRACK LDA PSH CPI 3 ;1024 BYTE SECTORS CZ DIV8 LDA PSH CPI 2 ;512 BYTE SECTORS CZ DIV4 LDA PSH CPI 1 ;256 BYTE SECTORS CZ DIV2 MOV A,L ;PHSPT = SPT FOR 128 BYTE SECTORS STA PHSPT ;PHYSICAL SECTORS PER TRACK LXI H,5 ;ADD OFFSET TO NUMBER OF RESERVED TRACKS DAD D MOV E,M ;GET NUMBER OF RESERVED TRACKS INX H MOV D,M SDED RESTKS ;SAVE RESERVED TRACKS FOR LATER RET ONLY30: LXI D,ERR30 ;PRINT MESSAGE FOR CPM PLUS ONLY CALL PRTMSG JMP WRMBOOT GETDIR: LDA DIRSECTS ;GET # OF DIRECTORY SECTORS ORA A RZ ;RETURN IF NONE CALL PHSECTRK ;COMPUTE CURRENT PHYSICAL SECTOR AND TRACK LBCD RESTKS ;GET NUMBER OF RESERVED TRACKS IN BC MVI H,0 ;GET PHYSICAL TRACK NUMBER IN HL LDA PHTRK MOV L,A DAD B ;DIRECTORY TRACK IN HL SHLD BCREG ;SET TRACK TO DIRECTORY MVI A,10 ;SETTRK STA FUNC CALL CALLBIOS LDA PHSECT ;GET CURRENT PHYSICAL SECTOR MOV C,A CALL TRNSEC ;TRANSLATE SECTOR IF NECESSARY MVI B,0 SBCD BCREG ;POINT TO CURRENT SECTOR MVI A,11 ;SETSEC STA FUNC CALL CALLBIOS MVI A,13 ;READ SECTOR OF DIRECTORY STA FUNC CALL CALLBIOS ANI 1 XRI 1 RET CKENT: XRA A ;ZERO FLAG STA RECFLG LDA DVD ;GET NUMBER OF DIRECTORY ENTRIES PER SECTOR MOV B,A LXI H,LOCDMA CKNXT: LDA SRCUSR MOV D,A ;SOURCE USER # IN D MOV A,M ;GET BYTE CMP D ;CHECK FOR SOURCE USER # JNZ GETNXT ;NOPE SKIP PUSH H CALL CKFIL ;YES CHECK FOR RECOVERY POP H RECENT: JNZ GETNXT LDA DSTUSR MOV M,A ;RECOVER/CHANGE THE ENTRY MVI A,0FH ;SET RECOVERED FLAG STA RECFLG LDA NOREC ;INCREMENT NUMBER OF RECORDS FOUND INR A STA NOREC GETNXT: LXI D,32 ;ADVANCE TO NEXT ENTRY DAD D DCR B ;DECREMENT COUNTER JNZ CKNXT LDA RECFLG ;CHECK FOR RECOVERED/CHANGED ENTRY ORA A JZ LOOP ;NOPE CONTINUE LOOP ;WRITE SECTOR BACK TO DISK IF FILE REC/CHG CALL PHSECTRK ;COMPUTE CURRENT PHYSICAL SECTOR AND TRACK LBCD RESTKS ;GET NUMBER OF RESERVED TRACKS IN BC MVI H,0 ;GET PHYSICAL TRACK NUMBER IN HL LDA PHTRK MOV L,A DAD B ;DIRECTORY TRACK IN HL SHLD BCREG ;SET TRACK TO DIRECTORY MVI A,10 ;SETTRK STA FUNC CALL CALLBIOS LDA PHSECT ;GET CURRENT PHYSICAL SECTOR MOV C,A CALL TRNSEC ;TRANSLATE SECTOR MVI B,0 SBCD BCREG ;POINT TO CURRENT SECTOR MVI A,11 ;SETSEC STA FUNC CALL CALLBIOS LXI B,1 ;NONE DEFERRED WRITE SBCD BCREG MVI A,14 ;WRITE STA FUNC CALL CALLBIOS ;UPDATE DIRECTORY ORA A ;CHECK FOR WRITE ERROR JNZ WRTERROR ;REPORT ERROR LOOP: LDA DIRSECTS ;DECREMENT DIRECTORY SECTORS DCR A STA DIRSECTS LDA SECTOR ;INCREMENT SECTOR INR A STA SECTOR RET CKFIL: INX H ;CHECK DELETED ENTRY FOR RECOVERY LXI D,DEFFCB+1 ;POINT AT FILE TO BE RECOVERED XCHG MVI C,11 ;LOOK AT 11 CHARACTERS CMPFIL: MVI A,'?' ;CHECK TO SEE IF SPEC IS AMBIGUOUS CMP M JZ NXTCHR LDAX D ;GET" CHARACTER IN NAME ANI 7FH ;TURN OFF HIGH BIT CMP M ;ARE THEY EQUAL? RNZ ;NOPE GO GET ANOTHER ENTRY NXTCHR: INX D ;YES, CONTINUE INX H DCR C JNZ CMPFIL RET PSH1024: MVI A,32 ;SET NUMBER OF DIRECTORY ENTRIES PER SECTOR STA DVD JMP DIV32 PSH512: MVI A,16 ;SET NUMBER OF DIRECTORY ENTRIES PER SECTOR STA DVD JMP DIV16 PSH256: MVI A,8 ;SET NUMBER OF DIRECTORY ENTRIES PER SECTOR STA DVD JMP DIV8 PSH128: MVI A,4 ;SET NUMBER OF DIRECTORY ENTRIES PER SECTOR STA DVD JMP DIV4 DIV32: ;DIVIDE HL BY 32 CALL DIV2 DIV16: ;DIVIDE HL BY 32 CALL DIV2 DIV8: ;DIVIDE HL BY 32 CALL DIV2 DIV4: ;DIVIDE HL BY 32 CALL DIV2 DIV2: ;DIVIDE HL BY 2 ROUTINE XRA A ;CLEAR CARRY MOV A,H ;GET HIGH ORDER BYTE RAR ;SHIFT RIGHT FOR A DIVIDE BY 2 MOV H,A MOV A,L ;GET LOW ORDER BYTE RAR ;SHIFT RIGHT FOR A DIVIDE BY 2 MOV L,A RET PHSECTRK: MVI C,0 ;SET PHTRK TO 0 LDA PHSPT MOV B,A ;PHYS SPT IN B LDA SECTOR ;LOGICAL DIRECTORY SECTOR  CKPHTRK: CMP B ;COMPUTE PHSECT = SECTORS MOD PHSPT JC STSECTRK ;AND PHTRK = (SECTORS - PHSECT)/PHSPT SUB B INR C JMP CKPHTRK STSECTRK: STA PHSECT MOV A,C STA PHTRK RET PRTMSG: MVI C,PRINT ;PRINT STRING TO CONSOLE JMP BDOS NODRV: ;PRINT DRIVE ERROR MESSAGE LXI D,DRVERR CALL PRTMSG JMP WRMBOOT WRTERROR: ;PRINT WRITE ERROR MESSAGE LXI D,WRTERR CALL PRTMSG JMP WRMBOOT TRNSEC: LHLD DPHADD ;GET TRANSLATE TABLE ADDRESS XCHG SBCD BCREG SDED DEREG MVI A,16 ;SECTRAN STA FUNC CALL CALLBIOS MOV C,L RET CALLBIOS: ;CPM 3.0 DIRECT BIOS CALL MVI C,DIRCALL LXI D,FUN50 CALL BDOS RET FUN50: FUNC: DS 1 AREG: DS 1 BCREG: DS 2 DEREG: DS 2 HLREG: DS 2 DPHADD: DS 2 DIRSECTS: DS 1 RESTKS: DS 2 SECTOR: DB 0 NOREC: DB 0 RECFLG: DB 0 PSH: DS 1 DVD: DB 0 CURUSR: DS 1 SPT: DS 2 PHSPT: DS 1 PHSECT: DS 1 PHTRK: DS 1 SRCUSR: DS 1 DSTUSR: DS 1 WRTERR: DB CR,LF,'Error occurred during disk Write - ABORT$' DRVERR:  DB CR,LF,'Specified an illegal disk drive - ABORT$' RECMSG: DB CR,LF,'File recovered.$' CHGMSG: DB CR,LF,'File user area changed.$' NAMERR: DB CR,LF,'No File Name specified - ABORT$' FILERR: DB CR,LF,'File NOT found$' USRERR: DB CR,LF,'Invalid User Number - ABORT$' ERR30: DB CR,LF,'THIS VERSION OF U3 ONLY WORKS' DB CR,LF,'FOR CPM 3.0 OR LATER',CR,LF,'$' LOCDMA: DS 1024 ;LOCAL DMA BUFFER END  MVI A,16 ;SECTRAN STA FUNC CALL CALLBIOS MOV C,L RET CALLBIOS: ;CPM 3.0 DIRECT BIOS CALL MVI C,DIRCALL LXI D,FUN50 CALL BDOS RET FUN50: FUNC: DS 1 AREG: DS 1 BCREG: DS 2 DEREG: DS 2 HLREG: DS 2 DPHADD: DS 2 DIRSECTS: DS 1 RESTKS: DS 2 SECTOR: DB 0 NOREC: DB 0 RECFLG: DB 0 PSH: DS 1 DVD: DB 0 CURUSR: DS 1 SPT: DS 2 PHSPT: DS 1 PHSECT: DS 1 PHTRK: DS 1 SRCUSR: DS 1 DSTUSR: DS 1 WRTERR: DB CR,LF,'Error occurred during disk Write - ABORT$' DRVERR: :10000000FFC3C3C3C3C3C3C3C3FFFFFFFFFFFFFFE0 :10001000F0F0F0F0F0F0F0F0F0F0FFFFFFFFFFFF86 :100020000F0F0F0F0FF0F0F0F0F0FFFFFFFFFFFFDB :100030000F0F0F0F0FFFFFFFFFFFFFFFFFFFFFFF80 :100040000F0F0F0F0F0F0F0F0F0FFFFFFFFFFFFF20 :10005000FFFFFFFFFF0F0F0F0F0FFFFFFFFFFFFF60 :100060000000000000F0F0F0F0F0FFFFFFFFFFFFE6 :1000700000000000000F0F0F0F0FFFFFFFFFFFFF3B :1000800080C0E0F0F0F8F8FCFEFFFFFFFFFFFFFF8D :100090000000003F3F3F3F3C3C3CFFFFFFFFFFFFB6 :1000A0000103070F0F1F1F3F7FFFFFFFFFFFFFFF32 :1000B0003C3C3C3C3C3C3C3C3C3CFFFFFFFFFFFFEE :1000C0003C3C3CFFFFFFFF3C3C3CFFFFFFFFFFFFD2 :1000D00000003C7E7E7E7E3C0000FFFFFFFFFFFFB6 :1000E000F0F0F0F0F00F0F0F0F0FFFFFFFFFFFFF1B :1000F000000000FFFFFFFF3C3C3CFFFFFFFFFFFF56 :1001000000000010000010000000FFFFFFFFFFFFD5 :10011000FFFFFFFFFFF0F0F0F0F0FFFFFFFFFFFF3A :10012000F0F0F0F0F00000000000FFFFFFFFFFFF25 :10013000003C4299A1A199423C00FFFFFFFFFFFF55 :100140000F0F0F0F0F0000000000FFFFFFFFFFFF6A :10015000FF7F3F1F1F0F0F070301FFFFFFFFFFFF81 :10016000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F :10017000FFFFFFFFFF0000000000FFFFFFFFFFFF8A :100180000000000000FFFFFFFFFFFFFFFFFFFFFF7A :10019000FFFEFCF8F8F0F0E0C080FFFFFFFFFFFF7C :1001A000F0F0F0F0F0FFFFFFFFFFFFFFFFFFFFFFAA :1001B000000000FFFFFFFF000000FFFFFFFFFFFF49 :1001C0003C3C3C3F3F3F3F000000FFFFFFFFFFFF85 :1001D000C0C6CCD8306EC306183FFFFFFFFFFFFF3D :1001E0003C3C3CFFFFFFFF000000FFFFFFFFFFFF65 :1001F0003C3C3CFCFCFCFC000000FFFFFFFFFFFF61 :1002000000000000000000000000FFFFFFFFFFFFF4 :1002100000101010101000100000FFFFFFFFFFFF84 :1002200044102844447C44440000FFFFFFFFFFFFCC :100230001E1228140A0424380000FFFFFFFFFFFFEE :1002400000103C50381478100000FFFFFFFFFFFF44 :1002500000000008000008000000FFFFFFFFFFFF94 :1002600000284444584444584040FFFFFFFFFFFF2C :10027000002400344C444C340000FFFFFFFFFFFF1C :1002800000100804040408100000FFFFFFFFFFFF38 :100290000000003E003E00000000FFFFFFFFFFFFE8 :1002A00000102040404020100000FFFFFFFFFFFF34 :1002B00044384444444444380000FFFFFFFFFFFF3C :1002C00000000000001010200000FFFFFFFFFFFFF4 :1002D000000000003E0000#000000FFFFFFFFFFFFE6 :1002E00000000000000000100000FFFFFFFFFFFF04 :1002F00000000408102040000000FFFFFFFFFFFF88 :100300000038444C546444380000FFFFFFFFFFFFF7 :10031000001030501010107C0000FFFFFFFFFFFFA7 :10032000003844043840447C0000FFFFFFFFFFFF1B :10033000007C4408180444380000FFFFFFFFFFFF63 :1003400000181828487C081C0000FFFFFFFFFFFF73 :10035000007C4078040444380000FFFFFFFFFFFFEB :1003600000384440784444380000FFFFFFFFFFFF9F :10037000007C4404081020400000FFFFFFFFFFFF47 :1003800000384444384444380000FFFFFFFFFFFFBB :10039000003844443C0444380000FFFFFFFFFFFFE7 :1003A00000100804000000000000FFFFFFFFFFFF37 :1003B00000081020000000000000FFFFFFFFFFFF0B :1003C000000810204C2010080000FFFFFFFFFFFF77 :1003D00000440038444444380000FFFFFFFFFFFFA3 :1003E00000100804320408100000FFFFFFFFFFFFA9 :1003F00000384404081000100000FFFFFFFFFFFF5B :1004000000282828000000000000FFFFFFFFFFFF7A :1004100000102844447C44C60000FFFFFFFFFFFF9C :1004200000F84444784444F80000FFFFFFFFFFFF5A :100430000038444C404044380000FFFFFFFFFFFFFE :1004400000F84444444444F80000FFFFFFFFFFFF6E :1004500000FC4440704044FC0000FFFFFFFFFFFF32 :1004600000FC4440704040E00000FFFFFFFFFFFF42 :10047000003C4440404C443C0000FFFFFFFFFFFFB6 :1004800000C644447C4444C60000FFFFFFFFFFFF5A :1004900000381010101010380000FFFFFFFFFFFFA2 :1004A000001E0404044444380000FFFFFFFFFFFF68 :1004B00000CC4850605048CC0000FFFFFFFFFFFF1A :1004C00000E04040404044FC0000FFFFFFFFFFFF12 :1004D00000C66C54544444C60000FFFFFFFFFFFFFA :1004E00000C64464544C44C60000FFFFFFFFFFFFFA :1004F00000384444444444380000FFFFFFFFFFFF3E :1005000000F84444784040E00000FFFFFFFFFFFF99 :1005100000384444445448360000FFFFFFFFFFFF0B :1005200000F84444785048C60000FFFFFFFFFFFF7B :10053000003A4440380444B80000FFFFFFFFFFFFCB :10054000007C5410101010380000FFFFFFFFFFFF69 :1005500000C64444444444380000FFFFFFFFFFFF4F :1005600000C64444282810100000FFFFFFFFFFFFD3 :1005700000C64444445454280000FFFFFFFFFFFF1F :1005800000C64428102844C60000FFFFFFFFFFFFFD :1005900000C64428101010380000FFFFFFFFFFFFC7 :1005A000007C44081020447C0000FFFFFFFFFFFF99 :1005B00000001824241800000000FFFFFFFFFFFFC9 :1005C0000044004444444C340000FFFFFFFFFFFFA1 :1005D00010101010101010101010FFFFFFFFFFFF81 :1005E00000102844000000000000FFFFFFFFFFFF95 :1005F0000000000000000000FF00FFFFFFFFFFFF02 :100600000028287C287C28280000FFFFFFFFFFFF30 :10061000000000344C444C360000FFFFFFFFFFFF9A :100620000060202C3222326C0000FFFFFFFFFFFF32 :100630000000001C2420201C0000FFFFFFFFFFFF24 :10064000000C04344C444C360000FFFFFFFFFFFF5A :1006500000000038447C403C0000FFFFFFFFFFFF2C :1006600000081410381010380000FFFFFFFFFFFFD4 :10067000000000364C444C340478FFFFFFFFFFFFBE :1006800000C04058644444C60000FFFFFFFFFFFF66 :1006900000100030101010380000FFFFFFFFFFFFB8 :1006A00000000800180808084830FFFFFFFFFFFFA0 :1006B00000602026243824660000FFFFFFFFFFFFB4 :1006C000001808080808081C0000FFFFFFFFFFFFD4 :1006D000000000A8545454C60000FFFFFFFFFFFFB6 :1006E000000000D8644444C60000FFFFFFFFFFFF86 :1006F00000000038444444380000FFFFFFFFFFFFC4 :100700000000006C3222322C2070FFFFFFFFFFFF41 :10071000000000364C444C34040EFFFFFFFFFFFF87 :100720000000006C322020700000FFFFFFFFFFFF81 :100730000000003C403804780000FFFFFFFFFFFF8F :1007400000202078202024180000FFFFFFFFFFFF7B :10075000000000C644444C360000FFFFFFFFFFFFCF :1007600000000063221414080000FFFFFFFFFFFFDA :1007700000000066445454280000FFFFFFFFFFFF05 :10078000000000C6281028C60000FFFFFFFFFFFF83 :10079000000000662222261A023CFFFFFFFFFFFF37 :1007A0000000007C4810247C0000FFFFFFFFFFFFDB :1007B000182408203C0000000000FFFFFFFFFFFF9F :1007C00000000010001010200000FFFFFFFFFFFFDF :1007D0003C041804380000000000FFFFFFFFFFFF8B :1007E00044004444444444380000FFFFFFFFFFFF3F :1007F000AA55AA55AA55AA55AA55FFFFFFFFFF06FD :00000000 6C000001808080808081C0000FFFFFFFFFFFFD4 :1006D000000000A8545454C60000FFFFFFFFFFFFB6 :1006E000000000D8644444C60000FFFFFFFFFFFF86 :1006F00000000038444444380000FFFFFFFFFFFFC4 :100700000000006C3222322C2070FFFFFFFFFFFF41 :10071000000000364C444C34040EFFFFFFSERIF.DOC SERIF.CQ i characte se fo th Executive decorate th Exec' characte se an change thing bit t mak i easie o th eyes o a leas m eyes Unsqueez i and load it using CHARGEN.COM. Submitted by: Robert Schine, Mt. Vernon, New York $:10000000FFC3C3C3C3C3C3C3C3FFFFFFFFFFFFFFE0 :10001000F0F0F0F0F0F0F0F0F0F0FFFFFFFFFFFF86 :100020000F0F0F0F0FF0F0F0F0F0FFFFFFFFFFFFDB :100030000F0F0F0F0FFFFFFFFFFFFFFFFFFFFFFF80 :100040000F0F0F0F0F0F0F0F0F0FFFFFFFFFFFFF20 :10005000FFFFFFFFFF0F0F0F0F0FFFFFFFFFFFFF60 :100060000000000000F0F0F0F0F0FFFFFFFFFFFFE6 :1000700000000000000F0F0F0F0FFFFFFFFFFFFF3B :1000800080C0E0F0F0F8F8FCFEFFFFFFFFFFFFFF8D :100090000000003F3F3F3F3C3C3CFFFFFFFFFFFFB6 :1000A0000103070F0F1F1F3F7FFFFFFFFFFFFFFF32 :1000B0003C3C3C3C3C3C3C3C3C3CFFFFFFFFFFFFEE :1000C0003C3C3CFFFFFFFF3C3C3CFFFFFFFFFFFFD2 :1000D00000003C7E7E7E7E3C0000FFFFFFFFFFFFB6 :1000E000F0F0F0F0F00F0F0F0F0FFFFFFFFFFFFF1B :1000F000000000FFFFFFFF3C3C3CFFFFFFFFFFFF56 :10010000000000FCFCFCFC3C3C3CFFFFFFFFFFFF51 :10011000FFFFFFFFFFF0F0F0F0F0FFFFFFFFFFFF3A :10012000F0F0F0F0F00000000000FFFFFFFFFFFF25 :10013000003C4299A1A199423C00FFFFFFFFFFFF55 :100140000F0F0F0F0F0000000000FFFFFFFFFFFF6A :10015000FF7F3F1F1F0F0F070301FFFFFFFFFFFF81 :10016000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F :10017000FFFFFFFFFF0000000000FFFFFFFFFFFF8A :100180000000000000FFFFFFFFFFFFFFFFFFFFFF7A :10019000FFFEFCF8F8F0F0E0C080FFFFFFFFFFFF7C :1001A000F0F0F0F0F0FFFFFFFFFFFFFFFFFFFFFFAA :1001B000000000FFFFFFFF000000FFFFFFFFFFFF49 :1001C0003C3C3C3F3F3F3F000000FFFFFFFFFFFF85 :1001D000C0C6CCD8306EC306183FFFFFFFFFFFFF3D :1001E0003C3C3CFFFFFFFF000000FFFFFFFFFFFF65 :1001F0003C3C3CFCFCFCFC000000FFFFFFFFFFFF61 :1002000000000000000000000000FFFFFFFFFFFFF4 :1002100018181818181800001800FFFFFFFFFFFF3C :1002200024242424000000000000FFFFFFFFFFFF44 :100230002828287C287C28282800FFFFFFFFFFFFB4 :10024000283E68683C2A2A7C2800FFFFFFFFFFFF4A :1002500000629468102C528C0000FFFFFFFFFFFF2C :1002600038444444384B44443B00FFFFFFFFFFFF4A :1002700000181830000000000000FFFFFFFFFFFF24 :1002800004081020202010080400FFFFFFFFFFFFDC :1002900040201008080810204000FFFFFFFFFFFF6C :1002A00010925438103854921000FFFFFFFFFFFFE8 :1002B00000101010FE1010100000FFFFFFFFFFFFE6 :1002C00000000000000000181830FFFFFFFFFFFFD4 :1002D000000000007E0000000000FFFFFFFFFFFFA6 :1002E00000000000000000001800FFFFFFFFFFFFFC :1002F00000020408102040800000FFFFFFFFFFFF06 :100300003C42464A526242423C00FFFFFFFFFFFF71 :1003100010305010101010107C00FFFFFFFFFFFF87 :100320003C4202023C4040407E00FFFFFFFFFFFFD7 :100330007E0202041C0242423C00FFFFFFFFFFFF5F :10034000040C142444FE04040400FFFFFFFFFFFF1D :100350007E40407C020202423C00FFFFFFFFFFFFA5 :100360001E2040407C4242423C00FFFFFFFFFFFF57 :100370007E020204081020202000FFFFFFFFFFFF85 :100380003C4242423C4242423C00FFFFFFFFFFFF33 :100390003C4242423E0202043800FFFFFFFFFFFFE3 :1003A00000000018000000180000FFFFFFFFFFFF23 :1003B00000000018000000181830FFFFFFFFFFFFCB :1003C00004081020402010080400FFFFFFFFFFFF7B :1003D0000000007C007C00000000FFFFFFFFFFFF2B :1003E00040201008040810204000FFFFFFFFFFFF1F :1003F00038440404181010001000FFFFFFFFFFFF37 :100400003C42425A565C40423C00FFFFFFFFFFFF68 :100410003C424242427E42424200FFFFFFFFFFFF5A :100420007C4242427C4242427C00FFFFFFFFFFFFD2 :100430003C424040404040423C00FFFFFFFFFFFF86 :100440007C424242424242427C00FFFFFFFFFFFFEC :100450007E4040407C4040407E00FFFFFFFFFFFFAA :100460007C404040784040404000FFFFFFFFFFFFDE :100470003C424240404E44443C00FFFFFFFFFFFF30 :10048000424242427E4242424200FFFFFFFFFFFFE4 :1004900038101010101010103800FFFFFFFFFFFF82 :1004A00004040404040404847800FFFFFFFFFFFF3A :1004B00042444870605048444200FFFFFFFFFFFF86 :1004C00040404040404040407C00FFFFFFFFFFFFB6 :1004D000C6C6AABA929282828200FFFFFFFFFFFF88 :1004E000424262524A4642424200FFFFFFFFFFFF84 :1004F0003C424242424242423C00FFFFFFFFFFFFBC :100500007C4242427C4040404000FFFFFFFFFFFF33 :100510003C424242425A443A0300FFFFFFFFFFFFC2 :100520007C4242427C4848444200FFFFFFFFFFFFFD :100530003C4240403C0202423C00FFFFFFFFFFFF05 :10054000FE101010101010101000FFFFFFFFFFFF33 :1005500042424242424242423C00FFFFFFFFFFFF55 :1005600042424242424224241800FFFFFFFFFFFFA5 :1005700082828282829292AAC600FFFFFFFFFFFF63 :1005800042424224182442424200FFFFFFFFFFFF85 :10059000414122221C0808080800FFFFFFFFFFFF5F :1005A0007E020408102040407E00FFFFFFFFFFFF97 :1005B0007E606060606060607E00FFFFFFFFFFFFA5 :1005C00000804020100804020000FFFFFFFFFFFF33 :1005D0007E060606060606067E00FFFFFFFFFFFFFB :1005E00000001028448200000000FFFFFFFFFFFF13 :1005F00000000000000000007C00FFFFFFFFFFFF85 :1006000000303018000000000000FFFFFFFFFFFF78 :1006100000003A46424242463B00FFFFFFFFFFFF19 :1006200040407C42424242427C00FFFFFFFFFFFF0E :1006300000003C40404040403C00FFFFFFFFFFFF08 :1006400002023E42424242423E00FFFFFFFFFFFFE6 :1006500000003C42427E40403E00FFFFFFFFFFFFA4 :100660001C222020782020202000FFFFFFFFFFFF1A :1006700000003E424242427E027CFFFFFFFFFFFF3E :1006800040407C42424242424200FFFFFFFFFFFFE8 :1006900010001010101010101000FFFFFFFFFFFFE0 :1006A0000200020202020202423CFFFFFFFFFFFFC4 :1006B00040404448704848444200FFFFFFFFFFFFAE :1006C00010101010101010101000FFFFFFFFFFFFA0 :1006D0000000EC92929292929200FFFFFFFFFFFFC8 :1006E00000007C42424242424200FFFFFFFFFFFF08 :1006F00000003C42424242423C00FFFFFFFFFFFF3E :1007000000007C424242427C4040FFFFFFFFFFFF6F :1007100000003E424242423E0202FFFFFF%FFFFFF57 :1007200000007C42404040404000FFFFFFFFFFFFD1 :1007300000003C42403C02423C00FFFFFFFFFFFF45 :1007400010107C10101010100C00FFFFFFFFFFFFB7 :1007500000004242424242423E00FFFFFFFFFFFFD5 :1007600000004141222214140800FFFFFFFFFFFF99 :1007700000009292929292926C00FFFFFFFFFFFFA7 :1007800000004242241824424200FFFFFFFFFFFF07 :10079000000042424242423E026CFFFFFFFFFFFF69 :1007A00000007E02040810207E00FFFFFFFFFFFF15 :1007B00000182020602020180000FFFFFFFFFFFF2F :1007C00010101010000010101010FFFFFFFFFFFFAF :1007D000003008080C0808300000FFFFFFFFFFFF93 :1007E00000000020540800000000FFFFFFFFFFFF93 :1007F000AA55AA55AA55AA55AA55FFFFFFFFFF06FD :00000000 6C00010101010101010101000FFFFFFFFFFFFA0 :1006D0000000EC92929292929200FFFFFFFFFFFFC8 :1006E00000007C42424242424200FFFFFFFFFFFF08 :1006F00000003C42424242423C00FFFFFFFFFFFF3E :1007000000007C424242427C4040FFFFFFFFFFFF6F :1007100000003E424242423E0202FFFFFF04/10/85 Ultimate.Chr Use USQ to unsqueeze Ultimate.Chr -- then Use the CHARGEN utility to laod this program into the system tracks. With due respects to Ari Feldman, designer of "Best.Chr", I use his design as my "alternative character set". Since I'm over-forty and my eyes need LARGER characters now, I designed "Ultimate.Chr" to more closely resemble the size appearing on a full-size monitor. "Ultimate.Chr" uses the very maximum on-screen character space available while still providing separation between lines. I tried a double-dot version but the results are too "busy- looking" on the screen. Since Osborne doesn't make full use of the internal monitor space available, I advise going inside and adjusting the vertical and horizontal capability as well. The final result is a crisp and handsome-looking font-set that's easy on the eyes and is the next best thing to a full-size screen. Dave Mack a soon-to-become FOG member Vallejo, California "Long live CP/M!" aod this program into the system tracks. With due respects to Ari Feldman, designer of "Best.Chr", I use his design as my "alternative character set". Since I'm over-forty and my eyes need LARGER characters now, I designed "Ultimate.Chr" to more closely resemble the size appearing on a full-size monitor. "Ultimate.Chr" uses the very maximum on-screen character space available while still providing separation between lines. I tried a double-dot version but the results are too "busy- looking" on the screen. Since Osborne doesn't make full use of the internal monitor space available, I advise going inside and adjusting the vertical and horizontal capability as well. The final result is a crisp and handsome-looking font-set that's easy on the eyes and is the next best thing to a full-size screen. Dave Mack a soon-to-become FOG member Vallejo,  This is the release date of the disk. KWAIT20ASM x-CPM005 DOC SHOW1 COM ySHOW1 DOC zSUB1 SUB {SUB2 SUB |WAIT0 COM }WAIT1 COM ~WAIT2 COM WAIT3 COM WAIT4 COM WAIT5 COM WAIT6 COM QS COM MAKEST20.DOC DB 76 7296 57 MAKEST20.ASM E4 FD 28032 219 MKWAIT20.COM 67 DF 6144 48 MKWAIT20.DOC 58 5B 12288 96 MKWAIT20.ASM 02 51 33536 262 SHOW1 .COM E3 0B 256 2 SHOW1 .DOC 59 F6 768 6 SUB1 .SUB 2D F9 128 1 SUB2 .SUB 2C 5A 128 1 WAIT0 .COM 33 24 1024 8 WAIT1 .COM 7D 17 1024 8 WAIT2 .COM 5B 18 1024 8 WAIT3  Fog Library Disk FOG-CPM.005 Copyright (1985) by Fog International Computer Users Group to the extent not copyrighted by the original author for the exclusive use and enjoyment of its members. Any reproduction or distribution for profit or personal gain is strictly forbidden. For information, contact FOG, P. O. Box 3474, Daly City, CA. 94015-0474. as part of the description of a file indicates that the program is distributed on a "try first, pay if you like it" basis. If you find the program(s) meet your need, please refer to the author's documentation for information on becoming a registered user. Only by registering and paying for the programs you like and use will the authors of such programs continue development. Often, more complete documentation, additional modules, and new releases are available only to registered users. Osborne Executive and CPM+ programs. Filename Description -10-00 .85 This is the release date of the disk.& -CPM005 .DOC This is the description of the disk contents. CPM3LIB .DOC ED71 9K [CPM3LIB 1 of 2] M80 library of standard CPM+ functions. CPM3LIB .REL FE20 2K [CPM3LIB 2 of 2] EPOXLINK.COM 382E 3K [Epoxlink 1 of 2] Communications program for an Executive to connect with an Epson PX-8 using FILINK software. EPOXLINK.DOC EDC8 3K [Epoxlink 2 of 2] KEY2SCRN.COM BC97 1K [KEY2SCRN 1 of 2] Displays Executive function key settings on screen. KEY2SCRN.DOC 7569 1K [KEY2SCRN 2 of 2] LBRDISK .COM C099 6K [LBRDISK 1 of 2] Library directory program for CPM+ systems. LBRDISK .DOC D173 1K [LBRDISK 2 of 2] MAKEST20.COM C779 5K ver. 2.0 [Make EXECST 1 of 3] Make or edit EXECST.COM files. MAKEST20.DOC DB76 8K ver. 2.0 [Make EXECST 2 of 3] MAKEST20.ASM E4FD 28K ver. 2.0 [Make EXECST 3 of 3] MKWAIT20.COM 67DF 6K ver. 2.0 [Make WAIT 1 of 14] Wait for input from program error message. Includes source and demonstration program. MKWAIT20.DOC 585B 12K ver. 2.0 [Make WAIT 2 of 14] MKWAIT20.ASM 0251 33K ver. 2.0 [Make WAIT 3 of 14] SHOW1 .COM E30B 1K ver. 2.0 [Make WAIT 4 of 14] SHOW1 .DOC 59F6 1K ver. 2.0 [Make WAIT 5 of 14] SUB1 .SUB 2DF9 1K ver. 2.0 [Make WAIT 6 of 14] SUB2 .SUB 2C5A 1K ver. 2.0 [Make WAIT 7 of 14] WAIT0 .COM 3324 1K ver. 2.0 [Make WAIT 8 of 14] WAIT1 .COM 7D17 1K ver. 2.0 [Make WAIT 9 of 14] WAIT2 .COM 5B18 1K ver. 2.0 [Make WAIT 10 of 14] WAIT3 .COM 01F4 1K ver. 2.0 [Make WAIT 11 of 14] WAIT4 .COM FC13 1K ver. 2.0 [Make WAIT 12 of 14] WAIT5 .COM 05FD 1K ver. 2.0 [Make WAIT 13 of 14] WAIT6 .COM DBCF 1K ver. 2.0 [Make WAIT 14 of 14] QS .COM 3B70 1K [Quick Set 1 of 2] Set your attributes quickly and easily. QS  .DOC ED4C 1K [Quick Set 2 of 2] SCDATE .COM D5CB 1K [SCDATE 1 of 3] Set SuperCalc date from Executive clock upon boot. SCDATE .DOC AF44 1K [SCDATE 2 of 3] SCDATE .ASM 5289 5K [SCDATE 3 of 3] U3#102 .COM 1D2D 2K ver. 10.2 [Unerase3 1 of 3] Restore deleted (erased) files on CP/M 3.0 system. Includes source code. U3#102 .DOC 84E6 2K ver. 10.2 [Unerase3 2 of 3] U3 .ASM BDF9 13K ver. 10.2 [Unerase3 3 of 3] SERIF .CHR 63A0 6K [Serif Characters 1 of 2] Alternate character set (with serifs) for Osborne Executive. SERIF .DOC E603 1K [Serif Characters 2 of 2] ULTIMATE.CHR AA20 6K [Ultimate Character 1 of 2] Alternate character set for Osborne Executive. ULTIMATE.DOC 870F 2K [Ultimate Character 2 of 2] e code. U3#102 .DOC 84E6 2K ver. 10.2 [Unerase3 2 of 3] U3 .ASM BDF9 13K ver This is the release date of the disk. KWAIT20ASM h@KWAIT20ASM x-CPM005 DOC SHOW1 COM ySHOW1 DOC zSUB1 SUB {SUB2 SUB |WAIT0 COM }WAIT1 COM ~WAIT2 COM WAIT3 COM WAIT4 COM WAIT5 COM WAIT6 COM '