| // 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)) | |
| } | |
| } |