; ------------------------------------------------------------
; ANTIVISION'S Letter vol 2.0 - Progammed by CYBORG
;
; NOTE: Any spreading of this Source-Code without the written
;
;       permission of ATV is prohibited !
;
; USAGE: a/g go/breakpoint (return)
;
; ------------------------------------------------------------

; LetterII  v1.4
; 01.12.86
 
; Alphabet

; NEU: $0182 in copper prg. immer geaendert (grau toene!)

go:jmp init

alpha:dc.l 0,0,0,0
dc.w       %0000000000000000
dc.w       %0000111111111000
dc.w       %0001111000111100
dc.w       %0011110000000000
dc.w       %0111111111111110
dc.w       %0111100000011110
dc.w       %0111100000011110
dc.w       %0111100000011110

dc.w       %0000000000000000
dc.w       %0111100111111000
dc.w       %0111100000111100
dc.w       %0111100000111100
dc.w       %0111100111111100
dc.w       %0111100000011110
dc.w       %0111100000011110
dc.w       %0111100111111100

dc.w       %0000000000000000
dc.w       %0011100111111000
dc.w       %0111100000011100
dc.w       %0111100000000000
dc.w       %0111100000000000
dc.w       %0111100000000000
dc.w       %0111100000011100
dc.w       %0011100111111000

dc.w       %0000000000000000
dc.w       %0111100111111000
dc.w       %0111100000011110
dc.w       %0111100000011110
dc.w       %0111100000011110
dc.w       %0111100000011110
dc.w       %0111100000011110
dc.w       %0111100111111000

dc.w       %0000000000000000
dc.w       %0111111111111110
dc.w       %0000000000000000
dc.w       %0111100000000000
dc.w       %0111111110000000
dc.w       %0111100000000000
dc.w       %0111100000000000
dc.w       %0111111111111110

dc.w       %0000000000000000
dc.w       %0111111111111110
dc.w       %0000000000000000
dc.w       %0111100000000000 
dc.w       %0111111110000000
dc.w       %0111100000000000
dc.w       %0111100000000000
dc.w       %0111100000000000

dc.w       %0000000000000000
dc.w       %0011111111111100
dc.w       %0111100000001110 
dc.w       %0000000000000000
dc.w       %0111100011101110
dc.w       %0111100000001110
dc.w       %0111100000001110
dc.w       %0011111111111100

dc.w       %0000000000000000
dc.w       %0111100000011110
dc.w       %0111100000011110
dc.w       %0111100000011110
dc.w       %0111100111111110
dc.w       %0111100000011110
dc.w       %0111100000011110
dc.w       %0111100000011110

dc.w       %0000000000000000
dc.w       %0000111111110000
dc.w       %0000001111000000
dc.w       %0000001111000000
dc.w       %0000001111000000
dc.w       %0000001111000000
dc.w       %0000001111000000
dc.w       %0000111111110000

dc.w       %0000000000000000
dc.w       %0111111111111110
dc.w       %0000000000000000
dc.w       %0000000000011110
dc.w       %0000000000011110
dc.w       %0000000000111100
dc.w       %0011110001111000
dc.w       %0000111111110000

dc.w       %0000000000000000
dc.w       %0111100000011100
dc.w       %0111100001110000
dc.w       %0111100111000000
dc.w       %0111100110000000
dc.w       %0111100111000000
dc.w       %0111100001110000
dc.w       %0111100000011100

dc.w       %0000000000000000
dc.w       %0111100000000000
dc.w       %0111100000000000
dc.w       %0111100000000000
dc.w       %0111100000000000
dc.w       %0111100000000000
dc.w       %0000000000000000
dc.w       %0111111111111110

dc.w       %0000000000000000
dc.w       %0110000000000110
dc.w       %0111000000001110
dc.w       %0000000000000000
dc.w       %0111111001111110
dc.w       %0111101110011110
dc.w       %0111100100011110
dc.w       %0111100000011110

dc.w       %0000000000000000
dc.w       %0111100000011110
dc.w       %0111110000011110
dc.w       %0000000000000000
dc.w       %0111101110011110
dc.w       %0111100111011110
dc.w       %0111100001111110
dc.w       %0111100000111110

dc.w       %0000000000000000
dc.w       %0011111111111100
dc.w       %0111100000011110
dc.w       %0000000000000000
dc.w       %0111100000011110
dc.w       %0111100000011110
dc.w       %0111100000011110
dc.w       %0011111111111100

