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"
ᵇ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 }
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