Micro-Coding Simplified

See all articles from SINCUS v8 n4
Author(s): George Penney
Publication: Sincus News
Pub Details: SINCUS v8 n4 (Volume 8, Issue 4)
Date: May - June 1990
Pages: 3-5

IF YOU DON’T LIKE STARING AT A BLANK SCREEN WAITING ON THE BASIC INTERPRETER BUT HAVE NOT TRIED MACHINE LANGUAGE BECAUSE OF THAT LONG LIST OF POSSIBLE OPERATION CODES OR BECAUSE YOU HATE HEXADECIMAL NOTATION, THEN THIS ARTICLE IS FOR YOU.

BASIC IS THE MOST WIDELY USED COMPUTER LANGUAGE FOR VERY GOOD REASONS. IT IS EASY AND QUICK. HOWEVER, ITS EXECUTION CAN BE SLOW. THE EASIEST FIX FOR THIS IS TO INCORPORATE MACHINE CODE WITHIN A BASIC PROGRAM AS REM STATEMENTS. THAT IS WHAT I DESCRIBE HERE.

FIRST BEAR IN MIND THAT HEXADECIMAL IS ONLY ONE OF SEVERAL CODING NOTATIONS. BECAUSE THE SINCLAIR SYSTEM USES DECIMAL FOR THE PEEK AND POKE FUNCTIONS, I PREFER TO USE DECIMAL.

SECOND, THE Z80 LITERATURE IDENTIFIES ALL DATA TRANSFERS AS LD (LOAD) THEREBY CONFUSING THE SELECTION OF INSTRUCTION CODES. BETTER OPERATION NAMES CAN BE USED, NAMELY:

MV (MOVE) MEMORY TO MEMORY
ST (STORE) REGISTER TO MEM
TR (TRANSFER) REG TO REG
LD (LOAD) MEMORY TO REG

A THIRD SIMPLIFICATION IS TO SELECT ONLY THE MORE USEFUL OF THE MANY POSSIBLE OPERATIONS, AT LEAST UNTIL YOU BECOME MORE PROFICIENT.

LASTLY, WE CAN IDENTIFY THE REGISTER PAIRS WITH THEIR MORE COMMON FUNCTIONS:

HL LOCUS
DE DESTINATION
BC BYTE COUNT
A  ACCUMULATOR

SELECTED OPERATIONS

THE FOLLOWING LISTS CONTAIN THE OPERATIONS THAT I HAVE FOUND MORE USEFUL. THE MOST POWERFUL INSTRUCTIONS FOR THE Z80 ARE THE MOVE WITH REPEAT AND THE COMPARE WITH REPEAT. THESE CAN REPLACE FOR-NEXT LOOPS THUS SAVING MUCH TIME. THERE IS LITTLE ADVANTAGE IN CODING ARITHMETIC OPERATIONS AS NO REAL IMPROVEMENT CAN BE GAINED OVER THE SINCLAIR ROM.

MACHINE CODES BY FUNCTION

ADD             134      ▒
AUGM HL           9      ▒
BR              233      DIM

CALL            205**    LN **
CPA         237 177      GOSUB ▒
CPD         237 185      GOSUB ▒

DECR A           61      X
DECR BC          11      "
DECR DE          27      .
DECR HL          43      F

