; _____________________________________________ ; | | ; | Project: APPLER | ; | File: FM.ASM | ; | Compiler: 16-bit TASM (2.5) | ; | | ; | Subject: File Manager | ; | | ; | Author: Emil Dotchevski | ; |_____________________________________________| include GLOBALS.INC include INTERFAC.INC include CONIO.INC include FM.INC G_DIRECTORY = 0 G_MEMORY = 1 G_PATH_FILTER = 2 FM segment public assume cs:FM,ds:FM,es:Emulate GetLineBuf db 80h dup (0) GetLineParams GL_ParamStruc ScreenIOParams SIO_ParamStruc <1,FM,0,0,offset Screen,seg Screen,1,0,1,1> GetKeyParams RK_ParamStruc <1,Fkey,1,Alt_Key,0,?,ShowAll,0> FMInInit proc far cli push ax ds es mov ax,Emulate mov es,ax mov al,es:[C000] mov cs:KeyPressed,al mov es:C000,0 call DebugKeysOn assume ds:CONio mov ax,CONio mov ds,ax 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:FM mov cs:GetKeyParams.RK_ErrPtr,0 pop es ds ax call UnsetBreaks sti ret FMInInit endp KeyPressed db 0 FMOutInit proc far cli push ax es mov ax,Emulate mov es,ax mov al,cs:KeyPressed mov es:C000,al mov ax,seg T_Iflags mov es,ax assume es:seg T_Iflags mov byte ptr es:T_Iflags,00000010b assume es:Emulate pop es ax call SetBreaks call AppleKeysOn ret FMOutInit endp ; Entry: ; DS --> segment ; SI --> ^ext to add (ASCIIZ) ; DI --> ^filespec (ASCIIZ) ; Exit: ; CF --> 1 ext is not as expected, 0 - otherwise AE_Ext db 3 dup (?) AE_Start dw ? AddExt proc far push ax cx si di es push si mov cs:AE_Start,di push ds pop es cld mov cx,0FFh xor al,al repne scasb dec di mov cx,di AE_Loop: dec di cmp di,cs:AE_Start je AE_DoAddExt mov al,ds:[di] cmp al,'.' je AE_ret cmp al,'\' jne AE_Loop AE_DoAddExt: mov di,cx push di mov cx,5 rep movsb pop di AE_ret: pop si AE_WhatExtLoop: lodsb or al,al clc jz AE_Quit scasb je AE_WhatExtLoop call Upcase cmp al,ds:[di-1] je AE_WhatExtLoop stc AE_Quit: pop es di si cx ax ret AddExt endp ; Entry: ; DS --> segment ; SI --> ^ext to add (ASCIIZ) ; DI --> ^filespec (ASCIIZ) ; Exit: ; ZF --> 1 ext is as expected, 0 - otherwise CE_Ext db 3 dup (?) CE_Start dw ? CmpExt proc far push ax cx si di es mov cs:CE_Start,di push ds pop es cld mov cx,0FFh xor al,al repne scasb CE_Loop: dec di cmp di,cs:CE_Start je CE_Quit mov al,ds:[di] cmp al,'\' je CE_Quit cmp al,'.' jne CE_Loop CE_CmpLoop: lodsb or al,al je CE_Quit scasb je CE_CmpLoop call Upcase cmp al,es:[di-1] je CE_CmpLoop CE_Quit: or al,al pop es di si cx ax ret CmpExt endp GoWhere? dw G_DIRECTORY FM_MainRet: push cs pop ds mov F_MaxLength,0 call ReadDir BigLoop: mov ch,GetLineParams.GL_BegPrint mov cl,GetLineParams.GL_Pos mov di,GoWhere? shl di,1 mov GoWhere?,G_DIRECTORY call CmndAddress[di] mov GetLineParams.GL_Pos,cl mov GetLineParams.GL_BegPrint,ch jmp BigLoop CmndAddress dw Directory,Memory,S_PathFilter Directory: mov F_or_M,0 jmp Select Memory: mov F_or_M,1 jmp Select S_CommandsNum = 8 S_ParamsStruc struc S_MaxLength db ? S_BegPrint db ? S_Pos db ? S_CX dw ? S_LinesNum db ? S_Buffer db ? S_ParamsStruc ends F_or_M db 0 db ? S_ActiveFlags dw 0000000000000100b,0000000000001000b S_Parameters dw DirectoryParams,MemoryParams DirectoryParams label byte F_MaxLength db 0 F_BegPrint db 0 F_Pos db 0 F_CX dw 72Ah F_LinesNum db 17 FileBuffer db MAX_DIRECTORY_ENTRIES * size FileDescription dup (0) FileTmpBuffer db size FileDescription dup (0) MemoryParams label byte M_MaxLength db 1 M_BegPrint db 0 M_Pos db 0 M_CX dw 0B02h M_LinesNum db 12 MemoryBuffer db 1,0Fh,'',0 db FD_STATUS dw 0,0FFFFh,0 db 0 dw 0,0 db MAX_MEMORY_ENTRIES * size FileDescription dup (0) S_Commands db 'tben',18h db 7,8,3,4,1,2,0Dh,0Ch S_Subrt dw S_Type,S_BegAdr,S_EndAdr,S_Name,S_Enter dw S_Up,S_Down,S_PgUp,S_PgDn,S_Home,S_End,S_Tab,GoAppleII S_CallIfZero? db 0,0,0,0,0,0,0,0,0,0,0,0,1 Select: xor bx,bx mov SHL_Flag,1 mov GetLineParams.GL_AllowSpc,0 gotoxy 2,0 mov cs:GetLineParams.GL_CX,cx mov bl,F_or_M shl bx,1 mov bp,S_Parameters[bx] mov ax,S_ActiveFlags[bx] mov ActiveFlags,ax mov FkeysFlags,1111111111b mov ScreenIOparams.CursorFlag,0 mov GetLineParams.GL_Color,0Bh mov cx,ds:[bp].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 Select cmp ds:[bp].S_MaxLength,0 jnz S_ok1 test S_CallIfZero?[di],1 jz Select S_ok1: shl di,1 call S_Subrt[di] jnc Select call GoAppleII jmp Select SelectRet: GetLineService _GL_CLRBUFF mov F_or_M,0 ret S_Tab: xor F_or_M,1 clc ret NameEntering db 0 S_NameFlags db 0,1,1,1 S_Name: call EnterFilename clc ret EnterFilename: push ax bx cx dx di bp mov NameEntering,1 push word ptr [GetKeyParams.RK_AltFlag] mov bl,0Bh mov GetLineParams.GL_Color,bl mov GetKeyParams.RK_AltFlag,0 mov SHL_Flag,0 mov bl,ds:[bp].S_Pos call CalcBuffer test ds:[bp].S_Buffer[di].FileFlags,FF_DAMAGED? jnz S_NameRet test ds:[bp].S_Buffer[di].FileFlags,FF_MODIFYNAME? jz S_NameRet mov cs:GetKeyParams.RK_ErrPtr,offset SMS_EnterFilename mov FkeysFlags,0000000010b mov ScreenIOparams.CursorFlag,1 mov bl,ds:[bp].S_Pos call CalcBuffer lea bx,ds:[bp].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 call Seek0 mov GetLineParams.GL_Length,bl mov ScreenIOparams.CursorLen,1 mov cx,ds:[bp].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 GetLineService _GETLINE S_NameRet: pop word ptr [GetKeyParams.RK_AltFlag] mov NameEntering,0 pop bp di dx cx bx ax ret S_PathFilter: push word ptr ds:[ScreenIOparams.CursorFlag] push word ptr ds:[GetKeyParams.RK_AltFlag] mov SHL_Flag,0 mov GetKeyParams.RK_AltFlag,0 mov GetLineParams.GL_AllowSpc,0 mov ActiveFlags,0000000000000001b mov FkeysFlags,0000000010b 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,2 GetLineService _GETLINE jc S_Path1 mov GoWhere?,G_DIRECTORY S_Path1: call GetPathFilter call ReadDir pop word ptr ds:[GetKeyParams.RK_AltFlag] pop word ptr ds:[ScreenIOparams.CursorFlag] mov SHL_Flag,1 GetLineService _GL_CLRBUFF clc ret S_Up: push ax mov al,ds:[bp].S_Pos or al,al jz S_UpRet dec al mov ah,al sub ah,ds:[bp].S_BegPrint cmp ah,2 jae S_UpOk1 cmp ds:[bp].S_BegPrint,0 jz S_UpOk1 dec ds:[bp].S_BegPrint inc byte ptr ds:[bp].S_CX[1] S_UpOk1: dec byte ptr ds:[bp].S_CX[1] S_UpRet: mov ds:[bp].S_Pos,al pop ax clc ret S_Down: push ax mov al,ds:[bp].S_Pos mov ah,ds:[bp].S_MaxLength dec ah cmp al,ah je S_DownRet inc al mov ah,al sub ah,ds:[bp].S_BegPrint add ah,2 cmp ah,ds:[bp].S_LinesNum jb S_DownOk1 mov ah,ds:[bp].S_BegPrint add ah,ds:[bp].S_LinesNum jc S_DownOk1 cmp ah,ds:[bp].S_MaxLength jae S_DownOk1 inc ds:[bp].S_BegPrint dec byte ptr ds:[bp].S_CX[1] S_DownOk1: inc byte ptr ds:[bp].S_CX[1] S_DownRet: mov ds:[bp].S_Pos,al pop ax clc ret S_PgUp: push cx xor ch,ch mov cl,ds:[bp].S_LinesNum dec cx S_PgUpLoop: call S_Up loop S_PgUpLoop pop cx clc ret S_PgDn: push cx xor ch,ch mov cl,ds:[bp].S_LinesNum dec cx S_PgDnLoop: call S_Down loop S_PgDnLoop pop cx clc ret S_Home: push cx mov cx,MAX_DIRECTORY_ENTRIES dec cx S_HomeLoop: call S_Up loop S_HomeLoop pop cx clc ret S_End: push cx mov cx,MAX_DIRECTORY_ENTRIES dec cx S_EndLoop: call S_Down loop S_EndLoop pop cx clc ret S_TypeNewVal db FD_Directory,FD_MSdos,FD_Code,FD_Status S_TypeProcs dw STP_Directory,STP_Code,STP_Status,STP_MSdos S_Type: push ax bx di mov bl,ds:[bp].S_Pos call CalcBuffer test ds:[bp].S_Buffer[di].FileFlags,FF_DAMAGED? jnz S_TypeRet test ds:[bp].S_Buffer[di].FileFlags,FF_MODIFYTYPE? jz S_TypeRet xor bx,bx mov bl,ds:[bp].S_Buffer[di].FileType mov bl,S_TypeNewVal[bx] mov ds:[bp].S_Buffer[di].FileType,bl shl bx,1 cmp F_or_M,0 mov al,FF_MODIFYNAME? jnz S_TypeCallProc call FU_Procs[bx] mov al,0 S_TypeCallProc: call S_TypeProcs[bx] S_TypeRet: pop di bx ax ret STP_Directory: ret STP_Code: or al,FF_SHOWADDR? or FF_MODIFYADDR? or FF_MODIFYTYPE? mov ds:[bp].S_Buffer[di].FileFlags,al ret STP_Status: or al,FF_MODIFYTYPE? mov ds:[bp].S_Buffer[di].FileFlags,al ret STP_MSdos: or al,FF_SHOWADDR? or FF_MODIFYADDR? or FF_MODIFYTYPE? mov ds:[bp].S_Buffer[di].FileFlags,al ret S_BegAdrX db 65,25 S_BegAdr: push ax bx cx dx di mov SHL_Flag,0 mov bl,ds:[bp].S_Pos call CalcBuffer test ds:[bp].S_Buffer[di].FileFlags,FF_MODIFYADDR? jz S_BegAdrRet test ds:[bp].S_Buffer[di].FileFlags,FF_DAMAGED? jnz S_BegAdrRet mov cx,ds:[bp].S_CX xor bx,bx mov bl,F_or_M mov cl,S_BegAdrX[bx] mov dx,ds:[bp].S_Buffer[di].FileEndAdr sub dx,ds:[bp].S_Buffer[di].FileBegAdr mov bx,0FFFFh sub bx,dx call GetAddress jc S_BegAdrRet cmp ax,bx jna S_BegAdrOK mov dx,0FFFFh sub dx,ax S_BegAdrOK: mov ds:[bp].S_Buffer[di].FileBegAdr,ax add ax,dx mov ds:[bp].S_Buffer[di].FileEndAdr,ax S_BegAdrRet: pop di dx cx bx ax clc ret S_EndAdrX db 72,32 S_EndAdr: push ax bx cx di mov SHL_Flag,0 mov bl,ds:[bp].S_Pos call CalcBuffer test ds:[bp].S_Buffer[di].FileFlags,FF_DAMAGED? jnz S_EndAdrRet test ds:[bp].S_Buffer[di].FileFlags,FF_MODIFYADDR? jz S_EndAdrRet mov cx,ds:[bp].S_CX xor bx,bx mov bl,F_or_M mov cl,S_EndAdrX[bx] call GetAddress jc S_EndAdrRet cmp ax,ds:[bp].S_Buffer[di].FileBegAdr jb S_EndAdrRet cmp ds:[bp].S_Buffer[di].FileBegAdr,0 jnz S_EndAdrOk S_EndAdrOk: mov ds:[bp].S_Buffer[di].FileEndAdr,ax S_EndAdrRet: pop di cx bx ax clc ret S_EnterErrorFL db 0 S_EnterProcs dw S_EnterF,S_EnterM S_Enter: push ax bx cx dx si di ds es cmp ds:[bp].S_MaxLength,0 jz S_EnterRet mov bl,ds:[bp].S_Pos call CalcBuffer xor bx,bx mov bl,F_or_M shl bx,1 call S_EnterProcs[bx] S_EnterRet: pop es ds di si dx cx bx ax clc ret SEF_Procs dw SEF_Directory,SEF_Code,SEF_Status,SEF_Fragment S_EnterF: mov bl,DirectoryParams.S_Pos call CalcBuffer xor bx,bx mov bl,FileBuffer[di].FileType mov si,bx mov bx,di call LinkName shl si,1 mov dx,offset Path call SEF_Procs[si] call UnLinkName ret SEF_Directory: mov bx,LN_BX mov byte ptr Path[bx],'\' mov byte ptr Path[bx+1],0 call ReadDir ret SEF_Code: mov RF_ErrPtr,offset SMS_ErrFileLoad mov RF_MesPtr,offset SMS_FileLoaded call OpenReadFile jc SEF_CodeRet mov cx,4 call ReadFile SEF_CodeRet: ret SEF_Status: push es call OpenReadFile jc SEF_StatusRet call FloppyLoad call DRAMLoad mov RF_ErrPtr,offset SMS_ErrStatLoad mov RF_MesPtr,offset SMS_StatLoaded mov cx,size RW_Header call ReadFile mov si,offset RW_Header cld assume es:TaskControl mov ax,TaskControl mov es,ax lodsb mov es:r_A,al lodsb mov es:r_X,al lodsb mov es:r_Y,al lodsb mov es:r_S,al lodsb mov es:r_P,al lodsw mov es:r_PC,ax mov ax,Peripher mov es,ax assume es:Peripher lodsb mov es:FLAGS,al lodsw mov es:BufferPTR,ax lodsw mov es:WriteCNT,ax lodsb mov es:WriteREG,al mov di,offset CurrentDrive mov cx,5 ; non-dos fields size rep movsb mov di,offset OtherDrive mov cx,5 ; non-dos fields size rep movsb mov ax,Emulate mov es,ax assume es:Emulate lodsb mov es:C050,al lodsb mov es:C080,al SEF_StatusRet: pop es ret assume es:Emulate SEF_Fragment: mov RF_ErrPtr,offset SMS_ErrFileLoad mov RF_MesPtr,offset SMS_FileLoaded xor cx,cx call OpenReadFile jc SEF_FrgRet call ReadFile SEF_FrgRet: ret SEM_SVD db '.SVD',0 SEM_APL db '.APL',0 SEM_Procs dw SEM_Directory,SEM_Code,SEM_Status,SEM_Fragment SEM_NewFile db ? S_EnterM: mov bl,MemoryParams.S_Pos call CalcBuffer cmp MemoryBuffer[di].FileName[0],1 mov SEM_NewFile,0 jne SEM_NotNewFile mov SEM_NewFile,1 dec MemoryBuffer[di].FileName[0] mov MemoryBuffer[di].FileFlags,FF_MODIFYNAME? call EnterFilename push di lea di,MemoryBuffer[di].FileName jnc SEM_ok1 push es mov si,offset FL_NewFile push ds pop es mov cx,13 rep movsb pop es di ret SEM_ok1: mov si,offset SEM_SVD call AddExt mov cl,FD_STATUS mov ch,FF_MODIFYNAME? or FF_MODIFYTYPE? jnc SEM_ok2 or ch,FF_MODIFYADDR? or FF_SHOWADDR? mov si,offset SEM_APL call CmpExt mov cl,FD_CODE je SEM_ok2 mov cl,FD_MSDOS SEM_ok2: pop di mov MemoryBuffer[di].FileFlags,ch mov MemoryBuffer[di].FileType,cl cmp cl,FD_STATUS je SEM_NotNewFile call S_BegAdr call S_EndAdr SEM_NotNewFile: xor bx,bx mov bl,MemoryBuffer[di].FileType mov si,bx mov bx,di call LinkName shl si,1 mov dx,offset Path call SEM_Procs[si] call UnlinkName cmp SEM_NewFile,0 jz SEM_Ret lea si,MemoryBuffer[di].FileName mov cl,MemoryBuffer[di].FileType mov ch,MemoryBuffer[di].FileFlags mov ax,MemoryBuffer[di].FileBegAdr mov bx,MemoryBuffer[di].FileEndAdr sub bx,ax inc bx call FileIsLoaded SEM_Ret: ret SEM_Directory: clc ret SEM_Code: mov WF_ErrPtr,offset SMS_ErrFileSave mov WF_MesPtr,offset SMS_FileSaved mov ax,MemoryBuffer[di].FileBegAdr mov word ptr RW_Header[0],ax mov ax,MemoryBuffer[di].FileEndAdr sub ax,word ptr RW_Header[0] inc ax mov word ptr RW_Header[2],ax call OpenFileWrite jc SEM_CodeRet mov cx,4 call WriteFile SEM_CodeRet: ret SEM_Status: mov WF_ErrPtr,offset SMS_ErrStatSave mov WF_MesPtr,offset SMS_StatSaved call OpenFileWrite jc SEM_StatusRet call FloppySave call DRAMSave push si di ds es mov di,offset RW_Header cld push cs pop es assume ds:TaskControl mov ax,TaskControl mov ds,ax mov al,ds:r_A stosb mov al,ds:r_X stosb mov al,ds:r_Y stosb mov al,ds:r_S stosb mov al,ds:r_P stosb mov ax,ds:r_PC stosw mov ax,Peripher mov ds,ax assume ds:Peripher mov al,FLAGS stosb mov ax,BufferPTR stosw mov ax,WriteCNT stosw mov al,WriteREG stosb mov si,offset CurrentDrive mov cx,5 ; non-dos fields size rep movsb mov si,offset OtherDrive mov cx,5 ; non-dos fields size rep movsb mov ax,Emulate mov ds,ax assume ds:Emulate mov al,ds:C050 stosb mov al,C080 stosb pop es ds di si assume ds:FM mov cx,size RW_Header call WriteFile SEM_StatusRet: ret assume ds:FM SEM_Fragment: mov WF_ErrPtr,offset SMS_ErrFileSave mov WF_MesPtr,offset SMS_FileSaved call OpenFileWrite jc SEM_FragmentRet xor cx,cx call WriteFile SEM_FragmentRet: 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 '*.APL,*.ROM,*.SVD',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 Seek0: push si xor si,si Seek0_Loop: cmp byte ptr ds:[bx][si],0 jz Seek0_Done inc si jmp Seek0_Loop Seek0_Done: mov bx,si pop si ret ; Entry: ; DS:SI -> Name,0 ; AX - Begin Address ; BX - Length ; CL - Type ; CH - Flags FIL_Buffer db 80 dup (0) FileIsLoaded proc far push ax bx cx dx si di bp ds es push ax mov di,offset FIL_Buffer push cs pop es mov ah,60h int 21h mov si,di push cs pop ds lea di,FileTmpBuffer.FileName mov dx,di FIL_Loop: lodsb cmp al,':' je FIL_Hop1 cmp al,'\' jne FIL_ok1 FIL_Hop1: mov di,dx jmp FIL_Loop FIL_ok1: stosb or al,al jnz FIL_Loop pop ax mov FileTmpBuffer.FileBegAdr,ax mov word ptr FileTmpBuffer.File1st4bytes[0],ax mov dx,bx or bx,bx jnz FIL_ok2 dec dx FIL_ok2: mov word ptr FileTmpBuffer.File1st4bytes[2],dx add bx,ax dec bx mov FileTmpBuffer.FileEndAdr,bx mov FileTmpBuffer.FileType,cl mov FileTmpBuffer.FileFlags,ch mov bx,MAX_DIRECTORY_ENTRIES mov ax,size FileDescription mul bx mov di,ax call FileLoaded pop es ds bp di si dx cx bx ax ret FileIsLoaded endp FL_NewFile db 1,0Fh,'',0 db FD_STATUS dw 0,0FFFFh,0 db 0 dw 0,0 FileLoaded: push ax bx dx si di bp mov bp,offset MemoryParams mov si,di mov bl,M_MaxLength dec bl cmp M_MaxLength,MAX_MEMORY_ENTRIES jae FL_NoInc inc M_MaxLength FL_NoInc: call CalcBuffer mov bx,size FileDescription dec bx FL_Loop0: mov al,FileBuffer[si][bx] mov MemoryBuffer[di][bx],al mov al,FL_NewFile[bx] mov MemoryBuffer[size FileDescription+di][bx],al dec bx jns FL_Loop0 or MemoryBuffer[di].FileFlags,FF_MODIFYNAME? xor si,si mov bx,1 FL_Loop1: cmp si,di je FL_Next1 mov ax,MemoryBuffer[di].FileBegAdr cmp ax,MemoryBuffer[si].FileEndAdr ja FL_Next1 mov ax,MemoryBuffer[di].FileEndAdr cmp ax,MemoryBuffer[si].FileBegAdr jb FL_Next1 cmp ax,MemoryBuffer[si].FileEndAdr jb FL_Damaged mov ax,MemoryBuffer[di].FileBegAdr cmp ax,MemoryBuffer[si].FileBegAdr ja FL_Damaged dec bx call Delete inc bx sub di,size FileDescription jmp FL_Next2 FL_Damaged: or MemoryBuffer[si].FileFlags,FF_DAMAGED? FL_Next1: add si,size FileDescription inc bl FL_Next2: cmp bl,M_MaxLength jb FL_Loop1 mov bp,offset MemoryParams call S_End call S_Up pop bp di si dx bx ax ret Delete: push ax cx si di es mov cl,ds:[bp].S_MaxLength cmp cl,1 jz DelRet sub cl,bl dec ds:[bp].S_MaxLength cmp cl,1 je DelRet mov al,Size FileDescription mul cl mov cx,ax call CalcBuffer lea si,ds:[bp].S_Buffer add di,si mov si,di add si,size FileDescription push cs pop es cld rep movsb DelRet: mov al,ds:[bp].S_Pos cmp al,ds:[bp].S_MaxLength jb DelRetOk call S_Up DelRetOk: pop es di si cx ax ret GA_Buffer db 5 dup (?) GetAddress: push word ptr [GetKeyParams.RK_AltFlag] mov GetKeyParams.RK_AltFlag,0 push bx bp cx xor bx,bx mov bl,F_or_M mov bl,0Bh mov GetLineParams.GL_Color,bl mov FkeysFlags,0000000010b mov ScreenIOparams.CursorFlag,1 mov GetLineParams.GL_Buffer,offset GA_Buffer mov GetLineParams.GL_MaxLength,4 mov GetLineParams.GL_MaxPrint,4 mov ScreenIOparams.CursorLen,1 GetLineService _GL_ClrBuff pop cx push cx dec ch mov al,80 * 2 mul ch xor bx,bx mov bl,cl shl bx,1 add ax,bx mov cx,ax GetLineService _GETLINE jc GetAddressRet xor cx,cx call GetAddr GetAddressRet: pop cx bp bx pop word ptr [GetKeyParams.RK_AltFlag] ret GA_Delimiters db ',/',0 GA_DelimitersC = 3 GetAddr: push bx bp xor bx,bx GetLineService _GL_GetSymb or al,al jz GA_error dec cl GA_Loop: GetLineService _GL_GetSymb push cx di mov di,offset GA_Delimiters mov cx,GA_DelimitersC call CalcCommand pop di cx jnc GA_Exit call Upcase cmp al,'0' jb GA_error cmp al,'9' jbe GA_Anumb cmp al,'a' jb GA_error cmp al,'f' ja GA_error sub al,27h GA_Anumb: sub al,'0' shl bx,4 or bl,al jmp GA_Loop GA_error: stc jmp GA_Ret GA_Exit: mov ax,bx clc GA_Ret: pop bp bx ret RF_ErrPtr dw ? RF_MesPtr dw ? RW_Header db 100h dup (?) OpenReadFile: push ax call Prepare4DOS mov ax,3D00h int 21h mov bx,ax call SOD4eraperP pop ax ret ReadFile: push ax bx cx dx ds call Prepare4DOS mov ah,3Fh mov dx,offset RW_Header or cx,cx jz RF_NoHeader int 21h cmp ax,cx jne RF_Error jc RF_Error RF_NoHeader: mov cx,FileBuffer[di].FileEndAdr mov dx,FileBuffer[di].FileBegAdr sub cx,dx mov ax,Apple mov ds,ax mov ah,3Fh inc cx jnz RF_NoLong inc cl mov ah,3Fh int 21h jc RF_Error mov cx,0FFFFh inc dx RF_NoLong: mov ah,3Fh int 21h jc RF_Error cmp cx,ax jz RF_NoErr1 add dx,ax dec dx mov cs:FileBuffer[di].FileEndAdr,dx jmp RF_Error RF_NoErr1: mov ax,cs:RF_MesPtr mov cs:GetKeyParams.RK_ErrPtr,ax mov cs:S_EnterErrorFL,0 and cs:FileBuffer[di].FileFlags,not FF_DAMAGED? RF_ErrorRet: mov ah,3Eh int 21h pop ds call SOD4eraperP call FileLoaded pop dx cx bx ax ret RF_Error: mov ax,cs:RF_ErrPtr mov cs:GetKeyParams.RK_ErrPtr,ax mov cs:S_EnterErrorFL,1 or cs:FileBuffer[di].FileFlags,FF_DAMAGED? jmp RF_ErrorRet WF_ErrPtr dw ? WF_MesPtr dw ? ; Create (rewrite) a file. Set CF if an error occured. Exit: BX -- file handle OpenFileWrite: push ax cx dx ds test MemoryBuffer[di].FileFlags,FF_DAMAGED? jz OFW_1 OFW_GetKeyLoop1: mov SC1_Flag,1 mov SHL_Flag,0 mov ActiveFlags,0000000000010000b call ReadKey mov SC1_Flag,0 mov SHL_Flag,1 cmp al,0Ch stc je OFW_Ret or al,20h cmp al,'n' stc je OFW_Ret cmp al,'y' jne OFW_GetKeyLoop1 and MemoryBuffer[di].FileFlags,not FF_DAMAGED? OFW_1: call Prepare4DOS xor cx,cx mov ah,5Bh int 21h jnc OFW_NoError cmp ax,50h jne OFW_Error call SOD4eraperP OFW_GetKeyLoop: mov SC_Flag,1 mov SHL_Flag,0 mov ActiveFlags,0000000000010000b call ReadKey mov SC_Flag,0 mov SHL_Flag,1 cmp al,0Ch stc je OFW_Ret or al,20h cmp al,'n' stc je OFW_Ret cmp al,'y' jne OFW_GetKeyLoop call Prepare4DOS xor cx,cx mov ax,3C01h int 21h jc OFW_Error OFW_NoError: mov bx,ax call SOD4eraperP OFW_Ret: pop ds dx cx ax ret OFW_Error: mov ax,cs:WF_ErrPtr mov cs:GetKeyParams.RK_ErrPtr,ax mov cs:S_EnterErrorFL,1 jmp OFW_NoError ; Entry: BX -- file handle ... WriteFile: push ax bx cx dx ds call Prepare4DOS mov ah,40h mov dx,offset RW_Header or cx,cx jz WF_NoHeader int 21h jc WF_Error cmp ax,cx jne WF_Error WF_NoHeader: mov cx,MemoryBuffer[di].FileEndAdr mov dx,MemoryBuffer[di].FileBegAdr sub cx,dx mov ax,Apple mov ds,ax mov ah,40h inc cx jnz WF_NoLong inc cl mov ah,40h int 21h jc WF_Error mov cx,0FFFFh inc dx WF_NoLong: mov ah,40h int 21h jc WF_Error cmp ax,cx jne WF_Error mov ax,cs:WF_MesPtr mov cs:GetKeyParams.RK_ErrPtr,ax mov cs:S_EnterErrorFL,0 WF_Ret: mov ah,3Eh int 21h call SOD4eraperP call UnLinkName pop ds dx cx bx ax ret WF_Error: mov ax,cs:WF_ErrPtr mov cs:GetKeyParams.RK_ErrPtr,ax mov cs:S_EnterErrorFL,1 jmp WF_Ret ; -- Read Directory ------------------ RD_GetDirs? db 1 Path db '.\',66 dup (0) ; Current Path Filter db '*.APL,*.ROM,*.SVD',020h dup (0) ; Scan Filter PathFilter db 68+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 F_MaxLength,0FFh je RD_NoMoreFiles call RD_PutFile inc F_MaxLength add bx,size FileDescription 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 FindFirst jc RD_NoMoreFiles RD_GetFilesLoop: cmp F_MaxLength,0FFh je RD_NoMoreFiles call RD_PutFile inc F_MaxLength add bx,size FileDescription 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 'FRGAPLROMSVD' PF_FileTypes db FD_MSdos,FD_Code,FD_Code,FD_Status PF_Addr dw PF_Directory,PF_Code,PF_Status,PF_MSdos 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 FileBuffer[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,ds:FileBuffer[bp].FileName[di] cmp al,FileBuffer[bx].FileName[di] jne PF_NotMatch inc di or al,al jnz PF_Cmp1 PF_Error: sub bx,size FileDescription dec F_MaxLength jmp PF_Ret PF_NotMatch: add bp,size FileDescription cmp bp,bx jne PF_Cmp0 PF_Cont1: mov FileBuffer[bx].FileFlags,0 test DTA.Attributes,FA_DIRECTORY jz PF_NotDir mov FileBuffer[bx].FileType,FD_DIRECTORY jmp PF_Ret PF_NotDir: mov ax,word ptr DTA.FileSize cmp word ptr DTA.FileSize[2],0 jz PF_NotBig mov ax,0FFFFh PF_NotBig: mov FileBuffer[bx].FileLength,ax push cs pop es cld lea di,FileBuffer[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,4 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 FileBuffer[bx].FileType,al mov di,ax mov si,bx mov bp,offset DirectoryParams call LinkName mov dx,offset Path mov ax,3D00h int 21h call UnLinkName jc PF_Ret1 lea dx,FileBuffer[si].File1st4bytes mov cx,4 mov bx,ax mov ah,3Fh int 21h mov ah,3Eh int 21h shl di,1 call PF_Addr[di] PF_Ret1: mov bx,si PF_Ret: pop es bp di si dx cx ax ret RD_PutFile endp PF_Directory: mov FileBuffer[si].FileFlags,0 ret PF_Code: mov FileBuffer[si].FileFlags,FF_SHOWADDR? or FF_MODIFYADDR? or FF_MODIFYTYPE? mov ax,word ptr FileBuffer[si].File1st4bytes mov FileBuffer[si].FileBegAdr,ax mov ax,word ptr FileBuffer[si].File1st4bytes[2] add ax,FileBuffer[si].FileBegAdr jnc PF_Code_ok xor ax,ax PF_Code_ok: dec ax mov FileBuffer[si].FileEndAdr,ax ret PF_Status: mov FileBuffer[si].FileFlags,FF_MODIFYTYPE? xor ax,ax mov FileBuffer[si].FileBegAdr,ax dec ax mov FileBuffer[si].FileEndAdr,ax ret PF_MSdos: mov FileBuffer[si].FileFlags,FF_SHOWADDR? or FF_MODIFYADDR? or FF_MODIFYTYPE? mov FileBuffer[si].FileBegAdr,800h mov ax,FileBuffer[si].FileLength add ax,800h jnc PF_MSdos_ok xor ax,ax PF_MSdos_ok: dec ax mov FileBuffer[si].FileEndAdr,ax ret ReadDir proc near push ax si di mov GetKeyParams.RK_ErrPtr,offset SMS_ReadDir xor ax,ax mov F_MaxLength,al mov BufPtr,ax mov F_BegPrint,al mov F_Pos,al mov F_CX,72Ah 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 byte ptr WildCard[di],0 call ReadDirectory mov RD_GetDirs?,0 cmp byte ptr Filter[si],0 jz RD1_Done RD1_Ignore: inc si cmp byte ptr Filter[si],',' je RD1_Ignore jmp RD1_Loop0 RD1_Done: mov GetKeyParams.RK_ErrPtr,0 pop di si ax call LinkPathFilter ret ReadDir endp LN_BX dw ? LinkName: pushf push ax bx si di mov si,bx lea si,ds:[bp].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 FileDescription 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 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 ;35 mov ScreenIOparams.CursorColor,10h mov ScreenIOparams.CursorFlag,1 call InitFlags call ShowPathFilter call ShowDirectory call ShowMemory call ShowFuncKeys ScreenIOservice _SHOWLINE call ShowTitle call ShowMessage call ShowHilights call ShowConfirm call ShowConfirm1 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 xor bx,bx mov bl,F_or_M shl bx,1 mov bp,S_Parameters[bx] mov bl,ds:[bp].S_Pos call CalcBuffer xor si,si cmp DOSflag,0 mov FkeysFlags,0000000000b jnz IF_Ret cmp SHL_Flag,0 mov FkeysFlags,0000000010b jz IF_Ret IF_Loop: call IF_Procs[si] add si,2 cmp si,20 jb IF_Loop cmp ActiveFlags,0 jnz IF_Ret mov FkeysFlags,0 IF_Ret: pop bp di si bx ax ret IFP1_fl dw 0000000000b,0000000001b,0000000001b,0000000001b IFP_F1: cmp ds:[bp].S_MaxLength,0 jz IFP1_Ret xor bx,bx mov bl,ds:[bp].S_Buffer[di].FileType shl bx,1 mov ax,IFP1_fl[bx] or FkeysFlags,ax IFP1_Ret: IFP_F2: or FkeysFlags,0000000010b ret IFP3_fl dw 0000000000b,0000000100b,0000000100b,0000000100b IFP_F3: push di cmp F_MaxLength,0 jz IFP3_Ret mov bl,F_Pos call CalcBuffer xor bx,bx mov bl,FileBuffer[di].FileType shl bx,1 mov ax,IFP3_fl[bx] or FkeysFlags,ax IFP3_Ret: pop di ret IFP4_fl dw 0000000000b,0000001000b,0000001000b,0000001000b IFP_F4: push di mov bl,M_Pos call CalcBuffer xor bx,bx mov bl,MemoryBuffer[di].FileType shl bx,1 mov ax,IFP4_fl[bx] or FkeysFlags,ax pop di ret IFP_F5: push di cmp F_or_M,0 jz IFP5_Ret cmp ds:[bp].S_MaxLength,1 jbe IFP5_Ret mov bl,M_Pos call CalcBuffer cmp MemoryBuffer[di].FileName[0],1 je IFP5_Ret or FkeysFlags,0000010000b IFP5_Ret: pop di ret IFP_F6: IFP_F7: IFP_F8: IFP_F9: ret IFP_F0: or FkeysFlags,1100000000b test ActiveFlags,1 jz IFP0_Ret mov FkeysFlags,0000000010b IFP0_Ret: ret ST_Str db ' APPLER FILE MANAGER ',1,7,' ',0 ShowTitle: push ax bx cx gotoxy 1,0 mov ah,2Fh mov bx,offset ST_Str ScreenIOservice _STRINGPRINT gotoxy 2,0 xor ah,ah ScreenIOservice _STRINGPRINT pop cx bx ax ret comment % push ax dx ds mov ax,2a1h mov ds,ax mov dx,24h mov ax,2509h int 21h pop ds dx ax int 3 % SP_Str db 'ÚPath&FilterÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ',0 db '³ ³ ',0 db 'ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ',0 ShowPathFilter: push ax bx cx dx gotoxy 3,0 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,2 ScreenIOservice _StringPrint mov bx,35 xchg PathFilter[bx],al pop dx cx bx ax ret SD_Str db 'ÚDirectoryÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ',0 db '³ ³ ',0 db 'ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ',0 SD_AntetAddr dw SD_Antet1,SD_Antet1,SD_Antet1,SD_Antet1 dw SD_Antet3,SD_Antet1,SD_Antet4,SD_Antet1 dw SD_Antet2,SD_Antet1,SD_Antet2,SD_Antet1 dw SD_Antet3,SD_Antet1,SD_Antet3,SD_Antet1 dw SD_Antet5,SD_Antet1,SD_Antet5,SD_Antet1 dw SD_Antet7,SD_Antet1,SD_Antet8,SD_Antet1 dw SD_Antet6,SD_Antet1,SD_Antet6,SD_Antet1 dw SD_Antet7,SD_Antet1,SD_Antet7,SD_Antet1 SD_Antet1 db 1,07h,'N', 'ame ', 'T', 'ype ', 'B', 'egin ', 'E', 'nd',0 SD_Antet2 db 1,07h,'N', 'ame ',1,0Fh,'T',1,7,'ype ', 'B', 'egin ', 'E', 'nd',0 SD_Antet3 db 1,07h,'N', 'ame ',1,0Fh,'T',1,7,'ype ',1,0Fh,'B',1,7,'egin ',1,0Fh,'E',1,7,'nd',0 SD_Antet4 db 1,07h,'N', 'ame ', 'T', 'ype ',1,0Fh,'B',1,7,'egin ',1,0Fh,'E',1,7,'nd',0 SD_Antet5 db 1,0Fh,'N',1,7,'ame ', 'T', 'ype ', 'B', 'egin ', 'E', 'nd',0 SD_Antet6 db 1,0Fh,'N',1,7,'ame ',1,0Fh,'T',1,7,'ype ', 'B', 'egin ', 'E', 'nd',0 SD_Antet7 db 1,0Fh,'N',1,7,'ame ',1,0Fh,'T',1,7,'ype ',1,0Fh,'B',1,7,'egin ',1,0Fh,'E',1,7,'nd',0 SD_Antet8 db 1,0Fh,'N',1,7,'ame ', 'T', 'ype ',1,0Fh,'B',1,7,'egin ',1,0Fh,'E',1,7,'nd',0 SD_Antet0 db 1,7,'ÄÄÄÄÄÄÄÄÄÄÄÄ ÄÄÄÄÄÄ ÄÄÄÄÄ ÄÄÄÄ',0 SD_NotFndMsg db 1,7,'No Matching Files in Directory',0 ShowDirectory: push ax bx cx dx di gotoxy 3,40 mov bx,offset SD_Str mov dh,21 mov ax,0000000000000100b call DrawBox cmp F_MaxLength,0 jnz SD_ok2 gotoxy 5,2Bh mov bx,offset SD_NotFndMsg ScreenIOservice _STRINGPRINT jmp SD_Ret SD_ok2: mov bl,F_Pos call CalcBuffer xor bx,bx mov bl,FileBuffer[di].FileFlags shl bx,1 mov bx,SD_AntetAddr[bx] cmp SHL_Flag,0 jz SD_ok25 test ActiveFlags,0000000000000100b jnz SD_ok3 SD_ok25: mov bx,offset SD_Antet1 SD_ok3: gotoxy 5,2Bh ScreenIOservice _STRINGPRINT mov bx,offset SD_Antet0 gotoxy 6,2Bh ScreenIOservice _STRINGPRINT mov bl,F_BegPrint mov dx,17 mov di,offset FileBuffer gotoxy 7,43 mov ah,7 SD_Loop0: call OneFile add cx,80 * 2 inc bl cmp bl,F_MaxLength je SD_Ret0 dec dx jnz SD_Loop0 SD_Ret0: mov cx,F_CX ScreenIOservice _SHOWCURSOR SD_Ret: pop di dx cx bx ax ret SM_Str db 'ÚMemoryÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ',0 db '³ ³ ',0 db 'ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ',0 ShowMemory: push ax bx cx dx di gotoxy 7,0 mov bx,offset SM_Str mov dh,16 mov ax,0000000000001000b call DrawBox mov bl,M_Pos call CalcBuffer xor bx,bx mov bl,MemoryBuffer[di].FileFlags shl bx,1 mov bx,SD_AntetAddr[bx] cmp SHL_Flag,0 jz SM_ok25 test ActiveFlags,0000000000001000b jnz SM_ok3 SM_ok25: mov bx,offset SD_Antet1 SM_ok3: gotoxy 9,3 ScreenIOservice _STRINGPRINT mov bx,offset SD_Antet0 gotoxy 10,3 ScreenIOservice _STRINGPRINT mov bl,M_BegPrint mov dx,12 mov di,offset MemoryBuffer gotoxy 11,3 mov ah,0Bh SM_Loop0: call OneFile add cx,80 * 2 inc bl cmp bl,M_MaxLength jae SM_Ret0 dec dx jnz SM_Loop0 SM_Ret0: cmp NameEntering,0 jnz SM_Ret mov cx,M_CX mov ScreenIOparams.CursorColor,40h ScreenIOservice _SHOWCURSOR SM_Ret: pop di dx cx bx ax ret SMS_Clear db ' ',0 SMS_ReadDir db 'Accessing Disk Directory...',0 SMS_FileLoaded db 'File loaded',0 SMS_FileSaved db 'File saved',0 SMS_StatLoaded db 'Status restored',0 SMS_StatSaved db 'Status saved',0 SMS_ErrFileLoad db 1,0Ch,'Error loading file',0 SMS_ErrFileSave db 1,0Ch,'Error saving file',0 SMS_ErrStatLoad db 1,0Ch,'Error restoring status',0 SMS_ErrStatSave db 1,0Ch,'Error saving status',0 SMS_EnterFilename db 'Enter Filename ( cancel)',0 ShowMessage: push ax bx cx gotoxy 18h,0 mov bx,offset SMS_Clear mov ah,0Ah ScreenIOservice _STRINGPRINT cmp GetKeyParams.RK_ErrPtr,0 jz SMS_Ret gotoxy 18h,1 mov bx,GetKeyParams.RK_ErrPtr 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 1111111111b SFK_FkeysMain dw SFK_Run,SFK_Cont,SFK_Load,SFK_Save,SFK_Delete dw SFK_None,SFK_None,SFK_None,SFK_PathFilter,SFK_Rescan SFK_Run db 1,2Fh,'Run ',0 SFK_Cont db 1,2Fh,'Apple ',0 SFK_Load db 1,1Fh,'Load ',0 SFK_Save db 1,4Fh,'Save ',0 SFK_Delete db 1,2Fh,'Delete',0 SFK_PathFilter db 1,2Fh,'Path&F',0 SFK_Rescan db 1,2Fh,'Rescan',0 SFK_None db 1,2Fh,' ',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 SHL_Flag db 1 ShowHilights: cmp SHL_Flag,0 jz SHL_Ret push ax cx gotoxy 3,1 mov ax,0E00h+'P' ScreenIOservice _SYMBPRINT gotoxy 3,41 mov al,'D' ScreenIOservice _SYMBPRINT gotoxy 7,1 mov al,'M' ScreenIOservice _SYMBPRINT pop cx ax SHL_Ret: ret SC_Str db 'ÚConfirmÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿',0 db '³ ³',0 db 'ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ',0 SC_FileMes db 1,7,'File ',1,0Fh,0 SC_AlreadyMes db 1,7,' already exists.',0 SC_SureMes db 1,7,'Are you sure you want to overwrite this file?',0 SC_Flag db 0 ShowConfirm: cmp SC_Flag,0 jz SC1_Ret push ax bx cx dx di gotoxy 9,7 mov bx,offset SC_Str mov dh,6 mov ax,0000000000010000b call DrawBox gotoxy 11,9 mov bx,offset SC_FileMes ScreenIOservice _STRINGPRINT mov bl,M_Pos call CalcBuffer lea bx,MemoryBuffer[di].FileName mov ah,0Fh ScreenIOservice _STRINGPRINT mov bx,offset SC_AlreadyMes ScreenIOservice _STRINGPRINT gotoxy 13,9 mov bx,offset SC_SureMes ScreenIOservice _STRINGPRINT pop di dx cx bx ax SC1_Ret: ret SC1_Str db 'ÚConfirmÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿',0 db '³ ³',0 db 'ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ',0 SC1_FileMes db 1,7,'File ',1,0Fh,0 SC1_OverWritten db 1,7,' is overwritten by another file.',0 SC1_SureMes db 1,7,'Are you sure you want to save this file?',0 SC1_Flag db 0 ShowConfirm1: cmp SC1_Flag,0 jz SC_Ret push ax bx cx dx di gotoxy 16,20 mov bx,offset SC1_Str mov dh,6 mov ax,0000000000010000b call DrawBox gotoxy 18,22 mov bx,offset SC1_FileMes ScreenIOservice _STRINGPRINT mov bl,M_Pos call CalcBuffer lea bx,MemoryBuffer[di].FileName mov ah,0Fh ScreenIOservice _STRINGPRINT mov bx,offset SC1_OverWritten ScreenIOservice _STRINGPRINT gotoxy 20,22 mov bx,offset SC1_SureMes ScreenIOservice _STRINGPRINT pop di dx cx bx ax SC_Ret: ret OF_CX dw ? OF_Types dw OF_Directory,OF_Code,OF_Status,OF_MSdos OF_Directory db 1,7,'',0 OF_Code db 'DOS3.3',0 OF_Status db 'Status',0 OF_MSdos db 'MS-DOS',0 OF_NoAddr db 1,7,' -- -- ',0 OF_Base dw ? OF_Color db ? 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].FileFlags,FF_DAMAGED? mov OF_Color,0Bh jz OF_hop1 mov ah,0Ch mov OF_Color,ah OF_hop1: ScreenIOservice _STRINGPRINT cmp byte ptr ds:[bx],1 je OF_Ret mov cx,OF_CX add cx,2*14 xor bx,bx mov bp,OF_Base mov bl,ds:[bp][di].FileType shl bx,1 mov bx,OF_Types[bx] mov ah,OF_Color ScreenIOservice _STRINGPRINT mov cx,OF_CX add cx,2*22 mov bx,offset OF_NoAddr ScreenIOservice _STRINGPRINT mov bp,OF_Base test ds:[bp][di].FileFlags,FF_SHOWADDR? jz OF_Ret mov cx,OF_CX add cx,2*22 mov ah,OF_Color mov bp,OF_Base mov al,byte ptr ds:[bp][di].FileBegAdr[1] ScreenIOservice _BYTEPRINT mov bp,OF_Base mov al,byte ptr ds:[bp][di].FileBegAdr[0] ScreenIOservice _BYTEPRINT mov bp,OF_Base mov cx,OF_CX add cx,2*29 mov ah,OF_Color mov bp,OF_Base mov al,byte ptr ds:[bp][di].FileEndAdr[1] ScreenIOservice _BYTEPRINT mov bp,OF_Base mov al,byte ptr ds:[bp][di].FileEndAdr[0] ScreenIOservice _BYTEPRINT 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 ** ; ** ** ; ** ** ; ******************************************************************* GetLineUser proc far ret GetLineUser endp Alt_Keys db 'pdm' Alt_Procs dw Alt_PathFilter,Alt_Directory,Alt_Memory 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 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_Memory proc near mov cs:GoWhere?,G_MEMORY ret Alt_Memory endp Alt_Key endp FkeysMasks dw 1b,10b,100b,1000b,10000b,100000b,1000000b,10000000b,100000000b,1000000000b Fkeys_Main dw Fkey_Run,Fkey_Cont,Fkey_Load,Fkey_Save,Fkey_Delete dw ?,?,?,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] 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 mov bl,F_or_M shl bx,1 mov bp,S_Parameters[bx] call Fkeys_Main[si] xor bx,bx mov bl,F_or_M shl bx,1 mov bp,S_Parameters[bx] mov cx,ds:[bp].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 FU_Procs dw FU_Dir,FU_Code,FU_Status,FU_MSDos Fkey_Update: push ax bx di mov bl,ds:[bp].S_Pos call CalcBuffer test ds:[bp].S_Buffer[di].FileFlags,FF_DAMAGED? jnz FU_Ret test ds:[bp].S_Buffer[di].FileFlags,FF_MODIFYADDR? jz FU_Ret xor bx,bx mov bl,ds:[bp].S_Buffer[di].FileType shl bx,1 call FU_Procs[bx] FU_Ret: pop di bx ax ret FU_Dir: ret FU_Code: mov ax,word ptr ds:[bp].S_Buffer[di].File1st4bytes mov ds:[bp].S_Buffer[di].FileBegAdr,ax mov ax,word ptr ds:[bp].S_Buffer[di].File1st4bytes[2] add ax,ds:[bp].S_Buffer[di].FileBegAdr jnc FU_Code_ok xor ax,ax FU_Code_ok: dec ax mov ds:[bp].S_Buffer[di].FileEndAdr,ax ret FU_Status: xor ax,ax mov ds:[bp].S_Buffer[di].FileBegAdr,ax dec ax mov ds:[bp].S_Buffer[di].FileEndAdr,ax ret FU_MSdos: mov ds:[bp].S_Buffer[di].FileBegAdr,800h mov ax,ds:[bp].S_Buffer[di].FileLength add ax,800h jnc FU_MSdos_ok xor ax,ax FU_MSdos_ok: dec ax mov ds:[bp].S_Buffer[di].FileEndAdr,ax ret Fkey_RunProcs dw FRP_Run,FRP_Go Fkey_Run: mov si,bx mov bl,ds:[bp].S_Pos call CalcBuffer cmp ds:[bp].S_Buffer[di].FileType,FD_Code jb Fkey_RunRet mov bx,ds:[bp].S_Buffer[di].FileBegAdr call Fkey_RunProcs[si] Fkey_RunRet: ret FRP_RunProgram db 0A9h,20h,0A9h,0,0A9h,3,0A9h,3Ch,4Ch FRP_RunAddress dw ? FRP_Procs dw FRPP_Directory,FRPP_Code,FRPP_Status,FRPP_MSdos FRP_Run: call ResetAppleII mov bp,offset DirectoryParams call S_Enter cmp S_EnterErrorFL,0 jnz FRP_RunRet push bx mov bl,M_MaxLength sub bl,2 call CalcBuffer pop bx xor ax,ax mov al,MemoryBuffer[di].FileType mov di,ax shl di,1 call FRP_Procs[di] call GoAppleII FRP_RunRet: ret FRPP_MSdos: FRPP_Code: push es mov ax,Apple mov es,ax assume es:Apple mov GetKeyParams.RK_ErrPtr,0 mov FRP_RunAddress,bx mov di,0C700h mov si,offset FRP_RunProgram mov cx,11 cld rep movsb pop es ret assume es:Emulate FRPP_Damaged: FRPP_Directory: FRPP_Status: ret FRP_Go: push ds cmp ds:[bp].S_Buffer[di].FileType,FD_Status je FRPG_NoBegAdr mov ax,TaskControl mov ds,ax assume ds:TaskControl mov ds:r_PC,bx FRPG_NoBegAdr: pop ds assume ds:FM call GoAppleII ret Fkey_Cont: call GoAppleII ret Fkey_Load: mov bp,offset DirectoryParams call S_EnterF ret Fkey_Save: push word ptr F_or_M mov F_or_M,1 mov bp,offset MemoryParams call S_EnterM pop word ptr F_or_M ret Fkey_Delete: mov bl,ds:[bp].S_Pos call Delete ret Fkey_PathFilter: call S_PathFilter ret Fkey_Rescan: call ReadDir ret RA_FictiveName db 'ESD$$$$$.$$$',0 ResetAppleII proc far push ax bx cx dx si di bp ds es pushf cli call SystemRESET popf push cs pop ds mov ax,Apple mov es,ax assume es:Apple xor di,di mov cx,0C000h xor al,al cld rep stosb xor ax,ax mov bx,0C000h mov si,offset RA_FictiveName mov cx,102h call FileIsLoaded ; Reset done! mov bp,offset MemoryParams mov bl,M_Pos call Delete call S_Up mov bx,es:[0FFFCh] mov ax,TaskControl mov es,ax assume es:TaskControl mov es:r_PC,bx pop es ds bp di si dx cx bx ax ret ResetAppleII endp assume es:Emulate 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 FM ends END