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

操作系统开发

开发平台:

Asm

  1. ;    File              : $HEADER.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. ;    $Log: $
  31. ;    HEADER.A86 1.26 94/12/02 09:34:18 
  32. ;    added FCB LRU counter and sharing flag    
  33. ;    HEADER.A86 1.24 94/11/15 08:53:04
  34. ;    Fixed the NWDOS.386 stuff. Still point at startupinfo, but take out the
  35. ;    vxdname and the vxdnameseg entries.
  36. ;    HEADER.A86 1.23 94/06/28 14:31:07
  37. ;    Fix last_key_ext bug
  38. ;    HEADER.A86 1.17 93/11/22 15:23:16 
  39. ;    Move idle data to instance page to get per domain idle detection 
  40. ;    HEADER.A86 1.15 93/11/08 19:09:22 
  41. ;    Handle EXEPACK problems even if DOS not in HMA
  42. ;    HEADER.A86 1.14 93/11/14 18:14:21
  43. ;    Initialise fdos_buf to 2/0
  44. ;    HEADER.A86 1.13 93/10/07 19:08:25
  45. ;    CALL5 always goes through 0:C0 (or FFFF:D0 alias)
  46. ;    HEADER.A86 1.12 93/09/03 20:28:39 
  47. ;    Add intl/dbcs support for int 21/6523 (query yes/no char)
  48. ;    HEADER.A86 1.11 93/09/02 22:26:24 
  49. ;    Make uppercase tables compatible (See COMPATIBLE flag in COUNTRY.SYS)
  50. ;    HEADER.A86 1.9 93/08/10 17:41:25 
  51. ;    Move code fragments for Rolodex Live
  52. ;    HEADER.A86 1.8 93/08/04 15:15:39 
  53. ;    re-arrange dummy fcbs
  54. ;    HEADER.A86 1.6 93/07/22 19:29:19 
  55. ;    add no/yes characters
  56. ;    HEADER.A86 1.5 93/07/20 22:46:33 
  57. ;    dmd_upper_root defaults to FFFF
  58. ;    ENDLOG
  59. ;
  60. ; DRDOS Header/Initialization Code
  61. ;
  62. ; NB.
  63. ; On a system where the kernel stays low and history is disabled we throw
  64. ; away as much code as possible. This includes the patch area, the command
  65. ; line history code, and the BDOS initialisation code.
  66. ; As we use the patch area the pointer in the header should be incremented
  67. ; in order to retain progressively larger amounts of code.
  68. include pcmode.equ
  69. include vectors.def
  70. include i:cmdline.equ
  71. include i:doshndl.def
  72. include i:driver.equ
  73. include i:exe.def
  74. include i:f52data.def
  75. include i:fdos.equ
  76. include i:mserror.equ
  77. include i:psp.def
  78. include i:reqhdr.equ
  79. include i:country.def
  80. PADDING equ 14*1024 ; offset code start by this much
  81. DOSINROM equ 0800h
  82. DOSINHMA equ 1000h
  83. ;****************************************************************************
  84. ; The format of the header is FIXED and should not be modified.
  85. ;****************************************************************************
  86. PCM_HEADER CSEG PARA
  87. extrn edit_size:word
  88. dw PADDING
  89. rb PADDING-2 ; Insert Header
  90. Public code_start
  91. code_start:
  92. ; jmp pcmode_init ; PCMODE Init Entry
  93.     db  0E9h       
  94. dw pcmode_init-PADDING-3
  95. ; jmp pcmode_reinit ; PCMODE Re Init Entry
  96. db 0E9h
  97. dw pcmode_reinit-PADDING-6
  98. Public pcmode_dseg, os_version, patch_version
  99. pcmode_dseg dw 0 ; 0006h PCMODE Data Segment Pointer
  100. dw PADDING ; 0008h offset of start of code
  101. os_version dw 1072h ; 000Ah OS version
  102. dw patch_area-PADDING ; 000Ch offset of disposable code
  103. dw pcmode_init-PADDING ; 000Eh offset of initialisation code
  104. db 0EAh ; 0010h JMPF (MUST be para aligned)
  105. dw 4*30h ; 0011h  through the Int 30 vec
  106. dw 0 ; 0013h  to CALL 5 entry point
  107. rb 7 ; 0015h make following offsets same as 5.0
  108. dw 0 ; 001Ch Compressed Data Flag
  109. dw code_end-PADDING ; 001Eh PCMODE Code Size in Bytes
  110. dw data_end ; 0020h PCMODE Data Length in Bytes
  111. patch_version dw DOSINROM+0000h ; 0022h sub-version (was SYSDAT length)
  112. db 0 ; 0024h Kanji Support Flag
  113. db 0 ; 0025h Reserved
  114. dw edit_size-PADDING ; 0026h Pointer Command Line Editor
  115. ;       control table.
  116. dw NoYesChars ; 0028h offset in data of pointers to 
  117. ; default country info.
  118. ;****************************************************************************
  119. ; The format of the data is FIXED and should not be modified.
  120. ;****************************************************************************
  121. PCMODE_DATA DSEG WORD
  122. Public codeSeg ; BDOS code segment
  123. Public dmd_root ; Root of DOS Memory List
  124. Public hmaRoot ; Root of HMA chain
  125. Public func52_data ; Start of the FUNC 52 compatible data
  126. Public last_drv ; Last Drive
  127. Public phys_drv
  128. Public dev_root ; Root of Device List
  129. Public nul_device ; NUL Device
  130. Public ddsc_ptr
  131. Public retcode
  132. Public user_retcode
  133. Public system_retcode
  134. Public break_sp
  135. Public net_retry
  136. Public net_delay
  137.     Public  file_ptr        
  138. Public clk_device ; Clock Device Pointer
  139. Public con_device ; Console Device Pointer
  140. Public bcb_root ; Linked List of Buffers
  141. Public fcb_ptr
  142. Public ldt_ptr
  143. Public join_drv
  144. Public share_stub
  145. Public sector_size
  146. Public setverPtr
  147. Public dos_version
  148. Public @hist_flg ; History control flag
  149. Public dmd_address ; don't free DMD's with segment under this value
  150. Public dmd_owner ; don't free DMD's with owner under this value
  151. Public dmd_upper_root ; link to upper memory
  152. Public dmd_upper_link
  153. Public LocalMachineID ; Normal 0, fixed up by multi-tasker
  154. Public biosDate ; 6 byte buffer to read/write clock
  155. Public minute
  156. Public hour
  157. Public hundredth
  158. Public second
  159. Public dayOfMonth
  160. Public month
  161. Public yearsSince1980
  162. Public daysSince1980
  163. Public dayOfWeek
  164. org 0
  165. dos_data db 0
  166. dw code_start
  167. rb 1 ; padding
  168. if DOS5
  169. dw 1
  170. else
  171. dw 0
  172. endif
  173. ; make end of vladivar instance data public for the multi-tasker
  174. rb 06h - (offset $ - offset dos_data)
  175. dw endOfInstanceData
  176. rb 0eh - (offset $ - offset dos_data)
  177. Public netbios, name_num, fcb_lru_count
  178. netbios db 0 ; NetBios Name Number
  179. name_num db 0 ; 0 - Undefined Name
  180. fcb_lru_count dw 0 ; fcb LRU counter
  181. rb 26h-0ch-(offset $ - offset dos_data) ; align func52_data on 26
  182. ;************************************************************************
  183. ;* *
  184. ;* Below is the DOS defined area of the SYSTEM variables *
  185. ;* above are variables defined for DR DOS. *
  186. ;* *
  187. ;************************************************************************
  188. net_retry dw 3 ;-000C Network retry count
  189. net_delay dw 1 ;-000A Network delay count
  190. bcb_root dw -1,-1 ;-0008 Current DOS disk buffer
  191. dw 0 ;-0004 Unread CON input
  192. dmd_root dw 0 ;-0002 Root of DOS Memory List (Segment)
  193. func52_data rb 0
  194. ddsc_ptr rd 0 ; 0000 DWORD ptr to DDSC
  195. dw -1,-1
  196. file_ptr rd 0 ; 0004 DWORD ptr file table
  197. dw msdos_file_tbl,0
  198. clk_device rd 0 ; 0008 DWORD ptr Clock Device Header
  199. dw -1,-1 ;      Initialize to an Invalid Address
  200. con_device rd 0 ; 000C DWORD ptr Console Device Header
  201. dw -1,-1 ;      Initialize to an Invalid Address
  202. sector_size dw 128 ; 0010 WORD Buffer Size (Max Sector Size)
  203. buf_ptr dw buf_info,0 ; 0012 DWORD ptr to Disk Buffer Info
  204. ldt_ptr dw 0,0 ; 0016 DWORD ptr Path Structures
  205. fcb_ptr dw dummy_fcbs,0 ; 001A DWORD ptr FCB Control Structures
  206. dw 0 ; 001E WORD UNKNOWN
  207. phys_drv db 0 ; 0020 BYTE Number of Physical Drives
  208. last_drv db 0 ; 0021 BYTE Last Drive
  209. dev_root rd 0 ; 0022 DWORD ptr Device Driver List
  210. nul_device dw -1,-1 ;      Next Device Pointer
  211. dw DA_CHARDEV+DA_ISNUL ; 0026 NUL Device Attributes
  212. dw nul_strat ; 0028 NUL Device Strategy routine
  213. dw nul_int ; 002A NUL Device Interrupt routine
  214. db 'NUL     ' ; 002C NUL Device Name
  215. join_drv db 0 ; 0034 BYTE Number of JOIN'd drives
  216. dw 0 ; 0035 DOS 4 pointer to special names (always zero in DOS 5)
  217. setverPtr dw 0,0 ; 0037 setver list
  218. dw 0 ; 003B unknown
  219. dw 0 ; 003D psp of last umb exec
  220. dw 1 ; 003F number of buffers
  221. dw 1 ; 0041 size of pre-read buffer
  222. public bootDrv
  223. bootDrv db 0 ; 0043 drive we booted from
  224. db 0 ; 0044 cpu type (1 if >=386)
  225. dw 0 ; 0045 Extended memory
  226. buf_info rd 1 ; 0047 disk buffer chain
  227. dw 0 ; 004B 0 (DOS 4 = # hashing chains)
  228. rd 1 ; 004D pre-read buffer
  229. dw 0 ; 0051 # of sectors
  230. db 0 ; 0053 00=conv 01=HMA
  231. dw 0 ; 0054 deblock buf in conv
  232. deblock_seg dw 0 ; 0056 (offset always zero)
  233. rb 3 ; 0058 unknown
  234. dw 0 ; 005B unknown
  235. db 0, 0FFh, 0 ; 005D unknown
  236. db 0 ; 0060 unknown
  237. dw 0 ; 0061 unknown
  238. dmd_upper_link db 0 ; 0063 upper memory link flag
  239. dw 0 ; 0064 unknown
  240. dmd_upper_root dw 0FFFFh ; 0066 dmd_upper_root
  241. dw 0 ; 0068 para of last mem search
  242. dw invalid_stub,0 ; 006A DWORD ptr to 15
  243. dw nul_int,0 ; 006E  SHARE STUB routines
  244. dw nul_int,0 ; 0072
  245. dw nul_int,0 ; 0076
  246. dw nul_int,0 ; 007A
  247. dw nul_int,0 ; 007E
  248. dw nul_int,0 ; 0082
  249. dw nul_int,0 ; 0086
  250. dw nul_int,0 ; 008A
  251. dw nul_int,0 ; 008E
  252. dw invalid_stub,0 ; 0092
  253. dw nul_int,0 ; 0096
  254. dw nul_int,0 ; 009A
  255. dw nul_int,0 ; 009E
  256. dw nul_int,0 ; 00A2
  257. msdos_file_tbl dw -1 ; 00A6 1st HDB entries
  258. dw -1 ; Pointer to next Entry (None)
  259. dw 5 ; Number of Entries
  260. rb 5*DHNDL_LEN ; Reserve 5 Internal Handles
  261. rb 1fbh - (offset $ - offset dos_data)
  262. Public savbuf
  263. savbuf rb 128 ; cmdline editing temp buffer
  264. Public fdos_buf
  265. fdos_buf db 2,0 ; initialise buffer to empty
  266. rb 128+1 ; room for 128 byte readline + LF
  267. rb 2feh - (offset $ - offset dos_data)
  268. ; this byte is used for ^P support
  269. Public cio_state
  270. cio_state db 0 ; 0 = no printer echo, ~0 echo
  271. Public verify_flag
  272. verify_flag db 0 ; ~0, write with verify
  273. rb 300h - (offset $ - offset dos_data)
  274. ; this byte is used for TAB's
  275. Public column
  276. column db 0 ; Current Cursor Column
  277. Public switch_char
  278. switch_char db '/'
  279. Public mem_strategy
  280. mem_strategy db 0 ; memory allocation strategy
  281. Public sharing_flag
  282. sharing_flag db 0 ; 00 = sharing module not loaded
  283. ; 01 = sharing module loaded, but
  284. ;      open/close for block devices
  285. ;      disabled
  286. ; FF = sharing module loaded,
  287. ;      open/close for block devices
  288. ;      enabled (not implemented)
  289. Public net_set_count
  290. net_set_count db 1 ; count the name below was set
  291. Public net_name
  292. net_name db '               ' ; 15 Character Network Name
  293. db 00   ; Terminating 0 byte
  294. ; These tables point to routines to be patched by MSNET
  295. dw criticalSectionEnable
  296. dw criticalSectionEnable
  297. dw criticalSectionEnable
  298. dw criticalSectionEnable
  299. dw 0 ; terminating null
  300. rb 1 ; padding
  301. ;
  302. ; Variables contained the the "STATE_DATA" segment contain
  303. ; information about the STATE of the current DOS Process. These
  304. ; variables must be preserved regardless of the state of the INDOS
  305. ; flag.
  306. ;
  307. ; All variables that appear in "STATE_DATA" **MUST** be declared
  308. ; in this file as the offsets from the INTERNAL_DATA variable are
  309. ; critical to the DOS applications that modify this data area.
  310. ;
  311. ;
  312. Public error_flag, indos_flag
  313. Public error_locus, error_code
  314. Public error_action, error_class
  315. Public error_dev, error_drive
  316. Public  dma_offset, dma_segment
  317. Public current_psp, current_dsk
  318. Public break_flag
  319. Public internal_data
  320. internal_data rw 0 ; <-- Address returned by INT21/5D06
  321. error_flag db 0 ; INDOS - 01 - Error Mode Flag
  322. indos_flag db 0 ; INDOS + 00 - Indos Flag
  323. error_drive db 0 ; INDOS + 01 - Drive on write protect error
  324. error_locus db 0 ; INDOS + 02 - Error Locus
  325. error_code dw 0 ; INDOS + 03 - DOS format error Code
  326. error_action db 0 ; INDOS + 05 - Error Action Code
  327. error_class db 0 ; INDOS + 06 - Error Class
  328. error_dev rd 1 ; INDOS + 07 - Failing Device Address
  329. dma_offset rw 1 ; INDOS + 0B - DMA Offset
  330. dma_segment rw 1 ; INDOS + 0D - DMA Segment
  331. current_psp rw 1 ; INDOS + 0F - Current PSP
  332. break_sp rw 1 ; INDOS + 11 - used in int 23
  333. retcode rw 0
  334. user_retcode db 0 ; INDOS + 13 - return code from process
  335. system_retcode db 0 ; INDOS + 14 - reason for process terminate
  336. current_dsk db 0 ; INDOS + 15 - Current Drive
  337. break_flag db 0 ; INDOS + 16 - Break Flag
  338. dw 0 ; INDOS + 17 - unknown
  339. Public swap_always
  340. swap_always rw 0
  341. Public int21AX
  342. int21AX dw 0 ; INDOS + 19 - AX from last Int 21
  343. Public owning_psp, machine_id
  344. owning_psp dw 0 ; INDOS + 1B - owning psp
  345. machine_id dw 0 ; INDOS + 1D - remote machine ID
  346. public load_psp, load_image, load_top, load_max, load_handle
  347. load_psp dw 0 ; Paragraph of the new PSP.
  348. load_image dw 0 ; Paragraph of the Load Image.
  349. load_top dw 0 ; Last paragraph of Allocated Memory
  350. load_max dw 0 ; ditto, but not messed with
  351. load_handle dw 0 ; Handle allocated to load file on OPEN
  352. Public locus, valid_flg, retry_off, retry_sp
  353. locus db 0 ; Public Error Locus Value
  354. valid_flg db 0 ; Valid Options for Critical Error 
  355. retry_off dw 0 ; IP for Error Retry
  356. retry_sp dw 0 ; SP for Error Retry
  357. ; Some important data structures....
  358. rb 0350h - (offset $ - offset dos_data) ; DOS 5
  359. dayOfMonth db 0
  360. month db 0
  361. yearsSince1980 dw 0
  362. daysSince1980 dw 0FFFFh ; force rebuild on first clock read
  363. dayOfWeek db 0
  364. public internal_flag
  365. internal_flag   db  0      
  366. Public int28_flag
  367. int28_flag db FALSE
  368. public ioctlRH
  369. ioctlRH rb 23 ; up to 23 bytes possible
  370. public load_env, load_envsize, exe_loadhigh
  371. load_env dw 0 ; Paragraph of the new environment
  372. load_envsize dw 0 ; Size of new environment
  373. exe_loadhigh db 0 ; load high flag
  374. Public fcb_pb, fcb_path, fcb_path2
  375. ; These variables are used during FCB processing - we build another parameter
  376. ; block outside the MXDisk which makes handle calls to the FDOS
  377. fcb_pb rw 7
  378. fcb_path rb 15
  379. fcb_path2 rb 15
  380. public char_count
  381. char_count db 0
  382. ;****************************************************************************
  383. ; The format of the data is FIXED and should not be modified.
  384. ;****************************************************************************
  385. ; WARNING - if anyone adds/deletes PCMODE_DATA they MUST adjust these
  386. ; values so the following data will origin correctly
  387. FIXED_DOS_DATA cseg word
  388. FIXED_DATA_START equ 3B0h
  389. public MUSTBE03B0
  390. MUSTBE03B0:
  391. org 03b6h - FIXED_DATA_START ; DOS 5
  392. biosDate dw 0 ; days since 1980
  393. minute db 0
  394. hour db 0
  395. hundredth db 0
  396. second db 0
  397. rb 2 ; padding
  398. Public reloc_buf, load_file, RELOC_CNT
  399. RELOC_CNT equ 80h/16 ; buffer 128 bytes here
  400. ; function 4B uses these data area's as workspace during an EXEC
  401. Public pri_pathname
  402. reloc_buf rb 0 ; shared with primary pathname
  403. pri_pathname rb 80h
  404. Public sec_pathname
  405. load_file rb 0
  406. sec_pathname rb 80h
  407. Public srch_buf
  408. srch_buf rb 21+32 ; 21 byte srch state, 32 byte dir entry
  409. Public temp_ldt
  410. temp_ldt rb LDT_LEN
  411. Public name_buf
  412. name_buf rb 32 ; space enough for 1 dir entry
  413. magic_byte db 0
  414. rb 1 ; padding
  415. Public file_attrib
  416. file_attrib dw 0
  417. rb 3 ; padding
  418. Public remote_call
  419. remote_call dw 0
  420.     org 057Ch - FIXED_DATA_START 
  421. Public exit_type ; used by break and critical error
  422. exit_type db 0 ;  handlers during termination
  423. rb 1 ; padding
  424. Public term_psp
  425. term_psp    dw  0       
  426. Public int24_esbp
  427. int24_esbp rw 2
  428. Public int21regs_ptr, int21regs_off, int21regs_seg
  429. int21regs_ptr rw 0
  430. int21regs_off dw 0
  431. int21regs_seg dw 0
  432. public critical_sp
  433. critical_sp dw 0 ; critical error internal stack
  434. Public current_ddsc
  435. current_ddsc rw 2
  436.     org 059ah - FIXED_DATA_START 
  437. Public current_device
  438. current_device rw 2
  439. Public current_dhndl
  440. current_dhndl rw 2
  441. Public current_ldt
  442. current_ldt rw 2
  443. rw 2 ; pointer to callers FCB
  444. Public current_ifn
  445. current_ifn dw 0
  446.     org 05b2h - FIXED_DATA_START 
  447. dw offset pri_pathname
  448. dw offset sec_pathname
  449. dw offset pri_pathname
  450.     org 05ceh - FIXED_DATA_START 
  451. Public current_filepos
  452. current_filepos rw 2
  453.     org 05f0h - FIXED_DATA_START 
  454. Public prev_int21regs_ptr, prev_int21regs_off, prev_int21regs_seg
  455. prev_int21regs_ptr rw 0
  456. prev_int21regs_off dw 0
  457. prev_int21regs_seg dw 0
  458.     org 0620h - FIXED_DATA_START 
  459. Public indos_stack, error_stack, normal_stack
  460. Public fcb_search_buf ; during FCB search 1st/next use bottom
  461. fcb_search_buf rb 0 ;  of error stack as scratch buffer
  462. ; rb 43 ;  - only used during int 21 call
  463. rw STACK_SIZE ; Error Processing Stack
  464. error_stack rw 0
  465. rw STACK_SIZE ; Normal Function Stack Area
  466. normal_stack rw 0
  467. rw STACK_SIZE ; Indos Function Stack
  468. indos_stack rw 0
  469. lookahead_flag db 0
  470. Public rwmode, err_drv, ioexerr
  471. err_drv     db  0       
  472. rwmode      db  0       
  473. ioexerr     db  0       
  474. public int2f_cmd, int2f_stack, file_mode
  475. int2f_cmd   dw  0       
  476. int2f_stack dw  0       
  477. file_mode   dw  0       
  478. Public cle_state
  479. cle_state   dw  0       
  480. Public swap_indos
  481. swap_indos rw 0
  482.     org 0AADh - FIXED_DATA_START 
  483. Ucasetbl dw  128 ; Table Size
  484. db 080h, 09ah,  'E',  'A', 08eh,  'A', 08fh, 080h
  485. db  'E',  'E',  'E',  'I',  'I',  'I', 08eh, 08fh
  486. db 090h, 092h, 092h,  'O', 099h,  'O',  'U',  'U'
  487. db  'Y', 099h, 09ah, 09bh, 09ch, 09dh, 09eh, 09fh
  488. db  'A',  'I',  'O',  'U', 0a5h, 0a5h, 0a6h, 0a7h
  489. db 0a8h, 0a9h, 0aah, 0abh, 0ach, 0adh, 0aeh, 0afh
  490. db 0b0h, 0b1h, 0b2h, 0b3h, 0b4h, 0b5h, 0b6h, 0b7h
  491. db 0b8h, 0b9h, 0bah, 0bbh, 0bch, 0bdh, 0beh, 0bfh
  492. db 0c0h, 0c1h, 0c2h, 0c3h, 0c4h, 0c5h, 0c6h, 0c7h
  493. db 0c8h, 0c9h, 0cah, 0cbh, 0cch, 0cdh, 0ceh, 0cfh
  494. db 0d0h, 0d1h, 0d2h, 0d3h, 0d4h, 0d5h, 0d6h, 0d7h
  495. db 0d8h, 0d9h, 0dah, 0dbh, 0dch, 0ddh, 0deh, 0dfh
  496. db 0e0h, 0e1h, 0e2h, 0e3h, 0e4h, 0e5h, 0e6h, 0e7h
  497. db 0e8h, 0e9h, 0eah, 0ebh, 0ech, 0edh, 0eeh, 0efh
  498. db 0f0h, 0f1h, 0f2h, 0f3h, 0f4h, 0f5h, 0f6h, 0f7h
  499. db 0f8h, 0f9h, 0fah, 0fbh, 0fch, 0fdh, 0feh, 0ffh
  500. info2_len equ word ptr (offset $ - offset Ucasetbl)
  501.     org 0B2Fh - FIXED_DATA_START 
  502. ; Filename upper case table
  503. FileUcasetbl dw  128 ; Table Size
  504. standard_table rb 0
  505. db 080h, 09ah,  'E',  'A', 08eh,  'A', 08fh, 080h
  506. db  'E',  'E',  'E',  'I',  'I',  'I', 08eh, 08fh
  507. db 090h, 092h, 092h,  'O', 099h,  'O',  'U',  'U'
  508. db  'Y', 099h, 09ah, 09bh, 09ch, 09dh, 09eh, 09fh
  509. db  'A',  'I',  'O',  'U', 0a5h, 0a5h, 0a6h, 0a7h
  510. db 0a8h, 0a9h, 0aah, 0abh, 0ach, 0adh, 0aeh, 0afh
  511. db 0b0h, 0b1h, 0b2h, 0b3h, 0b4h, 0b5h, 0b6h, 0b7h
  512. db 0b8h, 0b9h, 0bah, 0bbh, 0bch, 0bdh, 0beh, 0bfh
  513. db 0c0h, 0c1h, 0c2h, 0c3h, 0c4h, 0c5h, 0c6h, 0c7h
  514. db 0c8h, 0c9h, 0cah, 0cbh, 0cch, 0cdh, 0ceh, 0cfh
  515. db 0d0h, 0d1h, 0d2h, 0d3h, 0d4h, 0d5h, 0d6h, 0d7h
  516. db 0d8h, 0d9h, 0dah, 0dbh, 0dch, 0ddh, 0deh, 0dfh
  517. db 0e0h, 0e1h, 0e2h, 0e3h, 0e4h, 0e5h, 0e6h, 0e7h
  518. db 0e8h, 0e9h, 0eah, 0ebh, 0ech, 0edh, 0eeh, 0efh
  519. db 0f0h, 0f1h, 0f2h, 0f3h, 0f4h, 0f5h, 0f6h, 0f7h
  520. db 0f8h, 0f9h, 0fah, 0fbh, 0fch, 0fdh, 0feh, 0ffh
  521. info4_len equ word ptr (offset $ - offset FileUcasetbl)
  522.     org 0BB1h - FIXED_DATA_START 
  523. FileCharstbl:
  524. dw  22 ; Table Size
  525. db  001h, 000h, 0ffh, 000h, 000h, 020h, 002h, 00eh
  526. db  02eh, 022h, 02fh, 05ch, 05bh, 05dh, 03ah, 07ch
  527. db  03ch, 03eh, 02bh, 03dh, 03bh, 02ch
  528. info5_len equ word ptr (offset $ - offset FileCharstbl)
  529.     org 0BE1h - FIXED_DATA_START    
  530. Collatingtbl:
  531. dw  256 ; Table Size
  532. db  000h, 001h, 002h, 003h, 004h, 005h, 006h, 007h
  533. db  008h, 009h, 00ah, 00bh, 00ch, 00dh, 00eh, 00fh
  534. db  010h, 011h, 012h, 013h, 014h, 015h, 016h, 017h
  535. db  018h, 019h, 01ah, 01bh, 01ch, 01dh, 01eh, 01fh
  536. db  020h, 021h, 022h, 023h, 024h, 025h, 026h, 027h
  537. db  028h, 029h, 02ah, 02bh, 02ch, 02dh, 02eh, 02fh
  538. db  030h, 031h, 032h, 033h, 034h, 035h, 036h, 037h
  539. db  038h, 039h, 03ah, 03bh, 03ch, 03dh, 03eh, 03fh
  540. db  040h, 041h, 042h, 043h, 044h, 045h, 046h, 047h
  541. db  048h, 049h, 04ah, 04bh, 04ch, 04dh, 04eh, 04fh
  542. db  050h, 051h, 052h, 053h, 054h, 055h, 056h, 057h
  543. db  058h, 059h, 05ah, 05bh, 05ch, 05dh, 05eh, 05fh
  544. db  060h, 041h, 042h, 043h, 044h, 045h, 046h, 047h
  545. db  048h, 049h, 04ah, 04bh, 04ch, 04dh, 04eh, 04fh
  546. db  050h, 051h, 052h, 053h, 054h, 055h, 056h, 057h
  547. db  058h, 059h, 05ah, 07bh, 07ch, 07dh, 07eh, 07fh
  548. db  043h, 055h, 045h, 041h, 041h, 041h, 041h, 043h
  549. db  045h, 045h, 045h, 049h, 049h, 049h, 041h, 041h
  550. db  045h, 041h, 041h, 04fh, 04fh, 04fh, 055h, 055h
  551. db  059h, 04fh, 055h, 024h, 024h, 024h, 024h, 024h
  552. db  041h, 049h, 04fh, 055h, 04eh, 04eh, 0a6h, 0a7h
  553. db  03fh, 0a9h, 0aah, 0abh, 0ach, 021h, 022h, 022h
  554. db  0b0h, 0b1h, 0b2h, 0b3h, 0b4h, 0b5h, 0b6h, 0b7h
  555. db  0b8h, 0b9h, 0bah, 0bbh, 0bch, 0bdh, 0beh, 0bfh
  556. db  0c0h, 0c1h, 0c2h, 0c3h, 0c4h, 0c5h, 0c6h, 0c7h
  557. db  0c8h, 0c9h, 0cah, 0cbh, 0cch, 0cdh, 0ceh, 0cfh
  558. db  0d0h, 0d1h, 0d2h, 0d3h, 0d4h, 0d5h, 0d6h, 0d7h
  559. db  0d8h, 0d9h, 0dah, 0dbh, 0dch, 0ddh, 0deh, 0dfh
  560. db  0e0h, 053h, 0e2h, 0e3h, 0e4h, 0e5h, 0e6h, 0e7h
  561. db  0e8h, 0e9h, 0eah, 0ebh, 0ech, 0edh, 0eeh, 0efh
  562. db  0f0h, 0f1h, 0f2h, 0f3h, 0f4h, 0f5h, 0f6h, 0f7h
  563. db  0f8h, 0f9h, 0fah, 0fbh, 0fch, 0fdh, 0feh, 0ffh
  564. info6_len equ word ptr (offset $ - offset Collatingtbl)
  565.     org 0CE3h - FIXED_DATA_START    
  566. DBCS_tbl:
  567. dw 0 ; Table Size
  568. db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
  569. db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
  570. info7_len equ word ptr (offset $ - offset DBCS_tbl)
  571.     org 0d12h - FIXED_DATA_START    
  572. dos_version dw 6 ; our DOS version number
  573. ; Don't know what these are for.....
  574. db 0c8h,0a6h
  575. db 0c8h,0a5h
  576. db 0c8h,0a5h
  577. db 0c8h,0a5h
  578. ; Now we have a list of days in each month
  579. Public days_in_month
  580. days_in_month db 31,28,31,30,31,30 ; Jan, Feb, Mar, Apr, May, Jun
  581. db 31,31,30,31,30,31 ; Jul, Aug, Sep, Oct, Nov, Dec
  582.     org 0d90h - FIXED_DATA_START    
  583. Public last_key_ext
  584. ;;last_key_ext db 0 ; flag set if last key zero
  585. ;** LINKER BODGE **
  586. ; I'd like to do the above, but LINKCMD blows up when I do (it seems to be to
  587. ; many relocatable publics in the data segment that do it). So as a work around
  588. ; I do the below instead. Since the location is fixed anyway it works out OK.
  589. last_key_ext equ byte ptr 0d90h
  590. ;** LINKER BODGE **
  591.     org 0e5bh - FIXED_DATA_START    
  592. ; Extended Error/Class/Action/Locus table. Used in conjuction with
  593. ; Int2F/1222 to setup extended error information
  594. db 13h,0Bh,07h,02h
  595. db 14h,04h,05h,01h
  596. db 15h,05h,07h,0FFh
  597. db 16h,04h,05h,01h
  598. db 17h,0Bh,04h,02h
  599. db 18h,04h,05h,01h
  600. db 19h,05h,01h,02h
  601. db 1Ah,0Bh,07h,02h
  602. db 1Bh,0Bh,04h,02h
  603. db 1Ch,02h,07h,04h
  604. db 1Dh,05h,04h,0FFh
  605. db 1Eh,05h,04h,0FFh
  606. db 1Fh,0Dh,04h,0FFh
  607. db 20h,0Ah,02h,02h
  608. db 21h,0Ah,02h,02h
  609. db 22h,0Bh,07h,02h
  610. db 32h,09h,03h,03h
  611. db 23h,07h,04h,01h
  612. db 24h,01h,04h,05h
  613. db 0FFh,0Dh,05h,0FFh
  614.     org 0eabh - FIXED_DATA_START    
  615. ; This is a translation table from old error codes to extended errors
  616. db 13h,14h,15h,16h,17h,18h,19h,1Ah
  617. db 1Bh,1Ch,1Dh,1Eh,1Fh,1Fh,1Fh,22h
  618. db 24h
  619. ; KLUDGE for DRDOS 6.0 security - the word at offset zero in SYSDAT (the
  620. ; SYStem DATa page) was the segment of the secure path string, with
  621. ; a zero value indicating a non-secure system.
  622. ; In order for DRDOS 6 level utilities to run we point SYSDAT at offset
  623. ; 10h in the DOS data segment (this unused word is zero). On secure systems
  624. ; the new LOGIN TSR will fix up both SYSDAT and the PD value to point to
  625. ; it's own dummy SYSDAT, and the utilities will behave correctly.
  626. Public @private_data
  627. @private_data rb 0 ; We need some private data
  628. dw endOfInstanceData ; 0000 historical PD offset
  629. dummy_sysdat dw 1 ; 0002 historical SYSDAT segment
  630. dw offset histbuf1 ; 0004 History Control Block 1
  631. dw offset histbuf2 ; 0006 History Control Block 2
  632. @hist_flg db 0 ; 0008 History Control
  633. ;   Bit 0 = Buffer Select 1 = COMMAND
  634. ;   Bit 1 = History Enable 1 = ENABLE
  635. db 1 ; 0009 Dual Language Version
  636. db 0 ; 000A Current message language
  637. dw 0 ; 000B Extended memory
  638. db 0 ; 000D (was # JMPF entries to fix up)
  639. codeSeg dw 0 ; 000E BDOS code segment (was seg of JMPF table)
  640. hmaRoot dw 0 ; 0010 Root of himem free chain
  641. dw 0 ; 0012 Initial Environment
  642. hmaAlloc dw 0 ; 0014 Root of himem allocation chain
  643. dmd_owner dw 0 ; 0016 Owner below which DMD's not freed
  644. dw 0 ; 0018 Link to upper memory DMD's
  645. LocalMachineID dw 0 ; 001A Patched by multi-tasker to correct value
  646. dmd_address dw 0 ; 001C Address below which DMD's not freed
  647. dw offset country_filename
  648. hashptr dw 0,0 ; 0020 hash root
  649. hashmax dw 0 ; 0024 max dir entries hashed
  650. dw 0 ; 0026 was deblock seg
  651. dw offset share_stub
  652. ; 0028 share stub offset
  653. dw offset globalPrivateData
  654. ; 002A pointer to global private data
  655. dw offset int2FBiosHandler
  656. ; 002C pointer to int 2F internal hook
  657. rw 10 ; space for expansion
  658. Public deblock_seg, fdos_stub
  659. fdos_stub dw fdos_stub_entry
  660. dw 0 ; fixup up at run time
  661. share_stub dw invalid_stub,0 ; DWORD ptr to 15
  662. dw nul_int,0 ; SHARE STUB routines
  663. dw nul_int,0 ; 
  664. dw nul_int,0 ; 
  665. dw nul_int,0 ; 
  666. dw nul_int,0 ; 
  667. dw nul_int,0 ; 
  668. dw nul_int,0 ; 
  669. dw nul_int,0 ; 
  670. dw nul_int,0 ; 
  671. dw invalid_stub,0 ; 
  672. dw nul_int,0 ; 
  673. dw nul_int,0 ; 
  674. dw nul_int,0 ; 
  675. dw nul_int,0 ; 
  676. Public WindowsHandleCheck
  677. WindowsHandleCheck db 26h ; MUST follow share_stub
  678. ; patched by switcher
  679. org 0FC0h - FIXED_DATA_START
  680. childSP dw 0
  681. childSS dw 0
  682. childIP dw 0
  683. childCS dw 0
  684. ; The following table defines the format of a DOS .EXE format file.
  685. ; The .EXE header is read into this data area and check for integrity
  686. ;
  687. Public exe_buffer
  688. exe_buffer rb EXE_LENGTH ; Local EXE header buffer
  689. if IDLE_DETECT
  690. Public idle_data
  691. Public active_cnt, idle_max
  692. Public idle_flags, idle_vec
  693. idle_data rw 0 ; Idle State Data Area
  694. active_cnt dw 0 ; InActive Function Count
  695. idle_max dw 10 ; Max No. of consecutive funcs.
  696. idle_flags dw IDLE_INIT ; $IDLE$ Has not been loaded
  697. idle_vec rd 1  ; DWORD pointer to IDLE handler
  698. Public int28_delay, int28_reload
  699. int28_delay dw 0 ; No. Consecutive INT28's 
  700. int28_reload dw 10 ; INT28 Delay Reload Value
  701. dw indos_flag ; Offset of INDOS_FLAG
  702. rw 2 ; 2 OEM Reserved Words
  703. endif
  704. org 1000h - FIXED_DATA_START ; nice 4K boundry
  705. ; for multitasker
  706. PCMODE_DSIZE DSEG PARA
  707. Public data_end
  708. data_end rw 0
  709. PCMODE_CODE CSEG WORD 'DATA'
  710. PCMODE_CODE_START equ 1000h
  711. public MUSTBE1000
  712. MUSTBE1000:
  713. Public endOfInstanceData
  714. endOfInstanceData rw 0
  715. ;*** fixed data - init does segment fixups ***
  716. stub_entries rw 0
  717. Public lock_bios, unlock_bios, lock_tables, unlock_tables
  718. lock_bios dw lockbios,0 ; MSNET critical region stubs
  719. unlock_bios dw unlockbios,0 ; MSNET critical region stubs
  720. lock_tables dw locktables,0 ; MSNET critical region stubs
  721. unlock_tables dw unlocktables,0 ; MSNET critical region stubs
  722. Public exec_stub
  723. exec_stub dw ExecStub,0 ; Int 21 EXEC hook
  724. public func4B05_stub
  725. func4B05_stub dw Func4B05Stub,0 ; Int 21/4B05 hook
  726. NUM_STUB_ENTRIES equ (offset $ - offset stub_entries)/4
  727. ;*** fixed data ends ***
  728. cmp ds:error_flag,0 ; JT-FAX uses this code sequence to
  729. jnz $ ; find the address of the ERROR_FLAG
  730. mov sp,0A06h
  731. test ss:error_flag,0FFh ; SIDEKICK usues this fragment to
  732.  jnz $ ; locate the ERROR_FLAG
  733. push ss:word ptr int28_flag
  734. int 28h
  735. ;==========================
  736. ; Entry points for DOS Code
  737. ;==========================
  738. ;
  739. ; These are normally all of the form
  740. ;
  741. ;EntryPoint:
  742. ; JMPF xxxx:RealEntryPoint
  743. ; db 3 dup(?)
  744. ;
  745. ; When we are in the HMA, and so may disable the HMA during EXEC for EXEPACK
  746. ; problems, we convert them to the following
  747. ;
  748. ;EntryPoint:
  749. ; call A20Enable
  750. ; JMPF xxxx:RealEntryPoint
  751. ;
  752. ; On an exec the A20 gate is disabled. This allows EXEPACKed programs to
  753. ; unpack properly. (some exepacked apps have a wrap-round bug which addresses
  754. ; the bottom 64K via the HMA).
  755. ;
  756. ; On the first Int 21 etc the A20Enable routine enables the A20 gate.
  757. ;
  758. extrn int20_entry:near, int21_entry:near
  759. extrn int25_entry:near, int26_entry:near
  760. extrn int27_entry:near, int2F_entry:near
  761. extrn call5_entry:near
  762. FirstCodeEntryPoint rw 0
  763. Int20Entry:
  764. db 0EAh ; JMPF
  765. dw int20_entry
  766. rb 5 ; filled in at run time
  767. Int21Entry:
  768. db 0EAh ; JMPF
  769. dw int21_entry
  770. rb 5 ; filled in at run time
  771. Int25Entry:
  772. db 0EAh ; JMPF
  773. dw int25_entry
  774. rb 5 ; filled in at run time
  775. Int26Entry:
  776. db 0EAh ; JMPF
  777. dw int26_entry
  778. rb 5 ; filled in at run time
  779. Int27Entry:
  780. db 0EAh ; JMPF
  781. dw int27_entry
  782. rb 5 ; filled in at run time
  783. Int2FEntry:
  784. db 0EAh ; JMPF
  785. dw int2f_entry
  786. rb 5 ; filled in at run time
  787. Call5Entry:
  788. db 0EAh ; JMPF
  789. dw call5_entry
  790. rb 5 ; filled in at run time
  791. LastCodeEntryPoint rw 0
  792. BIOSA20Enable:
  793. ;-------------
  794. ; CALLF'd by the BIOS
  795. call A20Enable ; do a near call
  796. sti ; re-enable interrupts
  797. retf ; RETF to BIOS
  798. A20Disable:
  799. ;----------
  800. ; On Entry:
  801. ; DX = psp we are execing
  802. cmp dx,0FF0h ; if we are above 64K skip the
  803.  jae A20Disable10 ;  EXE pack kludge
  804. push ax
  805. mov ah,6 ; disable the A20 gate during EXEC
  806. callf cs:xmsDriver ;  so buggy EXE packing will work
  807. pop ax
  808. A20Disable10:
  809. ret
  810. A20Enable:
  811. ;---------
  812. ; On Entry:
  813. ; None
  814. ; WARNING - DS/ES/STACK could be anything
  815. ; On Exit:
  816. ; All regs preserved
  817. ;
  818. ; Unhook our Entry stubs so we don't get here again.
  819. ; Enable the global A20 line to make the DOS/BIOS/COMMAND code visible
  820. ;
  821. cli
  822. push ax
  823. push ds
  824. mov ax,0FFFFh
  825. mov ds,ax
  826. mov ax,ds:.94h ; is the HMA alias for Int 21
  827. or ax,ds:.96h ;  zero - if so the HMA is there
  828. pop ds
  829.  jnz A20Enable10
  830. pop ax
  831. ret
  832. A20Enable10:
  833. ; We need to enable the A20 gate, go do so
  834. push bx
  835. mov cs:oldSS,ss ; save stack
  836. mov cs:oldSP,sp
  837. mov ax,cs
  838. mov ss,ax ; swap to the error stack in case
  839. mov sp,offset error_stack ;  3rd part XMS driver needs a lot
  840. mov ah,5 ; enable A20, ignoring errors as we
  841. callf cs:xmsDriver ;  can't do anything about them
  842. mov ss,cs:oldSS ; switch back to callers stack
  843. mov sp,cs:oldSP
  844. pop bx
  845. pop ax
  846. ret
  847. oldSS dw 0 ; save area for stack swap
  848. oldSP dw 0
  849. ; +++++++++++++++++++++++++++++++++
  850. ; Default Int 24 Handler for DR DOS
  851. ; +++++++++++++++++++++++++++++++++
  852. ;
  853. ; Our default critical error handler during boot simply FAIL's all
  854. ; critical errors. When COMMAND.COM is loaded this will install
  855. ; the "normal" Retry/Abort/Ignore handler.
  856. ;
  857. ; These interrupts normally point to an IRET.
  858. ;
  859. ;
  860. Int24Entry:
  861. ;==========
  862. mov al,3 ; return "FAIL"
  863. DummyIRET:
  864. ;=========
  865. iret
  866. ; EXEC Code
  867. ;
  868. ; In order to cope with old buggy EXEPACKED programs we need to turn
  869. ; the A20 gate of during the exec, and turn it back on asap.
  870. ; To do this we hook all the DOS code entry points and re-enable the
  871. ; A20 whenever the app issues an Int 21 etc
  872. ;
  873. ExecStub:
  874. ;========
  875. ; On Entry:
  876. ; AX = FCB validity flags
  877. ; DX = current PSP
  878. ; ES:SI -> new CS:IP
  879. ; CX:DI -> users stack
  880. ; On Exit:
  881. ; AX = FCB validity flags
  882. ; BX = 0
  883. ; SS:SP = users stack
  884. ; CS:IP = values from EXE header
  885. ; DS = ES = DX = current PSP
  886. ;
  887. ; When we start execing the application we have the A20 gate disabled so
  888. ; buggy EXE packed programs will unpack properly.
  889. ; We also hook Int 21 and Int 2F to re-enable the A20 gate on the first
  890. ; calls made to them. (These should only happen AFTER the unpacking).
  891. ;
  892. call A20Disable
  893. mov ss,cx ; switch to new USER stack
  894. mov sp,di
  895. push es
  896. push si ; CS:IP on USER stack
  897. mov ds,dx ; DS = ES = PSP we are exec'ing
  898. mov es,dx
  899. xor bx,bx ; BX = zero, set flags
  900. sti
  901. retf ; lets go!
  902. Func4B05Stub:
  903. ;============
  904. ; On Entry:
  905. ; ES:BP -> callers stack
  906. ; DX = PSP to exec on
  907. ; On Exit:
  908. ; callers registers restored
  909. ;
  910. call A20Disable ; turn off A20
  911. mov ax,es
  912. mov ss,ax ; back to users stack
  913. mov sp,bp
  914. POP$DOS ; Restore Registers
  915. iret
  916. Public int2FNext, int2FBiosHandler
  917. Int2FBios:
  918. ;---------
  919. ; On Entry:
  920. ; DS on stack
  921. ; On Exit:
  922. ; All regs preserved
  923. ;
  924. ; Pass on an Int 2F call to the BIOS
  925. pop ds ; recover DS and pass on to BIOS
  926. db 0EAh ; JMPF bios Int 2F entry point
  927. int2FBiosHandler dw 0,0 ; filled in at run time
  928. int2FNext dw Int2FBios, 0 ; seg filled in at run time
  929. nul_strat:
  930. cmp RH_CMD,CMD_INPUT
  931.  jne nul_strat10 ; if it's input
  932. mov RH4_COUNT,0 ; Say none transferred #IJ
  933. nul_strat10:
  934. mov RH_STATUS,RHS_DONE ; Set the DONE bit in the
  935. nul_int: ; Request Header and Return
  936. clc ; (indicate success for SHARE)
  937. retf
  938. Public invalid_stub
  939. invalid_stub:
  940. mov ax,ED_FUNCTION ; indicate bad function
  941. fdos_stub_entry:
  942. stc ; indicate error
  943. retf
  944. Public lock_bios, unlock_bios, lock_tables, unlock_tables
  945. lockbios:
  946. ;--------
  947. push ax
  948. mov ax,8002h
  949. jmps CriticalSection
  950. unlockbios:
  951. ;----------
  952. push ax
  953. mov ax,8102h
  954. jmps CriticalSection
  955. locktables:
  956. ;----------
  957. push ax
  958. mov ax,8001h
  959. jmps CriticalSection
  960. unlocktables:
  961. ;------------
  962. push ax
  963. mov ax,8101h
  964. ; jmps CriticalSection
  965. CriticalSection:
  966. ;---------------
  967. ; On Entry:
  968. ; AX = critical section number
  969. ; STACK = original AX
  970. ; On Exit:
  971. ; AX poped from stack
  972. ;
  973. cmp cs:criticalSectionEnable,0
  974.  je CriticalSection10
  975. int 2ah ; issue critical section callout
  976. CriticalSection10:
  977. pop ax
  978. retf
  979. public criticalSectionEnable
  980. criticalSectionEnable db 0
  981. Public SwStartupInfo
  982. SwStartupInfo dw 3 ; version
  983. dw 0
  984. dw 0 ; link to next in chain
  985. ;;      dw  offset vxdName  ; Virtual Dev file
  986. ;; replaced above line with DW 0 as vxd no longer required BAP
  987. dw 0
  988. dw 0
  989.         dw  0,0     ; Reference Data
  990. dw offset instanceItems
  991. instanceSeg dw 0
  992. ;vxdName db 'A:OPENDOS.386',0
  993. public histbuf1, histsiz1, histbuf2, histsiz2
  994. instanceItems:
  995. dw 0 ; offset zero (for instancing)
  996. histbuf1 dw 0 ; Command history buffer segment
  997. histsiz1 dw 0 ; size (in bytes)
  998. dw 0 ; offset zero (for instancing)
  999. histbuf2 dw 0 ; Application history buffer segment
  1000. histsiz2 dw 0 ; size (in bytes)
  1001. ; some ROS fixups
  1002. dw 000h,050h,002h ; BASIC variables
  1003. dw 00Eh,050h,014h ; BASIC variables
  1004. ; some BIOS fixups
  1005. dw 0B8h,070h,004h ; BIOS req_hdr
  1006. ; dw 16Ch,070h,002h ; BIOS dev_no (no longer required)
  1007. dw 600h,070h,002h ; BIOS local_char
  1008. bdosInstanceFixups rw 0
  1009. dw con_device,0,4 ; CON: device ptr
  1010. dw savbuf,0,column-savbuf+1
  1011. dw dmd_upper_root,0,2
  1012. dw dmd_upper_link,0,1
  1013. dw exe_buffer,0,EXE_LENGTH
  1014. dw 0,0 ; zero terminated instance list
  1015. xmsDriver rd 1
  1016. globalPrivateData:
  1017. rd 1 ; 0000 delwatch driver vector
  1018. rw 4 ; space for expansion
  1019. ;** COUNTRY INFO **
  1020. ;
  1021. ; The following routines are called by the end user using the DWORD 
  1022. ; pointers in the Country Data. Each Country Data area contains a 
  1023. ; pointer to one of the following routines. All valid charcater
  1024. ; codes above 7Fh are translated to Upper Case
  1025. ;
  1026. Public xlat_xlat
  1027. xlat_xlat:
  1028. cmp al,080h
  1029.  jb xlat_exit
  1030. sub al,080h
  1031. push bx
  1032. mov bx,offset Standard_table
  1033. xlat cs:al
  1034. pop bx
  1035. xlat_exit:
  1036. retf
  1037. Public cur_country
  1038. Public cur_cp
  1039. Public default_country
  1040. Public country_data
  1041. Public  Ucasetbl
  1042. Public  FileUcasetbl
  1043. Public FileCharstbl
  1044. Public  Collatingtbl
  1045. Public DBCS_tbl
  1046. Public info1_len
  1047. Public info2_len
  1048. Public info4_len
  1049. Public info5_len
  1050. Public info6_len
  1051. Public info7_len
  1052. Public intl_xlat
  1053. ; table of pointers to default country info. pointed to in BDOS header 
  1054. Public NoYesChars
  1055. NoYesChars db 'NnYy'
  1056. dw country_data
  1057. dw default_country
  1058. dw Ucasetbl
  1059. dw FileUcasetbl
  1060. dw FileCharstbl
  1061. dw Collatingtbl
  1062. dw DBCS_tbl
  1063. org 11F0h - PCMODE_CODE_START
  1064. dummy_fcbs dw 0ffffh ; terminate now
  1065. dw 0
  1066. dw 1 ; with one entry
  1067. rb DHNDL_LEN ; this many bytes in it
  1068.     org 1232h - PCMODE_CODE_START   
  1069. Public country_filename
  1070. country_filename db 'COUNTRY.SYS'
  1071. rb 64 - length country_filename
  1072.     org 1276h - PCMODE_CODE_START   
  1073. ; We fix the country tables at this location for the benefit of
  1074. ; LAN Manager 2.2 extended edition. It peeks directly rather than use
  1075. ; int 21/65 !
  1076. countryTable:
  1077. db 2
  1078. dw offset UCasetbl,0
  1079. db 4
  1080. dw offset FileUCasetbl,0
  1081. db 5
  1082. dw offset FileCharstbl,0
  1083. db 6
  1084. dw offset Collatingtbl,0
  1085. db 7
  1086. dw DBCS_tbl,0
  1087. db 1
  1088. dw 26h
  1089. country_data:
  1090. cur_country dw 1 ; Country Code
  1091. cur_cp dw 437 ; Code Page
  1092. default_country:
  1093. dw US_DATE ; Date Format (Binary)
  1094. db '$',0,0,0,0 ; Currency Symbol
  1095. db ',',0 ; Thousands Separator
  1096. db '.',0 ; Decimal Separator
  1097. db '-',0 ; Date Separator
  1098. db ':',0 ; Time Separator
  1099. db 0 ; Symbol before Value without Space ($n.nn)
  1100. db 2 ; Significant Currency Digits
  1101. db CLOCK_12 ; Time Format
  1102. intl_xlat dw xlat_xlat ; Case Translation Routine
  1103. dw 0000h ; Case Translation Segment (Runtime Fixup)
  1104. db ',',0 ; Data List Separator
  1105. info1_len equ word ptr (offset $ - offset country_data)
  1106. ; If NOT COUNTRY.SYS then include the
  1107. rb 10 ; 10 zero bytes held at the end of the
  1108. ; country information.
  1109. PCM_CODEND CSEG PARA
  1110. Public code_end
  1111. code_end rb 0
  1112. BDOS_DATA DSEG
  1113. Public hashroot, hashmax
  1114. ; The hashroot must be global, but we also need to make it accessible
  1115. ; during CONFIG so we copy it from the private data area
  1116. hashroot dw 0,0
  1117. PCM_HISTORY CSEG
  1118. patch_area dw 0666h
  1119. include i:patch.cod
  1120. PCM_ICODE cseg
  1121. ;
  1122. ; The following routine initializes all the standard MS-DOS interrupt
  1123. ; vectors which are initialized to point to the PC-MODE handlers.
  1124. ;
  1125. ; Entry: AX Memory Size - Paragraphs
  1126. ; BX First Available Paragraph
  1127. ; DL Initial Drive
  1128. ; DS PCM Dseg
  1129. ;
  1130. pcmode_init:
  1131. and cs:patch_version,not DOSINROM
  1132. ; won't clear if we are in ROM...
  1133. mov cs:pcmode_dseg,ds ; save PCM Dseg
  1134. mov ds:instanceSeg,ds ; fixup pointer to instance items
  1135. ; removed this as VxD no longer required   BAP
  1136. ; mov ds:vxdNameSeg,ds ;  and vxdName
  1137. ; add ds:vxdName,dl ; fixup drive letter
  1138. mov ds:word ptr buf_ptr+2,ds
  1139. mov ds:word ptr file_ptr+2,ds
  1140. mov ds:word ptr fcb_ptr+2,ds
  1141. push ax ; Save the memory size
  1142. push bx ; First Free Paragraph
  1143. mov ds:current_dsk,dl ; save initial drive
  1144. inc dl ; make drive one based
  1145. mov ds:bootDrv,dl ;  and save for func 3305
  1146. mov ax,ds ; AX = PCMode Data
  1147. mov ds:word ptr fdos_stub+WORD,ax
  1148. add ds:dummy_sysdat,ax ; point dummy "sysdat" at a zero word
  1149. ;  ie. dummy "secure path" segment
  1150. mov si,offset countryTable
  1151. countryFixupLoop:
  1152. mov ds:word ptr 3[si],ds ; fixup the segment
  1153. add si,5 ; onto the next entry
  1154. cmp ds:word ptr 3[si],0 ; done the lot yet ?
  1155.  je countryFixupLoop
  1156. mov es,ax ; ES -> PCMode Data
  1157. mov di,offset stub_entries ; ES:DI -> stub segs
  1158. mov cx,NUM_STUB_ENTRIES ; entries to initialise
  1159. stubs_loop:
  1160. add di,WORD ; skip the offset
  1161. stosw ; fixup segment
  1162. loop stubs_loop ; do the next one
  1163. mov di,offset share_stub ; fixup the SHARE entries
  1164. mov cx,NUM_SHARE_STUB_ENTRIES
  1165. share_loop:
  1166. add di,WORD ; skip the offset
  1167. stosw ; fixup segment
  1168. loop share_loop
  1169. ; mov cx,0
  1170. mov es,cx ; Initialize the DOS vectors
  1171. mov ax,es:.INT2F_OFFSET ; remember address of BIOS Int 2F
  1172. mov ds:int2FBiosHandler,ax
  1173. mov ax,es:.INT2F_SEGMENT
  1174. mov ds:int2FBiosHandler+2,ax
  1175. mov ds:int2FNext+2,ds ; fixup seg of out stub
  1176. mov cx,40h-2Ah ; 2A-3F point at IRET in DOS Data Seg
  1177. mov di,INT2A_OFFSET
  1178. dummy_vecs_loop:
  1179. mov ax,offset DummyIRET ; point at an IRET
  1180. stosw ; do the offset
  1181. mov ax,ds
  1182. stosw ; then the segment
  1183. loop dummy_vecs_loop
  1184. mov si,offset def_data_vecs ; the following vector point to
  1185. mov cx,no_def_data_vecs ; pcmode DATA seg
  1186. def_data_vecs_loop:
  1187. lods cs:ax ! mov di,ax ; Get the Vector Offset (from CS)
  1188. db 2Eh ; CS:
  1189. movsw ; copy service routine offset
  1190. mov ax,ds ; finally fixup the segment too
  1191. stosw
  1192. loop def_data_vecs_loop
  1193. mov es:byte ptr .INT30_OFFSET,0EAh
  1194. ; fixup CALL 5 JMPF
  1195. mov si,offset bdosInstanceFixups
  1196. InstanceFixupLoop:
  1197. mov ds:2[si],ds ; fixup data segment
  1198. add si,6 ; onto next item
  1199. mov ax,ds:[si] ; still BDOS ?
  1200. or ax,ds:2[si]
  1201.  jnz InstanceFixupLoop ; yep, do another one
  1202. push cs ; we will have a RETF
  1203. call pcmode_reinit ; to return from this call
  1204. pop ax ; First Free Paragraph
  1205. pop dx ; Restore the BIOS memory size
  1206. sub dx,ax ; convert to TPA size
  1207. dec dx ; Decrement the Size by DMD Size
  1208. push ax
  1209. add ax,dx ; AX = possible next DMD
  1210. mov es,ax
  1211. mov al,IDZ ; assume no extra DMD's
  1212. cmp al,es:DMD_ID ; have we extra one ?
  1213.  jne pcmode_init10
  1214. mov al,IDM ; yes, no longer end of chain
  1215. dec dx ; decrement by size of existing DMD
  1216. pcmode_init10:
  1217. pop es
  1218. mov es:DMD_ID,al ; Last DMD in list
  1219. mov es:DMD_PSP,0000h ; This is Free Memory Owning PSP == 0
  1220. mov es:DMD_LEN,dx ; Save Memory Length
  1221. mov es:word ptr DMD_NAME,'S'+256*'D'
  1222. mov es:DMD_NAME+2,0
  1223. mov ds:dmd_root,es ; Save the DMD address in root
  1224. retf
  1225. eject
  1226. ;
  1227. ;
  1228. ; On Entry:
  1229. ; DS = DOS data seg
  1230. pcmode_reinit:
  1231. ;=============
  1232. mov ds:word ptr intl_xlat+2,ds
  1233. ; fixup intl case routine
  1234. mov ds:codeSeg,cs ; fixup code segment
  1235. mov ax,ds:hashptr ; make a copy of the hashroot
  1236. mov ds:hashroot,ax ;  so it's global
  1237. mov ax,ds:hashptr+WORD
  1238. mov ds:hashroot+WORD,ax
  1239. mov al,ds:@hist_flg ; get initial history flags
  1240. and ax,RLF_ENHANCED+RLF_INS+RLF_SEARCH
  1241. mov ds:cle_state,ax ; use to set initial editing state
  1242. mov ds:word ptr xmsDriver,offset invalid_stub
  1243. mov ds:word ptr xmsDriver+2,ds
  1244. mov bx,offset FirstCodeEntryPoint
  1245. pcmode_reinit10:
  1246. mov ds:3[bx],cs ; fixup segment of the JMPF
  1247. add bx,8 ; onto the next one
  1248. cmp bx,offset LastCodeEntryPoint
  1249.  jb pcmode_reinit10
  1250. mov ax,ds:hmaRoot ; have we established an HMA free chain
  1251. or ax,ds:hmaAlloc ;  or have any registered users ?
  1252.  jz pcmode_reinit30 ; if so hook for EXEPACK support
  1253. mov ax,4300h
  1254. int 2Fh ; do we have an XMS driver ?
  1255. cmp al,80h ;  80h says yes
  1256.  jne pcmode_reinit30
  1257. mov ax,4310h ; get it's entry point
  1258. int 2Fh ;  in ES:BX
  1259. mov ds:word ptr xmsDriver,bx
  1260. mov ds:word ptr xmsDriver+2,es
  1261. mov ax,0FFFFh
  1262. mov es,ax
  1263. inc ax ; AX = 0
  1264. mov es:.94h,ax ; zero the HMA alias for Int 21
  1265. mov es:.96h,ax ;  we use this as our A20 gate test
  1266. mov bx,offset FirstCodeEntryPoint
  1267. pcmode_reinit20:
  1268. mov ax,offset A20Enable-3 ; we need a relative offset to
  1269. sub ax,bx ;  poke in a "call A20Enable"
  1270. xchg ax,ds:1[bx] ; pick up the entry point segment
  1271. mov ds:byte ptr 0[bx],0E8h ; CALL NEAR
  1272. mov ds:byte ptr 3[bx],0EAh ; JMPF
  1273. mov ds:4[bx],ax ; fixup the offset
  1274. mov ds:6[bx],cs ; fixup the segment
  1275. add bx,8 ; ready to do the next entry
  1276. cmp bx,offset LastCodeEntryPoint
  1277.  jb pcmode_reinit20
  1278. mov ax,70h ; now fixup the BIOS A20 Enable
  1279. mov es,ax
  1280. xor di,di ; patch entry point at 70:0
  1281. mov al,09Ah ; CALLF
  1282. stosb
  1283. mov ax,offset BIOSA20Enable
  1284. stosw ; offset
  1285. mov ax,ds
  1286. stosw ; seg
  1287. mov al,0C3h
  1288. stosb ; RET
  1289. cmp ds:codeSeg,0F000h ; have we relocated DOS into the HMA ?
  1290.  jb pcmode_reinit30 ;  if so we must remember it
  1291. or cs:patch_version,DOSINHMA
  1292. pcmode_reinit30:
  1293. retf
  1294. def_data_vecs rw 0
  1295. dw INT22_OFFSET, DummyIRET
  1296. dw INT23_OFFSET, DummyIRET
  1297. dw INT24_OFFSET, Int24Entry
  1298. dw INT28_OFFSET, DummyIRET
  1299. dw INT20_OFFSET, Int20Entry
  1300. dw INT21_OFFSET, Int21Entry
  1301. dw INT25_OFFSET, Int25Entry
  1302. dw INT26_OFFSET, Int26Entry
  1303. dw INT27_OFFSET, Int27Entry
  1304. dw INT2F_OFFSET, Int2FEntry
  1305. dw INT30_OFFSET+1,Call5Entry
  1306. no_def_data_vecs equ (offset $ - offset def_data_vecs)/4
  1307. end