GophHub - zajo/appler/src/DM.ASM


Raw File

;  _____________________________________________
; |                                             |
; |  Project:   APPLER                          |
; |  File:      DM.ASM                          |
; |  Compiler:  16-bit TASM (2.5)               |
; |                                             |
; |  Subject:   Disk Manager                    |
; |                                             |
; |  Author:    Emil Dotchevski                 |
; |_____________________________________________|

                include GLOBALS.INC
                include INTERFAC.INC
                include CONIO.INC
                include DM.INC

G_DIRECTORY     =       0
G_PATH_FILTER   =       1
G_IMAGE         =       2
G_D1            =       3
G_D2            =       4

DM              segment public
                assume  cs:DM,ds:DM,es:Emulate

ManagerState    db      MS_NORMAL
GetLineBuf      db      80h dup (0)

GetLineParams   GL_ParamStruc <?,0,1,1,5,0,0,20h,40h,0,?,?,0Bh,1,0,GetLineUser,?,?,?,?>
ScreenIOParams  SIO_ParamStruc <1,DM,0,0,offset Screen,seg Screen,1,0,1,1>
GetKeyParams    RK_ParamStruc <1,Fkey,1,Alt_Key,0,?,ShowAll,0 >

disk1_ptr       dd      CurrentDrive
disk2_ptr       dd      OtherDrive
set_ptrs:       push    ax bx ds
                pushf
                mov     ds,word ptr cs:disk1_ptr[2]
                assume  ds:seg CurrentDrive
                cmp     ds:CurrentDrive.ID,0
                mov     ax,offset CurrentDrive
                mov     bx,offset OtherDrive
                jz      set_ptrs_1
                xchg    ax,bx
set_ptrs_1:     mov     word ptr cs:disk1_ptr[0],ax
                mov     word ptr cs:disk2_ptr[0],bx
                popf
                pop     ds bx ax
                ret

                assume  es:seg CurrentDrive
present1:       push    bp es
                les     bp,disk1_ptr
                cmp     es:[bp].FileHandle,0FFFFh
                pop     es bp
                ret

present2:       push    bp es
                les     bp,disk2_ptr
                cmp     es:[bp].FileHandle,0FFFFh
                pop     es bp
                ret
                assume  es:Emulate

DMInInit        proc    far
                call    DM_InInitP
                call    UnSetBreaks
                ret
DMInInit        endp

DMOutInit       proc    far
                push    ax es
                call    DM_OutInitP
                mov     ax,seg T_Iflags
                mov     es,ax
                assume  es:seg T_Iflags
                mov     byte ptr es:T_Iflags,00000010b
                assume  es:Emulate,ds:DM
                call    AppleKeysOn
                call    SetBreaks
                pop     es ax
                ret
DMOutInit       endp

DM_InInitP      proc    near
                cli
                push    ax bx ds es
                mov     ax,Emulate
                mov     es,ax
                mov     al,es:[C000]
                mov     cs:KeyPressed,al
                mov     es:[C000],0
                call    DebugKeysOn
                call    set_ptrs
                mov     ax,CONio
                mov     ds,ax
                assume  ds:CONio
                mov     GL_ParamsOfs,  offset GetLineParams
                mov     GL_ParamsSeg,  seg    GetLineParams
                mov     SIO_ParamsOfs, offset ScreenIOParams
                mov     SIO_ParamsSeg, seg    ScreenIOParams
                mov     RK_ParamsOfs,  offset GetKeyParams
                mov     RK_ParamsSeg,  seg    GetKeyParams
                assume  ds:DM
                pop     es ds bx ax
                sti
                ret
DM_InInitP      endp

KeyPressed      db      0
DM_OutInitP     proc    near
                cli
                push    ax es
                mov     ax,Emulate
                mov     es,ax
                mov     al,cs:KeyPressed
                mov     es:[C000],al
                assume  es:Emulate
                pop     es ax
                ret
DM_OutInitP     endp



GoWhere?        dw      G_D1
DM_FirstFlag    db      1
DM_MainRet:     push    cs
                pop     ds
                cmp     DM_FirstFlag,0
                jz      BigLoop
                mov     DM_FirstFlag,0
                call    ShowAll
                mov     DirectoryParams.S_MaxLength,0
                call    ReadDir
BigLoop:        mov     GetLineParams.GL_Color,0Bh
                mov     GetLineParams.GL_CX,80*2
                mov     di,GoWhere?
                shl     di,1
                mov     GoWhere?,G_D1
                call    CmndAddress[di]
                call    ShowAll
                jmp     BigLoop

CmndAddress     dw      Directory,S_PathFilter,Image,D1,D2

I_Current       db      0
I_CurrentSVD    db      0
I_FirstTime?    db      1
I_CH            db      15,15,15,16,17,17,17,19,19,19,20,21,21,21,22
I_CL            db      29,32,35,29,29,32,35,29,32,35,29,29,32,35,29
I_Keys          db      '0123456789abcdef'
                db      5,6,7,8,1,2,20h
                db      0Ch,18h,7Fh
I_Procs         dw      I_Num,I_Num,I_Num,I_Num,I_Num,I_Num,I_Num,I_Num
                dw      I_Num,I_Num,I_Num,I_Num,I_Num,I_Num,I_Num,I_Num
                dw      I_Left,I_Right,I_Up,I_Down,I_Home,I_End,I_Space
                dw      I_Esc,I_Enter,I_7Fh
Image:          push    es
                mov     ScreenIOparams.CursorColor,40h
                mov     ScreenIOparams.CursorFlag,1
                mov     ScreenIOparams.CursorLen,4
                mov     cs:ActiveFlags,0000000000010000b
                mov     I_FirstTime?,1
                mov     bx,seg SectorImage
                mov     es,bx
                assume  es:seg SectorImage
                xor     bx,bx
                mov     bl,I_CurrentSVD
                mov     I_Current,bl
I_Loop:         xor     bx,bx
                mov     bl,I_Current
                mov     ch,I_CH[bx]
                mov     cl,I_CL[bx]
                dec     cl
                call    ReadKey
                mov     di,offset I_Keys
                mov     cx,offset I_Procs - offset I_Keys
                call    CalcCommand
                jc      I_Loop
                shl     di,1
                xor     bx,bx
                mov     bl,I_Current
                call    I_Procs[di]
                jnc     I_Loop
                pop     es
                mov     bl,I_Current
                mov     I_CurrentSvd,bl
                ret

I_OffsetAddr    db      AddressProlog,AddressProlog+1,AddressProlog+2
                db      AddressCheckSum
                db      AddressEpilog,AddressEpilog+1,AddressEpilog+2
                db      DataProlog, DataProlog+1, DataProlog+2
                db      DataCheckSum
                db      DataEpilog, DataEpilog+1, DataEpilog+2
                db      EndByte
I_Num:          mov     bl,I_OffsetAddr[bx]
                xor     bh,bh
                shr     di,1
                mov     ax,di
                cmp     cs:I_FirstTime?,0
                jz      I_NumByte_1
                mov     byte ptr es:SectorImage[bx],0
I_NumByte_1:    shl     byte ptr es:SectorImage[bx],4
                or      byte ptr es:SectorImage[bx],al
                clc
                mov     I_FirstTime?,0
                ret

I_Left:         dec     I_Current
                jns     I_LeftOk
                mov     I_Current,size SectorImage_S - 1
I_LeftOk:       clc
                mov     I_FirstTime?,1
                ret

I_SpaceFlags    db      0,1,1,1,1,1,1,0,1,1,1,1,1,1,1
I_Space:        cmp     I_SpaceFlags[bx],0
                jz      I_SpcRet
                mov     bl,I_OffsetAddr[bx]
                xor     bh,bh
                xor     byte ptr es:SectorImageF[bx],0FFh
                cmp     cs:I_FirstTime?,1
I_SpcRet:       clc
                ret

I_Enter:
I_Right:        inc     I_Current
                cmp     I_Current,size SectorImage_S
                jb      I_RightOk
                mov     I_Current,0
I_RightOk:      clc
                mov     I_FirstTime?,1
                ret

I_Ups           db      14,12,13,0,3,1,2,4,5,6,7,10,8,9,11
I_Up:           mov     al,I_Ups[bx]
                mov     I_Current,al
                clc
                mov     I_FirstTime?,1
                ret

I_Downs         db      3,5,6,4,7,8,9,10,12,13,11,14,1,2,0
I_Down:         mov     al,I_Downs[bx]
                mov     I_Current,al
                clc
                mov     I_FirstTime?,1
                ret

I_Home:         mov     I_Current,0
                clc
                mov     I_FirstTime?,1
                ret

I_End:          mov     I_Current,size SectorImage_S - 1
                clc
                mov     I_FirstTime?,1
                ret

I_Esc:          call    GoAppleII
                clc
                ret

I_7Fh:          stc
                ret


                assume  es:Emulate
S_ParamsStruc   struc
S_MaxLength     db      0
S_BegPrint      db      ?
S_Pos           db      ?
S_CX            dw      ?
S_LinesNum      db      ?
S_Buffer        db      ?
S_ParamsStruc   ends
DirectoryParams S_ParamsStruc <0,0,0,0B2Ah,13>
                db      100h * size DiskDescription dup (0)

S_Commands      db      'ta',18h
                db      7,8,3,4,1,2,0Ch
S_Subrt         dw      S_Type,S_Access,S_Enter
                dw      S_Up,S_Down,S_PgUp,S_PgDn,S_Home,S_End,GoAppleII
S_CallIfZero?   db      0,0,0,0,0,0,0,0,0
Directory:      xor     bx,bx
                mov     SHL_Flag,1
                mov     GetLineParams.GL_AllowSpc,0
                gotoxy  2,0
                mov     GetLineParams.GL_CX,cx
                mov     ActiveFlags,0000000000000010b
                mov     FkeysFlags,1111111111b
                mov     ScreenIOparams.CursorFlag,0
                mov     cx,DirectoryParams.S_CX
                call    ReadKey
                cmp     al,7Fh
                je      SelectRet
                mov     di,offset S_Commands
                mov     cx,offset S_Subrt- offset S_Commands
                call    CalcCommand
                jc      Directory
                cmp     DirectoryParams.S_MaxLength,0
                jnz     S_ok1
                test    S_CallIfZero?[di],1
                jz      Directory
