execbase = 4

;exec library
OpenLibrary = -552
CloseLibrary = -414
AllocMem = -198
FreeMem = - 210
GetMsg = - 372 ; a0 = port
ReplyMsg = - 378 ; a1 = msg

;graphics library
WaitTOF = -270

;intuition library
OpenWindow = -204 ; a0=newwindow
CloseWindow = -72 ; a0=window
SetWindowTitles = -276 ; a0=window,a1=wintitle,a2=scrtitle
PrintIText = -216

hoehe=9
breite=16
maxcrabs=13
kundsch=125
minhunger=1
maxhunger=1000
satt=1
plip=2

;================================================

; Killer Krabben  

; Programmed by Tobias Walter

; SynPsych (TM) by Sidney

;================================================

move #$800f,$dff096
move.l execbase,a6
move.l #260,d0
move.l #$2,d1
jsr AllocMem(a6)
tst d0
beq error
move.l d0,soundadr
move.l d0,a0
add.l #256,d0
move.l d0,nullsoundadr
lea sound,a1
move #64,d0
copysound:
move.l (a1)+,(a0)+
dbf d0,copysound

lea intlib,a1
moveq #0,d0
jsr OpenLibrary(a6)
move.l d0,intbase
beq error

move.l d0,a6
lea OurWindow,a0
jsr OpenWindow(a6)
move.l d0,window
beq error

move.l d0,a0
move.l 86(a0),MyMsgPort ; Wemmer mol dabei isch...
move.l #-1,a1
lea OurScreenTitel,a2
jsr SetWindowTitles(a6)

move.l window,a0
move.l 50(a0),MyRastPort
jsr PrintMyVeryOwnCopyrightMessage


move.l execbase,a6
lea gfxlib,a1
moveq #0,d0
jsr OpenLibrary(a6)
move.l d0,gfxbase
beq error

move.l gfxbase,a0
move.l 34(a0),a1 ; Zeiger auf ActiView (Typ: View)
move.l 0(a1),a4  ; Pointer auf ViewPort (Typ: ViewPort)
move.w 24(a4),width
sub #breite-1,width
move.w 26(a4),height
sub #hoehe-1,height
move.l 36(a4),a0 ; Pointer auf RasInfo (Typ: RasInfo) 
move.l 4(a0),a5  ; Pointer auf BitMap (Typ: BitMap)
move.w (a5),BytesPerRow
move.l 8(a5),plane1
move.l 12(a5),plane2

move.l #maxcrabs*12,d0
move.l #1,d1
jsr allocmem(a6)
tst d0
beq error

move.l d0,ourmem
move.l d0,a0
move.l #maxcrabs-1,d0
floop: move #0,8(a0)
adda #12,a0
dbf d0,floop
move.l a0,endmem

bsr FirstCrab

HauptProgrammSchleife:
move.l gfxbase,a6

jsr WaitTOF(a6)
move.l ourmem,a5
moveloop:

move 8(a5),d0
beq ndrehen
bpl okcrab
subq #1,10(a5)
bne ndrehen
move #plip,10(a5)
jsr calc
move.l 4(a5),a0
adda.l #4*hoehe,a0
bsr loeschcrab
add.l #6*hoehe,4(a5)
addq #1,8(a5)
beq ndrehen
bsr plop
bra ndrehen

okcrab: bsr calc
lea crabmask,a0
bsr loeschcrab

Bewegung:

move (a5),d0
add 4(a5),d0
bpl nlinks
neg 4(a5)
move (a5),d0
nlinks:
cmp width,d0
bcs nrechts
neg 4(a5)
move (a5),d0
nrechts:
move d0,(a5)

move 2(a5),d1
add 6(a5),d1
bpl noben
neg 6(a5)
move 2(a5),d1
noben:
cmp height,d1
bcs nunten
neg 6(a5)
move 2(a5),d1
nunten:
move d1,2(a5)

bsr calc
bsr testcrab
bne gnix
cmp.l ourmem,a5
beq keine_kollision
subq #1,8(a5)
bne keine_kollision
bsr crabtot
bra ndrehen

gnix:
bsr zufall
move.l kanal,a0
move.l soundadr,(a0)
move #256,4(a0)
move.l d0,-(a7)
mulu #1000,d0
swap d0
add #100,d0
move d0,6(a0)
move #64,8(a0)
add.l #16,kanal
subq #1,scount
bpl soundok
move.l #$dff0a0,kanal
move #3,scount

