VIC Super Expander Memory Map
Chuan Chee
St. Catharines, Canada
A map of the significant machine language routines in the VIC Super Expander. You can translate these hexadecimal numbers into decimal, then SYS to them and watch the effects.
General Input/Output Routines
A000-A001
Vector: RESET ($A044)
A022-A003
Vector: NMI ($A077)
A004-A008
ROM identification (‘a0CBM’)
A009-A010
Table: function key numbers
A011-A043
Table: initial function key definitions
A044-A076
RESET routine
A077-A08A
NMI routine
A08B-A0BE
Parse KEY (get parameters and check syntax)
A0BF-A131
Display all function key definitions
A110-A11C
Print'° + chr$(34)' and an optional ‘+’
A11D-A131
Print ‘° + chr$(13)’ and an optional ‘+’
A132-A135
Table: ASCII string for output (‘key’ backwards)
A136-A13F
Table: ASCII string for output (‘° + chr$(13)’ backwards)
A140-A149
Table: ASCII string for output (‘° + chr$(34)’ backwards)
A14A-A17A
Delete current function key string (key number in .X)
A17B-A1B0
Insert string into function key definition area
A1B1-A1BE
Locate function key definition (key number in .X, return index in .Y)
A1BF-A213
Table: new BASIC keywords in ASCII form
A214-A237
Table: vectors corresponding to new BASIC tokens ($CC to $DD)
A238-A2A1
Initialize kernal vectors, I/O, RAM
A2A2-A2C1
Table: kernal vectors (L,H)
A2C2-A2C7
Warm start routine
A2C8-A317
Output a character to device 3 (char in .A)
A318-A336
End music mode
A337-A365
Interpret keyboard matrix input
A366-A369
Table: keyboard matrix code for function keys
A36A-A371
Table: conversion pattern for function keys
A372-A394
IRQ routine
A395-A3A5
Input a char from any device (device number in 99ドル)
A3A6-A3B3
Output a char to any device (char in .A, device num in 9ドルA)
A3B4-A3F1
Input each char from keyboard buffer
A3B4- A3E7
Handle ‘RUN’ key
A3E8-A3F1
Handle ‘RETURN’ key
A3F2-A3FC
Input from device 0
A3FD-A406
Print an error message in GRAPHIC 0 mode (error token in .A)
A407-A4B9
Lexically analyse BASIC source line (translate to tokens)
A4BA-A503
Print BASIC tokens in ASCII form
A504-A529
Start new BASIC statement
A515- A523
Handle new tokens ($CC to $D6)
A52A-A58A
Get and evaluate an expression
A558- A58A
Handle new function tokens ($D7 to $DD)
A58B-A596
Table: BASIC vectors for RAM
A597-A5A4
Change BASIC vectors during RESET
Music Routines
A5A5-A5D0
Save current sound table (address of table in .X,.Y)
A5D1-A601
IRQ music driver
A602-A625
Table: conversion for note index to frequency
A626-A6E5
Interpret music mode characters (char in .A)
A629-A643
Execute ‘O’ command, default 3
A644-A65D
Execute ‘T’ command, default 0
A65E-A674
Execute ‘S’ command, default 4
A675-A686
Execute ‘V’ command, default 7
A687-A693
Execute ‘R’ command
A694-A69B
Execute ‘P’ command
A69C-A6A7
Execute ‘Q’ command
A6A8-
Play new note (note index in .Y)
A6AB-A6B3
Save new sound table when previous note finishes
A6B4-A6B9
Common return routine
A6BA-A6CD
Play notes ‘A’ to ‘G’
A6CE-A6DA
Execute ‘#’ command
A6DB-A6E5
Execute ‘$’ command
A6E6-A6EC
Table: conversion for notes to note index
A6ED-A6EF
Table: conversion for octave to base note index
A6F0-A6F9
Table: conversion for tempo to duration (jiffies)
Parsing New Command Routines
A6FA-
Look for and evaluate first 1 -byte and two 2-byte parameters
A6FD-
Look for and evaluate two 2-byte parameters
A700-
Look for and evaluate one 2-byte parameter
A714-A71B
Saveone 1-byte parameter (parameter in .A, index in .Y)
A71C-
Look for and evaluate two 1-byte parameters
A71F-A72B
Look for and evaluate one 1-byte parameter
A72C-A73F
Parse GRAPHIC (get parameters and check syntax)
A740-A762
Parse CIRCLE
A763-A7A4
Parse DRAW
A7A5-A7BC
Parse POINT
A7BD-
Parse COLOR
A7C8-A7CE
Go to execute commands after parsing
A7CF-A7D8
Parse REGION
A7D9-A7DC
Parse SCNCLR
A7DD-A7E9
Parse SOUND
A7EA-A809
Parse CHAR
A80A-A810
Parse PAINT
A811-A817
Parse RPOT
A818-A81B
Parse RPEN
A81C-A81F
Parse RSND
A820-A823
Parse RCOL
A824-A827
Parse RGR
A828-A842
Parse RDOT
A843-A846
Parse RJOY
A847-A84E
Look for first 1 -byte parameter
A84F-A866
Indirect jump to execute new commands (pointer to parameter save area in .X,.Y, command index in .A)
A867-A878
Table: vector to execute new commands (H)
A879-A88A
Table: vector to execute new commands (L)
Execute New Command Routines
A88B-AA22
Execute GRAPHIC
A8AB-A94E
Handle GRAPHIC 1,2,3 if previous was 0.
A8D4-A942
Transfer BASIC program to above 2000ドル and execute CLR
A943-A94E
Make screen at 1ドルE00 and character set at 1000ドル
A94F-A9AB
Handle GRAPHIC 4
A967-A9AB
Transfer BASIC program down to old location and execute CLR
A9AC- A9B7
Handle GRAPHIC 0 if previous was 1,2,3
A9B8-AA22
Set up proper GRAPHIC screen
AA23-AA28
Execute RGR
AA29-AA6A
Execute COLOR
AA6B-AA84
Execute REGION
AA85-AA8B
Execute RCOL
AA8C-AAE6
Execute RDOT
AAE7-AAF1
Execute POINT
AAF2-AB12
Execute SCNCLR
AB13-AB22
Execute DRAW (c TO x,y...)
AB23-AB34
Execute DRAW (c,x,y TO x,y ...)
AB35-AB54
Execute SOUND
AB55-AB69
Execute RSND
AB6A-AB76
Execute RPOT
AB77-AB7D
Execute RPEN
AB7E-
Plot a single point from parameter save area
AB86-ABE4
Plot a single point from beginning scaled X,Y coordinates
ABE5-
Set up pointers to character and colour memory
ABFA-AC0A
Set up pointer to colour memory
AC0B-
Draw a line with a new starting coordinate
AC11-AC92
Draw a line starting from previous coordinate (using a version of Bresenham's DDA algorithm)
AC93-AD12
Execute CIRCLE (using principal of digital differential analyser (DDA))
AD13-
Convert starting angle to radians
AD19-AD22
Divide FAC# 1 by 16
AD23-
Calculate new scaled X and Y coordinate on locus
AD39-AD6B
Calculate unit offset * scaled radius
AD6C-ADDE
Execute PAINT
ADDF-
Check for possible new lower bound pivot coordinate
ADE8-AE01
Save pivot coordinate
AE02-AE0B
Check for possible new upper bound pivot coordinate
AE0C-
Check if able to PAINT a coordinate
AE0F-AE1E
Check if able to PAINT a coordinate (X, Y in .A, .Y)
AE1F-AE23
Move beginning scaled X,Y coordinate to .A, .Y
AE24-AE3B
Check if coordinate has been already plotted on
AE3C-AE44
Move beginning scaled X coordinate to the right
AE45-AE51
Move beginning scaled X coordinate 2 to the left
AE52-AE56
Flag ‘FORMULA TOO COMPLEX’ error message
AE57-AED9
Execute CHAR
AEDA-AF13
Execute RJOY
AF14-AF33
Set up correct VIC chip screen registers
AF34-
Save number of coordinates and colour register
AF39-AF3E
Save colour register
AF3F-AF47
Copy beginning from ending scaled X,Y coordinate
AF48-AF75
Scale X and Ycoordinates
AF76-AFB0
Scale X or Y coordinate to the range 0 to 159 (.X = .A*coordinate*2/256) (number of columns or rows in .A)
AFB1-AFBA
Table: vector to map Y coordinate to colour memory (L)
AFBB-AFCE
Table: vector to map X coordinate to character memory (L)
AFCF-AFE2
Table: vector to map X coordinate to character memory (H)
AFE3-AFE5
Table: bit set for colour memory
AFE6-AFE6
(not used-contains 00ドル)
AFE7-AFEE
Table: bit mask for highres mode
AFEF-AFF6
Table: bit mask for multicolour mode
AFF7-AFFA
Table: bytes to plot in multicolour mode
AFFB-AFFE
Table: conversion factor for VIC chip screen registers
AFFF-AFFF
(not used-contains $AA)
Note:
(H):
high byte of a two-byte address
(L):
low byte of a two-byte address
Vector:
two-byte address used for indirection of execution
Pointer:
two-byte address for data
Index:
one-byte offset fora table
General RAM Area
0024
Number of coordinates
0024
Flag: colour register mode ($FF= multicolour, 00ドル = highres)
0024-0025
Pointer: New start of variables/start of BASIC memory
0026
Temp area for building VIC chip registers / for building character byte / for saving starl of BASIC (L)
Current Coordinates
0062
Ending scaled X coordinate (0 to 159)
0063
Beginning scaled X coordinate (0 to 159)
0064
Scaled X difference (absolule value)
0065
Ending scaled Y coordinate (0 to 159)
0066
Beginning scaled Y coordinate (0 to 159)
0067
Scaled Y difference (absolute value -1)
For Scaling Coornidates
0069
Multiplicand- 1
006A
16-bit product
006B-006C
10-bit multiplier
For DRAW
0069
Scaled X unit direction - 1
006A
Scaled Y unit direction
006B-006C
Number of scaled Y units left to plot before next scaled X unit (count up)
006D-006E
Number of points left to plot (count up)
For PAINT
0069
Index: pivot coordinates save area
For CHAR
0069
Current row (0 to 19)
006A
Current column (0 to 19)
006B
Length of string
006C-006D
Pointer: string location
General RAM Area
009B
Index : begining of current function key definition
009B-009C
Pointer: current char set address/byte in char set/position in screen memory/destination of byte of BASIC program to transfer
009D
Index: end of function key definition area
009E
Current function key number/length of current function key string
009F
Length of current function key string (count down)
009E-009F
Pointer: byte in colour memory
00AC-00AD
Pointer: current byte (function key definition, tape, scrolling)
00C3
Flag: 0 = have transferred BASIC program to a new location
00C3-00C4
Pointer: kernal set up/current music table/parameter save area (033ドルC)
00FB-00FC
Pointer: top of BASIC memory (usually same as 0284ドル-0285ドル)
For Key
028F-0290
Vector: interpret keyboard input ($A337)
02A1
Number of bytes taken by Super Expander in high memory (88ドル)
02A2
Number of characters in function key definition
02A3
Index: current byte of function key string
02A4
Length of function key string (amount left to output)
For Music
02A5
Previous character in music mode
02A6
Music mode (80ドル = on)
02A7
Screen echo (50ドル = on, 00ドル = off)
02A8
Current voice (sound register - 1)
02A9
Current note index
02AA
Current duration (jiffies)
02AB
Current sound amplitude (volume * 2)
02AC
Current octave (base note index)
02AD
Voice 1 note index (+ 80ドル)
02AE
Voice 1 duration count down (jiffies)
02AF
Voice 2 note index (+ 80ドル)
02B0
Voice 2 duration count down (jiffies)
02B1
Voice 3 note index (+ 80ドル)
02B2
Voice 3 duration count down (jiffies)
02B3
Voice 4 note index (+ 80ドル)
02B4
Voice 4 duration count down (jiffies)
02B5-02BF
(for expansion)
For Execution Of New Commands
02C0-02C2
Jump table: execute new commands (JMP $A84F)
02C3
Current VIC chip left margin register
02C4
Current VIC chip top margin register
02C5
Current VIC chip number of columns register
02C6
Current VIC chip number of rows register
02C7
Current row of cursor
02C8
Current GRAPHIC mode
02C9
(for expansion)
02CA
Current colour register parameter (while plotting)
02CB
Current screen colour
02CC
Current border colour
02CD
Current character colour
02CE
Current auxiliary colour
02CF
Index: parameter save area (while plotting)
02D0
Current character set address page
02D1
Usual character set address page (80ドル)
02D2-02D3
Pointer: old limit of BASIC memory
02D4
Old screen memory page
02D5
Last scaled X coordinate (0 to 159)
02D6
Last scaled Y coordinate (0 to 159)
02D7
Flag: 00ドル = DRAW c,x,y TO, 01ドル = DRAW c TO/current number of out of range coordinates (00ドル = within range)
02D8
Old number of out of range coordinates (00ドル = within range)
02D9
Index: parameter save area (while getting parameters)
02DA-02FF
(for expansion)
Operating System Vectors
0300-0301
Vector: error message
($A3FD)
0302-0303
Vector: BASIC warm start
($C483)
0304-0305
Vector: lexically analyse BASIC source line
($A407)
0306-0307
Vector: print BASIC token in ASCII form
($A4BA)
0308-0309
Vector: start new BASIC statement
($A504)
030A-030B
Vector: get and evaluate an expression
($A52A)
0314-0315
Vector: IRQ
($A372)
0316-0317
Vector: BRK instruction
($A2C2)
0318-0319
Vector: NMI
($FEAD)
031A-031B
Vector: BASIC OPEN statement
($F40A)
031C-031D
Vector: BASIC CLOSE statement
($F34A)
031E-031F
Vector: set input
($F2C7)
0320-0321
Vector: set output
($F309)
0322-0323
Vector: restore I/O
($F3F3)
0324-0325
Vector: input a character
($A395)
0326-0327
Vector: output a character
($A3A6)
0328-0329
Vector: test STOP key
($F770)
032A-032B
Vector: BASIC GET statement
($F1F5)
032C-032D
Vector: abort I/O
($F3EF)
032E-032F
Vector: user BRK instruction
($A2C2)
0330-0331
Vector: BASIC LOAD statement
($F549)
0332-0333
Vector: BASIC SAVE statement
($F685)
0334-033B
(for expansion)
Save Area
033C-03F8
Save area: parameter passing/pivot coordinates (PAINT)
For Circle
033C
Index: X or Y
0347-0348
Old scaled X coordinate on locus
0349-034A
Old scaled Y coordinate on locus
034B-034C
New scaled X coordinate on locus
034D-034E
New scaled Y coordinate on locus
034F-0353
Floating point unit offset X coordinate
0355-0359
Floating point unit offset Y coordinate