]> git.sur5r.net Git - cc65/commitdiff
New target supervision
authorcuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Fri, 10 Oct 2003 16:44:20 +0000 (16:44 +0000)
committercuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Fri, 10 Oct 2003 16:44:20 +0000 (16:44 +0000)
git-svn-id: svn://svn.cc65.org/cc65/trunk@2497 b7a2c559-68d2-44c3-8de9-860c34a00d81

doc/CREDITS
include/supervision.h [new file with mode: 0644]
libsrc/Makefile
libsrc/supervision/Makefile [new file with mode: 0644]
libsrc/supervision/crt0.s [new file with mode: 0644]
libsrc/supervision/supervision.inc [new file with mode: 0644]
src/cc65/main.c
src/common/tgttrans.c

index 1c6cac465465a23d561faa7ad38b09b45f2e951a..63156f020dcdfee14c9eaad840914f4485bc272d 100644 (file)
@@ -107,6 +107,10 @@ More special thanks to:
 
     Stefan contributed several code snippets for the C64 and Apple ][.
 
+  * Peter Trauner <peter.trauner@utanet.at>
+
+    Peter added minimal Supervision support.
+
 
 
 Thanks to
diff --git a/include/supervision.h b/include/supervision.h
new file mode 100644 (file)
index 0000000..85748e0
--- /dev/null
@@ -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
+
+
index 5529a54d959bfa7eb8a4b148924873d8451cf70e..2e1f4a9b282ff0c09df2b156c683e91ded79cde4 100644 (file)
@@ -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 (file)
index 0000000..3269f6e
--- /dev/null
@@ -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 (file)
index 0000000..2ad472f
--- /dev/null
@@ -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 (file)
index 0000000..a75fb02
--- /dev/null
@@ -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
index 3ed7127e3120c9a31d4f8a0b1e6b7e126256e803..0c3f0714b4c9e4bc5b9decef69aa7fbe3bdc6831 100644 (file)
@@ -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);
     }
 
index ef7a45e06614c91095d5978f7b09e9929b24fe44..3e7daab902fc2b294f4366550de4ce263c0340a7 100644 (file)
@@ -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)
 
 
 
-                    
+