miniCPU アセンブラ

概要

  • miniCPUでサーボモーターを制御します。

サーボモーターの制御の方法

  • サーボモータは PWM の On/Off の比によってギヤの向きを制御します。

PCA9685

回路

  • FPGAボードは光センサをそのまま使い、I2Cバスに, 光センサに加えて, I2C PWM controller PCA9685 を接続します(光センサの抵抗をI2Cバスの抵抗に流用します)。PCA9685の +3.3v, GND, scl, sda はI2C光センサと同様に接続します。そのほかに、6V電源(単3乾電池4つ直列)を接続します。

Verilog

  • ram.v のプログラムの部分。光センサの ram.v を以下で置き換えます。
    /*
    //
    // servo motors controller example.
    //   use Ada fruit PCA9685 I2C PWM controller
    //
    // initialize
              pushi main_a0 
    			 jmp servoInit
     main_a0: jz main_a0_1
    			 pushi 0x00
    			 out
    //          halt
    // move to center
     main_a0_1: pushi 0
    			 push servoCen
    			 push servoCh0
    			 push servoAddr
    			 pushi main_a1
    			 jmp wi2c4           // move ch0 to center
     main_a1: jz main_a1_1
    			 pushi 0x01
    			 out
    //          halt
    // wait
     main_a1_1: pushi 0x000f
    			 pushi main_a2
    			 jmp waitLoop        // wait
     main_a2: jz main_a2_1
              pushi 0x02
    			 out
    //          halt
    // move to min
     main_a2_1:  pushi 0
    			 push servoMin
    			 push servoCh0
    			 push servoAddr
    			 pushi main_a3
    			 jmp wi2c4           // move ch0 to min
     main_a3: jz main_a3_1
              pushi 0x03
    			 out
    //          halt
    // wait
     main_a3_1: pushi 0x000f
    			 pushi main_a4       // wait
    			 jmp waitLoop
     main_a4: jz main_a4_1
              pushi 0x04
    			 out
    //          halt
    // move to center
     main_a4_1: pushi 0
    			 push servoCen
    			 push servoCh0
    			 push servoAddr
    			 pushi main_a5
    			 jmp wi2c4          // move ch0 to center
     main_a5: jz main_a5_1
              pushi 0x05
    			 out
    //          halt
    // wait
     main_a5_1:  pushi 0x000f
    			 pushi main_a6
    			 jmp waitLoop        // wait
     main_a6: jz main_a6_1
              pushi 0x06
    			 out
    			 halt
     // move to max
     main_a6_1: pushi 0
    			 push servoMax
    			 push servoCh0
    			 push servoAddr
    			 pushi main_a7
    			 jmp wi2c4           // move ch0 to max
     main_a7: jz main_a7_1
              pushi 0x07
    			 out
    //          halt
     // wait
     main_a7_1: pushi 0x000f
    			 pushi main_a8
    			 jmp waitLoop        // wait
     main_a8: jz main_a8_1
              pushi 0x08
    			 out
    			 halt
     // move to center
     main_a8_1: pushi 0
    			 push servoCen
    			 push servoCh0
    			 push servoAddr
    			 pushi main_a9
    			 jmp wi2c4           // move ch0 to center
     main_a9: jz main_a9_1
              pushi 0x09
    			 out
              halt 
     main_a9_1: pushi 0x10
              out
    			 halt                // halt
     main_rcode: 0x0000
    // move servo 0 to 100
    // move servo 1 to -100
    // wait
    // move servo 0 to -100
    // move servo 1 to 100
    //
    // initialize
    //   uint8_t oldmode = read8(PCA9685_MODE1);
    //   uint8_t newmode = (oldmode&0x7F) | 0x10; // sleep                             
    //   write8(PCA9685_MODE1, newmode); // go to sleep                                
    //   write8(PCA9685_PRESCALE, prescale); // set the prescaler                      
    //   write8(PCA9685_MODE1, oldmode);
    //   delay(5);
    //   write8(PCA9685_MODE1, oldmode | 0xa1);  //  This sets the MODE1 register to turn on auto increment.
    //
    //   get current status
    //   sleep
    //   set new status
    //   set prescale
    // prescale = - 25000000/(4096*60*0.9) = 0xFF8F
    //
    //   wake up
    //
    // servoInit
    //    initialize the i2c PWM controller PCA9685 as the servo motor device.
    //    arg0 : return address
    //
     servoInit: push servoInit_jmp
    			 bor
              pop servoInit_rtn
    			 pushi 0x00
    			 push servoMode1
    			 push servoAddr
    			 pushi servoInit_a0
    			 jmp wi2c1
     servoInit_a0: pop servoInit_RtnCode
              push servoInit_RtnCode
    			 jz servoInit_a0_1
    			 push servoInit_RtnCode //error
    			 out
    			 halt
    			 pushi 11
    			 jmp servoInit_rtn
     servoInit_a0_1: pushi servoMode1Val
    			 push servoMode1
    			 push servoAddr
    			 pushi servoInit_a1
    			 jmp ri2c1                        // read current value of the mode-1 register
     servoInit_a1: pop servoInit_RtnCode
              push servoInit_RtnCode
              jz servoInit_a1_1
              push servoInit_RtnCode // error
    			 out
    			 halt
    			 pushi 1
    			 jmp servoInit_rtn
     servoInit_a1_1: push servoMode1Val
    			 pushi 0x7f
    			 band
    			 pushi 0x10
    			 bor
    			 push servoMode1
    			 push servoAddr
    			 pushi servoInit_a2
    			 jmp wi2c1                      // set the sleep mode on, restart disabled     40> 00+ 10+
     servoInit_a2: pop servoInit_RtnCode
              push servoInit_RtnCode
              jz servoInit_a2_1
              push servoInit_RtnCode // error 
    			 out
    			 halt
    			 pushi 2
    			 jmp servoInit_rtn
     servoInit_a2_1: pushi 0x70
    			 push servoPreScale
    			 push servoAddr
    			 pushi servoInit_a3
    			 jmp wi2c1                    // set the pwm frequency prescale register   40> fe+ 70+
     servoInit_a3: pop servoInit_RtnCode
              push servoInit_RtnCode
              jz servoInit_a3_1
              push servoInit_RtnCode // error
    			 out
    			 halt
    			 pushi 3
    			 jmp servoInit_rtn
     servoInit_a3_1:  push servoMode1Val
    			 push servoMode1
    			 push servoAddr
    			 pushi servoInit_a4
    			 jmp wi2c1                   // recover the mode-1 register, .... wake up.  40> 00+ 00+ 
     servoInit_a4: pop servoInit_RtnCode
              push servoInit_RtnCode
              jz servoInit_a4_1
              push servoInit_RtnCode // error
    			 out
    			 halt
    			 pushi 4
    			 jmp servoInit_rtn
     servoInit_a4_1: pushi 0x000f
    			 pushi servoInit_a5
    			 jmp waitLoop
     servoInit_a5: pop servoInit_RtnCode
    //          pushi 5
    //			 out
    //         halt
              push servoMode1Val
    			 pushi 0x00a1
    			 bor
    			 push servoMode1
              push servoAddr
    			 pushi servoInit_a6
    			 jmp wi2c1               // set the mode-1 register to incremental mode.   40> 00+ a1+
      servoInit_a6: pop servoInit_RtnCode
             push servoInit_RtnCode
              jz servoInit_a6_1
              push servoInit_RtnCode // error 
    			 out
    			 halt
    			 pushi 6
    			 jmp servoInit_rtn
     servoInit_a6_1:  pushi 0
     servoInit_rtn: 0x0000	//return
     servoInit_jmp: 0x4000
     servoAddr: 0x0040
     servoMode1: 0x0000
     servoMode1Val: 0x0000
     servoPreScale: 0x00fe 
     servoCh0: 0x0006
     servoCh1: 0x000a
     servoMin: 0x0096 // (150)10
     servoMax: 0x0258 // (600)10
     servoCen: 0x0177 //(375)10
     servoInitPrescale: 0xff8f // prescale = - 25000000/(4096*60*0.9) = 0xFF8F
     servoInit_RtnCode: 0x0000
    //
    // getLight
    //   get light strength value from the i2c light sensor, grove
    //    arg 0: return address, arg 1: address for the received value
     getLight: push getLight_jmp
    			  bor
               pop getLight_rtn 
    			  pop getLight_valAddr
    			  PUSHI getLight_rtnval  // push arg1... the address for receiving the result(temprature)
               PUSH lightReadReg     // push the register no. 0
               push lightAddr       // push the I2C light sensor address, 0x4b
               pushi getLight_a0          // push the return address
               JMP ri2c1    // call the ri2c1 ... read 1 byte data from the i2c device, 
    //
     getLight_a0:  pop getLight_rtncode
               PUSH getLight_rtnval  // push arg1... the i2c slave Addr
               OUT 
    			  push getLight_valAddr
    			  push getLight_rtnval
    			  st
    			  pushi 1
     getLight_rtn:   0x0000           // 
     getLight_jmp: 0x4000
     getLight_rtncode:  0x0000
     getLight_rtnval: 0x0000
     getLight_valAddr: 0x0000
     lightReadReg: 0x008d   // read 1 byte from the register d, IR+visible
     lightAddr: 0x0029   //  grove i2c light sensor
    //
    // waitLoop
    //   wait for the arg1 times
    //   arg0: return address, arg1: repeat times
     waitLoop: push waitLoop_jmp
               bor
    			  pop waitLoop_rtn 
    			  pop waitLoop_times
     waitLoop_a0:  push waitLoop_times 
    			  pushi 1
    			  sub
    			  pop waitLoop_times
    			  push waitLoop_times
    			  jnz waitLoop_a0
    			  pushi 0
     waitLoop_rtn:	 0x0000
     waitLoop_jmp: 0x4000
     waitLoop_times: 0x000
    //
    //
    //
    // 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_a1    // push the return address
               JMP SubI2C1      // call the subroutine
    //
     wi2c1_a1: push wi2c1_addr
               pushi 1
               shl                   // make the i2c device address with the write flag
    //
               pushi wi2c1_a2
               jmp si2c1
    //
     wi2c1_a2: PUSHI i2cRAck // push arg1 .... read the ack
               PUSHI wi2c1_a3     //
               JMP SubI2C1    // call the subroutine
    //
     wi2c1_a3: in // input the ack
               pushi 0x01
    			  band
    			  jz wi2c1_a3_1
    			  pushi 1           // error to read the ack of the i2c address
    			  jmp wi2c1_err
     wi2c1_a3_1: push wi2c1_reg
               pushi wi2c1_a4
               jmp si2c1
    //
     wi2c1_a4: PUSHI i2cRAck // push arg1 .... read the ack
               PUSHI wi2c1_a5     //
               JMP SubI2C1    // call the subroutine
    //
     wi2c1_a5: in // input the ack
               pushi 0x01
    			  band
    			  jz wi2c1_a5_1
    			  pushi 2           // error to read the ack of the i2c register no.
    			  jmp wi2c1_err
     wi2c1_a5_1: push  wi2c1_val
               pushi wi2c1_a6
               jmp si2c1
    //
     wi2c1_a6: PUSHI i2cRAck // push arg1 .... read the ack
               PUSHI wi2c1_a7     //
               JMP SubI2C1    // call the subroutine
    //
     wi2c1_a7: in // input the ack
               pushi 0x01 
    			  band
    			  jz wi2c1_a7_1
    			  pushi 3           // error to read the ack of the i2c register val.
    			  jmp wi2c1_err
     wi2c1_a7_1: PUSHI i2cStop  // push arg1 .... write the ack
               PUSHI wi2c1_a8     // push the return address
               JMP SubI2C1    // call the subroutine
    //
     wi2c1_a8: pushI 0          
     wi2c1_rtn: jmp 0x000            // return
     wi2c1_err: pop wi2c1_ercode
               PUSHI i2cStop  // push arg1 .... write the ack
               PUSHI wi2c1_a9     // push the return address
               JMP SubI2C1    // call the subroutine
     wi2c1_a9: push wi2c1_ercode
               jmp wi2c1_rtn
     wi2c1_jmp: 0x4000
     wi2c1_addr: 0x0000
     wi2c1_reg: 0x0000
     wi2c1_val: 0x0000
     wi2c1\ercode: 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_a1    // push the return address
               JMP SubI2C1       // call the subroutine
    //
     wi2c2_a1: push wi2c2_addr
               pushi 1
               shl                   // make the i2c device address with the write flag
               pop wi2c2_waddr
    //
               pushi wi2c2_a2
               jmp si2c1
    //
     wi2c2_a2: PUSHI i2cRAck // push arg1 .... read the ack
               PUSHI wi2c2_a3     //
               JMP SubI2C1    // call the subroutine
    //
     wi2c2_a3: in // input the ack
               pushi 0x01 
    			  band
    			  jz wi2c2_a3_1
    			  pushi 1           // error to read the ack of the i2c address
    			  jmp wi2c2_err
     wi2c2_a3_1: push  wi2c2_reg
               pushi wi2c2_a4
               jmp si2c1
    //
     wi2c2_a4: PUSHI i2cRAck // push arg1 .... read the ack
               PUSHI wi2c2_a5     //
               JMP SubI2C1    // call the subroutine
    //
    wi2c2_a5:  in // input the ack
               pushi 0x01 
    			  band
    			  jz wi2c2_a5_1
    			  pushi 2           // error to read the ack of the i2c register no.
    			  jmp wi2c2_err
    wi2c_a5_1: push  wi2c2_val
               pushi 0x00ff
               band
               pushi wi2c2_a6
               jmp si2c1
    //
     wi2c2_a6: PUSHI i2cRAck // push arg1 .... read the ack
               PUSHI wi2c2_a7     //
               JMP SubI2C1    // call the subroutine
    //
     wi2c2_a7: in // input the ack
               pushi 0x01 
    			  band
    			  jz wi2c2_a7_1
    			  pushi 3           // error to read the ack of the i2c register no.
    			  jmp wi2c2_err
     wi2c2_a7_1: push  wi2c2_val
               pushi 8
               shr
               pushi wi2c2_a8
               jmp si2c1
    //
     wi2c2_a8: PUSHI i2cRAck // push arg1 .... read the ack
               PUSHI wi2c2_a9     //
               JMP SubI2C1    // call the subroutine
    //
     wi2c2_a9: in // input the ack
               pushi 0x01
    			  band
    			  jz wi2c2_a9_1
    			  pushi 4           // error to read the ack of the i2c register no.
    			  jmp wi2c2_err
     wi2c2_a9_1: PUSHI i2cStop  // push arg1 .... write the ack
               PUSHI wi2c2_a10     // push the return address
               JMP SubI2C1    // call the subroutine
    //
     wi2c2_a10: pushI 0          
     wi2c2_rtn:  jmp  0x000           // return
     wi2c2_err: pop wi2c2_ercode
               PUSHI i2cStop  // push arg1 .... write the ack
               PUSHI wi2c2_a11     // push the return address
               JMP SubI2C1    // call the subroutine
     wi2c2_a11: push wi2c2_ercode
               jmp wi2c2_rtn
     wi2c2_jmp:  0x4000
     wi2c2_addr: 0x0000
     wi2c2_reg:  0x0000
     wi2c2_val:  0x0000
     wi2c2_ercode: 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_val2     // save the 1st value which will be assiinged to the destination registers.
               pop wi2c4_val1     // save the 2nd value which will be assiinged to the destination register2.
    //
               PUSHI i2cStart    // push arg1... the i2c slave Addr
               PUSHI wi2c4_a1    // push the return address
               JMP SubI2C1       // call the subroutine
    //
     wi2c4_a1: push wi2c4_addr
               pushi 1
               shl                   // make the i2c device address with the write flag
               pushi wi2c4_a2
               jmp si2c1
    //
     wi2c4_a2: PUSHI i2cRAck // push arg1 .... read the ack
               PUSHI wi2c4_a3     //
               JMP SubI2C1    // call the subroutine
    //
     wi2c4_a3: in // input the ack
               pushi 0x01 
    			  band
    			  jz wi2c4_a3_1
    			  pushi 1           // error to read the ack of the i2c address
    			  jmp wi2c4_err
     wi2c4_a3_1:  push  wi2c4_reg
               pushi wi2c4_a4
               jmp si2c1
    //
     wi2c4_a4: PUSHI i2cRAck // push arg1 .... read the ack
               PUSHI wi2c4_a5     //
               JMP SubI2C1    // call the subroutine
    //
     wi2c4_a5: in // input the ack
               pushi 0x01 
    			  band
    			  jz wi2c4_a5_1
    			  pushi 2            // error to read the ack of the i2c register no.
    			  jmp wi2c4_err
     wi2c4_a5_1:  push  wi2c4_val1
               pushi 0x00ff
               band
               pushi wi2c4_a6
               jmp si2c1
    //
     wi2c4_a6: PUSHI i2cRAck // push arg1 .... read the ack
               PUSHI wi2c4_a7     //
               JMP SubI2C1    // call the subroutine
    //
     wi2c4_a7: in // input the ack
               pushi 0x01 
    			  band
    			  jz wi2c4_a7_1
    			  pushi 3           // error to read the ack of the lsb of the val1
    			  jmp wi2c4_err
     wi2c4_a7_1: push  wi2c4_val1
               pushi 8
               shr
               pushi wi2c4_a8
               jmp si2c1
    //
     wi2c4_a8: PUSHI i2cRAck // push arg1 .... read the ack
               PUSHI wi2c4_a9     //
               JMP SubI2C1    // call the subroutine
    //
     wi2c4_a9: in // input the ack
               pushi 0x01 
    			  band
    			  jz wi2c4_a9_1
    			  pushi 4            // error to read the ack of the msb of the val1
    			  jmp wi2c4_err
     wi2c4_a9_1: push  wi2c4_val2
               pushi 0x00ff
              band
              pushi wi2c4_a10
              jmp si2c1
    //
     wi2c4_a10: PUSHI i2cRAck // push arg1 .... read the ack
               PUSHI wi2c4_a11     //
               JMP SubI2C1    // call the subroutine
    //
     wi2c4_a11: in // input the ack
               pushi 0x01 
    			  band
    			  jz wi2c4_a11_1
    			  pushi 5            // error to read the ack of the lsb of the val1
    			  jmp wi2c4_err
     wi2c4_a11_1:  push  wi2c4_val2
               pushi 8
               shr
               pushi wi2c4_a12
               jmp si2c1
    //
     wi2c4_a12: PUSHI i2cRAck // push arg1 .... read the ack
               PUSHI wi2c4_a13     //
               JMP SubI2C1    // call the subroutine
    //
     wi2c4_a13: in // input the ack
               pushi 0x01
    			  band
    			  jz wi2c4_a13_1
    			  pushi 6            // error to read the ack of the lsb of the val1
    			  jmp wi2c4_err
     wi2c4_a13_1: PUSHI i2cStop  // push arg1 .... write the ack
               PUSHI wi2c4_a14     // push the return address
               JMP SubI2C1    // call the subroutine
    //
     wi2c4_a14: pushI 0          
     wi2c4_rtn: jmp 0x000            // return
     wi2c4_err: pop wi2c4_ercode
               PUSHI i2cStop  // push arg1 .... write the ack
               PUSHI wi2c4_a15     // push the return address
               JMP SubI2C1    // call the subroutine
     wi2c4_a15: push wi2c4_ercode
               jmp wi2c4_rtn 
     wi2c4_jmp:  0x4000
     wi2c4_addr: 0x0000
     wi2c4_reg:  0x0000
     wi2c4_val1: 0x0000
     wi2c4_val2: 0x0000
     wi2c4_ercode: 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: in // input the ack
               pushi 0x01 
    			  band
    			  jz ri2c1_a3_1
    			  pushi 1           // error to read the ack of the i2c address
    			  jmp ri2c1_err
     ri2c1_a3_1: 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: in // input the ack
               pushi 0x01 
    			  band
    			  jz ri2c1_a5_1
    			  pushi 2           // error to read the ack of the i2c register no.
    			  jmp ri2c1_err
     ri2c1_a5_1: 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: in // input the ack
               pushi 0x01 
    			  band
    			  jz ri2c1_a8_1
    			  pushi 3           // error to read the ack of the i2c address again.
    			  jmp ri2c1_err
     ri2c1_a8_1: 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 0          
     ri2c1_rtn:  jmp  0x000           // return
     ri2c1_err: pop ri2c1_ercode
               PUSHI i2cStop  // push arg1 .... write the ack
               PUSHI ri2c1_a12     // push the return address
               JMP SubI2C1    // call the subroutine
     ri2c1_a12: push ri2c1_ercode
               jmp ri2c1_rtn 
     ri2c1_jmp:  0x4000
     ri2c1_addr: 0x0000
     ri2c1_reg: 0x0000
     ri2c1_raddr: 0x0000
     ri2c1_ercode: 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: in // input the ack
               pushi 0x01 
    			  band
    			  jz ri2c2_a3_1
    			  pushi 1           // error to read the ack of the i2c address
    			  jmp ri2c2_err
     ri2c2_a3_1: 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: in // input the ack
               pushi 0x01 
    			  band
    			  jz ri2c2_a5_1
    			  pushi 2           // error to read the ack of the i2c register no.
    			  jmp ri2c2_err
    ri2c2_a5_1: 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: in // input the ack
               pushi 0x01 
    			  band
    			  jz ri2c2_a8_1
    			  pushi 3           // error to read the ack of the i2c address again.
    			  jmp ri2c2_err
     ri2c2_a8_1: 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 0   // no error          
     ri2c2_rtn:  jmp  0x000           // return
     ri2c2_err: pop ri2c2_ercode
               PUSHI i2cStop  // push arg1 .... write the ack
               PUSHI ri2c2_a14     // push the return address
               JMP SubI2C1    // call the subroutine
     ri2c2_a14: push ri2c2_ercode
               jmp ri2c2_rtn  
     ri2c2_jmp:  0x4000
     ri2c2_addr: 0x0000
     ri2c2_reg: 0x0000
     ri2c2_raddr: 0x0000
     ri2c2_val1:  0x0000
     ri2c2_ercode: 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   
    
    */ [#df388c48]
    
    mem[12'h000]=16'h1002 ; //             pushi main_a0
    mem[12'h001]=16'h4051 ; //             jmp servoInit
    mem[12'h002]=16'h5005 ; //main_a0:  jz main_a0_1
    mem[12'h003]=16'h1000 ; //             pushi 0x00
    mem[12'h004]=16'he000 ; //             out
    mem[12'h005]=16'h1000 ; //main_a0_1:  pushi 0
    mem[12'h006]=16'h20b7 ; //             push servoCen
    mem[12'h007]=16'h20b3 ; //             push servoCh0
    mem[12'h008]=16'h20af ; //             push servoAddr
    mem[12'h009]=16'h100b ; //             pushi main_a1
    mem[12'h00a]=16'h416e ; //             jmp wi2c4           
    mem[12'h00b]=16'h500e ; //main_a1:  jz main_a1_1
    mem[12'h00c]=16'h1001 ; //             pushi 0x01
    mem[12'h00d]=16'he000 ; //             out
    mem[12'h00e]=16'h100f ; //main_a1_1:  pushi 0x000f
    mem[12'h00f]=16'h1011 ; //             pushi main_a2
    mem[12'h010]=16'h40d1 ; //             jmp waitLoop        
    mem[12'h011]=16'h5014 ; //main_a2:  jz main_a2_1
    mem[12'h012]=16'h1002 ; //             pushi 0x02
    mem[12'h013]=16'he000 ; //             out
    mem[12'h014]=16'h1000 ; //main_a2_1:  pushi 0
    mem[12'h015]=16'h20b5 ; //             push servoMin
    mem[12'h016]=16'h20b3 ; //             push servoCh0
    mem[12'h017]=16'h20af ; //             push servoAddr
    mem[12'h018]=16'h101a ; //             pushi main_a3
    mem[12'h019]=16'h416e ; //             jmp wi2c4           
    mem[12'h01a]=16'h501d ; //main_a3:  jz main_a3_1
    mem[12'h01b]=16'h1003 ; //             pushi 0x03
    mem[12'h01c]=16'he000 ; //             out
    mem[12'h01d]=16'h100f ; //main_a3_1:  pushi 0x000f
    mem[12'h01e]=16'h1020 ; //             pushi main_a4       
    mem[12'h01f]=16'h40d1 ; //             jmp waitLoop
    mem[12'h020]=16'h5023 ; //main_a4:  jz main_a4_1
    mem[12'h021]=16'h1004 ; //             pushi 0x04
    mem[12'h022]=16'he000 ; //             out
    mem[12'h023]=16'h1000 ; //main_a4_1:  pushi 0
    mem[12'h024]=16'h20b7 ; //             push servoCen
    mem[12'h025]=16'h20b3 ; //             push servoCh0
    mem[12'h026]=16'h20af ; //             push servoAddr
    mem[12'h027]=16'h1029 ; //             pushi main_a5
    mem[12'h028]=16'h416e ; //             jmp wi2c4          
    mem[12'h029]=16'h502c ; //main_a5:  jz main_a5_1
    mem[12'h02a]=16'h1005 ; //             pushi 0x05
    mem[12'h02b]=16'he000 ; //             out
    mem[12'h02c]=16'h100f ; //main_a5_1:  pushi 0x000f
    mem[12'h02d]=16'h102f ; //             pushi main_a6
    mem[12'h02e]=16'h40d1 ; //             jmp waitLoop        
    mem[12'h02f]=16'h5033 ; //main_a6:  jz main_a6_1
    mem[12'h030]=16'h1006 ; //             pushi 0x06
    mem[12'h031]=16'he000 ; //             out
    mem[12'h032]=16'h0000 ; //             halt
    mem[12'h033]=16'h1000 ; //main_a6_1:  pushi 0
    mem[12'h034]=16'h20b6 ; //             push servoMax
    mem[12'h035]=16'h20b3 ; //             push servoCh0
    mem[12'h036]=16'h20af ; //             push servoAddr
    mem[12'h037]=16'h1039 ; //             pushi main_a7
    mem[12'h038]=16'h416e ; //             jmp wi2c4           
    mem[12'h039]=16'h503c ; //main_a7:  jz main_a7_1
    mem[12'h03a]=16'h1007 ; //             pushi 0x07
    mem[12'h03b]=16'he000 ; //             out
    mem[12'h03c]=16'h100f ; //main_a7_1:  pushi 0x000f
    mem[12'h03d]=16'h103f ; //             pushi main_a8
    mem[12'h03e]=16'h40d1 ; //             jmp waitLoop        
    mem[12'h03f]=16'h5043 ; //main_a8:  jz main_a8_1
    mem[12'h040]=16'h1008 ; //             pushi 0x08
    mem[12'h041]=16'he000 ; //             out
    mem[12'h042]=16'h0000 ; //             halt
    mem[12'h043]=16'h1000 ; //main_a8_1:  pushi 0
    mem[12'h044]=16'h20b7 ; //             push servoCen
    mem[12'h045]=16'h20b3 ; //             push servoCh0
    mem[12'h046]=16'h20af ; //             push servoAddr
    mem[12'h047]=16'h1049 ; //             pushi main_a9
    mem[12'h048]=16'h416e ; //             jmp wi2c4           
    mem[12'h049]=16'h504d ; //main_a9:  jz main_a9_1
    mem[12'h04a]=16'h1009 ; //             pushi 0x09
    mem[12'h04b]=16'he000 ; //             out
    mem[12'h04c]=16'h0000 ; //             halt 
    mem[12'h04d]=16'h1010 ; //main_a9_1:  pushi 0x10
    mem[12'h04e]=16'he000 ; //             out
    mem[12'h04f]=16'h0000 ; //             halt                
    mem[12'h050]=16'h0000 ; //main_rcode:  0x0000
    mem[12'h051]=16'h20ae ; //servoInit:  push servoInit_jmp
    mem[12'h052]=16'hf006 ; //             bor
    mem[12'h053]=16'h30ad ; //             pop servoInit_rtn
    mem[12'h054]=16'h1000 ; //             pushi 0x00
    mem[12'h055]=16'h20b0 ; //             push servoMode1
    mem[12'h056]=16'h20af ; //             push servoAddr
    mem[12'h057]=16'h1059 ; //             pushi servoInit_a0
    mem[12'h058]=16'h40df ; //             jmp wi2c1
    mem[12'h059]=16'h30b9 ; //servoInit_a0:  pop servoInit_RtnCode
    mem[12'h05a]=16'h20b9 ; //             push servoInit_RtnCode
    mem[12'h05b]=16'h5061 ; //             jz servoInit_a0_1
    mem[12'h05c]=16'h20b9 ; //             push servoInit_RtnCode 
    mem[12'h05d]=16'he000 ; //             out
    mem[12'h05e]=16'h0000 ; //             halt
    mem[12'h05f]=16'h1011 ; //             pushi 11
    mem[12'h060]=16'h40ad ; //             jmp servoInit_rtn
    mem[12'h061]=16'h10b1 ; //servoInit_a0_1:  pushi servoMode1Val
    mem[12'h062]=16'h20b0 ; //             push servoMode1
    mem[12'h063]=16'h20af ; //             push servoAddr
    mem[12'h064]=16'h1066 ; //             pushi servoInit_a1
    mem[12'h065]=16'h4200 ; //             jmp ri2c1                        
    mem[12'h066]=16'h30b9 ; //servoInit_a1:  pop servoInit_RtnCode
    mem[12'h067]=16'h20b9 ; //             push servoInit_RtnCode
    mem[12'h068]=16'h506e ; //             jz servoInit_a1_1
    mem[12'h069]=16'h20b9 ; //             push servoInit_RtnCode 
    mem[12'h06a]=16'he000 ; //             out
    mem[12'h06b]=16'h0000 ; //             halt
    mem[12'h06c]=16'h1001 ; //             pushi 1
    mem[12'h06d]=16'h40ad ; //             jmp servoInit_rtn
    mem[12'h06e]=16'h20b1 ; //servoInit_a1_1:  push servoMode1Val
    mem[12'h06f]=16'h107f ; //             pushi 0x7f
    mem[12'h070]=16'hf005 ; //             band
    mem[12'h071]=16'h1010 ; //             pushi 0x10
    mem[12'h072]=16'hf006 ; //             bor
    mem[12'h073]=16'h20b0 ; //             push servoMode1
    mem[12'h074]=16'h20af ; //             push servoAddr
    mem[12'h075]=16'h1077 ; //             pushi servoInit_a2
    mem[12'h076]=16'h40df ; //             jmp wi2c1                      
    mem[12'h077]=16'h30b9 ; //servoInit_a2:  pop servoInit_RtnCode
    mem[12'h078]=16'h20b9 ; //             push servoInit_RtnCode
    mem[12'h079]=16'h507f ; //             jz servoInit_a2_1
    mem[12'h07a]=16'h20b9 ; //             push servoInit_RtnCode 
    mem[12'h07b]=16'he000 ; //             out
    mem[12'h07c]=16'h0000 ; //             halt
    mem[12'h07d]=16'h1002 ; //             pushi 2
    mem[12'h07e]=16'h40ad ; //             jmp servoInit_rtn
    mem[12'h07f]=16'h1070 ; //servoInit_a2_1:  pushi 0x70
    mem[12'h080]=16'h20b2 ; //             push servoPreScale
    mem[12'h081]=16'h20af ; //             push servoAddr
    mem[12'h082]=16'h1084 ; //             pushi servoInit_a3
    mem[12'h083]=16'h40df ; //             jmp wi2c1                    
    mem[12'h084]=16'h30b9 ; //servoInit_a3:  pop servoInit_RtnCode
    mem[12'h085]=16'h20b9 ; //             push servoInit_RtnCode
    mem[12'h086]=16'h508c ; //             jz servoInit_a3_1
    mem[12'h087]=16'h20b9 ; //             push servoInit_RtnCode 
    mem[12'h088]=16'he000 ; //             out
    mem[12'h089]=16'h0000 ; //             halt
    mem[12'h08a]=16'h1003 ; //             pushi 3
    mem[12'h08b]=16'h40ad ; //             jmp servoInit_rtn
    mem[12'h08c]=16'h20b1 ; //servoInit_a3_1:  push servoMode1Val
    mem[12'h08d]=16'h20b0 ; //             push servoMode1
    mem[12'h08e]=16'h20af ; //             push servoAddr
    mem[12'h08f]=16'h1091 ; //             pushi servoInit_a4
    mem[12'h090]=16'h40df ; //             jmp wi2c1                   
    mem[12'h091]=16'h30b9 ; //servoInit_a4:  pop servoInit_RtnCode
    mem[12'h092]=16'h20b9 ; //             push servoInit_RtnCode
    mem[12'h093]=16'h5099 ; //             jz servoInit_a4_1
    mem[12'h094]=16'h20b9 ; //             push servoInit_RtnCode 
    mem[12'h095]=16'he000 ; //             out
    mem[12'h096]=16'h0000 ; //             halt
    mem[12'h097]=16'h1004 ; //             pushi 4
    mem[12'h098]=16'h40ad ; //             jmp servoInit_rtn
    mem[12'h099]=16'h100f ; //servoInit_a4_1:  pushi 0x000f
    mem[12'h09a]=16'h109c ; //             pushi servoInit_a5
    mem[12'h09b]=16'h40d1 ; //             jmp waitLoop
    mem[12'h09c]=16'h30b9 ; //servoInit_a5:  pop servoInit_RtnCode
    mem[12'h09d]=16'h20b1 ; //             push servoMode1Val
    mem[12'h09e]=16'h10a1 ; //             pushi 0x00a1
    mem[12'h09f]=16'hf006 ; //             bor
    mem[12'h0a0]=16'h20b0 ; //             push servoMode1
    mem[12'h0a1]=16'h20af ; //             push servoAddr
    mem[12'h0a2]=16'h10a4 ; //             pushi servoInit_a6
    mem[12'h0a3]=16'h40df ; //             jmp wi2c1               
    mem[12'h0a4]=16'h30b9 ; //servoInit_a6:  pop servoInit_RtnCode
    mem[12'h0a5]=16'h20b9 ; //             push servoInit_RtnCode
    mem[12'h0a6]=16'h50ac ; //             jz servoInit_a6_1
    mem[12'h0a7]=16'h20b9 ; //             push servoInit_RtnCode 
    mem[12'h0a8]=16'he000 ; //             out
    mem[12'h0a9]=16'h0000 ; //             halt
    mem[12'h0aa]=16'h1006 ; //             pushi 6
    mem[12'h0ab]=16'h40ad ; //             jmp servoInit_rtn
    mem[12'h0ac]=16'h1000 ; //servoInit_a6_1:  pushi 0
    mem[12'h0ad]=16'h0000 ; //servoInit_rtn:  0x0000 
    mem[12'h0ae]=16'h4000 ; //servoInit_jmp:  0x4000
    mem[12'h0af]=16'h0040 ; //servoAddr:  0x0040
    mem[12'h0b0]=16'h0000 ; //servoMode1:  0x0000
    mem[12'h0b1]=16'h0000 ; //servoMode1Val:  0x0000
    mem[12'h0b2]=16'h00fe ; //servoPreScale:  0x00fe 
    mem[12'h0b3]=16'h0006 ; //servoCh0:  0x0006
    mem[12'h0b4]=16'h000a ; //servoCh1:  0x000a
    mem[12'h0b5]=16'h0096 ; //servoMin:  0x0096 
    mem[12'h0b6]=16'h0258 ; //servoMax:  0x0258 
    mem[12'h0b7]=16'h0177 ; //servoCen:  0x0177 
    mem[12'h0b8]=16'hff8f ; //servoInitPrescale:  0xff8f 
    mem[12'h0b9]=16'h0000 ; //servoInit_RtnCode:  0x0000
    mem[12'h0ba]=16'h20cb ; //getLight:  push getLight_jmp
    mem[12'h0bb]=16'hf006 ; //             bor
    mem[12'h0bc]=16'h30ca ; //             pop getLight_rtn
    mem[12'h0bd]=16'h30ce ; //             pop getLight_valAddr
    mem[12'h0be]=16'h10cd ; //             PUSHI getLight_rtnval  
    mem[12'h0bf]=16'h20cf ; //             PUSH lightReadReg     
    mem[12'h0c0]=16'h20d0 ; //             push lightAddr       
    mem[12'h0c1]=16'h10c3 ; //             pushi getLight_a0          
    mem[12'h0c2]=16'h4200 ; //             JMP ri2c1    
    mem[12'h0c3]=16'h30cc ; //getLight_a0:  pop getLight_rtncode
    mem[12'h0c4]=16'h20cd ; //             PUSH getLight_rtnval  
    mem[12'h0c5]=16'he000 ; //             OUT
    mem[12'h0c6]=16'h20ce ; //             push getLight_valAddr
    mem[12'h0c7]=16'h20cd ; //             push getLight_rtnval
    mem[12'h0c8]=16'h8000 ; //             st
    mem[12'h0c9]=16'h1001 ; //             pushi 1
    mem[12'h0ca]=16'h0000 ; //getLight_rtn:  0x0000           
    mem[12'h0cb]=16'h4000 ; //getLight_jmp:  0x4000
    mem[12'h0cc]=16'h0000 ; //getLight_rtncode:  0x0000
    mem[12'h0cd]=16'h0000 ; //getLight_rtnval:  0x0000
    mem[12'h0ce]=16'h0000 ; //getLight_valAddr:  0x0000
    mem[12'h0cf]=16'h008d ; //lightReadReg:  0x008d   
    mem[12'h0d0]=16'h0029 ; //lightAddr:  0x0029   
    mem[12'h0d1]=16'h20dd ; //waitLoop:  push waitLoop_jmp
    mem[12'h0d2]=16'hf006 ; //             bor
    mem[12'h0d3]=16'h30dc ; //             pop waitLoop_rtn
    mem[12'h0d4]=16'h30de ; //             pop waitLoop_times
    mem[12'h0d5]=16'h20de ; //waitLoop_a0:  push waitLoop_times
    mem[12'h0d6]=16'h1001 ; //             pushi 1
    mem[12'h0d7]=16'hf001 ; //             sub
    mem[12'h0d8]=16'h30de ; //             pop waitLoop_times
    mem[12'h0d9]=16'h20de ; //             push waitLoop_times
    mem[12'h0da]=16'h60d5 ; //             jnz waitLoop_a0
    mem[12'h0db]=16'h1000 ; //             pushi 0
    mem[12'h0dc]=16'h0000 ; //waitLoop_rtn:  0x0000
    mem[12'h0dd]=16'h4000 ; //waitLoop_jmp:  0x4000
    mem[12'h0de]=16'h0000 ; //waitLoop_times:  0x000
    mem[12'h0df]=16'h2119 ; //wi2c1:  PUSH wi2c1_jmp    
    mem[12'h0e0]=16'hf006 ; //             BOR               
    mem[12'h0e1]=16'h3112 ; //             POP wi2c1_rtn     
    mem[12'h0e2]=16'h311a ; //             POP wi2c1_addr    
    mem[12'h0e3]=16'h311b ; //             pop wi2c1_reg     
    mem[12'h0e4]=16'h311c ; //             pop wi2c1_val     
    mem[12'h0e5]=16'h12cb ; //             PUSHI i2cStart    
    mem[12'h0e6]=16'h10e8 ; //             PUSHI wi2c1_a1    
    mem[12'h0e7]=16'h42ab ; //             JMP SubI2C1      
    mem[12'h0e8]=16'h211a ; //wi2c1_a1:  push wi2c1_addr
    mem[12'h0e9]=16'h1001 ; //             pushi 1
    mem[12'h0ea]=16'hf003 ; //             shl                   
    mem[12'h0eb]=16'h10ed ; //             pushi wi2c1_a2
    mem[12'h0ec]=16'h41db ; //             jmp si2c1
    mem[12'h0ed]=16'h12d8 ; //wi2c1_a2:  PUSHI i2cRAck 
    mem[12'h0ee]=16'h10f0 ; //             PUSHI wi2c1_a3     
    mem[12'h0ef]=16'h42ab ; //             JMP SubI2C1    
    mem[12'h0f0]=16'hd000 ; //wi2c1_a3:  in 
    mem[12'h0f1]=16'h1001 ; //             pushi 0x01
    mem[12'h0f2]=16'hf005 ; //             band
    mem[12'h0f3]=16'h50f6 ; //             jz wi2c1_a3_1
    mem[12'h0f4]=16'h1001 ; //             pushi 1           
    mem[12'h0f5]=16'h4113 ; //             jmp wi2c1_err
    mem[12'h0f6]=16'h211b ; //wi2c1_a3_1:  push wi2c1_reg
    mem[12'h0f7]=16'h10f9 ; //             pushi wi2c1_a4
    mem[12'h0f8]=16'h41db ; //             jmp si2c1
    mem[12'h0f9]=16'h12d8 ; //wi2c1_a4:  PUSHI i2cRAck 
    mem[12'h0fa]=16'h10fc ; //             PUSHI wi2c1_a5     
    mem[12'h0fb]=16'h42ab ; //             JMP SubI2C1    
    mem[12'h0fc]=16'hd000 ; //wi2c1_a5:  in 
    mem[12'h0fd]=16'h1001 ; //             pushi 0x01
    mem[12'h0fe]=16'hf005 ; //             band
    mem[12'h0ff]=16'h5102 ; //             jz wi2c1_a5_1
    mem[12'h100]=16'h1002 ; //             pushi 2           
    mem[12'h101]=16'h4113 ; //             jmp wi2c1_err
    mem[12'h102]=16'h211c ; //wi2c1_a5_1:  push  wi2c1_val
    mem[12'h103]=16'h1105 ; //             pushi wi2c1_a6
    mem[12'h104]=16'h41db ; //             jmp si2c1
    mem[12'h105]=16'h12d8 ; //wi2c1_a6:  PUSHI i2cRAck 
    mem[12'h106]=16'h1108 ; //             PUSHI wi2c1_a7     
    mem[12'h107]=16'h42ab ; //             JMP SubI2C1    
    mem[12'h108]=16'hd000 ; //wi2c1_a7:  in 
    mem[12'h109]=16'h1001 ; //             pushi 0x01
    mem[12'h10a]=16'hf005 ; //             band
    mem[12'h10b]=16'h510e ; //             jz wi2c1_a7_1
    mem[12'h10c]=16'h1003 ; //             pushi 3           
    mem[12'h10d]=16'h4113 ; //             jmp wi2c1_err
    mem[12'h10e]=16'h12e4 ; //wi2c1_a7_1:  PUSHI i2cStop  
    mem[12'h10f]=16'h1111 ; //             PUSHI wi2c1_a8     
    mem[12'h110]=16'h42ab ; //             JMP SubI2C1    
    mem[12'h111]=16'h1000 ; //wi2c1_a8:  pushI 0          
    mem[12'h112]=16'h4000 ; //wi2c1_rtn:  jmp 0x000            
    mem[12'h113]=16'h3000 ; //wi2c1_err:  pop wi2c1_ercode
    mem[12'h114]=16'h12e4 ; //             PUSHI i2cStop  
    mem[12'h115]=16'h1117 ; //             PUSHI wi2c1_a9     
    mem[12'h116]=16'h42ab ; //             JMP SubI2C1    
    mem[12'h117]=16'h2000 ; //wi2c1_a9:  push wi2c1_ercode
    mem[12'h118]=16'h4112 ; //             jmp wi2c1_rtn
    mem[12'h119]=16'h4000 ; //wi2c1_jmp:  0x4000
    mem[12'h11a]=16'h0000 ; //wi2c1_addr:  0x0000
    mem[12'h11b]=16'h0000 ; //wi2c1_reg:  0x0000
    mem[12'h11c]=16'h0000 ; //wi2c1_val:  0x0000
    mem[12'h11d]=16'h0000 ; //wi2c1\ercode:  0x0000
    mem[12'h11e]=16'h2169 ; //wi2c2:  PUSH wi2c2_jmp    
    mem[12'h11f]=16'hf006 ; //             BOR               
    mem[12'h120]=16'h3162 ; //             POP wi2c2_rtn     
    mem[12'h121]=16'h316a ; //             POP wi2c2_addr    
    mem[12'h122]=16'h316b ; //             pop wi2c2_reg     
    mem[12'h123]=16'h316c ; //             pop wi2c2_val     
    mem[12'h124]=16'h12cb ; //             PUSHI i2cStart    
    mem[12'h125]=16'h1127 ; //             PUSHI wi2c2_a1    
    mem[12'h126]=16'h42ab ; //             JMP SubI2C1       
    mem[12'h127]=16'h216a ; //wi2c2_a1:  push wi2c2_addr
    mem[12'h128]=16'h1001 ; //             pushi 1
    mem[12'h129]=16'hf003 ; //             shl                   
    mem[12'h12a]=16'h3000 ; //             pop wi2c2_waddr
    mem[12'h12b]=16'h112d ; //             pushi wi2c2_a2
    mem[12'h12c]=16'h41db ; //             jmp si2c1
    mem[12'h12d]=16'h12d8 ; //wi2c2_a2:  PUSHI i2cRAck 
    mem[12'h12e]=16'h1130 ; //             PUSHI wi2c2_a3     
    mem[12'h12f]=16'h42ab ; //             JMP SubI2C1    
    mem[12'h130]=16'hd000 ; //wi2c2_a3:  in 
    mem[12'h131]=16'h1001 ; //             pushi 0x01
    mem[12'h132]=16'hf005 ; //             band
    mem[12'h133]=16'h5136 ; //             jz wi2c2_a3_1
    mem[12'h134]=16'h1001 ; //             pushi 1           
    mem[12'h135]=16'h4163 ; //             jmp wi2c2_err
    mem[12'h136]=16'h216b ; //wi2c2_a3_1:  push  wi2c2_reg
    mem[12'h137]=16'h1139 ; //             pushi wi2c2_a4
    mem[12'h138]=16'h41db ; //             jmp si2c1
    mem[12'h139]=16'h12d8 ; //wi2c2_a4:  PUSHI i2cRAck 
    mem[12'h13a]=16'h113c ; //             PUSHI wi2c2_a5     
    mem[12'h13b]=16'h42ab ; //             JMP SubI2C1    
    mem[12'h13c]=16'hd000 ; //wi2c2_a5:  in 
    mem[12'h13d]=16'h1001 ; //             pushi 0x01
    mem[12'h13e]=16'hf005 ; //             band
    mem[12'h13f]=16'h5000 ; //             jz wi2c2_a5_1
    mem[12'h140]=16'h1002 ; //             pushi 2           
    mem[12'h141]=16'h4163 ; //             jmp wi2c2_err
    mem[12'h142]=16'h216c ; //wi2c_a5_1:  push  wi2c2_val
    mem[12'h143]=16'h10ff ; //             pushi 0x00ff
    mem[12'h144]=16'hf005 ; //             band
    mem[12'h145]=16'h1147 ; //             pushi wi2c2_a6
    mem[12'h146]=16'h41db ; //             jmp si2c1
    mem[12'h147]=16'h12d8 ; //wi2c2_a6:  PUSHI i2cRAck 
    mem[12'h148]=16'h114a ; //             PUSHI wi2c2_a7     
    mem[12'h149]=16'h42ab ; //             JMP SubI2C1    
    mem[12'h14a]=16'hd000 ; //wi2c2_a7:  in 
    mem[12'h14b]=16'h1001 ; //             pushi 0x01
    mem[12'h14c]=16'hf005 ; //             band
    mem[12'h14d]=16'h5150 ; //             jz wi2c2_a7_1
    mem[12'h14e]=16'h1003 ; //             pushi 3           
    mem[12'h14f]=16'h4163 ; //             jmp wi2c2_err
    mem[12'h150]=16'h216c ; //wi2c2_a7_1:  push  wi2c2_val
    mem[12'h151]=16'h1008 ; //             pushi 8
    mem[12'h152]=16'hf004 ; //             shr
    mem[12'h153]=16'h1155 ; //             pushi wi2c2_a8
    mem[12'h154]=16'h41db ; //             jmp si2c1
    mem[12'h155]=16'h12d8 ; //wi2c2_a8:  PUSHI i2cRAck 
    mem[12'h156]=16'h1158 ; //             PUSHI wi2c2_a9     
    mem[12'h157]=16'h42ab ; //             JMP SubI2C1    
    mem[12'h158]=16'hd000 ; //wi2c2_a9:  in 
    mem[12'h159]=16'h1001 ; //             pushi 0x01
    mem[12'h15a]=16'hf005 ; //             band
    mem[12'h15b]=16'h515e ; //             jz wi2c2_a9_1
    mem[12'h15c]=16'h1004 ; //             pushi 4           
    mem[12'h15d]=16'h4163 ; //             jmp wi2c2_err
    mem[12'h15e]=16'h12e4 ; //wi2c2_a9_1:  PUSHI i2cStop  
    mem[12'h15f]=16'h1161 ; //             PUSHI wi2c2_a10     
    mem[12'h160]=16'h42ab ; //             JMP SubI2C1    
    mem[12'h161]=16'h1000 ; //wi2c2_a10:  pushI 0          
    mem[12'h162]=16'h4000 ; //wi2c2_rtn:  jmp  0x000           
    mem[12'h163]=16'h316d ; //wi2c2_err:  pop wi2c2_ercode
    mem[12'h164]=16'h12e4 ; //             PUSHI i2cStop  
    mem[12'h165]=16'h1167 ; //             PUSHI wi2c2_a11     
    mem[12'h166]=16'h42ab ; //             JMP SubI2C1    
    mem[12'h167]=16'h216d ; //wi2c2_a11:  push wi2c2_ercode
    mem[12'h168]=16'h4162 ; //             jmp wi2c2_rtn
    mem[12'h169]=16'h4000 ; //wi2c2_jmp:  0x4000
    mem[12'h16a]=16'h0000 ; //wi2c2_addr:  0x0000
    mem[12'h16b]=16'h0000 ; //wi2c2_reg:  0x0000
    mem[12'h16c]=16'h0000 ; //wi2c2_val:  0x0000
    mem[12'h16d]=16'h0000 ; //wi2c2_ercode:  0x0000
    mem[12'h16e]=16'h21d5 ; //wi2c4:  PUSH wi2c4_jmp    
    mem[12'h16f]=16'hf006 ; //             BOR               
    mem[12'h170]=16'h31ce ; //             POP wi2c4_rtn     
    mem[12'h171]=16'h31d6 ; //             POP wi2c4_addr    
    mem[12'h172]=16'h31d7 ; //             pop wi2c4_reg     
    mem[12'h173]=16'h31d9 ; //             pop wi2c4_val2     
    mem[12'h174]=16'h31d8 ; //             pop wi2c4_val1     
    mem[12'h175]=16'h12cb ; //             PUSHI i2cStart    
    mem[12'h176]=16'h1178 ; //             PUSHI wi2c4_a1    
    mem[12'h177]=16'h42ab ; //             JMP SubI2C1       
    mem[12'h178]=16'h21d6 ; //wi2c4_a1:  push wi2c4_addr
    mem[12'h179]=16'h1001 ; //             pushi 1
    mem[12'h17a]=16'hf003 ; //             shl                   
    mem[12'h17b]=16'h117d ; //             pushi wi2c4_a2
    mem[12'h17c]=16'h41db ; //             jmp si2c1
    mem[12'h17d]=16'h12d8 ; //wi2c4_a2:  PUSHI i2cRAck 
    mem[12'h17e]=16'h1180 ; //             PUSHI wi2c4_a3     
    mem[12'h17f]=16'h42ab ; //             JMP SubI2C1    
    mem[12'h180]=16'hd000 ; //wi2c4_a3:  in 
    mem[12'h181]=16'h1001 ; //             pushi 0x01
    mem[12'h182]=16'hf005 ; //             band
    mem[12'h183]=16'h5186 ; //             jz wi2c4_a3_1
    mem[12'h184]=16'h1001 ; //             pushi 1           
    mem[12'h185]=16'h41cf ; //             jmp wi2c4_err
    mem[12'h186]=16'h21d7 ; //wi2c4_a3_1:  push  wi2c4_reg
    mem[12'h187]=16'h1189 ; //             pushi wi2c4_a4
    mem[12'h188]=16'h41db ; //             jmp si2c1
    mem[12'h189]=16'h12d8 ; //wi2c4_a4:  PUSHI i2cRAck 
    mem[12'h18a]=16'h118c ; //             PUSHI wi2c4_a5     
    mem[12'h18b]=16'h42ab ; //             JMP SubI2C1    
    mem[12'h18c]=16'hd000 ; //wi2c4_a5:  in 
    mem[12'h18d]=16'h1001 ; //             pushi 0x01
    mem[12'h18e]=16'hf005 ; //             band
    mem[12'h18f]=16'h5192 ; //             jz wi2c4_a5_1
    mem[12'h190]=16'h1002 ; //             pushi 2            
    mem[12'h191]=16'h41cf ; //             jmp wi2c4_err
    mem[12'h192]=16'h21d8 ; //wi2c4_a5_1:  push  wi2c4_val1
    mem[12'h193]=16'h10ff ; //             pushi 0x00ff
    mem[12'h194]=16'hf005 ; //             band
    mem[12'h195]=16'h1197 ; //             pushi wi2c4_a6
    mem[12'h196]=16'h41db ; //             jmp si2c1
    mem[12'h197]=16'h12d8 ; //wi2c4_a6:  PUSHI i2cRAck 
    mem[12'h198]=16'h119a ; //             PUSHI wi2c4_a7     
    mem[12'h199]=16'h42ab ; //             JMP SubI2C1    
    mem[12'h19a]=16'hd000 ; //wi2c4_a7:  in 
    mem[12'h19b]=16'h1001 ; //             pushi 0x01
    mem[12'h19c]=16'hf005 ; //             band
    mem[12'h19d]=16'h51a0 ; //             jz wi2c4_a7_1
    mem[12'h19e]=16'h1003 ; //             pushi 3           
    mem[12'h19f]=16'h41cf ; //             jmp wi2c4_err
    mem[12'h1a0]=16'h21d8 ; //wi2c4_a7_1:  push  wi2c4_val1
    mem[12'h1a1]=16'h1008 ; //             pushi 8
    mem[12'h1a2]=16'hf004 ; //             shr
    mem[12'h1a3]=16'h11a5 ; //             pushi wi2c4_a8
    mem[12'h1a4]=16'h41db ; //             jmp si2c1
    mem[12'h1a5]=16'h12d8 ; //wi2c4_a8:  PUSHI i2cRAck 
    mem[12'h1a6]=16'h11a8 ; //             PUSHI wi2c4_a9     
    mem[12'h1a7]=16'h42ab ; //             JMP SubI2C1    
    mem[12'h1a8]=16'hd000 ; //wi2c4_a9:  in 
    mem[12'h1a9]=16'h1001 ; //             pushi 0x01
    mem[12'h1aa]=16'hf005 ; //             band
    mem[12'h1ab]=16'h51ae ; //             jz wi2c4_a9_1
    mem[12'h1ac]=16'h1004 ; //             pushi 4            
    mem[12'h1ad]=16'h41cf ; //             jmp wi2c4_err
    mem[12'h1ae]=16'h21d9 ; //wi2c4_a9_1:  push  wi2c4_val2
    mem[12'h1af]=16'h10ff ; //             pushi 0x00ff
    mem[12'h1b0]=16'hf005 ; //             band
    mem[12'h1b1]=16'h11b3 ; //             pushi wi2c4_a10
    mem[12'h1b2]=16'h41db ; //             jmp si2c1
    mem[12'h1b3]=16'h12d8 ; //wi2c4_a10:  PUSHI i2cRAck 
    mem[12'h1b4]=16'h11b6 ; //             PUSHI wi2c4_a11     
    mem[12'h1b5]=16'h42ab ; //             JMP SubI2C1    
    mem[12'h1b6]=16'hd000 ; //wi2c4_a11:  in 
    mem[12'h1b7]=16'h1001 ; //             pushi 0x01
    mem[12'h1b8]=16'hf005 ; //             band
    mem[12'h1b9]=16'h51bc ; //             jz wi2c4_a11_1
    mem[12'h1ba]=16'h1005 ; //             pushi 5            
    mem[12'h1bb]=16'h41cf ; //             jmp wi2c4_err
    mem[12'h1bc]=16'h21d9 ; //wi2c4_a11_1:  push  wi2c4_val2
    mem[12'h1bd]=16'h1008 ; //             pushi 8
    mem[12'h1be]=16'hf004 ; //             shr
    mem[12'h1bf]=16'h11c1 ; //             pushi wi2c4_a12
    mem[12'h1c0]=16'h41db ; //             jmp si2c1
    mem[12'h1c1]=16'h12d8 ; //wi2c4_a12:  PUSHI i2cRAck 
    mem[12'h1c2]=16'h11c4 ; //             PUSHI wi2c4_a13     
    mem[12'h1c3]=16'h42ab ; //             JMP SubI2C1    
    mem[12'h1c4]=16'hd000 ; //wi2c4_a13:  in 
    mem[12'h1c5]=16'h1001 ; //             pushi 0x01
    mem[12'h1c6]=16'hf005 ; //             band
    mem[12'h1c7]=16'h51ca ; //             jz wi2c4_a13_1
    mem[12'h1c8]=16'h1006 ; //             pushi 6            
    mem[12'h1c9]=16'h41cf ; //             jmp wi2c4_err
    mem[12'h1ca]=16'h12e4 ; //wi2c4_a13_1:  PUSHI i2cStop  
    mem[12'h1cb]=16'h11cd ; //             PUSHI wi2c4_a14     
    mem[12'h1cc]=16'h42ab ; //             JMP SubI2C1    
    mem[12'h1cd]=16'h1000 ; //wi2c4_a14:  pushI 0          
    mem[12'h1ce]=16'h4000 ; //wi2c4_rtn:  jmp 0x000            
    mem[12'h1cf]=16'h31da ; //wi2c4_err:  pop wi2c4_ercode
    mem[12'h1d0]=16'h12e4 ; //             PUSHI i2cStop  
    mem[12'h1d1]=16'h11d3 ; //             PUSHI wi2c4_a15     
    mem[12'h1d2]=16'h42ab ; //             JMP SubI2C1    
    mem[12'h1d3]=16'h21da ; //wi2c4_a15:  push wi2c4_ercode
    mem[12'h1d4]=16'h41ce ; //             jmp wi2c4_rtn 
    mem[12'h1d5]=16'h4000 ; //wi2c4_jmp:  0x4000
    mem[12'h1d6]=16'h0000 ; //wi2c4_addr:  0x0000
    mem[12'h1d7]=16'h0000 ; //wi2c4_reg:  0x0000
    mem[12'h1d8]=16'h0000 ; //wi2c4_val1:  0x0000
    mem[12'h1d9]=16'h0000 ; //wi2c4_val2:  0x0000
    mem[12'h1da]=16'h0000 ; //wi2c4_ercode:  0x0000
    mem[12'h1db]=16'h21fd ; //si2c1:  PUSH si2c1_jmp    
    mem[12'h1dc]=16'hf006 ; //             BOR               
    mem[12'h1dd]=16'h31fc ; //             POP si2c1_rtn     
    mem[12'h1de]=16'h31fe ; //             POP si2c1_val
    mem[12'h1df]=16'h1008 ; //             PUSHI 8
    mem[12'h1e0]=16'h31ff ; //             POP si2c1_i
    mem[12'h1e1]=16'h21fe ; //si2c1_a3:  push si2c1_val
    mem[12'h1e2]=16'h1080 ; //             pushi 0x0080
    mem[12'h1e3]=16'hf005 ; //             band
    mem[12'h1e4]=16'h61ec ; //             JNZ si2c1_a1
    mem[12'h1e5]=16'h1000 ; //             pushi 0x0000
    mem[12'h1e6]=16'he000 ; //             out
    mem[12'h1e7]=16'h1002 ; //             pushi 0x0002
    mem[12'h1e8]=16'he000 ; //             out
    mem[12'h1e9]=16'h1000 ; //             pushi 0x0000
    mem[12'h1ea]=16'he000 ; //             out
    mem[12'h1eb]=16'h41f2 ; //             jmp si2c1_a2
    mem[12'h1ec]=16'h1001 ; //si2c1_a1:  pushi 0x0001
    mem[12'h1ed]=16'he000 ; //             out
    mem[12'h1ee]=16'h1003 ; //             pushi 0x0003
    mem[12'h1ef]=16'he000 ; //             out
    mem[12'h1f0]=16'h1001 ; //             pushi 0x0001
    mem[12'h1f1]=16'he000 ; //             out
    mem[12'h1f2]=16'h21fe ; //si2c1_a2:  push si2c1_val
    mem[12'h1f3]=16'h1001 ; //             pushi 1
    mem[12'h1f4]=16'hf003 ; //             shl
    mem[12'h1f5]=16'h31fe ; //             pop  si2c1_val
    mem[12'h1f6]=16'h21ff ; //             push si2c1_i
    mem[12'h1f7]=16'h1001 ; //             pushi 1
    mem[12'h1f8]=16'hf001 ; //             sub
    mem[12'h1f9]=16'h31ff ; //             pop si2c1_i
    mem[12'h1fa]=16'h21ff ; //             push si2c1_i
    mem[12'h1fb]=16'h61e1 ; //             jnz si2c1_a3
    mem[12'h1fc]=16'h4000 ; //si2c1_rtn:  jmp 0x000     
    mem[12'h1fd]=16'h4000 ; //si2c1_jmp:  0x4000
    mem[12'h1fe]=16'h0000 ; //si2c1_val:  0x0000
    mem[12'h1ff]=16'h0000 ; //si2c1_i:  0x0000
    mem[12'h200]=16'h224a ; //ri2c1:  PUSH ri2c1_jmp    
    mem[12'h201]=16'hf006 ; //             BOR               
    mem[12'h202]=16'h3243 ; //             POP ri2c1_rtn     
    mem[12'h203]=16'h324b ; //             POP ri2c1_addr    
    mem[12'h204]=16'h324c ; //             pop ri2c1_reg     
    mem[12'h205]=16'h324d ; //             pop ri2c1_raddr   
    mem[12'h206]=16'h12cb ; //             PUSHI i2cStart    
    mem[12'h207]=16'h1209 ; //             PUSHI ri2c1_a1    
    mem[12'h208]=16'h42ab ; //             JMP SubI2C1       
    mem[12'h209]=16'h224b ; //ri2c1_a1:  push ri2c1_addr
    mem[12'h20a]=16'h1001 ; //             pushi 1
    mem[12'h20b]=16'hf003 ; //             shl                   
    mem[12'h20c]=16'h120e ; //             pushi ri2c1_a2
    mem[12'h20d]=16'h41db ; //             jmp si2c1
    mem[12'h20e]=16'h12d8 ; //ri2c1_a2:  PUSHI i2cRAck 
    mem[12'h20f]=16'h1211 ; //             PUSHI ri2c1_a3     
    mem[12'h210]=16'h42ab ; //             JMP SubI2C1    
    mem[12'h211]=16'hd000 ; //ri2c1_a3:  in 
    mem[12'h212]=16'h1001 ; //             pushi 0x01
    mem[12'h213]=16'hf005 ; //             band
    mem[12'h214]=16'h5217 ; //             jz ri2c1_a3_1
    mem[12'h215]=16'h1001 ; //             pushi 1           
    mem[12'h216]=16'h4244 ; //             jmp ri2c1_err
    mem[12'h217]=16'h224c ; //ri2c1_a3_1:  push ri2c1_reg
    mem[12'h218]=16'h121a ; //             pushi ri2c1_a4
    mem[12'h219]=16'h41db ; //             jmp si2c1
    mem[12'h21a]=16'h12d8 ; //ri2c1_a4:  PUSHI i2cRAck 
    mem[12'h21b]=16'h121d ; //             PUSHI ri2c1_a5     
    mem[12'h21c]=16'h42ab ; //             JMP SubI2C1    
    mem[12'h21d]=16'hd000 ; //ri2c1_a5:  in 
    mem[12'h21e]=16'h1001 ; //             pushi 0x01
    mem[12'h21f]=16'hf005 ; //             band
    mem[12'h220]=16'h5223 ; //             jz ri2c1_a5_1
    mem[12'h221]=16'h1002 ; //             pushi 2           
    mem[12'h222]=16'h4244 ; //             jmp ri2c1_err
    mem[12'h223]=16'h12cb ; //ri2c1_a5_1:  PUSHI i2cStart    
    mem[12'h224]=16'h1226 ; //             PUSHI ri2c1_a6    
    mem[12'h225]=16'h42ab ; //             JMP SubI2C1       
    mem[12'h226]=16'h224b ; //ri2c1_a6:  push ri2c1_addr
    mem[12'h227]=16'h1001 ; //             pushi 1
    mem[12'h228]=16'hf003 ; //             shl                   
    mem[12'h229]=16'h1001 ; //             pushi 0x0001
    mem[12'h22a]=16'hf006 ; //             BOR
    mem[12'h22b]=16'h122d ; //             pushi ri2c1_a7
    mem[12'h22c]=16'h41db ; //             jmp si2c1
    mem[12'h22d]=16'h12d8 ; //ri2c1_a7:  PUSHI i2cRAck 
    mem[12'h22e]=16'h1230 ; //             PUSHI ri2c1_a8     
    mem[12'h22f]=16'h42ab ; //             JMP SubI2C1    
    mem[12'h230]=16'hd000 ; //ri2c1_a8:  in 
    mem[12'h231]=16'h1001 ; //             pushi 0x01
    mem[12'h232]=16'hf005 ; //             band
    mem[12'h233]=16'h5236 ; //             jz ri2c1_a8_1
    mem[12'h234]=16'h1003 ; //             pushi 3           
    mem[12'h235]=16'h4244 ; //             jmp ri2c1_err
    mem[12'h236]=16'h12e8 ; //ri2c1_a8_1:  pushi i2cRead
    mem[12'h237]=16'h1239 ; //             pushi ri2c1_a9
    mem[12'h238]=16'h42ab ; //             jmp SubI2C1
    mem[12'h239]=16'h224d ; //ri2c1_a9:  push ri2c1_raddr
    mem[12'h23a]=16'hd000 ; //             in
    mem[12'h23b]=16'h8000 ; //             st 
    mem[12'h23c]=16'h12e0 ; //             PUSHI i2cNAck 
    mem[12'h23d]=16'h123f ; //             PUSHI ri2c1_a10     
    mem[12'h23e]=16'h42ab ; //             JMP SubI2C1    
    mem[12'h23f]=16'h12e4 ; //ri2c1_a10:  PUSHI i2cStop  
    mem[12'h240]=16'h1242 ; //             PUSHI ri2c1_a11     
    mem[12'h241]=16'h42ab ; //             JMP SubI2C1    
    mem[12'h242]=16'h1000 ; //ri2c1_a11:  pushI 0          
    mem[12'h243]=16'h4000 ; //ri2c1_rtn:  jmp  0x000           
    mem[12'h244]=16'h324e ; //ri2c1_err:  pop ri2c1_ercode
    mem[12'h245]=16'h12e4 ; //             PUSHI i2cStop  
    mem[12'h246]=16'h1248 ; //             PUSHI ri2c1_a12     
    mem[12'h247]=16'h42ab ; //             JMP SubI2C1    
    mem[12'h248]=16'h224e ; //ri2c1_a12:  push ri2c1_ercode
    mem[12'h249]=16'h4243 ; //             jmp ri2c1_rtn 
    mem[12'h24a]=16'h4000 ; //ri2c1_jmp:  0x4000
    mem[12'h24b]=16'h0000 ; //ri2c1_addr:  0x0000
    mem[12'h24c]=16'h0000 ; //ri2c1_reg:  0x0000
    mem[12'h24d]=16'h0000 ; //ri2c1_raddr:  0x0000
    mem[12'h24e]=16'h0000 ; //ri2c1_ercode:  0x0000
    mem[12'h24f]=16'h22a5 ; //ri2c2:  PUSH ri2c2_jmp    
    mem[12'h250]=16'hf006 ; //             BOR               
    mem[12'h251]=16'h329e ; //             POP ri2c2_rtn     
    mem[12'h252]=16'h32a6 ; //             POP ri2c2_addr    
    mem[12'h253]=16'h32a7 ; //             pop ri2c2_reg     
    mem[12'h254]=16'h32a8 ; //             pop ri2c2_raddr   
    mem[12'h255]=16'h12cb ; //             PUSHI i2cStart    
    mem[12'h256]=16'h1258 ; //             PUSHI ri2c2_a1    
    mem[12'h257]=16'h42ab ; //             JMP SubI2C1       
    mem[12'h258]=16'h22a6 ; //ri2c2_a1:  push ri2c2_addr
    mem[12'h259]=16'h1001 ; //             pushi 1
    mem[12'h25a]=16'hf003 ; //             shl                   
    mem[12'h25b]=16'h125d ; //             pushi ri2c2_a2
    mem[12'h25c]=16'h41db ; //             jmp si2c1
    mem[12'h25d]=16'h12d8 ; //ri2c2_a2:  PUSHI i2cRAck 
    mem[12'h25e]=16'h1260 ; //             PUSHI ri2c2_a3     
    mem[12'h25f]=16'h42ab ; //             JMP SubI2C1    
    mem[12'h260]=16'hd000 ; //ri2c2_a3:  in 
    mem[12'h261]=16'h1001 ; //             pushi 0x01
    mem[12'h262]=16'hf005 ; //             band
    mem[12'h263]=16'h5266 ; //             jz ri2c2_a3_1
    mem[12'h264]=16'h1001 ; //             pushi 1           
    mem[12'h265]=16'h429f ; //             jmp ri2c2_err
    mem[12'h266]=16'h22a7 ; //ri2c2_a3_1:  push ri2c2_reg
    mem[12'h267]=16'h1269 ; //             pushi ri2c2_a4
    mem[12'h268]=16'h41db ; //             jmp si2c1
    mem[12'h269]=16'h12d8 ; //ri2c2_a4:  PUSHI i2cRAck 
    mem[12'h26a]=16'h126c ; //             PUSHI ri2c2_a5     
    mem[12'h26b]=16'h42ab ; //             JMP SubI2C1    
    mem[12'h26c]=16'hd000 ; //ri2c2_a5:  in 
    mem[12'h26d]=16'h1001 ; //             pushi 0x01
    mem[12'h26e]=16'hf005 ; //             band
    mem[12'h26f]=16'h5272 ; //             jz ri2c2_a5_1
    mem[12'h270]=16'h1002 ; //             pushi 2           
    mem[12'h271]=16'h429f ; //             jmp ri2c2_err
    mem[12'h272]=16'h12cb ; //ri2c2_a5_1:  PUSHI i2cStart    
    mem[12'h273]=16'h1275 ; //             PUSHI ri2c2_a6    
    mem[12'h274]=16'h42ab ; //             JMP SubI2C1       
    mem[12'h275]=16'h22a6 ; //ri2c2_a6:  push ri2c2_addr
    mem[12'h276]=16'h1001 ; //             pushi 1
    mem[12'h277]=16'hf003 ; //             shl                   
    mem[12'h278]=16'h1001 ; //             pushi 0x0001
    mem[12'h279]=16'hf006 ; //             BOR
    mem[12'h27a]=16'h127c ; //             pushi ri2c2_a7
    mem[12'h27b]=16'h41db ; //             jmp si2c1
    mem[12'h27c]=16'h12d8 ; //ri2c2_a7:  PUSHI i2cRAck 
    mem[12'h27d]=16'h127f ; //             PUSHI ri2c2_a8     
    mem[12'h27e]=16'h42ab ; //             JMP SubI2C1    
    mem[12'h27f]=16'hd000 ; //ri2c2_a8:  in 
    mem[12'h280]=16'h1001 ; //             pushi 0x01
    mem[12'h281]=16'hf005 ; //             band
    mem[12'h282]=16'h5285 ; //             jz ri2c2_a8_1
    mem[12'h283]=16'h1003 ; //             pushi 3           
    mem[12'h284]=16'h429f ; //             jmp ri2c2_err
    mem[12'h285]=16'h12e8 ; //ri2c2_a8_1:  pushi i2cRead
    mem[12'h286]=16'h1288 ; //             pushi ri2c2_l9
    mem[12'h287]=16'h42ab ; //             jmp SubI2C1
    mem[12'h288]=16'hd000 ; //ri2c2_l9:  in
    mem[12'h289]=16'h1008 ; //             pushi 8
    mem[12'h28a]=16'hf003 ; //             shl
    mem[12'h28b]=16'h32a9 ; //             pop ri2c2_val1
    mem[12'h28c]=16'h12dc ; //             PUSHI i2cWAck 
    mem[12'h28d]=16'h128f ; //             PUSHI ri2c2_a10     
    mem[12'h28e]=16'h42ab ; //             JMP SubI2C1    
    mem[12'h28f]=16'h12e8 ; //ri2c2_a10:  pushi i2cRead
    mem[12'h290]=16'h1292 ; //             pushi ri2c2_a11
    mem[12'h291]=16'h42ab ; //             jmp SubI2C1
    mem[12'h292]=16'h22a8 ; //ri2c2_a11:  push ri2c2_raddr
    mem[12'h293]=16'hd000 ; //             in
    mem[12'h294]=16'h22a9 ; //             push ri2c2_val1
    mem[12'h295]=16'hf006 ; //             bor
    mem[12'h296]=16'h8000 ; //             st 
    mem[12'h297]=16'h12e0 ; //             PUSHI i2cNAck 
    mem[12'h298]=16'h129a ; //             PUSHI ri2c2_a12     
    mem[12'h299]=16'h42ab ; //             JMP SubI2C1    
    mem[12'h29a]=16'h12e4 ; //ri2c2_a12:  PUSHI i2cStop  
    mem[12'h29b]=16'h129d ; //             PUSHI ri2c2_a13     
    mem[12'h29c]=16'h42ab ; //             JMP SubI2C1    
    mem[12'h29d]=16'h1000 ; //ri2c2_a13:  pushI 0   
    mem[12'h29e]=16'h4000 ; //ri2c2_rtn:  jmp  0x000           
    mem[12'h29f]=16'h32aa ; //ri2c2_err:  pop ri2c2_ercode
    mem[12'h2a0]=16'h12e4 ; //             PUSHI i2cStop  
    mem[12'h2a1]=16'h12a3 ; //             PUSHI ri2c2_a14     
    mem[12'h2a2]=16'h42ab ; //             JMP SubI2C1    
    mem[12'h2a3]=16'h22aa ; //ri2c2_a14:  push ri2c2_ercode
    mem[12'h2a4]=16'h429e ; //             jmp ri2c2_rtn  
    mem[12'h2a5]=16'h4000 ; //ri2c2_jmp:  0x4000
    mem[12'h2a6]=16'h0000 ; //ri2c2_addr:  0x0000
    mem[12'h2a7]=16'h0000 ; //ri2c2_reg:  0x0000
    mem[12'h2a8]=16'h0000 ; //ri2c2_raddr:  0x0000
    mem[12'h2a9]=16'h0000 ; //ri2c2_val1:  0x0000
    mem[12'h2aa]=16'h0000 ; //ri2c2_ercode:  0x0000
    mem[12'h2ab]=16'h22c6 ; //SubI2C1:  PUSH LblJMP    
    mem[12'h2ac]=16'hf006 ; //             BOR            
    mem[12'h2ad]=16'h32c5 ; //             POP RtnSub1    
    mem[12'h2ae]=16'h32c7 ; //             POP Sub1Data2  
    mem[12'h2af]=16'h22c7 ; //             PUSH Sub1Data2
    mem[12'h2b0]=16'h7000 ; //             LD
    mem[12'h2b1]=16'h32ca ; //             POP N
    mem[12'h2b2]=16'h22c7 ; //             PUSH Sub1Data2
    mem[12'h2b3]=16'h1001 ; //             PUSHI 1
    mem[12'h2b4]=16'hf000 ; //             ADD
    mem[12'h2b5]=16'h32c8 ; //             POP Sub1SA
    mem[12'h2b6]=16'h1000 ; //             PUSHI 0
    mem[12'h2b7]=16'h32c9 ; //             POP i
    mem[12'h2b8]=16'h22c9 ; //L1:  PUSH i
    mem[12'h2b9]=16'h22c8 ; //             PUSH Sub1SA
    mem[12'h2ba]=16'hf000 ; //             ADD
    mem[12'h2bb]=16'h7000 ; //             LD     
    mem[12'h2bc]=16'he000 ; //             OUT    
    mem[12'h2bd]=16'h22c9 ; //             PUSH i
    mem[12'h2be]=16'h1001 ; //             PUSHI 1     
    mem[12'h2bf]=16'hf000 ; //             ADD
    mem[12'h2c0]=16'h32c9 ; //             POP i
    mem[12'h2c1]=16'h22c9 ; //             PUSH i
    mem[12'h2c2]=16'h22ca ; //             PUSH N
    mem[12'h2c3]=16'hf001 ; //             SUB
    mem[12'h2c4]=16'h62b8 ; //             JNZ L1  
    mem[12'h2c5]=16'h4000 ; //RtnSub1:  JMP 0x000           
    mem[12'h2c6]=16'h4000 ; //LblJMP:  0x4000
    mem[12'h2c7]=16'h0000 ; //Sub1Data2:  0x0000
    mem[12'h2c8]=16'h0000 ; //Sub1SA:  0x0000
    mem[12'h2c9]=16'h0000 ; //i:  0x0000
    mem[12'h2ca]=16'h0000 ; //N:  0x0000
    mem[12'h2cb]=16'h0003 ; //i2cStart:  3
    mem[12'h2cc]=16'h0001 ; //             1 
    mem[12'h2cd]=16'h0003 ; //             3 
    mem[12'h2ce]=16'h0002 ; //             2 
    mem[12'h2cf]=16'h0000 ; //             0 
    mem[12'h2d0]=16'h0003 ; //i2cAddrW:  3
    mem[12'h2d1]=16'h0000 ; //             0 
    mem[12'h2d2]=16'h0002 ; //             2 
    mem[12'h2d3]=16'h0000 ; //             0 
    mem[12'h2d4]=16'h0003 ; //i2cAddrR:  3
    mem[12'h2d5]=16'h0001 ; //             1   
    mem[12'h2d6]=16'h0003 ; //             3   
    mem[12'h2d7]=16'h0001 ; //             1   
    mem[12'h2d8]=16'h0003 ; //i2cRAck:  3
    mem[12'h2d9]=16'h0001 ; //             1   
    mem[12'h2da]=16'h0003 ; //             3   
    mem[12'h2db]=16'h0001 ; //             1   
    mem[12'h2dc]=16'h0003 ; //i2cWAck:  3
    mem[12'h2dd]=16'h0000 ; //             0  
    mem[12'h2de]=16'h0002 ; //             2  
    mem[12'h2df]=16'h0000 ; //             0  
    mem[12'h2e0]=16'h0003 ; //i2cNAck:  3
    mem[12'h2e1]=16'h0001 ; //             1  
    mem[12'h2e2]=16'h0003 ; //             3  
    mem[12'h2e3]=16'h0001 ; //             1  
    mem[12'h2e4]=16'h0003 ; //i2cStop:  3
    mem[12'h2e5]=16'h0002 ; //             2  
    mem[12'h2e6]=16'h0003 ; //             3  
    mem[12'h2e7]=16'h0003 ; //             3  
    mem[12'h2e8]=16'h0011 ; //i2cRead:  0x0011
    mem[12'h2e9]=16'h0001 ; //             1  
    mem[12'h2ea]=16'h0003 ; //             3  
    mem[12'h2eb]=16'h0001 ; //             1  
    mem[12'h2ec]=16'h0003 ; //             3  
    mem[12'h2ed]=16'h0001 ; //             1  
    mem[12'h2ee]=16'h0003 ; //             3  
    mem[12'h2ef]=16'h0001 ; //             1  
    mem[12'h2f0]=16'h0003 ; //             3  
    mem[12'h2f1]=16'h0001 ; //             1  
    mem[12'h2f2]=16'h0003 ; //             3  
    mem[12'h2f3]=16'h0001 ; //             1  
    mem[12'h2f4]=16'h0003 ; //             3  
    mem[12'h2f5]=16'h0001 ; //             1  
    mem[12'h2f6]=16'h0003 ; //             3  
    mem[12'h2f7]=16'h0001 ; //             1  
    mem[12'h2f8]=16'h0003 ; //             3  
    mem[12'h2f9]=16'h0001 ; //             1

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-08-29 (火) 15:32:19 (2431d)