home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Power-Programmierung
/
CD1.mdf
/
assemblr
/
library
/
lib4a86
/
demo
/
extdos.dem
< prev
next >
Wrap
Text File
|
1992-02-16
|
17KB
|
707 lines
; ----------------------------
; EXTDOS.DEM - Demoprogramm für die Routinen aus EXTDOS_.LIB und EXTDOS.MAB
; (für den A86)
;
; (c) Bernd Schemmer 1990 - 1992
; Letzter Update: 15.02.1992
;
; Übersetzen:
; A86 MACROS.MAC EXTDOS.MAB EXTDOS.DEM EXTDOS.LIB DEMOS.INC TO EXTDOS_.COM
; ---------------------------
jmp start ; Daten überspringen
logo db CR,LF
db 'EXTDOS.DEM - Demoprogramm für die Routinen aus EXTDOS.LIB und EXTDOS.MAB'
db CR,LF
db '-------------------------------------------------------------------------'
db CR,LF
db CR,LF
GETLENGTH logo
start:
call ShowLogo ; Logo ausgeben und Speicherblock verkleinern
TestDOSVersion ; DOS-Version überprüfen
call CheckSTDIN_STDOUT
call ShowHandleTab
call ExpandHandleTab
jc >l1 ; Fehler
call ShowHandleTab
l1:
call ShowPause
jc Ende
call ShowConfigData
call ShowPause
jc Ende
call ShowLogLws
call ShowPause
jc Ende
call ShowDevices
call ShowDPBs
call ShowPause
jc Ende
call ShowMisc
call ShowPause
jc Ende
call ShowMCBS
; Die folgenden Routinen werden nur unter DOS 4+ ausgeführt:
;
call ShowSCBs
call ShowDOS4xxBufferData
Ende:
EndProcess 0
; ----------------------------
; ShowDOS4xxBufferData
;
; Funktion: Ausgabe der Strukturen für die Puffer-Verwaltung
; unter DOS 4.xx
;
DOS4xxBufferDataMSG db CR,LF
db 'Adresse des Puffer-Info-Blocks: '
l013 db 'xxxx:xxxx',CR,LF
db 'Adresse des Hash-Chain-Arrays: '
l014 db 'xxxx:xxxx',CR,LF
db 'Anzahl Einträge im Hash-Chain-Array: '
l015 db 'xxxxh',CR,LF
db 'Adresse der Look-Ahead-Puffer: '
l016 db 'xxxx:xxxx',CR,LF
db 'Anzahl der Look-Ahead-Puffer: '
l017 db 'xxxxh',CR,LF
GETLENGTH DOS4xxBufferDataMSG
ShowDOS4xxBufferData:
mov ah,030h
int 021h
cmp al,04
je >l1
ret ; falsche DOS-Version
l1:
call ShowPause
jc ret
GetPIBAdress
mov ax,es
mov es,cs
mov di,offset l013
call Konvert_AX_To_Hexstring
mov ax,bx
inc di
call Konvert_AX_To_Hexstring
GetHashChainAdress
mov ax,es
mov es,cs
mov di,offset l014
call Konvert_AX_To_Hexstring
mov ax,bx
inc di
call Konvert_AX_To_Hexstring
mov ax,cx
mov di,offset l015
call Konvert_AX_To_Hexstring
GetLookAheadAdress
mov ax,es
mov es,cs
mov di,offset l016
call Konvert_AX_To_Hexstring
mov ax,bx
inc di
call Konvert_AX_To_Hexstring
mov ax,cx
mov di,offset l017
call Konvert_AX_To_Hexstring
WRITE_STRING DOS4xxBufferDataMSG
ret
; ----------------------------
; ShowSCBs
;
; Funktion: Ausgabe der SCBs (nur DOS 4+)
;
SCBMsg db CR,LF
db 'Akt. SCB-Daten: '
db CR,LF
db CR,LF
db ' Adresse Seg. Länge (in Paragraphen) ID'
db CR,LF
db '------------------------------------------------'
db CR,LF
GETLENGTH SCBMsg
SCBLine db 'xxxx:xxxx '
_SCBMainSeg db 'xxxxh '
_SCBLength db 'xxxxh '
_SCBID db 'x '
db CR,LF
GETLENGTH SCBLine
ShowSCBs:
mov ah,030h
int 021h
cmp al,03
ja >l1
ret
l1:
WRITE_STRING SCBMsg
GetFirstSCBAdress ; ES:BX -> 1. SCB
l0:
push es,bx ; Adresse des akt. SCB sichern
push es:SCB_MainSegment
push es:MCB_BLock_Length
mov al,es:SCB_ID_BYTE
mov cs:_SCBID,al
mov ax,es
mov es,cs ; ES = CS
mov di,offset SCBLINE
call Konvert_AX_To_Hexstring
mov ax,bx
inc di
call Konvert_AX_To_Hexstring
pop ax
mov di,offset _SCBLength
call Konvert_AX_To_Hexstring
pop ax
mov di,offset _SCBMainSeg
call Konvert_AX_To_Hexstring
WRITE_STRING SCBLine
pop bx,es
GetNextSCBAdress
jnz l0
mov es,cs
ret
; ----------------------------
; ShowDPBs
;
; Funktion: Ausgabe der DPBs
;
DPBMsg db CR,LF
db 'Akt. DPB-Daten: '
db CR,LF
GETLENGTH DPBMsg
DPBLine db
db 'xxx. DPB: bei '
l017 db 'xxxx:xxxx',CR,LF
GETLENGTH DPBLine
ShowDPBs:
WRITE_STRING DPBMsg
GetFirstDPB ; ES:BX -> 1. DPB
mov cx,1 ; CX = Zähler
l0:
push es,bx ; Adresse des akt. DPB sichern
mov ax,es
mov es,cs ; ES = CS
mov di,offset l017
call Konvert_AX_To_Hexstring
mov ax,bx
inc di
call Konvert_AX_To_Hexstring
mov ax,cx
mov di,offset DPBLine
call Konvert_AL_To_Dezstring
inc cx
push cx
WRITE_STRING DPBLine
pop cx
pop bx,es
GetNextDPB
jnz l0
mov es,cs
ret
; ----------------------------
; ShowMisc
;
; Funktion: Ausgabe verschiedener undokumentierter DOS-Werte
;
ShowMiscMSG db CR,LF
db 'Verschiedene undokumentierte DOS-Werte: '
db CR,LF
db 'Switch-Character: '
l010 db 'x',CR,LF
db 'Adresse des DOS-Busy-Flags: '
l011 db 'xxxx:xxxx',CR,LF
db 'Adresse des Critical-Error-Flags: '
l012 db 'xxxx:xxxx',CR,LF
GETLENGTH ShowMiscMSG
ShowMisc:
mov al,0
GetSetSwitchChar
mov cs:L010,dl
GetBusyFlagAdress
mov ax,es
mov es,cs
mov di,offset l011
call Konvert_AX_To_Hexstring
mov ax,bx
inc di
call Konvert_AX_To_Hexstring
GetCriticalErrorFlagAdress
mov ax,es
mov es,cs
mov di,offset l012
call Konvert_AX_To_Hexstring
mov ax,bx
inc di
call Konvert_AX_To_Hexstring
WRITE_STRING ShowMiscMSG
ret
; ----------------------------
; ShowMCBs
;
; Funktion: Ausgabe der MCBs
;
MCBMsg db CR,LF
db 'Akt. MCB-Daten: '
db CR,LF
db CR,LF
db ' Adresse PSP Länge (in Paragraphen)'
db CR,LF
db '-------------------------------------------'
db CR,LF
GETLENGTH MCBMsg
MCBLine db 'xxxx:xxxx '
_MCBPSP db 'xxxxh '
_MCBLength db 'xxxxh '
db CR,LF
GETLENGTH MCBLine
ShowMCBs:
WRITE_STRING MCBMsg
GetFirstMCBAdress ; ES:BX -> 1. MCB
l0:
push es,bx ; Adresse des akt. MCB sichern
push es:MCB_PSP_Segment
push es:MCB_BLock_Length
mov ax,es
mov es,cs ; ES = CS
mov di,offset MCBLINE
call Konvert_AX_To_Hexstring
mov ax,bx
inc di
call Konvert_AX_To_Hexstring
pop ax
mov di,offset _MCBLength
call Konvert_AX_To_Hexstring
pop ax
mov di,offset _MCBPSP
call Konvert_AX_To_Hexstring
WRITE_STRING MCBLine
pop bx,es
GetNextMCBAdress
jnz l0
mov es,cs
ret
; ----------------------------
; ShowDevices
;
; Funktion: Ausgabe der Daten des CON- und des NUL-Devices
;
ConDeviceName db 'CON '
NulDeviceName db 'NUL '
ShowDeviceMSG0 db CR,LF
db 'Ermittle die Daten des CON- und des NUL-Devices'
db CR,LF
GETLENGTH ShowDeviceMSG0
ShowDeviceMSG1 db CR,LF
db 'Daten des CON-Devices: '
db CR,LF
db 'Adresse des Device-Headers: '
l001 db 'xxxx:xxxx'
db CR,LF
db 'Attribut des Devices: '
l002 db 'xxxxh'
db CR,LF
GETLENGTH ShowDeviceMSG1
ShowDeviceMSG2 db CR,LF
db 'Daten des NUL-Devices: '
db CR,LF
db 'Adresse des Device-Headers: '
l003 db 'xxxx:xxxx'
db CR,LF
db 'Attribut des Devices: '
l004 db 'xxxxh'
db CR,LF
GETLENGTH ShowDeviceMSG2
CONDeviceError db 'Fehler: CON-Device nicht gefunden!'
db CR,LF
GETLENGTH ConDeviceError
NULDeviceError db 'Fehler: NUL-Device nicht gefunden!'
db CR,LF
GETLENGTH NULdeviceError
ShowDevices:
WRITE_STRING ShowDeviceMSG0
mov si,offset ConDeviceName
call SearchCharDevice
jnc >l1
WRITE_STRING ConDeviceError
jmp >l2
l1:
push ax
mov ax,es
mov es,cs
mov di,offset l001
call Konvert_AX_To_Hexstring
mov ax,bx
inc di
call Konvert_AX_To_Hexstring
pop ax
mov di,offset l002
call Konvert_AX_To_Hexstring
WRITE_STRING ShowDeviceMSG1
l2:
mov si,offset NulDeviceName
call SearchCharDevice
jnc >l1
WRITE_STRING NulDeviceError
jmp >l2
l1:
push ax
mov ax,es
mov es,cs
mov di,offset l003
call Konvert_AX_To_Hexstring
mov ax,bx
inc di
call Konvert_AX_To_Hexstring
pop ax
mov di,offset l004
call Konvert_AX_To_Hexstring
WRITE_STRING ShowDeviceMSG2
l2:
ret
; ----------------------------
; ShowLogLws
;
; Funktion: Ausgabe der Belegungs-Art aller belegten Laufwerke
;
ShowLogLwMSG db CR,LF
db 'Belegungs-Art der belegten Laufwerke: '
db CR,LF
GETLENGTH ShowLogLwMSG
ShowLogLine db CR,LF
db 'Laufwerk '
_l006 db 'x: -> '
GETLENGTH ShowLogLine
_physical db 'physikalisch'
_Subst db 'SUBST '
_Join db 'JOIN '
_Network db 'NETWORK '
_IFS db 'IFS '
_Unknown db 'unbekannt '
L007 EQU $ - Offset _Unknown
ShowLogLws:
WRITE_STRING ShowLogLwMSG
GetDIBAdress
mov al,es:DIB_LogicalLWs ; AL = letztes log. Laufwerk
xor ah,ah
mov cx,ax ; CX = max. mögliche Anzahl log. Laufwerke
mov es,cs
mov ax,1
mov bl,'A'
l0:
push cx
push ax
push bx
mov _l006,bl ; Laufwerks-Bezeichner eintragen
call GetDriveArt ; Laufwerks-Art ermitteln
jc >l2 ; sollte nicht vorkommen!
; Meldung ermitteln
or ax,ax
jz >l10 ; log. Laufwerk nicht belegt
mov dx,offset _physical
cmp ax,04000h
je >l1
mov dx,offset _subst
cmp ax,05000h
je >l1
mov dx,offset _join
cmp ax,06000h
je >l1
mov dx,offset _network
cmp ax,08000h
je >l1
mov dx,offset _ifs ; nur bei 4.xx möglich!
cmp ax,0C000h
je >l1
mov dx,offset _unknown
l1:
push dx
WRITE_STRING ShowLogLine
pop dx
mov cx,L007
mov bx,01h
mov ah,040h
int 021h
l10:
pop bx
pop ax
pop cx
inc ax
inc bx
loop l0
l2:
call ShowCR_LF
ret
; ----------------------------
; ShowConfigData
;
; Funktion: Gibt einige Daten aus der CONFIG-Datei aus
;
ConfigData db CR,LF
db 'Daten einiger CONFIG-Befehle: '
db CR,LF
db CR,LF
db 'BUFFERS = '
l002 db '?????'
db CR,LF
db 'FILES = '
l003 db '????? (belegt: '
l0031 db '?????)'
db CR,LF
db 'FCBS = '
l004 db '?????,?????'
db CR,LF
db 'LASTDRIVE = '
l005 db '?:'
db CR,LF
GETLENGTH ConfigData
ShowConfigData:
call CountBuffers
mov di,offset l002
call Konvert_AX_To_Dezstring
call CountSDL
push ax
mov ax,cx
mov di,offset l003
call Konvert_AX_To_Dezstring
pop ax
mov di,offset l0031
call Konvert_AX_To_Dezstring
call CountFCBs
push ax
mov ax,cx
mov di,offset l004
call Konvert_AX_To_Dezstring
inc di
pop ax
call Konvert_AX_To_Dezstring
GetDIBAdress
mov al,es:DIB_LogicalLWs ; AL = letztes log. Laufwerk
add al,'@'
mov l005,al
mov es,ds
WRITE_STRING ConfigData
ret
; ----------------------------
; ExpandHandleTab
;
; Funktion: Vergrößert die lokale Handle-Tabelle auf 40 Einträge
;
ExpandHandleTabMSG db CR,LF
db 'Vergrößere die lokale Handle-Tabelle auf 40 Einträge'
db CR,LF
db '(wird von der internen Routine auf 41 gerundet!)'
db CR,LF
GETLENGTH ExpandHandleTabMSG
ExpandHandleTabError db CR,LF
db 'Fehler: Konnte die Handle-Tabelle nicht erweitern!'
db CR,LF
GETLENGTH ExpandHandleTabError
ExpandHandleTab:
WRITE_STRING ExpandHandleTabMSG
mov bx,040xD
call SetMaxFile
jnc >l1
WRITE_STRING ExpandHandleTabError
stc
l1:
ret
; ----------------------------
; ShowHandleTab
;
; Funktion: Ausgabe der lokalen Handle-Tabelle
;
LokalHandleTab db CR,LF
db 'Daten der lokalen Handle-Tabelle: '
db CR,LF
db 'max. mögliche Anzahl von Einträgen: '
_l000 db '???'
db CR,LF
db 'Anzahl der belegten Einträge: '
_l001 db '???'
db CR,LF
GETLENGTH LokalHandleTab
ShowHandleTab:
call GetMaxFile
mov di,offset _l001
call Konvert_AL_To_Dezstring
mov ax,cx
mov di,offset _l000
call Konvert_AL_To_Dezstring
WRITE_STRING LokalHandleTab
ret
; ----------------------------
; CheckSTDIN_STDOUT
;
; Funktion: Überprüft ob die Ein- oder Ausgabe umgeleitet ist
;
Stdin1 db 'Die Standard-Eingabe ist umgeleitet.'
db CR,LF
GETLENGTH StdIn1
Stdin2 db 'Die Standard-Eingabe ist nicht umgeleitet.'
db CR,LF
GETLENGTH StdIn2
StdOut1 db 'Die Standard-Ausgabe ist umgeleitet.'
db CR,LF
GETLENGTH StdOut1
StdOut2 db 'Die Standard-Ausgabe ist nicht umgeleitet.'
db CR,LF
GETLENGTH STdOut2
Stdin3 db 'Sie kommt aus der Datei/dem Gerät >>'
StdIn_ db ' <<'
db CR,LF
GETLENGTH StdIn3
Stdout3 db 'Sie geht auf die Datei/das Gerät >>'
StdOut_ db ' <<'
db CR,LF
GETLENGTH STDOut3
CheckSTDIN_STDOUT:
; Name von STDIN und STDOUT ermitteln
mov di,offset StdIn_
mov bx,0 ; 0 = Handle für STDIN
call GetHandleName
mov di,offset StdOut_
mov bx,01 ; 1 = Handle für STDOUT
call GetHandleName
call StandardIO? ; STDIN/STDOUT umgeleitet?
push ax
mov dx,offset StdIn2
mov cx,StdIn2_LENGTH
cmp al,1
je >l1
mov dx,offset StdIn1
mov cx,StdIn1_LENGTH
l1:
mov bx,01h
mov ah,040h
int 021h
mov dx,offset StdIn3
mov cx,StDin3_LENGTH
mov ah,040h
int 021h
pop ax
xchg ah,al
mov dx,offset StdOut2
mov cx,StdOut2_LENGTH
cmp al,1
je >l1
mov dx,offset StdOut1
mov cx,StdOut1_LENGTH
l1:
mov bx,01h
mov ah,040h
int 021h
mov dx,offset StdOut3
mov cx,StdOut3_LENGTH
mov ah,040h
int 021h
ret