S_ok1:          shl     di,1
                call    S_Subrt[di]
                jmp     Directory
SelectRet:      GetLineService _GL_CLRBUFF
                ret

S_Up:           push    ax
                mov     al,DirectoryParams.S_Pos
                or      al,al
                jz      S_UpRet
                dec     al
                mov     ah,al
                sub     ah,DirectoryParams.S_BegPrint
                cmp     ah,2
                jae     S_UpOk1
                cmp     DirectoryParams.S_BegPrint,0
                jz      S_UpOk1
                dec     DirectoryParams.S_BegPrint
                inc     byte ptr DirectoryParams.S_CX[1]
S_UpOk1:        dec     byte ptr DirectoryParams.S_CX[1]
S_UpRet:        mov     DirectoryParams.S_Pos,al
                pop     ax
                ret

S_Down:         push    ax
                mov     al,DirectoryParams.S_Pos
                mov     ah,DirectoryParams.S_MaxLength
                dec     ah
                cmp     al,ah
                je      S_DownRet
                inc     al
                mov     ah,al
                sub     ah,DirectoryParams.S_BegPrint
                add     ah,2
                cmp     ah,DirectoryParams.S_LinesNum
                jb      S_DownOk1
                mov     ah,DirectoryParams.S_BegPrint
                add     ah,DirectoryParams.S_LinesNum
                jc      S_DownOk1
                cmp     ah,DirectoryParams.S_MaxLength
                jae     S_DownOk1
                inc     DirectoryParams.S_BegPrint
                dec     byte ptr DirectoryParams.S_CX[1]
S_DownOk1:      inc     byte ptr DirectoryParams.S_CX[1]
S_DownRet:      mov     DirectoryParams.S_Pos,al
                pop     ax
                ret

S_PgUp:         push    cx
                xor     ch,ch
                mov     cl,DirectoryParams.S_LinesNum
                dec     cx
S_PgUpLoop:     call    S_Up
                loop    S_PgUpLoop
                pop     cx
                ret

S_PgDn:         push    cx
                xor     ch,ch
                mov     cl,DirectoryParams.S_LinesNum
                dec     cx
S_PgDnLoop:     call    S_Down
                loop    S_PgDnLoop
                pop     cx
                ret

S_Home:         push    cx
                mov     cx,100h
                dec     cx
S_HomeLoop:     call    S_Up
                loop    S_HomeLoop
                pop     cx
                ret

S_End:          push    cx
                mov     cx,100h
                dec     cx
S_EndLoop:      call    S_Down
                loop    S_EndLoop
                pop     cx
                ret

S_Access:       push    bx di
                mov     bl,DirectoryParams.S_Pos
                call    CalcBuffer
                test    DirectoryParams.S_Buffer[di].FileFlag,FF_DAMAGED?
                jnz     S_AccessRet
                xor     DirectoryParams.S_Buffer[di].FileFlag,FF_READ_ONLY?
S_AccessRet:    pop     di bx
                ret

S_TypeNewVal    db      FD_Directory,FD_DOS33,FD_Nibble
S_Type:         push    ax bx di
                mov     bl,DirectoryParams.S_Pos
                call    CalcBuffer
                mov     al,DirectoryParams.S_Buffer[di].FileFlag
                test    al ,FF_DAMAGED?
                jnz     S_TypeRet
                test    al,FF_MODIFYTYPE?
                jz      S_TypeRet
                xor     bx,bx
                mov     bl,DirectoryParams.S_Buffer[di].FileType
                mov     bl,S_TypeNewVal[bx]
                mov     DirectoryParams.S_Buffer[di].FileType,bl
S_TypeRet:      pop     di bx ax
                ret

S_EnterProcs    dw      SE_Directory,SE_Nibble,SE_DOS33
S_Enter:        push    ax bx cx dx si di ds es
                cmp     ManagerState,MS_NORMAL
                jne     S_EnterRet
                cmp     DirectoryParams.S_MaxLength,0
                jz      S_EnterRet
                mov     bl,DirectoryParams.S_Pos
                call    CalcBuffer
                test    DirectoryParams.S_Buffer[di].FileFlag,FF_DAMAGED?
                jnz     S_EnterRet
                xor     bx,bx
                mov     bl,DirectoryParams.S_Buffer[di].FileType
                mov     si,bx
                mov     bx,di
                call    LinkName
                shl     si,1
                mov     dx,offset Path
                call    S_EnterProcs[si]
                call    UnLinkName
S_EnterRet:     pop     es ds di si dx cx bx ax
                ret

SE_Directory:   mov     bx,LN_BX
                mov     byte ptr Path[bx],'\'
                mov     byte ptr Path[bx+1],0
                call    ReadDir
                ret

SE_DOS33:
SE_Nibble:      test    ActiveFlags,0000000000001000b
                mov     ax,offset Fkey_InsertB
                jnz     SE_1
                mov     ax,offset Fkey_InsertA
SE_1:           call    ax
                ret



D1:             mov     DN,0
                mov     ActiveFlags,0000000000000100b
                jmp     Drive

D2:             mov     DN,1
                mov     ActiveFlags,0000000000001000b
                jmp     Drive

D_Chars         db      'av'
                db      7,8,3,4,1,2,18h,0Ch
D_Procs         dw      D_Access,D_Volume
                dw      S_Up,S_Down,S_PgUp,S_PgDn,S_Home,S_End,S_Enter,GoAppleII
D_CallIfZero?   db      0,0,1,1,1,1,1,1,1,1
DN              db      ?
Drive:          push    es
D_Loop:         call    ReadKey
                cmp     al,7Fh
                je      D_Ret
                cmp     DN,0
                mov     dx,offset SDA_Filename
                mov     bx,offset present1
                les     bp,disk1_ptr
                jz      D_ok1
                mov     dx,offset SDA_Filename
                mov     bx,offset present2
                les     bp,disk2_ptr
                assume  es:seg CurrentDrive
D_ok1:          mov     di,offset D_Chars
                mov     cx,offset D_Procs - offset D_Chars
                call    CalcCommand
                jc      D_Loop
                call    bx
                jnz     D_ok2
                cmp     D_CallIfZero?[di],0
                jz      D_Loop
D_ok2:          shl     di,1
                call    D_Procs[di]
                jmp     D_Loop
D_Ret:          pop     es
                ret

D_Access:       push    ax cx
                call    Prepare4DOS
                mov     ax,4300h
                int     21h
                jc      D_AccessError
                mov     ax,4301h
                xor     cx,1
                int     21h
                jc      D_AccessError
                xor     es:[bp].WriteProtect,0FFh
D_AccessExit:   call    SOD4eraperP
                pop     cx ax
                ret

D_RemoveDisk    dw      Fkey_RemoveA,Fkey_RemoveB
D_AccessError:  xor     bh,bh
                mov     bl,DN
                shl     bx,1
                call    D_RemoveDisk[bx]
                jmp     D_AccessExit


D_VolCXs        dw      622h,0B22h
D_Vol_First?    db      ?
D_VolNums       db      '0123456789abcdef'
D_Volume:       push    word ptr [GetKeyParams.RK_AltFlag]
                cmp     es:[bp].DiskType,0
                jz      D_VolRet
                mov     ScreenIOparams.CursorColor,40h
                mov     ScreenIOparams.CursorFlag,1
                mov     ScreenIOparams.CursorLen,4
                mov     SHL_Flag,0
                mov     GetKeyParams.RK_AltFlag,0
                mov     D_Vol_First?,1
D_VolLoop:      xor     bh,bh
                mov     bl,DN
                shl     bx,1
                mov     cx,D_VolCXs[bx]
                call    ReadKey
                cmp     al,0Ch
                je      D_VolRet
                cmp     al,18h
                je      D_VolRet
                mov     di,offset D_VolNums
                mov     cx,16
                call    CalcCommand
                jc      D_VolLoop
                mov     bl,es:[bp].Volume
                cmp     D_Vol_First?,0
                jz      D_VolNotFirst
                xor     bl,bl
                mov     D_Vol_First?,bl
D_VolNotFirst:  shl     bl,4
                or      bx,di
                mov     es:[bp].Volume,bl
                jmp     D_VolLoop
D_VolRet:       mov     ScreenIOparams.CursorFlag,0
                mov     SHL_Flag,1
                pop     word ptr [GetKeyParams.RK_AltFlag]
                ret
                assume  es:Emulate


S_PathFilter:   push    word ptr cs:[ScreenIOparams.CursorFlag]
                push    word ptr cs:[GetKeyParams.RK_AltFlag]
                mov     SHL_Flag,0
                mov     GetKeyParams.RK_AltFlag,0
                mov     GetLineParams.GL_AllowSpc,0
                mov     ActiveFlags,0000000000000001b
                mov     FkeysFlags,0000000101b
                mov     ScreenIOparams.CursorFlag,1
                mov     GetLineParams.GL_Buffer,offset PathFilter
                mov     GetLineParams.GL_Pos,0
                mov     GetLineParams.GL_BegPrint,0
                mov     GetLineParams.GL_MaxLength,67+20h
                mov     GetLineParams.GL_MaxPrint,35
                mov     ScreenIOparams.CursorLen,1
                call    LinkPathFilter
                mov     GetLineParams.GL_Length,bl
                gotoxy  5,42
                GetLineService _GETLINE
                call    GetPathFilter
                call    ReadDir
                pop     word ptr cs:[GetKeyParams.RK_AltFlag]
                pop     word ptr cs:[ScreenIOparams.CursorFlag]
                mov     SHL_Flag,1
                GetLineService _GL_CLRBUFF
                clc
                ret

LinkPathFilter: push    ax si di es
                xor     bx,bx
                push    cs
                pop     es
                mov     si,offset Path
                mov     di,offset PathFilter
                cld
