niedziela , 22 grudzień 2024

Kącik początkującego kodera: jak wczytać plik z dyskietki?

Witam w nowym kąciku w Kalafiorze, który można nazwać w skrócie Ass. Corner. Będzie tu mowa o Assemblerze – a jak! W końcu jest to najlepszy język programowania i najszybszy w porównaniu np. z Basicem.

W Fuzzie pojawił się artykuł, który miał rozpocząć cykl programowania w Assemblerze. Niestety, na razie nie zapowiada się, aby nowy numer Fuzza wyszedł a i jednocześnie autor tego arta – TSD, odszedł ze sceny. Może powróci, ale póki co, ja postanowiłem co nieco popisać o Assemblerze.

Dla ludzi chcących pisać w Assemblerze jedna uwaga. Należy uzbroić się w porządny turbo Assembler i spis mnemoników!

Na pierwszy ogień idzie standardowe LOAD/SAVE. No i VERIFY, ale to tak przy okazji.

Kiedy chcieliśmy wgrać coś z dysku/taśmy, wystarczyło zwykłe Load, czy odpowiednik w zainstalowanym turbo. Jednak, gdy chcemy, aby nasz program wyglądał lepiej, niż ten w Basicu, musimy odwołać się do Assemblera i odpowiednich Kernalowskich procedur.

Od razu przejdę do konkretów. Podam teraz gotowy, uniwersalny, 100% relokowalny program do wczytywania innych programów. Jedyna wada, to 0-krotna prędkość. Dlatego polecam używać go razem z AR – (wiadomo dlaczego?). A teraz obiecany listing:

lda #$01
ldx #$08   (device number)  
ldy #$00   (01-verify)   
jsr $ffba  
lda #$ długość nazwy pliku  
ldx #< młodszy bajt adresu, gdzie jest nazwa pliku  
ldy #> starszy bajt  
jsr $ffbd  
lda #$00  
ldx #< młodszy bajt adresu początkowego  
ldy #> starszy  
jsr $ffd5  
rts

Teraz wyjaśnię wszelkie wątpliwości:
Pierwszy człon służy do zawiadomienia, co komputer ma zrobić. Rejestr X służy do podania numeru urządzenia, a rejestr Y do podania informacji: 0-load, 1-verify. Druga część to info o nazwie pliku. Powiedzmy, że nasz plik będzie miał długość 9 znaków i jego nazwa siedzi od $2000:

:2000 C64 rulez

wtedy ta część programu będzie wyglądać tak:

 

lda #$09     >długość nazwy pliku
ldx #$00     >młodszy bajt adresu, w którym jest nazwa pliku  
ldy #$20     >starszy bajt.....  
jsr $ffbd

Jest to bardzo istotne, gdyż Dos stacji nie zapisze pliku bez podania nazwy, lub gdy nazwa ma długość 0 znaków. Trzecia część to ładowanie pliku pod wskazany adres. Gdy chcemy załadować coś od $1000, wtedy nasza część programu będzie wyglądać tak:

lda #$00
ldx #$00  
ldy #$10  
jsr $ffd5

Proste, nieprawdaż?

Nie testowałem jeszcze pliku od $0801. Prawdopodobnie jak się załaduje X i Y wartością #$ff, to plik zostanie załadowany pod $0801. Ale tego to nie jestem pewien.

Teraz obiecane SAVE.
Początek ten sam przepisujemy dwa pierwsze człony, i dalej:

lda #< mł. bajt adr. pocz. do zgrania 
sta $2b 
lda #> st. bajt 
sta $2c 
lda #$2b 
ldx #< mł. bajt adr. końcowego 
ldy #> st. bajt 
jsr $ffd8
przykład: $1000 mł. bajt -> #$00 st. bajt -> #$10 PAMIĘTAJ O TYM!

Chyba nie ma co tu tłumaczyć. Dla osób niewtajemniczonych podam tylko, że komórki $2b i $2c są wektorem startu programu napisanego w BASIC-u i po włączeniu C64 zawierają wartości #$01 i #$08, czyli $0801, czyli #2049. Gdy zgrywamy jakąś konkretną część pamięci, to koniecznie należy te dwie komórki ustawić na jej początek.

Mam nadzieję, że komuś przydadzą się te bajerki. Czasami warto jednak użyć specjalnego loadera, zwłaszcza, gdy jest szybszy od Action Replaya.

H.M.MURDOCK/TROPYX/OXYGEN64/DRACO

Artykuł ten kierowany był do początkujących koderów w Assemblerze i został on stworzony z inspiracji moich pierwszych doświadczeń z procedurami Load/Save. Pamiętam także, iż chciałem wówczas wstąpić do grupy Lasser, dlatego też napisałem kilka artykułów do magazynu Kalafior.

Tekst napisałem w 2000 r. (w okresie przedwakacyjnym) przy użyciu Commodore 64 oraz edytora tekstowego do magazynu dyskowego Kalafior. Ukazał się on 5 sierpnia 2000 r. w magazynie Kalafior #3/Lasser w dziale Scenaline. Oryginalną treść poddałem niewielkiej korekcie, mając na uwadze przede wszystkim poprawną interpunkcję.