**********************************************************************
* Widget Download system - ST receiver                               *
**********************************************************************

	OPT	c+			; Case sensitive.


VER_MAJOR	equ	4
VER_MINOR	equ	0

STACK_SIZE	equ	1024

PSG_SELECT	equ	$ffff8800
PSG_READ	equ	$ffff8800
PSG_WRITE	equ	$ffff8802
GPIP		equ	$fffffa01


	SECTION	TEXT

Start
	clr.l	-(sp)			; Supervisor mode.
	move.w	#32,-(sp)
	trap	#1
	addq	#6,sp
	move.l	d0,stack_save

Restart
	move.w	#$2700,sr

	lea	Stack(pc),sp

	lea	(PSG_SELECT).w,a5
	lea	(PSG_WRITE).w,a4
	lea	(GPIP).w,a3

	move.b	#7,(a5)			;Select mixer I/O control.
	move.b	#%11111111,(a4)		;Set port B to output.

	moveq	#0,d1
.loop
	move.b	#15,(a5)		;Select I/O port B.
	move.b	d0,(a4)

	move.b	#14,(a5)
	move.b	(a4),d2
	and.b	#%11011111,d2
	or.b	#2,d2
	or.b	d1,d2
	move.b	d2,(a4)

	move.w	d0,-(sp)
	move.w	d1,-(sp)
	bsr	show_hex

	moveq	#13,d0
	bsr	show_char
	moveq	#10,d0
	bsr	show_char

	move.w	(sp)+,d1
	move.w	(sp)+,d0
	addq.b	#1,d0
	eor.b	#%00100000,d1

	bra	.loop

exit
	move.w	#$2300,sr

	move.w	#7,-(sp)		; Wait for a key.
	trap	#1
	addq	#2,sp

	move.l	stack_save,-(sp)	; User mode.
	move.w	#32,-(sp)
	trap	#1
	addq	#6,sp

	clr.w	-(sp)
	trap	#1


show_char
	move.w	d0,-(sp)
	move.w	#2,-(sp)
	trap	#1
	addq	#4,sp
	rts


show_hex
	ror.w	#8,d0
	moveq	#2-1,d1
.loop
	rol.w	#4,d0
	move.w	d0,-(sp)

	and.w	#$000f,d0
	add.b	#'0',d0
	cmp.b	#'9',d0
	ble.s	.decimal
	add.b	#('A'-'9'-1),d0
.decimal
	bsr	show_char

	move.w	(sp)+,d0
	dbf	d1,.loop
	rts


	SECTION	DATA

title_str
	dc.b	27,'E'
	dc.b	'WIDGET DOWNLOADER',13,10

	dc.b	'VERSION '
	dc.b	VER_MAJOR+'0'
	dc.b	'.'
	dc.b	(VER_MINOR/10)+'0'
	dc.b	(VER_MINOR-(VER_MINOR/10))+'0'
	dc.b	13,10

	dc.b	'(C) 1992-1995',13,10
	dc.b	'LEO SKIRENKO',13,10
	dc.b	'PHILIP WATTS',13,10
	dc.b	0

workspace_str
	dc.b	10,'WORKSPACE = '
	dc.b	0
	even

address_str	dc.b	13,10,"Address: ",0
length_str	dc.b	13,10,"Length:  ",0
execute_str	dc.b	13,10,"Execute: ",0

file_str	dc.b	13,10,"File:   ",0
file_size	dc.b	13,10,"Length: ",0

	even


	SECTION	BSS

Address		ds.l	1
Length		ds.l	1
Execute		ds.l	1

handle		ds.w	1
filename	ds.b	80
file_buffer	ds.b	16384

stack_save	ds.l	1

	ds.b	STACK_SIZE
Stack
