Raw VIC-20 ROM Memory Map

;
;     Commodore VIC-20 ROM Memory Map
;     V1.0  1 Sep 1994

;
; Data types in headers (for reassembler):
;
;     DATA        Misc data
;     TEXT        String terminated with 00
;     WORD        Vectors in LO/HI byte pairs
;     CHIP        I/O Area
;     EMPTY       ROM containing FF's or AA's
;

;
; BASIC v2.0 interpreter ROM ($B000 - $DFFF)
; This is almost identical to the C64 one.
;

c000  -     Basic Restart Vectors               WORD
c004  -     'cbmbasic'                    DATA
c00c  stmdsp      BASIC Command Vectors               WORD
c052  fundsp      BASIC Function Vectors              WORD
c080  optab BASIC Operator Vectors              WORD
c09e  reslst      BASIC Command Keyword Table         DATA
c129  msclst      BASIC Misc. Keyword Table           DATA
c140  oplist      BASIC Operator Keyword Table        DATA
c14d  funlst      BASIC Function Keyword Table        DATA
c19e  errtab      Error Message Table                 DATA
c328  errptr      Error Message Pointers              WORD
c364  okk   Misc. Messages                      DATA
;c364       '<cr>ok<cr>'                        TEXT
;c369       'error'                             DATA

