Atarimania

Atari ST - 1990

Black Hornet

Black Hornet — screenshot 11 / 19
Genre
Shoot'em Up! - Vertical Scrolling
Year
1990
Language
Machine Language
Publisher
[no publisher]
Controls
Joystick
Distributor
Players
1
Developer
Hive
Resolution
Low
Licensed from
-
Programmer(s)
Kendall, Glyn
Country
United Kingdom
Graphic Artist(s)
Hive
Software
English
Game design
Hive
Box/Instructions
Musician(s)
Lowe, Dave
License
Prototype
Sound FX
Lowe, Dave
Serial
Cover Artist(s)
ST Type
ST, STe / 0.5MB
MIDI
Version
[WIP 1990.11.1]
Dump
Download
Number of Disks
1 / Double Sided
Dump format
MSA
Protection

OTHER VERSIONS WITH THE SAME TITLE (1)

INSTRUCTIONS

Disk includes TIMER.S file with source code:

*timer shell 01.11.90 V.7 Glyn Kendall
*Tabs=10. Case independant.

all equ 0 	;me
HOW_MANY	equ 1000	;call test this many times

*Assemble in devpac using assemble to memory option.
*Then press alt/x to run.
*This prog will call the routine at Test HOW_MANY times.
*When done will wait for 'ESC' then returns to devpac.

	bra	start		jump over test
	even
*timed code here
TEST
*this just a demo. Time is 84-86 on my machine
	move.l	scr(a6),a0
	lea	160*16(a0),a0	;down a bit
	lea	square(pc),a1	;data
	moveq	#31,d0		;32 hi
.loop	move.l	(a1)+,(a0)+	;32 pixels wide
	move.l	(a1)+,(a0)+
	move.l	(a1)+,(a0)+
	move.l	(a1)+,(a0)+
	lea	160-16(a0),a0	;down a scr line
	dbf	d0,.loop
	rts
square
* Hi 32 wide 32
 dc.l $00000000,$00000000,$00010001,$00010001
 dc.l $00000000,$00000000,$00010001,$00010001
 dc.l $00000000,$00000000,$00000001,$00010001
 dc.l $00000000,$00000000,$00000001,$00010001
 dc.l $00000000,$00000000,$00010000,$00010001
 dc.l $00000000,$00000000,$40010000,$7E014001
 dc.l $00000000,$00000000,$BE003E00,$C1018001
 dc.l $00000000,$00000000,$BF003F00,$C0F90001
 dc.l $00F50025,$00EA00DF,$B6F93FF9,$C0000001
 dc.l $019F00FF,$01F0010F,$A3013BF9,$CC000001
 dc.l $030001FF,$0390020F,$A2803B01,$CC780001
 dc.l $061F03FF,$0770040F,$A2783B79,$CC800001
 dc.l $0C000780,$0E800800,$A2413B78,$CC800001
 dc.l $08000700,$0D000800,$AA593B78,$CC800001
 dc.l $08000700,$0D000800,$B6583778,$C8800001
 dc.l $07000000,$08000800,$BE783F78,$C0800001
 dc.l $1D8F0100,$1E8F1008,$80F90001,$FFF90000
 dc.l $091F010F,$1E901010,$FFF9FFF9,$00010000
 dc.l $06B8079F,$18201020,$0018FFF9,$00010000
 dc.l $07300718,$08270000,$00180009,$FFF10000
 dc.l $08330B18,$06270F03,$FFF90008,$FFF1FFE0
 dc.l $08330B18,$06270F03,$FFF90008,$FFF1FFE0
 dc.l $08330B18,$06270F03,$00F9FF08,$FFF1FFE0
 dc.l $08330B18,$06270F03,$01788008,$80F1FFE0
 dc.l $08330B18,$06270F03,$01788008,$80F1C1E0
 dc.l $08330B18,$06270F03,$01788008,$80F1C1E0
 dc.l $08330B18,$06270F03,$01798009,$80F0C1E0
 dc.l $08330B18,$06270F03,$01798009,$80F0C1E0
 dc.l $08330B18,$06270F03,$01798009,$80F0C1E0
 dc.l $08330B18,$06270F03,$01788009,$80F0C1E0
 dc.l $00000000,$00000000,$00000001,$00000000
 dc.l $1C73FC0F,$03FF0000,$33320F0F,$00FEFFFE
*this just a demo end

****************************
Start	move.l	a7,a5
	lea	spdata(pc),a6		Global data pointer
	lea	datae+300(a6),sp	my stack pointer
	move.l	4(a5),a5		base page
	move.l	$c(a5),d0		text
	add.l	$14(a5),d0		data
	add.l	$1c(a5),d0		bss
	add.l	#$100+300,d0		base page length+stack space
	move.l	d0,-(sp)		length to keep
	move.l	a5,-(sp)		start address
	clr.w	-(sp)			filler
	move.w	#$4a,-(sp)
	trap	#1			M_SHRINK
	lea	12(sp),sp
*program here
	bsr	init
	bsr	cls

	bsr	gotime	init timer
	move.w	#how_many-1,d0	call sub this many
tm_lp	move.w	d0,-(sp)
	bsr	test		timed sub
*	bsr	getime
	move.w	(sp)+,d0
	dbf	d0,tm_lp
	bsr	ttime	print result
t_w	bsr	keys	wait esc
	bra.s	t_w


Cls	move.l	scr(a6),a0
	move.w	#7999,d0
.loop	clr.l	(a0)+
	dbf	d0,.loop
	rts

Gotime	lea	ntime(pc),a0
	clr.w	(a0)
	bsr.s	gtime
	lea	stime(pc),a0
	move.w	clk(pc),(a0)
	rts
Getime	bsr.s	gtime
	move.w	clk(pc),d0
	lea	ntime(pc),a0
	sub.w	(a0),d0
	add.w	d0,(a0)
	bra	sprint
Ttime	bsr.s	gtime
	move.w	clk(pc),d0
	sub.w	stime(pc),d0
	bra	sprint

Gtime	pea	rtime(pc)
	move.w	#38,-(sp)
	trap	#14
	addq.l	#6,sp
	rts
rtime	lea	clk(pc),a0
	move.w	$4bc.w,(a0)
	rts
clk	ds.w 1
stime	ds.w 1	start time
ntime	ds.w 1	now time



KEYS	moveq	#0,d7
ke_lp	move.l	d0,d7	empty buffer
	move.w	#$ff,-(sp)
	move.w	#6,-(sp)	crawio
	trap	#1
	addq.l	#4,sp
	tst.l	d0
	bne.s	ke_lp
	move.l	d7,d0	last valid key
	cmpi.w	#$1b,d0		esc?
	beq	quit
*	cmpi.b	#32,d0	space bar(fire)
*	beq.s	fire
	swap	d0		cursors in high word
	cmpi.w	#$48,d0
	beq.s	uparrow
	cmpi.w	#$50,d0
	beq.s	dnarrow
	cmpi.w	#$4d,d0
	beq.s	rtarrow
	cmpi.w	#$4b,d0
	beq.s	ltarrow
k_ex	rts

UPARROW	subq.w	#1,y(a6)
up_x	rts
DNARROW	addq.w	#1,y(a6)
dn_x	rts
RTARROW	addq.w	#1,x(a6)
rt_x	rts
LTARROW	subq.w	#1,x(a6)
lt_x	rts

INIT	move.l	#32260,-(sp)	32000+enough to ensure 256.b align
	move.w	#$48,-(sp)	malloc
	trap	#1
	addq.l	#6,sp
	tst.l	d0		error?
	beq	quit		must have it
	move.l	d0,ram(a6)	for return to system at end
	add.l	#256,d0		align
	andi.w	#$ff00,d0	long value really
	move.l	d0,scr2(a6)	
	move.w	#2,-(sp)	get_physbase
	trap	#14
	addq.l	#2,sp
	move.l	d0,scr1(a6)
	move.l	d0,scr(a6)	
	move.w	#4,-(sp)	get_rez
	trap	#14
	addq.l	#2,sp
	move.w	d0,rez(a6)
	cmpi.w	#2,d0	is it hi
 	beq.s	in_0
	moveq	#0,d0
	bsr.s	dorez	golow
	bsr	getcol	get system colours
	bsr	putcol	put sprite colours in
in_0	move.w	#-1,-(sp)
	move.w	#-1,-(sp)
	move.w	#35,-(sp)	read keyboard rates
	trap	#14
	addq.l	#6,sp
	move.w	d0,d1
	andi.w	#7,d1
	move.w	d1,rep(a6)
	lsr.w	#8,d0
	move.w	d0,ini(a6)
	move.w	#2,-(sp)	repeat
	move.w	#1,-(sp)	set kbd rate
	move.w	#35,-(sp)
	trap	#14
	addq.l	#6,sp
	move.w	a0,seed(a6)	just put a number in
	pea	stmsg(pc)	do cursor,colors
	move.w	#9,-(sp)
	trap	#1
	addq.l	#6,sp
	rts

dorez	move.w	d0,-(sp)
	move.l	#-1,-(sp)
	move.l	#-1,-(sp)
	move.w	#5,-(sp)
	trap	#14
	lea	12(sp),sp
	rts

QUIT	move.l	ram(a6),-(sp)	return memory to system
	move.w	#$49,-(sp)
	trap	#1
	addq.l	#6,sp

	move.w	#-1,-(sp)	don't change rez
	move.l	scr1(a6),-(sp)	physical screen 1
	move.l	scr1(a6),-(sp)	logical screen 1
	move.w	#5,-(sp)	setsceen
	trap	#14
	lea	12(sp),sp
	bsr	outcol		return colours
	cmpi.w	#2,rez(a6)	hi rez?
	beq.s	qu_1		no
	moveq	#1,d0
	bsr.s	dorez	gomed		
qu_1	move.w	rep(a6),-(sp)
	move.w	ini(a6),-(sp)
	move.w	#35,-(sp)
	trap	#14	keyboard rates
	addq.l	#6,sp
	move.w	#27,-(sp)	show cursor (esc e)
	move.w	#2,-(sp)
	trap	#1
	addq.l	#4,sp
	move.w	#'e',-(sp)	show cursor
	move.w	#2,-(sp)
	trap	#1
	addq.l	#4,sp
ke	move.w	#$ff,-(sp)	empty keyboard buff
	move.w	#6,-(sp)	crawio
	trap	#1
	addq.l	#4,sp
	tst.l	d0
	bne.s	ke

	clr.w	-(sp)		Exit to desktop
	move.w	#$4c,-(sp)
	trap	#1	
*set the screen to scr1 and the logical(system print) to scr2
SSCR1	move.w	#37,-(sp)	vsync
	trap	#14
	addq.l	#2,sp
	move.w	#-1,-(sp)	don't change rez
	move.l	scr1(a6),-(sp)	physical screen 1
	move.l	#-1,-(sp)	scr2(a6),-(sp)	logical screen 2
	move.w	#5,-(sp)	setsceen
	trap	#14
	lea	12(sp),sp
	move.w	#14,wscr(a6)	14=scr1 0=scr2
	move.l	scr2(a6),scr(a6) sprite write
	move.w	#37,-(sp)	vsync
	trap	#14
	addq.l	#2,sp
	rts

SSCR2	move.w	#37,-(sp)	vsync
	trap	#14
	addq.l	#2,sp
	move.w	#-1,-(sp)	don't change rez
	move.l	scr2(a6),-(sp)	physical screen 2
	move.l	#-1,-(sp)	scr1(a6),-(sp)	logical screen 1
	move.w	#5,-(sp)	setsceen
	trap	#14
	lea	12(sp),sp
	move.w	#0,wscr(a6)	save scr num(use other screen)
	move.l	scr1(a6),scr(a6) sprite write to other screen
	move.w	#37,-(sp)	vsync
	trap	#14
	addq.l	#2,sp
	rts
*wait d4+1 interupts
DELAY	move.w	#37,-(sp)	vsync
	trap	#14
	addq.l	#2,sp
	dbf	d4,delay
	rts

PRINT	bsr.s	setlog1
	bsr.s	pr_in
	bsr.s	setlog2
pr_in	move.w	#27,-(sp)	home (esc H)
	move.w	#2,-(sp)
	trap	#1
	addq.l	#4,sp
	move.w	#'H',-(sp)	home
	move.w	#2,-(sp)
	trap	#1
	addq.l	#4,sp
	pea	msg(pc)
	move.w	#9,-(sp)
	trap	#1
	addq.l	#6,sp
	rts
SETLOG1	move.w	#-1,-(sp)	don't change rez
	move.l	#-1,-(sp)	or physical
	move.l	scr1(a6),-(sp)	logical screen 1
	move.w	#5,-(sp)	setsceen
	trap	#14
	lea	12(sp),sp
	rts
SETLOG2	move.w	#-1,-(sp)	don't change rez
	move.l	#-1,-(sp)	or physical
	move.l	scr2(a6),-(sp)	logical screen 2
	move.w	#5,-(sp)	setsceen
	trap	#14
	lea	12(sp),sp
	rts


;D0.W =VALUE RANGE IS 0 TO 65535 THEN WILL RET VAL - 65535
;WILL PRODUCE LEADING ZEROS FOR ALL VAL<10000 USES D0-D3 A0-A2
sprint	LEA.L   STRING(PC),A0
	LEA.L   TENT(PC),A1
	LEA.L   DIGIT(PC),A2
	MOVEQ   #3,D3  ;4 FOR 10000
AGAIN   MOVEQ   #0,D1
	MOVE.W  D0,D1
	DIVU    (A1)+,D1
	BEQ.S   NOSUB
	MOVE.W  D1,D2
	MULU    -2(A1),D2
	SUB.W   D2,D0
NOSUB	MOVE.B  0(A2,D1.W),(A0)+
	DBF     D3,AGAIN
	SWAP    D1
	MOVE.B  0(A2,D1.W),(A0)+
	sf	(a0)	msg end

	bsr.s	setlog1
	bsr.s	spr_in
	bsr.s	setlog2

spr_in	pea	scmsg(pc)
	move.w	#9,-(sp)
	trap	#1
	addq.l	#6,sp
	RTS
TENT    DC.W    10000,1000,100,10       ;SET UP FOR 10000 MAX
DIGIT   DC.B    '0123456789'
scmsg	dc.b	27,'H'
STRING  DS.W    3



*get the system colours
GETCOL	lea	syscol(pc),a4
	moveq	#0,d4	16.w
sy_lp	move.w	#-1,-(sp)
	move.w	d4,-(sp)	colornum
	move.w	#7,-(sp)
	trap	#14
	addq.l	#6,sp
	move.w	d0,(a4)+
	addq.w	#1,d4
	cmpi.w	#16,d4
	bne.s	sy_lp	
	rts
*either return colors to system or put a new set in
PUTCOL	lea	spcol(pc),a4	set sprite colours
	bra.s	sysin
OUTCOL	lea	syscol(pc),a4
sysin	moveq	#0,d4	16.w
sy_l	move.w	(a4)+,-(sp)
	move.w	d4,-(sp)	colornum
	move.w	#7,-(sp)
	trap	#14
	addq.l	#6,sp
	addq.w	#1,d4
	cmpi.w	#16,d4
	bne.s	sy_l
	rts
*word rnd in d0
RND	move.w	seed(a6),d0
	mulu	#1509,d0
	add.w	#41,d0
	move.w	d0,seed(a6)
	rts
*
*data
msg	dc.b '      Score',0
	even
stmsg	dc.b 27,'f',27,'b',15,27,'c',6,0 hide cur,foreg,backg color
	even
syscol	ds.w 16	* Colour palette
spcol
	dc.w $0000,$0001,$0776,$0554,$0332,$0221,$0760,$0640
	dc.w $0610,$0400,$0046,$0125,$0223,$0334,$0556,$0007
*
*BSS
*spdata
*global data
	rsreset
x	rs.w 1
y	rs.w 1
backload	rs.l 1
rep	rs.w 1	kbd repeat rate
ini	rs.w 1	kbd initial rate
scr	rs.l 1	current screen address
scr1	rs.l 1	screen1 address
scr2	rs.l 1	screen2 address
wscr	rs.w 1	which scr 1(=0) or 2(4) is current
rez	rs.w 1	scr resolution 0=lo 1=med 2=hi
ram	rs.l 1	scr2 ram from system
seed	rs.w 1	rnd seed
score	rs.w 1	game score
pybit	rs.w 1
ydis	rs.w 1
datae	rs.w 0	end of relative data

spdata	ds.b	__RS	Devpac command to reserve bss storage
	end