Compare commits
No commits in common. "ae17478c147ace296e1b111076ec6077fbf5f95b" and "498d61186ac5be47c2ce7177424de3cdc4cac651" have entirely different histories.
ae17478c14
...
498d61186a
@ -1,12 +1,8 @@
|
||||
MEMORY {
|
||||
RAM_ZP: start = $0000, size = $100, type = rw, file = "", fill = yes;
|
||||
RAM: start = $0100, size = $5eff, type = rw, file = "", fill = yes;
|
||||
VIA1: start = $6000, size = $600f, type = rw, file = "", fill = yes;
|
||||
VIA2: start = $7000, size = $700f, type = rw, file = "", fill = yes;
|
||||
ROM: start = $8000, size = $8000, type = ro, file = %O, fill = yes;
|
||||
RAM: start = $0000, size = $5fff, type = rw, file = "", fill = yes;
|
||||
}
|
||||
SEGMENTS {
|
||||
ZP: load = RAM_ZP, type = bss, start = $0;
|
||||
RAM: load = RAM, type = bss;
|
||||
CODE: load = ROM, type = ro;
|
||||
RODATA: load = ROM, type = ro;
|
||||
|
67
main.s65
67
main.s65
@ -27,16 +27,15 @@
|
||||
; LCD
|
||||
; .include "utility.asm6502"
|
||||
LCD_IO = IO1
|
||||
.include "system/lcd.s65"
|
||||
.include "lcd.s65"
|
||||
; Keypad Reading
|
||||
KP_IO = IO2
|
||||
.include "system/keypad.s65"
|
||||
.include "keypad.s65"
|
||||
; SPI
|
||||
SPI_IO = IO2
|
||||
SPI_IO = IO1
|
||||
.include "system/spi.s65"
|
||||
; Printer
|
||||
.include "programs/printer.s65"
|
||||
.include "programs/print_slow.s65"
|
||||
.include "printer.s65"
|
||||
; Digital Humidity and Temerature Sensor
|
||||
; .include "dht.s65"
|
||||
|
||||
@ -49,20 +48,20 @@ nmi:
|
||||
jsr lcd_char
|
||||
rti
|
||||
irq:
|
||||
IRQ_VAR = 0
|
||||
; read IRFs, while bit 7 ist set handle interrupts
|
||||
; Print str_irq
|
||||
@irq_io1:
|
||||
lda SPI_IO+IO::IFR
|
||||
sta IRQ_VAR
|
||||
bbr7 IRQ_VAR,@irq_io2
|
||||
bbs2 IRQ_VAR,@irq_spi_p ; check SR
|
||||
; todo use a reserved address instead of 0
|
||||
lda IO1+IO::IFR
|
||||
sta 0
|
||||
bbr7 0,@irq_io2
|
||||
bbs2 0,@irq_spi_p ; check SR
|
||||
@irq_io2:
|
||||
; lda IO2+IO::IFR
|
||||
; sta IRQ_VAR
|
||||
; bbr7 IRQ_VAR,@irq_return
|
||||
; bbs4 IRQ_VAR,@irq_keypad ; check CB1
|
||||
lda IO2+IO::IFR
|
||||
sta 0
|
||||
bbr7 0,@irq_return
|
||||
bbs4 0,@irq_keypad ; check CB1
|
||||
; this should never be reached
|
||||
jsr lcd_clear
|
||||
Print str_irq_unknown
|
||||
; force reset interrupt flags
|
||||
lda #$ff
|
||||
@ -87,7 +86,7 @@ IRQ_VAR = 0
|
||||
reset:
|
||||
jsr lcd_init
|
||||
|
||||
; jsr kp_init
|
||||
jsr kp_init
|
||||
|
||||
jsr spi_p_init
|
||||
|
||||
@ -115,34 +114,53 @@ reset:
|
||||
.endproc
|
||||
|
||||
.proc home
|
||||
jsr rb_keypad_read
|
||||
.macro wait
|
||||
wait:
|
||||
stz 1
|
||||
stz 2
|
||||
.repeat 2
|
||||
nop
|
||||
.endrepeat
|
||||
inc 1
|
||||
bne wait
|
||||
inc 2
|
||||
bne wait
|
||||
.endmacro
|
||||
|
||||
; jsr rb_keypad_read
|
||||
lda KB_LAST
|
||||
beq home
|
||||
stz KB_LAST
|
||||
; beq home
|
||||
cmp #'A'
|
||||
jeq printer
|
||||
cmp #'B'
|
||||
jeq SPI_CODE_START
|
||||
; jeq dht_request
|
||||
cmp #'C'
|
||||
jeq print_1
|
||||
cmp #'D'
|
||||
jeq print_2
|
||||
cmp '4'
|
||||
bra debug
|
||||
|
||||
cmp #'*' ; print home menu again if not visible (message 1 and 2 jmp to home)
|
||||
jeq return_home
|
||||
|
||||
jmp home
|
||||
|
||||
debug:
|
||||
DEBUG_LED_ON 0
|
||||
jmp home
|
||||
|
||||
|
||||
.endproc
|
||||
|
||||
|
||||
print_1:
|
||||
jsr lcd_clear
|
||||
PrintSlow message_1,10
|
||||
Print message_1
|
||||
jmp home
|
||||
|
||||
print_2:
|
||||
jsr lcd_clear
|
||||
PrintSlow message_2,10
|
||||
Print message_2
|
||||
jmp home
|
||||
|
||||
.segment "RODATA"
|
||||
@ -154,8 +172,7 @@ message_2:
|
||||
.asciiz "================"
|
||||
message_menu:
|
||||
.byte "<A> Printer "
|
||||
; .byte "<B> Temperatur "
|
||||
.byte "<B> Run from SPI"
|
||||
.byte "<B> Temperatur "
|
||||
.byte "<C> Text 1 "
|
||||
.asciiz "<D> Text 2 "
|
||||
str_irq:
|
||||
|
@ -1,46 +0,0 @@
|
||||
|
||||
.ifndef INCLUDE_PRINT_SLOW
|
||||
INCLUDE_PRINT_SLOW = 1
|
||||
|
||||
.include "programs/sleep.s65"
|
||||
.include "system/lcd.s65"
|
||||
|
||||
|
||||
;********************************************************************************
|
||||
; @function Print a null-terminated string
|
||||
; @param ARG0-1: Address of the string to print
|
||||
; @param x: time to sleep in centiseconds
|
||||
;********************************************************************************
|
||||
.proc print_slow
|
||||
ldy #$00
|
||||
@print_loop:
|
||||
lda (ARG0),y
|
||||
beq @print_end
|
||||
phx
|
||||
jsr sleep
|
||||
plx
|
||||
jsr lcd_char
|
||||
iny
|
||||
bra @print_loop
|
||||
@print_end:
|
||||
rts
|
||||
.endproc
|
||||
|
||||
;********************************************************************************
|
||||
; @macro Print a null-terminated string
|
||||
; @param message: Address of the message
|
||||
; @param time_cs: time to sleep in centiseconds
|
||||
;********************************************************************************
|
||||
.macro PrintSlow message,time_cs
|
||||
jsr lcd_clear
|
||||
lda #.LOBYTE(message)
|
||||
sta ARG0
|
||||
lda #.HIBYTE(message)
|
||||
sta ARG1
|
||||
phx
|
||||
ldx #time_cs
|
||||
jsr print_slow
|
||||
plx
|
||||
.endmacro
|
||||
|
||||
.endif ; guard
|
@ -13,4 +13,4 @@ printer:
|
||||
jeq return_home
|
||||
jsr lcd_char
|
||||
bra @printer_loop
|
||||
.endif ; guard
|
||||
.endif
|
||||
|
@ -1,41 +0,0 @@
|
||||
.ifndef INCLUDE_SLEEP
|
||||
INCLUDE_SLEEP = 1
|
||||
;********************************************************************************
|
||||
; @macro Sleep
|
||||
; @param time_cs: Time to sleep in centiseconds (10^-2s = 10ms)
|
||||
; @details
|
||||
; Interrupts might change the actual time to finish
|
||||
;********************************************************************************
|
||||
.macro Sleep time_cs
|
||||
phx
|
||||
ldx #time_cs
|
||||
jsr sleep
|
||||
plx
|
||||
.endmacro
|
||||
|
||||
;********************************************************************************
|
||||
; @function sleep
|
||||
; @param x: Time to sleep in centiseconds (10^-2s = 10ms)
|
||||
; @details
|
||||
; Interrupts might change the actual time to finish
|
||||
; To be exact, time_cs is in units of 0.010244s
|
||||
;********************************************************************************
|
||||
.proc sleep
|
||||
VAR_1 = 0
|
||||
stz VAR_1
|
||||
@loop:
|
||||
.repeat 17
|
||||
nop ; 2 - i
|
||||
.endrepeat
|
||||
inc VAR_1 ; 3 - zp
|
||||
bne @loop ; 2/3 - r (2 if not taken, but here most of the time its 3)
|
||||
; reaching this takes 256 * (X * 2(nop) + 3(inc) + 3(bne)) - 1(last bne) cycles
|
||||
; with X = 17: T1 = (256×(17×2 + 3 +3) − 1) × (1/1MHz) = 0,010 239 s
|
||||
dex ; 2 - i
|
||||
bne @loop ; 2/3 - r
|
||||
; with T1 = for running through VAR_1, one iteration takes
|
||||
; T1 + (2(dex) + 3(bne)) × (1/1MHz) = 0,010 244 s
|
||||
rts
|
||||
; so T = N * 0,010 244 s - (1(last bne) + 4(jsr) + 6(rts)) * (1/1MHz)
|
||||
.endproc
|
||||
.endif ; guard
|
@ -58,6 +58,7 @@ RB_LENGTH = RBUF_MEM_END - RBUF_MEM_START - 2
|
||||
cpx RB_WRITE
|
||||
beq @rb_read_rts ; if buffer empty
|
||||
lda RB_START,x
|
||||
Inc_buf_ptr RB_READ
|
||||
inx ; increment RB_READ pointer, not using macro bec. of unknown Pz
|
||||
cpx #RB_LENGTH
|
||||
beq @read_wrap
|
||||
@ -88,17 +89,16 @@ RB_LENGTH = RBUF_MEM_END - RBUF_MEM_START - 2
|
||||
stx RB_WRITE
|
||||
@check_buf_full: ; increment read if buffer is full
|
||||
cpx RB_READ
|
||||
beq @read_inc
|
||||
beq read_inc
|
||||
rts
|
||||
@write_wrap: ; ptr == RB_LENGTH -> ptr = 0
|
||||
stz RB_WRITE
|
||||
ldx #0
|
||||
bra @check_buf_full
|
||||
@read_inc:
|
||||
ldx RB_READ
|
||||
inx
|
||||
cpx #RB_LENGTH
|
||||
beq @read_wrap
|
||||
beq read_wrap
|
||||
stx RB_READ
|
||||
rts
|
||||
@read_wrap: ; ptr == RB_LENGTH -> ptr = 0
|
||||
|
@ -18,7 +18,7 @@ INCLUDE_KEYPAD = 1
|
||||
|
||||
|
||||
RBUF_MEM_START = $200
|
||||
RBUF_MEM_END = $208
|
||||
RBUF_MEM_END = $2ff
|
||||
.define RBUF_NAME "keypad"
|
||||
.include "buffer.s65"
|
||||
|
||||
@ -61,15 +61,16 @@ KB_VAR = $05 ; any free zp address
|
||||
ldx #$00
|
||||
jsr @kp_read_column
|
||||
lda #%00001101
|
||||
ldx #$08
|
||||
ldx #$04
|
||||
jsr @kp_read_column
|
||||
lda #%00001011
|
||||
ldx #$04
|
||||
ldx #$08
|
||||
jsr @kp_read_column
|
||||
lda #%00000111
|
||||
ldx #$0c
|
||||
jsr @kp_read_column
|
||||
stz KP_IO+IO::RB ; todo why all zero?
|
||||
; lda KP_IO+IO::RB ; read to definetly clear the interrupt flag
|
||||
rts
|
||||
@kp_read_column:
|
||||
sta KP_IO+IO::RB
|
||||
|
@ -13,8 +13,6 @@
|
||||
; @optparam LCD_MEM: Memory address for a runtime variable. Default = $300
|
||||
; @depends IO-W65C22N
|
||||
;********************************************************************************
|
||||
.ifndef INCLUDE_LCD
|
||||
INCLUDE_LCD = 1
|
||||
|
||||
.ifndef LCD_IO
|
||||
.fatal "LCD_IO is not defined: set it to the base address of the IO chip of the LCD"
|
||||
@ -230,4 +228,3 @@ LCD_CLEAR = %00000000
|
||||
jsr _lcd_cmd
|
||||
rts
|
||||
.endproc
|
||||
.endif
|
||||
|
@ -1,31 +0,0 @@
|
||||
|
||||
|
||||
.segment "ZP"
|
||||
.org 0
|
||||
.byte NULL
|
||||
.org $10
|
||||
.byte ARG0
|
||||
.byte ARG1
|
||||
.byte ARG2
|
||||
.byte ARG3
|
||||
.byte ARG4
|
||||
.byte ARG5
|
||||
.byte ARG6
|
||||
.byte ARG7
|
||||
.byte ARG8
|
||||
.byte ARG9
|
||||
.byte ARG10
|
||||
.byte ARG11
|
||||
.byte ARG12
|
||||
.byte ARG13
|
||||
.byte ARG14
|
||||
.byte ARG15
|
||||
|
||||
|
||||
|
||||
.segment "RAM"
|
||||
|
||||
.segment "SPI"
|
||||
.byte SPI_BYTES_WRITTEN
|
||||
.byte SPI_PAGES_WRITTEN
|
||||
.byte
|
@ -11,10 +11,6 @@
|
||||
INCLUDE_SPI = 1
|
||||
.segment "CODE"
|
||||
|
||||
SPI_CODE_START = $3000
|
||||
SPI_PAGES_WRITTEN = $2fff
|
||||
SPI_BYTES_WRITTEN = $2ffe
|
||||
|
||||
|
||||
.struct SPI_P_Pins
|
||||
; VIA addresses
|
||||
@ -35,8 +31,6 @@ SPI_BYTES_WRITTEN = $2ffe
|
||||
; @param ARG0-1 Address of the SPI_Pins struct
|
||||
;********************************************************************************
|
||||
.proc spi_p_init
|
||||
stz SPI_PAGES_WRITTEN
|
||||
stz SPI_BYTES_WRITTEN
|
||||
; todo USE MASKS
|
||||
; set Shift register to shift in under external clock on CB1
|
||||
lda #IO::ACR::SR_SIN_PHIE
|
||||
@ -45,16 +39,13 @@ SPI_BYTES_WRITTEN = $2ffe
|
||||
; enable SR interrupts
|
||||
lda #(IO::IRQ::IRQ | IO::IRQ::SR)
|
||||
sta SPI_IO + IO::IER
|
||||
DEBUG_LED_ON 1
|
||||
rts
|
||||
.endproc
|
||||
|
||||
.proc spi_p_read
|
||||
DEBUG_LED_ON 0
|
||||
; print received byte
|
||||
lda SPI_IO + IO::SR
|
||||
jsr lcd_char
|
||||
inc SPI_BYTES_WRITTEN
|
||||
rts
|
||||
.endproc
|
||||
|
||||
|
@ -20,6 +20,7 @@ INCLUDE_UTILITY = 1
|
||||
eor original
|
||||
sta original
|
||||
.endmacro
|
||||
.endif
|
||||
|
||||
|
||||
;_n_genlabel .set 0
|
||||
@ -30,5 +31,3 @@ INCLUDE_UTILITY = 1
|
||||
; .ident(.sprintf("generated_label%04X", _n_genlabel))
|
||||
; _n_genlabel .set _n_genlabel + 1
|
||||
;.endmacro
|
||||
|
||||
.endif
|
||||
|
Loading…
Reference in New Issue
Block a user