Comparative ROM Atlas: From ZX Spectrum to 2068

See all articles from SINCUS v6 n3

Last issue I mentioned a reprint of an article by Nazir Pashtoon on Spectrum/TS2068 ROM addresses. Well, permission to reproduce them came too late to include in the last issue, so with thanks to SYNTAX’s Kurt Olsen here is not only the ROM addresses but corrections to it!

All corrections are on page 5:

     LABEL        SPECT   2068    LABEL
1.  MASK_INT      0038    0038
2.  CLEAR_SP      1097    0BFD    DEL_K
3.  MAIN_4        1303    0E8D    LED4

Thanks to the sharp eyes of these gentlemen the above corrections have been noted.

1. Kurt Olsen, SYNTAX
2. Jack Dohany, Jack’s Fairware
3. Wes Brzozowski, SINCUS

-Jack’s correction was copyrighted, but he has put it in to the public domain. Some unidentified soul wrote on my copy “SAVE and LOAD Routines in Spectrum- 04C2 to 0991. To Nazir Pashtoon who has done so much for the TS community, THANK YOU! The following article and tables are reprinted by permission, Copyright SYNTAX ZX80, Inc. 1984.”

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               TS 2068
LABEL,          ROM    ROM    LABEL,
NAME            Addr   Addr   NAME

  START         0000   0000   PLUCIN
  ERROR-1       0008   0008
  PRINT-A-1     0010   0010   WRCH
  GET-CHAR      0018   0018
  NEXT-CHAR     0020   0020
  FP-CALC       0028   0028
  BC-SPACES     0030   0030
* MASK-INT      0038   0030
                004F   004F   PHLAF
  ERROR-2       0053   0053
  ERROR-3       0055   0055   LE3
  RESET         0066   0066
  NO-RESET      0070   0070
  CH-ADD+1      0074   0074   NEXTCH
  TEMP-PTR1     0077   0077   NC-HL
  TEMP-PTR2     0078   0078   TC-HL
  SKIP-OVER     007D   007D
  TOKENS        0095   0098   TOKENS
  KEYTBL        0227   0245
  KEY-SCAN      028E   02B0   K-SCAN
  KEYBOARD      02BF   02E1   UPD-K
  K-REPEAT      0310   0336
  K-TEST        031E   035C   K-BASE
  K-DECODE      0333   0371   CHCODE
  BEEPER        03B5   03F3   PARP
  BEEP          03F8   0436   BEEP
  PRINT-OUT     09F4   0500   SEND-TV
  PO-BACK-1     0A23   053A   P-LFT
  PO-RIGHT      0A3D   0554   P-RT
  PO-ENTER      0A4F   0566   P-NL
  PO-COMMA      0A5F   0576
  PO-QUEST      0A69   0580
  PO-TV-2       0A6D   0584
                0A9B   05B2   SET-AT
  PO-ABLE       0AD9   05F0
  PO-STORE      0ADC   05F3   STTVCU
  PO-FETCH      0B03   061A   LDTVCU
  PO-ANY        0B24   063B
  PO-ALL        0B7F   06B4
  PO-ATTR       0BDB   0710   ATTBYT
  PO-MSG        0C0A   073F   PUTMES
  PO-SAVE       0C3B   0776   PR-TV2
  PO-SEARCH     0C41   077C
  PO-SCR        0C55   0790   TVFUL?
  REPORT-5      0C86   07C1   ERR5
  TEMPS         0D4D   0888   R-ATTS
  CLS           0D6B   08A6   K-CLS
  CLS-LOWER     0D6E   08A9   CLLHS
  CL-ALL        0DAF   08EA   CLS
  CL-SET        0DD9   0914   SET-CUR
  CL-SC-ALL     0DFE   0939   SCRL
  CL-LINE       0E44   097F   CLS-B
  CL-ATR        0E88   09C3
  CL-ADDR       0E9B   09D6
  COPY          0EAC   0A02   K-DUMP
  COPY-BUFF     0ECD   0A23   DUMPPR
  CLEAR-PRB     0EDF   0A35   CLPR
  COPY-LINE     [illegible][illegible][illegible]
  EDITOR        0F2C   0A82   EDIT-K
  ADD-CHAR      0F81   0AE7   INSA
  ED-EDIT       0FA9   0B12
  ED-DOWN       0FF3   0B59
  ED-LEFT       1007   0B6B
  [illegible]   [illegible][illegible]
  ED-DELETE     1015   0B7B   DELSYM
  ED-ENTER      1024   0B8A
  ED-EDGE       1031   0B97
  ED-UP         1059   0BBF
  ED-SYMBOL     1076   0BDC
  ED-ERROR      107F   0BE9
