rev |
line source |
pascal@19515
|
1 ;***************************************************************
|
pascal@19515
|
2 ;****** This file is distributed under GPL
|
pascal@19515
|
3 ;***************************************************************
|
pascal@19515
|
4 ideal
|
pascal@19515
|
5 %crefref
|
pascal@19515
|
6 %noincl
|
pascal@19515
|
7 %nomacs
|
pascal@19515
|
8 p386
|
pascal@19515
|
9
|
pascal@19515
|
10 group DGROUP _TEXT,_BSS
|
pascal@19515
|
11 assume cs:DGROUP,ds:DGROUP
|
pascal@19515
|
12
|
pascal@19515
|
13 segment _BSS byte public use16 'BSS'
|
pascal@19515
|
14
|
pascal@19515
|
15 global xmm_handler:dword
|
pascal@19515
|
16 xmm_handler dd ?
|
pascal@19515
|
17
|
pascal@19515
|
18 ends _BSS
|
pascal@19515
|
19
|
pascal@19515
|
20 segment _TEXT byte public use16 'CODE'
|
pascal@19515
|
21
|
pascal@19515
|
22 ;***************************************************************
|
pascal@19515
|
23 ;void enable_a20_xmm();
|
pascal@19515
|
24 ;***************************************************************
|
pascal@19515
|
25 global _enable_a20_xmm:near
|
pascal@19515
|
26 proc _enable_a20_xmm near
|
pascal@19515
|
27
|
pascal@19515
|
28 mov ah,03h ;global enable a20
|
pascal@19515
|
29 call xmm_driver ;
|
pascal@19515
|
30 mov ah,05h ;local enable a20
|
pascal@19515
|
31 ;jmp xmm_driver ;
|
pascal@19515
|
32
|
pascal@19515
|
33 endp _enable_a20_xmm
|
pascal@19515
|
34
|
pascal@19515
|
35 ;***************************************************************
|
pascal@19515
|
36 ;Call xmm driver addr or 0 if no xmm
|
pascal@19515
|
37 ;void xmm_driver()
|
pascal@19515
|
38 ;***************************************************************
|
pascal@19515
|
39 global xmm_driver:near
|
pascal@19515
|
40 proc xmm_driver near
|
pascal@19515
|
41
|
pascal@19515
|
42 cmp [xmm_handler],0
|
pascal@19515
|
43 jne @@gotit
|
pascal@19515
|
44
|
pascal@19515
|
45 xchg ax,cx ; save cmd
|
pascal@19515
|
46 mov ax,4300h
|
pascal@19515
|
47 int 2fh
|
pascal@19515
|
48 mov bx,offset xmm_fail
|
pascal@19515
|
49 push cs
|
pascal@19515
|
50 pop es
|
pascal@19515
|
51 cmp al,80h
|
pascal@19515
|
52 jne @@err
|
pascal@19515
|
53 mov ax,4310h
|
pascal@19515
|
54 int 2fh
|
pascal@19515
|
55 @@err:
|
pascal@19515
|
56 xchg ax,cx ; restore cmd
|
pascal@19515
|
57 push es
|
pascal@19515
|
58 push bx
|
pascal@19515
|
59 pop [xmm_handler]
|
pascal@19515
|
60 @@gotit:
|
pascal@19515
|
61 call [xmm_handler]
|
pascal@19515
|
62 ret
|
pascal@19538
|
63 xmm_fail:
|
pascal@19538
|
64 xor ax,ax
|
pascal@19538
|
65 cwd
|
pascal@19538
|
66 retf
|
pascal@19538
|
67
|
pascal@19515
|
68 endp xmm_driver
|
pascal@19515
|
69
|
pascal@19515
|
70
|
pascal@19515
|
71 ;***************************************************************
|
pascal@19538
|
72 ;void xmm_alloc(struct image_himem *m)
|
pascal@19538
|
73 ;struct image_himem {
|
pascal@19538
|
74 ; 0 int fd;
|
pascal@19538
|
75 ; 2 u32 fallback;
|
pascal@19538
|
76 ; 6 u32 size;
|
pascal@19538
|
77 ;10 u32 remaining;
|
pascal@19538
|
78 ;14 u32 buf;
|
pascal@19538
|
79 ;18 u32 *bufv;
|
pascal@19538
|
80 ;20 char *errmsg;
|
pascal@19538
|
81 ;22 u32 chunk_size;
|
pascal@19538
|
82 ;26 void (*next_chunk)(struct image_himem *);
|
pascal@19538
|
83 ;28 u16 state;
|
pascal@19538
|
84 ;30 u16 fd2close;
|
pascal@19538
|
85 ;};
|
pascal@19515
|
86 ;***************************************************************
|
pascal@19515
|
87 global _xmm_alloc:near
|
pascal@19515
|
88 proc _xmm_alloc near
|
pascal@19515
|
89
|
pascal@19538
|
90 pop ax
|
pascal@19515
|
91 pop bx
|
pascal@19538
|
92 push bx
|
pascal@19538
|
93 push ax
|
pascal@19515
|
94 ifndef NO386
|
pascal@19538
|
95 mov edx,[bx+6] ; m->size
|
pascal@19515
|
96 dec edx
|
pascal@19515
|
97 shr edx,10 ; to Kb
|
pascal@19515
|
98 else
|
pascal@19538
|
99 mov ax,[bx+6] ; lo m->size
|
pascal@19538
|
100 mov dx,[bx+8] ; hi m->size
|
pascal@19515
|
101 sub ax,1
|
pascal@19515
|
102 sbb dx,0
|
pascal@19515
|
103 mov cx,10
|
pascal@19515
|
104 @@tokblp:
|
pascal@19515
|
105 shr dx,1
|
pascal@19515
|
106 rcr ax,1
|
pascal@19515
|
107 loop @@tokblp
|
pascal@19515
|
108 endif
|
pascal@19515
|
109 inc dx
|
pascal@19538
|
110 push bx
|
pascal@19515
|
111 mov ah,09h ;allocate blk
|
pascal@19515
|
112 call xmm_driver ;
|
pascal@19515
|
113 dec ax
|
pascal@19538
|
114 jnz @@goerr
|
pascal@19515
|
115 ;now: dx=handle of the blk
|
pascal@19515
|
116 mov ah,0Ch ;lock blk
|
pascal@19515
|
117 call xmm_driver ;
|
pascal@19515
|
118 dec ax
|
pascal@19515
|
119 ;now: dx:bx=addr of blk
|
pascal@19515
|
120 xchg ax,bx
|
pascal@19538
|
121 @@goerr:
|
pascal@19538
|
122 pop bx
|
pascal@19538
|
123 jnz @@err
|
pascal@19538
|
124 mov [bx+14],ax ; lo m->buf
|
pascal@19538
|
125 mov [bx+16],dx ; hi m->buf
|
pascal@19515
|
126 @@err:
|
pascal@19538
|
127 ret
|
pascal@19538
|
128
|
pascal@19515
|
129 endp _xmm_alloc
|
pascal@19515
|
130
|
pascal@19515
|
131 ends _TEXT
|
pascal@19515
|
132
|
pascal@19515
|
133 end
|
pascal@19515
|
134
|
pascal@19515
|
135 ;###### END OF FILE ############################################
|