home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / dtx9101 / utils / devcom / devcom.asm next >
Encoding:
Assembly Source File  |  1991-09-28  |  21.5 KB  |  598 lines

  1. ;* ------------------------------------------------------ *
  2. ;*                      DEVCOM.ASM                        *
  3. ;*         (C) 1991 Ulrich Schmitz & DOS - toolbox        *
  4. ;* ------------------------------------------------------ *
  5. ;*  Programm verwaltet System- und andere Device-Treiber  *
  6. ;* ------------------------------------------------------ *
  7.  
  8. TITLE DEVCOM.ASM
  9. page  63,130                     ;Drucken mit Schmalschrift
  10.  
  11. ; Assemblieren mit Microsoft Macroassembler ab Version 5.0
  12. ; oder kompatiblem Assembler
  13. ;
  14. ; Aufruf: ASSCOM DEVCOM
  15. ; oder
  16. ;
  17. ; MASM DEVCOM;
  18. ; LINK DEVCOM; ---> "Warning"-Meldung "no stack segment" 
  19. ; EXE2BIN DEVCOM.EXE DEVCOM.COM
  20. ;
  21. ;---------------    M  A  K  R  O  S    ----------------------
  22.  
  23. msdos       macro name              ;MS-DOS Funtionsaufruf
  24.             mov  ah,&name
  25.             int  21h
  26. endm
  27.  
  28. ;---------- DOS Funktionscodes ----------------------------
  29.  
  30. _outchr     equ  02h             ;Einzelzeichen über MS-DOS
  31. _outstr     equ  09h             ;Textstring über MS-DOS
  32. _create     equ  3Ch             ;Datei neu einrichten
  33. _open       equ  3Dh             ;Datei öffnen
  34. _close      equ  3Eh             ;Datei schließen
  35. _read       equ  3Fh             ;aus Datei lesen
  36. _write      equ  40h             ;in Datei schreiben
  37. _delete     equ  41h             ;Datei löschen
  38. _ende       equ  4Ch             ;zurück zu DOS
  39.  
  40. ;----------------------------------------------------------
  41.  
  42. ausgabe     macro text           ;Textausgabe über DOS
  43.             push ax
  44.             push dx
  45.             mov  dx,offset text
  46.             msdos _outstr
  47.             pop  dx
  48.             pop  ax
  49. endm
  50.  
  51. ;----------------------------------------------------------
  52. cr          equ  13                 ;zum Zeilenanfang
  53. lf          equ  10                 ;nächste Zeile
  54. bel         equ  07                 ;Warnton ausgeben
  55.  
  56.  
  57. ;------- B E G I N N  D E S  P R O G R A M M S ------------
  58.  
  59. code_seg    segment
  60.  
  61.             assume cs:code_seg, ds:code_seg
  62.  
  63.             org 0100h               ;für .COM Datei
  64.  
  65. prgm_start: jmp programm
  66.  
  67. ;------ Variable und Texte --------------------------------
  68.  
  69. o_treiber   DW  '??'                ;Adressenspeicher
  70. s_treiber   DW  '??'                ;   "      "
  71. last_drv    DW  '??'                ;Flag für Ende
  72. t_count     DW  0                   ;Zeiger in Liste
  73. t_name      DB  '12345678'          ;Namenspeicher
  74. t_adress    DW  0FFFFh,0FFFFh       ;Adressenspeicher
  75. t_status    DB  'A'
  76. t_liste     DB  32 DUP ('>TREIBER',0FFh,0FFh,0FFh,0FFh,'A')
  77. stat_cnt    DB  0                   ;Listenstatus-Zähler
  78. read_stat   DB  0
  79. parameter   DB  'P'
  80. treiber_nr  DB  '#'
  81. dateiname   DB  'TREIBER.LST',0
  82. handle      DW  '##'
  83.  
  84. bezeichnen  DB  'Nr.   Name      Adresse     Status'
  85.             DB  cr,lf,lf,'$'
  86. aktiv       DB  '   ein',cr,lf,'$'
  87. nichtaktiv  DB  '   aus',cr,lf,'$'
  88. show_text   DB  cr,lf,'Alle Systemtreiber auf einen Blick'
  89.             DB  cr,lf,lf,'$'
  90.  
  91. fehler_0    DB  'FEHLERHAFTE PARAMETEREINGABE !!!! ---->'
  92.             DB  bel, cr, lf, lf
  93.  
  94. fehler_1    DB  'Der DEVICE-COMMANDER  zeigt alle '
  95.             DB  'im System befindlichen Device-Treiber,'
  96.             DB  cr,lf
  97.             DB  'mit Adresse und Status auf dem'
  98.             DB  ' Bildschirm an.'
  99.             DB  cr,lf
  100.             DB  'Zum Ein- und Ausblenden von Devices '
  101.             DB  'wird im aktuellen Laufwerk',cr,lf
  102.             DB  'eine unsichtbare Datei angelegt.',cr,lf
  103.             DB  'Mit dem Parameter "-" und der '
  104.             DB  'entsprechenden '
  105.             DB  'Nummer lassen sich nun',cr,lf
  106.             DB  'beliebige Treiber abschalten oder mittels'
  107.             DB  ' "+" wieder einbinden.',cr,lf
  108.             DB  'Der NUL-Treiber (Nummer 0) läßt sich '
  109.             DB  'nicht beeinflussen.',cr,lf,lf
  110.             DB  'Beispiel: DEVCOM L    ---> zeigt '
  111.             DB  'Treiberliste an.',cr,lf
  112.             DB  '          DEVCOM -1   ---> entfernt '
  113.             DB  'Treiber Nr.1.',cr,lf
  114.             DB  '          DEVCOM +1   ---> hängt '
  115.             DB  'Treiber Nr.1 '
  116.             DB  'wieder ein.',cr,lf,lf
  117.             DB  'DEVICE COMMANDER Version 2.0 (C) 1991'
  118.             DB  ' DOS - toolbox & U. Schmitz',cr,lf,cr,lf
  119.             DB  'DMV-Verlag',cr,lf
  120.             DB  'Postfach 250',cr,lf, '3440 Eschwege',cr,lf
  121.             DB  '$'
  122.  
  123. fehler_2    DB  'FEHLER: Datei "TREIBER.LST" konnte nicht'
  124.             DB  ' erstellt werden!','$'
  125.  
  126. fehler_3    DB  'FEHLER: NUL-Device kann nicht geschaltet '
  127.             DB  'werden!','$'
  128.  
  129. fehler_4    DB  'FEHLER: Ein Treiber mit dieser Nummer '
  130.             DB  'existiert nicht!','$'
  131.  
  132. ;----------------------------------------------------------
  133. ;--- Beginn der Programmroutinen --------------------------
  134. ;----------------------------------------------------------
  135. first_drv:  push ax                 ;NUL Treiber suchen
  136.             push bx
  137.             push cx
  138.             push es
  139.             mov  ax,0FFFFh
  140.             mov  es,ax              ;Segment initialisieren
  141. new_seg:    sub  si,si              ;Offset initialisieren
  142.             mov  di,es
  143.             inc  di
  144.             mov  es,di              ;Segment hochzählen
  145. find_nul:   inc  si                 ;Offset hochzählen
  146.             mov  al,es:[si]
  147.             mov  bl,es:[si+1]
  148.             mov  cl,es:[si+2]
  149.             cmp  si,0FFFFh          ;neues Segment?
  150.             je   new_Seg
  151.             cmp  al,'N'
  152.             jne  find_nul
  153.             cmp  bl,'U'
  154.             jne  find_nul
  155.             cmp  cl,'L'
  156.             jne  find_nul
  157.             sub  si,10              ;Beginn = Name - 10
  158.             mov  o_treiber,si       ;Offset  Treiber NUL
  159.             mov  s_treiber,es       ;Segment Treiber NUL
  160.             pop  es
  161.             pop  cx
  162.             pop  bx
  163.             pop  ax
  164.             ret
  165.  
  166. next_drv:   push es
  167.             mov  es,s_treiber       ;Segment akt. Treiber
  168.             mov  si,o_treiber       ;Offset akt. Treiber
  169.             cmp  si,0ffffh          ;kein weiterer Tr.?
  170.             jne  next_0             ;weiter
  171.             mov  last_drv,si        ;Merker für letzten
  172.             pop  es
  173.             ret                     ;Treiber setzen, fertig
  174.  
  175. ;--- Namen des aktuellen Treibers auslesen ----------------
  176.  
  177. next_0:     mov  di,0
  178.             mov  bx,offset t_name
  179. next_1:     mov  al,es:[si+10]      ;Name steht auf Pos. 10
  180.             mov  [bx],al
  181.             add  bx,1
  182.             inc  si
  183.             inc  di
  184.             cmp  di,8
  185.             jne  next_1
  186.  
  187. ;--- aktuellen Treiber in Liste t_liste eintragen ---------
  188.  
  189.             push cs                 ;Quelle  --> ds:si
  190.             pop  es                 ;Ziel    --> es:dI
  191.             mov  ax,t_count         ;Zähler für Treiber
  192.             add  ax,13              ;Zeiger für Tabelle
  193.             mov  t_count,ax
  194.             cld
  195.             mov  cx,8               ;8 Byte (Name)
  196.             mov  si,offset t_name
  197.             add  ax,offset t_name
  198.             mov  di,ax
  199.             rep  movsb              ;kopiere Namen
  200.  
  201. ;--- akt. Treiberadresse in Liste eintragen ---------------
  202.  
  203.             mov  si,offset t_name
  204.             add  si,t_count
  205.             mov  ax,s_treiber
  206.             mov  [si+8],ax
  207.             mov  ax,o_treiber
  208.             mov  [si+10],ax
  209.  
  210. ;--- Nächste Treiberadresse berechnen ---------------------
  211.  
  212.             mov  es,s_treiber       ;Segment setzen
  213.             mov  si,o_treiber
  214.             mov  ax,es:[si]
  215.             mov  o_treiber,ax       ;nächstes Offset
  216.             mov  ax,es:[si+2]
  217.             mov  s_treiber,ax       ;nächstes Segment
  218.             pop  es
  219.             ret
  220.  
  221. ;--- Datei für Treiberliste anlegen -----------------------
  222.  
  223. creat_list: mov  dx,offset dateiname
  224.             mov  cx,02              ;versteckte Datei
  225.             msdos _create
  226.             jc   creat_err
  227.             mov  handle,ax          ;Handle speichern
  228.             ret
  229.  
  230. ;- Treiberliste erstellen und im RAM ablegen --------------
  231.  
  232. make_list:  call creat_list         ;Liste anlegen
  233.             call first_drv
  234. weiter:     call next_drv
  235.             cmp  word ptr last_drv,'??'  ;weitere Treiber?
  236.             je   weiter
  237.  
  238. ;--- in Datei schreiben -----------------------------------
  239.  
  240. insrt_list: mov  bx,handle
  241.             mov  cx,32*13+1         ;32 * 13 + 1 Bytes
  242.             mov  dx,offset t_liste  ;Listenanfang
  243.             msdos _write
  244.             jnc  clos_hndl          ;alles klar, --> close
  245. creat_err:  pop  ax                 ;sonst Fehler zeigen
  246.             mov  ax,2
  247.             jmp  fehler
  248.  
  249. ;--- Treiberliste lesen -----------------------------------
  250.  
  251. read_list:  mov  al,0               ;nur lesen
  252.             mov  dx,offset dateiname
  253.             msdos _open             ;TREIBER.LST öffnen
  254.             jc   read_err           ;Lesefehler -->
  255.             mov  handle,ax          ;Handle für Datei
  256.             mov  bx,ax
  257.             mov  cx,32*13+1         ;Anzahl Daten
  258.             mov  dx,offset t_liste  ;Offset Daten
  259.             msdos _read
  260. clos_hndl:  mov  bx,handle          ;Datei wieder schließen
  261.             msdos _close
  262.             mov  ax,'##'
  263.             mov  handle,ax          ;Handle entfernen
  264.             mov  read_stat,AL       ;Datei markieren
  265.             ret
  266.  
  267. read_err:   ret                     ;Lesefehler --> fertig
  268.  
  269. ;--- Treiberliste anzeigen --------------------------------
  270.  
  271. show_list:  mov  si,offset t_liste  ;OFFSET Daten -->si
  272.             mov  di,si
  273.             mov  t_count,0
  274.             ausgabe bezeichnen
  275. next_nam:   mov  ax,t_count
  276.             call outdec
  277.             call out3sp
  278.             inc  t_count
  279. next_char : mov  al,[di]
  280.             cmp  al,'>'
  281.             je   show_ende
  282.             mov  dx,di
  283.             sub  di,si
  284.             cmp  di,8
  285.             mov  di,dx
  286.             jne  weiter_chr
  287.             call out2sp
  288.             call showadr            ;Treiber Adresse zeigen
  289.             call status
  290.             add  si,13
  291.             mov  di,si              ;nächster Treiber
  292.             cmp  byte ptr [di],'>'
  293.             jne  next_nam
  294. show_ende : ret
  295.  
  296. weiter_chr: cmp  al,20h             ;Sonderz. als Hex-Byte
  297.             jge  ascchr
  298.             call outhex
  299.             jmp  short bump
  300.  
  301. ascchr:     call outchr
  302. bump:       inc  di
  303.             jmp  next_char
  304.  
  305. ;------- Status des Treibers anzeigen----------------------
  306.  
  307. status:     cmp  byte ptr [di+4],'A';Statusbyte aktiv?
  308.             je   active
  309.             ausgabe nichtaktiv      ;nein, aus
  310.             ret
  311.  
  312. active:     ausgabe aktiv           ;ja, ein
  313.             ret
  314.  
  315. ;------ Adressen hexadezimal anzeigen ---------------------
  316.  
  317. showadr:    mov  ax,[di]            ;Segment Adresse
  318.             call out2b              ;anzeigen
  319.             mov  al,':'
  320.             call outchr
  321.             mov  ax,[di+2]          ;Offset Adresse
  322.             call out2b              ;anzeigen
  323.             ret
  324.  
  325. ;------- 2 bzw. 1 Byte anzeigen ---------------------------
  326.  
  327. out2b:      push ax                 ;2 Byte in AX
  328.             mov  al,ah              ;zuerst High Byte in AL
  329.             call out1b              ;1 Byte anzeigen
  330.             pop  ax                 ;nun Low Byte in AL
  331. out1b:      push ax                 ;Byte retten (AL)
  332.             shr  al,1               ;oberes Halbbyte
  333.             shr  al,1
  334.             shr  al,1
  335.             shr  al,1
  336.             call outhex             ;Halbbyte anzeigen
  337.             pop  ax                 ;zurück für
  338.                                     ;unteres Halbbyte
  339. outhex:     and  al,0Fh             ;nur untere 4 Bit
  340.             cmp  al,9
  341.             jle  outh1              ;0 ... 9
  342.             add  al,7               ;A ... F
  343. outh1:      add  al,30h             ;in ASCII wandeln
  344. outchr:     push dx
  345.             push ax
  346.             mov  dl,al
  347.             msdos _outchr           ;Anzeige über DOS
  348.             pop  ax
  349.             pop  dx
  350.             ret
  351.  
  352. ;--- Leerzeichen ausgeben ---------------------------------
  353.  
  354. out3sp:     call outsp              ;3 Zeichen
  355. out2sp:     call outsp              ;2 Zeichen
  356. outsp:      push ax                 ;1 Zeichen
  357.             mov  al,20h
  358.             call outchr
  359.             pop  ax
  360.             ret
  361.  
  362. ;--- Zahlen dezimal anzeigen ------------------------------
  363.  
  364. outdec:     cmp  ax,100             ;dreistellig, wenn > 99
  365.             jge  decout             ;sonst
  366.             call outsp              ;ein Leerzeichen
  367.             cmp  ax,10              ;zweistellig, wenn > 9
  368.             jge  decout             ;sonst
  369.             call outsp              ;ein Leerzeichen
  370. decout:     xor  cx,cx              ;Zähler auf null
  371.             mov  bx,10              ;Multiplikator 10
  372. dc1:        xor  dx,dx
  373.             div  bx                 ;AX:=AX div 10
  374.                                     ;DX:=AX mod 10
  375.             add  dl,30h             ;zu ASCII erweitern
  376.             push dx                 ;und kellern
  377.             inc  cx                 ;Zähler := Zähler + 1
  378.             or   ax,ax              ;AX = 0 ?
  379.             jnz  dc1                ;nein, weiter
  380. twodc2:     pop  ax                 ;AX mit Ziffer laden
  381.             call outchr             ;und schreiben
  382.             dec  cx                 ;Zähler := Zähler - 1
  383.             jnz  twodc2             ;weiter,
  384.                                     ;wenn nicht fertig
  385.             ret
  386.         
  387. ;--- Treiber in die Kette wieder einfügen -----------------
  388.  
  389. insert_drv: mov  al,treiber_nr         ;welcher Treiber?
  390.             mov  di,offset t_liste     ;Listenanfang
  391.             sub  ah,ah                 ;Treiber NUL
  392. rechne_adr: add  di,13                 ;nächster in Liste
  393.             cmp  byte ptr [di],'>'     ;Treiber vorhanden?
  394.             je   zugross               ;nein
  395.             inc  ah                    ;zählen
  396.             cmp  al,ah                 ;Nummer erreicht?
  397.             jne  rechne_adr            ;nein,weiter
  398.             cmp  byte ptr [di+12],'A'  ;Treiber aktiv?
  399.             je   ins_ende              ;ja, bereits fertig
  400.  
  401. ; DI zeigt nun auf den Namen des angewählten Treibers in
  402. ; der Liste.
  403. ; Dieser ist nicht aktiv und läßt sich daher einschalten.
  404.  
  405.             neg  byte ptr [di+12]      ;Status einschalten
  406.             dec  stat_cnt              ;Listenstatus zählen
  407.             mov  ax,[di+8]             ;Segment holen
  408.             mov  bx,[di+10]            ;Offset holen
  409.             push di                    ;Listenzeig.aufheben
  410. try_on:     sub  di,13                 ;vorigen Tr. zeigen
  411.             cmp  byte ptr [di+12],'A'  ;Treiber aktiv?
  412.             jne  try_on                ;nein, weiter zurück
  413.             mov  es,[di+8]             ;Segment aus Liste
  414.             mov  si,[di+10]            ;Offset zeigen
  415.             mov  es:[si+2],ax          ;Verkettungsadresse
  416.             mov  es:[si],bx            ;einsetzen
  417.             pop  di                    ;Listenzeiger zurück
  418.             mov  es,[di+8]             ;Segment aus Liste
  419.             mov  si,[di+10]            ;Offset zeigen
  420. try_nxt:    add  di,13                 ;folgenden Tr.zeigen
  421.             cmp  byte ptr [di+12],'A'  ;aktiv?
  422.             jne  try_nxt               ;nein, zum nächsten
  423.                                        ;Treiber
  424.             mov  ax,[di+8]             ;Segment holen
  425.             mov  bx,[di+10]            ;Offset holen
  426.             mov  es:[si+2],ax          ;Verkettungsadresse
  427.             mov  es:[si],bx            ;aktuell einsetzen
  428. ins_ende:   ret                        ;fertig
  429.  
  430. zugross:    pop  ax                    ;Treibernummer
  431.                                        ;existiert nicht
  432.             mov  ax,4
  433.             jmp  fehler
  434.  
  435. ;--- Treiber aus der Kette entfernen ----------------------
  436.  
  437. remove_drv: mov  al,treiber_nr         ;welcher Treiber?
  438.             mov  di,offset t_liste     ;Listenanfang
  439.             sub  ah,ah                 ;Treiber NUL
  440. neue_adr:   add  di,13                 ;nächster in Liste
  441.             cmp  byte ptr [di],'>'     ;Treiber vorhanden?
  442.             je   zugross               ;nein
  443.             inc  ah                    ;zählen
  444.             cmp  al,ah                 ;Nummer erreicht?
  445.             jne  neue_adr              ;nein,weiter
  446.             cmp  byte ptr [di+12],'A'  ;Treiber aktiv?
  447.             jne  rem_ende              ;nein, fertig
  448.  
  449. ; DI zeigt nun auf den Namen des angewählten Treibers in
  450. ; der Liste.
  451. ; Dieser ist aktiv und kann daher ausgeschaltet werden.
  452.  
  453.             neg  byte ptr [di+12]      ;Status aus
  454.             inc  stat_cnt              ;Listenstatus zählen
  455.             mov  es,[di+8]             ;Segment holen
  456.             mov  si,[di+10]            ;Offset zeigen
  457.             mov  ax,es:[si+2]          ;verkettetes Segment
  458.             mov  bx,es:[si]            ;und Offset holen
  459. try_of:     sub  di,13                 ;vorigen Trb. zeigen
  460.             cmp  byte ptr [di+12],'A'  ;aktiv?
  461.             jne  try_of                ;nein, weiter zurück
  462.  
  463. ; DI zeigt nun auf den Namen des nächsten aktiven Treibers
  464. ; in der Liste, der vor dem auszuschaltenden liegt.
  465. ; Mit diesem muß die Adresse AX:BX verkettet werden.
  466. ; Der ausgeschaltete Treiber wird dadurch umgangen
  467. ; und somit aus der Kette entfernt.
  468.  
  469.             mov  es,[di+8]             ;Segment setzen
  470.             mov  si,[di+10]            ;Offset zeigen
  471.             mov  es:[si+2],ax          ;Verkettungsadresse
  472.             mov  es:[si],bx            ;einsetzen
  473. rem_ende:   ret                        ;fertig
  474.  
  475. ;-------------------  Hauptprogramm  ----------------------
  476.  
  477. programm:   push cs
  478.             pop  ds
  479.             mov  al,ds:[0080h]         ;Parameter auf
  480.                                        ;Kommandozeile?
  481.             cmp  al,0
  482.             jne  para_1
  483.             mov  ax,1                  ;ohne Parameter:
  484.                                        ; --> Hilfstext
  485.             jmp  fehler
  486.  
  487. para_1:     mov  al,ds:[0082h] ;erstes Zeichen
  488.             cmp  al,40h
  489.             jle  Para_2        ;unterhalb von "A" -->
  490.             and  al,0DFh       ;sonst in Uppercase wandeln
  491.             cmp  al,'L'        ;L-Parameter?
  492.             jne  para_2
  493.             call read_list     ;ja, Listendatei versuchen
  494.             jnc  liste         ;gefunden --> alles klar
  495.             call first_drv     ;sonst Treiber unmittelbar
  496. weit:       call next_drv      ;anzeigen
  497.             cmp  last_drv,'??' ;weitere Treiber?
  498.             je   weit
  499.             ausgabe show_text  ;Überschrift
  500. liste:      call show_list
  501.             jmp  ende          ;Ende
  502.  
  503. para_2:     cmp  al,'+'
  504.             je   para_4
  505.             cmp  al,'-'
  506.             je   para_4
  507.             mov  ax,0          ;kein "+" oder "-" -> Fehler
  508.             jmp  fehler
  509.  
  510. para_4:     mov  parameter,al  ;Parameter setzen
  511.             mov  ax,ds:[0083h] ;weiter Zeichen
  512.             cmp  ah,0Dh        ;nur eine Ziffer?
  513.             jz   para_6        ;ja, fertig
  514.             mov  cx,ax         ;nein, AX 2 Ziffern
  515.             mov  bx,10
  516.             xor  ax,ax 
  517.             sub  cx,3030h      ;high + low Byte binär
  518.             mov  al,cl         ;Zehnerstelle -> AL
  519.             mul  bx            ;mal 10
  520.             add  al,ch         ;Einerstelle addieren
  521.             jmp  para_8
  522. para_6:     sub  al,30h
  523. para_8:     cmp  al,1          ;nicht unter 1
  524.             jae  para_9
  525.             mov  ax,3          ;Nummer 0 nicht zugelassen
  526.             jmp  fehler
  527.  
  528. para_9:     mov  treiber_nr,al ;Nummer einsetzen
  529.  
  530. ;---  Treiber entfernen oder wieder einhängen? ------------
  531.  
  532. do_plus:    mov  al,parameter
  533.             cmp  al,'+'
  534.             jne  do_minus
  535.             call read_list      ;Treiber Listendatei lesen
  536.             jnc  nxt1_i
  537.             call make_list
  538. nxt1_i:     call insert_drv     ;Liste ändern
  539.             call creat_list     ;neu anlegen
  540.             call insrt_list     ;Datei schreiben
  541.             call show_list      ;geänderte Liste zeigen
  542.             jmp  ende
  543.  
  544. do_minus:   call read_list      ;Listendatei lesen
  545.             jnc  nxt1_d
  546.             call make_list
  547. nxt1_d:     call remove_drv     ;Liste ändern
  548.             call creat_list     ;neu anlegen
  549.             call insrt_list     ;Datei schreiben
  550.             call show_list      ;geänderte Liste zeigen
  551.             jmp  ende
  552.  
  553. ;----- Fehleranzeige (Fehler Nummer in AX) ----------------
  554.  
  555. err_tab     DW   fehler_0          ;Tabelle der Fehlertexte
  556.             DW   fehler_1
  557.             DW   fehler_2
  558.             DW   fehler_3
  559.             DW   fehler_4
  560.  
  561. fehler:     shl  ax,1              ;Fehler Nr. mal 2
  562.             mov  di,offset err_tab ;auf Tabelle zeigen
  563.             add  di,ax             ;Nummernwert addieren
  564.             mov  dx,[di]           ;Textadresse nach DX
  565.             msdos _outstr          ;über DOS anzeigen
  566.  
  567. ;----------------------------------------------------------
  568. ende:       mov  bx,handle
  569.             cmp  bx,'##'           ;Handle benutzt?
  570.             je   test_del          ;nein, fertig
  571.  
  572. ;-----  Handle schließen  ---------------------------------
  573.  
  574.             msdos _close
  575.        
  576. test_del:   test read_stat,0FFh    ;Datei gelesen?
  577.             jz   dos               ;nein, fertig
  578.             test stat_cnt,0FFh     ;noch Treiber
  579.                                    ;abgeschaltet?
  580.             jnz  dos               ;ja, fertig
  581.  
  582. ;-----  angelegte Datei wieder löschen --------------------
  583.  
  584.             mov  dx,offset dateiname
  585.             msdos _delete
  586.  
  587. ;-----  zurück zu DOS  ------------------------------------
  588.  
  589. dos:        msdos _ende            ;zurück zu DOS
  590.  
  591. code_seg    ends
  592.  
  593.             end  prgm_start
  594.  
  595. ;* ------------------------------------------------------ *
  596. ;* -              Ende von DEVCOM.ASM                     *
  597.  
  598.