;************************************
;**         SHOWFX V1.0            **
;**         -----------            **
;**                                **
;**   copyright © by Rainer Reber  **
;**           1991                 **
;**                                **
;**      using Devpak 2.0          **
;************************************

smoothcol1 = $0000
smoothcol2 = $0fff

;custom-Register

intena = $9a
dmacon = $96
dmaconr = $2
color00 = $180
vhposr = $6
vposr = $4

;Copper-Register

cop1lc = $80
cop2lc = $84
copjmp1 = $88
copjmp2 = $8a

;Bitplane-Register

bplcon0 = $100
bplcon1 = $102
bplcon2 = $104
bpl1pth = $0e0
bpl1ptl = $0e2
bpl1mod = $108
bpl2mod = $10a
diwstrt = $08e
diwstop = $090
ddfstrt = $092
ddfstop = $094

; Blitterregister

bltcon0 = $40
bltcon1 = $42
bltcpth = $48
bltcptl = $4a
bltbpth = $4c
bltbptl = $4e
bltapth = $50
bltaptl = $52
bltdpth = $54
bltdptl = $56
bltcmod = $60
bltbmod = $62
bltamod = $64
bltdmod = $66
bltsize = $58
bltcdat = $70
bltbdat = $72
bltadat = $74
bltafwm = $44
bltalwm = $46

;Cia-A Portregister A (Maustaste)

cc = $dff000 ; CustomBasisRegister
ciaapra = $bfe001

;Exec Library Base Offsets

openlib = -408
closelib = -414
forbid = -30-102
permit = -30-108
allocmem = -30-168
allocabs = -204

freemem = -30-180

;graphics base

csm = 16

startlist = 38
execbase = 4 

byte = 40 ; Bildbreite in bytes
height = 256 ; Bildhoehe der Grafikdaten im Speicher
planesize = byte*height ; Playfieldgroesse im Speicher

mode=%0101001000000000 
bitpl = 5 ; bitplaneanzahl fuer einfache berechnung
; Bildschirmdarstellung = 320*256

planeadr = $60000
cladr = (planesize*bitpl)+planeadr
cladr2 = cladr+34000
dataend = cladr2+34000

Screenstart=$2981 ; (26,100) 
Screenend=$27c1 ; (313,465)
dmastart=$0038
dmaend=$00d0
bplcon1value=0
bplcon2value=0
bpl1modvalue=0
bpl2modvalue=0

;Exec Library Base Offsets

LVOopen = -$01e
LVOclose = -$024
LVOread = -$02a
LVOseek = -$042
write = -48
output = -60

;graphics base

;Vorprogramm
playopen:

 clr d9
 subq #1,d0 ; Name der Bilddatei holen
 bne.s Filename
 move #-1,d9
 bra.s nofilename
Filename:
 lea Grafikname(pc),a2
 move d0,d1
 bra.s searchname
help:
 move.l execbase,a6
 lea Dosname,a1
 moveq #0,d0
 jsr openlib(a6)
 tst.l d0
 beq Ende
 move.l d0,Dosbase
 move.l #Helptext,text ; Funktionen anzeigen
 jsr Writetext
 move.l dosbase(pc),a1
 jsr closelib(a6)
 rts
searchfilename:
 cmp.b #$20,(a0)
 beq.s searchname
 cmp.b #63,(a0)
 beq help
 move.b (a0)+,(a2)+
searchname:
 dbra d0,searchfilename 
 clr.b (a2)+
nofilename:

 move.l execbase,a6
 lea Dosname,a1
 moveq #0,d0
 jsr openlib(a6)
 tst.l d0
 beq Ende
 move.l d0,Dosbase

 tst d9
 bpl.s filenameok
 move.l #nonameMessage,text ; kein Name angegeben
 jsr Writetext
 move.l dosbase(pc),a1
 jsr closelib(a6)
 rts
filenameok:

 move.l execbase,a6 ; absoluten Speicherbereich belegen
 move.l #dataend-planeadr,d0
 move.l #planeadr,a1
 jsr allocabs(a6)

 move.l #planeadr,a0 ; Speicherbereich loeschen
 move.l #dataend-planeadr,d0
cleardata:
 clr.b (a0)+
 subq.l #1,d0
 bpl cleardata

; Bild laden

 move.l #Grafikname,a0 ; Grafik laden
 move.l #planeadr,a5
 move.l #byte*8,d6
 move.l #height,d7
 bsr LoadIFF

 move.l execbase,a6
 jsr forbid(a6)

 move.l #black,coloradr
 move.l #ctab,colortab
 bsr smoothcolor ; Farbverlauf berechnen

 move.l #White,coloradr
 move.l #ctab2,colortab
 bsr smoothcolor  

 move.l #cladr,a0
 lea colorchange(pc),a1
 bsr gencopperlist ; Copperlisten vorbereiten
 move.l a0,copperend 

 move.l #cladr2,a0
 lea colorchange2(pc),a1
 bsr gencopperlist	
 move.l a0,copperend2
	
;** Hauptprogramm **

 move.w #$03e0,dmacon+cc ;Dma sperren

;Copper initialisieren

 move.l #cladr,cop1lc+cc
 clr.w copjmp1+cc ; Copper einschalten

 ;Playfield initialisieren

 move.w #Screenstart,diwstrt+cc ; Screen initialisieren
 move.w #Screenend,diwstop+cc
 move.w #dmastart,ddfstrt+cc
 move.w #dmaend,ddfstop+cc
 move.w #mode,bplcon0+cc
 move.w #bplcon1value,bplcon1+cc
 move.w #bplcon2value,bplcon2+cc
 move.w #bpl1modvalue,bpl1mod+cc
 move.w #bpl2modvalue,bpl2mod+cc

;dma ein
 move.w #$83d0,dmacon+cc ; dma ein 

 clr xascreen
 move.l #normdisplay,jmpdemo
waitforkey:

 move.b $bfec01,d6  ; Tastaturabfrage
 cmp.b #$bf,d6
 bne.s jRoehrendemo1
 move.w #Screenend,diwstop+cc ; Bildschirmanfang setzten 
 move.w #dmastart,ddfstrt+cc
 move.w #dmaend,ddfstop+cc
 bsr normscreen
 clr d10
 move.l #sintab,data
 move.l #Roehrendemo1,jmpdemo
jRoehrendemo1:
 cmp.b #$95,d6
 bne.s jRoehrendemo2
 move.w #Screenend,diwstop+cc
 move.w #dmastart,ddfstrt+cc
 move.w #dmaend,ddfstop+cc
 bsr normscreen
 clr d10
 move.l #Roehrendemo2,jmpdemo
jRoehrendemo2:
 cmp.b #$99,d6
 bne.s jcubedemo
 move.w #Screenend,diwstop+cc
 move.w #dmastart,ddfstrt+cc
 move.w #dmaend,ddfstop+cc
 bsr normscreen
 clr hverz
 clr mod
 clr bmod2
 clr bmod
 clr mod2
 move #-1,oldanzahl
 move.l #cubedemo,jmpdemo
jcubedemo:
 cmp.b #$bb,d6
 bne.s jGummibild
 move.w #Screenend,diwstop+cc
 move.w #dmastart,ddfstrt+cc
 move.w #dmaend,ddfstop+cc
 bsr normscreen
 move #230,Begin
 move #57,Bschluss
 move begin(pc),mod
 move.l #Gummibild,jmpdemo
jGummibild:
 cmp.b #$db,d6
 bne jBilddrehendemo2
 move.w #Screenend,diwstop+cc
 move.w #dmastart,ddfstrt+cc
 move.w #dmaend,ddfstop+cc
 move #176,Begin
 move #255,highsize
 move Begin,d0
 sub #10,d0
 move d0,lowsize
 jsr blackscreen
 clr side
 clr jumpmode
 move highsize,mod
 move mod,d1
 move.l #Scanlasta,a2
 move Geschwindigkeit(pc),speed
 add speed(pc),d1
 clr colverz
 move.l #Bilddrehendemo2,jmpdemo
jBilddrehendemo2:
 cmp.b #$b9,d6
 bne.s jDemo3d1
 move.w #Screenend,diwstop+cc
 move.w #dmastart,ddfstrt+cc
 move.w #dmaend,ddfstop+cc
 bsr normscreen
 clr d10
 move.l #data3d,data
 move.l #Roehrendemo1,jmpdemo
