OBJECT	equ	1

Program:
	move.l	sp,stack

	move.l	4,a6
	lea	intname(pc),a1
	jsr	-408(a6)
	move.l	d0,intbase
	lea	dosname(pc),a1
	jsr	-408(a6)
	move.l	d0,dosbase
	lea	gfxname(pc),a1
	jsr	-408(a6)
	move.l	d0,gfxbase

	IF OBJECT

	move.l	276(a6),a3
	tst.l	172(a3)
	bne.s	fromCLI
fromWB
	lea	92(a3),a0		; get wb msg
	jsr	-384(a6)
	move.l	4,a6
	lea	92(a3),a0
	jsr	-372(a6)
	move.l	d0,wbmsg

	move.l	wbmsg(pc),a0
	move.l	$24(a0),a0
	beq.b	fromcli

	move.l	(a0),d1
	move.l	dosbase(pc),a6
	jsr	-126(a6)
fromcli:
	ENDIF

	move.l	4,a6
	cmp.w	#36,20(a6)
	blt.w	no20

	suba.l	a1,a1
	move.l	4,a6
	jsr	FindTask(a6)		; znalezienie struktury wîasnego tasku
	move.l	d0,Task

	lea	myport,a1
	jsr	AddPort(a6)		; dodanie do systemu wîasnego portu
	bsr.w	initall
	bsr.w	openwindow

	move.l	window(pc),a0
	lea	winname(pc),a1
	lea	scrtitle(pc),a2
	move.l	intbase(pc),a6
	jsr	-276(a6)

	lea	panel,a0
	clr.l	d0
	clr.l	d1
	move.l	#5,d2
	move.l	#5,d3
	move.l	#150,d4
	move.l	#40,d5
	bsr.w	rysuj

message:
	move.l	gfxbase(pc),a6
	jsr	-270(a6)
	jsr	-270(a6)

	tst.l	drive0
	bmi.s	nodraw0
	lea	diskio0,a0
	bsr.w	gettracknum
	cmp.b	last0,d0
	beq.s	nodraw0
	move.b	d0,last0
	move.l	d0,d2
	move.l	#11,d0
	move.l	#22,d1
	bsr.w	drawnumber
nodraw0:
	tst.l	drive1
	bmi.s	nodraw1
	lea	diskio1,a0
	bsr.w	gettracknum
	cmp.b	last1,d0
	beq.s	nodraw1
	move.b	d0,last1
	move.l	d0,d2
	move.l	#48,d0
	move.l	#22,d1
	bsr.w	drawnumber
nodraw1:
	tst.l	drive2
	bmi.s	nodraw2
	lea	diskio2,a0
	bsr.w	gettracknum
	cmp.b	last2,d0
	beq.s	nodraw2
	move.b	d0,last2
	move.l	d0,d2
	move.l	#85,d0
	move.l	#22,d1
	bsr.w	drawnumber
nodraw2:
	tst.l	drive3
	bmi.s	nodraw3
	lea	diskio3,a0
	bsr.w	gettracknum
	cmp.b	last3,d0
	beq.s	nodraw3
	move.b	d0,last3
	move.l	d0,d2
	move.l	#122,d0
	move.l	#22,d1
	bsr.w	drawnumber
nodraw3:

	move.l	window(pc),a0
	move.l	86(a0),a0
	move.l	4,a6
	jsr	-372(a6)
	tst.l	d0
	beq.w	message
	move.l	d0,a1
	move.l	20(a1),d2
	move.w	24(a1),d3

	move.l	4,a6
	jsr	-378(a6)

	cmp.l	#512,d2
	bne.w	message

quit:
	move.l	stack,sp

	bsr.w	closewindow
	bsr.w	quitall

	lea	myport,a1
	move.l	4,a6
	jsr	RemPort(a6)		; usuniëcie MsgPort'u

no20:
	move.l	intbase(pc),a1
	move.l	4,a6
	jsr	-414(a6)

	move.l	dosbase(pc),a1
	move.l	4,a6
	jsr	-414(a6)

	move.l	gfxbase(pc),a1
	move.l	4,a6
	jsr	-414(a6)

	move.l	wbmsg(pc),d2
	beq.s	nowb
	move.l	4,a6
	jsr	-132(a6)
	move.l	d2,a1
	move.l	4,a6
	jsr	-378(a6)
nowb:
	clr.l	d0
	rts

openwindow:
	movem.l	d0-d3/a0,-(sp)

	move.w	win_sizey(pc),d0
	move.w	win_sizex(pc),d1
	move.w	win_y(pc),d2
	move.w	win_x(pc),d3

	move.w	#1,win_sizex
	move.w	#1,win_sizey
	move.w	#1,win_y
	move.w	#1,win_x

	bsr.w	open_window
	bsr.w	closewindow

	add.w	addy(pc),d0
	move.w	d0,win_sizey
	move.w	d1,win_sizex
	move.w	d2,win_y
	move.w	d3,win_x

	move.l	actscreen(pc),a0
	move.w	win_y(pc),d0
	tst.w	d0
	bpl.s	nocentery
	move.w	$e(a0),d1
	move.w	win_sizey(pc),d0
	asr.w	#1,d0
	asr.w	#1,d1
	sub.w	d0,d1
	move.w	d1,win_y
nocentery:
	move.w	win_y(pc),d0
	move.w	$e(a0),d1
	add.w	win_sizey(pc),d0
	cmp.w	d0,d1
	bge.s	nomove
	sub.w	win_sizey(pc),d1
	move.w	d1,win_y

nomove:
	move.w	win_x(pc),d0
	tst.w	d0
	bpl.s	nocenterx
	move.w	$c(a0),d1
	move.w	win_sizex(pc),d0
	asr.w	#1,d0
	asr.w	#1,d1
	sub.w	d0,d1
	move.w	d1,win_x
nocenterx:
	move.w	win_x(pc),d0
	move.w	$c(a0),d1
	add.w	win_sizex(pc),d0
	cmp.w	d0,d1
	bge.s	nomove2
	sub.w	win_sizex(pc),d1
	move.w	d1,win_x
nomove2:
	bsr.s	open_window

	move.w	d2,win_y
	move.w	d3,win_x

	movem.l	(sp)+,d0-d3/a0
	rts

open_window:
	movem.l	d0-d7/a0-a6,-(sp)

	move.l	intbase(pC),a6
	lea	newwindow(pc),a0
	jsr	-204(a6)
	move.l	d0,window
	tst.l	d0
	beq.W	quit

	move.l	window(pc),a0
	move.l	$2e(a0),actscreen

	move.l	window(pC),a0
	move.l	$32(a0),a0
	move.l	a0,rastport

	move.l	actscreen(pc),a0
	move.l	$28(a0),a0
	move.w	4(a0),addy
	add.w	#3,addy

	movem.l	(sp)+,d0-d7/a0-a6
	rts

closewindow:
	movem.l	d0-d7/a0-a6,-(sp)
	move.l	intbase(pc),a6
	move.l	window(pc),a0
	jsr	-72(a6)
	movem.l	(sp)+,d0-d7/a0-a6
	rts

newwindow:
win_x:	dc.w	10000
win_y:	dc.w	10000
win_sizex:
	dc.w	160
win_sizey:
	dc.w	50
	dc.b	0
	dc.b	1
win_idcmpflags:
	dc.l	512+8+$2000000+$200000+$400
win_flags:
	dc.l	2+4+8+$10000
	dc.l	0
	dc.l	0
win_title:
	dc.l	WINNAME
win_screen:
	dc.l	0
	dc.l	0
win_minsizex:
	dc.w	0
win_minsizey:
	dc.w	0
win_maxsizex:
	dc.w	463
win_maxsizey:
	dc.w	10
win_type:
	dc.w	1

addy:	dc.w	0

winname:
	dc.b	'TrackDisplay',0
scrtitle:
	dc.b	'This little proggy was written by PP/Termos/Union.',0
	even

	dc.b	'$VER: TrackDisplay 1.1 (17.04.95)',0

exec		=4
findtask	=-294
addport		=-354
remport		=-360
opendevice	=-444
closedevice	=-450
doio		=-456

; a0 - diskio

; d0 - track number

gettracknum:
	move.l	24(a0),a0
	move.w	54(a0),d0
	rts

initall:
	lea	diskio0,a1
	moveq	#0,d0
	bsr.w	inittrackdisk
	move.l	d0,drive0

	lea	diskio1,a1
	moveq	#1,d0
	bsr.w	inittrackdisk
	move.l	d0,drive1

	lea	diskio2,a1
	moveq	#2,d0
	bsr.w	inittrackdisk
	move.l	d0,drive2

	lea	diskio3,a1
	moveq	#3,d0
	bsr.w	inittrackdisk
	move.l	d0,drive3

	rts

quitall:
	tst.l	drive0
	bmi.s	nod0
	lea	diskio0,a1
	bsr.w	quittrackdisk
nod0:
	tst.l	drive1
	bmi.s	nod1
	lea	diskio1,a1
	bsr.w	quittrackdisk
nod1:
	tst.l	drive2
	bmi.s	nod2
	lea	diskio2,a1
	bsr.w	quittrackdisk
nod2:
	tst.l	drive3
	bmi.s	nod3
	lea	diskio3,a1
	bsr.w	quittrackdisk
nod3:
	rts

; a1 - diskio
; d0 - unit

InitTrackDisk:
	moveq	#0,d1
	lea	TrackName(pc),a0
	move.l	#myport,14(a1)
	MOVE.L	EXEC,A6
	jsr	OpenDevice(a6)
	tst.l	d0
	bne.w	error
	rts

; a1 - diskio

