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

操作系统开发

开发平台:

Asm

  1. ;    File              : $Workfile$
  2. ;
  3. ;    Description       :
  4. ;
  5. ;    Original Author   : DIGITAL RESEARCH
  6. ;
  7. ;    Last Edited By    : $CALDERA$
  8. ;
  9. ;-----------------------------------------------------------------------;
  10. ;    Copyright Work of Caldera, Inc. All Rights Reserved.
  11. ;      
  12. ;    THIS WORK IS A COPYRIGHT WORK AND CONTAINS CONFIDENTIAL,
  13. ;    PROPRIETARY AND TRADE SECRET INFORMATION OF CALDERA, INC.
  14. ;    ACCESS TO THIS WORK IS RESTRICTED TO (I) CALDERA, INC. EMPLOYEES
  15. ;    WHO HAVE A NEED TO KNOW TO PERFORM TASKS WITHIN THE SCOPE OF
  16. ;    THEIR ASSIGNMENTS AND (II) ENTITIES OTHER THAN CALDERA, INC. WHO
  17. ;    HAVE ACCEPTED THE CALDERA OPENDOS SOURCE LICENSE OR OTHER CALDERA LICENSE
  18. ;    AGREEMENTS. EXCEPT UNDER THE EXPRESS TERMS OF THE CALDERA LICENSE
  19. ;    AGREEMENT NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED,
  20. ;    COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED,
  21. ;    CONDENSED, EXPANDED, COLLECTED, COMPILED, LINKED, RECAST,
  22. ;    TRANSFORMED OR ADAPTED WITHOUT THE PRIOR WRITTEN CONSENT OF
  23. ;    CALDERA, INC. ANY USE OR EXPLOITATION OF THIS WORK WITHOUT
  24. ;    AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO CRIMINAL AND
  25. ;    CIVIL LIABILITY.
  26. ;-----------------------------------------------------------------------;
  27. ;
  28. ;    *** Current Edit History ***
  29. ;    *** End of Current Edit History ***
  30. ;
  31. ;    $Log$
  32. ;    INIT.ASM 1.25 93/12/07 15:51:27
  33. ;    Move int13pointer to offset 0B4h as some app expects it there
  34. ;    INIT.ASM 1.24 93/11/18 18:57:20
  35. ;    Increase amount reserved for COMMAND.COM by 256 bytes
  36. ;    INIT.ASM 1.23 93/11/17 19:29:26
  37. ;    Change default DEBLOCK seg to FFFF for performance reasons
  38. ;    INIT.ASM 1.19 93/07/22 19:43:59 
  39. ;    switch over to REQUEST.EQU
  40. ;    ENDLOG
  41. include BIOSGRPS.EQU
  42. include DRMACROS.EQU
  43. include IBMROS.EQU
  44. include MSDOS.EQU
  45. include REQUEST.EQU ; request header equates
  46. include BPB.EQU
  47. include UDSC.EQU
  48. include DRIVER.EQU
  49. ; IBM AT Hardware equates
  50. COMPRESSED equ TRUE ; enables compressed changes.
  51. ; a little macro to help locate things
  52. ; it warns us when the ORG get trampled on
  53. orgabs MACRO address
  54. local was,is
  55. was = offset $
  56. org address
  57. is = offset $
  58. if was GT is
  59. if2
  60. %OUT ERROR - absolute data overwritten !! moving it
  61. endif
  62. org was
  63. endif
  64. ENDM
  65. jmpfar MACRO address, fixup
  66. db 0EAh ; jmpf opcode
  67. dw CG:address ; offset of destination
  68. fixup dw 0EDCh ; segment of destination
  69. ENDM
  70. callfar MACRO address, fixup
  71. db 09Ah ; callf opcode
  72. dw CG:address ; offset of destination
  73. fixup dw 0EDCh ; segment of destination
  74. ENDM
  75. F5KEY equ 3F00h
  76. F8KEY equ 4200h
  77. IVECT segment at 0000h
  78. org 0000h*4
  79. i0off dw ?
  80. i0seg dw ?
  81. org 0001h*4
  82. i1off dw ?
  83. i1seg dw ?
  84. org 0003h*4
  85. i3off dw ?
  86. i3seg dw ?
  87. org 0004h*4
  88. i4off dw ?
  89. i4seg dw ?
  90. org 0015h*4
  91. i15off dw ?
  92. i15seg dw ?
  93. org 0019h*4
  94. i19off dw ?
  95. i19seg dw ?
  96. org 001Eh*4
  97. i1Eptr label dword
  98. i1Eoff dw ?
  99. i1Eseg dw ?
  100. org 002Fh*4
  101. i2Fptr label dword
  102. i2Foff dw ?
  103. i2Fseg dw ?
  104. org 006Ch*4
  105. i6Cptr label dword
  106. i6Coff dw ?
  107. i6Cseg dw ?
  108. IVECT ends
  109. CGROUP group CODE, RCODE, ICODE
  110. CG equ offset CGROUP
  111. CODE segment 'CODE'
  112. Assume CS:CGROUP, DS:Nothing, ES:Nothing, SS:Nothing
  113. public strat
  114. extrn ConsoleTable:word
  115. extrn ClockTable:word
  116. extrn SerParCommonTable:word
  117. extrn DiskTable:near
  118. extrn Int13Deblock:near
  119. extrn Int13Unsure:near
  120. extrn Int2FHandler:near
  121. extrn ResumeHandler:near
  122. extrn biosinit_end:byte ; End of the BIOS Init Code and Data
  123. extrn biosinit:near
  124. extrn boot_options:word
  125. extrn rcode_fixups:word
  126. extrn rcode_seg:word
  127. extrn rcode_offset:word
  128. extrn rcode_len:word
  129. extrn icode_len:word
  130. extrn current_dos:word
  131. extrn device_root:dword
  132. extrn mem_size:word
  133. extrn ext_mem_size:word
  134. extrn init_buf:byte
  135. extrn init_drv:byte
  136. extrn init_runit:byte
  137. extrn comspec_drv:byte
  138. extrn init_flags:word
  139. include biosmsgs.def ; Include TFT Header File
  140. Public A20Enable
  141. A20Enable proc near
  142. ;========
  143. ; This location is fixed up at run time to be a RET
  144. ; If the BIOS is relocated to the HMA then it is fixed up again to be
  145. ; CALLF IBMDOS:A20Enable; RET
  146. ; Calling this location at run time will ensure that the HMA is mapped
  147. ; in so we can access the HMA code.
  148. ;
  149. A20Enable endp
  150. init proc near ; this is at BIOSCODE:0000h
  151. ifndef COPYPROT
  152. jmp init0 ; jump to reusable init space
  153. else
  154. extrn protect:near ; Jump to Copy protection code
  155. jmp protect ; which will return control to
  156. endif ; INIT0 on completion
  157. init endp
  158. compflg label word
  159. ifdef COPYPROT
  160. dw '  ' ; stops any compression working
  161. else
  162. dw offset CGROUP:INITDATA ; compresses from INITDATA onwards
  163. endif ; this word set to 0 when compressed
  164. orgabs 06h
  165.     db  'COMPAQCompatible'  
  166. dw offset CGROUP:RCODE ; lets find offset of RCODE
  167. MemFixup dw 0 ;  and its relocated segment
  168. Public cleanup
  169. cleanup PROC far ; BIOSINIT will call here later
  170. ret
  171. cleanup endp
  172. ; Local single character buffer for Ctrl-Break handling
  173. public serparFlag, serparChar
  174. serparFlag db 4 dup (FALSE) ; we haven't got any yet
  175. serparChar db 4 dup (?) ; will store one character
  176. ; Device driver headers for serial/parallel devices
  177. con_drvr dw CG:aux_drvr, 0 ; link to next device driver
  178. dw DA_CHARDEV+DA_SPECIAL+DA_ISCOT+DA_ISCIN+DA_IOCTL
  179. dw CG:strat, CG:IntCon
  180. db 'CON     '
  181. aux_drvr dw CG:prn_drvr, 0 ; link to next device driver
  182. dw DA_CHARDEV
  183. dw CG:strat, CG:IntCOM1
  184. db 'AUX     '
  185. prn_drvr dw CG:clock_drvr, 0 ; link to next device driver
  186. dw DA_CHARDEV
  187. dw CG:strat, CG:IntLPT1
  188. db 'PRN     '
  189. clock_drvr dw disk_drvr, 0 ; link to next device driver
  190. dw DA_CHARDEV+DA_ISCLK
  191. dw CG:strat, CG:IntClock
  192. db 'CLOCK$  '
  193. com1_drvr dw CG:lpt1_drvr, 0 ; link to next device driver
  194. dw DA_CHARDEV
  195. dw CG:strat, CG:IntCOM1
  196. db 'COM1    '
  197. com2_drvr dw CG:com3_drvr, 0 ; link to next device driver
  198. dw DA_CHARDEV
  199. dw CG:strat, CG:IntCOM2
  200. db 'COM2    '
  201. com3_drvr dw CG:com4_drvr, 0 ; link to next device driver
  202. dw DA_CHARDEV
  203. dw CG:strat, CG:IntCOM3
  204. db 'COM3    '
  205. IFDEF EMBEDDED
  206. extrn rdisk_drvr:near
  207. com4_drvr dw CG:rdisk_drvr, 0 ; link to next device driver
  208. ELSE
  209. com4_drvr dw -1, -1 ; link to next device driver
  210. ENDIF
  211. dw DA_CHARDEV
  212. dw CG:strat, CG:IntCOM4
  213. db 'COM4    '
  214. orgabs 0b4h ; save address at fixed location
  215. ;  for dirty apps
  216. Public i13pointer, i13off_save, i13seg_save
  217. i13pointer label dword ; address of ROS Int 13h entry
  218. i13off_save dw ?
  219. i13seg_save dw ?
  220. orgabs 0b8h ; REQ_HDR
  221. public req_ptr, req_off, req_seg
  222. req_ptr label dword
  223. req_off dw 0 ;** fixed location **
  224. req_seg dw 0 ;** fixed location **
  225. strat proc far
  226. mov cs:req_off,bx
  227. mov cs:req_seg,es
  228. ret
  229. strat endp
  230. lpt1_drvr dw CG:lpt2_drvr, 0 ; link to next device driver
  231. dw DA_CHARDEV
  232. dw CG:strat, CG:IntLPT1
  233. db 'LPT1    '
  234. lpt2_drvr dw CG:lpt3_drvr, 0 ; link to next device driver
  235. dw DA_CHARDEV
  236. dw CG:strat, CG:IntLPT2
  237. db 'LPT2    '
  238. lpt3_drvr dw CG:com2_drvr, 0 ; link to next device driver
  239. dw DA_CHARDEV
  240. dw CG:strat, CG:IntLPT3
  241. db 'LPT3    '
  242. orgabs 100h ; save vectors at fixed location
  243. ;  for dirty apps
  244. Public orgInt13
  245. NUM_SAVED_VECS equ 5
  246. vecSave db 10h
  247. dw 0,0
  248. db 13h
  249. orgInt13 dw 0,0
  250. db 15h
  251. dw 0,0
  252. db 19h
  253. dw 0,0
  254. db 1Bh
  255. dw 0,0
  256. Int19Trap:
  257. cld
  258. cli ; be sure...
  259. push cs
  260. pop ds
  261. lea si,vecSave
  262. mov cx,NUM_SAVED_VECS ; restore this many vectors
  263. Int19Trap10:
  264. xor ax,ax ; zero AH for lodsb
  265. mov es,ax ; ES -> interrupt vectors
  266. lodsb ; AX = vector to restore
  267. shl ax,1
  268. shl ax,1 ; point at address
  269. xchg ax,di ; ES:DI -> location to restore
  270. movsw
  271. movsw ; restore this vector
  272. loop Int19Trap10 ; go and do another
  273. int 19h ; and go to original int 19...
  274. orgabs 16ch ; PRN:/AUX: the device number
  275. devno db 0,0 ;** fixed location **
  276. Public NumDiskUnits, DeblockSeg
  277. disk_drvr dw CG:com1_drvr, 0 ; link to next driver
  278. dw DA_NONIBM+DA_GETSET+DA_REMOVE+DA_BIGDRV
  279. dw CG:strat, CG:IntDisk
  280. NumDiskUnits db 5, 7 dup (?)
  281. dw 0EDCh ; checked by DRIVER.SYS
  282. dw 0 ; was allocate UDSC
  283. DeblockSeg dw 0A000h ; segment we start deblocking
  284. IntLPT1: ; LPT1
  285. call DeviceDriver
  286. dw 0
  287. IntLPT2: ; LPT2
  288. call DeviceDriver
  289. dw 1
  290. IntLPT3: ; LPT3
  291. call DeviceDriver
  292. dw 2
  293. IntCOM1: ; AUX = COM1
  294. call DeviceDriver
  295. dw 3
  296. IntCOM2: ; COM2
  297. call DeviceDriver
  298. dw 4
  299. IntCOM3: ; COM3
  300. call DeviceDriver
  301. dw 5
  302. IntCOM4: ; COM4
  303. call DeviceDriver
  304. dw 6
  305. IntCon:
  306. call DeviceDriver
  307. dw offset CGROUP:ConsoleTable
  308. IntClock:
  309. call DeviceDriver
  310. dw offset CGROUP:ClockTable
  311. Public IntDiskTable
  312. IntDisk:
  313. call DeviceDriver
  314. IntDiskTable:
  315. dw offset CGROUP:DiskTable
  316. DeviceDriver proc near
  317. call A20Enable ; make sure A20 is on
  318. jmpfar DriverFunction, DriverFunctionFixup
  319. DeviceDriver endp
  320. extrn i13_AX:word
  321. Public Int13Trap
  322. Int13Trap proc far
  323. ;--------
  324. ; The Int 13 code is in low memory for speed, with unusual conditions
  325. ; having the overhead of A20Enable calls
  326. ;
  327. cmp ah,ROS_FORMAT ; ROS format function?
  328.  je Int13TrapFormat
  329. Int13Trap10:
  330. mov cs:i13_AX,ax ; save Op/Count in case of error
  331. clc
  332. pushf ; fake an Int
  333. call cs:i13pointer ; call the ROM BIOS
  334.  jc Int13Trap20 ; check for error
  335. ret 2 ; none, so return to caller
  336. Int13Trap20:
  337. cmp ah,9 ; it it a DMA error ?
  338.  je Int13TrapDMA ;  then deblock it
  339. call Int13TrapUnsure ; else declare floppy drive unsure
  340. stc ; restore error flag
  341. ret 2 ; return to user
  342. Int13TrapFormat:
  343. call Int13TrapUnsure ; mark media as unsure
  344. jmps Int13Trap10 ;  and resume
  345. Int13TrapDMA:
  346. call A20Enable ; make sure A20 is on
  347. jmpfar Int13Deblock, Int13DeblockFixup
  348. Int13TrapUnsure proc near
  349. call A20Enable ; make sure A20 is on
  350. callfar Int13Unsure, Int13UnsureFixup
  351. ret
  352. Int13TrapUnsure endp
  353. Int13Trap endp
  354. Public Int2FTrap
  355. Int2FTrap proc far
  356. ;--------
  357. jmpfar Int2FHandler, Int2FFixup
  358. Int2FTrap endp
  359. Resume proc far
  360. ;-----
  361. call A20Enable ; make sure A20 is on
  362. jmpfar ResumeHandler, ResumeFixup
  363. Resume endp
  364. Int0Trap proc far
  365. ;-------
  366. call A20Enable ; make sure A20 is on
  367. jmpfar Int0Handler, Int0Fixup
  368. Int0Trap endp
  369. Public FastConsole
  370. FastConsole  proc   far
  371. ;----------
  372. ; RAM entry to ensure INT29 vector is below INT20 vector
  373. ; We keep the normal path low to maxmimise performance, but on backspace we
  374. ; take the A20Enable hit and call high for greater TPA.
  375. ;
  376. pushx <ax, bx, si, di, bp> ; old ROS corrupts these
  377. cmp al,8 ; back space character
  378.  je Fastcon30 ; special case
  379. Fastcon10:
  380. mov ah,0Eh ; use ROS TTY-like output function
  381. mov bx,7 ; use the normal attribute
  382. int VIDEO_INT ; output the character in AL
  383. Fastcon20:
  384. popx <bp, di, si, bx, ax>
  385. iret
  386. Fastcon30:
  387. call A20Enable ; make sure A20 is on
  388. jmpfar OutputBS, OutputBSFixup ; call up to the HMA
  389. FastConsole endp
  390. Public ControlBreak
  391. ControlBreak proc far
  392. ;-----------
  393. mov cs:word ptr local_char,'C'-40h + (256*TRUE)
  394. ;; mov local_char,'C'-40h ; force ^C into local buffer
  395. ;; mov local_flag,TRUE ; indicate buffer not empty
  396. Int1Trap:
  397. Int3Trap:
  398. Int4Trap:
  399. iret
  400. ControlBreak endp
  401. public daycount
  402. daycount dw 0
  403. ; More Disk Data
  404. public local_buffer,local_id,local_pt
  405. local_buffer db 512 dup (?) ; local deblocking buffer
  406. SECSIZE equ 512
  407. IDOFF equ SECSIZE-2 ; last word in boot sector is ID
  408. PTOFF equ IDOFF-40h ; 4*16 bytes for partition def's
  409. local_id equ word ptr local_buffer + IDOFF
  410. local_pt equ word ptr local_buffer + PTOFF
  411. public bpbs,bpb160,bpb360,bpb720,NBPBS
  412. ; List of BPBs that we usually support
  413. bpb160 BPB <512,1,1,2, 64, 40*1*8,0FEh,1, 8,1,0,0>
  414. bpb180 BPB <512,1,1,2, 64, 40*1*9,0FCh,2, 9,1,0,0>
  415. bpb320 BPB <512,2,1,2,112, 40*2*8,0FFh,1, 8,2,0,0>
  416. bpb360 BPB <512,2,1,2,112, 40*2*9,0FDh,2, 9,2,0,0>
  417. bpb1200 BPB <512,1,1,2,224,80*2*15,0F9h,7,15,2,0,0>
  418. bpb720 BPB <512,2,1,2,112, 80*2*9,0F9h,3, 9,2,0,0>
  419. bpb1440 BPB <512,1,1,2,224,80*2*18,0F0h,9,18,2,0,0>
  420. bpb2880 BPB <512,2,1,2,240,80*2*36,0F0h,9,36,2,0,0>
  421. NBPBS equ 8
  422. ; The following is a template, that gets overwritten
  423. ; with the real parameters and is used while formatting
  424. public local_parms,parms_spt,parms_gpl
  425. public layout_table,bpbtbl
  426. local_parms db 11011111b ; step rate
  427. db 2 ; DMA mode
  428. db 37 ; 2*18.2 = 2 second motor off
  429. db 2 ; 512 bytes per sector
  430. parms_spt db 18 ; sectors per track
  431. db 2Ah ; gap length for read/write
  432. db 0FFh ; data length (128 byte/sector only)
  433. parms_gpl db 50h ; data length for format
  434. db 0F6h ; fill byte for format
  435. db 15 ; head settle time in ms
  436. db 8 ; motor on delay in 1/8s
  437. ; The BPB table need not survive config time, so share with layout table
  438. bpbtbl label word
  439. MAX_SPT equ 40
  440. layout_table label word ; current # of sectors/track
  441. S =  1
  442. rept MAX_SPT
  443. ; C  H  S  N
  444. ; -  -  -  -
  445. db 0, 0, S, 2
  446. S = S + 1
  447. endm
  448. orgabs 600h ; CON: one character look-ahead buffer
  449. ; nb. it's at 61B in DOS 4.0
  450. Public local_char, local_flag
  451. local_char db 0 ;** fixed location **
  452. local_flag db 0 ;** fixed location **
  453. public endbios
  454. endbios dw offset CGROUP:RESBIOS ; pointer to last resident byte
  455. CODE ends
  456. ICODE segment 'ICODE' ; reusable initialization code
  457. Assume CS:CGROUP, DS:CGROUP, ES:CGROUP, SS:Nothing
  458. bpbs dw CG:bpb360 ; 0: 320/360 Kb 5.25" floppy
  459. dw CG:bpb1200 ; 1: 1.2 Mb 5.25" floppy
  460. dw CG:bpb720 ; 2: 720 Kb 3.5" floppy
  461. dw CG:bpb360 ; 3: (8" single density)
  462. dw CG:bpb360 ; 4: (8" double density)
  463. dw CG:bpb360 ; 5: hard disk
  464. dw CG:bpb360 ; 6: tape drive
  465. dw CG:bpb1440 ; 7: 1.44 Mb 3.5" floppy
  466. dw CG:bpb1440 ; 8: Other
  467. dw CG:bpb2880 ; 9: 2.88 Mb 3.5" floppy
  468. Public init0
  469. init0 proc near
  470. ;
  471. ; We now uncompress to > (7C00h (ie. boot stack) - 700h (ie. base of code)
  472. ; This means our stack collides with our code, very bad news.
  473. ; To avoid this we switch stacks into a safer area ie. 0C000h
  474. ; The floppy parameters also live at 7C00, so we have to relocate these
  475. ; before we expand.
  476. mov cs:byte ptr A20Enable,0C3h
  477. ; fixup the RET
  478. mov sp, 0C000h ; switch to magic stack
  479. sti
  480. cld
  481. push cx ; save entry registers
  482. push di ; (important in ROM systems)
  483. xor si,si
  484. mov ds,si
  485. mov es,si
  486. Assume DS:IVECT, ES:IVECT
  487. mov di,522h ; ES:DI -> save area for parameters
  488. lds si,i1Eptr ; DS:SI -> FD parameters for ROS
  489. Assume DS:Nothing
  490. mov i1Eoff,di
  491. mov i1Eseg,es ; setup new location
  492. mov cx,11
  493. rep movsb
  494. mov es:byte ptr 0-7[di],36 ; enable read/writing of 36 sectors/track
  495. pop di
  496. pop cx
  497. if COMPRESSED
  498. mov si, cs ; preserve entry registers
  499. mov ds, si ; other than si, ds and es
  500. mov es, si
  501. xor si, si
  502. mov si, compflg ; Get Compresed BIOS Flag
  503. or si, si ; Set to Zero if the BIOS has
  504. jnz not_compressed ; been compressed
  505. mov si, CG:INITDATA
  506. push di ; bios_seg
  507. push ax ; bdos_seg
  508. push bx ; initial drives
  509. push cx ; memory size
  510. push dx ; initial flags
  511. lea cx, biosinit_end
  512. sub cx, si
  513. inc cx ; length of compressed part plus one
  514. mov di, cx
  515. neg di ; furthest offset we can use
  516. and di, 0fff0h ; on the next para below
  517. push di
  518. push si
  519. shr cx, 1
  520. rep movsw ; take a copy
  521. pop di ; di is now -> compressed dest
  522. pop si ; this is now -> compressed source
  523. bios_r20:
  524. lodsw ; get control word
  525. mov cx,ax ; as a count
  526. jcxz bios_r40 ; all done
  527. test cx,8000h ; negative ?
  528. jnz bios_r30 ; yes do zeros
  529. rep movsb ; else move in data bytes
  530. jmp short bios_r20 ; and to the next
  531. bios_r30:
  532. and cx,7fffh ; remove sign
  533. jcxz bios_r20 ; none to do
  534. xor ax,ax
  535. rep stosb ; fill with zeros
  536. jmp short bios_r20
  537. bios_r40:
  538. pop dx
  539. pop cx
  540. pop bx
  541. pop ax
  542. pop di
  543. not_compressed:
  544. endif
  545. mov si,cs
  546. mov ds,si ; DS -> local data segment
  547. cmp dl,0ffh ; booting from ROM?
  548.  jz rom_boot
  549. cmp si,1000h ; test if debugging
  550.  jb disk_boot ; skip if not
  551. ; When the BIOS is loaded by the DOSLOAD or LOADER utilities under
  552. ; Concurrent for DEBUGGING or in a ROM system then on entry AX
  553. ; contains the current location of the BDOS and CX the memory Size.
  554. ; Bx is the current code segment
  555. mov rcode_seg,dx ; rom segment of bios
  556. mov current_dos,ax ; current location of the BDOS
  557. mov mem_size,cx ; total memory size
  558. mov init_drv,bl ; initial drive
  559. mov comspec_drv,bh ;
  560. mov init_buf,3 ; assume default # of buffers
  561. mov init_flags,3
  562. jmp bios_exit
  563. rom_boot: ; BIOS is copied from ROM:
  564. ;  DL = 0FFh
  565. ; AX = segment address of DRBDOS
  566. ; BH = COMSPEC drive
  567. ; BL = INIT_DRV
  568. mov rcode_seg,di ; DI = BIOS ROM SEG
  569. mov current_dos,ax ; current location of the BDOS
  570. mov init_drv,bl ; initial drive C:
  571. mov comspec_drv,bh ; commspec drive C:
  572. mov init_flags,3 ; it is a ROM system, use comspec drive
  573. jmps rom_boot10 ; common code
  574. disk_boot:
  575. mov rcode_seg,cs
  576. sub ax,ax
  577. mov current_dos,ax ; current BDOS location to disk load
  578. xchg ax,dx ; AL = boot drive
  579. mov init_runit,al ; save the ROS unit
  580. test al,al ; test the boot drive
  581.  jz floppy_boot ; skip if floppy boot
  582. mov al,2 ; it's drive C:
  583. floppy_boot:
  584. mov init_drv,al ; set boot drive
  585. rom_boot10:
  586. pushx <ds, es> ; save registers
  587. sub bx,bx
  588. mov ds,bx ; DS:BX -> interrupt vectors
  589. Assume DS:IVECT
  590. push cs ; we want to save vectors some
  591. pop es ;  locally
  592. lea di,vecSave
  593. mov cx,NUM_SAVED_VECS ; restore this many vectors
  594. SaveVectors:
  595. xor ax,ax ; zero AH
  596. mov al,es:[di] ; AX = vector to save
  597. inc di ; skip to save position
  598. shl ax,1
  599. shl ax,1 ; point at address
  600. xchg ax,si ; DS:SI -> location to save
  601. movsw
  602. movsw ; save this vector
  603. loop SaveVectors ; go and do another
  604. mov i0off,CG:Int0Trap
  605. mov i0seg,cs ; now grab int0 vector
  606. mov i1off,CG:Int1Trap
  607. mov i1seg,cs ; now grab int1 vector
  608. mov i3off,CG:Int1Trap
  609. mov i3seg,cs ; now grab int3 vector
  610. mov i4off,CG:Int1Trap
  611. mov i4seg,cs ; now grab int4 vector
  612. mov i19off,CG:Int19Trap
  613. mov i19seg,cs ; now grab int19 vector
  614. popx <es, ds>
  615. Assume DS:CGROUP, ES:CGROUP
  616. call get_boot_options ; look for user keypress
  617. mov boot_options,ax ;  return any options
  618. mov ah,EXT_MEMORY
  619. int SYSTEM_INT ; find out how much extended memory
  620.  jnc bios_extmem
  621. xor ax,ax ; say we have no memory
  622. bios_extmem:
  623. mov ext_mem_size,ax ;  we have and store for reference
  624. mov init_buf,3 ; assume default of 3 buffers
  625. int MEMORY_INT ; get amount of conventional memory
  626. cmp ax,128
  627.  jbe bios_mem
  628. mov init_buf,5 ; use 5 buffers if > 128K of memory
  629. bios_mem: ; get amount of conventional memory
  630. mov cl,6 ;    in kilobytes (AX)
  631. shl ax,cl ; convert Kb's to paragraphs
  632. mov mem_size,ax ; set end of TPA
  633. bios_exit:
  634. ; The following code performs the fixups necessary for ROM executable
  635. ; internal device drivers.
  636. mov ax,cs ; check if we are on a rommed system
  637. cmp ax,rcode_seg
  638.  jne keep_rcode ; if so no relocation required
  639. mov ax,CG:RCODE
  640. mov rcode_offset,ax ; fixup variable need
  641. mov bx,CG:IDATA
  642. sub bx,ax
  643. mov icode_len,bx ; during init we need RCODE and ICODE
  644. mov bx,CG:RESUMECODE
  645. sub bx,ax
  646. mov rcode_header,bx
  647. mov rcode_len,bx ; afterwards we just need RCODE
  648. keep_rcode:
  649. ; If the system ROM BIOS supports RESUME mode then it will call Int 6C
  650. ; when returning from sleep mode. We take this over and reset the clock
  651. ; based upon the RTC value. To save space we only relocate the code if
  652. ; required.
  653. ;
  654. mov ax,4100h ; does the BIOS support resume mode
  655. xor bx,bx
  656. int 15h ; lets ask it
  657.  jc resume_exit
  658. push ds
  659. xor ax,ax
  660. mov ds,ax ; DS = vectors
  661. Assume DS:IVECT
  662. mov i6Coff,CG:Resume
  663. mov i6Cseg,cs ; point Int 6C at resume code
  664. Assume DS:CGROUP
  665. pop ds
  666. mov ax,cs ; check if we are on a rommed system
  667. cmp ax,rcode_seg
  668.  jne resume_exit ; if so nothing extra to keep
  669. mov ax,CG:RESBIOS
  670. sub ax,CG:RCODE
  671. mov rcode_header,ax ; keep Resume code as well...
  672. mov rcode_len,ax ; afterwards we just need RCODE
  673. resume_exit:
  674. mov ax,CG:ENDCODE ; discard RCODE (we will relocate it)
  675. mov endbios,ax
  676. mov rcode_fixups,CG:bios_fixup_tbl
  677. mov bx,CG:con_drvr ; get first device driver in chain
  678. mov word ptr device_root+0,bx
  679. mov word ptr device_root+2,ds
  680. init1:
  681. cmp word ptr [bx],0FFFFh ; last driver in BIOS?
  682.  je init3
  683. mov 2[bx],ds ; fix up segments in driver chain
  684. mov bx,[bx]
  685. jmps init1
  686. init3:
  687. jmp biosinit ; jump to BIOS code
  688. init0 endp
  689. get_boot_options:
  690. ;----------------
  691. ; On Entry:
  692. ; None
  693. ; On Exit:
  694. ; AX = boot options
  695. mov si,offset CGROUP:starting_dos_msg
  696. lodsb ; get 1st character (never NULL)
  697. get_boot_options10:
  698. mov ah,0Eh
  699. mov bx,7
  700. int VIDEO_INT ; TTY write of character
  701. lodsb ; fetch another character
  702. test al,al ; end of string ?
  703.  jnz get_boot_options10
  704. call option_key ; poll keyboard for a while
  705.  jnz get_boot_options20 ; if key available return that
  706. mov ah,2 ; else ask ROS for shift state
  707. int 16h
  708. and ax,3 ; a SHIFT key is the same as F5KEY
  709.  jz get_boot_options20
  710. mov ax,F5KEY ; ie. bypass everything
  711. get_boot_options20:
  712. ret
  713. option_key:
  714. ;----------
  715. ; On Entry:
  716. ; None
  717. ; On Exit:
  718. ; AX = keypress if interesting (F5/F8)
  719. ; ZF clear if we have an interesting key
  720. ;
  721. ; Poll keyboard looking for a key press. We do so for a maximum of 36 ticks
  722. ; (approx 2 seconds).
  723. ;
  724. xor ax,ax
  725. int 1Ah ; get ticks in DX
  726. mov cx,dx ; save in CX for later
  727. option_key10:
  728. push cx
  729. mov ah,1
  730. int 16h ; check keyboard for key
  731. pop cx
  732.  jnz option_key30 ; stop if key available
  733. push cx
  734. xor ax,ax
  735. int 1Ah ; get ticks in DX
  736. pop cx
  737. sub dx,cx ; work out elapsed time
  738. cmp dx,36 ; more than 2 secs ?
  739.  jb option_key10
  740. option_key20:
  741. xor ax,ax ; timeout, set ZF, no key pressed
  742. ret
  743. option_key30:
  744. cmp ax,F5KEY ; if it is a key we want then
  745.  je option_key40 ;  read it, else just leave
  746. cmp ax,F8KEY ;  in the type-ahead buffer
  747.  jne option_key20
  748. option_key40:
  749. xor ax,ax
  750. int 16h ; read the key
  751. test ax,ax ; clear ZF to indicate we have a key
  752. ret
  753. ICODE ends
  754. INITDATA segment 'INITDATA'
  755. ; This is a zero terminated list of locations to be fixed up with the
  756. ; segment of the relocated BIOS RCODE
  757. bios_fixup_tbl dw CG:MemFixup
  758. dw CG:OutputBSFixup
  759. dw CG:DriverFunctionFixup
  760. dw CG:Int0Fixup
  761. dw CG:Int13DeblockFixup
  762. dw CG:Int13UnsureFixup
  763. dw CG:Int2FFixup
  764. dw CG:ResumeFixup
  765. IFDEF EMBEDDED
  766. dw CG:RdiskFixup
  767. endif
  768. dw 0
  769. INITDATA ends
  770. CODE segment 'CODE'
  771. IFDEF EMBEDDED
  772. extrn RdiskFixup:word
  773. endif
  774. CODE ends
  775. RCODE_ALIGN segment public para 'RCODE'
  776. ifndef ROMSYS
  777. db 1100h dup(0) ; reserve space for command.com
  778. endif
  779. RCODE_ALIGN ends
  780. RCODE segment public word 'RCODE'
  781. rcode_header dw 0
  782. Public DataSegment
  783. DataSegment dw 0070h ; segment address of low data/code
  784. ; Called to vector to appropriate sub-function in device driver
  785. ; The Function table address immediately follows the near call, so we can index
  786. ; into it using the return address. If the offset is in the range 0-6 it's
  787. ; actually a device number for the serial/parallel driver
  788. ;
  789. ;
  790. ; On Entry to subfunctions ES:BX -> req_hdr, DX = devno (serial/parallel)
  791. ;
  792. FunctionTable struc
  793. FunctionTableMax db ?
  794. FunctionTableEntry dw ?
  795. FunctionTable ends
  796. Public DriverFunction
  797. DriverFunction proc far
  798. cld
  799. sub sp,(size P_STRUC)-4 ; make space for stack variables
  800. push bp ; (BP and RET are included)
  801. mov bp,sp ; set up stack frame
  802. pushx <ds,es>
  803. pushx <ax,bx,cx,dx,si,di> ; save all registers
  804. mov ds,cs:DataSegment
  805. mov si,(size P_STRUC)-2[bp] ; get return address = command table
  806. lodsw ; AX = following word
  807. xchg ax,dx ; DX = device number (0-6)
  808. mov si,offset CGROUP:SerParCommonTable
  809. cmp dx,6 ; if not a device number it's a table
  810.  jbe DriverFunction10
  811. mov si,dx ; DS:SI -> table
  812. DriverFunction10:
  813. les bx,req_ptr ; ES:BX -> request header
  814. mov REQUEST_OFF[bp],bx
  815. mov REQUEST_SEG[bp],es
  816. mov al,es:RH_CMD[bx] ; check if legal command
  817. cmp al,cs:FunctionTableMax[si]
  818.  ja cmderr ; skip if out of range
  819. cbw ; convert to word
  820. add ax,ax ;  make it a word offset
  821. add si,ax ; add index to function table
  822. call cs:FunctionTableEntry[si]
  823. les bx,REQUEST[bp]
  824. cmddone:
  825. or ax,RHS_DONE ; indicate request is "done"
  826. mov es:RH_STATUS[bx],ax ; update the status for BDOS
  827. popx <di,si,dx,cx,bx,ax> ; restore all registers
  828. popx <es,ds>
  829. pop bp
  830. add sp,(size P_STRUC)-2 ; discard stack variables 
  831. ret
  832. cmderr:
  833. mov ax,RHS_ERROR+3 ; "invalid command" error
  834. jmps cmddone ; return the error
  835. DriverFunction endp
  836. OutputBS proc far
  837. ;-------
  838. ; pushx <ax, bx, si, di, bp> ; these are on the stack
  839. pushx <cx, dx>
  840. mov ah,3 ; get cursor address
  841. mov bh,0 ; on page zero
  842. int VIDEO_INT ; BH = page, DH/DL = cursor row/col
  843. test dx,dx ; row 0, col 0
  844.  jz OutputBS10 ; ignore if first line
  845. dec dl ; are we in column 0?
  846.  jns OutputBS10 ; no, normal BS
  847. dec dh ; else move up one line
  848. push ds
  849. xor ax,ax
  850. mov ds,ax
  851. mov dl,ds:byte ptr [44ah] ; DL = # of columns
  852. dec dx ; DL = last column
  853. pop ds
  854. mov ah,2 ; set cursor, DH/DL = cursor, BH = page
  855. int VIDEO_INT ; set cursor address
  856. jmps OutputBS20
  857. OutputBS10:
  858. mov ax,0E08h ; use ROS TTY-like output function
  859. mov bx,7 ; use the normal attribute
  860. int VIDEO_INT ; output the character in AL
  861. OutputBS20:
  862. popx <dx, cx>
  863. popx <bp, di, si, bx, ax>
  864. iret
  865. OutputBS endp
  866. Int0Handler proc far
  867. ;----------
  868. cld
  869. push cs
  870. pop ds
  871. mov si,CG:div_by_zero_msg ; DS:SI points at ASCIZ message
  872. mov bx,STDERR ; to STDERR - where else ?
  873. mov cx,1 ; write one at a time
  874. int0_loop:
  875. mov dx,si ; DS:DX points at a char
  876. lodsb ; lets look at it first
  877. test al,al ; end of string ?
  878.  je int0_exit
  879. mov ah,MS_X_WRITE ; write out the error
  880. int DOS_INT
  881.  jnc int0_loop ; if it went OK do another
  882. int0_exit:
  883. mov ax,MS_X_EXIT*256+1 ; time to leave - say we got an error
  884. int DOS_INT ; go for it!
  885. Int0Handler endp
  886. RCODE ends
  887. end init