iglobal
  ;function pointers.
  fdc_irq_func    dd fdc_null
endg

uglobal
  dmasize         db 0x0
  dmamode         db 0x0
endg

fdc_init:                               ;start with clean tracks.
        mov edi,0xD201
        mov al,0
        mov ecx,160
        rep stosb
ret

fdc_filesave:                   ;ebx: cluster to be saved.
        pusha                   ;returns immediately. does not trigger a write.
        mov eax,ebx
        add eax,31
        mov bl,18
        div bl
        mov ah,0
        add eax,0xD201
        mov [eax],byte 1                ;This track is now dirty.
        popa
ret

fdc_irq:
        call [fdc_irq_func]
fdc_null:
ret

save_image:
    call   reserve_flp
    call   restorefatchain
    pusha
    call   check_label
    cmp    [FDC_Status],0
    jne    unnecessary_save_image
    mov    [FDD_Track],0      ; Öèëèíäð
    mov    [FDD_Head],0      ; Ñòîðîíà
    mov    [FDD_Sector],1      ; Ñåêòîð    
    mov    esi,0x100000
    call   SeekTrack
save_image_1:
    push   esi
    call   take_data_from_application_1
    pop    esi
    add    esi,512
    call   WriteSectWithRetr
;    call   WriteSector
    cmp    [FDC_Status],0
    jne    unnecessary_save_image
    inc    [FDD_Sector]
    cmp    [FDD_Sector],19
    jne    save_image_1
    mov    [FDD_Sector],1
    inc    [FDD_Head]   
    cmp    [FDD_Head],2
    jne    save_image_1
    mov    [FDD_Head],0
    inc    [FDD_Track]
    call   SeekTrack
    cmp    [FDD_Track],80
    jne    save_image_1
unnecessary_save_image:
    mov    [fdc_irq_func],fdc_null
    popa
    mov    [flp_status],0
    ret