主题:在QuickBasic中使用扩展内存(XMS)
DECLARE FUNCTION xms.unlock$ (es%, bx%)
DECLARE FUNCTION XMS.FREE$ (es%, bx%)
DECLARE FUNCTION xms.realloc$ (es%, bx%)
DECLARE FUNCTION XMS.MOVE$ (es%, bx%)
DECLARE SUB DEMO ()
DECLARE FUNCTION xms.dealloc$ (es%, bx%)
DECLARE FUNCTION XMS.ALLOC$ (es%, bx%)
DECLARE FUNCTION INT2STR$ (SWORD%)
DECLARE SUB XMS.ENTRIE (es%, bx%)
DECLARE FUNCTION XMM.DETECT% ()
DECLARE FUNCTION BIOSXMS.DETECT% ()
DECLARE FUNCTION xms.lock$ (es%, bx%)
DECLARE FUNCTION xsm.unlock$ (es%, bx%)
DEMO
END
FUNCTION BIOSXMS.DETECT%
'------------------------------------------------------
'THIS FUNCTION RETURNS XMS MEMORY BLOCKS OF 1KB
'FOR 286 AND 386 WITHOUT XMS MANAGER INSTALLED
'STACKPASSING :AX%
'IN:
'OUT :AX%--NR OF 1 KB EXTENDED MEMBLOCKS
'ERRORRETURN :AX%= 0 THEN FUNCTION NOT SUPPORTED OR XMS
' HANDLER INSTALLED
'-------------------------------------------------------
asm$ = asm$ + CHR$(&H55) 'PUSH BP
asm$ = asm$ + CHR$(&H89) + CHR$(&HE5) 'MOV BP,SP
asm$ = asm$ + CHR$(&H50) 'PUSH AX
asm$ = asm$ + CHR$(&HB4) + CHR$(&H88) 'MOV AH,88
asm$ = asm$ + CHR$(&HCD) + CHR$(&H15) 'INT 15
asm$ = asm$ + CHR$(&H72) + CHR$(&H5) 'JC 5
asm$ = asm$ + CHR$(&H8B) + CHR$(&H5E) + CHR$(&H6) 'MOV BX,[BP+06]
asm$ = asm$ + CHR$(&H89) + CHR$(&H7) 'MOV [BX],AX
asm$ = asm$ + CHR$(&H58) 'POP AX
asm$ = asm$ + CHR$(&H5D) 'POP BP
asm$ = asm$ + CHR$(&HCA) + CHR$(&H2) + CHR$(&H0) 'RETF 2
'________________________________________
codeoff% = SADD(asm$)
DEF SEG = VARSEG(asm$)
CALL absolute(AX%, codeoff%)
'________________________________________
DEF SEG
BIOSXMS.DETECT% = AX%
END FUNCTION
SUB DATASEGMENT (LENGTH%)
'THIS SUB IS OFFERING THE MINIMAL NECESSARY REQUIREMENTS FOR SETTING
'UP A DATASEGMENT IN YOUR ASSEMBLER SUBS.
'-------------------------------------------------------------------------
'DATA
DIM DATAS%(LENGTH%)
DATASEG% = VARSEG(DATAS%(0)): DATAOFF% = VARPTR(DATAS%(0))
DATASEG$ = INT2STR$(DATASEG%): DATAOFF$ = INT2STR$(DATAOFF%)
'-----------------------------------
'CODE
asm$ = asm$ + CHR$(&H50) 'PUSH AX
asm$ = asm$ + CHR$(&H1E) 'PUSH DS
asm$ = asm$ + CHR$(&HB8) + DATASEG$ 'MOV AX,DATASEG$
asm$ = asm$ + CHR$(&H8E) + CHR$(&HD8) 'MOV DS,AX
asm$ = asm$ + CHR$(&H1F) 'POP DS
asm$ = asm$ + CHR$(&H58) 'POP AX
'------------------------------------------------------------------------
END SUB
SUB DEMO
CLS
IF XMM.DETECT THEN PRINT "XMM DETECTED" ELSE PRINT "TOTAL XMS AVAILABLE FOR BIOS :"; HEX$(BIOSXMS.DETECT%); ""
XMS.ENTRIE es%, bx%
PRINT "DRIVER ENTRIE SEG : "; HEX$(es%)
PRINT "DRIVER ENTRIE OFF : "; HEX$(bx%)
'Let us initialize a few:
'------------------------
alloc$ = XMS.ALLOC$(es%, bx%): dealloc$ = xms.dealloc$(es%, bx%):
realloc$ = xms.realloc$(es%, bx%): move$ = XMS.MOVE$(es%, bx%):
lock$ = xms.lock$(es%, bx%): unlock$ = xms.unlock$(es%, bx%)
stringseg% = VARSEG(alloc$): DEF SEG = stringseg%: free$ = XMS.FREE$(es%, bx%)
'--------------------------------------------------------------------------
'free memory ?
'--------------
codeoff% = SADD(free$): CALL absolute(AX%, dx%, codeoff%)
PRINT "TOTAL XMS IN KB/ BYTES :"; dx%; "("; dx% * &H400&; ")"
PRINT "FREE XMS IN KB/ BYTES :"; AX%; "("; AX% * &H400&; ")"
'Allocating XMS:
'----------------
codeoff% = SADD(alloc$): dx% = 64'64 KB
CALL absolute(AX%, dx%, codeoff%): DEF SEG
IF AX% THEN PRINT "ALLOCATED REQUESTED XMS BLOCKS WITH HANDLE :"; dx% ELSE PRINT "ERROR ALLOCATING XMS "; dx%
handle% = dx% 'save handle
'And reallocating XMS:
'----------------------
codeoff% = SADD(realloc$): bx% = 100'bigger then 64 kB
dx% = handle%: CALL absolute(bx%, dx%, codeoff%)
IF dx% > 1 THEN PRINT "ERROR REALLOCATING XMS BLOCK "; handle%; "WITH NR.:"; dx% ELSE PRINT "REALLOCATED XMS BLOCK WITH HANDLE :"; handle%
'And deallocating
'-----------------
codeoff% = SADD(dealloc$): dx% = handle%: DEF SEG = stringseg%
CALL absolute(dx%, codeoff%)
IF dx% > 1 THEN PRINT "ERROR DEALLOCATING XMS BLOCK "; handle%; "WITH NR.:"; dx% ELSE PRINT "DEALLOCATED XMS BLOCK WITH HANDLE :"; handle%
'End of bare demo 1
DECLARE FUNCTION XMS.FREE$ (es%, bx%)
DECLARE FUNCTION xms.realloc$ (es%, bx%)
DECLARE FUNCTION XMS.MOVE$ (es%, bx%)
DECLARE SUB DEMO ()
DECLARE FUNCTION xms.dealloc$ (es%, bx%)
DECLARE FUNCTION XMS.ALLOC$ (es%, bx%)
DECLARE FUNCTION INT2STR$ (SWORD%)
DECLARE SUB XMS.ENTRIE (es%, bx%)
DECLARE FUNCTION XMM.DETECT% ()
DECLARE FUNCTION BIOSXMS.DETECT% ()
DECLARE FUNCTION xms.lock$ (es%, bx%)
DECLARE FUNCTION xsm.unlock$ (es%, bx%)
DEMO
END
FUNCTION BIOSXMS.DETECT%
'------------------------------------------------------
'THIS FUNCTION RETURNS XMS MEMORY BLOCKS OF 1KB
'FOR 286 AND 386 WITHOUT XMS MANAGER INSTALLED
'STACKPASSING :AX%
'IN:
'OUT :AX%--NR OF 1 KB EXTENDED MEMBLOCKS
'ERRORRETURN :AX%= 0 THEN FUNCTION NOT SUPPORTED OR XMS
' HANDLER INSTALLED
'-------------------------------------------------------
asm$ = asm$ + CHR$(&H55) 'PUSH BP
asm$ = asm$ + CHR$(&H89) + CHR$(&HE5) 'MOV BP,SP
asm$ = asm$ + CHR$(&H50) 'PUSH AX
asm$ = asm$ + CHR$(&HB4) + CHR$(&H88) 'MOV AH,88
asm$ = asm$ + CHR$(&HCD) + CHR$(&H15) 'INT 15
asm$ = asm$ + CHR$(&H72) + CHR$(&H5) 'JC 5
asm$ = asm$ + CHR$(&H8B) + CHR$(&H5E) + CHR$(&H6) 'MOV BX,[BP+06]
asm$ = asm$ + CHR$(&H89) + CHR$(&H7) 'MOV [BX],AX
asm$ = asm$ + CHR$(&H58) 'POP AX
asm$ = asm$ + CHR$(&H5D) 'POP BP
asm$ = asm$ + CHR$(&HCA) + CHR$(&H2) + CHR$(&H0) 'RETF 2
'________________________________________
codeoff% = SADD(asm$)
DEF SEG = VARSEG(asm$)
CALL absolute(AX%, codeoff%)
'________________________________________
DEF SEG
BIOSXMS.DETECT% = AX%
END FUNCTION
SUB DATASEGMENT (LENGTH%)
'THIS SUB IS OFFERING THE MINIMAL NECESSARY REQUIREMENTS FOR SETTING
'UP A DATASEGMENT IN YOUR ASSEMBLER SUBS.
'-------------------------------------------------------------------------
'DATA
DIM DATAS%(LENGTH%)
DATASEG% = VARSEG(DATAS%(0)): DATAOFF% = VARPTR(DATAS%(0))
DATASEG$ = INT2STR$(DATASEG%): DATAOFF$ = INT2STR$(DATAOFF%)
'-----------------------------------
'CODE
asm$ = asm$ + CHR$(&H50) 'PUSH AX
asm$ = asm$ + CHR$(&H1E) 'PUSH DS
asm$ = asm$ + CHR$(&HB8) + DATASEG$ 'MOV AX,DATASEG$
asm$ = asm$ + CHR$(&H8E) + CHR$(&HD8) 'MOV DS,AX
asm$ = asm$ + CHR$(&H1F) 'POP DS
asm$ = asm$ + CHR$(&H58) 'POP AX
'------------------------------------------------------------------------
END SUB
SUB DEMO
CLS
IF XMM.DETECT THEN PRINT "XMM DETECTED" ELSE PRINT "TOTAL XMS AVAILABLE FOR BIOS :"; HEX$(BIOSXMS.DETECT%); ""
XMS.ENTRIE es%, bx%
PRINT "DRIVER ENTRIE SEG : "; HEX$(es%)
PRINT "DRIVER ENTRIE OFF : "; HEX$(bx%)
'Let us initialize a few:
'------------------------
alloc$ = XMS.ALLOC$(es%, bx%): dealloc$ = xms.dealloc$(es%, bx%):
realloc$ = xms.realloc$(es%, bx%): move$ = XMS.MOVE$(es%, bx%):
lock$ = xms.lock$(es%, bx%): unlock$ = xms.unlock$(es%, bx%)
stringseg% = VARSEG(alloc$): DEF SEG = stringseg%: free$ = XMS.FREE$(es%, bx%)
'--------------------------------------------------------------------------
'free memory ?
'--------------
codeoff% = SADD(free$): CALL absolute(AX%, dx%, codeoff%)
PRINT "TOTAL XMS IN KB/ BYTES :"; dx%; "("; dx% * &H400&; ")"
PRINT "FREE XMS IN KB/ BYTES :"; AX%; "("; AX% * &H400&; ")"
'Allocating XMS:
'----------------
codeoff% = SADD(alloc$): dx% = 64'64 KB
CALL absolute(AX%, dx%, codeoff%): DEF SEG
IF AX% THEN PRINT "ALLOCATED REQUESTED XMS BLOCKS WITH HANDLE :"; dx% ELSE PRINT "ERROR ALLOCATING XMS "; dx%
handle% = dx% 'save handle
'And reallocating XMS:
'----------------------
codeoff% = SADD(realloc$): bx% = 100'bigger then 64 kB
dx% = handle%: CALL absolute(bx%, dx%, codeoff%)
IF dx% > 1 THEN PRINT "ERROR REALLOCATING XMS BLOCK "; handle%; "WITH NR.:"; dx% ELSE PRINT "REALLOCATED XMS BLOCK WITH HANDLE :"; handle%
'And deallocating
'-----------------
codeoff% = SADD(dealloc$): dx% = handle%: DEF SEG = stringseg%
CALL absolute(dx%, codeoff%)
IF dx% > 1 THEN PRINT "ERROR DEALLOCATING XMS BLOCK "; handle%; "WITH NR.:"; dx% ELSE PRINT "DEALLOCATED XMS BLOCK WITH HANDLE :"; handle%
'End of bare demo 1