Skip to content

Commit 80b0db9

Browse files
authored
Merge pull request #1149 from six809/opt-coco3
coco3: optimisations & fixes
2 parents 8934ef7 + 79550e1 commit 80b0db9

File tree

6 files changed

+145
-128
lines changed

6 files changed

+145
-128
lines changed

Kernel/platform/platform-coco3/Makefile

+63-37
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,43 @@
11

22
CSRCS = ttydw.c dwtime.c devsys.c
3-
CSRCS += devices.c main.c libc.c devsdc.c devlpr.c devrtsd.c mbr.c
3+
CSRCS += devices.c main.c libc.c devlpr.c mbr.c
4+
CSRCS_OPTIONAL = devsdc.c devrtsd.c
45

5-
CDSRCS = ../../dev/tinyide_discard.c ../../dev/tinysd_discard.c ../../dev/tinydisk_discard.c
6+
CSRCS_O0 = devtty.c
67

7-
DSRCS = ../../dev/devdw.c ../../dev/tinydisk.c ../../dev/tinyide.c ../../dev/tinysd.c
8+
CDSRCS = ../../dev/tinydisk_discard.c
9+
CDSRCS_OPTIONAL = ../../dev/tinyide_discard.c ../../dev/tinysd_discard.c
10+
11+
DSRCS = ../../dev/devdw.c ../../dev/tinydisk.c
12+
DSRCS_OPTIONAL = ../../dev/tinyide.c ../../dev/tinysd.c
813

914
NSRCS = ../../dev/net/net_native.c
1015

11-
ASRCS = coco3.s crt0.s ide.s sd.s rtsd.s
12-
ASRCS += tricks.s commonmem.s usermem_gime.s ../../dev/drivewire/drivewire.s sdc.s videoll.s
16+
ASRCS = coco3.s crt0.s
17+
ASRCS += tricks.s commonmem.s usermem_gime.s ../../dev/drivewire/drivewire.s videoll.s
18+
ASRCS_OPTIONAL = ide.s sd.s rtsd.s sdc.s
19+
20+
VSRCS_O0 = video.c
1321

1422
COBJS = $(CSRCS:.c=$(BINEXT))
23+
COBJS_OPTIONAL = $(CSRCS_OPTIONAL:.c=$(BINEXT))
24+
COBJS_O0 = $(CSRCS_O0:.c=$(BINEXT))
1525
AOBJS = $(ASRCS:.s=$(BINEXT))
16-
DOBJS = $(patsubst ../../dev/%.c,%.o, $(DSRCS))
17-
NOBJS = $(patsubst ../../dev/net/%.c,%.o, $(NSRCS))
18-
CDOBJS = $(CDSRCS:.c=$(BINEXT))
19-
OBJS = $(COBJS) $(AOBJS) $(DOBJS) $(CDOBJS) $(NOBJS)
26+
AOBJS_OPTIONAL = $(ASRCS_OPTIONAL:.s=$(BINEXT))
27+
DOBJS = $(patsubst ../../dev/%.c,%$(BINEXT), $(DSRCS))
28+
DOBJS_OPTIONAL = $(patsubst ../../dev/%.c,%$(BINEXT), $(DSRCS_OPTIONAL))
29+
NOBJS = $(patsubst ../../dev/net/%.c,%$(BINEXT), $(NSRCS))
30+
CDOBJS = $(patsubst ../../dev/%.c,%$(BINEXT), $(CDSRCS))
31+
CDOBJS_OPTIONAL = $(patsubst ../../dev/%.c,%$(BINEXT), $(CDSRCS_OPTIONAL))
32+
VOBJS_O0 = $(VSRCS_O0:.c=$(BINEXT))
33+
34+
OBJS = $(COBJS) $(COBJS_O0) $(AOBJS) $(DOBJS) $(CDOBJS) $(NOBJS) $(VOBJS_O0)
35+
OBJS_OPTIONAL = $(COBJS_OPTIONAL) $(AOBJS_OPTIONAL) $(DOBJS_OPTIONAL) $(CDOBJS_OPTIONAL)
2036

2137
CROSS_CCOPTS += -I../../dev/
2238

2339
HIGH = -mcode-section=.text3
2440

25-
JUNK = $(CSRCS:.c=.o) $(ASRCS:.s=.o) $(DSRCS:.c=.o)
26-
2741
# Set 'SUBTARGET' to one of: emu, real, fpga, nano.
2842

2943
ifndef SUBTARGET
@@ -75,36 +89,35 @@ else
7589
ASOPTS = --defsym BECKER=0
7690
endif
7791

78-
all: $(OBJS)
92+
.PHONY: all
93+
all:
7994

80-
$(COBJS): %$(BINEXT): %.c
81-
$(CROSS_CC) $(CROSS_CCOPTS) -c $<
95+
$(COBJS) $(COBJS_OPTIONAL): %$(BINEXT): %.c
96+
$(QUIET_CC)$(CROSS_CC) $(CROSS_CCOPTS) -o $@ $<
8297

83-
$(CDOBJS): %$(BINEXT): %.c
84-
$(CROSS_CC) $(CROSS_CCOPTS) $(CROSS_CC_SEGDISC) -c $<
98+
$(COBJS_O0): %$(BINEXT): %.c
99+
$(QUIET_CC)$(CROSS_CC) $(CROSS_CCOPTS) -O0 -o $@ $<
85100

86-
$(DOBJS): %$(BINEXT): ../../dev/%.c
87-
$(CROSS_CC) $(CROSS_CCOPTS) $(HIGH) -c $<
101+
$(CDOBJS) $(CDOBJS_OPTIONAL): %$(BINEXT): ../../dev/%.c
102+
$(QUIET_CC)$(CROSS_CC) $(CROSS_CCOPTS) $(CROSS_CC_SEGDISC) -o $@ $<
103+
104+
$(DOBJS) $(DOBJS_OPTIONAL): %$(BINEXT): ../../dev/%.c
105+
$(QUIET_CC)$(CROSS_CC) $(CROSS_CCOPTS) $(HIGH) -o $@ $<
88106

89107
$(NOBJS): %$(BINEXT): ../../dev/net/%.c
90-
$(CROSS_CC) $(CROSS_CCOPTS) -c $<
108+
$(QUIET_CC)$(CROSS_CC) $(CROSS_CCOPTS) -O0 -o $@ $<
91109

92-
$(AOBJS): %$(BINEXT): %.s
93-
$(CROSS_AS) $(ASOPTS) $< -o $*.o
110+
$(AOBJS) $(AOBJS_OPTIONAL): %$(BINEXT): %.s
111+
$(QUIET_AS)$(CROSS_AS) $(ASOPTS) $< -o $@
94112

113+
$(VOBJS_O0): %$(BINEXT): %.c
114+
$(QUIET_CC)$(CROSS_CC) $(CROSS_CC_VIDEO) $(CROSS_CCOPTS) -O0 -o $@ $<
95115

96-
clean:
97-
rm -f $(OBJS) $(JUNK) fuzix.dsk boot.bin core *~
98-
rm -f fuzix.tmp
116+
# Note: compile flags for some of these are overridden during the top-level
117+
# build in rules.mk (otherwise we'd have to rebuild them locally here).
99118

100-
image: boot.bin
101-
$(CROSS_CC) $(CROSS_CCOPTS) -O0 -c -o ../../bank16k.o ../../mm/bank16k.c
102-
$(CROSS_CC) $(CROSS_CCOPTS) -O0 -c -o devtty.o devtty.c
103-
$(CROSS_CC) $(CROSS_CCOPTS) -O0 -c -o ../../timer.o ../../timer.c
104-
$(CROSS_CC) $(CROSS_CCOPTS) -O0 -c -o net_native.o ../../dev/net/net_native.c
105-
$(CROSS_CC) $(CROSS_CC_VIDEO) $(CROSS_CCOPTS) -O0 -c -o video.o video.c
106-
$(CROSS_CC) $(CROSS_CC_VIDEO) $(CROSS_CCOPTS) -O0 -c -o ../../usermem.o ../../usermem.c
107-
$(CROSS_LD) -o ../../fuzix.bin -Map=../../fuzix.map --script=fuzix.link --oformat=decb \
119+
../../fuzix.bin: $(OBJS) $(DRIVERS)
120+
$(QUIET_LD)$(CROSS_LD) -o $@ -Map=../../fuzix.map --script=fuzix.link --oformat=decb \
108121
crt0.o commonmem.o \
109122
coco3.o ../../start.o ../../version.o ../../cpu-6809/lowlevel-6809.o \
110123
tricks.o main.o ../../timer.o ../../kdata.o devices.o \
@@ -116,18 +129,29 @@ image: boot.bin
116129
../../cpu-6809/usermem_std-6809.o devtty.o libc.o ../../vt.o usermem_gime.o video.o \
117130
videoll.o dwtime.o devsys.o mbr.o ../../network.o \
118131
../../syscall_net.o net_native.o $(DRIVERS)
132+
133+
fuzix.dsk: ../../fuzix.bin boot.bin AUTOEXEC.BAS
119134
# make DECB disk w/ new kernel
120-
rm -f fuzix.dsk
121-
decb dskini fuzix.dsk
122-
decb copy -2 -b ../../fuzix.bin ./fuzix.dsk,FUZIX.BIN
123-
decb copy -2 -b boot.bin ./fuzix.dsk,BOOT.BIN
124-
decb copy -l -0 -a AUTOEXEC.BAS ./fuzix.dsk,AUTOEXEC.BAS
135+
rm -f $@
136+
decb dskini $@
137+
decb copy -2 -b ../../fuzix.bin $@,FUZIX.BIN
138+
decb copy -2 -b boot.bin $@,BOOT.BIN
139+
decb copy -l -0 -a AUTOEXEC.BAS $@,AUTOEXEC.BAS
140+
141+
.PHONY: image
142+
image: fuzix.dsk
125143