dc.w       %0000000000000000
dc.w       %0111100111111000
dc.w       %0111100000011110
dc.w       %0111100000011110
dc.w       %0111100111111000
dc.w       %0111100000000000
dc.w       %0111100000000000
dc.w       %0111100000000000

dc.w       %0000000000000000
dc.w       %0011100111111100
dc.w       %0111100000011110
dc.w       %0111100000011110
dc.w       %0111100000011110
dc.w       %0111100111011110
dc.w       %0011100111111100
dc.w       %0000000001110000

dc.w       %0000000000000000
dc.w       %0111100111111000
dc.w       %0111100000011110
dc.w       %0111100000011110
dc.w       %0111100111111000
dc.w       %0111100111100000
dc.w       %0111100001111000
dc.w       %0111100000011110

dc.w       %0000000000000000
dc.w       %0011111111111100
dc.w       %0111100000011110
dc.w       %0000000000000000
dc.w       %0011111111111100
dc.w       %0000000000011110
dc.w       %0111100000011110
dc.w       %0011111111111100

dc.w       %0000000000000000
dc.w       %0111111111111110
dc.w       %0000000000000000
dc.w       %0000001111000000
dc.w       %0000001111000000
dc.w       %0000001111000000
dc.w       %0000001111000000
dc.w       %0000001111000000 

dc.w       %0000000000000000
dc.w       %0111100000011110
dc.w       %0111100000011110
dc.w       %0111100000011110
dc.w       %0111100000011110
dc.w       %0111100000011110
dc.w       %0111100000011110
dc.w       %0001100111111000

dc.w       %0000000000000000
dc.w       %0111100000011110
dc.w       %0111100000011110
dc.w       %0000000000000000
dc.w       %0111100000011110
dc.w       %0111100000011110
dc.w       %0001111001111000
dc.w       %0000001111000000

dc.w       %0000000000000000
dc.w       %0111100000011110
dc.w       %0111100000011110
dc.w       %0000000000000000
dc.w       %0111100110011110
dc.w       %0111101111011110
dc.w       %0111111001111110
dc.w       %0111100000011110

dc.w       %0000000000000000
dc.w       %0111100000011110
dc.w       %0111100000011110
dc.w       %0001111001111000
dc.w       %0000011001100000
dc.w       %0001111001111000
dc.w       %0111100000011110
dc.w       %0111100000011110

dc.w       %0000000000000000
dc.w       %0111100000011110
dc.w       %0111100000011110
dc.w       %0001111111111110
dc.w       %0000000000011110
dc.w       %0000000000000000
dc.w       %0111100000011110
dc.w       %0011111111111000

dc.w       %0000000000000000
dc.w       %0111111001111110
dc.w       %0111100000111100
dc.w       %0000000001110000
dc.w       %0000001001000000
dc.w       %0000111000000000
dc.w       %0011110000011110
dc.w       %0111111001111110

dc.w       %0000000000000000
dc.w       %0011111111111100
dc.w       %0111100001111110
dc.w       %0111100011011110
dc.w       %0111100110011110
dc.w       %0111101100011110
dc.w       %0111111000011110
dc.w       %0011111111111100

dc.w       %0000000000000000
dc.w       %0000000011110000
dc.w       %0000001111110000
dc.w       %0000111011110000
dc.w       %0000000011110000
dc.w       %0000000011110000
dc.w       %0000000011110000
dc.w       %0000000111111000

dc.w       %0000000000000000
dc.w       %0000011111111100
dc.w       %0001111000011110
dc.w       %0000000000011110
dc.w       %0000000001111000
dc.w       %0000000111100000
dc.w       %0000111110001110
dc.w       %0001111111111110

dc.w       %0000000000000000
dc.w       %0011111111111100
dc.w       %0111100000011110
dc.w       %0000000000111100
dc.w       %0000000011100000
dc.w       %0000000000111100
dc.w       %0111100000011110
dc.w       %0011111111111100

dc.w       %0000000000000000
dc.w       %0111100000000000
dc.w       %0111100000000000
dc.w       %0111100111100000
dc.w       %0111111111111100
dc.w       %0000000111100000
dc.w       %0000000111100000
dc.w       %0000000111100000

dc.w       %0000000000000000
dc.w       %0011111111111100
dc.w       %0011110000001100
dc.w       %0011110000000000
dc.w       %0011111111110000
dc.w       %0000000000111100
dc.w       %0011000000111100
dc.w       %0011111111110000

dc.w       %0000000000000000
dc.w       %0001111111111100
dc.w       %0011110000011110
dc.w       %0111100000000000
dc.w       %0111111111111100
dc.w       %0111100000011110
dc.w       %0111100000011110
dc.w       %0011111111111100

