Filerequester/directory

Aus C64-Wiki
Zur Navigation springenZur Suche springen

<< zurück zu Filerequester


Das Maschinenspracheprogramm directory ist ein Filerequester, mit dem in einem laufenden BASIC-Programm ein Dateiname per Auswahl mit den Cursortasten in eine Variable übernommen werden kann.

  • Original von Dieter Bayer im 64'er Sonderheft 15, Seite 154 (1987).
  • Korrekturen von Peter Hagemann (1988 und 2022).
  • An TSB angepasst von Peter Hagemann (2023) und Arndt Dettke (2023) unter dem Namen „dirselect“.


Beschreibung[Bearbeiten | Quelltext bearbeiten]

Die Startadresse ist $C000 (49152). Das Programm belegt den Speicher $C000-$C297 (Original: $C000-$C285). Der Bereich unter dem BASIC-ROM ab $A000 dient als Pufferspeicher für die eingelesenen Directory-Einträge (16 Bytes pro Datei).

  • Der erste Parameter gibt die Startspalte der Dateiauswahlanzeige an. Er darf Werte von 0 bis 22 annehmen. Die Ausgabebreite beträgt 18 Zeichen.
  • Der zweite Parameter ist der Dateifilter. Mit "$" werden sämtliche Dateien aus dem Directory angezeigt. Mit dem Filter "$:[*" werden nur Dateien ausgewählt, die mit "[" beginnen.
  • Der dritte Parameter benennt die Variable, die den Dateinamen aufnimmt.

Anwendungsbeispiele:

DL=49152
SYSDL,22,"$",F$
SYSDL,19,"$:[*",F$

Die im Sonderheft 15 veröffentlichte Fassung (s.u. SMON-Disassembler-Listing des Originals) enthält die drei Mängel 1-3. Diese Probleme sind in der korrigierten Fassung von 1988 behoben. Zwei weitere kleinere Mängel (4-5) sind in der neuesten Fassung von 2022 beseitigt.

  1. Bei der Blockanzahl 34 gibt es Probleme, da sie mit dem Code für das Anführungszeichen verwechselt wird.
  2. Im normalen Betriebssystem wird die Schriftfarbe der Dateinamen nicht gesetzt, die so unsichtbar bleiben.
  3. Es gibt keine Möglichkeit, ohne Auswahl abzubrechen. Die korrigierte Version tut dies nach <Pfeil links>.
  4. Die Farbe wird jetzt im ganzen Ausgabebereich (auch in den Zeichen links und rechts vom Dateinamen) gesetzt.
  5. Nach der Dateiauswahl wird der Reverse-Modus ausgeschaltet.


Listing (ACME) der korrigierten Fassung[Bearbeiten | Quelltext bearbeiten]

;"directory" Dateiauswahldialog
;Original von Dieter Bayer aus dem 64'er SH15 (1987)
;mit Korrekturen von P.Hagemann (1988/2022)

	!to "directory-v3.prg", cbm
	* = $c000

	errout	= $a43a
	frmevl	= $ad9e
	chkcom	= $aefd
	home	= $e566
	getvar	= $b08b
	frestr	= $b6a3
	getbyte	= $b79e
	iecin 	= $ffa5
	setpar	= $ffba
	setfnp	= $ffbd
	open 	= $ffc0
	clrchn 	= $ffcc
	close 	= $ffc3
	chkin 	= $ffc6
	basout 	= $ffd2
	getin 	= $ffe4
	
	jsr home
	lda #16 	;String-Länge 16
	jsr $b47d	;macht Platz für String
	stx   $fc
	sty   $fd
	jsr chkcom
	jsr getbyte
	stx startcol
	txa
	clc
	adc #18
	sta endcol 	;Endespalte = Startspalte + 18
	jsr chkcom 
	jsr frmevl  
	jsr frestr 
	jsr setfnp  
	jsr chkcom  
	jsr getvar  
	sta   $fa  
	sty   $fb  
	lda   $0d  
	bne lc03b  
	ldx #22 	;Fehler 22
	jmp errout  
	;------------------  
