1 ADD = 48128 : DAT = 48129 : EA = 7 : PA = 14 : PB=15 2 BIT = 0 : BYTE = 0 : ERR = 0 : FINAL = 0 : DB = 0 3 POKE ADDR,PA : POKE DAT,1 : REM SET CLK HIGH 5 POKE ADDR,EA : POKE DAT,64 : REM SET PA AS O/P PB AS I/P 6 POKE ADDR,PB : POKE DAT,0 7 DIM Q(7) : FOR X=0 TO 7 : Q(X)=2^X : NEXT X : REM PRE-CALCULATE 2^X 10 GOSUB 40000 : REM CLR I2C 15 A$="The Quick Brown Fox Jumped Over The Lazy Moon" 100 SRC=0 : DEST = 0 : NB=LEN(A$) : PG = 32 103 ST = 0 : EN = LEN(A$) 105 PRINT CHR$(12) 107 PRINT "WRITING RANDOMLY..." 110 GOSUB 50000 120 PRINT : PRINT "FINISHED RANDOM WRITING" 130 PRINT "READING RANDOMLY..." 140 GOSUB 55000 150 PRINT : PRINT "FINISHED RANDOM READING" 155 DEST = 0 160 PRINT : PRINT "WRITING SEQUENTIALLY..." 165 A$="The Slow Brown Fox Jumped Over The Lazy Moonz" 166 NB=LEN(A$) : DEST = 0 170 GOSUB 55500 190 PRINT : PRINT "FINISHED SEQUENTIAL WRITING" 200 PRINT : PRINT "READING SEQUENTIALY..." 210 GOSUB 58000 220 PRINT : PRINT "FINISHED SEQUENTIAL READING" 230 END 1000 REM SET CLK HIGH 1010 POKE ADD,PA 1020 A=PEEK(ADD) 1030 A=A OR 1 1050 POKE DAT,A 1060 RETURN 2000 REM SET CLK LOW 2020 POKE ADD,PA 2030 A=PEEK(ADD) 2040 A=A AND 254 2060 POKE DAT,A 2070 RETURN 3000 REM SET DATA HIGH (SET PB AS I/P) 3010 POKE ADD,EA 3020 A=PEEK(ADD) 3030 A=A AND 127 : REM MSB = 0 3050 POKE DAT,A 3060 RETURN 4000 REM SET DAT LOW (SET PB AS O/P) 4010 POKE ADD,EA 4020 A=PEEK(ADD) 4030 A=A OR 128 : REM MSB = 1 4060 POKE DAT,A 4070 RETURN 5000 REM START 5001 IF DB THEN PRINT "START" 5010 GOSUB 4000 : REM SET DATA LOW 5020 GOSUB 2000 : REM SET CLK LOW 5030 RETURN 6000 REM STOP 6001 IF DB THEN PRINT "STOP" 6010 GOSUB 4000 : REM DATA LOW 6015 GOSUB 1000 : REM CLK HIGH 6020 GOSUB 3000 : REM DATA HIGH 6030 RETURN 7000 REM SEND BIT 7010 IF BIT = 1 THEN GOTO 7030 7020 GOSUB 4000 : GOTO 7040 : REM SET DATA LOW 7030 GOSUB 3000 : REM SET DATA HIGH 7040 GOSUB 1000 : GOSUB 2000 : REM CLOCK OUT 7050 RETURN 8000 REM ACK 8001 IF DB THEN PRINT "ACK" 8010 BIT = 0 : GOSUB 7000 8020 RETURN 9000 REM NACK 9001 IF DB THEN PRINT "NACK" 9010 BIT = 1 : GOSUB 7000 9020 RETURN 10000 REM REC BIT 10010 GOSUB 1000 : REM DATA HIGH, CLOCK HIGH 10020 POKE ADD,15 : BIT = PEEK(ADD) AND 1 10030 GOSUB 2000 : REM CLOCK LOW 10040 RETURN 20000 REM WRITE 20001 IF DB THEN PRINT "WRITE" 20005 ERR = 0 20010 FOR X=7 TO 0 STEP -1 20020 IF (BYTE AND Q(X)) THEN BIT = 1 : GOSUB 7000 : GOTO 20050 20030 BIT = 0 : GOSUB 7000 20050 NEXT X 20060 GOSUB 3000 : GOSUB 10000 : REM GET ACK 20070 IF BIT = 0 THEN ERR = 1 20080 RETURN 30000 REM READ 30001 IF DB THEN PRINT "READ" 30002 BYTE = 0 30005 GOSUB 3000 30010 FOR X=0 TO 7 30020 GOSUB 10000 : REM READ BIT 30030 BYTE = BYTE + (Q(7-X)*BIT) 30040 NEXT X 30045 IF FINAL = 0 THEN GOSUB 8000 : GOTO 30055 : REM ACK 30050 GOSUB 9000 : REM NACK IF FINAL READ 30055 IF DB THEN PRINT "READ BYTE IS = ", CHR$(BYTE) 30060 RETURN 40000 REM CLEAR I2C 40001 IF DB THEN PRINT "CLEAR I2C" 40010 GOSUB 6000 : REM STOP 40020 GOSUB 5000 : REM START 40030 GOSUB 3000 : REM DATA HIGH 40040 FOR Y= 0 TO 8 40050 GOSUB 1000 : REM CLK HIGH 40060 GOSUB 2000 : REM CLK LOW 40065 NEXT Y 40070 GOSUB 5000 : REM START 40080 GOSUB 6000 : REM STOP 40090 RETURN 50000 REM WRITE DATA A BYTE AT A TIME 50010 FOR W = 0 TO (NB-1) 50020 GOSUB 60100 : REM WAIT FOR EEPROM TO BE READY 50030 IF ERR = 0 THEN PRINT "EEPROM NOT AVAILABLE" : RETURN 50050 HB=((DEST + W)/256) AND 31 : REM GET HIGH BYTE OF ADDRESS 50060 LB=((DEST + W) AND 255) : REM GET LOW BYTE OF ADDRESS 50100 BYTE=HB : REM WRITE THE HIGH ADRRESS 50110 GOSUB 20000 : IF ERR=0 THEN PRINT "ERR RND WR 1" : GOSUB 6000 :RETURN 50120 BYTE=LB : REM WRITE THE LOW ADDRESS 50130 GOSUB 20000 : IF ERR=0 THEN PRINT "ERR RND WR 2" : GOSUB 6000 :RETURN 50140 BYTE=ASC(MID$(A$,W+1,1)) : REM GET DATA TO WRITE 50145 PRINT CHR$(BYTE); 50150 GOSUB 20000 : IF ERR=0 THEN PRINT "ERR RND WR 3" : GOSUB 6000 :RETURN 50160 GOSUB 6000 : REM STOP 50170 NEXT W 50180 RETURN 55000 REM READ DATA A BYTE AT A TIME 55005 FINAL=1 55010 FOR W = 0 TO (NB-1) 55020 GOSUB 60100 : REM WAIT FOR EEPROM TO BE READY 55030 IF ERR = 0 THEN PRINT "EEPROM NOT AVAILABLE" : RETURN 55050 HB=((SRC + W)/256) AND 31 : REM GET HIGH BYTE OF ADDRESS 55060 LB=((SRC + W) AND 255) : REM GET LOW BYTE OF ADDRESS 55100 BYTE=HB : REM WRITE THE HIGH ADRRESS 55110 GOSUB 20000 : IF ERR=0 THEN PRINT "ERR RND RD 1" : GOSUB 6000 :RETURN 55120 BYTE=LB : REM WRITE THE LOW ADDRESS 55130 GOSUB 20000 : IF ERR=0 THEN PRINT "ERR RND RD 2" : GOSUB 6000 :RETURN 55135 GOSUB 6000 : REM STOP 55140 GOSUB 5000 : REM START 55150 BYTE=175 : REM EEPROM ADDR = 0xAE WITH READ (0xAF) 55160 GOSUB 20000 : IF ERR=0 THEN RETURN : REM WRITE EEPROM,CHK ACK BIT 55170 GOSUB 30000 : REM READ BYTE 55180 PRINT CHR$(BYTE); 55190 GOSUB 6000 : REM STOP 55200 NEXT W 55210 RETURN 55500 REM WRITE SEQUENTIAL 55510 CL = 0 : REM CL = CURRENT LOCATION WITHIN SRC BYTES 55520 BTW = PG - (DEST AND 31) : REM BTW = BYTES LEFT IN PAGE 55530 GOSUB 60100 : REM WAIT FOR EEPROM TO BE READY 55540 IF ERR = 0 THEN PRINT "EEPROM NOT AVAILABLE" : RETURN 55550 GOSUB 56000 : REM SEND THE WRITE ADDRESS 55560 DEST = DEST+BTW : REM ADVANCE THE WRITE POINTER 55570 GOSUB 57000 : REM WRITE BTW BYTES 55580 IF CL < EN THEN GOTO 55520 : REM END OF THE SRC BYTES? 55590 RETURN : REM YES THEN RETURN 56000 REM SET THE WRITE ADDRESS 56010 HB=(DEST/256) AND 31 : REM GET HIGH BYTE OF ADDRESS 56020 LB=(DEST AND 255) : REM GET LOW BYTE OF ADDRESS 56030 BYTE=HB : REM WRITE THE HIGH ADRRESS 56040 GOSUB 20000 : IF ERR=0 THEN PRINT "ERR WR ADD 1" : GOSUB 6000 :RETURN 56050 BYTE=LB : REM WRITE THE LOW ADDRESS 56060 GOSUB 20000 : IF ERR=0 THEN PRINT "ERR WR ADD 2" : GOSUB 6000 :RETURN 56070 RETURN 57000 REM WRITE AT MOST PAGE SIZE NUMBER OF BYTES 57010 FOR W=0 TO BTW-1 57020 BYTE=ASC(MID$(A$,CL+1,1)) : REM GET DATA TO WRITE 57040 PRINT CHR$(BYTE); 57050 GOSUB 20000 : IF ERR=0 THEN PRINT "ERR PAGE WR" : GOSUB 6000:RETURN 57055 CL=CL+1 57056 IF CL >= EN THEN GOSUB 6000 : RETURN 57060 NEXT W 57070 GOSUB 6000 57080 RETURN 58000 REM READ SEQUENTIAL 58020 GOSUB 60100 : REM WAIT FOR EEPROM TO BE READY 58030 IF ERR = 0 THEN PRINT "EEPROM NOT AVAILABLE" : RETURN 58050 HB=(SRC/256) AND 31 : REM GET HIGH BYTE OF ADDRESS 58060 LB=(SRC AND 255) : REM GET LOW BYTE OF ADDRESS 58100 BYTE=HB : REM WRITE THE HIGH ADRRESS 58110 GOSUB 20000 : IF ERR=0 THEN PRINT "ERR SEQ RD 1" : GOSUB 6000 :RETURN 58120 BYTE=LB : REM WRITE THE LOW ADDRESS 58130 GOSUB 20000 : IF ERR=0 THEN PRINT "ERR SEQ RD 2" : GOSUB 6000 :RETURN 58135 GOSUB 6000 : REM STOP 58140 GOSUB 5000 : REM START 58150 BYTE=175 : REM EEPROM ADDR = 0xAE WITH READ (0xAF) 58160 GOSUB 20000 : IF ERR=0 THEN RETURN:REM WRITE EEPROM,CHK ACK BIT 58165 FINAL=0 58170 FOR W=0 TO (NB-1) 58175 IF W=(NB-1) THEN FINAL=1 58180 GOSUB 30000 : REM READ BYTE 58190 PRINT CHR$(BYTE); 58200 NEXT W 58210 GOSUB 6000 : REM STOP 58220 RETURN 60100 REM WAIT FOR THE EEPROM TO BE READY 60110 FOR TRY=0 TO 2 60120 GOSUB 5000 : REM START 60130 BYTE=174 : REM EEPROM ADDR = 0xAE WITH WRITE 60140 GOSUB 20000 60150 IF ERR=1 THEN RETURN 60160 NEXT TRY 60170 GOSUB 6000 : REM STOP 60180 RETURN