home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / vol093 / chglib.asm < prev    next >
Encoding:
Assembly Source File  |  1984-04-29  |  12.4 KB  |  678 lines

  1. ;CHGLIB PROG..PROGRAM TO CHANGE DIAL LIBRARY FOR 
  2. ;MODEM7.COM EASIER THAN CHANGING ASM FILE AND
  3. ;HAVING TO REASSEMBLE IT EACH TIME YOU WANT TO
  4. ;ADD OR CHANGE NUMBERS...TONY RIBEIRO JAN 82..
  5. ;
  6. ; 02/23/83 - MODIFIED TO WORK WITH MODEM798 AND TO ACCEPT
  7. ;        LOWER CASE CONSOLE INPUT.  (BRUCE R. RATOFF)
  8. ;
  9. ;SYSTEM EQUATES
  10. BOOT    EQU    0
  11. BDOS    EQU    BOOT+5
  12. SFCB1    EQU    BOOT+5CH
  13. SFCB2    EQU    BOOT+6CH
  14. TPA    EQU    BOOT+100H
  15. CONIN    EQU    1
  16. CONOT    EQU    2
  17. LIST    EQU    5
  18. PRINTB    EQU    9
  19. RDCON    EQU    10
  20. CONST    EQU    11
  21. OPENF    EQU    15
  22. CLOSEF    EQU    16
  23. SRCHF    EQU    17
  24. DELF    EQU    19
  25. READF    EQU    20
  26. WRITEF    EQU    21
  27. MAKEF    EQU    22
  28. SETDMA    EQU    26
  29. LF    EQU    0AH
  30. CR    EQU    0DH
  31. ;
  32. ;PROGRAM STARTS HERE
  33.     ORG    TPA
  34. START:    LXI    SP,STACK
  35.     XRA    A        ;CLEAR CHGSW
  36.     STA    CHGSW
  37. ;THIS ROUTINE MOVES SOURCE AND OUTPUT FCBS AND 
  38. ;SETS BOTH CRS TO '0'
  39.  
  40. SAVFCB:    LXI    H,SFCB1        ;SOURCE FCB
  41.     LXI    D,FCB1
  42.     CALL    MFCB
  43.     XRA    A
  44.     STA    FCB1+32
  45.     LXI    H,SFCB2        ;OUTPUT FCB
  46.     LXI    D,FCB2
  47.     CALL    MFCB
  48.     XRA    A
  49.     STA    FCB2+32
  50. ;DISPLAY SIGN ON MSG
  51.  
  52.     LXI    D,MPROG        
  53.     CALL    PRTBUF        
  54. ;CHECKS TO SEE THAT A SOURCE FILE IS CALLED
  55.  
  56.     LXI    H,SFCB1+1
  57.     MOV    A,M
  58.     CPI    ' '
  59.     JNZ    CKDF
  60. ;IF NOT, DISPLAYS ERROR MSG AND EXITS PROG
  61.  
  62.     LXI    D,MNOSF
  63.     JMP    DOEXIT
  64. ;CHECKS TO SEE IT AN OUTPUT FILE IS CALLED
  65.  
  66. CKDF:    LXI    H,SFCB2+1
  67.     MOV    A,M
  68.     CPI    ' '
  69.     JNZ    CLRBUF
  70. ;IF NOT, DISPLAYS ERROR MSG AND EXITS PROG
  71.  
  72.     LXI    D,MNODF
  73.     JMP    DOEXIT
  74. ;THIS IS THE SUB-ROUTINE THAT MOVES FCBS
  75.  
  76. MFCB:    MVI    C,16
  77. MFCB1:    MOV    A,M
  78.     STAX    D
  79.     INX    D
  80.     INX    H
  81.     DCR    C
  82.     JNZ    MFCB1
  83.     RET
  84. ;CLEARS 4000H BYTES OF RAM SO THAT NO GARBAGE APPEARS
  85. ;IN NEW COM FILE THAT IS WRITTEN.
  86.  
  87. CLRBUF:    LXI    H,BUF
  88.     LXI    D,4000H
  89. CLR1:    MVI    M,0
  90.     INX    H
  91.     DCX    D
  92.     MOV    A,D
  93.     ORA    E
  94.     JNZ    CLR1
  95. ;OPENS SOURCE FILE, AND IF IT NOT FOUND, DISPLAYS
  96. ;ERROR MSG.
  97.  
  98. OPNSF:    LXI    D,FCB1
  99.     MVI    C,OPENF
  100.     CALL    BDOS
  101.     INR    A
  102.     JNZ    SRCDF
  103.     LXI    D,MUNSF
  104.     JMP    DOEXIT
  105. ;CKS TO SEE IF OUTPUT FILE ALREADY EXISTS.IF IT DOES 
  106. ;DISPLAYS ERROR MSG AND EXITS PROG.
  107.  
  108. SRCDF:    LXI    D,FCB2
  109.     MVI    C,SRCHF
  110.     CALL    BDOS
  111.     INR    A
  112.     JZ    DOREAD
  113.     LXI    D,MUNDF
  114.     JMP    DOEXIT
  115. ;DISPLAYS LOADING FILE. MSG AND LOADS SOURCE FILE
  116.  
  117. DOREAD:    LXI    D,MLOADF
  118.     CALL    PRTBUF
  119.     CALL    RDFILE
  120.     JMP    ASKADR
  121. ;LOADS SOURCE FILE(CURRENT MODEM7.COM PROG) AT 'BUF'
  122.  
  123. RDFILE:    LXI    H,BUF        ;START OF BUFFER RAM
  124.     SHLD    DMADD        ;STORE BUFFER POINTER
  125. RDFIL1:    PUSH    H
  126.     POP    D
  127.     MVI    C,SETDMA
  128.     CALL    BDOS
  129.     LXI    D,FCB1
  130.     MVI    C,READF
  131.     CALL    BDOS
  132.     ORA    A
  133.     RNZ
  134.     LHLD    DMADD
  135.     LXI    D,128
  136.     DAD    D
  137.     SHLD    DMADD
  138.     JMP    RDFIL1
  139. ;ASKS USER IF START ADDRESS OF PHONE LIBRARY IS KNOWN.
  140. ;IS ANSWER IF YES THEN PROG JMPS TO 'SETADR'
  141. ;IF NO THAN PROG FALL THRU TO 'ASKSRC'
  142. ;NOTE...THIS REFERS TO THE LABEL 'NUMBLIB' IN THE
  143. ;MODEM7 PROGRAM,WHICH IS THE START OF THE PHONE
  144. ;NUMBER LIBRARY.
  145.  
  146. ASKADR:    LXI    D,MADR
  147.     CALL    PRTBUF
  148.     CALL    CKCONS
  149.     ANI    5FH        ; FORCE UPPERCASE
  150.     CPI    'Y'
  151.     JZ    SETADR
  152.     CPI    'N'
  153.     JNZ    ASKADR
  154. ;IF USER DOESNT KNOW THE START ADDRESS OF LIBRARY,
  155. ;THEN PROG ASKS USER IF AN AUTO SEARCH OF START
  156. ;SHOUD BE DONE.IS USER ANSWERS  'N'  THEN PROG EXITS.
  157. ;IF THE ANSWER IS  'Y'  THEN PROG BRANCHES TO 'DOSRC'.
  158.  
  159. ASKSRC:    LXI    D,MSRCH
  160.     CALL    PRTBUF
  161.     CALL    CKCONS
  162.     ANI    5FH        ;FORCE UPPERCASE
  163.     CPI    'Y'
  164.     JZ    DOSRC
  165.     CPI    'N'
  166.     JNZ    ASKSRC
  167.     JMP    DOEXT1
  168. ;USER IS ASKED FOR LIBRARY START ADDRESS....
  169. ;THE FORMAT IS FOUR(4) HEX CHARS...
  170. ;PROG THEN STORES START ADDRESS AT 'LIBSTT' AND THEN
  171. ;JMPS TO 'CMD'.
  172.  
  173. SETADR:    LXI    D,MDOADR
  174.     CALL    MSUB1
  175.     CALL    READC
  176.     LDA    CONSIZ
  177.     CPI    4
  178.     JNZ    SETADR
  179.     LXI    D,BUF-100H
  180.     DAD    D        ;ADJUST W/ LOAD OFFSET
  181.     SHLD    LIBSTT
  182.     JMP    CMD
  183. ;THIS ROUTINE WILL DO AN AUTO SEARCH OF THE START OF
  184. ;THE PHONE LIBRARY...IT LOOKS FOR THE ASCII CHARS
  185. ;'A','B','C' WITH THE PROPER SPACING(32 BYTES) AS SHOWN
  186. ;IN 'NUMBLIB'.SEARCH IS DONE ON FIRST 2K BYTES ONLY.
  187. ;SEARCH LIMIT MONITORED BY 'SRCLMT' AND 'H' REGISTER.
  188.  
  189. DOSRC:    LXI    H,BUF        ;START OF BUFFER RAM
  190.     MOV    A,H        ;MONITOR LIMIT COUNT
  191.     ADI    8        ;SEARCH ONLY FIRST 2K
  192.     STA    SRCLMT
  193. ;PROG LOOKS FOR FIRST LETTER IN SEQUENCE('A').
  194. DOSRC1:    MOV    A,M
  195.     CPI    'A'
  196.     JZ    CKB
  197.     INX    H
  198.     LDA    SRCLMT
  199.     CMP    H
  200.     JNZ    DOSRC1
  201. ;SEARCH OF FIRST 2K BYTES DOESNT FIND LIBRARY SO
  202. ;PROGRAM EXITS.
  203.  
  204. SRCEXT:    LXI    D,MDLNF
  205.     JMP    DOEXIT
  206. ;'A' IS FOUND.PROG CKS FOR 'B' BEING IN RIGHT PLACE.
  207.  
  208. CKB:    SHLD    LIBSTT
  209.     LXI    D,32
  210.     DAD    D
  211.     MOV    A,M
  212.     CPI    'B'
  213.     JZ    CKC
  214. ;'B' NOT FOUND 32 BYTES FROM 'A' SO PROG BUMPS POINTER
  215. ;BY ONE(1) AND STARTS SEARCH FOR 'A' AGAIN.
  216.  
  217. DONXT:    LHLD    LIBSTT
  218.     INX    H
  219.     JMP    DOSRC1
  220. ;'A' AND 'B' FOUND IN RIGHT PLACE.PROG NOW CKS 32 BYTES
  221. ;DOWN THE LINE FOR 'C'.
  222.  
  223. CKC:    LXI    D,32
  224.     DAD    D
  225.     MOV    A,M
  226.     CPI    'C'
  227.     JNZ    DONXT
  228. ;LETTERS A,B,AND C FOUND IN PROPER SEQ AT CORRECT
  229. ;LOCATION SO PROG DISPLAYS THAT LIBRARY IS FOUND
  230. ;THEN DISPLAYS THE START ADDRESS IN HEX AND DISPS
  231. ;WHAT IT THINKS IS THE DIAL LIBRARY.
  232.  
  233. DLFND:    CALL    DCRLF
  234.     LXI    D,MDLFND
  235.     CALL    PRTBUF
  236.     CALL    DSPADR
  237.     CALL    DSPLIB
  238. ;PROG NOW ASKS USER IF THE DISPLAY LOOKS LIKE THE
  239. ;PROPER START OF THE DIAL LIBRARY.IF USER ANSWERS
  240. ;'Y' THEN PROG CONTINUES.IF  'N'  THEN  PROG GOES
  241. ;BACK AND SEARCHES SOME MORE.
  242.  
  243. DLFND1:    LXI    D,MDLOK
  244.     CALL    PRTBUF
  245.     CALL    CKCONS
  246.     ANI    5FH        ;FORCE UPPERCASE
  247.     CPI    'Y'
  248.     JZ    DLFND2
  249.     CPI    'N'
  250.     JNZ    DLFND1
  251.     JMP    DONXT
  252. ;LIBRARY LOOKS OK,SO PROG CONTINUES HERE.
  253.  
  254. DLFND2:    CALL    DCRLF
  255. ;PROG DISPLAYS COMMAND LINE AND PROMPTS USER FOR CMD.
  256. ;THE D,I,AND V COMMANDS REQUIRE AND ARGUMENT WITH CMD.
  257. ;THE D,AND I CMDS NEED A LETTER 'A' TO 'Z'.
  258. ;THE V(VIEW) CMD NEEDS A LETTER AS ABOVE TO VIEW ONE
  259. ;LINE OR A '?' TO VIEW ENTIRE LIBRARY.
  260. ;THE OTHER CMDS REQUIRE NO ARGUMENT.
  261.  
  262. CMD:    CALL    DSPLIB
  263. CMD1:    LXI    D,MCMD
  264.     CALL    PRTBUF
  265.     CALL    CKCONS
  266.     CPI    3        ;IF CNTRL C THEN EXIT
  267.     JZ    EXIT
  268.     ANI    5FH        ;FORCE UPPERCASE
  269.     CPI    'D'        ;DELETE FUNCTION
  270.     JZ    DELETE
  271.     CPI    'I'        ;INSERT FUNCTION
  272.     JZ    INS
  273.     CPI    'P'        ;PRINTS ENTIRE LIBRARY
  274.     JZ    PRTLIB
  275.     CPI    'R'        ;REREADS SOURCE FILE
  276.     JZ    REREAD
  277.     CPI    'V'        ;DISPS LINE/ENTIRE LIB
  278.     JZ    VIEW
  279.     CPI    'W'        ;WRITES OUTPUT FILE
  280.     JZ    WRTFIL
  281. ;IF PROPER SYNTAX NOT USED,DISPLAYS ERROR MSG
  282. ;AND DISPLAYS CMD LINE AGAIN AND PROMPTS USER.
  283.  
  284. CMDERR:    LXI    D,MSYNER    ;SYNTAX ERROR MSG
  285.     CALL    PRTBUF
  286.     JMP    CMD1
  287. ;THIS ROUTINE WILL RELOAD THE SOURCE FILE
  288. ;SO USER CAN START FROM SCRATCH AGAIN.
  289.  
  290. REREAD:    LXI    D,MLOADF    ;LOADING FILE MSG
  291.     CALL    PRTBUF
  292.     XRA    A        ;CLEAR CHGSW
  293.     STA    CHGSW
  294.     STA    FCB1+32        ;SET FCBCR TO '0'
  295.     CALL    RDFILE
  296.     JMP    CMD
  297. ;DISPLAYS THE ENTIRE LIBRARY ON CONSOLE.
  298.  
  299. DSPLIB:    CALL    DCRLF
  300.     LHLD    LIBSTT
  301. DSPLB1:    MVI    C,1
  302. DSPLB2:    MVI    B,32
  303.     MOV    A,M
  304.     CPI    0
  305.     RZ
  306. DSPLB3:    MOV    A,M
  307.     CALL    DISP
  308.     INX    H
  309.     DCR    B
  310.     JNZ    DSPLB3
  311.     DCR    C
  312.     JNZ    DSPLB4
  313.     MVI    A,' '        ;INSERT 2 SPACES
  314.     CALL    DISP
  315.     CALL    DISP
  316.     JMP    DSPLB2
  317. DSPLB4:    CALL    DCRLF
  318.     JMP    DSPLB1
  319. ;SEND ONE CHARACTER TO CONSOLE THRU CP/M FACILITIES.
  320. ;NOTE..IF DPSW+1 IS 'CONOT',CHAR SENT TO CONSOLE.
  321. ;IF DPSW+1 IS 'LIST' THEN CHAR SENT TO LIST DEVICE.
  322. ;DPSW+1 IS SWITCHED TO 'LIST' ON (P)'PRTLIB' CMD.
  323.  
  324. DISP:    PUSH    PSW
  325.     PUSH    B
  326.     PUSH    D
  327.     PUSH    H
  328. DPSW:    MVI    C,CONOT
  329.     MOV    E,A
  330.     CALL    BDOS
  331.     POP    H
  332.     POP    D
  333.     POP    B
  334.     POP    PSW
  335.     RET
  336. ;SEND CR,LF SEQUENCE TO CONSOLE OR LIST DEV.
  337.  
  338. DCRLF:    MVI    A,CR
  339.     CALL    DISP
  340.     MVI    A,LF
  341.     CALL    DISP
  342.     RET
  343. ;DOES A PRINT BUFFER USING CP/M FACILITIES.
  344.  
  345. PRTBUF:    PUSH    PSW
  346.     PUSH    B
  347.     PUSH    D
  348.     PUSH    H
  349.     MVI    C,PRINTB
  350.     CALL    BDOS
  351.     POP    H
  352.     POP    D
  353.     POP    B
  354.     POP    PSW
  355.     RET
  356. ;THIS ROUTINE READS THE CONSOLE BUFFER.
  357. ;READ THE CP/M MANUALS FOR A GOOD DESCRIPTION
  358. ;OF HOW IT WORKS.
  359. ;NOTE THAT THE CONSOLE BUFFER IS STORED AT 'CONLIN',
  360. ;THE SIZE OF THE BUFFER IS STORED AT 'CONSIZ',
  361. ;AND THE MAX LENGTH OF BUFFER IS STORED AT 'CONBUF'.
  362.  
  363. MSUB1:    CALL    PRTBUF
  364. BLNKBF:    LXI    H,CONLIN
  365.     MVI    C,33
  366. BLNKB1:    MVI    M,0
  367.     INX    H
  368.     DCR    C
  369.     JNZ    BLNKB1
  370.     MVI    C,RDCON
  371.     LXI    D,CONBUF
  372.     CALL    BDOS
  373.     LXI    H,0
  374.     LXI    D,CONLIN
  375.     RET
  376. ;THIS ROUTINE TAKES THE ASCII INPUT FROM CONSOLE
  377. ;AND CONVERTS IT TO A FOUR(4) CHAR HEX NUMBER.
  378.  
  379. READC:    LDAX    D
  380.     INX    D
  381.     ORA    A
  382.     RZ
  383.     CPI    60H        ;LOWER CASE ALPHA?
  384.     JC    READC0        ;NO, SKIP ADJUSTMENT
  385.     SUI    20H        ;CONVERT LC ALPHA TO UC
  386. READC0:    DAD    H
  387.     DAD    H
  388.     DAD    H
  389.     DAD    H
  390.     SUI    48
  391.     CPI    10
  392.     JC    READC1
  393.     SUI    7
  394. READC1:    ADD    L
  395.     MOV    L,A
  396.     JMP    READC
  397. ;CKS CONSOLE FOR CHAR AND STORES IT 'A' REG.
  398. CKCONS:    MVI    C,CONIN
  399.     CALL    BDOS
  400.     ANI    7FH    ;STRIP PARITY
  401.     RET
  402. ;'V' CMD BRANCHES HERE.IF ARGUMENT IS '?' THEN
  403. ;PROG GOES TO 'VALL'(DISP ENTIRE LIBRARY).
  404. ;ELSE ONLY ONE LINE IS DISPLAYED PER ARGUMENT.
  405.  
  406. VIEW:    CALL    CKCONS
  407.     CPI    '?'
  408.     JZ    VALL
  409.     ANI    5FH        ;FORCE UPPERCASE
  410.     CALL    CKCHAR
  411.     JC    CMDERR
  412.     CALL    LINSEL
  413.     MVI    B,32
  414.     CALL    DCRLF
  415. VONE1:    MOV    A,M
  416.     CALL    DISP
  417.     INX    H
  418.     DCR    B
  419.     JNZ    VONE1
  420.     JMP    CMD1
  421. VALL:    CALL    DCRLF
  422.     CALL    DSPLIB
  423.     JMP    CMD1
  424. ;DELETES ONE LINE OF THE LIBRARY(DENOTED BY ARGUMENT).
  425.  
  426. DELETE:    CALL    CKCONS
  427.     CPI    3
  428.     JZ    CMD
  429.     ANI    5FH        ;FORCE UPPERCASE
  430.     CALL    CKCHAR
  431.     JC    CMDERR
  432.     CALL    LINSEL
  433.     INX    H
  434.     INX    H
  435.     MVI    B,30
  436.     CALL    DCRLF
  437. DEL1:    MVI    M,' '
  438.     INX    H
  439.     DCR    B
  440.     JNZ    DEL1
  441. DELX:    MVI    A,1
  442.     STA    CHGSW
  443.     JMP    CMD
  444. ;INSERTS ONE LINE INTO LIBRARY(DENOTED BY ARGUMENT)
  445. ;IF A <CR> IS ENTERED AFTER THE 'I' CMD THEN THE
  446. ;INSERT MODE IS ABORTED,ELSE THEN ARGUMENT MUST
  447. ;BE A VALID CHAR 'A' TO 'Z' OR CONSOLE WILL
  448. ;DISPLAY A SYNTAX ERROR AND RETURN TO CMD PROMPT.
  449. ;THE VALID CHAR IS STORED IN 'LINCHR' FOR USE LATER.
  450.  
  451. INS:    CALL    CKCONS
  452.     CPI    CR
  453.     JZ    INEXIT
  454.     ANI    5FH        ;FORCE UPPERCASE
  455.     CALL    CKCHAR
  456.     JC    CMDERR
  457.     STA    LINCHR
  458.     PUSH    PSW
  459.     CALL    DSPLIB
  460.     POP    PSW
  461.     CALL    LINSEL
  462.     INX    H
  463.     INX    H
  464.     PUSH    H
  465. ;'MADDB' IS THE PROMPT LINE FOR INSERTING.
  466.  
  467. INS1:    LXI    D,MADDB
  468.     CALL    PRTBUF
  469.     LDA    LINCHR
  470.     CALL    DISP
  471.     MVI    A,'='
  472.     CALL    DISP
  473.     CALL    BLNKBF
  474.     LXI    D,CONLIN
  475.     LDA    CONSIZ
  476.     ORA    A
  477.     JZ    INEXIT
  478.     CPI    30
  479.     JNZ    INS1
  480.     POP    H
  481.     LXI    D,CONLIN
  482.     MOV    B,A
  483. INS2:    LDAX    D
  484.     MOV    M,A
  485.     INX    D
  486.     INX    H
  487.     DCR    B
  488.     JNZ    INS2
  489.     JMP    DELX
  490. ;PROG COMES HERE IF ABORTING INSERT MODE.
  491.  
  492. INEXIT:    POP    H
  493.     LXI    D,MABINS
  494.     CALL    PRTBUF
  495.     JMP    CMD1
  496. ;CHECKS FOR VALID CHAR 'A' TO 'Z' FROM CONSOLE.
  497. ;WILL RETURN WITH A CARRY IF CHAR NOT VALID.
  498.  
  499. CKCHAR:    CPI    'A'
  500.     RC
  501.     CPI    'Z'+1
  502.     CMC
  503.     RET
  504. ;DISPLAYS START ADDRESS ON CONSOLE.
  505.  
  506. DSPADR:    LHLD    LIBSTT
  507.     MOV    A,H
  508.     CALL    HEXASC
  509.     MOV    A,L
  510.     CALL    HEXASC
  511.     LXI    D,MHEX
  512.     CALL    PRTBUF
  513.     RET
  514. ;CONVERS HEX BINARY NBR TO ASCII AND DISPS ON CONSOLE.
  515.  
  516. HEXASC:    PUSH    PSW
  517.     RRC
  518.     RRC
  519.     RRC
  520.     RRC
  521.     CALL    OUTHEX
  522.     POP    PSW
  523. OUTHEX:    ANI    0FH
  524.     ADI    90H
  525.     DAA
  526.     ACI    40H
  527.     DAA
  528.     CALL    DISP
  529.     RET
  530. ;SELECTS LINE IN LIBRARY AS DENOTED BY A-Z ARGUMENT.
  531.  
  532. LINSEL:    ANI    1FH
  533.     SUI    1
  534.     LXI    D,32
  535.     LXI    H,0
  536.     MVI    B,8
  537. LINSC1:    DAD    H
  538.     RLC
  539.     JNC    LINSC2
  540.     DAD    D
  541. LINSC2:    DCR    B
  542.     JNZ    LINSC1
  543.     XCHG
  544.     LHLD    LIBSTT
  545.     DAD    D
  546.     SHLD    LINSTT
  547.     RET
  548. ;WRITES OUTPUT FILE TO DISK STARTING FROM 'BUF'.
  549. ;THESE ARE STANDARD ROUTINES,NOTHING FANCY HERE.
  550.  
  551. WRTFIL:    LXI    D,FCB2
  552.     MVI    C,MAKEF
  553.     CALL    BDOS
  554.     INR    A
  555.     JNZ    DFOK
  556.     LXI    D,MNOSPC
  557.     CALL    PRTBUF
  558.     JMP    CMD1
  559. DFOK:    LDA    FCB1+15
  560.     LXI    H,BUF
  561. WRTFL1:    PUSH    PSW
  562.     SHLD    DMADD
  563.     PUSH    H
  564.     POP    D
  565.     MVI    C,SETDMA
  566.     CALL    BDOS
  567.     LXI    D,FCB2
  568.     MVI    C,WRITEF
  569.     CALL    BDOS
  570.     ORA    A
  571.     JZ    WRTOK
  572.     POP    PSW
  573.     LXI    D,FCB2
  574.     MVI    C,CLOSEF
  575.     CALL    BDOS
  576.     LXI    D,MDFULL
  577.     JMP    DOEXIT
  578. WRTOK:    POP    PSW
  579.     DCR    A
  580.     ORA    A
  581.     JZ    WRDONE
  582.     LHLD    DMADD
  583.     LXI    D,128
  584.     DAD    D
  585.     JMP    WRTFL1
  586. WRDONE:    LXI    D,FCB2
  587.     MVI    C,CLOSEF
  588.     CALL    BDOS
  589.     LXI    D,MSAVED
  590.     JMP    DOEXIT
  591. ;PROG COMES HERE IF (P)'PRTLIB' CMD CALLED.
  592. ;WHAT IT DOES IS CHANGE 'CONOT' TO 'LIST' AT DPSW+1
  593. ;AND CHANGES BACK TO 'CONOT' AT END OF PRINTOUT.
  594.  
  595. PRTLIB:    MVI    A,LIST
  596.     STA    DPSW+1
  597.     CALL    DSPLIB
  598.     CALL    DCRLF
  599.     MVI    A,CONOT
  600.     STA    DPSW+1
  601.     JMP    CMD1
  602. ;THESE CONTAIN THE EXIT ROUTINES.
  603. ;IF NO INSERT OR DELETE HAS BEEN DONE,THEN 'CHGSW'
  604. ;IS '0' AND THEN PROG EXITS.IF AN INSERT OR DELETE
  605. ;HAS BEEN PERFORMED THEN 'CHGSW' WAS SET TO '1'
  606. ;AND USER IS ASKED IF NEW FILE IS TO BE SAVED.
  607. ;IF USER ANSWERS 'Y' THEN A 'WRTFIL' IS DONE AND
  608. ;PROG IS EXITED.IF ANSWER IS 'N' THEN PROG EXITS
  609. ;WITHOUT WRITING NEW FILE.
  610.  
  611. EXIT:    LDA    CHGSW
  612.     ORA    A
  613.     JZ    DOEXT1
  614. EXIT1:    LXI    D,MCKSAV
  615.     CALL    PRTBUF
  616.     CALL    CKCONS
  617.     ANI    5FH        ;FORCE UPPERCASE
  618.     CPI    'Y'
  619.     JZ    WRTFIL
  620.     CPI    'N'
  621.     JNZ    EXIT1
  622.     JMP    DOEXT1
  623. DOEXIT:    CALL    PRTBUF
  624. DOEXT1:    LXI    D,MEXIT
  625.     CALL    PRTBUF
  626.     JMP    BOOT
  627. ;THE DATA AREA STORES ALL THE MESSAGES,AND ALL THE 
  628. ;OTHER DATA USED BY THE PROG.
  629.  
  630. ;DATA AREA
  631. MPROG:    DB    CR,LF,'CHGLIB PROGRAM..'
  632.     DB    'FOR CHANGING DIAL LIBRARY....'
  633.     DB    CR,LF,'TONY RIBEIRO JAN 1982 $'
  634. MNOSF:    DB    CR,LF,'SOURCE FILE NOT SPECIFIED....$'
  635. MNODF:    DB    CR,LF,'OUTPUT FILE NOT SPECIFIED$'
  636. MUNSF:    DB    CR,LF,'UNABLE TO OPEN SOURCE FILE...$'
  637. MUNDF:    DB    CR,LF,'OUTPUT FILE ALREADY EXISTS....$'
  638. MNOSPC:    DB    CR,LF,'NO DIRECTORY SPACE.......$'
  639. MLOADF:    DB    CR,LF,'LOADING FILE.............$'
  640. MADR:    DB    CR,LF,'DO YOU KNOW STARTING ADDR OF '
  641.     DB    'DIAL LIBRARY? $'
  642. MSRCH:    DB    CR,LF,'DO YOU WISH FOR AUTO SEARCH OF '
  643.     DB    'THE START OF THE DIAL LIBRARY? $'
  644. MEXIT:    DB    CR,LF,'EXITING PROG AND REBOOTING....$'
  645. MDOADR:    DB    CR,LF,'ENTER HEX ADDR(4 CHARS) $'
  646. MDLNF:    DB    CR,LF,'DIAL LIBRARY NOT FOUND IN '
  647.     DB    'FIRST 255 BYTES.....$'
  648. MDLFND:    DB    CR,LF,'DIAL LIBRARY FOUND........$'
  649. MDLOK:    DB    CR,LF,'DOES LIBRARY LOOK RIGHT?$'
  650. MCMD:    DB    CR,LF,'? >(D)ELETE,(I)NSERT,'
  651.     DB    '(P)RINT LIB,(R)EAD,(V)IEW,(W)RITE $'
  652. MSYNER:    DB    CR,LF,'SYNTAX ERROR...............$'
  653. MABINS:    DB    CR,LF,'ABORTING INSERT MODE..NO CHGS$'
  654. MADDB:    DB    CR,LF,'  DESC            1-XXX-XXX-XXXX'
  655.     DB    '< 30 CHARS EXACTLY',CR,LF,'$'
  656. MDFULL:    DB    CR,LF,'DISK FULL...................$'
  657. MSAVED:    DB    CR,LF,'FILE SAVED ON DISK..........$'
  658. MCKSAV:    DB    CR,LF,'WANT TO SAVE NEW FILE (Y/N)? $'
  659. MHEX:    DB    ' HEX $'
  660. DMADD:    DW    0
  661. LIBSTT:    DW    0
  662. LINSTT:    DW    0
  663. CHGSW:    DB    0
  664. PRTSW:    DB    0
  665. SRCLMT:    DB    0
  666. LINCHR:    DB    0
  667. CONBUF:    DB    CONLEN
  668. CONSIZ:    DS    1
  669. CONLIN:    DS    33
  670. CONLEN:    EQU    $-CONSIZ
  671. KPCLR:    DB    0
  672. FCB1:    DS    36
  673. FCB2:    DS    36
  674. STKSPC:    DS    20
  675. STACK:    EQU    $
  676. BUF:    EQU    $
  677.     END
  678.