1.1.0 • Published 9 months ago
i40xx-asm v1.1.0
i40xx-asm
Assembly for Intel 4004/4040 architecture
Installation
Install globally:
npm install -g i40xx-asm
Usage
Compiles program.i4004
into ROM image and store it into program.bin
i40xx-asm program.i4004 program.bin
You can omit output file name, in that case assembler would replace extension of input file name to .bin
Assembly Syntax
Comments started with #
:
# comment
Labels could be used:
label:
NOP
label2: DCL
Each instruction should be on separate line and can have 0, 1, or 2 operands:
instruction
instruction operand
instruction operand1, operand2
Operand could be one of kind:
- 4-bit index register, format is
rrX
, where X is 1..16:LD rr10
- 8-bit index register pair, format is
rX
, where X is 1..8:FIN r3
- immediate value, either hex or decimal:
LDM 0xF
/FIM r2, 200
- ROM address, format is
XX:YYY
, where XX is page number (in decimal form) and YYY is offset inside page:JUN 5:0xDD
- label name:
ISZ rr5, do_loop
- condition (for
JCN
instruction), combination of symbolsn
(invert condition),z
(if zero),t
(if test signal is 0),c
(if carry):JCN nz, non_zero
Sample program (iterate through all RAM banks, RAM chips and their registers and fill RAM words by specific value):
FIM r0, 0x80
loop_bank:
// select bank
LD rr1
DCL
// iterate through reg number
FIM r1, 0x00
loop_reg:
LDM 0
XCH rr3
SRC r1
LD rr1
WRM // write rr1 to [#rr1, #rr2, M0]
WR0 // write rr1 to [#rr1, #rr2, S0]
INC rr3
SRC r1
LD rr2
WRM // write rr2 to [#rr1, #rr2, M1]
WR1 // write rr2 to [#rr1, #rr2, S1]
ISZ rr2, loop_reg
INC rr1
ISZ rr0, loop_bank
halt:
JUN halt
Module/Programmatic Usage
i40xx-asm can be required as a module:
const { compile } = require('i40xx-asm');
const { errors, blocks } = compile('nop');
if (Array.isArray(errors) && errors.length) {
console.log(errors);
process.exit(1);
}
console.log(`First byte of first block is ${blocks[0].bytecode[0]}`);