Specs:
|
|
ChibiAkumas Tutorials
Memory Map
Address | Purpose |
000000 | 512k ram |
07FFFF | |
FA0000 | 128K Rom |
FC0000 | System Rom |
FEFFF | |
FF8000 | Io Area |
FF8200 | Io Area |
FF8400 | Io Area |
FF8600 | Io Area |
FF8800 | Io Area SOUND AY-3-8910 |
FFFA00 | Io Area MFP 68901 |
FFFC00 | Io Area 2 ACIA:s 6580 |
Address | Mode | Bits | Purpose |
FF8004 | RW | ----xxxx | Memory Config |
FF8201 | RW | HHHHHHHH | Video Base H |
FF8202 | EW | LLLLLLLL | Video Base L |
FF8205 | R | HHHHHHHH | Video
Counter
H (current drawing line) |
FF8207 | R | MMMMMMMM | Video Counter M |
FF8209 | R | LLLLLLLL | Video Counter L |
FF820A | RW | ------SR | Sync Mode |
FF8240 | RW | -----RRR -GGG-BBB | Palette Color 0 |
FF8242 | RW | -----RRR -GGG-BBB | Palette Color 1 |
FF8244 | RW | -----RRR -GGG-BBB | Palette Color 2 |
FF8246 | RW | -----RRR -GGG-BBB | Palette Color 3 |
FF8248 | RW | -----RRR -GGG-BBB | Palette Color 4 |
FF824A | RW | -----RRR -GGG-BBB | Palette Color 5 |
FF824C | RW | -----RRR -GGG-BBB | Palette Color 6 |
FF824E | RW | -----RRR -GGG-BBB | Palette Color 7 |
FF8250 | RW | -----RRR -GGG-BBB | Palette Color 8 |
FF8252 | RW | -----RRR -GGG-BBB | Palette Color 9 |
FF8254 | RW | -----RRR -GGG-BBB | Palette Color 10 |
FF8256 | RW | -----RRR -GGG-BBB | Palette Color 11 |
FF8258 | RW | -----RRR -GGG-BBB | Palette Color 12 |
FF825A | RW | -----RRR -GGG-BBB | Palette Color 13 |
FF825C | RW | -----RRR -GGG-BBB | Palette Color 14 |
FF825E | RW | -----RRR -GGG-BBB | Palette Color 15 |
FF8260 | RW | ------SS | Screen Mode (00=320x240x4bpp) |
FF8400 | Reserved | ||
FF8600 | Reserved | ||
FF8602 | Reserved | ||
FF8604 | -------- XXXXXXXX | Disk controler data access | |
FF8606 | R | -------- -----DSE | DMA Status Mode control |
FF8606 | W | -------W FD0RGAB | DMA Mode Control |
FF8609 | RW | HHHHHHHH | Dna Base & Counter H |
FF860B | RW | MMMMMMMM | Dna Base & Counter M |
FF860D | RW | LLLLLLLL | Dna Base & Counter L |
FF8800 | R | DDDDDDDD | IO Port B Data |
FF8800 | W | RRRRRRRR | PSG Register Select |
FF8802 | W | RGCDRFGH | PSG Write Data � IO Port A |
FF8802 | RW | DDDDDDDD | IO Port B Data |
FFFA01 | M-IW---P | MFP GP IO | |
FFFA03 | DDDDDDDD | MFP Active Edge | |
FFFA05 | DDDDDDDD | MFP Data Direction | |
FFFA07 | DDDDDDDD | MFP Interrupt Enable A | |
FFFA09 | DDDDDDDD | MFP Interrupt Enable B | |
FFFA0B | DDDDDDDD | MFP Interrupt Pending A | |
FFFA0D | DDDDDDDD | MFP Interrupt Pending B | |
FFFA0F | DDDDDDDD | MFP Interrupt Interrupt In Service A | |
FFFA11 | DDDDDDDD | MFP Interrupt Interrupt In Service B | |
FFFA13 | DDDDDDDD | MFP Interrupt Mask A | |
FFFA15 | DDDDDDDD | MFP Interrupt Mask B | |
FFFA17 | DDDDDDDD | MFP Vector Base | |
FFFA19 | DDDDDDDD | MFP Timer A Control | |
FFFA1B | DDDDDDDD | MFP Timer B Control | |
FFFA1D | DDDDDDDD | MFP Timers C & D Control | |
FFFA1F | DDDDDDDD | MFP Timer A data | |
FFFA21 | DDDDDDDD | MFP Timer B data | |
FFFA23 | DDDDDDDD | MFP Timer C data | |
FFFA25 | DDDDDDDD | MFP Timer D data | |
FFFA27 | DDDDDDDD | MFP Sync Character | |
FFFA29 | DDDDDDDD | MFP USART control reg | |
FFFA2B | DDDDDDDD | MFP receiver status | |
FFFA2D | DDDDDDDD | MFP Transmitter status | |
FFFA2F | DDDDDDDD | MFP USART Data | |
FFFC00 | DDDDDDDD | Keyboard ACIA Control | |
FFFC02 | DDDDDDDD | Keyboard Data | |
FFFC04 | DDDDDDDD | Midi ACIA Control | |
FFFC06 | DDDDDDDD | Midi Data |
Command | Command | Detail |
$A000 | Initialize | Determine address of required variable range |
$A001 | Put Pixel | Set point on the screen |
$A002 | Get Pixel | Determine color of a screen point |
$A003 | Line | Draw a line on the screen |
$A004 | Horizontal Line | Draw a horizontal line (fast) |
$A005 | Filled Rectangle | Fill a rectangele wit color |
$A006 | Filled Polygon | Fill a polygon line by line |
$A007 | BitBlt | Bit block transfer |
$A008 | TextBlt | Text block transfer |
$A009 | Show Mouse | enable mouse cursor |
$A00A | Hide Cursor | Disable mouse cursor |
$A00B | Transform Mouse | Change mouse cursor form |
$A00C | Undraw Sprite | Clear sprite |
$A00D | Draw Sprite | Enable sprite |
$A00E | Copy Raster From | Copy raster form |
Vblank!
It's possible to 'Wait for Vblank' by using the line counter at
$FF8205/7/9. First we calculate the address of the last line of our 32k screen, in this case by adding 320*200/2 to 'ScreenBase' Next we wait for the line counter to point to this line - at this point the bottom of the screen is being drawn, Here is an example of a possible solution - this assumes memory address 'ScreenBase' has a long pointer of the address of the first line of the screen. |
waitVBlank: moveM.l d0-d1,-(sp) move.l ScreenBase,d1 ;Get screen pointer add.l #(320*200/2),d1 ;Add one full screen WaitVblankAgain: jsr VblankGetLine cmp.l d1,d0 blt WaitVblankAgain ;Wait for last line to be drawn WaitVblankAgain2: jsr VblankGetLine cmp.l d0,d1 beq WaitVblankAgain2 ;Wait for line to end moveM.l (sp)+,d0-d1 rts VblankGetLine: clr.l d0 or.b $FF8205,d0 ;Get current drawing line lsl.l #8,d0 ;from hardware regs or.b $FF8207,d0 lsl.l #8,d0 or.b $FF8209,d0 rts |
I'm not a fan of using the firmware
for doing things, but I can't find any other way to read the
joystick on the Atari ST The Atari ST joystick is connected as part of the keyboard... to read it we have to install a Joystick event interrupt handler... Shown to the right is the simplest joystick handler I have working... we store the two joystick bytes to a temporary variable called "Joydata" |
move.w
#$14,-(sp) ;IKBD command $14
- set joystick event reporting move.w #4,-(sp) ;Device no 4 (keyboard - Joystick is part of keyboard) move.w #3,-(sp) ;Bconout (send cmd to keyboard) trap #13 ;BIOS Trap addq.l #6,sp ;Fix the stack move.w #34,-(sp) ;return IKBD vector table (KBDVBASE) trap #14 ;XBIOS trap addq.l #2,sp ;Fix the stack move.l d0,ikbd_vec ; store IKBD vectors address for later move.l d0,a0 ; A0 points to IKBD vectors move.l 24(a0),old_joy ; backup old joystick vector so we can restore it move.l #JoystickHandler,24(a0); Set our Joystick Handler rts JoystickHandler: move.b (1,a0),joydata ; store joy 0 data move.b (2,a0),joydata+1 ; store joy 1 data rts ikbd_vec: dc.l 0 ; old IKBD vector storage old_joy: dc.l 0 ; old joy vector storage joydata: ds.b 2 ;Joypad bytes F----RLDU |
AY Sound Chip:
The AY uses a series of 8 bit registers to control the 3 sound channels.
To set a register, we must first select the register number by writing a byte to $FF8800, then send the byte of data to $FF8802
Register | Meaning | Bit Meaning | Details |
0 | Tone Pitch L - Channel A | LLLLLLLL | Lower value = Higher pitch |
1 | Tone Pitch H - Channel A | ----HHHH | Lower value = Higher pitch |
2 | Tone Pitch L - Channel B | LLLLLLLL | Lower value = Higher pitch |
3 | Tone Pitch H - Channel B | ----HHHH | Lower value = Higher pitch |
4 | Tone Pitch L - Channel C | LLLLLLLL | Lower value = Higher pitch |
5 | Tone Pitch H - Channel C | ----HHHH | Lower value = Higher pitch |
6 | Noise Generator | ---NNNNN | Higer = Faster noise |
7 | Mixer | --NNNTTT | N=Noise T=Tone (Channel --CBACBA 1=mute 0=normal) |
8 | Amplitude - Channel A | ---EVVVV | E=Envelope (1=Enabled) VVVV=Volume |
9 | Amplitude - Channel B | ---EVVVV | E=Envelope (1=Enabled) VVVV=Volume |
10 | Amplitude - Channel C | ---EVVVV | E=Envelope (1=Enabled) VVVV=Volume |
11 | Envelope L (Volume over time) | LLLLLLLL | Lower=Faster Envelope |
12 | Envelope H (Volume over time) | HHHHHHHH | Lower=Faster Envelope |
13 | Envelope Selection | ----EEEE | Envelope number (See PDF) |
Trap | Num | Command | Details |
#1 (Gemdos) | $00 | Term | |
$01 | ConIn | ||
$02 | ConOut | ||
$03 | Auxilliary Input | ||
$04 | Auxilliary Output | ||
$05 | Printer Output | ||
$06 | RawConIO | ||
$07 | Direct ConIn Without Echo | ||
$08 | ConIn Without Echo | ||
$09 | Print Line | ||
$0A | ReadLine | ||
$0B | ConStat | ||
$0E | SetDrv | ||
$10 | ConOut Stat | ||
$11 | PrtOut Stat | ||
$12 | AuxIn Stat | ||
$13 | AuxOut Stat | ||
$19 | Current Disk | ||
$1A | Set Disk Transfer Access | ||
$20 | Super | ||
$2A | Get Date | ||
$2B | Set Date | ||
$2C | Get Time | ||
$2D | Set Time | ||
$2F | Get DTA | ||
$30 | Get Version Number | ||
$31 | Keep Process | ||
$36 | Get Free Disk Space | ||
$39 | MKDir | ||
$3A | RmDir | ||
$3B | ChDir | ||
$3C | Create | ||
$3D | Open | ||
$3E | Close | ||
$3F | Read | ||
$40 | Write | ||
$41 | Unlink | ||
$42 | Lseek | ||
$43 | Change Mode (ChMod) | ||
$45 | Dup | ||
$46 | Force | ||
$47 | GetDir | ||
$48 | Malloc | ||
$49 | Mfree | ||
$4A | SetBlock | ||
$4B | Exec | ||
$4C | Term | ||
$4E | Sfirst | ||
$4F | Snext | ||
$56 | Rename | ||
$57 | GSDTOF | ||
#13 (Bios) | 0 | getmpb | Get Memory Parameter Block |
1 | bconstat | Return input device status | |
2 | conin | Read character from device | |
3 | bconout | Write character to device | |
4 | rwabs | Read and write disk sector | |
5 | setexec | set exception vectors | |
6 | tickcal | return millisecond per tick | |
7 | get bpb | get BIOS parameter block | |
8 | bcostat | return output device status | |
9 | mediach | inquire media change | |
10 | drvmap | inquire drive status | |
11 | kbshift | inquire/change keyboard status | |
#14 (xbios) | 0 | initmous | initialize mouse |
1 | ssbrk | save memory space | |
2 | physbase | return screen RAM base address | |
3 | logbase | set logical screen base | |
4 | getrez | return screen resolution | |
5 | setscreen | Set Screen parameters | |
6 | setpalette | set color palette | |
7 | setcolor | set color palette | |
8 | floprd | read diskette sector | |
9 | flopwr | write disk sector | |
10 | flopfmt | format diskette | |
12 | midiws | write string to midi interface | |
13 | mfpint | initilize MFP format | |
14 | iorec | return record buffer | |
15 | rsconf | set rs232 configuration | |
16 | keytbl | set keyboard table | |
17 | random | return random number | |
18 | protobt | produce boot sector | |
19 | flopver | verify diskette sector | |
20 | scrdmp | output screen dump | |
21 | cursconf | set cursor configuration | |
22 | settime | set clock time and date | |
23 | gettime | return clock time and date | |
24 | bioskeys | restore keyboard table | |
25 | ikbdws | intelligent keyboard send | |
26 | jdisint | disable interrupts on MFP | |
27 | jenabint | enable interrupts on MFP | |
28 | giaaccess | access GI sound chip | |
29 | offgibit | reset Port A GI sound chip | |
30 | ongibit | cleart port A of GI sound chip | |
31 | xbtimer | start MFP timer | |
32 | dosound | Set sound parameters | |
33 | setprt | Set printer config | |
34 | kbdvbase | return keyboard vector table | |
35 | kbrate | set keyboard repeat rate | |
36 | prtblk | output block to printer | |
37 | wvbl | wait for video | |
38 | supexec | set supervisor execution | |
39 | puntaes | disable AES |
Offset | Value (Long) | Purpose |
0 | MidiVec | Midi Input |
4 | VkbdErr | Keyboard Error |
8 | VmidErr | Midi Error |
12 | StatVec | IKBD Status |
16 | MouseVec | Mouse Routines |
20 | CockVec | Clock Time Routines |
24 | JoyVec | Joystick Routines |
Number | Purpose |
$07 | Returns the result of pressing one of the two mouse button |
$08 | Returns the relative mouse position from now on. |
$09 | Returns the absolute mouse position from now on |
$0A | With this command it is possible to get the key numbers of the cursor keys instead of the coordinates. |
$0B | This command sets the trigger threshold, above which movements will be announced. |
$0C | Scale mouse. |
$0D | Read absolute mouse position. |
$0E | Set the internal coordinate counter |
$0F | Set the origin for the Y-axis is down (next to the user) |
$10 | Set the origin for the Y-axis is up. |
$11 | The data transfer to the main processor is permitted again (see $13). |
$12 | Turn mouse off. |
$13 | Stop data transfer to main processor |
$14 | Every joystick movement is automatically returned. |
$15 | End the automatic-return mode for the joystick. |
$16 | Read joystick. |
$17 | Joystick duration message. |
$18 | Fire button duration message. |
$19 | Cursor key simulation mode for joystick 0 (!). |
$1A | Turn off joysticks. |
$1B | Set clock time. |
$1C | Read clock time. |
$20 | Load memory. |
$21 | Read memoiy. |
$22 | Execute routine. |