dc.w       %0000000000000000
dc.w       %0001111111111100
dc.w       %0000000000111100
dc.w       %0000000001111000
dc.w       %0000000011110000
dc.w       %0000000011110000
dc.w       %0000000011110000
dc.w       %0000000011110000

dc.w       %0000000000000000
dc.w       %0011111111111100
dc.w       %0111100000011110
dc.w       %0111100000011110
dc.w       %0011111111111100
dc.w       %0111100000011110
dc.w       %0111100000011110
dc.w       %0011111111111100

dc.w       %0000000000000000
dc.w       %0011111111111100
dc.w       %0111100000011110
dc.w       %0111100000011110
dc.w       %0011111111111110
dc.w       %0000000000011110
dc.w       %0000000000011110
dc.w       %0011111111111100

dc.w       %0000000000000000
dc.w       %0000001110000000
dc.w       %0000011111000000
dc.w       %0000011111000000
dc.w       %0000011111000000
dc.w       %0000001110000000
dc.w       %0000000000000000
dc.w       %0000001110000000

dc.w       %0000000000000000
dc.w       %0000000000000000
dc.w       %0000000000000000
dc.w       %0000000000000000
dc.w       %0000000000000000
dc.w       %0000000000000000
dc.w       %0000001110000000
dc.w       %0000001110000000

dc.w       %0000000000000000
dc.w       %0000011111111100
dc.w       %0000111100011110
dc.w       %0000000000011110
dc.w       %0000000001111000
dc.w       %0000000001111000
dc.w       %0000000000000000
dc.w       %0000000001111000

dc.w       %0000000000000000
dc.w       %0000000000000000
dc.w       %0000000000000000
dc.w       %0000001110000000
dc.w       %0000001110000000
dc.w       %0000000000000000
dc.w       %0000001110000000
dc.w       %0000001110000000

dc.w       %0000000000000000
dc.w       %0000001110000000
dc.w       %0000001110000000
dc.w       %0000000110000000
dc.w       %0000000100000000
dc.w       %0000000000000000
dc.w       %0000000000000000
dc.w       %0000000000000000

dc.w       %0000000000000000
dc.w       %0000000111000000
dc.w       %0000011100000000
dc.w       %0000111000000000
dc.w       %0001110000000000
dc.w       %0000111000000000
dc.w       %0000011100000000
dc.w       %0000000111000000

dc.w       %0000000000000000
dc.w       %0000001110000000
dc.w       %0000000011100000
dc.w       %0000000001110000
dc.w       %0000000000111000
dc.w       %0000000001110000
dc.w       %0000000011100000
dc.w       %0000001110000000

dc.w       %0000000000000000
dc.w       %0000000000000000
dc.w       %0000000000000000
dc.w       %0000000000000000
dc.w       %0000001110000000
dc.w       %0000001110000000
dc.w       %0000000110000000
dc.w       %0000000100000000

** init aller routinen und register ***

init:nop
lea $dff000,a0              ;basis adr custom chips          
move.w $001c(a0),d1         ;intena fuer spaeter merken
or.w #$c010,d1              ;bit15 u. bit4 setzen (copper+m.enable)
move.w #$0180,$0096(a0)     ;bitplane u. copper DMA aus
move.w #$7fff,$009a(a0)     ;keine irq zulassen
move.w #$7fff,$009c(a0)     ;keine irq anfordern
move.b #$7f,$bfdd00         ;timer ausschalten
move.b #$7f,$bfed01
move.l #lista,$0080(a0)     ;cop1lch prg counter
move.l #liste,$0084(a0)     ;cop2lch nur auf "ende"
move.w $0088(a0),d0         ;copper strobe senden
move.w $008a(a0),d0  
moveq #$03,d0               ;4 woerter verschieben
lea bpoint+2,a1             ;bitplane pointer init
lea $003ee8,a2              ;original pointer holen
loop1:move.w (a2)+,(a1)+
adda.l #$000002,a1          ;copper instruction ueberspringen
dbra d0,loop1
move.l #newirq,$00006c      ;irq level3-vector init
jsr getchar                 ;ersten char in buffer holen
move.w d1,$009a(a0)         ;INTENA copper irq ein + master bit
move.w #$8380,$0096(a0)     ;DMA fuer copper u. bitplane ein
jsr scrnclr                 ;clr
wklick:move.b $bfe0ff,d0    ;mouse-klick abwarten
and.b #$40,d0
bne.s wklick
jsr broesel
jmp $fc00ce                 ;reset

** broesel **

