Last active
December 28, 2020 23:21
-
-
Save cookie-s/935bd85fb578a540d7214b6d5d18bb84 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require 'curses' | |
progs = [ | |
'-.+', | |
'----[---->+<]>--.', | |
'--[--->+<]>.++++.------.-[--->+<]>--.+++++[->+++<]>.-.---------.+++++++++++++..---.+++.[-->+<]>++++.+[-->+<]>+++.[--->++<]>.+++.------------.--.--[--->+<]>-.-----------.', | |
'++++++.-.[----->++<]>++.+[--->+<]>+++.++++++++++.-------------.+.+++[->+++<]>++.-[--->++<]>-.----[->+++<]>-.++++++++++++..----.[-->+<]>++.-----------..-[--->++<]>--.', | |
'-------------.++++++++++++.++++.++[->+++<]>.[--->+<]>----.+.++[->+++<]>.+++++++.+++++.[----->++<]>++.--[-->+++++<]>.---------.[--->+<]>---.[++>---<]>+.-[--->++<]>--.++[++>---<]>+.', | |
'---[->++<]>....+[--->+++++<]>.[--->++<]>---.++++.+[--->+<]>.+++++++++++.------------.-[--->+<]>-.--------.--------.+++++++++.++++++.[++>---<]>.--[--->+<]>-.++++++++++++..----.--.----.', | |
'+[--->+<]>.--.---[->++++<]>-.-.++++[->+++<]>+.[--->++<]>-----.-[->++<]>.[-->+<]>+.', | |
'[-<+]+', | |
'>->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+>', | |
] | |
prog = progs.join | |
mem = 0.chr*4000 | |
bptr = 1024 | |
mbase = mptr = 1136 | |
# pbase = pptr = 2144 | |
pbase = pptr = 1024 + 256 | |
mem[pptr, prog.size] = prog | |
step = ->() { | |
return false if mem[pptr].ord == 0 | |
case mem[pptr] | |
when '>' then mptr += 1 | |
when '<' then mptr -= 1 | |
when '+' then mem[mptr] = ((mem[mptr].ord + 1)%256).chr | |
when '-' then mem[mptr] = ((mem[mptr].ord + 255)%256).chr | |
when '[' | |
if mem[mptr] == 0.chr | |
dep = 1 | |
until dep == 0 | |
pptr += 1 | |
case mem[pptr] | |
when '[' then dep += 1 | |
when ']' then dep -= 1 | |
end | |
end | |
end | |
when ']' | |
unless mem[mptr] == 0.chr | |
dep = 1 | |
until dep == 0 | |
pptr -= 1 | |
case mem[pptr] | |
when '[' then dep -= 1 | |
when ']' then dep += 1 | |
end | |
end | |
end | |
when '.' | |
mem[bptr] = mem[mptr] | |
bptr += 1 | |
else | |
raise 'a' | |
end | |
pptr += 1 | |
true | |
} | |
chr = ->(x) { | |
return x.chr if 0x20 <= x && x < 0x7E | |
' ' | |
} | |
Curses.init_screen | |
Curses.start_color | |
NPTR_C = 0; | |
MPTR_C = 1; Curses.init_pair(MPTR_C, Curses::COLOR_BLACK, Curses::COLOR_RED) | |
PPTR_C = 2; Curses.init_pair(PPTR_C, Curses::COLOR_BLACK, Curses::COLOR_GREEN) | |
BPTR_C = 3; Curses.init_pair(BPTR_C, Curses::COLOR_BLACK, Curses::COLOR_CYAN) | |
begin | |
pk = 0 | |
ppi = -1 | |
(0..).each do |k| | |
w = 32 | |
h = 15 | |
bs = 1024 - 64 | |
Curses.setpos 0, 0 | |
Curses.attrset Curses.color_pair(NPTR_C) | |
Curses.addstr k.to_s | |
Curses.setpos 0, 8 | |
Curses.attrset Curses.color_pair(BPTR_C) | |
Curses.addstr "BUFFER" | |
Curses.attrset Curses.color_pair(MPTR_C) | |
Curses.addstr "MEMORY" | |
Curses.attrset Curses.color_pair(PPTR_C) | |
Curses.addstr "PROGRAM" | |
pc = -1 | |
(1...h).each do |i| | |
Curses.attrset Curses.color_pair(NPTR_C) | |
Curses.setpos i, 0 | |
Curses.addstr "%04X: " % [bs + i*w] | |
w.times do |j| | |
addr = bs + i*w + j | |
cid = case addr | |
when mptr | |
MPTR_C | |
when bptr | |
BPTR_C | |
when pptr | |
PPTR_C | |
else | |
NPTR_C | |
end | |
Curses.attrset Curses.color_pair(cid) unless pc == cid | |
pc = cid | |
Curses.setpos i, 6 + j*3 | |
Curses.addstr "%02X" % mem[addr].ord | |
Curses.setpos i, 6 + w*3+5 + j | |
Curses.addstr chr[mem[addr].ord] | |
end | |
end | |
pi = (progs.size.times.find{|x| progs[0,x].join.size > pptr - pbase} || progs.size) - 1 | |
pj = pptr - pbase - progs[0,pi].join.size | |
begin | |
Curses.setpos h+2, 0 | |
Curses.attrset Curses.color_pair(NPTR_C) | |
progs.each do |ln| | |
Curses.addstr ln + "\n" | |
end | |
Curses.setpos h+2+pi, pj | |
Curses.attrset Curses.color_pair(PPTR_C) | |
Curses.addstr progs[pi][pj] | |
end | |
Curses.refresh | |
sleep 1 if k == 0 | |
pk = 0 unless ppi == pi | |
ppi = pi | |
sleep (case | |
when pk == 0 | |
2 | |
when pk < 5 | |
0.5 | |
when pk < 20 | |
0.1 | |
when pk < 50 | |
0.05 | |
when pk < 100 | |
0.01 | |
else | |
0 | |
end | |
) | |
pk += 1 | |
break unless step[] | |
end | |
rescue | |
ensure | |
sleep 3 | |
Curses.close_screen | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment