Redreamer skrev:Mitt problem då. När jag väl räknat ut en minnesposition så är det ju uppdelat på två bytes. Hur kan man sedan få in dessa i en LDA, eller måste man göra det på något "krångligt vis".
Det finns två sätt att göra det på som har lite olika fördelar. Ett sätt är att spara adressen på en zeropageadress och använda indirekt adressering. Typ såhär:
- Kod: Markera allt
char_addr = $fb
ldx #5
ldy #10
jsr set_char_addr
ldy #0
lda (char_addr),y ; ta adressen som ligger i char_addr och char_addr + 1, lägg till y och använd den adressen för att läsa en byte till a.
Nu har du tecknet på position (5,10) i a-registret.
Det andra sättet är att låta programmet modifiera sig själv och skriva om instruktionen som läser tecknet. Såhär:
- Kod: Markera allt
ldx #5
ldy #10
jsr set_char_addr
char_addr = * + 1 ; char_addr är nuvarande adress i minnet plus ett (där adressen ligger i minnet i nästa instruktion)
lda $ffff ; vadsomhelst som är större än 255, annars blir det en annan instruktion. Adressen kommer att skrivas över av set_char_addr
Fördelar och nackdelar:
Indirekt adressering:
+ Det kostar mindre att uppdatera adressen för det tar färre cykler att ändra i zeropage.
+ Adressen kan läsas av på flera ställen
+ Koden går att köra direkt i en cartridge utan problem
- Det kostar mer när man faktiskt ska läsa av adressen (för att det är indirekt).
- Antalet olika adresser som kan hållas reda på är begränsat till 127 av zeropage-utrymmet och måste trängas med annat som lagras där.
Självmodifierande kod:
+ Det kostar mindre att läsa av adressen.
- Det kostar mer att ändra adressen.
- Det är mindre flexibelt för adressen kan bara läsas på ett ställe utan att den måste uppdateras på flera ställen.
- Koden går inte att köra i ROM eller cartridge.