Code: Alles auswählen
.MODEL SMALL
.386
.CODE
ORG 100h
mov ax, 1112h ; 8x8 Matrix 50 Zeilen
xor bl, bl
int 10h
mov ax, @DATA ; Daten-Segment bestimmen
mov ds, ax
mov ax, 0B800h ; Bild-Segment bestimmen
mov es, ax
;═════════════════════════════════════════════════════════════════════════
; Bildschirm loeschen
;═════════════════════════════════════════════════════════════════════════
xor di, di
mov cx, 9E8h
mov eax, 1B201B20h
rep stosd
mov di, 1EA0h
mov cx, 28h
mov eax, 2B202B20h
rep stosd
;═════════════════════════════════════════════════════════════════════════
; Rahmen-malen
;═════════════════════════════════════════════════════════════════════════
xor di, di
mov al, 0C9h ; 1 mal "╔" ausgeben
stosw
mov cx, 27h
mov eax, 1BCD1BCDh ; 78 mal "═" ausgeben
rep stosd
mov al, 0BBh ; 1 mal "╗" ausgeben
stosw
mov al, 0BAh ; 47 mal "║" ausgeben
mov cx, 2Fh
P1: stosb
add di, 9Dh
stosw ; 47 mal "║" ausgeben
loop P1
mov al, 0C8h ; 1 mal "╚" ausgeben
stosw
mov al, 0CDh ; 78 mal "═" ausgeben
mov cl, 27h
rep stosd
mov al, 0BCh ; 1 mal "╝" ausgeben
stosb
mov al, 0BAh ; 47 mal "║" ausgeben
mov di, 0BAh
mov cx, 2Fh
P2: stosb
add di, 19h
stosb
add di, 19h
stosb
inc di
stosb
add di, 19h
stosb
add di, 19h
stosb
add di, 35h
loop P2
mov eax, 1BC41BC4h ; 78 mal "─" ausgeben
mov di, 1CC2h
mov cl, 27h
rep stosd
mov al, 0CBh ; 5 mal "╦" ausgeben
mov di, 1Ah
stosb
add di, 19h
stosb
add di, 19h
stosb
inc di
stosb
add di, 19h
stosb
add di, 19h
stosb
mov al, 0CAh ; 5 mal "╩" ausgeben
mov di, 1E1Ah
stosb
add di, 19h
stosb
add di, 19h
stosb
inc di
stosb
add di, 19h
stosb
add di, 19h
stosb
mov al, 0D7h ; "Î" ausgeben
mov di, 1CDAh
stosb
add di, 19h
stosb
add di, 19h
stosb
inc di
stosb
add di, 19h
stosb
add di, 19h
stosb
mov al, 0C7h ; "Ã" ausgeben
mov di, 1CC0h
stosb
mov al, 0B6h ; "Â" ausgeben
add di, 9Dh
stosb
;═════════════════════════════════════════════════════════════════════════
; LABEL des Laufwerks ausgeben
;═════════════════════════════════════════════════════════════════════════
mov dl, 2 ; Laufwerk setzen (0=A;1=B usw.)
mov ds:[LAUF], dl
LA: mov ah, 0Eh
int 21h
;--------------------------------------
mov cx, 8 ; Attribute LABEL
call ERE ; ersten Verzeichniss-Eintrag holen
jc DOS
;--------------------------------------
call DITA ; DTA holen
mov dl, LAUF
sbb dl, 2
;--------------------------------------
push ds
push es
pop ds
mov ax, 0B800h
mov es, ax
;--------------------------------------
mov di, 0A6h
mov ax, 1Ah
mul dl
add di, ax
mov ah, 1Eh ; Farbe
mov cx, 1Eh ; Zaehler
;--------------------------------------
ILES: mov al, ds:[bx] ; ASCII holen
cmp al, 0 ; Namens-Ende erreicht ?
jz FILEN
cmp al, 60h ; Klein-Buchstaben ?
jna KLE
sbb al, 20h ; gross machen
KLE: stosw
inc bx
inc cx
cmp cx, 2Bh ; schon ganzer Name
jnz ILES
FILEN: pop ds
;═════════════════════════════════════════════════════════════════════════
; File-Tabelle anlegen
;═════════════════════════════════════════════════════════════════════════
mov cx, 21h ; Attribut alle, ohne System/Hidden/Sub/Label
call ERE ; ersten Verzeichniss-Eintrag holen
jc DOS
;--------------------------------------
call DITA ; DTA holen = BX
lea bp, TAB ; Zeiger auf Rett-Tabelle
xor si, si
;--------------------------------------
NEXT: mov bx, DTA ; Zeiger holen
mov cx, 0Ch ; Zaehler
LESE: mov al, es:[bx] ; ASCII holen
;--------------------------------------
cmp al, 0 ; Ende erreicht ?
jz FILEND
cmp al, "." ; schon Punkt erreicht ?
jnz FEN
;--------------------------------------
add bp, cx
mov cl, 4 ; nur noch 4 Zeichen
sbb bp, cx
mov al, 20h ; Space
jmp GRO
;--------------------------------------
FEN: cmp al, 5Bh ; Gross-Buchstaben ?
jnb GRO
cmp al, 40h ; Gross-Buchstaben ?
jb GRO
add al, 20h ; klein machen
;--------------------------------------
GRO: mov ds:[bp], al ; in Tabelle ablegen
inc bp
inc bx
loop LESE
;--------------------------------------
FILEND: inc si
add bp, cx
mov cx, 21h ; Attribute alle, ohne System/Hidden/Sub/Label
call NEH ; Naechsten Eintrag holen
jnc NEXT
;═════════════════════════════════════════════════════════════════════════
call ESORT
;═════════════════════════════════════════════════════════════════════════
call NILOU ; alle File-Namen eines Laufwerks ausgeben
;═════════════════════════════════════════════════════════════════════════
call FTR ; Tabellen-Bereich loeschen
;═════════════════════════════════════════════════════════════════════════
call LFOUT ; oben Ausgabe des Laufwerks Buchstaben
;═════════════════════════════════════════════════════════════════════════
inc BYTE PTR[LAUF] ; Laufwerk erhoehen
mov dl, BYTE PTR[LAUF]
cmp dl, 5
jnz LA
;═════════════════════════════════════════════════════════════════════════
;═════════════════════════════════════════════════════════════════════════
;═════════════════════════════════════════════════════════════════════════
; unten Eingabezeile: Pfad/Laufwerk ausgeben
;═════════════════════════════════════════════════════════════════════════
mov dx, 3 ; Laufwerk setzen (0=A;1=B usw.)
mov ah, 0Eh
int 21h
;--------------------------------------
mov ah, 19h ; aktuelle Laufwerks-Nr. holen
int 21h
inc al
;--------------------------------------
lea si, PFAD ; Pfad holen
mov dl, al
mov ah, 47h
int 21h
jc DOS
;--------------------------------------
xor cl, cl
lea bx, LFW
add bx, dx
mov al, [bx] ; Laufwerks-Ascii holen
mov ah, 2Fh
mov di, 1EA0h
stosw ; Laufwerk
mov al, ":" ; Doppelpunkt
stosw
mov al, "\" ; Backslash
SUCH0: stosw
lodsb ; Pfad
inc cl
cmp al, 0
jnz SUCH0
mov al, ">" ; Backslash
stosw
;--------------------------------------
mov dh, 31h ; Coursor setzen
mov dl, 3
add dl, cl
xor bh, bh
mov ah, 2
int 10h
;═════════════════════════════════════════════════════════════════════════
DOS: mov ax, 1
int 16h
mov ax, 4C00h
int 21h
;═════════════════════════════════════════════════════════════════════════
;═══════════════ S U B ═══════════════════════════════════════════════════
;═════════════════════════════════════════════════════════════════════════
ERE: mov ah, 4Eh ; Ersten Verzeichniss-Eintrag holen
xor si, si ; Anzahl der Namen
lea dx, NAM ; NAME DS:DX
int 21h
ret
;═════════════════════════════════════════════════════════════════════════
NEH: mov ah, 4Fh ; Naechsten Eintrag holen
lea dx, NAM ; NAME DS:DX
int 21h
ret
;═════════════════════════════════════════════════════════════════════════
DITA: mov ah, 2Fh ; DTA holen
int 21h ; OUT: ES:BX (Disk Tranfer Adress)
add bx, 1Eh ; Zeiger auf Namen (DTA: 1E - 2A)
mov ds:[DTA], bx ; Zeiger retten
ret
;═════════════════════════════════════════════════════════════════════════
; sortierung der filenamen Extensionen nach dem Alphabeth
;═════════════════════════════════════════════════════════════════════════
ESORT: xor cx, cx
mov di, 09h
mov bp, di
ES0: mov al, BYTE PTR[TAB + di]
ES1: add bp, 0Ch
inc cx
cmp cx, si
jz ES2
cmp al, BYTE PTR[TAB + bp]
ja ES1
mov di, bp
jmp ES0
ES2:
ret
;═════════════════════════════════════════════════════════════════════════
; alle File-Namen eines Laufwerks ausgeben
;═════════════════════════════════════════════════════════════════════════
NILOU: mov fs, si ; Anzahl retten
mov ax, 0B800h
mov es, ax
lea si, TAB ; Zeiger auf Tabelle
mov bp, fs
mov dh, 2 ; ZEILE 2
;--------------------------------------
FILOUT: mov ax, 0A0h ; max.Spalte
mul dh ; mal Zeile
mov di, ax
add di, 2
mov bl, LAUF
sbb bl, 2
mov ax, 1Ah ; Tab.
mul bl
add di, ax ; nur dl dazu
;--------------------------------------
mov ah, 1Bh ; Farbe
mov cx, 0Ch ; laenge des File-Namens
NEFI: lodsb ; File-Namen ausgeben
stosw
loop NEFI
;--------------------------------------
cmp dh, 2Dh ; schon letzte Zeile ?
jz FUT
inc dh
;--------------------------------------
dec bp ; schon letztes File ?
jnz FILOUT
FUT: ret
;═════════════════════════════════════════════════════════════════════════
; Tabellen-Bereich loeschen
;═════════════════════════════════════════════════════════════════════════
FTR: mov ax, @DATA
mov es, ax
lea di, TAB
mov ax, 0Eh
mov si, fs
mul si
shr ax, 2
mov cx, ax
mov eax, 2020h
rep stosd
mov ax, 0B800h
mov es, ax
ret
;═════════════════════════════════════════════════════════════════════════
; oben Ausgabe des Laufwerks Buchstaben
;═════════════════════════════════════════════════════════════════════════
LFOUT: xor dh, dh
mov dl, LAUF
sbb dl, 2
mov ax, 1Ah
mul dl
mov di, 8
add di, ax
mov ax, 1F20h
stosw
mov dl, LAUF
lea bx, LFW
add bx, dx
inc bx
mov al, [bx] ; Laufwerks-Ascii holen
stosw
mov al, 3Ah
stosw
mov al, 5Ch
stosw
mov al, 20h
stosw
ret
;═════════════════════════════════════════════════════════════════════════
.DATA
LAUF DB 2 ; Dos-Laufwerk setzen dl=Laufwerk
NAM DB 2Ah, 2Eh, 2Ah, 0 ; alle Files "*.*"
LFW DB "0ABCDEFGHIJKLMNOPQRSTUVWXYZ" ; Tabelle der Laufwerks-Ascii
DTA DW 0080h ; Offset der DTA
PFAD DB 64 DUP (0) ; aktueller Pfad
TAB DB ? ; Tabelle der Namens-Eintraege
org 4000h
TABS DB ? ; Tabelle der sortierten Namens-Eintraege
;═════════════════════════════════════════════════════════════════════════
org 8000h
.STACK 20h
END