NLSFUNC.A86
上传用户:xiaogehua
上传日期:2007-01-08
资源大小:1183k
文件大小:11k
源码类别:

操作系统开发

开发平台:

Asm

  1. ;    File              : $NLSFUNC.A86$
  2. ;
  3. ;    Description       :
  4. ;
  5. ;    Original Author   : DIGITAL RESEARCH
  6. ;
  7. ;    Last Edited By    : $CALDERA$
  8. ;
  9. ;-----------------------------------------------------------------------;
  10. ;    Copyright Work of Caldera, Inc. All Rights Reserved.
  11. ;      
  12. ;    THIS WORK IS A COPYRIGHT WORK AND CONTAINS CONFIDENTIAL,
  13. ;    PROPRIETARY AND TRADE SECRET INFORMATION OF CALDERA, INC.
  14. ;    ACCESS TO THIS WORK IS RESTRICTED TO (I) CALDERA, INC. EMPLOYEES
  15. ;    WHO HAVE A NEED TO KNOW TO PERFORM TASKS WITHIN THE SCOPE OF
  16. ;    THEIR ASSIGNMENTS AND (II) ENTITIES OTHER THAN CALDERA, INC. WHO
  17. ;    HAVE ACCEPTED THE CALDERA OPENDOS SOURCE LICENSE OR OTHER CALDERA LICENSE
  18. ;    AGREEMENTS. EXCEPT UNDER THE EXPRESS TERMS OF THE CALDERA LICENSE
  19. ;    AGREEMENT NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED,
  20. ;    COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED,
  21. ;    CONDENSED, EXPANDED, COLLECTED, COMPILED, LINKED, RECAST,
  22. ;    TRANSFORMED OR ADAPTED WITHOUT THE PRIOR WRITTEN CONSENT OF
  23. ;    CALDERA, INC. ANY USE OR EXPLOITATION OF THIS WORK WITHOUT
  24. ;    AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO CRIMINAL AND
  25. ;    CIVIL LIABILITY.
  26. ;-----------------------------------------------------------------------;
  27. ;
  28. ;    *** Current Edit History ***
  29. ;    *** End of Current Edit History ***
  30. ;
  31. ;    $Log$
  32. ;
  33. ;    NLSFUNC.A86 1.6 93/12/01 18:30:10 
  34. ;    Read in full 258 bytes of collating info
  35. ;    ENDLOG
  36. ;
  37. ; We have a problem with NLSFUNC.EXE - if this isn't loaded with an INSTALL=
  38. ; in CONFIG.SYS then the calls to set language/codepage will fail.
  39. ; So we provide the same functionality that NLSFUNC.EXE does here in the
  40. ; initialisation code. "nls_hook" is called by CONFIG before the country is
  41. ; set, then "nls_unhook" is called afterwards so we can throw away this code.
  42. ;
  43. VALID_SIG equ 0EDC1h ; valid signature in COUNTRY.SYS file
  44. DH_NEXT equ ds:dword ptr 0 ; Dword Pointer to Next DEV
  45. DH_ATTRIB equ ds:word ptr 4 ; device attribute bits
  46. DH_NAME equ ds:byte ptr 10 ; 8-BYTE device name
  47. DA_CHARDEV equ 8000h ; 1=character device, 0=block device
  48. DA_IOCTL equ 4000h ; device supports IOCTL string I/O
  49. DA_GETSET equ 0040h ; supports 3.2 level functionality
  50. include config.equ
  51. include i:msdos.equ
  52. include i:mserror.equ
  53. CGROUP GROUP INITCODE
  54. INITCODE CSEG PARA 'INITCODE'
  55. ; We share our NLS buffer with other temporary users
  56. extrn nls_temp_area:byte
  57. Public nls_hook, nls_unhook
  58. nls_hook:
  59. ;--------
  60. ; On Entry:
  61. ; none
  62. ; On Exit:
  63. ; none
  64. ;
  65. push es
  66. mov ah,MS_S_GETINT
  67. mov al,2fh
  68. int DOS_INT ; read and save old INT 2F vector
  69. mov old_int2f_off,bx
  70. mov old_int2f_seg,es
  71. mov ah,MS_S_SETINT
  72. mov al,2fh
  73. mov dx,offset int2f_handler ; install our own INT 2F handler
  74. int DOS_INT
  75. pop es
  76. ret
  77. nls_unhook:
  78. ;----------
  79. ; On Entry:
  80. ; none
  81. ; On Exit:
  82. ; none
  83. ;
  84. push ds
  85. mov dx,old_int2f_off
  86. mov ds,old_int2f_seg
  87. mov ah,MS_S_SETINT ; restore INT 2F vector
  88. mov al,2fh
  89. int DOS_INT
  90. pop ds
  91. ret
  92. old_int2f rd 0
  93. old_int2f_off dw 0
  94. old_int2f_seg dw 0
  95. int2f_handler:
  96. ;-------------
  97. cmp ah,014h ; is it for us ?
  98.  je int2f_handler10
  99. jmpf old_int2f ; no, pass it on
  100. int2f_handler10:
  101. cmp al,0 ; installation check ?
  102.  jne int2f_handler20
  103. mov al,0ffh ; we are already installed
  104. iret
  105. int2f_handler20:
  106. cmp al,0ffh ; Codepage Prep ?
  107.  jne int2f_handler30
  108. call f66_prep
  109. retf 2 ; iret, keeping flags
  110. int2f_handler30:
  111. cmp al,0feh ; Country Get Data ?
  112.  jne int2f_handler40
  113. call f65_locate_and_read
  114. retf 2 ; iret, keeping flags
  115. int2f_handler40:
  116. stc ; CY to indicate an error
  117. mov ax,-ED_FUNCTION ; function not supported
  118. retf 2 ; return an error
  119. f66_cp dw 0 ; INT21/66 Local Variable
  120. cp_packet dw 2 ; Packet Size
  121. cp_cpid dw 0 ; Request CodePage
  122. db 0,0 ; Packet Terminators
  123. preperr dw 0 ; Prepare function Error Code
  124. prepname rb 9 ; Reserved for ASCIIZ Device Name
  125. ;
  126. ; Area for country.sys current pointer table 
  127. ; (these are all offsets into country.sys)
  128. ;
  129. f65xx_code dw 0 ; Country code
  130. f65xx_cp dw 0 ; Code page
  131. dw 0 ; +1 reserved
  132. f65xx_data dw 0 ; Data area
  133. dw 0 ; Upper case table
  134. dw 0 ; +1 reserved
  135. dw 0 ; Filename upper case table
  136. dw 0 ; Legal file characters
  137. dw 0 ; Collating table
  138. dw 0 ; Double byte character set lead byte table
  139. f65xx_ptable_len equ 20
  140. f65xx_codepage dw 0
  141. f65xx_country dw 0
  142. f65xx_sig dw 0 ; Signature
  143. c_handle dw 0
  144. f66_prep:
  145. ;
  146. ; This function scans the complete device list and prepares
  147. ; all devices which support codepage.
  148. ;
  149. ; On Entry BX Requested CodePage
  150. ;
  151. ; On Exit AX Last Error Code
  152. ;
  153. DA_CODEPAGE equ DA_CHARDEV+DA_IOCTL+DA_GETSET
  154. push ds
  155. push es
  156. push cs
  157. pop es
  158. mov f66_cp,bx ; Save requested CodePage
  159. mov preperr,0000 ; Initialize Prepare Error
  160. mov ax,122ch ; magic hook get Device List
  161. int 2fh ; after the NUL entry
  162. mov ds,bx ; BX:AX -> header after INT 2F
  163. mov bx,ax ; DS:BX -> header to be useful
  164. f66_p10:
  165. push ds
  166. push bx
  167. mov ax,DH_ATTRIB[bx]
  168. and ax,DA_CODEPAGE ; Check for a Character Device which
  169. cmp ax,DA_CODEPAGE ; supports IOCTL strings and GETSET
  170.  jnz f66_p40 ; otherwise skip the device
  171. lea si,DH_NAME[bx] ; Found a matching device so
  172. mov di,offset prepname ; open the device and select the 
  173. mov cx,8 ; requested codepage
  174. f66_p20:
  175. lodsb
  176. cmp al,' '
  177.  je  f66_p30
  178. stosb
  179. loop f66_p20
  180. f66_p30:
  181. xor al,al
  182. stosb
  183. push cs
  184. pop ds
  185. mov dx,offset prepname ; Write Access
  186. mov cl,1 ; Open for write
  187. mov ax,1226h
  188. int 2fh ; call magic hook
  189.  jc f66_perr
  190. mov bx,ax ; Save Device Handle in BX
  191. mov si,f66_cp ; Get Requested CodePage in SI
  192. mov dx,offset cp_packet ; Offset of CodePage Struct
  193. mov cx,006Ah ; Get Unknown CodePage
  194. push bp
  195. mov bp,0ch ; Generic IOCTL
  196. mov ax,122bh
  197. int 2fh ; call magic hook
  198. pop bp
  199.  jc f66_p32 ; Error so Select requested Code Page
  200. cmp si,cp_cpid
  201.  je f66_p35 ; If this the currently selected
  202. f66_p32: ; skip the select CodePage
  203. mov cp_cpid,si
  204. mov dx,offset cp_packet ; Offset of CodePage Struct
  205. mov cx,004Ah ; Select Unkown CodePage
  206. push bp
  207. mov bp,0ch ; Generic IOCTL
  208. mov ax,122bh
  209. int 2fh ; call magic hook
  210. pop bp
  211.  jnc f66_p35 ; No Error so skip the error
  212. f66_p33:
  213.   mov preperr,ax ; save
  214. f66_p35:
  215. mov ax,1227h
  216. int 2fh ; magic hook to close handle
  217. jmp f66_p40
  218. f66_perr:
  219. mov preperr,ax ; Save the error code and try the
  220. f66_p40: ; next device in the chain
  221. pop bx ; Restore the Device offset
  222. pop ds
  223. lds bx,DH_NEXT[bx] ; check next character device for
  224. cmp bx,0FFFFh ;  Codepage support
  225.  jne f66_p10
  226. mov ax,preperr ; All devices have been prepared
  227. pop es
  228. pop ds
  229. or ax,ax ;  now return the last error code
  230. ret ;  in AX
  231. ;
  232. ; **********************************************************************
  233. ; ***  Function 65 support - routines for seeking a country/codepage ***
  234. ; ***  and loading the required information into the temp data area  ***
  235. ; **********************************************************************
  236. ;
  237. ; **************************************************
  238. ; ***   Open country.sys and search for the      ***
  239. ; ***   table of offsets for the given country/  ***
  240. ; ***   codepage, read it in and exit.           ***
  241. ; **************************************************
  242. f65_locate_and_read:
  243. ;-------------------
  244. ; Locate and Read info CL for Country DX Codepage BX using file DS:DI
  245. test di,di ; valid filename ?
  246. stc
  247.  jz f65_lr_exit
  248. push cx
  249. call f65x_find_info ; Will need to load up the info 
  250. pop ax
  251.  jc f65_lr_exit ; so do it if we can.
  252. mov dx,offset nls_temp_area
  253. mov cx,258 ; read 258 bytes into local buffer
  254. push ax
  255. call f65x_load_info ; Load required info
  256. pop ax
  257.  jc f65_lr_exit
  258. mov bx,c_handle  ; Close the file first
  259. mov ax,1227h
  260. int 2fh ; magic hook to close handle
  261.  jc f65_lr_exit
  262. mov si,offset nls_temp_area ; Tell subroutines where info is
  263. f65_lr_exit:
  264. ret
  265. ;
  266. ; Entry:  dx=country code, bx=codepage
  267. ; Exit :  carry set, and country.sys closed if failure
  268. ;         country.sys open ready for more reads if success
  269. ;
  270. f65x_find_info:
  271. mov f65xx_country,dx
  272. mov f65xx_codepage,bx
  273. mov dx,di
  274. xor cx,cx ; Open for read
  275. mov ax,1226h
  276. int 2fh ; call magic hook
  277. push cs ; get DS pointing to this segment
  278. pop ds ;  for future reads
  279.  jnc f65x_10
  280. ret ; Successful open?
  281. f65x_10:
  282. mov c_handle,ax ; Save handle
  283. mov dx,f65xx_country
  284. cmp f65xx_code,dx ; do we already have the information?
  285.  jne f65x_30 ; No - get it from country.sys
  286. f65x_20:
  287. cmp f65xx_cp,bx ; Does codepage agree too?
  288.  je f65x_35 ; Yes so exit with no more ado
  289. f65x_30:
  290. mov dx,007Eh
  291. xor cx,cx ; Seek within country.sys
  292. mov bx,c_handle
  293. push bp
  294. mov bp,0 ; seek from begining
  295. mov ax,1228h
  296. int 2fh
  297. pop bp
  298.  jc f65x_err
  299. mov bx,c_handle ; check them
  300. mov  cx,2
  301. mov  dx,offset f65xx_sig
  302. mov ax,1229h
  303. int 2fh ; read the signature bytes
  304.  jc f65x_err
  305. cmp f65xx_sig,VALID_SIG
  306.  jne f65x_err ; If signature bad exit
  307. f65x_32:
  308. mov bx,c_handle ; Read from country.sys header until
  309. mov cx,f65xx_ptable_len ; Country/codepage found or NULL
  310. mov dx,offset f65xx_code
  311. mov ax,1229h
  312. int 2fh
  313.  jc f65x_err
  314. cmp f65xx_code,0 ; Found NULL so reqd combination
  315.  je f65x_err ; was not found
  316. mov dx,f65xx_code ; Get the country/codepage values
  317. mov bx,f65xx_cp ; read from Country.SYS
  318. cmp dx,f65xx_country ; Check against the requested
  319.  jne f65x_32 ; Country. 
  320. cmp f65xx_codepage,0 ; If a codepage match is not
  321.  jz f65x_35 ; then return success
  322. cmp bx,f65xx_codepage ; Check against the requested
  323.  jne f65x_32 ; Codepage
  324. f65x_35:
  325. mov f65xx_country,dx ; Force the Search Country and
  326. mov f65xx_codepage,bx ; CodePage to be Updated
  327. ret
  328. f65x_err:
  329. mov bx,c_handle  ; and set the carry flag before
  330. mov ax,1227h
  331. int 2fh ; magic hook to close handle
  332. stc
  333. ret
  334. ;
  335. ; **************************************************
  336. ; ***   Load the type of information requested   ***
  337. ; ***   For the country currently active in the  ***
  338. ; ***   offset table        ***
  339. ; **************************************************
  340. ;
  341. ; Entry:  al=type of info, dx=offset of buffer to read info into cx=no of bytes
  342. ; Exit :  carry set, and country.sys closed if failure
  343. ;
  344. f65x_load_info:
  345. push es
  346. push cx
  347. push dx
  348. push ds ; Make es=ds
  349. pop es
  350. dec al ; 1=Data , 2=uppercase, 4=fuppercase
  351. sub bh,bh ; 5=filechars, 6=Collating table
  352. mov bl,al ; 7=DBCS table
  353. shl bx,1 ; Retrieve relevant offset
  354. mov dx,f65xx_data[bx]
  355. xor cx,cx ; Seek within country.sys
  356. mov bx,c_handle
  357. push bp
  358. mov bp,0 ; seek from begining
  359. mov ax,1228h
  360. int 2fh
  361. pop bp
  362. pop dx ; Get buffer address back
  363. pop cx ; and number of bytes to read
  364.  jc f65x_err
  365. test ax,ax ; zero offset is a problem
  366.  jz f65x_err ; (probably DBCS with old COUNTRY.SYS)
  367. mov bx,c_handle ; Now read that info into our data area
  368. mov ax,1229h
  369. int 2fh
  370.  jc f65x_err
  371. pop es
  372. ret
  373. end