sourcelibs/Bits/demos/record.xtl
1⍝!/usr/bin/env xetal
2⍝# A packed record: a device register keeps three settings in one whole
3⍝# number. f_ields< names its bit fields when the program is compiled:
4⍝# it writes a getter and a setter per field, the shifts and masks
5⍝# worked out as plain numbers, so the program reads and writes fields
6⍝# by name. Run with "just demo Bits record".
7
8ᵇ⁼u̲se< "Bits"
9@ ᵇf̲ields< "on:1 mode:3 level:8"
10reg ← 0
11reg ← 1 ᵘs̲etOn reg
12reg ← 5 ᵘs̲etMode reg
13reg ← 200 ᵘs̲etLevel reg
14reg ⍝ all three in one number
1516 ᵇb̲its reg ⍝ level, mode, on: from the high bits down
16(ᵘo̲n reg) c̲at (ᵘm̲ode reg) c̲at ᵘl̲evel reg
17ᵘm̲ode 3 ᵘs̲etMode reg ⍝ one field changed, the others kept
18ᵘl̲evel 0 18 45 2025 ⍝ every item of a list at once
ᵇf̲ields< expands to
ᵘo̲n ← { x → (x d̲iv 1) m̲od 2 } ᵘs̲etOn ← { v x → x + (1 × v m̲od 2) − 1 × (x d̲iv 1) m̲od 2 } ᵘm̲ode ← { x → (x d̲iv 2) m̲od 8 } ᵘs̲etMode ← { v x → x + (2 × v m̲od 8) − 2 × (x d̲iv 2) m̲od 8 } ᵘl̲evel ← { x → (x d̲iv 16) m̲od 256 } ᵘs̲etLevel ← { v x → x + (16 × v m̲od 256) − 16 × (x d̲iv 16) m̲od 256 }