xBIOS

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

Oferta:


xBIOS                      equ $xxxx
xBIOS_VERSION              equ xBIOS+$02
xBIOS_RENAME_ENTRY         equ xBIOS+$03
xBIOS_LOAD_FILE            equ xBIOS+$06
xBIOS_OPEN_FILE            equ xBIOS+$09
xBIOS_LOAD_DATA            equ xBIOS+$0c
xBIOS_WRITE_DATA           equ xBIOS+$0f
xBIOS_OPEN_CURRENT_DIR     equ xBIOS+$12
xBIOS_GET_BYTE             equ xBIOS+$15
xBIOS_PUT_BYTE             equ xBIOS+$18
xBIOS_FLUSH_BUFFER         equ xBIOS+$1b
xBIOS_SET_LENGTH           equ xBIOS+$1e
xBIOS_SET_INIAD            equ xBIOS+$21
xBIOS_SET_FILE_OFFSET      equ xBIOS+$24
xBIOS_SET_RUNAD            equ xBIOS+$27
xBIOS_SET_DEFAULT_DEVICE   equ xBIOS+$2a
xBIOS_OPEN_DIR             equ xBIOS+$2d
xBIOS_LOAD_BINARY_FILE     equ xBIOS+$30
xBIOS_OPEN_DEFAULT_DIR     equ xBIOS+$33
xBIOS_SET_DEVICE           equ xBIOS+$36
xBIOS_RELOCATE_BUFFER      equ xBIOS+$39
xBIOS_GET_ENTRY            equ xBIOS+$3c
xBIOS_OPEN_DEFAULT_FILE    equ xBIOS+$3f
xBIOS_READ_SECTOR          equ xBIOS+$42
xBIOS_FIND_ENTRY           equ xBIOS+$45
xBIOS_SET_BUFFER_SIZE      equ xBIOS+$48

pod adresem xBIOS znajduje się:
xBIOS             .byte c'xB'
xBIOS_VERSION     .byte $43 ; wersja 4.3

lista zmiennych (dla zaawansowanych użytkowników):

xDIRSIZE        equ xBIOS+$3e5 ; current directory size in sectors (1 byte)
xSPEED          equ xBIOS+$3e6 ; STD SPEED
xHSPEED         equ xBIOS+$3e7 ; ULTRA SPEED
xIRQEN          equ xBIOS+$3e8 ; User IRQ (1 byte)
xAUDCTL         equ xBIOS+$3e9 ; AUDCTL
xFILE           equ xBIOS+$3ea ; File handle (2 bytes)
xDIR            equ xBIOS+$3ec ; Root directory handle (2 bytes)
xIOV            equ xBIOS+$3ee ; I/O module entry (2 bytes)
xBUFFERH        equ xBIOS+$3f0 ; Buffer adr hi byte (1 byte)
xBUFSIZE        equ xBIOS+$3f1 ; Buffer size lo byte $100-SIZE (1 byte)
xDAUX3          equ xBIOS+$3f2 ; Buffer offset (1 byte)
xSEGMENT        equ xBIOS+$3f3 ; Bytes to go in binary file segment (2 bytes)
xNOTE           equ xBIOS+$3f5 ; File pointer (3 bytes)
xDEVICE         equ xBIOS+$3fc ; Device ID
xDCMD           equ xBIOS+$3fd ; CMD (1 byte)
xDAUX1          equ xBIOS+$3fe ; Sector lo byte (1 byte)
xDAUX2          equ xBIOS+$3ff ; Sector hi byte (1 byte)

BOOT Loader:
xBOOT_LOAD_FILE         equ $5f1


  • 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


  • xBIOS_OPEN_FILE – otwarcie (wskazanie) pliku, na którym wykonywane będą kolejne operacje I/O.

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


  • xBIOS_OPEN_CURRENT_DIR – otwarcie bieżącego katalogu.

jsr     xBIOS_OPEN_CURRENT_DIR


  • xBIOS_GET_BYTE – bajt z pliku zostanie załadowany do rejestru A.

jsr     xBIOS_GET_BYTE


  • xBIOS_PUT_BYTE – bajt z rejestru A zostanie zapisany do pliku.

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


  • xBIOS_SET_INIAD – umożliwia zmianę lokacji wektora INITAD ($2E2) ładowanych plików binarnych.

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


  • xBIOS_SET_RUNAD – umożliwia zmianę lokacji wektora RUNAD ($2E0) ładowanych plików binarnych.

ldy     < adr
ldx     > adr
jsr     xBIOS_SET_RUNAD


  • xBIOS_SET_DEFAULT_DEVICE – przywraca standardowy sterownik I/O urządzenia zewnętrznego.

jsr     xBIOS_SET_DEFAULT_DEVICE


  • xBIOS_OPEN_DIR – umożliwia zmianę katalogu bieżącego.

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


  • xBIOS_OPEN_DEFAULT_DIR – otwarcie katalogu domyślnego.

jsr     xBIOS_OPEN_DEFAULT_DIR


  • xBIOS_SET_DEVICE – zmień sterownik I/O urządzenia zewnętrznego.

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


  • xBIOS_READ_SECTOR – załaduj sektor do bufora.

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