; ******* ChemiCon MemAlloc for TSR DMA users ****** P486 foglalo equ 1024 include wv.inc lapint equ 0f1h code segment para use16 assume cs:code,ds:code,es:code,ss:nothing start: jmp dolog idszov: db "LapLink Driver for ChemiCon Equipments V1.0",13,10 idvege: db "(C) 1994 Budapest, ChemiCon Software",13,10 XMSHandle dw 0 XMSBase dd 0 XMSDrv: db 9ah ;call far xxxx:xxxx XMSEntry: dd ? ret dolog: push ds ;bp+14 push es ;bp+12 push ax ;bp+10 push bx ;bp+8 push cx ;bp+6 push dx ;bp+4 push si ;bp+2 push di ;bp+0 sti mov bp,sp ; mov word ptr ss:[bp+10],word ptr 16 cmp ax,6 jnc eleg add ax,ax mov bx,ax add bx,offset tabla call cs:[bx] eleg: pop di pop si pop dx pop cx pop bx pop ax pop es pop ds iret tabla: dw XMSDone ;Lefoglalt XMS memoria felszabaditasa dw XMSDone ; dw XMSDone ; dw XMSDone ; dw XMSDone ; dw XMSDone ; tveg: dw XMSDone ; itszeg: dw 0 itoffs: dw 0 db 16 dup(0) ; ;************************************************************************** ; Lefoglalt XMS memoria felszabaditasa ;************************************************************************** XMSDone: mov dx,cs:XMShandle ;------------------------------------------------------------------------------ ;XMSUnlock ,rogzitett XMS cim felszabaditasa ; be: dx - handle ; ki: ax - 1 ok, az=0 hiba bl=80,81,A2,AA ;------------------------------------------------------------------------------ mov ah,0dh call cs:[XMSdrv] ;------------------------------------------------------------------------------ ;FreeXMS ,XMS memoria felszabaditasa ; be: dx - felszabaditando XMS handle ; ki: ax - vegrehajtas hiba kodjai ; bl - lehetseges hiakodok 80,81,A2,A3 ;------------------------------------------------------------------------------ mov ah,0ah mov dx,cs:XMShandle call cs:[XMSdrv] ret ;------------------------------------------------------------------------------ db "Itt van a LapLink Drivernek vege!" ; ;_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+ Init: mov ax,cs mov ss,ax mov ax ,offset verem mov sp,ax mov ah,30h ;dos verzio ellenorzese min 5.00 kell int 21h xchg al,ah cmp ax,0500h jnc dosvok print_str dverr end_process 1 DosVok: SMSW ax ;Real mod ellenorzese test ax,1 jz short XMSInstalled Print_str Nemjo end_process 2 XMSIExit: print_str xinst end_process 3 ;------------------------------------------------------------------------------- ;XMSInstalled ,XMS meghajto program instalalva van-e ; be: - ; ki: cx= XMS verzio kod (pl. 3.00 -> 0300h) ; bx= XMS driver verzio kod (pl. 3.10 -> 0310h) ; dx= 1, ha HMA elerheto, egyebkent dx=0 ; XMSEntry valtozo balaltodik ;------------------------------------------------------------------------------ XMSInstalled: mov ax,4300h int 2fh cmp al,80H jne short XMSIExit ;XMS belepesi pont beallitasa ;az 'XMSEntry' valtozoban a belepesi pont cime mov ax,4310h int 2fh mov word ptr cs:XMSEntry[0],bx mov word ptr cs:XMSEntry[2],es mov ax,35h*256+lapint ; IT vektor lekerese int 21h mov cs:word ptr itszeg,es mov cs:word ptr itoffs,bx mov cx,(idvege-idszov) mov si,offset idszov azon: mov al,cs:[si] cmp al,es:[bx+idszov-start] jz azon2 jmp instkell azon2: inc bx inc si loop azon mov ax,cs sub ax,10h mov ds,ax mov bx,80h cmp byte ptr ds:[bx],0 jnz azon3 jmp noparam azon3: mov cl,[bx] mov ch,0 cikl1: inc bx cmp byte ptr [bx]," " jz cikl1 cmp byte ptr [bx],13 jnz param1 jmp noparam param1: cmp byte ptr [bx],"/" jnz invswich inc bx mov al,[bx] and al,11011111b cmp al,"U" jnz invswich xor ax,ax int lapint mov ax,es sub ax,10h mov es,ax mov ah,49h int 21h jnc removed mov ax,cs mov ds,ax mov dx,offset hiba mov ah,9 int 21h end_process 3 hiba: db "Megsrlt az MCB! A driver nem tvolthat el!",13,10,"$" invswich: mov ax,cs mov ds,ax mov dx,offset invs mov ah,9 int 21h end_process 4 invs: db "Hibas kapcsolo!",13,10,"$" removed: mov ax,cs mov ds,ax mov dx,offset remov mov ah,9 int 21h mov ax,word ptr cs:itszeg mov es,ax mov ax,25h*256+lapint mov dx,word ptr cs:itoffs int 21h end_process 2 remov: db "LapLink Driver a memribl eltvoltva.",13,10,"$" noparam: mov ax,cs mov ds,ax mov dx,offset instszov mov ah,9 int 21h end_process 1 instszov: db "LapLinkt Driver mr installva.",13,10,"$" instkell: mov ax,cs sub ax,10h mov ds,ax cmp byte ptr ds:[80h],0 mov ax,cs mov ds,ax jz iok mov dx,offset paramno mov ah,9 int 21h iok: mov dx,offset inst mov ah,9 int 21h xor ax,ax call cs:[XMSdrv] mov cx,ax ;XMS driver legalabb 2.0-as legyen ;----------------------------------------------------------------------------- ;AllocateXMS ,XMS memoria lefoglalasa ; be: dx - lefoglalando memoria kbyte-ban ; ki: ax - vegrehajtas kodja 0= nincs hiba ; dx - XMS handle ; bl - lehetseges hibakodok 80,81,A0,A1 ;----------------------------------------------------------------------------- mov dx,foglalo ;1 Mb lefoglalasa mov ah,9 call cs:[XMSdrv] cmp ax,1 jz short Memok print_str nomem end_process 4 memok: mov cs:XMSHandle,dx ;------------------------------------------------------------------------------ ;XMSLock ,XMS memoriacim rogzites ; be: dx - handle ; ki: ax =1 ; dx:bx - a rogzitett cim ; ax = 0, akkor hibakod bl=80,81,A2,AC,AD ;------------------------------------------------------------------------------ mov ah,0ch call cs:[XMSdrv] movzx edx,dx shl edx,16 mov dx,bx ;dx 32 bites fizikai cimet adja mov cs:XMSBase,edx ;------------------------------------------------------------------------------ ;Az FS 4 Gb szegmens beallitasa ; ;------------------------------------------------------------------------------ Set4GB: mov ax,cs mov ds,ax ; Have to fix up the gdt reference mov ax,cs movzx eax,ax shl eax,4 add [DWORD PTR l_ref],eax lgdt [FWORD PTR cs:gdtref] mov eax,cr0 or al,1 mov cr0,eax jmp far ptr @@n @@n: ; YA ESTAMOS EN PMODE!!!!!!!!!!! mov ax,8 mov fs,ax ; Selector del segmento plano de 4 gigas mov eax,cr0 and eax,0FEh mov cr0,eax ; ya estamos en rmode :_((((((((( ; PERO CON UN SEGMENTO DE 4 GIGAS!!!! jmp far ptr realm realm: mov ebx,cs:XMSBase mov cx,65535 telit: mov fs:[ebx],byte ptr 'A' add ebx,dword ptr 4 loop telit mov ax,seg start mov ds,ax mov dx,offset start mov ax,25h*256+lapint int 21h mov ax,3100h mov dx,((init-start+512) shr 4) int 21h LABEL DescTabl DB 8 DUP (?) ; Descriptor 0 no utilizado DW 0FFFFh ; 4 Gigabyte (64K pag) de tama$o DW 0 ; b15..0 del origen DB 0 ; b23..16 del origen DB 10010010b ; b7: presente (s! = 1) ; b65: privilege level (00) ; b4: segmento de sistema: (no=1) ; b3: no ejecutable (0) ; b2: no hacia abajo (0) ; b1: escribible (1) ; b0: acceso (no a#n) DB 11001111b ; b7: granularidad (p ginas = 1) ; b6: grande (?) (s! = 1) ; b5: (?) (0) ; b4: no utilizado (0) ; b30: 19..16 del l!mite (1111) DB 0 ; b31..24 del origen del segmento gdtref: DW 0Fh ; limite de la gdt: 2 descriptores l_ref: DW OFFSET DescTabl, 0 paramno: db "A paramter(ek) figyelmen kivl hagyva.",13,10,"$" inst: db "LapLink v1.0 Driver installva.",13,10,"$" NemJo db "Csak real modban fut helyesen!",13,10,"$" Xinst db "Nincs XMS memoria kezelo!",13,10,"$" nomem db "A memoria lefoglalas nem sikerult",13,10,"$" dverr db "Legalabb DOS 5.0 kell",13,10,"$" e999: db "ChemiCon 1996.$" e1006: db "Elfogyott az XMS memoria$" dw 512 dup(?) verem: dw 0 code ends end init