Newsgroups: comp.sys.apple2.programmer
Path: news.weeg.uiowa.edu!news.uiowa.edu!hobbes.physics.uiowa.edu!math.ohio-state.edu!cyber2.cyberstore.ca!nntp.cs.ubc.ca!alberta!kakwa.ucs.ualberta.ca!acs.ucalgary.ca!sbdocker
From: sbdocker@acs.ucalgary.ca (Sean Dockery)
Subject: Re: Graphics and ML
Message-ID: <Jan11.223727.45121@acs.ucalgary.ca>
Date: Tue, 11 Jan 1994 22:37:27 GMT
References: <100467@cup.portal.com> <CJEwu2.H0B@actrix.gen.nz>
Organization: Griffin Software Development
Lines: 123

In article <CJEwu2.H0B@actrix.gen.nz> dempson@swell.actrix.gen.nz
(David Empson) writes:

| The best solution is to use a front-end relocator (mover, actually) on
| your program to move it elsewhere in memory.  Where to move it to
| depends on how big it is and what other areas you need.

An alternative is the "bootstrap loader" solution.  Actually, I prefer
this method as it allows the main program to be self-contained.  :)

The ProDOS .SYSTEM file simply acts as a front end of loading a
secondary binary file.  Not only that, but in some cases, it allows
your program to be loadable from BASIC.  The only caveat is that your
program code does not violate the Hi-res graphics page (it will likely
crash if it does).

Consider the following:

	TYP	$FF
	ORG	$2000

PRODOS	=	$BF00
KBD	=	$C000		;KEYBOARD DATA (LATCHED)
STROBE	=	$C010		;KEYBOARD STROBE

START	JSR	PRODOS
	DFB	$C4		;GET FILE INFO
	DA	GFIPARM
	BCS	:ERROR

	LDA	GFIPARM+5	;USE AUX TYPE AS LOADING
	STA	RPARM+2		; AND EXECUTION ADDRESS
	STA	RUNIT+1
	LDA	GFIPARM+6
	STA	RPARM+3
	STA	RUNIT+2

	JSR	PRODOS
	DFB	$C8		;OPEN
	DA	OPARM
	BCS	:ERROR

	LDA	RN1		;USE SAME FILE REF NUM
	STA	RN2		; FOR READ/CLOSE CALLS
	STA	RN3

	JSR	PRODOS
	DFB	$CA		;READ
	DA	RPARM
	BCS	:ERROR

	JSR	PRODOS
	DFB	$CC		;CLOSE
	DA	CPARM
	BCC	RUNIT

:ERROR	NOP			;PRINT ERROR MESSAGE HERE

:WAIT	LDA	KEYBOARD	;WAIT FOR ACKNOWLEDGEMENT
	BPL	:WAIT
	STA	STROBE

	LDA	#$00		;CONFIGURE TO CLOSE ALL FILES
	STA	RN3

	JSR	PRODOS
	DFB	$CC		;CLOSE
	DA	CPARM

	JSR	PRODOS
	DFB	$65		;QUIT
	DA	QPARM
:QERR	BCS	:QERR		;DON'T EXPECT TO DO THIS
	BRK			; AND WE SHOULDN'T GET HERE

RUNIT	JMP	$FFFF		;MODIFIED

GFIPARM	DFB	$0A		;10 PARMS
	DA	PATH		;FILE NAME
	DS	1		;ACCESS CODE
	DS	1		;FILE TYPE
:5	DS	2		;AUX TYPE
	DS	1		;STORAGE TYPE
	DS	2		;BLOCKS USED
	DS	2		;MOD DATE
	DS	2		;MOD TIME
	DS	2		;CRE DATE
	DS	2		;CRE TIME

OPARM	DFB	$03		;3 PARMS
	DA	PATH		;FILE NAME
	DA	IOBUF		;DUMMY BUFFER
RN1	DS	1		;FILE REFERENCE NUMBER

RPARM	DFB	$04		;4 PARMS
RN2	DFB	$00		;MODIFIED REF NUM
	DA	$0000		;MODIFIED DATA BUFFER ADR
	DA	$FFFF		;REQUEST TO READ ALL OF IT
	DS	2		;TRANSFER COUNT

CPARM	DFB	$01
RN3	DFB	$00		;MODIFIED REF NUM

QPARM	DFB	$04		;4 PARMS
	DFB	$00		;STANDARD QUIT CALL PARMS ARE
	DA	$0000		; RESERVED TO BE ALL ZERO.
	DFB	$00
	DA	$0000

PATH	STR	'MAIN.OBJ'

	DS	\		;PAD TO PAGE BOUNDARY

IOBUF	DS	1024		;1K PRODOS I/O BUFFER


The first thing to be done when MAIN.OBJ executes is to clear the
Hi-res screen before activating it.  I'll leave that as an exercise to
the reader.  :)
-- 
Sean Dockery              | "Tickle us, do we not laugh?
dockery@griffin.cuc.ab.ca |  Prick us, do we not bleed?
sbdocker@acs.ucalgary.ca  |  Wrong us.. shall we not revenge?"