soundok: move.l (a7)+,d0 
mulu #breite*2/3,d0
swap d0
addq #1,d0
btst #1,rnd+7
beq nullix
neg d0
nullix: move d0,4(a5)
bsr zufall
mulu #hoehe*2/3,d0
swap d0
addq #1,d0
btst #1,rnd+7
beq nulliy
neg d0
nulliy: move d0,6(a5)

cmp #maxcrabs,anzahl
beq keine_kollision
subq #1,10(a5)
bne keine_kollision
move #satt,10(a5)
bsr addcrab

keine_kollision:
lea crabmask,a0
bsr loeschcrab
lea craba1,a0
bsr drawcrab
bsr zufall
and #7,d0
bne ndrehen
bsr drehen
ndrehen:

adda #12,a5
cmp.l endmem,a5
bne moveloop
tst anzahl
beq ende

move.l #$dff0a0,a0
move #7,d0
move $dff01e,d1
saus:
btst d0,d1
beq nich
move.l nullsoundadr,(a0)
move #1,4(a0)
nich:
add.l #16,a0
addq #1,d0
cmp #11,d0
bne saus

btst #7,$bfe001
beq ende

move.l execbase,a6
move.l MyMsgPort,a0
jsr GetMsg(a6)
tst.l d0
beq hauptprogrammschleife

move.l d0,a1
move.l 20(a1),d7 ; Was fuer ne Msg ??
jsr ReplyMsg(a6)

cmp #$200,d7
beq ende

jsr PrintMyVeryOwnCopyrightMessage

bra HauptProgrammSchleife

;	\	\	\	\	\	\

PrintMyVeryOwnCopyrightMessage:

move.l intbase,a6
move.l MyRastPort,a0
lea StartOfMyVeryOwnIntuiText,a1
moveq #10,d0
moveq #10,d1
jsr PrintIText(a6)
rts

crabtot:
subq #1,anzahl
move #-3,8(a5)
move.l #plopa1,4(a5)
move #plip,10(a5)
bsr plop
rts

plop:
bsr calc
move.l 4(a5),a0
adda.l #4*hoehe,a0
bsr loeschcrab
move.l 4(a5),a0
bsr drawcrab
rts

drehen:
nullx: bsr zufall
mulu #breite*2/3,d0
swap d0
tst d0
beq nullx
tst 4(a5)
bpl nnegx
neg d0
nnegx: move d0,4(a5)
nully: bsr zufall
mulu #hoehe*2/3,d0
swap d0
tst d0
beq nully
tst 6(a5)
bpl nnegy
neg d0
nnegy: move d0,6(a5)
rts

;	=	=	=	=	=

drawcrab:
move.l d2,a1
add.l plane1,a1
move #1,d3
draw1:
move #hoehe-1,d7
draw:
move (a0)+,d0
swap d0
clr d0
ror.l d1,d0
or.l d0,(a1)
adda.w BytesPerRow,a1
dbf d7,draw
move.l d2,a1
add.l plane2,a1
dbf d3,draw1
rts

testcrab:
move.l d2,a1
move.l d2,a2
add.l plane1,a1
add.l plane2,a2
lea crabmask,a0
move #hoehe-1,d7
test:
move (a0),d0
eor #$ffff,d0
swap d0
clr d0
ror.l d1,d0
move.l (a1),d3
or.l (a2),d3
and.l d3,d0
bne foundpixel

adda.w BytesPerRow,a1
adda.w BytesPerRow,a2
dbf d7,test
tst.l d0
foundpixel: rts

calc:
move 2(a5),d2
mulu BytesPerRow,d2
clr.l d1
move.w (a5),d1
lsr.w #3,d1
and #$fffe,d1
add.l d1,d2
move.w (a5),d1
and.w #15,d1
rts

loeschcrab:
move.l d2,a1
add.l plane1,a1
move #1,d3
loesch1: move.l a0,-(a7)
move #hoehe-1,d7
loesch:
move (a0)+,d0
swap d0
move #$ffff,d0
ror.l d1,d0
and.l d0,(a1)
adda.w BytesPerRow,a1
dbf d7,loesch
move.l d2,a1
add.l plane2,a1
move.l (a7)+,a0
dbf d3,loesch1
rts

;	-	-	-	-	-	

FirstCrab:
addq #1,anzahl
move.l ourmem,a0
bsr zufall
mulu width,d0
swap d0
move d0,(a0)+
move rnd+4,d0
mulu height,d0
swap d0
move d0,(a0)+
bsr zufall
mulu #4*breite/3,d0
swap d0
sub #2*breite/3,d0
move d0,(a0)+
move rnd+4,d0
mulu #4*hoehe/3,d0
swap d0
sub #4*hoehe/3,d0
move d0,(a0)+
move #1000,(a0)+
move #satt,(a0)+
rts

