pwnskar wrote:I sort of follow what I'm used to from other languages just because it makes things easier for me to read and wrap my head around. I'm not super consistent with it but for me that's not really the point. I just want to be able to read and understand what I'm doing with the code, so with that I usually do a lot of comments and little "TODO" notes.
I'll follow
Banshaku's example and show you my take on the same task.
Code: Select all
BufferOffsetBackgroundPalette:
; a = how much to subtract from currently loaded palette.
; TODO: if the palette pointers have not been set yet, do something to handle that.
ldx palette_bkg_ptr_lo
ldy palette_bkg_ptr_hi
stx curr_pointer_lo
sty curr_pointer_hi
ldx #15
jmp BufferOffsetPalette
BufferOffsetSpritePalette:
; a = how much to subtract from currently loaded palette.
ldx palette_sprites_ptr_lo
ldy palette_sprites_ptr_hi
stx curr_pointer_lo
sty curr_pointer_hi
ldx #31
BufferOffsetPalette:
; x = palette_buffer end index
pha ; how much to subtract
lda nmi_flags
and #NMI_UPDATE_PALETTE_CLEAR
sta nmi_flags
ldy #15
@offsetloop:
pla
pha ; push this for next loop iteration
clc
adc (curr_pointer_lo), y ; offset palette value with a
pha ; push this so we can use a for some logic
; first, lets knock down all $xE and $xF to $xD
and #%00001111
cmp #$0e
bcc @no_xE
; we've determined that the value must be $xE or $xF
; knock it down to $xD
pla ; retrieve offset palette value
and #%11110000
ora #%00001101
jmp @xEset
@no_xE:
pla ; retrieve offset palette value
@xEset:
; TODO: determine if the offset was positive or negative.
; we could do that by temporarily storing a in the buffer and digging out the initial offset by pla
sta palette_buffer, x
pla ; retrieve original offset value
pha ; and push it again for next loop itteration.
bpl @offsetispositive
@offsetisnegative:
lda palette_buffer, x
cmp #$20
bne @not20
lda #$10
sta palette_buffer, x
;jmp @offset_adjusted_by_direction
@not20:
jmp @offset_adjusted_by_direction
@offsetispositive:
lda palette_buffer, x
cmp #$1d
bne @not1d
lda #$2d
sta palette_buffer, x
jmp @offset_adjusted_by_direction
@not1d:
cmp #$2d
bne @not2d
lda #$00
sta palette_buffer, x
;jmp @offset_adjusted_by_direction
@not2d:
@offset_adjusted_by_direction:
lda palette_buffer, x
cmp #$3d+1 ; so now we check if any value goes above 3d (out of range) and cap it to either 30 or 0d
bcc @nocap ; is the value above 127?
cmp #0
bpl @nocap1
; if the offset was negative, this is our stop
lda #$0d
jmp @nocap
@nocap1
; this is where we end up if the offset was positive
lda #$30
@nocap
sta palette_buffer, x
dex
dey
cpy #$ff
bne @offsetloop
pla ; clean stack from original a value
; TODO: patch all sprite opacity buffers with that of the background palette buffer
lda palette_buffer
sta palette_buffer+16 ; seems just patching the first entry of the sprite palette buffer is enough..
lda nmi_flags
ora #NMI_UPDATE_PALETTE
sta nmi_flags
rts
I'm surprised so many people seem to not do indentation!

For me that simply wouldn't work. My mind needs some visual aide even to just help my eye find it's way back to the right spot on the screen when going back and forth between all my source files.
That's excellent! Probably the best that could be done without program-structure macros.
With them, I might modify it to the following. Note that no labels are needed except the two I left at and near the top as entry points. Hopefully I didn't make any mistakes, as I was quickly converting the form without focusing much on the bigger picture of what the program is doing. The section of triple-nested IF's could stand some more comments.
Code: Select all
BufferOffsetSpritePalette: ; a = how much to subtract from currently loaded palette.
LDX palette_sprites_ptr_lo
LDY palette_sprites_ptr_hi
STX curr_pointer_lo
STY curr_pointer_hi
LDX #31
BufferOffsetPalette: ; x = palette_buffer end index
PHA ; how much to subtract
LDA nmi_flags
AND #NMI_UPDATE_PALETTE_CLEAR
STA nmi_flags
FOR_Y 15, UP_TO, $FF ; (offset loop)
PLA
PHA ; Copy TOS into A.
CLC
ADC (curr_pointer_lo), Y ; Offset palette value with A.
PHA ; Push this so we can use A for some logic.
AND #%00001111 ; Knock down all $xE and $xF to $xD.
CMP #$0E
IF_CARRY_SET ; We've determined that the value must be $xE or $xF; so
PLA ; knock it down to $xD. First retrieve offset palette value.
AND #%11110000
ORA #%00001101
ELSE_
PLA ; Retrieve offset palette value.
END_IF
; TODO: determine if the offset was positive or negative. We could do that by
; temporarily storing A in the buffer and digging out the initial offset by PLA
STA palette_buffer, X
PLA ; Copy offset from TOS into A.
PHA
IF_NEG ; If it's negative:
LDA palette_buffer, X
CMP #$20
IF_EQ
LDA #$10
STA palette_buffer, X
END_IF
ELSE_ ; But if it's positive:
LDA palette_buffer, X
CMP #$1d
IF_EQ
LDA #$2d
STA palette_buffer, X
ELSE_
CMP #$2d
IF_EQ
LDA #$00
STA palette_buffer, X
END_IF
END_IF
END_IF
LDA palette_buffer, X ; Continue now for offset adjusted by direction:
CMP #$3d+1 ; Now we check if any value goes >3d (out of range) and cap it to either 30 or 0d.
IF_GE ; Is the value above 127? [Shouldn't that say "above 61"?]
CMP #0
IF_LT
LDA #$0d ; If the offset was negative, this is our stop.
ELSE_
LDA #$30 ; This is where we end up if the offset was positive.
END_IF
END_IF
STA palette_buffer, X
DEX
NEXT_Y ; (back to top of offset loop)
PLA ; clean stack from original a value
; TODO: patch all sprite opacity buffers w/ that of the background palette buffer.
LDA palette_buffer
STA palette_buffer+16 ; Seems just patching the first entry of the sprite palette buffer is enough.
LDA nmi_flags
ORA #NMI_UPDATE_PALETTE
STA nmi_flags
RTS
;-------------
To answer Bregalad's objection, you can still use labels and explicit branches and jumps if desired; but I try to minimize them. A main reason for using assembly language is performance; and if I didn't make any mistakes in my quick conversion above, the assembled code will be identical to the earlier version.