📄 test1.asm
字号:
;//*************************************************************************
pw 128
CHIP W65C02S
.INCLUDE ST22XX.INC
.INCLUDE ST2202.DEF
;//*****************Define Data*********************
Stack_Point .equ $ff ;STACK POINT.
Ptr .equ $91
PtrL .equ $91
PtrH .equ $92
Tmp .equ $93
Tmp1 .equ $93
TmpL .equ $93
Tmp2 .equ $94
TmpH .equ $94
Tmp3 .equ $95
Tmp4 .equ $96
LCD_Ptr .equ $97
LCD_PtrL .equ $97
LCD_PtrH .equ $98
CursorX .equ $99
CursorY .equ $9a
StackTmp .equ $9b
Flag .equ $9c
Flag1 .equ $9d
Buff .equ $9e
Buff1 .equ $9e
Buff2 .equ $9f
LCD_SEG .EQU 160
LCD_COM .EQU 80
LCD_START .EQU $0200
;//***********************************************
;PS0 .SECTION
ORG $4000
BASETIMER_VT: JMP BASETIMER_ISR
PORT_VT: JMP PORT_ISR
TIMER1_VT: JMP TIMER1_ISR
TIMER0_VT: JMP TIMER0_ISR
DAC_VT: JMP DAC_ISR
INTX_VT: JMP INTX_ISR
NMI_VT: JMP NMI_ISR
RESET_VT: JMP RESET_ISR
BRK_VT: JMP BRK_ISR
LCDFR_VT: JMP LCDFR_ISR
IR14 JMP DAC_ISR ;14;4;FFE0
URX_VT JMP URX_ISR ;13;4;FFE2
UTX_VT JMP UTX_ISR ;12;4;FFE4
SRX_VT JMP SRX_ISR ;11;4;FFE6
STX_VT JMP STX_ISR ;10;4;FFE8
IR07 JMP LCDFR_ISR ;07;5;FFEA
BASETIMER_ISR:
RTI
TIMER1_ISR:
RTI
TIMER0_ISR:
RTI
DAC_ISR:
RTI
INTX_ISR:
RTI
LCDFR_ISR:
RTI
NMI_ISR:
RTI
BRK_ISR:
RTI
PORT_ISR:
RTI
URX_ISR:
RTI
UTX_ISR:
RTI
SRX_ISR:
RTI
STX_ISR:
RTI
;//*******************Main Program**************************
RESET_ISR:
sei
ldx #Stack_Point
txs
jsr INITIAL_LCD
stz LCD_START
jsr FILL_SCREEN
?loop
jsr TEST_LCD_160X80
lda #30
jsr DELAY_TIME
jsr TEST_LCD_160X801
lda #30
jsr DELAY_TIME
bra ?loop
STOP
;--------------------------OK-----------INITIAL_LCD
INITIAL_LCD:
PHA
LDA #>LCD_START ;lcd start address
STA <LSSAH
LDA #<LCD_START
STA <LSSAL
LDA #LCD_SEG/16
STA <LVPW ;lcd virtual page width
LDA #LCD_SEG/8 ;lcd x length
STA <LXMAX
LDA #LCD_COM/2 ;lcd y length
STA <LYMAX
STZ <LPAN ;no panning
STZ <LCTR ;power on lcd,display on
LDA #08H ;no reverse display
STA <LCKR ;CP=OSCK/4,1-bit transmission
LDA #04H
STA <LFRA ;Frame Rate Adjust
LDA #FFH
STA <PCL ;PL=output
lda #00
STa <LAC ;AC occur after every frame
LDA #00
STA <LPWM ;contrast
PLA
RTS
;--------------------------OK-------------------------------FILL SCREEN
FILL_SCREEN: ;fill screen with value
PHA ;at LCD_START
STZ <DMR
LDA #>LCD_START
STA <DMSH
LDA #<LCD_START
STA <DMSL
LDA #>LCD_START+1
STA <DMDH
LDA #<LCD_START+1
STA <DMDL
LDA #>LCD_SEG*LCD_COM/8
STA <DCNTH
LDA #<LCD_SEG*LCD_COM/8-1
STA <DCNTL
PLA
RTS
;---------------------OK------------------Draw8x8Font
Draw8x8Font
PUSH_ALL
asl a ;a*8 to index table
asl a
asl a
sta <PtrL
lda #<CourierFont8x8 ;a=low address of CourierFont8x8
clc ;PtrL=character index low address
adc <PtrL
sta <PtrL
lda #>CourierFont8x8
stz <PtrH
adc <PtrH
sta <PtrH ;PtrH=character index high address
lda #>LCD_START
sta <TmpH
lda #<LCD_START
clc
adc <CursorX ;X direction LCD character start
sta <TmpL ;low address
bcc ?3
inc <TmpH
?3
lda <CursorY ;Y direction LCD character start
asl a ;low address
tay
.iftrue LCD_SEG=320
lda Mul320Tab,y
.endif
.iftrue LCD_SEG=160
lda Mul160Tab,y
.endif
.iftrue LCD_SEG=112
lda Mul112Tab,y
.endif
clc
adc <TmpL
sta <TmpL
bcc ?4
inc <TmpH
?4
.iftrue LCD_SEG=320
lda Mul320Tab+1,y
.endif
.iftrue LCD_SEG=160
lda Mul160Tab+1,y
.endif
.iftrue LCD_SEG=112
lda Mul112Tab+1,y
.endif
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
clc
adc <TmpH
sta <TmpH
ldy #0h ;Display character
?1
lda (Ptr),y
sta (Tmp)
lda #LCD_SEG/8
clc
adc <TmpL
sta <TmpL
bcc ?2
inc <TmpH
?2
iny
cpy #8
bne ?1
lda <CursorX ;x,y position point to
inc a ;low-byte character
sta <CursorX
cmp #LCD_SEG/8
bne ?5
stz <CursorX
lda <CursorY
inc a
sta <CursorY
cmp #LCD_COM/8
bne ?5
stz <CursorY
?5
PULL_ALL
rts
;--------------------------------SHOW LCD(Sitronix Mark).
TEST_LCD_160X80:
JSR INITIAL_LCD
STZ <DMR
lda #>GL_Bar
sta <DMSH
lda #<GL_Bar
sta <DMSL
LDA #>LCD_START
STA <DMDH
LDA #<LCD_START
STA <DMDL
LDA #>LCD_SEG*LCD_COM/8
STA <DCNTH
LDA #<LCD_SEG*LCD_COM/8-1
STA <DCNTL
rts
TEST_LCD_160X801:
;; JSR INITIAL_LCD
STZ <DMR
lda #>GL_Bar1
sta <DMSH
lda #<GL_Bar1
sta <DMSL
LDA #>LCD_START
STA <DMDH
LDA #<LCD_START
STA <DMDL
LDA #>LCD_SEG*LCD_COM/8
STA <DCNTH
LDA #<LCD_SEG*LCD_COM/8-1
STA <DCNTL
rts
QQQ:
CourierFont8x8:
;; .include D:\zardos\adpcm\8x8_01.hex
;; .include D:\zardos\adpcm\8x8_11.hex
;; .include D:\zardos\adpcm\8x8_21.hex
;; .include D:\zardos\adpcm\8x8_31.hex
;; .include D:\zardos\adpcm\8x8_41.hex
;; .include D:\zardos\adpcm\8x8_51.hex
;; .include D:\zardos\adpcm\8x8_61.hex
;; .include D:\zardos\adpcm\8x8_71.hex
;; .include D:\zardos\adpcm\8x8_81.hex
;; .include D:\zardos\adpcm\8x8_91.hex
;; .include D:\zardos\adpcm\8x8_A1.hex
;; .include D:\zardos\adpcm\8x8_B1.hex
;; .include D:\zardos\adpcm\8x8_C1.hex
;; .include D:\zardos\adpcm\8x8_D1.hex
;; .include D:\zardos\adpcm\8x8_E1.hex
;; .include D:\zardos\adpcm\8x8_F1.hex
;;********************Delay time*********************************************
DELAY_TIME: ;delay time=0.05s X a
?aa
jsr DELAY
dec a
bne ?aa
rts
;;--------------------------------------------------------------------------
DELAY: ;delay time=0.05s(clock=4M)
phx ;3 cycles
phy ;3 cycles
ldx #20 ;2 cycles
ldy #194 ;2 cycles
?aa
dex ;2 cycles
bne ?aa ;if jumping,need 2 cycles,else 1 cycle
dey ;2 cycles
bne ?aa ;if jumping,need 2 cycles,else 1 cycle
ply ;4 cycles
plx ;4 cycles
rts ;6 cycles
;jsr: 6 cycles
;when x,y=1,time=6+3+3+2+2+2+1+2+1+4+4+6=36 cycles
;when x increase one,time adds 4 cycles(2+2)
;when y increse one,time adds 1027 cycles(4+255*4+3)
;when x,y=0,max delay time=262941(36+255*4+1027*255)
;clock=4M,delay time=0.06573525(262941*1/4000000)
;when x=20,y=194 delay time=0.05s(clock=4M)
;----------------------------------------------------
;; (0 ... 29) x 112
Mul112Tab
dw 0
dw 112
dw 224
dw 336
dw 448
dw 560
dw 672
dw 784
dw 896
dw 1008
dw 1120
dw 1232
dw 1344
dw 1456
dw 1568
dw 1680
dw 1792
dw 1904
dw 2016
dw 2128
dw 2240
dw 2352
dw 2464
dw 2576
dw 2688
dw 2800
dw 2912
dw 3024
dw 3136
dw 3248
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; (0 ... 29) x 160
Mul160Tab
dw 0
dw 160
dw 320
dw 480
dw 640
dw 800
dw 960
dw 1120
dw 1280
dw 1440
dw 1600
dw 1760
dw 1920
dw 2080
dw 2240
dw 2400
dw 2560
dw 2720
dw 2880
dw 3040
dw 3200
dw 3360
dw 3520
dw 3680
dw 3840
dw 4000
dw 4160
dw 4320
dw 4480
dw 4640
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; (0 ... 29) x 320
Mul320Tab
dw 0
dw 320
dw 640
dw 960
dw 1280
dw 1600
dw 1920
dw 2240
dw 2560
dw 2880
dw 3200
dw 3520
dw 3840
dw 4160
dw 4480
dw 4800
dw 5120
dw 5440
dw 5760
dw 6080
dw 6400
dw 6720
dw 7040
dw 7360
dw 7680
dw 8000
dw 8320
dw 8640
dw 8960
dw 9280
GL_Bar: .include T3D.B0
GL_Bar1 .include .\01d.B0
;;-------------------------------------- VECTOR BEGIN.
;IV0 .SECTION
ORG $7FE0
.WORD IR14 ;14;4;FFE0
.WORD URX_VT ;13;4;FFE2
.WORD UTX_VT ;12;4;FFE4
.WORD SRX_VT ;11;4;FFE6
.WORD STX_VT ;10;4;FFE8
.WORD IR07 ;07;5;FFEA
.WORD LCDFR_VT ;06;6;FFEC LCD Frame interupt
.WORD BASETIMER_VT ;BASE TIMER OVERFLOW.
.WORD PORT_VT ;PORTA[7-0] VECTOR.
.WORD TIMER1_VT ;TIMER 1 OVERFLOW.
.WORD TIMER0_VT ;TIMER 0 OVERFLOW.
.WORD DAC_VT ;RELOAD DAC DATA.
.WORD INTX_VT ;PORTA[0]/INTX VECTOR.
.WORD NMI_VT ;NMI VECTOR. (RESERVED)
.WORD RESET_VT ;RESET VECTOR. (SAME 6502)
.WORD BRK_VT ;BREAK VECTOR. (SAME 6502)
.END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -