; ram_add.asm ; add two BCD numbers on the Intel 4004 init: FIM R0R1, 0 ; ram 0, bank 0, address 0 FIM R2R3, 1 ; ram 0, bank 1, address 0 FIM R4R5, 2 ; ram 0, bank 2, address 0 LDM 1 SRC 0 ; select register 0, address 0 WRM ; store 1 INC R1 LDM 2 SRC 0 ; select register 0, address 1 WRM ; store 2 INC R1 LDM 3 SRC 0 ; select register 0, address 2 WRM ; store 3 WR0 ; store length 3 LDM 1 SRC 1 ; select register 1, address 0 WRM ; store 1 INC R3 LDM 1 SRC 1 ; select register 1, address 1 WRM ; store 1 INC R3 LDM 7 SRC 1 ; select register 1, address 2 WRM ; store 7 INC R3 LDM 4 src 1 ; select register 1, address 3 WRM ; store 4 WR0 ; store length 4 begin: SRC 1 ; number 2 RD0 ; read length XCH R6 SRC 0 ; number 1 RD0 ; read length SUB R6 JCN NC,len2 ; number 2 >= 1 JUN go len2: SRC 1 go: RD0 ; read length XCH R6 ; store length LDM 0 ; reset addresses XCH R1 LDM 0 XCH R3 doAdd: JMS ldCarry SRC 0 RDM ; read digit of number 1 SRC 1 ADM ; add digit of number 2 DAA SRC 2 WRM ; write digit of result TCC ; store carry XCH R7 LD R6 ; check length DAC JCN Z, endAdd ; no digits left, ready XCH R6 INC R1 ; next addresses INC R3 INC R5 JUN doAdd ; add next digits endAdd: JMS ldCarry JCN NC, len ; carry? INC R5 LDM 1 SRC 2 WRM ; store carry in next digit len: LD R5 IAC WR0 ; write lenght of result done: JUN done ; end ldCarry: LDM 15 ; restore carry ADD R7 BBL 0 , return
This program demonstrates how the i4004 accesses its data memory, based on the concepts of data-registers. It also shows several basic instructions (e.g. load immediate), subroutines, jumps, etc.
The program starts with the init:
part,
which writes some data into the i4002 RAM chip.
The first three FIM instructions initialize register pairs
R0R1, R2R3, and R4R5.
These are later used to address the register-banks 0,1,2
inside the RAM chip.
The LDM instruction (load immediate) next loads the value 1 into the accumulator. The next two instructions, SRC 0 (set register control) and WRM (write memory) write the contents of the accumulator into the selected RAM register cell, which is cell zero in register-bank 0.
To watch the program execution, open the user-interface of the i4004 processor, the i4001 ROM chip memory editor, and the i4002 RAM chip memory editor. (On Windows, you may have to resize and move the windows a little, so that all windows remain readable during the simulation.)
While this program is already a bit longer than the previous programs,
you may still want to single-step through the program
with the technique explained in the MCS4 overview.
Type the value 1.35
into the time-interval textfield
in the simulator control panel,
and select the us
(microseconds) value from
the time-scale drop-down list.
Reset the simulation by clicking the rewind button.
Now, click the run-for
button to run and automatically
pause the simulation after the selected time interval
(here 1.35 microseconds or one MCS4 clock cycle) has elapsed.
Repeatedly click the run-for button to step through the program.
You might also use a value of 8 cycles (10.8 microseconds)
to run the simulation for one full instruction-cycle instead of
single clock-cycles.
See also:
Run the applet | Run the editor (via Webstart)