Skip to content

Instantly share code, notes, and snippets.

@cookie-s
Last active December 28, 2020 23:21
Show Gist options
  • Save cookie-s/935bd85fb578a540d7214b6d5d18bb84 to your computer and use it in GitHub Desktop.
Save cookie-s/935bd85fb578a540d7214b6d5d18bb84 to your computer and use it in GitHub Desktop.
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