home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Hall of Fame
/
HallofFameCDROM.cdr
/
open
/
swap.lzh
/
EXECSWAP.ZIP
/
EXECSWAP.ASM
next >
Wrap
Assembly Source File
|
1989-04-03
|
6KB
|
400 lines
DATA SEGMENT BYTE PUBLIC
EXTRN BytesSwapped:DWORD
EXTRN EmsAllocated:BYTE
EXTRN FileAllocated:BYTE
EXTRN EmsHandle:WORD
EXTRN FrameSeg:WORD
EXTRN FileHandle:WORD
EXTRN SwapName:BYTE
EXTRN PrefixSeg:WORD
DATA ENDS
CODE SEGMENT WORD PUBLIC
ASSUME CS:CODE,DS:DATA
PUBLIC ExecWithSwap,FirstToSave
PUBLIC AllocateSwapFile,DeallocateSwapFile
PUBLIC DefaultDrive,DiskFree
PUBLIC EmsInstalled,EmsPageFrame
PUBLIC AllocateEmsPages,DeallocateEmsHandle
FileAttr EQU 6
EmsPageSize EQU 16384
FileBlockSize EQU 32768
StkSize EQU 128
lo EQU (WORD PTR 0)
hi EQU (WORD PTR 2)
ofst EQU (WORD PTR 0)
segm EQU (WORD PTR 2)
EmsDevice DB 'EMMXXXX0',0
UsedEms DB 0
BytesSwappedCS DD 0
EmsHandleCS DW 0
FrameSegCS DW 0
FileHandleCS DW 0
PrefixSegCS DW 0
Status DW 0
LeftToSwap DD 0
SaveSP DW 0
SaveSS DW 0
PathPtr DD 0
CmdPtr DD 0
ParasWeHave DW 0
CmdLine DB 128 DUP(0)
Path DB 64 DUP(0)
FileBlock1 DB 16 DUP(0)
FileBlock2 DB 16 DUP(0)
EnvironSeg DW 0
CmdLinePtr DD 0
FilePtr1 DD 0
FilePtr2 DD 0
TempStack DB StkSize DUP(0)
StackTop LABEL WORD
MovSeg MACRO Dest,Src
PUSH Src
POP Dest
ENDM
MovMem MACRO Dest,Src
MOV AX,Src
MOV Dest,AX
ENDM
InitSwapCount MACRO
MovMem LeftToSwap.lo,BytesSwappedCS.lo
MOvMem LeftToSwap.hi,BytesSwappedCS.hi
ENDM
SetSwapCount MACRO BlkSize
LOCAL FullBlk
MOV CX,BlkSize
CMP LeftToSwap.hi,0
JNZ FullBlk
CMP LeftToSwap.lo,BlkSize
JAE FullBlk
MOV CX,LeftToSwap.lo
FullBlk:SUB LeftToSwap.lo,CX
SBB LeftToSwap.hi,0
ENDM
NextBlock MACRO SegReg, BlkSize
MOV AX,SegReg
ADD AX,BlkSize/16
MOV SegReg,AX
MOV AX,LeftToSwap.lo
OR AX,LeftToSwap.hi
ENDM
EmsCall MACRO FuncAH
MOV AH,FuncAH
INT 67h
OR AH,AH
ENDM
DosCallAH MACRO FuncAH
MOV AH,FuncAH
INT 21h
ENDM
DosCallAX MACRO FuncAX
MOV AX,FuncAX
INT 21h
ENDM
InitSwapFile MACRO
MOV BX,FileHandleCS
XOR CX,CX
XOR DX,DX
DosCallAX 4200h
ENDM
HaltWithError MACRO Level
MOV AL,Level
DosCallAH 4Ch
ENDM
MoveFast MACRO
CLD
SHR CX,1
REP MOVSW
RCL CX,1
REP MOVSB
ENDM
SetTempStack MACRO
MOV AX,OFFSET StackTop
MOV BX,CS
CLI
MOV SS,BX
MOV SP,AX
STI
ENDM
ExecWithSwap PROC FAR
PUSH BP
MOV BP,SP
MOV Status,1
LES DI,[BP+6]
MOV CmdPtr.ofst,DI
MOV CmdPtr.segm,ES
LES DI,[BP+10]
MOV PathPtr.ofst,DI
MOV PathPtr.segm,ES
MOV SaveSP,SP
MOV SaveSS,SS
MovMem BytesSwappedCS.lo,BytesSwapped.lo
MOvMem BytesSwappedCS.hi,BytesSwapped.hi
MovMem EmsHandleCS,EmsHandle
MovMem FrameSegCS,FrameSeg
MovMem FileHandleCS,FileHandle
MovMem PrefixSegCS,PrefixSeg
InitSwapCount
CMP EmsAllocated,0
JZ NotEms
JMP WriteE
NotEms: CMP FileAllocated,0
JNZ WriteF
JMP ESDone
WriteF: MovSeg DS,CS
InitSwapFile
JNC EF0
JMP ESDone
EF0: SetSwapCount FileBlockSize
MOV DX,OFFSET FirstToSave
DosCallAH 40h
JC EF1
CMP AX,CX
JZ EF2
EF1: JMP ESDone
EF2: NextBlock DS,FileBlockSize
JNZ EF0
MOV UsedEms,0
JMP SwapDone
WriteE: MOV ES,FrameSeg
MOV DX,EmsHandle
XOR BX,BX
MovSeg DS,CS
EE0: XOR AL,AL
EmsCall 44h
JZ EE1
JMP ESDone
EE1: SetSwapCount EmsPageSize
XOR DI,DI
MOV SI,OFFSET FirstToSave
MoveFast
INC BX
NextBlock DS,EmsPageSize
JNZ EE0
MOV UsedEms,1
SwapDone: MOV AX,PrefixSegCS
MOV ES,AX
DEC AX
MOV DS,AX
MOV CX,DS:[0003h]
MOV ParasWeHave,CX
SetTempStack
MOV AX,OFFSET FirstToSave+15
MOV CL,4
SHR AX,CL
ADD BX,AX
SUB BX,PrefixSegCS
DosCallAH 4Ah
JNC EX0
JMP EX5
EX0: MOV AX,ES:[002ch]
MOV EnvironSeg,AX
MovSeg ES,CS
LDS SI,PathPtr
MOV DI,OFFSET Path
CLD
LODSB
CMP AL,63
JB EX1
MOV AL,63
EX1: MOV CL,AL
XOR CH,CH
REP MOVSB
XOR AL,AL
STOSB
LDS SI,CmdPtr
MOV DI,OFFSET CmdLine
LODSB
CMP AL,126
JB EX2
MOV AL,126
EX2: STOSB
MOV CL,AL
XOR CH,CH
REP MOVSB
MOV AL,0DH
STOSB
MovSeg DS,CS
MOV SI,OFFSET CmdLine
MOV CmdLinePtr.ofst,SI
MOV CmdLinePtr.segm,DS
INC SI
MOV DI,OFFSET FileBlock1
MOV FilePtr1.ofst,DI
MOV FilePtr1.segm,ES
DosCallAX 2901h
MOV DI,OFFSET FileBlock2
MOV FilePtr2.ofst,DI
MOV FilePtr2.segm,ES
DosCallAX 2901h
MOV DX,OFFSET Path
MOV BX,OFFSET EnvironSeg
DosCallAX 4B00h
JC EX3
XOR AX,AX
EX3: MOV Status,AX
SetTempStack
MOV ES,PrefixSegCS
MOV BX,ParasWeHave
DosCallAH 4Ah
JNC EX4
HaltWithError 0FFh
EX4: InitSwapCount
EX5: CMP UsedEms,0
JZ ReadF
JMP ReadE
ReadF: MovSeg DS,CS
InitSwapFile
JNC EF3
HaltWithError 0FEh
EF3: SetSwapCount FileBlockSize
MOV DX,OFFSET FirstToSave
DosCallAH 3Fh
JNC EF4
HaltWithError 0FEh
EF4: CMP AX,CX
JZ EF5
HaltWithError 0FEh
EF5: NextBlock DS,FileBlockSize
JNZ EF3
JMP ESDone
ReadE: MOV DS,FrameSegCS
MOV DX,EmsHandleCS
XOR BX,BX
MovSeg ES,CX
EE3: XOR AL,AL
EmsCall 44h
JZ EE4
HaltWithError 0FDh
EE4: SetSwapCount EmsPageSize
XOR SI,SI
MOV DI,OFFSET FirstToSave
MoveFast
INC BX
NextBlock ES,EmsPageSize
JNZ EE3
ESDone: CLI
MOV SS,SaveSS
MOV SP,SaveSP
STI
MOV AX,SEG DATA
MOV DS,AX
MOV AX,Status
POP BP
RET 8
ExecWithSwap ENDP
FirstToSave:
AllocateSwapFile PROC NEAR
MOV CX,FileAttr
MOV DX,OFFSET SwapName+1
DosCallAH 3Ch
MOV FileHandle,AX
MOV AL,0
JC ASDone
INC AL
ASDone: RET
AllocateSwapFile ENDP
DeallocateSwapFile PROC NEAR
MOV BX,FileHandle
DosCallAH 3Eh
XOR CX,CX
MOV DX,OFFSET SwapName+1
DosCallAX 4301h
DosCallAH 41h
RET
DeallocateSwapFile ENDP
EmsInstalled PROC FAR
PUSH DS
MovSeg DS,CS
MOV DX,OFFSET EmsDevice
DosCallAX 3D02h
POP DS
MOV BX,AX
MOV AL,0
JC EIDone
DosCallAH 3Eh
MOV AL,1
EIDone: RET
EmsInstalled ENDP
EmsPageFrame PROC FAR
EmsCall 41h
MOV AX,BX
JZ EPDone
XOR AX,AX
EPDone: RET
EmsPageFrame ENDP
AllocateEmsPages PROC FAR
MOV BX,SP
MOV BX,SS:[BX+4]
EmsCall 43h
MOV AX,DX
JZ APDone
MOV AX,0FFFFh
APDone: RET 2
AllocateEmsPages ENDP
DeallocateEmsHandle PROC FAR
MOV BX,SP
MOV DX,SS:[BX+4]
EmsCall 45h
RET 2
DeallocateEmsHandle ENDP
DefaultDrive PROC FAR
DosCallAH 19h
ADD AL,'A'
RET
DefaultDrive ENDP
DiskFree PROC FAR
MOV BX,SP
MOV DL,SS:[BX+4]
DosCallAH 36h
MOV DX,AX
CMP AX,0FFFFh
JZ DFDone
MUL CX
MUL BX
DFDone: RET 2
DiskFree ENDP
CODE ENDS
END