----[256]-------------------------------------------------------
            UTILS FOR MY4TH I2C LCD KEYBOARD
257      pca9557 and ds1307 utils
258      CH453 keyboard utils
259-260  keyboard scan code table
262-263  lcd4004 utils
264      lcd test
270-271  lcd4004 utils (fast)
382      i2c eeprom copy
383      i2c-detect







----[257]-------------------------------------------------------
: i2c-wr ( content regnum addr -- )
  i2c-start drop i2c-send drop i2c-send drop i2c-stop ;
: i2c-rr ( regnum addr -- val )
  2dup 1 or 2swap i2c-start drop i2c-send drop
  i2c-start 2drop 1 i2c-recv i2c-stop ;
: pca9557-pc ( addr -- ) $00 $02 rot i2c-wr ;
: pca9557-dir ( dir addr -- ) swap $03 rot i2c-wr ;
: pca9557-wo ( val addr -- ) swap $01 rot i2c-wr ;
: pca9557-ro ( addr -- val ) $01 swap i2c-rr ;
: pca9557-ri ( addr -- val ) $00 swap i2c-rr ;






----[258]-------------------------------------------------------
: i2c-detect
  base @ hex cr 127 1 do i 2* i2c-start 2 ms i2c-stop
  if i 2* . then loop cr base ! ;
: ch453-disp ( data dig -- )
  2 * $60 + i2c-start drop i2c-send drop i2c-stop ;
: ch453-disp-off 15 0 do 0 i ch453-disp loop ;
: ch453-setup ch453-disp-off
  $48 i2c-start drop %0_01_0_1_0_1_1 i2c-send drop i2c-stop ;
: ch453-getkey $4f i2c-start drop 1 i2c-recv i2c-stop ;
: ch453-getkey-wait-released ( -- key_scan_code )
  begin rinp $80 and 0= until ch453-getkey
  0 begin drop ch453-getkey dup 64 and 0= 10 ms until ;
: ch453-getkey-wait-pressed ( -- key_scan_code )
  0 begin drop ch453-getkey dup 64 and 10 ms until 63 and ;


----[259]-------------------------------------------------------
create sc-table 159 c, 160 c, 32 c, 128 c, 129 c, 130 c, 131 c,
  27 c, 122 c, 92 c, 115 c, 97 c, 119 c, 113 c, 50 c, 49 c,
  99 c, 120 c, 102 c, 100 c, 114 c, 101 c, 52 c, 51 c, 98 c,
  118 c, 104 c, 103 c, 121 c, 116 c, 54 c, 53 c, 109 c, 110 c,
  107 c, 106 c, 105 c, 117 c, 56 c, 55 c, 46 c, 44 c, 59 c,
  108 c, 112 c, 111 c, 48 c, 57 c, 47 c, 13 c, 39 c, 93 c,
  91 c, 8 c, 61 c, 45 c,
create sc-shift 161 c, 162 c, 132 c, 133 c, 134 c, 135 c, 136 c,
  137 c, 90 c, 124 c, 83 c, 65 c, 87 c, 81 c, 64 c, 33 c, 67 c,
  88 c, 70 c, 68 c, 82 c, 69 c, 36 c, 35 c, 66 c, 86 c, 72 c,
  71 c, 89 c, 84 c, 94 c, 37 c, 77 c, 78 c, 75 c, 74 c, 73 c,
  85 c, 42 c, 38 c, 62 c, 60 c, 58 c, 76 c, 80 c, 79 c, 41 c,
  40 c, 63 c, 138 c, 34 c, 125 c, 123 c, 139 c, 43 c, 95 c,
: sc-to-ascii ( sc -- ascii ) sc-table + c@ ;
: sc-sh-ascii ( sc -- ascii ) sc-shift + c@ ;

----[260]-------------------------------------------------------
create sc-ctrl 163 c, 164 c, 140 c, 141 c, 142 c, 143 c, 144 c,
145 c, 26 c, 28 c, 19 c, 1 c, 23 c, 17 c, 0 c, 96 c, 3 c, 24 c,
6 c, 4 c, 18 c, 5 c, 127 c, 126 c, 2 c, 22 c, 8 c, 7 c, 25 c,
20 c, 30 c, 146 c, 13 c, 14 c, 11 c, 10 c, 9 c, 21 c, 147 c,
148 c, 149 c, 150 c, 151 c, 12 c, 16 c, 15 c, 152 c, 153 c,
154 c, 155 c, 156 c, 29 c, 27 c, 157 c, 158 c, 31 c,
: sc-ct-ascii ( sc -- ascii ) sc-ctrl + c@ ;
: sc-key-ascii ( sc ctrl_shift -- ascii ) case
  3 of sc-to-ascii endof 2 of sc-sh-ascii endof
  1 of sc-ct-ascii endof 0 of 157 + endof
  >r drop 255 r> endcase ;





----[262]-------------------------------------------------------
: lcd-wi0 ( instr -- )
  $32 pca9557-ro %11101011 and %00001000 or swap
  $30 pca9557-wo $32 pca9557-wo
  $32 pca9557-ro %11110111 and $32 pca9557-wo ;
: lcd-wd0 ( data -- )
  $32 pca9557-ro %11111011 and %00011000 or swap
  $30 pca9557-wo $32 pca9557-wo
  $32 pca9557-ro %11110111 and $32 pca9557-wo ;