* CLEAR-SP      1097   0BFE   DEL-K
  KEY-INPUT     10A8   0C0E   IN-K
  ED-COPY       111D   0C83   ECHO
  REMOVE-FP     11A7   0D0D   DESLUG
  NEW           11B7   0D1D   K-NEW
  START/NEW     11CB   0D31   INIT
  RAM-SET       1219   0D7F   NEW
  MAIN-EXEC     12A2   0E28
  MAIN-1        12A9   0E2F   LED18
* MAIN-4        1303   0ED8   LED4
  REPORT-MSG    1391   0F65
  MAIN-ADD      155D   1158
  CH-INFO       15AF   11AA   CHINIT
  INIT-STR      15C6   11C1   SMINIT
  WAIT-KEY      15D4   11CF   RDCH
  INPUT-AD      15E6   11E1   INCH
  OUT-CODE      15EF   11EA   PUTDIC
  PRINT-A-2     15F2   11ED   SENDCH
  CHAN-OPEN     1601   1230   SELECT
  REPORT-O      160E   123D   ERRO
  CHAN-FLAG     1615   1248   SEL-HL
  CHAN-K        1634   129A
  CHAN-s        1642   12A8
  CHAN-P        164D   12B3
  ONE-SPACE     1652   12B8   INS1
  MAKE-ROOM     1655   12BB   INSERT
  POINTERS      1664   12CA   REMCSZ
  LINE-ZERO     168F   131E
  LINE-NO       1695   1324   GET-LN
  RESERVE       169E   132D   LCU2
  SET-MIN       16B0   133F   CLEL
  SET-WORK      16BF   134E   X-CALC
  REC-EDIT      16D4   1363   X-T-HL
  SET-STK       16C5   1354   RESET
   SPECTRUM               TS 2068
