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í.
Upravil jsem ten kod na minimalisticky "Dyna Blaster". Kod trosku nabobtnal na 210 bajtu, ale uplne jsem to nehrotil s optimalizaci.
ENTRY_POINT equ $8000
ATTRIBUTE_ADR equ $5800
ROM_CLS equ $0DAF
X0A equ 32/2-6 ;pocatecni souradnice
Y0A equ 23/2
X0B equ 32/2+5
Y0B equ 23/2
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_
player_a equ 3
bomb equ 4
player_b equ 5
timer equ 6
INIPOS_A equ ATTRIBUTE_ADR+32*Y0A+X0A
INIPOS_B equ ATTRIBUTE_ADR+32*Y0B+X0B
;-------------------------------------------------------------------------------
org ENTRY_POINT
ld A, %00101000 ; 2:7
start:
rra ; 1:4
rra ; 1:4
rra ; 1:4
out (254),A ; 2:11 zx_border 0=blk,1=blu,2=red,3=mag,4=grn,5=cyn,6=yel,7=wht
xor a
ld (0x5C8D),a
call ROM_CLS
ld hl,INIPOS_B
ex de,hl
ld hl,INIPOS_A
;-------------------------------------------------------------------------------
main:
ld bc, KB_R4 ;3:10
in a,(c) ;2:12 vlastní čtení z portu (5 bitů)
push af ;1:10
ld b,high KB_R3 ;2:7
in a,(c) ;2:12 vlastní čtení z portu (5 bitů)
ld bc, 0x0020 ;3:10 = 32
push hl ;1:11
call vlevo_rra ;3:17
call vpravo_rra ;3:17
call dolu_rra ;3:17
call nahoru_rra ;3:17
call palba_rra ;3:17
ex (sp),hl ;1:19
res player_a,(hl) ;2:15
pop hl ;1:10
set player_a,(hl) ;2:15
ex de,hl
pop af ;1:10
push hl ;1:11
call palba_rra ;3:17
call nahoru_rra ;3:17
call dolu_rra ;3:17
call vpravo_rra ;3:17
call vlevo_rra ;3:17
ex (sp),hl ;1:19
res player_b,(hl) ;2:15
pop hl ;1:10
set player_b,(hl) ;2:15
push hl ;1:11
ld hl,ATTRIBUTE_ADR+3*256-1;3:10
check_timer:
ld a,(hl) ;1:7
bit timer,a ;2:8
jr z,no_timer ;2:7/12
bit bomb,a ;2:8
jr nz,explosion ;2:7/12
flash:
and %00000111 ;2:7 mask_time
jr z,save ;2:7/12
or %11000000 ;2:7
jr dec_a ;2:7/12
explosion:
and %00000111 ;2:7 mask_time
jr nz,dec_timer ;2:7/12
ld a,%11000111 ;2:7 init flash
push hl
call vlevo
ld (hl),a
pop hl
push hl
call vpravo
ld (hl),a
pop hl
push hl
call dolu
ld (hl),a
pop hl
push hl
call nahoru
ld (hl),a
pop hl
jr save ;2:12
dec_timer:
ld a,(hl) ;1:7
dec_a:
dec a ;1:4
save:
ld (hl),a ;1:7
no_timer:
dec hl ;1:6
bit 2,h ;2:8 0x57 1001 0111
jr z,check_timer;2:7/12
pop hl ;1:10
; check live
ld a,(hl) ;1:7
ex de,hl ;1:4
or (hl) ;1:7
and %00101000 ;2:7
cp %00101000 ;2:7
jp nz,start ;3:10
halt
halt
jp main
;-------------------------------------------------------------------------------
if 0
read_row:
ld c, 0xFE ;2:7
in a, (c) ;2:12 vlastní čtení z portu (5 bitů)
ld bc, 0x0020 ;3:10 = 32
ret ;1:10
endif
;-------------------------------------------------------------------------------
vlevo_rra:
rra ;1:4
ret c ;1:5/11
vlevo:
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
ret ;1:10
;-------------------------------------------------------------------------------
vpravo_rra:
rra ;1:4
ret c ;1:5/11
vpravo:
push af ;1:11
ld a,%00011111 ;2:7
inc l ;1:4
and l ;1:4
jr nz,$+3 ;2:7/12
dec l ;1:4
pop af ;1:10
ret ;1:10
;-------------------------------------------------------------------------------
dolu_rra:
rra ;1:4
ret c ;1:5/11
dolu:
; 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,$+4 ;2:7/12
sbc hl,bc ;2:15
dec h ;1:4
ret ;1:10
;-------------------------------------------------------------------------------
nahoru_rra:
rra ;1:4
ret c ;1:5/11
nahoru:
; 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
ret z ;1:5/11
add hl,bc ;1:11
ret ;1:10
;-------------------------------------------------------------------------------
palba_rra:
rra ;1:4
ret c ;1:5/11
palba:
push af ;1:11
ld a,%01010111 ;2:7
or (hl) ;1:7
ld (hl),a ;1:7
pop af ;1:10
ret ;1:10
end ENTRY_POINT
Tezko rici jak je to "hratelne" bez 2 hracu a joysticku. Na emulatoru me moje klavesnice nepodporuje pro prvniho hrace fire+sikmy pohyb, krome vlevo dolu.