+ for c in str
+ switch c
+ when '\t' # tab
+ @update_text " ".substr(@x % 8)
+ when '\x07' # bell
+ false
+ when '\x0d' # cr
+ @x = 0
+ when '\x08' # backspace
+ if @x > 0
+ @x -= 1
+ @text[@y][@x] = ' '
+ # should this set the attribute too?
+ when '\x0a', '\x0b' # lf, vertical tab (same thing)
+ @wrap_to_next_line()
+ else
+ @text[@y][@x] = c
+ @attributes[@y][@x] = @a
+ @x += 1
+ if @x is @width
+ @wrap_to_next_line()
+ return
+
+ set_attribute_bits: (mask, value) ->
+ @a = (@a & ~mask) | value
+
+ csi_m: default: "0", go: ->
+ for i in arguments
+ switch i
+ when '0'
+ @set_attribute_bits 0xffffff, 0
+ when '1' # bold
+ @set_attribute_bits 0x100, 1
+ when '4' # underline
+ @set_attribute_bits 0x200, 1
+ when '5' # blink
+ @set_attribute_bits 0x400, 1
+ when '8' # invisible
+ @set_attribute_bits 0x800, 1
+
+ when '22' # not bold... according to a page
+ @set_attribute_bits 0x100, 0
+ when '21' # ... though this would make more sense for "not bold"
+ @set_attribute_bits 0x100, 0
+ when '24' # not underline
+ @set_attribute_bits 0x200, 0
+ when '25' # not blink
+ @set_attribute_bits 0x400, 0
+ when '28' # not invisible
+ @set_attribute_bits 0x800, 0
+
+ when '30' # fg black
+ @set_attribute_bits 0xff, 0
+ when '31' # fg red
+ @set_attribute_bits 0xff, 0xe0
+ when '32' # fg green
+ @set_attribute_bits 0xff, 0x1c
+ when '33' # fg yellow
+ @set_attribute_bits 0xff, 0xfc
+ when '34' # fg blue
+ @set_attribute_bits 0xff, 0x02
+ when '35' # fg magenta
+ @set_attribute_bits 0xff, 0xe2
+ when '36' # fg cyan
+ @set_attribute_bits 0xff, 0x1f
+ when '37', '39' # fg white (39 is default)
+ @set_attribute_bits 0xff, 0xff
+
+ when '40' # bg black
+ @set_attribute_bits 0xff00, 0
+ when '41' # bg red
+ @set_attribute_bits 0xff00, 0xe000
+ when '42' # bg green
+ @set_attribute_bits 0xff00, 0x1c00
+ when '43' # bg yellow
+ @set_attribute_bits 0xff00, 0xfc00
+ when '44' # bg blue
+ @set_attribute_bits 0xff00, 0x0200
+ when '45' # bg magenta
+ @set_attribute_bits 0xff00, 0xe200
+ when '46' # bg cyan
+ @set_attribute_bits 0xff00, 0x1f00
+ when '47', '49' # bg white (49 is default)
+ @set_attribute_bits 0xff00, 0xff
+
+ else
+ # if we don't recognize the style, go back to default
+ @set_attribute_bits 0xffffff, 0
+ return