Compare commits

..

8 Commits

Author SHA1 Message Date
matthias@rpi
ae17478c14 start spi work 2023-11-09 12:10:00 +01:00
matthias@rpi
e0ba885132 change labels 2023-11-09 12:09:36 +01:00
matthias@rpi
454812a647 add genlabel 2023-11-09 12:09:06 +01:00
matthias@rpi
60f42f2d90 add guard 2023-11-09 12:08:26 +01:00
matthias@rpi
cb203bf62d fix swapped rows 2023-11-09 12:08:09 +01:00
matthias@rpi
db80bd9aa3 add sleep 2023-11-09 12:07:37 +01:00
matthias@rpi
0b1dcf4998 add ram 2023-11-09 12:07:12 +01:00
matthias@rpi
e0f58c262a add print slow 2023-11-09 12:06:48 +01:00
11 changed files with 184 additions and 67 deletions

View File

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

View File

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

46
programs/print_slow.s65 Normal file
View File

@ -0,0 +1,46 @@
.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
jsr lcd_char
bra @printer_loop
.endif
.endif ; guard

41
programs/sleep.s65 Normal file
View File

@ -0,0 +1,41 @@
.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,7 +58,6 @@ 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
@ -89,16 +88,17 @@ 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

View File

@ -18,7 +18,7 @@ INCLUDE_KEYPAD = 1
RBUF_MEM_START = $200
RBUF_MEM_END = $2ff
RBUF_MEM_END = $208
.define RBUF_NAME "keypad"
.include "buffer.s65"
@ -61,16 +61,15 @@ KB_VAR = $05 ; any free zp address
ldx #$00
jsr @kp_read_column
lda #%00001101
ldx #$04
ldx #$08
jsr @kp_read_column
lda #%00001011
ldx #$08
ldx #$04
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

View File

@ -13,6 +13,8 @@
; @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"
@ -228,3 +230,4 @@ LCD_CLEAR = %00000000
jsr _lcd_cmd
rts
.endproc
.endif

31
system/ram.s65 Normal file
View File

@ -0,0 +1,31 @@
.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,28 +9,34 @@
.ifndef INCLUDE_SPI
INCLUDE_SPI = 1
.segment "CODE"
.segment "CODE"
SPI_CODE_START = $3000
SPI_PAGES_WRITTEN = $2fff
SPI_BYTES_WRITTEN = $2ffe
.struct SPI_P_Pins
; VIA addresses
DDR_a .word ; address of the data direction register
R_a .word ; address of the register
; pin mask
SCLK_p .byte ; Serial Clock
POCI_p .byte ; Peripheral Out / Controller In
PICO_p .byte ; Peripheral In / Controller Out
CSB_p .byte ; Chip Select
; settings
CPOL .byte ; Clock Polarity
CPHA .byte ; Clock Phase
.endstruct
.struct SPI_P_Pins
; VIA addresses
DDR_a .word ; address of the data direction register
R_a .word ; address of the register
; pin mask
SCLK_p .byte ; Serial Clock
POCI_p .byte ; Peripheral Out / Controller In
PICO_p .byte ; Peripheral In / Controller Out
CSB_p .byte ; Chip Select
; settings
CPOL .byte ; Clock Polarity
CPHA .byte ; Clock Phase
.endstruct
;********************************************************************************
; @function Initialize the IO Adapter for SPI
; @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
@ -39,13 +45,16 @@ INCLUDE_SPI = 1
; 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

View File

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