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

操作系统开发

开发平台:

Visual C++

  1. ;***
  2. ;* $Workfile:   initscr.asm  $
  3. ;* $Revision:   1.0  $
  4. ;*   $Author:   Dave Sewell  $
  5. ;*     $Date:   11 Sep 1990  8:46:06  $
  6. ;***
  7. %               .MODEL MEDIUM, PASCAL
  8. ; Hercules Graphics InColor Card constants
  9. DMC_PORT        EQU     03B8H       ; Display mode control port
  10. STATUS_PORT     EQU     03BAH       ; Display status port
  11. INDEX_REG       EQU     03B4H       ; 6845 index register
  12. DATA_REG        EQU     03B5H       ; 6845 data register
  13. XMODE_REG       EQU     14H         ; character mode option port
  14. UNDERSCORE_REG  EQU     15H         ; register to set underscore
  15. OVERSTRIKE_REG  EQU     16H         ; register to set overstrike
  16. EXCEPTION_REG   EQU     17H         ; bit 0-3  cursor color
  17.                                     ; bit 4    palette enable/disable
  18.                                     ; bit 5    normal/alternate attributes
  19.                                     ; bit 6-7  unused
  20. PALETTE_REG     EQU     1CH
  21. ID_MASK         EQU     01110000B   ; to detect the presence of
  22. ID_CODE         EQU     01010000B   ; a GB222 (InColor card)
  23. MOTOROLA_6845   EQU     3DAH
  24. REVERSE_BIT     EQU     1
  25. UNDERLINE_BIT   EQU     2
  26. NORMAL_BIT      EQU     4
  27. BOLD_BIT        EQU     8
  28. BIOS_SEG    SEGMENT AT 40H
  29.             ORG     49H
  30. crt_mode    DB      ?
  31. crt_cols    DW      ?
  32. crt_len     DW      ?
  33. crt_start   DW      ?
  34. cursor_posn DW      ?
  35.             
  36.             ORG     84H
  37. crt_rows    DB      ?
  38. BIOS_SEG    ENDS
  39.                 .DATA?
  40.                 EXTRN   HerculesInColor:BYTE
  41.                 EXTRN   __attrib:WORD
  42.                 EXTRN   _desqview:BYTE
  43.                 EXTRN   _cursor_column:BYTE
  44.                 EXTRN   _cursor_row:BYTE
  45.                 EXTRN   _cursor_location:WORD
  46.                 EXTRN   _cursor_value:WORD
  47.                 EXTRN   _scr_rows:BYTE
  48.                 EXTRN   _scr_cols:BYTE
  49.                 EXTRN   is_mono:BYTE
  50. topview         DB      ?
  51. HerculesReset   DB      ?               ; Non-zero if users palette was loaded
  52.                                         ; Zero if to reset to Default palette
  53.                 .DATA
  54.                 EXTRN   _display_segment:WORD
  55.                 EXTRN   _display_offset:WORD
  56.                 EXTRN   _retrace_wait:BYTE
  57.                 EXTRN   _force_mono:BYTE
  58.                 EXTRN   _on_cursor_value:WORD
  59.                 EXTRN   _off_cursor_value:WORD
  60. old_video_mode  DB      0FFH
  61. ; EGA/VGA compatable palette defined below.  This area is also used for the
  62. ; buffer when reading the user desired palette from the HPAL file.
  63. ;
  64. HerculesPalette DB      0, 1, 2, 3, 4, 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63
  65.                 DB      00010011B       ; Palette enabled, alternate attributes
  66.                                         ; Cursor Color set to palette index 3
  67.                 DB      01101101B       ; Underscore color = index 6, line = 13
  68. PALETTE_LENGTH  EQU     ($ - HerculesPalette)
  69.                 EXTRN   PASCAL LoadHerculesPalette:FAR
  70.                 EXTRN   PASCAL SetTopview:FAR
  71.                 .CODE   FAR_TEXT
  72. ;*** The following macro generates code to wait for horizontal retrace
  73. ;*** intervals.  This is necessary to prevent screen snow when using the
  74. ;*** IBM color adapter.  Interrupts are disabled during the wait.
  75. ;*** DX must have the address of the Motorola 6845 status port.
  76. ;*** AL is clobbered.
  77. RetraceWait     MACRO
  78.                 LOCAL   WaitForLow, WaitForHigh
  79. WaitForLow:     IN      AL, DX
  80.                 RCR     AL, 1
  81.                 JC      WaitForLow
  82.                 CLI
  83. WaitForHigh:    IN      AL, DX
  84.                 RCR     AL, 1
  85.                 JNC     WaitForHigh
  86.                 ENDM
  87. CheckHercules   PROC    NEAR    USES ES SI
  88.                 mov     ax, 40H
  89.                 mov     es, ax
  90.                 mov     si, 6CH
  91.                 mov     HerculesInColor, 0  ;Pre-set for not Hercules
  92.                 mov     dx, STATUS_PORT     ; record state
  93.                 in      al, dx
  94.                 and     al, 80h             ; save bit 7 for test
  95.                 mov     bl, al
  96.                 mov     cx, es:[si]
  97. @@:             in      al, dx              ; take another reading
  98.                 and     al, 80h             ; again, save bit seven
  99.                 cmp     al, bl
  100.                 jne     hgc_ok              ; if bit 7 changes, then it
  101.                 mov     ax, es:[si]
  102.                 sub     ax, cx
  103.                 cmp     ax, 2
  104.                 jb      @B                  ;No - keep looking
  105.                 jmp     SHORT exit          ; Test failed - leave flag zero
  106. hgc_ok:         in      al, dx              ; test for GB222
  107.                 and     al, ID_MASK         ; clear all but bits 4, 5, and 6
  108.                 cmp     al, ID_CODE         ; test ID bits
  109.                 jne     exit                ; exit if failed - not a GB222
  110.                 inc     HerculesInColor     ; It is a GB222, set flag non-zero
  111. exit:           ret
  112. CheckHercules   ENDP
  113. ; SetHerculesPalette    loads the HerculesPalette data into the InColor palette
  114. ;                       registers, enables the palette and the alternate
  115. ;                       attribute set.
  116. SetHerculesPalette  PROC
  117.                 mov     dx, INDEX_REG
  118.                 mov     al, PALETTE_REG ; point at GB222 palette registers
  119.                 out     dx, al
  120.                 inc     dx              ; increment to 6845 data register
  121.                 in      al, dx          ; reset the palette pointer
  122.                 mov     cx, 16          ; 16 registers in the palette
  123.                 mov     si, OFFSET HerculesPalette
  124. @@:             lodsb                   ; load 1st 16 bytes into color index
  125.                 out     dx, al          ; registers
  126.                 loop    @B
  127.                 dec     dx              ; Set Palette, Attribute set, and cursor color
  128.                 mov     al, EXCEPTION_REG
  129.                 out     dx, al
  130.                 inc     dx
  131.                 lodsb
  132.                 out     dx, al
  133.                 dec     dx              ; Set the underscore position and color
  134.                 mov     al, UNDERSCORE_REG
  135.                 out     dx, al
  136.                 inc     dx
  137.                 lodsb
  138.                 out     dx, al
  139.                 mov     dx, DMC_PORT
  140.                 mov     al, 00001000B   ; Page zero, blink off, enable video,
  141.                 out     dx, al          ; text mode
  142.                 ret
  143. SetHerculesPalette  ENDP
  144. ; Sets Hercules InColor card to default (hardware) settings.  This routine is
  145. ; called if the users palette could not be loaded for any reason.
  146. ;
  147. SetHerculesDefault  PROC
  148.                 mov     dx, INDEX_REG
  149.                 mov     al, EXCEPTION_REG
  150.                 out     dx, al
  151.                 inc     dx
  152.                 mov     al, 00100000B   ; Normal attributes, palette disabled
  153.                 out     dx, al
  154.                 dec     dx
  155.                 mov     al, UNDERSCORE_REG
  156.                 out     dx, al
  157.                 inc     dx
  158.                 mov     al, 0           ; reset underscore register
  159.                 out     dx, al
  160.                 ret
  161. SetHerculesDefault  ENDP
  162. init_scr        PROC    FAR USES BP DI SI
  163.                 LOCAL   mode_set:WORD
  164. ;* extern int _far _pascal init_scr(void);
  165.                 mov     _scr_rows, 25
  166.                 mov     _scr_cols, 80
  167.                 xor     ax, ax
  168.                 mov     _retrace_wait, al
  169.                 mov     mode_set, ax
  170.                 mov     ah, 1AH             ;AH = 0x1A, AL = 0
  171.                 INT     10H
  172.                 cmp     al, 1AH
  173.                 jne     check_ega
  174.                 cmp     bl, 2
  175.                 jne     determine_mode
  176. need_retrace:   inc     _retrace_wait
  177.                 jmp     short determine_mode
  178. check_ega:      mov     ah, 12H
  179.                 mov     bl, 10H
  180.                 INT     10H
  181.                 cmp     bl, 10H
  182.                 jne     determine_mode
  183.                 INT     11H         ;Get BIOS equipment list
  184.                 and     al, 30H
  185.                 cmp     al, 30H
  186.                 jne     need_retrace
  187. determine_mode: mov     ah, 15
  188.                 INT     10H
  189.                 mov     old_video_mode, al
  190.                 cmp     ah, 80              ; Insure we are in 80 column mode
  191.                 jne     set_mode
  192.                 cmp     al, 7
  193.                 je      check_rows
  194.                 cmp     al, 3
  195.                 jne     set_mode
  196. check_rows:     mov     bx, 40H
  197.                 mov     es, bx
  198.                 mov     bl, es:crt_rows
  199.                 cmp     bl, 24              ; 25 line mode OK
  200.                 je      save_rows
  201.                 cmp     bl, 42              ; 43 line mode OK
  202.                 je      save_rows
  203.                 cmp     bl, 49
  204.                 je      save_rows
  205. set_mode:       mov     ax, 3
  206.                 INT     10H
  207.                 inc     mode_set
  208.                 mov     bl, es:crt_rows
  209.                 cmp     bl, 24              ; 25 line mode OK
  210.                 je      save_rows
  211.                 cmp     bl, 42
  212.                 je      save_rows
  213.                 cmp     bl, 49
  214.                 jne     determine_seg
  215. save_rows:      inc     bl
  216.                 mov     _scr_rows, bl
  217. determine_seg:  mov     ah, 3
  218.                 INT     10H
  219.                 mov     _cursor_location, dx
  220.                 mov     _cursor_value, cx
  221.                 mov     ah, 15
  222.                 INT     10H
  223.                 cmp     al, 7
  224.                 je      mono_seg
  225. color_seg:      mov     _display_segment, 0B800H
  226.                 mov     is_mono, 0
  227.                 mov     _on_cursor_value, 0607H
  228.                 mov     _off_cursor_value, 2607H
  229.                 jmp     short check_dv
  230. mono_seg:       mov     _display_segment, 0B000H
  231.                 mov     is_mono, 1
  232.                 mov     _on_cursor_value, 0B0CH
  233.                 mov     _off_cursor_value, 2B0CH
  234.                 mov     _retrace_wait, 0
  235.                 call    CheckHercules   ; See if we are on an InColor Card
  236.                 cmp     HerculesInColor, 0
  237.                 je      check_dv
  238.                 call    SetHerculesPalette  ; Set Palette to EGA/VGA colors
  239.     ; If using an InColor card, load (but do not set) the users default palette.
  240.     ; Restore_screen may be called from the critical error handler.  During
  241.     ; critical error handling the users palette could not be loaded as the load
  242.     ; process involves DOS I/O.  However, since we load the users palette here,
  243.     ; there is no problem calling restore_screen from the critical error
  244.     ; handler.
  245.                 push    ds              ; Seg:offset of palette buffer
  246.                 mov     ax, OFFSET HerculesPalette
  247.                 push    ax
  248.                 mov     ax, PALETTE_LENGTH
  249.                 push    ax              ; buffer length
  250.                 call    LoadHerculesPalette
  251.                 mov     HerculesReset, al
  252. check_dv:       mov     _desqview, 0
  253.                 mov     topview,  0
  254.                 mov     cx, 'DE'
  255.                 mov     dx, 'SQ'
  256.                 mov     ax, 2B01H
  257.                 int     21H
  258.                 cmp     al, 0FFH
  259.                 je      @F
  260.                 inc     _desqview
  261. @@:             mov     es, _display_segment
  262.                 mov     di, _display_offset
  263.                 mov     ah, 0FEH
  264.                 INT     10H                     ;Check for TopView windowing
  265.                 mov     ax, es
  266.                 cmp     ax, _display_segment
  267.                 jne     display_change
  268.                 cmp     di, _display_offset
  269.                 je      init_done
  270. display_change: mov     _display_segment, es
  271.                 mov     _display_offset,  di
  272.                 mov     _retrace_wait, 0
  273.                 cmp     _desqview, 0
  274.                 jne     init_done
  275.                 inc     topview                 ;Topview (needs update calls)
  276.                 mov     al, topview
  277.                 call    SetTopview
  278. init_done:      mov     ax, mode_set
  279.                 ret
  280. init_scr        ENDP
  281. restore_scr     PROC    FAR USES BP DI SI, restore_mode:WORD
  282. ;* extern void _far _pascal restore_scr(int restore_mode);
  283.                 cmp     HerculesInColor, 0
  284.                 je      reset_mode
  285.                 cmp     HerculesReset, 0
  286.                 je      @F
  287.                 call    SetHerculesPalette
  288.                 jmp     short reset_mode
  289. @@:             call    SetHerculesDefault
  290. reset_mode:     cmp     restore_mode, 0
  291.                 je      restore_ret
  292.                 mov     al, old_video_mode
  293.                 xor     ah, ah
  294.                 INT     10H
  295. restore_ret:    ret
  296. restore_scr     ENDP
  297.                 END