From 016e1ea875605ff4dba71f80d2e80a782450aea8 Mon Sep 17 00:00:00 2001 From: Ivan Izaguirre Date: Sun, 21 Apr 2019 18:18:43 +0200 Subject: [PATCH] Character map roms initial support --- apple2/characterGenerator.go | 73 ++++++++++++++++++ apple2/ioC0Page.go | 1 + ...- Lowercase Character Generator - 2716.bin | Bin 0 -> 2048 bytes ... - Pig Font Character Generator - 2716.bin | Bin 0 -> 2048 bytes apple2/romdumps/Apple2rev7CharGen.rom | Bin 0 -> 2048 bytes apple2/softSwitches2.go | 2 +- main.go | 15 ++++ 7 files changed, 90 insertions(+), 1 deletion(-) create mode 100644 apple2/characterGenerator.go create mode 100644 apple2/romdumps/Apple II+ - Lowercase Character Generator - 2716.bin create mode 100644 apple2/romdumps/Apple II+ - Pig Font Character Generator - 2716.bin create mode 100644 apple2/romdumps/Apple2rev7CharGen.rom diff --git a/apple2/characterGenerator.go b/apple2/characterGenerator.go new file mode 100644 index 0000000..a1318f5 --- /dev/null +++ b/apple2/characterGenerator.go @@ -0,0 +1,73 @@ +package apple2 + +import ( + "bufio" + "fmt" + "os" +) + +/* + See: + hhttps://mirrors.apple2.org.za/Apple%20II%20Documentation%20Project/Companies/Apple/Documentation/Apple%20Technical%20Information%20Library/a2til041.txt +*/ + +// CharacterGenerator represents the ROM wth the characters bitmaps +type CharacterGenerator struct { + data []uint8 +} + +const ( + rev7CharGenSize = 2048 +) + +// NewCharacterGenerator instantiates a new Character Generator with the rom on the file given +func NewCharacterGenerator(filename string) *CharacterGenerator { + var cg CharacterGenerator + cg.load(filename) + return &cg +} + +func (cg *CharacterGenerator) load(filename string) { + f, err := os.Open(filename) + if err != nil { + panic(err) + } + defer f.Close() + + stats, statsErr := f.Stat() + if statsErr != nil { + panic(err) + } + + size := stats.Size() + if size != rev7CharGenSize { + panic("Character ROM size not supported") + } + cg.data = make([]uint8, size) + buf := bufio.NewReader(f) + buf.Read(cg.data) +} + +func (cg *CharacterGenerator) dumpChar(char uint8) { + base := int(char) * 8 + fmt.Printf("Char: %v\n---------\n", char) + for i := 0; i < 8; i++ { + fmt.Print("|") + b := cg.data[base+i] + for j := 6; j >= 0; j-- { + if (b>>uint(j))&1 == 1 { + fmt.Print("#") + } else { + fmt.Print(" ") + } + } + fmt.Println("|") + } + fmt.Println("---------") +} + +func (cg *CharacterGenerator) Dump() { + for i := 0; i < 256; i++ { + cg.dumpChar(uint8(i)) + } +} diff --git a/apple2/ioC0Page.go b/apple2/ioC0Page.go index b38e07a..e1bcf89 100644 --- a/apple2/ioC0Page.go +++ b/apple2/ioC0Page.go @@ -15,6 +15,7 @@ type ioC0Page struct { type softSwitchR func(io *ioC0Page) uint8 type softSwitchW func(io *ioC0Page, value uint8) +// KeyboardProvider declares the keyboard implementation requitements type KeyboardProvider interface { GetKey(strobe bool) (key uint8, ok bool) } diff --git a/apple2/romdumps/Apple II+ - Lowercase Character Generator - 2716.bin b/apple2/romdumps/Apple II+ - Lowercase Character Generator - 2716.bin new file mode 100644 index 0000000000000000000000000000000000000000..0cc83d34ad799bb6c447fef677d1163198d8394e GIT binary patch literal 2048 zcmeHI!HU~35FLzJLv&TnC04j*&EsI zz*`hDU#&CdNi70m4iW;91kz$kYix-%W01Orh|EofU-s_7pNnXonDj-t!#T~I8Cdwq zO!H6D8PA{2@>P|lsQX^)`ZaTSC8!JcXBq3phjy8y&yWB)`PG_?)j$Q{?=eJJ4a^}v zMS4d1IF7%EQ)s#vrx?R6Mn0jB!!X32K5z@uFx-Y=y4xX~hT#(9DPR%XV(1&94+jGK z;`#b|J;wkRU<&bl92pnm+lYClXQ(~nqd8lKb*wX9HZ7}x3c$Z%gurTG4)Hb8 zYl8j%{o||P=L&qn@Bg#Ef8O2yV3Q^KnRA<+-)%634u`&&B#Xiq3;5Po&dTgDd*;0> ziQc$YY F`3q5{te^k@ literal 0 HcmV?d00001 diff --git a/apple2/romdumps/Apple II+ - Pig Font Character Generator - 2716.bin b/apple2/romdumps/Apple II+ - Pig Font Character Generator - 2716.bin new file mode 100644 index 0000000000000000000000000000000000000000..fb199b7a513ce62a8683cf8c363705f4ee5a167d GIT binary patch literal 2048 zcmeHH&ubGw6rQ9@46>9qD&$bNJ86q3q_pPZL3Z&k>twscP?oTXE#}Z}b~Y_)A+a%1 zJd{~_>>uIDqX#eEEX41<81Ej1ezWlAd-HzHu3|njnfv0U>-s{lbaC!Jk#sKQo+Q6z3s@H7Ua?rLtqD=ve6d-B-X*|KHtKb+&I1m1Lj+`$CS@wKgWdy&iBd$$}_i@vQn{a;`Mri;#E*N!tVY$3h^F_-RD;M!G;jk%_`SfD!~{i zT4j!pELM313hUAGBMZ{DeX5gT+f_(ZH3#eAxZ>j8OIuHOaZk&BXj$vva$dh9m-+t1 z(*25$`hC0%y@%s^lB6#wGub=L9l2g8;@y##zQv|0mh2sSiMWRafZ02or!3%~=+QVG zC>8Z|uC-F8nRL5GsYIu#PKbAz=jtj=bER0OI8WbcI@ja|zfK5rlzJTmL3XTEcKYQs zgFYp|Pftf9veT0fXG6%O2{(>!V8Hw=JE44r{gMEJn?C zmFl1Nxz1J##y}9ZIX<$4?HG#isB;uTMo~_6GNPytiK^ycJsjf{_ufDIFu^^;=r9Zi z;CfzvqC0&5pmos8QGbq?q4!8qqe^>nEL!=I6Of|l0D6zP(?id0@dOPm}aN%KWAviKXXx?9|7MHm}yo3fmjE z5^N&PNo9yiG6H#Sz1?lsP7nq(;vVXnan9}Q4ddasr9SFf_3QO#j%~=DP1i>rO9$rQ0I3eLHy_c*8dL|XU}`905{-9~cURZCSbhQZe zbK8ZUI-iKy``CxB^?rUN;Pa#y7tmjzG(PxY7<6G6W;}xrr|bCr7W~sQ>Rujwf4%n9 zNiG6p5fmOIEvS8%#xPFU3jxwK1k;|AH!|>e)#-80%k+$MhM!b0!f%hNzwM4Ze|H?t zbJwBoH|^_>KH`(0FU;?I_Kh#?sqOw!5vwm2yzB-#03SWU$ZlW_@g3v^{0`plKduGu UGw;Lu{eQpzygc|H_%H7NKcifwj{pDw literal 0 HcmV?d00001 diff --git a/apple2/softSwitches2.go b/apple2/softSwitches2.go index 0a66df9..0198e83 100644 --- a/apple2/softSwitches2.go +++ b/apple2/softSwitches2.go @@ -7,7 +7,7 @@ const ( ioFlagMixed uint8 = 0x52 ioFlagSecondPage uint8 = 0x54 ioFlagHiRes uint8 = 0x56 - ioFlagAnnunciator0 uint8 = 0x58 + ioFlagAnnunciator0 uint8 = 0x58 // On Copam Electronics Base-64A this is used to bank swith the ROM ioFlagAnnunciator1 uint8 = 0x5a ioFlagAnnunciator2 uint8 = 0x5c ioFlagAnnunciator3 uint8 = 0x5e diff --git a/main.go b/main.go index bd3d70e..77c4d1f 100644 --- a/main.go +++ b/main.go @@ -19,6 +19,10 @@ func main() { "disk", "../dos33.dsk", "file to load on the first disk drive") + charRomFile := flag.String( + "charRom", + "apple2/romdumps/Apple2rev7CharGen.rom", + "rom file for the disk drive controller") useSdl := flag.Bool( "sdl", true, @@ -27,6 +31,11 @@ func main() { "panicss", false, "panic if a not implemented softwtich is used") + dumpChars := flag.Bool( + "dumpChars", + false, + "shows the character map", + ) flag.Parse() //romFile := "apple2/romdumps/Apple2.rom" @@ -37,6 +46,12 @@ func main() { //diskImage := "../Apex II - Apple II Diagnostic (v4.7-1986).DSK" //diskImage := "../A2Diag.v4.1.SDK" + if *dumpChars { + cg := apple2.NewCharacterGenerator(*charRomFile) + cg.Dump() + return + } + log := false a := apple2.NewApple2(*romFile, *panicSS) a.AddDisk2(*disk2RomFile, *diskImage)