]> git.sur5r.net Git - cc65/commitdiff
first changes for atari5200 target
authorChristian Groessler <chris@groessler.org>
Sat, 1 Mar 2014 16:20:09 +0000 (17:20 +0100)
committerChristian Groessler <chris@groessler.org>
Sat, 1 Mar 2014 16:20:09 +0000 (17:20 +0100)
19 files changed:
asminc/_antic.inc [new file with mode: 0644]
asminc/_gtia.inc [new file with mode: 0644]
asminc/_pokey.inc [new file with mode: 0644]
asminc/atari.inc
asminc/atari5200.inc [new file with mode: 0644]
asminc/atari5200.mac [new file with mode: 0644]
cfg/atari5200.cfg [new file with mode: 0644]
libsrc/Makefile
libsrc/atari5200/cartentry.s [new file with mode: 0644]
libsrc/atari5200/cartname.s [new file with mode: 0644]
libsrc/atari5200/cartyear.s [new file with mode: 0644]
libsrc/atari5200/crt0.s [new file with mode: 0644]
libsrc/atari5200/ctype.s [new file with mode: 0644]
libsrc/atari5200/randomize.s [new file with mode: 0644]
libsrc/atari5200/y2k.inc [new file with mode: 0644]
src/ca65/main.c
src/cc65/main.c
src/common/target.c
src/common/target.h

diff --git a/asminc/_antic.inc b/asminc/_antic.inc
new file mode 100644 (file)
index 0000000..1eb4c87
--- /dev/null
@@ -0,0 +1,93 @@
+;-------------------------------------------------------------------------
+; ANTIC Address Equates
+;-------------------------------------------------------------------------
+
+; Read Addresses
+
+VCOUNT  = ANTIC + $0B         ;vertical line counter
+PENH    = ANTIC + $0C         ;light pen horizontal position
+PENV    = ANTIC + $0D         ;light pen vertical position
+NMIST   = ANTIC + $0F         ;NMI interrupt status
+
+; Write Addresses
+
+DMACTL  = ANTIC + $00         ;DMA control
+CHACTL  = ANTIC + $01         ;character control
+DLISTL  = ANTIC + $02         ;low display list address
+DLISTH  = ANTIC + $03         ;high display list address
+HSCROL  = ANTIC + $04         ;horizontal scroll
+VSCROL  = ANTIC + $05         ;vertical scroll
+PMBASE  = ANTIC + $07         ;player-missile base address
+CHBASE  = ANTIC + $09         ;character base address
+WSYNC   = ANTIC + $0A         ;wait for HBLANK synchronization
+NMIEN   = ANTIC + $0E         ;NMI enable
+NMIRES  = ANTIC + $0F         ;NMI interrupt reset
+
+
+;-------------------------------------------------------------------------
+; Antic opcodes
+;-------------------------------------------------------------------------
+
+; usage example:
+;
+; ScreenDL:
+; .byte DL_BLK8
+; .byte DL_BLK8
+; .byte DL_CHR40x8x1 + DL_LMS + DL_DLI
+; .word ScreenAlignment
+; .byte DL_BLK1 + DL_DLI
+; .byte DL_MAP320x1x1 + DL_LMS
+; .word Screen
+;
+; .repeat 99
+; .byte DL_MAP320x1x1
+; .endrepeat
+; .byte DL_MAP320x1x1 + DL_LMS
+; .word Screen + 40 * 100       ; 100 lines a 40 byte, 'Screen' has to be aligned correctly!
+; .repeat 92
+; .byte DL_MAP320x1x1
+; .endrepeat
+;
+; .byte DL_JVB
+
+; absolute instructions (non mode lines)
+
+DL_JMP  = 1
+DL_JVB  = 65
+
+DL_BLK1  = 0
+DL_BLK2  = 16
+DL_BLK3  = 32
+DL_BLK4  = 48
+DL_BLK5  = 64
+DL_BLK6  = 80
+DL_BLK7  = 96
+DL_BLK8  = 112
+
+; absolute instructions (mode lines)
+
+DL_CHR40x8x1  = 2               ; monochrome, 40 character & 8 scanlines per mode line (GR. 0)
+DL_CHR40x10x1 = 3               ; monochrome, 40 character & 10 scanlines per mode line
+DL_CHR40x8x4  = 4               ; colour, 40 character & 8 scanlines per mode line (GR. 12)
+DL_CHR40x16x4 = 5               ; colour, 40 character & 16 scanlines per mode line (GR. 13)
+DL_CHR20x8x2  = 6               ; colour (duochrome per character), 20 character & 8 scanlines per mode line (GR. 1)
+DL_CHR20x16x2 = 7               ; colour (duochrome per character), 20 character & 16 scanlines per mode line (GR. 2)
+
+DL_MAP40x8x4  = 8               ; colour, 40 pixel & 8 scanlines per mode line (GR. 3)
+DL_MAP80x4x2  = 9               ; 'duochrome', 80 pixel & 4 scanlines per mode line (GR.4) 
+DL_MAP80x4x4  = 10              ; colour, 80 pixel & 4 scanlines per mode line (GR.5) 
+DL_MAP160x2x2 = 11              ; 'duochrome', 160 pixel & 2 scanlines per mode line (GR.6) 
+DL_MAP160x1x2 = 12              ; 'duochrome', 160 pixel & 1 scanline per mode line (GR.14) 
+DL_MAP160x2x4 = 13              ; 4 colours, 160 pixel & 2 scanlines per mode line (GR.7) 
+DL_MAP160x1x4 = 14              ; 4 colours, 160 pixel & 1 scanline per mode line (GR.15) 
+DL_MAP320x1x1 = 15              ; monochrome, 320 pixel & 1 scanline per mode line (GR.8) 
+
+; modifiers on mode lines...
+
+DL_HSCROL = 16
+DL_VSCROL = 32
+DL_LMS    = 64
+
+; general modifier...
+
+DL_DLI    = 128
diff --git a/asminc/_gtia.inc b/asminc/_gtia.inc
new file mode 100644 (file)
index 0000000..f505832
--- /dev/null
@@ -0,0 +1,81 @@
+;-------------------------------------------------------------------------
+; CTIA/GTIA Address Equates
+;-------------------------------------------------------------------------
+
+; Read/Write Addresses
+
+CONSOL  = GTIA + $1F         ;console switches and speaker control
+
+; Read Addresses
+
+M0PF    = GTIA + $00         ;missile 0 and playfield collision
+M1PF    = GTIA + $01         ;missile 1 and playfield collision
+M2PF    = GTIA + $02         ;missile 2 and playfield collision
+M3PF    = GTIA + $03         ;missile 3 and playfield collision
+
+P0PF    = GTIA + $04         ;player 0 and playfield collision
+P1PF    = GTIA + $05         ;player 1 and playfield collision
+P2PF    = GTIA + $06         ;player 2 and playfield collision
+P3PF    = GTIA + $07         ;player 3 and playfield collision
+
+M0PL    = GTIA + $08         ;missile 0 and player collision
+M1PL    = GTIA + $09         ;missile 1 and player collision
+M2PL    = GTIA + $0A         ;missile 2 and player collision
+M3PL    = GTIA + $0B         ;missile 3 and player collision
+
+P0PL    = GTIA + $0C         ;player 0 and player collision
+P1PL    = GTIA + $0D         ;player 1 and player collision
+P2PL    = GTIA + $0E         ;player 2 and player collision
+P3PL    = GTIA + $0F         ;player 3 and player collision
+
+TRIG0   = GTIA + $10         ;joystick trigger 0
+TRIG1   = GTIA + $11         ;joystick trigger 1
+
+TRIG2   = GTIA + $12         ;cartridge interlock
+TRIG3   = GTIA + $13         ;ACMI module interlock
+
+PAL     = GTIA + $14         ;##rev2## PAL/NTSC indicator
+
+; Write Addresses
+
+HPOSP0  = GTIA + $00         ;player 0 horizontal position
+HPOSP1  = GTIA + $01         ;player 1 horizontal position
+HPOSP2  = GTIA + $02         ;player 2 horizontal position
+HPOSP3  = GTIA + $03         ;player 3 horizontal position
+
+HPOSM0  = GTIA + $04         ;missile 0 horizontal position
+HPOSM1  = GTIA + $05         ;missile 1 horizontal position
+HPOSM2  = GTIA + $06         ;missile 2 horizontal position
+HPOSM3  = GTIA + $07         ;missile 3 horizontal position
+
+SIZEP0  = GTIA + $08         ;player 0 size
+SIZEP1  = GTIA + $09         ;player 1 size
+SIZEP2  = GTIA + $0A         ;player 2 size
+SIZEP3  = GTIA + $0B         ;player 3 size
+
+SIZEM   = GTIA + $0C         ;missile sizes
+
+GRAFP0  = GTIA + $0D         ;player 0 graphics
+GRAFP1  = GTIA + $0E         ;player 1 graphics
+GRAFP2  = GTIA + $0F         ;player 2 graphics
+GRAFP3  = GTIA + $10         ;player 3 graphics
+
+GRAFM   = GTIA + $11         ;missile graphics
+
+COLPM0  = GTIA + $12         ;player-missile 0 color/luminance
+COLPM1  = GTIA + $13         ;player-missile 1 color/luminance
+COLPM2  = GTIA + $14         ;player-missile 2 color/luminance
+COLPM3  = GTIA + $15         ;player-missile 3 color/luminance
+
+COLPF0  = GTIA + $16         ;playfield 0 color/luminance
+COLPF1  = GTIA + $17         ;playfield 1 color/luminance
+COLPF2  = GTIA + $18         ;playfield 2 color/luminance
+COLPF3  = GTIA + $19         ;playfield 3 color/luminance
+
+COLBK   = GTIA + $1A         ;background color/luminance
+
+PRIOR   = GTIA + $1B         ;priority select
+VDELAY  = GTIA + $1C         ;vertical delay
+GRACTL  = GTIA + $1D         ;graphic control
+HITCLR  = GTIA + $1E         ;collision clear
+
diff --git a/asminc/_pokey.inc b/asminc/_pokey.inc
new file mode 100644 (file)
index 0000000..99d192f
--- /dev/null
@@ -0,0 +1,44 @@
+;-------------------------------------------------------------------------
+; POKEY Address Equates
+;-------------------------------------------------------------------------
+
+; Read Addresses
+
+POT0    = POKEY + $00         ;potentiometer 0
+POT1    = POKEY + $01         ;potentiometer 1
+POT2    = POKEY + $02         ;potentiometer 2
+POT3    = POKEY + $03         ;potentiometer 3
+POT4    = POKEY + $04         ;potentiometer 4
+POT5    = POKEY + $05         ;potentiometer 5
+POT6    = POKEY + $06         ;potentiometer 6
+POT7    = POKEY + $07         ;potentiometer 7
+
+ALLPOT  = POKEY + $08         ;potentiometer port status
+KBCODE  = POKEY + $09         ;keyboard code
+RANDOM  = POKEY + $0A         ;random number generator
+SERIN   = POKEY + $0D         ;serial port input
+IRQST   = POKEY + $0E         ;IRQ interrupt status
+SKSTAT  = POKEY + $0F         ;serial port and keyboard status
+
+; Write Addresses
+
+AUDF1   = POKEY + $00         ;channel 1 audio frequency
+AUDC1   = POKEY + $01         ;channel 1 audio control
+
+AUDF2   = POKEY + $02         ;channel 2 audio frequency
+AUDC2   = POKEY + $03         ;channel 2 audio control
+
+AUDF3   = POKEY + $04         ;channel 3 audio frequency
+AUDC3   = POKEY + $05         ;channel 3 audio control
+
+AUDF4   = POKEY + $06         ;channel 4 audio frequency
+AUDC4   = POKEY + $07         ;channel 4 audio control
+
+AUDCTL  = POKEY + $08         ;audio control
+STIMER  = POKEY + $09         ;start timers
+SKRES   = POKEY + $0A         ;reset SKSTAT status
+POTGO   = POKEY + $0B         ;start potentiometer scan sequence
+SEROUT  = POKEY + $0D         ;serial port output
+IRQEN   = POKEY + $0E         ;IRQ interrupt enable
+SKCTL   = POKEY + $0F         ;serial port and keyboard control
+
index 7b647fd0a29c802cf17d545cd2fc16d9c41f59f1..34465aee9eb74e0f173e0a66347ff6a949fb6421 100644 (file)
@@ -762,7 +762,15 @@ DOS     = $0700
 
 CARTCS  = $BFFA         ;##rev2## 2-byte cartridge coldstart address
 CART    = $BFFC         ;##rev2## 1-byte cartridge present indicator
