Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;---------------------------------------------------;
- ;---------------------------------------------------;
- ; Name: NTSC_Interface.ASM ;
- ; Use: DTI's NTSC Video Interface ;
- ;---------------------------------------------------;
- ; Copyright: (C)2012 DTI ;
- ; Dysfunctional Technologies, Inc. ;
- ; All Rights Reserved ;
- ;---------------------------------------------------;
- ; Author: Timothy S. Carlson ;
- ; Dysfunctional Technologies, Inc. ;
- ; Date: December 30, 2012 ;
- ; Version: V1.00 ;
- ;---------------------------------------------------;
- ;---------------------------------------------------;
- ; WEBSITE: www.dysfunctionaltechnologies.com ;
- ; EMAIL: tscarlson@gmail.com ;
- ; ;
- ; You are welcome to use this code as you see fit, ;
- ; however - not to be used in for-profit products ;
- ; unless we have come to a monetary agreement. ;
- ; ;
- ; If this code is used, credit given is appreciated ;
- ;---------------------------------------------------;
- ;---------------------------------------------------;
- ; VERSION LOG: ;
- ; V1.00: Created ;
- ;---------------------------------------------------;
- ;---------------------------------------------------;
- ;---------------------------------------------------;
- ; Project Defines ;
- ;---------------------------------------------------;
- #DEFINE _NTSC_INTERFACE.ASM_ ;
- ;---------------------------------------------------;
- ;---------------------------------------------------;
- ; Includes ;
- ;---------------------------------------------------;
- ; This file has some common defines (TRUE, FALSE, ;
- ; etc.) used throughout the program. It also has the;
- ; CONFIGURATION_BITS settings for the PIC, which are;
- ; only processed in the module that has the define ;
- ; _MAIN_MODULE_. ;
- ;---------------------------------------------------;
- #INCLUDE Common.INC ;
- #INCLUDE NTSC_Interface.INC ;
- ;---------------------------------------------------;
- ;---------------------------------------------------;
- ; I've pushed the VIDEO_BUFFER to H'2030', since the;
- ; field has become smaller (32x48 vs 32x56). The ;
- ; required size of the VIDEO_BUFFER is also less, so;
- ; this will give up 32 more bytes of data memory for;
- ; use in game programming. ;
- ;---------------------------------------------------;
- ; We don't access the Video_BufferX arrays directly,;
- ; we use LINEAR PAGE memory through the FSR register;
- ; LINEAR PAGE memory groups the data memory at 0x20,;
- ; 0xA0, and Ox120 into a contiguous linear page. ;
- ; Note that the shared memory (at the top 16 bytes ;
- ; of each page) is NOT included in the LINEAR PAGE ;
- ; memory mapping. ;
- ;---------------------------------------------------;
- ; MEMORY MAP - LINEAR PAGE MEMORY - 240 bytes total ;
- ; 0x2000-0x204F - 0x020-0x06F 80 bytes ;
- ; 0x2050-0x20BF - 0x0A0-0x0EF 80 bytes ;
- ; 0x20A0-0x20EF - 0x120-0x16F 80 bytes ;
- ;---------------------------------------------------;
- ; Since out max lines (now) is 48, we need 48x8 ;
- ; (192) bytes of memory for the screen buffer. This ;
- ; leaves us with 48 bytes of data memory for program;
- ; variables, plus the 16 in shared memory for 64! ;
- ;---------------------------------------------------;
- ;NTSC_DATA_1 UDATA H'050' ;
- ;---------------------------------------------------;
- ;---------------------------------------------------;
- ;Video_Buffer1 res 32 ; 50-6F
- ;---------------------------------------------------;
- ;---------------------------------------------------;
- NTSC_DATA_2 UDATA H'0A0' ;
- ;---------------------------------------------------;
- Video_Buffer2 res 80 ; A0-EF
- ;---------------------------------------------------;
- ;---------------------------------------------------;
- NTSC_DATA_3 UDATA H'120' ;
- ;---------------------------------------------------;
- Video_Buffer3 res 80 ; 120-6F
- ;---------------------------------------------------;
- ;---------------------------------------------------;
- ;---------------------------------------------------;
- ;---------------------------------------------------;
- NTSC_DATA_S UDATA_SHR H'070' ;
- ;---------------------------------------------------;
- Video_Status res 1 ; 70
- VTemp res 1 ; 71
- Line_Count res 1 ; 72
- Repeat_Count res 1 ; 73
- Vid_Timing res 1 ; 74
- VSync_Count res 1 ; 75
- #IF (_AUDIO_ENABLED_ == TRUE) ;
- Audio_Count res 1 ; 76
- Audio_Reload res 1 ; 77
- Audio_Dur_HI res 1 ; 78
- Audio_Dur_LO res 1 ; 79
- #ENDIF ; (_AUDIO_ENABLED_ == TRUE) ;
- ;---------------------------------------------------;
- ;---------------------------------------------------;
- ;---------------------------------------------------;
- ;---------------------------------------------------;
- ; Interrupt Vector Code ;
- ;---------------------------------------------------;
- INT_VECT CODE H'004' ;
- ;---------------------------------------------------;
- _IV_Entry: ;
- ;-----------------------------------------------;
- ; Toggle the BLACK/SYNC bit ;
- ;-----------------------------------------------;
- MOVLW VIDEO_1 ;
- XORWF PORTA, F ;
- ;-----------------------------------------------;
- ;
- ;-----------------------------------------------;
- ; Load current timing into TMR0, load next ;
- ; timing into current timing. ;
- ;-----------------------------------------------;
- MOVFW Vid_Timing ;
- MOVWF TMR0 ;
- ;-----------------------------------------------;
- _IV_Exit: ;
- BCF INTCON, TMR0IF ;
- RETFIE ;
- ;---------------------------------------------------;
- ;---------------------------------------------------;
- ;---------------------------------------------------;
- ;---------------------------------------------------;
- NTSC_CODE CODE ;
- ;---------------------------------------------------;
- ;---------------------------------------------------;
- _NTSC_Initialize_Subsystem: ;
- ;---;-----------------------------------------------;
- ; Initialize Hardware ;
- ;-----------------------------------------------;
- ; - Oscillator - MUST BE 32MHZ ;
- ;-----------------------------------------------;
- _NIS_Init_Oscillator: ;
- BANKSEL OSCCON ;
- MOVLW B'11110000' ; 32Mhz
- MOVWF OSCCON ;
- ;
- BANKSEL OSCSTAT ; Wait for
- _NIS_IO_Wait: ;
- MOVFW OSCSTAT ; high speed
- ANDLW H'79' ; oscillator
- XORLW H'59' ; to be
- BTFSS STATUS, Z ; stable and
- GOTO _NIS_IO_Wait ; locked
- ;-----------------------------------------------;
- ;
- ;-----------------------------------------------;
- ; - GPIOs ;
- ;-----------------------------------------------;
- _NIS_Init_GPIOs: ;
- BANKSEL ANSELA ;
- BCF ANSELA, VIDEO_0_BIT ;
- BCF ANSELA, VIDEO_1_BIT ;
- ;
- BANKSEL LATA ;
- BCF LATA, VIDEO_0_BIT ;
- BCF LATA, VIDEO_1_BIT ;
- ;
- BANKSEL TRISA ;
- BCF TRISA, VIDEO_0_BIT ; Set as OUTPUT
- BCF TRISA, VIDEO_1_BIT ; Set as OUTPUT
- ;
- BANKSEL PORTA ;
- BCF PORTA, VIDEO_0_BIT ; Set LOW
- BCF PORTA, VIDEO_1_BIT ; Set LOW
- ;-----------------------------------------------;
- ;
- ;-----------------------------------------------;
- ; - Timer0 ;
- ;-----------------------------------------------;
- _NIS_Init_Timer0: ;
- BANKSEL OPTION_REG ;
- BCF OPTION_REG, NOT_WPUEN ;
- BCF OPTION_REG, TMR0CS ;
- BCF OPTION_REG, PSA ; prescaler to timer0
- BCF OPTION_REG, PS2 ;
- BCF OPTION_REG, PS1 ; 000 - 250ns
- BCF OPTION_REG, PS0 ;
- ;
- BANKSEL TMR0 ;
- MOVLW H'15' ;
- MOVWF TMR0 ;
- MOVWF Vid_Timing ;
- ;
- BANKSEL INTCON ;
- BCF INTCON, TMR0IF ;
- BSF INTCON, TMR0IE ;
- BSF INTCON, GIE ;
- ;-----------------------------------------------;
- ;
- ;-----------------------------------------------;
- ; - Memory ;
- ;-----------------------------------------------;
- _NIS_Init_Memory: ;
- BANKSEL MEMORY ;
- CLRF Video_Status ;
- BSF Video_Status, VERTICAL_SYNC_BIT ;
- BCF Video_Status, OE_FIELD_BIT ;
- #IF (_AUDIO_ENABLED_ == TRUE) ;
- BCF Video_Status, AUDIO_ENABLED_BIT ;
- MOVLW 0 ;
- MOVWF Audio_Count ;
- MOVWF Audio_Reload ;
- MOVLW H'FF' ;
- MOVWF Audio_Dur_LO ;
- MOVLW H'FF' ;
- MOVWF Audio_Dur_HI ;
- #ENDIF ; (_AUDIO_ENABLED_ == TRUE) ;
- ;-----------------------------------------------;
- ;
- ;-----------------------------------------------;
- ; - Video Buffer ;
- ;-----------------------------------------------;
- _NIS_Clear_Video: ;
- PAGESEL _NTSC_Clear_Screen ;
- CALL _NTSC_Clear_Screen ;
- PAGESEL $ ;
- ;-----------------------------------------------;
- ;
- _NIS_Exit: ;
- RETURN ;
- ;---------------------------------------------------;
- ;---------------------------------------------------;
- _NTSC_Video: ;
- ;---------------------------------------------------;
- ; VERTICAL SYNC PULSE Time ;
- ; This consists of 6 (or 7) blank half lines, 6 ;
- ; inverted half lines, and 6 (or 5) more blank ;
- ; half lines. This totals 9 64us lines ;
- ; --------------------------------------------- ;
- ; NOTE: Timing is CRITICAL for a nice, clean ;
- ; display. If you notice the top part of the ;
- ; display is skewed or "tearing", your timings ;
- ; are wrong and need to be adjusted. Make sure ;
- ; you haven't inadvertently dropped a half frame;
- ;-----------------------------------------------;
- _NV_Vertical_Sync: ;
- ;-----------------------------------------------;
- PAGESEL _NTSC_Vertical_Sync ;
- CALL _NTSC_Vertical_Sync ;
- PAGESEL $ ;
- ;-----------------------------------------------;
- ;
- ;-----------------------------------------------;
- _NV_Non_Display: ;
- ;-----------------------------------------------;
- ; These are in the NON-DISPLAY area. Lines 10-21;
- ;-----------------------------------------------;
- PAGESEL _NTSC_Blank_Line_10 ;
- CALL _NTSC_Blank_Line_10 ;
- PAGESEL _NTSC_Blank_Line_11 ;
- CALL _NTSC_Blank_Line_11 ;
- PAGESEL _NTSC_Blank_Line_12 ;
- CALL _NTSC_Blank_Line_12 ;
- PAGESEL _NTSC_Blank_Line_13 ;
- CALL _NTSC_Blank_Line_13 ;
- PAGESEL _NTSC_Blank_Line_14 ;
- CALL _NTSC_Blank_Line_14 ;
- PAGESEL _NTSC_Blank_Line_15 ;
- CALL _NTSC_Blank_Line_15 ;
- PAGESEL _NTSC_Blank_Line_16 ;
- CALL _NTSC_Blank_Line_16 ;
- PAGESEL _NTSC_Blank_Line_17 ;
- CALL _NTSC_Blank_Line_17 ;
- PAGESEL _NTSC_Blank_Line_18 ;
- CALL _NTSC_Blank_Line_18 ;
- PAGESEL _NTSC_Blank_Line_19 ;
- CALL _NTSC_Blank_Line_19 ;
- PAGESEL _NTSC_Blank_Line_20 ;
- CALL _NTSC_Blank_Line_20 ;
- PAGESEL _NTSC_Blank_Line_21 ;
- CALL _NTSC_Blank_Line_21 ;
- ;-----------------------------------------------;
- ;
- ;-----------------------------------------------;
- _NV_Pre_Blanking: ;
- ;-----------------------------------------------;
- PAGESEL _NTSC_Blank_Line_22 ;
- CALL _NTSC_Blank_Line_22 ;
- PAGESEL _NTSC_Blank_Line_23 ;
- CALL _NTSC_Blank_Line_23 ;
- PAGESEL _NTSC_Blank_Line_24 ;
- CALL _NTSC_Blank_Line_24 ;
- PAGESEL _NTSC_Blank_Line_25 ;
- CALL _NTSC_Blank_Line_25 ;
- PAGESEL _NTSC_Blank_Line_26 ;
- CALL _NTSC_Blank_Line_26 ;
- PAGESEL _NTSC_Blank_Line_27 ;
- CALL _NTSC_Blank_Line_27 ;
- PAGESEL _NTSC_Blank_Line_28 ;
- CALL _NTSC_Blank_Line_28 ;
- PAGESEL _NTSC_Blank_Line_29 ;
- CALL _NTSC_Blank_Line_29 ;
- PAGESEL _NTSC_Blank_Line_30 ;
- CALL _NTSC_Blank_Line_30 ;
- PAGESEL _NTSC_Blank_Line_31 ;
- CALL _NTSC_Blank_Line_31 ;
- PAGESEL _NTSC_Blank_Line_32 ;
- CALL _NTSC_Blank_Line_32 ;
- PAGESEL _NTSC_Blank_Line_33 ;
- CALL _NTSC_Blank_Line_33 ;
- PAGESEL _NTSC_Blank_Line_34 ;
- CALL _NTSC_Blank_Line_34 ;
- PAGESEL _NTSC_Blank_Line_35 ;
- CALL _NTSC_Blank_Line_35 ;
- PAGESEL _NTSC_Blank_Line_36 ;
- CALL _NTSC_Blank_Line_36 ;
- PAGESEL _NTSC_Blank_Line_37 ;
- CALL _NTSC_Blank_Line_37 ;
- PAGESEL _NTSC_Blank_Line_38 ;
- CALL _NTSC_Blank_Line_38 ;
- PAGESEL _NTSC_Blank_Line_39 ;
- CALL _NTSC_Blank_Line_39 ;
- PAGESEL _NTSC_Blank_Line_40 ;
- CALL _NTSC_Blank_Line_40 ;
- PAGESEL _NTSC_Blank_Line_41 ;
- CALL _NTSC_Blank_Line_41 ;
- PAGESEL _NTSC_Blank_Line_42 ;
- CALL _NTSC_Blank_Line_42 ;
- PAGESEL _NTSC_Blank_Line_43 ;
- CALL _NTSC_Blank_Line_43 ;
- PAGESEL _NTSC_Blank_Line_44 ;
- CALL _NTSC_Blank_Line_44 ;
- PAGESEL $ ;
- ;-----------------------------------------------;
- ;
- ;-----------------------------------------------;
- _NV_Video_Processing: ;
- ;-----------------------------------------------;
- ; 192 lines, fed by the VIDEO_BUFFER 45-236 ;
- ;-----------------------------------------------;
- PAGESEL _NTSC_Data_Lines ;
- CALL _NTSC_Data_Lines ;
- PAGESEL $ ;
- ;-----------------------------------------------;
- ;
- ;-----------------------------------------------;
- _NV_Post_Blanking: ;
- ;-----------------------------------------------;
- PAGESEL _NTSC_Blank_Line_237 ;
- CALL _NTSC_Blank_Line_237 ;
- PAGESEL _NTSC_Blank_Line_238 ;
- CALL _NTSC_Blank_Line_238 ;
- PAGESEL _NTSC_Blank_Line_239 ;
- CALL _NTSC_Blank_Line_239 ;
- PAGESEL _NTSC_Blank_Line_240 ;
- CALL _NTSC_Blank_Line_240 ;
- PAGESEL _NTSC_Blank_Line_241 ;
- CALL _NTSC_Blank_Line_241 ;
- PAGESEL _NTSC_Blank_Line_242 ;
- CALL _NTSC_Blank_Line_242 ;
- PAGESEL _NTSC_Blank_Line_243 ;
- CALL _NTSC_Blank_Line_243 ;
- PAGESEL _NTSC_Blank_Line_244 ;
- CALL _NTSC_Blank_Line_244 ;
- PAGESEL _NTSC_Blank_Line_245 ;
- CALL _NTSC_Blank_Line_245 ;
- PAGESEL _NTSC_Blank_Line_246 ;
- CALL _NTSC_Blank_Line_246 ;
- PAGESEL _NTSC_Blank_Line_247 ;
- CALL _NTSC_Blank_Line_247 ;
- PAGESEL _NTSC_Blank_Line_248 ;
- CALL _NTSC_Blank_Line_248 ;
- PAGESEL _NTSC_Blank_Line_249 ;
- CALL _NTSC_Blank_Line_249 ;
- PAGESEL _NTSC_Blank_Line_250 ;
- CALL _NTSC_Blank_Line_250 ;
- PAGESEL _NTSC_Blank_Line_251 ;
- CALL _NTSC_Blank_Line_251 ;
- PAGESEL _NTSC_Blank_Line_252 ;
- CALL _NTSC_Blank_Line_252 ;
- PAGESEL _NTSC_Blank_Line_253 ;
- CALL _NTSC_Blank_Line_253 ;
- PAGESEL _NTSC_Blank_Line_254 ;
- CALL _NTSC_Blank_Line_254 ;
- PAGESEL _NTSC_Blank_Line_255 ;
- CALL _NTSC_Blank_Line_255 ;
- PAGESEL _NTSC_Blank_Line_256 ;
- CALL _NTSC_Blank_Line_256 ;
- PAGESEL _NTSC_Blank_Line_257 ;
- CALL _NTSC_Blank_Line_257 ;
- PAGESEL _NTSC_Blank_Line_258 ;
- CALL _NTSC_Blank_Line_258 ;
- PAGESEL _NTSC_Blank_Line_259 ;
- CALL _NTSC_Blank_Line_259 ;
- PAGESEL _NTSC_Blank_Line_260 ;
- CALL _NTSC_Blank_Line_260 ;
- PAGESEL _NTSC_Blank_Line_261 ;
- CALL _NTSC_Blank_Line_261 ;
- PAGESEL _NTSC_Blank_Line_262 ;
- CALL _NTSC_Blank_Line_262 ;
- PAGESEL $ ;
- ;-----------------------------------------------;
- ;
- GOTO _NTSC_Video ;
- ;---------------------------------------------------;
- ;---------------------------------------------------;
- _NTSC_Vertical_Sync: ;
- ;---------------------------------------------------;
- ;-----------------------------------------------;
- ; Set the VERTICAL_SYNC flag, to keep audio from;
- ; playing during this time and possibly ;
- ; disrupting the video timing ;
- ;-----------------------------------------------;
- BSF Video_Status, VERTICAL_SYNC_BIT ;
- ;-----------------------------------------------;
- ; Increment the vertical sync count. This is ;
- ; used as a timer by the BANNER routines ;
- ;-----------------------------------------------;
- INCF VSync_Count, F ;
- ;-----------------------------------------------;
- ;
- ;-----------------------------------------------;
- ; Odd or Even field? ;
- ;-----------------------------------------------;
- BTFSC Video_Status, OE_FIELD_BIT ;
- GOTO _NVS_Pre_Equalizing_EVEN ;
- ;-----------------------------------------------;
- ;
- _NVS_Pre_Equalizing_ODD: ;
- ;-----------------------------------------------;
- ; THESE 6 30us pulse are the beginning of the ;
- ; ODD FIELD VERTICAL SYNC. The previous ;
- ; 4us_SYNC_60us_LINE was LINE #262 of the EVEN ;
- ; FIELD. Together the 1st two 2us_SYNC_30us_LINE;
- ; are LINE #1 of the ODD FIELD ;
- ;-----------------------------------------------;
- PAGESEL _BLACK_2us_SYNC_30us_LINE ;
- CALL _BLACK_2us_SYNC_30us_LINE ;
- DEBUG_VSYNC_PULSE ;
- CALL _BLACK_2us_SYNC_30us_LINE ;
- CALL _BLACK_2us_SYNC_30us_LINE ;
- CALL _BLACK_2us_SYNC_30us_LINE ;
- CALL _BLACK_2us_SYNC_30us_LINE ;
- CALL _BLACK_2us_SYNC_30us_LINE ;
- PAGESEL $ ;
- ;-----------------------------------------------;
- GOTO _NVS_Vertical_Syncronism ;
- ;-----------------------------------------------;
- ;
- _NVS_Pre_Equalizing_EVEN: ;
- ;-----------------------------------------------;
- ; The following two 30US lines are considered to;
- ; be one LINE from the previous (ODD) FIELD. ;
- ; Together they are LINE #263 of the ODD FIELD ;
- ;-----------------------------------------------;
- PAGESEL _BLACK_4us_SYNC_30us_LINE ;
- CALL _BLACK_4us_SYNC_30us_LINE ;
- PAGESEL _BLACK_2us_SYNC_30us_LINE ;
- CALL _BLACK_2us_SYNC_30us_LINE ;
- PAGESEL $ ;
- ;-----------------------------------------------;
- ; These 5 30us pulse are the beginning of the ;
- ; EVEN FIELD VERTICAL SYNC. Together the 1st two;
- ; 2us_SYNC_30us_LINEs are LINE #1 of the EVEN ;
- ; FIELD. ;
- ;-----------------------------------------------;
- PAGESEL _BLACK_2us_SYNC_30us_LINE ;
- CALL _BLACK_2us_SYNC_30us_LINE ;
- DEBUG_VSYNC_PULSE ;
- CALL _BLACK_2us_SYNC_30us_LINE ;
- CALL _BLACK_2us_SYNC_30us_LINE ;
- CALL _BLACK_2us_SYNC_30us_LINE ;
- CALL _BLACK_2us_SYNC_30us_LINE ;
- PAGESEL $ ;
- ;-----------------------------------------------;
- ;
- _NVS_Vertical_Syncronism: ;
- ;-----------------------------------------------;
- ; 5 inverted 30us lines w/ 4us syncs ;
- ; Standard for both ODD and EVEN FIELDS ;
- ;-----------------------------------------------;
- PAGESEL _INVERTED_30us_SYNC_4us_LINE ;
- CALL _INVERTED_30us_SYNC_4us_LINE ;
- CALL _INVERTED_30us_SYNC_4us_LINE ;
- CALL _INVERTED_30us_SYNC_4us_LINE ;
- CALL _INVERTED_30us_SYNC_4us_LINE ;
- CALL _INVERTED_30us_SYNC_4us_LINE ;
- CALL _INVERTED_30us_SYNC_4us_LINE ;
- PAGESEL $ ;
- ;-----------------------------------------------;
- ;
- ;-----------------------------------------------;
- BTFSC Video_Status, OE_FIELD_BIT ;
- GOTO _NVS_Post_Equalizing_EVEN ;
- ;-----------------------------------------------;
- ;
- _NVS_Post_Equalizing_ODD: ;
- ;-----------------------------------------------;
- PAGESEL _BLACK_2us_SYNC_30us_LINE ;
- CALL _BLACK_2us_SYNC_30us_LINE ;
- CALL _BLACK_2us_SYNC_30us_LINE ;
- CALL _BLACK_2us_SYNC_30us_LINE ;
- CALL _BLACK_2us_SYNC_30us_LINE ;
- CALL _BLACK_2us_SYNC_30us_LINE ;
- CALL _BLACK_2us_SYNC_30us_LINE ;
- PAGESEL $ ;
- ;-----------------------------------------------;
- ; This is the END of the ODD FIELD VERTICAL SYNC;
- ; The next 4us_SYNC_60us_LINE is LINE #10 ;
- ;-----------------------------------------------;
- GOTO _NVS_Exit ;
- ;-----------------------------------------------;
- ;
- _NVS_Post_Equalizing_EVEN: ;
- ;-----------------------------------------------;
- PAGESEL _BLACK_2us_SYNC_30us_LINE ;
- CALL _BLACK_2us_SYNC_30us_LINE ;
- CALL _BLACK_2us_SYNC_30us_LINE ;
- CALL _BLACK_2us_SYNC_30us_LINE ;
- CALL _BLACK_2us_SYNC_30us_LINE ;
- CALL _BLACK_2us_SYNC_30us_LINE ;
- ;-----------------------------------------------;
- ; The following 2us_SYNC_60us_LINE is part of ;
- ; VERTICAL SYNC. It is LINE #9 off the EVEN ;
- ; FIELD. The next 4us_SYNC_60us_LINE is LINE #10;
- ;-----------------------------------------------;
- PAGESEL _BLACK_2us_SYNC_60us_LINE ;
- CALL _BLACK_2us_SYNC_60us_LINE ;
- PAGESEL $ ;
- ;-----------------------------------------------;
- ;
- _NVS_Exit: ;
- ;-----------------------------------------------;
- ; Toggle the OE_FIELD flag ;
- ;-----------------------------------------------;
- MOVLW OE_FIELD ;
- XORWF Video_Status, F ;
- ;-----------------------------------------------;
- ;
- ;-----------------------------------------------;
- ; Clear the VERTICAL_SYNC flag, so that audio ;
- ; can continue playing ;
- ;-----------------------------------------------;
- BCF Video_Status, VERTICAL_SYNC_BIT ;
- ;-----------------------------------------------;
- ;
- RETURN ;
- ;---------------------------------------------------;
- ;---------------------------------------------------;
- _NTSC_Data_Lines: ;
- ;---------------------------------------------------;
- ; Note: This will generate 192 60us data lines with ;
- ; data from the VIDEO buffer. Each lines is repeated;
- ; 4 times, so the video_buffer is 48x32 bits in size;
- ; or 48x4 bytes, or 192 bytes total ;
- ;---------------------------------------------------;
- ; Set up of video buffer pointer and line count ;
- ;-----------------------------------------------;
- MOVLW LOW VIDEO_BUFFER_START ;
- MOVWF FSR1L ;
- MOVLW HIGH VIDEO_BUFFER_START ;
- MOVWF FSR1H ;
- ;
- MOVLW NUM_LINES ;
- MOVWF Line_Count ;
- ;-----------------------------------------------;
- ;
- ;-----------------------------------------------;
- ; We repeat each line 4 times, since we don't ;
- ; have a big enough video buffer for 192 lines ;
- ;-----------------------------------------------;
- _NDL_Next_Line: ;
- MOVLW 4 ;
- MOVWF Repeat_Count ;
- _NDL_Repeat_Line: ;
- MOVLW H'FC' ;
- ANDWF FSR1L, F ;
- ;-----------------------------------------------;
- ;
- ;-----------------------------------------------;
- ; 60us Line Generation ;
- ;-----------------------------------------------;
- PAGESEL _BLACK_4us_SYNC_60us_LINE_BPorch ;
- CALL _BLACK_4us_SYNC_60us_LINE_BPorch ;
- PAGESEL $ ;
- VDELAY 6 ;
- ;-----------------------------------------------;
- ;
- ;-----------------------------------------------;
- ; This is where the 32 bits of data are actually;
- ; send out over the video signal ;
- ;-----------------------------------------------;
- DO_BIT 7, 6 ;
- DO_BIT 6, 6 ;
- DO_BIT 5, 6 ;
- DO_BIT 4, 6 ;
- DO_BIT 3, 6 ;
- DO_BIT 2, 6 ;
- DO_BIT 1, 6 ;
- DO_BIT 0, 5 ;
- ;-----------------------------------------------;
- DO_BIT 7, 6 ;
- DO_BIT 6, 6 ;
- DO_BIT 5, 6 ;
- DO_BIT 4, 6 ;
- DO_BIT 3, 6 ;
- DO_BIT 2, 6 ;
- DO_BIT 1, 6 ;
- DO_BIT 0, 5 ;
- ;-----------------------------------------------;
- DO_BIT 7, 6 ;
- DO_BIT 6, 6 ;
- DO_BIT 5, 6 ;
- DO_BIT 4, 6 ;
- DO_BIT 3, 6 ;
- DO_BIT 2, 6 ;
- DO_BIT 1, 6 ;
- DO_BIT 0, 5 ;
- ;-----------------------------------------------;
- DO_BIT 7, 6 ;
- DO_BIT 6, 6 ;
- DO_BIT 5, 6 ;
- DO_BIT 4, 6 ;
- DO_BIT 3, 6 ;
- DO_BIT 2, 6 ;
- DO_BIT 1, 6 ;
- DO_BIT 0, 5 ;
- ;-----------------------------------------------;
- ;
- ;-----------------------------------------------;
- ; Back porch - between this and the front porch,;
- ; this 'frames' the video on your TV (hopefully);
- ; --------------------------------------------- ;
- ; NOTE: this VDELAY and NOPs fleshes out the ;
- ; data line to 60us ;
- ;-----------------------------------------------;
- VDELAY 1 ;
- BCF PORTA, VIDEO_0_BIT ;
- ;-----------------------------------------------;
- ;
- ADDFSR FSR1, -4 ;
- DECFSZ Repeat_Count, F ;
- GOTO _NDL_Repeat_Line ;
- ;
- ;-----------------------------------------------;
- ; 192 lines of information to transmit ;
- ; so the screen size is 32x192. But we transmit ;
- ; each line 4 times, so it's actually 32x48 ;
- ;-----------------------------------------------;
- _NDL_Next_Data: ;
- ;-----------------------------------------------;
- ADDFSR FSR1, 4 ;
- DECFSZ Line_Count, F ;
- GOTO _NDL_Next_Line ;
- ;
- RETURN ;
- ;---------------------------------------------------;
- ;---------------------------------------------------;
- _BLACK_2us_SYNC_30us_LINE: ;
- ;---------------------------------------------------;
- START_TIMING SIG_2US, 0 ;
- START_TIMING SIG_30US, 1 ;
- RETURN ;
- ;---------------------------------------------------;
- ;---------------------------------------------------;
- _BLACK_4us_SYNC_30us_LINE: ;
- ;---------------------------------------------------;
- START_TIMING SIG_4US, 0 ;
- START_TIMING SIG_30US, 1 ;
- RETURN ;
- ;---------------------------------------------------;
- ;---------------------------------------------------;
- _INVERTED_30us_SYNC_4us_LINE: ;
- ;---------------------------------------------------;
- START_TIMING SIG_30US, 0 ;
- START_TIMING SIG_4US, 1 ;
- RETURN ;
- ;---------------------------------------------------;
- ;---------------------------------------------------;
- _BLACK_2us_SYNC_60us_LINE: ;
- ;---------------------------------------------------;
- START_TIMING SIG_2US, 0 ;
- START_TIMING SIG_60US, 1 ;
- RETURN ;
- ;---------------------------------------------------;
- ;---------------------------------------------------;
- _BLACK_4us_SYNC_60us_LINE: ;
- ;---------------------------------------------------;
- START_TIMING SIG_4US, 0 ;
- START_TIMING SIG_60US, 1 ;
- RETURN ;
- ;---------------------------------------------------;
- ;---------------------------------------------------;
- _BLACK_4us_SYNC_60us_LINE_BPorch: ;
- ;---------------------------------------------------;
- START_TIMING SIG_4US, 0 ;
- START_TIMING SIG_60US, 1 ;
- ; VDELAY 11 ; 9 ;
- VDELAY 5 ;
- NOP ;
- RETURN ;
- ;---------------------------------------------------;
- ;---------------------------------------------------;
- _WHITE_4us_SYNC_60us_LINE: ;
- ;---------------------------------------------------;
- START_TIMING SIG_4US, 0 ;
- START_TIMING SIG_60US, 1 ;
- BCF PORTA, VIDEO_0_BIT ;
- ; VDELAY 13 ;
- VDELAY 7 ;
- NOP ;
- NOP ;
- BSF PORTA, VIDEO_0_BIT ;
- VDELAY 129 ;
- NOP ;
- NOP ;
- BCF PORTA, VIDEO_0_BIT ;
- RETURN ;
- ;---------------------------------------------------;
- ;---------------------------------------------------;
- _NTSC_Clear_Screen: ;
- ;---------------------------------------------------;
- ;-----------------------------------------------;
- ; Set up the pointer to the video buffer ;
- ;-----------------------------------------------;
- MOVLW HIGH VIDEO_BUFFER_START ;
- MOVWF FSR1H ;
- MOVLW LOW VIDEO_BUFFER_START ;
- MOVWF FSR1L ;
- ;-----------------------------------------------;
- ;
- ;-----------------------------------------------;
- ; Set up the number of bytes to transfer ;
- ;-----------------------------------------------;
- MOVLW (NUM_LINES * 4) - 16 ;
- ADDWF FSR1L, F ;
- BTFSC STATUS, C ;
- INCF FSR1H, F ;
- ;-----------------------------------------------;
- ;
- ;-----------------------------------------------;
- ; Clear the data in the video buffer, 16 bytes ;
- ; at a time. Doing it in groups of 16 in a loop,;
- ; instead of 1 byte at a time in a loop, speeds ;
- ; up the transfer as it cuts out a lot of the ;
- ; instruction cycles for the looping mechanism. ;
- ;-----------------------------------------------;
- CLRW ;
- _NCS_Next_16_Bytes: ;
- MOVWI 0[INDF1] ;
- MOVWI 1[INDF1] ;
- MOVWI 2[INDF1] ;
- MOVWI 3[INDF1] ;
- MOVWI 4[INDF1] ;
- MOVWI 5[INDF1] ;
- MOVWI 6[INDF1] ;
- MOVWI 7[INDF1] ;
- MOVWI 8[INDF1] ;
- MOVWI 9[INDF1] ;
- MOVWI 10[INDF1] ;
- MOVWI 11[INDF1] ;
- MOVWI 12[INDF1] ;
- MOVWI 13[INDF1] ;
- MOVWI 14[INDF1] ;
- MOVWI 15[INDF1] ;
- ADDFSR FSR1, -16 ;
- MOVLW H'30' ;
- XORWF FSR1L, W ;
- BTFSS STATUS, Z ;
- GOTO _NCS_Next_16_Bytes ;
- ;-----------------------------------------------;
- ;
- RETURN ;
- ;---------------------------------------------------;
- ;---------------------------------------------------;
- ;---------------------------------------------------;
- END ;
- ;---------------------------------------------------;
- ;---------------------------------------------------;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement