home *** CD-ROM | disk | FTP | other *** search
- ; ----------------------------
- ; 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
-
-