; ------------- Instalater driveru
BLOOD segment
assume cs:BLOOD , ds:BLOOD ,SS:BLOOD , ES:BLOOD
org 100H
P486
jumps

start:  jmp install
pis     proc    near
        ;
        push ds
        push ax
        ;
        mov ah, 09h
        push cs
        pop ds
        int 21h
        ;
        pop ax
        pop ds
        ;
        retn
        ;
pis     endp
install:
        ;
        lea dx, [copyright]
        call pis
        ;
        mov ah, 30h
        int 21h
        ;
        cmp al, 5
        lea dx, [dos_ver]
        jc konec_s_chybou
        ;
        mov ax, 1600h
        int 2fh
        ;
        lea dx, [wshitz_presentz]
        ;
        test al, 07fh
        jnz konec_s_chybou
        ;
        push word ptr ds:[2ch]
        pop es
        mov ah, 49h
        int 21h
        ;
        mov ax, cs
        mov word ptr [rez_segment], ax
        add ax, 16                              ; misto pro PSP
        mov word ptr [segment], ax
        ;
        lea ax, [konec_]
        shr ax, 4
        inc ax
        ;
        mov cx, word ptr ds:[02h]
        sub cx, ax
        ;
        mov es, cx
        xor di, di
        xor si, si
        ;
        mov cx, offset konec_ - offset start + 100h
        ;
        rep movsb
        ;
        push es
        push offset new_segment_start
        ;
        retf
        ;
new_segment_start:
        ;
        mov ax, cs
        mov ds, ax
        mov es, ax
        mov ss, ax
        ;
        mov sp, offset stack + 500h
        ;
        mov ax, word ptr [segment]
        ;
        mov word ptr [exec_par_block], ax
        mov word ptr [exec_par_block + 2], ax
        ;
        xor cx, cx
        mov si, 80h
        mov cl, byte ptr ds:[si]
        or cl, cl
        lea dx, [syntax]
        jz konec_s_chybou
        ;
        inc si
        inc cx
        ;
lbl_1:
        ;
        lodsb
        ;
        cmp al, 20h
        jnz ok_zacatek_filu
        ;
        loop lbl_1
        lea dx, [syntax]
        jcxz konec_s_chybou
        ;
ok_zacatek_filu:
        ;
        dec si
        ;
        push si
        ;
        mov word ptr [packet + 12h], si
        mov ax, word ptr cs:[rez_segment]
        mov word ptr [packet + 14h], ax
        ;
        inc si
        ;
lbl_2:
        ;
        lodsb
        ;
        cmp al, 0dh
        jz ok_konec_filu
        ;
        cmp al, 0ah
        jz ok_konec_filu
        ;
        cmp al, 20h
        jz ok_konec_filu
        ;
        loop lbl_2
        lea dx, [syntax]
        jcxz konec_s_chybou
        ;
ok_konec_filu:
        ;
        pop dx
        ;
        push word ptr [si - 1]
        ;
        mov byte ptr [si - 1], 0
        ;
        mov ax, 4b03h
        lea bx, [exec_par_block]
        int 21h
        ;
        pop word ptr [si - 1]
        ;
        lea dx, [nenalezen]
        jc konec_s_chybou
        ;
        xor si, si
        ;
lbl_next_device:
        ;
        mov byte ptr cs:[mov_fs_byte_?], 0
        ;
        mov ds, word ptr cs:[exec_par_block]
        ;
        mov ax, 1500h
        xor bx, bx
        int 2fh
        ;
        mov byte ptr cs:[disk], bl
        ;
        mov ax, word ptr [si + 4]
        mov word ptr cs:[atributy], ax
        ;
        push cs
        pop ds
        ;
        mov ah, 52h
        int 21h
        ;
        mov word ptr [seznam], bx
        mov word ptr [seznam + 2], es
        ;
        mov al, byte ptr es:[bx + 20h]
        add byte ptr cs:[disk], al
        ;
        bt word ptr cs:[atributy], 15
        jc preskoc_4
        ;
        cmp al, byte ptr es:[bx + 21h]
        lea dx, [malo_drivu]
        jz konec_s_chybou
        ;
preskoc_4:
        ;
        mov ds, word ptr cs:[exec_par_block]
        ;
        mov word ptr cs:[packet + 0eh], 0       ; nastavim konec pameti
        mov word ptr cs:[packet + 10h], cs      ; pro driver (DOS 5.0+)
                                                ; tohle v Sysmanovi neni !
        ;
        mov al, byte ptr cs:[disk]
        mov byte ptr cs:[packet + 16h], al
        ;
        mov word ptr cs:[call + 2], ds
        ;
        lea bx, [packet]
        push cs
        pop es
        ;
        mov si, word ptr cs:[mov_ax_?]
        ;
        mov ax, word ptr [si + 6]
        mov word ptr cs:[call], ax
        call dword ptr cs:[call]
        ;
        mov ax, word ptr [si + 8]
        mov word ptr cs:[call], ax
        call dword ptr cs:[call]
        ;
        mov word ptr cs:[call], si
        ;
        mov ax, word ptr cs:[packet + 3]
        ;
        bt ax, 15
        lea dx, [chyba_init]
        jc konec_s_chybou
        ;
        mov al, byte ptr cs:[packet + 0dh]
        ;
        mov byte ptr cs:[diskz], al
        mov byte ptr cs:[add_byte_?], al
        ;
        les bx, dword ptr cs:[packet + 0eh]
        mov ax, es
        ;
        or ax, ax
        jz konec_s_chybou
        ;
        cmp ax, word ptr cs:[segment]
        jnz ok_pokracuj_
        ;
        or bx, bx
        jz konec_s_chybou
        ;
