|
;--------------------- ;JPEG编码 ;--------------------- JPEGEN.ASM .MMREGS .GLOBAL JPEG_EN .DEF JPEG_EN .DEF J_STATUS,J_STACK .REF PICT,NEXT_LINE .REF IMAGE_LENGTH,IMAGE_WIDTH .REF BLOCK_ENCODE,HUFF_EN .REF DCT_CODE,Y_QUANTIZE_TABLE
.REF QUANT_TABLE,ZIGZAG_TABLE .REF DCTB1,COMPRESS_DATA .REF MASKDATA,MASKSIZE,EOB .REF DIFF1,RZERO,IN_SIZE,COWORD .REF ABSDIFF,ABSDIFF1,TRANSDIFF .REF DC_HEAD,DC_TAIL,LESS_BIT .REF DIFF,USER_BIT,RNDOFF .REF LAST_DC,LAST_RESULT .REF ZIGZAG_TABLE0,RDCHUFF .REF DCHUFF,NEXT_SECTION .BSS J_STATUS,2
J_STACK .USECT "J_STACK",10H DCTB1_ADDR .SET DCTB1 .TEXT
JPEG_EN:
;---------------------- ;保存程序运行环境 ;---------------------- MVMD ST0,J_STATUS MVMD ST1,J_STATUS+1 LD #J_STACK,DP MVMD AR1,J_STACK+1 MVMD AR2,J_STACK+2 MVMD AR3,J_STACK+3 MVMD AR4,J_STACK+4 MVMD AR5,J_STACK+5 POPD J_STACK+8 ;------------------------ ;JPEG编码初始化 ;------------------------
CALL JPEG_EN_INIT STM #IMAGE_WIDTH-1,AR7 BLOCKEN_LOOP0: STM #IMAGE_LENGTH-1,AR6 BLOCKEN_LOOP: ;-------------------------- ;块编码 ;-------------------------- CALL BLOCK_INIT CALL BLOCK_ENCODE MAR AR6 BANZ BLOCK_LOOP,#AR6- STM #NEXT_SECTION,AR0 MAR AR4 MAR *AR4+0 MAR AR7 BANZ BLOCKEN_LOOP0,*AR7- ;---------------------------- ;恢复程序运行环境 ;----------------------------
LD #J_STACK,DP PSHD J_STACK+8 MVMD J_STACK+5,AR5 MVMD J_STACK+4,AR4 MVMD J_STACK+3,AR3 MVMD J_STACK+2,AR2 MVMD J_STACK+1,AR1 LD #0,DP MVMD J_STATUS+1,ST1 MVMD J_STATUS,ST0 RET ;-------------------------- ;块编码初始化 ;-------------------------- BLOCK_INIT; STM #NEXT_LINE,AR0 MAR AR4 RPT #7 MVDK *AR4,#DCTB1 MAR *AR4+0 RPT #7 MVDK *AR4+,#DCTB1+8 MAR *AR4+0 RPT #7 MVDK *AR4+,#DCTB1+16 MAR *AR4+0 PRT #7 MVDK *AR4+,#DCTB1+24 MAR *AR4+0 RPT #7 MVDK *AR4+,#DCTB1+32 MAR *AR4+0 RPT #7 MVDK *AR4+,#DCTB1+40 MAR *AR4+0 RPT #7 MVDK *AR4+,#DCTB1+48 MAR *AR4+0 RPT #7 MVDK *AR4+,#DCTB1+56 STM #NEXT_SECTION,AR0 MAR *AR4-0 MAR AR2 STM #DCTB1,AR2 STM #63,AR3 JI_LOOP: MAR AR2 LD *AR2,A SUB #128,A STLM A,*AR2+ MAR AR3 BANZ JI_LOOP,*AR3- LD #RNDOFF,DP STM #800OH,RNDOFF RET ;---------------------------- ;JPEG编码初始化 ;包括DCT、量化和Huffman编码三部分 ;----------------------------- JPEG_EN_INIT: DCT_INIT ORM #0000H,PMST RSBX OVLY SSBX SXM SSBX OVM MAR AR5 STM #0FF00H,AR5 RPT #63 MVPD #DCT_COEF,*AR5+ ORM #0020H,PMST SSBX OVLY QUANT_INIT MAR AR5 STM #QUANT_TABLE,AR5 RPT #63 MVPD #Y_QUANTIZE_TABLE,*AR5+ STM #ZIGZAG_TABLE,AR5 RPT #63 MVPD #ZIGZAG_TABLE0,*AR5+ HUFFEN_INIT: STM #DCHUFF,AR1 MAR AR1 RPT #220 MVPD #RDCHUFF,*AR1+ STM #COMPRESS_DATA,AR1 LD #0,A RPT #255 STM 0,*AR1+ STM #COMPRESS_DATA,AR5 STM #PICT,AR4 LD #DIFF,DP ST #0FFF0H,MASKDATA ST #0F000H,MASKSIZE ST #0AH,EOB ST #0H,LAST_DC ST #0H,LAST_RESULT ST #010H,USER_BIT ST #0H,LESS_BIT RET ;------------------------ ;块编码 ;------------------------ BLOCKEN.ASM .MMREGS .DEF BLOCK_ENCODE,IDCT .DEF RNDOFF,BLK2_ADDR,DCTB1 .DEF QUANT_TABLE,ZIGZAG_TABLE .DEF B_STATUS,B_STACK .REF DCT_CODE,Y_QUANTIZE_TABLE .REF MAX_VALUE,MIN_VALUE .DEF DIFF,DIFF1,ABSDIFF,ABSDIFF1 .DEF RZERO,IN_SIZE,COWORD,EOB .DEF MASKDATA,MASKSIZE .DEF SRC,DST,DC_TAIL,DC_HEAD .DEF ACHUFF,DCHUFF,LMASK .DEF QZBI,QZBR,LESS_BIT,DATA .DEF HUFF_EN,DCT2,EOB_SIZE .DEF DCHUFF,TRANSDIFF,LAST_DC .DEF LAST_RESULT,USER_BIT .REF RDCHUFF,DIFFSIZE .REF COMPRESS_DATA .REF ZIGZAG_TABLE0 B_STACK .USER".B_STACK",10H
RNDOFF .USECT".DCT_VAR",1 DCTB1 .USECT"DCT_BLK",64 DCTB2 .USECT"DCT_BLK",64 QZBI .USECT".QZ_BLK",64 QZBR .USECT".QZ_BLK",64 QUANT_TABLE .USECT".QZ_TBL",64 ZIGZAG_TABLE .USECT".QZ_TBL",64 DIFF .USECT".HUF_VAR",1 DIFF1 .USECT".HUF_VAR",1 ABSDIFF .USECT".HUF_VAR",1 ABSDIFF1 .USECT".HUF_VAR",1 RZERO .USECT".HUF_VAR",1 IN_SIZE .USECT".HUF_VAR",1 COWORD .USECT".HUF_VAR",1 TRANSDIFF .USECT".HUF_VAR",1 MASKDATA .USECT".HUF_VAR",1 MASKSIZE .USECT".HUF_VAR",1 EOB .USECT".HUF_VAR",1 LAST_DC .USECT".HUF_VAR",1 LAST_RESULT .USECT".HUF_VAR",1 USER_BIT .USECT".HUF_VAR",1 LESS_BIT .USECT".HUF_VAR",1 DC_HEAD .USECT".HUF_VAR",1 DC TALL .USECT".HUF_VAR",1 BLOCK_NUMBER .USECT".HUF_VAR",1 SRC .USECT".HUF_VAR",1 DST .USECT".HUF_VAR",1 LENGTH .USECT".HUF_VAR",1 DATA .USECT".HUF_VAE",12R",1 DCHUFF .USECT"HUFTABL DIFFSIZE .USECT"HUFTABLE",16 LMASK .USECT"HUFTABLE",17 ACHUFF .USECT"HUFTABLE",176 .BSS B_STATUS,2 EOB_SIZE .SET 4 BLK2_ADDR.SET QZBR .TEXT BLOCK_ENCODE ;---------------------------------- ;保存程序运行环境 ;---------------------------------- MVMD ST0,B_STATUS MVMD ST1,B_STATUS+1 LD #B_STACK,DP MVMD AR1,B_STACK MVMD AR2,B_STACK+1 MVMD AR3,B_STACK+2 MVMD AR6,B_STACK+3 POPD B_STACK+4 ;---------------------------------- ;块编码包括DCT、量化和Huffman编码三部分 ;---------------------------------- CALL DCT CALL QUANT CALL HUFF_EN ;---------------------------------- ;恢复程序运行环境 ;---------------------------------- LD #B_STACK,DP PSHD B_STACK+4 MVDM B_STACK+3,AR6 MVDM B_STACK+2,AR3 MVDM B_STACK+1,AR2 MVDM B_STACK,AR1 LD #0,DP MVDM B_STATUS+1,ST1 MVDM B_STATUS,ST0 RET ;----------------------------------- ;DCT与IDCT ;----------------------------------- IDCT: DCT: STM #DCTB1,AR1 STM #DCTB2,AR2 CALL DCT1D STM #DCTB2,AR1 STM #DCTB1,AR2 CALL DCT1D RET ;----------------------------------- ;一维DCT变换 ;---------------------------------- DCT1D: STM #64,AR0 LD #RNDOFF,DP MAR AR1 STM #7,AR3 ROW1: MAR AR1 LD #0,A RPT #7 MACP *AR1+,0FF00H,A MAR AR2 ADDS RNDOFF,A STH A,*AR2+ MAR AR3 BANZ ROW1,*AR3- MAR *AR1-0 ST #7,AR3 ROW2: MAR AR1 LD #0,A RPT #7 MACP *AR1+,0FF08H,A MAR AR2 ADDS RNDOFF,A STH A,*AR2+ MAR AR3 BANZ ROW2,*AR3- MAR *AR1-0 ST #7,AR3 ROW3: MAR AR1 LD #0,A RPT #7 MACP *AR1+,0FF10H,A MAR AR2 ADDS RNDOFF,A STH A,*AR2+ MAR AR3 BANZ ROW3,*AR3- MAR *AR1-0 ST #7,AR3 ROW4: MAR AR1 LD #0,A RPT #7 MACP *AR1+,0FF18H,A MAR AR2 ADDS RNDOFF,A STH A,*AR2+ MAR AR3 BANZ ROW4,*AR3- MAR *AR1-0 ST #7,AR3 ROW5: MAR AR1 LD #0,A RPT #7 ADDS RNDOFF,A STH A,*AR2+ MAR AR3 BANZ ROW8,*AR3- MAR *AR1 RET ;------------------------ ;量化 ;注意ZIGZAG表的应用 ;量化间隔是不均匀的 ;------------------------ QUANT: STM #63,AR0 STM #DCTB1,AR1 STM #ZIGZAG_TABLE,AR2 STM #QUANT_TABLE,AR6 Q_LOOP: MAR AR2 MVDK *AR2+,AR3 MAR AR1 MVDK *AR1+,T MAR AR6 MPY *AR6+,A ADD #0,1,A,A MAR AR3 ADDS RNDOFF,A STH A,*AR3 MAR AR0 BANZ Q_LOOP,*AR0- RET ;------------------------ ;Huffman编码 ;------------------------ HUFF_EN: LD #DIFF,DP LD #0,A STL A,DIFF STL A,IN_SIZE STL A,RZERO DCENHUFF: MAR AR1 STM #QZBR,AR1 LD *AR1,A SUB LAST_DC,A CALL GSIZE MAR AR3 STM #DCHUFF,AR3 MVDM ABSDIFF,AR0 MAR *AR3+0 LD *AR3-0,12,A MAR AR5 CALL GCOWORD ACENHUFF: STM #QZBR,AR1 STM #3EH,AR6 MAR AR1 LD *AR1+,A STL A,LAST_DC CHECKZERO: LD *AR1+,A MAR AR6 BC CKZERO,AEQ CALL GSIZE CONCHECK: LD RZERO.A SUB #10H,A BC NEXT1,ALT LTD ABSDIFF LTD DIFF STL A,RZERO LD #07F9BH,12,A STL A,4,ABSDIFF STL A,4,DIFF CALL GCOWORD LD ABSDIFF1,A STL A,ABSDIFF LD DIFF1,A B CONCHECK NEXT1: RSBX SXM LD RZERO,A ADD ABSDIFF,4,A STL A,TRANSDIFF MAR AR3 MVDM ACHUFF,AR3 MVDM TRANSDIFF,AR0 MAR *AR3+0 BIT *AR3,15 BC NOUSER_16,NTC BIT *AR3,7 BC NOUSER_16,NTC USER_16: LD *AR3-0,16,A B CONTE NOUSER_16: LD *AR3-0,12,A MAR AR5 CONTE: MAR AR5 CALL GCOWORD LD #0,A STL A,RZERO MAR AR6 BANZ CHEKZERO,*ARC6- B INSERT_EOB CKZERO: MAR AR6 LD RZERO,A ADD #1H,A STL A,RZERO BANZ CHECKZERO,*AR6- INSERT_EOB: MAR AR3 STM ACHUFF,AR3 LD *AR3,12,A STL A,4,ABSDIFF STL A,4,DIFF CALL GCOWORD RET GSIZE: MAR AR2 STL A,DIFF BITF DIFF,#8000H BC POSTIVE,NTC NEGATIVE: ABS A CMPL A STL A,DIFF CMPL A POSTIVE: STL A,ABSDIFF AND MASKDATA,A MAR AR2 BC GETSIZE,AEQ LD ABSDIFF,12,A STH A,ABSDIFF LDU IN_SIZE,A ADD #04H,A STL A,IN_SIZE LDU ABSDIFF,A B POSTIVE GETSIZE: MAR AR2 STM DIFFSIZE,AR2 STM ABSDIFF,AR0 LD *AR2+0,A ADD IN_SIZE,A STL A,ABSDIFF STH A,IN_SIZE STM LMASK,AR2 STM ABSDIFF,AR0 LD *AR2+0,A AND DIFF,A RET GCOWORD: MAR AR5 STH A,COWORD AND MASKSIZE,A BC NOT_16,ANEQ ADD #10,12,A NOT_16: SUB USER_BIT,12,A NEG A STH A,4,USER_BIT BC SHIFT_LT,AGT NEWORDL: LD USER_BIT,A ADD #10H,A STL A,USER_BIT LD USER_BIT,T LD *AR5,16,A ADD COWORD,TS,A STH A,*AR5+ STL A,*AR5 B CONDIFF SHIFT_LT: LD USER_BIT,T LD *AR5,A ADD COWORD,TS,A STL A,*AR5 CONDIFF: LD USER_BIT,A SUB ABSDIFF,A STL A,USER_BIT BC NORMALS,AGT NEWORD2: ADD #10H,A STL A,USER_BIT LD USER_BIT,T LD *AR5,16,A ADD DIFF,TS,A STH A,*AR5+ STL A,*AR5 B ENDSUB
NORMALS: LD USER_BIT,T LD *AR5,A ADD DIFF,TS,A STL A,*AR5 ENDSUB: SSBX SXM RET ;----------------------- ;JPEG编码 ;----------------------- JPEGDE.ASM .MMREGS .DEF JPEG_DEC .REF PICT,NEXT_SECTION,NEXT_LINE .REF IMAGE_LENGTH,IMAGE_WIDTH .REF BLOCK_DECODE,DCTB1 .REF ZIGZAG_TABLE1,IDCT_COEF .REF J_STATUS,J_STACK,D12TAB .REF Y_DQUANTIZE_TABLE .REF RD48TAB,RD12TAB,LOWMASK .REF HDCDECODE_TABLE,DCDETAB .REF DZIGZAG_TABLE,DETABLE .REF DC_TAIL,DATA,LESS_BIT .REF DQZBR,DQZB1,DQUANT_TABLE .REF EMASK,COMPRESS_DATA,DST .REF MASKDATA,MASKSIZE,EOB .REF LASTRESULT,USER_BIT .REF LAST_DC BLOCK_RESULT .SET DCTB1 .TEXT JPEG_DEC: ;-------------------------------- ;保存程序运行环境 ;-------------------------------- MVMD ST0,J_STATUS MVMD ST1,J_STATUS+1 LD #J_STACK,DP MVMD AR1,J_STACK+1 MVMD AR2,J_STACK+2 MVMD AR3,J_STACK+3 MVMD AR4,J_STACK+4 MVMD AR5,J_STACK+5 MVMD AR6,J_STACK+6 MVMD AR7,J_STACK+7 POPD J_STACK+8 ;-------------------------------- ;JPEG解码初始化 ;-------------------------------- CALL JPEG_DEC-INIT STM #IMAGE_WIDTH-1,AR7 BLOCKDE_LOOP0: STM #IMAGE_LENGTH-1,AR6 BLOCKDE_LOOP: ;-------------------------------- ;块解码 ;-------------------------------- CALL BLOCK_DECODE CALL BLOCK_ASSEMBLE MAR AR6 BANZ BLOCKDE_LOOP,*AR6- STM #NEXT_SECTION,AR0 MAR AR5 MAR *AR5+0 MAR AR7 BANZ BLOCKDE_LOOP0,*AR7- ;----------------------------- ;JPEG输出 ;----------------------------- JPEGOUT: MAR AR4 STM #PICT,AR4 STM #(160*120/8)-1,AR7 JPEGOUT_LOOP: MAR AR4 PORTW *AR4+,0 PORTW *AR4+,0 PORTW *AR4+,0 PORTW *AR4+,0 PORTW *AR4+,0 PORTW *AR4+,0 PORTW *AR4+,0 PORTW *AR4+,0 MAR AR7 BANZ JPEGOUT_LOOP,*AR7- ;-------------------------------- ;恢复程序运行环境 ;-------------------------------- LD #J_STACK,DP PSHD J_STACK,DP MVMD AR7,J_STACK+7 MVMD AR6,J_STACK+6 MVDM J_STACK+5,AR5 MVDM J_STACK+4,AR4 MVDM J_STACK+3,AR3 MVDM J_STACK+2,AR2 MVDM J_STACK+1,AR1 LD #0,DP MVDM J_STATUS+1,ST1 MVDM J_STATUS,ST0 RET ;----------------------------- ;块充重组 ;----------------------------- BLOCK_ASSEMBLE: STM #NEXT_LINE,AR0 MAR AR5 RPT #7 MVKD #BLOCK_RESULT,*AR5+ MAR *AR5+0 RPT #7 MVKD #BLOCK_RESULT+8,*AR5+ MAR *AR5+0 RPT #7 MVKD #BLOCK_RESULT+16,*AR5+ MAR *AR5+0 RPT #7 MVKD #BLOCK_RESULT+24,*AR5+ MAR *AR5+0 RPT #7 MVKD #BLOCK_RESULT+32,*AR5+ MAR *AR5+0 RPT #7 MVKD #BLOCK_RESULT+40,*AR5+ MAR *AR5+0 RPT #7 MVKD #BLOCK_RESULT+48,*AR5+ MAR *AR5+0 RPT #7 MVKD #BLOCK_RESULT+56,*AR5+ STM #NEXT_SECTION,AR0 MAR *AR5-0 RET ;-------------------------------- ;JPEG解码初始化 ;包括DCT、量化和Huffman解码三部分 ;--------------------------------- JPEG_DEC_INIT: IDCT_INIT: SSBX SXM SSBX OVM MAR AR5 STM #0200H,AR5 RPT #63 MVPD #IDCT_COEF,*AR5+ DEQUANT_INIT: MAR AR5 STM #DQUANT_TABLE,AR5 RPT #63 MVPD #Y_DQUANTIZE_TABLE,*AR5+ STM #DZIGZAG_TABLE,AR5 RPT #63 MVPD #ZIGZAG_TABLE1,*AR5+ DEHUFF_INIT: MAR AR4 STM #DETABLE,AR4 RPT #250 MVPD #RD48TAB,*AR4+ STM #D12TAB,AR4 RPT #87 MVPD #RD12TAB,*AR4+ RPT #47 MVPD #HDCDECODE_TABLE,*AR4+ RPT #16 MVPD #LOWMASK,*AR4+ LD #MASKDATA,DP ST #0FFF0H,MASKDATA ST #0F000H,MASKSIZE ST #0AH,EOB ST #0H,LAST_DC ST #0H,LAST_RESULT ST #10H,USER_BIT ST #0H,LESS_BIT STM #COMPRESS_DATA,AR4 LD *AR4+,A MVMD AR4,DC_TALL STL A,DATA LD #DC_TAIL,DP STM DC_TAIL,AR4 STM #PICT,AR5 MVMD AR5,DST RET ;----------------------- ;块解码 ;----------------------- BLOCKDE.ASM .MMREGS .DEF BLOCK_DECODE,SIZE .DEF BLK1_ADDR,DQZB1,DQZBR .DEF EMASK,DETABLE,DCDETAB .DEF DQUANT_TABLE,F_TAB .DEF NEG_VSIZE,JUDGE_DATA .DEF DZIGZAG_TABLE,D12TAB .DEF COWORD_SIZE,V_SIZE .REF B_STATUS,B_STACK,IDCT .REF DC_TAIL,DATA,LAST_DC .REF EOB,ZIGZAG_TABLE1 .REF IDCT_COEF,LOWMASK .REF SRC,LAST_RESULT,LESS_BIT .REF Y_DQUANTIZE_TABLE .REF RD48TAB,RD12TAB,RZERO .REF MAX_VALUE,MIN_VALUE .REF COMPRESS_DATA,EOB_SIZE .REF COWORD,DCTB1,USER_BIT .REF DIFF,ABSDIFF
DQZBR .USECT"DQ_BLK",64 DQZB1 .USECT"DQ_BLK",64 DQUANT_TABLE .USECT"DQ_TBL",64 DZIGZAG_TABLE .USECT"DQ_TBL",64 DETABLE .USECT"DEHUFFTAB",251 D12TAB .USECT"DEHUFFTAB",88 DCDETAB .USECT"DEHUFFTAB",48 EMASK .USECT"DEHUFFTAB",17 F_TAB .USECT"HUF_VAR",1 SIZE .USECT"HUF_VAR",1 COWORD .USECT"HUF_VAR",1 V_SIZE .USECT"HUF_VAR",1 NEG_VSIZE .USECT"HUF_VAR",1 JUDGE_DATA .USECT"HUF_VAR",1 CHECKDC .USECT"HUF_VAR",1 BLK1_ADDR .SET DQZB1 .TEXT BLOCK_DECODE: ;----------------------------------- ;保存程序运行环境 ;----------------------------------- MVMD ST0,B_STATUS MVMD ST1,B_STATUS LD #B_STACK,DP MVMD AR1,B_STACK MVMD AR2,B_STACK+1 MVMD AR3,B_STACK+2 MVMD AR6,B_STACK+3 POPD B_STACK+4 ;-------------------------- ;Huffman解码、反量化,IDCT ;-------------------------- CALL HUFFDECODE CALL DQUANT CALL IDCT CALL JPEG_FINAL ;-------------------------- ;恢复程序运行环境 ;-------------------------- LD #B_STACK,DP PSHD B_STACK+4 STM B_STACK+3,AR6 STM B_STACK+2,AR3 STM B_STACK+1,AR2 STM B_STACK,AR1 LD #0,DP STM B_STATUS+1,ST1 STM B_STATUS,ST0 RET JPEG_FINAL: STM #DCTB1,AR2 STM #63,AR3 MAR AR2 BOUND: LD *AR2,A BC NEG_BOUND,ALT SUB #MAX_VALUE,A BC END_BOUND,ALT LD #MAX_VALUE,A STL A,*AR2 B END_BOUND NEG_BOUND: SUB #MIN_VALUE,A BC END_BOUND,AGT LD #MIN_VALUE,A STL A,*AR2+ B END_BOUND END_BOUND: MAR *AR2+ MAR AR0 BANZ BOUND,*AR0- ADD_128: MAR AR2 STM #DCTB1,AR2 STM #63,AR3 JF_LOOP: MAR AR2 LD *AR2,A ADD #128,A STL A,*AR2+ MAR AR3 BANZ JF_LOOP,*AR3- RET ;---------------------------- ;反量化 ;---------------------------- DQUANT: STM #63,AR0 STM #DQZBR,AR2 STM #DZIGZAG_TABLE,AR3 STM #DQUANT_TABLE,AR6 DQ_LOOP: MAR AR3 MVDK *AR3+,AR1 MAR AR1 LD *AR1+,T MAR AR6 MPY *AR6+,A STL A,*AR2+ MAR AR0 BANZ DQ_LOOP,*AR0- RET ;--------------------------- ;Huffman解码 ;--------------------------- HUFFDECODE: RSBX SXM LD #0,A MAR AR3 STM #DQZB1,AR3 RPT #63 STL A,*AR3+ DC_DECODE: STM #DQZB1,AR3 MAR AR4 LD #LESS_BIT,DP ST #0FFFFH,CHECK_DC LD LESS_BIT,T LD DATA 16,A ADD AR4,TS,A STH A,JUDGE_DATA LD JUDGE_DATA,4,A STH A,ABSDIFF LD ABSDIFF,A SUB #0FH,A BC GDCANS,ALT LD JUDGE_DATA,8,A STH A,ABSDIFF LD ABSDIFF,A SUB #0FFH,A BC DCCWLT9B,ALT LD JUDGE_DATA,12,A AND #0FH,A ADD #20H,A STL A,ABSDIFF B GDCANS DCCWLT9B: LD ABSDIFF,A AND #0FH,A ADD #10H,A ;ABSDIFF+=16 STL A,ABSDIFF GDCANS: MAR AR2 STM DCDETAB,AR2 STMAR0,ABSDIFF MAR *AR2-0 LD *AR2-0,8,A AND #00FFH,8,A STL A,F_TAB CALL GET_VEN MAR AR3 MAR *AR3- LD *AR3,A ADD LAST_DC,A STL A,*AR3+ MAR AR4 STL A,LAST_DC STM #63,AR6 AC_DECODE: MAR AR4 ST #0,CHECK_DC STM DETABLE,AR2 LD LESS_BIT,T LD DATA,16,A ADD *AR4,TS,A STH A,JUDGE_DATA LD JUDGE_DATA,8,A STH A,ABSDIFF LD ABSDIFF,A SUB #0BFH,A BC NOZERO,ALEQ SUB #03BH,A BC WITHZERO,ALEQ LD JUDGE_DATA,A SUB #0FF81H,A BC BIT12,ALT BIT16: ADD #21H,A STL A,ABSDIFF LD LESS_BIT,T LD DATA,16,A ADD *AR4+,TS,A STL A,DATA MVMD AR4,DC_TAIL CALL JUMPZERO LD F_TAB,4,A AND #0F00H,A STL A,F_TAB ST #0FFFFH,CHECK_DC CALL GET_VEN END_ACDECODE: BANZ ACDECODE,*AR6- LD COWORD,A SUB EOB,A BC END_DECODE,AEQ LD EOB_SIZE.A CALL GET_COWORD STH A,COWORD END_DECODE: SSBX SXM RET BIT12: MAR AR2 LD JUDGE_DATA,12,A STH A,ABSDIFF LD ABSDIFF,A SUB #0FA0H-(0FAH+1H),A STL A,ABSDIFF WITHZERO: CALL JUMPZERO LD F_TAB,A AND #0FFH,8,A STL A,F_TAB CALL GET_VEN B END_ACDECODE NOZERO: MAR AR2 STM DETABLE,AR2 STM ABSDIFF,AR0 MAR *AR2+0 LD *AR2-0,A AND #0FFH,8,A STL,A,F_TAB CALL GET_VEN B END_ACDECODE JUMPZERO: MAR AR2 STM ABSDIFF,AR0 MAR *AR2+0 LD *AR2-0,A STL A,F_TAB AND 0FH,A STL A,RZERO STM RZERO,AR0 MAR AR3 MAR *AR3+0 MAR AR6 MAR *AR6-0 RET GET_VEN: LD F_TAB,4,A STH A,COWORD_SIZE AND #0F000H,A STH A,4,V_SIZE LD COWORD_SIZE,A CALL GET_COWORD STH A,COWORD LD CHECK_DC,A BC SKIP_EOB_CHECKING,ANEQ LD COWORD,A SUB EOB,A MAR AR6 BC FIND_EOB,AEQ SKIP_EOB_CHECKING: LD V_SIZE,A CALL GET_COWORD STH A,DIFF LD #16,A SUB V_SIZE,A STL A,NEG_VSIZE LD DIFF,A LD NEG_VSIZE,T BITT DIFF BC DPOSTIVE,TC MAR AR1 STM EMASK,AR1 STM V_SIZE,AR0 MAR *AR1+0 LD *AR1-0,A CMPL A OR DIFF,A ADD #1H,A DPOSITIVE: MAR AR3 STL A,*AR3+ MAR AR6 MAR *AR6- RET FIND_EOB: STM #0,AR6 RET GET_COWORD: MAR AR4 STL A,SIZE SUB USER_BIT,A STL A,LESS_BIT NEG A LD SIZE,T BC GET_NEWWORD,ALEQ STL A,USER_BIT LD DATA,TS,A STL A,DATA B END_GCOWORD GET_NEWWORD: ADD #10H,A STL A,USER_BIT LD DATA,TS,A LD LESS_BIT,T ADD *AR4+,TS,A STH A,DIFF STL A,DATA MVMD AR4,DC_TAIL LD DC_TAIL,A STL A,DC_TAIL STM DC_TAIL,AR4 LD DIFF,16,A END_GCOWORD: RET ;----------------------------- ;变量与系数表 ;----------------------------- TABLES.ASM .MMREGS .DEF MAX_VALUE,MIN_VALUE .DEF DCT_COEF,Y_QUANT_TABLE,ZIGZAG_TABLE0,UV_QUANT_TABLE .DEF IDCT_COEF,Y_DQUANTIZE_TABLE .DEF RDCHUFF,RACHUFF .DEF RD48TAB,RD12TAB,LOWMASK .DEF RDCHUFF .DEF HDCDECODE_TABLE .DEF IMAGE_LENGTH,IMAGE_WIDTH,NEXT .DEF COMPRESS_DATA .REF BLK2_ADDR,DIFFSIZE .DEF PICT IMAGE_LENGTH .SET 160/8 IMAGE_WIDTH .SET 120/8 NEXT_LINE .SET 152 NEXT_SECTION .SET 7*160 COMPRESS_DATA .USECT".JPEGEN",800H PICT .USECT".PICTURE",8000H MAX_VALUE .SET-255/2-1 MIN_VALUE .SECT"JPEG_TBL" DCT_COEF: .word 23170,23170,23170,23170,23170,23170,23170,23170 .word 32138,27246,18205,6393,-6393,-18205,-27246,-32138 .word 30274,12540,-12540,-30274,-30274,-12540,12540,30274 .word 27246,-6393,-32138,-18205,18205,32138,6393,27246 .word 23170,-23170,-23170,23170,23170,-23170,-23170,23170 .word 18205,-32138,6393,27246,-27246,-6393,32138,-18205 .word 12540,-30274,30274,-12540,-12540,30274,-30274,12540 .word 6393,-18205,27246,-32138,32138,-27246,18205,-6393 IDCT_COEF: .word 32170,32138,30274,27246,23170,18205,12540,6393 .word 32170,27246,12540,-6393,-23170,-32138,-30274,-18205 .word 32170,18205,-12540,-32138,-23170,6393,30274,27246 .word 32170,6393,-30274,-18205,23170,27246,-12540,-32138 .word 32170,-6393,-30274,18205,23170,-27246,-12540,32138 .word 32170,-18205,-12540,32138,-23170,-6393,30274,-27246 .word 32170,-27246,12540,6393,-23170,32138,-30274,18205 .word 32170,-32138,30274,-27246,23170,-18205,12540,-6393 Y_QUANT_TABLE: .word 2048,2979,3277,2048,1365,819,643,537 .word 2731,2731,2341,1725,1260,565,546,596 .word 2341,2521,2048,1365,819,575,475,585 .word 2341,1928,1489,1130,643,377,410,529 .word 1820,1489,886,585,482,301,318,426 .word 1365,936,596,512,405,315,290,356 .word 669,512,420,377,318,271,273,324 .word 455,356,345,334,293,328,318,331 UV_QUANT_TABLE: .word 1928,1820,1365,697,331,331,331,331 .word 1820,1560,1260,496,331,331,331,331 .word 1365,1260,585,331,331,331,331,331 .word 697,496,331,331,331,331,331,331 .word 331,331,331,331,331,331,331,331 .word 331,331,331,331,331,331,331,331 .word 331,331,331,331,331,331,331,331 .word 331,331,331,331,331,331,331,331 Y_DQUANTIZE_TABLE: .word 16,11,10,16,24,40,51,61 .word 12,12,14,19,26,58,60,55 .word 14,13,16,24,40,57,69,56 .word 14,17,22,29,51,87,80,62 .word 18,22,37,56,68,109,103,77 .word 24,35,55,64,81,104,113,92 .word 49,64,78,87,103,121,120,101 .word 72,92,95,98,112,100,103,99 UV_DQUANTIZE_TABLE: .word 17,18,24,47,99,99,99,99 .word 18,21,26,66,99,99,99,99 .word 24,26,56,99,99,99,99,99 .word 47,66,99,99,99,99,99,99 .word 99,99,99,99,99,99,99,99 .word 99,99,99,99,99,99,99,99 .word 99,99,99,99,99,99,99,99 .word 99,99,99,99,99,99,99,99 ZIGZAG_TABLE0: .word 0+BLK2_ADDR,1+BLK2_ADDR,5+BLK2_ADDR,6+BLK2_ADDR .word 14+BLK2_ADDR,15+BLK2_ADDR,27+BLK2_ADDR,28+BLK2_ADDR .word 2+BLK2_ADDR,4+BLK2_ADDR,7+BLK2_ADDR,13+BLK2_ADDR .word 16+BLK2_ADDR,,26+BLK2_ADDR,29+BLK2_ADDR,42+BLK2_ADDR .word 3+BLK2_ADDR,8+BLK2_ADDR,12+BLK2_ADDR,17+BLK2_ADDR .word 25+BLK2_ADDR,30+BLK2_ADDR,41+BLK2_ADDR,43+BLK2_ADDR .word 9+BLK2_ADDR,11+BLK2_ADDR,18+BLK2_ADDR,24+BLK2_ADDR .word 31+BLK2_ADDR,40+BLK2_ADDR,44+BLK2_ADDR,53+BLK2_ADDR .word 10+BLK2_ADDR,19+BLK2_ADDR,23+BLK2_ADDR,32+BLK2_ADDR .word 39+BLK2_ADDR,45+BLK2_ADDR,52+BLK2_ADDR,+BLK2_ADDR .word 20+BLK2_ADDR,22+BLK2_ADDR,33+BLK2_ADDR,38+BLK2_ADDR .word 46+BLK2_ADDR,51+BLK2_ADDR,55+BLK2_ADDR,60+BLK2_ADDR .word 21+BLK2_ADDR,34+BLK2_ADDR,37+BLK2_ADDR,47+BLK2_ADDR .word 50+BLK2_ADDR,56+BLK2_ADDR,59+BLK2_ADDR,61+BLK2_ADDR .word 35+BLK2_ADDR,36+BLK2_ADDR,48+BLK2_ADDR,49+BLK2_ADDR .word 57+BLK2_ADDR,58+BLK2_ADDR,62+BLK2_ADDR,63+BLK2_ADDR RDCHUFF: .word 0002h,0023h,0033h,0043h,0053h,0063h .word 00e4h,01e5h,03e6h,07e7h,0fe8h,1fe9h DIFFSIZE: .word 0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4 LOWMASK: .word 0000h,0001h,0003h,0007h,000fh,001fh,003fh,007fh .word 00ffh,01ffh,03ffh,07ffh,0ffffh,1fffh,3fffh,7fffh .word 0ffffh RACHUFF: .word 000a4h,0000h,0000h,0000h,0000h,0000h,0000h,0000h .word 0000h,0000h,0000h,0000h,0000h,0000h,0000h,07f9bh .word 00002h,000c4h,001c5h,003a6h,003b6h,007a7h,007b7h,00fa8h .word 01f89h,01f99h,01fa9h,03f9ah,03faah,07f8bh,0ffebh,0fff5h .word 00012h,001b5h,00f98h,01f79h,03f8ah,07f7bh,0ff6ch,0ff7ch .word 0ff81h,0ffbeh,0ffc7h,0ffd0h,0ffd9h,0ffe2h,0ffech,0fff6h .word 00043h,00797h,03f7ah,0ff5ch,0f196h,0ff9eh,0ffa6h,0ffaeh .word 0ffb6h,0ffc8h,0ffd1h,0ffdah,0ffe3h,0ffedh,0fff7h,0fff9h .word 000b4h,01f69h,0ff4ch,0ff8fh,0ff97h,0ff9fh,0ffafh,0ffafh .word 0ffb7h,0ffc0h,0ffc9h,0ffd2h,0ffdbh,0ffe4h,0ffeeh,0fff8h .word 001a5h,07f6bh,0ff89h,0ff90h,0f198h,0ffa0h,0ffa8h,0ffb0h .word 0ff08h,0ffc1h,0ffcah,0ffd3h,0ffdch,0ffe5h,0ffefh,0fff9h .word 00787h,0ff84h,0ff3ah,0f191h,0f199h,0ffa1h,0ffa9h,0ffb1h .word 0ffb9h,0ffc2h,0ffcbh,0ffd4h,0ffddh,0ffe6h,0fff0h,0fffah .word 00f38h,0ff35h,0ff5bh,0ff92h,0ff9ah,0ffa2h,0ffaah,0ff02h .word 0ffbah,0ffc3h,0ffcch,0ffc1h,0ffdeh,0ffe7h,0fff1h,0fff0h .word 03f6ah,0ff96h,0f11ch,0ff93h,0f19bh,0ffa3h,0ffabh,0ffb3h .word 0ff0bh,0ffc4h,0ffcdh,0ffd6h,0ffdfh,0ffe8h,0fff2h,0fffch .word 0ff12h,0fh17h,0f1d1h,0ff94h,0ff9ch,0ffa4h,0ffach,0ffb4h .word 0ffbch,0ffc5h,0ffceh,0ffd7h,0ffe0h,offe9h,offf3h,0fffdh .word 0ff83h,0ff95h,0ff8eh,0f195h,0f1afh,0ffa5h,0ffadh,0ffb5h .word 0ffbdh,0ffc6h,0ffcfh,0ffd8h,0fffeh,10ffeah,0fff4h,0fffeh HDCDECODE_TABLE: .word 0020h,0020h,0020h,0020h,0031h,0031h,0032h,0032h .word 0033h,0033h,0034h,0034h,0035h,0035h,0046h,0000h .word 0057h,0057h,0057h,0057h,0057h,0057h,0057h,0057h .word 0068h,0068h,0068h,0068h,0079h,0079h,008ah,009bh .word 0000h,0000h,0000h,0000h,0000h,0000h,0000h,0000h .word 0000h,0000h,0000h,0000h,0000h,0000h,0000h,0000h
|