;*************************
;*                       *
;*      >> ZEGAR <<      *
;*  coded by jacek dabek *
;*	   v_1.1    `    *
;*************************

;>--exec.library:

Exec	 	=  4
AllocMem 	= -198
FreeMem  	= -210
OldOpenLibrary	= -408
CloseLibrary    = -414
Forbid	        = -132
Permit	        = -138
FindName        = -276
WaitPort        = -384
GetMsg          = -372
ReplyMsg        = -378

;>--graphics.library:

SetRGB4		= -288
GetSprite	= -408
FreeSprite	= -414
ChangeSprite	= -420
MoveSprite	= -426

;>--dos.library:

CreateProc      = -138
DateStamp	= -192
Delay		= -198

;>--intuition.libraray:

ViewAddress	= -294

;*************************
;*        -ETAP 1-  	 *
;*   PRZYDZIAL ZADANIA   *
;*************************

        section Prog,Code
START:
	move.l	Exec,a6
	move.l	$114(a6),a0
	tst.l	$ac(a0)
	bne	RUN
	lea	$5c(a0),a0
	jsr	WaitPort(a6)
	jsr	GetMsg(a6)
	move.l	d0,d7
	jsr	Forbid(a6)
	move.l	d7,a1
	jsr	ReplyMsg(a6)
	moveq	#0,d0
	rts
RUN:
	lea	START(pc),a1
	move.l	-4(a1),d3
	clr.l	-4(a1)
	lea	$17a(a6),a0
	move.l	#lib_name3,a1
	jsr	FindName(a6)
	move.l	$114(a6),a0
	move.l	d0,a6
	move.l	$98(a0),d1
	jsr	-$60(a6)
	move.l	d0,-(sp)
	move.l	a6,-(sp)
	move.l	Exec,a6
	jsr	Forbid(a6)
	move.l	(sp)+,a6
	move.l	#ProcName,a5
	move.l	a5,d1
	moveq	#0,d2
	move.l	#$dac,d4
	jsr	CreateProc(a6)
	move.l	d0,a0
	move.l	(sp)+,$3c(a0)
	move.l	Exec,a6
	jsr	Permit(a6)
	moveq	#0,d0
	rts
	
;*************************
;*        -ETAP 2-  	 *
;* PRZYGOTOWANIE SYSTEMU *
;*************************

	section  Prog1,Code
	
;>--rezerwacja RAM dla spritow:
	
	move.l	Exec,a6
	move.l	#SpritSize,d0
	move.l	#Clear,d1
	jsr	AllocMem(a6)
	cmpi.l	#0,d0
	beq	EXIT
	move.l	d0,SpritAd

;>--otwarcie bibl. intuition:

	move.l	Exec,a6
	lea.l   lib_name1(pc),a1
	jsr	OldOpenLibrary(a6)
	cmpi.l	#0,d0
	beq	FREE_RAM
	move.l	d0,INTbase
	move.l	d0,a6
	
;>--pobranie adresu ViewPortu:
	
	jsr	ViewAddress(a6)
	move.l	a0,ScreenAd
	move.l	(a0),NextScAd
		
;>--zamkniecie bibl. intuition:
	
	move.l	Exec,a6
	move.l	INTbase,a1
	jsr	CloseLibrary(a6)
	
;>--otwarcie bibl. dos:

	move.l	Exec,a6
	lea.l   lib_name3(pc),a1
	jsr	OldOpenLibrary(a6)
	cmpi.l	#0,d0
	beq	FREE_RAM
	move.l	d0,DOSbase

;>--zamkniecie bibl. dos:
	
	move.l	Exec,a6
	move.l	DOSbase,a1
	jsr	CloseLibrary(a6)

;>--otwarcie bibl. graficznej:

	move.l	Exec,a6
	lea.l   lib_name2(pc),a1
	jsr	OldOpenLibrary(a6)
	cmpi.l	#0,d0
	beq	FREE_RAM
	move.l	d0,GFXbase
	move.l	d0,a6

;>--szukanie adresu danych sprita 0:

	move.l	$26(a6),a0
SEARCH:
	cmpi.w	#$0122,(a0)+
	bne	SEARCH
	moveq	#0,d0
	move.w	(a0),d0
	move.l	d0,Spr0adres
	
;>--przydzial spritow:

	move.l	#SimpleSpr6,-(a7)
	move.l	#SimpleSpr5,-(a7)
	move.l	#SimpleSpr4,-(a7)
	move.l	#SimpleSpr3,-(a7)
	move.l	#SimpleSpr2,-(a7)
	moveq	#2,d0
	moveq	#2,d2
	moveq	#4,d3
	moveq	#100,d4
	moveq	#100,d5
	moveq	#4,d6
GET_NEXT:
	move.l  (a7)+,a0
	move.l	a0,a5
	jsr	GetSprite(a6)
	subq	#1,d6
	cmpi.b	d0,d2
	bne	ORG_STACK	
	addq	#1,d0
	addq	#1,d2
	move.l	a5,a0
	move.w	d4,ss_x(a0)
	move.w	d5,ss_y(a0)
	move.w	#15,ss_height(a0)
	addi.b	#16,d4
	dbra	d3,GET_NEXT
		
;>--zmiana kol. dla aktualnych screenow:

	move.l	NextScAd,a5
NEXT_SC:
	bsr	COLOR
	move.l  NextScAd,a0
	cmpi.l	#0,(a0)
	beq	RST_SC
	move.l	(a0),NextScAd
	bra	NEXT_SC
RST_SC:
	move.l	a5,NextScAd
	
;>--wyswietlenie spritow:

	move.l	#SimpleSpr6,-(a7)
	move.l  SpritAd,a0
	adda	#$110,a0
	move.l	a0,-(a7)
	move.l	#SimpleSpr5,-(a7)
	suba	#$44,a0
	move.l	a0,-(a7)
	move.l	#SimpleSpr4,-(a7)
	suba	#$44,a0
	move.l	a0,-(a7)
	move.l	#SimpleSpr3,-(a7)
	suba	#$44,a0
	move.l	a0,-(a7)
	move.l	#SimpleSpr2,-(a7)
	suba	#$44,a0
	move.l	a0,-(a7)
	moveq	#4,d5
DISPLAY:
	move.l	#0,a0
	move.l	(a7)+,a2
	move.l	(a7)+,a1
	jsr	ChangeSprite(a6)
	dbra	d5,DISPLAY

;>--zamkniecie bibl. graficznej:

	move.l	Exec,a6
	move.l	GFXbase,a1
	jsr	CloseLibrary(a6)

;*************************
;*       -ETAP 3-	 *
;*     PETLA GLOWNA      *
;*************************

;>--zwloka czasowa zadania:
TASK_WAIT:
	move.l	DOSbase,a6
	moveq	#1,d1
	jsr	Delay(a6)

;>--miganie lub odczytanie czasu:

	move.b	Counter,d0
	cmpi.b	#12,d0
	bne	TUTAJ1
	bsr	PULSE1
TUTAJ1:
	cmpi.b	#25,d0
	bne	TUTAJ2
	bsr	READ_CLOCK
	move.b	#0,Counter
	bra	COMPARE
TUTAJ2:
	addq	#1,d0
	move.b	d0,Counter

;>--sprawdz czy otwarto nowy screen:
COMPARE:
	move.l	ScreenAd,a0
	move.l	NextScAd,d0
	cmpi.l  (a0),d0
	beq	TEST
	move.l	(a0),NextScAd
	jsr	COLOR
	
;>--test kolizji i myszki:
TEST:
	move.l	#$DFF00E,a0
	move.w	(a0),d0
	btst	#9,d0
	bne	MAUS_LEFT
	btst    #10,d0
	bne	MAUS_LEFT
	btst    #11,d0
	beq	TASK_WAIT
MAUS_LEFT:
	btst	#6,$BEE001
	bne	MAUS_RIGHT
	bsr	MOVE
	bra	TASK_WAIT
MAUS_RIGHT:
	btst	#10,$DFF016
	bne	TASK_WAIT
	
;*************************
;*       -ETAP 4-	 *
;* ZAKONCZENIE PROGRAMU  *
;*************************

;>--oddanie spritow systemowi:

	moveq	#7,d2
FREE_SPR:	
	cmpi.b	#2,d2
	beq	FREE_RAM
	move.l	GFXbase,a6
	subq	#1,d2	
	move.l	d2,d3
	subq	#2,d3
FREE_NEXT:
	move.l	d2,d0
	jsr	FreeSprite(a6)
	subq	#1,d2
	dbra	d3,FREE_NEXT

;>--zwolnienie przydzielonej RAM:
FREE_RAM:
	move.l	Exec,a6
	move.l	#SpritSize,d0
	move.l	SpritAd,a1
	jsr	FreeMem(a6)
EXIT:
	moveq	#0,d0
	rts
	
;*************************
;*     PODPROGRAMY       *
;*************************
;>----------------
;>--odczyt zegara:
;>----------------
READ_CLOCK:
	move.l	DOSbase,a6
	move.l	#Czas,d1
	jsr	DateStamp(a6)
	move.l	#Czas,a0
	move.l	$4(a0),d0
	divu	#60,d0
	move.l  d0,d7
	andi.l	#$000000ff,d0
	divu	#10,d0
	move.l	d0,d6
	move.l	#Cyfry,a0
	move.l	SpritAd,a2
	moveq	#3,d1
	moveq	#2,d2
	moveq	#16,d5
LOOP1:
	move.l	a0,a1
	andi.l	#$0000000f,d0
	rol.l	#1,d0
	adda	d0,a1
	moveq	#12,d3
	adda	#$4,a2
	move.l	#$ffff,(a2)+
LOOP2:
	move.w	(a1),(a2)+
	move.w	#$ffff,(a2)+	
	adda	#40,a1
	dbra	d3,LOOP2
	move.l	#$ffff,(a2)+
	move.l	#$ffffff7f,(a2)+
	cmpi.b  d2,d1
	bne	TU
	move.l	a0,a1
	adda	#20,a1
	adda	#$4,a2
	move.l	#$ffff,(a2)+
	moveq	#8,d2
	moveq	#12,d3
	andi.l	#$00ff0000,d7
	rol.l	d5,d7
	divu	#10,d7
	rol.l	d5,d7
	move.l	d7,d6
	bra	LOOP2
TU:
	rol.l	d5,d6
	move.b	d6,d0
	dbra	d1,LOOP1
	rts
	
;>-----------------	
;>---mig. kropkami:
;>-----------------
PULSE1:	
	move.l	SpritAd,a0
	adda	#$98,a0
	moveq	#8,d1
PULSE2:
	move.l	#$0000ffff,(a0)+
	dbra	d1,PULSE2
	rts

;>-----------------
;>--przesuw zegara:
;>-----------------
MOVE:
	move.l	Spr0adres,a0
	move.w  (a0),d0
	move.w	d0,d1
        move.w  2(a0),d4
	andi.w  #$00ff,d0
        subi.w  #$40,d0
        rol.w   #1,d0
	move.w	d0,d2

        andi.w  #$0004,d4
        rol.w   #8,d4
        andi.w  #$ff00,d1
        ror.w   #8,d1
        tst.w   d4
        beq	NIE_D
        ori.w   #$0100,d1
NIE_D: 
        subi.w  #44,d1	
        move.w	d1,d3

	move.l	GFXbase,a6
	move.l	#0,a0
	move.l	#SimpleSpr2,a1
	jsr	MoveSprite(a6)

	move.w	d2,d0
	addi.w	#16,d0
	move.w	d3,d1	
	move.l	#0,a0
	move.l	#SimpleSpr3,a1
	jsr	MoveSprite(a6)

	move.w	d2,d0
	addi.w	#32,d0
	move.w	d3,d1
	move.l	#0,a0
	move.l	#SimpleSpr4,a1
	jsr	MoveSprite(a6)

	move.w	d2,d0
	addi.w	#48,d0
	move.w	d3,d1
	move.l	#0,a0
	move.l	#SimpleSpr5,a1
	jsr	MoveSprite(a6)

	move.w	d2,d0
	addi.w	#64,d0
	move.w	d3,d1
	move.l	#0,a0
	move.l	#SimpleSpr6,a1
	jsr	MoveSprite(a6)
	rts

>-----------------	
;>-zmiana kolorow:
>-----------------
COLOR:	
	move.l	GFXbase,a6
	move.l	NextScAd,a0
	moveq	#22,d0
	move.l	d0,d6
	move.l	#$00000000,d1
	move.l	#$000f0000,d2
	move.l	#$00000000,d3
	moveq	#2,d4
	moveq	#5,d5
CHANGE:
	jsr	SetRGB4(a6)
	move.l	NextScAd,a0
	addq	#1,d6
	move.l	d6,d0
	swap	d4
	addi.b	d4,d0
	move.b	d0,d6
	swap	d2
	move.l	d2,d1
	dbra	d5,CHANGE
	rts

;>-----------------
;>--orginalny stos:
;>-----------------
ORG_STACK:
	move.l  (a7)+,a0
	dbra	d6,ORG_STACK
	bra	FREE_SPR

;*************************
;*      BLOK DANYCH      *
;*************************
	incdir	df0:include/
	include	graphics/sprite.i
	incdir	df1:source/
Cyfry:	incbin	dane1
INTbase		dc.l  0
GFXbase		dc.l  0
DOSbase		dc.l  0
SpritAd		dc.l  0
Spr0adres	dc.l  0
ScreenAd	dc.l  0
NextScAd	dc.l  0
Czas		dc.l  0
		dc.l  0
		dc.l  0
Counter		dc.b  0
lib_name1	dc.b  'intuition.library',0
lib_name2	dc.b  'graphics.library',0
lib_name3	dc.b  'dos.library',0
ProcName	dc.b  'ZEGAR',0
SimpleSpr2	ds.b  ss_SIZEOF
SimpleSpr3	ds.b  ss_SIZEOF
SimpleSpr4	ds.b  ss_SIZEOF
SimpleSpr5	ds.b  ss_SIZEOF
SimpleSpr6	ds.b  ss_SIZEOF
Clear     = $10002
SpritSize = (4*17)*5
           	END
