====== 7-Segment-Emulation ====== Der Ansatz ist eine 7-Segment-Emulation. Das Array ''7seg'' wandelt Ziffern in 7-Segment-Codes, und ''lines'' gibt an, welches Bit wo schaltet. \ 5 \ 7 2 \ 4 \ 6 1 \ 30 Create 7seg $EE c, $06 c, $7C c, $3E c, $96 c, $BA c, $FA c, $26 c, $FE c, $BE c, Create lines 0 c, $20 c, 0 c, $80 c, 0 c, 4 c, 0 c, $10 c, 0 c, $40 c, 0 c, 2 c, 0 c, 8 c, 1 c, 2 value size : >size ( line -- size ) 1 and IF size ELSE 1 THEN ; : set? ( digit i -- digit i flag ) 2dup lines + c@ and ; : .seg| ( digit i -- digit i' ) set? IF '| ELSE bl THEN emit 1+ ; : .seg- ( digit i -- digit i' ) set? IF '- ELSE bl THEN emit 1+ ; : 7seg-line ( dig line -- ) 7seg + c@ swap 3 * .seg| size 0 ?DO .seg- 1- LOOP 1+ .seg| space 2drop ; : .lcd-line ( addr u -- addr u ) cr >r 2dup r> -rot bounds ?DO dup I c@ '0 - 7seg-line LOOP ; : .lcd-lines ( addr u line -- addr u ) dup >size 0 ?DO .lcd-line LOOP drop ; : .lcd-string ( addr u -- ) 5 0 DO I .lcd-lines LOOP 2drop ; : .lcd ( x -- ) 0 <# #s #> .lcdstring ;