lc03b	lda #$7f   
	ldx #$08   
	ldy #$60   
	jsr setpar  
	jsr open  
	ldx #$7f   
	jsr chkin  
	ldx #4  	;4 Bytes überlesen
lc04e	jsr iecin  
	bit   $90  
	bvs lc05a  
	dex       
	bne lc04e  
	beq lc065   
	;------------------    
lc05a	jsr clrchn  
	lda #$7f   
	jsr close  
	jmp lc0d9  
	;------------------     
lc065	jsr lc0c5	;Zeiger auf RAM $a000
	ldx startcol	
	beq lc075  
	lda #$1d	;Crsr right
lc06f	jsr basout 
	dex       
	bne lc06f  	;vor bis Startspalte
lc075	ldx #21		;21 Bytes  
lc077	jsr iecin  
	jsr basout  
	dex       
	bne lc077  
	jsr skip12	;12 Bytes überlesen
	ldx #8   
lc083	jsr iecin
	cmp #$22 	;Anführungszeichen
	beq lc093  
	bit   $90	;Status Bit 6?
	bvs lc05a	;EOF, dann fertig
	dex       
	bne lc083	;nächstes Byte
	beq lc05a	;fertig
	;------------------  
lc093	ldy #00   
lc095	jsr iecin	;(16-mal) 
	sta  ($50),y	;in RAM $a000 ablegen
	iny       
	cpy #16   
	bne lc095  
	lda #$ff	;Ende-Markierung   
	sta  ($50),y
	dey       
	lda  ($50),y	;Byte davor
	beq lc05a	;= 0 dann fertig
	clc       
	lda   $50  
	adc #$10 	;nächste 16 Bytes im RAM
	sta   $50  
	bcc lc0b3  
	inc   $51  
lc0b3	inc   $02       ;maximale Anzahl der Datei-Einträge + 1  
	jsr skip12	;12 Bytes überlesen  
lc0b8	jsr iecin
	bit   $90  
	bvs lc05a	;eof, dann fertig
	cmp #$22	;sonst bis Anführungszeichen
	bne lc0b8  
	beq lc093	;nächster Dateieintrag
	;------------------  
	;Init Zeiger auf Dateiname im RAM ab $a000
lc0c5	lda #$00   
	sta   $02       ;Anzahl Einträge (0: keine)
	sta   $50	;Zeichen  
	lda #$a0   
	sta   $51	;50/51 auf $a000
	lda #$36	;auf BASIC-RAM   
	sta   $01	; schalten
	lda #$80	;für alle Tasten
	sta $028a	; Tastenwiederholung ein
	rts       
	;------------------     
lc0d9	lda   $02  
	bne lc0e0	;RAM-Einträge vorhanden
	jmp lc21a  	;sonst beenden
	;------------------     
	;Init Auswahlbereich
lc0e0	jsr color	;Farbe setzen
	sec       
	sbc #24 	;24   
	sta lc240	;(unbenutzt)  
	lda #$00   
	sta selrow
	sta ramrow
	jsr ram2scr
	lda #$01   
	sta currow
	jsr invert
	lda #$00   
	sta   $c6  
lc0fd	jmp lc258	;Tasteneingabe  
	;------------------     
lc100	beq lc0fd  
lc102	cmp #$0d        ;Return
	bne lc109  
	jmp lc1e7  
	;------------------     
lc109	cmp #$91  	;Cursor up
	beq lc140  
	cmp #$11  	;Cursor down 
	bne lc0fd       ;Tastaturabfrage
	jsr invert      ;Auswahlbereich invertieren
	inc ramrow  
	inc currow 
	lda ramrow  
	cmp   $02       ;Maximum überschritten?      
	bne lc12a  
	dec currow  
	dec ramrow  
	jmp lc13a  
	;------------------     
lc12a	lda currow
	cmp #25  
	bne lc13a  
	dec currow	;25, dann -1        
	inc selrow
	jsr ram2scr  
lc13a	jsr invert
	jmp lc0fd       ;Tastaturabfrage
	;------------------     
lc140	jsr invert
	dec ramrow
	dec currow
	lda ramrow  
	cmp #$ff        ;negativ?
	bne lc159  
	inc currow  	;dann wieder +1
	inc ramrow  
	jmp lc167  
	;------------------     
lc159	lda currow
	bne lc167  
	inc currow       ;0, dann 1
	dec selrow 
	jsr ram2scr
lc167	jsr invert
	jmp lc0fd       ;zur Tastenabfrage        
	;------------------     
	;aus Ram ab $a000 in Schirm ab $0400 
ram2scr	jsr ramptr 	;Zeiger im Ram berechnen 
	lda #41 	;ab Zeile 2
	clc       
	adc startcol  
	sta   $52	;Spalte Low-Byte 
	lda #$04   
	sta   $53	;Spalte High-Byte
	ldx #24 	;24 Zeilen
lc17e	ldy #$00   
lc180	lda  ($50),y	;Byte aus Ram (16-mal)
	cmp #$ff	;Ende-Kennung   
	beq lc1af	  
	cmp #$22	;Anführungszeichen   
	bne lc18c  
	lda #$20	;Rest mit Leerzeichen auffüllen
lc18c	jsr lc224	;Umwandeln in BSCode
	sta  ($52),y    ;Zeichen in Schirm
	iny       
	cpy #16     	;Dateilänge 16
	bne lc180  
	clc       
	lda   $50	;RAM-Zeiger +1
	adc #$10   
	sta   $50  
	bcc lc1a1  
	inc   $51  
lc1a1	clc       
	lda   $52	;nächste spalte
	adc #$28     	           
	sta   $52          
	bcc lc1ac  
	inc   $53  
lc1ac	dex       
	bne lc17e  
lc1af	rts       
	;------------------  
	;Zeiger im RAM ab $a000 für Auswahlbereich
ramptr	lda #$00   
	sta   $51  
	lda selrow      ;Top-Of-Page RAM-Index bzw. RAM-Index des ausgewählten Eintrags (nach RETURN)    
	sta   $50  
	asl   $50  
	rol   $51  
	asl   $50  
	rol   $51  
	asl   $50  
	rol   $51  
	asl   $50  
	rol   $51	;mal 16 
	clc       
	lda   $51  
	adc #$a0   
	sta   $51  
	rts       
	;------------------   
	;Auswahlbereich im Bildschirm invertieren
invert	ldx currow      ;Zeilenzähler 1 bis 24        
	jsr $e9f0	;Zeiger $d1/$d2 der Video-Adresse setzen
	ldy startcol    
lc1da	lda  ($d1),y            
	eor #$80  	;invertieren 
	sta  ($d1),y            
	iny       
	cpy endcol  
	bne lc1da  
	rts       
	;------------------    
	;Return: in Variable übernehmen 
lc1e7	clc       
	lda currow
	adc selrow
	sta selrow  
	dec selrow  
	jsr ramptr
	ldy #$00   
lc1f9	lda  ($50),y    ;16 Zeichen aus Ram 
	cmp #$22    	;Anführungszeichen: ende
	beq lc206  
	sta  ($fc),y    ;in Eingabe-String-Platz schreiben
	iny       
	cpy #$10   
	bne lc1f9  
lc206	tya     	;String in Variable
	ldy #$00   
	sta  ($fa),y            
	lda   $fc  
	iny       
	sta  ($fa),y            
	lda   $fd  
	iny       
	sta  ($fa),y            
	ldy #$00      
	beq +       	;unbedingt
	;------------------     
	;Beenden
lc21a	ldy #$00   
	tya       
	sta  ($fa),y	;Init Zeiger auf Variable
