ioctl.asm
上传用户:xiaoan1112
上传日期:2013-04-11
资源大小:19621k
文件大小:29k
源码类别:

操作系统开发

开发平台:

Visual C++

  1. PAGE ,132
  2. TITLE ANSI Generic IOCTL Code
  3. ;******************************************************************************
  4. ;  Change Log:
  5. ;    Date    Who   #   Description
  6. ;  --------  ---  ---  ------------------------------------------------------
  7. ;  06/29/90  MKS  C04  Bug#1150.  Video 7 Fastwrite VGA has problems if a
  8. ;        Hercules mono board is the active display.
  9. ;******************************************************************************
  10. ;****************** START OF SPECIFICATIONS **************************
  11. ;  MODULE NAME: IOCTL.ASM
  12. ;  DESCRIPTIVE NAME: PERFORM THE GENERIC IOCTL CALL IN ANSI.SYS
  13. ;  FUNCTION: THE GENERIC DEVICE IOCTL IS USED TO SET AND GET THE
  14. ;      MODE OF THE DISPLAY DEVICE ACCORDING TO PARAMETERS PASSED
  15. ;      IN A BUFFER. ADDITIONALLY, THE CALL CAN TOGGLE THE
  16. ;      USE OF THE INTENSITY BIT, AND CAN LOAD THE 8X8 CHARACTER
  17. ;      SET, EFFECTIVELY GIVING MORE LINES PER SCREEN. THE
  18. ;      AVAILABILITY OF THIS FUNCTION VARIES STRONGLY WITH HARDWARE
  19. ;      ATTACHED.
  20. ;  ENTRY POINT: GENERIC_IOCTL
  21. ;  INPUT: LOCATION OF REQUEST PACKET STORED DURING STRATEGY CALL.
  22. ;  AT EXIT:
  23. ;     NORMAL: CARRY CLEAR - DEVICE CHARACTERISTICS SET
  24. ;     ERROR: CARRY SET - ERROR CODE IN AX.
  25. ;      AX = 1  - INVALID FUNCTION. EXTENDED ERROR = 20
  26. ;      AX = 10 - UNSUPPORTED FUNCTION ON CURRENT HARDWARE.
  27. ; EXTENDED ERROR = 29
  28. ;      AX = 12 - DISPLAY.SYS DOES NOT HAVE 8X8 RAM CHARACTER SET.
  29. ; EXTENDED ERROR = 31
  30. ;  INTERNAL REFERENCES:
  31. ;     ROUTINES: GET_IOCTL - PERFORMS THE GET DEVICE CHARACTERISTICS
  32. ; SET_IOCTL - PERFORMS THE SET DEVICE CHARACTERISTICS
  33. ; GET_SEARCH - SEARCHES THE INTERNAL VIDEO TABLE FOR THE
  34. ;      CURRENT MODE MATCH
  35. ; SET_SEARCH - SEARCHES THE INTERNAL VIDEO TABEL FOR THE
  36. ;      CURRENT MODE MATCH
  37. ; SET_CURSOR_EMUL - SETS THE BIT THAT CONTROLS CURSOR EMULATION
  38. ; INT10_COM - INTERRUPT 10H HANDLER TO KEEP CURRENT SCREEN SIZE
  39. ; INT2F_COM - INTERRUPT 2FH INTERFACE TO GENERIC IOCTL
  40. ; MAP_DOWN - PERFORMS CURSOR TYPE MAPPING FOR EGA WITH MONOCHROME
  41. ; SET_VIDEO_MODE - SETS THE VIDEO MODE
  42. ;     DATA AREAS: SCAN_LINE_TABLE - HOLDS SCAN LINE INFORMATION FOR PS/2
  43. ;   FUNC_INFO - BUFFER FOR PS/2 FUNCTIONALITY CALL.
  44. ;  EXTERNAL REFERENCES:
  45. ;     ROUTINES: INT 10H SERVICES
  46. ;     DATA AREAS: VIDEO_MODE_TABLE - INTERNAL TABLE FOR CHARACTERISTICS TO MODE
  47. ;      MATCH-UPS
  48. ;  NOTES:
  49. ;  REVISION HISTORY:
  50. ;      Label: "DOS ANSI.SYS Device Driver"
  51. ;       "Version 4.00 (C) Copyright 1988 Microsoft"
  52. ;       "Licensed Material - Program Property of Microsoft"
  53. ;****************** END OF SPECIFICATIONS ****************************
  54. ;Modification history *********************************************************
  55. ; P1350 Codepage switching not working on EGA    10/10/87 J.K.
  56. ; P1626 ANSI does not allow lines=43 with PS2,Monochrome    10/15/87 J.K.
  57. ; p1774 Lines=43 after selecting cp 850 does not work    10/20/87 J.K.
  58. ; p1740 MODE CON LINES command causes problem with PE2 w PS/210/24/87 J.K.
  59. ; p2167 Does'nt say EGA in medium resol. cannot do 43 lines  10/30/87 J.K.
  60. ; p2236 After esc [=0h, issuing INT10h,AH=fh returns mode=1. 11/3/87  J.K.
  61. ; p2305 With ANSI loaded, loading RDTE hangs the system    11/06/87 J.K.
  62. ; P2617 Order dependecy problem with Display.sys    11/23/87 J.K.
  63. ; p2716 HOT key of VITTORIA does not work properly    12/03/87 J.K.
  64. ; d398  /L option for Enforcing the number of lines    12/17/87 J.K.
  65. ; D425 For OS2 compatibiltiy box, /L option status query    01/14/88 J.K.
  66. ; P5699 Moving selecting alternate print screen routine to only when it
  67. ; 10/26/88    is needed.  OEM EGA cards don't support the call it, so they
  68. ; K. Sayers   couldn't (shift) print screen at all when the alt. routine was
  69. ;       invoked during initialization.
  70. ;******************************************************************************
  71. INCLUDE DEVSYM.INC
  72. INCLUDE ANSI.INC
  73. INCLUDE MULT.INC
  74. PUBLIC GENERIC_IOCTL
  75. PUBLIC SET_IOCTL
  76. PUBLIC GET_IOCTL
  77. PUBLIC SET_SEARCH
  78. PUBLIC GET_SEARCH
  79. PUBLIC SET_CURSOR_EMUL
  80. PUBLIC FUNC_INFO
  81. PUBLIC MAX_SCANS
  82. PUBLIC INT10_COM
  83. PUBLIC SET_MODE_HANDLER
  84. PUBLIC SET_CURSOR_HANDLER
  85. PUBLIC ROM_INT10
  86. PUBLIC INT2F_COM
  87. PUBLIC INT2F_HANDLER
  88. PUBLIC ROM_INT2F
  89. PUBLIC ABORT
  90. PUBLIC MAP_DOWN
  91. PUBLIC SET_VIDEO_MODE
  92. PUBLIC REQ_TXT_LENGTH
  93. PUBLIC GRAPHICS_FLAG
  94. PUBLIC DO_ROWS
  95. PUBLIC Display_Loaded_Before_Me
  96. CODE SEGMENT  PUBLIC  BYTE
  97. ASSUME CS:CODE,DS:CODE
  98. EXTRN PTRSAV:DWORD
  99. EXTRN NO_OPERATION:NEAR
  100. EXTRN ERR1:NEAR
  101. EXTRN VIDEO_MODE_TABLE:BYTE
  102. EXTRN MAX_VIDEO_TAB_NUM:ABS
  103. EXTRN HDWR_FLAG:WORD
  104. EXTRN SCAN_LINES:BYTE
  105. EXTRN SWITCH_L:Byte ;Defined in ANSI.ASM
  106. IFDEF JAPAN
  107. EXTRN row_adj:byte
  108. ENDIF
  109. SCAN_LINE_TABLE LABEL BYTE
  110. SCAN_LINE_STR <200,000000001B,0> ; 200 scan lines
  111. SCAN_LINE_STR <344,000000010B,1> ; 350 scan lines
  112. SCAN_LINE_STR <400,000000100B,2> ; 400 scan lines
  113. SCANS_AVAILABLE EQU ($ - SCAN_LINE_TABLE)/TYPE SCAN_LINE_STR
  114. ;This is used when ANSI calls Get_IOCTL, Set_IOCTL by itself.
  115. In_Generic_IOCTL_flag db 0
  116. I_AM_IN_NOW EQU 00000001b
  117. SET_MODE_BY_DISPLAY EQU 00000010b ;Display.sys calls Set mode INT 10h.
  118. CALLED_BY_INT10COM EQU 00000100b ;To prevent from calling set mode int 10h again.
  119. INT10_V_Mode db 0ffh ;Used by INT10_COM
  120. My_IOCTL_Req_Packet REQ_PCKT <0,0,0Eh,0,?,0,?,?,?,?,?>
  121. FUNC_INFO INFO_BLOCK <> ;data block for functionality call
  122. ROM_INT10 DW ? ;segment and offset of original..
  123. DW ? ;interrupt 10h vector.
  124. ROM_INT2F DW ? ;segment and offset of original..
  125. DW ? ;interrupt 2Fh vector.
  126. INTENSITY_FLAG DW OFF ;intensity flag initially off
  127. REQ_TXT_LENGTH DW DEFAULT_LENGTH ;requested text screen length
  128. SCAN_DESIRED DB 0 ;scan lines desired
  129. MAX_SCANS DB 0 ;maximum scan line setting
  130. GRAPHICS_FLAG DB TEXT_MODE ;flag for graphics mode
  131. Display_Loaded_Before_Me db 0 ;flag
  132. ANSI_SetMode_Call_Flag db 0 ;Ansi is issuing INT10,AH=0.
  133. ALT_PRT_SC_INVOKED DB FALSE ;indicates that have already set up alternat print screen routine
  134. ; PROCEDURE_NAME: GENERIC_IOCTL
  135. ; FUNCTION:
  136. ; TO GET OR SET DEVICE CHARACTERISTICS ACCORDING TO THE BUFFER PASSED
  137. ; IN THE REQUEST PACKET.
  138. ; AT ENTRY:
  139. ; AT EXIT:
  140. ; NORMAL: CARRY CLEAR - DEVICE CHARACTERISTICS SET
  141. ; ERROR: CARRY SET - ERROR CODE IN AL. (SEE MODULE DESCRIPTION ABOVE).
  142. ; NOTE: THIS PROC IS PERFORMED AS A JMP AS WITH THE OLD ANSI CALLS.
  143. GENERIC_IOCTL:
  144. les bx,[PTRSAV] ; establish addressability to request header
  145. mov al,es:[bx].MINORFUNCTION
  146. les di,es:[bx].GENERICIOCTL_PACKET ; point to request packet
  147. cmp al,GET_FUNC ; is this get subfunction?
  148. jnz gi_not_get
  149. call GET_IOCTL ; yes...execute routine
  150. jmp short gi_check_error
  151. gi_not_get:
  152. cmp al,SET_FUNC ; is this the set subfunction?
  153. jnz gi_none
  154. call SET_IOCTL ; yes....execute routine
  155. gi_check_error:
  156. jnc gi_done ; branch if no error
  157. or ax,CMD_ERROR ; yes...set error bit in status
  158. gi_done:
  159. or ax,DONE ; add done bit to status
  160. jmp ERR1 ; return with status in ax
  161. gi_none:
  162. jmp NO_OPERATION ; call lower CON device
  163. ; PROCEDURE_NAME: GET_IOCTL
  164. ; FUNCTION:
  165. ; THIS PROCEDURE RETURNS DEVICE CHARACTERISTICS.
  166. ; AT ENTRY: ES:DI POINTS TO REQUEST BUFFER
  167. ; AT EXIT:
  168. ; NORMAL: CARRY CLEAR - REQUEST BUFFER CONTAINS DEVICE CHARACTERISTICS
  169. ; ERROR: CARRY SET - ERROR CONDITION IN AX
  170. GET_IOCTL PROC NEAR
  171. cmp es:[di].INFO_LEVEL,0 ; check for valid info level
  172. jnz gi_invalid
  173. cmp es:[di].DATA_LENGTH,TYPE MODE_TABLE+1 ; and buffer size
  174. jge gi_valid
  175. gi_invalid:
  176. mov ax,INVALID_FUNC ; not valid...unsupported
  177. stc ; function..set error flag and
  178. ret
  179. gi_valid:
  180. mov es:[di].INFO_LEVEL+1,0 ; set reserved byte to 0.
  181. mov ah,REQ_VID_MODE ; request current video mode
  182. int 10H
  183. and al,VIDEO_MASK
  184. lea si,VIDEO_MODE_TABLE ; point to resident video table
  185. call GET_SEARCH ; perform search
  186. jnc gi_supported ; found?
  187. mov ax,NOT_SUPPORTED ; no....load unsupported function
  188. ret ; carry already set
  189. gi_supported:
  190. push di ;Save Request Buffer pointer
  191. mov WORD PTR es:[di].DATA_LENGTH,(TYPE MODE_TABLE)+1 ;length of data is struc size
  192. inc si ; skip mode value
  193. add di,RP_FLAGS ; point to flag word
  194. ; VGA,MCGA: VALUE RETURNED FROM FUNCTIONALITY CALL
  195. ; EGA: VALUE LAST SET THROUGH IOCTL. DEFAULT IS BLINKING.
  196. ; CGA,MONO: BLINKING
  197. cmp al,7 ; M004; Monochrome screen?
  198. mov ax,OFF ; assume CGA,MONO 
  199. ; (we always have blink).
  200. jz gi_flags_done ; M004;
  201. cmp HDWR_FLAG,MCGA_ACTIVE ; if we have an EGA or better
  202. jl gi_flags_done
  203. test HDWR_FLAG,VGA_ACTIVE ; VGA supported?
  204. jz gi_as_intensity_flag
  205. push es ; yes...prepare for
  206. push di ; functionality call
  207. push ds
  208. pop es
  209. lea di,FUNC_INFO ; point to data block
  210. mov ah,FUNC_CALL ; load function number
  211. xor bx,bx ; implementation type 0
  212. int 10H
  213. mov INTENSITY_FLAG,OFF ; assume no intensity
  214. test es:[di].MISC_INFO,INT_BIT ; is blink bit set?
  215. jnz gi_intensity_is_fine ; if not no intensity
  216. inc INTENSITY_FLAG ; we want intensity
  217. gi_intensity_is_fine:
  218. pop di ; restore registers
  219. pop es
  220. gi_as_intensity_flag:
  221. mov ax,INTENSITY_FLAG ; write the control flag..
  222. gi_flags_done:
  223. stosw ; write the control flag..
  224. ; point to next field (display)
  225. mov cx,(TYPE MODE_TABLE)-1 ; load count
  226. rep movsb ; transfer data from video table
  227. ; to request packet
  228. sub si,TYPE MODE_TABLE ; point back to start of mode data
  229. ifdef JAPAN
  230. dec di ; point to number of rows
  231. dec di
  232. ENDIF
  233. cmp [si].D_MODE,TEXT_MODE ; if we are in text mode and
  234. jnz gi_row_counted
  235. cmp [si].SCR_ROWS,DEFAULT_LENGTH ; length <> 25 then we have an EGA or VGA
  236. jz gi_row_counted
  237. ifndef JAPAN
  238. dec di ; point back to length entry in req packet
  239. dec di
  240. ENDIF
  241. push ds
  242. mov ax,ROM_BIOS ; load ROM BIOS data area segment
  243. mov ds,ax
  244. mov al,BYTE PTR ds:[NUM_ROWS] ; load current number of rows
  245. cbw
  246. inc ax ; add 1 to row count
  247. mov WORD PTR es:[di],ax ; and copy to request packet
  248. pop ds
  249. gi_row_counted:
  250. ifdef JAPAN
  251. mov al,row_adj
  252. xor ah,ah
  253. sub es:[di],ax ; support ESC[>1l
  254. ENDIF
  255. xor ax,ax ; no errors
  256. clc ; clear error flag
  257. pop di ; Restore Request Buffer pointer
  258. ret ; return to calling module
  259. GET_IOCTL ENDP
  260. ; PROCEDURE_NAME: SET_IOCTL
  261. ; FUNCTION:
  262. ; THIS PROCEDURE SETS THE VIDEO MODE AND CHARACTER SET ACCORDING
  263. ; TO THE CHARACTERSTICS PROVIDED.
  264. ; AT ENTRY:
  265. ; ES:[DI] POINTS TO REQUEST BUFFER
  266. ; AT EXIT:
  267. ; NORMAL: CLEAR CARRY - VIDEO MODE SET
  268. ; ERROR: CARRY SET - ERROR CONDITION IN AX
  269. SET_IOCTL PROC NEAR
  270. or In_Generic_IOCTL_Flag, I_AM_IN_NOW ; Signal GENERIC_IOCTL request being processed
  271. push REQ_TXT_LENGTH ; save old value in case of error
  272. cmp es:[di].INFO_LEVEL,0 ; check for valid info level
  273. jnz si_invalid
  274. cmp es:[di].DATA_LENGTH,TYPE MODE_TABLE+1 ; ane buffer size
  275. jnz si_invalid
  276. mov ax,es:[di].RP_FLAGS ; test for invalid flags
  277. test ax,INVALID_FLAGS
  278. jnz si_invalid
  279. test es:[di].RP_FLAGS,ON ; if intensity is requested and..
  280. jz si_valid
  281. cmp HDWR_FLAG,MCGA_ACTIVE ; hardware does not support it
  282. jge si_valid
  283. si_invalid:
  284. mov ax,INVALID_FUNC ; not valid...unsupported..
  285. jmp si_failed
  286. si_valid:
  287. call SET_SEARCH ; search table for match
  288. jnc si_mode_valid
  289. si_not_supp:
  290. jmp si_not_supported
  291. si_mode_valid:
  292. cmp [si].D_MODE,TEXT_MODE ; is a text mode being requested?
  293. jz si_do_text_mode
  294. call SET_VIDEO_MODE
  295. jmp si_end_ok
  296. si_do_text_mode:
  297. mov ax,es:[di].RP_ROWS ; save new requested value.
  298. mov REQ_TXT_LENGTH,ax
  299. cmp ax,DEFAULT_LENGTH ; is it just 25 lines needed?
  300. jz si_display_ok
  301. mov ax,DISPLAY_CHECK
  302. int 2FH
  303. cmp al,INSTALLED ; or is DISPLAY.SYS not there?
  304. jnz si_display_ok
  305. mov ax,CHECK_FOR_FONT
  306. int 2FH ; or if it is does it have the..
  307. jnc si_display_ok
  308. mov ax,NOT_AVAILABLE ; DISPLAY.SYS does not have the font
  309. jmp si_failed
  310. si_display_ok:
  311. cmp [si].SCR_ROWS,UNOCCUPIED
  312. jz si_is_vga
  313. test HDWR_FLAG,VGA_ACTIVE
  314. jz si_non_vga
  315. si_is_vga:
  316. mov ax,1A00h ;Get currently active adap.;C04
  317. int 10h ;VGA interrupt             ;C04
  318. mov ax,REQ_TXT_LENGTH ; restore AX
  319. cmp bl,7 ;Q: non_vga adapter?    ;C04
  320. jb si_non_vga ;Yes so do other stuff    ;C04
  321. process_vga:
  322. mov cl,3 ; ax loaded with length requested
  323. shl ax,cl ; mulitply by 8 to get scan lines
  324. lea bx,SCAN_LINE_TABLE ; load bx with scan line table start
  325. mov cx,SCANS_AVAILABLE ; total number of scan lines settings
  326. pv_while:
  327. cmp ax,[bx].NUM_LINES ; pointing at the right setting?
  328. jz pv_found
  329. add bx,TYPE SCAN_LINE_STR ; not this setting..point to next
  330. loop pv_while
  331. jmp short si_not_supp
  332. pv_found:
  333. mov dl,[bx].REP_1BH
  334. test SCAN_LINES,dl ; does the hardware have it?
  335. jz si_not_supp
  336. mov cl,[bx].REP_12H ; yes, store value to set it
  337. mov SCAN_DESIRED,cl
  338. cmp REQ_TXT_LENGTH,DEFAULT_LENGTH ; 25 lines requested?
  339. jnz pv_scan_ok
  340. mov al,MAX_SCANS ; desired scan setting should be..
  341. mov SCAN_DESIRED,AL ; the maximum.
  342. pv_scan_ok:
  343. ; following added to overcome problems with rolling
  344. ; screens in QBX and WZMAIL. Problem still exists when switching between
  345. ; mono and VGA screens when ANSI is loaded with /L.
  346. test In_Generic_IOCTL_Flag,CALLED_BY_INT10COM
  347. jnz si_set_mode_done
  348. mov ah,ALT_SELECT ; set the appropriate number..
  349. mov bl,SELECT_SCAN ; of scan lines..
  350. mov al,SCAN_DESIRED
  351. int 10H
  352. jmp short si_processed
  353. si_non_vga:
  354. mov ax,REQ_TXT_LENGTH
  355. cmp ax,DEFAULT_LENGTH ; see if length requested..
  356. jz si_cursor_emul ; is valid
  357. cmp ax,[si].SCR_ROWS
  358. jnz si_not_supported
  359. si_cursor_emul:
  360. call SET_CURSOR_EMUL
  361. si_processed:
  362. call SET_VIDEO_MODE
  363. si_set_mode_done:
  364. call DO_ROWS
  365. cmp ALT_PRT_SC_INVOKED,FALSE ; If not set up already
  366. jnz si_printscreen_ok
  367. cmp es:[di].RP_ROWS,DEFAULT_LENGTH ; and needed because lines (or 30?)
  368. jle si_printscreen_ok
  369. cmp HDWR_FLAG,MCGA_ACTIVE ; and if we have EGA or better then.. (supported)
  370. jl si_printscreen_ok
  371. mov ah,ALT_SELECT ; issue select alternate print..
  372. mov BL,ALT_PRT_SC ; screen routine call..
  373. int 10H
  374. mov ALT_PRT_SC_INVOKED,TRUE ; mark that it was done
  375. si_printscreen_ok:
  376. call SET_CURSOR_EMUL ; yes..ensure cursor emulation
  377. ; is set accordingly.
  378. cmp HDWR_FLAG,MCGA_ACTIVE ; for the EGA and better...
  379. jl si_end_ok
  380. cmp [si].V_MODE,7 ; M004; and not monochrome
  381. jz si_end_ok
  382. xor bx,bx ; bx: 1=intensity on, 0: off
  383. ; assume off
  384. test es:[di].RP_FLAGS,ON
  385. jz si_intensity_ok
  386. inc bx ; user wants intensity
  387. si_intensity_ok:
  388. mov INTENSITY_FLAG,bx
  389. mov ax,BLINK_TOGGLE
  390. xor bl,ON ; bl is opposite
  391. ; of INTENSITY_FLAG
  392. int 10H
  393. si_end_ok:
  394. and In_Generic_IOCTL_Flag, NOT I_AM_IN_NOW ; Turn the flag off
  395. pop ax ; forget old REQ_TXT_LENGTH
  396. xor ax,ax ; clear error register
  397. clc ; clear error flag
  398. ret
  399. si_not_supported:
  400. mov ax,NOT_SUPPORTED
  401. si_failed:
  402. and In_Generic_IOCTL_Flag, NOT I_AM_IN_NOW ; Turn the flag off
  403. pop REQ_TXT_LENGTH ; error...so restore old value.
  404. stc ; set error flag
  405. ret
  406. SET_IOCTL ENDP
  407. ; Procedure name: DO_ROWS
  408. ; Function:
  409. ; Only called for TEXT_MODE.
  410. ; If (REQ_TXT_LENGTH <> DEFAULT_LENGTH) &
  411. ; (DISPLAY.SYS not loaded or CODEPAGE not active)
  412. ; then
  413. ; LOAD ROM 8X8 charater.
  414. DO_ROWS PROC NEAR
  415. cmp req_txt_length, DEFAULT_LENGTH
  416. je dr_exit
  417. mov ax,LOAD_8X8  ; load 8x8 ROM font
  418. xor bl,bl
  419. int 10H ; M003;
  420. mov ax,SET_BLOCK_0 ; activate block = 0
  421. xor bl,bl
  422. int 10H ; M003;
  423. dr_exit:
  424. ret
  425. DO_ROWS  ENDP
  426. ; PROCEDURE_NAME: SET_SEARCH
  427. ; FUNCTION:
  428. ; THIS PROCEDURE SEARCHES THE RESIDENT VIDEO TABLE IN ATTEMPT TO
  429. ; FIND A MODE THAT MATCHES THE CHARACTERISTICS REQUESTED.
  430. ; AT ENTRY:
  431. ; AT EXIT:
  432. ; NORMAL: CARRY CLEAR - SI POINTS TO APPLICABLE RECORD
  433. ; ERROR: CARRY SET
  434. ; When INT10_V_Mode <> 0FFH, then assumes that the user
  435. ; issuing INT10h, Set mode function call. Unlike Generic IOCTL
  436. ; set mode call, the user already has taken care of the video mode.
  437. ; So, we also find the matching V_MODE.
  438. ; WARNING: TRASH CX
  439. SET_SEARCH PROC NEAR
  440. lea si,VIDEO_MODE_TABLE ; point to video table
  441. mov cx,MAX_VIDEO_TAB_NUM  ; load counter, # of tables
  442. ss_while:
  443. cmp [si].V_MODE,UNOCCUPIED ; while we have valid entries
  444. jz ss_not_found
  445. mov al,INT10_V_Mode
  446. cmp al,0ffh ; if not issued by Int10 set mode,
  447. jnz ss_from_set_mode
  448. mov al,es:[di].RP_MODE ; load register for compare.
  449. cmp [si].D_MODE,al ; match?
  450. jnz ss_end_while
  451. mov ax,es:[di].RP_COLORS ; yes...prepare next field
  452. cmp [si].COLORS,ax ; match?
  453. jnz ss_end_while
  454. cmp es:[di].RESERVED2,0 ; yes, ensure reserved byte is zero
  455. jnz ss_end_while
  456. cmp es:[di].RP_MODE,GRAPHICS_MODE ; for graphics mode
  457. jnz ss_not_graphic ; check the following:
  458. mov ax,es:[di].RP_WIDTH ; screen width.
  459. cmp [si].SCR_WIDTH,ax
  460. jnz ss_end_while
  461. mov ax,es:[di].RP_LENGTH ; screen length
  462. cmp [si].SCR_LENGTH,ax
  463. jnz ss_end_while ; ignore #rows and #coloumns
  464. jmp short ss_found
  465. ss_not_graphic:
  466. mov ax,es:[di].RP_COLS ; the rows are matched
  467. cmp [si].SCR_COLS,ax ; in the main routine
  468. jnz ss_end_while
  469. ss_found:
  470. clc
  471. jmp short ss_done
  472. ss_from_set_mode:
  473. cmp [si].V_MODE,al ; if V_MODE = AL, we are ok
  474. jz ss_found
  475. ss_end_while:
  476. add si,type MODE_TABLE ; then, this is not the correct entry.
  477. loop ss_while ; Let's find the next entry.
  478. ss_not_found:
  479. stc
  480. ss_done:
  481. mov INT10_V_Mode, 0FFh ; Done. Reset the value
  482. ret
  483. SET_SEARCH ENDP
  484. ; PROCEDURE_NAME: GET_SEARCH
  485. ; FUNCTION:
  486. ; THIS PROCEDURE SEARCHES THE VIDEO TABLE LOOKING FOR A MATCHING
  487. ; VIDEO MODE.
  488. ; AT ENTRY: DS:SI POINTS TO VIDEO TABLE
  489. ; AL CONTAINS THE MODE REQUESTED
  490. ; AT EXIT:
  491. ; NORMAL: CARRY CLEAR, DS:SI POINTS TO MATCHING RECORD
  492. ; ERROR: CARRY SET
  493. ; WARNING: TRASH CX
  494. GET_SEARCH PROC NEAR
  495. mov cx,MAX_VIDEO_TAB_NUM ; # of total tables
  496. gs_while:
  497. cmp [si].V_MODE,UNOCCUPIED ; while we're not pointing to
  498. jz gs_error
  499. cmp [si].V_MODE,al ; the right mode and we are still
  500. jz gs_got_it
  501. add si,TYPE MODE_TABLE ; point to the next mode
  502. loop gs_while
  503. gs_error:
  504. stc ; no, set error flag
  505. ret
  506. gs_got_it:
  507. clc
  508. ret
  509. GET_SEARCH ENDP
  510. ; PROCEDURE_NAME: SET_CURSOR_EMUL
  511. ; FUNCTION:
  512. ; THIS PROCEDURE SETS THE CURSOR EMULATION BIT OFF IN ROM BIOS. THIS
  513. ; IS TO PROVIDE A CURSOR ON THE EGA WITH THE 5154 LOADED WITH AN 8X8
  514. ; CHARACTER SET.
  515. ; AT ENTRY:
  516. ; AT EXIT:
  517. ; NORMAL: CURSOR EMULATION BIT SET FOR APPLICABLE HARDWARE
  518. ; ERROR: N/A
  519. SET_CURSOR_EMUL PROC NEAR
  520. test HDWR_FLAG,E5154_ACTIVE ; EGA with 5154?
  521. jz sce_done
  522. push si
  523. push ds ; yes..so..
  524. mov ax,ROM_BIOS ; check cursor emulation..
  525. mov ds,ax
  526. mov si,CURSOR_FLAG
  527. mov al,BYTE PTR [si]
  528. cmp cs:REQ_TXT_LENGTH,DEFAULT_LENGTH; >25 lines req?
  529. jnz sce_cursor_on
  530. and al,TURN_OFF ; no....set it OFF
  531. jmp short sce_cursor_ok
  532. sce_cursor_on:
  533. or al,TURN_ON ; yes...set it ON
  534. sce_cursor_ok:
  535. mov BYTE PTR [si],AL
  536. pop ds
  537. pop si
  538. sce_done:
  539. ret ; return to calling module
  540. SET_CURSOR_EMUL ENDP
  541. ; PROCEDURE_NAME: INT10_COM
  542. ; FUNCTION:
  543. ; THIS IS THE INTERRUPT 10H HANDLER TO CAPTURE THE FOLLOWING FUNCTIONS:
  544. ; AH=1H (SET CURSOR TYPE). CURSOR EMULATION IS PERFORMED IF WE HAVE
  545. ; AND EGA WITH A 5151 MONITOR, AND 43 LINES IS REQUESTED.
  546. ;M002; What is bellow was modified. The /L option was removed. But ansi
  547. ;M002; will still do a GET_IOCTL/SET_IOCTL for the application.
  548. ; AH=0H (SET MODE) SCREEN LENGTH IS MAINTAINED WHEN POSSIBLE. (IE. IN
  549. ; TEXT MODES ONLY.)
  550. ; AN004; Capturing Set Mode call and enforcing the # of Rows based on the
  551. ; previous Set_IOCTL request lines was a design mistake. ANSI cannot
  552. ; covers the all the application program out there which use INT 10h
  553. ; directly to make a full screen interface by their own way.
  554. ; This part of logic has been taken out by the management decision.
  555. ; Instead, for each set mdoe INT 10h function call, if it were not
  556. ; issued by SET_IOCTL procedures itself, or by DISPLAY.SYS program,
  557. ; then we assume that it was issued by an APPS, that usually does not
  558. ; know the new ANSI GET_IOCTL/SET_IOCTL interfaces.
  559. ; In this case, ANSI is going to call GET_IOCTL and SET_IOCTL function
  560. ; call - This is not to lose the local data consistency in ANSI.
  561. ; AT ENTRY:
  562. ; AT EXIT:
  563. ; NORMAL:
  564. ; ERROR:
  565. INT10_COM PROC NEAR
  566. sti  ; restore interrupts
  567. cmp ah,SET_CURSOR_CALL
  568. jz SET_CURSOR_HANDLER
  569. cmp ah,SET_MODE
  570. jz SET_MODE_HANDLER
  571. jmp DWORD PTR cs:ROM_INT10 ; no...pass it on.
  572. SET_CURSOR_HANDLER:
  573. push ax
  574. test cs:HDWR_FLAG,E5151_ACTIVE ; do we have an EGA?
  575. jz sch_goto_rom
  576. cmp cs:REQ_TXT_LENGTH,DEFAULT_LENGTH
  577. jz sch_goto_rom
  578. cmp cs:GRAPHICS_FLAG,TEXT_MODE ; with 5151..so perform cursor mapping
  579. jnz sch_goto_rom
  580. cmp cl,8
  581. jl sch_goto_rom
  582. mov al,ch ; check for cursor..
  583. and al,60h ; off emulation. J.K.
  584. cmp al,20h
  585. jz sch_goto_rom
  586. mov al,ch ; start position for cursor
  587. call MAP_DOWN
  588. mov ch,al
  589. mov al,cl ; end position for cursor
  590. call MAP_DOWN
  591. mov cl,al
  592. sch_goto_rom:
  593. pop ax
  594. jmp DWORD PTR CS:ROM_INT10 ; continue interrupt processing
  595. SET_MODE_HANDLER:
  596. pushf ; prepare for IRET
  597. mov cs:ANSI_SetMode_Call_Flag, 1 ; Used by INT2F_COM
  598. call DWORD PTR CS:ROM_INT10 ; call INT10 routine
  599. mov cs:ANSI_SetMode_Call_Flag, 0 ; Reset it
  600. push bp
  601. push es
  602. push ds
  603. push si
  604. push di
  605. push dx
  606. push cx
  607. push bx
  608. push ax
  609. push cs
  610. pop ds
  611. mov ah,REQ_VID_MODE ; get current mode..
  612. pushf
  613. call DWORD PTR ROM_INT10
  614. and al,VIDEO_MASK ; mask bit 7 (refresh)
  615. test In_Generic_IOCTL_Flag, (I_AM_IN_NOW + SET_MODE_BY_DISPLAY) ; Flag is on?
  616. ;If not (I_AM_IN_NOW or SET_MODE_BY_DISPLAY),
  617. jnz smh_ioctl_done
  618. ; cmp SWITCH_L,0 ;M002; No more /L
  619. ; jnz smh_ioctl_done ;M002; No more /L
  620. push ax ;Save mode
  621. push es
  622. push cs
  623. pop es
  624. mov di,offset My_IOCTL_Req_Packet
  625. mov INT10_V_Mode,al ;Save current mode for SET_SEARCH
  626. call Get_IOCTL
  627. jc smh_set_ioctl_done
  628. or In_Generic_IOCTL_Flag, CALLED_BY_INT10COM ;Do not set mode INT 10h again. Already done.
  629. call Set_IOCTL
  630. and In_Generic_IOCTL_Flag, not CALLED_BY_INT10COM
  631. smh_set_ioctl_done:
  632. pop es
  633. pop ax ;Restore mode
  634. mov INT10_V_Mode,0FFh
  635. smh_ioctl_done:
  636. lea si,VIDEO_MODE_TABLE
  637. call GET_SEARCH  ; look through table for mode selected.
  638. jc smh_graphic_mode ; M001; if not found then
  639. ; M001; assume graphic mode
  640. cmp [si].D_MODE,TEXT_MODE ; text mode?
  641. jz smh_text_mode
  642. smh_graphic_mode:
  643. mov GRAPHICS_FLAG,GRAPHICS_MODE ; no, set graphics flag
  644. jmp short smh_flag_done
  645. smh_text_mode:
  646. mov GRAPHICS_FLAG,TEXT_MODE ; set TEXT MODE
  647. smh_flag_done:
  648. ; test In_Generic_IOCTL_Flag, I_AM_IN_NOW
  649. ; jnz smh_l_done ; M002; No more /L
  650. ; cmp Graphics_Flag,TEXT_MODE ; M002; No more /L
  651. ; jnz smh_l_done ; M002; No more /L
  652. ; cmp SWITCH_L,1 ; M002; No more /L
  653. ; jnz smh_l_done ; M002; No more /L
  654. ; call DO_ROWS ; M002; No more /L
  655. smh_l_done:
  656. ;For each SET mode function int 10h function call, if it is not
  657. ;issued by ANSI GET_IOCTL and SET_IOCTL procedure themselves, we assume
  658. ;that the APPS, which usually does not know the ANSI GET_IOCTL/SET_IOCTL
  659. ;interfaces, intend to change the screen mode. In this case, ANSI is
  660. ;kind enough to call GET_IOCTL and SET_IOCTL function call for themselves.
  661. pop ax
  662. pop bx
  663. pop cx
  664. pop dx
  665. pop di
  666. pop si
  667. pop ds
  668. pop es
  669. pop bp
  670. iret
  671. INT10_COM ENDP
  672. ; PROCEDURE_NAME: INT2F_COM
  673. ; FUNCTION:
  674. ; THIS IS THE INTERRUPT 2FH HANDLER TO CAPTURE THE FOLLOWING FUNCTIONS:
  675. ; ax=1A00H INSTALL REQUEST. ANSI WILL RETURN AL=FFH IF LOADED.
  676. ; AH=1A01H THIS IS THE INT2FH INTERFACE TO THE GENERIC IOCTL.
  677. ; NOTE: THE GET CHARACTERISTICS FUNCTION CALL WILL RETURN
  678. ; THE REQ_TXT_LENGTH IN THE BUFFER AS OPPOSED TO
  679. ; THE ACTUAL HARDWARE SCREEN_LENGTH
  680. ; Ax=1A02h This is an information passing from DISPLAY.SYS about
  681. ; the INT 10h, SET MODE call.
  682. ; AT ENTRY:
  683. ; AT EXIT:
  684. ; NORMAL:
  685. ; ERROR:
  686. INT2F_COM PROC NEAR
  687. sti
  688. cmp ah,multANSI ; is this for ANSI?
  689. jnz ic_goto_rom
  690. cmp al,DA_INFO_2F
  691. jle INT2F_HANDLER
  692. ic_goto_rom:
  693. jmp DWORD PTR CS:ROM_INT2F ; no....jump to old INT2F
  694. INT2F_HANDLER:
  695. cmp al,INSTALL_CHECK
  696. jnz ih_not_check
  697. ; do install check
  698. mov al,INSTALLED ; load value to indicate installed
  699. clc ; clear error flag.
  700. jmp ih_iret
  701. ih_not_check:
  702. cmp al,DA_INFO_2F ; IOCTL or INFO passing?
  703. jbe ih_valid
  704. jmp ih_iret
  705. ih_valid:
  706. push bp
  707. push ax ; s
  708. push cx ; a
  709. push dx ; v
  710. push ds ; e r
  711. push es ; e
  712. push di ; g
  713. push si ; s.
  714. push bx
  715. push ds ; load ES with DS (for call)
  716. pop es
  717. mov di,dx ; load DI with dx (for call)
  718. push cs ; setup local addressability
  719. pop ds
  720. cmp al,IOCTL_2F ; IOCTL request
  721. jnz ih_not_ioctl
  722. cmp cl,GET_FUNC ; get function requested.
  723. jnz ih_not_get
  724. call GET_IOCTL
  725. jc ih_set_flags ; if no error and
  726. cmp HDWR_FLAG,E5151_ACTIVE ; >25 lines supported
  727. jl ih_set_flags
  728. cmp [si].D_MODE,TEXT_MODE ; this is a text mode then..
  729. jnz ih_set_flags
  730. ; cmp SWITCH_L,1 ; M002; No more /L
  731. ; jz ih_use_rtl ; M002; No more /L
  732. cmp ANSI_SetMode_Call_Flag,1
  733. jnz ih_use_rtl ; if not originated by ANSI thru AH=0, Int10
  734. cmp Display_Loaded_Before_me,1 ; or Display.sys not loaded before ANSI,
  735. jz ih_get_ok
  736. ih_use_rtl:
  737. mov bx,REQ_TXT_LENGTH ; then use REQ_TXT_LENGTH instead..
  738. mov es:[di].RP_ROWS,bx
  739. ih_get_ok:
  740. clc
  741. jmp short ih_set_flags
  742. ih_not_get:
  743. cmp cl,SET_FUNC
  744. jnz ih_invalid
  745. call SET_IOCTL ; set function requested.
  746. jmp short ih_set_flags
  747. ; invalid function
  748. ih_invalid:
  749. mov ax,INVALID_FUNC ; load error and...
  750. stc  ; set error flag.
  751. jmp short ih_set_flags ; Info. passing
  752. ih_not_ioctl:
  753. cmp es:[di].DA_INFO_LEVEL,0 ; 0 - DA_SETMODE_FLAG request
  754. jnz ih_not_info
  755. cmp es:[di].DA_SETMODE_FLAG,1
  756. jnz ih_not_set
  757. or In_Generic_IOCTL_Flag, SET_MODE_BY_DISPLAY ;Turn the flag on
  758. jmp short ih_info_ok
  759. ih_not_set:
  760. and In_Generic_IOCTL_Flag, not SET_MODE_BY_DISPLAY ;Turn the flag off
  761. jmp short ih_info_ok
  762. ih_not_info:
  763. cmp es:[di].DA_INFO_LEVEL,1 ; 1 = DA_L_STATA query
  764. jnz ih_info_ok
  765. ; mov al,cs:[SWITCH_L] ; M002; No more /L
  766. mov al,OFF ; M002; No more /L
  767. mov es:[di].DA_L_STATE, al
  768. ih_info_ok:
  769. clc ; clear carry. There is no Error in DOS 4.00 for this call.
  770. ih_set_flags:
  771. pop bx ; restore all..
  772. pop si
  773. pop di ; registers except..
  774. pop es
  775. pop ds ; BP.
  776. pop dx
  777. pop cx
  778. push ax ; save error condition
  779. mov bp,sp ; setup frame pointer
  780. mov ax,[bp+10] ; load stack flags
  781. jc ih_error ; carry set???
  782. and ax,NOT_CY ; no.. set carry off.
  783. mov [bp+10],ax ; put back on stack.
  784. pop ax ; remove error flag from stack
  785. pop ax ; no error so bring back function call
  786. XCHG ah,al ; exchange to show that ANSI present
  787. jmp short ih_pop_bp
  788. ih_error:
  789. or ax,CY ; yes...set carry on.
  790. mov [bp+10],ax ; put back on stack.
  791. pop ax ; restore error flag
  792. pop bp ; pop off saved value of ax (destroyed)
  793. ih_pop_bp:
  794. pop bp ; restore final register.
  795. ih_iret:
  796. ABORT: iret
  797. INT2F_COM ENDP
  798. ; PROCEDURE_NAME: MAP_DOWN
  799. ; FUNCTION:
  800. ; THIS PROCEDURE MAPS THE CURSOR START (END) POSITION FROM A 14 PEL
  801. ; BOX SIZE TO AN 8 PEL BOX SIZE.
  802. ; AT ENTRY: AL HAS THE CURSOR START (END) TO BE MAPPED.
  803. ; AT EXIT:
  804. ; NORMAL: AL CONTAINS THE MAPPED POSITION FOR CURSOR START (END)
  805. ; ERROR: N/A
  806. MAP_DOWN PROC NEAR
  807. push bx
  808. xor ah,ah  ; clear upper byte of cursor position
  809. mov bl,EIGHT ; multiply by current box size.
  810. push dx ; al x
  811. mul bl ; ---- = ---
  812. pop dx ; 14 8
  813. mov bl,FOURTEEN
  814. div bl ; divide by box size expected.
  815. pop bx
  816. ret
  817. MAP_DOWN ENDP
  818. ; PROCEDURE_NAME: SET_VIDEO_MODE
  819. ; FUNCTION:
  820. ; THIS PROCEDURE SETS THE VIDEO MODE SPECIFIED IN DS:[SI].V_MODE.
  821. ; AT ENTRY: DS:SI.V_MODE CONTAINS MODE NUMBER
  822. ; AT EXIT:
  823. ; NORMAL: MODE SET
  824. ; ERROR: N/A
  825. SET_VIDEO_MODE PROC NEAR
  826. test In_Generic_IOCTL_Flag,CALLED_BY_INT10COM
  827. jnz svm_done
  828. mov al,[si].V_MODE ; ..issue set mode
  829. test HDWR_FLAG,LCD_ACTIVE
  830. jnz svm_update_bios ; is this the LCD?
  831. test HDWR_FLAG,VGA_ACTIVE ; or VGA? (done for BRECON card)
  832. jz svm_update_done
  833. svm_update_bios:
  834. push ds ; yes...
  835. mov bl,al ; save mode
  836. mov ax,ROM_BIOS
  837. mov ds,ax ; get equipment status flag..
  838. mov ax,ds:[EQUIP_FLAG]
  839. and ax,INIT_VID_MASK ; clear initial video bits..
  840. cmp bl,MODE7 ; are we setting mono?
  841. jz svm_mono
  842. cmp bl,MODE15
  843. jnz svm_color
  844. svm_mono:
  845. or ax,LCD_MONO_MODE ; yes...set bits as mono
  846. jmp short svm_update_it
  847. svm_color:
  848. or ax,LCD_COLOR_MODE ; no...set bits as color
  849. svm_update_it:
  850. mov ds:[EQUIP_FLAG],ax   ; replace updated flag.
  851. mov al,bl   ; restore mode.
  852. pop ds
  853. svm_update_done:
  854. mov ah,SET_MODE ; set mode
  855. int 10H
  856. svm_done:
  857. ret
  858. SET_VIDEO_MODE ENDP
  859. CODE ENDS
  860. END