Temat: Odpowiedniki intelowskiego inportb i outportb
Właśnie,,, są jakieś ?
Jak odczytać/zapisać bajt z dowolnego adresu w PureC ? Takie PEEK/POKE z GFA :)
Nie jesteś zalogowany. Proszę się zalogować lub zarejestrować.
Tenebra na Atari ST/STE Wersja gry na duże atari.
Wyniki FujiCup 2023 Wyniki konkursu FujiCup na najlepszą grę dla 8-bit Atari w 2023 roku zostały ogłoszone!
TONY na małe Atari Nowa gra na małe Atari, w Hiresie, produkcja Rafała Dudka (brat XXL-a), Popmilo i Caruso.
Cosmic Hero 2 Bohater ratujący Ziemię w kryzysowej sytuacji powraca po 30 latach.
VI. Basque Tournament of Atari 2600 Kolejna relacja, wśród otrzymywanych od naszego przyjaciela Egoitza z Kraju Basków.
Strony 1
Zaloguj się lub zarejestruj by napisać odpowiedź
Właśnie,,, są jakieś ?
Jak odczytać/zapisać bajt z dowolnego adresu w PureC ? Takie PEEK/POKE z GFA :)
W C to się generalnie adresy odczytuje... ((int*)(adres))[0] albo inne w tym stylu nie działa?
volatile WORD *KolorRamki = (WORD *) 0xffff8240;
*KolorRamki = 0;
volatile UBYTE *STELowByte = (UBYTE *) 0xffff820d;
*STELowByte = 0;
lub
#define SHIFTER_Video_Res *(volatile UBYTE*)0xffff8260
SHIFTER_Video_Res = 0x02; // ST-HIGH
A co gdy muszę sprawdzić czy adres jest większy/mniejszy od innego, lub muszę zwiększyć adres (nie wartość pod adresem) o np. 0x100 ?
if (adres1 > adres2)
Adresy są nazywane w C wskaźnikami, np.
char *p = ...
p += 0x100; // zwiększ adres
*p += 5; // zwiększ bajt pod adresem p
A co gdy muszę sprawdzić czy adres jest większy/mniejszy od innego, lub muszę zwiększyć adres (nie wartość pod adresem) o np. 0x100 ?
Fox już napisał, ja dopiszę że w C to ma pewne nieoczywiste cechy, polecam wygulgać temat "arytmetyka wskaźników".
Dzięki, Chyba się już w tym połapałem.
Jeszcze pytanko, czy jest jakiś odpowiednik dosowego DELAY ? Tak, aby opóźnić program o 1 milisek.
Ostatnio edytowany przez artik-wroc (2021-11-01 11:33:29)
https://stackoverflow.com/questions/115 … lliseconds
char *p = ... p += 0x100; // zwiększ adres *p += 5; // zwiększ bajt pod adresem p
Pamiętać należy, że wskaźnik zwiększany jest o wielokrotność pamięci zajmowanej przez dany typ. Inną wartość będzie miało P po zwiększeniu dla typu char a inną dla np. int.
SLEEP też nie ma :( Jedyne co znalazłem to evnt_timer, ale użycie ego jest dla mnie zbyt skomplikowane.
EDIT: Zrobiłem tak:
https://www.geeksforgeeks.org/time-delay-c/
choć nie wiem czy na Atari rozdzielczość też jest 1ms.
Ostatnio edytowany przez artik-wroc (2021-11-01 13:56:55)
Najprawdopodobniej będzie to podpięte pod systemowy zegar 200Hz, wiec taka będzie rozdzielczość.
Można wygodnie:
#include <ext.h>
delay( ile_milisekund );
albo niewygodnie:
#include <time.h>
clock_t start_time;
start_time = clock(); while (clock() < start_time + ile_milisekund );
sleep używałem w AHCC, ale czas podaje mu się w sekundach.
#include <ext.h>
sleep( ile_sekund );
Ostatnio edytowany przez VLX (2021-11-01 19:57:08)
Ja używam czegoś takiego. Dokładność do kilku mikrosekund. Wymagany tryb Supervisor.
uint64_t getMicroseconds()
{
uint64_t timer200hz;
uint32_t data;
resync:
timer200hz = *((volatile uint32_t*)0x4BA) ;
data = *((volatile uint8_t*)0xFFFFFA23);
if ( *((volatile uint32_t*)0x4BA) != timer200hz )
{
goto resync;
}
timer200hz*=5000; // convert to microseconds
timer200hz+=(uint64_t)(((192-data)*6666)>>8); //26; // convert data to microseconds
return timer200hz;
}
Ostatnio edytowany przez sqward (2021-11-02 12:35:04)
@sqward fajny pomysł z tym że licznik 0x4BA zmienia się 200 razy na sekundę, czyli co 5 milisekund.
Licznik TimerC 0xFFFFFA23 zmniejsza się o jeden 38 400 razy na sekundę, czyli sprawdzając tylko ten adres można mieć dużo większą dokładność.
#include <ext.h> delay( ile_milisekund );
Faktycznie jest delay, choć dodałem i dalej mam komunikat "undefined...".
Strony 1
Zaloguj się lub zarejestruj by napisać odpowiedź
[ Wygenerowano w 0.082 sekund, wykonano 12 zapytań ]