home *** CD-ROM | disk | FTP | other *** search
/ Hall of Fame / HallofFameCDROM.cdr / open / swap.lzh / EXECSWAP.ZIP / EXECSWAP.ASM next >
Assembly Source File  |  1989-04-03  |  6KB  |  400 lines

  1. DATA    SEGMENT    BYTE PUBLIC
  2.     EXTRN    BytesSwapped:DWORD
  3.     EXTRN    EmsAllocated:BYTE
  4.     EXTRN    FileAllocated:BYTE
  5.     EXTRN    EmsHandle:WORD
  6.     EXTRN    FrameSeg:WORD
  7.     EXTRN    FileHandle:WORD
  8.     EXTRN    SwapName:BYTE
  9.     EXTRN    PrefixSeg:WORD
  10. DATA    ENDS
  11.  
  12. CODE    SEGMENT    WORD PUBLIC
  13.     ASSUME    CS:CODE,DS:DATA
  14.     PUBLIC    ExecWithSwap,FirstToSave
  15.     PUBLIC    AllocateSwapFile,DeallocateSwapFile
  16.     PUBLIC    DefaultDrive,DiskFree
  17.     PUBLIC    EmsInstalled,EmsPageFrame
  18.     PUBLIC     AllocateEmsPages,DeallocateEmsHandle
  19.  
  20. FileAttr    EQU    6
  21. EmsPageSize    EQU    16384
  22. FileBlockSize    EQU    32768
  23. StkSize        EQU    128
  24. lo        EQU    (WORD PTR 0)
  25. hi        EQU    (WORD PTR 2)
  26. ofst        EQU    (WORD PTR 0)
  27. segm        EQU    (WORD PTR 2)
  28.  
  29. EmsDevice    DB    'EMMXXXX0',0
  30. UsedEms        DB    0
  31. BytesSwappedCS    DD    0
  32. EmsHandleCS    DW    0
  33. FrameSegCS    DW    0
  34. FileHandleCS    DW    0
  35. PrefixSegCS    DW    0
  36. Status        DW    0
  37. LeftToSwap    DD    0
  38. SaveSP        DW    0
  39. SaveSS        DW    0
  40. PathPtr        DD    0
  41. CmdPtr        DD    0
  42. ParasWeHave    DW    0
  43. CmdLine        DB    128 DUP(0)
  44. Path        DB    64 DUP(0)
  45. FileBlock1    DB    16 DUP(0)
  46. FileBlock2    DB    16 DUP(0)
  47. EnvironSeg    DW    0
  48. CmdLinePtr    DD    0
  49. FilePtr1    DD    0
  50. FilePtr2    DD    0
  51. TempStack    DB     StkSize DUP(0)
  52. StackTop    LABEL    WORD
  53.  
  54. MovSeg        MACRO Dest,Src
  55.  
  56.     PUSH    Src
  57.     POP    Dest
  58.         ENDM
  59.  
  60. MovMem        MACRO     Dest,Src
  61.     MOV    AX,Src
  62.     MOV    Dest,AX
  63.         ENDM
  64.  
  65. InitSwapCount    MACRO
  66.     MovMem    LeftToSwap.lo,BytesSwappedCS.lo
  67.     MOvMem    LeftToSwap.hi,BytesSwappedCS.hi
  68.         ENDM
  69.  
  70. SetSwapCount    MACRO BlkSize
  71.     LOCAL    FullBlk
  72.     MOV    CX,BlkSize
  73.     CMP    LeftToSwap.hi,0
  74.     JNZ    FullBlk
  75.     CMP    LeftToSwap.lo,BlkSize
  76.     JAE    FullBlk
  77.     MOV    CX,LeftToSwap.lo
  78. FullBlk:SUB    LeftToSwap.lo,CX
  79.     SBB    LeftToSwap.hi,0
  80.         ENDM
  81.  
  82. NextBlock    MACRO SegReg, BlkSize
  83.     MOV    AX,SegReg
  84.     ADD    AX,BlkSize/16
  85.     MOV    SegReg,AX
  86.     MOV    AX,LeftToSwap.lo
  87.     OR    AX,LeftToSwap.hi
  88.         ENDM
  89. EmsCall        MACRO FuncAH
  90.     MOV    AH,FuncAH
  91.     INT    67h
  92.     OR    AH,AH
  93.         ENDM
  94. DosCallAH    MACRO FuncAH
  95.     MOV    AH,FuncAH
  96.     INT    21h
  97.         ENDM
  98.  
  99. DosCallAX    MACRO FuncAX
  100.     MOV    AX,FuncAX
  101.     INT    21h
  102.         ENDM
  103.  
  104. InitSwapFile    MACRO
  105.     MOV    BX,FileHandleCS
  106.     XOR    CX,CX
  107.     XOR    DX,DX
  108.     DosCallAX 4200h
  109.         ENDM
  110.  
  111. HaltWithError    MACRO Level
  112.     MOV    AL,Level
  113.     DosCallAH 4Ch
  114.         ENDM
  115.  
  116. MoveFast    MACRO
  117.     CLD
  118.     SHR    CX,1
  119.     REP    MOVSW
  120.     RCL    CX,1
  121.     REP    MOVSB
  122.         ENDM
  123.  
  124. SetTempStack    MACRO
  125.     MOV    AX,OFFSET StackTop
  126.     MOV    BX,CS
  127.     CLI
  128.     MOV    SS,BX
  129.     MOV    SP,AX
  130.     STI
  131.         ENDM
  132.  
  133. ExecWithSwap    PROC FAR
  134.     PUSH    BP
  135.     MOV    BP,SP
  136.  
  137.     MOV    Status,1
  138.     LES    DI,[BP+6]
  139.     MOV    CmdPtr.ofst,DI
  140.     MOV    CmdPtr.segm,ES
  141.     LES    DI,[BP+10]
  142.     MOV    PathPtr.ofst,DI
  143.     MOV    PathPtr.segm,ES
  144.     MOV    SaveSP,SP
  145.     MOV    SaveSS,SS
  146.     MovMem    BytesSwappedCS.lo,BytesSwapped.lo
  147.     MOvMem    BytesSwappedCS.hi,BytesSwapped.hi
  148.     MovMem    EmsHandleCS,EmsHandle
  149.     MovMem    FrameSegCS,FrameSeg
  150.     MovMem    FileHandleCS,FileHandle
  151.     MovMem    PrefixSegCS,PrefixSeg
  152.     InitSwapCount
  153.  
  154.     CMP    EmsAllocated,0
  155.     JZ    NotEms
  156.     JMP    WriteE
  157. NotEms:    CMP    FileAllocated,0
  158.     JNZ    WriteF
  159.     JMP    ESDone
  160.  
  161. WriteF:    MovSeg    DS,CS
  162.     InitSwapFile
  163.     JNC    EF0
  164.     JMP    ESDone
  165. EF0:    SetSwapCount FileBlockSize
  166.     MOV    DX,OFFSET FirstToSave
  167.     DosCallAH 40h
  168.     JC    EF1
  169.     CMP    AX,CX
  170.     JZ    EF2
  171. EF1:    JMP    ESDone
  172. EF2:    NextBlock  DS,FileBlockSize
  173.     JNZ    EF0
  174.     MOV    UsedEms,0
  175.     JMP    SwapDone
  176.  
  177. WriteE:    MOV    ES,FrameSeg
  178.     MOV    DX,EmsHandle
  179.     XOR    BX,BX
  180.     MovSeg    DS,CS
  181. EE0:    XOR    AL,AL
  182.     EmsCall 44h
  183.     JZ    EE1
  184.     JMP    ESDone
  185. EE1:    SetSwapCount EmsPageSize
  186.     XOR    DI,DI
  187.     MOV    SI,OFFSET FirstToSave
  188.     MoveFast
  189.     INC    BX
  190.     NextBlock DS,EmsPageSize
  191.     JNZ    EE0
  192.     MOV    UsedEms,1
  193.  
  194. SwapDone: MOV    AX,PrefixSegCS
  195.     MOV    ES,AX
  196.     DEC    AX
  197.     MOV    DS,AX
  198.     MOV    CX,DS:[0003h]
  199.     MOV    ParasWeHave,CX
  200.     SetTempStack
  201.     MOV    AX,OFFSET FirstToSave+15
  202.     MOV    CL,4
  203.     SHR    AX,CL
  204.     ADD    BX,AX
  205.     SUB    BX,PrefixSegCS
  206.     DosCallAH 4Ah
  207.     JNC    EX0
  208.     JMP    EX5
  209.  
  210. EX0:    MOV    AX,ES:[002ch]
  211.     MOV    EnvironSeg,AX
  212.     MovSeg    ES,CS
  213.     LDS    SI,PathPtr
  214.     MOV    DI,OFFSET Path
  215.     CLD
  216.     LODSB
  217.     CMP    AL,63
  218.     JB    EX1
  219.     MOV    AL,63
  220. EX1:    MOV    CL,AL
  221.     XOR    CH,CH
  222.     REP    MOVSB
  223.     XOR    AL,AL
  224.     STOSB
  225.     LDS    SI,CmdPtr
  226.     MOV    DI,OFFSET CmdLine
  227.     LODSB
  228.     CMP    AL,126
  229.     JB    EX2
  230.     MOV    AL,126
  231. EX2:    STOSB
  232.     MOV    CL,AL
  233.     XOR    CH,CH
  234.     REP    MOVSB
  235.     MOV    AL,0DH
  236.     STOSB
  237.     MovSeg    DS,CS
  238.     MOV    SI,OFFSET CmdLine
  239.     MOV    CmdLinePtr.ofst,SI
  240.     MOV    CmdLinePtr.segm,DS
  241.     INC    SI
  242.     MOV    DI,OFFSET FileBlock1
  243.     MOV    FilePtr1.ofst,DI
  244.     MOV    FilePtr1.segm,ES
  245.     DosCallAX 2901h
  246.     MOV    DI,OFFSET FileBlock2
  247.     MOV    FilePtr2.ofst,DI
  248.     MOV    FilePtr2.segm,ES
  249.     DosCallAX 2901h
  250.     MOV    DX,OFFSET Path
  251.     MOV    BX,OFFSET EnvironSeg
  252.     DosCallAX 4B00h
  253.     JC    EX3
  254.     XOR    AX,AX
  255. EX3:    MOV    Status,AX
  256.     SetTempStack
  257.     MOV    ES,PrefixSegCS
  258.     MOV    BX,ParasWeHave
  259.     DosCallAH 4Ah
  260.     JNC    EX4
  261.     HaltWithError 0FFh
  262. EX4:    InitSwapCount
  263.  
  264. EX5:    CMP    UsedEms,0
  265.     JZ    ReadF
  266.     JMP    ReadE
  267.  
  268. ReadF:    MovSeg DS,CS
  269.     InitSwapFile
  270.     JNC    EF3
  271.     HaltWithError 0FEh
  272. EF3:    SetSwapCount FileBlockSize
  273.     MOV    DX,OFFSET FirstToSave
  274.     DosCallAH 3Fh
  275.     JNC    EF4
  276.     HaltWithError 0FEh
  277. EF4:    CMP    AX,CX
  278.     JZ    EF5
  279.     HaltWithError 0FEh
  280. EF5:    NextBlock DS,FileBlockSize
  281.     JNZ    EF3
  282.     JMP    ESDone
  283.  
  284. ReadE:    MOV    DS,FrameSegCS
  285.     MOV    DX,EmsHandleCS
  286.     XOR    BX,BX
  287.     MovSeg     ES,CX
  288. EE3:    XOR    AL,AL
  289.     EmsCall 44h
  290.     JZ    EE4
  291.     HaltWithError 0FDh
  292. EE4:    SetSwapCount EmsPageSize
  293.     XOR    SI,SI
  294.     MOV    DI,OFFSET FirstToSave
  295.     MoveFast
  296.     INC    BX
  297.     NextBlock ES,EmsPageSize
  298.     JNZ    EE3
  299.  
  300. ESDone:    CLI
  301.     MOV    SS,SaveSS
  302.     MOV    SP,SaveSP
  303.     STI
  304.     MOV    AX,SEG DATA
  305.     MOV    DS,AX
  306.     MOV    AX,Status
  307.     POP    BP
  308.     RET    8
  309. ExecWithSwap    ENDP
  310.  
  311. FirstToSave:
  312.  
  313. AllocateSwapFile PROC NEAR
  314.     MOV    CX,FileAttr
  315.     MOV    DX,OFFSET SwapName+1
  316.     DosCallAH 3Ch
  317.     MOV    FileHandle,AX
  318.     MOV    AL,0
  319.     JC    ASDone
  320.     INC    AL
  321. ASDone:    RET
  322. AllocateSwapFile ENDP
  323.  
  324. DeallocateSwapFile PROC NEAR
  325.     MOV    BX,FileHandle
  326.     DosCallAH 3Eh
  327.     XOR    CX,CX
  328.     MOV    DX,OFFSET SwapName+1
  329.     DosCallAX 4301h
  330.     DosCallAH 41h
  331.     RET
  332. DeallocateSwapFile ENDP
  333.  
  334. EmsInstalled    PROC FAR
  335.     PUSH    DS
  336.     MovSeg  DS,CS
  337.     MOV    DX,OFFSET EmsDevice
  338.     DosCallAX 3D02h
  339.     POP    DS
  340.     MOV    BX,AX
  341.     MOV    AL,0
  342.     JC    EIDone
  343.     DosCallAH 3Eh
  344.     MOV    AL,1
  345. EIDone:    RET
  346. EmsInstalled    ENDP
  347.  
  348. EmsPageFrame    PROC FAR
  349.     EmsCall 41h
  350.     MOV    AX,BX
  351.     JZ    EPDone
  352.     XOR    AX,AX
  353. EPDone:    RET
  354. EmsPageFrame    ENDP
  355.  
  356. AllocateEmsPages PROC FAR
  357.     MOV    BX,SP
  358.     MOV    BX,SS:[BX+4]
  359.     EmsCall 43h
  360.     MOV    AX,DX
  361.     JZ    APDone
  362.     MOV    AX,0FFFFh
  363. APDone:    RET    2
  364. AllocateEmsPages ENDP
  365.  
  366. DeallocateEmsHandle PROC FAR
  367.     MOV    BX,SP
  368.     MOV    DX,SS:[BX+4]
  369.     EmsCall 45h
  370.     RET    2
  371. DeallocateEmsHandle ENDP
  372.  
  373. DefaultDrive    PROC FAR
  374.     DosCallAH 19h
  375.     ADD    AL,'A'
  376.     RET
  377. DefaultDrive    ENDP
  378.  
  379. DiskFree    PROC FAR
  380.     MOV    BX,SP
  381.     MOV    DL,SS:[BX+4]
  382.     DosCallAH 36h
  383.     MOV    DX,AX
  384.     CMP    AX,0FFFFh
  385.     JZ    DFDone
  386.     MUL    CX
  387.     MUL    BX
  388. DFDone:    RET    2
  389. DiskFree    ENDP
  390.  
  391. CODE    ENDS
  392.     END
  393.  
  394.  
  395.  
  396.  
  397.  
  398.  
  399.  
  400.