+	sty $c7     	;rvsoff
	lda #$37   
	sta   $01   	;ROM ein  
	rts 	    	;Ende      
	;------------------     
	;Umwandeln in BSCode (ohne Pi-Berücksichtigung)
lc224	cmp #$20   
	bcc lc238  
	cmp #$40   
	bcc lc237  
	cmp #$60   
	bcc lc23c  
	cmp #$80   
	bcc lc23c  
	sec       
	sbc #$80   
lc237	rts       
	;------------------     
lc238	clc       
	adc #$80   
	rts       
	;------------------     
lc23c	sec       
	sbc #$40   
	rts       
	;------------------         
skip12	lda #12 	;12 bytes
	sta   $a7  
lc24a	jsr iecin        
	dec   $a7  
	bne lc24a       ;überlesen
	rts          
	;------------------     
lc258	;Tasteneingabe, auf Pfeil links prüfen
	jsr getin  
	beq lc258	  
	cmp #$5f 	;Pfeil links
	bne lc26c  
	jsr clrchn 
	lda #$7f        ;127
	jsr close        
	jmp lc21a       ;beenden
	;------------------     
lc26c	jmp lc102  
	;------------------     
	;Farbe im Ausgabebereich setzen
color	lda #40 	;ab Zeile 2
	clc       
	adc startcol  
	sta   $f3	;Spalte Low-Byte 
	lda #$d8   
	sta   $f4	;Spalte High-Byte
	ldx #24 	;24 Zeilen
scl	lda $0286  	;Zeichenfarbe 
	ldy #$00   
sc2	sta  ($f3),y    ;Farbe setzen
	iny       
	cpy #18         ;Länge 16+2
	bne sc2  
	;nächste Zeile
	clc       
	lda   $f3
	adc #40           
	sta   $f3          
	bcc sc3  
	inc   $f4  
sc3	dex       
	bne scl  
	rts       
	;------------------   
	;Tab
lc240	!by $00
selrow	!by $00 	;Top-Of-Page RAM-Index bzw. RAM-Index des ausgewählten Eintrags (nach RETURN) 
currow	!by $00 	;aktuelle Bildschirmzeile 1-24
ramrow	!by $00 	;aktueller RAM-Eintrag
startcol !by $00	;Nummer der ersten Spalte
endcol  !by $00 	;Nummer der letzten Spalte
	;------------------ 

Mit folgendem BASIC-Programm kann man die directory-Routine testen:

10 IF A=0 THEN A=1:LOAD"DIRECTORY-V3",8,1
20 DL=12*4096:PRINT CHR$(147)CHR$(5)
30 PRINT "{HOME}{3 DOWN}_ = BEENDEN":PRINT"    OHNE AUSWAHL"
40 SYSDL,22,"$",F$
50 PRINT "{HOME}"CHR$(34)F$CHR$(34)
60 PRINT "{HOME}{6 DOWN}L = NEU LADEN"
70 GET A$:IF A$="" THEN 60
80 IF A$="L" THEN GOTO 20

Directory Test

SMON-Disassembler-Listing des Originals[Bearbeiten | Quelltext bearbeiten]

,C000  20 66 E5  JSR E566               
,C003  A9 10     LDA #10                
,C005  20 7D B4  JSR B47D               
,C008  86 FC     STX   FC               
,C00A  84 FD     STY   FD               
,C00C  20 FD AE  JSR AEFD               
,C00F  20 9E B7  JSR B79E               
,C012  8E 44 C2  STX C244               
,C015  8A        TXA                    
,C016  18        CLC                    
,C017  69 12     ADC #12                
,C019  8D 45 C2  STA C245               
,C01C  20 FD AE  JSR AEFD               
,C01F  20 9E AD  JSR AD9E               
,C022  20 A3 B6  JSR B6A3               
,C025  20 BD FF  JSR FFBD               
,C028  20 FD AE  JSR AEFD               
,C02B  20 8B B0  JSR B08B               
,C02E  85 FA     STA   FA               
,C030  84 FB     STY   FB               
,C032  A5 0D     LDA   0D               
,C034  D0 05     BNE C03B               
,C036  A2 16     LDX #16                
,C038  4C 3A A4  JMP A43A               
-----------------------------------     
,C03B  A9 7F     LDA #7F                
,C03D  A2 08     LDX #08                
,C03F  A0 60     LDY #60                
,C041  20 BA FF  JSR FFBA               
,C044  20 C0 FF  JSR FFC0               
,C047  A2 7F     LDX #7F                
,C049  20 C6 FF  JSR FFC6               
,C04C  A2 04     LDX #04                
,C04E  20 A5 FF  JSR FFA5               
,C051  24 90     BIT   90               
,C053  70 05     BVS C05A               
,C055  CA        DEX                    
,C056  D0 F6     BNE C04E               
,C058  F0 0B     BEQ C065  
-----------------------------------              
,C05A  20 CC FF  JSR FFCC               
,C05D  A9 7F     LDA #7F                
,C05F  20 C3 FF  JSR FFC3               
,C062  4C D9 C0  JMP C0D9               
-----------------------------------     
,C065  20 C5 C0  JSR C0C5               
,C068  AE 44 C2  LDX C244               
,C06B  F0 08     BEQ C075               
,C06D  A9 1D     LDA #1D                
,C06F  20 D2 FF  JSR FFD2               
,C072  CA        DEX                    
,C073  D0 FA     BNE C06F               
,C075  A2 15     LDX #15                
,C077  20 A5 FF  JSR FFA5               
,C07A  20 D2 FF  JSR FFD2               
,C07D  CA        DEX                    
,C07E  D0 F7     BNE C077               
,C080  A2 14     LDX #14                
,C082  20 A5 FF  JSR FFA5               
,C085  C9 22     CMP #22                
,C087  F0 09     BEQ C092               
,C089  24 90     BIT   90               
,C08B  70 CD     BVS C05A               
,C08D  CA        DEX                    
,C08E  D0 F2     BNE C082               
,C090  F0 C8     BEQ C05A      
-----------------------------------          
,C092  A0 00     LDY #00                
,C094  20 A5 FF  JSR FFA5               
,C097  91 50     STA  (50),Y            
,C099  C8        INY                    
,C09A  C0 10     CPY #10                
,C09C  D0 F6     BNE C094               
,C09E  A9 FF     LDA #FF                
,C0A0  91 50     STA  (50),Y            
,C0A2  88        DEY                    
,C0A3  B1 50     LDA  (50),Y            
,C0A5  F0 B3     BEQ C05A               
,C0A7  18        CLC                    
,C0A8  A5 50     LDA   50               
,C0AA  69 10     ADC #10                
,C0AC  85 50     STA   50               
,C0AE  90 02     BCC C0B2               
,C0B0  E6 51     INC   51               
,C0B2  E6 02     INC   02               
,C0B4  20 A5 FF  JSR FFA5               
,C0B7  20 A5 FF  JSR FFA5               
,C0BA  24 90     BIT   90               
,C0BC  70 9C     BVS C05A               
,C0BE  C9 22     CMP #22                
,C0C0  D0 F5     BNE C0B7               
,C0C2  4C 92 C0  JMP C092               
-----------------------------------     
,C0C5  A9 00     LDA #00                
,C0C7  85 02     STA   02               
,C0C9  85 50     STA   50               
,C0CB  A9 A0     LDA #A0                
,C0CD  85 51     STA   51               
,C0CF  A9 36     LDA #36                
,C0D1  85 01     STA   01               
,C0D3  A9 80     LDA #80                
,C0D5  8D 8A 02  STA 028A               
,C0D8  60        RTS                    
-----------------------------------     
,C0D9  A5 02     LDA   02               
,C0DB  D0 03     BNE C0E0               
,C0DD  4C 1A C2  JMP C21A               
-----------------------------------     
,C0E0  38        SEC                    
,C0E1  E9 18     SBC #18                
,C0E3  8D 40 C2  STA C240               
,C0E6  A9 00     LDA #00                
,C0E8  8D 41 C2  STA C241               
,C0EB  8D 43 C2  STA C243               
,C0EE  20 6D C1  JSR C16D               
,C0F1  A9 01     LDA #01                
,C0F3  8D 42 C2  STA C242               
,C0F6  20 D1 C1  JSR C1D1               
,C0F9  A9 00     LDA #00                
,C0FB  85 C6     STA   C6               
,C0FD  20 E4 FF  JSR FFE4               
,C100  F0 FB     BEQ C0FD               
,C102  C9 0D     CMP #0D                
,C104  D0 03     BNE C109               
,C106  4C E7 C1  JMP C1E7               
-----------------------------------     
,C109  C9 91     CMP #91                
,C10B  F0 33     BEQ C140               
,C10D  C9 11     CMP #11                
,C10F  D0 EC     BNE C0FD               
,C111  20 D1 C1  JSR C1D1               
,C114  EE 43 C2  INC C243               
,C117  EE 42 C2  INC C242               
,C11A  AD 43 C2  LDA C243               
,C11D  C5 02     CMP   02               
,C11F  D0 09     BNE C12A               
,C121  CE 42 C2  DEC C242               
,C124  CE 43 C2  DEC C243               
,C127  4C 3A C1  JMP C13A               
-----------------------------------     
,C12A  AD 42 C2  LDA C242               
,C12D  C9 19     CMP #19                
,C12F  D0 09     BNE C13A               
,C131  CE 42 C2  DEC C242               
,C134  EE 41 C2  INC C241               
,C137  20 6D C1  JSR C16D               
,C13A  20 D1 C1  JSR C1D1               
,C13D  4C FD C0  JMP C0FD               
-----------------------------------     
,C140  20 D1 C1  JSR C1D1               
,C143  CE 43 C2  DEC C243               
,C146  CE 42 C2  DEC C242               
,C149  AD 43 C2  LDA C243               
,C14C  C9 FF     CMP #FF                
,C14E  D0 09     BNE C159               
,C150  EE 42 C2  INC C242               
,C153  EE 43 C2  INC C243               
,C156  4C 67 C1  JMP C167               
-----------------------------------     
,C159  AD 42 C2  LDA C242               
,C15C  D0 09     BNE C167               
,C15E  EE 42 C2  INC C242               
,C161  CE 41 C2  DEC C241               
,C164  20 6D C1  JSR C16D               
,C167  20 D1 C1  JSR C1D1               
,C16A  4C FD C0  JMP C0FD               
-----------------------------------     
,C16D  20 B0 C1  JSR C1B0               
,C170  A9 29     LDA #29                
,C172  18        CLC                    
,C173  6D 44 C2  ADC C244               
,C176  85 52     STA   52               
,C178  A9 04     LDA #04                
,C17A  85 53     STA   53               
,C17C  A2 18     LDX #18                
,C17E  A0 00     LDY #00                
,C180  B1 50     LDA  (50),Y            
,C182  C9 FF     CMP #FF                
,C184  F0 29     BEQ C1AF               
,C186  C9 22     CMP #22                
,C188  D0 02     BNE C18C               
,C18A  A9 20     LDA #20                
,C18C  20 24 C2  JSR C224               
,C18F  91 52     STA  (52),Y            
,C191  C8        INY                    
,C192  C0 10     CPY #10                
,C194  D0 EA     BNE C180               
,C196  18        CLC                    
,C197  A5 50     LDA   50               
,C199  69 10     ADC #10                
,C19B  85 50     STA   50               
,C19D  90 02     BCC C1A1               
,C19F  E6 51     INC   51               
,C1A1  18        CLC                    
,C1A2  A5 52     LDA   52               
,C1A4  69 28     ADC #28                
,C1A6  85 52     STA   52               
,C1A8  90 02     BCC C1AC               
,C1AA  E6 53     INC   53               
,C1AC  CA        DEX                    
,C1AD  D0 CF     BNE C17E               
,C1AF  60        RTS                    
-----------------------------------     
,C1B0  A9 00     LDA #00                
,C1B2  85 51     STA   51               
,C1B4  AD 41 C2  LDA C241               
,C1B7  85 50     STA   50               
,C1B9  06 50     ASL   50               
,C1BB  26 51     ROL   51               
,C1BD  06 50     ASL   50               
,C1BF  26 51     ROL   51               
,C1C1  06 50     ASL   50               
,C1C3  26 51     ROL   51               
,C1C5  06 50     ASL   50               
,C1C7  26 51     ROL   51               
,C1C9  18        CLC                    
,C1CA  A5 51     LDA   51               
,C1CC  69 A0     ADC #A0                
,C1CE  85 51     STA   51               
,C1D0  60        RTS                    
-----------------------------------     
,C1D1  AE 42 C2  LDX C242               
,C1D4  20 F0 E9  JSR E9F0               
,C1D7  AC 44 C2  LDY C244               
,C1DA  B1 D1     LDA  (D1),Y            
,C1DC  49 80     EOR #80                
,C1DE  91 D1     STA  (D1),Y            
,C1E0  C8        INY                    
,C1E1  CC 45 C2  CPY C245               
,C1E4  D0 F4     BNE C1DA               
,C1E6  60        RTS                    
-----------------------------------     
,C1E7  18        CLC                    
,C1E8  AD 42 C2  LDA C242               
,C1EB  6D 41 C2  ADC C241               
,C1EE  8D 41 C2  STA C241               
,C1F1  CE 41 C2  DEC C241               
,C1F4  20 B0 C1  JSR C1B0               
,C1F7  A0 00     LDY #00                
,C1F9  B1 50     LDA  (50),Y            
,C1FB  C9 22     CMP #22                
,C1FD  F0 07     BEQ C206               
,C1FF  91 FC     STA  (FC),Y            
,C201  C8        INY                    
,C202  C0 10     CPY #10                
,C204  D0 F3     BNE C1F9               
,C206  98        TYA                    
,C207  A0 00     LDY #00                
,C209  91 FA     STA  (FA),Y            
,C20B  A5 FC     LDA   FC               
,C20D  C8        INY                    
,C20E  91 FA     STA  (FA),Y            
,C210  A5 FD     LDA   FD               
,C212  C8        INY                    
,C213  91 FA     STA  (FA),Y            
,C215  A9 37     LDA #37                
,C217  85 01     STA   01               
,C219  60        RTS                    
-----------------------------------     
,C21A  A9 00     LDA #00                
,C21C  A8        TAY                    
,C21D  91 FA     STA  (FA),Y            
,C21F  A9 37     LDA #37                
,C221  85 01     STA   01               
,C223  60        RTS                    
-----------------------------------     
,C224  C9 20     CMP #20                
,C226  90 10     BCC C238               
,C228  C9 40     CMP #40                
,C22A  90 0B     BCC C237               
,C22C  C9 60     CMP #60                
,C22E  90 0C     BCC C23C               
,C230  C9 80     CMP #80                
,C232  90 08     BCC C23C               
,C234  38        SEC                    
,C235  E9 80     SBC #80                
,C237  60        RTS                    
-----------------------------------     
,C238  18        CLC                    
,C239  69 80     ADC #80                
,C23B  60        RTS                    
-----------------------------------     
,C23C  38        SEC                    
,C23D  E9 40     SBC #40                
,C23F  60        RTS                    
-----------------------------------     
:C240 00 00 00 00 00 00

