Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;==============================================================================
- ; Program: SAGA_InitScreen.asm
- ; Short: Initialize SAGA Screen example.
- ; Author: APOLLO-Team, Flype
- ; Compile: Tested with Amiga Devpac 3.18, on
- ; CBM Amiga 600 + Kickstart OS3.x + Vampire 600 V2
- ; DO NOT TRY THIS ON UAE OR REAL HARDWARE. SAGAcore REQUIRED!
- ;==============================================================================
- ;==============================================================================
- ;== https://github.com/ezrec/saga-drivers
- ;== http://apollo-accelerators.com/wiki/doku.php?id=saga_core_video
- ;==============================================================================
- MACHINE MC68020
- ;==============================================================================
- ;== CONSTANTS - PUBLIC - CBM Amiga
- ;==============================================================================
- ABSEXECBASE EQU $4 ; Exec Base
- AllocMem EQU -198 ; Exec->AllocMem(size, flags)
- FreeMem EQU -210 ; Exec->FreeMem(mem, size)
- ;==============================================================================
- ;== CONSTANTS - PUBLIC - SAGA Core
- ;==============================================================================
- PLL_CS EQU $1 ;
- PLL_CSn EQU $0 ;
- PLL_CLK EQU $2 ;
- PLL_CLKn EQU $0 ;
- PLL_MOSI EQU $4 ;
- PLL_CONF EQU $8 ;
- PLL_SIZE EQU 18 ; 18 bytes
- PLL_MAGIC EQU $43430000 ; Selector
- SAGA_FBADDR EQU $dff1ec ; Video Address
- SAGA_FBMODE EQU $dff1f4 ; Video PixelFormat Mode
- SAGA_MODULO EQU $dff1f6 ; Video Modulo
- SAGA_PLLW EQU $dff1f8 ; Video PLLW
- SAGA_PLLR EQU $dff1fa ; Video PLLR
- SAGA_HPIXEL EQU $dff300 ; Video Modeline
- SAGA_CLUT EQU $dff400 ; Video Color Lookup Table
- SAGA_VIDEO_MEM_ALIGN EQU 32 ; Video 32-bytes Alignment
- SAGA_VIDEO_DBLSCAN_OFF EQU $00 ; Normal Display
- SAGA_VIDEO_DBLSCAN_X EQU $01 ; Double output each X-Pixel (X-DoubleScan)
- SAGA_VIDEO_DBLSCAN_Y EQU $02 ; Double output each Row (Y-DoubleScan)
- SAGA_VIDEO_DBLSCAN_XY EQU $03 ; Double output (XY-DoubleScan)
- SAGA_VIDEO_FORMAT_BE EQU 0 ; Pixels in Big Endian
- SAGA_VIDEO_FORMAT_LE EQU 1 ; Pixels in Little Endian
- SAGA_VIDEO_FORMAT_ENDIAN EQU 7 ; Pixel Format Endian-ness (Bit 7)
- SAGA_VIDEO_FORMAT_OFF EQU $00 ; Pixel Format = Chunky DMA Off (Bytes Per Pix = 0)
- SAGA_VIDEO_FORMAT_CLUT8 EQU $01 ; Pixel Format = Chunky CLUT8 (Bytes Per Pix = 1)
- SAGA_VIDEO_FORMAT_RGB16 EQU $02 ; Pixel Format = Chunky R5|G6|B5 (Bytes Per Pix = 2)
- SAGA_VIDEO_FORMAT_RGB15 EQU $03 ; Pixel Format = Chunky R5|G5|B5 (Bytes Per Pix = 2)
- SAGA_VIDEO_FORMAT_RGB24 EQU $04 ; Pixel Format = Chunky R8|G8|B8 (Bytes Per Pix = 3)
- SAGA_VIDEO_FORMAT_RGB32 EQU $05 ; Pixel Format = Chunky -|R8|G8|B8 (Bytes Per Pix = 4)
- SAGA_VIDEO_FORMAT_YUV422 EQU $06 ; Pixel Format = Chunky Y4|U2|V2 (YUYV ) (Bytes Per Pix = 2)
- ;==============================================================================
- ;== CONSTANTS - PRIVATE
- ;==============================================================================
- RSRESET
- VAL_WIDTH rs.l 1 ; SAGA Video Pixels per row
- VAL_HEIGHT rs.l 1 ; SAGA Video Row lines
- VAL_BYTESPERPIXEL rs.l 1 ; SAGA Video Bytes Per Pixel
- VAL_MODEHI rs.b 1 ; SAGA Video Mode High byte
- VAL_MODELO rs.b 1 ; SAGA Video Mode Low byte
- VAL_MODELINE rs.w 9 ; SAGA Video Modeline
- VAL_PLLDATA rs.b 18 ; SAGA Video PLL data
- VAL_COLORMAP rs.l 256 ; SAGA Video ColorMap data
- ;==============================================================================
- ;== ENTRY POINT
- ;==============================================================================
- SECTION S_0,CODE
- MAIN:
- ; d7 : memory size
- ; a0 : free
- ; a1 : free
- ; a2 : free
- ; a3 : framebuffer address
- ; a4 : memory address
- ; a5 : data values
- ; a6 : execbase
- ; a7 : stack pointer
- lea MODE_640_480_8,a5 ; Load Init Screen Values
- .video_alloc
- move.l VAL_WIDTH(a5),d0 ; Video Width
- mulu.l VAL_HEIGHT(a5),d0 ; Video Height
- mulu.l VAL_BYTESPERPIXEL(a5),d0 ; Video Bytes per pixel
- add.l #SAGA_VIDEO_MEM_ALIGN,d0 ; Video Memory Alignment
- move.l d0,d7
- move.l #$50104,d1 ; MemFlags (Reverse, Local, Fast)
- move.l ABSEXECBASE.w,a6 ; Exec Base
- jsr AllocMem(a6) ; Allocate memory
- tst.l d0 ; Check result
- beq.w .exit ; Exit on error
- move.l d0,a4 ; Memory Address
- add.l #(SAGA_VIDEO_MEM_ALIGN-1),d0 ; ( Memory Address + 31 )
- and.l #~(SAGA_VIDEO_MEM_ALIGN-1),d0 ; ( Memory Address + 31 ) & ~31
- move.l d0,a3 ; FrameBuffer Address
- .video_disable
- move.w #0,SAGA_FBMODE ; Disable Video
- .video_pll
- lea VAL_PLLDATA(a5),a0 ; Set PLL
- bsr.w SAGA_SetPLL ;
- .video_modeline
- lea VAL_MODELINE(a5),a0 ; Set Modeline
- bsr.w SAGA_SetModeline ;
- .video_colormap
- lea VAL_COLORMAP(a5),a0 ; Set ColorMap
- bsr.w SAGA_SetColorMap ;
- .video_enable
- move.l a3,SAGA_FBADDR ; Set FrameBuffer
- moveq.w #0,SAGA_MODULO ; Set Modulo
- move.w VAL_MODEHI(a5),SAGA_FBMODE ; Enable Video
- .user_code
- ;- - - - - - - - - - - -
- ; User code goes here
- ;- - - - - - - - - - - -
- move.l a3,a0 ; FrameBuffer
- move.l VAL_HEIGHT(a5),d0 ; H
- subq.l #1,d0 ; H-1
- .y
- move.l VAL_WIDTH(a5),d1 ; W
- subq.l #1,d1 ; W-1
- .x move.l #$00010203,(a0)+ ; Draw 4 8-bits pixels
- dbf d1,.x ; Next X
- dbf d0,.y ; Next Y
- ;- - - - - - - - - - - -
- ; User code goes here
- ;- - - - - - - - - - - -
- .free
- move.l a4,a1 ; Memory Address
- move.l d7,d0 ; Memory Size
- move.l ABSEXECBASE.w,a6 ; Exec Base
- jsr FreeMem(a6) ; Free Memory
- .exit
- moveq.l #0,d0 ; DOS Return Code
- rts ; Exit program
- ;==============================================================================
- ;== void SAGA_SetModeline(uint16_t* array)
- ;== A0
- ;==============================================================================
- SAGA_SetModeline:
- movem.l a0-a1,-(sp) ; Push
- lea SAGA_HPIXEL,a1 ; Destination
- move.w (a0)+,(a1)+ ; HPIXEL
- move.w (a0)+,(a1)+ ; HSSTRT
- move.w (a0)+,(a1)+ ; HSSTOP
- move.w (a0)+,(a1)+ ; HTOTAL
- move.w (a0)+,(a1)+ ; VPIXEL
- move.w (a0)+,(a1)+ ; VSSTRT
- move.w (a0)+,(a1)+ ; VSSTOP
- move.w (a0)+,(a1)+ ; VTOTAL
- move.w (a0)+,(a1)+ ; HVSYNC
- movem.l (sp)+,a0-a1 ; Pop
- rts ; Return
- ;==============================================================================
- ;== void SAGA_SetPLL(uint8_t* array)
- ;== A0
- ;==============================================================================
- SAGA_SetPLL:
- movem.l d0-d3/a0,-(sp) ; Push
- add.l #PLL_SIZE,a0 ; End of array
- move.w #PLL_SIZE-1,d3 ; for(d3=17; d3>=0; d3--) {
- .bytes ;
- move.b -(a0),d1 ; Load byte
- move.l #PLL_MAGIC+PLL_CSn+PLL_CLKn,d0 ;
- move.l d0,SAGA_PLLW ;
- moveq #8-1,d2 ; for(d2=7; d2>=0; d2--) {
- .bits ;
- lsr.b #1,d1 ; Load bit
- scs.b d0 ;
- andi.w #PLL_MOSI,d0 ;
- move.l d0,SAGA_PLLW ;
- ori.w #PLL_CLK,d0 ;
- move.l d0,SAGA_PLLW ; Write bit
- dbf d2,.bits ; }
- dbf d3,.bytes ; }
- move.l #PLL_MAGIC+PLL_CS+PLL_CLKn,d0 ;
- move.l d0,SAGA_PLLW ;
- move.w #PLL_CS+PLL_CLK,d0 ;
- move.l d0,SAGA_PLLW ;
- move.w #PLL_CS+PLL_CLKn+PLL_CONF,d0 ;
- move.l d0,SAGA_PLLW ;
- move.w #PLL_CS+PLL_CLK+PLL_CONF,d0 ;
- move.l d0,SAGA_PLLW ;
- moveq.l #128-1,d1 ; for(d1=127; d1>=0; d1--) {
- .extra ;
- move.w #PLL_CS+PLL_CLKn,d0 ;
- move.l d0,SAGA_PLLW ;
- move.w #PLL_CS+PLL_CLK,d0 ;
- move.l d0,SAGA_PLLW ;
- dbf d1,.extra ; }
- movem.l (sp)+,d0-d3/a0 ; Pop
- rts ; Return
- ;==============================================================================
- ;== void SAGA_SetColorMap(uint32_t* array)
- ;== A0
- ;==============================================================================
- SAGA_SetColorMap:
- movem.l d0/a0-a1,-(sp) ; Push
- lea SAGA_CLUT,a1 ; Destination
- move.l #256-1,d0 ; Colors count
- .loop
- move.l (a0)+,(a1)+ ; Set ARGB color
- dbf d0,.loop ; Next color
- movem.l (sp)+,d0/a0-a1 ; Pop
- rts ; Return
- ;==============================================================================
- ;== DATA to initialize a SAGA chunky screen
- ;== Dimensions, Video Flags, PixelFormat, Modeline, PLL, ColorMap
- ;== 640x480 60Hz 25.222328 MHz
- ;==============================================================================
- SECTION S_1,DATA
- MODE_640_480_8:
- dc.l 640 ; Width
- dc.l 480 ; Height
- dc.l 1 ; Bytes per pixel
- dc.b (SAGA_VIDEO_DBLSCAN_OFF) ; DoubleScan flags
- dc.b (SAGA_VIDEO_FORMAT_CLUT8) ; Pixel Format for Palette mode
- dc.w 640,656,752,800,480,490,492,525,3 ; Modeline for 640x480
- dc.b $08,$40,$60,$00,$02,$81,$40,$2F,$16 ; PLL data
- dc.b $02,$C1,$20,$00,$08,$00,$02,$00,$00 ;
- dc.l $00000000,$00FF0000 ; Colormap
- dc.l $0000FF00,$000000FF ;
- dc.l $0000FFFF,$00FFFF00 ;
- dc.l $00FFFFFF,$00AAAAAA ;
- ds.l 248 ;
- END
- ;==============================================================================
- ;== END
- ;==============================================================================
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement