A tu jeszcze jedno o co pytałeś - na szybko zmontowany kursor graficzny.
Kod jest taki sobie, ale działa.
Procedura na starcie czyta współrzędne strzałki z 23296 (x) i 23297 (y) (nie będzie więc działać w trybie 128 - tam trzeba gdzieś przenieść zmienne). Po wywołaniu wyświetla strzałkę, której bitmapa znajduje się na końcu kodu (16x16 pikseli przesunięte 8 razy - każda klatka ma 48 bajtów) nakładając (bez maskowania, choć to powinno się dać dość łatwo dorobić) na istniejący obraz ale bez ruszania atrybutów. Następnie czeka na klawisze - obsługa przesuwania to procedura move_arrow - ją trzeba by zmodyfikować, żeby zmienić sterowanie - teraz jest QAOP. Strzałka jest przesuwana z buforowaniem - nie psuje zawartości ekranu. Po wciśnięciu spacji albo 1 (obsługa tego jest już w głównej pętli i tam trzeba zmieniać obsługę) strzałka jest kasowana i procedura wraca do BASICa zostawiając w 23296 i 23297 współrzędne a dodatkowo w 23298 jest 1 jeśli wciśnięto spację lub 0 jeśli wciśnięto 1 (rozróżnienie select/cancel).
Na podstawie współrzędnych można wykonać jakieś działanie a potem wywołać procedurę jeszcze raz, co przywróci strzałkę w to samo miejsce i pozwoli na dalszy wybór.
Żeby sobie uprościć pisanie strzałka nie dochodzi całkiem do lewego brzegu - maksymalna zwracana współrzędna to 238x190.
Kod oczywiście jak zwykle dla pasmo.
org 32768
ld a,(23296)
ld (pos_x),a
ld a,(23297)
ld (pos_y),a
call buffer_it
main_loop:
halt
call restore_it
call move_arrow
call buffer_it
call put_arrow
ld e,0
ld bc,$f7fe
in a,(c)
and 1
jr z,exit_loop
ld e,1
ld bc,$7ffe
in a,(c)
and 1
jr nz,main_loop
exit_loop:
push de
call restore_it
pop de
ld a,(pos_x)
ld (23296),a
ld a,(pos_y)
ld (23297),a
ld a,e
ld (23298),a
ret
buffer_it:
ld a,(pos_x)
ld c,a
ld a,(pos_y)
ld b,a
call pixel_address
ld de,buf
ld b,16
ld a,(pos_y)
cp 175
jr c,buffer_it1
ld b,a
ld a,192
sub b
ld b,a
buffer_it1:
push hl
ld a,(hl)
ld (de),a
inc l
inc de
ld a,(hl)
ld (de),a
inc l
inc de
ld a,(hl)
ld (de),a
inc de
pop hl
call next_hl
djnz buffer_it1
ret
restore_it:
ld a,(pos_x)
ld c,a
ld a,(pos_y)
ld b,a
call pixel_address
ld de,buf
ld b,16
ld a,(pos_y)
cp 175
jr c,restore_it1
ld b,a
ld a,192
sub b
ld b,a
restore_it1:
push hl
ld a,(de)
ld (hl),a
inc l
inc de
ld a,(de)
ld (hl),a
inc l
inc de
ld a,(de)
ld (hl),a
inc de
pop hl
call next_hl
djnz restore_it1
ret
put_arrow:
ld a,(pos_x)
ld c,a
ld a,(pos_y)
ld b,a
call pixel_address
push hl
ld h,0
ld l,a
add hl,hl
add hl,hl
add hl,hl
add hl,hl
push hl
pop de
add hl,hl
add hl,de
ld de,arrow
add hl,de
pop de
ex de,hl
ld b,16
ld a,(pos_y)
cp 175
jr c,put_arrow1
ld b,a
ld a,192
sub b
ld b,a
put_arrow1:
push hl
ld a,(de)
or (hl)
ld (hl),a
inc l
inc de
ld a,(de)
or (hl)
ld (hl),a
inc l
inc de
ld a,(de)
or (hl)
ld (hl),a
inc l
inc de
pop hl
call next_hl
djnz put_arrow1
ret
next_hl:
inc h
ld a,h
and 7
jp nz,next_hl_skip
ld a,l
add a,32
ld l,a
jp c,next_hl_skip
ld a,h
sub 8
ld h,a
next_hl_skip:
ret
pixel_address:
ld a,b
and a
rra
scf
rra
and a
rra
xor b
and $f8
xor b
ld h,a
ld a,c
rlca
rlca
rlca
xor b
and $c7
xor b
rlca
rlca
ld l,a
ld a,c
and 7
ret
move_arrow:
; O/P
ld bc,$dffe
in a,(c)
ld e,0
bit 0,a
jr nz,move_arrow1
ld e,1
move_arrow1:
bit 1,a
jr nz,move_arrow2
ld e,-1
move_arrow2:
ld d,0
; Q
ld bc,$fbfe
in a,(c)
and 1
jr nz,move_arrow3
ld d,-1
move_arrow3:
; A
ld bc,$fdfe
in a,(c)
and 1
jr nz,move_arrow4
ld d,1
move_arrow4:
ld a,(pos_x)
add a,e
cp 239
jr nc,move_arrow5
ld (pos_x),a
move_arrow5:
ld a,(pos_y)
add a,d
cp 191
ret nc
ld (pos_y),a
ret
pos_x: db 0
pos_y: db 191
buf: ds 48
arrow:
db %00000000, %00000000, %00000000
db %01111111, %10000000, %00000000
db %01111111, %00000000, %00000000
db %01111110, %00000000, %00000000
db %01111100, %00000000, %00000000
db %01110100, %00000000, %00000000
db %01100010, %00000000, %00000000
db %01000001, %00000000, %00000000
db %00000000, %10000000, %00000000
db %00000000, %01000000, %00000000
db %00000000, %00100000, %00000000
db %00000000, %00010000, %00000000
db %00000000, %00001000, %00000000
db %00000000, %00000100, %00000000
db %00000000, %00000010, %00000000
db %00000000, %00000000, %00000000
db %00000000, %00000000, %00000000
db %00111111, %11000000, %00000000
db %00111111, %10000000, %00000000
db %00111111, %00000000, %00000000
db %00111110, %00000000, %00000000
db %00111010, %00000000, %00000000
db %00110001, %00000000, %00000000
db %00100000, %10000000, %00000000
db %00000000, %01000000, %00000000
db %00000000, %00100000, %00000000
db %00000000, %00010000, %00000000
db %00000000, %00001000, %00000000
db %00000000, %00000100, %00000000
db %00000000, %00000010, %00000000
db %00000000, %00000001, %00000000
db %00000000, %00000000, %00000000
db %00000000, %00000000, %00000000
db %00011111, %11100000, %00000000
db %00011111, %11000000, %00000000
db %00011111, %10000000, %00000000
db %00011111, %00000000, %00000000
db %00011101, %00000000, %00000000
db %00011000, %10000000, %00000000
db %00010000, %01000000, %00000000
db %00000000, %00100000, %00000000
db %00000000, %00010000, %00000000
db %00000000, %00001000, %00000000
db %00000000, %00000100, %00000000
db %00000000, %00000010, %00000000
db %00000000, %00000001, %00000000
db %00000000, %00000000, %10000000
db %00000000, %00000000, %00000000
db %00000000, %00000000, %00000000
db %00001111, %11110000, %00000000
db %00001111, %11100000, %00000000
db %00001111, %11000000, %00000000
db %00001111, %10000000, %00000000
db %00001110, %10000000, %00000000
db %00001100, %01000000, %00000000
db %00001000, %00100000, %00000000
db %00000000, %00010000, %00000000
db %00000000, %00001000, %00000000
db %00000000, %00000100, %00000000
db %00000000, %00000010, %00000000
db %00000000, %00000001, %00000000
db %00000000, %00000000, %10000000
db %00000000, %00000000, %01000000
db %00000000, %00000000, %00000000
db %00000000, %00000000, %00000000
db %00000111, %11111000, %00000000
db %00000111, %11110000, %00000000
db %00000111, %11100000, %00000000
db %00000111, %11000000, %00000000
db %00000111, %01000000, %00000000
db %00000110, %00100000, %00000000
db %00000100, %00010000, %00000000
db %00000000, %00001000, %00000000
db %00000000, %00000100, %00000000
db %00000000, %00000010, %00000000
db %00000000, %00000001, %00000000
db %00000000, %00000000, %10000000
db %00000000, %00000000, %01000000
db %00000000, %00000000, %00100000
db %00000000, %00000000, %00000000
db %00000000, %00000000, %00000000
db %00000011, %11111100, %00000000
db %00000011, %11111000, %00000000
db %00000011, %11110000, %00000000
db %00000011, %11100000, %00000000
db %00000011, %10100000, %00000000
db %00000011, %00010000, %00000000
db %00000010, %00001000, %00000000
db %00000000, %00000100, %00000000
db %00000000, %00000010, %00000000
db %00000000, %00000001, %00000000
db %00000000, %00000000, %10000000
db %00000000, %00000000, %01000000
db %00000000, %00000000, %00100000
db %00000000, %00000000, %00010000
db %00000000, %00000000, %00000000
db %00000000, %00000000, %00000000
db %00000001, %11111110, %00000000
db %00000001, %11111100, %00000000
db %00000001, %11111000, %00000000
db %00000001, %11110000, %00000000
db %00000001, %11010000, %00000000
db %00000001, %10001000, %00000000
db %00000001, %00000100, %00000000
db %00000000, %00000010, %00000000
db %00000000, %00000001, %00000000
db %00000000, %00000000, %10000000
db %00000000, %00000000, %01000000
db %00000000, %00000000, %00100000
db %00000000, %00000000, %00010000
db %00000000, %00000000, %00001000
db %00000000, %00000000, %00000000
db %00000000, %00000000, %00000000
db %00000000, %11111111, %00000000
db %00000000, %11111110, %00000000
db %00000000, %11111100, %00000000
db %00000000, %11111000, %00000000
db %00000000, %11101000, %00000000
db %00000000, %11000100, %00000000
db %00000000, %10000010, %00000000
db %00000000, %00000001, %00000000
db %00000000, %00000000, %10000000
db %00000000, %00000000, %01000000
db %00000000, %00000000, %00100000
db %00000000, %00000000, %00010000
db %00000000, %00000000, %00001000
db %00000000, %00000000, %00000100
db %00000000, %00000000, %00000000
end 32768