LPF_Loop1:      lodsb
                or      al,al
                jz      LPF_Filter
                stosb
                inc     bx
                jmp     LPF_Loop1
LPF_Filter:     mov     si,offset Filter
LPF_Loop2:      lodsb
                stosb
                inc     bx
                or      al,al
                jnz     LPF_Loop2
                dec     bx
                pop     es di si ax
                ret



GetPathFilter:  push    ax cx dx si di es
                push    cs
                pop     es
                xor     al,al
                mov     di,offset PathFilter
                cld
                mov     cx,20h+67
        repne   scasb
                dec     di
                mov     si,di
                std
GPF_Loop1:      cmp     si,offset PathFilter
                jna     GPF_NoPath
                lodsb
                cmp     al,'\'
                jne     GPF_Loop1
                add     si,2
                mov     dx,si
                mov     si,offset PathFilter
                mov     di,offset Path
                cld
GPF_Loop2:      lodsb
                stosb
                cmp     si,dx
                jna     GPF_Loop2
                dec     si
                dec     di
                xor     al,al
                stosb
                mov     Path[67],0
GPF_NoPath:     cld
                mov     di,offset Filter
                xor     cx,cx
GPF_Loop3:      lodsb
                stosb
                cmp     cx,20h
                je      GPF_LongFilt
                inc     cx
                or      al,al
                jnz     GPF_Loop3
                cmp     cx,1
                je      GPF_NoFilter
GPF_Ret:        pop     es di si dx cx ax
                ret

GPF_LongFilt:   dec     di
                xor     ax,ax
                stosb
                jmp     GPF_Ret

GPF_DefaultFilt db      '*.DSK,*.NBL',0
GPF_NoFilter:   mov     si,offset PathFilter
                mov     di,offset Path
                cld
GPF_Loop4:      lodsb
                stosb
                or      al,al
                jnz     GPF_Loop4
                mov     si,offset GPF_DefaultFilt
                mov     di,offset Filter
                mov     cx,offset GPF_NoFilter - offset GPF_DefaultFilt
        rep     movsb
                jmp     GPF_Ret



; -- Read Directory ------------------

RD_GetDirs?     db      1
Path            db      '.\',66 dup (0)         ; Current Path
Filter          db      '*.DSK,*.NBL',020h dup (0) ; Scan Filter
PathFilter      db      67+20h dup (0)          ; Path&Filter
WildCard        db      0Dh dup (0)             ; Temp
WC_AnyFile      db      '*.*',0                 ; For SubDirs scanning

BufPtr          dw      0
RD_0OfsSvd      dw      0
DTA             DTA_S   <0,0,0,0,0,0>

ReadDirectory   proc    near
                push    ax bx cx dx si di es
                call    Prepare4DOS
                mov     si,offset Path
                mov     di,si
                push    ds
                pop     es
                mov     ah,60h
                int     21h
                mov     dx,offset DTA
                mov     ah,1Ah
                int     21h

                xor     bx,bx
RD_SearchFor0:  cmp     Path[bx],0
                jz      RD_0Found
                inc     bx
                jmp     RD_SearchFor0
RD_0Found:      or      bx,bx
                jz      RD_PathOK
                cmp     Path[bx-1],'\'
                je      RD_PathOK
                mov     Path[bx],'\'
                inc     bx
                mov     Path[bx],0
RD_PathOK:      xor     si,si
                mov     RD_0OfsSvd,bx

                cmp     RD_GetDirs?,0
                jz      RD_GetFiles

RD_CopyWC1:     mov     al,WC_AnyFile[si]
                mov     Path[bx],al
                inc     si
                inc     bx
                cmp     al,0
                jnz     RD_CopyWC1
                mov     bx,BufPtr
                mov     dx,offset Path
                mov     cx,FA_DIRECTORY
                FindFirst
                jc      RD_GetFiles
RD_GetDirLoop:  test    DTA.Attributes,FA_DIRECTORY
                jz      RD_GD_Next
                cmp     DirectoryParams.S_MaxLength,0FEh
                je      RD_NoMoreFiles
                call    RD_PutFile
                inc     DirectoryParams.S_MaxLength
                add     bx,size DiskDescription
RD_GD_Next:     FindNext
                jnc     RD_GetDirLoop
                mov     BufPtr,bx

RD_GetFiles:    mov     bx,RD_0OfsSvd
                xor     si,si
RD_CopyWC2:     mov     al,WildCard[si]
                mov     Path[bx],al
                inc     si
                inc     bx
                cmp     al,0
                jnz     RD_CopyWC2
                mov     bx,BufPtr
                mov     dx,offset Path
                mov     cx,FA_ARCHIVE or FA_READ_ONLY
                FindFirst
                jc      RD_NoMoreFiles
RD_GetFilesLoop: cmp    DirectoryParams.S_MaxLength,0FEh
                je      RD_NoMoreFiles
                call    RD_PutFile
                inc     DirectoryParams.S_MaxLength
                add     bx,size DiskDescription
                FindNext
                jnc     RD_GetFilesLoop

RD_NoMoreFiles: mov     si,RD_0OfsSvd
                mov     byte ptr Path[si],0
                mov     BufPtr,bx
                call    SOD4eraperP
                pop     es di si dx cx bx ax
                ret
ReadDirectory   endp



PF_FileExts     db      'NBLDSK'
PF_FileTypes    db      FD_Nibble,FD_DOS33
PF_Addr         dw      PF_Directory,PF_Nibble,PF_DOS33
PF_NameLength   dw      ?
RD_PutFile      proc    near
                push    ax cx dx si di bp es
                xor     si,si
PF_GetNameLoop: mov     al,DTA.FileSpec[si]
                mov     DirectoryParams.S_Buffer[bx].FileName[si],al
                inc     si
                or      al,al
                jnz     PF_GetNameLoop
                mov     PF_NameLength,si

                or      bx,bx
                jz      PF_Cont1
                xor     bp,bp
PF_Cmp0:        xor     di,di
PF_Cmp1:        mov     al,DirectoryParams.S_Buffer[bp].FileName[di]
                cmp     al,DirectoryParams.S_Buffer[bx].FileName[di]
                jne     PF_NotMatch
                inc     di
                or      al,al
                jnz     PF_Cmp1
PF_Error:       sub     bx,size DiskDescription
                dec     DirectoryParams.S_MaxLength
                jmp     PF_Ret
PF_NotMatch:    add     bp,size DiskDescription
                cmp     bp,bx
                jne     PF_Cmp0

PF_Cont1:       mov     DirectoryParams.S_Buffer[bx].FileFlag,0
                test    DTA.Attributes,FA_DIRECTORY
                jz      PF_NotDir
                mov     DirectoryParams.S_Buffer[bx].FileType,FD_DIRECTORY
                jmp     PF_Ret

PF_NotDir:      push    cs
                pop     es
                cld
                lea     di,DirectoryParams.S_Buffer[bx].FileName
                inc     di
                mov     al,'.'
                mov     cx,PF_NameLength
        repne   scasb
                xor     dl,dl
                jcxz    PF_PokeType
                mov     bp,di
                mov     si,offset PF_FileExts
                mov     dh,2
PF_CmpExtLoop:  mov     di,bp
                mov     cx,3
                repe    cmpsb
                je      PF_PokeType
PF_3:           inc     si
                loop    PF_3
                inc     dl
                dec     dh
                jnz     PF_CmpExtLoop
                xor     dl,dl
PF_PokeType:    xor     dh,dh
                mov     di,dx
                xor     ax,ax
                mov     al,PF_FileTypes[di]
                mov     DirectoryParams.S_Buffer[bx].FileType,al
                mov     di,ax
                shl     di,1
                call    PF_Addr[di]
                and     DirectoryParams.S_Buffer[bx].FileFlag,not FF_READ_ONLY?
                test    DTA.Attributes,FA_READ_ONLY
                jz      PF_Ret
                or      DirectoryParams.S_Buffer[bx].FileFlag,FF_READ_ONLY?
PF_Ret:         pop     es bp di si dx cx ax
                ret
RD_PutFile      endp

PF_Directory:   mov     DirectoryParams.S_Buffer[bx].FileFlag,0
                ret

PF_DOS33:       mov     DirectoryParams.S_Buffer[bx].FileFlag,FF_MODIFYTYPE?
                ret

PF_Nibble:      mov     DirectoryParams.S_Buffer[bx].FileFlag,FF_MODIFYTYPE?
                ret


RD_NewDisk      db      1,0Fh,'<New Disk>',0
ReadDir         proc    near
                push    ax bx si di
                mov     GetKeyParams.RK_ErrPtr,offset SMS_ReadDir
                xor     ax,ax
                mov     DirectoryParams.S_MaxLength,al
                mov     BufPtr,ax
                mov     DirectoryParams.S_BegPrint,al
                mov     DirectoryParams.S_Pos,al
                mov     DirectoryParams.S_CX,0B2Ah
                mov     RD_GetDirs?,1
                xor     si,si
RD1_Loop0:      xor     di,di
RD1_Cloop:      mov     al,Filter[si]
                or      al,al
                jz      RD1_CallRead
                cmp     al,','
                je      RD1_CallRead
                mov     WildCard[di],al
                inc     si
                inc     di
                cmp     di,0Ch
                jb      RD1_Cloop
RD1_CallRead:   mov     WildCard[di],0
                call    ReadDirectory
                mov     RD_GetDirs?,0
                cmp     Filter[si],0
                jz      RD1_Done
RD1_Ignore:     inc     si
                cmp     Filter[si],','
                je      RD1_Ignore
                jmp     RD1_Loop0
RD1_Done:       mov     GetKeyParams.RK_ErrPtr,0
                mov     bl,DirectoryParams.S_MaxLength
                inc     DirectoryParams.S_MaxLength
                call    CalcBuffer
                xor     bx,bx
RD_CopyNewName: mov     al,RD_NewDisk[bx]
                mov     DirectoryParams.S_Buffer[di].FileName[bx],al
                inc     bx
                or      al,al
                jnz     RD_CopyNewName
                mov     DirectoryParams.S_Buffer[di].FileFlag,FF_MODIFYTYPE?
                mov     DirectoryParams.S_Buffer[di].FileType,FD_DOS33
                call    LinkPathFilter
                call    CheckInsertion
                pop     di si bx ax
                ret
