<br />
<b>Notice</b>:  Trying to access array offset on value of type bool in <b>/mnt/cpcwiki-httpdocs/includes/libs/IPSet.php</b> on line <b>243</b><br />
<br />
<b>Notice</b>:  Trying to access array offset on value of type bool in <b>/mnt/cpcwiki-httpdocs/includes/libs/IPSet.php</b> on line <b>246</b><br />
<br />
<b>Notice</b>:  Trying to access array offset on value of type bool in <b>/mnt/cpcwiki-httpdocs/includes/libs/IPSet.php</b> on line <b>243</b><br />
<br />
<b>Notice</b>:  Trying to access array offset on value of type bool in <b>/mnt/cpcwiki-httpdocs/includes/libs/IPSet.php</b> on line <b>246</b><br />
<?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%3APlotting_a_sprite_using_character_matrices</id>
		<title>Programming:Plotting a sprite using character matrices - 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%3APlotting_a_sprite_using_character_matrices"/>
		<link rel="alternate" type="text/html" href="https://oldwiki.cpcwiki.eu/index.php?title=Programming:Plotting_a_sprite_using_character_matrices&amp;action=history"/>
		<updated>2026-08-28T20:40:15Z</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:Plotting_a_sprite_using_character_matrices&amp;diff=15028&amp;oldid=prev</id>
		<title>CPCLER at 20:44, 13 March 2007</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.cpcwiki.eu/index.php?title=Programming:Plotting_a_sprite_using_character_matrices&amp;diff=15028&amp;oldid=prev"/>
				<updated>2007-03-13T20:44: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:44, 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;L316&quot; &gt;Line 316:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 316:&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;defb &amp;amp;00&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;defb &amp;amp;00&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:14925:newid:15028 --&gt;
&lt;/table&gt;</summary>
		<author><name>CPCLER</name></author>	</entry>

	<entry>
		<id>https://oldwiki.cpcwiki.eu/index.php?title=Programming:Plotting_a_sprite_using_character_matrices&amp;diff=14925&amp;oldid=prev</id>
		<title>CPCLER at 07:46, 13 March 2007</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.cpcwiki.eu/index.php?title=Programming:Plotting_a_sprite_using_character_matrices&amp;diff=14925&amp;oldid=prev"/>
				<updated>2007-03-13T07:46:06Z</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 demonstrates a method to plot sprites using the firmware&lt;br /&gt;
;; and the character set.&lt;br /&gt;
;;&lt;br /&gt;
;; - The sprites are defined using the character set matrices.&lt;br /&gt;
;;&lt;br /&gt;
;; - Each sprite is therefore composed of multiple 8x8 character matrices.&lt;br /&gt;
;;&lt;br /&gt;
;; - The display mode is set to mode 2 (640x200) which uses 1 bit per pixel&lt;br /&gt;
;;   Each line of the character matrix is represented by 1 byte.&lt;br /&gt;
;;&lt;br /&gt;
;; - When the character is displayed in mode 2, each line of the character&lt;br /&gt;
;;   matrix is written direct to the screen memory without conversion.&lt;br /&gt;
;;   This is an important fact for this example.&lt;br /&gt;
;;   (Normally, the character matrix data is converted into mode 1 or mode 2&lt;br /&gt;
;;   pixel data)&lt;br /&gt;
;;&lt;br /&gt;
;; - The display mode is changed, without informing the firmware functions.&lt;br /&gt;
;;   The characters will be plotting using the mode 2 method, regardless&lt;br /&gt;
;;   of the forced video mode. This is an important fact for this example.&lt;br /&gt;
;;&lt;br /&gt;
;;   If the character matrix data is setup so that each byte represents&lt;br /&gt;
;;   a byte of mode 1 or mode 0 screen pixel data, then multi-coloured&lt;br /&gt;
;;   sprites can be plotted, by the firmware, using the standard character&lt;br /&gt;
;;   plot routines. The only problem, is that each character matrix &lt;br /&gt;
;;   represents 4x8 pixels in mode 1, and 2x8 pixels in mode 0. So many&lt;br /&gt;
;;   matrices may be required to hold the pixel data for each sprite.&lt;br /&gt;
;;&lt;br /&gt;
;; - graphics coordinates, if used, must be defined so that the sprite&lt;br /&gt;
;;   is plotted on a byte boundary. e.g. x must be a integer multiple of 8.&lt;br /&gt;
;;&lt;br /&gt;
;; This method may be useful for plotting sprites for games in a&lt;br /&gt;
;; 1K games competition.&lt;br /&gt;
&lt;br /&gt;
.scr_set_mode equ &amp;amp;bc0e&lt;br /&gt;
.mc_set_mode equ &amp;amp;bd1c&lt;br /&gt;
.km_read_char equ &amp;amp;bb09&lt;br /&gt;
.mc_wait_flyback equ &amp;amp;bd19&lt;br /&gt;
.txt_output equ &amp;amp;bb5a&lt;br /&gt;
.txt_set_matrix equ &amp;amp;bba8&lt;br /&gt;
.gra_move_absolute equ &amp;amp;bbc0&lt;br /&gt;
.gra_move_relative equ &amp;amp;bbc3&lt;br /&gt;
.gra_wr_char equ &amp;amp;bbfc&lt;br /&gt;
.scr_access equ &amp;amp;bc59&lt;br /&gt;
&lt;br /&gt;
org &amp;amp;4000&lt;br /&gt;
nolist&lt;br /&gt;
&lt;br /&gt;
;;-----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
;; set display mode 2&lt;br /&gt;
ld a,2&lt;br /&gt;
call scr_set_mode&lt;br /&gt;
&lt;br /&gt;
;; force display mode 1&lt;br /&gt;
;; - the firmware will plot characters using the method for mode 2.&lt;br /&gt;
&lt;br /&gt;
ld a,1&lt;br /&gt;
call mc_set_mode&lt;br /&gt;
&lt;br /&gt;
;;-----------------------------------------------------------------------&lt;br /&gt;
;; set screen write mode to XOR&lt;br /&gt;
;;&lt;br /&gt;
;; - plot sprite using XOR to display, plot sprite using XOR in same position&lt;br /&gt;
;; to erase.&lt;br /&gt;
;; - if sprite moves over any other graphics, some pixels will change colour.&lt;br /&gt;
&lt;br /&gt;
ld a,1&lt;br /&gt;
call scr_access&lt;br /&gt;
&lt;br /&gt;
;;-----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
;; initialise sprite data&lt;br /&gt;
&lt;br /&gt;
ld hl,pixel_data          ;; location of character matrix data&lt;br /&gt;
ld a,248                  ;; id of first character matrix&lt;br /&gt;
ld b,8                    ;; number of characters to define matrix for&lt;br /&gt;
.sch&lt;br /&gt;
push af&lt;br /&gt;
push bc&lt;br /&gt;
push hl&lt;br /&gt;
call txt_set_matrix       ;; set character matrix&lt;br /&gt;
pop hl&lt;br /&gt;
&lt;br /&gt;
ld bc,8                   ;; number of bytes per character matrix&lt;br /&gt;
add hl,bc&lt;br /&gt;
&lt;br /&gt;
pop bc&lt;br /&gt;
pop af&lt;br /&gt;
inc a&lt;br /&gt;
djnz sch&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;;--------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
;; plot sprite&lt;br /&gt;
ld a,248&lt;br /&gt;
ld de,(sprite_x)&lt;br /&gt;
ld hl,(sprite_y)&lt;br /&gt;
call draw_sprite&lt;br /&gt;
&lt;br /&gt;
.loop&lt;br /&gt;
call mc_wait_flyback&lt;br /&gt;
&lt;br /&gt;
;; erase sprite&lt;br /&gt;
ld a,248&lt;br /&gt;
ld de,(sprite_x)&lt;br /&gt;
ld hl,(sprite_y)&lt;br /&gt;
call draw_sprite&lt;br /&gt;
&lt;br /&gt;
call controls&lt;br /&gt;
&lt;br /&gt;
;; plot sprite (in new position&lt;br /&gt;
;; if sprite's coordinates have changed)&lt;br /&gt;
ld a,248&lt;br /&gt;
ld de,(sprite_x)&lt;br /&gt;
ld hl,(sprite_y)&lt;br /&gt;
call draw_sprite&lt;br /&gt;
&lt;br /&gt;
jp loop&lt;br /&gt;
&lt;br /&gt;
.controls&lt;br /&gt;
call km_read_char&lt;br /&gt;
ret nc&lt;br /&gt;
and &amp;amp;df&lt;br /&gt;
cp &amp;quot;Q&amp;quot;&lt;br /&gt;
jp z,moveup&lt;br /&gt;
cp &amp;quot;A&amp;quot;&lt;br /&gt;
jp z,movedown&lt;br /&gt;
cp &amp;quot;O&amp;quot;&lt;br /&gt;
jr z,moveleft&lt;br /&gt;
cp &amp;quot;P&amp;quot;&lt;br /&gt;
jr z,moveright&lt;br /&gt;
ret&lt;br /&gt;
&lt;br /&gt;
;; adjust y coordinate of sprite&lt;br /&gt;
;; to move it up the screen.&lt;br /&gt;
;; - Each scan-line is 2 graphics y coordinates.&lt;br /&gt;
;; - origin of graphics coordinates is bottom-left&lt;br /&gt;
.moveup&lt;br /&gt;
ld hl,(sprite_y)&lt;br /&gt;
inc hl&lt;br /&gt;
inc hl&lt;br /&gt;
ld (sprite_y),hl&lt;br /&gt;
ret&lt;br /&gt;
&lt;br /&gt;
;; adjust y coordinate of sprite&lt;br /&gt;
;; to move it down the screen.&lt;br /&gt;
.movedown&lt;br /&gt;
ld hl,(sprite_y)&lt;br /&gt;
dec hl&lt;br /&gt;
dec hl&lt;br /&gt;
ld (sprite_y),hl&lt;br /&gt;
ret&lt;br /&gt;
&lt;br /&gt;
;; adjust x coordinate of sprite&lt;br /&gt;
;; to move it left accross the screen.&lt;br /&gt;
;; - each byte is 8 graphics x coordinates&lt;br /&gt;
.moveleft&lt;br /&gt;
ld hl,(sprite_x)&lt;br /&gt;
ld bc,8&lt;br /&gt;
or a&lt;br /&gt;
sbc hl,bc&lt;br /&gt;
ld (sprite_x),hl&lt;br /&gt;
ret&lt;br /&gt;
&lt;br /&gt;
;; adjust x coordinate of sprite&lt;br /&gt;
;; to move it right accross screen&lt;br /&gt;
.moveright&lt;br /&gt;
ld hl,(sprite_x)&lt;br /&gt;
ld bc,8&lt;br /&gt;
add hl,bc&lt;br /&gt;
ld (sprite_x),hl&lt;br /&gt;
ret&lt;br /&gt;
&lt;br /&gt;
;;-------------------------------------------------------------&lt;br /&gt;
;; A = id of first character used by sprite data&lt;br /&gt;
;; DE = x graphics coordinate&lt;br /&gt;
;; HL = y graphics coordinate&lt;br /&gt;
&lt;br /&gt;
.draw_sprite&lt;br /&gt;
;; move to initial position&lt;br /&gt;
push af&lt;br /&gt;
call gra_move_absolute&lt;br /&gt;
pop af&lt;br /&gt;
&lt;br /&gt;
ld b,2          ;; number of character matrices occupied by sprite in&lt;br /&gt;
                ;; y dimension&lt;br /&gt;
.ps1&lt;br /&gt;
push bc&lt;br /&gt;
push af&lt;br /&gt;
&lt;br /&gt;
ld c,4          ;; number of character matrices occupied by sprite in&lt;br /&gt;
                ;; x dimension&lt;br /&gt;
&lt;br /&gt;
.ps2&lt;br /&gt;
push bc&lt;br /&gt;
push af&lt;br /&gt;
&lt;br /&gt;
;; plot character at graphics coordinate position&lt;br /&gt;
;; and update graphics coordinate position for next&lt;br /&gt;
;; character&lt;br /&gt;
call gra_wr_char&lt;br /&gt;
&lt;br /&gt;
pop af&lt;br /&gt;
pop bc&lt;br /&gt;
add 2           ;; increment character id&lt;br /&gt;
                ;; (see character matrix usage below)&lt;br /&gt;
dec c&lt;br /&gt;
jr nz,ps2&lt;br /&gt;
&lt;br /&gt;
;; adjust graphics character position for next row&lt;br /&gt;
;; of characters&lt;br /&gt;
&lt;br /&gt;
ld de,-8*4&lt;br /&gt;
ld hl,-16&lt;br /&gt;
call gra_move_relative&lt;br /&gt;
&lt;br /&gt;
pop af&lt;br /&gt;
&lt;br /&gt;
;; increment character id&lt;br /&gt;
;; (see character matrix usage below)&lt;br /&gt;
inc a&lt;br /&gt;
          &lt;br /&gt;
pop bc&lt;br /&gt;
djnz ps1&lt;br /&gt;
ret&lt;br /&gt;
&lt;br /&gt;
;;-----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
;; graphics coordinates for sprites position&lt;br /&gt;
.sprite_x defw 320&lt;br /&gt;
.sprite_y defw 100&lt;br /&gt;
&lt;br /&gt;
;; sprite is:&lt;br /&gt;
;; - 16 mode 1 pixels wide = 4 bytes wide = 4 mode 2 characters wide&lt;br /&gt;
;; - 16 mode 1 pixels tall = 2 mode 2 characters tall&lt;br /&gt;
;; &lt;br /&gt;
;; sprite data is stored as:&lt;br /&gt;
;;&lt;br /&gt;
;; char 248   char 250  char 252  char 254&lt;br /&gt;
;; char 249   char 251  char 253  char 255&lt;br /&gt;
&lt;br /&gt;
.pixel_data&lt;br /&gt;
defb &amp;amp;00                  ;; char 248&lt;br /&gt;
defb &amp;amp;00&lt;br /&gt;
defb &amp;amp;10&lt;br /&gt;
defb &amp;amp;20&lt;br /&gt;
defb &amp;amp;40&lt;br /&gt;
defb &amp;amp;40&lt;br /&gt;
defb &amp;amp;80&lt;br /&gt;
defb &amp;amp;80&lt;br /&gt;
&lt;br /&gt;
defb &amp;amp;80                  ;; char 249&lt;br /&gt;
defb &amp;amp;80&lt;br /&gt;
defb &amp;amp;40&lt;br /&gt;
defb &amp;amp;51&lt;br /&gt;
defb &amp;amp;31&lt;br /&gt;
defb &amp;amp;10&lt;br /&gt;
defb &amp;amp;00&lt;br /&gt;
defb &amp;amp;00&lt;br /&gt;
&lt;br /&gt;
defb &amp;amp;30                  ;; char 250&lt;br /&gt;
defb &amp;amp;C0&lt;br /&gt;
defb &amp;amp;00&lt;br /&gt;
defb &amp;amp;00&lt;br /&gt;
defb &amp;amp;06&lt;br /&gt;
defb &amp;amp;0C&lt;br /&gt;
defb &amp;amp;0C&lt;br /&gt;
defb &amp;amp;04&lt;br /&gt;
&lt;br /&gt;
defb &amp;amp;00                  ;; char 251&lt;br /&gt;
defb &amp;amp;00&lt;br /&gt;
defb &amp;amp;AA&lt;br /&gt;
defb &amp;amp;55&lt;br /&gt;
defb &amp;amp;FF&lt;br /&gt;
defb &amp;amp;FD&lt;br /&gt;
defb &amp;amp;F2&lt;br /&gt;
defb &amp;amp;30&lt;br /&gt;
&lt;br /&gt;
defb &amp;amp;C0                  ;; char 252&lt;br /&gt;
defb &amp;amp;30&lt;br /&gt;
defb &amp;amp;00&lt;br /&gt;
defb &amp;amp;00&lt;br /&gt;
defb &amp;amp;00&lt;br /&gt;
defb &amp;amp;00&lt;br /&gt;
defb &amp;amp;00&lt;br /&gt;
defb &amp;amp;11&lt;br /&gt;
&lt;br /&gt;
defb &amp;amp;22                  ;; char 253&lt;br /&gt;
defb &amp;amp;55&lt;br /&gt;
defb &amp;amp;BA&lt;br /&gt;
defb &amp;amp;75&lt;br /&gt;
defb &amp;amp;FA&lt;br /&gt;
defb &amp;amp;F5&lt;br /&gt;
defb &amp;amp;F8&lt;br /&gt;
defb &amp;amp;C0&lt;br /&gt;
&lt;br /&gt;
defb &amp;amp;00                  ;; char 254&lt;br /&gt;
defb &amp;amp;00&lt;br /&gt;
defb &amp;amp;80&lt;br /&gt;
defb &amp;amp;40&lt;br /&gt;
defb &amp;amp;20&lt;br /&gt;
defb &amp;amp;20&lt;br /&gt;
defb &amp;amp;32&lt;br /&gt;
defb &amp;amp;76&lt;br /&gt;
&lt;br /&gt;
defb &amp;amp;FA                  ;; char 255&lt;br /&gt;
defb &amp;amp;F4&lt;br /&gt;
defb &amp;amp;E8&lt;br /&gt;
defb &amp;amp;E4&lt;br /&gt;
defb &amp;amp;C8&lt;br /&gt;
defb &amp;amp;80&lt;br /&gt;
defb &amp;amp;00&lt;br /&gt;
defb &amp;amp;00&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>CPCLER</name></author>	</entry>

	</feed>