summaryrefslogtreecommitdiff
path: root/src/pkg/runtime/tiny/io.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/pkg/runtime/tiny/io.go')
-rw-r--r--src/pkg/runtime/tiny/io.go53
1 files changed, 53 insertions, 0 deletions
diff --git a/src/pkg/runtime/tiny/io.go b/src/pkg/runtime/tiny/io.go
new file mode 100644
index 000000000..f30e68889
--- /dev/null
+++ b/src/pkg/runtime/tiny/io.go
@@ -0,0 +1,53 @@
+// Copyright 2010 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Simple CGA screen output
+
+package runtime
+
+import "unsafe"
+
+var crt *[25 * 80]uint16
+var pos int
+
+func putc(c int) {
+ const (
+ port = 0x3d4
+ color = 0x0700 // white on black
+ )
+
+ if crt == nil {
+ // init on demand in case printf is called before
+ // initialization runs.
+ var mem uintptr = 0xb8000
+ crt = (*[25 * 80]uint16)(unsafe.Pointer(mem))
+ pos = 0
+ for i := range crt[0:] {
+ crt[i] = 0
+ }
+ }
+
+ switch c {
+ case '\n':
+ pos += 80 - pos%80
+ default:
+ crt[pos] = uint16(c&0xff | color)
+ pos++
+ }
+
+ if pos/80 >= 24 {
+ copy(crt[0:], crt[80:])
+ pos -= 80
+ for i := 0; i < 80; i++ {
+ crt[24*80+i] = 0
+ }
+ }
+ crt[pos] = ' ' | color
+}
+
+func write(fd int32, b []byte) {
+ for _, c := range b {
+ putc(int(c))
+ }
+}