Jaap's Psion II Page

Home / Psion / Machine Code Tutorial / Part 4

Psion II Machine Code Tutorial, Part 4


The missile routine.

The routine should look through string from right to left and move every missile to the right. If a missile is already in the right column or if it hits a non-alien object (i.e. a star), the missile is removed. If an alien is hit, the missile and alien are both removed, and points are added to your score.

The search has to be done right to left, so that we move the missiles in front first. Otherwise a missile at the back will hit a missile at the front.

The information passed is:

A%(1)=ADDR(A$) 'A$ is the screen string
A%(2)=20 'Length of a screen line on a Psion LZ.
'For a Psion CM or XP, use 16 instead.
A%(2)=A%(2)+256*10 'The score for a hit.
A%(3)=256*%-+%< 'Missile and alien shape.

Lets assign some addresses to store this data in:
 41=Score change for a hit
 42=Dimension
 43=missile shape
 44=alien shape
 45/46=Total score change so far.

18 XGDX
EC02 LDD 2,X 'Store the information used in a more easily
DD41 STD 41 'accessible place, addresses 41 to 44.
EC04 LDD 4,X
DD43 STD 43
7F0045   CLR 45 'Clear score.
7F0046 CLR 46
EE00 LDX 0,X 'get the string address.
E600 LDAB 0,X    'Get string length.
2735 BEQ end 'Return if empty string. Shouldn't happen, but it is 'safer this way.
3A   ABX 'Go to end of string.
lp:
37 PSHB 'store B temporarily
A600 LDAA 0,X 'Get character on left.
9143 CMPA 43 'Skip if not missile.
2627 BNE skp
8620 LDAA %20 'erase it.
A700 STAA 0,X
17 TBA 'calculate which column it is in.
4C INCA
s:
9042 SUBA 42
22FC BHI s
271B BEQ skp 'skip if at the right column of the screen.
A601 LDAA 1,X 'Get destination contents.
8120 CMPA %20 'Move missile if it is empty.
2711 BEQ move
9144 CMPA 44 'Skip if hit object that isn't an alien.
2611 BNE skp
8620 LDAA %20 'erase alien.
A701 STAA 1,X
D641 LDAB 41 'Add score.
4F CLRA
D345 ADDD 45
DD45 STD 45
2004 BRA skp
move:
9643 LDAA 43 'Move missile to right.
A701 STAA 1,X
skp:
33 PULB 'retrieve B
09 DEX 'move left.
5A DECB 'until done whole screen.
26CD BNE lp
end:
DE45 LDX 45
39 RTS 'return total score change.

In Part 5, the conclusion of this series, I will putting all the parts of our game together.