home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols200 / vol216 / m8lib.a86 < prev    next >
Encoding:
Text File  |  1994-07-13  |  25.1 KB  |  1,108 lines

  1. ;
  2. ; M8LIB      -  Phone Number library edit utility for MDM8xx series 
  3. ;         Version 1.0  09-18-84
  4. ;
  5. ;         This is a translation of CHGLIB22 to 8086 code
  6. ;
  7. ;======================================================================
  8. ;         To Assemble:
  9. ;
  10. ;                ASM86 M8LIB
  11. ;
  12. ;                GENCMD M8LIB 8080 CODE[M650]
  13. ;
  14. ;======================================================================
  15. ;
  16. ;
  17. ;
  18. ;           SOURCE CODE
  19. ;
  20. ;    A universal number change program to work with all
  21. ;    versions of MDM8xx that contain an internal telephone
  22. ;    numbers list for use with the CAL and NUM functions.
  23. ;
  24. ;    This program will load specified MODEM file, allow 
  25. ;    changes to library, and write to secondary file. 
  26. ;
  27. ; ========================================================
  28. ;--------------
  29. ;  Revisions  ;
  30. ;--------------
  31. ;
  32. ; 09-18-84 - Translated to 8086 code and renamed M8LIB to work
  33. ; Ver. 1.0   with MDM8xx series. Version Number now reflects
  34. ;         8086 revision levels thus CHGLIB vers 2.2 became
  35. ;         M8LIB Vers 1.0
  36. ;
  37. ;                        Alex Soya
  38. ;
  39. ; 03-09-84 - Fixed bug in insert routine at label INEXIT (jump to
  40. ; Ver. 2.1   POP H caused trouble). Minor mods. Sigi Kluger
  41. ;
  42. ; 02-28-84 - In continuing with my original modification to an auto-
  43. ; Ver. 2.0   matic single program for all versions of MODEM7 and now
  44. ;         MDM7xx.  This version 2.0 will determine how large the
  45. ;         telephone list is and only allow the correct entries to
  46. ;         be made.  This eliminates the need to have to 'patch' a
  47. ;         program to make it work one way or another as was the
  48. ;         problem with versions of CHGLIB before 1.5.  Since this
  49. ;         new code was generated from Ver. 1.6 the new code that
  50. ;         was used in versions 1.7 and 1.8 does not appear in this
  51. ;         ASM file. An appology to revisors 1.8 and 1.7, I didn't 
  52. ;         find that a new version existed until this version was 
  53. ;         ready.  Since this revision is 'completely' automatic I
  54. ;         did select a new version number beginning with 2.0.  
  55. ;         Thanks to Charles Horn for assistance with the new code.
  56. ;          
  57. ;                   Dennis Recla
  58. ;                 (214) 681-4789 (300/1200)
  59. ;
  60. ;
  61. ; 02-26-84 - Modified to work with PRE MDM722 by allowing '0' - '9'
  62. ; ver 1.8    to be used as valid LIBRARY keys ONLY if wanted.
  63. ;         <ATOZ09> Byte 105H= 0 then A thru Z and 0 thru 9 valid.
  64. ;                   = 1 then A thru X only.
  65. ;         Recompile NOT needed - just patch byte 105H and SAVE.
  66. ;       - added EQU's for Version and Modification numbers
  67. ;                (used in Sign-on)
  68. ;       - Made CKNUMB part of CKCHAR
  69. ;       - Removed UNBIAS and other such stuff where not needed.
  70. ;                  Charlie Polete
  71. ;                  c/o Flanders RCP/M
  72. ;                  (201) 584-9227
  73. ;
  74. ; 02-19-84 - Added subroutines CKNUMB and UNBIAS and other such
  75. ; Ver. 1.7   stuff, to permit the View, Delete, and Insert com-
  76. ;         mands to access the larger phone libraries used in
  77. ;         MDM722 and above.    CHGLIB now can handle 36 numbers,
  78. ;         listed A-Z and 0 - 9.
  79. ;                      Robert Mornoney
  80. ;                      c/o BHEC RCPM
  81. ;                      (301) 661-2175
  82. ;
  83. ;
  84. ; 08-10-83 - Pulled un-needed code, (READC). Added LIBLOW / 
  85. ;         LIBHI bytes up front for modifiable search range,
  86. ;         currently set for 30-40, the most practical limit 
  87. ;         to date. These bytes appear at 0103H-0104H in the 
  88. ;         memory loaded image so that they can be patched 
  89. ;         with DDT, SID, etc. Search is now in 1 byte increments
  90. ;         Pulled commented out code that I had left in, (sloppy,
  91. ;         sloppy, oops..)
  92. ;
  93. ;                Mark Pulver  -    (312) 789-0499
  94. ;                     PMMI  24hrs / 7 days
  95. ;
  96. ;
  97. ; 07/12/83 - Modifed program so it will automatically load
  98. ;         the modem program to be modified, and search
  99. ;         for the correct spacing between the Alphabetic
  100. ;         KEY characters.  This program looks for spacing
  101. ;         of 30, 32, and 34 characters.  At this point in
  102. ;         time this should take care of 95% of all the
  103. ;         various modem7 programs I have come accross.
  104. ;         
  105. ;         Dennis Recla   1-214-681-4789 (Data) 300/1200
  106. ;
  107. ;
  108. ; 06/01/83 - Fixed bug in <I>nsert vs <W>rite, added "real"
  109. ;         case conversion routines.
  110. ;                Mark Pulver  -    (312) 789-0499
  111. ;                     PMMI  24hrs / 7 days
  112. ;
  113. ; 05/30/83 - Added LIBLEN equ, fixed <R>ead command, changed
  114. ;         msgs to lowercase, added <H>elp, and various
  115. ;         messages for clarity
  116. ;                Mark Pulver
  117. ;
  118. ; 05/17/83 - Modified to work with mdm707
  119. ;                Dave Holmes sysop 804-898-7493
  120. ;
  121. ; 02/23/83 - MODIFIED TO WORK WITH MODEM798 AND TO ACCEPT
  122. ;         LOWER CASE CONSOLE INPUT.
  123. ;                Bruce R. Ratoff
  124. ;
  125. ; 01/??/82 - ORIGINAL VERSION
  126. ;                Tony Ribeiro
  127. ;            
  128. ; ========================================================
  129. ;
  130. LF    EQU    0AH
  131. CR    EQU    0DH
  132. ;
  133. ;
  134. ; --------------------------------------------------------
  135. ; System Equates
  136. ;
  137. BOOT    EQU    0
  138. BDOS    EQU    BOOT+5
  139. SFCB1    EQU    BOOT+5CH
  140. SFCB2    EQU    BOOT+6CH
  141. TPA    EQU    BOOT+100H
  142. CONIN    EQU    1
  143. CONOT    EQU    2
  144. PLIST    EQU    5
  145. PRINTB    EQU    9
  146. RDCON    EQU    10
  147. CONST    EQU    11
  148. OPENF    EQU    15
  149. CLOSEF    EQU    16
  150. SRCHF    EQU    17
  151. DELF    EQU    19
  152. READF    EQU    20
  153. WRITEF    EQU    21
  154. MAKEF    EQU    22
  155. SETDMA    EQU    26
  156. ;
  157. ; ========================================================
  158. ;
  159. ;
  160.     ORG    TPA
  161. ;
  162.     JMPS    START            ; jump around data area
  163. ;
  164. ; The value of the following two bytes determine the low and hi
  165. ; range of library length to be searched. LIBLOW is the start point
  166. ; while LIBHI is the ending point. These can be patched with your
  167. ; favorite debugger so that the file need not be re-assembled.
  168. ;
  169. LIBLOW    DB    30            ; 0103H
  170. LIBHI    DB    40            ; 0104H
  171. ;
  172. ;
  173. ;PROGRAM STARTS HERE
  174. ;
  175. START:    MOV    AX,CS
  176.     MOV    SS,AX
  177.     MOV    SP,(Offset STACK)
  178.     XOR    AL,AL            ;CLEAR CHGSW
  179.     MOV    Byte Ptr CHGSW,AL
  180. ;
  181. ;THIS ROUTINE MOVES SOURCE AND OUTPUT FCBS AND 
  182. ;SETS BOTH CRS TO '0'
  183. ;
  184. SAVFCB: MOV    BX,SFCB1        ;SOURCE FCB
  185.     MOV    DX,(Offset FCB1)
  186.     CALL    MFCB
  187.     XOR    AL,AL
  188.     MOV    Byte Ptr FCB1+32,AL
  189.     MOV    BX,SFCB2        ;OUTPUT FCB
  190.     MOV    DX,(Offset FCB2)
  191.     CALL    MFCB
  192.     XOR    AL,AL
  193.     MOV    Byte Ptr FCB2+32,AL
  194. ;
  195. ;DISPLAY SIGN ON MSG
  196. ;
  197.     MOV    DX,(Offset MPROG)
  198.     CALL    PRTBUF
  199. ;
  200. ;CHECKS TO SEE THAT A SOURCE FILE IS CALLED
  201. ;
  202.     MOV    BX,SFCB1+1
  203.     MOV    AL,Byte Ptr [BX]
  204.     CMP    AL,' '
  205.     JNZ    CKDF
  206. ;
  207. ;IF NOT, DISPLAYS ERROR MSG AND EXITS PROG
  208. ;
  209.     MOV    DX,(Offset MCERR)
  210.     JMP    DOEXIT
  211. ;
  212. ;CHECKS TO SEE IT AN OUTPUT FILE IS CALLED
  213. ;
  214. CKDF:    MOV    BX,SFCB2+1
  215.     MOV    AL,Byte Ptr [BX]
  216.     CMP    AL,' '
  217.     JNZ    CLRBUF
  218. ;
  219. ;IF NOT, DISPLAYS ERROR MSG AND EXITS PROG
  220. ;
  221.     MOV    DX,(Offset MCERR)
  222.     JMP    DOEXIT
  223. ;
  224. ;THIS IS THE SUB-ROUTINE THAT MOVES FCBS
  225. ;
  226. MFCB:    MOV    CL,16
  227. MFCB1:    MOV    AL,Byte Ptr [BX]
  228.     MOV    SI,DX
  229.     MOV    [SI],AL
  230.     LAHF
  231.     INC    DX
  232.     SAHF
  233.     LAHF
  234.     INC    BX
  235.     SAHF
  236.     DEC    CL
  237.     JNZ    MFCB1
  238.     RET
  239. ;
  240. ;CLEARS 5000H BYTES OF RAM SO THAT NO GARBAGE APPEARS
  241. ;IN NEW COM FILE THAT IS WRITTEN.
  242. ;
  243. CLRBUF: MOV    DX,(Offset mclrng)
  244.     CALL    prtbuf
  245.     MOV    BX,(Offset BUF)
  246.     MOV    DX,6000H        ; 24K
  247. CLR1:    MOV    Byte Ptr [BX],0
  248.     INC    BX
  249.     DEC    DX
  250.     MOV    AL,DH
  251.     OR    AL,DL
  252.     JNZ    CLR1
  253. ;
  254. ;OPENS SOURCE FILE, AND IF NOT FOUND, DISPLAYS
  255. ;ERROR MSG.
  256. ;
  257. OPNSF:    MOV    DX,(Offset FCB1)
  258.     MOV    CL,OPENF
  259.     INT    224
  260.     INC    AL
  261.     JNZ    SRCDF
  262.     MOV    DX,(Offset MUNSF)
  263.     JMP    DOEXIT
  264. ;
  265. ;CKS TO SEE IF OUTPUT FILE ALREADY EXISTS.IF IT DOES 
  266. ;DISPLAYS ERROR MSG AND EXITS PROG.
  267. ;
  268. SRCDF:    MOV    DX,(Offset FCB2)
  269.     MOV    CL,SRCHF
  270.     INT    224
  271.     INC    AL
  272.     JZ    DOREAD
  273.     MOV    DX,(Offset MUNDF)
  274.     JMP    DOEXIT
  275. ;
  276. ;DISPLAYS LOADING MSG AND LOADS SOURCE FILE
  277. ;
  278. DOREAD: MOV    DX,(Offset MLOADF)
  279.     CALL    PRTBUF
  280.     CALL    RDFILE
  281.     JMPS    DOSRC
  282. ;
  283. ;LOADS SOURCE FILE(CURRENT MODEM7.COM PROG) AT 'BUF'
  284. ;
  285. RDFILE: MOV    BX,(Offset BUF)        ;START OF BUFFER RAM
  286.     MOV    Word Ptr DMADD,BX    ;STORE BUFFER POINTER
  287. RDFIL1: PUSH    BX
  288.     POP    DX
  289.     MOV    CL,SETDMA
  290.     INT    224
  291.     MOV    DX,(Offset FCB1)
  292.     MOV    CL,READF
  293.     INT    224
  294.     OR    AL,AL
  295.     JZ    L_3
  296.     RET
  297. L_3:
  298.     MOV    BX,Word Ptr DMADD
  299.     MOV    DX,128
  300.     ADD    BX,DX
  301.     MOV    Word Ptr DMADD,BX
  302.     JMPS    RDFIL1
  303. ;
  304. ;THIS ROUTINE WILL DO AN AUTO SEARCH OF THE START OF
  305. ;THE PHONE LIBRARY...IT LOOKS FOR THE ASCII CHARS
  306. ;'A','B','C' WITH SPACINGS <LIBLOW> TO <LIBHI> BYTES
  307. ;AS SHOWN IN THE VARIOUS VERSIONS OF THE MODEM7
  308. ; 'NUMBLIB'.SEARCH IS DONE ON FIRST 4K BYTES ONLY
  309. ;SEARCH LIMIT MONITORED BY 'SRCLMT' AND 'H' REGISTER.
  310. ;
  311. DOSRC:    MOV    BX,(Offset BUF)        ;START OF BUFFER RAM
  312.     MOV    AL,BH            ;MONITOR LIMIT COUNT
  313.     ADD    AL,24            ;SEARCH ONLY FIRST 6K
  314.     MOV    Byte Ptr SRCLMT,AL
  315. ;
  316. ;PROG LOOKS FOR FIRST LETTER IN SEQUENCE('A').
  317. ;
  318. DOSRC1: MOV    Word Ptr LIBSTT,BX    ;Store LIBSTT
  319.     MOV    AL,Byte Ptr [BX]
  320.     CMP    AL,'A'
  321.     JZ    CKB
  322.     INC    BX
  323.     MOV    AL,Byte Ptr SRCLMT
  324.     CMP    AL,BH
  325.     JNZ    DOSRC1
  326. ;
  327. ;SEARCH OF FIRST 4K BYTES DOESNT FIND LIBRARY SO
  328. ;PROGRAM EXITS.
  329. ;
  330. SRCEXT: MOV    DX,(Offset MDLNF)
  331.     JMP    DOEXIT
  332. ;
  333. ;'A' IS FOUND.PROG CKS FOR 'B' BEING IN RIGHT PLACE.
  334. ;
  335. CKB:    MOV    Word Ptr LIBSTT,BX    ; store new value of LIBSTT
  336.     MOV    CH,0
  337.     MOV    AL,Byte Ptr LIBLOW    ; get low end of search range
  338.     MOV    CL,AL
  339. CKB1:    ADD    BX,CX
  340.     MOV    AL,Byte Ptr [BX]
  341.     CMP    AL,'B'
  342.     JZ    CKC
  343.     MOV    BX,Word Ptr LIBSTT    ; get buffer address
  344.     LAHF                ; bump count once
  345.     INC    CX
  346.     SAHF
  347.     MOV    AL,CL            ; get current offset+1
  348.     LAHF                ; save it
  349.     XCHG    AL,AH
  350.     PUSH    AX
  351.     MOV    AL,Byte Ptr LIBHI    ; get hi end of search range
  352.     MOV    DH,AL            ; setup for CMP
  353.     POP    AX            ; restore current offset+1
  354.     XCHG    AL,AH
  355.     CMP    AL,DH            ; We there yet?
  356.     JB    CKB1            ; Nope...loop back
  357. ;
  358. ;'B' NOT FOUND IN <LIBLOW>-<LIBHI> BYTES FROM 'A' SO PROG BUMPS
  359. ;POINTER BY ONE(1) AND STARTS SEARCH FOR 'A' AGAIN.
  360. ;
  361. DONXT:    MOV    BX,Word Ptr LIBSTT
  362.     INC    BX
  363.     JMPS    DOSRC1
  364. ;
  365. ;'A' AND 'B' FOUND IN RIGHT PLACE.PROG NOW CKS PROPER BYTES
  366. ;DOWN THE LINE FOR 'C'.
  367. ;
  368. CKC:    ADD    BX,CX
  369.     MOV    AL,Byte Ptr [BX]
  370.     CMP    AL,'C'
  371.     JNZ    DONXT
  372.     MOV    BX,(Offset LIBLEN)    ;H/L = Address to store
  373.     MOV    Byte Ptr [BX],CL            ;Store spacing count
  374. ;
  375. ;LETTERS A,B,AND C FOUND IN PROPER SEQ AT CORRECT
  376. ;LOCATION SO PROG DISPLAYS THAT LIBRARY IS FOUND
  377. ;THEN DISPLAYS THE START ADDRESS IN HEX AND DISPS
  378. ;WHAT IT THINKS IS THE DIAL LIBRARY.
  379. ;
  380. DLFND:    CALL    DCRLF
  381.     MOV    DX,(Offset MDLFND)    ; 'Found library at '
  382.     CALL    PRTBUF
  383.     CALL    DSPADR            ; 'xxxxH'
  384.     MOV    DX,(Offset MLLEN)    ; 'Library spacing is '
  385.     CALL    PRTBUF
  386.     MOV    AL,Byte Ptr LIBLEN    ; <LIBLEN>
  387.     CALL    ADOUT
  388.     MOV    DX,(Offset MBYT)    ; ' bytes'
  389.     CALL    PRTBUF
  390.     CALL    DSPLIB            ; and the library
  391. ;
  392. ;PROG NOW ASKS USER IF THE DISPLAY LOOKS LIKE THE
  393. ;PROPER START OF THE DIAL LIBRARY.IF USER ANSWERS
  394. ;'Y' THEN PROG CONTINUES.IF  'N'  THEN    PROG GOES
  395. ;BACK AND SEARCHES SOME MORE.
  396. ;
  397. DLFND1: MOV    DX,(Offset MDLOK)
  398.     CALL    PRTBUF
  399.     CALL    CKCONS
  400.     CMP    AL,'Y'
  401.     JZ    DLFND2
  402.     CMP    AL,'N'
  403.     JNZ    DLFND1
  404.     JMPS    DONXT
  405. ;
  406. ;LIBRARY LOOKS OK,SO PROG CONTINUES HERE.
  407. ;
  408. DLFND2: CALL    DCRLF
  409. ;
  410. ;PROG DISPLAYS COMMAND LINE AND PROMPTS USER FOR CMD.
  411. ;THE D,I,AND V COMMANDS REQUIRE AND ARGUMENT WITH CMD.
  412. ;THE D,AND I CMDS NEED A LETTER 'A' TO 'Z' or '0' to '9'.
  413. ;THE V(VIEW) CMD NEEDS A LETTER AS ABOVE TO VIEW ONE
  414. ;LINE OR A '?' TO VIEW ENTIRE LIBRARY.
  415. ;THE OTHER CMDS REQUIRE NO ARGUMENT.
  416. ;
  417. CMD:    CALL    DSPLIB
  418. CMD1:    MOV    DX,(Offset MCMD)
  419.     CALL    PRTBUF
  420.     CALL    CKCONS
  421.     CMP    AL,3            ;IF CNTRL C THEN EXIT
  422.     JNZ    L_4    
  423.     JMP    EXIT
  424. L_4:
  425.     CMP    AL,'D'            ;DELETE FUNCTION
  426.     JNZ    L_5    
  427.     JMP    DELETE
  428. L_5:
  429.     CMP    AL,'H'            ; show help msg
  430.     JZ    shwhlp
  431.     CMP    AL,'I'            ;INSERT FUNCTION
  432.     JNZ    L_6    
  433.     JMP    INS
  434. L_6:
  435.     CMP    AL,'P'            ;PRINTS ENTIRE LIBRARY
  436.     JNZ    L_7    
  437.     JMP    PRTLIB
  438. L_7:
  439.     CMP    AL,'R'            ;REREADS SOURCE FILE
  440.     JZ    REREAD
  441.     CMP    AL,'V'            ;DISPS LINE/ENTIRE LIB
  442.     JNZ    L_8    
  443.     JMP    VIEW
  444. L_8:
  445.     CMP    AL,'W'            ;WRITES OUTPUT FILE
  446.     JNZ    L_9    
  447.     JMP    WRTFIL
  448. L_9:
  449. ;
  450. ;IF PROPER SYNTAX NOT USED,DISPLAYS ERROR MSG
  451. ;AND DISPLAYS CMD LINE AGAIN AND PROMPTS USER.
  452. ;
  453. CMDERR: MOV    DX,(Offset MSYNER)    ;SYNTAX ERROR MSG
  454.     CALL    PRTBUF
  455.     JMPS    CMD1
  456. ;
  457. ; Show help message
  458. ;
  459. shwhlp: MOV    DX,(Offset hlpmsg)
  460.     CALL    prtbuf
  461.     JMPS    cmd1
  462. ;
  463. ;THIS ROUTINE WILL RELOAD THE SOURCE FILE
  464. ;SO USER CAN START FROM SCRATCH AGAIN.
  465. ;
  466. REREAD: CALL    dcrlf
  467.     MOV    DX,(Offset MLOADF)    ;LOADING FILE MSG
  468.     CALL    PRTBUF
  469.     XOR    AL,AL            ;CLEAR CHGSW
  470.     MOV    Byte Ptr CHGSW,AL
  471. ;
  472.     MOV    CH,21            ; thou shalt be sure that the FCB is clean
  473.     MOV    BX,(Offset fcb1)+12
  474. agn1:    MOV    Byte Ptr [BX],0
  475.     LAHF
  476.     INC    BX
  477.     SAHF
  478.     DEC    CH
  479.     JNZ    agn1
  480. ;
  481.     MOV    DX,(Offset fcb1)    ; and thou must open a book before reading it
  482.     MOV    CL,openf
  483.     INT    224
  484.     INC    AL
  485.     JNZ    c1
  486. ;
  487.     MOV    DX,(Offset moerr)
  488.     JMP    doexit
  489. ;
  490. c1:    CALL    RDFILE
  491.     JMP    CMD
  492. ;
  493. ;DISPLAYS THE ENTIRE LIBRARY ON CONSOLE.
  494. ;
  495. DSPLIB: CALL    DCRLF
  496.     MOV    BX,Word Ptr LIBSTT
  497. DSPLB1: MOV    CL,1            ; set 1st column
  498. DSPLB2: MOV    AL,Byte Ptr LIBLEN
  499.     MOV    CH,AL            ; get length of entry
  500.     MOV    AL,Byte Ptr [BX]            ; setup for test
  501.     CMP    AL,0            ; end of lib?
  502.     JNZ    DSPLB3
  503.     RET                ; yep...
  504. ;
  505. DSPLB3: MOV    AL,Byte Ptr [BX]    ; move character to memory
  506.     CALL    DISP            ; show it
  507.     LAHF                ; bump pointer
  508.     INC    BX
  509.     SAHF
  510.     DEC    CH            ; bump counter
  511.     JNZ    DSPLB3            ; if more, do it again...
  512.     DEC    CL            ; bump column flag
  513.     JNZ    DSPLB4            ; if second column
  514.     MOV    AL,' '            ; 2 space delimeter
  515.     CALL    DISP
  516.     CALL    DISP
  517.     JMPS    DSPLB2            ; show second column
  518. DSPLB4: CALL    DCRLF            ; new line
  519.     JMPS    DSPLB1            ; keep at it...
  520. ;
  521. ;SEND ONE CHARACTER TO CONSOLE THRU CP/M FACILITIES.
  522. ;NOTE..IF DPSWP IS 'CONOT',CHAR SENT TO CONSOLE.
  523. ;IF DPSWP IS 'PLIST' THEN CHAR SENT TO LIST DEVICE.
  524. ;DPSWP IS SWITCHED TO 'PLIST' ON (P)'PRTLIB' CMD.
  525. ;
  526. DISP:    LAHF
  527.     XCHG    AL,AH
  528.     PUSH    AX
  529.     XCHG    AL,AH
  530.     PUSH    CX
  531.     PUSH    DX
  532.     PUSH    BX
  533. DPSW:    MOV    CL,CONOT
  534. DPSWP    EQU    ( OFFSET $ - 1)
  535.     MOV    DL,AL
  536.     INT    224
  537.     POP    BX
  538.     POP    DX
  539.     POP    CX
  540.     POP    AX
  541.     XCHG    AL,AH
  542.     SAHF
  543.     RET
  544. ;
  545. ;SEND CR,LF SEQUENCE TO CONSOLE OR LIST DEV.
  546. ;
  547. DCRLF:    MOV    AL,CR
  548.     CALL    DISP
  549.     MOV    AL,LF
  550.     CALL    DISP
  551.     RET
  552. ;
  553. ;DOES A PRINT BUFFER USING CP/M FACILITIES.
  554. ;
  555. PRTBUF: LAHF
  556.     XCHG    AL,AH
  557.     PUSH    AX
  558.     PUSH    CX
  559.     PUSH    DX
  560.     PUSH    BX
  561.     MOV    CL,PRINTB
  562.     INT    224
  563.     POP    BX
  564.     POP    DX
  565.     POP    CX
  566.     POP    AX
  567.     XCHG    AL,AH
  568.     SAHF
  569.     RET
  570. ;
  571. ;THIS ROUTINE READS THE CONSOLE BUFFER.
  572. ;READ THE CP/M MANUALS FOR A GOOD DESCRIPTION
  573. ;OF HOW IT WORKS.
  574. ;NOTE THAT THE CONSOLE BUFFER IS STORED AT 'CONLIN',
  575. ;THE SIZE OF THE BUFFER IS STORED AT 'CONSIZ',
  576. ;AND THE MAX LENGTH OF BUFFER IS STORED AT 'CONBUF'.
  577. ;
  578. MSUB1:    CALL    PRTBUF
  579. BLNKBF: MOV    BX,(Offset CONLIN)
  580.     MOV    AL,Byte Ptr LIBLEN    ; buffer size
  581.     INC    AL
  582.     MOV    CL,AL
  583. BLNKB1: MOV    Byte Ptr [BX],0        ; clear buffer
  584.     LAHF
  585.     INC    BX
  586.     SAHF
  587.     DEC    CL
  588.     JNZ    BLNKB1
  589.     MOV    CL,RDCON        ; do BDOS read
  590.     MOV    DX,(Offset CONBUF)
  591.     INT    224
  592.     MOV    DX,(Offset CONLIN)    ; leave D pointing to first character
  593.     RET
  594. ;
  595. ;CKS CONSOLE FOR CHAR AND STORES IT 'A' REG.
  596. ;
  597. CKCONS: MOV    CL,CONIN
  598.     INT    224
  599.     CMP    AL,61H            ; convert lower case to upper case
  600.     JNB    L_11
  601.     RET
  602. L_11:
  603.     CMP    AL,7BH
  604.     JNAE    L_12
  605.     RET
  606. L_12:
  607.     AND    AL,5FH
  608.     RET
  609. ;
  610. ;'V' CMD BRANCHES HERE.IF ARGUMENT IS '?' THEN
  611. ;PROG GOES TO 'VALL'(DISP ENTIRE LIBRARY).
  612. ;ELSE ONLY ONE LINE IS DISPLAYED PER ARGUMENT.
  613. ;
  614. VIEW:    CALL    CKCONS
  615.     CMP    AL,'?'
  616.     JZ    VALL
  617.     CALL    CKCHAR
  618.     JNB    L_13    
  619.     JMP    CMDERR
  620. L_13:
  621.     CALL    LINSEL
  622.     MOV    AL,Byte Ptr LIBLEN
  623.     MOV    CH,AL
  624.     CALL    DCRLF
  625. VONE1:    MOV    AL,Byte Ptr [BX]
  626.     CALL    DISP
  627.     LAHF
  628.     INC    BX
  629.     SAHF
  630.     DEC    CH
  631.     JNZ    VONE1
  632.     JMP    CMD1
  633. VALL:    CALL    DCRLF
  634.     CALL    DSPLIB
  635.     JMP    CMD1
  636. ;
  637. ;DELETES ONE LINE OF THE LIBRARY(DENOTED BY ARGUMENT).
  638. ;
  639. DELETE: CALL    CKCONS
  640.     CMP    AL,3
  641.     JNZ    L_14    
  642.     JMP    CMD
  643. L_14:
  644.     CALL    CKCHAR
  645.     JNB    L_15    
  646.     JMP    CMDERR
  647. L_15:
  648.     CALL    LINSEL
  649.     LAHF
  650.     INC    BX
  651.     SAHF
  652.     LAHF
  653.     INC    BX
  654.     SAHF
  655.     MOV    AL,Byte Ptr LIBLEN
  656.     DEC    AL
  657.     DEC    AL
  658.     MOV    CH,AL
  659.     CALL    DCRLF
  660. DEL1:    MOV    Byte Ptr [BX],' '
  661.     LAHF
  662.     INC    BX
  663.     SAHF
  664.     DEC    CH
  665.     JNZ    DEL1
  666. DELX:    MOV    AL,1
  667.     MOV    Byte Ptr CHGSW,AL
  668.     JMP    CMD
  669. ;
  670. ;INSERTS ONE LINE INTO LIBRARY(DENOTED BY ARGUMENT)
  671. ;IF A <CR> IS ENTERED AFTER THE 'I' CMD THEN THE
  672. ;INSERT MODE IS ABORTED,ELSE THEN ARGUMENT MUST
  673. ;BE A VALID CHAR 'A' TO 'Z' OR '0' to '9' or CONSOLE WILL
  674. ;DISPLAY A SYNTAX ERROR AND RETURN TO CMD PROMPT.
  675. ;THE VALID CHAR IS STORED IN 'LINCHR' FOR USE LATER.
  676. ;
  677. INS:    CALL    CKCONS
  678.     CMP    AL,CR
  679.     JNZ    L_16    
  680.     JMP    INEXT1
  681. L_16:
  682.     CALL    CKCHAR
  683.     JNB    L_17    
  684.     JMP    CMDERR
  685. L_17:
  686.     MOV    Byte Ptr LINCHR,AL
  687.     LAHF
  688.     XCHG    AL,AH
  689.     PUSH    AX
  690.     CALL    DSPLIB
  691.     POP    AX
  692.     XCHG    AL,AH
  693.     SAHF
  694.     CALL    LINSEL            ; @HL points to letter
  695.     LAHF                ; point to delimiter
  696.     INC    BX
  697.     SAHF
  698.     LAHF                ; point to blank space
  699.     INC    BX
  700.     SAHF
  701.     PUSH    BX            ; save it
  702. ;
  703. ;'MADDBx' IS THE PROMPT LINE BUILT FOR INSERTING
  704. ;
  705. INS1:    MOV    DX,(Offset MADDB1)    ; "  Description"
  706.     CALL    PRTBUF
  707. ;
  708.     MOV    AL,Byte Ptr LIBLEN    ; (length of entry) - (message offset)
  709.     SUB    AL,27
  710.     MOV    CH,AL
  711.     MOV    AL,' '
  712. spac1:    CALL    disp            ; print a space
  713.     DEC    CH            ; decrement counter
  714.     JNZ    spac1            ; if not done, then print another
  715. ;
  716.     MOV    DX,(Offset maddb2)    ; "1-xxx-xxx-xxxx  - Exactly "
  717.     CALL    prtbuf
  718.     MOV    AL,Byte Ptr LIBLEN    ; offset for "A:"
  719.     SUB    AL,2
  720.     CALL    adout            ; LIBLEN as decimal ASCII value
  721.     MOV    DX,(Offset maddb3)    ; " Characters"
  722.     CALL    prtbuf
  723. ;
  724.     MOV    AL,Byte Ptr LINCHR
  725.     CALL    DISP            ; show lib letter
  726.     MOV    AL,':'
  727.     CALL    DISP            ; show a delimiter
  728.     CALL    BLNKBF            ; do BDOS conin, @DC points to buff
  729.     MOV    AL,Byte Ptr CONSIZ    ; get # of characters
  730.     OR    AL,AL            ; 0?
  731.     JZ    INEXIT            ; exit if blank return
  732.     MOV    CH,AL            ; correct # of characters?
  733.     MOV    AL,Byte Ptr LIBLEN
  734.     SUB    AL,2
  735.     CMP    AL,CH
  736.     JNZ    INS1            ; nope, try again
  737.     POP    BX            ; get lib entry pointer back
  738.     MOV    DX,(Offset CONLIN)    ; point to inbuff
  739. INS2:    MOV    SI,DX            ; get first character from buffer
  740.     MOV    AL,[SI]
  741.     MOV    Byte Ptr [BX],AL    ; move it to library
  742.     LAHF                ; bump inpointer
  743.     INC    DX
  744.     SAHF
  745.     LAHF                ; bump outpointer
  746.     INC    BX
  747.     SAHF
  748.     DEC    CH            ; bump counter
  749.     JNZ    INS2            ; if not done, do more
  750.     JMP    DELX            ; all done
  751. ;
  752. ;PROG COMES HERE IF ABORTING INSERT MODE.
  753. ;
  754. INEXIT: POP    BX
  755. INEXT1: MOV    DX,(Offset MABINS)
  756.     CALL    PRTBUF
  757.     JMP    CMD1
  758. ;
  759. ;This routine first computes the address of the '0' library
  760. ;entry if it were to exist.  This location is beyond the 'Z'
  761. ;entry by the LIBLEN number of bytes, as already determined.
  762. ;The character at the location is tested for a '0', and if it
  763. ;is, proceeds t verify that the console entry is a valid letter
  764. ;or number.  If the character is not a '0', only letter entries
  765. ;are accepted.    In any case, the routine returns with CY set if
  766. ;the entry is not acceptable.
  767. ;
  768. ;First we must compute the location for the hypothetical '0'.
  769. ;
  770. CKCHAR: LAHF                ;Save the input character
  771.     XCHG    AL,AH
  772.     PUSH    AX
  773.     MOV    AL,Byte Ptr LIBLEN    ;get the length of entries    
  774.     MOV    DL,AL            ;get LIBLEN
  775.     MOV    DH,0            ;....into DE
  776.     MOV    BX,0            ;use HL to accumulate product of mult.
  777.     MOV    AL,26            ;numeric offset value of '0'('A'=0,'Z'=25)
  778.     MOV    CH,8            ;8-bit multiplier
  779. CKCHAR1:
  780.     SHL    BX,1            ;\
  781.     ROL    AL,1            ; \         This section multiplies the
  782.     JNB    CKCHAR2            ;  \         LIBLEN value in DE bye the
  783.     ADD    BX,DX            ;   |---     number 26 in A to get the
  784. CKCHAR2:                ;  /         offset from LIBSTT of the
  785.     DEC    CH            ; /         hypothetical '0'. The offset
  786.     JNZ    CKCHAR1            ;/         is now in HL
  787.     XCHG    BX,DX            ;Move offset to DE
  788.     MOV    BX,Word Ptr LIBSTT    ;get library start address
  789.     ADD    BX,DX            ;add the offset
  790.     MOV    AL,Byte Ptr [BX]    ;get the character there
  791.     CMP    AL,'0'            ;is it '0' ?
  792.     JZ    CKCHAR4            ;if so
  793.     POP    AX            ;else - check only for alpha
  794.     XCHG    AL,AH
  795. CKCHAR3:
  796.     CMP    AL,'A'            ;less than 'A' ?
  797.     JNB    L_18    
  798.     RET                ;ret with CY set if not alpha
  799. L_18:
  800.     CMP    AL,'Z'+1        ;greater than 'Z' ?
  801.     CMC                ;set CY if so - else reset CY
  802.     RET
  803. CKCHAR4:
  804.     POP    AX            ;get char back for number check
  805.     XCHG    AL,AH
  806.     CMP    AL,'0'            ;less than '0'?
  807.     JNB    L_19    
  808.     RET                ;error if so
  809. L_19:
  810.     CMP    AL,'9'+1        ;no CY if greater than '9'
  811.     JNB    CKCHAR3            ;so check for alpha
  812.     CMC                ;else - reset CY, number OK
  813.     RET
  814. ;
  815. ;DISPLAYS START ADDRESS ON CONSOLE.
  816. ;
  817. DSPADR: MOV    BX,Word Ptr LIBSTT
  818.     MOV    AL,BH
  819.     CALL    HEXASC
  820.     MOV    AL,BL
  821.     CALL    HEXASC
  822.     MOV    DX,(Offset MHEX)
  823.     CALL    PRTBUF
  824.     RET
  825. ;
  826. ;Decimal output routine, print @HL as ASCII digits
  827. ;   entry at ADOUT will print @A
  828. ;
  829. ADOUT:    MOV    BH,0            ; clear @H
  830.     MOV    BL,AL            ; @A to @L
  831. DECOUT: PUSH    CX
  832.     PUSH    DX
  833.     PUSH    BX
  834.     MOV    CX,-10
  835.     MOV    DX,-1
  836. DECOU2: ADD    BX,CX
  837.     INC    DX
  838.     JB    DECOU2
  839.     MOV    CX,10
  840.     ADD    BX,CX
  841.     XCHG    BX,DX
  842.     MOV    AL,BH
  843.     OR    AL,BL
  844.     JZ    L_20    
  845.     CALL    DECOUT
  846. L_20:
  847.     MOV    AL,DL
  848.     ADD    AL,'0'
  849.     CALL    DISP
  850.     POP    BX
  851.     POP    DX
  852.     POP    CX
  853.     RET
  854. ;
  855. ;CONVERTS HEX BINARY NBR TO ASCII AND DISPS ON CONSOLE.
  856. ;
  857. HEXASC: LAHF
  858.     XCHG    AL,AH
  859.     PUSH    AX
  860.     XCHG    AL,AH
  861.     ROR    AL,1
  862.     ROR    AL,1
  863.     ROR    AL,1
  864.     ROR    AL,1
  865.     CALL    OUTHEX
  866.     POP    AX
  867.     XCHG    AL,AH
  868. OUTHEX: AND    AL,0FH
  869.     ADD    AL,90H
  870.     DAA
  871.     ADC    AL,40H
  872.     DAA
  873.     CALL    DISP
  874.     RET
  875. ;
  876. ;SELECTS LINE IN LIBRARY AS DENOTED BY A-Z ARGUMENT.
  877. ;
  878. LINSEL: CMP    AL,'A'            ;Alpha if no CY
  879.     JNB    LINSEL1            ;so jump to original code
  880.     SUB    AL,30H            ;else remove ASCII bias
  881.     ADD    AL,27            ;equate '0' to 27, after 'Z'
  882.     JMPS    LINSEL2
  883. ;
  884. LINSEL1:                ;original code starts here
  885.     AND    AL,1FH            ;Equate 'A' to 1
  886. ;
  887. LINSEL2:
  888.     SUB    AL,1            ;Make 'A' = 0, 'Z' = 26
  889.     MOV    BX,Word Ptr LIBLEN
  890.     MOV    DL,BL
  891.     MOV    DH,0
  892.     MOV    BX,0
  893.     MOV    CH,8
  894. LINSC1: SHL    BX,1
  895.     ROL    AL,1
  896.     JNB    LINSC2
  897.     LAHF
  898.     ADD    BX,DX
  899.     SAHF
  900. LINSC2: DEC    CH
  901.     JNZ    LINSC1
  902.     XCHG    BX,DX
  903.     MOV    BX,Word Ptr LIBSTT
  904.     LAHF
  905.     ADD    BX,DX
  906.     RCR    SI,1
  907.     SAHF
  908.     RCL    SI,1
  909.     MOV    Word Ptr LINSTT,BX
  910.     RET
  911. ;
  912. ;WRITES OUTPUT FILE TO DISK STARTING FROM 'BUF'.
  913. ;THESE ARE STANDARD ROUTINES,NOTHING FANCY HERE.
  914. ;
  915. WRTFIL: MOV    DX,(Offset mwrtng)
  916.     CALL    prtbuf
  917.     MOV    DX,(Offset FCB2)
  918.     MOV    CL,MAKEF
  919.     INT    224
  920.     INC    AL
  921.     JNZ    DFOK
  922.     MOV    DX,(Offset MNOSPC)
  923.     CALL    PRTBUF
  924.     JMP    CMD1
  925. DFOK:    CALL    numrec
  926.     MOV    BX,(Offset BUF)
  927. WRTFL1: LAHF
  928.     XCHG    AL,AH
  929.     PUSH    AX
  930.     XCHG    AL,AH
  931.     MOV    Word Ptr DMADD,BX
  932.     PUSH    BX
  933.     POP    DX
  934.     MOV    CL,SETDMA
  935.     INT    224
  936.     MOV    DX,(Offset FCB2)
  937.     MOV    CL,WRITEF
  938.     INT    224
  939.     OR    AL,AL
  940.     JZ    WRTOK
  941.     POP    AX
  942.     XCHG    AL,AH
  943.     SAHF
  944.     MOV    DX,(Offset FCB2)
  945.     MOV    CL,CLOSEF
  946.     INT    224
  947.     MOV    DX,(Offset MDFULL)
  948.     JMP    DOEXIT
  949. WRTOK:    POP    AX
  950.     XCHG    AL,AH
  951.     DEC    AL
  952.     OR    AL,AL
  953.     JZ    WRDONE
  954.     MOV    BX,Word Ptr DMADD
  955.     MOV    DX,128
  956.     LAHF
  957.     ADD    BX,DX
  958.     RCR    SI,1
  959.     SAHF
  960.     RCL    SI,1
  961.     JMPS    WRTFL1
  962. WRDONE: MOV    DX,(Offset FCB2)
  963.     MOV    CL,CLOSEF
  964.     INT    224
  965.     MOV    DX,(Offset MSAVED)
  966.     JMPS    DOEXIT
  967. ;
  968. ;Calculate number of records to write returns
  969. ; with @A=#records. Note that code is only good
  970. ; for 255 records, (32K)
  971. ;
  972. numrec: MOV    BX,Word Ptr dmadd
  973.     MOV    DX,-((Offset buf))
  974.     ADD    BX,DX
  975.     MOV    AL,BL
  976.     OR    AL,AL
  977.     RCL    AL,1
  978.     MOV    BL,BH
  979.     MOV    BH,0
  980.     LAHF
  981.     XCHG    AL,AH
  982.     PUSH    AX
  983.     SHL    BX,1
  984.     POP    AX
  985.     XCHG    AL,AH
  986.     SAHF
  987.     MOV    AL,0
  988.     ADC    AL,BL
  989.     RET
  990. ;
  991. ;PROG COMES HERE IF (P)'PRTLIB' CMD CALLED.
  992. ;WHAT IT DOES IS CHANGE 'CONOT' TO 'LIST' AT DPSWP
  993. ;AND CHANGES BACK TO 'CONOT' AT END OF PRINTOUT.
  994. ;
  995. PRTLIB: MOV    AL,PLIST
  996.     MOV    CS:Byte Ptr .DPSWP,AL
  997.     CALL    DSPLIB
  998.     CALL    DCRLF
  999.     MOV    AL,CONOT
  1000.     MOV    CS:Byte Ptr .DPSWP,AL
  1001.     JMP    CMD1
  1002. ;
  1003. ;THESE CONTAIN THE EXIT ROUTINES.
  1004. ;IF NO INSERT OR DELETE HAS BEEN DONE,THEN 'CHGSW'
  1005. ;IS '0' AND THEN PROG EXITS.IF AN INSERT OR DELETE
  1006. ;HAS BEEN PERFORMED THEN 'CHGSW' WAS SET TO '1'
  1007. ;AND USER IS ASKED IF NEW FILE IS TO BE SAVED.
  1008. ;IF USER ANSWERS 'Y' THEN A 'WRTFIL' IS DONE AND
  1009. ;PROG IS EXITED.IF ANSWER IS 'N' THEN PROG EXITS
  1010. ;WITHOUT WRITING NEW FILE.
  1011. ;
  1012. EXIT:    MOV    AL,Byte Ptr CHGSW
  1013.     OR    AL,AL
  1014.     JZ    DOEXT1
  1015. EXIT1:    MOV    DX,(Offset MCKSAV)
  1016.     CALL    PRTBUF
  1017.     CALL    CKCONS
  1018.     CMP    AL,'Y'
  1019.     JNZ    L_21    
  1020.     JMP    WRTFIL
  1021. L_21:
  1022.     CMP    AL,'N'
  1023.     JNZ    EXIT1
  1024.     JMPS    DOEXT2
  1025. ;
  1026. DOEXIT: CALL    PRTBUF
  1027.     JMPS    DOEXT2
  1028. DOEXT1: MOV    DX,(Offset MNCHG)
  1029.     CALL    PRTBUF
  1030. DOEXT2: MOV    DX,(Offset MEXIT)
  1031.     CALL    PRTBUF
  1032.     MOV    CL,0
  1033.     MOV    DL,0
  1034.     INT    224
  1035. ;
  1036. ;
  1037. ;THE DATA AREA STORES ALL THE MESSAGES,AND ALL THE 
  1038. ;OTHER DATA USED BY THE PROG.
  1039. ;
  1040. ;DATA AREA
  1041. ;
  1042. MPROG    DB    CR,LF,'M8LIB V 1.0 -  change Phone Number Library of MDM8xx series'
  1043.     DB    CR,LF,'8086 Version by Alex Soya',CR,LF,'$'
  1044. MCERR    DB    CR,LF,LF,'Syntax is :   M8LIB input.CMD output.CMD',CR,LF,LF
  1045.     DB    '  Both filenames must be specified',CR,LF
  1046.     DB    '  and <output> must be unique',CR,LF,'$'
  1047. MUNSF    DB    7,CR,LF,LF,'Unable to open Source File$'
  1048. MUNDF    DB    7,CR,LF,LF,'Output File Already Exists$'
  1049. MNOSPC    DB    7,CR,LF,LF,'No Directory Space$'
  1050. MCLRNG    DB    CR,LF,'Clearing file space, $'
  1051. MLOADF    DB    'loading file...',CR,LF,'$'
  1052. MEXIT    DB    CR,LF,'M8LIB done, rebooting$'
  1053. MDLNF    DB    7,CR,LF,LF,'Dial Library not found in the first 6k Bytes$'
  1054. MDLFND    DB    CR,LF,'Found dial Library at $'
  1055. MLLEN    DB    CR,LF,'Library spacing is $'
  1056. MBYT    DB    ' bytes',CR,LF,'$'
  1057. MDLOK    DB    CR,LF,'Does Library look okay? $'
  1058. MCMD    DB    CR,LF,'<D>elete, <H>elp, <I>nsert, <P>rint, <R>ead,'
  1059.     DB    ' <V>iew, <W>rite $'
  1060. hlpmsg    DB    CR,LF,LF,'  ++  Command Summary  ++',CR,LF,LF
  1061.     DB    ' Cmd   Syntax    Description',CR,LF
  1062.     DB    '----- --------  -------------',CR,LF,LF
  1063.     DB    '  D      D*       Delete specified entry from library',CR,LF
  1064.     DB    '  H      H        Display this screen',CR,LF
  1065.     DB    '  I      I*       Insert new text for specified entry',CR,LF
  1066.     DB    '  P      P        Print full library on printer',CR,LF
  1067.     DB    '  R      R        Re-Read library from source file',CR,LF
  1068.     DB    '  V      V*       View specified entry on console',CR,LF
  1069.     DB    '         V?       View entire library',CR,LF
  1070.     DB    '  W      W        Write new COM file to disk',CR,LF,LF
  1071.     DB    '  "*"  signifies one character,  A - Z or 0 to 9 which',CR,LF
  1072.     DB    '       is the library entry you wish to work with',CR,LF,'$'
  1073. MSYNER    DB    7,CR,LF,LF,'++ Syntax Error ++',CR,LF,'$'
  1074. MABINS    DB    CR,LF,LF,'Aborting insert mode, no changes made$'
  1075. MADDB1    DB    CR,LF,'  Description$'
  1076. MADDB2    DB    '1-xxx-xxx-xxxx  - Exactly $'
  1077. MADDB3    DB    ' Characters',CR,LF,'$'
  1078. MDFULL    DB    7,CR,LF,LF,'Disk Full$'
  1079. MWRTNG    DB    CR,LF,LF,'Writing File...$'
  1080. MSAVED    DB    CR,'File Written to Disk$'
  1081. MOERR    DB    7,CR,LF,'Open error on <R>ead',CR,LF,'$'
  1082. MNCHG    DB    CR,LF,LF,'No changes made to library$'
  1083. MCKSAV    DB    CR,LF,LF,'Do you want to save new File (Y/N)? $'
  1084. MHEX    DB    'H, (Absolute address)',CR,LF,'$'
  1085. DMADD    DW    0
  1086. LIBSTT    DW    0
  1087. LINSTT    DW    0
  1088. CHGSW    DB    0
  1089. PRTSW    DB    0
  1090. SRCLMT    DB    0
  1091. LINCHR    DB    0
  1092. CONBUF    DB    (Offset CONLEN)
  1093. CONSIZ    RS    1
  1094. CONLIN    RS    35
  1095. CONLEN    EQU    (Offset $)-(Offset CONSIZ)
  1096. KPCLR    DB    0
  1097. FCB1    RS    36
  1098. FCB2    RS    36
  1099. LIBLEN    RS    1
  1100. STKSPC    RS    40
  1101. STACK    EQU    (Offset $)
  1102. BUF    EQU    (Offset $)
  1103. LDAREA    RS    6000H        ; area to load CMD file
  1104. ;
  1105. ;
  1106.     END
  1107.