home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / mbug / mbug081.arc / BBOARD.ASC < prev    next >
Text File  |  1979-12-31  |  10KB  |  525 lines

  1. ; ****    B I L L B O A R D    ****
  2. ;
  3. ;         Rob Askew  12/10/83
  4. ;
  5.     ORG    4000H ;Change to 900h for 16k bee.
  6. VDU    EQU    0F000H
  7. WINDOW    EQU    0F180H ;VDU addr of message area.
  8. PRINT    EQU    800CH  ;VDU print routine.
  9. GETKEY    EQU    8006H  ;Wait for keypress routine.
  10. INKEY    EQU    8009H  ;Key pressed ? If so which ?
  11. CURS    EQU    010BH  ;Current VDU addr of cursor.
  12. CURSTY    EQU    0DCH   ;Cursor shape byte addr.
  13. BLOCK    EQU    0      ;Solid block cursor.
  14. NORM    EQU    6FH    ;Normal cursor.
  15. NONE    EQU    10H    ;No cursor.
  16. LORES    EQU    8027H  ;Lores initialise routine.
  17. INVERS    EQU    802AH    ;Inverse init routine.
  18.  
  19.  
  20.  
  21. IN    CALL    LORES
  22.     CALL    INIT    ;Clear buff,print title..
  23.     CALL    CLS
  24.  
  25. RUN    CALL    UPDATE    ;Setup buffer.
  26.     CALL    DELAY
  27.     CALL    DISPLY    ;Buff to VDU window.
  28.     CALL    INKEY
  29.     JR    Z,RUN
  30.     CP    1BH    ;ESC ?
  31.     JP    Z,MENU    ;Yes, get menu.
  32.     CP    'F'    ;Faster?
  33.     JR    NZ,NEXT
  34.     LD    A,(SPEED)
  35.     CP    0    ;Speed max?
  36.     JR    Z,RUN
  37.     DEC    A
  38.     LD    (SPEED),A
  39.     JR    RUN
  40. NEXT    CP    'S'    ;Slower?
  41.     JR    NZ,NEXT2
  42.     LD    A,(SPEED)
  43.     INC    A
  44.     LD    (SPEED),A
  45. NEXT2    CP    20H    ;Space (for pause)?
  46.     CALL    Z,GETKEY;Wait for any key to go on.
  47.     JR    RUN
  48. ;Initialise buffer, print title.
  49. INIT    CALL    CLS
  50.     LD    HL,CURSTY
  51.     LD    (HL),NONE
  52.     LD    HL,WINDOW
  53.     LD    (CURS),HL
  54.     LD    HL,MESS01
  55. LOOP2    LD    A,(HL)
  56.     CP    0FFH    ;End of message?
  57.     JR    Z,CONT1    ;Yep
  58.     LD    B,A
  59.     PUSH    HL
  60.     CALL    PRINT
  61.     POP    HL
  62.     INC    HL
  63.     JR    LOOP2
  64. CONT1    LD    HL,BUFFER
  65.     LD    DE,BUFFER+1
  66.     LD    BC,100H
  67.     LD    (HL),80H
  68.     LDIR        ;Buffer Cleared
  69.     LD    HL,POINT
  70.     LD    (HL),0
  71.     INC    HL
  72.     LD    (HL),0    ;POINTER INITIALISE
  73.     LD    HL,SUBSTR
  74.     LD    (HL),0
  75.     CALL    GETKEY    ;"Any key to cont.."
  76.     RET
  77. MESS01    DEFM    '              * * * * B I L L  B O A R D * * * *   '
  78.     DB    0DH
  79.     DB    0AH
  80.     DB    0AH
  81.     DB    0AH
  82.     DEFM    '               Rob Askew     October 1983.          '
  83.     DB    0DH
  84.     DB    0AH
  85.     DB    0AH
  86.     DB    0AH
  87.     DEFM    '                        (Any key to continue...)'
  88.     DB    0FFH
  89. ; CLear Screen routine.
  90. ;
  91. CLS    LD    B,12    ;FORM FEED
  92.     CALL    PRINT
  93.     RET
  94. ; GETSTRing routine for input of message.
  95. ;
  96. GETSTR    CALL    PROMPT
  97.     LD    HL,CURSTY
  98.     LD    (HL),NORM
  99.     LD    DE,STRING
  100. LOOP3    PUSH    DE
  101.     CALL    GETKEY
  102.     POP    DE
  103.     CP    1BH    ;ESC ?
  104.     JR    Z,OUT    ;Yep,Exit.
  105.     CP    0DH    ;CR ?
  106.     JR    Z,OUT    ;CR is end of message flag.
  107. BACKSP    CP    8    ; Backspace ?
  108.     JR    Z,L1
  109.     CP    127    ; Delete ?
  110.     JR    NZ,CONT10
  111. L1    DEC    DE
  112.     LD    B,A
  113.     PUSH    DE
  114.     CALL    PRINT
  115.     POP    DE
  116.     JR    LOOP3
  117. CONT10    CP    10H    ;^P ? (For pause)
  118.     JR    NZ,CONT12
  119.     LD    (DE),A    ;INSERT PAUSE CODE IN STRING.
  120.     PUSH    DE
  121.     LD    B,0A0H
  122.     CALL    PRINT ; Print a solid block for "pause"
  123.     POP    DE
  124.     INC    DE
  125.     JR    LOOP3
  126. CONT12    CP    20H
  127.     JR    C,LOOP3    ;Ignore non-printers.
  128.     PUSH    DE
  129.     PUSH    AF
  130.     LD    B,A
  131.     CALL    PRINT
  132.     POP    AF
  133.     POP    DE
  134.     LD    (DE),A
  135.     INC    DE
  136.     JR    LOOP3
  137. OUT    LD    A,0FFH
  138.     LD    (DE),A    ; End of message flag.
  139.     LD    A,0
  140.     LD    (POINT),A    ;Set pointers to
  141.     LD    (SUBSTR),A    ;start of message.
  142.     CALL    CLS
  143.     RET
  144.  
  145.  
  146. ; PROMPT routine for input...
  147. ;
  148. PROMPT    CALL    CLS
  149.     LD    HL,CURSTY
  150.     LD    (HL),NORM
  151.     LD    HL,MESS02
  152. LOOP4    LD    A,(HL)
  153.     CP    0FFH        ;Message end  ?
  154.     RET    Z        ;Yep
  155.     LD    B,A
  156.     PUSH    HL
  157.     CALL    PRINT
  158.     POP    HL
  159.     INC    HL
  160.     JR    LOOP4
  161. MESS02    DEFM    '    Start typing your message...end it with "RETURN"...         >'
  162.     DB    0FFH
  163. ; UPDATE Routine to move buffer along.
  164. ;
  165. UPDATE    LD    DE,BUFFER
  166.     LD    HL,BUFFER+1
  167.     LD    BC,100H
  168.     LDIR        ; All moved along.
  169. ;Now generate right hand edge.
  170.     LD    DE,(POINT)    ;DE=String Pointer
  171. BACK    LD    HL,STRING
  172.     ADD    HL,DE
  173.     LD    A,(HL)    ;A=Current Char.
  174.     CP    0FFH    ;End of message  ?
  175.     JR    NZ,CONT3;NO
  176.     LD    HL,0    ;YES,START AT BEGINNING.
  177.     LD    (POINT),HL
  178.     LD    DE,0
  179.     JR    BACK
  180. CONT3    CP    10H    ;^P ?
  181.     JR    NZ,CONT14;NO
  182.     CALL    PAUSE    ;YES, WAIT AWHILE.
  183.     INC    DE    ;Point at next char.
  184.     LD    (POINT),DE
  185.     JR    BACK
  186. CONT14    SUB    20H    ;Sub 32 because
  187.     LD    B,0    ;non-printing chars
  188.     SLA    A    ;not catered for.
  189.     RL    B
  190.     SLA    A
  191.     RL    B
  192.     SLA    A
  193.     RL    B
  194.     SLA    A
  195.     RL    B
  196.     LD    C,A    ;BC=(ASC-32)*16
  197.     LD    HL,DATA
  198.     ADD    HL,BC    ;HL=:A lores data.
  199.     LD    BC,SUBSTR
  200.     LD    A,(BC)    ;A= which 1/4 of char.
  201.     ADD    A,L
  202.     LD    L,A
  203.     JR    NC,CONT4
  204.     INC    H    ;HL=:A correct 1/4 of data.
  205. CONT4    PUSH    HL
  206.     LD    A,(BC)    ;A= 1/4 POINTER
  207.     INC    A
  208.     AND    3
  209.     LD    (BC),A    ;INC 1/4 POINTER & SAVE
  210.     JR    NZ,CONT5;INC STRING POINTER
  211.     LD    HL,POINT;IF 1/4 POINTER
  212.     LD    E,(HL)    ;CROSSES ZERO.
  213.     INC    HL
  214.     LD    D,(HL)
  215.     INC    DE
  216.     LD    (HL),D
  217.     DEC    HL
  218.     LD    (HL),E
  219. CONT5    POP    HL
  220. ; Now generate RH edge.
  221.     LD    B,4
  222.     LD    DE,BUFFER+3FH    ;DE=:A RH edge
  223. GEN    LD    A,(HL)
  224.     LD    (DE),A
  225.     LD    A,4
  226.     ADD    A,L
  227.     LD    L,A
  228.     JR    NC,CONT6
  229.     INC    H    ;HL=:A next lores ch.
  230. CONT6    LD    A,40H
  231.     ADD    A,E
  232.     LD    E,A
  233.     JR    NC,CONT7
  234.     INC    D    ;DE=:A next buffer line.
  235. CONT7    DJNZ    GEN
  236.     RET
  237.  
  238. PAUSE    PUSH    BC
  239.     LD    C,0FFH
  240. OUTER    LD    B,0FFH
  241. INNER    DJNZ    INNER
  242.     DEC    C
  243.     JR    NZ,OUTER
  244.     POP    BC
  245.     RET
  246.  
  247. ;DISPLAY ROUTINE DUMPS BUFFER ONTO SCREEN.
  248. ;
  249. DISPLY    LD    HL,BUFFER
  250.     LD    DE,WINDOW
  251.     LD    BC,100H
  252. WAIT    IN    A,(0CH)    ;VDU driver register.
  253.     BIT    5,A    ;Is vert retrace on?
  254.     JR    Z,WAIT    ;NO
  255.     LDIR
  256.     RET
  257. ; DELAY routine to control speed.
  258. ;
  259. DELAY    LD    A,(SPEED)
  260. ROUND    CP    0
  261.     RET    Z
  262.     LD    E,A
  263. WAIT1    IN    A,(0CH)
  264.     BIT    5,A
  265.     JR    Z,WAIT1    ;Wait till retrace
  266. WAIT2    IN    A,(0CH)
  267.     BIT    5,A
  268.     JR    NZ,WAIT2 ;Wait till scan.
  269.     LD    A,E
  270.     DEC    A
  271.     JR    ROUND
  272.  
  273.  
  274. ; EDIT routine for editing existing message.
  275.  
  276. EDIT    CALL    INVERS    ;Use inv char as cursor.
  277.     LD    HL,CURSTY
  278.     LD    (HL),NONE
  279.     CALL    CLS
  280.     LD    DE,STRING
  281.     LD    HL,VDU
  282. LOOPA    LD    A,(DE)    ;Now dump string to vdu.
  283.     LD    (HL),A
  284.     CP    0FFH
  285.     JR    Z,GOON1
  286.     INC    HL
  287.     INC    DE
  288.     JR    LOOPA
  289. GOON1    LD    DE,STRING
  290.     LD    HL,VDU
  291. LOOPB    SET    7,(HL)    ;Inverse cursor.
  292.     PUSH    HL
  293.     PUSH    DE
  294.     CALL    GETKEY
  295.     POP    DE
  296.     POP    HL
  297.     RES    7,(HL)    ;Temp turn off cursor.
  298.     CP    13H    ; ctl S ?
  299.     JR    Z,RIGHT    ;Shift cursor right.
  300.     CP    1    ; ctl A ?
  301.     JR    Z,LEFT    ;Shift cursor left.
  302.     CP    8    ; backspace ?
  303.     JR    Z,LEFT
  304.     CP    17H    ; ctl W ?
  305.     JR    Z,WORD    ;Shift curs a word right.
  306.     CP    7FH    ; del ?
  307.     JR    Z,DELETE
  308.     CP    0DH    ; carriage ret ?
  309.     JR    Z,OUT2
  310.     CP    1BH    ; esc ?
  311.     JR    Z,OUT2
  312.     CP    10H    ;^P (=Pause) ?
  313.     JR    Z,INSERT
  314.     CP    20H    ;Ignore all other non-printers.
  315.     JR    C,LOOPB
  316. INSERT    PUSH    DE
  317.     PUSH    HL
  318.     PUSH    AF
  319. ;Now shove the message along to make room for a char.
  320.     LD    A,(DE)
  321. LOOPC    INC    HL
  322.     INC    DE
  323.     LD    C,(HL)
  324.     LD    (DE),A
  325.     LD    (HL),A
  326.     CP    0FFH    ;End of message ?
  327.     JR    Z,GOON4
  328.     LD    A,C
  329.     JR    LOOPC
  330. GOON4    POP    AF
  331.     POP    HL
  332.     POP    DE
  333.     LD    (HL),A    ;Fill gap in vdu
  334.     LD    (DE),A    ;Fill gap in string.
  335.     INC    HL
  336.     INC    DE    ;Move curs along one.
  337.     JP    LOOPB    ;End of Insert routine.
  338. RIGHT    LD    A,(DE)
  339.     CP    0FFH    ;End of string ?
  340.     JR    Z,LOOPB    ;If so do nuthin.
  341.     INC    HL
  342.     INC    DE
  343.     JP    LOOPB
  344. LEFT    LD    A,L    ; HL=VDU ?
  345.     CP    0
  346.     JR    NZ,ON2
  347.     LD    A,H
  348.     CP    0F0H
  349.     JR    Z,LOOPB    ; If HL=VDU, do nuthin.
  350. ON2    DEC    HL
  351.     DEC    DE
  352.     JP    LOOPB
  353. ;WORD moves curs one word to right.
  354. WORD    LD    A,(DE)
  355.     CP    0FFH    ;End of message ?
  356.     JR    Z,LOOPB
  357.     INC    HL
  358.     INC    DE
  359.     LD    A,(DE)
  360.     CP    20H    ;Space ?
  361.     JR    NZ,WORD
  362.     JP    LOOPB
  363. DELETE    PUSH    HL
  364.     PUSH    DE
  365.     LD    B,D
  366.     LD    C,E
  367.     INC    BC    ;BC=DE+1
  368. LOOPD    LD    A,(BC)
  369.     LD    (DE),A
  370.     CP    0FFH
  371.     JR    Z,ON3    ;End of message ?
  372.     INC    DE
  373.     INC    BC
  374.     JR    LOOPD
  375. ON3    LD    B,H
  376.     LD    C,L
  377.     INC    BC    ;BC=HL+1
  378. LOOPE    LD    A,(BC)
  379.     LD    (HL),A
  380.     CP    0FFH    ;End ?
  381.     JR    Z,ON4
  382.     INC    HL
  383.     INC    BC
  384.     JR    LOOPE
  385. ON4    POP    DE
  386.     POP    HL
  387.     JP    LOOPB    ;End of DELETE.
  388.  
  389. OUT2    CALL    LORES
  390.     JP    MENU    ;   END of EDIT
  391.  
  392. MENU    CALL    CLS
  393.     LD    HL,CURSTY
  394.     LD    (HL),NONE
  395. ; Now print the menu, text is MESS03
  396.  
  397.     LD    HL,MESS03
  398. LOOP5    LD    A,(HL)    ;Get character.
  399.     CP    0FFH    ;End of message ?
  400.     JR    Z,LOOP6    ;Yep
  401.     LD    B,A
  402.     INC    HL
  403.     PUSH    HL
  404.     CALL    PRINT
  405.     POP    HL
  406.     JR    LOOP5
  407. LOOP6    CALL    GETKEY    ;  Wait for menu response.
  408.     CP    31H    ;"1" ?
  409.     JR    NZ,CONT9
  410.     CALL    CLS
  411.     JP    RUN
  412. CONT9    CP    32H    ;"2" ?
  413.     JP    Z,EDIT
  414.     CP    33H    ;"3" ?
  415.     JR    NZ,CONT11
  416.     CALL    CLS
  417.     CALL    GETSTR
  418.     JR    MENU
  419. CONT11    CP    34H    ;"4" ?
  420.     JP    Z,TEACH
  421.     JR    LOOP6    ;Loop until valid response.
  422. MESS03    DB    0AH    ;Line feed
  423.     DB    0AH
  424.     DEFM '             Make a selection from the following :'
  425.     DB    0DH
  426.     DB    0AH
  427.     DB    0AH
  428.     DEFM '                  1. Run the message.'
  429.     DB    0DH
  430.     DB    0AH
  431.     DB    0AH
  432.     DEFM '                  2. Edit the message.'
  433.     DB    0DH
  434.     DB    0AH
  435.     DB    0AH
  436.     DEFM '                  3. Type in a new message.'
  437.     DB    0DH
  438.     DB    0AH
  439.     DB    0AH
  440.     DEFM '                  4. List the instructions.'
  441.     DB    0FFH    ;End of message.
  442.  
  443.  
  444. ;    THIS IS THE INSTRUCTION PART...
  445.  
  446. TEACH    CALL    CLS
  447.     LD    HL,MESS04
  448. LOOPF    LD    A,(HL)
  449.     CP    0FFH    ;End ?
  450.     JR    Z,CONT13
  451.     LD    B,A
  452.     PUSH    HL
  453.     CALL    PRINT
  454.     POP    HL
  455.     INC    HL
  456.     JR    LOOPF
  457. CONT13    CALL    GETKEY
  458.     JP    MENU
  459.  
  460. MESS04    DEFM '  * * * * * * * *   I N S T R U C T I O N S   * * * * * * * *'
  461.     DB    0DH
  462.     DB    0AH
  463.     DEFM ' 1.  While the display is running, "S" slows it down, "F"'
  464.     DB    0DH
  465.     DB    0AH
  466.     DEFM '     speeds it up, "SPACE" freezes it, and "ESC" gets you'
  467.     DB    0DH
  468.     DB    0AH
  469.     DEFM '     back to the menu.'
  470.     DB    0DH
  471.     DB    0AH
  472.     DEFM ' 2.  When typing in a new message, all "printing" characters'
  473.     DB    0DH
  474.     DB    0AH
  475.     DEFM '     are accepted. Control characters (Except ^P) ) are ignored.'
  476.     DB    0DH
  477.     DB    0AH
  478.     DEFM '     "control P" causes a pause of about 1/2 second to occur.'
  479.     DB    0DH
  480.     DB    0AH
  481.     DEFM '     "DEL" and "BACKSPACE" function as expected.'
  482.     DB    0DH
  483.     DB    0AH
  484.     DEFM '     "RETURN" and "ESC" terminate the input, and get you menu.'
  485.     DB    0DH
  486.     DB    0AH
  487.     DB    0AH
  488.     DEFM ' 3.  The EDIT facility works just like the Microworld Basic'
  489.     DB    0DH
  490.     DB    0AH
  491.     DEFM '     line editor. Control A,S,W have the same effect of moving'
  492.     DB    0DH
  493.     DB    0AH
  494.     DEFM '     the cursor left,right or skip words right. Typing a'
  495.     DB    0DH
  496.     DB    0AH
  497.     DEFM '     character causes automatic insertion.  The end of message'
  498.     DB    0DH
  499.     DB    0AH
  500.     DEFM '     is indicated by a block figure.    (any key to continue.)'
  501.     DB    0FFH    ;END of MESS04
  502.  
  503. ; BUFFER OF 256 CHARACTERS.
  504. ;
  505. BUFFER    DEFS    100H
  506. ;
  507. ;  DATA = 600Hex = 96*16 BYTES
  508. ;To be inserted after assembly using monitor "M"
  509. ;command, or loading from tape at the address
  510. ;indicated by "DATA" label at end of object listing.
  511. DATA    DEFS    600H
  512. ;
  513. SPEED    DB    0    ;How many frames per step.
  514. ;
  515. ;  POINT is a 16 bit index for string.
  516. ;
  517. POINT    DEFS    2
  518. SUBSTR    DEFS    1    ;1/4 POINTER
  519. STRING    DEFM    'This is " B I L L B O A R D "  by'
  520.     DEFM    '  Rob Askew.            '
  521.     DEFM    'Press " ESC " to interrupt the '
  522.     DEFM    'message and return to the menu......                '
  523.     DEFB    0FFH    ;Message Terminator.
  524.     END
  525.