LABEL,          ROM    ROM    LABEL,
NAME            Addr   Addr   NAME

  INDEXER       16DC   136B   SEARCH
                       1374   SRCHSC
  CLOSE         16E5   139F   CLOSE
                16EB   13A8   RSTSTR
  CLOSE-2       1701   13BE   CLCHAN
  OPEN          1736   142A   OPEN
  OPEN-1        1756   145E
  OPEN-2        175D   1465   OPCHAN
  CAT-ETC.      1793   25C8   CAT
  AUTO-LIST     1795   14E1   LIST
  LLIST         17F5   1541   K-LLST
  LIST          17F9   1545   K-LIST
                1[illegible]60 15A[illegible] LPO
  OUT-LINE      1855   15A1   PUI-SR?
  OUT-LINE2     187D   15C9   PUT
  NUMBER        18B6   1602
  OUT-FLASH     18C1   160D   FLASHA
  OUT-CURS      18E1   162D   PR-CUR
  LN-FETCH      190F   165B   NEXT-L
  LN-STORE      191C   1668   DE-HL
  OUT-SP2       1925   1671
  LINE-ADDR     196E   16D6   FIND-L
  CP-LINES      1980   16E8   CP-BC
                1988   16F0   SUBLIN
  EACH-STMT     198B   16F3   SUBLN1
  NEXT-ONE      19B8   1720   RECLEN
  DIFFER        19DD   1745
  RECLAIM-1     19E5   174D   DEL-DE
  RECLAIM-2     19E8   1750   DELREC
  E-LINE-NO     19BF   1768   LINENO
  OUT-NUM-1     1A1B   1788   PUT-BC
  OUT-NUM-2     1A28   1795   PU-LN
  OUT-NUM-3     1A30   179D
  LINE-SCAN     1B17   1A27   SYNTAX
  STMT-LOOP     1B28   1A44   LS4
  SEPARATOR     1B6F   1AB2
  STMT-RET      1B76   1AB9
  LINE-RUN      1B8A   1AD8   EXCUTE
  LINE-NEW      1AEC   1B9E
  REM           1BB2   1B00
  LINE-END      1BB3   1B09
  LINE-USE      1BBF   1B15
  NEXT-LINE     1BD1   1B27
  STMT-RET      1B76   1AB9   ENDSTT
  CHECK-END     1Bee   1B44   END?
  STMT-NEXT     1BF4   1B4A   ENDTEM
  CLASS-01      1C1F   1B82   TEM1
  REPORT-2      1C2E   1B91   ERR2
  VAL-FET-2     1C59   1BBC   LT22
  NEXT-2-NUM    1C79   1BDC   DYADIC
  CLASS-06      1C82   1BE5   TEM6
  REPORT-C      1C8A   1BED   SYNERR
  CLASS-0A      1C8C   1BEF   TEM10
  PERMS         1C96   1BF9
  FETCH-NUM     1CDE   1C49   OPTNO
  USE-ZERO      1CE6   1C51   STK-0
  STOP          1CEE   1C59   STOP
  IF            1CF0   1C5B
  FOR           1D03   1C78   FOR
  LOOK-PROG     1D86   1D28   SKIP
  NEXT          1DAB   1D55   NEXT
  READ          1DEC   1D96   READ
  DATA          1E27   1E82   DATA
  RESTORE       1E42   1E9D
  RANDOMIZE     1E4F   1ED4   RAND
  REST-RUN      1E45   1ECA   RESTBC
  CONTINUE      1E5F   1EE4   CONT
  GO TO         1E67   1EF1   JUMP
  OUT           1E7A   1F04
  POKE          1E80   1F0A
  TWO-PARAM     1E85   1F0F
  FIND-INT1     1E94   1F1E   FIX-U1
  FIND-INT2     1E99   1F23   FIX-U
  REPORT-B      1E9F   1F29   ERRB
  RUN           1EA1   1F2E
  CLEAR         1EAC   1F36   CLEAR
  CLEAR-RUN     1EAF   1F39   CLR-BC
  GOSUB         1EED   1F99   GO-SUB
  TEST-ROOM     1F05   1FBB   CHK-SZ
  REPORT-4      1F15   1FCF   ERR4
  RETURN        1F23   1FD4   RETURN
  PAUSE         1F3A   1FEF   PAUSE
  BREAK-KEY     1F54   2009   BREAK
  DEF FN        1F60   201D   DEF
  ****          ****   2128   SOUND
  UNSTACK-Z     1FC3   214F
  LPRINT        1FC9   2155   K-LPR
  PRINT         1FCD   2159   K-PRN
  PRINT-2       1FDF   217E   P-SEQ
  PRINT-CR      1FF5   2194
  PRINT-ITEM1   1FFC   219B
  PR-STRING     203C   21DB
  PR-END-Z      2045   21E4
  PR-ST-END     2048   21E7   TERM?
  PR-POS-1      204E   21ED
  STR-ALTER     2070   220F   STRITO
  INPUT         2089   222B   INPUT
  IN-ITEM-1     20C1   226B   I-SEQ
   SPECTRUM               TS 2068
LABEL,          ROM    ROM    LABEL,
NAME            Addr   Addr   NAME

  IN-ASSIGN     2189   2363
  REPORT-H      21D4   237E   ERRH
  IN-CHAN-K     21D6   2380   NOTKB?
  CO-TEMP-1     21E1   238B
  CO-TEMP-2     21E2   238C   GR-COL
  CO-TEMP-4     21FC   23A6   COLITM
  CO-TEMP-7     2234   23DE   COLOUR
  CO-CHANGE     226C   2416
  CO-TEMP-C     2273   241D   HIFLSH
  BORDER        2294   243E   BORDER
  ****          ****   24D2   NEWDEV
  ****          ****   25B9   PASSEM
  PIXEL-ADD     22AA   2603   SCRMBL
  POINT         22CB   2624   F-PNT
  PLOT          22DC   2635   PLOT
  PLOT-SUB      22E5   263E   PLOTBC
  STK-TO-BC     2307   2660   GETXY
  STK-TO-A      2314   266D
  CIRCLE        2320   2679   CIRCLE
  DRAW          2382   26DB   DRAW
  CD-PRMS1      247D   27D6
  DRAW-LINE     24B7   2810   DRAW-L
  SCANNING      24FB   2854   EXPRN
  SYNTAX-Z      2530   2889   INTPT?
  S-ATTR-s      2580   28D7   F-ATTR
  S-U-PLUS      25AF   296D
  S-LETTER      26C9   2A87
  S-FN-SBRN     27BD   2B7B
  S-SCREEN$-S   2535   288E   F-SCRN
  S-RND         25F8   29B6   RND
  S-PI          2627   29E5   F-PI
  S-INKEY$      2634   29F2   F-INKEY
  FN-SKPOVER    28AB   2C69   NXT-HL
  LOOK-VARS     28B2   2C70   FIND-N
  STK-F-ARG     2951   2D0F
  STK-VAR       2996   2D54   GET-EL
  SLICING       2A52   2E10   SLICER
  STK-ST-0      2AB1   2E6F
  STK-STO-1     2AB2   2E70   PSHSTR
  STK-STORE     2AB6   2E74   PAEDCB
  INT-EXP-1     2ACC   2E8A
  DE,(DE+1)     2AEE   2EAC
  GET-HL*DE     2AF4   2EB2
  LET           2AFF   2EBD   LET
  L-ENTER       2BA6   2F64
  L-ADD-$       2BAF   2F6D
  L-STRING      2BC6   2F84
  L-FIRST       2BEA   2FA8
  STK-FETCH     2BF1   2FAF   POPSTR
  DIM           2C02   2FC0   DIM
  ALPHANUM      2C88   3046   ALNUM?
  ALPHA         2C8D   304B   ALPHA?
  DEC-TO-FP     2C9B   3059   STKSUM
  NUMERIC       2D1B   30D9   DIGIT?
  STK-DIGIT     2D22   30E0
  STACK-A       2D28   30E6   STK-A
  STACK-BC      2D2B   30E9   STK-BC
  INT-TO-FP     2D3B   30F9   ININT
  E-TO-FP       2D4F   3100
  INT-FETCH     2D7F   313D   LDDE
  P-INT-STO     2D8C   314A   STDE-U
  INT-STORE     2D8E   314C   STDE-S
  FP-TO-BC      2DA2   3160   FP2BC
  LOG(2↑A)      2DC1   317F
  FP-TO-A       2DD5   3193   FP2A
  PRINT-FP      2DE3   31A1   OUTPUT
  CA=10*A+C     2F8B   334A
  PREP-ADD      2F9B   335A
  FETCH-TWO     2FBA   3379   SUMSLD
  SHIFT-FP      2Fdd   339C   SHIFT
  ADD-BACK      3004   33C3
  SUBTRACT      300F   33CE   SUB
  addition      3014   33D3   ADD
  HL=HL*DE      30A9   3468   MULT
  PREP-M/D      30C0   347F
  multiply      30CA   3489
  REPORT-6      31AD   356C   ERR6
  division      31AF   356E   DIVIDE
  truncate      3214   35D3   TRUNC
  RE-ST-TWO     3293   3052
  multiply      30CA   3489   TIMES
  RE-STACK      3297   3656   FLOAT
FP calculator start:
                32C5   3684
  CALCULATE     335B   371A   CTRO
  fp-calc-2     33A2   3761
  TEST-5-SP     33a9   3768   ROOM?
  STACK-NUM     33B4   3773   STK-M
  MOVE-FP       33C0   377F   RAMNO
  STK-DATA      33C6   3785
  SKIP-CONS     33F7   37B6
  LOC-MEM       3406   37C5   ARRAY
  get-mem-0     340F   37CF
  stk-zero      341B   37DA
  st-mem-0      342D   37EC
  EXCHANGE      343C   37FB
  series-06     346A   3829
  NEGATE        346E   382D   NEGATE
  sgn           3492   3851
  in            34A5   3864
   SPECTRUM               TS 2068
