DAT { video-treiber-frame - basiert auf dem tollen tutorial von bamse 30-09-2009-dr235 driver 1 - originalcode, anpassung an hive driver 2 - senkrechte balken driver 3 - einfarbige fläche driver 4 - wandernde farbbalken, 1 byte pro pixel :) driver 5 - } CON _CLKMODE = xtal1 + pll16x _XINFREQ = 5_000_000 PUB start cognew(@entry,0) ' neue cog mit video-treiber starten DAT org 0 entry jmp #Start_of_driver ' Start here... ' NTSC sync stuff. NTSC_color_freq long 3_579_545 ' NTSC Color Frequency NTSC_hsync_VSCL long 39 << 12 + 624 ' Used for the Horisontal Sync NTSC_active_VSCL long 188 << 12 + 3008 ' Used for the Vertical sync NTSC_hsync_pixels long %%11_0000_1_2222222_11 ' Horizontal sync pixels NTSC_vsync_high_1 long %%1111111_2222222_11 ' Vertical sync signal part one for lines 1-6 and 13 to 18 NTSC_vsync_high_2 long %%1111111111111111 ' Vertical sync signal part two for lines 1-6 and 13 to 18 NTSC_vsync_low_1 long %%2222222222222222 ' Vertical sync signal part one for lines 7-12 NTSC_vsync_low_2 long %%22_1111111_2222222 ' Vertical sync signal part two for lines 7-12 NTSC_sync_signal_palette long $00_00_02_8A ' The sync Palette ' hbeat --------+ +------------------------- /cs ' clk -------+| | ' /wr ------+|| | +---------------------- videopins ' /hs -----+||| | | ' |||| |--+ -------- d0..d7 tvport_mask long %00000000_01110000_00000000_00000000 ' Maske für Video-Pins am Hive vsu_cfg long %01110100_00000000_00000100_01110000 ' Wert für VCFG-Register NTSC_Graphic_Lines long 244 ' Anzahl der sichtbaren Zeilen NTSC_Graphics_Pixels_VSCL long 16 << 12 + 16 ' 16 clocks per pixel, 64 clocks per frame. PAL0 long $01 PAL1 long $0E PAL2 long $0D PAL3 long $0C PAL4 long $0B DIF1 long $00_10 CNT_ANIM long $4 ' Loop counters. line_loop long $0 ' Line counter... pix_loop long $0 anim_loop long $0 ' General Purpose Registers r0 long $0 ' Initialize to 0 r1 long $0 r2 long $0 r3 long $0 c1 long $0 ' colorregister c2 long $0 c3 long $0 '========================== Start of the actual driver ============================================= Start_of_driver ' VCFG, setup Video Configuration register and 3-bit tv DAC pins to output mov VCFG, vsu_cfg ' Konfiguration der VSU or DIRA, tvport_mask ' Set DAC pins to output ' CTRA, setup Frequency to Drive Video movi CTRA,#%00001_111 ' pll internal routed to Video, PHSx+=FRQx (mode 1) + pll(16x) mov r1, NTSC_color_freq ' r1: Color frequency in Hz (3.579_545MHz) rdlong r2, #0 ' Copy system clock from main memory location 0. (80Mhz) ' perform r3 = 2^32 * r1 / r2 mov r0,#32+1 :loop cmpsub r1,r2 wc rcl r3,#1 shl r1,#1 djnz r0,#:loop mov FRQA, r3 ' Set frequency for counter A '========================== Start of Frame Loop ============================================== frame_loop mov anim_loop, CNT_ANIM frame_loop2 '========================== Screen ============================================= mov line_loop, NTSC_Graphic_Lines ' anzahl der zeilen laden (244) user_lines '------ zeilensynchronisation mov VSCL, NTSC_hsync_VSCL ' Setup VSCL for horizontal sync. waitvid NTSC_sync_signal_palette, NTSC_hsync_pixels ' Generate sync. '------ sichtbarer zeileninhalt mov VSCL, NTSC_Graphics_Pixels_VSCL ' Setup VSCL for user pixels. '------ verschiedenfarbige balken ausgeben mov c1, PAL4 add c1, c3 mov pix_loop, #23 bar_loop add c1, #$10 ' 8 x pixel einzeln! ausgeben mov c2, c1 ' also 2 tiles waitvid c2, #0 ' 8 bit pro pixel! add c2, #1 waitvid c2, #0 add c2, #1 waitvid c2, #0 add c2, #1 waitvid c2, #0 sub c2, #1 waitvid c2, #0 sub c2, #1 waitvid c2, #0 sub c2, #1 waitvid c2, #0 sub c2, #1 waitvid c2, #0 djnz pix_loop, #bar_loop sub c2, #1 waitvid c2, #0 ' 4 mal extrapixel, für das timing sub c2, #1 ' also insgesamt 188 pixel pro zeile waitvid c2, #0 sub c2, #1 waitvid c2, #0 sub c2, #1 waitvid c2, #0 djnz line_loop, #user_lines ' schleife durch alle zeilen '========================== The 16 lines of Horizontal sync ================================== mov line_loop, #6 ' Line 244, start of first high sync. vsync_high1 mov VSCL, NTSC_hsync_VSCL waitvid NTSC_sync_signal_palette, NTSC_vsync_high_1 mov VSCL, NTSC_active_VSCL waitvid NTSC_sync_signal_palette, NTSC_vsync_high_2 djnz line_loop, #vsync_high1 mov line_loop, #6 ' Line 250, start of the Seration pulses. vsync_low mov VSCL, NTSC_active_VSCL waitvid NTSC_sync_signal_palette, NTSC_vsync_low_1 mov VSCL,NTSC_hsync_VSCL waitvid NTSC_sync_signal_palette, NTSC_vsync_low_2 djnz line_loop, #vsync_low mov line_loop, #6 ' Line 256, start of second high sync. vsync_high2 mov VSCL, NTSC_hsync_VSCL waitvid NTSC_sync_signal_palette, NTSC_vsync_high_1 mov VSCL, NTSC_active_VSCL waitvid NTSC_sync_signal_palette, NTSC_vsync_high_2 djnz line_loop, #vsync_high2 '========================== End of Frame Loop ============================================= djnz anim_loop, #frame_loop2 add c3, #$10 '========================== Animation ================================== jmp #frame_loop ' And repeat for ever... FIT