Bo Ty epi chodziłeś do szkoły specjalnej :P.

1,652

(20 odpowiedzi, napisanych Programowanie - 8 bit)

Może inaczej.
AtariDOS skonstruowany jest tak, że wpis w katalogu zawiera wyłącznie rozmiar pliku (liczony w sektorach) oraz numer pierwszego sektora pliku. Każdy z sektorów pliku zawiera 125 lub 253 (zależnie od gęstości SD, DD) bajty danych i zawsze 3 bajty wskazujące nr kolejnego sektora pliku i ilość danych, które zostały wykorzystane w bieżącym sektorze. Chcąc poruszać się po takim pliku musisz odczytać wpis w katalogu (masz nr pierwszego sektora) i czytać po kolei sektory pliku (żeby się dowiedzieć jaki jest następny) - czyli stworzyć mapę pliku. Dopiero wtedy wiesz do którego sektora skoczyć kiedy potrzebujesz ustawić wskaźnik pliku w konkretnym miejscu. To samo kiedy chciałbyś się dowiedzieć ile bajtów zawiera plik - wpis w katalogu podaje tylko ilość zajmowanych sektorów na dysku więc musisz polecieć po wszystkich sektorach pliku i sumować ilości bajtów wykorzystanych w sektorze).
SpartaDOS skonstruowany jest tak, że wpis w katalogu zawiera ilość danych w pliku w bajtach i numer pierwszego sektora mapy pliku. Mapa pliku z kolei zawiera numery kolejnych sektorów w pliku. W sektorach pliku zapisywane są tylko dane (128/256 lub 512 bajtów zależnie od gęstości). Ustawienie wskaźnika w pliku polega więc na pobraniu wpisu w katalogu (więc masz pierwszy sektor mapy pliku), przeliczenia w którym sektorze mapy pliku znajduje się numer sektora pliku, który nas interesuje, odczytaniu n sektorów mapy pliku i pobrania numeru sektora pliku. Mapa pliku jest listą dwukierunkową więc możesz się po niej poruszać dowolnie (w AtariDOS linki w sektorach pliku prowadzą tylko do następnego sektora pliku - lista jednokierunkowa więc musisz złożyć sobie indeks w pamięci sam). Dzielenie przez 128/256/512 zdaje się jest też nieco szybsze niż dzielenie przez 125/253.
Jak łatwo sobie wyobrazić, dla gęstości DD w jednym sektorze mapy pliku będziesz miał informacje o (256-2-2)/2=126 sektorach pliku czyli bez doczytywania dodatkowych sektorów dysku dostaniesz się bez problemu do 32256 (7E00 hex) bajtów pliku. Jeśli plik jest dłuższy, to przeczytany zostanie kolejny sektor mapy pliku. Jeśli chcesz cofnąć się wstecz, przeczytany zostanie poprzedni sektor mapy pliku, itd.
Sparta buforuje dane celem oszczędzenia użytkownikowi zbędnych odczytów tak więc NOTE/POINT będą śmigać bardzo szybko.
Warto sobie wyobrazić co będzie się działo z AtariDOS-em i kolegami kiedy bez samodzielnego zrobienia indeksu (gdzie go trzymać: w pamięci? - szkoda miejsca; na dysku? - redundancja a przecież mamy tylko 180KB na DD, no 360 na DSDD) - czeka nas każdorazowy odczyt od początku pliku aż do miejsca w którym chcesz się ustawić. Sparta ma po prostu indeks pliku wbudowany w filesystem i nie będzie żądać od użytkownika żeby go samodzielnie robił. Wygodniej? :)

Edit: poprawka

1,653

(20 odpowiedzi, napisanych Programowanie - 8 bit)

W Sparcie (zarówno 3.2, jak i X) NOTE/POINT ustawia się dokładnie nad określonym bajtem w pliku - w DOS2.x trzeba dokonywać dodatkowych zabiegów (indeksowanie).

1,654

(20 odpowiedzi, napisanych Programowanie - 8 bit)

@xxl:

Instrukcje NOTE/POINT w AtariDOS wyglądają trochę jak projektowane na kolanie i nie do końca są przemyślane:
1. Żeby użyć NOTE/POINT musisz mieć otwarty plik.
2. Musisz wiedzieć ile bajtów zawiera sektor dysku a nie masz do tego żadnej funkcji w D:.
3. Numer sektora to numer sektora nie w pliku, ale NA DYSKU.
4. Jeśli wskazany sektor NA DYSKU nie należy do otwartego pliku dostajesz błąd 164: INTERNAL FILE # MISMATCH.
5. Zapisując dane do linku w sektorze możesz uszkodzić strukturę pliku.

TELL/SEEK:
1. Operują zawsze na PLIKU co jest logiczne, bo w końcu przed użyciem NOTE/POINT w BASIC-u musisz otworzyć plik.
2. Nie musisz znać szczegółowych danych nośnika bo jest ci do do niczego nie potrzebne (i nie powinno być).
3. Nie masz możliwości uszkodzenia struktury pliku, bo nie piszesz do sektorze, ale po pliku - DOS sam załatwia za ciebie ustawianie wskaźnika w pliku.

Takie to różnice.
Wygląda na to, że żeby poprawnie obsługiwać NOTE/POINT i pisać w jakieś miejsce w pliku w AtariDOS należy:
1. Otworzyć plik.
2. Czytać i ignorować bloki danych aż do osiągnięcia miejsc, które Cię w pliku interesują.
3. Znajdując się w każdym punkcie, którym jesteś zainteresowany wykonać NOTE i zachować wskazania eby móc się potem ustawić poprawnie w pliku za pomocą funkcji POINT.
Więc musisz przed wykonaniem czegokolwiek przelecieć część/cały plik celem uzyskania wskaźników. W przypadku TELL/SEEK nie trzeba tego robić; co więcej - jeśli znajdziesz się poza plikiem DOS sam go rozszerzy (Sparta - nie wiem jak to jest w MyDOS-ie).

1,655

(11 odpowiedzi, napisanych Fabryka - 8bit)

Hahah. Draco może zgarnąć wszystkie nagrody w konkursach Sikora :) Szykuj Sikor kasiorę! (100zł jeśli dobrze widzę) i Megę STE :)

1,656

(0 odpowiedzi, napisanych Fabryka - 8bit)

Edytor logosów w GR.0 również doczekał się swojej przeglądarki.

Wymagania:
- SDX,
- ANTIC+GTIA.
Program w obecności sterowników VBXEFXS lub S_VBXE potrafi wyłączyć ekran VBXE na czas wyświetlania obrazka.

Pod linkiem dostępne archiwa .zip, .arc, .atr, .atr.bz2.

1,657

(0 odpowiedzi, napisanych Fabryka - 8bit)

Popełniłem kiedyś program graficzny do malowania w hiresie. Formatem wyjściowym jest .GHG i do tego właśnie prezentuję przeglądarkę.

Wymagania:
- SDX,
- ANTIC + GTIA.
Program współpracuje z VBXE w takim sensie, że blokuje jego ekran kiedy pokazuje obrazek, ale robi to przy użyciu cienii (VBXEFXS lub S_VBXE).

Smacznego.

Pod linkiem dostępne są archiwa .zip, .arc, .atr, .atr.bz2.

1,658

(3 odpowiedzi, napisanych Fabryka - 8bit)

Gdyby ktoś chciał obejrzeć sobie obrazki z ZX Spectrum na VBXE, to jest do tego przeglądarka.
Featury:
- obsługa standardowych obrazków .SCR (o rozmiarze 6912 bajtów),
- obsługa obrazków zgranych do .TAP za pomocą SAVE "file" SCREEN$,
- /T [min:]sec[.dec] pokazuje obrazek przez żądany czas.
Wymaga VBXE, SDX 4.47 i VBXEFXS lub S_VBXE.
Smacznego.
Bugi i żądania standardowo do mnie proszę.

Pod linkiem standardowo dostępne .zip, .arc, .atr, .atr.bz2.

1,659

(23 odpowiedzi, napisanych Fabryka - 8bit)

Wersja 0.5 dostosowana do poprawnej obsługi cienii VBXE.
Poprawki:
- bugfix dla rdzeni RAMBO,
- obsługa nagłówków Windows 2.x, 3.x, 3.x NT, 4.x 95.

1,660

(14 odpowiedzi, napisanych Fabryka - 8bit)

Zaktualizowana wersja używająca VBXEFXS lub S_VBXE.

1,661

(61 odpowiedzi, napisanych Fabryka - 8bit)

Ok. Jutro zaktualizuję wszystkie zależne projekty i będzie info w odpowiednich wątkach.

1,662

(20 odpowiedzi, napisanych Programowanie - 8 bit)

Dokładnie tak jest jak mówisz. W SDX ponadto możesz ustawić wskaźnik poza obecnym rozmiarem pliku - wtedy rozmiar pliku zostanie rozszerzony a wartości od końca pliku do miejsca wypełnione zerami. Nie spowoduje to rezerwacji sektorów ani żadnych zapisów na dysku (prócz wpisu w katalogu), dopiero kiedy zechcesz zapisać w takiej "dziurze" jakieś dane zaalokowany zostanie sektor i przypisany do pliku w odpowiednim miejscu.
Ale to dygresja.
Generalnie różnica między AtariDOS a Sparta polega na tym, że NOTE/POINT w AtariDOS działają na dysku, a w Sparcie działają na pliku. Tak więc NOTE w Sparcie zwróci 3-bajtowy numer bajtu w pliku i analogicznie POINT ustawi wskaźnik odczytu/zapisu danych w pliku (stąd nazwy funkcji - TELL/SEEK bo bliżej im do tych Unix-owych niż AtariDOS-owych).

1,663

(61 odpowiedzi, napisanych Fabryka - 8bit)

Prawda to jest. Programy są do ściągnięcia z mojej strony (albo z odpowiednich wątków - pliki bez wersji są zawsze ostatnimi releasami).

1,664

(61 odpowiedzi, napisanych Fabryka - 8bit)

Hahahaha. Niemożliwe! :)
Cieszę się :)

1,665

(17 odpowiedzi, napisanych Software, Gry - 8bit)

Działa. Używałem do pakowania niektórych swoich starych rzeczy i miałem archiwum na dyskietce :) Cały internet!

1,666

(17 odpowiedzi, napisanych Software, Gry - 8bit)

Może LZW packer by Mathnoid opisywany w TA 8/93: http://tajemnice.atari8.info/8_93/8_93_lzw.html

1,667

(226 odpowiedzi, napisanych Bałagan)

Amplitudy ale też i częstotliwości. (Przepraszam - edytowałem poprzedni post)

1,668

(226 odpowiedzi, napisanych Bałagan)

A nie o DACe mi chodzi - chodzi mi o syntezę FM.

Edit: A konkretnie o modulacje: http://amigadev.elowar.com/read/ADCD_2. ... e0012.html (nie wiem czemu zawsze myślałem, że Paula ma w sobie kawałek syntezatora FM). Czy te możliwości były dostępne w jakimkolwiek oprogramowaniu na A=?

1,669

(226 odpowiedzi, napisanych Bałagan)

A czy ktoś przyglądał się może możliwościom syntezy dźwięku przez Paulę? Mam mgliste wrażenie, że blisko jej do SID-a...

1,670

(226 odpowiedzi, napisanych Bałagan)

W Atari nie ma alta i A= :) Lepszy do porównań wizualnych byłby model 1200XL.

1,671

(20 odpowiedzi, napisanych Programowanie - 8 bit)

Jest jeszcze Atariki: TELL i SEEK.

1,672

(20 odpowiedzi, napisanych Programowanie - 8 bit)

Oczywiście. Polecam SDX manual rozdziały "6.3.6: Set File Position - POINT" s. 150 oraz "6.3.7: Get Current File Position - NOTE" s. 152.

1,673

(11 odpowiedzi, napisanych Fabryka - 8bit)

drac030 napisał/a:
mono napisał/a:

upraszcza to w niektórych sytuacjach sposób adresowania choć marnują się cenne komórki RAM

Upraszcza nawet znacznie: można zapisać cień i odpowiedni rejestr sprzętowy przy użyciu tego samego podprogramu.

Prawda. Można też np.

  icl 'vbxefx.icl'

VBXEBASE smb 'VBXEBASE'
VBXEFXS smb 'VBXEFXS'

  lda VBXEBASE+COLDETECT
  ...
  ...
  sta VBXEFXS+VIDEO_CONTROL
  sta VBXEBASE+VIDEO_CONTROL

lub też

  icl 'vbxefx.icl'

VBXEBASE smb 'VBXEBASE'
VBXEFXS smb 'VBXEFXS'

  org $80
vbxead .ds 2
fxsad .ds 2

vbxebase .word VBXEBASE
vbxefxs .word VBXEFXS

  ldx vbxebase
  ldy vbxebase+1
  stx vbxead
  sty vbxead+1
  ldx vbxefxs
  ldy vbxefxs+1
  stx fxsad
  sty fxsad+1
  ...
  ldy #COLDETECT
  lda (vbxead),y
  ...
  ...
  ldy #VIDEO_CONTROL
  sta (fxsad),y
  sta (vbxead),y

1,674

(11 odpowiedzi, napisanych Fabryka - 8bit)

Drac030 w wątku obok wspomniał o FXS. Opiszę może ocb i po co to wszystko.

Większość rejestrów VBXE to rejestry dostępne tylko do zapisu. Ich wadą jest to, że nie ma żadnej możliwości odczytu wartości z takiego rejestru (np. VIDEO_CONTROL=$D640 lub XDL_ADR=$D641..3). Często pod jednym adresem znajdują się tak naprawdę dwa rejestry sprzętowe - jeden tylko do zapisu (np. IRQ_CONTROL=$D654) i jeden tylko do odczytu (IRQ_STATUS=$D654).
W oryginalnym hardwarze Atari sytuacja jest identyczna i poradzono sobie z problemem w ten sposób, że wprowadzono tzw. rejestry-cienie (ang. shadow registers) - przykładowo IRQEN=$D20E ma swój cień w IRQENS=$10. Zasada jest taka, że chcąc zapisać coś do rejestru sprzętowego programista jest zobowiązany do zapisu również rejestru-cienia, tak więc chcąc odblokować przerwanie TIMER1 POKEY-a robimy:

  lda #%00000001
  ora IRQENS  ;$10
  sta IRQENS  ;$10
  sta IRQEN   ;$D20E

Dzięki temu pozostałe elementy systemu (np. procedura detekcji źródła IRQ) wiedzą co w rejestrze IRQEN zostało faktycznie ustawione. Analogicznie np. w ANTIC-u DLPTR=$D402..3 ma swój cień w DLPTRS=$230..1, DMACTL=$D400 ma cień w DMACTLS=$22F, w GTIA GTIACTL=$D01B ma cień w GTIACTLS=$26F, itd. Niestety nie wszystkie rejestry w hardwarze mają swoje odpowiedniki i dotkliwie można to odczuć np. na NMIEN=$D40E, czy większości rejestrów GTIA.

Oczywiście jeśli pisze się program przejmujący kontrolę nad światem problem jest marginalny i w razie potrzeby taki cień można sobie samemu w kodzie zorganizować, ale jeśli chciałoby się napisać jakiś programik rozszerzający możliwości OS-a, zainstalować TSR-a w systemie i wrócić do shella, wtedy niestety krótkowzroczność projektantów systemu daje popalić.

Zrobiłem więc sterownik dla SDX, który wydziela 40-bajtowy obszar w pamięci RAM przeznaczony właśnie na cienie dla rejestrów VBXE. Obszar ten dostępny jest przez symbol VBXEFXS i wygląda tak:

OFFSET NAZWA           TYP    OPIS
$00:   VIDEO_CONTROL   byte : kontrola video
$01:   XDL_ADR         long : adres listy wyświetlania
$04:   CSEL            byte : wybór koloru w palecie
$05:   PSEL            byte : wybór palety
$06:   CR              byte : składowa R
$07:   CG              byte : składowa G
$08:   CB              byte : składowa B
$09:   COLMASK         byte : maska dla kolizji
$0A:   COLCLR          byte : reset kolizji
$0B:   -               byte : zarezerwowane
$0C:   -               byte : zarezerwowane
$0D:   -               byte : zarezerwowane
$0E:   -               byte : zarezerwowane
$0F:   -               byte : zarezerwowane
$10:   BL_ADR          long : adres programu blittera
$13:   BLITTER_START   byte : start blittera
$14:   IRQ_CONTROL     byte : kontrola przerwań IRQ
$15:   P0              byte : priorytet overlay/playfield 0
$16:   P1              byte : priorytet overlay/playfield 1
$17:   P2              byte : priorytet overlay/playfield 2
$18:   P3              byte : priorytet overlay/playfield 3
$19:   -               byte : zarezerwowane
$1A:   -               byte : zarezerwowane
$1B:   -               byte : zarezerwowane
$1C:   -               byte : zarezerwowane
$1D:   MEMAC_B_CONTROL byte : kontrola okna MEMACB
$1E:   MEMAC_CONTROL   byte : kontrola okna MEMACA
$1F:   MEMAC_BANK_SEL  byte : wybór banku MEMACA
$20:   VBLIT           word : wektor przerwania blittera
$22:   VMEMLO          long : pierwszy dostępny adres VRAM
$25:   VMEMHI          long : ostatni dostępny adres VRAM

Oznaczenia:
- byte - 1 bajt
- word - 2 bajty
- long - 3 bajty

32 pierwsze bajty to cienie dla sprzętu (dla wygody offsety cieni są identyczne, jak rejestrów sprzętowych - upraszcza to w niektórych sytuacjach sposób adresowania choć marnują się cenne komórki RAM), prócz tego dodatkowo zdefiniowane są:
- VBLIT - wektor obsługi przerwania od blittera VBXE. Procedura detekcji włączona jest w ciąg obsługi przerwań IRQ na najwyższym priorytecie (ograniczenie OS-a) i testuje IRQ_STATUS bazując na ustawieniu cienia IRQ_CONTROL, potwierdza jego przyjęcie po czym przekazuje sterowanie do procedury obsługi użytkownika wektoryzowanej przez VBLIT. Procedura użytkownika powinna na końcu wykonać PLA, RTI (jak większość innych przerwań IRQ).
- VMEMLO - wskazuje najmniejszy dostępny wolny adres VRAM,
- VMEMHI - wskazuje największy dostępny wolny adres VRAM. Jej początkowa wartość zależy od tego jaki rdzeń mamy włączony - z emulacją RAMBO czy bez.

Z tego właśnie sterownika (w starszej wersji) korzysta np. Tomek-8 demo dla VBXE.

Wymaganiem do działania FXS jest obecność w systemie symbolu VBXEBASE, który jest instalowany przez sterownik VBXE.SYS. Podejmuje on detekcję karty VBXE, wyświetla informacje o rdzeniu, wersji i obecności emulowanego rozszerzenia RAMBO i zostawia w pamięci tylko symbol VBXEBASE wskazujący na adres rejestrów sprzętowych karty (czyli $D640 lub $D740).
Dzięki temu programy pisane dla SDX mogą po prostu odwoływać się do żądanych zasobów za pośrednictwem symboli

  icl 'vbxefx.icl'

VBXEBASE smb 'VBXEBASE'

  lda VBXEBASE+COLDETECT
  ...
  ...
  sta VBXEBASE+VIDEO_CONTROL

lub też

  icl 'vbxefx.icl'

VBXEBASE smb 'VBXEBASE'

  org $80
vbxead .ds 2

vbxebase .word VBXEBASE

  ldx vbxebase
  ldy vbxebase+1
  stx vbxead
  sty vbxead+1
  ...
  ldy #COLDETECT
  lda (vbxead),y
  ...
  ...
  ldy #VIDEO_CONTROL
  sta (vbxead),y

i nie muszą bawić się w samodzielną detekcję - w CONFIG.SYS należy tylko załadować odpowiednie drivery:

DEVICE VBXE
DEVICE VBXEFXS

i Wioletta. Analogicznie rzecz się ma z rejestrami-cieniami (odpowiedni .icl w załączniku).

UWAGA! Załadowanie sterownika S2: czyli S_VBXE.SYS powoduje, że nie jest wymagane ładowanie dwóch poprzednich (VBXE.SYS, VBXEFXS.SYS), bo odpowiednia funkcjonalność została tam przez Drac030 zaimplementowana.
Dodatkową zaletą jest również to, że S2: prócz wielu funkcji jak zarządzanie paletami kolorów, obsługa dodatkowych trybów graficznych i tekstowych czy operacje rysowania punktu, linii i okręgu posiada również mechanizmy zarządzania pamięcią VRAM dzięki czemu wskaźniki VMEMLO i VMEMHI będą wskazywać zawsze aktualny stan (sam VBXEFXS.SYS takich mechanizmów nie zawiera więc tylko inicjalizuje odpowiednio wskaźniki podczas procedury RESET).

Opisane sterowniki będą włączone do następnej dystrybucji SDX (4.47).
Gdyby ktoś chciał się pobawić cieniami załączam sterowniki, manuale i pliki do zainkludowania do madsa.

1,675

(61 odpowiedzi, napisanych Fabryka - 8bit)

Tak. Wersja 1.10 jest dostępna do ściągnięcia. Usunąłem support dla _RAWCON, bo support dla FXS jest w zupełności wystarczający do poprawnego działania z VBXE. Wieszać się już nie powinno.

Ponadto ponowne załadowanie plemnika umożliwia wyświetlenie aktualnie ustawionego czasu, po którym plemnik się uaktywnia, a dodatkowe podanie parametru "/D sec" pozwala zmienić ten czas w już zainstalowanym wygaszaczu.

Dzięki Draco!

Edit: Zapomniałem - plemnik nabrał nieco wyrazu, bo wykorzystałem tryb 15 ANTIC-a (8 OS) z włączonym GTIA i VSCROLL (dzięki czemu zrobił się tryb o rozmiarze piksela 4x9). Przedtem wykorzystany był tryb 13 ANTIC-a (7 OS) co powodowało, że jasności były nieco przyciemnione (taki defekt na linii ANTIC-GTIA). Poza tym gad łazi teraz po szerokim ekranie.