A83: What CPIR does! was (No Subject)- corrected


[Prev][Next][Index][Thread]

A83: What CPIR does! was (No Subject)- corrected




Well guys I just thought it should be my turn to explain some source code, I
hope this helps and that it is correct!!

CPIR
Ok well as you will remember Pat Milherton's code went like this:
ld a,(something)
ld hl,numbers
ld bc,3
cpir
jp z,aroutine

numbers:  db 1,3,65

Which simply performs an
If a==1 or a==3 or a==65
Then
etc..
End
Ok so the (something) is what we are comparing to see if it is 1, 3 or 65..
read Olle's message about parenthesis for info on "(something)"... CPIR
stands for (IMHO) ComPare, Increment and Repeat....
Bascially this instruction compares whatever hl points to (again see Olle's
post on "(something) - parenthesis" with what is in register a...
This continues until either:
    bc==0
    a==(hl)
where in this case (hl) can be either 1, 3 or 65
Every time the instrution "repeats":
    bc is deincremented (e.g. bc=bc-1)
    hl is _incremented_ (e.g. hl=hl+1) - Hence compare Increment and repeat.
So to step through that code for the first couple of increments ...

ld a,(something)
;a will now contain the number 3
ld hl,numbers
;hl contains the _address_ of the label numbers
ld bc,3
;bc contains the number three, because there are three numbers we want to
compare a to...
cpir
;now the cpir instuction has been fed the correct stuff:
    ;a=3
    ;hl = start of numbers
    ;bc = number of things to compare (3)
;the CPIR instruction will continue as I said before until a==(hl) or bc=0,
if a match is found, then CPIR will stop, and set the Zero flag, so:
jp z,aroutine
;A match is found in this case since a=3, therefore the code will now branch
to the code at aroutine
;code for no match continues here.....

. . .
. . .
aroutine:
the routine etc....


numbers:  db 1,3,65
something: db 3

Ok that's one big post, hope that helps and if you 've got any questions
email me!