77 lines
2.4 KiB
Plaintext
77 lines
2.4 KiB
Plaintext
import platform.pch.pic as pic
|
||
import drivers.serial.uart.su8250 as su8250
|
||
import asm
|
||
import viperlib
|
||
import t, c
|
||
|
||
|
||
# 串口初始化
|
||
def init():
|
||
# 初始化COM1端口
|
||
su8250.init(su8250.COM1_PORT)
|
||
# 启用COM1中断(IRQ4)
|
||
pic.clearMask(4)
|
||
|
||
# 发送一个字符到COM1
|
||
def putc(cr: t.CChar):
|
||
su8250.putchar(su8250.COM1_PORT, cr)
|
||
|
||
def putchar(cr: t.CChar):
|
||
su8250.putchar(su8250.COM1_PORT, cr)
|
||
|
||
# 从COM1读取一个字符
|
||
def getchar() -> t.CChar:
|
||
return su8250.getchar(su8250.COM1_PORT)
|
||
|
||
# 发送一个字符串到COM1
|
||
def puts(s: str):
|
||
# 逐个字符发送,直接复用putchar的逻辑
|
||
for i in s:
|
||
putchar(i)
|
||
|
||
# 检查COM1是否有数据可读
|
||
def isDataAvailable() -> t.CInt:
|
||
return su8250.isDataAvailable(su8250.COM1_PORT)
|
||
|
||
# 检查COM1发送缓冲区是否为空
|
||
def isTransmitEmpty() -> t.CInt:
|
||
return su8250.isTransmitEmpty(su8250.COM1_PORT)
|
||
|
||
# 发送32位十六进制值到COM1
|
||
def put_hex32(value: t.CUInt32T):
|
||
hex_digits: t.CArray[t.CChar, None] = ["0123456789ABCDEF"]
|
||
buffer: t.CArray[t.CChar, 9]
|
||
for i in range(7, -1, -1):
|
||
buffer[i] = hex_digits[value & 0xF]
|
||
value >>= 4
|
||
buffer[8] = '\0'
|
||
puts(buffer)
|
||
|
||
|
||
# 格式化输出到串口(printf 实现,覆盖 libc printf 的裸机缺失)
|
||
# 内部复用 viperlib.vsnprintf 格式化到栈缓冲,再逐字符送串口。
|
||
# print(...) 内建映射到 @printf(stdio extern),此定义提供裸机实现。
|
||
def printf(fmt: t.CConst | str, *args) -> t.CInt | t.CExport:
|
||
if fmt is None:
|
||
return 0
|
||
buf: t.CArray[t.CChar, 1024]
|
||
n: t.CInt = viperlib.vsnprintf(c.Addr(buf), 1024, fmt, args)
|
||
puts(buf)
|
||
return n
|
||
|
||
|
||
# 刷新输出流:串口是无缓冲直写(putchar 直接写 UART 端口),flush 即空操作。
|
||
# 覆盖 libc fflush 的裸机缺失(memhub 的诊断/终止路径 call @fflush)。
|
||
def fflush(stream: t.CConst | t.CVoid | t.CPtr) -> t.CInt | t.CExport:
|
||
return 0
|
||
|
||
|
||
# 系统退出:触发硬件关机(QEMU ACPI/Bochs 关机端口),失败则停机兜底。
|
||
# 覆盖 libc exit 的裸机缺失(memhub 等致命错误路径 call @exit)。
|
||
def exit(status: int) -> t.CInt | t.CExport:
|
||
asm.outw(0x604, 0x2000) # QEMU ACPI 关机
|
||
asm.outw(0xB004, 0x2000) # Bochs/QEMU 备用端口
|
||
while True:
|
||
asm.hlt()
|
||
return 0
|