DECLARE FUNCTION BIN$ (n AS INTEGER, b AS INTEGER) DEFINT A-Z SCREEN 0 WIDTH 80, 25 COLOR 0, 7 CLS PRINT "register"; TAB(20); "adder 1"; TAB(35); "adder 2"; TAB(50); "clocks" DIM shiftbits(7) AS INTEGER CLK = 0 DO nor = 0 FOR i = 0 TO 6 nor = shiftbits(i) OR nor NEXT nor = -NOT (nor * -1) 'toggle between 0 and +1 IF nor AND NOT shiftbits(7) THEN CLK = 0': STOP 'all bits are zero tap1 = shiftbits(4) XOR shiftbits(5) tap2 = shiftbits(6) XOR shiftbits(7) tap3 = tap1 XOR tap2 srin = nor XOR tap3 'mixed up adder1a = shiftbits(2) + 2 * shiftbits(0) + 4 * shiftbits(3) + 8 * shiftbits(1) adder1b = shiftbits(7) + 2 * shiftbits(5) + 4 * shiftbits(4) + 8 * shiftbits(6) adder1sum = adder1a + adder1b 'mixed up adder2a = shiftbits(5) + 2 * shiftbits(6) + 4 * shiftbits(7) + 8 * shiftbits(4) adder2b = shiftbits(1) + 2 * shiftbits(3) + 4 * shiftbits(0) + 8 * shiftbits(2) adder2sum = adder2a + adder2b reg8 = adder1a + 16 * adder2a GOSUB show: t! = TIMER + .1 DO LOOP UNTIL TIMER > t! 'SLEEP 'inputs all set; wait for clock before changing outputs CLK = CLK + 1 FOR i = 7 TO 1 STEP -1 shiftbits(i) = shiftbits(i - 1) NEXT shiftbits(0) = srin LOOP UNTIL INKEY$ <> "" END show: row = CSRLIN: col = POS(0): VIEW PRINT 12 TO 25: CLS PRINT "nor="; nor PRINT "tap1 (xor 4,5)="; tap1 PRINT "tap2 (xor 6,7)="; tap2 PRINT "tap3 (xor 4,5,6,7)="; tap3 PRINT "srin (xor tap3,nor)="; srin FOR i = 0 TO 7 PRINT "shiftbits("; i; ") ="; shiftbits(i) NEXT VIEW PRINT 2 TO 11: LOCATE row, col PRINT reg8; TAB(6); BIN$(reg8, 8); TAB(20); adder1sum; TAB(25); BIN$(adder1sum, 5); TAB(35); adder2sum; TAB(40); BIN$(adder2sum, 5); TAB(50); CLK RETURN 'Returns binary format string representing a 16 bit integer. 'Value may be -2^15 to +2^15-1. ' FUNCTION BIN$ (n AS INTEGER, b AS INTEGER) num = n IF num < 0 THEN num = NOT num 'num = ABS(num) - 1 (1's complement) inv = 1 'negative numbers complemented now, and again later temp$ = "1" 'negative sign bit = 1 ELSE inv = 0 temp$ = "0" 'positive sign bit = 0 END IF 'adjusts for number of bytes in datatype 'for 16 bit word this is " 14 TO 0 " FOR radix = LEN(num) * 8 - 2 TO 0 STEP -1 'start with MSB (after sign bit) bit.val = 2 ^ radix IF num < bit.val XOR inv = 1 THEN temp$ = temp$ + "0" '0 if pos, 1 if neg ELSE temp$ = temp$ + "1" '1 if pos, 0 if neg END IF IF num >= bit.val THEN num = num - bit.val NEXT radix 'return only b bits BIN$ = RIGHT$(temp$, b) END FUNCTION