New features

May 9, 2026 · View on GitHub

Here are the features of the Open ROMs not found in the original ROMs from the 80s (many of them are configurable during compilation):

  • improved keyboard scanning, resistant to ghosting and joystick interference, supports additional C128 keys

  • joystick can be used to move text cursor

  • pre-defined function keys

  • JiffyDOS and DolphinDOS protocols support

  • DOS wedge (direct mode only) - @<unit_number>, @<command>, @$[mask], @<unit_number>$, @<unit_number>$[mask] @

  • BASIC extensions, see the documentation

  • extended / tweaked LOAD / VERIFY commands

    • start/end addresses are displayed, in the Final cartridge style
    • command with just the file name tries to use the last device if it's number seems sane; otherwise uses 8
    • command without parameters tries to load first file from drive chosen as above
  • LIST command should never damage the screen if trying to list memory content which is not a BASIC program

  • high performance garbage collector

  • turbo tape load support (as device 7, or using ←L / ←M, optionally with a file name), quite sophisticated: up to 250 blocks (can store bytes under I/O), on MEGA65 motherboard automatically adjusts itself for tape speed differences

  • normal tape load error log is limited by free stack space only (no artificial limitation like in original ROMs)

  • tape format autodetection; normal vs turbo is mostly transparent to user

  • improved support for tape adapters (for using regular casette players and other audio devices instead of Datasette) and emulators

  • built-in tape head align tool (only feasible to use on machines with extended memory, like MEGA65)

  • uses RAM under ROM and I/O: 51199 bytes free (up to $CFFF) by default, but 61438 is also possible

  • cold/warm start silences multiple SID chips

  • warm start due to BRK prints out the instruction address

NOTE: extra features and their syntax can change in the future!

Features missing

The following ROM features are currently missing and are not planned due to space considerations:

  • full tape support - VERIFY, SAVE, sequential files; tape is considered a legacy medium, so its support is going to be limited
  • mock 6551 emulation - this only complicates the RS-232 support for original ROMs, probably noone needs it

The following ROM features are currently missing:

  • most BASIC commands
  • BASIC integer/float variables/arrays (strings work now, with the exception of undefined arrays)
  • BASIC expression handling (again, strings should work now)
  • RS-232 support
  • NMI handling is incomplete

Hardware support status

Keyboard


DriverStatusRemarks
C64DONE
C128DONE
MEGA65PARTIALcode mostly complete, but not tested yet

Screen


DriverStatusRemarks
VIC-IIDONE
80 columns, VDCNOT DONE
80 columns, MEGA65PARTIALno windowing mode and C65/M65 extra keys support

Tape port (LOAD only!)

  • Tapuino
  • Datasette

DriverStatusRemarks
normalDONEup to 202 blocks, like original ROM
turboDONEup to 250 blocks, like the best implementations

IEC bus

  • SD2IEC, petSD+, µIEC
  • Pi1541, Ultimate II
  • most disk drives and printers
  • some hard drives

DriverStatusRemarks
standardDONE
JiffyDOSPARTIALLOAD needs improvement for better performance
ELoad v1NOT DONE
DolphinDOSDONE
CIA burst modNOT DONE
MEGA65 burstNOT DONE

IEEE-488 bus

  • petSD+
  • PET era disk drives and printers
  • various scientific equipment

DriverStatusRemarks
CBM cartridgeNOT DONE

MEGA65 storage


DriverStatusRemarks
SD cardPARTIALwork-in-progress, can already load files
floppy driveNOT DONE
ram diskNOT DONE

RS-232

  • modems (telephone, WiFi)
  • parallel port printers

DriverStatusRemarks
UP2400NOT DONE
UP9600NOT DONEwork started, not functional yet
ACIA 6551NOT DONE

API status

Status of the various APIs and variables from the original ROMs

Low memory locations (pages 0 - 3)

For the current status of the low memory location implementation andd usage check this file. NOTE: available vector to certain routine does not mean that this routine is fully implemented!

BASIC

Official BASIC routines


EntryUnofficialNameStatusRemarks
(\$0003)ADRAY1NOT DONE
(\$0005)ADRAY2NOT DONE
(00300)$E38BERRORNOT DONE
(00302)$A483MAINNOT DONEsome implementation exists, but not connected here
(00304)$A57CCHRNCHNOT DONE
(00306)$A71AQPLOPNOT DONEsome implementation exists, but not connected here
(00308)$A7E4GONENOT DONEsome implementation exists, but not connected here
(0030A)$AE86EVALNOT DONEsome implementation exists, but not connected here
($A000)$E394cold startPARTIAL
($A002)$E3B7warm startPARTIAL

Math package

Floating point mathematical routines - not official, but well known and broadly used. Note: there is an awful mess regarding naming (sometimes same name references different routines in different sources), so a custom naming scheme was applied.


AddressNameStatusRemarks
$A9C4convert_FAC1_to_INTNOT DONE
$AABCprint_FAC1NOT DONE
$AF7Bcompute_TINOT DONE
$AF7Enot named yetNOT DONE
$AF87set_FAC1_mantissaDONE
$AF9Acompute_STDONE
$B1AAFACINXNOT DONEconvert FAC1 to 16-bit signed integer
$B1BFconvert_FAC1_to_s16NOT DONE
$B391GIVAYFDONEFrom the Microsoft BASIC, original name: GIVAYF
$B3A2convert_Y_to_FAC1DONEFrom the Microsoft BASIC, original name: SNGFLT
$B794convert_u8_A_to_FAC1DONE
$B7B5STRVALPARTIALOnly for 38k memory model
$B7F7convert_FAC1_to_ADDRNOT DONE
$B849add_HALF_FAC1DONEFrom the Microsoft BASIC, original name: FADDH
$B850sub_MEM_FAC1DONEFrom the Microsoft BASIC, original name: FSUB
$B853sub_FAC2_FAC1DONEFrom the Microsoft BASIC, original name: FSUBT
$B862add_align_exponentsDONEFrom the Microsoft BASIC, original name: FADD5
$B867add_MEM_FAC1DONEFrom the Microsoft BASIC, original name: FADD
$B86Aadd_FAC2_FAC1DONEFrom the Microsoft BASIC, original name: FADDT
$B8D2abs_and_normal_FACDONEFrom the Microsoft BASIC, original name: FADFLT
$B8D7normal_FAC1DONEFrom the Microsoft BASIC, original name: NORMAL
$B8F7zero_FAC1DONEFrom the Microsoft BASIC, original name: ZEROFC
$B8FEadd_mantissas_FAC1..DONEFrom the Microsoft BASIC, original name: FADD2
$B936shift_carry_into_FACDONEFrom the Microsoft BASIC, original name: SQUEEZ
$B947inv_FAC1_mantissaDONEFrom the Microsoft BASIC, original name: NEGFAC
$B96Finc_FAC1DONEFrom the Microsoft BASIC, original name: INCFAC
$B983shiftr_FAC1DONEFrom the Microsoft BASIC, original name: SHIFTR
$B9EAlog_FAC1DONEFrom the Microsoft BASIC, original name: LOG
$BA28mul_MEM_FAC1DONEFrom the Microsoft BASIC, original name: FMULT
$BA2Bmul_FAC2_FAC1DONEFrom the Microsoft BASIC, original name: FMULTT
$BA8Cmov_MEM_FAC2DONEFrom the Microsoft BASIC, original name: CONUPK
$BA90get_FAC2_via_INDEXDONEFrom the Microsoft BASIC, no label
$BAE2mul10_FAC1DONEFrom the Microsoft BASIC, original name: MUL10
$BAFEdiv10_FAC1_pDONEFrom the Microsoft BASIC, original name: DIV10
$BB07div_FAC2_MEMDONEFrom the Microsoft BASIC, original name: FDIVF
$BB0Fdiv_MEM_FAC1DONEFrom the Microsoft BASIC, original name: FDIV
$BB12div_FAC2_FAC1DONEFrom the Microsoft BASIC, original name: FDIVT
$BB8Fmov_RES_FAC1DONEFrom the Microsoft BASIC, original name: MOVFR
$BBA2mov_MEM_FAC1DONEFrom the Microsoft BASIC, original name: MOVFM
$BBA6get_FAC1_via_INDEXDONEFrom the Microsoft BASIC, no label
$BBC7mov_r_FAC1_TMP2DONEFrom the Microsoft BASIC, original name: MOV2F
$BBCAmov_r_FAC1_TMP1DONEFrom the Microsoft BASIC, original name: MOV1F
$BBD0mov_r_FAC1_VARDONEFrom the Microsoft BASIC, original name: MOVVF
$BBD4mov_r_FAC1_MEMDONEFrom the Microsoft BASIC, original name: MOVMF
$BBFCmov_FAC2_FAC1DONEFrom the Microsoft BASIC, original name: MOVFA
$BC0Cmov_r_FAC1_FAC2DONEFrom the Microsoft BASIC, original name: MOVAF
$BC0Fmov_FAC1_FAC2DONEFrom the Microsoft BASIC, original name: MOVEF
$BC1Bround_FAC1DONEFrom the Microsoft BASIC, original name: ROUND
$BC2Bsgn_FAC1_ADONEFrom the Microsoft BASIC, original name: SIGN
$BC39sgn_FAC1DONEFrom the Microsoft BASIC, original name: SGN
$BC3Cconvert_A_to_FAC1DONEFrom the Microsoft BASIC, original name: FLOAT
$BC44convert_i16_to_FAC1DONEFrom the Microsoft BASIC, original name: FLOATS
$BC58abs_FAC1DONEFrom the Microsoft BASIC, original name: ABS
$BC5BFCOMPDONEFrom the Microsoft BASIC, original name: FCOMP
$BC9BQINTDONEFrom the Microsoft BASIC, original name: QINT
$BCCCint_FAC1DONEFrom the Microsoft BASIC, original name: INT
$BCE9clear_FAC1DONEFrom the Microsoft BASIC, original name: CLRFAC
$BCF3FINPARTIALFrom the Microsoft BASIC Only for 38k memory model
$BD7EFINLOGDONEFrom the Microsoft BASIC, original name: FINLOG
$BDDDFOUTDONEFrom the Microsoft BASIC, original name: FOUT
$BF71sqr_FAC1DONEFrom the Microsoft BASIC, original name: SQR
$BF74sqr_FAC2DONEFrom the Microsoft BASIC, no label
$BF78pwr_FAC2_MEMDONEFrom the Microsoft BASIC, no label
$BF7Bpwr_FAC2_FAC1DONEFrom the Microsoft BASIC, original name: FPWRT
$BFB4toggle_sign_FAC1DONEFrom the Microsoft BASIC, original name: NEGOP
$BFEDexp_FAC1PARTIALFrom the Microsoft BASIC Only for the 38k model
$E043poly1_FAC1DONEFrom the Microsoft BASIC, original name: POLYX
$E059poly2_FAC1DONEFrom the Microsoft BASIC, original name: POLY
$E097rnd_FAC1DONE
$E09Arnd_ADONE
$E0BErnd_generateDONE
$E264cos_FAC1DONEFrom the Microsoft BASIC, original name: COS
$E26Bsin_FAC1DONEFrom the Microsoft BASIC, original name: SIN
$E2B4tan_FAC1DONEFrom the Microsoft BASIC, original name: TAN
$E30Eatn_FAC1DONEFrom the Microsoft BASIC, original name: ATN

