;**********************************************************************
;* A T O M X M S *
;**********************************************************************
;* XMS ondersteuning voor Atom-in-PC *
;**********************************************************************
;* Auteur: Roland Leurs *
;* Datum: 06 juli 1997 *
;**********************************************************************
XMSPAGES DB 0 ;DEFAULT GEEN XMS GEHEUGEN GERESERVEERD
XMSCURPAG DB 0 ;XMS CURRENT PAGE IN BUFFER
XMSHANDLE DW (?) ;HANDLE VOOR XMS GEHEUGENBLOK
XMSDRV EQU THIS DWORD ;STARTADRES XMS DRIVER (HIMEM.SYS)
XMSOFS DW (?) ;OFFSETADRES XMS FUNCTIES
XMSSEG DW (?) ;SEGMENTADRES XMS FUNCTIES
COPYTBL DW 8 DUP (?) ;DATA TABEL VOOR KOPIEERROUTINE
XMSFILE DW 2 DUP (0) ;XMS FILE POINTER
XMS: CALL LEESBYTE ;LEES XMS COMMANDO VAN ATOM
MOV FUN_CODE,AL ;SLA COMMANDO OP IN WERKRUIMTE
CMP AL,10H ;TEST OP GELDIG COMMANDO
JAE XMS_ERR ;SPRING INDIEN ONGELDIG COMMANDO
XOR AH,AH ;BEREKEN INDEX VOOR COMMANDO TABEL
SHL AX,1
MOV DI,AX ;ZET OFFSET IN INDEX REGISTER
JMP WORD PTR COMTB[DI];SPRING NAAR COMMANDO
XMS_ERR: JMP ERROR ;GEEF FOUTMELDING
;-----------------------------------------------------------------------
; COMMANDO TABEL
;-----------------------------------------------------------------------
COMTB: DW XMSINFO,XMSLDPG,XMSLDPG,XMSLDPG
DW XMS_ERR,XMS_ERR,XMS_ERR,XMS_ERR
DW XMS_ERR,XMS_ERR,XMS_ERR,XMS_ERR
DW XMS_ERR,XMS_ERR,XMS_ERR,XMS_ERR
;-----------------------------------------------------------------------
; SUBROUTINES VOOR COMMANDO'S
;-----------------------------------------------------------------------
GETPGNR PROC NEAR ;TEST OF OPGEGEVEN PAGINA NUMMER GELDIG IS
CALL LEESBYTE ;LEES PAGINANUMMER VAN ATOM
GETPGNR1: CMP XMSPAGES,AL ;VOER VERGELIJKING UIT
JAE VALPAGE ;ALS GELDIG SPRINGEN
STC ;ZET CARRY, PAGINA IS NIET GELDIG
JMP SHORT ENDTEST ;SPRING ALTIJD
VALPAGE: CLC ;WIS CARRY, PAGINA IS GELDIG
ENDTEST: RET ;EINDE ROUTINE
GETPGNR ENDP
ADRES PROC NEAR ;LEEST ADRES VAN ATOM IN BX REGISTER
PUSH AX ;SAVE AX
CALL LEESBYTE ;LEES LAGE BYTE VAN ATOM
MOV BL,AL ;ZET IN BL REGISTER
CALL LEESBYTE ;LEES HOGE BYTE VAN ATOM
MOV BH,AL ;ZET IN BH REGISTER
SUB BX,4000H ;OFFSET ALLEEN TUSSEN 0-3FFFH TOEGESTAAN
CMP BX,4000H
JB ADRES1 ;SPRING INDIEN OFFSET GELDIG IS
STC ;ZET CARRY VOOR FOUT
JMP SHORT ADRES2
ADRES1: CLC ;WIS CARRY
ADRES2: POP AX ;HAAL AX TERUG
RET ;EINDE ROUTINE MET ATOM ADRES IN BX
ADRES ENDP
XMSADRES PROC NEAR ;BEREKEN ADRES IN XMS GEHEUGEN
MOV DX,4000H ;LAADT DX MET CONSTANTE
XOR AH,AH ;AX = PAGINA NUMMER
MUL DX ;DX:AX = 16K*PAGINANUMMER
ADD AX,BX ;TEL DAAR DE OFFSET BIJ
RET
XMSADRES ENDP ;OFFSET ADRES STAAT NU IN DX:AX
XMS2BUF PROC NEAR ;KOPIEER PAGINA VAN XMS NAAR BUFFER
PUSH AX ;SAVE GEBRUIKTE REGISTERS
PUSH BX
PUSH DX
MOV XMSCURPAG,AL ;ZET NIEUW XMS PAGINANUMMER IN CURRENT PAGE
MOV COPYTBL[0],4000H ;ZET BLOKLENGTE IN DATATABEL
MOV COPYTBL[2],0000H
MOV DX,XMSHANDLE ;ZET HANDLE IN DATATABEL
MOV COPYTBL[4],DX
XOR BX,BX ;CLEAR OFFSET
CALL XMSADRES ;BEREKEN ADRES IN DX:AX
MOV COPYTBL[6],AX ;ZET ADRES IN DATATABEL
MOV COPYTBL[8],DX
MOV COPYTBL[10],0 ;COPY NAAR CONVENTIONEEL GEHEUGEN
MOV DX,OFFSET XMSBUFFER ;ZET BUFFER ADRES IN TABEL
MOV COPYTBL[12],DX
MOV COPYTBL[14],DS
MOV AH,0BH ;LAADT FUNCTIENUMMER
LEA SI,COPYTBL ;LAADT POINTER NAAR TABEL
CALL DWORD PTR [XMSDRV] ;VOER OPDRACHT UIT
X2BOK: POP DX ;GEBRUIKTE REGISTERS TERUGHALEN
POP BX
POP AX
RET ;EINDE ROUTINE
XMS2BUF ENDP
BUF2XMS PROC NEAR ;KOPIEER PAGINA VAN BUFFER NAAR XMS
PUSH AX ;SAVE GEBRUIKTE REGISTERS
PUSH BX
PUSH DX
MOV COPYTBL[0],4000H ;ZET BLOKLENGTE IN DATATABEL
MOV COPYTBL[2],0000H
MOV COPYTBL[4],0 ;COPY NAAR XMS GEHEUGEN
MOV DX,OFFSET XMSBUFFER ;ZET BUFFER ADRES IN TABEL
MOV COPYTBL[6],DX
MOV COPYTBL[8],DS
MOV DX,XMSHANDLE ;ZET HANDLE IN DATATABEL
MOV COPYTBL[10],DX
XOR BX,BX ;CLEAR OFFSET
CALL XMSADRES ;BEREKEN ADRES IN DX:AX
MOV COPYTBL[12],AX ;ZET ADRES IN DATATABEL
MOV COPYTBL[14],DX
MOV AH,0BH ;LAADT FUNCTIENUMMER
LEA SI,COPYTBL ;LAADT POINTER NAAR TABEL
CALL DWORD PTR [XMSDRV] ;VOER OPDRACHT UIT
B2XOK: POP DX ;GEBRUIKTE REGISTERS TERUGHALEN
POP BX
POP AX
RET ;EINDE ROUTINE
BUF2XMS ENDP
XMSAT2PC PROC NEAR ;LEEST XMS BUFFER VAN ATOM
PUSH AX ;SAVE REGISTERS
PUSH DI
MOV DI,0000H ;RESET POINTER
XATOM2PC: CALL LEESBYTE ;LEES BYTE
MOV XMSBUFFER[DI],AL ;ZET DATA IN BUFFER
INC DI ;VERHOOG POINTER
CMP DI,4000H ;ALLES GELEZEN
JNE XATOM2PC ;NEE, DAN VOLGENDE BYTE
POP DI ;HERSTEL REGISTERS
POP AX
RET ;EINDE ROUTINE
XMSAT2PC ENDP
XMSPC2AT PROC NEAR ;SCHRIJFT XMS BUFFER NAAR ATOM
PUSH AX ;SAVE REGISTERS
PUSH SI
MOV SI,0000H ;RESET POINTER
XPC2ATOM: MOV AL,XMSBUFFER[SI] ;ZET DATA IN BUFFER
CALL ZENDBYTE ;STUUR BYTE NAAR ATOM
INC SI ;VERHOOG POINTER
CMP SI,4000H ;ALLES GELEZEN
JNE XPC2ATOM ;NEE, DAN VOLGENDE BYTE
POP SI ;HERSTEL REGISTERS
POP AX
RET ;EINDE ROUTINE
XMSPC2AT ENDP
;-----------------------------------------------------------------------
; COMMANDO'S
;-----------------------------------------------------------------------
; functie 0: versie opvragen xmsinfo
; -invoer: geen
; -uitvoer: versienummer
; releasenummer
; aantal xms pagina's
;
; functie 1: pagina voorzetten xmsldpg
; -invoer: nieuw paginanummer
; -uitvoer: (direct na opgave van paginanummer) statuscode
; 16 kb data
; opmerking: bij dit commando wordt de huidige
; pagina niet opgeslagen in xmsgeheugen
;
; functie 2: pagina voorzetten xmsldpg
; -invoer: huidig paginanummer
; 16 kb data
; -uitvoer: (direct na opgave van paginanummer) statuscode
; opmerking: bij dit commando wordt de nieuwe
; pagina niet gelezen in het atomgeheugen
;
; functie 3: pagina voorzetten xmsldpg
; -invoer: huidig paginanummer
; 16 kb data
; nieuw paginanummer
; -uitvoer: (direct na opgave van paginanummers) statuscode
; 16 kb data
; opmerking: de huidige pagina wordt opgeslagen in
; het xms geheugen en de nieuwe pagina
; wordt in het atomgeheugen gelezen
;
;-----------------------------------------------------------------------
XMSINFO: MOV AX,02H ;AL=VERSIENUMMER
CALL ZENDBYTE ;STUUR NAAR ATOM
MOV AL,00H ;AL=RELEASE NUMMER
CALL ZENDBYTE
MOV AL,XMSPAGES ;AL=HOOGSTE BESCHIKBARE PAGINANUMMER
CALL ZENDBYTE
JMP LEESCOM ;EINDE COMMANDO 0
XMSLDPG: MOV AL,FUN_CODE ;LAADT COMMANDONUMMER
TEST AL,00000001B ;MOET PAGINA GESCHREVEN WORDEN?
JZ XMSLD1 ;NEE, DAN OVERSLAAN
CALL GETPGNR ;LEES PAGINANUMMER
JC PGERROR ;SPRING ALS FOUT
CALL XMSAT2PC ;LEES PAGINA IN BUFFER
CALL BUF2XMS ;KOPIEER BUFFER NAAR XMS GEHEUGEN
XMSLD1: MOV AL,FUN_CODE ;LAADT COMMANDONUMMER NOGMAALS
TEST AL,00000010B ;MOET PAGINA GELEZEN WORDEN?
JZ XMSLD2 ;NEE, DAN OVERSLAAN
CALL GETPGNR ;LEES PAGINANUMMER
JC PGERROR ;SPRING ALS FOUT
CALL XMS2BUF ;KOPIEER XMS GEHEUGEN NAAR BUFFER
CALL XMSPC2AT ;STUUR BUFFER NAAR ATOM
XMSLD2: JMP LEESCOM ;EINDE COMMANDO 1
PGERROR: ; MOV AL,1 ;FOUTSTATUS 1: ONGELDIGE XMS PAGINA GEGEVEN
; CALL ZENDBYTE ;STUUR NAAR ATOM
JMP LEESCOM ;COMMANDO AFGEBROKEN
;-- START EN INITIALISERINGSROUTINE ------------------------------------
XMS_INIT PROC NEAR
INSTALL: PUSH BX ;BEWAAR BX (commandline pointer)
MOV AX,4300H ;TEST OF HIMEM.SYS GELADEN IS
INT 2FH
POP BX ;HAAL BX TERUG
CMP AL,80H ;ALS HIMEM GELADEN IS
JE HIMEM ;VERDER GAAN
NOHIMEM: MOV XMSPAGES,0 ;SIMPEL, GEEN XMS GEHEUGEN BESCHIKBAAR
JMP XMS_EXIT ;EINDE INITIALISATIE VAN XMS GEHEUGEN
HIMEM: PUSH BX
MOV AX,4310H ;ADRES VOOR XMS FUNCTIES OPVRAGEN
INT 2FH
MOV XMSOFS,BX ;BERG ADRES XMS FUNCTIES OP
MOV XMSSEG,ES
MOV AH,00 ;XMS VERSIENUMMER OPVRAGEN
CALL DWORD PTR [XMSDRV]
POP BX
CMP AH,2 ;TEST OP VERSIE 2 OF HOGER
JB NOHIMEM ;LAGER MAG NIET, GEEN GEHEUGEN GERESERVEERD
SKIPSPC: CALL LEESCMDLINE ;LEES KARAKTER
CMP AL,' ' ;NEGEER SPATIE
JE SKIPSPC
XOR DX,DX ;PARAMETER KOMT IN DX
XOR AH,AH
DIGIT: CMP AL,0DH ;TEST OP EINDE INVOER
JE ASC2BIN ;SPRING BIJ EINDE REGEL
CMP AL,' ' ;SPATIE IS OOK EINDE INVOER
JE ASC2BIN ;DAN DUS OOK SPRINGEN
CMP AL,'0' ;TEST OP GELDIG DIGIT
JB NOHIMEM ;SPRING INDIEN ONGELDIG TEKEN
CMP AL,'9'
JA NOHIMEM
SUB AL,'0' ;CONVERTEER AL NAAR BINAIRE WAARDE
PUSH BX
IMUL DX,10 ;DX=DX*10+AL
POP BX
ADD DX,AX
CALL LEESCMDLINE ;LEES VOLGENDE DIGIT
JMP SHORT DIGIT
ASC2BIN: CMP DX,1000H ;TEST OP ONGELDIGE WAARDE
JA NOHIMEM ;SPRING INDIEN TE GROOT
SHR DX,4 ;BEREKEN AANTAL PAGINA'S VAN 16 KB
CMP DX,0 ;TEST RESULTAAT
JE NOHIMEM ;PARAMETER TE KLEIN, NIETS TE RESERVEREN
DEC DX ;BEPAAL HOOGSTE PAGINA NUMMER
MOV XMSPAGES,DL ;BERG RESULTAAT OP
RESXMS: PUSH BX
MOV DL,XMSPAGES ;LAADT AANTAL GEWENSTE PAGINA'S
INC DX ;TEL ER 1 BIJ OP
SHL DX,4 ;MAAK ER HET AANTAL KB VAN
MOV AH,09H ;LAADT XMS FUNCTIENUMMER
CALL DWORD PTR [XMSDRV] ;PROBEER GEHEUGEN TE RESERVEREN
POP BX
CMP AX,0001H ;TEST RESULTAAT
JE SUCCES ;SPRING INDIEN HET GEHEUGEN GERESERVEERD IS
DEC XMSPAGES ;GEHEUGEN NIET BESCHIKBAAR
CMP XMSPAGES,0FFH ;PROBEER KLEINERE HOEVEELHEID
JNE RESXMS ;MAAR OOIT HOUDT HET OP
JMP NOHIMEM ;NIEKS BESCHIKBAAR DUS
SUCCES: MOV XMSHANDLE,DX ;BERG HANDLE OP
XMS_EXIT: DEC BX ;VERLAAG COMMANDLINE INDEX
RET ;EINDE INITIALISATIE
XMS_INIT ENDP
|