AddCrab:
move #maxcrabs-1,d0
move.l ourmem,a0
spl: tst 8(a0)
adda #12,a0
beq newcrab
dbf d0,spl
rts

newcrab: suba #12,a0

move.l (a5),(a0)+
move.l 4(a5),(a0)+
jsr zufall
mulu #kundsch,d0
swap d0
addq #1,d0
cmp #7,d0
bne kurzleb
bsr zufall
mulu #maxhunger,d0
swap d0
addq #1,d0
bra lebtab
kurzleb:
move #minhunger,d0
lebtab:
move d0,(a0)+
move #satt,(a0)+
addq #1,anzahl
rts

;================================================

ende: 
move.l execbase,a6     ; Libraries wieder freigeben
move.l soundadr,a1
move.l #260,d0
jsr FreeMem(a6)
move.l ourmem,a1
move.l #12*maxcrabs,d0
jsr FreeMem(a6)
move.l gfxbase,a1
jsr CloseLibrary(a6)

move.l intbase,a6
move.l window,a0
jsr CloseWindow(a6)

move.l execbase,a6
move.l intbase,a1
jsr CloseLibrary(a6)

move #$f,$dff096
rts
error: illegal

zufall: move.l d1,-(a7) 
move.l rnd,d0
move.l d0,rnd+8
move.l rnd+4,d1
eor.l d1,d0
roxl.l rnd+12
roxr.l #1,d0
move.l d0,rnd
move.l rnd+8,d0
move $dff006,d1
swap d1
move.b $bfd800,d1
eor.l #$276b3fa9,d1
eor.l d1,d0
move.l d0,rnd+4
move.l (a7)+,d1
rts

rnd: dc.l $ffffffff,$55555555,0,0

gfxlib: dc.b "graphics.library",0
even
OurWindowTitel: dc.b "Killer Crabs",0
even
OurScreenTitel: dc.b "Killer Crabs  ©"
                dc.b " by Genuine Software Solutions, inc. 1987",0
even
intlib: dc.b "intuition.library",0
even

MyRastPort:      blk.l 1
MyMsgPort:       blk.l 1
window:          blk.l 1
intbase: 	 blk.l 1
gfxbase:	 blk.l 1
View:    	 blk.l 1
ViewPort:	 blk.l 1
RasInfo: 	 blk.l 1
BitMap:          blk.l 1
BytesPerRow:	 blk.w 1
Plane1:		 blk.l 1
Plane2:		 blk.l 1
width: 		 blk.w 1
height: 	 blk.w 1
ourmem:		 blk.l 1
endmem: 	 blk.l 1
anzahl:	 	 dc.w 0
kol:		 dc.w 0
kanal:		 dc.l $dff0a0
scount: 	 dc.w 3

soundadr:	 blk.l 1
nullsoundadr:	 blk.l 1

craba1: 	dc.w %0000111111110000
		dc.w %0011111111111100
		dc.w %0111111111111110
		dc.w %1111001111001111
		dc.w %1111111111111111
		dc.w %0111111111111110
		dc.w %0011111111111100
		dc.w %0000111111110000
		dc.w %0000000000000000

craba2:		dc.w %0000111111110000
		dc.w %0011111111111100
		dc.w %0110000110000110
		dc.w %1110110110110111
		dc.w %1111111111111111
		dc.w %0111001111001110
		dc.w %0011100000011100
		dc.w %0000111111110000
		dc.w %0000000000000000

crabmask:	dc.w %1111000000001111
		dc.w %1100000000000011
		dc.w %1000000000000001
		dc.w %0000000000000000
		dc.w %0000000000000000
		dc.w %1000000000000001
		dc.w %1100000000000011
		dc.w %1111000000001111
		dc.w %1111111111111111

plopa1:		dc.w %0000000000000000
		dc.w %0000000000000000
		dc.w %0000010101000000
		dc.w %0000001110000000
		dc.w %0000110001100000
		dc.w %0000001110000000
		dc.w %0000010101000000
		dc.w %0000000000000000
		dc.w %0000000000000000

plopa2:		dc.w 0,0,0,0,0,0,0,0,0

plopmaska:	dc.w %1111111111111111
		dc.w %1111111111111111
		dc.w %1111101010111111
		dc.w %1111110001111111
		dc.w %1111001110011111
		dc.w %1111110001111111
		dc.w %1111101010111111
		dc.w %1111111111111111
		dc.w %1111111111111111
	
