<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>https://oldwiki.cpcwiki.eu/index.php?action=history&amp;feed=atom&amp;title=Programming%3AAn_example_loader</id>
		<title>Programming:An example loader - Revision history</title>
		<link rel="self" type="application/atom+xml" href="https://oldwiki.cpcwiki.eu/index.php?action=history&amp;feed=atom&amp;title=Programming%3AAn_example_loader"/>
		<link rel="alternate" type="text/html" href="https://oldwiki.cpcwiki.eu/index.php?title=Programming:An_example_loader&amp;action=history"/>
		<updated>2026-08-28T09:05:03Z</updated>
		<subtitle>Revision history for this page on the wiki</subtitle>
		<generator>MediaWiki 1.25.1</generator>

	<entry>
		<id>https://oldwiki.cpcwiki.eu/index.php?title=Programming:An_example_loader&amp;diff=15015&amp;oldid=prev</id>
		<title>CPCLER at 20:35, 13 March 2007</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.cpcwiki.eu/index.php?title=Programming:An_example_loader&amp;diff=15015&amp;oldid=prev"/>
				<updated>2007-03-13T20:35:43Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;tr style='vertical-align: top;'&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Revision as of 20:35, 13 March 2007&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;L212&quot; &gt;Line 212:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 212:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;						;; to calculate the length of the data created&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;						;; to calculate the length of the data created&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[Category:Programming]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key wikidb:diff:version:1.11a:oldid:14915:newid:15015 --&gt;
&lt;/table&gt;</summary>
		<author><name>CPCLER</name></author>	</entry>

	<entry>
		<id>https://oldwiki.cpcwiki.eu/index.php?title=Programming:An_example_loader&amp;diff=14915&amp;oldid=prev</id>
		<title>CPCLER at 07:35, 13 March 2007</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.cpcwiki.eu/index.php?title=Programming:An_example_loader&amp;diff=14915&amp;oldid=prev"/>
				<updated>2007-03-13T07:35:38Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
;; This example shows a disc loader program which is a executable binary&lt;br /&gt;
;; file.&lt;br /&gt;
;;&lt;br /&gt;
;; This loader can be run direct from BASIC using:&lt;br /&gt;
;; RUN&amp;quot;&amp;lt;loader&amp;gt; [RETURN]&lt;br /&gt;
;; replace &amp;lt;loader&amp;gt; with the name of the loader file&lt;br /&gt;
;; (e.g. RUN&amp;quot;SOLOMONS&amp;quot;)&lt;br /&gt;
;;&lt;br /&gt;
;; 1. assemble the loader using MAXAM or other compatible assembler&lt;br /&gt;
;; 2. note the start and end addressess; use this to calculate the length of the data&lt;br /&gt;
;; 3. in BASIC type: SAVE&amp;quot;&amp;lt;loader&amp;gt;&amp;quot;,B,&amp;lt;start&amp;gt;,&amp;lt;length&amp;gt;,&amp;lt;execution&amp;gt;&lt;br /&gt;
;;    replace &amp;lt;loader&amp;gt; with the name of the loader file&lt;br /&gt;
;;	          &amp;lt;start&amp;gt; with the start address of the loader file&lt;br /&gt;
;;			  &amp;lt;length&amp;gt; with the length of the loader file&lt;br /&gt;
;;			  &amp;lt;execution&amp;gt; with the execution/start address of the loader file&lt;br /&gt;
;;&lt;br /&gt;
;; Loader supports:&lt;br /&gt;
;; - loading from disc drive A and B.&lt;br /&gt;
;; - loading using AMSDOS and other DOSs (e.g. ROMDOS).&lt;br /&gt;
;;---------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
.scr_set_mode		equ &amp;amp;bc0e&lt;br /&gt;
.scr_set_border		equ &amp;amp;bc38&lt;br /&gt;
.scr_set_ink		equ &amp;amp;bc32&lt;br /&gt;
.cas_in_open		equ &amp;amp;bc77&lt;br /&gt;
.cas_in_direct		equ &amp;amp;bc83&lt;br /&gt;
.cas_in_close		equ &amp;amp;bc7a&lt;br /&gt;
.mc_start_program	equ &amp;amp;bd16&lt;br /&gt;
.kl_rom_walk		equ &amp;amp;bccb&lt;br /&gt;
;;---------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
org &amp;amp;100		   ;; example loader address&lt;br /&gt;
nolist			   ;; maxam command to stop listing of assembly&lt;br /&gt;
&lt;br /&gt;
;;------------------------------------------------------------------------&lt;br /&gt;
;; store the drive number the loader was run from&lt;br /&gt;
ld hl,(&amp;amp;be7d)&lt;br /&gt;
ld a,(hl)                  &lt;br /&gt;
ld (drive+1),a&lt;br /&gt;
&lt;br /&gt;
;;------------------------------------------------------------------------&lt;br /&gt;
ld c,&amp;amp;ff					;; disable all roms&lt;br /&gt;
ld hl,start					;; execution address for program&lt;br /&gt;
call mc_start_program		;; start it&lt;br /&gt;
&lt;br /&gt;
;;------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
.start&lt;br /&gt;
call kl_rom_walk			;; enable all roms &lt;br /&gt;
&lt;br /&gt;
;;------------------------------------------------------------------------&lt;br /&gt;
;; when AMSDOS is enabled, the drive reverts back to drive 0!&lt;br /&gt;
;; This will restore the drive number to the drive the loader was run from&lt;br /&gt;
.drive ld a,0&lt;br /&gt;
ld hl,(&amp;amp;be7d)&lt;br /&gt;
ld (hl),a		  &lt;br /&gt;
&lt;br /&gt;
;;------------------------------------------------------------------------&lt;br /&gt;
;; set screen mode 0&lt;br /&gt;
;; (replace this with the screen mode of your screen)&lt;br /&gt;
&lt;br /&gt;
ld a,0&lt;br /&gt;
call scr_set_mode		  &lt;br /&gt;
&lt;br /&gt;
;;------------------------------------------------------------------------&lt;br /&gt;
;; setup colours&lt;br /&gt;
call setup_colours&lt;br /&gt;
&lt;br /&gt;
;;--------------------------------------------------------------------&lt;br /&gt;
;; sequence:&lt;br /&gt;
;; 1. load file&lt;br /&gt;
;; 2. decompress data (if compressed)&lt;br /&gt;
;; 3. relocate data (if required)&lt;br /&gt;
;; &lt;br /&gt;
;; NOTE:&lt;br /&gt;
;; If data should be relocated to &amp;amp;A600-&amp;amp;BFFF then this must be done last&lt;br /&gt;
;; otherwise the firmware jumpblock will be corrupted and no more files can be loaded.&lt;br /&gt;
;;&lt;br /&gt;
;; If we have data to load which must be relocated we can do the following:&lt;br /&gt;
;; 1. set colours to black&lt;br /&gt;
;; 2. load data to screen area (not seen because all colours are the same)&lt;br /&gt;
;; 3. relocate data to destination address&lt;br /&gt;
;;&lt;br /&gt;
;; Normal load sequence:&lt;br /&gt;
;; - screen&lt;br /&gt;
;; - main file&lt;br /&gt;
;; - extra file to relocate to firmware jumpblock area&lt;br /&gt;
;; - execute program&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;;--------------------------------------------------------------------&lt;br /&gt;
;; load block&lt;br /&gt;
call load_next_block		  &lt;br /&gt;
&lt;br /&gt;
;; could have code here to decompress block if it is compressed, and&lt;br /&gt;
;; then relocate it&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
di				;; disable interrupts&lt;br /&gt;
&lt;br /&gt;
; do any memory relocation here.&lt;br /&gt;
&lt;br /&gt;
jp &amp;amp;103			;; and execute the code. (change this for the execution address&lt;br /&gt;
				;; used by your game)&lt;br /&gt;
				&lt;br /&gt;
;;------------------------------------------------------------------------&lt;br /&gt;
;; load the next block, updating filename for next block&lt;br /&gt;
&lt;br /&gt;
.load_next_block&lt;br /&gt;
ld b,end_filename-filename&lt;br /&gt;
ld hl,filename&lt;br /&gt;
call load_block&lt;br /&gt;
&lt;br /&gt;
;; update filename for next block&lt;br /&gt;
ld hl,end_filename-1	; add 1 to digit in filename&lt;br /&gt;
inc (hl)&lt;br /&gt;
ret&lt;br /&gt;
&lt;br /&gt;
;;------------------------------------------------------------------------&lt;br /&gt;
;; B = length of filename&lt;br /&gt;
;; HL = address of filename&lt;br /&gt;
.load_block&lt;br /&gt;
ld de,&amp;amp;c000&lt;br /&gt;
call cas_in_open&lt;br /&gt;
ex de,hl		; load file to location stored in the file header&lt;br /&gt;
call cas_in_direct&lt;br /&gt;
call cas_in_close&lt;br /&gt;
ret&lt;br /&gt;
&lt;br /&gt;
;;------------------------------------------------------------------------&lt;br /&gt;
;; setup colours&lt;br /&gt;
;;&lt;br /&gt;
;; HL = address of palette&lt;br /&gt;
;; &lt;br /&gt;
;; order: pen 0, pen 1,...,pen15,border&lt;br /&gt;
.setup_colours&lt;br /&gt;
&lt;br /&gt;
ld b,16			  ;; 16 colours&lt;br /&gt;
xor a			  ;; start with pen 0&lt;br /&gt;
&lt;br /&gt;
.do_colours&lt;br /&gt;
push bc&lt;br /&gt;
push af&lt;br /&gt;
ld c,(hl)		  ;; colour value&lt;br /&gt;
inc hl&lt;br /&gt;
ld b,c			  ;; B=C so colours will not flash&lt;br /&gt;
push hl&lt;br /&gt;
;; A = pen number&lt;br /&gt;
;; B,C = colour&lt;br /&gt;
call scr_set_ink		  ;; set colour for pen&lt;br /&gt;
pop hl&lt;br /&gt;
pop af&lt;br /&gt;
pop bc&lt;br /&gt;
;; increment pen number&lt;br /&gt;
inc a&lt;br /&gt;
djnz do_colours&lt;br /&gt;
&lt;br /&gt;
;; set border colour&lt;br /&gt;
&lt;br /&gt;
ld c,(hl)&lt;br /&gt;
ld b,c&lt;br /&gt;
call scr_set_border	&lt;br /&gt;
&lt;br /&gt;
ret&lt;br /&gt;
&lt;br /&gt;
;;------------------------------------------------------------------------&lt;br /&gt;
;; set all colours to black&lt;br /&gt;
&lt;br /&gt;
.set_to_black&lt;br /&gt;
ld b,16				;; 16 colours&lt;br /&gt;
xor a				;; initial pen index&lt;br /&gt;
.stb1&lt;br /&gt;
push af&lt;br /&gt;
push bc&lt;br /&gt;
ld bc,0				;; black&lt;br /&gt;
call scr_set_ink	;; set colour&lt;br /&gt;
pop bc&lt;br /&gt;
pop af&lt;br /&gt;
inc a				;; increment pen index&lt;br /&gt;
djnz stb1&lt;br /&gt;
&lt;br /&gt;
ld bc,0				;; black&lt;br /&gt;
call scr_set_border	;; set border colour&lt;br /&gt;
&lt;br /&gt;
ret&lt;br /&gt;
&lt;br /&gt;
;;------------------------------------------------------------------------&lt;br /&gt;
;; a colour palette defined using firmware colour numbers&lt;br /&gt;
;; &lt;br /&gt;
;; (replace this with your own colours)&lt;br /&gt;
;;&lt;br /&gt;
;; order: pen 0, pen 1,...,pen15,border&lt;br /&gt;
&lt;br /&gt;
.colour_palette&lt;br /&gt;
defb 0,4,&amp;amp;10,&amp;amp;b,6,&amp;amp;1a,&amp;amp;18,&amp;amp;d,&amp;amp;c,&amp;amp;12,1,&amp;amp;b,4,&amp;amp;f,3,6,0&lt;br /&gt;
&lt;br /&gt;
;;------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
;; name of first filename, next filename is SOLOMONS.BI1, then&lt;br /&gt;
;; SOLOMONS.BI2 etc...&lt;br /&gt;
;;&lt;br /&gt;
;; (replace this with your own filename)&lt;br /&gt;
&lt;br /&gt;
.filename&lt;br /&gt;
defb &amp;quot;SOLOMONS.BI0&amp;quot;&lt;br /&gt;
.end_filename&lt;br /&gt;
&lt;br /&gt;
list					;; maxam command to show listing&lt;br /&gt;
.end equ $+1			;; will show the last assembled address; we can use this&lt;br /&gt;
						;; to calculate the length of the data created&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>CPCLER</name></author>	</entry>

	</feed>