Comparative ROM Atlas: From ZX Spectrum to 2068

Author(s): Nazir A. Pashtoon
Publication: Syntax
Pub Details: Syntax/Syntax ZX80 v5 n10 (Volume 5, Issue 10)
Date: October 1984
Pages: 3, 5, 7, 9, 11

To convert SPECTRUM software to the 2068, you need the location and function of ROM routines in each. You can buy the annotated ROM disassembly from Melbourne House or Zebra Systems. Timex sells the 2068 technical manual. Our cross-index links the two ROMs.

This atlas lists routines in order of their hex address in the SPECTRUM ROM and provides the hex address for the corresponding 2068 routine. Labels and names for the SPECTRUM routines come from The Complete Spectrum ROM Disassembly by Ian Logan and Frank O’Hara. All labels and names for 2068 functions come from Corcoran and Branigin‘s Timex 2068 Technical Manual.

To disassemble the TS2068 Home ROM and 8K Extension ROM (EXROM), you will need a program like HOT Z (Reviewed in SYNTAX May 84). HOT Z has a large names file which you can load along with the program to provide subroutine names and some labels for the disassembly. HOT Z self-starts in disassembly mode, to display the Home ROM from 0000h.

In order to disassemble or use EXROM routines, you must enable the bank-switching logic, perform the desired task, then de-activate the EXROM. The 8K EXROM overlays the first 8K chunk of the 16K Home ROM.

To illustrate, the following code copies EXROM to RAM at 8000h, from which you can disassemble or display it.

DI             :    LD BC,2000
LD A,01        :    LDIR
OUT (F4),A     :    XOR A
IN A,(FF)      :    OUT (FF),A
SET 7,A        :    OUT (F4),A
OUT (FF),A     :    EI
LD HL,0000     :    RET
LD DE,8000     :

Headscan (SYNTAX Sep.84) MC is an example of EXROM use. If you want to change the header storage location in RAM, change LD IX,FA3C to, say, LD IX,8000.

Finally, a note concerning the cassette routines of the 2068. All are located in the EXROM, but use subroutines and RST’s in the Home ROM. When a call to the Home ROM or RST occurs, bank switching must take place. This adds code to the SPECTRUM documented by Logan.

Corresponding to every CALL or RST in SPECTRUM cassette routines, you find, in the TS2068 EXROM, a 23-byte code segment which starts with PUSH IX and ends with POP IX. This code preserves and sets up registers and calls the service routine at 0F99h in the EXROM. The service routine transfers the calls to the bank switching code in 2068 RAM, which in turn completes the call to the Home ROM.

SPECTRUM LABEL, NAMESPECTRUM ROM AddrTS 2068 ROM AddrTS 2068 LABEL, NAME
START00000000PLUGIN
ERROR-100080008
PRINT-A-100100010WRCH
GET-CHAR00180018
NEXT-CHAR00200020
FP-CALC00280028
BC-SPACES00300030
MASK-INT00380030
004F004FPHLAF
ERROR-200530053
ERROR-300550055LE3
RESET00660066
NO-RESET00700070
CH-ADD+100740074NEXTCH
TEMP-PTR100770077NC-HL
TEMP-PTR200780078TC-HL
SKIP-OVER007D007D
TOKENS00950098TOKENS
KEYTBL02270245
KEY-SCAN028E02B0K-SCAN
KEYBOARD02BF02E1UPD-K
K-REPEAT03100336
K-TEST031E035CK-BASE
K-DECODE03330371CHCODE
BEEPER03B503F3PARP
BEEP03F80436BEEP
PRINT-OUT09F40500SEND-TV
PO-BACK-10A23053AP-LFT
PO-RIGHT0A3D0554P-RT
PO-ENTER0A4F0566P-NL
PO-COMMA0A5F0576
PO-QUEST0A690580
PO-TV-20A6D0584
0A9B05B2SET-AT
PO-ABLE0AD905F0
PO-STORE0ADC05F3STTVCU
PO-FETCH0B03061ALDTVCU
PO-ANY0B24063B
PO-ALL0B7F06B4
PO-ATTR0BDB0710ATTBYT
PO-MSG0C0A073FPUTMES
PO-SAVE0C3B0776PR-TV2
PO-SEARCH0C41077C
PO-SCR0C550790TVFUL?
REPORT-50C8607C1ERR5
TEMPS0D4D0888R-ATTS
CLS0D6B08A6K-CLS
CLS-LOWER0D6E08A9CLLHS
CL-ALL0DAF08EACLS
CL-SET0DD90914SET-CUR
CL-SC-ALL0DFE0939SCRL
CL-LINE0E44097FCLS-B
CL-ATR0E8809C3
CL-ADDR0E9B09D6
COPY0EAC0A02K-DUMP
COPY-BUFF0ECD0A23DUMPPR
CLEAR-PRB0EDF0A35CLPR
COPY-LINE0EF40A4APRSCAN
EDITOR0F2C0A82EDIT-K
ADD-CHAR0F810AE7INSA
ED-EDIT0FA90B12
ED-DOWN0FF30B59
ED-LEFT10070B6B
ED-RIGHT100C0B73
ED-DELETE10150B7BDELSYM
ED-ENTER10240B8A
ED-EDGE10310B97
ED-UP10590BBF
ED-SYMBOL10760BDC
ED-ERROR107F0BE9
CLEAR-SP10970BFEDEL-K
KEY-INPUT10A80C0EIN-K
ED-COPY111D0C83ECHO
REMOVE-FP11A70D0DDESLUG
NEW11B70D1DK-NEW
START/NEW11CB0D31INIT
RAM-SET12190D7FNEW
MAIN-EXEC12A20E28
MAIN-112A90E2FLED18
MAIN-413030ED8LED4
REPORT-MSG13910F65
MAIN-ADD155D1158
CH-INFO15AF11AACHINIT
INIT-STR15C611C1SMINIT
WAIT-KEY15D411CFRDCH
INPUT-AD15E611E1INCH
OUT-CODE15EF11EAPUTDIG
PRINT-A-215F211EDSENDCH
CHAN-OPEN16011230SELECT
REPORT-O160E123DERRO
CHAN-FLAG16151248SEL-HL
CHAN-K1634129A
CHAN-s164212A8
CHAN-P164D12B3
ONE-SPACE165212B8INS1
MAKE-ROOM165512BBINSERT
POINTERS166412CAREMGSZ
LINE-ZERO168F131E
LINE-NO16951324GET-LN
RESERVE169E132DLCU2
SET-MIN16B0133FCLEL
SET-WORK16BF134EX-CALC
REC-EDIT16D41363X-T-HL
SET-STK16C51354RESET
INDEXER16DC136BSEARCH
1374SRCHSC
CLOSE16E5139FCLOSE
16EB13A8RSTSTR
CLOSE-2170113BECLCHAN
OPEN1736142AOPEN
OPEN-11756145E
OPEN-2175D1465OPCHAN
CAT-ETC.179325C8CAT
AUTO-LIST179514E1LIST
LLIST17F51541K-LLST
LIST17F91545K-LIST
186015ACLPO
OUT-LINE185515A1PUT-SR?
OUT-LINE2187D15C9PUT
NUMBER18B61602
OUT-FLASH18C1160DFLASHA
OUT-CURS18E1162DPR-CUR
LN-FETCH190F165BNEXT-L
LN-STORE191C1668DE-HL
OUT-SP219251671
LINE-ADDR196E16D6FIND-L
CP-LINES198016E8CP-BC
198816F0SUBLIN
EACH-STMT198B16F3SUBLN1
NEXT-ONE19B81720RECLEN
DIFFER19DD1745
RECLAIM-119E5174DDEL-DE
RECLAIM-219E81750DELREC
E-LINE-NO19BF1768LINENO
OUT-NUM-11A1B1788PUT-BC
OUT-NUM-21A281795PU-LN
OUT-NUM-31A30179D
LINE-SCAN1B171A27SYNTAX
STMT-LOOP1B281A44LS4
SEPARATOR1B6F1AB2
STMT-RET1B761AB9
LINE-RUN1B8A1AD8EXCUTE
LINE-NEW1AEC1B9E
REM1BB21B00
LINE-END1BB31B09
LINE-USE1BBF1B15
NEXT-LINE1BD11B27
STMT-RET1B761AB9ENDSTT
CHECK-END1Bee1B44END?
STMT-NEXT1BF41B4AENDTEM
CLASS-011C1F1B82TEM1
REPORT-21C2E1B91ERR2
VAL-FET-21C591BBCLT22
NEXT-2-NUM1C791BDCDYADIC
CLASS-061C821BE5TEM6
REPORT-C1C8A1BEDSYNERR
CLASS-0A1C8C1BEFTEM10
PERMS1C961BF9
FETCH-NUM1CDE1C49OPTNO
USE-ZERO1CE61C51STK-0
STOP1CEE1C59STOP
IF1CF01C5B
FOR1D031C78FOR
LOOK-PROG1D861D28SKIP
NEXT1DAB1D55NEXT
READ1DEC1D96READ
DATA1E271E82DATA
RESTORE1E421E9D
RANDOMIZE1E4F1ED4RAND
REST-RUN1E451ECARESTBC
CONTINUE1E5F1EE4CONT
GO TO1E671EF1JUMP
OUT1E7A1F04
POKE1E801F0A
TWO-PARAM1E851F0F
FIND-INT11E941F1EFIX-U1
FIND-INT21E991F23FIX-U
REPORT-B1E9F1F29ERRB
RUN1EA11F2E
CLEAR1EAC1F36CLEAR
CLEAR-RUN1EAF1F39CLR-BC
GOSUB1EED1F99GO-SUB
TEST-ROOM1F051FBBCHK-SZ
REPORT-41F151FCFERR4
RETURN1F231FD4RETURN
PAUSE1F3A1FEFPAUSE
BREAK-KEY1F542009BREAK
DEF FN1F60201DDEF
********2128SOUND
UNSTACK-Z1FC3214F
LPRINT1FC92155K-LPR
PRINT1FCD2159K-PRN
PRINT-21FDF217EP-SEQ
PRINT-CR1FF52194
PRINT-ITEM11FFC219B
PR-STRING203C21DB
PR-END-Z204521E4
PR-ST-END204821E7TERM?
PR-POS-1204E21ED
STR-ALTER2070220FSTRITO
INPUT2089222BINPUT
IN-ITEM-120C1226BI-SEQ
IN-ASSIGN21B92363
REPORT-H21D4237EERRH
IN-CHAN-K21D62380NOTKB?
CO-TEMP-121E1238B
CO-TEMP-221E2238CGR-COL
CO-TEMP-421FC23A6COLITM
CO-TEMP-7223423DECOLOUR
CO-CHANGE226C2416
CO-TEMP-C2273241DHIFLSH
BORDER2294243EBORDER
********24D2NEWDEV
********25B9PASSEM
PIXEL-ADD22AA2603SCRMBL
POINT22CB2624F-PNT
PLOT22DC2635PLOT
PLOT-SUB22E5263EPLOTBC
STK-TO-BC23072660GETXY
STK-TO-A2314266D
CIRCLE23202679CIRCLE
DRAW238226DBDRAW
CD-PRMS1247D27D6
DRAW-LINE24B72810DRAW-L
SCANNING24FB2854EXPRN
SYNTAX-Z25302889INTPT?
S-ATTR-s258028D7F-ATTR
S-U-PLUS25AF296D
S-LETTER26C92A87
S-FN-SBRN27BD2B7B
S-SCREEN$-S2535288EF-SCRN
S-RND25F829B6RND
S-PI262729E5F-PI
S-INKEY$263429F2F-INKEY
FN-SKPOVER28AB2C69NXT-HL
LOOK-VARS28B22C70FIND-N
STK-F-ARG29512D0F
STK-VAR29962D54GET-EL
SLICING2A522E10SLICER
STK-ST-02AB12E6F
STK-STO-12AB22E70PSHSTR
STK-STORE2AB62E74PAEDCB
INT-EXP-12ACC2E8A
DE,(DE+1)2AEE2EAC
GET-HL*DE2AF42EB2
LET2AFF2EBDLET
L-ENTER2BA62F64
L-ADD-$2BAF2F6D
L-STRING2BC62F84
L-FIRST2BEA2FA8
STK-FETCH2BF12FAFPOPSTR
DIM2C022FC0DIM
ALPHANUM2C883046ALNUM?
ALPHA2C8D304BALPHA?
DEC-TO-FP2C9B3059STKSUM
NUMERIC2D1B30D9DIGIT?
STK-DIGIT2D2230E0
STACK-A2D2830E6STK-A
STACK-BC2D2B30E9STK-BC
INT-TO-FP2D3B30F9ININT
E-TO-FP2D4F3100
INT-FETCH2D7F313DLDDE
P-INT-STO2D8C314ASTDE-U
INT-STORE2D8E314CSTDE-S
FP-TO-BC2DA23160FP2BC
LOG(2↑A)2DC1317F
FP-TO-A2DD53193FP2A
PRINT-FP2DE331A1OUTPUT
CA=10*A+C2F8B334A
PREP-ADD2F9B335A
FETCH-TWO2FBA3379SUMSLD
SHIFT-FP2Fdd339CSHIFT
ADD-BACK300433C3
SUBTRACT300F33CESUB
addition301433D3ADD
HL=HL*DE30A93468MULT
PREP-M/D30C0347F
multiply30CA3489
REPORT-631AD356CERR6
division31AF356EDIVIDE
truncate321435D3TRUNC
RE-ST-TWO32933052
multiply30CA3489TIMES
RE-STACK32973656FLOAT
FP calculator start:32C53684
CALCULATE335B371ACTRO
fp-calc-233A23761
TEST-5-SP33a93768ROOM?
STACK-NUM33B43773STK-M
MOVE-FP33C0377FRAMNO
STK-DATA33C63785
SKIP-CONS33F737B6
LOC-MEM340637C5ARRAY
get-mem-0340F37CF
stk-zero341B37DA
st-mem-0342D37EC
EXCHANGE343C37FB
series-06346A3829
NEGATE346E382DNEGATE
sgn34923851
in34A53864
peek34AC386B
usr-no34B33872
usr-$34BC38D7
TEST-ZERO34E93904TEST0
GREATER-034F93914
NOT3501391C
less-035063921
FP-0/1350B3926STBOOL
or351B3936
no-&-no3524393F
str-&-no352D3948
no-l-eql353B3956
strs-add359C39B7
STK-PNTRS35BF39DD
chr$35C939E4
val-&-val$35DE39F9
str$361F3A3A
read-in36453A60
code36693A84
len36743A8F
dec-jr-nz367A3A95
JUMP36863AA1
jump-true368F3AAA
end-calc369B3AB6
n-mod-m36A03ABBINTDIV
********3AC5LDMES
int36AF3ACAINT
EXP36C43ADFEXP
ln37133B2E
get-argt37833B9EANGLE
cos37AA3BC5COS
sin37B53BD0SIN
tan37DA3BF5TAN
atn37E23BFDATN
asn38333C4EASN
acs38433C5EACS
sqr384A3C65ROOT
to-power38513C6CTO-THE
********3C89SEPRMT
(note:SEPRMT are tape msgs.)
‘spare’386E3CDC‘EMPTY’
charctr-set3D003D00CH-SET

