Added some symbolic info to VT100.json

This commit is contained in:
Jeff Parsons 2016-08-04 15:01:06 -07:00 committed by Jeff Parsons
commit 093b19bce3
7 changed files with 6075 additions and 12 deletions

1
.gitignore vendored
View file

@ -1,5 +1,4 @@
*.bin
*.lst
*.obj
*.IMG
*.dsk

View file

@ -53,9 +53,17 @@ This produced VT100.d80, which I renamed to [VT100.asm](VT100.asm). I fixed one
This required some selectivity, because I didn't want to inadvertently include any of [phooky's](https://github.com/phooky)
screensaver-related mods to the ROM.
Finally, I verified that re-assembling [VT100.asm](VT100.asm) with [asm8080](https://github.com/begoon/asm8080) produced the
Finally, I verified that reassembling [VT100.asm](VT100.asm) with [asm8080](https://github.com/begoon/asm8080) produced the
original VT100.bin; after adding the correct number of `nop` instructions to the end to the source file, the binaries matched.
Some additional clean-up remains, because there are still chunks of data that were incorrectly disassembled as code. From a
re-assembly standpoint, it doesn't matter too much, because such instructions get reassembled into the same original binary
patterns, but from a readability standpoint, it's a problem.
The other advantage of reassembling the code is that the resulting [VT100.lst](VT100.lst) makes it easy to export comments
and other symoblic information to [VT100.map](VT100.map), which can then be included in the [VT100.json](VT100.json) ROM dump
and passed on to the PC8080 Debugger. Here are the rebuild steps:
asm8080 -lVT100.lst VT100.asm
grep -E "[0-9]+ [0-9A-D]+.*;;" VT100.lst | sed -E "s/ *[0-9]+ ([0-9A-F]+).*;(;.*)/ \1 . \2/" > VT100.map
filedump --file=VT100.bin --format=bytes --output=VT100.json --comments --overwrite
Some [VT100.asm](VT100.asm) clean-up remains, because there are still chunks of data that were incorrectly disassembled as code.
From a reassembly standpoint, it doesn't matter too much, because such instructions get reassembled into the same original binary
patterns, but from a readability standpoint, it's a nuisance.

View file

@ -2,9 +2,8 @@
; DZ80 V3.4.1 8080 Disassembly of archive/VT100.bin
; 2016/08/03 14:55
;
; Comments beginning with ";;" borrowed from Adam Mayer (https://github.com/phooky)
; See https://github.com/phooky/VT100-Hax/blob/master/ROMs/haxrom.d80
; Additional information at http://vt100romhax.tumblr.com/post/90789754818/day-four-rom-checksums
; Comments beginning with ";;" borrowed from Adam Mayer's (https://github.com/phooky)
; work at https://github.com/phooky/VT100-Hax/blob/master/ROMs/haxrom.d80 and http://vt100romhax.tumblr.com
;
; All other comments/annotations by Jeff Parsons (@jeffpar) <Jeff@pcjs.org>
;

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,241 @@
0040 . ; 0x0f to NVR latch
0042 . ; invert A (0xf0)
0043 . ; 0xf0 to brightness
0045 . ; zero A
0046 . ; zero D, L, H
0049 . ; next 2K ROM
004A . ; store the current ROM # in B
004B . ; show current ROM on LEDs
004D . ; Checksum over 8 256B blocks
004F . ; Rotate A left
0050 . ; A <- A ^ memory
0051 . ; next memory address
0052 . ; ... repeat until end of block
0055 . ; next block
0056 . ; decrement block count
0057 . ; ... repeat until end of chip
005A . ; Check the value of the accumulator
005B . ; If it's not zero, hang forever
005E . ; Put the ROM # back in the accumulator
005F . ; If it's not 4...
0061 . ; repeat for the next ROM
0065 . ; write 5 to LEDs (turns on L2 and L4)
0067 . ; Test pattern: 0xaa
0069 . ; 0x2c is the top of RAM on the basic board
006B . ;
006D . ; flags buffer &= 0x02 : is AVO installed?
006F . ; if bit 2 is not set, AVO is installed
0072 . ; 0x40 is the top of RAM on the AVO
0074 . ; load HL with top of RAM
0075 . ; dec HL
0076 . ; M <- 0
0078 . ; dec HL
0079 . ; a <- h
007A . ; compare to 1f (top of ROM)
007C . ; continue to zero if not at ROM
0080 . ; read a byte of memory
0082 . ; if it's zero, skip ahead
0088 . ; err
008D . ; err
0090 . ; run test pattern through ram
0093 . ; jump to 00a8 if ok
0099 . ; err
009E . ; ok
00A5 . ; Hang if non-AVO memory
00B3 . ; Repeat mem test with pattern 0x55
00BA . ; zero scratch and screen mem
00BD . ; Set a number of scratch values to fixed values
00C0 . ; .... more memory initialization
00FE . ; Read from keyboard port
0102 . ; copy b <- a
0103 . ; subtract 0x7c from a
0105 . ; jump to 011a if a is a normal key
0108 . ; otherwise h <- a
0109 . ; h++
010A . ; a <- 0x10
0112 . ; load keys flag addresss
0115 . ; or in control bit
0116 . ; store again
0117 . ; jump to end to interrupt
011A . ; load keys flag address
011F . ; load key counter
0120 . ; if overflow.. (>3 keys)
0122 . ; discard keypress and end interrupt
0125 . ; otherwise increment key counter
0126 . ; load key address buffer?
0129 . ; add key counter to address buffer
012C . ; save key to address buffer
02A4 . ; HL <- 0x204e (top of stack)
02A7 . ; DE <- 0x0fb2
02AA . ; B <- 0
02AC . ; memset(0x204e,0,0xfb2)
02AF . ; invert A
02B0 . ; store A in 0x2104
02B3 . ; HL <- 0x2004
02B6 . ; *(0x2052) = 0x2004
02B9 . ; HL <- 0x22d0
02BC . ; *(20f6) = 0x22d0
02C0 . ; 0x2140 = 0xe605
02C3 . ; HL = 0x2000
02C6 . ; DE = 0x02d9
02C9 . ; B = 18
02CB . ; copy 18 bytes from 0x02d9 to 0x2000
02CE . ; HL = 0x3000
02D1 . ; DE = 0x1000
02D4 . ; B = 0xFF
02D6 . ; Set all of attribute RAM to 0xFF and return
02EB . ; HL = 0x0212
02EE . ; Store 0x1202 at 0x212d
02F1 . ; A = 0x35
02F3 . ; 0x212c = 0x35
02F6 . ; A = 1
02F8 . ; 0x205b = 1
02FB . ; 0x2176 = 1
02FE . ; HL = 0x07ff
0301 . ; store 0xff07 at 0x2149
0304 . ; A = 2
0306 . ; 0x2073 = 2
0309 . ; A = 0xf7
030B . ; 0x20fa = 0xf7
030E . ; read flags buffer
0310 . ; And it with 0x04 (check graphics flag)
0312 . ; A=1
0314 . ; if no graphics skip
0317 . ; else store 1 in 0x2079
031A . ; A = 0xff
031C . ; 0x210e = 0xff
031F . ; 0x21ba = 0xff
0322 . ; H = 0x80
0324 . ; L = 0x80
0325 . ; Store 0x8080 at 0x20c0
038B . ; Load memory at DE into accumulator
038C . ; Store it at HL
038D . ; HL++
038E . ; DE++
038F . ; B--
0390 . ; until B is zero
03CF . ; Read from PUSART data
03DE . ; Read from PUSART ctrl
08D4 . ; subtract 5 from A and return if negative
08D7 . ; load jump table at 8e5
08DA . ; double a
08DE . ; hl = X08e5 + 2A
08DF . ; load DE from (HL) little-endian
08E3 . ; zero A
08E4 . ; jump to address
08E7 . ; immediate return
08ED . ; MYSTERY ADDRESS: this isn't even in AVO!!!
0A15 . ; HL = 0x05e6
0A18 . ; 0x2140 = 0xe605
1083 . ; M <- B
1084 . ; HL++
1085 . ; DE--
1086 . ;
1087 . ; A = D | E
1088 . ; repeat if A != 0
1493 . ; Read flags buffer
1495 . ; check if transmit buffer is empty
1497 . ; if zero, return
1498 . ; HL = 0x2144
149B . ; Load from 2144
149C . ; Check if zero
149D . ;
14A0 . ; If not, A = 10 (else A is zero)
14A2 . ;
14A5 . ; or bits from 0x21a5
14A6 . ;
14A9 . ; or bits from 0x2145
14AA . ;
14AB . ; ... and 0x2146
14AC . ;
14AD . ; ... and 0x2147
14AE . ; zero 0x2147
14B0 . ;
14B1 . ; ... and 0x2148
14B2 . ; zero 0x2148
14B4 . ; Write to keyboard buffer
14B6 . ;
14B9 . ; Increment what's at 0x2074
14BA . ; load what's at 0x2077
14BD . ; return if it's not zero
14BE . ;
14BF . ; A = 0x2065
14C2 . ;
14C5 . ; return if [0x2065] | [0x2051] != 0
175B . ; Initialize start of screen RAM and wipe attribute RAM to 0xff
175E . ; B = 0x0a
1760 . ; D = 1
1762 . ; push B, D
1763 . ;
1764 . ; Display wait message
1767 . ; pop D
1768 . ; disable interrupts(???)
1769 . ; HL = 0x217b
176C . ; E = 0x33
176E . ; C = 1
1770 . ; A = 0
1771 . ; 0x21ae = A
1774 . ; A = C
1775 . ; 0x21ad = A
1778 . ; push D,H
1779 . ;
177A . ; A=D
177B . ; or A
177C . ; load A from HL
177D . ; store it in 0x21af
1780 . ; if A is 0 call X18ae
1783 . ; call X18a3
1786 . ; pop H,D
17BE . ; DE = 0x17ec
17C1 . ; B = 7
17C3 . ; HL = 0x21cc
17C6 . ; Initialize 0x21cc to Wait message
17C9 . ; HL = 0xcc71
17CC . ; retarget screen ram to display wait message
17DC . ; DE = 0x17f3
17DF . ; B = 11
17E1 . ; store
18CD . ; Write READ command to NVR latch
18DD . ; Write 0x2fh (standby) to nvr latch
18E1 . ; HL=X21d3
18E4 . ; B= 14 -- we're reading 14 bits
18EF . ; wait for NVR clock L
18F2 . ; shft bit out of nvr
18F9 . ; wait for NVR clock H
18FC . ; read bit and store it in memory
1903 . ; wait for NVR clock L
1907 . ; read next bit
190A . ; send standby
190E . ; DE=0x21d3
1911 . ; B = 14
1913 . ; HL = 0
1916 . ;
1917 . ; load next char
1918 . ; and with NVR data bit
191A . ; rotate NVR bit to high bit
1924 . ; Store the finished data in 21af and 21ae
1928 . ; Load accumulator from 0x21ae -- (0x42)
192B . ; B = 0xff
192D . ; increment B
192E . ; subtract 0x0a from accumulator
1930 . ; repeat while accumulator is positive
1933 . ; add 0x0a to accumulator
1935 . ; HL = 0x21d3
1938 . ; E = 0x23
193A . ; D = 0x14
193C . ;
193D . ; HL++
193E . ; D--
193F . ; repeat until D is zero
1942 . ; Store 0x2f in 21e7
1944 . ; HL = 0x21d3
1947 . ; copy A to E
1948 . ; clear D
194A . ; add DE to HL -- calculate address of bit A
194B . ; Store 0x22 in M
194D . ; HL = 0x21d3
1950 . ; A = 0x0a
1952 . ; A = 0x0a + B
1960 . ;
1964 . ; Flags Buffer & C
1969 . ; Return if B is negative

View file

@ -659,7 +659,7 @@ Video.prototype.powerUp = function(data, fRepower)
addrNext = addr;
}
/*
* NOTE: By calling updateVT100() directly, we are bypassing the normal checks (eg, isVideoEnabled())
* NOTE: By calling updateVT100() directly, we are bypassing any checks that might block the update.
*/
this.updateVT100();
}
@ -1010,8 +1010,8 @@ Video.prototype.updateVT100 = function()
}
/*
* Display the line buffer; ordinarily, font would always be valid after processing the "fill lines",
* but if the buffer was filled with garbage, the usual LINETERM might be missing, so font might not be set.
* Display the line buffer; ordinarily, the font number would always be valid after processing the "fill lines",
* but if the buffer isn't initialized yet, the usual LINETERM might be missing, so the font number might not be set.
*/
if (font >= 0) {
for (var iCol = 0; iCol < nCols; iCol++) {