.PAGE .SBTTL MC6845 CRT CONTROLLER (CRTC) .NLIST ; PORT HANDLER NAMING CONVENTION ; ; _ IS DEVICE UNIT LETTER ; NNNN IS DEVICE CODE ; **** IS ANY ALPHA/NUMERIC SEQUENCE ; ; ; _$NNNN - UNIT DEFINED ; _.NNNN - DEVICE ADDRESS ; ; ; $_NNNN - UNIT DEFINITION MACRO'S OR ; NON-INLINE CODE ; ; _NNNN$ - COMMON SUBROUTINE ENTRY POINTS REQUIRING ; X,Y,U, OR D TO BE SPECIFIED ; BEFORE ENTRY ; ; _NNNNI - COMMON INTERRUPT ENTRY POINTS REQUIRING ; X,Y,U, OR D TO BE SPECIFIED ; BEFORE ENTRY ; ; .INNNN - IN-LINE INITIALIZATION MACRO CALLS REQUIRING ; X,Y,U, OR D TO BE SPECIFIED ; BEFORE ENTRY ; ; _.**** - OLDER HANDLERS USED THIS FORMAT FOR INTERNAL ; LABELS AND ENTRY POINTS. THIS FORM SHOULD ; NOT BE USED FOR NEW HANDLERS. ; .LIST ; ; THE MC6845 CRTC IS PROGRAMMED THROUGH 2 REGISTER ADDRESSES ; ; ADDRESS A.6845+0 = REGISTER SELECT REGISTER ; ADDRESS A.6845+1 = SPECIFIED CONTROL REGISTER ; ; R0 - HORIZONTAL TOTAL REGISTER ; <7:0> - HORIZONTAL SYNC (HS) FREQUENCY IS ; DETERMINED BY THE CHARACTER TIMES PER LINE ; PROGRAMMED AS DISPLAYED + NON-DISPLAYED - 1 ; R1 - HORIZONTAL DISPLAYED REGISTER ; <7:0> - # OF DISPLAYED CHARACTERS PER LINE ; R2 - HORIZONTAL SYNC POSITION ; <7:0> - POSITION OF HS PULSE RELATIVE ; TO THE FIRST DISPLAYED CHARACTER ; R3 - SYNC WIDTH REGISTER ; <3:0> - HS PULSE WIDTH IN CHARACTER TIMES ; VERTICAL SYNC IS 16 SCAN-LINE TIMES ; ; NOTE THAT R1+R2+R3 < R0 ; ; ; R4 - VERTICAL TOTAL REGISTER ; R5 - VERTICAL TOTAL ADJUST REGISTER ; R4<6:0> - INTEGER NUMBER OF CHARACTER ; LINE TIMES - 1 ; R5<4:0> - FRACTION CHARACTER LINE TIMES ; VERTICAL SYNC PERIOD IS R5+(R4+1)*(R9+1) LINES ; ; R6 - VERTICAL DISPLAY REGISTER ; <6:0> - # OF DISPLAYED CHARACTER ROWS ; R7 - VERTICAL SYNC (VS) POSITION ; <6:0> - CHARACTER LINE TIMES - 1 ; ; R8 - INTERLACE MODE REGISTER ; <1:0> - INTERLACE MODE ; 0 0 - NORMAL SYNC MODE (NON-INTERLAC) ; 1 0 - " " " " ; 0 1 - INTERLACE SYNC MODE ; 1 1 - INTERLACE SYNC AND VIDEO MODE ; RESTRICTIONS FOR INTERLACE OPERATION ; R0 MUST BE ODD ; ADDITIONAL RESTRICTIONS FOR SYNC AND VIDEO INTERLACE ; R6 MUST BE EVEN ; AND MUST BE 1/2 THE NUMBER REQUIRED ; R7 MUST BE 1/2 NORMAL VALUE ; R9 MUST BE ODD ; R10 AND R11 MUST BOTH BE EVEN/ODD ; .PAGE ; R9 - MAXIMUM SCAN LINE ADDRESS REGISTER ; <4:0> - # OF SCAN LINES PER CHARACTER -1 ; ; R10 - CURSOR START ADDRESS ; R11 - CURSOR END ADDRESS ; R10<4:0> - FIRST CURSOR ROW DISPLAYED ; R11<4:0> - LAST CURSOR ROW DISPLAYED ; R10<6:5> - CURSOR BLINK CONTROL ; 0 0 - NON BLINK ; 0 1 - CURSOR NON-DISPLAY ; 1 0 - BLINK, 1/16 FIELD RATE ; 1 1 - BLINK, 1/32 FIELD RATE ; ; R12 - START ADDRESS REGISTER ; R13 - START ADDRESS REGISTER ; /<5:0>:<7:0> - 14 BIT ADDRESS REGISTER ; FOR THE BEGINNING OF THE CHARACTER DATA ; ; R14 - CURSOR REGISTER ; R15 - CORSOR REGISTER ; /<5:0>:<7:0> - 14 BIT ADDRESS REGISTER ; FOR THE CURSOR POSITION ; ; R16 - LIGHT PEN REGISTER ; R17 - LIGHT PEN REGISTER ; /<5:0>:<7:0> - 14 BIT LIGHT PEN ; HIT REGISTER ; ; ; MC6845 ROUTINES ARE ENTERED VIA A JSR XXX ; ; WITH X = PORT ADDRESS ; AND Y = INIT TABLE ADDRESS ; JSR I6845$ ;INITIALIZE CRTC PARAMTERS ; ; WITH X = PORT ADDRESS ; AND D = READ/WRITE DATA ; JSR S6845$ ;SET BEGINNING OF DISPLAY ; JSR R6845$ ;READ CURSOR POSITION ; JSR W6845$ ;WRITE NEW CURSOR POSITION ; JSR L6845$ ;READ LIGHT PEN REGISTER ; .PAGE .SBTTL CHECKOUT DEFINITIONS ; .IF NDF,A$6845 ;USE THESE IF TESTING A.6845=100 VARSAV=0 PGMSAV=100000 .=PGMSAV .ENDC ; .PAGE .SBTTL MC6845 SETUP ROUTINE ; ; THE MC6845 CRT CONTROLLER SETTUP IS SPECIFIED BY AN ; EXTERNAL DATA TABLE CONFIGURED AS FOLLOWS: ; ; BYTE 0 - HORIZONTAL TOTAL ; BYTE 1 - HORIZONTAL DISPLAYED ; BYTE 2 - HORIZONTAL SYNC POSITION ; BYTE 3 - HORIZONTAL SYNC WIDTH ; ; BYTE 4 - VERTICAL TOTAL ; BYTE 5 - VERTICAL TOTAL ADJUST ; BYTE 6 - VERTICAL DISPLAYED ; BYTE 7 - VERTICAL SYNC POSITION ; ; BYTE 8 - INTERLACE MODE ; BYTE 9 - MAXIMUM SCAN LINE ; BYTE 10 - CURSOR START ; BYTE 11 - CURSOR END ; ; BYTES 12 & 13 - START ADDRESS ; ; BYTES 14 & 15 - CURSOR ADDRESS ; ; ENTER SETUP ROUTINE WITH ; X = PORT ADDRESS ; Y = DATA TABLE ADDRESS I6845$: CLRA ;SET COUNTER 1$: LDB Y+ ;GET DATA STA 0,X ;SET ACCESS REGISTER STB 1,X ;LOAD SETUP DATA INCA ;UPDATE REGISTER # CMPA #,16. ;FINISHED ? BNE 1$ ;LOOP UNTIL ALL LOADED RTS ;FINISHED .PAGE .SBTTL SPECIAL CRTC REGISTER ACCESS ; X = PORT ADDRESS ; D = DATA OR RESULT ; ; WRITE CRTC START ADDRESS S6845$: PSHS B ;SAVE B LDB #,12. ;START ADDRESS STB 0,X ;SET ACCESS STA 1,X ;STORE START ADDRESS INCB STB 0,X ;SET ACCESS PULS B ;GET DATA STB 1,X ;STORE START ADDRESS RTS ; READ CURSOR VALUE R6845$: LDB #,14. ;CURSOR STB 0,X ;SET ACCESS LDA 1,X ;GET CURSOR INCB STB 0,X ;SET ACCESS LDB 1,X ;GET CURSOR RTS ; WRITE CURSOR VALUE W6845$: PSHS B ;SAVE B LDB #,14. ;CURSOR STB 0,X ;SET ACCESS STA 1,X ;STORE CURSOR INCB STB 0,X ;SET ACCESS PULS B ;GET DATA STB 1,X ;STORE CURSOR RTS ; READ LIGHT PEN REGISTER L6845$: LDB #,16. ;LIGHT PEN STB 0,X ;SET ACCESS LDA 1,X ;GET LIGHT PEN INCB STB 0,X ;SET ACCESS LDB 1,X ;GET LIGHT PEN RTS .IIF NDF,A$6845 .END