Difference between revisions of "Atari ST"
Line 25: | Line 25: | ||
The Atari ST uses an interleaved planar memory layout to represent its paletted display modes (we'll concentrate on 320x200x16 colours here). | The Atari ST uses an interleaved planar memory layout to represent its paletted display modes (we'll concentrate on 320x200x16 colours here). | ||
− | ==== | + | ==== Setting a palette ==== |
The Atari ST uses index values into a palette of colours. Index 0 is the background colour (that's also used for the border) and a maximum of 16 colours can be defined and indexed. | The Atari ST uses index values into a palette of colours. Index 0 is the background colour (that's also used for the border) and a maximum of 16 colours can be defined and indexed. | ||
− | + | Palette format is a word per index with 3 nibbles for 4-bit RGB (e.g. $00f for blue). | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
Here is some code that will help you setup a palette | Here is some code that will help you setup a palette | ||
<syntaxhighlight lang=""> | <syntaxhighlight lang=""> | ||
− | pea | + | pea paldata(pc) |
move.w #6,-(sp) | move.w #6,-(sp) | ||
trap #14 | trap #14 | ||
; Palette data | ; Palette data | ||
− | + | paldata: | |
dc.w $000,$100,$200,$311,$422,$533,$644,$755 | dc.w $000,$100,$200,$311,$422,$533,$644,$755 | ||
dc.w $575,$464,$353,$242,$131,$020,$010,$000 | dc.w $575,$464,$353,$242,$131,$020,$010,$000 | ||
Line 67: | Line 42: | ||
==== Getting something on screen ==== | ==== Getting something on screen ==== | ||
− | + | One of the shortest ways to get you started with getting anything on screen at all, is to use the built-in Line-A routines. | |
+ | These are relatively easy to setup and allow you to plot pixels, hlines, lines, rects and even polygons. | ||
+ | However, as can be expected these routines are very slow in execution. | ||
<syntaxhighlight lang=""> | <syntaxhighlight lang=""> | ||
Line 73: | Line 50: | ||
; Line-A Initialization | ; Line-A Initialization | ||
;----------------------- | ;----------------------- | ||
− | ; After calling this function, data register D0 and address register A0 point to a table ; with the starting address of the Line A variables. | + | ; After calling this function, data register D0 and address register A0 point to a table ; with the starting address of the Line A variables. |
− | ; Address register A1 points to a table with the starting addresses for the three system ; font headers, | + | ; Address register A1 points to a table with the starting addresses for the three system ; font headers, |
− | ; and address register A2 points to a table that specifies the starting addresses of the; 15 Line A opcodes. There's no parameter required for this function, so all you have | + | ; and address register A2 points to a table that specifies the starting addresses of the; 15 Line A opcodes. There's no parameter required for this function, so all you have |
− | ; to do is call the word opcode label that you specified for the $A000 (Initialize) | + | ; to do is call the word opcode label that you specified for the $A000 (Initialize) |
− | ; function. | + | ; function. |
dc.w $A000 | dc.w $A000 | ||
movem.l (a0),a1-a4 ; A3=INTIN, A4=PTSIN | movem.l (a0),a1-a4 ; A3=INTIN, A4=PTSIN | ||
− | + | --------- | |
− | |||
− | |||
− | |||
frameloop: | frameloop: | ||
move.w #200-1,d7 ; y | move.w #200-1,d7 ; y | ||
Line 91: | Line 65: | ||
; Putpixel | ; Putpixel | ||
− | |||
move.b d6,d0 ; d0=x | move.b d6,d0 ; d0=x | ||
− | eor d7,d0 | + | eor d7,d0 ; d0=x^y |
− | lsr.b #2,d0 | + | lsr.b #2,d0 ; d0>>=4 |
− | and #42,d0 | + | and #42,d0 ; d0&42 |
move.w d0,(a3) ; a3=color(d0) | move.w d0,(a3) ; a3=color(d0) | ||
Line 102: | Line 75: | ||
dc.w $A001 ; put pixel command | dc.w $A001 ; put pixel command | ||
− | dbra d6,xLoop | + | dbra d6,xLoop ; decrease and branch |
− | dbra d7,yLoop | + | dbra d7,yLoop |
− | ; Wait loop | + | ; Wait loop |
− | + | bra frameloop ; .s * | |
</syntaxhighlight> | </syntaxhighlight> | ||
+ | |||
+ | ==== Planes ==== | ||
+ | Every plane contains one bit of a pixel's colour index value. The bits of the binary representation of a colour index like %1010 (% Bit3,Bit2,Bit1,Bit0) will end up in 4 different planes (bits most significant to least significant aka left to right): Plane4 Plane3 Plane2 Plane1. | ||
+ | |||
+ | So basicly Plane1 contains all of the Bit0s of all pixels, Plane2 all Bit1s, Plane3 all Bit2s and Plabe4 all Bit3s. | ||
+ | |||
+ | The first pixel on a plane is described by the leftmost (aka most significant) bit in a word, the second one by the second-leftmost etc. - just like this %0123456789abcdef with 0-f=pixels 1-16. %1000000000000000=$8000=pixel 1 in a plane word set. The 16th pixel will use the leftmost bit of the next word in this plane. etc. | ||
+ | |||
+ | ==== Interleaved ==== | ||
+ | 16 pixels worth of data are represented as a full graphicword, meaning all information to display 16 pixels are stored together, followed by the data to represent the next 16 pixels etc. One row worth of display data has 20 graphicwords (20*16 pixels=320 pixels). | ||
+ | |||
+ | 16 pixels are stored in 4 words - which contain 4 of the aforementioned planes. | ||
+ | <br /><br /> | ||
+ | So a 320x200x16 colour display is a contiuous memory buffer containing: | ||
+ | |||
+ | <syntaxhighlight lang=""> | ||
+ | Pixels 0-15, row 0:(Plane1.w Plane2.w Plane3.w Plane4.w) | ||
+ | Pixels 16-31, row 0:(Plane1.w Plane2.w Plane3.w Plane4.w) | ||
+ | Pixels 32-47, row 0:(Plane1.w Plane2.w Plane3.w Plane4.w) | ||
+ | ...... | ||
+ | Pixels 304-319, row 199:(Plane1.w Plane2.w Plane3.w Plane4.w) | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | (To be refined in the future) | ||
=== Sound === | === Sound === | ||
Line 123: | Line 120: | ||
[http://beyondbrown.mooo.com/post/mona/ Here is a writeup to porting of Mona to the Atari ST], containing many hints. | [http://beyondbrown.mooo.com/post/mona/ Here is a writeup to porting of Mona to the Atari ST], containing many hints. | ||
− | Here are some | + | Here are some tiny intros with source code: |
{| class="wikitable" | {| class="wikitable" |
Revision as of 03:05, 19 June 2022
Contents
Atari ST
The Atari ST systems consists of the M68k system with custom hardware for graphics and sound.
Setting up
Setting up your development platform for the Atari ST systems is quite easy, first get the following tools:
- Assembler: VASM - This assembler is able to assemble directly to a TOS executable
- Assembler: RMAC - Can assemble to TOS executable as well as a headerless absolute binary
- Emulator(s): Hatari Make sure to use the original TOS 1.62 Image for best compatibility.
Compiling to a TOS image
Vasm -Ftos source.s -o source.tos
rmac -p -o source.tos source.s
ST executable format, and why you should write relocatable code
To be added
Video display
The Atari ST uses an interleaved planar memory layout to represent its paletted display modes (we'll concentrate on 320x200x16 colours here).
Setting a palette
The Atari ST uses index values into a palette of colours. Index 0 is the background colour (that's also used for the border) and a maximum of 16 colours can be defined and indexed. Palette format is a word per index with 3 nibbles for 4-bit RGB (e.g. $00f for blue). Here is some code that will help you setup a palette
pea paldata(pc)
move.w #6,-(sp)
trap #14
; Palette data
paldata:
dc.w $000,$100,$200,$311,$422,$533,$644,$755
dc.w $575,$464,$353,$242,$131,$020,$010,$000
Getting something on screen
One of the shortest ways to get you started with getting anything on screen at all, is to use the built-in Line-A routines. These are relatively easy to setup and allow you to plot pixels, hlines, lines, rects and even polygons. However, as can be expected these routines are very slow in execution.
;-----------------------
; Line-A Initialization
;-----------------------
; After calling this function, data register D0 and address register A0 point to a table ; with the starting address of the Line A variables.
; Address register A1 points to a table with the starting addresses for the three system ; font headers,
; and address register A2 points to a table that specifies the starting addresses of the; 15 Line A opcodes. There's no parameter required for this function, so all you have
; to do is call the word opcode label that you specified for the $A000 (Initialize)
; function.
dc.w $A000
movem.l (a0),a1-a4 ; A3=INTIN, A4=PTSIN
---------
frameloop:
move.w #200-1,d7 ; y
yLoop:
move.w #320-1,d6 ; x
xLoop:
; Putpixel
move.b d6,d0 ; d0=x
eor d7,d0 ; d0=x^y
lsr.b #2,d0 ; d0>>=4
and #42,d0 ; d0&42
move.w d0,(a3) ; a3=color(d0)
movem.w d6/d7,(a4) ; a4=x,y`
dc.w $A001 ; put pixel command
dbra d6,xLoop ; decrease and branch
dbra d7,yLoop
; Wait loop
bra frameloop ; .s *
Planes
Every plane contains one bit of a pixel's colour index value. The bits of the binary representation of a colour index like %1010 (% Bit3,Bit2,Bit1,Bit0) will end up in 4 different planes (bits most significant to least significant aka left to right): Plane4 Plane3 Plane2 Plane1.
So basicly Plane1 contains all of the Bit0s of all pixels, Plane2 all Bit1s, Plane3 all Bit2s and Plabe4 all Bit3s.
The first pixel on a plane is described by the leftmost (aka most significant) bit in a word, the second one by the second-leftmost etc. - just like this %0123456789abcdef with 0-f=pixels 1-16. %1000000000000000=$8000=pixel 1 in a plane word set. The 16th pixel will use the leftmost bit of the next word in this plane. etc.
Interleaved
16 pixels worth of data are represented as a full graphicword, meaning all information to display 16 pixels are stored together, followed by the data to represent the next 16 pixels etc. One row worth of display data has 20 graphicwords (20*16 pixels=320 pixels).
16 pixels are stored in 4 words - which contain 4 of the aforementioned planes.
So a 320x200x16 colour display is a contiuous memory buffer containing:
Pixels 0-15, row 0:(Plane1.w Plane2.w Plane3.w Plane4.w)
Pixels 16-31, row 0:(Plane1.w Plane2.w Plane3.w Plane4.w)
Pixels 32-47, row 0:(Plane1.w Plane2.w Plane3.w Plane4.w)
......
Pixels 304-319, row 199:(Plane1.w Plane2.w Plane3.w Plane4.w)
(To be refined in the future)
Sound
The Atari ST systems use the YM2149 chip to generate sound.\
For more information check out https://www.atarimagazines.com/v4n7/stsound.html
Make some noise
To be added soon.
Additional Resources
Sizecoding on the Atari ST is not very huge yet, so resources are sparse.
Here is a writeup to porting of Mona to the Atari ST, containing many hints.
Here are some tiny intros with source code:
And some for the Atari Falcon