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í.
A pro dva hrace to jde napsat i takto:
ENTRY_POINT equ $8000
ATTRIBUTE_ADR equ $5800
ROM_CLS equ $0DAF
X0A equ 10 ;pocatecni souradnice
Y0A equ 10
X0B equ 20
Y0B equ 10
KB_R0 equ $fefe ;BC=0xFEFE ->A=...VCXZc
KB_R1 equ $fdfe ;BC=0xFDFE ->A=...GFDSA
KB_R2 equ $fbfe ;BC=0xFBFE ->A=...TREWQ
KB_R3 equ $f7fe ;BC=0xF7FE ->A=...54321
KB_R4 equ $effe ;BC=0xEFFE ->A=...67890
KB_R5 equ $dffe ;BC=0xDFFE ->A=...YUIOP
KB_R6 equ $bffe ;BC=0xBFFE ->A=...HJKLe
KB_R7 equ $7ffe ;BC=0x7FFE ->A=...BNMs_
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
;-------------------------------------------------------------------------------
KEYB macro port
ld bc, 256*port+$fe ;adresa radku & adresa portu
endm
;-------------------------------------------------------------------------------
org ENTRY_POINT
start: call ROM_CLS
ld hl,INIPOS_B
ld (hl),Color1B
ex de,hl
ld hl,INIPOS_A
ld (hl),Color1A
;-------------------------------------------------------------------------------
main: halt
halt
ld bc, KB_R3
in a, (c) ;vlastní čtení z portu (5 bitů)
call move
ld a,Color1A ;klid
jr c,$+4
ld a,Color2A ;palba
ld (hl),a ;1:7
ex de,hl
ld bc, KB_R4
in a, (c) ;vlastní čtení z portu (5 bitů)
ld c,a
ld b,5
invert_loop:
rr c
adc a,a
djnz invert_loop
call move
ld a,Color1B ;klid
jr c,$+4
ld a,Color2B ;palba
ld (hl),a ;1:7
ex de,hl
or a
sbc hl,de
add hl,de
jr nz,$+4
ld (hl),Color3 ; kolize
jp main
;-------------------------------------------------------------------------------
; in:
; A=read port
; HL= ATTRIBUTE_ADR
move:
push hl
ld bc, 0x0020 ;3:10 = 32
vlevo:
rra ;1
jr c,vpravo
if 1
; 31x 43 taktu, 1x 44 taktu
push af ;1:11
ld a,%00011111 ;2:7
and l ;1:4
jr z,$+3 ;2:7/12
dec l ;1:4
pop af ;1:10
else
; 50% 24 taktu, 3% 43 taktu, 47% 42 taktu
dec l ;1:4 ...0 0000-1?
bit 4,l ;2:8
jr z,vpravo ;2:7/12
inc l ;1:4 ...1 ....+1?
bit 4,l ;2:8
jr z,vpravo ;2:7/12
dec l ;1:4
endif
vpravo:
rra ;4
jr c,dolu
if 1
push af ;1:11
if 1
; o trochu rychlejsi, protoze 31x 47 taktu, 1x48 taktu
ld a,%00011111 ;2:7
inc l ;1:4
and l ;1:4
jr nz,$+3 ;2:7/12
dec l ;1:4
else
; o trochu pomalejsi, protoze 31x 48 taktu, 1x47 taktu
ld a,%11100000 ;2:7
or l ;1:4
inc a ;1:4
jr z,$+3 ;2:7/12
inc l ;1:4
endif
pop af ;1:10
else
; 50% 24 taktu, 3% 43 taktu, 47% 42 taktu
inc l ;1:4 ...1 1111+1?
bit 4,l ;2:8
jr nz,dolu ;2:7/12
dec l ;1:4 ...0 ....-1?
bit 4,l ;2:8
jr nz,dolu ;2:7/12
inc l ;1:4
endif
dolu:
rra ;2
jr c,nahoru
; last row 0x5AE0..0x5AFF => 0101 1010 111. ....
add hl,bc ;1:11 fail:0x5B ...1011; ok:0x58 ...1000,0x59 ...1001,0x5A ...1010
inc h ;1:4
bit 2,h ;2:8
jr z,nahoru-1 ;2:7/12
sbc hl,bc ;2:15
dec h ;1:4
nahoru:
rra ;3
jr c,palba
; first row 0x5800..0x581F => 0101 1000 000. ....
sbc hl,bc ;2:15 no carry! fail:0x57 ...0(1)11; ok:0x58 ...1(0)00,0x59 ...1(0)01,0x5A ...1(0)10
bit 2,h ;2:8
jr z,palba ;2:7/12
add hl,bc ;1:11
palba:
rra ;5
ex (sp),hl ;1:19
ld (hl),Color0 ;2:10
pop hl ;1:11
ret
;-------------------------------------------------------------------------------
end ENTRY_POINT
Je to 122 bajtu z puvodnich 313. Opet tam mas tu chybu ze mas jinak poprehazene klavesy a pohyby.
A tady jsem se sam spalil! Protoze jsem jen prohodil u druheho hrace puvodne jen radek ktery se cte a zbytek nechal shodny jenze...
V clanku to neni zdurazneno ale na te strance:
https://worldofspectrum.org/faq/reference/peripherals.htm
je uvedeno ze:
Sinclair
The 'left' Sinclair joystick maps the joystick directions and the fire button to the 1 (left), 2 (right), 3 (down), 4 (up) and 5 (fire) keys on the ZX Spectrum keyboard, and can thus be read via port 0xf7fe; see the Port 0xfe section for full details. For any of the joystick interfaces which map to keys, any game offering the appropriate form of joystick control can instead be played with the listed keys.
The 'right' Sinclair joystick maps to keys 6 (left), 7 (right), 8 (down), 9 (up) and 0 (fire) and can therefore be read via port 0xeffe.
Vypada to logicky az do chvile kdy zjistis, ze se ti ty bity mapuji takto
KB_R3 equ $f7fe ;BC=0xF7FE ->A=...54321 KB_R4 equ $effe ;BC=0xEFFE ->A=...67890
Je to inverzne! Tak jsem to jen narychlo ohackoval ze prohazuji 5 bitu nez volam rutinu co resi druheho hrace.