7139 lines
329 KiB
Plaintext
7139 lines
329 KiB
Plaintext
|
||
########
|
||
##################
|
||
###### ######
|
||
#####
|
||
##### #### #### ## ##### #### #### #### #### #### #####
|
||
##### ## ## #### ## ## ## ### ## #### ## ## ##
|
||
##### ######## ## ## ## ##### ## ## ## ## ##
|
||
##### ## ## ######## ## ## ## ### ## ## #### ## ##
|
||
##### #### #### #### #### ##### #### #### #### #### #### ######
|
||
##### ##
|
||
###### ###### Issue #18
|
||
################## July 3, 1999
|
||
########
|
||
|
||
|
||
...............................................................................
|
||
|
||
Time flies like the wind; fruit flies like a banana.
|
||
|
||
|
||
"Yet if the only form of tradition, of handing down, consisted in
|
||
following the ways of the immediate generation before us in a
|
||
blind or timid adherence to its successes, 'tradition' should be
|
||
positively discouraged. We have seen many such simple currents
|
||
lost in the sand; and novelty is better than repetition. [Tradition]
|
||
cannot be inherited, and if you want it you must obtain it by great
|
||
labor."
|
||
T. S. Eliot, "Tradition and the Individual Talent"
|
||
|
||
...............................................................................
|
||
|
||
BSOUT
|
||
|
||
Tradition. C=Hacking is a magazine of considerable tradition, a
|
||
tradition that is not merely imitating the successes of previous generations.
|
||
C=Hacking has a tradition of true excellence, and once again, great people
|
||
have contributed their time and talents towards the 64 community, and another
|
||
fine issue of C=Hacking. And once again, innovative ideas have grown and
|
||
borne delectable fruits for those seated at the C=Hacking table. And once
|
||
again, in keeping with one of C=Hacking's most hallowed traditions, the
|
||
issue is really, really late.
|
||
|
||
A new job, a new move, a new house, a new puppy -- what can I say?
|
||
This real world stuff takes some getting used to, and so this issue is
|
||
even later than usual. On the plus side, I think you'll find it worth
|
||
the wait (at least, I hope so!).
|
||
|
||
A lot has happened in the C= world since the last issue of C=Hacking.
|
||
At the personal level, all my moves and uphevals have led to a few changes.
|
||
Now that I'm fabulously wealthy (compared to my old graduate student salary,
|
||
I am fabulously wealthy), I splurged on a custom domain name. The Fridge
|
||
is now located at http://www.ffd2.com, and thus the Official Unofficial
|
||
C=Hacking Homepage is now located at
|
||
|
||
http://www.ffd2.com/fridge/chacking/
|
||
|
||
And in the "well, it's news to me" department:
|
||
|
||
- SuperCPU acitivty seems to be picking up steam, at long last.
|
||
The giga.or.at scpu mail list recently revived itself, and several
|
||
new projects and web pages have appeared.
|
||
|
||
Moreover, 65816 assemblers have finally started to appear.
|
||
El Cheapo Assembler (CheapAss), for SuperCPU-equipped 64s,
|
||
is available in the Fridge. A new cross-assembler, ACME, is
|
||
being worked on. And a *third* project, Virtualass816, is said
|
||
to be underway.
|
||
|
||
In addition to the assemblers, there is an 816 backend to LCC,
|
||
some new operating system projects (e.g. JOS), rumors of games,
|
||
game fixes (including a Flight Simulator patch by Maurice Randall),
|
||
and more.
|
||
|
||
http://come.to/supercpu is a good place to learn more about new SCPU
|
||
developments.
|
||
|
||
- There will be an English version of GO64! magazine, starting with the
|
||
August issue, available by subscription. For more information, visit
|
||
http://www.go64.c64.org
|
||
|
||
- The annual Chicago Expo will take place in -- amazingly enough --
|
||
Chicago, on September 25. Last year was a hoot and hopefully
|
||
our group will be there again this year. For more details,
|
||
http://members.aol.com/~rgharris/swrap.html will surely contain
|
||
info as the date draws near.
|
||
|
||
- Justin Beck, a dj at station KDVS, in Davis, CA, runs a SID radio
|
||
show every tuesday night at 8PM Pacific time. You can tune in at
|
||
90.3 in the Davis/Sacramento area, or the webcast at
|
||
http://www.kdvs.org. For more information, write jrbeck@ucdavis.edu;
|
||
actually, write him anyways, to tell him how cool the show is!
|
||
|
||
- CBM FIDO echos are available at several places on the web
|
||
these days -- http://cereal.mv.com is a pretty popular source.
|
||
|
||
- Craig Bruce has been placing old issues of the Transactor online at
|
||
|
||
http://www.pobox.com/~csbruce/commodore/transactor/
|
||
|
||
Well worth a visit.
|
||
|
||
- Another unzip program has appeared, by Pasi Ojala. Visit his homepage
|
||
|
||
http://www.cs.tut.fi/~albert/
|
||
|
||
for more details.
|
||
|
||
- Richard Atkinson <rga24@hermes.cam.ac.uk> has drawn up schematics
|
||
of the Commodore Sound Expander, a Yamaha-chip-based cartridge.
|
||
For more info, email Richard! (And maybe look in a future issue
|
||
of C=Hacking??? :)
|
||
|
||
|
||
This weekend, here in the states, we are celebrating our independence
|
||
(I think the Canadians tried to invade us once, or something...). I can't
|
||
help but reflect that the Commodore 8-bits also represent a kind of
|
||
independence. As the above (and the below) amply demonstrates, that
|
||
independent spirit is alive and thriving, a fact that is not only remarkable,
|
||
but even perhaps worth celebrating.
|
||
|
||
Enjoy the issue!
|
||
|
||
-S
|
||
.......
|
||
....
|
||
..
|
||
. C=H 18
|
||
|
||
::::::::::::::::::::::::::::::::::: Contents ::::::::::::::::::::::::::::::::::
|
||
|
||
BSOUT
|
||
o Voluminous ruminations from your unfettered editor.
|
||
|
||
|
||
Jiffies
|
||
o Maybe next time!
|
||
|
||
|
||
The C=Hallenge
|
||
|
||
o Yet again, no C=Hallenge, sigh...
|
||
|
||
|
||
Side Hacking
|
||
|
||
o Data Structures 101: Linked Lists
|
||
|
||
DS101 is a new article series. The idea is to review different
|
||
data structures, with examples of their use in 64 programming.
|
||
|
||
This installment covers linked lists, and how to use them to
|
||
make a zippy insertion sort with almost zero overhead.
|
||
|
||
o Counting Sort, by Pasi Ojala
|
||
|
||
And, since we're on the subject of sorting algorithms, Pasi
|
||
wrote up the counting sort. What's a counting sort? Well,
|
||
read the article!
|
||
|
||
|
||
Main Articles
|
||
|
||
o "VIC-20 Kernel ROM Disassembly Project", by Richard Cini
|
||
<rcini@msn.com>
|
||
|
||
This installment covers interrupts -- IRQ and NMI sources,
|
||
the kernal handler code.
|
||
|
||
o "A Diehard Programmer's Introduction to GEOS, and geoWrite
|
||
Disassembly Notes", by Todd S. Elliott <Eyethian@juno.com>
|
||
|
||
As part of his effort to learn about GEOS programming, Todd
|
||
disassembled geoWrite 128, and patched it to be more accepting
|
||
of new devices and such. This article summarizes that adventure --
|
||
the results and the lessons learned.
|
||
|
||
o Masters Class: "NTSC/PAL fixing: FLI", by Russell Reed
|
||
<rreed@egypt.org>, Robin Harbron <macbeth@tbaytel.net>, and S. Judd.
|
||
|
||
This time around the subject is FLI and IFLI graphics, and
|
||
a tutorial on fixing them. Several pictures are provided for
|
||
the reader to fix, in the included .zip file.
|
||
|
||
o "Obj3d: The 3D object library", by S. Judd <sjudd@ffd2.com>
|
||
|
||
Obj3d is a set of routines for creating, manipulating, and displaying
|
||
3D worlds on the 64. It consists of routines to add and remove
|
||
objects, move and rotate objects, render the display, and so on,
|
||
and hence vastly simplifies the creation of 3D programs.
|
||
|
||
This article actually consists of three articles. The first article
|
||
describes the library, and walks through a simple example program.
|
||
|
||
The second article is the "programmer's guide", containing memory
|
||
maps and a list of all the routines.
|
||
|
||
The third article discusses "stroids", a more advanced example
|
||
program in which a space ship can fly around a randomly drifting
|
||
asteroid field, to demonstrate that sophisticated programs can be
|
||
written with only a few hundred lines of code. The program is
|
||
purposely left incomplete -- it's up to you to finish it up!
|
||
|
||
We had hoped to include a "3D Object Editor", written by Mark
|
||
Seelye, but it wasn't quite done yet -- next issue!
|
||
|
||
Source code and binaries are included at the end of the issue.
|
||
|
||
|
||
.................................. Credits ...................................
|
||
|
||
Editor, The Big Kahuna, The Car'a'carn..... Stephen L. Judd
|
||
C=Hacking logo by.......................... Mark Lawrence
|
||
|
||
For information on the mailing list, ftp and web sites, send some email
|
||
to chacking-info@jbrain.com.
|
||
|
||
Legal disclaimer:
|
||
1) If you screw it up it's your own fault!
|
||
2) If you use someone's stuff without permission you're a serious dork!
|
||
|
||
About the authors:
|
||
|
||
Todd Elliot is 30 years old, working as a Community Client Advisor
|
||
for the Center On Deafness - Inland Empire, working with deaf people in
|
||
the local communities. He got his first 64 in December 1983, using it
|
||
for games, BBS activities, and dabbling in programming. Nowadays Todd
|
||
focuses on ML programming, and his latest project is an AVI movie player
|
||
for the SuperCPU. Todd is a huge fan of sports and the Miami Dolphins in
|
||
particular, and enjoys writing articles and watching movies. At the 1998
|
||
Chicago Expo Todd enjoyed meeting all those people who were previously
|
||
a name and an email address; according to Todd, "The Chicago Expo truly
|
||
embodies what is going on with today's CBM community."
|
||
|
||
Richard Cini is a 31 year old vice president of Congress Financial
|
||
Corporation, and first became involved with Commodore 8-bits in 1981, when
|
||
his parents bought him a VIC-20 as a birthday present. Mostly he used it
|
||
for general BASIC programming, with some ML later on, for projects such as
|
||
controlling the lawn sprinkler system, and for a text-to-speech synthesyzer.
|
||
All his CBM stuff is packed up right now, along with his other "classic"
|
||
computers, including a PDP11/34 and a KIM-1. In addition to collecting
|
||
old computers Richard enjoys gardening, golf, and recently has gotten
|
||
interested in robotics. As to the C= community, he feels that it
|
||
is unique in being fiercely loyal without being evangelical, unlike
|
||
some other communities, while being extremely creative in making the
|
||
best use out of the 64.
|
||
|
||
Pasi 'Albert' Ojala is a 29 year old software engineer, currently
|
||
working at a VLSI design company on a RISC DSP core C compiler.
|
||
Around 1984 a friend introduced him to the VIC-20, and a couple
|
||
of years later he bought a 64+1541 to replace a broken Spectrum48K.
|
||
He began writing his own BBS, using ML routines for speed, and
|
||
later wrote a series of demos under the Pu-239 label. In addition
|
||
to pucrunch and his many C=Hacking articles, Pasi's most recent project
|
||
is an "unzip" program for the 64. Pasi is also a huge Babylon-5 fan, and
|
||
has a B5 quote page at http://www.cs.tut.fi/~albert/Quotes/B5-quotes.html
|
||
|
||
Robin Harbron is a 26 year old internet tech support at a local
|
||
independent phone company. He first got involved with C= 8-bits
|
||
in 1980, playing with school PETs, and in 1983 his parents convinced
|
||
him to spend the extra money on a C64 instead of getting a VIC-20.
|
||
Like most of us he played a lot of games, typed in games out of
|
||
magazines, and tried to write his own games. Now he writes demos,
|
||
dabbles with Internet stuff, writes C= magazine articles, and, yes,
|
||
plays games. He is currently working on a few demos and a few games,
|
||
as well as the "in-progress-but-sometimes-stalled-for-a-real-long-time-
|
||
until-inspiration-hits-again Internet stuff". He is also working on
|
||
raising a family, and enjoys music (particularly playing bass and guitar),
|
||
church, ice hockey and cricket, and classic video games.
|
||
|
||
|
||
.................................. Jiffies ...................................
|
||
|
||
Blah.
|
||
|
||
............................... The C=Hallenge ...............................
|
||
|
||
Bleah.
|
||
|
||
................................ Side Hacking ................................
|
||
|
||
|
||
Data Structures 101 -- Linked lists and a nifty sorting algorithm
|
||
-------------------
|
||
by S. Judd and Pasi Ojala --
|
||
|
||
Every computer science major has taken a class in data structures.
|
||
The 64 programming world, however, is full of non-CS majors. Data structures
|
||
are such useful tools for programmers to have in their toolbox that I thought
|
||
it would be a worthwhile thing to have various people periodically review
|
||
different types of data structures, and common algorithms which make use
|
||
of them, and their relevance to an 8-bit CBM.
|
||
What is a data structure? Perhaps a reasonable definition is that
|
||
it is an abstract method of storing and retrieving data. These abstractions
|
||
may then be implemented on the computer, to solve different types of problems.
|
||
Whereas no single data structure is ideal for all problems, often a given
|
||
problem has a data structure ideally suited for it. The "optimal" data
|
||
structure for a given problem depends heavily upon what kind of data is
|
||
stored, and how it is stored, retrieved, or otherwise manipulated.
|
||
|
||
(On a more humorous note, /dev/null is ideal for storing information
|
||
provided you don't need to retrieve it, ever -- this probably doesn't
|
||
count as a data structure, though).
|
||
|
||
A simple example of a data structure is an array: abstractly, it
|
||
stores and retrieves data by means of an index value, e.g. A$(I). On the
|
||
computer it might be implemented in many different ways, depending on the
|
||
type of data stored (integers, strings, floating point, custom records, etc.),
|
||
the dimension of the array, the computer hardware, and even whether the index
|
||
is e.g. an integer or a string. So it is worthwhile to distinguish the
|
||
abstract concept of an "array" from its actual implementation.
|
||
|
||
Another type of useful data structure is a linked list. Imagine
|
||
attaching a pointer to some chunk of data (usually called a "node"). This
|
||
pointer can then point, or link, to another chunk of data -- the next node
|
||
in the list. This can be schematically illustrated as:
|
||
|
||
+---+ +---+ +---+ +---+ +---+
|
||
| 3 |---->| 1 |---->| 4 |---->| 5 |---->| 9 |----> ...
|
||
+---+ +---+ +---+ +---+ +---+
|
||
|
||
Here each node contains some data (a number) and a pointer to the next node.
|
||
Starting from the first node -- called the "head" of the list -- a program
|
||
can reach every other node by following the pointers. This is the basic
|
||
idea of a linked list.
|
||
Linked lists are used all over the place in the 64. BASIC programs
|
||
are a type of linked list. Each line of a basic program is stored as
|
||
a line link, then a line number and the data. The link points to the next
|
||
line in the program. Having links speeds up BASIC programs (imagine
|
||
finding and counting the ends of each line for every GOTO or GOSUB), and
|
||
links are useful because each program line can be of different size
|
||
(imagine storing a program in something like an array). The end of the
|
||
list is specified with a line link of 00.
|
||
A better example is the DOS. Every 256-byte sector on a disk
|
||
drive starts with a 2-byte track and sector pointer, pointing to the next
|
||
sector in the chain, and contains 254 bytes of data. This is exactly a
|
||
linked list. The directory tells where the first sector of a program is --
|
||
the head of the list -- and the program is loaded by simply traversing the
|
||
list -- following each link and reading the data. The end of the list is
|
||
specified by using a special link value (track = $FF).
|
||
The reason it is "better" is that whereas a BASIC program is
|
||
stored sequentially in memory, a program stored on disk might be strewn all
|
||
over the place. This is an important feature of linked lists: they can join
|
||
together data that is spread all over memory. If you think about it for
|
||
a moment, you'll quickly realize that elements may be added into (or removed
|
||
from) the middle of a list simply by changing a pointer:
|
||
|
||
+---+ +---+ +---+ +---+ +---+
|
||
| 3 |---->| 1 |---->| 4 |-+ +->| 5 |---->| 9 |----> ...
|
||
+---+ +---+ +---+ | | +---+ +---+
|
||
| |
|
||
| +---+ |
|
||
+->| 1 |-+
|
||
+---+
|
||
|
||
(Well, okay, two pointers :). Inserting sectors into the middle of a
|
||
program isn't exactly very useful for disk storage, but there are plenty of
|
||
applications where it is extremely useful; one such application, discussed
|
||
below, is sorting data.
|
||
Both BASIC and the disk drive are examples of a forward- or singly-
|
||
linked list. But imagine attaching a second pointer to each disk sector,
|
||
pointing to the _previous_ track and sector:
|
||
|
||
+---+ +---+ +---+ +---+ +---+
|
||
| |---->| |---->| |---->| |---->| |----> ...
|
||
| | | | | | | | | |
|
||
| |<----| |<----| |<----| |<----| |<---- ...
|
||
+---+ +---+ +---+ +---+ +---+
|
||
|
||
This would be a "doubly-linked list". The downside would be a loss of two
|
||
bytes per sector; the upside would be that if your directory track were
|
||
destroyed, you could recover all programs on a disk -- in a singly-linked
|
||
list like C= DOS, you have to know where the start of the list, i.e. the
|
||
first track and sector, is. Moreover, with a doubly-linked list you
|
||
can _delete_ a node without even knowing where the node is in the list;
|
||
with a singly-linked list, you have to search through the list to find
|
||
the pointer to the node.
|
||
|
||
Of course, you could add even more pointers to a list, which is
|
||
done for certain types of trees, for example. (Trees will perhaps be
|
||
covered some other time).
|
||
|
||
A fast sorting algorithm
|
||
------------------------
|
||
|
||
Let's say you had a list of numbers that you wanted to sort from
|
||
largest to smallest. For example, the obj3d library, discussed later
|
||
in this issue, needs to depth-sort objects, so that far-away objects
|
||
don't overlap nearby objects when drawn on the screen. This amounts to
|
||
sorting a list of 16-bit numbers. These numbers are stored in a simple
|
||
list -- not a linked list, but an array, like:
|
||
|
||
lobytes
|
||
lo0
|
||
lo1
|
||
lo2
|
||
...
|
||
hibytes
|
||
hi0
|
||
hi1
|
||
hi2
|
||
|
||
A typical sorting algorithm would have to spend a lot of time swapping
|
||
numbers, moving stuff around, etc. Even with 16-bits this is a fair
|
||
amount of overhead, and with even larger numbers it gets very time-
|
||
consuming.
|
||
But, as mentioned earlier, a linked list is tailor-made for
|
||
rearranging data. That is, if we start with a list of sorted numbers,
|
||
then inserting a new number into the list amounts to finding the right
|
||
spot in the list,
|
||
|
||
+---+ +---+ +---+
|
||
| 1 |---->| 2 |---->| 5 |---
|
||
+---+ +---+ +---+
|
||
|
||
changing the first part of the list to point to the new number,
|
||
|
||
+---+ +---+ +---+
|
||
| 1 |---->| 2 |---->| 5 |-+
|
||
+---+ +---+ +---+ |
|
||
|
|
||
| +---+
|
||
+->| 6 |---
|
||
+---+
|
||
|
||
and having that new number point to the rest of the list.
|
||
|
||
+---+ +---+ +---+ +---+ +---+
|
||
| 1 |---->| 2 |---->| 5 |-+ +->| 8 |---->| 9 |----> ...
|
||
+---+ +---+ +---+ | | +---+ +---+
|
||
| |
|
||
| +---+ |
|
||
+->| 6 |-+
|
||
+---+
|
||
|
||
So sorting a list of numbers amounts to inserting these numbers into
|
||
the right spot in the list, one at a time. Amazingly enough, this type
|
||
of sort is called an "insertion sort".
|
||
|
||
Your first thought might be "doesn't that mean a whole lot of
|
||
overhead in copying data and changing pointers?!" It might, if we were
|
||
lame PC programmers; but, of course, we are 64 coders, which means we
|
||
are handsome, witty, superior, humble -- and most of all, sneaky. All
|
||
we _really_ need is
|
||
|
||
a) an index into the list of numbers
|
||
b) a pointer to the next number
|
||
|
||
The trick is simply to combine the two, by storing the linked list just
|
||
like the list of numbers, as a sequential array of *8-bit* links:
|
||
|
||
list
|
||
link0
|
||
link1
|
||
link2
|
||
...
|
||
|
||
Now each link not only points to the next list element -- it exactly points
|
||
to the next number as well. For example, let's say that the earlier list
|
||
of numbers was 23,16,513
|
||
|
||
lobyte
|
||
23
|
||
01
|
||
16
|
||
|
||
hibyte
|
||
00
|
||
02
|
||
00
|
||
|
||
Sorting from largest to smallest should give 1-0-2 -- that is, element 1
|
||
is the largest, followed by element 0, followed by element 2. So the linked
|
||
list could have the form
|
||
|
||
head = 1
|
||
list
|
||
2
|
||
0
|
||
$80
|
||
|
||
To see how this works, start with the head of the list, which points to
|
||
list element 1.
|
||
|
||
LDX head
|
||
|
||
To get the next element in the list is easy:
|
||
|
||
LDA list,X
|
||
|
||
Now .X is the current element, and .A is a link to the next element. To
|
||
traverse the entire list, then we simply need to TAX and loop:
|
||
|
||
LDX head
|
||
:loop LDA list,X
|
||
TAX
|
||
BPL :loop
|
||
|
||
This will traverse the list, until the $80 is reached. The thing to
|
||
realize is that .X is *also* a list into the list of numbers, so for
|
||
example you could print out the numbers, in order, with some code like
|
||
|
||
LDX head
|
||
:loop LDA lobyte,X
|
||
LDY hibyte,X
|
||
JSR PrintAY
|
||
LDA list,X
|
||
TAX
|
||
BPL :loop
|
||
|
||
Now all we have to do is construct the list!
|
||
|
||
get next coordinate
|
||
traverse linked list
|
||
compare to coordinates in linked list, to find correct spot
|
||
split linked list in half
|
||
make bottom half of list point to the new element
|
||
make the new element point to the rest of the list
|
||
|
||
So far it is just your basic insertion-sort; if you are familiar with
|
||
AmigaOS, it is similar to Enqueue(), which inserts nodes by priority.
|
||
The beauty here is that the index registers make all this really, really
|
||
easy; here's the sort code from obj3d, to sort positive numbers, stored
|
||
in CZ and HCZ = lo and hi bytes, from largest to smallest. It starts
|
||
at the head of the list (at list+$80), traverses the list to find the
|
||
right spot, and inserts the "node":
|
||
|
||
:loop [copy number to be inserted to TEMP, TEMP+1 for a little speed]
|
||
|
||
LDY #$80 ;Head of list
|
||
:l1 LDA VISOBJS,Y ;Linked list of objects
|
||
BMI :link
|
||
STY TEMPY
|
||
TAY ;Next object
|
||
LDA CZ,Y ;If farther, then
|
||
CMP TEMP ;move down list
|
||
LDA HCZ,Y
|
||
SBC TEMP+1
|
||
BCS :l1
|
||
;Nearest objects last in list
|
||
TYA
|
||
LDY TEMPY ;Insert into list
|
||
:link STA VISOBJS,X ;X -> rest of list
|
||
TXA
|
||
STA VISOBJS,Y ;beginning of list -> X
|
||
DEX
|
||
BPL :loop
|
||
:rts RTS
|
||
|
||
Here, VISOBJS is the linked list of sorted coordinates.
|
||
|
||
Personally, I think that's awfully nifty -- an insertion sort with
|
||
almost zero overhead.
|
||
|
||
In summary, a linked list is simply an abstract method of storing and
|
||
retrieving data. For certain kinds of problems it is extremely useful, even
|
||
optimal, and for certain problems it can be implemented in a very efficient
|
||
and convenient way. And as pointed out in the beginning of this article, that
|
||
is the essence of a data structure.
|
||
|
||
I suppose that about wraps things up. So, who wants to volunteer the
|
||
next data structures article?
|
||
|
||
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||
|
||
Counting sort
|
||
------------- by Pasi Ojala <albert@cs.tut.fi>
|
||
|
||
Because we got ourselves tangled up with sorting algorithms, we may
|
||
as well take a look into another one called counting sort. The idea is to
|
||
sort a list of symbols according not to the symbols themselves, but rather
|
||
according to a "key" associated with the symbols. This will become clear
|
||
shortly. This sorting algorithm can be used with integer-valued data when
|
||
the range of sorting key values (the values by which the order is decided)
|
||
is small enough.
|
||
|
||
The foundation for counting sort is to make one pass through the
|
||
data and determine the sorted order of the data, then make another pass and
|
||
perform the actual shuffling of data.
|
||
|
||
Now, what kind of a data structure is used for counting sort?
|
||
Surprise, we only need a counter for every possible sorting key. This is
|
||
why a limited range of values is required or the memory consumption would
|
||
simply be too large. And we need an array of input data and an array for
|
||
the sorted output data, as the sorting can't be performed in place.
|
||
|
||
An example sorts the following data, which in fact represents a
|
||
Huffman tree. The sorting keys are the code lengths, and the associated
|
||
data is the corresponding symbol. The sorting of symbols is required in
|
||
some of the Huffman tree creation routines.
|
||
|
||
key: 4 3 1 5 3 6 3 6
|
||
sym: A B C D E F G H
|
||
|
||
The sorting keys can have value from 1 to 6, so we need 6 counters.
|
||
Their initial values are set to zero:
|
||
|
||
for(i=1;i<7;i++)
|
||
count[i-1] = 0;
|
||
|
||
count: 0 0 0 0 0 0
|
||
|
||
Then we perform the counting stage by going through the data and
|
||
incrementing the counter corresponding to the sorting key value. In the
|
||
end the counters contain the number of each code length found in the data.
|
||
|
||
for(i=0;i<#ofvalues;i++) {
|
||
count[sort_key[i]-1] = count[sort_key[i]-1] + 1;
|
||
}
|
||
|
||
count: 1 0 3 1 1 2
|
||
|
||
Then cumulative counts are calculated for this array.
|
||
|
||
for(i=1;i<6;i++) {
|
||
count[i+1] = count[i+1] + count[i];
|
||
}
|
||
|
||
count: 1 1 4 5 6 8
|
||
|
||
If you take a close look into the meaning of the values now in the
|
||
count array, you might notice that the last count value gives us from which
|
||
element downward to stick the data with sorting key 6, the previous one
|
||
where to stuff data with key 5 and so on.
|
||
|
||
So, next we simply copy each element in the data into its final
|
||
place in the output array using the cumulative counts calculated
|
||
previously. Note that in C the indexing starts from 0, but in the table
|
||
from 1 for the reader's convenience.
|
||
|
||
for(i=#ofvalues-1;i>=0;i--) {
|
||
count[key[i]-1] = count[key[i]-1] - 1;
|
||
|
||
outputkey[count[key[i]-1]] = key[i];
|
||
outputsym[count[key[i]-1]] = sym[i];
|
||
}
|
||
|
||
1 2 3 4 5 6 1 2 3 4 5 6 7 8
|
||
---------------------------------
|
||
6 1 1 4 5 6 8 x x x x x x x 6
|
||
H 7 X X X X X x X H
|
||
|
||
3 1 1 4 5 6 7 x x x 3 x x x 6
|
||
G 3 X X X G X x X H
|
||
|
||
6 1 1 3 5 6 7 x x x 3 x x 6 6
|
||
F 6 X X X G X x F H
|
||
|
||
3 1 1 3 5 6 6 x x 3 3 x x 6 6
|
||
E 2 X X E G X x F H
|
||
|
||
5 1 1 2 5 6 6 x x 3 3 x 5 6 6
|
||
D 5 X X E G X D F H
|
||
|
||
1 1 1 2 5 6 6 1 x 3 3 x 5 6 6
|
||
C 0 C X E G X D F H
|
||
|
||
3 0 1 2 5 6 6 1 3 3 3 x 5 6 6
|
||
B 1 C B E G X D F H
|
||
|
||
4 0 1 1 5 6 6 1 3 3 3 4 5 6 6
|
||
A 4 C B E G A D F H
|
||
|
||
|
||
So, after the loop we have sorted the symbols according to the code
|
||
lengths. We haven't talked about the O() notation, but the counting sort
|
||
is an O(n) process. Counting sort only needs three fixed-sized loops, thus
|
||
if the amount of data increases linearly, the sorting time also increases
|
||
linearly. With insertion sort the sorting time increases geometrically
|
||
because searching for the right spot to add a node takes longer and longer
|
||
when the number of already sorted nodes increases.
|
||
|
||
One extra bonus for counting sort is that it preserves the
|
||
so-called inside order. The order of elements with identical keys is
|
||
preserved in the end result. This is very important in many algorithms,
|
||
like the Huffman tree creation GZip uses (and which gunzip.c64 used
|
||
before the algorithm was changed to not require sorting).
|
||
|
||
On the minus side is the necessity of the output buffer. Other
|
||
sorting algorithms can sort the data in-place, although that also means
|
||
that the data must be copied a lot of times.
|
||
|
||
The preservation of inside-order also allows the sorting of data by
|
||
multiple keys: first sort by secondary keys, then by primary keys. After
|
||
this the data is sorted by the primary keys and all elements having
|
||
identical keys are sorted by the secondary keys.
|
||
|
||
And that's it!
|
||
|
||
.......
|
||
....
|
||
..
|
||
. C=H #18
|
||
|
||
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||
|
||
Main Articles
|
||
-------------
|
||
|
||
|
||
|
||
VIC KERNAL Disassembly Project - Part II
|
||
Richard Cini
|
||
May 21, 1999
|
||
|
||
Introduction
|
||
============
|
||
|
||
Last issue, we began by examining the VIC's start-up sequence. We
|
||
began with the processor jump at power-on to location $FFFC upon power-up
|
||
and ended at the Kernal<61>s jump into the BASIC ROM.
|
||
|
||
This issue, we will look at the two other hard-coded processor
|
||
vectors, the IRQ and NMI vectors. Just like the RES* pin on the 6502
|
||
processor, the IRQ* and NMI* pins (the hardware portion of the interrupt)
|
||
are hard-coded to two memory locations, $FFFE and $FFFA, respectively. When
|
||
the processor senses a negative-going pulse on these pins of at least 20uS
|
||
in duration, the processor will jump to the respective vector locations
|
||
(the software portion of the interrupt, also called an "interrupt
|
||
handler"):
|
||
|
||
|
||
|
||
FFFA ;===============================
|
||
FFFA ; - Power-on Vectors
|
||
FFFA ;
|
||
FFFA A9 FE .dw NMI ;$FEA9
|
||
FFFC 22 FD .dw RESET ;$FD22
|
||
FFFE 72 FF .dw IRQ ;$FF72
|
||
|
||
Both the IRQ* and NMI* lines are available at the expansion connector
|
||
at the back of the VIC. They are also connected to the IRQ* output lines on
|
||
the VIC's two 6522 VIA chips (just like the 64); the IRQ* is connected to
|
||
VIA2 and the NMI* to VIA1.
|
||
|
||
Hardware interrupts on the VIC-20 may be triggered by any one of
|
||
several events which is recognized by either one of the VIC's two VIA
|
||
chips, or by an external event which triggers the IRQ* or NMI* pins on the
|
||
VIC's expansion connector. The software IRQ routine (at $FF72) is also
|
||
entered by the execution of the BRK processor instruction.
|
||
|
||
The VIA chips are capable of generating a hardware interrupt based
|
||
on the events as outlined in register $911D, as described in the section
|
||
titled "VIA Registers Used in Following Code." In general, interrupt events
|
||
result from the VIA's internal timers reaching 0 and active transitions in
|
||
the logic level of the CA1/CB1/CA2/CB2 handshaking pins.
|
||
|
||
Some of the timers and handshaking pins are programmed or connected
|
||
to hardware within the VIC. For example, timer 1 on VIA2 is initialized to
|
||
provide a periodic interrupt every 0.015 seconds, or an approximate rate of
|
||
65 Hz. This interrupt is used to update the time-of-day clock and to
|
||
provide timing pulses for cassette tape operations. This timer sharing is
|
||
the main reason behind the jiffy clock losing time during tape operations.
|
||
Similarly, the processor NMI* line is triggered by the IRQ* output on VIA1.
|
||
|
||
In summary, by default, the interrupt handler code is executed as a
|
||
result of the following:
|
||
|
||
For the IRQ code: the 60Hz periodic interrupt from Timer 1 on VIA2
|
||
and the processor BRK instruction.
|
||
|
||
For the NMI code: pressing of the RESTORE or Run/Stop-RESTORE key
|
||
combinations and RS232 operations.
|
||
|
||
The IRQ and NMI software routines could also be triggered if the
|
||
programmer makes use of some of the other VIA pins for a home-brewed
|
||
project. For example, if a home-brew alarm system is configured to trigger
|
||
the CA2 pin when there is motion in the back yard. The user's program could
|
||
be set up to watch for an interrupt generated by the CA2 pin, to sound a
|
||
siren.
|
||
|
||
VIA Registers Used in the Following Code
|
||
========================================
|
||
|
||
The 6522 VIA has 16 byte-wide registers which control the
|
||
functioning of the chip or enable the receipt or transmission of data on
|
||
the I/O pins. For the sake of space, we'll only discuss the registers
|
||
directly applicable to this issue's code.
|
||
|
||
$9111 is the Port A output register, an 8-bit I/O port which
|
||
automatically uses the CA1 and CA2 pins for handshaking. Port A is
|
||
duplicated at $911F, but changes to the register do not affect CA1 and CA2
|
||
(so, no handshaking). In the above code, only BIT7 and BIT6 are relevant.
|
||
|
||
The bitfields are:
|
||
BIT7 IEEE ATN out
|
||
BIT6 Cassette sense switch
|
||
BIT5 Joystick fire button
|
||
BIT4 Joystick left
|
||
BIT3 Joystick down
|
||
BIT2 Joystick up
|
||
BIT1 IEEE Serial Data In
|
||
BIT0 IEEE Serial Clock In
|
||
|
||
$911D is the register (the Interrupt Flag Register, "IFR") that
|
||
indicates which event triggered the interrupt. BIT3, BIT2, and BIT0 are
|
||
left unprogrammed in the above code, but are shown below for completeness.
|
||
BIT4 manages the RS232 receive function, and BIT1 is connected to the
|
||
RESTORE key.
|
||
|
||
SET BY CLEARED BY
|
||
BIT7 NMI status (set when any of the lower bits are set)
|
||
BIT6 Timer 1 time-out read T1 LW and wrt T1 HW latch
|
||
BIT5 Timer 2 time-out read T2 LW and wrt T1 HW latch
|
||
BIT4 CB1 transition R/W Port B
|
||
BIT3 CB2 transition R/W Port B
|
||
BIT2 Completion of 8 shifts R/W shift register
|
||
BIT1 CA1 transition R/W Port A ($9111 only)
|
||
BIT0 CA2 transition R/W Port A ($9111 only)
|
||
|
||
According to the 6522 data sheets, the shift register interrupt is
|
||
an allowed interrupt, but there is a bug in early 6522s that prevented the
|
||
shift register from working properly. In the VIC, the shift registers are
|
||
disabled by default and remain unused in the KERNAL. It is possible for a
|
||
user program to enable the shift registers and use them, but the quality of
|
||
the results would be lacking because of the bug.
|
||
|
||
$911E (the Interrupt Enable Register, "IER") is the register that
|
||
enables or prevents the lower six bits in the IFR from triggering an
|
||
interrupt. Writing a 0 to BIT7 clears the bits in the IER according to
|
||
the bit pattern in the lower six bits. Writing a 1 to BIT7 sets the IER
|
||
according to the bit pattern. For example, if one wanted to enable all of
|
||
the above as sources of interrupts, one would write %11111111 to the IER.
|
||
Disabling all of the above as interrupt sources would be accomplished by
|
||
a write of %01111111 to the IER.
|
||
|
||
$9110 is the I/O register for Port B of VIA1. This 8-bit port is
|
||
connected to pins PB0-PB7 of the VIC User Port. When the RS232 interface
|
||
module is connected to the User Port, Port B doubles as the RS232 port,
|
||
with the following bitmap:
|
||
|
||
PB7 Data Set Ready (DSR) in
|
||
PB6 Clear To Send (CTS) in
|
||
PB5 [no connection]
|
||
PB4 Data Carrier Detect (DCD) in
|
||
PB3 Ring Indicator (RI) in
|
||
PB2 Data Terminal Ready (DTR) out
|
||
PB1 Request To Send (RTS) out
|
||
PB0 Receive Data
|
||
|
||
CB1 acts as the interrupt source for the NMI receive routine and is
|
||
physically connected (externally) to PB0 so that a received bit of data
|
||
triggers an interrupt. CB2 acts as the RS232 transmit line.
|
||
|
||
Register $9114 is an 8-bit register which holds the least-
|
||
significant byte of Timer 1's countdown value.
|
||
Registers $9118 and $9119 are the least-significant and most-
|
||
significant bytes of Timer 2's countdown value. Together, they provide a
|
||
16-bit countdown capability for use as the baud rate clock.
|
||
|
||
Register $911C is called the Peripheral Control Register, the
|
||
"PCR". The PCR controls how the four handshaking lines (CA1/2 and CB1/2)
|
||
act. On VIA1, CB2 is connected to the RS232 transmit line, and CA2 is
|
||
connected to the cassette tape motor control circuitry. Both CA2 and
|
||
CB2 have eight possible modes that can be manual or automatic, positively
|
||
or negatively triggered, input or output oriented. Input modes set flags
|
||
in the IFR based on programmed transitions. When programmed as outputs,
|
||
CA2/CB2 lines are triggered based on writing to Port B.
|
||
|
||
NMI Processing
|
||
==============
|
||
Let's look at the NMI routine first. The NMI is triggered through the
|
||
use of the RESTORE key connected to the CA1 line, the CB1 RS232 receive
|
||
data line, and the expiration of Timer 1 and Timer 2, which manages framing
|
||
for RS232 transmit and receive operations, respectively.
|
||
The NMI code begins with some stub code that enables the redirection
|
||
of the NMI processing if so programmed by a user. The indirect jump at
|
||
$FFEA is similar to chainable interrupt processing on MS-DOS based computer
|
||
systems -- save the old pointer, redirect pointer to your own code, and
|
||
then chain to the system NMI processor. Several other Kernal vectors are
|
||
handled in the same way: IRQ, Break, Open, Close, Load, Save, Set Input,
|
||
Set Output, Input, Output, Get Character, and Clear I/O Channel.
|
||
|
||
FEA9 ;==============================================
|
||
FEA9 ; NMI - NMI transfer entry
|
||
FEA9 ;==============================================
|
||
FEA9 NMI
|
||
FEA9 78 SEI ; disable interrupts
|
||
FEAA 6C 18 03 JMP (NMIVP) ;$FEAD allows redirection of NMI
|
||
|
||
The actual NMI processing code follows the redirect stub. The NMI
|
||
routine is broken into three parts: RESTORE processing, RS232 transmit
|
||
management and RS232 receive management.
|
||
|
||
FEAD ;==============================================
|
||
FEAD ; LNKNMI - Link to actual NMI code. The first
|
||
FEAD ; part manages the R/S-R keys
|
||
FEAD LNKNMI
|
||
FEAD 48 PHA ; save registers .A
|
||
FEAE 8A TXA
|
||
FEAF 48 PHA ; .X
|
||
FEB0 98 TYA
|
||
FEB1 48 PHA ; .Y
|
||
FEB2 AD 1D 91 LDA D1IFR ;check VIA1 interrupt flag register
|
||
FEB5 10 48 BPL WARMEOI ;no flag present, then issue EOI
|
||
|
||
FEB7 2D 1E 91 AND D1IER ;see if found interrupt is allowed
|
||
; based on IER mask
|
||
FEBA AA TAX ;save bitmask of enabled and active
|
||
; interrupts
|
||
FEBB 29 02 AND #%00000010 ;VIA1/CA1 RESTORE key?
|
||
FEBD F0 1F BEQ WARM1 ;not RESTORE, so move on to RS232
|
||
|
||
;Got here, so NMI must be RESTORE
|
||
; key
|
||
FEBF 20 3F FD JSR SCNROM ;scan for A000 ROM (covered last
|
||
; issue)
|
||
FEC2 D0 03 BNE LNKNMI1 ;no ROM at $A0, so skip ROM NMI
|
||
; routine
|
||
|
||
FEC4 6C 02 A0 JMP (A0BASE+2) ;jump to ROM NMI routine
|
||
|
||
FEC7 LNKNMI1 ;continue NMI processing.
|
||
FEC7 2C 11 91 BIT D1ORA ;test ATN IN(7)/cass switch (6)
|
||
; bits
|
||
FECA 20 34 F7 JSR IUDTIM ;update TOD clock
|
||
FECD 20 E1 FF JSR STOP ;check for STOP key Z=1 if STOP
|
||
; pressed
|
||
FED0 D0 2D BNE WARMEOI ;no stop key, so skip vector
|
||
; restore, VIC and I/O
|
||
; initialization. Go EOI.
|
||
|
||
We reach the following code block if Run/Stop is pressed along with
|
||
the RESTORE key. The code results in a soft reset: it restores the default
|
||
system vectors, initializes the I/O chips to their default, and initializes
|
||
the screen editor. The routine then jumps into BASIC, bypassing BASIC's
|
||
normal initialization routines, leaving program RAM undisturbed.
|
||
|
||
FED2 ;==============================================
|
||
FED2 ; WARMST - Default USER vector
|
||
FED2 ; Also get here from BRK instruction (through IRQ
|
||
FED2 ; vector) or RUN/STOP-RESTORE key combination
|
||
FED2 WARMST
|
||
FED2 20 52 FD JSR IRESTR ;restore default vectors (covered
|
||
; last issue)
|
||
FED5 20 F9 FD JSR IOINIT ;initialize I/O (covered last
|
||
; issue)
|
||
FED8 20 18 E5 JSR CINT1 ;initialize screen editor (covered
|
||
; last issue)
|
||
FEDB 6C 02 C0 JMP (BENTER+2) ;jump to BASIC NMI routine
|
||
|
||
If program execution gets here without passing through the WARMST
|
||
code, then the NMI resulted from an RS232 event, such as when the transmit
|
||
or receive timers time-out (signaling that the VIC is done transmitting or
|
||
receiving a character of information). For now, we'll skip the actual RS232
|
||
transmit/receive code; it'll be covered in a later issue.
|
||
|
||
Since the Kernal programmers could not reliably use the shift
|
||
registers in the VIAs, it appears that they synthesized a shift register
|
||
in the NMI routine. This emulation enables the RS232 code to work properly.
|
||
|
||
The code continues with the NMI part of the RS232 transmit and
|
||
receive character processing routine:
|
||
|
||
FEDE WARM1
|
||
FEDE AD 1E 91 LDA D1IER ;get IER bitmap
|
||
FEE1 09 80 ORA #%10000000 ;set mask for enabling interrupts
|
||
; according to existing bitmap
|
||
FEE3 48 PHA ;save "enable" bitmap
|
||
FEE4 A9 7F LDA #%01111111 ;mask-disable all interrupts on
|
||
; VIA1
|
||
FEE6 8D 1E 91 STA D1IER ;go do it
|
||
|
||
FEE9 8A TXA ;restore mask for active interrupts
|
||
FEEA 29 40 AND #%01000000 ;IFR bit6 =TIMER1 time-out (RS232
|
||
; clk)
|
||
FEEC F0 14 BEQ WARM2 ;T1 done, go to RS232/RX chr
|
||
|
||
FEEE A9 CE LDA #%11001110 ;set/reset bit5 to xmit char
|
||
FEF0 05 B5 ORA NXTBIT ;RS232 transmit - next bit to send;
|
||
FEF2 8D 1C 91 STA D1PCR ;CB2 manual L/H; CB1 neg trans for
|
||
; IRQ; CA2 manual H; CA1 neg trans
|
||
; for IRQ; CB2=TX, CA2=cass motor
|
||
; control
|
||
FEF5 AD 14 91 LDA D1TM1L ;get VIA1/T1 count low byte
|
||
FEF8 68 PLA ;restore IER bitmap...
|
||
FEF9 8D 1E 91 STA D1IER ; ...and save it
|
||
FEFC 20 A3 EF JSR SSEND ;send RS232 char
|
||
FEFF
|
||
FEFF WARMEOI
|
||
FEFF 4C 56 FF JMP EOI ;end of interrupt
|
||
|
||
FF02 WARM2 ;RS232 receive NMI routine
|
||
FF02 8A TXA ;restore IFR mask from above
|
||
FF03 29 20 AND #%00100000 ;VIA1/T2 time-out (done receiving
|
||
; character from RS232 channel)?
|
||
FF05 F0 25 BEQ WARM3 ;yes, so move byte to buffer
|
||
|
||
;collect bits...
|
||
FF07 AD 10 91 LDA D1ORB ;get user port bitmap
|
||
FF0A 29 01 AND #%00000001 ;bit0=RS232/RX
|
||
FF0C 85 A7 STA INBIT ;save received bit
|
||
FF0E AD 18 91 LDA D1TM2L ;get VIA1/T2L count
|
||
FF11 E9 16 SBC #$16 ; subtract 22d
|
||
FF13 6D 99 02 ADC BAUDOF ; add low word of bit transmit time
|
||
FF16 8D 18 91 STA D1TM2L ; save it
|
||
FF19 AD 19 91 LDA D1TM2L+1 ;get VIA1/T2H count
|
||
FF1C 6D 9A 02 ADC BAUDOF+1 ; add high word of bit xmit time
|
||
FF1F 8D 19 91 STA D1TM2L+1 ; save it
|
||
FF22 68 PLA ;restore old IFR bitmap...
|
||
FF23 8D 1E 91 STA D1IER ; ...and save it
|
||
FF26 20 36 F0 JSR SERRX ;signal RS232 receive routine
|
||
FF29 4C 56 FF JMP EOI ;end of interrupt
|
||
|
||
FF2C WARM3 ;received new char, so buffer it
|
||
FF2C 8A TXA
|
||
FF2D 29 10 AND #%00010000 ;CB1 interrupt (RX data bit
|
||
; transition)
|
||
FF2F F0 25 BEQ EOI ;no bit, exit
|
||
|
||
One interesting fact about the VIC is that originally it was supposed
|
||
to include a 6551 ACIA (RS-232) communications chip as standard equipment.
|
||
However, when MOS could not supply an adequate number of working
|
||
chips to support the anticipated VIC production volume, the VIC engineers
|
||
decided to emulate the 6551 in software. The VIC Programmer's Reference
|
||
Guide makes mention of the 6551 registers, but the VIC clearly does not
|
||
contain a 6551. See Cameron Kaiser's Commodore Knowledge Base for more
|
||
details. The URL is http://calvin.ptloma.edu/~spectre/ckb/
|
||
|
||
The 6551 pseudo-Control Register contains the stop bits, word length,
|
||
and baud rate parameters. The pseudo-Command Register contains the parity,
|
||
duplex, and handshaking parameters. The pseudo-Status Register contains a
|
||
result code bitmap. After setting the baud rate divisor, the routine updates
|
||
the number of bits to transmit and exits.
|
||
|
||
FF31 AD 93 02 LDA M51CTR ;pseudo 6551 control register
|
||
FF34 29 0F AND #%00001111 ;pass the baud rate parameter only
|
||
FF36 D0 00 BNE $+2 ;I/O delay
|
||
FF38 0A ASL A ;shift left
|
||
FF39 AA TAX ;save shifted baud rate bitmask and
|
||
; use as an index into a data table
|
||
; with the receive timer values
|
||
FF3A BD 5A FF LDA R232TB-2,X ;index into baud rate divisor table
|
||
FF3D 8D 18 91 STA D1TM2L ; and save the divisor into the VIA
|
||
|
||
FF40 BD 5B FF LDA R232TB-1,X ; timer count register
|
||
FF43 8D 19 91 STA D1TM2L+1
|
||
|
||
FF46 AD 10 91 LDA D1ORB ;read RS232 output register
|
||
FF49 68 PLA ;restore IFR bitmap
|
||
FF4A 09 20 ORA #%00100000 ;T2 interrupt flag
|
||
FF4C 29 EF AND #%11101111 ;pass T2 int. flag but not CB1
|
||
FF4E 8D 1E 91 STA D1IER ;save new interrupt bitmap
|
||
FF51 AE 98 02 LDX BITNUM ;get total number of bits to TX/RX
|
||
FF54 86 A8 STX BITCI ;save as receiver bit count
|
||
FF56 ;
|
||
FF56 ; EOI - End of Interrupt
|
||
FF56 ;
|
||
FF56 EOI
|
||
FF56 68 PLA ;restore registers
|
||
FF57 A8 TAY
|
||
FF58 68 PLA
|
||
FF59 AA TAX
|
||
FF5A 68 PLA
|
||
FF5B 40 RTI ;return from interrupt
|
||
|
||
|
||
IRQ Processing
|
||
==============
|
||
|
||
The IRQ routine is another very important routine for the VIC, as
|
||
various housekeeping chores are performed during the interrupt. The
|
||
processor BRK instruction also points to the IRQ vector, so there is some
|
||
testing early in the routine to handle the BRK instruction.
|
||
|
||
The entry code is similar to the NMI entry code, and similarly,
|
||
allows function chaining. For example, one could write a small IRQ routine
|
||
to provide keyboard "click" feedback, with the code activated during IRQ
|
||
processing.
|
||
|
||
FF72 ;==============================================
|
||
FF72 ; IRQ - IRQ transfer point
|
||
FF72 ;==============================================
|
||
FF72 IRQ
|
||
FF72 48 PHA ; save .A
|
||
FF73 8A TXA
|
||
FF74 48 PHA ; save .X
|
||
FF75 98 TYA
|
||
FF76 48 PHA ; save .Y
|
||
FF77 BA TSX ; get stack pointer
|
||
FF78 BD 04 01 LDA FBUFFR+4,X ;look in stack for PSW BRK flag
|
||
FF7B 29 10 AND #%00010000 ;bit4 of PSW; breakpoint or IRQ?
|
||
FF7D F0 03 BEQ BRKSKIP ;IRQ, branch
|
||
FF7F
|
||
FF7F 6C 16 03 JMP (BRKVP) ;jump to breakpoint processor,
|
||
; which is the WARMST location.
|
||
FF82 BRKSKIP
|
||
FF82 6C 14 03 JMP (IRQVP) ;jump to normal IRQ routine at
|
||
; $EABF
|
||
|
||
When the code is finished determining if the interrupt was
|
||
triggered by a timer tick interrupt or through a BRK instruction, the IRQ
|
||
code continues at $EABF. If it is a BRK instruction, code execution
|
||
continues at the WARMST location. The rest of the IRQ code calls the clock
|
||
update routine, handles blinking the cursor, tape motor control, and
|
||
scanning the keyboard -- all functions that could be considered "user
|
||
interface" functions.
|
||
|
||
EABF ;=====================================================
|
||
EABF ; IRQVEC - IRQ Vector
|
||
EABF ;
|
||
EABF IRQVEC
|
||
EABF 20 EA FF JSR UDTIM ;update system clock FFEA=>F734
|
||
EAC2 A5 CC LDA BLNSW ;cursor enable (0=enable)
|
||
EAC4 D0 29 BNE IRQVEC2 ;non-zero, so skip blink code
|
||
EAC6
|
||
EAC6 C6 CD DEC BLNCT ;decrement blink count
|
||
EAC8 D0 25 BNE IRQVEC2 ;not reached 0, so move on to
|
||
; cassette timing stuff
|
||
EACA A9 14 LDA #$14 ;reset blink timer to 20d (ms)
|
||
EACC 85 CD STA BLNCT ;save new count
|
||
EACE A4 D3 LDY CSRIDX ;get cursor column
|
||
EAD0 46 CF LSR BLNON ;get blink phase into C flag
|
||
EAD2 AE 87 02 LDX CSRCLR ;get color under cursor
|
||
EAD5 B1 D1 LDA (LINPTR),Y ;get character code of current char
|
||
EAD7 B0 11 BCS IRQVEC1 ;blink already on, so continue
|
||
EAD9
|
||
EAD9 E6 CF INC BLNON ;increment blink on flag
|
||
EADB 85 CE STA GDBLN ;save char under cursor
|
||
EADD 20 B2 EA JSR CCOLRAM ;get pointer to color RAM
|
||
EAE0 B1 F3 LDA (COLRPT),Y ;get color code for cursor location
|
||
EAE2 8D 87 02 STA CSRCLR ;save it
|
||
EAE5 AE 86 02 LDX CLCODE ;get color under cursor
|
||
EAE8 A5 CE LDA GDBLN ;get char again
|
||
EAEA
|
||
EAEA IRQVEC1
|
||
EAEA 49 80 EOR #%10000000 ;update cursor with blink phase
|
||
EAEC 20 AA EA JSR PRNSCR1 ;set char and color
|
||
EAEF
|
||
EAEF IRQVEC2 ;scan for tape switch pressed
|
||
EAEF AD 1F 91 LDA D1ORAH ;read I/O bitmap
|
||
EAF2 29 40 AND #%01000000 ;cassette switch pressed?
|
||
EAF4 F0 0B BEQ IRQVEC3 ;no, turn motor off
|
||
EAF6
|
||
EAF6 A0 00 LDY #$00 ;set motor "on"
|
||
EAF8 84 C0 STY CAS1 ;clear motor interlock flag
|
||
EAFA AD 1C 91 LDA D1PCR ;get PCR bitmap
|
||
EAFD 09 02 ORA #%00000010 ;set motor control bit to "on"
|
||
EAFF D0 09 BNE IRQVEC4 ;go to timer1 test
|
||
EB01
|
||
EB01 IRQVEC3 ;set motor to "off"
|
||
EB01 A5 C0 LDA CAS1 ;get cassette interlock flag
|
||
EB03 D0 0D BNE IRQVEC5 ;is flag 1, then exit-motor is off
|
||
EB05
|
||
EB05 AD 1C 91 LDA D1PCR ;get PCR bitmap
|
||
EB08 29 FD AND #%11111101 ;set motor control bits to "off"
|
||
EB0A
|
||
EB0A IRQVEC4
|
||
EB0A 2C 1E 91 BIT D1IER ;IER bit7=IERs/c bit6=T1
|
||
EB0D 70 03 BVS IRQVEC5 ;is timer 1 still enabled? Yes,
|
||
; skip update
|
||
EB0F
|
||
EB0F 8D 1C 91 STA D1PCR ;set motor status
|
||
EB12
|
||
EB12 IRQVEC5
|
||
EB12 20 1E EB JSR ISCNKY ;scan keyboard
|
||
EB15 2C 24 91 BIT D2TM1L ;D2T1 latch LSB bits 7-6
|
||
|
||
EB18 68 PLA ;restore registers and return from
|
||
EB19 A8 TAY ; interrupt
|
||
EB1A 68 PLA
|
||
EB1B AA TAX
|
||
EB1C 68 PLA
|
||
EB1D 40 RTI
|
||
|
||
|
||
Conclusion
|
||
==========
|
||
|
||
The VIC's NMI and IRQ routines are important to the smooth operation
|
||
of the VIC, handling a few critical functions that make an impact on
|
||
usability. The NMI handler deals with soft-reset processing and RS232
|
||
communications timing, and the IRQ handler deals with the cursor, the
|
||
keyboard, and cassette deck timing. The division of labor between the two
|
||
routines is a sensible one. The routines are relatively compact, but allow
|
||
expansion through chaining.
|
||
|
||
Next time, we'll examine more routines in the VIC's KERNAL, including
|
||
some of the routines called from NMI and IRQ.
|
||
.......
|
||
....
|
||
..
|
||
. C=H #18
|
||
|
||
|
||
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||
|
||
|
||
geoWrite Disassembly Notes
|
||
By Todd S. Elliott - Eyethian@juno.com
|
||
|
||
Introduction
|
||
============
|
||
|
||
As part of an effort to learn GEOS programming and to improve an
|
||
application I was working on, I disassembled geoWrite 128, and along the
|
||
way, I made several modifications to make it work with modern day GEOS
|
||
systems. This article contains the fruits of my efforts and some of the
|
||
lessons I learned. The first part of the article describes largely the
|
||
territory that comes with GEOS programming. The second part discusses my
|
||
particular disassembly procedure, and the last part contains the actual
|
||
disassembly notes to geoWrite 128 v2.2.
|
||
|
||
Background
|
||
==========
|
||
|
||
When GEOS came out in mid-1980's, I tried it and it was cumbersome and slow.
|
||
I took an immediate dislike to it and sparingly used it, as if it were a
|
||
demo. But, CMD arrived with their powerful peripherals and I began to enjoy
|
||
using GEOS. Little did I realize it, GEOS insidously has made me a convert
|
||
and a believer in the fact that a c64/128 can do a GUI OS.
|
||
|
||
But, I was still a user all of this time, and I'll admit that I didn't think
|
||
about programming for it and was a little bit intimidated. But, the WWW craze
|
||
hit, and there were browsers popping up everywhere. All of a sudden, scarce
|
||
GEOS information was made immediately available, including programming
|
||
docs. I thought to myself, why not try GEOS programming? All I needed was an
|
||
idea. Naively, I thought I would try to create a graphical (mono) browser
|
||
that could read in HTML files off a local system, and thought that GEOS 128
|
||
was a natural fit. Thus, 'Constellation' was born, nutured and died an
|
||
untimely death, like so many of my other projects before and after then, and
|
||
they shall remain nameless. :(
|
||
|
||
First off, I had to use geoProgrammer and it was not an easy package to use
|
||
and master, and its manual was the heaviest in the business. Secondly, GEOS
|
||
uses an event driven nature of programming and that goes against my beliefs
|
||
in programming for the CBM 8-bit machines for years. Third, there were a lot
|
||
of system calls at my disposal and I really didn't know how to use them
|
||
effectively, or used wrong calls, and Berkeley Softwork's own programming
|
||
docs had inaccuracies and incompleteness. Fourth, GEOS 128, while a marvel
|
||
and a technological breakthrough, it was too limited, in my view, for a
|
||
serious application such as a mono graphical browser.
|
||
|
||
My main obstacle, as one would strangely call it, to GEOS programming is the
|
||
Berkeley Softwork's (BSW) own programming suite, geoProgrammer. One main
|
||
feature that set it apart from other assemblers was that it had a linker.
|
||
This was a new concept for me and took a while to warm up to the idea. (BTW,
|
||
Merlin is the only other assembler that I know of which uses a linker.) Next,
|
||
Berkeley Softworks added a host of features, directives, psuedo-ops and even
|
||
included a very powerful symbolic debugger in this programming suite. This
|
||
made programming for GEOS a complex task and I really had to keep tabs on my
|
||
projects and track my GEOS development. This complexity was only exacerbated
|
||
by several bugs that made GEOS programming an exactingly task.
|
||
|
||
But if used correctly, geoProgrammer does a very good job in creating GEOS
|
||
programs easily and quickly. Fortunately, Concept, Maurice Randall's integrated
|
||
development environment for Wheels, comes to my rescue by fixing most of the
|
||
problems plaguing geoProgrammer and boosting productivity in programming for
|
||
GEOS. Despite Concept's ease of use and its integrated development
|
||
environment, one still has to know geoProgrammer in order to use it
|
||
effectively. This is because Concept has an integrated development environment
|
||
in which it acts as a desktop and allows the programmer to select geoWrite,
|
||
geoAssembler or geoLinker and work on source code files. Secondly, Concept
|
||
does not work in GEOS and is specific to the Wheels upgrade. For more
|
||
information, download Concept at:
|
||
|
||
http://people.delphi.com/arca93/files/concept.wr3
|
||
|
||
There are other development packages available for GEOS programming, and I
|
||
won't go into them as I never have used them but will name them for the sake
|
||
of completeness. There was a program called geoCOPE, which was reviewed in
|
||
the Transactor and was billed as a simple alternative to geoProgrammer for
|
||
novices who desire to learn a little bit about GEOS programming. Then there's
|
||
the MegaAssembler, a german GEOS programming suite which is supposedly
|
||
powerful and complex as geoProgrammer. I do not know if it is in the public
|
||
domain or if it has an English version.
|
||
|
||
Once I got past the intricacies of geoProgrammer, I was stymied at first by
|
||
the event-driven nature underlying GEOS. I was conditioned to create a main
|
||
loop checking for user input and do various activities as necessary. The
|
||
opposite is used in GEOS. I had to GIVE up control of the application to the
|
||
GEOS main loop and let it do its job. That meant I had to set up the icons,
|
||
the menus, the screen interface, etc. and do an RTS. The GEOS main loop then
|
||
takes over and if an icon was clicked upon, for example, my application
|
||
finally takes control again and acts upon the icon click. As I got used to
|
||
it, I began to appreciate the event-driven nature of GEOS and how it has made
|
||
my job programming for GEOS that much easier.
|
||
|
||
The event-driven nature of GEOS is backed up by a phalanx of GEOS system
|
||
calls, of which most can be accessed by the programmer without the need to
|
||
ever use the KERNAL at all. Some system calls can be quite complex and can
|
||
basically take over the entire computer or can be very destructive if used
|
||
the wrong way. To make matters worse in trying to understand this entirely
|
||
new graphical OS, BSW's own programming docs were incomplete and had
|
||
inaccuracies. Despite that, both programming docs, the Official GEOS
|
||
Programmer's Reference Guide and the Hitchhiker's Guide to GEOS contains a
|
||
lot of useful information and when taken together, is truly the 'bible' on
|
||
GEOS programming. Anyone wishing to do serious GEOS programming needs both
|
||
books.
|
||
|
||
Still, I managed to overcome these obstacles to GEOS programming and actually
|
||
created a user interface for Constellation. But I ran into a serious
|
||
limitation of GEOS 128; it had no memory management routines. I required that
|
||
Constellation be able to handle HTML files ranging from 254 bytes to 2Mb
|
||
monsters with equal aplomb. GEOS 128 has system calls for using REU memory,
|
||
but I was not very familiar with using them and there was no way of telling
|
||
how GEOS 128 used expansion memory. Secondly, I wasn't too sure on how to
|
||
display text and graphics with ease and whatever methods that I looked at, it
|
||
simply looked too cumbersome and difficult.
|
||
|
||
However, there was a 'browser' already in the GEOS environment; users simply
|
||
do not view it as that way. It's geoWrite, and it reads and mixes in text and
|
||
graphics with ease. Secondly, it is a full-blown BSW application that works
|
||
seamlessly with GEOS as opposed to Constellation's often mysterious crashes.
|
||
At that point, I decided to scuttle Constellation and open a dissection into
|
||
the inner workings of geoWrite 128 and use that knowledge to revive
|
||
Constellation. And as a bonus, I would learn a lot more about GEOS
|
||
programming far better than what BSW's own docs could provide. Only that it
|
||
exactly hasn't turned out that way so far...
|
||
|
||
As I progressed into disassembling geoWrite 128 v2.1, I came across several
|
||
sections of code and said to myself, 'I could change this or that'. There
|
||
were code that mostly dealt with file handling, and this stuff was obsolete
|
||
by the time high powered GEOS systems came into fruiton. For example, BSW put
|
||
in code that merely 'toggled' the data device, and at that time, it was
|
||
sensible as two drive systems were possible. But today's GEOS systems can
|
||
support up to four drives and this code is an annoyance and limits geoWrite
|
||
128's usability in modern day GEOS systems.
|
||
|
||
So, I disassembled geoWrite 128 with the full intention of porting such GEOS
|
||
knowledge to Constellation and wound up improving geoWrite 128 instead.
|
||
Here's what I improved so far in geoWrite 128 v2.2:
|
||
|
||
* Complete four drive support in its file requestors.
|
||
* Capable of booting up from any drive (A-D) when a datafile is clicked upon.
|
||
Improved booting up sequence.
|
||
* Loads completely into expansion memory in Wheels equipped systems. In this
|
||
case, geoWrite 128 no longer needs to access the disk device to retrieve
|
||
its own modules, and simply fetches them from the faster RAM expansion. A
|
||
very useful feature for users who only have 41's, 71's, 81's or FD's. This
|
||
feature does not work in GEOS 128 because there is no reliable way of
|
||
knowing how it manages RAM expansion.
|
||
* Semi-intelligent - Does not prompt the user to insert a new disk if
|
||
non-removable media is used.
|
||
* Displays the DISK icon when a Native ramdisk is used. Previously, geoWrite
|
||
128 would not display a DISK icon (used to change disks or partitions)
|
||
when a ramdisk is accessed. But native ramdisks have their own
|
||
subdirectories and the DISK icon is activated accordingly.
|
||
* Also displays the DISK icon if a ramlink 1581 partition is used.
|
||
* The DISK icon is also displayed in the disk device from which geoWrite 128
|
||
was loaded from, because geoWrite 128 is now 100% ram resident.
|
||
* Autodetects whether it is running in GEOS 128 v2.0 or Wheels 128 systems.
|
||
|
||
The rest of this article mainly focuses on how geoWrite 128 v2.2 is
|
||
constructed, how to disassemble a GEOS program, and mostly tries to offer
|
||
inspiration for others to undertake GEOS programming endeavors. There is so
|
||
much that needs to be done and can be done in GEOS. Without further ado...
|
||
Onward!
|
||
|
||
Disassembly For Dummies. :)
|
||
===========================
|
||
|
||
Before we begin with the disassembly notes, let's describe how I conducted
|
||
the disassembly of geoWrite 128 v2.1. In fact, a program called geoSourcer
|
||
(64/128 versions) was recently released into the public domain while I was
|
||
busy disassembling geoWrite 128 v2.1. Since I haven't disassembled seven
|
||
other VLIR modules, I plan to use geoSourcer to do the job and will post a
|
||
review, tutorial or critique of sorts either here in a future issue of
|
||
C=Hacking or on comp.sys.cbm.
|
||
|
||
First, I personally use the DarkStar suite of disk utilities (ZipCode,
|
||
etc.) and use its excellent disk editor. The reason is that I need to 'link'
|
||
or 'de-link' the individual VLIR modules from the rest of the program for
|
||
later disassembly or reassembly. One must have knowledge of how VLIR files
|
||
are structured at this stage of disassembly.
|
||
|
||
There are two formats under GEOS; the sequential format (not to be confused
|
||
with SEQ files) and the VLIR format. The sequential format simply consists of
|
||
a file running in a contigious fashion and is loaded in at once. The VLIR
|
||
format is similar to CBM REL files in which there are 127 individual records,
|
||
and each record can basically be of any length. VLIR files are broken into
|
||
records, or if in program files, 'modules'. With respect to programs and not
|
||
datafiles, VLIR #0 will be the main module which is loaded and executed
|
||
first in GEOS. In turn, this module will load in other modules in its VLIR
|
||
file structure whenever necessary. This allows for much larger GEOS programs
|
||
to run and still have room to spare. For example, geoWrite 128 is 35K, and if
|
||
it were a sequential file, there would be no room left over for the actual
|
||
datafile to coexist. What about geoPublish at 99K? The VLIR file format is
|
||
the only way geoPublish can run in GEOS and on the CBM 8-bit platform. In
|
||
essence, the VLIR format allows GEOS to use the disk device as virtual
|
||
memory device by loading in modules as needed.
|
||
|
||
geoWrite 128 v2.1 consists of eight VLIR files. VLIR #0 loads in at $0400,
|
||
and contains the main 'meat' of the program, with icons, menus, dialog box
|
||
info, etc. VLIR #1 contains mostly screen setup routines, the geos kernal
|
||
ID check, checking the printer driver and other initialization routines.
|
||
VLIRs #2 through #4 are unknown at this point, while VLIR #5 contains the
|
||
main routines for datafile handling. VLIR #6 is unknown, while VLIRs #7
|
||
and #8 contain the printing code. VLIRs #1 through #7 all load in at $3244,
|
||
and VLIR #8 loads in at $0680. I focused on VLIR #0 and #5.
|
||
|
||
To disassemble the VLIRs, I located the record on the disk and created a
|
||
separate directory entry pointing to the record as a PRG (non-GEOS) file. I
|
||
looked at the first two bytes of the file. They are actual pieces of code,
|
||
but outside of GEOS, they are mistaken for as load addresses. I wrote down
|
||
these two bytes somewhere so I could later retrieve them. At this point,
|
||
I have to know its true load address. Let's say that it's $3244. So I
|
||
replaced these first two bytes with the true load address plus two, in a
|
||
low/high byte order, as in $46 $32.
|
||
|
||
I'm done with the disk editor at this point and used a disassembler program.
|
||
The disassembler read in the load address -- my user supplied value of $3246 --
|
||
and went from there, disassembling that particular VLIR record. I used a
|
||
symbolic disassembler modified for LADS 128 by James Mudgett and it works in
|
||
128 mode. Theoretically, I could supply a symbol file containing GEOS equates
|
||
and it will produce some GEOS compliant source code. I haven't done this yet.
|
||
Next, I used the Make-ASCII program by the authors of EBUD to convert the PRG
|
||
disassembly to a SEQ petascii file.
|
||
|
||
I used EBUD to modify the source code file, add GEOS equates, fix some minor
|
||
addressing problems in the ML code, add comments, etc. In short, I
|
||
followed the program flow and logic and adding comments here and there,
|
||
fixing up stuff, etc. This is the true guts and grits of disassembling and
|
||
takes up quite a bit of time, reference to documentation, etc. At times,
|
||
this process was enlightening and at times, it was quite dull and boring.
|
||
(Ever try to translate codes into ASCII text that GEOS uses?)
|
||
|
||
My best friend during this disassembly process was dialog boxes, menus,
|
||
icons and prompts. Why? They shed light on the calling routines. Some
|
||
routines were so obscure at an initial glance that I couldn't figure them out.
|
||
But when it called a dialog box, presto! I understood now what the routine
|
||
was trying to do in the first place. This disassembly process goes on and on.
|
||
Maurice Randall also was very patient in answering my email correspondence
|
||
as I progressed through the disassembly. In case if I haven't said it, I'm
|
||
saying it now... THANKS! :)
|
||
|
||
Anyway, the reason why I decided to use non-GEOS tools is because I wanted to
|
||
produce an exact copy of the original code from my disassembled code. I
|
||
couldn't do that with geoProgrammer as it doesn't always produce an exact
|
||
copy. Maurice has fixed many problems in geoProgrammer with the release of
|
||
Concept and can be downloaded from his website. I've been using Concept to
|
||
assemble the patcher program that patches a user's copy of geoWrite 128 v2.1
|
||
and have full confidence in that programming package.
|
||
|
||
Upon assembling the source code, I ran a compare of the resulting code
|
||
against the original PRG file that I extracted earlier in a disk editor. I
|
||
used my Action Replay v6 ML monitor to do the comparisons. If the files did
|
||
not match, then I went back into the disassembly and figured out why, etc.,
|
||
and fixed them. Once I did have a match, then I knew my disassembly was
|
||
perfect and that I could add any changes to it I wanted, etc., and is what
|
||
I've done with geoWrite 128 v2.2.
|
||
|
||
Having a perfect copy of the VLIR #5 to work with, I went back into my disk
|
||
editor to patch it back into the VLIR application on a 5 1/4 disk. I did this
|
||
by modifying the VLIR table as to include that PRG file as a VLIR record and
|
||
remove the directory entry pointing to it as a PRG file. Remember the
|
||
modified load address of $3246? I removed it and added the original two
|
||
bytes of code, so the GEOS application would run fine within the GEOS
|
||
environment.
|
||
|
||
As for serialization and the GEOS Kernal ID check, I don't want to get into
|
||
this area, but suffice it to say that I used the Action Replay v6 ML
|
||
monitor to remove these. You may have to remove these if the code you want to
|
||
disassemble is somehow blocked by serialization or serial number checks. This
|
||
is also an another reason why I decided to use non-GEOS tools. GEOS can't
|
||
remove the serialization by itself, obviously, and Action Replay v6 does not
|
||
run in 128 mode and may crash the computer when running in 64 mode running
|
||
GEOS. The GEOS Kernal ID check is a form of copy protection and is used often
|
||
by major BSW applications.
|
||
|
||
This is largely the process I've been using to patch geoWrite 128 v2.1 to a
|
||
v2.2 by modifying VLIR #0 and #5. I haven't touched other modules yet and
|
||
there are 7 more modules to go. :( Hopefully I haven't missed anything and
|
||
that it has been helpful and instructive. I plan to finish disassembly of
|
||
geoWrite 128 v2.1 and will certainly post more disassembly notes in the
|
||
future, either in C=Hacking or wherever appropriate.
|
||
|
||
Disassembly Nota Bene
|
||
=====================
|
||
The rest of the article will mainly focus on routines that I've either
|
||
disassembled or revamped in the geoWrite 128 v2.2 upgrade. The labels as
|
||
used are largely from BSW itself, in the Official GEOS Programmer's Reference
|
||
Guide and the Hitchhiker's Guide to GEOS. The format for the article is as
|
||
follows:
|
||
|
||
* The routine name is displayed, along with its actual address and VLIR
|
||
module number and then the category it is under. For illustration of the
|
||
admittedly unorthodox addressing scheme, let's give an example: $3a41x5.
|
||
The $3a41 is the actual address, and the x5 is the VLIR module number of
|
||
where it is located. (VLIR modules #0 through 8)
|
||
* A brief description of the routine follows in the function field.
|
||
* Parameters, if any, are described.
|
||
* Variables or routines that the routine will use are listed.
|
||
* Listing of any variables or flags that are set or accessed when the routine
|
||
is done.
|
||
* Posting of any psuedo-registers or registers that are used by the routine
|
||
and not preserved.
|
||
* The description of the routine, with a sequence of events or branches.
|
||
* Finishes up with any proposed modifications that would be suitable for
|
||
future work.
|
||
|
||
The disassembly comments pertaining to VLIR #5 of geoWrite 128 are only
|
||
applicable to the v2.2 version as patched, and not its original v2.1 version.
|
||
Traces of the original v2.1 version still remain, notably the lbxxxx labels
|
||
throughout the disassembly. The numbers following the 'lb' refers to the
|
||
actual locations in the v2.1 version. Any absolute addresses that do not
|
||
contain a VLIR number is presumed to be addresses for VLIR #0. Also, this is
|
||
not 100% complete, there are still several gaps of which I have not been able
|
||
to figure out and they are duly noted, or have been guesstimated as such.
|
||
|
||
The patcher program is now available and is being marketed by yours truly,
|
||
a multinational corporation. :) Ok, so I'm no corporation nor paper tiger,
|
||
but email me for more details at eyethian@juno.com about acquiring the
|
||
patcher program.
|
||
|
||
There is a geos programming emailing list maintained at cbm.videocam.net.au.
|
||
One need not join, but can read past archives covering various topics of geos
|
||
programming. The URL for the geoProgramming:The Millennium (GTM) emailing
|
||
list is: http://cbm.videocam.net.au/gtm/
|
||
|
||
That all said, there are plenty of GEOS programs, especially those BSW
|
||
applications, that are ripe for disassembly for further exploration and
|
||
knowledge of GEOS programming. As a bonus, these programs really do need
|
||
modifications as to make them work all but seamlessly on modern day GEOS
|
||
systems with hulking CMD power.
|
||
|
||
I hope that the following disassembly notes will be instructive to people
|
||
wishing to get into GEOS programming or to upgrade other existing BSW
|
||
applications. At any rate, enjoy.
|
||
|
||
setProgDevice & - $0daax0 - Disk Routines
|
||
setDataDevice - $0daex0 -
|
||
|
||
Function: Sets the disk device from which the application was loaded
|
||
from. Sets the disk device for which the datafile activities take place.
|
||
|
||
Parameters: None.
|
||
|
||
Uses: progDrive
|
||
dataDrive
|
||
toggleZP
|
||
SetDevice
|
||
|
||
Returns: None.
|
||
|
||
Destroys: .A
|
||
|
||
Description: Depending on the entry point, it checks either progDrive or
|
||
dataDrive and issues a SetDevice call to change the active disk device.
|
||
|
||
Proposal: This needs to be overhauled, as the disk device driven model
|
||
is obsolete in modern day GEOS systems. This needs to be changed to a
|
||
directory driven model, where directories rule and not the disk device. Users
|
||
can change directories, subdirectories, partitions, etc. and the program
|
||
needs to keep track of all of this activity and the current routines fall
|
||
short.
|
||
|
||
VLIROps - $0dddx0 - Disk Routines
|
||
|
||
Function: Loads in geoWrite 128's own individual VLIR modules.
|
||
|
||
Parameters: .A containing the VLIR number for the geoWrite 128 module to
|
||
load.
|
||
|
||
Uses: PVLIROps
|
||
CVLIRNum - Current geoWrite 128 VLIR module in memory
|
||
setProgDevice
|
||
RVLIRB2F - restores a geoWrite VLIR module from BackRAM
|
||
$3172 - Address location of which starting tracks and sectors
|
||
for the nine individual VLIR modules can be found and is used
|
||
as an index.
|
||
$2798 - ReadFile
|
||
SVLIRF2B - saves a geoWrite VLIR module to BackRAM
|
||
GotoFirstMenu
|
||
lb29dc - Error message
|
||
lb233a - Canned DB to display error message
|
||
|
||
Returns: None.
|
||
|
||
Destroys: r1, r2, r7, r10, .A, .X and .Y.
|
||
|
||
Description: First, it loads r7 with $3244 for the loading address for the
|
||
VLIR modules. Next, it copies r7 into r10 for the error handler. Next, it
|
||
checks the value passed in .A against CVLIRNum and if they match, then the
|
||
VLIR module in question is already in memory and there is no need to load it
|
||
in from the disk device, and it simply RTS's without any further action.
|
||
|
||
If the numbers do not match, then CVLIRNum will take on the number passed in
|
||
.A and opens the disk device housing the application through setProgDevice.
|
||
Next, it calls RVLIRB2F, and sees if a copy of the VLIR module is already
|
||
located in BackRAM. If so, the routine simply restores the VLIR module by
|
||
fetching it from BackRAM, and doesn't need to access the disk device at all.
|
||
|
||
If the VLIR module is not located in BackRAM, it then checks the index
|
||
located at $3172 and retrieves the starting track and sector of the VLIR
|
||
module and issues a ReadFile to load in the VLIR module. The maximum VLIR
|
||
module size is only 4,000 bytes. Then it calls SVLIRF2B, to determine if the
|
||
newly loaded in VLIR module should also be saved to BackRAM. If there is an
|
||
error, a DB is generated and the VLIR module in question tries to get
|
||
accessed again.
|
||
|
||
Note: There is an alternative entry point, PVLIROps, which is for the VLIR
|
||
#8, the printing code. The reason is that this module loads in at $0680 as
|
||
opposed to $3244 for VLIR modules #1 through 7. The entry point is located at
|
||
address $0de5, or just eight bytes beyond VLIROps, and requires passing r7
|
||
the $0680 address.
|
||
|
||
Proposal: This routine can be modified as to allow retrieval of VLIR
|
||
modules from expansion ram in Wheels or MP3 operating systems. Already
|
||
implemented in the patcher program for Wheels users.
|
||
|
||
StashGW128 - $2bdbx0 - Setup
|
||
|
||
Function: Stashes all eight VLIR modules of geoWrite 128 v2.2 into
|
||
expansion memory, and enables the ram-based VLIR code.
|
||
|
||
Parameters: a7L (Wheels flag) and $d4 (LoadOptFlag)
|
||
|
||
Uses: RAMOps - Core ram-based VLIR code
|
||
setProgDevice
|
||
obtainRec - loads in an individual VLIR module from disk
|
||
$3172 - Address location of which starting tracks and sectors
|
||
for the nine individual VLIR modules can be found and is used
|
||
as an index.
|
||
$2798 - ReadFile
|
||
standard - loads r7 with $3244
|
||
deviate - loads r7 with $0680
|
||
checkDisk
|
||
i_MoveData
|
||
VLIRAMOps - Replacement routine for the following routine:
|
||
VLIROps - the routine being replaced by the previous routine.
|
||
CVLIRNum - Current geoWrite 128 VLIR module in memory
|
||
toggleZP
|
||
DoRAMOp
|
||
EnterDeskTop
|
||
lb29dc - Error message
|
||
lb233a - Canned DB to display error message
|
||
|
||
Returns: None.
|
||
|
||
Destroys: r0, r1, r2, r3L, r7, r15L, .A, .X and .Y.
|
||
|
||
Description: First, it checks a7L and determines if it is running under a
|
||
GEOS 128 or Wheels 128 system. If it is GEOS 128, then the routine simply
|
||
jumps to $3244 of geoWrite's VLIR #1 and goes from there. Secondly, it checks
|
||
LoadOptFlag to determine if the datafile was passed through the printer icon
|
||
for printing. If that is the case, then the routine would jump to $3244 of
|
||
geoWrite's VLIR #1. In either event, no RAM activities take place.
|
||
|
||
If the routine gets past the checks, then it stashes VLIR #1 into expansion
|
||
memory because it is already sitting there in FrontRAM memory. Next, it calls
|
||
setProgDevice and proceeds to stash VLIRs #2 through 7 into expansion memory.
|
||
Lastly, it stashes the memory region from $0680 to $0b80 into expansion
|
||
memory. Then it loads in VLIR #8, the printing code, into that region
|
||
beginning at $0680. Next, it performs a SWAP of memory located at $0680 and
|
||
that in expansion memory, putting the printing code into expansion memory and
|
||
restoring the original code located at $0680.
|
||
|
||
Next, it fetches VLIR #5 from expansion memory and modifies the checkDisk
|
||
code as to allow the DISK icon to be placed in the file requestor, even if it
|
||
is displaying the disk device from which geoWrite 128 originally loaded from.
|
||
Next, once the code is modified, VLIR #5 is stashed into expansion memory.
|
||
|
||
Lastly, VLIR #1 is fetched from expansion memory. Next, it replaces the code
|
||
as found in VLIROps with the ram-based VLIR code located at VLIRAMOps.
|
||
Finally, it jumps to $3244 in geoWrite's VLIR #1.
|
||
|
||
Proposal: None. Code may change to support ram expansion capabilities
|
||
of MP3 128 systems.
|
||
|
||
VLIRAMOps - $0dddx0 - RAM Routines
|
||
|
||
Function: Loads in geoWrite 128's own individual VLIR modules via
|
||
expansion RAM.
|
||
|
||
Parameters: .A containing the VLIR number for the geoWrite 128 module to
|
||
load.
|
||
|
||
Uses: PVLIROps
|
||
RAMOps
|
||
CVLIRNum - Current geoWrite 128 VLIR module in memory
|
||
toggleZP
|
||
DoRAMOp
|
||
lb29dc - Error message
|
||
lb233a - Canned DB to display error message
|
||
EnterDeskTop
|
||
|
||
Returns: None.
|
||
|
||
Destroys: r0, r1, r2, r3L, r7, .A, .X and .Y.
|
||
|
||
Description: First, it loads r7 with $3244 for the loading address for the
|
||
VLIR modules. Next, it checks the value passed in .A against CVLIRNum and if
|
||
they match, then the VLIR module in question is already in memory and there
|
||
is no need to load it in from RAM expansion, and it simply RTS's without any
|
||
further action.
|
||
|
||
If the numbers do not match, then CVLIRNum will take on the number passed in
|
||
.A and checks to see if it is VLIR #8, the printing module. If that is the
|
||
case, then only 1,280 bytes gets fetched from expansion memory. Otherwise,
|
||
it's 4,000 bytes. Next, it calculates the RAM expansion address offset of
|
||
which the correct VLIR module can be found.
|
||
|
||
Lastly, when all registers are prepped, DoRAMOp does the job of fetching the
|
||
VLIR module into the correct memory location. If there is an error, a DB is
|
||
generated and the application aborts to deskTop.
|
||
|
||
Note: There is an alternative entry point, PVLIROps, which is for the VLIR
|
||
#8, the printing code. The reason is that this module loads in at $0680 as
|
||
opposed to $3244 for VLIR modules #1 through 7. The entry point is located at
|
||
address $0de5, or just eight bytes beyond VLIRAMOps, and requires passing r7
|
||
the $0680 address.
|
||
|
||
Proposal: This routine replaces the disk-based VLIR routines as found
|
||
in geoWrite 128 v2.1. This routine may need to be changed to support the MP3
|
||
128 platform.
|
||
|
||
checkDrives - $2b0dx0 - Disk Routines
|
||
|
||
Function: Checks available drives on a user's system.
|
||
|
||
Parameters: r0L via deskTop with LoadOptFlag
|
||
r2 via deskTop pointing to diskname of the disk containing
|
||
the datafile.
|
||
r3 via deskTop pointing to datafile's filename.
|
||
|
||
Uses: DrACurDkNm
|
||
DrBCurDkNm
|
||
DrCCurDkNm
|
||
DrDCurDkNm
|
||
setDataDevice
|
||
setProgDevice
|
||
$27b0 - FindFile
|
||
curDrive
|
||
numDrives
|
||
toggleZP
|
||
prepDlgBox
|
||
enterDeskTop
|
||
|
||
Returns: progDrive - The drive geoWrite was loaded from.
|
||
dataDrive - The disk device that houses the datafile.
|
||
|
||
Destroys: r6, .A, .X and .Y
|
||
|
||
Description: First, it checks curDrive and stores the value there into
|
||
progDrive. Next, it stores the same value into dataDrive. It checks then the
|
||
LoadOptFlag to determine if a datafile was clicked on. If so, it checks the
|
||
name of disk A and compares it against the name of the disk that has the
|
||
datafile. If there is a match, then the datafile is on drive A or C. Next, a
|
||
value of eight is stored into dataDrive.
|
||
|
||
If they are different, then the routine checks for additional drives. If
|
||
there are no additional drives, then a dialog box is fetched, warning the
|
||
user that a datafile and geoWrite must be on the same disk on single drive
|
||
systems. After that dialog box is over, geoWrite quits to deskTop. If there
|
||
is an additional drive, then geoWrite will put a value of nine into
|
||
dataDrive.
|
||
|
||
Proposal: This code can be modified to search drives A-D in sequence.
|
||
This way, a user can click on a datafile anywhere in his/her system and
|
||
geoWrite 128 can boot up correctly. Secondly, it should use FindFile to
|
||
nearly pinpoint the proper disk containing the datafile because disknames
|
||
can be identical. Already implemented in the patcher program.
|
||
|
||
checkVer - $2b75x0 - Misc. Routines
|
||
|
||
Function: Checks the current GEOS version.
|
||
|
||
Parameters: None.
|
||
|
||
Uses: Version
|
||
c128Flag
|
||
DoDlgBox
|
||
enterDesktop
|
||
|
||
Returns: None.
|
||
|
||
Destroys: r0 and .A
|
||
|
||
Description: First checks to see if it is running in GEOS v2.0 or higher
|
||
systems. Next, it checks to see if it is running on the 128 version of GEOS.
|
||
If both conditions are not met, then a dialog box is printed to that effect
|
||
and geoWrite 128 aborts to deskTop. Otherwise, the routine RTS's w/o further
|
||
action.
|
||
|
||
Proposal: The routine can be modified to check for Wheels or MP3
|
||
systems and designate a variable for later routines to rely upon. Already
|
||
implemented in the patcher program, where it designates a7L as the Wheels
|
||
flag.
|
||
|
||
toggleZP - $251bx0 - Housekeeping
|
||
|
||
Function: Toggles the state of all zp variables, thereby preserving two
|
||
zp spaces, one for the actual application usage and the other for stock
|
||
GEOS/Kernal usage.
|
||
|
||
Parameters: None.
|
||
|
||
Uses: None.
|
||
|
||
Returns: None.
|
||
|
||
Destroys: None. All registers are preserved via the stack.
|
||
|
||
Description: It's a toggle routine. When called, it performs a swap of
|
||
zero page space located at $80 to $fb towards a buffer located in $2e22, and
|
||
the buffer contents are similarly swapped back. This way, geoWrite 128 can
|
||
use that zp region freely, and swap it out whenever calling GEOS Kernal
|
||
routines that rely on this area, and when these routines are done, the toggle
|
||
routine is called again to swap back in those values for use in the
|
||
application. This is the most heavily used routine in geoWrite 128.
|
||
|
||
Proposal: While this routine is nice as it allows the application more
|
||
zp space, this is unnecessary routine and should be eliminated. It slows down
|
||
the application somewhat, as this must be called twice whenever a GEOS Kernal
|
||
call is used.
|
||
|
||
prepDlgBox - $2314x0 - Dialog Boxes
|
||
|
||
Function: Preps the pointers for the actual DoDlgBox function call.
|
||
|
||
Parameters: .A has low byte and .Y has high byte pointing to the dialog
|
||
box text.
|
||
|
||
Uses: DoDlgBox
|
||
$2538 - Does something to the VDC
|
||
|
||
Returns: Carry flag is set.
|
||
|
||
Destroys: r5, r14, .A, .X and .Y
|
||
|
||
Description: The routine uses a `canned' dialog box with preset icons,
|
||
placement and size. The only thing that is controllable is the text. The
|
||
pointer passed on in .A and .Y registers points to the text. Commonly used to
|
||
create error dialog boxes with an OK icon.
|
||
|
||
Proposal: None.
|
||
|
||
layoutScreen - $32cex1 - Appearance
|
||
|
||
Function: Draws up the main menu bar and the overall screen layout for
|
||
geoWrite 128.
|
||
|
||
Parameters: None.
|
||
|
||
Uses: DoMenu
|
||
i_GraphicsString
|
||
|
||
Returns: Carry flag is set.
|
||
|
||
Destroys: r0, .A
|
||
|
||
Description: The routine draws the screen layout using various
|
||
GraphicsString parameters. Additionally, it builds the main menu bar at the
|
||
top, with its table located at $0bbcx0.
|
||
|
||
Proposal: This may need changing, especially if new menu items are
|
||
added or old ones deleted and maybe the screen layout should be changed or
|
||
left as is.
|
||
|
||
InitGW128 - $3c70x1 - Startup
|
||
|
||
Function: Initializes geoWrite 128 with variables, flags and vectors.
|
||
|
||
Parameters: None.
|
||
|
||
Uses: toggleZP
|
||
closeRecordFile
|
||
dispBufferOn
|
||
RecoverVector
|
||
checkSerNbr
|
||
|
||
Returns: None.
|
||
|
||
Destroys: .A
|
||
|
||
Description: The routine sets the following locations to zero: $41e4-e5,
|
||
$0200, $021a, $2dfa, $db, $de, $e1, and $f7. It also closes geoWrite 128's
|
||
own VLIR record, and as well as activates the software mouse as sprite zero.
|
||
It sets the dispBufferOn flag as to allow only writes to foreground and sets
|
||
the RecoverVector to point at $2199. It sets $f1 to have a value of $c0 and
|
||
sets $023a & $023c to have a value of $ff.
|
||
|
||
Proposal: This may need changing, when new variables or flags need be
|
||
set.
|
||
|
||
CheckPtrDrv - $33e7x1 - Startup
|
||
|
||
Function: Checks the status of the printer driver and loads it in, if
|
||
necessary.
|
||
|
||
Parameters: None.
|
||
|
||
Uses: loadPtrDrv
|
||
getDimensions
|
||
setProgDevice
|
||
maxPtrHgt ($2dfb)
|
||
|
||
Returns: None.
|
||
|
||
Destroys: a9L, .A, .X
|
||
|
||
Description: The routine sets the maximum printer height ($02f0) in card
|
||
rows to maxPtrHgt. Then it loads in the printer driver, and if there is an
|
||
error, no harm is done as the maximum printer height is already established.
|
||
But, if a printer driver is successfully loaded in, then a call to
|
||
getDimensions will place the maximum printer height in card rows at
|
||
maxPtrHgt.
|
||
|
||
Proposal: Why not just call getDimensions when the printer driver is
|
||
always loaded into memory in GEOS 128 configuration?
|
||
|
||
InitGW128 - $325cx5 - Dialog Boxes
|
||
|
||
Function: Prints the copyright message and calls the infamous Create,
|
||
Open or Quit DB.
|
||
|
||
Parameters: None.
|
||
|
||
Uses: $1baf - Turns off text cursor.
|
||
DrawStripes
|
||
i_GraphicsString
|
||
printCopyrightMsg
|
||
$2538 - issues a dialog box
|
||
createOpenQuitDB - DB table
|
||
|
||
Returns: None.
|
||
|
||
Destroys: all registers.
|
||
|
||
Description: It turns off the text cursor, draws the striped pattern you
|
||
see in the upper right corner of the screen, clears the screen with a default
|
||
pattern, prints out the copyright message, and issues the infamous
|
||
create/open/quit DB. The routine will then branch to routines that handle
|
||
creation of datafiles, opening of datafiles or quitting the application.
|
||
|
||
Proposal: None I can think of right now. Maybe abolish this dialog box
|
||
in favor of allowing the user to boot geoWrite 128 to a blank screen and have
|
||
him/her to select from a menu an appropriate action to undertake.
|
||
|
||
printCopyrightMsg - $3375x5 - Text
|
||
|
||
Function: Prints the copyright message.
|
||
|
||
Parameters: None, but can only be used once.
|
||
|
||
Uses: crflag
|
||
$1f05 - calls system font
|
||
currentMode
|
||
i_GraphicsString
|
||
i_PutString
|
||
|
||
Returns: None.
|
||
|
||
Destroys: r1, .A and possibly others.
|
||
|
||
Description: Sets the crflag as to reflect that the copyright message has
|
||
been printed. That's why this routine can only be used once. It calls the
|
||
system font, and then uses inline routines to draw and print the copyright
|
||
message.
|
||
|
||
Proposal: No change. Unless someone patching this copy wants to add
|
||
their own message.
|
||
|
||
createDocRoutine - $33ddx5 - Disk Routines
|
||
|
||
Function: Creates a new geoWrite v2.1 datafile.
|
||
|
||
Parameters: none.
|
||
|
||
Uses: queryFilename
|
||
nameBuffer
|
||
$27b0 - FindFile
|
||
lb3f67 - File exists text prompt
|
||
$2314 - issues a DB
|
||
createNewFile
|
||
$de - currently unknown
|
||
$d3 - currently unknown
|
||
currentMode
|
||
TitlePage
|
||
HeaderHeight
|
||
FooterHeight
|
||
FirstPage
|
||
PageHeight
|
||
CPageHeight
|
||
PageWidth
|
||
gPFlag
|
||
$2393 - Something to do with fonts
|
||
SetScrollSprite
|
||
printDataName
|
||
lb404a - creating file error text string
|
||
$233a - issues a DB
|
||
InitGW128
|
||
|
||
Returns: None.
|
||
|
||
Destroys: r6, .A, .X and possibly others.
|
||
|
||
Description: First turns on the icons related to drive activity and then
|
||
calls the DB that prompts the user to enter the filename. If the user cancels
|
||
or no filename was inputted, the routine then goes back to the main DB in
|
||
InitGW128. r6 is then loaded with the inputted filename and the FindFile
|
||
function is called. If a file exists on disk, the routine informs the user
|
||
with a DB and prompts the user for a new filename. It then calls
|
||
createNewFile and sets up variables relating to page length and width,
|
||
margins, headers and footers, etc. Next, it sets up the fonts and the
|
||
scrolling sprite. Last, it will print the datafile's filename in the upper
|
||
right corner of the screen.
|
||
|
||
Proposal: One thing could be changed; instead of requiring the user to
|
||
make a new filename upon notice that a file already exists, the user could
|
||
override it and use the same filename, but get rid of the old one. This could
|
||
be a `TEMP' file concept. If a new version of geoWrite is written with a new
|
||
version of a datafile, then this routine would need be revamped accordingly.
|
||
|
||
Setup4DB - $3449x5 - Disk Routines
|
||
|
||
Function: Preps the dialog boxes with the appropriate drive icons and
|
||
the DISK icon.
|
||
|
||
Parameters: None.
|
||
|
||
Uses: nameBuffer
|
||
setDiskIcon
|
||
checkDisk
|
||
setDataDevice
|
||
readDiskName
|
||
iconLTable
|
||
iconHTable
|
||
driveType
|
||
curDrive
|
||
onLTable
|
||
onHTable
|
||
offLTable
|
||
offHTable
|
||
|
||
Returns: None.
|
||
|
||
Destroys: r1, r7H, r0, r5, .A, .X & .Y
|
||
|
||
Description: First, it delimits the nameBuffer. It then checks for a
|
||
ramdisk and application disk in order to turn on/off the DISK icon. It then
|
||
reads in the disk name so that it will appear in the requestor DB. Next, it
|
||
checks all available drives and activates the drive icons accordingly. Last,
|
||
it loads in r5 with nameBuffer.
|
||
|
||
Proposal: No change.
|
||
|
||
fileRequestor - $34b2x5 - Dialog Boxes
|
||
|
||
Function: Calls up the file requestor box w/ 4 drive support.
|
||
|
||
Parameters: None.
|
||
|
||
Uses: setup4DB
|
||
permName - (Write Image)
|
||
restoreDBTable
|
||
dBTable - DB table w/ DBGETFILES
|
||
$2538 - Issues a DB
|
||
InitGW128
|
||
curType
|
||
lb3f45 - pointer to text (Insert New Disk)
|
||
$2314 - Issues a DB
|
||
$27ad - OpenDisk
|
||
openServiceRoutine
|
||
dataDrive
|
||
setDataDevice
|
||
toggleZP
|
||
|
||
Returns: None.
|
||
|
||
Destroys: r7L, r10, r0L, .A, .Y
|
||
|
||
Description: When called, the routine first preps the drives via the
|
||
setup4DB routine. Since the dBTable would be shared by other requestors, some
|
||
modifying code was used. The routine modifies the dBTable w/ restoreDBTable
|
||
data. It sets up DBGETFILES to search for only APPL_DATA files containing the
|
||
permanent name string of `Write Image'. Finally, the DB is issued, complete
|
||
w/ 4 drive support.
|
||
|
||
If the user cancelled, then it aborts back to InitGW128. If the user opened a
|
||
file, then openServiceRoutine is run. If the user clicked upon the disk
|
||
selection, it checks to see if non-removable media is present. If it is
|
||
removable media, then an another DB is issued to prompt the user to enter the
|
||
new disk. Otherwise, it displays the file requestor again w/ new contents of
|
||
the newly selected partition. If a drive icon is clicked, it will issue a
|
||
setDataDevice command and OpenDisk the new drive and repeats the file
|
||
requestor w/ new contents of the newly selected drive.
|
||
|
||
Proposal: No change.
|
||
|
||
openServiceRoutine - $364dx5 - Disk Routines
|
||
|
||
Function: Opens a geoWrite v2.1 datafile.
|
||
|
||
Parameters: None.
|
||
|
||
Uses: setDataDevice
|
||
nameBuffer
|
||
InitGW128
|
||
$27b0 - FindFile
|
||
TSDFHdr
|
||
dirEntryBuf
|
||
lb35fc - pointer to DB data (File Write Protected)
|
||
$2538 - Issues a DB
|
||
PageWidth
|
||
CheckDFVer
|
||
lb3f86 - text pointer (version higher than v2.1)
|
||
$2314 - Issues a DB
|
||
convertDataFile
|
||
lb356e - extracts global variables stored in a datafile's file
|
||
header
|
||
$260c - r0 points to filename
|
||
OpenRecordFile
|
||
toggleZP
|
||
AdjPageWidths
|
||
windowBottom
|
||
$d3 - currently unknown
|
||
$de - currently unknown
|
||
SetScrollSprite
|
||
printDataName
|
||
lb403d - text pointer (opening file error)
|
||
$233a - Issues a DB
|
||
|
||
Returns: None.
|
||
|
||
Destroys: r5, r6, r0L, .A, .X & .Y
|
||
|
||
Description: First, it calls setDataDevice, and checks nameBuffer to see
|
||
if a filename was selected. If no name is selected, it quits to InitGW128,
|
||
otherwise, it will find it by FindFile. It then stores the T/S for the
|
||
datafile's fileheader, and checks to see if it is write-protected. Next, it
|
||
stores in a max width of 639 into PageWidth. Next, it checks the datafile's
|
||
version and if necessary, converts it to a v2.1 format. Next, it gets global
|
||
variables stored in the datafile's fileheader and stashes it into zero page.
|
||
Last, it finally opens the datafile with OpenRecordFile. It will also read in
|
||
geoPublish data and adjust page widths. It stores a $00 in $d3 and $de and as
|
||
well as a $c7 (scanline 199) in windowBottom, Last, it will set the scrolling
|
||
sprite and prints the datafile's filename on the upper right corner of the
|
||
screen.
|
||
|
||
Proposal: Changes may be necessary if new formats are to be supported
|
||
in addition to regular geoWrite v2.1 datafiles.
|
||
|
||
checkDisk - $371bx5 - Disk Routines
|
||
|
||
Function: Checks to see if the data drive is a ramdisk or holds the
|
||
application and sets the DISK icon accordingly.
|
||
|
||
Parameters: None.
|
||
|
||
Uses: a7L
|
||
dataDrive
|
||
progDrive
|
||
driveType
|
||
cableType
|
||
|
||
Returns: Carry clear indicating the existence of a ramdisk or that the
|
||
application is on that same disk as designated as a data device. Carry set
|
||
means that the DISK icon can be placed in a requestor DB.
|
||
|
||
Destroys: .A, .Y
|
||
|
||
Description: First, it checks to see if the application is on the same
|
||
disk as being designated as a data device housing the datafile. If that is
|
||
the case, then the DISK icon cannot be placed. Next, it checks the
|
||
appropriate driveType entry to check the existence of a ramdisk. If a 41/71
|
||
ramdisk is being used, then the carry flag is cleared as to prevent the DISK
|
||
icon. If a 81 ramdisk is being used, then it checks the Wheels flag at a7L to
|
||
determine if it's a 81 RL ramdisk as shown in cableType. If that is the case,
|
||
then the carry flag is set as to allow the DISK icon, otherwise it is cleared
|
||
as to prevent the DISK icon because it's just a regular 81 ramdisk. The carry
|
||
flag is set if a native ramdisk is being used, as to allow the DISK icon to
|
||
appear.
|
||
|
||
Proposal: If geoWrite 128 can fully load itself into RAM, then the DISK
|
||
icon can be placed in the requestor DB even when the disk device houses both
|
||
the application and the datafiles. As it stands, the DISK icon must be
|
||
removed because the user might select a different disk, partition or
|
||
subdirectory and the application then can't find its own VLIR modules.
|
||
Instant crash.
|
||
|
||
*UPDATE* I have added ram routines and geoWrite 128 is now 100% RAM resident,
|
||
and therefore, the DISK icon can be displayed in this case. But there is one
|
||
major caveat, among others, in using this approach. The fonts are keyed to
|
||
the disk device from which geoWrite 128 was loaded from. If the user changes
|
||
the disks or partitions or subdirectories from that same disk device, then
|
||
geoWrite 128 would not be able to find the font data and may lead to
|
||
unpredictable results. The same goes for Text Scraps and other features that
|
||
are tied to the disk device from which geoWrite 128 originally loaded from.
|
||
In the future, I would have to work on font routines and other routines as
|
||
necessary as to eliminate this dependence on the original disk device.
|
||
|
||
readDiskName - $3739x5 - Disk Routines
|
||
|
||
Function: Reads in a disk name housing the current datafile.
|
||
|
||
Parameters: None.
|
||
|
||
Uses: DrACurDkNm
|
||
DrBCurDkNm
|
||
DrCCurDkNm
|
||
DrDCurDkNm
|
||
diskName
|
||
dataDrive
|
||
|
||
Returns: None.
|
||
|
||
Destroys: r0, .A, .Y
|
||
|
||
Description: Depending on the value of dataDrive, r0 is loaded with the
|
||
appropriate current diskname and its contents are transferred to diskName.
|
||
This way, the file requestor can display the disk name along with other info.
|
||
|
||
Proposal: No change.
|
||
|
||
recoverFile - $3781x5 - Disk Routines
|
||
|
||
Function: It recovers a file.
|
||
|
||
Parameters: None.
|
||
|
||
Uses: GotoFirstMenu
|
||
$dd - some kind of unidentified flag
|
||
i_MoveData
|
||
CNameBuffer
|
||
NameBuffer
|
||
openServiceRoutine
|
||
lb4005 - text pointer (Cannot recover)
|
||
$2314 - Issues a DB
|
||
|
||
Returns: None.
|
||
|
||
Destroys: .A, .Y
|
||
|
||
Description: Calls GotoFirstMenu to close its menu selection, then tries
|
||
to recover the file by copying the current filename into the filename buffer
|
||
and calling openServiceRoutine. It does check the flag at $dd before
|
||
determining whether a file could be recovered. If it can't be recovered, a DB
|
||
is issued to that effect.
|
||
|
||
Proposal: No change.
|
||
|
||
RenamFile - $379bx5 - Disk Routines
|
||
|
||
Function: It renames a file.
|
||
|
||
Parameters: None.
|
||
|
||
Uses: GotoFirstMenu
|
||
queryFilename
|
||
CNameBuffer
|
||
NameBuffer
|
||
$27b0 - FindFile
|
||
toggleZP
|
||
RenameFile
|
||
printDataName
|
||
SetScrollSprite
|
||
lb40a7 - text pointer (File Exists error)
|
||
$2314 - Issues a DB
|
||
$260c - r0 points to NameBuffer
|
||
|
||
Returns: None.
|
||
|
||
Destroys: r6, r0, .A, .X, .Y
|
||
|
||
Description: First calls GotoFirstMenu before calling queryFilename. The
|
||
new name is then put into CNameBuffer and calls the RenameFile routine. Of
|
||
course, if a file exists, then the DB pops up, reporting the error. Last, it
|
||
prints the new filename onto the upper right corner of the screen and sets
|
||
the scrolling sprite.
|
||
|
||
Proposal: No change.
|
||
|
||
queryFilename - $37dbx5 - Dialog Boxes
|
||
|
||
Function: Prompts the user for a filename for a v2.1 datafile.
|
||
|
||
Parameters: .A must pass either a zero or a $12 to turn off/on the drive
|
||
icons and the system DISK icon from the DB.
|
||
|
||
Uses: renTable
|
||
setup4DB
|
||
NameBuffer
|
||
lb3f45 - text pointer (Insert New Disk)
|
||
$2314 - Issues a DB
|
||
replaceDBTable
|
||
dBTable
|
||
qDBTable - DB table data
|
||
$2538 - Issues a DB
|
||
dataDrive
|
||
setDataDevice
|
||
$27ad - OpenDisk
|
||
curType
|
||
|
||
Returns: .A containing the value of r0L.
|
||
|
||
Destroys: r0L, .A, .X & .Y
|
||
|
||
Description: First, it shuts off/on the drive icons and the DISK icon
|
||
before calling setup4DB to prep the DB with appropriate icons. Next, it
|
||
modifies the DB table to replace the DBGETFILES with DBGETSTRING, as this DB
|
||
table is also shared by the file requestor. If a drive icon was clicked upon,
|
||
the drive gets accessed and the DB is reissued with the updated icon data. If
|
||
a DISK icon was selected, it will prompt the user to insert a new disk, or
|
||
skips that process if it's on non-removable media. Last, upon exiting, it
|
||
loads .A with r0L so that the calling routine will know what the user
|
||
selected.
|
||
|
||
Proposal: No change.
|
||
|
||
createNewFile - $3839x5 - Disk Routines
|
||
|
||
Function: Creates a new geoWrite v2.1 datafile.
|
||
|
||
Parameters: None.
|
||
|
||
Uses: CPageHeight
|
||
NameBuffer
|
||
lb38c4 - (word) Page Height stored in a datafile's fileheader
|
||
dFileHeader
|
||
toggleZP
|
||
SaveFile
|
||
$27b0 - FindFile
|
||
CheckDFVer
|
||
dirEntryBuf
|
||
TSDFHdr
|
||
$260c - r0 points to filename
|
||
OpenRecordFile
|
||
$27a7 - AppendRecord
|
||
$27aa - UpdateRecord
|
||
PointRecord
|
||
|
||
Returns: None.
|
||
|
||
Destroys: r10L, r9, r6, .A, .X & .Y
|
||
|
||
Description: First, it stores the current page height into the global
|
||
variables as hidden in the datafile's fileheader. Next, it points the first
|
||
two bytes of the datafile's header (dFileHeader) to the filename and calls
|
||
SaveFile. Next, it calls FindFile to load in the newly created datafile's
|
||
fileheader into memory and preserves its t/s pointers. It also checks its
|
||
version identifier. Next, it opens the datafile and creates 127 blank VLIR
|
||
records and updates it and then finally points to VLIR #0 for further
|
||
handling.
|
||
|
||
Proposal: Changes may be necessary to support a newer format or support
|
||
other file formats.
|
||
|
||
convertDataFile - $393ex5 - Data Handling
|
||
|
||
Function: Converts a datafile to a v2.1 format.
|
||
|
||
Parameters: .Y contains $31 or higher to correspond with ascii values of
|
||
1 thru 9. .A contains $32 or lower to correspond to ascii values of 2 through
|
||
0, i.e., .A is the `2' in `v2.1' and the .Y is the `1' in the `v2.1'.
|
||
|
||
Uses: lb3fbf - points to the version string of `v2.x' where x = 1
|
||
or higher
|
||
VerFlag
|
||
convertFileDBTable
|
||
$2538 - Issues a DB
|
||
toggleZP
|
||
sysDBData
|
||
fileHeader
|
||
lb38bd - global variables controlling document
|
||
lb356e - extracts these global variables from the file header
|
||
TSDFHdr
|
||
$27b6 - PutBlock
|
||
$260c - r0 points to filename
|
||
OpenRecordFile
|
||
PointRecord
|
||
lb3978 - modifies a VLIR record of the datafile
|
||
NextRecord
|
||
$279e - Closes the VLIR datafile
|
||
lb3fc1 - text pointer (Converting File Error)
|
||
$233a - Issues a DB
|
||
|
||
Returns: .A to indicate error status ($00 = no error)
|
||
|
||
Destroys: r4, r1, .A, .X & .Y
|
||
|
||
Description: First, it modifies the file header of the datafile as to make
|
||
it to show v2.1. Depending on the values passed, it will set VerFlag as to
|
||
control further file conversion to a v2.1 format. Next, it issues a DB
|
||
informing the user that it's converting the datafile to a v2.1 and asks
|
||
permission. Then it modifies the fileheader of the datafile as to incorporate
|
||
new global variables. With the fileheader modified, a PutBlock call is
|
||
issued.
|
||
|
||
Finally, it will read in all used VLIR records of the datafile and convert
|
||
them to a v2.1 format. Next, it will read in the header and footer VLIR
|
||
records and modify them as well. Last, it will then close the datafile.
|
||
|
||
Proposal: Changes may be necessary to support a newer format or support
|
||
other file formats.
|
||
|
||
lb3978 - $39f0x5 - Data Handling
|
||
|
||
Function: Converts an individual VLIR record of a datafile to a v2.1
|
||
format.
|
||
|
||
Parameters: The VLIR record must have been already opened.
|
||
|
||
Uses: fileData
|
||
VerFlag
|
||
toggleZP
|
||
ReadRecord
|
||
lb39da - fixes v1.x ruler escapes to conform to the v2.1
|
||
standard
|
||
lb3fbf - the V2.X identifier string where X is accessed
|
||
lb3a09 - fixes the width of a v2.0 page to a v2.1 page
|
||
WriteRecord
|
||
|
||
Returns: None.
|
||
|
||
Destroys: r2, r7, .A, .X & .Y
|
||
|
||
Description: It will first read in a VLIR record of a datafile, and
|
||
depending on its original version (set by VerFlag), it will modify ruler
|
||
escapes as to make the current record conform to v2.1 specifications. When all
|
||
of these modifications are done, the record is written back w/ WriteRecord.
|
||
|
||
Proposal: Changes may be necessary to support a newer format or support
|
||
other file formats.
|
||
|
||
lb39da - $3a52x5 - Data Handling
|
||
|
||
Function: Converts an individual VLIR record of a datafile from a v1.x
|
||
to a v2.1 format.
|
||
|
||
Parameters: The VLIR record must have been already opened and read w/
|
||
ReadRecord.
|
||
|
||
Uses: fileData
|
||
|
||
Returns: None.
|
||
|
||
Destroys: .A & .Y
|
||
|
||
Description: It merely moves the first 20 bytes of the first ruler escape
|
||
on a VLIR record back by seven bytes and zeroes out some parts of the ruler
|
||
escape.
|
||
|
||
Proposal: Changes may be necessary to support a newer format or support
|
||
other file formats.
|
||
|
||
lb3a09 - $3a81x5 - Data Handling
|
||
|
||
Function: Converts an individual VLIR record of a datafile from a v2.0
|
||
to a v2.1 format.
|
||
|
||
Parameters: The VLIR record must have been already opened and read w/
|
||
ReadRecord.
|
||
|
||
Uses: $d0 - word pointer to last byte of individual VLIR record of
|
||
a datafile
|
||
$25a1 - points r15 to start of fileData
|
||
toggleZP
|
||
$26d7 - compares r15 against $d0
|
||
$25e1 - increments r15
|
||
$25db - increments r15 three times
|
||
$25f7 - skips ruler escapes pointed to by r15
|
||
|
||
Returns: None.
|
||
|
||
Destroys: r7, r15, r1, .A & .Y
|
||
|
||
Description: The v2.0 page has a width of 1.2 to 7.2 inches, and the v2.1
|
||
page has a width of 0.2 to 8.2 inches, and this routine searches for every
|
||
ruler escape and converts them to a v2.1 format.
|
||
|
||
Proposal: Changes may be necessary to support a newer format or support
|
||
other file formats.
|
||
|
||
printDataName - $3af1x5 - Appearance
|
||
|
||
Function: Prints the datafile's filename in the upper right corner of
|
||
the screen.
|
||
|
||
Parameters: nameBuffer must have a filename.
|
||
|
||
Uses: nameBuffer
|
||
CNameBuffer
|
||
i_MoveData
|
||
$1fba - use system font
|
||
currentMode
|
||
DrawStripes
|
||
PutChar
|
||
PutString
|
||
rightMargin
|
||
GetCharWidth
|
||
|
||
Returns: None.
|
||
|
||
Destroys: r0, r1, r11, r13L, .A & .Y, r2L is specially preserved.
|
||
|
||
Description: It moves the contents at nameBuffer to CNameBuffer and then
|
||
calculates the width of the filename, ensuring that it does not exceed its
|
||
maximum width. Next, it will print a trailing space, then the filename, and
|
||
then a leading space, in that little striped box in the upper right corner
|
||
of the screen.
|
||
|
||
Proposal: No change.
|
||
|
||
runDA - $3bb1x5 - Desk Accessories
|
||
|
||
Function: Allows a DA to be run.
|
||
|
||
Parameters: .A passes the index number of the DA in an internal table.
|
||
|
||
Uses: GotoFirstMenu
|
||
$d3 - I think this variable holds the current VLIR # of a
|
||
datafile
|
||
lb406f - text pointer (Cannot run DA)
|
||
$2314 - Issues a DB
|
||
$07c5 - Inverts a rectangle and preserves zp space
|
||
$0d61 - Closes the current datafile
|
||
saveTScrap
|
||
$21ba - saves the portion of the screen
|
||
$01 - I/O port
|
||
$d017 - sprite horizontal expand register
|
||
$4c95 - Currently unknown word variable
|
||
setProgDevice
|
||
toggleZP
|
||
GetFile
|
||
$21bf - restores the portion of the screen
|
||
i_MoveData
|
||
lb3ecd - text pointer (Not enough disk space)
|
||
lb4058 - text pointer (Running DA error)
|
||
$233a - Issues a DB
|
||
$22e3 - Sets up the text cursor
|
||
loadTScrap
|
||
$0d6c - reloads the VLIR datafile and points to the last
|
||
accessed record
|
||
$851e - default screen color
|
||
VIDEO_MATRIX
|
||
FillRam
|
||
$2555 - Not sure yet what this routine does
|
||
$1512 - Displays the characters onscreen
|
||
$2575 - The opposite of $2555
|
||
SetScrollSprite
|
||
$1bbb - turns on the text prompt and draws a couple of
|
||
rectangles
|
||
|
||
Returns: None.
|
||
|
||
Destroys: r6, r15L, r0, r2L, r1, r10L, .A, .X & .Y, and since a DA is
|
||
run, pretty much everything else has been hosed, except that geoWrite 128
|
||
tries to preserve as much as possible.
|
||
|
||
Description: After calling GotoFirstMenu, it checks to see if it's in
|
||
header/footer mode and if so, the DA can't be run. Next, it preserves much of
|
||
zero page and inverts a rectangle twice onscreen. It then closes the current
|
||
VLIR datafile, saves any Text Scraps, sprite data/expansion registers and the
|
||
first 24 scanlines of the screen. Finally, it calls and runs the DA. When the
|
||
DA is done, geoWrite then will restore sprite data/expansion registers, the
|
||
first 24 scan lines of the screen, color and video data and much of the zero
|
||
page area. Then it sets up the text cursor, loads in any Text Scrap, and
|
||
reloads the VLIR datafile and points to its current VLIR record. Next, it
|
||
will begin displaying the contents of the datafile, enable the text cursor
|
||
and draws a couple of rectangles, and returns control to MainLoop.
|
||
|
||
Proposal: The I/O calls seem redundant for I/O is always banked in and
|
||
color data is being restored as well, which is puzzling as geoWrite 128 does
|
||
not support color. Other than that, no changes.
|
||
|
||
saveTScrap - $3c97x5 - Disk Routines
|
||
|
||
Function: Saves a text scrap.
|
||
|
||
Parameters: None.
|
||
|
||
Uses: TSFlag
|
||
TSiZe
|
||
lb3dff - load address of text scrap
|
||
lb3e01 - size of text scrap
|
||
setProgDevice
|
||
lb40c1 - pointer to filename (Text Scrap)
|
||
toggleZP
|
||
DeleteFile
|
||
lb3db8 - pointer to filename for the SaveFile call and also
|
||
doubles as its fileheader
|
||
SaveFile
|
||
|
||
Returns: TSFlag holds a zero value to indicate that a Text Scrap is
|
||
saved, otherwise $ff if something's wrong.
|
||
|
||
Destroys: r0, r9, r10L, .A & .X
|
||
|
||
Description: It checks TSFlag and TSiZe to determine existence of a text
|
||
scrap, and if so, then attempts to save it. It modifies the fileheader for
|
||
the text scrap as to include an appropriate load address ($41e4), the ending
|
||
address, etc. Next, it saves them to the same disk/partition as where the
|
||
geoWrite 128 application resides. It will delete a prior text scrap if one
|
||
existed.
|
||
|
||
Proposal: The area, $41e4-$4310, seems too small of a buffer for a text
|
||
scrap. Maybe this buffer should be enlarged to accommodate large text scraps.
|
||
Also, this may need to be changed to accommodate future versions or simply
|
||
accommodate a text album file.
|
||
|
||
quitGeoWrite - $3cb1x5 - Disk Routines
|
||
|
||
Function: Quits the geoWrite 128 application and returns to deskTop.
|
||
|
||
Parameters: None.
|
||
|
||
Uses: SaveTScrap
|
||
setProgDevice
|
||
toggleZP
|
||
EnterDeskTop
|
||
|
||
Returns: None.
|
||
|
||
Destroys: None; the deskTop now takes control.
|
||
|
||
Description: First, it saves the current Text Scrap. Then it returns to
|
||
the disk/partition that it was originally booted from, restored zero page
|
||
space and then quit, resuming control to the deskTop.
|
||
|
||
Proposal: No change.
|
||
|
||
SetScrollSprite - $3cbdx5 - User Interface
|
||
|
||
Function: Enables the scrolling sprite that one uses to scroll the
|
||
document onscreen, in the little box in the middle top of the screen.
|
||
|
||
Parameters: None.
|
||
|
||
Uses: $01 - i/o port
|
||
$d02d - Sprite 6 color register
|
||
i_FillRam
|
||
i_MoveData
|
||
lb3c73 - sprite data
|
||
$d01d - expand sprite 6 horizontally
|
||
|
||
Returns: None.
|
||
|
||
Destroys: .A and $01 is preserved.
|
||
|
||
Description: It enables I/O, colors sprite #6 black and expands it
|
||
horizontally, and defines its bitmap.
|
||
|
||
Proposal: No change. But is the I/O activity redundant because I/O is
|
||
mapped in already in a GEOS 128 configuration?
|
||
|
||
AdjPageWidths - $3cf6x5 - Data Handling
|
||
|
||
Function: Reads in imprinted geoPublish data and adjusts page widths.
|
||
|
||
Parameters: None.
|
||
|
||
Uses: gPFlag
|
||
PointRecord
|
||
toggleZP
|
||
ReadRecord
|
||
$2c1d - Page Width High Byte
|
||
$2be0 - Page Width Low Byte
|
||
pageWidth
|
||
|
||
Returns: None.
|
||
|
||
Destroys: r2, r7, .A, .X & .Y
|
||
|
||
Description: It will check VLIR #63 of a geoWrite v2.1 datafile and
|
||
determine whether geoPublish has stashed its internal data there. If so, then
|
||
gPFlag is set, and geoWrite 128 will read in page widths and compensate page
|
||
widths.
|
||
|
||
Proposal: Maybe give the user a DB giving an option to remove
|
||
geoPublish data or leaving it alone. If a user wants to remove geoPublish
|
||
data, then the document would have to be reformatted.
|
||
|
||
printInfoBox - $3d4dx5 - Dialog Boxes
|
||
|
||
Function: Prints the copyright message and info box.
|
||
|
||
Parameters: None.
|
||
|
||
Uses: GotoFirstMenu
|
||
lb3cdf - DB table pointer
|
||
infoBoxText - text pointer to copyright message, etc.
|
||
$2538 - Issues a DB
|
||
|
||
Returns: value in r0L.
|
||
|
||
Destroys: .A & .X
|
||
|
||
Description: It issues a DB stating the copyright message, its authors,
|
||
etc.
|
||
|
||
Proposal: Maybe add in the patcher info here.
|
||
|
||
loadTScrap - $3d5fx5 - Disk Routines
|
||
|
||
Function: Loads in a text scrap.
|
||
|
||
Parameters: None.
|
||
|
||
Uses: setProgDevice
|
||
lb40c1 - points to filename
|
||
$27b0 - FindFile
|
||
CheckDFVer
|
||
lb40cd - text pointer (text scrap beyond v2.1)
|
||
$2314 - Issues a DB
|
||
$2625 - r4 points to $8000
|
||
$27b3 - GetBlock
|
||
lb40e7 - text pointer (reading Text Scrap error)
|
||
$233a - Issues a DB
|
||
TSiZe
|
||
TSFlag
|
||
|
||
Returns: TSiZe and TSFlag will have values reflecting the presence of
|
||
a Text Scrap.
|
||
|
||
Destroys: r1, r5, r6, .A, .Y & .X
|
||
|
||
Description: It will load in a text scrap from the same disk/partition
|
||
that geoWrite 128 was launched from. Next, it will check its version, and
|
||
then gets info from the first datablock of the text scrap and copies down its
|
||
size, sets up the flags as appropriate, where TSiZe and TSFlag will have
|
||
non-zero values if a text scrap exists. It doesn't actually load in a text
|
||
scrap yet, save for its first datablock.
|
||
|
||
Proposal: Changes may be necessary to support a new format or to
|
||
support text albums.
|
||
|
||
CheckDFVer - $3eb9x5 - Disk Routines
|
||
|
||
Function: Checks a datafile's version against a v2.1 string identifier.
|
||
|
||
Parameters: r5 having the direntry of the datafile.
|
||
|
||
Uses: toggleZP
|
||
GetFHdrInfo
|
||
fileHeader
|
||
|
||
Returns: N and Z flags are set on whether the datafile equals v2.1
|
||
|
||
Destroys: r5, r9, .A, .Y & .X
|
||
|
||
Description: It simply gets the datafile's fileheader and compares its
|
||
version string against the standard, v2.1, and sets flags as appropriate.
|
||
|
||
Proposal: No change.
|
||
.......
|
||
....
|
||
..
|
||
. C=H #18
|
||
|
||
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||
|
||
|
||
Masters Class: xFLI Fixing
|
||
-------------
|
||
by Russell Reed <rreed@egypt.org>,
|
||
Robin Harbron <macbeth@tbaytel.net>,
|
||
S. Judd <sjudd@ffd2.com>
|
||
|
||
Last issue we covered the issues involved in NTSC/PAL fixing -- 63 cycles/line
|
||
versus 65 cycles/line, total cycles per frame, etc. -- and fixed up some
|
||
raster routines in a demo. One common raster routine that is usually quite
|
||
easy to fix is FLI, and in this article we'll cover fixing FLI and IFLI
|
||
routines.
|
||
|
||
This article is more "interactive" than the previous article. The .zip file
|
||
included in this issue contains an FLI picture (debris.panic), an IFLI
|
||
picture (underwater-pal and underwater-ntsc), and some FLI display code.
|
||
The FLI display code was downloaded from funet; "Underwater World", by
|
||
Katon/Lepsi De/Arise, is an entry from the SymMek99 graphics competition;
|
||
I'm not quite sure which competition the Debris picture is from.
|
||
|
||
Try loading and running one of the pictures, and observe what happens. That's
|
||
typical of a lot, though not all, FLI-type routines.
|
||
|
||
Background
|
||
----------
|
||
|
||
FLI is discussed in detail in C=Hacking issue #4, among other places. Briefly,
|
||
FLI is a software graphics mode that gives greater flexibiliby in color
|
||
selection than standard multicolor mode. FLI works by changing VIC registers
|
||
to load new color information on every scan line. It uses exactly
|
||
23 cycles/line in PAL mode, and 25 cycles/line on an NTSC machine. IFLI is
|
||
similar, but "interlaces" two FLI pictures, to gain even more apparent
|
||
resolution and colors, at the cost of a flickering display.
|
||
|
||
Full screen FLIs are pretty standard. They have color data from $4000 to
|
||
about $4FE8, graphics data from $6000 to $7F40, and more color data at either
|
||
$3C00-$3FE8 or $8000-$83E8. IFLIs are not nearly so standard; you'll
|
||
generally have to examine a routine to see where the graphics data and
|
||
the $D800 color nybbles are stored. IFLIs can add a further wrinkle over
|
||
FLI by updating the $D800 color RAM on every frame, in the vertical borders,
|
||
which may require more cycles than an NTSC machine has to spare.
|
||
|
||
An FLI display routine is really quite straightforward, and looks something
|
||
like
|
||
|
||
initial delay
|
||
loop: LDA xxxx
|
||
STA $D011
|
||
LDA xxxx
|
||
STA $D018
|
||
INX
|
||
CPX #xx
|
||
BNE :loop
|
||
|
||
in PAL (this article will focus on fixing PAL code, but going the other way
|
||
is of course straightforward). The STA $D011 forces a badline; the STA $D018
|
||
selects a new line of color data. Sometimes this loop will be unrolled, and
|
||
sometimes the initial delay can be very strange. It is this code that needs
|
||
to be either modified or replaced.
|
||
|
||
Displaying a picture
|
||
--------------------
|
||
|
||
The easiest way to fix a picture is to simply replace the display code.
|
||
The FLI picutre "Debris" has the color data at $3C00, which is more common.
|
||
Now, since FLI format is pretty standard, if you have some NTSC FLI code,
|
||
it'll work on this pic. Escape the picture by either pressing the
|
||
stop/restore combination, or a reset button if you have one. In the zip
|
||
you'll also find "FLIview NTSC". Load and run this now, and you'll see the
|
||
picture as it's supposed to look (almost -- this code isn't quite perfect;
|
||
we'll get it better when we fix the code with the picture).
|
||
|
||
The next step is to save the picture in a way that can be distributed and
|
||
make you famous as an 3li+3 c0de f1x3r. While the picture is still in memory,
|
||
fire up a machine language monitor (most any will do, the FLI data is an an
|
||
area rarely used by monitors). The easiest thing to do is to save memory
|
||
from $0801 to $7F40, and compress it using ABCrunch, pucrunch, etc. -- although
|
||
there are a lot of unused bytes between the display code at $0810 and the
|
||
start of FLI data at $3B00, these get compressed down to just a few bytes.
|
||
|
||
Another option is to use a linker. Save memory from $3B00 to $7F40 and name
|
||
it something that reminds you it's an FLI pic -- you can load this file with
|
||
most any of the FLI viewers out there, and you can load it into most of the
|
||
FLI editors. Copy both "FLIview" and the saved-off FLI data to a work disk.
|
||
Then boot up Sledgehammer, available at most FTP sites. Sledgehammer is a
|
||
compacting linker (it actually uses run-length encoding, a.k.a. char-packing).
|
||
It takes a number of program and data files and "links" them together into a
|
||
single file that you can load and run. Once Sledgehammer is loaded, run it,
|
||
put in your work disk, and press F1 to start. You'll then see a list of the
|
||
files on the disk. Use the cursor keys to move and the return key to select
|
||
"FLIview" and the FLI data. Then press 'C'. Sledgehammer then asks if you
|
||
need to change load addresses. You can ignore this for now, so push 'N'.
|
||
Next we see a screen asking for three pieces of information. For the name,
|
||
"DEBRIS.SRF" (for self-running FLI) works. If you listed "FLIview" you saw
|
||
that it did an SYS 2064 to start. 2064 is equal to $0810 in hex, so put 0810
|
||
for start, and then 37 for the $01 value. From there Slegehammer takes over,
|
||
loading the files and compacting. Press space when it prompts to save. Once
|
||
it's done, it resets. You can now load and run "DEBRIS.SRF", and you should
|
||
see the picture. If not, read back through the article and check your steps
|
||
carefully.
|
||
|
||
|
||
Okay, we've successfully made this picture work on NTSC computers, but
|
||
this technique won't work in most cases (i.e. stuff besides standalone
|
||
pictures). Next we're going to go back to the picture and see how to change
|
||
the PAL code so it works on our computers.
|
||
|
||
|
||
Fixing the PAL code
|
||
-------------------
|
||
|
||
The first thing we need to do before we fix the code is find out where it is
|
||
in memory and how to start it. Also, most demos, self-running pictures, etc.
|
||
are compressed, and we can't work with them until they're uncompressed. How
|
||
you approach this depends on whether or not you have a freezer cartridge.
|
||
|
||
If you don't own a freezer, then fire up a monitor that sits fairly high
|
||
in memory, e.g. $C000; we're going to look at the decompression code to see
|
||
how to start the FLI code up. If you list the program, you'll see it does
|
||
a SYS 2061, which is hex $080D. Start disassembling at $080D. You'll
|
||
notice it sets border and background to black (stores color code 0 in $D020
|
||
and $D021), then calls $E544 which clears the screen. Next we have a loop to
|
||
transfer a message to the top screen line - $0400. Then another loop to
|
||
transfer the decompression code from $0858 to $04FF. Finally, a third loop to
|
||
transfer the compressed program to high memory and a jump to $050B. This is
|
||
pretty typical of most decompression code; some may skip the text/message line
|
||
and/or transferring the program to high memory. I usually replace the clear
|
||
screen call with three 'NOP' instructions. You may also want to replace the
|
||
store to $0286, which changes the working character color to black.
|
||
|
||
Now into the decompression code we go. Start disassembling at $0858.
|
||
There will be a few garbage instructions at the start. Scroll down a page or
|
||
so until you see the sequence:
|
||
|
||
LDA #$37
|
||
STA $01
|
||
CLI
|
||
JMP $1000
|
||
|
||
This is where the decompression routine transfers control to the program. The
|
||
instructions may vary a little on other files, but will usually be pretty
|
||
similar. From this, we can tell that the program will start at $1000. We can
|
||
also regain control here after decompression. Replace JMP $1000 with JMP
|
||
$A7AE. Sometimes an RTS will work, and if you have a cartridge based monitor
|
||
you can use a BRK. Now return to BASIC and type "PRINT 3". Some monitors
|
||
disturb some floating point work areas; that line will clear this up. It may
|
||
print something other than 3, but if you try it again you'll notice it's back
|
||
to normal. Now run the program. After the usual depack effects, you'll notice
|
||
you have a READY prompt. Reload the monitor, as the decompression probably
|
||
overwrote it. Note: sometimes you won't be able to get back to BASIC, but
|
||
since you know the start address, you can load the program and once it's
|
||
running, use a reset button, then load your monitor.
|
||
|
||
If you have a freezer, then you can simply load and run the picture, and
|
||
freeze it after it finishes decompressing.
|
||
|
||
Enter your monitor again and disassemble at $1000 -- let's study this code to
|
||
see what's involved in displaying an FLI picture. The first thing we want to
|
||
look at is down at $1035. The interrupt vector at $0314 is changed so that
|
||
interrupts execute the code at $1043; sometimes the $FFFE vector is used
|
||
instead. Now look at $1043; the part we're interested in is at $1060. Here
|
||
is the main FLI display loop, as described above, that changes the vertical
|
||
scroll register ($D011) and the screen display pointer ($D018), the two
|
||
registers involved in FLI. If you add the cycles the instructions use, the
|
||
loop takes 23 cycles. We need to extend it to 25. The easiest way here is
|
||
to add a NOP at $1071. Change that part to be:
|
||
|
||
INX
|
||
CPX #...
|
||
NOP
|
||
BNE $1062
|
||
RTS
|
||
|
||
Now jump to $1000 to re-run the program. You'll notice you can see the
|
||
picture, but it doesn't quite look right; the problem is in the initial delay,
|
||
before the main display loop:
|
||
|
||
LDY #xx
|
||
DEY
|
||
BNE *-2
|
||
|
||
Go back in and change the value at $105C until the picture looks right. You
|
||
can hit stop/restore to exit the picture, then restart your monitor. Changing
|
||
a value like that is a dirty way to fix the picture, but is also usually the
|
||
easiest. (By the way, the value at $105C which works is $0B).
|
||
|
||
Now save your code off -- it starts at $1000 and ends at $12E0; there's
|
||
tables at $1100 and $1200 as you'll notice in the FLI loop -- and crunch it
|
||
down. That's all there is to it.
|
||
|
||
Now it's your turn, to fix "Underwater". This is an IFLI picture, but the
|
||
process is not much different than outlined above. You need to locate
|
||
the interrupt routine, and fix up the main display loop and the initial
|
||
delay; unlike some IFLIs this one is pretty easy to fix, and you can
|
||
always peek at the fixed code if you really need a hint.
|
||
|
||
Things that can go wrong
|
||
------------------------
|
||
|
||
Load up "debris" again. This time, instead of adding a NOP to the end of
|
||
the loop, add it to the _beginning_ of the loop (move the loop down one byte
|
||
and add a NOP), and change the BNE to branch to this NOP. Now fix up the
|
||
initial delay, and -- it doesn't work! And it doesn't really matter
|
||
what value you use in the LDY #xx. This highlights the fact that FLI
|
||
involves somewhat delicate timing; the problem here is that DEY BNE *-2
|
||
takes five cycles, which is too "coarse". Some NOPs are needed instead,
|
||
which means a more involved code rewrite -- and all because the two cycles
|
||
were added to the display loop at the beginning instead of the end.
|
||
|
||
IFLIs bring on problems of their own. Sometimes the display loop is
|
||
unrolled, and looks like
|
||
|
||
LDA #xx
|
||
STA $D011
|
||
LDA #xx
|
||
STA $D018
|
||
few cycles delay
|
||
LDA #xx
|
||
STA $D011
|
||
...
|
||
|
||
Sometimes the loop is only unrolled over eight iterations (to cover a full
|
||
character row); sometimes, however, it is unrolled over the entire picture,
|
||
taking up thousands of bytes. Sometimes the background is changed within
|
||
the loop (LDA #xx STA $D021) too. Fortunately, these loops are usually
|
||
written using a code generator, as part of the initialization routine. If
|
||
you can locate the generator, you only have to add two cycles in one place.
|
||
|
||
There are also different ways of generating the interrupt. While VIC is
|
||
often used, the CIAs are also used -- if you set the CIA timer to $42C6
|
||
(NTSC -- PAL is $4CC7) it will count exactly one frame. An IRQ typically
|
||
takes a variable number of cycles, since the CPU has to finish executing
|
||
the current instruction before the interrupt sequence takes place. By
|
||
reading the low byte of the timer in the interrupt routine, the code can
|
||
deduce exactly how many cycles took place since the interrupt, and hence
|
||
exactly where it is on the raster line. Fixing this type of routine
|
||
involves setting the timers correctly, as well as fixing up the display
|
||
loop and initial delay.
|
||
|
||
Conclusion
|
||
----------
|
||
|
||
Nevertheless, with a little bit of thoughtfulness and persistance just
|
||
about any routine can be fixed up, and as usual becomes easier with practice.
|
||
As an application of the techniques outlined in this article, Robin and Steve
|
||
fixed up the graphics entries from the 1999 Mekka Symposium; you can find
|
||
them in the Fridge. And if we can do it, then it must be pretty easy!
|
||
So good luck in your fixing endeavors, and see you next time!
|
||
|
||
::::::::
|
||
|
||
begin 644 flifix.zip
|
||
M4$L#!!0````(`(%>VB9V^2?#&`$``)$!```3`!``1DQ)+79I97=E<BY.5%-#
|
||
M+G!R9U58#`#/]W4W01-U-YP/9`!MT"]/PU`0`/#K9AXA"`8C*QA()C!;.D+(
|
||
M@/)'5NP#5`Z'1-817$4O2%)#&MR)?0`<<B.!G!PP)A%/%%!D(R2\*^0%P3WU
|
||
M>_=R=^\<-:L`+C>\K4TH(J)3G!N1@R[C,M,0ESB#9)63-;X&/X5AGS_RALH]
|
||
MU?/48,3://$4^=A0=(Z+95)8+=,*SC,UL<)ASQD-7GD244N26I(7",_4-X6I
|
||
MBC4.Z4P:@NG6.9FAYEV%WR`?3^_'TU_4]?_G)^KZRJ62E%2F&NV:SB\W1UI3
|
||
M3>A;K@OW+-O"?<M`>&`9"MN6Q\)MRTBX4_"68PJRDKE(S`2!?'MBAN9/\VS!
|
||
M*#N,^:M81^YRIZ6[&9!CMIC"0PJ/*3S%_-Z%/_$-4$L#!!0````(`()>VB:Y
|
||
M!>XH=0$```$"```2`!``1DQ)+79I97=E<BY004PN<')G55@,`,_W=3=$$W4W
|
||
MG`]D`%71/4O#0!@'\">-U21%:,5JJ@@1'!1\[2#5ONGFT$%PZ=A%L)_`;L6A
|
||
M@^*%Y`-42L3A&8JN#@5'Z2#/6+6"2T4ZB"XN::EW:00]CC_'#^Z.^Y^DA)0=
|
||
MN(BO;VX`0`G+?++Q-JHL*N,-FY016(280<:^@DF^S"-0KV1<]HUHWZAU#$O-
|
||
M%^#/<*`!J2JT&I"NPF,#,E5X:D"V"L]-ZCB2&243R)PA,ZXTS6FJ\[M6V01A
|
||
M8CE".,LDP@"#%VRQ*4*HN*A5>@[4X!94V[V_L^C[3-,TO2C50K;+<\[+-2]W
|
||
MO3SP\M#+8R]/;??*U8M6Q;4";[WWUQA=UP`+MGL^*!<PP1_%0Z>ZE&3SM-#%
|
||
M+2%[0@*^;`O)"Y%]$57@D9`17U)"2D*"OJ2%*$)&?<D(T86,^9(5LBA$\45R
|
||
M@-?'N^/%>:U]_>NWR\?'0'X8R([2#/=_URM-ZO-NA^>)!@W0NOPP%B46&W+N
|
||
M4^7[ZU)[*4Q!_JUQ)7?2A1]02P,$%`````@`Y#;C)NBB^O*O&@``A3$```P`
|
||
M$`!D96)R:7,N<&%N:6-56`P`00A^-RL(?C><#V0`W9IM;%O7><</:9*Z1Z1Y
|
||
MW71MDFV%619.)`MI]M:N:^LZVXI.GH4N'_:A]0JCP#XL@H!A^99A"$P+\B9Z
|
||
M<2V[HBB2HJX@A)0N->D.ADCE2J+X84)@U0.C(FM=+]6<%29KRA0YV]MM>.V1
|
||
M^S_GDGIQ)!?#OLW'EZ^'YSSG.<_O^3_GVC;)+;W;-OY;O_'%WV2,O:&R2[[U
|
||
M2Y]=O_2W=M_7"Y,O9A>E.'.H<IS]Y`=''DRPT0B[=7W=G/RMB3<&;/JWI$C#
|
||
M,;C^"WW@2Q'6P(O\-Z3\*>D'ZY4>M_/[;UT8^+L+@W,3P>#=Z[YO.M>,]6?H
|
||
MB:VWX6D:5PK7I;MME1>=ZX<J'<X?K#\87*_^\ZO.]?>67W0.O[3<X1S^O/J[
|
||
M%VS?ZF%'9L^^5_D3ZO>J\UU;Q;=>M'W71W\.R8>/R$?XH4//^^S/^QQ.^S/\
|
||
MDR\?L7GYH<_ZFG\,QI]CK85-LBS[*E:392?B[%:6?2W._C7+3L;9!W?7"V],
|
||
MVK[WJ^N3O_:]3ZQ/GOO>X9^J?WCI5PZI1RY]ZM"W>EXYHG9=>F9=??<2VU!_
|
||
M<NG3Z[X_.^)]?KWG_.:$=W#]OVG<3UQZ;CW;]LRE3ZS?_?!?UJO?-=YBTG,=
|
||
M7^K^UFMO_']]-GSL=[[PQ=_]TN]]^2O_7Y\-UNG+'C%D]HJ184>.&-]C@0AC
|
||
M&U<9LQE.YG*Q*P#GK/%)UKA]N]%@N=L;S&4X',QP-!XUC'9VNV'@C:NQP1J-
|
||
M*G,Y'#9\6<>W^,ZSP9C_]@;&V4`GE]/IM''C4^P5QAP8M)%C/V5,<G+ZM`WC
|
||
M&Q*K-AA&;#1NX^LJ1G2YG)+3V8;/,0`^KQLNUH.KX6&,^R6."9V2)#'V(\:<
|
||
M>+#A=YA.V(RQ\2-)XBX'ITYXXSC$6&YC8Z.!1O,P]JA!9C>H&W-PB4N,/F6<
|
||
MT7(:Y_`M7M29>.C&%Q*G?EQF\`,MP\Y8X#SYZPK\Y6*?H:E=HI?321/BXC38
|
||
M!F;;8)B:7C?P!I[B+FZ3:>@&N\WL=AMGAA-?8N4P`2^9Z..U>>$=R6Z#EUQL
|
||
M(RCVAUW=H+4R=.`VFXUY[62TQ)`9FKYM&![Q>VYC]#5LD.S<QETN>%FLD':7
|
||
MHP/STD@V#-`.$[@#/9S,C@L_H>61^[`D,1&&X!C"X7#!)(?E)WIVH>5<8JDV
|
||
MF^&0N`/CT*;>;HB)G"ZRJ64.QX9QAKE=3JP(04)=N`,/Z&#'G%R2[<+1U$-B
|
||
MA\37-)T80?2FWSAX&\.&PEMM^*C-M=W#1@NR>5V(2X?+9OPJ"UQ"@%-0?!-N
|
||
MP).O&8+57..GAA=C?889[3PX:CS+FPL/W*)-#0[9:`/Q7OS8H&D=XFK0'NH*
|
||
M]I3WN=TQ;N%`ZZ(E,T$$OJYRM[N<SW.+"/J:EMMD0A^"`T??>MQV:90;AZVA
|
||
MM]G0QQ@?&;TNMQTV7)S@<.''57*GPZ(#H\/B-?D704[QPKG`@ZSML?:%&+'Y
|
||
M=;P)2GQMC`,/.,]B1&P=UL1;#N'F93TS('$SBI_R-2?G()TXN<V)$][B1#6U
|
||
MU7*9RS4N.#E$TUJ<<$*$-SD)FI>]^7+9C(X2)WPMA-T,_)!<^B-NL^*&4($]
|
||
M^OSITYPWXXAU_LS;@H7?VKB%\6X)1V?&W'JQZAVW8.$JE[U<P,(;PB>`17>7
|
||
M5[@LU\:MU:O1JW*5=G,CP@,;\+P@9BASH[SBK=:JXX:3,[6S=M_+:=Z_R36L
|
||
MG<7NNZF+<K0ZKG#3E+7H`[G.*98Y+1APC'`7IBK)]ZOC=44U9<YK=>8VVG@O
|
||
M#6$XKKFO=5T[?6.>E\;'O76YL]WLZ*^.QY;[]*XNM[NK2TQH.`:D@8'AWIBN
|
||
MZ)G5?/VH<M7D]VM][AYWS'!UBS`RVO(Z'(0.GG)=KLL?R9K\7CGOZ5LSG.4U
|
||
MS_$-]#B3X4P?ZD4/PUF/!F4E3QW4]D0BP=DP8S7#]3"#07@06!JN2?NITS?*
|
||
M^>6^0R=/WE[SP'>WWGSSV;8WXZ?'N!X<A7>\U>K1H[(L<Q?&S+O[_KKMV36/
|
||
M\2P+;.Q"*("\_@H+T$(>60@%N?'K<!]G@.C3V-<F-@'DY1\11K3GB..FFNQP
|
||
MA)W3E4=@(G/#$V,'4P2C/;LHPMK1ITE1@`6#U^5S-HLBDA=N&6=_E-.5S_&1
|
||
MX/7'YWZ(&*,X>Y*DOVB2)/''YT)/DM3=).DX/>L2@XOX&@;9H*$VI#TDD=ZL
|
||
MPB_<E-WN`4FM<?[GZ/8=D/3!QBV$Z@=/D"1?[BGGN:P(DO@7V,=).D_S:Y>]
|
||
MY?SJ1Q>Y4!P.CK$71-)&BZ0-01+33\_'VH@D6CKO?.!E?I&E-G@#LD.+PAMX
|
||
MTJU[Z_]>XBV2!`M/DI3F-2`NQ(L32.,MD!B!)!%(Z.2MUZHE`9*=`[:F\'"?
|
||
MD!>7&*<.D$I'^449(-FK57T;I+X1P]'+,YERNG0474"2IEV&,7G$OY/WCM#D
|
||
M'==`3%>77?<L\U*IQ.I*IWK1?O]N*;;6UVFXKHD9>P:Z'5)W-Q>DN%?+]:-R
|
||
M)Y@TW[E!0[D&1"P5\F7*1SJ\I'`WX525-1-&-7'*KXU]?H-I9Q+M("<SS`FI
|
||
M&^52M5J]K$UKO$S(U+0S9\RUL0%`=?+D(0!$Z/'1T5')6X?)U5/SGG+9W??^
|
||
MPX>'U\:(K)O/OO[Z3>X&67RT#W/685J]JHSW]GGR90:R7O\X6>RI9#W+ML$2
|
||
M(1`<I1#HS1P$%LF3V^-Q[Y*GQA-@P6;/Z`Y8G]\+EB5/00NLK^^`!7U2_)8^
|
||
M?09EB^/C7!UJ<;7V^)SX6"2%QAZ!^CP]<\)*XE$51&&@?:AB@JK7B"KH$TD^
|
||
M)WUZU*2JL9>JZYZR=UN?_FD??;(15::4+WL&Y-$F5?P`JF),GW?SMC#)5U.?
|
||
MN%U4PAO\`Z%/'UCZY`%5\I5=^E1_0I^X?H/T29''Q?:H?+<\[5!%VB,WY2EJ
|
||
MASPQ*X\UN+U9M(F!O`K41Q;Z-/I`]NY@E>ESN5PCJ$EV*92)>M7[C644*2XA
|
||
M4?T=]OYWKEWKT*%1G(_GH5'JM%V#1GGZ.NV&H\LNP%KM<?2\->`8MB2(-$KN
|
||
MK)F\YO;T+,=6'=W=W0[!UMF"MU#(>P5;EE1598FKLIS/>]PEK[>,_:"X,MM-
|
||
M33MC"L'B&8]GW.NMUTUF<H`)R3+;V\TUSZN@Z]#[)TX\?#]#W`0YSX,N5_64
|
||
M4("^+[[__F%+M@SGLU=.BRXD6K)LB=9(1JC;\VTHY)[;(>OL'K+(G3^U(Z1W
|
||
MT.('HA4[&"TL=@]:>S6K-W;#L[H6H][;9/F?D*P?-B7KU;UD?:Z7R#IGHZC<
|
||
M1[)>%&CI0K)&#RK^2++\?%I(%B*`)&OL2;C^#6Y!#?H"BC^WNT?BD"Q_4[+V
|
||
M*_YX3;N>SY>W)<MY0/'':XN>O.<_$79/A:L7<+DSI;]NLR2+,Y*L%ERWA63=
|
||
M%G"Y/<MZO7YE?%NRY'TEJU139)*=O97?'L&JDV`IR#)FU$XEI.7P)EMB>X5F
|
||
MR4*SIDFSGB'-HE$MT<H8#I>.RBA=DF6"*VAJ"D3K73?BP#GB$J+5W]\OV?OM
|
||
MNGN>Z[&U,M%UT7[T,H=HQ3KLUZ[9.RS=6EU=]3A6N25)I%M5Y:IL:J1;;K`W
|
||
MX.BQI,MPGO4VA>N&@&L:ZG89S+ACWH+76["DRW"`K\PPV`(S$M32Z\4Z>WK`
|
||
MH&HXM+6Q/Q6B_+XE6L"T:K35.9P"7'Y\XH1%%7O]==OKKU\1DL4MR;I_OR[+
|
||
MXU1@`C_>9MLK64^`!5]N"+!&?PE8/-/GYD_3K/SR4\#B_!0?W0:+:D'[+K!(
|
||
ML@XW)6O]"<GJC8U>?]QFLRQZDJO/;4O6]?=&+<EB+<GJWB59=GZ1NX/666F#
|
||
MK7U_/\TZ(C0KY[XQ$.2@S]_4K/W/5/(/4&!0-_J4'W2FXK5WD'D'+O\2S2*L
|
||
M^MSCXSN58'5'L_9BM;);LZ*UCVN6NZ59(A,)T:KO)8OM%BT%16_-!'ZR)5LM
|
||
MM'`V$J)5(]&Z8IJ:R9^I>N>MD[P`RW#UN?OZ[F&R>MW2+`E\OKOLYE"S7E?&
|
||
M.EEU2!T=$D[47#_M(=6Z.FK'B*?7W$'#U=\\5O5X>GKT79(%5F3M,ASG[C&<
|
||
MJ]:YRE7PBBX\(T(<T&GRY7P>]2*8.;OF(;$R7!IR/Y0*]1T.<N->7&NKJU"J
|
||
MF&::4"K,=@O<G#AQ0BA5\^PD&XYJ+]07_7X,K1+1]?RS-IOM=4NM]`PQW%0K
|
||
MJC%!E9O;UG:KU3?_]U!Q"ZK,4Z#2R2@4Q`<A-<R#>Y#:T2K>U"KD$Z.]=9MB
|
||
M%U,CH]]Y?.X\9T\5JU'^UF-.8L7WKP/]'#N+7C)!Q4_MJU4X=KZ@FI=/W_"@
|
||
MOH@*J+Y]D%:9VEUO/J_*W-*J[^QSO!)0J8L]J^YI>5NK2GQ?J!!S[F*IU(2*
|
||
M`ZHJH+)N5&P(J#8LJ,K0*OD*9P=J%=T1@GS49*J:V:Y",+B'*7%VDJ%6JJEH
|
||
M6O1J[0FF>@W7CEC)O-T2*^]I;NF8H.I:G^'(N/M(KFI5.F/!*_SYJA=RI??U
|
||
M];DR?=1WH+^C7^HGP1)@D6!=Y<\<_8B?AF`9+DNM\CVK'L_J7K7B*/+^V$-J
|
||
M93A[UL804F<*9YW.L^.66O4)M:I>EDT9:@6X6*%0<(K[%B!(EDU3'+2"DB3!
|
||
M[24O>;=G%7K%'VK:R;4Q`NS]PS=OGGB?;F`$Z0B%@O%H%<3V9J`0'O>/#Q]^
|
||
M4^B6T6;3RZ19=+2KR[;[LM`LB)O'[1ZQK8WMKUFM6Z7BF/44NG2Z?]&;P?GZ
|
||
M(+JP%9Y\?O@`NA#62"-[#UG^W8<L'*,N!??%*RXD2_[%WS5W=5^ZZ.[%]3'Z
|
||
MF(L3WCZEX%7U<N_IH*3N:!;;#R\?,S4<8X,(7)2"=+#+W1)TW7J"+OENWENN
|
||
M:4*R&/_"_I*%`%E<[7%/7R:Z8%+G`7"=1EJ\AP1KW04$7$=Q8M@'+E(C4JQF
|
||
M(1A]7I#S,<4J'57N6XK%GZ98H$O<XC.UCRM6+R1+J%I3L>1V*-8WYPV+JZYK
|
||
MI%;N:QG8P^OCEF!U@-#,LELW++7JEJ3N@8Z.UWBL)5?*5?[@OJ9#KDYU4Y'8
|
||
M+<!"B.;S/9[FZ<F2+),*/$_9,_^N!U6B9\V#>$J<<9XY4VBWT&KJ5AW40[?*
|
||
MRVXU43B;$,(%*7OX4#MI58(7+UZ,/J`;7YW**<<J,6@X3F(/0-;A-]]\\_#A
|
||
M/=)5/5JM]F8RI%U]^-HBRV6[HM_8)5SW6\)5%FBQ_<I!7_,.QO\"K=,?1XNV
|
||
M''`A+V/CO>4#I(L'U_[KW&CP(+B@7<''.]K%AM@3=(U(UQ^?DY]6$))V7?=8
|
||
M'^]#%XG7U7:3Z.(U0=>IK^Y7$=(]4U7N=GCRHS7%J@B_S7CK7Z.>P,O,0[S:
|
||
MFP>M4Y[]\.H1%:%CWBUKVWB-[X_7,+2K7B\U\5)1-.V+%]WVJ\NEEG817OMJ
|
||
MUW_5T$G<3D66J#Y-O(YRNL<&O)2_W'/6ZNW%?O0*^:J3?"F3FJ;Q^]7\?,R0
|
||
M+.FB&W]]75T9#Q#SCG-HU[2&DY;W78\;0@7Z+.TR'-U2]VLXQS2E2[DZ>O3H
|
||
M1P19;&!`ZI`&+/4R'&5/>8]XR0#E(QQ^YHN$7UXP=L9P)J+N;?&BNW^\)FMY
|
||
M@.-6SYQ)G!%'K8?RR9,GY9-"O-3IZ>G12?/!@P>341`&N0%A#]?&B+";-]MN
|
||
MWKR9&6.6=C5O_U5[74*[,OA>$/8\$-,]+?&2Y?L@[/[XB%"XY7DA7C*C^SM/
|
||
M$;#'/N,UUGY,/19)1!(L,!$P'$/&A^SXA.$*I/#3@ZY)^I=%7)%D5$UV)CNO
|
||
M#`U-3.#GTE-^\W^Z['@PV@*&CQE2P.AF+W2^T'GL>.<Q0WH%.<)NYYVLO3.4
|
||
MC"1"J50R$L$K-O'1UM)<*(+-#GPXKQIOB%^V?M]YS&KT^T\S.W.__/+LR]ET
|
||
M-AJ>"VM+6K::?50Q2XNE>G5I+A914R6]\BA;71@/D).&AH:,OSIPN"/,W@Y[
|
||
M^`O'30R1+B2C&"R[E(JDDQAEJ9)*)`U'))12PG,Y6!@.W?WP3N%.L5A\RIB'
|
||
M8:(]55K4=76Q%(HFHQFT6`0M$5'BFW$S;E;2,XK5E-RLHBE3RH@:08L.&\Y`
|
||
M:G(0L*7\]-@N7@<Z+AJO'CB?1&LPG#P>MEHVFMU"JT8*:"6]6$E7S'A:3!F?
|
||
M"<5"FH):4YG*30Y.#DX,^OK]@\P'Q_M9`%/Y[/3HE^P^\:_>$QV#_G9_.S)F
|
||
MP/C]IUC0Y7[Y);399"F94!&>V6JNLE);J<TNS=Z;O3<W4TEO+:25^%0D4DSJ
|
||
ML:V5XO#F<&)Z<MJ'/<+LSS$_IO"S0;O4+V'"0<.!+XP_V#7C'S%;YPM=72_G
|
||
MTO?^XQ_^86SL'\?&8#2"Z1B%@EFIJ81%)%%*TKQHU=32W-(<9E]0M_2B64PG
|
||
M-F,+6WIB:X)6'?"#W@!8LPO.L$9_L#/8Z1],#1?F[\QW3$P/'H<E6.B.":^0
|
||
MH]U=_.1+>C%2&"F$4F-:6IF-*VD$X&(J$DG%9[2EK87*8G8AJV0U);:BY>;2
|
||
MJ4ATL63>6]R\ERRFT182H?3=]-W)83*#"3,^P22[^(\,LUT7_>W]DGUYS&K8
|
||
M"&R%G04"".4)WP1LV+'G*Q1H=FGJI70V7:C!G)2:2LXH\7A\=CR=+L(>^ILJ
|
||
M)2/14#*EAI.I4"(Q%5Y<G)F9RZ8W$=Y+\=343#0>3?]L^N+P1`#F#,(:,"KB
|
||
MP2[Y+W;>O7.G7!X;^D=,!3OLDF^"6F"O)5^$)9V2?\('.Q-%K.^E%_F4HL$N
|
||
MS+-9V-PL%C>3R6@(L$?4T%(U6W]4"<>%V778#683L6*V],Y0?[]T9=H_.-'O
|
||
MHZ$I0\W^O0A&-CP$^R8[@_V(CE2Q5`Q0KI@8WF/&;PB:@?.Q#S^\,X^,D*2%
|
||
M!`)#I805K,5B8;.(%@G-A#5L4E1-186/'E468%ET>EK7-.R7?]HW*-P!;W18
|
||
M7J8H\0\>3R)(@L>0N0Q'NE@K%LI+&M+"7!@]Q2897]IC#Y!X<0$3+6@+6JZ:
|
||
MK=Y)5Q8W]:+ZM2_7A7/B"PO*PL+*"A`M40J+A);B"%NMLK"5+2S$TY'1!#BY
|
||
M,DW[@I++Z,0.V`?M"->19"PV%0M/&8YZS:S5*NGZ(VISX2A:(AP8FA!MCSW'
|
||
ML13#82>#D.XJ*S`H6\E6BWI!I99-6VUE95%/J4GU4=8DL`K8KZU,+5,+A[49
|
||
M#5GDRC2U4)+^XXUP$L6%7Q([P@91W/GHC.$;%&'4+W6V=P9?5(^-(.THAB,W
|
||
M-:6$%>0]A(!)SDC`6K(9UB+&`X$]%G?@T9:PR(Z0K719UN[8:PKGF:58?`GI
|
||
M-#M;^'DH')^96VKU"R5&1/,/;J9+>DGW3_M3M5I]Q3?HGXXF(TDIX!^<#$60
|
||
M<?T7583#;[]WLI:$/,V.S";4A02!A>U69W/97!UPAV9H\&I6B,]R-1L0$+,=
|
||
MPP,3@Y,T,!7)-`6\,(B@_=@330O7B6E-L11M=GN-M"=Z0M]>8\EJZ60TA0@)
|
||
M)\!T-*2&6FNT5C@2+>F;^N9BQ5Q9R>7@[W!II%3"S[*AE&BP)15-I:)P9S@:
|
||
MF@F%IVA7<KE9;78685'$CY';,+B0UJVLM@!%B86F`A]^>'?S(S--Z\2:2)3H
|
||
M$3F;'GS;KRAS,SL69'GB7J%8+.&*)$-1<452R$DB+XG<9#VKE!A2N)*5)=+R
|
||
M16AG>B4^JR@KRE(\!M4HU+9,:BUO)"))]6*POQ]YM6)FJTN1YF"%".4Z-3D2
|
||
M)5^,I)J!@RTLI$MI(%4JU$!+':ZC(4(I^",2C=07Z@!0W\SE4+_5:L59J"4\
|
||
MD2$OS,TL:8WTUM;6K#*+N1ZA5>O9K1SV?B9569K++<0+D]9B4JUG[#E6&XGX
|
||
M6XM-BBNEBG>A6<LYI1WGM.R'"U*B(**+BACLM'!.1`P0Q0!158$PY)87%FK`
|
||
M&)K[]SILRE7U.#FF;G[MRSAU!OH!4K)4%ZF'?(LH5^$9K+)BUAOCRGA8"4?(
|
||
M!46U6-6U'+614*@`&=$7E82"9*ABME`X-Q-!!I^9F9VM9;>VQN.Q6*R4UN.S
|
||
ML9^/A&.*%L]EI[;T$@(0>"I+"A4@&%+?K&V:&"R-EA7FJ^1I6E](O+$V7JQG
|
||
M9^W6)_LX9[>#FD^6<T+6H#N?Q^?B*QFTSDD?Q-4W./_1A(!S5[5"7IN%W^(S
|
||
M5FO%2"QL-7()-;B,6G1K)A5#BZHCA;29K6=CF^EX:BFRF:K$4H54!;,N15+I
|
||
M>_%X,0PY":6*Z7HZGHTK5$@BP95*!6K%`H('X9/;0FV6J\)3\`+JR'2Z:7K+
|
||
M/:KE%O7)%:,PO'#A`KA[NZ,#]=(O\X_XC`:U8B82HHSU:"N3S8@P\05$\3=)
|
||
MOO'M]0_5<2^[N]QQJUJ,51X!#[0IR,T4_K;\,[<XEXH3M:AP:1?K2Y7%"G2C
|
||
MD*W^O)A1%H1S4HMS43A'AX>01+%=J=FP1@,I!"J6F2@5+?<04.%0+)$L+9H5
|
||
MS`=04<1J0!N4->(+S2B*1"U,FBLF5*Q%7[@0",)!P8ZWX:%`Q]O"1X8#HX,I
|
||
MRYO4>;>+++\[K6=(:8RN1&0J1&UP:'+XRO"5MX5[D.%W>8CS=GZ\$X7,%((9
|
||
M/X:UXCDVE:LLD964[%+Q>&LR5<RP&6_-GLXHJ:5*([*@%L3[1*R!FF-*3R%C
|
||
M#4_>*63-27NP/<@C",=8>$XK)4M1*T9'*+-%<Y1]D)G@.Y,2(&&;1DY"KH!C
|
||
MK$!2FUS1UEOI)(K"_D+@`KSS-OD(_HDOQ)&]TJ%M;U"OG3`2:U)I/)76$[$\
|
||
M-!.S_#,5NFO>H5:3R#TH`UH>0AW0'[P8Q/%.-1Q3&$7H.YY%'*5RQ1`M1:LO
|
||
M41%2JBFT*X@%$:PA*UU2LL3<25780#HGGA%JRS\/(R9#4\$7U..)1"@13Z^D
|
||
M,YG2)J7EG!:>HZ2&.LJ$*X2WB#CR%KC"Y[7*)HB;G<6W(@<MQ04?&!NRL[2)
|
||
MY1N."X'SY\_#1QU4S\%+"_&%D_&O'`]9/5.42TE%X2W#14;2:^&@5$JO(Q>B
|
||
M"*]MUBHU<`;90HN;_7"/#\>.EH>"_3BR3X5C&K$FBA_LYH*%63U"H$%LJ!Q,
|
||
MBMH=F$'R8\VZ0TA<*J1&J72%BV;H<PAGJ@A0`&MN5FB3L@(X\1V)/L1.C5!9
|
||
M&$FH22%BU:PV`ILQP:+X')YZU$@CH\X@'$M%.D"'4)LC4<5IU)PRI6+UAC-U
|
||
M_GR`7^`LA*)GFD+).(>JE-G/L?\!4$L#!!0````(`/*"XR8U.FMEEG,``/IS
|
||
M```/`!``=6YD97)W871E<BUN='-C55@,`&>-?C=GC7XWG`]D`"VW94"47=<V
|
||
M?$XP=`M2TMT=TB%=(IV#TBTES=#H!0+2#4JW=#.$2(,@78/2+=V\W,_W_9A:
|
||
M^YR]UHYU!`@#&^,(R.'G%>8#`,"'DW>B5#0"]%6GXQ0C&P`/$5Q^_=XAAY%]
|
||
M`0Q-7.9Y#'5<^V7?/7R:N!CCQ1@3P(B>.%`G`2%`L0#FYLT$>/,67G#U%4S+
|
||
M`XZX2OL*>_JDO0;R@+3_"_VXFMBG)01'<*E.R-`R@57CE?_O?6S@_X*#B'CL
|
||
MKR!:YJ>O3[]+GEYE'?Q@%&T\[--7R%.XB&O[::ZAB9OHB<OCBJ?AP<=CQAW@
|
||
M_TO&3<L`MKXIXHK@*KS=X([@WO[.]?3PP%/)QU.E(A&@IU45WOQO,(+;4!W`
|
||
M5*Y4CCT$@R<@AQ`P>\2E'7S[$^QR`D(+@..)ME$8$R?'V%_1M___$/O0Q#D9
|
||
M'-!#P=?_)H-D'.+OD/K#I5`K1RG-FL[-_0,,:YP]\/^2T.JP<&GVV35&*$/M
|
||
M8>'V>*$Y'`KU_+HA^:<*`)\?\&(R^&5N(`7UQ_4<-\R]FEQMMO/:7&V5\_I<
|
||
M;?OSQBS[$"X*4&OUIWBR7Q6MP;&X,QLJ3B[FNAW]T5MSZG8E+]0"[/(H>FQ:
|
||
M0P/BV*CQV;\<XAX8X&QS:N4NJWR1PS0/LON*.S1QS[@+#VD'\&/(%`N:ME$#
|
||
M&NCT37M"?)Y2NWIK9\^$F`)(SIL]$^-\+TT^J]":XM9K4SVG(E8)#<E&@Y/I
|
||
MRY:[9:"'1#\[?IY,8`%8(+R@?U71@*,/VUIN);J.$;PJ!;1(G6@#A-ZZ&$RN
|
||
M+88XOIV]X$584C`B<%U,@SCY]?NA9"OWI.-G2U'L`>YU2AQ<"4.V2%MWJLK7
|
||
MPXS/-A#N8EH^^.;R*21BML0IS@,;VM)@L0'W"72N9O=%<JHR"2P6NF%OJE;9
|
||
MX:]6[I7'7%E1W#7N%U$\E@E#P\@A=ZI.NB%61#W2K0V2W!72N2XF#[Z-_IOT
|
||
M:6##%^7;@J?CLR'U^<TB0XI,`($MW5`X53G=4(V5>_^Q8E84^[9[*SI'>L(P
|
||
M3S>W.U4U:)B:ZGN_$A<^&N:`^V`4E[;[[W2JA@`26[IA4ZKF_.%H*_>%8^.G
|
||
M],KNQ^C<UPG#P=U![E3M(<,75%VOJ+XF))-JP;00UDCWQX@:VX#P&@)0M+$F
|
||
MLZ2N82KA7U;JTL>)N+C<ZJ[QU:/;>\M_]_[]2)ENV1ZY7OD?#S57OKGM:4C:
|
||
M]%9:Z@"I_YANU1,*'NFT_C$^FD]0&Y>/FV8Q*3.S$=!QKC$SLA&D?BTM6N.B
|
||
M+?SMPU;`\#/T*U&07L+WE/J<K$\R.3$RT:$%J=1##M:T)[L=KA2Q6`0=4>-Y
|
||
M2S<?QO/:;^+&\_9O@L?S1FY2Q_/N;G"?QTXI1R@'V/$'(O0T$0Z>;GC;`:\!
|
||
MEJSM@?#MVJ";_S3/BH\H@@Z+MS$Z5'"V0QT_:GXL7CT[`AJ4<;9IVP^_*2%%
|
||
M6]^!MJUTK10!C)+0U`/ZU'\,HI+A>=@Z@]<8OT#FA:L(BD3:'ZZ!QE*L"HG%
|
||
M2`Y&=%G)8*AN^@V3WS/N[KTE%K\DMZX/I4K85R@#<X:#`[)&U1)6,29^AB^]
|
||
M>83P5[_]^.RT60>]R%C>9=`)4>']X-O&')MB^>3Y^[]@9LFXI8.WGH4NJJ6"
|
||
M4+N7+KV5.4AD=#E#+5.).);%>IM/)FM/-RG*RP=[O;1+AN(#US>9@D"5YR4P
|
||
M)&M19&[?3\U&2!3HY3\);N=70S)38:]X3R,20Z1<WVPQ862C*>(>VL`&XYW5
|
||
M?NNP/:1#?UO>KB@_PF*$L1U@X5`?'\2'M^@LC]VT$[A1L=U>'5AVJ[AVJZ0:
|
||
M9_<:_R#ARQ-8=EV:T./C[<$'2Q3(\@T\=_!^`A^^.>`F-">:E.;.B)3OW_[P
|
||
MVS0\=JQ>:2F=I5?!&H`D'G\1J<=%8R/K]NFV;_VE''H`"?V&I<RFNGA&=6NG
|
||
MM2_KGHO&Q')WA&P8+.G;1D4,);_9(Y%\MIMKA.F;PHDBY+UC^K8A?5FJOAY-
|
||
M*Q+5\[Y!AT'PP*=.%?T63V,7-X;M_)DA,:B/4+GR):-.(J>^]VL4&Q7LE^]<
|
||
M(P:A-T]_ZASF8M*53DF;W,B4/,Y^J\]0,4TB1"?04I#2@>E'1@!(<U&4`DP-
|
||
M<F+*S(O57OAC7\:'<NF.;CO6==XNAT%YENVN0C^$WG_>^T^QN-ZNLW"\I-TY
|
||
MOG*L+%#I4V&,<UE@2'$H922O$_7!2\H8\(<2U`1C3")M:S(==[2[HAWI"L/L
|
||
M2=!7U)2JE#QZ+T0U4:)ODN,Z))\!8>L_9["$>X&V^%NV70L7]#HB:(L)(0+*
|
||
M>.M3C#X35_1)LN_]S0MW=,+9]A<?\I3ROOF`@_O`I%_G4+F8+1'D*(BZ[K,_
|
||
M6["92^H#;H>QS1]C3KC'[FE@:U$I@JY[7**W:=6*^CYKSQ,V_-6YBB$F"TFC
|
||
M9!U:T/$*.V^[+;NIAP0WD<1EJJFOLG]>BF1]C@OO5ZZ.@LQ>\Y*DHYSP,)1?
|
||
M>+I:;/EE'^9,TDF)M!%/J^!PE9[ZF^?T&)2V)QJ6CN6*MV`:HK=GQY`YJ#R^
|
||
M_>OS2>N[$NB7B&F4PC_/%\3+142FQE;8.A?V4HBIG9>;,F]V1(MD7CQG>97A
|
||
M:7B),(KXQHK$5<G^0S["4N`)9/_:QBC\5Y$&2[&ZLJ36L7(KQSB43YCHX=.Q
|
||
MX2W*W23`^.6LF@A,6&+\BGVEJ_K\1#IH#NWC&-'LTGJRO%<IBLJX8HO<<=GC
|
||
M8_Y+W1V$L]J;@%>?_,=8(K9U/F-VY'?21]S;$H<3YRM!ER:6"2UF>-*[7SZ#
|
||
M:VC:N6#P.(I1$=.I\=+_"46%GM29?L:,#P/C89#?'7\O^(R)"`.#-TY0'?ZS
|
||
M<8C9`-K2!YQ<%&K/KT=.+C2T%R(O']8'50C_@?:J'Q;Y4VD`XR/FD.IPC`;N
|
||
M6%P2^-.7K(*JYCX"[NKX]^X>20V7HAF4'18T7_L!F)@SJ1VNESHF61[M'`$(
|
||
M_)6CV7;\'C4`Y,LV8P,$`(@#M,2,7WH8TO1C7?`*&YD1=']K&LQRLTTEYM;2
|
||
M_6U'`U&^;^XC`<,*KHZJA/M0/-/3`P,NAU%1FRQE)Q;X1;K&WZ_J1=@7?B=(
|
||
M]+M43O&N&VFH=0=(8?69DYSO44B&)J`3!LK$O=]?#RAO^(/WTN9+YYYA106G
|
||
MXZ=/45;R\D;[G`2+69QM/T<6CXZ."5'M<68W()-_^`_RBYK8W\XO>.>KY_*.
|
||
M'RT$P8]4I[[XKB+11R$ZF)@8)=%Q=UC7=_3=&Z![</N=_$.7]`!/@0?R4_%5
|
||
M:'`QLCFM^KCK.,.XQHM=4?IO>^3<4A>OI,<6<<X$U?%Q7CS"#:XM\Y(L/O$X
|
||
MC]!1/LVEU,450U146]O.B>OG>H!2@8^2)8F2*"N7J:"SDGJ04I^?4KCWBZTO
|
||
M/^]A_)6O3JX@.,'&I!7S?^H8GC$R2YJ<_BA2S/+K%__M943]?9I1/TX;;A-G
|
||
MA--MRS`MLGG:3PH**2[Q"110*K-`B_C6\=GGIB].DY"0\B?#-/]4^0O;*R`T
|
||
MC30X#(@/)@"QK,'10`#^E4Z@UM')^=7M0\B"V^G%]=UCZ/J_L\N;>T18M04N
|
||
M;H<2<FX)T(I'#@5@(S$1(?Q$@]S4#/>/@`;P4D)*1AY@Q<)!K*E04#%VSVBM
|
||
MJP*B"HHJ`'M[`"DG)VUWV>O'NSO+N\*:'R_WB`<TYRW6[8^#HI26K/==3C_<
|
||
M`?_A;[-FR1GNC9^12UJ<JQWBN7UYNT@U?G]\]2%`BGKY*I@R^D-N]/>C;_?A
|
||
MH"Q,:NLL="EBF9=227?XA5KQ9R<OB23PB]RD&=8$3G$5QN-_*X[GJ=^H'DL^
|
||
M"\`OY/G?.&$'5H%6_(#:L522!'[!8_SAB6C#@P%HW:9<T9>&^F?HASD?YL"H
|
||
MD-5\E!X$%0#V#"+Q):!CTK8(]W:\*\+?Y;J/@Z[6'+^YB0.^1&M%U[&><0[1
|
||
M/F+L3UTS<O1Y?7GYPO[X2LGRF4"?-Z'X"P1^N'?P9_E6O%]52KW?4<87U#!\
|
||
M2Y3YOH^"Q"O#O_GZN4_CC.VJI0,__RYQFDMC/_9_&VDWEOS1_^Y80?_34%@%
|
||
M]MW;L`K-L*ION7?F82-RW_2RV.@'I[@:Q2';$C\?QYE245X$-V_>9M&$08CF
|
||
M/;J/":M/E1\9[";E)R8M/A^+(6*M?*09ZXZW)J[$45=BJ"L)U)7XV4M\:8)M
|
||
MW<\G4/5F"9QF"3Q)_,^QD+CX"=%K[+"N^.W9J_T<>C<T_)BF&)'_FOX3^=3T
|
||
M2>1CTT>1Z*9HD:BF*)'(IDB1B*8(D;L>'KGW)@2PKD'ZM&WRX711:5&)?B8?
|
||
MORNTGF;10:$@#39O-[_(3SEJS&_%G/']^S[\E?N\9!ZVQ//0*Y'TX_Z-A%P-
|
||
M^^LJ^>R7ZZ0Z+J&%L'6)+ZZ\"[4B!*Q!VMO2^';2>"72>,[X:N^^AFECA;%B
|
||
M(0*P0H\QI2:.5>O%I:>L><>P_37.G!:BK.O.?6%?8P<<F.;`I1_25IF68OOT
|
||
MC&@P+],<6)8BB^\83;!*+STX/"5(AU5?A)Q]=!=+Y?OEA-(-I)ZC43*@JXAR
|
||
MIU(107@RF_U\E7?N(5YF<!K.^'8X@82FENZ5,A=^R)[\WSOWB57*>O$?!_@A
|
||
MCN^")CJ)R/*^T[1^YF/'1]"IO3.?8B9I%.^MQ`\11ZRFS*:A^<-7R,%.XX\W
|
||
M=H\O,P3&N_]#6S>5;U<5(6MA>AW=+X1/:$-,EFB+CSK"&2,\BUY:/S81%8?6
|
||
M!TD?F/^T"X?-LJ"3;>Q1CA(3PUN1(D4]5T['WF[N^((R.*1A(7@[.Y&K#"'H
|
||
M*"?KT0U##(B/2.;+7E/'U?ELW\N0%6%M,G2PMD;.REG5EF90<LMO*V4.Q"W/
|
||
M/B-Q'8,>@GSYT;U+2AW@_5LR=_!B0O(@TY3H4;.E)?XW3%Z++CR0K81%^]6%
|
||
M-4KEM#JS0_IUZ5>D!D<&F6OM$;<S([?'/U(D./+/80NG=.3IZOU?%KI:#]PO
|
||
ML2'<'RL+U)4+OK>/(8$[M?J0!NWE4&_TK3F_(`8&$9'8[0,J-[O875H/;*!^
|
||
M\&ZL'M-DI`6M&?N__?W&QD--P8NUDO<?/@/;R.][E-[D5U0]CRY=,SYH?PXB
|
||
M>HW=(69?8>GXSUT90N`9;-_G?\XZTH(0B9CY]REY21\;%>O!V'&HE2`D;?L1
|
||
MJRA51P1-+4T*?HAI[.JEY<>9@:7E=LH8B$]B^VUO9EUFS3MTD+HR>!5TN2IT
|
||
M?^N%X%W0.^;'ZJ%@<"9/B.MAR=M$PO.N,_FN9S^FS/<',O2@J2D0TABS@$?_
|
||
M*?9X-0&N\2:?L825N,YO_=PJQ"C;ICXO_NW7/TJ'XSIACF`0M&WER@B]C"`#
|
||
M2^7O#G_4VK$0>==UH8!/%_7]I&!N4S'S/\9Y:5[>TRRO?^.D(O[!C#XSRQ?7
|
||
M\]?[2Y&TN*;M^`0]\$;\(W'Q6_P_L8AHJE/$MO6*Z3O;%9,N[&!7KF]U:&4K
|
||
MS[M8:&B-TIS7CW4X!0T"R#\LB\0N!38ZLRVG_UE5JV\P5YPQ/LG8J_P+H2>/
|
||
M;#ZN<_SU/2`&0(+RNMINA^&&_4=6]93]3?;V`2SC$KI5*%[!FK>3BM8_%SA]
|
||
M[Q%P\R!K.&M"1=2W.0]<[RS2MU2F#9`'V*%,/P"._BS#@2*^S!A1;V8P>?-X
|
||
M:*VM2`,Q_@"ZRSW9G[MC?)8]D%$E#^9C"38F&R`I?>/TF%@4]'`O3*(B^_UZ
|
||
M)P7$!N[YA.OSO90V-D?`)U="D^VCP-\':(I*AX!AWMUI8G$.3$TA]NN\UG1/
|
||
M8OP+`?U-6>@7&_1[%I8AP%%-1@LYAC.,A^WO/P@"3$/,B@U18.(:\071/N1K
|
||
MIP)H2Z>EE7H*YC".YIAT&W2V*S.^Q?12D)<;OP4+CN"J;A\_JB"CTFI)X?K/
|
||
MZ6%<&G]XV`<33>^\X5M9,2MM03'[JR\ZOU2@P8_+AN@PTX6P@NVP>'7UR`6S
|
||
M369#97+5`(AO?PF,#-W>$!V$&\QBA$NJ/0>[6VM+1N#Y!4O="D0.+*FN8&PJ
|
||
M"Q]<B=XH#[ECY(F204/H)KL_6LY$SZ#/(F%XNHC#UI4BIFE(L6FXHD4O&$17
|
||
MRU(OZU`X/#@\-O;0>;#N0/:"X,44_(-R>28:#-:PM0E1@X8NK!IB2WL'6ZPV
|
||
MLM`U0?^E@"I'+(N75M=7+!X`/FS<L@B$4;@15(4,_(%%1"Q:`8)I"+Q0#D19
|
||
M&#/],6<:($S2\EIT8_`F1$`^B`2#(@$<V:.?@>RUM$`,E@TJLL_(K!EAI:G&
|
||
M`7@PT`G@AF),X;?^#GMW>E3Q:G#>TA:N"/K9<=LN;)$%[(>NN\E7CSW[9@2H
|
||
M!=3<-7;"<-37FHLQKL73$T"48>-7PE?JC*"1V!W6N;OA3<('FL!('R=A$5J,
|
||
M;O&0>.DPDW$)]W])&*243'#2=*>LMU(U=)+#&$N.ZZB@%__0+(YITN-DTPPM
|
||
MH&'^9#J8MY4:_=2#R;'7<)!//Y`5\'/UOV3/EC=B,:!7(6P71+-QUY9V68C5
|
||
M0<<@9`P.-.KB0UJ<IA,(DMFN-'N`9(G+OB(&"S:8F2"#*0>1L[E!#.OP@F-^
|
||
M)#;^)"].6V1`F]KA/ZUB?J&_O%A5'5M;I^^_IU'_2C2"O_"$$W7>.DI-?-17
|
||
MWW^@X,5=MZU'DVR--F0J!_VM$28LUGFLZ6J4ZFP<5CL8IV36S=P=TV_Q:8=A
|
||
MV!"G.&L*C#`\Q("9U[W@/QRO5P=3Q$)?#>.(Q_+"P#2@'K"Q610MZ]Q;&:R\
|
||
M6:?'(CY?,K&,M>9'L-(?7L`;$WMMZ`W"P`F*LK9G#7_:<0_IM;4@P#Z`_#+T
|
||
MK'WNS0QHEQ+3MO^Z^JM@RW^.FOCBZRFRK0F6F+>GXXDG/2LRH(%YMS(".F6J
|
||
M3_;`%U85*8'KEK\`&H2?J1CEC7$[?E3-W<O)K>/+A<,?MXZ]1FOA095"P$]*
|
||
M[9@L>)V&NT\"B@Y<4U'K+PMW%BH<8ZAU$F%X]@PA-'![.S97`8G%Z:-ROQ5_
|
||
M4*%G`[KP_UU2I:$#X0-J$UBJ4WE@,#?7AS2^DZ$<)'J[8UR0$-E;.%B2`_#D
|
||
M7`YQ>63E![3JI+FOPGIK;T[!O5VB7T1XD6C.E?I`KNRX(BAI:L0I4"0-K&8W
|
||
M/0\?1*SFLG,AP'U(T9^.(KX5<9.'3HS\#XQBL#Y$K$Q%O0^#?/O8PP.>E(`Z
|
||
M$/8NKFJ+BWM2[E3Z'\)Z=-SL']0E>'7UFUL,<4Q^"&8"@A1SJOM=7*J/K/\E
|
||
M;8@#P=2\51HQ@SOO)JR(.;^(E)D,&C'@?,H"[MJ$ANXP@Y!+^@##@^SBBCT"
|
||
M-J$PP*KL`V?`N&\[.B5:CY^C')H-M+<?X*&NR?:^34.'I\)K09F5?C8[G<,R
|
||
MY=AJ$#S\HZE7S2C6*Z$Q'$A-L3;B_`$IU(/T:*%H,02_3T>XI<#1,D*,E!BC
|
||
MMIJ$'BS\A#9AP1#R=`0_+3\)@CP,':380@9@%1X3(MZ'RZ%?"%SRT1I3JF<Y
|
||
M+X7#(3K_X1'5X"FTU_>MD06_WRJF6VT2X;?^@M\'AXI&Z$;.H?-%`I32;Z4V
|
||
M&8#]1GJM^H9@2@Q+TQ1$^J9*,4D2OO`ZT,6S<'4D><1WE!EAU]I:?/TG8`D9
|
||
M&[:EHZ3]GN,0NM-^!H=%G4C']]?@OVYER3-N,S&NVD`%\[O2Q1O]2PN"4E5@
|
||
MD$ZNQMZ]2/$>G'\0^Y$&$_X`7EDML:SE^^\V:LHTR!#=6=XR.'H$?7`TB`S"
|
||
MP514@B_-Y/@?A0V.G?-O1F$RZ//<(``>^*"&K/K3,^MLXI,&*\7_R8ZDZX$D
|
||
M5*J#N+BE)8YO_S&%N+5[!YU&9S`*\(+:YD]82$HH(A"OYJ`(!-&O`H(&76CP
|
||
MH(<-PZ/X[84"GL2=K&@@2EGEF;)7*YQT2$U*KB^WD56^4UKL,(47Y["?%_\'
|
||
M4_:*.=L&)SE_T0BH`N1T/HHDD#41AC__N8(%:ZQ1.\;EH[G/,UU<#$\S2$]7
|
||
M6J4'NH.?*UM'D<'F%Y6VEJU5_*"H+B23]&]&YIN%(6'^?1C&-1DU-B^^G#PB
|
||
MS##BS`GM-9TA+?:P+_C3Z1P2,^!S^Y]:A,,GQ."T(E.YDL"*;GYVW#42'P>C
|
||
M-Y9((F<%>^0O,8!D1(I>?N\2&/)6<:,<!]=`B`'"$')9QHZ`^Y\>=*G)2=14
|
||
ME+&T5PCA9HRIHZ/6*4S6_%\N@.$8B[$A(4(ISP-LM;`<:O3,UH@[-XCE:(.%
|
||
M'W\O!`1:F9F9K5IWF=S<[.V5DJT#M,TNT)J7,1P6XT%GPP#&EZ;/@SO8.(_#
|
||
M)QH"AR<N,S.]7WIY]F.LR113^ORL'5X4PIG@$"PD3P</)Q,.+YX+/R]4^%!&
|
||
MCG\;IP9[!SR27Q?;>E<'()0U"8_E$%UDD=TQ8N)#G)A"W)/+,GCKT@)'+P>0
|
||
MG/ST$USA<%EDMM-`7-P<J6R5C375N@>R1YG)XK[AW^K&"IR6$"%B`CJE8P:(
|
||
MLMO[H;(,6/H`NB'N2G#PC/?SM'!X*%*]\R^@:#658<1?SUVDW6A(SR=-C'%S
|
||
M_`^'7_?YW=Q5>NJ,/D"BW,^-]_I[C[AKE?O"5#B@"`I8>2$Z$J*2"^\>6"(]
|
||
MZ.D\'<L8JY!W"&6JF>BI8PT>^P;(K[\R^9E0XXL6&`JRU398"]"K$$K1[`0Q
|
||
M=^V-![2_UQ*AY3HHKYPDUWA?'_53@#M/SF!PFF:9,Q+]%_LL!_3P$70&;?'[
|
||
MNUQV$%G]7"PN(4Y+78PXLY(7:B_N$WC+UE9STTLL$1S:,WE9J1OGWBEDLO$@
|
||
MHR@HM0[/^OWGY9MBLF=P\CL,N]_P9]:"<+S@+UY"8P=25L*B5#V]([>QV)R\
|
||
MY`1?FANX=HK?L20!L3@MBFBE_T*5F#XEI`RG(PP9X]*CLN_04BIS<[4PT"$V
|
||
M0#\H"%[AN(T)Q:/1>@/,&ET,*V#".MA7:8YUY]/X::XP"7/MMW_B:+^A;;=&
|
||
MPJT&$_G4B?0'/ZQ)3I;@.,@_WKSH$I-"\O_;9#&AA#T#$0FWU'`A1>^.HDG(
|
||
M0:@7[P7"1@')DW52:]=87NB?2;)78LR\AC!"(^5#B"'S(R</#YAHK;J2TTU\
|
||
MN54'4(`Q`S,4]KVZ_$V1-3.HZWBD6XWD*?"727HJ-UHUL>B0X<\[J./H[+SO
|
||
MBA&"D-5;RISD.AF!Y>G5%!<5`KIQG_AEI9XY.!IB`R=\Q),,/#4AF"-^_JL"
|
||
M23?^V278UTC]61H`34$RD@D[\=QQ\M152+SX"UAS4E22>W-D9D6_XJNI,)[S
|
||
MY#;=S\JJN]#*EUZ0@Q*]>+7<$1YZ,(HB,@^RW?I"^L;A+:`YW#4^7-^UK@BG
|
||
M*F+0)F2&Y/,AI()<MZZ"<%<V7&:`&(C4G&+N8(^P"TH@CM9CNO\MS9H'0HU^
|
||
M%<TYXNO!CQ_G32Q@-[0O!HPLMI@(]_>KK*P8@#!?R/"1-%&W=S<=S^<)!RH?
|
||
M2P3EBR)RF<TPTPI`6.!H,5SO,B4U),%Y=)/A4(XJ"4^]9N.('XE%=OV1%Y!"
|
||
M=G6!36Z'*XH4WH(R+=M+!A>L1)G@L")`QB3Q&L'Q][%36L6<]JV./0HW:;!H
|
||
M`-&?O:7,:6H#$MHKQ"CZK?%^RRJ/)L@VS_KX-8)6P<$->E"#)R;J6U0KQHR;
|
||
M0.9UN;7"LGK"SQ+XX,-7`Y3(1_%62+>]W-)YV$<*U\;`(DG]F!F`<?_&H_7.
|
||
M!A-M-$T%J%5]^S\:@JB,-)`A>N#6\JV%[=_;C>:FFDOAE!D7K>]PB/F(CU:P
|
||
M3=0ORXR=A;U1;WGYO6L8]@'A:5<K+=/*HE#EPHKMGU-7OFBDTI+=\WX;@(#A
|
||
M[>._FAC(G)B$;P57I2&YN"@GEV]P.MD/N^4!2_09,FCPF`3#WHG!L=+]X.BJ
|
||
M&M2#5@_!_6*;.I>"0<]HC/ZKXZ8E#_;P=4]SAVI&KS49NH"Q!=V=S@#R,VEO
|
||
M0MC<"!*+XQ[Z[N=*.@`)#EZ6Z"\";06G'F8A./&)V19-BF!U[3_F:6,+S2$/
|
||
MJHDP7GR).SR)>KOA8QN!U/\`96_X3QU#:(]9+LVXE@`7Q;+1N_$Q+4&A)H/P
|
||
MB*\6]O?-VPLH(=%U)'X]W!(AM(@>B6Y+DPFR`?((9F#ODUCPX`8_YE[Q-WX#
|
||
MU#+Y*E?57O1_1;<-S@QW')R1^S<BS"MP<HS_,0_+A!<?6J^>2@PX"[TG2N"N
|
||
M9N2D<4**F_!B;XH]O$(W75)"*E2>0`JVC`S1+=&/-H,OZ4$IH.+%'I4<HHPU
|
||
MZY#D>)G!]FZQ'`E3U.'Q?M<Z2N;%^V8,F=@ESI4K,(5;#`2A2!8KPH\!Y=0G
|
||
M?;2"@\4;":-H0A04/T>FIR/,#6E-D;S\8,^(RC(9'[2X,8U.GZY:AB]NV]$$
|
||
MF[@QWE*_5")!.2*R/0,@M(['2+,\3'X_-T(_*C*`Q7,`UAGTN(F^:0BN7`CW
|
||
M"19:?'_YB+&(6$=B8%X1K8-X)-N^W$Q)R50`!000T3Z[)9D%ZQ)"A=@=1B0C
|
||
MO]RO[V)M1Q*,*7`NHJEH7)E;&E&G+Y:04)SOI38`KS#/W!4FA"I4/4MI9V"$
|
||
M=&8D'`Y-0[=,1T!![NP/MB@?=Q%"A)4G[A\FIW3B%G*QCT]4)/`&H$@*BG]U
|
||
M['L?=;`Q1EN=&4]PS,&+V9P1I/O>)`W-$!:\P9N_-I$S-(]S(P!(;1>ED8MO
|
||
M=SG__"K:[.^;MZGU$6$Y^S,G5WI(LW^]?_RTTQI)1G>%7U=]=$PMPBJ?"%E%
|
||
M,_`P@E/9]6,'?VG?%+0J.,??\;S`9GC[30\Q)<VM=""<&I=V<30Z,X1%2EPN
|
||
M?(<[X$06^&!C7_/JF7KJLC,KF+>]IK%F_?TE03[?S[_&7%4=?TIK2%'0$>E^
|
||
M1U$0&2"PZ(YUM<@C&8E'1CK'9+>#S%=!R+D'/M\H1;S:B`1A^6Y&KV9G#9ZE
|
||
MA&-Y2P6I3KOBRUS'0C)^(_%+_`(>`?X_K"$NYHT!JL(X%"A'M;7FL=Y#7NCF
|
||
MNBO+-TZ^\B@.#1_$\X7B3>*ID7[@Q_7@YL`1FRA0$[KF,QSU?K8_VYM\'<M1
|
||
M)XKN$:H5RG"=6Z<V_<@21CZY)>(S1/+\YS/>-6$L>U[(-;[G,2_M6[@/83*+
|
||
M;_04S]&A+.>*1AR_#%U(C3D:@>%LRNQ<2E!((U?UU)DAN0]NRO-4#@=8&KJ%
|
||
MT'<J5#3O$Z`MX7`_*1EN_+.Q1W'T6@>U-`'^F/9_K:?8!67RB8#T;*XC5\;/
|
||
M`6I#F)6[1EK3K0VHL9G-GQ>O!J,DO<U,F^9MX/FTSH?18(%=)`$Y"QB]SK$Q
|
||
M$8CUI2$B3,>A&NV;T4*0170W9%\'K\@6Q(2^MLRS@5-3D3X7AL)!_Z8L'3TF
|
||
M92U]+R_7`K.W1ECQ(%BUL83BD;7AZ5PC\EP1,7!,5(HH]65JU!`>Q,,#P$!D
|
||
MH4UQ0B#'V)BX(0`ZR0/($()>?,F7`MB**5G]$T($/L1.B-8J([FQD)0M@E-I
|
||
M0S-7>#B`T`08);Q8"95(S:'%?H7]WW_P;_@AM5GOTT!``AGT#,JZI<,+?>S!
|
||
MV?P/-2]#]YP6EZKCSL8&L/^[]=ESDYG_/YP+*&R-.O&99)T13],<J2(9<+!/
|
||
M54NV5J-PW@_)UQ'Y+S'C9C%$+#'S++0W#1F]R3]XS2E-^>,NZ$.5(+9"MFV3
|
||
M"3\EX`/'L5^"4]BHI1HCG[-KK?"C2&>S=ZZ2?>TU<IV=!T;>9_E>X&T"C3Y&
|
||
M?"F\>`+XZ]WM79UPJL93*:L;H]H7&27'=W-GIOR1_V&_<J/),1=A,?>!4_`H
|
||
M=IC]I//"C<26&?OK(J`1,BXZ':\T>T7.Y3L;ESK^9T71:MUZ5G\5H(R?$/II
|
||
M`_<+_,UG_[5F7F:]T[%>@!?]L:^^S:Q&W-S$U,T,3A+R/8(,9V8*`."%NG8G
|
||
MDAT2KS(++)V:1M3E91R*`P?Z!T>R6-!?#I&>&HO":8)3E5%E`Q[J63^%H-'K
|
||
ME;K/SAC>D[>T_D:R&;W#&J`!P.9EMD<_E^HLC&3OAS="0JD%MC/)$1X,Y8YX
|
||
M_^I54>I<NY_N;O.+./='(#PUSJVJ9(3"N`Y4CN6.&^TY'[;^L9>;%;FP*=1H
|
||
M:'V-.HT[^L)"Q90'`M'9[R3!NT]>%(XI/+M*@^:4+!;]_:@/NM\,Y$%/'<[$
|
||
M&X'DW6K:9$736-KHR(3BP#$>@NR&@E=+><2<1<BU0E.LN$UKL#<%#M_MIX-A
|
||
M(Z",;VDS2<J&P851-?(FJXMC*-BPT4<$W-L=^RMC6`C\T9R4VCVXQJ7RR]G\
|
||
M9ATGJ$UHU02P0HI1J8-2E@;DL2$;'5*X:1#T!V^_X,M:.)XAA%J:*=)=0@R.
|
||
M$R_-"_U+Q[CTPPE.%1@`8`&L-8&<R_VC'2?*2R>U$Y"/3+4SZY'#83R'6T?5
|
||
MHDJ/W;&;ENUVZ6E/TG_R\*TK")X(-#>O8][^T2"L%A6[CE&'*,A_?<$7NUJT
|
||
MGM;GWIMZBJP`;X6]1$KJ#$8YDS<+TXSA`'5`S>WP'0'Z'\OGUV1@KPNS.D.Y
|
||
M#]$3E3)3`+X;(:J!V3T.=BAUUGX-KH'5U^^!43@HD79(?-L0Y&>5I54%P/S8
|
||
M10^'(@HBWUT"CL"P(K3=@Q<Z?_0>2Q]F"G-@5A97OW`IE'R7Z>).]?"C_*>1
|
||
M$L0CR:*DKO-*F&>?GY*`'!J0G36P9`8'B`?0J3:LH00;W:4??7)>&-V]!?:8
|
||
MXS>AZQ*WJ#ELF"#LI!NQP8N]?]<H6_+YYNHH>DC@$3*$I.^%*QVLT&07S8'<
|
||
MWIP/H,LP>A4'29G#PM"917+IA'[%AJI#X@VBBIL]/K?L-E%?#QS3\*\^<BW>
|
||
MWDY7Z_\[$H7:Q0S0@N5?WG9(C+F'H^[VH$YWV"GU[4TC1P%0IU=@6U:3VS$7
|
||
M^?6Z*>9:#Y,AKGBQEVY@EK&-HM[81XE4D%J]9Z>V&<&?/70!>]A\#B:(O?U5
|
||
M0G#P=:S]R,\[KHN]35A#AP>M!8U%B>.S7Z+=>-?-D%=%BOU/0FT$;,WW:9VR
|
||
MG^%0"RPM6-\Y(CZ,]IUZ&^,V8[[Y-Q*[_=OXB%`O_)6C=Z?KDC?5CW0E>->1
|
||
MT+5-0&S,#:KQ/`OBQ+3Y_AC6QLA`.NMY%RA)&^?B@8!;O#L%K)[E];8@#&DH
|
||
MFXS$Y#Z=0V)?6L9_>4[\+^3^<B&Q?9\/2<R^L80DXYPWM)JT'B(7_2APB.;N
|
||
M\G[S)/.T=V_X-O"CU";(+CO8J;M(+#1*`(#KOF.S<<\9D\"',@QGZH0OIKP.
|
||
MZ/[M/&)$*S./$*"EV(PE(_K%)@/8TUZFQHD3.]G`00^*H&?TV&!U0!C"/_%)
|
||
M)GU/5;*N?9T372QG'H$_8&XP;7">7%IT.=W1X-J!?VA>G5)\4/UH;9-LG/*Z
|
||
M2;5"<%[/6]^7U(F=\ED$$Y-FHX%9QF*IXI">1[:-3?ITN3M/V?AQL.JA1N/0
|
||
M=ZT/)FHBHIU`"5@5&1/?W:S^??*?=(.RLC)?8Z/0T%?F_LBD8%$`(XP(1TWC
|
||
M(\"85;!DFL0&Z,.8J;/J/RAQ>0]S'2Y4+@K?+#HZ3XT<.216<&&RR7T$S<R(
|
||
M76\D5/.HE]6Q3TZI"=8.E:QTC];NEDMRUM>%\YY#UDQ#LHWF'?0*4Y*<L]!?
|
||
MJ2BA#$:4V6<K^6LP&.4YRSKT:BL].'LPJ3)JJ]_H?I,+154\!C^:/>I=3J]>
|
||
M/MX_/N(WZ6>O6'2D+_RZ'CT_\*P85B#8&^?1,*LS46\3$?<_.9F\^^9#4ACB
|
||
M5APM72R7:#0]?7YI2A^.EPP&I')RZ_8X>]V-2>=J*Z5>V9(Z\5=<BPP[OZE0
|
||
MVR.^#+4-R4#('S]*%/_GC`^1A@"I`7=M=]O_OM=1V@1S"MO>@!%`50W(*Q0,
|
||
M%,&BR6CET(FPU-4$&[Y:VYHX9Q?:-#2XJ`R*,(XJP:#_Y*&96*1I/JHMI?Y>
|
||
M2?#7="4E)7:LSV8=%,KIZ`G5&+Z;Z7E**EEJ'<[CKR$.A_5TFL2=U31GS4ZY
|
||
MF]3$>4P.VZ8>QYG/AQ[HT$T7S:=?$_1&DU':;I1:EW9T.`9;P>9#PEX.JPO_
|
||
MM-T].CSJZER]O0H^.@HNSPD_O:G>??2;J0=)2PV/BG<UGHQ>[)Z5G7*6MY7?
|
||
M/C[J?9"7L<Y(+MK(MK4V2=<KPES4(6CU2DZP*J93GM#1Y;#*J'OS^^IJ5387
|
||
M*JE*I`,+9D<@2T(Q@*^T=`XR1"[0\(]O0]&8&%<9I,6EN2AQ8_[=K78B0(P$
|
||
M.`2`-H'/PAO_X-55DT"S^E"M;&O-J@Y>048Z3#@MD`BHPM$P!0`94FTV9N0`
|
||
M;?VQ%RL;ILP\+9*VDTYTRCO:MU"S(D+5>5$Y"X?X\;CM_O)Q]=XAU=Q_,[6_
|
||
MZ,C7M>(R.]-+CE1T\.4N0TY4YX?SQHL'<Q?9/H7):JW143]"$RWJG*5;>FFV
|
||
MF2/KG$L<WA[`]?S]P,BKR:X'FFZKVT-I,3-S_=F5CK(R_4S]S,*6QI;91B^#
|
||
M`ST_O<RR$NGY$#NJY$<]+\581OH(3:+=WC4<GG]H^9;*VCJ>9R/A*5/:'9%A
|
||
M.CIGFM75/)PS2(G`_/IU!)^&K(:EZVI3D;!YELQ$Y:C&5.5XURK]^EJ>.TCY
|
||
M6;%7=`F?CA+P^V'K*/+P+6L:,X"@!_+`X4MH1&SDGA!X8FZ"<T)E,53D)UF3
|
||
MMHF8\$ZJ9J='716=8^1M=Y=>1F'1RI\Z#2[.Z8I[%=Z9J*)4"P.OR]75UMQ'
|
||
MA;TFC5D>-8D!CJS_6!MLF(V'?AEU5(1=E]\?9CR4ME96F7FW&I%;>SOLV%O;
|
||
MZME/&\SUEOD:X<\8F.@]`</KZZ$&^7A@QMA"3V]'SU@OF3UEL2S'O*HPO45Y
|
||
MC,GZ7.ZGR>RTIY1<7PV=-?_[(9+KP-;`,GL')7$NCC?5<MTUVJJZ<O\Q^UI0
|
||
MJ`V&=M<+T->-:HS1+.7\SDGYDI)-_XL`BD9A'9]2"J/0<[6>F(@U<K"1K6R8
|
||
MS>:0D]-YY^)[9BB(B(;(`.T-)4`H;%M>&B%#`*BI%*ID%IN8E-BED#$*]@X/
|
||
M%5ID9L!!,M`H1Q&3+Q%>E[V/1=.Z$BSWUD$M&X^[D4LS4S</2P4W<=-<G!5G
|
||
MG6=MU555'3\T;TZZ9IJ_#RI6?A`S,6[#Q>7!E2NW0W]]?;L:?''1:"YIQQD9
|
||
M^T:-AWVTK+)L97*H;J3L))^.O5;YIZ-:0-S8]'E7I6N9B8-QBG%&1F'&HI^)
|
||
M>6EKE4MFLFNVRVX*5H3#ZSGA&7V]9+V?)?IN8MB8]GH;90O3$>73GUY;?2D+
|
||
MSPM'=(=@8*@+LM&^D1X:BR-!`P_-U.X5I7>4I<-@K_/R\K2GE#^T_OPS1-J"
|
||
MS/7=R@V^MT\Q\?/[8*^D0?H%=O12424<`,%(!=/@"M!GF.1XE)OG*=9EOGY^
|
||
MGO5G7CO[#Q2RGNIN\AH-F4L;A5^T\_(+H`?WEUHWYD&.>GZM954-;S]3-.@B
|
||
M&PITU'E)WK0Y=L)U79VK:EMC:'7LMN9W"P.S.\PZ'(H=],(<9]_YFA3ZF&RC
|
||
MF+2,27!\KXLO=<2^]$T;V=H:Z>7HF9EYG1O,'VPTI<SHBL7)RZSJ7=Y_>#37
|
||
MWTQ)W=VMKFYK*UIT[3@ZH,],3DTN9%BEC\2/?.,:3E;T'Z97HM-#8'Y'R'W(
|
||
M/R1:V)4V(@^!B\$I@U%'P(2%XX3C0*$IO;0W6K%P,-2JK<-%L\'$PL"E@34Y
|
||
MD]1A#WW+KJI&Z9!MD_U+8.FES$<Z879&=G)FO?3\"'\1$`@`D=V"<J1"YK=L
|
||
MMZQFEP*>T\3MBEY<NZAWCC0V"'<02SO:LVW_9C4O--(+?J7ZN%(_JG-97RF[
|
||
M_OBX^[ML[_'6<Y?F<%S/K+Y\;;V^[+<*`<$I`87':5/LKCENG(MS=NE71O!/
|
||
MQCE&;)V1DO*T6(BU6;*?EUV-F8&^N8DO3=9T0_WN.7N'2;"CZ^WA`K%^=6?Y
|
||
M8]GN;E%&>[GJT.34+^R=D+_2W"\$*^KKRQF%DCD\UQ[P,4*1T'72%C3<;;K6
|
||
M)53GV>%8:?ZK426S0&I*LF?/?U%.O5$M[)F:W*UT*`>K3;U17L&:=KSZ^1Z,
|
||
M\>7=O_?N"2&MOM<WYQ\^>"K:#[;8V_NV\$K6TN\,%SX3PQQY-/6914!N_7=O
|
||
M=S<.L.7:7M@[>#I,'@@_V]@3CC,N*TL.:8;1!':&F!FL/E15VG?\9G&(EF?_
|
||
MC^W@<KKI\?SRWITGSCI#FW4E?_)Z>N#'&MNB/M4Z'%>P+&DO1=@RFQ\^R\'U
|
||
MLJ*ZG(>+3%OVSYC?,W!Y;;E31?/*X)=2&YWAV.F4(*_D'%UI.7]=228Y0>EH
|
||
M+0Q6:^51#`6-*>.BG-J00%DD.17-'=IUV!DE@;"?")=&V>?]2\=O=0>"!06M
|
||
MP@2-PV_VLY(Y5'M^,/ZLKJPNFSHN57M[%PDD!_F2;711OE1WUBBSSG$9,[)O
|
||
M61P+_VQ[A_&278ZT]%-+O35]'W\!^%WA"S):_LV/'52M;V;;MFO^99N89KSO
|
||
MC%,N?&CP]E8&D;M4KVXD/[IVR^F7RGS!8EPE<4C-22DU+BN)J,R9OP-TRXVG
|
||
MV!]^2\W4UH'EOYE%8ZEF/K^\S"//Q3_&-:(;*?I`GVYM!H3\(9$0K"-T(!@;
|
||
M+^L<6HS=EV0!V5O;A85/`\F^/QG8L/^^?B9+&))TRJ^/^&V-3?H?D\@G[*1G
|
||
M27M8>V^3LJ]D`%D91J<L'T-*0P=A1KV'O?I11Y%1A]K.LOD_AVVW:K\YT32"
|
||
M1W1TN53"LTD4!@3KE]K$!:L`H?*FP5\#=MEESLD-C47GW@T-N4[2EY-$F*U.
|
||
MADA$?U\M.Q$Q))P6^??=P9%>5?++L\*$4D4*"F-C!^-2_?6#%SGU0E,5E<IE
|
||
M8@/.47\AQ#!]4MY@#!)#DIG,:5?CU)G^8\ZSFZ']*5C6Y-*MZN[0'OO0PM&X
|
||
MUCC/(".V6L.0[!W-P3#GR`\TZK*N_.N*5U:5%6(+AE_ZK^?GC?0*C:9IB;PH
|
||
MWYV&R4SGD*K_ZDZVMYXW\M)S-O`LP0C-MIJ,-S'1IQ'3[(0-CZN-]^5\P:?&
|
||
MXV8\=53C;8B,^&22[7FP4[K8VTMDK/KM*-O"V:*HK,@F/1W%JV_MBG^1W9JI
|
||
MGS&)%9F-KZ;YTS7P\;[$^6!ZS4NML''<<1(!2XHGH++ZHHI%!L__3"48L'WY
|
||
MRGP\*>4S!1&5(7TFB8EK_F>_RTK#6X/"'2TZJ:P+#.![OO:CPQ;=U<P0_@[\
|
||
MX5.I5U%+:7I1D;=+6C(JW\K0@=#XKNVF[=:LJ[JI@6=[I=I\-3>ES*!0O\6W
|
||
MM<4WL/'](0&,/SDG+5>%T*CDFH-(K%)!Z4OO:4Q.PSNNF&*A0/VL!F+&'&]U
|
||
MS8"BDM+*C8VD@#^+AM)"0D/#7]^JVK&Y?7<?YQ$0$E7$/`\?"O]X:-T9$
|
||
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
|
||
M[:2PQW5F/`[ERUTDP7@=:G/GV`V+%^N9&%2<CN71H>A?W5>IK/)08MD=4
|
||
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
|
||
M(^45Q9J0P;0QOU>+1CRYLJ>>Y1ZJ:ED_#NK=)%W;?9\_S=B![RX'GE!I4
|
||
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
|
||
$`0``````
|
||
`
|
||
end
|
||
.......
|
||
....
|
||
..
|
||
. C=H #18
|
||
|
||
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||
|
||
|
||
Obj3d trilogy
|
||
-------------
|
||
|
||
The rest of this issue is devoted to obj3d. Obj3d is a set of
|
||
routines for creating and manipulating 3D worlds, and builds upon the
|
||
lib3d routines discussed in issue 16 (the lib3d routines have also been
|
||
upgraded, including a multicolor version).
|
||
|
||
The first article introduces the use of obj3d with a simple example
|
||
program which places two objects into the world (and lets you move one of
|
||
them around). The second article is the programming reference guide, with
|
||
a memory map and a list of routines/routine descriptions. The third article
|
||
covers "stroids", a more involved example program which demonstrates several
|
||
game-type algorithms and ideas.
|
||
|
||
Mark Seelye, mseelye@yahoo.com, has written a really nice "object
|
||
editor", i.e. a program for editing objects for use in obj3d programs.
|
||
Unfortunately it was not quite finished at the time of this issue, but
|
||
hopefully it will be featured in the next issue. For more information,
|
||
contact Mark!
|
||
|
||
All files are in a .zip files, included at the end of this
|
||
issue:
|
||
|
||
obj3d.o -- Obj3d library
|
||
lib3dv2.o -- v2.0 of lib3d library
|
||
lib3dv2mc.o -- Multicolor version
|
||
table13 -- $C000 table
|
||
rotmat.o -- $5E00 table
|
||
ptabgen -- program used to create above tables
|
||
|
||
bigtets.b.o -- Simple example program
|
||
bigtets.b.s -- Source code, in El Cheapo Assembler format
|
||
(see the Fridge for Cheapass docs)
|
||
|
||
stroids.o -- Stroids
|
||
stroids.n.s -- Source code for stroids, cheapass format
|
||
|
||
loader -- Program to load in relevant files
|
||
|
||
stroids -- Single-file stroids executable (load and run)
|
||
|
||
obj3d.ref -- obj3d programmer's reference guide
|
||
lib3dv2.ref -- lib3d v2.0 programmer's reference guide
|
||
|
||
Binaries, source code, and documentation are also available in the
|
||
Fridge, at
|
||
|
||
http://www.ffd2.com/fridge/obj3d/
|
||
|
||
|
||
|
||
|
||
Obj3d -- The 3D object library
|
||
---------------------------------> S. Judd 4/99
|
||
|
||
Obj3d is a library of routines for organizing, manipulating,
|
||
and rendering 3d objects in both hires and multicolor mode, using
|
||
version 2.0 of the lib3d library routines (described a little later).
|
||
Let's just dive right in and look at some example code, to get a feel for
|
||
the routines, and just how easy it is to get a 3D object up on the screen.
|
||
This example is taken from the example program "bigtets", included in
|
||
the obj3d.zip archive in this issue.
|
||
|
||
*
|
||
* Test code
|
||
*
|
||
* Nice pair of tets
|
||
*
|
||
|
||
ORG $1000
|
||
|
||
OBS = $0800 ;Object records
|
||
GETIN = $FFE4
|
||
|
||
TestCode
|
||
LDA $D011
|
||
ORA #$20 ;Bitmap mode
|
||
STA $D011
|
||
LDA #$08 ;Bitmap -> $6000
|
||
STA $D018
|
||
LDA $DD00
|
||
AND #$F8
|
||
ORA #$02 ;Bank 1
|
||
STA $DD00
|
||
LDA #$80
|
||
STA $028A ;All keys repeat
|
||
|
||
JSR VERSION ;If multicolor...
|
||
BPL :hires
|
||
LDA $D016
|
||
ORA #$10
|
||
STA $D016
|
||
:hires
|
||
JSR ClrColMap
|
||
|
||
LDA #<OBS ;Object records
|
||
LDY #>OBS
|
||
JSR Init3D ;Initialize libraries
|
||
|
||
LDA #<TETDAT ;Object data
|
||
LDY #>TETDAT
|
||
LDX #01 ;ID
|
||
JSR AddObj ;Add an object
|
||
STX VOB ;View object
|
||
|
||
LDA #<STARDAT
|
||
LDY #>STARDAT
|
||
LDX #02
|
||
JSR AddObj ;Add another object
|
||
STX ROB ;Remember this object for later
|
||
STA POINT ;Object pointer
|
||
STY POINT+1
|
||
LDY #5 ;Set object center
|
||
:l1 LDA OCEN,Y
|
||
STA (POINT),Y
|
||
DEY
|
||
BPL :l1
|
||
|
||
:sec SEC ;Solid polygons
|
||
:setp LDX #$60 ;Bitmap at $6000
|
||
LDA #<PATS ;Pattern table
|
||
LDY #>PATS
|
||
JSR SetParms
|
||
:loop
|
||
JSR ClrBitmap
|
||
|
||
LDX VOB ;Calculate view
|
||
JSR CalcView
|
||
JSR SortVis ;Sort objects
|
||
JSR DrawAllVis ;Draw objects
|
||
...
|
||
|
||
Aside from the trivial screen clearing routine and some data tables, that's
|
||
the entire program -- initialize the 64 and the libraries, add some objects,
|
||
then call the three subroutines above to render the objects to the screen.
|
||
Is that easy or what?
|
||
Now let's have a more detailed look at the library, and the example
|
||
program above.
|
||
|
||
Obj3d overview
|
||
==============
|
||
|
||
Lib3d, as given in C=Hacking #16, is a set of core routines for
|
||
doing 3D graphics and calculations. Obj3d is an extension to lib3d -- it
|
||
is a set of routines which uses lib3d. Its purpose is to take the tedium
|
||
out of managing and rendering 3d objects, and make 3d graphics accessible
|
||
to all those guys who never paid attention during high school math class.
|
||
|
||
I'd like to offer a bit of advice to any of those guys who might
|
||
happen to be reading, though. If you intend to do any _serious_ 3D coding,
|
||
for example a game, you're going to need to understand some fundamental
|
||
things about 3D graphics, and about why the various library routines work
|
||
the way they do. Amazingly enough, C=Hacking has a series of articles on
|
||
3D graphics, with a very comprehensive article in issue #16. I read it,
|
||
several times, before doing obj3d, and suggest you do the same.
|
||
Knowing coders the way I do, I can see that you're going to ignore
|
||
my advice; that's fine. For now, you can just jump in and play around with
|
||
the example programs a little bit, to get a feel for things. But if you
|
||
later decide to attempt something more involved than displaying objects
|
||
on the screen, and are unwilling to take a little time to understand how
|
||
things work, then you should expect to fail miserably, or spend many
|
||
frustrating hours wondering why something isn't working the way you expect.
|
||
Therefore, before you begin work on your dream program, I suggest
|
||
spending an hour or so with C=Hacking #16, a pencil, a piece of paper,
|
||
and a brain. The last is quite important, as you'll probably have to
|
||
do some thinking; if you're expecting to understand things with the flick
|
||
of some magical switch, you're probably reading the wrong magazine.
|
||
|
||
Finally, a word on distribution: both lib3d and obj3d are freely
|
||
distributable. You are _supposed_ to use them in your own programs.
|
||
You can make money off those programs (good luck!). You don't even have
|
||
to give me credit, if you really don't want to, as I figure anyone will
|
||
spot lib3d a mile away. But please, *use* the thing! That's why I
|
||
wrote it!
|
||
And, knowing coders the way I do, if I hear one guy sniff and
|
||
loudly exclaim to everyone within earshot that he never uses other people's
|
||
code, I'm going to take your tunes, charsets, sprites, editors, assemblers,
|
||
and all that hardware you didn't design, and bonk you over the head with it.
|
||
|
||
Alright, then. Let's talk some code.
|
||
|
||
Organization
|
||
------------
|
||
|
||
The obj3d routines can essentially be split into three groups:
|
||
routines to manage objects globally, routines to manipulate individual
|
||
objects, and visualization/rendering routines.
|
||
The global management routines are for adding/deleting objects
|
||
to/from the world, setting up objects for use by other routines, and
|
||
retrieving information about objects (e.g. location) for use by the
|
||
programmer.
|
||
The manipulation routines are used to manipulate individual objects:
|
||
to move objects forwards and backwards and side to side, to rotate objects
|
||
about their roll, pitch, or yaw axis, etc. In other words, these are
|
||
routines to change the position and orientation of a given object within
|
||
the world.
|
||
The visualization routines are naturally used to visualize the world.
|
||
These are routines to compute the view from a specific object and render
|
||
that view to the screen, as well as how to render it -- what bitmap,
|
||
render it solid or wireframe, etc. There are also routines for drawing
|
||
individual objects and even individual faces. These routines are the main
|
||
interface into the 3d library.
|
||
|
||
In order to support the obj3d routines, lib3d has been upgraded
|
||
to version 2.0. The rotation routines have been changed to ease a number
|
||
of calculations. Three new routines have been added, for plotting points
|
||
and lines, and for determining which version of the library is in memory.
|
||
Finally, a multicolor version of the library is available, in addition
|
||
to the hires version, which includes screen aspect ratio coordinate-
|
||
corrections as well as multicolor rendering routines.
|
||
|
||
Let's now return to the example program.
|
||
|
||
Example program explained
|
||
-------------------------
|
||
|
||
The first part of the code simply sets up 64-related stuff,
|
||
turning on bitmap mode, etc. JSR VERSION is used to determine whether
|
||
the hires or multicolor version of lib3d is being used; if multicolor,
|
||
then multicolor mode is enabled:
|
||
|
||
*
|
||
* Test code
|
||
*
|
||
* Nice pair of tets
|
||
*
|
||
|
||
OBS = $0800 ;Object records
|
||
GETIN = $FFE4
|
||
|
||
TestCode
|
||
LDA $D011
|
||
ORA #$20 ;Bitmap mode
|
||
STA $D011
|
||
LDA #$08 ;Bitmap -> $6000
|
||
STA $D018
|
||
LDA $DD00
|
||
AND #$F8
|
||
ORA #$02 ;Bank 1
|
||
STA $DD00
|
||
LDA #$80
|
||
STA $028A ;All keys repeat
|
||
|
||
JSR VERSION ;If multicolor...
|
||
BPL :hires
|
||
LDA $D016
|
||
ORA #$10
|
||
STA $D016
|
||
:hires
|
||
JSR ClrColMap
|
||
|
||
ClrColMap is not part of the obj3d library; it's just a simple routine
|
||
to clear the color map. The next piece of code initializes the obj3d
|
||
and lib3d libraries with some default values:
|
||
|
||
LDA #<OBS ;Object records
|
||
LDY #>OBS
|
||
JSR Init3D
|
||
|
||
If you ever move some tables around (like the $C000 table), you'll need
|
||
to change table pointers _after_ calling this routine, as it initializes
|
||
the zero-page lib3d pointers to certain default values. .AY points to a
|
||
free area of memory, whose size depends on the number of active objects
|
||
you intend to have in the world. This will be explained in more detail
|
||
shortly. The next section of code adds an object into the world, using
|
||
JSR AddObj:
|
||
|
||
LDA #<TETDAT ;Object data
|
||
LDY #>TETDAT
|
||
LDX #01 ;ID
|
||
JSR AddObj
|
||
STX VOB ;View object
|
||
|
||
If you look at the obj3d memory map, you'll notice that of the 4k it
|
||
occupies only a measly 1.5k is used for code. The rest is all used for
|
||
storage -- a whole bunch of lists, used to organize all the data. One
|
||
of these lists is the "active object list". What JSR AddObj does is
|
||
to find the first empty spot in the active object list, and assign the
|
||
object to that spot. This spot is returned in .X, and this number is
|
||
how obj3d will reference the object. The STX VOB above is for later
|
||
use by the program; you do not generally need to store every object
|
||
number.
|
||
A maximum of 128 active objects are allowed, so the object number
|
||
in .X will always be in the range 0-127. Since AddObj always grabs the
|
||
first open spot, .X will in fact never be larger than the maximum number
|
||
of active objects in a given program. You might want to use it for your
|
||
own purposes, too, for example as an index into a list of velocities.
|
||
AddObj also "allocates" a chunk of memory to store the object
|
||
record in. This area of memory is specified in the earlier call to
|
||
JSR Init3D, above, by .AY. Each object currently requires 32 bytes of
|
||
storage, so if there can be N active objects in the world at any given
|
||
time, this area of memory needs to be of at least size 32*N. There is
|
||
a distinction here between "active" and "inactive" objects; an object is
|
||
"active" if it has been added in with AddObj, i.e. is actively present in
|
||
the world. It may help to understand this distinction by considering a
|
||
program like Elite -- although there are many different kinds of objects
|
||
(different ships, asteroids, etc.), there are never more than a certain
|
||
number present, i.e. active, at any given time. So even if you have
|
||
50 different types of objects, if there are never more than 6 active at
|
||
any time only 6*32 bytes of RAM are needed.
|
||
So what is an "object", anyways? Three things are needed to
|
||
completely specify an object: its position, its orientation, and its
|
||
structure. The "structure" is the vertices and faces that define what
|
||
the object looks like. The position and orientation determine where the
|
||
object is, and in what direction it is pointing. Position and orientation
|
||
are such important concepts that it is worthwhile to review them further.
|
||
Consider something like a chessboard. Each piece is located on
|
||
a specific square, and when you move it, the piece moves to a different
|
||
square (as opposed to e.g. moving the board). The square it sits on
|
||
is its position, and in chess this is denoted by C-4 or something
|
||
similar. Now imagine that we are one of the knights -- what would we
|
||
see? It would depend on the direction we were facing; in other words,
|
||
our orientation. If we were to then compute the view from a different
|
||
knight, we would need to know its orientation.
|
||
In three dimensions, the position is specified by three signed
|
||
16-bit coordinates, the usual x/y/z Cartesian system. The orientation
|
||
is specified by a 3x3 rotation matrix. This orientation matrix essentially
|
||
tells you which direction is "forwards", which direction is "down", and
|
||
which direction is "sideways", _from the object's perspective_. That is,
|
||
if you're flying a plane, the "forwards" direction is always straight
|
||
ahead. If you're watching it from the ground, the forwards direction
|
||
changes if the plane turns, or dives, etc.
|
||
Thus, in obj3d, an object is defined by a 32-byte "object record":
|
||
|
||
Object:
|
||
CenterX 2 bytes Position, x-coordinate
|
||
CenterY 2 bytes Position, y-coordinate
|
||
CenterZ 2 bytes Position, z-coordinate
|
||
Structure 2 bytes Pointer to structure data
|
||
ID 1 byte Optional ID byte
|
||
User byte 1 byte Free data byte
|
||
CenterPos 1 byte Position in rotated center list
|
||
CenXRem 1 byte Remainder, x-position
|
||
CenYRem 1 byte (Used by MoveUp, etc.)
|
||
CenZRem 1 byte
|
||
Matrix 9 bytes Viewpoint matrix, integer part
|
||
MatRem 9 bytes Fractional part
|
||
|
||
CenterX/Y/Z are the 16-bit signed coordinates specifying where the object
|
||
is located in the world. "Structure" is a pointer to the structure data
|
||
defining the vertices and faces which make up the object. Using a pointer
|
||
means that objects may share the same basic shape, without wasting lots
|
||
of memory; it also means that objects may be e.g. animated (beyond merely
|
||
rotating). When AddObj is called, the contents of .AY are stored here.
|
||
The structure layout is discussed a little later.
|
||
The ID and user bytes are purely for the use of the programmer; they
|
||
are *not* used by the library routines. For example, you might store what
|
||
type of object this is, and its current velocity. When AddObj is called,
|
||
the content of .X is stored in ID.
|
||
CenterPos is an index into a list of relative object centers; this
|
||
list is generated when the viewpoint is calculated from a specific object.
|
||
CenX/Y/ZRem are used solely by the routines MoveForwards etc. They
|
||
represent the fractional portion of the center coordinates, to ensure
|
||
accurate movement (especially when moving by small amounts).
|
||
Matrix and Matrem are the "viewpoint" matrix; the viewpoint matrix
|
||
is the transpose of the orientation matrix. Values in Matrix range from
|
||
-64 to 64. The remainder portion is used by the TurnLeft etc. routines
|
||
(in particular, by the lib3d routines ACCROTX/Y/Z); only the integer
|
||
portion is used for rotation/projection.
|
||
|
||
The viewpoint matrix determines what the world looks like when
|
||
rotated about the object. The orientation matrix determines how the object
|
||
looks from somewhere within the world, i.e. what direction it is pointing in,
|
||
etc. It's the difference between being "inside" the object or "outside" of
|
||
the object.
|
||
Computing views was explained in C=Hacking #16. Briefly, when
|
||
an airplane e.g. rolls, it rolls about its fuselage -- about a local
|
||
coordinate axis -- and when it rolls, the other coordinate axis change
|
||
direction, relative to the world (e.g. the wings move). The problem is that
|
||
the usual rotation matrix really only rotates about a _fixed_ coordinate
|
||
system. If the object starts pointing in a different direction, you would
|
||
need a way of rotating about the new coordinate axis, i.e. about an arbitrary
|
||
line. It can be done, using quaternions (which are a generalization
|
||
of complex numbers), but it is cumbersome and time-consuming (and thus
|
||
popular among PC programmers). The smart way to do it is to realize that
|
||
the inverse of a "viewpoint matrix" is an "orientation matrix", and to
|
||
further realize that the inverse of any rotation matrix is simply its
|
||
transpose.
|
||
|
||
By the way, it should go without saying that the object record values
|
||
need to not get screwed up. If they do, all sorts of strange things can
|
||
happen. So if you write a program, and it starts behaving or crashing
|
||
mysteriously, first check that the object record isn't hosed.
|
||
|
||
The bytes following the user bytes will probably never be used by
|
||
a programmer, except perhaps to copy orientation matrices. The bytes
|
||
up through the user bytes, however, are meant to be modified by the
|
||
programmer. For example, the next part of the example code sets
|
||
the center of the object, after AddObj.
|
||
|
||
LDA #<STARDAT
|
||
LDY #>STARDAT
|
||
LDX #02
|
||
JSR AddObj
|
||
STX ROB ;Rotate object
|
||
STA POINT ;Object pointer
|
||
STY POINT+1
|
||
LDY #5 ;Set center
|
||
:l1 LDA OCEN,Y
|
||
STA (POINT),Y
|
||
DEY
|
||
BPL :l1
|
||
|
||
Not only does AddObj return the object number in .X, it returns a
|
||
pointer to the object in .AY. This pointer is also returned by the
|
||
routines SetCurOb and GetCurOb. The above code stores this pointer
|
||
in POINT, and then sets the location by copying from a little table
|
||
|
||
OCEN DA 00 ;X-coord
|
||
DA 00 ;Y-coord
|
||
DA $0100 ;Z-coord
|
||
|
||
At the very least, you will probably have to specify the location of
|
||
any object you create; otherwise, the default location is the center
|
||
of the world, at (0,0,0).
|
||
|
||
Next, the example program tells obj3d about how objects should
|
||
be rendered to the screen:
|
||
|
||
:sec SEC ;Solid polygons
|
||
:setp LDX #$60 ;Bitmap at $6000
|
||
LDA #<PATS ;Pattern table
|
||
LDY #>PATS
|
||
JSR SetParms
|
||
|
||
SetParms takes four parameters. The carry flag determines whether solid
|
||
or wireframe polygons will be used. (The wireframe routine is not
|
||
particularly fast, because it is not particularly smart -- it does not
|
||
compute hidden faces. It does, however, skip lines that have already been
|
||
drawn.) .X contains the location of the bitmap (high byte) to be rendered
|
||
to. .AY contains a pointer to a table of 8x8 bit patterns, used by the
|
||
rendering routines:
|
||
|
||
PATS ;Pattern table
|
||
SOLID = 0
|
||
HEX FFFFFFFFFFFFFFFF
|
||
DITHER1 = 1
|
||
HEX 55AA55AA55AA55AA
|
||
DITHER2 = 2
|
||
HEX AA55AA55AA55AA55
|
||
...
|
||
|
||
These patterns will later be referenced by their position in the table.
|
||
|
||
Thus do we come to the main loop, which is just four routines:
|
||
:loop
|
||
JSR ClrBitmap
|
||
|
||
LDX VOB ;Calculate view
|
||
JSR CalcView
|
||
JSR SortVis ;Sort objects
|
||
JSR DrawAllVis ;Draw objects
|
||
|
||
The first routine is not a part of obj3d; it just clears the bitmap.
|
||
JSR CalcView computes what the world looks like from object .X -- from
|
||
the object's position and orientation. It does so by translating
|
||
and rotating each object's center (except the viewpoint object),
|
||
and storing this relative center in the center list; the value of
|
||
CenterPos, in the object record, is an index into this list.
|
||
JSR SortVis computes a sorted list of _visible_ objects,
|
||
from the center list. An object is considered "visible" if it lies
|
||
in a 45 degree pyramid in front of the viewpoint object, and if
|
||
its z-coordinate is between zmin and zmax. The paramters zmin and zmax
|
||
may be set by calling JSR SetVisParms; I don't recall the default values
|
||
offhand -- probably 100 < CenterZ < 8192. The purpose of the sorted
|
||
list is to ensure the objects are drawn from back to front -- so that
|
||
objects overlap each other correctly.
|
||
Finally, after calculating the viewpoint, and calculating the
|
||
visible objects, all that remains is to draw all the visible objects,
|
||
with JSR DrawAllVis. Individual objects may be drawn one at a time
|
||
with JSR DrawNextVis. When an object is drawn, it is rotated by the
|
||
orientation and viewpoint matrices, then added to its relative center
|
||
(M R P + M C), then projected, with the projected points stored in two
|
||
lists, PLISTX and PLISTY. The appropriate rendering routine is then
|
||
called, using the points in these lists. Also, before projecting, the
|
||
rotated z-coordinates are stored in PLISTZ, for use in drawing compound
|
||
objects (described later).
|
||
|
||
That takes care of displaying an object. What about manipulating
|
||
an object, i.e. moving around? The example program accepts the following
|
||
keys:
|
||
|
||
a/z s/d q/w -- Pitch, roll, and yaw object
|
||
@ / -- Move forwards/backwards
|
||
space -- Switch viewpoints
|
||
= -- Draw using wireframe graphics
|
||
* -- Draw using solid graphics
|
||
|
||
You can look at the source code to see how all of this is done. Here,
|
||
it will be enough to look at the code to pitch the object and the
|
||
code to move the object (and to swap viewpoints, for good measure).
|
||
First, the library must be told which object to operate on:
|
||
|
||
LDX ROB ;Set rotation object
|
||
JSR SetCurOb
|
||
|
||
Recall that after adding in the second object, .X was stored in ROB.
|
||
In this program, movement always affects the second object, no matter
|
||
which object is the view object. The program now waits for a keypress,
|
||
and branches accordingly:
|
||
|
||
:wait JSR GETIN
|
||
BEQ :wait
|
||
CMP #'a'
|
||
BEQ :pitchdn
|
||
CMP #'z'
|
||
BEQ :pitchup
|
||
CMP #'@'
|
||
BEQ :movf
|
||
CMP #'/'
|
||
BEQ :movb
|
||
CMP #' '
|
||
BNE :wait
|
||
|
||
LDX VOB ;Swap viewpoint
|
||
JSR SetCurOb
|
||
JSR GetNextOb
|
||
STX VOB
|
||
JMP :loop
|
||
|
||
:pitchdn CLC
|
||
DFB $24
|
||
:pitchup SEC
|
||
JSR Pitch
|
||
JMP :loop
|
||
|
||
:movf LDA #$07
|
||
DFB $2C
|
||
:movb LDA #$F9
|
||
JSR MoveForwards
|
||
JMP :loop
|
||
|
||
To change the viewpoint, the program simply sets the current object
|
||
to the current view object, then advances to the next object in the
|
||
active object list, and stores that as the new viewpoint object.
|
||
The routines Pitch, Roll, and Yaw all function similarly. They
|
||
all rotate by a fixed amount (2*pi/128 radians, which is about 3 degrees),
|
||
and the carry flag specifies the direction of rotation. The rotation
|
||
is performed about the _local_ coordinate axis of the object, which rotates
|
||
with the object; there is also a routine, SetMat, which can rotate about
|
||
the fixed world axis.
|
||
The MoveForwards, MoveDown, and MoveSide routines also function
|
||
similarly. In these routines, .A contains the "velocity" or length of
|
||
the move, as a signed 8-bit number; the actual distance moved is four
|
||
times .A.
|
||
|
||
And that more or less sums up the less-technical aspects of the obj3d
|
||
library routines. For a complete list of routines, routine parameters,
|
||
and a memory map, see the files "obj3d.ref" and "lib3d.ref" in the .zip
|
||
archive (they're plain ASCII text files). There's also some example source
|
||
code. And now it is time for the more technical details: object structure
|
||
data, compound objects, some internals, and lib3d v2.0 updates.
|
||
|
||
The More Techincal Details
|
||
==========================
|
||
|
||
As you may recall, the object record contains a pointer to the
|
||
object structure data -- the data describing the points and faces that
|
||
define what the object looks like. For a normal object, this data is
|
||
organized as follows:
|
||
|
||
Structure:
|
||
TypeID = 0 1 byte Object type (normal, compound)
|
||
Npoints 1 byte Number of points (vertices)
|
||
Nfaces 1 byte Number of faces
|
||
Xcoords n bytes Vertices, x-coordinates
|
||
Ycoords n bytes Vertices, y-coordinates
|
||
Zcoords n bytes Vertices, z-coordinates
|
||
|
||
faces: List of faces
|
||
|
||
nverts 1 byte Number of vertices in face
|
||
fillpat 1 byte Fill pattern (index into pattern list)
|
||
fpoints m+1 bytes Points (indices into X/Y/Z above)
|
||
|
||
TypeID identifies the object type, and will be discussed in more detail
|
||
shortly. Npoints and Nfaces do what they say; there is no limit on the
|
||
number of faces, but an object may not have more than 128 points (which
|
||
is a HUGE object!).
|
||
X/Y/Zcoords are signed integers in the range -95..95, for reasons
|
||
described in C=Hacking #16. Note that the _length_ of each of these points
|
||
must be less than 95. For example, a point like (65,65,65) has length
|
||
sqrt(65^2 + 65^2 + 65^2) = 65*sqrt(3) = 112 or so, so if this point
|
||
were rotated down onto the x-axis it would have coordinates (112,0,0),
|
||
which is out of the -95..95 range. Strange things will happen to your
|
||
rotating objects if you make this error, so if your objects start freaking
|
||
out upon rotation, check this first.
|
||
Note, moreover, that the vertices are defined about the center of
|
||
rotation of the object; this center is exactly the coordinates CenterX/Y/Z
|
||
in the object record, i.e. where the object is located in the world.
|
||
Following the coordinates is a list of faces, which are specified
|
||
by a fill pattern and a list of vertices. The fill pattern is an index
|
||
into the pattern table, which you may recall is set using JSR SetParms;
|
||
the actual location of the pattern is PATTAB + 8*fillpat. The vertex list
|
||
is simply a list of indices into the X/Y/Zcoords table; moreover, this
|
||
list must close upon itself, e.g. 0-1-2-0, so that it is of length nverts+1,
|
||
where nverts is the number vertices in the face.
|
||
With all that in mind, here is the data for the first object in
|
||
the example program, a simple tetrahedron:
|
||
|
||
*
|
||
* Test object 1: simple tetrahedron
|
||
*
|
||
TETDAT
|
||
DFB 0 ;Normal object
|
||
DFB 4 ;Number of points
|
||
DFB 4 ;Number of faces
|
||
|
||
* Point list
|
||
|
||
TETX DFB 45,45,0-45,0-45
|
||
TETY DFB 45,0-45,45,0-45
|
||
TETZ DFB 45,0-45,0-45,45
|
||
|
||
* Face list
|
||
|
||
FACE1 DFB 3 ;Number of vertices
|
||
DFB SOLID ;Fill pattern
|
||
DFB 0,1,2,0 ;Vertices
|
||
|
||
FACE2 DFB 3
|
||
DFB ZIGS
|
||
DFB 3,2,1,3
|
||
|
||
FACE3 DFB 3
|
||
DFB CROSSSM
|
||
DFB 3,0,2,3
|
||
|
||
FACE4 DFB 3
|
||
DFB HOLES
|
||
DFB 3,1,0,3
|
||
|
||
Pretty straightforward, really. Note that faces can have any number of
|
||
points in them; triangles will have three points, squares (e.g. sides of
|
||
cubes) will have four points, and so on. Thus the way to think about
|
||
creating an object is that some points are defined about some center, and
|
||
those points are then connected together to make faces.
|
||
This kind of definition works fine for simple objects -- that is,
|
||
for convex objects, where one part of the object won't obscure a different
|
||
part. But what about more complicated objects -- a tank, say, or a cross --
|
||
where one piece of the object might be in front of another piece at one
|
||
orientation, and behind in a different orientation? The general problem
|
||
of polygon clipping is fairly complicated and time consuming. Being 64
|
||
programmers, though, we are of course a little sneakier about doing stuff,
|
||
and we can make suitably complicated objects by just modifying the above
|
||
structure a little bit.
|
||
Consider for a moment a cross, or the pointy stars from Cool World.
|
||
The basic problem is that a given chunk of the object might be either
|
||
in front of the rest of the object or behind it. If it is behind,
|
||
then we want to draw it first; if it's in front, then we want to draw
|
||
it last. The idea, then, is to divide a complex object up into a number
|
||
of smaller objects, and to draw them in the right order. In the obj3d
|
||
lexicon, such an object is a _compound object_.
|
||
|
||
Compound Objects
|
||
----------------
|
||
|
||
To define a "normal" object, we define a list of points and then
|
||
join points into faces. A compound object takes this a step further,
|
||
joining faces into smaller "oblets". All that remains is to figure out
|
||
what order to draw each oblet in.
|
||
Recall that before rendering objects to the screen, JSR SortVis
|
||
is called. SortVis sorts the visible objects based on their z-coordinates
|
||
and far-away objects are drawn first, so that objects will be rendered
|
||
in front of one another on the screen. So we can do the exact same thing
|
||
with the oblets: associate a _reference point_ with each oblet, depth-sort
|
||
the reference points, and then draw the oblets from back to front. The
|
||
reference point doesn't have to be connected to anything, or a part of
|
||
any face -- just some point which allows the oblets to be sorted correctly.
|
||
As an example, consider the pointy stars from Cool World. These
|
||
are easy to create, by starting with a cube, and then pulling out the
|
||
centers of each face, creating a star with six tines. The tips of each
|
||
tine are a convenient reference point, so the idea is to divide the
|
||
star up into six oblets -- the tines -- and use the tip of the tine as
|
||
the reference point for each oblet. Once the tips are sorted, the tines
|
||
may be drawn in the correct order, and viola! Violin! Instant polygon
|
||
clipping, with very little computational effort. Note that the key to
|
||
success with this method is choosing the reference points well.
|
||
The format for a compound object is similar to a normal object,
|
||
with TypeID set to $80 and Nfaces replaced by Noblets:
|
||
|
||
Structure:
|
||
TypeID = $80 1 byte Object type (normal, compound)
|
||
Npoints 1 byte Number of points (vertices)
|
||
Noblets 1 byte Number of oblets
|
||
Xcoords n bytes Vertices, x-coordinates
|
||
Ycoords n bytes Vertices, y-coordinates
|
||
Zcoords n bytes Vertices, z-coordinates
|
||
|
||
oblets: List of oblets
|
||
ref points p bytes List of reference points (indices)
|
||
|
||
oblet 1
|
||
nbytes 1 byte Number of bytes in this oblet
|
||
nfaces 1 byte Number of faces
|
||
|
||
face list:
|
||
nverts 1 byte Number of vertices in face
|
||
fillpat 1 byte Fill pattern (index into pattern list)
|
||
fpoints m+1 bytes Points (indices into X/Y/Z above)
|
||
|
||
oblet 2
|
||
...
|
||
|
||
The list of reference points is a list of indices into X/Y/Zcoords,
|
||
and the first point in the list is the reference point for the first oblet,
|
||
etc. Note the "nbytes" field in each object; this is used to advance
|
||
through the oblet list (for example, to find oblet #4 quickly). There
|
||
is a limit of 32 or so oblets allowed; chances are awfully good you'll
|
||
never reach this limit, consdering that an object can only have 128 points!
|
||
|
||
Here is the second object from the example program, which is just
|
||
a modified pointy star. Note that the TypeID is set to $80; a normal
|
||
object has TypeID = 0. It is also worth pointing out that the choice
|
||
of reference points -- the tip of each surface -- can lead to incorrect
|
||
clipping on occasion, because the tips are of different lengths; nevertheless,
|
||
they work quite well.
|
||
|
||
*
|
||
* Test object 2: a compound object,
|
||
* spaceship-kind of thing (essentially
|
||
* cool world stars)
|
||
*
|
||
STARDAT
|
||
|
||
DFB $80 ;Compound object
|
||
DFB 14 ;Number of points
|
||
DFB 6 ;Number of oblets
|
||
|
||
* Point list
|
||
|
||
DFB 50,0-50,0,0,0,0,15,15,15,15,0-15,0-15,0-15,0-15
|
||
DFB 0,0,16,0-26,0,0,10,10,0-10,0-10,10,10,0-10,0-10
|
||
DFB 0,0,0,0,94,0-22,15,0-15,0-15,15,15,0-15,0-15,15
|
||
|
||
* Oblet list: reference points
|
||
|
||
DFB 0 ;First 6 points
|
||
DFB 1
|
||
DFB 2
|
||
DFB 3
|
||
DFB 4
|
||
DFB 5
|
||
|
||
* Oblet 1
|
||
|
||
DFB 26 ;26 bytes
|
||
DFB 4 ;4 faces
|
||
|
||
* faces
|
||
DFB 3 ;4 points
|
||
DFB SOLID ;pattern
|
||
DFB 0,8,7,0 ;Star 2, Tine 0, face 1
|
||
|
||
DFB 3
|
||
DFB ZIGS
|
||
DFB 0,7,6,0
|
||
|
||
DFB 3
|
||
DFB ZAGS
|
||
DFB 0,6,9,0
|
||
|
||
DFB 3
|
||
DFB DITHER1
|
||
DFB 0,9,8,0
|
||
|
||
* Oblet 2
|
||
|
||
DFB 26 ;26 bytes
|
||
DFB 4 ;4 faces
|
||
|
||
|
||
DFB 3 ;4 points
|
||
DFB ZIGS
|
||
DFB 1,11,12,1
|
||
|
||
DFB 3
|
||
DFB BRICK
|
||
DFB 1,12,13,1
|
||
|
||
DFB 3
|
||
DFB DITHER2
|
||
DFB 1,13,10,1
|
||
|
||
DFB 3
|
||
DFB ZAGS
|
||
DFB 1,10,11,1
|
||
|
||
* Oblet 3
|
||
...
|
||
|
||
The remaining oblets are all similar.
|
||
|
||
lib3d v2.0
|
||
----------
|
||
|
||
Finally, lib3d has been updated, to support the obj3d library and
|
||
to be more cool in general.
|
||
|
||
The first thing to notice is that there are now two libraries:
|
||
one for hires, and another for multicolor. The multicolor version not
|
||
only renders in multicolor, but corrects for the screen aspect ratio
|
||
by multiplying all y-coordinates by 5/4 after projection.
|
||
|
||
The second thing to notice is the addition of three new routines:
|
||
PLOT, DRAWLINE, and VERSION. VERSION returns the lib3d version number;
|
||
the high bit set indicates a multicolor version. Currently lib3d is
|
||
at v2.0, so this routine returns either 2 or $82.
|
||
PLOT and DRAWLINE are used to, well, plot points and draw lines.
|
||
The coordinates are 16-bit signed values, i.e. the routines understand
|
||
points that are off the screen. To use them, you just store the coordinates
|
||
in zero page and JSR. The line drawing routine is not the world's fastest,
|
||
but it is still zippy, especially for its (quite small) size and flexibility.
|
||
|
||
The third thing to notice is that the memory map has been altered
|
||
significantly, both in zero page and in RAM. lib3d now starts at $8400,
|
||
instead of $8600, so not only has the jump table moved but there is
|
||
no longer room for sprites in bank 2. Zero page has been shuffled around,
|
||
with perhaps the most significant result being that all of the $Fx locations
|
||
(everything above $C4 actually) are free for use by the programmer. See
|
||
the memory map for more details.
|
||
|
||
What you might not have noticed is that several of the routines
|
||
have now changed. The accumulation routines ACCROTX/Y/Z now require a
|
||
pointer to the matrix to be accumulated; they used to simply operate on
|
||
a matrix in zero page. This way, object matrices may be directly
|
||
manipulated, instead of doing any wasteful copying to and from ZP.
|
||
ROTPROJ has also gone through a big change. Recall that the
|
||
equation for a 3D world is
|
||
|
||
M R P + M C
|
||
|
||
where P is an object point, R is the local rotation (orientation), M is
|
||
the viewpoint rotation, and C is the object's center. ROTPROJ used to
|
||
just calculate MP + MC; it now calculates MRP + MC, which is why zero
|
||
page now contains a viewpoint _and_ an orientation matrix. Also, ROTPROJ
|
||
stores the z-coordinates before projecting, for use in drawing compound
|
||
objects, so there's now a pointer to PLISTZ. Finally, I feel that rotation
|
||
without projection is now a pretty useless feature; I left it in, but
|
||
it now stores the rotated points to PLISTX/Y/Z, instead of using a special
|
||
zero-page pointer for the purpose.
|
||
|
||
There were also some miscellaneous recodings, to conserve memory
|
||
and such, but they're nothing special. For descriptions of the
|
||
individual routines and their use, see the lib3d.ref document in the
|
||
.zip file.
|
||
|
||
The End
|
||
-------
|
||
|
||
Since most of the obj3d routines are either really stupid or were
|
||
yanked out of Cool World, I don't think there's any reason to go over them
|
||
(except the cool sorting algorithm, discussed elsewhere in this issue).
|
||
|
||
What more is there to say?
|
||
|
||
Go home and code!
|
||
|
||
.......
|
||
....
|
||
..
|
||
. C=H #18
|
||
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||
|
||
|
||
Obj3d programmer's reference
|
||
-----
|
||
last update: 4/16/99
|
||
version 2.0
|
||
|
||
|
||
* Obj3d and lib3d memory map:
|
||
|
||
|-|x|--|x|---------------|xxxx|------|xxxxxx|------|xxxx|-------------------|
|
||
| | | | |
|
||
$41 $0200 $4F00 $8400 $C000
|
||
|
||
|
||
$41-$49 Orientation matrix
|
||
$4A-$52 Viewpoint matrix
|
||
$53,$54 Xoffset, Yoffset (screen offsets -- where 0,0 is on screen)
|
||
$55-$72 Various temporary pointers and variables
|
||
$60-$67 X1,Y1,X2,Y2 -- signed 16-bit coordinates for PLOT and DRAWLINE
|
||
$8B-$8E PLISTZLO, PLISTZHI -- pointers to rotated z-coordaintes
|
||
$A3-$AE CXLO, CXHI, CYLO, CYHI, CZLO, CZHI -- Pointers to rotated
|
||
centers.
|
||
$AF-$B0 ROTMATH -- pointer to rotation math table
|
||
$B1-$B8 MULTLO1 LO2 HI1 HI2 -- pointers to multiplcation tables
|
||
$B9 Bitmap (high byte)
|
||
$BB-$BC FILLPAT -- pointer to fill pattern (not table)
|
||
$BD-$C4 PLISTXLO, XHI, YLO, YHI -- pointers to rotated/projected points
|
||
(PLISTZLO = $8B, above)
|
||
|
||
$0200 Point queue
|
||
$4F00 LINELO -- Record drawn lines in wireframe
|
||
$4F68 LINEHI
|
||
$4FD0 OBLETS -- Sorted oblet list
|
||
$5000 obj3d
|
||
$5600-$5D00 obj3d tables:
|
||
$5600 OBJLO -- Object list (pointers)
|
||
$5680 OBJHI
|
||
$5700 VISOBJ -- Visible object list
|
||
$5781 OBCEN -- Center object number
|
||
$5800 CX - Translated rotated centers
|
||
$5880 HCX - (high byte)
|
||
$5900 CY
|
||
$5980 HCY
|
||
$5A00 CZ
|
||
$5A80 HCZ
|
||
$5B00 PLISTX - Point list (projected)
|
||
$5B80 (high bytes)
|
||
$5C00 PLISTY
|
||
$5C80 (high byte PLISTY)
|
||
$5D00 PLISTZ
|
||
$5D80 high byte
|
||
$5E00-$5FFF ROTMATH -- rotation table (relocatable, pointed to by $AF)
|
||
$8400-$9FFF lib3d
|
||
$C000-$C2FF MULTLO, pointed to by $F7-$F8 and $F9-$FA
|
||
$C300-$C5FF MULTHI, pointed to by $FB-$FC and $FD-$FE
|
||
$C600-$CFFF More tables (nonrelocatable, see lib3d.text)
|
||
|
||
----------------
|
||
|
||
So, to put it another way, free areas of RAM are:
|
||
|
||
$02-$40
|
||
$55-$72 (temporary only; library work variables)
|
||
$90-$A2
|
||
$C5-$FF
|
||
|
||
$02xx-$4FFF
|
||
$6000-$83FF
|
||
$A000-$BFFF
|
||
$D000-$FFFF
|
||
|
||
|-|x|--|x|---------------|xxxx|------|xxxxxx|------|xxxx|-------------------|
|
||
| | | | |
|
||
$41 $0200 $4F00 $8400 $C000
|
||
|
||
Moreover, the range $C000-$C5FF can be made available by relocating the
|
||
tables there. This way, $E000 may be used as a bitmap, with enough extra
|
||
room for 8 sprite definitions. Thus, bitmaps are available in all banks.
|
||
|
||
|
||
* Object record
|
||
|
||
ObjCX = 0 ;Center, X-coord (signed 16-bit)
|
||
ObjCY = 2 ;Y-coord
|
||
ObjCZ = 4 ;z-coord
|
||
ObjData = 6 ;Pointer to structure data
|
||
ObjID = 8 ;User bytes
|
||
ObjUser = 9
|
||
ObCenPos = 10 ;Position in center list
|
||
ObjCXRem = 11 ;Center remainders
|
||
ObjCYRem = 12
|
||
ObjCZRem = 13
|
||
ObjMat = 14 ;Viewpoint matrix, int + rem
|
||
ObjSize = 32 ;32 bytes total
|
||
|
||
|
||
* Jump table
|
||
|
||
Init3D = $5000 ;Initialize lib3d
|
||
AddObj = Init3D+3 ;Add object to object list
|
||
DelObj = AddObj+3 ;Delete object from list
|
||
SetCurOb = DelObj+3 ;Set current object
|
||
GetCurOb = SetCurOb+3 ;Get current object
|
||
GetNextOb = GetCurOb+3 ;Get next object in list
|
||
GetObj = GetNextOb+3 ;Get pointer to object
|
||
|
||
SetMat = GetObj+3 ;Calculate and set object matrix
|
||
Pitch = SetMat+3 ;Pitch - rotate object around x-axis
|
||
Yaw = Pitch+3 ;Yaw - rotate around y-axis
|
||
Roll = Yaw+3 ;Roll - rotate around z-axis
|
||
MoveSide = Roll+3 ;Move object
|
||
MoveUp = MoveSide+3
|
||
MoveForwards = MoveUp+3
|
||
GetSideVec = MoveForwards+3 ;Orientation vectors
|
||
GetUpVec = GetSideVec+3 ;(length=64)
|
||
GetFrontVec = GetUpVec+3
|
||
|
||
SetParms = GetFrontVec+3 ;Set rendering parameters
|
||
|
||
SetVisParms = SetParms+3 ;Set visibility parameters
|
||
CalcView = SetVisParms+3 ;Set viewpoint = object
|
||
SortVis = CalcView+3 ;Compute and sort visible objects
|
||
DrawAllVis = SortVis+3 ;Draw all visible objects
|
||
GetNextVis = DrawAllVis+3 ;Draw next objesible object list
|
||
RotDraw = GetNextVis+3 ;Rotate and draw object
|
||
DrawFace = RotDraw+3 ;Draw single face (polygon)
|
||
|
||
* lib3d stuff
|
||
|
||
CALCMAT EQU $8800
|
||
ACCROTX EQU $8803
|
||
ACCROTY EQU $8806
|
||
ACCROTZ EQU $8809
|
||
GLOBROT EQU $880C
|
||
ROTPROJ EQU $880F
|
||
POLYFILL EQU $8812
|
||
PLOT EQU $8815
|
||
DRAWLINE EQU $8818
|
||
VERSION EQU $881B
|
||
|
||
|
||
Routine descriptions
|
||
--------------------
|
||
|
||
Init3D
|
||
On entry: .AY = pointer to object record storage area
|
||
On exit:
|
||
|
||
This routine is used to initialize various obj3d and lib3d pointers and
|
||
variables, and should be called before any other routines are called.
|
||
Note that if e.g. tables or the screen center are moved around, the
|
||
corresponding variables should be set *after* calling Init3D.
|
||
|
||
AddObj
|
||
On entry: .AY = pointer to object structure data
|
||
.X = optional user ID byte
|
||
On exit: .AY = pointer to object
|
||
.X = object number
|
||
C set indicates error (e.g. too many objects!)
|
||
|
||
AddObj is used to add objects into the world. It places the object at
|
||
the first empty spot in the active object list, and allocates a
|
||
corresponding portion of memory in the object storage area, as passed
|
||
to Init3D.
|
||
|
||
SetCurOb
|
||
On entry: .X = object number
|
||
On exit: .AY = pointer to object
|
||
.X = object number
|
||
|
||
SetCurOb is used to set the current object. The "object number" is
|
||
a number returned by AddObj. This routine is used before calling
|
||
e.g. the movement routines, which act on the current object.
|
||
|
||
GetCurOb
|
||
On entry:
|
||
On exit: .AY = pointer to object
|
||
.X = object number
|
||
|
||
GetCurOb is used to get the current object number and pointer.
|
||
|
||
GetOb
|
||
On entry: .X = object number
|
||
On exit: .AY = pointer to object
|
||
|
||
GetOb gets a pointer to an object without setting that object to
|
||
be the current object.
|
||
|
||
DelObj
|
||
On entry: .X = object number
|
||
On exit: C set means rather nasty error
|
||
|
||
DelObj is used to delete an object from the active object list.
|
||
|
||
GetNextOb
|
||
On entry:
|
||
On exit: .X = object number
|
||
.AY = object pointer
|
||
C = 1 -> error
|
||
|
||
GetNextOb gets the next object in the active object list, starting from
|
||
the current object. On exit, the current object is set to .X. This
|
||
routine may be used to cycle through the list of active objects.
|
||
|
||
|
||
* Object manipulation routines
|
||
|
||
|
||
SetMat
|
||
On entry: .X = angle around x-axis
|
||
.Y = angle around y-axis
|
||
.A = angle around z-axis
|
||
On exit:
|
||
|
||
SetMat is used to set a rotation matrix for the current object. Angles
|
||
go from 0..127. Note that SetMat rotates around the fixed _world_ axis,
|
||
not an object's local coordinate axis; use Yaw/Pitch/Roll to rotate about
|
||
the local axis.
|
||
|
||
Yaw
|
||
Pitch
|
||
Roll
|
||
On entry: C clear -> positive rotation
|
||
C set -> negative rotation
|
||
On exit:
|
||
|
||
Yaw, Pitch, and Roll rotate an object by a fixed amount (3 degrees or so)
|
||
about the local coordinate axis. (The local coordinate axis rotates
|
||
with the object).
|
||
|
||
MoveUp
|
||
MoveSide
|
||
MoveForwards
|
||
On entry: .A = distance (signed)
|
||
On exit:
|
||
|
||
MoveUp/Side/Forwards are used to move an object along its local coordinate
|
||
axis, by an amount proportional to .A; negative values of .A will move in
|
||
the opposite direction.
|
||
|
||
GetUpVec
|
||
GetSideVec
|
||
GetFrontVec
|
||
On entry:
|
||
On exit: (.X,.Y,.A) = signed (x,y,z) coordinates of orientation vector
|
||
|
||
GetVec is used to figure out what direction the current object is
|
||
pointing in. The vectors are signed, and of length 64.
|
||
|
||
|
||
* Visualization routines
|
||
|
||
|
||
SetParms
|
||
On entry: .AY = pointer to pattern table
|
||
.X = Bitmap address (high byte)
|
||
C set -> solid polygons
|
||
C clear -> wireframe
|
||
On exit:
|
||
|
||
SetParms is used to set certain rendering parameters. The pattern table
|
||
consists of a list of 8x8 patterns.
|
||
|
||
SetVisParms
|
||
On entry: .AY = Maximum object range
|
||
.X = Minimum object range
|
||
On exit:
|
||
|
||
SetVisParms is used to set the range in which an object is considered
|
||
"visible". An object's center z-coordinate is compared to these values;
|
||
the range is not a radius.
|
||
|
||
CalcView
|
||
On entry: .X = Viewpoint object
|
||
On exit:
|
||
|
||
CalcView computes the view from the viewpoint object, by translating
|
||
and rotating centers relative to the viewpoint object. The relative
|
||
centers are stored in the CX HCX etc. lists; the ObCenPos element in
|
||
the object record is an index into this list.
|
||
|
||
SortVis
|
||
On entry:
|
||
On exit:
|
||
|
||
SortVis computes a sorted list of visible objects. Objects are visible
|
||
if they are within a 45 degree cone forwards of the viewpoint object,
|
||
and within the min/max visibility range, which may be changed with
|
||
SetVisParms. CalcView must be called before calling this routine.
|
||
Sorting is necessary to ensure that objects overlap one another
|
||
correctly on the screen. On exit, the current object is set to the
|
||
first object in this list.
|
||
|
||
DrawAllVis
|
||
On entry:
|
||
On exit:
|
||
|
||
DrawAllVis draws all visible objects, in order, as determined by SortVis.
|
||
|
||
GetNextVis
|
||
On entry:
|
||
On exit: .X = Current object
|
||
.AY = Pointer to object
|
||
N set -> at end of list
|
||
|
||
GetNextVis fetches the next object in the visible object list, setting
|
||
it to the current object. This routine is used to draw one object at
|
||
a time, but in the proper order.
|
||
|
||
RotDraw
|
||
On entry: .X = Object number
|
||
On exit: Cool rendered polygon
|
||
|
||
RotDraw renders an object to the screen, by rotating and projecting
|
||
the object vertices and then drawing faces, either wireframe or solid.
|
||
On exit, the rotated and projected points, i.e. the screen coordinates
|
||
of the object, are stored in PLISTX and PLISTY; PLISTZ contains the
|
||
rotated (but not projected) z-coordinates.
|
||
|
||
DrawFace
|
||
On entry: .AY = pointer to face data
|
||
On exit: .AY = pointer to next face
|
||
|
||
DrawFace renders a polygon to the screen, either wireframe or solid.
|
||
It would be an awfully good idea to have the rotated points in PLIST,
|
||
i.e. to call RotDraw before calling this routine.
|
||
.......
|
||
....
|
||
..
|
||
. C=H #18
|
||
|
||
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||
|
||
|
||
Stroids o
|
||
------- o o
|
||
o SLJ
|
||
|
||
When you get down to it, just displaying things on the screen is
|
||
awfully easy. And clearly, the obj3d library is up to the task of simple
|
||
programs like Cool World. What isn't clear, however, is whether it is
|
||
useful for making applications like games, where objects are constantly
|
||
being created and destroyed, and have different properties and velocities
|
||
and such.
|
||
|
||
Hence stroids. Stroids is a demonstration of the obj3d routines,
|
||
more specifically a demonstration that obj3d is suitable for writing games
|
||
and such. In stroids, you can fly around in an asteroid field containing
|
||
three different types of randomly drifting asteroids. The first part of
|
||
this article will discuss the main algorithms and techniques used in the
|
||
program.
|
||
|
||
Stroids is also meant to be a starter project for people who would
|
||
like to experiment with the library. For the most part, all of the difficult
|
||
routines have been written; with a little more work, Stroids could be made
|
||
into an actual game, and there are lots of opportunities for modification and
|
||
improvement. Thus the second part of this article will suggest a number
|
||
of possible ideas and modifications, and how they might be coded up. This is
|
||
rather akin to a C=Hacking C=Hallenge, so I'm interested in publishing the
|
||
niftier modifications and applications that might result.
|
||
|
||
Finally, the full source code is included at the end of this article
|
||
(the PETSCII el cheapo version is in the .zip).
|
||
|
||
|
||
The program
|
||
-----------
|
||
|
||
The source code is in El Cheapo format. To use the program, just
|
||
load and run the loader program. Stroids accepts the following keys:
|
||
|
||
joystick in port 2 Pitch and yaw, fire
|
||
@ and / Increment/decrement velocity
|
||
space Switch viewpoint object
|
||
|
||
r Toggle radar on/off
|
||
a/z q/w s/d Pitch, roll, yaw
|
||
+/- Increment/decrement asteroid density
|
||
= Toggle wireframe mode
|
||
|
||
Initially, the viewpoint is set to a large, fixed tetrahedron at the
|
||
center of the world; your ship is straight ahead, and you can move
|
||
it around using the joystick and @/. Pressing space shifts the viewpoint
|
||
to the next object -- the ship. Pressing space again will hop onto
|
||
the next object -- an asteroid! Pressing it some more will cycle through
|
||
all the objects, eventually returning to the first object.
|
||
|
||
|
||
The code
|
||
--------
|
||
|
||
The purpose of this project was to test out the obj3d routines
|
||
in some tougher game-like conditions, in which many non-indentical objects
|
||
are present and are being created and destroyed more or less randomly,
|
||
and where things like collisions must be detectable. A 3D asteroid field
|
||
seemed like a reasonable test -- asteroids can created more or less randomly,
|
||
with different sizes and velocities. A player could then fly around in
|
||
the asteroid field, maybe with a radar display showing the relative
|
||
positions of asteroids. Maybe the asteroids could be shot, or simply
|
||
dodged. And so on.
|
||
The program is really pretty simple. There are two routines which
|
||
control the asteroid field; one controls creating and destroying asteroids,
|
||
the other controls their movement. There are two routines to compute and
|
||
render a crude radar display. Obj3d is used to render the screen, and
|
||
all that's left is to move the ship around and wait for keys. A little
|
||
IRQ routine is used to keep the program running under 60fps on a SuperCPU,
|
||
which also reads the joystick (and which in principle would play music,
|
||
handle sound effects, etc.), and that's about it. Thus the main loop is
|
||
quite straightforward:
|
||
|
||
- Update asteroid field
|
||
- Set up radar
|
||
- Compute/render main screen
|
||
- Render radar display
|
||
- Move ship and wait for keys
|
||
|
||
Stroids
|
||
JSR Init
|
||
LDA #00
|
||
STA CURD
|
||
|
||
:loop
|
||
JSR CheckDensity
|
||
JSR DriftStroids
|
||
|
||
JSR SetRadar
|
||
|
||
LDX VOB ;Calculate view
|
||
JSR CalcView
|
||
JSR SortVis ;Sort objects
|
||
JSR DrawAllVis ;Draw objects
|
||
|
||
JSR DrawRadar
|
||
|
||
JSR CheckFire
|
||
JSR SwapBuf
|
||
|
||
LDX ROB ;Set rotation object
|
||
JSR SetCurOb
|
||
LDA VELOCITY
|
||
JSR MoveForwards
|
||
|
||
:wait LDA IRQFLAG
|
||
BEQ :wait
|
||
|
||
|
||
The asteroid field
|
||
------------------
|
||
|
||
The asteroid field only "exists" in a little cube. When asteroids
|
||
exit this cube they are destroyed, and new asteroids created. Currently
|
||
this cube stays fixed in the world, but one of the suggested projects is
|
||
to center it on, i.e. make it move with, the ship. The purpose of the
|
||
cube is to keep things manageable -- it makes no sense to keep track of
|
||
asteroids that are many thousands of units away. That would just massively
|
||
bog down the system, and mean that the player wouldn't ever see or interact
|
||
with any asteroids. What's fun about that?
|
||
The asteroid field within the cube is characterized by a "density",
|
||
which may be changed by pressing the + and - keys. There are three different
|
||
kinds of asteroids -- large, medium, and small -- and each asteroid has a
|
||
"weight". When an asteroid is created, its weight is added to the total
|
||
field weight; when destroyed, its weight is subtracted. If the total weight
|
||
exceeds the "density" value, no new asteroids are created. The net result
|
||
is a constantly changing asteroid field with a pleasantly uniform density.
|
||
To create an asteroid, a random value is chosen for the weight;
|
||
this weight determines the size of the asteroid. If the weight is too large
|
||
(would exceed the field density) then no asteroid is created. This keeps
|
||
the field changing, since asteroids are not simply replaced by identical
|
||
objects, and probably gives big asteroids a chance. That is, a field that
|
||
is always "full" surely favors small objects: if a large asteroid leaves
|
||
the field, it can be replaced by multiple smaller ones; if a small asteroid
|
||
leaves, it can only be replaced by a smaller one. So I predict that the
|
||
field would otherwise quickly degenerate into a bunch of little asteroids.
|
||
If an asteroid makes it into the field, it is assigned a random
|
||
position, speed, and orientation. The orientation is computed using the
|
||
obj3d routine SetMat. The object's "weight" is stored in the ID byte of
|
||
the object, and the velocity is stored in the user byte. This provides an
|
||
easy way to identify the type of object, and keeps the velocity along with
|
||
the object (instead of putting it in another table). By storing all non-
|
||
asteroid objects with the high bit of the ID byte set, it is very easy to
|
||
differentiate asteroids from other objects. Once created, an asteroid
|
||
just moves in a straight line, until it leaves the play area. There is no
|
||
collision detection -- that's a project for you! (But it's pretty easy).
|
||
All of this is done using two routines: CheckDensity and DriftStroids.
|
||
CheckDensity simply creates new asteroids until it can't create any more;
|
||
DriftStroids simply goes through the object list, looking for asteroids
|
||
and moving any it finds (recall that the velocity of the asteroid is
|
||
stored in the user byte). The code is pretty straightforward, so you
|
||
can go through the source listing to examine the routines in more detail.
|
||
|
||
|
||
Random numbers
|
||
--------------
|
||
|
||
It is worthwhile to say a word or two about the random number
|
||
generator used. I used it as an experiment in my quest for a very quick
|
||
but reasonable random number generator, and it seems to work fairly well --
|
||
certainly better than other ones I tried. (Deficiencies in random number
|
||
generators become awfully apparent awfully quick, in the asteroid field).
|
||
This particular generator uses the "middle-squares" method. In
|
||
this method (which was proposed by VonNeumann), an n-bit number is squared,
|
||
and the middle n-bits are taken as the next number in the sequence.
|
||
In this case, the numbers are 8-bits. To get the next number in the
|
||
sequence, the number is squared, giving a 16-bit number, and the middle
|
||
eight bits -- bits 4 through 11 -- are used as the next number in the
|
||
sequence.
|
||
To do the squaring, I simply used the lib3d multiplication tables
|
||
of f(x)=x^2/4. Two more divisions by two thus gives x^2/16, i.e. the middle
|
||
8-bits.
|
||
Middle-squares is not without problems. The method is known to
|
||
have a number of short sequences -- ideally you want a sequence of numbers
|
||
that takes a long time to repeat; a sequence like 1 99 63 1 99 63 ... isn't
|
||
so useful. The method also dies once you hit a zero -- zero squared is
|
||
just zero. So I built in a simple modification to compensate for these
|
||
deficiencies: the routine re-seeds itself whenever a) the current seed
|
||
generates itself (like zero will), or b) the current number sequence
|
||
exceeds a maximum length (that is, after generating N numbers it re-seeds
|
||
itself). The re-seeding is just a simple method to keep the algorithm from
|
||
getting stuck.
|
||
|
||
|
||
Radar Display
|
||
-------------
|
||
|
||
Navigating around a 3D world is very difficult without some form
|
||
of reference. A compass is one possibility; landmarks another. A radar
|
||
display is potentially much more useful, though, and also more difficult --
|
||
another good test of the routines. The stroids radar uses a pretty neat
|
||
trick: it actually creates a "radar object", whose vertices are the object
|
||
centers, and lets obj3d do the hard calculations. This will be explained
|
||
shortly.
|
||
The purpose of the radar is to display where objects are located
|
||
relative to the person. With a few moments of thought this is seen to
|
||
be very similar to the "viewpoint" problem. That is, to compute the
|
||
viewpoint from a particular object, the surrounding objects need to be
|
||
translated and rotated about the viewpoint object. This is exactly what
|
||
the obj3d routine CALCVIEW does. So by dipping into the obj3d center list
|
||
(after calling CALCVIEW) we can get all the relative locations automatically.
|
||
The purpose, however, is to _display_ the relative object locations,
|
||
not merely to compute them. Imagine, for a moment, a cube, with us located
|
||
at the center of the cube (this is, after all, all a 3d world really is).
|
||
Then imagine a bunch of dots around the cube, representing the locations of
|
||
other objects. There's our radar display -- now how could we draw something
|
||
like that on the screen?
|
||
Well, we said it was contained in a cube. But drawing a cube is
|
||
pretty easy -- just specify the vertices of the cube, locate the center out
|
||
away from the viewer, rotate and project. Well from there it's awfully
|
||
easy to compute the points inside the cube -- just add them to the list
|
||
of vertices, and rotate and project them along with the rest of the cube,
|
||
and then maybe plot them on the screen. And when you get down to it,
|
||
the vertices of the cube aren't really necessary.
|
||
The only other thing to realize is that there is an obj3d routine
|
||
for rotating and projecting points -- RotDraw. So now we have a way of
|
||
generating a radar display: create a new object, whose vertices are exactly
|
||
the relative object centers computed by CalcView. Give the object a
|
||
center coordinate out a little ways from the viewpoint object, and then
|
||
just rotate, project, and plot the resulting points somewhere on the screen.
|
||
|
||
The radar code is a little tricky, and could surely use some
|
||
modification, so it's worth going through it in some detail. The radar
|
||
is an actual obj3d object, and is the first object created -- thus it
|
||
is object number 0. Recall that CalcView translates and rotates all
|
||
objects relative to the viewpoint object. Before CalcView is called,
|
||
the location of the radar object is set to the location of the viewpoint
|
||
object:
|
||
|
||
*
|
||
* DrawRadar -- Compute and draw radar
|
||
* display, by creating a new object whose points are simply the
|
||
* (scaled) object centers.
|
||
*
|
||
|
||
RADOFF = 24 ;Size of radar
|
||
RADFLAG DFB #$00 ;Radar toggle
|
||
|
||
IDENTITY DFB 64,0,0 ;Identity matrix
|
||
DFB 0,64,0
|
||
DFB 0,0,64
|
||
|
||
* Set radar center to view center
|
||
|
||
SetRadar
|
||
LDX VOB
|
||
JSR SetCurOb
|
||
STA TEMP
|
||
STY TEMP+1
|
||
LDX #00
|
||
JSR SetCurOb
|
||
STA POINT
|
||
STY POINT+1
|
||
LDY #5
|
||
:l LDA (TEMP),Y
|
||
STA (POINT),Y
|
||
DEY
|
||
BPL :l
|
||
rts2 RTS
|
||
|
||
Thus CalcView will translate the center to be (0,0,0) and store those zeros
|
||
in the center list (CZ and HCZ, located at $5A00 and $5A80). One consequence
|
||
of doing this is that the radar object will not be considered "visible",
|
||
and hence skipped over by DrawAllVis -- the radar object needs to be drawn
|
||
manually.
|
||
That's the job of DrawRadar. The radar is drawn on the screen last,
|
||
so it is always in the foreground. The first step is to locate the radar
|
||
as if it were out in front of the viewpoint object (if you think of the
|
||
radar display as a cube, you can see that it needs to be treated as if it
|
||
were out in front of the viewer, not right on top of/surrounding the viewer):
|
||
|
||
DrawRadar
|
||
LDA RADFLAG
|
||
BMI rts2
|
||
LDX #00
|
||
JSR GetObj
|
||
STA POINT
|
||
STY POINT+1
|
||
|
||
LDY #ObCenPos
|
||
LDA (POINT),Y
|
||
TAX
|
||
LDA #200 ;First, cheat the center
|
||
STA CZ,X ;by putting it at (0,0,x); note radar is object 0
|
||
LDA #03 ;(so projection will work out correctly -- don't want
|
||
STA HCZ,X ;negative points!)
|
||
|
||
A value of $03C8 is stored directly into the object center list CZ. This
|
||
is the list used by RotDraw: the object centers from this list are added
|
||
to the object vertices before projecting. The value $03C8 was chosen
|
||
because it makes the radar a reasonable size on the screen -- smaller
|
||
values of the z-coordinate mean the object is closer to the viewer, and
|
||
hence will appear larger.
|
||
The next step is to set the viewpoint orientation matrix to the
|
||
identity matrix. RotDraw implements the equation M*(RP + C) -- that is,
|
||
rotate a vertex P by the orientation matrix R, add it to the center C,
|
||
and rotate the whole thing by the viewpoint orientation matrix M. In
|
||
this case, the radar needs to be _not_ rotated, so M needs to be set to 1
|
||
(R, the local rotation matrix, is already set to the identity matrix).
|
||
The viewpoint matrix used by RotDraw is stored in zero page, at VIEWMAT,
|
||
so it's a simple matter of copying the identity matrix defined up above:
|
||
|
||
LDX #8
|
||
:l1 LDA IDENTITY,X
|
||
STA VIEWMAT,X ;Don't add any extra viewpoint rotation
|
||
DEX
|
||
BPL :l1
|
||
|
||
The next step is to create the data for the radar.
|
||
The idea is to create an actual radar object, and update the
|
||
vertices at each pass of the main loop. The radar object is stored at
|
||
the very end of the code:
|
||
|
||
*
|
||
* Radar object. To do the radar, an object is used whose points are simply
|
||
* the translated and rotated object centers. This object is then projected
|
||
* using the obj3d routines, and the points plotted.
|
||
*
|
||
RADOBJ
|
||
DFB 0 ;Normal object
|
||
DFB 0 ;Number of points
|
||
DFB 0 ;Number of faces
|
||
|
||
* Point list
|
||
|
||
RADDAT
|
||
|
||
The idea is to update the number of points and set the vertices -- stored
|
||
at RADDAT -- to be the translated and rotated object centers. Recall,
|
||
however, that object vertices must be in the range -95..95 or so. A typical
|
||
object center, however, is a 16-bit number. So the object centers need to
|
||
be scaled; the radar code divides them by eight, before adding to the vertex
|
||
list, setting any out of range numbers to either -95 or 95. This is done
|
||
using the little subroutine DIV8X1, used later.
|
||
Before doing anything, however, three pointers need to be set
|
||
up which point to the x-, y-, and z-coordinates of the radar object
|
||
vertices:
|
||
|
||
LDX NUMOBJS
|
||
DEX
|
||
STX RADOBJ+1 ;Number of points
|
||
TXA
|
||
CLC
|
||
ADC #<RADDAT
|
||
STA TEMP ;y-coords
|
||
LDA #>RADDAT
|
||
ADC #00
|
||
STA TEMP+1
|
||
TXA
|
||
ADC TEMP
|
||
STA POINT ;z-coords
|
||
LDA TEMP+1
|
||
ADC #00
|
||
STA POINT+1
|
||
|
||
Note the STX RADOBJ+1, which sets the number of points stored in the
|
||
object. Once this is done, the code simply moves through the translated/
|
||
rotated center list, divides each coordinate by eight, and stores the
|
||
result in the object:
|
||
|
||
LDY #00 ;Order doesn't matter
|
||
:loop
|
||
LDA CX,X
|
||
STA X1
|
||
LDA HCX,X
|
||
JSR DIV8X1
|
||
STA RADDAT,Y
|
||
|
||
LDA CY,X
|
||
STA X1
|
||
LDA HCY,X
|
||
JSR DIV8X1
|
||
STA (TEMP),Y
|
||
|
||
LDA CZ,X
|
||
STA X1
|
||
LDA HCZ,X
|
||
STA TAB1,Y ;Remember sign
|
||
JSR DIV8X1
|
||
STA (POINT),Y
|
||
INY
|
||
:skip DEX
|
||
BNE :loop ;0 is radar object
|
||
|
||
That's all there is to creating the radar! But it still needs to be
|
||
rendered to the screen.
|
||
The lib3d routines have two zero page variables, XOFFSET and YOFFSET,
|
||
which tell the routines where the center of the screen is -- after points
|
||
are projected, they are added to XOFFSET and YOFFSET to get the actual
|
||
screen coordinates. Normally these are set to the physical center of
|
||
the screen, e.g. XOFFSET=160 and YOFFSET=100, but having the radar plopped
|
||
right into the middle of the screen isn't so useful -- better to have it
|
||
tucked away off in a corner. The easiest way to do this is to change
|
||
XOFFSET and YOFFSET to make the projection routines think that the origin
|
||
is at, say, (24,24), in the upper-left corner of the screen:
|
||
|
||
LDA XOFFSET ;Change coordinate offsets
|
||
PHA
|
||
LDA YOFFSET
|
||
PHA
|
||
LDA #RADOFF
|
||
STA XOFFSET ;Upper-left cornerof screen
|
||
STA YOFFSET
|
||
|
||
LDX #00
|
||
JSR RotDraw
|
||
|
||
PLA
|
||
STA YOFFSET
|
||
PLA
|
||
STA XOFFSET
|
||
|
||
RotDraw projects the points, and stores them in PLISTX and PLISTY. Therefore
|
||
all that remains is to move through these lists and plot each point! When
|
||
I tried this, however, the result was unsatisfactory -- there were just a
|
||
bunch of points on the screen, and it was very difficult to tell where
|
||
they were located relative to the view, or how far away they were, etc.
|
||
So the next logical step was to draw lines instead of points -- that is,
|
||
draw a line from the center of the radar (the viewer location) to the
|
||
individual points. This helped, but it was still difficult to determine
|
||
e.g. whether an asteroid was in front of or behind the viewer. So the
|
||
last step was to use different colors for the lines, depending on whether
|
||
the object is in front or behind the viewer. This is done by simply
|
||
checking the sign of the z-coordinates; the z-coordinates were stored
|
||
in a spare table TAB1, above, in the code which computed the object
|
||
vertices.
|
||
With all that in mind, here's the rendering code:
|
||
|
||
:loop2 LDY RADOBJ+1 ;Now plot each point
|
||
DEY
|
||
LDA PLISTX,Y
|
||
STA X1
|
||
LDA PLISTX+$80,Y
|
||
STA X1+1
|
||
LDA PLISTY,Y
|
||
STA Y1
|
||
LDA PLISTY+$80,Y
|
||
STA Y1+1
|
||
LDA #RADOFF ;Line from center to point
|
||
STA X2
|
||
STA Y2
|
||
LDA #00
|
||
STA X2+1
|
||
STA Y2+1
|
||
|
||
LDA #<COLOR2 ;Set fill pattern
|
||
STA FILLPAT
|
||
LDA #>COLOR2
|
||
STA FILLPAT+1
|
||
LDA TAB1,Y ;Use different colors
|
||
BMI :draw ;for front/back
|
||
LDA #<COLOR1
|
||
STA FILLPAT
|
||
LDA #>COLOR1
|
||
STA FILLPAT+1
|
||
|
||
:draw JSR DrawLine
|
||
|
||
DEC RADOBJ+1
|
||
BNE :loop2
|
||
:rts RTS ;Whew!
|
||
|
||
where COLOR1 and COLOR2 are simple 8x8 patterns:
|
||
|
||
COLOR1 HEX 5555555555555555
|
||
COLOR2 HEX AAAAAAAAAAAAAAAA
|
||
|
||
And that's all there is to it!
|
||
That pretty much wraps up the non-obvious parts of the code; the
|
||
rest is really straightforward. All that leaves is...
|
||
|
||
|
||
Simple Modification and Improvement Projects
|
||
--------------------------------------------
|
||
|
||
Not only did I not feel like doing further work on the project,
|
||
it occured to me that others might actually be interested in doing the
|
||
simple routines needed to e.g. make it into a game. So in this section
|
||
I thought I'd describe some possible directions that the code might be
|
||
taken in -- some simple projects that give some practice in using the
|
||
obj3d routines and 3d graphics in general. So without further ado...
|
||
|
||
- Third person perspective
|
||
|
||
It might be interesting to try putting in a third-person perspective,
|
||
i.e. place an empty object above and behind the view object.
|
||
|
||
- Collisions
|
||
|
||
Currently there is no collision detection -- in particular, there
|
||
is no detection of an asteroid hitting the ship. This is a pretty easy
|
||
task -- get the ship's center x-, y-, and z-coordinates, and compare
|
||
them to the coordinates of every asteroid. Use JSR GetNextObj to traverse
|
||
the object list, check the ID byte (asteroids have the high bit clear),
|
||
and if an asteroid compute the difference between the asteroid and ship
|
||
centers. If it is small enough for all three coordinates, signal a
|
||
collision. Note that the translated/rotated centers in CX, CY, CZ
|
||
may be used without performing the subtraction.
|
||
If you're feeling more brave, a good challenge would be to let
|
||
asteroids collide, and break into smaller asteroids upon collision. It
|
||
just involves many more comparisons -- perhaps even a little data
|
||
structure to process the comparisons more efficiently (e.g. sorting
|
||
one of the coordinates, and only comparing near neighbors).
|
||
|
||
- Realistic flight model
|
||
|
||
Currently stroids uses a rather cheesy "flight model", where
|
||
you always move in the forwards direction. A more realistic flight model,
|
||
taking intertia into account, would probably be more fun. Physics says
|
||
that force causes a change in velocity in the direction of that force --
|
||
in other words, if you thrust in a particular direction, it adds velocity
|
||
in that direction. To implement this on a computer, you need to get the
|
||
direction of thrust, using GetFrontVec, and add that vector to the total
|
||
velocity vector:
|
||
|
||
If thrust
|
||
- GetFrontVec (vector has length = 64)
|
||
- Scale vector -- maybe divide by 16, keeping fractional part;
|
||
maybe treat strictly as fractional part.
|
||
- Add to total velocity
|
||
|
||
Then at each pass through the main loop the code simply adds the total
|
||
velocity to the center coordinates.
|
||
|
||
- Compass, position, fuel, stats
|
||
|
||
With a more realistic flight model, it becomes imperative to
|
||
somehow indicate what direction the ship is moving, compared with the
|
||
direction it is pointing. In the absense of landmarks, this means that
|
||
the position and direction need to be indicated somehow, either graphically
|
||
or in plain text. A simple solution would be to use a raster interrupt at
|
||
the bottom of the screen, and display the information as text.
|
||
Naturally, if a game of some sort is desired, then it might be
|
||
helpful to add damage and fuel into the program.
|
||
|
||
- Better radar
|
||
|
||
The current radar display is not terribly effective. One possibility
|
||
is to make an Elite-like radar display, which gives a plane of reference and
|
||
indicates altitude and position (i.e. draws right-triangles). This isn't a
|
||
very difficult extension of the radar calculation. The radar display should
|
||
be tilted, which means using SetMat to rotate the radar around the x-axis
|
||
when it is first initialized. Then, when adding the object vertices, for
|
||
every point (x, y, z) add another point (x, 0, z) -- drawing a line
|
||
between these two points gives the altitude. (Literally, it draws the
|
||
altitude of a right triangle; the current display draws the hypoteneuse).
|
||
|
||
- Better asteroid objects
|
||
|
||
Tetrahedrons are not particularly inspiring asteroids. Draw some
|
||
new non-lame ones!
|
||
|
||
- Move asteroid field with ship
|
||
|
||
Currently the asteroid field is centered at (0,0,0) -- that is, the
|
||
boundaries of the field are fixed. Center it instead on the ship, so that
|
||
the boundaries move with the ship.
|
||
|
||
- Variable field density
|
||
|
||
Instead of having a single fixed density to the field, modify the
|
||
program so that different areas of space have different asteroid densities.
|
||
|
||
- Projectiles and lasers
|
||
|
||
What's a game without weapons? A boring game, that's what. One
|
||
possibility is to add a projectile weapon -- make a little cube shoot out
|
||
the front of the ship, for example. It might fly straight, or it might
|
||
home in on a target. A collision detection routine would also be needed.
|
||
Another thing to do is to make the lasers actually do something.
|
||
Detecting a laser hit on an object is non-trivial -- ships which are closer
|
||
are larger, and should be easier to hit. The basic issue is to determine
|
||
whether or not the object covers the center of the screen -- that is, whether
|
||
there is any point (0,0,z) _inside_ of the object. One way to do this is
|
||
to check whether the (rotated and translated) center of a visible object is
|
||
within a certain distance of (0,0,z) (i.e. only check the x- and y-
|
||
coordinates). Note that CalcVis calculates and sorts the visible objects.
|
||
Another possibility is to draw each object, one at a time, and
|
||
check to see if the center of the screen (or some small area of the screen)
|
||
was plotted to. The thing that makes this method a little tricky is that
|
||
the farthest objects are drawn first, so a program needs to keep track of
|
||
the _last_ object that draws to the center of the screen, not the first.
|
||
And doing that means clearing the pixels being checked whenever they are
|
||
rendered to.
|
||
There are probably other, better methods of detecting collisions!
|
||
|
||
- Make a game
|
||
|
||
Naturally. Go crazy!
|
||
|
||
Source code
|
||
-----------
|
||
|
||
See the .zip file, or the Fridge, for the stroids source code.
|
||
.......
|
||
....
|
||
..
|
||
. C=H #18
|
||
|
||
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||
|
||
begin 644 obj3d.zip
|
||
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
|
||
MX^#:-;/4`^?@M*J>I5M.$SP2=[7-'+T"(]_DX>O'Q-.O[=O@45OS8U0?X
|
||
MI,*2;3%)WY?U36TR:3_BW,VTE&3$A6_SP#EA[`/)LVD[WB&)WK./"&Y7S#17
|
||
MA7=/H^@,NTB,0/[@X#`J<\?Z91;U(A)I2N<V+L!96^3Y)R*;S]6_M8F6V)RZ
|
||
M/R2;=X)U,O<MO]Q.(&[<7%V"68V;T`[TAG>TR7A.ME>\C7SA;*HJQ4T/[*^,
|
||
M=7\MSTT*$^AT!A<8'^2K[.<9T;4^%5_(-:`9BE>Z:(K3HQIX^U!XNR%0EW6K
|
||
M+$"'Y=?7*'=Y$KOF)L7ZKW*RGVH14A*5%?@/PD*"`K?Y^7AYN.%<G!RPM]E9
|
||
MF9G,3-#4-V\8Z),2$VEIXN*H8F(HR*/(2,/#B<.(P)/13Z]/-A<G1WI:J][C
|
||
M,A(C0_R>HNPM#>\CY20$N)CI2*_^[4J#/M?65%5\*"M[+QG4>RFDXQJ<5ES?
|
||
M-[U^<*5M5'T@E?R#P23EXY&T:=S/<UE@U4B"1E5QC*JYN=9P^.51?,+0/9=U
|
||
M.2_\S[J7:'1$1$)"2LC6E_\:&F9FMJYKJ@<C_OM/&L[^-F[R@^S"T/-]:<\@
|
||
MT8E&V8(A5_'+_B&[6HN=UN?2YB*M+Z1-8UM?BE_.-)[X/K]J/,'N+8BT!LCI
|
||
MV<6'5%[N_)Z\;K3?:0U2\E4['";JN;NX<[)^LB9VX/*$==_GG#P(U@H[O/+M
|
||
M`O5`!&Q5PW.YJAI1Y')<50W<3\G)E+@68%SO]D-0Y*3/0BT8V(01:KHV'C[8
|
||
ME(*/#?TSV^>,O-+JIIZOWA2V.L;Q*9D]"2MJ&OM+(Z;I&E[\;2-/"B']_$7=
|
||
MR:GBJV;ED-:JQ'RKZ^9`9I)&S)\ED3G0YW.JV2[@RSE[*=#@C:[Y=O7.`0(Q
|
||
M^DZ?_,/D#:/IF-FX>3I3!G,F2Y;UC,WL.]B\'2?.)92,BIZ9@U]$2@ZIJ6_Z
|
||
MT-G3]]7KV+2<]U7UG4.3RSO'0+A@9FSO6((:S0KM`C>-FN(F0F5_:5MQF,[9
|
||
M0(KG-M_0$U*2+PQP!Q6NQ=80_:Y"*>&Y!_)=C=ZB.QAU^]TBL97CU=@!_V;I
|
||
MV,7W5:T]DXM[1WLJ$D>+=E^N]_\'4$L#!!0````(`-5=QQIIZ_YL?0```*4`
|
||
M```&`!``;&]A9&5R55@,`-6,?C<"?Q,LG`]D`&/D4.3@8G#<Y+C*T*K;<9.A
|
||
MPG*%R4HACDX^KH;&2CH6.H8,CAPB#-T*CIN,P%*^`4'^7H;&"J:N!@80^1@.
|
||
M.;"\,5C>W\G+V$7/'R)5R:$!EC(!2P6'!/E[N@3#)&=P&($E3<&2/IY.QBYA
|
||
M1K[.,.E%'#8,\TP,+,T8&!@`4$L#!!0````(`&]*D28*MS<TN0D``(`9```+
|
||
M`!``8FEG=&5T<RYB+G-56`P`FXE^-X*F&#><#V0`E5A+<]O($<XQE_D#>T*5
|
||
M5+5^4%X\"5**MP*1D(4U2&`!T+1\3.*M').*4Y7DU^"OX$69#D72)*60/NFG
|
||
MI'L>P)"27;N42**[O^[I[NGIF>'O?O^,/%,6YS\9?25QXT3I!7V7(&\]^Z28
|
||
M/W2[0)!TL;I.CS5550D!;+%-7Z8J?=K!DTZ?OL"3B4^EDSCPW,;G:0E/'7RZ
|
||
MC=T(GKOP7+C#91`#H3$;VY4[0$IC%CG%K7+*0.K&2?"9CK+VWKE`&/K]F:$K
|
||
MYU?@O)($B>,3<G_V:30(E<0Y]UU"ID,O,="-8PO\OS]#VG-\4%=\[]SHDZS?
|
||
M!WL`8,CGQOT9L)3@_">WEX!-\>1[<4)*UV=@IH5@8+F)*U`743!@T+6;%*-H
|
||
M<0Y@IH5@8"J]412YPX1KD.L&)U00>?TH<NZ^32CT^@`Z!('PP1LR#X#/G*T5
|
||
M!3H,O&'B1DUT!-UE^65:B"P<OS?R'0C.&?:5V*T'&#A)Y+TE2R_I73*W014U
|
||
M*$<Y42*8B28G3A2,P,#;$^>M%Y.=,P8=BD05(!L%CKQBR%7@^P`%!`*1>H!\
|
||
MQY`WP1MW[?6Q(A"&<&2)X/#Y-@2AP#TW*&\21&,GZL=<<AL"'\)'Q)W;XUP!
|
||
M0J.+R(/Y<!(O&"IOP'(0Q:AP&S)XHXO@)[X[?)5<OFR;3Q$TB8)A4N.H"@R'
|
||
M>5\ZT2!F;`$2M0+3WW<C;_A*"9W(&4"AP8@@N/-BH24,")4W7NR=>[Z77,DZ
|
||
M.)=WGCMF"D*]T7''M":4ER)GZR!"&."%*BV)8!".1$$`@HWFBTS'I(R<<>;[
|
||
M3)/;H*L$^(H#,_B8`A8GTVC4:Z6ZLF4]5N"K($$(U^-66*TDHFS[:(/'A*B)
|
||
MTV-E0E6?&W20-(84@_$+$"I/PL"_>A4,GQ)H@[1'*'$RNK@@I,AFQ4VV2=__
|
||
M_9_I<:<#[3`KBM5BLZTY!N?L:DZ;<[[4G"ZYGBUR8-6</Q.@EJO%IYKS"UDN
|
||
M9KO)=#83+&B(RQGH5)]O*6F1<I7];S:=5S6K0^ZJU7JZF-><G"P_,P.JCLWO
|
||
M;SC'Z<\C=P2=D3Q[^>T7(8D["&GK[-R?)>.`]5E"*X6R'9E-MAHRVS#.S!NZ
|
||
ML-Y[01#UR8ZQ=;+5Z8-)=NRAC3Y`CC=[&\_<@SD('2]2@@O8DZ!$8`=:Y&M4
|
||
M43L8Q8*50.3VP#PLP&HSG:-T,JE,0M!:@<;269FEQZ4*&PML8%EZ=*R#<NXE
|
||
M`R=4!A2QWM0(!!_!`#7BY$<%8H$YKE$=8;)$;C8O06'2$<95V(IR9_A:T80&
|
||
MA3&['6%&U3L9;#"P$%Z[5S'$$+H.=-_TTWJ5\MF#/>I"&8S\Q.L%?A"]>/&"
|
||
MI/EREIY>>A&DN0ZK+4;6)!_;1,#08N%'1>#?."'ACOP!$OD@@2#:I4<_@HAI
|
||
ML8VP5ME4FS+;U%I]V-^%"A,AM4V/5`T\+YD)MCVB6]OT;I'?GV$#J?<:;AA\
|
||
M7G%U-":1:$U_:&F%EE;RWL("7RZF\\9!OKFA:,=$SS4^AL5W8)<"3GV->K(H
|
||
MJGEKQTP]H0I/D2RK'4^\KQ%R&D/K7E<%6`A\KZ_P)A&C(`F9S[3V>?DXB2@?
|
||
M%NPRVT#FETX"(P_YX80'CB(6K.CEX%H0A/4<,I.$98:FL]F:L75S(._3W!3K
|
||
MO>ANE-3=EHJ:)LM;K)"R`6B6Z>83\*U.Y)J[2`\>D)&QXR641U<@Y*KZG%(F
|
||
M28N;97KTO?,]9X:XV_>'@O]NCS\*!?]GP8]@$_<%=RQS(\&-!??*&=?0OL2L
|
||
MD7\4S$'PYD(P?Y"8YX+Y4C#'L(0$\YE@0@$(GH(\Z+PL6FE>UF.8^GHW/<@8
|
||
MRY4XB]6+`_A@E,TXH4.GQ:R``8HBI<4%7(R'<<M)GA[K)F7Y6)#,+!R2]NWP
|
||
ME!\H\80W>O0<MJ])DW^@1U/?:.$A:U\)<RMZJ"T4"\H_Y_Q)ERG+AZH](TVE
|
||
MLX6!BV>SR]AB8!T.5Y18JL=M329TF3!DPI0)2R;:,F'+1$<FNC*1R40N$X5,
|
||
ME#)1R<1$(FPY'EN.QY;CL>5X;#D>6X['EN.QY7AL.1Y;CL>6X['E>&PY'EN.
|
||
MQY;CL7D\T_F.+PK6NU;0U$B]`4%W'OI7<)AS^WCKZ.%1,!CV7-'MZYT2SCG2
|
||
M?)N8GRT?R=1D0I<)@Q'3^5;V86];Y;T\2O@6>H1'B9MZF]T_$>C-EJJ+PP%<
|
||
M/$]]G;,[TNAE5R8RF<@?^`7A@0LL.P16/UTJZ(J\0ZXDOC[LUQLG[E0I^(+\
|
||
M+3]>"7HGT<>JAJPOG$4>VWS6BQF]GD.D'ZMM.CEXD7*Z^5BM\.RF,81E99G\
|
||
MY@B=_@1`$?MRRR)?IM=X;C.8N*K*,L]M6WR3+QD5FTQLVWE>EE4EOE$;$`"P
|
||
M2/K7]_]*\]RRJFHR$=\$SM7K]?J&_MK`7:PJRV)R_";Y:EK\%^0VDZMJ15^J
|
||
MFM,767^^S5;5FOY*P=.09?*;3.=WZ\_TEPMNP;+D-_FXF%%]C><Q+R$^N\S+
|
||
M'`*I\I)\7&]6TR7#:&(0597?Y$["U+G<?_&S\@<\*_,[D':JQ-X@A'L+'),C
|
||
MY]+MP^T14.)41BOH_FP>1`/'KS=QY)K`'0W.77K&IEM5_(@`;T,Q7H*6]&I(
|
||
MKUQH?,N@5@O^U1/^03Z\__!O(:!<2?"?/0&7HF6\C7'#DZRH-(HS9"?>N!&L
|
||
M4)?[1XOV_FSB0?L(63GS.%M:2V_A,A)X:E!G!AD&JY$]&8#56@;#&#*&EY2`
|
||
MJ0#D,%.&T5D7(`U@AG25X=.CGRH.7&L&(?VE@C%;@(E#S.NE%YZ\]E``MYQ+
|
||
MO.$_<>,8#J8>M,8K@,'2]95Q$/EX_72B^"D,(([(?(/MJ.Q&+@W`)-I7)[@M
|
||
M"P+H`\F#&:8X2X5IP@_^IUG-OWKRX$-,`@#;P-#;3(G^@YQ_'-"-$OYU3534
|
||
M]P<X'%"C5;-`OZFWIW")N7`C=XAW1A9F7?<3+X+):.^%K[$OG<B3:?*0&],:
|
||
MMZ)#NO0VO]^*!6(V"X,]B*(U]X;BI5I7Z5]^^1/$VFG96*7_@!E-]5;Z`2[*
|
||
MP$W14"I&?5"N*BA!1@_$62-NM[J'8MZ^!:(+(ZM-@/JO"O`KD36.:2T-_F'.
|
||
M]L>F7;=&@-@X1/"MH\88M#:^%J!&I1H"1`#&K_%?ML8[/5>#A((]?1]"6[T`
|
||
MM`&B?R.E.OK4?ARBUQ#JN=ZX;0JW1>7M:1\T'\A<!QO+5QM/!Z;U0"YV$@'I
|
||
M8FX/,+0RZT'H.$;CHO5;,[N7%A-&;+?,KPYH@A128GXC;2:=;>,0\W$O,A,1
|
||
M7<0(O]N_U6]VO.!K'W():;"^-:1%2UD[!-T=@C2H'.L;\5D@[R""?/?=_P%0
|
||
M2P,$%`````@`%J.V)OI$MTE!%@``0ST```L`$`!S=')O:61S+G,N<U58#`#9
|
||
MB7XWZV9'-YP/9`"U.]MRV\:2^[@O^`?DV%OQA5((\"KK.+60,)00DP0#@):5
|
||
MAWW8G)S*5NW#V3W>JN1\#7\%("F+7DJ424J1_*1/V;X-,*`N2;8J2FQC>KI[
|
||
M9KI[^C(S^J=_?F&]L%=)%`9^;/&W&MC.*WL_4EZB;*]O>W&BL-_N!*KK,]+\
|
||
MHUW_:F<'&M9HL?PP>NI4JU7+6NQ],[X>O1Y5Z>L&OESZ^@Q?=?R:>(D'WTW\
|
||
MGDW@JXU?E[&*X'L'OL>J?Q'&T'"8Q_52];#E,$=I"5=IU;!UYB7X3:.L@N\4
|
||
M-&KN[6[-M?>.$Q7;29AX7<NZW?TX[`WLQ-OK*LN:]8.DAM-XVH#YW^YB._"Z
|
||
M0&YW@[V:;Z6^#_P`@3%?UFYW`62'>]^H_01XZJ]N$"?61'49F:D0&4`*I"A8
|
||
MG2CL,>I*)>-AM-@#9*9"9`#:^\,H4OU$**P/!9XF0<P/]V*>JW<)H7[80.U#
|
||
MAYY#T.<9`)PGFQ-J[$$8]$'CQ>HLG"[+EZD0<^QU]X==-A'?CE4^0,]+HN"=
|
||
M=1$D^X<\;2!%"H+86W8$FBADXD7A$!B\V_+>!;%UXQT!#6$B"30+`L$\9LQE
|
||
MV.T"*F`@(K;N8'['F&?A6[4*?+0(1$-T!.G%X??E`#HUWLL:P4["Z,B+_%AZ
|
||
M+@<`A^4CQI7:%ZA&0J:+*`!]>$D0]NVWP#F,8B2X'#!Z08O(S[JJ?Y`<OF[6
|
||
MGR/2213VDQR/2&`XE/N%%_5B!FLD;2N@?E]%0?_`'GB1UP-#@Q&AXRJ(-95F
|
||
MH$G>!G&P%W2#Y-BD05U>!>J("31Y0:..R";LUUIFJS!"-,#7I&0286\PU`8!
|
||
M&#Q:5TLZMB:1=Y1VNTPI/&B7`-SV0(/W$:!Q,D5!GA/EEFW2L8$OPP11A$ZX
|
||
ML*TDVFQ]Y"%K0JP3;Y_-A$A?UFB040PB!N8=Z+2?#<+N\4'8?VZ!&P3*FL^^
|
||
M)`;GEXVGY^1+6FT'I*%H%\F4GH#G.0\3]<H^"F"A>\,#.^C8CMO&-2,2,/C^
|
||
M)Z)NHR?Z;YJD_U6D8(\%8$[$+;9^U$CMJO7]S_2Y`Y[W1_V-X'_09TI@^0:P
|
||
M];?__(^_O_]I],-__0]`,ASD;ZC5$4HK'CT;1"'.5/G/&?-GP1P#GXOY;+7^
|
||
M/)I^N@3`!#W]"W:0=IP,.QW+&J?S\5FZ9A*86]5*Q^/E8GV=0VH"N<DA38%\
|
||
MSB$[UH?Y(@-0#OG>@M;%<O$QA_S5NEC,;TYF\[D&032XF`,-S0Z:#6NR3'^9
|
||
MS\ZG.:AM74V7J]GB/(=DUL4G9E!U"U%\.U1#"`O(_0)6`Z++,G!<7@*R[[.B
|
||
MM7NTKF;37\X8J9Y:UO7BY&0UI6:C5FB_8\<0257?NC'ZZRB_M9C-V>5\/5_P
|
||
MQ,8.SH7'`=)W_^92]^E,NNLH>NO%Z\=_+"N;IZ<X4M6UK$3U!FPR%DV=OCT8
|
||
MY2CDT`AS=Q#8A*'G05^!+]X/P\BW;ACL6M<N?=2M&_YHXB1@":>PAV"FR:':
|
||
M2!*VJ7L-<&K:8.+[A^!OP+PB"*X^#&Q[]I]\U8_!%?VI8A\=!A`;?'1'/9A"
|
||
M3#PI9$,\B6/<:QV``1]P6PDWA/FV30.!O(/(&*\?)O8;-8`@#<.^`8I=._*`
|
||
M**H`LYS8#OO=8UN]PRV`H=&SXQXZ(@^R'SN&"(N!!#TL4@RZWK&*>&UI]R",
|
||
M@N2P9Q]Z.%O0,4TM?@6=MO/<GG7L/=4-CVQ9)'+HZZRJKXYRB<7;2.$^MR=1
|
||
MT$D*,$)KS^WQH8+I=\+(WH?@!?XQ[%.BAOYF13HF?[%@-Q.I?=!<;*W3C)17
|
||
M;9%!@0F$D1<=Z[SGPW0](U=U<C(%8]3YW^CC:DF9CC6:3]+1$["VT6J=CL:7
|
||
MRXEEO>J&X8!Q:%(37AA#:/*:#X,@=BP]WXLLY'8]NEID9M:`446820@1*@X+
|
||
M$'HP@NA`(&-H_R_>7_<6W7K`?)(G8!3"^,@;9,..S&:)LZ$@&DK(EC"@ITX)
|
||
M%,OA:CI?C&?K&^XSPSX(Y<@+$L*:+3^=S-,/UBB;?AH1>$.*&H'9D`JLT?CL
|
||
M8O3D2^]+(1M@YN/W-?R[$GPXT/!O-3P"F^AJZ)$)C30TUM!C[RA']0U@COFO
|
||
M&ACT]]^J'/<K#?:5"7YI8*.-:_B6@6["7VOX$:F$@;8&QJ`=#8SR=7@^:^OC
|
||
M`H2?@4-_]4UX'"?!_AO!().TB+HP,M1TD;5L:I2$KW->U`Q1`1S&UOQPBJ2\
|
||
MU6(^FT#`L4;3Q7+TY&E;=%G`33(4YF@\'UNCR4DV>NK6"=0=K:9C'A>RU3*%
|
||
MZ'6#2*R@H*.$N$Q)FM^@([T75)CMEHE$5:/9^7@TF9ZOV*AS!*TRZ+NWWQ++
|
||
M('IC5Y088#_2W]=OH4I)L,MTPKNE+-<<;-(4.E]?I]8H/9\`1=41B\BWC-GI
|
||
MFIVX;\S.NG3RAC![VD5/5)J#7@S)FO(?<,^YP[&WMFPS^:6T,B)7],+V@Q@#
|
||
M1P5C'KE_#"<>A0#)#8\.PUCRBA@CCQT'O4&7(@;0/XOWO2YD91I;,D$,0Q:(
|
||
M"](*++/K8/98MD)DY(%%DC1A6!E$`9YJ$AX<4.D+^EWK%37KE6H%ZU\?PR@$
|
||
M*RGB>+D5[-;?V,+TA7PG<>0)8;F(>TZ:5+NP-]8;<W,CHK[7T[,+_+JAKY<.
|
||
M(Y/+O(M\L9B=KQF;/AG]9O2D`;&)K.H9<GE>N6'\9X1%S<D4'<C%'/1I09!V
|
||
M1\OU"I*8(F24C3([FXT0;6,Z7/T^.!F9C3[$8)[&)-;IM80$2CDA-,5)!1(C
|
||
ML`G*+T1R''(_5ZYO=\%DP*C(8@)(#1+[&2H`J)_O8H*C1`-<0:!Q5'7,P1(S
|
||
M#FU)ZC&^4=UQ%$:0"PW!BL((<H4$K`QLUP_[7X(9>N@L<?!3'KVO#JCV$-/\
|
||
MXKG$SB=MD+?#04^LJ'+-E)(4(_6$F'J^#UL"4RS(PXQ24H==5,VU5HTC`YQ?
|
||
MGBVRCROI0P^-AIY]?`EEU?FPM\>)-<]*-C`YPG0R'CWY,^!.TG5A7[>[QYS0
|
||
MBD:>?*TQ"%^'9VV`[`^@1]NFZ/IV][L2&XU?8K)A"I2915"D@XA5C/+H42VA
|
||
M<RGD,[[6PKMV&'+*(,II9E=M!(MOA%F#(0G=S5VZF_OH\DTA=)_OTN4@S!LK
|
||
M-^`K5$^1G./@H'\/R\*H9^<W$'_?!`-1)+I/7-SM;A7MD@U4GR/1=GE$ESP?
|
||
M*:4@6SST^@>P+U#J09\.C3J=6*'2+TY31I:ZRH`\8:\H:]2\+@<#%6UU58=L
|
||
MOP\Y=EZ:$:+FL['EY2@`P!?SM(Q90*XU+:W<)=T;JX0B8-"%<D1Y4.-(3D(.
|
||
M"6=+I?6U=EE:)0Q]"7&QZ'EI]MUH^$T):E+<Y!0B$2GOZ!2R<-HR(1K#%4IW
|
||
M(W6]=E\ZNDNL&WK_/%[,%TN7\^@.NI<!5\J,*E6TWG2,7.K2\]-6=PEAT`\Z
|
||
M'44'FU#OX!$:.>-7&%)O=[$,ZN`IV%=['N8#QC2<AP=U-@>UB%U>-*!4,*3)
|
||
M#X!M/%"@QFX*\1RU]X5E45JC]6J8N@MI31)C2+G=_>50'7TAZ4'P-O"5?>U4
|
||
MME,,_FW*#?IAU*,39L#16XK27LJ!EHLE_37Z_6!.85#+(+"*#>DQ%+=8VB;B
|
||
M7@=AC%L*R\D]E1R!Y=M;.XWM[9VZYHF;AE8%GG^G(9M1CUC=VFE"]W@UPM5:
|
||
MC"-F`EV@G*$/F]6S]V!$+1!,<<-8<K$POL.468Z%)6$P2\3D&&T<-'2PPH\'
|
||
M:C_PN@`W"CRDH2*!I>!4>2%S+U:L_/EX<0GQ&H9QF"\#\GR.,3&O%4QBJ;\E
|
||
M/:QQU8%,K(T=PILMWR$;NP8W[^UN&L?#'MXLZ$V(WJB\[Y\X.SOE??TD!\BF
|
||
M7(V7X^EYOF'U)@#+7O$.BL-NX#^Z%1'WSIZX;\%U7<JA"V3-N5)[TP*BX.`0
|
||
M5I"NYK>[[%%>N,6"EHLYNRW9;J!P8[O)`='9,>0"PX0.?2`5V?/B`/+=[C%T
|
||
M?S.,\0Q'#?(S'+NO(P:?OF+U;S\[5H.*'1^&PZYO'WJ0KT"5TAWZ"C./_)2V
|
||
M,^QS'@0NSP_I+(E2:,DU<D,X.^;;&S:&/!/!R4L'H/"=#3N$$HIT\/Z7@Q\L
|
||
M#FC7!1W[2%&"+PD?B4\?$-$Q$!X;06)7>?2T"/)6KLUHTD[#PO,960#L<+D7
|
||
M$K:653JL82T^G8RK6#&H7K`5P=X*>[G*6X:-8\8*+BU0I.4\Q:+C(-J_>8V(
|
||
M;@%)\K2O>^0=QWH!(2J\.$D2BUV=I?,YB$YRI:^+]O@"(K`CML<\<CL_FTX,
|
||
M&MTBBKKXD@V*;/8A7:TTA;0$B4]T1.6P5$4:@;QE-GDDS4>B<W4TIE-2G>G=
|
||
MFQEQ-KG1428GM#^>U%"\Q`/0.U[>INCXV_H486PAW#`&0J@:Q0W=UM[N7JEN
|
||
MN$_'?YOC4-H$3(XE)WND3141I5'K]$:^I.X[\Q(L6=$V[;"X6;-XGY5M&G?;
|
||
M!P4Y'=WKW,T7\61W&X9Z816R,V9!"1\=*,Q72QV/PJ[N.)G2R0JZ,XE).![1
|
||
MXMXV!N:MI)W4$.^-[%[@0^C:BK\=PL;'D]MT.9^>Y[OUS'MGQ^K;H>KO0V2@
|
||
M.T$HW<\GN3^2.9HE,GH=XB**/(A(E<;&7L*`2N7J=6B@-PI/M,&=A/WOP)?H
|
||
MHN)<;\B:F#"S9JZ2RFH<OHS0"2872!H^7V`*MYU6$&R_QLN+K^HD4D&D;*74
|
||
MY-SXM<@($B1('>2\D,>DO"%./#DF^A>GRO]9""S-OY!.KJ'2D3292$@7"Q!N
|
||
M#@[INC%WJA6[%[X%;0$2)>D=.=_=MNU4X^@["N2*46687T/@\0[?&*!OCQ3P
|
||
M4C[[Z?*IN%06D`FP>QR`1:@[)Y244]X]IKS__(-V.A^6)G&Q1V>3.Z</E$9S
|
||
M9782]/&B)H+P&M/D-G;W!JVYV>^>@(O_<W1N"5&.JJQ<*G=G@D:[[^BS/\PZ
|
||
MB_(=MB'T2<H)667*=_FU:K5J#_M@'_819M7\G(/345]U]2QJ#PSF/C*8JP>[
|
||
MRZ[Q`+O:(^QJ)KMQ<3#:-;6#6S091GV^W>*ZG$+C*AN;PQ6W+]H@R$:XY-J6
|
||
M8K_(1XR3V#P!1\N?+3_I+`O:<A&A70SDS?KS9+:<ZN_369X=3Z^A'IKD/>O3
|
||
MY>6J2)V!'2=+^0V(]D154TR2F4M=3LDZXN&0.M([^@H(-$YY/5H"G5#,UAK'
|
||
M-7!.L=+8=PE%YJC1:@;:]!T4<+XBW5"Y2?,7S+UC9:"N#R-(.BV$DC"?3M-6
|
||
M9EG%C/)Q2YQ-6J-LP:LTB$8^"MWBO%U+35\@<-C%ZWF++]Y6TYE.7$BP*"RH
|
||
M/)RZ3MY+T`::GR9XVFKJ'D<KH>HX.@JXX'BR(.EY`_!VOM1%@L'TU7:.L?6U
|
||
M_;19U5D-8K4U2[S_U]5F6S.O0EV0>?TWMJ,I"(WYZM-]P&JGZ/VZD-:#_XO4
|
||
M`)*PS5(J3ZCI0%'?(K"2Y!K_=A?RY-ZPFP1T2+"]O2T[\S#`()NOO5E$P&(A
|
||
M31FOM6,D/40H)5A#*BY=:=%E8C<:A]TS;Y"GE8ML=>?:57),Z"KN4FN3G(3/
|
||
M#C16T;J6+5).1I?&T5G^],:NYMS6T_4D7>=S\+W$TZRY2[-NX\G^I,P^O_@"
|
||
MYQ[D5Q$Y;UC^4CA0:EXTB:%S'S.Z4EV:C[M*IZ<R3?U\XKYC?'D"Q\?@^HAY
|
||
M`3IX_$3?T?<1PP%F$&"^%3U,;*MD?QLV'U_^RMW@WA#/F&(ZC]GO*GW\+S;+
|
||
M+@M#2<F0<>'-8@M!"4<;!))3^VE*.T6R1P@AD',.-$U:Q0M*`)0N%/%^F\IT
|
||
M?DX4F\<Z9D%?>GNBU<'UNR0-]%8+JKQNQ#.38@C'%5^(*_2*(VE(&FY2R3)H
|
||
MA;@,+>&G3<=LN&:C9C;J9J-A-IIFHV4VVF9CQVRD9B,S&V.S,3$;4[-Q8C1:
|
||
MYGI:YGI:YGI:YGI:YGI:YGI:YGI:YGI:YGI:YGI:YGI:YGI:YGI:YGI:YGI:
|
||
MLAZJYO*#1HDM6J/W*-1E\M240&I*(#4ED)H22$T)I*8$4E,"J2F!U)1`:DH@
|
||
M-260FA)(30FDI@124P*IJ=',7$]FKB<SUY.9Z\G,]63F>C)S/9FYGLQ<3V:N
|
||
M)S/7DYGKR<SU9.9Z,G,]V;T:=46E>7@!/XDODOI0O>%)%1Z%V2'4AL:U!,=4
|
||
MQS6W<!T%)'<X3^N.V7#-1LUHM$V:MDG3-FG:0C,[-Z]WRO%8/+&4("D7.6=Y
|
||
M?"[G&VX1B]W\V+,.JQ'CG;2-T2<[9B,U&]F=>;E&VFM!;,NK;#/$+0VXV_?S
|
||
MR+>@["PE^+6\@-/M&Z,-R16"/@O(NL]/DY>G=_"CT^GUZ&3CQYK,UJ?3);[0
|
||
M<ABCT4A3\X]@N/2"GC#*_8V&]7GV`=]_U;A[.IU,LJS5TO]:GU/JKG-WJY5E
|
||
MD\ETJO]%:L``!,@@?_SAIU&6-1K3Z<F)_M<:+Q>KU>J,'NO+%*?31H/[\5\K
|
||
M6\[&_PO]+>ZO5J?T4ZUF]&.M/EVFR^F*'OF+&-+4_&/-SJ]6G^CAOW!H-,P_
|
||
MUNEB3O2.R#&;P/I:DVR2P4*FV<0Z7:V7LPO&<?0@U:KYQ[HR<')9EG]@_]$]
|
||
MD:RS_,-][@.$F.:_5W'^^MUYQ:\WH$)52>0=*C\*^X`EQXXZ,2,#Q.,/O`S*
|
||
MLR6$UN^[XK[3@6^18TQ[+N@VG1X\(_-K0FVX%?B_NB5_6>]_>/^S[B"HT?&/
|
||
M4H?T(F=\"RV,3]+QU"&\FCF)MRJ"#:YD?F3S>+9@W@/RFQ&GXN+KDBN-3PQ=
|
||
M9L@X:,S\50-<IU)CG)J)(Q:IT:J`*&AU$XV,1B,Y@%:[JR7WE=U3?C#L:=&_
|
||
ML/1)\A^B&9X-3*4*$I:_<B!![@5*SX8V?DT1XEQ^HRI,T8G3V5"$B4%[?D,#
|
||
M9C\905GX*'O)_6NOY'EM+O7BS/^/D[L#JT99RE\YD"#W`J7G=\H=;?C_(71T
|
||
MU(](7+NX1X1^M8$B1L]7;&6KQ\/QWH!.U!B(KZ'C`<KN,!ALO<YIW3^P
|
||
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
|
||
M8\<:2Z8,XO,+``#H&P``"0`,``````````!`I($)!0``;&EB,V1V,BYO55@(
|
||
M`(&,?C<GB!,L4$L!`A4#%`````@`,V/'&C<H/C1(#```\QL```L`#```````
|
||
M````0*2!,Q$``&QI8C-D=C)M8RYO55@(`'N,?C<AB!,L4$L!`A4#%`````@`
|
||
MUEW'&GLS>+4/`0```@(```P`#````````0``0*2!M!T``&UP<F]J,3,@-64P
|
||
M,%58"``#K%<W!'\3+%!+`0(5`Q0````(`--=QQJ];9!:<P,``%,%```)``P`
|
||
M`````````$"D@?T>``!P=&%B9V5N,3-56`@``ZQ7-_U^$RQ02P$"%0,4````
|
||
M"`"O2)$FGLOA\D@"`````P``"P`,``````````!`I(&G(@``8FEG=&5T<RYB
|
||
M+F]56`@``ZQ7-SJC&#=02P$"%0,4````"``Q8\<:8"8;@',%```D!P``"0`,
|
||
M``````````!`I($H)0``<W1R;VED<RYO55@(`':,?C<>B!,L4$L!`A4#%```
|
||
M``@`L8+C)KDA5+G`(@``PR(```<`#```````````0*2!TBH``'-T<F]I9'-5
|
||
M6`@`[8Q^-^V,?C=02P$"%0,4````"`#57<<::>O^;'T```"E````!@`,````
|
||
M```!``!`I(''30``;&]A9&5R55@(`-6,?C<"?Q,L4$L!`A4#%`````@`;TJ1
|
||
M)@JW-S2Y"0``@!D```L`#```````````0*2!>$X``&)I9W1E=',N8BYS55@(
|
||
M`)N)?C>"IA@W4$L!`A4#%`````@`%J.V)OI$MTE!%@``0ST```L`#```````
|
||
M````0*2!:E@``'-T<F]I9',N<RYS55@(`-F)?C?K9D<W4$L!`A4#%`````@`
|
||
M:S?;)C8,@GJC#@``9"(```L`#````````0``0*2!Y&X``&QI8C-D=C(N<F5F
|
||
M55@(`$2#?C<I('8W4$L!`A4#%`````@`VC;;)J[1$H%;#@``_B8```D`#```
|
||
M`````0``0("!P'T``&]B:C-D+G)E9E58"``K@WXW&Q]V-U!+!08`````#0`-
|
||
+`&T#``!2C```````
|
||
`
|
||
end
|
||
|
||
.......
|
||
....
|
||
..
|
||
. - fin -
|
||
|