📄 lcd.asm
字号:
;***************************************************************************
.PW 128
.CHIP W65C02S
.GLOBALS ON
.INCLUDE SYSTEM.CFG
.INCLUDE ST2205.DEF
;***************************************************************************
;* extenal label definition
;*
;***************************************************************************
.XREF MUL16_16
.XREF TEMP_H3
.XREF TEMP_H2
.XREF TEMP_H
.XREF TEMP_L
.XREF FPtrH
.XREF FPtrL
.XREF PtrH
.XREF PtrL
.XREF LCD_BUF_START
.XREF DIVIDER_L
.XREF DIVIDER_H
.XREF DIVIDER_H2
.XREF DIVIDER_H3
.XREF LCD_SEG
.XREF LCD_COM
.XREF LCDX
.XREF LCDY
.XREF MULDATA_L
.XREF MULDATA_H
.XREF SecPtr
.XREF PosPtr
.XREF DRR
.XREF STRCNT
.XREF ResData
.XREF TEMP
.XREF CHARNUM
;***************************************************************************
;* global label definition
;*
;***************************************************************************
.PUBLIC DRAW_CHAR12x12
.PUBLIC CLS_LINE
.PUBLIC CLS_CHAR12x12
.PUBLIC InVideo
.PUBLIC DRAW_STRING
.PUBLIC DIVIDETEN
.PUBLIC DISP_NUMBER
.PUBLIC CLS_CHAR12x12
.PUBLIC CLS_CHARMANY
.PUBLIC DISP_NUMBER_IN
;***************************************************************************
;* Description: Section PS0
;*
;***************************************************************************
PS0 .SECTION
;***************************************************************************
;==================================================
; Function: printer a string in the display |
; Input: PtrL & PtrH & LCDX & LCDY
;==================================================
DRAW_STRING:
PHA
PHY
DRAWSTRLOOP:
LDA (PtrL)
CMP #0
BEQ Draw_StrEnd
STA SecPtr
LDY #1
LDA (PtrL,Y)
STA PosPtr
LDA PtrL
PHA
LDA PtrH
PHA
JSR DRAW_CHAR12x12
PLA
STA PtrH
PLA
STA PtrL
INC LCDX
CLC
LDA #2
ADC PtrL
STA PtrL
LDA #0
ADC PtrH
STA PtrH
BRA DRAWSTRLOOP
Draw_StrEnd:
PLY
PLA
RTS
;;==============================================================================
;; Input: A LCDX LCDY
;; Useing Ram: TEMP_L
;;
;;==============================================================================
DISP_NUMBER:
PHA
PHX
PHY
CMP #200
BCS MORE_TWOHANDRED
CMP #100
BCS MORE_ONEHANDRED
JSR DIVIDETEN
CMP #0
BEQ DISP_NUMNXT1
JSR DRAW_CHAR8x8
INC LCDX
DISP_NUMNXT1:
LDA ResData
JSR DRAW_CHAR8x8
BRA DISP_NUMEND
MORE_TWOHANDRED:
SEC
SBC #200
PHA
LDA #2
JSR DRAW_CHAR8x8
PLA
BRA DISP_NUMNXT2
MORE_ONEHANDRED:
SEC
SBC #100
PHA
LDA #1
JSR DRAW_CHAR8x8
PLA
DISP_NUMNXT2:
INC LCDX
JSR DIVIDETEN
JSR DRAW_CHAR8x8
INC LCDX
LDA ResData
JSR DRAW_CHAR8x8
DISP_NUMEND:
PLY
PLX
PLA
RTS
;;==============================================================================
;; Input: A LCDX LCDY
;; Useing Ram: TEMP_L
;;
;;==============================================================================
DISP_NUMBER_IN:
PHA
PHX
PHY
CMP #200
BCS MORE_TWOHANDRED_IN
CMP #100
BCS MORE_ONEHANDRED_IN
JSR DIVIDETEN
CMP #0
BEQ DISP_NUMNXT1_IN
JSR DRAW_CHAR8x8_IN
INC LCDX
DISP_NUMNXT1_IN:
LDA ResData
JSR DRAW_CHAR8x8_IN
BRA DISP_NUMEND_IN
MORE_TWOHANDRED_IN:
SEC
SBC #200
PHA
LDA #2
JSR DRAW_CHAR8x8_IN
PLA
BRA DISP_NUMNXT2_IN
MORE_ONEHANDRED_IN:
SEC
SBC #100
PHA
LDA #1
JSR DRAW_CHAR8x8_IN
PLA
DISP_NUMNXT2_IN:
INC LCDX
JSR DIVIDETEN
JSR DRAW_CHAR8x8_IN
INC LCDX
LDA ResData
JSR DRAW_CHAR8x8_IN
DISP_NUMEND_IN:
PLY
PLX
PLA
RTS
;;==============================================================================
;; Input: A -> ASSCII code LCDX -> rang (0-29) LCDY -> rang (0-12)
;; Output: char
;; Use Ram: FPtrL/FPtrH,PtrL/PtrH
;;==============================================================================
DRAW_CHAR8x8:
PHA
PHX
PHY
STZ FPtrH
STA FPtrL
ASL FPtrL
ROL FPtrH
ASL FPtrL
ROL FPtrH
ASL FPtrL
ROL FPtrH ;mul * 8
LDA #<ASCIIFont5x7
CLC
ADC FPtrL
STA FPtrL
LDA #>ASCIIFont5x7
ADC FPtrH
STA FPtrH ;load font input port
;===...............................................===
LDA #<LCD_BUF_START
STA PtrL
LDA #>LCD_BUF_START
STA PtrH
LDA LCDY
ASL
TAX
LDA Mult240Tab1,X
CLC
ADC PtrL
STA PtrL
LDA Mult240Tab1+1,X
ADC PtrH
STA PtrH
LDX #8
LDY LCDX
Disp_8x8LP:
LDA (FPtrL)
STA (PtrL),Y
CLC
LDA PtrL
ADC #30
STA PtrL
LDA PtrH
ADC #0
STA PtrH
CLC
INC FPtrL
LDA FPtrL
CMP #0
BNE Disp_skip
INC FPtrH
Disp_skip:
DEX
CPX #0
BNE Disp_8x8LP
PLY
PLX
PLA
RTS
;;==============================================================================
;; Input: A -> ASSCII code LCDX -> rang (0-29) LCDY -> rang (0-12)
;; Output: char
;; Use Ram: FPtrL/FPtrH,PtrL/PtrH
;;==============================================================================
DRAW_CHAR8x8_IN:
PHA
PHX
PHY
STZ FPtrH
STA FPtrL
ASL FPtrL
ROL FPtrH
ASL FPtrL
ROL FPtrH
ASL FPtrL
ROL FPtrH ;mul * 8
LDA #<ASCIIFont5x7
CLC
ADC FPtrL
STA FPtrL
LDA #>ASCIIFont5x7
ADC FPtrH
STA FPtrH ;load font input port
;===...............................................===
LDA #<LCD_BUF_START
STA PtrL
LDA #>LCD_BUF_START
STA PtrH
LDA LCDY
ASL
TAX
LDA Mult240Tab1,X
CLC
ADC PtrL
STA PtrL
LDA Mult240Tab1+1,X
ADC PtrH
STA PtrH
LDX #8
LDY LCDX
Disp_8x8LP_IN:
LDA (FPtrL)
EOR #FFH
STA (PtrL),Y
CLC
LDA PtrL
ADC #30
STA PtrL
LDA PtrH
ADC #0
STA PtrH
CLC
INC FPtrL
LDA FPtrL
CMP #0
BNE Disp_skip_IN
INC FPtrH
Disp_skip_IN:
DEX
CPX #0
BNE Disp_8x8LP_IN
PLY
PLX
PLA
RTS
;==================================================
; Function: clean line in the display
; Input: LCDY
;==================================================
CLS_LINE:
PHX
PHY
PHA
LDA #<LCD_BUF_START
STA PtrL
LDA #>LCD_BUF_START
STA PtrH
LDA LCDY
ASL
TAX
LDA Mult240Tab,X
CLC
ADC PtrL
STA PtrL
LDA Mult240Tab+1,X
ADC PtrH
STA PtrH
LDA #0
LDX #0CH
FILL_L_LP:
LDY #30
FILL_0_LP:
STA (PtrL)
CLC
INC PtrL
BNE FILL_1_LP
PHA
LDA PtrH
ADC #1
STA PtrH
PLA
FILL_1_LP:
DEY
CPY #0
BNE FILL_0_LP
DEX
CPX #0
BNE FILL_L_LP
PLA
PLY
PLX
RTS
;==================================================
; Function: clean A char
; Input: LCDX LCDY
;==================================================
CLS_CHAR12x12:
LDA #A1H
STA SecPtr
STA PosPtr
JSR DRAW_CHAR12x12
RTS
;==================================================
; Function: clean A char
; Input: LCDX LCDY CHARNUM
; CHARNUM rang: 1-20
;==================================================
CLS_CHARMANY:
JSR CLS_CHAR12x12
INC LCDX
DEC CHARNUM
LDA CHARNUM
CMP #0
BNE CLS_CHARMANY
RTS
;==================================================
; Function: reverse video char ||
; Input: LCDX LCDY ||
; Input: STRCNT ||
;==================================================
InVideo:
PHA
PHX
PHY
InVideo1:
LDA #<LCD_BUF_START
STA PtrL
LDA #>LCD_BUF_START
STA PtrH
LDA LCDY
ASL
TAX
LDA Mult240Tab,X
CLC
ADC PtrL
STA PtrL
LDA Mult240Tab+1,X
ADC PtrH
STA PtrH
BBS0 <LCDX,InVideo_Offset4bitHD
LDA #12
STA TEMP_L
InvideoLP:
LDX LCDX
LDA XoffsetTab,X
TAY
LDA (PtrL),Y
EOR #0FFH
STA (PtrL),Y
INY
LDA (PtrL),Y
EOR #0F0H
STA (PtrL),Y
CLC
LDA PtrL
ADC #30
STA PtrL
LDA PtrH
ADC #0
STA PtrH
DEC TEMP_L
BNE InvideoLP
BRA InvideoEnd1
InVideo_Offset4bitHD:
LDA #12
STA TEMP_L
InvideoLP2:
LDX LCDX
LDA XoffsetTab,X
TAY
LDA (PtrL),Y
EOR #0FH
STA (PtrL),Y
INY
LDA (PtrL),Y
EOR #0FFH
STA (PtrL),Y
CLC
LDA PtrL
ADC #30
STA PtrL
LDA PtrH
ADC #0
STA PtrH
DEC TEMP_L
BNE InvideoLP2
InvideoEnd1:
DEC STRCNT
LDA STRCNT
CMP #0
BEQ InvideoEnd2
INC LCDX
JMP InVideo1
InvideoEnd2:
PLY
PLX
PLA
RTS
;***************************************************************************
;* Func: LCD_Init
;* Input: none
;* Output: none
;*
;* Description: LCD Init
;*
;***************************************************************************
LCD_Init:
stz LCDX
stz LCDY
rts
.IF ASSEMBLER=ZARDOZ
.EFUNC ;LCD_Init
.ENDIF ;ASSEMBLER=ZARDOZ
;===============================================================================
;;input parameter: LCDX LCDY/ SecPtr PosPtr
;;Find way: ((SecPrt-0xA1)*94+ PosPrt-0xA1)*24
;;LCDX rang -> 0-19; LCDY rang (0-12)
;;
;;
;;------------------------------------------------------------------------------
DRAW_CHAR12x12:
PHA
PHX
PHY
LDA DRRL
PHA
LDA DRRH
PHA
SEC
LDA SecPtr
SBC #0A1H ;MULDATA_L
STA MULDATA_L
STZ MULDATA_H
LDA #94
STA TEMP_L
STZ TEMP_H
STZ TEMP_H2
STZ TEMP_H3 ; section prt * 24 byte
JSR MUL16_16
SEC
LDA PosPtr
SBC #0A1H
CLC
ADC DIVIDER_L
STA DIVIDER_L
LDA DIVIDER_H
ADC #0
STA DIVIDER_H
;-------------------------------------------------
;The befor cal: Sec*96 + Pos |
;-------------------------------------------------
;The follow cal: x* 24 |
;-------------------------------------------------
LDA #24
STA MULDATA_L
STZ MULDATA_H
LDA DIVIDER_L
STA TEMP_L
LDA DIVIDER_H
STA TEMP_H
STZ TEMP_H2
STZ TEMP_H3
JSR MUL16_16
;; offset = DIVIDER_H/DIVIDER_L b14-b0
;; DS = DIVIDER_H2/DIVIDER_H b15-b7
LDA DIVIDER_H2
STA TEMP_L
LDA DIVIDER_H
STA TEMP_H
ASL TEMP_H
ROL TEMP_L ; b0<C
LDA TEMP_L
AND #07H ;每8000H加1
CLC
ADC #2 ;从10000H开始
STA TEMP_L ;DRR
STA DRR
LDA DIVIDER_L
STA FPtrL
LDA DIVIDER_H
AND #7FH
STA FPtrH
SMB7 <FPtrH ; + 8000H
;<<<<< (FPtr)= Font offset >>>>> ----------------
;<<<<< TEMP_L= DS >>>>> ----------------
LDA #<LCD_BUF_START
STA PtrL
LDA #>LCD_BUF_START
STA PtrH
LDA LCDY
ASL
TAX
LDA Mult240Tab,X
CLC
ADC PtrL
STA PtrL
LDA Mult240Tab+1,X
ADC PtrH
STA PtrH
BBS0 <LCDX,Offset4bitHD
LDA #12
STA TEMP_L
DispCharLP:
LDX LCDX
LDA XoffsetTab,X
TAY
LDA (FPtrL)
STA (PtrL),Y
INY
INC FPtrL
BNE DispCharNext
INC FPtrH
DispCharNext:
LDA (PtrL),Y
AND #0FH
ORA (FPtrL)
STA (PtrL),Y
CLC
LDA PtrL
ADC #30
STA PtrL
LDA PtrH
ADC #0
STA PtrH
INC FPtrL
LDA FPtrL
CMP #0
BNE DispCharNext1
INC FPtrH
DispCharNext1:
DEC TEMP_L
BNE DispCharLP
JMP DispCharEnd
Offset4bitHD:
LDA #12
STA TEMP_L
DispCharLP2:
LDA (FPtrL)
STA TEMP_H2
INC FPtrL
LDA FPtrL
CMP #0
BNE DispCharNext2
INC FPtrH
DispCharNext2:
LDA (FPtrL)
STA TEMP_H
CLC
LSR TEMP_H2
ROR TEMP_H
CLC
LSR TEMP_H2
ROR TEMP_H
CLC
LSR TEMP_H2
ROR TEMP_H
CLC
LSR TEMP_H2
ROR TEMP_H ;shit 4 bit by right
LDX LCDX
LDA XoffsetTab,X
TAY
LDA TEMP_H2
LDA #F0H
AND (PtrL),Y
ORA TEMP_H2
STA (PtrL),Y
; ORA (PtrL),Y
; STA (PtrL),Y
INY
LDA TEMP_H
STA (PtrL),Y
CLC
LDA PtrL
ADC #30
STA PtrL
LDA PtrH
ADC #0
STA PtrH
INC FPtrL
LDA FPtrL
CMP #0
BNE DispCharNext3
INC FPtrH
DispCharNext3:
DEC TEMP_L
LDA TEMP_L
CMP #0
BNE DispCharLP2
DispCharEnd:
PLA
STA DRRH
PLA
STA DRRL
PLY
PLX
PLA
RTS
;=================================================
;=================================================
;Input:A
;Output: Residue--> ResData Quotient-->A
;=================================================
DIVIDETEN:
PHX
PHY
STZ TEMP
DivLoop:
CMP #10
bcc DivEnd
SEC
SBC #10
INC TEMP
JMP DivLoop
DivEnd:
STA ResData
LDA TEMP
PLX
PLY
RTS
;=================================================
;;==============================================================================
Mult240Tab:
DW 0
DW 360
DW 720
DW 1080
DW 1440
DW 1800
DW 2160
DW 2520
DW 2880
DW 3240
DW 3600
DW 3960
DW 4320
DW 4680
XoffsetTab:
DB 0
DB 1
DB 3
DB 4
DB 6
DB 7
DB 9
DB 10
DB 12
DB 13
DB 15
DB 16
DB 18
DB 19
DB 21
DB 22
DB 24
DB 25
DB 27
DB 28
Mult240Tab1:
DW 0+90
DW 360+90
DW 720+90
DW 1080+90
DW 1440+90
DW 1800+90
DW 2160+90
DW 2520+90
DW 2880+90
DW 3240+90
DW 3600+90
DW 3960+90
DW 4320+90
DW 4680+90
;;==============================================================================
ASCIIFont5x7:
; 16h
DB 0Eh
DB 11h
DB 13h
DB 15h
DB 19h
DB 11h
DB 0Eh
DB 00h
; 17h
DB 04h
DB 0Ch
DB 04h
DB 04h
DB 04h
DB 04h
DB 0Eh
DB 00h
; 18h
DB 0Eh
DB 11h
DB 01h
DB 02h
DB 04h
DB 08h
DB 1Fh
DB 00h
; 19h
DB 1Fh
DB 02h
DB 04h
DB 02h
DB 01h
DB 11h
DB 0Eh
DB 00h
; 1Ah
DB 02h
DB 06h
DB 0Ah
DB 12h
DB 1Fh
DB 02h
DB 02h
DB 00h
; 1Bh
DB 1Fh
DB 10h
DB 1Eh
DB 01h
DB 01h
DB 11h
DB 0Eh
DB 00h
; 1Ch
DB 06h
DB 08h
DB 10h
DB 1Eh
DB 11h
DB 11h
DB 0Eh
DB 00h
; 1Dh
DB 1Fh
DB 01h
DB 02h
DB 04h
DB 08h
DB 08h
DB 08h
DB 00h
; 1Eh
DB 0Eh
DB 11h
DB 11h
DB 0Eh
DB 11h
DB 11h
DB 0Eh
DB 00h
; 1Fh
DB 0Eh
DB 11h
DB 11h
DB 0Fh
DB 01h
DB 02h
DB 0Ch
DB 00h
; empty
DB 00h
DB 00h
DB 00h
DB 00h
DB 00h
DB 00h
DB 00h
DB 00h
;====================================================
;====================================================
.END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -