- 追加された行はこの色です。
- 削除された行はこの色です。
[[FpgaI2c]]
* miniCPUによるI2C光センサの制御 [#ld633006]
- 温度センサの回路と miniCPU のプログラムをちょっと書き換えて、I2C光センサを制御してみます。
- 光センサにはこれを使います。
-- https://www.switch-science.com/catalog/1174/
- 温度センサのときのtop.cf をちょっと書き換えて、 scl, sda を、nexys4 も pmod コネクタの JCの1,2 に割り当てます。
- ram.v をいかのように書き換えます。
- 温度センサのときのtop.ucf をちょっと書き換えて、 scl, sda を、nexys4 も pmod コネクタの JCの1,2 に割り当てます。
- ram.v を以下のように書き換えます。
-- ram.v
/*
PUSHI rtnval // push arg1... the address for receiving the result(temprature)
PUSH LightReadReg // push the register no. 0
push LightAddr // push the I2C temprature sensor address, 0x4b
pushi rtn0 // push the return address
JMP ri2c1 // call the ri2c2 ... read 2 byte data from the i2c device,
//
rtn0: pop rtncode
PUSH rtnval // push arg1... the i2c slave Addr
OUT
HALT //
rtnval: 0x0000
rtncode: 0x0000
LightReadReg: 0x008d
LightAddr: 0x0029
//
// wi2c1
// Write 1 byte to an i2c device
// arg 0: return address, arg1:device address, arg2:register no, arg3:1 byte value
// return ... if 1: ok, 0: error
//
wi2c1: PUSH wi2c1_jmp // subroutine. the 1st step to make the return instruction
BOR // make the return instruction using arg1 and the previous instruction
POP wi2c1_rtn // save the return instruction
POP wi2c1_addr // save the arg1, the i2c slave address
pop wi2c1_reg // save the arg2, destination register address
pop wi2c1_val // save the value which will be assiinged to the destination register.
//
PUSHI i2cStart // push arg1... the i2c slave Addr
PUSHI wi2c1_l1 // push the return address
JMP SubI2C1 // call the subroutine
//
wi2c1_l1: push wi2c1_addr
pushi 1
shl // make the i2c device address with the write flag
//
pushi wi2c1_l2
jmp si2c1
//
wi2c1_l2: PUSHI i2cRAck // push arg1 .... read the ack
PUSHI wi2c1_l3 //
JMP SubI2C1 // call the subroutine
//
wi2c1_l3: pushi wi2c1_reg
pushi wi2c1_l4
jmp si2c1
//
wi2c1_l4: PUSHI i2cRAck // push arg1 .... read the ack
PUSHI wi2c1_l5 //
JMP SubI2C1 // call the subroutine
//
wi2c1_l5: push wi2c1_val
pushi wi2c1_l6
jmp si2c1
//
wi2c1_l6: PUSHI i2cRAck // push arg1 .... read the ack
PUSHI wi2c1_l7 //
JMP SubI2C1 // call the subroutine
//
wi2c1_l7: PUSHI i2cStop // push arg1 .... write the ack
PUSHI wi2c1_l8 // push the return address
JMP SubI2C1 // call the subroutine
//
wi2c1_l8: pushI 1
wi2c1_rtn: jmp 0x000 // return
wi2c1_jmp: 0x4000
wi2c1_addr: 0x0000
wi2c1_reg: 0x0000
wi2c1_val: 0x0000
//
// wi2c2
// Write 2 byte to an i2c device
// arg 0: return address, arg1:device address, arg2:register no, arg3:two byte values
// return ... if 1: ok, 0: error
//
wi2c2: PUSH wi2c2_jmp // subroutine. the 1st step to make the return instruction
BOR // make the return instruction using arg1 and the previous instruction
POP wi2c2_rtn // save the return instruction
POP wi2c2_addr // save the arg1, the i2c slave address
pop wi2c2_reg // save the arg2, destination register address
pop wi2c2_val // save the value which will be assiinged to the destination register.
//
PUSHI i2cStart // push arg1... the i2c slave Addr
PUSHI wi2c2_l1 // push the return address
JMP SubI2C1 // call the subroutine
//
wi2c2_l1: push wi2c2_addr
pushi 1
shl // make the i2c device address with the write flag
pop wi2c2_waddr
//
pushi wi2c2_l2
jmp si2c1
//
wi2c2_l2: PUSHI i2cRAck // push arg1 .... read the ack
PUSHI wi2c2_l3 //
JMP SubI2C1 // call the subroutine
//
wi2c2_l3: push wi2c2_reg
pushi wi2c2_l4
jmp si2c1
//
wi2c2_l4: PUSHI i2cRAck // push arg1 .... read the ack
PUSHI wi2c2_l5 //
JMP SubI2C1 // call the subroutine
//
wi2c2_l5: push wi2c2_val
pushi 0x00ff
band
pushi wi2c2_l6
jmp si2c1
//
wi2c2_l6: PUSHI i2cRAck // push arg1 .... read the ack
PUSHI wi2c2_l7 //
JMP SubI2C1 // call the subroutine
//
wi2c2_l7: push wi2c2_val
pushi 8
shr
pushi wi2c2_l8
jmp si2c1
//
wi2c2_l8: PUSHI i2cRAck // push arg1 .... read the ack
PUSHI wi2c2_l9 //
JMP SubI2C1 // call the subroutine
//
wi2c2_l9: PUSHI i2cStop // push arg1 .... write the ack
PUSHI wi2c2_l10 // push the return address
JMP SubI2C1 // call the subroutine
//
wi2c2_l10: pushI 1
wi2c2_rtn: jmp 0x000 // return
wi2c2_jmp: 0x4000
wi2c2_addr: 0x0000
wi2c2_reg: 0x0000
wi2c2_val: 0x0000
//
// wi2c4
// Write 4 byte to an i2c device
// arg 0: return address, arg1:device address, arg2:register no, arg3:1st 2 byte, arg4: 2nd 2byte,
// return ... if 1: ok, 0: error
//
wi2c4: PUSH wi2c4_jmp // subroutine. the 1st step to make the return instruction
BOR // make the return instruction using arg1 and the previous instruction
POP wi2c4_rtn // save the return instruction
POP wi2c4_addr // save the arg1, the i2c slave address
pop wi2c4_reg // save the arg2, destination register address
pop wi2c4_val1 // save the 1st value which will be assiinged to the destination registers.
pop wi2c4_val2 // save the 2nd value which will be assiinged to the destination register2.
//
PUSHI i2cStart // push arg1... the i2c slave Addr
PUSHI wi2c4_l1 // push the return address
JMP SubI2C1 // call the subroutine
//
wi2c4_l1: push wi2c4_addr
pushi 1
shl // make the i2c device address with the write flag
pushi wi2c4_l2
jmp si2c1
//
wi2c4_l2: PUSHI i2cRAck // push arg1 .... read the ack
PUSHI wi2c4_l3 //
JMP SubI2C1 // call the subroutine
//
wi2c4_l3: push wi2c4_reg
pushi wi2c4_l4
jmp si2c1
//
wi2c4_l4: PUSHI i2cRAck // push arg1 .... read the ack
PUSHI wi2c4_l5 //
JMP SubI2C1 // call the subroutine
//
wi2c4_l5: push wi2c4_val1
pushi 0x00ff
band
pushi wi2c4_l6
jmp si2c1
//
wi2c4_l6: PUSHI i2cRAck // push arg1 .... read the ack
PUSHI wi2c4_l7 //
JMP SubI2C1 // call the subroutine
//
wi2c4_l7: push wi2c4_val1
pushi 8
shr
pushi wi2c4_l8
jmp si2c1
//
wi2c4_l8: PUSHI i2cRAck // push arg1 .... read the ack
PUSHI wi2c4_l9 //
JMP SubI2C1 // call the subroutine
//
wi2c4_l9: push wi2c4_val2
pushi 0x00ff
band
pushi wi2c4_l10
jmp si2c1
//
wi2c4_l10: PUSHI i2cRAck // push arg1 .... read the ack
PUSHI wi2c4_l11 //
JMP SubI2C1 // call the subroutine
//
wi2c4_l11: push wi2c4_val2
pushi 8
shr
pushi wi2c4_l12
jmp si2c1
//
wi2c4_l12: PUSHI i2cRAck // push arg1 .... read the ack
PUSHI wi2c4_l13 //
JMP SubI2C1 // call the subroutine
//
wi2c4_l13: PUSHI i2cStop // push arg1 .... write the ack
PUSHI wi2c4_l14 // push the return address
JMP SubI2C1 // call the subroutine
//
wi2c4_l14: pushI 1
wi2c4_rtn: jmp 0x000 // return
wi2c4_jmp: 0x4000
wi2c4_addr: 0x0000
wi2c4_reg: 0x0000
wi2c4_val1: 0x0000
wi2c4_val2: 0x0000
//
// si2c1
// Write 1 byte series to an i2c device
// ... arg1 ... device address, arg1... register no. arg2... 1 byte value
// return ... if 1: ok, 0: error
//
si2c1: PUSH si2c1_jmp // subroutine. the 1st step to make the return instruction
BOR // make the return instruction using arg1 and the previous instruction
POP si2c1_rtn // save the return instruction
POP si2c1_val
PUSHI 8
POP si2c1_i
si2c1_a3: push si2c1_val
pushi 0x0080
band
JNZ si2c1_a1
pushi 0x0000
out
pushi 0x0002
out
pushi 0x0000
out
jmp si2c1_a2
si2c1_a1: pushi 0x0001
out
pushi 0x0003
out
pushi 0x0001
out
si2c1_a2: push si2c1_val
pushi 1
shl
pop si2c1_val
push si2c1_i
pushi 1
sub
pop si2c1_i
push si2c1_i
jnz si2c1_a3
si2c1_rtn: jmp 0x000
si2c1_jmp: 0x4000
si2c1_val: 0x0000
si2c1_i: 0x0000
//
// ri2c1
// Read 1 byte from an i2c device
// ... arg1 ... device address, arg2 ... register number, arg3 .... the address for receiving the data
// return ... if 1:ok, 0:error
//
ri2c1: PUSH ri2c1_jmp // subroutine. the 1st step to make the return instruction
BOR // make the return instruction using arg1 and the previous instruction
POP ri2c1_rtn // save the return instruction
POP ri2c1_addr // save the arg1, the i2c slave address
pop ri2c1_reg // save the arg2, destination register address
pop ri2c1_raddr // save the address which receives the value of the destination register.
//
PUSHI i2cStart // push arg1... the i2c slave Addr
PUSHI ri2c1_a1 // push the return address
JMP SubI2C1 // call the subroutine
//
ri2c1_a1: push ri2c1_addr
pushi 1
shl // make the i2c device address with the write flag
pushi ri2c1_a2
jmp si2c1
//
ri2c1_a2: PUSHI i2cRAck // push arg1 .... read the ack
PUSHI ri2c1_a3 //
JMP SubI2C1 // call the subroutine
//
ri2c1_a3: push ri2c1_reg
pushi ri2c1_a4
jmp si2c1
//
ri2c1_a4: PUSHI i2cRAck // push arg1 .... read the ack
PUSHI ri2c1_a5 //
JMP SubI2C1 // call the subroutine
//
ri2c1_a5: PUSHI i2cStart // push arg1... the i2c slave Addr
PUSHI ri2c1_a6 // push the return address
JMP SubI2C1 // call the subroutine
//
ri2c1_a6: push ri2c1_addr
pushi 1
shl // make the i2c device address with the read flag
pushi 0x0001
BOR
pushi ri2c1_a7
jmp si2c1
//
ri2c1_a7: PUSHI i2cRAck // push arg1 .... read the ack
PUSHI ri2c1_a8 //
JMP SubI2C1 // call the subroutine
//
ri2c1_a8: pushi i2cRead
pushi ri2c1_a9
jmp SubI2C1
//
ri2c1_a9: push ri2c1_raddr
in
st
//
PUSHI i2cNAck // push arg1 .... Ack
PUSHI ri2c1_a10 //
JMP SubI2C1 // call the subroutine
//
ri2c1_a10: PUSHI i2cStop // push arg1 .... write the ack
PUSHI ri2c1_a11 // push the return address
JMP SubI2C1 // call the subroutine
//
ri2c1_a11: pushI 1
ri2c1_rtn: jmp 0x000 // return
ri2c1_jmp: 0x4000
ri2c1_addr: 0x0000
ri2c1_reg: 0x0000
ri2c1_raddr: 0x0000
//
// ri2c2
// Read 2 byte series from an i2c device
// ... arg1 ... device address, arg2 ... register number, arg3 ... the address for receiving the data
// return ... if 1: ok, 0:error
//
ri2c2: PUSH ri2c2_jmp // subroutine. the 1st step to make the return instruction
BOR // make the return instruction using arg1 and the previous instruction
POP ri2c2_rtn // save the return instruction
POP ri2c2_addr // save the arg1, the i2c slave address
pop ri2c2_reg // save the arg2, destination register address
pop ri2c2_raddr // save the address which receives the value of the destination register.
//
PUSHI i2cStart // push arg1... the i2c slave Addr
PUSHI ri2c2_a1 // push the return address
JMP SubI2C1 // call the subroutine
//
ri2c2_a1: push ri2c2_addr
pushi 1
shl // make the i2c device address with the write flag
//
pushi ri2c2_a2
jmp si2c1
//
ri2c2_a2: PUSHI i2cRAck // push arg1 .... read the ack
PUSHI ri2c2_a3 //
JMP SubI2C1 // call the subroutine
//
ri2c2_a3: push ri2c2_reg
pushi ri2c2_a4
jmp si2c1
//
ri2c2_a4: PUSHI i2cRAck // push arg1 .... read the ack
PUSHI ri2c2_a5 //
JMP SubI2C1 // call the subroutine
//
ri2c2_a5: PUSHI i2cStart // push arg1... the i2c slave Addr
PUSHI ri2c2_a6 // push the return address
JMP SubI2C1 // call the subroutine
//
ri2c2_a6: push ri2c2_addr
pushi 1
shl // make the i2c device address with the read flag
pushi 0x0001
BOR
pushi ri2c2_a7
jmp si2c1
//
ri2c2_a7: PUSHI i2cRAck // push arg1 .... read the ack
PUSHI ri2c2_a8 //
JMP SubI2C1 // call the subroutine
//
ri2c2_a8: pushi i2cRead
pushi ri2c2_l9
jmp SubI2C1
//
ri2c2_l9: in
pushi 8
shl
pop ri2c2_val1
//
PUSHI i2cWAck // push arg1 .... write the ack
PUSHI ri2c2_a10 //
JMP SubI2C1 // call the subroutine
//
ri2c2_a10: pushi i2cRead
pushi ri2c2_a11
jmp SubI2C1
//
ri2c2_a11: push ri2c2_raddr
in
push ri2c2_val1
bor
st
//
PUSHI i2cNAck // push arg1 .... Ack
PUSHI ri2c2_a12 //
JMP SubI2C1 // call the subroutine
//
ri2c2_a12: PUSHI i2cStop // push arg1 .... write the ack
PUSHI ri2c2_a13 // push the return address
JMP SubI2C1 // call the subroutine
//
ri2c2_a13: pushI 1
ri2c2_rtn: jmp 0x000 // return
ri2c2_jmp: 0x4000
ri2c2_addr: 0x0000
ri2c2_reg: 0x0000
ri2c2_raddr: 0x0000
ri2c2_val1: 0x0000
//
// SubI2C1 ... send the [arg1] steps of I2C [scl,sda] sequence after the address of [arg1 +1] to the i2c bus.
//
SubI2C1: PUSH LblJMP // subroutine. the 1st step to return instruction
BOR // make the return instruction using arg1 and the previous instruction
POP RtnSub1 // save the return instruction
POP Sub1Data2 // save the arg1
PUSH Sub1Data2
LD
POP N
PUSH Sub1Data2
PUSHI 1
ADD
POP Sub1SA
PUSHI 0
POP i
L1: PUSH i
PUSH Sub1SA
ADD
LD //... Sub1S[i];
OUT //... print(Sub1S[i]) ;
PUSH i
PUSHI 1
ADD
POP i
PUSH i
PUSH N
SUB
JNZ L1 // if(i<n) goto L1;
RtnSub1: JMP 0x000 // return
LblJMP: 0x4000
Sub1Data2: 0x0000
Sub1SA: 0x0000
i: 0x0000
N: 0x0000
//
// data for controlling i2c
// (MSB) ...... scl, sda (LSB)
//
// I2C start
i2cStart: 3
1 //01
3 //11
2 //10
0 //00
//
// I2C AddrWrite
i2cAddrW: 3
0 // 00
2 // 10 send 0 ... write
0 // 00
//
// I2C AddrRead
i2cAddrR: 3
1 // 01
3 // 11 ... read
1 // 01
//
// I2C
i2cRAck: 3
1 // 01
3 // 11 read ack
1 // 01
//
// I2C Write Ack
i2cWAck: 3
0 // 00
2 // 10 send 0 ... write
0 // 00
//
// I2C NAck
i2cNAck: 3
1 //01
3 // ... read
1 //
//
//
// stop
i2cStop: 3
2 // 10
3 // 11 stop the transfering
3 // 11
//
// I2C read 1byte
i2cRead: 0x0011
1 // 01
3 // 11
1 // 01
3 // 11
1 // 01
3 // 11
1 // 01
3 // 11
1 // 01
3 // 11
1 // 01
3 // 11
1 // 01
3 // 11
1 // 01
3 // 11
1 // 01
*/
mem[12'h000]=16'h1009 ; // PUSHI rtnval
mem[12'h001]=16'h200b ; // PUSH tempReadReg
mem[12'h002]=16'h200c ; // push tempAddr
mem[12'h003]=16'h1005 ; // pushi rtn0
mem[12'h004]=16'h40cb ; // JMP ri2c1
mem[12'h005]=16'h300a ; //rtn0: pop rtncode
mem[12'h006]=16'h2009 ; // PUSH rtnval
mem[12'h007]=16'he000 ; // OUT
mem[12'h008]=16'h0000 ; // HALT
mem[12'h009]=16'h0000 ; //rtnval: 0x0000
mem[12'h00a]=16'h0000 ; //rtncode: 0x0000
mem[12'h00b]=16'h008c ; //tempReadReg: 0x008c
mem[12'h00c]=16'h0029 ; //tempAddr: 0x0029
mem[12'h00d]=16'h202f ; //wi2c1: PUSH wi2c1_jmp
mem[12'h00e]=16'hf006 ; // BOR
mem[12'h00f]=16'h302e ; // POP wi2c1_rtn
mem[12'h010]=16'h3030 ; // POP wi2c1_addr
mem[12'h011]=16'h3031 ; // pop wi2c1_reg
mem[12'h012]=16'h3032 ; // pop wi2c1_val
mem[12'h013]=16'h1164 ; // PUSHI i2cStart
mem[12'h014]=16'h1016 ; // PUSHI wi2c1_l1
mem[12'h015]=16'h4144 ; // JMP SubI2C1
mem[12'h016]=16'h2030 ; //wi2c1_l1: push wi2c1_addr
mem[12'h017]=16'h1001 ; // pushi 1
mem[12'h018]=16'hf003 ; // shl
mem[12'h019]=16'h101b ; // pushi wi2c1_l2
mem[12'h01a]=16'h40a6 ; // jmp si2c1
mem[12'h01b]=16'h1171 ; //wi2c1_l2: PUSHI i2cRAck
mem[12'h01c]=16'h101e ; // PUSHI wi2c1_l3
mem[12'h01d]=16'h4144 ; // JMP SubI2C1
mem[12'h01e]=16'h1031 ; //wi2c1_l3: pushi wi2c1_reg
mem[12'h01f]=16'h1021 ; // pushi wi2c1_l4
mem[12'h020]=16'h40a6 ; // jmp si2c1
mem[12'h021]=16'h1171 ; //wi2c1_l4: PUSHI i2cRAck
mem[12'h022]=16'h1024 ; // PUSHI wi2c1_l5
mem[12'h023]=16'h4144 ; // JMP SubI2C1
mem[12'h024]=16'h2032 ; //wi2c1_l5: push wi2c1_val
mem[12'h025]=16'h1027 ; // pushi wi2c1_l6
mem[12'h026]=16'h40a6 ; // jmp si2c1
mem[12'h027]=16'h1171 ; //wi2c1_l6: PUSHI i2cRAck
mem[12'h028]=16'h102a ; // PUSHI wi2c1_l7
mem[12'h029]=16'h4144 ; // JMP SubI2C1
mem[12'h02a]=16'h117d ; //wi2c1_l7: PUSHI i2cStop
mem[12'h02b]=16'h102d ; // PUSHI wi2c1_l8
mem[12'h02c]=16'h4144 ; // JMP SubI2C1
mem[12'h02d]=16'h1001 ; //wi2c1_l8: pushI 1
mem[12'h02e]=16'h4000 ; //wi2c1_rtn: jmp 0x000
mem[12'h02f]=16'h4000 ; //wi2c1_jmp: 0x4000
mem[12'h030]=16'h0000 ; //wi2c1_addr: 0x0000
mem[12'h031]=16'h0000 ; //wi2c1_reg: 0x0000
mem[12'h032]=16'h0000 ; //wi2c1_val: 0x0000
mem[12'h033]=16'h2060 ; //wi2c2: PUSH wi2c2_jmp
mem[12'h034]=16'hf006 ; // BOR
mem[12'h035]=16'h305f ; // POP wi2c2_rtn
mem[12'h036]=16'h3061 ; // POP wi2c2_addr
mem[12'h037]=16'h3062 ; // pop wi2c2_reg
mem[12'h038]=16'h3063 ; // pop wi2c2_val
mem[12'h039]=16'h1164 ; // PUSHI i2cStart
mem[12'h03a]=16'h103c ; // PUSHI wi2c2_l1
mem[12'h03b]=16'h4144 ; // JMP SubI2C1
mem[12'h03c]=16'h2061 ; //wi2c2_l1: push wi2c2_addr
mem[12'h03d]=16'h1001 ; // pushi 1
mem[12'h03e]=16'hf003 ; // shl
mem[12'h03f]=16'h3000 ; // pop wi2c2_waddr
mem[12'h040]=16'h1042 ; // pushi wi2c2_l2
mem[12'h041]=16'h40a6 ; // jmp si2c1
mem[12'h042]=16'h1171 ; //wi2c2_l2: PUSHI i2cRAck
mem[12'h043]=16'h1045 ; // PUSHI wi2c2_l3
mem[12'h044]=16'h4144 ; // JMP SubI2C1
mem[12'h045]=16'h2062 ; //wi2c2_l3: push wi2c2_reg
mem[12'h046]=16'h1048 ; // pushi wi2c2_l4
mem[12'h047]=16'h40a6 ; // jmp si2c1
mem[12'h048]=16'h1171 ; //wi2c2_l4: PUSHI i2cRAck
mem[12'h049]=16'h104b ; // PUSHI wi2c2_l5
mem[12'h04a]=16'h4144 ; // JMP SubI2C1
mem[12'h04b]=16'h2063 ; //wi2c2_l5: push wi2c2_val
mem[12'h04c]=16'h10ff ; // pushi 0x00ff
mem[12'h04d]=16'hf005 ; // band
mem[12'h04e]=16'h1050 ; // pushi wi2c2_l6
mem[12'h04f]=16'h40a6 ; // jmp si2c1
mem[12'h050]=16'h1171 ; //wi2c2_l6: PUSHI i2cRAck
mem[12'h051]=16'h1053 ; // PUSHI wi2c2_l7
mem[12'h052]=16'h4144 ; // JMP SubI2C1
mem[12'h053]=16'h2063 ; //wi2c2_l7: push wi2c2_val
mem[12'h054]=16'h1008 ; // pushi 8
mem[12'h055]=16'hf004 ; // shr
mem[12'h056]=16'h1058 ; // pushi wi2c2_l8
mem[12'h057]=16'h40a6 ; // jmp si2c1
mem[12'h058]=16'h1171 ; //wi2c2_l8: PUSHI i2cRAck
mem[12'h059]=16'h105b ; // PUSHI wi2c2_l9
mem[12'h05a]=16'h4144 ; // JMP SubI2C1
mem[12'h05b]=16'h117d ; //wi2c2_l9: PUSHI i2cStop
mem[12'h05c]=16'h105e ; // PUSHI wi2c2_l10
mem[12'h05d]=16'h4144 ; // JMP SubI2C1
mem[12'h05e]=16'h1001 ; //wi2c2_l10: pushI 1
mem[12'h05f]=16'h4000 ; //wi2c2_rtn: jmp 0x000
mem[12'h060]=16'h4000 ; //wi2c2_jmp: 0x4000
mem[12'h061]=16'h0000 ; //wi2c2_addr: 0x0000
mem[12'h062]=16'h0000 ; //wi2c2_reg: 0x0000
mem[12'h063]=16'h0000 ; //wi2c2_val: 0x0000
mem[12'h064]=16'h20a1 ; //wi2c4: PUSH wi2c4_jmp
mem[12'h065]=16'hf006 ; // BOR
mem[12'h066]=16'h30a0 ; // POP wi2c4_rtn
mem[12'h067]=16'h30a2 ; // POP wi2c4_addr
mem[12'h068]=16'h30a3 ; // pop wi2c4_reg
mem[12'h069]=16'h30a4 ; // pop wi2c4_val1
mem[12'h06a]=16'h30a5 ; // pop wi2c4_val2
mem[12'h06b]=16'h1164 ; // PUSHI i2cStart
mem[12'h06c]=16'h106e ; // PUSHI wi2c4_l1
mem[12'h06d]=16'h4144 ; // JMP SubI2C1
mem[12'h06e]=16'h20a2 ; //wi2c4_l1: push wi2c4_addr
mem[12'h06f]=16'h1001 ; // pushi 1
mem[12'h070]=16'hf003 ; // shl
mem[12'h071]=16'h1073 ; // pushi wi2c4_l2
mem[12'h072]=16'h40a6 ; // jmp si2c1
mem[12'h073]=16'h1171 ; //wi2c4_l2: PUSHI i2cRAck
mem[12'h074]=16'h1076 ; // PUSHI wi2c4_l3
mem[12'h075]=16'h4144 ; // JMP SubI2C1
mem[12'h076]=16'h20a3 ; //wi2c4_l3: push wi2c4_reg
mem[12'h077]=16'h1079 ; // pushi wi2c4_l4
mem[12'h078]=16'h40a6 ; // jmp si2c1
mem[12'h079]=16'h1171 ; //wi2c4_l4: PUSHI i2cRAck
mem[12'h07a]=16'h107c ; // PUSHI wi2c4_l5
mem[12'h07b]=16'h4144 ; // JMP SubI2C1
mem[12'h07c]=16'h20a4 ; //wi2c4_l5: push wi2c4_val1
mem[12'h07d]=16'h10ff ; // pushi 0x00ff
mem[12'h07e]=16'hf005 ; // band
mem[12'h07f]=16'h1081 ; // pushi wi2c4_l6
mem[12'h080]=16'h40a6 ; // jmp si2c1
mem[12'h081]=16'h1171 ; //wi2c4_l6: PUSHI i2cRAck
mem[12'h082]=16'h1084 ; // PUSHI wi2c4_l7
mem[12'h083]=16'h4144 ; // JMP SubI2C1
mem[12'h084]=16'h20a4 ; //wi2c4_l7: push wi2c4_val1
mem[12'h085]=16'h1008 ; // pushi 8
mem[12'h086]=16'hf004 ; // shr
mem[12'h087]=16'h1089 ; // pushi wi2c4_l8
mem[12'h088]=16'h40a6 ; // jmp si2c1
mem[12'h089]=16'h1171 ; //wi2c4_l8: PUSHI i2cRAck
mem[12'h08a]=16'h108c ; // PUSHI wi2c4_l9
mem[12'h08b]=16'h4144 ; // JMP SubI2C1
mem[12'h08c]=16'h20a5 ; //wi2c4_l9: push wi2c4_val2
mem[12'h08d]=16'h10ff ; // pushi 0x00ff
mem[12'h08e]=16'hf005 ; // band
mem[12'h08f]=16'h1091 ; // pushi wi2c4_l10
mem[12'h090]=16'h40a6 ; // jmp si2c1
mem[12'h091]=16'h1171 ; //wi2c4_l10: PUSHI i2cRAck
mem[12'h092]=16'h1094 ; // PUSHI wi2c4_l11
mem[12'h093]=16'h4144 ; // JMP SubI2C1
mem[12'h094]=16'h20a5 ; //wi2c4_l11: push wi2c4_val2
mem[12'h095]=16'h1008 ; // pushi 8
mem[12'h096]=16'hf004 ; // shr
mem[12'h097]=16'h1099 ; // pushi wi2c4_l12
mem[12'h098]=16'h40a6 ; // jmp si2c1
mem[12'h099]=16'h1171 ; //wi2c4_l12: PUSHI i2cRAck
mem[12'h09a]=16'h109c ; // PUSHI wi2c4_l13
mem[12'h09b]=16'h4144 ; // JMP SubI2C1
mem[12'h09c]=16'h117d ; //wi2c4_l13: PUSHI i2cStop
mem[12'h09d]=16'h109f ; // PUSHI wi2c4_l14
mem[12'h09e]=16'h4144 ; // JMP SubI2C1
mem[12'h09f]=16'h1001 ; //wi2c4_l14: pushI 1
mem[12'h0a0]=16'h4000 ; //wi2c4_rtn: jmp 0x000
mem[12'h0a1]=16'h4000 ; //wi2c4_jmp: 0x4000
mem[12'h0a2]=16'h0000 ; //wi2c4_addr: 0x0000
mem[12'h0a3]=16'h0000 ; //wi2c4_reg: 0x0000
mem[12'h0a4]=16'h0000 ; //wi2c4_val1: 0x0000
mem[12'h0a5]=16'h0000 ; //wi2c4_val2: 0x0000
mem[12'h0a6]=16'h20c8 ; //si2c1: PUSH si2c1_jmp
mem[12'h0a7]=16'hf006 ; // BOR
mem[12'h0a8]=16'h30c7 ; // POP si2c1_rtn
mem[12'h0a9]=16'h30c9 ; // POP si2c1_val
mem[12'h0aa]=16'h1008 ; // PUSHI 8
mem[12'h0ab]=16'h30ca ; // POP si2c1_i
mem[12'h0ac]=16'h20c9 ; //si2c1_a3: push si2c1_val
mem[12'h0ad]=16'h1080 ; // pushi 0x0080
mem[12'h0ae]=16'hf005 ; // band
mem[12'h0af]=16'h60b7 ; // JNZ si2c1_a1
mem[12'h0b0]=16'h1000 ; // pushi 0x0000
mem[12'h0b1]=16'he000 ; // out
mem[12'h0b2]=16'h1002 ; // pushi 0x0002
mem[12'h0b3]=16'he000 ; // out
mem[12'h0b4]=16'h1000 ; // pushi 0x0000
mem[12'h0b5]=16'he000 ; // out
mem[12'h0b6]=16'h40bd ; // jmp si2c1_a2
mem[12'h0b7]=16'h1001 ; //si2c1_a1: pushi 0x0001
mem[12'h0b8]=16'he000 ; // out
mem[12'h0b9]=16'h1003 ; // pushi 0x0003
mem[12'h0ba]=16'he000 ; // out
mem[12'h0bb]=16'h1001 ; // pushi 0x0001
mem[12'h0bc]=16'he000 ; // out
mem[12'h0bd]=16'h20c9 ; //si2c1_a2: push si2c1_val
mem[12'h0be]=16'h1001 ; // pushi 1
mem[12'h0bf]=16'hf003 ; // shl
mem[12'h0c0]=16'h30c9 ; // pop si2c1_val
mem[12'h0c1]=16'h20ca ; // push si2c1_i
mem[12'h0c2]=16'h1001 ; // pushi 1
mem[12'h0c3]=16'hf001 ; // sub
mem[12'h0c4]=16'h30ca ; // pop si2c1_i
mem[12'h0c5]=16'h20ca ; // push si2c1_i
mem[12'h0c6]=16'h60ac ; // jnz si2c1_a3
mem[12'h0c7]=16'h4000 ; //si2c1_rtn: jmp 0x000
mem[12'h0c8]=16'h4000 ; //si2c1_jmp: 0x4000
mem[12'h0c9]=16'h0000 ; //si2c1_val: 0x0000
mem[12'h0ca]=16'h0000 ; //si2c1_i: 0x0000
mem[12'h0cb]=16'h20fd ; //ri2c1: PUSH ri2c1_jmp
mem[12'h0cc]=16'hf006 ; // BOR
mem[12'h0cd]=16'h30fc ; // POP ri2c1_rtn
mem[12'h0ce]=16'h30fe ; // POP ri2c1_addr
mem[12'h0cf]=16'h30ff ; // pop ri2c1_reg
mem[12'h0d0]=16'h3100 ; // pop ri2c1_raddr
mem[12'h0d1]=16'h1164 ; // PUSHI i2cStart
mem[12'h0d2]=16'h10d4 ; // PUSHI ri2c1_a1
mem[12'h0d3]=16'h4144 ; // JMP SubI2C1
mem[12'h0d4]=16'h20fe ; //ri2c1_a1: push ri2c1_addr
mem[12'h0d5]=16'h1001 ; // pushi 1
mem[12'h0d6]=16'hf003 ; // shl
mem[12'h0d7]=16'h10d9 ; // pushi ri2c1_a2
mem[12'h0d8]=16'h40a6 ; // jmp si2c1
mem[12'h0d9]=16'h1171 ; //ri2c1_a2: PUSHI i2cRAck
mem[12'h0da]=16'h10dc ; // PUSHI ri2c1_a3
mem[12'h0db]=16'h4144 ; // JMP SubI2C1
mem[12'h0dc]=16'h20ff ; //ri2c1_a3: push ri2c1_reg
mem[12'h0dd]=16'h10df ; // pushi ri2c1_a4
mem[12'h0de]=16'h40a6 ; // jmp si2c1
mem[12'h0df]=16'h1171 ; //ri2c1_a4: PUSHI i2cRAck
mem[12'h0e0]=16'h10e2 ; // PUSHI ri2c1_a5
mem[12'h0e1]=16'h4144 ; // JMP SubI2C1
mem[12'h0e2]=16'h1164 ; //ri2c1_a5: PUSHI i2cStart
mem[12'h0e3]=16'h10e5 ; // PUSHI ri2c1_a6
mem[12'h0e4]=16'h4144 ; // JMP SubI2C1
mem[12'h0e5]=16'h20fe ; //ri2c1_a6: push ri2c1_addr
mem[12'h0e6]=16'h1001 ; // pushi 1
mem[12'h0e7]=16'hf003 ; // shl
mem[12'h0e8]=16'h1001 ; // pushi 0x0001
mem[12'h0e9]=16'hf006 ; // BOR
mem[12'h0ea]=16'h10ec ; // pushi ri2c1_a7
mem[12'h0eb]=16'h40a6 ; // jmp si2c1
mem[12'h0ec]=16'h1171 ; //ri2c1_a7: PUSHI i2cRAck
mem[12'h0ed]=16'h10ef ; // PUSHI ri2c1_a8
mem[12'h0ee]=16'h4144 ; // JMP SubI2C1
mem[12'h0ef]=16'h1181 ; //ri2c1_a8: pushi i2cRead
mem[12'h0f0]=16'h10f2 ; // pushi ri2c1_a9
mem[12'h0f1]=16'h4144 ; // jmp SubI2C1
mem[12'h0f2]=16'h2100 ; //ri2c1_a9: push ri2c1_raddr
mem[12'h0f3]=16'hd000 ; // in
mem[12'h0f4]=16'h8000 ; // st
mem[12'h0f5]=16'h1179 ; // PUSHI i2cNAck
mem[12'h0f6]=16'h10f8 ; // PUSHI ri2c1_a10
mem[12'h0f7]=16'h4144 ; // JMP SubI2C1
mem[12'h0f8]=16'h117d ; //ri2c1_a10: PUSHI i2cStop
mem[12'h0f9]=16'h10fb ; // PUSHI ri2c1_a11
mem[12'h0fa]=16'h4144 ; // JMP SubI2C1
mem[12'h0fb]=16'h1001 ; //ri2c1_a11: pushI 1
mem[12'h0fc]=16'h4000 ; //ri2c1_rtn: jmp 0x000
mem[12'h0fd]=16'h4000 ; //ri2c1_jmp: 0x4000
mem[12'h0fe]=16'h0000 ; //ri2c1_addr: 0x0000
mem[12'h0ff]=16'h0000 ; //ri2c1_reg: 0x0000
mem[12'h100]=16'h0000 ; //ri2c1_raddr: 0x0000
mem[12'h101]=16'h213f ; //ri2c2: PUSH ri2c2_jmp
mem[12'h102]=16'hf006 ; // BOR
mem[12'h103]=16'h313e ; // POP ri2c2_rtn
mem[12'h104]=16'h3140 ; // POP ri2c2_addr
mem[12'h105]=16'h3141 ; // pop ri2c2_reg
mem[12'h106]=16'h3142 ; // pop ri2c2_raddr
mem[12'h107]=16'h1164 ; // PUSHI i2cStart
mem[12'h108]=16'h110a ; // PUSHI ri2c2_a1
mem[12'h109]=16'h4144 ; // JMP SubI2C1
mem[12'h10a]=16'h2140 ; //ri2c2_a1: push ri2c2_addr
mem[12'h10b]=16'h1001 ; // pushi 1
mem[12'h10c]=16'hf003 ; // shl
mem[12'h10d]=16'h110f ; // pushi ri2c2_a2
mem[12'h10e]=16'h40a6 ; // jmp si2c1
mem[12'h10f]=16'h1171 ; //ri2c2_a2: PUSHI i2cRAck
mem[12'h110]=16'h1112 ; // PUSHI ri2c2_a3
mem[12'h111]=16'h4144 ; // JMP SubI2C1
mem[12'h112]=16'h2141 ; //ri2c2_a3: push ri2c2_reg
mem[12'h113]=16'h1115 ; // pushi ri2c2_a4
mem[12'h114]=16'h40a6 ; // jmp si2c1
mem[12'h115]=16'h1171 ; //ri2c2_a4: PUSHI i2cRAck
mem[12'h116]=16'h1118 ; // PUSHI ri2c2_a5
mem[12'h117]=16'h4144 ; // JMP SubI2C1
mem[12'h118]=16'h1164 ; //ri2c2_a5: PUSHI i2cStart
mem[12'h119]=16'h111b ; // PUSHI ri2c2_a6
mem[12'h11a]=16'h4144 ; // JMP SubI2C1
mem[12'h11b]=16'h2140 ; //ri2c2_a6: push ri2c2_addr
mem[12'h11c]=16'h1001 ; // pushi 1
mem[12'h11d]=16'hf003 ; // shl
mem[12'h11e]=16'h1001 ; // pushi 0x0001
mem[12'h11f]=16'hf006 ; // BOR
mem[12'h120]=16'h1122 ; // pushi ri2c2_a7
mem[12'h121]=16'h40a6 ; // jmp si2c1
mem[12'h122]=16'h1171 ; //ri2c2_a7: PUSHI i2cRAck
mem[12'h123]=16'h1125 ; // PUSHI ri2c2_a8
mem[12'h124]=16'h4144 ; // JMP SubI2C1
mem[12'h125]=16'h1181 ; //ri2c2_a8: pushi i2cRead
mem[12'h126]=16'h1128 ; // pushi ri2c2_l9
mem[12'h127]=16'h4144 ; // jmp SubI2C1
mem[12'h128]=16'hd000 ; //ri2c2_l9: in
mem[12'h129]=16'h1008 ; // pushi 8
mem[12'h12a]=16'hf003 ; // shl
mem[12'h12b]=16'h3143 ; // pop ri2c2_val1
mem[12'h12c]=16'h1175 ; // PUSHI i2cWAck
mem[12'h12d]=16'h112f ; // PUSHI ri2c2_a10
mem[12'h12e]=16'h4144 ; // JMP SubI2C1
mem[12'h12f]=16'h1181 ; //ri2c2_a10: pushi i2cRead
mem[12'h130]=16'h1132 ; // pushi ri2c2_a11
mem[12'h131]=16'h4144 ; // jmp SubI2C1
mem[12'h132]=16'h2142 ; //ri2c2_a11: push ri2c2_raddr
mem[12'h133]=16'hd000 ; // in
mem[12'h134]=16'h2143 ; // push ri2c2_val1
mem[12'h135]=16'hf006 ; // bor
mem[12'h136]=16'h8000 ; // st
mem[12'h137]=16'h1179 ; // PUSHI i2cNAck
mem[12'h138]=16'h113a ; // PUSHI ri2c2_a12
mem[12'h139]=16'h4144 ; // JMP SubI2C1
mem[12'h13a]=16'h117d ; //ri2c2_a12: PUSHI i2cStop
mem[12'h13b]=16'h113d ; // PUSHI ri2c2_a13
mem[12'h13c]=16'h4144 ; // JMP SubI2C1
mem[12'h13d]=16'h1001 ; //ri2c2_a13: pushI 1
mem[12'h13e]=16'h4000 ; //ri2c2_rtn: jmp 0x000
mem[12'h13f]=16'h4000 ; //ri2c2_jmp: 0x4000
mem[12'h140]=16'h0000 ; //ri2c2_addr: 0x0000
mem[12'h141]=16'h0000 ; //ri2c2_reg: 0x0000
mem[12'h142]=16'h0000 ; //ri2c2_raddr: 0x0000
mem[12'h143]=16'h0000 ; //ri2c2_val1: 0x0000
mem[12'h144]=16'h215f ; //SubI2C1: PUSH LblJMP
mem[12'h145]=16'hf006 ; // BOR
mem[12'h146]=16'h315e ; // POP RtnSub1
mem[12'h147]=16'h3160 ; // POP Sub1Data2
mem[12'h148]=16'h2160 ; // PUSH Sub1Data2
mem[12'h149]=16'h7000 ; // LD
mem[12'h14a]=16'h3163 ; // POP N
mem[12'h14b]=16'h2160 ; // PUSH Sub1Data2
mem[12'h14c]=16'h1001 ; // PUSHI 1
mem[12'h14d]=16'hf000 ; // ADD
mem[12'h14e]=16'h3161 ; // POP Sub1SA
mem[12'h14f]=16'h1000 ; // PUSHI 0
mem[12'h150]=16'h3162 ; // POP i
mem[12'h151]=16'h2162 ; //L1: PUSH i
mem[12'h152]=16'h2161 ; // PUSH Sub1SA
mem[12'h153]=16'hf000 ; // ADD
mem[12'h154]=16'h7000 ; // LD
mem[12'h155]=16'he000 ; // OUT
mem[12'h156]=16'h2162 ; // PUSH i
mem[12'h157]=16'h1001 ; // PUSHI 1
mem[12'h158]=16'hf000 ; // ADD
mem[12'h159]=16'h3162 ; // POP i
mem[12'h15a]=16'h2162 ; // PUSH i
mem[12'h15b]=16'h2163 ; // PUSH N
mem[12'h15c]=16'hf001 ; // SUB
mem[12'h15d]=16'h6151 ; // JNZ L1
mem[12'h15e]=16'h4000 ; //RtnSub1: JMP 0x000
mem[12'h15f]=16'h4000 ; //LblJMP: 0x4000
mem[12'h160]=16'h0000 ; //Sub1Data2: 0x0000
mem[12'h161]=16'h0000 ; //Sub1SA: 0x0000
mem[12'h162]=16'h0000 ; //i: 0x0000
mem[12'h163]=16'h0000 ; //N: 0x0000
mem[12'h164]=16'h0003 ; //i2cStart: 3
mem[12'h165]=16'h0001 ; // 1
mem[12'h166]=16'h0003 ; // 3
mem[12'h167]=16'h0002 ; // 2
mem[12'h168]=16'h0000 ; // 0
mem[12'h169]=16'h0003 ; //i2cAddrW: 3
mem[12'h16a]=16'h0000 ; // 0
mem[12'h16b]=16'h0002 ; // 2
mem[12'h16c]=16'h0000 ; // 0
mem[12'h16d]=16'h0003 ; //i2cAddrR: 3
mem[12'h16e]=16'h0001 ; // 1
mem[12'h16f]=16'h0003 ; // 3
mem[12'h170]=16'h0001 ; // 1
mem[12'h171]=16'h0003 ; //i2cRAck: 3
mem[12'h172]=16'h0001 ; // 1
mem[12'h173]=16'h0003 ; // 3
mem[12'h174]=16'h0001 ; // 1
mem[12'h175]=16'h0003 ; //i2cWAck: 3
mem[12'h176]=16'h0000 ; // 0
mem[12'h177]=16'h0002 ; // 2
mem[12'h178]=16'h0000 ; // 0
mem[12'h179]=16'h0003 ; //i2cNAck: 3
mem[12'h17a]=16'h0001 ; // 1
mem[12'h17b]=16'h0003 ; // 3
mem[12'h17c]=16'h0001 ; // 1
mem[12'h17d]=16'h0003 ; //i2cStop: 3
mem[12'h17e]=16'h0002 ; // 2
mem[12'h17f]=16'h0003 ; // 3
mem[12'h180]=16'h0003 ; // 3
mem[12'h181]=16'h0011 ; //i2cRead: 0x0011
mem[12'h182]=16'h0001 ; // 1
mem[12'h183]=16'h0003 ; // 3
mem[12'h184]=16'h0001 ; // 1
mem[12'h185]=16'h0003 ; // 3
mem[12'h186]=16'h0001 ; // 1
mem[12'h187]=16'h0003 ; // 3
mem[12'h188]=16'h0001 ; // 1
mem[12'h189]=16'h0003 ; // 3
mem[12'h18a]=16'h0001 ; // 1
mem[12'h18b]=16'h0003 ; // 3
mem[12'h18c]=16'h0001 ; // 1
mem[12'h18d]=16'h0003 ; // 3
mem[12'h18e]=16'h0001 ; // 1
mem[12'h18f]=16'h0003 ; // 3
mem[12'h190]=16'h0001 ; // 1
mem[12'h191]=16'h0003 ; // 3
mem[12'h192]=16'h0001 ; // 1