;          Out Of Paper Emulator (C) V-Lab 1992
;   p®£p ¬¬  p §p ¡®â ­  ¢ V-Lab š ¯p¥€­ §­ ç¥­  €«ï š¬¬šâ æšš
;    á®áâ®ï­šï ¯pš­â¥p  Out Of Paper ¯® ¢ë¢®€ã FF (12h) š«š
;   ¯® çšá«ã ¢ë¢¥€¥­­ëå áâp®ª. ®á«¥€ãîé¥¥ ¯p®€®«Š¥­š¥ ¯¥ç âš 
;   ®áãé¥áâ¢«ï¥âáï ¯¥p¥¢®€®¬ ¯pš­â¥p  ¢ OffLine š ®¡p â­®. 
;
           jmp start
Presence db 'V-lab Out Of Paper'
PresenceSize = $ - offset Presence
Old17      dw 0,0             ; áâ pë© ¢¥ªâ®p 17
New17      dw 0,0             ; ãáâ ­®¢«¥­­ë© 17 ¢¥ªâ®p
TestFF     db 1               ; â¥áâšp®¢ âì «š FF
TestLine   db 0               ; p¥ £šp®¢ âì «š ­  çšá«® «š­š©
LineCount  dw 63              ; çšá«® «š­š©
BusyFlag   db 0               ; ä« £ § ­ïâ®áâš        }
CountLN    dw 0               ; çšá«® ¯p®è¥€èšå «š­š© } p ¡®çš¥ ïç¥©ªš
;±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
;========================================================================
Int_17   proc far
;        db 0cch             ; H !!!!
Go:      push ds             ; á¯ á«š p¥£šáâpë
         push ax             ;
         push dx             ;
         push cs             ;
         pop  ds             ; § £pã§š«š DS
         cmp BusyFlag,0      ;
         je  Obrabot         ; ¯®è«š € «ìè¥ ­  ¢ë¢®€ áš¬¢®« 
         mov ah,2            ; ¥á«š Busy ¢§¢¥€¥­,   ¯pš­â¥p £®â®¢ -
                             ; í¬ã«špã¥¬ ®èš¡ªã €«ï «î¡®© ¯/äã­ªæšš
         pushf               ; š¬¬šâšpã¥¬ ¢ë§®¢ ¯p¥pë¢ ­šï
         call dword Ptr cs:[Old17]
         and  ah,10010000b   ; § ¬ áªšp®¢ «š, çâ® ­¥ ­ãŠ­®
         cmp  ah,90h         ; ¯pš­â¥p £®â®¢ ?
         je   EmulErr        ;
;        db 0cch             ; H !!!!
         mov  BusyFlag,0     ; ¥á«š ¯pš­â¥p ¢áâ « ¢ NotReady
         mov  ax,LineCount   ; á¡p®áš«š BusyFlag š CountLN
         mov  CountLN,ax     ;
         jmp short Obrabot   ; â® ¯ãáâì á ¬ š ®¡p ¡ âë¢ ¥â ®èš¡ªã
                             ;
EmulErr:                     ;
;        db   0cch           ; H !!!!
         pop  dx             ; í¬ã«špã¥¬ ®èš¡ªã ¯pš­â¥p 
         pop  ax             ;
         pop  ds             ;
         mov  ah,18h         ; § ­¥á«š ¢ H ®èš¡ªã
         cli                 ; § ¯p¥âš«š ¯p¥pë¢ ­šï
         push bp             ;
         mov bp,sp           ;
         or  ss:[bp+6],0003h ; ¢§¢¥«š Carry
         pop  bp             ;
         iret                ;
                             ;
Obrabot: pop  dx             ; ¢ëâ®«ª­ã«š p¥£šáâpë
         pop  ax             ;
         pop  ds             ;
         cmp  ah,0           ; íâ® ¢ë¢®€ áš¬¢®«  ?
         jne  GetInit        ;
         cmp  al,0Dh         ; íâ® ª®­¥æ «š­šš ?
         jne  ChFF           ; ­¥â
;        db   0cch           ; H !!!!
         dec  cs:CountLN     ;
         cmp  CountLN,0      ; ¢ë¢¥«š ¢á¥ áâp®ªš ?
         jne  ChFF           ; ­¥â
         cmp  cs:TestLine,1  ; ­ãŠ­® «š ª®­âp®«šp®¢ âì çšá«® áâp®ª ?
         jne  ChFF           ; ­¥â
         jmp  SetBusy        ;
ChFF:    cmp  al,0Ch         ; íâ® FF ?
         jne  JustOut        ; ­¥â - ¯¥p¥€ ¥¬ ­  ®¡p ¡®âçšª
;        db   0cch           ; H !!!!
         cmp  cs:TestFF,1    ; ­ãŠ­® «š p¥ £šp®¢ âì ­  FF ?
         jne  JustOut        ; ­¥â - ¯¥p¥€ ¥¬ ­  ®¡p ¡®âçšª
SetBusy: mov  cs:BusyFlag,1  ; ¢§¢¥«š § ­ïâ®áâì
JustOut: jmp  dword Ptr cs:[Old17]
GetInit: jmp short JustOut
Int_17   ENDP
;========================================================================
EndResPart db '(C) V-Lab Creative Group  '
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°

Helps:   db 'ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿',0ah,0dh
         db '³        Out Of Paper Emulator   v.1.0.       ³',0ah,0dh
         db '³          (C) V-Laboratory, 1992             ³',0ah,0dh
         db 'ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄŽ',0ah,0dh
         db '³ /N[nnn|-] - lines per page      (/N-)       ³',0ah,0dh
         db '³ /[+|-]    - check FormFeed      (/F+)       ³',0ah,0dh
         db '³ /S        - stay resident                   ³',0ah,0dh
         db '³ /R        - remove from memory              ³',0ah,0dh
         db '³ /?        - this help information           ³',0ah,0dh
         db 'ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄŽ',0ah,0dh
         db '³ Please, start it BEFORE print spooler       ³',0ah,0dh
         db 'ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ',0ah,0dh
HelpSize = $ - offset Helps
; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
TSRMes          db ' ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»',0Ah,0Dh
                db ' º  Out Of Paper stay resident      º',0Ah,0Dh
                db ' ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍŒ',0Ah,0Dh
TSRMesSize      = $-offset TSRMes
; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
AlIns           db ' ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»',0Ah,0Dh
                db ' º  Out Of Paper already resident   º',0Ah,0Dh
                db ' ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍŒ',0Ah,0Dh
AlinsSize     = $-offset AlIns
; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
FreeMsg         db ' ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»',0Ah,0Dh
                db ' º  Out Of Paper released memory    º',0Ah,0Dh
                db ' ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍŒ',0Ah,0Dh
FreeMsgSize     = $-offset FreeMsg
; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
IncOptMsg       db ' ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»',0Ah,0Dh
                db ' º Out Of Paper not found in memory º',0Ah ,0Dh
                db ' ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍŒ',0Ah,0Dh
IncOptMsgSize        = $-offset IncOptMsg
; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
FFPlus          db ' ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»',0Ah,0Dh
                db ' º  Out Of Paper check FF         + º',0Ah,0Dh
                db ' ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍŒ',0Ah,0Dh
FFPlusSize      = $-offset FFPlus
; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
FFMin           db ' ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»',0Ah,0Dh
                db ' º  Out Of Paper leave FF         - º',0Ah,0Dh
                db ' ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍŒ',0Ah,0Dh
FFMinSize     = $-offset FFMin
; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
NFPlus          db ' ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»',0Ah,0Dh
                db ' º  Out Of Paper check line '
NFPlusPlace     db '___   + º',0Ah,0Dh
                db ' ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍŒ',0Ah,0Dh
NFPlusSize      = $-offset NFPlus
; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
NFMin           db ' ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»',0Ah,0Dh
                db ' º  Out Of Paper leave lines      - º',0Ah,0Dh
                db ' ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍŒ',0Ah,0Dh
NFMinSize     = $-offset NFMin
; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
BadParm         db ' ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»',0Ah,0Dh
                db ' º OOPaper: bad or missing parametr º',0Ah,0Dh
                db ' º Run OOPAPER /? for help          º',0Ah,0Dh
                db ' ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍŒ',0Ah,0Dh
BadParmSize   = $-offset BadParm
; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
NotRe           db ' ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»',0Ah,0Dh
                db ' º Int 17h intercept by other TSR   º',0Ah,0Dh
                db ' º OOPaper can t release memory !   º',0Ah,0Dh
                db ' ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍŒ',0Ah,0Dh
NotReSize     = $-offset NotRe
; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
InMemory db   0              ; § ­®ášâáï ­ «šçš¥ ¢ ¯ ¬ïâš  
NeedInst db   0              ;
Start:   mov ah,35h          ;
         mov al,17h          ;
         int 21h             ; ¯®«ãçš«š ¢¥ªâ®p ¯p¥pë¢ ­šï
         mov Old17,bx        ; š á®åp ­š«š ¥£®
         mov bx,es           ;
         mov Old17+2,bx      ;
         push cs
         pop  es
         call TestInMemory   ; ¯p®¢¥pš«š ­ «šçš¥ ¢ ¯ ¬ïâš
         jc   NotInM         ;
         mov  InMemory,1     ;
NotInM:  Call TestParam      ; ®¯p¥€¥«š«š ­ «šçš¥ ¯ p ¬¥âp®¢
         jnc  @More          ;
         int  20h            ;
@More:   Call ParsParam      ;
         cmp  NeedInst,1     ;
         je   Instl          ;
         int  20h            ;
Instl:   mov ah,25h          ;
         mov al,17h          ;
         mov dx, offset Int_17
         int 21h             ; ãáâ ­®¢š«š ¢¥ªâ®p ¯p¥pë¢ ­šï
         mov New17,dx        ; § ¯®¬­š«š, ªã€  ãáâ ­®¢š«š ¢¥ªâ®p
         mov dx,ds           ;
         mov New17+2,dx      ;
         mov dx,offset TSRMes;
         mov cx,TSRMesSize   ;
         Call Writeln        ;
         mov dx,offset EndResPart
; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ á¢®¡®Š€ ¥¬ Env ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
         mov     ax,[44]                 ;  €p¥á ¡«®ª  Env
         mov     es,ax                   ;
         mov     ah,49h                  ;
         int     21h                     ;
         int 27h             ; TSR
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
; ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
;           p®æ¥€ãp , ¯p®¢¥pïîé ï, ¥áâì-«š 'OOP' ¢ ¯ ¬ïâš
; ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
TrapCount       dw      0                       ; áç¥âçšª Trap-®¢ ¢ ¯ ¬ïâš
MCB_Addr        db      16 dup (0)              ;  €p¥á  MCB íâšå Trap-®¢
TestInMemory    PROC    NEAR
                push    es
; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ H è«š 1-© ¡«®ª MCB ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
                mov     ah,52h                  ;  €p¥á ¢¥ªâ®p­®© â ¡«šæë
                int     21h                     ; á¢ï§š DOS
                mov     ax,word ptr es:[bx-2]         ;
                mov     es,ax                   ; ¢ ES   - addr 1-st MCB
; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ- p®¢¥pï¥¬, ­¥ ­ è-«š íâ® ¡«®ª ? ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Next:           lea     si,Presence             ; SI = ofs Presence
                mov     di,si                   ;
                add     di,10h                  ; DI = ofs Presence + PSP
                mov     cx,PresenceSize         ;
repe            cmpsb                           ;
                cmp     cx,0                    ; ¢á¥ OK ?
                jne     GoNextMCB               ; ­¥ ­ è ¡«®ª - š€¥¬ € «ìè¥
; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ H è«š Trap ¢ ¯ ¬ïâš ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
                inc     ax                      ; ¯pš¢¥«š ª ª®€®¢®¬ã á¥£¬.
                mov     bx,TrapCount            ; § ¯®¬š­ ¥¬  €p¥á
                mov     MCB_Addr [bx],al        ; íâ®£® ¡«®ª 
                inc     bx                      ;
                mov     MCB_Addr [bx],ah        ;
                inc     bx                      ;
                mov     TrapCount,bx            ;
                dec     ax                      ; ¯pš¢¥«š ®¯ïâì ª MCB
; ÄÄÄÄÄÄÄÄÄ ¯à¥€¥«ï¥¬ à §¬¥à ¡«®ª  š ¯®«ãç ¥¬  €p¥á á«¥€ãîé¥£® ÄÄÄÄÄÄÄÄ
GoNextMCB:      mov     bx,word ptr es:[3]            ; ¢ BX - à §¬¥à ¡«®ª 
                inc     bx                      ;
                add     ax,bx                   ;
                mov     es,ax                   ;
                cmp     byte ptr es:[0],5Ah          ; íâ® ­¥ ¯®á«¥€­š© ¡«®ª ?
                jne     Next                    ; ­¥â, š€¥¬ € «ìè¥
; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ë« - «š ­ ©€¥­ Trap ? ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
                cmp     TrapCount,0             ;
                je      NotInMemory             ;
                mov     bx,TrapCount            ;
                mov     ah,MCB_Addr [bx-1]      ;
                mov     al,MCB_Addr [bx-2]      ;
                mov     es,ax                   ; ¢ ES - íää.  €p¥á MCB
                clc                             ; ®¡­ã«šâì CF
                pop     ax                      ;
                ret                             ;
NotInMemory:    stc                             ; ãáâ ­®¢šâì CF
                pop     es                      ;
                ret                             ;
TestInMemory    ENDP
; ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
; ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
;             p®æ¥€ãp , ¢ë¢®€ïé ï ­  €šá¯«¥© á®®¡é¥­šï
; ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
Writeln         PROC    NEAR
                push    ax
                push    bx
                mov     ah,40h                  
                mov     bx,1
                int     21h                        
                pop     bx
                pop     ax
                ret                                
Writeln         ENDP
; ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ

; ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
;           p®æ¥€ãp , â¥áâšpãîé ï §­ ç¥­šï ¯ p ¬¥âp®¢ š§ PSP
; ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
@PS             dw      0  ; áâ âì ¢ p¥§š€¥­â
@PR             dw      0  ; ã©âš á p¥§š€¥­â 
@PP             dw      0  ; ¢ª«îçšâì FF
@PM             dw      0  ; ¢ëª«îçšâì FF
@PN             dw      0  ; ãáâ ­®¢šâì LineCheck
@PV             dw      0  ; ¢ë€ âì ¯®¬®éì
; ---------------------------------------------------------------------- 
TestParam       PROC    NEAR        ; ¯p®¢¥pï¥â ¯ p ¬¥âpë ­  ª ç¥áâ¢®
                mov     cl,[80h]                ; ¢ CX - €«š­ 
                xor     ch,ch                   ; ParamStr
                cmp     cx,0                    ; €«š­  áâà®ªš ¯ à ¬¥âà®¢ <> 0 ?
                jne     S1                      ; €  Ä ãå®€š¬, š­ ç¥ ...
S0:             mov     dx,offset BadParm
                mov     cx,BadParmSize
                call    Writeln
                stc
                ret                             ; €  Ä ãå®€š¬, š­ ç¥ ...
S1:             mov     si,80h                  ; SI - ­ ç «® ®¡« áâš ¯ p ¬.
                mov     bx,si
                call    UpCase 
; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Search:         inc     si                      ; ã¢¥«šçš¢ ¥¬ ãª § â¥«ì
                mov     bx,[si]                 ;
NextCmp:        cmp     bx,'?/'                 ; § ¯à®á ­  Help ?
                jne     @P1                     ; €  Ä ãå®€š¬ ­  Help
                mov     @PV,si                  ;
@P1:            cmp     bx,'R/'                 ; § ¯à®á ­  ®á¢®¡®Š€¥­š¥ Mem ?
                jne     @P2                     ; €  Ä ãå®€š¬ ­  FreeMem
                mov     @PR,si                  ; 
@P2:            cmp     bx,'+/'                 ; áâ®šâ «š ¯p®¡¥« ?
                jne     @P3     
                mov     @PP,si                  ;
@P3:            cmp     bx,'-/'                 ;
                jne     @P4                     ;
                mov     @PM,si                 ;
@P4:            cmp     bx,'S/'                 ; § ¯à®á ­  TSR
                jne     @P5   
                mov     @PS,si
@P5:            cmp     bx,'N/'
                jne     @P6
                mov     @PN,si                  ; €  Ä ãå®€š¬ ­  TSR
@P6:            nop                             ;
Srch:           loop    Search                  ; ªpãâš¬ € «ìè¥
                mov     cx,6
                mov     bx,offset @PS
                xor     ax,ax
@P10:           add     ax,[bx]
                add     bx,2
                loop    @P10
                cmp     ax,0
                jne     @TRet
                jmp     S0

@TRet:          clc
                ret                             ; ¯ p ¬¥âp®¢ ­¥ ­ ©€¥­®
TestParam       ENDP
;==================================================================

