; ; SAS/C isn't capable of inlining assembler subroutines, nor does it produce ; appropriate code for straight division/modulo operations, nor does it ..... ; So, let's it do the work, and then I do the rest to it. ; ; Michael Rausch, 3/94 ; SECTION text,CODE XREF _clamp XREF _BIMcm_reconstruct XREF _BIM_reconstruct XREF _BMcm_reconstruct XREF _BM_reconstruct XDEF @ReconIMBlock XDEF @ReconPMBlock XDEF @ReconBMBlock XDEF @ReconBiMBlock @ReconIMBlock: MOVEM.L D4-D7/A3,-(A7) MOVE.L D0,D7 MOVE.L $c(A0),D6 MOVE.L $86(A0),D4 divu.w d6,D4 moveq #0,d5 move.w d4,d5 swap d4 ext.l d4 move.L $178(a0),a1 MOVEQ.L #$4,D0 CMP.L D0,D7 BGE.B ReconIMBlock__7 lSL.L #$4,D5 lSL.L #$4,D4 MOVEQ #$1,D1 CMP.L D1,D7 BLE.B ReconIMBlock__4 ADDQ.L #$8,D5 ReconIMBlock__4: BTST #$0,D7 BEQ.B ReconIMBlock__6 ADDQ.L #$8,D4 ReconIMBlock__6: lSL.L #$4,D6 MOVE.L (A1),A3 BRA.B ReconIMBlock__10 ReconIMBlock__7: lSL.L #$3,D4 lSL.L #$3,D5 lSL.L #$3,D6 SUBQ.L #$4,D7 BNE.B ReconIMBlock__9 MOVE.L $4(A1),A3 BRA.B ReconIMBlock__10 ReconIMBlock__9: MOVE.L $8(A1),A3 ReconIMBlock__10: MULu.w D6,D5 add.w #$d2,a0 ADD.L D5,A3 ADD.L D4,A3 lea _clamp,a1 subq.l #8,d6 ; correct row_size moveq #7,d4 cdct_all_rows: REPT 2 move.w (a0)+,d1 move.w (a1,d1.w*2),d5 move.w (a0)+,d1 move.b (a1,d1.w*2),d5 swap d5 move.w (a0)+,d1 move.w (a1,d1.w*2),d5 move.w (a0)+,d1 move.b (a1,d1.w*2),d5 move.l d5,(a3)+ ENDR add.l d6,a3 dbra d4,cdct_all_rows movem.l (A7)+,D4-D7/A3 rts @ReconPMBlock: SUB.W #$1c,A7 MOVEM.L D2/D3/D4/D6/D7/A2/A3/A5,-(A7) MOVE.L D0,D4 MOVE.L $c(A0),D7 MOVE.L $178(A0),A3 MOVE.L $86(A0),D2 DIVu.w D7,D2 moveq #0,d6 move.w d2,d6 swap d2 LEA $24(A7),A5 ext.l d2 MOVE.L D0,(A5)+ MOVE.L D1,(A5)+ MOVE.L A0,(A5)+ MOVEQ.L #$4,D0 CMP.L D0,D4 BGE.B ReconPMBlock__12 ReconPMBlock__2: MOVEQ.L #$1,D0 AND.L D1,D0 MOVEQ.L #$1,D3 LEA $40(A7),A5 AND.L (A5),D3 aSR.L #$1,D1 MOVE.L D1,$28(A7) MOVE.L (A5),D1 aSR.L #$1,D1 MOVE.L (A3),A2 MOVE.L D1,(A5)+ MOVE.L D0,$34(A7) MOVE.L D3,$30(A7) MOVEQ.L #$3,D0 CMP.L $4e(A0),D0 BNE.B ReconPMBlock__5 ReconPMBlock__3: MOVE.L $170(A0),A1 BRA.B ReconPMBlock__7 ReconPMBlock__5: MOVE.L $174(A0),A1 ReconPMBlock__7: MOVE.L A1,D3 BEQ ReconPMBlock__34 ; error, no future/past frame! not in the original code! MOVE.L (A1),A3 ReconPMBlock__8: lSL.L #$4,D7 MOVE.L D6,D0 lSL.L #$4,D0 MOVE.L D2,D6 lSL.L #$4,D6 MOVE.L D0,$38(A7) MOVEQ.L #$1,D1 CMP.L D1,D4 BLE.B ReconPMBlock__10 ReconPMBlock__9: ADDQ.L #$8,$38(A7) ReconPMBlock__10: BTST #$0,D4 BEQ.W ReconPMBlock__24 ReconPMBlock__11: ADDQ.L #$8,D6 BRA.W ReconPMBlock__24 ReconPMBlock__12: MOVEQ.L #$2,D0 AND.L D1,D0 aSR.L #$1,D0 MOVEQ.L #$2,D3 LEA $40(A7),A5 AND.L (A5),D3 aSR.L #$2,D1 MOVE.L D1,$28(A7) MOVE.L (A5),D1 aSR.L #$2,D1 lSL.L #$3,D7 MOVE.L D1,(A5)+ MOVE.L D6,D1 lSL.L #$3,D1 MOVE.L D2,D6 lSL.L #$3,D6 MOVE.L D1,$38(A7) MOVE.L D0,$34(A7) MOVE.L D3,$30(A7) move.l $4e(a0),d0 subq.l #$3,d0 bne.s ReconPMB_11 MOVE.L $170(A0),A1 bra.s ReconPMB_12 ReconPMB_11: MOVE.L $174(A0),A1 ReconPMB_12: move a1,d0 beq ReconPMBlock__34 ; no future/past frame! SUBQ.L #$4,D4 BNE.B ReconPMBlock__18 ReconPMBlock__13: MOVE.L $4(A3),A2 MOVE.L $4(A1),A3 BRA.B ReconPMBlock__24 ReconPMBlock__18: MOVE.L $8(A3),A2 MOVE.L $8(A1),A3 ReconPMBlock__24: MOVE.L $38(A7),D1 MULS.w D7,D1 MOVE.L A3,A5 ADD.L D6,D1 ADD.L D1,A2 MOVE.L $38(A7),D1 ADD.L $40(A7),D1 MULs.w D7,D1 ADD.L D6,D1 ADD.L $28(A7),D1 ADD.L D1,A5 MOVE.L $30(A7),D1 MOVE.L $34(A7),D2 MOVE.L $44(A7),D3 TST.L D1 BNE ReconPMBlock__29 ReconPMBlock__25: TST.L D2 BNE ReconPMBlock__29 ReconPMBlock__26: subq.l #8,d7 ; correct row_size TST.L D3 BNE.B ReconPMBlock__28 ReconPMBlock__27: lea _clamp,a3 LEA $d2(A0),A1 moveq #7,d0 bmcm_all_rows1: REPT 2 move.l (a5)+,d3 moveq #0,d1 move.b d3,d1 lsr.l #8,d3 moveq #0,d4 move.b d3,d4 lsr.w #8,d3 add.l (a1)+,d3 move.w d3,d2 swap d3 move.w (a3,d3.w*2),d3 move.b (a3,d2.w*2),d3 swap d3 add.w (a1)+,d4 add.w (a1)+,d1 move.w (a3,d4.w*2),d3 move.b (a3,d1.w*2),d3 move.l d3,(a2)+ ENDR add.l d7,a2 add.l d7,a5 dbra d0,bmcm_all_rows1 bra ReconPMBlock__34 ReconPMBlock__28: moveq #3,d1 bm_all_rows1: rept 2 move.l (a5)+,(a2)+ move.l (a5)+,(a2)+ add.l d7,a2 add.l d7,a5 endr dbra d1,bm_all_rows1 bra ReconPMBlock__34 ReconPMBlock__29: sub.l a3,a3 TST.L D1 BEQ.B ReconPMBlock__31 ReconPMBlock__30: move.l d7,a3 ReconPMBlock__31: add.L A5,A3 ADD.L D2,A3 subq.l #8,d7 ; correct row_size move.l #$fefefefe,d4 moveq #7,d0 TST.L D3 BNE ReconPMBlock__33 ReconPMBlock__32: MOVE.L $2c(A7),A1 ADD.W #$d2,A1 lea _clamp,a0 bimcm_all_rows1: REPT 2 move.l (a5)+,d1 move.l (a3)+,d3 and.l d4,d1 and.l d4,d3 add.l d1,d3 roxr.l #1,d3 ; tricky! get bit #32 from the previous addition moveq #0,d1 move.b d3,d1 lsr.l #8,d3 moveq #0,d6 move.b d3,d6 lsr.w #8,d3 ; *grin evilly* eadiz, peecee *strut* add.l (a1)+,d3 move.w d3,d2 swap d3 move.w (a0,d3.w*2),d3 move.b (a0,d2.w*2),d3 swap d3 add.w (a1)+,d6 add.w (a1)+,d1 move.w (a0,d6.w*2),d3 move.b (a0,d1.w*2),d3 move.l d3,(a2)+ ENDR add.l d7,a2 add.l d7,a5 add.l d7,a3 dbra d0,bimcm_all_rows1 BRA ReconPMBlock__34 ReconPMBlock__33: bim_all_rows1: REPT 2 move.l (a5)+,d1 move.l (a3)+,d2 and.l d4,d1 and.l d4,d2 add.l d1,d2 roxr.l #1,d2 ; tricky! get bit no 32 from the previous addition move.l d2,(a2)+ ; this one kicks ass !!! ENDR add.l d7,a2 add.l d7,a5 add.l d7,a3 dbra d0,bim_all_rows1 ReconPMBlock__34: MOVEM.L (A7)+,D2/D3/D4/D6/D7/A2/A3/A5 ADD.W #$1c,A7 RTS @ReconBMBlock: SUB.W #$1c,A7 MOVEM.L D2/D3/D4/D6/D7/A2/A3/A5,-(A7) MOVE.L D0,D4 MOVE.L $c(A0),D7 MOVE.L $178(A0),A3 MOVE.L $86(A0),D2 DIVu.w D7,D2 moveq #0,d6 move.w d2,d6 swap d2 LEA $24(A7),A5 ext.l d2 MOVE.L D0,(A5)+ MOVE.L D1,(A5)+ MOVE.L A0,(A5)+ MOVEQ.L #$4,D0 CMP.L D0,D4 BGE.B ReconBMBlock__12 ReconBMBlock__2: MOVEQ.L #$1,D0 AND.L D1,D0 MOVEQ.L #$1,D3 LEA $40(A7),A5 AND.L (A5),D3 aSR.L #$1,D1 MOVE.L D1,$28(A7) MOVE.L (A5),D1 aSR.L #$1,D1 MOVE.L (A3),A2 MOVE.L D1,(A5)+ MOVE.L D0,$34(A7) MOVE.L D3,$30(A7) MOVE.L $4e(A0),D1 MOVE.L $174(A0),A1 MOVE.L A1,D3 BEQ.B ReconPMBlock__34 MOVE.L (A1),A3 lSL.L #$4,D7 MOVE.L D6,D0 lSL.L #$4,D0 MOVE.L D2,D6 lSL.L #$4,D6 MOVE.L D0,$38(A7) MOVEQ.L #$1,D1 CMP.L D1,D4 BLE.B ReconBMBlock__10 ReconBMBlock__9: ADDQ.L #$8,$38(A7) ReconBMBlock__10: BTST #$0,D4 BEQ.W ReconPMBlock__24 ReconBMBlock__11: ADDQ.L #$8,D6 BRA.W ReconPMBlock__24 ReconBMBlock__12: MOVEQ.L #$2,D0 AND.L D1,D0 aSR.L #$1,D0 MOVEQ.L #$2,D3 LEA $40(A7),A5 AND.L (A5),D3 aSR.L #$2,D1 MOVE.L D1,$28(A7) MOVE.L (A5),D1 aSR.L #$2,D1 lSL.L #$3,D7 MOVE.L D1,(A5)+ MOVE.L D6,D1 lSL.L #$3,D1 MOVE.L D2,D6 lSL.L #$3,D6 MOVE.L D1,$38(A7) MOVE.L D0,$34(A7) MOVE.L D3,$30(A7) bra ReconPMB_11 @ReconBiMBlock: SUB.W #$1c,A7 MOVEM.L D2-D7/A2/A3/A5/A6,-(A7) MOVE.L D0,D4 MOVE.L $c(A0),D7 MOVE.L $86(A0),D5 DIVS.w D7,d5 moveq #0,d6 move.w d5,d6 swap d5 ext.l d5 LEA $2c(A7),A6 MOVE.L $178(A0),A3 MOVE.L D0,(A6)+ MOVE.L D1,(A6)+ MOVE.L A0,(A6)+ CMP.w #4,D4 BGE.s ReconBiMBlock__11 ReconBiMBlock__2: MOVE.L (A3),a1 MOVE.L $170(A0),A6 MOVE.L A6,D2 BEQ ReconBiMBlock__23 ; no frame MOVE.L (A6),A3 MOVE.L $174(A0),A6 MOVE.L A6,D2 BEQ ReconBiMBlock__23 MOVE.L (A6),A2 lSL.L #$4,D7 MOVE.L D6,D0 lSL.L #$4,D0 MOVE.L D5,D6 lSL.L #$4,D6 MOVE.L D7,$3c(A7) MOVE.L D0,$40(A7) CMP.w #1,D4 BLE.s ReconBiMBlock__8 ReconBiMBlock__7: ADDQ.L #$8,$40(A7) ReconBiMBlock__8: BTST #$0,D4 BEQ.B ReconBiMBlock__10 ReconBiMBlock__9: ADDQ.L #$8,D6 ReconBiMBlock__10: MOVE.L D1,D7 ASR.L #$1,D7 LEA $48(A7),A6 ADD.L D6,D7 MOVE.L (A6)+,D5 ASR.L #$1,D5 MOVE.L $40(A7),D0 ADD.L D0,D5 MOVE.L (A6)+,D1 ASR.L #$1,D1 ADD.L D6,D1 MOVE.L (A6)+,D2 ASR.L #$1,D2 ADD.L D0,D2 MOVE.L D2,$50(A7) MOVE.L D1,$4c(A7) BRA ReconBiMBlock__20 ReconBiMBlock__11: MOVE.L D7,D2 lSL.L #$3,D2 MOVE.L D6,D3 lSL.L #$3,D3 MOVE.L D5,D6 lSL.L #$3,D6 ASR.L #$2,D1 LEA $48(A7),A6 ADD.L D6,D1 MOVE.L D1,D7 MOVE.L (A6)+,D5 ASR.L #$2,D5 ADD.L D3,D5 MOVE.L (A6)+,D1 ASR.L #$2,D1 ADD.L D6,D1 MOVE.L (A6)+,D0 ASR.L #$2,D0 ADD.L D3,D0 MOVE.L D0,$50(A7) MOVE.L D1,$4c(A7) MOVE.L D2,$3c(A7) MOVE.L D3,$40(A7) SUBQ.L #$4,D4 BNE.s ReconBiMBlock__16 ReconBiMBlock__12: MOVE.L $4(A3),a1 MOVE.L $170(A0),A6 MOVE.L A6,D1 BEQ ReconBiMBlock__23 MOVE.L $4(A6),A3 MOVE.L $174(A0),A6 MOVE.L A6,D1 BEQ ReconBiMBlock__23 MOVE.L $4(A6),A2 BRA.B ReconBiMBlock__20 ReconBiMBlock__16: MOVE.L $8(A3),a1 MOVE.L $170(A0),A6 MOVE.L A6,D1 BEQ ReconBiMBlock__23 MOVE.L $8(A6),A3 MOVE.L $174(A0),A6 MOVE.L A6,D1 BEQ ReconBiMBlock__23 MOVE.L $8(A6),A2 ReconBiMBlock__20: MOVE.L $3c(A7),D2 MOVE.L $40(A7),D1 MULS.w D2,D1 ADD.L D6,D1 MULS.w D2,D5 ADD.L D1,A1 MOVE.L A1,A5 ADD.L D7,D5 MOVE.L $50(A7),D1 MULS.w D2,D1 ADD.L D5,A3 ADD.L $4c(A7),D1 ADD.L D1,A2 subq.l #8,d2 ; correct row_size move.l #$fefefefe,d4 moveq #7,d0 TST.L $54(A7) BNE ReconBiMBlock__22 ReconBiMBlock__21: LEA $d2(A0),A1 lea _clamp,a0 bimcm_all_rows3: REPT 2 move.l (a3)+,d1 move.l (a2)+,d3 and.l d4,d1 and.l d4,d3 add.l d1,d3 roxr.l #1,d3 ; tricky! get bit #32 from the previous addition moveq #0,d1 move.b d3,d1 lsr.l #8,d3 moveq #0,d6 move.b d3,d6 lsr.w #8,d3 ; *grin evilly* eadiz, peecee *strut* add.l (a1)+,d3 move.w d3,d7 swap d3 move.w (a0,d3.w*2),d3 move.b (a0,d7.w*2),d3 swap d3 add.w (a1)+,d6 add.w (a1)+,d1 move.w (a0,d6.w*2),d3 move.b (a0,d1.w*2),d3 move.l d3,(a5)+ ENDR add.l d2,a5 add.l d2,a3 add.l d2,a2 dbra d0,bimcm_all_rows3 BRA.s ReconBiMBlock__23 ReconBiMBlock__22: bim_all_rows3: REPT 2 move.l (a3)+,d1 move.l (a2)+,d7 and.l d4,d1 and.l d4,d7 add.l d1,d7 roxr.l #1,d7 ; tricky! get bit no 32 from the previous addition move.l d7,(a5)+ ; this one kicks ass !!! ENDR add.l d2,a5 add.l d2,a3 add.l d2,a2 dbra d0,bim_all_rows3 ReconBiMBlock__23: MOVEM.L (A7)+,D2-D7/A2/A3/A5/A6 ADD.W #$1c,A7 RTS END