c389  -     Unused byte                   DATA
c38a  fndfor      Find FOR/GOSUB Entry on Stack
c3b8  bltu  Open Space in Memory
c3fb  getstk      Check Stack Depth
c408  reason      Check Memory Overlap
c435  omerr Output ?OUT OF MEMORY Error
c437  error Error Routine
c469  errfin      Break Entry
c474  ready Restart BASIC
c480  main  Input & Identify BASIC Line
c49c  main1 Get Line Number & Tokenise Text
c4a2  inslin      Insert BASIC Text
c533  linkprg     Rechain Lines
c560  inlin Input Line Into Buffer
c579  crunch      Tokenise Input Buffer
c613  fndlin      Search for Line Number
c642  scrtch      Perform [new]
c65e  clear Perform [clr]
c68e  stxpt Reset TXTPTR
c69c  list  Perform [list]
c717  qplop Handle LIST Character
c742  for   Perform [for]
c7ae  newstt      BASIC Warm Start
c7c4  ckeol Check End of Program
c7e1  gone  Prepare to execute statement
c7ed  gone3 Perform BASIC Keyword
c81d  restor      Perform [restore]
c82c  stop  Perform [stop], [end], break
c857  cont  Perform [cont]
c871  run   Perform [run]
c883  gosub Perform [gosub]
c8a0  goto  Perform [goto]
c8d2  return      Perform [return]
c8f8  data  Perform [data]
c906  datan Search for Next Statement / Line
c928  if    Perform [if]
c93b  rem   Perform [rem]
c94b  ongoto      Perform [on]
c96b  linget      Fetch linnum From BASIC
c9a5  let   Perform [let]
c9c4  putint      Assign Integer
c9d6  ptflpt      Assign Floating Point
c9d9  putstr      Assign String
c9e3  puttim      Assign TI$
ca2c  getspt      Add Digit to FAC#1
ca80  printn      Perform [print#]
ca86  cmd   Perform [cmd]
ca9a  strdon      Print String From Memory
caa0  print Perform [print]
cab8  varop Output Variable
cad7  crdo  Output CR/LF
cae8  comprt      Handle comma, TAB(, SPC(
cb1e  strout      Output String
cb3b  outspc      Output Format Character
cb4d  doagin      Handle Bad Data
cb7b  get   Perform [get]
cba5  inputn      Perform [input#]
cbbf  input Perform [input]
cbea  bufful      Read Input Buffer
cbf9  qinlin      Do Input Prompt
cc06  read  Perform [read]
cc35  rdget General Purpose Read Routine
ccfc  exint Input Error Messages                DATA
;ccfc '?extra ignored<cr>'
;cd0c '?redo from start<cr>'

cd1e  next  Perform [next]
cd61  donext      Check Valid Loop
cd8a  frmnum      Confirm Result
cd9e  frmevl      Evaluate Expression in Text
ce83  eval  Evaluate Single Term
cea8  pival Constant - pi                       DATA
cead  qdot  Continue Expression
cef1  parchk      Expression in Brackets
cef7  chkcls      Confirm Character
cef7  -     -test ')'-
cefa  -     -test '('-
cefd  -     -test comma-
cf08  synerr      Output ?SYNTAX Error
cf0d  domin Set up NOT Function
cf14  rsvvar      Identify Reserved Variable
cf28  isvar Search for Variable
cf48  tisasc      Convert TI to ASCII String
cfa7  isfun Identify Function Type
cfb1  strfun      Evaluate String Function
cfd1  numfun      Evaluate Numeric Function
cfe6  orop  Perform [or], [and]
d016  dorel Perform <, =, >
d01b  numrel      Numeric Comparison
d02e  strrel      String Comparison
d07e  dim   Perform [dim]
d08b  ptrget      Identify Variable
d0e7  ordvar      Locate Ordinary Variable
d11d  notfns      Create New Variable
d128  notevl      Create Variable
d194  aryget      Allocate Array Pointer Space
d1a5  n32768      Constant 32768 in Flpt              DATA
d1aa  facinx      FAC#1 to Integer in (AC/YR)
d1b2  intidx      Evaluate Text for Integer
d1bf  ayint FAC#1 to Positive Integer
d1d1  isary Get Array Parameters
d218  fndary      Find Array
d245  bserr '?bad subscript error'
d248  -     '?illegal quantity error'
d261  notfdd      Create Array
d30e  inlpn2      Locate Element in Array
d34c  umult Number of Bytes in Subscript
d37d  fre   Perform [fre]
d391  givayf      Convert Integer in (AC/YR) to Flpt
d39e  pos   Perform [pos]
d3a6  errdir      Confirm Program Mode
d3e1  getfnm      Check Syntax of FN
d3f4  fndoer      Perform [fn]
d465  strd  Perform [str$]
d487  strlit      Set Up String
d4d5  putnw1      Save String Descriptor
d4f4  getspa      Allocate Space for String
d526  garbag      Garbage Collection
d5bd  dvars Search for Next String
d606  grbpas      Collect a String
d63d  cat   Concatenate Two Strings
d67a  movins      Store String in High RAM
d6a3  frestr      Perform String Housekeeping
d6db  frefac      Clean Descriptor Stack
d6ec  chrd  Perform [chr$]
d700  leftd Perform [left$]
d72c  rightd      Perform [right$]
d737  midd  Perform [mid$]
d761  pream Pull sTring Parameters
d77c  len   Perform [len]
d782  len1  Exit String Mode
d78b  asc   Perform [asc]
d79b  gtbytc      Evaluate Text to 1 Byte in XR
d7ad  val   Perform [val]
d7b5  strval      Convert ASCII String to Flpt
d7eb  getnum      Get parameters for POKE/WAIT
d7f7  getadr      Convert FAC#1 to Integer in LINNUM
d80d  peek  Perform [peek]
d824  poke  Perform [poke]
d82d  wait  Perform [wait]
d849  faddh Add 0.5 to FAC#1
d850  fsub  Perform Subtraction
d862  fadd5 Normalise Addition
d867  fadd  Perform Addition
d947  negfac      2's Complement FAC#1
d97e  overr Output ?OVERFLOW Error
d983  mulshf      Multiply by Zero Byte
d9bc  fone  Table of Flpt Constants             DATA
d9ea  log   Perform [log]
da28  fmult Perform Multiply
da59  mulply      Multiply by a Byte
da8c  conupk      Load FAC#2 From Memory
dab7  muldiv      Test Both Accumulators
dad4  mldvex      Overflow / Underflow
dae2  mul10 Multiply FAC#1 by 10
daf9  tenc  Constant 10 in Flpt                 DATA
dafe  div10 Divide FAC#1 by 10
db07  fdiv  Divide FAC#2 by Flpt at (AC/YR)
db0f  fdivt Divide FAC#2 by FAC#1
dba2  movfm Load FAC#1 From Memory
dbc7  mov2f Store FAC#1 in Memory
dbfc  movfa Copy FAC#2 into FAC#1
dc0c  movaf Copy FAC#1 into FAC#2
dc1b  round Round FAC#1
dc2b  sign  Check Sign of FAC#1
dc39  sgn   Perform [sgn]
dc58  abs   Perform [abs]
dc5b  fcomp Compare FAC#1 With Memory
dc9b  qint  Convert FAC#1 to Integer
dccc  int   Perform [int]
dcf3  fin   Convert ASCII String to a Number in FAC#1
ddb3  n0999 String Conversion Constants         DATA
ddc2  inprt Output 'IN' and Line Number
dddd  fout  Convert FAC#1 to ASCII String
de68  foutim      Convert TI to String
df11  fhalf Table of Constants                  DATA
df71  sqr   Perform [sqr]
df7b  fpwrt Perform power ($)
dfb4  negop Negate FAC#1
dfbf  logeb2      Table of Constants                  DATA
dfed  exp   Perform [exp]

;
;     VIC-20 Kernel ROM
;

;e000 (exp continues) EXP continued From BASIC ROM
e040  polyx Series Evaluation
e08a  rmulc Constants for RND             DATA
e094  rnd   Perform [rnd]
e0f6  bioerr      Handle I/O Error in BASIC
e109  bchout      Output Character
e10f  bchin Input Character
e115  bckout      Set Up For Output
e11b  bckin Set Up For Input
e121  bgetin      Get One Character
e127  sys   Perform [sys]
e153  savet Perform [save]
e162  verfyt      Perform [verify / load]
e1bb  opent Perform [open]
e1c4  closet      Perform [close]
e1d1  slpara      Get Parameters For LOAD/SAVE
e1fd  combyt      Get Next One Byte Parameter
e203  deflt Check Default Parameters
e20b  cmmerr      Check For Comma
e216  ocpara      Get Parameters For OPEN/CLOSE
e261  cos   Perform [cos]
e268  sin   Perform [sin]
e2b1  tan   Perform [tan]
e2dd  pi2   Table of Trig Constants             DATA

;e2dd 1.570796327 pi/2
;e2e2 6.28318531  pi*2
;e2e7 0.25

;e2ec #05   (counter)
;e2ed -14.3813907
;e2f2 42.0077971
;e2f7 -76.7041703
;e2fc 81.6052237
;e301 -41.3417021
;e306 6.28318531

e30b  atn   Perform [atn]
e33b  atncon      Table of ATN Constants              DATA

;e33b #0b   (counter)
;e3ec -0.000684793912
;e341 0.00485094216
;e346 -0.161117018
;e34b 0.034209638
;e350 -0.0542791328
;e355 0.0724571965
;e35a -0.0898023954
;e35f 0.110932413
;e364 -0.142839808
;e369 0.19999912
;e36e -0.333333316
;e373 1.00

e378  init  BASIC Cold Start
e387  initat      CHRGET For Zero-page
e39f  rndsed      RND Seed For zero-page              DATA
;e39f 0.811635157
e3a4  initcz      Initialize BASIC RAM
e404  initms      Output Power-Up Message
e429  words Power-Up Message              DATA
;e429 ' bytes free<cr>'
;e436 '<clr>**** cbm basic v2 ****<cr>'

e44f  bvtrs Table of BASIC Vectors (for 0300)   WORD
e45b  initv Initialize Vectors
e467  bassft      BASIC Warm Restart [RUNSTOP-RESTORE]

e475  ?
e47c  -     Unused Bytes For Future Patches           EMPTY
e4a0  -     Serial Output 1
e4a9  -     Serial Output 0
e4b2  -     Get Serial Data And Clock In
e4bc  -     Get Secondary Address patch for Serial LOAD/VERIFY
e4c1  -     Relocated Load patch for Serial LOAD/VERIFY
e4cf  -     Tape Write patch for CLOSE
e4da  -     Unused                              EMPTY

e500  iobase      Return I/O Base Address
e505  screen      Return Screen Organization
e50a  plot  Read / Set Cursor X/Y Position
e518  cint1 Initialize I/O
e55f  -     Clear Screen
e581  -     Home Cursor
e587  -     Set Screen Pointers
e5b5  -     Set I/O Defaults (Unused Entry)
e5bb  -     Set I/O Defaults
e5cf  lp2   Get Character From Keyboard Buffer
e5e5  -     Input From Keyboard
e64f  -     Input From Screen or Keyboard
e6b8  -     Quotes Test
e6c5  -     Set Up Screen Print
e6ea  -     Advance Cursor
e719  -     Retreat Cursor
e72d  -     Back on to Previous Line
e742  -     Output to Screen
e756  -     -unshifted characters-
e800  -     -shifted characters-
e8c3  -     Go to Next Line
e8d8  -     Output <CR>
e8e8  -     Check Line Decrement
e8fa  -     Check Line Increment
e912  -     Set Colour Code
e921  -     Colour Code Table             DATA

e929  ?                                   DATA

e975  -     Scroll Screen
e9ee  -     Open A Space On The Screen
ea56  -     Move A Screen Line
ea6e  -     Syncronise Colour Transfer
ea7e  -     Set Start of Line
ea8d  -     Clear Screen Line
eaa1  -     Print To Screen
eab2  -     Syncronise Colour Pointer
eabf  -     Main IRQ Entry Point
eb1e  scnkey      Scan Keyboard
eb71  -     Process Key Image
ec46  -     Pointers to Keyboard decoding tables      WORD
ec5e  -     Keyboard Decoding Table - Unshifted DATA
ec9f  -     Keyboard Decoding Table - Shifted   DATA
ece0  -     Keyboard Decoding Table - Commodore DATA
ed21  -     Graphics/Text Control
ed69  -     Keyboard Decoding Table             DATA
eda3  -     Keyboard Decoding Table - Control   DATA

ede4  -     Video Chip Set Up Table             DATA
edf4  -     Shift-Run Equivalent                DATA
edfd  -     Low Byte Screen Line Addresses            DATA
ee14  talk  Send TALK Command on Serial Bus
ee17  listn Send LISTEN Command on Serial Bus
ee49  -     Send Data On Serial Bus
eeb4  -     Flag Errors
eeb4  Status #80 - device not present
eeb7  Status #03 - write timeout

eec0  second      Send LISTEN Secondary Address
eec5  -     Clear ATN
eece  tksa  Send TALK Secondary Address
eed3  -     Wait For Clock
eee4  ciout Send Serial Deferred
eef6  untlk Send UNTALK on Serial Bus
ef04  unlsn Send UNLISTEN on Serial Bus
ef19  acptr Receive From Serial Bus
ef84  -     Serial Clock On
ef8d  -     Serial Clock Off
ef96  -     Delay 1 ms
efa3  -     RS-232 Send
efee  -     Send New RS-232 Byte
f016  -     'No DSR' Error
f019  -     'No CTS' Error
f021  -     Disable Timer
f027  -     Compute Bit Count
f036  -     RS-232 Receive
f05b  -     Set Up To Receive
f068  -     Process RS-232 Byte
f0bc  -     Submit to RS-232
f0ed  -     Send to RS-232 Buffer
f116  -     Input From RS-232
f14f  -     Get From RS-232
f160  -     Serial Bus Idle

f174  -     Table of Kernal I/O Messages        DATA
;f174 '<cr> i/o error #'
; ...
;f1df 'ok<cr>'

f1e2  -     Print Message if Direct
f1e6  -     Print Message
f1f5  getin Get a byte
f20e  chrin Input a byte
f250  -     Get From Tape / Serial / RS-232
f27a  chrout      Output One Character
f2c7  chkin Set Input Device
f309  chkout      Set Output Devic
f34a  close Close File
f3cf  -     Find File
f3df  -     Set File values
f3ef  clall Abort All Files
f3f3  clrchn      Restore Default I/O
f40a  open  Open File
f495  -     Send Secondary Address
f4c7  -     Open RS-232
f542  load  Load RAM From Device
f549  LOAD  -load-
f55c  -     Load File From Serial Bus
f5ca  -     Load File From Tape
f647  -     Print "SEARCHING"
f659  -     Print Filename
f66a  -     Print "LOADING / VERIFYING"
f675  save  Save RAM To Device
f685  SAVE  -save-
f692  -     Save to Serial Bus
f6f1  -     Save to Tape
f728  -     Print "SAVING"
f734  udtim Increment Real-Time Clock
f760  rdtim Read Real-Time Clock
f767  settim      Set Real-Time Clock
f770  STOP  Check STOP Key

;f77e -     Output I/O Error Messages
f77e  'too many files'
f781  'file open'
f784  'file not open'
f787  'file not found'
f78a  'device not present'
f78d  'not input file'
f790  'not output file'
f793  'missing filename'
f796  'illegal device number'

f7af  -     Find Any Tape Header
f7e7  -     Write Tape Header
f84d  -     Get Buffer Address
f854  -     Set Buffer Stat / End Pointers
f867  -     Find Specific Tape Header
f88a  -     Bump Tape Pointer
f894  -     Print "PRESS PLAY ON TAPE"
f8ab  -     Check Tape Status
f8b7  -     Print "PRESS RECORD..."
f8c0  -     Initiate Tape Read
f8e3  -     Initiate Tape Write
f8f4  -     Common Tape Code
f94b  -     Check Tape Stop
f95d  -     Set Read Timing
f98e  -     Read Tape Bits
faad  -     Store Tape Characters

fbd2  -     Reset Tape Pointer
fbdb  -     New Character Setup
fbea  -     Send Tone to Tape
fc06  -     Write Data to Tape
fc95  -     Write Tape Leader
fccf  -     Restore Normal IRQ
fcf6  -     Set IRQ Vector
fd08  -     Kill Tape Motor
fd11  -     Check Read / Write Pointer
fd1b  -     Bump Read / Write Pointer
fd22  -     Power-Up RESET Entry
fd3f  -     Check For A-ROM
fd4d  -     ROM Mask 'a0CBM'              DATA
fd52  restor      Restore Kernal Vectors (at 0314)
fd57  vector      Change Vectors For User
fd6d  -     Kernal Reset Vectors                WORD
fd8d  ramtas      Initialise System Constants
fdf1  -     IRQ Vectors For Tape I/O            WORD
fdf9  ioinit      Initialise I/O
fe39  -     Enable Timer
fe49  setnam      Set Filename
fe50  setlfs      Set Logical File Parameters
fe57  readss      Get I/O Status Word
fe66  setmsg      Control OS Messages
fe6f  settmo      Set IEEE Timeout
fe73  memtop      Set / Read Top of Memory
fe82  membot      Set / Read Bottom of Memory
fea9        NMI Transfer Entry
fed2        Warm Start Basic [BRK]
;fed2 User Vector (default BRK)

ff56        Exit Interrupt
ff5b        RS-232 Timing Table                 DATA
ff72        IRQ Transfer Entry


;
;ff8a Vic-20 Kernel Jump Table
;
ff8a  jmp $fd52   restor            Restore Vectors
ff8d  jmp $fd57   vector            Change Vectors For User
ff90  jmp $fe66   setmsg            Control OS Messages
ff93  jmp $eec0   secnd       Send SA After Listen
ff96  jmp $eece   tksa        Send SA After Talk
ff99  jmp $fe73   memtop            Set/Read System RAM Top
ff9c  jmp $fe82   membot            Set/Read System RAM Bottom
ff9f  jmp $eb1e   scnkey            Scan Keyboard
ffa2  jmp $fe6f   settmo            Set Timeout In IEEE
ffa5  jmp $ef19   acptr       Handshake Serial Byte In
ffa8  jmp $eee4   ciout       Handshake Serial Byte Out
ffab  jmp $eef6   untalk            Command Serial Bus UNTALK
ffae  jmp $ef04   unlsn       Command Serial Bus UNLISTEN
ffb1  jmp $ee17   listn       Command Serial Bus LISTEN
ffb4  jmp $ee14   talk        Command Serial Bus TALK
ffb7  jmp $fe57   readss            Read I/O Status Word
ffba  jmp $fe50   setlfs            Set Logical File Parameters
ffbd  jmp $fe49   setnam            Set Filename
ffc0  jmp ($031a) (iopen)           Open Vector [F40A]
ffc3  jmp ($031c) (iclose)    Close Vector [F34A]
ffc6  jmp ($031e) (ichkin)    Set Input [F2C7]
ffc9  jmp ($0320) (ichkout)   Set Output [F309]
ffcc  jmp ($0322) (iclrch)    Restore I/O Vector [F353]
ffcf  jmp ($0324) (ichrin)    Input Vector, chrin [F20E]
ffd2  jmp ($0326) (ichrout)   Output Vector, chrout [F27A]
ffd5  jmp $f542   load        Load RAM From Device
ffd8  jmp $f675   save        Save RAM To Device
ffdb  jmp $f767   settim            Set Real-Time Clock
ffde  jmp $f760   rdtim       Read Real-Time Clock
ffe1  jmp ($0328) (istop)           Test-Stop Vector [F770]
ffe4  jmp ($032a) (igetin)    Get From Keyboad [F1F5]
ffe7  jmp ($032c) (iclall)    Close All Channels And Files [F3EF]
ffea  jmp $f734   udtim       Increment Real-Time Clock
ffed  jmp $e505   screen            Return Screen Organization
fff0  jmp $e50a   plot        Read / Set Cursor X/Y Position
fff3  jmp $e500   iobase            Return I/O Base Address

;fff6 Unused Vectors
fff6  [ffff]
fff8  [ffff]

;fffa Transfer Vectors
fffa  [fea9]            NMI
fffc  [fd22]            RESET
fffe  [ff72]            IRQ