ReadDir         endp


CheckInsertion: push    ax bx cx di bp ds es
                pushf
                push    cs
                pop     ds
                cmp     DirectoryParams.S_MaxLength,0
                jz      CI_Quit
                call    set_ptrs
                xor     cx,cx
                mov     bl,cl
                call    CalcBuffer
CI_Loop:        mov     bx,di
                call    LinkName
                xor     bx,bx
                call    present1
                jz      CI_NodiskA
CI_Loop1:       mov     al,SDA_Filename[bx]
                or      al,al
                jz      CI_L1exit
                inc     bx
                cmp     al,Path-1[bx]
                je      CI_Loop1
CI_L1exit:      mov     al,FF_INSERTED1?
                je      CI_ok1
CI_NodiskA:     xor     al,al
CI_ok1:         and     DirectoryParams.S_Buffer[di].FileFlag,not(FF_INSERTED1? or FF_INSERTED2?)
                or      DirectoryParams.S_Buffer[di].FileFlag,al
                xor     bx,bx
                call    present2
                jz      CI_NodiskB
CI_Loop2:       mov     al,SDB_Filename[bx]
                or      al,al
                jz      CI_L2exit
                inc     bx
                cmp     al,Path-1[bx]
                je      CI_Loop2
CI_L2exit:      mov     al,FF_INSERTED2?
                je      CI_ok2
CI_NodiskB:     xor     al,al
CI_ok2:         or      DirectoryParams.S_Buffer[di].FileFlag,al
                mov     bl,cl
                inc     cl
                add     di,size DiskDescription
                cmp     bl,DirectoryParams.S_MaxLength
                jb      CI_Loop
                call    UnLinkName
CI_Quit:        popf
                pop     es ds bp di cx bx ax
                ret
                assume  es:Emulate


LN_BX           dw      ?
LinkName:       pushf
                push    ax bx si di
                mov     si,bx
                lea     si,DirectoryParams.S_Buffer[si]
                mov     di,cs:RD_0OfsSvd
                xor     bx,bx
LN_Loop:        mov     al,cs:[si].FileName[bx]
                mov     cs:Path[di][bx],al
                inc     bx
                or      al,al
                jnz     LN_Loop
                dec     bx
                add     bx,di
                mov     cs:LN_BX,bx
                pop     di si bx ax
                popf
                ret



UnLinkName:     pushf
                push    bx
                mov     bx,cs:RD_0OfsSvd
                mov     cs:Path[bx],0
                pop     bx
                popf
                ret



Upcase:         cmp     al,'A'
                jb      UPCSret
                cmp     al,'Z'
                ja      UPCSret
                or      al,20h
UPCSret:        ret



CalcBuffer:     push    ax
                mov     al,size DiskDescription
                mul     bl
                mov     di,ax
                pop     ax
                ret


CalcCommand:    push    ax bx cx es             ; Returns number of a command
                push    cs                      ; Input:
                pop     es                      ; di -> offset Commands
                call    Upcase                  ; al -> search command
                cld                             ; cx -> commands count
                mov     bx,di
                repne   scasb                   ; Output:
                stc                             ; di <- Number of the command
                jne     CC_end                  ; cf <- 1 if not found
                sub     di,bx
                dec     di
                clc
CC_end:         pop     es cx bx ax
ccc             label   byte
                ret



; -- Hook INT 24h ----------------------

DOSflag         db      0
OldFlags        dw      0
Prepare4DOS:    saveall
                pushf
                xor     ax,ax
                mov     cs:SHL_Flag,al
                xchg    ax,cs:ActiveFlags
                mov     cs:OldFlags,ax
                mov     cs:DOSflag,1
                call    ShowAll
                ScreenIOservice _SHOWSCREEN
                call    far ptr SystemTINI
                popf
                restoreall
                ret



; -- Unhook INT 24h --------------------

SOD4eraperP:    saveall
                pushf
                mov     ax,cs:OldFlags
                mov     cs:ActiveFlags,ax
                mov     cs:SHL_Flag,1
                mov     ax,Emulate
                mov     es,ax
                mov     byte ptr [C000],0
                call    far ptr SystemINIT
                mov     cs:DOSflag,0
                popf
                restoreall
                ret



; *******************************************************************
; **                                                               **
; **                                                               **
; **                        S H O W    A L L                       **
; **                                                               **
; **                                                               **
; *******************************************************************

ActiveFlags     dw      0
ShowAll         proc    far
                push    ds bp
                push    word ptr [ScreenIOparams.CursorColor]
                push    word ptr [ScreenIOparams.CursorLen]
                push    word ptr [ScreenIOparams.CursorFlag]
                push    cs
                pop     ds
                mov     ScreenIOparams.CursorLen,14 ;36
                mov     ScreenIOparams.CursorColor,10h
                mov     ScreenIOparams.CursorFlag,1
                call    InitFlags
                ScreenIOservice _CLEARSCREEN
                call    ShowPathFilter
                call    ShowDirectory
                call    ShowDiskA
                call    ShowDiskB
                call    ShowImage
                call    ShowFuncKeys
                call    ShowError
                call    ShowMessage
                ScreenIOservice _SHOWLINE
                call    ShowHilights
                call    ShowTitle
                pop     word ptr [ScreenIOparams.CursorFlag]
                pop     word ptr [ScreenIOparams.CursorLen]
                pop     word ptr [ScreenIOparams.CursorColor]
                pop     bp ds
                ret
ShowAll         endp


; -- Draw box --------------------------
; Entry:
;  AH  = Active Flag Bit
;  CX  = HTAB & VTAB
;  BX  = Offset of the strings
;  DL  = Length of the box line - 1
;  DH  = Number of lines - 1
; Destroy:
;  AX,BX,CX,DX
DB_CX           dw      ?
DrawBox:        push    ax
                mov     ax,cx
                add     ax,80 * 2
                mov     cs:DB_CX,ax
                pop     ax
                test    ActiveFlags,ax
                mov     ah,7
                jz      DB_ok1
                mov     ah,0Eh
DB_ok1:         ScreenIOservice _STRINGPRINT
                mov     bx,ScreenIOparams.SP_bx
                dec     dh
                mov     al,dh
                mov     dx,cs:DB_CX
DB_Loop1:       mov     cx,dx
                add     dx,80 * 2
                ScreenIOservice _STRINGPRINT
                dec     al
                jnz     DB_Loop1
                mov     cx,dx
                mov     bx,ScreenIOparams.SP_bx
                ScreenIOservice _STRINGPRINT
                ret


IF_Procs        dw      IFP_F1,IFP_F2,IFP_F3,IFP_F4,IFP_F5
                dw      IFP_F6,IFP_F7,IFP_F8,IFP_F9,IFP_F0
InitFlags:      push    ax bx si di bp
                mov     bl,DirectoryParams.S_Pos
                call    CalcBuffer
                xor     si,si
                cmp     SHL_Flag,0
                mov     FkeysFlags,0000000100b
                jz      IF_0
IF_Loop:        call    IF_Procs[si]
                add     si,2
                cmp     si,20
                jb      IF_Loop
IF_0:           cmp     DOSflag,0
                jnz     IF_1
                cmp     ActiveFlags,0
                jnz     IF_Ret
IF_1:           mov     FkeysFlags,0
IF_Ret:         pop     bp di si bx ax
                ret

IFP_F1:         cmp     ManagerState,MS_NORMAL
                jne     IFP_F1ret
                or      FkeysFlags,0000000001b
                mov     SFK_Reboot[1],06Fh
                cmp     DirectoryParams.S_Buffer[di].FileType,FD_DIRECTORY
                je      IFP_F1ret
                test    DirectoryParams.S_Buffer[di].FileFlag,FF_INSERTED1? or FF_INSERTED2? or FF_DAMAGED?
                jnz     IFP_F1ret
                mov     SFK_Reboot[1],01Fh
IFP_F1ret:      ret

IFP_F2_D1       dw      Fkey_InsertA,Fkey_RemoveA
IFP_F2_D2       dw      Fkey_InsertB,Fkey_RemoveB
IFP_F2:         or      FkeysFlags,00000010b
                test    ActiveFlags,0000000000001000b
                mov     bx,offset IFP_F2_D1
                mov     ax,offset present1
                jz      IFP_F2_1
                mov     bx,offset IFP_F2_D2
                mov     ax,offset present2
IFP_F2_1:       call    ax
                mov     ax,[bx][2]
                mov     SFK_FkeysMain[2],offset SFK_Remove
                jnz     IFP_F2_2
                mov     ax,[bx][0]
                mov     SFK_FkeysMain[2],offset SFK_Insert
                cmp     DirectoryParams.S_Buffer[di].FileType,FD_DIRECTORY
                je      IFP_F2_12
                test    DirectoryParams.S_Buffer[di].FileFlag,FF_INSERTED1? or FF_INSERTED2? or FF_DAMAGED?
                jz      IFP_F2_2
IFP_F2_12:      and     FkeysFlags,11111101b
IFP_F2_2:       mov     Fkeys_Main[2],ax
                ret

IFP_F3:         or      FkeysFlags,0000000100b
                cmp     ManagerState,MS_NORMAL
                mov     SFK_FkeysMain[2*2],offset SFK_Apple
                mov     Fkeys_Main[2*2],offset Fkey_Apple
                je      IFP_F3_1
                mov     SFK_FkeysMain[2*2],offset SFK_Resume
                mov     Fkeys_Main[2*2],offset Fkey_Resume
IFP_F3_1:       ret

IFP_F4:         cmp     ManagerState,MS_NORMAL
                mov     SFK_FkeysMain[3*2],offset SFK_None
                mov     Fkeys_Main[3*2],offset Fkey_None
                je      IFP_F4_1
                or      FkeysFlags,0000001000b
                mov     SFK_FkeysMain[3*2],offset SFK_Abort
                mov     Fkeys_Main[3*2],offset Fkey_Abort
