OPEN,BGET/BPUT,CLOSE v ASM

Raster, 2002

Pro načítání či ukládání dat lze ve vlastním programu efektivně použít povely OPEN, BGET nebo BPUT a CLOSE. Všechny tyto příkazy jsou implementovány například v TBASICu (standardní Atari BASIC má místo BGET a BPUT pouze GET a PUT pro přečtení/zápis vždy jen jednoho bytu), my se však podíváme na provedení Assemblerové.

K tomu bych ještě rád dodal, že považuji za velmi dobré, když užitkové programy nabízí ukládání a načítání svých dat přes CIO - tedy přes zařízení:název. Daleko pohodlněji se s nimi pak pracuje a díky tomu je též možné využívat pro data libovolné médium (např. disk, kazeta, turbo - kilové bloky), stejně tak jako virtuální zařízení (např. v emulátorech přístup přes H: na harddisk), včetně případných dalších "budoucích" zařízení. A to vše bez potřeby jakýchkoliv zásahů do programu samotného a bez nutnosti vyrábět speciální verze pro jednotlivé typy médií.

Následující příklad obsahuje tři rutiny. První provede otevření souboru "D:FILENAME.EXT", druhá načtení 1024 bytů dat do paměti od adresy $5000 (20480 decimálně), třetí uzavře soubor. Vše je okomentované a velmi názorné, takže není problém upravit si zdrojový kód pro vlastní potřeby včetně obměny BGET za BPUT pro ukládání dat.

CIOV .EQU $E456   ;vektor CIO rutiny
CHA  .EQU $30     ;kanál IOCB3
ADR  .EQU $5000   ;adresa začátku dat
LEN  .EQU $03FF   ;délka dat


;OPEN #3,4,0,"D:FILENAME.EXT"
OPEN
    LDX #CHA
    LDA #3
    STA $0342,X
    LDA #4       ;4=čtení,8=zápis
    STA $034A,X
    LDA #0
    STA $034B,X
    LDA #[FNAME]
    STA $0345,X
    JSR CIOV     ;v Y vrací status
    RTS
FNAME .BYTE "D:FILENAME.EXT",0


;BGET #3,ADR,LEN
BGET
    LDX #CHA
    LDA #7         ;7=BGET,11=BPUT
    STA $0342,X
    LDA #[ADR]    ;HB adresa začátku
    STA $0345,X
    LDA #[LEN]    ;HB počet bytů
    STA $0349,X
    JSR CIOV       ;v Y vrací status
    RTS

Poznámka:
Po návratu z CIO rutiny obdržíme v Y registru status IO operace. Potřebujeme-li znát počet skutečně načtených bytů, například v případě, že při čtení došlo k chybě dosažením konce souboru, můžeme jej přečíst z adres:

    LDA $0348,X    ;DB počet bytů
    LDA $0349,X    ;HB počet bytů


CLOSE
    LDX #CHA
    LDA #$0C
    STA $0342,X
    JSR CIOV       ;v Y vrací status
    RTS