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 / CPM / PROGRAMS / LIST / BANNER.ASM < prev    next >
Assembly Source File  |  2000-06-30  |  10KB  |  432 lines

  1. *  PROGRAM:  BANNER
  2. *  AUTHOR:  RICHARD CONN
  3. *  VERSION:  1.0
  4. *  DATE:  22 FEB 82
  5. *  DERIVATION:  From Public Domain Program, Author Unknown
  6. *  PREVIOUS VERSIONS:  None
  7.  
  8. VERS    EQU    10    ;VERSION NUMBER
  9. *********************************
  10. *                *
  11. *   B A N N E R  P R I N T    *
  12. *                *
  13. *********************************
  14. *
  15. *  BANNER is a program which prints large (5x7) block letters
  16. * on the LST: Device in response to user input from the
  17. * keyboard.  BANNER is invoked in several ways:
  18. *    BANNER <text>
  19. *        -- <TEXT> is printed on the LST: device; ex:
  20. *            BANNER HELLO
  21. *    BANNER /T
  22. *        -- Multi-Text Line Input Mode; the user may
  23. *           type several successive lines to be printed;
  24. *           the user exits by typing ^C
  25. *    BANNER /?
  26. *        -- Built-In HELP Information is printed
  27. *
  28.  
  29. *********************************
  30. *  User-Customized Parameters    *
  31. *********************************
  32.  
  33. TEXT    EQU    'T'    ;OPTION CHAR TO INVOKE TEXT ENTRY MODE
  34. MCHARS    EQU    16    ;MAX NUMBER OF CHARS/LINE
  35.  
  36. *********************************
  37. *  Constants            *
  38. *********************************
  39.  
  40. BDOS        EQU         0005H
  41. FCB        EQU        005CH
  42. BUFF        EQU        0080H
  43. CTRLC        EQU        03H
  44. CR        EQU        0DH
  45. LF        EQU        0AH
  46. TAB        EQU        09H
  47. READLN        EQU        10    ;Input Line Editor
  48. OUTL        EQU        5    ;OUTPUT TO LST:
  49. OUTC        EQU        2    ;OUTPUT TO CON:
  50.  
  51.     ORG    100H
  52. START:
  53.     LXI    H,0    ;SAVE STACK PTR
  54.     DAD    SP    ;HL=OLD SP
  55.     SHLD    STACK
  56.     LXI    SP,STACK    ;NEW STACK
  57.     CALL    PMSG
  58.     DB    'BANNER  Version '
  59.     DB    VERS/10+'0','.',(VERS MOD 10)+'0'
  60.     DB    CR,LF
  61.     DB    0
  62.     LDA    FCB+1    ;CHECK FOR OPTION
  63.     CPI    '/'    ;OPTION CAUGHT?
  64.     JNZ    ONE$LINE    ;IF NO OPTION, PROCESS ONLY 1 LINE
  65.     LDA    FCB+2    ;CHECK FOR TEXT INPUT
  66.     CPI    TEXT    ;TEXT CHAR?
  67.     JZ    BTEXT    ;INPUT TEXT LINES
  68. ;
  69. ;  Print BANNER Help Message
  70. ;
  71. HELP:
  72.     CALL    PMSG    ;PRINT MESSAGE TO USER
  73.     DB    CR,LF,'BANNER is invoked by a command line like:'
  74.     DB    CR,LF,'        BANNER <text>'
  75.     DB    CR,LF,'In which case <TEXT> will be printed and control '
  76.     DB    CR,LF,'returned to CP/M, like "BANNER HELLO" to print'
  77.     DB    CR,LF,'"HELLO", or'
  78.     DB    CR,LF,'        BANNER /o'
  79.     DB    CR,LF,'where ''/o'' is ''/T'' to invoke Text Entry'
  80.     DB    CR,LF,'Mode in which the user may enter several sequential '
  81.     DB    CR,LF,'Banner Lines to be printed.  Any other option '
  82.     DB    CR,LF,'prints this Help Message and Exits.'
  83.     DB    0
  84. *
  85. *  Exit BANNER
  86. *
  87. EXIT:
  88.     LHLD    STACK    ;GET OLD STACK PTR
  89.     SPHL        ;LOAD SP
  90.     RET
  91. *
  92. *  PRINT BANNER WHEN CONTAINED IN COMMAND LINE
  93. *
  94. ONE$LINE:
  95.     LXI    H,BUFF    ;PT TO INPUT LINE
  96.     MOV    A,M    ;GET CHAR COUNT
  97.     ORA    A    ;PRINT HELP MESSAGE IF NO CHARS
  98.     JZ    HELP
  99.     MOV    B,A    ;CHAR COUNT IN B
  100.     DCR    B    ;COUNT DOWN BY 1 TO ELIMINATE LEADING SPACE
  101.     JZ    HELP
  102.     LXI    D,BLINE    ;PT TO BANNER LINE BUFFER
  103.     MOV    A,B    ;GET CHAR COUNT
  104.     STAX    D    ;STORE CHAR COUNT
  105.     INX    H    ;PT TO FIRST CHAR (SPACE)
  106.     INX    H    ;PT TO CHAR AFTER SPACE
  107.     INX    D    ;PT TO NEXT POSITION IN BUFFER
  108. OL1:
  109.     MOV    A,M    ;GET NEXT CHAR
  110.     STAX    D    ;PUT IT
  111.     INX    H    ;PT TO NEXT
  112.     INX    D
  113.     DCR    B    ;COUNT DOWN
  114.     JNZ    OL1
  115.     CALL    BANNER    ;PRINT BANNER
  116.     JMP    EXIT    ;EXIT TO CP/M
  117. *
  118. *  Process Multiple Line Input
  119. *
  120. BTEXT:
  121.     CALL    PMSG
  122.     DB    CR,LF,'BANNER Multiple Line Input'
  123.     DB    CR,LF,'    Input Line or ^C to Return to CP/M'
  124.     DB    CR,LF
  125.     DB    0
  126. BTEXTL:
  127.     CALL    PMSG
  128.     DB    'BANNER? ',0
  129.     LXI    D,INLINE    ;INPUT LINE
  130.     MVI    C,READLN    ;BDOS READLN FUNCTION
  131.     CALL    BDOS
  132.     CALL    PMSG        ;NEW LINE
  133.     DB    CR,LF,0
  134.     CALL    BANNER        ;PRINT BANNER LINE
  135.     JMP    BTEXTL        ;CONTINUE
  136. *
  137. *  PRINT BANNER CONTAINED IN BLINE BUFFER (BLINE=CHAR CNT)
  138. *
  139. BANNER:
  140.     LXI    H,BLINE    ;STORE ENDING <NULL>
  141.     MOV    A,M    ;GET CHAR COUNT
  142.     CPI    MCHARS+1    ;BEYOND CHAR LIMIT?
  143.     JC    BANNER1    ;CONTINUE IF NOT
  144.     CALL    PMSG
  145.     DB    CR,LF,'Truncation Error -- Line too long',CR,LF
  146.     DB    0
  147.     JMP    EXIT    ;RETURN TO CALLER
  148. BANNER1:
  149.     INX    H    ;PT TO FIRST CHAR
  150.     ADD    L    ;ADD TO LOW-ORDER BYTE
  151.     MOV    L,A    ;PT TO BYTE
  152.     MVI    M,0    ;STORE <NULL>
  153.     MVI    D,80H    ;PT TO MSB+1
  154. CBAN:
  155.     LXI    H,BLINE+1    ;SET PTR TO FIRST CHAR
  156.     MOV    A,M        ;CHECK FOR NO CHARS
  157.     ORA    A        ;ENDING ZERO?
  158.     JZ    CB4        ;4 CRLF'S IF SO
  159.     SHLD    NEXTCH
  160.     CALL    CRLF    ;NEW LINE
  161.     MOV    A,D    ;GET BIT PTR
  162.     RRC        ;ROTATE
  163.     ANI    7FH    ;MASK OUT MSB
  164.     MOV    D,A    ;SET BIT PTR
  165.     JZ    CB2    ;NEW LINE AND THEN EXIT
  166. CB1:
  167.     CALL    CONIN    ;GET NEXT CHAR
  168.     CALL    CAPS    ;CAPITALIZE
  169.     MOV    C,A    ;CHAR IN C
  170.     ORA    A    ;DONE?
  171.     JZ    CBAN    ;DO NEXT LINE IF SO
  172.     CALL    CONV    ;GET ADDRESS OF DATA IN HL
  173.     JC    CB1    ;SKIP IF ERROR
  174.     CALL    PRINT    ;PRINT 5 CHARS FOLLOWED BY TWO SPACES
  175.     JMP    CB1    ;CONTINUE
  176. CB4:
  177.     CALL    CRLF    ;4 <CR> <LF>
  178.     CALL    CRLF
  179.     CALL    CRLF
  180. CB2:
  181.     CALL    CRLF    ;1 CRLF
  182.     RET
  183.  
  184. *
  185. *  COMPUTE POINTER TO TABLE ENTRY OF CHAR IN REG A
  186. *    ON INPUT, A=CHAR; ON OUTPUT, HL=PTR TO TABLE ENTRY (1ST BYTE)
  187. *
  188. CONV:
  189.     PUSH    B        ;SAVE BC
  190.     PUSH    D        ;SAVE DE
  191.     SUI    ' '        ;CONVERT <SP> TO 0
  192.     RC            ;INVALID CHAR
  193.     CPI    7BH-' '        ;IN RANGE?
  194.     JNC    CNVER        ;INVALID CHAR
  195.     MOV    E,A        ;VALUE IN E
  196.     MVI    D,0        ;VALUE IN DE
  197.     MOV    H,D        ;VALUE IN HL
  198.     MOV    L,E
  199.     DAD    H        ;VALUE * 2
  200.     DAD    H        ;VALUE * 4
  201.     DAD    D        ;HL = VALUE * 5
  202.     LXI    D,CHARS        ;POINT TO BEGINNING OF TABLE
  203.     DAD    D        ;HL PTS TO ELEMENT IN TABLE
  204.     POP    D        ;RESTORE DE
  205.     POP    B        ;RESTORE BC
  206.     ORA    A        ;CLEAR CARRY
  207.     RET
  208. CNVER:
  209.     STC            ;SET CARRY FOR INVALID CHAR
  210.     POP    D        ;RESTORE DE
  211.     POP    B        ;RESTORE BC
  212.     RET
  213. *
  214. *  CAPITALIZE CHAR IN A
  215. *
  216. CAPS:
  217.     CPI    61H        ;LOWER CASE?
  218.     RC
  219.     ANI    5FH        ;MASK OUT BIT 5
  220.     RET
  221. *
  222. *  PRINT CHAR IN C ACCORDING TO THE ENTRY PTED TO BY HL
  223. *    BIT MASK IS IN D
  224. *
  225. PRINT:
  226.     PUSH    B        ;SAVE BC (C=CHAR)
  227.     MVI    B,5        ;5 BYTES/CHAR
  228. PRINT1:
  229.     MOV    A,M        ;GET BIT SET
  230.     ANA    D        ;MASK FOR BIT IN QUESTION
  231.     JZ    PRINT3        ;IF ZERO, PRINT <SP>
  232.     CALL    LSTOUT        ;PRINT CHAR IN C
  233. PRINT2:
  234.     INX    H        ;PT TO NEXT BYTE
  235.     DCR    B        ;COUNT DOWN
  236.     JNZ    PRINT1
  237.     MVI    C,' '        ;PRINT THREE SPACES
  238.     CALL    LSTOUT
  239.     CALL    LSTOUT
  240.     CALL    LSTOUT
  241.     POP    B        ;RESTORE BC
  242.     RET
  243. PRINT3:
  244.     MOV    E,C        ;SAVE CHAR
  245.     MVI    C,' '        ;PRINT <SP>
  246.     CALL    LSTOUT
  247.     MOV    C,E        ;GET CHAR
  248.     JMP    PRINT2
  249. *
  250. *  SUPPORT ROUTINES
  251. *
  252. PMSG:
  253.     XTHL        ;GET PTR TO STRING
  254.     MVI    B,0    ;SET TAB COUNTER
  255. PMSG1:
  256.     MOV    A,M    ;GET NEXT BYTE
  257.     INX    H    ;PT TO NEXT
  258.     ORA    A    ;DONE?
  259.     JZ    PMSG2
  260.     CPI    TAB    ;TABULATE?
  261.     JZ    PMSG$TAB
  262.     MOV    C,A    ;CHAR IN C
  263.     CALL    CONOUT    ;PRINT CHAR
  264.     INR    B    ;INCR CHAR COUNT
  265.     JMP    PMSG1
  266. PMSG$TAB:
  267.     MVI    C,' '    ;PRINT <SP>
  268.     CALL    CONOUT    ;PRINT
  269.     INR    B    ;INCR POSITION COUNT
  270.     MOV    A,B    ;GET IT
  271.     ANI    7    ;DONE?
  272.     JNZ    PMSG$TAB
  273.     JMP    PMSG1    ;PROCESS NEXT CHAR
  274. PMSG2:
  275.     XTHL        ;RESTORE HL, PTR
  276.     RET
  277. CRLF:
  278.     MVI    C,CR
  279.     CALL    LSTOUT
  280.     MVI    C,LF
  281.     JMP    LSTOUT
  282. LSTOUT:
  283.     PUSH H ! PUSH B ! PUSH D
  284.     MOV    E,C
  285.     MVI    C,OUTL        ;OUTPUT TO LST:
  286.     CALL    BDOS
  287.     POP D ! POP B ! POP H
  288.     RET
  289. CONOUT:
  290.     PUSH H ! PUSH B ! PUSH D
  291.     MOV    E,C
  292.     MVI    C,OUTC        ;OUTPUT TO CON:
  293.     CALL    BDOS
  294.     POP D ! POP B ! POP H
  295.     RET
  296. CONIN:
  297.     PUSH H ! PUSH D ! PUSH B
  298.     LHLD    NEXTCH    ;GET NEXT CHAR PTR
  299.     MOV    A,M    ;GET CHAR
  300.     INX    H    ;PT TO NEXT
  301.     SHLD    NEXTCH
  302.     ANI    7FH    ;MASK MSB IF ANY
  303.     POP B ! POP D ! POP H
  304.     RET
  305. *
  306. *  CHARACTER TABLE
  307. *    THE CHARACTERS REPRESENTED IN THIS TABLE ARE IN A 5X7 FORMAT
  308. *    THE FIRST BYTE IN EACH ENTRY REPRESENTS THE FIRST CHAR TO PRINT, ETC
  309. *    THE BITS 6 TO 0 REPRESENT LINES (SUCCESSIVE) TO PRINT FOR THE CHAR
  310. *
  311. *  FOR EXAMPLE, THE ENTRY FOR '*' IS 22H,14H,7FH,14H,22H; THIS GENERATES:
  312. *
  313. *      *    00100    R    6
  314. *    * * *    10101    E    5
  315. *     ***    01110    A    4
  316. *      *    00100    D    3
  317. *     ***    01110        2
  318. *    * * *    10101    D    1
  319. *      *    00100    O    0
  320. *        ^^^^^    W
  321. *        21712    N    ^
  322. *        24F42        B
  323. *        HHHHH        I
  324. *                T
  325. *
  326. CHARS:
  327.     DB    00H,00H,00H,00H,00H    ;<SP>
  328.     DB    00H,00H,7DH,00H,00H    ;EXCLAMATION MARK
  329.     DB    00H,70H,00H,70H,00H    ;"
  330.     DB    14H,7FH,14H,7FH,14H    ;#
  331.     DB    12H,2AH,7FH,2AH,24H    ;$
  332.     DB    62H,64H,08H,13H,23H    ;%
  333.     DB    36H,49H,35H,02H,05H    ;&
  334.     DB    00H,00H,70H,00H,00H    ;'
  335.     DB    1CH,22H,41H,00H,00H    ;(
  336.     DB    00H,00H,41H,22H,1CH    ;)
  337.     DB    22H,14H,7FH,14H,22H    ;*
  338.     DB    08H,08H,3EH,08H,08H    ;+
  339.     DB    00H,01H,06H,00H,00H    ;,
  340.     DB    08H,08H,08H,08H,08H    ;-
  341.     DB    00H,03H,03H,00H,00H    ;.
  342.     DB    02H,04H,08H,10H,20H    ;/
  343.     DB    3EH,45H,49H,51H,3EH    ;0
  344.     DB    11H,31H,7FH,01H,01H    ;1
  345.     DB    21H,43H,45H,49H,31H    ;2
  346.     DB    22H,41H,49H,49H,36H    ;3
  347.     DB    0CH,14H,24H,7FH,04H    ;4
  348.     DB    7AH,49H,49H,49H,46H    ;5
  349.     DB    3EH,49H,49H,49H,26H    ;6
  350.     DB    43H,44H,48H,50H,60H    ;7
  351.     DB    36H,49H,49H,49H,36H    ;8
  352.     DB    30H,49H,49H,49H,3EH    ;9
  353.     DB    00H,00H,36H,00H,00H    ;:
  354.     DB    00H,01H,16H,00H,00H    ;;
  355.     DB    08H,14H,22H,41H,00H    ;<
  356.     DB    14H,14H,14H,14H,14H    ;=
  357.     DB    00H,41H,22H,14H,08H    ;>
  358.     DB    20H,40H,4DH,50H,20H    ;?
  359.     DB    7EH,41H,5DH,4DH,39H    ;@
  360.     DB    3FH,48H,48H,48H,3FH    ;A
  361.     DB    7FH,49H,49H,49H,36H    ;B
  362.     DB    7FH,41H,41H,41H,41H    ;C
  363.     DB    7FH,41H,41H,41H,3EH    ;D
  364.     DB    7FH,49H,49H,49H,41H    ;E
  365.     DB    7FH,48H,48H,48H,40H    ;F
  366.     DB    7FH,41H,41H,49H,4FH    ;G
  367.     DB    7FH,08H,08H,08H,7FH    ;H
  368.     DB    41H,7FH,41H,80H,80H    ;I
  369.     DB    03H,01H,01H,01H,7FH    ;J
  370.     DB    7FH,08H,14H,22H,41H    ;K
  371.     DB    7FH,01H,01H,01H,01H    ;L
  372.     DB    7FH,20H,10H,20H,7FH    ;M
  373.     DB    7FH,30H,08H,06H,7FH    ;N
  374.     DB    7FH,41H,41H,41H,7FH    ;O
  375.     DB    7FH,48H,48H,48H,78H    ;P
  376.     DB    7FH,41H,45H,43H,7FH    ;Q
  377.     DB    7FH,48H,4CH,4AH,79H    ;R
  378.     DB    32H,49H,49H,49H,26H    ;S
  379.     DB    40H,40H,7FH,40H,40H    ;T
  380.     DB    7FH,01H,01H,01H,7FH    ;U
  381.     DB    70H,0CH,03H,0CH,70H    ;V
  382.     DB    7FH,02H,04H,02H,7FH    ;W
  383.     DB    63H,14H,08H,14H,63H    ;X
  384.     DB    60H,10H,0FH,10H,60H    ;Y
  385.     DB    43H,45H,49H,51H,61H    ;Z
  386.     DB    7FH,41H,41H,41H,00H    ;[
  387.     DB    20H,10H,08H,04H,02H    ;\
  388.     DB    00H,41H,41H,41H,7FH    ;]
  389.     DB    04H,08H,10H,08H,04H    ;^
  390.     DB    01H,01H,01H,01H,01H    ;_
  391.     DB    00H,40H,20H,10H,00H    ;'
  392.     DB    3FH,48H,48H,48H,3FH    ;A
  393.     DB    7FH,49H,49H,49H,36H    ;B
  394.     DB    7FH,41H,41H,41H,41H    ;C
  395.     DB    7FH,41H,41H,41H,3EH    ;D
  396.     DB    7FH,49H,49H,49H,41H    ;E
  397.     DB    7FH,48H,48H,48H,40H    ;F
  398.     DB    7FH,41H,41H,49H,4FH    ;G
  399.     DB    7FH,08H,08H,08H,7FH    ;H
  400.     DB    41H,7FH,41H,80H,80H    ;I
  401.     DB    03H,01H,01H,01H,7FH    ;J
  402.     DB    7FH,08H,14H,22H,41H    ;K
  403.     DB    7FH,01H,01H,01H,01H    ;L
  404.     DB    7FH,20H,10H,20H,7FH    ;M
  405.     DB    7FH,30H,08H,06H,7FH    ;N
  406.     DB    7FH,41H,41H,41H,7FH    ;O
  407.     DB    7FH,48H,48H,48H,78H    ;P
  408.     DB    7FH,41H,45H,43H,7FH    ;Q
  409.     DB    7FH,48H,4CH,4AH,79H    ;R
  410.     DB    32H,49H,49H,49H,26H    ;S
  411.     DB    40H,40H,7FH,40H,40H    ;T
  412.     DB    7FH,01H,01H,01H,7FH    ;U
  413.     DB    70H,0CH,03H,0CH,70H    ;V
  414.     DB    7FH,02H,04H,02H,7FH    ;W
  415.     DB    63H,14H,08H,14H,63H    ;X
  416.     DB    60H,10H,0FH,10H,60H    ;Y
  417.     DB    43H,45H,49H,51H,61H    ;Z
  418.  
  419. *
  420. *  BUFFERS
  421. *
  422.     DS    40    ;20-ELT STACK
  423. STACK:
  424.     DS    2    ;TOP OF BANNER STACK; CP/M STACK
  425. NEXTCH:
  426.     DS    2
  427. LLEN    EQU    80    ;NUMBER OF CHARS IN LINE, MAX
  428. INLINE:
  429.     DB    LLEN    ;CHAR COUNT FOR INLINE
  430. BLINE:
  431.     DS    LLEN+1    ;NUMBER OF BYTES IN LINE
  432.