From 6cbb038b4221b68c4b8b3bd15600506226eb2352 Mon Sep 17 00:00:00 2001 From: Gale Faraday Date: Tue, 7 Oct 2025 00:36:12 -0500 Subject: [PATCH] feat(doc/buzbee): Added IF tables, added doc building system and updated stylesheet, removed pdf for now --- .gitignore | 1 + docs/buzbee.pdf | Bin 33962 -> 0 bytes docs/buzbee.typ | 181 +++++++++++++++++++++++++++++++++++++++++++++--- docs/style.typ | 8 ++- makefile | 5 +- 5 files changed, 182 insertions(+), 13 deletions(-) delete mode 100644 docs/buzbee.pdf diff --git a/.gitignore b/.gitignore index 1873f4c..6f0d903 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,7 @@ build/ map.txt bbmkhash +*.pdf # Build system generated files src/version.s diff --git a/docs/buzbee.pdf b/docs/buzbee.pdf deleted file mode 100644 index ada463c9bb112248ebaa0490acda837158703a4e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33962 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�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

sxA~ z9MRu6KVeJ6Z&=5Okrj ziqh3)rhR{W6X+7F1mz+dgaeZ>)_y^ZN#d9dFpM3n17BJ|HZGJr+kf5|9%P}4f?Zdz00oDAUlKaWS zp{Ra}=7V3$`Pc{3&iIbJhLEhX$ ztvU9d4$R?yIDB?o!%@Be^_~uqL&XVcV+DsDfX9&%|5WNjCH^U-LnY=uZcTyEi+?tW za$^*YO<*>t4g!a1B@g~10YiD5nO}H;y8R2r{(H^eT&F_=a5S8hjNwkkHV5(n&ITTU z4YP!-oVXmdssuX-N^NUwY6*0g+6J)KP5__OwsvqUR2tr+`be0mC6H|x7#hZKGioQ4 zBHI3HQp^cy36y1)F$Qdov@yci%-HSVSrS0@Q&cO=KtF(i58?nrIKaQ|0O}%%LNsPc z0WJ_15E>K2%LU>AbAj1GJWL?aK|vtJ>VGbCOn5+M+2dmW>A8Uqruz>-U0 zg#RNhppKFv>LnaSt`!n>1u)ebhNLzDR2nW!yHxj_mfFfpnD#o45=hBj0%mC?>yChF zxGQU#x?7t<&1gkMgj@w&ZS8G=)~Q`>ZQzaquEMm&sAR|jz;6_pla~6R2+~@Z7AVQ? zg0KQcI<1Hh!pvMiT~hj}8gL~{Yl%eK3vhC}xVUh*Ksf9W7Mx%pW+*3!i<66s9Vo%> z=mtj`yRyR_>5dve1+qnDP6k9ujcU-?#LfvROba~ofEhE>pN-l(A#4tsG&ALd9cE#6 zd6t?h~8nyME6xjd57-r`pc z`(x5L!3uB#UfHKOiJBsihboChFsGsUU_ya2xlM*(@j*cSs z2s=A~*FypRb`MqK@GZblCQk%q6WM{B@gQDJE|35ZSm3}g3V=Yz-pFCegPMS)v@&=5 zH#LuyJnZH%>v1#?0D}bl`f1Zde%VBzKf<&Kz~cSoBNa&KecS*aT3iXh+S=GzpbYMT zsE$P{(YAuQzz_hoo5O$@Ca54JKQhWoS|I?B2xZMU6}eC@5n!Hy27Xv?R1)!{Ps*RL z`m3_ClP%!l0U?kNzl?yyoY+4(t`DhLt-EWhDR$rEX`3 z1fsnEFe`F!b31C(KsY>dCkMpMVg4tuWT9sMCn#h&n0NsY6M;OiNf0hRKJGIN3{oo6 F{}0|(Yxw{G diff --git a/docs/buzbee.typ b/docs/buzbee.typ index 7737bf7..0c36439 100644 --- a/docs/buzbee.typ +++ b/docs/buzbee.typ @@ -11,26 +11,187 @@ author: [Gale Faraday], ) -= Introduction -#lorem(120) += Introduction + +BUZBEE is a "machine language monitor" styled after Steve Wozniak's WOZMON for +the CHIBI PC-09 hobby computer platform. It is the stock bootloader and +interface for the PC-09. This manual goes over the usage of BUZBEE, and some of +the technical internals of how it works and how to hack on it. + +The CHIBI PC-09 name and platform is copyright 2024-2025 Amber Zeller. The CHIBI +PC-09 BIOS is copyright 2024-2025 Gale Faraday and Amber Zeller. BUZBEE is +copyright 2025 Gale Faraday. All CHIBI PC-09 components are licensed under the +MIT license. + #pagebreak() -= BUZBEE Functions -#lorem(120) += BUZBEE Functions + +BUZBEE is at its core a chain loader or bootloader. This means that most of the +functionality of the CHIBI starts with using BUZBEE. BUZBEE functions are broken +into two categories: _Internal Functions_ or "IFs," and _External Functions_ or +"EFs." IFs are native routines mapped to textual commands entered at the BUZBEE +prompt. EFs are native routines called through IFs. EFs can either be any user +supplied code, or one of a set of routines in the BIOS/BUZBEE ROM or "firmware". + #pagebreak() -== Internal Functions (IFs) -#lorem(120) +== Internal Functions (IFs) + +Internal Functions are the textual commands that BUZBEE interprets from the +command line to execute the user's wish. Internal Functions are canonically +listed in alphabetical order. Below in @if-table is a list of available IFs. + +#figure( + table( + columns: (1fr, auto), + inset: 10pt, + align: center, + table.header( + [*Name* (pg. no.)], [*Description*] + ), + [`CALL` #ref(, form: "page")], + [Call a resident routine in the MPU's address space.], + [`HELP` #ref(, form: "page")], + [Display a summary of known commands.], + [`PEEK` #ref(, form: "page")], + [Dumps memory from the MPU's address space to the terminal.], + [`POKE` #ref(, form: "page")], + [Overwrites memory in the MPU's address space.], + [`SREC` #ref(, form: "page")], + [Switches into Motorola S-Record receive mode.], + ), + caption: [Table of IFs], +) + +In the following pages these IFs are described in specific. + +// TODO: Talk about how IFs are tokenized. + #pagebreak() -== External Functions (EFs) & User Programs +#let _ifpagehead( + desc: none, + syntax: none, + params: (), +) = { + smallcaps[#desc] + parbreak() + [Syntax: #syntax] + parbreak() + [Parameters: ] + if params.len() > 0 { + for (param, desc) in params [ + - #raw("<" + upper(param) + ">"): #desc + ] + } else { + text(style: "italic")[N/A] + } +} + +=== IF: `CALL` + +#_ifpagehead( + desc: "Calls a resident routine in the MPU's address space.", + syntax: [`CALL `], + params: ( + ptr: "An absolute pointer to a position in the 6309 MPU's memory map.", + ), +) + #lorem(120) + +// TODO: For when CHIBI PC-09 Prototype #2 comes out or whenever we get banking +// add it here "Special care must be taken to properly bank in the correct +// memory banks before executing this command." yadda yadda + #pagebreak() -= BUZBEE Reserved Memory Regions -#lorem(120) +=== IF: `HELP` + +#_ifpagehead( + desc: "Displays a summary of available IFs.", + syntax: [`HELP`], + params: () +) + +`HELP` does what it says on the tin. It should be noted that between Git tags of +the firmware the message displayed by this may be incomplete or innaccurate. +Internally all this does is print a string with the UART using the `POUTZSTR` +BIOS routine. + #pagebreak() -= Building BUZBEE +=== IF: `PEEK` + +#_ifpagehead( + desc: "Dumps memory from the MPU's address space to the terminal.", + syntax: [`PEEK []`], + params: ( + base: [ + The address of the byte to dump or the base (lower bound) address of the + byte to start dumping from if `` is specified. + ], + high: [ + An optional operand given as the upper bound of the range to dump. Forms + a range together with ``. + ], + ) +) + #lorem(120) +#pagebreak() + +=== IF: `POKE` + +#_ifpagehead( + desc: "Writes values to the MPU's address space.", + syntax: [`POKE `], + params: ( + addr: "The base (low) address to start writing bytes from.", + bytes: "The bytes to write into memory separated by whitespace.", + ) +) + +#lorem(120) + +#pagebreak() + +=== IF: `SREC` + +#_ifpagehead( + desc: "Switches into Motorola S-Record receive mode.", + syntax: [`SREC`], + params: (), +) + +#lorem(120) + +#pagebreak() + +== External Functions (EFs) + +#lorem(120) + +=== EFs in ROM + +#lorem(120) + +#pagebreak() + += BUZBEE Reserved Memory Regions + +#lorem(120) + +#pagebreak() + += Building CHIBI PC-09 Firmware from Source + +#lorem(120) + +#pagebreak() + += BUZBEE Internals and Modding + +#lorem(120) diff --git a/docs/style.typ b/docs/style.typ index 933cc82..5fbbd09 100644 --- a/docs/style.typ +++ b/docs/style.typ @@ -9,7 +9,7 @@ // Global page format set page( paper: "us-letter", - header: align(right, text(9pt, weight: "light")[#title]), + header: align(right, text(10pt, weight: "light")[#title]), numbering: "1", ) @@ -28,13 +28,17 @@ // Heading numbering set heading(numbering: "1.1") + // Show table captions above tables + show figure.where(kind: table): set figure.caption(position: top) + // Title page and TOC page(header: none, footer: none)[ // Emit title and subtitle page #block(height: 60%)[ #align(center + horizon, block(text(22pt)[#title]) + - block(above: 2em)[#smallcaps[#subtitle]] + block(above: 2em)[#smallcaps[#subtitle]] + + block[Written by #author], ) ] // Emit TOC diff --git a/makefile b/makefile index 119fe66..d3f0b44 100644 --- a/makefile +++ b/makefile @@ -1,6 +1,6 @@ # Makefile for CHIBI PC-09 Firmware -.PHONY: generate all clean +.PHONY: generate all clean docs .IGNORE: clean .DEFAULT_GOAL := all @@ -33,6 +33,9 @@ LDFLAGS := -f srec -m map.txt -s linkscript # Rules and Phony Targets # ------------------------------------------------------------------------------ +docs: docs/*.typ + typst compile docs/buzbee.typ + all: $(TARGROM) # Fix srec into flashable bin file