jDemo3d1:
 cmp.b #$b7,d6
 bne.s jRoehrendemo1ver
 move.w #Screenend,diwstop+cc
 move.w #dmastart,ddfstrt+cc
 move.w #dmaend,ddfstop+cc
 move.l #sintab,data
 move #1,groesse
 move #141,Begin
 clr d10
 bsr normscreen
 move.l #Roehrendemover,jmpdemo
jRoehrendemo1ver:
 cmp.b #$b5,d6
 bne.s jRoehrendemo2ver
 move.w #Screenend,diwstop+cc
 move.w #dmastart,ddfstrt+cc
 move.w #dmaend,ddfstop+cc
 move.l #sintab2,data
 move #1,groesse
 move #141,Begin
 clr d10 
 bsr normscreen
 move.l #Roehrendemover,jmpdemo
jRoehrendemo2ver:
 cmp.b #$d1,d6
 bne.s jRoehrendemoh1
 move.w #Screenend-$10,diwstop+cc ; wenn horizontal gescrollt
 move.w #dmastart-8,ddfstrt+cc ; wird muessen 2 zusaetzliche
 move.w #dmaend-8,ddfstop+cc ; Worte angehaengt werden
 move.l #sintab,data
 move #1,groesse
 move #141,Begin
 clr d10
 bsr normscreen
 move.l #Roehrendemoh,jmpdemo
jRoehrendemoh1:
 cmp.b #$b3,d6
 bne.s jRoehrendemoh2
 move.w #Screenend-$10,diwstop+cc
 move.w #dmastart-8,ddfstrt+cc
 move.w #dmaend-8,ddfstop+cc
 move.l #sintab2,data
 move #1,groesse
 move #141,Begin
 clr d10 
 bsr normscreen
 move.l #Roehrendemoh,jmpdemo
jRoehrendemoh2:
 cmp.b #$b1,d6
 bne.s jRoehrendemohv
 move.w #Screenend-$10,diwstop+cc ; wenn horizontal gescrollt
 move.w #dmastart-8,ddfstrt+cc ; wird muessen 2 zusaetzliche
 move.w #dmaend-8,ddfstop+cc ; Worte angehaengt werden
 move.l #sintab2,data
 move #1,groesse
 move #141,Begin
 clr d10
 bsr normscreen
 move.l #Roehrendemohv,jmpdemo
jRoehrendemohv:
 cmp.b #$af,d6
 bne.s jslide
 move.w #Screenend,diwstop+cc
 move.w #dmastart,ddfstrt+cc
 move.w #dmaend,ddfstop+cc
 clr d9
 clr d10
 move.l #slidedemo,jmpdemo
jslide: 
 cmp.b #$41,d6
 bne.s jnormdisplay
 move.w #Screenend,diwstop+cc
 move.w #dmastart,ddfstrt+cc
 move.w #dmaend,ddfstop+cc
 move.l #normdisplay,jmpdemo
jnormdisplay: 

 cmp.b #$75,d6
 beq playclose

 cmp.b #$53,d6
 bne nichtf7
 eor.b #1,Schatten
 bra keyup
nichtf7:
 cmp.b #$51,d6
 bne nichtf8
 eor.b #1,Richtung
 bra keyup
nichtf8:
 cmp.b #$5f,d6
 bne nichtf1
 subq #1,Anzahl
 bgt keyup
 move #1,Anzahl
 bra keyup
nichtf1:
 cmp.b #$5d,d6
 bne nichtf2
 addq #1,Anzahl 
 cmp #16,Anzahl
 bls keyup
 move #16,Anzahl
 bra keyup
nichtf2:

 cmp.b #$59,d6
 bne.s nichtf3j
 subq #2,Begin
 cmp #140,Begin
 bge nichtf3
 move #140,Begin
nichtf3:
 bra keyup
nichtf3j:

 cmp.b #$5b,d6
 bne.s nichtf4j
 addq #2,Begin
 cmp #254,Begin
 ble nichtf4
 move #254,Begin
nichtf4:
 bra keyup
nichtf4j:

 cmp.b #$55,d6
 bne.s nichtf5j
 subq #2,BSchluss
 cmp #10,BSchluss
 bge nichtf5
 move #10,BSchluss
nichtf5:
 bra keyend
nichtf5j:

 cmp.b #$57,d6
 bne.s nichtf6j
 addq #2,BSchluss
 cmp #130,BSchluss
 ble nichtf6
 move #130,BSchluss
nichtf6:
 bra keyend
nichtf6j:

 cmp.b #$4f,d6
 bne nichtf9
 cmp #$0000,black
 bne noblack
 move #$0700,black
 bra endblack
noblack:
 cmp #$0700,black
 bne noblackred
 move #$0070,black
 bra endblack
noblackred:
 cmp #$0070,black
 bne noblackgruen
 move #$0007,black
 bra endblack
noblackgruen:
 cmp #$0007,black
 bne noblack2
 move #$0000,black
noblack2:
endblack:
 move.l #black,coloradr
 move.l #ctab,colortab
 jsr smoothcolor
 bra keyup
nichtf9:

 cmp.b #$4d,d6
 bne nichtf10
 cmp #$0fff,white
 bne nowhite
 move #$0f00,white
 bra endwhite
nowhite:
 cmp #$0f00,white
 bne nowhitered
 move #$00f0,white
 bra endwhite
nowhitered:
 cmp #$00f0,white
 bne nowhitegruen
 move #$000f,white
 bra endwhite
nowhitegruen:
 cmp #$000f,white
 bne nowhite2
 move #$0fff,white
nowhite2:
endwhite:
 move.l #white,coloradr
 move.l #ctab2,colortab
 jsr smoothcolor
 bra keyup
nichtf10:

 cmp.b #$eb,d6
 bne nicht0
 clr Geschwindigkeit
 bra keyend
nicht0:
 cmp.b #$fd,d6
 bhi nozahl
 cmp.b #$ec,d6
 bls nozahl
 btst #0,d6
 beq nozahl
 moveq #0,d5
 move.b d6,d5
 sub #$ed,d5
 lsr #1,d5
 moveq #9,d4
 sub d5,d4
 move d4,Geschwindigkeit
 bra keyend
nozahl:

keyend:
 move.l jmpdemo(pc),a1
 jmp (a1)

keyup:
 cmp.b $bfec01,d6
 beq.s keyup
 bra.s keyend

playclose:
;** Nachprogramm **

; Speicher freigeben
 move.l execbase,a6
 move.l #dataend-planeadr,d0
 move.l #planeadr,a1
 jsr freemem(a6)

; graphics library oeffnen
 move.l #grname,a1
 clr.l d0
 jsr openlib(a6)
 move.l d0,graphbase

;Alte Copperlist wieder activieren
 move.l d0,a4
 move.l startlist(a4),cop1lc+cc
 clr.w copjmp1+cc

; Libraries schliessen
 
 move.l graphbase(pc),a1
 jsr closelib(a6)

 move.l dosbase(pc),a1
 jsr closelib(a6)

; Multitasking ein
 move.w #$8060,dmacon+cc
 jsr permit(a6)

 moveq #0,d0
Ende:
  rts

grname:
 dc.b "graphics.library",0
 even
graphbase:
 dc.l 0

; Text im Cli ausgeben
writetext:
 movem.l d0-a6,-(a7)
 move.l text(pc),a0
 moveq #0,d0
searchendtext:
 addq #1,d0
 tst.b (a0)+
 bne.s searchendtext
 move d0,length  
 move.l dosbase,a6
 jsr output(a6)
 move.l d0,d1
 move.l text(pc),d2
 move length(pc),d3
 jsr write(a6)
 movem.l (a7)+,d0-a6
 rts

text:
 dc.l 0
length:
 dc.w 0

jmpdemo: ; Vektor fuer Sprung in Demoroutine
 dc.l 0
data: ; WerteTabelle fuer Darstellung
 dc.l 0
colortab: ; verschiedene Paramter fuer Demos
 dc.l 0
coloradr:
 dc.l 0
Groesse:
 dc.w 0
outtime:
 dc.w 0
Jmpto:
 dc.l 0
Schatten:
 dc.b 1
Richtung:
 dc.b 1
Geschwindigkeit:
 dc.w 1
oldAnzahl:
 dc.w 1
Anzahl:
 dc.w 1
Begin:
 dc.w 200
BSchluss:
 dc.w 127
 even

