Sprite Isn't Showing Up

Ask anything your want about Megadrive/Genesis programming.

Moderator: BigEvilCorporation

BigEvilCorporation
Very interested
Posts: 209
Joined: Sat Sep 08, 2012 10:41 am
Contact:

Post by BigEvilCorporation » Tue Aug 18, 2015 7:51 am

Oh I forgot to mention the alignment bug! Your strings file is an odd number of bytes, then you include the spritedesc file underneath it. Add an 'even' keyword or include the strings file last.

On hardware it crashes, on emulators the sprites table is one byte out.
A blog of my Megadrive programming adventures: http://www.bigevilcorporation.co.uk

SegaDev
Interested
Posts: 19
Joined: Sat Jul 11, 2015 4:09 am

Post by SegaDev » Wed Aug 19, 2015 11:18 pm

BigEvilCorporation wrote:Oh I forgot to mention the alignment bug! Your strings file is an odd number of bytes, then you include the spritedesc file underneath it. Add an 'even' keyword or include the strings file last.

On hardware it crashes, on emulators the sprites table is one byte out.
Thanks, i managed to get it working thanks to you. I uploaded the source code to bitbucket. so others may learn from it. What is the alignment bug, i tried to google it and couldn't find anything on it.

Sincerely,

SegaDev

BigEvilCorporation
Very interested
Posts: 209
Joined: Sat Sep 08, 2012 10:41 am
Contact:

Post by BigEvilCorporation » Thu Aug 20, 2015 8:54 am

Opcodes and word/longword data must rest on an aligned boundary - e.g., you can't move a word from an address like 0x00FF001B since it's not divisible by 2.

In your code you have a strings.asm file which holds data of an odd size, so anything you include after it will rest on an uneven boundary, and you'll get errors trying to read words/longwords or execute code from those addresses.

At the end of your strings.asm file use the keyword 'even' to align it, or pad your string data with an extra '0'.
A blog of my Megadrive programming adventures: http://www.bigevilcorporation.co.uk

SegaDev
Interested
Posts: 19
Joined: Sat Jul 11, 2015 4:09 am

Post by SegaDev » Mon Aug 24, 2015 10:36 pm

BigEvilCorporation wrote:Opcodes and word/longword data must rest on an aligned boundary - e.g., you can't move a word from an address like 0x00FF001B since it's not divisible by 2.

In your code you have a strings.asm file which holds data of an odd size, so anything you include after it will rest on an uneven boundary, and you'll get errors trying to read words/longwords or execute code from those addresses.

At the end of your strings.asm file use the keyword 'even' to align it, or pad your string data with an extra '0'.
Dumb Question, how do i draw numbers from a ram location such as the player's score without having to define a million text strings or using 60 sprites, or 1 number per sprite and position of the score. Any assistance in this matter would be greatly appreciated.

Sincerely,

SegaDev

BigEvilCorporation
Very interested
Posts: 209
Joined: Sat Sep 08, 2012 10:41 am
Contact:

Post by BigEvilCorporation » Wed Aug 26, 2015 7:41 am

SegaDev wrote:
BigEvilCorporation wrote:Opcodes and word/longword data must rest on an aligned boundary - e.g., you can't move a word from an address like 0x00FF001B since it's not divisible by 2.

In your code you have a strings.asm file which holds data of an odd size, so anything you include after it will rest on an uneven boundary, and you'll get errors trying to read words/longwords or execute code from those addresses.

At the end of your strings.asm file use the keyword 'even' to align it, or pad your string data with an extra '0'.
Dumb Question, how do i draw numbers from a ram location such as the player's score without having to define a million text strings or using 60 sprites, or 1 number per sprite and position of the score. Any assistance in this matter would be greatly appreciated.

Sincerely,

SegaDev
It just so happens I wrote a routine to do this over the weekend, I'll share it when I get home.

Basically:

- Walk the number 4 bits at a time
- Mask 0x0F
- Test if it's a decimal (0-9) or an alpha (A-F) character
- Add the decimal/alpha offset into the ASCII table (see framewk/charmap.asm) and write to string address
- Shift number 4 bits and advance string pointer
- Loop until you've processed the whole word/longword
- Terminate the string with a 0
A blog of my Megadrive programming adventures: http://www.bigevilcorporation.co.uk

BigEvilCorporation
Very interested
Posts: 209
Joined: Sat Sep 08, 2012 10:41 am
Contact:

Post by BigEvilCorporation » Thu Aug 27, 2015 12:04 pm

Here's the hex word version:

Code: Select all

ItoA_Hex_w:
	; Converts a word to hex ASCII
	; a0 --- In/Out: String address
	; d0 (w) In: Number to convert

	; 4 nybbles + 0x + terminator, working backwards
	add.l  #0x7, a0

	; Zero terminate
	move.b #0x0, -(a0)

	move.w #0x0, d1	; Char ptr
	move.w #0x3, d2	; 4 nybbles in a word
	@NybbleLp:
	move.b d0, d3			; Byte to d3
	andi.b #0x0F, d3		; Bottom nybble
	cmp.b  #0x9, d3
	ble    @Numeric			; Branch if in numeric range
	add.b  #(ASCIIAlphaOffset-0xA), d3	; In alpha range (A - F)
	move.b d3, -(a0)		; Back to string
	lsr.w  #0x4, d0			; Next nybble
	dbra   d2, @NybbleLp	; Loop
	bra    @End
	@Numeric:
	add.b  #ASCIINumericOffset, d3	; In numeric range (0 - 9)
	move.b d3, -(a0)		; Back to string
	lsr.w  #0x4, d0			; Next nybble
	dbra   d2, @NybbleLp	; Loop

	@End:

	;0X
	move.b #'X', -(a0)
	move.b #'0', -(a0)

	rts
You'll need to add the appropriate labels to framewk/charmap.asm. Use DrawTextPlaneA to get it on screen.

Can be shortened or expanded for byte or longword, and for 10-base decimal it'll need to use divs instead of shifts. I'm sure you'll figure something out :)

The string address will be the same on the way out as it was on the way in (since it jumps forwards and works backwards) so no need to backup the address to the stack first.
A blog of my Megadrive programming adventures: http://www.bigevilcorporation.co.uk

SegaDev
Interested
Posts: 19
Joined: Sat Jul 11, 2015 4:09 am

Re: Sprite Isn't Showing Up

Post by SegaDev » Tue Sep 01, 2015 10:52 pm

BigEvilCorporation wrote:Here's the hex word version:


Code: Select all

ItoA_Hex_w:
	; Converts a word to hex ASCII
	; a0 --- In/Out: String address
	; d0 (w) In: Number to convert

	; 4 nybbles + 0x + terminator, working backwards
	add.l  #0x7, a0

	; Zero terminate
	move.b #0x0, -(a0)

	move.w #0x0, d1	; Char ptr
	move.w #0x3, d2	; 4 nybbles in a word
	@NybbleLp:
	move.b d0, d3			; Byte to d3
	andi.b #0x0F, d3		; Bottom nybble
	cmp.b  #0x9, d3
	ble    @Numeric			; Branch if in numeric range
	add.b  #(ASCIIAlphaOffset-0xA), d3	; In alpha range (A - F)
	move.b d3, -(a0)		; Back to string
	lsr.w  #0x4, d0			; Next nybble
	dbra   d2, @NybbleLp	; Loop
	bra    @End
	@Numeric:
	add.b  #ASCIINumericOffset, d3	; In numeric range (0 - 9)
	move.b d3, -(a0)		; Back to string
	lsr.w  #0x4, d0			; Next nybble
	dbra   d2, @NybbleLp	; Loop

	@End:

	;0X
	move.b #'X', -(a0)
	move.b #'0', -(a0)

	rts


You'll need to add the appropriate labels to framewk/charmap.asm. Use DrawTextPlaneA to get it on screen.



Can be shortened or expanded for byte or longword, and for 10-base decimal it'll need to use divs instead of shifts. I'm sure you'll figure something out :)



The string address will be the same on the way out as it was on the way in (since it jumps forwards and works backwards) so no need to backup the address to the stack first.
I'm getting errors when assembling the source code with that subroutine:
SN 68k version 2.53

C:\SEGADEV\SRC\FRAMEWORK\UTILITY.ASM(26) : Error : Symbol 'asciialphaoffset' not defined
C:\SEGADEV\SRC\FRAMEWORK\UTILITY.ASM(32) : Error : Symbol 'asciinumericoffset' not defined

Assembly completed.
2 error(s) from 2835 lines in 0.2 seconds
I added the appropriate labels to framework/charmap.asm as stated and still am getting the errors:

Code: Select all

;==============================================================
;   BIG EVIL CORPORATION .co.uk
;==============================================================
;   SEGA Genesis Framework (c) Matt Phillips 2014
;==============================================================
;   charmap.asm - ASCII character map
;==============================================================

ASCIIStart: equ 0x20 ; First ASCII code in table

ASCIIMap:
	dc.b 0x00       ; SPACE (ASCII code 0x20)
	dc.b 0x28   ; ! Exclamation mark
	dc.b 0x2B   ; " Double quotes
	dc.b 0x2E   ; # Hash
	dc.b 0x00       ; UNUSED
	dc.b 0x00       ; UNUSED
	dc.b 0x00       ; UNUSED
	dc.b 0x2C   ; ' Single quote
	dc.b 0x29   ; ( Open parenthesis
	dc.b 0x2A   ; ) Close parenthesis
	dc.b 0x00       ; UNUSED
	dc.b 0x2F   ; + Plus
	dc.b 0x26   ; , Comma
	dc.b 0x30   ; - Minus
	dc.b 0x25   ; . Full stop
	dc.b 0x31   ; / Slash or divide
ASCIINumericOffset
	dc.b 0x1B   ; 0 Zero
	dc.b 0x1C   ; 1 One
	dc.b 0x1D   ; 2 Two
	dc.b 0x1E   ; 3 Three
	dc.b 0x1F   ; 4 Four
	dc.b 0x20   ; 5 Five
	dc.b 0x21   ; 6 Six
	dc.b 0x22   ; 7 Seven
	dc.b 0x23   ; 8 Eight
	dc.b 0x24   ; 9 Nine
	dc.b 0x2D   ; : Colon
	dc.b 0x00       ; UNUSED
	dc.b 0x00       ; UNUSED
	dc.b 0x00       ; UNUSED
	dc.b 0x00       ; UNUSED
	dc.b 0x27   ; ? Question mark
	dc.b 0x00       ; UNUSED
ASCIIAlphaOffset
	dc.b 0x01       ; A
	dc.b 0x02   ; B
	dc.b 0x03       ; C
	dc.b 0x04   ; D
	dc.b 0x05       ; E
	dc.b 0x06       ; F
	dc.b 0x07       ; G
	dc.b 0x08       ; H
	dc.b 0x09       ; I
	dc.b 0x0A       ; J
	dc.b 0x0B       ; K
	dc.b 0x0C       ; L
	dc.b 0x0D       ; M
	dc.b 0x0E       ; N
	dc.b 0x0F       ; O
	dc.b 0x10       ; P
	dc.b 0x11       ; Q
	dc.b 0x12       ; R
	dc.b 0x13       ; S
	dc.b 0x14       ; T
	dc.b 0x15       ; U
	dc.b 0x16       ; V
	dc.b 0x17       ; W
	dc.b 0x18       ; X
	dc.b 0x19       ; Y
	dc.b 0x1A       ; Z (ASCII code 0x5A)

	EVEN
Any assistance in this matter would be greatly appreciated.

Sincerely,

SegaDev

BigEvilCorporation
Very interested
Posts: 209
Joined: Sat Sep 08, 2012 10:41 am
Contact:

Re: Sprite Isn't Showing Up

Post by BigEvilCorporation » Wed Sep 02, 2015 8:53 am

Your labels need colons: after them :)
A blog of my Megadrive programming adventures: http://www.bigevilcorporation.co.uk

SegaDev
Interested
Posts: 19
Joined: Sat Jul 11, 2015 4:09 am

Re: Sprite Isn't Showing Up

Post by SegaDev » Wed Sep 02, 2015 10:51 pm

BigEvilCorporation wrote:Your labels need colons: after them :)
Nope that didn't work either:
C:\segadev\src> build

C:\segadev\src>del rom.bin

C:\segadev\src>asm68k.exe /p source.asm,rom.bin

SN 68k version 2.53

C:\SEGADEV\SRC\FRAMEWORK\UTILITY.ASM(26) : Error : Symbol 'asciialphaoffset' not defined
C:\SEGADEV\SRC\FRAMEWORK\UTILITY.ASM(32) : Error : Symbol 'asciinumericoffset' not defined

Assembly completed.
2 error(s) from 2835 lines in 0.3 seconds

C:\segadev\src>pause

Code: Select all