DIM HL      237 66       GOSUB PI
DJNZ             16*     (*

EXCISE           26      ,

INCR A           60      W
INCR BC           3      ▒
INCR DE          19      <
INCR HL          35      7

INSRT A          18      >

JP               24*     /*
JPNZ             32*     4*
JPZ              40*     C*

LD A             58**    U**
LOC              42**    E**

LDVA             62*     Y*
LDVBC             1**    ▒**
LDVDE            17**    )**
LDVHL            33**    5**

MARK             54*     Q*
MVA         237 176      GOSUB ▒
MVD         237 184      GOSUB ▒

NEG              47      J

RT              201      TAN
RTNZ            192      ""
RTZ             200      COS

ST A             50**    M**
ST HL            34**    6**
SWAP            235      FOR

TR BC           197      VAL
TR DE           213      STR$
TR HL           229      FAST

TO BC           193      AT
TO DE           209      SGN
TO HL           225      LPRINT

THE FIRST COLUMN IS MY OWN MNEMONIC. STANDARD MNEMONICS ARE LISTED IN THE BACK OF THE TS1000 MANUAL. ASTERISKS INDICATE THE NECESSARY INSERTION OF A VALUE OR ADDRESS.

MACHINE CODES BY NUMBER

  1     ▒        LD VALUE INTO BC
  3     ▒        INCR BC
  9     ▒        AUGMENT HL
 11     "        DECR BC
 16     (        DJNZ (DECR B AND)
 18     >        INSERT A AT DEST
 19     <        INCR DE

 24     /        JUMP (RELATIVE)
 26     ,        EXCISE (DE) TO A
 27     .        DECR DE

 32     4        JPNZ (RELATIVE)
 33     5        LDVHL
 34     6        ST HL
 35     7        INCR HL

 40     C        JPZ (RELATIVE)
 42     E        LOCATE (LD HL)
 43     F        DECR HL
 47     J        NEGATE A

 50     M        ST A
 54     Q        MARK (DATA TO LOC
 58     U        LD A (FROM ADDR)

 60     W        INCR A
 61     X        DECR A
 62     Y        LDVA
 66*    PI       DIMINISH HL

134     ▒        ADD DATA AT LOCUS
176*    ▒        MOVE ASCENDING
177*    ▒        COMPARE ASCENDING
184*    ▒        MOVE DESCENDING
185     ▒        COMPARE DESCENDNG

192     ""       RTNZ
193     AT       TO BC (POP)
197     VAL      TR DE (PUSH)

200     COS      RTZ
201     TAN      RETURN
205     LN       CALL
209     SGN      TO DE

213     STR$     TR DE
225     LPRINT   TO HL
229     FAST     TR HL

233     DIM      BRANCH (TO LOCUS)
235     FOR      SWAP DE/HL

  *  PRECEDED BY 237 (GOSUB)

SPECIAL DEFINITIONS

ASCENDING:    SUCESSIVE (DATA)
DESCENDING:   IN REVERSE SEQUENCE
DESTINATION:  ADDRESS IN DE
LOCUS:        ADDRESS IN HL
NEGATE:       CHANGE ACCUMULATOR
              CONTENTS TO NEGA-
              TIVE VALUE IN LIEU
          OF DIRECT SUBTRACTION

SELECTED ROM CALLS (205)

CLS
     (2602)  42 10    E▒
COPY
     (2153) 105 8     ?▒
DELETE (LOCUS HL, BYTES IN BC)
     (2656)  96 10    ?▒
DELETE (ADDR IN DE TO LOCUS)
     (2653)  93 10    ?▒
DISPLAY STRING (ADDR DE, LEN, BC
     (2923) 107 11    ?"
FAST
     (3875)  35 15    7?
FIND LINE (LINE IN HL GIVES ADDR
     (2520) 216 9     **▒
MAKE ROOM (TO LOCUS, BYTES BC)
     (2174) 126 8     7▒
PAUSE (TIME IN BC)
     (3840)   0 15    ?
POSITION DISPLAY (COL,ROW IN BC)
     (2293) 245 8     PRINT ▒
SCAN KEYBD (GIVES CODE IN HL)
     (699)  187 2     ▒▒
SLOW
     (3833)  67 11    ?"
SCROLL
     (3086)  14 12    £

SYSTEM VARIABLES

CURSOR   16394   10 64   ▒RND
D-FILE   16396   12 64   £RND
NXTLIN   16425   41 64   DRND
RAMTOP   16388    4 64   ▒RND
STKBOT   16410   26 64   ,RND
STKEND   16412   28 64   0RND
VARS     16400   16 64   (RND

AA       16514  130 64   ▒RND
BC       16516  132 64   ▒RND
DE       16518  134 64   ▒RND
GG       16520  136 64   ▒RND
HL       16522  138 64   ▒RND

USING MICRO-CODE

I LIKE TO USE THE FOLLOWING BASIC CODE AS A CORE FOR ANY NEW PROGRAM. LINE 1 GIVES ME A PLACE TO PASS DATA BETWEEN BASIC AND MACHINE PROGAM. IT ALSO CONTAINS A SHORT ROUTINE THAT ALLOWS ME TO INSERT MACHINE CODE ANYWHERE IN THE BASIC PROGRAM. LINE 800 BEGINS A ROUTINE THAT DISPLAYS CODE AT THE CURSOR LINE.

I USUALLY WRITE A ROUTINE ON PAPER USING THE MNEMONICS FROM MY LIST AND USE THE NORMAL EDIT FUNCTION TO PUT THE CORRESPONDING CHARACTERS INTO THE REM STATEMENT.

WHERE I ENCOUNTER UNPRINTABLE CHARACTERS (IN ROM ADDRESSES) I SUBSTITUTE A POUND SIGN AND THEN POKE THE CORRECT DECIMAL VALUE.

   1 REM AABCDEGGHLLN 77▒▒ EDRND
▒ DIM
10 RAND USR NX
11 REM TAN £££££££££££££££££££
12 RETURN
800 RAND USR NX
801 REM E▒RNDLN **▒▒▒ ▒5▒RNDTAN
802 LET M=PEEK HL+256*PEEK (HL+
1)
810 CLS
811 FOR N=M TO M+21
812 PRINT N;" ";PEEK N,CHR$ P
EEK N
813 NEXT N
820 STOP
821 LET M=M+21
823 GOTO 810
900 PRINT "PLEASE START TAPE (R
ECORD) THEN PRESS C"
901 PAUSE 4E4
902 CLS
903 SAVE "T▒"
910 LET I=-COS PI
911 LET NX=16524
912 LET HL=16522
990 PRINT "NEW PROGRAM FRAME"
16514   38    A
16515   38    A
16516   39    B
16517   40    C
16518   41    D
16519   42    E
16520   44    G
16521   44    G
16522  130    ▒
16523   64    RND
16524  205    LN
16525   35    7
16526   15    ?
16527    1    ▒
16528    5    ▒
16529    0
16530   42    E
16531   41    D
16532   64    RND
16533    9    ▒
16534  233    DIM
16535  118    ?