IFP_F4_1:       ret

IFP_F5:
IFP_F6:
IFP_F7:
IFP_F8:
IFP_F9:         ret

IFP_F0:         or      FkeysFlags,1100000000b
                test    ActiveFlags,1
                jz      IFP0_Ret
                mov     FkeysFlags,0000000101b
IFP0_Ret:       ret


ST_Str          db      '                               APPLER DISK MANAGER                              ',0
ShowTitle:      push    ax bx cx
                gotoxy  1,0
                mov     ah,6Fh
                mov     bx,offset ST_Str
                ScreenIOservice _STRINGPRINT
                gotoxy  2,0
                xor     ah,ah
                ScreenIOservice _STRINGPRINT
                pop     cx bx ax
                ret


SP_Str          db      'ÚPath&FilterÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿',0
                db      '³                                      ³',0
                db      'ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ',0
ShowPathFilter: push    ax bx cx dx
                gotoxy  3,40
                mov     bx,offset SP_Str
                mov     dh,3
                mov     ax,0000000000000001b
                call    DrawBox
                mov     bx,35
                xor     al,al
                xchg    PathFilter[bx],al
                mov     bx,offset PathFilter
                mov     ah,0Bh
                gotoxy  5,42
                ScreenIOservice _StringPrint
                mov     bx,35
                xchg    PathFilter[bx],al
SPF_Ret:        pop     dx cx bx ax
                ret


SD_Str          db      'ÚDirectoryÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿',0
                db      '³                                      ³',0
                db      'ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ',0

SD_Antet0       db      1,07h,'ÄÄÄÄÄÄÄÄÄÄÄÄ   ÄÄÄÄÄÄ   ÄÄÄÄÄÄÄÄÄÄ',0
SD_Antet1       db      1,07h,'Filename       Type     Access',0
SD_Antet2       db      1,07h,'Filename       ',1,0Fh,'T',1,07h,'ype     ',1,0Fh,'A',1,07h,'ccess',0
SD_NotFndMsg    db      1,7,'No Matching Files in Directory',0
SD_AntetAddr    dw      SD_Antet1,SD_Antet1,SD_Antet2,SD_Antet1
                dw      SD_Antet1,SD_Antet1,SD_Antet2,SD_Antet1

ShowDirectory:  push    ax bx cx dx di
                gotoxy  7,40
                mov     bx,offset SD_Str
                mov     dh,17
                mov     ax,0000000000000010b
                call    DrawBox
                cmp     DirectoryParams.S_MaxLength,0
                jnz     SD_ok2
                gotoxy  9,2Bh
                mov     bx,offset SD_NotFndMsg
                ScreenIOservice _STRINGPRINT
                jmp     SD_Ret
SD_ok2:         mov     bl,DirectoryParams.S_Pos
                call    CalcBuffer
                xor     bx,bx
                mov     bl,DirectoryParams.S_Buffer[di].FileFlag
                test    bl,11111000b
                jnz     SD_ok25
                and     bl,00000111b
                shl     bx,1
                mov     bx,SD_AntetAddr[bx]
                cmp     SHL_Flag,0
                jz      SD_ok25
                test    ActiveFlags,0000000000000010b
                jnz     SD_ok3
SD_ok25:        mov     bx,offset SD_Antet1
SD_ok3:         gotoxy  9,43
                ScreenIOservice _STRINGPRINT
                mov     bx,offset SD_Antet0
                gotoxy  10,43
                ScreenIOservice _STRINGPRINT
                mov     bl,DirectoryParams.S_BegPrint
                mov     dx,13
                mov     di,offset DirectoryParams.S_Buffer
                gotoxy  11,43
                mov     ah,7
SD_Loop0:       call    OneFile
                add     cx,80 * 2
                inc     bl
                cmp     bl,DirectoryParams.S_MaxLength
                je      SD_Ret0
                dec     dx
                jnz     SD_Loop0
SD_Ret0:        cmp     NameEntering,0
                jnz     SD_Ret
                mov     cx,DirectoryParams.S_CX
                ScreenIOservice _SHOWCURSOR
SD_Ret:         pop     di dx cx bx ax
                ret


SDA_Str         db      'ÚDrive 1ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ',0
                db      '³                                     ³ ',0
                db      'ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ',0
SDA_NoDisk      db      1,0Fh,'NO DISK IN DRIVE',0
SDA_File        db      1,7,'Name: ',0
SDA_Type        db      1,7,'Type: ',0
SDA_Access      db      'A',1,7,'ccess: ',0
SDA_Volume      db      'V',1,7,'olume:  ',0
SDA_Track       db      1,7,'Track:',1,0Fh,0
SDA_DOS33       db      1,0Bh,'DOS 3.3',0
SDA_Nibble      db      1,0Bh,'Nibblized',0
SDA_ReadOnly    db      1,0Bh,'R',0
SDA_RW          db      1,0Bh,'R/W',0
SDA_Color       db      ?
SDA_Filename    db      80h dup (0)
ShowDiskA:      push    ax bx cx dx si es
                gotoxy  3,0
                mov     bx,offset SDA_Str
                mov     dh,4
                mov     ax,0000000000000100b
                call    DrawBox
                les     si,disk1_ptr
                assume  es:seg CurrentDrive
                cmp     es:[si].FileHandle,0FFFFh
                jne     SDA_Show
                mov     bx,offset SDA_NoDisk
                gotoxy  5,11
                ScreenIOservice _STRINGPRINT
                jmp     SDA_Ret
SDA_Show:       mov     SDA_Color,7
                cmp     SHL_Flag,0
                jz      SDA_LoLight
                test    ActiveFlags,0000000000000100b
                jz      SDA_LoLight
                mov     SDA_Color,0Fh
SDA_LoLight:    gotoxy  5,2
                mov     bx,offset SDA_File
                ScreenIOservice _STRINGPRINT
                mov     bx,offset SDA_Filename
                call    ShowFilename
                gotoxy  6,2
                mov     bx,offset SDA_Type
                mov     ah,SDA_Color
                ScreenIOservice _STRINGPRINT
                cmp     es:[si].DiskType,0
                mov     bx,offset SDA_Nibble
                jz      SDA_Print
                mov     bx,offset SDA_DOS33
SDA_Print:      ScreenIOservice _STRINGPRINT
                gotoxy  5,26
                mov     bx,offset SDA_Access
                mov     ah,SDA_Color
                ScreenIOservice _STRINGPRINT
                cmp     es:[si].WriteProtect,0
                mov     bx,offset SDA_RW
                jz      SDA_ok1
                mov     bx,offset SDA_ReadOnly
SDA_ok1:        ScreenIOservice _STRINGPRINT
                cmp     es:[si].DiskType,0
                jz      SDA_Ret
                gotoxy  6,26
                mov     bx,offset SDA_Volume
                mov     ah,SDA_Color
                ScreenIOservice _STRINGPRINT
                mov     ah,0Bh
                mov     al,es:[si].Volume
                ScreenIOservice _BYTEPRINT
SDA_Ret:        gotoxy  3,30
                mov     bx,offset SDA_Track
                ScreenIOservice _STRINGPRINT
                mov     al,es:[si].Track
                mov     ah,0Fh
                ScreenIOservice _BYTEPRINT
                pop     es si dx cx bx ax
                ret
                assume  es:Emulate


SDB_Str         db      'ÚDrive 2ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ',0
                db      '³                                     ³ ',0
                db      'ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ',0
SDB_Type        db      0
SDB_Filename    db      80h dup (0)
ShowDiskB:      push    ax bx cx dx si es
                gotoxy  8,0
                mov     bx,offset SDB_Str
                mov     dh,4
                mov     ax,0000000000001000b
                call    DrawBox
                les     si,disk2_ptr
                assume  es:seg CurrentDrive
                cmp     es:[si].FileHandle,0FFFFh
                jne     SDB_Show
                mov     bx,offset SDA_NoDisk
                gotoxy  10,11
                ScreenIOservice _STRINGPRINT
                jmp     SDB_Ret
SDB_Show:       mov     SDA_Color,7
                cmp     SHL_Flag,0
                jz      SDB_LoLight
                test    ActiveFlags,0000000000001000b
                jz      SDB_LoLight
                mov     SDA_Color,0Fh
SDB_LoLight:    gotoxy  10,2
                mov     bx,offset SDA_File
                ScreenIOservice _STRINGPRINT
                mov     bx,offset SDB_Filename
                call    ShowFilename
                gotoxy  11,2
                mov     bx,offset SDA_Type
                mov     ah,SDA_Color
                ScreenIOservice _STRINGPRINT
                cmp     es:[si].DiskType,0
                mov     bx,offset SDA_Nibble
                jz      SDB_Print
                mov     bx,offset SDA_DOS33
SDB_Print:      ScreenIOservice _STRINGPRINT
                gotoxy  10,26
                mov     bx,offset SDA_Access
                mov     ah,SDA_Color
                ScreenIOservice _STRINGPRINT
                cmp     es:[si].WriteProtect,0
                mov     bx,offset SDA_RW
                jz      SDB_ok1
                mov     bx,offset SDA_ReadOnly
SDB_ok1:        ScreenIOservice _STRINGPRINT
                cmp     es:[si].DiskType,0
                jz      SDB_Ret
                gotoxy  11,26
                mov     bx,offset SDA_Volume
                mov     ah,SDA_Color
                ScreenIOservice _STRINGPRINT
                mov     ah,0Bh
                mov     al,es:[si].Volume
                ScreenIOservice _BYTEPRINT
SDB_Ret:        gotoxy  8,30
                mov     bx,offset SDA_Track
                ScreenIOservice _STRINGPRINT
                mov     al,es:[si].Track
                mov     ah,0Fh
                ScreenIOservice _BYTEPRINT
                pop     es si dx cx bx ax
                ret
                assume  es:Emulate


ShowFilename:   push    ax si di es
                push    cx
                cmp     byte ptr ds:[bx],0
                stc
                jz      SF_Ret
                mov     di,bx
                mov     ax,ds
                mov     es,ax
                mov     cx,0FFh
                xor     al,al
                cld
                repne   scasb
                std
                mov     si,di
                dec     si
