Commit 5868f6fd authored by Flaxo's avatar Flaxo
Browse files

added readme for 'runningtext'. included compiled and tested examples.

parent 8d3fd206
# Scroller
Textscroller oder Laufschriften sind einer der essenziellen Effekte in
der Demo-Koderei. Die Bandbreite geht hier von einfachem von rechts
nach links laufendem text bis hin zu sogenannten SIN- (Sinus)
Scrollern, bei denen die Buchstaben ein einer Bewegungsrichtung hin
und her tanzen.
Eine schöne Einführung gibt es bei der ["Codebase
64"](https://codebase64.org/doku.php?id=base:text_scroll)
5 print "{clr}";
10 a$="hallo welt das ist ein ganz toller scroller mit einem ganz wesentlichen inhalt. eigentlich muessten jetzt hier etwas total bahnbrechnedes stehen aber mir faellt nix ein"
20 for t=1 to len(a$)-40
30 print "{home}" mid$(a$,t,39);
40 for d=1 to 100 :next d
50 next t
60 goto 20
\ No newline at end of file
;;; softscroll
;;; If you want to do a smooth scroll two pixel steps or 1 pixel steps
;;; are desirable. This is done using the soft-scroll register $d016
;;; (for a detailed description look: https://sh.scs-trc.net/vic/). If
;;; you want to scroll left you start with $x7 in $d016 and decrease
;;; that value every frame. After 8 times you reset this register to its
;;; start value and move all characters one byte backwards using the
;;; according one of above scroll routines.
;;; https://codebase64.org/doku.php?id=base:text_scroll
!cpu 6510
!to "leftright.prg",cbm
*= $c000
Q = 2
XPIXSHIFT = 4
TMP1 = 5
TEXTADR = 6
SCRLADR = $0400
JSR $E544
SEI
TEXTRESTART
LDA #<TEXT
STA TEXTADR
LDA #>TEXT
STA TEXTADR+1
LOOP INC $d012
BNE LOOP
DESTSTART = *+1
LDX #39;39
SRCSTART = *+1
LDY #39;37
XPIXSHIFTADD
DEC XPIXSHIFT
LDA XPIXSHIFT
AND #7
STA $D016
CMP XPIXSHIFT
STA XPIXSHIFT
BEQ LOOP
LDA SCRLADR,Y
STA TMP1
LDA SCRLADR-1,Y
PHA
S
LDA TMP1
STA SCRLADR-1,X
PLA
STA TMP1
LDA SCRLADR-2,Y
PHA
DEY
DEX
BNE S
PLA
GETNEWCHAR
;TEXTADR = *+1
LDA (TEXTADR,X)
BEQ TEXTRESTART
INY
BMI *+4
LDX #$27
NOBEGIN INC TEXTADR
BNE *+4
INC TEXTADR+1
TAY
BMI DIRCHANGE
STA SCRLADR,X
BPL LOOP
;---------------------------------------
DIRCHANGE LDA XPIXSHIFTADD
EOR #$20
STA XPIXSHIFTADD
LDX DESTSTART
LDY SRCSTART
DEX
INY
STX SRCSTART
STY DESTSTART
BNE LOOP ; $106b
;---------------------------------------
TEXT !scr " this scroller can"
!scr " scroll in forward"
!scr " and backward direc"
!scr "tion! "
!scr " "
!scr " "
!byte $ff
!scr "won gnillorcs morf "
!scr "tfel ot thgir ... "
!scr " "
!scr " "
!byte $ff,0
; Program: Single row scroll loop
; Author: Andrew Burch
; Site: www.0xc64.com
; Assembler: win2c64
; Notes: Use $d016 to scroll the single row
; 8 pixels for a 1x1 text scroller
; added colour to head and tail of text row
;
;; ACME Assembler
!to "withfade.prg", cbm ; name of output, type of assembly
!cpu 6510 ; type of cpu
* = $c000
lda #00 ; black sceen & background
sta $d020
sta $d021
plotcolour: ldx #40 ; init colour map
lda #01
sta $dbc0, x
dex
bpl plotcolour+4
sei ; set up interrupt
lda #$7f
sta $dc0d ; turn off the CIA interrupts
sta $dd0d
and $d011 ; clear high bit of raster line
sta $d011
ldy #00 ; trigger on first scan line
sty $d012
lda #<noscroll ; load interrupt address
ldx #>noscroll
sta $0314
stx $0315
lda #$01 ; enable raster interrupts
sta $d01a
cli
rts ; back to BASIC
noscroll: lda $d016 ; default to no scroll on start of screen
and #248 ; mask register to maintain higher bits
sta $d016
ldy #242 ; trigger scroll on last character row
sty $d012
lda #<scroll ; load interrupt address
ldx #>scroll
sta $0314
stx $0315
inc $d019 ; acknowledge interrupt
jmp $ea31
scroll: lda $d016 ; grab scroll register
and #248 ; mask lower 3 bits
adc offset ; apply scroll
sta $d016
dec smooth ; smooth scroll
bne continue
dec offset ; update scroll
bpl resetsmooth
lda #07 ; reset scroll offset
sta offset
shiftrow: ldx #00 ; shift characters to the left
lda $07c1, x
sta $07c0, x
inx
cpx #39
bne shiftrow+2
ldx nextchar ; insert next character
lda message, x
sta $07e7
inx
lda message, x
cmp #$ff ; loop message
bne resetsmooth-3
ldx #00
stx nextchar
resetsmooth: ldx #01 ; set smoothing
stx smooth
ldx offset ; update colour map
lda colours, x
sta $dbc0
lda colours+8, x
sta $dbc1
lda colours+16, x
sta $dbe6
lda colours+24, x
sta $dbe7
continue: ldy #00 ; trigger on first scan line
sty $d012
lda #<noscroll ; load interrupt address
ldx #>noscroll
sta $0314
stx $0315
inc $d019 ; acknowledge interrupt
jmp $ea31
offset: !byte 07 ; start at 7 for left scroll
smooth: !byte 01
nextchar: !byte 00
message: !byte 045, 045, 061, 032, 049, 032, 024, 032
!byte 049, 032, 020, 005, 024, 020, 032, 019
!byte 003, 018, 015, 012, 012, 005, 018, 032
!byte 002, 025, 032, 010, 005, 019, 004, 005
!byte 018, 032, 000, 032, 023, 023, 023, 046
!byte 048, 024, 003, 054, 052, 046, 003, 015
!byte 013, 032, 061, 045, 045, 032, 032, 032
!byte 032, 032, 032, 032, 032, 032, 032, 255
colours: !byte 00, 00, 00, 00, 06, 06, 06, 06
!byte 14, 14, 14, 14, 03, 03, 03, 03
!byte 03, 03, 03, 03, 14, 14, 14, 14
!byte 06, 06, 06, 06, 00, 00, 00, 00
1 REM LULU DIKTIERT FLAXO TIPPT
5 W=40:A=53270:S$=" HELLO "
10 POKE A,PEEK(A) AND 247 :REM GO INTO 38 COL MODE
20 PRINT CHR$(147) :REM CLEAR THE SCREEN
30 FOR X=1 TO W-2:PRINT "{RGHT}"; :NEXT :REM MOVE THE CURSOR TO THE RIGHT
40 POKE A,(PEEK(A)AND 248)+7 :PRINT;:REM POSITION FOR 1ST SCROLL
42 IF LEN(S$)<2 THEN RUN
45 S$=RIGHT$(S$,LEN(S$)-1)
50 PRINT S$;
55 FOR I=1 TO LEN(S$):PRINT"{LEFT}";:NEXT I
60 FOR P=6 TO 0 STEP-1
70 POKE A,(PEEK(A)AND 248)+P
80 FOR X=1 TO 150 :NEXT :REM DELAY LOOP
85 F=FRE(0)
90 NEXT :GOTO 40
1 rem lulu diktiert flaxo tippt
5 w=40:a=53270:s$=" hello "
10 poke a,peek(a) and 247 :rem go into 38 col mode
20 print chr$(147) :rem clear the screen
30 for x=1 to w-2:print "{rght}"; :next :rem move the cursor to the right
40 poke a,(peek(a)and 248)+7 :print;:rem position for 1st scroll
42 if len(s$)<2 then run
45 s$=right$(s$,len(s$)-1)
50 print s$;
55 for i=1 to len(s$):print"{left}";:next i
60 for p=6 to 0 step-1
70 poke a,(peek(a)and 248)+p
80 for x=1 to 150 :next :rem delay loop
85 f=fre(0)
90 next :goto 40
100 REM REWORKED AND OPTIMIZED
110 W=40 :A=53270 :S$=" HELLO WORLD "
120 POKE A,PEEK(A) AND 247 :REM GO INTO 38 COL MODE
130 PRINT CHR$(147) :REM CLEAR THE SCREEN
140 FOR X=1 TO W :PRINT "{RGHT}"; :NEXT :REM MOVE THE CURSOR TO THE RIGHT
150 POKE A,(PEEK(A)AND 248)+7 :PRINT; :REM POSITION FOR 1ST SCROLL
160 IF LEN(S$)<2 THEN RUN
170 S$=RIGHT$(S$,LEN(S$)-1)
180 PRINT S$;
190 FOR I=1 TO LEN(S$):PRINT"{LEFT}"; :NEXT I
200 FOR P=6 TO 0 STEP-1
210 POKE A,(PEEK(A)AND 248)+P
220 FOR X=1 TO 50 :NEXT :REM DELAY LOOP
230 F=FRE(0)
240 NEXT :GOTO 40
100 rem reworked and optimized
110 w=40 :a=53270 :s$=" hello world "
120 poke a,peek(a) and 247 :rem go into 38 col mode
130 print chr$(147) :rem clear the screen
140 for x=1 to w :print "{rght}"; :next :rem move the cursor to the right
150 poke a,(peek(a)and 248)+7 :print; :rem position for 1st scroll
160 if len(s$)<2 then run
170 s$=right$(s$,len(s$)-1)
180 print s$;
190 for i=1 to len(s$):print"{left}"; :next i
200 for p=6 to 0 step-1
210 poke a,(peek(a)and 248)+p
220 for x=1 to 50 :next :rem delay loop
230 f=fre(0)
240 next :goto 40
0000 REM TITLE Saxnots Erster Textscroller
0000 REM AUTHOR saxnot
0000 REM DATE 2019-06-04
0000 rem title saxnots erster textscroller
0000 rem author saxnot
0000 rem date 2019-06-04
0000 REM Bildschirm verkleinert (von 40 auf 38 cols)
0000 REM Dies ist notwendig um smooth zu scrollen
0100 POKE 53270,PEEK(53270) AND 247
0000 rem bildschirm verkleinert (von 40 auf 38 cols)
0000 rem dies ist notwendig um smooth zu scrollen
0100 poke 53270,peek(53270) and 247
0000 REM "Clear Home" Character ausgeben
0200 PRINTCHR$(147)
0000 rem "clear home" character ausgeben
0200 printchr$(147)
0000 REM Variablen für Laufschrift
0300 N% = 40
0400 TX$ = " SAXNOT"
0000 rem variablen für laufschrift
0300 n% = 40
0400 tx$ = " saxnot"
0000 REM Das linkste char in jedem durchlauf wegwerfen
0500 TX$ = RIGHT$(TX$,N%)
0000 rem das linkste char in jedem durchlauf wegwerfen
0500 tx$ = right$(tx$,n%)
0000 REM "Clear Home" Character zum leeren des Bildschirms
0700 PRINT CHR$(147)
0000 rem "clear home" character zum leeren des bildschirms
0700 print chr$(147)
0000 REM Scroller startet bei 7 Offset
0800 POKE 53270, (PEEK(53270) AND 248) + 7
0000 rem scroller startet bei 7 offset
0800 poke 53270, (peek(53270) and 248) + 7
0900 PRINT TX$
0900 print tx$
0000 REM Den angezeigten Bildschirm von offet 7 bis 0 smooth verschieben
1000 FOR P=7 TO 0 STEP -1
1100 POKE 53270, (PEEK(53270) AND 248) + P
1200 NEXT P
0000 rem den angezeigten bildschirm von offet 7 bis 0 smooth verschieben
1000 for p=7 to 0 step -1
1100 poke 53270, (peek(53270) and 248) + p
1200 next p
0000 REM Laenge des Strings verringern und wieder von vorn
1300 N% = N% - 1
1400 IF N% > 0 THEN GOTO 0500
0000 rem laenge des strings verringern und wieder von vorn
1300 n% = n% - 1
1400 if n% > 0 then goto 0500
0000 REM Wenn ganz links angekommen beginne von vorn
1500 GOTO 0300
0000 rem wenn ganz links angekommen beginne von vorn
1500 goto 0300
# Commondore64 Programme
Wir lernen C64 Assembler!
Basic(s) first.
Wir lernen C64 Assembler! Basic(s) first!!
## Hausaufgaben
Die Aufgaben sind in den README Dateien in den jeweiligen
Verzeichnissen umrissen. Da die Einarbeitung in einige Themen
allerdings auch etwas länger dauern kann, sind diese als
Dauerherausforderungen zu verstehen.
* Basic Text Scroller (zum 2019-06-04)
* Joystick Input (zum 2019-06-18)
* Musik/Ton (zum ?)
* Grafik/PETSCII Art
## Standards
Kein Leben ohne Struktur! Deshalb versuchen wir die folgenden
grundlegenden Codings-Styles einzuhalten:
1. Assembler-Beispiele starten bei $c000 (sys 49152) und als standard
assembler wird ACME verwendet.
2. BASIC wird klein geschrieben damit es mit 'petcat' ohne probleme
übersetzt werden kann.
## Befehle
Zum Kompilieren von BASIC:
```petcat -2 -w2 -o programm-name.prg quelltext.bas```
Zum Kompiliern von Assembler:
```acme quelltext.asm```
Und für den Fall, dass im Quelltext nicht schon die entsprechenden
parameter für cpu, ausgabedatei und format gesetzt sind:
```acme -f cbm --cpu 6510 -o programm-name.prg quelltext.asm```
Getestet können die so entstandenen Programme direkt mit 'x64' werden:
```x64 programm-name.prg```
Bei Assembler/Maschinensprache muss nach dem laden das Programm durch
Eingabe von ```sys 49152``` also die vereinbarte Basisadresse
gestartet werden.
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment