'{$STAMP BS2} '------------------------------------------------------------------------ 'K STAMP PROGRAM 8 - SENDS CONTROL & RECEIVES STATE '------------------------------------------------------------------------ 'MICROCODE FIELDS AND THEIR MEANING ' 'uinst OUT LATCH MEM_ALU CY_UPC UPC_OFFSET ' 0 =None 0 =None 0=None 'address 1 =ACC 1 =ACC 0 =Hi-Z 1=CYF Out must add '16-bit 2 =ONE 2 =A 16=Read 2=CYZ Out this 8-bit ' 4 =ZERO 4 =B 32=Sel 4=CYF Latch value to ' 8 =PC 8 =PC 48=Write 0=UPC "base" to ' 16=MAR 16 =MAR 0=Nop 1=IR get address ' 32=MDR 32 =MDR 1=Add of byte in ' 64=TEMP 64 =TEMP 2=And PIC EEROM ' 128=IR 4=Or ' 8=Not ' '------------------------------------------------------------------------ 'DECLARATIONS TO WRITE MICROCODE FIELDS none con 0 acc con 1 one con 2 zero con 4 pc con 8 mar con 16 mdr con 32 temp con 64 ir con 128 a con 2 b con 4 hiz con 0 mread con 16 msel con 32 mwrite con 48 nop con 0 gadd con 1 gand con 2 gor con 4 gnot con 8 cyf con 16 cyz con 32 lcyf con 64 supc con 0 sir con 1 '------------------------------------------------------------------------ 'MICROCODE ' OUT LATCH MEM+ALU CYF+UPC NEXT UPC rset data zero, pc, none+nop, none+supc, fetch-rset start data pc, a, none+nop, none+supc, m02-rset m02 data one, b+acc, none+gadd, cyz+supc, m03-rset m03 data acc, pc, none+nop, none+supc, fetch-rset fetch data pc, mar, none+nop, none+supc, m05-rset m05 data mar, none, msel+nop, none+supc, m06-rset m06 data none, mdr, mread+nop, none+supc, incpc-rset incpc data pc, a, none+nop, none+supc, m08-rset m08 data one, b+acc, none+gadd, cyz+supc, m09-rset m09 data acc, pc, none+nop, none+supc, decod-rset decod data mdr, ir, none+nop, none+supc, m0B-rset m0B data pc, mar, none+nop, none+supc, m0C-rset m0C data mar, none, msel+nop, none+supc, m0D-rset m0D data none, mar, mread+nop, none+supc, m0E-rset m0E data mar, none, msel+nop, none+sir, rset-rset nopm data none, none, none+nop, none+supc, fetch-rset ldam data none, mdr, mread+nop, none+supc, m11-rset m11 data mdr, temp, none+nop, none+supc, start-rset m25 data none, none, none+nop, none+supc, rset-rset m26 data none, none, none+nop, none+supc, rset-rset m27 data none, none, none+nop, none+supc, rset-rset m28 data none, none, none+nop, none+supc, rset-rset m29 data none, none, none+nop, none+supc, rset-rset m2A data none, none, none+nop, none+supc, rset-rset m2B data none, none, none+nop, none+supc, rset-rset m2C data none, none, none+nop, none+supc, rset-rset m2D data none, none, none+nop, none+supc, rset-rset m2E data none, none, none+nop, none+supc, rset-rset m2F data none, none, none+nop, none+supc, rset-rset halt data 1 '------------------------------------------------------------------------ 'MACHINE CODE DECLARATIONS noop con %00000000 lda con %10000000 sta con %01000000 adda con %11000000 adca con %00100000 anda con %10100000 ora con %11100000 nota con %00010000 brc con %00110000 '------------------------------------------------------------------------ 'MAP TABLE mapped_ir var byte index var byte nomatch con 255 '------------------------------------------------------------------------ 'CURRENT MICROINSTRUCTION ADDRESS upc var byte '------------------------------------------------------------------------ 'GEMINI INSTRUCTION REGISTER & CARRY FLAG "CONNECTION" ir_ var byte cyf_ var bit timer_var var word '------------------------------------------------------------------------ 'CURRENT MICROINSTRUCTION reg_out var byte reg_latch var byte mem_alu var byte mem_ops var mem_alu.nib1 alu_ops var mem_alu.nib0 cy_upc var byte carry_ops var cy_upc.nib1 upc_sel var cy_upc.bit0 next_upc var byte '------------------------------------------------------------------------ 'LINE FEED FOR SERIAL PORT lf con 10 '------------------------------------------------------------------------ '------------------------------------------------------------------------ 'CONTROL LOOP (MOORE MACHINE) ' 'Enter here when BS2 is reset to simulate resetting Gemini uP reset: next_upc=rset upc_sel=supc goto send_uinst '------------------------------------------------------------------------ 'Wait for D Stamp to send IR and CYF recv_state: loop: serin 0, 32, 250, loop, [wait("k"), ir_, cyf_, timer_var] debug "IR & CYF = " debug hex2 ir_, " " debug hex2 cyf_, cr,lf '------------------------------------------------------------------------ 'Send the current microinstruction to the D Stamp send_uinst: 'Pin 7 connected to green LED that simulates rising edge of clock high 7 pause timer_var 'SELECT NEXT MICROINSTRUCTION upc=next_upc if upc_sel=supc then read_uinst 'else map IR to MICROCODE address ' index=nomatch mapped_ir=halt 'if invalid machine instruction lookdown ir_,=[nop,lda,sta,adda,adca,anda,ora,nota,brc],index lookup index,[nopm,ldam,stam,addm,adcm,andm,oram,notam,brc0],mapped_ir upc=mapped_ir 'adjust brc0 address if necessary ' if ir_<>brc then read_uinst if cyf_=0 then read_uinst upc=brc1 read_uinst: read upc, reg_out read upc+1, reg_latch read upc+2, mem_alu read upc+3, cy_upc read upc+4, next_upc serout 0,32+$8000,["d",reg_out,reg_latch,mem_alu,cy_upc,next_upc] low 7 goto recv_state end