W Fuse wszystko działa. Natomiast jak testuję na realnym sprzęcie(Elwro 800 Jr, bez problemu radzi sobie z innymi grami i joystick działa) nie mogę poprawnie odczytać:
pętla zwalniająca - w trakcie której powinien nastąpić odczyt danych i przerwanie, jeśli następuje ruch postacią:
int petlazwalniajaca(long int n){
long int nk,nl;
int nb;
char klawsz;
nl=1;
/*
for(nk=0;nk<n;nk++)
{nb=nb*(nb+1);
//przerwanie petli zwalniającej w czasie ruchu gracza
if(joystick()!=0) return;
};
*/
for(nk=0;nk<n;nk++)
{
if(joystick()!=0) return;
//scanf("%c",klawsz);
// printf("c %c ",klawsz);
if(klawiatura()==5) printf("kursor w prawo");
};
}
Odczyt joysticka
int joystick(){
/*int k;
int n;
n=0; */
/*
while(1){k=joystickK();
if(k!=n)
{n=k;
printf(" %d ", k);
}}; */
// zwracamy wartości
// zwrotny 1 - przycisk - w Spectrum 16
// zwrotny 2 - góra - w Spectrum 8
// zwrotny 3 - lewo - w Spectrum 2
// zwrotny 4 - dół - w Spectrum 4
// zwrotny 5 - prawo - w Spectrum 1
if (joystickK()==16) return 1;
if (joystickK()==8) return 2;
if (joystickK()==2) return 3;
if (joystickK()==4) return 4;
if (joystickK()==1) return 5;
return 0;
}
Właściwa funkcja w asemblerze odczytująca port:
int __FASTCALL__ joystickK(unsigned p){
//sprawdza i zwraca wartość w 0x1f - interfejs joysticka od Atari - Kempston
#asm
// sprawdzenie 0x1f, dziesiętnie 31, jest to port więc korzystamy z in
ld a,$00
in a,(31)
//żeby zwrócić wartość trzeba ją umieścić w hl
//h może być 0 bo a ma mniejszą wartość
ld h,$00
//ld hl, a
ld l,a
ret
#endasm
}
Do kompilacji używam z88dk.