Compare commits

..

No commits in common. "ae17478c147ace296e1b111076ec6077fbf5f95b" and "498d61186ac5be47c2ce7177424de3cdc4cac651" have entirely different histories.

11 changed files with 67 additions and 184 deletions

View File

@ -1,12 +1,8 @@
MEMORY { 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; ROM: start = $8000, size = $8000, type = ro, file = %O, fill = yes;
RAM: start = $0000, size = $5fff, type = rw, file = "", fill = yes;
} }
SEGMENTS { SEGMENTS {
ZP: load = RAM_ZP, type = bss, start = $0;
RAM: load = RAM, type = bss; RAM: load = RAM, type = bss;
CODE: load = ROM, type = ro; CODE: load = ROM, type = ro;
RODATA: load = ROM, type = ro; RODATA: load = ROM, type = ro;

View File

@ -27,16 +27,15 @@
; LCD ; LCD
; .include "utility.asm6502" ; .include "utility.asm6502"
LCD_IO = IO1 LCD_IO = IO1
.include "system/lcd.s65" .include "lcd.s65"
; Keypad Reading ; Keypad Reading
KP_IO = IO2 KP_IO = IO2
.include "system/keypad.s65" .include "keypad.s65"
; SPI ; SPI
SPI_IO = IO2 SPI_IO = IO1
.include "system/spi.s65" .include "system/spi.s65"
; Printer ; Printer
.include "programs/printer.s65" .include "printer.s65"
.include "programs/print_slow.s65"
; Digital Humidity and Temerature Sensor ; Digital Humidity and Temerature Sensor
; .include "dht.s65" ; .include "dht.s65"
@ -49,20 +48,20 @@ nmi:
jsr lcd_char jsr lcd_char
rti rti
irq: irq:
IRQ_VAR = 0
; read IRFs, while bit 7 ist set handle interrupts ; read IRFs, while bit 7 ist set handle interrupts
; Print str_irq
@irq_io1: @irq_io1:
lda SPI_IO+IO::IFR ; todo use a reserved address instead of 0
sta IRQ_VAR lda IO1+IO::IFR
bbr7 IRQ_VAR,@irq_io2 sta 0
bbs2 IRQ_VAR,@irq_spi_p ; check SR bbr7 0,@irq_io2
bbs2 0,@irq_spi_p ; check SR
@irq_io2: @irq_io2:
; lda IO2+IO::IFR lda IO2+IO::IFR
; sta IRQ_VAR sta 0
; bbr7 IRQ_VAR,@irq_return bbr7 0,@irq_return
; bbs4 IRQ_VAR,@irq_keypad ; check CB1 bbs4 0,@irq_keypad ; check CB1
; this should never be reached ; this should never be reached
jsr lcd_clear
Print str_irq_unknown Print str_irq_unknown
; force reset interrupt flags ; force reset interrupt flags
lda #$ff lda #$ff
@ -87,7 +86,7 @@ IRQ_VAR = 0
reset: reset:
jsr lcd_init jsr lcd_init
; jsr kp_init jsr kp_init
jsr spi_p_init jsr spi_p_init
@ -115,34 +114,53 @@ reset:
.endproc .endproc
.proc home .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 beq home
stz KB_LAST
; beq home ; beq home
cmp #'A' cmp #'A'
jeq printer jeq printer
cmp #'B' cmp #'B'
jeq SPI_CODE_START
; jeq dht_request ; jeq dht_request
cmp #'C' cmp #'C'
jeq print_1 jeq print_1
cmp #'D' cmp #'D'
jeq print_2 jeq print_2
cmp '4'
bra debug
cmp #'*' ; print home menu again if not visible (message 1 and 2 jmp to home) cmp #'*' ; print home menu again if not visible (message 1 and 2 jmp to home)
jeq return_home jeq return_home
jmp home jmp home
debug:
DEBUG_LED_ON 0
jmp home
.endproc .endproc
print_1: print_1:
jsr lcd_clear Print message_1
PrintSlow message_1,10
jmp home jmp home
print_2: print_2:
jsr lcd_clear Print message_2
PrintSlow message_2,10
jmp home jmp home
.segment "RODATA" .segment "RODATA"
@ -154,8 +172,7 @@ message_2:
.asciiz "================" .asciiz "================"
message_menu: message_menu:
.byte "<A> Printer " .byte "<A> Printer "
; .byte "<B> Temperatur " .byte "<B> Temperatur "
.byte "<B> Run from SPI"
.byte "<C> Text 1 " .byte "<C> Text 1 "
.asciiz "<D> Text 2 " .asciiz "<D> Text 2 "
str_irq: str_irq:

View File

@ -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

View File

@ -13,4 +13,4 @@ printer:
jeq return_home jeq return_home
jsr lcd_char jsr lcd_char
bra @printer_loop bra @printer_loop
.endif ; guard .endif

View File

@ -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,010239s
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,010244s
rts
; so T = N * 0,010244s - (1(last bne) + 4(jsr) + 6(rts)) * (1/1MHz)
.endproc
.endif ; guard

View File

@ -58,6 +58,7 @@ RB_LENGTH = RBUF_MEM_END - RBUF_MEM_START - 2
cpx RB_WRITE cpx RB_WRITE
beq @rb_read_rts ; if buffer empty beq @rb_read_rts ; if buffer empty
lda RB_START,x lda RB_START,x
Inc_buf_ptr RB_READ
inx ; increment RB_READ pointer, not using macro bec. of unknown Pz inx ; increment RB_READ pointer, not using macro bec. of unknown Pz
cpx #RB_LENGTH cpx #RB_LENGTH
beq @read_wrap beq @read_wrap
@ -88,17 +89,16 @@ RB_LENGTH = RBUF_MEM_END - RBUF_MEM_START - 2
stx RB_WRITE stx RB_WRITE
@check_buf_full: ; increment read if buffer is full @check_buf_full: ; increment read if buffer is full
cpx RB_READ cpx RB_READ
beq @read_inc beq read_inc
rts rts
@write_wrap: ; ptr == RB_LENGTH -> ptr = 0 @write_wrap: ; ptr == RB_LENGTH -> ptr = 0
stz RB_WRITE stz RB_WRITE
ldx #0
bra @check_buf_full bra @check_buf_full
@read_inc: @read_inc:
ldx RB_READ ldx RB_READ
inx inx
cpx #RB_LENGTH cpx #RB_LENGTH
beq @read_wrap beq read_wrap
stx RB_READ stx RB_READ
rts rts
@read_wrap: ; ptr == RB_LENGTH -> ptr = 0 @read_wrap: ; ptr == RB_LENGTH -> ptr = 0

View File

@ -18,7 +18,7 @@ INCLUDE_KEYPAD = 1
RBUF_MEM_START = $200 RBUF_MEM_START = $200
RBUF_MEM_END = $208 RBUF_MEM_END = $2ff
.define RBUF_NAME "keypad" .define RBUF_NAME "keypad"
.include "buffer.s65" .include "buffer.s65"
@ -61,15 +61,16 @@ KB_VAR = $05 ; any free zp address
ldx #$00 ldx #$00
jsr @kp_read_column jsr @kp_read_column
lda #%00001101 lda #%00001101
ldx #$08 ldx #$04
jsr @kp_read_column jsr @kp_read_column
lda #%00001011 lda #%00001011
ldx #$04 ldx #$08
jsr @kp_read_column jsr @kp_read_column
lda #%00000111 lda #%00000111
ldx #$0c ldx #$0c
jsr @kp_read_column jsr @kp_read_column
stz KP_IO+IO::RB ; todo why all zero? stz KP_IO+IO::RB ; todo why all zero?
; lda KP_IO+IO::RB ; read to definetly clear the interrupt flag
rts rts
@kp_read_column: @kp_read_column:
sta KP_IO+IO::RB sta KP_IO+IO::RB

View File

@ -13,8 +13,6 @@
; @optparam LCD_MEM: Memory address for a runtime variable. Default = $300 ; @optparam LCD_MEM: Memory address for a runtime variable. Default = $300
; @depends IO-W65C22N ; @depends IO-W65C22N
;******************************************************************************** ;********************************************************************************
.ifndef INCLUDE_LCD
INCLUDE_LCD = 1
.ifndef LCD_IO .ifndef LCD_IO
.fatal "LCD_IO is not defined: set it to the base address of the IO chip of the LCD" .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 jsr _lcd_cmd
rts rts
.endproc .endproc
.endif

View File

@ -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

View File

@ -9,14 +9,10 @@
.ifndef INCLUDE_SPI .ifndef INCLUDE_SPI
INCLUDE_SPI = 1 INCLUDE_SPI = 1
.segment "CODE" .segment "CODE"
SPI_CODE_START = $3000
SPI_PAGES_WRITTEN = $2fff
SPI_BYTES_WRITTEN = $2ffe
.struct SPI_P_Pins .struct SPI_P_Pins
; VIA addresses ; VIA addresses
DDR_a .word ; address of the data direction register DDR_a .word ; address of the data direction register
R_a .word ; address of the register R_a .word ; address of the register
@ -28,15 +24,13 @@ SPI_BYTES_WRITTEN = $2ffe
; settings ; settings
CPOL .byte ; Clock Polarity CPOL .byte ; Clock Polarity
CPHA .byte ; Clock Phase CPHA .byte ; Clock Phase
.endstruct .endstruct
;******************************************************************************** ;********************************************************************************
; @function Initialize the IO Adapter for SPI ; @function Initialize the IO Adapter for SPI
; @param ARG0-1 Address of the SPI_Pins struct ; @param ARG0-1 Address of the SPI_Pins struct
;******************************************************************************** ;********************************************************************************
.proc spi_p_init .proc spi_p_init
stz SPI_PAGES_WRITTEN
stz SPI_BYTES_WRITTEN
; todo USE MASKS ; todo USE MASKS
; set Shift register to shift in under external clock on CB1 ; set Shift register to shift in under external clock on CB1
lda #IO::ACR::SR_SIN_PHIE lda #IO::ACR::SR_SIN_PHIE
@ -45,16 +39,13 @@ SPI_BYTES_WRITTEN = $2ffe
; enable SR interrupts ; enable SR interrupts
lda #(IO::IRQ::IRQ | IO::IRQ::SR) lda #(IO::IRQ::IRQ | IO::IRQ::SR)
sta SPI_IO + IO::IER sta SPI_IO + IO::IER
DEBUG_LED_ON 1
rts rts
.endproc .endproc
.proc spi_p_read .proc spi_p_read
DEBUG_LED_ON 0
; print received byte ; print received byte
lda SPI_IO + IO::SR lda SPI_IO + IO::SR
jsr lcd_char jsr lcd_char
inc SPI_BYTES_WRITTEN
rts rts
.endproc .endproc

View File

@ -20,6 +20,7 @@ INCLUDE_UTILITY = 1
eor original eor original
sta original sta original
.endmacro .endmacro
.endif
;_n_genlabel .set 0 ;_n_genlabel .set 0
@ -30,5 +31,3 @@ INCLUDE_UTILITY = 1
; .ident(.sprintf("generated_label%04X", _n_genlabel)) ; .ident(.sprintf("generated_label%04X", _n_genlabel))
; _n_genlabel .set _n_genlabel + 1 ; _n_genlabel .set _n_genlabel + 1
;.endmacro ;.endmacro
.endif