GophHub - zajo/appler/src/FM.ASM


Raw File

    1	;  _____________________________________________
    2	; |                                             |
    3	; |  Project:   APPLER                          |
    4	; |  File:      FM.ASM                          |
    5	; |  Compiler:  16-bit TASM (2.5)               |
    6	; |                                             |
    7	; |  Subject:   File Manager                    |
    8	; |                                             |
    9	; |  Author:    Emil Dotchevski                 |
   10	; |_____________________________________________|
   11	
   12	                include GLOBALS.INC
   13	                include INTERFAC.INC
   14	                include CONIO.INC
   15	                include FM.INC
   16	
   17	G_DIRECTORY     =       0
   18	G_MEMORY        =       1
   19	G_PATH_FILTER   =       2
   20	
   21	FM              segment public
   22	                assume  cs:FM,ds:FM,es:Emulate
   23	
   24	GetLineBuf      db      80h dup (0)
   25	
   26	GetLineParams   GL_ParamStruc  <?,0,1,1,5,0,0,20h,40h,0,?,?,0Bh,1,0,GetLineUser,?,?,?,?>
   27	ScreenIOParams  SIO_ParamStruc <1,FM,0,0,offset Screen,seg Screen,1,0,1,1>
   28	GetKeyParams    RK_ParamStruc  <1,Fkey,1,Alt_Key,0,?,ShowAll,0>
   29	
   30	FMInInit        proc    far
   31	                cli
   32	                push    ax ds es
   33	                mov     ax,Emulate
   34	                mov     es,ax
   35	                mov     al,es:[C000]
   36	                mov     cs:KeyPressed,al
   37	                mov     es:C000,0
   38	                call    DebugKeysOn
   39	                assume  ds:CONio
   40	                mov     ax,CONio
   41	                mov     ds,ax
   42	                mov     GL_ParamsOfs,  offset GetLineParams
   43	                mov     GL_ParamsSeg,  seg    GetLineParams
   44	                mov     SIO_ParamsOfs, offset ScreenIOParams
   45	                mov     SIO_ParamsSeg, seg    ScreenIOParams
   46	                mov     RK_ParamsOfs,  offset GetKeyParams
   47	                mov     RK_ParamsSeg,  seg    GetKeyParams
   48	                assume  ds:FM
   49	                mov     cs:GetKeyParams.RK_ErrPtr,0
   50	                pop     es ds ax
   51	                call    UnsetBreaks
   52	                sti
   53	                ret
   54	FMInInit        endp
   55	
   56	KeyPressed      db      0
   57	FMOutInit       proc    far
   58	                cli
   59	                push    ax es
   60	                mov     ax,Emulate
   61	                mov     es,ax
   62	                mov     al,cs:KeyPressed
   63	                mov     es:C000,al
   64	                mov     ax,seg T_Iflags
   65	                mov     es,ax
   66			assume  es:seg T_Iflags
   67	                mov     byte ptr es:T_Iflags,00000010b
   68	                assume  es:Emulate
   69	                pop     es ax
   70	                call    SetBreaks
   71			call    AppleKeysOn
   72	                ret
   73	FMOutInit       endp
   74	
   75	
   76	
   77	; Entry:
   78	;   DS --> segment
   79	;   SI --> ^ext to add  (ASCIIZ)
   80	;   DI --> ^filespec    (ASCIIZ)
   81	; Exit:
   82	;   CF --> 1 ext is not as expected, 0 - otherwise
   83	
   84	AE_Ext          db      3 dup (?)
   85	AE_Start        dw      ?
   86	AddExt          proc    far
   87	                push    ax cx si di es
   88	                push    si
   89	                mov     cs:AE_Start,di
   90	                push    ds
   91	                pop     es
   92	                cld
   93	                mov     cx,0FFh
   94	                xor     al,al
   95	        repne   scasb
   96	                dec     di
   97	                mov     cx,di
   98	AE_Loop:        dec     di
   99	                cmp     di,cs:AE_Start
  100	                je      AE_DoAddExt
  101	                mov     al,ds:[di]
  102	                cmp     al,'.'
  103	                je      AE_ret
  104	                cmp     al,'\'
  105	                jne     AE_Loop
  106	AE_DoAddExt:    mov     di,cx
  107	                push    di
  108	                mov     cx,5
  109	        rep     movsb
  110	                pop     di
  111	AE_ret:         pop     si
  112	AE_WhatExtLoop: lodsb
  113	                or      al,al
  114	                clc
  115	                jz      AE_Quit
  116	                scasb
  117	                je      AE_WhatExtLoop
  118	                call    Upcase
  119	                cmp     al,ds:[di-1]
  120	                je      AE_WhatExtLoop
  121	                stc
  122	AE_Quit:        pop     es di si cx ax
  123	                ret
  124	AddExt          endp
  125	
  126	
  127	; Entry:
  128	;   DS --> segment
  129	;   SI --> ^ext to add  (ASCIIZ)
  130	;   DI --> ^filespec    (ASCIIZ)
  131	; Exit:
  132	;   ZF --> 1 ext is as expected, 0 - otherwise
  133	
  134	CE_Ext          db      3 dup (?)
  135	CE_Start        dw      ?
  136	CmpExt          proc    far
  137	                push    ax cx si di es
  138	                mov     cs:CE_Start,di
  139	                push    ds
  140	                pop     es
  141	                cld
  142	                mov     cx,0FFh
  143	                xor     al,al
  144	        repne   scasb
  145	CE_Loop:        dec     di
  146	                cmp     di,cs:CE_Start
  147	                je      CE_Quit
  148	                mov     al,ds:[di]
  149	                cmp     al,'\'
  150	                je      CE_Quit
  151	                cmp     al,'.'
  152	                jne     CE_Loop
  153	CE_CmpLoop:     lodsb
  154	                or      al,al
  155	                je      CE_Quit
  156	                scasb
  157	                je      CE_CmpLoop
  158	                call    Upcase
  159	                cmp     al,es:[di-1]
  160	                je      CE_CmpLoop
  161	CE_Quit:        or      al,al
  162	                pop     es di si cx ax
  163	                ret
  164	CmpExt          endp
  165	
  166	
  167	GoWhere?        dw      G_DIRECTORY
  168	FM_MainRet:     push    cs
  169	                pop     ds
  170	                mov     F_MaxLength,0
  171	                call    ReadDir
  172	BigLoop:        mov     ch,GetLineParams.GL_BegPrint
  173	                mov     cl,GetLineParams.GL_Pos
  174	                mov     di,GoWhere?
  175	                shl     di,1
  176	                mov     GoWhere?,G_DIRECTORY
  177	                call    CmndAddress[di]
  178	                mov     GetLineParams.GL_Pos,cl
  179	                mov     GetLineParams.GL_BegPrint,ch
  180	                jmp     BigLoop
  181	
  182	CmndAddress     dw      Directory,Memory,S_PathFilter
  183	
  184	
  185	
  186	Directory:      mov     F_or_M,0
  187	                jmp     Select
  188	
  189	Memory:         mov     F_or_M,1
  190	                jmp     Select
  191	
  192	
  193	S_CommandsNum   =       8
  194	S_ParamsStruc   struc
  195	S_MaxLength     db      ?
  196	S_BegPrint      db      ?
  197	S_Pos           db      ?
  198	S_CX            dw      ?
  199	S_LinesNum      db      ?
  200	S_Buffer        db      ?
  201	S_ParamsStruc   ends
  202	
  203	F_or_M          db      0
  204	                db      ?
  205	S_ActiveFlags   dw      0000000000000100b,0000000000001000b
  206	S_Parameters    dw      DirectoryParams,MemoryParams
  207	
  208	DirectoryParams label   byte
  209	F_MaxLength     db      0
  210	F_BegPrint      db      0
  211	F_Pos           db      0
  212	F_CX            dw      72Ah
  213	F_LinesNum      db      17
  214	FileBuffer      db      MAX_DIRECTORY_ENTRIES * size FileDescription dup (0)
  215	FileTmpBuffer   db      size FileDescription dup (0)
  216	
  217	MemoryParams    label   byte
  218	M_MaxLength     db      1
  219	M_BegPrint      db      0
  220	M_Pos           db      0
  221	M_CX            dw      0B02h
  222	M_LinesNum      db      12
  223	MemoryBuffer    db      1,0Fh,'<New File>',0
  224	                db      FD_STATUS
  225	                dw      0,0FFFFh,0
  226	                db      0
  227	                dw      0,0
  228	                db      MAX_MEMORY_ENTRIES * size FileDescription dup (0)
  229	
  230	S_Commands      db      'tben',18h
  231	                db      7,8,3,4,1,2,0Dh,0Ch
  232	S_Subrt         dw      S_Type,S_BegAdr,S_EndAdr,S_Name,S_Enter
  233	                dw      S_Up,S_Down,S_PgUp,S_PgDn,S_Home,S_End,S_Tab,GoAppleII
  234	S_CallIfZero?   db      0,0,0,0,0,0,0,0,0,0,0,0,1
  235	
  236	Select:         xor     bx,bx
  237	                mov     SHL_Flag,1
  238	                mov     GetLineParams.GL_AllowSpc,0
  239	                gotoxy  2,0
  240	                mov     cs:GetLineParams.GL_CX,cx
  241	                mov     bl,F_or_M
  242	                shl     bx,1
  243	                mov     bp,S_Parameters[bx]
  244	                mov     ax,S_ActiveFlags[bx]
  245	                mov     ActiveFlags,ax
  246	                mov     FkeysFlags,1111111111b
  247	                mov     ScreenIOparams.CursorFlag,0
  248	                mov     GetLineParams.GL_Color,0Bh
  249	                mov     cx,ds:[bp].S_CX
  250	                call    ReadKey
  251	                cmp     al,7Fh
  252	                je      SelectRet
  253	                mov     di,offset S_Commands
  254	                mov     cx,offset S_Subrt- offset S_Commands
  255	                call    CalcCommand
  256	                jc      Select
  257	                cmp     ds:[bp].S_MaxLength,0
  258	                jnz     S_ok1
  259	                test    S_CallIfZero?[di],1
  260	                jz      Select
  261	S_ok1:          shl     di,1
  262	                call    S_Subrt[di]
  263	                jnc     Select
  264	                call    GoAppleII
  265	                jmp     Select
  266	SelectRet:      GetLineService _GL_CLRBUFF
  267	                mov     F_or_M,0
  268	                ret
  269	
  270	
  271	S_Tab:          xor     F_or_M,1
  272	                clc
  273	                ret
  274	
  275	
  276	NameEntering    db      0
  277	S_NameFlags     db      0,1,1,1
  278	S_Name:         call    EnterFilename
  279	                clc
  280	                ret
  281	EnterFilename:  push    ax bx cx dx di bp
  282	                mov     NameEntering,1
  283	                push    word ptr [GetKeyParams.RK_AltFlag]
  284	                mov     bl,0Bh
  285	                mov     GetLineParams.GL_Color,bl
  286	                mov     GetKeyParams.RK_AltFlag,0
  287	                mov     SHL_Flag,0
  288	                mov     bl,ds:[bp].S_Pos
  289	                call    CalcBuffer
  290	                test    ds:[bp].S_Buffer[di].FileFlags,FF_DAMAGED?
  291	                jnz     S_NameRet
  292	                test    ds:[bp].S_Buffer[di].FileFlags,FF_MODIFYNAME?
  293	                jz      S_NameRet
  294	                mov     cs:GetKeyParams.RK_ErrPtr,offset SMS_EnterFilename
  295	                mov     FkeysFlags,0000000010b
  296	                mov     ScreenIOparams.CursorFlag,1
  297	                mov     bl,ds:[bp].S_Pos
  298	                call    CalcBuffer
  299	                lea     bx,ds:[bp].S_Buffer[di].FileName
  300	                mov     GetLineParams.GL_Buffer,bx
  301	                mov     GetLineParams.GL_Pos,0
  302	                mov     GetLineParams.GL_BegPrint,0
  303	                mov     GetLineParams.GL_MaxLength,0Ch
  304	                mov     GetLineParams.GL_MaxPrint,0Dh
  305	                call    Seek0
  306	                mov     GetLineParams.GL_Length,bl
  307	                mov     ScreenIOparams.CursorLen,1
  308	                mov     cx,ds:[bp].S_CX
  309	                dec     ch
  310	                inc     cl
  311	                mov     al,80 * 2
  312	                mul     ch
  313	                xor     bx,bx
  314	                mov     bl,cl
  315	                shl     bx,1
  316	                add     ax,bx
  317	                mov     cx,ax
  318	                GetLineService _GETLINE
  319	S_NameRet:      pop     word ptr [GetKeyParams.RK_AltFlag]
  320	                mov     NameEntering,0
  321	                pop     bp di dx cx bx ax
  322	                ret
  323	
  324	S_PathFilter:   push    word ptr ds:[ScreenIOparams.CursorFlag]
  325	                push    word ptr ds:[GetKeyParams.RK_AltFlag]
  326	                mov     SHL_Flag,0
  327	                mov     GetKeyParams.RK_AltFlag,0
  328	                mov     GetLineParams.GL_AllowSpc,0
  329	                mov     ActiveFlags,0000000000000001b
  330	                mov     FkeysFlags,0000000010b
  331	                mov     ScreenIOparams.CursorFlag,1
  332	                mov     GetLineParams.GL_Buffer,offset PathFilter
  333	                mov     GetLineParams.GL_Pos,0
  334	                mov     GetLineParams.GL_BegPrint,0
  335	                mov     GetLineParams.GL_MaxLength,67+20h
  336	                mov     GetLineParams.GL_MaxPrint,35
  337	                mov     ScreenIOparams.CursorLen,1
  338	                call    LinkPathFilter
  339	                mov     GetLineParams.GL_Length,bl
  340	                gotoxy  5,2
  341	                GetLineService _GETLINE
  342	                jc      S_Path1
  343	                mov     GoWhere?,G_DIRECTORY
  344	S_Path1:        call    GetPathFilter
  345	                call    ReadDir
  346	                pop     word ptr ds:[GetKeyParams.RK_AltFlag]
  347	                pop     word ptr ds:[ScreenIOparams.CursorFlag]
  348	                mov     SHL_Flag,1
  349	                GetLineService _GL_CLRBUFF
  350	                clc
  351	                ret
  352	
  353	S_Up:           push    ax
  354	                mov     al,ds:[bp].S_Pos
  355	                or      al,al
  356	                jz      S_UpRet
  357	                dec     al
  358	                mov     ah,al
  359	                sub     ah,ds:[bp].S_BegPrint
  360	                cmp     ah,2
  361	                jae     S_UpOk1
  362	                cmp     ds:[bp].S_BegPrint,0
  363	                jz      S_UpOk1
  364	                dec     ds:[bp].S_BegPrint
  365	                inc     byte ptr ds:[bp].S_CX[1]
  366	S_UpOk1:        dec     byte ptr ds:[bp].S_CX[1]
  367	S_UpRet:        mov     ds:[bp].S_Pos,al
  368	                pop     ax
  369	                clc
  370	                ret
  371	
  372	S_Down:         push    ax
  373	                mov     al,ds:[bp].S_Pos
  374	                mov     ah,ds:[bp].S_MaxLength
  375	                dec     ah
  376	                cmp     al,ah
  377	                je      S_DownRet
  378	                inc     al
  379	                mov     ah,al
  380	                sub     ah,ds:[bp].S_BegPrint
  381	                add     ah,2
  382	                cmp     ah,ds:[bp].S_LinesNum
  383	                jb      S_DownOk1
  384	                mov     ah,ds:[bp].S_BegPrint
  385	                add     ah,ds:[bp].S_LinesNum
  386	                jc      S_DownOk1
  387	                cmp     ah,ds:[bp].S_MaxLength
  388	                jae     S_DownOk1
  389	                inc     ds:[bp].S_BegPrint
  390	                dec     byte ptr ds:[bp].S_CX[1]
  391	S_DownOk1:      inc     byte ptr ds:[bp].S_CX[1]
  392	S_DownRet:      mov     ds:[bp].S_Pos,al
  393	                pop     ax
  394	                clc
  395	                ret
  396	
  397	S_PgUp:         push    cx
  398	                xor     ch,ch
  399	                mov     cl,ds:[bp].S_LinesNum
  400	                dec     cx
  401	S_PgUpLoop:     call    S_Up
  402	                loop    S_PgUpLoop
  403	                pop     cx
  404	                clc
  405	                ret
  406	
  407	S_PgDn:         push    cx
  408	                xor     ch,ch
  409	                mov     cl,ds:[bp].S_LinesNum
  410	                dec     cx
  411	S_PgDnLoop:     call    S_Down
  412	                loop    S_PgDnLoop
  413	                pop     cx
  414	                clc
  415	                ret
  416	
  417	S_Home:         push    cx
  418	                mov     cx,MAX_DIRECTORY_ENTRIES
  419	                dec     cx
  420	S_HomeLoop:     call    S_Up
  421	                loop    S_HomeLoop
  422	                pop     cx
  423	                clc
  424	                ret
  425	
  426	S_End:          push    cx
  427	                mov     cx,MAX_DIRECTORY_ENTRIES
  428	                dec     cx
  429	S_EndLoop:      call    S_Down
  430	                loop    S_EndLoop
  431	                pop     cx
  432	                clc
  433	                ret
  434	
  435	S_TypeNewVal    db      FD_Directory,FD_MSdos,FD_Code,FD_Status
  436	S_TypeProcs     dw      STP_Directory,STP_Code,STP_Status,STP_MSdos
  437	S_Type:         push    ax bx di
  438	                mov     bl,ds:[bp].S_Pos
  439	                call    CalcBuffer
  440	                test    ds:[bp].S_Buffer[di].FileFlags,FF_DAMAGED?
  441	                jnz     S_TypeRet
  442	                test    ds:[bp].S_Buffer[di].FileFlags,FF_MODIFYTYPE?
  443	                jz      S_TypeRet
  444	                xor     bx,bx
  445	                mov     bl,ds:[bp].S_Buffer[di].FileType
  446	                mov     bl,S_TypeNewVal[bx]
  447	                mov     ds:[bp].S_Buffer[di].FileType,bl
  448	                shl     bx,1
  449	                cmp     F_or_M,0
  450	                mov     al,FF_MODIFYNAME?
  451	                jnz     S_TypeCallProc
  452	                call    FU_Procs[bx]
  453	                mov     al,0
  454	S_TypeCallProc: call    S_TypeProcs[bx]
  455	S_TypeRet:      pop     di bx ax
  456	                ret
  457	
  458	STP_Directory:  ret
  459	
  460	STP_Code:       or      al,FF_SHOWADDR? or FF_MODIFYADDR? or FF_MODIFYTYPE?
  461	                mov     ds:[bp].S_Buffer[di].FileFlags,al
  462	                ret
  463	
  464	STP_Status:     or      al,FF_MODIFYTYPE?
  465	                mov     ds:[bp].S_Buffer[di].FileFlags,al
  466	                ret
  467	
  468	STP_MSdos:      or      al,FF_SHOWADDR? or FF_MODIFYADDR? or FF_MODIFYTYPE?
  469	                mov     ds:[bp].S_Buffer[di].FileFlags,al
  470	                ret
  471	
  472	
  473	
  474	
  475	S_BegAdrX       db      65,25
  476	S_BegAdr:       push    ax bx cx dx di
  477	                mov     SHL_Flag,0
  478	                mov     bl,ds:[bp].S_Pos
  479	                call    CalcBuffer
  480	                test    ds:[bp].S_Buffer[di].FileFlags,FF_MODIFYADDR?
  481	                jz      S_BegAdrRet
  482	                test    ds:[bp].S_Buffer[di].FileFlags,FF_DAMAGED?
  483	                jnz     S_BegAdrRet
  484	                mov     cx,ds:[bp].S_CX
  485	                xor     bx,bx
  486	                mov     bl,F_or_M
  487	                mov     cl,S_BegAdrX[bx]
  488	                mov     dx,ds:[bp].S_Buffer[di].FileEndAdr
  489	                sub     dx,ds:[bp].S_Buffer[di].FileBegAdr
  490	                mov     bx,0FFFFh
  491	                sub     bx,dx
  492	                call    GetAddress
  493	                jc      S_BegAdrRet
  494	                cmp     ax,bx
  495	                jna     S_BegAdrOK
  496	                mov     dx,0FFFFh
  497	                sub     dx,ax
  498	S_BegAdrOK:     mov     ds:[bp].S_Buffer[di].FileBegAdr,ax
  499	                add     ax,dx
  500	                mov     ds:[bp].S_Buffer[di].FileEndAdr,ax
  501	S_BegAdrRet:    pop     di dx cx bx ax
  502	                clc
  503	                ret
  504	
  505	S_EndAdrX       db      72,32
  506	S_EndAdr:       push    ax bx cx di
  507	                mov     SHL_Flag,0
  508	                mov     bl,ds:[bp].S_Pos
  509	                call    CalcBuffer
  510	                test    ds:[bp].S_Buffer[di].FileFlags,FF_DAMAGED?
  511	                jnz     S_EndAdrRet
  512	                test    ds:[bp].S_Buffer[di].FileFlags,FF_MODIFYADDR?
  513	                jz      S_EndAdrRet
  514	                mov     cx,ds:[bp].S_CX
  515	                xor     bx,bx
  516	                mov     bl,F_or_M
  517	                mov     cl,S_EndAdrX[bx]
  518	                call    GetAddress
  519	                jc      S_EndAdrRet
  520	                cmp     ax,ds:[bp].S_Buffer[di].FileBegAdr
  521	                jb      S_EndAdrRet
  522	                cmp     ds:[bp].S_Buffer[di].FileBegAdr,0
  523	                jnz     S_EndAdrOk
  524	S_EndAdrOk:     mov     ds:[bp].S_Buffer[di].FileEndAdr,ax
  525	S_EndAdrRet:    pop     di cx bx ax
  526	                clc
  527	                ret
  528	
  529	S_EnterErrorFL  db      0
  530	S_EnterProcs    dw      S_EnterF,S_EnterM
  531	S_Enter:        push    ax bx cx dx si di ds es
  532	                cmp     ds:[bp].S_MaxLength,0
  533	                jz      S_EnterRet
  534	                mov     bl,ds:[bp].S_Pos
  535	                call    CalcBuffer
  536	                xor     bx,bx
  537	                mov     bl,F_or_M
  538	                shl     bx,1
  539	                call    S_EnterProcs[bx]
  540	S_EnterRet:     pop     es ds di si dx cx bx ax
  541	                clc
  542	                ret
  543	
  544	SEF_Procs       dw      SEF_Directory,SEF_Code,SEF_Status,SEF_Fragment
  545	S_EnterF:       mov     bl,DirectoryParams.S_Pos
  546	                call    CalcBuffer
  547	                xor     bx,bx
  548	                mov     bl,FileBuffer[di].FileType
  549	                mov     si,bx
  550	                mov     bx,di
  551	                call    LinkName
  552	                shl     si,1
  553	                mov     dx,offset Path
  554	                call    SEF_Procs[si]
  555	                call    UnLinkName
  556	                ret
  557	
  558	SEF_Directory:  mov     bx,LN_BX
  559	                mov     byte ptr Path[bx],'\'
  560	                mov     byte ptr Path[bx+1],0
  561	                call    ReadDir
  562	                ret
  563	
  564	SEF_Code:       mov     RF_ErrPtr,offset SMS_ErrFileLoad
  565	                mov     RF_MesPtr,offset SMS_FileLoaded
  566	                call    OpenReadFile
  567	                jc      SEF_CodeRet
  568	                mov     cx,4
  569	                call    ReadFile
  570	SEF_CodeRet:    ret
  571	
  572	SEF_Status:     push    es
  573	                call    OpenReadFile
  574	                jc      SEF_StatusRet
  575	                call    FloppyLoad
  576	                call    DRAMLoad
  577	                mov     RF_ErrPtr,offset SMS_ErrStatLoad
  578	                mov     RF_MesPtr,offset SMS_StatLoaded
  579	                mov     cx,size RW_Header
  580	                call    ReadFile
  581	                mov     si,offset RW_Header
  582	                cld
  583	                assume  es:TaskControl
  584	                mov     ax,TaskControl
  585	                mov     es,ax
  586	                lodsb
  587	                mov     es:r_A,al
  588	                lodsb
  589	                mov     es:r_X,al
  590	                lodsb
  591	                mov     es:r_Y,al
  592	                lodsb
  593	                mov     es:r_S,al
  594	                lodsb
  595	                mov     es:r_P,al
  596	                lodsw
  597	                mov     es:r_PC,ax
  598	
  599	                mov     ax,Peripher
  600	                mov     es,ax
  601	                assume  es:Peripher
  602	                lodsb
  603	                mov     es:FLAGS,al
  604	                lodsw
  605	                mov     es:BufferPTR,ax
  606	                lodsw
  607	                mov     es:WriteCNT,ax
  608	                lodsb
  609	                mov     es:WriteREG,al
  610	                mov     di,offset CurrentDrive
  611	                mov     cx,5                    ; non-dos fields size
  612	        rep     movsb
  613	                mov     di,offset OtherDrive
  614	                mov     cx,5                    ; non-dos fields size
  615	        rep     movsb
  616	
  617	                mov     ax,Emulate
  618	                mov     es,ax
  619	                assume  es:Emulate
  620	                lodsb
  621	                mov     es:C050,al
  622	                lodsb
  623	                mov     es:C080,al
  624	
  625	SEF_StatusRet:  pop     es
  626	                ret
  627	                assume  es:Emulate
  628	
  629	SEF_Fragment:   mov     RF_ErrPtr,offset SMS_ErrFileLoad
  630	                mov     RF_MesPtr,offset SMS_FileLoaded
  631	                xor     cx,cx
  632	                call    OpenReadFile
  633	                jc      SEF_FrgRet
  634	                call    ReadFile
  635	SEF_FrgRet:     ret
  636	
  637	
  638	SEM_SVD         db      '.SVD',0
  639	SEM_APL         db      '.APL',0
  640	SEM_Procs       dw      SEM_Directory,SEM_Code,SEM_Status,SEM_Fragment
  641	SEM_NewFile     db      ?
  642	S_EnterM:       mov     bl,MemoryParams.S_Pos
  643	                call    CalcBuffer
  644	                cmp     MemoryBuffer[di].FileName[0],1
  645	                mov     SEM_NewFile,0
  646	                jne     SEM_NotNewFile
  647	                mov     SEM_NewFile,1
  648	                dec     MemoryBuffer[di].FileName[0]
  649	                mov     MemoryBuffer[di].FileFlags,FF_MODIFYNAME?
  650	                call    EnterFilename
  651	                push    di
  652	                lea     di,MemoryBuffer[di].FileName
  653	                jnc     SEM_ok1
  654	                push    es
  655	                mov     si,offset FL_NewFile
  656	                push    ds
  657	                pop     es
  658	                mov     cx,13
  659	        rep     movsb
  660	                pop     es di
  661	                ret
  662	SEM_ok1:        mov     si,offset SEM_SVD
  663	                call    AddExt
  664	                mov     cl,FD_STATUS
  665	                mov     ch,FF_MODIFYNAME? or FF_MODIFYTYPE?
  666	                jnc     SEM_ok2
  667	                or      ch,FF_MODIFYADDR? or FF_SHOWADDR?
  668	                mov     si,offset SEM_APL
  669	                call    CmpExt
  670	                mov     cl,FD_CODE
  671	                je      SEM_ok2
  672	                mov     cl,FD_MSDOS
  673	SEM_ok2:        pop     di
  674	                mov     MemoryBuffer[di].FileFlags,ch
  675	                mov     MemoryBuffer[di].FileType,cl
  676	                cmp     cl,FD_STATUS
  677	                je      SEM_NotNewFile
  678	                call    S_BegAdr
  679	                call    S_EndAdr
  680	SEM_NotNewFile: xor     bx,bx
  681	                mov     bl,MemoryBuffer[di].FileType
  682	                mov     si,bx
  683	                mov     bx,di
  684	                call    LinkName
  685	                shl     si,1
  686	                mov     dx,offset Path
  687	                call    SEM_Procs[si]
  688	                call    UnlinkName
  689	                cmp     SEM_NewFile,0
  690	                jz      SEM_Ret
  691	                lea     si,MemoryBuffer[di].FileName
  692	                mov     cl,MemoryBuffer[di].FileType
  693	                mov     ch,MemoryBuffer[di].FileFlags
  694	                mov     ax,MemoryBuffer[di].FileBegAdr
  695	                mov     bx,MemoryBuffer[di].FileEndAdr
  696	                sub     bx,ax
  697	                inc     bx
  698	                call    FileIsLoaded
  699	SEM_Ret:        ret
  700	
  701	SEM_Directory:  clc
  702	                ret
  703	
  704	SEM_Code:       mov     WF_ErrPtr,offset SMS_ErrFileSave
  705	                mov     WF_MesPtr,offset SMS_FileSaved
  706	                mov     ax,MemoryBuffer[di].FileBegAdr
  707	                mov     word ptr RW_Header[0],ax
  708	                mov     ax,MemoryBuffer[di].FileEndAdr
  709	                sub     ax,word ptr RW_Header[0]
  710	                inc     ax
  711	                mov     word ptr RW_Header[2],ax
  712	                call    OpenFileWrite
  713	                jc      SEM_CodeRet
  714	                mov     cx,4
  715	                call    WriteFile
  716	SEM_CodeRet:    ret
  717	
  718	SEM_Status:     mov     WF_ErrPtr,offset SMS_ErrStatSave
  719	                mov     WF_MesPtr,offset SMS_StatSaved
  720	                call    OpenFileWrite
  721	                jc      SEM_StatusRet
  722	                call    FloppySave
  723	                call    DRAMSave
  724	                push    si di ds es
  725	                mov     di,offset RW_Header
  726	                cld
  727	                push    cs
  728	                pop     es
  729	                assume  ds:TaskControl
  730	                mov     ax,TaskControl
  731	                mov     ds,ax
  732	                mov     al,ds:r_A
  733	                stosb
  734	                mov     al,ds:r_X
  735	                stosb
  736	                mov     al,ds:r_Y
  737	                stosb
  738	                mov     al,ds:r_S
  739	                stosb
  740	                mov     al,ds:r_P
  741	                stosb
  742	                mov     ax,ds:r_PC
  743	                stosw
  744	
  745	                mov     ax,Peripher
  746	                mov     ds,ax
  747	                assume  ds:Peripher
  748	                mov     al,FLAGS
  749	                stosb
  750	                mov     ax,BufferPTR
  751	                stosw
  752	                mov     ax,WriteCNT
  753	                stosw
  754	                mov     al,WriteREG
  755	                stosb
  756	                mov     si,offset CurrentDrive
  757	                mov     cx,5                    ; non-dos fields size
  758	        rep     movsb
  759	                mov     si,offset OtherDrive
  760	                mov     cx,5                    ; non-dos fields size
  761	        rep     movsb
  762	
  763	                mov     ax,Emulate
  764	                mov     ds,ax
  765	                assume  ds:Emulate
  766	                mov     al,ds:C050
  767	                stosb
  768	                mov     al,C080
  769	                stosb
  770	
  771	                pop     es ds di si
  772	                assume  ds:FM
  773	                mov     cx,size RW_Header
  774	                call    WriteFile
  775	SEM_StatusRet:  ret
  776	                assume  ds:FM
  777	
  778	SEM_Fragment:   mov     WF_ErrPtr,offset SMS_ErrFileSave
  779	                mov     WF_MesPtr,offset SMS_FileSaved
  780	                call    OpenFileWrite
  781	                jc      SEM_FragmentRet
  782	                xor     cx,cx
  783	                call    WriteFile
  784	SEM_FragmentRet: ret
  785	
  786	
  787	
  788	LinkPathFilter: push    ax si di es
  789	                xor     bx,bx
  790	                push    cs
  791	                pop     es
  792	                mov     si,offset Path
  793	                mov     di,offset PathFilter
  794	                cld
  795	LPF_Loop1:      lodsb
  796	                or      al,al
  797	                jz      LPF_Filter
  798	                stosb
  799	                inc     bx
  800	                jmp     LPF_Loop1
  801	LPF_Filter:     mov     si,offset Filter
  802	LPF_Loop2:      lodsb
  803	                stosb
  804	                inc     bx
  805	                or      al,al
  806	                jnz     LPF_Loop2
  807	                dec     bx
  808	                pop     es di si ax
  809	                ret
  810	
  811	
  812	
  813	GetPathFilter:  push    ax cx dx si di es
  814	                push    cs
  815	                pop     es
  816	                xor     al,al
  817	                mov     di,offset PathFilter
  818	                cld
  819	                mov     cx,20h+67
  820	        repne   scasb
  821	                dec     di
  822	                mov     si,di
  823	                std
  824	GPF_Loop1:      cmp     si,offset PathFilter
  825	                jna     GPF_NoPath
  826	                lodsb
  827	                cmp     al,'\'
  828	                jne     GPF_Loop1
  829	                add     si,2
  830	                mov     dx,si
  831	                mov     si,offset PathFilter
  832	                mov     di,offset Path
  833	                cld
  834	GPF_Loop2:      lodsb
  835	                stosb
  836	                cmp     si,dx
  837	                jna     GPF_Loop2
  838	                dec     si
  839	                dec     di
  840	                xor     al,al
  841	                stosb
  842	                mov     Path[67],0
  843	GPF_NoPath:     cld
  844	                mov     di,offset Filter
  845	                xor     cx,cx
  846	GPF_Loop3:      lodsb
  847	                stosb
  848	                cmp     cx,20h
  849	                je      GPF_LongFilt
  850	                inc     cx
  851	                or      al,al
  852	                jnz     GPF_Loop3
  853	                cmp     cx,1
  854	                je      GPF_NoFilter
  855	GPF_Ret:        pop     es di si dx cx ax
  856	                ret
  857	
  858	GPF_LongFilt:   dec     di
  859	                xor     ax,ax
  860	                stosb
  861	                jmp     GPF_Ret
  862	
  863	GPF_DefaultFilt db      '*.APL,*.ROM,*.SVD',0
  864	GPF_NoFilter:   mov     si,offset PathFilter
  865	                mov     di,offset Path
  866	                cld
  867	GPF_Loop4:      lodsb
  868	                stosb
  869	                or      al,al
  870	                jnz     GPF_Loop4
  871	                mov     si,offset GPF_DefaultFilt
  872	                mov     di,offset Filter
  873	                mov     cx,offset GPF_NoFilter - offset GPF_DefaultFilt
  874	        rep     movsb
  875	                jmp     GPF_Ret
  876	
  877	
  878	
  879	Seek0:          push    si
  880	                xor     si,si
  881	Seek0_Loop:     cmp     byte ptr ds:[bx][si],0
  882	                jz      Seek0_Done
  883	                inc     si
  884	                jmp     Seek0_Loop
  885	Seek0_Done:     mov     bx,si
  886	                pop     si
  887	                ret
  888	
  889	
  890	; Entry:
  891	;  DS:SI -> Name,0
  892	;  AX    -  Begin Address
  893	;  BX    -  Length
  894	;  CL    -  Type
  895	;  CH    -  Flags
  896	FIL_Buffer      db      80 dup (0)
  897	FileIsLoaded    proc    far
  898	                push    ax bx cx dx si di bp ds es
  899	                push    ax
  900	                mov     di,offset FIL_Buffer
  901	                push    cs
  902	                pop     es
  903	                mov     ah,60h
  904	                int     21h
  905	                mov     si,di
  906	                push    cs
  907	                pop     ds
  908	                lea     di,FileTmpBuffer.FileName
  909	                mov     dx,di
  910	FIL_Loop:       lodsb
  911	                cmp     al,':'
  912	                je      FIL_Hop1
  913	                cmp     al,'\'
  914	                jne     FIL_ok1
  915	FIL_Hop1:       mov     di,dx
  916	                jmp     FIL_Loop
  917	FIL_ok1:        stosb
  918	                or      al,al
  919	                jnz     FIL_Loop
  920	                pop     ax
  921	                mov     FileTmpBuffer.FileBegAdr,ax
  922	                mov     word ptr FileTmpBuffer.File1st4bytes[0],ax
  923	                mov     dx,bx
  924	                or      bx,bx
  925	                jnz     FIL_ok2
  926	                dec     dx
  927	FIL_ok2:        mov     word ptr FileTmpBuffer.File1st4bytes[2],dx
  928	                add     bx,ax
  929	                dec     bx
  930	                mov     FileTmpBuffer.FileEndAdr,bx
  931	                mov     FileTmpBuffer.FileType,cl
  932	                mov     FileTmpBuffer.FileFlags,ch
  933	                mov     bx,MAX_DIRECTORY_ENTRIES
  934	                mov     ax,size FileDescription
  935	                mul     bx
  936	                mov     di,ax
  937	                call    FileLoaded
  938	                pop     es ds bp di si dx cx bx ax
  939	                ret
  940	FileIsLoaded    endp
  941	
  942	
  943	
  944	FL_NewFile      db      1,0Fh,'<New File>',0
  945	                db      FD_STATUS
  946	                dw      0,0FFFFh,0
  947	                db      0
  948	                dw      0,0
  949	FileLoaded:     push    ax bx dx si di bp
  950	                mov     bp,offset MemoryParams
  951	                mov     si,di
  952	                mov     bl,M_MaxLength
  953	                dec     bl
  954	                cmp     M_MaxLength,MAX_MEMORY_ENTRIES
  955	                jae     FL_NoInc
  956	                inc     M_MaxLength
  957	FL_NoInc:       call    CalcBuffer
  958	                mov     bx,size FileDescription
  959	                dec     bx
  960	FL_Loop0:       mov     al,FileBuffer[si][bx]
  961	                mov     MemoryBuffer[di][bx],al
  962	                mov     al,FL_NewFile[bx]
  963	                mov     MemoryBuffer[size FileDescription+di][bx],al
  964	                dec     bx
  965	                jns     FL_Loop0
  966	                or      MemoryBuffer[di].FileFlags,FF_MODIFYNAME?
  967	                xor     si,si
  968	                mov     bx,1
  969	FL_Loop1:       cmp     si,di
  970	                je      FL_Next1
  971	                mov     ax,MemoryBuffer[di].FileBegAdr
  972	                cmp     ax,MemoryBuffer[si].FileEndAdr
  973	                ja      FL_Next1
  974	                mov     ax,MemoryBuffer[di].FileEndAdr
  975	                cmp     ax,MemoryBuffer[si].FileBegAdr
  976	                jb      FL_Next1
  977	                cmp     ax,MemoryBuffer[si].FileEndAdr
  978	                jb      FL_Damaged
  979	                mov     ax,MemoryBuffer[di].FileBegAdr
  980	                cmp     ax,MemoryBuffer[si].FileBegAdr
  981	                ja      FL_Damaged
  982	                dec     bx
  983	                call    Delete
  984	                inc     bx
  985	                sub     di,size FileDescription
  986	                jmp     FL_Next2
  987	FL_Damaged:     or      MemoryBuffer[si].FileFlags,FF_DAMAGED?
  988	FL_Next1:       add     si,size FileDescription
  989	                inc     bl
  990	FL_Next2:       cmp     bl,M_MaxLength
  991	                jb      FL_Loop1
  992	                mov     bp,offset MemoryParams
  993	                call    S_End
  994	                call    S_Up
  995	                pop     bp di si dx bx ax
  996	                ret
  997	
  998	
  999	Delete:         push    ax cx si di es
 1000	                mov     cl,ds:[bp].S_MaxLength
 1001	                cmp     cl,1
 1002	                jz      DelRet
 1003	                sub     cl,bl
 1004	                dec     ds:[bp].S_MaxLength
 1005	                cmp     cl,1
 1006	                je      DelRet
 1007	                mov     al,Size FileDescription
 1008	                mul     cl
 1009	                mov     cx,ax
 1010	                call    CalcBuffer
 1011	                lea     si,ds:[bp].S_Buffer
 1012	                add     di,si
 1013	                mov     si,di
 1014	                add     si,size FileDescription
 1015	                push    cs
 1016	                pop     es
 1017	                cld
 1018	        rep     movsb
 1019	DelRet:         mov     al,ds:[bp].S_Pos
 1020	                cmp     al,ds:[bp].S_MaxLength
 1021	                jb      DelRetOk
 1022	                call    S_Up
 1023	DelRetOk:       pop     es di si cx ax
 1024	                ret
 1025	
 1026	
 1027	GA_Buffer       db      5 dup (?)
 1028	GetAddress:     push    word ptr [GetKeyParams.RK_AltFlag]
 1029	                mov     GetKeyParams.RK_AltFlag,0
 1030	                push    bx bp cx
 1031	                xor     bx,bx
 1032	                mov     bl,F_or_M
 1033	                mov     bl,0Bh
 1034	                mov     GetLineParams.GL_Color,bl
 1035	                mov     FkeysFlags,0000000010b
 1036	                mov     ScreenIOparams.CursorFlag,1
 1037	                mov     GetLineParams.GL_Buffer,offset GA_Buffer
 1038	                mov     GetLineParams.GL_MaxLength,4
 1039	                mov     GetLineParams.GL_MaxPrint,4
 1040	                mov     ScreenIOparams.CursorLen,1
 1041	                GetLineService _GL_ClrBuff
 1042	                pop     cx
 1043	                push    cx
 1044	                dec     ch
 1045	                mov     al,80 * 2
 1046	                mul     ch
 1047	                xor     bx,bx
 1048	                mov     bl,cl
 1049	                shl     bx,1
 1050	                add     ax,bx
 1051	                mov     cx,ax
 1052	                GetLineService _GETLINE
 1053	                jc      GetAddressRet
 1054	                xor     cx,cx
 1055	                call    GetAddr
 1056	GetAddressRet:  pop     cx bp bx
 1057	                pop     word ptr [GetKeyParams.RK_AltFlag]
 1058	                ret
 1059	
 1060	
 1061	GA_Delimiters   db      ',/',0
 1062	GA_DelimitersC  =       3
 1063	GetAddr:        push    bx bp
 1064	                xor     bx,bx
 1065	                GetLineService _GL_GetSymb
 1066	                or      al,al
 1067	                jz      GA_error
 1068	                dec     cl
 1069	GA_Loop:        GetLineService _GL_GetSymb
 1070	                push    cx di
 1071	                mov     di,offset GA_Delimiters
 1072	                mov     cx,GA_DelimitersC
 1073	                call    CalcCommand
 1074	                pop     di cx
 1075	                jnc     GA_Exit
 1076	                call    Upcase
 1077	                cmp     al,'0'
 1078	                jb      GA_error
 1079	                cmp     al,'9'
 1080	                jbe     GA_Anumb
 1081	                cmp     al,'a'
 1082	                jb      GA_error
 1083	                cmp     al,'f'
 1084	                ja      GA_error
 1085	                sub     al,27h
 1086	GA_Anumb:       sub     al,'0'
 1087	                shl     bx,4
 1088	                or      bl,al
 1089	                jmp     GA_Loop
 1090	GA_error:       stc
 1091	                jmp     GA_Ret
 1092	GA_Exit:        mov     ax,bx
 1093	                clc
 1094	GA_Ret:         pop     bp bx
 1095	                ret
 1096	
 1097	
 1098	RF_ErrPtr       dw      ?
 1099	RF_MesPtr       dw      ?
 1100	RW_Header       db      100h dup (?)
 1101	
 1102	OpenReadFile:   push    ax
 1103	                call    Prepare4DOS
 1104	                mov     ax,3D00h
 1105	                int     21h
 1106	                mov     bx,ax
 1107	                call    SOD4eraperP
 1108	                pop     ax
 1109	                ret
 1110	
 1111	ReadFile:       push    ax bx cx dx ds
 1112	                call    Prepare4DOS
 1113	                mov     ah,3Fh
 1114	                mov     dx,offset RW_Header
 1115	                or      cx,cx
 1116	                jz      RF_NoHeader
 1117	                int     21h
 1118	                cmp     ax,cx
 1119	                jne     RF_Error
 1120	                jc      RF_Error
 1121	RF_NoHeader:    mov     cx,FileBuffer[di].FileEndAdr
 1122	                mov     dx,FileBuffer[di].FileBegAdr
 1123	                sub     cx,dx
 1124	                mov     ax,Apple
 1125	                mov     ds,ax
 1126	                mov     ah,3Fh
 1127	                inc     cx
 1128	                jnz     RF_NoLong
 1129	                inc     cl
 1130	                mov     ah,3Fh
 1131	                int     21h
 1132	                jc      RF_Error
 1133	                mov     cx,0FFFFh
 1134	                inc     dx
 1135	RF_NoLong:      mov     ah,3Fh
 1136	                int     21h
 1137	                jc      RF_Error
 1138	                cmp     cx,ax
 1139	                jz      RF_NoErr1
 1140	                add     dx,ax
 1141	                dec     dx
 1142	                mov     cs:FileBuffer[di].FileEndAdr,dx
 1143	                jmp     RF_Error
 1144	RF_NoErr1:      mov     ax,cs:RF_MesPtr
 1145	                mov     cs:GetKeyParams.RK_ErrPtr,ax
 1146	                mov     cs:S_EnterErrorFL,0
 1147	                and     cs:FileBuffer[di].FileFlags,not FF_DAMAGED?
 1148	RF_ErrorRet:    mov     ah,3Eh
 1149	                int     21h
 1150	                pop     ds
 1151	                call    SOD4eraperP
 1152	                call    FileLoaded
 1153	                pop     dx cx bx ax
 1154	                ret
 1155	RF_Error:       mov     ax,cs:RF_ErrPtr
 1156	                mov     cs:GetKeyParams.RK_ErrPtr,ax
 1157	                mov     cs:S_EnterErrorFL,1
 1158	                or      cs:FileBuffer[di].FileFlags,FF_DAMAGED?
 1159	                jmp     RF_ErrorRet
 1160	
 1161	
 1162	WF_ErrPtr       dw      ?
 1163	WF_MesPtr       dw      ?
 1164	
 1165	; Create (rewrite) a file. Set CF if an error occured. Exit: BX -- file handle
 1166	
 1167	OpenFileWrite:  push    ax cx dx ds
 1168	                test    MemoryBuffer[di].FileFlags,FF_DAMAGED?
 1169	                jz      OFW_1
 1170	OFW_GetKeyLoop1: mov    SC1_Flag,1
 1171	                mov     SHL_Flag,0
 1172	                mov     ActiveFlags,0000000000010000b
 1173	                call    ReadKey
 1174	                mov     SC1_Flag,0
 1175	                mov     SHL_Flag,1
 1176	                cmp     al,0Ch
 1177	                stc
 1178	                je      OFW_Ret
 1179	                or      al,20h
 1180	                cmp     al,'n'
 1181	                stc
 1182	                je      OFW_Ret
 1183	                cmp     al,'y'
 1184	                jne     OFW_GetKeyLoop1
 1185	                and     MemoryBuffer[di].FileFlags,not FF_DAMAGED?
 1186	OFW_1:          call    Prepare4DOS
 1187	                xor     cx,cx
 1188	                mov     ah,5Bh
 1189	                int     21h
 1190	                jnc     OFW_NoError
 1191	                cmp     ax,50h
 1192	                jne     OFW_Error
 1193	                call    SOD4eraperP
 1194	OFW_GetKeyLoop: mov     SC_Flag,1
 1195	                mov     SHL_Flag,0
 1196	                mov     ActiveFlags,0000000000010000b
 1197	                call    ReadKey
 1198	                mov     SC_Flag,0
 1199	                mov     SHL_Flag,1
 1200	                cmp     al,0Ch
 1201	                stc
 1202	                je      OFW_Ret
 1203	                or      al,20h
 1204	                cmp     al,'n'
 1205	                stc
 1206	                je      OFW_Ret
 1207	                cmp     al,'y'
 1208	                jne     OFW_GetKeyLoop
 1209	                call    Prepare4DOS
 1210	                xor     cx,cx
 1211	                mov     ax,3C01h
 1212	                int     21h
 1213	                jc      OFW_Error
 1214	OFW_NoError:    mov     bx,ax
 1215	                call    SOD4eraperP
 1216	OFW_Ret:        pop     ds dx cx ax
 1217	                ret
 1218	OFW_Error:      mov     ax,cs:WF_ErrPtr
 1219	                mov     cs:GetKeyParams.RK_ErrPtr,ax
 1220	                mov     cs:S_EnterErrorFL,1
 1221	                jmp     OFW_NoError
 1222	
 1223	
 1224	; Entry: BX -- file handle ...
 1225	
 1226	WriteFile:      push    ax bx cx dx ds
 1227	                call    Prepare4DOS
 1228	                mov     ah,40h
 1229	                mov     dx,offset RW_Header
 1230	                or      cx,cx
 1231	                jz      WF_NoHeader
 1232	                int     21h
 1233	                jc      WF_Error
 1234	                cmp     ax,cx
 1235	                jne     WF_Error
 1236	WF_NoHeader:    mov     cx,MemoryBuffer[di].FileEndAdr
 1237	                mov     dx,MemoryBuffer[di].FileBegAdr
 1238	                sub     cx,dx
 1239	                mov     ax,Apple
 1240	                mov     ds,ax
 1241	                mov     ah,40h
 1242	                inc     cx
 1243	                jnz     WF_NoLong
 1244	                inc     cl
 1245	                mov     ah,40h
 1246	                int     21h
 1247	                jc      WF_Error
 1248	                mov     cx,0FFFFh
 1249	                inc     dx
 1250	WF_NoLong:      mov     ah,40h
 1251	                int     21h
 1252	                jc      WF_Error
 1253	                cmp     ax,cx
 1254	                jne     WF_Error
 1255	                mov     ax,cs:WF_MesPtr
 1256	                mov     cs:GetKeyParams.RK_ErrPtr,ax
 1257	                mov     cs:S_EnterErrorFL,0
 1258	WF_Ret:         mov     ah,3Eh
 1259	                int     21h
 1260	                call    SOD4eraperP
 1261	                call    UnLinkName
 1262	                pop     ds dx cx bx ax
 1263	                ret
 1264	WF_Error:       mov     ax,cs:WF_ErrPtr
 1265	                mov     cs:GetKeyParams.RK_ErrPtr,ax
 1266	                mov     cs:S_EnterErrorFL,1
 1267	                jmp     WF_Ret
 1268	
 1269	
 1270	
 1271	; -- Read Directory ------------------
 1272	
 1273	RD_GetDirs?     db      1
 1274	Path            db      '.\',66 dup (0)                  ; Current Path
 1275	Filter          db      '*.APL,*.ROM,*.SVD',020h dup (0) ; Scan Filter
 1276	PathFilter      db      68+20h dup (0)                   ; Path&Filter
 1277	WildCard        db      0Dh dup (0)                      ; Temp
 1278	WC_AnyFile      db      '*.*',0                          ; For SubDirs scanning
 1279	
 1280	BufPtr          dw      0
 1281	RD_0OfsSvd      dw      0
 1282	DTA             DTA_S   <0,0,0,0,0,0>
 1283	
 1284	ReadDirectory   proc    near
 1285	                push    ax bx cx dx si di es
 1286	                call    Prepare4DOS
 1287	                mov     si,offset Path
 1288	                mov     di,si
 1289	                push    ds
 1290	                pop     es
 1291	                mov     ah,60h
 1292	                int     21h
 1293	                mov     dx,offset DTA
 1294	                mov     ah,1Ah
 1295	                int     21h
 1296	
 1297	                xor     bx,bx
 1298	RD_SearchFor0:  cmp     Path[bx],0
 1299	                jz      RD_0Found
 1300	                inc     bx
 1301	                jmp     RD_SearchFor0
 1302	RD_0Found:      or      bx,bx
 1303	                jz      RD_PathOK
 1304	                cmp     Path[bx-1],'\'
 1305	                je      RD_PathOK
 1306	                mov     Path[bx],'\'
 1307	                inc     bx
 1308	                mov     Path[bx],0
 1309	RD_PathOK:      xor     si,si
 1310	                mov     RD_0OfsSvd,bx
 1311	
 1312	                cmp     RD_GetDirs?,0
 1313	                jz      RD_GetFiles
 1314	
 1315	RD_CopyWC1:     mov     al,WC_AnyFile[si]
 1316	                mov     Path[bx],al
 1317	                inc     si
 1318	                inc     bx
 1319	                cmp     al,0
 1320	                jnz     RD_CopyWC1
 1321	                mov     bx,BufPtr
 1322	                mov     dx,offset Path
 1323	                mov     cx,FA_DIRECTORY
 1324	                FindFirst
 1325	                jc      RD_GetFiles
 1326	RD_GetDirLoop:  test    DTA.Attributes,FA_DIRECTORY
 1327			jz      RD_GD_Next
 1328	                cmp     F_MaxLength,0FFh
 1329	                je      RD_NoMoreFiles
 1330	                call    RD_PutFile
 1331	                inc     F_MaxLength
 1332	                add     bx,size FileDescription
 1333	RD_GD_Next:     FindNext
 1334	                jnc     RD_GetDirLoop
 1335	                mov     BufPtr,bx
 1336	
 1337	RD_GetFiles:    mov     bx,RD_0OfsSvd
 1338			xor     si,si
 1339	RD_CopyWC2:     mov     al,WildCard[si]
 1340	                mov     Path[bx],al
 1341	                inc     si
 1342	                inc     bx
 1343	                cmp     al,0
 1344	                jnz     RD_CopyWC2
 1345	                mov     bx,BufPtr
 1346	                mov     dx,offset Path
 1347	                mov     cx,FA_ARCHIVE
 1348	                FindFirst
 1349	                jc      RD_NoMoreFiles
 1350	RD_GetFilesLoop: cmp    F_MaxLength,0FFh
 1351	                je      RD_NoMoreFiles
 1352	                call    RD_PutFile
 1353	                inc     F_MaxLength
 1354	                add     bx,size FileDescription
 1355	                FindNext
 1356			jnc     RD_GetFilesLoop
 1357	
 1358	RD_NoMoreFiles: mov     si,RD_0OfsSvd
 1359	                mov     byte ptr Path[si],0
 1360	                mov     BufPtr,bx
 1361	                call    SOD4eraperP
 1362	                pop     es di si dx cx bx ax
 1363	                ret
 1364	ReadDirectory   endp
 1365	
 1366	
 1367	
 1368	PF_FileExts     db      'FRGAPLROMSVD'
 1369	PF_FileTypes    db      FD_MSdos,FD_Code,FD_Code,FD_Status
 1370	PF_Addr         dw      PF_Directory,PF_Code,PF_Status,PF_MSdos
 1371	PF_NameLength   dw      ?
 1372	RD_PutFile      proc    near
 1373	                push    ax cx dx si di bp es
 1374	                xor     si,si
 1375	PF_GetNameLoop: mov     al,DTA.FileSpec[si]
 1376	                mov     FileBuffer[bx].FileName[si],al
 1377	                inc     si
 1378	                or      al,al
 1379	                jnz     PF_GetNameLoop
 1380	                mov     PF_NameLength,si
 1381	
 1382	                or      bx,bx
 1383			jz      PF_Cont1
 1384	                xor     bp,bp
 1385	PF_Cmp0:        xor     di,di
 1386	PF_Cmp1:        mov     al,ds:FileBuffer[bp].FileName[di]
 1387	                cmp     al,FileBuffer[bx].FileName[di]
 1388	                jne     PF_NotMatch
 1389	                inc     di
 1390	                or      al,al
 1391	                jnz     PF_Cmp1
 1392	PF_Error:       sub     bx,size FileDescription
 1393	                dec     F_MaxLength
 1394			jmp     PF_Ret
 1395	PF_NotMatch:    add     bp,size FileDescription
 1396	                cmp     bp,bx
 1397			jne     PF_Cmp0
 1398	
 1399	PF_Cont1:       mov     FileBuffer[bx].FileFlags,0
 1400	                test    DTA.Attributes,FA_DIRECTORY
 1401	                jz      PF_NotDir
 1402	                mov     FileBuffer[bx].FileType,FD_DIRECTORY
 1403	                jmp     PF_Ret
 1404	
 1405	PF_NotDir:      mov     ax,word ptr DTA.FileSize
 1406	                cmp     word ptr DTA.FileSize[2],0
 1407	                jz      PF_NotBig
 1408	                mov     ax,0FFFFh
 1409	PF_NotBig:      mov     FileBuffer[bx].FileLength,ax
 1410	                push    cs
 1411	                pop     es
 1412	                cld
 1413	                lea     di,FileBuffer[bx].FileName
 1414	                inc     di
 1415	                mov     al,'.'
 1416	                mov     cx,PF_NameLength
 1417	        repne   scasb
 1418	                xor     dl,dl
 1419	                jcxz    PF_PokeType
 1420	                mov     bp,di
 1421	                mov     si,offset PF_FileExts
 1422	                mov     dh,4
 1423	PF_CmpExtLoop:  mov     di,bp
 1424	                mov     cx,3
 1425	        repe    cmpsb
 1426	                je      PF_PokeType
 1427	PF_3:           inc     si
 1428			loop    PF_3
 1429	                inc     dl
 1430	                dec     dh
 1431	                jnz     PF_CmpExtLoop
 1432	                xor     dl,dl
 1433	PF_PokeType:    xor     dh,dh
 1434	                mov     di,dx
 1435	                xor     ax,ax
 1436	                mov     al,PF_FileTypes[di]
 1437	                mov     FileBuffer[bx].FileType,al
 1438	                mov     di,ax
 1439	                mov     si,bx
 1440	                mov     bp,offset DirectoryParams
 1441	                call    LinkName
 1442	                mov     dx,offset Path
 1443	                mov     ax,3D00h
 1444	                int     21h
 1445	                call    UnLinkName
 1446	                jc      PF_Ret1
 1447	                lea     dx,FileBuffer[si].File1st4bytes
 1448	                mov     cx,4
 1449	                mov     bx,ax
 1450	                mov     ah,3Fh
 1451	                int     21h
 1452	                mov     ah,3Eh
 1453	                int     21h
 1454	                shl     di,1
 1455	                call    PF_Addr[di]
 1456	PF_Ret1:        mov     bx,si
 1457	PF_Ret:         pop     es bp di si dx cx ax
 1458	                ret
 1459	RD_PutFile      endp
 1460	
 1461	PF_Directory:   mov     FileBuffer[si].FileFlags,0
 1462	                ret
 1463	
 1464	PF_Code:        mov     FileBuffer[si].FileFlags,FF_SHOWADDR? or FF_MODIFYADDR? or FF_MODIFYTYPE?
 1465	                mov     ax,word ptr FileBuffer[si].File1st4bytes
 1466	                mov     FileBuffer[si].FileBegAdr,ax
 1467	                mov     ax,word ptr FileBuffer[si].File1st4bytes[2]
 1468	                add     ax,FileBuffer[si].FileBegAdr
 1469	                jnc     PF_Code_ok
 1470	                xor     ax,ax
 1471	PF_Code_ok:     dec     ax
 1472	                mov     FileBuffer[si].FileEndAdr,ax
 1473	                ret
 1474	
 1475	PF_Status:      mov     FileBuffer[si].FileFlags,FF_MODIFYTYPE?
 1476	                xor     ax,ax
 1477	                mov     FileBuffer[si].FileBegAdr,ax
 1478	                dec     ax
 1479	                mov     FileBuffer[si].FileEndAdr,ax
 1480	                ret
 1481	
 1482	PF_MSdos:       mov     FileBuffer[si].FileFlags,FF_SHOWADDR? or FF_MODIFYADDR? or FF_MODIFYTYPE?
 1483	                mov     FileBuffer[si].FileBegAdr,800h
 1484	                mov     ax,FileBuffer[si].FileLength
 1485	                add     ax,800h
 1486	                jnc     PF_MSdos_ok
 1487	                xor     ax,ax
 1488	PF_MSdos_ok:    dec     ax
 1489	                mov     FileBuffer[si].FileEndAdr,ax
 1490	                ret
 1491	
 1492	
 1493	
 1494	ReadDir         proc    near
 1495	                push    ax si di
 1496	                mov     GetKeyParams.RK_ErrPtr,offset SMS_ReadDir
 1497			xor     ax,ax
 1498	                mov     F_MaxLength,al
 1499	                mov     BufPtr,ax
 1500	                mov     F_BegPrint,al
 1501	                mov     F_Pos,al
 1502	                mov     F_CX,72Ah
 1503	                mov     RD_GetDirs?,1
 1504	                xor     si,si
 1505	RD1_Loop0:      xor     di,di
 1506	RD1_Cloop:      mov     al,Filter[si]
 1507	                or      al,al
 1508	                jz      RD1_CallRead
 1509	                cmp     al,','
 1510	                je      RD1_CallRead
 1511	                mov     WildCard[di],al
 1512	                inc     si
 1513	                inc     di
 1514	                cmp     di,0Ch
 1515	                jb      RD1_Cloop
 1516	RD1_CallRead:   mov     byte ptr WildCard[di],0
 1517	                call    ReadDirectory
 1518	                mov     RD_GetDirs?,0
 1519	                cmp     byte ptr Filter[si],0
 1520	                jz      RD1_Done
 1521	RD1_Ignore:     inc     si
 1522	                cmp     byte ptr Filter[si],','
 1523			je      RD1_Ignore
 1524	                jmp     RD1_Loop0
 1525	RD1_Done:       mov     GetKeyParams.RK_ErrPtr,0
 1526	                pop     di si ax
 1527	                call    LinkPathFilter
 1528	                ret
 1529	ReadDir         endp
 1530	
 1531	
 1532	LN_BX           dw      ?
 1533	LinkName:       pushf
 1534	                push    ax bx si di
 1535	                mov     si,bx
 1536	                lea     si,ds:[bp].S_Buffer[si]
 1537	                mov     di,cs:RD_0OfsSvd
 1538	                xor     bx,bx
 1539	LN_Loop:        mov     al,cs:[si].FileName[bx]
 1540	                mov     cs:Path[di][bx],al
 1541	                inc     bx
 1542	                or      al,al
 1543	                jnz     LN_Loop
 1544	                dec     bx
 1545	                add     bx,di
 1546	                mov     cs:LN_BX,bx
 1547	                pop     di si bx ax
 1548	                popf
 1549	                ret
 1550	
 1551	
 1552	
 1553	UnLinkName:     pushf
 1554	                push    bx
 1555	                mov     bx,cs:RD_0OfsSvd
 1556	                mov     cs:Path[bx],0
 1557	                pop     bx
 1558	                popf
 1559	                ret
 1560	
 1561	
 1562	
 1563	Upcase:         cmp     al,'A'
 1564	                jb      UPCSret
 1565	                cmp     al,'Z'
 1566	                ja      UPCSret
 1567	                or      al,20h
 1568	UPCSret:        ret
 1569	
 1570	
 1571	
 1572	CalcBuffer:     push    ax
 1573	                mov     al,size FileDescription
 1574	                mul     bl
 1575	                mov     di,ax
 1576	                pop     ax
 1577	                ret
 1578	
 1579	
 1580	CalcCommand:    push    ax bx cx es             ; Returns number of a command
 1581	                push    cs                      ; Input:
 1582	                pop     es                      ;   di -> offset Commands
 1583	                call    Upcase                  ;   al -> search command
 1584	                cld                             ;   cx -> commands count
 1585	                mov     bx,di
 1586	                repne   scasb                   ; Output:
 1587	                stc                             ;   di <- Number of the command
 1588	                jne     CC_end                  ;   cf <- 1 if not found
 1589	                sub     di,bx
 1590	                dec     di
 1591	                clc
 1592	CC_end:         pop     es cx bx ax
 1593	                ret
 1594	
 1595	
 1596	
 1597	; -- Hook INT 24h ----------------------
 1598	
 1599	DOSflag         db      0
 1600	OldFlags        dw      0
 1601	Prepare4DOS:    saveall
 1602	                pushf
 1603	                xor     ax,ax
 1604	                mov     cs:SHL_Flag,al
 1605	                xchg    ax,cs:ActiveFlags
 1606	                mov     cs:OldFlags,ax
 1607	                mov     cs:DOSflag,1
 1608	                call    ShowAll
 1609	                ScreenIOservice _SHOWSCREEN
 1610	                call    far ptr SystemTINI
 1611	                popf
 1612	                restoreall
 1613	                ret
 1614	
 1615	
 1616	
 1617	; -- Unhook INT 24h --------------------
 1618	
 1619	SOD4eraperP:    saveall
 1620	                pushf
 1621	                mov     ax,cs:OldFlags
 1622	                mov     cs:ActiveFlags,ax
 1623	                mov     cs:SHL_Flag,1
 1624	                mov     ax,Emulate
 1625	                mov     es,ax
 1626	                mov     byte ptr [C000],0
 1627	                call    far ptr SystemINIT
 1628	                mov     cs:DOSflag,0
 1629	                popf
 1630	                restoreall
 1631	                ret
 1632	
 1633	
 1634	; *******************************************************************
 1635	; **                                                               **
 1636	; **                                                               **
 1637	; **                        S H O W    A L L                       **
 1638	; **                                                               **
 1639	; **                                                               **
 1640	; *******************************************************************
 1641	
 1642	ActiveFlags     dw      0
 1643	ShowAll         proc    far
 1644	                push    ds bp
 1645	                push    word ptr [ScreenIOparams.CursorColor]
 1646	                push    word ptr [ScreenIOparams.CursorLen]
 1647	                push    word ptr [ScreenIOparams.CursorFlag]
 1648	                push    cs
 1649	                pop     ds
 1650	                mov     ScreenIOparams.CursorLen,14 ;35
 1651	                mov     ScreenIOparams.CursorColor,10h
 1652	                mov     ScreenIOparams.CursorFlag,1
 1653	                call    InitFlags
 1654	                call    ShowPathFilter
 1655	                call    ShowDirectory
 1656	                call    ShowMemory
 1657	                call    ShowFuncKeys
 1658	                ScreenIOservice _SHOWLINE
 1659	                call    ShowTitle
 1660	                call    ShowMessage
 1661	                call    ShowHilights
 1662	                call    ShowConfirm
 1663	                call    ShowConfirm1
 1664	                pop     word ptr [ScreenIOparams.CursorFlag]
 1665	                pop     word ptr [ScreenIOparams.CursorLen]
 1666	                pop     word ptr [ScreenIOparams.CursorColor]
 1667	                pop     bp ds
 1668	                ret
 1669	ShowAll         endp
 1670	
 1671	
 1672	; -- Draw box --------------------------
 1673	; Entry:
 1674	;  AH  = Active Flag Bit
 1675	;  CX  = HTAB & VTAB
 1676	;  BX  = Offset of the strings
 1677	;  DL  = Length of the box line - 1
 1678	;  DH  = Number of lines - 1
 1679	; Destroy:
 1680	;  AX,BX,CX,DX
 1681	DB_CX           dw      ?
 1682	DrawBox:        push    ax
 1683	                mov     ax,cx
 1684	                add     ax,80 * 2
 1685	                mov     cs:DB_CX,ax
 1686	                pop     ax
 1687	                test    ActiveFlags,ax
 1688	                mov     ah,7
 1689	                jz      DB_ok1
 1690	                mov     ah,0Eh
 1691	DB_ok1:         ScreenIOservice _STRINGPRINT
 1692	                mov     bx,ScreenIOparams.SP_bx
 1693	                dec     dh
 1694	                mov     al,dh
 1695	                mov     dx,cs:DB_CX
 1696	DB_Loop1:       mov     cx,dx
 1697	                add     dx,80 * 2
 1698	                ScreenIOservice _STRINGPRINT
 1699	                dec     al
 1700	                jnz     DB_Loop1
 1701	                mov     cx,dx
 1702	                mov     bx,ScreenIOparams.SP_bx
 1703	                ScreenIOservice _STRINGPRINT
 1704	                ret
 1705	
 1706	
 1707	
 1708	IF_Procs        dw      IFP_F1,IFP_F2,IFP_F3,IFP_F4,IFP_F5
 1709	                dw      IFP_F6,IFP_F7,IFP_F8,IFP_F9,IFP_F0
 1710	InitFlags:      push    ax bx si di bp
 1711	                xor     bx,bx
 1712	                mov     bl,F_or_M
 1713	                shl     bx,1
 1714	                mov     bp,S_Parameters[bx]
 1715	                mov     bl,ds:[bp].S_Pos
 1716	                call    CalcBuffer
 1717	                xor     si,si
 1718	                cmp     DOSflag,0
 1719	                mov     FkeysFlags,0000000000b
 1720	                jnz     IF_Ret
 1721	                cmp     SHL_Flag,0
 1722	                mov     FkeysFlags,0000000010b
 1723	                jz      IF_Ret
 1724	IF_Loop:        call    IF_Procs[si]
 1725	                add     si,2
 1726	                cmp     si,20
 1727	                jb      IF_Loop
 1728	                cmp     ActiveFlags,0
 1729	                jnz     IF_Ret
 1730	                mov     FkeysFlags,0
 1731	IF_Ret:         pop     bp di si bx ax
 1732	                ret
 1733	
 1734	IFP1_fl         dw      0000000000b,0000000001b,0000000001b,0000000001b
 1735	IFP_F1:         cmp     ds:[bp].S_MaxLength,0
 1736	                jz      IFP1_Ret
 1737	                xor     bx,bx
 1738	                mov     bl,ds:[bp].S_Buffer[di].FileType
 1739	                shl     bx,1
 1740	                mov     ax,IFP1_fl[bx]
 1741	                or      FkeysFlags,ax
 1742	IFP1_Ret:
 1743	
 1744	IFP_F2:         or      FkeysFlags,0000000010b
 1745	                ret
 1746	
 1747	IFP3_fl         dw      0000000000b,0000000100b,0000000100b,0000000100b
 1748	IFP_F3:         push    di
 1749	                cmp     F_MaxLength,0
 1750	                jz      IFP3_Ret
 1751	                mov     bl,F_Pos
 1752	                call    CalcBuffer
 1753	                xor     bx,bx
 1754	                mov     bl,FileBuffer[di].FileType
 1755	                shl     bx,1
 1756	                mov     ax,IFP3_fl[bx]
 1757	                or      FkeysFlags,ax
 1758	IFP3_Ret:       pop     di
 1759	                ret
 1760	
 1761	IFP4_fl         dw      0000000000b,0000001000b,0000001000b,0000001000b
 1762	IFP_F4:         push    di
 1763	                mov     bl,M_Pos
 1764	                call    CalcBuffer
 1765	                xor     bx,bx
 1766	                mov     bl,MemoryBuffer[di].FileType
 1767	                shl     bx,1
 1768	                mov     ax,IFP4_fl[bx]
 1769	                or      FkeysFlags,ax
 1770	                pop     di
 1771	                ret
 1772	
 1773	IFP_F5:         push    di
 1774	                cmp     F_or_M,0
 1775	                jz      IFP5_Ret
 1776	                cmp     ds:[bp].S_MaxLength,1
 1777	                jbe     IFP5_Ret
 1778	                mov     bl,M_Pos
 1779	                call    CalcBuffer
 1780	                cmp     MemoryBuffer[di].FileName[0],1
 1781	                je      IFP5_Ret
 1782	                or      FkeysFlags,0000010000b
 1783	IFP5_Ret:       pop     di
 1784	                ret
 1785	
 1786	IFP_F6:
 1787	IFP_F7:
 1788	IFP_F8:
 1789	IFP_F9:         ret
 1790	
 1791	IFP_F0:         or      FkeysFlags,1100000000b
 1792	                test    ActiveFlags,1
 1793	                jz      IFP0_Ret
 1794	                mov     FkeysFlags,0000000010b
 1795	IFP0_Ret:       ret
 1796	
 1797	
 1798	ST_Str          db      '                              APPLER FILE MANAGER                              ',1,7,' ',0
 1799	ShowTitle:      push    ax bx cx
 1800	                gotoxy  1,0
 1801	                mov     ah,2Fh
 1802	                mov     bx,offset ST_Str
 1803	                ScreenIOservice _STRINGPRINT
 1804	                gotoxy  2,0
 1805	                xor     ah,ah
 1806	                ScreenIOservice _STRINGPRINT
 1807	                pop     cx bx ax
 1808	                ret
 1809	
 1810	
 1811	comment         %
 1812	                push    ax dx ds
 1813	                mov     ax,2a1h
 1814	                mov     ds,ax
 1815	                mov     dx,24h
 1816	                mov     ax,2509h
 1817	                int     21h
 1818	                pop     ds dx ax
 1819	                int     3
 1820	                %
 1821	
 1822	SP_Str          db      'ÚPath&FilterÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ',0
 1823	                db      '³                                     ³ ',0
 1824	                db      'ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ',0
 1825	ShowPathFilter: push    ax bx cx dx
 1826	                gotoxy  3,0
 1827	                mov     bx,offset SP_Str
 1828	                mov     dh,3
 1829	                mov     ax,0000000000000001b
 1830	                call    DrawBox
 1831	                mov     bx,35
 1832	                xor     al,al
 1833	                xchg    PathFilter[bx],al
 1834	                mov     bx,offset PathFilter
 1835	                mov     ah,0Bh
 1836	                gotoxy  5,2
 1837	                ScreenIOservice _StringPrint
 1838	                mov     bx,35
 1839	                xchg    PathFilter[bx],al
 1840	                pop     dx cx bx ax
 1841	                ret
 1842	
 1843	
 1844	SD_Str          db      'ÚDirectoryÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ',0
 1845	                db      '³                                     ³ ',0
 1846	                db      'ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ',0
 1847	
 1848	SD_AntetAddr    dw      SD_Antet1,SD_Antet1,SD_Antet1,SD_Antet1
 1849	                dw      SD_Antet3,SD_Antet1,SD_Antet4,SD_Antet1
 1850	                dw      SD_Antet2,SD_Antet1,SD_Antet2,SD_Antet1
 1851	                dw      SD_Antet3,SD_Antet1,SD_Antet3,SD_Antet1
 1852	                dw      SD_Antet5,SD_Antet1,SD_Antet5,SD_Antet1
 1853	                dw      SD_Antet7,SD_Antet1,SD_Antet8,SD_Antet1
 1854	                dw      SD_Antet6,SD_Antet1,SD_Antet6,SD_Antet1
 1855	                dw      SD_Antet7,SD_Antet1,SD_Antet7,SD_Antet1
 1856	
 1857	SD_Antet1       db      1,07h,'N',    'ame          ',      'T',    'ype    ',      'B',    'egin  ',      'E',    'nd',0
 1858	SD_Antet2       db      1,07h,'N',    'ame          ',1,0Fh,'T',1,7,'ype    ',      'B',    'egin  ',      'E',    'nd',0
 1859	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
 1860	SD_Antet4       db      1,07h,'N',    'ame          ',      'T',    'ype    ',1,0Fh,'B',1,7,'egin  ',1,0Fh,'E',1,7,'nd',0
 1861	SD_Antet5       db      1,0Fh,'N',1,7,'ame          ',      'T',    'ype    ',      'B',    'egin  ',      'E',    'nd',0
 1862	SD_Antet6       db      1,0Fh,'N',1,7,'ame          ',1,0Fh,'T',1,7,'ype    ',      'B',    'egin  ',      'E',    'nd',0
 1863	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
 1864	SD_Antet8       db      1,0Fh,'N',1,7,'ame          ',      'T',    'ype    ',1,0Fh,'B',1,7,'egin  ',1,0Fh,'E',1,7,'nd',0
 1865	
 1866	SD_Antet0       db      1,7,'ÄÄÄÄÄÄÄÄÄÄÄÄ  ÄÄÄÄÄÄ  ÄÄÄÄÄ  ÄÄÄÄ',0
 1867	
 1868	SD_NotFndMsg    db      1,7,'No Matching Files in Directory',0
 1869	
 1870	ShowDirectory:  push    ax bx cx dx di
 1871	                gotoxy  3,40
 1872	                mov     bx,offset SD_Str
 1873	                mov     dh,21
 1874	                mov     ax,0000000000000100b
 1875	                call    DrawBox
 1876	                cmp     F_MaxLength,0
 1877	                jnz     SD_ok2
 1878	                gotoxy  5,2Bh
 1879	                mov     bx,offset SD_NotFndMsg
 1880	                ScreenIOservice _STRINGPRINT
 1881	                jmp     SD_Ret
 1882	SD_ok2:         mov     bl,F_Pos
 1883	                call    CalcBuffer
 1884	                xor     bx,bx
 1885	                mov     bl,FileBuffer[di].FileFlags
 1886	                shl     bx,1
 1887	                mov     bx,SD_AntetAddr[bx]
 1888	                cmp     SHL_Flag,0
 1889	                jz      SD_ok25
 1890	                test    ActiveFlags,0000000000000100b
 1891	                jnz     SD_ok3
 1892	SD_ok25:        mov     bx,offset SD_Antet1
 1893	SD_ok3:         gotoxy  5,2Bh
 1894	                ScreenIOservice _STRINGPRINT
 1895	                mov     bx,offset SD_Antet0
 1896	                gotoxy  6,2Bh
 1897	                ScreenIOservice _STRINGPRINT
 1898	                mov     bl,F_BegPrint
 1899	                mov     dx,17
 1900	                mov     di,offset FileBuffer
 1901	                gotoxy  7,43
 1902	                mov     ah,7
 1903	SD_Loop0:       call    OneFile
 1904	                add     cx,80 * 2
 1905	                inc     bl
 1906	                cmp     bl,F_MaxLength
 1907	                je      SD_Ret0
 1908	                dec     dx
 1909	                jnz     SD_Loop0
 1910	SD_Ret0:        mov     cx,F_CX
 1911	                ScreenIOservice _SHOWCURSOR
 1912	SD_Ret:         pop     di dx cx bx ax
 1913	                ret
 1914	
 1915	SM_Str          db      'ÚMemoryÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ',0
 1916	                db      '³                                     ³ ',0
 1917	                db      'ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ',0
 1918	ShowMemory:     push    ax bx cx dx di
 1919	                gotoxy  7,0
 1920	                mov     bx,offset SM_Str
 1921	                mov     dh,16
 1922	                mov     ax,0000000000001000b
 1923	                call    DrawBox
 1924	                mov     bl,M_Pos
 1925	                call    CalcBuffer
 1926	                xor     bx,bx
 1927	                mov     bl,MemoryBuffer[di].FileFlags
 1928	                shl     bx,1
 1929	                mov     bx,SD_AntetAddr[bx]
 1930	                cmp     SHL_Flag,0
 1931	                jz      SM_ok25
 1932	                test    ActiveFlags,0000000000001000b
 1933	                jnz     SM_ok3
 1934	SM_ok25:        mov     bx,offset SD_Antet1
 1935	SM_ok3:         gotoxy  9,3
 1936	                ScreenIOservice _STRINGPRINT
 1937	                mov     bx,offset SD_Antet0
 1938	                gotoxy  10,3
 1939	                ScreenIOservice _STRINGPRINT
 1940	                mov     bl,M_BegPrint
 1941	                mov     dx,12
 1942	                mov     di,offset MemoryBuffer
 1943	                gotoxy  11,3
 1944	                mov     ah,0Bh
 1945	SM_Loop0:       call    OneFile
 1946	                add     cx,80 * 2
 1947	                inc     bl
 1948	                cmp     bl,M_MaxLength
 1949	                jae     SM_Ret0
 1950	                dec     dx
 1951	                jnz     SM_Loop0
 1952	SM_Ret0:        cmp     NameEntering,0
 1953	                jnz     SM_Ret
 1954	                mov     cx,M_CX
 1955	                mov     ScreenIOparams.CursorColor,40h
 1956	                ScreenIOservice _SHOWCURSOR
 1957	SM_Ret:         pop     di dx cx bx ax
 1958	                ret
 1959	
 1960	
 1961	SMS_Clear       db      '                                        ',0
 1962	SMS_ReadDir     db      'Accessing Disk Directory...',0
 1963	SMS_FileLoaded  db      'File loaded',0
 1964	SMS_FileSaved   db      'File saved',0
 1965	SMS_StatLoaded  db      'Status restored',0
 1966	SMS_StatSaved   db      'Status saved',0
 1967	SMS_ErrFileLoad db      1,0Ch,'Error loading file',0
 1968	SMS_ErrFileSave db      1,0Ch,'Error saving file',0
 1969	SMS_ErrStatLoad db      1,0Ch,'Error restoring status',0
 1970	SMS_ErrStatSave db      1,0Ch,'Error saving status',0
 1971	SMS_EnterFilename db    'Enter Filename (<Esc> cancel)',0
 1972	ShowMessage:    push    ax bx cx
 1973	                gotoxy  18h,0
 1974	                mov     bx,offset SMS_Clear
 1975	                mov     ah,0Ah
 1976	                ScreenIOservice _STRINGPRINT
 1977	                cmp     GetKeyParams.RK_ErrPtr,0
 1978	                jz      SMS_Ret
 1979	                gotoxy  18h,1
 1980	                mov     bx,GetKeyParams.RK_ErrPtr
 1981	                ScreenIOservice _STRINGPRINT
 1982	SMS_Ret:        pop     cx bx ax
 1983	                ret
 1984	
 1985	
 1986	
 1987	SFK_Str         db      '1       2       3       4       5       '
 1988	                db      '6       7       8       9      10       ',0
 1989	FkeysFlags      dw      1111111111b
 1990	SFK_FkeysMain   dw      SFK_Run,SFK_Cont,SFK_Load,SFK_Save,SFK_Delete
 1991	                dw      SFK_None,SFK_None,SFK_None,SFK_PathFilter,SFK_Rescan
 1992	SFK_Run         db      1,2Fh,'Run   ',0
 1993	SFK_Cont        db      1,2Fh,'Apple ',0
 1994	SFK_Load        db      1,1Fh,'Load  ',0
 1995	SFK_Save        db      1,4Fh,'Save  ',0
 1996	SFK_Delete      db      1,2Fh,'Delete',0
 1997	SFK_PathFilter  db      1,2Fh,'Path&F',0
 1998	SFK_Rescan      db      1,2Fh,'Rescan',0
 1999	SFK_None        db      1,2Fh,'      ',0
 2000	
 2001	ShowFuncKeys:   push    ax bx cx dx si
 2002	                gotoxy  19h,0
 2003	                mov     bx,offset SFK_Str
 2004	                mov     ah,7
 2005	                ScreenIOservice _STRINGPRINT
 2006	                gotoxy  19h,1
 2007	                xor     si,si
 2008	                mov     dx,FkeysFlags
 2009	SFK_Loop0:      shr     dx,1
 2010	                mov     ah,8
 2011	                jnc     SFK_Next0
 2012	                mov     ah,0Fh
 2013	SFK_Next0:      mov     bx,SFK_FkeysMain[si]
 2014	                and     byte ptr [bx+1],0F0h
 2015	                or      byte ptr [bx+1],ah
 2016	                ScreenIOservice _STRINGPRINT
 2017	                add     cx,4
 2018	                add     si,2
 2019	                cmp     si,20
 2020	                jb      SFK_Loop0
 2021	                pop     si dx cx bx ax
 2022	                ret
 2023	
 2024	SHL_Flag        db      1
 2025	ShowHilights:   cmp     SHL_Flag,0
 2026	                jz      SHL_Ret
 2027	                push    ax cx
 2028	                gotoxy  3,1
 2029	                mov     ax,0E00h+'P'
 2030	                ScreenIOservice _SYMBPRINT
 2031	                gotoxy  3,41
 2032	                mov     al,'D'
 2033	                ScreenIOservice _SYMBPRINT
 2034	                gotoxy  7,1
 2035	                mov     al,'M'
 2036	                ScreenIOservice _SYMBPRINT
 2037	                pop     cx ax
 2038	SHL_Ret:        ret
 2039	
 2040	
 2041	SC_Str          db      'ÚConfirmÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿',0
 2042	                db      '³                                               ³',0
 2043	                db      'ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ',0
 2044	SC_FileMes      db      1,7,'File ',1,0Fh,0
 2045	SC_AlreadyMes   db      1,7,' already exists.',0
 2046	SC_SureMes      db      1,7,'Are you sure you want to overwrite this file?',0
 2047	SC_Flag         db      0
 2048	ShowConfirm:    cmp     SC_Flag,0
 2049	                jz      SC1_Ret
 2050	                push    ax bx cx dx di
 2051	                gotoxy  9,7
 2052	                mov     bx,offset SC_Str
 2053	                mov     dh,6
 2054	                mov     ax,0000000000010000b
 2055	                call    DrawBox
 2056	                gotoxy  11,9
 2057	                mov     bx,offset SC_FileMes
 2058	                ScreenIOservice _STRINGPRINT
 2059	                mov     bl,M_Pos
 2060	                call    CalcBuffer
 2061	                lea     bx,MemoryBuffer[di].FileName
 2062	                mov     ah,0Fh
 2063	                ScreenIOservice _STRINGPRINT
 2064	                mov     bx,offset SC_AlreadyMes
 2065	                ScreenIOservice _STRINGPRINT
 2066	                gotoxy  13,9
 2067	                mov     bx,offset SC_SureMes
 2068	                ScreenIOservice _STRINGPRINT
 2069	                pop     di dx cx bx ax
 2070	SC1_Ret:        ret
 2071	
 2072	
 2073	
 2074	SC1_Str         db      'ÚConfirmÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿',0
 2075	                db      '³                                                   ³',0
 2076	                db      'ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ',0
 2077	SC1_FileMes     db      1,7,'File ',1,0Fh,0
 2078	SC1_OverWritten db      1,7,' is overwritten by another file.',0
 2079	SC1_SureMes     db      1,7,'Are you sure you want to save this file?',0
 2080	SC1_Flag        db      0
 2081	ShowConfirm1:   cmp     SC1_Flag,0
 2082	                jz      SC_Ret
 2083	                push    ax bx cx dx di
 2084	                gotoxy  16,20
 2085	                mov     bx,offset SC1_Str
 2086	                mov     dh,6
 2087	                mov     ax,0000000000010000b
 2088	                call    DrawBox
 2089	                gotoxy  18,22
 2090	                mov     bx,offset SC1_FileMes
 2091	                ScreenIOservice _STRINGPRINT
 2092	                mov     bl,M_Pos
 2093	                call    CalcBuffer
 2094	                lea     bx,MemoryBuffer[di].FileName
 2095	                mov     ah,0Fh
 2096	                ScreenIOservice _STRINGPRINT
 2097	                mov     bx,offset SC1_OverWritten
 2098	                ScreenIOservice _STRINGPRINT
 2099	                gotoxy  20,22
 2100	                mov     bx,offset SC1_SureMes
 2101	                ScreenIOservice _STRINGPRINT
 2102	                pop     di dx cx bx ax
 2103	SC_Ret:         ret
 2104	
 2105	
 2106	
 2107	OF_CX           dw      ?
 2108	OF_Types        dw      OF_Directory,OF_Code,OF_Status,OF_MSdos
 2109	OF_Directory    db      1,7,'<DIR>',0
 2110	OF_Code         db      'DOS3.3',0
 2111	OF_Status       db      'Status',0
 2112	OF_MSdos        db      'MS-DOS',0
 2113	OF_NoAddr       db      1,7,' --     -- ',0
 2114	OF_Base         dw      ?
 2115	OF_Color        db      ?
 2116	OneFile:        push    ax bx cx dx di
 2117	                mov     OF_Base,di
 2118	                mov     OF_CX,cx
 2119	                call    CalcBuffer
 2120	                mov     bp,OF_Base
 2121	                lea     bx,ds:[bp][di].FileName
 2122	                test    ds:[bp][di].FileFlags,FF_DAMAGED?
 2123	                mov     OF_Color,0Bh
 2124	                jz      OF_hop1
 2125	                mov     ah,0Ch
 2126	                mov     OF_Color,ah
 2127	OF_hop1:        ScreenIOservice _STRINGPRINT
 2128	                cmp     byte ptr ds:[bx],1
 2129	                je      OF_Ret
 2130	                mov     cx,OF_CX
 2131	                add     cx,2*14
 2132	                xor     bx,bx
 2133	                mov     bp,OF_Base
 2134	                mov     bl,ds:[bp][di].FileType
 2135	                shl     bx,1
 2136	                mov     bx,OF_Types[bx]
 2137	                mov     ah,OF_Color
 2138	                ScreenIOservice _STRINGPRINT
 2139	                mov     cx,OF_CX
 2140	                add     cx,2*22
 2141	                mov     bx,offset OF_NoAddr
 2142	                ScreenIOservice _STRINGPRINT
 2143	                mov     bp,OF_Base
 2144	                test    ds:[bp][di].FileFlags,FF_SHOWADDR?
 2145	                jz      OF_Ret
 2146	                mov     cx,OF_CX
 2147	                add     cx,2*22
 2148	                mov     ah,OF_Color
 2149	                mov     bp,OF_Base
 2150	                mov     al,byte ptr ds:[bp][di].FileBegAdr[1]
 2151	                ScreenIOservice _BYTEPRINT
 2152	                mov     bp,OF_Base
 2153	                mov     al,byte ptr ds:[bp][di].FileBegAdr[0]
 2154	                ScreenIOservice _BYTEPRINT
 2155	                mov     bp,OF_Base
 2156	                mov     cx,OF_CX
 2157	                add     cx,2*29
 2158	                mov     ah,OF_Color
 2159	                mov     bp,OF_Base
 2160	                mov     al,byte ptr ds:[bp][di].FileEndAdr[1]
 2161	                ScreenIOservice _BYTEPRINT
 2162	                mov     bp,OF_Base
 2163	                mov     al,byte ptr ds:[bp][di].FileEndAdr[0]
 2164	                ScreenIOservice _BYTEPRINT
 2165	OF_Ret:         pop     di dx cx bx ax
 2166	                ret
 2167	
 2168	
 2169	
 2170	
 2171	; *******************************************************************
 2172	; **                                                               **
 2173	; **                                                               **
 2174	; **               K E Y B O A R D   S E R V I C E S               **
 2175	; **                                                               **
 2176	; **                                                               **
 2177	; *******************************************************************
 2178	
 2179	GetLineUser     proc    far
 2180	                ret
 2181	GetLineUser     endp
 2182	
 2183	Alt_Keys        db      'pdm'
 2184	Alt_Procs       dw      Alt_PathFilter,Alt_Directory,Alt_Memory
 2185	Alt_Key         proc    far
 2186	                push    cx si di ds
 2187	                mov     di,offset Alt_Keys
 2188	                mov     cx,offset Alt_Procs- offset Alt_Keys
 2189	                call    CalcCommand
 2190	                jc      Alt_Ret
 2191	                shl     di,1
 2192	                call    cs:Alt_Procs[di]
 2193	                mov     al,7Fh
 2194	Alt_Ret:        pop     ds di si cx
 2195	                ret
 2196	
 2197	Alt_PathFilter  proc    near
 2198	                mov     cs:GoWhere?,G_PATH_FILTER
 2199	                ret
 2200	Alt_PathFilter  endp
 2201	
 2202	Alt_Directory   proc    near
 2203	                mov     cs:GoWhere?,G_DIRECTORY
 2204	                ret
 2205	Alt_Directory   endp
 2206	
 2207	Alt_Memory      proc    near
 2208	                mov     cs:GoWhere?,G_MEMORY
 2209	                ret
 2210	Alt_Memory      endp
 2211	
 2212	Alt_Key         endp
 2213	
 2214	
 2215	
 2216	FkeysMasks      dw      1b,10b,100b,1000b,10000b,100000b,1000000b,10000000b,100000000b,1000000000b
 2217	Fkeys_Main      dw      Fkey_Run,Fkey_Cont,Fkey_Load,Fkey_Save,Fkey_Delete
 2218	                dw      ?,?,?,Fkey_PathFilter,Fkey_Rescan
 2219	Fkey            proc    far
 2220	                push    ax bx cx dx si di bp ds es
 2221	                push    cs
 2222	                pop     ds
 2223	                push    word ptr ds:[ScreenIOparams.CursorLen]
 2224	                push    word ptr ds:[ScreenIOparams.CursorFlag]
 2225	                push    ds:[GetLineParams.GL_Buffer]
 2226	                push    ds:[GetLineParams.GL_CX]
 2227	                push    [ActiveFlags]
 2228	                push    [FkeysFlags]
 2229	                xor     bx,bx
 2230	                mov     bl,al
 2231	                shl     bx,1
 2232	                mov     si,bx
 2233	                mov     ax,FkeysMasks[si]
 2234	                test    FkeysFlags,ax
 2235	                jz      Fkey_Ret
 2236	                xor     bx,bx
 2237	                mov     bl,F_or_M
 2238	                shl     bx,1
 2239	                mov     bp,S_Parameters[bx]
 2240	                call    Fkeys_Main[si]
 2241	                xor     bx,bx
 2242	                mov     bl,F_or_M
 2243	                shl     bx,1
 2244	                mov     bp,S_Parameters[bx]
 2245	                mov     cx,ds:[bp].S_CX
 2246	Fkey_Ret:       pop     [FkeysFlags]
 2247	                pop     [ActiveFlags]
 2248	                pop     ds:[GetLineParams.GL_CX]
 2249	                pop     ds:[GetLineParams.GL_Buffer]
 2250	                pop     word ptr ds:[ScreenIOparams.CursorFlag]
 2251	                pop     word ptr ds:[ScreenIOparams.CursorLen]
 2252	                pop     es ds bp di si dx cx bx ax
 2253	                ret
 2254	Fkey            endp
 2255	
 2256	FU_Procs        dw      FU_Dir,FU_Code,FU_Status,FU_MSDos
 2257	Fkey_Update:    push    ax bx di
 2258	                mov     bl,ds:[bp].S_Pos
 2259	                call    CalcBuffer
 2260	                test    ds:[bp].S_Buffer[di].FileFlags,FF_DAMAGED?
 2261	                jnz     FU_Ret
 2262	                test    ds:[bp].S_Buffer[di].FileFlags,FF_MODIFYADDR?
 2263	                jz      FU_Ret
 2264	                xor     bx,bx
 2265	                mov     bl,ds:[bp].S_Buffer[di].FileType
 2266	                shl     bx,1
 2267	                call    FU_Procs[bx]
 2268	FU_Ret:         pop     di bx ax
 2269	                ret
 2270	
 2271	FU_Dir:         ret
 2272	
 2273	FU_Code:        mov     ax,word ptr ds:[bp].S_Buffer[di].File1st4bytes
 2274	                mov     ds:[bp].S_Buffer[di].FileBegAdr,ax
 2275	                mov     ax,word ptr ds:[bp].S_Buffer[di].File1st4bytes[2]
 2276	                add     ax,ds:[bp].S_Buffer[di].FileBegAdr
 2277	                jnc     FU_Code_ok
 2278	                xor     ax,ax
 2279	FU_Code_ok:     dec     ax
 2280	                mov     ds:[bp].S_Buffer[di].FileEndAdr,ax
 2281	                ret
 2282	
 2283	FU_Status:      xor     ax,ax
 2284	                mov     ds:[bp].S_Buffer[di].FileBegAdr,ax
 2285	                dec     ax
 2286	                mov     ds:[bp].S_Buffer[di].FileEndAdr,ax
 2287	                ret
 2288	
 2289	FU_MSdos:       mov     ds:[bp].S_Buffer[di].FileBegAdr,800h
 2290	                mov     ax,ds:[bp].S_Buffer[di].FileLength
 2291	                add     ax,800h
 2292	                jnc     FU_MSdos_ok
 2293	                xor     ax,ax
 2294	FU_MSdos_ok:    dec     ax
 2295	                mov     ds:[bp].S_Buffer[di].FileEndAdr,ax
 2296	                ret
 2297	
 2298	Fkey_RunProcs   dw      FRP_Run,FRP_Go
 2299	Fkey_Run:       mov     si,bx
 2300	                mov     bl,ds:[bp].S_Pos
 2301	                call    CalcBuffer
 2302	                cmp     ds:[bp].S_Buffer[di].FileType,FD_Code
 2303	                jb      Fkey_RunRet
 2304	                mov     bx,ds:[bp].S_Buffer[di].FileBegAdr
 2305	                call    Fkey_RunProcs[si]
 2306	Fkey_RunRet:    ret
 2307	
 2308	FRP_RunProgram  db      0A9h,20h,0A9h,0,0A9h,3,0A9h,3Ch,4Ch
 2309	FRP_RunAddress  dw      ?
 2310	FRP_Procs       dw      FRPP_Directory,FRPP_Code,FRPP_Status,FRPP_MSdos
 2311	FRP_Run:        call    ResetAppleII
 2312	                mov     bp,offset DirectoryParams
 2313	                call    S_Enter
 2314	                cmp     S_EnterErrorFL,0
 2315	                jnz     FRP_RunRet
 2316	                push    bx
 2317	                mov     bl,M_MaxLength
 2318	                sub     bl,2
 2319	                call    CalcBuffer
 2320	                pop     bx
 2321	                xor     ax,ax
 2322	                mov     al,MemoryBuffer[di].FileType
 2323	                mov     di,ax
 2324	                shl     di,1
 2325	                call    FRP_Procs[di]
 2326	                call    GoAppleII
 2327	FRP_RunRet:     ret
 2328	
 2329	FRPP_MSdos:
 2330	FRPP_Code:      push    es
 2331	                mov     ax,Apple
 2332	                mov     es,ax
 2333	                assume  es:Apple
 2334	                mov     GetKeyParams.RK_ErrPtr,0
 2335	                mov     FRP_RunAddress,bx
 2336	                mov     di,0C700h
 2337	                mov     si,offset FRP_RunProgram
 2338	                mov     cx,11
 2339	                cld
 2340	                rep     movsb
 2341	                pop     es
 2342	                ret
 2343	                assume  es:Emulate
 2344	
 2345	FRPP_Damaged:
 2346	FRPP_Directory:
 2347	FRPP_Status:    ret
 2348	
 2349	
 2350	FRP_Go:         push    ds
 2351	                cmp     ds:[bp].S_Buffer[di].FileType,FD_Status
 2352	                je      FRPG_NoBegAdr
 2353	                mov     ax,TaskControl
 2354	                mov     ds,ax
 2355	                assume  ds:TaskControl
 2356	                mov     ds:r_PC,bx
 2357	FRPG_NoBegAdr:  pop     ds
 2358	                assume  ds:FM
 2359	                call    GoAppleII
 2360	                ret
 2361	
 2362	
 2363	
 2364	Fkey_Cont:      call    GoAppleII
 2365	                ret
 2366	
 2367	Fkey_Load:      mov     bp,offset DirectoryParams
 2368	                call    S_EnterF
 2369	                ret
 2370	
 2371	Fkey_Save:      push    word ptr F_or_M
 2372	                mov     F_or_M,1
 2373	                mov     bp,offset MemoryParams
 2374	                call    S_EnterM
 2375	                pop     word ptr F_or_M
 2376	                ret
 2377	
 2378	Fkey_Delete:    mov     bl,ds:[bp].S_Pos
 2379	                call    Delete
 2380	                ret
 2381	
 2382	Fkey_PathFilter: call   S_PathFilter
 2383	                ret
 2384	
 2385	Fkey_Rescan:    call    ReadDir
 2386	                ret
 2387	
 2388	
 2389	RA_FictiveName  db      'ESD$$$$$.$$$',0
 2390	ResetAppleII    proc    far
 2391	                push    ax bx cx dx si di bp ds es
 2392	                pushf
 2393	                cli
 2394	                call    SystemRESET
 2395	                popf
 2396	                push    cs
 2397	                pop     ds
 2398	                mov     ax,Apple
 2399	                mov     es,ax
 2400	                assume  es:Apple
 2401	                xor     di,di
 2402	                mov     cx,0C000h
 2403	                xor     al,al
 2404	                cld
 2405	        rep     stosb
 2406	                xor     ax,ax
 2407	                mov     bx,0C000h
 2408	                mov     si,offset RA_FictiveName
 2409	                mov     cx,102h
 2410	                call    FileIsLoaded            ; Reset done!
 2411	                mov     bp,offset MemoryParams
 2412	                mov     bl,M_Pos
 2413	                call    Delete
 2414	                call    S_Up
 2415	                mov     bx,es:[0FFFCh]
 2416	                mov     ax,TaskControl
 2417	                mov     es,ax
 2418	                assume  es:TaskControl
 2419	                mov     es:r_PC,bx
 2420	                pop     es ds bp di si dx cx bx ax
 2421	                ret
 2422	ResetAppleII    endp
 2423	                assume  es:Emulate
 2424	
 2425	
 2426	GoAppleII:      push    ax bx es
 2427	                xor     bx,bx
 2428	                xchg    bx,ActiveFlags
 2429	                call    ShowAll
 2430	                ScreenIOservice _SHOWSCREEN
 2431			mov     ax,Emulate
 2432	                mov     es,ax
 2433	                mov     al,C050
 2434	                ScreenIOservice _SetScreen
 2435	                SwitchToProcess PID_EMULATOR
 2436	                mov     ActiveFlags,bx
 2437	                pop     es bx ax
 2438	                ret
 2439	
 2440	FM              ends
 2441	
 2442			END
 2443	

Generated by GNU Enscript 1.6.6, and GophHub 1.3.