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 ?