Files
ueforth/pico-ice/ice40/ice40_storage.fs
2025-11-14 22:00:32 -08:00

204 lines
5.4 KiB
Forth

\ Copyright 2025 Bradley D. Nelson
\
\ Licensed under the Apache License, Version 2.0 (the "License");
\ you may not use this file except in compliance with the License.
\ You may obtain a copy of the License at
\
\ http://www.apache.org/licenses/LICENSE-2.0
\
\ Unless required by applicable law or agreed to in writing, software
\ distributed under the License is distributed on an "AS IS" BASIS,
\ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
\ See the License for the specific language governing permissions and
\ limitations under the License.
needs ice40_config.fs
ice40 definitions
vocabulary storage storage definitions
: ew! ( n a -- ) over 8 rshift over c! 1+ c! ;
: w, ( n -- ) here ew! 2 allot ;
create header1
$ff c, $00 c, $00 c, $ff c, ( Init blop, maybe not needed? )
$7e c, $aa c, $99 c, $7e c, ( Preamble )
$51 c, $00 c, ( Frequency 0=low, 1=medium, 2=high )
$01 c, $05 c, ( Reset CRC crc = 0xffff )
here header1 - constant header1#
create header2
$92 c, $0020 w, ( Set flags bit0=nosleep bit5=warmboot )
$62 c, cram-bank-width 1- w, ( Set bank width )
$82 c, $0000 w, ( Set bank offset to 0 )
here header2 - constant header2#
0 value bank-id
0 value bank-height
create bank-header
$72 c, here to bank-height 0 w, ( Set bank height, 5k only, upper vs lower )
$11 c, here to bank-id 0 c, ( Set bank )
$01 c, $01 c, ( Prefix )
here bank-header - constant bank-header#
create bank-footer
$00 c, $00 c, ( Suffix )
here bank-footer - constant bank-footer#
create header3
$72 c, bram-chunk-size w, ( Setting bank height? )
here header3 - constant header3#
0 value bram-bank
create bram-header1
$11 c, here to bram-bank 0 c, ( Setting bank )
here bram-header1 - constant bram-header1#
0 value bram-offset
0 value bram-bank-width
create bram-header2
$82 c, here to bram-offset 0 w, ( Setting bank offset )
$62 c, here to bram-bank-width 0 w, ( Setting bank width )
here bram-header2 - constant bram-header2#
0 value footer-crc
create footer
$22 c, here to footer-crc $0000 w, ( CRC )
$01 c, $06 c, ( Wakeup )
$00 c, ( Padding )
here footer - constant footer#
variable crc16
: +crc16 ( ch -- )
7 for
dup i rshift 1 and ( peel off one bit )
crc16 uw@ 15 rshift xor if $1021 else 0 then
crc16 uw@ 2* xor crc16 w!
next
drop
;
: *crc16 ( a n -- ) for aft dup c@ +crc16 1+ then next drop ;
: crc-write ( a n output -- ) >r 2dup *crc16 r> execute ;
: cram-write { output -- }
( write header )
header1 header1# output execute
$ffff crc16 w!
header2 header2# output crc-write
( Bank 0 )
0 bank-id c!
cram-height-lower bank-height ew!
bank-header bank-header# output crc-write
cram cram-bank-width cram-height-lower * 8 / output crc-write
bank-footer bank-footer# output crc-write
( Bank 1 )
1 bank-id c!
cram-height-upper bank-height ew!
bank-header bank-header# output crc-write
cram cram-bank-width cram-height-lower * 8 / +
cram-bank-width cram-height-upper * 8 / output crc-write
bank-footer bank-footer# output crc-write
( Bank 2 )
2 bank-id c!
cram-height-lower bank-height ew!
bank-header bank-header# output crc-write
cram cram-bank-width cram-height-lower cram-height-upper + * 8 / +
cram-bank-width cram-height-lower * 8 / output crc-write
bank-footer bank-footer# output crc-write
( Bank 3 )
3 bank-id c!
cram-height-upper bank-height ew!
bank-header bank-header# output crc-write
cram cram-bank-width cram-height-lower 2* cram-height-upper + * 8 / +
cram-bank-width cram-height-upper * 8 / output crc-write
bank-footer bank-footer# output crc-write
( BRAM Header )
header3 header3# output crc-write
( BRAM Bank 0 )
0 bram-bank c!
bram-header1 bram-header1# output crc-write
bram-chunk-size 0 * bram-offset ew!
bram-width-lower 1- bram-bank-width ew!
bram-header2 bram-header2# output crc-write
bram-chunk-size 1 * bram-offset ew!
bram-width-lower 1- bram-bank-width ew!
bram-header2 bram-header2# output crc-write
( BRAM Bank 1 )
1 bram-bank c!
bram-header1 bram-header1# output crc-write
bram-chunk-size 0 * bram-offset ew!
bram-width-upper 1- bram-bank-width ew!
bram-header2 bram-header2# output crc-write
bram-chunk-size 1 * bram-offset ew!
bram-width-upper 1- bram-bank-width ew!
bram-header2 bram-header2# output crc-write
( BRAM Bank 2 )
2 bram-bank c!
bram-header1 bram-header1# output crc-write
bram-chunk-size 0 * bram-offset ew!
bram-width-lower 1- bram-bank-width ew!
bram-header2 bram-header2# output crc-write
bram-chunk-size 1 * bram-offset ew!
bram-width-lower 1- bram-bank-width ew!
bram-header2 bram-header2# output crc-write
( BRAM Bank 3 )
3 bram-bank c!
bram-header1 bram-header1# output crc-write
bram-chunk-size 0 * bram-offset ew!
bram-width-upper 1- bram-bank-width ew!
bram-header2 bram-header2# output crc-write
bram-chunk-size 1 * bram-offset ew!
bram-width-upper 1- bram-bank-width ew!
bram-header2 bram-header2# output crc-write
( write footer )
$22 +crc16 ( Add first byte of footer )
crc16 uw@ footer-crc ew! ( Update CRC )
footer footer# output crc-write
;
0 value save-fh
: save-write ( a n -- ) save-fh write-file throw ;
ice40 definitions also storage
: save ( a n -- )
w/o bin create-file throw to save-fh
['] save-write cram-write
save-fh close-file throw
;
DEFINED? ice [IF]
also ice
DEFINED? ice_cram_open [IF]
: deploy
ice_cram_open
['] ice_cram_write cram-write
ice_cram_close
;
[THEN]
previous
[THEN]
previous
forth definitions