Advertisement

[Solved:] C64 Assembly Beginner Problem

Started by August 14, 2016 12:53 PM
0 comments, last by aeroKittens 8 years, 3 months ago

Hi all,

I just started to work through the great article

A c64 game in several steps (lots of 'em)

Unfortunately I already have a beginner problem in Step 2 and was sondering if

anyone here was familiar with assembly programming on the Commodore C64?

Here's my problem:

In Step 2 the author, Endurion, introduced a routine to copy an own character set

to memory. Here's a direct link to step 2:

http://www.gamedev.net/blog/949/entry-2249831-a-c64-game-step-2/

There's some code in here which I *really* can't understand, no matter how much I try.

Here's the direct link to the zipped source: step2.zip.

Here's the code I don't understand:


!zone CopyCharSet
CopyCharSet
          ;set target address ($F000)
          lda #$00
          sta ZEROPAGE_POINTER_2
          lda #$F0
          sta ZEROPAGE_POINTER_2 + 1

          ldx #$00
          ldy #$00
          lda #0
          sta PARAM2

.NextLine
          lda (ZEROPAGE_POINTER_1),Y
          sta (ZEROPAGE_POINTER_2),Y
          inx
          iny
          cpx #$8
          bne .NextLine
          cpy #$00
          bne .PageBoundaryNotReached
          
          ;we reached the next 256 bytes, inc high byte
          inc ZEROPAGE_POINTER_1 + 1
          inc ZEROPAGE_POINTER_2 + 1

.PageBoundaryNotReached

          ;only copy 254 chars to keep irq vectors intact
          inc PARAM2
          lda PARAM2
          cmp #254
          beq .CopyCharsetDone
          ldx #$00
          jmp .NextLine

.CopyCharsetDone
          rts


CHARSET
          !binary "j.chr"

I think I get most of this, but what I rally can't understand is what Endurion

is doing with the X register?

He initializes the X register with 0, then under .NextLine, after copying

one byte of the character set he is copying to memory, he increases it

by one (INX). Then he compares it to #$8 (CPX #$8):


          cpx #$8
          bne .NextLine

Then, if it is NOT equal to 8 yet, he jumps right back to .NextLine

(BNE .NextLine) and copies another byte.

So effectively, he is copying the first 8 bytes, then he is continuing

after the BNE .NextLine line for the first time and does everything else.

But why?

Why do all the other checks only every 8 bytes?

He checks if he must increase the pointers after 256 bytes were copied

and he checks if he copied 254 bytes yet (not wanting to overwrite the

last two), but why do all these checks only every 8 bytes?

Everything he does with the X register makes no sense to me at all. But when

I just comment out those lines the program doesn't run as it should anymore.

It runs but the graphics look different.

Is anyone here familiar with what's going on here in this great article / series

by Endurion? I would really appreciate any help!

Greetings,
Mark

---------- Edit 30 Min later: -----------

I contacted Endurion about this as well and he already helped me out! :-)

I made the stupid mistake of thinking, that because a character can be

addressed, a.k.a. "represented" by a program by only one Byte (such

as in ASCII or PETSCII with 256 characters codes), that naturally, such

characters only *HAVE* one Byte (in memory) also! :blink:

Duh....

It's *very* hard to make readable characters with LESS than 8 pixels on each side...! :ph34r:
So even the minimal C64 characters have 8 x 8 pixels = 8 x 8 Bits = 8 Bytes in memory.

So all the testing done by Endurion is done ONLY after he already checked

that he read ONE FULL CHARACTER = 8 Bytes(!) (not as I assumed, 1 Byte).

He then checks to see if he's read 254 CHARACTERS yet (so as not to

overwrite stuff in the destination). And, he checks to see if Y is 256 yet, which

conveniently is a multitude of 8, or rather has overflowed from 255 to 0, to see

if he must manually increase the pointers to the next possible 256 addresses

to acces (with "absolute, Y-indexed addressing)...

I think I got it now! :-)

Regards,
Mark

For good reasons, Moderators have several times discouraged and removed "Solved" from thread titles.

[Solved] has remained on this thread for a while now. Is it an oversight, inconsistency or because the thread had no discussions before OP's own self solution?

can't help being grumpy...

Just need to let some steam out, so my head doesn't explode...

This topic is closed to new replies.

Advertisement