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 *.bin
*.rom *.rom
*.asm

View File

@ -1,6 +1,8 @@
HOME = /home/buhman HOME = /home/buhman
%.asm: %.asm.in all:
%.asm: %.asm.in common.m4
m4 < $< > $@ m4 < $< > $@
%.bin: %.asm %.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-*- ; -*-asm-*-
include(`common.m4')
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)')
;; reset stack ;; reset stack
reset: LDX # ff reset: LDX # ff
TXS i TXS i
;; Set pins 0-2 on Port A to Output ;; Set pins 0-2 on Port A to Output
LDA # bh(00000111) LDA # %00000111
STA a DDRA STA a DDRA
;; Function Set: ;; Function Set:
;; D7 D6 D5 D4 D3 D2 D1 D0 ;; D7 D6 D5 D4 D3 D2 D1 D0
;; 0 0 1 B L F x x ;; 0 0 1 B L F x x
;; (Bits 8/4, Lines 2/1, Font 5x11/5x8) ;; (Bits 8/4, Lines 2/1, Font 5x11/5x8)
LDA # bh(00111000) LDA # %00111000
JSR a :lcd-w-rs0 JSR a :lcd-w-rs0
;; Display ON/OFF: ;; Display ON/OFF:
;; D7 D6 D5 D4 D3 D2 D1 D0 ;; D7 D6 D5 D4 D3 D2 D1 D0
;; 0 0 0 0 0 D C B ;; 0 0 0 0 0 D C B
;; (Display, Cursor, Blink) ;; (Display, Cursor, Blink)
LDA # bh(00001110) LDA # %00001110
JSR a :lcd-w-rs0 JSR a :lcd-w-rs0
;; Clear Display: ;; Clear Display:
;; D7 D6 D5 D4 D3 D2 D1 D0 ;; D7 D6 D5 D4 D3 D2 D1 D0
;; 0 0 0 0 0 0 0 1 ;; 0 0 0 0 0 0 0 1
LDA # bh(00000001) LDA # %00000001
JSR a :lcd-w-rs0 JSR a :lcd-w-rs0
;; Entry Mode Set: ;; Entry Mode Set:
;; D7 D6 D5 D4 D3 D2 D1 D0 ;; D7 D6 D5 D4 D3 D2 D1 D0
;; 0 0 0 0 0 1 I/D S ;; 0 0 0 0 0 1 I/D S
;; (Increment/Decrement, Shift) ;; (Increment/Decrement, Shift)
LDA # bh(00000110) LDA # %00000110
JSR a :lcd-w-rs0 JSR a :lcd-w-rs0
;; Set DDRAM Address: ;; Set DDRAM Address:
@ -105,7 +88,7 @@ loop: LDA (zp),y 00
;; D7 D6 D5 D4 D3 D2 D1 D0 ;; D7 D6 D5 D4 D3 D2 D1 D0
;; 0 0 0 0 0 D C B ;; 0 0 0 0 0 D C B
;; (Display, Cursor, Blink) ;; (Display, Cursor, Blink)
LDA # bh(00001100) LDA # %00001100
JSR a :lcd-w-rs0 JSR a :lcd-w-rs0
;; Set CGRAM Address ;; Set CGRAM Address
@ -117,7 +100,7 @@ loop2: LDA # hh(L_CGRAM|9)
;; Write Data to CGRAM ;; Write Data to CGRAM
;; D7 D6 D5 D4 D3 D2 D1 D0 ;; D7 D6 D5 D4 D3 D2 D1 D0
;; D D D D D D D D ;; D D D D D D D D
LDA # bh(00110) LDA # %00110
JSR a :lcd-w-rs1 JSR a :lcd-w-rs1
;; Set CGRAM Address ;; Set CGRAM Address
@ -129,7 +112,7 @@ loop2: LDA # hh(L_CGRAM|9)
;; Write Data to CGRAM ;; Write Data to CGRAM
;; D7 D6 D5 D4 D3 D2 D1 D0 ;; D7 D6 D5 D4 D3 D2 D1 D0
;; D D D D D D D D ;; D D D D D D D D
LDA # bh(00000) LDA # %00000
JSR a :lcd-w-rs1 JSR a :lcd-w-rs1
JMP a :loop2 JMP a :loop2
@ -164,7 +147,7 @@ lcd-w-rs1: JSR a :lcd-wait
;; wait BF ;; wait BF
lcd-wait: PHA s 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 STA a DDRB
_lcd_wait: LDA # hh(L_RW) _lcd_wait: LDA # hh(L_RW)
@ -172,13 +155,13 @@ _lcd_wait: LDA # hh(L_RW)
LDA # hh(L_E|L_RW) LDA # hh(L_E|L_RW)
STA a PORTA STA a PORTA
LDA a PORTB LDA a PORTB
AND # bh(10000000) AND # %10000000
BNE r :_lcd_wait BNE r :_lcd_wait
LDA # hh(L_RW) LDA # hh(L_RW)
STA a PORTA 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 STA a DDRB
PLA s 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