Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;---------------------------------------------------;
- ; Name: NTSC_Interface.INC ;
- ; Use: NTSC Interface Include File ;
- ;---------------------------------------------------;
- ; Copyright: (C) 2012 DTI ;
- ; Dysfunctional Technologies, Inc. ;
- ; All Rights Reserved ;
- ;---------------------------------------------------;
- ; Author: Timothy S. Carlson ;
- ; Dysfunctional Technologies, Inc. ;
- ; Date: December 30, 2012 ;
- ; Version: V1.00 ;
- ;---------------------------------------------------;
- ; Description: Equates, Defines, Global / External ;
- ; Support for NTSC_Interface.ASM ;
- ;---------------------------------------------------;
- ; Code is specific to the PIC12F1840! ;
- ;---------------------------------------------------;
- #DEFINE _DEBUG_VSYNC_ TRUE ;
- #DEFINE _AUDIO_ENABLED_ TRUE ;
- ;---------------------------------------------------;
- ;---------------------------------------------------;
- ; Macros ;
- ;---------------------------------------------------;
- VDELAY MACRO DTIME ;
- ;-----------------------------------------------;
- ; The time munger used EVERYWHERE ;
- ;-----------------------------------------------;
- MOVLW DTIME ;
- MOVWF VTemp ;
- DECFSZ VTemp, F ;
- GOTO $-1 ;
- ;-----------------------------------------------;
- ENDM ;
- ;
- ;-----------------------------------------------;
- DO_BIT MACRO THISBIT, NOPS ;
- ;-----------------------------------------------;
- ; Sets the DAC either WHITE or BLACK ;
- ; Does a specified delay in NOPs ;
- ;-----------------------------------------------;
- MOVFW PORTA ;
- ANDLW ~VIDEO_0 ;
- BTFSC INDF1, THISBIT ;
- IORLW VIDEO_0 ;
- MOVWF PORTA ;
- #IF (THISBIT == 0) ;
- ADDFSR FSR1, 1 ;
- #ENDIF ;
- #IF NOPS > 0 ;
- NOP ;
- #ENDIF ;
- #IF NOPS > 1 ;
- NOP ;
- #ENDIF ;
- #IF NOPS > 2 ;
- NOP ;
- #ENDIF ;
- #IF NOPS > 3 ;
- NOP ;
- #ENDIF ;
- #IF NOPS > 4 ;
- NOP ;
- #ENDIF ;
- #IF NOPS > 5 ;
- NOP ;
- #ENDIF ;
- #IF NOPS > 6 ;
- NOP ;
- #ENDIF ;
- #IF NOPS > 7 ;
- NOP ;
- #ENDIF ;
- #IF NOPS > 8 ;
- NOP ;
- #ENDIF ;
- #IF NOPS > 9 ;
- NOP ;
- #ENDIF ;
- ;-----------------------------------------------;
- ENDM ;
- ;
- ;-----------------------------------------------;
- SET_DAC2BIT MACRO COLOR ;
- ;-----------------------------------------------;
- ; Sets the 2bit DAC to the desired color ;
- ; Both bits are done at once, or else some weird;
- ; transitions on the DAC can be seen. Okay if ;
- ; just colors (WHITE, GRAY, BLACK), but if a ;
- ; sync pulse shows up out context, it can really;
- ; mess up the video timings ;
- ;-----------------------------------------------;
- MOVFW PORTA ;
- ANDLW ~(VIDEO_0 | VIDEO_1) ;
- IORLW COLOR ;
- MOVWF PORTA ;
- ;-----------------------------------------------;
- ENDM ;
- ;
- ;-----------------------------------------------;
- #DEFINE SIG_2US 2 ;
- #DEFINE SIG_4US 4 ;
- #DEFINE SIG_30US 30 ;
- #DEFINE SIG_60US 60 ;
- ;-----------------------------------------------;
- ;
- ;-----------------------------------------------;
- START_TIMING MACRO SIG_LEN, VID_STATE ;
- ;-----------------------------------------------;
- #IF (SIG_LEN == SIG_2US) ;
- MOVLW ~((SIG_LEN * 2) + 2) ;
- #ENDIF ;
- #IF (SIG_LEN == SIG_4US) ;
- MOVLW ~((SIG_LEN * 4) - 3) ;
- #ENDIF ;
- #IF (SIG_LEN == SIG_30US) ;
- MOVLW ~((SIG_LEN * 4) - 11) ;
- #ENDIF ;
- #IF (SIG_LEN == SIG_60US) ;
- MOVLW ~((SIG_LEN * 4) - 9) ;
- #ENDIF ;
- MOVWF Vid_Timing ;
- ;
- #IF (VID_STATE == 0) ;
- BTFSC PORTA, VIDEO_1_BIT ;
- #ELSE ;
- BTFSS PORTA, VIDEO_1_BIT ;
- #ENDIF ;
- GOTO $-1 ;
- #IF (SIG_LEN == SIG_60US) ;
- AUDIO_PROC ;
- #ENDIF ;
- ;-----------------------------------------------;
- ENDM ;
- ;
- ;-----------------------------------------------;
- DEBUG_VSYNC_PULSE MACRO ;
- ;-----------------------------------------------;
- ; If _DEBUG_VSYNC_ is enabled, it will produce a;
- ; pulse on the GPIO2 pin for debugging purposes.;
- ; This pulse is mainly to measure the time (in ;
- ; ms) and frequency of a single video frame. ;
- ;-----------------------------------------------;
- #IF _DEBUG_VSYNC_ ;
- BANKSEL TRISA ;
- BCF TRISA, 2 ;
- BANKSEL PORTA ;
- BCF PORTA, 2 ;
- NOP ;
- BSF PORTA, 2 ;
- BANKSEL TRISA ;
- BSF TRISA, 2 ;
- BANKSEL MEMORY ;
- #ENDIF ; _DEBUG_VSYNC_ ;
- ;-----------------------------------------------;
- ENDM ;
- ;
- ;-----------------------------------------------;
- AUDIO_PROC MACRO ;
- ;-----------------------------------------------;
- ; This handles the sound generation. Sounds are ;
- ; produced by toggling GPIO1 at the BEGINNING of;
- ; each 60us line during the BACK PORCH/BLANKING ;
- ; time. If it is toggled during ALL 60us lines, ;
- ; you get a high frequency (around 7800hz). If ;
- ; every other 60us line, the frequency is lower.;
- ; This procedure is NOT run during VERTICAL SYNC;
- ; time to keep AUDIO from altering the timings ;
- ; of the video, causing distortions of the image;
- ; on the screen. In order to keep the video ;
- ; timings the same, no matter what path is taken;
- ; in the audio code, NOPs are padded so that ;
- ; each path takes the same number of cycles. ;
- ;-----------------------------------------------;
- #IF (_AUDIO_ENABLED_ == TRUE) ;
- BTFSC Video_Status, VERTICAL_SYNC_BIT ;
- GOTO $+16 ;
- BTFSS Video_Status, AUDIO_ENABLED_BIT ;
- GOTO $+16 ;
- DECFSZ Audio_Count, F ;
- GOTO $+16 ;
- MOVFW Audio_Reload ;
- MOVWF Audio_Count ;
- MOVLW AUDIO ;
- XORWF PORTA, F ;
- DECFSZ Audio_Dur_LO, F ;
- GOTO $+16 ;
- DECFSZ Audio_Dur_HI, F ;
- GOTO $+16 ;
- BCF Video_Status, AUDIO_ENABLED_BIT ;
- BSF PORTA, AUDIO_BIT ;
- GOTO $+16 ;
- NOP ;
- NOP ;
- NOP ;
- NOP ;
- NOP ;
- NOP ;
- NOP ;
- NOP ;
- NOP ;
- NOP ;
- NOP ;
- NOP ;
- NOP ;
- NOP ;
- NOP ;
- #ELSE ;
- NOP ;
- NOP ;
- NOP ;
- NOP ;
- NOP ;
- NOP ;
- NOP ;
- NOP ;
- NOP ;
- NOP ;
- NOP ;
- NOP ;
- NOP ;
- NOP ;
- NOP ;
- NOP ;
- NOP ;
- #ENDIF ; (_AUDIO_ENABLED_ == TRUE) ;
- ;-----------------------------------------------;
- ENDM ;
- ;
- ;-----------------------------------------------;
- PLAY_SOUND MACRO FREQUENCY, DURATION ;
- ;-----------------------------------------------;
- ; This will play a sound of a specified ;
- ; frequency for a specified duration ;
- ; The lower the frequency number, the higher ;
- ; the frequency. Duration is also a function ;
- ; of the frequency number, so if frequency goes ;
- ; up, adjust the duration down. ;
- ;-----------------------------------------------;
- ; NOTE that a FREQUENCY of 0 is treated as a ;
- ; frequency of 256. 0<=Freq<=255. The count is ;
- ; decremented BEFORE it is checked to be 0, so ;
- ; starting with 0 will dec, see 255, continue ;
- ; loop. Just so you are warned. ;
- ;-----------------------------------------------;
- #IF (_AUDIO_ENABLED_ == TRUE) ;
- MOVLW FREQUENCY ;
- MOVWF Audio_Count ;
- MOVWF Audio_Reload ;
- MOVLW LOW DURATION ;
- MOVWF Audio_Dur_LO ;
- MOVLW HIGH DURATION ;
- MOVWF Audio_Dur_HI ;
- BSF Video_Status, AUDIO_ENABLED_BIT ;
- ;-----------------------------------------------;
- #ENDIF ; (_AUDIO_ENABLED_ == TRUE) ;
- ENDM ;
- ;---------------------------------------------------;
- ;---------------------------------------------------;
- ; Defines ;
- ;---------------------------------------------------;
- ; 2bit DAC definitions. The 2bit DAC is just a ;
- ; pair of resistors on two GPIOs, which feeds ;
- ; the VIDEO out. ;
- ;-----------------------------------------------;
- #IF (_AUDIO_ENABLED_ == TRUE) ;
- #DEFINE AUDIO H'02' ;
- #DEFINE AUDIO_BIT 1 ; GPIO 1 - PIN 6
- #ENDIF ; (_AUDIO_ENABLED_ == TRUE) ;
- ;
- #DEFINE VIDEO_1 H'10' ; 1K ohm
- #DEFINE VIDEO_1_BIT 4 ; GPIO 4 - PIN 3
- #DEFINE VIDEO_0 H'20' ; 470 ohm
- #DEFINE VIDEO_0_BIT 5 ; GPIO 5 - PIN 2
- ;
- #DEFINE COLOR_WHITE (VIDEO_0 + VIDEO_1) ;
- #DEFINE COLOR_BLACK VIDEO_1 ;
- #DEFINE COLOR_GRAY VIDEO_0 ;
- #DEFINE COLOR_SYNC 0 ;
- ;---------------------------------------------------;
- ; Bit definitions for Video_Status ;
- ;---------------------------------------------------;
- #DEFINE VERTICAL_SYNC H'01' ;
- #DEFINE VERTICAL_SYNC_BIT 0 ;
- #DEFINE OE_FIELD H'02' ;
- #DEFINE OE_FIELD_BIT 1 ;
- #IF (_AUDIO_ENABLED_ == TRUE) ;
- #DEFINE AUDIO_ENABLED H'80' ;
- #DEFINE AUDIO_ENABLED_BIT 7 ;
- #ENDIF ; (_AUDIO_ENABLED_ == TRUE) ;
- ;-----------------------------------------------;
- ;
- ;-----------------------------------------------;
- ; There are 192 lines created during _Data_Lines;
- ; However, because of memory limitations, I ;
- ; cannot allocate enough memory for the video ;
- ; buffer. So - I do have enough memory for 48 ;
- ; lines - 1/4 of 192 - so we display each line ;
- ; of data 4 times. ;
- ;-----------------------------------------------;
- #DEFINE MAX_LINES 48 ; DON'T EXCEED 48
- ;-----------------------------------------------;
- ; Make certain NUM_LINES is an even number so ;
- ; all of the math works out properly. Make sure ;
- ; NOT to exceed the MAX_LINES value. And don't ;
- ; change NUM_LINES for less than 9 - that's the ;
- ; paddle height, so that will probably break it.;
- ; But then - the paddle height is adjustable ;
- ; with just changing a define (below), so - who ;
- ; knows! ;
- ;-----------------------------------------------;
- #DEFINE NUM_LINES 48 ; DON'T EXCEED 48
- ;-----------------------------------------------;
- ;
- ;-----------------------------------------------;
- ; Just a bunch of hardcoded starting points, ;
- ; sizes, and bit-munching stuff for the various ;
- ; graphics. ;
- ;-----------------------------------------------;
- ; I use the PIC's LINEAR MEMORY scheme to create;
- ; a contiguous video buffer. Grab the MicroChip ;
- ; documentation and read up. Then go search on ;
- ; the web for some docs that will really explain;
- ; it for you. ;
- ;-----------------------------------------------;
- #DEFINE VIDEO_BUFFER_START H'2030' ;
- #DEFINE SCREEN_HEIGHT NUM_LINES ;
- #DEFINE SCREEN_WIDTH 32 ; 4 bytes * 8 bits ;
- ;---------------------------------------------------;
- ;---------------------------------------------------;
- IFDEF _NTSC_INTERFACE.ASM_ ;
- ;---------------------------------------------------;
- ; Global Data (in NTSC_Interface.ASM) ;
- GLOBAL VSync_Count ;
- GLOBAL Vid_Timing ;
- GLOBAL Video_Status ;
- #IF (_AUDIO_ENABLED_ == TRUE) ;
- GLOBAL Audio_Count ;
- GLOBAL Audio_Reload ;
- GLOBAL Audio_Dur_LO ;
- GLOBAL Audio_Dur_HI ;
- #ENDIF ; (_AUDIO_ENABLED_ == TRUE) ;
- ; Global Routines (in NTSC_Interface.ASM) ;
- GLOBAL _NTSC_Initialize_Subsystem ;
- GLOBAL _NTSC_Video ;
- GLOBAL _BLACK_2us_SYNC_30us_LINE ;
- GLOBAL _BLACK_4us_SYNC_30us_LINE ;
- GLOBAL _INVERTED_30us_SYNC_4us_LINE ;
- GLOBAL _BLACK_2us_SYNC_60us_LINE ;
- GLOBAL _BLACK_4us_SYNC_60us_LINE ;
- GLOBAL _BLACK_4us_SYNC_60us_LINE_BPorch ;
- GLOBAL _WHITE_4us_SYNC_60us_LINE ;
- GLOBAL _NTSC_Clear_Screen ;
- ; External Routines (in the user code) ;
- EXTERN _NTSC_Blank_Line_10 ;
- EXTERN _NTSC_Blank_Line_11 ;
- EXTERN _NTSC_Blank_Line_12 ;
- EXTERN _NTSC_Blank_Line_13 ;
- EXTERN _NTSC_Blank_Line_14 ;
- EXTERN _NTSC_Blank_Line_15 ;
- EXTERN _NTSC_Blank_Line_16 ;
- EXTERN _NTSC_Blank_Line_17 ;
- EXTERN _NTSC_Blank_Line_18 ;
- EXTERN _NTSC_Blank_Line_19 ;
- EXTERN _NTSC_Blank_Line_20 ;
- EXTERN _NTSC_Blank_Line_21 ;
- EXTERN _NTSC_Blank_Line_22 ;
- EXTERN _NTSC_Blank_Line_23 ;
- EXTERN _NTSC_Blank_Line_24 ;
- EXTERN _NTSC_Blank_Line_25 ;
- EXTERN _NTSC_Blank_Line_26 ;
- EXTERN _NTSC_Blank_Line_27 ;
- EXTERN _NTSC_Blank_Line_28 ;
- EXTERN _NTSC_Blank_Line_29 ;
- EXTERN _NTSC_Blank_Line_30 ;
- EXTERN _NTSC_Blank_Line_31 ;
- EXTERN _NTSC_Blank_Line_32 ;
- EXTERN _NTSC_Blank_Line_33 ;
- EXTERN _NTSC_Blank_Line_34 ;
- EXTERN _NTSC_Blank_Line_35 ;
- EXTERN _NTSC_Blank_Line_36 ;
- EXTERN _NTSC_Blank_Line_37 ;
- EXTERN _NTSC_Blank_Line_38 ;
- EXTERN _NTSC_Blank_Line_39 ;
- EXTERN _NTSC_Blank_Line_40 ;
- EXTERN _NTSC_Blank_Line_41 ;
- EXTERN _NTSC_Blank_Line_42 ;
- EXTERN _NTSC_Blank_Line_43 ;
- EXTERN _NTSC_Blank_Line_44 ;
- EXTERN _NTSC_Blank_Line_237 ;
- EXTERN _NTSC_Blank_Line_238 ;
- EXTERN _NTSC_Blank_Line_239 ;
- EXTERN _NTSC_Blank_Line_240 ;
- EXTERN _NTSC_Blank_Line_241 ;
- EXTERN _NTSC_Blank_Line_242 ;
- EXTERN _NTSC_Blank_Line_243 ;
- EXTERN _NTSC_Blank_Line_244 ;
- EXTERN _NTSC_Blank_Line_245 ;
- EXTERN _NTSC_Blank_Line_246 ;
- EXTERN _NTSC_Blank_Line_247 ;
- EXTERN _NTSC_Blank_Line_248 ;
- EXTERN _NTSC_Blank_Line_249 ;
- EXTERN _NTSC_Blank_Line_250 ;
- EXTERN _NTSC_Blank_Line_251 ;
- EXTERN _NTSC_Blank_Line_252 ;
- EXTERN _NTSC_Blank_Line_253 ;
- EXTERN _NTSC_Blank_Line_254 ;
- EXTERN _NTSC_Blank_Line_255 ;
- EXTERN _NTSC_Blank_Line_256 ;
- EXTERN _NTSC_Blank_Line_257 ;
- EXTERN _NTSC_Blank_Line_258 ;
- EXTERN _NTSC_Blank_Line_259 ;
- EXTERN _NTSC_Blank_Line_260 ;
- EXTERN _NTSC_Blank_Line_261 ;
- EXTERN _NTSC_Blank_Line_262 ;
- ;---------------------------------------------------;
- ELSE ;
- ;---------------------------------------------------;
- ; External Data (in NTSC_Interface.ASM) ;
- EXTERN VSync_Count ;
- EXTERN Vid_Timing ;
- EXTERN Video_Status ;
- #IF (_AUDIO_ENABLED_ == TRUE) ;
- EXTERN Audio_Count ;
- EXTERN Audio_Reload ;
- EXTERN Audio_Dur_LO ;
- EXTERN Audio_Dur_HI ;
- #ENDIF ; (_AUDIO_ENABLED_ == TRUE) ;
- ; External Routines (in NTSC_Interface.ASM) ;
- EXTERN _NTSC_Initialize_Subsystem ;
- EXTERN _NTSC_Video ;
- EXTERN _NTSC_Clear_Screen ;
- EXTERN _BLACK_2us_SYNC_30us_LINE ;
- EXTERN _BLACK_4us_SYNC_30us_LINE ;
- EXTERN _INVERTED_30us_SYNC_4us_LINE ;
- EXTERN _BLACK_2us_SYNC_60us_LINE ;
- EXTERN _BLACK_4us_SYNC_60us_LINE ;
- EXTERN _BLACK_4us_SYNC_60us_LINE_BPorch ;
- EXTERN _WHITE_4us_SYNC_60us_LINE ;
- ; Global Routines (in the user code) ;
- GLOBAL _NTSC_Blank_Line_10 ;
- GLOBAL _NTSC_Blank_Line_11 ;
- GLOBAL _NTSC_Blank_Line_12 ;
- GLOBAL _NTSC_Blank_Line_13 ;
- GLOBAL _NTSC_Blank_Line_14 ;
- GLOBAL _NTSC_Blank_Line_15 ;
- GLOBAL _NTSC_Blank_Line_16 ;
- GLOBAL _NTSC_Blank_Line_17 ;
- GLOBAL _NTSC_Blank_Line_18 ;
- GLOBAL _NTSC_Blank_Line_19 ;
- GLOBAL _NTSC_Blank_Line_20 ;
- GLOBAL _NTSC_Blank_Line_21 ;
- GLOBAL _NTSC_Blank_Line_22 ;
- GLOBAL _NTSC_Blank_Line_23 ;
- GLOBAL _NTSC_Blank_Line_24 ;
- GLOBAL _NTSC_Blank_Line_25 ;
- GLOBAL _NTSC_Blank_Line_26 ;
- GLOBAL _NTSC_Blank_Line_27 ;
- GLOBAL _NTSC_Blank_Line_28 ;
- GLOBAL _NTSC_Blank_Line_29 ;
- GLOBAL _NTSC_Blank_Line_30 ;
- GLOBAL _NTSC_Blank_Line_31 ;
- GLOBAL _NTSC_Blank_Line_32 ;
- GLOBAL _NTSC_Blank_Line_33 ;
- GLOBAL _NTSC_Blank_Line_34 ;
- GLOBAL _NTSC_Blank_Line_35 ;
- GLOBAL _NTSC_Blank_Line_36 ;
- GLOBAL _NTSC_Blank_Line_37 ;
- GLOBAL _NTSC_Blank_Line_38 ;
- GLOBAL _NTSC_Blank_Line_39 ;
- GLOBAL _NTSC_Blank_Line_40 ;
- GLOBAL _NTSC_Blank_Line_41 ;
- GLOBAL _NTSC_Blank_Line_42 ;
- GLOBAL _NTSC_Blank_Line_43 ;
- GLOBAL _NTSC_Blank_Line_44 ;
- GLOBAL _NTSC_Blank_Line_237 ;
- GLOBAL _NTSC_Blank_Line_238 ;
- GLOBAL _NTSC_Blank_Line_239 ;
- GLOBAL _NTSC_Blank_Line_240 ;
- GLOBAL _NTSC_Blank_Line_241 ;
- GLOBAL _NTSC_Blank_Line_242 ;
- GLOBAL _NTSC_Blank_Line_243 ;
- GLOBAL _NTSC_Blank_Line_244 ;
- GLOBAL _NTSC_Blank_Line_245 ;
- GLOBAL _NTSC_Blank_Line_246 ;
- GLOBAL _NTSC_Blank_Line_247 ;
- GLOBAL _NTSC_Blank_Line_248 ;
- GLOBAL _NTSC_Blank_Line_249 ;
- GLOBAL _NTSC_Blank_Line_250 ;
- GLOBAL _NTSC_Blank_Line_251 ;
- GLOBAL _NTSC_Blank_Line_252 ;
- GLOBAL _NTSC_Blank_Line_253 ;
- GLOBAL _NTSC_Blank_Line_254 ;
- GLOBAL _NTSC_Blank_Line_255 ;
- GLOBAL _NTSC_Blank_Line_256 ;
- GLOBAL _NTSC_Blank_Line_257 ;
- GLOBAL _NTSC_Blank_Line_258 ;
- GLOBAL _NTSC_Blank_Line_259 ;
- GLOBAL _NTSC_Blank_Line_260 ;
- GLOBAL _NTSC_Blank_Line_261 ;
- GLOBAL _NTSC_Blank_Line_262 ;
- ;---------------------------------------------------;
- ENDIF ;
- ;---------------------------------------------------;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement