; BANER.SBR
; VER 1.0 8510.20
;
; ALLOWS USER TO MAKE A SCROLLING BANNER ON SCREEN
;
; PROPRIETARY PROGRAM MATERIAL
;
; THIS MATERIAL IS THE PROPERTY OF JEFF STUYVESANT,
; 12307 PACIFIC AVE, APT 2,MAR VISTA, CALIF. ,90066
; PERMISSION TO COPY AND USE IS GRANTED FOR
; NON-PROFIT USES ONLY.
;
; Copyright (c) 1985 JEFF STUYVESANT
MOVW #324.,D1 ; SET BASE NUMBER
MOVW D5,D2 ; SAVE # OF CHARACTERS
MUL D2,#4. ; MUL #23
SUBW D2,D1 ; CALC RELATIVE VALUE
MUL D0,#15. ; CALC DELAY RELATIVE FACTOR
ADDW D1,D0 ; CALC ACTUAL DELAY AS CLOCK TICKS
MOV A1,A2 ; SET SHIFTING STRING BASE= CONSTANT STRING BASE
; THIS SECTION DOSE THE WORK
; TO START
; A0= TEMP WORK REGISTER D0= DELAY (CLOCK TICKS)
; A1= STRING BASE ADDR (CONSTANT) D1= CHARACTER TO BE OUTPUT
; A2= " " " (SHIFTING) D2= CHARACTERS TO OUTPUT (QTY)
; A3= PARAMETER BASE ADDR D3= LOOP COUNT
; A4= STRING END ADDR D4= TEMP WORK REGISTER
; A5= D5= WINDOW LENGTH
PARTA: MOV A4,D2 ; COPY STR END
ADD #1,D2 ; ADD 1 FOR ZERO RELATIVE
SUB A2,D2 ; CALC CHARACTERS LEFT IN STRING
CMP D5,D2 ; CMP W/WINDOW SIZE
BGE 10$ ; IF WIN SIZE>CHAR LEFT
MOV D5,D2 ; FORCE (WINDOW LENGTH) CHARACTERS OUTPUT ->D2
10$: MOV A2,A0 ; SET A0=ADDR OF FIRST CHAR TO BE OUTPUT FOR SBR CALL
MOV D2,D4 ; SET D4=CHAR COUNT FOR SBR CALL
CALL TYPWIN ; CALL SBR TO OUTPUT STRING
CMP D2,D5 ; TEST FOR PARTIAL WINDOW PRINTED (IE CHAR OUTPUT< WINDOW SIZE)
JGE LOPEND ; IF GT OR EQ DO NEXT
; ONLY A PARTIAL WINDOW WAS OUTPUT NOW OUTPUT THE REST (WHICH IS AT THE BEGINING OF THE STRING)
MOV D5,D4 ; GET COPY OF TRUE WINDOW LENGTH ->D4
SUB D2,D4 ; SUBTRACT QTY OF CHAR ALREADY OUTPUT
; ->D4 =QTY OF CHAR REMAINING TO BE OUTPUT
MOV A1,A0 ; SET A0=ADDR OF FIRST CHAR TO BE OUTPUT FOR SBR CALL
CALL TYPWIN ; CALL SBR TO OUTPUT STRING
LOPEND: CTRLC ALLOVR ; TEST FOR ^C
SLEEP D0 ; SLEEP FOR CLOCK TICKS IN D0
CALL BACKUP ; SBR TO POSITION CURSOR AT BEGINING OF WINDOW
INC A2 ; INC SHIFTING STR BASE ADDR
CMP A2,A4 ; CMP NEW TEMP BASE ADDR W/ STR END ADDR
BLE PARTA ; IF NEW STR BASE<=STR END DO IT AGAIN
RESET: DEC D3 ; DEC LOOP COUNT
BLE ALLOVR ; IF LOOP COUNT=0 WE'RE FINISHED
MOV A1,A2 ; RESET SHIFTING BASE=TRUE STRING BASE
BR PARTA ; DO ANOTHER LOOP
ALLOVR: RTN ; WE ARE FINISHED GO BACK TO BASIC
; SBR TO OUTPUT A STRING INDEXED
WINLOP: MOVB (A0)+,D1 ; MOV CHAR TO BE OUTPUT TO D1
TOUT ; SPIT IT OUT
TYPWIN: DBF D4,WINLOP ; DEC BRANCH COUNT / FINISH IF =0
RTN ; GO BACK
; SBR TO BACKUP TO BEGINING OF STRING
BACKUP: MOV D5,D2 ; SET BACKUP COUNT ->D2
SUB #1.,D2 ; PRE-DEC FOR DBF
10$: TTYI ; OUTPUT #8 DECIMAL (BACKSPACE)
BYTE 8.,0
EVEN
DBF D2,10$ ; DEC BRANCH COUNT / FIN IF =0
RTN
ASCII / Copyright (c) 1985 JEFF STUYVESANT/
EVEN
; ERROR PRINTING RTN
ERROR$: TYPE <Parameter #>
DCVT 0,OT$TRM!OT$LSP!OT$TSP ; OUTPUT PARAMETER # AS DECIMAL W/LEAD SP & TRAIL SP
TYPE <is in ERROR>
ERR$: SLEEP #10000. ; INSURE THEY WILL SEE THIS MESSAGE
RTN