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ć.
Czwarta edycja ATASCII Compo! Dziś, 1 października 2024, oficjalnie rozpoczął się okres nadsyłania prac!
Silly Venture 2024 SE - stuff Dostępny jest już stuff z zeszłomiesięcznego party Silly Venture 2024
FujiCup FujiCup ma na celu wspieranie sceny gier retro, dając uczestnikom szansę na pokazanie swojego talentu
Echa Silly Venture 2024 SE Są już dostępne wyniki Silly Venture 2024 SE
Uaktualnienie firmware do The400 Poprawki do "fizycznego" emulatora ośmiobitowych komputerów i konsol Atari.
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.076 sekund, wykonano 14 zapytań ]