IMD 1.16: 1/06/2007 13:35:28 FOGCPM.204 CPM22001APP,CPM22002APP0 CPM22003APPCPM22004APP&CPM22005APPCPM22006APPCPM22007APPCPM22008APP !"CPM22009APP#$%CPM22010APP&'()CPM22011APPf*+,-./0123456CPM22012APP78CPM22013APP9:;CPM22014APP4<=>?@ABCPM22015APP*CDEFGHCPM22 PATgIJKLMNOPQRSTUINSIDCPMLBRVWXYZ[\]^_`abcdeINSIDCPMLBRfghijklmnopqrstuINSIDCPMLBRvwx--FOGCPM204-03-09 89 -CPM204 DOC/DSKLBL15ASMyz{|}~DSKLBL15ASMRCPMSCANDOCRS COM SYSTEM COM<SYSTEM DOCAREACODECOM8AREACODEDOCAREA FORAREA17 COM7TERMINALDAT CP/M V2.2 Application Note 01, 2/20/82 The CCP Auto-Load Feature Copyright 1982 by Digital Reserch CP/M is a registered trademark of Digital Research. DDT is a trademark of Digital Research. Compiled November 1982 Applicable products and version numbers: CP/M V1.4, V2.0, V2.1, and V2.2 Program: CCP (Console Command Processor) Usually, you interact with the CP/M CCP following the sign-on prompt. With the CCP Auto Load feature, CP/M executes an initial program immediately after loading the operating system. Under usual operation, the CCP receives control from the BIOS upon a warm or cold boot. The beginning of the CCP module contains a two-element jump vector and a command line that takes the form: CCP: JMP CCPSTART ;START THE CONSOLE PROCESSOR JMP CCPCLEAR ;CLEAR THE INITIAL COMMAND DB 127 ;MAXIMUM COMMAND LENGTH CL: DB 0 ;COMMAND LENGTH DB ' ' ;8 BLANK CHARACTERS DB ' ' ; " DB 'COPYRIGHT...' ;COPYRIGHT NOTICE If control is transferred to location CCP (address 3400H in a 20K CP/M), the console processor examines the command length at location CL (3407H in a 20K CP/M). If the command length byte is zero, then you receive the sign-on prompt and the CCP waits for console input. If the command length byte is not zero, the CCP assumes an initial command has already been entered. The CCP executes the command on each cold or warm boot if control is transferred to location CCP. However, if control is transferred to location CCP+3 (JMP CCPCLEAR), the initial command is cleared and the program enters the CCP at the command line level, displaying the default drive prompt. Specify the length of the initial command using a nonzero CL byte. The command must be followed by a terminating zero. CP/M executes the command following that CL byte. Although only 16 blank spaces are provided, you can move the Digital Research copyright notice for more spaces. You can initialize the command line of the CCP on the operating system tracks or in the relocatable image within the MOVCPM data area. The initial command executes in distributed or reconfigured CP/M systems. Following SYSGEN and SAVE commands, save the CP/M memory  image above the cold boot loader code starting at location (980H). If the system boot routines require more than 80H bytes, the CCP code begins at location 0A00H. Modifying MOVCPM.COM is similar to modifying the CCP. The difference is that the CCP always begins at location 0A00H. The following procedure uses DDT to modify the CCP, allowing execution of the initial command DIR after each warm or cold boot. A>movcpm * * CONSTRUCTING 64K CP/M Vers. 2.2 READY FOR "SYSGEN" OR "SAVE 35 CPM64.COM A>save 35 cpm64.com A>ddt cpm64.com DDT VERS 2.2 NEXT PC 2400 0100 -d980 0980 C3 5C E7 C3 58 E7 7F 00 20 20 20 20 20 20 20 20 ...X... 0990 20 20 20 20 20 20 20 20 43 4F 50 59 52 49 47 48 COPYRIGH 09A0 54 20 28 43 29 20 31 39 37 39 2C 20 44 49 47 49 T (C) 1979, DIGI 09B0 54 41 4C 20 52 45 53 45 41 52 43 48 20 20 00 00 TAL RESEARCH .. 09C0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ -s987 0987 00 3 0988 20 44 0989 20 49 098A 20 52 098B 20 0 098C 20 . -d980 0980 C3 5C E7 C3 58 E7 7F 03 44 49 52 00 20 20 20 20 ...X...DIR. 0990 20 20 20 20 20 20 20 20 43 4F 50 59 52 49 47 48 COPYRIGH 09A0 54 20 28 43 29 20 31 39 37 39 2C 20 44 49 47 49 T (C) 1979, DIGI 09B0 54 41 4C 20 52 45 53 45 41 52 43 48 20 20 00 00 TAL RESEARCH .. 09C0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ -g0 A>save 35 cpm64.com A>sysgen cpm64.com SYSGEN VER 2.0 DESTINATION DRIVE NAME (OR RETURN TO REBOOT)b DESTINATION ON B, THEN TYPE RETURN FUNCTION COMPLETE DESTINATION DRIVE NAME (OR RETURN TO REBOOT) Licensed users are granted the right to include these modifications in CP/M software.  CL: DB 0 ;COMMAND LENGTH DB ' ' ;8 BLANK CHARACTERS DB ' ' ; " DB 'COPYRIGHT...' ;COPYRIGHT NOTICE 4 20 28 43 29 20 31 39 37 39 2C 20 44 49 47 49 T (C) 1979, DIGI 09B0 54 41 4C 20 52 45 53 45 41 52 43 48 20 20 00 00 TAL RESEARCH .. 09C0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ -g0 A>save 35 cpm64.com A>sysgen cpm64.com SYSGEN VER 2.0 DESTINATION DRIVE NAME (OR RETURN TO REBOOT)b DESTINATION ON B, THEN TYPE RETURN FUNCTION COMPLETE DESTINATION DRIVE NAME (OR RETURN TO RE CP/M V2.2 Application Note 02, 2/20/82 Reversing the BACKSPACE and RUBOUT Key Functions and Making RUBOUT Identical to BACKSPACE Copyright 1982 by Digital Research CP/M is a registered trademark of Digital Research. DDT and SID are trademarks of Digital Research. Compiled November 1982 Applicable products and version numbers: CP/M V2.1 and V2.2 Program: BDOS In the following code segment procedures, addresses given are hexadecimal offsets from the base of the CP/M system. The CCP is usually located at 980H but can be located at A00H if a two-sector boot is used. You can assemble the patch for your size memory system. The cpmbase equals the BDOS entry point address at locations 6 and 7  in the base page of memory minus 806H. You must change this entry point address when you load DDT or SID . Under DDT or SID, follow the jump at location 5 until an address is found with a least significant digit of 6. In the following example, the cpmbase would be E506H-806H or DD00H. 0005 JMP CD00 CD00 JMP D3A4 D3A4 XTHL D3A5 SHLD E452 D3A8 XTHL D3A9 JMP E506 Procedure to reverse the BACKSPACE and RUBOUT key functions: Patch into the SYSGEN or MOVCPM image exactly as you would patch in a new version of your BIOS, using the DDT i command followed by the DDT r command. You can use the same offset as your custom BIOS and install the following code: cpmbase equ ? ;subtrack 806h from address at location 6  org cpmbase + 0A02h cpi 7fh ;was cpi 08h org cpmbase + 0A16h cpi 08h ;was cpi 7fh Or, you can install the above procedure directly into MOVCPM if you have MOVCPM.COM on your system disk. The patch is applied automatically to any size system that you build using MOVCPM. Make a back-up copy of MOVCPM.COM before using DDT to make the following changes: A>ddt movcpm.com DDT VERS 2.2 NEXT PC 2700 0100 -l1402 1402 CPI 08 1404 JNZ 0A16 1407 MOV A,B 1408 ORA A 1409 JZ 09EF 140C DCR B 140D LDA 0B0C 1410 STA 0B0A 1413 JMP 0A70 1416 CPI 7F 1418 JNZ 0A26 -s1403 1403 08 7f 1404 C2 . -s1417 1417 7f 8 1418 C2 . -g0 A>save 38 movcpm1.com Use the new program MOVCPM1.COM in place of MOVCPM.COM. The BACKSPACE and RUBOUT key functions are reversed for any CP/M system generated with MOVCPM1.COM. Procedure to make RUBOUT identical to BACKSPACE: Before you install this patch, the code at cpmbase + 0A1Bh should read: mov a,b ora a jz cpmbase + 09EFh mov a,m dcr b dcx h jmp cpmbase + 0AA9h Patch into the SYSGEN or MOVCPM image exactly as you would patch in a new version of your BIOS, using the DDT i command followed by the DDT r command. Use the same offset as your custom BIOS and install the following code: cpmbase equ ? ; ; org cpmbase + 0A1Bh ; mvi a,8h jmp cpmbase + 0A07h end Or, you can install the above procedure directly into MOVCPM if you have MOVCPM.COM on your system disk. The patch is installed automatically in any size system that you build using MOVCPM. Make a back-up copy of MOVCPM.COM before using DDT to make the following changes. A>ddt movcpm.com DDT VERS 2.2 NEXT PC 2700 0100 -l141b 141B MOV A,B 141C ORA A 141D JZ 09EF 1420 MOV A,M 1421 DCR B . . . -a141b 141B mvi a,8 141D jmp a07 1420 . -g0 A>save 38 movcpm1.com Use the new program MOVCPM1.COM in place of MOVCPM.COM. The RUBOUT and BACKSPACE key functions are identical in any CP/M system generated with MOVCPM1.COM. Licensed users are granted the right to include these modifications in CP/M V2.2 software. BIOS, using the DDT i command followed by the DDT r command. You can use the same offset as your custom BIOS and install the following code: cpmbase equ ? ;subtrack 806h from address at location 6  CP/M 2.2 Application Note 03, 06/25/81 Sample BIOS for a Serial Printer Device Copyright 1982 by Digital Research CP/M is a registered trademark of Digital Research. Compiled November 1982 Applicable products and version numbers: CP/M V1.4, V2.0, V2.1, and V2.2 Program: BIOS The following code fragment drives Diablo serial interface printers or other serial devices that use the X ON/X OFF protocol for synchronization. A device that uses this protocol receives data faster than it can print. The device transmits a CTRL-S character when its buffer becomes full, and a CTRL-Q to receive more data after the buffer is emptied. LIST$STAT EQU 00H LIST$DATA EQU 01H  IN$MASK EQU 02H OUT$MASK EQU 01H LIST: CALL LISTST ! JZ LIST MOV A,C ! OUT LIST$DATA RET LISTST ;return list status (0 if not ready, FF if ready) LXI H,LST$FLAG IN LIST$STAT ! ANI INS$MASK ! JZ NO$INPUT IN LIST$DATA ! ANI 7FH ! CPI 'Q'-'@' ! JNZ S? MVI M OFFH S? CPI 'S'-'@' ! JNZ NO$INPUT MVI M,O NO$INPUT: IN LIST$STAT ! ANI OUT$MASK ! ANA M ! RZ ORI 255 RET LST$FLAG: DB 255 ;must be 255 initially Licensed users are granted the right to include these modifications in CP/M software.  org cpmbase + 0A02h cpi 7fh ;was cpi 08h org cpmbase + 0A16h cpi 08h ;was cpi 7fh Or, you can install the above procedure directl ;return list status (0 if not ready, FF if ready) LXI H,LST$FLAG IN LIST$STAT ! ANI INS$MASK ! JZ NO$INPUT IN LIST$DATA ! ANI 7FH ! CPI 'Q'-'@' ! JNZ S? MVI M OFFH S? CPI 'S'-'@' ! JNZ NO$INPUT MVI M,O NO$INPUT: IN LIST$STAT ! ANI OUT$MASK ! ANA M ! RZ ORI 255 RET LST$FLAG: DB 255 ;must be 255 initially Licensed users are granted the right to include these modifications in CP/M software.  CP/M V2.2 Application Note 04, 2/20/82 BIOS Error Return Code Options Copyright 1982 by Digital Research CP/M is a registered trademark of Digital Trademark. DDT and SID are trademarks of Digital Research. Compiled November 1982 Applicable products and version numbers: CP/M V2.2 Program: BIOS Usually, CP/M responds only to a zero or nonzero value as the return code from the BIOS READ and WRITE entry points. If the value in register A is zero, CP/M assumes that the disk operation was completed successfully. If a nonzero value is in register A, the BDOS returns the message BDOS ERR ON x: BAD SECTOR. You then have the option of pressing the RETURN key to ignore the error, or CTRL-C to abort. This modification interjects three additional return codes for the BIOS READ and WRITE routines in register A as shown below. 0 The disk Read or Write operation was successful. 1 Bad Sector--indicates permanent disk error. 2 Select Error--indicates the drive is not ready. 3 R/O--the disk is Read-Only (used by WRITE). 4 File R/O--not normally used. In the following code segment, addresses given are hexadecimal offsets from the base of the CP/M system. The CCP is usually located at 980H, but can be located at A00H if you use a two-sector boot. After modifying your BIOS READ and WRITE routines to pass the extended error codes to the BDOS, you can assemble the BDOS patch for your size memory system. The cpmbase equals the BDOS entry point address at locations 6 and 7 in the base page of memory minus 806H. You must change this entry point address when you load DDT or SID . Under DDT or SID, follow the jump at location 5 until you find an address with a least significant digit of 6. In the following example, the cpmbase would be E506H-806H or DD00H. 0005 JMP CD00 CD00 JMP D3A4 D3A4 XTHL D3A5 SHLD E452 D3A8 XTHL D3A9 JMP E506 Patch into the SYSGEN or MOVCPM image exactly as you would patch in a new version of your BIOS, using the DDT i command followed by the DDT r command. Use the same offset as your custom BIOS. Before installing this patch, the code at the cpmbase + BBDh should read: lxi h,cpmbase +809H jmp cpmbase + B4AH Replace the preceding code with the following code: cpmbase equ ? ; ; org cpmbase + BBDH ; lxi h,cpmbase + 807H jmp cpmbase + 83AH end Or, you can install this change directly into MOVCPM, if MOVCPM.COM is on your system disk. The patch is installed in any size system that you build using MOVCPM. Make a back-up copy of MOVCPM.COM before using DDT to install the following procedure: A>ddt movcpm.com DDT VERS 2.2 NEXT PC 2700 0100 -l15bd 15BD LXI H,0809 15C0 JMP 0B4A 15C3 LHLD 15EA . . . -a15bd 15BD lxi h,807  15C0 jmp 83a 15C3 . -g0 A>save 38 movcpm1.com Use the new program MOVCPM1.COM in place of MOVCPM.COM. Additional error return codes for the BIOS READ and WRITE routines are supported in any CP/M system generated with MOVCPM1.COM. Licensed users are granted the right to include these modifications in CP/M V2.2 software.  Program: BIOS Usually, CP/M responds only to a zero or nonzero value as the return code from the BIOS READ and WRITE entry points. If the value in register A is zero, CP/M assumes that the disk 2700 0100 -l15bd 15BD LXI H,0809 15C0 JMP 0B4A 15C3 LHLD 15EA . . . -a15bd 15BD lxi h,807  CP/M V2.2 Application Note 05, 2/20/82 Improving the CTRL-S Function Copyright 1982 by Digital Research CP/M is a registered trademark of Digital Research. DDT and SID are trademarks of Digital Research. Compiled November 1982 Applicable products and version numbers: CP/M V2.2 Program: BDOS The CTRL-S function controls screen scrolling during CRT output. However, the system does not recognize CTRL-S if you type another character before it. In the following code segment procedures, addresses given are hexadecimal offsets from the base of the CP/M system. The CCP is usually located at 980H, but can be located at A00H if a two-sector boot is used. You can assemble the patch for your size memory system. The cpmbase equals the BDOS entry point address at locations 6 and 7 in the base page of memory minus 806H. You must change this entry point address when you load DDT or SID . Under DDT or SID, follow the jump at location 5 until you find an address with a least significant digit of 6. In the following example, the cpmbase is E506H-806H or DD00H. 0005 JMP CD00 CD00 JMP D3A4 D3A4 XTHL D3A5 SHLD E452 D3A8 XTHL D3A9 JMP E506 Patch into the SYSGEN or MOVCPM image exactly as you would patch in a new version of your BIOS, using the DDT i command followed by the DDT r command. Use the same offset as your custom BIOS. The call at cpmbase + 950H should be cpmbase + 923H before installing the following code: cpmbase equ ? ; ; org cpmbase + 950h ; call cpmbase + 92Ah end Or, you can install the above procedure directly into MOVCPM, if MOVCPM.COM is on your system disk. The patch is applied automatically to any size system that you build using MOVCPM. Make a back-up copy of MOVCPM.COM before using DDT to make the following changes: A>ddt movcpm.com DDT VERS 2.2 NEXT PC 2700 0100 -l1350 1350 CALL 0923 1353 POP B 1354 PUSH B . . . -a1350 1350 call 92a 1353 . -g0  A>save 38 movcpm1.com Use the new program MOVCPM1.COM in place of MOVCPM.COM. Any CP/M system generated with MOVCPM1.COM has the improved CTRL-S function. Licensed users are granted the right to include these modifications in CP/M V2.2 software. ly into MOVCPM, if MOVCPM.COM is on your system disk. The patch is installed in any size system that you build using MOVCPM. Make a back-up copy of MOVCPM.COM before using DDT to install the following procedur DDT VERS 2.2 NEXT PC 2700 0100 -l1350 1350 CALL 0923 1353 POP B 1354 PUSH B . . . -a1350 1350 call 92a 1353 . -g0  CP/M V2.2 Application Note 06, 2/20/82 Changing the Lines Per Page Copyright 1982 by Digital Research CP/M is a registered trademark of Digital Research. DDT is a trademark of Digital Research. Compiled November 1982 Applicable products and version numbers: CP/M V2.2 and V2.2 4200H Program: ED.COM This modification changes the number of lines scrolled by the P command in ED.COM from 23 to 14. Add 4200H to each address shown below for 4200H-based systems. Make a back-up copy of ED.COM before you use DDT to make the following changes: A>ddt ed.com DDT VERS 2.2 NEXT PC 1B00 0100 -l17da 17DA LXI H,0017 17DD SHLD 1D1C 17E0 RET . . . -s17db 17DB 17 e 17DC 00 . -^C A>save 26 ed.com Licensed users are granted the right to include these modifications in CP/M V2.2 and V2.2 4200H software. D00 CD00 JMP D3A4 D3A4 XTHL D3A5 SHLD E452 D3A8 XTHL D3A9 JMP E506 Patch into the SYSGEN or MOVCPM image exactly as you would patch of ED.COM before you use DDT to make the following changes: A>ddt ed.com DDT VERS 2.2 NEXT PC 1B00 0100 -l17da 1 CP/M V2.2 Application Note 07, 2/20/82 Changing the Restart Number in DDT Copyright 1982 by Digital Research CP/M is a registered trademark of Digital Research. DDT is a trademark of Digital Research. Compiled November 1982 Applicable products and version numbers: CP/M V1.4, V2.0, V2.1, and V2.2 Program: DDT.COM DDT uses RST 7 (machine instruction 0FFH) to set break points. To change the restart number, modify the three bytes indicated by ?? in the following procedure for a new restart instruction and location. The restart instruction uses the bit pattern 11XXX111, where XXX is the restart number you use. (AFH is RST 1, B7H is RST 2, and BFH is RST 3.) The restart location is usually the restart number times 8. Do not use RST 0 because it is reserved for CP/M. The following procedure applies to DDT supplied with CP/M V2.1 and V2.2. For V1.4 and V2.0, change the instructions at 19B and 19E to the following: 019B sta fe4 019E sta 10ee Make a back-up copy of DDT.COM before you use DDT to make the following changes: A>ddt ddt.com DDT VERS 2.2 NEXT PC 1400 0100 -l103 103 JMP 013D . . . -a103 0103 jmp 18b -a18b 018B lhld 1ec 018E shld 8e7 0191 inx h 0192 shld 8ed 0195 lda 1eb   0198 sta ad5 019B sta fea 019E sta 10f4 01A1 jmp 13d - s1ec 01EB ?? f7 01EC ?? 30 01ED ?? 00 01EE ?? . -g0 A>save 19 ddt6.com To change the restart number for DDT in the future, modify only the 3 bytes 1EBH, 1ECH and 1EDH. Licensed users are granted the right to include these modifications in CP/M software.  DDT VERS 2.2 NEXT PC 2700 0100 -l1350 1350 CALL 0923 1353 POP B 1354 PUSH B . . . 018E shld 8e7 0191 inx h 0192 shld 8ed 0195 lda 1eb  CP/M V2.2 Application Note 08, 2/20/82 Nested SUBMIT Files Copyright 1982 by Digital Research CP/M is a registered trademark of Digital Research. DDT is a trademark of Digital Research. Compiled November 1982 Applicable products and version numbers: CP/M V2.1 and V2.2 Program: SUBMIT.COM The CP/M SUBMIT program allows you to embed another SUBMIT command within a submit file. However, control does not return to the original SUBMIT file after executing the nested SUBMIT command. To return control to the original SUBMIT command, use any standard editor to type the following procedure into a file named SUBPATCH.ASM: ; ; subfcb: equ 5bbh bdos: equ 5 open: equ 211h ; org 22dh ;submit erase subroutine ; opsl: lda subfcb+15 ;file open ok if ext not full ral rnc lxi h,subfcb+12 ;try next extent inr m ops: lxi d,subfcb ;open extent jmp create ; org 25dh ;submit create subroutine create: call open inr a jnz opsl ;loop if open ok lxi d,subfcb mvi c,22 call bdos adi 1 ret ; ; the following code calls the above routines ; org 4feh ; call ops ;open the $$$.sub file jc 517h ;jump if not opened ok lda subfcb+15 ;set current record to end sta subfcb+32 jmp 51dh ;jump if open ok ; org subfcb db 1 ;force $$$.sub file to A: ; end Assemble SUBPATCH ASM to create the file SUBPATCH.HEX. Then use DDT to insert SUBPATCH.HEX into the SUBMIT.COM program, as shown below. A>ddt submit.com DDT VERS 2.2 NEXT PC 0600 0100 -isubpatch.hex -r -g0 A>save 5 submit1.com In the new program SUBMIT1.COM, control returns to the original SUBMIT file after the system executes embedded SUBMIT commands. Licensed users are granted the right to include these modifications in CP/M V2.1 and V2.2 software.  granted the right to include these modifications in CP/M V2.2 software. ly into MOVCPM, if MOVCPM.COM is on your system disk. The patch is installed in any size system th Assemble SUBPATCH ASM to create the file SUBPATCH.HEX. Then use DDT to insert SUBPATCH.HEX into the SUBMIT.COM program, as shown below. A>ddt submit.com DDT VERS 2.2 NEXT PC 0600 0100 -isubpatch.hex -r -g0 A>save 5 submit1.com In the new program SUBMIT1.COM, control returns to t  CP/M V2.2 Application Note 09, 2/02/82 Configuring CP/M for Page Boundaries Copyright 1982 by Digital Research CP/M is a registered trademark of Digital Research. DDT is a trademark of Digital Research. Compiled November 1982 Applicable products and version numbers: CP/M V2.2 Program: MOVCPM.COM You can modify MOVCPM.COM to configure CP/M V2.2 for page boundaries (256 bytes) instead of kilobyte boundaries. Make a back-up copy of MOVCPM.COM before you use DDT to make the following changes. Save the changes in a new file named PGMOV.COM. The first argument designates the size of the system in pages that PGMOV is to construct. The first argument is optional, but must range between 64 and 255 (decimal) if used. A>ddt movcpm.com DDT VERS 2.2 NEXT PC 2700 0100 -l165 0165 CPI 10 0167 JC 0172 016A MVI L,00 016C MOV H,A 016D DAD H -s166 0166 10 40 0167 DA . -a16d 016D nop 016E nop 016F . -l1a2 01A2 ANI FC 01A4 MOV H,A 01A5 PUSH H 01A6 LHLD 0006 -ala2 01A2 ani fe 01A4 . -g0 A>save 38 pgmov.com Licensed users are granted the right to include these modifications in CP/M V2.2 software.  ;jump if not opened ok lda subfcb+15 ;set current record to end sta subfcb+32 jmp 51dh ;jump if open ok ; org DAD H -s166 0166 10 40 0167 DA . -a16d 016D nop 016E nop 016F . -l1a2 01A2 ANI FC 01A4 MOV H,A 01A5 PUSH H 01A6 LHLD 0006 -ala2 01A2 ani fe 01A4 . -g0 A>save 38 pgmov.com Licensed users are granted the right to include these modificat CP/M V2.2 Application Note 10, BDOS, 03/12/82 Booting CP/M on Drives Other Than Drive A Copyright 1982 by Digital Research CP/M is a registered trademark of Digital Research. DDT is a trademark of Digital Research. Compiled November 1982 Applicable products and version numbers: CP/M V2.2 Module: BDOS Booting CP/M on a drive other than drive A changes the initial prompt displayed after a cold boot. Instead of A>, you must specify the drive intended to follow the cold boot in the following patch procedure. Also, your BIOS must pass the intended boot drive to register C in the CCP upon cold boots (see the CP/M Operating System Manual). The intended boot drive in this patch procedure and in your BIOS is indicated by a number relative to zero. (A=0, B=1, C=2, ..., P=15.) This procedure changes the drive selected by BDOS Function 13 (Reset Disk System). Use caution installing this patch because it requires modification to the CP/M submit processor (SUBMIT.COM). SUBMIT must write the $$$.SUB file to the boot drive you specify in this patch. The procedure to modify SUBMIT is described in CP/M V2.2, Patch 03, dated 1/21/82. Instead of setting the byte at 5BBH to 1, as described in Patch 03, set the byte to the specified boot drive plus 1. For example, if the boot drive is 1 (the B drive), then set the byte in SUBMIT.COM at 5BBH to 2. Place the following code in a file named CPMxx.COM (xx = memory size). Determine the CP/M base for your size memory and include it in the code. Assemble and insert CPMxx .COM into the SYSGEN or MOVCPM image exactly as you would patch in a new version of your BIOS. Use the DDT i command followed by the DDT r command. Use the same offset as your custom BIOS. Make a back-up copy of CPMxx.COM before you make the changes. cpmbase equ ? drive equ ? ;boot drive ;0=A, 1=B, ..., 15=P org cpmbase + 0148Ch jmp cpmbase + 15EEh ;was "xra a" org cpmbase + 15EEh mvi a,drive ;was "nop" sta cpmbase + 0B42h ;was "nop" jmp cpmbase + 1490h ;was "nop" Licensed users are granted the right to include these changes in CP/M V2.2 software. he original SUBMIT file after the system executes embedded SUBMIT commands. Licensed users are granted the right to include these modifications in CP/M V2.1 and V2.2 software.  CPMxx.COM before you make the changes. cpmbase equ ? drive equ ? ;boot drive ;0=A, 1=B, ..., 15=P org cpmbase + 0148Ch jmp cpmbase + 15EEh ;was "xra a" org cpmbase + 15EEh mvi a,drive ;was "nop" sta cpmbase + 0B42h ;was "nop" jmp cpmbase + 1490h ;was "nop" Licensed users are granted the right to include these changes in CP/M V2.2 software.  CP/M V2.2 Application Note 11 9/30/82 Chaining Programs Copyright 1982 by Digital Research CP/M and CP/NET are registered trademarks of Digital Research. MP/M II and PL/I-80 are trademarks of Digital Research. Compiled October 1982 Applicable products and version numbers: CP/M V2.2, CP/NET , and MP/M II . Program: CHAIN1.COM and CHAIN2.COM Menu-driven applications can be written to run under CP/M. If you develop applications using PL/I-80 , you can write the programs as a set of overlays. Often, the programs are written in assembly language, or require too much memory to make the overlay feature of PL/I-80 appropriate. Without using overlays, there are only two effective methods of chaining under CP/M V2.2. The first method uses the CP/M SUBMIT facility, in which the main menu program creates a SUBMIT file that lists the programs to be chained. The file must be written to drive A, and have the name $$$.SUB. The SUBMIT file consists of compatible lines, exactly like those you type at the console, following the system prompt. The commands are placed in reverse order, so the last command in the file is the first to be executed. Each command is placed in a 128- byte record with the following format: :n:C1:C2:...:cn:0:...: The first byte of the record contains the number of characters in the command (n), followed by the characters (c1-cn), and terminated with a zero. The number of characters in the command is written as a binary number and each character is represented in ASCII format. It does not matter what follows the terminating zero in the record. For example, if the command was STAT*.*, the first byte would be a binary 8, followed by the letters STAT*.* and terminated with a zero. The second method of program chaining is simpler. You include a procedure in the menu program that loads the next program and chains to it. Each program that might chain to another program must include a copy of the procedure. The procedure must first move itself out of the way so that it is not overwritten by the program it is loading. The example assembly language procedure is written to link with PL/I-80 modules as an external procedure. It can also be used in an assembly language menu program. To link to a PL/I-80 program, the following entry declaration must be included in the P L/I-80 program that does the chaining: dcl chain entry (char(12)); The character 12 variable consists of the standard CP/M File Control Block (FCB) format. The format can be created in the PL/I- 80 program as a structure. A char(12) variable can then be based at the same address as the structure for interfacing to the chain procedure. (See the following PL/I-80 program.) Note: the drive is not an ASCII character, but a binary number between 0 and 16, where 0 is the current default drive and 1 through 16 represent the CP/M drives A through P, respectively. chain 1: proc options(main); /* chain subroutine tester */ dcl 1 fcb static 2 drive fixed(7) init(0), 2 name char(8) init('CHAIN2'); 2 type char(3) init('COM'), dummy char(12) based(db), dp pointer, chain entry(char(12)); put skip list('Chain Text program 1'); dp = addr(fcb); call chain(dummy); put skip(2) list('Shouldn''t be here!!); end chain 1; This program prints the message Chain Test program 1, and chains to the program CHAIN2.COM on the default drive. CHAIN2 is a program identical to CHAIN1, except that it prints Chain Test Program 2 and chains to CHAIN1.COM. CHAIN1 and CHAIN2 then continue to chain back and forth to each other. Note: any statements following the call to the chain procedure are not executed because the chain procedure never returns. The chain procedure consists of two routines. An initialization routine initializes the FCB for the program to be  loaded. Then, the initialization routine relocates the loader and FCB to the very top of the Transient Program Area (TPA), immediately below the BDOS, so it will not be overwritten by the loaded program. The loader begins at the label, code:, and ends at the end of the FCB, at the statement, codelen equ $-code. The loader routine sets the DMA address, reads a sector, checks for an end-of-file, increments the DMA addresses by 128 bytes, and repeats the process. When the end-of-file is detected, it jumps to the chained program. The code is as follows: public chain char(12) extrn ?signal ,/* loads another COM file, and executes it */ bdos equ 5 openf equ 15 readf equ 20 dmaf equ 26  cseq chain. mov e,m ! inx h ! mov d, m ! xchg ;get first arg address lxi d, fcb ! mvi c, 12 ! call move ;move string to FCB lxi d, fcb+12 ! mvi a, 0 ! mvi c, 21 call fill ;zero rest of FCB lhld bdos+1 ! lxi b, -code$len dad b ;make space at ;top of TPA shld jmpr + 1 ;jump address push h ;save code address ;for RET xchg ! lxi h, fcb-code ! dad d ;make address of FCB shld FCBR+1 ;and fix LXI push h ;save FCB  ;destination address lxi h, code ! mvi c, code$len call move ;dest in DE pop d ;recover address of FCB mvi c, openf ! call BDOS ;open file inr a ! jz sig ;if any error, ;signal error pop h ! sphl ! push h ;point stack to top ;of TPA ;and save code addr lxi h, 100h ;point to start of ;TPA ret ;to loader "code" code: push h ! xchg ! mvi c, dmaf call BDOS   ;set the DMA address FCBR lxi d, $-$ ! mvi c, readf ! call BDOS ;read the next record ora a ! jnz 100h ;EOF -| start TPA pop h ! lxi d, 128 ! dad D ;recover and bump DMA jmpr jmp $-$ ;jump to code FCB: ds 1 ;drive code ds 8 ;filename ds 3 ;filetype ds 4 ;control info ds 16 ;disk map ds 1 ;rrec codelen equ $-code move: ;c = # bytes, hi = source, de = desti- nation mov a,m ! stax d inx h ! inx d ! dcr c jnz move ret fill: ;a = byte to fill, c = # bytes, de = start ad- dress stax d ! inx d dcr c ! jnz fill ret sig: lxi h, siglist ! call ?signal ! jmp 0;signal error siglist: ;(fixed(6), ;bit(8),ptr,ptr) dw sigcode, sigsub, sigfil, message sigcode db 6 ;undefined file ;error sigsub db 2 ;arbitrary subcode ;for id sigfil dw fpb ;ptr to file ;parameter block message dw quack ;auxiliary ;operator message fpb ;PL/I fuke ;oaraneter bkicj fcbptr dw FCB-1 ;fcb-1 fpblst dw 0 ;(unused)ptr column dw 0 ;current column ;fixed(15) curline dw 0 ;current line ;fixed(15) curpage dw 0 ;current page ;fixed(15) currec dw 0 ;(unused)fixed(15) lookchr db 0 ;look ahead char  ;char(1) ioend dw 0 ;i/o end address iostk dw 0 ;user stack upon ;sio entry spacer ds 4 ;spacer linesz dw 0 ;line size ;fixed(15) pagesz dw 0 ;page size ;fixed(15) fixedsz dw 0 ;fixed size ;fixed(15) blocksz dw 0 ;block size ;fixed(15) filedes dw 0 ;block size  ;fixed(15) dtitle db 0 ;default title ;char(14)varying quack db 17,'Bad Chain Attempt',0 ;error message Licensed users are granted the right to include these modifications in CP/M, CP/NET and MP/M II software.  ;filename ds 3 ;filetype ds 4 ;control info ds 16 ;disk map blocksz dw 0 ;block size ;fixed(15) filedes dw 0 ;block size  CP/M V2.2 Application Note 12, 11/1/82 Interpreting CTRL-Z in SUBMIT Files Copyright 1982 by Digital Research CP/M is a registered trademark of Digital Research. DDT is a trademark of Digital Research. Compiled November 1982 Applicable products and version numbers: CP/M V2.2 Program: SUBMIT.COM SUBMIT does not accept control characters in SUB files. SUBMIT recognizes certain control characters when preceded by an up arrow. SUBMIT should interpret the two characters ^z as CTRL-Z. Procedure: Make a back-up copy of SUBMIT.COM before you use DDT to make the following changes. A>ddt submit.com DDT V2.2 NEXT PC 0600 0100 -l0441 0441 SUI 61 0443 STA 0E7D 0446 MOV C,A 0447 MVI A,19 0449 CMP C 044A JNC 0456 044D LXI B,019D 0450 CALL 02A7 045 JMP 045E 0456 LDA 0E7D 0459 INR A -s442 0442 61 41 0443 32 . -g0 A>save 5 submit.com Licensed users are granted the right to include these changes in CP/M V2.2 software. subcode ;for id sigfil dw fpb ;ptr to file ;parameter block message dw  CP/M V2.2 Application Note 13, 01/21/82 Exiting PIP When Using SUBMIT and XSUB Copyright 1982 by Digital Research CP/M is a registered trademark of Digital Research. DDT is a trademark of Digital Research. Compiled November 1982 Applicable products and version numbers: CP/M V2.2 Program: PIP.COM When using the SUBMIT and XSUB utilities to execute multiple PIP commands from a SUBMIT file, it is not possible to exit from PIP automatically. The SUBMIT utility does not accept lines with only a carriage return. This application note patch modifies PIP so a period can be used to exit from PIP instead of a carriage return. In the submit file, place a single period (.) on a line by itself after the last PIP command to be executed. Procedure: Make a back-up copy of PIP.COM before you make any changes. The program DDT is required to make the changes. Use the following sequence of commands. 0A>ddt pip.com DDT VERS 2.2 NEXT PC 1E00 0100 -l54f 054F CPI 00 0551 JNZ 055E 0554 LHLD 1DFC . . . -a54f 054F cpi 2 0551 jnc 55e 0554 . -g0 A>save 29 pip.com Licensed users are granted the right to include these changes in CP/M 2.2 software.  ;ptr to file ;parameter block message dw quack ;auxiliary ;operator message ou make any changes. The program DDT is required to make the changes. Use the following sequence of commands. 0A>ddt pip.com DDT VERS 2.2 NEXT PC 1E00 0100 -l54f 054F CPI 00 0551 JNZ 055E 0554 LHLD 1DFC . . . -a54f 054F cpi 2 0551 jnc 55e 0554 . -g0 A>save 29 pip.com Licensed users are granted the right to include these changes in CP/M 2.2 software.  ;ptr to file ;parameter block message dw  CP/M V2.2 Application Note 14, 8/11/82 Turning CTRL-P On and Off from within a CP/M V2.2 SUBMIT File Copyright 1982 by Digital Research CP/M is a registered trademark of Digital Research. Compiled November 1982 Applicable products and version numbers: CP/M V2.2 You can use the SUBMIT facility for batching job streams to turn the CTRL-P toggle on and off from within that SUBMIT file. Although there is a patch to SUBMIT that forces it to accept control characters when preceded by an up-arrow, ^, SUBMIT does not act on a CTRL-C nor a CTRL-P. The assembly-language program which follows turns CTRL-P on or off from within a SUBMIT file. The same assembly code can be used from within an applications program to turn CTRL-P on and off. This program must be executed before XSUB, if XSUB is to be active in the SUBMIT file. Although the CP/M V2.2 Operating System Manual states, "The XSUB command is included as the first line of your submit file...," this is not necessary. XSUB can be activated and deactivated within a SUBMIT file. An assembly-language program is listed that deactivates XSUB and also turns off CTRL-P if it is on. Use this program from within a SUBMIT file to turn the ^P toggle on and off. This program can also be invoked from the console. If the CTRL-P toggle is off, this program turns it on; if on, the program turns it off. It issues an appropriate message to the console that is also echoed on the list device. The program calculates the location of the ^P toggle in the BDOS by getting the BDOS address from the jump instruction located at 0005h in page zero and adding 307h to that address. It then does an exclusive on of the toggle byte to turn ^P on or off. Note: if XSUB is to be active in the submit file, ^P must be turned on before executing XSUB. To turn off ^P in a submit file in which XSUB is active, execute a program that deactivates XSUB, such as the DEXSUB program which is listed following this program. CntlP: org 100h ;start of TPA bdos equ 5h ;BDOS jump instruction bdosa equ bdos+1 ;BDOS entry address pstr equ 9 ;print string function testoff equ 2feh ;offset for verification listcp equ 0dh ;^P offset in page mvic equ 3eh ;MVI C,x instruction cr equ 0dh ;carriage return lf equ 0ah ;line feed lhld bdosa ;pick up address of BDOS in HL lxi d,testoff ;offset of ^P page in DE for add dad d ;HL= compare area in BDOS lxi d,string ;DE= compare string compare: ldax d ;is character a 0? ora a ; jz ok ;yes, we're done cmp m ;is BDOS same as string? inx h ;next byte inx d ; jz compare ;BDOS = string keep looping error: mvi c,pstr ;else print error message lxi d,errormsg ; jmp bdos ;return to CCP from BDOS ok: mvi l,listcp ;listcp page offset mvi a,1  ;toggle ^P byte on or off sub m ;true = 1, false = 0 mov m,a ;put results back in memory cpi 0h ;see if on or off jz othermsg ;to issue appropriate message lxi d,onmsg ;^P turned on jmp print ;go around othermsg: lxi d,offmsg ;^P turned off print mvi c,pstr ;print sign-on message jmp bdos ;return to CCP from BDOS onmsg: db cr,lf,'(^P turned on)$' offmsg db cr,lf,'(^P turned off)$' errormsg: db cr,lf,'Unable to find BDOS$' string db ret,mvic,1,jmp,0 end Dexsub: org 100h ;start of TPA bdos equ 0005h ;bdos location in base page  mvi c,9 ;print string = function 9 lxi d,msg ; call bdos ; mvi c,0 ;system reset = function 0 jmp bdos ;exit bdos to ccp msg db 0dh,0ah,'(xsub deactivated; ^P turned off if on)$' end This application was developed and tested by Digital Research Technical Support using standard Digital Research products. Modifications required to assemble, compile, or execute under non- standard or non-Digital Research products are the responsibility of the user. Digital Research specifically disclaims any express or implied warranty and shall not be liable for any loss of profits, loss of business, loss of use or of data, interruption of business, nor for indirect, special, incidental, or consequential damages of any kind caused by the use or adaptation of this application note. Licensed users are granted the right to include these changes in CP/M software.  on before executing XSUB. To turn off ^P in a submit file in which XSUB is active, execute a program that deactivates XSUB, such as the DEXSUB program which is listed following this program. CntlP: fications required to assemble, compile, or execute under non- standard or non-Digital Research products are the responsibility of the user. Digital Research specifically disclaims any express or implied warranty and shall not be liable for any loss of profits, loss of business, loss of use or of data, interruption of business, nor for indirect, special, incidental, or consequential damages of any kind caused by the CP/M V2.2 Aplication Note 15, 12/22/82 Debugging a CP/M V2.2 BIOS Copyright 1982, 1983 by Digital Research CP/M is a registered trademark of Digital Research. DDT, MAC, and SID are trademarks of Digital Research. Compiled February 1983 You can easily customize the CP/M V2.2 operating system for a particular machine if you use the following steps when it is necessary to debug a BIOS. You must have a system running under CP/M with a minimum of 48K to implement this scheme. CP/M V1.4 is all right, and the system need work only well enough to load DDT or SID . (SID is preferable and should be used if available.) 1) Carefully do a thorough code walk-through. This should take about eight hours. Pay particular attention to the Disk Parameter Blocks and Disk Parameter Headers, especially if you hand-coded these items to assemble your BIOS instead of using the DISKDEF.LIB and MAC . A slight miscalculation in a DPB or DPH can cause a BIOS to perform most functions correctly but fails under obscure circumstances; or, BIOS performs one function properly and fails to perform all others. 2) Using your old CP/M system, create your new system and configure it to 20K. Ensure that the old system does not use location 38H, which is DDT's Restart7 location. 3) Load the new 20K system underneath DDT in the old 48K system's TPA with the command DDT CPM20.COM. Figure 1-1 illustrates this scheme.  48K BIOS 48K BDOS DDT or SID 4A00 20K BIOS 3C06 20K BDOS 3400 20K CCP 980 900 BOOT SYSGEN or MOVCPM 100 BASE PAGE Figure 1-1. Loading Your New System 4) At location 980 (A00h in some systems), you should find the base of the CCP, recognized by two jumps followed by the copyright message. Move the 20K system into its correct memory location using the DDT M (move) command. If DDT lists a next address of 2300, then this command is M980,2300,3400. 5) In the 20K BIOS jump vector at 4A00h, insert breakpoints with Restart7s, or, if you are using SID, insert passpoints. This should be restricted to the disk entry points unless you have a problem with console I/O. If the problem occurs only under certain conditions, place a RST7 initially only at the write entry point. When the conditions under which the problem occurs have been established, use a SAVE 1 xxx to return to the debugger you are using and to set additional breakpoints. 6) Run the 20K CP/M under the 48K CP/M's DDT. Issue the DDT command G4A00, which executes the new BIOS cold boot entry point. The cold boot initializes the base page for the 20K system and jumps to the CCP, which performs a BDOS Function 13 disk reset. The disk reset reads the directory sectors until it encounters a sector containing 0E5h in every byte. 7) If the problem you experienced fails to reappear when you begin single-cycling, it might have been a timing problem. If not timing then it is a logic or coding error, and you must continue to single-cycle the machine, examining the contents of registers and memory locations as you go. Pay particular attention to the following parameters: Track, Sector, Dmaad, Diskno, and the contents of Dirbuf. If you are using blocking/deblocking, also observe the contents of Sekdsk, Hstdsk, Sektrk, Hsttrk, Rsflag, Erflag, and the contents of the host buffer(s). Licensed users are granted the right to include these changes in CP/M software. ght hours. Pay particular attention to the Disk Parameter Blocks and Disk Parameter Headers, especially if you hand-coded these items to assemble your BIOS instead of using the DISKDEF.LIB and MA timing problem. If not timing then it is a logic or coding error, and you must continue to single-cycle the machine, examining the contents of registers and memory locations as you go. Pay particular attention to the following parameters: Track, Sector, Dmaad, Diskno, and the contents of Dirbuf. If you are using blocking/deblocking, also observe the contents of Sekdsk, Hstdsk, Sektrk, Hsttrk, Rsflag, Erflag, and the contents of the host buffer(s). Licensed users are granted the right to include these changes in CP/M software. .PO 0 CP/M V2.2 Patch 01, MOVCPM, 1/21/82 Copyright 1982 by Digital Research CP/M is a registered trademark of Digital Research. DDT is a trademark of Digital Research. Compiled November 1982 Program: MOVCPM Products and Serial Numbers Affected: CP/M V2.2 Error Description: The following modification affects only CP/M systems that use the optional blocking and deblocking algorithms listed in the CP/M Operating System Manual. When you update a file under systems using the algorithms with no data added to the file, the last block of updated records is not written to that file. Contact Digital Reserach or your CP/M distributor if you are not certain that this patch applies to your system.  Patch Procedure: Make a back-up copy of MOVCPM.COM before you use DDT to make the following changes. Use the Assemble command (A) and the Set command (S). After you make the changes, return to the Console Command Processor using the G0 command and save the modified memory image on disk. Update the memory image on tracks 0 and 1 by executing the new MOVCPM program as described in the CP/M Operating System Manual and by integrating your customized I/O system. A>ddt movcpm.com DDT VERS 2.0 NEXT PC 2700 0100 -alcd2 1CD2 nop Old instructions were 1CD3 nop DCR C 1CD4 lxi h,0 DCR C 1CD7 . JNZ 12DF -G0  Number of pages to save is determined from value displayed under NEXT. A>save 38 movcpm.com Install this patch on all CP/M systems that use the blocking/deblocking algorithms listed in the CP/M Operating System Manual. Licensed users are granted the right to include these changes in CP/M V2.2 software. .PA CP/M V2.2 Patch 02, ASM, 1/21/82 Copyright 1982 by Digital Research CP/M is a registered trademark of Digital Research. DDT is a trademark of Digital Research. Compiled November 1982 Program: ASM Products and Serial Numbers Affected: CP/M V1.4 and V2.2 Error Description: ASM occasionally generates an erroneous phase error when the identifier in a SET statement appears within an expression from another statement. For example, X SET 1 Y EQU X END Patch Procedure: Make a back-up copy of ASM.COM before you use DDT to make the following changes. A>ddt asm.com DDT VERS 2.2 NEXT PC 2100 0100 -l1dad 1DAD CALL 1352 1DB0 CPI 05 1DB2 CNZ 20DD -a1dad 1DAD call 1b8d 1DB0 . -l1b8d 1B8D NOP 1B8E NOP 1B8F NOP -a1b8d 1B8D call 1352 1B90 ora a 1B91 jz 1db5 1B94 ret 1B95 . -^C A>save 32 asm.com Licensed users are granted the right to include these changes in CP/M V2.2 software. .PA CP/M V2.2 Patch 03, SUBMIT, 1/21/82 Copyright 1982 by Digital Research CP/M is a registered trademark of Digital Research. DDT is a trademark of Digital Research. Compiled November 1982 Program: SUBMIT.COM Products and Serial Numbers Affected: CP/M V2.2 Error Description: If drive A is not the default drive when you run the SUBMIT program, the $$$.sub file is created on the currently logged-in disk. Therefore, you cannot run a SUBMIT job from any drive other than A. After you make the following changes, the system always creates the $$$.sub file on drive A. Patch Procedure: Make a back-up copy of SUBMIT.COM before you use DDT to make the following changes. A>ddt submit.com DDT V2.2 NEXT PC 0600 0100 -d5bb 05BB 00 24 24 24 20 .$$$ 05C0 20 20 20 20 53 55 42 00 00 00 1A 1A 1A 1A 1A 1A SUB... 05D0 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A ........ - -s5bb 05BB 00 1 05BC 24 . -g0 A>save 5 submit.com Licensed users are granted the right to include these changes in CP/M V2.2 software. .PA CP/M V2.2 Patch 04, PIP, 1/21/82 Copyright 1982 by Digital Research CP/M is a registered trademark of Digital Research. DDT is a trademark of Digital Research. Compiled November 1982 Program: PIP.COM Products and Serial Numbers Affected: CP/M V2.2 Error Description: A problem occurs with the PIP Start and Quit options when the Start and Quit strings are the same length. Patch Procedure: Make a back-up copy of PIP.COM before you use DDT to make the following changes. A>ddt pip.com DDT V2.2 NEXT PC 1E000100 -l1168 1168 LDA 1F62 116B STA 1DF7 116E LXI H,1F62 1171 MVI M,00 1173 LDA 1DF9 1176 INR A 1177 STA 1DF8 -a1168 1168 lxi h,1f62 116B mov a,m 116C sta 1df7 116F mvi m,0 1171 lxi h,1df9 1174 mov a,m 1175 mvi m,0 1177 inr a 1178 dcx h 1179 mov m,a 117A . -g0 A>save 29 pip.com Licensed users are granted the right to include these changes in CP/M V2.2 software. .PA CP/M V2.2 Patch 05, PIP, 1/21/82 Copyright 1982 by Digital Research CP/M is a registered trademark of Digital Research. DDT is a trademark of Digital Research. Compiled November 1982 Program: PIP.COM Products and Serial Numbers Affected: CP/M V2.2 Error Description: A problem occurs with the PIP object file transfer options when copying file to file. Patch Procedure: Make a back-up copy of PIP.COM before you use DDT to make the following changes. A>ddt pip.com DDT V2.2 NEXT PC 1E00 0100 -l0713 0713 LDA 1F5E 0716 LXI H,1E04 0719 ORA M -a0713 0713 lda 1e04 0716 lxi h,1f5e 0719 . -l1099 1099 LDA 1E04 109C RAR 109D JNC 10B2 -a1099 1099 lda 1f5e 109C . -l1640 1640 LDA 1E04 1643 RAR 1644 JNC 1652 -a1640 1640 lda 1f5e  1643 . -g0 A>save 29 pip.com Licensed users are granted the right to include these changes in CP/M V2.2 software. .PA CP/M V2.2 Patch 06, PIP, 01/21/82 Copyright 1982 by Digital Research CP/M is a registered trademark of Digital Research. DDT is a trademark of Digital Research. Compiled November 1982 Program: PIP.COM Products and Serial Numbers Affected: CP/M V2.2 Error Description: When you use PIP to copy to the PRN logical device, the LPT physical device is automatically selected. This patch disables the selection of the LPT device and allows the PRN logical device to be used without affecting the current IOBYTE setting. Patch Procedure: Make a back-up copy of PIP.COM before you make any changes.The program DDT is required to make the changes. The changes are made by the following sequence of commands: 0A>ddt pip.com DDT VERS 2.2 NEXT PC 1E00 0100 -lc66 0C66 LXI H,0003 0C69 MVI M,80 0C6B JMP 0C71 . . . -ac69 0C69 nop 0C6A nop 0C6B . -g0 A>save 29 pip.com Licensed users are granted the right to include these changes in CP/M V2.2 software. .PA CP/M V2.2, Patch 09, DEBLOCK.ASM, 2/11/82 Copyright 1982 by Digital Research, Inc., Pacific Grove, CA 93950 Program: DEBLOCK.ASM  Error Description: The following modification affects only CP/M systems that use the optional blocking and deblocking algorithms listed in Appendix G of the CP/M Alteration Guide. The sector blocking and deblocking algorithms provided in the guide work improperly in certain circumstances. Patch Procedure: Use the CP/M text editor to insert the following changes: Following the comment on line 111 of Appendix G: "read the selected CP/M sector" Insert the following two lines: xra a ;accum = 0 sta unacnt ;unacnt = 0 The next source lines remain as shown: mvi a,1 sta readop ;read operation Insert the following code in your BIOS Home routine: home: lda hstwrt ;check for pending write ora a jnz homed sta hstact ;clear host active flag homed: Continue with the rest of the home routine. Licensed users are granted the right to include these changes in CP/M software. CP/M is a registered trademark of Digital Research. .PA  1099 LDA 1E04 109C RAR 109D JNC 10B2 -a1099 1099 lda 1f5e 109C . -l1640 1640 LDA 1E04 a,1 sta readop ;read operation Insert the following code in your BI ۸ACTDIR ASM4ALLDIR ASMBIOSCALLLIB$ CISUB LIB2mCOSUB LIBF CPMEQU LIBQDPSUB LIBY YFT ASMdQHEXDIR ASMy^HEXSUB LIBPROG LIB?READIR ASM5RECTRAN ASMaTF ASM XALV ASMrXCMD ASM gpXDPB ASM1g ; * * * * * ACTDIR -- DISPLAY ALL ACTIVE DIRECTORY ENTRIES ; MACLIB CPMEQU ; standard names MACLIB PROG ; prolog, service macros MACLIB HEXSUB ; hex display routines MACLIB COSUB ; console output routines MACLIB DPSUB ; 16-bit routines ; PROLOG 30,ACTDIR ; HEADING DB 'Active directory entries, drive ' DRIVE DB 0,CR,LF,CR,LF+80H ; THEFCB DB 0 ; drive already selected DB '????????' ; filename DB '???' ; filetype DB '?' ; ALL extent entries DB 0,0,0 ; s1, s2, record count DW 0,0,0,0,0,0,0,0 ; data map DW 0,0 ; current record, direct addr ; ACTDIR EQU $ LDA CPMFCB ; see if a drivecode was given DCR A ; convert A=1 into A=0 JP DIR2 ; (result not FF -- code given) SERVICE 25 ; omitted, get current drive DIR2 MOV E,A ; save drive for service 14 ADI 'A' ; make printable, STA DRIVE ; ..put in message, LXI H,HEADING CALL COSTR ; ..print heading. SERVICE 14 ; select drive (code in reg E) SERVICE 17,THEFCB ; get first active entry ; DIRLOOP ORA A ; any entries left? RM ; (back to CCP if not) CALL DIRDUMP ; yes, dump this one in hex SERVICE 18,THEFCB JMP DIRLOOP ; do next entry, if any ; ; Dump the directory entry whose number is in [A], ; from the current record in the buffer ; DIRDUMP LXI H,CPMBUFF ADD A ; convert 0,1,2,3 --> 0,32,64,96 ADD A ! ADD A ADD A ! ADD A CALL DP$ADAH ; ..and add to buffer address MVI B,16 ; amount to dump in each line CALL HEXLINE ! CALL COCRLF ; 1st line CALL HEXLINE ! CALL COCRLF ; 2nd line CALL COCRLF ; blank line RET ; ; COMMON SUBROUTINES ; HEXSUBM COSUBM DPSUBM END !6 !4!2j2}oEWYou cannot install !  with this programͳ !! <b!5!aE*X Message file !  not foundͳ *2! "2*4*2!"4*2!"2!-*Ɉ&X"ň"Lj!"È*È*; * * * * * ALLDIR -- DISPLAY ALL DIRECTORY ENTRIES ; MACLIB CPMEQU ; standard names MACLIB PROG ; prolog, service macros MACLIB HEXSUB ; hex display routines MACLIB COSUB ; console output routines MACLIB DPSUB ; 16-bit routines ; PROLOG 30,ALLDIR ; HEADING DB 'All directory entries, drive ' DRIVE DB 0,CR,LF,CR,LF+80H ; THEFCB DB '?' ; ** ALL ** entries DB '????????' ; filename DB '???' ; filetype DB '?' ; ALL extent entries DB 0,0,0 ; s1, s2, record count DW 0,0,0,0,0,0,0,0 ; data map DW 0,0 ; current record, direct addr ; ALLDIR EQU $ LDA CPMFCB ; see if a drivecode was given DCR A ; convert A=1 into A=0 JP DIR2 ; (result not FF -- code given) SERVICE 25 ; omitted, get current drive DIR2 MOV E,A ; save drive for service 14 ADI 'A' ; make printable, STA DRIVE ; ..put in message, LXI H,HEADING CALL COSTR ; ..print heading. SERVICE 14 ; select drive (code in reg E) SERVICE 17,THEFCB ; get first active entry ; DIRLOOP ORA A ; any entries left? RM ; (back to CCP if not) CALL DIRDUMP ; yes, dump this one in hex SERVICE 18,THEFCB JMP DIRLOOP ; do next entry, if any ; ; Dump the directory entry whose number is in [A], ; from the current record in the buffer ; DIRDUMP LXI H,CPMBUFF ADD A ; convert 0,1,2,3 --> 0,32,64,96 ADD A ! ADD A ADD A ! ADD A CALL DP$ADAH ; ..and add to buffer address MVI B,16 ; amount to dump in each line CALL HEXLINE ! CALL COCRLF ; 1st line CALL HEXLINE ! CALL COCRLF ; 2nd line CALL COCRLF ; blank line RET ; ; COMMON SUBROUTINES ; HEXSUBM COSUBM DPSUBM END !6 !4!2j2}oEWYou cannot install !  with this programͳ !! <b!5!aE*X Message file !  not foundͳ *2! "2*4*2!"4*2!"2!-*Ɉ&X"ň"Lj!"È*È*; * * * * * BIOSCALL.LIB -- CODE FOR CALLING BIOS ENTRIES ; B$WBOOT EQU 0*3 ; warm start B$CONST EQU 1*3 ; console status B$CONIN EQU 2*3 ; console input B$CONOUT EQU 3*3 ; console output B$LIST EQU 4*3 ; list output B$PUNCH EQU 5*3 ; punch output B$READER EQU 6*3 ; reader input B$HOME EQU 7*3 ; seek to track 00 B$SELDSK EQU 8*3 ; select drive B$SETTRK EQU 9*3 ; set track B$SETSEC EQU 10*3 ; select record B$SETDMA EQU 11*3 ; set buffer address B$READ EQU 12*3 ; read one record B$WRITE EQU 13*3 ; write one record B$LISTST EQU 14*3 ; list device status B$SECTRAN EQU 15*3 ; skew translation ; ; Subroutine to call BIOS at the entry table ; vector whose offset is in the [A] register ; alters [AF], and [HL]. Preserves [BC], [DE] ; ** NOTE: assumes BIOS is on page boundary ** ; BIOSM MACRO BIOS EQU $ PUSH B ! PUSH D LHLD BOOT+1 ; HL --> WBOOT entry ADD L ; add [A] to make address MOV L,A ; HL --> desired BIOS entry PUSH H ; save that, get LXI H,BIOSRET ; ..return address XTHL ; stack return address, PCHL ; ..go to BIOS, which BIOSRET EQU $ ; returns here POP D ! POP B RET ENDM ; * * * * * END OF BIOSCALL.LIB blank line RET ; ; COMMON SUBROUTINES ; HEXSUBM COSUBM DPSUBM END !6 !4!2j2}oEWYou cannot install !  with this programͳ !! <b!5!aE*X ; * * * * * CISUB.LIB : Console Input Aids ; ; MACRO to create a line buffer with one additional ; byte used by the CIGETC subroutine ; CIBUFF MACRO ?SIZE DB 0 ; index for CIGETC DB ?SIZE ; buffer size for BDOS DB 0 ; returned length of data DS ?SIZE ; space for the data ENDM ; ; MACRO to test if a key has been pressed at the ; terminal. Operand is the label of a termination ; or user-communication routine. ; CITEST MACRO ?CALL SERVICE 11 ORA A ; has a key been hit? CNZ ?CALL ; if so, call given routine ENDM ; ; SET of subroutines for console line input ; CISUBM MACRO ; ; CILINE: READ a line of input to a line buffer (declared with ; the CIBUFF macro) ; INPUT: HL --> the line buffer (preserved) ; OUTPUT: BUFFER filled. A = number of bytes, Z-flag set if ; the input was a null line. ; CILINE EQU $ PUSH H ; save BUFFER address MVI M,00 ; zero index byte for CIGETC INX H ; HL --> buffer for BDOS XCHG ; put in DE for BDOS, SERVICE 10 ; .. fill the BUFFER XCHG ; recover caller's DE INX H ; HL --> length of data MOV A,M ; .. put in A ORA A ; set Z-flag from length POP H ; restore HL --> BUFFER RET ; ; CIGETC: GET next byte from a line buffer ; INPUT: HL --> the line BUFFER (preserved) ; OUTPUT: A = next byte. If there is none, A = CR and ; the Z-flag is set. ; CIGETC EQU $ PUSH B ; save a work register PUSH H ; and the buffer address MOV A,M ; copy index byte, INR M ; .. and step it for next time INX H ! INX H ; HL --> length of data CMP M ; index < length? JC CIGETC2 ; yes (data remains) MVI A,CR ; no, return a CR JMP CIGETC3 CIGETC2 MOV C,A ; compute offset to data from HL: MVI B,0 ; (HL+1) --> first byte in buffer INX B DAD B ; HL --> wanted byte MOV A,M ; pick it up CIGETC3 CPI CR ; set Z-flag for end of line POP H ! POP B ; recover registers RET ; ; CIGETNB: GET next non-blank from a line buffer ; INPUT: HL --> BUFFER (preserved) ; OUTPUT: as for CIGETC, but never a blank. ; CIGETNB EQU $ CALL CIGETC ; get a byte RZ ; .. exit if end of line CPI BLANK ; if it isn't blank, RNZ ; .. return JMP CIGETNB ; ; * * * * * END OF CISUB.LIB ENDM  |"*!!*4*2!͞/! ! Q!a!a!a!a!a!a!a! a! a!͎:EʋZ!!*4*2!e0!ͣ!!P"~! !~!͞*!a*~!N}oEZ!P"~͌ZWE-[͕V!ϋ! !]H1!ϋ!e!4H1eXCOSUBM MACRO ; * * * * * COSUB.LIB CONSOLE OUTPUT SUBROUTINES ; ; Subroutine to write [A] to console ; alters only [A] and [F] ; COUT EQU $ PUSH B ! PUSH D ! PUSH H ANI 7FH ; CP/M expects bit 7 = 0 MOV E,A ; put data where CP/M expects MVI C,2 ; console output function CALL 0005H POP H ! POP D ! POP B RET ; ; Subroutine to write return, linefeed to console ; alters no registers ; COCRLF EQU $ PUSH PSW MVI A,CR ; the return... CALL COUT MVI A,LF ; ...the line feed CALL COUT POP PSW RET ; ; Subroutine to write a space to the console ; alters no registers ; COSPACE EQU $ PUSH PSW MVI A,BLANK CALL COUT POP PSW RET ; ; Subroutine to write bytes addressed by HL, ; up to and including one with bit 7 = 1 ; alters [A] and [F], steps HL to last byte of string. ; COSTR EQU $ MOV A,M ; pick up byte to go CALL COUT ; print it MOV A,M ; look again, and RLC ; ..check if bit 7 RC ; ..return if on INX H ; else point to next, JMP COSTR ; ..and continue ; ; * * * * * END OF COSUB.LIB ENDM restore HL --> BUFFER RET ; ; CIGETC: GET next byte from a line buffer ; INPUT: HL --> the line BUFFER (preserved) ; OUTPUT: A = next byte. If there is none, A = CR and ; the Z-flag is set. ; CIGETC EQU $ PUSH B ; save a work register PUSH H; * * * * * CPMEQU.LIB: EQUATE NAMES USEFUL IN ASSEMBLY CODE ; ; IMPORTANT ADDRESSES ; BOOT EQU 0000H ; warm start exit point BDOS EQU 0005H ; service request entry CPMFCB EQU 005CH ; FCB set up by CCP TPA EQU 0100H ; standard program ORiGin CPMBUFF EQU 0080H ; default I/O buffer ; ; ASCII CHARACTER SET NAMES ; BEL EQU 07H ; bell or beep BS EQU 08H ; backspace HT EQU 09H ; horizontal tab LF EQU 0AH ; line feed VT EQU 0BH ; vertical tab FF EQU 0CH ; formfeed CR EQU 0DH ; carriage return EOF EQU 1AH ; end of file flag (SUB) ESC EQU 1BH ; escape BLANK EQU 20H ; blank UCASE EQU 0FFH-020H ; 'AND' lower case to upper CCASE EQU 40H ; 'OR' control to character ; ; * * * * * END OF CPMEQU.LIB ters [A] and [F], steps HL to last byte of string. ; COSTR EQU $ MOV A,M ; pick up byte to go CALL COUT ; print it MOV A,M ; look again, and RLC ; ..check if bit 7 RC ; ..return if on INX H ; else point to next, JMP COSTR ; ..and continueDPSUBM MACRO ; * * * * * 16 BIT REGISTER SUBROUTINES ; ; Subroutine to load DE from M[HL+A] ; alters only DE, flags ; DP$LDHA EQU $ PUSH H MOV E,A ; make 16 bit offset MVI D,0 DAD D ; add offset to base MOV E,M ; pick up lsb INX H MOV D,M ; get msb POP H RET ; ; Subroutine to shift-right-logical DE ; alters [A], [F] (A = lsb Z, C flags set) ; DP$SRLD EQU $ ORA A ; clear carry MOV A,D ! RAR ! MOV D,A MOV A,E ! RAR ! MOV E,A RET ; ; Subroutine to add [A] to DE ; alters [A], [F] (A = msb, Z, C flags set) ; DP$ADAD EQU $ ADD E MOV E,A MOV A,D ACI 0 MOV D,A RET ; ; Subroutine to add [A] to HL, as above ; DP$ADAH EQU $ ADD L MOV L,A MOV A,H ACI 0 MOV H,A RET ; ; Subroutine to do an unsigned comparison ; of (B,C) :: (H,L). Alters [A], leaves ; flags set as for the compare instruction. ; DP$CPBH EQU $ MOV A,B ! CMP H RNZ ; exit if msb's differ MOV A,C ! CMP L RET ; B=H, exit with C:L flags ; ; * * * * * END OF DPSUB.LIB ENDM restore HL --> BUFFER RET ; ; CIGETC: GET next byte from a line buffer ; INPUT: HL --> the line BUFFER (preserved) ; OUTPUT: A = next byte. If there is none, A = CR and ; the Z-flag is set. ; CIGETC EQU $ PUSH B ; save a work register PUSH H; * * * * * FT: builds Files by Typing ; MACLIB CPMEQU ; include standard names MACLIB PROG ; prolog, service macros MACLIB COSUB ; console output routines MACLIB CISUB ; cisub for cocrlf only ; PROLOG2 FT ; ; * * * ERROR MESSAGES ; CCMSG DB 'Can''t close the file',cr,lf,'$' CWMSG DB 'Error on write',cr,lf,'$' CMMSG DB 'Can''t make the file',cr,lf,'$' FEMSG DB 'File exists -- you erase it',cr,lf,'$' ; INPUT CIBUFF 128 ; define line input buffer ; FT EQU $ ; start of program LDA CPMFCB+1 CPI BLANK ; any operand given? RZ ; done if not ; SERVICE 15,CPMFCB ; open file as for input INR A ; does file exist? JZ FT2 ; no, continue LXI D,FEMSG ; yes, quit with a message JMP ERROREXIT ; FT2 SERVICE 22,CPMFCB ; new file, make it INR A ; did that work? JNZ FT3 ; yes, continue LXI D,CMMSG ; no, quit with a message JMP ERROREXIT ; FT3 LXI D,CPMBUFF ; DE indexes disk buffer MVI B,00 ; [B] counts bytes in it ; FTOP EQU $ ; here for each console line CALL COCRLF ; cursor to next screen line LXI H,INPUT CALL CILINE ; service 10 gets input line JZ FTCLOSE ; all done if null line ; FTLOOP CALL CIGETC ; next inbyte JZ FTEOL ; (end of line) CALL FTPUT ; got a byte, put it in file JMP FTLOOP ; ..and get next ; FTEOL MVI A,CR ; end of input line, put CALL FTPUT ; ..CR, LF into MVI A,LF ; ..the file CALL FTPUT JMP FTOP ; then get next line ; ; WHEN a null line is received, fill the rest of the ; buffer with EOF marks, write it, and close the file ; FTCLOSE MVI A,EOF ; fill disk record with SUBs STAX D INX D INR B JP FTCLOSE SERVICE 21,CPMFCB ; then write last record ORA A ; did it work? JNZ CANT$WRITE SERVICE 16,CPMFCB ; close the file INR A ; check success RNZ ; return to EPILOG if ok LXI D,CCMSG JMP ERROREXIT ; ; Subroutine to stow the byte in [A] in the disk buffer. ; DE --> BUFFER, BC counts bytes in it. write the buffer ; when it fills up. ; FTPUT STAX D ; put byte in buffer, INX D ; step buffer index, INR B ; count bytes in this record RP ; return if not up to 128 LXI D,CPMBUFF ; reset buffer ptr, MVI B,00 ; ..and byte count SERVICE 21,CPMFCB ; then write record ORA A ; ..and if it worked RZ ; ..continue in program CANT$WRITE EQU $ LXI D,CWMSG ; if it did not, JMP ERROREXIT ; ..quit with a message ; ; COMMON SUBROUTINES ; CISUBM COSUBM END *2!e0!ͣ!!P"~! !~!͞*!a*~!N}oEZ!P"~͌ZWE-[͕V!ϋ! !]H1!ϋ!e!4H1eXYR[ Z%[R%[!M/-[!EZa*~!N}oEst!P"~͌ZWEst͕V!ϋ! !]H1!ϋ!e!4H1eX; * * * * * HEXDIR -- DISPLAY EXTENT-0 DIRECTORY ENTRIES ; MACLIB CPMEQU ; standard names MACLIB PROG ; prolog, service macros MACLIB HEXSUB ; hex display routines MACLIB COSUB ; console output routines MACLIB DPSUB ; 16-bit routines ; PROLOG 30,HEXDIR ; HEADING DB 'Extent-zero directory entries, drive ' DRIVE DB 0,CR,LF,CR,LF+80H ; THEFCB DB 0 ; drive already selected DB '????????' ; filename DB '???' ; filetype DB 0 ; extent zero entries DB 0,0,0 ; s1, s2, record count DW 0,0,0,0,0,0,0,0 ; data map DW 0,0 ; current record, direct addr ; HEXDIR EQU $ LDA CPMFCB ; see if a drivecode was given DCR A ; convert A=1 into A=0 JP DIR2 ; (result not FF -- code given) SERVICE 25 ; omitted, get current drive DIR2 MOV E,A ; save drive for service 14 ADI 'A' ; make printable, STA DRIVE ; ..put in message, LXI H,HEADING CALL COSTR ; ..print heading. SERVICE 14 ; select drive (code in reg E) SERVICE 17,THEFCB ; get first active entry ; DIRLOOP ORA A ; any entries left? RM ; (back to CCP if not) CALL DIRDUMP ; yes, dump this one in hex SERVICE 18,THEFCB JMP DIRLOOP ; do next entry, if any ; ; Dump the directory entry whose number is in [A], ; from the current record in the buffer ; DIRDUMP LXI H,CPMBUFF ADD A ; convert 0,1,2,3 --> 0,32,64,96 ADD A ! ADD A ADD A ! ADD A CALL DP$ADAH ; ..and add to buffer address MVI B,16 ; amount to dump in each line CALL HEXLINE ! CALL COCRLF ; 1st line CALL HEXLINE ! CALL COCRLF ; 2nd line CALL COCRLF ; blank line RET ; ; COMMON SUBROUTINES ; HEXSUBM COSUBM DPSUBM END ord ORA A ; did it work? JNZ CANT$WRITE SERVICE 16,CPMFCB ; close the file INR A ; check success RNZ ; return to EPILOG if ok LXI D,CCMSG JMP ERROREXIT ; ; Subroutine to stow the byte in [A] in the disk buffer. ; DE --> BUFFER, BC countHEXSUBM MACRO ; * * * * * HEXSUB.LIB -- HEX display routines for MAC assembler ; -- assumes presence of COSUB.LIB routines ; ; Subroutine to do an addressed dump of one line. HL --> DATA, ; [B] has length (shouldn't exceed 16 or so) ; HL is incremented so successive lines can be dumped, ; BC, DE are preserved, AF is trashed. ; HEXDUMP EQU $ CALL HEXADDR ; display HL contents in hex MVI A,':' ; then a colon CALL COUT CALL COSPACE ; .. a blank, and ... ; .. fall into HEXLINE ; ; Subroutine to dump [B] bytes of HL --> DATA to console ; registers used as for HEXDUMP ; HEXLINE EQU $ PUSH B ; save parameters for PUSH H ; ..re-use with alpha part ; HEXL2 MOV A,M ; current byte.. CALL COHEX ; ..printed in hex CALL COSPACE ; ..and a blank after. INX H ; step to next byte, DCR B ; if any, JNZ HEXL2 ; (there is) ; CALL COSPACE ; two blanks after hex display CALL COSPACE POP H ; retrieve data address POP B ; ..and count PUSH B ; preserve count for caller ; HEXL3 MOV A,M ; current byte.. ANI 7FH ; (less its bit 7) CPI 20H ; ..is it control? JC HEXL4 ; (yes) CPI 7FH ; ..is it DEL? JNZ HEXL5 ; (no) HEXL4 MVI A,'.' ; unprintable byte, use a dot HEXL5 CALL COUT ; print byte or dot INX H ; step to next, DCR B ; ..if any JNZ HEXL3 ; POP B ; restore caller's count RET ; ; Subroutine to print HL as an address in hex ; alters only [A], [F] ; HEXADDR EQU $ MOV A,H CALL COHEX MOV A,L CALL COHEX RET ; ; Subroutine to print the hex byte in [A] ; alters only [A], [F] ; COHEX EQU $ PUSH PSW ; save the byte CALL HEXLEFT ; get and CALL COUT ; ..print left half, POP PSW ; retrieve byte, CALL HEXRIGHT; ..do right half CALL COUT RET ; HEXLEFT EQU $ ; set up for left nybble RAR ! RAR ! RAR ! RAR HEXRIGHT EQU $ ; do nybble now on right ANI 0FH ; isolate 4 bits CPI 0AH ; check alpha case JC HEXLR ; [A] < 0AH ADI 'A'-3AH ; correct for alpha HEXLR ADI '0' ; convert to printable RET ; ; Subroutine to return the hex values of [A], ; least significant half in [C], most significant ; in [A]. Used when ASCII-hex is to be stored. ; HEXBYTE EQU $ PUSH PSW ; save the byte CALL HEXRIGHT; ..put the right half MOV C,A ; ..into [C] register POP PSW CALL HEXLEFT ; and the left half RET ; ..into [A] ; * * * * * END OF HEXSUB.LIB ENDM *2!e0!ͣ!!P"~! !~!͞*!a*~!N}oEZ!P"~͌ZWE-[͕V!ϋ! !]H1!ϋ!e!4H1eX͏YR[ Z%[R%[!M/-[!EZa*~!N}oEst!P"~͌ZWEst͕V!ϋ! !]H1!ϋ!e!4H1eX; ; PROGRAM ENTRY MACRO: build local STACK, save CCP's stack ; on it. Handle return to CCP if main returns here. ; PROLOG MACRO ?SIZE,?MAIN LOCAL STKSIZE IF NUL ?SIZE STKSIZE SET 16 ELSE STKSIZE SET ?SIZE ENDIF ORG 100H ; start at TPA LXI H,0 DAD SP ; HL = CCP stack ptr LXI SP,STDSTACK ; set our stack ptr PUSH H ; save CCP ptr for exit  IF NUL ?MAIN CALL MAIN ; call mainline code ELSE CALL ?MAIN ; call mainline code ENDIF ; ; on normal EXIT, MAIN line will return to here ; EPILOG POP H ; recover CCP's stack ptr, SPHL ; ..activate it, and RET ; ..return to CCP ; DS 2*STKSIZE ; reserve stack space STDSTACK EQU $ ENDM ; ; ; PROGRAM ENTRY MACRO for complex programs: find bottom of ; CCP and set stack there, call MAIN with HL = END of storage. ; PROLOG2 MACRO ?MAIN ORG 100H ; start at TPA LHLD BDOS+1 ; HL --> BDOS SPHL ; stack starts under BDOS LXI D,0-128 ; negative stack size DAD D ; HL --> stack bottom DCX H ; HL --> last usable byte IF NUL ?MAIN CALL MAIN ; call mainline code ELSE CALL ?MAIN ; call mainline code ENDIF ; ; ON any exit, control will return here ; EPILOG JMP BOOT ; do a warm start ; ; ERROR EXIT to issue message addressed by DE, erase ; active SUBMIT file (if any). ; ERROREXIT EQU $ MVI C,9 ; print line to '$' CALL BDOS ;  ; ERROR EXIT to terminate SUBMIT only ; ERROROUT EQU $ LXI D,SUBMITFCB MVI C,19 ; erase file in FCB CALL BDOS JMP EPILOG ; exit by single point ; ; FCB used for erasing SUBMIT file 'A:$$$.SUB' -- ONLY ; first 16 bytes are significant ; SUBMITFCB EQU $ DB 1,'$$$ SUB',0,0,0,0 ENDM ; ; ; SERVICE MACRO: call BDOS for a service, saving ; all registers except A and sometimes HL. Load ; DE register with parameter if one is given. ; SERVICE MACRO ?S,?DE PUSH B ; save BC and.. PUSH D ; ..DE always IF (?S NE 12) AND (?S NE 24) AND (?S NE 27) AND (?S NE 29) AND (?S NE 31) PUSH H ; save HL when BDOS doesn't return it ENDIF IF NOT NUL ?DE LXI D,?DE ; load parameter ENDIF MVI C,?S ; set service number CALL 0005H ; and call BDOS IF (?S NE 12) AND (?S NE 24) AND (?S NE 27) AND (?S NE 29) AND (?S NE 31) POP H ; restore HL if it doesn't have the result ENDIF POP D ; restore DE.. POP B ; and BC, always ENDM *2!e0!ͣ!!P"~! !~!͞*!a*~!N}oEZ!P"~͌ZWE-[͕V!ϋ! !]H1!ϋ!e!4H1eX͏YR[ Z%[R%[!M/-[!EZa*~!N}oEst!P"~͌ZWEst͕V!ϋ! !]H1!ϋ!e!4H1eX; * * * * * READIR -- READ DIRECTORY VIA BIOS CALLS ; MACLIB CPMEQU ; standard names MACLIB PROG ; prolog, service macros MACLIB COSUB ; console output MACLIB HEXSUB ; hex displays MACLIB DPSUB ; 16 bit routines MACLIB BIOSCALL ; bios interface ; PROLOG2 READIR ; HEADING DB 'Physical directory entries, drive ' DRIVE DB 0,CR,LF,CR,LF+80H ERRMSG DB CR,LF,'BIOS reports read error.',CR,LF,'$' DPB$DRM EQU 07H ; offset of DRM field in DPB DPB$OFF EQU 0DH ; offset of OFF field in DPB NRECS DB 0 ; records left to go ; READIR EQU $ LDA CPMFCB DCR A JP REA2 SERVICE 25 REA2 MOV E,A MOV C,A ADI 'A' STA DRIVE LXI H,HEADING ! CALL COSTR SERVICE 14 SERVICE 31 ; MVI A,DPB$DRM CALL DP$LDHA INX D CALL DP$SRLD CALL DP$SRLD MOV A,E STA NRECS ; MVI A,DPB$OFF CALL DP$LDHA PUSH D ; MVI A,B$SELDSK CALL BIOS MOV E,M ! INX H ! MOV D,M ; POP B MVI A,B$SETTRK CALL BIOS LXI B,0 ; RECLOOP PUSH B MOV A,E ! ORA D JZ NOXLATE MVI A,B$SECTRAN CALL BIOS PUSH H ! POP B NOXLATE MVI A,B$SETSEC CALL BIOS MVI A,B$READ CALL BIOS POP B ORA A JZ REA3 LXI D,ERRMSG JMP ERROREXIT ; REA3 CALL PRINT LDA NRECS DCR A STA NRECS RZ INX B JMP RECLOOP ; PRINT EQU $ PUSH B LXI H,CPMBUFF MVI B,16 MVI C,4 PLOOP CALL HEXLINE ! CALL COCRLF CALL HEXLINE ! CALL COCRLF CALL COCRLF DCR C ! JNZ PLOOP CALL COCRLF ! CALL COCRLF POP B RET ; ; COMMON SUBROUTINES ; COSUBM HEXSUBM DPSUBM BIOSM END S doesn't return it ENDIF IF NOT NUL ?DE LXI D,?DE ; load parameter ENDIF MVI C,?S ; set service number CALL 0005H ; and call BDOS IF (?S NE 12) AND (?S NE 24) AND (?S NE 27) AND (?S NE 29) AND (?S NE 31) POP H ; restore HL if it doesn'; * * * * * RECTRAN -- DISPLAY SKEW TRANSLATION ; MACLIB CPMEQU ; standard names MACLIB PROG ; prolog, service macros MACLIB COSUB ; console output MACLIB HEXSUB ; hex displays MACLIB BIOSCALL ; bios interface ; PROLOG 30,RECTRAN ; HEADING DB 'Record skew pattern for disk ' DRIVE DB 0,CR,LF,CR,LF+80H NOXLATE DB 'that disk needs no translation.',CR,LF+80H NRECS DW 0 PLENGTH EQU 16 NPRINT DB 0 ; RECTRAN EQU $ MVI A,PLENGTH STA NPRINT ; initialize count of numbers LDA CPMFCB ; see if drive specified DCR A ; convert FCB for to service 14 form JP REC2 ; (yes, drive given) SERVICE 25 ; omitted, get current drive REC2 MOV E,A ; save drive for service 14 MOV C,A ; ..and for BIOS seldsk call ADI 'A' ; make printable STA DRIVE ; ..put in heading & print LXI H,HEADING ! CALL COSTR SERVICE 14 ; establish drive to BDOS SERVICE 31 ; HL --> DPB, set DE = SPT MOV E,M ! INX H ! MOV D,M XCHG ; save records/track SHLD NRECS ; ..for loop control MVI A,B$SELDSK CALL BIOS ; HL --> DPH, set DE --> xlate table MOV E,M ! INX H ! MOV D,M MOV A,E ; if that address is zero, ORA D ; ..no translation is done. JNZ REC3 LXI H,NOXLATE ! CALL COSTR RET ; ..in which case, quit REC3 LXI B,0 ; clear record number ; RECLOOP MVI A,B$SECTRAN CALL BIOS ; HL = xlate(BC) CALL PRINT ; display the result LHLD NRECS ; decrement loop variable DCX H MOV A,L ! ORA H RZ ; return to CCP if done SHLD NRECS ; save loop count INX B ; step record number JMP RECLOOP ; and continue ; PRINT CALL HEXADDR ; print HL as hex word CALL COSPACE ; ..and a space LDA NPRINT ; see if end of line DCR A STA NPRINT RNZ ; (no, continue) MVI A,PLENGTH STA NPRINT ; refresh line count CALL COCRLF ; start a new line RET ; ; COMMON SUBROUTINES ; COSUBM HEXSUBM BIOSM END *2!e0!ͣ!!P"~! !~!͞*!a*~!N}oEZ!P"~͌ZWE-[͕V!ϋ! !]H1!ϋ!e!4H1eXYR[ Z%[R%[!M/-[!EZa*~!N}oEst!P"~͌ZWEst͕V!ϋ! !]H1!ϋ!e!4H1eX; * * * * * TF: a program to Type Files ; MACLIB CPMEQU ; include standard names MACLIB PROG ; prolog, service macros MACLIB COSUB ; console output routines MACLIB CISUB ; cisub for citest macro ; PROLOG 20,TF ; set up stack ; TF EQU $ LDA CPMFCB+1; first filename byte CPI BLANK ; no operand given? RZ ; all done if so ; SERVICE 15,CPMFCB ; open the file INR A ; check for error (FFH) RZ ; exit if open failed ; TFTOP EQU $ SERVICE 20,CPMFCB ; read a record to 0080h ORA A ; ..if there is another RNZ ; (there wasn't -- exit) ; CITEST TFABORT ; abort if a key's been hit ; LXI H,CPMBUFF ; start of buffer MVI B,128 ; ..and its length ; TFLOOP MOV A,M ; next file byte.. CPI EOF ; is it an EOF mark? RZ ; quit iof so, CALL COUT ; ..else type it and INX H ; point to next byte DCR B JNZ TFLOOP ; do another if there is one, JMP TFTOP ; ..or get next record ; TFABORT RET ; exit when CITEST finds a key hit. ; ; SUBROUTINES: COSUBM END  to BDOS SERVICE 31 ; HL --> DPB, set DE = SPT MOV E,M ! INX H ! MOV D,M XCHG ; save records/track SHLD NRECS ; ..for loop control MVI A,B$SELDSK CALL BIOS ; HL --> DPH, set DE -; * * * * * XALV -- EXAMINE THE ALLOCATION VECTOR ; MACLIB CPMEQU ; standard names MACLIB PROG ; prolog, service macros MACLIB DPSUB ; 16 bit routines MACLIB COSUB ; console output routines ; PROLOG 30,XALV ; DPB$DSM EQU 5 ; offset to 'DSM' in DPB HEADING DB 'Allocation vector of disk ' DRIVE DB 0,CR,LF,CR,LF+80H ; XALV EQU $ LDA CPMFCB ; see if a drivecode was given DCR A ; convert A=1 into A=0 JP XAL2 ; (result not FF -- code given) SERVICE 25 ; omitted, get current drive XAL2 MOV E,A ; save drive for service 14 ADI 'A' ; make printable, STA DRIVE ; ..put in message, LXI H,HEADING CALL COSTR ; ..print heading. SERVICE 14 ; select drive (code in reg E) ; SERVICE 31 ; HL --> disk parameters MVI A,DPB$DSM ; offset to DPB.DSM CALL DP$LDHA ; load that to DE MVI A,7 ; round DSM up to CALL DP$ADAD ; ..a multiple of 8 MVI B,3 ; ..then divide it by 8 XALSR CALL DP$SRLD ; ..by shifting DE right DCR B ! JNZ XALSR ; DE = Number of bytes in the allocation vector SERVICE 27 ; HL --> allocation vector MVI B,8 ; B = bytes per line ; XALOOP CALL XALBYTE ; display 8 bits, DCX D ; ..count it MOV A,E ! ORA D ; .. check for zero, RZ ; ..back to CCP if that's it DCR B ; see if that was 64 bits JNZ XALOOP ; (continue if not) CALL COCRLF ; new line after 64 bits MVI B,8 JMP XALOOP ; continue ; ; Subroutine to print the 8 bits of the byte at [HL] ; increments HL to next byte, alters [AF] ; XALBYTE PUSH B ; save a work register MVI C,8 ; [C] has the loop count MOV B,M ; ..[B] the byte itself INX H ; increment data pointer ; XB1 MOV A,B ; current bit to carry and RAL ! MOV B,A MVI A,'0' ; ..print a zero, or ACI 00 ; ..a one, depending on carry CALL COUT DCR C ! JNZ XB1 ; POP B RET ; ; COMMON SUBROUTINES ; DPSUBM COSUBM END LOOP ; and continue ; PRINT CALL HEXADDR ; print HL as hex word CALL COSPACE ; ..and a space LDA NPRINT ; see if end of line DCR A STA NPRINT RNZ ; (no, continue) MVI A,PLENGTH S; * * * * * XCMD -- EXAMINE THE COMMAND OPERANDS ; MACLIB CPMEQU ; include standard names MACLIB PROG ; prolog, service macros MACLIB COSUB ; console output routines MACLIB HEXSUB ; hex display routines ; PROLOG 20,XCMD ; FCBMSG DB 'Default FCB --',CR,LF,CR,LF+80H TAILMSG DB CR,LF,'Command tail --',CR,LF,CR,LF+80H ; XCMD EQU $ LXI H,FCBMSG ; print FCB heading CALL COSTR LXI H,CPMFCB MVI B,16 ; dump default FCB CALL HEXDUMP ; ..in two lines CALL COCRLF CALL HEXDUMP ! CALL COCRLF ; LXI H,TAILMSG ; print tail heading CALL COSTR LXI H,CPMBUFF MOV A,M ; get length of tail and ADI 00FH ; ..round to multiple of ANI 0F0H ; ..sixteen RZ ; (exit if no operands) XCMD2 MOV C,A ; ..save length in [C] CALL HEXDUMP ; dump 16 bytes of tail CALL COCRLF MOV A,C ! SUB B ; count 16 bytes JNZ XCMD2 ; ..continue if more RET ; ; COMMON SUBROUTINES ; HEXSUBM COSUBM END SERVICE 27 ; HL --> allocation vector MVI B,8 ; B = bytes per line ; XALOOP CALL XALBYTE ; display 8 bits, DCX D ; ..count it MOV A,E ! ORA D ; .. check for zero, RZ ; ..back to CCP if that's it DCR B ; see if that was 64 bits JNZ XALOOP ; (; * * * * * XDPB -- DISPLAY THE DISK PARAMETER BLOCK ; MACLIB CPMEQU ; standard names MACLIB PROG ; prolog, service macros MACLIB HEXSUB ; hex display routines MACLIB COSUB ; console output routines ; PROLOG 30,DPB ; DISPLAY EQU $ DB 'Disk Parameter Block for drive ' DRIVE DS 1 ! DB CR,LF DB 'SPT: ' SPT DS 4 ! DB ' records per track',CR,LF DB 'BSH: ' BSH DS 2 ! DB ' recno >> BSH = block number',CR,LF DB 'BLM: ' BLM DS 2 ! DB ' recno AND BLM = record in block',CR,LF DB 'EXM: ' EXM DS 2 ! DB ' logical extent versus physical',CR,LF DB 'DSM: ' DSM DS 4 ! DB ' highest block number (origin 0)',CR,LF DB 'DRM: ' DRM DS 4 ! DB ' highest directory number (origin 0)',CR,LF DB 'ALV: ' ALV DS 4 ! DB ' bits reserving directory blocks',CR,LF DB 'CKS: ' CKS DS 4 ! DB ' size of check vector in bytes',CR,LF DB 'OFF: ' OFF DS 4 ! DB ' number of reserved tracks',CR,LF+80H ; DPB EQU $ LDA CPMFCB ; drivecode given? DCR A ; convert A=01 into A=00 JP DPB2 ; (yes, one was given) SERVICE 25 ; no drivecode, get current disk DPB2 MOV E,A ; save for select service ADI 'A' ; make drivecode printable, STA DRIVE ; ..put into display SERVICE 14 ; ..and select it SERVICE 31 ; HL --> DPB for current disk PUSH H ; (save it for dump) ; LXI D,SPT ; DE --> field in display CALL CVT2 ; make printable, advance HL & DE ; LXI D,BSH ! CALL CVT1 LXI D,BLM ! CALL CVT1 LXI D,EXM ! CALL CVT1 LXI D,DSM ! CALL CVT2 LXI D,DRM ! CALL CVT2 LXI D,ALV ! CALL CVT1 ! CALL CVT1 LXI D,CKS ! CALL CVT2 LXI D,OFF ! CALL CVT2 LXI H,DISPLAY CALL COSTR ; print the whole thing POP H ; then dump it all in hex MVI B,15 CALL HEXDUMP ! CALL COCRLF ; RET ; return to CCP ; CVT2 EQU $ ; display 16 bit integer ; (8080 FORM -- first byte is the least-significant) PUSH H ; save --> LSB INX H ; HL --> MSB CALL CVT1 ; ..convert, store that XTHL ; save HL, HL --> LSB CALL CVT1 ; ..convert, store that POP H ; HL --> next data RET ; CVT1 EQU $ ; display byte at HL++ MOV A,M ; get byte INX H ; .. advance HL CVT1A CALL HEXBYTE ; A, C = ASCII display STAX D ; put left in display INX D MOV A,C ; put right in display STAX D INX D RET ; ; * * * * * COMMON SUBROUTINES ; HEXSUBM COSUBM END BM HEXSUBM BIOSM END *2!e0!ͣ!!P"~! !~!͞*!a*~!N}oEZ!P"~͌ZWE-[͕V!ϋ! !]H1!ϋ!e!4H1eX LXI D,CKS ! CALL CVT2 LXI D,OFF ! CALL CVT2 LXI H,DISPLAY CALL COSTR ; print the whole thing POP H ; then dump it all in hex MVI B,15 CALL HEXDUMP ! CALL COCRLF ; RET ; return to CCP ; CVT2 EQU $ ; display 16 bit integer ; (8080 FORM -- first byte is the least-significant) PUSH H ; save --> LSB INX H ; HL --> MSB CALL CVT1 ; ..convert, store that XTHL ; save HL, HL --> LSB CALL CVT1 ; ..convert, store that POP H ; HL --> next data RET ; CVT1 EQU $ ; display byte at HL++ MOV A,M ; get byte INX H ; .. advance HL CVT1A CALL HEXBYTE ; A, C = ASCII display STAX D ; put left in display INX D MOV A,C ; put right in display STAX D INX D RET ; ; * * * * * COMMON SUBROUTINES ; HEXSUBM COSUBM END .PO5 ; DISC LABELING PROGRAM.............. ; ;+======================================================================+ ;| | ;|TITLE: DSKLBL.ASM - Print Sorted Disk Directory on Label | ;| | ;|DATE: 02/15/83 VERSION: 2.0 LANGUAGE: ASM-80 | ;| | ;|SYSTEM: Standard CP/M-80, minimum 24k | ;| | ;|PURPOSE: To print a alphabetically sorted disk directory on a label | ;| using special condensed font of your printer for the main | ;| directory and enlarged font to make the first entry in the | ;| directory and title on the label. | ;|  | ;|SUMMARIZE REVISION: Made printer and label characteristics modular | ;| at front of program. Deleted 'SETUP' function | ;| key printout. Added optional title capability. | ;| | ;|SUBMITTED BY: Melissa Gray [leave messages on RBBS (415)965-4097] | ;|ORIGINAL AUTHOR: unknown (derived from FMAP (Catalog) program) | ;|OTHER CONTRIBUTORS: Dennis McFerran (called it DSCLABEL.ASM) | ;| (There's also another new version of DSCLABEL | ;| with the 'SETUP' printout changed to an option) | ;| | ;|REFERENCE: FMAP program | ;| | ;|DOCUMENTATION: Fairly extensive setup documentation in front of the | ;| source, though not entirely clear. User documentation| ;| is limited and source documentation is fairly good. | ;| | ;|PROGRAM USAGE: Would be very useful to anyone needing this | ;| capability. Fairly easy to install, although it | ;| requires edits for printers other than the NEC-8023 | ;| MX100 AND OKIDATA with label size of 4 X 1 7/16. | ;| | ;|RATING: *** (needs to be able to read label size parameters on line) | ;| | ;+======================================================================+ ; ; ; 6/29/82---THIS PROGRAM, WHICH WAS ADAPTED FROM ; THE FMAP(CATALOG) PROGRAM, WILL LIST ; YOUR FILE DIRECTORY ON A LABEL SIZED ; OUTPUT AND THEN LIST THE SPECIAL FUNCTION ; KEY INSTRUCTIONS THAT HAVE BEEN ADDED TO ; YOUR DISC VIA THE 'SETUP' PROGRAM. I AM ; USING AN EPSON MX-100. I THINK THAT THE ; COMMANDS, WILL WORK ON AN MX-80 BUT I'M NOT ; SURE. TRY IT AND LET ME KNOW. IT WOULD ; HAVE TO BE MODIFIED FOR OTHER PRINTERS. ; ;******************************************************************* ; ; THIS IS MY ABOUT MY FIRST USABLE(?) ASSEMBLY LANGUAGE EFFORT. ; I WOULD APPRECIATE ANY COMMENTS OR SUGGESTIONS: ; DENNIS MC FERRAN ; 1038 POLK LANE ; SAN JOSE, CA 95117 ; (408-296-6021) ;******************************************************************** ; ; TO USE-------- ; 1) PLACE DISC WITH THIS PROGRAM ON IT IN ONE DRIVE ; 2) TURN ON YOUR PRINTER AND HAVE LABELS IN TO PRINT ; 3) PLACE DISC THAT YOU WOULD LIKE TO LABEL IN OTHER DRIVE (YOU ; MAY ALSO LABEL THE DISC CONTAINING THIS PROGRAM) ; 4) RESET THE DRIVE WITH THE DISC TO BE LABELLED (^C) ; 5) RUN LABLDISK (e.g,: B> A:LABLDISK) ; 6) REPEAT AS MANY TIMES AS YOU'D LIKE FROM STEP 3 ; TRUE EQU 0FFH FALSE EQU 0 ; ; ;*********EQUATES TO SET FOR YOUR SYSTEM******************************** ; DOTITLE EQU TRUE ;Set TRUE if you supply TITLED parameters for ; your printer below NEC8023 EQU TRUE ;Set TRUE if your printer is the NEC PC-8023A-C EPMX100 EQU FALSE ;Set TRUE if your printer is the EPSON MX-100 OKIDATA EQU FALSE ;SET TRUE if your printer is OKIDATA ; LBLLNG EQU 11 ;Set value to the number of lines your label can ; hold based on the line spacing you select below ; and the height of your label in inches. The ; figure 11 is for 1 7/16" high labels. Change to ; 7 for 15/16" high labels. LBLSPC EQU 1 ;Set value to the number of lines between labels ; on your sheet, based on your line spacing LENCOL EQU 58 ;Set value to # of usable columns across label, ; based on width (in inches) of label times ; characters per inch(CPI) of your condensed font. LBLWID SET (LENCOL+SPCSIZ)/(12+SPCSIZ) ; Sets value to the number of 12 character file ; names and SPACES (see below) that can be ; printed across the width of your label. MAXFIL EQU 64 ;Set value to the maximum number of disk files ; that may be encountered on one of the disks ; you will be labelling ; ; ;*********EQUATE TABLE - BDOS*********************** ; * RDCHR EQU 1 ;READ CHAR FROM CONSOLE * WRCHR EQU 5 ;WRITE CHR TO PRINTER * PSTRING EQU 9 ;PRINT CONSOLE BUFF * CONST EQU 11 ;CHECK CONS STAT * FSRCHF EQU 17 ; " " * FSRCHN EQU 18 ; " " * FCB EQU 5CH ;FILE CONTROL BLOCK * BDOS EQU 5 ; * ; * ESC EQU 1BH ; CODE * CR EQU 0DH ;CARRIAGE RETURN * LF EQU 0AH ;LINE FEED * ;*************************************************** ; ; ORG 100H JMP START ;Bypass User changeable data ; ;*********************************************************************** ; ; BUILD THE FOLLOWING TABLES FOR YOUR PRINTER IF IT'S NOT HERE ; ; TITLED is the table used to set your line spacing (usually 6 ; lines per inch) and your large print font (usually ; 10 CPI) and your enlarged print mode for printing the ; the first directory (in alphabetical order) as the ; title on your label. This parameter is not required ; if DOTITLE is set to FALSE above. ; ; SETPRT is the table used to set your line spacing (usually to 9 ; lines per inch) and your small print font (usually ; Condensed). It may include any other printer characteristics ; you'd like. It must end with an '$'. ; ; RESET is the table used to return your printer to its normal ; line spacing (usually 6 lines per inch) and print font ; (usually 10 CPI). It may also include any other printer ; characteristics you'd like. It must also end with an "$". ; ; TITLED EQU $ IF NEC8023 DB ESC,'B' ;Set line spacing to 1/8" DB ESC,'N' ;Set font to Normal (10 CPI) DB 45H ;Set Enlarged character command DB ESC,'!' ;Set Enhanced print mode on ENDIF ; IF OKIDATA DB ESC,'8' ;Set line spacing to 1/8" DB 1EH ;Set font to Normal (10 CPI) DB 1FH ;Set Enlarged character command DB ESC,'T' ;Set Enhanced print mode on ENDIF ; IF EPMX100 DB CR,ESC,'A',9 ;Set line spacing to 1/8" DB 0EH ;Set expanded print DB ESC,'E' ;Set Enhanced print mode on ENDIF ; Insert new printer definitions here (with IF/ENDIF) DB '$' ;End of TITLED table ; SETPRT EQU $ IF NEC8023 DB CR,ESC,'T',31H,37H ;Set line spacing to 17/144" DB ESC,'Q' ;Set font to Condensed (17 CPI) DB 46H ;Clear Enlarged character command DB ESC,'!' ;Set Enhanced print mode on ENDIF ; IF OKIDATA DB ESC,'8' ;Set line spacing to 1/8" DB 1EH ;Clear Enlarged character command DB 1DH ;Set font to Condensed (17 CPI) DB ESC,'T' ;Set Enhanced print mode on ENDIF ; IF EPMX100 DB CR,ESC,'A',9 ;Set line spacing to 1/8" DB ESC,'F' ;Cancel emphasized DB 0FH ;Set font to Condensed ENDIF ; Insert new definitions here (with IF/ENDIF) DB '$' ;End of SETPRT table ; RESET EQU $ IF NEC8023 DB ESC,'A' ;Set line spacing to 1/6" DB ESC,'N' ;Set font to Normal (10 CPI) DB ESC,'"' ;Set enhanced print mode off ENDIF ; IF OKIDATA DB ESC,'6' ;Set line spacing to 1/6" DB 1EH ;Set font to Normal (10 CPI) DB ESC,'I' ;Set enhanced print mode off ENDIF ; IF EPMX100 DB ESC,'A',12 ;Set line spacing to 12/72" DB 12H ;Set font to Normal ENDIF ; Insert new definitions here (with IF/ENDIF) DB '$' ;End of RESET table ; ;***THE FOLLOWING TABLE DEFINES THE DIVIDER PRINTED BETWEEN FILE NAMES ; ACROSS THE LABEL AND CAN BE ADJUSTED AS REQUIRED. Note: It is not ; printed after the last filename on the line. ; SPACES DB ' | ' ;This table must end in an '$' SPCSIZ EQU $-SPACES ;# of characters between fields ; (filenames) on label DB '$' ;End of SPACES table ; ;*********************************************************************** ; ; START EQU $ LXI H,0 ;SAVE THE OLD STACK DAD SP ;H=STACK SHLD STACK ;SAVE IT LXI SP,STACK ;GET NEW STACK ; FCB SPECIFIED ? LXI H,FCB+1 MOV A,M CPI ' ' JNZ GOTFCB ;YES - SEE IF IT IS IN DIRECTORY ;NO FCB - MAKE FCB = ALL = '?' MVI B,11 ;FN+FT COUNT QLOOP EQU $ MVI M,'?' ;STORE '?' IN FCB INX H DCR B JNZ QLOOP ;LOOK UP THE FCB IN THE DIRECTORY GOTFCB EQU $ MVI A,LBLLNG ;Initialize # of lines remaining on STA LCOUNT ; label to full count MVI C,FSRCHF ;GET 'SEARCH FIRST' FNC LXI D,FCB CALL BDOS ;READ FIRST INR A ;WERE THERE ANY ? STA TEMP ;SAVE JNZ PRTSET ;GOT SOME - SET UP PRINTER LXI D,NONMSG JMP ERRXIT NONMSG EQU $ DB '++FILE NOT FOUND',CR,'$' ;SET UP PRINTER COMMANDS PRTSET EQU $ IF DOTITLE LXI H,TITLED MVI A,TRUE ENDIF IF NOT DOTITLE LXI H,SETPRT MVI A,FALSE ENDIF STA TTLSWC CALL WRPRNT LDA TEMP ;RELOAD EXTENT ;POINT TO DIRECTORY ENTRY SOME EQU $ DCR A ;UNDO PREV 'INR A' ANI 3 ;MAKE MODULUS 4 ADD A ;MULTIPLY... ADD A ;..BY 32 BECAUSE ADD A ;..EACH DIRECTORY ADD A ;..ENTRY IS 32 ADD A ;..BYTES LONG LXI H,81H ;POINT TO BUFFER (SKIP TO FN/FT) ADD L ;POINT TO ENTRY MOV L,A ;SAVE (CAN'T CARRY TO H) LDA COUNT ;Is there room in table for entry ? CPI MAXFIL JZ NOTALL ;No - cannot list all files - alarm ;MOVE ENTRY TO TABLE XCHG ;ENTRY TO DE LHLD NEXTT ;NEXT TABLE ENTRY TO HL MVI B,31 ;ENTRY LENGTH TMOVE EQU $ LDAX D ;GET ENTRY CHAR MOV M,A ;STORE IN TABLE INX D INX H DCR B ;MORE? JNZ TMOVE SHLD NEXTT ;SAVE UPDATED TABLE ADDR LDA COUNT ;GET PREV COUNT INR A STA COUNT ;READ MORE DIRECTORY ENTRIES MVI C,FSRCHN ;SEARCH NEXT LXI D,FCB CALL BDOS ;READ DIR ENTRY INR A ;CHECK FOR END (0FFH) JNZ SOME ;MORE ;SORT AND PRINT LDA COUNT ;INIT THE ORDER TABLE STA SCOUNT ;SAVE AS # TO SORT  LXI H,ORDER LXI D,TABLE LXI B,31 ;ENTRY LENGTH BLDORD EQU $ MOV M,E ;SAVE LO ORD ADDR INX H MOV M,D ;SAVE HI ORD ADDR INX H XCHG ;TABLE ADDR TO HL DAD B ;POINT TO NEXT ENTRY XCHG DCR A ;MORE? JNZ BLDORD ;..YES SORT XRA A ;GET A ZERO STA SWITCH ;SHOW NONE SWITCHED LDA SCOUNT ;GET COUNT DCR A ;USE 1 LESS STA TEMP ;SAVE # TO COMPARE STA SCOUNT ;SAVE HIGHEST ENTRY JZ DONE ;EXIT IF NO MORE LXI H,ORDER ;POINT TO ORDER TABLE SORTLP CALL COMPR ;COMPARE 2 ENTRIES CM SWAP ;SWAP IF NOT IN ORDER INX H ;BUMP ORDER INX H ;..TABLE POINTER LDA TEMP ;GET COUNT DCR A STA TEMP JNZ SORTLP ;CONTINUE ;ONE PASS OF SORT DONE LDA SWITCH ;ANY SWAPS DONE? ORA A JNZ SORT ; ;SORT IS ALL DONE - PRINT ENTRIES DONE LXI D,ORDER ;D/E point to 1st entry in ORDER PUSH D ;Save DE MVI A,LBLWID ;Initialize count of file names per STA WCOUNT ; line ;PRINT AN ENTRY PRINT EQU $ MVI C,CONST ;CK STATUS OF KB CALL BDOS ;ANY KEY PRESSED? DCR A JZ ABORT ;YES, ABORT POP D ;Restore DE LDAX D ;No - get memory byte addressed by DE MOV L,A ; and put in L INX D ;Move to next location in ORDER LDAX D ;Get memory byte addressed by DE MOV H,A ; and put in L INX D ;Move to next location in ORDER PUSH D ; and save DE MVI B,8 ;FILE NAME LENGTH CALL TYPEIT ;TYPE FILENAME MVI E,'.' CALL TYPE MVI B,3 ;GET THE FILETYPE CALL TYPEIT ; LDA COUNT ;Decrement count of file names to print DCR A STA COUNT JZ EXIT ;All done - Exit ; LDA TTLSWC ;Put only Title on its line in CPI FALSE JZ TTLDONE MVI A,FALSE STA TTLSWC LXI H,SETPRT ; enlarged font - then switch to CALL WRPRNT ; condensed font MVI B,1 CALL CRLF ;Double-space between title & directory JMP NXTLIN ;Start rest of directory on next line ; TTLDONE LDA WCOUNT ;Decrement # of entries left on this DCR A ; line for filenames STA WCOUNT JZ NXTLIN ;No more room on line - go to next line ENDIF ; LXI H,SPACES ;Room for another filename CALL WRPRNT ; Put in divider between names JMP PRINT ; NXTLIN EQU $ MVI B,1 ;Set request for one CR/LF CALL CRLF ;Output CR/LF and test for end of label JMP PRINT ;Go to print next file name ; ; ;TYPE CHAR IN E TYPE PUSH B PUSH D PUSH H MVI C,WRCHR CALL BDOS POP H POP D POP B RET ; ; ; PRINT STRING SPECIFIED BY HL WRPRNT MVI A,'$' CMP M RZ MOV E,M CALL TYPE INX H JMP WRPRNT ; ; ; TYPE STRING WHOSE LENGTH IS IN B AND ADDR IN HL TYPEIT EQU $ MOV A,M ;Get rid of any tag bits in name ANI 07Fh ; for print out MOV E,A CALL TYPE INX H DCR B JNZ TYPEIT RET ; ; ; OUTPUT SPECIFIED # OF CR/LF's TO PRINTER AND CHECK FOR END OF LABEL. ; AT END OF LABEL, FEED TO NEXT LABEL. CRLF EQU $ LDA LCOUNT ;Get count of lines remaining on label SUB B ; Less # of LF's requested STA LCOUNT ; and save as # of lines remaining MVI A,LBLWID ;Initialize # of file names across label STA WCOUNT MVI E,CR ;Get CR character in E CALL TYPE ; and output it MVI E,LF ;Get LF character in E MOV A,B ;Check # of requested LF's for zero CPI 0 JZ NXTLBL ;If so, feed to next label LFLOOP EQU $ CALL TYPE ;Output LF DCR B ;Decrement count of LF's to perform JNZ LFLOOP ;Loop till none left ; NXTLBL LDA LCOUNT ;Check for end of Label CPI 0 RNZ ;More lines left - Return MVI A,LBLLNG ;Initialize # of lines per label STA LCOUNT MVI B,LBLSPC ;Set count to specified # of lines JMP LFLOOP ;between labels and do LF's to next labl ; ; ;ERROR EXIT ; OVRFLMS EQU $ DB '++ TOO MANY FILES FOR PROGRAM TABLE',CR,LF,'$' NOTALL EQU $ LXI D,OVRFLMS ERRXIT MVI C,PSTRING ;SET UP TO PRINT STRING TO CONSOLE JMP CALLB ;PRINT MSG, EXIT ; ;ABORT - READ CHAR ENTERED ABORT MVI C,RDCHR CALLB CALL BDOS ;DELETE THE CHAR ; ;EXIT - ALL DONE EXIT EQU $ LDA LCOUNT CPI LBLLNG ;Are we at top of a label ? JZ FINAL ;Yes - no need to go to top of label MOV B,A ;No - Get remaining lines on label in B  CALL CRLF ;Go to top of next label FINAL EQU $ LXI H,RESET ;Reset printer to Normal mode CALL WRPRNT LHLD STACK ;GET OLD STACK SPHL ;MOVE TO STACK RET ;..AND RETURN ;COMPARE ROUTINE FOR SORT COMPR PUSH H ;SAVE TABLE ADDR MOV E,M ;LOAD LO INX H MOV D,M ;LOAD HI INX H MOV C,M INX H MOV B,M ;BC, DE NOW POINT TO ENTRIES TO BE COMPARED XCHG CMPLP EQU $ MOV A,M ;Get rid of any tag bit in name ANI 07FH ; before comparing names for sort MOV M,A LDAX B ANI 07FH CMP M INX H INX B JZ CMPLP POP H RET ;COND CODE TELLS ALL ;SWAP ENTRIES IN THE ORDER TABLE SWAP MVI A,1 STA SWITCH ;SHOW A SWAP WAS MADE MOV C,M INX H PUSH H ;SAVE TABLE ADDR+1 MOV B,M INX H MOV E,M MOV M,C INX H MOV D,M MOV M,B POP H MOV M,D DCX H ;BACK POINTER TO CORRECT LOC'N MOV M,E RET ; ; ; DS 40 ;STACK AREA STACK DS 2 ;SAVE OLD STACK HERE NEXTT DW TABLE ;NEXT TABLE ENTRY COUNT DB 0 ;ENTRY COUNT SCOUNT DB 0 ;# TO SORT WCOUNT DB 0 ;# OF FILENAME SPACES LEFT ACROSS LINE LCOUNT DB 0 ;# of Lines remaining on this Label SWITCH DB 0 ;SWAP SWITCH FOR SORT TTLSWC DB 0 ;Switch for Title font TEMP DS 1 ORDER DS 2*MAXFIL ;ORDER TABLE TABLE EQU $ ;READ ENTRIES IN HERE END 100H CPM22009APP#$%CPM22010APP&'()CPM22011APPf*+,-./0123456CPM22012APP78CPM22013APP9:;CPM22014APP4<=>?@ABCPM22015APP*CDEFGHCPM22 PATgIJKLMNOPQRSTUINSIDCPMLBRVWXYZ[\]^_`abcdeINSIDCPMLBRfghijklmnopqrstuINSIDCPMLBRvwxDSKLBL15ASMyz{|}~DSKLBL15ASMRCPMSCAN v1.0 adaptation by Steven Greenberg, 06/05/88, based on FOR.COM, Copyright (C) 1988 Irvin M. Hoff. Used with permission. RCPMSCAN (RS) is a utility customized to scan for strings in the monthly RCPMxxxx.LST. A recent version (RCPM0788 or later) must be located on the same drive/user as RS.COM. The search string is NOT case sensitive. For each match the entire RCPM/BBS listing is displayed. Usage Examples: A> RS (203) All systems with area code 203 A> RS IRV All systems with a sysop named Irv A> RS BIBLE|RELIGION Systems with either word in the description A> RS FOG #?? FOG systems #10 - #99 A> RS $( All systems that charge money If no string is included, this help menu is displayed. '?' may be used as a wildcard to match any letter. ('*' not allowed.) '|' allows numerous strings to be used at the same time. [End Of File] ISections Copyrighted (c) 1985, 1986, 1987, 1988 by Irvin M. Hoff !9"122>$2!]~ ʲ$w#~Nw2q_!r q< RCPMSCAN v1.0 Copyright (C) 1988 Irv Hoff adapted by Steven Greenberg [type S to pause, C, K or X to abort, ? for help] :2t:]$R:^NR2t:?a:ʲ!F##~iqѷ!:2~[¦J -ʰ=G:2x2: >6~ G:xX :x:x6 :2,tÍ ʃ L6_SLw 6 L2 w` `ƒ͘ ++ ABORTED ++$ [more] 6  *!~ʞ6#õ [Help screen goes here] ~6#~::<22͇ > ͘ ++ Cannot find RCPM*.LST ++$!"!*\N> ʜ|ʜG~af{f_O#x?FF#~ʂ@*~#|:…x > 6!~#6 ¥ > 6> 6~6# ͘++ SOURCE FILE READ ERROR ++$:>6q͘ ---- [End of listing]$Þ_ !w,"2*w,"]o2=26$RCPM????LST- S to pause, C, K or X to abort, ? for help] :2t:]$R:^NR2t:?a:ʲ!F##~iqѷ!:2~[¦J -ʰ=G:2x2: >6~ G:xX :x:x6 :2,tÍ ʃ L6_SLw 6 L2 w` `ƒ͘ ++ ABORTED ++$ [more] 6  *!~ʞ6#õ [Help screen goes here] ~6#~::<22͇ > ͘ ++ Cannot find RCPM*.LST ++$!"!*\N> ʜ|ʜG~af{f_O#x?FF#~ʂ@*~#|:…x > 6!~#6 ¥ > 6> 6~6# ͘++ SOURCE FILE READ ERROR Ä$$ password$@NAMES DIRZCPR2 w_#~ ʸ A:4ɀ  MSW:CP-MIG ?ʻ w# !SYSTEM#2.15 84-06-22!C(:6:6PYZ2PFX.CC #1.13 84-05-13&SC80.CC #5.15 84-05-13~o}g^#V }s#r !}o|g}o|g}o|g{z{z{z{̄!-{̄!,z>{z?!-z>{zð>{>_||g}oɯo_)&)zBKW_GyO,)!BK>){_zWT{zTW#{_=<||t|t5t+|/g}/o{ozgN N#~# ŽA~# yOĎy˜# ʭ#ʷɯ#+#Ⱦ N #NGͱ7~# A! G~p# $SCPM.CC #5.06 84-03-27*!! !! !!! ! !!!!!́Y| +++ $vCCABEND: Attempting System Restart.$́Y͏@RSXDEF.CC #1.00 84-05-13SCENV0.CC #1.17 84-06-22* !*!9.*.!!9"##*}Bozzګ<2"*z z*zz>NzzͷCCBROKE: Program or system is damaged.$1ͷCCMEMRY: Not enough memory to work in.$!͌!z`i+6+r+s!*~%# x $J S_z$Wz4Ns#Fr#x‡**}o#z DM!1B!6g!1p6!o1ʊ6͒"!!n&!\!l!^#V#N#F+++yx*y^#V##xt!99ҫ>!2 7!t9:«:ë!CPBIOS.CC #1.00 84-04-03@HZBIOS.CC #1.02 84-04-26>_X2BIOS.CC #1.01 84-06-11]~STRLIB.CL #2.08 84-04-10s#w#ww###n&n&##n&#^Wng#5^W#^wyO~#^+#4#q#r> y  ##ů+<5ů^WBKH]ͻ!-##u!-!9H!ͤ|ʹ!9H!-!9!9HtS!9H!ͤ| !9H!9H! Zt́!9H! Zt́y !9H! ͤ|> !9H!9H!0y !9H!9H! Ź!9H! Z!0!9!S!9HA|- !9HA!0ͷ!9HA!9Ͷs| !9!9!9HS! !0|! 9HAS!9H!9Hͤ| !t!9H#S+È !9H|9 LOGLIB.CL #2.09 84-04-09:B!   B T]6$z6" * #|* +" ; ͱ | $! h! h!kͱ Á ý!B ͦ|4 #͈ ͈ ; X - ͈ ù |Modified $!͈ !9HA|k !.h!9Ḧ́ !>Y7 v OUTNUM.CL #1.03 84-04-08!9H!9HA!s!9H!s!B͓ h!9H!Ͱ !9HͰ !9H!s!9H͍|' !9H!t !9H !t!s|J Ä !9H!ͤ|| !-h!9!9HtSÄ !+h!S̈́ !9H  zҲ 5͠ !0$" |0$!9H!ͤ| !-h!9!9HtS!9H͙ t  PDGREE.CL #1.04 84-04-08  >. # 4  ^#V!6 6!*́ !9; !9!H͛!V!Q9HN !_!Q9Hk ͬ̈́ !O9HͮͿ !b̈́ !M9!9; !9!H͛! !O9H$ ͬ̈́ !K9ͪͮ|m!i ͪ͟ ; ͪA ͙ !̈́ !y ; ENVLIB.CL #1.07 84-06-22!>!_G_#+ / +!Cz"!#:@o!&DM>þ7#^#V ^#VÇ!!@}U oj+++#C*+++*!9*!9*||C g$ɜCCPENV.CL #1.08 84-05-01:! 9*́""*}o"!**!9"!"COM!# >þ ~##_^#Vzҁ#!+|gz`kz*z!!*~#fozCr} +++#u!ͷ:k*>2*~#Ý͠|ʽ!|͠*z!̈́m  ~<6͠ ^#V́Z ^#V́ɑ?RSXENV.CL #1.08 84-05-13t!!\} j+++#y7`  ~< ^#Ví!̈́m ##^#V N#F!^#V͇# n`=BIOSNV.CL #1.08 84-06-11}##xlXerox k CP/M vers 2.2C ###!l!!͘!"͘s|* Kf*0 >9<9 `9<###9!!=|O͎r| }#=:-!9HA!/͘!9HA!-͘e!9HA!?͘e|a!9H#Si!9H!9H#S+A|ʇ!Þ!9H !r!9H#S+A|ʼ!!9H!r!͘!! !!!V ͺj| Xͺ͟|#{ͷ!B 7+W͹ Z|i+Z !̈́ r|f B"=|ʊ+= !̈́ "͠|ʣ+͠ æ2!ͣ|ʼ"!m|2!̈́  2!*̈́ +a !F̈́ +e ![̈́ n|++j !ḧ́ +ͪ !ẗ́ "2aͪ|͙ !ÿ́ n|w2n͙ !̈́ ; +!̈́ ; +!̈́ +!̈́ ; +!Ö́ +!̈́ ; +!̈́ +! ̈́ +!Ḯ +!̈́ ͹ >|Heath/Zenith $H8 H89/Z90 H/Z-100 Xerox 820-II # |N$!͈ !̈́ ͣMicro8080A 8085 Z80 Z800  SoftChip Processor ͻ|!^͈ Z$~#^#V!ʈ !È Version CP/M MP/M    !͈ B!̈́ ͭ!͙ !̈́ !s͙ r|ʫr!ͣ|e!̈́ !̈́ r!͘|ʅ!̈́ !9S|ʫ!9H!A͙ !9S|ʓ!̈́ !!9H#S͓ ͙ !̈́ !!9H#S͓ ͙ !̈́ !!9H#S͓ !!!9H#S͓ ͙ !̈́ !!9H#S͓ !!!9H#S͓ ͙ + !È special RSX entry!9!9!9H͕S!9!9!S͛!9H+S#|~!9HA!s!͘!9HA!s! ͤe|W!9H#S+{!9!9H#S+A!s!9! ͘|ʠ!9~!9ͬ̈́ !̈́ ! 9CCP Not LocatedNon-Resident CCPZCPR1ZCPR2EZCPR*^#Vz!'-!È !̈́ ; +!̈́ > $0123456789ABCDEF0xProgram , -levelENVCHEK: Incompatible environment assumptions.-point pedigree:# Configuration AnalyzerCP-MIG edition by Dennis E. HamiltonSYSTEM#2.15 84-06-22 BIOS BDOS Environment protected via Single-Segment Memory Model current TPA ceiling Stack Point Heap Point TPA-byte TPA capacity-byte free zonea>SYSTEM -? and invalid parameters provoke this summary.a>SYSTEM -# identifies the program and reports its pedigree, installation status, and support level.a>SYSTEM with no parameters produces a report of the system's current configuration characteristics. Beside providing useful information about your configuration,SYSTEM also demonstrates which features of the system can bedetected and exploited by any MSW automatic-configuration toolsof the same vintage.Computer Configuration Operating System.C.0 S/N --- RSX entry base location H ñññ81Ľ y0îH ñGîG  ñH ñ(Ľ yîH ñîîĽ y0îîH ñG 1: :,; c*| } 8O BIOS BDOS Environment protected via Single-Segment Memory Model current TPA ceiling Stack Point Heap Point TPA-byte TPA capacity-byte free zonea>SYSTEM -? and invalid parameters provoke this summary.a>SYSTEM -# identifies the program and reports its pedigree, installation status, and support level.a>SYSTEM with no parameters produces a report of the system's current configuration characteristics. Beside providing useful information about your configFor CP/M 2.2 and 3.0 operation. Just type SYSTEM at prompt and and your will see addresses of BIOS, BDOS, CCP, TPA base and ceiling and capacity.ration. Just type SYSTEM at prompt and and your will see addresses of BIOS, BDOS, CCP, TPA base and BIOS to compute the PHYSICAL record needed to gain access to the desired LOGICAL record. This mode can be toggled. When in LOG_REC mode you will see both record numbers displayed at the top of the screen. To use this program, it is necessary that your terminal have the follow- ing following screen commands available: Cursor Addressing Reverse Video Clear Line Clear Screen I think you will find this a powerful PATCH utility and I hope you find it useful. Enjoy! Bill Rink San Jose, California fault mode for accessing TRACKS is in the PHYSICAL record mode i.e., each record accessed is physically located after !!9"1T͏!~_6$ .~͏Ä͏a͏!j#xV+#dx?+d:~?f͏Ä#͏͏* 205 all regions, Alabama $907 all regions, Alaska $602 all regions, Arizona $213 Los Angeles, California $805 Bakersfield, Ventura and Simi Valley, California $707 Eureka, Napa and Santa Rosa, California $209 Fresno and Stockton, California $415 Oakland and San Francisco, California $714 Orange and San Diego, California $916 Sacramento and South Tahoe, California $408 San Jose and Sunnyvale, California $519 Ontario, Canada $514 Montreal, Canada $705 North Bay, Ontario, Canada $807 Ontario, Canada $613 Ottawa, Ontario, Canada $418 Quebec, Quebec, Canada $819 Quebec, Canada $416 Toronto and Ontario, Canada $204 Manatoba, Canada $306 Saskatchewan, Canada $403 Alberta, Canada $804 British Columbia, Canada $303 all regions, Colorado $203 all regions, Connecticut $302 all regions, Deleware $202 Washington, District of Columbia $813 Avon Park, Fort Myers and Winter Haven, Florida $305 Fort Lauderdale, Key West, Miami and Florida $904 Jacksonville, Florida $404 Atlanta, Rome, Georgia $912 Waycross, Georgia $808 all regions, Hawaii  $208 all regions, Idaho $618 Alton and Mount Vernon, Illinois $312 Aurora, Chicago, Elgin and Highland Park, Illinois $217 Casey and Springfield, Illinois $815 La Salle, Joliet and Rockford, Illinois $812 Evansville, Indiana $219 Gary, Hammond, Michigan City and South Bend, Indiana $317 Indianapolis and Kokomo, Indiana $712 Council Bluffs, Iowa $515 Des Moines and Mason City, Iowa $319 Dubuque, Iowa $316 Dodge City and Wichita, Kansas $913 Ottawa and Topeka, Kansas $606 Ashland and Winchester, Kentuckey $502 Louiseville, Paducah and Shelbyville, Kentuckey $504 Baton Rouge and New Orleans, Louisiana $318 Lake Charles, Louisiana $207 all regions, Maine  $301 all regions, Maryland $617 Boston, Framingham and New Bedford, Massachusetts $413 Springfield, Massachusetts $905 Mexico City, Mexico $903 Northwest Mexico $313 Adrian and Ann Arbor, Michigan $616 Battle Creek, Cadillac and Grand Rapids, Michigan $517 Lancing and Saginaw, Michigan $906 Sault Ste. Marie, Michigan $507 Albert Lea and Rochester, Minnesota $218 Duluth, Minnesota $612 Minneapolis and Saint Paul, Minnesota $601 all regions, Mississippi $417 Joplin and Springfiled, Missouri $816 Kansas City and Saint Joseph, Missouri $314 Saint Louis, Missouri $406 all regions, Montana $402 Lincoln and Omaha, Nebraska $308 North Platte, Nebraska $702 all regions, Nevada $603 all regions, New Hampshire $609 Atlantic City, Camden and Trenton, New Jersey $201 Hackensack, Morristown and Newark, New Jersey $505 all regions, New Mexico $518 Albany, Greenwich and Schenectady, New York $716 Buffalo, Niagra Falls and Rochester, New York $607 Elmira and Stamford, New York $516 Hempstead, New York $914 Monroe, Mount Vernon and Poughkeepsie, New York $212 New York City, New York $315 Syracuse and Utica, New York $704 Charlotte and Salisbury, North Carolina $919 Greenville and Williamston, North Carolina $701 all regions, North Dakota $216 Akron, Cleveland, Massilon and Youngs"town, Ohio $513 Cincinnati and Dayton, Ohio $614 Columbus, Marietta and Newark, Ohio $419 Toldeo, Ohio $918 Muskogee and Tulsa, Oklahoma $405 Oklahoma City, Oklahoma $503 all regions, Oregon $215 Allentown, Chester and Philadelphia, Pennsylvania $814 Altoona, Erie and Punxsutawney, Pennsylvania $717 Harrisburg, Scranton and Wilkes-Barre, Pennsylvania $809 all regions, Puerto Rico $401 all regions, Rhode Island $803 all regions, South Carolina $605 all regions, South Dakota $615 Chattanooga and Nashville, Tennessee $901 Memphis, Tennesee $806 Amarillo, Texas $512 Austin, Corpus Christi and San Antonio, Texas $214 Dallas, Texas  $713 Galveston and Houston, Texas $817 Temple, Texas $801 all regions, Utah $802 all regions, Vermont $809 all regions, Virgin Islands $804 Charlottesville, Norfolk and Richmond, Virginia $703 Fredericksburg, Roanoke and Winchester, Virginia $509 Pullman, Walla Walla, Washington $206 Seattle and Vancouver, Washington $304 all regions, West Virginia $608 Beloit and Madison, Wisconsin $715 Eau Claire and Wausau, Wisconsin $414 Green Bay, Milwaukee and Racine, Wisconsin $307 all regions, Wyoming $ Area code$, is$ NOT a valid area code!$ NOT specified!$ $To determine the location of any Area Code, Type AREACODE and location will be goven.S}=\ ͱ !>8 *}: :|(=\ ͱ *9H :gk~ >2*}: ~L V|g^z ͱ |g~l|g~2g:gOD~(|0g~( G|gn` `r|gs|gq x2|?0CWC2::::_ C_:Wz?88 (O`ɷ(=Gy`>`!ͪ! < *T]>w6@>*w}eo0 $: :g:G}/< OT]>(*:GzGK>(P +|0gr|gsBO ,L}Z8 90)))))l7D ͡<͌ >k̀ >2  >2 6 }6 }6 }6 }: G(0̀ 0̀ !_  &Do it? (Y/N):$^C detected.$Destination file exists. Overwrite it? (Y/N):$ in out rat ca cr ==== ==== ==== ==== ==== $   0 / 0$ AREA.FOR - Allows rapid searching and display of areacodes, geographical locations, PC- Pursuit access or any combination ... see preamble of source code for more detailed information. th |XX <--- FOG Building [] XX (tt) Wind Gen. (t) -- The distance between Road 380 and Mission St. Exit ithe Z80 family In use the Z80H can just replace your processor, but for the best results you can switch the clock crystal on the board for one of a higher speed. It is advisable not to go to the highest speed at once for the support TTL chips ma of the Z80H's without a crystal first, you WILL see a difference without having to go to the Z280 or HD64180 boards. tall a a socket so that you could change the crystal as you check the reliability at the higher speed. Remember to check tAREA Ver 1.7!KU:/$?$.Œ$2k>2lE Enter Area, City, State/Province or mnemonic: #U!͌/~ #Á!́,!nß~¯#~ʽ#ß:kE Reference KE Not Found.:kU2kE Area =~#\E - K!l5 6ÝE * Telephone Dialing Area Database * ------------------------------- Search for Area Code, City, region, State/Province, or PC-Pursuit mnemonic. Usage: AREA BOSTON,AREA 617,AREA MASS,etc. E [More] ~w#a{_>( !^#6~+~=#K~#\K> \> _011The International Access Code170Northwest Mexico190Mexico City201Newark, Morristown, Hackensack, New Jersey Pursuit - NJNEW202Washington, District of Columbia Pursuit - DCWAS203Hartford, Bridgeport, All of Connecticut204Winnipeg, Brandon, All of Manitoba, Canada205Huntsville, Mobile, Tuscaloosa, All of Alabama206Seattle, Tacoma, Vancouver, Washington Pursuit - WASEA207Portland, #Bangor, All of Maine208Boise, All of Idaho209Fresno, Stockton, California212New York City (Manhattan, The Bronx), New York Pursuit - NYNYO213Los Angeles, Hollywood, Long Beach, Santa Monica, California Pursuit - CALAN214Dallas, Texas Pursuit - TXDAL215Philadelphia, Chester, Allentown, Pennsylvania Pursuit - PAPHI216Akron, Cleveland, Massillon, Youngstown, Ohio Pursuit - OHCLV217Casey, Springfield, Illinois218Duluth, Minnesota219Gary, Hammond, Michigan City, South Bend, Indiana301Baltimore, Annapolis, All of Maryland Pursuit - DCWAS (some areas)302Dover, All of Delaware303Denver, Aspen, Boulder, Pursuit - CODEN304Charleston, All of West Virginia305Miami, Ft. Lauderdale, Key West, Florida Pursuit - FLMIA306Regina, Saskatoon, All of Saskatchewan, Canada307Cheyenne, All of Wyoming308North Platte, Scottsbluff, Nebraska309Peoria, Illinois312Chicago, Libertyville, Lake Forest, Elgin, Highland Park, Illinois Pursuit - ILCHI313Detroit, Royal Oak, Adrian, Ann Arbor, Michigan Pursuit - MIDET314Saint Louis, Missouri315Syracuse, Utica, New York316Dodge City, Wichita, Kansas317Indianapolis, Kokomo, Indiana318Lake Charles, Shreveport, Louisiana319Dubuque, Iowa401Providence, All of Rhode Island402Lincoln, Omaha, Nebraska403Calgary, Edmonton, Whitehorse, Yellowknife All of Alberta, Yukon and NWT, Canada404Atlanta, Rome, Georgia Pursuit - GAATL405Oklahoma City, Oklahoma406Billings, All of Montana407Southeast Florida, operational, April l6th, 1988408San Jose, Sunnyvale, Cupertino, Santa Clara, California Pursuit - CASJO409Galveston, Texas412Pittsburgh, Indiana, Rochester, Pennsylvania413Springfield, Massachusetts414Milwaukee, Racine, Green Bay, Wisconsin Pursuit - WIMIL415San Francisco, Oakland, Bay Area, California Pursuit - CASFA415Palo Alto, Mountain View, Los Altos, California Pursuit - CAPAL416Toronto, Hamilton, St Catherines, Niagara Falls, All of the Niagara penninsula, Ontario, Canada417Joplin, Springfield, Missouri418Quebec City and Southeastern Quebec, Canada419Findlay, Sandusky, Toledo, Ohio501Little Rock, Texarkana, All of Arkansas502Louisville, Paducah, Shelbyville, Kentucky503Portland, Salem, All of Oregon Pursuit - ORPOR504New Orleons, Baton Rouge, Louisiana505Albuquerque, Santa Fe, All of New Mexico506Frederickton, Moncton, All of New Brunswick, Canada507Albert Lea, Rochester, Minnesota508Eastern Massachusetts. operational July 16th, 1988509Spokane, Pullman, Walla Walla, Washington512Austin, CorZF-REV COM}ZFILER CMDZFILER COM}ZFILER SUBZFILES LSTZHELP COMZHELPERSLST#ZMOOX03 ZZ01ZNODES LSTZSHOW COMVZTIM-S3 CM4RECVR21 DCLRECVR21XCM.MNRENAME CMOREVIEW CM*PQRMAC CMjRSTURULER DCVSAVE CMZSD COM*uvSET CMQbcdSETDEF CM eSHOW CMBhester, Kentucky607Elmira, Ithaca, Stamford, New York608Madison, Beloit, Wisconsin609Atlantic City, Trenton, Camden, New Jersey612Minneapolis, Saint Paul, Minnesota Pursuit - MNMIN613Ottawa, Kingston, Belleville, All of eastern Ontario, Canada614Athens, Columbus, Marion, Marietta, Newark, Ohio615Chattanooga, Nashville, Tennessee616Battle Creek, Grand Rapids, Cadillac, Kalamazoo, Michigan617Boston, Framingham, New Bedford, Massachusetts Pursuit - MABOS618Alton, Mount Vernon, Centralia, IllinoTYPE CMTYPELZ12CMU3#102 CM UNCR CM2UPDICT CPUSQ-20 CMdUTILS DC VDO CM6WC CM WC DCWINSTALLCM WLCUSTOMCMWLCUSTOMCMWLDISK DT WLFORMATCMWLFORMATCMn, Texas Pursuit - TXHOU714Orange and San Bernardino Counties, California715Eau Claire, Wausau, Wisconsin716Buffalo, Niagara Falls, Rochester, New York717Harrisburg, Scranton, Wilkes-Barre, Pennsylvania718New York City (Queens, Brooklyn, Staten Island), New York Pursuit - NYNYO (add 1+areacode to number)719Southern Colorado - Pueblo800Toll Free number801Salt Lake City, All of Utah Pursuit - UTSLC802All of Vermont803Charleston, All of South Carolina804Norfolk, Richmond, Charlottesville, VXREF CM8ZEROMAKRCMmZEROMAKRDC ARK CMlXcdeALIAS CMDCMDRUN COM(EASE COM"RELHEX COM YEASECMD COMWLCONFIGBAKOIF COMLDIR COMZMOOX03 ZZ01Z[LX COMSALIAS COM@SDZ COM/$suit - TXDAL (limited area; no extra prefix needed)818San Fernando Valley, Pasadena, Burbank, Glendale, California Pursuit - CAGLE819Malartic and Western Quebec, Canada871Atlantic Ocean, satelite phone-access to yachts Atlantic Ocean872Pacific Ocean, satelite phone-access to yachts Pacific Ocean900Toll Reduced number901Memphis, Tennessee902Charlottetown, Halifax, Sidney All of Prince Edward Island and Nova Scotia, Canada904Jacksonville, Florida905Mexico DF906Sault Ste. Marie, Michigan9MAKES IT LATER. FINAGLE'S FOURTH LAW ONCE A JOB IS FOULED UP,ANYTHING DONE TO IMPROVE IT WILL ONLY MAKE IT WORSE. FEATHERKILE'S RULE WHATEVER YOU DID,THAT'S WHAT YOU PLANNED. FLAP'S LAW ANY INANIMATE OBJECT,REGARDLESS OF ITS POSITION,CONFIGURATION OR PZMOOX03 ZZ01Z[LX COMSALIAS COM@SDZ COM/* * TERMINAL CONTROL DATA FOR VARIOUS TERMINALS * Morrow 20 LEVEL = 3 CURSOR = ESC = C+32 R+32 CLR = ^Z Morrow 50 (Freedom) LEVEL = 3 CLR = ESC * CURSOR = ESC = R+32 C+32 Morrow MDT-60 LEVEL = 3 CLR = ESC * CURSOR = ESC = R+32 C+32 Morrow MT-70 LEVEL = 3 CLR = ESC * CURSOR = ESC = R+32 C+32 ADM 3A or 5 LEVEL = 1 CURSOR = ESC = R+32 C+32 CLR = ^Z LO = HI = ADM 22 LEVEL = 3 CURSOR = ESC = R+32 C+32 CLR = ^Z ADM 31 LEVEL = 3 CURSOR = ESC = R+32 C+32 CLR = ^Z Heath H19 LEVEL = 1 CURSOR = ESC Y R+32 C+32 HOME = ESC H CLR = ESC E LEFT = ESC D RIGHT = ESC C UP = ESC A LO = HI = Visual 200 LEVEL = 2 CURSOR = ESC Y R+32 C+32 HOME = ^A CLR = ^L RIGHT = ^F LEFT = ^G UP = ^Z HI = ESC '3' LO = ESC '4' CEOS = ESC y CEOL = ESC x Soroc 120 LEVEL = 2 CURSOR = ESC = R+32 C+32 CLR = ESC * CEOS = ESC Y CEOL = ESC T Televideo 910 LEVEL = 2 CURSOR = ESC = R+32 C+32 CLR = ESC * CEOS = ESC Y  CEOL = ESC T Televideo 912C/920 LEVEL = 3 CURSOR = ESC = R+32 C+32 CLR = ESC * Televideo 925/950 LEVEL = 3 CURSOR = ESC = R+32 C+32 CLR = ESC * ADDS Viewpoint LEVEL = 2 CURSOR = ESC Y R+32 C+32 HOME ESC Y SP SP CLR = ^L RIGHT = ^F UP = ^Z HI = ^O ESC '0' A LO = ^N CEOS = ESC k CEOL = ESC K ADDS Viewpoint 3A+ LEVEL = 1 CURSOR = ESC = R+32 C+32 CLR = ^Z LO = HI = ACT 5A LEVEL 2 CURSOR = ^T R+0 C+0 HOME = ^] CLR = ^L RIGHT = ^X UP = ^Z CEOS ESC K CEOL ESC I HI = ESC B LO = ESC C Qume 102 LEVEL = 3 CURSOR = ESC = R+32 C+32 CLR = ^Z * Honeywell * LEVEL = 3 * CURSOR = ESC f C+32 R+32 * HOME = ESC H * CLR = ESC ` * RIGHT = ESC C * UP = ESC A * INSLINE = ESC [ L * INSCHAR = ESC [ I SP ESC [ J ^H * DELLINE = ESC [ M * DELCHAR = ESC [ P * HI = ESC '3' * LO = ESC '4' * CEOS = ESC J * CEOL = ESC K ANSI LEVEL = 1 CURSOR = ESC [ R+1 ; C+1 H ASCII HOME = ESC [ H CLR = ESC [ H ESC [ J HI = LO = CEOS = ESC [ J CEOL = ESC [ K LEFT = ESC [ D RIGHT = ESC [ C UP = ESC [ A VT52 LEVEL = 1 HOME = ESC H CLR = ESC H ESC J RIGHT = ESC C LEFT = ESC D UP = ESC A CURSOR = ESC Y R+32 C+32 HI = LO = VT100 LEVEL = 2 CURSOR = ESC [ R+1 ; C+1 H ASCII HOME = ESC [ H CLR = ESC [ H ESC [ J LO = ESC [ '0' m HI = ESC [ '1' m CEOS = ESC [ J CEOL = ESC [ K LEFT = ESC [ D RIGHT = ESC [ C UP = ESC [ A Wyse LEVEL = 3 CLR = ^Z CURSOR = ESC = R+32 C+32 Teleray LEVEL = 3 HOME = ESC H CLR = ^L CEOS = ESC J CEOL = ESC K RIGHT = ESC C UP = ESC A CURSOR = ESC Y R+32 C+32 INSLINE = ESC L INSCHAR = ESC P DELLINE = ESC M DELCHAR = ESC Q HI = ESC R @ LO = ESC R B IBM 3101 LEVEL = 1 HOME = ESC H CLR = ESC L LEFT = ESC D RIGHT = ESC C UP = ESC A CURSOR = ESC Y R+32 C+32 HI = LO = Hazeltine 1420/1500 LEVEL = 2 CURSOR = ~ ^Q C+0 R+0 HOME = ~ ^R CLR = ~ ^\ RIGHT = ^P UP = ~ ^L HI = ~ ^_ LO = ~ ^Y CEOS = ~ ^X CEOL = ~ ^O Hazeltine Esprit LEVEL = 2 CURSOR = ~ ^Q C+0 R+0 HOME = ~ ^R CLR = ~ ^\ RIGHT = ^P UP = ~ ^L HI = ~ ^_ LO = ~ ^Y CEOS = ~ ^X CEOL = ~ ^O None of the above LEVEL = 0 CURSOR = ESC = R+32 C+32 K LEFT = ESC [ D RIGHT = ESC [ C UP = ESC [ A Wyse LEVEL = 3 CLR = ^Z CURSOR = ESC = R+32 C+32 Teleray LEVEL = 3 HOME = ESC H CLR = ^L CEOS = ESC J CEOL = ESC K RIGHT = ESC C UP = ESC A CURSOR = ESC Y R+32 C+32 INSLINE = ESC L INSCHAR = ESC P DELLINE = ESC M DELCHAR = ESC Q HI = ESC R @ LO = ESC R B IBM 3101 LEVEL = 1 HOME = ESC H CLR = ESC L LEFT = ESC D RIGHT = ESC C UP = ESC A CURSOR = ESC Y R+32 C+32 HI = LO = Hazeltine 1420/1500 LEVEL = 2 CURSOR = ~ ^Q C+0 R+0 HOME = ~ ^R CLR = ~ ^\ RIGHT = ^P UP = ~ ^L% This is the release date of the disk. CPM22003APP  CPM22004APP CPM22005APP CPM22006APP CPM22007APP  CPM22008APP CPM22009APP # CPM22010APP & CPM22011APP *3CPM22012APP 7CPM22013APP 9CPM22014APP <CPM22015APP CCPM22 PAT I3CPM22011.APP 8B 8E 13056 102 CPM22012.APP F5 ED 2048 16 CPM22013.APP 6C B8 2176 17 CPM22014.APP 2E DF 6656 52 CPM22015.APP F1 68 5376 42 CPM22 .PAT C8 5C 13184 103 INSIDCPM.LBR CC 0D 35072 274 DSKLBL15.ASM B6 92 16640 130 RCPMSCAN.DOC A3 CC 1024 8 RS .COM 9B 01 1280 10 SYSTEM .COM 84 F5 7680 60 SYSTEM .DOC FC 86 256 2 -PEARRE  Fog Library Disk FOG-CPM.204 Copyright (1989) 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. A collection of Digital Research application notes with fixes for some of the utility programs plus some utilities for the "heavy modem" user. Also on this disk is a list of terminal control codes. Filename Description -03-09 .89 This is the release date of the disk. -CPM204 .DOC This is the description of the disk contents. CPM22001.APP 7112 6K The CCP auto-load feature. CPM22002.APP 1778 6K Reversing the BACKSPACE and RUBOUT key functions and making RUBOUT identical to BACKSPACE. CPM22003.APP A0DD 3K Sample BIOS for a serial printer device. CPM22004.APP 306B 5K BIOS error return code options. CPM22005.APP A2CF 4K Improving the ^S function. CPM22006.APP DB97 2K Changing the lines per page (from 23 to 14) that are scrolled by the P command of ED.COM. CPM22007.APP 2F66 3K Changing the restart number in DDT. CPM22008.APP 99B3 4K Nested SUBMIT files. CPM22009.APP 3A46 3K Configuring CP/M for page boundaries. CPM22010.APP F074 4K Booting CP/M on drives other than A. CPM22011.APP 8B8E 13K Chaining programs. CPM22012.APP F5ED 2K Interpreting the ^Z in SUBMIT files. CPM22013.APP 6CB8 3K Exiting PIP when using SUBMIT and XSUB. CPM22014.APP 2EDF 7K Turning ^P on and off from within a CP/M 2.2 SUBMIT file. CPM22015.APP F168 6K Debuggina a CP/M 2.2 BIOS. CPM22 .PAT C85C 13K A collection of patches for CP/M 2.2 programs including MOVCPM, ASM, SUBMIT, PIP (three patches) and DEBLOCK.ASM. INSIDCPM.LBR CC0D 35K A collection of assembly language routines for programmers. Included are: display all DIR entries; display all active DIR entries; code for calling BIOS entries; console input and output; a list of useful equate codes; 16- bit register subroutines; build files by typing; type files; display extent-0 directory entries; HEX display routines for MAC assembler; build local stack, save CCP's stack & return; read DIR via BIOS calls; display skew translation; examine allocation vector or command operands; display DPB. ACTDIR .ASM 1920 [INSIDCPM.LBR 1 of 17] ALLDIR .ASM 1920 [INSIDCPM.LBR 2 of 17] BIOSCALL.LIB 1792 [INSIDCPM.LBR 3 of 17] CISUB .LIB 2560 [INSIDCPM.LBR 4 of 17] COSUB .LIB 1408 [INSIDCPM.LBR 5 of 17] CPMEQU .LIB 1024 [INSIDCPM.LBR 6 of 17] DPSUB .LIB 1408 [INSIDCPM.LBR 7 of 17] FT .ASM 2688 [INSIDCPM.LBR 8 of 17] HEXDIR .ASM 1920 [INSIDCPM.LBR 9 of 17] HEXSUB .LIB 2688 [INSIDCPM.LBR 10 of 17] PROG .LIB 2688 [INSIDCPM.LBR 11 of 17] READIR .ASM 2304 [INSIDCPM.LBR 12 of 17] RECTRAN .ASM 2688 [INSIDCPM.LBR 13 of 17] TF .ASM 1280 [INSIDCPM.LBR 14 of 17] XALV .ASM 2176 [INSIDCPM.LBR 15 of 17] XCMD .ASM &1280 [INSIDCPM.LBR 16 of 17] XDPB .ASM 2560 [INSIDCPM.LBR 17 of 17] DSKLBL15.ASM B692 17K ver. 2.0 Assembler source (requires ASM-80) for a program to print labels show the disk contents. Designed for either 15/16" or 1 7/16" one-up mailing labels. If the number of files is too many for a single label, the program compensates and uses as many labels as necessary. Configurations for Epson, Okidata an NEC 8023 printers are included. Added most other printers is quite easy. RS .COM 9B01 2K ver. 1.0 [RCPM Scan 1 of 2] This will scan some of the BBS listing distributed on many remote systems. Search for a system by a phone number, a location, the name or whatever if you have a correctly formatted text file. RCPMSCAN.DOC A3CC 1K ver. 1.0 [RCPM Scan 2 of 2] SYSTEM .COM 84F5 8K [System 1 of 2] Similar to TELL, etc. It displays the addresses of various components of your operating system such as BDOS, BIOS, TPA, CCP, etc. SYSTEM .DOC FC86 1K [System 2 of 2] AREACODE.COM D9AF 7K [Area Code 1 of 2] Enter an area code to discover where it is located. AREACODE.DOC 26F8 1K [Area Code 2 of 2] AREA17 .COM 55F3 7K ver. 1.7 [Area 1 of 2] Enter the area code to find its location or a location to find its area code. AREA .FOR 0FF0 1K ver. 1.7 [Area 2 of 2] TERMINAL.DAT C8BF 4K This ASCII text file lists control codes for many of the terminals attached to CP/M systems. It makes patching software to take advantage of your system features easier. the name or whatever if you have a correctly formatted text file. RCPMSCAN.DOC A3CC 1K ver. 1.0 [RCPM Scan 2 of 2] SYSTEM .COM 84F5 8K [System 1 oThis is the disk name. C8BF 4K This ASCII text file lists control codes for many of the terminals attached to CP/M systems. It makes patching software to take advantage of your system features easier.  * * Copyright Notice.: Copyright (C) 1987, Gale P. Rhoades * * All rights reserved. This program may be used by * * the FOG staff for data entry. No other use or * * distribution '