broesel:nop
move.w #$7fff,$dff09a       ;scroll stoppen
move.w #$7fff,$dff09c       ;(INTENA - alles off)
lea $003ee8,a0              ;bitplane pointer
move.l (a0),a0
add.l #$00002580,a0         ;einige rihen tiefer
move.l a0,a1
moveq #$07,d0               ;anzahl der scroll reihen
next2:move.l a1,a0
move.l d0,d1                ;d0 nach d1 fuer calc
mulu #$0050,d1              ;reihe festlegen
add.l d1,a0                 ;reihen adr in a0
moveq #$00,d1               ;index auf letzt. wort
next1:move.b #$00,0(a0,d1.w);byte loeschen
addq #$01,d1           
cmp.b #$50,d1               ;zeile zu ende ?
bne.s next1
moveq #$05,d6               ;warteschleife
wait2:move.w #$a000,d5      ;fuer langsames loeschen
wait:dbra d5,wait
dbra d6,wait2
dbra d0,next2               ;alle reihen fertig ?
rts

** copperliste **

lista:dc.w $2b01,$fffe      ;warten auf 1 zeile vor screenbeginn
dc.w $0180,$0004            ;hgrund = blue
dc.w $0100,$0000            ;screen off
dc.w $0096,$0020            ;sprite DMA off
dc.w $0108,$0000            ;modulo = 0
dc.w $010a,$0000
dc.w $008e,$2c81            ;DIWISTART + DIWISTOP
dc.w $0090,$f4c1
dc.w $0092,$003c            ;DDFSTART + DDFSTOP
dc.w $0094,$00d4
bpoint:dc.w $00e0,$ffff     ;Bitplane pointer ($FFFF)
dc.w $00e2,$ffff            ;als Dummy wert
dc.w $00e4,$ffff
dc.w $00e6,$ffff
dc.w $2c01,$fffe            ;warten auf screenbeginn
dc.w $0100,$a000            ;hires,2 planes (screen on)
dc.w $9f01,$fffe            ;farbenspiel (weisse rasterzeile)
dc.w $0180,$0fff
dc.w $a001,$fffe            ;ab hier scroll (farbe aendern)
dc.w $0180,$0000            ;hgrund black
dc.w $a201,$fffe
dc.w $0182,$0222
dc.w $a301,$fffe
dc.w $0182,$0333
dc.w $a401,$fffe
dc.w $0182,$0444
dc.w $a501,$fffe
dc.w $0182,$0555
dc.w $a601,$fffe
dc.w $0182,$0666
dc.w $a701,$fffe
dc.w $0182,$0777
dc.w $a801,$fffe
dc.w $0182,$0888
dc.w $a901,$fffe
dc.w $0182,$0999
dc.w $aa01,$fffe
dc.w $0182,$0aaa
dc.w $b001,$fffe            ;ende scrollgebiet
dc.w $0180,$0fff
dc.w $b101,$fffe            ;hgrund wieder blue
dc.w $0180,$0004
dc.w $009c,$8010            ;irq anfordern
liste:dc.w $ffff,$fffe      ;ENDE COPPERLISTE

** NEUE IRQ ROUTINE **

newirq:movem.l a0-a6/d0-d7,-(a7) ;register retten
jsr scroll                       ;sub:scrollen 
move.w #$7fff,$dff09c            ;INTREQ loeschen
movem.l (a7)+,a0-a6/d0-d7
rte                              ;irq beenden 
 
** scrollprg **
 
scroll:lea buf,a0           ;buffer zeiger
moveq #$00,d0               ;zeile 0
lea $003ee8,a1              ;bitmap adr holen
move.l (a1),a1
add.l #$002580,a1           ;einige reihen tiefer

loop3:move.w (a0),d2        ;bufferwort
and.b #$00,sr               ;x-flag loeschen
roxl.w #$01,d2              ;nach links scrollen (ins x-flag !!)
move.w d2,(a0)+             ;wieder merken,buffer ein wort weiter

move.w #$004f,d1            ;zeiger auf wort 79
loop2:move.b 0(a1,d1.w),d3  ;wort holen
roxl.b #$01,d3              ;und scrollen
move.b d3,0(a1,d1.w)        ;wort wieder merken
dbra d1,loop2               ;zeile fertig machen

add.l #$000050,a1           ;eine reihe tiefer
addq #$01,d0                ;naechste zeile
cmp.b #$09,d0               ;8 zeilen fertig ?
bne.s loop3
  