;==================================================================
ParsParam        PROC NEAR             ; p §¡šp ¥â áâp®ªã ¯ p ¬¥âp®¢
                cmp    @PV,0
                je     FFon
HelpInf:                                     ; ¯®¬®éì
                mov    dx,offset Helps       ;
                mov    cx,HelpSize           ;
                Call   Writeln               ;
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
FFon:           cmp    @PP,0
                je     FFoff
; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ  ª«îçšâì p¥ ªæšî ­  FF ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
                mov    es:TestFF,1
                mov    dx,offset FFPlus
                mov    cx,FFPlusSize
                call   Writeln
; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ  ëª«îçšâì p¥ ªæšî ­  FF ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
FFoff:          cmp    @PM,0
                je     NumLin
                mov    es:TestFF,0
                mov    dx,offset FFMin
                mov    cx,FFMinSize
                call   Writeln
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
NumLin:         cmp    @PN,0
                je     InstIn
                call   TestN
                jnc    InstIn
                ret
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
InstIn:         cmp     @PS,0
                je      FreeMemory
                cmp     InMemory,1
                je      AlreIns
                mov     es:NeedInst,1        ; š­áâ ««ïæšï ­¥®¡å®€š¬ 
                jmp     FreeMemory
AlreIns:        mov     dx,offset AlIns      ;
                mov     cx,AlInsSize         ;
                call    Writeln              ;
; ÄÄÄÄÄÄÄÄÄ ëâ ¥¬áï ¢®ááâ ­ ¢šâì ¢¥ªâ®p  š ®á¢®¡®Š€ ¥¬ ¯ ¬ïâì ÄÄÄÄÄÄÄÄ
FreeMemory:     cmp     @PR,0
                jne     AllFolk 
                ret
AllFolk:        call    TestInMemory            ; ¯p®¢¥pª  ­  ¯pšáãâáâ¢š¥
                jc      NoInMemory              ; ... ¥á«š ­¥â ¢ ¯ ¬ïâš
; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ®ááâ ­®¢š«š ¯¥p¥å¢ ç¥­­®¥ ¯p¥pë¢ ­š¥ ÄÄÄÄÄÄÄÄÄÄ
                push    es
                mov     al,17h                  ; ¢ ES - ª®€®¢ë© á¥£¬¥­â
                mov     ah,35h
                int     21h                     ; ¢ ES:BX - §­ ç¥­š¥ ¢¥ªâ®p  
                pop     es
                cmp     bx,es:[New17]           ; ¯p¥pë¢ ­š¥ ­¥ š§¬¥­š«®áì ?
                jne     NotFree                 ; ­¥â - ­¥¢®§¬®Š­® ®á¢®¡®€šâì
                mov     ah,25h                  ;
                mov     dx,es:Old17             ;
                mov     ds,es:Old17+2           ;
                int     21h                     ;
; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ á¢®¡®Š€ ¥¬ ¡«®ª ¯ ¬ïâš ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
                mov     ah,49h                  ;
                int     21h                     ;
; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ë¢¥«š á®®¡é¥­š¥ ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
                push    cs                      ;
                pop     ds                      ;
                mov     dx,offset FreeMsg       ;
                mov     cx,FreeMsgSize          ;
                call    Writeln                 ;
                pop     cx                      ;
                ret                             ;
; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ë¢¥«š á®®¡é¥­š¥ ® ­¥¢®§¬®Š­®áâš ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
NoInMemory:     mov     dx,offset IncOptMsg     ;
                mov     cx,IncOptMsgSize        ;
                call    Writeln                 ;
                ret                             ;
NotFree:        mov     dx,offset NotRe         ;
                mov     cx,NotReSize            ;
                call    Writeln                 ;
                ret
ParsParam       ENDP
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
TESTN          PROC NEAR         ; ¯p®¢¥pï¥â ¯ p ¬¥âpë
;              db   0cch
ChanL:         mov  si,@PN
               add  si,2
               mov  bh,[si]
               cmp  bh,'-'    ; íâ® á­ïâì áç¥âçšª «š­š© ?
               jne  WhatIt               
; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ  ëª«îçšâì p¥ ªæšî ­  LN ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
NLoff:          mov    es:TestLine,0
                mov    dx,offset NFMin
                mov    cx,NFMinSize
                call   Writeln
                clc
                ret                
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
WhatIt:         mov  dx,si                ; ­ ç «ì­ ï ¯®§šæšï
                xor  cx,cx
