|
|
Line 23: |
Line 23: |
| * Easy 6502 code tester https://skilldrick.github.io/easy6502/ | | * Easy 6502 code tester https://skilldrick.github.io/easy6502/ |
| * Synthetic instructions https://wiki.nesdev.com/w/index.php/Synthetic_instructions#8-bit_rotate | | * Synthetic instructions https://wiki.nesdev.com/w/index.php/Synthetic_instructions#8-bit_rotate |
− |
| |
− | == Atari 8-bit family ==
| |
− | The systems in this family are: Atari 400, 800, 5200, 1200XL, 600XL, 800XL, 130XE, 65XE, 800XE and XEGS.<br />
| |
− |
| |
− | The Atari 8-bit systems consists of the 6502 with custom hardware for graphics and sound.
| |
− |
| |
− | === Setting up ===
| |
− | Setting up your development platform for the Atari 8bit systems is quite easy, first get the following tools:
| |
− |
| |
− | * Assembler: MADS Assembler - This assembler has nice macros for creating Binaries and SNA snapshot files out of the box. You can download it at https://mads.atari8.info/
| |
− | * Emulator(s): I Found Altirra to work best for my usecase. Make sure to use the original Rev2 rom for best compatibility.
| |
− |
| |
− | ==== Special Memory Adresses ====
| |
− | * FRAMECOUNTER_HIGH = 19
| |
− | * FRAMECOUNTER_LOW = 20
| |
− |
| |
− | === Video display ===
| |
− | Video display on the Atari 8bit systems use the ANTIC and GTIA chips. Information can be found here:
| |
− | * https://en.wikipedia.org/wiki/ANTIC
| |
− | * https://www.atariarchives.org/agagd/chapter1.php
| |
− |
| |
− | ==== Sync with frame ====
| |
− | <syntaxhighlight lang="6502">
| |
− | RTCLOK equ $0012
| |
− | lda RTCLOK+2
| |
− | waits
| |
− | cmp RTCLOK+2
| |
− | beq waits
| |
− | </syntaxhighlight>
| |
− |
| |
− | Or if you don't mind trashing RTCLOK
| |
− |
| |
− | <syntaxhighlight lang="6502">
| |
− | RTCLOK equ $0012
| |
− | waits
| |
− | lsr RTCLOK+2
| |
− | bcc waits
| |
− | </syntaxhighlight>
| |
− |
| |
− | Which is two bytes shorter.
| |
− |
| |
− | ==== Getting something on screen ====
| |
− | <syntaxhighlight lang="6502">
| |
− | ;fill screen with charset,(88,89)=an address
| |
− | org $600; free 6th page:600-6ff
| |
− | ldy #0
| |
− | fl: tya
| |
− | sta(88),y
| |
− | iny
| |
− | bne fl
| |
− | jmp *
| |
− | </syntaxhighlight>
| |
− |
| |
− | To be added soon.
| |
− |
| |
− | <syntaxhighlight lang="6502">
| |
− | SDMCTL = $022f
| |
− | HPOSP0 = $d000
| |
− | SIZEP0 = $d008
| |
− | GRAFP0 = $d00d
| |
− | COLPM0 = $d012
| |
− |
| |
− | FRAMECOUNTER_HIGH = 19
| |
− | FRAMECOUNTER = 20
| |
− | WSYNC = $d40a
| |
− | VCOUNT = $d40b
| |
− |
| |
− | sinewave = $0600 ; to $06ff
| |
− |
| |
− | org $80
| |
− |
| |
− | main
| |
− | ; disable all graphics/colors
| |
− | ldx #0
| |
− | stx SDMCTL
| |
− |
| |
− | ldy #$7f
| |
− | sty SIZEP0 ; size p0=127
| |
− |
| |
− | ldx #0
| |
− | ldy #$3f
| |
− | make_sine:
| |
− | value_lo
| |
− | lda #0
| |
− | clc
| |
− | delta_lo
| |
− | adc #0
| |
− | sta value_lo+1
| |
− | value_hi
| |
− | lda #0
| |
− | delta_hi
| |
− | adc #0
| |
− | sta value_hi+1
| |
− |
| |
− | sta sinewave+$c0,x
| |
− | sta sinewave+$80,y
| |
− | eor #$7f
| |
− | sta sinewave+$40,x
| |
− | sta sinewave+$00,y
| |
− |
| |
− | lda delta_lo+1
| |
− | adc #8
| |
− | sta delta_lo+1
| |
− | bcc nothing
| |
− | inc delta_hi+1
| |
− | nothing
| |
− | inx
| |
− | dey
| |
− | bpl make_sine
| |
− |
| |
− | updateloop:
| |
− | ; vblank
| |
− | lda VCOUNT
| |
− | bne updateloop
| |
− |
| |
− | ; clear graphics
| |
− | sta HPOSP0
| |
− | sta GRAFP0
| |
− |
| |
− | ldy #0
| |
− | lda #47
| |
− | sta COLPM0
| |
− | yloop:
| |
− | tya ; graphics shape = y
| |
− | sta WSYNC
| |
− | sta GRAFP0
| |
− |
| |
− | ; a = sin(frame+y)+48
| |
− | tya
| |
− | adc FRAMECOUNTER
| |
− | tax
| |
− | lda sinewave,x
| |
− | adc #48
| |
− | sta HPOSP0
| |
− |
| |
− | iny
| |
− | bne yloop
| |
− | jmp updateloop
| |
− |
| |
− | run main
| |
− | </syntaxhighlight>
| |
− |
| |
− | === Sound ===
| |
− | The Atari 8-bit use the POKEY chip to generate sound.
| |
− | * https://en.wikipedia.org/wiki/POKEY
| |
− |
| |
− | ==== BASIC ====
| |
− | <syntaxhighlight lang="6502">
| |
− | ; from Analog, 1985-09,pp.25-32
| |
− | *=$2000
| |
− | AUDF1=$D200
| |
− | AUDC1=$D201
| |
− | AUDCTL=$D208
| |
− | SKCTL=$D20F
| |
− |
| |
− | .MACRO SOUND ; voice,pitch,dist,vol;,dur
| |
− | lda #%2
| |
− | sta AUDF1+2*%1
| |
− | lda #[[%3 * 16] | %4] ;lda #[[%3 shl 4] or %4]
| |
− | sta AUDC1+2*%1
| |
− | .ENDM
| |
− |
| |
− | lda #0
| |
− | sta AUDCTL
| |
− | lda #3
| |
− | sta SKCTL
| |
− |
| |
− | SOUND 0,121,10,8
| |
− |
| |
− | jmp *
| |
− | </syntaxhighlight>
| |
− | ==== Make some noise ====
| |
− | To be added soon.
| |
− |
| |
− | === Additional Resources ===
| |
− | Sizecoding resource for the Atari 8bit are:
| |
− | * Mapping the Atari https://www.atariarchives.org/mapping/
| |
− | * Atari 8bit Memory map https://www.atariarchives.org/mapping/memorymap.php
| |
− | * Fready's undocumented 6502 opcodes https://github.com/FreddyOffenga/6502
| |
− | * Atari OS Rev2 disassembly for MADS assembler https://github.com/ilmenit/A800-OS-XL-Rev2
| |
− | * Fready's github https://github.com/FreddyOffenga/
| |
Wanting to start sizecoding on a 6502 platform in this day and age can be tough.
The 6502 processor can be seen as the 8-bit micro ARM chip.
It has only has 3 registers (Accumulator, X and Y registers) and a handful of instructions to work with.
To be added.