Click here to load reader

The CRTC Interface

  • View

  • Download

Embed Size (px)


The CRTC Interface. Essential aspects of display page and cursor control for standard 80-column by 25-row text. Motivation. - PowerPoint PPT Presentation

Text of The CRTC Interface

  • The CRTC InterfaceEssential aspects of display page and cursor control for standard 80-column by 25-row text

  • MotivationWhen a UNIX application wishes to write a text message to the display, and then wait for a keyboard-response from the user, the application will want a cursor to be visible at the position where the next keystroke is going to be echoedEXAMPLE: Please type a number: We expect a blinking cursor to appear here

  • But its tedious to programTo write code that draws a blinking cursor on the screen would be a time-consuming chore for both programmer and processor:You have to repeatedly draw and then hideYou have to setup careful timing controlsYour program-loop will keep the CPU busy! Fortunately the video systems hardware is able to handle this tedious chore for you!

  • Info the CRTC engine needsThe display hardware already knows how to do the timing for normal cursor blinking (i.e., usually about two blinks per second) Software only needs to tell the hardware a few specific pieces of information:Where does the cursor appear (row, column)? How large is the cursor? Where does it start and end within the 8x16 character-cell?Which region of display-memory is visible?

  • Hardware registersThe CRT Controller is a peripheral chip It implements 25 standard CRTC registersAccess to these registers is accomplished via a multiplexing scheme which uses just two I/O port-addresses for color text:address-port:0x03D4data-port:0x03D5

  • How it worksThe multiplexing scheme for access to the CRTC registers was designed to function as a two-step operation:First, specify which register is to be accessed (by writing the registers index to port 0x3D4)Then, read (or write) to the specified register (by inputting, or outputting, at port 0x3D5) But a multi-step scheme is problematic for preemptive multitasking (also it is slow!)

  • A useful optimizationTo improve the multiplexing scheme when writing values to CRTC registers, the CPU is able to perform the two steps in a single atomic fetch-execute cycle:

    Here the outw instruction will write AL to port $0x03D4 and AH to port $0x03D5 mov$0x03D4, %dxmov$0xFF14, %axoutw%ax, %dx

  • Cursor-related CRTC registersFor text-mode cursor-control, we are concerned with just 6 (of the 25) standard CRTC registers:Index 0x0A:CURSOR_STARTIndex 0x0B:CURSOR_ENDIndex 0x0C:START_ADDRESS_HIIndex 0x0D:START_ADDRESS_LOIndex 0x0E:CURSOR_LOCATION_HIIndex 0x0F:CURSOR_LOCATION_LO

  • 8x16 character boxscanline 0scanline 1 scanline 2scanline 3scanline 4scanline 5scanline 6scanline 7scanline 8scanline 9scanline 10scanline 11scanline 12scanline 13scanline 14scanline 15Cursor_start = 12Cursor_end = 13

  • CURSOR START/ENDdis-ablestarting_scanlineskewending_scanline7654321076543210Index 0x0A:Index 0x0B:CURSOR_START REGISTERCURSOR_END REGISTERNOTE: The skew capability works by delaying the cursors appearance for0, 1, 2, or 3 character-cells (i.e., shifting the cursor toward the right). WhenIs this useful? We couldnt find any examples. Recommend skew be zero.

  • Organization of the VRAMPage 0Page 1Page 2Page 3Page 4Page 5Page 6Page 7Base_Address = 0xB80004KB4KB4KB4KB4KB4KB4KB4KB

  • Changing the visual page7654321076543210START_ADDRESS_HISTART_ADDRESS_LOregister-index 0x0Cregister-index 0x0DProgramming example: # switches display to vram page 5

    # the word-offset for page 5 is 0x2800 (= 5 * 2048)mov$0x03D4, %dx# port-address in register DXmov$0x280C, %ax# value=0x28, register=0x0Cout%ax, %dx# write value to CRTC registermov$0x000D, %ax# value=0x00, register=0x0Dout%ax, %dx# write value to CRTC register

  • Moving the CRTs cursor7654321076543210CURSOR_LOCATION_HICURSOR_LOCATION_LOregister-index 0x0Eregister-index 0x0FProgramming example: // moves cursor to row 5, column 9, on page 0

    mov$0x03D4, %dx// port-address in register DXmov$5, %bx// row-numberimul$80, %bx// times cells-per-rowadd$9, %bx// plus column-numbermov%bh, %ah// cursor offsets MSBmov$0x0E, %al// CURSOR_HI indexout%ax, %dx// write value to CRTC registermov%bl, %ah// cursor offsets LSBmov$0x0F, %al// CURSOR_LO indexout%ax, %dx// write value to CRTC register

  • Scrolling the screenHeres a code-fragment that will scroll the contents of vram page 0 up by one line:

    mov$0xB800, %ax// address vram page 0 mov%ax, %ds// with DS register mov%ax, %es// also ES register mov$0, %di// destination is the top line mov$160, %si// source is one line lower cld// do forward copying mov$3840, %cx// 24 times 160 repmovsb// perform the copying mov$0x0720, %ax// blank character w/color mov $80, %cx// characters on bottom line repstosw// fill final line with blanks

  • Linux uses hardware scrollingThe value of the CRT START_ADDRESS is reprogrammed, to change the region of visible vram by one line (i.e., add #80)So instead of subdividing vram into eight 4KB pages, the entire 32KB vram is one continuous page, but only partially visibleTo scroll up by one line, Linux adds $80 to the value of the CRT_START_ADDRESS

  • The ROM-BIOS variablesSeveral variables in the ROM-BIOS DATA AREA are used by the VIDEO ROM-BIOS routines (i.e., int-0x10) to keep track of the current visisible page and of the positions of the cursors on each of the eight pagesThe locations of these variables are part of the IBM-PC BIOS standard, and as such they are widely documented

  • Standard data-addresses0x449 (byte) current video mode-number0x44A (word) number of columns on screen0x44C (word) current page-size (in bytes)0x44E (word) current page-address0x450 (byte array) cursor-positions (col,row)0x460 byte-pair) cursor type (END, START)0x462 (byte) current display page-number0x463 (word) CRTC base i/o port-address

  • Real-mode INT-0x10 servicesFunction 0x00: set_display_modeFunction 0x01: set_cursor_typeFunction 0x02: set_cursor_positionFunction 0x03: get_cursor_position_and_typeFunction 0x05: select_new_video_page Function 0x06: scroll_current_page_upFunction 0x07: scroll_current_page_downFunction 0x08: read_char_and_attrib_from_screenFunction 0x09: write_char_and_attrib_to_screenFunction 0x0A: write char_only_to_screenFunction 0x0E: write_teletype_to_active_pageFunction 0x0F: return_video_statusFunction 0x13: write_stringNOTE: These ROM-BIOS services are not available in protected-mode

  • Cursor-movement demoTo illustrate reprogramming of the six CRT controller registers, we wrote arrows.s It lets the user control the cursor position and visible page by using arrow-keysIt also changes the height of the cursor An unusual feature (not recommended) is its use of polled mode keyboard device-programming (instead of interrupt-driven)

  • Polling the status-registerThe keyboard controllers interrupt is maskedThe keyboard controllers status-register is read and reread in a tight loop until bit #0 gets set, indicating that a key was pressed (or released) and hence the output-buffer register is now fullSo then the output-buffer register is read by the CPU to get the keys scancodeFor the arrow-keys, the cursor will get movedOther keys are just ignored (except ESCAPE)

  • Disadvantage of pollingAlmost all of the CPUs time is consumed by continually reading the status-registerSo this would not be a good design to use in writing a multitasking operating system!On the other hand, for single-tasking it has the advantage of not requiring an Interrupt Service Routine to be written, so the demo code we write can be shorter and simpler

  • Another noteworthy featureThe arrows.s demo uses a jump-table to efficiently dispatch control to appropriate subroutines, based on a variables value This is a similar programming situation to using a switch statement in C/C++The jump-table avoids the long chain of compare-and-branch statements for all the various possible cases that can occur

  • In-Class exerciseTo insure your mastery of the jump-table concept, and cement your grasp of how the CRTC START_ADDRESS registers are programmed, try modifying the demo to incorporate these additional actions: when one of the function-keys F1-F7 is pressed, the display is switched to the correspondingly numbered display-page