home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / sigmv013.ark / PHELP.MAC < prev    next >
Text File  |  1984-04-29  |  6KB  |  293 lines

  1. ;  PROGRAM:  PHELP
  2. ;  AUTHOR:  RICHARD CONN
  3. ;  VERSION:  1.2 (12 JULY 1980)
  4. ;  PREVIOUS VERSIONS:  1.1 (8 JUNE 1980), 1.0 (5 JUNE 1980)
  5.  
  6. ;
  7. ;  PHELP -- Print contents of .HLP file on printer.  The format
  8. ;    of this command is --
  9. ;        PHELP filename header
  10. ;    where 'filename' is the name of the file 'filename.HLP' on the currently-
  11. ;    logged in disk.  The printed listing produced by this command is numbered
  12. ;    with the name of the help file and header at the top of each page.
  13. ;
  14.  
  15. ;  External References --
  16.     EXT    EN    ; EXCHANGE NYBBLES OF A
  17.     EXT    LOUT    ; LIST OUTPUT
  18.     EXT    PRINT    ; STRING PRINT ROUTINE
  19.     EXT    CONDIN    ; CONDITIONAL INPUT
  20.     EXT    CRLF    ; NEW LINE
  21.     EXT    CIN    ; CONSOLE INPUT
  22.     EXT    FI$OPEN    ; FILE OPEN
  23.     EXT    F$GET    ; GET
  24.  
  25. ;  CP/M and other miscellaneous equates
  26. CPM    EQU    0    ; CP/M WARM BOOT
  27. BUFF    EQU    80H    ; INPUT LINE BUFFER
  28. FCB    EQU    5CH    ; CP/M FCB
  29. FCBTY    EQU    FCB+9    ; CP/M FILE TYPE IN FCB
  30. TAB    EQU    9    ; <TAB>
  31. LF    EQU    0AH    ; <LF>
  32. FF    EQU    0CH    ; <FF>
  33. CR    EQU    0DH    ; <CR>
  34. ESC    EQU    1BH    ; <ESC>
  35. CTRLC    EQU    'C'-40H    ; CTRL-C
  36. EOF    EQU    'Z'-40H    ; CTRL-Z = EOF
  37. COLON    EQU    ':'    ; COLON CHARACTER
  38.  
  39. ;  NUMBER OF LINES PER PAGE
  40. LPG    EQU    51    ; 51 LINES PER PAGE
  41. TPG    EQU    40    ; 40 LINES OF TEXT PER PAGE
  42.  
  43. START:
  44. ;
  45. ;  EXTRACT HEADER FROM COMMAND LINE
  46. ;
  47.     LXI    H,BUFF    ; GET INPUT LINE
  48.     PUSH    H    ; SAVE PTR
  49.     MOV    A,M    ; GET BYTE COUNT
  50.     ADD    L    ; PT TO EOL
  51.     MOV    L,A
  52.     INR    L    ; HL PT TO EOL
  53.     MVI    M,0    ; LINE TERMINATED BY ZERO
  54.     LXI    D,HBUF    ; PT TO HEADER BUFFER
  55.     POP    H    ; GET PTR TO HEADER
  56.     INX    H    ; PT TO 1ST CHAR
  57. HEADING:
  58.     MOV    A,M    ; GET BYTE OF HEADER
  59.     STAX    D    ; PLACE IN HEADER BUFFER
  60.     INX    H    ; PT TO NEXT CHAR
  61.     INX    D
  62.     ORA    A    ; DONE IF ZERO
  63.     JNZ    HEADING
  64.  
  65. ;
  66. ;  PLACE DEFAULT FILE TYPE IN FCB
  67. ;
  68.     LXI    H,FTYPE    ; PT TO FILE TYPE
  69.     LXI    D,FCBTY    ; PT TO FCB ENTRY
  70.     MVI    B,3    ; 3 BYTES
  71. MTYPE:
  72.     MOV    A,M    ; GET BYTE
  73.     STAX    D    ; PUT BYTE
  74.     INX    H    ; PT TO NEXT
  75.     INX    D
  76.     DCR    B    ; COUNT DOWN
  77.     JNZ    MTYPE
  78. ;
  79. ;  OPEN FILE FOR INPUT
  80. ;    AUTOMATIC ABORT TO CP/M IF ERROR
  81. ;
  82.     LXI    D,FCB    ; PT TO FCB
  83.     CALL    FI$OPEN    ; OPEN FILE FOR INPUT
  84.  
  85. ;
  86. ;  PRINT OPENING MESSAGE AND OPTIONALLY ABORT
  87. ;
  88.     CALL    PRINT
  89.     DB    'PHELP Version 1.2'
  90.     DB    CR,LF
  91.     DB    '  Please set Top of Form'
  92.     DB    CR,LF
  93.     DB    '  Type Ctrl-C or <ESC> to abort or anything else to cont - ',0
  94.     CALL    CIN    ; GET INPUT
  95.     CPI    ESC
  96.     JZ    ABORT
  97.     CPI    CTRLC
  98.     JZ    ABORT
  99.     CALL    CRLF    ; NEW LINE
  100. ;
  101. ;  SET PAGE NUMBER, LINE COUNT, AND PRINT HEADER
  102. ;
  103.     XRA    A    ; A=0
  104.     STA    PNUM    ; SET PAGE NUMBER TO ZERO
  105.     STA    CCNT    ; SET CHAR COUNT IN LINE
  106.     MVI    A,TPG    ; SET LINES OF TEXT PER PAGE
  107.     STA    LINES    ; SET LINE COUNT
  108.     CALL    PHDR    ; PRINT HEADER
  109. ;
  110. ;  GET FIRST CHAR -- SPECIAL CASE
  111. ;
  112.     CALL    F$GET
  113.     JC    DONE    ; DONE IF CARRY
  114.     ANI    7FH    ; MASK MSB
  115. ;
  116. ;  MAIN LOOP -- PRINT CHAR IN A, GET NEXT CHAR, AND PROCESS
  117. ;
  118. PHELP:
  119.     CPI    TAB    ; <TAB>?
  120.     JZ    SPTAB
  121.     CPI    FF    ; <FF>?
  122.     JZ    GETCH
  123.     CALL    LOUT    ; SEND TO LIST DEVICE
  124.     LDA    CCNT    ; INCR CHAR CNT
  125.     INR    A
  126.     STA    CCNT
  127. ;
  128. ;  GET NEXT CHAR
  129. ;
  130. GETCH:
  131.     CALL    CONDIN    ; CHECK FOR INTERRUPT
  132.     JZ    GETCH1    ; CONTINUE IF NO CHAR
  133.     CPI    ESC    ; ABORT IF <ESC>
  134.     JZ    ABORT
  135.     CPI    CTRLC    ; ABORT IF CTRL-C
  136.     JNZ    GETCH1
  137. ;  INTERRUPT -- ABORT
  138. ABORT:
  139.     CALL    EJECT    ; EJECT PAGE
  140.     CALL    PRINT    ; PRINT ABORT MESSAGE ON CON:
  141.     DB    CR,LF,'PHELP Aborted -- Returning to CP/M',0
  142.     JMP    CPM    ; WARM BOOT
  143. ;  GET NEXT CHAR
  144. GETCH1:
  145.     CALL    F$GET    ; GET CHAR
  146.     JC    DONE    ; DONE IF CARRY
  147.     ANI    7FH    ; MASK MSB
  148.     CPI    EOF    ; DONE?
  149.     JZ    DONE
  150.     CPI    FF    ; IGNORE <FF>
  151.     JZ    GETCH1
  152. ;
  153. ;  TEST FOR NEW LINE AND PROCESS IF SO
  154. ;
  155.     CPI    LF    ; NEW LINE?
  156.     JNZ    PHELP    ; CONTINUE IF NOT
  157.     CALL    LOUT    ; SEND <LF>
  158.     XRA    A    ; A=0
  159.     STA    CCNT    ; RESET CHAR CNT
  160.     CALL    F$GET    ; GET NEXT CHAR
  161.     JC    DONE    ; EOF
  162.     ANI    7FH    ; MASK MSB
  163.     CPI    EOF    ; DONE?
  164.     JZ    DONE
  165.     PUSH    PSW    ; SAVE NEXT CHAR
  166.     CPI    COLON    ; IS FIRST CHAR OF NEXT LINE A COLON?
  167.     JZ    PAGE    ; PAGE IF SO
  168.     LDA    LINES    ; DECREMENT LINE COUNT
  169.     DCR    A
  170.     STA    LINES
  171.     JZ    PAGEOV    ; PAGE IF LINE COUNT DROPS TO ZERO
  172.     POP    PSW    ; GET NEXT CHAR TO PRINT
  173.     JMP    PHELP    ; CONTINUE
  174. ;
  175. ;  PROCESS <TAB>
  176. ;
  177. SPTAB:
  178.     MVI    A,' '    ; PRINT <SP>
  179.     CALL    LOUT
  180.     LDA    CCNT    ; INCR CHAR CNT
  181.     INR    A
  182.     STA    CCNT
  183.     ANI    7    ; DONE?
  184.     JNZ    SPTAB
  185.     JMP    GETCH
  186. ;
  187. ;  NEW PAGE
  188. ;
  189. PAGEOV:    MVI    A,1    ; A=1
  190.     STA    LINES    ; PAGE OVERFLOW -- COMPENSATE FOR EJECT
  191. PAGE:    CALL    EJECT    ; EJECT PAGE
  192.     CALL    PHDR    ; PRINT HEADER
  193.     POP    PSW    ; GET NEXT CHAR TO PRINT
  194.     JMP    PHELP    ; CONTINUE
  195. ;
  196. ;  DONE WITH PHELP PROGRAM
  197. ;
  198. DONE:
  199.     CALL    EJECT    ; NEW PAGE
  200.     JMP    CPM    ; RETURN TO CP/M
  201.  
  202. ;
  203. ;  EJECT PAGE
  204. ;
  205. EJECT:
  206.     LDA    LINES    ; ANY LINES LEFT?
  207.     ADI    LPG-TPG-1    ; ADD NORMAL LINE COUNT
  208.     MOV    B,A    ; COUNT IN B
  209.     MVI    A,CR    ; <CR>
  210.     CALL    LOUT
  211.     MVI    A,LF    ; <LF>
  212. EJECT1:
  213.     CALL    LOUT    ; <LF> DOWN PAGE
  214.     DCR    B    ; COUNT DOWN
  215.     JNZ    EJECT1
  216.     MVI    A,TPG    ; RESET LINE COUNT
  217.     STA    LINES
  218.     RET
  219. ;
  220. ;  PRINT HEADER AT TOP OF PAGE
  221. ;
  222. PHDR:
  223. ;  PRINT 'PAGE'
  224.     LXI    H,PGMS    ; PRINT PAGE NUMBER
  225.     CALL    LSTR    ; PRINT ON PRINTER
  226. ;  PRINT PAGE NUMBER
  227.     LDA    PNUM    ; INCREMENT PAGE NUMBER
  228.     ADI    1    ; BCD
  229.     DAA        ; ADJUST
  230.     STA    PNUM
  231.     PUSH    PSW    ; SAVE PAGE NUMBER
  232.     CALL    EN    ; EXCHANGE NYBBLES
  233.     ANI    0FH    ; MASK LOW
  234.     JZ    LDBLK    ; LEADING BLANK
  235.     CALL    LNUM    ; PRINT A AS A DIGIT
  236.     JMP    PHDR1
  237. LDBLK:
  238.     MVI    A,' '    ; PRINT LEADING <SP> IF PAGE NUMBER LT 10
  239.     CALL    LOUT
  240. PHDR1:
  241.     POP    PSW    ; GET PAGE NUMBER
  242.     ANI    0FH    ; MASK LOW
  243.     CALL    LNUM    ; PRINT A AS A DIGIT
  244. ;  PRINT SYSTEM HEADER
  245.     LXI    H,TITLE    ; PRINT SYSTEM HDR
  246.     CALL    LSTR
  247. ;  PRINT USER HEADER
  248.     LXI    H,HBUF    ; PRINT BUFFER CONTENTS
  249.     CALL    LSTR
  250. ;  2 LINES
  251.     MVI    A,CR    ; SKIP DOWN
  252.     CALL    LOUT
  253.     MVI    A,LF    ; <LF>
  254.     CALL    LOUT
  255.     CALL    LOUT
  256.     LDA    LINES    ; DECR LINE COUNT
  257.     DCR    A
  258.     DCR    A
  259.     STA    LINES
  260.     RET
  261. ;
  262. ;  PRINT A AS A DECIMAL DIGIT
  263. ;
  264. LNUM:
  265.     ADI    '0'    ; CONVERT TO ASCII
  266.     JMP    LOUT    ; PRINT
  267. ;
  268. ;  PRINT STRING PTED TO BY HL ENDING IN 0 ON LST:
  269. ;
  270. LSTR:
  271.     MOV    A,M    ; GET CHAR
  272.     ORA    A    ; ZERO=DONE
  273.     RZ
  274.     CALL    LOUT    ; PRINT IT
  275.     INX    H    ; PT TO NEXT CHAR
  276.     JMP    LSTR
  277.  
  278. ;
  279. ;  BUFFERS AND MESSAGES
  280. ;
  281. CCNT:    DS    1    ; LINE CHAR CNT
  282. PNUM:    DS    1    ; PAGE NUMBER
  283. LINES:    DS    1    ; LINE COUNT
  284.  
  285. FTYPE:    DB    'HLP'    ; FILE TYPE
  286.  
  287. PGMS:    DB    'Page Number ',0
  288. TITLE:    DB    ' -- HELP File Listing: ',0
  289. HBUF:    DS    256    ; HEADER BUFFER
  290.     DB    0    ; END OF PROGRAM
  291.  
  292.     END
  293.