home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpminfo / cpmpats6.txt < prev    next >
Text File  |  1994-07-13  |  28KB  |  927 lines

  1.  
  2. 6       <-- Increment revision number when making changes
  3.  
  4. This file contains information and modifications for the CP/M operating
  5. system. Pages and/or items are separated with FORMFEEDS (^L) with no
  6. more than 60 printed lines per page. List with PIP.
  7.  
  8.             A PATCH FOR DDT
  9.  
  10. From Dr. Dobb's Journal, Apr 1983, p. 76
  11.  
  12. When DDT is invoked it normally relocates itself to high memory just
  13. under BDOS. DDT can be modified so that it relocates to a specific
  14. address.
  15. If you know where you want DDT to load itself, the most direct way
  16. is to alter its code. Use DDT to modify DDT.COM. Look at the
  17. instructions around 0150h; you should find
  18.  
  19.     0150 SUB A
  20.     0151 MOV D,A
  21.  
  22. If you replace those two instructions with the single instruction
  23.  
  24.     0150 MVI D,xx
  25.  
  26. you will have a version of DDT that will always load itself at xx00h
  27. in memory.
  28.  
  29.  
  30.  
  31.             A PATCH FOR DDT / SID
  32.  
  33. From Microsystems, May 1983, p. 82
  34.  
  35. The Dump command of DDT and SID was designed for use with an 80 column
  36. terminal and makes a poor display if used with a 64 column terminal.
  37. The following patches allow DDT or SID to give a better appearance on
  38. a 64 column terminal.
  39.  
  40. Do the following for DDT vers 2.2:
  41.  
  42. A>ddt ddt.com
  43. DDT VER 2.2
  44. NEXT  PC
  45. 1400 0100
  46. -sa17
  47. 0A17 05 08        ...08 instead of 05
  48. 0A18 08.
  49. -g0
  50. A>save 19 ddt64.com
  51.  
  52. Do the following for SID vers 1.4
  53.  
  54. A>sid sid.com
  55. SID VER 1.4
  56. NEXT  PC  END
  57. 1D00 0100 B3FF
  58. #saa5
  59. 0AA5 93 96        ... 96 instead of 93
  60. 0AA6 08 .
  61. #g0
  62. A>save 28 sid64.com
  63.  
  64. What these patches do is throw out the space characters between each
  65. display of the hexadecimal representation of each memory content of
  66. the DDT or SID "Dump" display.
  67.  
  68. The following is an alternate patch for SID vers 1.4
  69.  
  70. A>SID
  71. SID VERS 1.4
  72. #SA51
  73. 0A51 F0 F8
  74. 0A52 6F
  75. 0A53 11
  76. 0A54 BF 5F
  77. 0A55 00 .
  78. #SAA3
  79. 0AA3 0F 7
  80. 0AA4 C2 .
  81. #G0
  82.  
  83. A>SAVE 28 SID.COM
  84.  
  85.  
  86.  
  87.             CP/M BUGS
  88.  
  89. The CP/M BDOS fails to clear Archive Bit t3 in the FCB on Close or
  90. Rename of a file.  See DDJ, June 1985, p. 14
  91.  
  92. The values returned by the Rename and Erase function calls are not
  93. as described in the CP/M Interface Guide. See DDJ, Nov. 1984, p. 50
  94.  
  95. BDOS Function 37 (Reset Drive) is unreliable. If Function 37 is called
  96. for the DEFAULT (currently logged-in) drive, it is not re logged-in.
  97. If the disk in that drive has been changed, the bit map for the former
  98. disk is still used and can result in the loss of files.
  99. Substitute Function 13 (Reset Disk System) instead.
  100. See BYTE, Mar. 1984, p. 70
  101.  
  102. There is a difference in character processing between standard keyboard
  103. I/O and SUBMIT-file I/O. When you enter a command line directly from
  104. the keyboard, all control characters (except for several that serve as
  105. immediate commands) are echoed back to the terminal in a two character
  106. ^x format. However, if the same command line is taken from a submit file,
  107. the control characters are sent straight through to the terminal. If that
  108. character happens to correspond to a cursor movement or control command
  109. for your particular terminal, you may find your output at strange positions
  110. or even overlaying previous output thus making it difficult to read.
  111. For example, the ^Z end-of-string indicator used by PIP.COM and ED.COM
  112. will send the cursor to the top of the screen on some terminals. You could
  113. revise your BIOS console output routine to filter the offending characters
  114. but this may cause problems with a screen editor or word processor that
  115. needs to use cursor positioning commands.
  116.  
  117.  
  118.  
  119.                 ZSID BUGS
  120.  
  121. From DDJ, Oct. 1982, p. 7
  122.  
  123. ZSID doesn't interpret the LDIR instruction correctly when the
  124. operands (the two strings defined by the HL, DE and BC registers)
  125. overlap on each other. The LDIR (long move) instruction of the
  126. Z-80 copies a source string into a target string. When the target
  127. string overlaps on the source string (as when the source begins
  128. at 200h, the target at 201h and the length is 255 bytes) LDIR
  129. becomes a Replicate instruction, duplicating the leading byte
  130. of the source into the target over and over. ZSID doesn't handle
  131. it right, though; it stops after copying one byte.
  132.  
  133. Also, the disassembler in ZSID doesn't seem to handle the LD A,R
  134. and LD R,A instructions. Its List command won't display them and
  135. its Assemble command won't accept them.
  136.  
  137. The number -1 is not correctly interpreted. For example, LD HL,-1
  138. is interpreted as LD HL,00FF.
  139.  
  140.  
  141.  
  142.             A PATCH FOR ZSID
  143.  
  144. From DDJ, Dec. 1981, p. 4
  145.  
  146. There is a small hidden bug in ZSID version 1.4. It is easily
  147. demonstrated when trying the following: in the direct assembly
  148. mode, try to assemble three 16-bit loads with the values of (hex):
  149.  
  150.     FF7F, FF80, FFFF
  151.  
  152. Afterwards list the product.
  153.  
  154. The false values are not only used in the assembler, but in the
  155. F(ill), M(ove) and D(ump) command as well. The cure is very simple:
  156. change the byte at 02AE (hex) in ZSID from "C2" to "C3".
  157.  
  158. SID version 1.4 does not have this "feature", so it may be that
  159. the routine starting at 02A1H is, at some place, necessary in the
  160. Z-80 specific parts, e.g. for error checking in relative jumps.
  161.  
  162. There are no apparent problems after this patch is installed but,
  163. even so, care should be taken if it is used.
  164.  
  165. The following demonstrates the bug and fix:
  166.  
  167.  
  168. A>ZSID
  169. ZSID VERS 1.4
  170. #A100
  171. 0100  LD HL,0FF7F
  172. 0103  LD HL,0FF80
  173. 0106  LD HL,0FFFF
  174. 0109  .
  175. #L100,108
  176.   0100  LD   HL,FF7F
  177.   0103  LD   HL,0080
  178.   0106  LD   HL,00FF
  179.   0109
  180. #IZSID.COM
  181. #R
  182. NEXT  PC  END
  183. 2900 0100 B9FF
  184. #L2A1,2BC
  185.   02A1  PUSH DE
  186.   02A2  CP   41
  187.   02A4  JP   NC,0BCF
  188.   02A7  CALL 0EAA
  189.   02AA  LD   B,D
  190.   02AB  LD   A,B
  191.   02AC  CP   FF
  192.   02AE  JP   NZ,00B8
  193.   02B1  LD   A,E
  194.   02B2  OR   A
  195.   02B3  JP   P,00B8
  196.   02B6  LD   B,00
  197.   02B8  LD   A,E
  198.   02B9  POP  DE
  199.   02BA  DEC  B
  200.   02BB  INC  B
  201.   02BC  RET
  202.   02BD
  203. #S2AE
  204. 02AE C2 C3
  205. 02AF B8 .
  206. #L2AE,2B0
  207.   02AE  JP   00B8
  208.   02B1
  209. #G0
  210.  
  211. A>SAVE 40 ZSIDP.COM
  212. A>ZSIDP
  213. ZSID VERS 1.4
  214. #A100
  215. 0100  LD HL,0FF7F
  216. 0103  LD HL,0FF80
  217. 0106  LD HL,0FFFF
  218. 0109  .
  219. #L100,108
  220.   0100  LD  HL,FF7F
  221.   0103  LD  HL,FF80
  222.   0106  LD  HL,FFFF
  223.   0109
  224. #G0
  225.  
  226.  
  227.             A PATCH FOR ASM.COM
  228.  
  229.    ASM.COM permits the use of the dollar sign, "$", as a separator
  230. in labels. However, the underline character ,"_", will make a more
  231. readable label if it is used as the separator. To use the underline
  232. in place of the dollar sign load ASM.COM with DDT and change the
  233. byte at address 116CH from 24H to 5FH. Exit DDT and "SAVE 20 ASM1.COM".
  234.  
  235.  
  236.  
  237. From XSUB.PAT
  238.  
  239. The following patch to XSUB.COM will eliminate its nasty
  240. habit of inserting extra line feeds after each command
  241. line which it displays on the console.  After installation
  242. of the patch, console output will look just like it would
  243. if it were actually typed in, instead of double-spaced.
  244.      Do the following:
  245.  
  246.  A>DDT XSUB.COM     ;Load old file to memory
  247.  DDT VERS 2.2       ;Program signs on with version
  248.  NEXT  PC
  249.  0400 0100          ; and displays size
  250.  -S2CF              ;Substitute at 2CFH
  251.  02CF 0A 24         ;Confirm that 0A is the old value!
  252.  02D0 23 .          ;Confirm that 23 is the next value!
  253.  -G0                ;Reboot
  254.  A>SAVE 3 XSUB1.COM ;Save new file from memory.
  255.  
  256.  
  257.  
  258.             A PATCH FOR ED.COM
  259.  
  260. From Dr Dobb's Journal, Aug. 1981, p.4
  261.  
  262.    ED.COM interprets an ASCII FORMFEED (0CH) as an imbedded carriage
  263. return. ED may be altered to treat FORMFEEDs normally provided some
  264. other control character is substituted for control-L (0CH), e.g. ^N.
  265. The new control character must be inserted at the following addresses:
  266.  
  267. 0528H, 162FH, and 1A12H
  268.  
  269. The following assembly language program will substitute ^N for ^L
  270. and also add a sign-on message to ED.COM.
  271.  
  272. ; EDPATCH.ASM
  273.  
  274.     ORG    100H
  275.     JMP    1B00H    ;PRINT SIGNON MESSAGE
  276.  
  277.     ORG    0528H
  278.     DB    0EH    ;SUBSTITUTE ^N FOR ^L
  279.  
  280.     ORG    162FH
  281.     DB    0EH    ;    "     
  282.  
  283.     ORG    1A12H
  284.     DB    0EH    ;    "
  285.  
  286.     ORG    1B00H
  287.     LXI    D,IDMESG
  288.     MVI    C,9    ;PRINT STRING
  289.     CALL    5
  290.     JMP    01C0H    ;ORIGINAL JUMP AT 0100H, ENTER ED
  291.  
  292. IDMESG:    DB    'ED.COM with FORMFEED'
  293.     DB    0DH,0AH,0DH,0AH
  294.     DB    '$'
  295.     END
  296.  
  297. Assemble EDPATCH.ASM to generate EDPATCH.HEX and install it with
  298. DDT as follows:
  299.  
  300.     A>DDT ED.COM
  301.     DDT VERS 2.2
  302.     NEXT  PC
  303.     1B00 0100
  304.     -IEDPATCH.HEX
  305.     -R
  306.     G0
  307.  
  308.     A>SAVE 27 ED1.COM
  309.  
  310.  
  311.  
  312.             A PATCH FOR PIP.COM
  313.  
  314. From 'MICROSYSTEMS', MAY/JUNE 1982, p.6
  315.  
  316.    The PIP feature that will optionally filter all FORMFEEDs (0CH)
  317. from a file as it is copied may be altered so that any desired
  318. character may be removed during a copy operation.
  319.    The character to be removed must be patched into PIP.COM (version
  320. 1.5) at two locations using DDT as follows:
  321.  
  322.     DDT PIP.COM
  323.     DDT VERS 2.2
  324.     NEXT  PC
  325.     1E00 0100
  326.     -SE54
  327.     0E54 0C hh        hh = unwanted code to be removed
  328.     0E55 C2 .
  329.     -SE64
  330.     0E64 0C hh        hh = unwanted code to be removed
  331.     0E65 CA .
  332.     -G0
  333.  
  334.     A>SAVE 29 PIPhh.COM
  335.     A>
  336.  
  337.  
  338.  
  339.             A PATCH FOR PIP.COM
  340.  
  341. From DDJ, Nov. 1984, p.16
  342.  
  343. The following patch can be used to force the verify (V) option
  344. on at all times. Load PIP.COM with DDT and verify that you have
  345. version 1.5 by displaying the memory contents between 0200H and
  346. 0240H. Next change the single byte at 0B34H from 1FH to 37H and
  347. save as follows:
  348.  
  349.     -SB34
  350.     0B34 1F 37
  351.     0B35 D2 .
  352.     -G0
  353.  
  354.     A>SAVE 29 PIPV.COM
  355.  
  356.  
  357.  
  358.     IMPLEMENTING INP: AND OUT: DEVICES IN PIP.COM
  359.  
  360. This is a composite of several variations of the same concept for
  361. modifying PIP.COM as found in one or more of the following:
  362.  
  363. From MICROSYSTEMS, July 1983, p.48
  364. From DDJ, May 1984, p. 18
  365. PIPXFR.ASM
  366. PIP-I/O.ASM
  367.  
  368. PIP can be used to transfer data between two computers that are connected
  369. by serial or parallel ports (or modem). PIP must be modified to perform
  370. this function by creating machine language I/O routines and patching them
  371. into PIP, so that you may use the INP: and OUT: functions.
  372. When you are ready to transmit data, initiate the receiving computer
  373. first with the command:
  374.  
  375.     PIPIO d:filename.typ=INP:
  376.  
  377. Activate the sending computer with the command:
  378.  
  379.     PIPIO OUT:=d:filename.typ,EOF:
  380.  
  381. This method will send only 7-bit ASCII data, so you cannot send 8-bit
  382. files or programs without first turning them into .HEX files by using
  383. the public domain program UNLOAD.COM or other similar utility.
  384.  
  385. The following routine demonstrates implementing the INP: and OUT:
  386. function using a Signetics 2661 USART and will have to be modified
  387. for your specific hardware.
  388.  
  389. This example also includes echo handshaking so that the sender does
  390. not overrun the receiver. Each time a character is received, it is
  391. returned to the sender which waits for the echo before sending the
  392. next character. If this is not done, PIP will lose characters at
  393. higher baud rates or when it pauses to write it's memory buffer out
  394. to disk. The handshaking may not be needed if you use low baud rates,
  395. only send files small enough to fit in the buffer and/or use the
  396. PIP [B] option.
  397.  
  398. The patch should be installed as follows:
  399. Assemble I/OPATCH.ASM to generate I/OPATCH.HEX and install it with
  400. DDT.COM as follows
  401.  
  402.   A>DDT PIP.COM
  403.   DDT VERS 2.2
  404.   NEXT  PC
  405.   1E00 0100
  406.   -II/OPATCH.HEX
  407.   -R
  408.   -G0
  409.  
  410.   A>SAVE 29 PIPIO.COM
  411.  
  412.  
  413. ;I/OPATCH.ASM
  414. ;
  415. ;THIS FILE WILL PATCH THE I/O ROUTINES INTO
  416. ;PIP FOR CP/M VERSIONS 2.2 AND 3.0 (INP: AND OUT:).
  417. ;
  418. FALSE    EQU    0
  419. TRUE    EQU    NOT FALSE
  420. ;
  421. PIP22    EQU    TRUE
  422. PIP30    EQU    FALSE
  423. ;
  424.      IF    PIP22
  425. PATCH    EQU    110H
  426. PATCHEND EQU    1FFH
  427. INPJMP    EQU    103H
  428. OUTJMP    EQU    106H
  429. INPCHR    EQU    109H
  430.      ENDIF
  431. ;
  432.      IF    PIP30
  433. PATCH    EQU    188H
  434. PATCHEND EQU    1FFH
  435. INPJMP    EQU    180H
  436. OUTJMP    EQU    184H
  437.      ENDIF
  438. ;
  439.     ORG    INPJMP
  440.     JMP    INPUT
  441. ;
  442.     ORG    OUTJMP
  443.     JMP    OUTPUT
  444. ;
  445.     ORG    PATCH
  446. ;
  447. DATA    EQU    84H    ;2661 USART PORTS
  448. STAT    EQU    85H
  449. MODE    EQU    86H
  450. COMM    EQU    87H
  451. ;
  452. INPUT:            ;INPUT A CHARACTER
  453.     LDA    INITFLG
  454.     ORA    A
  455.     CZ    INIT    ;INIT. USART MAYBE
  456.     CALL    INPLOP    ;GET A CHARACTER
  457.     ANI    7FH    ;HIGH BIT MUST BE ZERO
  458. ;
  459.      IF    PIP22
  460.     STA    INPCHR    ;SAVE IF CP/M 2.2
  461.      ENDIF
  462. ;
  463.     STA    SAVCHR    ;SAVE HERE ALSO
  464.     CALL    OUTLOP    ;RETURN CHAR. TO SENDER
  465.      IF    PIP30
  466.     LDA    SAVCHR    ;NEED CHAR. IN A FOR CP/M 3.
  467.      ENDIF
  468.     RET
  469. ;
  470.  
  471. ;
  472. OUTPUT:            ;OUTPUT A CHARACTER
  473.     MOV    A,C
  474.     STA    SAVCHR
  475.     LDA    INITFLG
  476.     ORA    A
  477.     CZ    INIT    ;INIT. USART MAYBE
  478. ;
  479.     CALL    OUTLOP    ;SEND A CHARACTER
  480.     CALL    INPLOP    ;AND WAIT FOR ECHO
  481.     RET
  482. ;
  483. INPLOP:
  484.     IN    STAT
  485.     CMA
  486.     ANI    3
  487.     JNZ    INPLOP    ;LOOP TIL WE HAVE A CHARACTER
  488.     IN    DATA    ;THEN GET IT
  489.     RET
  490. ;
  491. OUTLOP:
  492.     IN    STAT
  493.     ANI    1
  494.     JZ    OUTLOP    ;LOOP TIL USART READY FOR CHAR.
  495.     LDA    SAVCHR
  496.     OUT    DATA
  497.     RET
  498. ;
  499. INIT:            ;OPTIONAL USART INITIALIZATION
  500.     MVI    A,0CEH    ;INIT 2661 TO 9600 BAUD, 8 BITS
  501.     STA    INITFLG    ;MAKE FLAG NON-ZERO
  502.     OUT    MODE
  503.     MVI    A,03H
  504.     OUT    MODE
  505.     MVI    A,27H
  506.     OUT    COMM
  507.     IN    DATA
  508.     IN    DATA    ;CLEAR BUFFER
  509.     MVI    C,9
  510.     LXI    D,SIGNON ;PRINT THE PATCHED MESSAGE
  511.     JMP    5
  512. ;
  513. SIGNON:    DB    '2661 SERIAL PORT AT 9600 BAUD', 0DH, 0AH, '$'
  514. INITFLG:
  515.     DB    0
  516. SAVCHR:    DB    0
  517. ;
  518. LAST    EQU    $
  519. ;
  520.      IF    (PATCHEND-LAST) SHR 15    ;TEST FOR OVERFLOW
  521. ERROR    EQU    1/0    ;!PATCH IS TOO LONG !!!
  522.      ENDIF
  523. ;
  524.     END
  525.  
  526.  
  527.  
  528. The following patch for PIP.COM may also be known by several other names:
  529. e.g. PIPPATCH.ASM, RPIP.ASM or PIPPTCH2.ASM
  530. ;                               XPIP
  531. ;                 From a listing in the public domain  (SIGM V 44)
  532. ;                        entered and debugged by
  533. ;                           Noor Singh Kalsha
  534. ; An extension of PIP the standard CP/M utility we've all learned to curse.  
  535. ; This has all of the features of PIP as well as giving you the ability to 
  536. ; R(eset) the disk to R/W and do a Q(uick) repeat of the copy.  This is very 
  537. ; good if you need to make several copies of the same file onto different
  538. ; disks or if you get an error message on the first copy.
  539. ;
  540. ; R  resets the disks and  Q  repeats the copy command last given to PIP.
  541. ; To use, enter XPIP <carriage return>
  542. ; You will get:
  543. ; PIP v1.5 with (R)eset disks and (Q)uick repeat
  544. ; and the usual "*" prompt
  545. ; Enter your normal PIP command line.
  546. ; Upon completion if you wish to make another copy to another disk, change the 
  547. ; disks and hit R.  This will reset the disks to R/W without exiting PIP.  If 
  548. ; you then want to duplicate the last PIP command line enter "Q" <carrage 
  549. ; return>.  The program will then repeat your last command.
  550. ;
  551. ;INSTALLATION OF XPIP:
  552. ;
  553. ;ASSEMBLE THIS FILE TO GET XPIP.HEX
  554. ;OVERLAY XPIP.HEX ON PIP.COM AS FOLLOWS:
  555. ;   A>DDT PIP.COM
  556. ;   IXPIP.HEX
  557. ;   R
  558. ;   G0
  559. ;   SAVE 29 XPIP.COM
  560. ;
  561. BDOS    EQU    0005H
  562. DBUFF    EQU    0080H
  563. BUFF    EQU    1ECBH    ;PIP'S INPUT BUFFER
  564. CRLF    EQU    082EH    ;PIP'S INTERNAL CR-LF ROUTINE
  565. ;
  566.     ORG    100H
  567. ;
  568.     JMP    SIGNON
  569. ;
  570.     ORG    010AH
  571. ;
  572. SIGNON:
  573.     LDA    DBUFF    ;WAS A COMMAND GIVEN ON THE COMMAND LINE?
  574.     ORA    A
  575.     LXI     D,MSG1
  576.     CZ    PSTRING    ;SIGN ON IF NO COMMAND LINE.
  577.     JMP    04CEH    ;JOIN MAINLINE CODE.
  578.  
  579.  
  580. ;
  581. GETCON:
  582.     LXI    H,BUFF
  583.     MVI    M,80H    ;SPECIFY MAX LENGTH OF REPLY
  584.     XCHG        ;BUFFER ADDRESS TO DE
  585.     MVI    C,10    ;BDOS COMMAND TO READ CONSOLE BUFFER
  586.     CALL    BDOS    ;ASK BDOS TO DO IT
  587.     LDA    BUFF+1    ;LENGTH OF REPLY
  588.     CPI    1    ;JUST 1 CHARACTER ENTERED?
  589.     JNZ    GOBAK    ;LET PIP PROCESS THE COMMAND IF NOT
  590.     LDA    BUFF+2    ;FIRST (AND ONLY) CHAR TYPED
  591.     ANI    5FH    ;CONVERT LOWER TO UPPER CASE
  592.     CPI    'Q'    ;WAS IT THE REPEAT COMMAND?
  593.     JNZ    GETC1    ;JUMP IF NOT
  594. ;
  595. ;
  596. ; REPEAT COMMAND - RESTORE FIRST 4 CHARS OF THE CONSOLE BUFFER TO
  597. ;           THEIR FORMER CONTENTS, ECHO THE OLD COMMAND TO
  598. ;           CONSOLE, RESET DISK SYSTEM, AND LET PIP REPROCESS IT.
  599. ;
  600.     LHLD    STASH    ;RESTORE LENGTH AND FIRST CHAR TYPED
  601.     SHLD    BUFF+1
  602.     LXI    D,MSG2    ;'REPEATING...' MESSAGE
  603.     CALL    PSTRING    ;WRITE IT TO CONSOLE
  604.     LXI    H,BUFF+1 ;GET LENGTH BYTE
  605.     MOV    C,M    ;TO REG BC
  606.     MVI    B,0
  607.     INX    H    ;SET BUFFER START ADDRESS TO HL
  608.     DAD    B    ;POINT TO FIRST FREE POSITION IN BUFFER
  609.     MVI    M,'$'    ;FLAG END OF LINE WITH A "$"
  610.     LXI    D,BUFF+2
  611.     CALL    PSTRING    ;ECHO LINE
  612.     MVI    C,13    ;BDOS COMMAND TO RESET
  613.     JMP    BDOS
  614. ;
  615. GETC1:
  616.     CPI    'R'    ;IS IT THE USER SPECIFIED RESET COMMAND?
  617.     JNZ    GOBAK    ;LET PIP PROCESS IF NOT
  618. ;
  619. ; RESET COMMAND - MAKE ALL DISKETTES R/W
  620. ;
  621.     LXI    D,MSG3    ;'DISK SYSTEM RESET' MSG
  622.     CALL    PSTRING
  623.     MVI    C,13    ;BDOS COMMAND TO RESET
  624.     CALL    BDOS
  625.     POP    H    ;CLEAR STACK
  626.     JMP    53CH    ;REJOIN COMMAND LOOP WITHIN PIP
  627. ;
  628. GOBAK:
  629.     LHLD    BUFF+1
  630.     SHLD    1D6H
  631.     RET
  632. ;
  633. PSTRING:
  634.     MVI    C,9
  635.     JMP    BDOS
  636. ;
  637. MSG1:
  638.     DB    0DH,0AH
  639.     DB    'PIP 1.5 with (R)eset Disks and (Q)uick Repeat'
  640.     DB    0DH,0AH,'$'
  641. ;
  642. MSG3:
  643.     DB    0DH,0AH
  644.     DB    'Resetting all disks to R/W'
  645.     DB    0DH,0AH,'$'
  646. ;
  647. MSG2:
  648.     DB    0DH,0AH
  649.     DB    'Repeating:   '
  650.     DB    '$'
  651. ;
  652. STASH:    DW    0000H    ;NO INITIAL COMMAND
  653. ;
  654.     ORG    96FH    ;PATCH PIP TO VECTOR TO THIS ROUTINE
  655. ;
  656.     JMP    GETCON
  657.     END
  658.  
  659.  
  660.             A PATCH FOR MOVCPM.COM
  661.  
  662.    If the version of MOVCPM for CP/M 2.2 is run on a CP/M 1.4 system
  663. then a "SYNCHRONIZATON ERROR" will result. To eliminate this problem
  664. make the following change at address 0234H:
  665.  
  666.     instructions were:    change to:
  667.  
  668.        0234 C2          NOP
  669.        0235 5A          NOP
  670.        0236 02          NOP
  671.  
  672.  
  673.    When MOVCPM is run, it compares it's serial number with the serial
  674. number of the system it is running on. If the two do not match then
  675. a "SYNCHRONIZATION ERROR" will result. To eliminate this problem make
  676. the following change at address 02CBH:
  677.  
  678.     instructions were:    change to:
  679.  
  680.        02CB C2          NOP
  681.        02CC 5A          NOP
  682.        02CD 02          NOP
  683.  
  684. The various modules of CP/M may be found within MOVCPM.COM as follows.
  685. This assumes that MOVCPM has the CCP located at 0A00H. If it does not,
  686. then change the CCPBIAS equate to whereever it is in your system. If
  687. your BIOS is a non-standard size, you will have to change the SIZE
  688. equate. You can determine your system size by examining locations
  689. 0802 and 0801 of your movcpm program with ddt, then set the SIZE
  690. equate accordingly. (Derived from MOVPATCH.ASM by Ron Fowler)
  691.  
  692. SIZE    EQU    1A00H
  693. CCPBIAS    EQU    0A00H
  694.  
  695. MODULE        ADDRESS            BITMAP ADDRESS
  696. ----------------------------------------------------------------
  697. BOOT        CCPBIAS-80H        CCPBIAS+SIZE-0F0H
  698. CCP        CCPBIAS            CCPBIAS+SIZE-0E0H
  699. BDOS        CCPBIAS+800H        CCPBIAS+SIZE+020H
  700. BIOS        CCPBIAS+1600H        CCPBIAS+SIZE+1E0H
  701.  
  702.  
  703.  
  704.         A PATCH FOR THE CP/M 2.2 BDOS
  705.  
  706. From Dr. Dobb's Journal, Nov. 1984, p.50
  707.  
  708.    Although the CP/M 2.2 Interface Guide states that the Rename and
  709. Erase functions return the values 0, 1, 2, or 3 on a successful
  710. operation, in fact CP/M 2.2 returns only 0 on success (and 0FFH on
  711. failure). Moreover, the Set Attribute function uses the same exit
  712. code, yet the Guide omits any mention of this function's return
  713. status value. It is desirable to make the following patch since a
  714. program that uses one of these functions may occasionally wish to
  715. access the BIOS directory buffer to retrieve the directory fcb for
  716. the matched entry.
  717.  
  718.     ORG   CCP+0F8EH            INSTRUCTIONS WERE:
  719.  
  720.        NOP                   MOV    A,M
  721.        NOP                   RAL
  722.        NOP                   RNC
  723.        NOP                   XRA    A
  724.  
  725.  
  726.  
  727.         UNDOCUMENTED CP/M FUNCTIONS
  728.  
  729. From DDJ, May 1984, p.16
  730.  
  731. PIP contains a built-in hardware driver for the physical device IRD:
  732. (Intel ReaDer) which was used with the Intel Intellec-8 MDS system.
  733. The following actions are performed when each byte is read from the
  734. IRD: device during a PIP transfer:
  735.  
  736. 1) The value 0CH is output to port 01H.
  737. 2) The value 08H is output to port 01H.
  738.    This strobes the paper tape reader mechanism.
  739. 3) PIP loops until bit 5 of port 01H is set
  740.    to 1. This is the Ready bit.
  741. 4) Finally, the lower 7 bits of port 03H
  742.    are returned as the input value.
  743.  
  744. Note that if a system does not contain I/O ports 1 or 3, the net effect
  745. of all this will be to return a neverending string of 7Fh's.
  746.  
  747. The following IRD: driver code can be found in PIP.COM at address
  748. 0996H.
  749.  
  750.     MVI    A,0CH    ;TURN READER ON
  751.     OUT    01H
  752.     MVI    A,08H    ;TURN READER OFF
  753.     OUT    01H
  754. WAIT:    IN    01H    ;WAIT UNTIL READER HAS CHARACTER
  755.     RLC
  756.     RLC
  757.     RLC
  758.     RAR
  759.     JC    INPUT    ;IF CARRY, THEN DONE (GET CHAR), ELSE LOOP
  760.     JMP    WAIT    ;LOOP BACK
  761. INPUT:    IN    03H    ;GET CHARACTER
  762.     ANI    07FH    ;MASK PARITY BIT
  763.     RET
  764.  
  765.  
  766.  
  767.         UNDOCUMENTED CP/M FUNCTIONS cont.
  768.  
  769. From DDJ, May 1984, p.17
  770.  
  771.    There is an unfortunate interaction between BDOS funtion 6 console
  772. I/O and the rest of the BDOS console I/O calls. Programs should never
  773. mix 'normal' BDOS calls with function 6 or BIOS calls. Otherwise, input
  774. characters may 'vanish' mysteriously, only to reappear at a later input
  775. prompt.
  776.    Digital Research has a stop-gap patch for the latter problem, but
  777. only for MPM II 2.1. They have apparently taken a completely different
  778. approach in CP/M 3. In 3.0 they appear to examine characters as they do
  779. in 2.2; but if it is not an appropriate control character it is discarded.
  780. This is why type-ahead routines which worked with 2.2 will not function
  781. at the CCP level in CP/M 3.
  782.    In CP/M 2.2 there are three sanctioned ways to perform console I/O:
  783. via 'normal' BDOS console I/O calls, via BDOS function number 6, and by
  784. calling the BIOS directly. In fact, the last two methods do exactly the
  785. same thing. We presume Digital Research was preparing us for systems like
  786. MP/M and CP/M 3, where accessing the BIOS is a definite 'no-no'.
  787.    Normal BDOS I/O works as follows: whenever a character is sent out to
  788. the console, a check is made for an input character being available; it
  789. is tested to see if it is a Control-S. Note that this is the only
  790. character that the BDOS is looking for at this time. If it is a Control-S,
  791. the BDOS enters a tight loop looking for the next character, which may be
  792. for example, a Control-Q to resume output or a Control-C to warm boot.
  793. However, if the input character was not a Control-S, it is stored in a
  794. one-byte buffer in the BDOS, and the BDOS no longer performs any status
  795. checks during output. When the .COM program terminates with a RET to the
  796. CCP (as in STAT.COM), the character is still in the BDOS's buffer, and the
  797. next BDOS input call will retrieve it first, before calling the BIOS for
  798. more characters. If, however, the .COM program terminates with a warm boot,
  799. the BDOS is re-loaded, leaving the character buffer empty; hence, one
  800. character is gone.
  801.  
  802.    The CP/M 2.2 'Raw Console I/O' BDOS function 6 has an additional
  803. option. An E register argument of 0FEH merely checks the status of
  804. the console, and does not return or delete any pending characters.
  805. This is consistent with raw character handling in CP/M 3.0 and MP/M II.
  806. However, this function does not work properly because the status
  807. is not saved prior to execution of the BDOS exit code. A patch must
  808. be made to the BDOS to restore the intended function.
  809.  
  810.    The CP/M 2.2 'Reset Disk System' BDOS function 13 returns a result
  811. parameter in the A register. A is 0 if no $$$.SUB file is active;
  812. otherwise it is nonzero. This is how the CCP knows whether or not to
  813. continue from a submit file. However, the function only looks at
  814. whether or not the first character of any filename is a dollar sign.
  815. This is why you may have noticed some strange extra disk activity
  816. and a general sluggishness if you have, for example, a filename
  817. beginning with a '$' in your directory. It appears that the CCP
  818. attempts to open $$$.SUB, fails, and then attempts to delete $$$.SUB.
  819.  
  820.  
  821.  
  822.         UNDOCUMENTED CP/M FUNCTIONS cont.
  823.  
  824. From Microsystems, May 1983, p.70
  825.  
  826.    CP/M issues a dummy call to the BIOS 'HOME' routine prior to a
  827. directory read.
  828.  
  829.  
  830.    Early versions of the 'CP/M 2.2 Alteration Guide' did not include
  831. the following sentence in the description of the SELDSK function of
  832. the BIOS:
  833.  
  834.     The least significant bit of register E is zero if
  835.     this is the first occurrence of the drive select
  836.     since the last cold or warm start.
  837.  
  838. This information can provide a clue to the BIOS that it may need to
  839. log-in a disk that has been changed.
  840.  
  841.  
  842.  
  843.             CP/M SPACE MANAGEMENT
  844.                  by Don Wiss
  845.  
  846. CP/M does not require that the size of a file be specified at the time
  847. of creation as space is allocated dynamically as needed. Space that
  848. is released as the result of closing a file from which space has been
  849. deleted can immediately be used by another file. CP/M maintains three
  850. mechanisms for this: the Allocation Bit Map, the File Control Block
  851. (FCB) and the File Directory. This description applies to a standard
  852. 8 inch SS/SD disk with 241K data space and 2K directory.
  853.  
  854. 1.  Allocation Bit Map
  855.  
  856.     When a disk is logged-on the BDOS creates an Allocation Bit Map.
  857.     This is a matrix of 1's and 0's representing each Allocation Unit
  858.     on the disk. An Allocation Unit is eight logically consecutive
  859.     sectors (records) or 1024 bytes. The BDOS creates this matrix by
  860.     searching the Disk Allocation Map area in each FCB (see next
  861.     paragraph). When BDOS receives a request to create a file it
  862.     searches the Allocation Bit Map until it finds a bit containing a
  863.     0. BDOS then sets the map bit to 1 and places the Allocation
  864.     Unit number in the map area of the newly created FCB. Each time
  865.     a write operation is performed the BDOS examines the last alloca-
  866.     tion unit number and the Next Record number (byte 32) in the FCB.
  867.     When all eight records (sectors) of an allocation unit have been
  868.     filled the BDOS searches the Allocation Bit Map for the first bit
  869.     containing a 0.
  870.  
  871. 2.  File Control Block
  872.  
  873.     The File Control Block (sometimes called descriptor) is a 36-byte
  874.     block of RAM containing all the information needed by BDOS to
  875.     find a file on the disk and to access any specified record. Each
  876.     FCB corresponds to one extent, which is a logical block of data
  877.     containing 128 records or 16 Allocation Units. A file is com-
  878.     prised of at least one, and often more than one, extent. The FCB
  879.     has a default location in the bottom 256 bytes of memory. If a
  880.     large file has more than one extent reading operations will cause
  881.     each directory entry to be brought into this location. However a
  882.     user program may allocate enough memory in the TPA to hold all of
  883.     the FCB's of a file simultaneously and include the address of the
  884.     appropriate FCB as one argument of each access request.
  885.  
  886. 3.  File Directory
  887.  
  888.     The file directory is on Track 2 of the diskette and contains an
  889.     entry for each extent of each file. The directory entries are
  890.     copies of the first 32 bytes of the FCB's. When booting CP/M the
  891.     contents of the directory are read sequentially from the logged-
  892.     in disk and the Allocation Bit Map for that drive is recalcu-
  893.     lated. A request to open a file causes the appropriate directory
  894.     entry to be copied into the FCB area. If the file has been
  895.     opened for writing, closing the file causes the BDOS to copy the FCB
  896.     back to the directory area. The ERAse command does not modify
  897.     the disk file. It issues a Delete request to BDOS which places
  898.     an E5 in the first byte of the directory entry to mark it as
  899.     deleted. BDOS also scans the allocation units in the disk map
  900.     area of the entry and sets the corresponding bits in the Alloca-
  901.     tion Bit Map to 0, thereby freeing these units for reuse.
  902.  
  903.  
  904.  
  905.             UNUSED DISK SECTORS
  906.  
  907.    When configuring for 8-inch single-sided single-density disks,
  908. CP/M reserves the first two tracks (track 0 and track 1) for the
  909. operating system, and the first 16 logical sectors on track 2 for
  910. the disk directory. It allocates the remaining disk space to files.
  911. The remaining disk space-  ten 128 byte sectors on track 2 plus 26
  912. 128 byte sectors on tracks 3 through 76, totals 241.75 K. File
  913. allocation is done in 1K increments, however. Therefore, on a
  914. standard CP/M disk there are 0.75K or six sectors that are never
  915. written to or read from by the operating system.
  916.    The unused sectors are physical sectors 18, 24, 4, 10, 16, and
  917. 22 on track 76 (assuming the standard sector skew factor of 6 is
  918. employed), corresponding to the last six logical sectors on the
  919. disk. These sectors can be very useful for BIOS expansion, disk ID,
  920. data encription, or other system level functions. If they are used
  921. for BIOS expansion, the cold-start loading and sysgen procedures
  922. must be appropriately rewritten.
  923.  
  924.