Merge branch 'next-release'

This commit is contained in:
Jeff Parsons 2016-08-04 15:11:13 -07:00
commit 6079b0fc3d
12 changed files with 6346 additions and 280 deletions

1
.gitignore vendored
View file

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

View file

@ -14,7 +14,7 @@ Device Configurations
All PCjs machines are built from the following sets of devices:
* [6502-based Devices](c1p/) (e.g., [Challenger 1P](c1p/machine/))
* [8080-based Devices](pc8080/) (e.g., [Space Invaders](pc8080/machine/invaders/))
* [8080-based Devices](pc8080/) (e.g., [Space Invaders](pc8080/machine/invaders/), [VT100](pc8080/machine/vt100/))
* [8086-based Devices](pcx86/) (e.g., [IBM PC and compatibles](pcx86/machine/))
These devices are user-installable components that you would typically find in a real personal computer,

View file

@ -19,4 +19,8 @@ All our [Challenger 1P Machines](machine/) are built from a collection of device
* Serial Port
* [Video](video/)
Complete [machine configurations](machine/) are constructed from those devices. A machine configuration is a single XML file
that lists all the device components to be used. A machine XML file can choose to configure every device itself,
or it can include pre-configured device XML files, such as those provided above or elsewhere.
The project also includes an assortment of Challenger 1P [Applications](/apps/c1p/) and [Disk Images](/disks/c1p/).

View file

@ -16,7 +16,7 @@ All our [8080-Based Machines](machine/) are built from a collection of devices,
* Video Adapters
* [Control Panels](panel/)
Complete machine configurations are constructed from those devices. A machine configuration is a single XML file
Complete [machine configurations](machine/) are constructed from those devices. A machine configuration is a single XML file
that lists all the device components to be used. A machine XML file can choose to configure every device itself,
or it can include pre-configured device XML files, such as those provided above or elsewhere.

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.

File diff suppressed because it is too large Load diff

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

@ -32,7 +32,7 @@ For example, the IBM PC *[Keyboard](/docs/pcx86/keyboard/)* component supports d
(eg, 83-key, 84-key, 101-key), and each of those models can also be configured to have dedicated buttons for
selected key combinations, or even entire keyboard layouts.
Complete machine configurations are constructed from those devices. A Machine Configuration is a single XML file
Complete [machine configurations](machine/) are constructed from those devices. A Machine Configuration is a single XML file
that lists all the device components to be used. A Machine XML file can choose to configure every device itself,
or it can include pre-configured device XML files, such as those provided above or elsewhere.

View file

@ -12,7 +12,7 @@ Overview
PC8080 is our 8080-based machine emulation module. The code is derived from [PCx86](/modules/pcx86/).
See the list of available [PC8080 Machines](/devices/pc8080/machine/), which includes
[Space Invaders (1978)](/devices/pc8080/machine/invaders/).
[Space Invaders (1978)](/devices/pc8080/machine/invaders/) and the [DEC VT100](/devices/pc8080/machine/vt100/).
PC8080 is comprised of the following non-shared components, as listed in [package.json](../../package.json)
(see the *pc8080Files* property):

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++) {