From c8f7f2f161f32ee2d6c19b1b38c947fa38e93f5e Mon Sep 17 00:00:00 2001 From: Christian Groessler Date: Sat, 1 Mar 2014 17:20:09 +0100 Subject: [PATCH] first changes for atari5200 target --- asminc/_antic.inc | 93 ++++++++++++++ asminc/_gtia.inc | 81 ++++++++++++ asminc/_pokey.inc | 44 +++++++ asminc/atari.inc | 241 ++++------------------------------- asminc/atari5200.inc | 100 +++++++++++++++ asminc/atari5200.mac | 59 +++++++++ cfg/atari5200.cfg | 42 ++++++ libsrc/Makefile | 1 + libsrc/atari5200/cartentry.s | 13 ++ libsrc/atari5200/cartname.s | 11 ++ libsrc/atari5200/cartyear.s | 12 ++ libsrc/atari5200/crt0.s | 55 ++++++++ libsrc/atari5200/ctype.s | 5 + libsrc/atari5200/randomize.s | 17 +++ libsrc/atari5200/y2k.inc | 41 ++++++ src/ca65/main.c | 4 + src/cc65/main.c | 4 + src/common/target.c | 2 + src/common/target.h | 1 + 19 files changed, 608 insertions(+), 218 deletions(-) create mode 100644 asminc/_antic.inc create mode 100644 asminc/_gtia.inc create mode 100644 asminc/_pokey.inc create mode 100644 asminc/atari5200.inc create mode 100644 asminc/atari5200.mac create mode 100644 cfg/atari5200.cfg create mode 100644 libsrc/atari5200/cartentry.s create mode 100644 libsrc/atari5200/cartname.s create mode 100644 libsrc/atari5200/cartyear.s create mode 100644 libsrc/atari5200/crt0.s create mode 100644 libsrc/atari5200/ctype.s create mode 100644 libsrc/atari5200/randomize.s create mode 100644 libsrc/atari5200/y2k.inc diff --git a/asminc/_antic.inc b/asminc/_antic.inc new file mode 100644 index 000000000..1eb4c87ef --- /dev/null +++ b/asminc/_antic.inc @@ -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 index 000000000..f50583271 --- /dev/null +++ b/asminc/_gtia.inc @@ -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 index 000000000..99d192fbd --- /dev/null +++ b/asminc/_pokey.inc @@ -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 + diff --git a/asminc/atari.inc b/asminc/atari.inc index 7b647fd0a..34465aee9 100644 --- a/asminc/atari.inc +++ b/asminc/atari.inc @@ -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 index 000000000..d6dd5e48e --- /dev/null +++ b/asminc/atari5200.inc @@ -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 index 000000000..ece654bcc --- /dev/null +++ b/asminc/atari5200.mac @@ -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 index 000000000..ff74f2b7c --- /dev/null +++ b/cfg/atari5200.cfg @@ -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__; +} diff --git a/libsrc/Makefile b/libsrc/Makefile index 3d8277ae5..119fe9a05 100644 --- a/libsrc/Makefile +++ b/libsrc/Makefile @@ -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 index 000000000..e69426b65 --- /dev/null +++ b/libsrc/atari5200/cartentry.s @@ -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 index 000000000..51a7ca2bd --- /dev/null +++ b/libsrc/atari5200/cartname.s @@ -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 index 000000000..85d819632 --- /dev/null +++ b/libsrc/atari5200/cartyear.s @@ -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 index 000000000..3944cd2bf --- /dev/null +++ b/libsrc/atari5200/crt0.s @@ -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 index 000000000..432f46240 --- /dev/null +++ b/libsrc/atari5200/ctype.s @@ -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 index 000000000..ef462827e --- /dev/null +++ b/libsrc/atari5200/randomize.s @@ -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 index 000000000..a44d027a1 --- /dev/null +++ b/libsrc/atari5200/y2k.inc @@ -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 + diff --git a/src/ca65/main.c b/src/ca65/main.c index 4ec98b01d..d4f16d58f 100644 --- a/src/ca65/main.c +++ b/src/ca65/main.c @@ -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; diff --git a/src/cc65/main.c b/src/cc65/main.c index a27822ed8..affaa01b0 100644 --- a/src/cc65/main.c +++ b/src/cc65/main.c @@ -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; diff --git a/src/common/target.c b/src/common/target.c index a4287ee56..8fd3dcf87 100644 --- a/src/common/target.c +++ b/src/common/target.c @@ -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 }, diff --git a/src/common/target.h b/src/common/target.h index e1675ad65..d37713e21 100644 --- a/src/common/target.h +++ b/src/common/target.h @@ -55,6 +55,7 @@ typedef enum { TGT_NONE, TGT_MODULE, TGT_ATARI, + TGT_ATARI5200, TGT_ATARIXL, TGT_VIC20, TGT_C16,