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 / ZSYS / SIMTEL20 / ZCPR3 / HELPCK.MAC < prev    next >
Text File  |  2000-06-30  |  10KB  |  520 lines

  1. ;
  2. ;  PROGRAM NAME:  HELPCK
  3. ;  AUTHOR:  RICHARD CONN
  4. ;  DATE:  18 MAY 84
  5. ;  VERSION:  1.0
  6. ;  PREVIOUS VERSIONS:  None
  7. ;  DERIVATION:  HELP.MAC 5.0 (18 MAY 84)
  8. ;  NOTE:  FOR USE WITH ZCPR3 ONLY
  9. ;
  10. VERS    EQU    10
  11. Z3ENV    SET    0F400H
  12.  
  13. ;
  14. ;    HELPCK performs a syntax check on HLP files.  Refer
  15. ; to the file HELP.HLP for more details.
  16. ;
  17.  
  18. FALSE        EQU    0
  19. TRUE        EQU    NOT FALSE
  20.  
  21. ;
  22. ; USER EQUATES:
  23. ;  Set this to TRUE if all files must be of type HLP
  24. ;
  25. FORCEHLP        EQU    TRUE     ; TRUE IF FILES MUST BE OF TYPE HLP
  26.  
  27. ;
  28. ;  Address of Help File Buffer (Make Same as HELP.COM Buffer)
  29. ;    Used to Test for Memory Overflow
  30. ;
  31. HLPBUF            EQU    0F00H    ; I GOT THIS BY PEEKING AT MEM
  32.                     ;   AFTER RUNNING HELP ON A FILE
  33.  
  34. ;
  35. ;  SYSLIB ROUTINES
  36. ;
  37.     EXT    Z3INIT,Z3LOG,GETPRT
  38.     EXT    PUTUD,GETUD
  39.     EXT    SCTLFL,SPRINT,SOUT,CAPS,SADC,SHLDC,LOUT,SFN2
  40.     EXT    INITFCB,F$EXIST,F$OPEN,F$READ,F$CLOSE
  41.  
  42. ;
  43. ;  CP/M Constants
  44. ;
  45. UDFLAG        EQU    4    ; ADDRESS OF USER/DISK FLAG
  46. BDOS        EQU    5    ; ADDRESS OF BDOS ENTRY POINT
  47. FCB        EQU    5CH    ; ADDRESS OF FILE CONTROL BLOCK
  48. FCB2        EQU    6CH    ; 2ND FCB
  49. BUFF        EQU    80H    ; ADDRESS OF DMA BUFFER
  50.  
  51. CR        EQU    0DH    ; <CR>
  52. LF        EQU    0AH    ; <LF>
  53. BEL        EQU    'G'-'@'    ; ^G
  54. FF        EQU    'L'-'@'    ; ^L = FORM FEED
  55. CTRLZ        EQU    'Z'-'@'    ; ^Z
  56. CTRLC        EQU    'C'-'@'    ; ^C
  57.  
  58. ;
  59. ;  HELP Control Characters
  60. ;
  61. IHCHAR        EQU    ';'    ; FLAG INDICATING INDEXED BY USER
  62. SECTCHAR    EQU    ':'    ; DEFINED TO BE COLON
  63. PRCHAR        EQU    'P'    ; PRINTER OUTPUT
  64.  
  65. ;
  66. ; Environment Definition
  67. ;
  68.     if    z3env ne 0
  69. ;
  70. ; External ZCPR3 Environment Descriptor
  71. ;
  72.     jmp    start
  73.     db    'Z3ENV'    ;This is a ZCPR3 Utility
  74.     db    1    ;External Environment Descriptor
  75. z3eadr:
  76.     dw    z3env
  77. start:
  78.     lhld    z3eadr    ;pt to ZCPR3 environment
  79. ;
  80.     else
  81. ;
  82. ; Internal ZCPR3 Environment Descriptor
  83. ;
  84.     MACLIB    Z3BASE.LIB
  85.     MACLIB    SYSENV.LIB
  86. z3eadr:
  87.     jmp    start
  88.     SYSENV
  89. start:
  90.     lxi    h,z3eadr    ;pt to ZCPR3 environment
  91.     endif
  92.  
  93. ;
  94. ; Start of Program -- Initialize ZCPR3 Environment
  95. ;
  96.     call    z3init    ;initialize the ZCPR3 Env and the VLIB Env
  97.  
  98.     MVI    A,1    ; SELECT CONSOLE ONLY
  99.     STA    SCTLFL    ; SET SWITCHED OUTPUT FLAG
  100.     LDA    FCB2+1    ; LOOK FOR PRINT OPTION
  101.     CPI    'P'
  102.     JNZ    START1
  103.     MVI    A,81H    ; SELECT CONSOLE AND PRINTER
  104.     STA    SCTLFL
  105.  
  106. START1:
  107.     LDA    BDOS+2    ; BASE PAGE OF BDOS
  108.     SUI    10    ; 2K + 2 PAGES
  109.     STA    TPAEND
  110.  
  111.     XRA    A    ; A=0
  112.     STA    ITYPE    ; SET NON-INDEXED FOR TYPE OF FILE
  113.  
  114.     CALL    PUTUD    ; SAVE HOME
  115.  
  116.     CALL    SPRINT
  117.     DB    'HELPCK  Version '
  118.     db    (vers/10)+'0','.',(vers mod 10)+'0',0
  119.  
  120.     LXI    H,FCB+1    ; CHECK FOR FILE NAME
  121.     MOV    A,M
  122.     CPI    '/'    ; OPTION CAUGHT?
  123.     JZ    STRT0
  124.     CPI    ' '    ; NONE?
  125.     JNZ    STRT1
  126. ;
  127. ;  PRINT HELP MESSAGE
  128. ;
  129. STRT0:
  130.     CALL    SPRINT
  131.     DB    CR,LF,'Syntax:'
  132.     DB    CR,LF,'  HELPCK dir:filename.typ o  <-- Check File'
  133.     DB    CR,LF,'  HELPCK dir:filename     o  <-- Check filename.HLP'
  134.     DB    CR,LF,'Options:'
  135.     DB    CR,LF,'  P = Output to Printer'
  136.     DB    0
  137.     RET
  138.  
  139. ;
  140. ;  BEGIN HELP CHECK PROGRAM
  141. ;
  142. STRT1:
  143. ;
  144. ;  CHECK FOR WILD CARDS IN FILE NAME -- ERROR IF SO
  145. ;
  146.     LXI    H,FCB+1    ; PT TO FIRST BYTE OF FILE NAME
  147.     MVI    B,11    ; 11 BYTES
  148. FCBWCK:
  149.     MOV    A,M    ; GET BYTE
  150.     ANI    7FH    ; MASK
  151.     CPI    '?'    ; WILD?
  152.     JZ    FCBWERR
  153.     INX    H    ; PT TO NEXT
  154.     DCR    B
  155.     JNZ    FCBWCK
  156. ;
  157. ;  CHECK FOR FILE TYPE
  158. ;
  159.     LXI    H,FCB+9    ; CHECK FOR FILE TYPE
  160.  
  161.     IF    NOT FORCEHLP
  162.     MOV    A,M    ; CHECK FOR FILE TYPE SPECIFIED
  163.     CPI    ' '    ; NONE?
  164.     JNZ    STRT2
  165.     ENDIF
  166. ;
  167. ;  PLACE DEFAULT FILE TYPE OF '.HLP' IN FCB
  168. ;
  169.     LXI    D,DEFTYP    ; DEFAULT FILE TYPE
  170.     MVI    B,3
  171.     XCHG
  172.     CALL    MOVE    ; MOVE (HL) TO (DE) FOR (B) BYTES
  173.  
  174. ;
  175. ;  READ IN FILE
  176. ;
  177. STRT2:
  178.     CALL    SPRINT
  179.     DB    '     Help File: ',0
  180.     LXI    D,FCB+1        ; PT TO NAME
  181.     CALL    SFN2
  182.     LXI    D,FCB        ; PT TO FCB
  183.     CALL    Z3LOG        ; LOG INTO DIRECTORY
  184.     CALL    INITFCB        ; RESET FCB
  185.     CALL    F$EXIST        ; IS FILE THERE?
  186.     JNZ    STRT3
  187. ;
  188. ;  FILE NOT FOUND
  189. ;
  190.     CALL    SPRINT
  191.     DB    CR,LF,' File Not Found',0
  192.     RET
  193.  
  194. ;
  195. ;  FILE CONTAINS WILD CARDS
  196. ;
  197. FCBWERR:
  198.     CALL    SPRINT
  199.     DB    CR,LF,' AFN Not Allowed',0
  200.     RET
  201.  
  202. ;
  203. ;  LOAD HELP FILE INFORMATION
  204. ;
  205. STRT3:
  206.     LXI    D,FCB    ; OPEN FILE
  207.     CALL    F$OPEN
  208.     LXI    H,HLPBUF    ; PT TO BUFFER
  209.     SHLD    NEXTADR    ; SET PTR
  210. ;
  211. ;  READ RECORDS UNTIL EOF
  212. ;
  213. STRT4:
  214.     CALL    READ    ; READ INFO
  215.     JZ    STRT4    ; NOT DONE IF ZERO RETURN
  216.     LXI    D,FCB    ; CLOSE FILE
  217.     CALL    F$CLOSE
  218.     CALL    GETUD    ; RESTORE CURRENT DISK AND USER IF CHANGED
  219.  
  220. ;
  221. ;  START OF HELP PROGRAM
  222. ;
  223. HELP:
  224.     MVI    A,1    ; SET NUMBER OF INFO SECTION
  225.     STA    INFONUM
  226.     LXI    H,HLPBUF    ; PT TO FIRST CHAR
  227.     MOV    A,M    ; NO HEADER SECTION?
  228.     ANI    7FH    ; MASK OUT MSB
  229.     CPI    SECTCHAR
  230.     JNZ    HELP1    ; HEADER SECTION EXISTS
  231. ;
  232. ;  CHECK NON-INDEXED HELP FILE
  233. ;
  234.     CALL    SPRINT
  235.     DB    CR,LF,' Help File is Not Indexed',0
  236.     CALL    CKINFO    ; CHECK HELP INFO PTED TO BY HL
  237.     RET
  238. ;
  239. ;  CHECK INDEXED HELP FILE
  240. ;
  241. HELP1:
  242.     STA    ITYPE    ; SET INDEX TYPE
  243.     CPI    IHCHAR    ; INDEXED BY USER?
  244.     JNZ    HELP1A
  245.     CALL    SPRINT
  246.     DB    CR,LF,' Help File is User-Indexed',0
  247.     JMP    HELP1B
  248. HELP1A:
  249.     CALL    SPRINT
  250.     DB    CR,LF,' Help File is Indexed by HELP',0
  251. HELP1B:
  252.     CALL    CKHEADER    ; CHECK HEADER
  253. ;
  254. ;  CHECK INFORMATION SECTIONS OF INDEXED HELP FILE
  255. ;
  256. HELP2:
  257.     CALL    CKINFO    ; CHECK INFO SECTION
  258.     PUSH    PSW    ; SAVE FLAG
  259.     LDA    INFONUM    ; INCREMENT NUMBER OF INFORMATION SECTION
  260.     INR    A
  261.     STA    INFONUM
  262.     POP    PSW
  263.     CPI    CTRLZ    ; DONE?
  264.     JNZ    HELP2
  265.     LDA    ITYPE    ; USER INDEXED?
  266.     CPI    IHCHAR
  267.     JZ    HELP3
  268.     LDA    INFONUM    ; GET COUNT OF INFO SECTIONS
  269.     DCR    A    ; ADJUST TO CORRECT NUMBER
  270.     MOV    B,A    ; SAVE IN B
  271.     CALL    SPRINT
  272.     DB    CR,LF,CR,LF,' Information Section Count is ',0
  273.     LDA    IDXNUM    ; GET NUMBER OF INDEX ENTRIES
  274.     CMP    B
  275.     JZ    HELP2A
  276.     CALL    SPRINT
  277.     DB    'Incorrect',0
  278.     JMP    HELP3
  279. HELP2A:
  280.     CALL    SPRINT
  281.     DB    'Correct',0
  282. HELP3:
  283.     CALL    SPRINT
  284.     DB    CR,LF,' HELPCK Done',CR,LF,0
  285.     LDA    SCTLFL    ; CHECK FOR PRINTER SELECTED
  286.     ANI    80H
  287.     RZ        ; DONE IF NO PRINTER OUTPUT
  288.     CALL    GETPRT    ; GET PRINTER DATA
  289.     INX    H    ; PT TO FF FLAG
  290.     INX    H
  291.     INX    H
  292.     MOV    A,M    ; GET FLAG
  293.     ORA    A    ; 0=NO FF
  294.     RZ
  295.     MVI    A,FF    ; OUTPUT FF
  296.     JMP    LOUT
  297.  
  298. ;
  299. ;  MOVE BYTES PTED TO BY HL TO AREA PTED TO BY DE; B BYTES TO MOVE
  300. ;
  301. MOVE:
  302.     MOV    A,M    ; GET BYTE
  303.     ANI    7FH    ; MASK OFF MSB -- IN CASE A WS FILE
  304.     STAX    D    ; PUT BYTE
  305.     INX    H    ; PT TO NEXT
  306.     INX    D
  307.     DCR    B
  308.     JNZ    MOVE
  309.     RET
  310.  
  311. ;
  312. ;  READ RECORD FROM DISK; NEXTADR CONTAINS ADDRESS TO READ TO
  313. ;    ON RETURN, BDOS ERROR CODE IS IN A (0=NO ERROR)
  314. ;
  315. READ:
  316.     LXI    D,FCB    ; PT TO FCB
  317.     CALL    F$READ    ; READ NEXT RECORD
  318.     PUSH    PSW    ; SAVE RETURN CODE
  319.     LHLD    NEXTADR    ; PT TO LOAD ADDRESS
  320.     LDA    TPAEND    ; CHECK AGAINST END PAGE OF TPA
  321.     CMP    H    ; IF AT SAME PAGE, YES
  322.     JZ    READERROR
  323.     LXI    D,BUFF    ; PT TO BUFFER TO LOAD FROM
  324.     MVI    B,128    ; NUMBER OF BYTES TO MOVE
  325.     XCHG
  326.     CALL    MOVE
  327.     XCHG
  328.     MVI    M,CTRLZ    ; STORE ENDING CTRLZ IN CASE OF EOF
  329.     POP    PSW    ; GET RETURN CODE
  330.     ORA    A    ; DONE?  <>0 IF SO
  331. ;
  332. ;  READ DONE -- SAVE PTR TO NEXT BLOCK
  333. ;
  334.     SHLD    NEXTADR    ; SET NEXT ADDRESS
  335.     RET
  336.  
  337. READERROR:
  338.     POP    PSW    ; CLEAR PSW
  339.     POP    PSW    ; CLEAR RET ADR
  340.     CALL    SPRINT
  341.     DB    CR,LF,' Memory Full',0
  342.     RET
  343.  
  344. ;
  345. ;  CHECK HEADER
  346. ;
  347. CKHEADER:
  348.     MVI    A,0    ; SET LINE COUNT
  349.     STA    IDXNUM
  350. CKH1:
  351.     MOV    A,M    ; CHECK FOR DONE
  352.     CPI    SECTCHAR    ; DONE?
  353.     JZ    CKH2
  354.     CPI    CTRLZ    ; EOF?
  355.     JZ    CKH3
  356.     CALL    SKPLINE    ; SKIP TO NEXT LINE
  357.     LDA    IDXNUM    ; INCREMENT LINE COUNT
  358.     INR    A
  359.     STA    IDXNUM
  360.     JMP    CKH1
  361. CKH2:
  362.     CALL    SPRINT
  363.     DB    CR,LF,' Lines in Header: ',0
  364.     LDA    IDXNUM    ; GET COUNT
  365.     CALL    SADC
  366.     RET
  367. CKH3:
  368.     CALL    SPRINT
  369.     DB    CR,LF,' Premature EOF at Header',0
  370.     RET
  371.  
  372. ;
  373. ;  CHECK INFORMATION SECTION PTED TO BY HL
  374. ;
  375. CKINFO:
  376.     CALL    SPRINT
  377.     DB    CR,LF,CR,LF,' Information Section ',0
  378.     LDA    INFONUM    ; GET NUMBER OF INFO SECTION
  379.     CALL    SADC    ; PRINT IT
  380.     MOV    A,M    ; CHECK FOR VALID SECTION CHAR
  381.     ANI    7FH
  382.     CPI    SECTCHAR
  383.     JZ    CKINFO1
  384.     CALL    SPRINT
  385.     DB    CR,LF,'  Info Section Does Not Begin with :',0
  386. CKINFO1:
  387.     INX    H    ; PT TO FIRST CHAR
  388.     LDA    ITYPE    ; TYPE OF INFO SECTION
  389.     CPI    IHCHAR    ; USER-INDEXED?
  390.     JZ    CKINFO2
  391.     MOV    A,M    ; CHECK FOR EXTERNAL FILE REFERENCE
  392.     CPI    SECTCHAR
  393.     JNZ    CKINFO1C
  394.     INX    H    ; PT TO FIRST CHAR OF FILE NAME
  395. CKIHF:
  396.     CALL    SPRINT
  397.     DB    CR,LF,'  External Help File: ',0
  398.     PUSH    H    ; SAVE HL
  399. CKINFO1A:
  400.     MOV    A,M    ; GET CHAR
  401.     INX    H    ; PT TO NEXT
  402.     ANI    7FH
  403.     CALL    CAPS
  404.     CPI    ' '+1    ; CHECK FOR RANGE
  405.     JC    CKINFO1B
  406.     CALL    SOUT    ; PRINT CHAR
  407.     JMP    CKINFO1A
  408. CKINFO1B:
  409.     POP    H    ; RESTORE HL
  410.     CALL    SKPLINE    ; SKIP TO EOL
  411.     JMP    CKINFO3
  412. CKINFO1C:
  413.     CALL    SKPLINE    ; SKIP TO EOL
  414.     CALL    EMPCK    ; CHECK FOR EMPTY
  415.     JMP    CKINFO3
  416. CKINFO2:
  417.     CALL    SPRINT
  418.     DB    CR,LF,'  User Indices: ',0
  419. CKI2A:
  420.     MOV    A,M    ; GET CHAR
  421.     ANI    7FH
  422.     INX    H    ; PT TO NEXT
  423.     CPI    SECTCHAR    ; EXTERNAL HELP FILE?
  424.     JZ    CKIHF
  425.     CPI    LF
  426.     JZ    CKI2C
  427.     CPI    ' '
  428.     JZ    CKI2A
  429.     CPI    CR
  430.     JZ    CKI2B
  431.     CALL    CAPS    ; CAPITALIZE
  432.     CALL    SOUT    ; PRINT INDEX
  433.     MVI    A,' '    ; FOLLOWING SPACE
  434.     CALL    SOUT
  435.     JMP    CKI2A
  436. CKI2B:
  437.     MOV    A,M    ; CHECK FOR LF
  438.     ANI    7FH
  439.     CPI    LF
  440.     JZ    CKI2C
  441.     INX    H    ; SKIP LF
  442. CKI2C:
  443.     CALL    EMPCK    ; CHECK FOR EMPTY
  444. CKINFO3:
  445.     PUSH    H
  446.     LXI    H,1    ; SET LINE COUNTER
  447.     SHLD    LCOUNT
  448.     POP    H
  449. CKINFO4:
  450.     MOV    A,M    ; CHECK FOR NEW INFO SECTION
  451.     CPI    SECTCHAR
  452.     JZ    CKISUM
  453.     CPI    CTRLZ    ; EOF?
  454.     JZ    CKISUM
  455.     CALL    SKPLINE    ; SKIP TO NEXT LINE
  456.     PUSH    H    ; INCREMENT LINE COUNT
  457.     LHLD    LCOUNT
  458.     INX    H
  459.     SHLD    LCOUNT
  460.     POP    H
  461.     JMP    CKINFO4
  462. CKISUM:
  463.     PUSH    H
  464.     CALL    SPRINT
  465.     DB    CR,LF,'  Number of Lines: ',0
  466.     LHLD    LCOUNT
  467.     CALL    SHLDC
  468.     POP    H
  469.     RET
  470.  
  471. ;
  472. ;  CHECK TO SEE IF AT EOF OR INFO SECTION AND PRINT EMPTY MESSAGE IF SO
  473. ;
  474. EMPCK:
  475.     MOV    A,M    ; GET CHAR
  476.     ANI    7FH
  477.     CPI    CTRLZ    ; EOF?
  478.     JZ    EMPCK1
  479.     CPI    SECTCHAR
  480.     RNZ
  481. EMPCK1:
  482.     CALL    SPRINT
  483.     DB    CR,LF,'  Information Section is Empty',0
  484.     RET
  485.  
  486. ;
  487. ;  SKIP TO END OF CURRENT LINE
  488. ;
  489. SKPLINE:
  490.     MOV    A,M    ; GET CHAR
  491.     ANI    7FH    ; MASK
  492.     CPI    CTRLZ    ; EOF?
  493.     RZ
  494.     INX    H    ; PT TO NEXT
  495.     CPI    LF
  496.     RZ
  497.     JMP    SKPLINE
  498.  
  499. ;
  500. ;  BUFFER SECTION
  501. ;
  502. DEFTYP:
  503.     DB    'HLP'    ; DEFAULT TYPE OF HELP FILE
  504. ITYPE:
  505.     DS    1    ; TYPE OF HELP FILE (IF = IHCHAR, IT IS INDEXED BY USR)
  506. TPAEND:
  507.     DS    1    ; END PAGE ADDRESS OF TPA
  508. LCOUNT:
  509.     DS    2    ; LINE COUNTER
  510. INFONUM:
  511.     DS    1    ; INFORMATION SECTION NUMBER
  512. IDXNUM:
  513.     DS    1    ; INDEX NUMBER
  514. FIRSTENTRY:
  515.     DS    2    ; PTR TO FIRST ENTRY OF INFORMATION SECTION
  516. NEXTADR:
  517.     DS    2    ; NEXT LOAD ADDRESS
  518.  
  519.     END
  520.