In addition to the routines, the following floating-number constants are available at their original locations:

AddressNameStatusRemarks
$AEA8const_PIDONEπ
$B1A5const_NEG_32768DONE-32768
$B9BCconst_ONEDONE1.0
$B9D6const_INV_SQR_2DONE1.0 / sqr(2.0)
$B9DBconst_SQR_2DONEsqr(2.0)
$B9E0const_NEG_HALFDONE-0.5
$B9E5const_LOG_2DONElog_e(2.0)
$BAF9const_TENDONE10.0
$BDB3const_NZ0999DONE99999999.9
$BDB8const_NZ9999DONE999999999.2
$BDBDconst_NZMILDONE1000000000.0
$BF11const_HALFDONE0.5
$BFBFconst_INV_LOG_2DONE1.0 / log_e(2.0)
$BFE8const_ONE duplicateDONE1.0
$E2E0const_HALF_PIDONEPI / 2.0
$E2E5const_DOUBLE_PIDONEPI * 2.0
$E2EAconst_QUARTERDONE0.25
$E309const_DOUBLE_PI duplicateDONEPI * 2.0

And the following big endian int32 constants at their original locations:

AddressNameStatusRemarks
$BF16FOUTBLDONE100000000
$BF1AFOUTBL + 4DONE10000000
$BF1EFOUTBL + 8DONE-1000000
$BF22FOUTBL + 12DONE100000
$BF26FOUTBL + 16DONE-10000
$BF2AFOUTBL + 20DONE1000
$BF2EFOUTBL + 24DONE-100
$BF32FOUTBL + 28DONE10
$BF36FOUTBL + 32DONE-1
$BF3AFDCENDDONE-2160000
$BF3EFDCEND + 4DONE216000
$BF42FDCEND + 8DONE-36000
$BF46FDCEND + 12DONE3600
$BF4AFDCEND + 16DONE-600
$BF4EFDCEND + 20DONE60

