Jump to content
JeremiahK

48-Pixel / 8-Character Display

Recommended Posts

Posted (edited)

While planning my Nyan Cat game, I decided I wanted the main menu to allow up to 8 characters per line.  This could easily be done with each word hard coded into the ROM, but I wanted to allow each character to be set on-the-fly.  This takes less ROM when a lot of messages are needed, but it also allows this kernel to be used for 8-digit scores, if desired.  I am considering remaking the score display for my game to utilize this.

I have been working on this display for quite a while now, and I am glad to say it is finished!

 

It uses 3 pre-shifted graphics tables for the font.  I am using a font that is 7 pixels high, allowing 36 unique characters to fit in each page.  This works perfectly for me, as I am using 10 numbers, plus 25 letters (letter-O is shared with zero), plus a space, but this could be adjusted as necessary.  If this was only used as a score display, all 3 graphics tables would easily fit within a single page.

The kernel and pre-kernel subroutines take up a total of 235 bytes.  I split them into 2 separate routines so that I could more easily utilize them in different areas of my game, but there is no reason why they couldn't be combined.

32 bytes of RAM are used in this routine, 8 for pointers, 21 for graphics buffers, and 3 for temp variables.

 

The graphics tables are all upside-down.  Any bits not used are cleared.

XXXXX___ Table #0 has the data shifted to the far left.

XXX___XX Table #1 has the first 2 bits shifted to the far right, and the last 3 bits shifted to the far left (so it "wraps" around the end of the byte to the beginning).

__XXXXX_ Table #2 has the data shifted almost all the way to the right.

Edit: As-is, the code looks for a label FontGfx0, which would be Table #0.  It assumes that Table #1 and #2 are in the following 2 pages.

 

The way text is selected for the routine is by loading Y with the offset of the first of the 8 characters to display.  You would set up a table as such:

Table
	HEX ## ## ## ## ## ## ## ##
	HEX ## ## ## ## ## ## ## ##
	HEX ## ## ## ## ## ## ## ##

The reason for this is that you can save some ROM by overlapping messages with each other.

Edit: As-is, the code assumes this table is called FontText.

 

Actually using these routines would look like this:

	sta WSYNC
	SLEEP 3

	ldy #0		; start with character #0
	jsr CharLoad	; prepare for kernel
	jsr CharKernel	; draw kernel

	SLEEP 9		; or change color, for example
	ldy #8		; start with character #8
	jsr CharLoad	; prepare for kernel
	jsr CharKernel	; draw kernel

	

I have included both routines, as well as an example binary.

8_char_display.bin 8_char_routine.asm

Edited by JeremiahK
  • Like 1

Share this post


Link to post
Share on other sites

Here is a slightly modified version of the routine, I was using an extra temp variable before.  This version uses 32 bytes of RAM, the earlier one used 33.

8_char_routine.asm

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...