Other Miscellaneous Useful Tit-bits: Difference between revisions
Jump to navigation
Jump to search
>Silver Surfer m (Added category) |
>Wongck No edit summary |
||
| Line 1: | Line 1: | ||
<font color="red" size="4">'''TRANSFERRED TO LIVE WIKI'''</font><br /> | |||
<pre> | <pre> | ||
Revision as of 05:41, 30 August 2011
TRANSFERRED TO LIVE WIKI
Assembly Language, in Devpac, Tutorial
by
John Cove (Tronic of Effect)
for
ICTARI
Series 1, Part 2, Other Miscellaneous Useful Tit-bits
In this part I will cover very simple routines, just so I can then
move onto the more difficult routines.
I will cover resolution, hertz changing, loops and picture displaying.
_________________________
Section 1.1 - Resolutions
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
Right, first of all you need to know the register that deals with
resolution!! This register is the $ffff8260 register. There are
many different ways to alter the resolution, I will show you two.
___________________________________________
Section 1.11 - Using the $ffff8260 register
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
First of all, it is best to alter the resolution after one vbl cycle
is complete otherwise, you may experience a distorted screen, so here
is a simple routine to achieve this:-
move.w #37,-(sp) ... line 1
trap #14 ... line 2
addq.l #2,sp ... line 3
move.b #?,$ffff8260 ... line 4
Explanation
ÿÿÿÿÿÿÿÿÿÿÿ
Lines 1 to 3 are the v_sync routine, otherwise known as the vbl
synchronisation routine.
Line 4 is altering the resolution value. Here is the table of what the
question mark represents:-
0 - low resolution
1 - medium resolution
2 - high resolution
So, if you wanted to alter the resolution to low, then you would
write the following routine:-
move.w #37,-(sp) ... line 1
trap #14 ... line 2
addq.l #2,sp ... line 3
move.b #0,$ffff8260 ... line 4
Here is another way of altering the resolution, just for your
information and so I cover resolution completely.
Before I continue, note well...Do not try and set the resolution to
high on a colour output!!! It won't work, unless you are using
overscan techniques!!!!!
Here's that other routine:-
move #?,-(sp) ... line 1
pea -1.w ... line 2
pea -1.w ... line 3
move #5,-(sp) ... line 4
trap #14 ... line 5
lea 12(sp),sp ... line 6
Explanation
ÿÿÿÿÿÿÿÿÿÿÿ
Line 1 sets the resolution value, so see the above table for the
value, and bear in mind that IT IS ALWAYS THE SAME!!!
Lines 2 to 6 are the system bits to implement the resolution change!!
___________________
Section 2.1 - Hertz
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
This is another very easy routine. Again all you really need to know
is the register you are going to play with!! The register is
$ffff820a!!!
Here is a table of values you have to use to alter the hertz:-
50 Hertz - 2
60 Hertz - 0
and you implement it in the following way:-
move.b #0,$ffff820a
The above line will set the hertz to 60, and if you do not have a
monitor or a 60 hertz output device, the screen will look like it is
very ill, basically it will look and sound very bad!!!
If you want to "flash" the hertz to make a wicked effect, used by
myself, STAX and most other coders, then here is the source code, try
it out!!!
*************
program start
*************
move.b #0,$ffff820a.w
jsr v_sync
move.b #2,$ffff820a.w
jsr v_sync
move.b #0,$ffff820a.w
jsr v_sync
move.b #2,$ffff820a.w
***********
program end
***********
v_sync movem.l d0-d7/a0-a7,-(sp)
move.w #$25,-(sp)
trap #14
addq.l #2,sp
movem.l (sp)+,d0-d7/a0-a7
rts
There's a wicked effect if you use it, please credit me!!! The code
will only work in supervisor mode, so if you are not sure, refer to
Series 1, Part 1 to make sure!! Though, you should not really be
here if you have not got the basics perfected!!!
N.B. When compiling, the labels (for example, in the above program,
the label is "v_sync") this MUST be at the beginning of
the line, otherwise you WILL get an error!!!
___________________
Section 3.1 - Loops
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
Loops, a very important part of any program!!!
Here is a key loop program.....remember I am trying to make these
articles as easy to read as possible, so do not complain if I get
straight into the facts instead of faffing around the
topic........okay!!!! (Rough justice, Rough LAW!)
key_loop jsr v_sync ... line 1
cmp.b #$39,$fffffc02.w ... line 2
bne.w key_loop ... line 3
Explanation
ÿÿÿÿÿÿÿÿÿÿÿ
Line 1 - This has a few components to it, first of all you need a
label to call when the condition, in Line 3, is not met, and it is
also a good idea to have a v_sync in THIS kind of loop, basically so
you do not overload the keyboard buffer ($114.w - keyboard vector).
The v_sync routine is the same as in Section 2.1.
Line 2 - This is the cOmpARE condition. Basically it is comparing the
keyboard buffer to the value #$39, which is the space bar. The
$fffffc02.w is the keyboard handler. So, you are comparing $39 with
the keyboard buffer which will be true when you have pressed space
bar!! The compare statement must be conditioned as a "byte", ie. a
".b", not a ".w" etc, because this will never match the hex #$39!!!
Line 3 - If the cOmpARE condition is not true then it will branch to
the key_loop label. BNE is the mnemonic for Branch Not Equal, just
like CMP means COMPARE!! Lovely jubbly!!!
Here is another loop, using addition:-
*************
program start
*************
add_loop add.w #1,counter ... line 1
cmp.w #1000,counter ... line 2
bne.w add_loop ... line 3
***********
program end
***********
counter dc.w 0 ... line 4
Remember what I was saying that you have the same declaration!!! I.e.
the ".w", if you are using an "add.w" to a declared store, then you
must declare the store as a "dc.w" and you must make all compares and
mathematics use the ".w" declaration, DO NOT MIX THE DECLARATIONS!!!!
You program simply won't work!!!
Explanation
ÿÿÿÿÿÿÿÿÿÿÿ
Line 1 - Again, you need a label to call if the condition is not met!!
This line also adds 1 to the value in counter, which at the beginning
is 0.
Line 2 - This compares the value in counter with 1000.
Line 3 - This compares whether the condition, in the previous line,
was met and if it was then the loop has ended and the program will
continue on its course, past the loop. If the condition is not met
then it will simply return to the label "add_loop".
______________________________________________________
Section 4.1 - Displaying pictures of different formats
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
Time for a break to watch Eastenders, I think.........I will be back
on this wonderful tour into the ST very soon....."Red alert....I've
got mine!!!".....
________________________________________________
Section 4.11 - Displaying a Degas Elite picture.
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
Here is a complete, and working, routine to display a Degas picture.
clr.l -(sp) ... line 1
move #$20,-(sp) ... line 2
trap #1 ... line 3
addq.l #6,sp ... line 4
jsr v_sync ... line 5
move.b #0,$ff8260 ... line 6
lea pic+34,a0 ... line 7
move.l $44e,a1 ... line 8
move #(32000/4)-1,d0 ... line 9
copypic move.l (a0)+,(a1)+ ... line 10
dbra d0,copypic ... line 11
movem.l pic+2,d0-d7 ... line 12
movem.l d0-7,$ff8240 ... line 13
move #7,-(sp) ... line 14
trap #1 ... line 15
addq.l #2,sp ... line 16
jsr v_sync ... line 17
move.b #1,$ff8260 ... line 18
clr.w -(sp) ... line 19
trap #1 ... line 20
pic incbin degas.pi1 ... line 21
____________________________
The rather LARGE explanation
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
Lines 1 to 4 - This opens the supervisor mode.
Line 5 - This waits until a vbl cycle is complete.
Line 6 - This alters the screen mode to low resolution, as a PI1
picture file will only display correctly in low resolution, a PI2
picture file will only display correctly in medium resolution
and a PI3 picture file will only display correctly in high
resolution.
Line 7 - This points to the picture data in the picture file & moves
the contents into the data register, a0. The processor knows when
it has reached the end of the picture data because after the file
is loaded, a pointer is placed, in memory, at the end of the
picture data and the data will stop being loaded into the register
a0. The actual picture data starts at the offset +34, or the
seventeenth byte in the file.
Line 8 - The logic screen address is stored at address $44e. So all
that is happening is the screen address, the final destination of
the picture data, is being copied into the register a1.
Line 9 - The actual number of bytes that the picture data takes
up is 32000, which is also the same as the standard sized ST Low
resolution screen. So, you are loading that number of bytes, 32000,
into the register d0.
Line 10 - This serves a few functions. First a label, because
you will be performing a conditional loop on Line 11, and this is
where you will jump to. The second is the moving of the data in
a0 and literally moving it onto the screen. The plus symbol
after the (a0) register, and (a1),is simply telling the computer to
take the next part of picture data, and so on!!
Line 11 - This is a condition, and when all the picture has been
displayed, this is when the condition is met, and basically, when you
jump back to the loop, the pointer of the picture data will be
implemented by one and in EFFECT will jump to the next byte of the
picture data, to be displayed. God that was DIFFICULT to explain...
Line 12 - This is implementing the palette, from the picture
data, on the screen. The palette is also contained within the picture
file, at the offset of +2. So, the data starts at the second byte in
the file. The palette data uses 16 bytes and is picked up in registers
d0-d7.
Line 13 - This puts the palette values, from the picture file,
in d0-d7 and implements it onto the screen.
Line 14 to 16 - This waits for the user to press any key, before it
continues.
Line 17 - This waits until a vbl cycle is complete.
Line 18 - This sets the screen mode to medium resolution, really
used for the returning to GENst.
Line 19 to 20 - This is the standard exit routine, out of supervisor
mode.
Line 21 - This is the incLUDE binARY command, that loads a file
from the disk and is then present at that label.
In the next part we will look at how to display a Neochrome
picture and the different structures of the picture formats....watch
out man!!
----------------------------------------------------------------------
Tronic of Effect, aka John Cove, [C]opyright 1995 .. Started: 14-11-
1995. Finished: 14-11-1995
"I reserve the right to publish these tutorial series
wherever i choose... Only, with express written
confirmation, is this to be published by anyone
other than myself. These series were written for
st world, but if i feel that the series is not being
taken advantage of in the way that most st users are
able to read the series, then i will publish the
series in my own, and other peoples, disk magazines
and products."
Back to ASM_Tutorial