home *** CD-ROM | disk | FTP | other *** search
- ;
- ; This source handles the conversion from 24-bit data to HAM8, initialization
- ; of the screen and so on.
- ;
- ; Support for Kaiko is not yet build-in, but very easy to accomplish, as it
- ; makes flush_cunkyloop completely obsolete. Looking forward to see
- ; custom logic like this, possibly more flexible, built-in in all Amigas.
- ;
- ; Phew! This one consumes 43% of the overall processor time in hires, 33% in
- ; lores. I want this Kaiko thingy!
- ;
- ;
- ; Michael Rausch 14-4-94 1:15:00
- ;
-
-
- SECTION text,CODE
-
- include "graphics/rastport.i"
- include "graphics/gfx.i"
-
- XREF _max_x
- XREF _max_y
-
-
- XDEF @HAM6_Init_lores
- @HAM6_Init_lores:
- movem.l d2-d7/a2-a6,-(sp)
-
- ; RGBG BRGB R=8 G=C B=4
- P7 set %0111
- P8 set %1101
-
- move.l #(P7<<28)|(P7<<24)|(P7<<20)|(P7<<16)|(P7<<12)|(P7<<8)|(P7<<4)|P7,d5
- move.l #(P8<<28)|(P8<<24)|(P8<<20)|(P8<<16)|(P8<<12)|(P8<<8)|(P8<<4)|P8,d6
-
- move.l a0,HAM8_rastport
- move.l (rp_BitMap,a0),a0
-
- moveq #0,d1
- move.w (bm_BytesPerRow,a0),d1
- move.l d1,HAM8_offset ; we have advanced one complete line when accessing this
-
- lea (bm_Planes,a0),a6
- move.l a6,HAM8_screen
-
- move.l (a6)+,a1
- move.l (a6)+,a2
- move.l (a6)+,a3
- move.l (a6)+,a4
- move.l (a6)+,a5
- move.l (a6),a6
-
- moveq.l #0,d4
-
- lsr.l #2,d1 ; longs
- subq.l #1,d1
-
- move.w (bm_Rows,a0),d0
- subq.w #1,d0
- h6_prep_rows:
-
- move.l d1,d2
- h6_prep_nulls:
- move.l d4,(a1)+
- move.l d4,(a2)+
- move.l d4,(a3)+
- move.l d4,(a4)+
-
- move.l d5,(a5)+
- move.l d6,(a6)+
-
- dbra d2,h6_prep_nulls
-
- dbra d0,h6_prep_rows
-
- movem.l (sp)+,d2-d7/a2-a6
- rts
-
-
-
- XDEF @HAM8_Init_lores
- @HAM8_Init_lores:
- movem.l d2-d7/a2,-(sp)
-
- ; RGBG BRGB R=8 G=C B=4
- P7 set %0111
- P8 set %1101
-
- move.l #(P7<<28)|(P7<<24)|(P7<<20)|(P7<<16)|(P7<<12)|(P7<<8)|(P7<<4)|P7,d5
- move.l #(P8<<28)|(P8<<24)|(P8<<20)|(P8<<16)|(P8<<12)|(P8<<8)|(P8<<4)|P8,d6
- bra.s ham8cont
-
- XDEF @HAM8_Init
- @HAM8_Init: ; init from rastport data
- movem.l d2-d7/a2,-(sp)
-
- ; BRGB R=8 G=C B=4
- P7 set %1011
- P8 set %0110
-
- move.l #(P7<<28)|(P7<<24)|(P7<<20)|(P7<<16)|(P7<<12)|(P7<<8)|(P7<<4)|P7,d5
- move.l #(P8<<28)|(P8<<24)|(P8<<20)|(P8<<16)|(P8<<12)|(P8<<8)|(P8<<4)|P8,d6
-
- ham8cont:
- bsr std_init
- prep_rows:
-
- move.l d1,d2
- prep_nulls:
- move.l d4,(a1)+
- move.l d4,(a1)+
- move.l d4,(a1)+
- move.l d4,(a1)+
- move.l d4,(a1)+
- move.l d4,(a1)+
- dbra d2,prep_nulls
-
- move.l a1,a0
- add.l a2,a0
-
- move.l d1,d2
- lsr.l #1,d2 ; ohoh
- prep_cols67:
- move.l d5,(a1)+
- move.l d5,(a1)+
- move.l d6,(a0)+
- move.l d6,(a0)+
- dbra d2,prep_cols67
-
- add.l a2,a1
- dbra d0,prep_rows
-
- movem.l (sp)+,d2-d7/a2
- rts
-
-
-
- XDEF @HAM8_Init_x3
- @HAM8_Init_x3: ; init from rastport data
- movem.l d2-d7/a2-a3,-(sp)
-
- bsr.s std_init
- prep_rows_3:
-
- move.l d1,d2
- prep_nulls_3:
- move.l d4,(a1)+
- move.l d4,(a1)+
- move.l d4,(a1)+
- move.l d4,(a1)+
- move.l d4,(a1)+
- move.l d4,(a1)+
- dbra d2,prep_nulls_3
-
- move.l a1,a0
- add.l a2,a0
-
- lea (scale3tab1,pc),a3
- move.l d1,d2
- prep_cols67_3:
- move.l (scale3tab2-scale3tab1,a3),(a0)+
- move.l (a3)+,(a1)+
- subq.w #1,d2
- bmi.s pc67_ready_3
- move.l (scale3tab2-scale3tab1,a3),(a0)+
- move.l (a3)+,(a1)+
- subq.w #1,d2
- bmi.s pc67_ready_3
- move.l (scale3tab2-scale3tab1,a3),(a0)+
- move.l (a3)+,(a1)+
- sub.w #3*4,a3
- dbra d2,prep_cols67_3
- pc67_ready_3:
-
- add.l a2,a1
- dbra d0,prep_rows_3
-
- movem.l (sp)+,d2-d7/a2-a3
- rts
-
- ; BRG R=8 G=C B=4
- P7 set %101
- P8 set %011
-
- scale3tab1:
- dc.l (P7<<29)|(P7<<26)|(P7<<23)|(P7<<20)|(P7<<17)|(P7<<14)|(P7<<11)|(P7<<8)|(P7<<5)|(P7<<2)|(P7>>1)
- dc.l (P7<<31)|(P7<<28)|(P7<<25)|(P7<<22)|(P7<<19)|(P7<<16)|(P7<<13)|(P7<<10)|(P7<<7)|(P7<<4)|(P7<<1)|(P7>>2)
- dc.l (P7<<30)|(P7<<27)|(P7<<24)|(P7<<21)|(P7<<18)|(P7<<15)|(P7<<12)|(P7<<9)|(P7<<6)|(P7<<3)|P7
- scale3tab2:
- dc.l (P8<<29)|(P8<<26)|(P8<<23)|(P8<<20)|(P8<<17)|(P8<<14)|(P8<<11)|(P8<<8)|(P8<<5)|(P8<<2)|(P8>>1)
- dc.l (P8<<31)|(P8<<28)|(P8<<25)|(P8<<22)|(P8<<19)|(P8<<16)|(P8<<13)|(P8<<10)|(P8<<7)|(P8<<4)|(P8<<1)|(P8>>2)
- dc.l (P8<<30)|(P8<<27)|(P8<<24)|(P8<<21)|(P8<<18)|(P8<<15)|(P8<<12)|(P8<<9)|(P8<<6)|(P8<<3)|P8
-
-
-
- std_init:
- move.l a0,HAM8_rastport
- move.l (rp_BitMap,a0),a0
- moveq #0,d1
- move.w (bm_BytesPerRow,a0),d1
- move.l (bm_Planes,a0),a1
- move.l a1,HAM8_screen
- move.l (bm_Planes+4,a0),a2
- sub.l a1,a2 ; plane delta
-
- cmp.l a2,d1
- bgt.s check_interleaved
- sub.l a2,a2 ; RED ALERT, no interlaved bitmap or strange, weirdo layout!
- check_interleaved:
- move.l a2,HAM8_next
- move.l d1,HAM8_offset ; we have advanced one complete line when accessing this
-
- moveq.l #0,d4
-
- move.l a2,d1
- lsr.l #2,d1 ; longs
- subq.l #1,d1
-
- move.w (bm_Rows,a0),d0
- subq.w #1,d0
- rts
-
- ********************************************************
-
- XDEF @HAM6_draw_lores ; (data=a0, x=d0, y=d1)
- @HAM6_draw_lores:
- movem.l d2-d7/a2-a4,-(sp)
-
- move.l _max_y(a4),d7
- cmp.l d7,d1
- bge.s h6_max128lores
- move.l d1,d7 ; height
- h6_max128lores:
- subq.l #1,d7
-
- move.l _max_x(a4),d1
- cmp.l d1,d0
- bge.s h6_max160lores
- move.l d0,d1 ; width
- h6_max160lores:
-
- move.l d1,d6
- lsr.w #4,d6
- subq.w #1,d6 ; width in 8 pixel chunks
-
- and.w #$fff0,d1 ; correct eol of over-large pix
- sub.l d1,d0
-
- move.l d0,d2 ; this is some quick fix for 360 pixels wide b0.mpg, which is invalid!
- and.w #8,d2
- add.w d2,d0
-
- add.l d0,d0 ; 1 word per pixel
- move.l d0,line_offset
-
- move.l HAM8_screen,a1
- addq.l #4,a1
- move.l (a1)+,a2
- move.l (a1)+,a3
- move.l (a1),a4
- move.l -12(a1),a1
-
- move.l HAM8_offset,d2
- move.l d6,d0
- addq.l #1,d0
- lsl.l #2,d0 ; writing one long per main loop
- sub.l d0,d2
- move.l d2,draw_offset
-
- h6_draw_all_rows_lores:
- move.l d7,-(sp)
- move.l d6,d5
-
- h6_blocks_loop_lores:
-
- moveq #7,d4
- h6_flush_chunkyloop_lores:
- move.w (a0)+,d7 ; RGBG
-
- rept 4
- add.w d7,d7
- addx.l d0,d0
- add.w d7,d7
- addx.l d1,d1
- add.w d7,d7
- addx.l d2,d2
- add.w d7,d7
- addx.l d3,d3
- endr
-
- dbra d4,h6_flush_chunkyloop_lores
-
- move.l d3,(a1)+
- move.l d2,(a2)+
- move.l d1,(a3)+
- move.l d0,(a4)+
-
- dbra d5,h6_blocks_loop_lores
-
- add.l line_offset,a0
-
- ; move.l draw_offset,d1
- ; add.l d1,a1
- ; add.l d1,a2
- ; add.l d1,a3
- ; add.l d1,a4
-
- move.l (sp)+,d7
- dbra d7,h6_draw_all_rows_lores
-
-
- movem.l (sp)+,d2-d7/a2-a4
- rts
-
-
- ********************************************************
-
-
- XDEF @HAM8_draw_lores ; (data=a0, x=d0, y=d1)
- @HAM8_draw_lores:
- movem.l d2-d7/a2-a6,-(sp)
-
- move.l _max_y(a4),d7
- cmp.l d7,d1
- bge.s max128lores
- move.l d1,d7 ; height
- max128lores:
- subq.l #1,d7
-
- move.l _max_x(a4),d1
- cmp.l d1,d0
- bge.s max160lores
- move.l d0,d1 ; width
- max160lores:
-
- move.l d1,d6
- lsr.w #4,d6
- subq.w #1,d6 ; width in 8 pixel chunks
-
- and.w #$fff0,d1 ; correct eol of over-large pix
- sub.l d1,d0
-
- move.l d0,d2 ; this is some quick fix for 360 pixels wide b0.mpg, which is invalid!
- and.w #8,d2
- add.w d2,d0
-
- add.l d0,d0 ; 1 word per pixel
- move.l d0,line_offset
-
-
- move.l HAM8_screen,a1 ; get addr, prep next line
- move.l HAM8_next,d1
- move.l a1,a2
- add.l d1,a2
- move.l a2,a3
- add.l d1,a3
- move.l a3,a4
- add.l d1,a4
- move.l a4,a5
- add.l d1,a5
- move.l a5,a6
- add.l d1,a6
-
- move.l HAM8_offset,d2
- move.l d6,d0
- addq.l #1,d0
- lsl.l #2,d0 ; writing one long per main loop
- sub.l d0,d2
- move.l d2,draw_offset
-
-
- draw_all_rows_lores:
- move.l d7,-(sp)
- move.l d6,-(sp)
-
- blocks_loop_lores:
- move.l d6,-(sp)
-
- moveq #7,d6
- flush_chunkyloop_lores:
- move.l (a0)+,d7 ; RGBG
-
- add.l d7,d7
- addx.l d0,d0
- add.l d7,d7
- addx.l d1,d1
- add.l d7,d7
- addx.l d2,d2
- add.l d7,d7
- addx.l d3,d3
- add.l d7,d7
- addx.l d4,d4
- add.l d7,d7
- addx.l d5,d5
-
- rept 3
- lsl.l #3,d7
- addx.l d0,d0
- add.l d7,d7
- addx.l d1,d1
- add.l d7,d7
- addx.l d2,d2
- add.l d7,d7
- addx.l d3,d3
- add.l d7,d7
- addx.l d4,d4
- add.l d7,d7
- addx.l d5,d5
- endr
-
- dbra d6,flush_chunkyloop_lores
-
- move.l d5,(a1)+
- move.l d4,(a2)+
- move.l d3,(a3)+
- move.l d2,(a4)+
- move.l d1,(a5)+
- move.l d0,(a6)+
-
- move.l (sp)+,d6
- dbra d6,blocks_loop_lores
-
- add.l line_offset,a0
-
- move.l draw_offset,d1
- add.l d1,a1
- add.l d1,a2
- add.l d1,a3
- add.l d1,a4
- add.l d1,a5
- add.l d1,a6
-
- move.l (sp)+,d6
- move.l (sp)+,d7
- dbra d7,draw_all_rows_lores
-
-
- movem.l (sp)+,d2-d7/a2-a6
- rts
-
-
- ********************************************************
-
-
- XDEF @HAM8_draw_hires ; (data=a0, x=d0, y=d1)
- @HAM8_draw_hires:
- movem.l d2-d7/a2-a6,-(sp)
-
- move.l _max_y(a4),d7
- cmp.l d7,d1
- bge.s max128
- move.l d1,d7 ; height
- max128: subq.l #1,d7
-
- move.l _max_x(a4),d1
- cmp.l d1,d0
- bge.s max160
- move.l d0,d1 ; width
- max160:
-
- move.l d1,d6
- lsr.w #3,d6
- subq.w #1,d6 ; width in 8 pixel chunks
-
- and.w #$fff8,d1 ; correct eol of over-large pix
- sub.l d1,d0
- lsl.l #2,d0 ; 1 long per pixel
- move.l d0,line_offset
-
-
- move.l HAM8_screen,a1 ; get addr, prep next line
- move.l HAM8_next,d1
- move.l a1,a2
- add.l d1,a2
- move.l a2,a3
- add.l d1,a3
- move.l a3,a4
- add.l d1,a4
- move.l a4,a5
- add.l d1,a5
- move.l a5,a6
- add.l d1,a6
-
- move.l HAM8_offset,d2
- move.l d6,d0
- addq.l #1,d0
- lsl.l #2,d0
- sub.l d0,d2
- move.l d2,draw_offset
-
- draw_all_rows:
- move.l d7,-(sp)
- move.l d6,-(sp)
-
- blocks_loop:
- move.l d6,-(sp)
-
-
- moveq #7,d6
- flush_chunkyloop:
- move.l (a0)+,d7 ; BRG0
-
- add.l d7,d7
- addx.l d0,d0
- add.l d7,d7
- addx.l d1,d1
- add.l d7,d7
- addx.l d2,d2
- add.l d7,d7
- addx.l d3,d3
- add.l d7,d7
- addx.l d4,d4
- add.l d7,d7
- addx.l d5,d5
-
- rept 2
- lsl.l #3,d7
- addx.l d0,d0
- add.l d7,d7
- addx.l d1,d1
- add.l d7,d7
- addx.l d2,d2
- add.l d7,d7
- addx.l d3,d3
- add.l d7,d7
- addx.l d4,d4
- add.l d7,d7
- addx.l d5,d5
- endr
-
- add.l d0,d0
- add.l d1,d1
- add.l d2,d2
- add.l d3,d3
- add.l d4,d4
- add.l d5,d5
-
- dbra d6,flush_chunkyloop
-
-
- move.l #$11111111,d6
- copcol macro (reg)
- move.l \1,d7
- lsr.l #3,d7 ; BRGB
- and.l d6,d7
- or.l d7,\1
- endm
- copcol d0
- copcol d1
- copcol d2
- copcol d3
- copcol d4
- copcol d5
-
- move.l d5,(a1)+
- move.l d4,(a2)+
- move.l d3,(a3)+
- move.l d2,(a4)+
- move.l d1,(a5)+
- move.l d0,(a6)+
-
- move.l (sp)+,d6
- dbra d6,blocks_loop
-
- add.l line_offset,a0
-
- move.l draw_offset,d1
- add.l d1,a1
- add.l d1,a2
- add.l d1,a3
- add.l d1,a4
- add.l d1,a5
- add.l d1,a6
-
- move.l (sp)+,d6
- move.l (sp)+,d7
- dbra d7,draw_all_rows
-
-
- movem.l (sp)+,d2-d7/a2-a6
- rts
-
-
- ********************************************************
-
-
- SECTION __MERGED,BSS
-
-
- HAM8_rastport: ds.l 1 ; original rastport struct
- HAM8_screen: ds.l 1 ; first bitplane
- HAM8_offset: ds.l 1 ; next line in the first bitplane
- HAM8_next: ds.l 1 ; next bitplane
-
- draw_offset: ds.l 1
- line_offset: ds.l 1
-
- is_interleaved: ds.w 1
-
- END
-