📄 jpeg.txt
字号:
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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -