📄 hzprnty.asm
字号:
;/********************************************************************************/
;/* HzPrnTy.ASM 为点阵式汉字打印机编写的汇编程序 */
;/* 晶 振: 11.0592M */
;/* 程 序 员: 张现 */
;/* 修改日期: 2003-5-27 */
;/********************************************************************************/
ORG 3h
AJMP 13h
PRNTINY SEGMENT CODE
RSEG PRNTINY
;///////////////////////////////////////////////////////////////////
;void BlockMove();
;============================
LINEBUF_LEN EQU 32
PUBLIC BlockMove
EXTRN DATA( pStr,CacheBuf )
;==================================================
BlockMove:
MOV R0, #CacheBuf-1
CLR A
CLR F0 ; 汉字边界
__Scan_Ret:
INC R0
INC A
CJNE @R0,#0Dh,__Not_Return
AJMP __Be_Return
__Not_Return:
XCH A, B
MOV A, @R0
CLR C
SUBB A, #0A0h
JC __Not_HanZi
CPL F0
__Not_HanZi:
XCH A, B
CJNE R0, #CacheBuf+15, __Scan_Ret
__Be_Return:
JNB F0, __Even_HanZi
DEC A
DEC R0
__Even_HanZi:
MOV R7, A
INC R0
MOV R1, #CacheBuf
CLR EA ; 关中断,以免 pStr
__Move_Next:
MOV A, @R0
MOV @R1, A
MOV @R0, #0
INC R0
INC R1
CJNE R0, #CacheBuf+LINEBUF_LEN,__Move_Next
CLR C
MOV A, pStr
SUBB A, R7
JNC __Less_Than_Zero
CLR A
__Less_Than_Zero:
MOV pStr, A
SETB EA ; 开中断
MOV C, F0
RET
;///////////////////////////////////////////////////////////////////
;bit GraphicLine();
;=====================================
PUBLIC GraphicLine
GraphicLine:
MOV R0, #CacheBuf
CJNE @R0, #1Bh, __Not_ESC
MOV A, #11
SUBB A, pStr
JNC __Not_ESC
MOV B, #12
MOV R1, #LineBuf
__Move_Next_Byte:
INC R0
MOV A, @R0
MOV @R1, A
INC R1
DJNZ B, __Move_Next_Byte
MOV A, #13
SETB F0
AJMP __Even_HanZi
__Not_ESC:
CLR C
RET
;///////////////////////////////////////////////////////////////////
;void FetchLine(unsigned char pLine);
;=====================================
PUBLIC _FetchOneLine
EXTRN DATA( Flag )
EXTRN CODE( HzCode12x12 ,Small_Alpha_Code6x8 ,BitMask )
;==================================================
_FetchOneLine:
MOV A, R7 ;
MOV C, ACC.0
MOV F0, C ; F0 = (pLine&1)
ANL Flag, #0E7h ; Flag &= ~(fgFound+fgReturn);
CLR A ; for(n=m=i=j=k=0; j<(sizeof(LineBuf)*8); j++)
MOV R5, A ; m=0
;MOV R4, A ; k=[R4:R6]=0;
MOV R3, A ; j=0
MOV R0, #CacheBuf ; i=0
MOV R1, #LineBuf ; n=0
__Loop_96Dots:
MOV A, R2 ; Tmp *= 2;
CLR C
RLC A
MOV R2, A
MOV A, @R0 ; if( CacheBuf[i]==0xD )
CJNE A, #0Dh,__IsNot_Return
ORL Flag, #10h
__IsNot_Return:
CLR C
SUBB A, #0A0h ; 啊: 0xB0A1
JC __Is_English_Char
;;;;;;;; 处理汉字
ACALL GetHzMatrix
;;;;;;;;;;;;;;;;;;;;;;;;;;
MOV B, A ;(HzCode12x12[k][(pLine*3+m/4)/2]
MOV A, R5
JNB F0 ,__Dont_Add_4
ADD A, #4
__Dont_Add_4:
ANL A, #7 ;BitMask[(m+((pLine&1)?4:0))&7])
MOV DPTR, #BitMask+2
MOVC A, @A+DPTR
ANL A, B
JZ __Dont_Add_Tmp
INC R2 ; Tmp++
__Dont_Add_Tmp:
INC R5
MOV A, R5
CLR C
SUBB A, #12
JC __Is_Return
ANL Flag, #0F7h
AJMP __Is_Return
__Is_English_Char:
MOV A, Flag ; else if( !(Flag&fgReturn) && (j%6) )
JB ACC.4, __Is_Return
MOV A, R3
MOV B, #6
DIV AB
MOV R6, B
DEC R6
MOV A, B
JZ __Is_Return
; if( (Small_Alpha_Code6x8[CacheBuf[i]-0x20][(j%6)-1] & BitMask[pLine]) ) Tmp++;
;;;;;;;; 处理西文字符
ACALL GetCharMatrix
MOV R6, A
MOV A, R7 ;BitMask[pLine]
MOV DPTR, #BitMask
MOVC A, @A+DPTR
ANL A, R6
JZ __Is_Return
INC R2 ; Tmp++;
__Is_Return:
MOV A, R3 ;if( !((j+1)%6) && !(Flag&fgReturn) )i++;
INC A
MOV B, #6
DIV AB
MOV A, B
JNZ __Dont_Add_i
MOV A, Flag
JB ACC.4, __Dont_Add_i
INC R0 ; i++
__Dont_Add_i:
MOV A, R3
INC A
ANL A, #7
JNZ __Dont_Add_n
MOV @R1, 2
INC R1
__Dont_Add_n:
INC R3
CJNE R3, #96, __Loop_96Dots
RET
;//////////////////////////////////////////////////////////////////////
; 取出汉字在汉字库中的数据: R0: 汉字指针,[R4:R6]= & HzCode12x12[k][0]
; 返回: A = HzCode12x12[k][(pLine*3+m/4)/2]
;//////////////////////////////////////////////////////////////////////
GetHzMatrix:
MOV A, Flag
JB ACC.3, __HanZiFound
CLR A
MOV R5, A ; m=0;
MOV A, @R0
SUBB A, #0B0h
MOV B, #94
MUL AB
MOV R4, B ; B是高位
MOV R6, A
INC R0
MOV A, @R0
DEC R0 ; ???
SUBB A, #0A1h
ADD A, R6
MOV R6, A
MOV A, R4
ADDC A, R5 ; ADDC A, #0
MOV R4, A ; R4:R6 = 该汉字在汉字库中的位置
ORL Flag, #8
; 每个汉字占17个字节
MOV A, R6
ANL A, #0F0h
ORL A, R4
SWAP A
MOV B, A
MOV A, R6
ANL A, #0Fh
SWAP A ; B:A = (R4:R6)*16
ADD A, R6
MOV R6, A
MOV A, B
ADDC A, R4
MOV R4, A ; [R4:R6] *= 17;
__HanZiFound:
MOV A, R6
ADD A, #LOW(HzCode12x12)
MOV DPL, A
MOV A, R4
ADDC A, #HIGH(HzCode12x12)
MOV DPH, A
MOV A, R5
CLR C
RRC A
CLR C
RRC A ; m/4
ADD A, R7
ADD A, R7
ADD A, R7
CLR C
RRC A ; [(pLine*3+m/4)/2;
CJNE A, #17, __Not_17Byte
CLR A
RET
__Not_17Byte:
MOVC A, @A+DPTR
RET
;//////////////////////////////////////////////////////////////////////
; 取出西文字符在字库中的数据: R0: 字符指针,R6=(j%6)-1;
; 返回: A = Small_Alpha_Code6x8[CacheBuf[i]-0x20][(j%6)-1]
;//////////////////////////////////////////////////////////////////////
GetCharMatrix:
MOV A, @R0
SUBB A, #20h
MOV B, #5
MUL AB
ADD A, #LOW(Small_Alpha_Code6x8)
MOV DPL, A
MOV A, B
ADDC A, #HIGH(Small_Alpha_Code6x8)
MOV DPH, A
MOV A, R6
MOVC A, @A+DPTR
RET
;///////////////////////////////////////////////////////////////////
;void FetchFourDot();
;=====================================
PUBLIC FetchFourDot
EXTRN DATA( FetchABCD,FetchStep,LineBuf )
;==================================================
FetchFourDot:
CLR A
MOV R6, A ; for(Tmp=i=0; i<4; i++)
MOV R7, A
__GetNextDot:
MOV A, R6 ; Tmp *= 2
RL A
MOV R6, A
MOV A, R7 ; k = (i*24+FetchStep)/8
MOV B, #24
MUL AB
ADD A, FetchStep
RRC A
RRC A
RRC A
ANL A, #1Fh
ADD A, #LineBuf
MOV R1, A ; k
MOV A, FetchStep ;if( LineBuf[k]&BitMask[(FetchStep&7)+2] )Tmp++;
ANL A, #7
MOV DPTR,#BitMask+2
MOVC A, @A+DPTR
ANL A, @R1
JZ __White_Dot
INC R6
__White_Dot:
INC R7
CJNE R7, #4, __GetNextDot
MOV A, R6 ; FetchABCD=~Tmp;
;
MOV C, ACC.3
RL A
MOV ACC.0, C
;
CPL A
ANL A, #0Fh
MOV FetchABCD, A
ANL Flag, #0FDh ; Flag &= ~fgFetchOld
INC FetchStep ; if( ++FetchStep>=25 )FetchABCD=0xFF;
MOV A, FetchStep
CLR C
SUBB A, #25
JC __GetDotRet
MOV FetchABCD, #0Fh
__GetDotRet:
RET
;///////////////////////////////////////////////////////////////////
;bit ExistReturn();
;=====================================
PUBLIC ExistReturn
;==================================================
ExistReturn:
MOV R0, #CacheBuf
MOV R7, pStr
INC R7
CJNE R7 ,#1, __Large_Than_Zero
CLR C
RET
__Large_Than_Zero:
CJNE @R0,#0Dh,__Dont_Exist_Ret
SETB C
RET
__Dont_Exist_Ret:
INC R0
DJNZ R7, __Large_Than_Zero
CLR C
RET
;///////////////////////////////////////////////////////////////////
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -