Właśnie,,, są jakieś ?
Jak odczytać/zapisać bajt z dowolnego adresu w PureC ? Takie PEEK/POKE z GFA :)

Było miło :) Do widzenia.

2

W C to się generalnie adresy odczytuje... ((int*)(adres))[0] albo inne w tym stylu nie działa?

Pamięć studenta ma charakter kwantowy - student wie wszystko, ale jednocześnie nic nie pamięta.
- Kilka(naście?) pudełek z klawiszami i światełkami. I jeden Vectrex, żeby nimi wszystkimi rządzić.

3

    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
Lynx I / Mega ST 1 / 7800 / Portfolio / Lynx II / Jaguar / TT030 / Mega STe / 800 XL / 1040 STe / Falcon030 / 65 XE / 520 STm / SM124 / SC1435
DDD HDD / AT Speed C16 / TF536 / SDrive / PAK68/3 / Lynx Multi Card / LDW Super 2000 / XCA12 / SkunkBoard / CosmosEx / SatanDisk / UltraSatan / USB Floppy Drive Emulator / Eiffel / SIO2PC / Crazy Dots / PAM Net
http://260ste.atari.org

4

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 ?

Było miło :) Do widzenia.

5

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
https://www.youtube.com/watch?v=jofNR_WkoCE
artik-wroc napisał/a:

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".

Atari: FireBee, (Falcon030 CT60e SuperVidel SvEthlana CTPCI), TT, (520ST Pak030 Frak PuPla Panther), (520ST 4MB ST RAM 8MB TT RAM CosmosEx SC1435), (1040STFM UltraSatan SM124), (1040STE 4MB ST RAM 8MB TT RAM CosmosEx NetUSBee SM144 SC1224), 260ST, 520 ST+, (MEGA ST SM125), (65XE Rapidus U1MB VBXE SIDE2 SIO2PC), (Jaguar SkunkBoard), Lynx II, 2x Portfolio

7 Ostatnio edytowany przez artik-wroc (2021-11-01 11:33:29)

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.

Było miło :) Do widzenia.

8

https://stackoverflow.com/questions/115 … lliseconds

Fox napisał/a:
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.

Zawsze mam rację, tylko nikt mnie nie słucha.

9 Ostatnio edytowany przez artik-wroc (2021-11-01 13:56:55)

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.

Było miło :) Do widzenia.

Najprawdopodobniej będzie to podpięte pod systemowy zegar 200Hz, wiec taka będzie rozdzielczość.

Atari: FireBee, (Falcon030 CT60e SuperVidel SvEthlana CTPCI), TT, (520ST Pak030 Frak PuPla Panther), (520ST 4MB ST RAM 8MB TT RAM CosmosEx SC1435), (1040STFM UltraSatan SM124), (1040STE 4MB ST RAM 8MB TT RAM CosmosEx NetUSBee SM144 SC1224), 260ST, 520 ST+, (MEGA ST SM125), (65XE Rapidus U1MB VBXE SIDE2 SIO2PC), (Jaguar SkunkBoard), Lynx II, 2x Portfolio

11 Ostatnio edytowany przez VLX (2021-11-01 19:57:08)

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 );

12 Ostatnio edytowany przez sqward (2021-11-02 12:35:04)

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;
}
What can be asserted without proof can be dismissed without proof.

13

@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ść.

Lynx I / Mega ST 1 / 7800 / Portfolio / Lynx II / Jaguar / TT030 / Mega STe / 800 XL / 1040 STe / Falcon030 / 65 XE / 520 STm / SM124 / SC1435
DDD HDD / AT Speed C16 / TF536 / SDrive / PAK68/3 / Lynx Multi Card / LDW Super 2000 / XCA12 / SkunkBoard / CosmosEx / SatanDisk / UltraSatan / USB Floppy Drive Emulator / Eiffel / SIO2PC / Crazy Dots / PAM Net
http://260ste.atari.org

14

VLX napisał/a:
#include <ext.h>
delay( ile_milisekund );

Faktycznie jest delay, choć dodałem i dalej mam komunikat "undefined...".

Było miło :) Do widzenia.