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