LL1:            mov  bh,[si]
                cmp  bh,'9'               ; íâ® 9 ?
                ja   EndStr
                cmp  bh,'0'               ; íâ® 0 ?
                jb   EndStr
                inc  cx
                inc  si
                cmp  cx,3                 ; íâ® 3-ï æšäp  ?
                je   EndStr
                jmp  LL1
EndStr:  ;      db   0cch
                cmp  cx,0
                je   Ex2                  ; ¢ëå®€š¬, ¥á«š áâp®ª  ­ã«¥¢ ï
                mov  bx,dx                ; § £pã§š«š ãª § â¥«ì
                push bx
                push cx
                mov  si,offset NFPlusPlace
                push  cx
                mov  cx,3
OutLop1:        mov  byte ptr cs:[si],' ' ; ¯p®â¥p«š
                inc  si
                loop OutLop1         
                pop  cx                   ; § ¯šå­ã«š ¢ p ¬®çªã
                sub  si,3
OutLop:         mov  ah,cs:[bx]
                mov  cs:[si],ah
                inc  bx
                inc  si
                loop OutLop
                                          ; ¢®ááâ ­®¢š«š                
                pop  cx
                pop  bx
;                db   0cch
                call ASCII2Byte           ; ¯p¥®¡p §®¢ «š
                jc   Ex2                  ; ¢ëå®€š¬, ¥á«š ®èš¡ª 
; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ  ª«îçšâì p¥ ªæšî ­  LN ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
                mov    es:LineCount,ax
                mov    es:TestLine,1
                mov    dx,offset NFPlus
                mov    cx,NFPlusSize
                call   Writeln
                clc
                ret
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
EX2:            mov     dx,offset BadParm
                mov     cx,BadParmSize
                call    Writeln
                stc
                ret                  ; €  Ä ãå®€š¬ ­  ¯p®æ¥€ãpã ¢¢¥på
TESTN          ENDP
; ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ

ASCII2BYTE     PROC  NEAR ; ¯p¥®¡p §ã¥â áâp®ªã æšäp ¢ çšá«®
;= BX - ãª § â¥«ì ­  áâp®ªã; CX - áç¥âçšª ; AX - §­ ç¥­š¥ Carry - ®èš¡ª 
               xor   ax,ax                      ; AX = 0
               
MultLoop:      xor   dx,dx                      ; ¯p®¢¥pš«š ­  æšäpã
               mov   dl,[bx]
               cmp   dl,30h                     ; æšäp  =0 ?
               jb    ErrDec
               cmp   dl,39h                     ; æšäp  =9 ?
               ja    ErrDec
               sub   dl,30h                     ; ¯¥p¥¢¥«š ¢ HEX
               push  cx
               dec   cx                         ; á¥©ç á ¢ DX - æšäp  ¢ Hex
               jz    lastz                      ;  
Mult:          mov   di,dx                      ; ã¬­®Šš«š ­  10
               shl   di,1                       ; DX shl 3
               shl   dx,1                       ; DI shl 1
               shl   dx,1                       ; 
               shl   dx,1                       ;
               add   dx,di                      ; DX = DX + DI
               loop  Mult                       ;
Lastz:               
               pop   cx
               add   ax,dx                      ; €®¡ ¢š«š ª AX
               jc    ErrDec
               inc   bx                         ; ¢§ï«š á«¥€.æšäpã
               loop  MultLoop
               
               clc
               ret
ErrDec:        stc
               ret
ASCII2BYTE     ENDP
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
UpCase         PROC  Near  ; ¯¥p¥¢®€šâ ¢ ¡®«ìèš¥ ¡ãª¢ë
; - BX -  €p¥á, CX - áç¥âçšª ===========================================
;               db    0CCh
               push  cx
               push  bx
               inc   cx
Up1:           mov   al,[bx]               
               cmp   al,7Ah
               ja    Up2          ; ¡®«ìè¥ ¬ «¥­ìªšå
               cmp   al,61h
               jb    Up2          ; ¬¥­ìè¥ ¬ «¥­ìªšå
               sub   al,20h       ; ¬ «¥­ìªš¥
               mov   [bx],al
Up2:           inc   bx
               loop  Up1                
               pop   bx
               pop   cx
               ret
UpCase         ENDP
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°