The Spectrum does not support the following routines:

SPECTRUM LABEL, NAMESPECTRUM ROM AddrTS 2068 ROM AddrTS 2068 LABEL, NAME
********17B5AROS
********17CFGETAL
********17EAAR-LN
********17FFAR-NXT
********18C6AAROS

TIMEX EXROM

SPECTRUM LABEL, NAMESPECTRUM ROM AddrTS 2068 ROM AddrTS 2068 LABEL, NAME
SA-BYTES04C20068W-TAPE
SA-LEADER04D8007E
SA-LOOP04FE00A4
SA-BIT-2051100B7
SA-8-BITS052500CB
SA/LD-RET053F00E5W-BORD
REPORT-D055200F8
LD-BYTES055600FCR-TAPE
LD-BREAK056B0111
LD-LEADER05800126
LD-SYNC058F0135
LD-8-BITS05CA0170
LD-EDGE-205E30189RD-BIT
LD-EDGE-105E7018DRD-EDGE
LD-SAMPLE05ED0193
SAVE-ETC060501ABSLVM
REPORT-F06420228
SA-NAME064B0231
SA-DATA06520238
SA-V-OLD0672029A
SA-V-NEW068502A9
SA-SCR$06A002F2
SA-CODE06C3032E
SA-LINE07160447
SA-ALL075A04C9
LD-LOOK-H076704D6
LD-NAME07A6053D
VR-CONTROL07CB058FVERIFY
LD-BLOCK080205C6
LD-CONTROL080805CCLOAD
LD-DATA082E0606
LD-PROG08730673
ME-CONTROL08B606E5MERGE
ME-OLD-VP08F90752
ME-ENTER092C0799
ME-ENT-1093E07CF
ME-ENT-309580825
SA-CONTROL09700851SAVE
SA-1-SEC0991089A

The balance of EXROM contains the Function Dispatcher , Bank Switching Code , and various other routines , which does not have counterparts in the Spectrum. A total of approximately 2K Bytes of EXROM is unused.