- newer PET machines (not 2001).
- the Apple ][+ and successors.
- the Atari 8 bit machines.
+- the Atari 5200 console.
- GEOS for the C64 and C128.
- the Nintendo Entertainment System (NES).
- the Supervision console.
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
;-------------------------------------------------------------------------
;-------------------------------------------------------------------------
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 "atari_gtia.inc"
;-------------------------------------------------------------------------
; PBI Address Equates
PDVS = $D1FF ;##rev2## parallel device select
+;-------------------------------------------------------------------------
+; POKEY Address Equates
+;-------------------------------------------------------------------------
+
+POKEY = $D200 ;POKEY area
+.include "atari_pokey.inc"
+
+;-------------------------------------------------------------------------
+; ANTIC Address Equates
+;-------------------------------------------------------------------------
+
+ANTIC = $D400 ;ANTIC area
+.include "atari_antic.inc"
+
; PBI RAM Address Equates
PBIRAM = $D600 ;##rev2## parallel bus interface RAM area
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
;-------------------------------------------------------------------------
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
;-------------------------------------------------------------------------
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
;-------------------------------------------------------------------------
--- /dev/null
+;-------------------------------------------------------------------------
+; Atari 5200 System Equates
+; by Christian Groessler <chris@groessler.org>
+; taken from EQUATES.INC from Atari Inc.
+;-------------------------------------------------------------------------
+
+;-------------------------------------------------------------------------
+; ATASCII CHARACTER DEFS
+;-------------------------------------------------------------------------
+
+ATEOL = $9B ;END-OF-LINE, used by CONIO
+
+
+;-------------------------------------------------------------------------
+; 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 "
+
+; cc65 runtime zero page variables
+
+ROWCRS_5200 = $19
+COLCRS_5200 = $1A
+SAVMSC = $1B ; pointer to screen memory (conio)
+
+;-------------------------------------------------------------------------
+; 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 "atari_gtia.inc"
+
+;-------------------------------------------------------------------------
+; ANTIC Address Equates
+;-------------------------------------------------------------------------
+
+ANTIC = $D400 ;ANTIC area
+.include "atari_antic.inc"
+
+;-------------------------------------------------------------------------
+; POKEY Address Equates
+;-------------------------------------------------------------------------
+
+POKEY = $E800 ;POKEY area
+.include "atari_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
--- /dev/null
+;-------------------------------------------------------------------------
+; 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
--- /dev/null
+;-------------------------------------------------------------------------
+; 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
+
--- /dev/null
+;-------------------------------------------------------------------------
+; 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
+
--- /dev/null
+SYMBOLS {
+ __CARTSIZE__: type = weak, value = $4000; # possible values: $4000 and $8000
+ __CART_ENTRY__: type = import;
+ __STACKSIZE__: type = weak, value = $0400; # 4 pages stack
+ __RESERVED_MEMORY__: type = export, value = $01E0; # space for 20x24 screen buffer (default display list is in ROM)
+}
+MEMORY {
+ ZP: file = "", start = $001D, size = $00E3, define = yes;
+ RAM: file = "", start = $021C, size = $4000 - __STACKSIZE__ - __RESERVED_MEMORY__ - $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__;
+}
--- /dev/null
+<!doctype linuxdoc system>
+
+<article>
+
+<title>Atari 5200 specific information for cc65
+<author>
+<url url="mailto:chris@groessler.org" name="Christian Groessler"><newline>
+<date>2014-05-27
+
+<abstract>
+An overview over the Atari 5200 runtime system as it is implemented for the
+cc65 C compiler.
+</abstract>
+
+<!-- Table of contents -->
+<toc>
+
+<!-- Begin the document -->
+
+<sect>Overview<p>
+
+This file contains an overview of the Atari 5200 runtime system as it comes
+with the cc65 C compiler. It describes the memory layout, Atari 5200 specific header
+files, available drivers, and any pitfalls specific to that platform.
+
+Please note that Atari 5200 specific functions are just mentioned here, they are
+described in detail in the separate <url url="funcref.html" name="function
+reference">. Even functions marked as "platform dependent" may be available on
+more than one platform. Please see the function reference for more
+information.
+
+
+<sect>Binary format<p>
+
+The standard binary output format generated by the linker for the Atari 5200 target
+is a cartridge image. It is of course
+possible to change this behaviour by using a modified startup file and linker
+config.
+
+<sect>Memory layout<p>
+
+cc65 generated programs with the default setup use the RAM space from $021C to
+$3FFF. If you want to reserve memory for the display list and screen buffer
+you should define the __RESERVED_MEMORY__ linker variable. The number
+of bytes specified by __RESERVED_MEMORY__ are lowering the top of
+memory, therefore the available
+RAM memory for the program is $021C to $3FFF-__RESERVED_MEMORY__.
+The default linker config file sets __RESERVED_MEMORY__ to $1E0
+to reserve space for an optional CONIO text screen.
+
+Special locations:
+
+<descrip>
+ <tag/Text screen/
+ The text screen is only enabled if any of the CONIO output functions
+ is used in the program. Its size is 20x24 characters (Antic mode 6,
+ BASIC mode 1). The text screen is located at $3E00. The
+ address of the screen memory is available at runtime in the variable
+ SAVMSC ($001B).<p>
+ If the program doesn't use any CONIO output functions it needs to setup its own
+ display list.
+
+ <tag/Stack/
+ The C runtime stack is located at $3FFF-__RESERVED_MEMORY__ and growing downwards.
+
+ <tag/Heap/
+ The C heap is located at the end of the program and grows towards the C
+ runtime stack.
+
+</descrip><p>
+
+
+
+<sect>Platform specific header files<p>
+
+Programs containing Atari 5200 specific code may use the <tt/atari5200.h/ header file.
+
+
+<sect1>Atari 5200 specific functions<p>
+
+<itemize>
+<item>TBD.
+</itemize>
+
+
+
+<sect1>Hardware access<p>
+
+The following pseudo variables declared in the <tt/atari5200.h/ header
+file do allow access to hardware located in the address space. Some
+variables are structures, accessing the struct fields will access the
+chip registers.
+
+<descrip>
+
+ <tag><tt/GTIA_READ/ and <tt/GTIA_WRITE/</tag>
+ The <tt/GTIA_READ/ structure allows read access to the GTIA. The
+ <tt/GTIA_WRITE/ structure allows write access to the GTIA.
+ See the <tt/_gtia.h/ header file located in the include directory
+ for the declaration of the structure.
+
+ <tag><tt/POKEY_READ/ and <tt/POKEY_WRITE/</tag>
+ The <tt/POKEY_READ/ structure allows read access to the POKEY. The
+ <tt/POKEY_WRITE/ structure allows write access to the POKEY.
+ See the <tt/_pokey.h/ header file located in the include directory
+ for the declaration of the structure.
+
+ <tag><tt/ANTIC/</tag>
+ The <tt/ANTIC/ structure allows read access to the ANTIC.
+ See the <tt/_antic.h/ header file located in the include directory
+ for the declaration of the structure.
+
+</descrip><p>
+
+
+<sect>Loadable drivers<p>
+
+All drivers must be statically linked because no disk I/O is available.
+The names in the parentheses denote the symbols to be used for static linking of the drivers.
+
+
+<sect1>Graphics drivers<p>
+
+No graphics drivers are currently available for the Atari 5200.
+
+
+<sect1>Extended memory drivers<p>
+
+No extended memory drivers are available for the Atari 5200.
+
+
+<sect1>Joystick drivers<p>
+
+<descrip>
+
+ <tag><tt/atr5200std.joy (atr5200std_joy)/</tag>
+ A joystick driver for the standard Atari 5200 joystick is
+ available. Depending on the version of the 5200 console, two or four joysticks can be attached.
+
+</descrip><p>
+
+
+<sect1>Mouse drivers<p>
+
+No mouse drivers are available for the Atari 5200.
+
+
+<sect1>RS232 device drivers<p>
+
+No serial drivers are available for the Atari 5200.
+
+
+
+<sect>Limitations<p>
+
+<sect1>Disk I/O<p>
+
+Disk I/O is not supported by the <tt/atari5200/ target. This means that
+you cannot use any of the following functions (and a few others):
+
+<itemize>
+<item>fclose
+<item>fopen
+<item>fread
+<item>fprintf
+<item>fputc
+<item>fscanf
+<item>fwrite
+<item>...
+</itemize>
+
+
+
+<sect>Other hints<p>
+
+
+
+<sect>License<p>
+
+This software is provided 'as-is', without any expressed or implied
+warranty. In no event will the authors be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it
+freely, subject to the following restrictions:
+
+<enum>
+<item> The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+<item> Altered source versions must be plainly marked as such, and must not
+ be misrepresented as being the original software.
+<item> This notice may not be removed or altered from any source
+ distribution.
+</enum>
+
+</article>
<itemize>
<item><tt/__APPLE2__/ - Target system is <tt/apple2/ or <tt/apple2enh/
<item><tt/__APPLE2ENH__/ - Target system is <tt/apple2enh/
+<item><tt/__ATARI5200__/ - Target system is <tt/atari5200/
<item><tt/__ATARI__/ - Target system is <tt/atari/ or <tt/atarixl/
<item><tt/__ATARIXL__/ - Target system is <tt/atarixl/
<item><tt/__ATMOS__/ - Target system is <tt/atmos/
This macro is defined if the target is the enhanced Apple //e (-t apple2enh).
+ <tag><tt>__ATARI5200__</tt></tag>
+
+ This macro is defined if the target is the Atari 5200 game console.
+
<tag><tt>__ATARI__</tt></tag>
This macro is defined if the target is the Atari 400/800 (-t atari) or the Atari 800XL/130XE (-t atarixl).
<tag><htmlurl url="atari.html" name="atari.html"></tag>
Topics specific to the Atari 8-bit machines.
+ <tag><htmlurl url="atari5200.html" name="atari5200.html"></tag>
+ Topics specific to the Atari 5200 Game Console.
+
<tag><htmlurl url="atmos.html" name="atmos.html"></tag>
Topics specific to the Oric Atmos.
--- /dev/null
+/*****************************************************************************/
+/* */
+/* atari5200.h */
+/* */
+/* Atari 5200 system specific definitions */
+/* */
+/* */
+/* */
+/* (C) 2014 Christian Groessler <chris@groessler.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 _ATARI5200_H
+#define _ATARI5200_H
+
+
+
+/* Check for errors */
+#if !defined(__ATARI5200__)
+# error This module may only be used when compiling for the Atari 5200!
+#endif
+
+
+/* make GTIA color value */
+#define _gtia_mkcolor(hue,lum) (((hue) << 4) | ((lum) << 1))
+
+/* luminance values go from 0 (black) to 7 (white) */
+
+/* hue values */
+#define HUE_GREY 0
+#define HUE_GOLD 1
+#define HUE_GOLDORANGE 2
+#define HUE_REDORANGE 3
+#define HUE_ORANGE 4
+#define HUE_MAGENTA 5
+#define HUE_PURPLE 6
+#define HUE_BLUE 7
+#define HUE_BLUE2 8
+#define HUE_CYAN 9
+#define HUE_BLUEGREEN 10
+#define HUE_BLUEGREEN2 11
+#define HUE_GREEN 12
+#define HUE_YELLOWGREEN 13
+#define HUE_YELLOW 14
+#define HUE_YELLOWRED 15
+
+/* Color defines, similar to c64 colors (untested) */
+#define COLOR_BLACK _gtia_mkcolor(HUE_GREY,0)
+#define COLOR_WHITE _gtia_mkcolor(HUE_GREY,7)
+#define COLOR_RED _gtia_mkcolor(HUE_REDORANGE,1)
+#define COLOR_CYAN _gtia_mkcolor(HUE_CYAN,3)
+#define COLOR_VIOLET _gtia_mkcolor(HUE_PURPLE,4)
+#define COLOR_GREEN _gtia_mkcolor(HUE_GREEN,2)
+#define COLOR_BLUE _gtia_mkcolor(HUE_BLUE,2)
+#define COLOR_YELLOW _gtia_mkcolor(HUE_YELLOW,7)
+#define COLOR_ORANGE _gtia_mkcolor(HUE_ORANGE,5)
+#define COLOR_BROWN _gtia_mkcolor(HUE_YELLOW,2)
+#define COLOR_LIGHTRED _gtia_mkcolor(HUE_REDORANGE,6)
+#define COLOR_GRAY1 _gtia_mkcolor(HUE_GREY,2)
+#define COLOR_GRAY2 _gtia_mkcolor(HUE_GREY,3)
+#define COLOR_LIGHTGREEN _gtia_mkcolor(HUE_GREEN,6)
+#define COLOR_LIGHTBLUE _gtia_mkcolor(HUE_BLUE,6)
+#define COLOR_GRAY3 _gtia_mkcolor(HUE_GREY,5)
+
+/* get_tv return values */
+#define AT_NTSC 0
+#define AT_PAL 1
+
+/* Define hardware */
+#include <_gtia.h>
+#define GTIA_READ (*(struct __gtia_read*)0xC000)
+#define GTIA_WRITE (*(struct __gtia_write*)0xC000)
+
+#include <_pokey.h>
+#define POKEY_READ (*(struct __pokey_read*)0xE800)
+#define POKEY_WRITE (*(struct __pokey_write*)0xE800)
+
+#include <_antic.h>
+#define ANTIC (*(struct __antic*)0xD400)
+
+/* End of atari5200.h */
+#endif /* #ifndef _ATARI5200_H */
unsigned _clocks_per_sec (void);
# define CLK_TCK _clocks_per_sec()
# define CLOCKS_PER_SEC _clocks_per_sec()
+#elif defined(__ATARI5200__)
+# define CLK_TCK 60 /* POSIX */
+# define CLOCKS_PER_SEC 60 /* ANSI */
#elif defined(__ATMOS__)
# define CLK_TCK 100 /* POSIX */
# define CLOCKS_PER_SEC 100 /* ANSI */
apple2enh \
atari \
atarixl \
+ atari5200 \
atmos \
$(CBMS) \
$(GEOS) \
.import popa, _gotoxy, cputdirect, setcursor
.importzp tmp1
+.ifndef __ATARI5200__
+CHRCODE = $12+64
+.else
+CHRCODE = 14
+.endif
+
_chlinexy:
pha ; Save the length
jsr popa ; Get y
cmp #0 ; Is the length zero?
beq L9 ; Jump if done
sta tmp1
-L1: lda #$12+64 ; Horizontal line, screen code
+L1: lda #CHRCODE ; Horizontal line, screen code
jsr cputdirect ; Direct output
dec tmp1
bne L1
L9: jmp setcursor
-
-
-
-
.import popa, _gotoxy, putchar, setcursor
.importzp tmp1
+.ifndef __ATARI5200__
+CHRCODE = $7C ; Vertical bar
+.else
+CHRCODE = 1 ; exclamation mark
+.endif
+
_cvlinexy:
pha ; Save the length
jsr popa ; Get y
sta tmp1
L1: lda COLCRS
pha
- lda #$7C ; Vertical bar
+ lda #CHRCODE ; Vertical bar
jsr putchar ; Write, no cursor advance
pla
sta COLCRS
dec tmp1
bne L1
L9: jmp setcursor
-
-
-
--- /dev/null
+; 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"
--- /dev/null
+; default cartridge name
+;
+; Christian Groessler, 01-Mar-2014
+
+.include "atari.mac"
+
+.export __CART_NAME__: absolute = 1
+
+.segment "CARTNAME"
+
+ scrcode " cc"
+ .byte '6' + 32, '5' + 32 ; use playfield 1
+ scrcode " compiled"
--- /dev/null
+; Cartridge copyright year
+;
+; Christian Groessler, 01-Mar-2014
+
+.export __CART_YEAR__: absolute = 1
+
+.segment "CARTYEAR"
+
+ .byte '9' + 32,'8' + 32 ; "98", but using playfield 1
--- /dev/null
+.include "../atari/cclear.s"
--- /dev/null
+.include "../atari/chline.s"
--- /dev/null
+;
+; from Atari computer version by Christian Groessler, 2014
+;
+; clock_t clock (void);
+; unsigned _clocks_per_sec (void);
+;
+
+ .export _clock
+ .importzp sreg
+
+ .include "atari5200.inc"
+
+
+.proc _clock
+
+ ldx #5 ; Synchronize with Antic, so the interrupt won't change RTCLOK
+ stx WSYNC ; while we're reading it. The synchronization is done same as
+@L1: dex ; in SETVBLV function in Atari OS.
+ bne @L1
+ stx sreg+1 ; Byte 3 is always zero
+ stx sreg ; Byte 2 is always zero, too
+ lda RTCLOK+1
+ ldx RTCLOK
+ rts
+
+.endproc
--- /dev/null
+;
+; Christian Groessler, May-2014
+;
+; void clrscr (void);
+;
+
+ .export _clrscr
+ .include "atari5200.inc"
+ .importzp ptr1
+
+SCRSIZE = 480 ; 20x24: size of default conio atari5200 screen
+
+_clrscr:lda SAVMSC ; screen memory
+ sta ptr1
+ lda SAVMSC+1
+ clc
+ adc #>(SCRSIZE-1)
+ sta ptr1+1
+ lda #0 ; screen code of space char
+ ldy #<(SCRSIZE-1)
+ ldx #>(SCRSIZE-1)
+_clr1: sta (ptr1),y
+ dey
+ bne _clr1
+ sta (ptr1),y
+ dex
+ bmi done
+ dec ptr1+1
+ dey
+ jmp _clr1
+
+done: sta COLCRS_5200
+ sta ROWCRS_5200
+ rts
--- /dev/null
+; setup default CONIO screen (20x24, Antic mode 6, BASIC mode 1)
+;
+; 28-May-2014, Christian Groessler <chris@groessler.org>
+
+ .include "atari5200.inc"
+
+SCREEN_BUF_SIZE = 20 * 24
+SCREEN_BUF = $4000 - SCREEN_BUF_SIZE
+
+ .code
+ .export screen_setup_20x24
+
+screen_setup_20x24:
+
+ ; initialize SAVMSC
+ lda #<SCREEN_BUF
+ sta SAVMSC
+ lda #>SCREEN_BUF
+ sta SAVMSC+1
+
+ ; initialize cursor position
+ lda #0
+ sta COLCRS_5200
+ sta ROWCRS_5200
+
+ ; clear screen buffer
+ ldy #<(SCREEN_BUF_SIZE-1)
+ ldx #>(SCREEN_BUF_SIZE-1)
+clrscr: sta (SAVMSC),y
+ dey
+ cpy #$FF
+ bne clrscr
+ dex
+ cpx #$FF
+ bne clrscr
+
+ ; set default colors
+
+ lda #40
+ sta COLOR0
+ lda #202
+ sta COLOR1
+ lda #148
+ sta COLOR2
+ lda #70
+ sta COLOR3
+ lda #0
+ sta COLOR4
+
+ ; set display list
+
+ lda #<dlist
+ sta SDLSTL
+ lda #>dlist
+ sta SDLSTH
+
+ rts
+
+
+ .segment "RODATA"
+
+; display list for 20x24 text mode
+
+dlist: .repeat 3
+ .byte DL_BLK8
+ .endrepeat
+
+ .byte DL_CHR20x8x2 | DL_LMS
+ .word SCREEN_BUF
+
+ .repeat 23
+ .byte DL_CHR20x8x2
+ .endrepeat
+
+ .byte DL_JVB
+ .word dlist
+
+; end of display list
+
+.assert ((* >> 10) = (dlist >> 10)), error, "Display list crosses 1K boundary"
+
+
+ .end
--- /dev/null
+;
+; adapted from Atari version
+; Christian Groessler, 2014
+;
+; void cputcxy (unsigned char x, unsigned char y, char c);
+; void cputc (char c);
+;
+
+ .include "atari5200.inc"
+
+ .export _cputcxy, _cputc
+ .export plot, cputdirect, putchar
+ .import popa, _gotoxy, mul20
+ .importzp ptr4
+ .import setcursor
+
+ .constructor screen_setup, 26
+ .import screen_setup_20x24
+screen_setup = screen_setup_20x24
+
+
+_cputcxy:
+ pha ; Save C
+ jsr popa ; Get Y
+ jsr _gotoxy ; Set cursor, drop x
+ pla ; Restore C
+
+_cputc:
+ cmp #$0D ; CR
+ bne L4
+ lda #0
+ sta COLCRS_5200
+ beq plot ; return
+
+L4: cmp #$0A ; LF
+ beq newline
+ cmp #ATEOL ; Atari-EOL?
+ beq newline
+
+ tay
+ rol a
+ rol a
+ rol a
+ rol a
+ and #3
+ tax
+ tya
+ and #$9f
+ ora ataint,x
+
+cputdirect: ; accepts screen code
+ jsr putchar
+
+; advance cursor
+ inc COLCRS_5200
+ lda COLCRS_5200
+ cmp #20
+ bcc plot
+ lda #0
+ sta COLCRS_5200
+
+ .export newline
+newline:
+ inc ROWCRS_5200
+ lda ROWCRS_5200
+ cmp #24
+ bne plot
+ lda #0
+ sta ROWCRS_5200
+plot: jsr setcursor
+ ldy COLCRS_5200
+ ldx ROWCRS_5200
+ rts
+
+putchar:
+ pha ; save char
+
+ lda ROWCRS_5200
+ jsr mul20 ; destroys tmp4
+ clc
+ adc SAVMSC ; add start of screen memory
+ sta ptr4
+ txa
+ adc SAVMSC+1
+ sta ptr4+1
+ pla ; get char again
+
+ ldy COLCRS_5200
+ sta (ptr4),y
+ jmp setcursor
+
+ .rodata
+ataint: .byte 64,0,32,96
+
--- /dev/null
+;
+; Startup code for cc65 (Atari5200 version)
+;
+; 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"
+
+start:
+
+; Clear the BSS data
+
+ jsr zerobss
+
+; initialize data
+ jsr copydata
+
+; setup the stack
+
+ lda #<(__RAM_START__ + __RAM_SIZE__ - __RESERVED_MEMORY__)
+ sta sp
+ lda #>(__RAM_START__ + __RAM_SIZE__ - __RESERVED_MEMORY__)
+ 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
+
+; A 5200 program isn't supposed to exit.
+
+halt: jmp halt
--- /dev/null
+; Character specification table.
+;
+; same as for "atari" target
+
+.include "../atari/ctype.s"
--- /dev/null
+.include "../atari/cvline.s"
--- /dev/null
+;
+; Christian Groessler, 2014
+;
+; unsigned char get_tv (void);
+; /* Return the video mode the machine is using */
+;
+
+ .include "get_tv.inc"
+
+
+;--------------------------------------------------------------------------
+; _get_tv
+
+.proc _get_tv
+
+ lda #<TV::NTSC
+ ldx #>TV::NTSC
+ rts
+
+.endproc
--- /dev/null
+;
+; Christian Groessler, 13-Mar-2014
+;
+; void gotox (unsigned char x);
+;
+
+ .include "atari5200.inc"
+ .export _gotox
+ .import setcursor
+
+_gotox:
+ sta COLCRS_5200 ; Set X
+ jmp setcursor
--- /dev/null
+;
+; Christian Groessler, 13-Mar-2014
+;
+; void gotoxy (unsigned char x, unsigned char y);
+;
+
+ .include "atari5200.inc"
+
+ .export _gotoxy
+ .import popa
+ .import setcursor
+
+_gotoxy: ; Set the cursor position
+ sta ROWCRS_5200 ; Set Y
+ jsr popa ; Get X
+ sta COLCRS_5200 ; Set X
+ jmp setcursor
--- /dev/null
+;
+; Christian Groessler, 13-Mar-2014
+;
+; void gotoy (unsigned char y);
+;
+
+ .include "atari5200.inc"
+ .export _gotoy
+ .import setcursor
+
+_gotoy:
+ sta ROWCRS_5200 ; Set Y
+ jmp setcursor
--- /dev/null
+;
+; IRQ handling (ATARI 5200 version)
+;
+
+ .export initirq, doneirq
+ .import callirq
+
+ .include "atari5200.inc"
+
+; ------------------------------------------------------------------------
+
+.segment "INIT"
+
+initirq:
+ lda VVBLKD
+ ldx VVBLKD+1
+ sta IRQInd+1
+ stx IRQInd+2
+ ldy #<IRQStub
+ ldx #>IRQStub
+ jmp SETVBV
+
+; ------------------------------------------------------------------------
+
+.code
+
+doneirq:
+ ldy IRQInd+1
+ ldx IRQInd+2
+ ;jmp SETVBV
+ ; fall thru
+
+; ------------------------------------------------------------------------
+; Set deferred vertical blank interrupt
+; logic copied from Atari computer ROM
+
+SETVBV: txa
+ ldx #5
+ sta WSYNC ; waste 20 CPU cycles
+@1: dex ; to allow VBLANK to happen
+ bne @1 ; if this is line "7C"
+ sta VVBLKD+1
+ sty VVBLKD
+ rts
+
+; ------------------------------------------------------------------------
+
+.segment "LOWCODE"
+
+IRQStub:
+ cld ; Just to be sure
+ jsr callirq ; Call the functions
+ jmp IRQInd ; Jump to the saved IRQ vector
+
+; ------------------------------------------------------------------------
+
+.data
+
+IRQInd: jmp $0000
--- /dev/null
+;
+; Standard joystick driver for the Atari 5200.
+;
+; Christian Groessler, 2014-05-28
+;
+
+ .include "zeropage.inc"
+
+ .include "joy-kernel.inc"
+ .include "joy-error.inc"
+ .include "atari5200.inc"
+
+
+; ------------------------------------------------------------------------
+; Header. Includes jump table
+
+.segment "HEADER"
+
+; Driver signature
+
+ .byte $6A, $6F, $79 ; "joy"
+ .byte JOY_API_VERSION ; Driver API version number
+
+; Library reference
+
+ .addr $0000
+
+; Button state masks (8 values)
+
+ .byte $01 ; JOY_UP
+ .byte $02 ; JOY_DOWN
+ .byte $04 ; JOY_LEFT
+ .byte $08 ; JOY_RIGHT
+ .byte $10 ; JOY_FIRE
+ .byte $20 ; JOY_FIRE2
+ .byte $00 ; Future expansion
+ .byte $00 ; Future expansion
+
+; Jump table.
+
+ .addr INSTALL
+ .addr UNINSTALL
+ .addr COUNT
+ .addr READJOY
+ .addr 0 ; IRQ entry not used
+
+.code
+
+; ------------------------------------------------------------------------
+; INSTALL routine. Is called after the driver is loaded into memory. If
+; possible, check if the hardware is present and determine the amount of
+; memory available.
+; Must return an JOY_ERR_xx code in a/x.
+;
+
+INSTALL:
+ lda #JOY_ERR_OK
+ ldx #0
+; rts ; Run into UNINSTALL instead
+
+; ------------------------------------------------------------------------
+; UNINSTALL routine. Is called before the driver is removed from memory.
+; Can do cleanup or whatever. Must not return anything.
+;
+
+UNINSTALL:
+ rts
+
+
+; ------------------------------------------------------------------------
+; COUNT: Return the total number of available joysticks in a/x.
+;
+
+COUNT:
+ lda $FD32 ; check ROM version
+ cmp #$E8
+ bne @2port
+ lda #4
+ .byte $2C ; bit opcode, eats the next 2 bytes
+@2port: lda #2
+ ldx #0
+ rts
+
+; ------------------------------------------------------------------------
+; READ: Read a particular joystick passed in A.
+;
+
+CENTER = 228 / 2
+SENSIVITY = 16
+
+READJOY:
+ and #3 ; put joystick number in range, just in case
+ tay
+ asl a
+ tax ; Joystick number * 2 (0-6) into X, index into ZP shadow registers
+
+ lda #0 ; Initialize return value
+ cmp TRIG0,y
+ bne @notrg
+ lda #$10 ; JOY_FIRE
+
+; Read joystick
+
+@notrg: ldy PADDL0,x ; get horizontal position
+ cpy #CENTER-SENSIVITY
+ bcs @chkleft
+
+ ora #4 ; JOY_LEFT
+ bne @updown
+
+@chkleft:
+ cpy #CENTER+SENSIVITY
+ bcc @updown
+
+ ora #8 ; JOY_RIGHT
+
+@updown:ldy PADDL0+1,x ; get vertical position
+ cpy #CENTER-SENSIVITY
+ bcs @chkdown
+
+ ora #1 ; JOY_UP
+ bne @done
+
+@chkdown:
+ cpy #CENTER+SENSIVITY
+ bcc @done
+
+ ora #2 ; JOY_DOWN
+
+@done: rts
--- /dev/null
+;
+; Address of the static standard joystick driver
+;
+; Christian Groessler, 2014-05-12
+;
+; const void joy_static_stddrv[];
+;
+
+ .export _joy_static_stddrv
+ .import _atr5200std_joy
+
+_joy_static_stddrv := _atr5200std_joy
--- /dev/null
+;
+; Christian Groessler, 2014-05-12
+;
+
+ .export joy_libref
+ .import _exit
+
+joy_libref := _exit
--- /dev/null
+;
+; Christian Groessler, April 2014
+;
+; mul20
+; multiplies A by 20 and returns result in AX
+; uses tmp4
+
+ .importzp tmp4
+ .export mul20,loc_tmp
+
+.proc mul20
+
+ ldx #0
+ stx tmp4
+ sta loc_tmp
+ asl a
+ rol tmp4
+ asl a
+ rol tmp4 ; val * 4
+ adc loc_tmp
+ bcc L1
+ inc tmp4 ; val * 5
+L1: asl a
+ rol tmp4 ; val * 10
+ asl a
+ rol tmp4 ; val * 20
+ ldx tmp4
+ rts
+
+.endproc
+
+ .bss
+loc_tmp:.res 1
--- /dev/null
+;
+; 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
+
--- /dev/null
+; Dummy version, there is no visible cursor in the default CONIO screen
+;
+; 28-May-2014, Christian Groessler <chris@groessler.org>
+
+ .export setcursor
+
+.proc setcursor
+
+ rts
+
+.endproc
--- /dev/null
+;
+; Ullrich von Bassewitz, 2003-08-12
+;
+; unsigned char __fastcall__ _sysuname (struct utsname* buf);
+;
+
+ .export __sysuname, utsdata
+
+ .import utscopy
+
+ __sysuname = utscopy
+
+;--------------------------------------------------------------------------
+; Data. We define a fixed utsname struct here and just copy it.
+
+.rodata
+
+utsdata:
+ ; sysname
+ .asciiz "cc65"
+
+ ; nodename
+ .asciiz ""
+
+ ; release
+ .byte ((.VERSION >> 8) & $0F) + '0'
+ .byte '.'
+ .byte ((.VERSION >> 4) & $0F) + '0'
+ .byte $00
+
+ ; version
+ .byte (.VERSION & $0F) + '0'
+ .byte $00
+
+ ; machine
+ .asciiz "Atari5200"
+
+
+
--- /dev/null
+;-----------------------------------------------------------
+; 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
+
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;
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;
{ "apple2", TGT_APPLE2 },
{ "apple2enh", TGT_APPLE2ENH },
{ "atari", TGT_ATARI },
+ { "atari5200", TGT_ATARI5200 },
{ "atarixl", TGT_ATARIXL },
{ "atmos", TGT_ATMOS },
{ "bbc", TGT_BBC },
{ "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 },
TGT_NONE,
TGT_MODULE,
TGT_ATARI,
+ TGT_ATARI5200,
TGT_ATARIXL,
TGT_VIC20,
TGT_C16,