Other unofficial BASIC routines/locations

Not all of them - only these we want to have implemented.


AddressNameStatusRemarks
$A004revision strDONE
$A408REASONNOT DONE
$A453(unknown)NOT DONE
$A533LINKPRGDONE
$A644newNOT DONE
$A659set txt ptrNOT DONE
$A68ERUNCDONE
$A7AENEWSTTPARTIALredirected to RUN command
$AB1ESTROUTDONE
$AD9EFRMEVLPARTIAL
$BDCDLINPRTDONEtemporary implementation
$E3A2MOVCHGDONEmemory model 38K only
$E3BFINITNOT DONE
$E422INITMSGDONE
$E453RVECTNOT DONE

Kernal

Official Kernal routines

NOTE: Even the 'DONE' routines won't support features described as missing in one of the previous chapters!


AddressUnofficialNameStatusRemarks
(\$028F)KEYLOGDONE
$FF81$FF5BCINTDONE
$FF84$FDA3IOINITDONE
$FF87$FD50RAMTASDONE
$FF8A$FD15RESTORDONE
$FF8D$FD1AVECTORDONE
$FF90SETMSGDONE
$FF93SECONDDONE
$FF96TKSADONE
$FF99$FE25MEMTOPDONE
$FF9CMEMBOTDONE
$FF9FSCNKEYDONE
$FFA2SETTMODONE
$FFA5ACPTRDONE
$FFA8CIOUTDONE
$FFABUNTLKDONE
$FFAEUNLSNDONE
$FFB1LISTENDONE
$FFB4TALKDONE
$FFB7READSTDONE
$FFBASETFLSDONE
$FFBDSETNAMDONE
$FFC0$F34AOPENDONE
$FFC3$F291CLOSEDONE
$FFC6$F20ECHKINDONE
$FFC9$F250CKOUTDONE
$FFCC$F333CLRCHNDONE
$FFCF$F157CHRINPARTIALno screen device support
$FFD2$F1CACHROUTDONE
$FFD5$F49ELOADDONE
(\$0330)$F4A5LOADDONE
$FFD8$F5DDSAVEDONE
(\$0332)$F5EDSAVEDONE
$FFDBSETTIMDONE
$FFDERDTIMDONE
$FFE1$F6EDSTOPDONE
$FFE4$F13EGETINPARTIALno screen device support
$FFE7$F32FCLALLDONE
$FFEAUDTIMDONE
$FFEDSCREENDONE
$FFF0$E50APLOTDONE
$FFF3IOBASEDONE
($FFFA)NMI vecPARTIAL
($FFFC)$FCE2RESET vecDONE
($FFFE)IRQ/BRK vecDONE

Unofficial Kernal routines/locations

Not all of them - only these we want to have implemented.


AddressNameStatusRemarks
$E518legacy part of CINTDONE
$E51Binit screen keyboard, no VICDONE
$E544clear screenDONE
$E50Cset cursor positionDONE
$E536init screen ?PARTIAL
$E566home cursorDONE
$E56Cset PNT and USER valuesDONE
$E5A0setup VIC II & I/ODONE
$E6B6advance cursorNOT DONE
$E701previous lineNOT DONE
$E716screen CHROUTNOT DONE
$E8DAcolor code tableDONE
$E8EAscroll logical line upDONE
$E96Cinsert line on topNOT DONE
$E9FFclear lineDONE
$EA31default IRQPARTIAL
$EA7Eack CIA1 + belowDONE
$EA81ret from IRQ/NMIDONE
$EB48set keyboard mapping tableDONE
$F142get key from bufferDONE
$F3F6(unknown)NOT DONE
$F646IEC closeNOT DONE
$FD30default vectorsDONE
$FD90(unknown)NOT DONE
$FE2Dmemtop set partDONE
$FE47default NMIPARTIAL
$FE66default BRKDONE
$FF80revision byteDONE

API extensions - MEGA65 build

Note: this is likely to change in the future, possibly in an incompatible way!


AddressNameStatusRemarks
?MONITORWIPlaunches a machine language monitor
?BOOTCPMWIPlaunches the CP/M operating system
?PRHEXDONEprint hex value from .A
$FF7DPRIMMDONEprint immediate, address compatible with C128 and C65 ROMs
$FFF8DONEreset vector for usage within hypervisor, starts in legacy mode