Compare commits

..

5 Commits

Author SHA1 Message Date
Matthias@Dell
d5631307b0 change conventions 2023-11-11 12:14:25 +01:00
Matthias@Dell
ee9ebb06bb add via segments 2023-11-11 12:14:14 +01:00
Matthias@Dell
449610068a change to cc65 2023-11-11 12:14:02 +01:00
Matthias@Dell
039ed9a16b use .res for ram variables 2023-11-11 12:13:47 +01:00
Matthias@Dell
bc6093a881 rename s65 2023-11-11 12:12:03 +01:00
10 changed files with 70 additions and 57 deletions

View File

@ -8,9 +8,6 @@ leading underscors `_` indicate a "private" label/variable, that is meant for in
### Labels ### Labels
- `namespace_fname` for exported subroutines - `namespace_fname` for exported subroutines
- `_namespace_fname` or `_namespace_fname_sub` for internal labels - `_namespace_fname` or `_namespace_fname_sub` for internal labels
- `(_)namespace_LABELNAME` for labels to data sections - `(_)namespace_Macroname`
- `(_)NAMESPACE_SYMBOLNAME` for constant symbols
### Symbols/Macros - `(_)NAMESPACE_symbolname` for variables
- `(_)NAMESPACE_SYMBOLNAME` for symbols
- `(_)NAMESPACE_macroname

View File

@ -6,8 +6,10 @@ MEMORY {
ROM: start = $8000, size = $8000, type = ro, file = %O, fill = yes; ROM: start = $8000, size = $8000, type = ro, file = %O, fill = yes;
} }
SEGMENTS { SEGMENTS {
ZP: load = RAM_ZP, type = bss, start = $0; VIA1: load = VIA1, type = bss;
RAM: load = RAM, type = bss; VIA2: load = VIA2, type = bss;
ZEROPAGE: load = RAM_ZP, type = bss, start = $0;
BSS: load = RAM, type = bss;
CODE: load = ROM, type = ro; CODE: load = ROM, type = ro;
RODATA: load = ROM, type = ro; RODATA: load = ROM, type = ro;
RESET_VECTOR: load = ROM, type = ro, start = $FFFA; RESET_VECTOR: load = ROM, type = ro, start = $FFFA;

View File

@ -1,5 +1,5 @@
.segment "CODE" .include "system/system.s65"
.include "system/system.h65" .code
.macro DEBUG_LED_OFF nr .macro DEBUG_LED_OFF nr
lda IO1 + IO::RA lda IO1 + IO::RA
@ -44,6 +44,7 @@ SPI_IO = IO2
;******************************************************************************** ;********************************************************************************
; Interrupts ; Interrupts
;******************************************************************************** ;********************************************************************************
.code
nmi: nmi:
lda #'%' lda #'%'
jsr lcd_char jsr lcd_char
@ -145,11 +146,11 @@ print_2:
PrintSlow message_2,10 PrintSlow message_2,10
jmp home jmp home
.segment "RODATA" .rodata
message_1: .asciiz " Powered by ......6502...... **** www.quintern.xyz" message_1: .asciiz " Powered by ......6502...... **** www.quintern.xyz"
message_2: message_2:
.byte " Hallo " .byte " Hello "
.byte " Clara " .byte " there "
.byte " <3 " .byte " <3 "
.asciiz "================" .asciiz "================"
message_menu: message_menu:
@ -163,7 +164,6 @@ str_irq:
str_irq_unknown: str_irq_unknown:
.asciiz "Unknown IRQ src!" .asciiz "Unknown IRQ src!"
.segment "CODE"
;******************************************************************************** ;********************************************************************************
; reset vector ; reset vector
;******************************************************************************** ;********************************************************************************

View File

@ -3,7 +3,7 @@
;******************************************************************************** ;********************************************************************************
.ifndef INCLUDE_PRINTER .ifndef INCLUDE_PRINTER
INCLUDE_PRINTER = 1 INCLUDE_PRINTER = 1
.code
printer: printer:
jsr lcd_clear jsr lcd_clear
@printer_loop: @printer_loop:

View File

@ -1,5 +1,6 @@
.ifndef INCLUDE_SLEEP .ifndef INCLUDE_SLEEP
INCLUDE_SLEEP = 1 INCLUDE_SLEEP = 1
.code
;******************************************************************************** ;********************************************************************************
; @macro Sleep ; @macro Sleep
; @param time_cs: Time to sleep in centiseconds (10^-2s = 10ms) ; @param time_cs: Time to sleep in centiseconds (10^-2s = 10ms)
@ -19,15 +20,16 @@ INCLUDE_SLEEP = 1
; @details ; @details
; Interrupts might change the actual time to finish ; Interrupts might change the actual time to finish
; To be exact, time_cs is in units of 0.010244s ; To be exact, time_cs is in units of 0.010244s
; @modifies: ARG2
;******************************************************************************** ;********************************************************************************
.proc sleep .proc sleep
VAR_1 = 0 _VAR_1 = ARG2
stz VAR_1 stz _VAR_1
@loop: @loop:
.repeat 17 .repeat 17
nop ; 2 - i nop ; 2 - i
.endrepeat .endrepeat
inc VAR_1 ; 3 - zp inc _VAR_1 ; 3 - zp
bne @loop ; 2/3 - r (2 if not taken, but here most of the time its 3) 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 ; 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 ; with X = 17: T1 = (256×(17×2 + 3 +3) 1) × (1/1MHz) = 0,010239s

View File

@ -1,7 +1,7 @@
# 8-bit Breadboard Computer with W65C02S Processor # 8-bit Breadboard Computer with W65C02S Processor
This repo contains the assembly code for my [6502-project](https://quintern.xyz/de/6502.html). This repo contains the assembly code for my [6502-project](https://quintern.xyz/de/6502.html).
The assembler used for this project is [vasm](http://www.compilers.de/vasm.html). The assembler used for this project is the excellent [ca65](https://github.com/cc65/cc65).
After assembling it, the binary is loaded onto the EEPROM using [my *eeprom.py* script](https://git.quintern.xyz/MatthiasQuintern/AT28C256-rpi-util) on a Raspberry Pi 4B. After assembling it, the binary is loaded onto the EEPROM using [my *eeprom.py* script](https://git.quintern.xyz/MatthiasQuintern/AT28C256-rpi-util) on a Raspberry Pi 4B.
## Operating System ## Operating System

View File

@ -7,10 +7,11 @@
; The RBUF_NAME variable must be defined, the functions will then be exported ; The RBUF_NAME variable must be defined, the functions will then be exported
; as rb_<RBUF_NAME>_<function> where <function> = init, read or write ; as rb_<RBUF_NAME>_<function> where <function> = init, read or write
; @requires ; @requires
; RBUF_MEM_START: Start address of ringbuffer memory space ; RBUF_MEM_START: First address of ringbuffer memory space
; RBUF_MEM_END: End address of ringbuffer memory space ; RBUF_MEM_END: Last address of ringbuffer memory space
; RBUF_NAME: Name of the ringbuffer ; RBUF_NAME: Name of the ringbuffer
;******************************************************************************** ;********************************************************************************
.code
.ifndef RBUF_MEM_START .ifndef RBUF_MEM_START
.fatal "RBUF_MEM_START not defined" .fatal "RBUF_MEM_START not defined"

View File

@ -16,14 +16,17 @@ INCLUDE_KEYPAD = 1
.fatal "KP_IO is not defined: set it to the base address of the IO chip of the Keypad" .fatal "KP_IO is not defined: set it to the base address of the IO chip of the Keypad"
.endif .endif
.zeropage
_KP_COLUMN: .res 1 ; for storing stuff
RBUF_MEM_START = $200 .bss ; reserve space or ringbuffer
RBUF_MEM_END = $208 KP_BUF_SIZE = 10
RBUF_MEM_START: .res KP_BUF_SIZE
RBUF_MEM_END = RBUF_MEM_START + KP_BUF_SIZE - 1
.define RBUF_NAME "keypad" .define RBUF_NAME "keypad"
.include "buffer.s65" .include "buffer.s65"
KB_VAR = $05 ; any free zp address .code
.proc kp_init .proc kp_init
; todo remove later and test ; todo remove later and test
lda #$ff lda #$ff
@ -74,23 +77,23 @@ KB_VAR = $05 ; any free zp address
@kp_read_column: @kp_read_column:
sta KP_IO+IO::RB sta KP_IO+IO::RB
lda KP_IO+IO::RB lda KP_IO+IO::RB
sta KB_VAR ; store result in zeropage so that bbr can be used sta _KP_COLUMN ; store result in zeropage so that bbr can be used
bbr4 KB_VAR,@kp_write bbr4 _KP_COLUMN,@kp_write
inx inx
bbr5 KB_VAR,@kp_write bbr5 _KP_COLUMN,@kp_write
inx inx
bbr6 KB_VAR,@kp_write bbr6 _KP_COLUMN,@kp_write
inx inx
bbr7 KB_VAR,@kp_write bbr7 _KP_COLUMN,@kp_write
rts rts
@kp_write: @kp_write:
lda kp_VALUES,x lda _KP_VALUES,x
jsr rb_keypad_write jsr rb_keypad_write
rts rts
.endproc .endproc
.segment "RODATA" .rodata
kp_VALUES: _KP_VALUES:
; TODO change to literal ; TODO change to literal
.byte "123A", "456B", "789C", "*0#D" .byte "123A", "456B", "789C", "*0#D"
.endif .endif

View File

@ -5,17 +5,18 @@
; @depends IO-W65C22N ; @depends IO-W65C22N
;******************************************************************************** ;********************************************************************************
.include "system/system.h65" .include "system/system.s65"
.ifndef INCLUDE_SPI .ifndef INCLUDE_SPI
INCLUDE_SPI = 1 INCLUDE_SPI = 1
.segment "CODE"
SPI_CODE_START = $3000
SPI_PAGES_WRITTEN = $2fff
SPI_BYTES_WRITTEN = $2ffe
.bss
SPI_PAGES_WRITTEN: .res 1
SPI_BYTES_WRITTEN: .res 1
SPI_CODE_START: .res $1000
.code
.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

View File

@ -19,31 +19,38 @@ INCLUDE_SYSTEM = 1
; 0403 value offset ; 0403 value offset
; 0405-04a0 rh high/low, temp high/low, checksum ; 0405-04a0 rh high/low, temp high/low, checksum
; ARGUMENTS
; a,x,y can also be used
ARG0 = $10
ARG1 = $11
ARG2 = $12
ARG3 = $13
ARG4 = $14
ARG5 = $15
ARG6 = $16
ARG7 = $17
ARG9 = $19
ARG10 = $1a
ARG11 = $1b
ARG12 = $1c
ARG13 = $1d
ARG14 = $1e
ARG15 = $1f
.include "io_W65C22.h65" .include "io_W65C22.h65"
.include "utility.h65" .include "utility.h65"
; ARGUMENTS
; a,x,y can also be used
.segment "ZEROPAGE"
ARG0: .res 1
ARG1: .res 1
ARG2: .res 1
ARG3: .res 1
ARG4: .res 1
ARG5: .res 1
ARG6: .res 1
ARG7: .res 1
ARG9: .res 1
ARG10: .res 1
ARG11: .res 1
ARG12: .res 1
ARG13: .res 1
ARG14: .res 1
ARG15: .res 1
; RETURN VALUE ; RETURN VALUE
; in a ; in a
.segment "VIA1"
; IO1: .res 16
IO1 = $6000 IO1 = $6000
.segment "VIA2"
; IO2: .res 16
IO2 = $7000 IO2 = $7000
; struct method ; struct method