SF_Loop1:       lodsb
                cmp     al,'\'
                je      SF_ok
                cmp     si,bx
                jae     SF_Loop1
                dec     si
SF_ok:          mov     bx,si
                add     bx,2
                mov     ah,3
                clc
                pop     cx
                pushf
                ScreenIOservice _STRINGPRINT
                popf
SF_Ret:         pop     es di si ax
                ret


SI_Str          db      'ÚDOS 3.3 Sector ImageÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ',0
                db      '³                                     ³ ',0
                db      'ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ',0
SI_AdrP         db      1,7,'Address Field Prolog:      ',0
SI_AdrChecksum  db      1,7,'Address Field Checksum:    ',0
SI_AdrE         db      1,7,'Address Field Epilog:      ',0
SI_DataP        db      1,7,'Data Field Prolog:         ',0
SI_DataChecksum db      1,7,'Data Field Checksum:       ',0
SI_DataE        db      1,7,'Data Field Epilog:         ',0
SI_EOS          db      1,7,'End-Of-Sector Byte:        ',0
SI_Texts        dw      SI_AdrP,?,?
                dw      SI_AdrChecksum
                dw      SI_AdrE,?,?
                dw      SI_DataP,?,?
                dw      SI_DataChecksum
                dw      SI_DataE,?,?
                dw      SI_EOS,?
SI_TextFlags    db      1,0,0,1,1,0,0,1,0,0,1,1,0,0,1
ShowImage:      push    ax bx cx dx si di ds
                gotoxy  13,0
                mov     bx,offset SI_Str
                mov     dh,10
                mov     ax,0000000000010000b
                call    DrawBox
                mov     ax,seg SectorImage
                mov     ds,ax
                mov     si,offset SectorImage
                mov     dx,offset SectorImageF
                cld
                xor     di,di
SI_Loop:        cmp     cs:SI_TextFlags[di],0
                jz      SI_Dont
                mov     ch,cs:I_CH[di]
                dec     ch
                mov     al,ch
                mov     ah,80 * 2
                mul     ah
                add     ax,2*2
                mov     cx,ax
                shl     di,1
                mov     bx,cs:SI_Texts[di]
                shr     di,1
                ScreenIOservice _STRINGPRINT
SI_Dont:        xchg    dx,si
                lodsb
                xchg    dx,si
                or      al,al
                mov     ah,3
                jz      SI_ok1
                mov     ah,0Bh
SI_ok1:         lodsb
                ScreenIOservice _BYTEPRINT
                add     cx,2
                inc     di
                cmp     di,size SectorImage_S
                jb      SI_Loop
                pop     ds di si dx cx bx ax
                ret


SMS_ReadDir       db    'Accessing Disk Directory...',0
SMS_DecodeErr     db    1,8Ch,'Drive ',3
                  dw    DM_DriveNum
                  db    ': Error Decoding Track Data',0
SMS_EnterFilename db    'Enter Filename (<Esc> cancel)',0
ShowMessage:    push    ax bx cx
                cmp     GetKeyParams.RK_ErrPtr,0
                jz      SMS_Ret
                gotoxy  18h,1
                mov     bx,GetKeyParams.RK_ErrPtr
                mov     ah,0Ah
                ScreenIOservice _STRINGPRINT
SMS_Ret:        pop     cx bx ax
                ret



SFK_Str         db      '1       2       3       4       5       '
                db      '6       7       8       9      10       ',0
FkeysFlags      dw      1010000111b
SFK_FkeysMain   dw      SFK_Reboot,SFK_Insert,SFK_Apple,SFK_None,SFK_None
                dw      SFK_None,SFK_None,SFK_None,SFK_PathFilter,SFK_Rescan
SFK_Reboot      db      1,6Fh,'Reboot',0
SFK_Apple       db      1,6Fh,'Apple ',0
SFK_Resume      db      1,6Fh,'Resume',0
SFK_Abort       db      1,6Fh,'Abort ',0
SFK_Insert      db      1,6Fh,'Insert',0
SFK_Remove      db      1,6Fh,'Remove',0
SFK_PathFilter  db      1,6Fh,'Path&F',0
SFK_Rescan      db      1,6Fh,'Rescan',0
SFK_None        db      1,6Fh,'      ',0

ShowFuncKeys:   push    ax bx cx dx si
                gotoxy  19h,0
                mov     bx,offset SFK_Str
                mov     ah,7
                ScreenIOservice _STRINGPRINT
                gotoxy  19h,1
                xor     si,si
                mov     dx,FkeysFlags
SFK_Loop0:      shr     dx,1
                mov     ah,8
                jnc     SFK_Next0
                mov     ah,0Fh
SFK_Next0:      mov     bx,SFK_FkeysMain[si]
                and     byte ptr [bx+1],0F0h
                or      byte ptr [bx+1],ah
                ScreenIOservice _STRINGPRINT
                add     cx,4
                add     si,2
                cmp     si,20
                jb      SFK_Loop0
                pop     si dx cx bx ax
                ret


SE_BadAdrChk    db      'Bad address checksum: ',3
                dw      DM_BadData,0
SE_BadAdrEpi    db      'Bad address epilog, S:',3
                dw      DM_Sector,0
SE_BadTrack     db      'Wrong track number: ',3
                dw      DM_BadData
                db      ', S:',3
                dw      DM_Sector,0
SE_BadSector    db      'Sector number not allowed: ',3
                dw      DM_BadData,0
SE_MisingData   db      'Data field not found, S:',3
                dw      DM_Sector,0
SE_DuplicateSec db      'Sector found twice: ',3
                dw      DM_BadData
                db      ', S:',3
                dw      DM_Sector,0
SE_BadDataChk   db      'Bad data checksum: ',3
                dw      DM_BadData
                db      ', S:',3
                dw      DM_Sector,0
SE_BadDataImg   db      'Bad nibble byte, S:',3
                dw      DM_Sector,0
SE_BadDataEpi   db      1,8Ch,'Bad data epilog, S:',3
                dw      DM_Sector,0
SE_BadEnd       db      'Bad end-of-sector byte, S:',3
                dw      DM_Sector,0
SE_MissingSec   db      'Can''t find sector: ',3
                dw      DM_BadData,0
SE_WriteAttempt db      'Write protected',0
SE_ErrorAddress dw      SE_BadAdrChk
                dw      SE_BadAdrEpi
                dw      SE_BadTrack
                dw      SE_BadSector
                dw      SE_MisingData
                dw      SE_DuplicateSec
                dw      SE_BadDataChk
                dw      SE_BadDataImg
                dw      SE_BadDataEpi
                dw      SE_BadEnd
                dw      SE_MissingSec
                dw      SE_WriteAttempt
ShowError:      push    ax bx cx
                cmp     ManagerState,MS_NORMAL
                je      SE_Ret
                cmp     DM_DriveNum,1
                gotoxy  4,2
                je      SE_ok1
                gotoxy  9,2
SE_ok1:         xor     bx,bx
                mov     bl,DM_ErrorCode
                shl     bx,1
                mov     bx,SE_ErrorAddress[bx]
                mov     ah,0Ch
                ScreenIOservice _STRINGPRINT
SE_Ret:         pop     cx bx ax
                ret

SHL_Flag        db      1
ShowHilights:   cmp     SHL_Flag,0
                jz      SHL_Ret
                push    ax cx
                gotoxy  13,16
                mov     ax,0E00h+'I'
                ScreenIOservice _SYMBPRINT
                gotoxy  3,7
                mov     al,'1'
                ScreenIOservice _SYMBPRINT
                gotoxy  8,7
                mov     al,'2'
                ScreenIOservice _SYMBPRINT
                gotoxy  3,41
                mov     al,'P'
                ScreenIOservice _SYMBPRINT
                gotoxy  7,41
                mov     al,'D'
                ScreenIOservice _SYMBPRINT
SHL_Exit:       pop     cx ax
SHL_Ret:        ret


OF_CX           dw      ?
OF_Types        dw      OF_Directory,OF_Nibble,OF_DOS33
OF_Directory    db      1,7,'<DIR>',0
OF_DOS33        db      'DOS3.3',0
OF_Nibble       db      'Nibble',0
OF_RO           db      'Read Only ',0
OF_RW           db      'Read/Write',0
OF_DirAccess    db      1,7,'   ----   ',0
OF_Inserted1    db      1,0Fh,'Inserted in Drive 1',0
OF_Inserted2    db      1,0Fh,'Inserted in Drive 2',0
OF_Base         dw      ?
OF_Color        db      ?
comment         %
                push    ax dx ds
                mov     ax,4d9h
                mov     ds,ax
                mov     dx,103h
                mov     ax,2509h
                int     21h
                pop     ds dx ax
                int     3
                %
OneFile:        push    ax bx cx dx di
                mov     OF_Base,di
                mov     OF_CX,cx
                call    CalcBuffer
                mov     bp,OF_Base
                lea     bx,ds:[bp][di].FileName
                test    ds:[bp][di].FileFlag,FF_DAMAGED?
                mov     OF_Color,0Bh
                jz      OF_hop1
                mov     ah,0Ch
                mov     OF_Color,ah
OF_hop1:        ScreenIOservice _STRINGPRINT
                mov     cx,OF_CX
                add     cx,2*15
                mov     bp,OF_Base
                test    ds:[bp][di].FileFlag,FF_INSERTED1? or FF_INSERTED2?
                jz      OF_NotInserted
                test    ds:[bp][di].FileFlag,FF_INSERTED1?
                mov     bx,offset OF_Inserted1
                jnz     OF_id1
                mov     bx,offset OF_Inserted2
OF_id1:         ScreenIOservice _STRINGPRINT
                jmp     OF_Ret
OF_NotInserted: xor     bx,bx
                push    bp
                mov     al,ds:[bp][di].FileType
                mov     bl,al
                shl     bx,1
                mov     bx,OF_Types[bx]
                mov     ah,OF_Color
                ScreenIOservice _STRINGPRINT
                cmp     al,FD_DIRECTORY
                mov     bx,offset OF_DirAccess
                pop     bp
                je      OF_hop2
                test    ds:[bp][di].FileFlag,FF_READ_ONLY?
                mov     bx,offset OF_RO
                jnz     OF_hop2
                mov     bx,offset OF_RW
