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í.
Tak jsem si "pohrál" a tady je výsledek pro dva hráče. Dorazy testuju přímo v HL. No a protože jsou hráči dva, jsou jejich souřadnice primárně uloženy v proměnných HracA_XY a HracB_XY.
ENTRY_POINT equ $8000
ROM_OPEN_CHANNEL equ $1601
ATTRIBUTE_ADR equ $5800
ROM_CLS equ $0DAF
;-------------------------------------------------------------------------------
X0A equ 10 ;pocatecni souradnice
Y0A equ 10
X0B equ 20
Y0B equ 10
XMIN equ 0 ;meze
XMAX equ 31
YMIN equ ATTRIBUTE_ADR
YMAX equ ATTRIBUTE_ADR+23*32
KB_R0 equ $fe ;radky klavesnice
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 ;bila
Color1A equ $48 ;modra
Color2A equ $58 ;magenta
Color1B equ $60 ;zelena
Color2B equ $70 ;zluta
Color3 equ $50 ;cervena
INIPOS_A equ ATTRIBUTE_ADR+32*Y0A+X0A
INIPOS_B equ ATTRIBUTE_ADR+32*Y0B+X0B
;-------------------------------------------------------------------------------
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
LOAD_HracXY macro ;nacteni pozice hrace z pameti do HL
ld l,(IX)
ld h,(IX+1)
endm
STORE_HracXY macro ;ulozeni pozice hrace z HL do pameti
ld (IX),l
ld (IX+1),h
endm
;-------------------------------------------------------------------------------
org ENTRY_POINT
start: call ROM_CLS ;vymazani obrazovky
ld ix,HracA_XY ;pocatecni zobrazeni hrace A
LOAD_HracXY
CH_ATTR Color1A
ld ix,HracB_XY ;pocatecni zobrazeni hrace B
LOAD_HracXY
CH_ATTR Color1B
;-------------------------------------------------------------------------------
main: call delay ;zpozdeni
ld ix,HracA_XY ;adresa pozice hrace A
KEYB KB_R3 ;test joysticku A
ld e,Color1A ;barva hrace A
rra ;1
call nc,vlevo
rra ;2
call nc,dolu
rra ;3
call nc,nahoru
rra ;4
call nc,vpravo
rra ;5
ld e,Color2A ;barva pri strelbe
call nc,palba
ld e,Color1A ;barva hrace A
call c,klid
ld ix,HracB_XY ;adresa pozice hrace B
KEYB KB_R4 ;test joysticku B
ld e,Color1B ;barva hrace B
rla
rla
rla
rla ;6
call nc,vlevo
rla ;7
call nc,dolu
rla ;8
call nc,nahoru
rla ;9
call nc,vpravo
rla ;0
ld e,Color2B ;barva pri strelbe
call nc,palba
ld e,Color1B ;barva hrace B
call c,klid
call kolize ;test kolize hracu
jp main ;hlavni cyklus
;-------------------------------------------------------------------------------
vpravo: push AF
LOAD_HracXY ;nacteni pozice hrace
CH_ATTR Color0 ;barva pozadi
ld a,l ;test okraje
cpl
and 0x1F ;poslednich 5 bitu 11111
jr Z,vp0 ;nebude zmena pozice
inc hl ;nova pozice
vp0: CH_ATTR e ;barva hrace
STORE_HracXY ;ulozeni pozice hrace
pop AF
ret
;-------------------------------------------------------------------------------
vlevo: push AF
LOAD_HracXY ;nacteni pozice hrace
CH_ATTR Color0 ;barva pozadi
ld a,l ;test okraje
and 0x1F ;poslednich 5 bitu 00000
jr Z,vl0 ;nebude zmena pozice
dec hl ;nova pozice
vl0: CH_ATTR e ;barva hrace
STORE_HracXY ;ulozeni pozice hrace
pop AF
ret
;-------------------------------------------------------------------------------
dolu: push AF
LOAD_HracXY ;nacteni pozice hrace
CH_ATTR Color0 ;barva pozadi
push HL ;zalohovani pozice
ld a,l
and 0xE0 ;nulovani poslednich 5 bitu
ld l,a
ld bc,YMAX ;nastaveni maxima
sbc hl,bc ;otestovani hodnoty
pop HL
jr Z,do0 ;nebude zmena pozice
ld bc,32 ;nova pozice
add hl,bc
do0: CH_ATTR e ;barva hrace
STORE_HracXY ;ulozeni pozice hrace
pop AF
ret
;-------------------------------------------------------------------------------
nahoru: push AF
LOAD_HracXY ;nacteni pozice hrace
CH_ATTR Color0 ;barva pozadi
push HL ;zalohovani pozice
ld a,l
and 0xE0 ;nulovani poslednich 5 bitu
ld l,a
ld bc,YMIN ;nastaveni maxima
sbc hl,bc ;otestovani hodnoty
pop HL
jr Z,na0 ;nebude zmena pozice
ld bc,-32 ;nova pozice
add hl,bc
na0: CH_ATTR e ;barva hrace
STORE_HracXY ;ulozeni pozice hrace
pop AF
ret
;-------------------------------------------------------------------------------
palba: push AF ;zmena barvy pri strelbe
LOAD_HracXY ;nacteni pozice hrace
CH_ATTR e
pop AF
ret
;-------------------------------------------------------------------------------
klid: push AF ;zmena barvy kdyz se nestrili
LOAD_HracXY ;nacteni pozice hrace
CH_ATTR e
pop AF
ret
;-------------------------------------------------------------------------------
kolize: push AF
ld ix,HracA_XY
LOAD_HracXY ;nacteni pozice hrace A
ld b,h ;kopie do BC
ld c,l
ld ix,HracB_XY
LOAD_HracXY ;nacteni pozice hrace B
or a ;nulovani cary
sbc hl,bc ;porovnani
jr nz,ko0 ;neni kolize
LOAD_HracXY
CH_ATTR Color3 ;nastaveni barvy kolize
ko0: 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
;-------------------------------------------------------------------------------
HracA_XY: dw INIPOS_A ;pozice hrace A v pameti
HracB_XY: dw INIPOS_B ;pozice hrace B v pameti
end ENTRY_POINT
ENTRY_POINT equ $8000
ROM_OPEN_CHANNEL equ $1601
ATTRIBUTE_ADR equ $5800
ROM_CLS equ $0DAF
;-------------------------------------------------------------------------------
X0A equ 10 ;pocatecni souradnice
Y0A equ 10
X0B equ 20
Y0B equ 10
XMIN equ 0 ;meze
XMAX equ 31
YMIN equ ATTRIBUTE_ADR
YMAX equ ATTRIBUTE_ADR+23*32
KB_R0 equ $fe ;radky klavesnice
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 ;bila
Color1A equ $48 ;modra
Color2A equ $58 ;magenta
Color1B equ $60 ;zelena
Color2B equ $70 ;zluta
Color3 equ $50 ;cervena
INIPOS_A equ ATTRIBUTE_ADR+32*Y0A+X0A
INIPOS_B equ ATTRIBUTE_ADR+32*Y0B+X0B
;-------------------------------------------------------------------------------
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
LOAD_HracXY macro ;nacteni pozice hrace z pameti do HL
ld l,(IX)
ld h,(IX+1)
endm
STORE_HracXY macro ;ulozeni pozice hrace z HL do pameti
ld (IX),l
ld (IX+1),h
endm
;-------------------------------------------------------------------------------
org ENTRY_POINT
start: call ROM_CLS ;vymazani obrazovky
ld ix,HracA_XY ;pocatecni zobrazeni hrace A
LOAD_HracXY
CH_ATTR Color1A
ld ix,HracB_XY ;pocatecni zobrazeni hrace B
LOAD_HracXY
CH_ATTR Color1B
;-------------------------------------------------------------------------------
main: call delay ;zpozdeni
ld ix,HracA_XY ;adresa pozice hrace A
KEYB KB_R3 ;test joysticku A
ld e,Color1A ;barva hrace A
rra ;1
call nc,vlevo
rra ;2
call nc,dolu
rra ;3
call nc,nahoru
rra ;4
call nc,vpravo
rra ;5
ld e,Color2A ;barva pri strelbe
call nc,palba
ld e,Color1A ;barva hrace A
call c,klid
ld ix,HracB_XY ;adresa pozice hrace B
KEYB KB_R4 ;test joysticku B
ld e,Color1B ;barva hrace B
rla
rla
rla
rla ;6
call nc,vlevo
rla ;7
call nc,dolu
rla ;8
call nc,nahoru
rla ;9
call nc,vpravo
rla ;0
ld e,Color2B ;barva pri strelbe
call nc,palba
ld e,Color1B ;barva hrace B
call c,klid
call kolize ;test kolize hracu
jp main ;hlavni cyklus
;-------------------------------------------------------------------------------
vpravo: push AF
LOAD_HracXY ;nacteni pozice hrace
CH_ATTR Color0 ;barva pozadi
ld a,l ;test okraje
cpl
and 0x1F ;poslednich 5 bitu 11111
jr Z,vp0 ;nebude zmena pozice
inc hl ;nova pozice
vp0: CH_ATTR e ;barva hrace
STORE_HracXY ;ulozeni pozice hrace
pop AF
ret
;-------------------------------------------------------------------------------
vlevo: push AF
LOAD_HracXY ;nacteni pozice hrace
CH_ATTR Color0 ;barva pozadi
ld a,l ;test okraje
and 0x1F ;poslednich 5 bitu 00000
jr Z,vl0 ;nebude zmena pozice
dec hl ;nova pozice
vl0: CH_ATTR e ;barva hrace
STORE_HracXY ;ulozeni pozice hrace
pop AF
ret
;-------------------------------------------------------------------------------
dolu: push AF
LOAD_HracXY ;nacteni pozice hrace
CH_ATTR Color0 ;barva pozadi
push HL ;zalohovani pozice
ld a,l
and 0xE0 ;nulovani poslednich 5 bitu
ld l,a
ld bc,YMAX ;nastaveni maxima
sbc hl,bc ;otestovani hodnoty
pop HL
jr Z,do0 ;nebude zmena pozice
ld bc,32 ;nova pozice
add hl,bc
do0: CH_ATTR e ;barva hrace
STORE_HracXY ;ulozeni pozice hrace
pop AF
ret
;-------------------------------------------------------------------------------
nahoru: push AF
LOAD_HracXY ;nacteni pozice hrace
CH_ATTR Color0 ;barva pozadi
push HL ;zalohovani pozice
ld a,l
and 0xE0 ;nulovani poslednich 5 bitu
ld l,a
ld bc,YMIN ;nastaveni maxima
sbc hl,bc ;otestovani hodnoty
pop HL
jr Z,na0 ;nebude zmena pozice
ld bc,-32 ;nova pozice
add hl,bc
na0: CH_ATTR e ;barva hrace
STORE_HracXY ;ulozeni pozice hrace
pop AF
ret
;-------------------------------------------------------------------------------
palba: push AF ;zmena barvy pri strelbe
LOAD_HracXY ;nacteni pozice hrace
CH_ATTR e
pop AF
ret
;-------------------------------------------------------------------------------
klid: push AF ;zmena barvy kdyz se nestrili
LOAD_HracXY ;nacteni pozice hrace
CH_ATTR e
pop AF
ret
;-------------------------------------------------------------------------------
kolize: push AF
ld ix,HracA_XY
LOAD_HracXY ;nacteni pozice hrace A
ld b,h ;kopie do BC
ld c,l
ld ix,HracB_XY
LOAD_HracXY ;nacteni pozice hrace B
or a ;nulovani cary
sbc hl,bc ;porovnani
jr nz,ko0 ;neni kolize
LOAD_HracXY
CH_ATTR Color3 ;nastaveni barvy kolize
ko0: 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
;-------------------------------------------------------------------------------
HracA_XY: dw INIPOS_A ;pozice hrace A v pameti
HracB_XY: dw INIPOS_B ;pozice hrace B v pameti
end ENTRY_POINT