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 wiecejSolidTile equ 1
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 $100dane: db 0, 1, 2, 3, 4, 5, 6, 7 db 8, 9,10,11,12,13,14,15 ; db ...
LDY #$04TileCalc_Loop: LDA <addrLO ; add the number of rows to the address 4 times CLC ADC <temp STA <addrLO LDA <addrHI ADC #0 STA <addrHI DEY BNE TileCalc_Loop
LD HL,$C000 LD A,(temp) ADD A,L ; A = A+L LD L,A ; L = A+L ADC A,H ; A = A+L+H+carry SUB L ; A = H+carry LD H,A ; H = H+carry- nie wiem czy jest poprawnie teraz no i musze zrobic dodanie wartosci ze zmiennej temp do adresu w HL 4x (musi tak byc z pewnych wzgledow)bo to chyba nie jest poprawnie? ld a,(temp) ld hl,$C000 add a,(hl) add a,(hl) add a,(hl) add a,(hl)
ld a,(temp)ld d,0ld e,a ; de = (temp)add hl,deadd hl,deadd hl,deadd hl,de ; lame, ale proste do złapania
Moim zdaniem lepiej (szybciej) jest wartość dodawaną najpierw przemnożyć przez 4, używając przesuwania bitowego.Pytanie, jaki zakres ma mieć ta "zmienna", bo jak 0..255, to trzeba przesuwać na 16 bitach, by nic nie zgubić.
W sensie, dodajesz wartość zmiennej temp cztery razy do adresu w HL?Nie bój się 16 bitów.
No wlasnie ja probuje ogarniac jakos te wyliczenia 16bitowe w Z80 ale na to trzeba czasu.
ld hl,$C000ld a,(temp)ld d,0ld e,a ; de = (temp)add hl,deadd hl,deadd hl,deadd hl,de ; lame, ale proste do złapania
A, jednak się nie dogadaliśmy.Czy zmienna pod adresem $c000 jest 8 czy 16-bit?(sugeruję zapisywać problem w pseudokodzie, c, pascalu, basicu... łatwiej dotrze do ludzi nie łapiących 65xx )
ld a,$20 ;testowo wartosc 20 ld (temp),a LD HL,$C000 ld a,(temp) ld d,0 ld e,a ; de = (temp) add hl,de add hl,de add hl,de add hl,de ld ($C020),HL ; sprawdzilem wynik i bylo w ram zapisane C080 wiec gra, zwiekszenie 8x mialem wynik C100 wiec HI zwiekszone takze
LD A,$20 LD D,0 LD E,A ; teraz w de bedzie $20 czyli wartosc jaka znajdować będzie sie na początku w Aku ADD HL,DE LD A,(HL) LD D,E ;wrzucamy a do e, żeby mieć go w zapasie LD HL,TileBits ;wrzucamy adres tablicy do hl ADD HL,DE ;uzylismy de bo w d juz mamy zero z poprzedniego działania, oszczędzając cpu i rom LD A,(HL) ;pobraliśmy bajt z tablicy TileBits
AirTile equ $00SolidTil equ $01TileBits: db AirTile,AirTile,AirTile,SolidTil db AirTile,SolidTil,SolidTil,AirTile db AirTile,SolidTil,AirTile,SolidTil db SolidTil,AirTile,AirTile,AirTile db AirTile db AirTile db SolidTil db AirTile db AirTile db SolidTil db SolidTil
#define AirTile $00#define SolidTile $01TileBits:.byte AirTile.byte SolidTile.byte SolidTile