From 6afee6fb0578518daf7bde5b31f04d5ed2b1fc73 Mon Sep 17 00:00:00 2001 From: cuz Date: Fri, 10 Oct 2003 16:44:20 +0000 Subject: [PATCH] New target supervision git-svn-id: svn://svn.cc65.org/cc65/trunk@2497 b7a2c559-68d2-44c3-8de9-860c34a00d81 --- doc/CREDITS | 4 + include/supervision.h | 113 +++++++++++++++++++++++++++++ libsrc/Makefile | 74 +++++++++++-------- libsrc/supervision/Makefile | 35 +++++++++ libsrc/supervision/crt0.s | 81 +++++++++++++++++++++ libsrc/supervision/supervision.inc | 76 +++++++++++++++++++ src/cc65/main.c | 6 +- src/common/tgttrans.c | 3 +- 8 files changed, 361 insertions(+), 31 deletions(-) create mode 100644 include/supervision.h create mode 100644 libsrc/supervision/Makefile create mode 100644 libsrc/supervision/crt0.s create mode 100644 libsrc/supervision/supervision.inc diff --git a/doc/CREDITS b/doc/CREDITS index 1c6cac465..63156f020 100644 --- a/doc/CREDITS +++ b/doc/CREDITS @@ -107,6 +107,10 @@ More special thanks to: Stefan contributed several code snippets for the C64 and Apple ][. + * Peter Trauner + + Peter added minimal Supervision support. + Thanks to diff --git a/include/supervision.h b/include/supervision.h new file mode 100644 index 000000000..85748e0a2 --- /dev/null +++ b/include/supervision.h @@ -0,0 +1,113 @@ +/*****************************************************************************/ +/* */ +/* supervision.h */ +/* */ +/* Supervision specific definitions */ +/* */ +/* */ +/* */ +/* 2003 Peter Trauner (trap@utanet.at) */ +/* */ +/* */ +/* This software is provided "as-is," without any expressed or implied */ +/* warranty. In no event will the authors be held liable for any damages */ +/* arising from the use of this software. */ +/* */ +/* Permission is granted to anyone to use this software for any purpose, */ +/* including commercial applications, and to alter and redistribute it */ +/* freely, subject to the following restrictions: */ +/* */ +/* 1. The origin of this software must not be misrepresented; you must not */ +/* claim that you wrote the original software. If you use this software */ +/* in a product, an acknowledgment, in the product's documentation, */ +/* would be appreciated, but is not required. */ +/* 2. Alterred source versions must be marked plainly as such, */ +/* and must not be misrepresented as being the original software. */ +/* 3. This notice may not be removed or alterred */ +/* from any source distribution. */ +/* */ +/*****************************************************************************/ + + + +#ifndef _SUPERVISION_H +#define _SUPERVISION_H + + + +/* Check for errors */ +#if !defined(__SUPERVISION__) +# error This module may only be used when compiling for the Supervision! +#endif + + + +/*****************************************************************************/ +/* Data */ +/*****************************************************************************/ + + + +struct __sv_lcd { + unsigned char width; + unsigned char height; + unsigned char xpos; + unsigned char ypos; +}; +#define SV_LCD ((struct __sv_lcd*)0x2000) + +struct __sv_tone { + unsigned delay; + unsigned char control; + unsigned char timer; +}; +#define SV_RIGHT ((struct __sv_tone*)0x2010) +#define SV_LEFT ((struct __sv_tone*)0x2014) + +struct __sv_noise { + unsigned char volume; /* and frequency */ + unsigned char timer; + unsigned char control; +}; +#define SV_NOISE ((struct __sv_noise*)0x2028) + +struct __io_port { + unsigned char in; + unsigned char out; +}; +#define IO_PORT ((struct __io_port*)(0x2021) + +struct __sv_dma { + unsigned start; + unsigned char size; + unsigned char control; + unsigned char on; +}; +#define SV_DMA ((struct __sv_dma*)0x2018) + +#define SV_CONTROL (*(unsigned char*)0x2020) + +#define SV_BANK (*(unsigned char*)0x2026) +#define SV_BANK_COMBINE(nmi,irq_timer,irq_dma,lcd_on, timer_prescale, bank) \ + ((nmi)?1:0)|((irq_timer)?2:0)|((irq_dma)?4:0)|((lcd_on)?8:0) \ + |((timer_prescale)?0x10:0)|((bank)<<5) + +#define SV_VIDEO ((unsigned char*)0x4000) +#define SV_TIMER_COUNT (*(unsigned char*)0x2023) + + + +/* Counters incremented asynchronously! + * If you want more complex, copy the crt0.s file from the libsrc/supervision + * directory and code them yourself (in assembler) + */ +extern unsigned char sv_nmi_counter; +extern unsigned char sv_timer_irq_counter; +extern unsigned char sv_timer_dma_counter; + + + +/* End of supervision.h */ +#endif + + diff --git a/libsrc/Makefile b/libsrc/Makefile index 5529a54d9..2e1f4a9b2 100644 --- a/libsrc/Makefile +++ b/libsrc/Makefile @@ -13,19 +13,20 @@ CC = ../../src/cc65/cc65 LD = ../../src/ld65/ld65 # List of all targets -ALLTARGETS = apple2 \ - atari \ - atmos \ - c16 \ - c128 \ - c64 \ - cbm510 \ - cbm610 \ - geos \ - nes \ - pet \ - plus4 \ - vic20 \ +ALLTARGETS = apple2 \ + atari \ + atmos \ + c16 \ + c128 \ + c64 \ + cbm510 \ + cbm610 \ + geos \ + nes \ + pet \ + plus4 \ + supervision \ + vic20 #----------------------------------------------------------------------------- @@ -81,22 +82,6 @@ atmoslib: done mv atmos/crt0.o atmos.o -#----------------------------------------------------------------------------- -# Vic20 - -vic20lib: - for i in vic20 cbm common runtime conio dbg em joystick tgi zlib; do \ - AS=$(AS) \ - CC=$(CC) \ - LD=$(LD) \ - AFLAGS="-t vic20 -I../../asminc" \ - CFLAGS="-Osir -g -T -t vic20 --forget-inc-paths -I. -I../../include" \ - $(MAKE) -C $$i || exit 1; \ - $(AR) a vic20.lib $$i/*.o;\ - done - mv vic20/crt0.o vic20.o - cp vic20/*.joy . - #----------------------------------------------------------------------------- # C16, C116 @@ -261,6 +246,37 @@ plus4lib: mv plus4/crt0.o plus4.o cp plus4/*.joy . +#----------------------------------------------------------------------------- +# Supervision + +supervisionlib: + for i in supervision common runtime; do \ + CC=$(CC) \ + AS=$(AS) \ + LD=$(LD) \ + AFLAGS="-t supervision -I../../asminc" \ + CFLAGS="-Osir -g -T -t supervision --forget-inc-paths -I. -I../../include" \ + $(MAKE) -C $$i || exit 1; \ + $(AR) a supervision.lib $$i/*.o;\ + done + mv supervision/crt0.o supervision.o + +#----------------------------------------------------------------------------- +# Vic20 + +vic20lib: + for i in vic20 cbm common runtime conio dbg em joystick tgi zlib; do \ + AS=$(AS) \ + CC=$(CC) \ + LD=$(LD) \ + AFLAGS="-t vic20 -I../../asminc" \ + CFLAGS="-Osir -g -T -t vic20 --forget-inc-paths -I. -I../../include" \ + $(MAKE) -C $$i || exit 1; \ + $(AR) a vic20.lib $$i/*.o;\ + done + mv vic20/crt0.o vic20.o + cp vic20/*.joy . + #----------------------------------------------------------------------------- # Dummy targets diff --git a/libsrc/supervision/Makefile b/libsrc/supervision/Makefile new file mode 100644 index 000000000..3269f6eed --- /dev/null +++ b/libsrc/supervision/Makefile @@ -0,0 +1,35 @@ +# +# cc65 makefile for the supervision specific modules +# + +.SUFFIXES: .o .s .c + +#-------------------------------------------------------------------------- +# Rules + +%.o: %.c + @$(CC) $(CFLAGS) $< + @$(AS) -o $@ $(AFLAGS) $(*).s + +%.o: %.s + @$(AS) -g -o $@ $(AFLAGS) $< + +#-------------------------------------------------------------------------- +# Object files + +C_OBJS = + +S_OBJS = crt0.o + +#-------------------------------------------------------------------------- +# Targets + +.PHONY: all clean zap + +all: $(C_OBJS) $(S_OBJS) + +clean: + @$(RM) $(C_OBJS:.c=.s) $(C_OBJS) $(S_OBJS) + +zap: clean + diff --git a/libsrc/supervision/crt0.s b/libsrc/supervision/crt0.s new file mode 100644 index 000000000..2ad472fb2 --- /dev/null +++ b/libsrc/supervision/crt0.s @@ -0,0 +1,81 @@ +; +; Startup code for cc65 (supervision version) +; +; This must be the *first* file on the linker command line +; + + .export _exit + + .import _main + .import initlib, donelib, copydata + .import zerobss + .import __RAM_START__, __RAM_SIZE__ ; Linker generated + + .include "zeropage.inc" + .include "supervision.inc" + + .export _sv_irq_timer_counter, _sv_irq_dma_counter + .export _sv_nmi_counter + +.bss + +_sv_irq_dma_counter: .byte 0 +_sv_irq_timer_counter: .byte 0 +_sv_nmi_counter: .byte 0 + +.code + +reset: + jsr zerobss + + ; initialize data + jsr copydata + + lda #>(__RAM_START__ + __RAM_SIZE__) + sta sp+1 ; Set argument stack ptr + stz sp ; #<(__RAM_START__ + __RAM_SIZE__) + jsr initlib + jsr _main +_exit: jsr donelib +exit: jmp exit + + +.proc irq + pha + lda sv_irq_source + and #SV_IRQ_REQUEST_TIMER + beq not_timer + lda sv_timer_quit + inc _sv_irq_timer_counter +not_timer: + lda sv_irq_source + and #SV_IRQ_REQUEST_DMA + beq not_dma + lda sv_dma_quit + inc _sv_irq_dma_counter +not_dma: + pla + rti +.endproc + +.proc nmi + inc _sv_nmi_counter + rti +.endproc + +; removing this segment gives only a warning + .segment "FFF0" +.proc reset32kcode + lda #(6<<5) + sta sv_bank +; now the 32kbyte image can reside in the top of 64kbyte, 128kbyte roms + jmp reset +.endproc + + .segment "VECTOR" + +.word nmi +.word reset32kcode +.word irq + + diff --git a/libsrc/supervision/supervision.inc b/libsrc/supervision/supervision.inc new file mode 100644 index 000000000..a75fb02f6 --- /dev/null +++ b/libsrc/supervision/supervision.inc @@ -0,0 +1,76 @@ +; supervision symbols + +; supervision 65c02s +; in cc65 up to 2.9.1 65c02 means 65c02s +.pc02 + +lcd_addr = $4000 +LCD_LINESIZE = $30 +LCD_WIDTH = 160 +LCD_HEIGHT = 160 +; 2 bit per pixel, packed + +lcd_width = $2000 +lcd_height = $2001 +lcd_xpos = $2002 ; in pixel, bit 0+1 not used +lcd_ypos = $2003 ; weird + +sv_port_r = $2021 +sv_port_w = $2022 + +sv_timer_count = $2023 +; read for quitting +sv_timer_quit = $2024 + +; bit 0 timer, bit 1 dma +sv_irq_source = $2027 +SV_IRQ_REQUEST_TIMER = 1 +SV_IRQ_REQUEST_DMA = 2 + +; bit 5,6,7 select bank at 0x8000 +sv_bank = $2026 +SV_NMI_ENABLE_ON = 1 +SV_IRQ_ENABLE_TIMER = 2 +SV_IRQ_ENABLE_DMA = 4 +SV_LCD_ON = 8 +SV_TIMER_MODE_240Hz = $10 ; else 15360 + + +; low activ/pressed +sv_control = $2020 +SV_RIGHT = 1 +SV_LEFT = 2 +SV_DOWN = 4 +SV_UP = 8 +SV_BUTTONB = $10 +SV_BUTTONA = $20 +SV_SELECT = $40 +SV_START = $80 + +; frequency=125000/counter +sv_audio_right_counter = $2010 ;word +sv_audio_left_counter = $2014 +SV_AUDIO_ON =$40 +;bits 0..3 volume +; bit 4 ? +; bit 5 ? +sv_audio_right_control = $2012 +sv_audio_left_control = $2016 +; write activates tone for x/60 sec (0 means 256) +sv_audio_right_timer = $2013 +sv_audio_left_timer = $2017 + + +;read for irq quitting +sv_dma_quit = $2025 +sv_dma_on = $201c +; bit 7 true start, false stop +sv_dma_start = $2018 ; word +sv_dma_size = $201a ; *32 samples +sv_dma_control = $201b +; bit 0,1 speed: 0 15360, 11 15360/4 +; bit 2,3 volume: 0 silent, 11 loud + +sv_noise_volume = $2028 ; and frequency +sv_noise_timer = $2029 +sv_noise_control = $202a diff --git a/src/cc65/main.c b/src/cc65/main.c index 3ed7127e3..0c3f0714b 100644 --- a/src/cc65/main.c +++ b/src/cc65/main.c @@ -215,7 +215,11 @@ static void SetSys (const char* Sys) DefineNumericMacro ("__NES__", 1); break; - default: + case TGT_SUPERVISION: + DefineNumericMacro ("__SUPERVISION__", 1); + break; + + default: AbEnd ("Unknown target system type %d", Target); } diff --git a/src/common/tgttrans.c b/src/common/tgttrans.c index ef7a45e06..3e7daab90 100644 --- a/src/common/tgttrans.c +++ b/src/common/tgttrans.c @@ -158,6 +158,7 @@ void TgtTranslateInit (void) case TGT_LUNIX: memcpy (Tab, CTNone, sizeof (Tab)); break; case TGT_ATMOS: memcpy (Tab, CTNone, sizeof (Tab)); break; case TGT_NES: memcpy (Tab, CTNone, sizeof (Tab)); break; + case TGT_SUPERVISION: memcpy (Tab, CTNone, sizeof (Tab)); break; default: AbEnd ("Internal error: Target system unknown (%d)", Target); } @@ -219,4 +220,4 @@ void TgtTranslateSet (unsigned Index, unsigned char C) - + -- 2.39.5