Advertisement
Guest User

SAGA Initscreen PLL example

a guest
Aug 22nd, 2018
550
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ;==============================================================================
  2. ; Program: SAGA_InitScreen.asm
  3. ; Short:   Initialize SAGA Screen example.
  4. ; Author:  APOLLO-Team, Flype
  5. ; Compile: Tested with Amiga Devpac 3.18, on
  6. ;          CBM Amiga 600 + Kickstart OS3.x + Vampire 600 V2
  7. ;          DO NOT TRY THIS ON UAE OR REAL HARDWARE. SAGAcore REQUIRED!
  8. ;==============================================================================
  9.  
  10. ;==============================================================================
  11. ;== https://github.com/ezrec/saga-drivers
  12. ;== http://apollo-accelerators.com/wiki/doku.php?id=saga_core_video
  13. ;==============================================================================
  14.  
  15.     MACHINE MC68020
  16.  
  17. ;==============================================================================
  18. ;== CONSTANTS - PUBLIC - CBM Amiga
  19. ;==============================================================================
  20.  
  21. ABSEXECBASE              EQU $4            ; Exec Base
  22. AllocMem                 EQU -198          ; Exec->AllocMem(size, flags)
  23. FreeMem                  EQU -210          ; Exec->FreeMem(mem, size)
  24.  
  25. ;==============================================================================
  26. ;== CONSTANTS - PUBLIC - SAGA Core
  27. ;==============================================================================
  28.  
  29. PLL_CS                   EQU $1            ;
  30. PLL_CSn                  EQU $0            ;
  31. PLL_CLK                  EQU $2            ;
  32. PLL_CLKn                 EQU $0            ;
  33. PLL_MOSI                 EQU $4            ;
  34. PLL_CONF                 EQU $8            ;
  35. PLL_SIZE                 EQU 18            ; 18 bytes
  36. PLL_MAGIC                EQU $43430000     ; Selector
  37.                    
  38. SAGA_FBADDR              EQU $dff1ec       ; Video Address
  39. SAGA_FBMODE              EQU $dff1f4       ; Video PixelFormat Mode
  40. SAGA_MODULO              EQU $dff1f6       ; Video Modulo
  41. SAGA_PLLW                EQU $dff1f8       ; Video PLLW
  42. SAGA_PLLR                EQU $dff1fa       ; Video PLLR
  43. SAGA_HPIXEL              EQU $dff300       ; Video Modeline
  44. SAGA_CLUT                EQU $dff400       ; Video Color Lookup Table
  45.  
  46. SAGA_VIDEO_MEM_ALIGN     EQU 32            ; Video 32-bytes Alignment
  47.  
  48. SAGA_VIDEO_DBLSCAN_OFF   EQU $00           ; Normal Display
  49. SAGA_VIDEO_DBLSCAN_X     EQU $01           ; Double output each X-Pixel (X-DoubleScan)
  50. SAGA_VIDEO_DBLSCAN_Y     EQU $02           ; Double output each Row (Y-DoubleScan)
  51. SAGA_VIDEO_DBLSCAN_XY    EQU $03           ; Double output (XY-DoubleScan)
  52.  
  53. SAGA_VIDEO_FORMAT_BE     EQU 0             ; Pixels in Big Endian
  54. SAGA_VIDEO_FORMAT_LE     EQU 1             ; Pixels in Little Endian
  55. SAGA_VIDEO_FORMAT_ENDIAN EQU 7             ; Pixel Format Endian-ness (Bit 7)
  56.  
  57. SAGA_VIDEO_FORMAT_OFF    EQU $00           ; Pixel Format = Chunky    DMA Off         (Bytes Per Pix = 0)
  58. SAGA_VIDEO_FORMAT_CLUT8  EQU $01           ; Pixel Format = Chunky      CLUT8         (Bytes Per Pix = 1)
  59. SAGA_VIDEO_FORMAT_RGB16  EQU $02           ; Pixel Format = Chunky   R5|G6|B5         (Bytes Per Pix = 2)
  60. SAGA_VIDEO_FORMAT_RGB15  EQU $03           ; Pixel Format = Chunky   R5|G5|B5         (Bytes Per Pix = 2)
  61. SAGA_VIDEO_FORMAT_RGB24  EQU $04           ; Pixel Format = Chunky   R8|G8|B8         (Bytes Per Pix = 3)
  62. SAGA_VIDEO_FORMAT_RGB32  EQU $05           ; Pixel Format = Chunky -|R8|G8|B8         (Bytes Per Pix = 4)
  63. SAGA_VIDEO_FORMAT_YUV422 EQU $06           ; Pixel Format = Chunky   Y4|U2|V2 (YUYV ) (Bytes Per Pix = 2)
  64.  
  65. ;==============================================================================
  66. ;== CONSTANTS - PRIVATE
  67. ;==============================================================================
  68.  
  69.     RSRESET
  70. VAL_WIDTH                rs.l 1            ; SAGA Video Pixels per row
  71. VAL_HEIGHT               rs.l 1            ; SAGA Video Row lines
  72. VAL_BYTESPERPIXEL        rs.l 1            ; SAGA Video Bytes Per Pixel
  73. VAL_MODEHI               rs.b 1            ; SAGA Video Mode High byte
  74. VAL_MODELO               rs.b 1            ; SAGA Video Mode Low byte
  75. VAL_MODELINE             rs.w 9            ; SAGA Video Modeline
  76. VAL_PLLDATA              rs.b 18           ; SAGA Video PLL data
  77. VAL_COLORMAP             rs.l 256          ; SAGA Video ColorMap data
  78.  
  79. ;==============================================================================
  80. ;== ENTRY POINT
  81. ;==============================================================================
  82.  
  83.     SECTION S_0,CODE
  84.  
  85. MAIN:
  86.  
  87.     ; d7 : memory size
  88.  
  89.     ; a0 : free
  90.     ; a1 : free
  91.     ; a2 : free
  92.     ; a3 : framebuffer address
  93.     ; a4 : memory address
  94.     ; a5 : data values
  95.     ; a6 : execbase
  96.     ; a7 : stack pointer
  97.  
  98.     lea     MODE_640_480_8,a5              ; Load Init Screen Values
  99.  
  100. .video_alloc
  101.     move.l  VAL_WIDTH(a5),d0               ; Video Width
  102.     mulu.l  VAL_HEIGHT(a5),d0              ; Video Height
  103.     mulu.l  VAL_BYTESPERPIXEL(a5),d0       ; Video Bytes per pixel
  104.     add.l   #SAGA_VIDEO_MEM_ALIGN,d0       ; Video Memory Alignment
  105.     move.l  d0,d7
  106.     move.l  #$50104,d1                     ; MemFlags (Reverse, Local, Fast)
  107.     move.l  ABSEXECBASE.w,a6               ; Exec Base
  108.     jsr     AllocMem(a6)                   ; Allocate memory
  109.     tst.l   d0                             ; Check result
  110.     beq.w   .exit                          ; Exit on error
  111.     move.l  d0,a4                          ; Memory Address
  112.     add.l   #(SAGA_VIDEO_MEM_ALIGN-1),d0   ; ( Memory Address + 31 )
  113.     and.l   #~(SAGA_VIDEO_MEM_ALIGN-1),d0  ; ( Memory Address + 31 ) & ~31
  114.     move.l  d0,a3                          ; FrameBuffer Address
  115.  
  116. .video_disable
  117.     move.w  #0,SAGA_FBMODE                 ; Disable Video
  118.  
  119. .video_pll
  120.     lea     VAL_PLLDATA(a5),a0             ; Set PLL    
  121.     bsr.w   SAGA_SetPLL                    ;
  122.  
  123. .video_modeline
  124.     lea     VAL_MODELINE(a5),a0            ; Set Modeline
  125.     bsr.w   SAGA_SetModeline               ;
  126.  
  127. .video_colormap
  128.     lea     VAL_COLORMAP(a5),a0            ; Set ColorMap
  129.     bsr.w   SAGA_SetColorMap               ;
  130.  
  131. .video_enable
  132.     move.l  a3,SAGA_FBADDR                 ; Set FrameBuffer
  133.     moveq.w #0,SAGA_MODULO                 ; Set Modulo
  134.     move.w  VAL_MODEHI(a5),SAGA_FBMODE     ; Enable Video
  135.    
  136. .user_code
  137.    
  138.     ;- - - - - - - - - - - -
  139.     ;  User code goes here
  140.     ;- - - - - - - - - - - -
  141.  
  142.     move.l  a3,a0                          ; FrameBuffer    
  143.     move.l  VAL_HEIGHT(a5),d0              ; H
  144.     subq.l  #1,d0                          ; H-1
  145. .y
  146.     move.l  VAL_WIDTH(a5),d1               ; W
  147.     subq.l  #1,d1                          ; W-1
  148. .x  move.l  #$00010203,(a0)+               ; Draw 4 8-bits pixels
  149.     dbf     d1,.x                          ; Next X
  150.     dbf     d0,.y                          ; Next Y
  151.  
  152.     ;- - - - - - - - - - - -
  153.     ;  User code goes here
  154.     ;- - - - - - - - - - - -
  155.  
  156. .free
  157.     move.l  a4,a1                          ; Memory Address
  158.     move.l  d7,d0                          ; Memory Size
  159.     move.l  ABSEXECBASE.w,a6               ; Exec Base
  160.     jsr     FreeMem(a6)                    ; Free Memory
  161.  
  162. .exit
  163.     moveq.l #0,d0                          ; DOS Return Code
  164.     rts                                    ; Exit program
  165.  
  166. ;==============================================================================
  167. ;== void SAGA_SetModeline(uint16_t* array)
  168. ;==                       A0
  169. ;==============================================================================
  170.  
  171. SAGA_SetModeline:
  172.     movem.l a0-a1,-(sp)                    ; Push
  173.     lea     SAGA_HPIXEL,a1                 ; Destination
  174.     move.w  (a0)+,(a1)+                    ; HPIXEL
  175.     move.w  (a0)+,(a1)+                    ; HSSTRT
  176.     move.w  (a0)+,(a1)+                    ; HSSTOP
  177.     move.w  (a0)+,(a1)+                    ; HTOTAL
  178.     move.w  (a0)+,(a1)+                    ; VPIXEL
  179.     move.w  (a0)+,(a1)+                    ; VSSTRT
  180.     move.w  (a0)+,(a1)+                    ; VSSTOP
  181.     move.w  (a0)+,(a1)+                    ; VTOTAL
  182.     move.w  (a0)+,(a1)+                    ; HVSYNC
  183.     movem.l (sp)+,a0-a1                    ; Pop
  184.     rts                                    ; Return
  185.  
  186. ;==============================================================================
  187. ;== void SAGA_SetPLL(uint8_t* array)
  188. ;==                  A0
  189. ;==============================================================================
  190.  
  191. SAGA_SetPLL:    
  192.     movem.l d0-d3/a0,-(sp)                 ; Push    
  193.     add.l   #PLL_SIZE,a0                   ; End of array
  194.     move.w  #PLL_SIZE-1,d3                 ; for(d3=17; d3>=0; d3--) {
  195. .bytes                                     ;  
  196.     move.b  -(a0),d1                       ;   Load byte
  197.     move.l  #PLL_MAGIC+PLL_CSn+PLL_CLKn,d0 ;  
  198.     move.l  d0,SAGA_PLLW                   ;  
  199.     moveq   #8-1,d2                        ;   for(d2=7; d2>=0; d2--) {
  200. .bits                                      ;    
  201.     lsr.b   #1,d1                          ;     Load bit
  202.     scs.b   d0                             ;    
  203.     andi.w  #PLL_MOSI,d0                   ;    
  204.     move.l  d0,SAGA_PLLW                   ;    
  205.     ori.w   #PLL_CLK,d0                    ;    
  206.     move.l  d0,SAGA_PLLW                   ;     Write bit
  207.     dbf     d2,.bits                       ;   }
  208.     dbf     d3,.bytes                      ; }
  209.     move.l  #PLL_MAGIC+PLL_CS+PLL_CLKn,d0  ;
  210.     move.l  d0,SAGA_PLLW                   ;
  211.     move.w  #PLL_CS+PLL_CLK,d0             ;
  212.     move.l  d0,SAGA_PLLW                   ;
  213.     move.w  #PLL_CS+PLL_CLKn+PLL_CONF,d0   ;
  214.     move.l  d0,SAGA_PLLW                   ;
  215.     move.w  #PLL_CS+PLL_CLK+PLL_CONF,d0    ;
  216.     move.l  d0,SAGA_PLLW                   ;
  217.     moveq.l #128-1,d1                      ; for(d1=127; d1>=0; d1--) {
  218. .extra                                     ;  
  219.     move.w  #PLL_CS+PLL_CLKn,d0            ;  
  220.     move.l  d0,SAGA_PLLW                   ;  
  221.     move.w  #PLL_CS+PLL_CLK,d0             ;  
  222.     move.l  d0,SAGA_PLLW                   ;  
  223.     dbf     d1,.extra                      ; }
  224.     movem.l (sp)+,d0-d3/a0                 ; Pop
  225.     rts                                    ; Return
  226.  
  227. ;==============================================================================
  228. ;== void SAGA_SetColorMap(uint32_t* array)
  229. ;==                       A0
  230. ;==============================================================================
  231.  
  232. SAGA_SetColorMap:
  233.     movem.l d0/a0-a1,-(sp)                 ; Push
  234.     lea     SAGA_CLUT,a1                   ; Destination
  235.     move.l  #256-1,d0                      ; Colors count
  236. .loop
  237.     move.l  (a0)+,(a1)+                    ; Set ARGB color
  238.     dbf     d0,.loop                       ; Next color
  239.     movem.l (sp)+,d0/a0-a1                 ; Pop
  240.     rts                                    ; Return
  241.  
  242. ;==============================================================================
  243. ;== DATA to initialize a SAGA chunky screen
  244. ;== Dimensions, Video Flags, PixelFormat, Modeline, PLL, ColorMap
  245. ;== 640x480 60Hz 25.222328 MHz
  246. ;==============================================================================
  247.  
  248.     SECTION S_1,DATA
  249.  
  250. MODE_640_480_8:
  251.    
  252.     dc.l 640                                 ; Width
  253.     dc.l 480                                 ; Height
  254.    
  255.     dc.l 1                                   ; Bytes per pixel
  256.    
  257.     dc.b (SAGA_VIDEO_DBLSCAN_OFF)            ; DoubleScan flags
  258.    
  259.     dc.b (SAGA_VIDEO_FORMAT_CLUT8)           ; Pixel Format for Palette mode
  260.    
  261.     dc.w 640,656,752,800,480,490,492,525,3   ; Modeline for 640x480
  262.    
  263.     dc.b $08,$40,$60,$00,$02,$81,$40,$2F,$16 ; PLL data
  264.     dc.b $02,$C1,$20,$00,$08,$00,$02,$00,$00 ;
  265.    
  266.     dc.l $00000000,$00FF0000                 ; Colormap
  267.     dc.l $0000FF00,$000000FF                 ;
  268.     dc.l $0000FFFF,$00FFFF00                 ;
  269.     dc.l $00FFFFFF,$00AAAAAA                 ;
  270.     ds.l 248                                 ;
  271.  
  272.     END
  273.  
  274. ;==============================================================================
  275. ;== END
  276. ;==============================================================================
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement