xBIOS jest w pełni relokowaną biblioteką odpowiedzialną za obsługę plików i katalogów, umożliwia także niskopoziomową komunikację (z pominięciem systemu plików) z urządzeniami np. poprzez interfejs Bluetooth (SIO2BT). Nie wymaga obecności DOS, może funkcjonować z pominięciem Systemu Operacyjnego, zajmuje tylko 1 KB pamięci. Przy wyłączonym ROM Atari oddaje do dyspozycji programisty 61 KB RAM.
xBIOS podobnie jak DOS operuje na danych pogrupowanych w pliki. Może służyć również jako inicjalizer / loader do gier (obsługuje katalogi) – w tym przypadku (inaczej niż DOS lub inicjalizery) nie nakłada ograniczeń na obszar ładowania. Umożliwia dołączenie modułu dekompresora danych i plików binarnych (*.cex) w tym przypadku pozwala na dekompresję w locie ładowanych programów lub danych.
Po uruchomieniu biblioteki automatycznie ładowany jest program domyślny (standardowo jest to plik XAUTORUN). Nazwę pliku domyślnego, zapisaną w nagłówku konfiguracyjnym, możemy dowolnie zmieniać. W przypadku gdy xBIOS nie odnajdzie na nośniku pliku domyślnego, wyświetli „MENU” loadera. Ładowanie pliku domyślnego można pominąć poprzez przytrzymanie klawisza OPTION podczas uruchomienia biblioteki.
Projekty korzystające z xBIOS
– gry i programy zaprojektowane przy użyciu pakietu 8bit-unity, Stunt Car Racer, Prince of Persia, Star Vagrant, Laser Squad, Reharden, Arsantica, Deathchase XE, Mazezam, Minotaur 16K, Gravity Worms, Beep’em All, SIDPlayer
Jeśli znasz inne – daj mi znać 🙂
Download, wersja: 4.3 (17.01.2016)
xBIOS.ATR – .ATR z automatycznie bootującym xBIOS,
xBIOSv4BT.ATR – .ATR z automatycznie bootującym xBios jako loader dla SIO2BT,
xBIOS.COM – pobierz i nagraj na własnym nośniku (lub obrazie .ATR o dowolnej wielkości) (10.12.2019)
xBOOT Loader – uniwersalny BOOT loader dla dysku (29.03.2016)
xBOOT Loader – BOOT loader dla cartridge
xBIOS.CFG – przykładowy opcjonalny plik konfiguracyjny
xBOOT Initializer – zapisuje na dyskietce xBOOTa – uruchamia plik AUTORUN (program J.Pelca z bootsektorem xBOOT)
xBOOT Initializer Hybrid – zapisuje na dyskietce xBOOTa który dekompresuje spakowane bloki w plikach binarnych – uruchamia pierwszy plik na dysku (program J.Pelca z bootsektorem xBOOT)
BOOTowalny atr możemy stworzyć poleceniem:
dir2atr -md -B xboot.obx atrfile.atr directory
Zestawienie cech xBIOS
– relokowalny – bibliotekę można ulokować w dowolnym miejscu pamięci, również pod ROM, w pamięci rozszerzonej lub w MapRAM,
– nie korzysta z komórek pamięci na stronie zerowej,
– OFFSET (NOTE/POINT) – wartości względem początku pliku (inaczej niż AtariDOS),
– dowolna liczba jednocześnie otwartych plików,
– możliwość wykonania BINARY LOAD z dowolnego bloku wewnątrz pliku,
– wersja z dekompresorem bloków w pliku binarnym – dane lub pliki binarne mogą być skompresowane i nadal będą prawidłowo obsługiwane,
– możliwość niskopoziomowej komunikacji z urządzeniami z użyciem standardowego protokołu SIO,
– modułowa budowa, moduł obsługi systemu plików (np. rodzina AtariDOS 2 FS: AtariDOS/MyDOS/BiboDOS/TopDOS), moduł I/O dla urządzeń zewnętrznych (np. SIO / AtariOS / RAMDISK / CAR).
Cechy modułu FS (AtariDOS 2 FS)
– dynamicznie rozpoznaje format systemu plików i dostosowuje operacje do właściwego mapowania plików, obsługa pełnej pojemności filesystemu ( 16MB ),
– nie ma ograniczeń co do używanych znaków w nazwach plików i katalogach. Można stosować wszystkie 256 znaków ATASCII,
– maksymalnie 128 plików w katalogu (można korzystać z rozszerzonej ilości wpisów w katalogu – do ponad 4000), nieograniczona ilość plików na dysku,
– nie korzysta z VTOC, nie pozwala tworzyć plików, umożliwia zapis w istniejących plikach.
Cechy modułu I/O (SIO)
– dedykowany urządzeniom podłączonym gniazdem PERIPHERAL,
– nie korzysta z przerwań, user może używać NMI i IRQ podczas operacji I/O,
– nie korzysta z procedur zapisanych w ROM. Można wyłączyć ROM co daje niebuforowany dostęp do 61KB na komputerze 64KB i 125KB na komputerze 128KB,
– obsługuje Ultra Speed – jeśli urządzenie na to pozwala. Umożliwia także transmisję w zdefiniowanej przez użytkownika prędkości,
– umożliwia komunikację za pomocą SIO2BT bez potrzeby modyfikacji Systemu Operacyjnego.
Cechy modułu I/O (CAR)
– przeznaczony dla Cartridge (RAM-CART, Atarimax) i RAM Dysku – banki 16k i 8k,
– nie korzysta z przerwań, user może używać NMI i IRQ podczas operacji I/O,
– nie korzysta z procedur zapisanych w ROM.
Cechy modułu I/O (AtariOS)
– korzysta z Atari OS,
– pozwala używać dowolne urządzenie podłączone do Atari,
– umożliwia stosowanie API xBIOS dla urządzeń widzianych przez system (np. HDD).
Informacje dla użytkowników
xBIOS jest plikiem binarnym, który może być załadowany przy użyciu DOS lub inicjalizera, jednak szybciej i wygodniej jest skorzystać z dedykowanego BOOT loadera (automatycznie startujący dysk lub cartridge). W „MENU” xBIOS kombinacje klawiszy SHIFT+1-F pozwalają na zmianę urządzenia domyślnego.
Informacje dla programistów
– Urządzenie z którego został uruchomiony xBIOS automatycznie staje się urządzeniem domyślnym,
– Plik domyślny to pierwszy załadowany plik,
– Katalog domyślny to katalog z którego został uruchomiony plik domyślny,
– Program uruchomiony za pomocą biblioteki ma dostęp do katalogu domyślnego (i podkatalogów), nie ma dostępu do katalogu nadrzędnego,
– xBIOS wykorzystuje filesystem AtariDOS (także MyDOS z katalogami i BiboDOS/TopDOS z 128 wpisami w katalogu), ale może być na specjalne życzenie skonfigurowany z własnym filesystemem a nawet do wersji dla gier „całodyskowych”,
– Istnieje możliwość rejestracji w xBIOS własnego urządzenia z dowolnym protokołem komunikacji jako urządzenie domyślne i korzystać z API xBIOS dla operacji I/O,
– w przypadku wystąpienia błędu podczas wykonywania funkcji xBIOS wraca z ustawionym znacznikiem C=1, pozostałe informacje w zależności od funkcji znajdują się w rejestrach.
Budowa xBIOS
Pierwszy blok pliku xBIOS to blok konfiguracji. Zmieniając go możemy np. relokować bibliotekę pod dowolny adres, zmienić nazwę pliku który ma być automatycznie załadowany itp.
.byte c'XAUTORUN ' ; autorun file
.byte >$0800 ; xBIOS adress
.byte >$0700 ; buffer adress
.word INITAD ; INITAD vector adress
.word RUNAD ; RUNAD vector adress
.word AOSV ; I/O module adress (at run AtariOS; default xSIOV)
.word AOSV_RELOC ; relocate AtariOS I/O module variables
.byte $ff ; PORTB at start (can't switch off BASIC this way)
.byte $40 ; NMIEN at start
.byte $c0 ; IRQEN at start
Indywidualna konfiguracja
Konfigurację xB można zmienić poprzez plik konfigracyjny: XBIOS.CFG
struktura pliku:
opt h-
.byte $43 ; numer wersji
.byte c’XAUTORUN ‚ ; plik autorun
.byte >$0800 ; starszy bajt adresu biblioteki
.byte >$0700 ; starszy bajt adresu bufora
.word $02e2 ; INITAD
.word $02e0 ; RUNAD
.word $0000 ; adres modułu I/O – $0000 oznacza użycie standardowego modułu SIO
.word $0000 ; relokator modulu I/O
.byte $ff ; ustawienie PORTB, nie bierze pod uwage BASICA
.byte $40 ; ustawienie NMIEN
.byte $c0 ; ustawienie IRQEN
kolejne bajty pliku nie mają znaczenia, nie będą wczytywane, mogą zawierać komentarze.
Dostępne dodatki
1. Delta Music Composer Player by Konop – umożliwia odtwarzanie muzyki podczas operacji I/O,
2. Dekompresor Inflate by Fox – umożliwia ładowanie i dekompresję „w locie” danych składowanych w pliku (kompresowanych algorytmem deflate),
3. Dekompresor RLE by Konop, Magnus, Probe, Seban, Tebe – podobnie, umożliwia ładowanie i dekompresję danych z pliku,
4. Dekompresor LZ4 by xxl & Fox – umożliwia ładowanie i dekompresję „w locie” danych z pliku,
5. BOOT Loader by xxl – umożliwia stworzenie dyskietki bootującej, automatycznie ładuje plik AUTORUN. Umożliwia załadowanie programu binarnego od $800. Posiada funkcję xBOOT_LOAD_FILE, jeśli ładowany program nie ma zdefiniowanego adresu RUNAD to zostanie uruchomiony od początku pierwszego bloku. xBOOT zajmuje obszar $480-$5FF (3 BOOT sektory) wykorzystuje komórki $F9-$FF. W pierwszej kolejności próbuje załadować plik AUTORUN (można pominąć naciskając OPTION podczas BOOT), jeśli go nie znajdzie załaduje plik XBIOS.COM. xBOOT korzysta z systemowego SIO, sektor wielkości 128/256, obsługuje AtariDOS 2 FS, podkatalogi i 64/128 wpisów w katalogu.
6. Tworzenie własnego cartridge z FS AtariDOS (z katalogami).
7. BOOT Loader Hybrid by xxl – posiada funkcje dekompresji spakowanych bloków w pliku binarnym (bloki w plikach można pakować Super Packerem), uruchamia pierwszy plik na dysku.
Mapa Pamięci przy konfiguracji standardowej xBIOS:
$0000-$00ff ; free
$0100-$01ff ; stos 6502C
$0200-$06ff ; free
$0700-$07ff ; bufor I/O - relokowany
$0800-$0bff ; xBIOS - relokowany
$0c00-$cfff ; free
$d000-$d7ff ; Atari HW
$d800-$ffff ; free
- xBIOS_RENAME_ENTRY – funkcja umożliwia zmianę nazwy pliku lub katalogu. Nie ma ograniczeń co do użytych znaków w nazwie.
ldy < fname
ldx > fname
jsr xBIOS_RENAME_ENTRY
fname
.byte c’FILENAMESRC’ ; 11 char ATASCII
.byte c’FILENAMEDST’ ; 11 char ATASCII
- xBIOS_LOAD_FILE – załadowanie i uruchomienie pliku, nagłówki INIT i RUN są obsługiwane. BOOT Loader posiada analogiczną funkcję xBOOT_LOAD_FILE. W przypadku BOOT Loadera jeśli plik nie ma zdefiniowanego bloku RUN to zostanie uruchomiony od początku pierwszego bloku.
ldy < fname
ldx > fname
jsr xBIOS_LOAD_FILE
fname .byte c'MYFILE COM' ; 11 znakow ATASCII
ldy < fname
ldx > fname
jsr xBIOS_OPEN_FILE
fname .byte c'MYFILE COM' ; 11 znakow ATASCII
- xBIOS_LOAD_DATA – dane z pliku załaduj pod podany adres, można ustawić przesunięcie bieżącego wskaźnika pliku (FILE_OFFSET) oraz ilość danych do załadowania (SET_LENGTH). Jeśli nie zdefiniujemy tych wartości załadowane zostaną dane od bieżącej pozycji wskaźnika pliku do końca pliku. Jeśli chcesz ładować plik binarny korzystając z definiowanych w nim nagłówków użyj funkcji xBIOS_BINARY_LOAD lub xBIOS_LOAD_FILE.
ldy < dest
ldx > dest
jsr xBIOS_LOAD_DATA
- xBIOS_WRITE_DATA – dane zaczynające się od podanego adresu w pamięci zapisz do pliku, można ustawić przesunięcie bieżącego wskaźnika pliku (FILE_OFFSET) oraz ilość danych do zapisania (SET_LENGTH). Jeśli nie zdefiniujemy tych wartości w pliku zapisane zostaną dane od bieżącej pozycji w pliku do końca pliku.
ldy < src
ldx > src
jsr xBIOS_WRITE_DATA
jsr xBIOS_OPEN_CURRENT_DIR
jsr xBIOS_GET_BYTE
lda BYTE
jsr xBIOS_PUT_BYTE
- xBIOS_FLUSH_BUFFER – wszystkie operacje zapisu są buforowane, po operacji zapisu należy opróżnić bufor czyli „zamknąć plik”.
jsr xBIOS_FLUSH_BUFFER
- xBIOS_SET_LENGTH – definiuje ilości przetwarzanych danych w operacjach czytania lub zapisu. Jeśli po OPEN_FILE wartość nie zostanie zdefiniowana to operacje będą przeprowadzane do końca pliku.
ldy < len
ldx > len
jsr xBIOS_SET_LENGTH
ldy < adr
ldx > adr
jsr xBIOS_SET_INIAD
- xBIOS_SET_FILE_OFFSET – ustawia bieżącą pozycję odczytu/zapisu w pliku na wartość zapisaną w A,X,Y. Pozycja ta liczona jest względem początku pliku. To numer bajtu, który zostanie odczytany lub zapisany. W DOS operacja nosi nazwę POINT.
ldy < pos
ldx > pos
lda ^ pos
jsr xBIOS_SET_FILE_OFFSET
ldy < adr
ldx > adr
jsr xBIOS_SET_RUNAD
jsr xBIOS_SET_DEFAULT_DEVICE
ldy < fname
ldx > fname
jsr xBIOS_OPEN_DIR
- xBIOS_LOAD_BINARY_FILE – ładuj i uruchom plik binarny od bieżącej pozycji odczytu/zapisu. Nagłówki INIT i RUN są obsługiwane.
jsr xBIOS_LOAD_BINARY_FILE
jsr xBIOS_OPEN_DEFAULT_DIR
ldy < dev
ldx > dev
jsr xBIOS_SET_DEVICE
- xBIOS_RELOCATE_BUFFER – zmień adres bufora I/O. Jeśli przed wywołaniem funkcji ustawimy znacznik C=1 to relokację można przeprowadzić nawet podczas I/O. Dane nie zostaną utracone. Jeśli przed wywołaniem funkcji znacznik C=0 to zawartość bufora nie będzie kopiowana w nowe miejsce.
ldx > buffer
jsr xBIOS_RELOCATE_BUFFER
- xBIOS_GET_ENTRY – pobiera z katalogu kolejny wpis. W rejestrze X zwraca indeks do nazwy pliku lub katalogu (starszy bajt adresu bufora przechowywany jest w zmiennej xBUFFERH), w rejestrze A przekazywany jest bajt statusu wpisu. Ustawiony znacznik C oznacza koniec katalogu.
jsr xBIOS_GET_ENTRY
- xBIOS_OPEN_DEFAULT_FILE – otwarcie pliku domyślnego. Funkcja nie przeszukuje katalogu, uchwyt do pliku pobierany jest ze zmiennej xFILE.
jsr xBIOS_OPEN_DEFAULT_FILE
lda > sector
ldy < sector
jsr xBIOS_READ_SECTOR
- xBIOS_FIND_ENTRY – funkcja pozwala odszukać w katalogu podany wpis. W rejestrze X zwraca indeks do nazwy pliku lub katalogu (starszy bajt adresu bufora przechowywany jest w zmiennej xBUFFERH), w rejestrze A oraz Y (starszy/młodszy bajt) przekazywany numer pierwszego sektora zajętego przez wpis. Ustawiony znacznik C oznacza wpis nieodnaleziony.
ldy < fname
ldx > fname
jsr xBIOS_FIND_ENTRY
- xBIOS_SET_BUFFER_SIZE – funkcja pozwala ustawić wielkość bufora dla operacji I/O. Wielkość bufora – młodszy bajt – przechowywana jest także w zmiennej xBUFSIZE.
lda #$100-SIZE
jsr xBIOS_SET_BUFFER_SIZE