KERNEL.ASM
上传用户:dcs7469208
上传日期:2010-01-02
资源大小:443k
文件大小:24k
源码类别:

操作系统开发

开发平台:

DOS

  1. ;
  2. ; File:
  3. ;    kernel.asm
  4. ; Description:
  5. ; kernel start-up code
  6. ;
  7. ;      Copyright (c) 1995, 1996
  8. ; Pasquale J. Villani
  9. ; All Rights Reserved
  10. ;
  11. ; This file is part of DOS-C.
  12. ;
  13. ; DOS-C is free software; you can redistribute it and/or
  14. ; modify it under the terms of the GNU General public License
  15. ; as published by the Free Software Foundation; either version
  16. ; 2, or (at your option) any later version.
  17. ;
  18. ; DOS-C is distributed in the hope that it will be useful, but
  19. ; WITHOUT ANY WARRANTY; without even the implied warranty of
  20. ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
  21. ; the GNU General public License for more details.
  22. ;
  23. ; You should have received a copy of the GNU General public
  24. ; License along with DOS-C; see the file COPYING.  If not,
  25. ; write to the Free Software Foundation, 675 Mass Ave,
  26. ; Cambridge, MA 02139, USA.
  27. ;
  28. ; $Header:   C:/dos-c/src/kernel/kernel.asv   1.10   03 Feb 1998 23:30:08   patv  $
  29. ;
  30. ; $Log:   C:/dos-c/src/kernel/kernel.asv  $
  31. ;
  32. ;   Rev 1.10   03 Feb 1998 23:30:08   patv
  33. ;Added a start-up stack for loadable device drivers.  Need the separate
  34. ;stack so that all int 21h functions can be called.
  35. ;
  36. ;   Rev 1.9   22 Jan 1998  4:09:24   patv
  37. ;Fixed pointer problems affecting SDA
  38. ;
  39. ;   Rev 1.8   06 Jan 1998 20:12:32   patv
  40. ;Reduced device driver stack sizes.
  41. ;
  42. ;   Rev 1.7   04 Jan 1998 17:26:18   patv
  43. ;Corrected subdirectory bug
  44. ;
  45. ;   Rev 1.6   03 Jan 1998  8:36:50   patv
  46. ;Converted data area to SDA format
  47. ;
  48. ;   Rev 1.5   06 Feb 1997 22:43:18   patv
  49. ;Reduced stack sizes for block and clock devices.
  50. ;
  51. ;   Rev 1.4   06 Feb 1997 19:05:48   patv
  52. ;Added hooks for tsc command
  53. ;
  54. ;   Rev 1.3   29 May 1996 21:03:44   patv
  55. ;bug fixes for v0.91a
  56. ;
  57. ;   Rev 1.2   19 Feb 1996  3:24:06   patv
  58. ;Added NLS, int2f and config.sys processing
  59. ;
  60. ;   Rev 1.1   01 Sep 1995 17:54:24   patv
  61. ;First GPL release.
  62. ;
  63. ;   Rev 1.0   02 Jul 1995  9:05:44   patv
  64. ;Initial revision.
  65. ;
  66. ; $EndLog$
  67. ;
  68. page 60,132
  69. title kernel start-up code
  70. IFDEF ??version
  71. _TEXT segment byte public 'CODE'
  72. DGROUP group _FIXED_DATA,_DATA,_BSS,_BSSEND ; small model
  73. assume cs:_TEXT,ds:DGROUP,ss:DGROUP
  74. _TEXT ends
  75. _FIXED_DATA segment para public 'DATA'
  76. _FIXED_DATA ends
  77. _DATA segment word public 'DATA'
  78. _DATA ends
  79. _BSS segment word public 'BSS'
  80. _BSS ends
  81. _BSSEND segment byte public 'STACK'
  82. _BSSEND ends
  83. ELSE
  84. _TEXT segment byte public 'CODE'
  85. _TEXT ends
  86. _FIXED_DATA segment para public 'DATA'
  87. _FIXED_DATA ends
  88. _DATA segment word public 'DATA'
  89. _DATA ends
  90. CONST segment word public 'CONST'
  91. CONST ends
  92. _BSS segment word public 'BSS'
  93. _BSS ends
  94. _BSSEND segment byte public 'STACK'
  95. _BSSEND ends
  96. DGROUP group CONST,_DATA,_BSS,_BSSEND ; small/tiny model
  97. assume ds:DGROUP, ss:DGROUP
  98. ENDIF
  99. _TEXT segment byte public 'CODE'
  100. assume cs:_TEXT
  101. extrn _main:near
  102. extrn _con_driver:near
  103. extrn _blk_driver:near
  104. extrn _clk_driver:near
  105. STACK_SIZE equ 384/2 ; stack allocated in words
  106. ;---------------------------------------------------
  107. ;
  108. ; Device entry points
  109. ;
  110. cmdlen equ 0 ; Length of this command
  111. unit equ 1 ; Subunit Specified
  112. cmd equ 2 ; Command Code
  113. status equ 3 ; Status
  114. media equ 13 ; Media Descriptor
  115. trans equ 14 ; Transfer Address
  116. count equ 18 ; Count of blocks or characters
  117. start equ 20 ; First block to transfer
  118. IFNDEF ??version
  119.  IF STANDALONE EQ 1
  120. PUBLIC __acrtused  ; trick used by MSC to force in startup
  121. __acrtused = 9876h
  122.  ENDIF
  123. ENDIF
  124. ;
  125. ;
  126. page
  127. ;
  128. ;
  129. entry proc near
  130. IF STANDALONE EQ 1
  131. jmp short kernel_start
  132. ENDIF
  133. ;
  134. ; The "CON" device
  135. ;
  136. ; This device is the standard console device used by
  137. ; XDOS and kernel
  138. ;
  139. public _con_dev
  140. _con_dev label far
  141. dd -1
  142. dw 8003h ; con device (stdin & stdout)
  143. dw offset con_strategy
  144. dw offset con_entry
  145. db 'CON     '
  146. ;
  147. ; Header for device
  148. ;
  149. public _blk_dev
  150. _blk_dev label far
  151. dd -1
  152. dw 0000h ; block device
  153. dw offset blk_strategy
  154. dw offset blk_entry
  155. db 4
  156. db 0,0,0,0,0,0,0
  157. ;
  158. ; Header for device
  159. ;
  160. public _clk_dev
  161. _clk_dev label far
  162. dd -1
  163. dw 8004h ; clock device
  164. dw offset clk_strategy
  165. dw offset clk_entry
  166. db 'CLOCK$  '
  167. page
  168. ;
  169. ; kernel start-up
  170. ;
  171. IF STANDALONE EQ 1
  172. kernel_start: cli ; prevent interrupts while starting
  173. mov ax,DGROUP
  174. mov ss,ax
  175. mov sp,offset DGROUP:tos
  176. ; inititalize entry stack for high water tests
  177. ; mov di,seg stack_bottom
  178. ; mov es,di
  179. ; mov di,offset stack_bottom
  180. ; mov ax,offset last
  181. ; sub ax,di
  182. ; sar ax,1
  183. ; mov cx,ax
  184. ; mov ax,09090h
  185. ; cld
  186. ; rep stosw
  187. ; inititalize api stacks for high water tests
  188. mov di,seg apistk_bottom
  189. mov es,di
  190. mov di,offset apistk_bottom
  191. mov ax,offset apistk_top
  192. sub ax,di
  193. sar ax,1
  194. mov cx,ax
  195. mov ax,09090h
  196. cld
  197. rep stosw
  198. ; Now set up call frame
  199. mov ax,ss
  200. mov ds,ax
  201. mov es,ax
  202. mov bp,sp ; and set up stack frame for c
  203. sti ; now enable them
  204. mov _BootDrive,bx ; tell where we came from
  205. mov _NumFloppies,cx ; and how many
  206. mov ax,ds
  207. mov es,ax
  208. call _main
  209. mov ax,0
  210. push ax
  211. call _exit
  212. jmp $
  213. ENDIF
  214. entry endp
  215. ;
  216. ; _exit
  217. ; perform an "exit" and quit
  218. ;
  219. ; exit(code)
  220. ; int code;
  221. ;
  222. IF STANDALONE EQ 1
  223. _exit proc near
  224. public _exit
  225. cli
  226. hlt
  227. jmp _exit
  228. _exit endp
  229. ENDIF
  230. page
  231. ;
  232. ; NUL device strategy
  233. ;
  234. _nul_strtgy proc far
  235. public _nul_strtgy
  236. mov word ptr rqhdr,bx ;save rq headr
  237. mov word ptr rqhdr+2,es
  238. ret
  239. _nul_strtgy endp
  240. ;
  241. ; NUL device interrupt
  242. ;
  243. _nul_intr proc far
  244. public _nul_intr
  245. push es
  246. push bx
  247. les bx,rqhdr ;es:bx--> rqheadr
  248. or word ptr es:[bx+3],100h ;set "done" flag
  249. pop bx
  250. pop es
  251. ret
  252. _nul_intr endp
  253.   page
  254. ;
  255. ; con device strategy
  256. ;
  257. ; NOTE: This code is not standard device driver handlers
  258. ; It is written for sperate code and data space.
  259. ;
  260. con_strategy proc far
  261. push ds
  262. push ax
  263. ; small model
  264. mov ax,DGROUP ; small model - cs != ds
  265. mov ds,ax
  266. mov word ptr DGROUP:con_rp+2,es
  267. mov word ptr DGROUP:con_rp,bx
  268. pop ax
  269. pop ds
  270. ret
  271. con_strategy endp
  272. ;
  273. ; con device interrupt
  274. ;
  275. ; NOTE: This code is not standard device driver handlers
  276. ; It is written for sperate code and data space.
  277. ;
  278. con_entry proc far
  279. push si
  280. push ax
  281. push cx
  282. push dx
  283. push di
  284. push bp
  285. push ds
  286. push es
  287. push bx
  288. ; small model
  289. mov ax,DGROUP ; correct for segments
  290. mov ds,ax ; ax to carry segment
  291. mov word ptr DGROUP:con_dos_stk,sp ; use internal stack
  292. mov word ptr DGROUP:con_dos_seg,ss
  293. pushf ; put flags in bx
  294. pop bx
  295. cli ; no interrupts
  296. mov ss,ax
  297. mov sp,offset DGROUP:con_stk_top
  298. push bx
  299. popf ; restore interrupt flag
  300. mov bp,sp ; make a c frame
  301. push word ptr con_rp+2
  302. push word ptr con_rp
  303. call _con_driver
  304. pop cx
  305. pop cx
  306. les bx,dword ptr con_rp ; now return completion code
  307. mov word ptr es:[bx].status,ax ; mark operation complete
  308. pushf
  309. pop bx
  310. cli ; no interrupts
  311. mov sp,word ptr DGROUP:con_dos_stk ; use dos stack
  312. mov ss,word ptr DGROUP:con_dos_seg
  313. push bx
  314. popf ; restore interrupt flag
  315. pop bx
  316. pop es
  317. pop ds
  318. pop bp
  319. pop di
  320. pop dx
  321. pop cx
  322. pop ax
  323. pop si
  324. ret
  325. con_entry endp
  326. ;
  327. ; block device strategy
  328. ;
  329. ; NOTE: This code is not standard device driver handlers
  330. ; It is written for sperate code and data space.
  331. ;
  332. blk_strategy proc far
  333. push ds
  334. push ax
  335. ; small model
  336. mov ax,DGROUP ; small model - cs != ds
  337. mov ds,ax
  338. mov word ptr DGROUP:blk_rp+2,es
  339. mov word ptr DGROUP:blk_rp,bx
  340. pop ax
  341. pop ds
  342. ret
  343. blk_strategy endp
  344. ;
  345. ; block device interrupt
  346. ;
  347. ; NOTE: This code is not standard device driver handlers
  348. ; It is written for sperate code and data space.
  349. ;
  350. blk_entry proc far
  351. pushf
  352. push ax
  353. push bx
  354. push cx
  355. push dx
  356. push bp
  357. push si
  358. push di
  359. push ds
  360. push es
  361. ; small model
  362. mov ax,DGROUP ; correct for segments
  363. mov ds,ax ; ax to carry segment
  364. mov word ptr DGROUP:blk_dos_stk,sp ; use internal stack
  365. mov word ptr DGROUP:blk_dos_seg,ss
  366. pushf ; put flags in bx
  367. pop bx
  368. cli ; no interrupts
  369. mov ss,ax
  370. mov sp,offset DGROUP:blk_stk_top
  371. push bx
  372. popf ; restore interrupt flag
  373. mov bp,sp ; make a c frame
  374. push word ptr blk_rp+2
  375. push word ptr blk_rp
  376. call _blk_driver
  377. pop cx
  378. pop cx
  379. les bx,dword ptr blk_rp ; now return completion code
  380. mov word ptr es:[bx].status,ax ; mark operation complete
  381. cli ; no interrupts
  382. mov sp,word ptr DGROUP:blk_dos_stk ; use dos stack
  383. mov ss,word ptr DGROUP:blk_dos_seg
  384. pop es
  385. pop ds
  386. pop di
  387. pop si
  388. pop bp
  389. pop dx
  390. pop cx
  391. pop bx
  392. pop ax
  393. popf
  394. ret
  395. blk_entry endp
  396. page
  397. ;
  398. ; clock device strategy
  399. ;
  400. ; NOTE: This code is not standard device driver handlers
  401. ; It is written for sperate code and data space.
  402. ;
  403. clk_strategy proc far
  404. push ds
  405. push ax
  406. ; small model
  407. mov ax,DGROUP ; small model - cs != ds
  408. mov ds,ax
  409. mov word ptr DGROUP:clk_rp+2,es
  410. mov word ptr DGROUP:clk_rp,bx
  411. pop ax
  412. pop ds
  413. ret
  414. clk_strategy endp
  415. ;
  416. ; clock device interrupt
  417. ;
  418. ; NOTE: This code is not standard device driver handlers
  419. ; It is written for sperate code and data space.
  420. ;
  421. clk_entry proc far
  422. pushf
  423. push ax
  424. push bx
  425. push cx
  426. push dx
  427. push bp
  428. push si
  429. push di
  430. push ds
  431. push es
  432. ; small model
  433. mov ax,DGROUP ; correct for segments
  434. mov ds,ax ; ax to carry segment
  435. mov word ptr DGROUP:clk_dos_stk,sp ; use internal stack
  436. mov word ptr DGROUP:clk_dos_seg,ss
  437. pushf ; put flags in bx
  438. pop bx
  439. cli ; no interrupts
  440. mov ss,ax
  441. mov sp,offset DGROUP:clk_stk_top
  442. push bx
  443. popf ; restore interrupt flag
  444. mov bp,sp ; make a c frame
  445. push word ptr clk_rp+2
  446. push word ptr clk_rp
  447. call _clk_driver
  448. pop cx
  449. pop cx
  450. les bx,dword ptr clk_rp ; now return completion code
  451. mov word ptr es:[bx].status,ax ; mark operation complete
  452. cli ; no interrupts
  453. mov sp,word ptr DGROUP:clk_dos_stk ; use dos stack
  454. mov ss,word ptr DGROUP:clk_dos_seg
  455. pop es
  456. pop ds
  457. pop di
  458. pop si
  459. pop bp
  460. pop dx
  461. pop cx
  462. pop bx
  463. pop ax
  464. popf
  465. ret
  466. clk_entry endp
  467. page
  468. ;
  469. ; special interrupt routine for break key handling
  470. ;
  471. ;
  472. ; i_save
  473. ; save machine context on stack after an interrupt
  474. ; does not save ss and sp
  475. ;
  476. ; assumes flags and cs:ip are on stack from interrupt
  477. ;
  478. i_save proc near
  479. public i_save
  480. push bp ; start saving bp
  481. mov bp,sp ; and mark frame for exit
  482. push di ; save the rest of the registers
  483. push si
  484. push bx
  485. push cx
  486. push dx
  487. push ds
  488. push es
  489. xchg ax,[bp+2] ; swap return address with ax
  490. push ax ; put it back
  491. mov ax,[bp+2] ; recover ax from entry
  492. mov bp,[bp] ; and bp
  493. ret
  494. i_save endp
  495. ;
  496. ; i_exit
  497. ; recovers context from i_save and does interrupt return
  498. ; must be jumped to
  499. ;
  500. ; warning - make sure you're using the right stack
  501. ;
  502. i_exit proc near
  503. public i_exit
  504. pop es ; recover context
  505. pop ds
  506. pop dx
  507. pop cx
  508. pop bx
  509. pop si
  510. pop di
  511. pop bp
  512. pop ax
  513. iret ; and make like a tree (leave)
  514. i_exit endp
  515. extrn _break_handler:near
  516. _break_key proc near
  517. public _break_key
  518. call i_save ; save context
  519. mov ax,cs ; correct for segments
  520. mov ds,ax ; ax to carry segment
  521. mov word ptr DGROUP:intr_dos_stk,sp ; use internal stack
  522. mov word ptr DGROUP:intr_dos_seg,ss
  523. pushf ; put flags in bx
  524. pop bx
  525. cli ; no interrupts
  526. mov ss,ax
  527. mov sp,offset DGROUP:intr_stk_top
  528. push bx
  529. popf ; restore interrupt flag
  530. mov bp,sp ; make a c frame
  531. call _break_handler ; call handler
  532. les bx,dword ptr con_rp ; now return completion code
  533. pushf
  534. pop bx
  535. cli ; no interrupts
  536. mov sp,word ptr DGROUP:intr_dos_stk ; use dos stack
  537. mov ss,word ptr DGROUP:intr_dos_seg
  538. push bx
  539. popf
  540. jmp i_exit ; and restore & exit
  541. _break_key endp
  542. _TEXT ends
  543. _FIXED_DATA segment para public 'DATA'
  544. ; Because of the following bytes of data, THIS MODULE MUST BE THE FIRST
  545. ; IN THE LINK SEQUENCE.  THE BYTE AT DS:0004 determines the SDA format in 
  546. ; use.  A 0 indicates MS-DOS 3.X style, a 1 indicates MS-DOS 4.0-6.X style.
  547. public DATASTART
  548. DATASTART label byte
  549. dos_data db 0
  550. dw start
  551. db (?) ; padding
  552. dw 1 ; Hardcoded MS-DOS 4.0+ style
  553. ; A reference seems to indicate that this should start at offset 26h.
  554. db (26h - (offset $ - DATASTART)) dup (?)
  555. public MARK0026H
  556. MARK0026H equ $
  557. ; Globally referenced variables - WARNING: DO NOT CHANGE ORDER
  558. ; BECAUSE THEY ARE DOCUMENTED AS UNDOCUMENTED (?) AND HAVE
  559. ; MANY MULTIPLEX PROGRAMS AND TSR'S ACCESSING THEM
  560. public _NetRetry
  561. _NetRetry dw 3 ;-000c network retry count
  562. public _NetDelay
  563. _NetDelay dw 1 ;-000a network delay count
  564. public _DskBuffer
  565. _DskBuffer dd -1 ;-0008 current dos disk buffer
  566. dw (?) ;-0004 Unread con input
  567. public _first_mcb
  568. _first_mcb dw (?) ;-0002 Start of user memory
  569. public _DPBp
  570. _DPBp dd (?) ; 0000 First drive Parameter Block
  571. public _sfthead
  572. _sfthead dd (?) ; 0004 System File Table head
  573. public _clock
  574. _clock dd (?) ; 0008 CLOCK$ device
  575. public _syscon
  576. _syscon dd (?) ; 000c console device
  577. public _maxbksize
  578. _maxbksize dw (?) ; 0010 Number of Drives in system
  579. public _firstbuf;
  580. _firstbuf dd (?)      ; 0012 head of buffers linked list
  581. public _CDSp
  582. _CDSp dd (?) ; 0016 Current Directory Structure
  583. public _FCBp
  584. _FCBp dd (?) ; 001a FCB table pointer
  585. public _nprotfcb
  586. _nprotfcb dw (?) ; 001e number of protected fcbs
  587. public _nblkdev
  588. _nblkdev db (?) ; 0020 number of block devices
  589. public _lastdrive
  590. _lastdrive db (?) ; 0021 value of last drive
  591. public _nul_dev
  592. _nul_dev label dword ; 0022 device chain root
  593. dd -1
  594. dw 8004h ; attributes = char device, NUL bit set
  595. dw offset _nul_strtgy
  596. dw offset _nul_intr
  597. db 'NUL     '
  598. public _njoined
  599. _njoined db (?) ; 0034 number of joined devices
  600. dw 0 ; 0035 DOS 4 pointer to special names (always zero in DOS 5)
  601. setverPtr dw 0,0 ; 0037 setver list
  602. dw 0 ; 003B cs offset for fix a20
  603. dw 0 ; 003D psp of last umb exec
  604. dw 1 ; 003F number of buffers
  605. dw 1 ; 0041 size of pre-read buffer
  606. public _BootDrive
  607. _BootDrive dw (?) ; 0043 drive we booted from
  608. db 0 ; 0044 cpu type (1 if >=386)
  609. dw 0 ; 0045 Extended memory in KBytes
  610. buf_info dd (?) ; 0047 disk buffer chain
  611. dw 0 ; 004B 0 (DOS 4 = # hashing chains)
  612. dd (?) ; 004D pre-read buffer
  613. dw 0 ; 0051 # of sectors
  614. db 0 ; 0053 00=conv 01=HMA
  615. dw 0 ; 0054 deblock buf in conv
  616. deblock_seg dw 0 ; 0056 (offset always zero)
  617. db 3 dup (?) ; 0058 unknown
  618. dw 0 ; 005B unknown
  619. db 0, 0FFh, 0 ; 005D unknown
  620. db 0 ; 0060 unknown
  621. dw 0 ; 0061 unknown
  622. dmd_upper_link db 0 ; 0063 upper memory link flag
  623. dw 0 ; 0064 unknown
  624. dmd_upper_root dw 0FFFFh ; 0066 dmd_upper_root
  625. dw 0 ; 0068 para of last mem search
  626. SysVarEnd label byte
  627. ; Some references seem to indicate that this data should start at 01fbh in
  628. ; order to maintain 100% MS-DOS compatibility.
  629. db (01fbh - (SysVarEnd - DATASTART)) dup (?)
  630. public MARK01FBH
  631. MARK01FBH equ $
  632. db 128 dup (?)
  633. public _kb_buf
  634. _kb_buf db 129,0 ; initialise buffer to empty
  635. db 128+1 dup (?) ; room for 128 byte readline + LF
  636. ;
  637. ; Variables that follow are documented as part of the DOS 4.0-6.X swappable
  638. ; data area in Ralf Browns Interrupt List #56
  639. ;
  640. ; this byte is used for ^P support
  641. public _PrinterEcho
  642. _PrinterEcho db 0 ;-34 -  0 = no printer echo, ~0 echo
  643. public _verify_ena
  644. _verify_ena db 0 ; ~0, write with verify
  645. ; this byte is used for TAB's
  646. public _scr_pos
  647. _scr_pos db 0 ; Current Cursor Column
  648. public _switchar
  649. _switchar db '/' ;-31 - switch char
  650. public _mem_access_mode
  651. _mem_access_mode db 0 ;-30 -  memory allocation strategy
  652. public sharing_flag
  653. sharing_flag db 0 ; 00 = sharing module not loaded
  654. ; 01 = sharing module loaded, but
  655. ;      open/close for block devices
  656. ;      disabled
  657. ; FF = sharing module loaded,
  658. ;      open/close for block devices
  659. ;      enabled (not implemented)
  660. public net_set_count
  661. net_set_count db 1 ;-28 -  count the name below was set
  662. public net_name
  663. net_name db '               ' ;-27 - 15 Character Network Name
  664. db 00   ; Terminating 0 byte
  665. ;
  666. ; Variables contained the the "STATE_DATA" segment contain
  667. ; information about the STATE of the current DOS Process. These
  668. ; variables must be preserved regardless of the state of the INDOS
  669. ; flag.
  670. ;
  671. ; All variables that appear in "STATE_DATA" **MUST** be declared
  672. ; in this file as the offsets from the INTERNAL_DATA variable are
  673. ; critical to the DOS applications that modify this data area.
  674. ;
  675. ;
  676. public _CritErrFlag, _InDOS
  677. public _CritErrLocus, _CritErrCode
  678. public _CritErrAction, _CritErrClass
  679. public _CritErrDev, _CritErrDrive
  680. public  _dta
  681. public _cu_psp, _default_drive
  682. public _break_ena
  683. public  _return_code, _return_mode
  684. public _internal_data
  685. public _CritPatch
  686. _CritPatch dw 0d0ch ;-11 zero list of patched critical
  687. dw 0d0ch ;    section variables
  688. dw 0d0ch
  689. dw 0d0ch
  690. dw 0d0ch
  691. db (?) ;-01 - unknown
  692. _internal_data label byte ; <-- Address returned by INT21/5D06
  693. _CritErrFlag db 0 ; 00 - Critical Error Flag
  694. _InDOS db 0 ; 01 - Indos Flag
  695. _CritErrDrive db 0 ; 02 - Drive on write protect error
  696. _CritErrLocus db 0 ; 03 - Error Locus
  697. _CritErrCode dw 0 ; 04 - DOS format error Code
  698. _CritErrAction db 0 ; 06 - Error Action Code
  699. _CritErrClass db 0 ; 07 - Error Class
  700. _CritErrDev dd (?) ; 08 - Failing Device Address
  701. _dta dd (?) ; 0C - current DTA
  702. _cu_psp dw (?) ; 10 - Current PSP
  703. break_sp dw (?) ; 12 - used in int 23
  704. _return_code db 0 ; 14 - return code from process
  705. _return_mode db 0 ; 15 - reason for process terminate
  706. _default_drive db 0 ; 16 - Current Drive
  707. _break_ena db 0 ; 17 - Break Flag
  708. dw 0 ; 18 - unknown
  709. public _swap_always, _swap_indos
  710. _swap_always label byte
  711. public _Int21AX
  712. _Int21AX dw 0 ; 1A - AX from last Int 21
  713. public owning_psp, machine_id
  714. owning_psp dw 0 ; 1C - owning psp
  715. machine_id dw 0 ; 1E - remote machine ID
  716. dw 0 ; 20 - First usable mcb
  717. dw 0 ; 22 - Best usable mcb
  718. dw 0 ; 24 - Last usable mcb
  719. dw 0 ; 26 - memory size in paragraphs
  720. dw 0 ; 28 - unknown
  721. db 0 ; 2A - unknown
  722. db 0 ; 2B - unknown
  723. db 0 ; 2C - unknown
  724. public _break_flg
  725. _break_flg db 0 ; 2D - Program aborted by ^C
  726. db 0 ; 2E - unknown
  727. db 0 ; 2F - not referenced
  728. public _DayOfMonth
  729. _DayOfMonth db 1 ; 30 - day of month
  730. public _Month
  731. _Month db 1 ; 31 - month
  732. public _YearsSince1980
  733. _YearsSince1980 dw 0 ; 32 - year since 1980
  734. daysSince1980 dw 0FFFFh ; 34 - number of days since epoch
  735. ; force rebuild on first clock read
  736. public _DayOfWeek
  737. _DayOfWeek db 2 ; 36 - day of week
  738. public _Year
  739. _Year dw 1980 ; 37 - year
  740. db 0 ; 39 - unknown
  741. public _CharReqHdr
  742. _CharReqHdr label byte
  743. public _ClkReqHdr
  744. _ClkReqHdr db 30 dup (?) ; 3A - Device driver request header
  745. dd 0 ; 58 - pointer to driver entry
  746. public _MediaReqHdr
  747. _MediaReqHdr db 22 dup (?) ; 5C - Device driver request header
  748. public _IoReqHdr
  749. _IoReqHdr db 30 dup (?) ; 72 - Device driver request header
  750. db 6 dup (?) ; 90 - unknown
  751. public _ClkRecord
  752. _ClkRecord db 6 dup (?) ; 96 - CLOCK$ transfer record
  753. dw (?) ; 9C - unknown
  754. public __PriPathBuffer
  755. __PriPathBuffer db 80h dup (?) ; 9E - buffer for file name
  756. public __SecPathBuffer
  757. __SecPathBuffer db 80h dup (?) ;11E - buffer for file name
  758. public _TempBuffer
  759. _TempBuffer db 21 dup (?) ;19E - 21 byte srch state
  760. public _SearchDir
  761. _SearchDir db 32 dup (?) ;1B3 - 32 byte dir entry
  762. public _TempCDS
  763. _TempCDS db 88 dup (?) ;1D3 - TemporaryCDS buffer
  764. public _DirEntBuffer
  765. _DirEntBuffer db 32 dup (?) ;22B - space enough for 1 dir entry
  766. public _wAttr
  767. _wAttr dw 0 ;24B - extended FCB file attribute
  768. ; Pad to 057Ch
  769. db (25ch - (offset $ - _internal_data)) dup (?)
  770. public _tsr ; used by break and critical error
  771. _tsr db 0 ;25C -  handlers during termination
  772. db (?) ;25D - padding
  773. public term_psp
  774. term_psp     dw  0        ;25E - ???
  775. public int24_esbp
  776. int24_esbp dw 2 dup (?) ;260 - pointer to criticalerr DPB
  777. public _user_r, int21regs_off, int21regs_seg
  778. _user_r label dword
  779. int21regs_off dw 0 ;264 - pointer to int21h stack frame
  780. int21regs_seg dw 0
  781. public critical_sp
  782. critical_sp dw 0 ;268 - critical error internal stack
  783. public current_ddsc
  784. current_ddsc dw 2 dup (?)
  785. ; Pad to 059ah 
  786. db (27ah - (offset $ - _internal_data)) dup (?)
  787. public current_device
  788. current_device dw 2 dup (?) ;27A - ???
  789. public _lpCurSft
  790. _lpCurSft dw 2 dup (?) ;27e - Current SFT
  791. public current_ldt
  792. current_ldt dw 2 dup (?) ;282 - Current CDS
  793. public _lpFcb
  794. _lpFcb dw 2 dup (?) ;286 - pointer to callers FCB
  795. public current_ifn
  796. current_ifn dw 0 ;28A - SFT index for next open
  797. ; Pad to 05ceh 
  798. db (2aeh - (offset $ - _internal_data)) dup (?)
  799. public current_filepos
  800. current_filepos dw 2 dup (?) ;2AE - current offset in file
  801. ; Pad to 05f0h 
  802. db (2d0h - (offset $ - _internal_data)) dup (?)
  803. public _prev_user_r
  804. public prev_int21regs_off
  805. public prev_int21regs_seg
  806. _prev_user_r label dword
  807. prev_int21regs_off dw 0 ;2D0 - pointer to prev int 21 frame
  808. prev_int21regs_seg dw 0
  809. ; Pad to 0620h 
  810. db (300h - (offset $ - _internal_data)) dup (?)
  811. public _FcbSearchBuffer ; during FCB search 1st/next use bottom
  812. _FcbSearchBuffer label byte ;  of error stack as scratch buffer
  813. ; db 43 dup (?) ;  - only used during int 21 call
  814. public _LocalPath
  815. _LocalPath label byte
  816. ; db 67 dup (?)
  817. ; stacks are made to initialize to no-ops so that high-water
  818. ; tesing can be performed
  819. apistk_bottom label word
  820. dw STACK_SIZE dup (?) ;300 - Error Processing Stack
  821. public _error_tos
  822. _error_tos label word
  823. dw STACK_SIZE dup (?) ;480 - Disk Function Stack
  824. public _disk_api_tos
  825. _disk_api_tos label word
  826. dw STACK_SIZE dup (?) ;600 - Char Function Stack
  827. public _char_api_tos
  828. _char_api_tos label word
  829. apistk_top label word
  830. _VolChange db 0 ;781 - volume change
  831. _VirtOpen db 0 ;782 - virtual open flag
  832. ; controlled variables end at offset 78Ch so pad to end
  833. db (78ch - (offset $ - _internal_data)) dup (?)
  834. _swap_indos label byte
  835. ;
  836. ; end of controlled variables
  837. ;
  838. _FIXED_DATA ends
  839. _BSS segment word public 'BSS'
  840. public _NumFloppies
  841. _NumFloppies dw (?)
  842. rqhdr dd (?)
  843. con_rp dd (?)
  844. blk_rp dd (?)
  845. clk_rp dd (?)
  846. con_dos_stk dw (?)
  847. con_dos_seg dw (?)
  848. blk_dos_stk dw (?)
  849. blk_dos_seg dw (?)
  850. clk_dos_stk dw (?)
  851. clk_dos_seg dw (?)
  852. intr_dos_stk dw (?)
  853. intr_dos_seg dw (?)
  854. public _api_sp
  855. _api_sp dw (?) ; api stacks - for context
  856. public _api_ss
  857. _api_ss dw (?) ; switching
  858. public _usr_sp
  859. _usr_sp dw (?) ; user stacks
  860. public _usr_ss
  861. _usr_ss dw (?)
  862. public _ram_top
  863. _ram_top dw (?)
  864. _BSS ends
  865. _BSSEND segment byte public 'STACK'
  866. ; condev private stack
  867. dw 256 dup (?)
  868. con_stk_top label byte
  869. ; blockdev private stack
  870. dw 256 dup (?)
  871. blk_stk_top label byte
  872. ; clockdev private stack
  873. dw 256 dup (?)
  874. clk_stk_top label byte
  875. ; interrupt stack
  876. dw 256 dup (?)
  877. intr_stk_top label byte
  878. ; int 21 api stack area
  879. public stack_bottom
  880. stack_bottom label word
  881. ; dw 1024 dup (?)
  882. ; public _error_tos
  883. ;_error_tos label word
  884. ; dw 4096 dup (?)
  885. ; public _char_api_tos
  886. ;_char_api_tos label word
  887. ; dw 4096 dup (?)
  888. ; public _disk_api_tos
  889. ;_disk_api_tos label word
  890. public last
  891. dw 512
  892. tos label byte
  893. last label word ; must always be end of stack area
  894. public _last
  895. _last label byte ; and c version
  896. _BSSEND ends
  897. end entry