; ********** Copperliste vorbereiten ***********
gencopperlist:
 moveq #bitpl-1,d4
 move.l #planeadr,d1
 move.w #bpl1pth,d3 ; Hiworte der Bildschirmaddressen
makecl:
 move.w d3,(a0)+
 addq.w #2,d3
 swap d1
 move.w d1,(a0)+
 move.w d3,(a0)+
 addq.w #2,d3
 swap d1
 move.w d1,(a0)+
 add.l #planesize,d1
 dbra d4,makecl

 move.l a0,(a1)

 move #color00,d1
 move.l #iffcolors,a1
 moveq #31,d4
col2b:
 move d1,(a0)+
 move (a1)+,(a0)+
 addq #2,d1
 dbra d4,col2b

 move.l #$fffffffe,(a0)
 rts

; ****** Farbverlauf generieren und und in colortab schreiben
smoothcolor:
 lea iffcolors(PC),a2
 move.l colortab(pc),a1
 moveq #31,d7 ; alle 32 farben
cllopf9:
 move.l coloradr(pc),a3 ; smooth von color00 zu schwarz
 bsr smooth
 add #64,a1
 addq #2,a2
 dbra d7,cllopf9
 rts

; ******* Anfang des bildes festlegen hell oder dunkel
Blackscreen:
 move.l colorchange(pc),a0
 move.l colorchange2(pc),a2
 moveq #0,d0
 moveq #31,d4
col2td:
 addq #2,a0
 move d0,(a0)+
 addq #2,a2
 move d0,(a2)+
 dbra d4,col2td
 rts

normscreen:
 move.l colorchange(pc),a0
 move.l colorchange2(pc),a2
 lea iffcolors(pc),a1
 moveq #31,d4
col2tdg:
 addq #2,a0
 move (a1),(a0)+
 addq #2,a2
 move (a1)+,(a2)+
 dbra d4,col2tdg
 rts

; *********** verschiedene Macrodefinitionen

setraster  MACRO ; Doublebuffering der Copperliste

waitraster\@:
 move.l vposr+cc,d7
 and.l #$0001ff00,d7
 cmp.l #$00012f00,d7
 bne.s waitraster\@

 not xascreen
 bpl.s cllist2\@
 move.l #cladr2,cop1lc+cc
 move.l copperend,a0
 bra.s endcllist\@
cllist2\@:
 move.l #cladr,cop1lc+cc
 move.l copperend2,a0
endcllist\@:
 ENDM

changecolor  MACRO ; Bildschirmfarbeb aendern
 move.w #color00,(a0)+
 move.w (a4),(a0)+
 move.w #color00+2,(a0)+
 move.w 64(a4),(a0)+
 move.w #color00+4,(a0)+
 move.w 128(a4),(a0)+
 move.w #color00+6,(a0)+
 move.w 192(a4),(a0)+
 move.w #color00+8,(a0)+
 move.w 256(a4),(a0)+
 move.w #color00+10,(a0)+
 move.w 320(a4),(a0)+
 move.w #color00+12,(a0)+
 move.w 384(a4),(a0)+
 move.w #color00+14,(a0)+
 move.w 448(a4),(a0)+
 move.w #color00+16,(a0)+
 move.w 512(a4),(a0)+
 move.w #color00+18,(a0)+
 move.w 576(a4),(a0)+
 move.w #color00+20,(a0)+
 move.w 640(a4),(a0)+
 move.w #color00+22,(a0)+
 move.w 704(a4),(a0)+
 move.w #color00+24,(a0)+
 move.w 768(a4),(a0)+
 move.w #color00+26,(a0)+
 move.w 832(a4),(a0)+
 move.w #color00+28,(a0)+
 move.w 896(a4),(a0)+
 move.w #color00+30,(a0)+
 move.w 960(a4),(a0)+
 move.w #color00+32,(a0)+
 move.w 1024(a4),(a0)+
 move.w #color00+34,(a0)+
 move.w 1088(a4),(a0)+
 move.w #color00+36,(a0)+
 move.w 1152(a4),(a0)+
 move.w #color00+38,(a0)+
 move.w 1216(a4),(a0)+
 move.w #color00+40,(a0)+
 move.w 1280(a4),(a0)+
 move.w #color00+42,(a0)+
 move.w 1344(a4),(a0)+
 move.w #color00+44,(a0)+
 move.w 1408(a4),(a0)+
 move.w #color00+46,(a0)+
 move.w 1472(a4),(a0)+
 move.w #color00+48,(a0)+
 move.w 1536(a4),(a0)+
 move.w #color00+50,(a0)+
 move.w 1600(a4),(a0)+
 move.w #color00+52,(a0)+
 move.w 1664(a4),(a0)+
 move.w #color00+54,(a0)+
 move.w 1728(a4),(a0)+
 move.w #color00+56,(a0)+
 move.w 1792(a4),(a0)+
 move.w #color00+58,(a0)+
 move.w 1856(a4),(a0)+
 move.w #color00+60,(a0)+
 move.w 1920(a4),(a0)+
 move.w #color00+62,(a0)+
 move.w 1984(a4),(a0)+
 ENDM

changeplaneadr MACRO ; Lo-worte der Bildschirmaddresse aendern

 move #bpl1ptl,(a0)+ 
 move d0,(a0)+
 add #planesize,d0
 move #bpl1ptl+4,(a0)+ 
 move d0,(a0)+
 add #planesize,d0
 move #bpl1ptl+8,(a0)+ 
 move d0,(a0)+
 add #planesize,d0
 move #bpl1ptl+12,(a0)+ 
 move d0,(a0)+
 add #planesize,d0
 move #bpl1ptl+16,(a0)+ 
 move d0,(a0)+
 ENDM

; ******************************************************
; ******************************************************
;                       DEMOS
; ******************************************************
; ******************************************************

normdisplay:
 bsr normscreen
 setraster
 move #(39*256)+$00df,(a0)+
 move #$fffe,(a0)+
 move.l #planeadr,d0
 changeplaneadr
 move.l #$fffffffe,(a0)
 bra waitforkey

; ********************************************************

Roehrendemo1:

 setraster

 move #-1,oldd6

 move Geschwindigkeit(pc),d1
 add d1,d10
 cmp #255,d10
 bls.s nohighervalue
 clr d10
nohighervalue:
 move d10(pc),d9

 tst.b Richtung
 bne andereRichtunga
 eor #255,d9
andereRichtunga:

 move.l data(pc),a2

 moveq #0,d1
 moveq #0,d2
 move d9(pc),d2
 lsl #3,d2
 move d2,d7
 lsl #2,d7
 add d7,d2 ; mulu #byte,d2
 move.b schatten(pc),d5
 moveq #0,d7
 move anzahl(pc),d4
 move #(39*256)+$00df,d7
 move #255,d3
lopa:
 move d7,(a0)+
 move #$fffe,(a0)+
 add #$0100,d7

 add d4,d1
 cmp #255,d1
 bls.s anzahlhoeher1
 moveq #0,d1
anzahlhoeher1:

 moveq #0,d6
 move.b (a2,d1),d6
 
 lsl #3,d6
 move d6,d0
 add d0,d0
 add d0,d0
 add d0,d6 ; mulu #byte,d6

 move.l #planeadr,d0
 add.l d6,d0
 add.l d2,d0

 cmp.l #planesize+planeadr,d0
 blt.s nonextpica
 sub.l #planesize,d0
nonextpica:

 changeplaneadr

 tst.b d5
 beq samecolora

 moveq #0,d6
 move.b (a2,d1),d6

 lsr #3,d6
 eor #31,d6
 and #$fffe,d6
 sub #10,d6

 cmp oldd6(pc),d6
 beq samecolora

 move d6,oldd6

 add.l #ctab,d6
 move.l d6,a4

 cmp.l #ctab+30,a4
 bls.s nojhk
 lea ctab(pc),a4
nojhk:

 changecolor

samecolora:

 dbra d3,lopa

 move.l #$fffffffe,(a0)

 bra waitforkey


; ********************************************************

Roehrendemo2:

 setraster

 move #-1,oldd6

 move Geschwindigkeit(pc),d1
 add d1,d10
 cmp #255,d10
 bls.s nohighervalue2
 clr d10
nohighervalue2:
 move d10(pc),d9

 tst.b Richtung
 bne.s andereRichtunga2
 eor #255,d9
andereRichtunga2:

 lea sintab(pc),a2
 moveq #0,d1
 moveq #0,d2
 move d9(pc),d2
; mulu #byte,d2
 lsl #3,d2
 move d2,d7
 lsl #2,d7
 add d7,d2
 move.b schatten(pc),d5
 moveq #0,d7
 move #(39*256)+$00df,d7
 move #255,d3
lopa2:
 move d7,(a0)+
 move #$fffe,(a0)+
 add #$0100,d7

 add Anzahl(pc),d1
 cmp #255,d1
 bls.s anzahlhoeher12
 moveq #0,d1
anzahlhoeher12:

 moveq #0,d6
 move.b (a2,d1),d6

 cmp #127,d1
 bls.s noaddpl2
 eor #255,d6
noaddpl2:

; mulu #byte,d6
 lsl #3,d6
 move d6,d0
 add d0,d0
 add d0,d0
 add d0,d6

 move.l #planeadr,d0
 add.l d6,d0
 add.l d2,d0

testagain2:
 cmp.l #planesize+planeadr,d0
 blt.s nonextpic2
 sub.l #planesize,d0
 bra.s testagain2
nonextpic2:

 changeplaneadr

 tst.b d5
 beq samecolora2

 moveq #0,d6
 move.b (a2,d1),d6

 lsr #3,d6
 eor #31,d6
 and #$fffe,d6
 sub #10,d6

 cmp oldd6(pc),d6
 beq samecolora2

 move d6,oldd6

 add.l #ctab,d6
 move.l d6,a4

 changecolor

samecolora2:

 dbra d3,lopa2

 move.l #$fffffffe,(a0)
 bra waitforkey

; ********************************************************

Ahell = 2 ; Anfangshelligkeit Schatten
grundhell = 20

Cubedemo:

 tst Geschwindigkeit
 beq waitforkey

 move Anzahl(pc),d1
 cmp oldanzahl(pc),d1
 beq waita3

 bsr normscreen

 clr hverz
 clr mod
 clr bmod2
 clr bmod
 clr mod2
 
 moveq #1,d1
 move Anzahl,d0
 cmp #5,d0
 bls.s lowerCube
 moveq #5,d0
 move d0,Anzahl
lowerCube:
 lsl d0,d1
 lsr #1,d1
 move d1,CubeAnzahl

 moveq #14,d0
 moveq #0,d1
 move CubeAnzahl(pc),d1
 add d1,d1
 sub d1,d0
 cmp #4,d0
 bge.s highestanzahl
 moveq #4,d0
highestanzahl:  
 move d0,shadowspeed

 moveq #0,d1
 move CubeAnzahl(pc),d1
 move.l #256,d0
 divu d1,d0
 move d0,valuec

 moveq #0,d0
 move valuec(pc),d0
 mulu #byte,d0
 move.l d0,valuecmulbyte
 
 add.l #planeadr,d0
 move.l d0,valuecmulbyteplane

 moveq #8,d1
 moveq #0,d0
 move #1,d0
 divu d0,d1
 move d1,colorverz

 moveq #8,d1
 moveq #0,d0
 move #1,d0
 add CubeAnzahl(pc),d0
 divu d0,d1
 move d1,colorverz2

 move.l #225,d1
 moveq #0,d0
 move CubeAnzahl,d0
 divu d0,d1
 move d1,shadowstart

 move Anzahl(pc),oldAnzahl

waita3:

 subq #1,hverz
 bpl nowaitx
 move CubeAnzahl(pc),hverz ; Hoehe
 subq #1,hverz

 move Geschwindigkeit(pc),d0
 cmp #1,d0
 beq.s endslowdown
 mulu #5000,d0
 sub #2500,d0
slowdown:
 subq.l #1,d0
 bpl.s slowdown
endslowdown:

 setraster 
 
 move #39*256+$00df,d7
 clr.l screenadd
 
begin2:
 move #1,d5
 add d5,mod
 add d5,d5
 sub d5,bmod2
 bpl.s noBegin
 clr mod
 clr shadz
 move shadowspeed(pc),shadz2
 move shadowstart(pc),shadow
 move valuec(pc),bmod2
 move.l #ctab,anz
 move.l #ctab2+30,anz2
 move colorverz(pc),anzverz
 move colorverz2(pc),anzverz2
 bra.s begin2
nobegin:
 move mod(pc),bmod
 move valuec(pc),d5
 subq #1,d5
 eor d5,bmod
 move bmod2(pc),mod2
 eor d5,mod2

 subq #1,anzverz2
 bpl.s noanzverz2
 move colorverz2(pc),anzverz2
 subq.l #2,anz2 
 cmp.l #ctab2,anz2
 bhi.s noanzverz2
 move.l #ctab2,anz2
noanzverz2:

 subq #1,shadz
 bpl.s noadds
 subq #1,shadz2
 move shadz2(pc),shadz
 addq #1,shadow
noadds:
 
 move valuec(pc),d5
 cmp shadow(pc),d5
 bhi.s nowaitx
 move d5,shadow 
nowaitx:

 move.l anz(pc),a4
 sub.l #ctab,a4
 move.l #32,d5
 sub.l a4,d5
 sub.l #Ahell,d5
 bpl.s grundhell0
 moveq #0,d5
grundhell0:
 cmp.l #grundhell,d5
 bgt.s grundhellx
 moveq #grundhell,d5
grundhellx:
 move.l d5,a4
 add.l #ctab,a4

 tst.b Schatten
 beq noshadowcube
 changecolor
noshadowcube:

 move.l #planeadr,a5
 
 clr d10
 move mod(pc),oldmod
 move bmod(pc),oldbmod
 moveq #-1,d5
 moveq #0,d3
 move valuec(pc),d3
lop:
 move d7,(a0)+
 move #$fffe,(a0)+
 add #$0100,d7

 tst d10
 bmi nop2
 cmp.l valuecmulbyteplane(pc),a5
 blt nop2
 move.l #planeadr,a5
 move bmod2(pc),oldmod
 moveq #-1,d5
 move #-1,d10
 move.l anz(pc),a4 
 tst.b Schatten
 beq noshadowcube3
 changecolor
noshadowcube3:
 subq #1,anzverz
 bpl.s noanzverz
 move colorverz(pc),anzverz
 addq.l #2,anz 
noanzverz:
nop2:
 
again:
 tst d5
 bmi.s negativ ; yadd
positiv2:
 lea byte(a5),a5
 sub oldmod(pc),d5
 bpl.s positiv2
negativ:
 add oldbmod(pc),d5 ; xadd
positiv:
 move.l a5,d6
screenschange:
 add.l screenadd(pc),d6
 move.l d6,d0

 changeplaneadr

 cmp shadow(pc),d3
 bne noendshad
 tst d10
 bmi noendshad
 move.l anz2(pc),a4 
 tst.b Schatten
 beq noendshad
 changecolor
noendshad:

 dbra d3,lop

 move.l valuecmulbyte(pc),d6
 add.l d6,screenadd

 tst hverz
 bne newcoplist
 move.l #$fffffffe,(a0)+
newcoplist:

 bra waitforkey

; ********************************************************

GummiBild:
 move mod(pc),d1
 tst speed
 bpl positivspeed
 move Geschwindigkeit(pc),speed
 neg speed
 bra waitdrehen
positivspeed:
 move Geschwindigkeit(pc),speed
waitdrehen:

 cmp #14,Begin
 bhi.s okBegin
 move #14,Begin
okBegin:

 cmp #255,Bschluss
 bls.s okend
 move #255,Bschluss
okend:

 setraster 

modagaindrehen:
 sub speed(pc),d1
 cmp Begin(pc),d1
 bgt nogrtdrehena
 cmp BSchluss(pc),d1
 bgt nogrtdrehen
nogrtdrehena:
 neg speed
 bra modagaindrehen
nogrtdrehen: 
 move d1,d2
 neg.b d2

 move.l #planeadr,a4
 move #39*256+$00df,d6
 moveq #-1,d5
 move.l #256,d3
lopdrehen:
 move d6,(a0)+
 move #$fffe,(a0)+
 add #$0100,d6

 cmp.l #256*byte+planeadr,a4
 blt.s nop2drehen
 move.l #planeadr,a4
nop2drehen:

againdrehen:
 tst d5
 bmi.s negativdrehen ; yadd
positiv2drehen:
 sub d1,d5
 bra.s positivdrehen
