diff --git a/SCROLLING.dsk b/SCROLLING.dsk new file mode 100644 index 0000000..136cb78 Binary files /dev/null and b/SCROLLING.dsk differ diff --git a/scrollingtext.s b/scrollingtext.s new file mode 100644 index 0000000..71e5557 --- /dev/null +++ b/scrollingtext.s @@ -0,0 +1,284 @@ + DSK SCROLL + +************************************************** +* To Do: +* +************************************************** +* Variables +************************************************** + +CHAR EQU $FC ; char/pixel to plot +TEXTSCROLL1 EQU $06 ; which note to play +TEXTSCROLL2 EQU $04 ; duration of note +TEXTSCROLL3 EQU $05 ; frequency/interclick delay +TEXTSCROLL4 EQU $03 ; ASCII "wave" progress/offset +TEXTSCROLL5 EQU $02 ; "instructions" string offset +TEXTSCROLL6 EQU $00 +TEXTSCROLL7 EQU $01 +TEXTSCROLL8 EQU $07 ; scrolling text offset pixels +TEXTSCROLLEND EQU $08 ; textscroll + #$28 + +************************************************** +* Apple Standard Memory Locations +************************************************** +CLRLORES EQU $F832 +LORES EQU $C050 +TXTSET EQU $C051 +MIXCLR EQU $C052 +MIXSET EQU $C053 +TXTPAGE1 EQU $C054 +TXTPAGE2 EQU $C055 +KEY EQU $C000 +C80STOREOFF EQU $C000 +C80STOREON EQU $C001 +STROBE EQU $C010 +SPEAKER EQU $C030 +VBL EQU $C02E +RDVBLBAR EQU $C019 ;not VBL (VBL signal low +WAIT EQU $FCA8 +RAMWRTAUX EQU $C005 +RAMWRTMAIN EQU $C004 +SETAN3 EQU $C05E ;Set annunciator-3 output to 0 +SET80VID EQU $C00D ;enable 80-column display mode (WR-only) +HOME EQU $FC58 ; clear the text screen +CH EQU $24 ; cursor Horiz +CV EQU $25 ; cursor Vert +VTAB EQU $FC22 ; Sets the cursor vertical position (from CV) +COUT EQU $FDED ; Calls the output routine whose address is stored in CSW, + ; normally COUTI +STROUT EQU $DB3A ;Y=String ptr high, A=String ptr low + +ALTTEXT EQU $C055 +ALTTEXTOFF EQU $C054 + +ROMINIT EQU $FB2F +ROMSETKBD EQU $FE89 +ROMSETVID EQU $FE93 + +ALTCHAR EQU $C00F ; enables alternative character set - mousetext + +BLINK EQU $F3 + + ORG $2000 ; PROGRAM DATA STARTS AT $2000 + +************************************************** +* START - sets up various fiddly zero page bits +************************************************** + + LDA #$00 ; reset the string and wave offsets for drawing text + STA CHAR + LDA #$32 + STA TEXTSCROLL1 + STA TEXTSCROLL2 + STA TEXTSCROLL3 + STA TEXTSCROLL4 + STA TEXTSCROLL5 + STA TEXTSCROLL6 + STA TEXTSCROLL7 + STA TEXTSCROLL8 + LDA #$33 + STA TEXTSCROLLEND + +DRAWBOARD JSR HOME ; clears the main text screen + STA LORES + + JSR FILLSCREENFAST + + +MAINLOOP + JSR SCROLLINGTEXT + + JMP MAINLOOP + + + +* put scrolling text at $528,$5a8 40 pixels at a time, offset by TEXTSCROLL +SCROLLINGTEXT + LDY TEXTSCROLL1 + LDX #$00 + +SCROLLTEXT LDA SCROLLING,Y + STA $400,X + LDA SCROLLING2,Y + STA $480,X + INY + INX + TXA + CMP #$28 + BCC SCROLLTEXT ; draw 40 characters across + + INC TEXTSCROLL1 ; increment offset for next pass + + LDA TEXTSCROLL1 ; compare offset to 50 + CMP TEXTSCROLLEND + BEQ SETUPTEXT2 + + RTS ; return if less than 50 iterations. + +SETUPTEXT2 LDA #$00 + STA TEXTSCROLL1 ; reset offset if over 50 + INC TEXTSCROLL2 ; increment next scroller's offset + + + LDY TEXTSCROLL2 + LDX #$00 + +SCROLLTEXT2 LDA SCROLLING,Y + CLC + ADC #$11 + STA $600,X + LDA SCROLLING2,Y + CLC + ADC #$11 + STA $680,X + INY + INX + TXA + CMP #$28 + BCC SCROLLTEXT2 + + LDA TEXTSCROLL2 ; compare offset to 50 + CMP TEXTSCROLLEND + BEQ SETUPTEXT3 + + RTS + +SETUPTEXT3 LDA #$00 + STA TEXTSCROLL2 ; reset offset if over 50 + INC TEXTSCROLL3 ; increment next scroller's offset + + LDY TEXTSCROLL3 + LDX #$00 + +SCROLLTEXT3 LDA SCROLLING,Y + CLC + ADC #$22 + STA $428,X + LDA SCROLLING2,Y + CLC + ADC #$22 + STA $4a8,X + INY + INX + TXA + CMP #$28 + BCC SCROLLTEXT3 + + LDA TEXTSCROLL3 ; compare offset to 50 + CMP TEXTSCROLLEND + BEQ SETUPTEXT4 + RTS + +SETUPTEXT4 LDA #$00 + STA TEXTSCROLL3 ; reset offset if over 50 + INC TEXTSCROLL4 ; increment next scroller's offset + + LDY TEXTSCROLL4 + LDX #$00 + +SCROLLTEXT4 LDA SCROLLING,Y + CLC + ADC #$33 + STA $628,X + LDA SCROLLING2,Y + CLC + ADC #$33 + STA $6a8,X + INY + INX + TXA + CMP #$28 + BCC SCROLLTEXT4 + + LDA TEXTSCROLL4 ; compare offset to 50 + CMP TEXTSCROLLEND + BEQ SETUPTEXT5 + RTS + +SETUPTEXT5 LDA #$00 + STA TEXTSCROLL4 ; reset offset if over 50 + INC TEXTSCROLL5 ; increment next scroller's offset + + LDY TEXTSCROLL5 + LDX #$00 + +SCROLLTEXT5 LDA SCROLLING,Y + CLC + ADC #$44 + STA $450,X + LDA SCROLLING2,Y + CLC + ADC #$44 + STA $4d0,X + INY + INX + TXA + CMP #$28 + BCC SCROLLTEXT5 + + LDA TEXTSCROLL5 ; compare offset to 50 + CMP TEXTSCROLLEND + BEQ SETUPTEXT6 + RTS + +SETUPTEXT6 LDA #$00 + STA TEXTSCROLL5 ; reset offset if over 50 + INC TEXTSCROLL6 ; increment next scroller's offset + + LDY TEXTSCROLL6 + LDX #$00 + +SCROLLTEXT6 LDA SCROLLING,Y + CLC + ADC #$55 + STA $650,X + LDA SCROLLING2,Y + CLC + ADC #$55 + STA $6d0,X + INY + INX + TXA + CMP #$28 + BCC SCROLLTEXT6 + + LDA TEXTSCROLL6 ; compare offset to 50 + CMP TEXTSCROLLEND + BEQ SETUPTEXT7 + RTS + +SETUPTEXT7 LDA #$00 + STA TEXTSCROLL6 ; reset offset if over 50 + RTS + +************************************************** +* blanks the screen quickly. +* https://www.atarimagazines.com/compute/issue10/032_1_THE_APPLE_GAZETTE.php +************************************************** +FILLSCREENFAST ; 6023 instructions + +FLASH LDA CHAR ; Get selected color byte + LDY #$78 ; #$78 Prepare to fill 120 bytes + JSR FILL1 ; Fill four sets of 120 bytes each + LDY #$78 ; Prepare to fill 80 bytes + JSR FILL2 ; Fill four sets of 80 bytes each + RTS ; Done. Return. +FILL1 DEY + STA $400, Y + STA $480, Y + STA $500, Y + STA $580, Y + BNE FILL1 + RTS +FILL2 DEY + STA $600, Y + STA $680, Y + STA $700, Y + STA $780, Y + BNE FILL2 + RTS + +************************************************** + +SCROLLING HEX 55,05,00,55,05,05,00,55,05,55,00,55,05,55,00,55,00,00,00,55,00,00,00,55,00,55,05,55,00,55,05,05,00,00,05,55,05,00,55,05,05,00,05,50,05,00,05,55,05,00,00,55,05,00,55,05,05,00,55,05,55,00,55,05,55,00,55,00,00,00,55,00,00,00,55,00,55,05,55,00,55,05,05,00,00,05,55,05,00,55,05,05,00,05,50,05,00,05,55,05,00,00 +SCROLLING2 HEX 50,55,00,55,50,50,00,55,05,50,00,55,50,55,00,55,50,50,00,55,50,50,00,55,00,55,00,55,00,55,50,55,00,00,00,55,00,00,55,55,50,00,50,05,50,00,00,55,00,00,00,50,55,00,55,50,50,00,55,05,50,00,55,50,55,00,55,50,50,00,55,50,50,00,55,00,55,00,55,00,55,50,55,00,00,00,55,00,00,55,55,50,00,50,05,50,00,00,55,00,00,00