QuitTrackDisk:
	move.l	Exec,a6
	jsr	CloseDevice(a6)
	rts

Error:
	moveq	#-1,d0
	rts

TrackName:
	dc.b	"trackdisk.device",0

	even

dosname:
	dc.b	'dos.library',0
gfxname:
	dc.b	'graphics.library',0
intname:
	dc.b	'intuition.library',0

	even

dosbase:
	dc.l	0
gfxbase:
	dc.l	0
wbmsg:
	dc.l	0

; *****************************************************
; *** a0 - obiekt
; *** d0 - move x
; *** d1 - move y
; *** d2 - x
; *** d3 - y
; *** d4 - size x
; *** d5 - size y
; *****************************************************
rysuj:
	move.l	#%11001100,d6

; *****************************************************
; *** d6 - operation
; *****************************************************

rysop:
	bsr.s	bitmapcreate
rysdal:	movem.l	d0-d7/a0-a6,-(sp)
	lea	bitmapstruct(pc),a0
	move.l	rastport(pc),a1
	move.l	gfxbase(pc),a6
	bsr.w	putbitmap
	movem.l	(sp)+,d0-d7/a0-a6
	rts

rysnob:
	move.l	#%11001100,d6
	bra.s	rysdal

bitmapcreate:
	movem.l	a0/d4-d6,-(sp)
	move.w	d4,d6
	add.w	#15,d6
	asr.w	#4,d6

	add.w	d6,d6
	move.w	d6,d4
	add.w	d6,d6

	move.w	d6,szer
	move.w	d5,wys
	move.l	a0,adres1b

	ext.l	d4 ;*
	add.l	d4,a0 ;*

	move.l	a0,adres2b

	movem.l	(sp)+,a0/d4-d6
	rts

putbitmap:
	add.w	addy(pc),d3
	jsr	-606(a6)
	rts

bitmapstruct:
szer:	dc.w	2
wys:	dc.w	8
	dc.b	0
	dc.b	2
	dc.w	0
adres1b:
	dc.l	0
adres2b:
	dc.l	0

; d0 - x
; d1 - y
; d2 - num*2

drawnumber:

	ext.l	d0
	ext.l	d1
	asr.w	#1,d2
	tst.w	d2
	bmi.w	error
	cmp.w	#100,d2
	bge.w	error
	ext.l	d2

	movem.l	d0-d7/a0-a6,-(sp)
	lea	numbers,a0
	move.l	#130,d4
	move.l	#19,d5
	bsr.w	bitmapcreate
	movem.l	(sp)+,d0-d7/a0-a6

	move.l	d2,-(sp)
	divu	#10,d2
	ext.l	d2
	mulu	#13,d2

	movem.l	d0-d7/a0-a6,-(sp)
	exg.l	d0,d2
	move.l	d1,d3
	clr.l	d1
	move.l	#13,d4
	move.l	#19,d5
	move.l	#%11001100,d6
	bsr.w	rysdal
	movem.l	(sp)+,d0-d7/a0-a6

	move.l	(sp)+,d2
	divu	#10,d2
	swap	d2
	ext.l	d2
	mulu	#13,d2
	add.l	#15,d0

	movem.l	d0-d7/a0-a6,-(sp)
	exg.l	d0,d2
	move.l	d1,d3
	clr.l	d1
	move.l	#13,d4
	move.l	#19,d5
	move.l	#%11001100,d6
	bsr.w	rysdal
	movem.l	(sp)+,d0-d7/a0-a6

	rts

last0:
	dc.b	-1
last1:
	dc.b	-1
last2:
	dc.b	-1
last3:
	dc.b	-1

drive0:
	dc.l	0
drive1:
	dc.l	0
drive2:
	dc.l	0
drive3:
	dc.l	0
actscreen:
	dc.l	0
intbase:
	dc.l	0
window:
	dc.l	0
rastport:
	dc.l	0
stack:
	dc.l	0

myport:
;	-  Node   -
	dc.l	0		; Succ
	dc.l	0		; Pred
	dc.b	4		; Type=NT_MsgPort
	dc.b	-128		; Pri
	dc.l	PortName	; Name
;	- MsgPort -
	dc.b	2		; Flags=ignore
	dc.b	0		; SigBit
Task:	dc.l	0		; Task
;	-  List   -
Head:	dc.l	Tail		; Head
Tail:	dc.l	0		; Tail
	dc.l	Head		; TailPred
	dc.b	4		; Type=NT_MsgPort
	dc.b	0		; pad

PortName:
	dc.b	'TrackDisplay port',0

	section	graphics,data_c

panel:
	inciff	"panel150x40.iff"
numbers:
	inciff	"numbers130x19.iff"

	section free,bss

DiskIO0:
	ds.l	20

DiskIO1:
	ds.l	20

DiskIO2:
	ds.l	20

DiskIO3:
	ds.l	20
