home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CP/M
/
CPM_CDROM.iso
/
mbug
/
mbug081.arc
/
BBOARD.ASC
< prev
next >
Wrap
Text File
|
1979-12-31
|
10KB
|
525 lines
; **** B I L L B O A R D ****
;
; Rob Askew 12/10/83
;
ORG 4000H ;Change to 900h for 16k bee.
VDU EQU 0F000H
WINDOW EQU 0F180H ;VDU addr of message area.
PRINT EQU 800CH ;VDU print routine.
GETKEY EQU 8006H ;Wait for keypress routine.
INKEY EQU 8009H ;Key pressed ? If so which ?
CURS EQU 010BH ;Current VDU addr of cursor.
CURSTY EQU 0DCH ;Cursor shape byte addr.
BLOCK EQU 0 ;Solid block cursor.
NORM EQU 6FH ;Normal cursor.
NONE EQU 10H ;No cursor.
LORES EQU 8027H ;Lores initialise routine.
INVERS EQU 802AH ;Inverse init routine.
IN CALL LORES
CALL INIT ;Clear buff,print title..
CALL CLS
RUN CALL UPDATE ;Setup buffer.
CALL DELAY
CALL DISPLY ;Buff to VDU window.
CALL INKEY
JR Z,RUN
CP 1BH ;ESC ?
JP Z,MENU ;Yes, get menu.
CP 'F' ;Faster?
JR NZ,NEXT
LD A,(SPEED)
CP 0 ;Speed max?
JR Z,RUN
DEC A
LD (SPEED),A
JR RUN
NEXT CP 'S' ;Slower?
JR NZ,NEXT2
LD A,(SPEED)
INC A
LD (SPEED),A
NEXT2 CP 20H ;Space (for pause)?
CALL Z,GETKEY;Wait for any key to go on.
JR RUN
;Initialise buffer, print title.
INIT CALL CLS
LD HL,CURSTY
LD (HL),NONE
LD HL,WINDOW
LD (CURS),HL
LD HL,MESS01
LOOP2 LD A,(HL)
CP 0FFH ;End of message?
JR Z,CONT1 ;Yep
LD B,A
PUSH HL
CALL PRINT
POP HL
INC HL
JR LOOP2
CONT1 LD HL,BUFFER
LD DE,BUFFER+1
LD BC,100H
LD (HL),80H
LDIR ;Buffer Cleared
LD HL,POINT
LD (HL),0
INC HL
LD (HL),0 ;POINTER INITIALISE
LD HL,SUBSTR
LD (HL),0
CALL GETKEY ;"Any key to cont.."
RET
MESS01 DEFM ' * * * * B I L L B O A R D * * * * '
DB 0DH
DB 0AH
DB 0AH
DB 0AH
DEFM ' Rob Askew October 1983. '
DB 0DH
DB 0AH
DB 0AH
DB 0AH
DEFM ' (Any key to continue...)'
DB 0FFH
; CLear Screen routine.
;
CLS LD B,12 ;FORM FEED
CALL PRINT
RET
; GETSTRing routine for input of message.
;
GETSTR CALL PROMPT
LD HL,CURSTY
LD (HL),NORM
LD DE,STRING
LOOP3 PUSH DE
CALL GETKEY
POP DE
CP 1BH ;ESC ?
JR Z,OUT ;Yep,Exit.
CP 0DH ;CR ?
JR Z,OUT ;CR is end of message flag.
BACKSP CP 8 ; Backspace ?
JR Z,L1
CP 127 ; Delete ?
JR NZ,CONT10
L1 DEC DE
LD B,A
PUSH DE
CALL PRINT
POP DE
JR LOOP3
CONT10 CP 10H ;^P ? (For pause)
JR NZ,CONT12
LD (DE),A ;INSERT PAUSE CODE IN STRING.
PUSH DE
LD B,0A0H
CALL PRINT ; Print a solid block for "pause"
POP DE
INC DE
JR LOOP3
CONT12 CP 20H
JR C,LOOP3 ;Ignore non-printers.
PUSH DE
PUSH AF
LD B,A
CALL PRINT
POP AF
POP DE
LD (DE),A
INC DE
JR LOOP3
OUT LD A,0FFH
LD (DE),A ; End of message flag.
LD A,0
LD (POINT),A ;Set pointers to
LD (SUBSTR),A ;start of message.
CALL CLS
RET
; PROMPT routine for input...
;
PROMPT CALL CLS
LD HL,CURSTY
LD (HL),NORM
LD HL,MESS02
LOOP4 LD A,(HL)
CP 0FFH ;Message end ?
RET Z ;Yep
LD B,A
PUSH HL
CALL PRINT
POP HL
INC HL
JR LOOP4
MESS02 DEFM ' Start typing your message...end it with "RETURN"... >'
DB 0FFH
; UPDATE Routine to move buffer along.
;
UPDATE LD DE,BUFFER
LD HL,BUFFER+1
LD BC,100H
LDIR ; All moved along.
;Now generate right hand edge.
LD DE,(POINT) ;DE=String Pointer
BACK LD HL,STRING
ADD HL,DE
LD A,(HL) ;A=Current Char.
CP 0FFH ;End of message ?
JR NZ,CONT3;NO
LD HL,0 ;YES,START AT BEGINNING.
LD (POINT),HL
LD DE,0
JR BACK
CONT3 CP 10H ;^P ?
JR NZ,CONT14;NO
CALL PAUSE ;YES, WAIT AWHILE.
INC DE ;Point at next char.
LD (POINT),DE
JR BACK
CONT14 SUB 20H ;Sub 32 because
LD B,0 ;non-printing chars
SLA A ;not catered for.
RL B
SLA A
RL B
SLA A
RL B
SLA A
RL B
LD C,A ;BC=(ASC-32)*16
LD HL,DATA
ADD HL,BC ;HL=:A lores data.
LD BC,SUBSTR
LD A,(BC) ;A= which 1/4 of char.
ADD A,L
LD L,A
JR NC,CONT4
INC H ;HL=:A correct 1/4 of data.
CONT4 PUSH HL
LD A,(BC) ;A= 1/4 POINTER
INC A
AND 3
LD (BC),A ;INC 1/4 POINTER & SAVE
JR NZ,CONT5;INC STRING POINTER
LD HL,POINT;IF 1/4 POINTER
LD E,(HL) ;CROSSES ZERO.
INC HL
LD D,(HL)
INC DE
LD (HL),D
DEC HL
LD (HL),E
CONT5 POP HL
; Now generate RH edge.
LD B,4
LD DE,BUFFER+3FH ;DE=:A RH edge
GEN LD A,(HL)
LD (DE),A
LD A,4
ADD A,L
LD L,A
JR NC,CONT6
INC H ;HL=:A next lores ch.
CONT6 LD A,40H
ADD A,E
LD E,A
JR NC,CONT7
INC D ;DE=:A next buffer line.
CONT7 DJNZ GEN
RET
PAUSE PUSH BC
LD C,0FFH
OUTER LD B,0FFH
INNER DJNZ INNER
DEC C
JR NZ,OUTER
POP BC
RET
;DISPLAY ROUTINE DUMPS BUFFER ONTO SCREEN.
;
DISPLY LD HL,BUFFER
LD DE,WINDOW
LD BC,100H
WAIT IN A,(0CH) ;VDU driver register.
BIT 5,A ;Is vert retrace on?
JR Z,WAIT ;NO
LDIR
RET
; DELAY routine to control speed.
;
DELAY LD A,(SPEED)
ROUND CP 0
RET Z
LD E,A
WAIT1 IN A,(0CH)
BIT 5,A
JR Z,WAIT1 ;Wait till retrace
WAIT2 IN A,(0CH)
BIT 5,A
JR NZ,WAIT2 ;Wait till scan.
LD A,E
DEC A
JR ROUND
; EDIT routine for editing existing message.
EDIT CALL INVERS ;Use inv char as cursor.
LD HL,CURSTY
LD (HL),NONE
CALL CLS
LD DE,STRING
LD HL,VDU
LOOPA LD A,(DE) ;Now dump string to vdu.
LD (HL),A
CP 0FFH
JR Z,GOON1
INC HL
INC DE
JR LOOPA
GOON1 LD DE,STRING
LD HL,VDU
LOOPB SET 7,(HL) ;Inverse cursor.
PUSH HL
PUSH DE
CALL GETKEY
POP DE
POP HL
RES 7,(HL) ;Temp turn off cursor.
CP 13H ; ctl S ?
JR Z,RIGHT ;Shift cursor right.
CP 1 ; ctl A ?
JR Z,LEFT ;Shift cursor left.
CP 8 ; backspace ?
JR Z,LEFT
CP 17H ; ctl W ?
JR Z,WORD ;Shift curs a word right.
CP 7FH ; del ?
JR Z,DELETE
CP 0DH ; carriage ret ?
JR Z,OUT2
CP 1BH ; esc ?
JR Z,OUT2
CP 10H ;^P (=Pause) ?
JR Z,INSERT
CP 20H ;Ignore all other non-printers.
JR C,LOOPB
INSERT PUSH DE
PUSH HL
PUSH AF
;Now shove the message along to make room for a char.
LD A,(DE)
LOOPC INC HL
INC DE
LD C,(HL)
LD (DE),A
LD (HL),A
CP 0FFH ;End of message ?
JR Z,GOON4
LD A,C
JR LOOPC
GOON4 POP AF
POP HL
POP DE
LD (HL),A ;Fill gap in vdu
LD (DE),A ;Fill gap in string.
INC HL
INC DE ;Move curs along one.
JP LOOPB ;End of Insert routine.
RIGHT LD A,(DE)
CP 0FFH ;End of string ?
JR Z,LOOPB ;If so do nuthin.
INC HL
INC DE
JP LOOPB
LEFT LD A,L ; HL=VDU ?
CP 0
JR NZ,ON2
LD A,H
CP 0F0H
JR Z,LOOPB ; If HL=VDU, do nuthin.
ON2 DEC HL
DEC DE
JP LOOPB
;WORD moves curs one word to right.
WORD LD A,(DE)
CP 0FFH ;End of message ?
JR Z,LOOPB
INC HL
INC DE
LD A,(DE)
CP 20H ;Space ?
JR NZ,WORD
JP LOOPB
DELETE PUSH HL
PUSH DE
LD B,D
LD C,E
INC BC ;BC=DE+1
LOOPD LD A,(BC)
LD (DE),A
CP 0FFH
JR Z,ON3 ;End of message ?
INC DE
INC BC
JR LOOPD
ON3 LD B,H
LD C,L
INC BC ;BC=HL+1
LOOPE LD A,(BC)
LD (HL),A
CP 0FFH ;End ?
JR Z,ON4
INC HL
INC BC
JR LOOPE
ON4 POP DE
POP HL
JP LOOPB ;End of DELETE.
OUT2 CALL LORES
JP MENU ; END of EDIT
MENU CALL CLS
LD HL,CURSTY
LD (HL),NONE
; Now print the menu, text is MESS03
LD HL,MESS03
LOOP5 LD A,(HL) ;Get character.
CP 0FFH ;End of message ?
JR Z,LOOP6 ;Yep
LD B,A
INC HL
PUSH HL
CALL PRINT
POP HL
JR LOOP5
LOOP6 CALL GETKEY ; Wait for menu response.
CP 31H ;"1" ?
JR NZ,CONT9
CALL CLS
JP RUN
CONT9 CP 32H ;"2" ?
JP Z,EDIT
CP 33H ;"3" ?
JR NZ,CONT11
CALL CLS
CALL GETSTR
JR MENU
CONT11 CP 34H ;"4" ?
JP Z,TEACH
JR LOOP6 ;Loop until valid response.
MESS03 DB 0AH ;Line feed
DB 0AH
DEFM ' Make a selection from the following :'
DB 0DH
DB 0AH
DB 0AH
DEFM ' 1. Run the message.'
DB 0DH
DB 0AH
DB 0AH
DEFM ' 2. Edit the message.'
DB 0DH
DB 0AH
DB 0AH
DEFM ' 3. Type in a new message.'
DB 0DH
DB 0AH
DB 0AH
DEFM ' 4. List the instructions.'
DB 0FFH ;End of message.
; THIS IS THE INSTRUCTION PART...
TEACH CALL CLS
LD HL,MESS04
LOOPF LD A,(HL)
CP 0FFH ;End ?
JR Z,CONT13
LD B,A
PUSH HL
CALL PRINT
POP HL
INC HL
JR LOOPF
CONT13 CALL GETKEY
JP MENU
MESS04 DEFM ' * * * * * * * * I N S T R U C T I O N S * * * * * * * *'
DB 0DH
DB 0AH
DEFM ' 1. While the display is running, "S" slows it down, "F"'
DB 0DH
DB 0AH
DEFM ' speeds it up, "SPACE" freezes it, and "ESC" gets you'
DB 0DH
DB 0AH
DEFM ' back to the menu.'
DB 0DH
DB 0AH
DEFM ' 2. When typing in a new message, all "printing" characters'
DB 0DH
DB 0AH
DEFM ' are accepted. Control characters (Except ^P) ) are ignored.'
DB 0DH
DB 0AH
DEFM ' "control P" causes a pause of about 1/2 second to occur.'
DB 0DH
DB 0AH
DEFM ' "DEL" and "BACKSPACE" function as expected.'
DB 0DH
DB 0AH
DEFM ' "RETURN" and "ESC" terminate the input, and get you menu.'
DB 0DH
DB 0AH
DB 0AH
DEFM ' 3. The EDIT facility works just like the Microworld Basic'
DB 0DH
DB 0AH
DEFM ' line editor. Control A,S,W have the same effect of moving'
DB 0DH
DB 0AH
DEFM ' the cursor left,right or skip words right. Typing a'
DB 0DH
DB 0AH
DEFM ' character causes automatic insertion. The end of message'
DB 0DH
DB 0AH
DEFM ' is indicated by a block figure. (any key to continue.)'
DB 0FFH ;END of MESS04
; BUFFER OF 256 CHARACTERS.
;
BUFFER DEFS 100H
;
; DATA = 600Hex = 96*16 BYTES
;To be inserted after assembly using monitor "M"
;command, or loading from tape at the address
;indicated by "DATA" label at end of object listing.
DATA DEFS 600H
;
SPEED DB 0 ;How many frames per step.
;
; POINT is a 16 bit index for string.
;
POINT DEFS 2
SUBSTR DEFS 1 ;1/4 POINTER
STRING DEFM 'This is " B I L L B O A R D " by'
DEFM ' Rob Askew. '
DEFM 'Press " ESC " to interrupt the '
DEFM 'message and return to the menu...... '
DEFB 0FFH ;Message Terminator.
END