control
ld hl,(arrx)
ld (oldarrx),hl
ld a,(arry)
ld (oldarry),a
mousebuttons=$+1
ld a,0
ld (oldmousebuttons),a
GET_KEY ;OS_GETKEYNOLANG
ld a,nofocuskey
ld (key),a
jr nz,control_nofocus
ld a,c ;keynolang
ld (key),a
control_imer_oldmousecoords=$+1
ld bc,0
ld (control_imer_oldmousecoords),de
ld a,b
sub d
ld d,a
ld a,e
sub c
ld e,a
control_nofocus
ld (control_imer_mousecoordsdelta),de
ld a,l ;hl=(sysmousebuttons)
push af ;ld (control_imer_buttons),a
OS_GETKEYMATRIX ;out: bcdehlix = полуряды cs...space
;ld a,b ;
;ld (cur_cs_halfrow),a
;ld a,0xef
;in a,(0xfe)
ld a,h;l
rrca
rla
rla
rrca
rla
rla
or 0x86;%10000110
;ld a,0xfd
;in a,(0xfe)
bit 0,c;d ;A
ld c,a
jr nz,$+4
res 4,c ;down
;c=%1lrdu11L
;ld a,0xdf
;in a,(0xfe)
ld a,l;hx
rra ;P
jr c,$+4
res 5,c ;right
rra ;O
jr c,$+4
res 6,c ;left
;ld a,0xfb
;in a,(0xfe)
ld a,d;e
rra ;Q
jr c,$+4
res 3,c ;up
;ld a,0x7f
;in a,(0xfe)
ld a,lx;b
rra ;Space
jr c,control_nospace
res 0,c ;Space = LMB
rra ;SS
jr c,$+4
res 2,c ;SS+Space = MMB
rla ;SS
control_nospace
rra ;SS
rra ;M
jr c,$+4
res 1,c ;M = RMB
;control_imer_buttons=$+1
;ld a,0
pop af ;mouse buttons
or 0xf8;%11111000
and c
;a=%1lrduMRL
ld (mousebuttons),a
control_curspeed=$+1
ld de,0
control_curspeedtime=$+1
ld c,0
call isfirechanged
;and 7;%00000111 ;кнопки огня
ld a,(mousebuttons)
cpl
rra
rra
rra
jr nz,control_slower ;клик или анклик тормозит стрелку
and 0x0f;%00001111 ;кнопки движения
jr nz,control_noslower ;движемся, не тормозим
ld d,a ;0
ld e,a ;0
ld c,a ;0 ;speedtime
control_slower
push af
ld a,128
cp d
jr nc,$+3
inc d
sra d ;dy
cp e
jr nc,$+3
inc e
sra e ;dx
pop af
control_noslower
rra
jr nc,$+3
dec d ;dy
rra
jr nc,$+3
inc d ;dy
rra
jr nc,$+3
inc e ;dx
rra
jr nc,$+3
dec e ;dx
ld (control_curspeed),de
ld a,d
call div4signedup
ld d,a
ld a,e
call div4signedup
ld e,a
or d
jr z,$+3 ;скорость равна нулю, сбрасываем speedtime
ld a,c ;speedtime
inc a
jr nz,$+3
dec a
ld (control_curspeedtime),a
;1=скорость равна нулю
;2=только что нажали клавишу движения
dec a
jr z,control_keymoveq
cp 3 ;игнорируем третий фрейм удержания клавиши для точного позиционирования одиночным нажатием клавиши
jr nz,control_keymoveok
control_keymoveq
control_imer_mousecoordsdelta=$+1
ld de,0
;e=dx
;d=dy
control_keymoveok
ld a,d ;dy
or a
arry=$+1
ld l,100
jp p,control_yadd
add a,l
jr c,control_yaddq
xor a ;min
jr control_yaddq
control_yadd
add a,256-scrhgt
add a,l
jr nc,$+3
sbc a,a ;max
sub 256-scrhgt
control_yaddq
ld (arry),a
;e=dx
ld a,e
rla
sbc a,a
ld d,a ;de=dx
arrx=$+1
ld hl,160
add hl,de
ld de,scrwid
xor a
sbc hl,de
add hl,de
jr c,control_xaddq
;bit 7,h
ld h,a
ld l,a
;jr nz,control_xaddq
jp m,control_xaddq
ld hl,scrwid-1
control_xaddq
ld (arrx),hl
call isfirechanged
ret nz
ld a,(arry)
oldarry=$+1
cp 0
ret nz
oldarrx=$+1
ld de,0
;or a
sbc hl,de
ret nz
ld a,(key)
cp NOKEY
ret
;nz=что-то изменилось
isfirechanged
ld a,(mousebuttons)
oldmousebuttons=$+1
xor 0
ret
;a=старые кнопки XOR новые
;nz=что-то изменилось
;keymatrix
;ds 8
;cur_cs_halfrow
; db 0
;oldtimer
; dw 0
if 1==0
waitsomething
mainloop_nothing
;в это время стрелка видна
YIELD ;halt
call control
jr z,mainloop_nothing
ret
endif