; d6.l (chunkylen) [bytes] -- offset between one row and the next in chunkybuf
; ; ; Date: 2000-04-11 Mikael Kalms (Scout/C-Lous & more) ; Email: mikael@kalms.org ; ; About: ; 1x1 8bpl cpu5 C2P for contigous bitplanes and no horizontal modulo ; ; This routine is intended for use on all 68040 and 68060 based systems. ; It is not designed to perform well on 68020-030. ; ; This routine is released into the public domain. It may be freely used ; for non-commercial as well as commercial purposes. A short notice via ; email is always appreciated, though. ; ; Timings: ; Estimated to run at copyspeed on 040-40 and 060 ; ; Features: ; Handles bitplanes of virtually any size (4GB) ; ; Restrictions: ; Chunky-buffer must be an even multiple of 32 pixels wide ; If incorrect/invalid parameters are specified, the routine will ; most probably crash. ; ; c2p1x1_8_c5_040_init sets chunkybuffer size/pos & bplsize ; c2p1x1_8_c5_040 performs the actual c2p conversion ; section code,code ; d0.w chunkyx [chunky-pixels] ; d1.w chunkyy [chunky-pixels] ; d2.w (scroffsx) [screen-pixels] ; d3.w scroffsy [screen-pixels] ; d4.l (rowlen) [bytes] -- offset between one row and the next in a bpl ; d5.l bplsize [bytes] -- offset between one row in one bpl and the next bpl ; d6.l (chunkylen) [bytes] -- offset between one row and the next in chunkybuf XDEF _c2p1x1_8_c5_040_init XDEF c2p1x1_8_c5_040_init _c2p1x1_8_c5_040_init c2p1x1_8_c5_040_init move.l d3,-(sp) mulu.w d0,d3 lsr.l #3,d3 move.l d3,c2p1x1_8_c5_040_scroffs mulu.w d0,d1 move.l d1,c2p1x1_8_c5_040_pixels move.l d5,d0 lsl.l #3,d0 sub.l d5,d0 move.l d0,c2p1x1_8_c5_040_delta0 addq.l #4,d0 move.l d0,c2p1x1_8_c5_040_delta4 move.l d5,d0 lsl.l #2,d0 move.l d0,c2p1x1_8_c5_040_delta1 move.l d0,c2p1x1_8_c5_040_delta3 move.l d0,c2p1x1_8_c5_040_delta5 move.l d0,c2p1x1_8_c5_040_delta7 sub.l d5,d0 move.l d0,c2p1x1_8_c5_040_delta2 move.l d0,c2p1x1_8_c5_040_delta6 move.l d0,c2p1x1_8_c5_040_delta8 move.l (sp)+,d3 rts ; a0 c2pscreen ; a1 bitplanes XDEF _c2p1x1_8_c5_040 XDEF c2p1x1_8_c5_040 _c2p1x1_8_c5_040 c2p1x1_8_c5_040 movem.l d2-d7/a2-a6,-(sp) add.l c2p1x1_8_c5_040_delta0(pc),a1 add.l c2p1x1_8_c5_040_scroffs(pc),a1 move.l c2p1x1_8_c5_040_pixels(pc),d0 beq .none add.l a0,d0 move.l d0,-(sp) tst.b 16(a0) move.l (a0)+,d0 move.l (a0)+,d1 move.l (a0)+,d2 move.l (a0)+,d3 tst.b 16(a0) move.l (a0)+,d4 move.l (a0)+,d5 move.l (a0)+,a5 move.l (a0)+,a6 swap d4 ; Swap 16x4, part 1 swap d5 eor.w d0,d4 eor.w d1,d5 eor.w d4,d0 eor.w d5,d1 eor.w d0,d4 eor.w d1,d5 swap d4 swap d5 move.l d4,d6 ; Swap 2x4, part 1 move.l d5,d7 lsr.l #2,d6 lsr.l #2,d7 eor.l d0,d6 eor.l d1,d7 and.l #$33333333,d6 and.l #$33333333,d7 eor.l d6,d0 eor.l d7,d1 lsl.l #2,d6 lsl.l #2,d7 eor.l d6,d4 eor.l d7,d5 exg d4,a5 exg d5,a6 swap d4 ; Swap 16x4, part 2 swap d5 eor.w d2,d4 eor.w d3,d5 eor.w d4,d2 eor.w d5,d3 eor.w d2,d4 eor.w d3,d5 swap d4 swap d5 move.l d4,d6 ; Swap 2x4, part 1 move.l d5,d7 lsr.l #2,d6 lsr.l #2,d7 eor.l d2,d6 eor.l d3,d7 and.l #$33333333,d6 and.l #$33333333,d7 eor.l d6,d2 eor.l d7,d3 lsl.l #2,d6 lsl.l #2,d7 eor.l d6,d4 eor.l d7,d5 move.l d1,d6 ; Swap 4x1, part 1 move.l d3,d7 lsr.l #4,d6 lsr.l #4,d7 eor.l d0,d6 eor.l d2,d7 and.l #$0f0f0f0f,d6 and.l #$0f0f0f0f,d7 eor.l d6,d0 eor.l d7,d2 lsl.l #4,d6 lsl.l #4,d7 eor.l d6,d1 eor.l d7,d3 move.l d2,d6 ; Swap 8x2, part 1 move.l d3,d7 lsr.l #8,d6 lsr.l #8,d7 eor.l d0,d6 eor.l d1,d7 and.l #$00ff00ff,d6 and.l #$00ff00ff,d7 eor.l d6,d0 eor.l d7,d1 lsl.l #8,d6 lsl.l #8,d7 eor.l d6,d2 eor.l d7,d3 bra .start cnop 0,4 .x tst.b 32(a0) move.l (a0)+,d0 move.l (a0)+,d1 move.l (a0)+,d2 move.l (a0)+,d3 tst.b 32(a0) move.l (a0)+,d4 move.l (a0)+,d5 move.l (a0)+,a5 move.l (a0)+,a6 move.l d6,(a1) swap d4 ; Swap 16x4, part 1 swap d5 eor.w d0,d4 eor.w d1,d5 eor.w d4,d0 eor.w d5,d1 eor.w d0,d4 sub.l c2p1x1_8_c5_040_delta1(pc),a1 eor.w d1,d5 swap d4 swap d5 move.l d4,d6 ; Swap 2x4, part 1 move.l d7,(a1) move.l d5,d7 lsr.l #2,d6 lsr.l #2,d7 eor.l d0,d6 eor.l d1,d7 and.l #$33333333,d6 and.l #$33333333,d7 eor.l d6,d0 eor.l d7,d1 lsl.l #2,d6 lsl.l #2,d7 eor.l d6,d4 eor.l d7,d5 exg d4,a5 add.l c2p1x1_8_c5_040_delta2(pc),a1 exg d5,a6 swap d4 ; Swap 16x4, part 2 swap d5 eor.w d2,d4 eor.w d3,d5 eor.w d4,d2 eor.w d5,d3 eor.w d2,d4 eor.w d3,d5 swap d4 swap d5 move.l a3,(a1) move.l d4,d6 ; Swap 2x4, part 2 move.l d5,d7 lsr.l #2,d6 lsr.l #2,d7 eor.l d2,d6 eor.l d3,d7 and.l #$33333333,d6 and.l #$33333333,d7 eor.l d6,d2 eor.l d7,d3 lsl.l #2,d6 lsl.l #2,d7 eor.l d6,d4 eor.l d7,d5 move.l d1,d6 ; Swap 4x1, part 1 move.l d3,d7 lsr.l #4,d6 lsr.l #4,d7 eor.l d0,d6 eor.l d2,d7 and.l #$0f0f0f0f,d6 and.l #$0f0f0f0f,d7 sub.l c2p1x1_8_c5_040_delta3(pc),a1 eor.l d6,d0 eor.l d7,d2 lsl.l #4,d6 lsl.l #4,d7 eor.l d6,d1 move.l a4,(a1) eor.l d7,d3 move.l d2,d6 ; Swap 8x2, part 1 move.l d3,d7 lsr.l #8,d6 lsr.l #8,d7 eor.l d0,d6 eor.l d1,d7 and.l #$00ff00ff,d6 and.l #$00ff00ff,d7 eor.l d6,d0 eor.l d7,d1 lsl.l #8,d6 lsl.l #8,d7 eor.l d6,d2 add.l c2p1x1_8_c5_040_delta4(pc),a1 eor.l d7,d3 .start move.l d2,d6 ; Swap 1x2, part 1 move.l d3,d7 lsr.l #1,d6 lsr.l #1,d7 eor.l d0,d6 eor.l d1,d7 and.l #$55555555,d6 and.l #$55555555,d7 eor.l d6,d0 eor.l d7,d1 move.l d0,(a1) add.l d6,d6 add.l d7,d7 eor.l d6,d2 eor.l d7,d3 move.l a5,d6 move.l a6,d7 move.l d2,a3 move.l d3,a4 move.l d5,d2 ; Swap 4x1, part 2 move.l d7,d3 lsr.l #4,d2 lsr.l #4,d3 sub.l c2p1x1_8_c5_040_delta5(pc),a1 eor.l d4,d2 eor.l d6,d3 and.l #$0f0f0f0f,d2 and.l #$0f0f0f0f,d3 eor.l d2,d4 move.l d1,(a1) eor.l d3,d6 lsl.l #4,d2 lsl.l #4,d3 eor.l d2,d5 eor.l d3,d7 move.l d4,d2 ; Swap 8x2, part 2 move.l d5,d3 lsr.l #8,d2 lsr.l #8,d3 add.l c2p1x1_8_c5_040_delta6(pc),a1 eor.l d6,d2 eor.l d7,d3 and.l #$00ff00ff,d2 and.l #$00ff00ff,d3 eor.l d2,d6 move.l a3,(a1) eor.l d3,d7 lsl.l #8,d2 lsl.l #8,d3 eor.l d2,d4 eor.l d3,d5 move.l d4,d2 ; Swap 1x2, part 2 move.l d5,d3 sub.l c2p1x1_8_c5_040_delta7(pc),a1 lsr.l #1,d2 lsr.l #1,d3 eor.l d6,d2 eor.l d7,d3 and.l #$55555555,d2 move.l a4,(a1) and.l #$55555555,d3 eor.l d2,d6 eor.l d3,d7 add.l d2,d2 add.l d3,d3 eor.l d2,d4 eor.l d3,d5 add.l c2p1x1_8_c5_040_delta8(pc),a1 move.l d4,a3 move.l d5,a4 cmp.l (sp),a0 bne .x move.l d6,(a1) sub.l c2p1x1_8_c5_040_delta1(pc),a1 move.l d7,(a1) add.l c2p1x1_8_c5_040_delta2(pc),a1 move.l a3,(a1) sub.l c2p1x1_8_c5_040_delta3(pc),a1 move.l a4,(a1) addq.l #4,sp .none movem.l (sp)+,d2-d7/a2-a6 rts cnop 0,4 c2p1x1_8_c5_040_data c2p1x1_8_c5_040_scroffs ds.l 1 c2p1x1_8_c5_040_pixels ds.l 1 c2p1x1_8_c5_040_delta0 ds.l 1 c2p1x1_8_c5_040_delta1 ds.l 1 c2p1x1_8_c5_040_delta2 ds.l 1 c2p1x1_8_c5_040_delta3 ds.l 1 c2p1x1_8_c5_040_delta4 ds.l 1 c2p1x1_8_c5_040_delta5 ds.l 1 c2p1x1_8_c5_040_delta6 ds.l 1 c2p1x1_8_c5_040_delta7 ds.l 1 c2p1x1_8_c5_040_delta8 ds.l 1
@mateusz_s, post #1
; Odłożenie na stos adresu za ostatnim konwertowanym pikselem: move.l c2p1x1_8_c5_040_pixels(pc),d0 beq .none add.l a0,d0 move.l d0,-(sp)
; Sprawdzenie czy doszliśmy do końca bufora chunky: cmp.l (sp),a0 bne .x
c2p1x1_8_c5_040_chunkylen ds.l 1 c2p1x1_8_c5_040_rowlen ds.l 1
; Sprawdzenie czy doszliśmy do końca bufora chunky: cmp.l (sp),a0 bne .x ; Końcowy zapis move.l d6,(a1) sub.l c2p1x1_8_c5_040_delta1(pc),a1 move.l d7,(a1) add.l c2p1x1_8_c5_040_delta2(pc),a1 move.l a3,(a1) sub.l c2p1x1_8_c5_040_delta3(pc),a1 move.l a4,(a1) ; Przejście do kolejnej linijki adda.l c2p1x1_8_c5_040_chunkylen(pc),a0 ; Aktualizacja adresu bufora chunky adda.l c2p1x1_8_c5_040_rowlen(pc),a1 ; Aktualizacja adresu bufora planar
@Don_Adan, post #4
@Hexmage960, post #2
@mateusz_s, post #6
@mateusz_s, post #8
Te systemowe są ze 2x wolniejsze :/ wolę KaLmsa
@mateusz_s, post #5
Modulo = $2800 Length = $A00 ; number of longwords per BitPlan to write ; static/dependent BitPlanes version for one chip ram area ; input ; A0 - source (chunky) ; A1 - destination (planar) BEST_c2p add.w BeginSkip(PC),A0 move.l #Modulo,A2 ; Modulo lea (A1,A2.L*4),A1 ; A1+Modulo*4 lea -4(A1,A2.L*2),A3 ; A1+Modulo*6-4 add.l #Length*4,A3 ; loop test value sub.l A6,A6 lea (A6,A2.L*8),A6 ; Modulo*8 sub.l A2,A6 ; Modulo*7 move.l #$00FF00FF,D7 ; static move.l #$33333333,D6 ; static move.l #$55555555,D5 ; static move.l #$0F0F0F0F,D4 ; temp MOVE.L (A0)+,D0 MOVE.L (A0)+,D1 MOVE.L (A0)+,D2 MOVE.L (A0)+,D3 AND.L D4,D0 AND.L D4,D1 LSL.L #4,D0 OR.L D1,D0 AND.L D4,D2 AND.L D4,D3 LSL.L #4,D2 OR.L D3,D2 move.l D4,D1 move.l D4,D3 and.l (A0)+,D1 and.l (A0)+,D3 lsl.l #4,D1 or.l D3,D1 move.l D4,D3 and.l (A0)+,D3 and.l (A0)+,D4 LSL.L #4,D3 OR.L D4,D3 SWAP D3 MOVE.W D2,D4 MOVE.W D3,D2 MOVE.W D4,D3 SWAP D3 move.l D1,D4 move.w D0,D4 swap D4 move.w D4,D0 move.w D1,D4 move.l D4,D1 LSR.L #2,D4 EOR.L D0,D4 AND.L D6,D4 EOR.L D4,D0 bra.b GoBC2P LoopBC2P move.l (A0)+,D0 move.l (A0)+,A4 move.l (A0)+,D2 move.l (A0)+,A5 move.l D4,(A1) ; chipram write exg D1,A4 exg D3,A5 MOVE.L #$0F0F0F0F,D4 AND.L D4,D0 AND.L D4,D2 LSL.L #4,D0 LSL.L #4,D2 AND.L D4,D1 AND.L D4,D3 OR.L D1,D0 OR.L D3,D2 sub.l A2,A1 ; A1+Modulo*5 move.l D4,D1 move.l D4,D3 and.l (A0)+,D1 and.l (A0)+,D3 lsl.l #4,D1 or.l D3,D1 move.l D4,D3 and.l (A0)+,D3 and.l (A0)+,D4 move.l A4,(A1) ; chipram write LSL.L #4,D3 OR.L D4,D3 SWAP D3 MOVE.W D2,D4 MOVE.W D3,D2 MOVE.W D4,D3 SWAP D3 move.l D1,D4 move.w D0,D4 swap D4 move.w D4,D0 move.w D1,D4 move.l D4,D1 sub.l A2,A1 ; A1+Modulo*4 LSR.L #2,D4 EOR.L D0,D4 AND.L D6,D4 EOR.L D4,D0 move.l A5,(A1)+ ; chipram write GoBC2P LSL.L #2,D4 EOR.L D4,D1 MOVE.L D3,D4 LSR.L #2,D4 EOR.L D2,D4 AND.L D6,D4 EOR.L D4,D2 LSL.L #2,D4 EOR.L D4,D3 MOVE.L D2,D4 LSR.L #8,D4 EOR.L D0,D4 and.l D7,D4 EOR.L D4,D0 LSL.L #8,D4 EOR.L D4,D2 MOVE.L D2,D4 LSR.L #1,D4 EOR.L D0,D4 and.l D5,D4 EOR.L D4,D0 sub.l A2,A1 ; A1+Modulo*3 move.l D0,(A1) ; chipram write ADD.L D4,D4 EOR.L D2,D4 MOVE.L D3,D2 LSR.L #8,D2 EOR.L D1,D2 and.l D7,D2 EOR.L D2,D1 LSL.L #8,D2 EOR.L D2,D3 MOVE.L D3,D2 LSR.L #1,D2 EOR.L D1,D2 and.l D5,D2 EOR.L D2,D1 ADD.L D2,D2 EOR.L D2,D3 sub.l A2,A1 ; A1+Modulo*2 lea -$20(A0),A0 move.l (A0)+,D0 move.l (A0)+,A4 move.l (A0)+,D2 move.l (A0)+,A5 move.l D4,(A1) ; chipram write exg D1,A4 exg D3,A5 MOVE.L #$F0F0F0F0,D4 AND.L D4,D0 AND.L D4,D1 LSR.L #4,D1 OR.L D1,D0 AND.L D4,D2 AND.L D4,D3 LSR.L #4,D3 OR.L D3,D2 sub.l A2,A1 ; A1+Modulo*1 move.l D4,D1 move.l D4,D3 and.l (A0)+,D1 and.l (A0)+,D3 lsr.l #4,D3 or.l D3,D1 move.l D4,D3 and.l (A0)+,D3 and.l (A0)+,D4 move.l A4,(A1) ; chipram write LSR.L #4,D4 OR.L D4,D3 SWAP D3 MOVE.W D2,D4 MOVE.W D3,D2 MOVE.W D4,D3 SWAP D3 move.l D1,D4 move.w D0,D4 swap D4 move.w D4,D0 move.w D1,D4 move.l D4,D1 LSR.L #2,D4 EOR.L D0,D4 AND.L D6,D4 EOR.L D4,D0 LSL.L #2,D4 sub.l A2,A1 ; A1+Modulo*0 EOR.L D4,D1 MOVE.L D3,D4 LSR.L #2,D4 move.l A5,(A1) ; chipram write EOR.L D2,D4 AND.L D6,D4 EOR.L D4,D2 LSL.L #2,D4 EOR.L D4,D3 MOVE.L D2,D4 LSR.L #8,D4 EOR.L D0,D4 and.l D7,D4 EOR.L D4,D0 LSL.L #8,D4 EOR.L D4,D2 MOVE.L D2,D4 LSR.L #1,D4 EOR.L D0,D4 and.l D5,D4 add.l A6,A1 ; A1+Modulo*7 EOR.L D4,D0 ADD.L D4,D4 EOR.L D2,D4 move.l D0,(A1) ; chipram write MOVE.L D3,D2 LSR.L #8,D2 EOR.L D1,D2 and.l D7,D2 EOR.L D2,D1 LSL.L #8,D2 EOR.L D2,D3 MOVE.L D3,D2 LSR.L #1,D2 EOR.L D1,D2 and.l D5,D2 EOR.L D2,D1 ADD.L D2,D2 EOR.L D2,D3 add.w FullSkip(PC),A0 sub.l A2,A1 ; A1+Modulo*6 cmp.l A3,A1 bne.w LoopBC2P move.l D4,(A1) ; chipram write sub.l A2,A1 ; A1+Modulo*5 move.l D1,(A1) ; chipram write sub.l A2,A1 ; A1+Modulo*4 move.l D3,(A1) ; chipram write RTS FullSkip dc.w 0 ; how many bytes must be skipped from full c2p line BeginSkip dc.w 0 ; how many bytes must be skipped from begining of line
@Don_Adan, post #10
Modulo = $2800 Length = $A00 ; number of longwords per BitPlan to write ; static/dependent BitPlanes version for one chip ram area ; input ; A0 - source (chunky) ; A1 - destination (planar) BEST_c2p add.w BeginSkip(PC),A0 move.l #Modulo,A2 ; Modulo lea (A1,A2.L*4),A1 ; A1+Modulo*4 move.w #Length-1,D7 sub.l A6,A6 lea (A6,A2.L*8),A6 ; Modulo*8 sub.l A2,A6 ; Modulo*7 sub.l A2,A6 ; Modulo*6 move.l #$0F0F0F0F,D4 ; temp MOVE.L (A0),D0 MOVE.L 4(A0),D1 MOVE.L 8(A0),D2 MOVE.L 12(A0),D3 AND.L D4,D0 AND.L D4,D1 LSL.L #4,D0 OR.L D1,D0 AND.L D4,D2 AND.L D4,D3 LSL.L #4,D2 OR.L D3,D2 move.l D4,D1 move.l D4,D3 and.l 16(A0),D1 and.l 20(A0),D3 lsl.l #4,D1 or.l D3,D1 move.l D4,D3 and.l 24(A0),D3 and.l 28(A0),D4 LSL.L #4,D3 OR.L D4,D3 move.l D1,D6 move.w D0,D1 swap D1 move.w D1,D0 move.w D6,D1 MOVE.L D0,D4 LSL.L #2,D4 EOR.L D1,D4 AND.L #$CCCCCCCC,D4 EOR.L D4,D1 LSR.L #2,D4 EOR.L D4,D0 sub.l A2,A1 ; A1+Modulo*3 move.l D3,D4 move.w D2,D3 swap D3 move.w D3,D2 move.w D4,D3 MOVE.L D2,D4 LSL.L #2,D4 EOR.L D3,D4 AND.L #$CCCCCCCC,D4 EOR.L D4,D3 LSR.L #2,D4 EOR.L D4,D2 MOVE.L D0,D4 LSL.L #8,D4 EOR.L D2,D4 AND.L #$FF00FF00,D4 EOR.L D4,D2 LSR.L #8,D4 EOR.L D4,D0 MOVE.L D0,D4 ADD.L D4,D4 EOR.L D2,D4 AND.L #$AAAAAAAA,D4 EOR.L D4,D2 LSR.L #1,D4 EOR.L D4,D0 move.l D0,(A1) ; 0.40 (average place) chipram write -> bit plane 4 sub.l A2,A1 ; A1+Modulo*2 MOVE.L D1,D6 LSL.L #8,D6 EOR.L D3,D6 AND.L #$FF00FF00,D6 EOR.L D6,D3 LSR.L #8,D6 EOR.L D6,D1 MOVE.L D1,D6 ADD.L D6,D6 EOR.L D3,D6 AND.L #$AAAAAAAA,D6 EOR.L D6,D3 lsr.l #1,D6 eor.l D1,D6 move.l D2,(A1) ; 0.64 (average place) chipram write -> bit plane 3 move.l (A0)+,D0 move.l (A0)+,D4 move.l (A0)+,D2 move.l (A0)+,A5 move.l #$F0F0F0F0,D1 and.l D1,D0 sub.l A2,A1 ; A1+Modulo*1 and.l D1,D4 exg D3,A5 and.l D1,D2 lsr.l #4,D4 and.l D1,D3 or.l D4,D0 lsr.l #4,D3 move.l D1,D4 or.l D3,D2 move.l D4,D3 move.l D4,D5 and.l (A0)+,D1 and.l (A0)+,D3 and.l (A0)+,D5 move.l D6,(A1) ; 0.01 (perfect place) chipram write -> bit plane 2 and.l (A0)+,D4 sub.l A2,A1 ; A1+Modulo*0 (place OK) lsr.l #4,D3 or.l D3,D1 lsr.l #4,D4 or.l D4,D5 move.l A5,(A1) ; 0.01 (perfect place) chipram write -> bit plane 1 add.l A6,A1 ; A1+Modulo*6 (-4) move.l D1,D6 move.w D0,D1 swap D1 move.w D1,D0 move.w D6,D1 MOVE.L D0,D4 LSL.L #2,D4 EOR.L D1,D4 AND.L #$CCCCCCCC,D4 EOR.L D4,D1 LSR.L #2,D4 subq.l #4,A6 ; correction for bitplane 7 handling bra.w GoBC2P LoopBC2P move.l (A0),D0 move.l 4(A0),D1 move.l 8(A0),D2 move.l 12(A0),D3 sub.l A2,A1 ; A1+Modulo*5 AND.L D4,D0 AND.L D4,D2 LSL.L #4,D0 LSL.L #4,D2 AND.L D4,D1 AND.L D4,D3 OR.L D1,D0 OR.L D3,D2 move.l D4,D1 and.l 16(A0),D1 move.l D4,D3 and.l 20(A0),D3 lsl.l #4,D1 and.l 24(A0),D4 or.l D3,D1 move.l #$0F0F0F0F,D3 move.l D6,(A1) ; 0.04 (perfect place) chipram write -> bit plane 6 sub.l A2,A1 ; A1+Modulo*4 (right place) and.l 28(A0),D3 move.l D5,(A1)+ ; 0.22 (perfect place) chipram write -> bit plane 5 sub.l A2,A1 ; A1+Modulo*3 lsl.l #4,D4 or.l D4,D3 move.l D1,D4 move.w D0,D1 swap D1 move.w D1,D0 move.w D4,D1 MOVE.L D0,D4 LSL.L #2,D4 EOR.L D1,D4 AND.L #$CCCCCCCC,D4 EOR.L D4,D1 LSR.L #2,D4 EOR.L D4,D0 move.l D3,D4 move.w D2,D3 swap D3 move.w D3,D2 move.w D4,D3 MOVE.L D2,D4 LSL.L #2,D4 EOR.L D3,D4 AND.L #$CCCCCCCC,D4 EOR.L D4,D3 LSR.L #2,D4 EOR.L D4,D2 MOVE.L D0,D4 LSL.L #8,D4 EOR.L D2,D4 AND.L #$FF00FF00,D4 EOR.L D4,D2 LSR.L #8,D4 EOR.L D4,D0 MOVE.L D0,D4 ADD.L D4,D4 EOR.L D2,D4 AND.L #$AAAAAAAA,D4 EOR.L D4,D2 LSR.L #1,D4 EOR.L D4,D0 move.l D0,(A1) ; 0.40 (average place) chipram write -> bit plane 4 sub.l A2,A1 ; A1+Modulo*2 MOVE.L D1,D6 LSL.L #8,D6 EOR.L D3,D6 AND.L #$FF00FF00,D6 EOR.L D6,D3 LSR.L #8,D6 EOR.L D6,D1 MOVE.L D1,D6 ADD.L D6,D6 EOR.L D3,D6 AND.L #$AAAAAAAA,D6 EOR.L D6,D3 lsr.l #1,D6 eor.l D1,D6 move.l D2,(A1) ; 0.64 (average place) chipram write -> bit plane 3 move.l (A0)+,D0 move.l (A0)+,D4 move.l (A0)+,D2 move.l (A0)+,A5 move.l #$F0F0F0F0,D1 and.l D1,D0 sub.l A2,A1 ; A1+Modulo*1 and.l D1,D4 exg D3,A5 and.l D1,D2 lsr.l #4,D4 and.l D1,D3 or.l D4,D0 lsr.l #4,D3 move.l D1,D4 or.l D3,D2 move.l D4,D3 move.l D4,D5 and.l (A0)+,D1 and.l (A0)+,D3 and.l (A0)+,D5 move.l D6,(A1) ; 0.01 (perfect place) chipram write -> bit plane 2 and.l (A0)+,D4 sub.l A2,A1 ; A1+Modulo*0 (place OK) lsr.l #4,D3 or.l D3,D1 move.l A5,(A1) ; 0.01 (perfect place) chipram write -> bit plane 1 add.l A6,A1 ; A1+Modulo*6 (-4) lsr.l #4,D4 or.l D4,D5 move.l D1,D6 move.w D0,D1 swap D1 move.w D1,D0 move.w D6,D1 MOVE.L D0,D4 LSL.L #2,D4 EOR.L D1,D4 AND.L #$CCCCCCCC,D4 EOR.L D4,D1 LSR.L #2,D4 move.l A3,(A1)+ ; 0.64 (average place) chipram write -> bit plane 7 GoBC2P add.l A2,A1 ; A1+Modulo*7 EOR.L D4,D0 move.l D5,D6 move.w D2,D5 swap D5 move.w D5,D2 move.w D6,D5 MOVE.L D2,D4 LSL.L #2,D4 EOR.L D5,D4 AND.L #$CCCCCCCC,D4 EOR.L D4,D5 LSR.L #2,D4 EOR.L D4,D2 MOVE.L D0,D4 LSL.L #8,D4 EOR.L D2,D4 AND.L #$FF00FF00,D4 EOR.L D4,D2 LSR.L #8,D4 EOR.L D4,D0 MOVE.L D0,D4 ADD.L D4,D4 EOR.L D2,D4 AND.L #$AAAAAAAA,D4 EOR.L D4,D2 LSR.L #1,D4 EOR.L D4,D0 move.l D0,(A1) ; 0.66 (average place) chipram write -> bit plane 8 sub.l A2,A1 ; A1+Modulo*6 move.l D2,A3 MOVE.L D1,D6 LSL.L #8,D6 EOR.L D5,D6 AND.L #$FF00FF00,D6 EOR.L D6,D5 LSR.L #8,D6 EOR.L D6,D1 MOVE.L D1,D6 ADD.L D6,D6 EOR.L D5,D6 AND.L #$AAAAAAAA,D6 EOR.L D6,D5 LSR.L #1,D6 EOR.L D1,D6 MOVE.L #$0F0F0F0F,D4 add.w FullSkip(PC),A0 dbf D7,LoopBC2P move.l A3,(A1) ; chipram write -> bit plane 7 sub.l A2,A1 ; A1+Modulo*5 move.l D6,(A1) ; chipram write -> bit plane 6 sub.l A2,A1 ; A1+Modulo*4 move.l D5,(A1) ; chipram write -> bit plane 5 RTS FullSkip dc.w 0 ; how many bytes must be skipped from full c2p line BeginSkip dc.w 0 ; how many bytes must be skipped from begining of line
@mateusz_s, post #12
@mateusz_s, post #12