; 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
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
Run the applet | Run the editor (via Webstart)