;*; Updated on 13-Sep-89 at 7:01 AM by Steve Archuleta; edit time: 0:02:27
;*************************** AMUS Program Label ******************************
; Filename: BANNER.M68 Date: 09/13/89
; Category: UTIL Hash Code: 161-642-316-160 Version: 1.0
; Initials: Name: JEFF STUYVESANT
; Company: Telephone #:
; Related Files:
; Min. Op. Sys.: Expertise Level: BEG
; Special:
; Description: Allows user to create a scrolling banner on the screen.
; Usage: BANNER window-size loop-count delay-factor string
; Note that string must be larger than window-size for banner to work.
;*****************************************************************************
; BANNER.LIT
; VER 1.0 8510.20
;
; 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
;
;
; BANNER WILL TURN OFF THE CURSOR AND SCROLL THE MESSAGE AT PRESENT
; LOCATION OF THE CURSOR. IF ANY PARAMETER IS IN ERROR A MESSAGE
; WILL BE DISPLAYED.
;
; EX.
;
; BANNER 15 5 20 THIS IS AN EXAMPLE
; -- - -- -----------------
; ^ ^ ^ ^
; | | | +-----------> THE MESSAGE
; | | +--------------------> RELATIVE DELAY FACTOR FORM 1 TO 100 (FAST TO SLOW)
; | +-----------------------> LOOP COUNT (NUMBER OF REV'S)
; +-------------------------> WINDOW SIZE (MUST BE EQUAL TO OR LESS THEN MESSAGE LENGTH)
;
; SET UP REGISTRERS
;
; GIVEN A2=INPUT LINE STRING
;
; GET WINDOW LENGTH FIRST
BYP ; BYPASS ANY BLANKS IN INPUT LINE
GTDEC ; GET A DECIMAL NUMBER THERE
BPL CONT ; IF NEG NO GOOD NUMBER
WINERR: MOV #1,D1 ; NO GOOD / MOV PARAMETER # ->D1
JMP ERROR$ ; GOTO ERROR
CONT: MOV D1,D5 ; SAVE WINDOW SIZE
BEQ WINERR ; IF WIN SIZE=0 NO GOOD
CMPW D5,#78. ; MAX SIZE=78
BGT WINERR ; IF WIN SIZE>78 -->WINERR
; GET LOOP COUNT NEXT
BYP ; BYPASS THE NEXT BLANKS
GTDEC ; AND GET A DECIMAL NUMBER THERE
BMI 15$ ; IF NEG NO GOOD NUMBER
MOV D1,D3 ; MOV ->D3
BNE 20$ ; IF #0 -->20$
15$: MOVB #2,D1 ; =0 NO GOOD / MOV PARAMETER # ->D1
JMP ERROR$
; GET DELAY FACTOR
20$: BYP ; BYPASS ANY BLANKS
GTDEC ; ANOTHER DECIMAL NUMBER
BMI 25$ ; IF NEG NO GOOD NUMBER
MOV D1,D0 ; MOV ->D0
BNE 30$ ; IF #0 -->30$
25$: MOVB #3,D1 ; =0 NO GOOD / MOV PARAMETER #->D1
JMP ERROR$
; THE BELOW CALCS A DELAY FACTER RESLITVE TO THE NUMBER OF CHARACTERS
; IN THE ACTUAL STRING
30$: CMPW D0,#100. ; MAX 100 RELATIVE SCROLL COUNT
BGT 25$ ; BR IF GREATER THAN
MOVW #405.,D1 ; SET BASE NUMBER
MOVW D5,D2 ; SAVE # OF CHARACTERS
MUL D2,#5. ; MUL #23
SUBW D2,D1 ; CALC RELATIVE VALUE
MUL D0,#20. ; CALC DELAY RELATIVE FACTOR
ADDW D1,D0 ; CALC ACTUAL DELAY AS CLOCK TICKS
; WORK ON STRING NEXT
STRING: BYP ; SET A2= BASE ADDR OF STRING
MOV A2,A1 ; SAVE BASE ADDR
10$: LIN ; CHK FOR EOL
BEQ 20$
INC A2 ; SKIP AHEAD
BR 10$
20$: SUB #1,A2 ; SUB ONE FOR ZERO INDEXED
MOV A2,D1 ; MOV TO DATA REGISTER
MOV A2,A4 ; SAVE END OF STRING
SUB A1,D1 ; CALC STR LENGTH
BNE 40$ ; IF #0 OK
30$: MOVB #4,D1 ; =0 NO GOOD / MOV PARAMETER # ->D1
JMP ERROR$
40$: CMP D5,D1 ; CHK WINDOW LENGTH<= STRING LENGTH
BGT WINERR ; IF GREATER THAN NO GOOD
MOV A1,A2 ; SET UP SHIFTING ADDR 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
MOV #29.+177400,D1 ;TURN CURSOR OFF
TCRT
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: MOV #28.+177400,D1 ; TURN CURSOR ON
TCRT
EXIT ; 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 (LEFT ARROW)
BYTE 8.,0
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>
CRLF
CRLF
TYPECR < #1 = Window size>
TYPECR < #2 = Loop Count>
TYPECR < #3 = Delay Factor (1-100)>
TYPECR < #4 = String>
ERR$: SLEEP #10000. ; INSURE THEY WILL SEE THIS MESSAGE
EXIT