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`LMNOPQRSTUVWMKWAIT20ASM€XYZ[\]^_`abcdefgMKWAIT20ASM€hijklmnopqrstuvwMKWAIT20ASMx-CPM005 DOC ®¯°±SHOW1 COMySHOW1 DOCzSUB1 SUB{SUB2 SUB|WAIT0 COM}WAIT1 COM~WAIT2 COMWAIT3 COM€WAIT4 COM�WAIT5 COM‚WAIT6 COMƒQS COM„QS DOC…SCDATE COM†SCDATE DOC‡SCDATE ASM&ˆ‰Š‹ŒU3#102 COM �ŽU3#102 DOC ��U3 ASMd‘’“”•–—˜™š›œ�SERIF CHR.žŸ ¡¢£SERIF DOC¤ULTIMATECHR.¥¦§¨©ª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ì  re…RP�UQ T”$TI@ÖŒêÅj†œÀñ•¢r³@ ÝõN€ã«D\4©ÐxFV=,ÙULl øF»aS@òé•P‚0k ”€@j1Yµ¸‚ʧ@°Tuh€ ìЛ[€Tèü=}S 9¼LØ@ÉxFVu´X/HX(ͪ «D‡C¡ØÀbøX?ÜÀFHÈK€`X,–K `„Ì�€8€€ rÚ0ˈBIOSŽ€T”$THÈXIMXDEVœ…’Q“‘U d”däDUi@ÕŠÕT°Qš:À!inʧ@ QU@b�€Á¥ó —Ä`V`´M`õ¢Ád°\!@2ëXT8Bÿ°éPµ2’SÔã %9Zp…’QÕU d”uDDUh%MQZP5Mz±Z§çðµCÀ/÷û‹ ª@½›M€,‹%êÅjŸŸÀV• T€YxFVuˆªXùüͦÀ :,!©@qXê¤!ØÂ#»¬1a�@Ô� jPµ,ZšÉ(ꈈªÑÑ  ’¦¨ˆŠ­8…’QÕSÑ d”uDÔôI@Ô ŠÕ?9�ïP°Qš‡ÜÀò:€C‘Þ.`zîÉ?„a0+ £2X­QÕ»[°ªà½¢Ád³hàªá€­ðTŽ:·€«‚½eWPðaG€€9›i@WŽ:·à Û\¶”uq@㫀͵ÀÔ¼øÎÕãÓëE‚É<-Ù�+ Ô2RwƒxG>¤ÍçÄÑ�’–ßKoÀ%¸Ü n·[Š-ÆŽ§€d•D”ÔU(èTIMERSœ…SQ`UD”ÔT(Q%5P5Ù–€® ¬Eq€M&ÈÜ �ÌÝ my\ ¡t2ÚË”Uq]n0 ›bÀEWÖ!¹€,ÚÆ>„‚b6mc ÂA16±€ ®@ ¬Ct€YµŒ|: ÄlÚÆ>‚b6mcdŸ„`àS6¶€ ax"Ò­ÀYÁÖdˆ­¨ ¬EmÀM&¹B6ìš ­øªÝ€„@àm<=�G¯+BÆŠ­¨ ÜF6‰Â«v+›@'—0 …p+qð•pjñ•À>¤ÍçÄÑ�µv‡—ñ‘…k€À® žFW Ê!²€!`8^<¿€L+è:¸+vô8Ï©3yñ4gq¶¨ 0Fü Éäep@O£Á•Â[pX†à€Ÿ‚A5xHF?‚jð�Œ&~ Õá!U¹uˆmè 6ºˆÙµÐFÍ®€,’iðB‚ q•Ø<…Éã«°]€è\Þ| ™Ü§ÔÙ¼øš3�ÛUŒÆ3�XUÖy “Í#«°3²OÀðx<æ‘ÐètŽ~sÐ š¼$dŸ‚B0˜…bÀY!ðà|<Ãáàøx>M7›Š‡S)\Êd*¤c‘¤¦a:Φém¸ ¶ä[v-½–ßËoÀe¸2Ün · [ˆ-Æ–äËr€e¹€2Ý nÀ ·d:SQc¯ Q%5 p…’SVU d”Õ„DUi@Ô€ŠÕ  D„å»*Œ Ö ž â`E‚ÉŒ‚€D$”õ8èIMXDEVœ…’SÔàD$”õ9@ÔŒeGC*6"¤ ±0DTt2Ѱ-–Ž€KGÀ%¤ Ò0èBIOSœ…�ÒÐP”• d4´%%I@Ô@?Ù P˜þÈØ 0:�ÒÐP”•'ž…’SÔàD$”õ9@ÔŒeGC*6"¤ ±0DTt2Ѱ-–Ž€KGÀ%¤ Ò0èBIOSœ…�ÒÐP”• d4´%%I@Ô@?Ù P˜þÈØ¶”uq@㫀͵ÀÔ¼øÎÕãÓëE‚É<-Ù�+ Ô2RwƒxG>¤ÍçÄÑ�’–ßKoÀ%¸Ü n·[Š-ÆŽ§€d•D”ÔU(èTIMERSœ…SQ`UD”ÔT(Q%5P5Ù–€® ¬Eq€M&ÈÜ �ÌÝ my\ ¡t2ÚË”Uq]n0 ›bÀEWÖ!¹€,ÚÆ>„‚b6mc ÂA16±€ ®@ ¬Ct€YµŒ|: ÄlÚÆ>‚b6mcdŸ„`àS6¶ÃREPOXLINK 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³ÍÃqþX¢Íù Í–Í.ÍþÚ׊ Íþ!p "� ‡‡‡‡‡O!� åë*� ëá í°åë"� ëá:Œ <2Œ þAÒ;ÍþÚÝ!p "�  ÿÿÅÕRÍMÍb ÑÁÊ8ÅÕÍAÑÁþSÊ[{·ÂÂ# ÍRÍMÍb ÊHÍAþSÂHGÍM*� ] í°"� ÍèÍ<… ʘ Í| ÍMÍAþÂ}Í.!] ^ÍMÍA»ÂÇ{æ_Íxþ².Í#•ÍMÍAþ ·òÏ?ÍÃ}› Í€ÍÍ·ÂÍMÍAþPÂæ.Í!€€^ÍM{©O#ÂÿYÍMÍAþBÊæþGÊÕÃÍMÍöÂ3ÿÍ·Ê*!Œ 5Â`ÍMÍ.Q ÍÉÍ–Í.Íõ Íñ_Í!\@  í°:‡ 2ˆ ÿÍ ·Âš Í- ÍÍÊʉÍ| ÍAþR‰SÍMÍ| ÍAþGŸÍAþ¼Í.Q ÍÉ\!@  í°õ:ˆ 2‡ ñþÊà_ÍXÍMêÍM!M  ÍAþ ÚØw_ÍM#ÂêÍAþÂØ]!M  :‡ ·Êþ?Â~# Í.!M ͳ:‡ ·Ê]!gÍAÍAÃ]~+þ ÂXÂAÉ~+þ ÂX#6$+ÂMÉä Í!]ͳÍè¯2‹ Í<ʦì ÍÍÍÍ þN“ÍÍ–ÃþYÂÍ!‹ 6É Í!eU ~6$#®ÍÍ<· Êw>ÿ2Š  ÍMÕ Í!€€ÍAþÊóþÊBNÍMÃÞPÍMÍAw©O#ÂøÍA©ÊBÍBÍMÃ×.Í€ÍÍ·Ê:Íö¯2Š  ÃwGÍMÃ×ÍAõÍöÂXÍ| ÿÍ·ÊL!\L  í°¯2X 2[ :‹ ·Ê„L Íþÿ„ ã!L lí°Í<Ê ¯2Š ñí ÍÍ.ͯ2Š Ãq ~æ_ÍxþÂÇ.Í#µÉÿÍ·ÊÍþ« ʬ þ_ÀÍ.Ãn!hi6í°ÉÍ<À. ͯÉ\ÕåÍáÑÉÅÍ ÁÉþ$È·Õ_õÄñÌ.ÑÃõ Í ÍñÉ… Ø ÍʾÍ| ÃAÕˆÍ| ÍÙÂrz³ÂQj ÍÍÙÂrÍ| ÃfÑ{ûÍ:Š ·Äö¯2Š Ë Í.ÍÍÍÃ�< Í!p q 6í°!\]6  í°¯2h2k2|!p ÍÍþ ÊþÊÚþÂôy·Êà 6þÊëÍ‚ ÍÃÃþ!ÚÃyþÂ Í yþÂÃÍÃÃ:q þ:>@Â&~##:p þ@ÊñÖ@ÚñþÒñ2\]~þ0ÚCþ:Ú÷~þ*Ê€þ.ÂWxþÊ÷Þ·ÂlxþÂÞ:‰ þSÊëÃÞ#ÂC~·ÊÞþ.ÊžÃ÷Å>?Â�Á#~þ.Êž·ÊÞ‹#Ãs#e~Oæ€Ê±xþÂ÷yþ.Ê÷þ*ÊÊ·ÊÞ#¤ÃÙÅ>?ÂËÁ#ÂÔ~·Â÷:]Ö 2‡ ¯2Œ Ép Ãú= ÃúS ÍÖÍ{Í w ÉþaØþ{Ðæ_ÉÕåÍ| xÂ! Ã_ yþÿÂ5 ÿÅÍÁ·Ê Ã] ·ÊO RÍMÍÊÊ ÍAþS Ã] ÍÊÊ ÍAþR >ÿáÑÉÿÅÍ| ÍÊÁÀÂd ÉÿÍ·Âr ÉÅÕåÿÍþÊ’ áÑÁþÊnÉÍr « Õ:Š ·Ê« Íö:‰ þRÌÑÍÍr ÿÍ Ír ÍN!s#rÃPress 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\]~þ0ÚCþ:Ú÷~þ*Ê€þ.ÂWxþÊ÷Þ·ÂlxþÂÞ:‰ þSÊëÃÞ#ÂC~·ÊÞþ.ÊžÃ÷Å>?Â�Á#~þ.Êž·ÊÞ‹#Ãs#e~Oæ€Ê±xþÂ÷yþ.Ê÷þ*ÊÊ·ÊÞ#¤ÃÙÅ>?ÂËÁ#ÂÔ~·Â÷:]Ö 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!`í°Ã`1ÿoÍ-ù·Û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=2Z8ÉÍe þ&°+*R6~þ Ê®+þ Ê®+åÅÍРͼ+Áá"R6®+>&2\8Ã,þ&°+:\8·Âµ+>&ÍÓ3·øõ¯2\8ñÉ*g8~·Êê+ó6¾Âß+O+¾Âß+ ÂÏ+xö€¿É+~þÒß+ÃÁ+:p8·À*q8À~·Ê,1+ Íþ0ÒfÍ­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+~<Âq:&<=2'*+~þ Ê#ë!\ͯ#}´Êo+"+!]~þ ¶+~·Ê§:<¾Âo+~<±:&<=2'¯ÄÓ*+}´Âu*-ë*)ÍTÂîÍ­No Library/Archive found.ÃA!"/"1ë"3"5*)"9*9ë*-ÍTÊ…![ë ÍK"9ÍoÊ!eCͼÊk*1ë![%ÍKÍ—Õ!eë!NÍKÍoÑÊ![%ÍKÍ—ë"1!4Ã*5ë![%ÍKÍ—ë"5!4Ã:!¶ÊÎ*."-:·Ê¾*3ë*5ÍZë*-ÍZ"-"BKë*3ÍŒ:·Êå*/ë*1ÍZë*-ÍZ"-"BKë*/ÍŒ:W*ÍZë*.ÍK¯ >k s#rër+6."ë*.þs#rë6Ã#6 #t#6Ã.¯w#w.ë!;ÍKë."ë*-ÍZÒxÍ­Too many Libraries/Archives specifiedÃêÍZÚˆÃ~`i"":2 :2!*7ë! ÍK ÍÇá~#å·È_ÍíÕåÊÐæO~æ¹#Ê¿áÑÉ![4:&Êß5~wåÍfá#~·Âð:�áå wÈ Íç Èþ Ú� ú� ÂÚ þ*Êß w#·É6?#òß Éå!2 ¾Ê÷ 45#Âì ·áÈþaØþ{Ò æ_æɯw# Í Í  Í  p#  Éþ Ê% þ Ê% É .,:;[]=<>| Íç Èþ Ú� ú� ÂÚ þ*Êß w#·É6?#òß Éå!2 ¾Ê÷ 45#Âì ·áÈþaØþ{ÒÃ2ÃLBR :·Ê yþ Ú :·ÊM*":wyþhÒ þcÒkþ/Ò Ö !s‡ÍÁ~#foéÖc!·ÃbÆ 8ž´é§¯ooo §    ³  ¹oS v  o     Ž œ o¢ ® o…oÐ$ÉÍ ¯2ÍØÍîÍ;**" !",:&·Ê¥2 *$ëÕÍX“ÑÕÍoÍ�“!) ó ͤ“^#Vë" !Ã=* +" |µÊ“ÑÕÍ�“!) ~·Âƒ" ë* ëã~ãæwÍÀë+V+^ÍÖ##ÑÕs#r#;" *,#",ë*0ÍÉ* Ê­~<Ê“ Â=Ã$Ñ: =2 Ê¥!)Ãï:)·ÊY2 *')ëÕÍXÂGÑÕÍoÕ* ë+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å ÍoDþÿÂa%$Êa" * .ç~<Ê\õ:ÆA2FÍø CP/M Error on : ? in Filenameñ<Â* }D1ÉÕ þ?ÊuÂhÑÉÑá>ÿ& É*," **" * |µÂ“=É+" * þ?È: G~æ¸Â³# ͤ+È>ÍÁ" Éå* ëás#r#: w#T]s#r#É{²Âá2 Ãò{æ<2 {z_>Wë" ëÉã~#ã·È_Í Ãø* .à~õåæw!Í " áñwÉ:»>ÿÊ*¯2·Ê :_à ÍÖÍeÍ|ÊG&É" å* Ñs#r#ë> ÍÁ ÍÀ++V+^* > ÍÁ~»Úò~>ÿ&É#6ÿ#6€#»>€Âššå> ÍÁ~áw¯gÉÍÖͶ åøÿ~áÚ±6¯gÉþ?ÄÖþ?ÂÏ:·Ê ¯ÍÖ>?ë  ÍÀ: þ?Âã2( Íà Ãó:·Ê Íñ* }´ÂÍà >ÿ&É ͉Âûë* #" ë:( ¾Ê@Úˆþ?ʈ* +" * " ¯2 Ãó! ¾Ú(w4õ* .Ø^#V* ~æþ Ú_>å# ÍÀñõ¯>ÍÁñ¾>€Â##~!Q¯wgÉþ?Â�: ¾! ÊGÚGÃ(! ¾Ú(ÃGÍÖ>ÿ&ÉÍÖͶ !~! ¾>&ÈØ! n&)))))))å! ~áÍÁ" å!^#V###N#Fãã! " !" Áq#p* ëÍ* }þÿÈ·LÂ* .æN* yÍÁë* Å Á~#foÍÉÒCë* ëÍÏMe." * ë! ~�wòjÖ€w! 4~!¾Âj##~!w* }ÉÍÖÍø Invalid function call on Library/Archive driveÇ:·Ê :oÉÍÖ¯gÉÍÖͶ ÍÙ *  N#Fë ë*  N#F`iå" s#rÑÍ* ë!!N#FÅyæõyx! w!¾>€Â ##~!w! ñw* }ÑþÿÈÕ·LÂ, * .æN* ~#foÑÍÏ|·ÂN }¹ÒN * e." * }ÉÍÖÍeÍ|Êb &É N#F!!q#p#¯wgÉÕÍ Ñ:ÿ&É! ~<Èá> &É>ÿ2**" *," ¯2 É!N#F!!^#V`iÍÉÐá>&É €‚D�!D*ªªªªªªªªª€‰$�H’I ! H€€€DI!"$ @$"$ $D’"@� €D‚"�ˆB$ @ BDHˆ@�D D$ I‚@ �$@ $€€@� ˆ‘$�D@B€A�A"!!$‘$$‘!"@‰" I@H "@$‘$€@HD„H@@@ ‚! „’DH‰€€$‘unction call on Library/Archive driveÇ:·Ê :oÉÍÖ¯gÉÍÖͶ ÍÙ *  N#Fë ë*  N#F`iå" s#rÑÍ* ë!!N#FÅyæõyx! 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Ê�æ_þXÊþWÊ*þAÚÄþQÚøÃÄæ2gͣʹCͧÊ6|þ•   ÍÕ File not found. ÍÇ Â•  GÍÃq 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}ox´g"* 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* ë*P§Êd 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§Âñ * #~=wÍ7 Ä * ë*z¼Â {½Â Ä *}þÊ„ þ€Ê„ +"*+"+##~+w§Â5 * #~=wÍ7 Ä O* ~#¾Â_ ÍÄ ~§ÉThis file was not made by MAKEST.  Ü ÍÃq This file was made by MAKEST before Version 1.5 ^It should be replaced.q!¶#~§ÊÄÍ´ AÍÃcWhich drive do you want to write Í‘ qÍê to? Select A,B,etc. or to return to main menu. ýÍþÊæ_þAÚªþQÚÅê2Cæ2gͣʹ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) ýÍþYÊþyÊÃ:Læ2LCÍä:·O!¸ 6#6$#ŒÍCÍCÍÃEXECST 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ß “ÍÃâ:ò§Ê!ó~§ÊOþaÚKþ{Ò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) ýÍþYÊþyÊÃ:Læ2LCÍä:·O!¸ 6#6$#ŒÍCÍCÍÃEXECST 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.2   MAKESÔ doeó noô uså commanä tails® Commanä lineó caî onlù �       bå entereä froí withiî MAKEST. 1.3   To exit from MAKEST push ^C or X from the Main Menu only. .pa Š2.    THE MAIN MENU OF "MAKEST" 2.1   Wheî 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.2   User 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.3   Thå "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.1   Pusè A¬ B¬ etc® froí thå Maiî Menõ tï reaä thå selecteä �       disë drivå foò aî existinç "Commanä File"® 3.2   Iæ á "Commanä File¢ existó oî thå disë anä iô waó createä �       bù MAKESÔ theî itó commanä linå wilì bå displayeä foò �       reference® 3.3   Thå 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.1   Pushinç "1¢ froí thå Maiî Menõ wilì allo÷ yoõ tï creatå á �       ne÷ commanä line® 4.2   Pushinç A¬ B¬ etc® froí thå Maiî Menõ wilì reaä iî a �       command line from an existing "Command File". 4.3   Pushinç 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.5   MAKESÔ 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.6   Thå editeä commanä linå caî bå saveä tï becomå thå "activå �       commanä line¢ bù pushinç ® Thå previouó "activå �       commanä line¢ ió replaced. 5.7   Thå 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.2   Tï changå tï á differenô filå namå pusè "2¢ froí thå Maiî �       Menu. 6.3   Thå filå typå oæ .COÍ ió assumeä foò alì filå nameó �       selected. .pa Š7.    WRITE THE ACTIVE COMMAND LINE TO DISK 7.1   Pusè "W¢ tï writå thå "activå commanä linå" tï á disë drivå �       to be selected. 7.2   Iæ 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.3   Iæ 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.3   Wheî 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.3   Wheî 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 ;FillÃ1@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 á~Æ'GæðxÊ\æö0251Í:5_ÍÃfæö0_Í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 8ÍÛÉWAIT!Ei$w#ÂIÉYÍÛÉ=' Y! 6# y°ÂfÉ!"ÃfýÍþÊþ ʵ þ1Êv þ2Ê�þ3ʲæ_þXÊþWÊE þAÚyþQÚÚÃyÍR¾ÍÛÃÙ"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. ýÍþÊáþDÊûþdÊûþEʯþeʯþSÊþsÊÃÎ>2ÃáÍRÍÛà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". ýÍþÊáþAÊÒþaÊÒù>ÿ2òæ2iÍAÍREÍ§Ê |þ„  ÍÛÄ  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 !ŽJÍe Í`! ~IÍe Ãáw#w#w#§Âm É!@6ÿ#6#6ÃË ” ÍÛýÍÃá Push to continue. !@ w#w#w#§Âà ÍR† ÍÛ!@6ÿëÍ£þÊï þÊáþÊ„ ÃáÍ`! @Íe ÃáÍ1 ÍÛÃ+ exists on the selected drive. !H6# x±Â2 HÍEÍEÍ!ÝKk#¾Â #Â[ o ÍÛÃ’ This file was created by MKWAIT ÒKÍÛ¡ ÍÛÃÇ "Check Line Above" is now :€J§ÊÝ ÍÔ Ãã !‚J�JÃ�ÍÛì ÍÛà 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 æ2iÍAÍREͧÊ|þÊ% þ„  ÍÛÄ No directory space available. ÍRÍ14 ÍÛ× 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Ê Ãá:Næ2NEÍë : O! 6#ŽÍEÍEÍÃáWAIT COMWAIT COM1@nÍ 5Í:€§ÂÓ $ÍÃ8 ^READ NOTE:q  €Í KÍÑ Push to continue or to terminate command string. ýÍþÊ Ã<¯Í< ñ�1ÍͧÊg.6ÿ1ÏÍÃþÛ2�ö@Ó*Sý:‚ÆG}þ€Êõ.€%ÂåÃú.Ãî�§Ê¾Â #Ãý:�ÓÃ:�ÓÃVer. 2.0This WAIT.COM was created by MKWAITÍR›ÍÛÃåWhat is the new file name to be? Enter up to an 8 character file name. !ñ6##6ÃñÍ£þÊþÊáþÊ„ Ãá:ò§Êá!ó~§Ê8þaÚ4þ{Ò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}ox´g"Ÿ*—N#6#:•¹ÊjÒj4ÍÛ>É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*—##"™"›"�*Ÿ"¡"QÍTáÛ2Sö@Ó*Q~æw|Æg~æßw*›ë*ŸP§Ê�w#Âu> w#ƒ*¡"Q~ö€w|Æg~ö w:SÓÉýÍþÊöþÊ«þÊdþÊþ ÊþÊþÊ$þÊ$þÊüþ ÊüþÊ*þÊ*þ Êùþ Ú¡þ€Ò¡Ãh>É>É*�~§Ê¡#"�*¡}þOÊ þÏÊ #"¡ÍTá*›#"›Ã*™ë*�z¼Â>{½Â>á+"�*¡}þÊZþ€ÊZ+"¡ÍTá*›+"›ÃT*¡å*›ë*�~þʧã}þOÊ›þÏÊ›#ã#~þÂu"�ë"›á"¡ÍTáã#~þœÊáá*™DM*�x¼ÂÀy½ÂÀá*¡å*›ë*�ã}þÊõþ€Êõ+ã+x¼ÂËy½ÂË"�ë"›á"¡ÍTáã+x¼Âöy½ÂöÃä*�~+§Ê¡##~+w§Â*—#~=wÍTá*™ë*�z¼Â8{½Â8á*¡}þÊ¡þ€Ê¡+"¡*�+"�+##~+w§ÂR*—#~=wÍTá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.5   Yoõ 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.1   Thå oî boarä linå editoò ió useä tï ediô thå "activå �       message" and the "Check Line Above" message. 6.2   Thå oî boarä linå editoò wilì allo÷ mosô CP/Í anä WordStaò �       editinç commands® Á menõ oæ editinç commandó ió provideä oî �       the screen. 6.3   MKWAIÔ useó 0è insteaä oæ "$¢ foò thå "outpuô delimiter¢ �       (enä flaç oæ screeî messages)® Thió meanó thaô "$¢ caî bå �       entereä intï thå message. 6.4   Thå editeä messagå caî bå saveä and replace the "active" �       message bù pushinç ® � 6.5   Thå editeä messagå caî bå discarded¬ iæ desired¬ bù pushinç �       . 6.6   Thå 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.2   Tï 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.4   Thå filå typå oæ .COÍ ió assumeä foò alì filå nameó �       selected. 8.    WRITE THE ACTIVE MESSAGE TO DISK 8.1   Pusè "W¢ tï writå thå "activå message" tï á disë drivå �       to be selected. 8.2   MKWAIT will allow a message of no characters if desired. 8.3   Iæ 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`LMNOPQRSTUVWMKWAIT20ASM€XYZ[\]^_`abcdefgMKWAIT20ASM€hijklmnopqrstuvwMKWAIT20ASMxSHOW1 $$$åååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå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`LMNOPQRSTUVWMKWAIT20ASM€XYZ[\]^_`abcdefgMKWAIT20ASM€hijklmnopqrstuvwMKWAIT20ASMxSHOW1 COMySHOW1 DOCzSUB1 $$$ååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååWAIT3 DIR EPOXLINKDOCKEY2SCRNCOMKEY2SCRNDOCLBRDISK COM,LBRDISK DOCMAKEST20COM$ !MAKEST20DOC9"#$%&'()MAKEST20ASM€*+,-./0123456789MAKEST20ASM[:;<=>?@ABCDEMKWAIT20COM0FGHIJKMKWAIT20DOC`LMNOPQRSTUVWMKWAIT20ASM€XYZ[\]^_`abcdefgMKWAIT20ASM€hijklmnopqrstuvwMKWAIT20ASMxSHOW1 COMySHOW1 DOCzSUB1 SUB{SUB2 $$$åååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå1@nÍ 5Í:€§ÂÓ $ÍÃ8 ^READ NOTE:q  €Í KÍÑ Push to continue or to terminate command string. ýÍþÊ Ã<¯Í< ñ�1ÍͧÊg.6ÿ1ÏÍÃþÛ2�ö@Ó*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. ýÍþÊ Ã<¯Í< ñ�1ÍͧÊg.6ÿ1ÏÍÃþÛ2�ö@Ó*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. ýÍþÊ Ã<¯Í< ñ�1ÍͧÊg.6ÿ1ÏÍÃþÛ2�ö@Ó*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. ýÍþÊ Ã<¯Í< ñ�1ÍͧÊg.6ÿ1ÏÍÃþÛ2�ö@Ó*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. ýÍþÊ Ã<¯Í< ñ�1ÍͧÊg.6ÿ1ÏÍÃþÛ2�ö@Ó*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. ýÍþÊ Ã<¯Í< ñ�1ÍͧÊg.6ÿ1ÏÍÃþÛ2�ö@Ó*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. ýÍþÊ Ã<¯Í< ñ�1ÍͧÊg.6ÿ1ÏÍÃþÛ2�ö@Ó*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:]þ ʶ¯2€2�2‚:mÍ5:nÍ5:oÍ5\ÍÍfÃþRÂE2€:eö€2eþSÂU2�:fö€2fþAÂe2‚:gö€2gÉõ>$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`LMNOPQRSTUVWMKWAIT20ASM€XYZ[\]^_`abcdefgMKWAIT20ASM€hijklmnopqrstuvwMKWAIT20ASMxSHOW1 COMySHOW1 DOCzSUB1 SUB{SUB2 SUB|WAIT0 COM}WAIT1 COM~WAIT2 COMWAIT3 COM€WAIT4 COM�WAIT5 COM‚WAIT6 COMƒQS $$$åååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå 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#xþÂÉwÿ/ÍSC2"xNÍg“þÂôÒ|µÊ"xÃêÍg>äÂ>ã2mx!ÍO*xlÿ>õOñ"x <Ú"G*x|µÂB/?@ABCDEMKWAIT20COM0FGHIJKMKWAIT20DOC`LMNOPQRSTUVWMKWAIT20ASM€XYZ[\]^_`abcdefgMKWAIT20ASM€hijklmnopqrstuvwMKWAIT20ASMxSHOW1 COMySHOW1 DOCzSUB1 SUB{SUB2 SUB|WAIT0 COM}WAIT1 COM~WAIT2 COMWAIT3 COM€WAIT4 COM�WAIT5 COM‚WAIT6 COMƒQS COM„QS DOC…SCDATE $$$ 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 intoÃU3 ver 1.02FOR CPM 3.012/29/83 - gwRev 06/16/84, 12/24/84 - rs1ÍÍÍ&ÃÍNÍYÍyÍÞÉÍ•ÈÍÕà Í: ·ÊG:þåÊ@~ÃClÍÇɹÍÇÉ Íþ0ÚŒÉ:\·ÂfÍ<=2\:]þ!ИÍÇà ÿÍ2!m> ¾ÊÉ0N#¾Ê›AN#¾ÂÕ>0¸Êª<¸ÂÕ >/¹ÒÕ>9¹ÚÕyÞ0‚þÒÕ2:2É:2>å2ÉÊÍÇà íCÿ> 2ýÍôÍ:\OXíCÿíS> 2ýÍô|µÊÌ^#Vë"É:\_ÍÍ^#VíS^#VÕå~2 áÑë#: þÌy: þÌ�: þ̉: ·Ì‘}2*: þÌŸ: þÌ¢: þÌ¥}2!^#VíSÉèÍÇÃ:·ÈÍ­íK&:o "ÿ> 2ýÍô:OÍÞíCÿ> 2ýÍô> 2ýÍôæîɯ2 :G! :W~ºÂåÍ`áÂ:w>2 : <2  Âà: ·ÊQÍ­íK&:o "ÿ> 2ýÍô:OÍÞíCÿ> 2ýÍôíCÿ>2ýÍô·ÂÕ:=2: <2 É#]ë >?¾Êræ¾À# ÂgÉ> 2Ù>2Ü>2ß>2âͥͥͥͥ¯|g}oÉ:G: ¸Ú¿� ö2y2É ÃBÍÇÃÍÇÃ*ëíCÿíS>2ýÍôMÉ2ýÍÉ 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¸Êª<¸ÂÕ >/¹ÒÕ>9¹ÚÕyÞ0‚þÒÕ2:2É:2>å2ÉÊÍÇà íCÿ> 2ýÍôÍ:\OXíCÿíS> 2ýÍô|µÊÌ^#Vë"É:\_ÍÍ^#VíS^#VÕå~2 áÑë#: þÌy: þÌ�: þ̉: ·Ì‘}2*: þÌŸ: þÌ¢: þÌ¥}2!^#VíSÉèÍÇÃ:·ÈÍ­íK&:o "ÿ> 2ýÍô:OÍÞíCÿ> 2ýÍô> 2ýÍôæîɯ2 :G! :W~ºÂåÍ`áÂ:w>2 : <2  Âà: ·ÊQÍ­íK&:o "ÿ> 2ýÍô:OÍÞíCÿ> 2ýÍôíCÿ>2ýÍô·ÂÕ:=2: <2 É#]ë >?¾Êræ¾À# ÂgÉ> 2Ù>2Ü>2ß>2âͥͥͥͥ¯|g}oÉ:G: ¸Ú¿� ö2y2É ÃBÍÇÃÍÇÃ*ëíCÿíS>2ýÍôMÉ2ýÍÉ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 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 €ƒååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå'ååååå