1
0
mirror of https://github.com/cc65/cc65.git synced 2024-06-28 19:29:53 +00:00

Merge pull request #122 from groessler/a5200

new target: Atari 5200 console
This commit is contained in:
Oliver Schmidt 2014-05-30 22:52:51 +02:00
commit 99f0a56f63
45 changed files with 1480 additions and 227 deletions

View File

@ -21,6 +21,7 @@ including
- 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.

View 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 "atari_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 "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
@ -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
;-------------------------------------------------------------------------

116
asminc/atari5200.inc Normal file
View File

@ -0,0 +1,116 @@
;-------------------------------------------------------------------------
; 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

93
asminc/atari_antic.inc Normal file
View File

@ -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

81
asminc/atari_gtia.inc Normal file
View File

@ -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

44
asminc/atari_pokey.inc Normal file
View File

@ -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

43
cfg/atari5200.cfg Normal file
View File

@ -0,0 +1,43 @@
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__;
}

199
doc/atari5200.sgml Normal file
View File

@ -0,0 +1,199 @@
<!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 &dollar;021C to
&dollar;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 &dollar;021C to &dollar;3FFF-__RESERVED_MEMORY__.
The default linker config file sets __RESERVED_MEMORY__ to &dollar;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 &dollar;3E00. The
address of the screen memory is available at runtime in the variable
SAVMSC (&dollar;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 &dollar;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>

View File

@ -4396,6 +4396,7 @@ compiler, depending on the target system selected:
<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/

View File

@ -709,6 +709,10 @@ The compiler defines several macros at startup:
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).

View File

@ -107,6 +107,9 @@
<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.

102
include/atari5200.h Normal file
View File

@ -0,0 +1,102 @@
/*****************************************************************************/
/* */
/* 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 */

View File

@ -81,6 +81,9 @@ extern struct _timezone {
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 */

View File

@ -18,6 +18,7 @@ TARGETS = apple2 \
apple2enh \
atari \
atarixl \
atari5200 \
atmos \
$(CBMS) \
$(GEOS) \

View File

@ -9,6 +9,12 @@
.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
@ -19,12 +25,8 @@ _chline:
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

View File

@ -10,6 +10,12 @@
.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
@ -22,7 +28,7 @@ _cvline:
sta tmp1
L1: lda COLCRS
pha
lda #$7C ; Vertical bar
lda #CHRCODE ; Vertical bar
jsr putchar ; Write, no cursor advance
pla
sta COLCRS
@ -30,6 +36,3 @@ L1: lda COLCRS
dec tmp1
bne L1
L9: jmp setcursor

View File

@ -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"

View File

@ -0,0 +1,13 @@
; 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"

View File

@ -0,0 +1,9 @@
; 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

View File

@ -0,0 +1 @@
.include "../atari/cclear.s"

View File

@ -0,0 +1 @@
.include "../atari/chline.s"

26
libsrc/atari5200/clock.s Normal file
View File

@ -0,0 +1,26 @@
;
; 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

34
libsrc/atari5200/clrscr.s Normal file
View File

@ -0,0 +1,34 @@
;
; 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

View File

@ -0,0 +1,83 @@
; 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

94
libsrc/atari5200/cputc.s Normal file
View File

@ -0,0 +1,94 @@
;
; 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

48
libsrc/atari5200/crt0.s Normal file
View File

@ -0,0 +1,48 @@
;
; 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

5
libsrc/atari5200/ctype.s Normal file
View File

@ -0,0 +1,5 @@
; Character specification table.
;
; same as for "atari" target
.include "../atari/ctype.s"

View File

@ -0,0 +1 @@
.include "../atari/cvline.s"

20
libsrc/atari5200/get_tv.s Normal file
View File

@ -0,0 +1,20 @@
;
; 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

13
libsrc/atari5200/gotox.s Normal file
View File

@ -0,0 +1,13 @@
;
; 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

17
libsrc/atari5200/gotoxy.s Normal file
View File

@ -0,0 +1,17 @@
;
; 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

13
libsrc/atari5200/gotoy.s Normal file
View File

@ -0,0 +1,13 @@
;
; 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

59
libsrc/atari5200/irq.s Normal file
View File

@ -0,0 +1,59 @@
;
; 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

View File

@ -0,0 +1,130 @@
;
; 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

View File

@ -0,0 +1,12 @@
;
; 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

View File

@ -0,0 +1,8 @@
;
; Christian Groessler, 2014-05-12
;
.export joy_libref
.import _exit
joy_libref := _exit

33
libsrc/atari5200/mul20.s Normal file
View File

@ -0,0 +1,33 @@
;
; 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

View File

@ -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

View File

@ -0,0 +1,11 @@
; 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

View File

@ -0,0 +1,39 @@
;
; 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"

41
libsrc/atari5200/y2k.inc Normal file
View File

@ -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

View 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;

View 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;

View 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 },

View File

@ -55,6 +55,7 @@ typedef enum {
TGT_NONE,
TGT_MODULE,
TGT_ATARI,
TGT_ATARI5200,
TGT_ATARIXL,
TGT_VIC20,
TGT_C16,