Tajemnice ATARI

6 STRONA
KONKURS

    Prezentowany programik nadesłał do nas Pan Tomasz Wieszczek z Trakiszek. Uzupełnia on standardowy interpreter basicu o funkcje odczytu katalogu dyskietki (directory). Procedura w języku maszynowym zgodnie z regułami konkursu umieszczona jest na szóstej stronie pamięci. Wywołanie funkcji USR (1536) powoduje wypisanie na ekranie katalogu dysku bez potrzeby przechodzenia do DOSu. Procedura realizująca odczyt zawartości dyskietki mogłaby być oczywiście wywoływana jakąś kombinacją klawiszy co byłoby łatwiejsze w użyciu, lecz wtedy nie dałoby się używać tej funkcji we własnych programach. Omawianą procedurę można wywoływać na dwa sposoby: bez parametru lub z podanym wzorcem (maską) nazw do wyświetlenia. W pierwszym przypadku wywołanie wygląda np. A=USR(l536) i spowoduje ono wypisanie całego katalogu dyskietki. W drugim przypadku jako parametr podajemy adres wzorca nazw. Wywołanie może wówczas wyglądać następująco:
A=USR(1536,ADR("D:*.BAS ")) co spowoduje wyświetlenie nazw wszystkich plików z rozszerzeniem BAS. Ważna uwaga: podany wzorzec musi kończyć się znaczkiem rozpoznawalnym przez DOS jako koniec nazwy np. spacja w negatywie. Prezentujemy niżej wydruk programu w języku asemblera w formacie QA oraz program w basicu, który dekoduje kod maszynowy zapisany w wierszach DATA do pamięci na stronę szóstą. Kolejne wiersze tego programu numerowane są od 31000 co powinno pozwolić na w miarę bezkonfliktowe dołączanie go do własnych. Należy go raz wywołać na początku własnego programu jako podprogram (komendą GOSUB 31000) po czym można dowolną liczbę razy używać funkcji USR(1536). Procedura maszynowa nie jest niestety relokowalna, toteż nie może być przenoszona w inne miejsce pamięci bez zmian w kodzie (asemblacji w inne miejsce pamięci).

AVALON

********************
*                  *
* Basic  Directory *
*                  *
*(c)1991 Tajemnice *
*          Atari   *
*                  *
********************

     opt %010101

*-   system

iocb0  equ $340

bell   equ $f556
ciov   equ $e456

*-   stale

eol  equ $9b

     org $600

* ustaw standardowa
* maske katalogu

     lda <dfil
     sta tmp
     lda >dfil
     sta tmp+1

* pobranie parametrow

     pla
     beq dir
     pla
     sta tmp+1
     pla
     sta tmp

* directory

dir  equ *

* szukaj wolnego
* kanalu I/O

     ldx #$10
sernx equ *
     lda iocb0,x
     cmp #$ff
     beq freeio
     clc
     txa
     adc #$10
     tax
     cpx #$80
     bcc sernx
     rts

freeio equ *
     stx chnum

* otworz kanal na
* odczyt katalogu

     lda #3
     sta iocb0+2,x
     lda tmp
     sta iocb0+4,x
     lda tmp+1
     sta iocb0+5,x
     lda #6
     sta iocb0+10,x
     lda #0 (128)
     sta iocb0+ll,x
     jsr ciov
     bpl dirc

* bląd transmisji
err  jsr bell
     jmp endp

* czytaj DIR po znaku

dirc equ *
     ldx chnum
     lda #0
     sta iocb0+8,x
     sta iocb0+8
     sta iocb0+9,x
     sta iocb0+9

     lda #5
     sta iocb0+2,x
     jsr ciov
     bmi endd

* wypisz dir
* po znaku

     ldx #11
     stx iocb0+2
     ldx #0
     jsr ciov
     jmp dirc

*-------------------

endd cpy #136
     bne err
endp ldx chnum

* zakoncz operacje I/O

     lda #12
     sta iocb0+2,x
     ldx #$10
     jmp ciov

*-------------------

dfil dta c'D1:*.*',b(eol)

tmp     dta a(0)
chnum   dta b(0)

     end

31000 RESTORE 31100:FOR BASE=1536 TO 1
683:READ DAT:POKE BASE,DAT:NEXT BASE
31100 DATA 169,138,141,145,6,169,6,141
,146,6,104,240,8,104,141,146,6,104,141
,145,6,162,16,189,64,3,201,255,240
31110 DATA 10,24,138,105,16,170,224,17
6,144,240,96,142,147,6,169,3,157,66,3,
173,145,6,157,68,3,173,146,6,157
31120 DATA 69,3,169,6,157,74,3,169,0,1
57,75,3,32,86,228,16,6,32,86,245,76,12
5,6,174,147,6,169,0,157
31130 DATA 72,3,141,72,3,157,73,3,141,
73,3,169,5,157,66,3,32,86,228,48,13,16
2,11,142,66,3,162,0,32
31140 DATA 86,228,76,81,6,192,136,208,
206,174,147,6,169,12,157,66,3,162,16,7
6,86,228,68,49,58,42,46,42,155,0,0,0
31150 RETURN 



Powrót na start | Powrót do spisu treści | Powrót na stronę główną

Pixel 2001