主题:在QuickBasic中使用扩展内存(XMS)
maxumi
[专家分:2200] 发布于 2006-04-24 15:35:00
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
回复列表 (共11个回复)
沙发
maxumi [专家分:2200] 发布于 2006-04-24 15:37:00
'NOW LETS GO FOR SOMETHING REAL. DEMO 1 WIll initialize twice a string
'of 22000 bytes copy them to xms( giving free again our near string in basic
'and returning them after each other.
CLS
'INITIALIZE SOME STRING:
'-----------------------
STATIC a$: a$ = STRING$(22000, "1"): Segm% = VARSEG(a$): OFFJE% = SADD(a$)
'Allocating XMS:
'----------------
codeoff% = SADD(alloc$): dx% = 64'64 KB
CALL absolute(AX%, dx%, codeoff%)
IF AX% THEN PRINT "ALLOCATED REQUESTED XMS BLOCKS WITH HANDLE :"; dx% ELSE PRINT "ERROR ALLOCATING XMS "; HEX$(dx% AND &HFF)
handle% = dx% 'save handle
'SET UP THE PARAMETERBLOCK:
DIM movparams%(7): segp% = VARSEG(movparams%(0)): offp% = VARPTR(movparams%(0))
movparams%(0) = 22000 'NUMBER OF BYTES TO MOVE
movparams%(1) = 0 '(32 bits)
movparams%(2) = 0 'HANDLE =0 MEANING A LOW.MEM
movparams%(3) = SADD(a$) 'OFFSET SOURCE
movparams%(4) = Segm% 'SEGMENT SOURCE
movparams%(5) = handle% 'XMS HANDLE
movparams%(6) = 0: movparams%(7) = 0 'DESTINY OFFSET:SEGMENT 0
'And let us move the 1 to the 0 to 22000 positions
'---------------
codeoff% = SADD(move$): DS% = segp%: SI% = offp%
CALL absolute(DS%, SI%, codeoff%)
IF DS% THEN PRINT "MOVE BLOCK TO XMS FAILED ON ERROR : "; HEX$(DS% AND &HFF) ELSE PRINT "SUCSES MOVEING BLOCK TO XMS"
a$ = "": a$ = STRING$(22000, "R")
movparams%(0) = 22000 'NUMBER OF BYTES TO MOVE
movparams%(1) = 0 '(32 bits)
movparams%(2) = 0 'HANDLE =0 MEANING A LOW.MEM
movparams%(3) = SADD(a$) 'OFFSET SOURCE
movparams%(4) = Segm% 'SEGMENT SOURCE
movparams%(5) = handle% 'XMS HANDLE
movparams%(6) = 22000: movparams%(7) = 0 'DESTINY OFFSET:SEGMENT 0
'And let us move the R to the 22000 to 44000 positions
'--------------------------------------------------
codeoff% = SADD(move$): DS% = segp%: SI% = offp%
CALL absolute(DS%, SI%, codeoff%)
IF DS% THEN PRINT "MOVE BLOCK TO XMS FAILED ON ERROR : "; HEX$(DS% AND &HFF) ELSE PRINT "SUCSES MOVEING BLOCK TO XMS"
PRINT
COLOR 0, 7: PRINT "Both strings copied to XMS now"
PRINT "Stringspace is free again im Basic": COLOR 7, 0:
PRINT : PRINT "Press a key to move on": PRINT
SLEEP:
'Let us fill a$ with some other rubbish
a$ = "": a$ = STRING$(22000, "E"):
'And move the original "1" back
'--------------------------------
movparams%(0) = 22000 'NUMBER OF BYTES TO MOVE
movparams%(1) = 0 '(32 bits)=64 KB
movparams%(2) = handle% 'XNS HANDLE
movparams%(3) = 0 'Not required for XMS
movparams%(4) = 0 'SOURCE OFFSET:SEGMENT
movparams%(5) = 0 'HANDLE= 0 meaning low.mem
movparams%(6) = SADD(a$): 'Required for low.mem:
movparams%(7) = Segm% 'DESTINY OFFSET:SEGMENT 0
'And let us move
'---------------
codeoff% = SADD(move$): DS% = segp%: SI% = offp%
CALL absolute(DS%, SI%, codeoff%)
IF DS% THEN PRINT "MOVE BLOCK FROM XMS FAILED ON ERROR : "; HEX$(DS% AND &HFF) ELSE PRINT "SUCSES MOVEING BLOCK FROM XMS"
PRINT : COLOR 0, 7:
LOCATE 13, 1: PRINT "Getting back our first string from XMS"
COLOR 7, 0:
VIEW PRINT 15 TO 24
PRINT a$: SLEEP
'and move the original "1"back:
'--------------------------------
movparams%(0) = 22000 'NUMBER OF BYTES TO MOVE
movparams%(1) = 0 '(32 bits)=64 KB
movparams%(2) = handle% 'XNS HANDLE
movparams%(3) = 22000 'Not required for XMS
movparams%(4) = 0 'SOURCE OFFSET:SEGMENT
movparams%(5) = 0 'HANDLE= 0 meaning low.mem
movparams%(6) = SADD(a$): 'Required for low.mem:
movparams%(7) = Segm% 'DESTINY OFFSET:SEGMENT 0
'And let us move
'---------------
codeoff% = SADD(move$): DS% = segp%: SI% = offp%
CALL absolute(DS%, SI%, codeoff%)
IF DS% THEN PRINT "MOVE BLOCK FROM XMS FAILED ON ERROR : "; HEX$(DS% AND &HFF) ELSE PRINT "SUCSES MOVEING BLOCK FROM XMS"
VIEW PRINT:
COLOR 0, 7: LOCATE 13, 1: PRINT "Getting back our second string from XMS"
COLOR 7, 0
VIEW PRINT 15 TO 24
板凳
maxumi [专家分:2200] 发布于 2006-04-24 15:39:00
'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
'NOW LETS GO FOR SOMETHING REAL. DEMO 1 WIll initialize twice a string
'of 22000 bytes copy them to xms( giving free again our near string in basic
'and returning them after each other.
CLS
'INITIALIZE SOME STRING:
'-----------------------
STATIC a$: a$ = STRING$(22000, "1"): Segm% = VARSEG(a$): OFFJE% = SADD(a$)
'Allocating XMS:
'----------------
codeoff% = SADD(alloc$): dx% = 64'64 KB
CALL absolute(AX%, dx%, codeoff%)
IF AX% THEN PRINT "ALLOCATED REQUESTED XMS BLOCKS WITH HANDLE :"; dx% ELSE PRINT "ERROR ALLOCATING XMS "; HEX$(dx% AND &HFF)
handle% = dx% 'save handle
'SET UP THE PARAMETERBLOCK:
DIM movparams%(7): segp% = VARSEG(movparams%(0)): offp% = VARPTR(movparams%(0))
movparams%(0) = 22000 'NUMBER OF BYTES TO MOVE
movparams%(1) = 0 '(32 bits)
movparams%(2) = 0 'HANDLE =0 MEANING A LOW.MEM
movparams%(3) = SADD(a$) 'OFFSET SOURCE
movparams%(4) = Segm% 'SEGMENT SOURCE
movparams%(5) = handle% 'XMS HANDLE
movparams%(6) = 0: movparams%(7) = 0 'DESTINY OFFSET:SEGMENT 0
'And let us move the 1 to the 0 to 22000 positions
'---------------
codeoff% = SADD(move$): DS% = segp%: SI% = offp%
CALL absolute(DS%, SI%, codeoff%)
IF DS% THEN PRINT "MOVE BLOCK TO XMS FAILED ON ERROR : "; HEX$(DS% AND &HFF) ELSE PRINT "SUCSES MOVEING BLOCK TO XMS"
a$ = "": a$ = STRING$(22000, "R")
movparams%(0) = 22000 'NUMBER OF BYTES TO MOVE
movparams%(1) = 0 '(32 bits)
movparams%(2) = 0 'HANDLE =0 MEANING A LOW.MEM
movparams%(3) = SADD(a$) 'OFFSET SOURCE
movparams%(4) = Segm% 'SEGMENT SOURCE
movparams%(5) = handle% 'XMS HANDLE
movparams%(6) = 22000: movparams%(7) = 0 'DESTINY OFFSET:SEGMENT 0
'And let us move the R to the 22000 to 44000 positions
'--------------------------------------------------
codeoff% = SADD(move$): DS% = segp%: SI% = offp%
CALL absolute(DS%, SI%, codeoff%)
IF DS% THEN PRINT "MOVE BLOCK TO XMS FAILED ON ERROR : "; HEX$(DS% AND &HFF) ELSE PRINT "SUCSES MOVEING BLOCK TO XMS"
PRINT
COLOR 0, 7: PRINT "Both strings copied to XMS now"
PRINT "Stringspace is free again im Basic": COLOR 7, 0:
PRINT : PRINT "Press a key to move on": PRINT
SLEEP:
'Let us fill a$ with some other rubbish
a$ = "": a$ = STRING$(22000, "E"):
'And move the original "1" back
'--------------------------------
movparams%(0) = 22000 'NUMBER OF BYTES TO MOVE
movparams%(1) = 0 '(32 bits)=64 KB
movparams%(2) = handle% 'XNS HANDLE
movparams%(3) = 0 'Not required for XMS
movparams%(4) = 0 'SOURCE OFFSET:SEGMENT
movparams%(5) = 0 'HANDLE= 0 meaning low.mem
movparams%(6) = SADD(a$): 'Required for low.mem:
movparams%(7) = Segm% 'DESTINY OFFSET:SEGMENT 0
'And let us move
'---------------
codeoff% = SADD(move$): DS% = segp%: SI% = offp%
CALL absolute(DS%, SI%, codeoff%)
IF DS% THEN PRINT "MOVE BLOCK FROM XMS FAILED ON ERROR : "; HEX$(DS% AND &HFF) ELSE PRINT "SUCSES MOVEING BLOCK FROM XMS"
PRINT : COLOR 0, 7:
LOCATE 13, 1: PRINT "Getting back our first string from XMS"
COLOR 7, 0:
VIEW PRINT 15 TO 24
PRINT a$: SLEEP
'and move the original "1"back:
'--------------------------------
movparams%(0) = 22000 'NUMBER OF BYTES TO MOVE
movparams%(1) = 0 '(32 bits)=64 KB
movparams%(2) = handle% 'XNS HANDLE
movparams%(3) = 22000 'Not required for XMS
movparams%(4) = 0 'SOURCE OFFSET:SEGMENT
movparams%(5) = 0 'HANDLE= 0 meaning low.mem
movparams%(6) = SADD(a$): 'Required for low.mem:
movparams%(7) = Segm% 'DESTINY OFFSET:SEGMENT 0
3 楼
maxumi [专家分:2200] 发布于 2006-04-24 15:40:00
'And let us move
'---------------
codeoff% = SADD(move$): DS% = segp%: SI% = offp%
CALL absolute(DS%, SI%, codeoff%)
IF DS% THEN PRINT "MOVE BLOCK FROM XMS FAILED ON ERROR : "; HEX$(DS% AND &HFF) ELSE PRINT "SUCSES MOVEING BLOCK FROM XMS"
VIEW PRINT:
COLOR 0, 7: LOCATE 13, 1: PRINT "Getting back our second string from XMS"
COLOR 7, 0
VIEW PRINT 15 TO 24
'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%
'Did our moves had have sucses ?
PRINT a$: a$ = ""
'I think so, do you think so too ?
SLEEP: CLS
'----------------
'demo 2 locking:
'----------------
'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%):
IF AX% THEN PRINT "ALLOCATED REQUESTED XMS BLOCKS WITH HANDLE :"; dx% ELSE PRINT "ERROR ALLOCATING XMS "; dx%
handle% = dx% 'save handle
'Locking XMS:
'----------------
codeoff% = SADD(lock$): dx% = handle%
CALL absolute(bx%, dx%, codeoff%):
IF dx% THEN dx$ = HEX$(dx%): bx$ = HEX$(bx%): PRINT "LOCKED XMS HANDLE" + SPACE$(26) + ":"; handle%; "to segment: "; STRING$(4 - LEN(dx$), "0"); dx$; STRING$(4 - LEN(bx$), "0"); bx$ ELSE PRINT "ERROR LOCKING XMS HANDLE : "; HEX$(bx%)
'Unlocking
'----------
codeoff% = SADD(unlock$): dx% = handle%
CALL absolute(dx%, codeoff%):
IF dx% THEN PRINT "ERROR UNLOCKING XMS HANDLE "; HEX$(dx%) ELSE PRINT "UNLOCKED XMS HANDLE" + SPACE$(24) + ":"; handle%
'And deallocating
'-----------------
codeoff% = SADD(dealloc$): dx% = handle%:
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%
DEF SEG
END SUB
SUB helpjes
'-----------------------------------
'mov bx,[bp+06]
'mov dx,[bx]
'mov bx,[bx+08]
'mov bx,[bx]
'-----------------------------------
asm$ = asm$ + CHR$(&H8B) + CHR$(&H5E) + CHR$(&H6)
asm$ = asm$ + CHR$(&H8B) + CHR$(&H17)
asm$ = asm$ + CHR$(&H8B) + CHR$(&H5F) + CHR$(&H8)
asm$ = asm$ + CHR$(&H8B) + CHR$(&H1F)
'________________________________________
codeoff% = SADD(asm$)
DEF SEG = VARSEG(asm$)
CALL absolute(codeoff%)
'________________________________________
DEF SEG
END SUB
FUNCTION INT2STR$ (SWORD%)
'THIS FUNCTION IS TRANSLATING SWORD INTEGERS INTO A STRING. ITS ONLY USE
'IS WHEN YOU STILL USE ASM$ FOR ASSEMBLER FUNCTIONS( LIKE I DO). IN THAT
'CASE YOU CAN MAKE YOUR INTEGER VALUES USABLE ..
'THIS FUNCTION SIMPLY TRANSLATES THE HEXA BYTES
'INTO STRINGBYTES AS IS.
'----------------------------------------------------
DEF SEG = VARSEG(SWORD%)
PTR% = VARPTR(SWORD%)
INT2STR$ = CHR$(PEEK(PTR%)) + CHR$(PEEK(PTR% + 1))
DEF SEG
END FUNCTION
SUB POKESTRING (SEGJE%, OFFJE%, MAIN$)
'------------------------------------------------------
'THIS FUNCTION POKES A STRING (MIGHT BE ASCIIZ)INTO
'MEMORY AT A GIVEN LOCATION, MAKING IT POSSIBLE TO
'ACCESS STRINGS IN BYTE FORM
'------------------------------------------------------
DEF SEG = SEGJE%
FOR i% = 0 TO LEN(MAIN$) - 1
POKE OFFJE% + i%, ASC(MID$(MAIN$, i% + 1, 1))
NEXT
DEF SEG
END SUB
SUB PROCSEGMENT (LENGTH%)
'------------------------------------------------------------------------
'THIS SUB IS GIVING THE MINIMAL REQUIREMENTS FOR AN PROCEDURE SEGMENT.
'IN GENERAL THIS PROC SEGMENT SHOULD BE PART OF YOUR MAIN PROGRAM.
'------------------------------------------------------------------------
'PROC
'-----
DIM PROCS%(LENGTH%)
PROCSEG% = VARSEG(PROCS%(0)): PROCOFF% = VARPTR(PROCS%(0))
PRNOFF% = PROCOFF% + LEN(NEWINT$): PROCOFF$ = INT2STR$(PROCOFF%)
'CODE
'-----
asm$ = asm$ + CHR$(&H9A) + NEWINTOFF$ + PROCSEG$ 'CALL PROCSEG[NEWINTOFF$]
END SUB
4 楼
maxumi [专家分:2200] 发布于 2006-04-24 15:41:00
FUNCTION XMM.DETECT%
'------------------------------------------------------------
'THIS FUNCTION RETURNS IF XMS MEMORY MANAGER INSTALLED
'STACKPASSING :AX%
'IN:
'OUT :AX% = &H0080 XMM INSTALLED
'ERRORRETURN :AX% <> &H0080 XMM NOT INSTALLED( QBASIC:AX%=0)
'------------------------------------------------------------
asm$ = asm$ + CHR$(&H55) 'PUSH BP
asm$ = asm$ + CHR$(&H89) + CHR$(&HE5) 'MOV BP,SP
asm$ = asm$ + CHR$(&H50) 'PUSH AX
asm$ = asm$ + CHR$(&HB8) + CHR$(&H0) + CHR$(&H43) 'MOV AX,4300
asm$ = asm$ + CHR$(&HCD) + CHR$(&H2F) 'INT 2F
asm$ = asm$ + CHR$(&H3C) + CHR$(&H80) 'CMP AL,80
asm$ = asm$ + CHR$(&H74) + CHR$(&H2) 'JZ 2
asm$ = asm$ + CHR$(&H31) + CHR$(&HC0) 'XOR AX,AX
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
XMM.DETECT% = AX%
END FUNCTION
FUNCTION XMS.ALLOC$ (es%, bx%)
'----------------------------------------------------------------
'THIS FUNCTION RETURNS IF FREE AND TOTAL XMS MEMORY
'STACKPASSING :AX%,DX%
'IN: :ES[BX] DRIVER ENTRIE
' DX% NUMBER OF KB BLOCKS REQUESTED
'OUT :AX% = 0 FAIL , AX%=1 SUCSES
' DX% = HANDLE /ERROR
'----------------------------------------------------------------
'INIT
'-----
es$ = INT2STR$(es%): bx$ = INT2STR$(bx%)
'------------------------------------------------------------------------
asm$ = asm$ + CHR$(&H55)
asm$ = asm$ + CHR$(&H89) + CHR$(&HE5)
asm$ = asm$ + CHR$(&H50)
asm$ = asm$ + CHR$(&H52)
asm$ = asm$ + CHR$(&HB4) + CHR$(&H9) 'MOV AH,9
asm$ = asm$ + CHR$(&H8B) + CHR$(&H5E) + CHR$(&H6) 'MOV BX,[BP+06]
asm$ = asm$ + CHR$(&H8B) + CHR$(&H17) 'MOV DX,[BX] 1 KB BLOCKS
asm$ = asm$ + CHR$(&H9A) + bx$ + es$ 'CALL DRIVER
asm$ = asm$ + CHR$(&H9) + CHR$(&HC0) 'OR AX,AX
asm$ = asm$ + CHR$(&H75) + CHR$(&H2) 'JNZ 2
asm$ = asm$ + CHR$(&H89) + CHR$(&HDA) 'MOV DX,BX
asm$ = asm$ + CHR$(&H8B) + CHR$(&H5E) + CHR$(&H6) 'MOV BX,[BP+06]
asm$ = asm$ + CHR$(&H89) + CHR$(&H17) 'MOV [BX],DX
asm$ = asm$ + CHR$(&H8B) + CHR$(&H5E) + CHR$(&H8) 'MOV BX,[BP+08]
asm$ = asm$ + CHR$(&H89) + CHR$(&H7) 'MOV [BX],AX
asm$ = asm$ + CHR$(&H5A) 'POP AX
asm$ = asm$ + CHR$(&H58) 'POP DX
asm$ = asm$ + CHR$(&H5D) 'POP BP
asm$ = asm$ + CHR$(&HCA) + CHR$(&H4) + CHR$(&H0) 'RETF 4
XMS.ALLOC$ = asm$
END FUNCTION
5 楼
maxumi [专家分:2200] 发布于 2006-04-24 15:41:00
FUNCTION xms.dealloc$ (es%, bx%)
'----------------------------------------------------------------
'THIS FUNCTION FREES ALLOCATED XMS MEMORY BLOCKS
'STACKPASSING :DX%
'IN: :ES[BX] DRIVER ENTRIE
' DX% HANDLE OF XMS BLOCK ALLOCATED
'OUT :AX% = 0 FAIL , AX%=1 SUCSES
' BL% = ERROR
' QBASIC : RETURNS DX%=1 SUCSES ELSE ERRORCODE
'----------------------------------------------------------------
'INIT
'-----
es$ = INT2STR$(es%): bx$ = INT2STR$(bx%):
'------------------------------------------------------------------------
asm$ = asm$ + CHR$(&H55) 'PUSH BP
asm$ = asm$ + CHR$(&H89) + CHR$(&HE5) 'MOV BP,SP
asm$ = asm$ + CHR$(&H50) 'PUSH AX
asm$ = asm$ + CHR$(&H52) 'PUSH DX
asm$ = asm$ + CHR$(&HB4) + CHR$(&HA) 'MOV AH,A
asm$ = asm$ + CHR$(&H8B) + CHR$(&H5E) + CHR$(&H6) 'MOV BX,[BP+06]
asm$ = asm$ + CHR$(&H8B) + CHR$(&H17) 'MOV DX,[BX] HANDLE
asm$ = asm$ + CHR$(&H9A) + bx$ + es$ 'CALL DRIVER
asm$ = asm$ + CHR$(&H9) + CHR$(&HC0) 'OR AX,AX
asm$ = asm$ + CHR$(&H75) + CHR$(&H2) 'JNZ 2
asm$ = asm$ + CHR$(&H89) + CHR$(&HD9) 'MOV AX,BX
asm$ = asm$ + CHR$(&H8B) + CHR$(&H5E) + CHR$(&H6) 'MOV BX,[BP+06]
asm$ = asm$ + CHR$(&H89) + CHR$(&H7) 'MOV [BX],AX
asm$ = asm$ + CHR$(&H5A) 'POP dX
asm$ = asm$ + CHR$(&H58) 'POP aX
asm$ = asm$ + CHR$(&H5D) 'POP BP
asm$ = asm$ + CHR$(&HCA) + CHR$(&H2) + CHR$(&H0) 'RETF 2
xms.dealloc$ = asm$
END FUNCTION
SUB XMS.DISPATCH (es%, bx%)
'----------------------------------------------------------------
'THIS FUNCTION IS A DISPATCHER FOR ALL EXTENDED MEMORY FUNCTIONS
' (8-F)
'YOU SHOULD HAVE EXECUTED THE FUNCTIONS XMS.DETECT AND XMS.ENTRIE FIRST
'STACKPASSING :AX%,BX%,DSDX%
'IN/ OUT :AX% AX
' :BX% BX
' :DSDX% DS OR DX DEPENDING ON THE REQUESTED FORMAT
'OUT(GENERAL) :AX% = 0 FAIL , AX%=1 SUCSES
' DX% = HANDLE /ERROR
' BX% LOW BYTE= ERRORCODE
'LOOK FOR SPECIFICS FOR FUNCTIONS IN THE XMS.DOC SUB
'THIS FUNCTION CAN BE INITIALIZED!
'----------------------------------------------------------------
'INIT DRIVER ENTRIE
'-------------------
es$ = INT2STR$(es%): bx$ = INT2STR$(bx%)
'------------------------------------------------------------------------
asm$ = asm$ + CHR$(&H55)
asm$ = asm$ + CHR$(&H89) + CHR$(&HE5)
asm$ = asm$ + CHR$(&H50)
asm$ = asm$ + CHR$(&H52)
asm$ = asm$ + CHR$(&HB4) + CHR$(&H9) 'MOV AH,9
asm$ = asm$ + CHR$(&H8B) + CHR$(&H5E) + CHR$(&H6) 'MOV BX,[BP+06]
asm$ = asm$ + CHR$(&H8B) + CHR$(&H17) 'MOV DX,[BX] 1 KB BLOCKS
asm$ = asm$ + CHR$(&H9A) + bx$ + es$ 'CALL DRIVER
asm$ = asm$ + CHR$(&H9) + CHR$(&HC0) 'OR AX,AX
asm$ = asm$ + CHR$(&H75) + CHR$(&H2) 'JNZ 2
asm$ = asm$ + CHR$(&H89) + CHR$(&HDA) 'MOV DX,BX
asm$ = asm$ + CHR$(&H8B) + CHR$(&H5E) + CHR$(&H6) 'MOV BX,[BP+06]
asm$ = asm$ + CHR$(&H89) + CHR$(&H17) 'MOV [BX],DX
asm$ = asm$ + CHR$(&H8B) + CHR$(&H5E) + CHR$(&H8) 'MOV BX,[BP+08]
asm$ = asm$ + CHR$(&H89) + CHR$(&H7) 'MOV [BX],AX
asm$ = asm$ + CHR$(&H5A) 'POP AX
asm$ = asm$ + CHR$(&H58) 'POP DX
asm$ = asm$ + CHR$(&H5D) 'POP BP
asm$ = asm$ + CHR$(&HCA) + CHR$(&H4) + CHR$(&H0) 'RETF 4
'________________________________________
codeoff% = SADD(asm$)
DEF SEG = VARSEG(asm$)
CALL absolute(AX%, dx%, codeoff%)
'________________________________________
END SUB
6 楼
maxumi [专家分:2200] 发布于 2006-04-24 15:42:00
SUB XMS.ENTRIE (es%, bx%)
'--------------------------------------------------
'THIS FUNCTION DETECTS DRIVER ENTRIE,
'THE FREE XMS SIZE AND TOTAL XMS SIZE
'STACK PASSING : ES%,BX%
'IN :
'OUT : ES%= DRIVER ENTRIE SEGMENT
' BX%= DRIVER ENTRIE OFFSET
'--------------------------------------------------
asm$ = asm$ + CHR$(&H55) 'PUSH BP
asm$ = asm$ + CHR$(&H89) + CHR$(&HE5) 'MOV BP,SP
asm$ = asm$ + CHR$(&H50) 'PUSH AX
asm$ = asm$ + CHR$(&H53) 'PUSH BX
asm$ = asm$ + CHR$(&H6) 'PUSH ES
asm$ = asm$ + CHR$(&HB8) + CHR$(&H10) + CHR$(&H43) 'MOV AX,4310
asm$ = asm$ + CHR$(&HCD) + CHR$(&H2F) 'INT 2F GET DRIVER ENTRIE
asm$ = asm$ + CHR$(&H89) + CHR$(&HD8) 'MOV AX,BX (NEED TO STORE BX)
asm$ = asm$ + CHR$(&H8B) + CHR$(&H5E) + CHR$(&H8) 'MOV BX,[BP+08]
asm$ = asm$ + CHR$(&H8C) + CHR$(&H7) 'MOV [BX],ES SEG DRIVER
asm$ = asm$ + CHR$(&H8B) + CHR$(&H5E) + CHR$(&H6) 'MOV BX,[BP+06]
asm$ = asm$ + CHR$(&H89) + CHR$(&H7) 'MOV [BX],AX OFF DRIVER
asm$ = asm$ + CHR$(&H7) 'POP ES
asm$ = asm$ + CHR$(&H5B) 'POP BX
asm$ = asm$ + CHR$(&H58) 'POP AX
asm$ = asm$ + CHR$(&H5D) 'POP BP
asm$ = asm$ + CHR$(&HCA) + CHR$(&H4) + CHR$(&H0) 'RETF 4
'________________________________________
codeoff% = SADD(asm$)
DEF SEG = VARSEG(asm$)
CALL absolute(es%, bx%, codeoff%)
'________________________________________
DEF SEG
END SUB
FUNCTION XMS.FREE$ (es%, bx%)
'----------------------------------------------------------------
'THIS FUNCTION RETURNS IF FREE AND TOTAL XMS MEMORY
'STACKPASSING :AX%,DX%
'IN: :ES[BX] DRIVER ENTRIE
'OUT :AX% = FREE XMS
' DX% = TOTAL XMS
'----------------------------------------------------------------
'INIT
'-----
es$ = INT2STR$(es%): bx$ = INT2STR$(bx%)
'----------------------------------------------------------------
asm$ = ""
asm$ = asm$ + CHR$(&H55) 'PUSH BP
asm$ = asm$ + CHR$(&H89) + CHR$(&HE5) 'MOV BP,SP
asm$ = asm$ + CHR$(&H50) 'PUSH AX
asm$ = asm$ + CHR$(&H53) 'PUSH BX
asm$ = asm$ + CHR$(&H52) 'PUSH DX
asm$ = asm$ + CHR$(&HB4) + CHR$(&H8) 'MOV AH,0800 QUERY FREE XMS
asm$ = asm$ + CHR$(&H9A) + bx$ + es$ 'CALL DRIVER
asm$ = asm$ + CHR$(&H8B) + CHR$(&H5E) + CHR$(&H6) 'MOV BX,[BP+06]
asm$ = asm$ + CHR$(&H89) + CHR$(&H17) 'MOV [BX],DX
asm$ = asm$ + CHR$(&H8B) + CHR$(&H5E) + CHR$(&H8) 'MOV BX,[BP+08]
asm$ = asm$ + CHR$(&H89) + CHR$(&H7) 'MOV [BX],AX
asm$ = asm$ + CHR$(&H5A) 'POP DX
asm$ = asm$ + CHR$(&H5B) 'POP BX
asm$ = asm$ + CHR$(&H58) 'POP AX
asm$ = asm$ + CHR$(&H5D) 'POP BP
asm$ = asm$ + CHR$(&HCA) + CHR$(&H4) + CHR$(&H0) 'RETF 4
7 楼
maxumi [专家分:2200] 发布于 2006-04-24 15:43:00
XMS.FREE$ = asm$
END FUNCTION
FUNCTION xms.lock$ (es%, bx%)
'----------------------------------------------------------------
'THIS FUNCTION LOCKS XMS and return fysical adress
'STACKPASSING :BX%,DX%
'IN: :ES[BX] DRIVER ENTRIE
' DX% NUMBER OF KB BLOCKS REQUESTED
'OUT :AX% = 0 FAIL , AX%=1 SUCSES
' DX%:BX% = LINEAR ADRESS/ERROR(in BL)
'QBASIC return 0 in DX% on error
'----------------------------------------------------------------
'INIT
'-----
es$ = INT2STR$(es%): bx$ = INT2STR$(bx%)
'------------------------------------------------------------------------
asm$ = ""
asm$ = asm$ + CHR$(&H55) 'push bp
asm$ = asm$ + CHR$(&H89) + CHR$(&HE5) 'mov bp,sp
asm$ = asm$ + CHR$(&H50) 'push ax
asm$ = asm$ + CHR$(&H52) 'push dx
asm$ = asm$ + CHR$(&HB4) + CHR$(&HC) 'MOV AH,C
asm$ = asm$ + CHR$(&H8B) + CHR$(&H5E) + CHR$(&H6) 'MOV BX,[BP+06]
asm$ = asm$ + CHR$(&H8B) + CHR$(&H17) 'MOV DX,[BX] handle
asm$ = asm$ + CHR$(&H9A) + bx$ + es$ 'CALL DRIVER
asm$ = asm$ + CHR$(&H9) + CHR$(&HC0) 'OR AX,AX
asm$ = asm$ + CHR$(&H75) + CHR$(&H4) 'JNZ 4
asm$ = asm$ + CHR$(&H30) + CHR$(&HFF) 'XOR BH,BH 'to zero on error
asm$ = asm$ + CHR$(&H89) + CHR$(&HDA) 'MOV DX,BX 'and put in DX
asm$ = asm$ + CHR$(&H89) + CHR$(&HD8) 'mov ax,bx 'need bx
asm$ = asm$ + CHR$(&H8B) + CHR$(&H5E) + CHR$(&H6) 'MOV BX,[BP+06]
asm$ = asm$ + CHR$(&H89) + CHR$(&H17) 'MOV [BX],DX
asm$ = asm$ + CHR$(&H8B) + CHR$(&H5E) + CHR$(&H8) 'MOV BX,[BP+08]
asm$ = asm$ + CHR$(&H89) + CHR$(&H7) 'MOV [BX],AX
asm$ = asm$ + CHR$(&H5A) 'POP AX
asm$ = asm$ + CHR$(&H58) 'POP DX
asm$ = asm$ + CHR$(&H5D) 'POP BP
asm$ = asm$ + CHR$(&HCA) + CHR$(&H4) + CHR$(&H0) 'RETF 4
xms.lock$ = asm$
END FUNCTION
FUNCTION XMS.MOVE$ (es%, bx%)
'----------------------------------------------------------------
'THIS FUNCTION MOVES MEMORY BLOCKS TO XMS
'STACKPASSING :DS%,SI%
'IN: :DS[SI] PTR TO MOVESTRUCTURE
'
'DW : NR OF BYTES TO MOVE
'W : HANDLE SOURCE: 0000 FOR LOW MEM
'DW : OFFSET:SEGMENT OF SOURCE
'W : HANDLE DESTINY: XMS HANDLE
'DW : OFFSET:SEGMENT OF DESTINY 0000 FOR XMS
' ES[BX] DRIVER ENTRIE
'OUT :AX = 0 FAIL , AX%=1 SUCSES
' BL = ERROR
'QBASIC: DS%= 0 SUCSES
' ELSE ERRORCODE
8 楼
maxumi [专家分:2200] 发布于 2006-04-24 15:43:00
'----------------------------------------------------------------
'INIT
'-----
es$ = INT2STR$(es%): bx$ = INT2STR$(bx%)
'------------------------------------------------------------------------
asm$ = ""
asm$ = asm$ + CHR$(&H55) 'Push AX
asm$ = asm$ + CHR$(&H89) + CHR$(&HE5) 'MOV BP,SP
asm$ = asm$ + CHR$(&H56) 'Push SI
asm$ = asm$ + CHR$(&H1E) 'Push DS
asm$ = asm$ + CHR$(&HB4) + CHR$(&HB) 'MOV AH,B
asm$ = asm$ + CHR$(&H8B) + CHR$(&H5E) + CHR$(&H6) 'MOV BX,[BP+06]
asm$ = asm$ + CHR$(&H8B) + CHR$(&H37) 'MOV SI,[BX] OFFSET
asm$ = asm$ + CHR$(&H8B) + CHR$(&H5E) + CHR$(&H8) 'MOV BX,[BP+08]
asm$ = asm$ + CHR$(&H8E) + CHR$(&H1F) 'MOV DS,[BX] SEGMENT
asm$ = asm$ + CHR$(&H9A) + bx$ + es$ 'CALL DRIVER
asm$ = asm$ + CHR$(&H9) + CHR$(&HC0) 'OR AX,AX 'SUCSES ?
asm$ = asm$ + CHR$(&H74) + CHR$(&H2) 'JZ 2 'NO ? JUMP
asm$ = asm$ + CHR$(&H31) + CHR$(&HDB) 'XOR BX,BX
asm$ = asm$ + CHR$(&H89) + CHR$(&HD8) 'MOV AX,BX
asm$ = asm$ + CHR$(&H1F) 'POP DS 'have to restore before [bx] is adressed
asm$ = asm$ + CHR$(&H8B) + CHR$(&H5E) + CHR$(&H8) 'MOV BX,[BP+08]
asm$ = asm$ + CHR$(&H89) + CHR$(&H7) 'MOV [BX],AX
asm$ = asm$ + CHR$(&H5E) 'POP SI
asm$ = asm$ + CHR$(&H5D) 'POP BP
asm$ = asm$ + CHR$(&HCA) + CHR$(&H4) + CHR$(&H0) 'RETF 4
XMS.MOVE$ = asm$
END FUNCTION
FUNCTION xms.realloc$ (es%, bx%)
'----------------------------------------------------------------
'THIS FUNCTION REALLOCATES AN ALREADY ALLOCATED XMS_HANDLE
'STACKPASSING :BX%,DX%
'IN: :BX% New request( KB)
' DX% XMS Handle
'OUT :AX% = 0 FAIL , AX%=1 SUCSES
' BL% = ERROR
'QBSASIC :DX% returns errorcode or 1
'----------------------------------------------------------------
'INIT
'-----
es$ = INT2STR$(es%): bx$ = INT2STR$(bx%)
'------------------------------------------------------------------------
asm$ = asm$ + CHR$(&H55) 'push bp
asm$ = asm$ + CHR$(&H89) + CHR$(&HE5) 'mov bp,sp
asm$ = asm$ + CHR$(&H50) 'push ax
asm$ = asm$ + CHR$(&H52) 'push dx
9 楼
maxumi [专家分:2200] 发布于 2006-04-24 15:44:00
asm$ = asm$ + CHR$(&HB4) + CHR$(&HF) 'MOV AH,F
asm$ = asm$ + CHR$(&H8B) + CHR$(&H5E) + CHR$(&H6) 'MOV BX,[BP+06]
asm$ = asm$ + CHR$(&H8B) + CHR$(&H17) 'MOV DX,[BX] XMS handle
asm$ = asm$ + CHR$(&H8B) + CHR$(&H5F) + CHR$(&H8) 'MOV BX,[BP+08]
asm$ = asm$ + CHR$(&H8B) + CHR$(&H1F) 'MOV BX,[BX]
asm$ = asm$ + CHR$(&H9A) + bx$ + es$ 'CALL DRIVER
asm$ = asm$ + CHR$(&H9) + CHR$(&HC0) 'OR AX,AX
asm$ = asm$ + CHR$(&H75) + CHR$(&H2) 'JNZ 2
asm$ = asm$ + CHR$(&H89) + CHR$(&HD9) 'MOV AX,BX
asm$ = asm$ + CHR$(&H8B) + CHR$(&H5E) + CHR$(&H6) 'MOV BX,[BP+06]
asm$ = asm$ + CHR$(&H89) + CHR$(&H7) 'MOV [BX],AX
asm$ = asm$ + CHR$(&H5A) 'POP dX
asm$ = asm$ + CHR$(&H58) 'POP aX
asm$ = asm$ + CHR$(&H5D) 'POP BP
asm$ = asm$ + CHR$(&HCA) + CHR$(&H4) + CHR$(&H0) 'RETF 4
xms.realloc$ = asm$
END FUNCTION
FUNCTION xms.unlock$ (es%, bx%)
'----------------------------------------------------------------
'THIS FUNCTION UNLOCKS XMS HANDLE
'STACKPASSING :DX%
'IN: :ES[BX] DRIVER ENTRIE
' DX% HANDLE
'OUT :AX = 0 FAIL , AX%=1 SUCSES
' BL = ERROR(in BL)
'QBASIC returns BX%=0 or error
'----------------------------------------------------------------
'INIT
'-----
es$ = INT2STR$(es%): bx$ = INT2STR$(bx%)
'------------------------------------------------------------------------
asm$ = ""
asm$ = asm$ + CHR$(&H55) 'push bp
asm$ = asm$ + CHR$(&H89) + CHR$(&HE5) 'mov bp,sp
asm$ = asm$ + CHR$(&H50) 'push ax
asm$ = asm$ + CHR$(&H52) 'push dx
asm$ = asm$ + CHR$(&HB4) + CHR$(&HD) 'MOV AH,D
asm$ = asm$ + CHR$(&H8B) + CHR$(&H5E) + CHR$(&H6) 'MOV BX,[BP+06]
asm$ = asm$ + CHR$(&H8B) + CHR$(&H17) 'MOV DX,[BX] handle
asm$ = asm$ + CHR$(&H9A) + bx$ + es$ 'CALL DRIVER
asm$ = asm$ + CHR$(&H9) + CHR$(&HC0) 'OR AX,AX
asm$ = asm$ + CHR$(&H75) + CHR$(&H2) 'JNZ 2
asm$ = asm$ + CHR$(&H89) + CHR$(&HD9) 'MOV AX,BX
asm$ = asm$ + CHR$(&H8B) + CHR$(&H5E) + CHR$(&H6) 'MOV BX,[BP+06]
asm$ = asm$ + CHR$(&H89) + CHR$(&H7) 'MOV [BX],AX
asm$ = asm$ + CHR$(&H5A) 'POP AX
asm$ = asm$ + CHR$(&H58) 'POP DX
asm$ = asm$ + CHR$(&H5D) 'POP BP
asm$ = asm$ + CHR$(&HCA) + CHR$(&H2) + CHR$(&H0) 'RETF 2
xms.unlock$ = asm$
END FUNCTION
10 楼
maxumi [专家分:2200] 发布于 2006-04-24 15:45:00
[em10][em10][em10][em10][em10]终于贴完了......[em10][em10][em10][em10][em10]
我来回复