;*; 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) ; SEARCH SYS SEARCH SYSSYM SEARCH TRM RADIX 8. VMAJOR = 1. VMINOR = 0. VSUB = 0. VEDIT = 0. VWHO = 0. PHDR -1,0,PH$REE!PH$REU BEGIN: ; 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 END