display macro string mov dx,offset string mov ah,9 int 21h endm ioctrl macro code,drive,count,buffer mov al,code mov ah,44h mov bl,drive mov cx,count mov dx,offset buffer int 21h endm false equ 0 max_disk_drive equ 3 send equ 4 receive equ 5 true equ not false min_free_space equ 128 title installation for GUMDISK Devive Driver V2.1 cseg segment para 'code' assume cs:cseg,ds:cseg,es:cseg,ss:nothing org 100h start: jmp main drive db ? groesse dw ? io_ctrl_pack db 48 dup(?) test_flag db 'M&T GUMDISK.DEV ' gumd_message db 10,13,'GUMDisk wurde $' inst_message db 'eingerichtet.',10,13,'$' free_message db 'ausgeschaltet.',10,13,'$' size_message0 db 'vergr”áert.',10,13,'$' size_message1 db 'verkleinert.',10,13,'$' info_message db 10,13,'Gr”áe der GUMDisk : ' gumd_size_string db ' Kb.' db 10,13,'Frei auf der GUMDisk : ' free_size_string db ' Kb.' db 10,13,'Freier Arbeitsspeicher : ' mem_size_string db 10,13,' Kb.' db 10,13,'$' err_message0 db 10,13 db 10,13,'GUMDisktreiber wurde ' db 'nicht installiert!',10,13,'$' err_message1 db 10,13 db 10,13,'Zu wenig Speicher.',10,13,'$' err_message2 db 10,13 db 'Falscher Parameter!' db 10,13,'M”glich : ,<+n>' db '[ mit 10 Kb ó n],' db ' <-> und <=>',10,13,'$' err_message3 db 10,13 db 'Memory Control Block ist ' db 'besch„digt. Neu booten!',10,13,'$' err_message4 db 10,13 db 'schon ausgeschaltet.' db 10,13,'$' err_message5 db 'noch nicht eingerichtet.' db 10,13,'$' err_message6 db 'bereits eingerichtet.' db 10,13,'$' err_message8 db 10,13,'GUMDisk kann nicht mehr ' db 'vergr”áert werden.',10,13,'$' main: int 11h and ax,00c0h mov cl,6 shr ax,cl inc ax mov drive,al get_drive: dec drive cmp drive,max_disk_drive jne gueltig jmp dev_not_installed gueltig: ioctrl receive,drive,17,io_ctrl_pack jc get_drive cmp ax,17 jne get_drive mov cx,ax mov di,offset io_ctrl_pack mov si,offset test_flag mov ax,cs mov ds,ax mov es,ax cld repe cmpsb jne get_drive mov si,80h cmp byte ptr [si],0 je false_param cmp byte ptr [si+2],'+' jne nicht_vergroessern jmp inc_size nicht_vergroessern: cmp byte ptr [si+2],'=' jne nicht_info jmp get_info nicht_info: cmp byte ptr [si+2],'-' je gumdisk_off cmp byte ptr[si+2],'0' jbe false_param cmp byte ptr[si+2],'9' ja false_param jmp set_size false_param: display err_message2 mov al,1 jmp ende gumdisk_off: ioctrl receive,drive,48,io_ctrl_pack cmp word ptr [io_ctrl_pack],0 je already_freed mov si,44 suchen: mov word ptr [io_ctrl_pack+si+2],0 cmp word ptr [io_ctrl_pack+si],0 je naechster_bereich mov es,[io_ctrl_pack+si] mov word ptr [io_ctrl_pack+si],0 mov ah,49h int 21h jnc mem_freed cmp ax,7 jne mem_freed display err_message3 mov al,0ffh jmp ende already_freed: display gumd_message display err_message4 mov al,2 jmp ende mem_freed: ioctrl send,drive,48,io_ctrl_pack cmp si,0 je all_mem_freed display gumd_message display size_message1 mov al,0 jmp ende naechster_bereich: sub si,4 jmp short suchen all_mem_freed: display gumd_message display free_message mov al,0 jmp ende dev_not_installed: display err_message0 mov al,2 jmp ende set_size: ioctrl receive,drive,48,io_ctrl_pack cmp word ptr [io_ctrl_pack],0 jne already_installed mov al,[si] dec al add si,2 mov di,offset io_ctrl_pack mov groesse,6 call calculate_param call test_mem display gumd_message display inst_message jmp make_res already_installed: display gumd_message display err_message6 mov al,2 jmp ende segments_full: display err_message8 mov al,2 jmp ende inc_size: ioctrl receive,drive,48,io_ctrl_pack cmp word ptr [io_ctrl_pack+44],0 jne segments_full cmp word ptr [io_ctrl_pack],0 je not_installed mov al,[si] sub al,2 add si,3 mov di,offset io_ctrl_pack sub di,4 mov cx,12 scan0: add di,4 cmp word ptr [di],0 loopne scan0 mov groesse,0 call calculate_param call test_mem display gumd_message display size_message0 make_res: mov dx,groesse mov ah,31h int 21h not_installed: display gumd_message display err_message5 mov al,2 jmp ende get_info: ioctrl receive,drive,48,io_ctrl_pack cmp word ptr [io_ctrl_pack],0 je not_installed mov cx,12 xor dx,dx mov si,2 scan1: add dx,word ptr [io_ctrl_pack+si] add si,4 loop scan1 shr dx,1 mov di,offset gumd_size_string call zahl_in_string mov ah,4ah mov bx,0ffffh int 21h mov cl,6 shr bx,cl mov dx,bx mov di,offset mem_size_string call zahl_in_string mov ah,36h mov dl,drive int 21h mov dx,bx mov di,offset free_size_string call zahl_in_string display info_message ende: mov ah,4ch int 21h zahl_in_string proc near mov cl,100 cmp dx,99 ja doit mov cl,10 doit: mov ax,dx div cl add al,'0' mov byte ptr [di],al mov dl,ah xor dh,dh xor ah,ah mov al,cl mov cl,10 div cl mov cl,al inc di cmp cl,0 jne doit ret zahl_in_string endp calculate_param proc near cmp al,2 jb falsche_laenge cmp al,3 ja falsche_laenge mov cl,100 cmp al,2 jne scan2 mov cl,10 scan2: mov al,[si] cmp al,'0' jb falsches_zeichen cmp al,'9' ja falsches_zeichen sub al,'0' mul cl add groesse,ax mov al,cl xor ah,ah mov cl,10 div cl mov cl,al inc si cmp cl,0 jne scan2 ret falsches_zeichen: falsche_laenge: jmp false_param calculate_param endp test_mem proc near mov [di],cs mov ax,groesse shl ax,1 mov [di+2],ax mov bx,0ffffh mov ah,4ah int 21h mov ax,groesse mov cl,6 shl ax,cl sub bx,min_free_space*64 cmp bx,ax jb not_enough_mem mov groesse,ax ioctrl send,drive,48,io_ctrl_pack ret not_enough_mem: display err_message1 mov al,2 jmp ende test_mem endp cseg ends end start