Added support for the CBM510

git-svn-id: svn://svn.cc65.org/cc65/trunk@915 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
cuz 2001-09-13 21:47:10 +00:00
parent f74ed6a2d1
commit 3e5adc0926
5 changed files with 374 additions and 11 deletions

View File

@ -15,6 +15,7 @@ ALLTARGETS = apple2lib \
atarilib \
c64lib \
c128lib \
cbm510lib \
cbm610lib \
geoslib \
petlib \
@ -107,6 +108,22 @@ cbm610lib:
$(AR) a cbm610.lib $$i/*.o;\
done
#-----------------------------------------------------------------------------
# Commdore P500 / CBM 5x0
cbm510lib:
for i in cbm510 cbm common runtime conio dbg; do \
CC=$(CC) \
AS=$(AS) \
CFLAGS="-Osir -g -t cbm510 -I../../include" \
AFLAGS="-t cbm510" \
$(MAKE) -C $$i || exit 1; \
done
mv cbm510/crt0.o cbm510.o
for i in cbm510 cbm common runtime conio dbg; do \
$(AR) a cbm510.lib $$i/*.o;\
done
#-----------------------------------------------------------------------------
# GEOS on the C64/128

View File

@ -15,18 +15,14 @@ OBJS = _scrsize.o \
banking.o \
break.o \
cgetc.o \
clrscr.o \
color.o \
cputc.o \
crt0.o \
crtc.o \
kbhit.o \
kirq.o \
kplot.o \
color.o \
crt0.o \
kbhit.o \
kirq.o \
kplot.o \
kscnkey.o \
kudtim.o \
pokesys.o \
rs232.o
kudtim.o \
pokesys.o
all: $(OBJS)

117
libsrc/cbm510/break.s Normal file
View File

@ -0,0 +1,117 @@
;
; Ullrich von Bassewitz, 27.09.1998
;
; void set_brk (unsigned Addr);
; void reset_brk (void);
;
.export _set_brk, _reset_brk
.export _brk_a, _brk_x, _brk_y, _brk_sr, _brk_pc
.import _atexit
.include "zeropage.inc"
.include "page3.inc"
.bss
_brk_a: .res 1
_brk_x: .res 1
_brk_y: .res 1
_brk_sr: .res 1
_brk_pc: .res 2
_brk_01: .res 1
oldvec: .res 2 ; Old vector
.data
uservec: jmp $FFFF ; Patched at runtime
.code
; Set the break vector
.proc _set_brk
sta uservec+1
stx uservec+2 ; Set the user vector
lda oldvec
ora oldvec+1 ; Did we save the vector already?
bne L1 ; Jump if we installed the handler already
lda BRKVec
sta oldvec
lda BRKVec+1
sta oldvec+1 ; Save the old vector
L1: lda #<brk_handler ; Set the break vector to our routine
ldx #>brk_handler
sta BRKVec
stx BRKVec+1
rts
.endproc
; Reset the break vector
.proc _reset_brk
lda oldvec
ldx oldvec+1
beq @L9 ; Jump if vector not installed
sta BRKVec
stx BRKVec+1
lda #$00
sta oldvec ; Clear the old vector
stx oldvec+1
@L9: rts
.endproc
; Break handler, called if a break occurs
.proc brk_handler
pla
sta _brk_y
pla
sta _brk_x
pla
sta _brk_a
pla
and #$EF ; Clear break bit
sta _brk_sr
pla ; PC low
sec
sbc #2 ; Point to start of brk
sta _brk_pc
pla ; PC high
sbc #0
sta _brk_pc+1
lda IndReg
sta _brk_01
lda ExecReg
sta IndReg
jsr uservec ; Call the user's routine
lda _brk_01
sta IndReg
lda _brk_pc+1
pha
lda _brk_pc
pha
lda _brk_sr
pha
ldx _brk_x
ldy _brk_y
lda _brk_a
rti ; Jump back...
.endproc

154
libsrc/cbm510/io.inc Normal file
View File

@ -0,0 +1,154 @@
;
; I/O definitions for the CBM 510
;
; Taken from a kernal disassembly done by myself in 2000/2001.
;
; Ullrich von Bassewitz, 13.09.2001
; I/O $d800: VIC
VIC_SPR0_X = $00
VIC_SPR0_Y = $01
VIC_SPR1_X = $02
VIC_SPR1_Y = $03
VIC_SPR2_X = $04
VIC_SPR2_Y = $05
VIC_SPR3_X = $06
VIC_SPR3_Y = $07
VIC_SPR4_X = $08
VIC_SPR4_Y = $09
VIC_SPR5_X = $0A
VIC_SPR5_Y = $0B
VIC_SPR6_X = $0C
VIC_SPR6_Y = $0D
VIC_SPR7_X = $0E
VIC_SPR7_Y = $0F
VIC_SPR_HI_X = $10
VIC_SPR_ENA = $15
VIC_SPR_EXP_X = $17
VIC_SPR_EXP_Y = $1D
VIC_SPR_MCOLOR = $1C
VIC_SPR_BG_PRIO = $1B
VIC_SPR_MCOLOR0 = $25
VIC_SPR_MCOLOR1 = $26
VIC_SPR0_COLOR = $27
VIC_SPR1_COLOR = $28
VIC_SPR2_COLOR = $29
VIC_SPR3_COLOR = $2A
VIC_SPR4_COLOR = $2B
VIC_SPR5_COLOR = $2C
VIC_SPR6_COLOR = $2D
VIC_SPR7_COLOR = $2E
VIC_CTRL1 = $11
VIC_CTRL2 = $16
VIC_HLINE = $12
VIC_VIDEO_ADR = $18
VIC_IRR = $19 ; Interrupt request register
VIC_IMR = $1A ; Interrupt mask register
VIC_BORDERCOLOR = $20
VIC_BG_COLOR0 = $21
VIC_BG_COLOR1 = $22
VIC_BG_COLOR2 = $23
VIC_BG_COLOR3 = $24
; I/O $da00: SID 6581
; sid = $da00
Osc1 = $00
Osc2 = $07
Osc3 = $0e
FreqLo = $00
FreqHi = $01
PulseF = $02
PulseC = $03
OscCtl = $04
AtkDcy = $05
SusRel = $06
FiCtlLo = $15
FiCtlHi = $16
Resonance = $17
Volume = $18
PotX = $19
PotY = $1A
Random = $1B
Env3 = $1C
; I/O $db00: CIA 6526 Inter Process Communication
; IPCcia = $db00
PortA = $00
PortB = $01
DDRA = $02
DDRB = $03
TimALo = $04
TimAHi = $05
TimBLo = $06
TimBHi = $07
TOD10 = $08
TODsec = $09
TODmin = $0A
TODhour = $0B
SerDataReg = $0C
IntCtrReg = $0D
CtrlA = $0E
CtrlB = $0F
; I/O $dc00: CIA 6526
; cia = $dc00
; I/O $dd00: ACIA 6551
; acia = $dd00
ADataReg = $00
AStatusReg = $01
ACmdReg = $02
ACtrlReg = $03
; I/O $de00: Triport #1 6525
; tpi1 = $de00
tpiPortA = $00
tpiPortB = $01
tpiPortC = $02
tpiIntLatch = $02
tpiDDRA = $03
tpiDDRB = $04
tpiDDRC = $05
tpiIntMask = $05
tpiCtrlReg = $06
tpiActIntReg = $07
; I/O $df00: Triport #2 6525
; tpi2 = $df00

79
libsrc/cbm510/kplot.s Normal file
View File

@ -0,0 +1,79 @@
;
; Ullrich von Bassewitz, 13.09.2001
;
; PLOT routine for the 510.
;
.export k_plot
.importzp crtc
.include "zeropage.inc"
.proc k_plot
bcc set
ldx CURS_Y
ldy CURS_X
rts
set: stx CURS_Y
sty CURS_X
.if 0
lda LineLSBTab,x
sta CharPtr
lda LineMSBTab,x
sta CharPtr+1
lda IndReg
pha
lda #$0F
sta IndReg
ldy #$00
clc
sei
sta (crtc),y
lda CharPtr
adc CURS_X
iny
sta (crtc),y
dey
lda #$0E
sta (crtc),y
iny
lda (crtc),y
and #$F8
sta sedt1
lda CharPtr+1
adc #$00
and #$07
ora sedt1
sta (crtc),y
cli
pla
sta IndReg
.endif
rts
.endproc
; -------------------------------------------------------------------------
; Low bytes of the start address of the screen lines
.rodata
LineLSBTab:
.byte $00,$50,$A0,$F0,$40,$90,$E0,$30
.byte $80,$D0,$20,$70,$C0,$10,$60,$B0
.byte $00,$50,$A0,$F0,$40,$90,$E0,$30
.byte $80
; -------------------------------------------------------------------------
; High bytes of the start address of the screen lines
LineMSBTab:
.byte $D0,$D0,$D0,$D0,$D1,$D1,$D1,$D2
.byte $D2,$D2,$D3,$D3,$D3,$D4,$D4,$D4
.byte $D5,$D5,$D5,$D5,$D6,$D6,$D6,$D7
.byte $D7