Merge branch 'next-release'
This commit is contained in:
commit
6079b0fc3d
12 changed files with 6346 additions and 280 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
|
@ -1,5 +1,4 @@
|
|||
*.bin
|
||||
*.lst
|
||||
*.obj
|
||||
*.IMG
|
||||
*.dsk
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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/).
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
||||
|
|
|
|||
|
|
@ -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
5816
devices/pc8080/rom/vt100/VT100.lst
Normal file
5816
devices/pc8080/rom/vt100/VT100.lst
Normal file
File diff suppressed because it is too large
Load diff
241
devices/pc8080/rom/vt100/VT100.map
Normal file
241
devices/pc8080/rom/vt100/VT100.map
Normal 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
|
||||
|
|
@ -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.
|
||||
|
||||
|
|
|
|||
|
|
@ -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):
|
||||
|
|
|
|||
|
|
@ -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++) {
|
||||
|
|
|
|||
Loading…
Reference in a new issue