📄 processor.asm
字号:
;************FRAM INIT&READ&WRITE OPERATION*************************
S_INIT_FRAM:
BCLR FRAM_WP,PTB
BRN S_INIT_FRAM
BCLR FRAM_SDA,PTB
BRN S_INIT_FRAM
BCLR FRAM_CLK,PTB
RTS
S_STOP_FRAM:
BRN S_STOP_FRAM
BSET FRAM_CLK,PTB
BRN S_STOP_FRAM
BSET FRAM_SDA,PTB
RTS
TABLE_BIT:
DB $00,$01,$02,$04,$08,$10,$20,$40,$80
;+++++++++++++++++++++++++++++++++READ A BYTE TO FRAM++++++++++++++++++
S_RD_CHAR_FRAM:
JSR S_INIT_FRAM
LDA RD_INDEX
LSLA
ORA #$A1
JSR S_WR_CHAR_FRAM
PSHH
BCLR FRAM_SDA,DDRB
LDX #$08
CLR READ_BYTE
L_START_RD_FRAM:
BSET FRAM_CLK,PTB
BRN L_START_RD_FRAM
BRSET FRAM_SDA,PTB,L_GET_BIT1
JMP L_GET_NEXT_BIT
L_GET_BIT1:
CLRH
LDA TABLE_BIT,X
ORA READ_BYTE
STA READ_BYTE
L_GET_NEXT_BIT:
BCLR FRAM_CLK,PTB
BRN L_START_RD_FRAM
DBNZX L_START_RD_FRAM
BSET FRAM_CLK,PTB
BRN L_START_RD_FRAM ;SEND ACK SIGNAL
BRN L_START_RD_FRAM
BSET FRAM_SDA,DDRB
BRN L_START_RD_FRAM
BCLR FRAM_SDA,PTB
JSR S_STOP_FRAM
PULH
RTS
;+++++++++++++++++++++++++++++++++WRITE A BYTE TO FRAM++++++++++++++++++
S_WR_CHAR_FRAM:
; STA WR_TEMP
; JMP L_SHIFT_A
;L_START_TRANS:
; LDA WR_TEMP
;L_SHIFT_A:
LDX #$08
L_IIC_SND:
BCLR FRAM_CLK,PTB
LSLA
BCC L_SND_ZERO
BSET FRAM_SDA,PTB
JMP L_SET_IIC_CLK
L_SND_ZERO:
BCLR FRAM_SDA,PTB
BRN L_SET_IIC_CLK
L_SET_IIC_CLK:
BSET FRAM_CLK,PTB
BRN L_SET_IIC_CLK
DBNZX L_IIC_SND
BCLR FRAM_CLK,PTB
BCLR FRAM_SDA,DDRB
BRN L_SET_IIC_CLK
BSET FRAM_CLK,PTB
LDA #$02
L_LOOP_ACK:
BRCLR FRAM_SDA,PTB,L_STOP_WR
DBNZA L_LOOP_ACK
L_STOP_WR:
BSET FRAM_SDA,DDRB
BCLR FRAM_CLK,PTB
RTS
;*******************************************************************
;**************************FRAM OPERATION*********
S_RDFRAM_PROCESS:
JSR S_INIT_FRAM
LDA RD_INDEX
LSLA
ORA #$A0
JSR S_WR_CHAR_FRAM
LDA RD_INDEX1
JSR S_WR_CHAR_FRAM
JSR S_STOP_FRAM
RTS
;+++++++++++++++++++++++++++++++++++Write to FRAM++++++++++++++++++++++++
S_WRFRAM_PROCESS:
BCLR FRAM_WRF,F_STATUS
BRSET FIN_BUFFER,F_STATUS,L_SET_FRAM_RD
JSR S_INIT_FRAM
LDA WR_INDEX
LSLA
ORA #$A0
JSR S_WR_CHAR_FRAM
LDA WR_INDEX1
JSR S_WR_CHAR_FRAM
LDA WRITE_BYTE
JSR S_WR_CHAR_FRAM
LDHX WR_INDEX
AIX #$0001
STHX WR_INDEX
JSR S_STOP_FRAM
JMP L_A_BYTE_OK
L_SET_FRAM_RD:
BCLR FIN_BUFFER,F_STATUS
LDHX #$0000
STHX RD_INDEX
JSR S_RDFRAM_PROCESS
BSET PRN_START,F_STATUS
L_A_BYTE_OK:
RTS
;**************************************************
;**************************PRINTER OPERTION********
S_PRINT_PROCESS:
PSHH
BSET ON_PRINTING,F_STATUS
JSR S_CLR_PTB_PTD
JSR S_OPEN_PS
BSET MOTOR,PTA
BCLR PRN_START,F_STATUS
PULH
RTS
S_PRINT_ONE_DOT:
; BSET TEST_PIN,PTB
PSHH
; LDA DOT_CNT ;041030 for adding a space each line
; CMP #$04
; BLS L_RESET_IT
BCLR PRINTING,F_STATUS
LDA DOT_CNT1
CMP #$00
BNE L_PRINT_A_DOT ;L_JUDGE_IF_6BIT
JSR S_GET_RIGHT_CHAR
L_PRINT_A_DOT:
JSR S_PRINT_DOT_OUT
LDA DOT_CNT1
INCA
STA DOT_CNT1
CMP #$05
BLS L_RESET_IT
CLR DOT_CNT1
JSR S_RDFRAM_PROCESS
L_RESET_IT:
PULH
RTS
S_PRINT_DOT_OUT:
PSHH
LDA DOT_CNT1
CMP #$04
BLS L_CAL_PRN_VAL
CLR TEMP_VAL
JMP L_GET_TEMP_VAL
L_CAL_PRN_VAL:
LDA TEMP_VAL
STA IF_CONTINUE ;041030 save last value
LDHX TABLE_INDEX
LDA ASCII_TABLE,X
STA TEMP_VAL
AIX #$0001
STHX TABLE_INDEX
L_GET_TEMP_VAL:
JSR S_JUDGE_ONES ;041030 for cnt of 1s
LDA ONES_CNT
CMP #$04
BLS L_DO_AS_NORMAL
LDA TEMP_VAL
JSR S_SET_PTB_PTD
JMP L_NO_RESET_PINS
L_DO_AS_NORMAL:
LDA #$FF
SUB IF_CONTINUE
AND TEMP_VAL
STA TEMP_FIRST
JSR S_SET_PTB_PTD
JSR S_0.2T_DELAY
LDA IF_CONTINUE
AND TEMP_VAL
ORA TEMP_FIRST
JSR S_SET_PTB_PTD
JSR S_0.2T_DELAY
JSR S_0.2T_DELAY ;041029 for more delay
JSR S_0.2T_DELAY
JSR S_0.2T_DELAY
JSR S_CLR_PTB_PTD
L_NO_RESET_PINS:
; BCLR TEST_PIN,PTB
PULH
RTS
S_CLR_PTB_PTD:
LDA #$F0
AND PORTB
STA PORTB
LDA #$F8
AND PORTD
STA PORTD
RTS
S_JUDGE_ONES: ;041030 For many 1s
LDA TEMP_VAL
LDX #$08
L_LOOP_SHIFT:
ASLA
PSHA
BCC L_CONTINUE_SHIFT
LDA ONES_CNT
INCA
STA ONES_CNT
L_CONTINUE_SHIFT:
PULA
DBNZX L_LOOP_SHIFT
RTS
S_SET_PTB_PTD:
PSHH
PSHA
AND #$07
ORA PORTD
STA PORTD
PULA
ASRA
ASRA
ASRA
ORA PORTB
STA PORTB
PULH
RTS
S_GET_RIGHT_CHAR:
PSHH
BRSET LR_FLAG,PRINT_STATUS,L_SET_AS_SPACE
BCLR LR_FLAG,PRINT_STATUS
LDA #$8A
SUB DOT_CNT
CMP #$03
BLS L_SET_AS_SPACE
LDHX RD_INDEX
CPHX WR_INDEX
BHS L_FINISH_BUFFER
JSR S_RD_CHAR_FRAM ;S_RDFRAM_PROCESS
LDHX RD_INDEX
AIX #$0001
STHX RD_INDEX
LDA READ_BYTE
CMP #$20
BHS L_CAL_TABLE_INDEX
CMP #$0D ;MEET CR TO JUDGE IF NEXT IS LF?
BNE L_SET_AS_SPACE
; LDHX RD_INDEX ;0D+0A ignore next 0A,if only 0D remove these three lines
; AIX #$0001 ;test 20041111
; STHX RD_INDEX
BSET LR_FLAG,PRINT_STATUS
L_SET_AS_SPACE:
LDA #$20
L_CAL_TABLE_INDEX:
SUB #$20
LDX #$05
MUL
PSHX
TAX
PULH
STHX TABLE_INDEX
JMP L_FIN_GET_CHAR
L_FINISH_BUFFER:
LDHX #$0000
STHX TABLE_INDEX
BCLR ON_PRINTING,F_STATUS
JSR S_STOP_MOTOR
L_FIN_GET_CHAR:
PULH
RTS
S_LR_KEY_PROCESS:
BRSET ON_PRINTING,F_STATUS,L_CLR_KBF ;L_WAIT_PRINT
BRSET PBIT2,PTA,L_CLR_KBF ;FILTER KEY PRESS
JSR S_0.2T_DELAY
BRSET PBIT2,PTA,L_CLR_KBF
SEI
; JSR S_CLR_PTB_PTD
JSR S_OPEN_PS
BSET MOTOR,PTA
BRSET HSW,PTA,*
BRCLR HSW,PTA,*
BRSET HSW,PTA,*
JSR S_STOP_MOTOR
CLI
L_CLR_KBF:
BCLR LR_KEYF,F_STATUS
L_WAIT_PRINT:
RTS
;***************************************************
S_STOP_MOTOR:
; JSR S_CLR_PTB_PTD ;TEST 11/09/2004
BRCLR HSW,PTA,*
JSR S_0.8T_DELAY
BCLR MOTOR,PTA
BCLR PS_SD,PTA
; JSR S_CLR_PTB_PTD
RTS
;**************************SUBROUTINES CALLED BY PROCESS***************
S_OPEN_PS:
BRSET PS_SD,PTA,L_PS_OPENED
BSET PS_SD,PTA
JSR S_0.8T_DELAY
JSR S_0.8T_DELAY
JSR S_0.8T_DELAY
JSR S_0.8T_DELAY
L_PS_OPENED:
RTS
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -