; **** 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