HEADER.A86
资源名称:drdossrc.zip [点击查看]
上传用户:xiaogehua
上传日期:2007-01-08
资源大小:1183k
文件大小:43k
源码类别:
操作系统开发
开发平台:
Asm
- ; File : $HEADER.A86$
- ;
- ; Description :
- ;
- ; Original Author : DIGITAL RESEARCH
- ;
- ; Last Edited By : $CALDERA$
- ;
- ;-----------------------------------------------------------------------;
- ; Copyright Work of Caldera, Inc. All Rights Reserved.
- ;
- ; THIS WORK IS A COPYRIGHT WORK AND CONTAINS CONFIDENTIAL,
- ; PROPRIETARY AND TRADE SECRET INFORMATION OF CALDERA, INC.
- ; ACCESS TO THIS WORK IS RESTRICTED TO (I) CALDERA, INC. EMPLOYEES
- ; WHO HAVE A NEED TO KNOW TO PERFORM TASKS WITHIN THE SCOPE OF
- ; THEIR ASSIGNMENTS AND (II) ENTITIES OTHER THAN CALDERA, INC. WHO
- ; HAVE ACCEPTED THE CALDERA OPENDOS SOURCE LICENSE OR OTHER CALDERA LICENSE
- ; AGREEMENTS. EXCEPT UNDER THE EXPRESS TERMS OF THE CALDERA LICENSE
- ; AGREEMENT NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED,
- ; COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED,
- ; CONDENSED, EXPANDED, COLLECTED, COMPILED, LINKED, RECAST,
- ; TRANSFORMED OR ADAPTED WITHOUT THE PRIOR WRITTEN CONSENT OF
- ; CALDERA, INC. ANY USE OR EXPLOITATION OF THIS WORK WITHOUT
- ; AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO CRIMINAL AND
- ; CIVIL LIABILITY.
- ;-----------------------------------------------------------------------;
- ;
- ; *** Current Edit History ***
- ; *** End of Current Edit History ***
- ; $Log: $
- ; HEADER.A86 1.26 94/12/02 09:34:18
- ; added FCB LRU counter and sharing flag
- ; HEADER.A86 1.24 94/11/15 08:53:04
- ; Fixed the NWDOS.386 stuff. Still point at startupinfo, but take out the
- ; vxdname and the vxdnameseg entries.
- ; HEADER.A86 1.23 94/06/28 14:31:07
- ; Fix last_key_ext bug
- ; HEADER.A86 1.17 93/11/22 15:23:16
- ; Move idle data to instance page to get per domain idle detection
- ; HEADER.A86 1.15 93/11/08 19:09:22
- ; Handle EXEPACK problems even if DOS not in HMA
- ; HEADER.A86 1.14 93/11/14 18:14:21
- ; Initialise fdos_buf to 2/0
- ; HEADER.A86 1.13 93/10/07 19:08:25
- ; CALL5 always goes through 0:C0 (or FFFF:D0 alias)
- ; HEADER.A86 1.12 93/09/03 20:28:39
- ; Add intl/dbcs support for int 21/6523 (query yes/no char)
- ; HEADER.A86 1.11 93/09/02 22:26:24
- ; Make uppercase tables compatible (See COMPATIBLE flag in COUNTRY.SYS)
- ; HEADER.A86 1.9 93/08/10 17:41:25
- ; Move code fragments for Rolodex Live
- ; HEADER.A86 1.8 93/08/04 15:15:39
- ; re-arrange dummy fcbs
- ; HEADER.A86 1.6 93/07/22 19:29:19
- ; add no/yes characters
- ; HEADER.A86 1.5 93/07/20 22:46:33
- ; dmd_upper_root defaults to FFFF
- ; ENDLOG
- ;
- ; DRDOS Header/Initialization Code
- ;
- ; NB.
- ; On a system where the kernel stays low and history is disabled we throw
- ; away as much code as possible. This includes the patch area, the command
- ; line history code, and the BDOS initialisation code.
- ; As we use the patch area the pointer in the header should be incremented
- ; in order to retain progressively larger amounts of code.
- include pcmode.equ
- include vectors.def
- include i:cmdline.equ
- include i:doshndl.def
- include i:driver.equ
- include i:exe.def
- include i:f52data.def
- include i:fdos.equ
- include i:mserror.equ
- include i:psp.def
- include i:reqhdr.equ
- include i:country.def
- PADDING equ 14*1024 ; offset code start by this much
- DOSINROM equ 0800h
- DOSINHMA equ 1000h
- ;****************************************************************************
- ; The format of the header is FIXED and should not be modified.
- ;****************************************************************************
- PCM_HEADER CSEG PARA
- extrn edit_size:word
- dw PADDING
- rb PADDING-2 ; Insert Header
- Public code_start
- code_start:
- ; jmp pcmode_init ; PCMODE Init Entry
- db 0E9h
- dw pcmode_init-PADDING-3
- ; jmp pcmode_reinit ; PCMODE Re Init Entry
- db 0E9h
- dw pcmode_reinit-PADDING-6
- Public pcmode_dseg, os_version, patch_version
- pcmode_dseg dw 0 ; 0006h PCMODE Data Segment Pointer
- dw PADDING ; 0008h offset of start of code
- os_version dw 1072h ; 000Ah OS version
- dw patch_area-PADDING ; 000Ch offset of disposable code
- dw pcmode_init-PADDING ; 000Eh offset of initialisation code
- db 0EAh ; 0010h JMPF (MUST be para aligned)
- dw 4*30h ; 0011h through the Int 30 vec
- dw 0 ; 0013h to CALL 5 entry point
- rb 7 ; 0015h make following offsets same as 5.0
- dw 0 ; 001Ch Compressed Data Flag
- dw code_end-PADDING ; 001Eh PCMODE Code Size in Bytes
- dw data_end ; 0020h PCMODE Data Length in Bytes
- patch_version dw DOSINROM+0000h ; 0022h sub-version (was SYSDAT length)
- db 0 ; 0024h Kanji Support Flag
- db 0 ; 0025h Reserved
- dw edit_size-PADDING ; 0026h Pointer Command Line Editor
- ; control table.
- dw NoYesChars ; 0028h offset in data of pointers to
- ; default country info.
- ;****************************************************************************
- ; The format of the data is FIXED and should not be modified.
- ;****************************************************************************
- PCMODE_DATA DSEG WORD
- Public codeSeg ; BDOS code segment
- Public dmd_root ; Root of DOS Memory List
- Public hmaRoot ; Root of HMA chain
- Public func52_data ; Start of the FUNC 52 compatible data
- Public last_drv ; Last Drive
- Public phys_drv
- Public dev_root ; Root of Device List
- Public nul_device ; NUL Device
- Public ddsc_ptr
- Public retcode
- Public user_retcode
- Public system_retcode
- Public break_sp
- Public net_retry
- Public net_delay
- Public file_ptr
- Public clk_device ; Clock Device Pointer
- Public con_device ; Console Device Pointer
- Public bcb_root ; Linked List of Buffers
- Public fcb_ptr
- Public ldt_ptr
- Public join_drv
- Public share_stub
- Public sector_size
- Public setverPtr
- Public dos_version
- Public @hist_flg ; History control flag
- Public dmd_address ; don't free DMD's with segment under this value
- Public dmd_owner ; don't free DMD's with owner under this value
- Public dmd_upper_root ; link to upper memory
- Public dmd_upper_link
- Public LocalMachineID ; Normal 0, fixed up by multi-tasker
- Public biosDate ; 6 byte buffer to read/write clock
- Public minute
- Public hour
- Public hundredth
- Public second
- Public dayOfMonth
- Public month
- Public yearsSince1980
- Public daysSince1980
- Public dayOfWeek
- org 0
- dos_data db 0
- dw code_start
- rb 1 ; padding
- if DOS5
- dw 1
- else
- dw 0
- endif
- ; make end of vladivar instance data public for the multi-tasker
- rb 06h - (offset $ - offset dos_data)
- dw endOfInstanceData
- rb 0eh - (offset $ - offset dos_data)
- Public netbios, name_num, fcb_lru_count
- netbios db 0 ; NetBios Name Number
- name_num db 0 ; 0 - Undefined Name
- fcb_lru_count dw 0 ; fcb LRU counter
- rb 26h-0ch-(offset $ - offset dos_data) ; align func52_data on 26
- ;************************************************************************
- ;* *
- ;* Below is the DOS defined area of the SYSTEM variables *
- ;* above are variables defined for DR DOS. *
- ;* *
- ;************************************************************************
- net_retry dw 3 ;-000C Network retry count
- net_delay dw 1 ;-000A Network delay count
- bcb_root dw -1,-1 ;-0008 Current DOS disk buffer
- dw 0 ;-0004 Unread CON input
- dmd_root dw 0 ;-0002 Root of DOS Memory List (Segment)
- func52_data rb 0
- ddsc_ptr rd 0 ; 0000 DWORD ptr to DDSC
- dw -1,-1
- file_ptr rd 0 ; 0004 DWORD ptr file table
- dw msdos_file_tbl,0
- clk_device rd 0 ; 0008 DWORD ptr Clock Device Header
- dw -1,-1 ; Initialize to an Invalid Address
- con_device rd 0 ; 000C DWORD ptr Console Device Header
- dw -1,-1 ; Initialize to an Invalid Address
- sector_size dw 128 ; 0010 WORD Buffer Size (Max Sector Size)
- buf_ptr dw buf_info,0 ; 0012 DWORD ptr to Disk Buffer Info
- ldt_ptr dw 0,0 ; 0016 DWORD ptr Path Structures
- fcb_ptr dw dummy_fcbs,0 ; 001A DWORD ptr FCB Control Structures
- dw 0 ; 001E WORD UNKNOWN
- phys_drv db 0 ; 0020 BYTE Number of Physical Drives
- last_drv db 0 ; 0021 BYTE Last Drive
- dev_root rd 0 ; 0022 DWORD ptr Device Driver List
- nul_device dw -1,-1 ; Next Device Pointer
- dw DA_CHARDEV+DA_ISNUL ; 0026 NUL Device Attributes
- dw nul_strat ; 0028 NUL Device Strategy routine
- dw nul_int ; 002A NUL Device Interrupt routine
- db 'NUL ' ; 002C NUL Device Name
- join_drv db 0 ; 0034 BYTE Number of JOIN'd drives
- dw 0 ; 0035 DOS 4 pointer to special names (always zero in DOS 5)
- setverPtr dw 0,0 ; 0037 setver list
- dw 0 ; 003B unknown
- dw 0 ; 003D psp of last umb exec
- dw 1 ; 003F number of buffers
- dw 1 ; 0041 size of pre-read buffer
- public bootDrv
- bootDrv db 0 ; 0043 drive we booted from
- db 0 ; 0044 cpu type (1 if >=386)
- dw 0 ; 0045 Extended memory
- buf_info rd 1 ; 0047 disk buffer chain
- dw 0 ; 004B 0 (DOS 4 = # hashing chains)
- rd 1 ; 004D pre-read buffer
- dw 0 ; 0051 # of sectors
- db 0 ; 0053 00=conv 01=HMA
- dw 0 ; 0054 deblock buf in conv
- deblock_seg dw 0 ; 0056 (offset always zero)
- rb 3 ; 0058 unknown
- dw 0 ; 005B unknown
- db 0, 0FFh, 0 ; 005D unknown
- db 0 ; 0060 unknown
- dw 0 ; 0061 unknown
- dmd_upper_link db 0 ; 0063 upper memory link flag
- dw 0 ; 0064 unknown
- dmd_upper_root dw 0FFFFh ; 0066 dmd_upper_root
- dw 0 ; 0068 para of last mem search
- dw invalid_stub,0 ; 006A DWORD ptr to 15
- dw nul_int,0 ; 006E SHARE STUB routines
- dw nul_int,0 ; 0072
- dw nul_int,0 ; 0076
- dw nul_int,0 ; 007A
- dw nul_int,0 ; 007E
- dw nul_int,0 ; 0082
- dw nul_int,0 ; 0086
- dw nul_int,0 ; 008A
- dw nul_int,0 ; 008E
- dw invalid_stub,0 ; 0092
- dw nul_int,0 ; 0096
- dw nul_int,0 ; 009A
- dw nul_int,0 ; 009E
- dw nul_int,0 ; 00A2
- msdos_file_tbl dw -1 ; 00A6 1st HDB entries
- dw -1 ; Pointer to next Entry (None)
- dw 5 ; Number of Entries
- rb 5*DHNDL_LEN ; Reserve 5 Internal Handles
- rb 1fbh - (offset $ - offset dos_data)
- Public savbuf
- savbuf rb 128 ; cmdline editing temp buffer
- Public fdos_buf
- fdos_buf db 2,0 ; initialise buffer to empty
- rb 128+1 ; room for 128 byte readline + LF
- rb 2feh - (offset $ - offset dos_data)
- ; this byte is used for ^P support
- Public cio_state
- cio_state db 0 ; 0 = no printer echo, ~0 echo
- Public verify_flag
- verify_flag db 0 ; ~0, write with verify
- rb 300h - (offset $ - offset dos_data)
- ; this byte is used for TAB's
- Public column
- column db 0 ; Current Cursor Column
- Public switch_char
- switch_char db '/'
- Public mem_strategy
- mem_strategy db 0 ; memory allocation strategy
- Public sharing_flag
- sharing_flag db 0 ; 00 = sharing module not loaded
- ; 01 = sharing module loaded, but
- ; open/close for block devices
- ; disabled
- ; FF = sharing module loaded,
- ; open/close for block devices
- ; enabled (not implemented)
- Public net_set_count
- net_set_count db 1 ; count the name below was set
- Public net_name
- net_name db ' ' ; 15 Character Network Name
- db 00 ; Terminating 0 byte
- ; These tables point to routines to be patched by MSNET
- dw criticalSectionEnable
- dw criticalSectionEnable
- dw criticalSectionEnable
- dw criticalSectionEnable
- dw 0 ; terminating null
- rb 1 ; padding
- ;
- ; Variables contained the the "STATE_DATA" segment contain
- ; information about the STATE of the current DOS Process. These
- ; variables must be preserved regardless of the state of the INDOS
- ; flag.
- ;
- ; All variables that appear in "STATE_DATA" **MUST** be declared
- ; in this file as the offsets from the INTERNAL_DATA variable are
- ; critical to the DOS applications that modify this data area.
- ;
- ;
- Public error_flag, indos_flag
- Public error_locus, error_code
- Public error_action, error_class
- Public error_dev, error_drive
- Public dma_offset, dma_segment
- Public current_psp, current_dsk
- Public break_flag
- Public internal_data
- internal_data rw 0 ; <-- Address returned by INT21/5D06
- error_flag db 0 ; INDOS - 01 - Error Mode Flag
- indos_flag db 0 ; INDOS + 00 - Indos Flag
- error_drive db 0 ; INDOS + 01 - Drive on write protect error
- error_locus db 0 ; INDOS + 02 - Error Locus
- error_code dw 0 ; INDOS + 03 - DOS format error Code
- error_action db 0 ; INDOS + 05 - Error Action Code
- error_class db 0 ; INDOS + 06 - Error Class
- error_dev rd 1 ; INDOS + 07 - Failing Device Address
- dma_offset rw 1 ; INDOS + 0B - DMA Offset
- dma_segment rw 1 ; INDOS + 0D - DMA Segment
- current_psp rw 1 ; INDOS + 0F - Current PSP
- break_sp rw 1 ; INDOS + 11 - used in int 23
- retcode rw 0
- user_retcode db 0 ; INDOS + 13 - return code from process
- system_retcode db 0 ; INDOS + 14 - reason for process terminate
- current_dsk db 0 ; INDOS + 15 - Current Drive
- break_flag db 0 ; INDOS + 16 - Break Flag
- dw 0 ; INDOS + 17 - unknown
- Public swap_always
- swap_always rw 0
- Public int21AX
- int21AX dw 0 ; INDOS + 19 - AX from last Int 21
- Public owning_psp, machine_id
- owning_psp dw 0 ; INDOS + 1B - owning psp
- machine_id dw 0 ; INDOS + 1D - remote machine ID
- public load_psp, load_image, load_top, load_max, load_handle
- load_psp dw 0 ; Paragraph of the new PSP.
- load_image dw 0 ; Paragraph of the Load Image.
- load_top dw 0 ; Last paragraph of Allocated Memory
- load_max dw 0 ; ditto, but not messed with
- load_handle dw 0 ; Handle allocated to load file on OPEN
- Public locus, valid_flg, retry_off, retry_sp
- locus db 0 ; Public Error Locus Value
- valid_flg db 0 ; Valid Options for Critical Error
- retry_off dw 0 ; IP for Error Retry
- retry_sp dw 0 ; SP for Error Retry
- ; Some important data structures....
- rb 0350h - (offset $ - offset dos_data) ; DOS 5
- dayOfMonth db 0
- month db 0
- yearsSince1980 dw 0
- daysSince1980 dw 0FFFFh ; force rebuild on first clock read
- dayOfWeek db 0
- public internal_flag
- internal_flag db 0
- Public int28_flag
- int28_flag db FALSE
- public ioctlRH
- ioctlRH rb 23 ; up to 23 bytes possible
- public load_env, load_envsize, exe_loadhigh
- load_env dw 0 ; Paragraph of the new environment
- load_envsize dw 0 ; Size of new environment
- exe_loadhigh db 0 ; load high flag
- Public fcb_pb, fcb_path, fcb_path2
- ; These variables are used during FCB processing - we build another parameter
- ; block outside the MXDisk which makes handle calls to the FDOS
- fcb_pb rw 7
- fcb_path rb 15
- fcb_path2 rb 15
- public char_count
- char_count db 0
- ;****************************************************************************
- ; The format of the data is FIXED and should not be modified.
- ;****************************************************************************
- ; WARNING - if anyone adds/deletes PCMODE_DATA they MUST adjust these
- ; values so the following data will origin correctly
- FIXED_DOS_DATA cseg word
- FIXED_DATA_START equ 3B0h
- public MUSTBE03B0
- MUSTBE03B0:
- org 03b6h - FIXED_DATA_START ; DOS 5
- biosDate dw 0 ; days since 1980
- minute db 0
- hour db 0
- hundredth db 0
- second db 0
- rb 2 ; padding
- Public reloc_buf, load_file, RELOC_CNT
- RELOC_CNT equ 80h/16 ; buffer 128 bytes here
- ; function 4B uses these data area's as workspace during an EXEC
- Public pri_pathname
- reloc_buf rb 0 ; shared with primary pathname
- pri_pathname rb 80h
- Public sec_pathname
- load_file rb 0
- sec_pathname rb 80h
- Public srch_buf
- srch_buf rb 21+32 ; 21 byte srch state, 32 byte dir entry
- Public temp_ldt
- temp_ldt rb LDT_LEN
- Public name_buf
- name_buf rb 32 ; space enough for 1 dir entry
- magic_byte db 0
- rb 1 ; padding
- Public file_attrib
- file_attrib dw 0
- rb 3 ; padding
- Public remote_call
- remote_call dw 0
- org 057Ch - FIXED_DATA_START
- Public exit_type ; used by break and critical error
- exit_type db 0 ; handlers during termination
- rb 1 ; padding
- Public term_psp
- term_psp dw 0
- Public int24_esbp
- int24_esbp rw 2
- Public int21regs_ptr, int21regs_off, int21regs_seg
- int21regs_ptr rw 0
- int21regs_off dw 0
- int21regs_seg dw 0
- public critical_sp
- critical_sp dw 0 ; critical error internal stack
- Public current_ddsc
- current_ddsc rw 2
- org 059ah - FIXED_DATA_START
- Public current_device
- current_device rw 2
- Public current_dhndl
- current_dhndl rw 2
- Public current_ldt
- current_ldt rw 2
- rw 2 ; pointer to callers FCB
- Public current_ifn
- current_ifn dw 0
- org 05b2h - FIXED_DATA_START
- dw offset pri_pathname
- dw offset sec_pathname
- dw offset pri_pathname
- org 05ceh - FIXED_DATA_START
- Public current_filepos
- current_filepos rw 2
- org 05f0h - FIXED_DATA_START
- Public prev_int21regs_ptr, prev_int21regs_off, prev_int21regs_seg
- prev_int21regs_ptr rw 0
- prev_int21regs_off dw 0
- prev_int21regs_seg dw 0
- org 0620h - FIXED_DATA_START
- Public indos_stack, error_stack, normal_stack
- Public fcb_search_buf ; during FCB search 1st/next use bottom
- fcb_search_buf rb 0 ; of error stack as scratch buffer
- ; rb 43 ; - only used during int 21 call
- rw STACK_SIZE ; Error Processing Stack
- error_stack rw 0
- rw STACK_SIZE ; Normal Function Stack Area
- normal_stack rw 0
- rw STACK_SIZE ; Indos Function Stack
- indos_stack rw 0
- lookahead_flag db 0
- Public rwmode, err_drv, ioexerr
- err_drv db 0
- rwmode db 0
- ioexerr db 0
- public int2f_cmd, int2f_stack, file_mode
- int2f_cmd dw 0
- int2f_stack dw 0
- file_mode dw 0
- Public cle_state
- cle_state dw 0
- Public swap_indos
- swap_indos rw 0
- org 0AADh - FIXED_DATA_START
- Ucasetbl dw 128 ; Table Size
- db 080h, 09ah, 'E', 'A', 08eh, 'A', 08fh, 080h
- db 'E', 'E', 'E', 'I', 'I', 'I', 08eh, 08fh
- db 090h, 092h, 092h, 'O', 099h, 'O', 'U', 'U'
- db 'Y', 099h, 09ah, 09bh, 09ch, 09dh, 09eh, 09fh
- db 'A', 'I', 'O', 'U', 0a5h, 0a5h, 0a6h, 0a7h
- db 0a8h, 0a9h, 0aah, 0abh, 0ach, 0adh, 0aeh, 0afh
- db 0b0h, 0b1h, 0b2h, 0b3h, 0b4h, 0b5h, 0b6h, 0b7h
- db 0b8h, 0b9h, 0bah, 0bbh, 0bch, 0bdh, 0beh, 0bfh
- db 0c0h, 0c1h, 0c2h, 0c3h, 0c4h, 0c5h, 0c6h, 0c7h
- db 0c8h, 0c9h, 0cah, 0cbh, 0cch, 0cdh, 0ceh, 0cfh
- db 0d0h, 0d1h, 0d2h, 0d3h, 0d4h, 0d5h, 0d6h, 0d7h
- db 0d8h, 0d9h, 0dah, 0dbh, 0dch, 0ddh, 0deh, 0dfh
- db 0e0h, 0e1h, 0e2h, 0e3h, 0e4h, 0e5h, 0e6h, 0e7h
- db 0e8h, 0e9h, 0eah, 0ebh, 0ech, 0edh, 0eeh, 0efh
- db 0f0h, 0f1h, 0f2h, 0f3h, 0f4h, 0f5h, 0f6h, 0f7h
- db 0f8h, 0f9h, 0fah, 0fbh, 0fch, 0fdh, 0feh, 0ffh
- info2_len equ word ptr (offset $ - offset Ucasetbl)
- org 0B2Fh - FIXED_DATA_START
- ; Filename upper case table
- FileUcasetbl dw 128 ; Table Size
- standard_table rb 0
- db 080h, 09ah, 'E', 'A', 08eh, 'A', 08fh, 080h
- db 'E', 'E', 'E', 'I', 'I', 'I', 08eh, 08fh
- db 090h, 092h, 092h, 'O', 099h, 'O', 'U', 'U'
- db 'Y', 099h, 09ah, 09bh, 09ch, 09dh, 09eh, 09fh
- db 'A', 'I', 'O', 'U', 0a5h, 0a5h, 0a6h, 0a7h
- db 0a8h, 0a9h, 0aah, 0abh, 0ach, 0adh, 0aeh, 0afh
- db 0b0h, 0b1h, 0b2h, 0b3h, 0b4h, 0b5h, 0b6h, 0b7h
- db 0b8h, 0b9h, 0bah, 0bbh, 0bch, 0bdh, 0beh, 0bfh
- db 0c0h, 0c1h, 0c2h, 0c3h, 0c4h, 0c5h, 0c6h, 0c7h
- db 0c8h, 0c9h, 0cah, 0cbh, 0cch, 0cdh, 0ceh, 0cfh
- db 0d0h, 0d1h, 0d2h, 0d3h, 0d4h, 0d5h, 0d6h, 0d7h
- db 0d8h, 0d9h, 0dah, 0dbh, 0dch, 0ddh, 0deh, 0dfh
- db 0e0h, 0e1h, 0e2h, 0e3h, 0e4h, 0e5h, 0e6h, 0e7h
- db 0e8h, 0e9h, 0eah, 0ebh, 0ech, 0edh, 0eeh, 0efh
- db 0f0h, 0f1h, 0f2h, 0f3h, 0f4h, 0f5h, 0f6h, 0f7h
- db 0f8h, 0f9h, 0fah, 0fbh, 0fch, 0fdh, 0feh, 0ffh
- info4_len equ word ptr (offset $ - offset FileUcasetbl)
- org 0BB1h - FIXED_DATA_START
- FileCharstbl:
- dw 22 ; Table Size
- db 001h, 000h, 0ffh, 000h, 000h, 020h, 002h, 00eh
- db 02eh, 022h, 02fh, 05ch, 05bh, 05dh, 03ah, 07ch
- db 03ch, 03eh, 02bh, 03dh, 03bh, 02ch
- info5_len equ word ptr (offset $ - offset FileCharstbl)
- org 0BE1h - FIXED_DATA_START
- Collatingtbl:
- dw 256 ; Table Size
- db 000h, 001h, 002h, 003h, 004h, 005h, 006h, 007h
- db 008h, 009h, 00ah, 00bh, 00ch, 00dh, 00eh, 00fh
- db 010h, 011h, 012h, 013h, 014h, 015h, 016h, 017h
- db 018h, 019h, 01ah, 01bh, 01ch, 01dh, 01eh, 01fh
- db 020h, 021h, 022h, 023h, 024h, 025h, 026h, 027h
- db 028h, 029h, 02ah, 02bh, 02ch, 02dh, 02eh, 02fh
- db 030h, 031h, 032h, 033h, 034h, 035h, 036h, 037h
- db 038h, 039h, 03ah, 03bh, 03ch, 03dh, 03eh, 03fh
- db 040h, 041h, 042h, 043h, 044h, 045h, 046h, 047h
- db 048h, 049h, 04ah, 04bh, 04ch, 04dh, 04eh, 04fh
- db 050h, 051h, 052h, 053h, 054h, 055h, 056h, 057h
- db 058h, 059h, 05ah, 05bh, 05ch, 05dh, 05eh, 05fh
- db 060h, 041h, 042h, 043h, 044h, 045h, 046h, 047h
- db 048h, 049h, 04ah, 04bh, 04ch, 04dh, 04eh, 04fh
- db 050h, 051h, 052h, 053h, 054h, 055h, 056h, 057h
- db 058h, 059h, 05ah, 07bh, 07ch, 07dh, 07eh, 07fh
- db 043h, 055h, 045h, 041h, 041h, 041h, 041h, 043h
- db 045h, 045h, 045h, 049h, 049h, 049h, 041h, 041h
- db 045h, 041h, 041h, 04fh, 04fh, 04fh, 055h, 055h
- db 059h, 04fh, 055h, 024h, 024h, 024h, 024h, 024h
- db 041h, 049h, 04fh, 055h, 04eh, 04eh, 0a6h, 0a7h
- db 03fh, 0a9h, 0aah, 0abh, 0ach, 021h, 022h, 022h
- db 0b0h, 0b1h, 0b2h, 0b3h, 0b4h, 0b5h, 0b6h, 0b7h
- db 0b8h, 0b9h, 0bah, 0bbh, 0bch, 0bdh, 0beh, 0bfh
- db 0c0h, 0c1h, 0c2h, 0c3h, 0c4h, 0c5h, 0c6h, 0c7h
- db 0c8h, 0c9h, 0cah, 0cbh, 0cch, 0cdh, 0ceh, 0cfh
- db 0d0h, 0d1h, 0d2h, 0d3h, 0d4h, 0d5h, 0d6h, 0d7h
- db 0d8h, 0d9h, 0dah, 0dbh, 0dch, 0ddh, 0deh, 0dfh
- db 0e0h, 053h, 0e2h, 0e3h, 0e4h, 0e5h, 0e6h, 0e7h
- db 0e8h, 0e9h, 0eah, 0ebh, 0ech, 0edh, 0eeh, 0efh
- db 0f0h, 0f1h, 0f2h, 0f3h, 0f4h, 0f5h, 0f6h, 0f7h
- db 0f8h, 0f9h, 0fah, 0fbh, 0fch, 0fdh, 0feh, 0ffh
- info6_len equ word ptr (offset $ - offset Collatingtbl)
- org 0CE3h - FIXED_DATA_START
- DBCS_tbl:
- dw 0 ; Table Size
- db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
- db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
- info7_len equ word ptr (offset $ - offset DBCS_tbl)
- org 0d12h - FIXED_DATA_START
- dos_version dw 6 ; our DOS version number
- ; Don't know what these are for.....
- db 0c8h,0a6h
- db 0c8h,0a5h
- db 0c8h,0a5h
- db 0c8h,0a5h
- ; Now we have a list of days in each month
- Public days_in_month
- days_in_month db 31,28,31,30,31,30 ; Jan, Feb, Mar, Apr, May, Jun
- db 31,31,30,31,30,31 ; Jul, Aug, Sep, Oct, Nov, Dec
- org 0d90h - FIXED_DATA_START
- Public last_key_ext
- ;;last_key_ext db 0 ; flag set if last key zero
- ;** LINKER BODGE **
- ; I'd like to do the above, but LINKCMD blows up when I do (it seems to be to
- ; many relocatable publics in the data segment that do it). So as a work around
- ; I do the below instead. Since the location is fixed anyway it works out OK.
- last_key_ext equ byte ptr 0d90h
- ;** LINKER BODGE **
- org 0e5bh - FIXED_DATA_START
- ;
- ; Extended Error/Class/Action/Locus table. Used in conjuction with
- ; Int2F/1222 to setup extended error information
- db 13h,0Bh,07h,02h
- db 14h,04h,05h,01h
- db 15h,05h,07h,0FFh
- db 16h,04h,05h,01h
- db 17h,0Bh,04h,02h
- db 18h,04h,05h,01h
- db 19h,05h,01h,02h
- db 1Ah,0Bh,07h,02h
- db 1Bh,0Bh,04h,02h
- db 1Ch,02h,07h,04h
- db 1Dh,05h,04h,0FFh
- db 1Eh,05h,04h,0FFh
- db 1Fh,0Dh,04h,0FFh
- db 20h,0Ah,02h,02h
- db 21h,0Ah,02h,02h
- db 22h,0Bh,07h,02h
- db 32h,09h,03h,03h
- db 23h,07h,04h,01h
- db 24h,01h,04h,05h
- db 0FFh,0Dh,05h,0FFh
- org 0eabh - FIXED_DATA_START
- ; This is a translation table from old error codes to extended errors
- db 13h,14h,15h,16h,17h,18h,19h,1Ah
- db 1Bh,1Ch,1Dh,1Eh,1Fh,1Fh,1Fh,22h
- db 24h
- ; KLUDGE for DRDOS 6.0 security - the word at offset zero in SYSDAT (the
- ; SYStem DATa page) was the segment of the secure path string, with
- ; a zero value indicating a non-secure system.
- ; In order for DRDOS 6 level utilities to run we point SYSDAT at offset
- ; 10h in the DOS data segment (this unused word is zero). On secure systems
- ; the new LOGIN TSR will fix up both SYSDAT and the PD value to point to
- ; it's own dummy SYSDAT, and the utilities will behave correctly.
- Public @private_data
- @private_data rb 0 ; We need some private data
- dw endOfInstanceData ; 0000 historical PD offset
- dummy_sysdat dw 1 ; 0002 historical SYSDAT segment
- dw offset histbuf1 ; 0004 History Control Block 1
- dw offset histbuf2 ; 0006 History Control Block 2
- @hist_flg db 0 ; 0008 History Control
- ; Bit 0 = Buffer Select 1 = COMMAND
- ; Bit 1 = History Enable 1 = ENABLE
- db 1 ; 0009 Dual Language Version
- db 0 ; 000A Current message language
- dw 0 ; 000B Extended memory
- db 0 ; 000D (was # JMPF entries to fix up)
- codeSeg dw 0 ; 000E BDOS code segment (was seg of JMPF table)
- hmaRoot dw 0 ; 0010 Root of himem free chain
- dw 0 ; 0012 Initial Environment
- hmaAlloc dw 0 ; 0014 Root of himem allocation chain
- dmd_owner dw 0 ; 0016 Owner below which DMD's not freed
- dw 0 ; 0018 Link to upper memory DMD's
- LocalMachineID dw 0 ; 001A Patched by multi-tasker to correct value
- dmd_address dw 0 ; 001C Address below which DMD's not freed
- dw offset country_filename
- hashptr dw 0,0 ; 0020 hash root
- hashmax dw 0 ; 0024 max dir entries hashed
- dw 0 ; 0026 was deblock seg
- dw offset share_stub
- ; 0028 share stub offset
- dw offset globalPrivateData
- ; 002A pointer to global private data
- dw offset int2FBiosHandler
- ; 002C pointer to int 2F internal hook
- rw 10 ; space for expansion
- Public deblock_seg, fdos_stub
- fdos_stub dw fdos_stub_entry
- dw 0 ; fixup up at run time
- share_stub dw invalid_stub,0 ; DWORD ptr to 15
- dw nul_int,0 ; SHARE STUB routines
- dw nul_int,0 ;
- dw nul_int,0 ;
- dw nul_int,0 ;
- dw nul_int,0 ;
- dw nul_int,0 ;
- dw nul_int,0 ;
- dw nul_int,0 ;
- dw nul_int,0 ;
- dw invalid_stub,0 ;
- dw nul_int,0 ;
- dw nul_int,0 ;
- dw nul_int,0 ;
- dw nul_int,0 ;
- Public WindowsHandleCheck
- WindowsHandleCheck db 26h ; MUST follow share_stub
- ; patched by switcher
- org 0FC0h - FIXED_DATA_START
- childSP dw 0
- childSS dw 0
- childIP dw 0
- childCS dw 0
- ; The following table defines the format of a DOS .EXE format file.
- ; The .EXE header is read into this data area and check for integrity
- ;
- Public exe_buffer
- exe_buffer rb EXE_LENGTH ; Local EXE header buffer
- if IDLE_DETECT
- Public idle_data
- Public active_cnt, idle_max
- Public idle_flags, idle_vec
- idle_data rw 0 ; Idle State Data Area
- active_cnt dw 0 ; InActive Function Count
- idle_max dw 10 ; Max No. of consecutive funcs.
- idle_flags dw IDLE_INIT ; $IDLE$ Has not been loaded
- idle_vec rd 1 ; DWORD pointer to IDLE handler
- Public int28_delay, int28_reload
- int28_delay dw 0 ; No. Consecutive INT28's
- int28_reload dw 10 ; INT28 Delay Reload Value
- dw indos_flag ; Offset of INDOS_FLAG
- rw 2 ; 2 OEM Reserved Words
- endif
- org 1000h - FIXED_DATA_START ; nice 4K boundry
- ; for multitasker
- PCMODE_DSIZE DSEG PARA
- Public data_end
- data_end rw 0
- PCMODE_CODE CSEG WORD 'DATA'
- PCMODE_CODE_START equ 1000h
- public MUSTBE1000
- MUSTBE1000:
- Public endOfInstanceData
- endOfInstanceData rw 0
- ;*** fixed data - init does segment fixups ***
- stub_entries rw 0
- Public lock_bios, unlock_bios, lock_tables, unlock_tables
- lock_bios dw lockbios,0 ; MSNET critical region stubs
- unlock_bios dw unlockbios,0 ; MSNET critical region stubs
- lock_tables dw locktables,0 ; MSNET critical region stubs
- unlock_tables dw unlocktables,0 ; MSNET critical region stubs
- Public exec_stub
- exec_stub dw ExecStub,0 ; Int 21 EXEC hook
- public func4B05_stub
- func4B05_stub dw Func4B05Stub,0 ; Int 21/4B05 hook
- NUM_STUB_ENTRIES equ (offset $ - offset stub_entries)/4
- ;*** fixed data ends ***
- cmp ds:error_flag,0 ; JT-FAX uses this code sequence to
- jnz $ ; find the address of the ERROR_FLAG
- mov sp,0A06h
- test ss:error_flag,0FFh ; SIDEKICK usues this fragment to
- jnz $ ; locate the ERROR_FLAG
- push ss:word ptr int28_flag
- int 28h
- ;==========================
- ; Entry points for DOS Code
- ;==========================
- ;
- ; These are normally all of the form
- ;
- ;EntryPoint:
- ; JMPF xxxx:RealEntryPoint
- ; db 3 dup(?)
- ;
- ; When we are in the HMA, and so may disable the HMA during EXEC for EXEPACK
- ; problems, we convert them to the following
- ;
- ;EntryPoint:
- ; call A20Enable
- ; JMPF xxxx:RealEntryPoint
- ;
- ; On an exec the A20 gate is disabled. This allows EXEPACKed programs to
- ; unpack properly. (some exepacked apps have a wrap-round bug which addresses
- ; the bottom 64K via the HMA).
- ;
- ; On the first Int 21 etc the A20Enable routine enables the A20 gate.
- ;
- extrn int20_entry:near, int21_entry:near
- extrn int25_entry:near, int26_entry:near
- extrn int27_entry:near, int2F_entry:near
- extrn call5_entry:near
- FirstCodeEntryPoint rw 0
- Int20Entry:
- db 0EAh ; JMPF
- dw int20_entry
- rb 5 ; filled in at run time
- Int21Entry:
- db 0EAh ; JMPF
- dw int21_entry
- rb 5 ; filled in at run time
- Int25Entry:
- db 0EAh ; JMPF
- dw int25_entry
- rb 5 ; filled in at run time
- Int26Entry:
- db 0EAh ; JMPF
- dw int26_entry
- rb 5 ; filled in at run time
- Int27Entry:
- db 0EAh ; JMPF
- dw int27_entry
- rb 5 ; filled in at run time
- Int2FEntry:
- db 0EAh ; JMPF
- dw int2f_entry
- rb 5 ; filled in at run time
- Call5Entry:
- db 0EAh ; JMPF
- dw call5_entry
- rb 5 ; filled in at run time
- LastCodeEntryPoint rw 0
- BIOSA20Enable:
- ;-------------
- ; CALLF'd by the BIOS
- call A20Enable ; do a near call
- sti ; re-enable interrupts
- retf ; RETF to BIOS
- A20Disable:
- ;----------
- ; On Entry:
- ; DX = psp we are execing
- cmp dx,0FF0h ; if we are above 64K skip the
- jae A20Disable10 ; EXE pack kludge
- push ax
- mov ah,6 ; disable the A20 gate during EXEC
- callf cs:xmsDriver ; so buggy EXE packing will work
- pop ax
- A20Disable10:
- ret
- A20Enable:
- ;---------
- ; On Entry:
- ; None
- ; WARNING - DS/ES/STACK could be anything
- ; On Exit:
- ; All regs preserved
- ;
- ; Unhook our Entry stubs so we don't get here again.
- ; Enable the global A20 line to make the DOS/BIOS/COMMAND code visible
- ;
- cli
- push ax
- push ds
- mov ax,0FFFFh
- mov ds,ax
- mov ax,ds:.94h ; is the HMA alias for Int 21
- or ax,ds:.96h ; zero - if so the HMA is there
- pop ds
- jnz A20Enable10
- pop ax
- ret
- A20Enable10:
- ; We need to enable the A20 gate, go do so
- push bx
- mov cs:oldSS,ss ; save stack
- mov cs:oldSP,sp
- mov ax,cs
- mov ss,ax ; swap to the error stack in case
- mov sp,offset error_stack ; 3rd part XMS driver needs a lot
- mov ah,5 ; enable A20, ignoring errors as we
- callf cs:xmsDriver ; can't do anything about them
- mov ss,cs:oldSS ; switch back to callers stack
- mov sp,cs:oldSP
- pop bx
- pop ax
- ret
- oldSS dw 0 ; save area for stack swap
- oldSP dw 0
- ; +++++++++++++++++++++++++++++++++
- ; Default Int 24 Handler for DR DOS
- ; +++++++++++++++++++++++++++++++++
- ;
- ; Our default critical error handler during boot simply FAIL's all
- ; critical errors. When COMMAND.COM is loaded this will install
- ; the "normal" Retry/Abort/Ignore handler.
- ;
- ; These interrupts normally point to an IRET.
- ;
- ;
- Int24Entry:
- ;==========
- mov al,3 ; return "FAIL"
- DummyIRET:
- ;=========
- iret
- ; EXEC Code
- ;
- ; In order to cope with old buggy EXEPACKED programs we need to turn
- ; the A20 gate of during the exec, and turn it back on asap.
- ; To do this we hook all the DOS code entry points and re-enable the
- ; A20 whenever the app issues an Int 21 etc
- ;
- ExecStub:
- ;========
- ; On Entry:
- ; AX = FCB validity flags
- ; DX = current PSP
- ; ES:SI -> new CS:IP
- ; CX:DI -> users stack
- ; On Exit:
- ; AX = FCB validity flags
- ; BX = 0
- ; SS:SP = users stack
- ; CS:IP = values from EXE header
- ; DS = ES = DX = current PSP
- ;
- ; When we start execing the application we have the A20 gate disabled so
- ; buggy EXE packed programs will unpack properly.
- ; We also hook Int 21 and Int 2F to re-enable the A20 gate on the first
- ; calls made to them. (These should only happen AFTER the unpacking).
- ;
- call A20Disable
- mov ss,cx ; switch to new USER stack
- mov sp,di
- push es
- push si ; CS:IP on USER stack
- mov ds,dx ; DS = ES = PSP we are exec'ing
- mov es,dx
- xor bx,bx ; BX = zero, set flags
- sti
- retf ; lets go!
- Func4B05Stub:
- ;============
- ; On Entry:
- ; ES:BP -> callers stack
- ; DX = PSP to exec on
- ; On Exit:
- ; callers registers restored
- ;
- call A20Disable ; turn off A20
- mov ax,es
- mov ss,ax ; back to users stack
- mov sp,bp
- POP$DOS ; Restore Registers
- iret
- Public int2FNext, int2FBiosHandler
- Int2FBios:
- ;---------
- ; On Entry:
- ; DS on stack
- ; On Exit:
- ; All regs preserved
- ;
- ; Pass on an Int 2F call to the BIOS
- pop ds ; recover DS and pass on to BIOS
- db 0EAh ; JMPF bios Int 2F entry point
- int2FBiosHandler dw 0,0 ; filled in at run time
- int2FNext dw Int2FBios, 0 ; seg filled in at run time
- nul_strat:
- cmp RH_CMD,CMD_INPUT
- jne nul_strat10 ; if it's input
- mov RH4_COUNT,0 ; Say none transferred #IJ
- nul_strat10:
- mov RH_STATUS,RHS_DONE ; Set the DONE bit in the
- nul_int: ; Request Header and Return
- clc ; (indicate success for SHARE)
- retf
- Public invalid_stub
- invalid_stub:
- mov ax,ED_FUNCTION ; indicate bad function
- fdos_stub_entry:
- stc ; indicate error
- retf
- Public lock_bios, unlock_bios, lock_tables, unlock_tables
- lockbios:
- ;--------
- push ax
- mov ax,8002h
- jmps CriticalSection
- unlockbios:
- ;----------
- push ax
- mov ax,8102h
- jmps CriticalSection
- locktables:
- ;----------
- push ax
- mov ax,8001h
- jmps CriticalSection
- unlocktables:
- ;------------
- push ax
- mov ax,8101h
- ; jmps CriticalSection
- CriticalSection:
- ;---------------
- ; On Entry:
- ; AX = critical section number
- ; STACK = original AX
- ; On Exit:
- ; AX poped from stack
- ;
- cmp cs:criticalSectionEnable,0
- je CriticalSection10
- int 2ah ; issue critical section callout
- CriticalSection10:
- pop ax
- retf
- public criticalSectionEnable
- criticalSectionEnable db 0
- Public SwStartupInfo
- SwStartupInfo dw 3 ; version
- dw 0
- dw 0 ; link to next in chain
- ;; dw offset vxdName ; Virtual Dev file
- ;; replaced above line with DW 0 as vxd no longer required BAP
- dw 0
- dw 0
- dw 0,0 ; Reference Data
- dw offset instanceItems
- instanceSeg dw 0
- ;vxdName db 'A:OPENDOS.386',0
- public histbuf1, histsiz1, histbuf2, histsiz2
- instanceItems:
- dw 0 ; offset zero (for instancing)
- histbuf1 dw 0 ; Command history buffer segment
- histsiz1 dw 0 ; size (in bytes)
- dw 0 ; offset zero (for instancing)
- histbuf2 dw 0 ; Application history buffer segment
- histsiz2 dw 0 ; size (in bytes)
- ; some ROS fixups
- dw 000h,050h,002h ; BASIC variables
- dw 00Eh,050h,014h ; BASIC variables
- ; some BIOS fixups
- dw 0B8h,070h,004h ; BIOS req_hdr
- ; dw 16Ch,070h,002h ; BIOS dev_no (no longer required)
- dw 600h,070h,002h ; BIOS local_char
- bdosInstanceFixups rw 0
- dw con_device,0,4 ; CON: device ptr
- dw savbuf,0,column-savbuf+1
- dw dmd_upper_root,0,2
- dw dmd_upper_link,0,1
- dw exe_buffer,0,EXE_LENGTH
- dw 0,0 ; zero terminated instance list
- xmsDriver rd 1
- globalPrivateData:
- rd 1 ; 0000 delwatch driver vector
- rw 4 ; space for expansion
- ;** COUNTRY INFO **
- ;
- ; The following routines are called by the end user using the DWORD
- ; pointers in the Country Data. Each Country Data area contains a
- ; pointer to one of the following routines. All valid charcater
- ; codes above 7Fh are translated to Upper Case
- ;
- Public xlat_xlat
- xlat_xlat:
- cmp al,080h
- jb xlat_exit
- sub al,080h
- push bx
- mov bx,offset Standard_table
- xlat cs:al
- pop bx
- xlat_exit:
- retf
- Public cur_country
- Public cur_cp
- Public default_country
- Public country_data
- Public Ucasetbl
- Public FileUcasetbl
- Public FileCharstbl
- Public Collatingtbl
- Public DBCS_tbl
- Public info1_len
- Public info2_len
- Public info4_len
- Public info5_len
- Public info6_len
- Public info7_len
- Public intl_xlat
- ; table of pointers to default country info. pointed to in BDOS header
- Public NoYesChars
- NoYesChars db 'NnYy'
- dw country_data
- dw default_country
- dw Ucasetbl
- dw FileUcasetbl
- dw FileCharstbl
- dw Collatingtbl
- dw DBCS_tbl
- org 11F0h - PCMODE_CODE_START
- dummy_fcbs dw 0ffffh ; terminate now
- dw 0
- dw 1 ; with one entry
- rb DHNDL_LEN ; this many bytes in it
- org 1232h - PCMODE_CODE_START
- Public country_filename
- country_filename db 'COUNTRY.SYS'
- rb 64 - length country_filename
- org 1276h - PCMODE_CODE_START
- ; We fix the country tables at this location for the benefit of
- ; LAN Manager 2.2 extended edition. It peeks directly rather than use
- ; int 21/65 !
- countryTable:
- db 2
- dw offset UCasetbl,0
- db 4
- dw offset FileUCasetbl,0
- db 5
- dw offset FileCharstbl,0
- db 6
- dw offset Collatingtbl,0
- db 7
- dw DBCS_tbl,0
- db 1
- dw 26h
- country_data:
- cur_country dw 1 ; Country Code
- cur_cp dw 437 ; Code Page
- default_country:
- dw US_DATE ; Date Format (Binary)
- db '$',0,0,0,0 ; Currency Symbol
- db ',',0 ; Thousands Separator
- db '.',0 ; Decimal Separator
- db '-',0 ; Date Separator
- db ':',0 ; Time Separator
- db 0 ; Symbol before Value without Space ($n.nn)
- db 2 ; Significant Currency Digits
- db CLOCK_12 ; Time Format
- intl_xlat dw xlat_xlat ; Case Translation Routine
- dw 0000h ; Case Translation Segment (Runtime Fixup)
- db ',',0 ; Data List Separator
- info1_len equ word ptr (offset $ - offset country_data)
- ; If NOT COUNTRY.SYS then include the
- rb 10 ; 10 zero bytes held at the end of the
- ; country information.
- PCM_CODEND CSEG PARA
- Public code_end
- code_end rb 0
- BDOS_DATA DSEG
- Public hashroot, hashmax
- ; The hashroot must be global, but we also need to make it accessible
- ; during CONFIG so we copy it from the private data area
- hashroot dw 0,0
- PCM_HISTORY CSEG
- patch_area dw 0666h
- include i:patch.cod
- PCM_ICODE cseg
- ;
- ; The following routine initializes all the standard MS-DOS interrupt
- ; vectors which are initialized to point to the PC-MODE handlers.
- ;
- ; Entry: AX Memory Size - Paragraphs
- ; BX First Available Paragraph
- ; DL Initial Drive
- ; DS PCM Dseg
- ;
- pcmode_init:
- and cs:patch_version,not DOSINROM
- ; won't clear if we are in ROM...
- mov cs:pcmode_dseg,ds ; save PCM Dseg
- mov ds:instanceSeg,ds ; fixup pointer to instance items
- ; removed this as VxD no longer required BAP
- ; mov ds:vxdNameSeg,ds ; and vxdName
- ; add ds:vxdName,dl ; fixup drive letter
- mov ds:word ptr buf_ptr+2,ds
- mov ds:word ptr file_ptr+2,ds
- mov ds:word ptr fcb_ptr+2,ds
- push ax ; Save the memory size
- push bx ; First Free Paragraph
- mov ds:current_dsk,dl ; save initial drive
- inc dl ; make drive one based
- mov ds:bootDrv,dl ; and save for func 3305
- mov ax,ds ; AX = PCMode Data
- mov ds:word ptr fdos_stub+WORD,ax
- add ds:dummy_sysdat,ax ; point dummy "sysdat" at a zero word
- ; ie. dummy "secure path" segment
- mov si,offset countryTable
- countryFixupLoop:
- mov ds:word ptr 3[si],ds ; fixup the segment
- add si,5 ; onto the next entry
- cmp ds:word ptr 3[si],0 ; done the lot yet ?
- je countryFixupLoop
- mov es,ax ; ES -> PCMode Data
- mov di,offset stub_entries ; ES:DI -> stub segs
- mov cx,NUM_STUB_ENTRIES ; entries to initialise
- stubs_loop:
- add di,WORD ; skip the offset
- stosw ; fixup segment
- loop stubs_loop ; do the next one
- mov di,offset share_stub ; fixup the SHARE entries
- mov cx,NUM_SHARE_STUB_ENTRIES
- share_loop:
- add di,WORD ; skip the offset
- stosw ; fixup segment
- loop share_loop
- ; mov cx,0
- mov es,cx ; Initialize the DOS vectors
- mov ax,es:.INT2F_OFFSET ; remember address of BIOS Int 2F
- mov ds:int2FBiosHandler,ax
- mov ax,es:.INT2F_SEGMENT
- mov ds:int2FBiosHandler+2,ax
- mov ds:int2FNext+2,ds ; fixup seg of out stub
- mov cx,40h-2Ah ; 2A-3F point at IRET in DOS Data Seg
- mov di,INT2A_OFFSET
- dummy_vecs_loop:
- mov ax,offset DummyIRET ; point at an IRET
- stosw ; do the offset
- mov ax,ds
- stosw ; then the segment
- loop dummy_vecs_loop
- mov si,offset def_data_vecs ; the following vector point to
- mov cx,no_def_data_vecs ; pcmode DATA seg
- def_data_vecs_loop:
- lods cs:ax ! mov di,ax ; Get the Vector Offset (from CS)
- db 2Eh ; CS:
- movsw ; copy service routine offset
- mov ax,ds ; finally fixup the segment too
- stosw
- loop def_data_vecs_loop
- mov es:byte ptr .INT30_OFFSET,0EAh
- ; fixup CALL 5 JMPF
- mov si,offset bdosInstanceFixups
- InstanceFixupLoop:
- mov ds:2[si],ds ; fixup data segment
- add si,6 ; onto next item
- mov ax,ds:[si] ; still BDOS ?
- or ax,ds:2[si]
- jnz InstanceFixupLoop ; yep, do another one
- push cs ; we will have a RETF
- call pcmode_reinit ; to return from this call
- pop ax ; First Free Paragraph
- pop dx ; Restore the BIOS memory size
- sub dx,ax ; convert to TPA size
- dec dx ; Decrement the Size by DMD Size
- push ax
- add ax,dx ; AX = possible next DMD
- mov es,ax
- mov al,IDZ ; assume no extra DMD's
- cmp al,es:DMD_ID ; have we extra one ?
- jne pcmode_init10
- mov al,IDM ; yes, no longer end of chain
- dec dx ; decrement by size of existing DMD
- pcmode_init10:
- pop es
- mov es:DMD_ID,al ; Last DMD in list
- mov es:DMD_PSP,0000h ; This is Free Memory Owning PSP == 0
- mov es:DMD_LEN,dx ; Save Memory Length
- mov es:word ptr DMD_NAME,'S'+256*'D'
- mov es:DMD_NAME+2,0
- mov ds:dmd_root,es ; Save the DMD address in root
- retf
- eject
- ;
- ;
- ; On Entry:
- ; DS = DOS data seg
- pcmode_reinit:
- ;=============
- mov ds:word ptr intl_xlat+2,ds
- ; fixup intl case routine
- mov ds:codeSeg,cs ; fixup code segment
- mov ax,ds:hashptr ; make a copy of the hashroot
- mov ds:hashroot,ax ; so it's global
- mov ax,ds:hashptr+WORD
- mov ds:hashroot+WORD,ax
- mov al,ds:@hist_flg ; get initial history flags
- and ax,RLF_ENHANCED+RLF_INS+RLF_SEARCH
- mov ds:cle_state,ax ; use to set initial editing state
- mov ds:word ptr xmsDriver,offset invalid_stub
- mov ds:word ptr xmsDriver+2,ds
- mov bx,offset FirstCodeEntryPoint
- pcmode_reinit10:
- mov ds:3[bx],cs ; fixup segment of the JMPF
- add bx,8 ; onto the next one
- cmp bx,offset LastCodeEntryPoint
- jb pcmode_reinit10
- mov ax,ds:hmaRoot ; have we established an HMA free chain
- or ax,ds:hmaAlloc ; or have any registered users ?
- jz pcmode_reinit30 ; if so hook for EXEPACK support
- mov ax,4300h
- int 2Fh ; do we have an XMS driver ?
- cmp al,80h ; 80h says yes
- jne pcmode_reinit30
- mov ax,4310h ; get it's entry point
- int 2Fh ; in ES:BX
- mov ds:word ptr xmsDriver,bx
- mov ds:word ptr xmsDriver+2,es
- mov ax,0FFFFh
- mov es,ax
- inc ax ; AX = 0
- mov es:.94h,ax ; zero the HMA alias for Int 21
- mov es:.96h,ax ; we use this as our A20 gate test
- mov bx,offset FirstCodeEntryPoint
- pcmode_reinit20:
- mov ax,offset A20Enable-3 ; we need a relative offset to
- sub ax,bx ; poke in a "call A20Enable"
- xchg ax,ds:1[bx] ; pick up the entry point segment
- mov ds:byte ptr 0[bx],0E8h ; CALL NEAR
- mov ds:byte ptr 3[bx],0EAh ; JMPF
- mov ds:4[bx],ax ; fixup the offset
- mov ds:6[bx],cs ; fixup the segment
- add bx,8 ; ready to do the next entry
- cmp bx,offset LastCodeEntryPoint
- jb pcmode_reinit20
- mov ax,70h ; now fixup the BIOS A20 Enable
- mov es,ax
- xor di,di ; patch entry point at 70:0
- mov al,09Ah ; CALLF
- stosb
- mov ax,offset BIOSA20Enable
- stosw ; offset
- mov ax,ds
- stosw ; seg
- mov al,0C3h
- stosb ; RET
- cmp ds:codeSeg,0F000h ; have we relocated DOS into the HMA ?
- jb pcmode_reinit30 ; if so we must remember it
- or cs:patch_version,DOSINHMA
- pcmode_reinit30:
- retf
- def_data_vecs rw 0
- dw INT22_OFFSET, DummyIRET
- dw INT23_OFFSET, DummyIRET
- dw INT24_OFFSET, Int24Entry
- dw INT28_OFFSET, DummyIRET
- dw INT20_OFFSET, Int20Entry
- dw INT21_OFFSET, Int21Entry
- dw INT25_OFFSET, Int25Entry
- dw INT26_OFFSET, Int26Entry
- dw INT27_OFFSET, Int27Entry
- dw INT2F_OFFSET, Int2FEntry
- dw INT30_OFFSET+1,Call5Entry
- no_def_data_vecs equ (offset $ - offset def_data_vecs)/4
- end