: lcd-wi1 ( instr -- )
  $32 pca9557-ro %11101011 and %00100000 or swap
  $30 pca9557-wo $32 pca9557-wo
  $32 pca9557-ro %11011111 and $32 pca9557-wo ;
: lcd-wd1 ( data -- )
  $32 pca9557-ro %11111011 and %00110000 or swap
  $30 pca9557-wo $32 pca9557-wo
  $32 pca9557-ro %11011111 and $32 pca9557-wo ;
----[263]-------------------------------------------------------
' lcd-wi0 value lcd-wia ' lcd-wd0 value lcd-wda
: lcd-init
  $30 pca9557-pc $32 pca9557-pc
  $00 $30 pca9557-dir %10000011 $32 pca9557-dir
  %00111000 dup lcd-wi0 lcd-wi1 1 ms
  %00111000 dup lcd-wi0 lcd-wi1 1 ms
  %00001100 dup lcd-wi0 lcd-wi1 $01 dup lcd-wi0 lcd-wi1 2 ms
  %00000110 dup lcd-wi0 lcd-wi1 ;
: lcd-wi lcd-wia execute ; : lcd-wd lcd-wda execute ;
: lcd-bl-on $32 pca9557-ro %01000000 or $32 pca9557-wo ;
: lcd-bl-off $32 pca9557-ro %10111111 and $32 pca9557-wo ;
: lcd-xy ( col row -- ) \ select LCD col(0-39) / row (0-3)
  dup 2 < if ['] lcd-wi0 to lcd-wia ['] lcd-wd0 to lcd-wda else
    ['] lcd-wi1 to lcd-wia ['] lcd-wd1 to lcd-wda 2 - then
  1 = if $40 or then $80 or lcd-wi ;
: lcd-p 1 - begin swap dup c@ lcd-wd 1+ swap 1- dup 0< until ;
----[264]-------------------------------------------------------
: lcd-test 0 0 lcd-xy
  s" 1234567890123456789012345678901234567890" lcd-p
  0 1 lcd-xy
  s" qwertyuiopqwertyuiopqwertyuiopqwertyuiop" lcd-p
  0 2 lcd-xy
  s" asdfghjkl;asdfghjkl;asdfghjkl;asdfghjkl;" lcd-p
  0 3 lcd-xy
  s" zxcvbnm,./zxcvbnm,./zxcvbnm,./zxcvbnm,./" lcd-p ;








----[270]-------------------------------------------------------
$32 pca9557-ro value iop1-o
: lcd-wi0 ( instr -- ) iop1-o %11101011 and %00001000 or swap
  $30 pca9557-wo dup $32 pca9557-wo
  %11110111 and dup $32 pca9557-wo to iop1-o ;
: lcd-wd0 ( data -- ) iop1-o %11111011 and %00011000 or swap
  $30 pca9557-wo dup $32 pca9557-wo
  %11110111 and dup $32 pca9557-wo to iop1-o ;
: lcd-wi1 ( instr -- ) iop1-o %11101011 and %00100000 or swap
  $30 pca9557-wo dup $32 pca9557-wo
  %11011111 and dup $32 pca9557-wo to iop1-o ;
: lcd-wd1 ( data -- ) iop1-o %11111011 and %00110000 or swap
  $30 pca9557-wo dup $32 pca9557-wo
  %11011111 and dup $32 pca9557-wo to iop1-o ;



----[271]-------------------------------------------------------
' lcd-wi0 value lcd-wia ' lcd-wd0 value lcd-wda
: lcd-init
  $30 pca9557-pc $32 pca9557-pc
  $00 $30 pca9557-dir %10000011 $32 pca9557-dir
  %00111000 dup lcd-wi0 lcd-wi1 1 ms
  %00111000 dup lcd-wi0 lcd-wi1 1 ms
  %00001100 dup lcd-wi0 lcd-wi1 $01 dup lcd-wi0 lcd-wi1 2 ms
  %00000110 dup lcd-wi0 lcd-wi1 ;
: lcd-wi lcd-wia execute ; : lcd-wd lcd-wda execute ;
: lcd-bl-on iop1-o %01000000 or dup $32 pca9557-wo to iop1-o ;
: lcd-bl-off iop1-o %10111111 and dup $32 pca9557-wo to iop1-o ;
: lcd-xy ( col row -- ) \ select LCD col(0-39) / row (0-3)
  dup 2 < if ['] lcd-wi0 to lcd-wia ['] lcd-wd0 to lcd-wda else
    ['] lcd-wi1 to lcd-wia ['] lcd-wd1 to lcd-wda 2 - then
  1 = if $40 or then $80 or lcd-wi ;
: lcd-p 1 - begin swap dup c@ lcd-wd 1+ swap 1- dup 0< until ;
----[EOF]-------------------------------------------------------




----[382]-------------------------------------------------------
: cp ( src dst -- )  swap block drop buffer drop update flush ;
: cps ( src dst count -- ) 0 do
    2dup 2dup swap cr ." Copying " . ." to " . cp
    1+ swap 1+ swap
  loop 2drop cr ." Done." cr ;
: cp0to1 256 384 128 cps ;










----[383]-------------------------------------------------------
: i2c-detect
  base @ hex cr 127 1 do i 2* i2c-start 2 ms i2c-stop
  if i 2* . then loop cr base ! ;













----[EOF]-------------------------------------------------------
