The 4004 destroys the ACC on return from subroutine calls and one
would have to use hard coded values to pass a value back so it
is common to the use carry flag in a similar way to pass a status
back.
Since this the address part of the JCN instruction doesn't matter if
it never does the branch, that is used as an entry point for the
execution.
The code would look like:
LDM 0
SKIP
LDM 1
SKIP
LDM 2
SKIP
LDM 3
XCH 4
SCR 4
BBL 0
Each of the LDM instructions is a point to branch into. Only the instruction
at the first address is executed and the others are skipped.
BBL is the I4004 return instruction, it loads the value into the ACC.
I've looked at a several cases of I4004 code and this is the first time that
I'd seen this skip trick used.
The SKIP is really the JCN instruction without any condition and the address
replaced by the LDM instruction. At first I thought it was bit rot in the old
ROMs but each entry is used 8 times in code.
It would be a JCN NEVER? One wonders what the assembly code originally
looked like.
Dwight
________________________________
From: cctalk <cctalk-bounces at classiccmp.org> on behalf of Paul Koning
<paulkoning at comcast.net>
Sent: Thursday, December 15, 2016 4:55:35 PM
To: General Discussion: On-Topic Posts
Subject: Re: An interesting use of the 4004 instructions
On Dec 15, 2016, at 2:52 PM, dwight <dkelvey at
hotmail.com> wrote:
I was looking at some disassembled 4004 code when I came across
a SKIP operation.
It isn't normally an instruction but If you do a JCN with all the CCCC = 0,
it will do a NEVER jump.
This is the equivalent of a SKIP instruction.
I would suppose a JCN with CCCC = $8000 would be an always jump,
on page ( not real useful as JUN takes the same cycles and space ).
I thought at first there was some errors in the code because there
were JMS to the middle of JCN instruction but then I noticed that there
were no conditions specified for the JCN. A little thought and I realized
it was a way to skip over a single byte instruction.
It's a bit like a coding convention I've seen used a lot in PDP-11 code, at least
in some programs; RSTS/E is full of them. Consider a function with two entry points,
where Carry set or clear is used after entry to distinguish the two cases. The two entry
points look like this:
fun1: tst (pc)+
fun2: sec
; common code
bcs case2
; case1...
Or a function that indicates a boolean result (say, success/fail) by Carry clear vs. set:
good: tst (pc)+
fail: sec
rts pc
paul