PRINCE OF PERSIA
Technical Information
PRINCE OF PERSIA and all source code, documentation,
and supporting materials copyright @ 1989 Jordan Mechner.
All rights reserved.
October 12, 1184BACKGROUND GRAPHICS
Each level consists of up to 24 screens. Each screen consists of 30
blocks (10 blocks wide x 3 blocks high), also referred to as “pieces.”
Examples of pieces are: floorpiece; pressure plate; spikes; solid
block.
The complete layout of each level is specified by a "level blueprint"
($900 bytes tong).
COORDINATE SYSTEM
The Apple screen is 40 bytes wide x 192 lines high, with 7 bits per
byte. Most of the background graphics are done on the byte
boundaries (e.9., an X-coordinate of 39 puts you at the far right-hand
edge of the screen). Since each screen breaks down into 10 blocks
across x 3 blocks high, that works out nicely with each block being 4
bytes wide.
The moving characters (player, guard, etc.) use a slightly different
coordinate system. The X-coordinate is represented by one byte.
The screen is 140 pixels wide, with 58 as the screen's left edge
giving us offscreen margins of 58 pixels on either side of the screen.
(This makes it possible to compare the X-coordinates of two
characters even if one is offscreen.)
Since all the character movements throughout the program are
specified according to the 140-wide coordinate system, we would
like to keep the character's X-coordinate on a 140-wide screen (or a
width that is a multiple of 140) for all the different conversions.
The character's position could then be mapped to the actual screen
width for that machine--320, 512, 640, or whatever--at the time
the character is drawn.IMAGE TABLES
There are two background image tables (bgtab1-2) and 7 character
image tables (chtab1-7).
Gh. table # Contents
1,2,3,5 Player (kid); misc. shapes
4 Enemy (guard, fat guard, skeleton, vizier, shadow)
67 Shapes for princess scenes (princess, vizier,
hourglass)
Note: chtab6 is too big to fit into memory all at once, so it is split
into two files:
chtab6.a used for opening title sequence & levels 1-2
chtab6.b used for levels 3 and up, including victory sequence
There are two sets of background images, one for the dungeon and
‘one for the palace.
See accompanying lists that describe the contents of chtabé-7 and
bgtab1-2.MEMORY USE
The Apple version uses memory, roughly, as follows:
(during game play)
Image tables
Player
Enemy
Princess & Vizier
Background
TOTAL IMAGE TABLES
Code
Buffer space
Music
Level blueprint
Screen memory
TOTAL RAM
Packed dblhires screens
Packed princess's room
TOTAL DISK SPACE
RAM DISK
30K 30K
6K x5 = 30K
9K
13.5K x2 = 27K
49.5K 96K
48K 48K
8K
4k 6K
2.25K x16 = 54K
16K
127.75K
42K
6.5K
252.5KLEVEL SUMMARY
#_Name _B.g,_Opponent
0 Demo Dun Gd
1 Cell Dun Gd
2 Guards Dun Gd
3 Newskel Dun Skel
4 Newmirror Pal Gd
5 Thief Pal Gd
6 Plunge Pal Fat
7 Wtless Dun Gd
8 "329" Dun Gd
9 Twisty Dun Gd
10 Quad Pal Gd
11 Wild Pal Gd
12 Tower Dun Shad
13 Final Dun Viz
14 Victory Pal Princess
Level 0 is the demo level. Although levels 13 and 14 are technically
separate levels, the “official” highest level number is 12.@ Dros C-section of block bela & to left
@® Dru B-Seetior of black 4 ler
@ Pow d-seckm
@ Pou Ansection
(D Prt FrmtpieceKener
192 pines,
cease
Ssagyreeyx7s
> sa7}ing 255 {
OFF SCREEN
OFF ScREEN
lo wala Keeome cs|ce fe
38 pias go pins 5 plasPRINCE OF PERSIA.
Routines to keep track of moving objects are contained
in the file MOVER,
and mobile objects unti| ANINTRANS
decides It's tine for it to fall, At that point, the
loose floor is deleted from the trans list, the block
is replaced by “enpty space", and a new HOB is
created to take its place. Under the control of
ANINMOBS, the HOB then fails until it hits the ground,
at which’ point ANINMOBS deletes the falling floor from
the HOB list and changes the objid of the Block it landed
on to “rubble.
FRANE ADU
IMAGE Lists
AAR RA PERE ER ERE ENTE HERERO ERE EE EEE
FRAMEADY never calls hires routines directly. instead,
Parameters of Inages to be drawn are stored in “image
There are 6 separate image lists:
bg: Images in background plane (drawn first>
x, ¥, ING, OP
ipe: Solid-color wipes (drawn with b.g. planed
x, ¥, H, Wy COL
fg: Images in foreground plane drawn last?
x, ¥, ING, OP
Images between b.g. and f.9. planes
X, OFF, ¥, ING, OP, TYP, CU, CD, CL, CR
msg: Images in message plane (drawn last of all>
x, OFF, ¥, IMG, OP
Pere ee eee eee eee eee
gen: General instructions (e.g. clear screen)
8/27/89 comments /2116
117
118
119
120
121
122
123
PRINCE OF PERSIA.
PRR RRER ER ERE EEE EE ERE AD ORE E REE E ERE E EERE EEE REAR EERE
Explanation of parameters:
X__ = X-coord Cin bytes?
OFF = X-offset (0-6)
Y= Y-coord
IMG = image # in table ¢1-n>
OP = opacity
TYP = image type (for mid only?
CU = top cutoff
CD = bottom cutorf
CL = left cutoft
CR = right cutoff
Ho = height
WH = width Cin bytes?
COL = color , Superseded by REDBUF.
FREDBUF :
Refers only to foreground plane, Marked when character
goes behind a post or other object with a frontpiace.
Superseded by REDBUF.
FLOORBUF :
Refers to floorpieces. Marked to the right of a
falling or hanging character. FLOORBUF causes floorpi:
to be draun in the mid plane (where it will cover up
character if appropriate>.
HALFBUF :
Like FLOORBUF, but redraws a triangular section of
the floorpiece instead of the whole thing. Used when
a character clinbs up on the left side of a floorpiece
and wa want to mask out his lover body uhile letting his
upper body show, (Superseded by FLOOABUF. >
OBUBUF :
Marked whenever objects need to be drawn in a given block.
CObjects ore aluays the last mid elements draun in
a block. Objects are assigned to blocks based on
their lover left x-y coords. Characters are considered
objects. There can be multiple objects in a given block. >
‘TOPBUF:
10-byte buffer for row of D-sections across top of screen
(from screen above)
Note that TOPBUF is a 10-byte buffer while the others are
all 90 butes.
The specific routines called by SURE in FRANERDU) for
each of these buffers are:
REDBUF: redblock (drawc, drawb, droumb, draud, draund,
drawa, drowna, drawfrnt?
WIPEBUF:
pesq
MOUVEBUF: drawc, draumc, drawnb, drauna
FREDBUF: drawfrnt
FLOORBUF: drawfloor
HALFRUF: deawhal f
OBJBUF: drawobjs
TOPBUF: drawe, drawb, redrawd, drawnd, drawirnt
PERE EERE EE EERE EEE ERA R EES EEE EERE REAPS ERE ERASER EEE
8/27/89 comments /4232
233
234
235
236
237
238
239
240
241
242
243
244
245
245
247
248
249
PRINCE OF PERSIA
ARERR AER ER EEE EERO RRR E REE RR RARER ARE E HERRERO
BLUEPRINT
LEVEL BLUEPRINT <$900 bytes>
Start Length
BlueTypa B00 720
Bluespec. 0 720
LinkLoe BCAO 256
Linktiag, BORO 250
Hap BEAO 96
info BFOO 256
TOTAL: 2304 bytes
BLUETVPE.
Bytes 0-29 descr
screen *1
Bytes 30-59 ° = screen #2
ete,
24 screens total.
Each BLUETWPE byte corresponds te one block
«20 blocks per screen.) Blocks are mapped
Inte BLUETYPE left-right, top-bottom.
AND with S$1F to get the “objid,” or object
Identification nunber (0-31), of each black
BLUESPEC.
(Screen blocks mapped the same way as in BLUETVPE.>
Taken together, each pair of corresponding bytes in
BLUETYPE and BLUESPEC contains all the information
about an object. The BLUETYPE byte always contains
the object id. The BLUESPEC byte functions differently
depending on what the object is.
For movable objacts (gates, , torches, ete. >
BLUESPEC specifies the object's “state” (e.g. is it
open, closed, somewhere in between?)
For static objects (floor, space, solid block, etc. >
BLUESPEC specifies the object’s “pattern” (e.g. which
design appears on the wali behind it?)
For pressure plates, the BLUESPEC byte tells which
gates the pressure plate controls. Specifically, the
BLUESPEC byte is a pointer (0-255) to the first entry
the link list for this pressure plate.
8/27/89 comments/5,290
291
202
293
294
295
296
297
298
299
300
301
302
303
304
305
308
307
308
309
310
ani
312
313
ana
a1s
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343,
344
345
345
347
PRINCE OF PERSIA
*
a
Link Fist (LINKLOC/LINKMAP >
Contains a list of the gates controlled by each pressure
Plate, Each pair of bytes specifies one plate-to-gate
linkage. There can be up to 256 such | inkage:
LiNKLoc:
Bits 0-4: gate screen posn (0-29)
Bits 5-6: low 2 bits of gate screen # (1-24)
Bit 7: 1= this is last entry, 0 = more gates te cone
LINKMAP
Bits 0-4: pressplate timer (0-31)
Bits 5-7: high 3 bits of gate screen #
If a pressplate contrals nething, LINKLOC = FF; LINKMAP
still functions as pressplate tiner,
NAP
Specifies how the 24 screens of the level are connected,
of the 4 adjacent screens.
Bytes 0-3 = screen #1
Bytes 4-7 = screen #2
etc
For each serean
Byte #t
Byte #2
Byte #3
Byte #4
sereen to left
screen to right
screen above
screen below
INFO
Bytes 0-63: reserved for editor
Bytes 64-255: Information abaut starting positions
‘of player & other characters on this level.
(See MMNMEQ for details. >
+
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
* Each screen gets 4 bytes corresponding to the screen #s
*
*
*
*
*
*
*
*
*
*
*
*
*SEQTABLE
*
Frame def list
8/27/89 comments /6348
349
351
352
as
354
355
355
357
358
359
360
364
362
363
364
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
aed
385
386
387
389
390
391
392
393
394
305
395
397
398
399
400
401
402
403
404
405
PRINCE OF PERSIA
ER REE E EEE EEE EERE EA AO REESE EER PAPA EERE EERE EE EERE
1200 bytes allocated -- 240 frames, 5 bytes each
(241-255 reserved as commands)
Fran definition consists of:
<1) Fimage
Bit 7 = chtable # (0-7, bit 2
Bits 0-6 = image * <0-127)
SURRIARY:
$00 + x: chtable 1
$00 + x: chtoble 5;
<2) Fsword
Bits 6-7 = chtable ® (0-7, bits 0-1
Bits 0-5 = pointer te SHORDTAB frame (0-63>
SUMMARY >
$00 + x: chtable 1,5
$40 + x: chtable 2,6
$80 + x: chtable 3,7
$00 + x: chtable 4,8
(2) Fax
Xoshift in pixels (= fwd, - = bkwd>
(NOTE =~ horizontal resolution is 140 pixels?
<4) Fy
Veshift In pixels (+ = down, - = up?
(Frane #15 is defined as unshifted>
«5> Feheck
Bit 7 = odd/even pixel
Bit 6 = 1 if floor check Is required Ci.e., if weight
is on floor?
BILS= 1 to”
" this frame for collision detection
Bits 0-4 = number of pixels (0-31 from left edge of
image block to base x-coord
(usually center of foot bearing character's welght>
SUMMARY:
$c0 + x: check, odd
$40 + x: check, even
$80 + x: no chack, odd
$00 + x: no check, even
+ $20 to set bit S
8/27/89 comments/7408,
407
408
409
410
au
412
aig
414
415,
416
4n7
ai
419
420
421
422
aza
424
425
426
427
429
430
431
432
433
434
435
436
437
438
439
440
4aat
442
443
444
443
445,
447
448
449.
450
451
432
453
454
455
4568
457
458
459
400
461
462
463
PRINCE OF PERSIA
SEQPOINT is 2-byte pointer to character's current
position in sequence table,
Seq pointer is incremented by 1 with each frame-advance.
CTRL can junp seq pointer cround at will
Fractional Differential Equations: An Introduction to Fractional Derivatives, Fractional Differential Equations, to Methods of Their Solution and Some of Their Applications