negativdrehen:
 lea byte(a4),a4
 add d2,d5 ; xadd
 bmi.s negativdrehen
 bra.s positiv2drehen
positivdrehen:
 move.l a4,d0

norsdrehen:

 changeplaneadr

 dbra d3,lopdrehen

 move.l #$fffffffe,(a0)

 move d1,mod

 bra waitforkey

; ********************************************************

; highsize = 255 ; maximal 255
; lowsize = 129 ; minimal 129

Bilddrehendemo2:

 setraster 

 move mod(pC),d1

 move d10(pC),d2
 cmp Begin(pc),d2
 bne.s changeBegin2
 move d9(pc),d2
 cmp Geschwindigkeit(pc),d2
 beq.s samespeed 
changeBegin2:
 jsr blackscreen
 clr side
 clr jumpmode
 move Begin(pc),d0
 sub #10,d0
 move d0,lowsize
 move highsize(pc),mod
 move mod(pc),d1
 lea Scanlasta(pc),a2
 move Geschwindigkeit(pc),speed
 add speed(pc),d1
 clr colverz
samespeed:

 cmp #0,side
 bne.s no0side
 sub speed(pc),d1
 cmp lowsize(pc),d1
 bgt endside
 move #1,side 
 lea Scanlastb(pc),a2
 bra endside
no0side:

 cmp #1,side
 bne.s no1side
 add speed(pc),d1
 cmp highsize(pc),d1
 blt endside
 move #2,side
 lea Scanlasta(pc),a2
 bra endside
no1side:

 cmp #2,side
 bne.s no2side
 sub speed(pc),d1
 cmp lowsize(pc),d1
 bgt endside
 move #3,side
 lea Scanlastb(pc),a2
 bra endside
no2side:

 cmp #3,side
 bne.s no3side
 add speed(pc),d1
 cmp highsize(pc),d1
 blt endside
 clr side
 lea Scanlasta(pc),a2
no3side:

endside:
 move d1,d2
 neg.b d2
 
 move d1,oldmod
 move d2,oldbmod

 move #39*256+$00df,d6
 cmp #1,side
 bhi.s noxside1
 add #127*256,d6
noxside1:

 move.l #planeadr,a5
 moveq #-1,d5
 moveq #0,d7
 move.b d7,fst
 move #255,d3
lopdrehenx:
 tst jumpmode
 beq.s nojumpmode
 addq #1,(a2)
 cmp #2,(a2)
 ble noreadscanlast
 clr jumpmode
 bra noreadscanlast
nojumpmode:
 move d6,(a0)+
 move #$fffe,(a0)+
 add #$0100,d6
overjumpnojumpmode:

 cmp #1,side
 bls.s noreadscanlast
 tst d7
 bmi.s noreadscanlast
 addq #1,d7
 cmp (a2),d7
 blt lopdrehenx
 tst (a2)
 bgt.s posidrh
 move #1,jumpmode
 bra lopdrehenx
posidrh:
 moveq #-1,d7
 addq #2,a2
noreadscanlast:

againdrehenx:
 tst d5
 bmi.s negativdrehenx ; yadd
positiv2drehenx:
 sub d1,d5
 bra.s positivdrehenx
negativdrehenx:
 lea byte(a5),a5
 add d2,d5 ; xadd
 bmi.s negativdrehenx
 bra.s positiv2drehenx
positivdrehenx:
 move.l a5,d0

 cmp.l #255*byte+planeadr,a5
 bhi zeile2drehenx

 cmp #1,side
 bls norsdrehenx
 tst jumpmode
 bne nochangeplane
 move.l #256*byte+(planeadr*2),d0
 sub.l a5,d0
norsdrehenx: 
 move.l d0,a6

 tst.b fst
 bne progrun
 addq.b #1,fst
 tst.b Schatten
 bne nocolorscan
 lea ctab(pc),a4
 changecolor
nocolorscan:
 bra nochangeplane
progrun:

 changeplaneadr

 tst.b schatten
 beq nochangeplane

 move.l a6,d0
 sub.l #planeadr,d0
 divu #byte*8,d0
 lea ctab(pc),a4
 tst.b Richtung
 bne changercht
 lea ctab(pc),a4
 eor #31,d0
changercht:
 and #$00fe,d0
 add d0,a4
 cmp.l oldcolor(pc),a4
 beq oldcolorx
 changecolor
oldcolorx:
 move.l a4,oldcolor

nochangeplane:

 dbra d3,lopdrehenx

 moveq #0,d3

Zeile2drehenx:

 lea ctabblack(pc),a4
 changecolor

 move.l #$fffffffe,(a0)

 cmp #1,side
 bhi noscanlast
 sub #127,d3
 move d3,(a2)+
noscanlast:

 move oldmod(pc),d1
 move oldbmod(pc),d2
 move d1,mod

 move Geschwindigkeit(pc),d9
 move Begin(pc),d10

 bra waitforkey

; ********************************************************

Roehrendemover:
 cmp #145,begin
 bls rightbegin
 move #145,begin
rightbegin:
 move begin(pc),d4
 sub #140,d4
 move d4,groesse

 setraster

 move Geschwindigkeit(pc),d1
 add d1,d1
 subq #1,d1
 add d1,d10
 cmp #255,d10
 bls.s nohighervaluever
 clr d10
nohighervaluever:
 move d10(pc),d9

 tst.b Richtung
 beq waitaverbx2
 eor #255,d9
waitaverbx2: 

 move.l data(pc),a2
 moveq #0,d1
 move d9,d1
 move.b schatten(pc),d5
 moveq #0,d7
 moveq #0,d2
 move d2,oldd6
 move groesse(pc),d4
 move #(39*256)+$00df,d7
 move #255,d3
lopaver:
 move d7,(a0)+
 move #$fffe,(a0)+
 add #$0100,d7
 add #byte,d2

 add anzahl(pc),d1
 cmp #255,d1
 bls.s anzahlhoeher1ver
 moveq #0,d1
anzahlhoeher1ver:

 moveq #0,d6
 move.b (a2,d1),d6
 tst d4
 beq.s nogroessenchange
 lsr d4,d6
nogroessenchange:

; mulu #byte,d6
 lsl #3,d6
 move d6,d0
 add d0,d0
 add d0,d0
 add d0,d6

 move.l #planeadr,d0
 add.l d6,d0
 add.l d2,d0

 cmp.l #planesize+planeadr,d0
 blt.s nonextpicaver
 sub.l #planesize,d0
nonextpicaver:

 changeplaneadr

 tst.b d5
 beq samecoloraver

 moveq #0,d6
 move.b (a2,d1),d6

 lsr #3,d6
 eor #31,d6
 and #$fffe,d6
 sub #10,d6

 cmp oldd6(pc),d6
 beq samecoloraver

 move d6,oldd6

 add.l #ctab,d6
 move.l d6,a4

 changecolor

samecoloraver:

 dbra d3,lopaver

 move.l #$fffffffe,(a0)

 bra waitforkey

; ********************************************************

Roehrendemoh:

 cmp #145,begin
 bls rightbeginh
 move #145,begin
rightbeginh:
 move begin,d4
 sub #140,d4
 move d4,groesse

 setraster

 move Geschwindigkeit(pc),d1
 mulu anzahl(pc),d1
 add d1,d10
 cmp #255,d10
 bls.s nohighervalueh
 clr d10
nohighervalueh:
 move d10(pc),d9

 tst.b Richtung
 bne.s andereRichtungah
 eor #255,d9
andereRichtungah:

 move.l data(pc),a2

 move.l #planeadr,d2
 move.l d2,d0
 changeplaneadr

 moveq #0,d5
 moveq #0,d7
 move d9,d1
 move #-1,oldd6
 move groesse(pc),d4
 move anzahl(pc),a5
 move #(39*256)+$00df,d7
 move #255,d3
lopah:
 move d7,(a0)+
 move #$fffe,(a0)+
 add #$0100,d7

 add a5,d1
 cmp #255,d1
 bls.s anzahlhoeher1h
 moveq #0,d1
anzahlhoeher1h:

; hier Daten fuer Bildveraenderung

 moveq #0,d6
 move.b (a2,d1),d6

 tst d4
 beq.s nogroessenchangeh
 lsr d4,d6