move.b pixel,d0		    ;pixel anzahl -1
sub.b #$01,d0
move.b d0,pixel
bpl esub                    ;ein zeichen gescrollt ?
move.b #$0f,pixel           ;ja,pixel init
jsr getchar                 ;neuen char holen
esub:rts     

pixel:dc.w $0f00
buf:dc.l 0,0,0,0,0,0,0,0

* getchar *
* date: 21.10.86
 
text:dc.l $00000000,$010e1409,$16091309,$0f0e0010,$120f1504,$0c190010
dc.l      $12051305,$0e141300,$28000001,$14162913,$00130503,$0f0e0400
dc.l      $0c051414,$05120025,$25250000,$00140805,$00130312,$0f0c0c00
dc.l      $08011300,$0205050e,$00090d10,$120f1605,$042a0e0f,$17001705
dc.l      $000b0e0f,$1700080f,$1700140f,$00151305,$00140805,$00031514
dc.l      $05000c09,$14140c05,$00030f10,$10051226,$26262600,$01130019
dc.l      $0f150003,$010e0013,$05052b00,$00000000,$17050c0c,$000c0514
dc.l      $29130013,$14011214,$00170914,$08001408,$05000e0f,$14051300
dc.l      $010e0400,$07120505,$14090e07,$13002800,$1303012c,$00190f15
dc.l      $12001409,$140c0500,$0d010b05,$12000913,$000e0903,$05000215
dc.l      $14001408,$05001303,$120f0c0c,$090e0726,$26260009,$00040f0e
dc.l      $2914000c,$090b0500,$09140000,$00000526,$0326012c,$00170f17
dc.l      $25252626,$26260d01,$040e0513,$13252500,$190f1512,$00090e14
dc.l      $120f0006,$0f120013,$15100512,$02011305,$00091300,$0102130f
dc.l      $0c151405,$0c190006,$010e1401,$13140903,$25252500,$00000008
dc.l      $05010402,$010e0705,$122c0017,$0819000e,$0f14000d,$010b0509
dc.l      $0e070019,$0f151200,$0f170e00,$090e1412,$0f130009,$0e131405
dc.l      $0104000f,$06001513,$090e0700,$14080500,$13030100,$10120726
dc.l      $00270000,$00000000,$0e0f1700,$14080500,$07120505,$14090e07
dc.l      $13002800,$0d050701,$02191405,$00000001,$040a0000,$0004190e
dc.l      $010d0903,$0004150f,$2a030f0d,$05000f0e,$00031201,$030b090e
dc.l      $072b0000,$000d1226,$010d0907,$0f2a0e0f,$12170119,$2b000000
dc.l      $14080500,$130f0614,$1405010d,$2a0a1504,$07050004,$12050404
dc.l      $2b000000,$090e0419,$00000006,$0c011308,$00000002,$03130000
dc.l      $000d010c,$09021500,$00001306,$00000000,$00000f08,$00090006
dc.l      $0f12070f,$1400130f,$0d051408,$090e0700,$28000326,$0326132c
dc.l      $00170805,$12050001,$12050014,$08050007,$010d0513,$00190f15
dc.l      $00140f0c,$04000d05,$0001020f,$15140027,$27000000,$1513150c
dc.l      $2c00040f,$00190f15,$00080116,$05000100,$070f0f04,$00040913
dc.l      $0b0d0f0e,$00190514,$00272727,$00000000,$00000000,$00000000
dc.l      $00000000,$00000000,$00000000,$00000000,$00000000,$00000000

getchar:movem.l d0-d7/a0-a6,-(a7)
clr.l d0
move.w zeiger,d0
add.w #$0001,d0
move.w d0,zeiger
cmp.w #$02e8,d0
bne.s nonew
move.w #$0000,zeiger
clr.l d0
nonew:nop
move.l #text,a0
move.b (a0,d0.l),d0
and.l #$000000ff,d0
mulu #$0010,d0        ; *16 um andere Buchst. zu ueberspringen
move.l #alpha,a0      ; tabellenbasis
move.l #buf,a1        ; ziel
adda.l d0,a0          ; tabellenquelle berechnen
moveq #$07,d0         ; anzahl der woerter pro Buchst.
cont:move.w (a0)+,(a1)+
dbra d0,cont
back:movem.l (a7)+,d0-d7/a0-a6
endb:rts
zeiger:dc.w $0000

scrnclr:lea $003ee8,a0
lea $003eec,a1
move.l (a0),a0
move.l (a1),a1
move.w #$3e80,d0
loop5:move.l #$00000000,0(a0,d0.w)
move.l #$00000000,0(a1,d0.w)
sub.w #$0004,d0
bpl.s loop5
rts
