MESS OUT: Difference between revisions
(Created page with "=MESS_OUT ($C004CE): Generic VRAM output= MESS_OUT executes the command buffer in the BIOS's work RAM that starts at '''MESS_BUFFER''' (constant $10FF00) and goes up ...") |
No edit summary |
||
Line 8: | Line 8: | ||
Commands are always words. | Commands are always words. | ||
==Command 0== | |||
*1 word | |||
End of actual command list. | |||
==Command 1== | ==Command 1== | ||
Line 26: | Line 30: | ||
Examples: | Examples: | ||
<pre> | <pre> | ||
dc.w $0001,$15FF ; | dc.w $0001,$15FF ;Data will be read in bytes, upper byte will always be $15, end code is $FF. | ||
dc.w $0101,$1520 ; | dc.w $0101,$1520 ;Data will be read in bytes, upper byte will always be $15, data length is $20. | ||
dc.w $0201,$8000 ; | dc.w $0201,$8000 ;Data will be read in words, end code is $8000. | ||
dc.w $0301,$2044 ; | dc.w $0301,$2044 ;Data will be read in words, data length is $2044. | ||
</pre> | </pre> | ||
Line 39: | Line 43: | ||
Sets the auto-increment value (written to '''VRAM_MOD''' ($3C0004)). Is the value sign-extended or not ? | Sets the auto-increment value (written to '''VRAM_MOD''' ($3C0004)). Is the value sign-extended or not ? | ||
<pre> | |||
dc.w $2002 ;Set auto-inc to $20 | |||
</pre> | |||
==Command 3== | ==Command 3== | ||
*2 words | *2 words | ||
Sets the VRAM address written to '''VRAM_ADDR''' ($3C0000)) to the next word's value. | Sets the VRAM address written to '''VRAM_ADDR''' ($3C0000)) to the next word's value. | ||
<pre> | |||
dc.w $0003,$7201 ;Set VRAM address to $7201 | |||
</pre> | |||
==Command 4== | ==Command 4== | ||
*3 words | |||
Sets the output data address to the next longword. Actual writes to VRAM are done with this command. | |||
<pre> | |||
dc.w $0004 | |||
dc.l MESSAGE | |||
</pre> | |||
==Command 5== | |||
*2 words | |||
Add the next word to the current VRAM address. (This is different from command 2). Useful to skip lines or spaces. | |||
<pre> | |||
dc.w $0005,$001F ;Add $1F to the current VRAM address | |||
</pre> | |||
==Command 6== | |||
*1 word | |||
Resume data output (instead of using command 4 again, keep going from the last address). | |||
==Command 7== | |||
*at least 2 words | |||
Directly define the data (instead of using command 4 to point to it). Don't forget the padding byte if the data ends on an odd address. | |||
<pre> | |||
dc.w $0007 | |||
dc.b $30,$31,$34,$45,$FF | |||
dc.b $00 ;Pad byte | |||
</pre> | |||
==Command 8== | |||
*at least 2 words | |||
{{16BitRegister|Upper data byte (fontset number)|8|$08|8}} | |||
Writes with the 8*16 pixels fix font. The commands upper byte will be the data's constant upper byte. The next bytes are data, and the end code is $FF. | |||
The auto-inc is automaticaly set to $20. | |||
<pre> | |||
dc.w $0108 ;Tileset 1 | |||
dc.b $44,$51 ;Data | |||
dc.b $FF ;End code | |||
dc.b $00 ;Pad byte | |||
</pre> | |||
==Command 9== | |||
Same as command 9 but for japanese characters. | |||
==Command A== | |||
*3 words | |||
Call sub command list. The next longword is a pointer to another command list. Return has to be made using command B. | |||
<pre> | |||
dc.w $000A | |||
dc.l SUBLIST | |||
</pre> | |||
==Command B== | |||
*1 word | |||
Return to calling command list. | |||
==Command C== | |||
*2 words | |||
Repeat output. The upper byte of the command is the number of times to output the next word. | |||
<pre> | |||
dc.w $090C,$0147 ;Outputs $0147 9 times | |||
</pre> | |||
==Command D== | |||
*2 words | |||
Repeat and increment output. The upper byte of the command is the number of times to output the next word. The lower byte of the data is incremented each time. | |||
<pre> | |||
dc.w $040D,$42FE ;Outputs $42FE,$42FF,$4200,$4201 | |||
</pre> | |||
=Examples= | |||
<pre> | |||
bset.b #0,MESS_BUSY | |||
movea.l MESS_POINT,a0 ;Get current pointer in buffer | |||
move.l #0,(a0)+ ;Direct commands | |||
move.w #3,(a0)+ ;Set VRAM address to $7318 | |||
move.w #$7318,(a0)+ | |||
move.w #$0301,(a0)+ ;Words, size = 1 | |||
move.w #$0001,(a0)+ | |||
move.w #$0007,(a0)+ ;Output 7 | |||
move.w #0,(a0)+ ;End of this list | |||
move.l MESSAGE1,(a0)+ ;Pointer to list in ROM | |||
move.l a0,MESS_POINT ;Update pointer | |||
bclr.b #0,MESS_BUSY ;Ready to go | |||
MESSAGE1: | |||
dc.w $0001 ;Bytes, upper = $00, end code = $FF | |||
dc.w $00FF | |||
dc.w $2002 ;Auto-inc = $20 | |||
dc.w $0003 ;VRAM address = $7024 | |||
dc.w $7024 | |||
dc.w $0004 ;Write "MESSAGE1" | |||
dc.l MS1 | |||
dc.w $0005 ;Next line | |||
dc.w $0001 | |||
dc.w $0006 ;Resume, write "MESSAGE2" | |||
dc.w $0005 ;Next line | |||
dc.w $0001 | |||
dc.w $0007 ;Direct data output | |||
dc.w 'MESSAGE3' | |||
dc.b $FF ;End code | |||
dc.b $00 ;Pad byte | |||
dc.w $0005 ;Next line | |||
dc.w $0001 | |||
dc.w $0108 ;8x16 write, fontset 1 | |||
dc.w 'ABCDE',$FF | |||
dc.w $0005 ;Next line | |||
dc.w $0001 | |||
dc.w $0109 ;8x16 write, fontset 1 | |||
dc.w 0,1,2,3,4,$FF | |||
dc.w $000A ;Sub list calls | |||
dc.l SUB_MESS | |||
dc.w $000A | |||
dc.l SUB_MESS | |||
dc.w $000A | |||
dc.l SUB_MESS | |||
dc.w $0000 | |||
MS1: | |||
dc.b "MESSAGE1",$FF | |||
dc.b "MESSAGE2",$FF | |||
SUB_MESS: | |||
dc.w $280C ;Outputs $0020 $28 times | |||
dc.w $0020 | |||
dc.w $100D ;Outputs $0500 $10 times with inc | |||
dc.w $0500 | |||
dc.w $000B ;Return | |||
</pre> |
Revision as of 15:16, 5 July 2011
MESS_OUT ($C004CE): Generic VRAM output
MESS_OUT executes the command buffer in the BIOS's work RAM that starts at MESS_BUFFER (constant $10FF00) and goes up to MESS_POINT (longword variable $10FDBE). This can be used to display text messages, boxes... on the fix layer (is it used for sprites too ?).
MESS_OUT is automatically called in the SYSTEM_INT1 call. MESS_BUSY ($10FDC2.b) can be used to prevent this (when setting up the command list, for example).
The command buffer can be made of commands directly, or pointers to lists in ROM or user RAM. To put commands directly into the buffer, a null pointer ($00.l) needs to be placed before the command list.
Commands are always words.
Command 0
- 1 word
End of actual command list.
Command 1
- 2 words
Bit | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Def | 0 | Byte/Word | End code/Data size | $01 |
This command specifies if the data will be in bytes or words, and if the size is defined or if an end code has to be reached.
- If data is in bytes (bit 10 = 0)
- The next word's upper byte will be the data's constant upper byte (since VRAM can only be written in words).
- If the data is limited by an end code (bit 9 = 0), the next word's lower byte will be the end code's value.
- If the data size is defined (bit 9 = 1), the next word's lower byte will be the size (so max length is $FF).
- If data is in words (bit 10 = 1)
- If the data is limited by an end code (bit 9 = 0), the next word will be the end code's value.
- If the data size is defined (bit 9 = 1), the next word will be the size (so max length is $FFFF).
Examples:
dc.w $0001,$15FF ;Data will be read in bytes, upper byte will always be $15, end code is $FF. dc.w $0101,$1520 ;Data will be read in bytes, upper byte will always be $15, data length is $20. dc.w $0201,$8000 ;Data will be read in words, end code is $8000. dc.w $0301,$2044 ;Data will be read in words, data length is $2044.
The format stays the same until command 1 is used again.
Command 2
- 1 word
Bit | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Def | Auto-inc value | $02 |
Sets the auto-increment value (written to VRAM_MOD ($3C0004)). Is the value sign-extended or not ?
dc.w $2002 ;Set auto-inc to $20
Command 3
- 2 words
Sets the VRAM address written to VRAM_ADDR ($3C0000)) to the next word's value.
dc.w $0003,$7201 ;Set VRAM address to $7201
Command 4
- 3 words
Sets the output data address to the next longword. Actual writes to VRAM are done with this command.
dc.w $0004 dc.l MESSAGE
Command 5
- 2 words
Add the next word to the current VRAM address. (This is different from command 2). Useful to skip lines or spaces.
dc.w $0005,$001F ;Add $1F to the current VRAM address
Command 6
- 1 word
Resume data output (instead of using command 4 again, keep going from the last address).
Command 7
- at least 2 words
Directly define the data (instead of using command 4 to point to it). Don't forget the padding byte if the data ends on an odd address.
dc.w $0007 dc.b $30,$31,$34,$45,$FF dc.b $00 ;Pad byte
Command 8
- at least 2 words
Bit | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Def | Upper data byte (fontset number) | $08 |
Writes with the 8*16 pixels fix font. The commands upper byte will be the data's constant upper byte. The next bytes are data, and the end code is $FF.
The auto-inc is automaticaly set to $20.
dc.w $0108 ;Tileset 1 dc.b $44,$51 ;Data dc.b $FF ;End code dc.b $00 ;Pad byte
Command 9
Same as command 9 but for japanese characters.
Command A
- 3 words
Call sub command list. The next longword is a pointer to another command list. Return has to be made using command B.
dc.w $000A dc.l SUBLIST
Command B
- 1 word
Return to calling command list.
Command C
- 2 words
Repeat output. The upper byte of the command is the number of times to output the next word.
dc.w $090C,$0147 ;Outputs $0147 9 times
Command D
- 2 words
Repeat and increment output. The upper byte of the command is the number of times to output the next word. The lower byte of the data is incremented each time.
dc.w $040D,$42FE ;Outputs $42FE,$42FF,$4200,$4201
Examples
bset.b #0,MESS_BUSY movea.l MESS_POINT,a0 ;Get current pointer in buffer move.l #0,(a0)+ ;Direct commands move.w #3,(a0)+ ;Set VRAM address to $7318 move.w #$7318,(a0)+ move.w #$0301,(a0)+ ;Words, size = 1 move.w #$0001,(a0)+ move.w #$0007,(a0)+ ;Output 7 move.w #0,(a0)+ ;End of this list move.l MESSAGE1,(a0)+ ;Pointer to list in ROM move.l a0,MESS_POINT ;Update pointer bclr.b #0,MESS_BUSY ;Ready to go MESSAGE1: dc.w $0001 ;Bytes, upper = $00, end code = $FF dc.w $00FF dc.w $2002 ;Auto-inc = $20 dc.w $0003 ;VRAM address = $7024 dc.w $7024 dc.w $0004 ;Write "MESSAGE1" dc.l MS1 dc.w $0005 ;Next line dc.w $0001 dc.w $0006 ;Resume, write "MESSAGE2" dc.w $0005 ;Next line dc.w $0001 dc.w $0007 ;Direct data output dc.w 'MESSAGE3' dc.b $FF ;End code dc.b $00 ;Pad byte dc.w $0005 ;Next line dc.w $0001 dc.w $0108 ;8x16 write, fontset 1 dc.w 'ABCDE',$FF dc.w $0005 ;Next line dc.w $0001 dc.w $0109 ;8x16 write, fontset 1 dc.w 0,1,2,3,4,$FF dc.w $000A ;Sub list calls dc.l SUB_MESS dc.w $000A dc.l SUB_MESS dc.w $000A dc.l SUB_MESS dc.w $0000 MS1: dc.b "MESSAGE1",$FF dc.b "MESSAGE2",$FF SUB_MESS: dc.w $280C ;Outputs $0020 $28 times dc.w $0020 dc.w $100D ;Outputs $0500 $10 times with inc dc.w $0500 dc.w $000B ;Return