⍝ Hex dump of native file. ⍝ Hexdump uses ⍞← and ←⍞ for input/output. For testing, we modify ⍝ the temporary copy of the function in this namespace to input ⍝ from variable ∆i and output to variable ∆o. ⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝ ∆in←{ ⍝ input from buffer ⍝ nl←⊃⌽⎕tc ⍝ in←(∧\nl≠∆i)/∆i ⍝ buf←⍵,in ⍝ ∆o,←buf,nl ⍝ {buf}∆i∘←(1+⍴in)↓∆i ⍝ } ⍝ ⍝ qp←'⍞⊣⍞←' '∆in'∘subs ⍝ subs quote quad prompt ⍝ qt←'⍞←' '_←{∆o,←⍵}'∘subs ⍝ subs quote quad output ⍝ ⍝ _←⎕fx qt qp ⎕cr'hexdump' ⍝ modify function. ⍝ ⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝ make←{ ⍝ make test file. 22::⍵ ⎕ncreate 0 ⍝ create if not already there. tie←⍵ ⎕ntie 0 ⍝ attempt to tie and {tie}0 ⎕nresize tie ⍝ empty file. } nfid←'hexdump test file' ⍝ test file. ntie←make nfid ⍝ create file. _←(323type⍳4)⎕nappend ntie ⍝ 32-bit words 1 2 3 4 _←'hexdump test'⎕nappend ntie ⍝ char vector _←(323type 0 ¯1)⎕nappend ntie ⍝ 32-bit words 0··0 f··f ⎕nsize ntie 36 _←⎕nuntie ntie ⍝ release ⍝ accumulate from script: in←{{1:}_in,←⍵,⊃⌽⎕tc} ⍝ append command. ⍝ Command Stream: _in←'' ⍝ null cmd vector. in'\\0\⎕dw=0' in' ⍝ base' in'100\⊥\10\0\!\⊥' in'c * ⍝ indirect' in'? ⍝ help' in' ⍝ arithmetic:' in'+10\-8\×5\÷3\%10' in'''msg'' ⍝ message' in'msg=''hello\ world''' in'msg ⍝ multi-msg' in'along = )+4( ⍝ macro defn' in'( ⍝ call' in'100 ⍝ go 100' in'along ⍝ macro call' in') ⍝ retn' in'(1 :+ :- :× :÷)4 ⍝ select case' in'0(⊤(0:+4)) ⍝ trace' in'<sub ⍝ include subscript' in'<sub1 ⍝ test <indentation' in'eh ⍝ error' in'reps=(::dec-1reps)' in'9reps' in'1000hex ⍝ conv dec to hex\0' in'(10 ascs)' in'(2+\(\3)\)' in'1+(1+(1+1)) ⍝ right arg' in'⎕dw=2 ⍝ 2 cols' in'←dead' in'(8←(beef×10000))' in'0⎕dw=0' in'sum ⍵ = + ⍵' in'2 sum 3' in'osc⍵=(⍵ dec'' ''::1:(⍵%2:osc(⍵÷2):osc(⍵×3+1)))' in'osc 7' in')' ⍝ Input and output buffers: ∆i←'\'(⊃⌽⎕tc)subs _in ∆o←'' ⍝ subscripts: sub←'''hello world''' ⍝ subscript. sub1←'\'(⊃⌽⎕tc)subs 'ok='':-(''\⍝\ <sub2\ ok='':-)''\ok' sub2←'sub2=' ⍝ chars script: _in←'' ⍝ null cmd vector. in'ascs=(*%100::(*%100 asc) +1 ascs) ⍝ ASCII string from file.' in'' in'asc=( ⍝ ASCII char translation.' in' :''⌷'':'''':'''':'''':'''':'''':'''':'''':''·'':'' '':''' in' '' :''⌶'':'' '':''·'':''ɫ'':''^''' in' :''Ø'':''É'':''Ü'':''À'':''Ö'':''Ñ'':''Æ'':''ø'':''Ä'':''Å'':''í'':'''':''´'':''∣'':'''':''''' in' :'' '':''!'':''"'':''#'':''$'':''%'':''&'':'''''''':''('':'')'':''*'':''+'':'','':''-'':''.'':''/''' in' :''0'':''1'':''2'':''3'':''4'':''5'':''6'':''7'':''8'':''9'':'':'':'';'':''<'':''='':''>'':''?''' in' :''@'':''A'':''B'':''C'':''D'':''E'':''F'':''G'':''H'':''I'':''J'':''K'':''L'':''M'':''N'':''O''' in' :''P'':''Q'':''R'':''S'':''T'':''U'':''V'':''W'':''X'':''Y'':''Z'':''['':''\'':'']'':''∧'':''_''' in' :''`'':''a'':''b'':''c'':''d'':''e'':''f'':''g'':''h'':''i'':''j'':''k'':''l'':''m'':''n'':''o''' in' :''p'':''q'':''r'':''s'':''t'':''u'':''v'':''w'':''x'':''y'':''z'':''{'':''|'':''}'':''~'':''''' in' :''⊢'':''⊣'':''⊤'':''⊥'':''←'':''→'':''↑'':''↓'':''≤'':''≥'':''⍲'':''⍱'':''⎕'':''⍞'':''⌹'':''⍙''' in' :''⍫'':''∆'':''∇'':''⍋'':''⍒'':''⍕'':''⍎'':''⌈'':''⌊'':''⍀'':''⌿'':''⊂'':''⊃'':''∩'':''∪'':''∨''' in' :'' '':''¡'':''¢'':''£'':''⊢'':''¥'':''⌷'':''§'':''¨'':''⍝'':''⋄'':''⍬'':''≠'':''≡'':''⍪'':''¯''' in' :''∘'':''○'':''⌽'':''⍉'':''⊖'':''⍟'':''¶'':''·'':''⍺'':''∊'':''⍷'':''≢'':''⍳'':''⍴'':''⍵'':''¿''' in' :''└'':''Á'':''Â'':''Ã'':''┴'':''┬'':''├'':''Ç'':''È'':''┐'':''Ê'':''Ë'':''Ì'':''Í'':''Î'':''Ï''' in' :''Ð'':''─'':''Ò'':''Ó'':''Ô'':''Õ'':''┼'':''×'':''┘'':''Ù'':''Ú'':''Û'':''┌'':''Ý'':''þ'':''ß''' in' :''à'':''á'':''â'':''ã'':''ä'':''å'':''æ'':''ç'':''è'':''é'':''ê'':''ë'':''ì'':''│'':''î'':''ï''' in' :''ð'':''ñ'':''ò'':''ó'':''ô'':''õ'':''ö'':''÷'':''┤'':''ù'':''ú'':''û'':''ü'':''ý'':''⍨'':''⍣''' in' )' chars←_in ⍝ hexdec script: _in←'' in'dec = (:''0'':''1'':''2'':''3'':''4'':''5'':''6'':''7'':''8'':''9'':(÷a dec)(%a dec))' in'' in'hex =' in' . = ÷10 sub × a +' in' sub = (::(%10:.0:.1:.2:.3:.4:.5:.6:.7:.8:.9))' in' sub' hexdec←_in ('←',chars,hexdec)hexdump nfid ⋄ ∆o ⍝ accumulated output. 00000000:·00000001 00000002 00000003 00000004· 00000010:·64786568 20706d75 74736574 00000000· 00000020:·ffffffff·0 00000000:·00000001 00000002 00000003 00000004·⎕dw=0 00000000:· ⍝ base 00000000:·100 00000100:·⊥ 00000100:·10 00000110:·0 00000100:·! 00000000:·⊥ 00000000:·c * ⍝ indirect 00000004:·? ⍝ help hex set file position. + hex increment. - hex decrement. × hex multiply. ÷ hex integer divide. % hex integer remainder. ( call. ) return. * get word from file. ← hex put word to file. ⊥ set base address. ! absolute position. : case select case. '···' display message. ? help. < var include subscript. ⊤ trace on/off. ⍝ comment. name = niladic macro. name ⍵ = monadic macro. ⎕dw = display width 0-8. ⎕be = big-endian 0/1. 00000004:· ⍝ arithmetic: 00000004:·+10 00000014:·-8 0000000c:·×5 0000003c:·÷3 00000014:·%10 00000004:·'msg' ⍝ message msg 00000004:·msg='hello world' 00000004:·msg ⍝ multi-msg hello world 00000004:·along = )+4( ⍝ macro defn 00000004:·( ⍝ call 00000004:··100 ⍝ go 100 00000100:··along ⍝ macro call 00000008:··) ⍝ retn 00000008:·(1 :+ :- :× :÷)4 ⍝ select case 00000004:·0(⊤(0:+4)) ⍝ trace 00000000⊤··(0:+4)) ⍝ trace 00000000⊤···0:+4)) ⍝ trace 00000000⊤···:+4)) ⍝ trace 00000000⊤···)+4) ⍝ trace 00000000⊤··+4) ⍝ trace 00000000⊤··4) ⍝ trace 00000004⊤··) ⍝ trace 00000000:·<sub ⍝ include subscript hello world 00000000:·<sub1 ⍝ test <indentation :-) 00000000:·eh ⍝ error eh? 00000000:·reps=(::dec-1reps) 00000000:·9reps 987654321 00000000:·1000hex ⍝ conv dec to hex 000003e8:·0 00000000:·(10 ascs) hexdump test 00000000:·(2+ 00000002:··( 00000002:···3) 00000005:··) 00000000:·1+(1+(1+1)) ⍝ right arg 00000004:·⎕dw=2 ⍝ 2 cols 00000004:·00000002 00000003·←dead 00000004:·0000dead 00000003·(8←(beef×10000)) 00000004:·0000dead beef0000·0⎕dw=0 00000000:·sum ⍵ = + ⍵ 00000000:·2 sum 3 00000005:·osc⍵=(⍵ dec' '::1:(⍵%2:osc(⍵÷2):osc(⍵×3+1))) 00000005:·osc 7 7 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1 00000001:·) ⎕ndelete nfid ⍝ remove file. ⍝∇ hexdump subs type Back to: code Back to: Workspaces