Beispieldiskette[Bearbeiten | Quelltext bearbeiten]

Die Beispieldiskette HOMENTC1.D64 aus The Complete Home Entertainment Centre (Sammlung) soll die Arbeitsweise des Programms nachvollziehbar machen. Sie eignet sich deshalb gut, weil sie ein kurzes Directory und Dateien mit ein-, zwei- und dreistelligen Blockgrößen besitzt.

0 "TCHEC DISK 1    " A2 2A
1    "LOADER"           PRG 
138  "BRIPRG"           PRG 
143  "MAHPRG"           PRG 
1    "TCHECLOAD"        PRG 
41   "SCREEN"           PRG 
154  "CHSPRG"           PRG 
186 BLOCKS FREE.

Das folgende TSB-Programm liest das Directory aus und listet die Bytes in hexadezimaler Form:

10 OPEN 1,8,0,"$":I=0
20 GET#1,D$:I=I+1
30 A=ASC(D$+CHR$(0))
40 PRINT $$A;" ";:REM TSB
50 IF I=13 THEN PRINT:I=0
60 IF ST=0 THEN 20 

Als Ausgabe erhält man

01 04 01 01 00 00 12 22 54 43 48 45 43
20 44 49 53 4b 20 31 20 20 20 20 22 20
41 32 20 32 41 00 01 01 01 00 20 20 20
22 4c 4f 41 44 45 52 22 20 20 20 20 20
20 20 20 20 20 20 50 52 47 20 20 00 01
01 8a 00 20 22 42 52 49 50 52 47 22 20
20 20 20 20 20 20 20 20 20 20 50 52 47
20 20 20 20 00 01 01 8f 00 20 22 4d 41
48 50 52 47 22 20 20 20 20 20 20 20 20
20 20 20 50 52 47 20 20 20 20 00 01 01
01 00 20 20 20 22 54 43 48 45 43 4c 4f
41 44 22 20 20 20 20 20 20 20 20 50 52
47 20 20 00 01 01 29 00 20 20 22 53 43
52 45 45 4e 22 20 20 20 20 20 20 20 20
20 20 20 50 52 47 20 20 20 00 01 01 9a
00 20 22 43 48 53 50 52 47 22 20 20 20
20 20 20 20 20 20 20 20 50 52 47 20 20
20 20 00 01 01 ba 00 42 4c 4f 43 4b 53
20 46 52 45 45 2e 20 20 20 20 20 20 20
20 20 20 20 20 20 00 00 00

Jeder Eintrag hat eine Länge von 31 Bytes.

  • Diskettenname
 2 Bytes Startadresse 0401 Low/High
 2 Bytes Linkadresse  0101 Low/High
-- Ab hier Ausgabe von 21 Bytes
 1 Byte (drivenumber) Zeilennummer Low
 1 Byte Zeilennummer High 00
 1 RVSON
 1 "
16 Diskettenname
 1 "
-- 
 1 Leerzeichen
 4 ID 
 1 Endemarkierung 00
  • Dateiname
 2 Linkadresse 0101 Low/High
 2 Blocks (Low/High)
-- 26 Bytes Directory-Eintrag: 
 1-3 Leerzeichen (je nachdem, ob Blockanzahl drei-, zwei- oder einstellig) *1)
 1 "
16 Dateiname, ab Endezeichen " ev. mit Leerzeichen aufgefüllt
 1 Leerzeichen
 3 Dateityp ("PRG", "SEQ", "DEL" o.a.)
 2-4 Leerzeichen, je nach Blockanzahl (ein-, zwei- oder dreistellig) *1)
--
 1 Endemarkierung 00
*1) diese beiden Byte-Folgen haben zusammen also immer die Länge 5 (1+4, 2+3 oder 3+2).

Die Load dir Routine der 1541 ist dokumentiert bei aay c1541.


Weblinks[Bearbeiten | Quelltext bearbeiten]

64'er Sonderheft 15 auf archive.org