From f81aefe8bdc0b113bfb1d2ac7e5c7d8a40c33778 Mon Sep 17 00:00:00 2001 From: Wayne Parham Date: Sun, 9 May 2021 17:13:24 -0500 Subject: [PATCH] Synertek Systems Sym-1 config files --- asminc/sym1.inc | 186 +++++++++++++++++++++++++++++++++++++++++++ cfg/sym1-32k.cfg | 46 +++++++++++ cfg/sym1-4k.cfg | 46 +++++++++++ cfg/sym1.cfg | 46 +++++++++++ doc/sym1.sgml | 135 +++++++++++++++++++++++++++++++ include/symio.h | 148 ++++++++++++++++++++++++++++++++++ samples/helloworld.c | 9 +++ src/ca65/main.c | 3 + 8 files changed, 619 insertions(+) create mode 100644 asminc/sym1.inc create mode 100644 cfg/sym1-32k.cfg create mode 100644 cfg/sym1-4k.cfg create mode 100644 cfg/sym1.cfg create mode 100644 doc/sym1.sgml create mode 100644 include/symio.h create mode 100644 samples/helloworld.c diff --git a/asminc/sym1.inc b/asminc/sym1.inc new file mode 100644 index 000000000..b6a6f17fe --- /dev/null +++ b/asminc/sym1.inc @@ -0,0 +1,186 @@ +; --------------------------------------------------------------------------- +; +; SYM-1 definitions +; +; --------------------------------------------------------------------------- + + +RAMSTART := $0200 ; Entry point + + +; --------------------------------------------------------------------------- +; Monitor Functions +; --------------------------------------------------------------------------- +WARM := $8003 ; Monitor entry +SVNMI := $809B ; Save NMI entry +INBYTE := $81D9 ; Get two HEX characters and pack +ASCNIB := $8275 ; Test for carriage-return +INCCMP := $82B2 ; Increment pointer +CHKSAD := $82DD ; Compute checksum +OUTPC := $82EE ; Display program counter +OUTBYT := $82FA ; Print byte as two ASCII characters +OUTS2 := $8319 ; Print pointer +INSTAT := $8386 ; Determine if key is pressed +GETKEY := $88AF ; Get key (disregarding monitor login) +SCAND := $8906 ; Flash LED display (once) +KEYQ := $8923 ; Test for keypress +BEEP := $8972 ; Make a beep +CONFIG := $89A5 ; Configure I/O +OUTDSP := $89C1 ; Output to on-board LED display +INCHR := $8A1B ; Input character and convert to uppercase +OUTCHR := $8A47 ; Output character +INTCHR := $8A58 ; Input character without case conversion +DLYF := $8AE6 ; Delay 1 bit time +DLYH := $8AE9 ; Delay 1/2 bit time +RESET := $8B4A ; Hard reset +ACCESS := $8B86 ; Unlock lowest 4K memory +NACCES := $8B9C ; Lock lowest 4K memory +L8C78 := $8C78 ; Link to tape +DUMPT := $8E87 ; Dump memory to tape +LOADT := $8C78 ; Load memory from tape +TAPEMODE := $00FD ; Top bit on for high-speed + + +; --------------------------------------------------------------------------- +; System Memory +; --------------------------------------------------------------------------- +DISBUF := $A640 ; On-Board Display Buffer +DISBUF0 := $A640 ; Left-Most digit +DISBUF1 := $A641 ; Second digit +DISBUF2 := $A642 ; Third +DISBUF3 := $A643 ; Fourth +DISBUF4 := $A644 ; Fifth +DISBUF5 := $A645 ; Sixth and right-most digit +DISBUF6 := $A646 ; Not-used / right of display (shift buffer) +RDIG := $A645 ; Right-most digit (same as DISBUF5) +P3L := $A64A ; Parameter 3 (low-byte) +P3H := $A64B ; (high-byte) +P2L := $A64C ; Parameter 2 +P2H := $A64D ; +P1L := $A64E ; Parameter 1 +P1H := $A64F +PARNR := $A649 ; Number of Parameters Entered +PADBIT := $A650 ; Pad Bits for Carriage Return +SDBYT := $A651 ; Baud Rate for RS232 (01-4800,06-2400,10-1200,24-600,4C-300,D5-110) +ERCNT := $A652 ; Error Count (Max FF) +TECHO := $A653 ; Terminal Echo (bit-7=ECHO/NO, 6=CTL-O TOGGLE) +TOUTFL := $A654 ; Output Flags (bit-7=CRT IN, 6=TTY IN, 5=TTY OUT, 4=CRT OUT) +KSHFL := $A655 ; Keyboard Shift Flag +TV := $A656 ; Trace Velocity (0=Single Step) +LSTCOM := $A657 ; Last Monitor Command +MAXRC := $A658 ; Maximum Record Length for Memory Dump + + +; --------------------------------------------------------------------------- +; Register Followers +; --------------------------------------------------------------------------- +PCLR := $A659 ; Program Counter (low-byte) +PCHR := $A65A ; (high-byte) +SR := $A65B ; Stack Pointer +FR := $A65C ; Status Register Flags +AR := $A65D ; A Register +XR := $A65E ; X Register +YR := $A65F ; Y Register + + +; --------------------------------------------------------------------------- +; I/O Vectors (3 bytes each) +; --------------------------------------------------------------------------- +INVEC := $A660 ; Input Character +OUTVEC := $A663 ; Output Character +INSVEC := $A666 ; Input Status +URSVEC := $A669 ; Unrecognized Syntax +URCVEC := $A66C ; Unrecognized Command / Error +SCNVEC := $A66F ; Scan On-board Display + + +; --------------------------------------------------------------------------- +; Trace and Interrupt Vectors (2 bytes each) +; --------------------------------------------------------------------------- +EXEVEC := $A672 ; Exec and Alternate InVec +TRCVEC := $A674 ; Trace +UBRKVC := $A676 ; User Break after Monitor +UIRQVC := $A678 ; User non-break IRQ after Monitor +NMIVEC := $A67A ; Non-Maskable Interrupt +RSTVEC := $A67C ; Reset +IRQVEC := $A67E ; Interrupt Request + + +; --------------------------------------------------------------------------- +; I/O Registers +; --------------------------------------------------------------------------- +; +; 6532 (U27) +; +PADA := $A400 ; Keyboard / Display +P3DA := $A402 ; Serial I/O +DDPADA := $A401 ; Data-Direction Register for PADA +DDP3DA := $A403 ; Data-Direction Register for P3DA +WEDRTA := $A404 ; Write-Edge Detect Read Timer A +WEDRFA := $A405 ; Write-Edge Detect Read-Int Flags A +WEDRTB := $A406 ; Write-Edge Detect Read Timer B +WEDRFB := $A407 ; Write-Edge Detect Read-Int Flags B +TIM0001 := $A41C ; Timer / 1 +TIM0008 := $A41D ; Timer / 8 +TIM0064 := $A41E ; Timer / 64 +TIM1024 := $A41F ; Timer / 1024 +; +; 6522 (U25) +; +OR1A := $A001 ; Input / Output Register for 1A +DDR1A := $A003 ; Data-Direction Register for 1A +OR1B := $A000 ; Input / Output Register for 1B +DDR1B := $A002 ; Data-Direction Register for 1B +TIC1L := $A004 ; +TIC1H := $A005 ; +TIL1L := $A006 ; +TIL1H := $A007 ; +T2L1L := $A008 ; +T2C1L := $A008 ; +T2C1H := $A009 ; +SR1 := $A00A ; +ACR1 := $A00B ; +PCR1 := $A00C ; +IFR1 := $A00D ; +IER1 := $A00E ; +DR1A := $A00F ; +; +; 6522 (U28) +; +OR2A := $A801 ; Input / Output Register for 2A +DDR2A := $A803 ; Data-Direction Register for 2A +OR2B := $A800 ; Input / Output Register for 2B +DDR2B := $A802 ; Data-Direction Register for 2B +TIC2L := $A804 ; +TIC2H := $A805 ; +TIL2L := $A806 ; +TIL2H := $A807 ; +T2L2L := $A808 ; +T2C2L := $A808 ; +T2C2H := $A809 ; +SR2 := $A80A ; +ACR2 := $A80B ; +PCR2 := $A80C ; +IFR2 := $A80D ; +IER2 := $A80E ; +DR2A := $A80F ; +; +; 6522 (U29) +; +OR3A := $AC01 ; Write-Protect RAM, Debug On/Off, I/O-3A +DDR3A := $AC03 ; Data-Direction Register for 3A +OR3B := $AC00 ; Input / Output Register for 3B +DDR3B := $AC02 ; Data-Direction Register for 3B +TIC3L := $AC04 ; +TIC3H := $AC05 ; +TIL3L := $AC06 ; +TIL3H := $AC07 ; +T2L3L := $AC08 ; +T2C3L := $AC08 ; +T2C3H := $AC09 ; +SR3 := $AC0A ; +ACR3 := $AC0B ; +PCR3 := $AC0C ; +IFR3 := $AC0D ; +IER3 := $AC0E ; +DR3A := $AC0F ; diff --git a/cfg/sym1-32k.cfg b/cfg/sym1-32k.cfg new file mode 100644 index 000000000..14ddfb98f --- /dev/null +++ b/cfg/sym1-32k.cfg @@ -0,0 +1,46 @@ +# sym1-32k.cfg (32k) +# +# for Sym-1 with 32kb RAM +# +# ld65 --config sym1-32k.cfg -o .bin .o + +FEATURES { + STARTADDRESS: default = $0200; + CONDES: segment = STARTUP, + type = constructor, + label = __CONSTRUCTOR_TABLE__, + count = __CONSTRUCTOR_COUNT__; + CONDES: segment = STARTUP, + type = destructor, + label = __DESTRUCTOR_TABLE__, + count = __DESTRUCTOR_COUNT__; +} + +SYMBOLS { + __STACKSIZE__: type = weak, value = $0200; # 512 byte program stack + __STARTADDRESS__: type = export, value = %S; +} + +MEMORY { + ZP: start = $0000, size = $00F7, define = yes, file = %O; + CPUSTACK: start = $0100, size = $0100, define = yes; + RAM: start = %S, size = $8000 - %S - __STACKSIZE__, define = yes, file = %O; + MONROM: start = $8000, size = $1000, define = yes; + EXT: start = $9000, size = $1000, define = yes; + IO: start = $A000, size = $1000, define = yes; + RAE1: start = $B000, size = $1000, define = yes; + BASROM: start = $C000, size = $1000, define = yes; + RAE2: start = $E000, size = $1000, define = yes; + TOP: start = $F000, size = $1000, define = yes; +} + +SEGMENTS { + ZEROPAGE: load = ZP, type = zp, define = yes; + STARTUP: load = RAM, type = ro, define = yes; + CODE: load = RAM, type = ro, define = yes; + RODATA: load = RAM, type = ro, define = yes; + ONCE: load = RAM, type = ro, define = yes; + DATA: load = RAM, type = rw, define = yes; + BSS: load = RAM, type = bss, define = yes; +} + diff --git a/cfg/sym1-4k.cfg b/cfg/sym1-4k.cfg new file mode 100644 index 000000000..240d7bc82 --- /dev/null +++ b/cfg/sym1-4k.cfg @@ -0,0 +1,46 @@ +# sym1-4k.cfg (4k) +# +# for Sym-1 with 4kb RAM +# +# ld65 --config sym1-4k.cfg -o .bin .o + +FEATURES { + STARTADDRESS: default = $0200; + CONDES: segment = STARTUP, + type = constructor, + label = __CONSTRUCTOR_TABLE__, + count = __CONSTRUCTOR_COUNT__; + CONDES: segment = STARTUP, + type = destructor, + label = __DESTRUCTOR_TABLE__, + count = __DESTRUCTOR_COUNT__; +} + +SYMBOLS { + __STACKSIZE__: type = weak, value = $0080; # 128 byte program stack + __STARTADDRESS__: type = export, value = %S; +} + +MEMORY { + ZP: start = $0000, size = $00F7, define = yes, file = %O; + CPUSTACK: start = $0100, size = $0100, define = yes; + RAM: start = %S, size = $1000 - %S - __STACKSIZE__, define = yes, file = %O; + MONROM: start = $8000, size = $1000, define = yes; + EXT: start = $9000, size = $1000, define = yes; + IO: start = $A000, size = $1000, define = yes; + RAE1: start = $B000, size = $1000, define = yes; + BASROM: start = $C000, size = $1000, define = yes; + RAE2: start = $E000, size = $1000, define = yes; + TOP: start = $F000, size = $1000, define = yes; +} + +SEGMENTS { + ZEROPAGE: load = ZP, type = zp, define = yes; + STARTUP: load = RAM, type = ro, define = yes; + CODE: load = RAM, type = ro, define = yes; + RODATA: load = RAM, type = ro, define = yes; + ONCE: load = RAM, type = ro, define = yes; + DATA: load = RAM, type = rw, define = yes; + BSS: load = RAM, type = bss, define = yes; +} + diff --git a/cfg/sym1.cfg b/cfg/sym1.cfg new file mode 100644 index 000000000..240d7bc82 --- /dev/null +++ b/cfg/sym1.cfg @@ -0,0 +1,46 @@ +# sym1-4k.cfg (4k) +# +# for Sym-1 with 4kb RAM +# +# ld65 --config sym1-4k.cfg -o .bin .o + +FEATURES { + STARTADDRESS: default = $0200; + CONDES: segment = STARTUP, + type = constructor, + label = __CONSTRUCTOR_TABLE__, + count = __CONSTRUCTOR_COUNT__; + CONDES: segment = STARTUP, + type = destructor, + label = __DESTRUCTOR_TABLE__, + count = __DESTRUCTOR_COUNT__; +} + +SYMBOLS { + __STACKSIZE__: type = weak, value = $0080; # 128 byte program stack + __STARTADDRESS__: type = export, value = %S; +} + +MEMORY { + ZP: start = $0000, size = $00F7, define = yes, file = %O; + CPUSTACK: start = $0100, size = $0100, define = yes; + RAM: start = %S, size = $1000 - %S - __STACKSIZE__, define = yes, file = %O; + MONROM: start = $8000, size = $1000, define = yes; + EXT: start = $9000, size = $1000, define = yes; + IO: start = $A000, size = $1000, define = yes; + RAE1: start = $B000, size = $1000, define = yes; + BASROM: start = $C000, size = $1000, define = yes; + RAE2: start = $E000, size = $1000, define = yes; + TOP: start = $F000, size = $1000, define = yes; +} + +SEGMENTS { + ZEROPAGE: load = ZP, type = zp, define = yes; + STARTUP: load = RAM, type = ro, define = yes; + CODE: load = RAM, type = ro, define = yes; + RODATA: load = RAM, type = ro, define = yes; + ONCE: load = RAM, type = ro, define = yes; + DATA: load = RAM, type = rw, define = yes; + BSS: load = RAM, type = bss, define = yes; +} + diff --git a/doc/sym1.sgml b/doc/sym1.sgml new file mode 100644 index 000000000..d02e3b1b1 --- /dev/null +++ b/doc/sym1.sgml @@ -0,0 +1,135 @@ + + +
+Synertek Systems Sym-1 specific information for cc65 +<author><url url="mailto:wayne@parhamdata.com" name="Wayne Parham"> + +<abstract> +An overview over the Sym-1 runtime system as it is implemented for the cc65 C compiler. +</abstract> + +<!-- Table of contents --> +<toc> + +<!-- Begin the document --> + +<sect>Overview<p> + +This file contains an overview of the Sym-1 runtime system as it comes with the cc65 C compiler. It describes the memory layout, Sym-1 specific header files, available drivers, and any pitfalls specific to the platform. + +Please note that Sym-1 specific functions are just mentioned here, they are described in detail in the separate <url url="funcref.html" name="function reference">. Even functions marked as "platform dependent" may be available on more than one platform. Please see the function reference for more information. + +<sect>Binary format<p> + +The standard binary output format generated by the linker for the Sym-1 target is a 4 kbyte machine language program. It is, of course, possible to change this behavior by using one of the different linker configs. + +<p> + +Included with this distribution is a 4k configuration file and a 32k config file. The Sym-1 on-board memory is limited to 4k but system memory can be increased to 32 kbytes of contiguous RAM with aftermarket add-on boards. So choose the config file that matches your system configuration before compiling and linking user programs. + +<sect>Memory layout<p> + +The ROMs and I/O areas are defined in the configuration files, as are most of the entry points for useful subroutines in the Sym-1 monitor ROM. cc65 generated programs compiled and linked using 4k config run in the memory range of $200 - $0FFF. The 32k config expands this range to $7FFF. The starting memory location and entry point for running the program is $200, so when the program is transferred to the Sym-1, it is executed by typing 'g 200'. The system returns control back to the monitor ROM when the program terminates, providing the '.' prompt. + +Special locations: + +<descrip> + <tag/Text screen/ + Conio support is not currently available for the Sym-1. But stdio console functions are available. + + <tag/Stack/ + The C runtime stack is located at $0FFF on 4kb Syms, or at $7FFFfor 32kb systems. The stack always grows downwards. + + <tag/Heap/ + The C heap is located at the end of the program and grows towards the C + runtime stack. + +</descrip><p> + +<sect>Platform specific header files<p> + +Programs containing Sym-1 code may use the <tt/symio.h/ header file. See the header file for more information. + +<sect1>Hardware access<p> + +The following pseudo variables declared in the <tt/sym1.inc/ include file allow access to hardware located in the address space. See the include file for more information. + +<sect>Loadable drivers<p> + +<sect1>Graphics drivers<p> + +No graphics drivers are currently available for the Sym-1. + +<sect1>Extended memory drivers<p> + +No extended memory drivers are currently available for the Sym-1. + +<sect1>Joystick drivers<p> + +No joystick driver is currently available for the Sym-1. + +<sect1>Mouse drivers<p> + +No mouse drivers are currently available for the Sym-1. + +<sect1>RS232 device drivers<p> + +No communication port drivers are currently available for the Sym-1. It has only the "master console" e.g. stdin and stdout. + +<sect>Limitations<p> + +<sect1>Disk I/O<p> + +The existing library for the Sym-1 doesn't implement C file I/O. + +To be more specific, this limitation means that you cannot use any of the following functions (and a few others): + +<itemize> +<item>fopen +<item>fclose +<item>fread +<item>fwrite +<item>... +</itemize> + +<sect>Other hints<p> + +<sect1>symio.h<p> +You can use stdio.h if you wish, which provides console I/O (like printf) but does not have access to a filesystem, as mentioned above. + +But there is another header available, which exposes Sym-specific I/O functions that are useful for reading and writing its ports and front panel. It also exposes functions normally included using stdio.h but <i>only</i> the console I/O functions and not the filesystem functions. See the symio.h include file for a list of the functions available. + +<sect2>Limited memory applications<p> + +As stated earlier, there are config files for 4kb and 32kb systems. If you have 32kb RAM, then you will probably want to use the sym1_32k configuration, but if not - if you are using the sym1_32k configuration - then you may want to use functions like getchar, putchar, gets and puts rather than printf. Printf requires about 1kb because it needs to know how to process all the format specifiers. + +<sect3>Sample programs<p> + +All the samples will run on the "stock" 4k Sym-1, except for symio.c, which requires 8k. Information on building and running it is in the samples/tutorial/sym1 directory. + +<itemize> +<item>helloworld is the traditional "Hello World!" program, using printf().</item> +<item>symHello prints "Hello World!" and then inputs characters, which are echoed on the screen. It also makes a "beep" sound.</item> +<item>symTiny does the same as symhello, but does it with puts() rather than printf() to show the difference in compiled binary size.</item> +<item>symDisplay allows entry of a message, which is then displayed by scrolling it across the front panel display.</item> +<item>symIO allows access to the Sym-1 digital I/O ports.</item> +</itemize> + +<sect>License<p> + +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 it and redistribute it freely, subject to the following restrictions: + +<enum> +<item> 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 documentation would be + appreciated but is not required. +<item> Altered source versions must be plainly marked as such, and must not + be misrepresented as being the original software. +<item> This notice may not be removed or altered from any source + distribution. +</enum> + +</article> diff --git a/include/symio.h b/include/symio.h new file mode 100644 index 000000000..bd90a42f9 --- /dev/null +++ b/include/symio.h @@ -0,0 +1,148 @@ +// symio.h +// +// I/O primitives for Sym-1 +// +// Wayne Parham + +#ifndef _SYMIO_H +#define _SYMIO_H + +#include <stddef.h> +#include <stdarg.h> + +int __fastcall__ beep (void); // Beep sound +int __fastcall__ set_D0 (char); // Set display digit 0 +int __fastcall__ get_D0 (void); // Get value of display digit 0 +int __fastcall__ set_D1 (char); // Set display digit 1 +int __fastcall__ get_D1 (void); // Get value of display digit 1 +int __fastcall__ set_D2 (char); // Set display digit 2 +int __fastcall__ get_D2 (void); // Get value of display digit 2 +int __fastcall__ set_D3 (char); // Set display digit 3 +int __fastcall__ get_D3 (void); // Get value of display digit 3 +int __fastcall__ set_D4 (char); // Set display digit 4 +int __fastcall__ get_D4 (void); // Get value of display digit 4 +int __fastcall__ set_D5 (char); // Set display digit 5 +int __fastcall__ get_D5 (void); // Get value of display digit 5 +int __fastcall__ set_D6 (char); // Set byte to the right of display (leading buffer) +int __fastcall__ get_D6 (void); // Get value of memory byte to the right of display +int __fastcall__ fdisp (void); // Flash display + +int __fastcall__ loadt (int); // Read from tape (id) +int __fastcall__ dumpt (int, int, int); // Write to tape (id, start_addr, end_addr) + +int __fastcall__ set_DDR1A (int); // Set data direction register 1A (U25) +int __fastcall__ get_DDR1A (void); // Get value of data direction register 1A +int __fastcall__ set_IOR1A (int); // Set I/O register 1A +int __fastcall__ get_IOR1A (void); // Get value of I/O register 1A + +int __fastcall__ set_DDR1B (int); // Set data direction register 1B (U25) +int __fastcall__ get_DDR1B (void); // Get value of data direction register 1B +int __fastcall__ set_IOR1B (int); // Set I/O register 1B +int __fastcall__ get_IOR1B (void); // Get value of I/O register 1B + +int __fastcall__ set_DDR2A (int); // Set data direction register 2A (U28) +int __fastcall__ get_DDR2A (void); // Get value of data direction register 2A +int __fastcall__ set_IOR2A (int); // Set I/O register 2A +int __fastcall__ get_IOR2A (void); // Get value of I/O register 2A + +int __fastcall__ set_DDR2B (int); // Set data direction register 2B (U28) +int __fastcall__ get_DDR2B (void); // Get value of data direction register 2B +int __fastcall__ set_IOR2B (int); // Set I/O register 2B +int __fastcall__ get_IOR2B (void); // Get value of I/O register 2B + +int __fastcall__ set_DDR3A (int); // Set data direction register 3A (U29) +int __fastcall__ get_DDR3A (void); // Get value of data direction register 3A +int __fastcall__ set_IOR3A (int); // Set I/O register 3A +int __fastcall__ get_IOR3A (void); // Get value of I/O register 3A + +int __fastcall__ set_DDR3B (int); // Set data direction register 3B (U29) +int __fastcall__ get_DDR3B (void); // Get value of data direction register 3B +int __fastcall__ set_IOR3B (int); // Set I/O register 3B +int __fastcall__ get_IOR3B (void); // Get value of I/O register 3B + +#ifndef _STDIO_H + +int __fastcall__ putchar (char); +int __fastcall__ puts (const char* s); +int printf (const char* format, ...); +int sprintf (char* buf, const char* format, ...); +int __fastcall__ vprintf (const char* format, va_list ap); +int __fastcall__ vsnprintf (char* buf, size_t size, const char* format, va_list ap); +int __fastcall__ vsprintf (char* buf, const char* format, va_list ap); +char __fastcall__ getchar (void); +char* __fastcall__ gets (char* s); +int scanf (const char* format, ...); +int sscanf (const char* s, const char* format, ...); +int __fastcall__ vscanf (const char* format, va_list ap); +int __fastcall__ vsscanf (const char* s, const char* format, va_list ap); + +#endif + +// Display character definitions + +#define DISP_1 0x06 // '1' +#define DISP_2 0x5B // '2' +#define DISP_3 0x4F // '3' +#define DISP_4 0x66 // '4' +#define DISP_5 0x6D // '5' +#define DISP_6 0x7C // '6' +#define DISP_7 0x07 // '7' +#define DISP_8 0x7F // '8' +#define DISP_9 0x67 // '9' +#define DISP_0 0x3F // '0' +#define DISP_A 0x77 // 'A' +#define DISP_b 0x7C // 'b' +#define DISP_C 0x39 // 'C' +#define DISP_c 0x58 // 'c' +#define DISP_d 0x5E // 'd' +#define DISP_E 0x79 // 'E' +#define DISP_e 0x7B // 'e' +#define DISP_F 0x71 // 'F' +#define DISP_G 0x7D // 'G' +#define DISP_g 0x6F // 'g' +#define DISP_H 0x76 // 'H' +#define DISP_h 0x74 // 'h' +#define DISP_I 0x06 // 'I' +#define DISP_i 0x04 // 'i' +#define DISP_J 0x1E // 'J' +#define DISP_K 0x74 // 'K' +#define DISP_L 0x38 // 'L' +#define DISP_M_1 0x33 // 'M' +#define DISP_M_2 0x27 // 2nd half +#define DISP_n 0x54 // 'n' +#define DISP_O 0x3F // 'O' +#define DISP_o 0x5C // 'o' +#define DISP_P 0x73 // 'P' +#define DISP_q 0x67 // 'q' +#define DISP_r 0x50 // 'r' +#define DISP_S 0x6D // 'S' +#define DISP_t 0x46 // 't' +#define DISP_U 0x3E // 'U' +#define DISP_u 0x1C // 'u' +#define DISP_V_1 0x64 // 'V' +#define DISP_V_2 0x52 // 2nd half +#define DISP_W_1 0x3C // 'W' +#define DISP_W_2 0x1E // 2nd half +#define DISP_Y 0x6E // 'Y' +#define DISP_Z 0x5B // 'Z' +#define DISP_SPACE 0x00 // ' ' +#define DISP_PERIOD 0x80 // '.' +#define DISP_HYPHEN 0x40 // '-' +#define DISP_APOSTR 0x20 // ''' +#define DISP_EQUAL 0x41 // '=' +#define DISP_3_BAR 0x49 // '=' +#define DISP_BOTTOM 0x04 // '_' +#define DISP_TOP 0x01 // Top segment +#define DISP_LEFT 0x30 // '|' Left side, both segments +#define DISP_RIGHT 0x06 // '|' Right side, both segments +#define DISP_DEGREE 0x63 // 'o' An 'o' character in the upper segments +#define DISP_HAT 0x23 // 'n' An 'n' character in the upper segments +#define DISP_FORK 0x62 // 'u' A 'u' character in the upper segments +#define DISP_SLASH 0x51 // '/' +#define DISP_BACKSLASH 0x34 // '\' +#define DISP_TOP_RIGHT 0x02 // Top right segment +#define DISP_TOP_LEFT 0x20 // Top left segment +#define DISP_LOW_RIGHT 0x04 // Lower right segment +#define DISP_LOW_LEFT 0x10 // Lower left segment + +#endif diff --git a/samples/helloworld.c b/samples/helloworld.c new file mode 100644 index 000000000..057a153e8 --- /dev/null +++ b/samples/helloworld.c @@ -0,0 +1,9 @@ +// Traditional "Hello World" program + +#include <stdio.h> + +void main (void) +{ + printf( "Hello World!\n" ); + return; +} diff --git a/src/ca65/main.c b/src/ca65/main.c index ab19d0b4d..bb0607b7c 100644 --- a/src/ca65/main.c +++ b/src/ca65/main.c @@ -334,6 +334,9 @@ static void SetSys (const char* Sys) CBMSystem ("__CX16__"); break; + case TGT_SYM1: + break; + default: AbEnd ("Invalid target name: '%s'", Sys);