I wrote a simple code that generates items on the screen in the form of background elements. It works, but I would like to do better. I have a problem generating the HI address using a similar table that I used to generate the LO. Instead, it generates HI by comparing RNG values every 64 and then increasing HI by one.
Code:
;################################################################################
PlaceRandomItem:
LDA PlaceRandomItem_Flags ;bit 0 code control (ora bit0 = run code, and = lock)
AND #%00000001
BEQ PlaceRandomItem_no
LDY RNG ;generate PPU LO
LDA TablePPU_LO,y
STA PPU_LO_Temp
JSR TablePPU_HI ;jump generate PPU HI
LDA PlaceRandomItem_Flags ;bit 1 blocks writing to PPU when RNG is above 240 (ora bit1 = run code)
AND #%00000010
BEQ PlaceRandomItem_no
LDA PPU_HI_Temp
STA $2006
LDA PPU_LO_Temp
STA $2006
LDA ItemTile1of4
STA $2007
LDA ItemTile2of4
STA $2007
LDA PPU_HI_Temp
STA $2006
LDA PPU_LO_Temp
CLC
ADC #32
STA $2006
LDA ItemTile3of4
STA $2007
LDA ItemTile4of4
STA $2007
LDA PlaceRandomItem_Flags ;lock the code when done
AND #%11111100
STA PlaceRandomItem_Flags
PlaceRandomItem_no:
RTS
;################################################################################
TablePPU_LO:
.db $00,$02,$04,$06,$08,$0A,$0C,$0E,$10,$12,$14,$16,$18,$1A,$1C,$1E
.db $40,$42,$44,$46,$48,$4A,$4C,$4E,$50,$52,$54,$56,$58,$5A,$5C,$5E
.db $80,$82,$84,$86,$88,$8A,$8C,$8E,$90,$92,$94,$96,$98,$9A,$9C,$9E
.db $C0,$C2,$C4,$C6,$C8,$CA,$CC,$CE,$D0,$D2,$D4,$D6,$D8,$DA,$DC,$DE
.db $00,$02,$04,$06,$08,$0A,$0C,$0E,$10,$12,$14,$16,$18,$1A,$1C,$1E
.db $40,$42,$44,$46,$48,$4A,$4C,$4E,$50,$52,$54,$56,$58,$5A,$5C,$5E
.db $80,$82,$84,$86,$88,$8A,$8C,$8E,$90,$92,$94,$96,$98,$9A,$9C,$9E
.db $C0,$C2,$C4,$C6,$C8,$CA,$CC,$CE,$D0,$D2,$D4,$D6,$D8,$DA,$DC,$DE
.db $00,$02,$04,$06,$08,$0A,$0C,$0E,$10,$12,$14,$16,$18,$1A,$1C,$1E
.db $40,$42,$44,$46,$48,$4A,$4C,$4E,$50,$52,$54,$56,$58,$5A,$5C,$5E
.db $80,$82,$84,$86,$88,$8A,$8C,$8E,$90,$92,$94,$96,$98,$9A,$9C,$9E
.db $C0,$C2,$C4,$C6,$C8,$CA,$CC,$CE,$D0,$D2,$D4,$D6,$D8,$DA,$DC,$DE
.db $00,$02,$04,$06,$08,$0A,$0C,$0E,$10,$12,$14,$16,$18,$1A,$1C,$1E
.db $40,$42,$44,$46,$48,$4A,$4C,$4E,$50,$52,$54,$56,$58,$5A,$5C,$5E
.db $80,$82,$84,$86,$88,$8A,$8C,$8E,$90,$92,$94,$96,$98,$9A,$9C,$9E
.db $C0,$C2,$C4,$C6,$C8,$CA,$CC,$CE,$D0,$D2,$D4,$D6,$D8,$DA,$DC,$DE
;################################################################################
TablePPU_HI: ;not used
.db $20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20
.db $20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20
.db $20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20
.db $20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20
.db $21,$21,$21,$21,$21,$21,$21,$21,$21,$21,$21,$21,$21,$21,$21,$21
.db $21,$21,$21,$21,$21,$21,$21,$21,$21,$21,$21,$21,$21,$21,$21,$21
.db $21,$21,$21,$21,$21,$21,$21,$21,$21,$21,$21,$21,$21,$21,$21,$21
.db $21,$21,$21,$21,$21,$21,$21,$21,$21,$21,$21,$21,$21,$21,$21,$21
.db $22,$22,$22,$22,$22,$22,$22,$22,$22,$22,$22,$22,$22,$22,$22,$22
.db $22,$22,$22,$22,$22,$22,$22,$22,$22,$22,$22,$22,$22,$22,$22,$22
.db $22,$22,$22,$22,$22,$22,$22,$22,$22,$22,$22,$22,$22,$22,$22,$22
.db $22,$22,$22,$22,$22,$22,$22,$22,$22,$22,$22,$22,$22,$22,$22,$22
.db $23,$23,$23,$23,$23,$23,$23,$23,$23,$23,$23,$23,$23,$23,$23,$23
.db $23,$23,$23,$23,$23,$23,$23,$23,$23,$23,$23,$23,$23,$23,$23,$23
.db $23,$23,$23,$23,$23,$23,$23,$23,$23,$23,$23,$23,$23,$23,$23,$23
.db $23,$23,$23,$23,$23,$23,$23,$23,$23,$23,$23,$23,$23,$23,$23,$23 ;attr table, don't generate
;################################################################################
TablePPU_HI: ;used
LDA RNG
CMP #00
BCC TablePPU_HI_Skip0
LDA #$20
STA PPU_HI_Temp
TablePPU_HI_Skip0:
LDA RNG
CMP #64
BCC TablePPU_HI_Skip1
LDA #$21
STA PPU_HI_Temp
TablePPU_HI_Skip1:
LDA RNG
CMP #128
BCC TablePPU_HI_Skip2
LDA #$22
STA PPU_HI_Temp
TablePPU_HI_Skip2:
LDA RNG
CMP #192
BCC TablePPU_HI_Skip3
LDA #$23
STA PPU_HI_Temp
TablePPU_HI_Skip3:
LDA RNG
CMP #240
BCC TablePPU_HI_Skip4
LDA #$00
STA PPU_HI_Temp
STA PPU_LO_Temp
LDA PlaceRandomItem_Flags ;blocks writing to PPU when RNG is above 240
AND #%11111101
STA PlaceRandomItem_Flags
TablePPU_HI_Skip4:
RTS
PlaceRandomItem:
LDA PlaceRandomItem_Flags ;bit 0 code control (ora bit0 = run code, and = lock)
AND #%00000001
BEQ PlaceRandomItem_no
LDY RNG ;generate PPU LO
LDA TablePPU_LO,y
STA PPU_LO_Temp
JSR TablePPU_HI ;jump generate PPU HI
LDA PlaceRandomItem_Flags ;bit 1 blocks writing to PPU when RNG is above 240 (ora bit1 = run code)
AND #%00000010
BEQ PlaceRandomItem_no
LDA PPU_HI_Temp
STA $2006
LDA PPU_LO_Temp
STA $2006
LDA ItemTile1of4
STA $2007
LDA ItemTile2of4
STA $2007
LDA PPU_HI_Temp
STA $2006
LDA PPU_LO_Temp
CLC
ADC #32
STA $2006
LDA ItemTile3of4
STA $2007
LDA ItemTile4of4
STA $2007
LDA PlaceRandomItem_Flags ;lock the code when done
AND #%11111100
STA PlaceRandomItem_Flags
PlaceRandomItem_no:
RTS
;################################################################################
TablePPU_LO:
.db $00,$02,$04,$06,$08,$0A,$0C,$0E,$10,$12,$14,$16,$18,$1A,$1C,$1E
.db $40,$42,$44,$46,$48,$4A,$4C,$4E,$50,$52,$54,$56,$58,$5A,$5C,$5E
.db $80,$82,$84,$86,$88,$8A,$8C,$8E,$90,$92,$94,$96,$98,$9A,$9C,$9E
.db $C0,$C2,$C4,$C6,$C8,$CA,$CC,$CE,$D0,$D2,$D4,$D6,$D8,$DA,$DC,$DE
.db $00,$02,$04,$06,$08,$0A,$0C,$0E,$10,$12,$14,$16,$18,$1A,$1C,$1E
.db $40,$42,$44,$46,$48,$4A,$4C,$4E,$50,$52,$54,$56,$58,$5A,$5C,$5E
.db $80,$82,$84,$86,$88,$8A,$8C,$8E,$90,$92,$94,$96,$98,$9A,$9C,$9E
.db $C0,$C2,$C4,$C6,$C8,$CA,$CC,$CE,$D0,$D2,$D4,$D6,$D8,$DA,$DC,$DE
.db $00,$02,$04,$06,$08,$0A,$0C,$0E,$10,$12,$14,$16,$18,$1A,$1C,$1E
.db $40,$42,$44,$46,$48,$4A,$4C,$4E,$50,$52,$54,$56,$58,$5A,$5C,$5E
.db $80,$82,$84,$86,$88,$8A,$8C,$8E,$90,$92,$94,$96,$98,$9A,$9C,$9E
.db $C0,$C2,$C4,$C6,$C8,$CA,$CC,$CE,$D0,$D2,$D4,$D6,$D8,$DA,$DC,$DE
.db $00,$02,$04,$06,$08,$0A,$0C,$0E,$10,$12,$14,$16,$18,$1A,$1C,$1E
.db $40,$42,$44,$46,$48,$4A,$4C,$4E,$50,$52,$54,$56,$58,$5A,$5C,$5E
.db $80,$82,$84,$86,$88,$8A,$8C,$8E,$90,$92,$94,$96,$98,$9A,$9C,$9E
.db $C0,$C2,$C4,$C6,$C8,$CA,$CC,$CE,$D0,$D2,$D4,$D6,$D8,$DA,$DC,$DE
;################################################################################
TablePPU_HI: ;not used
.db $20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20
.db $20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20
.db $20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20
.db $20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20
.db $21,$21,$21,$21,$21,$21,$21,$21,$21,$21,$21,$21,$21,$21,$21,$21
.db $21,$21,$21,$21,$21,$21,$21,$21,$21,$21,$21,$21,$21,$21,$21,$21
.db $21,$21,$21,$21,$21,$21,$21,$21,$21,$21,$21,$21,$21,$21,$21,$21
.db $21,$21,$21,$21,$21,$21,$21,$21,$21,$21,$21,$21,$21,$21,$21,$21
.db $22,$22,$22,$22,$22,$22,$22,$22,$22,$22,$22,$22,$22,$22,$22,$22
.db $22,$22,$22,$22,$22,$22,$22,$22,$22,$22,$22,$22,$22,$22,$22,$22
.db $22,$22,$22,$22,$22,$22,$22,$22,$22,$22,$22,$22,$22,$22,$22,$22
.db $22,$22,$22,$22,$22,$22,$22,$22,$22,$22,$22,$22,$22,$22,$22,$22
.db $23,$23,$23,$23,$23,$23,$23,$23,$23,$23,$23,$23,$23,$23,$23,$23
.db $23,$23,$23,$23,$23,$23,$23,$23,$23,$23,$23,$23,$23,$23,$23,$23
.db $23,$23,$23,$23,$23,$23,$23,$23,$23,$23,$23,$23,$23,$23,$23,$23
.db $23,$23,$23,$23,$23,$23,$23,$23,$23,$23,$23,$23,$23,$23,$23,$23 ;attr table, don't generate
;################################################################################
TablePPU_HI: ;used
LDA RNG
CMP #00
BCC TablePPU_HI_Skip0
LDA #$20
STA PPU_HI_Temp
TablePPU_HI_Skip0:
LDA RNG
CMP #64
BCC TablePPU_HI_Skip1
LDA #$21
STA PPU_HI_Temp
TablePPU_HI_Skip1:
LDA RNG
CMP #128
BCC TablePPU_HI_Skip2
LDA #$22
STA PPU_HI_Temp
TablePPU_HI_Skip2:
LDA RNG
CMP #192
BCC TablePPU_HI_Skip3
LDA #$23
STA PPU_HI_Temp
TablePPU_HI_Skip3:
LDA RNG
CMP #240
BCC TablePPU_HI_Skip4
LDA #$00
STA PPU_HI_Temp
STA PPU_LO_Temp
LDA PlaceRandomItem_Flags ;blocks writing to PPU when RNG is above 240
AND #%11111101
STA PlaceRandomItem_Flags
TablePPU_HI_Skip4:
RTS