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
|