126144
boot.bin: boot/boot.s
127145
lwasm -lboot.list -oboot.bin boot/boot.s
128146

147+
.PHONY: clean
148+
clean:
149+
rm -f $(OBJS) $(OBJS_OPTIONAL) fuzix.dsk boot.bin boot.list core *~
150+
rm -f fuzix.tmp
151+
129152
IMAGES = $(FUZIX_ROOT)/Images/$(TARGET)
130153

154+
.PHONY: diskimage
131155
diskimage:
132156
# Make a blank disk image with partition
133157
dd if=$(FUZIX_ROOT)/Standalone/filesystem-src/parttab.40M of=$(IMAGES)/disk.img bs=40017920 conv=sync
@@ -138,3 +162,5 @@ diskimage:
138162
dd if=fuzix.tmp of=$(IMAGES)/disk.img bs=512 seek=339420 conv=notrunc
139163
# Make an emulator image of it
140164
cat $(FUZIX_ROOT)/Standalone/filesystem-src/idehdr.40M $(IMAGES)/disk.img > $(IMAGES)/emu-ide.img
165+
166+
include ../../quiet.mk

Kernel/platform/platform-coco3/coco3.s

+41-63
Original file line numberDiff line numberDiff line change
@@ -197,28 +197,21 @@ b@ sta ,x+
197197
jsr _video_init
198198
;; Our vectors are in high memory unlike Z80 but we still
199199
;; need vectors
200-
ldu #0xfeee ; vector area
200+
ldu #0xff00 ; top of vector area
201201
lda #$7e ; jump opcode
202-
ldx #swi3_handler
203-
sta ,u+
204-
stx ,u++
205-
ldx #swi2_handler
206-
sta ,u+
207-
stx ,u++
208-
ldx #firq_handler
209-
sta ,u+
210-
stx ,u++
211-
ldx #my_interrupt_handler
212-
sta ,u+
213-
stx ,u++
214-
ldx #unix_syscall_entry
215-
sta ,u+
216-
stx ,u++
217202
ldx #nmi_handler
218-
sta ,u+
219-
stx ,u
220-
jsr _devtty_init
221-
rts
203+
pshu a,x
204+
ldx #unix_syscall_entry
205+
pshu a,x
206+
ldx #my_interrupt_handler
207+
pshu a,x
208+
ldx #firq_handler
209+
pshu a,x
210+
ldx #swi2_handler
211+
pshu a,x
212+
ldx #swi3_handler
213+
pshu a,x
214+
jmp _devtty_init ; tail call
222215

223216

224217
;------------------------------------------------------------------------------
@@ -269,24 +262,6 @@ a@ rti
269262
firq_handler:
270263
rti
271264

272-
273-
;;; Userspace mapping pages 7+ kernel mapping pages 3-5, first common 6
274-
;;; All registers preserved
275-
map_proc_always:
276-
pshs x,y,u
277-
ldx #U_DATA__U_PAGE
278-
jsr map_proc_2
279-
puls x,y,u,pc
280-
281-
;;; Maps a page table into cpu space
282-
;;; takes: X - pointer page table ( ptptr )
283-
;;; returns: nothing
284-
;;; modifies: nothing
285-
map_proc:
286-
cmpx #0 ; is zero?
287-
bne map_proc_2 ; no then map process; else: map the kernel
288-
;; !!! fall-through to below
289-
290265
;;; Maps the Kernel into CPU space
291266
;;; takes: nothing
292267
;;; returns: nothing
@@ -299,41 +274,45 @@ map_kernel:
299274
sta 0xff91 ;
300275
puls a,pc
301276

