Custom memory config
This commit is contained in:
parent
83cfce2960
commit
14cff310b7
4 changed files with 63 additions and 27 deletions
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -5,3 +5,5 @@ fp-info-cache
|
||||||
plot/
|
plot/
|
||||||
*.o
|
*.o
|
||||||
*.bin
|
*.bin
|
||||||
|
*.map
|
||||||
|
*.lst
|
||||||
|
|
15
Makefile
15
Makefile
|
@ -1,12 +1,19 @@
|
||||||
|
|
||||||
MACHINE := pet
|
MACHINE := pet
|
||||||
|
|
||||||
.PHONY: all
|
.PHONY: all clean
|
||||||
|
|
||||||
all: rs232.bin
|
all: rs232.bin rs232.lst
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f rs232.bin *.o *.lst *.map
|
||||||
|
|
||||||
rs232.bin: driver.o
|
rs232.bin: driver.o
|
||||||
cl65 -t ${MACHINE} -o $@ $^
|
cl65 -v -C mem.cfg -l rs232.lst -m rs232.map -o $@ $^
|
||||||
|
|
||||||
|
%.lst: %.bin
|
||||||
|
@# the start address shouldn't be hardcoded here...
|
||||||
|
da65 -o $@ -S 0x7000 $<
|
||||||
|
|
||||||
%.o: %.a65
|
%.o: %.a65
|
||||||
ca65 -t ${MACHINE} -o $@ $<
|
ca65 -v -t ${MACHINE} -o $@ $<
|
||||||
|
|
52
driver.a65
52
driver.a65
|
@ -2,6 +2,13 @@
|
||||||
; 6502 mode
|
; 6502 mode
|
||||||
.p02
|
.p02
|
||||||
|
|
||||||
|
; define where we want to be loaded
|
||||||
|
.global __LOADADDR__
|
||||||
|
__LOADADDR__ = $7000
|
||||||
|
; and where data should reside
|
||||||
|
.global __DATAADDR__
|
||||||
|
__DATAADDR__ = $7200
|
||||||
|
|
||||||
; load useful register/memory locations
|
; load useful register/memory locations
|
||||||
.include "pet.inc"
|
.include "pet.inc"
|
||||||
|
|
||||||
|
@ -22,10 +29,25 @@ PHI2_CLOCK = 1000000
|
||||||
; don't set the baud rate too high, or other operations will be starved
|
; don't set the baud rate too high, or other operations will be starved
|
||||||
BAUD_RATE = 300
|
BAUD_RATE = 300
|
||||||
|
|
||||||
; we expect to be loaded somewhere in the middle of user ram
|
; parameters and return values can reside in an unused area of the zero page
|
||||||
; TODO verify if this is safe with the Editor/Basic 2.0 ROM
|
.zeropage
|
||||||
; or if there is a way to limit memory usage by the ROM
|
; available bytes to read or write
|
||||||
.org $7000
|
.export rs_available
|
||||||
|
rs_available: .byte 0
|
||||||
|
; single byte transfer from input / to output fifo
|
||||||
|
.export rs_data
|
||||||
|
rs_data: .byte 0
|
||||||
|
; status of operation
|
||||||
|
rs_status_ok = 0
|
||||||
|
rs_status_read_buffer_empty = 1
|
||||||
|
rs_status_write_buffer_full = 2
|
||||||
|
rs_status_device_not_initialized = 3
|
||||||
|
rs_status_device_already_initialized = 4
|
||||||
|
.export rs_status
|
||||||
|
rs_status: .byte 0
|
||||||
|
|
||||||
|
; specify the load address, so code and data will be located there
|
||||||
|
;.org __LOADADDR__
|
||||||
|
|
||||||
; entry points
|
; entry points
|
||||||
.code
|
.code
|
||||||
|
@ -45,25 +67,8 @@ BAUD_RATE = 300
|
||||||
rs_write:
|
rs_write:
|
||||||
jmp write
|
jmp write
|
||||||
|
|
||||||
; parameters and return values
|
|
||||||
.data
|
|
||||||
; available bytes to read or write
|
|
||||||
.export rs_available
|
|
||||||
rs_available: .byte 0
|
|
||||||
; single byte transfer from input / to output fifo
|
|
||||||
.export rs_data
|
|
||||||
rs_data: .byte 0
|
|
||||||
; status of operation
|
|
||||||
rs_status_ok = 0
|
|
||||||
rs_status_read_buffer_empty = 1
|
|
||||||
rs_status_write_buffer_full = 2
|
|
||||||
rs_status_device_not_initialized = 3
|
|
||||||
rs_status_device_already_initialized = 4
|
|
||||||
.export rs_status
|
|
||||||
rs_status: .byte 0
|
|
||||||
|
|
||||||
; driver state data
|
; driver state data
|
||||||
|
.data
|
||||||
; 1=driver initialized
|
; 1=driver initialized
|
||||||
initialized: .byte 0
|
initialized: .byte 0
|
||||||
; saved IRQ vector
|
; saved IRQ vector
|
||||||
|
@ -434,6 +439,7 @@ BAUD_RATE = 300
|
||||||
stx outqlen
|
stx outqlen
|
||||||
|
|
||||||
; prepare shift register
|
; prepare shift register
|
||||||
|
; layout: 000000E7 6543210S
|
||||||
; bit0 = start bit = 0
|
; bit0 = start bit = 0
|
||||||
; bit1..7 = data0..6
|
; bit1..7 = data0..6
|
||||||
clc
|
clc
|
||||||
|
@ -444,7 +450,7 @@ BAUD_RATE = 300
|
||||||
lda #%00000001
|
lda #%00000001
|
||||||
rol
|
rol
|
||||||
sta outbuf+1
|
sta outbuf+1
|
||||||
; set shift length
|
; we're shifting 10 bits out
|
||||||
lda #10
|
lda #10
|
||||||
sta outshift
|
sta outshift
|
||||||
|
|
||||||
|
|
21
mem.cfg
Normal file
21
mem.cfg
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
SYMBOLS {
|
||||||
|
__LOADADDR__: type = import;
|
||||||
|
__DATAADDR__: type = import;
|
||||||
|
}
|
||||||
|
MEMORY {
|
||||||
|
# $ED-$F7 seems to be an unused area in the zero page according to the BASIC 2.0/4.0 memory map
|
||||||
|
ZP: file = "", define = yes, start = $00ED, size = $000A;
|
||||||
|
# we're loading at $7000, max code size $800 bytes
|
||||||
|
RAM: file = %O, start = __LOADADDR__, size = $0800;
|
||||||
|
# if we reside in ROM instead, we should have more space available
|
||||||
|
ROM: file = %O, start = $9000, size = $2000;
|
||||||
|
}
|
||||||
|
SEGMENTS {
|
||||||
|
ZEROPAGE: load = ZP, type = zp;
|
||||||
|
# change these two to "ROM" if you want to put them on a ROM chip
|
||||||
|
CODE: load = RAM, type = ro;
|
||||||
|
RODATA: load = RAM, type = ro;
|
||||||
|
# data and bss should come after the code if they all reside in RAM
|
||||||
|
DATA: load = RAM, type = rw;
|
||||||
|
BSS: load = RAM, type = bss, define = yes;
|
||||||
|
}
|
Loading…
Reference in a new issue