home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol041 / ucat.asm < prev    next >
Assembly Source File  |  1984-04-29  |  8KB  |  485 lines

  1. ;MASTER CATALOG UPDATE - UCAT.ASM
  2. ;01/07/78 BY WARD CHRISTENSEN
  3. ;01/10/78 ADD:
  4. ;        (RUN UCAT)
  5. ;        ERA MAST.BAK
  6. ;        REN MAST.BAK=MAST.CAT
  7. ;        REN MAST.CAT=NEW.CAT
  8. ;        ERA NAMES.SUB
  9. ; 4 Sept 80 modified by Trevor Marshall
  10. ;            Uni W A
  11. ;            Dept Elec Eng
  12. ;  Updates on TUG discs added,
  13. ;  Wildcard ignore capability
  14.     ORG    100H
  15. BSIZE    EQU    1400H    ;DK BUF SIZE (TIMES 3)
  16. ; BSIZE was 1000H originally
  17. IGNSIZE    EQU    1024    ;BUFF FOR IGNORED NAMES
  18. TEST    EQU    0    ;TESTING?
  19.     MACLIB    SEQIO
  20. FILERR    SET    EXIT    ;EXIT IF ERRORS
  21. MOVE    MACRO    ?F,?T,?L
  22.     MVI    B,?L
  23.     LXI    D,?F
  24.     LXI    H,?T
  25.     CALL    MOVER
  26.     ENDM
  27. COMPARE    MACRO    ?F1,?F2,?L
  28.     MVI    B,?L
  29.     LXI    D,?F1
  30.     LXI    H,?F2
  31.     CALL    COMPR
  32.     ENDM
  33. ;
  34. ;SAVE CP/M'S STACK
  35. ;
  36.     POP    H    ;GET CP/M RET ADDR
  37.     SHLD    EXIT+1    ;SAVE IN EXIT JMP
  38.     LXI    SP,STACK
  39.     FILE    INFILE,MASTIN,,MAST,CAT,BSIZE
  40.     FILE    INFILE,NAMES,,NAMES,SUB,BSIZE
  41.     IF    NOT TEST
  42.     FILE    OUTFILE,MASTOUT,,NEW,CAT,BSIZE
  43.     ENDIF
  44.     FILE    SETFILE,BAK,,MAST,BAK
  45. ;
  46. ;SETUP THE FILES
  47. ;
  48. INITRD    CALL    READNA    ;READ NAMES FILE
  49. ;
  50. ;IF NAME IS $$$.SUB THEN SKIP IT
  51. ;
  52.     COMPARE    NADAT,SUBNAME,12
  53.     JZ    INITRD
  54. ;
  55. ;CHECK FOR '-DISKNAME' HAVING BEEN READ
  56. ;
  57.     LDA    NADAT
  58.     CPI    '-'
  59.     JZ    NAMEOK
  60. ;The following code is patched via disassembly
  61.     LDA    5DH
  62.     CPI    '-'
  63.     JNZ    ERRXIT
  64.     LDA    67H
  65.     CPI    ' '
  66.     JNZ    NEWSUB
  67.     CALL    MSGXIT
  68.     DB    '++SERIAL MUST'
  69.     DB    ' BE 3 DIGITS$'
  70. ;
  71. NEWSUB    MVI    B,7
  72.     LXI    D,5EH
  73.     LXI    H,DKNAME
  74.     CALL    MOVER
  75.     MVI    B,3
  76.     LXI    D,65H
  77.     LXI    H,NEW
  78.     CALL    MOVER
  79.     JMP    NXT1
  80. ;
  81. ERRXIT    CALL    MSGXIT
  82.     DB    '++NO "-NAME.NNN" IN NAMES.SUB'
  83.     DB    0DH,0AH,'++REISSUE: UCAT '
  84.     DB    '-name.nnn$'
  85. ;    CALL    MSGXIT
  86. ;    DB    '++NO ''-NAME'' IN DIRECTORY$'
  87. ;
  88. NAMEOK    MOVE    NADAT+1,DKNAME,7
  89.     MOVE    NADAT+9,DKNAME+9,3
  90. ;
  91. ;READ IN THE NAMES TO BE IGNORED (I.E. NOT
  92. ;CATALOGED).  THEY ARE AT THE FRONT OF MAST CAT.
  93. ;THEY ARE SIMPLY A LIST OF FILENAME.FILETYPE (CR/LF)
  94. ;WITH THE FIRST HAVING A ( BEFORE IT, AND THE
  95. ;LAST HAVING A ) AFTER IT.
  96. ;
  97. NXT1    GET    MASTIN    ;GET THE LEADING '('
  98.     JZ    NOIGN    ;IF EOF
  99.     CPI    '('
  100.     JNZ    NOIGN
  101.     PUT    MASTOUT
  102.     LXI    H,IGNORE ;POINT TO BUFFER
  103.     LXI    B,IGNSIZE ;FOR BUFFER OVERFLOW TEST
  104. IGNRD    PUSH    B
  105.     PUSH    H
  106.     GET    MASTIN
  107.     JZ    IGNEOF    ;UNEXPECTED EOF
  108.     PUSH    PSW    ;SAVE CHAR
  109.     PUT    MASTOUT
  110.     POP    PSW
  111.     POP    H
  112.     POP    B
  113.     MOV    M,A
  114.     INX    H
  115.     CPI    ')'
  116.     JZ    IGNEND    ;TABLE IS LOADED
  117.     DCX    B    ;MORE ROOM IN TABLE?
  118.     MOV    A,B
  119.     ORA    C
  120.     JNZ    IGNRD
  121. ;TABLE OVERFLOW
  122.     CALL    MSGXIT
  123.     DB    '++TOO MANY IGNORE NAMES FOR TABLE$'
  124. NOIGN    CALL    MSGXIT
  125.     DB    '++NO IGNORE NAMES IN MAST.CAT$'
  126. IGNEOF    CALL    MSGXIT
  127.     DB    '++EOF READING FOR IGNORE NAMES.'
  128.     DB    0DH,0AH,'MAY BE MISSING ) AFTER LAST NAME.$'
  129. IGNEND    GET    MASTIN
  130.     JZ    IGNEOF
  131.     PUSH    PSW
  132.     PUT    MASTOUT
  133.     POP    PSW
  134.     CPI    0AH
  135.     JNZ    IGNEND    ;DELETE CR/LF
  136.     JMP    MASTLP
  137. ;PRIME THE BUFFERS
  138. ;
  139. NAMELP    CALL    READNA    ;READ NAME INTO NADAT
  140. MASTLP    CALL    READMI    ;READ MASTER INTO MIDAT
  141. ;IF EOF ON BOTH FILES, WE ARE ALL DONE
  142. COMPLP    LDA    NAEOFLG    ;NAME FILE EOF?
  143.     ORA    A
  144.     JZ    NOTEOF    ;..NO
  145.     LDA    MIEOFLG    ;MASTER IN EOF?
  146.     ORA    A
  147.     JNZ    ALLDONE    ;YES, THAT'S IT.
  148. NOTEOF    COMPARE    NADAT,MIDAT,25
  149.     JZ    EQUAL
  150.     JC    WRITEN
  151. ;
  152. ;MASTER IS LOWER - WRITE IT IF FOR ANOTHER DISK
  153. ;
  154.     COMPARE    MIDSK,DKNAME,12 ;SAME DISK?
  155.     JZ    DELMI    ;DELETING MIDAT
  156.     MOVE    MIDAT,MODAT,25
  157.     CALL    WRITEMO
  158.     JMP    MASTLP
  159. ;
  160. ;DELETE MASTER IN
  161. ;
  162. DELMI    LXI    D,DELMSG
  163.     LXI    H,MIDAT
  164.     CALL    MESG
  165.     JMP    MASTLP
  166. DELMSG    DB    'DEL: $'
  167. ;
  168. ;NAME IS LOWER - WRITE IT
  169. ;
  170. WRITEN    MOVE    NADAT,MODAT,25
  171.     CALL    WRITEMO
  172. ;
  173. ;PRINT THAT NAME WAS ADDED
  174. ;
  175.     LXI    D,ADDMSG
  176.     LXI    H,NADAT
  177.     CALL    MESG
  178.     CALL    READNA    ;READ NEXT NAME
  179.     JMP    COMPLP
  180. ADDMSG    DB    'ADD: $'
  181. ;
  182. ;BOTH FILES EQUAL
  183. ;
  184. EQUAL    MOVE    MIDAT,MODAT,25
  185.     CALL    WRITEMO    ;WRITE OUT MASTER
  186.     JMP    NAMELP    ;READ BOTH
  187. ;
  188. ;READ NAME FILE
  189. ;
  190. READNA    LXI    H,NADAT
  191.     MVI    B,8
  192.     CALL    READNAC    ;READ CHARACTERS
  193.     MVI    M,'.'
  194.     INX    H
  195.     MVI    B,3    ;TYPE LENGTH
  196.     CALL    READNAC
  197.     MVI    M,','
  198. ;
  199. ;IF THIS IS A NAME NOT TO BE CATALOGED,
  200. ;READ THE NEXT
  201. ;
  202.     LXI    D,IGNORE    ;GET IGNORE TABLE
  203. IGNLP    LXI    H,NADAT
  204.     MVI    B,12    ;# OF CHARS TO MATCH
  205. IGNCLP    LDAX    D    ;Get ignore char into A
  206.     CPI    '?'    ;Is it wildcard?
  207.     JZ    IGNMAT    ;If so, consider matched
  208.     CMP    M    ;Is it the same?
  209.     JZ    IGNMAT    ;Yes, MATCHED
  210.     MOV    A,M    ;GET CHAR
  211.     CPI    ' '    ;SPACE?
  212.     JZ    IGNMAT1    ;Match not necessary
  213. ; The previous code failed with an FCB of the form DUMMY
  214. ; (w/o .ext), as the blanks were not required to
  215. ; match in the extension
  216. ; FIX: ensure that if the blank skip path is followed
  217. ;      that the character count is not 9
  218. ;
  219. ;GET NEXT ENTRY
  220. ;
  221. IGNEXTE    LDAX    D
  222.     INX    D
  223.     CPI    ')'    ;END OF TABLE?
  224.     RZ        ;..YES, RETURN
  225.     CPI    0AH    ;NEXT LINE?
  226.     JNZ    IGNEXTE
  227.     JMP    IGNLP
  228. ;
  229. ;CHAR MATCHED
  230. ;
  231. IGNMAT    INX    D    ;SKIP MATCH CHAR
  232. IGNMAT2    INX    H
  233.     DCR    B
  234.     JNZ    IGNCLP    ;LOOP UNTIL DONE
  235. ;
  236. ;NAME IS TO BE DELETED
  237. ;
  238.     JMP    READNA    ;READ NEXT NAME
  239. ;
  240. ; Check if character count is 9 ( .Ext)
  241. IGNMAT1    MOV    A,B    ;Fetch count
  242.     CPI    3
  243.     JZ    IGNEXTE ;If 9, dont skip
  244.     JMP    IGNMAT2
  245. ;
  246. ;READ CHARACTERS INTO NAME BUFFER
  247. ;
  248. READNAC    LDA    NAEOFLG    ;EOF ON NAMES?
  249.     ORA    A
  250.     JNZ    NAEOF    ;YES, PAD W/0FFH
  251.     PUSH    H
  252.     PUSH    B
  253. GETNA    GET    NAMES
  254.     CPI    0AH
  255.     JZ    GETNA    ;IGNORE LF
  256.     POP    B
  257.     POP    H
  258.     CPI    '.'    ;END?
  259.     JZ    NAEND
  260.     CPI    0DH    ;END?
  261.     JZ    NAEND
  262.     CPI    'Z'-40H    ;EOF?
  263.     JZ    NAEOF
  264.     MOV    M,A
  265.     INX    H
  266.     DCR    B
  267.     JNZ    READNAC
  268.     PUSH    B
  269.     PUSH    H
  270.     GET    NAMES    ;KILL DELIMITER CHAR
  271.     POP    H
  272.     POP    B
  273.     CPI    'Z'-40H    ;EOF?
  274.     RNZ
  275.     STA    NAEOFLG
  276.     RET
  277. NAEND    MVI    M,' '
  278.     INX    H
  279.     DCR    B
  280.     JNZ    NAEND
  281.     RET
  282. NAEOF    MVI    M,0FFH
  283.     INX    H
  284.     DCR    B
  285.     JNZ    NAEOF
  286.     MVI    A,1
  287.     STA    NAEOFLG
  288.     RET
  289. ;
  290. ;READ MASTER IN NAME
  291. ;
  292. READMI    LXI    H,MIDAT
  293.     CALL    MINAME    ;GET FILE NAME
  294.     MVI    M,','    ;SEPARATOR
  295.     INX    H
  296.     CALL    MINAME    ;GET DISK NAME
  297.     RET
  298. ;
  299. ;READ MASTER IN, 1 FIELD
  300. ;
  301. MINAME    MVI    B,8
  302.     CALL    READMIC    ;GET CHARS
  303.     MVI    M,'.'
  304.     INX    H
  305.     MVI    B,3
  306.     CALL    READMIC    ;GET TYPE
  307.     RET
  308. ;
  309. ;READ CHARS INTO MASTER NAME
  310. ;
  311. READMIC    LDA    MIEOFLG
  312.     ORA    A
  313.     JNZ    MIEOF
  314.     PUSH    H
  315.     PUSH    B
  316. GETMI    GET    MASTIN
  317.     CPI    0AH    ;IGNORE LF
  318.     JZ    GETMI    ;L/F'S
  319.     POP    B
  320.     POP    H
  321.     CPI    ','
  322.     JZ    MIEND
  323.     CPI    '.'
  324.     JZ    MIEND
  325.     CPI    0DH
  326.     JZ    MIEND
  327.     CPI    'Z'-40H    ;EOF?
  328.     JZ    MIEOF
  329.     MOV    M,A
  330.     INX    H
  331.     DCR    B
  332.     JNZ    READMIC
  333.     PUSH    B
  334.     PUSH    H
  335.     GET    MASTIN    ;GET DELIMITER
  336.     POP    H
  337.     POP    B
  338.     CPI    'Z'-40H    ;EOF?
  339.     RNZ
  340.     STA    MIEOFLG
  341.     RET
  342. MIEND    MVI    M,' '
  343.     INX    H
  344.     DCR    B
  345.     JNZ    MIEND
  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,25
  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    32H    ;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. DKNAME    DB    '        .'
  475. NEW    DB    '   '
  476. MIDAT    DB    'XXXXXXXX.YYY,'
  477. MIDSK    DB    'XXXXXXXX.YYY'
  478. MODAT    DB    'XXXXXXXX.YYY,XXXXXXXX.YYY'
  479. SUBNAME    DB    '$$$     .SUB'
  480. ;NAMES TO BE IGNORED READ IN HERE:
  481. IGNORE    DB    ')'    ;DUMMY END OF TABLE
  482.     DS    IGNSIZE
  483. BUFFERS    EQU    $
  484. MEMSIZE    EQU    BUFFERS+@NXTB
  485.