277+
;;; Maps a page table into cpu space
278+
;;; takes: X - pointer page table ( ptptr )
279+
;;; returns: nothing
280+
;;; modifies: nothing
281+
map_proc:
282+
cmpx #0 ; is zero?
283+
beq map_kernel ; yes then map kernel; else: map process
284+
pshs a,b,x,u
285+
bra map_proc_2
286+
287+
;;; Userspace mapping pages 7+ kernel mapping pages 3-5, first common 6
288+
;;; All registers preserved.
289+
302290
;;; User is in the FFA0 map with the top 8K as common
303291
;;; As the core code currently does 16K happily but not 8 we just pair
304292
;;; up pages
305293

306-
;;; Maps a page table into the MMU
307-
;;; takes: X = pointer to page table
308-
;;; returns: nothing
309-
;;; modifies: nothing
294+
map_proc_always:
295+
pshs a,b,x,u
296+
ldx #U_DATA__U_PAGE
310297
map_proc_2:
311-
pshs x,y,a
312-
ldy #0xffa0 ; MMU user map. We can fiddle with
298+
ldu #0xffa0 ; MMU user map. We can fiddle with
313299

314-
lda ,x+ ; get byte from page table
315-
sta ,y+ ; put it in mmu
300+
ldd ,x ; get two bytes from page table
301+
sta ,u ; first byte in mmu
316302
inca ; increment to get next 8k block
317-
sta ,y+ ; put it in mmu
303+
std 1,u ; put it in mmu, second byte in mmu
304+
incb ; next 8k block
305+
stb 3,u ; put it in mmu
318306

319-
lda ,x+
320-
sta ,y+
307+
ldd 2,x ; bank all but common memory
308+
sta 4,u
321309
inca
322-
sta ,y+
310+
std 5,u
323311

324-
lda ,x+
325-
sta ,y+
326-
inca
327-
sta ,y+
328-
329-
lda ,x+ ; bank all but common memory
330-
sta ,y
331-
332-
333-
lda #0
312+
clra
334313
sta init1_mirror ; and save INIT1 setting in mirror
335314
sta 0xff91 ; new mapping goes live here
336-
puls x,y,a,pc ; so had better include common!
315+
puls a,b,x,u,pc ; so had better include common!
337316

338317
;;;
339318
;;; Restore a saved mapping. We are guaranteed that we won't switch
@@ -425,5 +404,4 @@ blkdev_unrawflg
425404
stb 0xffa8
426405
incb
427406
stb 0xffa9
428-
jsr map_kernel
429-
rts
407+
jmp map_kernel ; tail call

Kernel/platform/platform-coco3/devices.c

+2
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,9 @@ void device_init(void)
6262
devrtsd_probe();
6363
#endif
6464
dw_init();
65+
#ifdef CONFIG_RTC
6566
inittod();
67+
#endif
6668
#ifdef CONFIG_NET
6769
sock_init();
6870
#endif

Kernel/platform/platform-coco3/mbr.c

+3
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
#include <kdata.h>
33
#include <printf.h>
44
#include <tinydisk.h>
5+
#include "config.h"
56

67
typedef struct {
78
uint8_t flags;
@@ -31,6 +32,7 @@ typedef struct {
3132
} boot_record_t;
3233

3334

35+
#ifdef CONFIG_TD_CUSTOMPART
3436
uint_fast8_t td_plt_setup(uint_fast8_t dev, uint32_t *lba, void *buf)
3537
{
3638
boot_record_t *br = buf;
@@ -70,3 +72,4 @@ uint_fast8_t td_plt_setup(uint_fast8_t dev, uint32_t *lba, void *buf)
7072
}
7173
return 1; /* Found it, don't scan further */
7274
}
75+
#endif
+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# Override flags for certain objects
2+
3+
# Note: mm/bank16k.o doesn't end up in mm/ as no -o option is used. I think
4+
# this is because some archs' compilers don't work with it? This also means
5+
# the dependency is wrong, and they'll get rebuilt every time.
6+
7+
mm/bank16k.o: CROSS_CC_SEG2 = -O0
8+
timer.o: CROSS_CC_SEG3 = -O0
9+
usermem.o: CROSS_CC_SEG3 = $(CROSS_CC_VIDEO) -O0

0 commit comments

Comments
 (0)