⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hzprnty.asm

📁 点阵式打印机驱动程序,CPU:89C51RD2,含3562个汉字,可打印图形,有1024字节缓冲区
💻 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 + -