+                        ;0=Cart Exists
 CARTFG  = $BFFD         ;##rev2## 1-byte cartridge flags
+                        ;D7  0=Not a Diagnostic Cart
+                        ;    1=Is a Diagnostic cart and control is 
+                        ;      given to cart before any OS is init.
+                        ;D2  0=Init but Do not Start Cart
+                        ;    1=Init and Start Cart
+                        ;D0  0=Do not boot disk
+                        ;    1=Boot Disk
 CARTAD  = $BFFE         ;##rev2## 2-byte cartridge start vector
 
 ;-------------------------------------------------------------------------
@@ -770,83 +778,7 @@ CARTAD  = $BFFE         ;##rev2## 2-byte cartridge start vector
 ;-------------------------------------------------------------------------
 
 GTIA    = $D000         ;CTIA/GTIA area
-
-; Read/Write Addresses
-
-CONSOL  = $D01F         ;console switches and speaker control
-
-; Read Addresses
-
-M0PF    = $D000         ;missile 0 and playfield collision
-M1PF    = $D001         ;missile 1 and playfield collision
-M2PF    = $D002         ;missile 2 and playfield collision
-M3PF    = $D003         ;missile 3 and playfield collision
-
-P0PF    = $D004         ;player 0 and playfield collision
-P1PF    = $D005         ;player 1 and playfield collision
-P2PF    = $D006         ;player 2 and playfield collision
-P3PF    = $D007         ;player 3 and playfield collision
-
-M0PL    = $D008         ;missile 0 and player collision
-M1PL    = $D009         ;missile 1 and player collision
-M2PL    = $D00A         ;missile 2 and player collision
-M3PL    = $D00B         ;missile 3 and player collision
-
-P0PL    = $D00C         ;player 0 and player collision
-P1PL    = $D00D         ;player 1 and player collision
-P2PL    = $D00E         ;player 2 and player collision
-P3PL    = $D00F         ;player 3 and player collision
-
-TRIG0   = $D010         ;joystick trigger 0
-TRIG1   = $D011         ;joystick trigger 1
-
-TRIG2   = $D012         ;cartridge interlock
-TRIG3   = $D013         ;ACMI module interlock
-
-PAL     = $D014         ;##rev2## PAL/NTSC indicator
-
-; Write Addresses
-
-HPOSP0  = $D000         ;player 0 horizontal position
-HPOSP1  = $D001         ;player 1 horizontal position
-HPOSP2  = $D002         ;player 2 horizontal position
-HPOSP3  = $D003         ;player 3 horizontal position
-
-HPOSM0  = $D004         ;missile 0 horizontal position
-HPOSM1  = $D005         ;missile 1 horizontal position
-HPOSM2  = $D006         ;missile 2 horizontal position
-HPOSM3  = $D007         ;missile 3 horizontal position
-
-SIZEP0  = $D008         ;player 0 size
-SIZEP1  = $D009         ;player 1 size
-SIZEP2  = $D00A         ;player 2 size
-SIZEP3  = $D00B         ;player 3 size
-
-SIZEM   = $D00C         ;missile sizes
-
-GRAFP0  = $D00D         ;player 0 graphics
-GRAFP1  = $D00E         ;player 1 graphics
-GRAFP2  = $D00F         ;player 2 graphics
-GRAFP3  = $D010         ;player 3 graphics
-
-GRAFM   = $D011         ;missile graphics
-
-COLPM0  = $D012         ;player-missile 0 color/luminance
-COLPM1  = $D013         ;player-missile 1 color/luminance
-COLPM2  = $D014         ;player-missile 2 color/luminance
-COLPM3  = $D015         ;player-missile 3 color/luminance
-
-COLPF0  = $D016         ;playfield 0 color/luminance
-COLPF1  = $D017         ;playfield 1 color/luminance
-COLPF2  = $D018         ;playfield 2 color/luminance
-COLPF3  = $D019         ;playfield 3 color/luminance
-
-COLBK   = $D01A         ;background color/luminance
-
-PRIOR   = $D01B         ;priority select
-VDELAY  = $D01C         ;vertical delay
-GRACTL  = $D01D         ;graphic control
-HITCLR  = $D01E         ;collision clear
+.include "_gtia.inc"
 
 ;-------------------------------------------------------------------------
 ; PBI Address Equates
@@ -862,6 +794,20 @@ PDVI    = $D1FF         ;##rev2## parallel device IRQ status
 
 PDVS    = $D1FF         ;##rev2## parallel device select
 
+;-------------------------------------------------------------------------
+; POKEY Address Equates
+;-------------------------------------------------------------------------
+
+POKEY     = $D200         ;POKEY area
+.include  "_pokey.inc"
+
+;-------------------------------------------------------------------------
+; ANTIC Address Equates
+;-------------------------------------------------------------------------
+
+ANTIC     = $D400         ;ANTIC area
+.include  "_antic.inc"
+
 ; PBI RAM Address Equates
 
 PBIRAM  = $D600         ;##rev2## parallel bus interface RAM area
@@ -874,52 +820,6 @@ PDIRQV  = $D808         ;##rev2## parallel device IRQ vector
 PDID2   = $D80B         ;##rev2## parallel device ID 2
 PDVV    = $D80D         ;##rev2## parallel device vector table
 
-;-------------------------------------------------------------------------
-; POKEY Address Equates
-;-------------------------------------------------------------------------
-
-POKEY   = $D200         ;POKEY area
-
-; Read Addresses
-
-POT0    = $D200         ;potentiometer 0
-POT1    = $D201         ;potentiometer 1
-POT2    = $D202         ;potentiometer 2
-POT3    = $D203         ;potentiometer 3
-POT4    = $D204         ;potentiometer 4
-POT5    = $D205         ;potentiometer 5
-POT6    = $D206         ;potentiometer 6
-POT7    = $D207         ;potentiometer 7
-
-ALLPOT  = $D208         ;potentiometer port status
-KBCODE  = $D209         ;keyboard code
-RANDOM  = $D20A         ;random number generator
-SERIN   = $D20D         ;serial port input
-IRQST   = $D20E         ;IRQ interrupt status
-SKSTAT  = $D20F         ;serial port and keyboard status
-
-; Write Addresses
-
-AUDF1   = $D200         ;channel 1 audio frequency
-AUDC1   = $D201         ;channel 1 audio control
-
-AUDF2   = $D202         ;channel 2 audio frequency
-AUDC2   = $D203         ;channel 2 audio control
-
-AUDF3   = $D204         ;channel 3 audio frequency
-AUDC3   = $D205         ;channel 3 audio control
-
-AUDF4   = $D206         ;channel 4 audio frequency
-AUDC4   = $D207         ;channel 4 audio control
-
-AUDCTL  = $D208         ;audio control
-STIMER  = $D209         ;start timers
-SKRES   = $D20A         ;reset SKSTAT status
-POTGO   = $D20B         ;start potentiometer scan sequence
-SEROUT  = $D20D         ;serial port output
-IRQEN   = $D20E         ;IRQ interrupt enable
-SKCTL   = $D20F         ;serial port and keyboard control
-
 ;-------------------------------------------------------------------------
 ; PIA Address Equates
 ;-------------------------------------------------------------------------
@@ -932,33 +832,6 @@ PORTB   = $D301         ;port B direction register or memory management
 PACTL   = $D302         ;port A control
 PBCTL   = $D303         ;port B control
 
-;-------------------------------------------------------------------------
-; ANTIC Address Equates
-;-------------------------------------------------------------------------
-
-ANTIC   = $D400         ;ANTIC area
-
-; Read Addresses
-
-VCOUNT  = $D40B         ;vertical line counter
-PENH    = $D40C         ;light pen horizontal position
-PENV    = $D40D         ;light pen vertical position
-NMIST   = $D40F         ;NMI interrupt status
-
-; Write Addresses
-
-DMACTL  = $D400         ;DMA control
-CHACTL  = $D401         ;character control
-DLISTL  = $D402         ;low display list address
-DLISTH  = $D403         ;high display list address
-HSCROL  = $D404         ;horizontal scroll
-VSCROL  = $D405         ;vertical scroll
-PMBASE  = $D407         ;player-missile base address
-CHBASE  = $D409         ;character base address
-WSYNC   = $D40A         ;wait for HBLANK synchronization
-NMIEN   = $D40E         ;NMI enable
-NMIRES  = $D40F         ;NMI interrupt reset
-
 ;-------------------------------------------------------------------------
 ; Floating Point Package Address Equates
 ;-------------------------------------------------------------------------
