add timer LED blink demo

This commit is contained in:
Zack Buhman 2022-04-03 15:53:57 -07:00
parent 67b234001d
commit f15eca7ea1
5 changed files with 107 additions and 30 deletions

1
.gitignore vendored
View File

@ -1,2 +1,3 @@
*.bin
*.rom
*.asm

View File

@ -1,6 +1,8 @@
HOME = /home/buhman
%.asm: %.asm.in
all:
%.asm: %.asm.in common.m4
m4 < $< > $@
%.bin: %.asm

27
common.m4 Normal file
View File

@ -0,0 +1,27 @@
changecom(`@')dnl
dnl
define(PORTB, 8000)dnl
define(PORTA, 8001)dnl
define(DDRB, 8002)dnl
define(DDRA, 8003)dnl
define(T1CL, 8004)dnl
define(T1CH, 8005)dnl
define(T1LL, 8006)dnl
define(T1LH, 8007)dnl
define(T2CL, 8008)dnl
define(T2CH, 8009)dnl
define(SR, 800a)dnl
define(ACR, 800b)dnl
define(PCR, 800c)dnl
define(IFR, 800d)dnl
define(IER, 800e)dnl
dnl
define(`L_CGRAM', `0b01000000')dnl
define(`L_DDRAM', `0b10000000')dnl
dnl
define(`L_E', `0b001')dnl
define(`L_RS', `0b010')dnl
define(`L_RW', `0b100')dnl
dnl
define(`hh', `eval($1, 16)')dnl
define(`bh', `eval(0b$1, 16)')dnl

View File

@ -1,56 +1,39 @@
; -*-asm-*-
changecom(`@')
;; VIA: 8000
define(PORTB, h8000)
define(PORTA, h8001)
define(DDRB, h8002)
define(DDRA, h8003)
define(`L_CGRAM', `0b01000000')
define(`L_DDRAM', `0b10000000')
define(`L_E', `0b001')
define(`L_RS', `0b010')
define(`L_RW', `0b100')
define(`hh', `eval($1, 16)')
define(`bh', `eval(0b$1, 16)')
include(`common.m4')
;; reset stack
reset: LDX # ff
TXS i
;; Set pins 0-2 on Port A to Output
LDA # bh(00000111)
LDA # %00000111
STA a DDRA
;; Function Set:
;; D7 D6 D5 D4 D3 D2 D1 D0
;; 0 0 1 B L F x x
;; (Bits 8/4, Lines 2/1, Font 5x11/5x8)
LDA # bh(00111000)
LDA # %00111000
JSR a :lcd-w-rs0
;; Display ON/OFF:
;; D7 D6 D5 D4 D3 D2 D1 D0
;; 0 0 0 0 0 D C B
;; (Display, Cursor, Blink)
LDA # bh(00001110)
LDA # %00001110
JSR a :lcd-w-rs0
;; Clear Display:
;; D7 D6 D5 D4 D3 D2 D1 D0
;; 0 0 0 0 0 0 0 1
LDA # bh(00000001)
LDA # %00000001
JSR a :lcd-w-rs0
;; Entry Mode Set:
;; D7 D6 D5 D4 D3 D2 D1 D0
;; 0 0 0 0 0 1 I/D S
;; (Increment/Decrement, Shift)
LDA # bh(00000110)
LDA # %00000110
JSR a :lcd-w-rs0
;; Set DDRAM Address:
@ -105,7 +88,7 @@ loop: LDA (zp),y 00
;; D7 D6 D5 D4 D3 D2 D1 D0
;; 0 0 0 0 0 D C B
;; (Display, Cursor, Blink)
LDA # bh(00001100)
LDA # %00001100
JSR a :lcd-w-rs0
;; Set CGRAM Address
@ -117,7 +100,7 @@ loop2: LDA # hh(L_CGRAM|9)
;; Write Data to CGRAM
;; D7 D6 D5 D4 D3 D2 D1 D0
;; D D D D D D D D
LDA # bh(00110)
LDA # %00110
JSR a :lcd-w-rs1
;; Set CGRAM Address
@ -129,7 +112,7 @@ loop2: LDA # hh(L_CGRAM|9)
;; Write Data to CGRAM
;; D7 D6 D5 D4 D3 D2 D1 D0
;; D D D D D D D D
LDA # bh(00000)
LDA # %00000
JSR a :lcd-w-rs1
JMP a :loop2
@ -164,7 +147,7 @@ lcd-w-rs1: JSR a :lcd-wait
;; wait BF
lcd-wait: PHA s
LDA # bh(00000000) ;; Set pins 0-7 on Port B to Input
LDA # %00000000 ;; Set pins 0-7 on Port B to Input
STA a DDRB
_lcd_wait: LDA # hh(L_RW)
@ -172,13 +155,13 @@ _lcd_wait: LDA # hh(L_RW)
LDA # hh(L_E|L_RW)
STA a PORTA
LDA a PORTB
AND # bh(10000000)
AND # %10000000
BNE r :_lcd_wait
LDA # hh(L_RW)
STA a PORTA
LDA # bh(11111111) ;; Set pins 0-7 on Port B to Output
LDA # %11111111 ;; Set pins 0-7 on Port B to Output
STA a DDRB
PLA s

64
timer.asm.in Normal file
View File

@ -0,0 +1,64 @@
; -*-asm-*-
include(`common.m4')
define(ticks_, 00)
BRA r :reset
BRA r :irq
;;; begin irq
irq: PHA s
LDA a T1CL
DEC zp ticks_
PLA s
RTI s
;;; end irq
reset: LDX # ff
TXS i
LDA # %10000000 ;; Set pins 0-7 on Port B to Output
STA a DDRA
JSR a :continuous
count: LDA # 25
STA zp ticks_
loop: LDA zp ticks_
BPL r :loop
LDA # %10000000
EOR a PORTA
STA a PORTA
BRA r :count
;;; begin continuous
continuous: LDA # %01000000
STA a ACR
LDA # 0e
STA a T1CL
LDA # 27
STA a T1CH
LDA # %11000000
STA a IER
CLI i
RTS s
;;; end continuous
;;; begin oneshot
oneshot: LDA # %00000000
STA a ACR
LDA # 50
STA a T1CL
LDA # c3
STA a T1CH
_oneshot: BIT a IFR
BVC r :_oneshot ; IFR[6]==0
LDA a T1CL ; clear IFR[6]
RTS s
;;; end oneshot