Odpovídáte na názor k článku Ovládání hráčů ve hře klávesnicí nebo joystickem na ZX Spectru. Názory mohou přidávat pouze registrovaní uživatelé. Nově přidané názory se na webu objeví až po schválení redakcí.
Děkuju za další lekci. Zkouším si to psát po svém, neřeším tolik jestli ušetřím pár byte, ale preferuju abych to měl přehledný. Mám rád když je oddělený testování klavesnice od akcí, kterou má stisk klávesy vyvolat, takže jsem použil podobně jako minule (děkuji ".DW" za připomínky a rady, už jsem si opravil chyby co jsem tam měl) podprogramy "vpravo", "vlevo", "nahoru", "dolu".
Chtěl jsem tam taky mít dorazy na kraje obrazovky. První co mne napadlo mít v DE souřadnice Y,X a před každou změnou atributu vypočítat adresu atributu do HL.
att_adr: ;vypocet adresy atributu 32*D+E
push bc
ld h,0
ld l,d ;Y
add hl,hl ;Y*2
add hl,hl ;Y*4
add hl,hl ;Y*8
add hl,hl ;Y*16
add hl,hl ;Y*32
ld bc, ATTRIBUTE_ADR
add hl,bc ;ADR+32*Y
ld b,0
ld c,e ;X
add hl,bc ;ADR+32*Y+X
pop bc
ret
Funguje to, nevím jestli by to šlo napsat elegantněji (na nic lepšího jsem zatím nepřišel), ale přijde mi to dost brutální dělat po každé takovýhle výpočet.
Druhý nápad byl tedy, že budu při pohybu současně přičítat/odčítat 1 v D/E a zároveň modifikovat HL (trik s přičítáním -32 mne napadl taky hned - na atmelu zas chybí instrukce pro přičtení konstanty, tak se musí odečítat záporná hodnota). Je to sice kratší, ale zas se mi moc nelíbí, že musím současně aktualizovat dvoje souřadnice.
Verze pro Sinclair / Interface 2:
ENTRY_POINT equ $8000
ROM_OPEN_CHANNEL equ $1601
ATTRIBUTE_ADR equ $5800
ROM_CLS equ $0DAF
X0 equ 15
Y0 equ 10
XMIN equ 0
XMAX equ 31
YMIN equ 0
YMAX equ 23
KB_R0 equ $fe
KB_R1 equ $fd
KB_R2 equ $fb
KB_R3 equ $f7
KB_R4 equ $ef
KB_R5 equ $df
KB_R6 equ $bf
KB_R7 equ $7f
Color0 equ $38
Color1 equ $48
Color2 equ $50
INIPOS equ ATTRIBUTE_ADR+32*Y0+X0
;-------------------------------------------------------------------------------
CH_ATTR macro attr
ld (hl), attr
endm
KEYB macro port
ld c, $fe ;adresa portu
ld b, port ;adresa radku
in a, (c) ;vlastní čtení z portu (5 bitů)
endm
;-------------------------------------------------------------------------------
org ENTRY_POINT
start: call ROM_CLS
ld d,Y0
ld e,X0
ld hl,INIPOS
CH_ATTR Color1
;-------------------------------------------------------------------------------
main: call delay
KEYB KB_R3
rra ;1
call nc,vlevo
rra ;2
call nc,dolu
rra ;3
call nc,nahoru
rra ;4
call nc,vpravo
rra ;5
call nc,palba
call c,klid
jp main
;-------------------------------------------------------------------------------
vpravo: push AF
CH_ATTR Color0
ld a,e
cp XMAX
jr Z,vp0
inc e
inc hl
vp0: CH_ATTR Color1
pop AF
ret
;-------------------------------------------------------------------------------
vlevo: push AF
CH_ATTR Color0
ld a,e
cp XMIN
jr Z,vl0
dec e
dec hl
vl0: CH_ATTR Color1
pop AF
ret
;-------------------------------------------------------------------------------
dolu: push AF
CH_ATTR Color0
ld a,d
cp YMAX
jr Z,do0
inc d
ld bc,32
add hl,bc
do0: CH_ATTR Color1
pop AF
ret
;-------------------------------------------------------------------------------
nahoru: push AF
CH_ATTR Color0
ld a,d
cp YMIN
jr Z,na0
dec d
ld bc,-32
add hl,bc
na0: CH_ATTR Color1
pop AF
ret
;-------------------------------------------------------------------------------
palba: push AF
CH_ATTR Color2
pop AF
ret
;-------------------------------------------------------------------------------
klid: push AF
CH_ATTR Color1
pop AF
ret
;-------------------------------------------------------------------------------
delay: push bc ;zpozdeni
push de
ld d,60
ld e,0
d01: dec e
jr nz, d01
dec d
jr nz, d01
pop de
pop bc
ret
end ENTRY_POINT