home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol018 / ucat2.asm < prev    next >
Encoding:
Assembly Source File  |  1984-04-29  |  7.9 KB  |  486 lines

  1. ;MASTER CATALOG UPDATE - UCAT.ASM
  2. ;01/07/78 BY WARD CHRISTENSEN
  3. ;01/10/78 ADD:
  4. ; 01/12/81 W. EARNEST MOD FOR CPM 2.X,
  5. ; ADD USER NR FIELD SUPPORT.
  6. ;        (RUN UCAT)
  7. ;        ERA MAST.BAK
  8. ;        REN MAST.BAK=MAST.CAT
  9. ;        REN MAST.CAT=NEW.CAT
  10. ;        ERA NAMES.SUB
  11.     ORG    100H
  12. BSIZE    EQU    4096    ;DK BUF SIZE (TIMES 3)
  13. IGNSIZE    EQU    1024    ;BUFF FOR IGNORED NAMES
  14. DFCB    EQU    5CH    ;CMD FILE NAME
  15. TEST    EQU    0    ;TESTING?
  16.     MACLIB    SEQIO
  17. FILERR    SET    EXIT    ;EXIT IF ERRORS
  18. MOVE    MACRO    ?F,?T,?L
  19.     MVI    B,?L
  20.     LXI    D,?F
  21.     LXI    H,?T
  22.     CALL    MOVER
  23.     ENDM
  24. COMPARE    MACRO    ?F1,?F2,?L
  25.     MVI    B,?L
  26.     LXI    D,?F1
  27.     LXI    H,?F2
  28.     CALL    COMPR
  29.     ENDM
  30. ;
  31. ;SAVE CP/M'S STACK
  32. ;
  33.     POP    H    ;GET CP/M RET ADDR
  34.     SHLD    EXIT+1    ;SAVE IN EXIT JMP
  35.     LXI    SP,STACK
  36.     FILE    INFILE,MASTIN,,MAST,CAT,BSIZE
  37.     FILE    INFILE,NAMES,,NAMES,SUB,BSIZE
  38.     IF    NOT TEST
  39.     FILE    OUTFILE,MASTOUT,,NEW,CAT,BSIZE
  40.     ENDIF
  41.     FILE    SETFILE,BAK,,MAST,BAK
  42. ;
  43. ;SETUP THE FILES
  44. ;
  45. INITRD    CALL    READNA    ;READ NAMES FILE
  46. ;
  47. ;IF NAME IS $$$.SUB THEN SKIP IT
  48. ;
  49.     COMPARE    NADAT,SUBNAME,12
  50.     JZ    INITRD
  51. ;
  52. ;CHECK FOR '-DISKNAME' HAVING BEEN READ
  53. ;
  54.     LDA    NADAT
  55.     CPI    '-'
  56.     JZ    NAMEOK
  57.     LDA    DFCB+2
  58.     CPI    '-'
  59.     JNZ    NODASH
  60.     LDA    DFCB+10
  61.     CPI    ' '
  62.     JNZ    CMDNAM
  63.     CALL    MSGXIT
  64.     DB    '++SERIAL MUST BE 3 DIGITS$'
  65. CMDNAM    MOVE    DFCB+2,DKNAME,7
  66.     MOVE    DFCB+8,DKNAME+9,3
  67.     JMP    GETIGN
  68. ;
  69. NODASH    CALL    MSGXIT
  70.     DB    '++NO ''-NAME.NNN'' IN NAMES.SUB'
  71.     DB    0DH,0AH
  72.     DB    '++REISSUE: UCAT -NAME.NNN$'
  73. ;
  74. NAMEOK    MOVE    NADAT+1,DKNAME,7
  75.     MOVE    NADAT+9,DKNAME+9,3
  76. ;
  77. ;READ IN THE NAMES TO BE IGNORED (I.E. NOT
  78. ;CATALOGED).  THEY ARE AT THE FRONT OF MAST CAT.
  79. ;THEY ARE SIMPLY A LIST OF FILENAME.FILETYPE (CR/LF)
  80. ;WITH THE FIRST HAVING A ( BEFORE IT, AND THE
  81. ;LAST HAVING A ) AFTER IT.
  82. ;
  83. GETIGN    GET    MASTIN    ;GET THE LEADING '('
  84.     JZ    NOIGN    ;IF EOF
  85.     CPI    '('
  86.     JNZ    NOIGN
  87.     PUT    MASTOUT
  88.     LXI    H,IGNORE ;POINT TO BUFFER
  89.     LXI    B,IGNSIZE ;FOR BUFFER OVERFLOW TEST
  90. IGNRD    PUSH    B
  91.     PUSH    H
  92.     GET    MASTIN
  93.     JZ    IGNEOF    ;UNEXPECTED EOF
  94.     PUSH    PSW    ;SAVE CHAR
  95.     PUT    MASTOUT
  96.     POP    PSW
  97.     POP    H
  98.     POP    B
  99.     MOV    M,A
  100.     INX    H
  101.     CPI    ')'
  102.     JZ    IGNEND    ;TABLE IS LOADED
  103.     DCX    B    ;MORE ROOM IN TABLE?
  104.     MOV    A,B
  105.     ORA    C
  106.     JNZ    IGNRD
  107. ;TABLE OVERFLOW
  108.     CALL    MSGXIT
  109.     DB    '++TOO MANY IGNORE NAMES FOR TABLE$'
  110. NOIGN    CALL    MSGXIT
  111.     DB    '++NO IGNORE NAMES IN MAST.CAT$'
  112. IGNEOF    CALL    MSGXIT
  113.     DB    '++EOF READING FOR IGNORE NAMES.'
  114.     DB    0DH,0AH,'MAY BE MISSING ) AFTER LAST NAME.$'
  115. IGNEND    GET    MASTIN
  116.     JZ    IGNEOF
  117.     PUSH    PSW
  118.     PUT    MASTOUT
  119.     POP    PSW
  120.     CPI    0AH
  121.     JNZ    IGNEND    ;DELETE CR/LF
  122.     JMP    MASTLP    ;LEAVE DISK NR IN PLACE
  123. ;PRIME THE BUFFERS
  124. ;
  125. NAMELP    CALL    READNA    ;READ NAME INTO NADAT
  126. MASTLP    CALL    READMI    ;READ MASTER INTO MIDAT
  127. ;IF EOF ON BOTH FILES, WE ARE ALL DONE
  128. COMPLP    LDA    NAEOFLG    ;NAME FILE EOF?
  129.     ORA    A
  130.     JZ    NOTEOF    ;..NO
  131.     LDA    MIEOFLG    ;MASTER IN EOF?
  132.     ORA    A
  133.     JNZ    ALLDONE    ;YES, THAT'S IT.
  134. NOTEOF    LDA    NADAT
  135.     MOV    B,A
  136.     LDA    MIDAT
  137.     CMP    B
  138.     JNZ    NOTE2    ;CAN'T BE REPLACE
  139.     CPI    '['
  140.     JNZ    NOTE2    ;NOT SPACE LEFT NAME
  141.     COMPARE NADAT+9,MIDAT+9,18 ;JUST CK TYPE
  142.     JMP    NOTE3    ;GO WITH THE FLAGS
  143. ;
  144. NOTE2    COMPARE    NADAT,MIDAT,27
  145. NOTE3    JZ    EQUAL
  146.     JC    WRITEN
  147. ;
  148. ;MASTER IS LOWER - WRITE IT IF FOR ANOTHER DISK
  149. ;
  150.     COMPARE    MIDSK,DKNAME,12 ;SAME DISK?
  151.     JZ    DELMI    ;DELETING MIDAT
  152.     MOVE    MIDAT,MODAT,27
  153.     CALL    WRITEMO
  154.     JMP    MASTLP
  155. ;
  156. ;DELETE MASTER IN
  157. ;
  158. DELMI    LXI    D,DELMSG
  159.     LXI    H,MIDAT
  160.     CALL    MESG
  161.     JMP    MASTLP
  162. DELMSG    DB    'DEL: $'
  163. ;
  164. ;NAME IS LOWER - WRITE IT
  165. ;
  166. WRITEN    MOVE    NADAT,MODAT,27
  167.     CALL    WRITEMO
  168. ;
  169. ;PRINT THAT NAME WAS ADDED
  170. ;
  171.     LXI    D,ADDMSG
  172.     LXI    H,NADAT
  173.     CALL    MESG
  174.     CALL    READNA    ;READ NEXT NAME
  175.     JMP    COMPLP
  176. ADDMSG    DB    'ADD: $'
  177. ;
  178. ;BOTH FILES EQUAL
  179. ;
  180. EQUAL    MOVE    NADAT,MODAT,27
  181.     CALL    WRITEMO    ;WRITE OUT MASTER
  182.     JMP    NAMELP    ;READ BOTH
  183. ;
  184. ;READ NAME FILE
  185. ;
  186. READNA    LXI    H,NADAT
  187.     MVI    B,8
  188.     CALL    READNAC    ;READ CHARACTERS
  189.     MVI    M,'.'
  190.     INX    H
  191.     MVI    B,3    ;TYPE LENGTH
  192.     CALL    READNAC
  193.     MVI    M,','
  194.     LXI    H,DKNAME+12
  195.     MVI    M,';'
  196.     INX    H
  197.     MVI    B,1
  198.     CALL    READNAC
  199. ;
  200. ;IF THIS IS A NAME NOT TO BE CATALOGED,
  201. ;READ THE NEXT
  202. ;
  203.     LXI    D,IGNORE    ;GET IGNORE TABLE
  204. IGNLP    LXI    H,NADAT
  205.     MVI    B,12    ;# OF CHARS TO MATCH
  206. IGNCLP    LDAX    D
  207.     CMP    M
  208.     JZ    IGNMAT    ;MATCHED
  209.     MOV    A,M    ;GET CHAR
  210.     CPI    ' '    ;SPACE?
  211.     JZ    IGNMAT1
  212. ;
  213. ;GET NEXT ENTRY
  214. ;
  215. IGNEXTE    LDAX    D
  216.     INX    D
  217.     CPI    ')'    ;END OF TABLE?
  218.     RZ        ;..YES, RETURN
  219.     CPI    0AH    ;NEXT LINE?
  220.     JNZ    IGNEXTE
  221.     JMP    IGNLP
  222. ;
  223. ;CHAR MATCHED
  224. ;
  225. IGNMAT    INX    D    ;SKIP MATCH CHAR
  226. IGNMAT1    INX    H
  227.     DCR    B
  228.     JNZ    IGNCLP    ;LOOP UNTIL DONE
  229. ;
  230. ;NAME IS TO BE DELETED
  231. ;
  232.     JMP    READNA    ;READ NEXT NAME
  233. ;
  234. ;READ CHARACTERS INTO NAME BUFFER
  235. ;
  236. READNAC    LDA    NAEOFLG    ;EOF ON NAMES?
  237.     ORA    A
  238.     JNZ    NAEOF    ;YES, PAD W/0FFH
  239.     PUSH    H
  240.     PUSH    B
  241. GETNA    GET    NAMES
  242.     CPI    0AH
  243.     JZ    GETNA    ;IGNORE LF
  244.     POP    B
  245.     POP    H
  246.     CPI    '.'    ;END?
  247.     JZ    NAEND
  248.     CPI    ';'
  249.     JZ    NAEND
  250.     CPI    0DH    ;END?
  251.     JZ    NAEND
  252.     CPI    'Z'-40H    ;EOF?
  253.     JZ    NAEOF
  254. NAMOR    MOV    M,A
  255.     INX    H
  256.     DCR    B
  257.     JNZ    READNAC
  258.     PUSH    B
  259.     PUSH    H
  260.     GET    NAMES    ;KILL DELIMITER CHAR
  261.     POP    H
  262.     POP    B
  263.     CPI    'Z'-40H    ;EOF?
  264.     RNZ
  265.     STA    NAEOFLG
  266.     RET
  267. NAEND    MVI    M,' '
  268.     INX    H
  269.     DCR    B
  270.     JNZ    NAEND
  271.     RET
  272. NAEOF    MVI    M,0FFH
  273.     INX    H
  274.     DCR    B
  275.     JNZ    NAEOF
  276.     MVI    A,1
  277.     STA    NAEOFLG
  278.     RET
  279. ;
  280. ;READ MASTER IN NAME
  281. ;
  282. READMI    LXI    H,MIDAT
  283.     CALL    MINAME    ;GET FILE NAME
  284.     MVI    M,','    ;SEPARATOR
  285.     INX    H
  286.     CALL    MINAME    ;GET DISK NAME
  287.     LDA    MASDEL    ;DELIMITER FOUND
  288.     CPI    ';'
  289.     RNZ        ;NO USER NR
  290.     GET    MASTIN
  291.     STA    MIDSK+13
  292.     GET    MASTIN    ;EAT DELIMITER
  293.     RET
  294. ;
  295. ;READ MASTER IN, 1 FIELD
  296. ;
  297. MINAME    MVI    B,8
  298.     CALL    READMIC    ;GET CHARS
  299.     MVI    M,'.'
  300.     INX    H
  301.     MVI    B,3
  302.     CALL    READMIC    ;GET TYPE
  303.     RET
  304. ;
  305. ;READ CHARS INTO MASTER NAME
  306. ;
  307. READMIC    LDA    MIEOFLG
  308.     ORA    A
  309.     JNZ    MIEOF
  310.     PUSH    H
  311.     PUSH    B
  312. GETMI    GET    MASTIN
  313.     CPI    0AH    ;IGNORE LF
  314.     JZ    GETMI    ;L/F'S
  315.     POP    B
  316.     POP    H
  317.     CPI    ','
  318.     JZ    MIEND
  319.     CPI    '.'
  320.     JZ    MIEND
  321.     CPI    ';'
  322.     JZ    MIEND
  323.     CPI    0DH
  324.     JZ    MIEND
  325.     CPI    'Z'-40H    ;EOF?
  326.     JZ    MIEOF
  327.     MOV    M,A
  328.     INX    H
  329.     DCR    B
  330.     JNZ    READMIC
  331.     PUSH    B
  332.     PUSH    H
  333.     GET    MASTIN    ;GET DELIMITER
  334.     STA    MASDEL    ;SAVE IT
  335.     POP    H
  336.     POP    B
  337.     CPI    'Z'-40H    ;EOF?
  338.     RNZ
  339.     STA    MIEOFLG
  340.     RET
  341. MIEND    MVI    M,' '
  342.     INX    H
  343.     DCR    B
  344.     JNZ    MIEND
  345.     STA    MASDEL    ;SAVE DELIMITER
  346.     RET
  347. MIEOF    MVI    M,0FFH
  348.     INX    H
  349.     DCR    B
  350.     JNZ    MIEOF
  351.     STA    MIEOFLG    ;SHOW EOF
  352.     RET
  353. ;
  354. ;WRITE AN ENTRY TO MASTER OUT
  355. ;ALSO BUMP COUNT OF ENTRIES WRITTEN
  356. ;
  357. WRITEMO    LXI    H,COUNT+3
  358. BUMP    MOV    A,M    ;GET COUNT DIGIT
  359.     CPI    ' '
  360.     JNZ    BUMPNB
  361.     MVI    A,'0'
  362. BUMPNB    INR    A
  363.     MOV    M,A
  364.     CPI    '9'+1    ;TIME TO CARRY?
  365.     JNZ    BUMPD    ;..NO, DONE
  366.     MVI    M,'0'
  367.     DCX    H
  368.     JMP    BUMP
  369. BUMPD    LXI    H,MODAT
  370.     MVI    B,27
  371. WRMOL    MOV    A,M
  372.     CPI    ' '    ;NULL CHAR?
  373.     JZ    WRSKIP
  374.     PUSH    B
  375.     PUSH    H
  376.     IF    NOT TEST
  377.     PUT    MASTOUT
  378.     ELSE
  379.     PUT    CON
  380.     ENDIF
  381.     POP    H
  382.     POP    B
  383. WRSKIP    INX    H    ;POINT TO NEXT CHAR
  384.     DCR    B
  385.     JNZ    WRMOL    ;LOOP UNTIL DONE
  386.     MVI    A,0DH
  387.     IF    NOT TEST
  388.     PUT    MASTOUT
  389.     ELSE
  390.     PUT    CON
  391.     ENDIF
  392.     MVI    A,0AH
  393.     IF    NOT TEST
  394.     PUT    MASTOUT
  395.     ELSE
  396.     PUT    CON
  397.     ENDIF
  398.     RET
  399. ;
  400. ;PRINT MESSAGE IN DE, THEN NAME IN HL
  401. ;
  402. MESG    PUSH    H
  403.     MVI    C,@MSG
  404.     CALL    @BDOS
  405.     POP    H
  406.     MVI    B,12    ;NAME + '.' + TYPE
  407. MESGL    PUSH    H
  408.     PUSH    B
  409.     MOV    A,M    ;GET CHAR
  410.     CPI    ' '
  411.     JZ    MESGS    ;SKIP IF ' '
  412.     PUT    CON
  413. MESGS    POP    B
  414.     POP    H
  415.     INX    H
  416.     DCR    B
  417.     JNZ    MESGL
  418.     MVI    A,0DH
  419.     PUT    CON
  420.     MVI    A,0AH
  421.     PUT    CON
  422.     RET
  423. ;
  424. ;MOVE SUBROUTINE (DE)=>(HL), LEN IN (B)
  425. ;
  426. MOVER    LDAX    D
  427.     MOV    M,A
  428.     INX    D
  429.     INX    H
  430.     DCR    B
  431.     JNZ    MOVER
  432.     RET
  433. ;
  434. ;COMPARE ROUTINE (DE)<=>(HL), LENGTH IN B
  435. ;
  436. COMPR    LDAX    D
  437.     CMP    M
  438.     RNZ        ;RET W/NON ZERO SET
  439.     INX    D
  440.     INX    H
  441.     DCR    B
  442.     JNZ    COMPR
  443.     RET        ;ZERO SET, SHOWS =
  444. ;
  445. ;ALL DONE - WRITE EOF TO OUTPUT, RETURN
  446. ;
  447. ALLDONE    EQU    $
  448.     MVI    A,'Z'-40H ;EOF CHAR
  449.     IF    NOT TEST
  450.     PUT    MASTOUT
  451.     FINIS    MASTOUT
  452.     ENDIF
  453. ;
  454. ;RUN WAS SUCCESSFUL - SET FINAL FILE DISPOSITIONS
  455. ;
  456.     ERASE    BAK        ;ERA CAT.BAK
  457.     ERASE    NAMES        ;ERA NAMES.SUB
  458.     RENAME    BAK,MASTIN    ;REN MAST.BAK=MAST.CAT
  459.     RENAME    MASTIN,MASTOUT    ;REN MAST.CAT=MAST.NEW
  460.     CALL    MSGXIT
  461.     DB    'MAST.CAT HAS '
  462. COUNT    DB    '     ENTRIES.$'
  463. ;
  464. MSGXIT    POP    D    ;GET MSG
  465.     MVI    C,@MSG
  466.     CALL    @BDOS
  467. EXIT    JMP    $-$    ;TO CP/M RETURN ADDR
  468.     DS    50    ;STACK SPACE
  469. STACK    EQU    $
  470. NAEOFLG    DB    0    ;NAME FILE EOF FLAG
  471. MIEOFLG    DB    0    ;MASTER IN EOF FLAG
  472. NADAT    DB    'XXXXXXXX.YYY,'
  473. DKNAME    DB    '        .     '
  474. MIDAT    DB    'XXXXXXXX.YYY,'
  475. MIDSK    DB    'XXXXXXXX.YYY;Z'
  476. MODAT    DB    'XXXXXXXX.YYY,XXXXXXXX.YYY;Z'
  477. SUBNAME    DB    '$$$     .SUB'
  478. MASDEL    DB    0
  479. ;NAMES TO BE IGNORED READ IN HERE:
  480. IGNORE    DB    ')'    ;DUMMY END OF TABLE
  481.     DS    IGNSIZE
  482. BUFFERS    EQU    $
  483. MEMSIZE    EQU    BUFFERS+@NXTB
  484. ;
  485.     END
  486.