ok_pokracuj_:
        ;
        shr bx, 4
        add ax, bx
        inc ax
        ;
        mov word ptr cs:[blok_segment], ax
        ;
        les bx, dword ptr cs:[packet + 0eh]
        ;
        mov ax, es
        ;
        bt word ptr cs:[atributy], 15
        jc preskoc_5
        ;
        mov dl, byte ptr cs:[diskz]
        xor dh, dh
        ;
        imul dx, 3
        ;
        add ax, dx                              ; Blok popisu disku
        ;
preskoc_5:
        ;
        movzx eax, ax
        movzx ebx, bx
        ;
        shl eax, 4
        ;
        add eax, ebx
        xchg eax, ecx
        ;
        mov ax, word ptr cs:[rez_segment]
        xor bx, bx
        movzx eax, ax
        movzx ebx, bx
        ;
        shl eax, 4
        ;
        add eax, ebx
        ;
        sub ecx, eax
        add ecx, 16
        ;
        shr ecx, 4
        ;
        mov word ptr cs:[patch_dx], cx
        ;
        bt word ptr cs:[atributy], 15
        jc preskoc_
        ;
        cmp byte ptr cs:[packet + 0dh], 0
        lea dx, [chyba_init]
        jz konec_s_chybou
        ;
preskoc_:
        ;
        les bx, dword ptr cs:[seznam]
        ;
        bt word ptr cs:[atributy], 15
        jc preskoc_3
        ;
        db      26h, 80h, 47h, 20h              ; add byte ptr es:[bx + 20h]
add_byte_?      equ     $
        db      ?
        ;
preskoc_3:
        ;
        lfs ax, dword ptr es:[bx + 16h]
        mov word ptr cs:[directory], ax
        mov word ptr cs:[directory + 2], fs
        ;
        lfs ax, dword ptr es:[bx]
        mov word ptr cs:[disk_blok], ax
        mov word ptr cs:[disk_blok + 2], fs
        ;
        mov ax, word ptr cs:[mov_ax_?]
        ;
        bt word ptr cs:[atributy], 0
        jnc check_clock
        ;
        mov word ptr es:[bx + 0ch], ax          ; it'z the CON driver
        mov word ptr es:[bx + 0ch + 2], ds
        ;
        jmp short ok_go_on_now
        ;
check_clock:
        ;
        bt word ptr cs:[atributy], 3
        jnc ok_go_on_now
        ;
        mov word ptr es:[bx + 08h], ax          ; it'z the CLOCK$ driver
        mov word ptr es:[bx + 08h + 2], ds
        ;
ok_go_on_now:
        ;
        add bx, 22h                             ; prvni je Null
        ;
        lgs dx, dword ptr es:[bx]
        ;
        mov word ptr es:[bx], ax
        mov word ptr es:[bx + 2], ds
        ;
        bt word ptr cs:[atributy], 15
        jnc preskoc_sft
        ;
        call change_sft
        ;
preskoc_sft:
        ;
        xchg ax, si
        ;
        mov ax, word ptr [si]
        ;
        mov word ptr [si], dx
        mov word ptr [si + 2], gs
        ;
        mov word ptr cs:[mov_ax_?], ax
        ;
        bt word ptr cs:[atributy], 15
        jc preskoc_2
        ;
lbl_disk_blockz:
        ;
        lds si, dword ptr cs:[packet + 12h]
        mov si, word ptr ds:[si]                ; tohle taky neni v Sysmanovi !
        xor bp, bp
        mov es, word ptr cs:[blok_segment]
        mov ah, 53h
        int 21h
        ;
        les ax, dword ptr cs:[call]
        mov fs, word ptr cs:[blok_segment]
        xor bx, bx
        mov word ptr fs:[bx + 13h], ax
        mov word ptr fs:[bx + 15h], es
        ;
        mov word ptr fs:[bx + 19h], -1
        mov al, byte ptr cs:[disk]
        mov byte ptr fs:[bx], al
        ;
        db      064h, 0c6h, 47h, 01h
mov_fs_byte_?   equ     $
        db      ?
        ;
        ;mov byte ptr fs:[bx + 1], 0
        mov byte ptr fs:[bx + 18h], 2eh
        ;
        mov cx, 58h
        mov al, byte ptr cs:[disk]
        cbw
        mul cx
        ;
        les bx, dword ptr cs:[directory]
        add bx, ax
        ;
        mov word ptr es:[bx + 43h], 4000h
        mov word ptr es:[bx + 4fh], 02
        ;
        mov ax, word ptr cs:[blok_segment]
        ;
        mov word ptr es:[bx + 45h], 0
        mov word ptr es:[bx + 47h], ax
        mov word ptr es:[bx + 49h], 0ffffh
        ;
        les bx, dword ptr cs:[disk_blok]
        ;
lbl_disk_blok:
        ;
        les bx, dword ptr es:[bx + 19h]
        ;
        mov ax, word ptr es:[bx + 19h]
        ;
        cmp ax, -1
        jnz lbl_disk_blok
        ;
        mov ax, word ptr cs:[blok_segment]
        mov word ptr es:[bx + 19h], 0
        mov word ptr es:[bx + 1bh], ax
        ;
        inc byte ptr cs:[disk]
        inc byte ptr cs:[mov_fs_byte_?]
        ;
        add word ptr cs:[blok_segment], 3
        ;
        dec byte ptr cs:[diskz]
        jnz lbl_disk_blockz
        ;
preskoc_2:
        ;
        db      0b8h
mov_ax_?        equ     $
        dw      0
        ;
        cmp ax, 0ffffh
        jz ok_installed
        ;
        xchg ax, si
        ;
        jmp lbl_next_device
        ;
ok_installed:
        ;
        lea dx, [installed]
        call pis
        ;
        mov ax, 3100h
        ;
        db      0bah                            ; mov dx, ?
patch_dx        equ     $
        dw      ?
        ;
        int 21h
        ;
konec:
        ;
        mov ax, 4c00h                           ; cs <> PSP proto ne int 20h
        int 21h
        ;

        ;
konec_s_chybou:
        ;
        call pis
        ;
        jmp short konec
        ;
        
change_sft:
        ;
        pusha
        ;
        push es
        push ds
        ;
        les bx, dword ptr cs:[seznam]
        ;
        add bx, 4
        ;
loop_find_next:
        ;
        les bx, dword ptr es:[bx]
        ;
        cmp bx, 0ffffh
        jz konec_change_sft
        ;
        mov di, bx
        ;
        add di, 06h
        ;
        mov dx, word ptr es:[bx + 4]
        ;
next_file_in_sft:
        ;
        or dx, dx
        jz loop_find_next
        ;
        dec dx
        ;
        cmp word ptr es:[di], 0
        jz add_and_go_on
        ;
        push di
        ;
        add di, 20h
        ;
        mov si, ax
        ;
        add si, 0ah
        ;
        mov cx, 8
        ;
        rep cmpsb
        ;
        pop di
        ;
        jz ok_founded
        ;
add_and_go_on:
        ;
        add di, 3bh
        ;
        jmp next_file_in_sft
        ;
ok_founded:
        ;
        mov word ptr es:[di + 07h], ax
        mov word ptr es:[di + 07h + 2], ds
        ;
        mov word ptr es:[di + 31h], ds
        ;
        add di, 3bh
        ;
        jmp next_file_in_sft
        ;
konec_change_sft:
        ;
        pop ds
        pop es
        ;
        popa
        ;
        retn
        ;

        ;
copyright       db      'Install_Driver v. 2.4          (C)Copyright 1998 BLOOD PMsoft (Petr Matousek)', 0ah, 0dh
                db      '------------------------------------------------------------------------------', 0ah, 0dh, '$'
syntax          db      0ah, 0dh, 'Syntaxe : inst_drv.com <jmeno_driveru> <parametry_driveru>', 0ah, 0dh, '$'
dos_ver         db      0ah, 0dh, 'Tenhle program vyzaduje minimalne verzi Dosu 5.0 ...', 0ah, 0dh, '$'
nenalezen       db      0ah, 0dh, 'Driver nenalezen ...', 0ah, 0dh, '$'
chyba_init      db      0ah, 0dh, 'Chyba pri inicializaci driveru ...', 0ah, 0dh, '$'
installed       db      0ah, 0dh, 'Driver inicializovan a instalovan ...', 0ah, 0dh, '$'
malo_drivu      db      0ah, 0dh, 'Zvetsete si LastDrive v config.sys ...', 0ah, 0dh, '$'
wshitz_presentz db      0ah, 0dh, 'Nemuzu instalovat driver(z) pod Woknama ...', 0ah, 0dh, '$'
        ;
packet  db      offset konec_packet - offset packet     ; dylka
        db      ?
        db      0
        dw      ?
        db      8 dup(0)
        db      ?
        dd      ?
        dd      ?
        db      ?
konec_packet    label   near
        ;
exec_par_block  dw      ?                       ; segment
                dw      ?                       ; relokacni faktor
        ;
diskz           db      ?
directory       dd      ?
disk_blok       dd      ?
seznam  dd      ?
disk    db      ?
atributy        dw      ?
rez_segment     dw      ?
segment         dw      ?
blok_segment    dw      ?
call    dw      ?
        dw      ?
        ;
stack   db      500h dup(?)
        ;
konec_  label   near
        ;
BLOOD   ends
        end start