nogroessenchangeh:

 move d6,d5
 not d6
 and #15,d6
 move d6,d0
 lsl #4,d6
 or d6,d0
 move #bplcon1,(a0)+
 move d0,(a0)+
 lsr #3,d5
 move.l #planeadr,d0
 add.l d2,d0
 add d5,d0
 changeplaneadr
 
 tst.b schatten
 beq samecolorah

 moveq #0,d6
 move.b (a2,d1),d6

 lsr #3,d6 ; *************** eor #31,d6 farben umdrehen
 eor #31,d6
 and #$fffe,d6
 sub #10,d6

 cmp oldd6(pc),d6
 beq samecolorah

 move d6,oldd6

 lea ctab(pc),a4
 add d6,a4

 changecolor

samecolorah:

 add.l #byte,d2

 dbra d3,lopah

 move #bplcon1,(a0)+
 move #0,(a0)+

 move.l #$fffffffe,(a0)

 bra waitforkey

; ********************************************************

; ********************************************************

Roehrendemohv:

 cmp #145,begin
 bls rightbeginhv
 move #145,begin
rightbeginhv:
 move begin,d4
 sub #140,d4
 move d4,groesse

 setraster

 move Geschwindigkeit(pc),d1
 mulu anzahl(pc),d1
 add d1,d10
 cmp #255,d10
 bls.s nohighervaluehv
 clr d10
nohighervaluehv:
 move d10(pc),d9

 tst.b Richtung
 bne.s andereRichtungahv
 eor #255,d9
andereRichtungahv:

 move.l data(pc),a2

 move.l #planeadr,d2

 moveq #0,d5
 moveq #0,d7
 move d9(pc),d1
 move #-1,oldd6
 move groesse(pc),d4
 move anzahl(pc),a5
 move #(39*256)+$00df,d7
 move #255,d3
lopahv:
 move d7,(a0)+
 move #$fffe,(a0)+
 add #$0100,d7

 add a5,d1
 cmp #255,d1
 bls.s anzahlhoeher1hv
 moveq #0,d1
anzahlhoeher1hv:

 moveq #0,d6
 move.b (a2,d1),d6

 tst d4
 beq.s nogroessenchangehv
 lsr d4,d6
nogroessenchangehv:

; mulu #byte,d6
 move d6,d5
 lsr #1,d5
 lsl #3,d5
 move d5,d0
 add d0,d0
 add d0,d0 
 add d0,d5
 move d5,-(a7)

 move d6,d5
 not d6
 and #15,d6
 move d6,d0
 lsl #4,d6
 or d6,d0
 move #bplcon1,(a0)+
 move d0,(a0)+
 lsr #3,d5
 move.l d2,d0
 add (a7)+,d0 
 add d5,d0
 cmp.l #planeadr+(byte*height),d0
 bls.s newpicture
 sub.l #planesize,d2
newpicture:

 changeplaneadr
 
 tst.b schatten
 beq samecolorahv

 moveq #0,d6
 move.b (a2,d1),d6

 lsr #3,d6
 eor #31,d6
 and #$fffe,d6
 sub #10,d6

 cmp oldd6(pc),d6
 beq samecolorahv

 move d6,oldd6

 lea ctab(pc),a4
 add d6,a4

 changecolor

samecolorahv:

 add #byte,d2

 dbra d3,lopahv

 move #bplcon1,(a0)+
 move #0,(a0)+

 move.l #$fffffffe,(a0)

 bra waitforkey

; ********************************************************

slidedemo:

 tst.b schatten
 beq.s noblackslide
 bsr blackscreen
 bra.s normslide
noblackslide:
 bsr normscreen
normslide:

 setraster

 tst Geschwindigkeit
 beq noverz2
 cmp #1,Geschwindigkeit
 bne.s doublespeed
 addq #1,d9
 bra.s jmpdspeed 
doublespeed: 
 moveq #11,d1
 sub Geschwindigkeit(pc),d1
 sub d1,d10
 bpl.s noverz2
 move #8,d10
jmpdspeed:
 addq #1,d9
 cmp #255,d9
 bls.s noverz2
 clr d9
noverz2:

 move.l #255*byte+planeadr,d2
 move d9(pc),d0
 mulu #byte,d0
 sub.l d0,d2
 move.l #planeadr,a2

 move Anzahl(pc),d0
 lsl #4,d0
 move d9(pc),d4
 add d0,d4

 move #0,mod
 move #39*256+$00df,d7
 moveq #32,d1
 move #255,d3
lopslide:
 move d7,(a0)+
 move #$fffe,(a0)+
 add #$0100,d7

 cmp d9(pc),d3
 bls endslide
  
 move.l d2,d0
 changeplaneadr

 tst.b schatten
 beq nocol
 tst d1
 bmi nocol
 cmp d3,d4
 bls nocol
 subq #1,mod
 bgt nocol
 move Anzahl(pc),mod
 lea ctab(pc),a4
 cmp #255,d4
 bls.s normsubcolor
 move d4,d0
 sub #255,d0
 ext.l d0
 move Anzahl(pc),d6
 divu d6,d0
 add d0,d0
 sub d0,a4
normsubcolor:
 add d1,a4
 changecolor
 subq #2,d1
nocol:

 lea byte(a2),a2
 dbra d3,lopslide
endslide:
 move.l a2,d0 
 changeplaneadr
 lea ctab(pc),a4
 changecolor

 move.l #$fffffffe,(a0)

 bra waitforkey

oldcolor:
 dc.l 0
highsize:
 dc.w 0
lowsize:
 dc.w 0
colverz:
 dc.w 0
coladd:
 dc.l 0
Scancolor:
 dc.l 0

Scanlasta:
 ds.w 256 
Scanlastb:
 ds.w 256
Beginscana:
 dc.l 0
Beginscanb:
 dc.l 0
fst:
 dc.b 0
 even

jumpmode:
 dc.w 0
side:
 dc.w 0
speed:
 dc.w 0 

CubeAnzahl:
 dc.w 0
screenadd:
 dc.l 0
a7save:
 dc.l 0
shadowspeed:
 dc.w 6
valuec:
 dc.w 0
hverz:
 dc.w 0
valuecmulbyteplane:
 dc.l 0
valuecmulbyte:
 dc.l 0
mod:
 dc.w 0
mod2:
 dc.w 0
bmod:
 dc.w 0
bmod2:
 dc.w 0
oldmod:
 dc.w 0
oldbmod:
 dc.w 0
shadz:
 dc.w 0
shadz2:
 dc.w 0
colorverz:
 dc.w 0
colorverz2:
 dc.w 0
anz:
 dc.l 0
anz2:
 dc.l 0
anzverz:
 dc.w 0
anzverz2:
 dc.w 0

shadow:
 dc.w 0
shadowstart:
 dc.w 0

xascreen:
 dc.w 0
zhl:
 dc.w 0
colorchange:
 dc.l 0
colorchange2:
 dc.l 0
copperend:
 dc.l 0 
copperend2:
 dc.l 0 
verz:
 dc.w 0
altkey:
 dc.b 0
 even

data3d:


 dc.b  0,0,0, 3, 6, 9, 12, 15, 17, 20, 23, 26, 28, 31, 33
 dc.b  36, 38, 41, 43, 46, 48, 50, 53, 55, 57, 59, 61, 64
 dc.b  66, 68, 70, 72, 74, 76, 78, 80, 81, 83, 85, 87, 89
 dc.b  91, 92, 94, 96, 98, 99, 101, 102, 104, 106, 107, 109, 110
 dc.b  112, 113, 115, 116, 118, 119, 121, 122, 124, 125, 126, 128, 129
 dc.b  130, 132, 133, 134, 136, 137, 138, 139, 140, 142, 143, 144, 145
 dc.b  146, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159
 dc.b  161, 162, 163, 164, 165, 166, 166, 167, 168, 169, 170, 171, 172
 dc.b  173, 174, 175, 176, 177, 177, 178, 179, 180, 181, 182, 183, 183
 dc.b  184, 185, 186, 187, 187, 188, 189, 190, 191, 191, 192, 193, 194
 dc.b  194, 195, 196, 196, 197, 198, 199, 199, 200, 201, 201, 202, 203
 dc.b  203, 204, 205, 205, 206, 207, 207, 208, 208, 209, 210, 210, 211
 dc.b  212, 212, 213, 213, 214, 214, 215, 216, 216, 217, 217, 218, 218
 dc.b  219, 220, 220, 221, 221, 222, 222, 223, 223, 224, 224, 225, 225
 dc.b  226, 226, 227, 227, 228, 228, 229, 229, 230, 230, 231, 231, 232
 dc.b  232, 233, 233, 234, 234, 234, 235, 235, 236, 236, 237, 237, 238
 dc.b  238, 238, 239, 239, 240, 240, 241, 241, 241, 242, 242, 243, 243
 dc.b  243, 244, 244, 245, 245, 245, 246, 246, 246, 247, 247, 248, 248
 dc.b  248, 249, 249, 249, 250, 250, 251, 251, 251, 252, 252, 252, 253
 dc.b  253, 253, 254, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255 
 dc.b  255, 255, 255,255, 255, 255,255, 255, 255,255, 255, 255
 dc.b  255, 255, 255,255, 255, 255,255, 255, 255,255, 255, 255

