Displaying ST Pictures

From Atari Wiki
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
* TAB=10 (why? that's how my DevPac came way back when...)
*
* DCS.S - Assembly Lesson # 1
*   by Keith Gerdes
*    & Michael B. Vederman
*
* Developed and tested using HiSoft's DevPac ST/TT
*

* Equates for picture file type
*  Change "type_pic" variable in DATA segment to desired picture type
NEO	= 0
PIx	= 1
* NOTE: PIx refers to PI1, PI2 or PI3 file

	TEXT			; TEXT segment
START:
* Get new screen address (STs require a 256 ($100) byte boundary)
	move.l	#buffer,d0	; 32000+256 byte buffer
	clr.b	d0		; $100 byte boundary round off
	add.l	#$100,d0		; now round up
	move.l	d0,new_scrn	; new screen buffer

* Get current resolution
	move.w	#4,-(a7)
	trap	#14		; getRez
	addq.l	#2,a7
	move.w	d0,rez		; resolution (0,1,2)
	move.w	d0,the_rez	; resolution variable

* Get current screen address
	move.w	#2,-(a7)
	trap	#14		; physBase
	addq.l	#2,a7
	move.l	d0,old_scrn	; present screen address

	dc.w	$a00a		; hide mouse cursor

* Open picture file
	lea	name_neo,a0	; NEO
	cmp.b	#NEO,type_pic	; NEO?
	beq.s	f_open		; yep
	lea	name_pix,a0	; PIx
f_open:	move.l	a0,-(a7)		; filename
	move.w	#$3d,-(a7)
	trap	#1		; Fopen
	addq.l	#6,a7
	tst.l	d0
	bmi	exit1		; error
	move.w	d0,handle

* Read resolution & palette
	lea	the_pal,a0	; buffer
	moveq	#34,d0		; count (1.w+16.w)
	cmp.b	#PIx,type_pic	; PIx?
	beq.s	get_f_pal		; yep
	moveq	#36,d0		; count (2.w+16.w)
get_f_pal:bsr	f_read		; read
	ble	exit1		; error

* Get current color palette
* Note: registers D3-D7 & A3-A7 are saved by TRAP #13 & #14
	lea	save_pal+32,a6
	moveq	#15,d7
get_pal:	move.w	#-1,-(a7)		; color value (-1 gets color)
	move.w	d7,-(a7)		; color #
	move.w	#7,-(a7)
	trap	#14		; get/set color
	addq.l	#6,a7
	move.w	d0,-(a6)		; save it
	dbf	d7,get_pal

* Set palette (all black)
	lea	clr_pal,a0	; palette address (all zeroes)
	bsr	set_pal		; set palette
* Set screen to new resolution & address
	move.w	the_pal,d0	; resolution
	and.w	#3,d0		; see text
	move.l	new_scrn,a0	; change screen location
	bsr	setscreen		; set screen

	cmp.b	#PIx,type_pic	; PIx?
	beq.s	get_data		; yep

* Dummy read of NEO header...could have done an Fseek
	move.l	new_scrn,a0	; buffer
	moveq	#92,d0		; count (128-36)
	bsr	f_read		; read
	ble.s	exit1		; error

* Read screen data
get_data:	move.l	new_scrn,a0	; buffer
	move.l	#32000,d0		; count
	bsr	f_read		; read
	ble.s	exit1		; error

* Set new palette
*  Palette read at +2 for PIx & +4 for NEO
	lea	the_pal+2,a0	; palette address
	cmp.b	#PIx,type_pic	; PIx?
	beq.s	scrn_pal		; yep
	lea	the_pal+4,a0	; palette address
scrn_pal:	bsr	set_pal		; set palette

* Wait for keypress
	move.w	#7,-(a7)
	trap	#1		; Crawcin
	addq.l	#2,a7


* Set palette (all black)
	lea	clr_pal,a0	; palette address (all zeroes)
	bsr.s	set_pal		; set palette

* Restore screen resolution & address
	move.w	rez,d0		; original resolution
	move.l	old_scrn,a0	; original screen address
	bsr.s	setscreen		; set screen
* Restore palette
	lea	save_pal,a0	; original palette
	bsr.s	set_pal		; set palette

exit1:	dc.w	$a009		; show mouse cursor

* Close file handle
	tst.w	handle		; file opened?
	ble.s	exit2		; nope
	move.w	handle,-(a7)	; handle
	move.w	#$3e,-(a7)
	trap	#1		; Fclose
	addq.l	#4,a7

* Terminate
exit2:	clr.w	-(a7)
	trap	#1		; Pterm
	illegal			; won't get here?

* D0 = resolution
* A0 = new screen address
setscreen:cmp.w	#2,d0		; hi rez switch?
	beq.s	no_change		; yep
	cmp.w	#2,rez		; in hi rez?
	beq.s	no_change		; yep
	lea	the_rez,a1
	move.w	(a1),d1		; old rez
	move.w	d0,(a1)		; new rez
	cmp.w	d1,d0		; same?
	bne.s	new_rez		; nope - do rez change
no_change:moveq	#-1,d0		; -1 no change
new_rez:	move.w	d0,-(a7)		; rez (0,1,2)
	move.l	a0,-(a7)		; physical location
	move.l	a0,-(a7)		; logical location
	move.w	#5,-(a7)
	trap	#14		; setScreen
	lea	12(a7),a7
	rts

* A0 = palette address
set_pal:	move.l	a0,-(a7)		; push palette for below

	move.w	#37,-(a7)
	trap	#14		; vsync
	addq.l	#2,a7

	move.w	#6,-(a7)
	trap	#14		; set palette
	addq.l	#6,a7
	rts

* A0 = buffer address
* D0 = amount to read
f_read:	move.l	a0,-(a7)		; buffer
	move.l	d0,-(a7)		; count
	move.w	handle,-(a7)	; handle
	move.w	#$3f,-(a7)
	trap	#1		; Fread
	lea	12(a7),a7
	tst.l	d0		; test error condition for return
	rts

	DATA			; DATA segment
name_neo:	dc.b	'*.neo',0		; NEO filename
name_pix:	dc.b	'*.pi?',0		; PIx filename
type_pic:	dc.b	NEO		; picture type 0-NEO !0-PIx

	BSS			; BSS segment
rez:	ds.w	1		; original resolution value
the_rez:	ds.w	1		; resolution variable
handle:	ds.w	1		; file handle from Fopen
new_scrn:	ds.l	1		; address of allocated screen
old_scrn:	ds.l	1		; saved address of original screen
save_pal:	ds.w	16		; saved palette
clr_pal:	ds.w	16		; palette of 0s to blank screen
the_pal:	ds.w	36		; new palette read from pic file
buffer:	ds.b	32000+256		; buffer for screen


Back to Assembly_language