plopb1:		dc.w %0000000000000000
		dc.w %0000100100100000
		dc.w %0000010101000000
		dc.w %0000000000000000
		dc.w %0001100000110000
		dc.w %0000000000000000
		dc.w %0000010101000000
		dc.w %0000100100100000
		dc.w %0000000000000000

plopb2:		dc.w 0,0,0,0,0,0,0,0,0

plopmaskb:	dc.w %1111111111111111
		dc.w %1111011011011111
		dc.w %1111101010111111
		dc.w %1111111111111111
		dc.w %1110011111001111
		dc.w %1111111111111111
		dc.w %1111101010111111
		dc.w %1111011011011111
		dc.w %1111111111111111

plopc1:		dc.w %0000000100000000
		dc.w %0000100100100000
		dc.w %0000010001000000
		dc.w %0000000000000000
		dc.w %0111000000011100
		dc.w %0000000000000000
		dc.w %0000010001000000
		dc.w %0000100100100000
		dc.w %0000000100000000

plopc2:		dc.w 0,0,0,0,0,0,0,0,0

plopmaskc:	dc.w %1111111011111111
		dc.w %1111011011011111
		dc.w %1111101110111111
		dc.w %1111111111111111
		dc.w %1000111111100011
		dc.w %1111111111111111
		dc.w %1111101110111111
		dc.w %1111011011011111
		dc.w %1111111011111111

sound:		dc.b 0,125,127,127,121,60,-121,-123,-122,-119
		dc.b -101,123,120,118,118,121,-125,-116,-113
		dc.b -113,-123,121,109,105,105,111,-107,-98
		dc.b -95,-94,-95,82,86,84,82,80,-48,-74,-75
		dc.b -73,-69,12,67,68,67,64,22,-63,-65,-64
		dc.b -62,-47,63,63,62,62,61,-65,-61,-60,-60
		dc.b -64,64,58,56,56,60,-59,-53,-51,-51,-52
		dc.b 47,47,46,45,44,-31,-41,-40,-40,-37,12,36
		dc.b 36,36,34,6,-33,-34,-34,-33,-20,33,33,33
		dc.b 32,30,-33,-32,-32,-32,-33,34,31,30,30,32
		dc.b -32,-28,-28,-27,-29,27,25,25,24,24,-19
		dc.b -22,-22,-21,-20,10,19,20,19,18,0,-18,-18
		dc.b -18,-17,-8,17,17,17,17,14,-17,-17,-17,-17
		dc.b -17,18,16,16,16,17,-17,-15,-15,-15,-16
		dc.b 15,14,13,13,13,-11,-12,-12,-12,-11,7
		dc.b 10,11,10,10,-2,-9,-10,-9,-9,-3,9,9,9,9,7
		dc.b -9,-9,-9,-9,-9,9,9,8,8,9,-9,-8,-8,-8,-8
		dc.b 8,7,7,7,7,-7,-7,-6,-6,-6,4,6,6,6,5,-2
		dc.b -5,-5,-5,-5,-1,5,5,5,5,3,-5,-5,-5,-5,-4
		dc.b 5,4,4,4,5,-5,-4,-4,-4,-5,4,4,4,4,4,-4,-4
		dc.b -3,-3,-3,3,3,3,3,3,-1,-3,-3,-3,-3

nullsound:	dc.b 0,0,0,0

OurWindow:      dc.w 10,10,248,18
		dc.b 3,1
		dc.l $202
                dc.l $0002100f
		dc.l 0,0
		dc.l OurWindowTitel
		dc.l 0,0
		dc.w 248,18,248,70
		dc.w 1

StartOfMyVeryOwnIntuiText:
                dc.b 3,0,1,0
                dc.w 38,8
		dc.l 0
		dc.l TheFirstString
		dc.l StartOfMyNextIntuiText
TheFirstString: dc.b "A Mean Display Hack",0
even
StartOfMyNextIntuiText:
                dc.b 1,0,1,0
		dc.w 30,26
		dc.l 0
		dc.l TheSecondString
		dc.l AnotherIntuiText
TheSecondString:
		dc.b "© Tobias 'Top' Walter",0
even
AnotherIntuiText:
		dc.b 3,0,1,0
		dc.w 2,42
		dc.l TextAttr
		dc.l AnotherString
		dc.l 0
AnotherString:  dc.b "Dedicated to Leo L. Schwab !",0
even
TextAttr:       dc.l NameOfCharset
		dc.w 8 ; Size
		dc.b 4 ; Style
		dc.b 1 
even
NameOfCharSet:  dc.b "topaz.font",0




