107c ; XMS.ASM (XMS.LIB) ; ;Externa XMS-rutiner f”r MASM ; ;Inparametrar: ; xms_alloc : DX = size in kb ; xms_free : DX = handle ; xms_move : SI = pekare till XMS-struktur ; xms_load : DX = offset till filnamn ;Returv„rden: ; xms_setup: AX = 0 om ingen XMS-drivrutin (HIMEM.SYS) aktiv. ; ”vriga rutiner: bl = 0 om OK, annars error code ; xms_alloc : AX = XMS-handle ; xms_load : AX = 0 vid fel, annars den inladdade filens XMS-handle ; w EQU word ptr INCLUDE DOS.INC .MODEL SMALL .386 .DATA? mstr STRUCT len dd 0 ; 32-bit number of bytes to transfer shand dw 0 ; Handle of source block soff dd 0 ; 32-bit offset into source block dhand dw 0 ; Handle of dest block doff dd 0 ; 32-bit offset into dest block mstr ENDS ms mstr <> xmsdriver dd ? PUBLIC xms_freemem PUBLIC xms_totmem xms_freemem dw ? xms_totmem dw ? fsize dd ? tempseg dw ? handle dw ? xms_handle dw ? numread dw ? .CODE PUBLIC xms_setup PUBLIC xms_get_freemem PUBLIC xms_alloc PUBLIC xms_free PUBLIC xms_move PUBLIC xms_load xms_setup PROC mov ax,4300h ; XMS Driver installation check int 2fh cmp al,80h ; returns 80h if installed jz xmsfound mov ax,0 ; XMS Driver not present jmp exit_setup xmsfound: mov ax,4310h ; get address of XMS driver int 2fh mov w[xmsdriver],bx ; store offset mov w[xmsdriver+2],es ; store segment mov ax,1 exit_setup: ret xms_setup ENDP xms_get_freemem PROC mov ah,8 call xmsdriver mov xms_freemem,ax mov xms_totmem,dx ret xms_get_freemem ENDP xms_alloc PROC mov ah,09 call xmsdriver ; call the XMS driver mov ax,dx ; return handle in AX ret xms_alloc ENDP xms_free PROC mov ah,0ah call xmsdriver ; call the XMS driver ret xms_free ENDP xms_move PROC mov ah,0bh xor bl,bl ; reset error code to zero call xmsdriver ; call the XMS driver ret xms_move ENDP ;------------------------------------------------------------------- xms_load PROC @OpenFile dx,0 jc error mov handle,ax @GetFileSize handle mov w[fsize[2]],dx mov w[fsize[0]],ax mov bx,1024 ;Konvertera filstorlek fr†n bytes div bx ;till kilobytes cmp dx,0 jz no_quotient add ax,1 no_quotient: mov dx,ax ;Allokera XMS-minne call xms_alloc cmp bl,0 jnz error mov xms_handle,ax mov ax,32768/16 @GetBlock ax ;Allokera 32 kb mellan-buffer i jc error ;konventionellt minne mov tempseg,ax mov ms.doff,0 ;Start-Offset i XMS = 0 next: mov si,tempseg push ds ;L„s in 32768 bytes i temp @Read 0,32768,handle,si pop ds mov numread,ax ;Spara antalet l„sta bytes mov edx,0 mov dx,numread bt dx,0 ;Klarar tydligen inte av jnc not_odd ;udda l„ngd (?????) add dx,1 not_odd: mov ms.len,edx mov ms.shand,0 mov edx,0 mov dx,tempseg shl edx,16 mov ms.soff,edx mov dx,xms_handle mov ms.dhand,dx mov si,offset ms call xms_move ;Flytta data till XMS cmp numread,32768 jnz reddy add ms.doff,32768 ;™ka destinations-offset jmp next ;N„sta 32Kb om inte filslut n†tts reddy: @CloseFile handle mov es,tempseg ;Frig”r temp-bufferten i conventional @FreeBlock mov ax,xms_handle ;Returnera XMS-handle i AX jmp no_err error: mov ax,0 no_err: ret xms_load ENDP END . 0