LABEL,          ROM    ROM    LABEL,
NAME            Addr   Addr   NAME

  peek          34AC   386B
  usr-no        34B3   3872
  usr-$         34BC   38D7
  TEST-ZERO     34E9   3904   TESTO
  GREATER-0     34F9   3914
  NOT           3501   391C
  less-0        3506   3921
  FP-0/1        350B   3926   STBOOL
  or            351B   3936
  no-&-no       3524   393F
  str-&-no      352D   3948
  no-l-eql      353B   3956
  strs-add      359C   39B7
  STK-PNTRS     35BF   39DD
  chr$          35C9   39E4
  val-&-val$    35DE   39F9
  str$          361F   3A3A
  read-in       3645   3A60
  code          3669   3A84
  len           3674   3A8F
  dec-jr-nz     367A   3A95
  JUMP          3686   3AA1
  jump-true     368F   3AAA
  end-calc      369B   3AB6
  n-mod-m       36A0   3ABB   INTDIV
  ****          ****   3AC5   LDMES
  int           36AF   3ACA   INT
  EXP           36C4   3ADF   EXP
  ln            3713   3B2E
  get-argt      3783   3B9E   ANGLE
  cos           37AA   3BC5   COS
  sin           37B5   3BD0   SIN
  tan           37DA   3BF5   TAN
  atn           37E2   3BFD   ATN
  asn           3833   3C4E   ASN
  acs           3843   3C5E   ACS
  sqr           384A   3C65   ROOT
  to-power      3851   3C6C   TO-THE
  ****          ****   3C89   SEPRMT
 (note:SEPRMT are tape msgs.)
  'spare'       386E   3CDC   'EMPTY'
  charctr-set   3D00   3D00   CH-SET

The Spectrum does not support the following routines:

  ****          ****   17B5   AROS
  ****          ****   17CF   GETAL
  ****          ****   17EA   AR-LN
  ****          ****   17FF   AR-NXT
  ****          ****   18C6   AAROS

TIMEX EXROM

   SPECTRUM               TS 2068
LABEL,          ROM    ROM    LABEL,
NAME            Addr   Addr   NAME

  SA-BYTES      04C2   0068   W-TAPE
  SA-LEADER     04D8   007E
  SA-LOOP       04FE   00A4
  SA-BIT-2      0511   00B7
  SA-8-BITS     0525   00CB
  SA/LD-RET     053F   00E5   W-BORD
  REPORT-D      0552   00F8
  LD-BYTES      0556   00FC   R-TAPE
  LD-BREAK      056B   0111
  LD-LEADER     0580   0126
  LD-SYNC       058F   0135
  LD-8-BITS     05CA   0170
  LD-EDGE-2     05E3   0189   RD-BIT
  LD-EDGE-1     05E7   018D   RD-EDGE
  LD-SAMPLE     05ED   0193
  SAVE-ETC      0605   01AB   SLVM
  REPORT-F      0642   0228
  SA-NAME       064B   0231
  SA-DATA       0652   0238
  SA-V-OLD      0672   029A
  SA-V-NEW      0685   02A9
  SA-SCR$       06A0   02F2
  SA-CODE       06C3   032E
  SA-LINE       0716   0447
  SA-ALL        075A   04C9
  LD-LOOK-H     0767   04D6
  LD-NAME       07A6   053D
  VR-CONTROL    07CB   058F   VERIFY
  LD-BLOCK      0802   05C6
  LD-CONTROL    0808   05CC   LOAD
  LD-DATA       082E   0606
  LD-PROG       0873   0673
  ME-CONTROL    08B6   06E5   MERGE
  ME-OLD-VP     08F9   0752
  ME-ENTER      092C   0799
  ME-ENT-1      093E   07CF
  ME-ENT-3      0958   0825
  SA-CONTROL    0970   0851   SAVE
  SA-1-SEC      0991   089A

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.

* see correction notes at beginning of article

Printing problems made parts of the Spectrum – TS 2068 very difficult to read, hopefully you will be able to use the table with this reprint:

page 4:
   Spectrum          TS2068                  Spectrum         TS2068
LABEL       ROM    ROM    LABEL      LABEL        ROM    ROM    LABEL
Name        addr   addr   Name       Name         addr   addr   Name

PRINT-A-1   0010   0010   WRCH       COPY-BUFF    0ECD   0A23   K-DUMP
                                     CLEAR-PRB    0EDF   0A35   CLPR
                                     COPY-LINE    0EF4   0A4A   PRSCAN

                                     ED-RIGHT     100C   0B73

THE MAJORITY OF THE PAGES SEEMED TO HAVE THE ABOVE PRINT PROBLEMS, IF YOU HAVE A PROBLEM WRITE ME, AND I’LL SEND YOU THE LINES YOU CANNOT READ.