rev |
line source |
pascal@19515
|
1 ;***************************************************************
|
pascal@19515
|
2 ;****** This file is distributed under GPL
|
pascal@19515
|
3 ;***************************************************************
|
pascal@19515
|
4 ideal
|
pascal@24034
|
5 %PAGESIZE 255
|
pascal@19515
|
6 %crefref
|
pascal@19515
|
7 %noincl
|
pascal@19515
|
8 %nomacs
|
pascal@24019
|
9
|
pascal@24019
|
10 include "common.inc"
|
pascal@24019
|
11
|
pascal@19636
|
12 p8086
|
pascal@19515
|
13
|
pascal@23996
|
14 group DGROUP _TEXT
|
pascal@19515
|
15 assume cs:DGROUP,ds:DGROUP
|
pascal@19515
|
16
|
pascal@19515
|
17 segment _TEXT byte public use16 'CODE'
|
pascal@19515
|
18
|
pascal@19515
|
19 ;***************************************************************
|
pascal@19515
|
20 ;void enable_a20_xmm();
|
pascal@19515
|
21 ;***************************************************************
|
pascal@19515
|
22 global _enable_a20_xmm:near
|
pascal@19515
|
23 proc _enable_a20_xmm near
|
pascal@19515
|
24
|
pascal@24013
|
25 mov ch,03h ;global enable a20
|
pascal@19515
|
26 call xmm_driver ;
|
pascal@24013
|
27 mov ch,05h ;local enable a20
|
pascal@19515
|
28 ;jmp xmm_driver ;
|
pascal@19515
|
29
|
pascal@19515
|
30 endp _enable_a20_xmm
|
pascal@19515
|
31
|
pascal@19515
|
32 ;***************************************************************
|
pascal@24013
|
33 ;Call xmm driver addr (success: ax=1)
|
pascal@20142
|
34 ;void xmm_driver(ah)
|
pascal@19515
|
35 ;***************************************************************
|
pascal@19515
|
36 proc xmm_driver near
|
pascal@19515
|
37
|
pascal@24013
|
38 pop bx ; \
|
pascal@24013
|
39 push cs ; fake far call
|
pascal@24013
|
40 push bx ; /
|
pascal@20142
|
41 mov ax,4300h ; installation check in al
|
pascal@19515
|
42 int 2fh
|
pascal@19515
|
43 cmp al,80h
|
pascal@24013
|
44 jne @@xmm_fail
|
pascal@20142
|
45 mov ax,4310h ; get driver address in es:bx
|
pascal@19515
|
46 int 2fh
|
pascal@24013
|
47 xchg ax,cx ; restore cmd
|
pascal@23996
|
48
|
pascal@24013
|
49 push es ; jmp far es:bx
|
pascal@24013
|
50 push bx ; avoid 08h 0Fh 12h and 8Fh functions using bx
|
pascal@23996
|
51 @@xmm_fail:
|
pascal@19538
|
52 retf
|
pascal@19538
|
53
|
pascal@19515
|
54 endp xmm_driver
|
pascal@19515
|
55
|
pascal@23992
|
56 ifdef WITH_XMM_ALLOC
|
pascal@22007
|
57 include "himem.inc"
|
pascal@20142
|
58
|
pascal@19515
|
59 ;***************************************************************
|
pascal@23992
|
60 ;_fastcall void xmm_alloc(si:struct image_himem *m)
|
pascal@19515
|
61 ;***************************************************************
|
pascal@20528
|
62 global @xmm_alloc$qp11image_himem:near
|
pascal@20528
|
63 proc @xmm_alloc$qp11image_himem near
|
pascal@19515
|
64
|
pascal@23999
|
65 extrn _cmdnum:dword
|
pascal@23999
|
66 skip_alloc = (byte _cmdnum+16)
|
pascal@24013
|
67 LARGE_XMM_ALLOC = 1
|
pascal@24013
|
68 ifdef LARGE_XMM_ALLOC
|
pascal@24013
|
69 mov ch,89h ;allocate blk of EDX kilobytes
|
pascal@24014
|
70 test [skip_alloc],ch
|
pascal@23999
|
71 jne @@err
|
pascal@24013
|
72 extrn _cpu386:byte
|
pascal@24013
|
73 test [_cpu386],ch
|
pascal@24013
|
74 je @@not386
|
pascal@24013
|
75 p386
|
pascal@23992
|
76 mov edx,[(image_himem si).size] ; m->size
|
pascal@20142
|
77 ;dec edx
|
pascal@19515
|
78 shr edx,10 ; to Kb
|
pascal@20486
|
79 inc edx
|
pascal@24013
|
80 call xmm_driver ;
|
pascal@24013
|
81 dec ax ; Z=OK
|
pascal@24013
|
82 jz @@gotit
|
pascal@24013
|
83 @@not386:
|
pascal@24013
|
84 mov cl,16-10
|
pascal@19515
|
85 else
|
pascal@24013
|
86 mov cl,16-10
|
pascal@24013
|
87 test [skip_alloc],cl ; 06h & ('*'=2Ah) = 02h
|
pascal@24013
|
88 jne @@err
|
pascal@24013
|
89 endif
|
pascal@24013
|
90 p8086
|
pascal@20142
|
91 ;mov ax,-1
|
pascal@20142
|
92 ;cwd
|
pascal@23992
|
93 ;add ax,[word (image_himem si).size] ; lo m->size
|
pascal@23992
|
94 ;adc dx,[word (image_himem si+2).size] ; hi m->size
|
pascal@23992
|
95 les ax,[dword (image_himem si).size] ; m->size
|
pascal@21791
|
96 extrn N_LXLSH@ES:near
|
pascal@21791
|
97 call N_LXLSH@ES
|
pascal@20486
|
98 inc dx
|
pascal@24013
|
99 mov ch,9h ;allocate blk of DX kilobytes (<64Mb)
|
pascal@19515
|
100 call xmm_driver ;
|
pascal@24013
|
101 dec ax ; Z=OK
|
pascal@23999
|
102 jnz @@err
|
pascal@24013
|
103 @@gotit:
|
pascal@19515
|
104 ;now: dx=handle of the blk
|
pascal@24013
|
105 mov ch,0Ch ;lock blk
|
pascal@19515
|
106 call xmm_driver ;
|
pascal@19515
|
107 ;now: dx:bx=addr of blk
|
pascal@24013
|
108 ;dec ax ; Z=OK
|
pascal@24013
|
109 ;jnz @@err
|
pascal@23999
|
110 mov [word (image_himem si).buf],bx ; lo m->buf
|
pascal@23999
|
111 mov [word (image_himem si+2).buf],dx ; hi m->buf
|
pascal@19515
|
112 @@err:
|
pascal@19538
|
113 ret
|
pascal@19538
|
114
|
pascal@20528
|
115 endp @xmm_alloc$qp11image_himem
|
pascal@23992
|
116 endif
|
pascal@19515
|
117
|
pascal@19515
|
118 ends _TEXT
|
pascal@19515
|
119
|
pascal@19515
|
120 end
|
pascal@19515
|
121
|
pascal@19515
|
122 ;###### END OF FILE ############################################
|