22 KiB
- Memory Map
- Integer Basic Map
- I/O and softswitches
- Page 00
- Page 03
- Basic locations
- DOS routines
- Monitor routines
- Language card
- Control codes
- Revisions
- Keyboard
- Character set
- Video scanning
- Colors
- Design
- Gospeccy design
Apple II notes
Memory Map
Page | Use |
$00 | Page Zero |
$01 | System stack |
$02 | Input buffer |
$03 | Monitor vector locations |
$04-$07 | Text/Lo-Res Primary |
$08-$0B | Text/Lo-Res Secondary |
$0C-$1F | Free RAM |
$20-$3F | Hires Primary |
$40-$5F | Hires Secondary |
$60-$BF | Free RAM |
$C0 | I/O and softswitches |
$C1-$C7 | ROM for seven peripheral cards |
$C8-$CF | switchable ROM for peripheral cards |
$D0-$D7 | empty ROM socket #1 / Programmer's Aid #1 |
$D8-$DF | empty ROM socket #2 |
$E0-$F7 | Integer BASIC ROM |
$F8-$FF | Monitor ROM |
Integer Basic Map
Address | Use |
$E000-$F424 | BASIC |
$F425-$F4FB | Floating point math package 1/2 |
$F4FC-$F4FF | ??? (4 bytes) |
$F500-$F63C | Miniassembler |
$F63D-$F65D | Floating point math package 2/2 |
$F65E-$F665 | ??? (8 bytes) |
$F666-$F668 | Miniassembler entry point |
$F669-$F688 | ??? (32 bytes) |
$F689-$F7FC | SWEET 16 interpreter |
$F800-$FFFF | Monitor |
I/O and softswitches
Address | Dec | Use |
---|---|---|
$C00X | -16384 | Read keyboard: High bit = key pressed |
$C01X | -16368 | Set to 0 to clear keyboard strobe |
$C01A | -16358 | Read: High bit 1 = TEXT switch "ON" |
$C01B | -16357 | Read: High bit 1 = MIXED switch "ON" |
$C01C | -16356 | Read: High bit 1 = PAGE2 switch "ON" |
$C01D | -16355 | Read: High bit 1 = HIRES switch "ON" |
$C02X | Casette output toggle | |
$C03X | -16336 | Speaker toggle |
$C04X | Output strobe to Game I/O connector | |
$C050 | -16304 | Set graphics mode |
$C051 | -16303 | Set text mode |
$C052 | -16302 | Set bottom 4 lines graphics |
$C053 | -16301 | Set bottom 4 lines text |
$C054 | -16300 | Display primary page |
$C055 | -16299 | Display secondary page |
$C056 | -16298 | Set HIRES graphics mode |
$C057 | -16297 | Set color graphics mode |
$CØ58 | -l6296 | Clear Game I/O ANØ output |
$CØ59 | -l6295 | Set Game I/O ANØ output |
$CØ5A | -l6294 | Clear Game I/O ANl output |
$CØ5B | -l6293 | Set Game I/O ANl output |
$CØ5C | -l6292 | Clear Game I/O AN2 output |
$CØ5D | -l629l | Set Game I/O AN2 output |
$CØ5E | -l629Ø | Clear Game I/O AN3 output |
$CØ5F | -l6289 | Set Game I/O AN3 output |
$C060/8 | Tape in (bit 7) | |
$C061/9 | -16287 | "SW1": PDL(0) switch: High bit 1 = "on" |
$C062/A | -16286 | "SW2": PDL(1) switch: High bit 1 = "on" |
$C063/B | -16285 | "SW3": PDL(2) switch: High bit 1 = "on" |
$C064/C | Paddle 0 timer output: state of timer output in high bit | |
$C065/D | Paddle 1 timer output: state of timer output in high bit | |
$C066/E | Paddle 2 timer output: state of timer output in high bit | |
$C067/F | Paddle 3 timer output: state of timer output in high bit | |
$C064 | Paddle0 | |
$C07X | Trigger paddle timers during \Zero_2 | |
$C08X | Device select 0: Pin 41 on Peripheral Connector low during 0_2 | |
$C09X | Device select 1: Pin 41 on Peripheral Connector low during 0_2 | |
$C0AX | Device select 2: Pin 41 on Peripheral Connector low during 0_2 | |
$C0BX | Device select 3: Pin 41 on Peripheral Connector low during 0_2 | |
$C0CX | Device select 4: Pin 41 on Peripheral Connector low during 0_2 | |
$C0DX | Device select 5: Pin 41 on Peripheral Connector low during 0_2 | |
$C0EX | Device select 6: Pin 41 on Peripheral Connector low during 0_2 | |
$C0FX | Device select 7: Pin 41 on Peripheral Connector low during 0_2 | |
$C10X | Device select (8): Pin 41 on Peripheral Connector low during 0_2 | |
$C11X | Device select (9): Pin 41 on Peripheral Connector low during 0_2 | |
$C12X | Device select (A): Pin 41 on Peripheral Connector low during 0_2 | |
$C13X | Device select (B): Pin 41 on Peripheral Connector low during 0_2 | |
$C14X | Device select (C): Pin 41 on Peripheral Connector low during 0_2 | |
$C15X | Device select (D): Pin 41 on Peripheral Connector low during 0_2 | |
$C16X | Device select (E): Pin 41 on Peripheral Connector low during 0_2 | |
$C17X | Device select (F): Pin 41 on Peripheral Connector low during 0_2 | |
$C1XX | I/O Select 1: Pin 1 on Peripheral Connector low during 0_2 | |
$C2XX | I/O Select 2: Pin 1 on Peripheral Connector low during 0_2 | |
$C3XX | I/O Select 3: Pin 1 on Peripheral Connector low during 0_2 | |
$C4XX | I/O Select 4: Pin 1 on Peripheral Connector low during 0_2 | |
$C5XX | I/O Select 5: Pin 1 on Peripheral Connector low during 0_2 | |
$C6XX | I/O Select 6: Pin 1 on Peripheral Connector low during 0_2 | |
$C7XX | I/O Select 7: Pin 1 on Peripheral Connector low during 0_2 | |
$C8XX | I/O Select (8): Pin 1 on Peripheral Connector low during 0_2 | |
$C9XX | I/O Select (9): Pin 1 on Peripheral Connector low during 0_2 | |
$CAXX | I/O Select (A): Pin 1 on Peripheral Connector low during 0_2 | |
$CBXX | I/O Select (B): Pin 1 on Peripheral Connector low during 0_2 | |
$CCXX | I/O Select (C): Pin 1 on Peripheral Connector low during 0_2 | |
$CDXX | I/O Select (D): Pin 1 on Peripheral Connector low during 0_2 | |
$CEXX | I/O Select (E): Pin 1 on Peripheral Connector low during 0_2 | |
$CFXX | I/O Select (F): Pin 1 on Peripheral Connector low during 0_2 | |
$CFFF | switchable peripheral ROM - find out more |
Page 00
Address | Dec | Description |
---|---|---|
$00-$1F | Register area for "sweet 16" | |
$18 | (DOS) first track of data | |
$19 | (DOS) first sector of data | |
$1A | (DOS) number of sectors to load | |
$1B | (DOS) HIGH BYTE of buffer (LO is always 0) | |
$1A/B | Shape pointer used by DRAW and XDRAW | |
$1C | Last color used (HCOLOR converted to its color byte) | |
$20 | 32 | Left edge of window (0-39) |
$21 | 33 | Width of the window (0 to 40 - Left) |
$22 | 34 | Top edge of window (0-23) |
$23 | 35 | Bottom of window (0-23) Bottom > Top |
$24 | 36 | HTAB: 0-39 |
$25 | 37 | VTAB: 0-23 |
$2B | 43 | Boot SLOT * 16 |
$2C | 44 | Lo-res line end-point |
$30 | 48 | Lores color * 17 |
$32 | 50 | Inverse($3F), Flash($7F), Normal($FF), Invisible($80) |
$33 | Prompt-char | |
$4A/B | 74-75 | LOMEM address (INT) |
$4C/D | 76-77 | HIMEM address (INT) |
$4E-$4F | 78-79 | 16-bit number, randomized with each key entry |
214 | Poke 255 to auto-run program | |
212 | Error code flag in decimal | |
216 | High bit set if error detected: zero to clear | |
222 | Error code | |
224-226 | HIRES GR X&Y coordinates | |
$E4 | 228 | Color being used {0=0:42=1:85=2:127=3:128=4:170=5:213=6:255=7} |
$E6 | 230 | HIRES PLOTTING PAGE (32=1/64=2/96=3) |
$E7 | 231 | SCALE of shape |
$EA | 234 | COLLISION COUNTER for shapes |
241 | 256-SPEED | |
$F3 | 243 | FLASH MASK |
$F9 | 249 | ROT |
Page 03
Address | Description |
---|---|
$0320/1 | Low-endian HIRES X coordinate: 0-279 |
$0322 | HIRES Y coordinate: 0-159 |
$0324/5 | Start address of SHAPE TABLE |
$032C | COLOR for HIRES |
$03F8 | CTRL-Y in Monitor with JSR here |
$03FB | NMI |
$03FE-$03FF | IRQ sent to this address |
Basic locations
Address | Dec | Description |
---|---|---|
2049 | Set to 1 for "list protection" |
DOS routines
Address | Dec | Description |
---|---|---|
42350 | Catalog |
Monitor routines
Address | Dec | Dec | Description |
---|---|---|---|
$F3D4 | -3116 | HGR2 | |
$F3DE | -3106 | HGR | |
$F3F2 | -3086 | CLEAR HIRES SCREEN | |
$F3F6 | -3082 | CLEAR HIRES SCREEN to HCOLOR | |
$FB2F | -1233 | TEXT | |
$FB40 | -1216 | GR | |
$FB60 | -1184 | PRINT "APPLE ][" | |
$FBE4 | -1052 | RING BELL | |
$FBF4 | -1036 | MOVE CURSOR RIGHT | |
$FC10 | -1008 | MOVE CURSOR LEFT | |
$FC1A | -998 | MOVE CURSOR UP 1 LINE | |
$FC58 | -936 | HOME | |
$FD0C | -756 | WAIT FOR KEYPRESS | |
$FD67 | -665 | GET a LINE of input with PROMPT, LINE FEED, and wait. | |
$FD6A | -662 | GET a LINE of input with PROMPT, NO LINE FEED, and wait. | |
$FD6F | -657 | GET a LINE of input with NO PROMPT or LINE FEED, and wait. | |
$FE80 | -384 | INVERSE | |
$FE84 | -380 | NORMAL | |
$FECA | -310 | WRITE to tape | |
$FEFD | -259 | READ from tape |
References
- http://apple2history.org/history/ah03/
- http://www.textfiles.com/apple/peekpk.txt
- http://www.textfiles.com/apple/peekpoke.app
- http://www.textfiles.com/apple/peeks.pokes.2
- http://www.applefritter.com/node/24236
- http://www.easy68k.com/paulrsm/6502/index.html - Information about firmware
- http://www-personal.umich.edu/~mressl/a2dp/index.html - Apple II documentation project
Language card
Install in slot 0. Replaces RAM chip in E3 with a cable to the card. Contains "autostart ROM" Adds Esc-ijkm movement Ctrl-S stop/start program listings
Autostart ROM details
$3F0/1 Break vector: $59,$FA $3F2/3 Reset vector: $03, $E0 (for non-disk systems after power-up reset) $3F4 Powered up mask: $45
Memory details
Address | Description |
$D000-$DFFF | 4K bank-switched memory |
$E000-$F7FF | RAM |
$F800-$FFFF | Language card ROM |
Control codes
Bit 2 is ignored. Bit 3 chooses which RAM banks is switched in to $D000-$DFFF. When RAM is deselected (and write-enabled), it can be written but not read. When RAM is deselected, Language Card ROM is mapped to $F800-$FFFF. Power-on RESET initializes ROM to read mode, and RAM to write mode, and selects the second 4K bank for $D000-$DFFF.
Second 4K Bank | First 4K Bank | Description |
$C080 | $C088 | Select RAM read. Write-protect RAM |
$C081 | $C089 | Deselect RAM reaad (enable ROM) |
Two or more successive reads = write-enable RAM | ||
$C082 | $C08A | Deselect RAM read (enable ROM). Write-protect RAM |
$C083 | $C08B | Select RAM read. |
Two or more successive reads = write-enable RAM |
Revisions
II
- Integer Basic
-
Revision 0
- Only 4 hires colors: black, white, violet, green
-
Revision 1
- 6 hires colors
- Color killer
- power-on-reset
- auto-start
- 24k memory map problem (?!)
- keyboard strobe flip flop connected to reset
II+
- Applesoft
- Usually with 16k "Language Card"
IIe
- 80-column card
Keyboard
Key | Alone | CTRL | SHIFT | BOTH |
space | A0 | A0 | ||
, < | AC | BC | ||
- = | AD | BD | ||
. > | AE | BE | ||
/ ? | AF | BF | ||
0 | B0 | B0 | ||
1 ! | B1 | A1 | ||
2 " | B2 | A2 | ||
3 # | B3 | A3 | ||
4 $ | B4 | A4 | ||
5 % | B5 | A5 | ||
6 & | B6 | A6 | ||
7 ' | B7 | A7 | ||
8 ( | B8 | A8 | ||
9 ) | B9 | A9 | ||
: * | BA | AA | ||
; + | BB | AB | ||
A | C1 | 81 | ||
B | C2 | 82 | ||
C | C3 | 83 | ||
D | C4 | 84 | ||
E | C5 | 85 | ||
F | C6 | 86 | ||
G | C7 | 87 | ||
H | C8 | 88 | ||
l arrow | 88 | |||
I | C9 | 89 | ||
J | CA | 8A | ||
K | CB | 8B | ||
L | CC | 8C | ||
M ] | CD | 8D | DD | 9D |
RETURN | 8D | |||
N ^ | CE | 8E | DE | 9E |
O | CF | 8F | ||
P @ | D0 | 90 | C0 | 80 |
Q | D1 | 91 | ||
R | D2 | 92 | ||
S | D3 | 93 | ||
T | D4 | 94 | ||
U | D5 | 95 | ||
r arrow | 95 | |||
V | D6 | 96 | ||
W | D7 | 97 | ||
X | D8 | 98 | ||
Y | D9 | 99 | ||
Z | DA | 9A | ||
ESC | 9B | 9B |
Character set
@ABCDEFGHIJKLMNO PQRSTUVWXYZ[\]^_ !"#$%&'()*+,-./ 0123456789:;<=>?
64 * 8 = 512 Revision 7: 256 * 8 = 2048
Video scanning
H0,H1,H2,H3,H4,H5,HPE' VA,VB,VC,V0,V1,V2,V3,V4,V5
Horizontal scanning: H0-H5,HPE'
7 bits, 65 states. 0000000,1000000-1111111. HPE' is low only for one cycle, the long cycle. 40/65 states send picture output. 25/65 are blanked.
Vertical scanning: VA-VC,V0-V5
Increments on overflow from the horizontal section. 9 bits, 262 states. 011111010-111111111. 192/262 states send picture information, 70/262 are blanked. V4V3 divides the screen into thirds:
- V4'V3' - Top third
- V4'V3 - Middle third
- V4 V3' - Bottom third
- V4 V3 - Undisplayed (VBL)
6 cycles blanked: 011111010-011111111 64 cycles blanked: 111000000-111111111
Location on TV screen | Least significant address bits | |
---|---|---|
Top | 0000000 - 0100111 (First 40) | |
Middle | 0101000 - 1001111 (Second 40) | |
Bottom | 1010000 - 1110111 (Third 40) |
Lowest 3 bits are easy: H2,H1,H0 == A2,A1,A0 Next four bits are H5-H4-H3 + offset = SUM-A{3..6}
- 0000-0100, 0101-1001, 1010-1110.
H5-H4-H3: 000..010 are undisplayed: right margin, retrace, left margin. 011 first displayed. H543 -3 in First 40, +2 in second 40, +7 in Third 40.
1 1 0 1
- H5 H4 H3
- V4 V3 V4 V3
SUM-A6 SUM-A5 SUM-A4 SUM-A3
Pages:
$0000-$3FFF - ! HIRES PAGE 2 $4000-$7FFF - HIRES PAGE 2
HIRES TIME:
- high when in HIRES, GRAPHICS, NO MIX mode
- high when in HIRES, GRAPHICS, MIX, !(V4•V2) (·)
A0 | H0 |
A1 | H1 |
A2 | H2 |
A3 | SUM-A3 |
A4 | SUM-A4 |
A5 | SUM-A5 |
A6 | SUM-A6 |
A7 | V0 |
A8 | V1 |
A9 | V2 |
A10 | HIRES•VA + TEXT/LORES•PAGE1 |
A11 | HIRES•VB + TEXT/LORES•PAGE2 |
A12 | HIRES•VC + TEXT/LORES•HBL |
A13 | HIRES•PAGE1 |
A14 | HIRES•PAGE2 |
A15 | - |
VA,VB,VC determine which part of text characters to draw. VC determines which of two LORES blocks to draw.
Colors
Color Ref | 0011 | |
Dark Magenta | 0001 | |
Light Magenta | 1011 | |
HIRES Violet | 0011 | |
Dark Blue | 0010 | |
Light Blue | 0111 | |
HIRES Blue | 0110 | |
Dark Blue-Green | 0100 | |
Light Blue-Green | 1110 | |
HIRES Green | 1100 | |
Dark Brown | 1000 | |
Light Brown | 1101 | |
HIRES Orange | 1001 | |
$5 Grey | 0101 | |
$A Grey | 1010 | |
White | 1111 | |
Black | 0000 |
Design
Event loop runs everything. Key/mouse/resize/quit events come from somewhere (sdl) Key events go to CPU. Event loop can pause emulator and bring up menu.
- change disks
- save state, etc.
- change parameters
Video scanner scanning memory -> chroma/luma signal -> color interpreter -> plotting Event loop hands colorplotter a pixelplotter colorplotter does green / b/w / color choice Some kind of menu subsystem for paused/config mode.
Gospeccy design
spectrum.Application
- HasTerminated chan
- RequestExit()
spectrum.Spectrum48k (app, *rom)
- EmulatorLoop()
- CommandChannel
- speccy.Keyboard.Key{Down,Up}
sdl_output.Main():
- Get a spectrum.Application
- Get a spectrum.Spectrum48k
- r = NewSDLRenderer(app, speccy, …)
- setUI(r)
- initCLI()
- go sdlEventLoop(app, speccy)
- wait for shutdown
- sdl.Quit()
sdlEventLoop():
- evtLoop = app.NewEventLoop()