;==============================================================
;   BIG EVIL CORPORATION .co.uk
;==============================================================
;   SEGA Genesis Framework (c) Matt Phillips 2014
;==============================================================
;   charmap.asm - ASCII character map
;==============================================================

ASCIIStart: equ 0x20 ; First ASCII code in table

ASCIIMap:
	dc.b 0x00       ; SPACE (ASCII code 0x20)
	dc.b 0x28   ; ! Exclamation mark
	dc.b 0x2B   ; " Double quotes
	dc.b 0x2E   ; # Hash
	dc.b 0x00       ; UNUSED
	dc.b 0x00       ; UNUSED
	dc.b 0x00       ; UNUSED
	dc.b 0x2C   ; ' Single quote
	dc.b 0x29   ; ( Open parenthesis
	dc.b 0x2A   ; ) Close parenthesis
	dc.b 0x00       ; UNUSED
	dc.b 0x2F   ; + Plus
	dc.b 0x26   ; , Comma
	dc.b 0x30   ; - Minus
	dc.b 0x25   ; . Full stop
	dc.b 0x31   ; / Slash or divide
ASCIINumericOffset:
	dc.b 0x1B   ; 0 Zero
	dc.b 0x1C   ; 1 One
	dc.b 0x1D   ; 2 Two
	dc.b 0x1E   ; 3 Three
	dc.b 0x1F   ; 4 Four
	dc.b 0x20   ; 5 Five
	dc.b 0x21   ; 6 Six
	dc.b 0x22   ; 7 Seven
	dc.b 0x23   ; 8 Eight
	dc.b 0x24   ; 9 Nine
	dc.b 0x2D   ; : Colon
	dc.b 0x00       ; UNUSED
	dc.b 0x00       ; UNUSED
	dc.b 0x00       ; UNUSED
	dc.b 0x00       ; UNUSED
	dc.b 0x27   ; ? Question mark
	dc.b 0x00       ; UNUSED
ASCIIAlphaOffset:
	dc.b 0x01       ; A
	dc.b 0x02   ; B
	dc.b 0x03       ; C
	dc.b 0x04   ; D
	dc.b 0x05       ; E
	dc.b 0x06       ; F
	dc.b 0x07       ; G
	dc.b 0x08       ; H
	dc.b 0x09       ; I
	dc.b 0x0A       ; J
	dc.b 0x0B       ; K
	dc.b 0x0C       ; L
	dc.b 0x0D       ; M
	dc.b 0x0E       ; N
	dc.b 0x0F       ; O
	dc.b 0x10       ; P
	dc.b 0x11       ; Q
	dc.b 0x12       ; R
	dc.b 0x13       ; S
	dc.b 0x14       ; T
	dc.b 0x15       ; U
	dc.b 0x16       ; V
	dc.b 0x17       ; W
	dc.b 0x18       ; X
	dc.b 0x19       ; Y
	dc.b 0x1A       ; Z (ASCII code 0x5A)

	EVEN
Any assistance in this matter would be greatly appreciated.

Sincerely,

SegaDev

Sik
Very interested
Posts: 939
Joined: Thu Apr 10, 2008 3:03 pm
Contact:

Re: Sprite Isn't Showing Up

Post by Sik » Thu Sep 03, 2015 1:24 am

BigEvilCorporation wrote:Your labels need colons: after them :)
Wrong, it's determined by whether there's whitespace before the text or not. The colon is actually optional.
Sik is pronounced as "seek", not as "sick".

BigEvilCorporation
Very interested
Posts: 209
Joined: Sat Sep 08, 2012 10:41 am
Contact:

Re: Sprite Isn't Showing Up

Post by BigEvilCorporation » Thu Sep 03, 2015 7:17 pm

Sik wrote:
BigEvilCorporation wrote:Your labels need colons: after them :)
Wrong, it's determined by whether there's whitespace before the text or not. The colon is actually optional.
Awesome, didn't know that!
SegaDev wrote:...
I'm not sure then, it looks fine from what I can see. Send full source?
A blog of my Megadrive programming adventures: http://www.bigevilcorporation.co.uk

SegaDev
Interested
Posts: 19
Joined: Sat Jul 11, 2015 4:09 am

Re: Sprite Isn't Showing Up

Post by SegaDev » Fri Sep 04, 2015 10:45 pm

BigEvilCorporation wrote:
Sik wrote:
BigEvilCorporation wrote:Your labels need colons: after them :)
Wrong, it's determined by whether there's whitespace before the text or not. The colon is actually optional.
Awesome, didn't know that!
SegaDev wrote:...
I'm not sure then, it looks fine from what I can see. Send full source?
Sure here the link to the latest version of the source code with the "improvements". :) Any assistance in this matter would be greatly appreciated.

Sincerely,

SegaDev

BigEvilCorporation
Very interested
Posts: 209
Joined: Sat Sep 08, 2012 10:41 am
Contact:

Re: Sprite Isn't Showing Up

Post by BigEvilCorporation » Wed Sep 09, 2015 8:18 pm

Ahh my apologies, they weren't supposed to be labels, but offsets into the charmap:

Code: Select all

ASCIIStart equ 0x20 ; First ASCII code in table
ASCIIAlphaOffset equ ASCIIStart+(ASCIIAlphaStart-ASCIIMap)
ASCIINumericOffset equ ASCIIStart+(ASCIINumericStart-ASCIIMap)
then your labels in the map need to be:

Code: Select all

ASCIINumericStart:
	dc.b 0x1B   ; 0 Zero
	dc.b 0x1C   ; 1 One
	dc.b 0x1D   ; 2 Two
	dc.b 0x1E   ; 3 Three
...


ASCIIAlphaStart:
	dc.b 0x01       ; A
	dc.b 0x02       ; B
	dc.b 0x03       ; C
...
Also you were including 'charactermap.asm' instead of 'charmap.asm', again my fault since the last source I sent back to you had all filenames shortened to 8 chars (I'm running MSDOS!).

I shouldn't try helping when I'm tired, sorry ;)
A blog of my Megadrive programming adventures: http://www.bigevilcorporation.co.uk

BigEvilCorporation
Very interested
Posts: 209
Joined: Sat Sep 08, 2012 10:41 am
Contact:

Re: Sprite Isn't Showing Up

Post by BigEvilCorporation » Wed Sep 09, 2015 8:51 pm

Tested and working:

Code: Select all

      sub.l  #0x8, sp             ; Alloc string space on stack
      
      move.l sp, a0               ; String to a0
      move.w #0xAB12, d0          ; Integer to d0
      jsr    ItoA_Hex_w           ; Integer to ASCII (hex word)
      
      move.l sp, a0               ; String to a0
      move.l #PixelFontTileID, d0 ; Font to d0
      move.l #0x0808, d1          ; Position to d1
      move.l #0x0, d2             ; Palette to d2
      jsr    DrawTextPlaneA       ; Draw text
      
      add.l  #0x8, sp             ; Free string
Image
A blog of my Megadrive programming adventures: http://www.bigevilcorporation.co.uk

SegaDev
Interested
Posts: 19
Joined: Sat Jul 11, 2015 4:09 am

Re: Sprite Isn't Showing Up

Post by SegaDev » Wed Sep 16, 2015 3:38 am

BigEvilCorporation wrote:Tested and working:

Code: Select all

      sub.l  #0x8, sp             ; Alloc string space on stack
      
      move.l sp, a0               ; String to a0
      move.w #0xAB12, d0          ; Integer to d0
      jsr    ItoA_Hex_w           ; Integer to ASCII (hex word)
      
      move.l sp, a0               ; String to a0
      move.l #PixelFontTileID, d0 ; Font to d0
      move.l #0x0808, d1          ; Position to d1
      move.l #0x0, d2             ; Palette to d2
      jsr    DrawTextPlaneA       ; Draw text
      
      add.l  #0x8, sp             ; Free string
Image
Dumb question, what if i want to print an integer number like say 100, 550 etc instead of a hex number, how would i go about doing that?

Tried

Code: Select all

      sub.l  #0x8, sp             ; Alloc string space on stack
      
      move.l sp, a0               ; String to a0
      move.w #0, d0          ; Integer to d0
      jsr    ItoA_Hex_w           ; Integer to ASCII (hex word)
      
      move.l sp, a0               ; String to a0
      move.l #PixelFontTileID, d0 ; Font to d0
      move.l #0x0808, d1          ; Position to d1
      move.l #0x0, d2             ; Palette to d2
      jsr    DrawTextPlaneA       ; Draw text
      
      add.l  #0x8, sp             ; Free string
but it still prints as a hex number. :(

Sincerely,

SegaDev

Post Reply