diff -Ncr cc65-2.13.2/include/apple1.h cc65-2.13.2-apple1/include/apple1.h *** cc65-2.13.2/include/apple1.h Wed Dec 31 17:00:00 1969 --- cc65-2.13.2-apple1/include/apple1.h Tue Sep 13 18:42:27 2011 *************** *** 0 **** --- 1,105 ---- + /*****************************************************************************/ + /* */ + /* apple1.h */ + /* */ + /* Apple I system specific definitions */ + /* */ + /* */ + /* */ + /* (C) 2000 Kevin Ruland, */ + /* (C) 2003 Ullrich von Bassewitz, */ + /* */ + /* */ + /* 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: */ + /* */ + /* 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 documentation would be */ + /* appreciated but is not required. */ + /* 2. Altered source versions must be plainly marked as such, and must not */ + /* be misrepresented as being the original software. */ + /* 3. This notice may not be removed or altered from any source */ + /* distribution. */ + /* */ + /*****************************************************************************/ + + + + #ifndef _APPLE1_H + #define _APPLE1_H + + + + /* Check for errors */ + #if !defined(__APPLE1__) && !defined(__REPLICA1__) + # error This module may only be used when compiling for the Apple ][! + #endif + + + + /*****************************************************************************/ + /* Data */ + /*****************************************************************************/ + + + + /* Color Defines + * Since Apple1 does not support color text these defines are only + * used to get the library to compile correctly. They should not be used + * in user code + */ + #define COLOR_BLACK 0x00 + #define COLOR_WHITE 0x01 + + /* Characters codes */ + #define CH_ENTER 0x0D + #define CH_ESC 0x1B + #define CH_CURS_LEFT 0x08 + #define CH_CURS_RIGHT 0x15 + + #define CH_ULCORNER '+' + #define CH_URCORNER '+' + #define CH_LLCORNER '+' + #define CH_LRCORNER '+' + #define CH_TTEE '+' + #define CH_BTEE '+' + #define CH_LTEE '+' + #define CH_RTEE '+' + #define CH_CROSS '+' + + /* Return codes for get_ostype */ + #define APPLE_UNKNOWN 0x00 + #define APPLE_I 0x01 /* Apple I */ + #define REPLICA_I 0x02 /* Replica I */ + + /*****************************************************************************/ + /* Code */ + /*****************************************************************************/ + + + #ifdef __APPLE1__ + #define get_ostype() APPLE_I + #endif + #ifdef __REPLICA1__ + #define get_ostype() REPLICA_I + #endif + /* Get the machine type. Returns one of the APPLE_xxx codes. */ + + /* The following #defines will cause the matching functions calls in conio.h + * to be overlaid by macros with the same names, saving the function call + * overhead. + */ + #define _textcolor(color) COLOR_WHITE + #define _bgcolor(color) COLOR_BLACK + #define _bordercolor(color) COLOR_BLACK + + + + /* End of apple2.h */ + #endif diff -Ncr cc65-2.13.2/include/conio.h cc65-2.13.2-apple1/include/conio.h *** cc65-2.13.2/include/conio.h Tue Aug 21 07:16:53 2007 --- cc65-2.13.2-apple1/include/conio.h Tue Sep 13 18:42:27 2011 *************** *** 63,68 **** --- 63,72 ---- # include #elif defined(__APPLE2ENH__) # include + #elif defined(__APPLE1__) + # include + #elif defined(__REPLICA1__) + # include #elif defined(__ATARI__) # include #elif defined(__ATMOS__) diff -Ncr cc65-2.13.2/libsrc/Makefile cc65-2.13.2-apple1/libsrc/Makefile *** cc65-2.13.2/libsrc/Makefile Tue Sep 22 15:43:57 2009 --- cc65-2.13.2-apple1/libsrc/Makefile Mon Nov 21 13:27:42 2011 *************** *** 15,20 **** --- 15,21 ---- # List of all targets ALLTARGETS = apple2 \ apple2enh \ + apple1 \ atari \ atmos \ c16 \ *************** *** 39,44 **** --- 40,57 ---- done #----------------------------------------------------------------------------- + # Apple I + + apple1lib: + for i in apple1 common runtime conio; do \ + $(MAKE) SYS=apple1 -C $$i || exit 1; \ + $(AR) a apple1.lib $$i/*.o;\ + done + mv apple1/crt0.o apple1.o + cp apple1.o replica1.o + cp apple1.o apple-1.o + + #----------------------------------------------------------------------------- # Apple ][ apple2lib: diff -Ncr cc65-2.13.2/libsrc/apple1/Makefile cc65-2.13.2-apple1/libsrc/apple1/Makefile *** cc65-2.13.2/libsrc/apple1/Makefile Wed Dec 31 17:00:00 1969 --- cc65-2.13.2-apple1/libsrc/apple1/Makefile Tue Sep 13 18:42:27 2011 *************** *** 0 **** --- 1,81 ---- + # + # makefile for CC65 runtime library + # + + .SUFFIXES: .o .s .c + + #-------------------------------------------------------------------------- + # Programs and flags + + SYS = apple1 + + AS = ../../src/ca65/ca65 + CC = ../../src/cc65/cc65 + LD = ../../src/ld65/ld65 + + AFLAGS = -t $(SYS) -I../../asminc + CFLAGS = -Osir -g -T -t $(SYS) --forget-inc-paths -I . -I ../../include + + #-------------------------------------------------------------------------- + # Rules + + %.o: %.c + @$(CC) $(CFLAGS) $< + @$(AS) -o $@ $(AFLAGS) $(*).s + + %.o: %.s + @$(AS) -g -o $@ $(AFLAGS) $< + + %.emd: %.o ../runtime/zeropage.o + @$(LD) -t module -o $@ $^ + + %.joy: %.o ../runtime/zeropage.o + @$(LD) -t module -o $@ $^ + + %.ser: %.o ../runtime/zeropage.o + @$(LD) -t module -o $@ $^ + + %.tgi: %.o ../runtime/zeropage.o + @$(LD) -t module -o $@ $^ + + #-------------------------------------------------------------------------- + # Object files + + S_OBJS= _scrsize.o \ + cclear.o \ + cgetc.o \ + clrscr.o \ + cputc.o \ + crt0.o \ + ctype.o \ + gotoxy.o \ + kbhit.o \ + randomize.o + + #-------------------------------------------------------------------------- + # Drivers + + EMDS = + + JOYS = + + SERS = + + TGIS = + + #-------------------------------------------------------------------------- + # Targets + + .PHONY: all clean zap + + all: $(C_OBJS) $(S_OBJS) $(EMDS) $(JOYS) $(SERS) $(TGIS) + + ../runtime/zeropage.o: + $(MAKE) -C $(dir $@) $(notdir $@) + + clean: + @$(RM) $(C_OBJS:.o=.s) $(C_OBJS) $(S_OBJS) $(EMDS:.emd=.o) $(JOYS:.joy=.o) $(SERS:.ser=.o) $(TGIS:.tgi=.o) + + zap: clean + @$(RM) $(EMDS) $(JOYS) $(SERS) $(TGIS) + diff -Ncr cc65-2.13.2/libsrc/apple1/_scrsize.s cc65-2.13.2-apple1/libsrc/apple1/_scrsize.s *** cc65-2.13.2/libsrc/apple1/_scrsize.s Wed Dec 31 17:00:00 1969 --- cc65-2.13.2-apple1/libsrc/apple1/_scrsize.s Tue Sep 13 18:42:27 2011 *************** *** 0 **** --- 1,14 ---- + ; + ; Ullrich von Bassewitz, 26.10.2000 + ; + ; Screen size variables + ; + + .export screensize + + .include "apple1.inc" + + screensize: + ldx #40 + ldy #24 + rts diff -Ncr cc65-2.13.2/libsrc/apple1/apple1.inc cc65-2.13.2-apple1/libsrc/apple1/apple1.inc *** cc65-2.13.2/libsrc/apple1/apple1.inc Wed Dec 31 17:00:00 1969 --- cc65-2.13.2-apple1/libsrc/apple1/apple1.inc Mon Nov 21 10:41:26 2011 *************** *** 0 **** --- 1,24 ---- + ;----------------------------------------------------------------------------- + ; Zero page locations + + IRQ := $00 ; IRQ handler jumps to $0000 + NMI := $0F ; NMI handler jumps to $000F + + ;----------------------------------------------------------------------------- + ; Hardware + + ; Keyboard input + KBD := $D010 ; Read keyboard + KBDRDY := $D011 ; Clear keyboard strobe + + ;Video output + VID := $D012 ; Write to video hardware + + ; RAM locations + RAMTOP := $EFFF + + ;----------------------------------------------------------------------------- + ; ROM routines + + RESET := $FF1A ; RESET entrypoint into monitor + ECHO := $FFEF ; Echo character in A to video hardware diff -Ncr cc65-2.13.2/libsrc/apple1/cclear.s cc65-2.13.2-apple1/libsrc/apple1/cclear.s *** cc65-2.13.2/libsrc/apple1/cclear.s Wed Dec 31 17:00:00 1969 --- cc65-2.13.2-apple1/libsrc/apple1/cclear.s Tue Sep 13 18:42:27 2011 *************** *** 0 **** --- 1,19 ---- + ; + ; Ullrich von Bassewitz, 08.08.1998 + ; + ; void __fastcall__ cclearxy (unsigned char x, unsigned char y, unsigned char length); + ; void __fastcall__ cclear (unsigned char length); + ; + + .export _cclearxy, _cclear + .import popa, _gotoxy, chlinedirect + + _cclearxy: + pha ; Save the length + jsr popa ; Get y + jsr _gotoxy ; Call this one, will pop params + pla ; Restore the length and run into _cclear + + _cclear: + ldx #' ' | $80 ; Blank, screen code + jmp chlinedirect diff -Ncr cc65-2.13.2/libsrc/apple1/cgetc.s cc65-2.13.2-apple1/libsrc/apple1/cgetc.s *** cc65-2.13.2/libsrc/apple1/cgetc.s Wed Dec 31 17:00:00 1969 --- cc65-2.13.2-apple1/libsrc/apple1/cgetc.s Tue Sep 13 18:42:27 2011 *************** *** 0 **** --- 1,17 ---- + ; + ; Kevin Ruland + ; + ; char cgetc (void); + ; + + .export _cgetc + + .include "apple1.inc" + + _cgetc: + lda KBDRDY + bpl _cgetc ; if < 128, no key pressed + lda KBD + and #$7F ; Clear high bit + done: ldx #$00 + rts diff -Ncr cc65-2.13.2/libsrc/apple1/clrscr.s cc65-2.13.2-apple1/libsrc/apple1/clrscr.s *** cc65-2.13.2/libsrc/apple1/clrscr.s Wed Dec 31 17:00:00 1969 --- cc65-2.13.2-apple1/libsrc/apple1/clrscr.s Tue Sep 13 18:42:27 2011 *************** *** 0 **** --- 1,10 ---- + ; + ; Kevin Ruland + ; + ; void clrscr (void); + ; + + .export _clrscr + .import HOME + + _clrscr := HOME diff -Ncr cc65-2.13.2/libsrc/apple1/cputc.s cc65-2.13.2-apple1/libsrc/apple1/cputc.s *** cc65-2.13.2/libsrc/apple1/cputc.s Wed Dec 31 17:00:00 1969 --- cc65-2.13.2-apple1/libsrc/apple1/cputc.s Tue Sep 13 18:42:27 2011 *************** *** 0 **** --- 1,24 ---- + ; + ; Ullrich von Bassewitz, 06.08.1998 + ; + ; void __fastcall__ cputcxy (unsigned char x, unsigned char y, char c); + ; void __fastcall__ cputc (char c); + ; + + .export _cputcxy, _cputc + .import popa, _gotoxy + + .include "apple1.inc" + + .code + + ; Plot a character - also used as internal function + + _cputcxy: + pha ; Save C + jsr popa ; Get Y + jsr _gotoxy + pla ; Restore C + + _cputc: + jmp ECHO diff -Ncr cc65-2.13.2/libsrc/apple1/crt0.s cc65-2.13.2-apple1/libsrc/apple1/crt0.s *** cc65-2.13.2/libsrc/apple1/crt0.s Wed Dec 31 17:00:00 1969 --- cc65-2.13.2-apple1/libsrc/apple1/crt0.s Mon Nov 21 13:27:22 2011 *************** *** 0 **** --- 1,75 ---- + ; + ; Startup code for cc65 (Apple1 version) + ; + ; This must be the *first* file on the linker command line + ; + + .export _exit + .export __STARTUP__ : absolute = 1 ; Mark as startup + .import zerobss + .import initlib, donelib + .import callmain, callirq + .import __STARTUP_LOAD__, __BSS_LOAD__ ; Linker generated + .import __INTERRUPTOR_COUNT__ ; Linker generated + + .include "zeropage.inc" + .include "apple1.inc" + + ; ------------------------------------------------------------------------ + + .segment "EXEHDR" + + .addr __STARTUP_LOAD__ ; Start address + .word __BSS_LOAD__ - __STARTUP_LOAD__ ; Size + + ; ------------------------------------------------------------------------ + + .segment "STARTUP" + + ldx #$FF + txs ; Init stack pointer + + ; Delegate all further processing to keep STARTUP small + jsr init + + ; Avoid re-entrance of donelib. This is also the _exit entry + _exit: + ; Call module destructors + jsr donelib + + ; Jump back to monitor ROM + exit: jmp RESET + + + ; ------------------------------------------------------------------------ + + .segment "INIT" + + ; Save the zero page locations we need + init: + + ; Clear the BSS data + jsr zerobss + + ; Setup the stack + ; The Replica 1 has 32K of RAM from $0000 to $7FFF + ; The Apple 1 has 4K of RAM from $0000 to $0FFF + ; and 4K from $E000 to $EFFF + + lda #<(RAMTOP+1) + sta sp + lda #>(RAMTOP+1) + sta sp+1 ; Set argument stack ptr + + ; Check for interruptors + ;lda #<__INTERRUPTOR_COUNT__ + ;beq :+ + + ; Enable interrupts + cli + + ; Call module constructors + : jsr initlib + + ; Push arguments and call main() + jmp callmain diff -Ncr cc65-2.13.2/libsrc/apple1/ctype.s cc65-2.13.2-apple1/libsrc/apple1/ctype.s *** cc65-2.13.2/libsrc/apple1/ctype.s Wed Dec 31 17:00:00 1969 --- cc65-2.13.2-apple1/libsrc/apple1/ctype.s Tue Sep 13 18:42:27 2011 *************** *** 0 **** --- 1,161 ---- + ; + ; Stefan Haubenthal with minor changes from Ullrich von Bassewitz, 2003-05-02 + ; + ; Character specification table. + ; + + .include "ctype.inc" + + ; The tables are readonly, put them into the rodata segment + + .rodata + + ; The following 256 byte wide table specifies attributes for the isxxx type + ; of functions. Doing it by a table means some overhead in space, but it + ; has major advantages: + ; + ; * It is fast. If it were'nt for the slow parameter passing of cc65, one + ; could even define macros for the isxxx functions (this is usually + ; done on other platforms). + ; + ; * It is highly portable. The only unportable part is the table itself, + ; all real code goes into the common library. + ; + ; * We save some code in the isxxx functions. + + + __ctype: + .repeat 2 + .byte CT_CTRL ; 0/00 ___ctrl_@___ + .byte CT_CTRL ; 1/01 ___ctrl_A___ + .byte CT_CTRL ; 2/02 ___ctrl_B___ + .byte CT_CTRL ; 3/03 ___ctrl_C___ + .byte CT_CTRL ; 4/04 ___ctrl_D___ + .byte CT_CTRL ; 5/05 ___ctrl_E___ + .byte CT_CTRL ; 6/06 ___ctrl_F___ + .byte CT_CTRL ; 7/07 ___ctrl_G___ + .byte CT_CTRL ; 8/08 ___ctrl_H___ + .byte CT_CTRL | CT_OTHER_WS | CT_SPACE_TAB + ; 9/09 ___ctrl_I___ + .byte CT_CTRL | CT_OTHER_WS ; 10/0a ___ctrl_J___ + .byte CT_CTRL | CT_OTHER_WS ; 11/0b ___ctrl_K___ + .byte CT_CTRL | CT_OTHER_WS ; 12/0c ___ctrl_L___ + .byte CT_CTRL | CT_OTHER_WS ; 13/0d ___ctrl_M___ + .byte CT_CTRL ; 14/0e ___ctrl_N___ + .byte CT_CTRL ; 15/0f ___ctrl_O___ + .byte CT_CTRL ; 16/10 ___ctrl_P___ + .byte CT_CTRL ; 17/11 ___ctrl_Q___ + .byte CT_CTRL ; 18/12 ___ctrl_R___ + .byte CT_CTRL ; 19/13 ___ctrl_S___ + .byte CT_CTRL ; 20/14 ___ctrl_T___ + .byte CT_CTRL ; 21/15 ___ctrl_U___ + .byte CT_CTRL ; 22/16 ___ctrl_V___ + .byte CT_CTRL ; 23/17 ___ctrl_W___ + .byte CT_CTRL ; 24/18 ___ctrl_X___ + .byte CT_CTRL ; 25/19 ___ctrl_Y___ + .byte CT_CTRL ; 26/1a ___ctrl_Z___ + .byte CT_CTRL ; 27/1b ___ctrl_[___ + .byte CT_CTRL ; 28/1c ___ctrl_\___ + .byte CT_CTRL ; 29/1d ___ctrl_]___ + .byte CT_CTRL ; 30/1e ___ctrl_^___ + .byte CT_CTRL ; 31/1f ___ctrl_____ + .byte CT_SPACE | CT_SPACE_TAB ; 32/20 ___SPACE___ + .byte CT_NONE ; 33/21 _____!_____ + .byte CT_NONE ; 34/22 _____"_____ + .byte CT_NONE ; 35/23 _____#_____ + .byte CT_NONE ; 36/24 _____$_____ + .byte CT_NONE ; 37/25 _____%_____ + .byte CT_NONE ; 38/26 _____&_____ + .byte CT_NONE ; 39/27 _____'_____ + .byte CT_NONE ; 40/28 _____(_____ + .byte CT_NONE ; 41/29 _____)_____ + .byte CT_NONE ; 42/2a _____*_____ + .byte CT_NONE ; 43/2b _____+_____ + .byte CT_NONE ; 44/2c _____,_____ + .byte CT_NONE ; 45/2d _____-_____ + .byte CT_NONE ; 46/2e _____._____ + .byte CT_NONE ; 47/2f _____/_____ + .byte CT_DIGIT | CT_XDIGIT ; 48/30 _____0_____ + .byte CT_DIGIT | CT_XDIGIT ; 49/31 _____1_____ + .byte CT_DIGIT | CT_XDIGIT ; 50/32 _____2_____ + .byte CT_DIGIT | CT_XDIGIT ; 51/33 _____3_____ + .byte CT_DIGIT | CT_XDIGIT ; 52/34 _____4_____ + .byte CT_DIGIT | CT_XDIGIT ; 53/35 _____5_____ + .byte CT_DIGIT | CT_XDIGIT ; 54/36 _____6_____ + .byte CT_DIGIT | CT_XDIGIT ; 55/37 _____7_____ + .byte CT_DIGIT | CT_XDIGIT ; 56/38 _____8_____ + .byte CT_DIGIT | CT_XDIGIT ; 57/39 _____9_____ + .byte CT_NONE ; 58/3a _____:_____ + .byte CT_NONE ; 59/3b _____;_____ + .byte CT_NONE ; 60/3c _____<_____ + .byte CT_NONE ; 61/3d _____=_____ + .byte CT_NONE ; 62/3e _____>_____ + .byte CT_NONE ; 63/3f _____?_____ + + .byte CT_NONE ; 64/40 _____@_____ + .byte CT_UPPER | CT_XDIGIT ; 65/41 _____A_____ + .byte CT_UPPER | CT_XDIGIT ; 66/42 _____B_____ + .byte CT_UPPER | CT_XDIGIT ; 67/43 _____C_____ + .byte CT_UPPER | CT_XDIGIT ; 68/44 _____D_____ + .byte CT_UPPER | CT_XDIGIT ; 69/45 _____E_____ + .byte CT_UPPER | CT_XDIGIT ; 70/46 _____F_____ + .byte CT_UPPER ; 71/47 _____G_____ + .byte CT_UPPER ; 72/48 _____H_____ + .byte CT_UPPER ; 73/49 _____I_____ + .byte CT_UPPER ; 74/4a _____J_____ + .byte CT_UPPER ; 75/4b _____K_____ + .byte CT_UPPER ; 76/4c _____L_____ + .byte CT_UPPER ; 77/4d _____M_____ + .byte CT_UPPER ; 78/4e _____N_____ + .byte CT_UPPER ; 79/4f _____O_____ + .byte CT_UPPER ; 80/50 _____P_____ + .byte CT_UPPER ; 81/51 _____Q_____ + .byte CT_UPPER ; 82/52 _____R_____ + .byte CT_UPPER ; 83/53 _____S_____ + .byte CT_UPPER ; 84/54 _____T_____ + .byte CT_UPPER ; 85/55 _____U_____ + .byte CT_UPPER ; 86/56 _____V_____ + .byte CT_UPPER ; 87/57 _____W_____ + .byte CT_UPPER ; 88/58 _____X_____ + .byte CT_UPPER ; 89/59 _____Y_____ + .byte CT_UPPER ; 90/5a _____Z_____ + .byte CT_NONE ; 91/5b _____[_____ + .byte CT_NONE ; 92/5c _____\_____ + .byte CT_NONE ; 93/5d _____]_____ + .byte CT_NONE ; 94/5e _____^_____ + .byte CT_NONE ; 95/5f _UNDERLINE_ + .byte CT_NONE ; 96/60 ___grave___ + .byte CT_LOWER | CT_XDIGIT ; 97/61 _____a_____ + .byte CT_LOWER | CT_XDIGIT ; 98/62 _____b_____ + .byte CT_LOWER | CT_XDIGIT ; 99/63 _____c_____ + .byte CT_LOWER | CT_XDIGIT ; 100/64 _____d_____ + .byte CT_LOWER | CT_XDIGIT ; 101/65 _____e_____ + .byte CT_LOWER | CT_XDIGIT ; 102/66 _____f_____ + .byte CT_LOWER ; 103/67 _____g_____ + .byte CT_LOWER ; 104/68 _____h_____ + .byte CT_LOWER ; 105/69 _____i_____ + .byte CT_LOWER ; 106/6a _____j_____ + .byte CT_LOWER ; 107/6b _____k_____ + .byte CT_LOWER ; 108/6c _____l_____ + .byte CT_LOWER ; 109/6d _____m_____ + .byte CT_LOWER ; 110/6e _____n_____ + .byte CT_LOWER ; 111/6f _____o_____ + .byte CT_LOWER ; 112/70 _____p_____ + .byte CT_LOWER ; 113/71 _____q_____ + .byte CT_LOWER ; 114/72 _____r_____ + .byte CT_LOWER ; 115/73 _____s_____ + .byte CT_LOWER ; 116/74 _____t_____ + .byte CT_LOWER ; 117/75 _____u_____ + .byte CT_LOWER ; 118/76 _____v_____ + .byte CT_LOWER ; 119/77 _____w_____ + .byte CT_LOWER ; 120/78 _____x_____ + .byte CT_LOWER ; 121/79 _____y_____ + .byte CT_LOWER ; 122/7a _____z_____ + .byte CT_NONE ; 123/7b _____{_____ + .byte CT_NONE ; 124/7c _____|_____ + .byte CT_NONE ; 125/7d _____}_____ + .byte CT_NONE ; 126/7e _____~_____ + .byte CT_OTHER_WS ; 127/7f ____DEL____ + .endrepeat + + diff -Ncr cc65-2.13.2/libsrc/apple1/gotoxy.s cc65-2.13.2-apple1/libsrc/apple1/gotoxy.s *** cc65-2.13.2/libsrc/apple1/gotoxy.s Wed Dec 31 17:00:00 1969 --- cc65-2.13.2-apple1/libsrc/apple1/gotoxy.s Tue Sep 13 18:42:27 2011 *************** *** 0 **** --- 1,22 ---- + ; + ; Ullrich von Bassewitz, 06.08.1998 + ; + ; void __fastcall__ gotoxy (unsigned char x, unsigned char y); + ; void __fastcall__ gotox (unsigned char x); + ; + + .export _gotoxy, _gotox + + .import popa, VTABZ + + .include "apple1.inc" + + _gotoxy: + clc + ; sta CV ; Store Y + ; jsr VTABZ + jsr popa ; Get X + + _gotox: + ; sta CH ; Store X + rts diff -Ncr cc65-2.13.2/libsrc/apple1/kbhit.s cc65-2.13.2-apple1/libsrc/apple1/kbhit.s *** cc65-2.13.2/libsrc/apple1/kbhit.s Wed Dec 31 17:00:00 1969 --- cc65-2.13.2-apple1/libsrc/apple1/kbhit.s Tue Sep 13 18:42:27 2011 *************** *** 0 **** --- 1,18 ---- + ; + ; Kevin Ruland + ; Ullrich von Bassewitz, 2005-03-25 + ; + ; unsigned char kbhit (void); + ; + + .export _kbhit + + .include "apple1.inc" + + _kbhit: + lda KBDRDY ; Reading KBDRDY checks for keypress + rol ; if high bit is set, key was pressed + lda #$00 + tax + rol + rts diff -Ncr cc65-2.13.2/libsrc/apple1/randomize.s cc65-2.13.2-apple1/libsrc/apple1/randomize.s *** cc65-2.13.2/libsrc/apple1/randomize.s Wed Dec 31 17:00:00 1969 --- cc65-2.13.2-apple1/libsrc/apple1/randomize.s Tue Sep 13 18:42:27 2011 *************** *** 0 **** --- 1,17 ---- + ; + ; Ullrich von Bassewitz, 07.11.2002 + ; + ; void _randomize (void); + ; /* Initialize the random number generator */ + ; + + .export __randomize + .import _srand + + .include "apple1.inc" + + __randomize: + ldx #$EA ; Use random value supplied by ROM + lda #$55 + jmp _srand ; Initialize generator + diff -Ncr cc65-2.13.2/src/ca65/main.c cc65-2.13.2-apple1/src/ca65/main.c *** cc65-2.13.2/src/ca65/main.c Mon Sep 28 14:12:43 2009 --- cc65-2.13.2-apple1/src/ca65/main.c Tue Sep 13 18:42:27 2011 *************** *** 243,248 **** --- 243,256 ---- NewSymbol ("__APPLE2ENH__", 1); break; + case TGT_APPLE1: + NewSymbol ("__APPLE1__", 1); + break; + + case TGT_REPLICA1: + NewSymbol ("__REPLICA1__", 1); + break; + case TGT_GEOS: /* Do not handle as a CBM system */ NewSymbol ("__GEOS__", 1); diff -Ncr cc65-2.13.2/src/ca65/main.c.orig cc65-2.13.2-apple1/src/ca65/main.c.orig *** cc65-2.13.2/src/ca65/main.c.orig Wed Dec 31 17:00:00 1969 --- cc65-2.13.2-apple1/src/ca65/main.c.orig Mon Sep 28 14:12:43 2009 *************** *** 0 **** --- 1,993 ---- + /*****************************************************************************/ + /* */ + /* main.c */ + /* */ + /* Main program for the ca65 macroassembler */ + /* */ + /* */ + /* */ + /* (C) 1998-2009, Ullrich von Bassewitz */ + /* Roemerstrasse 52 */ + /* D-70794 Filderstadt */ + /* EMail: uz@cc65.org */ + /* */ + /* */ + /* 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: */ + /* */ + /* 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 documentation would be */ + /* appreciated but is not required. */ + /* 2. Altered source versions must be plainly marked as such, and must not */ + /* be misrepresented as being the original software. */ + /* 3. This notice may not be removed or altered from any source */ + /* distribution. */ + /* */ + /*****************************************************************************/ + + + + #include + #include + #include + #include + + /* common */ + #include "addrsize.h" + #include "chartype.h" + #include "cmdline.h" + #include "mmodel.h" + #include "print.h" + #include "strbuf.h" + #include "target.h" + #include "tgttrans.h" + #include "version.h" + + /* ca65 */ + #include "abend.h" + #include "asserts.h" + #include "error.h" + #include "expr.h" + #include "feature.h" + #include "filetab.h" + #include "global.h" + #include "incpath.h" + #include "instr.h" + #include "istack.h" + #include "lineinfo.h" + #include "listing.h" + #include "macpack.h" + #include "macro.h" + #include "nexttok.h" + #include "objfile.h" + #include "options.h" + #include "pseudo.h" + #include "scanner.h" + #include "segment.h" + #include "sizeof.h" + #include "spool.h" + #include "symtab.h" + #include "ulabel.h" + + + + /*****************************************************************************/ + /* Code */ + /*****************************************************************************/ + + + + static void Usage (void) + /* Print usage information and exit */ + { + printf ("Usage: %s [options] file\n" + "Short options:\n" + " -D name[=value]\tDefine a symbol\n" + " -I dir\t\tSet an include directory search path\n" + " -U\t\t\tMark unresolved symbols as import\n" + " -V\t\t\tPrint the assembler version\n" + " -W n\t\t\tSet warning level n\n" + " -g\t\t\tAdd debug info to object file\n" + " -h\t\t\tHelp (this text)\n" + " -i\t\t\tIgnore case of symbols\n" + " -l\t\t\tCreate a listing if assembly was ok\n" + " -mm model\t\tSet the memory model\n" + " -o name\t\tName the output file\n" + " -s\t\t\tEnable smart mode\n" + " -t sys\t\tSet the target system\n" + " -v\t\t\tIncrease verbosity\n" + "\n" + "Long options:\n" + " --auto-import\t\tMark unresolved symbols as import\n" + " --cpu type\t\tSet cpu type\n" + " --debug-info\t\tAdd debug info to object file\n" + " --feature name\tSet an emulation feature\n" + " --forget-inc-paths\tForget include search paths\n" + " --help\t\tHelp (this text)\n" + " --ignore-case\t\tIgnore case of symbols\n" + " --include-dir dir\tSet an include directory search path\n" + " --listing\t\tCreate a listing if assembly was ok\n" + " --list-bytes n\tMaximum number of bytes per listing line\n" + " --macpack-dir dir\tSet a macro package directory\n" + " --memory-model model\tSet the memory model\n" + " --pagelength n\tSet the page length for the listing\n" + " --smart\t\tEnable smart mode\n" + " --target sys\t\tSet the target system\n" + " --verbose\t\tIncrease verbosity\n" + " --version\t\tPrint the assembler version\n", + ProgName); + } + + + + static void SetOptions (void) + /* Set the option for the translator */ + { + StrBuf Buf = STATIC_STRBUF_INITIALIZER; + + /* Set the translator */ + SB_Printf (&Buf, "ca65 V%s", GetVersionAsString ()); + OptTranslator (&Buf); + + /* Set date and time */ + OptDateTime ((unsigned long) time(0)); + + /* Release memory for the string */ + SB_Done (&Buf); + } + + + + static void NewSymbol (const char* SymName, long Val) + /* Define a symbol with a fixed numeric value in the current scope */ + { + ExprNode* Expr; + SymEntry* Sym; + + /* Convert the name to a string buffer */ + StrBuf SymBuf = STATIC_STRBUF_INITIALIZER; + SB_CopyStr (&SymBuf, SymName); + + /* Search for the symbol, allocate a new one if it doesn't exist */ + Sym = SymFind (CurrentScope, &SymBuf, SYM_ALLOC_NEW); + + /* Check if have already a symbol with this name */ + if (SymIsDef (Sym)) { + AbEnd ("`%s' is already defined", SymName); + } + + /* Generate an expression for the symbol */ + Expr = GenLiteralExpr (Val); + + /* Mark the symbol as defined */ + SymDef (Sym, Expr, ADDR_SIZE_DEFAULT, SF_NONE); + + /* Free string buffer memory */ + SB_Done (&SymBuf); + } + + + + static void CBMSystem (const char* Sys) + /* Define a CBM system */ + { + NewSymbol ("__CBM__", 1); + NewSymbol (Sys, 1); + } + + + + static void SetSys (const char* Sys) + /* Define a target system */ + { + switch (Target = FindTarget (Sys)) { + + case TGT_NONE: + break; + + case TGT_MODULE: + AbEnd ("Cannot use `module' as a target for the assembler"); + break; + + case TGT_ATARI: + NewSymbol ("__ATARI__", 1); + break; + + case TGT_C16: + CBMSystem ("__C16__"); + break; + + case TGT_C64: + CBMSystem ("__C64__"); + break; + + case TGT_VIC20: + CBMSystem ("__VIC20__"); + break; + + case TGT_C128: + CBMSystem ("__C128__"); + break; + + case TGT_PLUS4: + CBMSystem ("__PLUS4__"); + break; + + case TGT_CBM510: + CBMSystem ("__CBM510__"); + break; + + case TGT_CBM610: + CBMSystem ("__CBM610__"); + break; + + case TGT_PET: + CBMSystem ("__PET__"); + break; + + case TGT_BBC: + NewSymbol ("__BBC__", 1); + break; + + case TGT_APPLE2: + NewSymbol ("__APPLE2__", 1); + break; + + case TGT_APPLE2ENH: + NewSymbol ("__APPLE2ENH__", 1); + break; + + case TGT_GEOS: + /* Do not handle as a CBM system */ + NewSymbol ("__GEOS__", 1); + break; + + case TGT_LUNIX: + NewSymbol ("__LUNIX__", 1); + break; + + case TGT_ATMOS: + NewSymbol ("__ATMOS__", 1); + break; + + case TGT_NES: + NewSymbol ("__NES__", 1); + break; + + case TGT_SUPERVISION: + NewSymbol ("__SUPERVISION__", 1); + break; + + case TGT_LYNX: + NewSymbol ("__LYNX__", 1); + break; + + default: + AbEnd ("Invalid target name: `%s'", Sys); + + } + + /* Initialize the translation tables for the target system */ + TgtTranslateInit (); + } + + + + static void DefineSymbol (const char* Def) + /* Define a symbol from the command line */ + { + const char* P; + unsigned I; + long Val; + StrBuf SymName = AUTO_STRBUF_INITIALIZER; + + + /* The symbol must start with a character or underline */ + if (!IsIdStart (Def [0])) { + InvDef (Def); + } + P = Def; + + /* Copy the symbol, checking the rest */ + I = 0; + while (IsIdChar (*P)) { + SB_AppendChar (&SymName, *P++); + } + SB_Terminate (&SymName); + + /* Do we have a value given? */ + if (*P != '=') { + if (*P != '\0') { + InvDef (Def); + } + Val = 0; + } else { + /* We have a value */ + ++P; + if (*P == '$') { + ++P; + if (sscanf (P, "%lx", &Val) != 1) { + InvDef (Def); + } + } else { + if (sscanf (P, "%li", &Val) != 1) { + InvDef (Def); + } + } + } + + /* Define the new symbol */ + NewSymbol (SB_GetConstBuf (&SymName), Val); + + /* Release string memory */ + SB_Done (&SymName); + } + + + + static void OptAutoImport (const char* Opt attribute ((unused)), + const char* Arg attribute ((unused))) + /* Mark unresolved symbols as imported */ + { + AutoImport = 1; + } + + + + static void OptCPU (const char* Opt attribute ((unused)), const char* Arg) + /* Handle the --cpu option */ + { + cpu_t CPU = FindCPU (Arg); + if (CPU == CPU_UNKNOWN) { + AbEnd ("Invalid CPU: `%s'", Arg); + } else { + SetCPU (CPU); + } + } + + + + static void OptDebugInfo (const char* Opt attribute ((unused)), + const char* Arg attribute ((unused))) + /* Add debug info to the object file */ + { + DbgSyms = 1; + } + + + + static void OptFeature (const char* Opt attribute ((unused)), const char* Arg) + /* Set an emulation feature */ + { + /* Make a string buffer from Arg */ + StrBuf Feature; + + /* Set the feature, check for errors */ + if (SetFeature (SB_InitFromString (&Feature, Arg)) == FEAT_UNKNOWN) { + AbEnd ("Illegal emulation feature: `%s'", Arg); + } + } + + + + static void OptForgetIncPaths (const char* Opt attribute ((unused)), + const char* Arg attribute ((unused))) + /* Forget all currently defined include paths */ + { + ForgetAllIncludePaths (); + } + + + + static void OptHelp (const char* Opt attribute ((unused)), + const char* Arg attribute ((unused))) + /* Print usage information and exit */ + { + Usage (); + exit (EXIT_SUCCESS); + } + + + + static void OptIgnoreCase (const char* Opt attribute ((unused)), + const char* Arg attribute ((unused))) + /* Ignore case on symbols */ + { + IgnoreCase = 1; + } + + + + static void OptIncludeDir (const char* Opt attribute ((unused)), const char* Arg) + /* Add an include search path */ + { + AddIncludePath (Arg); + } + + + + static void OptListBytes (const char* Opt, const char* Arg) + /* Set the maximum number of bytes per listing line */ + { + unsigned Num; + char Check; + + /* Convert the argument to a number */ + if (sscanf (Arg, "%u%c", &Num, &Check) != 1) { + AbEnd ("Invalid argument for option `%s'", Opt); + } + + /* Check the bounds */ + if (Num != 0 && (Num < MIN_LIST_BYTES || Num > MAX_LIST_BYTES)) { + AbEnd ("Argument for option `%s' is out of range", Opt); + } + + /* Use the value */ + SetListBytes (Num); + } + + + + static void OptListing (const char* Opt attribute ((unused)), + const char* Arg attribute ((unused))) + /* Create a listing file */ + { + Listing = 1; + } + + + + static void OptMacPackDir (const char* Opt attribute ((unused)), const char* Arg) + /* Set a macro package directory */ + { + /* Make a string buffer from Arg */ + StrBuf Dir; + + /* Use the directory */ + MacPackSetDir (SB_InitFromString (&Dir, Arg)); + } + + + + static void OptMemoryModel (const char* Opt, const char* Arg) + /* Set the memory model */ + { + mmodel_t M; + + /* Check the current memory model */ + if (MemoryModel != MMODEL_UNKNOWN) { + AbEnd ("Cannot use option `%s' twice", Opt); + } + + /* Translate the memory model name and check it */ + M = FindMemoryModel (Arg); + if (M == MMODEL_UNKNOWN) { + AbEnd ("Unknown memory model: %s", Arg); + } else if (M == MMODEL_HUGE) { + AbEnd ("Unsupported memory model: %s", Arg); + } + + /* Set the memory model */ + SetMemoryModel (M); + } + + + + static void OptPageLength (const char* Opt attribute ((unused)), const char* Arg) + /* Handle the --pagelength option */ + { + int Len = atoi (Arg); + if (Len != -1 && (Len < MIN_PAGE_LEN || Len > MAX_PAGE_LEN)) { + AbEnd ("Invalid page length: %d", Len); + } + PageLength = Len; + } + + + + static void OptSmart (const char* Opt attribute ((unused)), + const char* Arg attribute ((unused))) + /* Handle the -s/--smart options */ + { + SmartMode = 1; + } + + + + static void OptTarget (const char* Opt attribute ((unused)), const char* Arg) + /* Set the target system */ + { + SetSys (Arg); + } + + + + static void OptVerbose (const char* Opt attribute ((unused)), + const char* Arg attribute ((unused))) + /* Increase verbosity */ + { + ++Verbosity; + } + + + + static void OptVersion (const char* Opt attribute ((unused)), + const char* Arg attribute ((unused))) + /* Print the assembler version */ + { + fprintf (stderr, "ca65 V%s - %s\n", GetVersionAsString (), Copyright); + } + + + + static void DoPCAssign (void) + /* Start absolute code */ + { + long PC = ConstExpression (); + if (PC < 0 || PC > 0xFFFFFF) { + Error ("Range error"); + } else { + EnterAbsoluteMode (PC); + } + } + + + + static void OneLine (void) + /* Assemble one line */ + { + Segment* Seg = 0; + unsigned long PC = 0; + SymEntry* Sym = 0; + int Macro = 0; + int Instr = -1; + + /* Initialize the new listing line if we are actually reading from file + * and not from internally pushed input. + */ + if (!HavePushedInput ()) { + InitListingLine (); + } + + if (Tok == TOK_COLON) { + /* An unnamed label */ + ULabDef (); + NextTok (); + } + + /* If the first token on the line is an identifier, check for a macro or + * an instruction. + */ + if (Tok == TOK_IDENT) { + if (!UbiquitousIdents) { + /* Macros and symbols cannot use instruction names */ + Instr = FindInstruction (&SVal); + if (Instr < 0) { + Macro = IsMacro (&SVal); + } + } else { + /* Macros and symbols may use the names of instructions */ + Macro = IsMacro (&SVal); + } + } + + /* Handle an identifier */ + if (Tok == TOK_LOCAL_IDENT || (Tok == TOK_IDENT && Instr < 0 && !Macro)) { + + /* Did we have whitespace before the ident? */ + int HadWS = WS; + + /* Generate the symbol table entry, then skip the name */ + if (Tok == TOK_IDENT) { + Sym = SymFind (CurrentScope, &SVal, SYM_ALLOC_NEW); + } else { + Sym = SymFindLocal (SymLast, &SVal, SYM_ALLOC_NEW); + } + NextTok (); + + /* If a colon follows, this is a label definition. If there + * is no colon, it's an assignment. + */ + if (Tok == TOK_EQ || Tok == TOK_ASSIGN) { + + /* Determine the symbol flags from the assignment token */ + unsigned Flags = (Tok == TOK_ASSIGN)? SF_LABEL : SF_NONE; + + /* Skip the '=' */ + NextTok (); + + /* Define the symbol with the expression following the '=' */ + SymDef (Sym, Expression(), ADDR_SIZE_DEFAULT, Flags); + + /* Don't allow anything after a symbol definition */ + ConsumeSep (); + return; + + } else if (Tok == TOK_SET) { + + ExprNode* Expr; + + /* .SET defines variables (= redefinable symbols) */ + NextTok (); + + /* Read the assignment expression, which must be constant */ + Expr = GenLiteralExpr (ConstExpression ()); + + /* Define the symbol with the constant expression following + * the '=' + */ + SymDef (Sym, Expr, ADDR_SIZE_DEFAULT, SF_VAR); + + /* Don't allow anything after a symbol definition */ + ConsumeSep (); + return; + + } else { + + /* A label. Remember the current segment, so we can later + * determine the size of the data stored under the label. + */ + Seg = ActiveSeg; + PC = GetPC (); + + /* Define the label */ + SymDef (Sym, GenCurrentPC (), ADDR_SIZE_DEFAULT, SF_LABEL); + + /* Skip the colon. If NoColonLabels is enabled, allow labels + * without a colon if there is no whitespace before the + * identifier. + */ + if (Tok != TOK_COLON) { + if (HadWS || !NoColonLabels) { + Error ("`:' expected"); + /* Try some smart error recovery */ + if (Tok == TOK_NAMESPACE) { + NextTok (); + } + } + } else { + /* Skip the colon */ + NextTok (); + } + + /* If we come here, a new identifier may be waiting, which may + * be a macro or instruction. + */ + if (Tok == TOK_IDENT) { + if (!UbiquitousIdents) { + /* Macros and symbols cannot use instruction names */ + Instr = FindInstruction (&SVal); + if (Instr < 0) { + Macro = IsMacro (&SVal); + } + } else { + /* Macros and symbols may use the names of instructions */ + Macro = IsMacro (&SVal); + } + } + } + } + + /* We've handled a possible label, now handle the remainder of the line */ + if (Tok >= TOK_FIRSTPSEUDO && Tok <= TOK_LASTPSEUDO) { + /* A control command */ + HandlePseudo (); + } else if (Macro) { + /* A macro expansion */ + MacExpandStart (); + } else if (Instr >= 0 || + (UbiquitousIdents && ((Instr = FindInstruction (&SVal)) >= 0))) { + /* A mnemonic - assemble one instruction */ + HandleInstruction (Instr); + } else if (PCAssignment && (Tok == TOK_STAR || Tok == TOK_PC)) { + NextTok (); + if (Tok != TOK_EQ) { + Error ("`=' expected"); + SkipUntilSep (); + } else { + /* Skip the equal sign */ + NextTok (); + /* Enter absolute mode */ + DoPCAssign (); + } + } + + /* If we have defined a label, remember its size. Sym is also set by + * a symbol assignment, but in this case Done is false, so we don't + * come here. + */ + if (Sym) { + unsigned long Size; + if (Seg == ActiveSeg) { + /* Same segment */ + Size = GetPC () - PC; + } else { + /* The line has switched the segment */ + Size = 0; + } + DefSizeOfSymbol (Sym, Size); + } + + /* Line separator must come here */ + ConsumeSep (); + } + + + + static void Assemble (void) + /* Start the ball rolling ... */ + { + /* Prime the pump */ + NextTok (); + + /* Assemble lines until end of file */ + while (Tok != TOK_EOF) { + OneLine (); + } + } + + + + static void CreateObjFile (void) + /* Create the object file */ + { + /* Open the object, write the header */ + ObjOpen (); + + /* Write the object file options */ + WriteOptions (); + + /* Write the list of input files */ + WriteFiles (); + + /* Write the segment data to the file */ + WriteSegments (); + + /* Write the import list */ + WriteImports (); + + /* Write the export list */ + WriteExports (); + + /* Write debug symbols if requested */ + WriteDbgSyms (); + + /* Write line infos if requested */ + WriteLineInfo (); + + /* Write the string pool */ + WriteStrPool (); + + /* Write the assertions */ + WriteAssertions (); + + /* Write an updated header and close the file */ + ObjClose (); + } + + + + int main (int argc, char* argv []) + /* Assembler main program */ + { + /* Program long options */ + static const LongOpt OptTab[] = { + { "--auto-import", 0, OptAutoImport }, + { "--cpu", 1, OptCPU }, + { "--debug-info", 0, OptDebugInfo }, + { "--feature", 1, OptFeature }, + { "--forget-inc-paths", 0, OptForgetIncPaths }, + { "--help", 0, OptHelp }, + { "--ignore-case", 0, OptIgnoreCase }, + { "--include-dir", 1, OptIncludeDir }, + { "--list-bytes", 1, OptListBytes }, + { "--listing", 0, OptListing }, + { "--macpack-dir", 1, OptMacPackDir }, + { "--memory-model", 1, OptMemoryModel }, + { "--pagelength", 1, OptPageLength }, + { "--smart", 0, OptSmart }, + { "--target", 1, OptTarget }, + { "--verbose", 0, OptVerbose }, + { "--version", 0, OptVersion }, + }; + + /* Name of the global name space */ + static const StrBuf GlobalNameSpace = STATIC_STRBUF_INITIALIZER; + + unsigned I; + + /* Initialize the cmdline module */ + InitCmdLine (&argc, &argv, "ca65"); + + /* Initialize the include search paths */ + InitIncludePaths (); + + /* Enter the base lexical level. We must do that here, since we may + * define symbols using -D. + */ + SymEnterLevel (&GlobalNameSpace, ST_GLOBAL, ADDR_SIZE_DEFAULT); + + /* Check the parameters */ + I = 1; + while (I < ArgCount) { + + /* Get the argument */ + const char* Arg = ArgVec [I]; + + /* Check for an option */ + if (Arg[0] == '-') { + switch (Arg[1]) { + + case '-': + LongOption (&I, OptTab, sizeof(OptTab)/sizeof(OptTab[0])); + break; + + case 'g': + OptDebugInfo (Arg, 0); + break; + + case 'h': + OptHelp (Arg, 0); + break; + + case 'i': + OptIgnoreCase (Arg, 0); + break; + + case 'l': + OptListing (Arg, 0); + break; + + case 'm': + if (Arg[2] == 'm') { + OptMemoryModel (Arg, GetArg (&I, 3)); + } else { + UnknownOption (Arg); + } + break; + + case 'o': + OutFile = GetArg (&I, 2); + break; + + case 's': + OptSmart (Arg, 0); + break; + + case 't': + OptTarget (Arg, GetArg (&I, 2)); + break; + + case 'v': + OptVerbose (Arg, 0); + break; + + case 'D': + DefineSymbol (GetArg (&I, 2)); + break; + + case 'I': + OptIncludeDir (Arg, GetArg (&I, 2)); + break; + + case 'U': + OptAutoImport (Arg, 0); + break; + + case 'V': + OptVersion (Arg, 0); + break; + + case 'W': + WarnLevel = atoi (GetArg (&I, 2)); + break; + + default: + UnknownOption (Arg); + break; + + } + } else { + /* Filename. Check if we already had one */ + if (InFile) { + fprintf (stderr, "%s: Don't know what to do with `%s'\n", + ProgName, Arg); + exit (EXIT_FAILURE); + } else { + InFile = Arg; + } + } + + /* Next argument */ + ++I; + } + + /* Do we have an input file? */ + if (InFile == 0) { + fprintf (stderr, "%s: No input files\n", ProgName); + exit (EXIT_FAILURE); + } + + /* If no CPU given, use the default CPU for the target */ + if (GetCPU () == CPU_UNKNOWN) { + if (Target != TGT_UNKNOWN) { + SetCPU (DefaultCPU[Target]); + } else { + SetCPU (CPU_6502); + } + } + + /* If no memory model was given, use the default */ + if (MemoryModel == MMODEL_UNKNOWN) { + SetMemoryModel (MMODEL_NEAR); + } + + /* Initialize the segments */ + InitSegments (); + + /* Initialize the scanner, open the input file */ + InitScanner (InFile); + + /* Define the default options */ + SetOptions (); + + /* Assemble the input */ + Assemble (); + + /* If we didn't have any errors, check the segment stack */ + if (ErrorCount == 0) { + SegStackCheck (); + } + + /* If we didn't have any errors, check the unnamed labels */ + if (ErrorCount == 0) { + ULabCheck (); + } + + /* If we didn't have any errors, check the symbol table */ + if (ErrorCount == 0) { + SymCheck (); + } + + /* If we didn't have any errors, check and resolve the segment data */ + if (ErrorCount == 0) { + SegCheck (); + } + + /* If we didn't have any errors, check the assertions */ + if (ErrorCount == 0) { + CheckAssertions (); + } + + /* If we didn't have an errors, index the line infos */ + MakeLineInfoIndex (); + + /* Dump the data */ + if (Verbosity >= 2) { + SymDump (stdout); + SegDump (); + } + + /* If we didn't have any errors, create the object and listing files */ + if (ErrorCount == 0) { + CreateObjFile (); + if (Listing) { + CreateListing (); + } + } + + /* Close the input file */ + DoneScanner (); + + /* Return an apropriate exit code */ + return (ErrorCount == 0)? EXIT_SUCCESS : EXIT_FAILURE; + } + + + diff -Ncr cc65-2.13.2/src/cc65/main.c cc65-2.13.2-apple1/src/cc65/main.c *** cc65-2.13.2/src/cc65/main.c Mon Sep 28 14:12:43 2009 --- cc65-2.13.2-apple1/src/cc65/main.c Tue Sep 13 18:42:27 2011 *************** *** 205,210 **** --- 205,218 ---- DefineNumericMacro ("__APPLE2ENH__", 1); break; + case TGT_APPLE1: + DefineNumericMacro ("__APPLE1__", 1); + break; + + case TGT_REPLICA1: + DefineNumericMacro ("__REPLICA1__", 1); + break; + case TGT_GEOS: /* Do not handle as a CBM system */ DefineNumericMacro ("__GEOS__", 1); diff -Ncr cc65-2.13.2/src/cc65/main.c.orig cc65-2.13.2-apple1/src/cc65/main.c.orig *** cc65-2.13.2/src/cc65/main.c.orig Wed Dec 31 17:00:00 1969 --- cc65-2.13.2-apple1/src/cc65/main.c.orig Mon Sep 28 14:12:43 2009 *************** *** 0 **** --- 1,917 ---- + /*****************************************************************************/ + /* */ + /* main.c */ + /* */ + /* cc65 main program */ + /* */ + /* */ + /* */ + /* (C) 2000-2009, Ullrich von Bassewitz */ + /* Roemerstrasse 52 */ + /* D-70794 Filderstadt */ + /* EMail: uz@cc65.org */ + /* */ + /* */ + /* 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: */ + /* */ + /* 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 documentation would be */ + /* appreciated but is not required. */ + /* 2. Altered source versions must be plainly marked as such, and must not */ + /* be misrepresented as being the original software. */ + /* 3. This notice may not be removed or altered from any source */ + /* distribution. */ + /* */ + /*****************************************************************************/ + + + + #include + #include + #include + #include + + /* common */ + #include "abend.h" + #include "chartype.h" + #include "cmdline.h" + #include "cpu.h" + #include "debugflag.h" + #include "fname.h" + #include "mmodel.h" + #include "print.h" + #include "segnames.h" + #include "target.h" + #include "tgttrans.h" + #include "version.h" + #include "xmalloc.h" + + /* cc65 */ + #include "asmcode.h" + #include "compile.h" + #include "codeopt.h" + #include "error.h" + #include "global.h" + #include "incpath.h" + #include "input.h" + #include "macrotab.h" + #include "output.h" + #include "scanner.h" + #include "segments.h" + #include "standard.h" + #include "svnversion.h" + + + + /*****************************************************************************/ + /* Code */ + /*****************************************************************************/ + + + + static void Usage (void) + /* Print usage information to stderr */ + { + printf ("Usage: %s [options] file\n" + "Short options:\n" + " -Cl\t\t\tMake local variables static\n" + " -Dsym[=defn]\t\tDefine a symbol\n" + " -E\t\t\tStop after the preprocessing stage\n" + " -I dir\t\tSet an include directory search path\n" + " -O\t\t\tOptimize code\n" + " -Oi\t\t\tOptimize code, inline more code\n" + " -Or\t\t\tEnable register variables\n" + " -Os\t\t\tInline some known functions\n" + " -T\t\t\tInclude source as comment\n" + " -V\t\t\tPrint the compiler version number\n" + " -W\t\t\tSuppress warnings\n" + " -d\t\t\tDebug mode\n" + " -g\t\t\tAdd debug info to object file\n" + " -h\t\t\tHelp (this text)\n" + " -j\t\t\tDefault characters are signed\n" + " -mm model\t\tSet the memory model\n" + " -o name\t\tName the output file\n" + " -r\t\t\tEnable register variables\n" + " -t sys\t\tSet the target system\n" + " -v\t\t\tIncrease verbosity\n" + "\n" + "Long options:\n" + " --add-source\t\tInclude source as comment\n" + " --bss-name seg\tSet the name of the BSS segment\n" + " --check-stack\t\tGenerate stack overflow checks\n" + " --code-name seg\tSet the name of the CODE segment\n" + " --codesize x\t\tAccept larger code by factor x\n" + " --cpu type\t\tSet cpu type (6502, 65c02)\n" + " --create-dep\t\tCreate a make dependency file\n" + " --data-name seg\tSet the name of the DATA segment\n" + " --debug\t\tDebug mode\n" + " --debug-info\t\tAdd debug info to object file\n" + " --debug-opt name\tDebug optimization steps\n" + " --disable-opt name\tDisable an optimization step\n" + " --enable-opt name\tEnable an optimization step\n" + " --forget-inc-paths\tForget include search paths\n" + " --help\t\tHelp (this text)\n" + " --include-dir dir\tSet an include directory search path\n" + " --list-opt-steps\tList all optimizer steps and exit\n" + " --memory-model model\tSet the memory model\n" + " --register-space b\tSet space available for register variables\n" + " --register-vars\tEnable register variables\n" + " --rodata-name seg\tSet the name of the RODATA segment\n" + " --signed-chars\tDefault characters are signed\n" + " --standard std\tLanguage standard (c89, c99, cc65)\n" + " --static-locals\tMake local variables static\n" + " --target sys\t\tSet the target system\n" + " --verbose\t\tIncrease verbosity\n" + " --version\t\tPrint the compiler version number\n" + " --writable-strings\tMake string literals writable\n", + ProgName); + } + + + + static void cbmsys (const char* sys) + /* Define a CBM system */ + { + DefineNumericMacro ("__CBM__", 1); + DefineNumericMacro (sys, 1); + } + + + + static void SetSys (const char* Sys) + /* Define a target system */ + { + switch (Target = FindTarget (Sys)) { + + case TGT_NONE: + break; + + case TGT_MODULE: + AbEnd ("Cannot use `module' as a target for the compiler"); + break; + + case TGT_ATARI: + DefineNumericMacro ("__ATARI__", 1); + break; + + case TGT_C16: + cbmsys ("__C16__"); + break; + + case TGT_C64: + cbmsys ("__C64__"); + break; + + case TGT_VIC20: + cbmsys ("__VIC20__"); + break; + + case TGT_C128: + cbmsys ("__C128__"); + break; + + case TGT_PLUS4: + cbmsys ("__PLUS4__"); + break; + + case TGT_CBM510: + cbmsys ("__CBM510__"); + break; + + case TGT_CBM610: + cbmsys ("__CBM610__"); + break; + + case TGT_PET: + cbmsys ("__PET__"); + break; + + case TGT_BBC: + DefineNumericMacro ("__BBC__", 1); + break; + + case TGT_APPLE2: + DefineNumericMacro ("__APPLE2__", 1); + break; + + case TGT_APPLE2ENH: + DefineNumericMacro ("__APPLE2ENH__", 1); + break; + + case TGT_GEOS: + /* Do not handle as a CBM system */ + DefineNumericMacro ("__GEOS__", 1); + break; + + case TGT_LUNIX: + DefineNumericMacro ("__LUNIX__", 1); + break; + + case TGT_ATMOS: + DefineNumericMacro ("__ATMOS__", 1); + break; + + case TGT_NES: + DefineNumericMacro ("__NES__", 1); + break; + + case TGT_SUPERVISION: + DefineNumericMacro ("__SUPERVISION__", 1); + break; + + case TGT_LYNX: + DefineNumericMacro ("__LYNX__", 1); + break; + + default: + AbEnd ("Unknown target system type %d", Target); + } + + /* Initialize the translation tables for the target system */ + TgtTranslateInit (); + } + + + + static void DoCreateDep (const char* OutputName) + /* Create the dependency file */ + { + /* Make the dependency file name from the output file name */ + char* DepName = MakeFilename (OutputName, ".u"); + + /* Open the file */ + FILE* F = fopen (DepName, "w"); + if (F == 0) { + Fatal ("Cannot open dependency file `%s': %s", DepName, strerror (errno)); + } + + /* Write the dependencies to the file */ + WriteDependencies (F, OutputName); + + /* Close the file, check for errors */ + if (fclose (F) != 0) { + remove (DepName); + Fatal ("Cannot write to dependeny file (disk full?)"); + } + + /* Free the name */ + xfree (DepName); + } + + + + static void DefineSym (const char* Def) + /* Define a symbol on the command line */ + { + const char* P = Def; + + /* The symbol must start with a character or underline */ + if (Def [0] != '_' && !IsAlpha (Def [0])) { + InvDef (Def); + } + + /* Check the symbol name */ + while (IsAlNum (*P) || *P == '_') { + ++P; + } + + /* Do we have a value given? */ + if (*P != '=') { + if (*P != '\0') { + InvDef (Def); + } + /* No value given. Define the macro with the value 1 */ + DefineNumericMacro (Def, 1); + } else { + /* We have a value, P points to the '=' character. Since the argument + * is const, create a copy and replace the '=' in the copy by a zero + * terminator. + */ + char* Q; + unsigned Len = strlen (Def)+1; + char* S = (char*) xmalloc (Len); + memcpy (S, Def, Len); + Q = S + (P - Def); + *Q++ = '\0'; + + /* Define this as a macro */ + DefineTextMacro (S, Q); + + /* Release the allocated memory */ + xfree (S); + } + } + + + + static void CheckSegName (const char* Seg) + /* Abort if the given name is not a valid segment name */ + { + /* Print an error and abort if the name is not ok */ + if (!ValidSegName (Seg)) { + AbEnd ("Segment name `%s' is invalid", Seg); + } + } + + + + static void OptAddSource (const char* Opt attribute ((unused)), + const char* Arg attribute ((unused))) + /* Add source lines as comments in generated assembler file */ + { + AddSource = 1; + } + + + + static void OptBssName (const char* Opt attribute ((unused)), const char* Arg) + /* Handle the --bss-name option */ + { + /* Check for a valid name */ + CheckSegName (Arg); + + /* Set the name */ + SetSegName (SEG_BSS, Arg); + } + + + + static void OptCheckStack (const char* Opt attribute ((unused)), + const char* Arg attribute ((unused))) + /* Handle the --check-stack option */ + { + IS_Set (&CheckStack, 1); + } + + + + static void OptCodeName (const char* Opt attribute ((unused)), const char* Arg) + /* Handle the --code-name option */ + { + /* Check for a valid name */ + CheckSegName (Arg); + + /* Set the name */ + SetSegName (SEG_CODE, Arg); + } + + + + static void OptCodeSize (const char* Opt, const char* Arg) + /* Handle the --codesize option */ + { + unsigned Factor; + char BoundsCheck; + + /* Numeric argument expected */ + if (sscanf (Arg, "%u%c", &Factor, &BoundsCheck) != 1 || + Factor < 10 || Factor > 1000) { + AbEnd ("Argument for %s is invalid", Opt); + } + IS_Set (&CodeSizeFactor, Factor); + } + + + + static void OptCreateDep (const char* Opt attribute ((unused)), + const char* Arg attribute ((unused))) + /* Handle the --create-dep option */ + { + CreateDep = 1; + } + + + + static void OptCPU (const char* Opt, const char* Arg) + /* Handle the --cpu option */ + { + /* Find the CPU from the given name */ + CPU = FindCPU (Arg); + if (CPU != CPU_6502 && CPU != CPU_6502X && CPU != CPU_65SC02 && + CPU != CPU_65C02 && CPU != CPU_65816 && CPU != CPU_HUC6280) { + AbEnd ("Invalid argument for %s: `%s'", Opt, Arg); + } + } + + + + static void OptDataName (const char* Opt attribute ((unused)), const char* Arg) + /* Handle the --data-name option */ + { + /* Check for a valid name */ + CheckSegName (Arg); + + /* Set the name */ + SetSegName (SEG_DATA, Arg); + } + + + + static void OptDebug (const char* Opt attribute ((unused)), + const char* Arg attribute ((unused))) + /* Compiler debug mode */ + { + ++Debug; + } + + + + static void OptDebugInfo (const char* Opt attribute ((unused)), + const char* Arg attribute ((unused))) + /* Add debug info to the object file */ + { + DebugInfo = 1; + } + + + + static void OptDebugOpt (const char* Opt attribute ((unused)), const char* Arg) + /* Debug optimization steps */ + { + char Buf [128]; + char* Line; + + /* Open the file */ + FILE* F = fopen (Arg, "r"); + if (F == 0) { + AbEnd ("Cannot open `%s': %s", Arg, strerror (errno)); + } + + /* Read line by line, ignore empty lines and switch optimization + * steps on/off. + */ + while (fgets (Buf, sizeof (Buf), F) != 0) { + + /* Remove trailing control chars. This will also remove the + * trailing newline. + */ + unsigned Len = strlen (Buf); + while (Len > 0 && IsControl (Buf[Len-1])) { + --Len; + } + Buf[Len] = '\0'; + + /* Get a pointer to the buffer and remove leading white space */ + Line = Buf; + while (IsBlank (*Line)) { + ++Line; + } + + /* Check the first character and enable/disable the step or + * ignore the line + */ + switch (*Line) { + + case '\0': + case '#': + case ';': + /* Empty or comment line */ + continue; + + case '-': + DisableOpt (Line+1); + break; + + case '+': + ++Line; + /* FALLTHROUGH */ + + default: + EnableOpt (Line); + break; + + } + + } + + /* Close the file, no error check here since we were just reading and + * this is only a debug function. + */ + (void) fclose (F); + } + + + + static void OptDisableOpt (const char* Opt attribute ((unused)), const char* Arg) + /* Disable an optimization step */ + { + DisableOpt (Arg); + } + + + + static void OptEnableOpt (const char* Opt attribute ((unused)), const char* Arg) + /* Enable an optimization step */ + { + EnableOpt (Arg); + } + + + + static void OptForgetIncPaths (const char* Opt attribute ((unused)), + const char* Arg attribute ((unused))) + /* Forget all currently defined include paths */ + { + ForgetAllIncludePaths (); + } + + + + static void OptHelp (const char* Opt attribute ((unused)), + const char* Arg attribute ((unused))) + /* Print usage information and exit */ + { + Usage (); + exit (EXIT_SUCCESS); + } + + + + static void OptIncludeDir (const char* Opt attribute ((unused)), const char* Arg) + /* Add an include search path */ + { + AddIncludePath (Arg, INC_SYS | INC_USER); + } + + + + static void OptListOptSteps (const char* Opt attribute ((unused)), + const char* Arg attribute ((unused))) + /* List all optimizer steps */ + { + /* List the optimizer steps */ + ListOptSteps (stdout); + + /* Terminate */ + exit (EXIT_SUCCESS); + } + + + + static void OptMemoryModel (const char* Opt, const char* Arg) + /* Set the memory model */ + { + mmodel_t M; + + /* Check the current memory model */ + if (MemoryModel != MMODEL_UNKNOWN) { + AbEnd ("Cannot use option `%s' twice", Opt); + } + + /* Translate the memory model name and check it */ + M = FindMemoryModel (Arg); + if (M == MMODEL_UNKNOWN) { + AbEnd ("Unknown memory model: %s", Arg); + } else if (M == MMODEL_HUGE) { + AbEnd ("Unsupported memory model: %s", Arg); + } + + /* Set the memory model */ + SetMemoryModel (M); + } + + + + static void OptRegisterSpace (const char* Opt, const char* Arg) + /* Handle the --register-space option */ + { + /* Numeric argument expected */ + if (sscanf (Arg, "%u", &RegisterSpace) != 1 || RegisterSpace > 256) { + AbEnd ("Argument for option %s is invalid", Opt); + } + } + + + + static void OptRegisterVars (const char* Opt attribute ((unused)), + const char* Arg attribute ((unused))) + /* Handle the --register-vars option */ + { + IS_Set (&EnableRegVars, 1); + } + + + + static void OptRodataName (const char* Opt attribute ((unused)), const char* Arg) + /* Handle the --rodata-name option */ + { + /* Check for a valid name */ + CheckSegName (Arg); + + /* Set the name */ + SetSegName (SEG_RODATA, Arg); + } + + + + static void OptSignedChars (const char* Opt attribute ((unused)), + const char* Arg attribute ((unused))) + /* Make default characters signed */ + { + IS_Set (&SignedChars, 1); + } + + + + static void OptStandard (const char* Opt, const char* Arg) + /* Handle the --standard option */ + { + /* Find the standard from the given name */ + standard_t Std = FindStandard (Arg); + if (Std == STD_UNKNOWN) { + AbEnd ("Invalid argument for %s: `%s'", Opt, Arg); + } else if (IS_Get (&Standard) != STD_UNKNOWN) { + AbEnd ("Option %s given more than once", Opt); + } else { + IS_Set (&Standard, Std); + } + } + + + + static void OptStaticLocals (const char* Opt attribute ((unused)), + const char* Arg attribute ((unused))) + /* Place local variables in static storage */ + { + IS_Set (&StaticLocals, 1); + } + + + + static void OptTarget (const char* Opt attribute ((unused)), const char* Arg) + /* Set the target system */ + { + SetSys (Arg); + } + + + + static void OptVerbose (const char* Opt attribute ((unused)), + const char* Arg attribute ((unused))) + /* Increase verbosity */ + { + ++Verbosity; + } + + + + static void OptVersion (const char* Opt attribute ((unused)), + const char* Arg attribute ((unused))) + /* Print the compiler version */ + { + fprintf (stderr, + "cc65 V%s\nSVN version: %s\n", + GetVersionAsString (), SVNVersion); + exit (EXIT_SUCCESS); + } + + + + static void OptWritableStrings (const char* Opt attribute ((unused)), + const char* Arg attribute ((unused))) + /* Make string literals writable */ + { + IS_Set (&WritableStrings, 1); + } + + + + int main (int argc, char* argv[]) + { + /* Program long options */ + static const LongOpt OptTab[] = { + { "--add-source", 0, OptAddSource }, + { "--bss-name", 1, OptBssName }, + { "--check-stack", 0, OptCheckStack }, + { "--code-name", 1, OptCodeName }, + { "--codesize", 1, OptCodeSize }, + { "--cpu", 1, OptCPU }, + { "--create-dep", 0, OptCreateDep }, + { "--data-name", 1, OptDataName }, + { "--debug", 0, OptDebug }, + { "--debug-info", 0, OptDebugInfo }, + { "--debug-opt", 1, OptDebugOpt }, + { "--disable-opt", 1, OptDisableOpt }, + { "--enable-opt", 1, OptEnableOpt }, + { "--forget-inc-paths", 0, OptForgetIncPaths }, + { "--help", 0, OptHelp }, + { "--include-dir", 1, OptIncludeDir }, + { "--list-opt-steps", 0, OptListOptSteps }, + { "--memory-model", 1, OptMemoryModel }, + { "--register-space", 1, OptRegisterSpace }, + { "--register-vars", 0, OptRegisterVars }, + { "--rodata-name", 1, OptRodataName }, + { "--signed-chars", 0, OptSignedChars }, + { "--standard", 1, OptStandard }, + { "--static-locals", 0, OptStaticLocals }, + { "--target", 1, OptTarget }, + { "--verbose", 0, OptVerbose }, + { "--version", 0, OptVersion }, + { "--writable-strings", 0, OptWritableStrings }, + }; + + unsigned I; + + /* Initialize the input file name */ + const char* InputFile = 0; + + /* Initialize the cmdline module */ + InitCmdLine (&argc, &argv, "cc65"); + + /* Initialize the default segment names */ + InitSegNames (); + + /* Initialize the include search paths */ + InitIncludePaths (); + + /* Parse the command line */ + I = 1; + while (I < ArgCount) { + + const char* P; + + /* Get the argument */ + const char* Arg = ArgVec[I]; + + /* Check for an option */ + if (Arg [0] == '-') { + + switch (Arg [1]) { + + case '-': + LongOption (&I, OptTab, sizeof(OptTab)/sizeof(OptTab[0])); + break; + + case 'd': + OptDebug (Arg, 0); + break; + + case 'h': + case '?': + OptHelp (Arg, 0); + break; + + case 'g': + OptDebugInfo (Arg, 0); + break; + + case 'j': + OptSignedChars (Arg, 0); + break; + + case 'o': + SetOutputName (GetArg (&I, 2)); + break; + + case 'r': + OptRegisterVars (Arg, 0); + break; + + case 't': + OptTarget (Arg, GetArg (&I, 2)); + break; + + case 'u': + OptCreateDep (Arg, 0); + break; + + case 'v': + OptVerbose (Arg, 0); + break; + + case 'C': + P = Arg + 2; + while (*P) { + switch (*P++) { + case 'l': + OptStaticLocals (Arg, 0); + break; + default: + UnknownOption (Arg); + break; + } + } + break; + + case 'D': + DefineSym (GetArg (&I, 2)); + break; + + case 'E': + PreprocessOnly = 1; + break; + + case 'I': + OptIncludeDir (Arg, GetArg (&I, 2)); + break; + + case 'O': + IS_Set (&Optimize, 1); + P = Arg + 2; + while (*P) { + switch (*P++) { + case 'i': + IS_Set (&CodeSizeFactor, 200); + break; + case 'r': + IS_Set (&EnableRegVars, 1); + break; + case 's': + IS_Set (&InlineStdFuncs, 1); + break; + } + } + break; + + case 'T': + OptAddSource (Arg, 0); + break; + + case 'V': + OptVersion (Arg, 0); + break; + + case 'W': + IS_Set (&WarnDisable, 1); + break; + + default: + UnknownOption (Arg); + break; + } + } else { + if (InputFile) { + fprintf (stderr, "additional file specs ignored\n"); + } else { + InputFile = Arg; + } + } + + /* Next argument */ + ++I; + } + + /* Did we have a file spec on the command line? */ + if (InputFile == 0) { + AbEnd ("No input files"); + } + + /* Create the output file name if it was not explicitly given */ + MakeDefaultOutputName (InputFile); + + /* If no CPU given, use the default CPU for the target */ + if (CPU == CPU_UNKNOWN) { + if (Target != TGT_UNKNOWN) { + CPU = DefaultCPU[Target]; + } else { + CPU = CPU_6502; + } + } + + /* If no memory model was given, use the default */ + if (MemoryModel == MMODEL_UNKNOWN) { + SetMemoryModel (MMODEL_NEAR); + } + + /* If no language standard was given, use the default one */ + if (IS_Get (&Standard) == STD_UNKNOWN) { + IS_Set (&Standard, STD_DEFAULT); + } + + /* Go! */ + Compile (InputFile); + + /* Create the output file if we didn't had any errors */ + if (PreprocessOnly == 0 && (ErrorCount == 0 || Debug)) { + + /* Open the file */ + OpenOutputFile (); + + /* Write the output to the file */ + WriteAsmOutput (); + Print (stdout, 1, "Wrote output to `%s'\n", OutputFilename); + + /* Close the file, check for errors */ + CloseOutputFile (); + + /* Create dependencies if requested */ + if (CreateDep) { + DoCreateDep (OutputFilename); + Print (stdout, 1, "Creating dependeny file\n"); + } + + } + + /* Return an apropriate exit code */ + return (ErrorCount > 0)? EXIT_FAILURE : EXIT_SUCCESS; + } + + + diff -Ncr cc65-2.13.2/src/common/target.c cc65-2.13.2-apple1/src/common/target.c *** cc65-2.13.2/src/common/target.c Sun Sep 13 05:46:04 2009 --- cc65-2.13.2-apple1/src/common/target.c Tue Sep 13 18:42:27 2011 *************** *** 64,69 **** --- 64,71 ---- "cbm610", "pet", "bbc", + "apple1", + "replica1", "apple2", "apple2enh", "geos", *************** *** 90,95 **** --- 92,99 ---- CPU_6502, /* cbm610 */ CPU_6502, /* pet */ CPU_6502, /* bbc */ + CPU_6502, /* apple1 */ + CPU_6502, /* replica1 */ CPU_6502, /* apple2 */ CPU_65C02, /* apple2enh */ CPU_6502, /* geos */ diff -Ncr cc65-2.13.2/src/common/target.c.orig cc65-2.13.2-apple1/src/common/target.c.orig *** cc65-2.13.2/src/common/target.c.orig Wed Dec 31 17:00:00 1969 --- cc65-2.13.2-apple1/src/common/target.c.orig Sun Sep 13 05:46:04 2009 *************** *** 0 **** --- 1,141 ---- + /*****************************************************************************/ + /* */ + /* target.c */ + /* */ + /* Target specification */ + /* */ + /* */ + /* */ + /* (C) 2000-2009, Ullrich von Bassewitz */ + /* Roemerstrasse 52 */ + /* D-70794 Filderstadt */ + /* EMail: uz@cc65.org */ + /* */ + /* */ + /* 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: */ + /* */ + /* 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 documentation would be */ + /* appreciated but is not required. */ + /* 2. Altered source versions must be plainly marked as such, and must not */ + /* be misrepresented as being the original software. */ + /* 3. This notice may not be removed or altered from any source */ + /* distribution. */ + /* */ + /*****************************************************************************/ + + + + #include + #include + + #include "chartype.h" + #include "target.h" + + + + /*****************************************************************************/ + /* Data */ + /*****************************************************************************/ + + + + /* Target system */ + target_t Target = TGT_NONE; + + /* Table with target names */ + const char* TargetNames [TGT_COUNT] = { + "none", + "module", + "atari", + "vic20", + "c16", + "c64", + "c128", + "plus4", + "cbm510", + "cbm610", + "pet", + "bbc", + "apple2", + "apple2enh", + "geos", + "lunix", + "atmos", + "nes", + "supervision", + "lynx" + }; + + + + /* Table with default CPUs per target */ + const cpu_t DefaultCPU[TGT_COUNT] = { + CPU_6502, /* none */ + CPU_6502, /* module */ + CPU_6502, /* atari */ + CPU_6502, /* vic20 */ + CPU_6502, /* c16 */ + CPU_6502, /* c64 */ + CPU_6502, /* c128 */ + CPU_6502, /* plus4 */ + CPU_6502, /* cbm510 */ + CPU_6502, /* cbm610 */ + CPU_6502, /* pet */ + CPU_6502, /* bbc */ + CPU_6502, /* apple2 */ + CPU_65C02, /* apple2enh */ + CPU_6502, /* geos */ + CPU_6502, /* lunix */ + CPU_6502, /* atmos */ + CPU_6502, /* nes */ + CPU_65SC02, /* supervision */ + CPU_65C02, /* lynx */ + }; + + + + /*****************************************************************************/ + /* Code */ + /*****************************************************************************/ + + + + target_t FindTarget (const char* Name) + /* Find a target by name and return the target id. TGT_UNKNOWN is returned if + * the given name is no valid target. + */ + { + unsigned I; + + /* Check for a numeric target */ + if (IsDigit (*Name)) { + int Target = atoi (Name); + if (Target >= 0 && Target < TGT_COUNT) { + return (target_t)Target; + } + } + + /* Check for a target string */ + for (I = 0; I < TGT_COUNT; ++I) { + if (strcmp (TargetNames [I], Name) == 0) { + return (target_t)I; + } + } + + /* Not found */ + return TGT_UNKNOWN; + } + + + + + + diff -Ncr cc65-2.13.2/src/common/target.h cc65-2.13.2-apple1/src/common/target.h *** cc65-2.13.2/src/common/target.h Sun Sep 13 05:46:04 2009 --- cc65-2.13.2-apple1/src/common/target.h Tue Sep 13 18:42:27 2011 *************** *** 64,69 **** --- 64,71 ---- TGT_CBM610, TGT_PET, TGT_BBC, + TGT_APPLE1, + TGT_REPLICA1, TGT_APPLE2, TGT_APPLE2ENH, TGT_GEOS, diff -Ncr cc65-2.13.2/src/common/target.h.orig cc65-2.13.2-apple1/src/common/target.h.orig *** cc65-2.13.2/src/common/target.h.orig Wed Dec 31 17:00:00 1969 --- cc65-2.13.2-apple1/src/common/target.h.orig Sun Sep 13 05:46:04 2009 *************** *** 0 **** --- 1,108 ---- + /*****************************************************************************/ + /* */ + /* target.h */ + /* */ + /* Target specification */ + /* */ + /* */ + /* */ + /* (C) 2000-2009, Ullrich von Bassewitz */ + /* Roemerstrasse 52 */ + /* D-70794 Filderstadt */ + /* EMail: uz@cc65.org */ + /* */ + /* */ + /* 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: */ + /* */ + /* 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 documentation would be */ + /* appreciated but is not required. */ + /* 2. Altered source versions must be plainly marked as such, and must not */ + /* be misrepresented as being the original software. */ + /* 3. This notice may not be removed or altered from any source */ + /* distribution. */ + /* */ + /*****************************************************************************/ + + + + #ifndef TARGET_H + #define TARGET_H + + + + /* common */ + #include "cpu.h" + + + + /*****************************************************************************/ + /* Data */ + /*****************************************************************************/ + + + + /* Supported target systems */ + typedef enum { + TGT_UNKNOWN = -1, /* Not specified or invalid target */ + TGT_NONE, + TGT_MODULE, + TGT_ATARI, + TGT_VIC20, + TGT_C16, + TGT_C64, + TGT_C128, + TGT_PLUS4, + TGT_CBM510, + TGT_CBM610, + TGT_PET, + TGT_BBC, + TGT_APPLE2, + TGT_APPLE2ENH, + TGT_GEOS, + TGT_LUNIX, + TGT_ATMOS, + TGT_NES, + TGT_SUPERVISION, + TGT_LYNX, + TGT_COUNT /* Number of target systems */ + } target_t; + + /* Target system */ + extern target_t Target; + + /* Table with target names */ + extern const char* TargetNames[TGT_COUNT]; + + /* Table with default CPUs per target */ + extern const cpu_t DefaultCPU[TGT_COUNT]; + + + + /*****************************************************************************/ + /* Code */ + /*****************************************************************************/ + + + + target_t FindTarget (const char* Name); + /* Find a target by name and return the target id. TGT_UNKNOWN is returned if + * the given name is no valid target. + */ + + + + /* End of target.h */ + + #endif + + + + diff -Ncr cc65-2.13.2/src/common/tgttrans.c cc65-2.13.2-apple1/src/common/tgttrans.c *** cc65-2.13.2/src/common/tgttrans.c Sun Sep 13 05:46:04 2009 --- cc65-2.13.2-apple1/src/common/tgttrans.c Tue Sep 13 18:42:27 2011 *************** *** 153,158 **** --- 153,160 ---- case TGT_CBM610: memcpy (Tab, CTPET, sizeof (Tab)); break; case TGT_PET: memcpy (Tab, CTPET, sizeof (Tab)); break; case TGT_BBC: memcpy (Tab, CTNone, sizeof (Tab)); break; + case TGT_APPLE1: memcpy (Tab, CTNone, sizeof (Tab)); break; + case TGT_REPLICA1: memcpy (Tab, CTNone, sizeof (Tab)); break; case TGT_APPLE2: memcpy (Tab, CTNone, sizeof (Tab)); break; case TGT_APPLE2ENH: memcpy (Tab, CTNone, sizeof (Tab)); break; case TGT_GEOS: memcpy (Tab, CTNone, sizeof (Tab)); break; diff -Ncr cc65-2.13.2/src/ld65/apple1.inc cc65-2.13.2-apple1/src/ld65/apple1.inc *** cc65-2.13.2/src/ld65/apple1.inc Wed Dec 31 17:00:00 1969 --- cc65-2.13.2-apple1/src/ld65/apple1.inc Tue Sep 13 18:42:27 2011 *************** *** 0 **** --- 1,39 ---- + static const char CfgApple1 [] = + "MEMORY {\n" + "ZP: start = $0020, size = $00C0, define = yes;\n" + "HEADER: start = $0000, size = $0004, file = %O;\n" + "RAM1: start = $0280, size = $0B80, file = %O;\n" + "RAM2: start = $E000, size = $1000, file = %O;\n" + "}\n" + "SEGMENTS {\n" + "EXEHDR: load = HEADER, type = ro;\n" + "STARTUP: load = RAM1, type = ro, define = yes;\n" + "LOWCODE: load = RAM1, type = ro, optional = yes;\n" + "INIT: load = RAM1, type = ro, define = yes, optional = yes;\n" + "CODE: load = RAM1, type = ro;\n" + "RODATA: load = RAM1, type = ro;\n" + "DATA: load = RAM1, type = rw;\n" + "BSS: load = RAM2, type = bss, define = yes;\n" + "HEAP: load = RAM2, type = bss, optional = yes;\n" /* must sit just below stack */ + "ZEROPAGE: load = ZP, type = zp;\n" + "}\n" + "FEATURES {\n" + "CONDES: segment = INIT,\n" + "type = constructor,\n" + "label = __CONSTRUCTOR_TABLE__,\n" + "count = __CONSTRUCTOR_COUNT__;\n" + "CONDES: segment = RODATA,\n" + "type = destructor,\n" + "label = __DESTRUCTOR_TABLE__,\n" + "count = __DESTRUCTOR_COUNT__;\n" + "CONDES: type = interruptor,\n" + "segment = RODATA,\n" + "label = __INTERRUPTOR_TABLE__,\n" + "count = __INTERRUPTOR_COUNT__;\n" + "}\n" + "SYMBOLS {\n" + "__STACKSIZE__ = $800;\n" /* 2K stack */ + "}\n" + "\n" + "\n" + ; diff -Ncr cc65-2.13.2/src/ld65/replica1.inc cc65-2.13.2-apple1/src/ld65/replica1.inc *** cc65-2.13.2/src/ld65/replica1.inc Wed Dec 31 17:00:00 1969 --- cc65-2.13.2-apple1/src/ld65/replica1.inc Tue Sep 13 18:42:27 2011 *************** *** 0 **** --- 1,38 ---- + static const char CfgReplica1 [] = + "MEMORY {\n" + "ZP: start = $0020, size = $00C0, define = yes;\n" + "HEADER: start = $0000, size = $0004, file = %O;\n" + "RAM: start = $0280, size = $7D80, file = %O;\n" + "}\n" + "SEGMENTS {\n" + "EXEHDR: load = HEADER, type = ro;\n" + "STARTUP: load = RAM, type = ro, define = yes;\n" + "LOWCODE: load = RAM, type = ro, optional = yes;\n" + "INIT: load = RAM, type = ro, define = yes, optional = yes;\n" + "CODE: load = RAM, type = ro;\n" + "RODATA: load = RAM, type = ro;\n" + "DATA: load = RAM, type = rw;\n" + "BSS: load = RAM, type = bss, define = yes;\n" + "HEAP: load = RAM, type = bss, optional = yes;\n" /* must sit just below stack */ + "ZEROPAGE: load = ZP, type = zp;\n" + "}\n" + "FEATURES {\n" + "CONDES: segment = INIT,\n" + "type = constructor,\n" + "label = __CONSTRUCTOR_TABLE__,\n" + "count = __CONSTRUCTOR_COUNT__;\n" + "CONDES: segment = RODATA,\n" + "type = destructor,\n" + "label = __DESTRUCTOR_TABLE__,\n" + "count = __DESTRUCTOR_COUNT__;\n" + "CONDES: type = interruptor,\n" + "segment = RODATA,\n" + "label = __INTERRUPTOR_TABLE__,\n" + "count = __INTERRUPTOR_COUNT__;\n" + "}\n" + "SYMBOLS {\n" + "__STACKSIZE__ = $800;\n" /* 2K stack */ + "}\n" + "\n" + "\n" + ; diff -Ncr cc65-2.13.2/src/ld65/tgtcfg.c cc65-2.13.2-apple1/src/ld65/tgtcfg.c *** cc65-2.13.2/src/ld65/tgtcfg.c Fri Sep 18 13:13:59 2009 --- cc65-2.13.2-apple1/src/ld65/tgtcfg.c Tue Sep 13 18:42:27 2011 *************** *** 49,54 **** --- 49,56 ---- /* Actual target configurations, converted into C strings by a perl script */ + #include "apple1.inc" + #include "replica1.inc" #include "apple2.inc" #include "apple2enh.inc" #include "atari.inc" *************** *** 92,97 **** --- 94,101 ---- { BINFMT_BINARY, CfgCBM610 }, { BINFMT_BINARY, CfgPET }, { BINFMT_BINARY, CfgBBC }, + { BINFMT_BINARY, CfgApple1 }, + { BINFMT_BINARY, CfgReplica1 }, { BINFMT_BINARY, CfgApple2 }, { BINFMT_BINARY, CfgApple2Enh }, { BINFMT_BINARY, CfgGeos }, diff -Ncr cc65-2.13.2/src/ld65/tgtcfg.c.orig cc65-2.13.2-apple1/src/ld65/tgtcfg.c.orig *** cc65-2.13.2/src/ld65/tgtcfg.c.orig Wed Dec 31 17:00:00 1969 --- cc65-2.13.2-apple1/src/ld65/tgtcfg.c.orig Fri Sep 18 13:13:59 2009 *************** *** 0 **** --- 1,125 ---- + /*****************************************************************************/ + /* */ + /* tgtcfg.c */ + /* */ + /* Target machine configurations the ld65 linker */ + /* */ + /* */ + /* */ + /* (C) 1998-2009, Ullrich von Bassewitz */ + /* Roemerstrasse 52 */ + /* D-70794 Filderstadt */ + /* EMail: uz@cc65.org */ + /* */ + /* */ + /* 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: */ + /* */ + /* 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 documentation would be */ + /* appreciated but is not required. */ + /* 2. Altered source versions must be plainly marked as such, and must not */ + /* be misrepresented as being the original software. */ + /* 3. This notice may not be removed or altered from any source */ + /* distribution. */ + /* */ + /*****************************************************************************/ + + + + /* common */ + #include "check.h" + + /* ld65 */ + #include "binfmt.h" + #include "tgtcfg.h" + + + + /*****************************************************************************/ + /* Target configurations */ + /*****************************************************************************/ + + + + /* Actual target configurations, converted into C strings by a perl script */ + #include "apple2.inc" + #include "apple2enh.inc" + #include "atari.inc" + #include "atmos.inc" + #include "bbc.inc" + #include "c128.inc" + #include "c16.inc" + #include "c64.inc" + #include "cbm510.inc" + #include "cbm610.inc" + #include "geos.inc" + #include "lunix.inc" + #include "lynx.inc" + #include "module.inc" + #include "nes.inc" + #include "none.inc" + #include "pet.inc" + #include "plus4.inc" + #include "supervision.inc" + #include "vic20.inc" + + + + /*****************************************************************************/ + /* Data */ + /*****************************************************************************/ + + + + /* Target configurations for all systems */ + const TargetDesc Targets[TGT_COUNT] = { + { BINFMT_BINARY, CfgNone }, + { BINFMT_O65, CfgModule }, + { BINFMT_BINARY, CfgAtari }, + { BINFMT_BINARY, CfgVic20 }, + { BINFMT_BINARY, CfgC16 }, + { BINFMT_BINARY, CfgC64 }, + { BINFMT_BINARY, CfgC128 }, + { BINFMT_BINARY, CfgPlus4 }, + { BINFMT_BINARY, CfgCBM510 }, + { BINFMT_BINARY, CfgCBM610 }, + { BINFMT_BINARY, CfgPET }, + { BINFMT_BINARY, CfgBBC }, + { BINFMT_BINARY, CfgApple2 }, + { BINFMT_BINARY, CfgApple2Enh }, + { BINFMT_BINARY, CfgGeos }, + { BINFMT_O65, CfgLunix }, + { BINFMT_BINARY, CfgAtmos }, + { BINFMT_BINARY, CfgNES }, + { BINFMT_BINARY, CfgSupervision }, + { BINFMT_BINARY, CfgLynx }, + }; + + + + /*****************************************************************************/ + /* Code */ + /*****************************************************************************/ + + + + void DumpBuiltinConfig (FILE* F, target_t T) + /* Dump a builtin linker configuration */ + { + /* Check the given parameter */ + PRECONDITION (T > TGT_UNKNOWN && T < TGT_COUNT); + + /* Dump the config */ + fprintf (F, "%s\n", Targets[T].Cfg); + } + + + + diff -Ncr cc65-2.13.2/util/apple1/bintomon.c cc65-2.13.2-apple1/util/apple1/bintomon.c *** cc65-2.13.2/util/apple1/bintomon.c Wed Dec 31 17:00:00 1969 --- cc65-2.13.2-apple1/util/apple1/bintomon.c Tue Sep 13 18:42:27 2011 *************** *** 0 **** --- 1,34 ---- + #include + #include + + int main(int argc, char **argv) + { + FILE *obj; + int start_addr, length; + unsigned char b; + + if (argc < 2) + { + fprintf(stderr, "Include file to convert on command line.\n"); + exit(1); + } + if (obj = fopen(argv[1], "rb")) + { + start_addr = length = 0; + fread(&b, 1, 1, obj); + start_addr = b; + fread(&b, 1, 1, obj); + start_addr |= b << 8; + fread(&length, 1, 2, obj); + printf("%04X:", start_addr); + while (fread(&b, 1, 1, obj) == 1) + { + printf(" %02X", b); + if (!(++start_addr & 0x07)) + printf("\r\n:"); + } + printf("\r\n"); + fclose(obj); + } + return (0); + }