JML11
Newbie level 2
Hello,
I am hoping someone can help me out. I am using a fox11 trainer board and have to write a program in assembly code for a digital clock. I keep getting errors and am not sure what I am doing incorrectly.
I am looking for some direction, please!
DB0: equ 1
DB1: equ 2
*
STACK: equ $8FFF
ONE_MS equ 167 ; for 8 MHz 1000us/6us=167
FIVE_MS equ 835
TEN_MS equ 1670
PORTF equ $1403
d40us: equ 15 ; 15x6us= 90 us, 60us ok
REG_SEL: equ DB0 ; 0=reg, 1=data
ENABLE: equ DB1
NOT_REG_SEL: equ $FE
NOT_ENABLE: equ $FD
NOT_RESET equ $F7 ; force bit 3 = 0
org 0
temp1: rmb 1
pfimg: rmb 1
LCDimg: equ pfimg
LCD_RSimg: equ pfimg
LCD_ENimg: equ pfimg
LCD: equ PORTF
LCD_RS: equ PORTF
LCD_EN: equ PORTF
*
org $D000
jmp start
LOOPB EQU
LDAA #$03
JSR WRITE_NIBBLE
LDX #$0480
LOOP1 EQU
DEX
BNE LOOP1
DECB
BNE LOOPB
LDX #LCD_INIT_TABLE
INIT1 EQU
LDAA $00,X
BEQ LCD_INIT_DONE
BSR WRITE_C_BYTE
INX
BRA INIT1
LCD_INIT_DONE EQU
LDX #DIS_1_2
LDY #DISPLAY_1_2
COPY_ADDITIONAL EQU
LDAA $00,Y
STAA $00,X
INX
INY
CPX #DIS_END
BNE COPY_ADDITIONAL
COPYJMP EQU
LDX INTJMP
STX $100-33
LDAA INTJMP+2
STAA $100-33+2
JSR INC_TIMER
STAA $1022
LDAA #$14
STAA $00
TPA
ANDA #$EF
TAP
LDA #$80
STA $1023
INITVAR EQU
LDX #$0000
LDAA #40
STAA INT_COUNT
LDX #DISPLAY_1_1
BSR WRITE_LINE_1
LDX #DIS_1_2
BSR WRITE_LINE_2
LOOPHERE EQU
BRA LOOPHERE
DELAY4BF EQU
DELAY EQU
PSHB
LDB #$10
D_LOOP DECB
BNE D_LOOP
PULB
RTS
WRITE_LINE_1 EQU
PSHA
PSHX
LDAA #$80
BRA WRITE_LINE
WRITE_LINE_2 EQU
PSHA
PSHX
LDAA #$A8
WRIE_LINE EQU
BSR WRITE_C_BYTE
NEXT_CHARACTER EQU
LDA $00,X
BEQ WRITE_LINE_DONE
BSR WRITE_D_BYTE
INX
BRA NEXT_CHARACTER
WRITE_LINE_DONE EQU
PULX
PULA
RTS
WRITE_D_BYTE EQU
PSHX
LDX #$501F
BRA WRITE_LCD_BYTE
WRIE_C_BYTE EQU
PSHX
LDX #$400F
WRITE_LCD_BYTE EQU
STX MODE_EH
PULX
PSHA
LSRA
LSRA
LSRA
LSRA
BSR DELAY4BF
BSR WRITE_NIBBLE
PULA
PSHA
BSR WRITE_NIBBLE
CMPA #$01
BNE NOT_CLEAR
LDAA #$20
DO_NOT_CLEAR EQU
BSR DELAY4BF
DECA
BNE DO_NOT_CLEAR
NOT_CLEAR EQU
PULA
RTS
WRITE_NIBBLE EQU
PSHA
ANDA #$0F
ORAA MODE_EH
STAA $1003
ANDA MODE_EL
STAA $1003
PULA
RTS
INTJMP JMP INTERRUPT
INC_TIMER EQU
LDD #TIMER_COUNT
ADDD $1016
STD $1016
LDA #$80
STA $1023
RTS
INTERRUPT EQU
DEC INT_COUNT
BNE OVER
LDAA #40
STAA INT_COUNT
BSR INC_DISPLAY
LDX #DIS_1_2
BSR WRITE_LINE_2
OVER EQU
BSR INC_TIMER
RTI
INC_DISPLAY EQU
LDX #DIS_1_2
BSR INC_TIME
HOOK EQU
RTS
INC_TIME EQU
INC $0F,X
LDAA $0F,X
CMPA #'5
BNE OVER_COLON
LDAA #'
STAA $0E,X
STAA $0B,X
STAA $08,X
BRA TIME_DONE
OVER_COLON EQU
CMPA #'9+1
BNE TIME_DONE
LDAA #'0
STAA $0F,X
LDAA #':
STAA $0E,X
STAA $0B,X
STAA $08,X
DEX
DEX
BSR INC_DIGITS
CMPA #'6
BNE TIME_DONE
BSR ZERO_DIGIT
CMPA #'6
BNE TIME_DONE
BSR ZERO_DIGIT
CPD #'2'4
BNE TIME_DONE
LDD #'0'0
STD $0E,X
TIME_DONE EQU
RTS
INC_DIGITS EQU
INC $0F,X
LDAA $0F,X
CMPA #'9+1
BNE DIG_DONE
LDAA #'0
STAA $0F,X
INC $0E,X
DIG_DONE EQU
LDD $0E,X
RTS
ZERO_DIGIT EQU
LDAA #'0
STAA $0E,X
DEX
DEX
DEX
BSR INC_DIGITS
RTS
FCC "CLOCK PROJECT"
FCB $00
FCC "HMST 00:00:00:0"
FCB $00
I am hoping someone can help me out. I am using a fox11 trainer board and have to write a program in assembly code for a digital clock. I keep getting errors and am not sure what I am doing incorrectly.
I am looking for some direction, please!
DB0: equ 1
DB1: equ 2
*
STACK: equ $8FFF
ONE_MS equ 167 ; for 8 MHz 1000us/6us=167
FIVE_MS equ 835
TEN_MS equ 1670
PORTF equ $1403
d40us: equ 15 ; 15x6us= 90 us, 60us ok
REG_SEL: equ DB0 ; 0=reg, 1=data
ENABLE: equ DB1
NOT_REG_SEL: equ $FE
NOT_ENABLE: equ $FD
NOT_RESET equ $F7 ; force bit 3 = 0
org 0
temp1: rmb 1
pfimg: rmb 1
LCDimg: equ pfimg
LCD_RSimg: equ pfimg
LCD_ENimg: equ pfimg
LCD: equ PORTF
LCD_RS: equ PORTF
LCD_EN: equ PORTF
*
org $D000
jmp start
LOOPB EQU
LDAA #$03
JSR WRITE_NIBBLE
LDX #$0480
LOOP1 EQU
DEX
BNE LOOP1
DECB
BNE LOOPB
LDX #LCD_INIT_TABLE
INIT1 EQU
LDAA $00,X
BEQ LCD_INIT_DONE
BSR WRITE_C_BYTE
INX
BRA INIT1
LCD_INIT_DONE EQU
LDX #DIS_1_2
LDY #DISPLAY_1_2
COPY_ADDITIONAL EQU
LDAA $00,Y
STAA $00,X
INX
INY
CPX #DIS_END
BNE COPY_ADDITIONAL
COPYJMP EQU
LDX INTJMP
STX $100-33
LDAA INTJMP+2
STAA $100-33+2
JSR INC_TIMER
STAA $1022
LDAA #$14
STAA $00
TPA
ANDA #$EF
TAP
LDA #$80
STA $1023
INITVAR EQU
LDX #$0000
LDAA #40
STAA INT_COUNT
LDX #DISPLAY_1_1
BSR WRITE_LINE_1
LDX #DIS_1_2
BSR WRITE_LINE_2
LOOPHERE EQU
BRA LOOPHERE
DELAY4BF EQU
DELAY EQU
PSHB
LDB #$10
D_LOOP DECB
BNE D_LOOP
PULB
RTS
WRITE_LINE_1 EQU
PSHA
PSHX
LDAA #$80
BRA WRITE_LINE
WRITE_LINE_2 EQU
PSHA
PSHX
LDAA #$A8
WRIE_LINE EQU
BSR WRITE_C_BYTE
NEXT_CHARACTER EQU
LDA $00,X
BEQ WRITE_LINE_DONE
BSR WRITE_D_BYTE
INX
BRA NEXT_CHARACTER
WRITE_LINE_DONE EQU
PULX
PULA
RTS
WRITE_D_BYTE EQU
PSHX
LDX #$501F
BRA WRITE_LCD_BYTE
WRIE_C_BYTE EQU
PSHX
LDX #$400F
WRITE_LCD_BYTE EQU
STX MODE_EH
PULX
PSHA
LSRA
LSRA
LSRA
LSRA
BSR DELAY4BF
BSR WRITE_NIBBLE
PULA
PSHA
BSR WRITE_NIBBLE
CMPA #$01
BNE NOT_CLEAR
LDAA #$20
DO_NOT_CLEAR EQU
BSR DELAY4BF
DECA
BNE DO_NOT_CLEAR
NOT_CLEAR EQU
PULA
RTS
WRITE_NIBBLE EQU
PSHA
ANDA #$0F
ORAA MODE_EH
STAA $1003
ANDA MODE_EL
STAA $1003
PULA
RTS
INTJMP JMP INTERRUPT
INC_TIMER EQU
LDD #TIMER_COUNT
ADDD $1016
STD $1016
LDA #$80
STA $1023
RTS
INTERRUPT EQU
DEC INT_COUNT
BNE OVER
LDAA #40
STAA INT_COUNT
BSR INC_DISPLAY
LDX #DIS_1_2
BSR WRITE_LINE_2
OVER EQU
BSR INC_TIMER
RTI
INC_DISPLAY EQU
LDX #DIS_1_2
BSR INC_TIME
HOOK EQU
RTS
INC_TIME EQU
INC $0F,X
LDAA $0F,X
CMPA #'5
BNE OVER_COLON
LDAA #'
STAA $0E,X
STAA $0B,X
STAA $08,X
BRA TIME_DONE
OVER_COLON EQU
CMPA #'9+1
BNE TIME_DONE
LDAA #'0
STAA $0F,X
LDAA #':
STAA $0E,X
STAA $0B,X
STAA $08,X
DEX
DEX
BSR INC_DIGITS
CMPA #'6
BNE TIME_DONE
BSR ZERO_DIGIT
CMPA #'6
BNE TIME_DONE
BSR ZERO_DIGIT
CPD #'2'4
BNE TIME_DONE
LDD #'0'0
STD $0E,X
TIME_DONE EQU
RTS
INC_DIGITS EQU
INC $0F,X
LDAA $0F,X
CMPA #'9+1
BNE DIG_DONE
LDAA #'0
STAA $0F,X
INC $0E,X
DIG_DONE EQU
LDD $0E,X
RTS
ZERO_DIGIT EQU
LDAA #'0
STAA $0E,X
DEX
DEX
DEX
BSR INC_DIGITS
RTS
FCC "CLOCK PROJECT"
FCB $00
FCC "HMST 00:00:00:0"
FCB $00