@@ -1131,74 +1004,6 @@ MYDOS        = 3
 XDOS         = 4
 NODOS        = 255
 
-;-------------------------------------------------------------------------
-; Antic opcodes
-;-------------------------------------------------------------------------
-
-; usage example:
-;
-; ScreenDL:
-; .byte DL_BLK8
-; .byte DL_BLK8
-; .byte DL_CHR40x8x1 + DL_LMS + DL_DLI
-; .word ScreenAlignment
-; .byte DL_BLK1 + DL_DLI
-; .byte DL_MAP320x1x1 + DL_LMS
-; .word Screen
-;
-; .repeat 99
-; .byte DL_MAP320x1x1
-; .endrepeat
-; .byte DL_MAP320x1x1 + DL_LMS
-; .word Screen + 40 * 100       ; 100 lines a 40 byte, 'Screen' has to be aligned correctly!
-; .repeat 92
-; .byte DL_MAP320x1x1
-; .endrepeat
-;
-; .byte DL_JVB
-
-; absolute instructions (non mode lines)
-
-DL_JMP  = 1
-DL_JVB  = 65
-
-DL_BLK1  = 0
-DL_BLK2  = 16
-DL_BLK3  = 32
-DL_BLK4  = 48
-DL_BLK5  = 64
-DL_BLK6  = 80
-DL_BLK7  = 96
-DL_BLK8  = 112
-
-; absolute instructions (mode lines)
-
-DL_CHR40x8x1  = 2               ; monochrome, 40 character & 8 scanlines per mode line (GR. 0)
-DL_CHR40x10x1 = 3               ; monochrome, 40 character & 10 scanlines per mode line
-DL_CHR40x8x4  = 4               ; colour, 40 character & 8 scanlines per mode line (GR. 12)
-DL_CHR40x16x4 = 5               ; colour, 40 character & 16 scanlines per mode line (GR. 13)
-DL_CHR20x8x2  = 6               ; colour (duochrome per character), 20 character & 8 scanlines per mode line (GR. 1)
-DL_CHR20x16x2 = 7               ; colour (duochrome per character), 20 character & 16 scanlines per mode line (GR. 2)
-
-DL_MAP40x8x4  = 8               ; colour, 40 pixel & 8 scanlines per mode line (GR. 3)
-DL_MAP80x4x2  = 9               ; 'duochrome', 80 pixel & 4 scanlines per mode line (GR.4) 
-DL_MAP80x4x4  = 10              ; colour, 80 pixel & 4 scanlines per mode line (GR.5) 
-DL_MAP160x2x2 = 11              ; 'duochrome', 160 pixel & 2 scanlines per mode line (GR.6) 
-DL_MAP160x1x2 = 12              ; 'duochrome', 160 pixel & 1 scanline per mode line (GR.14) 
-DL_MAP160x2x4 = 13              ; 4 colours, 160 pixel & 2 scanlines per mode line (GR.7) 
-DL_MAP160x1x4 = 14              ; 4 colours, 160 pixel & 1 scanline per mode line (GR.15) 
-DL_MAP320x1x1 = 15              ; monochrome, 320 pixel & 1 scanline per mode line (GR.8) 
-
-; modifiers on mode lines...
-
-DL_HSCROL = 16
-DL_VSCROL = 32
-DL_LMS    = 64
-
-; general modifier...
-
-DL_DLI    = 128
-
 ;-------------------------------------------------------------------------
 ; End of atari.inc
 ;-------------------------------------------------------------------------
diff --git a/asminc/atari5200.inc b/asminc/atari5200.inc
new file mode 100644 (file)
index 0000000..d6dd5e4
--- /dev/null
@@ -0,0 +1,100 @@
+
+;-------------------------------------------------------------------------
+; Zero Page
+;-------------------------------------------------------------------------
+
+POKMSK  =  $00   ;Mask for Pokey IRQ enable
+RTCLOK  =  $01   ;60 hz. clock
+JUMP    =  $01   
+CRITIC  =  $03   ;Critical section
+ATRACT  =  $04   ;Attract Mode 
+
+SDLSTL  =  $05   ;DLISTL Shadow
+SDLSTH  =  $06   ;DLISTH  "
+SDMCTL  =  $07   ;DMACTL  "
+
+PCOLR0  =  $08   ;COLPM0 Shadow
+PCOLR1  =  $09   ;COLPM1  "
+PCOLR2  =  $0A   ;COLPM2  "
+PCOLR3  =  $0B   ;COLPM3  "
+
+COLOR0  =  $0C   ;COLPF0 Shadow
+COLOR1  =  $0D   ;COLPF1  "
+COLOR2  =  $0E   ;COLPF2  "
+COLOR3  =  $0F   ;COLPF3  "
+COLOR4  =  $10   ;COLBK   "
+
+PADDL0  =  $11   ;POT0 Shadow
+PADDL1  =  $12   ;POT1  "
+PADDL2  =  $13   ;POT2  "
+PADDL3  =  $14   ;POT3  "
+PADDL4  =  $15   ;POT4  "
+PADDL5  =  $16   ;POT5  "
+PADDL6  =  $17   ;POT6  "
+PADDL7  =  $18   ;POT7  "
+
+
+;-------------------------------------------------------------------------
+; Page #2
+;-------------------------------------------------------------------------
+
+;Interrupt Vectors
+                 
+VIMIRQ  =  $0200   ;Immediate IRQ    
+                      ;Preset $FC03 (SYSIRQ)
+VVBLKI  =  $0202   ;Vblank immediate
+                      ;Preset $FCB8 (SYSVBL)
+VVBLKD  =  $0204   ;Vblank deferred
+                      ;Preset $FCB2 (XITVBL)
+VDSLST  =  $0206   ;Display List 
+                      ;Preset $FEA1 (OSDLI)
+VKYBDI  =  $0208   ;Keyboard immediate
+                      ;Preset $FD02 (SYSKBD)
+VKYBDF  =  $020A   ;Deferred Keyboard
+                      ;Preset $FCB2 (XITVBL)
+VTRIGR  =  $020C   ;Soft Trigger   
+VBRKOP  =  $020E   ;BRK Opcode
+VSERIN  =  $0210   ;Serial in Ready
+VSEROR  =  $0212   ;Serial Out Ready
+VSEROC  =  $0214   ;Serial Output complete
+VTIMR1  =  $0216   ;Pokey Timer 1
+VTIMR2  =  $0218   ;Pokey Timer 2
+VTIMR4  =  $021A   ;Pokey Timer 4
+
+
+
+;-------------------------------------------------------------------------
+; CTIA/GTIA Address Equates
+;-------------------------------------------------------------------------
+
+GTIA    = $C000         ;CTIA/GTIA area
+.include "_gtia.inc"
+
+;-------------------------------------------------------------------------
+; ANTIC Address Equates
+;-------------------------------------------------------------------------
+
+ANTIC     = $D400         ;ANTIC area
+.include  "_antic.inc"
+
+;-------------------------------------------------------------------------
+; POKEY Address Equates
+;-------------------------------------------------------------------------
+
+POKEY     = $E800         ;POKEY area
+.include  "_pokey.inc"
+
+
+;-------------------------------------------------------------------------
+; Cartridge Parameters
+;-------------------------------------------------------------------------
+
+CARTNM  =  $BFE8   ;Cartridge Name Area
+COPYD   =  $BFFC   ;Copyright Decade in Cart
+COPYR   =  $BFFD   ;Copyright Year in Cart
+                      ; $FF=Diagnostic Cart
+GOCART  =  $BFFE   ;Cartridge Start Vector
+
+
+CHRORG  =  $F800   ;Character Generator Base
+
diff --git a/asminc/atari5200.mac b/asminc/atari5200.mac
new file mode 100644 (file)
index 0000000..ece654b
--- /dev/null
@@ -0,0 +1,59 @@
+; Convert characters to screen codes
+                                                              
+; Helper macro that converts and outputs one character
+.macro _scrcode char
+        .if (char >= 0) .and (char <= 31)
+                .byte   (char + 64)
+        .elseif (char >= 32) .and (char <= 95)
+                .byte   (char + 32)
+        .elseif (char >= 96) .and (char <= 127)
+                .byte   char
+        .elseif (char >= 128) .and (char <= 159)
+                .byte   (char + 64)
+        .elseif (char >= 160) .and (char <= 223)
+                .byte   (char - 32)
+        .elseif (char >= 224) .and (char <= 255)
+                .byte   char
+        .else
+                .error  "scrcode: Character constant out of range"
+        .endif
+.endmacro
+
+.macro  scrcode arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9
+
+        ; Bail out if next argument is empty
+        .if     .blank (arg1)
+                .exitmacro
+        .endif
+
+        ; Check for a string
+        .if     .match ({arg1}, "")
+
+                ; Walk over all string chars
+                .repeat .strlen (arg1), i
+                        _scrcode        {.strat (arg1, i)}
+                .endrepeat
+
+        ; Check for a number
+        .elseif .match (.left (1, {arg1}), 0)
+
+                ; Just output the number
+                _scrcode        arg1
+
+        ; Check for a character
+        .elseif .match (.left (1, {arg1}), 'a')
+
+                ; Just output the character
+                _scrcode        arg1
+
+        ; Anything else is an error
+        .else
+
+                .error  "scrcode: invalid argument type"
+
+        .endif
+
+        ; Call the macro recursively with the remaining args
+        scrcode arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9
+.endmacro
+
diff --git a/cfg/atari5200.cfg b/cfg/atari5200.cfg
new file mode 100644 (file)
index 0000000..ff74f2b
--- /dev/null
@@ -0,0 +1,42 @@
+SYMBOLS {
+    __CARTSIZE__:   type = weak, value = $4000; # possible values: $4000 and $8000
+    __CART_ENTRY__: type = import;
+    __STACKSIZE__:  type = weak, value = $0300; # 3 pages stack
+}
+MEMORY {
+    ZP:        file = "", start = $0019,                size = $00E7,                         define = yes;
+    RAM:       file = "", start = $021C,                size = $4000 - __STACKSIZE__ - $021C, define = yes;
+    ROM:       file = %O, start = $C000 - __CARTSIZE__, size = __CARTSIZE__ - $18,            define = yes, fill = yes, fillval = $FF;
+    CARTNAME:  file = %O, start = $BFE8,                size = $0014                                        fill = yes, fillval = $40;
+    CARTYEAR:  file = %O, start = $BFFC,                size = $0002                                        fill = yes, fillval = $59;
+    CARTENTRY: file = %O, start = $BFFE,                size = $0002;
+}
+SEGMENTS {
+    STARTUP:   load = ROM,            type = ro,  define = yes, optional = yes;
+    LOWCODE:   load = ROM,            type = ro,  define = yes, optional = yes;
+    INIT:      load = ROM,            type = ro,                optional = yes;
+    CODE:      load = ROM,            type = ro,  define = yes;
+    RODATA:    load = ROM,            type = ro,                optional = yes;
+    DATA:      load = ROM, run = RAM, type = rw,  define = yes, optional = yes;
+    BSS:       load = RAM,            type = bss, define = yes, optional = yes;
+    CARTNAME:  load = CARTNAME,       type = ro,  define = yes;
+    CARTYEAR:  load = CARTYEAR,       type = ro,  define = yes;
+    CARTENTRY: load = CARTENTRY,      type = ro,  define = yes;
+    ZEROPAGE:  load = ZP,             type = zp,                optional = yes;
+    EXTZP:     load = ZP,             type = zp,                optional = yes;
+}
+FEATURES {
+    CONDES: type    = constructor,
+            label   = __CONSTRUCTOR_TABLE__,
+            count   = __CONSTRUCTOR_COUNT__,
+            segment = INIT;
+    CONDES: type    = destructor,
+            label   = __DESTRUCTOR_TABLE__,
+            count   = __DESTRUCTOR_COUNT__,
+            segment = RODATA;
+    CONDES: type    = interruptor,
+            label   = __INTERRUPTOR_TABLE__,
+            count   = __INTERRUPTOR_COUNT__,
+            segment = RODATA,
+            import  = __CALLIRQ__;
+}
index 3d8277ae557a2deb14d9eba94ae9c0c8608565e2..119fe9a057807d0ae7e67543fa1b44bfc7b5f8f7 100644 (file)
@@ -12,6 +12,7 @@ GEOS = geos-apple \
 
 TARGETS = apple2    \
           apple2enh \
+          atari5200 \
           atari     \
           atarixl   \
           atmos     \
diff --git a/libsrc/atari5200/cartentry.s b/libsrc/atari5200/cartentry.s
new file mode 100644 (file)
index 0000000..e69426b
--- /dev/null
@@ -0,0 +1,13 @@
+; Cartridge entry point
+;
+; Christian Groessler, 01-Mar-2014
+
+.export         __CART_ENTRY__: absolute = 1
+.import                __CARTSIZE__, start
+.forceimport   __CART_YEAR__, __CART_NAME__
+
+.segment        "CARTENTRY"
+
+                .word   start       ; entry point
+
+.assert         (__CARTSIZE__ = $4000 || __CARTSIZE__ = $8000), error, "Cartridge size must either be $4000 or $8000"
diff --git a/libsrc/atari5200/cartname.s b/libsrc/atari5200/cartname.s
new file mode 100644 (file)
index 0000000..51a7ca2
--- /dev/null
@@ -0,0 +1,11 @@
+; default cartridge name
+;
+; Christian Groessler, 01-Mar-2014
+
+.include       "atari5200.mac"
+
+.export         __CART_NAME__: absolute = 1
+
+.segment        "CARTNAME"
+
+               scrcode "   cc65 compiled"
diff --git a/libsrc/atari5200/cartyear.s b/libsrc/atari5200/cartyear.s
new file mode 100644 (file)
index 0000000..85d8196
--- /dev/null
@@ -0,0 +1,12 @@
+; Cartridge copyright year
+;
+; Christian Groessler, 01-Mar-2014
+
+.include       "atari5200.mac"
+
+.export         __CART_YEAR__: absolute = 1
+
+.segment        "CARTYEAR"
+
+               scrcode "98"
+
diff --git a/libsrc/atari5200/crt0.s b/libsrc/atari5200/crt0.s
new file mode 100644 (file)
index 0000000..3944cd2
--- /dev/null
@@ -0,0 +1,55 @@
+;
+; Startup code for cc65 (Atari5200 version)
+;
+; by Christian Groessler (chris@groessler.org), 2014
+;
+
+        .export         _exit, start
+        .export         __STARTUP__ : absolute = 1      ; Mark as startup
+       .import         __RAM_START__, __RAM_SIZE__
+       .import         __RESERVED_MEMORY__
+
+        .import         initlib, donelib, callmain
+        .import         zerobss, copydata
+
+        .include        "zeropage.inc"
+        .include        "atari5200.inc"
+
+
+; ------------------------------------------------------------------------
+; Place the startup code in a special segment.
+
+.segment        "STARTUP"
+
+start:
+
+; Clear the BSS data
+
+        jsr     zerobss
+
+; initialize data
+        jsr     copydata
+
+; setup the stack
+
+        lda     #<(__RAM_START__ + __RAM_SIZE__)
+        sta     sp
+        lda     #>(__RAM_START__ + __RAM_SIZE__)
+        sta     sp+1            ; Set argument stack ptr
+
+; Call module constructors
+
+        jsr     initlib
+
+; Push arguments and call main()
+
+        jsr     callmain
+
+; Call module destructors. This is also the _exit entry.
+
+_exit:  jsr     donelib         ; Run module destructors
+
+; Reset the NES
+
+        jmp start
+
diff --git a/libsrc/atari5200/ctype.s b/libsrc/atari5200/ctype.s
new file mode 100644 (file)
index 0000000..432f462
--- /dev/null
@@ -0,0 +1,5 @@
+; Character specification table.
+;
+; same as for "atari" target
+
+.include "../atari/ctype.s"
diff --git a/libsrc/atari5200/randomize.s b/libsrc/atari5200/randomize.s
new file mode 100644 (file)
index 0000000..ef46282
--- /dev/null
@@ -0,0 +1,17 @@
+;
+; Christian Groessler, 01-Mar-2014
+;
+; void _randomize (void);
+; /* Initialize the random number generator */
+;
+
+        .export         __randomize
+        .import         _srand
+
+        .include        "atari5200.inc"
+
+__randomize:              
+        ldx     VCOUNT          ; Use vertical line counter as high byte
+        lda     RTCLOK+1        ; Use clock as low byte
+        jmp     _srand          ; Initialize generator
+
diff --git a/libsrc/atari5200/y2k.inc b/libsrc/atari5200/y2k.inc
new file mode 100644 (file)
index 0000000..a44d027
--- /dev/null
@@ -0,0 +1,41 @@
+;-----------------------------------------------------------
+; Y2K FIX by Alan Davis, Dennis Debro, and Ronen Habot
+;-----------------------------------------------------------
+Y2K     LDY     #$00            ; Copy BIOS opening screen to RAM
+        LDA     #$FD
+        STA     TEMPH
+        LDA     #$58            ; Assume 2 port system
+        LDX     $FD32
+        CPX     #$E8            ; Is this a 4 port?
+        BNE     Y2K0            ; Jump if not
+        LDA     #$42            ; Yes, 4 port system
+Y2K0    STA     TEMPL           
+Y2K1    LDA     (TEMPL),Y       
+        STA     $0600,Y
+        INY     
+        BNE     Y2K1
+        LDY     #$50
+        INC     TEMPH
+Y2K2    LDA     (TEMPL),Y       
+        STA     $0700,Y
+        DEY     
+        BPL     Y2K2
+        LDA     #$D4            ; Point to copyright string
+        STA     $0724
+        LDA     #$BF
+        STA     $0725
+        LDX     #$0B            ; Store NOP's @ end
+        LDA     #$EA
+Y2K3    STA     $0732,X         
+        DEX     
+        BPL     Y2K3
+        LDA     #$60            ; Store RTS opcode @ end
+        STA     $0750
+        JSR     $0600           ; Show title screen
+        LDY     #$00            ; Clear RAM from $0600-$3FFF
+        STY     $80
+        LDA     #$06
+        STA     $81
+        JSR     CLRRAM
+        RTS     
+
index 4ec98b01db051498c55ae0e6828a4ca4d3b01a95..d4f16d58f882740735e7c17a865033af73f151cc 100644 (file)
@@ -205,6 +205,10 @@ static void SetSys (const char* Sys)
             AbEnd ("Cannot use `module' as a target for the assembler");
             break;
 
+        case TGT_ATARI5200:
+            NewSymbol ("__ATARI5200__", 1);
+            break;
+
         case TGT_ATARI:
             NewSymbol ("__ATARI__", 1);
             break;
index a27822ed8718fe58d700fd7125ae00987bb81b38..affaa01b0b1b9a4cd6e85ac5e473914f38c7e56d 100644 (file)
@@ -160,6 +160,10 @@ static void SetSys (const char* Sys)
             AbEnd ("Cannot use `module' as a target for the compiler");
             break;
 
+        case TGT_ATARI5200:
+            DefineNumericMacro ("__ATARI5200__", 1);
+            break;
+
         case TGT_ATARI:
             DefineNumericMacro ("__ATARI__", 1);
             break;
index a4287ee5699a473827e5ffd08af89fd74f4e2f90..8fd3dcf87d20cb71c3bcc3e268121c10f08bcf69 100644 (file)
@@ -125,6 +125,7 @@ static const TargetEntry TargetMap[] = {
     {   "apple2",       TGT_APPLE2      },
     {   "apple2enh",    TGT_APPLE2ENH   },
     {   "atari",        TGT_ATARI       },
+    {   "atari5200",    TGT_ATARI5200   },
     {   "atarixl",      TGT_ATARIXL     },
     {   "atmos",        TGT_ATMOS       },
     {   "bbc",          TGT_BBC         },
@@ -157,6 +158,7 @@ static const TargetProperties PropertyTable[TGT_COUNT] = {
     { "none",           CPU_6502,       BINFMT_BINARY,      CTNone  },
     { "module",         CPU_6502,       BINFMT_O65,         CTNone  },
     { "atari",          CPU_6502,       BINFMT_BINARY,      CTAtari },
+    { "atari5200",      CPU_6502,       BINFMT_BINARY,      CTAtari },
     { "atarixl",        CPU_6502,       BINFMT_BINARY,      CTAtari },
     { "vic20",          CPU_6502,       BINFMT_BINARY,      CTPET   },
     { "c16",            CPU_6502,       BINFMT_BINARY,      CTPET   },
index e1675ad651c08e1f61fdcdec4530e1e8b7d4580d..d37713e214db3c880c912c1beb931ecded50e525 100644 (file)
@@ -55,6 +55,7 @@ typedef enum {
     TGT_NONE,
     TGT_MODULE,
     TGT_ATARI,
+    TGT_ATARI5200,
     TGT_ATARIXL,
     TGT_VIC20,
     TGT_C16,