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

Było miło :) Do widzenia.

2

Odp: Odpowiedniki intelowskiego inportb i outportb

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

Odp: Odpowiedniki intelowskiego inportb i outportb

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

Odp: Odpowiedniki intelowskiego inportb i outportb

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

Odp: Odpowiedniki intelowskiego inportb i outportb

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

Odp: Odpowiedniki intelowskiego inportb i outportb

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

Odp: Odpowiedniki intelowskiego inportb i outportb

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 12:33:29)

Było miło :) Do widzenia.

8

Odp: Odpowiedniki intelowskiego inportb i outportb

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

Odp: Odpowiedniki intelowskiego inportb i outportb

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 14:56:55)

Było miło :) Do widzenia.

Odp: Odpowiedniki intelowskiego inportb i outportb

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

Odp: Odpowiedniki intelowskiego inportb i outportb

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 20:57:08)

12

Odp: Odpowiedniki intelowskiego inportb i outportb

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 13:35:04)

What can be asserted without proof can be dismissed without proof.

13

Odp: Odpowiedniki intelowskiego inportb i outportb

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

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

Odp: Odpowiedniki intelowskiego inportb i outportb

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.