OF_hop2:        mov     cx,OF_CX
                add     cx,2*24
                ScreenIOservice _STRINGPRINT
OF_Ret:         pop     di dx cx bx ax
                ret




; *******************************************************************
; **                                                               **
; **                                                               **
; **               K E Y B O A R D   S E R V I C E S               **
; **                                                               **
; **                                                               **
; *******************************************************************

Alt_Keys        db      'ipd12'
Alt_Procs       dw      Alt_Image,Alt_PathFilter,Alt_Directory,Alt_D1,Alt_D2
Alt_Key         proc    far
                push    cx si di ds
                mov     di,offset Alt_Keys
                mov     cx,offset Alt_Procs- offset Alt_Keys
                call    CalcCommand
                jc      Alt_Ret
Alt_ok:         shl     di,1
                call    cs:Alt_Procs[di]
                mov     al,7Fh
Alt_Ret:        pop     ds di si cx
                ret

Alt_PathFilter  proc    near
                mov     cs:GoWhere?,G_PATH_FILTER
                ret
Alt_PathFilter  endp

Alt_Directory   proc    near
                mov     cs:GoWhere?,G_DIRECTORY
                ret
Alt_Directory   endp

Alt_Image       proc    near
                mov     cs:GoWhere?,G_IMAGE
                ret
Alt_Image       endp

Alt_D1          proc    near
                mov     cs:GoWhere?,G_D1
                ret
Alt_D1          endp

Alt_D2          proc    near
                mov     cs:GoWhere?,G_D2
                ret
Alt_D2          endp

Alt_Key         endp



FkeysMasks      dw      1b,10b,100b,1000b,10000b,100000b,1000000b,10000000b,100000000b,1000000000b
Fkeys_Main      dw      Fkey_Reboot,Fkey_None,Fkey_Apple,Fkey_InsertA,Fkey_InsertB
                dw      Fkey_None,Fkey_None,Fkey_None,Fkey_PathFilter,Fkey_Rescan
Fkey            proc    far
                push    ax bx cx dx si di bp ds es
                push    cs
                pop     ds
                push    word ptr ds:[ScreenIOparams.CursorLen]
                push    word ptr ds:[ScreenIOparams.CursorFlag]
                push    ds:[GetLineParams.GL_Buffer]
                push    ds:[GetLineParams.GL_CX]
                push    [ActiveFlags]
                push    [FkeysFlags]
                mov     bx,Emulate
                mov     es,bx
                xor     bx,bx
                mov     bl,al
                shl     bx,1
                mov     si,bx
                mov     ax,FkeysMasks[si]
                test    FkeysFlags,ax
                jz      Fkey_Ret
                xor     bx,bx
                call    Fkeys_Main[si]
                mov     cx,DirectoryParams.S_CX
Fkey_Ret:       pop     [FkeysFlags]
                pop     [ActiveFlags]
                pop     ds:[GetLineParams.GL_CX]
                pop     ds:[GetLineParams.GL_Buffer]
                pop     word ptr ds:[ScreenIOparams.CursorFlag]
                pop     word ptr ds:[ScreenIOparams.CursorLen]
                pop     es ds bp di si dx cx bx ax
                ret
Fkey            endp

Fkey_InsertA:   clc
                call    InsertDisk
                ret

Fkey_InsertB:   stc
                call    InsertDisk
                ret

; Entry:
;   CF -- 0 - Disk1, 1 - Disk2
ID_Flags        db      ?
ID_Rescan?      db      ?
ID_Ext          db      '.DSK',0
InsertDisk:     mov     ID_Rescan?,0
                mov     si,offset SDA_Filename
                jnc     ID_Disk1
                mov     si,offset SDB_Filename
ID_Disk1:       lahf
                mov     ID_Flags,ah
                cmp     DirectoryParams.S_MaxLength,0
                jz      ID_Ret
                mov     bl,DirectoryParams.S_Pos
                call    CalcBuffer
                test    DirectoryParams.S_Buffer[di].FileFlag,FF_INSERTED1? or FF_INSERTED2?
                jnz     ID_Ret
                cmp     DirectoryParams.S_Buffer[di].FileType,FD_DIRECTORY
                je      ID_Ret
                cmp     DirectoryParams.S_Buffer[di].FileName[0],1
                jne     ID_NotNew
                mov     ID_Rescan?,1
                add     di,size DiskDescription
                call    EnterFilename
                jc      ID_Quit
                push    si di
                lea     di,DirectoryParams.S_Buffer[di].FileName
                mov     si,offset ID_Ext
                call    AddExt
                pop     di si
                mov     DirectoryParams.S_Buffer[di].FileType,FD_NIBBLE
                jc      ID_NotDOS33
                mov     DirectoryParams.S_Buffer[di].FileType,FD_DOS33
ID_NotDOS33:    mov     bx,di
                call    CreateDisk
                jc      ID_Err
ID_NotNew:      mov     bx,di
                call    LinkName
                xor     bx,bx
ID_Loop:        mov     al,Path[bx]
                mov     [si][bx],al
                inc     bx
                or      al,al
                jnz     ID_Loop
                call    UnlinkName
                mov     dx,si
                mov     bl,DirectoryParams.S_Buffer[di].FileType
                dec     bl
                mov     bh,0FEh
                test    DirectoryParams.S_Buffer[di].FileFlag,FF_READ_ONLY?
                mov     al,1
                jnz     ID_1
                xor     al,al
ID_1:           mov     ah,ID_Flags
                sahf
                call    OpenDiskFile
                jc      ID_Err
                and     DirectoryParams.S_Buffer[di].FileFlag,not FF_DAMAGED?
                clc
                jmp     ID_Ret
ID_Err:         or      DirectoryParams.S_Buffer[di].FileFlag,FF_DAMAGED?
                mov     ah,ID_Flags
                sahf
                call    CloseDiskFile
                stc
ID_Ret:         cmp     ID_Rescan?,0
                jz      ID_Quit
                call    ReadDir
ID_Quit:        ret

CreateDisk:     push    ax bx dx cx
                call    LinkName
                mov     dx,offset Path
                mov     ah,3Ch
                xor     cx,cx
                int     21h
                jc      CD_Err
                mov     bx,ax
                mov     ah,3Eh
                int     21h
CD_Err:         call    UnlinkName
                pop     cx dx bx ax
                ret


Fkey_RemoveA:   call    CloseDiskFile1
                mov     cs:SDA_Filename[0],0
                ret

Fkey_RemoveB:   call    CloseDiskFile2
                mov     cs:SDB_Filename[0],0
                ret

Fkey_Reboot:    call    Fkey_InsertA
                jc      FR_Ret
                call    ResetAppleII
                call    GoAppleII
FR_Ret:         ret

Fkey_PathFilter: call   S_PathFilter
                ret

Fkey_Rescan:    call    ReadDir
                ret

Fkey_Apple:     call    GoAppleII
                ret

Fkey_Resume:    clc
                jmp     DMentry_Exit
Fkey_Abort:     stc
                jmp     DMentry_Exit

Fkey_None:
                ret


NameEntering    db      0
EnterFilename:  push    ax bx cx dx di
                mov     NameEntering,1
                push    word ptr [GetKeyParams.RK_AltFlag]
                push    word ptr [FkeysFlags]
                push    word ptr [SHL_Flag]
                mov     GetLineParams.GL_Color,0Bh
                mov     GetKeyParams.RK_AltFlag,0
                mov     SHL_Flag,0
                mov     FkeysFlags,0000000100b
                mov     ScreenIOparams.CursorFlag,1
                lea     bx,DirectoryParams.S_Buffer[di].FileName
                mov     GetLineParams.GL_Buffer,bx
                mov     GetLineParams.GL_Pos,0
                mov     GetLineParams.GL_BegPrint,0
                mov     GetLineParams.GL_MaxLength,0Ch
                mov     GetLineParams.GL_MaxPrint,0Dh
                mov     GetLineParams.GL_Length,0
                mov     ScreenIOparams.CursorLen,1
                mov     cx,DirectoryParams.S_CX
                dec     ch
                inc     cl
                mov     al,80 * 2
                mul     ch
                xor     bx,bx
                mov     bl,cl
                shl     bx,1
                add     ax,bx
                mov     cx,ax
                mov     GetKeyParams.RK_ErrPtr,offset SMS_EnterFilename
                GetLineService _GETLINE
                pop     word ptr [SHL_Flag]
                pop     word ptr [FkeysFlags]
                pop     word ptr [GetKeyParams.RK_AltFlag]
                gotoxy  2,0
                mov     GetLineParams.GL_CX,cx
                mov     NameEntering,0
                pop     di dx cx bx ax
                ret




GetLineUser     proc    far
                ret
GetLineUser     endp


GoAppleII:      push    ax bx es
                xor     bx,bx
                xchg    bx,ActiveFlags
                call    ShowAll
                ScreenIOservice _SHOWSCREEN
                mov     ax,Emulate
                mov     es,ax
                mov     al,C050
                ScreenIOservice _SetScreen
                SwitchToProcess PID_EMULATOR
                mov     ActiveFlags,bx
                pop     es bx ax
                ret


; Entry:
;   DS:DX^  -- Filename
;   AL      -- Access Mode: 0 - Don't Change, else Read Only
;   BL      -- Type: 0 - Nibble, 1 - DOS 3.3
;   BH      -- Volume (for DOS 3.3 type only)
;   CF      -- 0 - Disk1, 1 - Disk2
; Exit:
;   CF      -- Cleared if successfull
                assume  es:seg CurrentDrive
OpenDiskFile    proc    far
                push    ax bx cx dx si di bp ds es
                call    set_ptrs
                mov     cl,al
                les     bp,cs:disk1_ptr
                mov     di,offset SDA_Filename
                jnc     ODF_Continue
                les     bp,cs:disk2_ptr
                mov     di,offset SDB_Filename
