ZX Spectrum > PROGRAMOWANIE

kod 6502 na Z80 (adresowanie bezwgledne indexowane)

(1/4) > >>

siudym:
Mam kolejny problem z przepisaniem kodu 6502 na Z80 :)

Pod adresem ram $0300-$06FF (addrLO,addrHI) mam kopię 1-kilobajtowego (1024b) ekranu NES, użyty jest rejestr indexowy Y
aby wyliczyć numer kafelka/tilesa jaki znajduję sie pod wskazanym przez LDA adresie (przykładowo mam tam $20)
Niestety mam problem aby to przepisac na kod Z80, poniewaz nie ma tam rejestrow idexowych dzialajacych na podobnej zasadzie
oraz chyba nie ma takiego typu adresowania bezwglednego ?

Aha i w Z80 adres kopii ekranu wielkosci 1024bajtow bedzie startowac w $C000-$C3FF (zapewne zaladowanie najpierw do    LD HL,$C000 ale co dalej to juz mam problem, bo skopiowanie pewnej tablicy to wiem, ale juz takie skanowanie bajtow nie mam pojecia jak ugryzc)

edit: maly błąd w 6502 uzyte adresowanie "pośredne strony zerowej postindeksowane Y (Indirect zero-page post-indexed Y)"


--- Kod: ---
LDA #$20 ; laduje do aku $20 (przykladowo, bo moze byc wyliczona wczesniej wartosc dodowolna)
TAY ; przenosze akumulator do rejestru indexowego Y
; (adresowania bezwzglednego mozna tylko odczytywac z rejestrem Y nie X)
LDA [addrLO],Y ; odczytuje adres w ram zwiekszony o Y
TAY ; odczytana wartosc leci znowu do rejestru Y
LDA TileBits,Y ; teraz odczytuje jaki TYP kafelka znajduje sie pod tym adresem (bedzie odcztana wartosc stalej Air (00) Solid (01)

; teraz w akumulatorze mam potrzebna wartosc 00 lub 01 bo tylko takie typy kafelkow ustawione sa w stalych

;################################################################################

TileBits: ; tablica 256 bajtów

.db AirTile ;00 ; air tile
.db SolidTile ;01 ; solid tile
.db SolidTile ;02
.db SolidTile ;03
.db SolidTile ;04
.db SolidTile ;05
.db SolidTile ;06
.db SolidTile ;07
.db SolidTile ;08
.db SolidTile ;09
.db SolidTile ;0A
.db SolidTile ;0B
.db SolidTile ;0C
.db SolidTile ;0D
.db SolidTile ;0E
.db SolidTile ;0F

.db AirTile ;10
.db AirTile ;11
.db AirTile ;12
.db AirTile ;13
.db SolidTile ;14
.db SolidTile ;15
.db SolidTile ;16
.db SolidTile ;17
.db SolidTile ;18
.db SolidTile ;19
.db SolidTile ;1A
.db SolidTile ;1B
.db SolidTile ;1C
.db SolidTile ;1D
.db SolidTile ;1E
.db SolidTile ;1F

.db AirTile ;20
.db AirTile ;21
.db AirTile ;22
.db AirTile ;23
.db SolidTile ;24
.db SolidTile ;25
.db SolidTile ;26
.db SolidTile ;27
.db SolidTile ;28
.db SolidTile ;29
.db SolidTile ;2A
.db SolidTile ;2B
.db SolidTile ;2C
.db SolidTile ;2D
.db SolidTile ;2E
.db SolidTile ;2F

(...) etc etc (czyli 30,40,50,60,70,80,90,A0,B0,C0,D0....)

.db SolidTile ;E0
.db SolidTile ;E1
.db SolidTile ;E2
.db SolidTile ;E3
.db SolidTile ;E4
.db SolidTile ;E5
.db SolidTile ;E6
.db SolidTile ;E7
.db SolidTile ;E8
.db SolidTile ;E9
.db SolidTile ;EA
.db SolidTile ;EB
.db SolidTile ;EC
.db SolidTile ;ED
.db SolidTile ;EE
.db SolidTile ;EF

.db SolidTile ;F0
.db SolidTile ;F1
.db SolidTile ;F2
.db SolidTile ;F3
.db SolidTile ;F4
.db SolidTile ;F5
.db SolidTile ;F6
.db SolidTile ;F7
.db SolidTile ;F8
.db SolidTile ;F9
.db SolidTile ;FA
.db SolidTile ;FB
.db SolidTile ;FC
.db SolidTile ;FD
.db SolidTile ;FE
.db SolidTile ;FF ; tile $FF (#255)

;################################################################################

AirTile equ 0 ; stale okreslajace typy tilesow, mozna dodac wiecej
SolidTile equ 1


--- Koniec kodu ---

steev:
Jedno z wielu możliwych rozwiązań:


--- Kod: ---indeks equ 3

    org $8000
    ld hl,dane    ; albo ld h,hi(dane)
    ld l,indeks   ; uproszczenie możliwe dzięki align $100 :)

    ld a,(hl)

    ret

    align $100
dane:
    db 0, 1, 2, 3, 4, 5, 6, 7
    db 8, 9,10,11,12,13,14,15
    ; db ...

--- Koniec kodu ---

matofesi:
@steev chyba nie... Tam jest jakieś podwójne pobieranie danych - najpierw z tablicy a potem chyba na tej podstawie z TileBits. Czyli jeszcze przed ret'em musiałoby być przeładowanie a do hl i drugi odczyt...

Ale może ja się nie znam. A na pewno nie znam się na 6502 ;)

steev:
Owszem, ale zasada jest ta sama.
Jakoś trzeba wziąć adres bazowy tablicy i dodać indeks.
Rozwiązań na to jest w Z80 co najmniej kilka, dałem przykład jednego (i niekoniecznie najlepszego :)

siudym:
Nawet dobry trop przydatny :)

Nawigacja

[0] Indeks wiadomości

[#] Następna strona

Idź do wersji pełnej