goapple2/docs/apple2.org

22 KiB

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

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()