sintab:

 dc.b 12,20,26,30,34,37,41,44,46,49,51,53,55
 dc.b 58,60,62,63,65,66,68,70,71,73,74,76,77
 dc.b 78,79,81,82,83,84,85,87,88,89,90,91,92
 dc.b 93,94,95,95,96,97,98,99,100,100,101,102,103
 dc.b 104,104,105,106,106,107,108,108,109,109,110,111,111
 dc.b 112,113,113,114,114,115,115,115,116,116,117,117,118
 dc.b 118,119,119,119,120,120,121,121,121,122,122,122,122
 dc.b 123,123,123,124,124,124,124,125,125,125,125,126,126
 dc.b 126,126,126,126,127,127,127,127,127,127,127,127,128
 dc.b 128,128,128,128,128,128,128,128,128,128,128,128,128
 dc.b 128,128,128,128,128,128,128,128,128,127,127,127,127
 dc.b 127,127,127,127,126,126,126,126,126,126,125,125,125
 dc.b 125,125,124,124,124,123,123,123,122,122,122,122,121
 dc.b 121,121,120,120,119,119,119,118,118,117,117,117,116
 dc.b 116,115,115,114,114,113,113,112,111,111,110,110,109
 dc.b 109,108,107,106,106,105,105,104,103,102,102,101,100
 dc.b 99,98,97,97,96,95,94,93,92,91,91,89,88
 dc.b 87,86,85,84,82,81,80,79,78,76,75,74,72
 dc.b 70,69,68,66,64,62,61,59,57,55,53,50,48
 dc.b 45,43,40,36,33,30,25,19,11  

sintab2:
 dc.b 128,128,128,128,128,128,127,127,127,127,126,126,125
 dc.b 125,125,124,123,123,122,122,121,120,119,118,118,117
 dc.b 116,115,114,113,112,111,110,109,108,106,105,104,103
 dc.b 101,100,99,98,96,95,93,92,91,89,88,86,85
 dc.b 83,82,80,79,77,76,74,73,71,69,68,66,65
 dc.b 63,62,60,59,57,55,54,52,51,49,48,46,45
 dc.b 43,42,40,39,37,36,35,33,32,30,29,28,27
 dc.b 25,24,23,22,20,19,18,17,16,15,14,13,12
 dc.b 11,10,10,9,8,7,6,6,5,5,4,3,3
 dc.b 3,2,2,1,1,1,1,0,0,0,0,0,0
 dc.b 0,0,0,0,1,1,1,1,2,2,3,3,3
 dc.b 4,5,5,6,6,7,8,9,10,10,11,12,13
 dc.b 14,15,16,17,18,19,20,22,23,24,25,27,28
 dc.b 29,30,32,33,35,36,37,39,40,42,43,45,46
 dc.b 48,49,51,52,54,55,57,59,60,62,63,65,66
 dc.b 68,69,71,73,74,76,77,79,80,82,83,85,86
 dc.b 88,89,91,92,93,95,96,98,99,100,101,103,104
 dc.b 105,106,108,109,110,111,112,113,114,115,116,117,118
 dc.b 118,119,120,121,122,122,123,123,124,125,125,125,126
 dc.b 126,127,127,127,127,128,128,128,128,128

 even


smooth:
 movem.l a1/d7,-(a7)
 move (a2),d4 ; Source
 and #$0f00,d4
 lsr #8,d4
 move (a3),d0 ; target
 and #$0f00,d0
 lsr #8,d0
 sub d4,d0 
 move (a2),d4 ; Source
 and #$00f0,d4
 lsr #4,d4
 move (a3),d1 ; target
 and #$00f0,d1
 lsr #4,d1
 sub d4,d1 
 move (a2),d4 ; Source
 and #$000f,d4
 move (a3),d2 ; target
 and #$000f,d2
 sub d4,d2 

 move (a2),d3
 and #$0f00,d3
 lsr #8,d3
 mulu #csm,d3
 move (a2),d4
 and #$00f0,d4
 lsr #4,d4
 mulu #csm,d4
 move (a2),d5
 and #$000f,d5
 mulu #csm,d5
 
 moveq #csm-1,d7 ; smoothLaenge Farbtabelle8
cslop:
 clr d8
 moveq #0,d6
 move d3,d6
 add d0,d3
 divs #csm,d6
 lsl #8,d6
 or d6,d8
 moveq #0,d6
 move d4,d6
 add d1,d4
 divs #csm,d6
 lsl #4,d6
 or d6,d8
 moveq #0,d6
 move d5,d6
 add d2,d5
 divs #csm,d6
 or d6,d8
 move d8,(a1)+ 
 dbra d7,cslop
 movem.l (a7)+,a1/d7
 rts

oldd6:
 dc.w 0
oldd5:
 dc.w 0
d8:
 dc.l 0
d9:
 dc.l 0
d10:
 dc.l 0

black:
 dc.w smoothcol1
white:
 dc.w smoothcol2

ctab:
 ds.w 33*32

ctab2:
 ds.w 33*32

ctabblack:
 ds.w 33*32


; ********************** IFFLADEROUTINE ***********************

; Die Doslibrary muss geoeffnet sein und DOSBASE muss initialisiert sein 

; a0=ADDRESSE DES NAMENS
; a5=LADEADDRESSE
; d6=GROESSE in x
; d7=GROESSE in y

LoadIFF:

 move.l Dosbase,a6
 move.l a0,d1
 move.l #1005,d2
 jsr LVOopen(a6)
 tst.l d0
 beq Keinedateierror; Diese Datei gibt es nicht
 move.l d0,file

 bsr fillbuffer

 bsr readlongbuffer
 cmp.l #"FORM",d0
 bne Error
 bsr readlongbuffer
 bsr readlongbuffer
 cmp.l #"ILBM",d0
 bne IFFError

searchbmhd:
 bsr readlongbuffer
 cmp.l #"BMHD",d0
 beq.s bmhdfound
 bsr readlongbuffer
 bsr skipdatabuffer
 bra.s searchbmhd
bmhdfound:

 bsr readlongbuffer
 lea bmhd,a0
 bsr readdatabuffer
 cmp.w (a0),d6
 bne Formaterror ; x Breite falsch
 move.w 2(a0),mod
 cmp.b #5,8(a0)
 bne Formaterror
searchcmap:
 bsr readlongbuffer
 cmp.l #"CMAP",d0
 beq.s cmapfound
 bsr readlongbuffer
 bsr skipdatabuffer
 bra.s searchcmap
cmapfound:

 bsr readlongbuffer
 lea cmap,a0
 bsr readdatabuffer
 moveq #31,d0
 lea iffcolors,a2
docolors:
 move.b (a0)+,d1
 lsl.w #4,d1
 move.b (a0)+,d1
 move.b (a0)+,d2
 lsr.b #4,d2
 or.b d2,d1
 move.w d1,(a2)+
 dbra d0,docolors
seekbody:
 bsr readlongbuffer
 cmp.l #"BODY",d0
 beq.s bodyfound
 bsr readlongbuffer
 bsr skipdatabuffer
 bra.s seekbody
bodyfound:

 jsr readlongbuffer
 move.b planes,d4
 ext.w d4
 subq.w #1,d4
 lsr.l #3,d6
 move.w d7,d5
 mulu d6,d5
 subq.w #1,d7

 cmp.b #1,comp
 beq.s iffcomp

 move.l d6,d0
undoit:
 move.l d4,d3
 movea.l a5,a0
unoneline:
 bsr readdatabuffer
 add.l d5,a0
 dbra d3,unoneline
 cmp.b #1,mask
 bne.s unnomask
 bsr skipdatabuffer
unnomask:
 adda.l d0,a5
 dbra d7,undoit
 jmp closeiff

iffcomp:

 movea.l a5,a1
 move.l d4,d3
pkoneline:

 moveq #0,d2
 movea.l a1,a0
pkoneplane:
 bsr readbytebuffer
 tst.l d0
 bpl.s nichtgepackt
  neg.l d0
  add.l d0,d2
  addq.l #1,d2
  move.l d0,d1
  bsr readbytebuffer
pkcopyloop:
  move.b d0,(a0)+
  dbra d1,pkcopyloop
  bra.s gepackt
nichtgepackt:
 addq.l #1,d0
 bsr readdatabuffer
 adda.l d0,a0
 add.l d0,d2
gepackt:
 cmp.w d6,d2
 blt.s pkoneplane
 adda.l d5,a1
 dbra d3,pkoneline

 cmp.b #1,mask
 bne.s pknomask
  moveq #0,d2
mskonce:
  bsr readbytebuffer
  tst.l d0
  bpl.s msknopacked
   neg.l d0
   add.l d0,d2
   addq.l #1,d2
   bsr readbytebuffer
   bra.s mskback
msknopacked:
  addq.l #1,d0
  bsr skipdatabuffer
  add.l d0,d2
mskback:
  cmp.w d6,d2
  blt.s mskonce
pknomask:

 add.l d6,a5
 dbra d7,iffcomp

 cmp #256,mod
 beq palpic
 cmp #200,mod
 bne formaterror 
 move.l #planeadr+(byte*200),a0
 moveq #bitpl-1,d1
ntscloop2:
 move.l a0,a1
 move.l #(56*byte),d0
clsntsc:
 clr.b (a1)+
 dbra d0,clsntsc
 lea planesize(a0),a0
 dbra d1,ntscloop2
palpic:
 

closeiff:
 move.l file,d1
 jsr LVOclose(a6)
 rts

fillbuffer:
 movem.l a0-a1/d0-d4,-(a7)
 move.l #Buffer,d2
 move.l #Buffersize,d3
 move.l file,d1
 jsr LVOread(a6)
 move.l #Buffer,a3
 movem.l (a7)+,a0-a1/d0-d4
 rts

readlongbuffer:
 movem.l a0/d0,-(a7)
 moveq #3,d0
 move.l #Longword,a0
lreadbuflop:
 move.b (a3)+,(a0)+
 cmp.l #Bufferende-1,a3
 bls lBuffernichtvoll
 bsr fillbuffer
lBuffernichtvoll:
 dbra d0,lreadbuflop
 movem.l (a7)+,a0/d0
 move.l Longword,d0
 rts
Longword:
 dc.l 0

readbytebuffer:
 move.b (a3)+,d0
 cmp.l #Bufferende-1,a3
 bls Buffernochnichtgelesen
 bsr fillbuffer
Buffernochnichtgelesen: 
 ext.w d0
 ext.l d0
 rts

readdatabuffer:
 movem.l a0/d0,-(a7)
 subq.l #1,d0
readbuflop:
 move.b (a3)+,(a0)+
 cmp.l #Bufferende-1,a3
 bls rBuffernichtvoll
 bsr fillbuffer
rBuffernichtvoll:
 dbra d0,readbuflop
 movem.l (a7)+,a0/d0
 rts

skipdatabuffer:
 movem.l d0,-(a7)
 subq.l #1,d0
skipbuflop:
 addq.l #1,a3
 cmp.l #Bufferende-1,a3
 bls sBuffernichtvoll
 bsr fillbuffer
sBuffernichtvoll:
 dbra d0,skipbuflop
 movem.l (a7)+,d0
 rts

Keinedateierror:
 move.l #Filenichtgefunden,Text
 jsr Writetext
 move.l execbase,a6
 move.l #dataend-planeadr,d0
 move.l #planeadr,a1
 jsr freemem(a6)
 move.l dosbase(pc),a1
 jsr closelib(a6)
 addq #4,a7 
 moveq #10,d0
 rts

error:
 move.l #NoIFF,Text
 jsr Writetext
 move.l execbase,a6
 move.l #dataend-planeadr,d0
 move.l #planeadr,a1
 jsr freemem(a6)
 move.l dosbase(pc),a1
 jsr closelib(a6)
 addq #4,a7 
 moveq #10,d0
 rts

IFFerror:
 move.l #Noilbm,Text
 jsr Writetext
 move.l execbase,a6
 move.l #dataend-planeadr,d0
 move.l #planeadr,a1
 jsr freemem(a6)
 move.l dosbase(pc),a1
 jsr closelib(a6)
 addq #4,a7 
 moveq #10,d0
 rts

Formaterror:
 move.l #Formatx,Text
 jsr Writetext
 move.l execbase,a6
 move.l #dataend-planeadr,d0
 move.l #planeadr,a1
 jsr freemem(a6)
 move.l dosbase(pc),a1
 jsr closelib(a6)
 addq #4,a7 
 moveq #10,d0
 rts

bmhd:
 dc.w 0,0
 dc.w 0,0
planes:
 dc.b 0
mask:
 dc.b 0
comp:
 dc.b 0
 dc.b 0
 dc.w 0
 dc.b 0,0
 dc.w 0,0
cmap:
 ds.b 96
iffcolors:
 ds.w 32
file:
 dc.l 0
Buffer:
 ds.b 8192
Bufferende:
 dc.w 0
Buffersize = Bufferende-Buffer

Dosbase:
 dc.l 0

Dosname:
 dc.b "dos.library",0
 even

nonamemessage:
 dc.b $9b,"0;33;40m"
 dc.b "Showfx V1.0 is Freeware / Copyright © 1991 by R.Reber ",10
 dc.b $9b,"1;31;40m"
 dc.b "Aufruf: SHOWFX ´IFF-File (320x256/200x32)´",10
 dc.b $9b,"0;31;40m"
 even
Filenichtgefunden:
 dc.b "Konnte File nicht finden !",10,0
 even
NoIff:
 dc.b "Keine IFF Datei !",10,0
 even
Noilbm:
 dc.b "Keine IFF Bild Datei !",10,0
 even
Formatx:
 dc.b "Nur IFF-Bilder im Format 320*256/200 5 Bitplane",10,0
 even

Helptext:
 dc.b $9b,"0;33;40m"
 dc.b "Showfx V1.0 is Freeware / Copyright © 1991 by R.Reber ",10
 dc.b $9b,"1;31;40m"
 dc.b "Aufruf: SHOWFX ´IFF-File (320x256/200x32)´",10
 dc.b $9b,"0;31;40m"
 dc.b "(Tastaturbelegung im Programm)",10
 dc.b "-  Parameter -",10
 dc.b "0-9=Geschwindigkeit",10
 dc.b "F1/F2=Anzahl(-/+)",10
 dc.b "F3/F4=Begin(-/+)|Faktor(-/+)",10
 dc.b "F5/F6=Ende(-/+)",10
 dc.b "F7=Schatten",10
 dc.b "F8=Richtung",10
 dc.b "F9=Farbe 1",10
 dc.b "F10=Farbe 2",10
 dc.b "ESC=Ende",10
 dc.b "- Effekte -",10
 dc.b "A=Roehren1(0-9/F1/F2/F7/F8/F9)",10
 dc.b "B=Roehren2(0-9/F1/F2/F7/F8/F9)",10
 dc.b "C=Wuerfel(0-9/F1/F2/F7/F9/F10)",10
 dc.b "D=Gummi(0-9/F1/F2/F3/F4/F5/F6)",10
 dc.b "E=Drehen(0-9/F3/F4/F9)",10
 dc.b "F=3d(0-9/F1/F2//F7/F8/F9)",10
 dc.b "G=Wellen1(0-9/F1/F2/F3/F4/F7/F8/F9)",10
 dc.b "H=Wellen2(0-9/F1/F2/F3/F4/F7/F8/F9)",10
 dc.b "I=Roehren1(0-9/F1/F2/F3/F4/F7/F8/F9)",10
 dc.b "J=Roehren2(0-9/F1/F2/F3/F4/F7/F8/F9)",10
 dc.b "K=Roehren3(0-9/F1/F2/F3/F4/F7/F8/F9)",10
 dc.b "l=Slide(0-9/F1/F2/F7/F9)",10
 dc.b 0
 even

Grafikname:
 ds.b 64

 end

