home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / vol182 / pbh.lbr / PBH.AQM / PBH.ASM
Assembly Source File  |  1985-02-09  |  20KB  |  792 lines

  1. ;
  2. ;FILENAME: PBH.ASM
  3. ;
  4. ;TITLE: PRINT BLOCKHEAD
  5. ;
  6. ;REV 4 12-5 81 ADD CONDITIONAL ASSEMBLY FOR NON-
  7. ;FORM FEED PRINTER
  8. ;
  9. ;REV 3 3-8-81 CHG MAXCHR TO MEM LOC CBM
  10. ;
  11. ;REV 2 3-8-81 ADD SUBROUTINES AND CHANGES TO
  12. ;ALLOW FOR * TITLE OPERATION *
  13. ;
  14. ;REV 1 3-7-81 CHANGE MOVE FILE NAME ROUTINE TO CURE
  15. ;PROBLEM OF PRINTING DRIVE SELECT & COLON WHEN
  16. ;INPUTING DRIVE: FILENAME.TYPE * CBM
  17. ;
  18. ;ORIGIN DATE: 3-1-81
  19. ;
  20. ;HISTORY: THIS PROGRAM IS A MERGING OF THE "PRNT" FILE
  21. ;FROM THE CPM USER GROUP LIBRARY AND "MASTHEAD" BY
  22. ;EMILIO D. IANNUCCILLO, BASED ON THE BASIC VERSION BY
  23. ;LEO P. BIESE. INTERFACE AGE MAGAZINE 8/80 PG 122.
  24. ;THE TWO FILES WERE MERGED ON 3-1-81 BY C. B MUELLER
  25. ;WITH ASSISTANCE FROM DON LAYCOCK.
  26.  
  27. ;HOW TO USE:
  28. ;TO PRINT A FILE WITH NO BLOCK TITLE ENTER;
  29. ;PBH FILENAME.TYPE<CR>
  30. ;TO PRINT A FILE WITH A BLOCK TITLE THE SAME AS THE
  31. ;FILE NAME ENTER; PBH FILENAME.TYPE<SP>*
  32. ;TO PRINT A FILE WITH A DESIRED BLOCK TITLE ENTER;
  33. ;PBH FILENAME.TYPE<SP>TITLE
  34. ;TO PRINT A BLOCK TITLE ONLY ENTER:
  35. ;*<SP>TITLE
  36. ;8 CHARACTERS WILL FIT ON A 8 1/2" WIDE PAGE AND
  37. ;14 CHARACTERS WILL FIT ON A 14" WIDE PAGE.
  38. ;TO CHANGE THE NUMBER OF CHARACTERS CHANGE MAXCHR
  39. ;IN THE EQUATE TABLES.
  40. ;
  41. TRUE    EQU    0FFFFH
  42. FALSE    EQU    NOT TRUE
  43. ;
  44. ;SET FORM TRUE IF YOUR PRINTER CAN ACCEPT FORM FEEDS
  45. ;
  46. FORM    EQU    FALSE
  47. ;
  48. MAXLN    EQU    56    ;LINES PER PAGE -8
  49. FFNUL    EQU    12    ;NULLS AFTER A FORM FEED
  50. PGSPC    EQU    6    ;NUMBER OF LINES BETWEEN PAGES
  51. TBUFF    EQU    80H    ;TRANSIENT PROGRAM BUFFER 
  52. TFCB    EQU    5CH    ;TRANSIENT PROGRAM FCB
  53. ;
  54. OPEN    EQU    15    ;OPEN FUNCTION CODE
  55. READ    EQU    20    ;READ FUNCTION CODE
  56. ;
  57. LPCMD    EQU    5    ;LINE PRINT COMMAND
  58. CLCMD    EQU    9    ;CONSOLE COMMAND
  59. BDOS    EQU    5
  60. ;
  61. CR    EQU    0DH
  62. LF    EQU    0AH
  63. ;
  64. CHR1    EQU    'A'
  65. CHR2    EQU    'W'
  66. CHR3    EQU    'O'
  67. ;
  68. ;    MAIN LOOP
  69. ;
  70.     ORG    100H
  71.     LXI    H,0    ;CPM
  72.     DAD    SP    ;BOOT
  73.     SHLD    CPMRET    ;RETURN
  74.     LXI    SP,STACK
  75.     CALL    BHCHK    ;TEST FOR BLOCKHEAD
  76.     CALL    FCHK    ;TEST FOR VALID FILE
  77.     JMP    BH    ;PRINT BLOCKHEAD TITLE
  78. PRINT:    LXI    D,WRKMSG ;LOAD WORKING MSG
  79.     CALL    CONPRT    ;SEND IT TO CONSOLE
  80.     CALL    TOF3    ;PRINT HEADER LINE
  81.     MVI    A,9    ;LOAD LINES TO SKIP
  82.     STA    LINECNT    ;PUT IN LINE COUNT STORAGE
  83.     JMP    LOOP
  84.  
  85. FCHK:    LXI    D,TFCB    ;POINT TO FCB
  86.     CALL    FOPEN    ;OPEN FILE
  87.     JC    ERR1    ;IF ERROR, EXIT
  88.     RET
  89.  
  90. PRINT1:    CALL    FCHK    ;TEST FOR VALID FILE
  91.     LXI    D,WRKMSG ;LOAD WORKING MESSAGE
  92.     CALL    CONPRT    ;SEND IT TO CONSOLE
  93.     CALL    TOF3    ;PRINT HEADER LINE
  94.  
  95. LOOP:    CALL    GETBT    ;GET A BYTE
  96.     JC    ERR    ;ERROR
  97.     CPI    1AH    ;EOF?
  98.     JZ    DONE    ;YES
  99.     CPI    CR    ;CR?
  100.     JZ    CRET    ;YES
  101.     CPI    09H    ;TAB?
  102.     JNZ    LOOPX    ;NO, CONTINUE
  103.     LXI    H,COL    ;POINT TO COLUMN
  104. TBLP:    MVI    A,' '    ;LOAD ONE SPACE
  105.     CALL    PBYT    ;SEND IT
  106.     MOV    A,M    ;GET COLUMN
  107.     ANI    07H    ;MODULO 8
  108.     JNZ    TBLP    ;IF NOT AT TAB STOP, KEEP TYPEING
  109.     JMP    LOOP
  110.  
  111. LOOPX:    CALL    PBYT    ;PRINT BYTE
  112.     JMP    LOOP
  113.  
  114. CRET:    LDA    LINECNT    ;GET LINE COUNT
  115.     CPI    MAXLN    ;PAGE OVERFLOW?
  116.     JZ    CRET2    ;YES
  117.     INR    A    ;BUMP LINE COUNT
  118.     STA    LINECNT
  119.     XRA    A
  120.     STA    COL
  121.     MVI    A,CR
  122.     JMP    LOOPX    ;CONTINUE
  123.  
  124. CRET2:    MVI    A,CR    ;LOAD CR
  125.     CALL    PBYT    ;PRINT CR
  126.     CALL    TOF
  127.     JMP    LOOP
  128.  
  129. TOF:
  130.     IF    FORM
  131. ;
  132.     MVI    A,0CH    ;LOAD FORM FEED
  133.     CALL    PBYT    ;SEND IT
  134.     MVI    B,FFNUL    ;NUMBER OF RUBOUTS
  135. TOF1:    MVI    A,7FH    ;LOAD RUBOUT
  136.     CALL    PBYT    ;SEND IT
  137.     DCR    B    ;DCREMENT COUNT
  138.     JNZ    TOF1    ;PRINT 'N' RUBOUTS
  139.     ENDIF
  140. ;
  141.     IF    NOT FORM
  142. TOF:    MVI    B,PGSPC    ;LOAD NBR LINES TO SKIP
  143. TOF1:    MVI    A,CR    ;LOAD CR
  144.     CALL    PBYT    ;SEND IT
  145.     MVI    A,LF    ;LOAD LF
  146.     CALL    PBYT    ;SEND IT
  147.     DCR    B    ;ONE LINE SKIPED
  148.     JNZ    TOF1    ;IF NOT 0 DO IT AGAIN
  149.     ENDIF
  150. ;
  151. TOF3:    LXI    H,FMSG    ;POINT TO MESSAGE
  152.     CALL    PSTRNG    ;PRINT STRING
  153.     LXI    H,TFCB+1 ;POINT TO FILENAME
  154.     MVI    B,8    ;SIZE OF FILENAME
  155.     CALL    PCNT    ;PRINT FILENAME
  156.     MVI    A,' '    ;LOAD A SPACE
  157.     CALL    PBYT    ;SEND IT
  158.     LXI    H,TFCB+9 ;POINT TO FILETYPE
  159.     MVI    B,03    ;SIZE OF FILETYPE
  160.     CALL    PCNT    ;PRINT FILETYPE
  161.     LXI    H,PMSG    ;LOAD PAGE MESSAGE
  162.     CALL    PSTRNG    ;PRINT PAGE MESSAGE STRING
  163.     LDA    PAGE    ;GET PAGE NUMBER
  164.     INR    A    ;BUMP IT
  165.     STA    PAGE    ;SAVE IT
  166.     CALL    DEC    ;CONVERT TO DECIMAL
  167.     LXI    H,DECWRK ;POINT TO DEC STRING
  168.     MVI    B,3
  169.     CALL    PCNT    ;PRINT PAGE NUMBER
  170.     MVI    A,CR    ;LOAD CR
  171.     CALL    PBYT    ;SEND IT
  172.     MVI    A,LF    ;LOAD LF
  173.     CALL    PBYT    ;SEND LF
  174.     MVI    A,LF    ;LOAD LF
  175.     CALL    PBYT    ;SEND IT
  176.     XRA    A    ;ZERO 'A' REGISTER
  177.     STA    LINECNT    ;RESET LINE COUNT
  178.     STA    COL    ;RESET COLUMN
  179.     RET
  180.  
  181. PBYT:    PUSH    H
  182.     PUSH    B
  183.     PUSH    PSW
  184.     MOV    E,A    ;MOVE CHAR TO 'E' REG
  185.     MVI    C,05    ;CPM PRINT COMMAND
  186.     CALL    BDOS    ;SEND IT
  187.     POP    PSW
  188.     CPI    20H    ;NON-PRINTING?
  189.     JC    PBY2    ;YES, DON'T BUMP COL
  190.     LXI    H,COL    ;INCREMENT COLUMN
  191.     INR    M
  192. PBY2:    POP    B
  193.     POP    H
  194.     CALL    CONCHK    ;TEST CONSOLE STATUS
  195.     RET
  196.  
  197. PSTRNG:    MOV    A,M    ;GET BYTE
  198.     CPI    '$'    ;STRING END?
  199.     RZ        ;YES, DONE
  200.     CALL    PBYT    ;NO, PRINT BYTE
  201.     INX    H    ;BUMP POINTER
  202.     JMP    PSTRNG    ;LOOP
  203.  
  204. PCNT:    MOV    A,M    ;GET BYTE
  205.     CALL    PBYT    ;PRINT IT
  206.     INX    H    ;BUMP POINTER
  207.     DCR    B    ;DECREMENT COUNT
  208.     JNZ    PCNT
  209.     RET
  210.  
  211. DEC:    LXI    H,DECWRK
  212.     MVI    C,100
  213.     CALL    DIGIT
  214.     MVI    C,10
  215.     CALL    DIGIT
  216.     MVI    C,1
  217.     CALL    DIGIT
  218.     RET
  219.  
  220. DIGIT:    MVI    M,'0'
  221. DI0:    SUB    C
  222.     JM    DI1
  223.     INR    M
  224.     JMP    DI0
  225. DI1:    ADD    C
  226.     INX    H
  227.     RET
  228. PABORT:    LXI    D,ABTMSG ;LOAD ABORT MESSAGE #
  229.     MVI    C,09    ;CONSOLE BUFFER COMMAND
  230.     CALL    BDOS    ;SEND IT TO CONSOLE
  231.     JMP    EXIT
  232. DONE:    LXI    D,DNMSG    ;LOAD DONE MESSAGE
  233.     MVI    C,09    ;CONSOLE BUFFER COMMAND
  234.     CALL    BDOS    ;SEND IT TO COLSOLE
  235.     MVI    A,0CH    ;LOAD FORM FEED
  236.     CALL    PBYT    ;SEND IT
  237.     MVI    B,FFNUL    ;RUBOUT COUNT
  238. DLP2:    MVI    A,7FH    ;SEND
  239.     CALL    PBYT    ;NULLS
  240.     DCR    B    ;AFTER
  241.     JNZ    DLP2    ;FORM FEED    
  242.     JMP    EXIT    ;EXIT
  243.  
  244. BHCHK:
  245.     LXI    D,TLE    ;POINT TO TITLE BUFF
  246.     MVI    C,00    ;CLEAR 'C' FOR CHARACTER COUNT
  247.     LXI    H,TFCB+1 ;POINT TO 1ST CHARACTER FCB1
  248.     MOV    A,M    ;MOVE TO 'A'
  249.     CPI    3FH    ;TEST FOR '?' (* CHG TO ? BY CPM)
  250.     JZ    GETITLE    ;GO MOVE TITLE.
  251.     LXI    H,TFCB+17 ;POINT TO 1ST CHARACTER FCB2
  252.     MOV    A,M    ;MOVE CHARACTER TO 'A'
  253.     CPI    20H    ;TEST FOR SPACE
  254.     JZ    PRINT1    ;YES, RETURN TO PRINT
  255.     CPI    3FH    ;TEST FOR '?' (* CHG TO ? BY CPM)
  256.     JNZ    MVTITL    ;YES, GO MOVE TITLE NAME, ELSE
  257.             ;FALL THRU & MOVE FILE NAME
  258.  
  259. MVFILE:        ;MOVES FILE NAME FROM TFCB TO TITLE BUFF
  260.     LXI    H,TFCB    ;POINT TO START OF TFCB
  261. MVFILE1:         ;NOW MOVE TITLE TO TITLE BUFFER
  262.     INX    H    ;BUMP HL TO 1ST CHARACTER
  263.     MOV    A,M    ;MOVE CHARACTER TO 'A'
  264.     CPI    20H    ;TEST FOR SPACE
  265.     JZ    MVFILE2    ;YES, GO TO NEXT STEP
  266.     STAX    D    ;NO, PUT CHAR IN TITLE BUFF
  267.     INX    D    ;BUMP DE
  268.     INR    C    ;BUMP COUNT
  269.     MOV    A,C    ;PUT COUNT IN 'A'
  270.     CPI    9    ;MORE THAN 8 CHARACTERS ?
  271.     JNZ    MVFILE1    ;NO, DO IT AGAIN
  272.             ;YES, FALL THRU & BACKUP
  273.     DCR    C    ;BACK UP 1 COUNT
  274.     DCX    D    ;BACK UP 1 MEM LOC
  275. MVFILE2:        ;SET LAST CHAR TO 00 FOR BH
  276.     XRA    A    ;ZERO 'A'
  277.     STAX    D    ;SAVE 00 FOR BH
  278.     JMP    SAVECNT    ;GO SAVE COUNT
  279.  
  280. MVTITL:    ;MOVES TITLE FROM TBUFF TO TITLE BUFF
  281.     LXI    H,TBUFF+1 ;POINT TO START OF TBUFF
  282. MVTITL1:INX    H    ;BUMP TBUFF POINTER
  283.     MOV    A,M    ;MOVE CHAR TO 'A'
  284.     CPI    20H    ;TEST FOR SPACE BETWEEN TITLES
  285.     JNZ    MVTITL1    ;NO, GO DO IT AGAIN
  286. MVTITL2: ;NOW MOVE TITLE TO TITLE BUFFER
  287.     INX    H    ;BUMP HL TO 1ST CHARACTER
  288.     MOV    A,M    ;MOVE CHARACTER TO 'A'
  289.     STAX    D    ;PUT IN TITLE BUFF
  290.     INX    D    ;BUMP DE
  291.     CPI    00    ;TEST FOR NULL
  292.     JZ    SAVECNT    ;GO TO SAVE COUNT
  293.     INR    C    ;BUMP COUNT
  294.     JMP    MVTITL2    ;DO IT AGAIN
  295.  
  296. SAVECNT:LXI    H,MAXCHR ;POINT TO MAXCHR COUNT STORAGE
  297.     MOV    A,M    ;MOVE MAX CHAR COUNT TO 'A'
  298.     CMP    C    ;COMPARE CHAR COUNT TO MAXCHR
  299.     CC    MAXCNT    ;YES, GOTO ERROR
  300.     LXI    H,TITLSET ;POINT TO TITLE SET LOC
  301.     MOV    A,M    ;MOVE TITLSET CHAR TO 'A'
  302.     CPI    3FH    ;TEST FOR '?'
  303.     JZ    BH    ;YES, GO TO BH ROUTINE
  304.     RET        ;NO, RETURN
  305.  
  306. MAXCNT:    PUSH    B    ;CONSOLE STATUS ROUTINE
  307.     PUSH    D
  308.     PUSH    H
  309.     PUSH    PSW
  310.     LXI    D,MAXMSG ;LOAD MAX COUNT EXCEEDED MSG
  311.     CALL    CONPRT    ;SEND IT TO CONSOLE
  312.     CALL    CONSTAT    ;TEST CONSOLE STATUS
  313.     POP    PSW    ;NO, RETURN
  314.     POP    H
  315.     POP    D
  316.     POP    B
  317.     RET
  318.  
  319. GETITLE:
  320.     LXI    B,TITLSET ;LOAD TITLE SET LOC
  321.     STAX    B    ;SAVE 3FH FOR BH TEST
  322.     MVI    C,00    ;CLEAR 'C'
  323.     JMP    MVTITL    ;GO MOVE TITLE
  324.  
  325. ERR:    LXI    D,ERMSG    ;LOAD FILE ERROR MESSAGE
  326.     CALL    CONPRT    ;SEND IT TO CONSOLE
  327.     JMP    EXIT
  328.  
  329. ERR1:    LXI    D,ERMSG1 ;LOAD FILE NOT FOUND
  330.     CALL    CONPRT
  331.     JMP    EXIT
  332.  
  333. ERROR:    LXI    D,ERRMSG ;TOO LONG A PRINT LINE
  334.     CALL    CONPRT    ;SEND IT TO CONSOLE
  335.     JMP    EXIT
  336.  
  337. ;           F O P E N
  338. ;  ROUTINE TO OPEN A DISK FILE
  339. ;  INPUT:     DE=A(FCB)
  340. ; OUTPUT:     CARRY=ERROR
  341.  
  342. FOPEN:    MVI    C,OPEN    ;OPEN CODE
  343.     CALL    BDOS    ;ISSUE OPEN
  344.     CPI    0FFH    ;ERROR?
  345.     JZ    FOERR    ;YES
  346.     XRA    A    ;CLEAR CARRY
  347.     RET
  348. FOERR:    STC
  349.     RET
  350.  
  351. ;            G E T B T
  352. ;   ROUTINE TO READ A BYTE
  353. ;  OUTPUTS:     A=BYTE
  354. ;               CARRY=ERROR
  355.  
  356. GETBT:    LXI    H,TBUFF+128 ;POINT TO BUFFER END
  357.     XCHG        ;MOVE BUFFER END ADR TO DE
  358.     LHLD    INPTR    ;CURRENT POINTER IN HL
  359.     CALL    CPHL    ;TEST FOR END OF BUFFER
  360.     JZ    GETB2    ;YES, READ
  361. GETB1:    MOV    A,M    ;GET BYTE
  362.     INX    H    ;BUMP POINTER
  363.     SHLD    INPTR    ;SAVE POINTER
  364.     ORA    A    ;RESET CARRY
  365.     RET
  366. GETB2:    MVI    C,READ    ;READ CODE
  367.     LXI    D,TFCB    ;FCB ADDRESS
  368.     CALL    BDOS    ;ISSUE READ
  369.     CPI    00    ;ERROR?
  370.     JNZ    IERR    ;YES
  371.     LXI    H,TBUFF    ;RESET BUFFER POINTER
  372.     SHLD    INPTR
  373.     JMP    GETB1    ;CONTINUE
  374.  
  375. IERR:    STC
  376.     RET
  377.  
  378. ;   MISCELLANEOUS SUBROUTINES
  379. ;             C P H L
  380. ;  ROUTINE TO COMPARE HL VS DE
  381.  
  382. CPHL:    MOV    A,H
  383.     CMP    D
  384.     RNZ
  385.     MOV    A,L
  386.     CMP    E
  387.     RET
  388.  
  389. ; START OF BLOCKHEAD PROGRAM
  390.  
  391. BH:    LXI    D,RUNMSG ;LOAD RUN MSG
  392.     CALL    CONPRT    ;SEND TO CONSOLE
  393.     LXI    H,TLE    ;POINT TO 1ST TITLE CHAR
  394.     SHLD    IBP      ;SAVE 1ST CHAR LOC
  395.         ;IBP DENOTES INPUT BUFFER POINTER
  396.  
  397. ; ZERO PRINT BUFFER ROUTINE
  398.  
  399.     LXI    H,PRINT$BUF
  400.     SHLD    PB$POINTER
  401.     LXI    B,TOP$PB-PRINT$BUF
  402.     INR    B
  403.     XRA    A
  404. ZERO:    MOV    M,A
  405.     INX    H
  406.     DCR    C
  407.     JNZ    ZERO
  408.     DCR    B
  409.     JNZ    ZERO
  410.  
  411. ;MAIN ROUTINE
  412.  
  413.     CALL    TOP    ;TOP OF FORM
  414.     CALL    LOAD$PRINT$BUF
  415.     CALL    PRINT$MAST
  416.     CALL    CRLF
  417.     CALL    CRLF
  418.     LXI     H,TITLSET ;POINT TO TITLE SET LOC
  419.     MOV    A,M    ;MOVE CHAR TO 'A'
  420.     CPI    3FH    ;TEST FOR '?'
  421.     JZ    EXIT    ;YES, EXIT
  422.     JMP    PRINT    ;NO, GO BACK AND PRINT FILE
  423. ; SUB-ROUTINES
  424.  
  425. TOP:    MVI    E,0CH    ;LOAD FORM FEED
  426.     CALL    LISTER    ;SEND TO PRINTER
  427.     RET
  428.  
  429. CONPRT:            ;PRINT LINE TO THE CONSOLE
  430.     PUSH    H
  431.     PUSH    D
  432.     PUSH    B
  433.     PUSH    PSW
  434.     MVI    C,CLCMD
  435.     CALL    BDOS
  436.     POP    PSW
  437.     POP    B
  438.     POP    D
  439.     POP    H
  440.     RET
  441.  
  442. LOAD$PRINT$BUF:        ; LOAD PRINT BUFFER
  443.     LHLD    IBP     ;LOAD HL WITH 1ST CHAR LOC 
  444.     MOV    A,M    ;MOVE TO 'A'
  445.     CPI    00    ;TEST FOR LAST CHARACTER
  446.     RZ        ;DONE WHEN BYTE=00
  447.     INX    H    ;INCR HL REGS
  448.     SHLD    IBP     ;SAVE NEXT LOCATION
  449.     ANI    7FH    ;WE WANT LOWER ASCII GROUP
  450.     CPI    60H    ;IS IT LOWER CASE?
  451.     JC    $+5
  452.     ANI    5FH    ;CHANGE TO UPPER CASE
  453.     SUI    20H    ;DROP OFF NON-PRT CHAR
  454.     CALL    TIMES10        ;MULT BYTE IN A * 10
  455.     LXI    H,CONVERT$TABLE;POINT TO BEGINNING OF TABLE
  456.     DAD    D        ;ADD OFFSET FROM TIMES10
  457.     INX    H        ;ADD ONE
  458.     CALL    FILL$PB       ;PUT PRT CODE IN PRT BUF
  459.     JMP    LOAD$PRINT$BUF ;GO BACK FOR ANOTHER BYTE
  460.  
  461. ; ENTER WITH SUBJECT BYTE IN A
  462. ; EXIT WITH 10 TIMES SUBJECT BYTE IN DE
  463.  
  464. TIMES10:
  465.     LXI    D,0
  466.     MOV    E,A
  467.     ADD    A
  468.     MVI    C,3
  469.     MOV    B,A    ;2 TIMES STORED IN B
  470.             ;(NOT OVER FF)
  471. TLOOP:    MOV    A,E    ;MULTIPLY TIMES 8
  472.     ADD    A
  473.     MOV    E,A
  474.     MOV    A,D
  475.     ADC    D
  476.     MOV    D,A
  477.     DCR    C
  478.     JNZ    TLOOP
  479.     MOV    A,E    ;ADD 2 TIMES TO 8 TO SET
  480.     ADD       B    ;10 TIMES
  481.     MOV    E,A
  482.     JNC    $+4
  483.     INR    D
  484.     RET
  485.  
  486. ; ENTER WITH HL POINTING TO CORRECT LOC IN CONVERT TABLE
  487.  
  488. FILL$PB:
  489.     MVI    C,9    ;PRINT BUFFER IS 9 LINES LONG
  490.     XCHG        ;FOR EACH LETTER TO BE PRINTED
  491.     LHLD    PB$POINTER   ;EACH BYTE REPRESENTS THE 7
  492. FLOOP:    LDAX    D    ;HORIZONTAL PRINT POSITIONS
  493.     MOV    M,A
  494.     INX    H
  495.     INX    D
  496.     DCR    C
  497.     JNZ    FLOOP
  498.     SHLD    PB$POINTER
  499.     RET    
  500.  
  501. ; PRINT IS DONE BY GOING THROUGH THE PRINT BUFF AS FOLLOWS:
  502. ; START WITH FIRST BYTE OF PRINT BUFFER. CHECK FOR BIT 7
  503. ; WHICH INDICATES A PRINT CHARACTER IS PRESENT. THEN TYPE
  504. ; A CHARACTER HORIZONTALLY FOR EACH OF THE REMAINING 7 BIT
  505. ; POSITION AS INDICATED. SPACE 2. THEN ADD 9 TO THE BUFFER
  506. ; TABLE POINTER TO SET THE NEXT CHARACTER,IF ANY. CONTINUE
  507. ; UNTIL THE FIRST HORIZONTAL LINE IS COMPLETE. THEN RETURN
  508. ; CARRIAGE AND REPEAT WITH TWO MORE PRINT CHARACTERS. THEN
  509. ; ADD ONE TO THE PRINT BUFFER POINTER FOR THE SECOND LINE.
  510. ; REPEAT THE HORIZONTAL PRINTING ABOVE AGAIN FOR THE 2ND
  511. ; LINE THEN REPEAT THE WHOLE PROCESS AGAIN FOR 7 LINES.
  512. ; SPACE UP TWO AND EXIT.
  513.  
  514. PRINT$MAST:
  515.     LXI    H,PRINT$BUF    ;SET PB POINTER
  516.     SHLD    PB$POINTER
  517.     MVI    A,7    ;PRINT 7 HORIZONTAL LINES
  518.     STA    PLOOP$COUNTER  ;TO THE MATRIX
  519. PLOOP:    LHLD    PB$POINTER
  520.     PUSH    H
  521.     MVI    A,CHR1
  522.     STA    PTCHR
  523.     CALL    RESET$PHEAD
  524.     CALL    PRINTMATRIX
  525.     MVI    A,CHR2
  526.     STA    PTCHR
  527.     POP    H
  528.     PUSH    H
  529.     CALL    RESET$PHEAD
  530.     CALL    PRINTMATRIX
  531.     MVI    A,CHR3
  532.     STA    PTCHR
  533.     POP    H
  534.     PUSH    H
  535.     CALL    RESET$PHEAD
  536.     CALL    PRINTMATRIX
  537.     POP    H
  538.     INX    H
  539.     SHLD    PB$POINTER
  540.     CALL    CRLF
  541.     LDA    PLOOP$COUNTER
  542.     DCR    A
  543.     STA    PLOOP$COUNTER
  544.     JNZ    PLOOP
  545.     RET
  546.  
  547. ; ENTER WITH HL POINTING AT BYTE IN PRINTER BUFFER
  548. ; EXIT WHEN BIT 7 = 0
  549. ; ELSE PRINT OUT THE CHARACTER STORED IN PTCHR EVERY
  550. ; TIME A BIT IS HIGH. SPACE BETWEEN LETTERS . JUMP
  551. ; NINE IN PRINT BUFFER FOR NEXT LETTER.
  552.  
  553. PRINT$MATRIX:
  554.     MOV    A,M
  555.     RAL
  556.     RNC
  557.     MVI    C,7    ;NUMBER OF ROTATES
  558. PMLOOP:
  559.     XCHG        ;PUT PRINT CHARACTER IN E
  560.     LHLD    PTCHR
  561.     XCHG
  562.     RAL
  563.     JC    $+5
  564.     MVI    E,20H
  565.     CALL    LISTER
  566.     DCR    C
  567.     JNZ    PMLOOP
  568.     CALL    SPACE
  569.     CALL    SPACE
  570.     MOV    A,L    ;ADJUST HL POINTER
  571.     ADI    9
  572.     MOV    L,A
  573.     JNC    $+4
  574.     INR    H
  575.     JMP    PRINT$MATRIX
  576.  
  577. RESET$PHEAD:
  578.     CALL    CONCHK
  579.     MVI    E,CR
  580.     JMP    LISTER
  581.  
  582. CRLF:    MVI    E,CR
  583.     CALL    LISTER
  584.     MVI    E,LF
  585.     JMP    LISTER
  586.  
  587. SPACE:    MVI    E,20H
  588.     JMP    LISTER
  589.  
  590. LISTER:    PUSH    H    ;PRINTER ROUTINE
  591.     PUSH    D
  592.     PUSH    B
  593.     PUSH    PSW
  594.     MVI    C,LPCMD    ;LOAD PRINT COMMAND
  595.     CALL    BDOS    ;SEND IT TO PRINTER
  596.     POP    PSW
  597.     POP    B
  598.     POP    D
  599.     POP    H
  600.     RET
  601.  
  602. CONSTAT:MVI    C,11    ;CONSOLE STATUS COMMAND
  603.     CALL    BDOS    ;GET STATUS
  604.     CPI    01    ;CHARACTER READY?
  605.     JNZ    CONSTAT    ;NO, DO IT AGAIN
  606.             ;YES FALL THRU
  607. MAXANS:    MVI    C,01    ;READ CONSOLE COMMAND
  608.     CALL    BDOS    ;GET CHARACTER
  609.     CPI    4EH    ;TEST FOR 'N'
  610.     JZ    ERROR    ;YES, EXIT
  611.     RET
  612.  
  613. CONCHK:    PUSH    B    ;CONSOLE STATUS ROUTINE
  614.     PUSH    D
  615.     PUSH    H
  616.     PUSH    PSW
  617.     MVI    C,11    ;CONSOLE STATUS COMMAND
  618.     CALL    BDOS    ;GET STATUS
  619.     CPI    01    ;CHARACTER READY?
  620.     CZ    GETCHR    ;YES, GET IT
  621.     POP    PSW    ;NO, RETURN
  622.     POP    H
  623.     POP    D
  624.     POP    B
  625.     RET
  626.  
  627. GETCHR:    MVI    C,01    ;READ CONSOLE COMMAND
  628.     CALL    BDOS    ;GET CHARACTER
  629.     CPI    03H    ;TEST FOR ^C
  630.     JZ    ABORT    ;YES GO TO ABORT
  631.     RET
  632.  
  633. ABORT:    LXI    D,ABTMSG ;LOAD ABORT MSG
  634.     CALL    CONPRT
  635.     JMP    EXIT
  636.  
  637. EXIT:    LHLD    CPMRET
  638.     SPHL
  639.     RET
  640.  
  641. ;             D A T A
  642.  
  643. COL:        DB    0    ;COLUMN COUNTER
  644. LINECNT:    DB    0    ;LINE COUNTER
  645. PAGE:        DB    0    ;PAGE COUNTER
  646. CPMRET:        DW    0    ;CPM RETURN ADR
  647. MAXCHR:        DB    8    ;MAX TITLE CHAR 
  648. TITLSET:    DB    0    ;TITLE SET FOR BH
  649. TLE:        EQU    $    ;INPUTED TITLE
  650.         DS    0FH
  651. LINE1:        DB    0
  652.         DS    128
  653. STACK:        EQU    $
  654. IBP:        DW    0   ;INPUT BUFFER POINTER
  655. PRINT$BUF:    EQU    $
  656.         DS    200
  657. TOP$PB:        EQU    $
  658. PB$POINTER:    DW    0
  659. PTCHR:        DB    0
  660. PLOOPCOUNTER:    DB    0
  661. INPTR:        DW    TBUFF+128;INPUT POINTER
  662.  
  663. ; MESSAGES
  664.  
  665. FMSG:    DB    CR,LF,'FILE: $'
  666. PMSG:    DB    '                                       '
  667.     DB    '          PAGE $'
  668. ERMSG:    DB    CR,LF,'DATA ERROR, PLEASE RENTER.'
  669.     DB    CR,LF,'$'
  670. ERMSG1:    DB    CR,LF,'FILE NOT FOUND, PLEASE '
  671.     DB    'RENTER.',CR,LF,'$'
  672. ERRMSG:    DB    CR,LF,'TOO LONG A TITLE LINE, '
  673.     DB    'PLEASE RENTER.',CR,LF,'$'
  674. MAXMSG:    DB    CR,LF,'WARNING!! FILENAME HAS EXCEEDED 8 '
  675.     DB    'CHARACTERS, DO YOU WANT TO CONTINUE ?$'
  676. ABTMSG    DB    CR,LF,'PRINT ABORTED',CR,LF,'$'
  677. DNMSG:    DB    CR,LF,'PRINT COMPLETE',CR,LF,'$'
  678. RUNMSG:    DB    CR,LF,'RUNNING TITLE PRINTER, '
  679.     DB    'PRESS CONTROL C TO EXIT TO CPM$'
  680. WRKMSG:    DB    CR,LF,'PRINTING FILE, PRESS CONTROL C'
  681.     DB    ' TO EXIT TO CPM$'
  682. DECWRK:    DB    '   '
  683.  
  684. ; CONVERSION TABLE FOR THE ASCII CHARACTERS
  685. ; TO THE HEX CODE WHICH SIGNALS THE PRINTER WHEN TO PRINT
  686. ;
  687. ; FORM OF TABLE
  688. ;        | 00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 |
  689. ;        ---------------------------------------------------
  690. ;        |    |  7 OR 9 BYTES OF HEX CODE
  691. ;        | A  |     ONE HEX CODE FOR EACH LINE
  692. ;        |    |       START 7 BY 7 MATRIX THEN LATER 
  693. ;        | B  |         WE CAN USE BYTE 8&9 FOR DECODERS
  694. ;        |    |
  695. ;        | C  |
  696. ;          ^------HERE IS THE ASCII CODE THAT WE WILL USE
  697. ;           TO TEST FOR A MATCH. THE PRINT CODE FOLLOWS
  698. ;           IN ORDER
  699.  
  700. CONVERT$TABLE:
  701.      DB        ' ',80H,80H,80H,80H,80H,80H,80H,0,0
  702.      DB        '!',88H,88H,88H,88H,88H,80H,88H,0,0
  703.      DB        '"',182,182,182,80H,80H,80H,80H,0,0
  704.      DB        '#',94H,94H,255,94H,255,94H,94H,0,0
  705.      DB        '$',191,232,232,190,8BH,8BH,254,0,0
  706.      DB        '%',177,178,84H,88H,90H,166,198,0,0
  707.      DB        '&',90H,168,88H,168,197,194,189,0,0
  708.      DB        27H,80H,98H,8CH,90H,80H,80H,80H,0,0
  709.      DB        '(',81H,82H,84H,84H,84H,82H,81H,0,0
  710.      DB        ')',192,160,90H,90H,90H,160,192,0,0
  711.      DB        '*',201,170,9CH,255,9CH,170,201,0,0
  712.      DB        '+',88H,88H,88H,255,88H,88H,88H,0,0
  713.      DB        ',',80H,80H,80H,80H,80H,88H,90H,0,0
  714.      DB        '-',80H,80H,80H,9CH,80H,80H,80H,0,0
  715.      DB        '.',80H,80H,80H,80H,80H,98H,98H,0,0
  716.      DB        '/',81H,82H,84H,88H,90H,160,192,0,0
  717.      DB        '0',190,193,193,193,193,193,190,0,0
  718.      DB        '1',88H,98H,168,88H,88H,88H,190,0,0
  719.      DB        '2',9EH,161,82H,84H,88H,90H,255,0,0
  720.      DB        '3',190,193,81H,86H,81H,193,190,0,0
  721.      DB        '4',86H,92H,162,254,82H,82H,82H,0,0
  722.      DB        '5',254,192,192,252,82H,82H,252,0,0
  723.      DB        '6',188,192,192,252,194,194,188,0,0
  724.      DB        '7',255,82H,84H,88H,90H,160,224,0,0
  725.      DB        '8',158,161,161,9EH,161,161,9EH,0,0
  726.      DB        '9',158,161,161,9FH,81H,81H,9EH,0,0
  727.      DB        ':',80H,176,176,80H,176,176,80H,0,0
  728.      DB        ';',80H,98H,98H,80H,84H,90H,80H,0,0
  729.      DB        '<',84H,88H,90H,160,90H,88H,84H,0,0
  730.      DB        '=',80H,190,190,80H,190,190,80H,0,0
  731.      DB        '>',90H,88H,84H,82H,84H,88H,90H,0,0
  732.      DB        '?',9CH,162,82H,84H,88H,80H,88H,0,0
  733.      DB        '@',9CH,178,210,210,204,160,9EH,0,0
  734.      DB        'A',190,227,227,255,227,227,227,0,0
  735.      DB        'B',254,227,227,254,227,227,254,0,0
  736.      DB        'C',190,227,224,224,224,227,190,0,0
  737.      DB        'D',254,227,227,227,227,227,254,0,0
  738.      DB        'E',255,224,224,252,224,224,255,0,0
  739.      DB        'F',255,224,224,248,224,224,224,0,0
  740.      DB        'G',190,227,224,224,231,227,190,0,0
  741.      DB        'H',227,227,227,255,227,227,227,0,0
  742.      DB        'I',158,140,140,140,140,140,158,0,0
  743.      DB        'J',83H,83H,83H,83H,83H,179,9EH,0,0
  744.      DB        'K',227,230,236,248,252,230,227,0,0
  745.      DB        'L',224,224,224,224,224,224,255,0,0
  746.      DB        'M',193,227,247,235,227,227,227,0,0
  747.      DB        'N',195,227,243,235,231,227,225,0,0
  748.      DB        'O',190,227,227,227,227,227,190,0,0
  749.      DB        'P',254,227,227,254,224,224,224,0,0
  750.      DB        'Q',190,227,227,227,227,231,191,0,0
  751.      DB        'R',254,227,227,254,248,236,230,0,0
  752.      DB        'S',191,224,224,190,131,131,254,0,0
  753.      DB        'T',254,152,152,152,152,152,152,0,0
  754.      DB        'U',227,227,227,227,227,227,190,0,0
  755.      DB        'V',193,161,179,146,158,140,140,0,0
  756.      DB        'W',227,227,227,235,247,227,193,0,0
  757.      DB        'X',227,182,156,156,156,182,227,0,0
  758.      DB        'Y',227,182,156,140,140,140,140,0,0
  759.      DB        'Z',255,130,132,136,144,160,255,0,0
  760.      DB        '[',128,128,128,128,128,128,128,0,0
  761.      DB        '\',128,128,128,128,128,128,128,0,0
  762.      DB        ']',128,128,128,128,128,128,128,0,0
  763.      DB        '^',128,128,128,128,128,128,128,0,0
  764.      DB        '_',128,128,128,128,128,128,128,0,0
  765.      DB           '`',128,128,128,128,128,128,128,0,0
  766.  
  767. ; FORMAT FOR THE PRINTING TABLE
  768. ;
  769. ;               LINE LINE LINE LINE LINE LINE LINE LINE LINE
  770. ; 0000         | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 |
  771. ;         ---------------------------------------------------
  772. ;         |    | 7 OR 9 BYTES OF HEX CODE
  773. ; 1ST LETTER   |   ONE HEX CODE FOR EACH PRINT LINE
  774. ;        |
  775. ; 0009         |
  776. ;         |    |     START WITH 7 BY 7 MATRIX
  777. ; 2ND LETTER   |       LATER WE CAN USE BYTE 8 &9
  778. ;        |         FOR DECODERS
  779. ; OO12         |
  780. ;         |    |
  781. ; 3RD LETTER   |
  782. ;        |
  783. ;
  784. ;         ^_____EACH LETTER IS 9 BYTES APART. IF A BIT 7 SET
  785. ;         THEN IT IS A CHARACTER TO BE PRINTED. A 00
  786. ;         IN ANY POSITION DESIGNATES THE END OF THE
  787. ;        PRINT LINE
  788. ;
  789. ; PRINT$BUFFER: DS   9*14   ;MAXIMUM OF 14 PRINTABLE CHARS.
  790.  
  791.       END
  792.