ODF_Continue:   call    CloseDiskFIle
                mov     ax,3D02h
                int     21h
                jnc     ODF_1
                mov     ax,3D00h
                int     21h
                jc      ODF_Quit
                stc
ODF_1:          mov     es:[bp].FileHandle,ax
                mov     es:[bp].DiskType,bl
                mov     es:[bp].Volume,bh
                mov     bl,0FFh
                jc      ODF_2
                xor     bl,bl
ODF_2:          or      cl,cl
                jz      ODF_3
                mov     bl,0FFh
ODF_3:          mov     es:[bp].WriteProtect,bl
                mov     si,dx
                mov     bx,es:[bp].FileHandle
                mov     cx,1
                mov     dx,1000h
                mov     ax,4200h
                int     21h
                jc      ODF_Ret
                push    ds
                push    cs
                pop     ds
                mov     cx,40h
                mov     dx,offset ODF_TempBuffer
                mov     ah,3Fh
                int     21h
                jc      ODF_Ret
                cmp     ax,cx
                jne     ODF_Ret
                cmp     ODF_TempBuffer[3],3
                jne     ODF_Ret
                cmp     ODF_TempBuffer[35h],10h
                jne     ODF_Ret
                cmp     word ptr ODF_TempBuffer[36h],100h
                jne     ODF_Ret
                mov     al,ODF_TempBuffer[6]
                mov     es:[bp].Volume,al
ODF_Ret:        pop     ds
                push    cs
                pop     es
                mov     ah,60h
                int     21h
                clc
                call    CheckInsertion
ODF_Quit:       pop     es ds bp di si dx cx bx ax
                ret
ODF_TempBuffer  db      40h dup (?)
OpenDiskFile    endp

; Entry:
;   CF      -- 0 - Disk1, 1 - Disk2
CloseDiskFile   proc    near
                push    ax bx bp es
                call    set_ptrs
                les     bp,cs:disk1_ptr
                jnc     CDF_Disk1
                les     bp,cs:disk2_ptr
                assume  es:seg CurrentDrive
CDF_Disk1:      mov     bx,es:[bp].FileHandle
                inc     bx
                jz      CDF_NoDisk
                dec     bx
                cmp     cs:ManagerState,MS_NORMAL
                jne     CDF_FlushOK             ; Don't flush while in error
                cmp     bp,offset CurrentDrive
                jne     CDF_FlushOK             ; Flush only if close current
                call    FlushBuffer
CDF_FlushOK:    mov     ah,3Eh
                int     21h
                jc      CDF_Ret
                mov     es:[bp].FileHandle,0FFFFh
                call    CheckInsertion
CDF_Ret:        clc
CDF_Quit:       pop     es bp bx ax
                ret
CDF_NoDisk:     stc
                jmp     CDF_Quit
CloseDiskFile   endp

OpenDiskFile1   proc    far
                push    ax bx dx bp ds es
                call    set_ptrs
                push    cs
                pop     ds
                les     bp,disk1_ptr
                mov     dx,offset SDA_Filename
                cmp     SDA_Filename[0],0
                jz      ODF1_NoFile
                mov     bl,es:[bp].DiskType
                mov     bh,es:[bp].Volume
                mov     al,es:[bp].WriteProtect
                clc
                call    OpenDiskFile
                jnc     ODF1_Ret
ODF1_NoFile:    mov     es:[bp].FileHandle,0FFFFh
                call    CheckInsertion
ODF1_Ret:       pop     es ds bp dx bx ax
                ret
OpenDiskFile1   endp

OpenDiskFile2   proc    far
                push    ax bx dx bp ds es
                call    set_ptrs
                push    cs
                pop     ds
                les     bp,disk2_ptr
                mov     dx,offset SDB_Filename
                cmp     SDB_Filename[0],0
                jz      ODF2_NoFile
                mov     bl,es:[bp].DiskType
                mov     bh,es:[bp].Volume
                mov     al,es:[bp].WriteProtect
                stc
                call    OpenDiskFile
                jnc     ODF2_Ret
ODF2_NoFile:    mov     es:[bp].FileHandle,0FFFFh
                call    CheckInsertion
ODF2_Ret:       pop     es ds bp dx bx ax
                ret
OpenDiskFile2   endp

CloseDiskFile1  proc    far
                clc
                call    CloseDiskFile
                jnc     CDF1_Ret
                mov     cs:SDA_Filename[0],0
CDF1_Ret:       ret
CloseDiskFile1  endp

CloseDiskFile2  proc    far
                stc
                call    CloseDiskFile
                jnc     CDF2_Ret
                mov     cs:SDB_Filename[0],0
CDF2_Ret:       ret
CloseDiskFile2  endp
                assume  es:Emulate

; Entry:
;   DL     <-- Sector (0FFh if an invalid sector number)
;   AH     <-- Error Code
;   AL     <-- Bad Data
; Exit:
;   CF     --> 0 - Retry, 1 - Abort
OldEnableTask   db      ?
DM_ScreenMode   db      ?
DMentry_SP      dw      ?
DM_ErrorCode    db      ?
DM_BadData      db      ?
DM_DriveNum     db      ?
DM_Sector       db      ?
DM_OldKeyTable  dw      ?
DM_old_gl       dd      ?
DM_old_sio      dd      ?
DM_old_rk       dd      ?
DM_SwapFlag     db      ?
DMentry         proc    far
                SaveAll
                push    word ptr cs:[GetKeyParams.RK_AltFlag]

                mov     bx,seg k_Table          ; Save Current Key Table
                mov     ds,bx
                assume  ds:seg k_Table
                mov     bx,ds:k_Table
                mov     cs:DM_OldKeyTable,bx

                mov     bx,CONio                ; Save Current CONIO Params
                mov     ds,bx
                assume  ds:CONio
                mov     bx,ds:GL_ParamsOfs
                mov     word ptr cs:DM_old_gl[0],bx
                mov     bx,ds:GL_ParamsSeg
                mov     word ptr cs:DM_old_gl[2],bx
                mov     bx,ds:SIO_ParamsOfs
                mov     word ptr cs:DM_old_sio[0],bx
                mov     bx,ds:SIO_ParamsSeg
                mov     word ptr cs:DM_old_sio[2],bx
                mov     bx,ds:RK_ParamsOfs
                mov     word ptr cs:DM_old_rk[0],bx
                mov     bx,ds:RK_ParamsSeg
                mov     word ptr cs:DM_old_rk[2],bx

                call    DM_InInitP
                mov     bx,seg SwapFlag
                mov     ds,bx
                assume  ds:seg SwapFlag
                mov     al,1
                xchg    al,ds:SwapFlag
                mov     cs:DM_SwapFlag,al
                mov     bx,seg EnableTaskSwitch
                mov     ds,bx
                assume  ds:seg EnableTaskSwitch
                xor     bl,bl
                xchg    ds:EnableTaskSwitch,bl
                mov     cs:OldEnableTask,bl
                mov     bx,seg CurrentDrive
                mov     ds,bx
                assume  ds:seg CurrentDrive
                mov     cl,ds:CurrentDrive.ID
                push    cs
                pop     ds
                assume  DS:DM
                mov     ScreenIOparams.CursorFlag,0
                mov     DM_ErrorCode,ah
                mov     DM_Sector,dl
                mov     DM_BadData,al
                inc     cl
                mov     DM_DriveNum,cl
                dec     cl
                mov     ActiveFlags,0000000000000100b
                mov     GoWhere?,G_D1
                jz      DMentry_1
                mov     ActiveFlags,0000000000001000b
                mov     GoWhere?,G_D2
DMentry_1:      mov     ah,0Fh
                int     10h
                mov     DM_ScreenMode,al
                mov     I_CurrentSVD,0
                mov     ManagerState,MS_ERROR
                mov     DMentry_SP,sp
                mov     GetKeyParams.RK_ErrPtr,offset SMS_DecodeErr
                jmp     DM_MainRet
;               ---------------------
DMentry_Exit:   mov     sp,DMentry_SP
                pushf
                mov     ManagerState,MS_NORMAL
                mov     ax,seg EnableTaskSwitch
                mov     ds,ax
                assume  ds:seg EnableTaskSwitch
                mov     al,cs:OldEnableTask
                mov     ds:EnableTaskSwitch,al
                call    DM_OutInitP

                mov     ax,seg k_Table          ; Restore Entry Key Table
                mov     ds,ax
                assume  ds:seg k_Table
                mov     ax,cs:DM_OldKeyTable
                mov     ds:k_Table,ax

                mov     ax,CONio                ; Restore Entry CONIO Params
                mov     ds,ax
                assume  ds:CONio
                mov     ax,word ptr cs:DM_old_gl[0]
                mov     ds:GL_ParamsOfs,ax
                mov     ax,word ptr cs:DM_old_gl[2]
                mov     ds:GL_ParamsSeg,ax
                mov     ax,word ptr cs:DM_old_sio[0]
                mov     ds:SIO_ParamsOfs,ax
                mov     ax,word ptr cs:DM_old_sio[2]
                mov     ds:SIO_ParamsSeg,ax
                mov     ax,word ptr cs:DM_old_rk[0]
                mov     ds:RK_ParamsOfs,ax
                mov     ax,word ptr cs:DM_old_rk[2]
                mov     ds:RK_ParamsSeg,ax

                cmp     cs:DM_ScreenMode,3
                jne     DM_Entry_2
                cmp     cs:DM_SwapFlag,0
                jz      DM_Entry_2
                ScreenIOservice _SHOWSCREEN
                jmp     DM_Entry_3
DM_Entry_2:     mov     ax,seg C050
                mov     es,ax
                assume  es:seg C050
                mov     al,es:C050
                ScreenIOservice _SetScreen
DM_Entry_3:     popf
                pop     word ptr cs:[GetKeyParams.RK_AltFlag]
                RestoreAll
                ret
DMentry         endp
                assume  es:Emulate

DM              ends
                END

Generated by GNU Enscript 1.6.6, and GophHub 1.3.