40 best machine code routines for c64

175
I (b@lIDill - . -- L5@OO mrn

Upload: hasan2010j

Post on 14-Apr-2016

59 views

Category:

Documents


7 download

DESCRIPTION

Basic

TRANSCRIPT

Page 1: 40 Best Machine Code Routines for C64

. 1]5~ I ~OOD~

(b@lIDill OO@(illTI1J~~

-

. - -

L5@OO mrn ~(ID~~(IDlID(IDwrn · ®~

Page 2: 40 Best Machine Code Routines for C64

40 Best Machine Code

Routines for the 64

Mark Greenshields

Duckworth

Page 3: 40 Best Machine Code Routines for C64

First published in 1984 by Gerald Duckworth & Co. Ltd.

The Old Piano Factory 43 Gloucester Crescent, London NW1

©1984 by Mark Greenshields

All rights reserved. No part of this publication may be reproduced, stored in a. retrieval system,

or transmitted, in any form or by any means, electronic, mechanical, photocopying, recording or otherwise, without the prior permission of the

publisher.

ISBN 0 7156 1899 7

British Library Cataloguing in Publication Data Greenshields, Mark

Forty best machine codes for the 64 1. Commodore 64 (Computer) 2.Machine codes (Electronic codes) I. Title 001.64'25 QA76.8.C64

ISBN 0-7156-1899-7

Typeset by The Electronic Village, Richmond from text stored on a Commodore 64

Printed in Great Britain by Redwood Burn Ltd., Trowbridge

and bound by Pegasus Bookbinding, Melksham

Page 4: 40 Best Machine Code Routines for C64

Contents

Preface 9

Supermon: an assembler/disassembler written in machine code by Jim Butterfield for the 64. 11

ROM Routines 26

1. Fill: fills an area of memory with a byte. 27

2. Move: allows you to move an area of memory to another location. 30

3. Pause: allows you to pause a listing at any time by just pressing a shift key. 34

4. Function keys: This program allows you to program the function keys. 36

5. IRQ clock: displays a clock in 24 hour format at the top of the screen whether a program is running or not. 42

6. Pixel scroll left: scrolls the screen one pixel to the left. 48

7. Pixel scroll right: scrolls the screen one pixel to the right. 51

8. Pixel scroll up: scrolls the contents of the screen one pixel up. 56

9. Pixel scroll down: scrolls the screen one pixel down. 59

10. Colour: sets the screen, border, text, multicolours 1,2 and 3 in one command without PEEKs and POKEs. 62

11. Copy: allows you to copy any part or all of the

5

Page 5: 40 Best Machine Code Routines for C64

character ROM down to any location in RAM. 64

12. Sprite/ char detect: tells you what character a sprite is passing over or under, not just if it is touching. 68

13. Ooke: allows you to POKE a 16 bit number into memory easily. 75

14. Oeek: complements Ooke, and allows you to read the 16 bit number contained in two consecutive locations. 77

15. 3-channel IRQ tune: plays a tune using all three channels. It does not tie up the computer, so you could type in another program while listening to this one. 79

16. List alter: allows you to list programs to the screen or printer in any column width. 84

17. Old: allows you to recover a program accidentally newed. It can be loaded after you have newed the program and still work. 86

18. Graph: turns the high res screen on. 88

19. NRM: turns the high-res screen off and returns to the text screen. 90

20. CLG: clears the high-res screen and colours it as specified. 91

21. Plot: plots a point on the high res screen. 94

22. Unplot: extends the above to allow a point to be removed from the high-res screen. 100

23. CHAR: puts a text or UOG character onto the high­res screen.

24. Change bank: changes the Video bank in one simple command. The Copy command above can be used to

6

101

Page 6: 40 Best Machine Code Routines for C64

move the character set to the new bank. 108

25. Invert: allows you to invert all or part of the high-res screen. 110

26. Organ: this routine is interrupt driven and allows you to play music even while programming or running another program. 113

27. Sound: makes sound much easier on the 64. It uses preset ADSR's etc. You only need to specify the voice, the volume, the frequency and the waveform. 116

28. Envelope: does the same as the sound function except that you can specify the envelope of your choice. 122

29. DIR: reads and displays the disk directory of one or both drives without disturbing the program in memory. 130

30. MSAVE: allows you to save any area of memory onto disk or cassette. 135

31. MLOAD/MVERIFY: allows you to load to any part of memory from disk or cassette. 137

32. DISK: allows you to send a command to the disk drive, e.g. format a disk. 139

33. DERROR: allows you to read the disk error channel within a program or directly. 141

34. Scroll message: allows a message to be scrolled along the second bottom line of the screen even if a program is running. 143

35. Flash screen: allows you to flash the screen colour. You set colour 1, colour 2 and the number of times a second for the flash. 149

36. Flash border: as above but for the border. 1 53

7

Page 7: 40 Best Machine Code Routines for C64

37. Flash characters: allows you to flash the characters on the screen. 157

38. Flash colour: allows you to flash the colour of the characters on the screen. You specify colour 1, colour 2 and the number of changes per second. 161

39. Print at: allows you to print text anywhere on the screen without all those weird symbols. 167

40. Split screen: allows you to split the screen into text and screen using raster interrupts. You specify where the change is to take place and whether text or high res is at the top or the bottom. 169

8

Page 8: 40 Best Machine Code Routines for C64

Preface

This book is not intended to teach you machine code on the CBM 64. It contains 40 machine code routines that can be used in your Basic or machine code programs to do things that are not implemented in the standard BASIC or operating system in your Commodore 64.

The book includes a listing of Supermon which is a public domain assembler / disassembler written by Jim Butterfield (thanks Jim). It can be used to enter the programs in this book if you do not possess an assembler. The listings are all given twice: once in an assembled listing from the PAL assembler from Proline Software (this, along with POWER, is the best machine code development package that I have seen), and once in a disassembled version suitable for entering with Supermon or similar.

I hope that you find the book useful and that the routines help to improve your programs.

Acknowledgments

I would like to thank my parents Jack and Sheila Greenshields, my sister Louise, Graeme Douglas, William Drummond, Mark Kelly and all my relations for their encouragement.

M.G.

9

Page 9: 40 Best Machine Code Routines for C64

I would like to dedicate this book to my grandparents, Roy and Gracie Reid.

10

Page 10: 40 Best Machine Code Routines for C64

Supermon

There follows a listing of Supermon which is a public domain assembler/disassembler/monitor. Thanks to Jim Butterfield for this program. The Basic program which follows is used to enter this assembler. You will need this assembler or a similar one to enter all the programs in this book.

Supermon is listed as a hex dump, which is a listing of hexadecimal numbers. This makes it easy to enter into a Basic loader program.

To enter Supermon, type in the following commands in direct mode (where < return> means press the return key), and then type in the Basic loader and save it.

POKE 43,1 < return > POKE 44,32 < return > POKE8192,0 < return > NEW < return >

Now run the loader and you will see the prompt:

.0800 ?

You will see that the first number corresponds with the first number in the Supermon listing. This is where you type the data. The first three lines that you would type are as follows. Type the program in without spaces .

. 0800 ? 001A086400992293

.0808 ? 1210101010535550

.0810 ? 45522036342D4D4F

Don't worry if you don't understand what you are typing in. Just type exactly what is printed and it will work. It is worth it as writing machine code using an assembler is far easier than doing

11

Page 11: 40 Best Machine Code Routines for C64

it by hand. Once you have finished typing in the program you will be prompted with:

SAVE TO TAPE OR DISK?

Press T if you are using cassette and have a blank cassette in the recorder. Press D if you are using disk and make sure that a formatted disk with at least 11 blocks free is in the drive.

If you pressed T you will be prompted with PRESS PLAY ON TAPE and if you pressed D the drive will start whirring. The program is now being saved to tape or disk. If an error occurs then typing RUN100 will allow you to save the program again. It can be loaded in the normal way.

LOAD"SUPERMON",1 OR LOAD"SUPERMON",8

Then run the program. Some writing will appear on the screen and a '.' prompt will appear.

To make spare copies of Supermon just load the program and save it as if it was Basic.

Supermon is given here as a relocatable loader: it can be located anywhere in RAM. To adjust where it isto be located in memory, find the starting address and add 2065 to it. Use the following formula to calculate the two numbers necessary:

LO= INT(number/256) HI = ((number/256)-LO)*256

Now POKE 55 with the value of LO and POKE 56 with the value of HI and run Supermon.

To restart Supermon, type SYS starting address + 1. The normal value to start Supermon is SYS 38893.

Instructions for using Superman

Supermon commands are all one-letter commands usually

12

Page 12: 40 Best Machine Code Routines for C64

followed by parameters.

The first command that we will look at is 'A'. This stands for ASSEMBLE and is the most frequently used command in any assembler. It will be used for entering almost all the programs in this book. The syntax for' A' is as follows:

A (start address in hex) (mnemonic) (operand).

e.g. A 1000 LOA # $10

The address is the starting address in hex. The mnemonic is the assembly language command and the operand is the number associated with the command if there is one.

After you press return from the first line, if it is incorrect syntax, the computer will prompt you with an 'A' and the next address. Therefore you need only enter the starting address, the assembler does the rest. To leave the assembly press the return key.

Here is a simple example program which shows you how the assembler works .

. A 1000 LOA # $00

.A 1002 STA $0020

.A 1005 STA $0021

.A 1008 RTS

This program makes the screen and the border black. Type it in to see how to use the assembler. If you make an error the computer will print a question mark. If this happens use the normal screen editor and change the mistake and delete the question mark. Press return and if the next address is prompted then the line is now correct.

Now that you have typed this in, you may want to save the program. The command to do this is'S'. The syntax is as follows:

S"name" ,device,start,end + 1

The total length of the name must not exceed 16 or a question

13

Page 13: 40 Best Machine Code Routines for C64

mark will be printed. The device is the device that the computer is to save to: 01 is tape and 08 is disk. The O's before the number are essential for correct syntax. The start is the starting address in hex of the save. The end + 1 is the end address plus 1 that the computer is to save to. The reason that you must save up to the end + 1 is that the ROM routine used to save to memory saves up to but not including the end address specified. All the parameters must be separated by a comma.

The next command is the command to execute a program in machine code from the assembler. It is 'G' and has the syntax:

G address to start at.

If you want to return control to the monitor when the program has been run then make the last command of the program a BRK command instead of an RTS.

The next command allows you to see a program in memory. It is '0' and has the syntax:

o start

e.g. 0 1000

This command clears the screen and prints a page of commands. To see more press 0 and return.

The next command is the same as '0' except that it prints a continuous listing without clearing the screen. The command is 'P' and it has the syntax:

P start end

It is mainly used when you want a printer listing. To print a disassembly to the printer type the following in Basic:

OPEN4,4 : eM 04 : SYS38893

(The SYS assumes that the monitor is at its default position in memory. If it isn't, use your address.)

14

Page 14: 40 Best Machine Code Routines for C64

The printer will print something and then you can type what you want. You can use 'P' or 'M' (coming up next). To disable the printer when it has finished type 'X' < return> (explained later) and type CLOSE4. < return>.

Often you will want a listing of memory in hex (which Supermon was listed in). This is done with the 'M' command which has the syntax:

M start end

where start and end are in hex. This command may also be used to the printer. You may also change memory by using this command and then typing over values and pressing return at the end of each line.

The monitor has a command to fill areas of memory with a number. It is 'F' and it has the syntax:

F start end byte

where start and end are addresses in hex and byte is a byte in hex.

Supermon can move parts of memory to another part. The command is 'T' which stands for transfer memory. It has the syntax:

T oldstart oldend newstart

where oldstart, old end and newstart are addresses in hex.

If you want to find the contents of the registers at any time, type the command 'R' on its own.

If you are working in the assembler and you want to load a program into memory where it came from, there are two ways to do this:

1. return to Basic and type LOADlname",device,1

e.g. To load the file hello from tape type LOAD"HELLO", 1, 1

15

Page 15: 40 Best Machine Code Routines for C64

2. use the command 'L' in the monitor. It has the syntax:

L"name" ,device

where device is 01 for tape and 08 for disk.

To exit the assembler and retu rn to Basic type X < retu rn > or press run/stop and restore.

Summary of SUPERMON commands.

Command Syntax

A Assemble Mnemonics into memory

o Disassemble memory M Display hex from memory S Save memory to device L Load memory from device P Print disassembly of memory F Fill memory T Transfer memory to memory X Exit to Basic R Register display G Goto address

Meaning

A 1000 LOA #$10 01000 M 10002000 S"name",08,1ooo,20oo L"name" ,01 P 10002000 F 3000 4000 FF T 1000 2000 COOO X R G FFD2

1 HES="0123436789ABCDEF" 10 PRINT"(CLR}" 20 FORA=2049T04587STEPS 30 GOSUBI000:REM CONVERT ADDRESS TO HEX IN HS 40 PRINT".";HS;:INPUT AS:REM 8 HEX NUMBE RS 50 FORX=ITOI6STEP2

16

Page 16: 40 Best Machine Code Routines for C64

60 BS=MIDS(AS,X,2) 70 GOSUB2000:REM CONVERT HEX NO. TO DECI MAL 80 POKEA+X/2,HEX 90 NEXT:NEXT 100 INPUT"SAVE TO TAPE OR DISK";TDS 110 IFTDS="D"ORTDS="T"THEN120 115 GOT0100 120 IFTDS="D"THENDEV=8 130 IFTDS="T"THENDEV=l 140 FORA=0T034:READB:POKEA+49152,B:NEXT: POKE49153,DEV:INPUT"ARE YOU SURE";SS 150 IFSS="N"THEN100 160 SYS49152: REM SAVE ASSEMBLER 170 PRINT"MACHINE CODE SAVED" 180 PRINT"IT MAY BE LOADED FROM TAPE OR DISK IN THE NORMAL WAY LIKE A BASIC" 190 PRINT"PROGRAM AND THEN RUN" 200 END 1000 Nl=INT(A/4096):N6=(A/4096-N1)*16:N2 =INT(N6):N3=INT«N6-N2)*16) 1010 N4=«(N6-N2)*16)-N3)*16 1030 HS=MIDS(HES,N1+1,1)+MIDS(HES,N2+1,1 )+MIDS(HES,N3+1,1)+MIDS(HES,N4+1,1) 1040 RETURN 2000 FORV=1T016:B=V-1:IFLEFTS(BS,1)=MIDS (HES,V,1)THEN2020 2010 NEXT 2020 HEX=B*16 2030 FORV=1T016:B=V-1:IFRIGHTS(BS,1)=MID S(HES,V,1)THEN2050 2040 NEXT 2050 HEX=HEX+B 2060 PRINT HEX 2070 RETURN 10000 DATA 162,1,160,1,32,186,255,162,26 ,160,192,169,8,32,189,255,162,236,160 10010 DATA 17,169,251,32,216,255,96,83,8 5,80,69,82,77,79,78,0 200000PEN15,8,15:INPUT#15,AS,BS,CS,DS:P RINTAS,BS,CS,DS:CLOSE15

17

Page 17: 40 Best Machine Code Routines for C64

18

PC SR AC XR YR SP .197FE 33 ee 28 ee F6

.:e8ee ee lA m8 64 8e 99 22 93

.:e8m8 12 ID ID ID ID 53 55 5e

.:e81m 45 52 2S 36 34 2D 4D 4F

.:e818 4E em 31 m8 6E mm 99 22

.:e82m 112m 2m 2m 2e 2m 2m 2e

.:e828 2S 2m 2S 2m 2e 2m 2m 2S

.:S83m em 4B m8 78 8e 99 22 11

.:e838 2m 2E 2E 4A 49 4D 2m 42

.:m84m 55 54 54 45 52 46 49 45

.:S848 4C 44 mm 66 88 82 em 9E

.:m85m 28 C2 28 34 33 29 AA 32

.:m858 35 36 AC C2 28 34 34 29

.:m86m AA 31 32 37 29 ee ee ms

.:m868 AA AA AA AA AA AA AA AA

.:m87S AA AA AA AA AA AA AA AA

.:e878 AA AA AA AA AA AA AA AA

.:S88e A5 2D 85 22 A5 2E 85 23

.:e888 A5 37 85 24 A5 38 85 25

.:m89m Am ee A5 22 De e2 C6 23

.:m898 C6 22 Bl 22 De 3C A5 22

.:m8AS DS e2 C6 23 C6 22 Bl 22

.:m8A8 Fm 2185 26 A5 22 Dm e2

.:m8Bm C6 23 C6 22 Bl 22 18 65

.:m8B8 24 AA A5 26 65 25 48 A5

.:S8ce 37 De m2 C6 38 C6 37 68

.:S8C8 9137 8A 48 A5 37 Dm m2

.:m8Dm C6 38 C6 37 68 9137 18

.:e8D8 9S B6 C9 4F De ED A5 37

.:m8Em 85 33 A5 38 85 34 6C 37

.:m8E8 ee 4F 4F 4F 4F AD E6 FF

.:m8Fm ee 8D 16 m3 AD E7 FF me

.:e8F8 8D 17 m3 A9 8e 2m 9S FF

.:S9mm me em D8 68 8D 3E m2 68

.:mge8 8D 3D 92 68 8D 3C m2 68

.:m91m 8D 3B 92 68 AA 68 A8 38

.:m918 8A E9 92 8D 3A m2 98 E9

.:e92m mm em 8D 39 e2 BA 8E 3F

Page 18: 40 Best Machine Code Routines for C64

• :0928 02 20 57 FD 00 A2 42 A9 .:0930 2A 20 57 FA 00 A9 52 D0 .:0938 34 E6 C1 D0 06 E6 C2 D0 .:0940 02 E6 26 60 20 CF FF C9 .:0948 0D D0 F8 68 68 EA EA EA .:0950 EA EA A9 00 00 85 26 A2 .:0958 0D A9 2E 20 57 FA 00 EA .:0960 EA EA EA EA 20 3E F8 00 .:0968 C9 2E F0 F9 C9 20 F0 F5 .:0970 A2 0E DD B7 FF 00 D0 0C .:0978 8A 0A AA BD C7 FF 00 48 .:0980 BD C6 FF 00 48 60 CA 10 .:0988 EC 4C ED FA 00 A5 C1 8D .:0990 3A 02 A5 C2 8D 39 02 60 .:0998 A9 08 85 1D A0 00 00 20 .:B9A0 54 FD B0 B1 C1 20 48 FA .:09A8 0B 20 33 F8 00 C6 1D D0 .:09B0 F1 60 20 88 FA 00 90 0B .:09B8 A2 00 00 81 C1 C1 C1 F0 .:09C0 03 4C ED FA 00 20 33 F8 .:09C8 00 C6 1D 60 A9 3B 85 C1 .:09D0 A9 02 85 C2 A9 05 60 98 .:09D8 48 20 57 FD 00 68 A2 2E .:09E0 4C 57 FA 00 EA EA EA EA .:09E8 EA A2 00 00 BD EA FF 00 .:09F0 20 D2 FF E8 E0 16 D0 F5 .:09F8 A0 3B 20 C2 F8 00 AD 39 .:0A00 02 20 48 FA 00 AD 3A 02 .:0A08 20 48 FA 00 20 B7 F8 00 .:0A10 20 8D F8 00 F0 5C 203E .:0A18 F8 00 20 79 FA 00 90 33 .:0A20 20 69 FA 00 20 3E F8 00 .:0A28 20 79 FA 00 90 28 20 69 .:0A30 ~A 00 EA EA EA EA EA 20 .:0A38 E1 FF F0 3C A6 26 D0 38 .:0A40 A5 C3 C5 C1 A5 C4 E5 C2 .:0A48 90 2E A0 3A 20 C2 F8 00 .:0A50 20 41 FA 00 20 8B F8 00 .:0A58 F0 E0 4C ED FA 00 20 79 .:0A60 FA 00 90 03 20 80 F8 00 .:0A68 20 B7 F8 00 D0 07 2B 79

19

Page 19: 40 Best Machine Code Routines for C64

20

.:0A70 FA 00 90 EB A9 08 85 1D

.:0A78 20 3E F8 00 20 A1 F8 00

.:0A80 D0 F8 4C 47 F8 00 20 CF

.:0A88 FF C9 0D F0 BC C9 20 D0

.:0A90 D1 20 79 FA 20 90 03 20

.:0A98 80 F8 00 EA EA EA EA EA

.:0AA0 AE 3F 02 9A 78 AD 39 02

.:0AA8 48 AD 3A 02 48 AD 3B 02

.:0AB0 48 AD 3C 02 AE 3D 02 AC

.:0AB8 3E 02 40 EA EA EA EA EA

.:0AC0 AE 3F 02 9A 6C 02 A0 A0

.:0AC8 0184 BA 84 B9 88 84 B7

.:0AD0 84 90 84 93 A9 40 85 BB

.:0AD8 A9 02 85 BC 20 CF FF C9

.:0AE0 20 F0 F9 C9 BD F0 38 C9

.:BAE8 22 D0 14 20 CF FF C9 22

.:0AF0 F0 10 C9 0D F0 29 91 BB

.:0AF8 E6 B7 C8 C0 10 D0 EC 4C

.:0B00 ED FA 00 20 CF FF C9 0D

.:0B08 F0 16 C9 2C D0 DC 20 88

.:0B10 FA 00 29 0F F0 E9 C9 03

.:0B18 F0 E5 85 BA 20 CF FF C9

.:0B20 0D 60 6C 30 B3 6C 32 03

.:0B28 20 96 F9 00 D0 D4 EA EA

.:0B30 EA EA EA A9 00 00 20 EF

.:0B38 F9 00 A5 90 29 10 D0 C4

.:0B40 4C 47 F8 00 20 96 F9 00

.:0B48 C9 2C D0 BA 20 79 FA 00

.:0B50 20 69 FA 00 20 CF FF C9

.:0B58 2C D0 AD 20 79 FA 00 A5

.:0B60 C1 85 AE A5 C2 85 AF 20

.:0B68 69 FA 00 20 CF FF C9 0D

.:0B70 D0 98 EA EA EA EA EA 20

.:0B78 F2 F9 00 4C 47 F8 00 A5

.:0B80 C2 20 48 FA m0 A5 C1 48

.:0B88 4A 4A 4A 4A 20 60 FA 00

.:0B90 AA 68 29 0F 20 60 FA 00

.:0B98 48 8A 20 D2 FF 68 4C D2

.:0BA0 FF 09 30 C9 3A 90 02 69

.:0BA8 06 60 A2 02 B5 C0 48 B5

.:0BB0 C2 95 C0 68 95 C2 CA D0

Page 20: 40 Best Machine Code Routines for C64

.:0BB8 F3 60 20 88 FA 00 90 02

.:0BC0 85 C2 20 88 FA 00 90 02

.:0BC8 85 C1 60 A9 00 00 85 2A

.:0BD0 20 3E F8 00 C9 20 D0 09

.:0BD8 20 3E F8 00 C9 20 D0 0E

.:0BE0 18 60 20 AF FA 00 0A 0A

.:0BE8 0A 0A 85 2A 20 3E F8 00

.:0BF0 20 AF FA 00 05 2A 38 60

.:0BF8 C9 3A 90 02 69 08 29 0F

.:0C00 60 A2 02 2C A2 00 00 B4

.:0C08 C1 D0 08 B4 C2 D0 02 E6

.:0C10 26 D6 C2 D6 Cl 60 20 3E

.:0CI8 F8 00 C9 20 F0 F9 60 A9

.:0C20 00 00 8D 00 00 01 20 CC

.:0C28 FA 00 20 8F FA 00 20 7C

.:0C30 FA 00 90 09 60 20 3E F8

.:0C38 00 20 79 FA 00 B0 DE AE

.:0C40 3F 02 9A EA EA EA EA EA

.:0C48 A9 3F 20 D2 FF 4C 47 F8

.:0C50 e0 20 54 FD 0e CA De FA

.:0C58 60 E6 C3 D0 02 E6 C4 60

.:0C60 A2 02 B5 C0 48 B5 27 95

.:0C68 C0 68 95 27 CA D0 F3 60

.:0C70 A5 C3 A4 C4 38 E9 02 B0

.:0C78 0E 88 90 0B A5 28 A4 29

.:0C80 4C 33 FB 00 A5 C3 A4 C4

.:0C88 38 E5 Cl 85 IE 98 E5 C2

.:0C90 A8 05 IE 60 20 D4 FA 00

.:0C98 20 69 FA 00 20 E5 FA 00

.:0CA0 20 0C FB 00 20 E5 FA 00

.:0CA8 20 2F FB 00 20 69 FA e0

.:0CB0 90 15 A6 26 D0 64 20 28

.:0CB8 FB 00 90 5F Al Cl 81 C3

.:0CC0 20 05 FB 00 20 33 F8 00

.:0CC8 D0 EB 20 28 FB 00 18 A5

.:0CD0 IE 65 C3 85 C3 98 65 C4

.:0CD8 85 C4 20 0C FB 00 A6 26

.:0CE0 D0 3D Al Cl 81 C3 2e 28

.:eCE8 FB 0e Be 34 2e B8 FA ee

.:eCFe 2e BB FA e0 4C 7D FB e0

.:eCF8 2e D4 FA ee 20 69 FA e0

21

Page 21: 40 Best Machine Code Routines for C64

22

.:mDmm 2m E5 FA 80 28 69 FA 88

.:mD88 28 3E F8 882m 88 FA 88

.:mD18 98 14 85 1D A6 26 D8 11

.:mD18 28 2F FB 809m 8C A5 1D

.:mD28 81 C1 28 33 F8 88 D8 EE

.:8D28 4C ED FA 80 4C 47 F8 88

.:8D38 28 D4 FA 882m 69 FA 88

.:mD38 28 E5 FA 88 28 69 FA 88

.:8D48 28 3E F8 88 A2 88 88 28

.:8D48 3E F8 88 C9 27 D0 14 28

.:8D58 3E F8 08 9D 1m 82 E8 28

.:8D58 CF FF C9 0D Fm 22 E8 28

.:8D60 D8 F1 F8 1C 8E 80 88 81

.:0D68 20 8F FA 00 90 C6 9D 10

.:0D70 02 E8 28 CF FF C9 0D F0

.:0D78 89 20 88 FA 80 90 B6 E0

.:0D88 28 D8 EC 86 1C EA EA EA

.:0D88 EA EA 28 57 FD 88 A2 00

.:0D90 08 A0 08 08 B1 C1 DD 10

.:0D98 02 D0 0C C8 E8 E4 1C D0

.:0DA0 F3 20 41 FA 80 28 54 FD

.:0DA8 00 28 33 F8 80 A6 26 D0

.:0DB0 8D 28 2F FB 80 B8 DD 4C

.:0DB8 47 F8 80 20 D4 FA 00 85

.:0DC0 20 A5 C2 85 21 A2 00 00

.:0DC8 86 28 A9 93 20 D2 FF EA

.:0DD0 EA EA EA EA A9 16 85 1D

.:0DD8 20 6A FC 00 20 CA FC 00

.:0DE0 85 C1 84 C2 C6 1D D0 F2

.:0DE8 A9 9120 D2 FF 4C 47 F8

.:0DF0 00 A0 2C 20 C2 F8 00 20

.:0DF8 54 FD 00 20 41 FA 00 20

.:0E08 54 FD 08 A2 80 08 A1 Cl

.:0E08 20 D9 FC 00 48 28 1F FD

.:0E10 00 68 20 35 FD 00 A2 06

.:0E18 E0 03 D0 12 A4 1F F08E

.:0E20 A5 2A C9 E8 B1 C1 B8 1C

.:0E28 20 C2 FC 88 88 D0 F2 86

.:0E30 2A 98 8E BD 2A FF 00 20

.:0E38 A5 FD 00 BD 30 FF 00 F0

.:0E40 03 20 A5 FD 00 CA D0 D5

Page 22: 40 Best Machine Code Routines for C64

·:0E48 60 20 CD FC 00 AA E8 D0 .:0E50 01 C8 98 20 C2 FC 00 8A .:0E58 86 1C 20 48 FA 00 A6 1C • :0E60 60 A5 1F 38 A4 C2 AA 10 .:0E68 0188 65 C1 90 01 C8 60 .:0E70 A8 4A 90 0B 4A B0 17 C9 .:0E78 22 F0 13 29 07 09 80 4A .:0E80 AA BD D9 FE 00 B0 04 4A .:0E88 4A 4A 4A 29 0F DB 04 A0 .:0E90 80 A9 BB B0 AA BD 1D FF .:0E98 BB 83 2A 29 03 85 1F 98 .:BEAB 29 8F AA 98 A0 03 E0 8A .:BEA8 FB 0B 4A 90 08 4A 4A B9 .:0EB0 20 88 DB FA C8 88 D0 F2 .:0EB8 60 B1 C1 2B C2 FC 00 A2 .:BEC0 0120 FE FA 00 C4 1F C8 .:BEC8 9B F1 A2 03 C0 04 90 F2 .:BED0 6B A8 B9 37 FF 0B 85 28 .:BED8 B9 77 FF BB 85 29 A9 B0 .:0EE0 00 A0 B5 B6 29 26 28 2A .:BEE8 88 D0 F8 69 3F 2B D2 FF .:0EFB CA DB EC A9 20 2C A9 0D .:0EF8 4C D2 FF 2B D4 FA 00 20 .:0F00 69 FA BB 2B E3 FA 00 2B .:0FB8 69 FA B0 A2 00 0B 86 28 .:0F1B EA EA EA EA EA 2B 57 FD .:BF18 0B 2B 72 FC 00 2B CA FC .:0F20 00 85 C1 84 C2 20 E1 FF .:0F28 F0 03 2B 2F FB BB BB E9 .:0F30 4C 47 F8 B0 20 D4 FA B0 .:0F38 A9 03 85 1D 20 3E F8 B0 .:0F40 20 A1 F8 B0 D0 F8 A5 20 .:BF48 85 C1 A5 21 85 C2 4C 46 .:0F5B FC 00 C5 28 F0 03 20 D2 .:BF58 FF 60 2B D4 FA BB 2B 69 .:0F60 FA 00 8E 11 02 A2 B3 20 .:0F68 CC FA BB 48 CA DB F9 A2 .:0F70 03 68 38 E9 3F AB B5 4A .:BF78 6E 11 B2 6E 10 02 88 DB .:0F8B F6 CA D0 ED A2 02 20 CF .:0F88 FF C9 0D F0 1E C9 20 F0

23

Page 23: 40 Best Machine Code Routines for C64

24

.:8F9S FS 28 DS FE 88 B8 8F 28

.:SF98 9C FA S8 A4 C1 84 C2 85

.:8FA8 C1 A9 38 9D 18 82 E8 9D

.:8FA8 18 82 E8 DS DB 86 28 A2

.:8FBS SS 88 86 26 F8 84 E6 26

.:8FB8 F8 75 A2 88 88 86 1D A5

.:8FC8 26 28 D9 FC 88 A6 2A 86

.:SFC8 29 AA BC 37 FF SS BD 77

.:8FD8 FF 88 28 B9 FE 88 D8 E3

.:8FD8 A2 86 E8 83 D8 19 A4 1F

.:8FE8 F8 15 AS 2A C9 E8 A9 38

.:SFE8 B8 21 28 BF FE 88 D8 CC

.:8FF8 28 Cl FE 88 D8 C7 88 D8

.:8FF8 EB 86 2A 98 8B BC 38 FF

.:1888 88 BD 2A FF 88 28 B9 FE

.:1888 88 D8 BS CA D8 D1 F88A

.:1818 28 B8 FE 88 D8 AB 28 B8

.:1818 FE 88 D8 A6 AS 28 CS 1D

.:1828 D8 A8 28 69 FA 88 A4 1F

.:1828 FS 28 A5 29 C9 9D DS 1A

.:1S38 28 1C FB 88 98 8A 98 D8

.:1838 84 AS 1E 18 8A 4C ED FA

.:1848 88 C8 DS FA AS IE 18 F6

.:1848 A4 1F D8 83 19 C2 88 88

.:1858 91 Cl 88 D8 F8 AS 26 91

.:1858 C1 28 CA FC 08 85 C1 84

.:1868 C2 EA EA EA EA EA A8 41

.:1868 28 C2 F8 88 28 54 FD 88

.:1878 28 41 FA 88 28 54 FD 88

.:1878 EA EA EA EA EA 4C B8 FD

.:1888 )88 A8 28 BF FE 88 D8 11

.:1888 98 F8 8E 86 lC A6 1D DD

.:1898 18 82 88 E8 86 1D A6 1C

.:1898 28 68 C9 38 98 83 C9 47

.:18A8 68 38 68 48 82 45 83 D8

.:18A8 88 48 89 38 22 45 33 D8

.:18B8 88 48 89 48 82 45 33 D8

.:18B8 88 48 89 48 82 45 B3 D8

.:18C8 88 48 89 88 88 22 44 33

.:18C8 D8 8C 44 08 88 11 22 44

.:18D8 33 D8 8C 44 9A 18 22 44

Page 24: 40 Best Machine Code Routines for C64

.:19D8 33 D9 98 49 09 19 22 44

.:19E9 33 D0 08 40 09 62 13 78

.:19E8 A9 99 00 21 81 82 99 99

.:19F9 99 90 59 4D 91 92 86 4A

.:lSFe ee 9D 2C 29 2C 23 28 24

.:11"" 59 9" "" 58 24 24 "9 9" • : 11"8 1C 9A 1C 23 5D 8B 1B A1 .: 111" 9D 9A 1D 23 9D 8B 1D A1 • : 1118 9" 9" 29 19 AE 69 A8 19 • : 1129 23 24 53 1B 23 24 53 19 • : 1129 A1 99 9" 1A 5B 5B A5 69 • : 1139 24 24 AE AE A9 AD 29 9" • : 1138 "" 7C "" 99 15 9C 6D 9C • : 1149 A5 69 29 53 84 13 34 11 • : 1148 A5 69 23 Afil D9 62 5A 48 • : 1159 26 62 94 88 54 44 C8 54 • : 1158 69 44 E8 94 "9 99 B4 fil8 • : 1169 94 74 B4 28 6E 74 F4 CC • : 1168 4A 72 F2 A4 8A 9" fil8 AA • : 1178 A2 A2 74 74 74 72 44 69 • : 1178 B2 32 B2 "fiI flI16 22 fil8 flI8 • : 11816 1A 1A 26 26 72 72 88 C9 • : 1199 C4 CA 26 48 44 44 A2 C9 • : 119" 3A 3B 52 4D 47 59 4C 53 • : 1199 e4 46 48 44 516 2C 41 42 • : 11A" F9 16" 35 F9 flI16 CC F9 88 • : 11A9 F7 F8 fiI" 56 F9 "" 99 F9 • : 11B" "" F4 F9 "" "C FA fiI" 3E • : 11B8 FB 16fi1 92 FB flI16 C" FB fiI" • : 11CfiI 39 FC "fiI 5B FD "" 8A FD • : 11C8 "fiI AC FD "fiI 46 F8 fiI" FF • : 11DfiI F7 8fi1 ED F7 flI16 "D 2" 2" • : 11D9 2" efll 43 2fi1 216 53 52 29 • : 11E" 41 43 2fi1 58 52 29 59 52 • : 11E9 2" 53 5fi1 45 52 22 29 29

25

Page 25: 40 Best Machine Code Routines for C64

ROM Routines

The routines in this book use various ROM routines to function. They are as follows:

$AEFO: Check if the next character is a comma and skip it. Otherwise print SYNTAX ERROR and return to Basic.

$A08A: Read next expression (variable, number, etc.) into the FAC.

$B7F7: Change the value in the FAC into a 16 bit integer (0-65535). If the number is too big then print illegal quantity error and return to Basic. Otherwise put the low byte of the number into $14 and the high byte into $15.

$B79E: Read the next expression in the BASIC text and put it as a 8 bit integer in the X register. If the number is greater than 255 then print Illegal quantity error and return to Basic.

$B7EB: This routine reads two expressions or numbers separated by a comma from the Basic text. The first is a 16 bit number and the second is an 8 bit number. The 16 bit number is stored in $14 and $15 and the 8 bit number is stored in the X register. If either or both of the numbers are out of their ranges then the program will stop and print an illegal quantity error. If the comma is missing a syntax error with be displayed. Both these errors return control to Basic.

$E104: This routine gets the file name, the device number and the secondary address from the Basic text. It gives an error if any of the above are wrong. It is used in preparation for loading, saving or verifying a program, as in MSAVE/MLOAOI MVERIFY.

26

Page 26: 40 Best Machine Code Routines for C64

1. Fill

The following routine allows you to fill an area of memory with a byte. It is called by the following command:

SYS 28672,start address, end address, byte

e.g. to fill the text screen with 'A' characters and the colour screen with 1 (white), type the following:

SYS 28672,1024,2023,1 SYS 28672,55296,56295,1

An error will be given if any of the numbers are too big or negative.

PAL (C)1979 BRAD TEMPLETON 2 20: 7000 .OPT P,OO 30: 7S00 *- 57000

IFILL ROUTINE

• ;USES .FB AND .FC ISTORE TOP ADDRESS IN ;828 AND 829

90: 7S00 20 FD AE JSR 5AEFD ;SCAN PAST COMMA

110: 7003 20 8A AD JSR SAD8A ;READ NUMBER AND PUT I INTO FAC

140: 7006 20 F7 B7 JSR $B7F7 IGET NUMBER FROM FAC .' AND PUT IN $14 AND

170: 7009 AS 14 LDA 514 170: 700B 8S FB STA .FB

27

$15

Page 27: 40 Best Machine Code Routines for C64

18": 7""D A5 15 LDA $15 18": 7""F 85 FC STA $FC

2"": 7"11 2" FD AE JSR $AEFD ;SCAN PAST COMMA

22": 7"14 2" 8A AD JSR $AD8A 23": 7"17 2" F7 B7 JSR $B7F7 24": 7"lA A5 14 LDA $14 248: 781C 8D 3C 83 STA 828 2\58: 781F A5 15 LDA $15 25": 7"21 8D 3D "3 STA 829

278: 7"24 2" FD AE JSR SAEFD 288: 7"27 28 8A AD JSR SAD8A 298: 782A 28 F7 B7 JSR SB7F7 388: 782D A5 15 LDA $1\5 388: 7"2F F" "3 BEG! MORE 3"": 7"31 4C 48 B2 JMP $B248

.SB248 IS IG!ANT ERROR 328: 7"34 A\5 14 MORE LDA $14 328: 7"36 8D 3E "3 STA 83" 33": 7"39 A8 "" LOOP LDY 1t8 34": 783B AD 3E "3 LDA 83" 35": 7"3E 91 FB STA ($FB),Y 36": 7"48 28 \57 7" JSR ADD 378: 7"43 A\5 FB LDA $FB 378: 7"4\5 CD 3C "3 CMP 828 37": 7"48 F" "3 BEG! CHECK 38": 7"4A 4C 39 7" JMP LOOP 398: 7"4D A5 FC CHECK LDA $FC 398: 784F CD 3D 83 CMP 829 398: 78\52 F" 8B BEG! FINISH 48": 7854 4C 39 7" JMP LOOP 41": 7"57 E6 FB ADD INC SFB 41": 7"\59 F" "1 BEG! FCPLUSl 42": 7"5B 6" RTS 438: 78\5C E6 FC FCPLUSl INC SFC 438: 78\5E 68 RTS 44": 7S5F 6" FINISH RTS ]7""8-7"6"

28

Page 28: 40 Best Machine Code Routines for C64

B* PC SR AC XR YR SP

.197FE 72 99 99 91 F6

7999 29 FD AE JSR SAEFD 7993 29 8A AD JSR .AD8A 7996 29 F7 B7 JSR .B7F7 7999 AS 14 LDA .14 799B 85 FB STA $FB 799D A5 15 LDA .1S 799F 8S FC STA SFC 7911 29 FD AE JSR .AEFD 7914 29 8A AD JSR SAD8A 7917 29 F7 B7 JSR .B7F7 791A AS 14 LDA .14 791C 8D 3C 93 STA S933C 791F AS 1S LDA .1S 7921 8D 3D 93 STA .933D 7924 29 FD AE JSR .AEFD 7927 29 8A AD JSR .AD8A 792A 29 F7 B7 JSR .B7F7 792D AS 1S LDA .1S 792F F9 S3 BEQ .7934 7931 4C 48 B2 JMP .B248 7934 AS 14 LDA $14 7936 8D 3E 93 STA S933E 7939 A9 S9 LDY .. S99 793B AD 3E 93 LDA S933E 793E 91 FB STA 'SFB) ~ Y 7949 29 S7 79 JSR S79S7 7943 AS FB LDA SFB 7945 CD 3C 93 CMP S933C 7948 F9 93 BEQ S794D 794A 4C 39 79 JMP S7939 794D AS FC LDA SFC 794F CD 3D 93 CMP $933D 79S2 F9 SB BEQ .79SF 7954 4C 39 79 JMP S7939 79S7 E6 FB INC SFB 79S9 F9 91 BEG! .795C

29

Page 29: 40 Best Machine Code Routines for C64

2. Move

The following routine allows you to move an area of memory to another location. It has the syntax:

SYS 24576, start, finish,destination address.

e.g. to move the contents of the screen to 16384 type the following:

SYS 24576,1024,2023,16384

The three numbers or variables must be no bigger than 65535. If they are bigger then an error will be printed and control will return to Basic.

PAL (C)1979 BRAD TEMPLETON 2 28: 6888 .OPT P,OO 38: 6888 *- .6111111

• IROUTINE TO MOVE ONE • AREA OF ;MEMORY TO ANOTHER I ;SCAN COMMA

98: 6888 28 FD AE JSR SAEFD 1811: 68113 211 8A AD JSR SAD8A 1111 : 6886 28 F7 B7 JSR SB7F7 1211: 61189 AS 14 LDA .14 1311: 688B 8D 78 68 STA TEMP 1411: 688E AS 1S LDA S1S 1SII: 611111 8D 79 68 STA TEMP+1

16S: 6813 28 FD AE JSR SAEFD

30

Page 30: 40 Best Machine Code Routines for C64

170: 6016 20 8A AD JSR SAD8A 180: 6019 20 F7 B7 JSR SB7F7 190: 601C A5 14 LDA S14 200: 601E 8D 7A 60 STA TEMP+2 210: 6021 A5 15 LDA S15 220: 6023 8D 7B 60 STA TEMP+3 225: 6026 20 FD AE JSR .AEFD 230: 6029 20 8A AD JSR .AD8A 240: 602C 20 F7 B7 JSR .B7F7 250: 602F A5 14 LDA .14 268: 6031 8D 7C 68 STA TEMP+4 278: 6034 A5 15 LDA S15 288: 6036 8D 7D 68 STA TEMP+5

291 : 6039 AD 78 68 LDA TEMP 291 : 603C 85 FB STA .FB 292: 603E AD 79 60 LDA TEMP+l 292: 6041 85 FC STA .FC 293: 6043 AD 7C 68 LDA TEMP+4 293: 6046 85 FD STA .FD 294: 6048 AD 7D 68 LDA TEMP+5 294: 604B 85 FE STA .FE 388: 604D A0 88 LDY .. 8 310: 604F Bl FB LOOP LDA CSFB) ,Y 328: 6051 91 FD STA (SFD),Y 338: 6053 28 68 68 JSR ADDONE 348: 6056 A5 FB LDA .FB 358: 6058 CD 7A 68 CMP TEMP+2 368: 605B F0 18 BEQ CHECK 378: 605D 4C 4F 68 JMP LOOP

I 488: 6068 E6 FB ADDONE INC .FB 418: 6062 D8 82 BNE MORE 428: 6064 E6 FC INC .FC 438: 6066 E6 FD MORE INC .FD 448: 6868 D8 82 BNE RETURN 458: 686A E6 FE INC .FE 468: 686C 68 RETURN RTS ,

31

Page 31: 40 Best Machine Code Routines for C64

498: 686D A5 FC CHECK LDA $FC 588: 686F CD 7B 68 CMP TEMP+3 518: 6872 F8 83 BEGl FIN 528: 6874 4C 4F 68 JMP LOOP

558: 6877 FIN .. * 555: 6877 68 RTS 568: 6878 TEMP .. * ]6888-6878

READY.

B* PC SR AC XR YR SP

.197FE 72 88 08 81 F6

6888 28 FD AE JSR $AEFD 6883 28 8A AD JSR $AD8A 6086 28 F7 B7 JSR $B7F7 6889 A5 14 LDA $14 688B 8D 78 68 STA $6878 688E A5 15 LDA S15 6010 8D 79 68 STA $6879 6013 28 FD AE JSR SAEFD 6816 28 8A AD JSR SAD8A 6819 20 F7 B7 JSR $B7F7 681C A5 14 LDA S14 681E 8D 7A 60 STA S607A 6821 A5 15 LDA $15 6023 8D 7B 68 STA S607B 6826 28 FD AE JSR SAEFD 6829 20 8A AD JSR .AD8A 602C 28 F7 B7 JSR .B7F7 682F A5 14 LDA .14 6831 8D 7C 68 STA $687C 6034 A5 15 LDA $15 6836 8D 7D 68 STA $687D

32

Page 32: 40 Best Machine Code Routines for C64

6039 AD 78 60 LDA S6078 603C 85 FB STA SFB 603E AD 79 60 LDA S6079 6041 85 FC STA SFC 6043 AD 7C 61lJ LDA 561lJ7C 6046 85 FD STA SFD 6048 AD 7D 61lJ LDA S61lJ7D 604B 85 FE STA SFE 604D AIlJ IlJII LDY .. 51lJ1lJ 6R14F B1 FB LDA (SFB) ~ Y 6051 91 FD STA (5FD) ~ Y 6R153 2R1 6R1 6R1 JSR 561lJ6R1 6056 A5 FB LDA .FB 6058 CD 7A 6R1 CMP .6R17A 6115B F0 111 BEG! 56R16D 6R15D 4C 4F 61lJ JMP 561lJ4F 6061lJ E6 FB INC 5FB 6R162 DIlJ 02 BNE S61lJ66 6064 E6 FC INC .FC 6066 E6 FD INC SFD 6068 D0 02 BNE S606C 606A E6 FE INC .FE 606C 60 RTS 606D A5 FC LDA .FC 606F CD 7B 60 CMP 5607B 6072 F0 03 BE6I S61lJ77 6074 4C 4F 61lJ JMP 5604F 6077 61lJ RTS

33

Page 33: 40 Best Machine Code Routines for C64

3. Pause

The following routine allows a listing to be stopped at any time. It will in fact stop any output to the screen that is printed. It works by interrupting the character out routine and check to see if the shift key has been pressed. If it has then it loops until the key has been released.

The syntax is SYS 960. To disable it press run/stop and restore simultaneously.

PAL (C) 1979 BRAD TEMPLETON 2 28: S3C8 .OPT P,OO 38: S3CIII *- 968

58: S'$C8 A9 CB LDA *<MAIN 68: S3C2 8D 26 83 STA 886 78: S3C5 A9 83 LDA *>MAIN 88: S3C7 8D 27 83 STA 887 98: S3CA 68 RTS

I 118: S3CB 48 MAIN PHA 11111 : S3CC 8A TXA 118: S3CD 48 PHA 118: S3CE 98 TYA 118: S3CF 48 PHA 128: S3D8 AD 8D 82 LOOP LDA 653 138: S3D3 C9 81 CMP *1 148: S3D5 F8 F9 BEG! LOOP 168: S3D7 68 PLA 168: S3D8 A8 TAY 16111: 03D9 68 PLA 16111: 03DA AA TAX

34

Page 34: 40 Best Machine Code Routines for C64

16S: S3DB 68 17S: S3DC 4C CA Fl lS3CS-S3DF

READY.

B* PC SR AC

•• 97FE 72 SS

S3CS A9 CB S3C2 8D 26 S3 S3CS A9 S3 S3C7 8D 27 S3 S3CA 6S S3CB 48 S3CC 8A S3CD 48 S3CE 98 S3CF 48 S3DS AD 8D S2 S3D3 C9 Sl S3DS FS F9 S3D7 68 S3D8 A8 S3D9 68 S3DA AA S3DB 68 S3DC 4C CA Fl

PLA JMP .FICA

XR YR SP SS Sl F6

LDA ... CB STA .S326 LDA ... S3 STA SS327 RTS PHA TXA PHA TYA PHA LDA SS28D CMP .. SSl BE61 .S3DS PLA TAY PLA TAX PLA JMP .FICA

35

Page 35: 40 Best Machine Code Routines for C64

4. Function keys

The following program allows you to put commands onto the function keys. It uses the IRQ interrupt to scan the keyboard. There are listings in PAL and Supermon format to see how the program works, but it is best to enter the program as the Basic loader which follows. Any of the three ways works equally well but it is easier to change the text to go on the function keys from the Basic listing.

To turn the keys on type SYS 49152 (for the Basic listing, SYS 24576 for the other two). To turn them off press run/stop and restore.

PAL (C)1979 BRAD TEMPLETON 2 2": 6""" .OPT P,OO 3": 60"" *- S6S"S

;ROUTINE TO SETUP ;FUNCTION KEYS

8": 6SS" 78 SEI 9": 6""1 A9 "D LDA tt<MAIN 1"": 6S"3 8D 14 "3 STA 788 11S: 6""6 A9 6" LDA tt>MAIN 12": 6SS8 8D 15 "3 STA 789 13": 60"B 58 CLI 14": 6""C 6S RTS

17": 6"SD 48 MAIN PHA 18S: 6SSE 8A TXA 19S: 6SSF 48 PHA

36

Page 36: 40 Best Machine Code Routines for C64

200: 6010 98 TYA 210: 6011 48 PHA 220: 6012 A5 C5 LDA SC5 230: 6014 C5 FB CMP SFB 240: 6016 F0 52 BEG! LOOP 250: 6018 85 FB STA $FB 260: 601A C9 03 CMP *3 270: 601C D0 08 BNE LOOPl

290: 601E A9 38 LDA *.30 308: 6828 8D 72 60 STA C180 318: 6823 4C 47 69 JMP PRINT

; 330: 6826 C9 84 LOOPl CMP *4 349: 6928 D9 08 BNE LOOP2 359: 682A A9 99 LDA *9 369: 682C 8D 72 69 STA C180 379: 692F 4C 47 69 JMP PRINT

399: 6832 C9 95 LOOP2 CMP *5 499: 6934 D0 98 BNE LOOP3

429: 6836 A9 18 LDA *.18 438: 6938 8D 72 69 STA C199 448: 693B 4C 47 69 JMP PRINT

460: 603E C9 06 LOOP3 CMP *6 470: 6049 D0 28 BNE LOOP 480: 6042 A9 20 LDA *$20 490: 6044 8D 72 69 STA C100

510: 6047 AD 8D 02 PRINT LDA $928D 520: 604A C9 01 CMP *1 530: 684C D0 09 BNE PUTON

550: 604E AD 72 69 LDA C109 560: 6051 18 CLC 560: 6052 69 08 ADC *8 570: 6054 8D 72 60 STA C100

590: 6057 A2 00 PUTON LDX *0

37

Page 37: 40 Best Machine Code Routines for C64

6BB: 6B59 AC 72 6B LDY CIBB 61B: 6B5C B9 73 6111 LOP LDA CIB1,Y 62B: 6B5F 9D 77 B2 STA SB277,X 631l1: 611162 E8 INX 641l1: 6B63 C8 INY 651l1: 6B64 EIlI B8 CPX .. S1lI8 66B: 6B66 DB F4 BNE LOP 67B: 6B68 86 C6 STX $C6 68B: 6B6A 68 LOOP PLA 69B: 6B6B A8 TAY 7BB: 6B6C 68 PLA 71B: 6B6D AA TAX 72B: 6B6E 68 PLA 73B: 6B6F 4C 31 EA JMP $EA31

; 75B: 6B72 BB Clll1B .BYT B 76B: 6B73 4C 49 53 CUll .ASC "LIST" 76B: 6B77 BD B4 B4 .BYT 13,4,4,4 77B: 6B7B 52 55 4E .ASC "RUNU 77S: 6S7E SD S4 04 .BYT 13,4,4,4,4 78S: 6B83 5S 52 49 .ASC "PRINT-78S: 6S88 04 04 04 .BYT 4,4,4 79S: 6S8B 54 48 45 .ASC "THEN" 79B: 608F S4 04 04 .BYT 4,4,4,4 8SB: 6B93 4C 4F 41 .ASC "LOAD" 8SB: 6B97 S4 04 04 .BYT 4,4,4,4 81B: 6B9B 53 41 56 .ASC ·SAVE" 81S: 6S9F B4 04 04 .BYT 4,4,4,4 820: 6SA3 56 45 52 .ASC "VERIFY-82S: 6SA9 04 04 .BYT 4,4 83S: 6SAB 47 4F 54 .ASC "GOTO" 830: 6SAF 04 04 04 .BYT 4,4,4,4 J6BSS-6BB3

READY.

38

Page 38: 40 Best Machine Code Routines for C64

B* PC SR AC XR YR SP

.197FE 72 fIJfIJ fIJfIJ flJl F6

6fIJfIJfIJ 78 SEI 6flJflJl A9 flJD LDA .. 5f1JD 6f1JflJ3 8D 14 flJ3 STA 5f1J314 6f1JflJ6 A9 6fIJ LDA .. 56fIJ 6f1JflJ8 8D 15 flJ3 STA .flJ315 6f1JflJB 58 CLI 6f1JflJC 6fIJ RTS 6f1JflJD 48 PHA 6f1JflJE 8A TXA 6f1JflJF 48 PHA 6flJlfIJ 98 TYA 6flJll 48 PHA 6f1J12 A5 C5 LDA .C5 6f1J14 C5 FB CMP 5FB 6f1J16 FfIJ 52 BEG .6f1J6A 6f1J18 85 FB STA .FB 6flJ1A C9 flJ3 CMP ... 83 6flJ1C DfIJ flJ8 BNE 56826 6flJ1E A9 3fIJ LDA ... 3fIJ 6f1J2fIJ 8D 72 6fIJ STA .6f1J72 6f1J23 4C 47 6fIJ .JMP .6f1J47 6f1J26 C9 flJ4 CMP ... flJ4 6f1J28 DfIJ flJ8 BNE 56832 6f1J2A A9 fIJfIJ LDA .. 5fIJfIJ 6f1J2C 8D 72 6fIJ STA 56f1J72 6f1J2F 4C 47 6fIJ .JMP 56f1J47 6f1J32 C9 flJ5 CMP ... flJ5 6f1J34 DfIJ flJ8 BNE .6f1J3E 6f1J36 A9 lfIJ LDA ... lfIJ 6f1J38 8D 72 6fIJ STA S6f1J72 6f1J3B 4C 47 6fIJ .JMP .6f1J47 6f1J3E C9 flJ6 CMP .. 5f1J6 6f1J4fIJ DfIJ 28 BNE .6f1J6A 6f1J42 A9 2fIJ LDA ... 2fIJ 6f1J44 8D 72 6fIJ STA 56872 6f1J47 AD 8D 82 LDA 5f1J28D 6f1J4A C9 flJl CMP ,,5el

39

Page 39: 40 Best Machine Code Routines for C64

604C DS S9 BNE .6S37 604E AD 72 6S LDA .6S72 6031 18 CLC 6032 69 S8 ADC ... S8 6834 8D 72 6S STA .6S72 6837 A2 SS LDX ".SS 6839 AC 72 6S LD'!' .6S72 683C B9 73 6S LDA .6S73,Y 683F 9D 77 82 STA .S277,X 6862 E8 INX 6863 C8 IN'!' 6864 ES S8 CPX ... 88 6S66 DS F4 BNE .6S3C 6S68 86 C6 STX .C6 6S6A 68 PLA 6S6B A8 TAY 6S6C 68 PLA 6S6D AA TAX 6S6E 68 PLA 6S6F 4C 31 EA JMP .EA31

• : 6S72 SS 4C 49 33 54 SD S4 S4 • : 6S7A S4 32 33 4E "D S4 84 S4 • : 6S82 S4 3S 32 49 4E 34 S4 S4 • : 6S8A S4 34 48 43 4E S4 84 S4 • : 6S92 S4 4C 4F 41 44 S4 S4 S4 • : 6S9A S4 33 41 36 43 S4 S4 S4 • : 6SA2 S4 36 43 32 49 46 39 S4 • : 6SAA S4 47 4F 34 4F S4 S4 S4 • : 6SB2 S4 SS SS SS "S SS FF SS

40

Page 40: 40 Best Machine Code Routines for C64

IB DATA 12B,169,16,141,2B,3,169,192,141, 21,3,SS,96,234,234,234,72,13S,72,152,72 15 DATA 165,197,197,251,24B,Sl,133,251,2 Bl,3,2BS,S,169,4S,141,B,193,76,74,192 2B DATA2Bl,4,2BS,S,169,B,141,B,193,76,74 ,192,2Bl,5,2BS,S,169,16,141,B,193,76,74 25 DATA 192,2Bl,6,2BS,39,169,32,141,B,19 3,173,141,2,2Bl,1,2BS,S,173,B,193,lB5,S 3B DATA141,B,193,162,B,172,B,193,lS5,1,1 93,157,119,2,232,2BB,224,S,2BS,244,134 35 DATA19S,lB4,16S,lB4,17B,lB4,76,49,234

4B FORA=49152T049267:READB:POKEA,B:NEXT 5B FORA=BT07:READK$:FORB=lTOS:L=ASC«MID $(K$,B,1))):IFL=95THENL=13 55 IFL=47THENL=4 6B POKE494B9+(A*S)+B,L:NEXT:NEXT:POKE494 B9,4:SYS49152 7B DATAI/LIST~III" S0 DATA"PRINTIII H

9B DATAI/RUN~IIIII/ leB DATA"THENIIII" I1B DATA"LOADIIII" 12B DATA"SAVEIIII H

13B DATAuVERIFYII" 14B DATA"GOTOIIII"

READY.

41

Page 41: 40 Best Machine Code Routines for C64

5. IRQ clock

The clock routine is updated by the IRQ interrupt which is called by the computer every 50th of a second. The routine used to print line numbers for BASIC is used to print the time (10 byte in X and high byte in A). It is not very good for using when typing in a program as the cursor is always at the top of the screen but it works fine in a program. The syntax to set the clock is as follows:

SYS 28672,hours,minutes.

The clock is in 24 hour format, so remember to enter the time in 24 hour format.

PAL (C) 1979 BRAD TEMPLETON 2 2": 7""" .OPT P,OO 3": 7""" *- .7"""

;DISPLAYS A CLOCK AT ITOP LEFT ;OF SCREEN I ;TO SET TYPE

;SYS 24576,HOURS,MINS ; ;SECONDS ASSUMED ZERO

15": 7""" 2" FD AE JSR $AEFD 16": 7""3 2" 9E B7 JSR .B79E 17": 7""6 8A TXA 18": 7""7 C9 18 CMP #24 19": 7""9 B" 14 BCS IGIERR

42

Page 42: 40 Best Machine Code Routines for C64

200: 708B 8D B7 70 STA HOUR

220: 700E 20 FD AE JSR SAEFD 230: 7011 20 9E B7 JSR SB79E 240: 7014 8A TXA 2~0: 7015 C9 3C CMP *60 260: 7017 B0 06 BCS IGiERR 270: 7019 8D B8 70 STA MINUTE

290: 701C 4C 22 70 JMP SETUP ;

310: 701F 4C 48 B2 IGiERR JMP SB248 ;

330: 7022 78 SETUP SEI 340: 7023 A9 3F LDA *<MAIN 350: 702~ 8D 14 03 STA 788 360: 7028 A9 70 LDA *>MAIN 370: 702A 8D 15 03 STA 789 380: 702D AD B7 70 LDA HOUR 401lJ: 7031lJ AD B8 71lJ LDA MINUTE 421lJ: 71lJ33 A9 1lJ0 LDA *1lJ 431lJ: 71lJ3~ 8D B9 71lJ STA SECOND 451lJ: 7038 A9 00 LDA *0 451lJ: 703A 8D BA 71lJ STA COUNTER 461lJ: 703D 58 CLI 471lJ: 703E 61lJ RTS

; 501lJ: 703F EE BA 71lJ MAIN INC COUNTER ~10: 7042 AD BA 70 LDA COUNTER 520: 704~ C9 3C CMP *61lJ 531lJ: 71lJ47 B0 03 BCS CHANGE

551lJ: 7049 4C 31 EA JMP SEA31

~70: 704C A9 00 CHANGE LDA *0 580: 704E 8D BA 71lJ STA COUNTER

601lJ: 7051 EE B9 71lJ INC SECOND 611lJ: 71lJ54 AD B9 70 LDA SECOND 620: 7057 C9 3C CMP *60

43

Page 43: 40 Best Machine Code Routines for C64

638: 7839 B8 83 BCS MINUTECHANGE

638: 785B 4C 8D 78 JMP PRINT

678: 783E A9 88 MINUTECHALDA .. 8 688: 7868 8D B9 78 STA SECOND 698: 7863 EE B8 78 INC MINUTE 788: 7866 AD B8 78 LDA MINUTE 718: 7869 C9 3C CMP .. 68 728: 786B B8 83 BCS HOURCHANGE

748: 786D 4C 8D 78 JMP PRINT ;

768: 7878 A9 88 HOURCHANGLDA .. 8 778: 7872 8D B8 78 STA MINUTE 788: 7875 EE B7 78 INC HOUR 798: 7878 AD B7 78 LDA HOUR 888: 787B C9 18 CMP .. 24 818: 787D 98 8E BCC PRINT

838: 787F A9 88 LDA .. 8 848: 7881 8D B9 78 STA SECOND 858: 7884 8D B8 78 STA MINUTE 868: 7887 8D B7 78 STA HOUR 878: 788A 4C 31 EA JMP SEA31

898: 788D A9 13 PRINT LDA ""I 988: 788F 28 D2 FF JSR SFFD2

928: 7892 A9 88 LDA .. 8 938: 7894 AE B7 78 LDX HOUR 948: 7897 28 CD BD JSR SBDCD

968: 789A A9 3A LDA :It" : 978: 789C 28 D2 FF JSR $FFD2

998: 789F A9 88 LDA .. 8 1888: 78Al AE B8 78 LDX MINUTE 1818: 78A4 28 CD BD JSR $BDCD

1838: 78A7 A9 3A LDA tI":

44

Page 44: 40 Best Machine Code Routines for C64

1040: 70A9 20 D2 FF JSR .FFD2

1060: 70AC A9 00 LDA 10 1070: 70AE AE B9 70 LDX SECOND 1080: 70Bl 20 CD BD JSR .BDCD 1090: 70B4 4C 31 EA JMP .EA31

; 1110: 70B7 00 HOUR .BYT 0 1120: 70B8 00 MINUTE .BYT 0 1130: 70B9 00 SECOND .BYT 0 114": 70BA "0 COUNTER .BYT 0 l700"-7"BB

READY.

B* PC SR AC XR YR SP

.197FE 72 00 "0 01 F6

7""" 2" FD AE JSR .AEFD 7"03 20 9E B7 JSR .B79E 7"06 8A TXA 7"07 C9 18 CMP 1.18 7009 B" 14 BCS '7"lF 7"0B 8D B7 70 STA .70B7 7"0E 2" FD AE JSR .AEFD 7"11 20 9E B7 JSR .B79E 7014 8A TXA 7015 C9 3C CMP 1.3C 7"17 B0 06 BCS '7"lF 7"19 8D B8 70 STA '7"B8 701C 4C 22 7" JMP .7022 7"lF 4C 48 B2 JMP .B248 7022 78 SEI 7"23 A9 3F LDA 1.3F 7025 8D 14 03 STA .0314

45

Page 45: 40 Best Machine Code Routines for C64

7828 A9 78 LDA .. 578 782A 8D H5 83 STA 58315 782D AD B7 78 LDA 578B7 7838 AD B8 78 LDA 578B8 7833 A9 88 LDA .. 588 7835 8D B9 78 STA 578B9 7838 A9 88 LDA "588 783A SD BA 70 STA 579BA 783D 58 CLI 793E 69 RTS 783F EE BA 78 INC S78BA 7942 AD BA 78 LDA S70BA 7845 C9 3C CMP ... 3C 7847 B0 83 BCS S704C 7849 4C 31 EA JMP SEA31 784C A9 80 LDA ... 00 784E 8D BA 78 STA S78BA 7951 EE B9 78 INC S79B9 7854 AD B9 78 LDA .78B9 7857 C9 3C CMP .. S3C 7859 B8 93 BCS 5785E 795B 4C 8D 70 JMP 5708D 795E A9 99 LDA .. 598 7968 SD B9 79 STA 570B9 7863 EE BS 71i!J INC 57li!JB8 7866 AD B8 70 LDA 578B8 7869 C9 3C CMP .. S3C 786B BIi!J 93 BCS 57879 71i!J6D 4C 8D 78 JMP 578SD 71i!J78 A9 90 LDA "S01i!J 7872 SD B8 78 STA 578BS 7875 EE B7 71i!J INC 570B7 7878 AD B7 78 LDA 578B7 797B C9 lS CMP "51S 71i!J7D 91i!J 9E BCC 571i!J8D 71i!J7F A9 1i!J9 LDA .. 509 7li!JSl 8D B9 71i!J STA S7li!JB9 7li!JS4 8D BS 70 STA 570B8 7887 SD B7 78 STA 578B7 7li!JSA 4C 31 EA JMP 5EA31 71i!J8D A9 13 LDA .. 513

46

Page 46: 40 Best Machine Code Routines for C64

788F 28 D2 FF JSR SFFD2 7892 A9 88 LDA .. S88 7894 AE B7 78 LDX S78B7 7897 28 CD BD JSR SBDCD 789A A9 3A LDA .. S3A 789C 28 D2 FF JSR .FFD2 789F A9 88 LDA ... 88 78A1 AE B8 78 LDX .78B8 78A4 28 CD BD JSR .BDCD 78A7 A9 3A LDA ... 3A 78A9 28 D2 FF JSR SFFD2 78AC A9 88 LDA .. S88 78AE AE B9 78 LDX .78B9 78B1 28 CD BD JSR .BDCD 78B4 4C 31 EA JMP .EA31 78B7 88 BRK 78B8 88 BRK 78B9 88 BRK 78BA 88 BRK

47

Page 47: 40 Best Machine Code Routines for C64

6. Pixel scroll left

The following routine scrolls the screen to the left by one pixel every time that it is called.

To scroll the screen one pixel to the left type SYS 4096.

PAL (C) 19'9 BRAD TEMPLETON 2 2": 1""" .OPT P,OO 3": 1""" *- '1""" 4": II1J"" AD 16 D" LDA 532'" 5": II1J"3 29 F8 AND tt248 6": II1J"5 18 CLC ,,,: II1J"6 6D 5B 1" ADC BYTE 8": II1J"9 8D 16 D" STA 532'" 9": II1J"C CE 5B 1" DEC BYTE 1"": II1J"F AD 5B 1" LDA BYTE 11": I11J12 C9 FF CMP tt.FF 12": I11J14 F" "1 BE iii RESET 13": I11J16 6" RTS 14": Il1Jl' AD 16 D" RESET LDA 532'" 140: II1JIA 29 F8 AND tt248 14": II1JIC 18 CLC 14": l"lD 69 ", ADC tt, 14": II1JIF 8D 16 D" STA 532'" 15": I11J22 A9 ", LDA tt, 15": 1"24 8D 5B 1" STA BYTE 16": 1"2' 2" 2B 1" JSR CHARSCROLL 1''': 102A 6" RTS 18": 102B A9 06 CHARSCROLLDA tt6 19": 102D 8D 44 03 STA .0344 2"": 103" A2 "" LDX tt" 210: 1"32 A" 0" LDY tt0 22": 1034 BD "1 "4 LOOP LDA '''4''1, x

48

Page 48: 40 Best Machine Code Routines for C64

239: 1937 9D 99 94 STA .9499, X 249: 193A BD Fl 94 LDA .94Fl,X 259: 193D 9D F9 94 STA .94F9,X 269: 1949 BD El 95 LDA .93El,X 279: 1943 9D E9 95 STA .95E9,X 289: 1946 BD Dl 96 LDA .96Dl,X 299: 1949 9D D9 96 STA $96D9,X 399: 194C E8 INX 319: 194D C8 INY 329: 194E C9 27 CPY tt$27 339: 1959 D9 E2 BNE LOOP 349: 1952 E8 INX 339: 1953 A9 99 LDY tt9 369: 1933 CE 44 93 DEC $9344 379: 1938 D9 DA BNE LOOP 389: 195A 69 RTS 399: 195B 97 BYTE .BYTE7 1 1999-103C

READY.

B* PC SR AC XR YR SP

• ; 97FE 72 99 99 91 F6

1999 AD 16 D9 LDA $D916 1993 29 F8 AND ... F8 1995 18 CLC 1996 6D 3B 19 ADC $193B 1999 8D 16 D9 STA $D916 199C CE 5B 19 DEC $195B 199F AD 3B 19 LDA .195B 1912 C9 FF CMP tt.FF 1914 F9 91 BEG! .1917 1916 69 RTS 1917 AD 16 D9 LDA $D916 191A 29 F8 AND tt$F8

49

Page 49: 40 Best Machine Code Routines for C64

UIlC 18 CLC Ul1D 69 87 ADC .. S87 181F 8D 16 D8 STA .D816 1822 A9 87 LDA .. SRJ7 1824 8D SB 18 STA .lRJ5B 1827 28 2B 1RJ JSR .lRJ2B 1RJ2A 6RJ RTS 1RJ2B A9 RJ6 LDA .. SRJ6 1RJ2D 8D 44 RJ3 STA .RJ344 1838 A2 RJ8 LDX ... RJRJ 1RJ32 ARJ RJ8 LDY ... RJRJ 1834 BD RJ1 84 LDA .RJ4RJ 1 , X 1RJ37 9D RJ8 84 STA .RJ48RJ,X 183A BD F1 RJ4 LDA .RJ4F1,X 1RJ3D 9D F8 84 STA .RJ4F8,X 1RJ48 BD El RJS LDA .RJSE1,X 1RJ43 9D E8 8S STA S85ERJ,X 1RJ46 BD Dl 86 LDA SRJ6D1,X 1RJ49 9D D8 86 STA SRJ6DRJ,X 1RJ4C E8 INX 1RJ4D C8 INY 184E CRJ 27 CPY ... 27 18SRJ DRJ E2 BNE SlRJ34 1RJS2 E8 INX 18S3 ARJ RJ8 LDY ... RJRJ 1RJSS CE 44 RJ3 DEC .RJ344 IRJS8 D8 DA BNE .lRJ34 IRJSA 68 RTS IRJSB RJ7 ???

50

Page 50: 40 Best Machine Code Routines for C64

7. Pixel scroll right

The following routine scrolls the screen to the right by one pixel.

To scroll the screen by one pixel to the right type SYS 4096.

PAL (C)1979 BRAD TEMPLETON 2 28: 1888 .OPT P,OO 38: 11188 *- S1888 48: 1888 AD 16 D8 LDA S3278 48: 1883 29 F8 AND .. 248 S8: 188S 18 CLC 58: 1886 6D C9 18 ADC BYTE 68: 1889 8D 16 D8 STA S3278 78: 188C EE C9 18 INC BYTE 88: 188F AD C9 18 LDA BYTE 98: 1812 C9 88 CMP .. 8 188: 1814 F8 81 BEGl RESET 118: 1816 68 RTS 128: 1817 A9 88 RESET LDA .. 8 128: 1819 8D C9 18 STA BYTE 138: 181C AD 16 D8 LDA S3278 148: 181F 29 F8 AND .. 248 158: 1821 8D 16 D8 STA S3278 168: 1824 28 28 18 JSR CHARSCROLL 178: 1827 68 RTS 188: U'28 A2 26 CHARSCROLLDX .. 38 198: 182A BD 88 84 LOOP LDA 1824,X 198: 182D 9D 81 84 STA 1825,X 288: 1838 BD 28 84 LDA 1824+48, X 288: 1833 9D 29 84 STA 182S+48,X 2U': 1836 BD S8 84 LDA 1824+88, X 218: 1839 9D Sl 84 STA 1825+88,X 228: 183C BD 78 84 LDA 1824+128,X

51

Page 51: 40 Best Machine Code Routines for C64

228: 183F 9D 79 84 STA 1825+128,X 238: 1842 BD A8 84 LDA 1824+168,X 238: 1845 9D A1 84 STA 1825+168,X 248: 1848 BD C8 84 LDA 1824+288,X 248: 184B 9D C9 84 STA 1825+288,X 258: 184E BD F8 84 LDA 1824+248,X 258: 1851 9D F1 84 STA 1825+248,X 268: 1854 BD 18 85 LDA 1824+288,X 268: 1857 9D 19 85 STA 1825+288,X 278: 185A BD 48 85 LDA 1824+328,X 278: 185D 9D 41 85 STA 1825+328,X 288: 1868 BD 68 85 LDA 1824+368,X 288: 1863 9D 69 85 STA 1825+368,X 298: 1866 BD 98 85 LDA 1824+488,X 298: 1869 9D 91 85 STA 1825+488,X 388: 186C BD B8 85 LDA 1824+448,X 388: 186F 9D B9 85 STA 1825+448,X 318: 1872 BD E8 85 LDA 1824+488,X 318: 1875 9D E1 85 STA 1825+488, X 328: 1878 BD 88 86 LDA 1824+528,X 328: 187B 9D 89 86 STA 1825+528,X 338: 187E BD 38 86 LDA 1824+568, X 338: 1881 9D 31 86 STA 1825+568,X 348: 1884 BD 58 86 LDA 1824+688,X 348: 1887 9D 59 86 STA 1825+688,X 358: 188A BD 88 86 LDA 1824+648,X 358: 188D 9D 81 86 STA 1825+648,X 368: 1898 BD A8 86 LDA 1824+688,X 368: 1893 9D A9 86 STA 1825+688,X 378: 1896 BD D8 86 LDA 1824+72", X 378: 1"99 9D D1 86 STA 1825+72",X 3811: 1119C BD F8 116 LDA 1"24+76", X 3811: 1"9F 9D F9 86 STA 1825+76",X 3911: l"A2 BD 28 flO LDA 11124+8"", X 3911: l"A5 9D 21 "7 STA 1"25+8"",X 41111: l11A8 BD 48 "7 LDA 1"24+84", X 4"": l"AB 9D 49 "7 STA 1"25+84",X 41": ll1AE BD 7" "7 LDA 1"24+88", X 41": I"Bl 9D 71 "7 STA 1"25+88",X 42": I11B4 BD 98 "7 LDA 1"24+92", X 42": I"B7 9D 99 "7 STA 1"25+92",X 43": II1BA BD C" "7 LDA 1"24+96", X

52

Page 52: 40 Best Machine Code Routines for C64

431': lSBO 90 Cl 1'7 STA 11'25+961', X 441': lSCS CA OEX 441': lSCl ES FF CPX 4t.FF 441': lSC3 FS 1'3 BEG! FIN 441': lSC:! 4C 2A 11' JMP LOOP 451': lSC8 61' FIN RTS 461': lSC9 1'1' BYTE • BYTES llSSS-lSCA

READY.

B* PC SR AC XR YR SP

• ; 97FE 72 1'1' 1'1' 1'1 F6

11'1'1' AD 16 OS LDA .01'16 11'1'3 29 F8 AND ... F8 11'1'5 18 CLC 11'1'6 60 C9 11' AOC .lSC9 lSS9 80 16 OS STA .OS16 lSSC EE C9 11' INC .lSC9 lSSF AD C9 11' LOA .lSC9 11'12 C9 1'8 CMP ".1'8 lS14 FS 1'1 BEQ .11'17 11'16 61' RTS lS17 A9 1'1' LOA ".1'1' lS19 80 C9 11' STA .lSC9 lSlC AD 16 OS LOA .01'16 lSlF 29 F8 AND ... F8 11'21 80 16 OS STA .01'16 11'24 21' 28 11' JSR .11'28 lS27 61' RTS 11'28 A2 26 LOX ... 26 lS2A BO 1'1' 1'4 LOA .1'41'1', X 11'20 90 1'1 1'4 STA .1'41'1, X lS3S BO 28 1'4 LOA .1'428, X

53

Page 53: 40 Best Machine Code Routines for C64

1033 9D 29 04 STA .0429, X 1036 BD 50 04 LDA .0450, X 1039 9D 31 04 STA .0451,X 103C BD 78 04 LDA .8478, X 103F 9D 79 04 STA .0479, X 1042 BD A0 04 LDA .04A0,X 1043 9D A1 84 STA .84A1, X 1048 BD C8 04 LDA .04C8,X 104B 9D C9 84 STA .04C9,X 104E BD F8 "4 LDA ."4F0,X 1"51 9D F1 "4 STA ."4F1,X 1054 BD 18 05 LDA .0518,X 1037 9D 19 "5 STA .8519,X 185A BD 40 85 LDA .8540, X 103D 9D 41 83 STA .0541,X 1060 BD 68 "5 LDA .0568, X 1063 9D 69 05 STA .8569, X 1066 BD 90 05 LDA .0590, X 1069 9D 91 05 STA ."591, X 106C BD B8 05 LDA .85B8,X 106F 9D B9 05 STA .05B9,X 1072 BD E0 05 LDA ."5E0,X 1"75 9D El "5 STA ."5El,X 1078 Bll 08 06 LDA ."608, X 1"7B 9D "9 "6 STA .06"9, X 1"7E BD 30 06 LDA ."630, X 1081 9D 31 "6 STA ."631, X 1"84 BD 58 "6 LDA .0658, X 1"87 9D 39 "6 STA ."639, X 1"8A BD 8" "6 LDA ."680, X 108D 9D 81 06 STA .0681,X 1"90 BD A8 06 LDA .06A8,X 1093 9D A9 "6 STA .86A9,X 1"96 BD D0 06 LDA .06D",X 1"99 9D Dl "6 STA .06D1,X 1"9C BD F8 "6 LDA .86F8,X 1"9F 9D F9 06 STA ."6F9,X 10A2 BD 20 07 LDA .0720, X Itz!A5 9D 21 07 STA .0721,X 10A8 BD 48 07 LDA .0748,X 10AB 9D 49 07 STA ."749, X

54

Page 54: 40 Best Machine Code Routines for C64

10AE BD 70 07 LDA .0770, X 10Bl 9D 71 07 STA .0771,X 10B4 BD 9S 07 LDA .079S,X 10B7 9D 99 07 STA .0799, X 10BA BD C0 07 LDA .07C0,X 10BD 9D Cl 07 STA S07Cl,X 10C0 CA DEX 10Cl E0 FF CPX ... FF 10C3 F0 03 BE6'I S10CS 10C5 4C 2A 10 JMP S102A 10CS 60 RTS 10C9 00 BRK

55

Page 55: 40 Best Machine Code Routines for C64

8. Pixel scroll up

The routine here scrolls the screen up one pixel every time that it is called.

To set up the screen for scrolling type SYS 16384.

To scroll the screen up one pixel type SYS 16398.

PAL (C) 1979 BRAD TEMPLETON 2 28: 4.8" .OPT P~OO 38: 4.8" *- .4888

;TO SETUP TYPE ;SYS16384 , TO USE TYPE SYS 16398

78: 48"8 AD 11 D" SETUP LDA 53265 ,USE BEFORE STARTING

88: 4883 29 F7 AND .. 247 98: 48"5 8D 11 D8 STA 53265 188: 4888 A9 "7 LDA .. 7 188: 488A 8D 3B 48 STA BYTE 11": 4"8D 68 RTS

I MAIN ROUTINE 138: 4"8E AD 11 D" LDA 53265 148= 4811 29 F8 AND "248 H58: 4"13 18 CLC 168: 4814 6D 3B 48 ADC BYTE 178: 4817 8D 11 D" STA 53265 188: 481A CE 3B 48 DEC BYTE 198= 4"lD AD 3B 4" LDA BYTE 280: 4"20 C9 FF CMP ... FF 210: 4022 F" 81 BEG RESET 220: 4824 68 RTS 238: 4825 A9 87 RESET LDA "7 238= 4827 8D 3B 48 STA BYTE 24"= 482A AD 11 D0 LDA 53265

56

Page 56: 40 Best Machine Code Routines for C64

24B: 4B2D 29 F8 AND #248 24B: 4B2F 18 CLC 24l1J: 4838 69 8' ADC .. , 248: 4832 8D 11 D8 STA 53265 258: 4835 A9 8D LDA .. 13 268: 483' 28 D2 FF JSR SFFD2 2'8: 483A 6B RTS 288: 483B 8' BYTE • BYTE' l4888-483C

READY.

B* PC SR AC XR YR SP

.19'FE '2 88 88 81 F6

4888 AD 11 D8 LDA .D811 4883 29 F' AND ... F' 4885 8D 11 D8 STA .D811 4888 A9 8' LDA ".8' 488A 8D 3B 48 STA .483B 488D 68 RTS 488E AD 11 D8 LDA .D811 4811 29 F8 AND ... F8 4813 18 CL.C 4814 6D 3B 48 ADC .4B3B 481' 8D 11 D8 STA .D811 481A CE 3B 48 DEC .483B 4B1D AD 3B 48 LDA .483B 4828 C9 FF CMP ... FF 4822 F8 81 BEQ .4B25 4B24 6B RTS 4825 A9 8' LDA ".8' 482' 8D 3B 48 STA .483B 482A AD 11 DB LDA .D811 482D 29 F8 AND ... F8

57

Page 57: 40 Best Machine Code Routines for C64

482F 18 CLC 4838 69 ", ADC ".8' 4832 8D 11 D8 STA .D811 483S A9 "D LDA ... 8D 483' 28 D2 FF JSR .FFD2 483A 68 RTS 483B 8' ???

58

Page 58: 40 Best Machine Code Routines for C64

9. Pixel scroll down

The following routine scrolls the screen down one pixel when it is called. However, due to the way the character scroll works (using the ROM print routine), the top line of the screen is not scrolled. If this routine were coupled with a raster interrupt to suppress the scroll at the top of the screen then this area would stay stationary while the rest would scroll independently.

To set up the screen for scrolling type SYS 16384.

To scroll the screen down one pixel type SYS 16398.

PAL (C)1979 BRAD TEMPLETON 2 28: 4888 .OPT P,OO 38: 4888 *- .4888 48: 4888 AD 11 D8 SETUP LDA 53265

USE SETUP BEFORE STARTING

68: 4883 29 F7 AND .. 247 78: 4885 8D 11 D8 STA 53265 88: 48"8 A9 88 LDA .. 8 88: 488A 8D 4B 48 STA BYTE 98: 488D 68 RTS

• MAIN ROUTINE 11": 488E AD 11 D8 LDA 53265 128: 4"11 29 F8 AND #248 138: 4813 18 CLC 148: 4"14 6D 4B 48 ADC BYTE 158: 4817 8D 11 D" STA 53265 168: 481A EE 4B 48 INC BYTE 17": 481D AD 4B 48 LDA BYTE 18": 4828 C9 88 CMP "."8 19": 4822 F8 81 BEQ RESET 2"": 4824 68 RTS 21": 4"23 A9 88 RESET LDA #8

59

Page 59: 40 Best Machine Code Routines for C64

218: 4827 8D 4B 48 STA BYTE 228: 482A AD 11 D8 LDA ~326~

228: 482D 29 Fe AND tt248 228: 482F 8D 11 D8 STA 53265 238: 4832 A9 13 LDA It" (HOME)" 248: 4834 28 D2 FF JSR 5FFD2 2~8: 4837 A9 11 LDA 1t"(CUR DNP 268: 4839 28 D2 FF JSR SFFD2 278: 483C A9 9D LDA tt· (CUR L}H 288: 483E 28 D2 FF JSR SFFD2 298: 4841 A9 94 LDA ttll(INST DEL) 388: 4843 28 D2 FF JSR 5FFD2 318: 4846 A9 88 LDA 1t128 328: 4848 8~ DA STA 218 338: 484A 68 RTS 348: 484B 88 BYTE • BYTE8 1 4888-484C

READY.

B* PC SR AC XR YR SP

• ,97FE 72 88 88 81 F6

4888 AD 11 D8 LDA SD811 4883 29 F7 AND ttSF7 488~ 8D 11 D8 STA SD811 4888 A9 88 LDA ItS88 488A 8D 4B 48 STA S484B 488D 68 RTS 488E AD 11 D8 LDA SD811 4811 29 F8 AND 1t5F8 4813 18 CLC 4814 6D 4B 48 ADC 5484B 4817 8D 11 D8 STA .D811 481A EE 4B 48 INC 5484B 481D AD 4B 48 LDA 5484B

60

Page 60: 40 Best Machine Code Routines for C64

4020 C9 08 CMP ... 08 4022 F0 81 BEQ .4825 4824 60 RTS 4825 A9 88 LDA ... 88 4027 8D 4B 48 STA S484B 482A AD 11 D8 LDA SD811 482D 29 Fe AND .. SF 8 482F 8D 11 D8 STA SD811 4832 A9 13 LDA ... 13 4834 28 D2 FF JSR SFFD2 4837 A9 11 LDA ... 11 4839 28 D2 FF JSR SFFD2 483C A9 9D LDA ... 9D 483E 28 D2 FF JSR SFFD2 4841 A9 94 LDA .. S94 4843 28 D2 FF JSR SFFD2 4846 A9 88 LDA ... 80 4848 85 DA STA SDA 484A 68 RTS 484B 88 BRK

61

Page 61: 40 Best Machine Code Routines for C64

10. Colour

This routine allows you to change the screen colour, the bord­er colour, the text colour, extended colours 1, 2 and 3 (or mul­ticolour) in one command.

The syntax is as follows:

SYS 28672,screen colour, border colour,text colour, multi1,multi2,multi3

NB. All parameters must be given.

PAL (C) 1979 BRAD TEMPLETON 2 2": 7""" .OPT P,OO 3": 7""" *- S7""S ,

,ROUTINE TO SET SCREEN ,COLOURS AND BORDER AND 'TEXT,MULTI1,MULTI2

8": 7""" 2" FD AE JSR SAEFD 9": 7""3 2" 37 7" JSR PARAM lS": 7""6 8D 21 D" STA ~3281

11": 7""9 2S FD AE JSR SAEFD 12": 7""C 2" 37 7" JSR PARAM 13S: 7""F 8D 2" D" STA 5328"

15": 7"12 2" FD AE JSR SAEFD 16": 7"15 2" 37 7" JSR PARAM 18": 7"18 8D 86 "2 STA 646 198: 781B 28 FD AE JSR SAEFD 288: 781E 28 37 7" JSR PARAM 228: 7"21 eD 22 D" STA ~3282

238: 7824 28 FD AE JSR SAEFD

62

Page 62: 40 Best Machine Code Routines for C64

248: 7827 28 37 78 JSR PARAM 268: 782A 8D 23 D8 STA ~3283

278: 782D 28 FD AE JSR .AEFD 288: 7838 28 37 78 JSR PARAM 388: 7833 8D 24 D8 STA ~3284

318: 7836 68 RTS 328: 7837 28 9E B7 PARAM JSR .B79E 328: 783A 8A TXA 338: 783B 68 RTS 348: 783C 4C 48 B2 161ERR JMP .B248 J7888-783F

READY.

B* PC SR AC XR YR SP

.197FE 72 88 88 81 F6

7888 28 FD AE JSR .AEFD 7883 28 37 78 JSR .7837 7886 8D 21 D8 STA .D821 7889 28 FD AE JSR .AEFD 788C 28 37 78 JSR .7837 788F 8D 28 D8 STA .D828 7812 28 FD AE JSR .AEFD 781~ 28 37 78 JSR .7837 7818 8D 86 flI2 STA .8286 781B 28 FD AE JSR .AEFD 781E 2fl1 37 7fl1 JSR .7837 7821 8D 22 D8 STA .DflI22 7824 28 FD AE JSR .AEFD 7827 28 37 78 JSR .7fl137 7fl12A aD 23 DflI STA .DflI23 782D 28 FD AE JSR .AEFD 7838 2fl1 37 78 JSR .7837 7833 8D 24 D8 STA .D824 7fl136 6fl1 RTS 7fl137 28 9E B7 JSR .B79E 7fl13A 8A TXA 783B 68 RTS 783C 4C 48 B2 JMP .B248

63

Page 63: 40 Best Machine Code Routines for C64

11. Copy

This routine allows you to copy the contents of part of or all of the character ROM to a specified part of RAM. This is to make user defined characters easier to set up.

The syntax is SYS 24576,address,no. of pages to copy.

The address is where you want to start your character set at. The number of pages to copy is the number of 256 byte blocks of the ROM to copy down. Only whole numbers are allowed. The character ROM is 16 blocks long. If you specify more than 16 then an illegal quantity error will occur.

e.g. To copy the whole character ROM down to location 8192 type the following:

SYS 24576,8192,16

or, to copy only the first K of the ROM down to location 12288 type:

SYS 24576,12288,4

To enable the character set use location 53272 or the change banks routine in this book.

To enable the character set at location 8192 type:

POKE 53272,24

64

Page 64: 40 Best Machine Code Routines for C64

PAL ec) 1979 BRAD TEMPLETON 2 2B: 6fi1BB .OPT P,OO 3B: 6BBB *= S6BBB ,

,ROUTINE TO MOVE ,CHARACTER ,ROM TO SPECIFIED , LOCATION ,SYNTAX ; ,SYS24S76,START,NO OF ,PAGES TO COPY ,WHERE PAGES ARE 2S6 ,BYTES LONG

lSB: 68BB 2B FD AE JSR SAEFD 16B: 68B3 2B 8A AD JSR SAD8A 17": 68B6 2B F7 B7 JSR SB7F7 18": 68B9 AS 14 LDA S14 19": 68BB 8S FB STA SFB 211": 68BD AS 1S LDA S1S 21": 6811F 8S FC STA SFC

23": 6811 2" FD AE JSR SAEFD 24": 6814 2" 9E B7 JSR SB79E 2S": 6817 8A TXA 26": 6818 C9 11 CMP .. 17 27": 681A 9" B3 Bec MORE 28": 6fi11C 4C 48 B2 JMP SB248 29": 681F 8S FD MORE STA SFD 311": 6821 A9 BB LDA .. " 31": 6823 8D SB 6" STA TEMP 32": 6826 A" BB LDY .. " 33": 6828 A9 "" LDA .. " 34": 682A 8S FE STA SFE 3S": 682C A9 DB LDA .. 2B8 36": 682E 8S FF STA SFF

375: 683B A9 BB LDA .. " 376: 6832 8D BE DC STA S6334 38": 6fi13S A9 33 LDA .. 51

65

Page 65: 40 Best Machine Code Routines for C64

390: 6037 85 01 STA 1 400: 6039 B1 FE LOOP LDA (SFE),Y 410: 603B 91 FB STA (SFB),Y 420: 603D C8 INY 430: 603E D0 F9 BNE LOOP

450: 6040 EE 5B 61lJ INC TEMP 460: 6043 AD 5B 611J LDA TEMP 470: 6046 C3 FD CMP $FD 480: 611J48 B0 07 BCS FINISH

311J0: 611J4A E6 FC INC $FC 510: 611J4C E6 FF INC SFF 5211J: 61lJ4E 4C 39 611J JMP LOOP

; 5411J: 611J5l A9 37 FINISH LDA tt55 550: 611J53 85 01 STA 1 560: cllJ55 A9 IIJl LDA ttl 570: 61lJ57 8D 0E DC STA 56334 580: 611J5A 61lJ RTS 590: 611J5B TEMP = * l611J00-611J5B

READY.

B* PC SR AC XR YR SP

• ; 97FE 72 1lJ0 1lJ0 IIJl F6

61lJIIJIIJ 21lJ FD AE JSR SAEFD 61lJIIJ3 211J 8A AD JSR SAD8A 611J1IJ6 211J F7 B7 JSR SB7F7 61lJ1lJ9 A5 14 LDA S14 61lJIlJB 85 FB STA SFB 601lJD A5 15 LDA S15 61lJIIJF 85 FC STA SFC

66

Page 66: 40 Best Machine Code Routines for C64

6011 20 FD AE JSR SAEFD 6014 20 9E B7 JSR SB79E 6017 8A TXA 6018 C9 11 CMP .. Sl1 601A 90 03 BCC S601F 601C 4C 48 B2 JMP SB248 601F 85 FD STA SFD 6021 A9 00 LDA .. S00 6023 8D 58 60 STA S605B 6026 A0 00 LDY .. S00 6028 A9 fIJfIJ LDA .. SfIJfIJ 602A 85 FE STA SFE 6f1J2C A9 DfIJ LDA .. SD0 6f1J2E 85 FF STA SFF 6f1J3fIJ A9 fIJfIJ LDA .. SfIJfIJ 6f1J32 8D flJE DC STA SDCflJE 6f1J35 A9 33 LDA .. S33 6f1J37 85 01 STA SflJl 6f1J39 B1 FE LDA (SFE),Y 6f1J3B 91 FB STA (SFB),Y 6f1J3D C8 INY 6f1J3E DfIJ F9 BNE S6039 6f1J4fIJ EE 58 6fIJ INC S6f1J5B 6f1J43 AD 5B 6fIJ LDA S605B 6f1J46 C5 FD CMP SFD 6048 BfIJ 07 BCS S6051 6f1J4A E6 FC INC SFC 604C E6 FF INC SFF 604E 4C 39 60 JMP S6039 6051 A9 37 LDA .. S37 6f1J53 85 flJ1 STA S01 6055 A9 flJ1 LDA .. S01 6057 8D flJE DC STA SDCflJE 6f1J5A 60 RTS

67

Page 67: 40 Best Machine Code Routines for C64

12. Sprite/char

If you are using sprites in a program the time will come when you want to find what character the sprite is under or over. You can see which one, but the computer cannot. Commodore kindly made it possible for the video chip to detect if it has hit a character or not, but not to detect which one. The following program does this. It is written to detect the charcter under sprite O. To find out which character it is, use SYS 16384 from Basic or JSR $4000 from machine code. The character code is returned in location 828 ($033C), so to find the character execute the routine and PEEK or LOA(X or Y) location 828 ($033C)

No doubt you will want to check which character is under a different sprite than sprite O. Rather than listing 8 programs, one for each sprite, here is a list of what to change to make it work for any sprite:

1. Change the first line from LOA $0000 to LOA $ hex location of 'X' coordinate of the sprite that you want to test.

2. Change the line at address $400A to CMP # $ bit value of sprite to be tested (sprite 0 = 1 through to sprite 7 = 128).

3. Change the line at address $400E to LOX $ hex location of 'X' coordinate of the sprite to be tested.

4. Change the line at address $4011 to LOA $ hex location of 'Y' coordinate of sprite to be tested.

5. Change the line at address $4032 to CMP # $ bit value of sprite to be tested (as in 2).

The routine checks which character is under the top left 8 bytes of the sprite (going down). i.e.

68

Page 68: 40 Best Machine Code Routines for C64

123 123 123 123 123 123 123 123 and so on ...

It checks the character under the 1 s in the above diagram, but this can be altered by changing two bytes in the program as follows:

The line at location $4004 is SBe #$18. The number after the SBe must never be less than $18 (24), but if you add one to this value for every bit across the sprite then you can alter where on the horizontal the routine will check. (This number must never exceed $30 (48) if the sprite is not expanded in the 'X' direction or $60 (96) if expanded.) Remember that as the sprite is expanded each dot on the sprite is 2 dots wide, therefore you will need to multiply the amount greater than $18 by two and add it to $18.

e.g. to get the routine to check for the rightmost 8 bits of an unexpanded sprite, make the line SBe # $30.

Or, to get the routine to check for the 7th to the 15th bit across in an expanded sprite, make the line SBe # (24 + 7*2) which is SBe #$26.

To alter where the routine checks on the vertical change the line at address $4015 (SBe #$3A). The rules for changing are the same as for the 'X' direction. If the sprite is unexpanded in the 'V' direction then the value is $3A + the byte down. If the sprite is expanded then the value is $3A + 2* the byte down. The value must never be less than $3A and if the sprite is unex­panded no greater than $4F (79) or if the sprite is expanded no greater than $64 (100) for the routine.

e.g. to make the routine check for the bottom 8 bytes of the sprite when it is unexpanded the line is SBe #$47.

69

Page 69: 40 Best Machine Code Routines for C64

or, to make the routine check for the 10th to the 18th byte down in an expanded sprite the line is SBe #$3A + 2*10 which is SBe #$4E

PAL (C) 1979 BRAD TEMPLETON 2 2": 4""" .OPT P,OO 3": 4""" *= $4""" 4": 49"" AD "" D" LDA 53248 5": 4""3 38 SEC 5": 49"4 E9 18 SBC .. 24 5": 4""6 AA TAX 6": 4"97 AD 1" D" LDA 53264 6": 4""A C9 "1 CMP .. 1 6": 499C D9 93 BNE MORE 7": 4S9E AE "" D9 LDX 53248 8": 4"11 AD 91 D9 MORE LDA 53249 8": 4914 38 SEC 8": 4915 E9 3A SBC .. 58 89: 4917 A8 TAY 9": 4918 8E 98 4" STX X1STORE ;Xl 1"": 491B 8C 9A 49 STY Y1STORE ; Y 1 11": 491E 98 TYA 129: 491F 4A LSR A 12": 4929 4A LSR A 12": 4921 4A LSR A ;Y2=Yl/8 13": 4"22 18 CLC 13": 4923 69 "1 ADC .. 1 13": 4925 8D 9B 49 STA Y2STORE 14": 4928 8A TXA 15": 4929 4A LSR A 15": 492A 4A LSR A 159: 492B 4A LSR A ; X2=X2/8

16": 492C 8D 99 49 STA X2STORE 179: 492F AD 1'3 D9 LDA 53264 179: 4932 C9 "1 CMP .. 1 17": 4934 D" 99 BNE MOREl 18": 4936 AD 99 49 LDA X2STORE 19": 4939 18 CLC

70

Page 70: 40 Best Machine Code Routines for C64

1ge: 4e3A 69 lD ADC tt29 2ee: 4e3C 8D 99 4e STA X2STORE 21e: 4e3F AD 9B 4e MOREl LDA Y2STORE 22e: 4e42 8D 96 4e STA NUMBERl 23e: 4e45 A9 28 LDA tt4e 24e: 4e47 8D 97 4e STA NUMBER2 25e: 4e4A 2e 79 4e JSR MULTIPLY 26e: 4e4D AD 99 4e LDA X2STORE 27e: 4e5e 6D 94 4e ADC RESULT 28e: 4e53 8D 94 4e STA RESULT 2ge: 4e56 AD 95 4e LDA RESULT+l 3ee: 4e59 69 ee ADC tte 31e: 4e5B 8D 95 4e STA RESULT+l 32e: 4e5E AD 95 4e LDA RESULT+l 33e: 4e61 18 CLC 340: 4062 69 04 ADC tt4 35e: 4064 8D 95 40 STA RESULT+l

; CHARACTER IN LOCATION ; IN LOCS RESULT AND RESULT+l

380: 4e67 AD 94 40 LDA RESULT 380: 406A 85 FB STA SFB 3ge: 406C AD 95 4e LDA RESULT+l 3ge: 406F 85 FC STA SFC 40e: 4071 Ae e0 LDY tte 41e: 4073 Bl FB LDA (SFB),Y 420: 4075 eD 3C e3 STA 828 430: 4078 60 RTS 440: 4079 A9 00 MULTIPLY LDA tt0 450: 407B 8D 94 40 STA RESULT 46e: 407E A2 08 LDX tt8 470: 4080 4E 96 40 LOOP LSR NUMBERl 480: 4083 ge e4 BCC NO ADD 4ge: 4085 18 CLC 50e: 4086 6D 97 4e ADC NUMBER2 51e: 4089 6A NO ADD ROR A 520: 408A 6E 94 4e ROR RESULT 530: 408D CA DEX 540: 4e8E De Fe BNE LOOP 550: 4090 8D 95 40 STA RESULT+l 56e: 4e93 6e RTS

71

Page 71: 40 Best Machine Code Routines for C64

58": 4"94 "" "" RESULT • WORD" 59": 4"96 "" NUMBER1 • BYTE" 6"": 4"97 "" NUMBER2 • BYTE" 61": 4"98 "" X1STORE • BYTE" 62": 4"99 "" X2STORE • BYTE" 63": 4"9A "" Y1STORE • BYTE" 64": 4"9B "" Y2STORE • BYTE" 14"""-4"9C

READY.

B* PC SR AC XR YR SP

• I 97FE 72 00 00 01 F6

4000 AD 00 D0 LDA .D000 4003 38 SEC 4004 E9 18 SBC ... 18 4006 AA TAX 4007 AD 10 D0 LDA .D010 400A C9 01 CMP ... 01 400C D0 03 BNE .4011 400E AE 00 D0 LDX .D000 4011 AD 01 D0 LDA .D001 4014 38 SEC 401~ E9 3A SBC ... 3A 4017 A8 TAY 4018 8E 98 40 STX .4098 4018 8C 9A 40 STY .409A 401E 98 TYA 401F 4A LSR 4020 4A LSR 4021 4A LSR 4022 18 CLC 4023 69 01 ADC ... 01 4025 8D 98 40 STA .4098

72

Page 72: 40 Best Machine Code Routines for C64

492S SA TXA 4929 4A LSR 492A 4A LSR 492B 4A LSR 492C SD 99 49 STA $4999 492F AD 19 D9 LDA $D919 4932 C9 01 CMP .. 591 4934 D9 09 BNE $493F 4936 AD 99 49 LDA $4999 4939 lS CLC 493A 69 lD ADC .. 51D 493C SD 99 49 STA $4999 493F AD 9B 49 LDA $499B 4942 SD 96 49 STA $4996 4945 A9 2S LDA ... 2S 4947 SD 97 49 STA $4997 494A 29 79 49 JSR 54979 494D AD 99 49 LDA $4999 4959 6D 94 49 ADC $4994 4953 SD 94 49 STA 54994 4956 AD 95 49 LDA 54995 4959 69 99 ADC .. 599 495B SD 95 49 STA 54995 495E AD 95 49 LDA 54995 4"61 lS CLC 4"62 69 04 ADC "5"4 4964 8D 95 4" STA $4"95 4"67 AD 94 4" LDA 54994 4"6A 85 FB STA .FB 4"6C AD 95 4" LDA 54995 4"6F 85 FC STA .FC 4971 A" 09 LDY "5"9 4"73 Bl FB LDA C5FB),Y 4975 SD 3C 93 STA .933C 4"78 69 RTS 4979 A9 09 LDA .. 599 4"7B 8D 94 49 STA $4994 497E A2 0S LDX "59S 4"S" 4E 96 4" LSR $4996 49S3 99 04 !.lCC $49S9 4"85 18 CLC

73

Page 73: 40 Best Machine Code Routines for C64

4086 6D 97 40 ADC $4097 4089 6A ROR 408A 6E 94 40 ROR $4094 408D CA DEX 408E D0 F8 BNE $4888 4098 8D 93 48 STA $4095 4893 68 RTS 4094 88 BRK 4895 88 BRK 4096 88 BRK 4897 00 BRK 4898 88 BRK 4899 00 BRK 489A 08 BRK 489B 88 BRK

74

Page 74: 40 Best Machine Code Routines for C64

13. Doke

The following routine allows you to POKE a 16 bit number into two consecutive locations. This could be to change a RAM vec­tor. It replaces the following line of Basic code:

a = number: hi = intI a/256): 10 = (a-number)*256: poke address, lo:pokeaddress + 1,hi

To use the routine type SYS 960,address,number.

e.g. to change the output character routine to point to your own routine at 828 (as in the list alter routine later) type SYS 960,806,828.

PAL (C)1979 BRAD TEMPLETON 2 28: 03C8 .OPT P,OO 38: 03C8 *= 968

DOKE ROUTINE

SYNTAX SYS 968, ADDRESS, VALUE

EG SYS16384,788,16384

118: 03C0 28 FD AE JSR .AEFD 120: 03C3 28 8A AD JSR .AD8A 130: 03C6 20 F7 B7 JSR .B7F7

1~8: 03C9 A5 14 LDA .14 160: 03CB 85 FB STA .FB 170: 03CD A5 15 LDA .15 180: 03CF 85 Fe STA .FC

75

Page 75: 40 Best Machine Code Routines for C64

·-

20S: S3Dl 2S FD AE JSR SAEFD 21S: 03D4 2S 8A AD JSR SAD8A 22S: S3D7 2S F7 B7 JSR SB7F7

24S: 03DA AS SS LDY IS 25S: S3DC AS 14 LDA S14 26S: S3DE 91 FB STA (SFB),Y 27S: S3ES AS Sl LDY 11 28S: 03E2 AS 15 LDA S15 29S: S3E4 91 FB STA (SFB),Y

31S: 03E6 6S RTS l03CS-03E7

READY.

B* PC SR AC XR YR SP

• ; 97FE 72 S0 00 Sl F6

S3C0 2S FD AE JSR .AEFD 03C3 20 8A AD JSR .AD8A 03C6 20 F7 B7 JSR $B7F7 S3C9 A5 14 LDA .14 03CB 85 FB STA .FB 03CD A:I lS LDA .1:1 03CF 85 FC STA .FC 03Dl 20 FD AE JSR $AEFD S3D4 20 8A AD JSR $AD8A 03D7 2S F7 B7 JSR .B7F7 S3DA AS SS LDY I$SS 03DC AS 14 LDA $14 S3DE 91 FB STA ($FB) ,Y 03ES AS Sl LDY ... Sl 03E2 AS 1:1 LDA $15 03E4 91 FB STA (.FB) ,Y S3E6 6S RTS

76

Page 76: 40 Best Machine Code Routines for C64

14. Deek

This routine is complementary to Doke. It allows you to read the contents of two consecutive locations in memory. It replaces the following line of Basic code:

PRINT PEEK(ADDRESS) + 256*PEEK(ADDRESS + 1)

The routine cannot create a variable (e.g. a = Deek (address) is not possible).

The syntax for the routine is as follows:

SYS 828,address

PAL (C)1979 BRAD TEMPLETON 2 28: 38:

B33C B33C

.OPT P,OO *= 929

SIMULATED DEEK FUNCTION

ONLY USED TO PRINT THE VALUE IN TWO CONSECUTIVE

LOCATIONS IN 16 BIT FORMAT SYNTAX

SYS929,ADDRESS

EG. SYS92S,79S

WILL RETURN 59953

77

Page 77: 40 Best Machine Code Routines for C64

2H': .033C 2.0 FD AE JSR SAEFD 22.0: .033F 2.0 8A AD JSR SAD8A 23.0: .0342 2.0 F7 B7 JSR SB7F7

25.0: .0345 A5 14 LDA S14 26.0: .0347 85 FB STA SFB 27.0: .0349 A5 15 LDA S15 28.0: ,034B 85 FC STA SFC

3.0.0: ,034D A.0 .0.0 LDY .. .0 31.0: ,034F B1 FB LDA (SFB) ,Y 32.0: .0351 C8 INY 33.0: .0352 AA TAX 34.0: .0353 B1 FB LDA (SFB) ,Y

36.0: 0355 4C CD BD JMP $BDCD

l033C-,0358

READY.

B* PC SR AC XR YR SP

• ; 97FE 72 0.0 00 01 F6

033C 20 FD AE JSR $AEFD 033F 20 8A AD JSR .AD8A 0342 20 F7 B7 JSR .B7F7 0345 A5 14 LDA $14 0347 85 FB STA $FB 0349 A5 15 LDA $15 034B 85 FC STA $FC 034D A0 .00 LDY "$00 034F B1 FB LDA (SFB),Y .0351 C8 INY 0352 AA TAX 0353 B1 FB LDA ($FB) ,Y 0355 4C CD BD JMP SBDCD

78

Page 78: 40 Best Machine Code Routines for C64

15. 3 channel IRQ tune

The following routine will playa tune independently of the other things that the computer is doing.

The routine is enabled by SYS 24576 and can be stopped with run/stop and restore.

The data for the tune is held in the tunetable in the PAL listing and from location $6074 onwards in the disassembly.

PAL (C) 1979 BRAD TEMPLETON 2 20: 6000 .OPT P,OO 30: 6000 *= $6000

40: 6000 78 SEl 40: 6001 A9 32 LDA '"<MAl N 40: 6003 8D 14 03 STA 788 40: 6006 A9 60 LDA ,">MAl N 40: 6008 8D 15 03 STA 789 40: 600B A9 0F LDA '"15 40: 600D 8D 18 D4 STA 54296

50: 6010 A9 13 LDA '"19 50: 6012 8D 04 D4 STA 54276

50: 6015 A9 40 LDA '"64 50: 6017 8D 05 D4 STA 54277

50: 601A 8D 06 D4 STA 54278

50: 601D 8D 0C D4 STA 54284

79

Page 79: 40 Best Machine Code Routines for C64

5a: 61l121l1 8D IlID D4 STA 54285

52: 611123 A9 21 LDA n33 52: 611125 8D IlIB D4 STA 54283

55: 611128 A9 IlIIl1 LDA nlll 55: 61l12A 85 FB STA 251 55: 61l12C 85 FC STA 252 55: 61l12E 85 FD STA 253 55: 61l131l1 58 CLI 55: 611131 6111 RTS

7t;J: 611132 A6 FB MAIN LDX 251 71l1: 611134 A4 FC LDY 252 70: 611136 Sill: 611136 BD 74 6111 LDA TUNE, X 91l1: 611139 8D IlIIl1 D4 STA 54272

95: 61l13C BD A6 6 III LDA TUNE1 -2,X 95: 61l13F 8D 1117 D4 STA 54279

95: 611142 BD A7 6 III LDA TUNE1 -l,X 95: 611145 8D illS D4 STA 5428111

1t;J1l1: 611148 BD 75 6 III LDA TUNE+ 1,X 11 III : 61l14B 8D 01 D4 STA 54273

120: 61l14E A5 FD LDA 253 131l1: 61l151l1 C9 iliA CMP n11l1 141l1: 611152 Bill 1lI5 BCS NEXDE LAY 151l1: 611154 E6 FD INC 253 151l1: 611156 4C 31 EA JMP SEA31

161l1: 611159 A9 1110 NEXDELAY LDA nlll 161l1: 61l15B 85 FD STA 253 161l1: 61l15D E8 INX

80

Page 80: 40 Best Machine Code Routines for C64

16flJ: 6flJ5E E8 INX 16flJ: 6flJ5F C8 INY 16flJ: 6flJ6flJ 86 FB STX 251 16flJ: 6flJ62 84 FC STY 252 16flJ: 6flJ64 EflJ 3flJ CPX tt48 16flJ: 6flJ66 BflJ flJ3 BCS RE 16flJ: 6flJ68 4C 31 EA .JMP SEA31

165: 6flJ6B A2 flJflJ RE LDX ttflJ 165: 6flJ6D 85 FB STA 251 165: 6flJ6F 85 FC STA 252 165: 6flJ71 4C 31 EA .JMP SEA31

IflJflJflJ: 6flJ74 C6 2D flJflJ TUNE .BYT 198,4 5,flJ,flJ, 198,45,52,43, 126, 38, flJ,flJ, 126,38 IflJlflJ: 6flJ82 4B 22 7E .BYT 75,34 ,126,38,75,34,141,3flJ,214,28,flJ,flJ IflJ15: 6flJ8E D6 lC 8D .BYT 214,2 8,141,3flJ,75,34,227,22 IflJ2flJ: 6flJ96 Bl 19 8D .BYT 177,2 5,141,38,214,28,177,25,227,22 IflJ3flJ: 6flJAflJ flJflJ flJflJ flJflJ .BYT flJ,flJ,flJ ,flJ,flJ,flJ,8,flJ IflJ5flJ: 6flJA8 72 flJB flJflJ TUNEI .BYT 114,1 l,flJ,flJ, 114,11,2flJ5,lflJ, 159,9,B,flJ,159,9 IflJ6flJ: 6flJB6 93 flJ8 9F ,159,9,147,8,163,7,53,7,flJ,B IflJ7flJ: 6flJC2 35 flJ7 A3 163,7,147,8,185,5 IflJ8flJ: 6flJCA 6C flJ6 A3 ,163,7,53,7,lflJ8,6,185,5 IflJ9flJ: 6flJD4 flJflJ flJflJ flJflJ ,flJ,flJ,flJ,8,flJ 16flJflJflJ-68DC

READY.

.BYT 147,8

.BYT 53,7,

.BYT IflJ8,6

.BYT flJ,flJ,flJ

81

Page 81: 40 Best Machine Code Routines for C64

B* PC SR AC XR YR SP

.197FE 72 flIflI flIflI flIl F6

6fl1fl1fl1 78 SEI 6fl1fl11 A9 32 LDA ... 32 6fl1113 8D 14 113 STA $11314 6fl1116 A9 611 LDA ... 6fl1 6fl1118 8D 1~ 113 STA .1I31~ 61111B A9 flIF LDA ... IIF 61111D 8D 18 D4 STA SD418 611111 A9 13 LDA ... 13 61112 8D 84 D4 STA $D4114 6111~ A9 411 LDA ... 411 61117 8D 85 D4 STA .D411~ 6111A 8D 86 D4 STA SD4116 6111D 8D 8C D4 STA SD411C 61128 8D 8D D4 STA SD411D 61123 A9 21 LDA ... 21 61125 8D 8B D4 STA SD411B 61128 A9 811 LDA .. SIIII 6112A 85 FB STA SFB 6112C 8~ FC STA SFC 6112E 8~ FD STA SFD 61138 ~8 eLI 61131 68 RTS 61132 A6 FB LDX .FB 61134 A4 FC LDY .FC 61136 BD 74 611 LDA .61174, X 61139 8D 811 D4 STA .D4811 6113C BD A6 611 LDA S6I1A6,X 6113F 8D 87 D4 STA SD487 61142 BD A7 611 LDA S6I1A7,X 6114~ aD 88 D4 STA SD488 61148 BD 7~ 611 LDA S6117~,X 6114B 8D 81 D4 STA SD481 684E A~ FD LDA .FD 611~8 C9 8A CMP ... 8A 6852 BII 85 BCS S61159 61154 E6 FD INC SFD 61156 4C 31 EA JMP SEA31

82

Page 82: 40 Best Machine Code Routines for C64

6.059 A9 e.0 LDA .. S.0.0 6.05B 85 FD STA SFD 6.05D E8 INX 6.05E E8 INX 6.05F C8 INY 6.06.0 86 FB STX SFB 6.062 84 FC STY SFC 6.064 E.0 3.0 CPX .. S3.0 61666 Bm e3 BCS S6.06B 6.068 4C 31 EA JMP .EA31 6m6B A2 em LDX ... .016 6m6D 85 FB STA SFB 6m6F 85 FC STA .FC 61671 4C 31 EA JMP SEA31 61674 C6 2D DEC .2D 61676 .0.0 BRI< 61677 16m BRI< 6.078 C6 2D DEC S2D

• : 6.074 C6 2D .016 16m C6 2D 34 2B • : 6m7C 7E 26 16.0 .0.0 7E 26 4B 22 • : 6.084 7E 26 4B 22 8D 1E D6 1C • : 6m8C 16m em D6 1C 8D 1E 4B 22 • : 61694 E3 16 B1 19 8D 1E D6 1C • : 6m9C B1 19 E3 16 168 16m 16m 16m • : 6mA4 16m 8.0 mB 16m 72 mB .016 16m • : 68AC 72 8B CD mA 9F 169 16m 16m • : 6mB4 9F 89 93 168 9F B9 93 168 • : 6mBC A3 87 35 167 168 16m 35 167 • : 6mC4 A3 87 93 168 B9 165 6C 166 • : 6mcc A3 e7 35 .07 6C 166 B9 165 • : 6mD4 8.0 8m Bm 16m 168 16m Bm 16m

83

Page 83: 40 Best Machine Code Routines for C64

16. List alter

The following routine lets you list a program in a specified column width. I have used it to list the Supermon loader in a width suita­ble for a book page.

To use this routine type SYS 828,number of columns.

PAL (C) 1979 BRAD TEMPLETON 2 29: 933C .OPT P,OO 39: 933C *= S933C 49: 933C IBSOUT = S9326 59: 933C 29 FD AE JSR SAEFD 69: 933F 29 9E B7 JSR SB79E 79: 9342 8E 77 93 STX COLUMN 89: 9345 AD 26 93 LDA IBSOUT 99: 9348 8D 78 93 STA OLDOUT 199: 934B AD 27 93 LDA IBSOUT+l 119: 934E 8D 79 93 STA OLDOUT+l 129: 9351 A9 5C LDA tt<MAIN 139: 9353 8D 26 93 STA IBSOUT 149: 9356 A9 93 LDA tt>MAIN 159: 9358 8D 27 93 STA IBSOUT+l 169: 935B 69 RTS

189: 935C C9 90 MAIN CMP tt13 199: 935E F9 98 BEG! DOCR 299: 9369 CE 7A 93 DEC COUNT 219: 9363 D9 9B BNE NAODCR 229: 9365 29 74 93 JSR NEWPRT 239: 9368 AD 77 93 DOCR LOA COLUMN 249: 936B 80 7A 93 STA COUNT 259: 936E A9 90 LDA tt13 269: 9379 29 74 93 NAOOCR JSR NEWPRT

84

Page 84: 40 Best Machine Code Routines for C64

270: 0373 60 RTS 280: 0374 6C 78 03 NEWPRT JMP (OLDOUT) 290: 0377 50 COLUMN .BYT 80 300: 0378 OLDOUT = *' 310: 0378 COUNT = OLDOUT+2 l033C-0378

READY.

B*, PC SR AC XR YR SP

• ; 97FE 72 00 01lJ 01 F6

1lJ33C 21lJ FD AE JSR SAEFD 033F 20 9E B7 JSR SB79E 0342 8E 77 03 STX SIlJ377 0345 AD 26 1lJ3 LDA SIlJ326 0348 8D 78 1lJ3 STA SIlJ378 034B AD 27 1lJ3 LDA SIlJ327 034E 8D 79 1lJ3 STA SIlJ379 0351 A9 5C LDA "SSC 0353 8D 26 1lJ3 STA S0326 0356 A9 03 LDA ... 1lJ3 0358 8D 27 1lJ3 STA SIlJ327 1lJ35B 61lJ RTS 035C C9 IlJD CMP ... 0D 035E F0 1lJ8 BEG! SIlJ368 1lJ361lJ CE 7A 1lJ3 DEC SIlJ37A 0363 DIlJ IlJB BNE SIlJ370 0365 21lJ 74 1lJ3 JSR SIlJ374 1lJ368 AD 77 1lJ3 LDA SIlJ377 036B 8D 7A 1lJ3 STA SIlJ37A 036E A9 IlJD LDA .. SIlJD 0371lJ 21lJ 74 1lJ3 JSR SIlJ374 0373 61lJ RTS 0374 6C 78 1lJ3 JMP (S0378) 0377 51lJ 0e BVC SIlJ379

85

Page 85: 40 Best Machine Code Routines for C64

17. Old

This routine allows a program accidentally newed to be reco­vered. It also works after a SYS 64738 or SYS 58260 (cold or warm start). If the old routine is not in memory when you need it, do not worry: it can be loaded in after the new and executed and the program will still be recovered.

To use type SYS 300.

To load into memory after a new type LOAD"OLD",8,1 (or LOAD"OLD",1,1) and then SYS 300.

PAL (C) 1979 BRAD TEMPLETON 2 2": 812C • OPT P,OO 3": 812C *= 3""

;OLD ROUTINE 5": flJ12C A9 FF LDA tt$FF 6": 812E A" "1 LDY ttl 7": 813" 91 2B STA ($2B),8Y 8": 8132 2" 33 A5 JSR .A533 9": 111135 A5 22 LDA $22 11ll": 111137 18 CLC 11": 111138 69 "2 ADC tt2 11": 1ll13A 85 2D STA $2D 121ll: 1ll13C A5 23 LDA $23 13": 1ll13E 69 illS ADC tt" 14": "14" 85 2E STA S2E 15": 8142 4C 5E A6 JMP SA65E l"12C-"145

READY.

86

Page 86: 40 Best Machine Code Routines for C64

PC SR AC XR YR SP .;97FE 72 00 00 01 F6

B* PC SR AC XR YR SP

• ; 97FE 72 00 00 01 F6

012C A9 FF LDA 012E A0 01 LDY 0130 91 2B STA 0132 20 33 A3 JSR 0133 A3 22 LDA 0137 18 CLC 0138 69 02 ADC 013A 85 2D STA 013C A5 23 LDA .913E 69 .9'" ADC .914.9 85 2E STA 0142 4C 5E A6 JMP

#SFF #.01 ('2B) ,Y .A333 $22

#.02 $2D $23 # • .90 $2E $A65E

87

Page 87: 40 Best Machine Code Routines for C64

18. Graph

This routine is the graph (or high res) command. It turns on the high res screen which is located at 24576 and the colour memory at 16384. It does not clear the screen.

To use type SYS 49152.

PAL e C) 19"9 BRAD TEMPLETON 2 28: C888 .OPT P,OO 38: C888 *- .C888

; GRAPH FUNCTION 26

• "8: C888 A9 16 LDA tt$16 98: C882 aD 88 DD STA ~6~"6

; CHANGE BLOCK

• 118: C88~ A9 8a LDA tta 128: C88" aD 18 D8 STA ~3272

148: C88A AD 11 D" LDA ~326~

148: C""D "9 28 ORA tt32 148: C""F aD 11 D" STA ~3265

1~": C"12 6" RTS lC"8"-C"13

READY.

88

Page 88: 40 Best Machine Code Routines for C64

B* PC SR AC XR YR SP

• ; 97FE 72 ee es el F6

cees A9 16 LDA ... 16 cee2 SD ee DD STA .DDse cees A9 es LDA ... es eee7 SD lS De STA .DelS eeeA AD 11 DS LDA .Dell ceeD e9 2e ORA ... 2e ceeF SD 11 DS STA .Dell ce12 6e RTS

89

Page 89: 40 Best Machine Code Routines for C64

19. NRM

This is the complementary routine to graph. It turns the high res screen off and returns to the normal text screen.

To use type SYS 49174.

PAL (C)1979 BRAD TEMPLETON 2 2£1: C£l16 .OPT P,OO 3£1: C£l16 *= .C£l16

; NORM COMMAND ~£I: C£l16 A9 15 LDA .. 21 6£1: C£l18 8D 18 D£I STA 53272 7£1: C£llB A9 lS LDA .. 27 8£1: C£llD 8D 11 D£I STA 53265 9£1: C£l2£1 A9 17 LDA .. 23 1£1£1: C£l22 8D £1£1 DD STA 56576 11£1: C£l2~ 6£1 RTS lC£l16-C£l26

READY.

B* PC SR AC XR YR SP

.197FE 72 £IS £IS £11 F6

C£l16 A9 1~ LDA ... 15 C£l18 8D 18 De STA .D£l18 C£llB A9 lB LDA ... lB C£llD 8D 11 D£I STA .D£lll C£l2£1 A9 17 LDA ... 17 C£l22 8D £1£1 DD STA .DD£I£I C£l25 6£1 RTS

90

Page 90: 40 Best Machine Code Routines for C64

20. CLG

This routine clears the high res screen. Two parameters are re­quired. The first defines the drawing colour and the second the background colour. Both are values between 0 and 15 and are the same as the usual text colours.

To use type SYS 49190, drawing colour, background colour.

PAL (C) 1979 BRAD TEMPLETON 2 2": C"26 .OPT P,OO 3": C026 *= SC"26

CLG COMMAND 50: C"26 20 FD AE JSR .AEFD 60: C"29 2" 8A AD JSR SAD8A 7": C"2C 20 F7 B7 JSR .B7F7 8": C"2F A5 15 LDA .13 80: C"31 F0 03 BEG! MORE 80: C033 4C 48 B2 :IMP .B248 90: C"36 A3 14 MORE LDA .14 90: C038 8D 85 CB STA FIN 10": C03B 20 FD AE JSR .AEFD 110: C03E 20 8A AD JSR .AD8A 120: CB41 20 F7 B7 JSR SB7F7 130: C044 A3 15 LDA 515 13": CB46 F0 03 BEG! MOREl 130: C048 4C 48 B2 JMP 5B248 14": C04B A5 14 MOREl LDA 514 140: Ce4D 0A ASL A 14": C04E 0A ASL A 140: C04F "A ASL A 140: C030 0A ASL A 140: C031 0D 85 C0 ORA FIN 14B: CB54 8D 85 CB STA FIN

91

Page 91: 40 Best Machine Code Routines for C64

15m: cm57 A9 m" LDA .. m 15m: cm59 85 FB STA SFB 16m: cm5B A9 6" LDA .. 96 16m: cm5D 85 FC STA SFC 17m: cm5F Am m" LDY .. m 18m: cm61 A9 m" LDA .. m 19m: cm63 91 FB LOOP STA CSFB) ,Y 2mm: C"65 C8 INY 21m: C"66 D" FB BNE LOOP 22": C"68 E6 FC INC SFC 23": C"6A A6 FC LDX SFC 24": C"6C E" 8" CPX .. 128 25m: C"6E D" F3 BNE LOOP 26m: C"7" AD 85 C" LDA FIN 27": C"73 A2 m" LDX .. " 28": C"75 9D "" 4" LOOP1 STA S4""",X 29": C"78 9D "" 41 STA S41mm,X 3"": C"7B 9D "" 42 STA $42"", X 31": C"7E 9D "" 43 STA .43"",X 32": C"81 E8 INX 32": cm82 Dm F1 BNE LOOP1 32": C"84 6" RTS 33": C"85 FIN • * lC"26-CS85

READY.

B* PC SR AC XR YR SP

. I 97FE 72 "m "" "1 F6

C"26 2" FD AE JSR SAEFD C"29 2" SA AD JSR SAD8A C"2C 2" F7 B7 JSR SB7F7 C"2F A5 15 LDA $15 C"31 F" "3 BEG! SC"36 C"33 4C 48 B2 JMP SB248 C"36 A5 14 LDA 514

92

Page 92: 40 Best Machine Code Routines for C64

C038 8D 8S C0 STA SC08S C03B 20 FD AE JSR SAEFD C03E 20 8A AD JSR SAD8A C041 20 F7 B7 JSR SB7F7 C044 AS 15 LDA S15 C046 F0 03 BEQ SC04B C048 4C 48 B2 JMP SB248 C04B A5 14 LDA S14 C04D 0A ASL C04E 0A ASL C04F 0A ASL C050 0A ASL C051 0D 85 C0 ORA SC085 C054 8D 85 C0 STA SC085 C057 A9 016 LDA .. S00 C059 85 FB STA SFB C05B A9 616 LDA .. S60 C05D 85 FC STA SFC C05F A0 00 LDY .. S00 C061 A9 0m LDA .. S00 C063 91 FB STA CSFB),Y cm65 C8 INY C066 D0 FB BNE SC063 C068 E6 FC INC SFC Cm6A A6 FC LDX SFC C06C Em 8m CPX .. S80 C06E D0 F3 BNE SC063 C070 AD 85 C0 LDA scm85 C073 A2 00 LDX .. S00 cm75 9D 1616 48 STA S400m,x C078 9D 016 41 STA S4100,X C07B 9D 016 42 STA S4200,X C07E 9D mf6 43 STA S4380,X C081 E8 INX C882 Df6 Fl BNE SC075 C884 60 RTS

93

Page 93: 40 Best Machine Code Routines for C64

21. Plot

This routine plots a point Oil the high res screen . It requires two parameters: the X coordinate (0-319) and the Y coordinate (0-199) to be plotted.

The syntax is SYS 49286,X coord, Y coord.

PAL (C) 1979 BRAD TEMPLETON 2 20: C0SA .OPT P,OO 3a: CaSA *= $C0SA 40: CmSA XCOORD = $14

;AND $15 50: CaSA TEMP = $FD 6a: caSA SCREEN = $6ma0 70: Ca8A CHECKCOM = $AEFD sa: cmSA COORD = $B7EB 98: cmSA FALSE = 255 lmm: cmSA TRUE = 0 13m: cmSA A9 mm SET LDA ttTRUE 14m: cmsc SD 3A Cl SETl STA RSFLAG

15m: cmSF 2m FD AE JSR CHECKC OM 16m: cm92 2m EB B7 JSR COORD 17m: cm95 E0 CS CPX tt2mm lsm: cm97 B0 5E BCS TOOBIG

19m: cm99 A5 14 LDA XCOORD

20m: cm9B C9 40 CMP tt<32m 21m: cm9D A5 15 LDA XCOORD +1

94

Page 94: 40 Best Machine Code Routines for C64

220: C09F E9 01 SBC tt>320 230: C0Al B0 54 BCS TOOBIG

240: C0A3 8A TXA 250: C0A4 4A LSR 260: C0A5 4A LSR 270: C0A6 4A LSR 280: C0A7 0A ASL 290: C0A8 A8 TAY 300: C0A9 B9 F8 C0 LDA TABLE, Y ;MULTIPLY PUT IN 310: C0AC 85 FD STA TEMP 320: C0AE B9 F9 C0 LDA TABLE+ 1, Y 330: C0Bl 85 FE STA TEMP+l

340: C0B3 8A TXA 350: C0B4 29 07 AND #%0000 0111 360: C0B6 18 CLC 370: C0B7 65 FD ADC TEMP 380: C0B9 85 FD STA TEMP 390: C0BB A5 FE LDA TEMP+l

400: C0BD 69 00 ADC #0 410: C0BF 85 FE STA TEMP+l

420: C0Cl A5 14 LDA XCOORD

430: C0C3 29 07 AND #'.0000 0111 440: C0C5 A8 TAY 450: C0C6 A5 14 LDA XCOORD

460: C0C8 29 F8 AND #'.1111 1000 470: C0CA 18 CLC 480: C0CB 65 FD ADC TEMP 490: C0CD 85 FD STA TEMP 500: C0CF A5 FE LDA TEMP+l

95

Page 95: 40 Best Machine Code Routines for C64

510: C0Dl 65 15 ADC XCOORD +1 520: C0D3 85 FE STA TEMP+l

530: C0D5 A5 FD LDA TEMP 540: C0D7 18 CLC 550: C0D8 69 00 ADC tt<SCRE EN 560: C0DA 85 FD STA TEMP 570: C0DC A5 FE LDA TEMP+1

580: C0DE 69 60 ADC tt>SCRE EN 590: C0E0 85 FE STA TEMP+1

600: C0E2 A2 00 LDX .. 0 610: C0E4 A1 FD LDA <TEMP, X) 620: C0E6 2C 3A C1 BIT RSFLAG

630: C0E9 10 06 BPL SET2 640: C0EB 39 32 C1 AND ANDMAS K,Y 650: C0EE 4C F4 C0 JMP SET3 660: C0F1 19 2A C1 SET2 ORA ORMASK ,Y 670: C0F4 81 FD SET3 STA (TEMP, X) 680: C0F6 60 RTS 690: C0F7 60 TOOBIG RTS 700: C0F8 N = 320 710: C0F8 00 00 4" TABLE .WORD0*N,1* N,2*N,3*N,4*N 72": C1"2 40 06 80 .WORD5*N,6* N,7*N,8*N,9*N 73": C1"C 80 0C C0 .WORD10*N,1 1*N, 12*N, 13*N,14*N 74": C116 C0 12 00 .WORD15*N,1 6*N, 17*N, 18*N, 19*N 75": C120 00 19 40 .WORD20*N,2 1*N,22*N,23*N,24*N

96

Page 96: 40 Best Machine Code Routines for C64

77": C12A 8" ORMASI< .BYT %1""""

""" 78": C12B 4" .BYT %"110""

""" 79": C12C 2" .BYT %""1""

""" 8"": C12D 1" .BYT %"""1"

""" 81": C12E "8 .BYT %""""1

""" 82": C12F "4 .BYT %fO""fO" 1"" 83": C13" "2 .BYT %""""" "1" 84"= C131 fOl .BYT %""fO"fO ""1

86": C132 7F ANDMASI< .BYT 'YofOllll 111 87": C133 BF .BYT %1"111 111 88"= C134 DF .BYT %11fOll 111 89": C135 EF .BYT %111fOl 111 9"": C136 F7 .BYT %1111" 111 91": C137 FB .BYT %11111 "11 92": C138 FD .BYT %11111 1"1 93": C139 FE .BYT %11111 11"

95": C13A "" RSFLAG .BYT " ]C"8A-C13B

READY.

97

Page 97: 40 Best Machine Code Routines for C64

B* PC SR AC XR YR SP

• ; 97FE 72 flJflJ flJflJ flJl F6

CflJSA A9 flJflJ LDA .. SflJflJ CflJSC SD JA Cl STA SC13A CflJSF 2flJ FD AE JSR SAEFD CflJ92 2flJ EB B7 JSR $B7EB CflJ95 EflJ CS CPX "SCS CflJ97 BflJ SE BCS SCflJF7 CflJ99 A5 14 LDA S14 CflJ9B C9 4flJ CMP .. S4flJ CflJ9D A5 15 LDA S15 CflJ9F E9 flJ1 SBC .. SflJl CflJAl BflJ 54 BCS SCflJF7 CflJA3 SA TXA CflJA4 4A LSR CflJA5 4A LSR CflJA6 4A LSR CflJA7 flJA ASL CflJAS AS TAY CflJA9 B9 FS CflJ LDA .CflJFS,Y CflJAC S5 FD STA SFD CflJAE B9 F9 CflJ LDA SCflJF9,Y CflJB1 S5 FE STA SFE CflJB3 SA TXA CflJB4 29 flJ7 AND "$flJ7 CflJB6 lS CLC CflJB7 65 FD ADC SFD CflJB9 S5 FD STA .FD CflJBB A5 FE LDA .FE CflJBD 69 aflJ ADC .. SflJflJ CflJBF S5 FE STA SFE CflJCl A5 14 LDA $14 CflJC3 29 flJ7 AND .. SflJ7 CflJC5 AS TAY CflJC6 A5 14 LDA S14 CflJCS 29 FS AND ... FS CflJCA 1S CLC CflJCB 65 FD ADC .FD CflJeD S5 FD STA SFD

98

Page 98: 40 Best Machine Code Routines for C64

CtlCF A5 FE LDA $FE CtlDl 65 15 ADC $15 CtlD3 85 FE STA $FE CtlD5 A5 FD LDA $FD CtlD7 18 CLC C"D8 69 IlJIlJ ADC ... 1lJ1lJ

CtlDA 85 FD STA .FD C"DC A5 FE LDA .FE CtlDE 69 61lJ ADC ... 61lJ

C"EIlJ 85 FE STA .FE CtlE2 A2 IlJIlJ LDX ... 1lJ1lJ

C"E4 Al FD LDA C.FD,X) CtlE6 2C JA Cl BIT SC1JA C"E9 11lJ 1lJ6 BPL .CIlJFl C"EB J9 J2 Cl AND .C132,Y CIlJEE 4C F4 CIlJ JMP .CIlJF4 CtlFl 19 2A Cl ORA .C12A,Y C"F4 81 FD STA C.FD,X) CIlJF6 61lJ RTS CIlJF7 61lJ RTS

• : CIlJF8 IlJIlJ IlJIlJ 41lJ "1 81lJ 1lJ2 CIlJ IlJJ • : C 11lJ1lJ IlJIlJ 1lJ5 41lJ 1lJ6 8" 1lJ7 CIlJ 08 • : C 11lJ8 IlJIlJ IlJA 41lJ IlJB 80 IlJC CIlJ 0D .:C111lJ IlJIlJ IlJF 41lJ 11lJ 81lJ 11 CIlJ 12 • : C 118 00 14 41lJ 15 81lJ 16 C0 17 • : C 121lJ IlJIlJ 19 40 lA 81lJ lB C0 lC • : C128 IlJIlJ lE 81lJ 41lJ 21lJ 11lJ 1lJ8 1lJ4

• : C 1 JIlJ 1lJ2 IlJl 7F SF DF EF F7 FB • : C138 FD FE 01lJ C2 C9 F0 08 21lJ

99

Page 99: 40 Best Machine Code Routines for C64

22. Unplot

This routine is complementary to Plot. It unplots a point on the high res screen. Just type in the routine below and unplot is ready.

To use type SYS 49286,X,Y

30' *=SC0S6 40' LDA .. SFF 50' BNE SET1

READY.

PC SR AC XR YR SP .,97FE 72 0'0' 0'0' 0'1 F6

100

CBS6 A9 FF cess De flJ2

LDA ttSFF BNE scesc

Page 100: 40 Best Machine Code Routines for C64

23. Char

This routine puts a character onto the high res screen. You speci­fy three parameters: the X coordinate (0-39), the Y coordinate (0-24) and the character code (screen code).

The syntax is SYS 49467,X,Y,char code

PAL (C)1979 BRAD TEMPLETON 2 20: C13B .OPT P,OO 30: C13B *= SC13B

;CHAR X,Y,CHARACTER, ;EOR OR DELETE

70: C13B 4C 48 B2 ERROR JMP SB248 80: C13E 20 FD AE JSR SAEFD 90: C141 20 ID C2 JSR PARAMS 100: C144 A5 14 LDA S14 100: C146 C9 28 CMP .. 40 100: C148 B0 Fl BCS ERROR 110: C14A 8D 48 C2 STA XSTORE 120: C14D 20 FD AE JSR SAEFD 130: C150 20 ID C2 JSR PARAMS 140: C153 A5 14 LDA S14 140: C155 C9 19 CMP .. 25 14m: C157 B0 E2 BCS ERROR 150: C159 8D 4C C2 STA YSTORE

;TOTAL = Y*320 + X*8 170: C15C AD 48 C2 LDA XSTORE 180: C15F 8D 48 C2 STA MULTI 190: C162 A9 08 LDA .. 8 200: C164 8D 49 C2 STA MULT2 210: C167 20 28 C2 JSR MULTIPLY 220: C16A AD 46 C2 LDA RESULT

101

Page 101: 40 Best Machine Code Routines for C64

23.0: C16D 85 FB STA .FB 24.0: C16F AD 47 C2 LDA RESULT+1 25.0: C172 85 FC STA .FC

• ;NOW Y=32.0*Y 28.0: C174 AD 4C C2 LDA YSTORE 29.0: C177 8D 48 C2 STA MULTl 399: C17A A9 28 LDA .. 49 31.0: C17C 8D 49 C2 STA MULT2 32B: C17F 2B 2B C2 JSR MULTIPLY 33B: C182 AD 46 C2 LDA RESULT 339: C185 8D 5B C2 STA STORERES 33B: C188 AD 47 C2 LDA RESULT+l 33B: C18B 8D 51 C2 STA STORERES+l 34B: C18E A2 B7 LDX .. 7 35.0: C199 AD 46 C2 LOOP12 LDA RESULT 35B: C193 6D 5B C2 ADC STORERES 369: C196 8D 46 C2 STA RESULT 369: C199 AD 47 C2 LDA RESULT+l 379: C19C 69 B.0 ADC .. B 379: C19E 8D 47 C2 STA RESULT+l 389: CIAl CA DEX 399: CIA2 D.0 EC BNE LOOP12 4.09: CIA4 A2 97 LDX .. 7 41.0: CIA6 AD 47 C2 LOOP14 LDA RESULT+l 429: CIA9 18 CLC 429: CIAA 6D 51 C2 ADC STORERES+l 439: ClAD 8D 47 C2 STA RESULT+l 449: CIBB CA DEX 45.0: CIBl D9 F3 BNE LOOP14 46.0: CIB3 AD 47 C2 LDA RESULT+l 47.0: CIB6 18 CLC 47.0: CIB7 69 69 ADC ... 6.0 48.0: CIB9 8D 47 C2 STA RESULT+l 49.0: CIBC A5 FB LDA .FB 59.0: CIBE 18 CLC 5.0.0: CIBF 6D 46 C2 ADC RESULT 51B: CIC2 85 FB STA .FB 52.0: CIC4 A5 FC LDA .FC 53.0: CIC6 6D 47 C2 ADC RESULT+l 54.0: CIC9 85 FC STA .FC

102

Page 102: 40 Best Machine Code Routines for C64

559: C1CB 29 FD AE JSR SAEFD 569: C1CE 29 lD C2 JSR PARAMS 579: C1Dl A5 14 LDA S14 589: C1D3 8D 4E C2 STA CHAR 599: C1D6 AD 4E C2 LDA CHAR 699: C1D9 8D 48 C2 STA MULTl 619: C1DC A9 98 LDA tt8 629: C1DE 8D 49 C2 STA MULT2 639: C1El 2111 2B C2 JSR MULTIPLY 641l1: C1E4 AD 46 C2 LDA RESULT

; CHARACTER LOCATION 651l1: C1E7 85 FD STA SFD 661l1: C1E9 AD 47 C2 LDA RESULT+l 679: C1EC 18 CLC

;ADD .D9 TO SD99S 671l1: C1ED 69 De ADC ttsDe 68S: ClEF 85 FE STA SFE 699: C1Fl A9 ge LDA tt9 699: C1F3 8D 4A C2 STA COUNT 69S: C1F6 78 SEI 691l1: C1F7 A9 33 LDA tt51 69S: C1F9 85 01 STA .91 71l1S: C1FB A9 llIe LDY tt9 711l1: C1FD Bl FD LOOPl LDA (SFD),Y 729: C1FF 91 FB STA (SFB),Y 73S: C21l11 E6 FB INC SFB 73S: C21l13 Dill 92 BNE Nl 74S: C2e5 E6 FC INC SFC 75S: C21l17 E6 FD Nl INC SFD 761l1: C2S9 DS e2 BNE N2 77S: C2SB E6 FE INC SFE 78S: C2eD EE 4A C2 N2 INC COUNT 79S: C21e AD 4A C2 LDA COUNT 8es: C213 C9 III 8 CMP tt8 81S: C215 De E6 BNE LOOPl 829: C217 A9 37 LDA tt55 829: C219 85 e1 STA 1 829: C21B 58 CLI 829: C21C 69 RTS 839: C21D 29 8A AD PARAMS JSR SAD8A 849: C229 29 F7 B7 JSR SB7F7

103

Page 103: 40 Best Machine Code Routines for C64

85": C223 AS 15 LDA S15 85": C225 F" "3 BEQ FINROUT 86": C227 4C 48 B2 JMP SB248 86": C22A 6" FINROUT RTS 87": C22B A9 "9 MULTIPLY LDA tt" 88": C22D 8D 46 C2 STA RESULT 89": C23" A2 "8 LDX tt8 9"": C232 4E 48 C2 LOOP21 LSR MULTl 91": C235 9" "4 BCC LOOP9 92": C237 18 CLC 93": C238 6D 49 C2 ADC MULT2 94": C23B 6A LOOP9 ROR A 95": C23C 6E 46 C2 ROR RESULT 96": C23F CA DEX 97": C24" D" F" BNE LOOP21 98": C242 8D 47 C2 STA RESULT+l 99": C245 6" RTS 1""": C246 "" "" RESULT • WORD" 1"1": C248 "" MULTl .BYT " 1"2": C249 "" MULT2 .BYT " 1"3": C24A "" COUNT .BYT " 1"4": C24B "" XSTORE .BYT " 1"5": C24C "" YSTORE .BYT " 1"6": C24D "" EORFLAG .BYT " 1"7": C24E "" CHAR .BYT " 1"8": C24F "" STORE .BYT " 1"9": C25" "" "" STORERES • WORD" lC13B-C252

READY.

B* PC SR AC XR YR SP

• ; 97FE 72 "" "" "1 F6

CIJB 4C 48 B2 JMP SB248 CIJE 2" FD AE JSR SAEFD C141 2" ID C2 JSR SC21D

104

Page 104: 40 Best Machine Code Routines for C64

C144 A5 14 LDA $14 C146 C9 28 CMP 41.28 C148 B9 Fl ICS $C13B C14A 8D 41 C2 STA $C24B C14D 29 FD AE JSR $AEFD C159 29 lD C2 JSR SC21D C153 A5 14 LDA $14 C155 C9 19 CMP ttS19 C157 B9 E2 ICS SC131 C159 8D 4C C2 STA SC24C C15C AD 4B C2 LDA $C24B C15F 8D 48 C2 STA SC248 C162 A9 98 LDA ttS98 C164 8D 49 C2 STA SC249 C167 29 2B C2 JSR SC22B C16A AD 46 C2 LDA SC246 C16D 85 FB STA SFB C16F AD 47 C2 LDA SC247 C172 85 FC STA SFC C174 AD 4C C2 LDA SC24C C177 8D 48 C2 STA SC248 C17A A9 28 LDA ttS28 C17C 8D 49 C2 STA SC249 C17F 29 21 C2 JSR SC22B C182 AD 46 C2 LDA SC246 C185 8D 59 C2 STA SC259 C188 AD 47 C2 LDA SC247 C18B 8D 51 C2 STA SC251 C18E A2 97 LDX 41.97 C199 AD 46 C2 LDA SC246 C193 6D 59 C2 ADC SC259 C196 8D 46 C2 STA SC246 C199 AD 47 C2 LDA SC247 C19C 69 99 ADC ttS99 C19E 8D 47 C2 STA SC247 C1Al CA DEX C1A2 D9 EC ENE SC199 C1A4 A2 97 LDX 41.97 C1A6 AD 47 C2 LDA .C247 C1A9 18 CLC C1AA 6D 51 C2 ADC .C251

105

Page 105: 40 Best Machine Code Routines for C64

ClAD 8D 47 C2 STA SC247 CIBS CA DEX CIBl DS F3 BNE SCIA6 CIB3 AD 47 C2 LDA SC247 CIB6 18 CLC CIB7 69 6S ADC "56S CIB9 8D 47 C2 STA SC247 CIBC A~ FB LDA 5FB CIBE 18 CLC CIBF 6D 46 C2 ADC SC246 CIC2 85 FB STA 5FB CIC4 A~ FC LDA SFC CIC6 6D 47 C2 ADC SC247 CIC9 85 FC STA SFC CICB 2S FD AE JSR SAEFD CICE 2S ID C2 JSR SC21D CIDl A5 14 LDA 514 CID3 8D 4E C2 STA SC24E CID6 AD 4E C2 LDA SC24E CID9 8D 48 C2 STA SC248 CIDC A9 S8 LDA "SS8 CIDE 8D 49 C2 STA SC249 CIEl 2S 2B C2 JSR SC22B CIE4 AD 46 C2 LDA SC246 CIE7 8~ FD STA SFD CIE9 AD 47 C2 LDA SC247 CIEC 18 CLC CIED 69 DS ADC "5DS ClEF 8~ FE STA SFE CIFl A9 SS LDA ... SS CIF3 8D 4A C2 STA SC24A CIF6 78 SEI CIF7 A9 33 LDA "S33 CIF9 85 Sl STA SSl CIFB AS SS LDY .. SSS CIFD Bl FD LDA (SFD) ,Y CIFF 91 FB STA (SFB),Y C2S1 E6 FB INC SFB C2S3 DS S2 BNE SC2S7 C205 E6 FC INC SFC C207 E6 FD INC SFD

106

Page 106: 40 Best Machine Code Routines for C64

C209 D0 912 BNE SC20D C20B E6 FE INC SFE C20D EE 4A C2 INC SC24A C210 AD 4A C2 LDA SC24A C213 C9 918 CMP .. S08 C215 D0 E6 BNE SCIFD C217 A9 37 LOA .. S37 C219 85 911 STA .01 C21B 58 CLI C21C 60 RTS C21D 20 8A AD JSR SAD8A C220 20 F7 B7 JSR SB7F7 C223 A5 15 LOA S15 C225 F0 913 BEG! SC22A C227 4C 48 B2 JMP SB248 C22A 60 RTS C22B A9 910 LOA ... 00 C22D 8D 46 C2 STA SC246 C230 A2 918 LOX .. S08 C232 4E 48 C2 LSR SC248 C235 991 914 BCC .C23B C237 18 CLC C238 6D 49 C2 ADC SC249 C23B 6A ROR C23C 6E 46 C2 ROR SC246 C23F CA DEX C240 D0 F0 BNE .C232 C242 8D 47 C2 STA .C247 C245 60 RTS

.:C246 091 00 00 00 00 00 00 00

.:C24E 9191 00 091 00 10 CF A5 BA

107

Page 107: 40 Best Machine Code Routines for C64

24. Change bank

This routine allows easy access to the four 16K banks accessi­ble by the VIC II chip. It does not copy the character set down. To do this, use the copy routine given above.

The syntax is SYS 828, bank (0-3)

where bank 0 is 0-16383,1 is 16384 to 32767 and so on.

PAL (C) 1979 BRAD TEMPLETON 2 2.0: .033C .OPT P,OO 3.0: f(J33C *= 828

ROUTINE TO CHANGE BANK FOR VIC II CHIP

SYNTAX

SYS 828, BANK (.0-3)

13f(J: f(J33C 2f(J FD AE JSR SAEFD 14.0: .033F 2.0 9E B7 JSR SB79E 15.0: f(J342 8A TXA 16.0: .0343 C9 .05 CMP #5 17f(J: .0345 9f(J .03 BCC MORE 18.0: .0347 4C 48 B2 JMP SB248

2f(Jf(J: .034A AA MORE TAX 21.0: .034B BD 63 .03 LOA L53272,X 22.0: .034E 80 18 0.0 STA 53272 23.0: .0351 BD 67 .03 LOA L648,X 24.0: f(J354 80 88 .02 STA 648

108

Page 108: 40 Best Machine Code Routines for C64

25.0: .0357 BD 6B .03 LDA L56576,X 26.0: .035A 8D .0.0 DD STA 56576 27.0: .035D A9 93 LDA #"to 28.0: .035F 2.0 D2 FF JSR SFFD2 29.0: .0362 6.0 RTS

31.0: .0363 15 15 15 L53272 .BYT 21,21,21,21 32.0: .0367 .04 .04 .04 L648 .BYT 4,4,4,4 33.0: .036B 47 46 45 L56576 .BYT 71,7.0,69,68 l.033C-.036F

READY.

B* PC SR AC XR YR SP

• ; 97FE 72 .0.0 .0.0 .01 F6

.033C 2.0 FD AE JSR SAEFD

.033F 2.0 9E B7 JSR SB79E

.0342 8A TXA

.0343 C9 .05 CMP #S.05

.0345 9.0 .03 Bce S.034A

.0347 4C 48 B2 JMP SB248

.034A AA TAX

.034B BD 63 .03 LDA S.0363,X

.034E 8D 18 D.0 STA SD.018

.0351 BD 67 .03 LDA S.0367,X

.0354 8D 88 .02 STA S.0288

.0357 BD 6B .03 LDA S.036B,X

.035A 8D .0ta DD STA SDD.0.0

.035D A9 93 LDA #S93

.035F 2.0 D2 FF JSR SFFD2

.0362 6.0 RTS

.:.0363 15 15 15 15 34 .04 .04 .04

.:.036B 47 46 45 44 3D 2.0 74 .03

109

Page 109: 40 Best Machine Code Routines for C64

25. Invert

This routine inverts all or some of the high res screen (it can invert any part of memory).

The syntax is SYS 49746,start,invert

PAL (C) 1979 BRAD TEMPLETON 2 216: C252 .OPT P,OO 316: C252 *= SC252

;FILL ROUTINE

;USES SFB AND .FC ;STORE TOP ADDRESS ;IN 828 AND 829 ;SCAN PAST COMMA

916: C252 216 FD AE JSR SAEFD ;READ 16 BIT NUMBER

lee: C255 216 8A AD JSR SAD8A ;PUT INTO S14 AND S15

1116: C258 216 F7 B7 JSR $B7F7 1216: C25B A5 14 LDA $14 1216: C25D 85 FB STA SFB 1316: C25F A5 15 LDA S15 1316: C261 85 FC STA SFC

1516: C263 216 FD AE JSR SAEFD ;SCAN PAST NEXT COMMA

1616: C266 216 8A AD JSR SAD8A 1716: C269 216 F7 B7 JSR SB7F7 1816: C26C A5 14 LDA 514 1816: C26E 8D 3C 163 STA 828 1916: C271 A5 15 LDA S15 1916: C273 8D 3D 163 STA 829

110

Page 110: 40 Best Machine Code Routines for C64

; 21": C276 A" "" LOOP LDY tt" 22": C278 A9 FF LDA tt255 23": C27A 51 FB EOR (SFB),Y 24": C27C 91 FB STA (.FB) ,Y 25": C27E 2" 95 C2 JSR ADD 26": C281 A5 FB LDA .FB 26": C283 CD 3C "3 CMP 828 26": C286 F" "3 BEQ CHECK 27": C288 4C 76 C2 JMP LOOP 28": C28B AS FC CHECK LDA .FC 28": C28D CD 3D "3 CMP 829 28": C29" F" "B BEQ FINISH 29": C292 4C 76 C2 JMP LOOP 3"": C295 E6 FB ADD INC .FB 3"": C297 F" "1 BEQ FCPLUS1 31": C299 6" RTS 32": C29A E6 FC FCPLUS1 INC SFC 32": C29C 6" RTS 33": C29D 6" FINISH RTS lC252-C29E

READY.

B* PC SR AC XR YR SP

• ; 97FE 72 "" "" "1 F6

C252 2" FD AE JSR .AEFD C255 2" 8A AD JSR $AD8A C258 2" F7 B7 JSR .B7F7 C25B A5 14 LDA 514 C25D 85 FB STA .FB C25F A5 15 LDA $15 C261 85 FC STA .FC C263 2" FD AE JSR SAEFD

111

Page 111: 40 Best Machine Code Routines for C64

C266 20 8A AD JSR SAD8A C269 20 F7 B7 JSR SB7F7 C26C A5 14 LDA S14 C26E 8D 3C 03 STA S033C C271 A5 15 LDA S15 C273 8D 3D 03 STA S033D C276 A0 00 LDY .. S00 C278 A9 FF LDA .. SFF C27A 51 FB EOR (SFB) ,Y C27C 91 FB STA (SFB) ,Y C27E 20 95 C2 JSR SC295 C281 A5 FB LDA SFB C283 CD 3C 03 CMP S033C C286 F0 03 BEG SC28B C288 4C 76 C2 JMP SC276 C28B A5 FC LDA SFC C28D CD 3D 03 CMP S033D C290 F0 0B BEG SC29D C292 4C 76 C2 JMP SC276 C295 E6 FB INC SFB C297 F0 01 BEG! SC29A C299 60 RTS C29A E6 FC INC SFC C29C 60 RTS C29D 60 RTS

112

Page 112: 40 Best Machine Code Routines for C64

26. Organ

The following is a simple interrupt driven organ program. It al­lows you to playa tune on the keyboard whether a program is running or not. The program could run with a sound shaping program, for example.

The keys used are as follows:

qwertyuiop@* t and the space bar to turn the notes off

To turn on the organ type SYS 49152.

PAL (C)1979 BRAD TEMPLETON 2 29: Cf21f21f21 .OPT P,OO 3121: C99f21 *= $C9f219

5121: C99f21 78 SEI 59: Cf21f211 A9 1F LDA #<MAIN

5121: C9f213 8D 14 93 STA 788 69: Cf21f216 A9 C9 LDA #>MAIN

6121: Cf2198 8D 15 93 STA 789 79: Cf21f21B A9 f21F LDA #15 7121: C99D 8D 18 D4 STA 54296 79: Cf211f21 A9 21 LDA #33 7121: Cf21l2 8D 1214 D4 STA 54276 79: Cf2115 A9 38 LDA #<56 7121: C9l7 8D 95 D4 STA 54277 79: Cf21lA 8D 1216 D4 STA 54278 7121: C9lD 58 CLI 79: Cf211E 6121 RTS

113

Page 113: 40 Best Machine Code Routines for C64

90: cmlF A5 C5 MAIN ... DA 1m,,: C"21 A2 0m LDX 10": C"23 A" "m LDY 11": C"25 DD 43 C" LOOP CMP A,X 12": C"28 F" "A BEG! TE 13": C"2A E8 INX 130: cm2B C8 INY 13": C"2C C8 INY 14": cm2D Em "F CPX 15": C"2F D" F4 BNE 160: C"31 4C 31 EA JMP

180: C"34 PLAYNOTE = 19": C"34 B9 51 C" LDA BLE,Y 19": C"37 8D "1 D4 STA 19": cm3A B9 52 C" LDA BLE+l,Y 19": C"3D 8D "" D4 STA 20": cm4" 4C 31 EA JMP 21": C"43 3E "9 "E KEYDATA .BYT 4,17,22,25,3",33,38,41 22": cm4D 2E 31 36 .BYT 54,6"

24": C"51 11 25 13 NOTETABLE.BYT 19,63,21,154,22,227 25": C"59 19 Bl lC .BYT ,28,214,32,94,34,75,38,126,43,52 26": cm65 2D C6 33 .BYT ,51,97,57,172,",m lc""m-C"6D

114

PC SR AC XR YR SP .197FE 72 ee ee el F6

197

.. "

.. m KEYDAT

PLAYNO

.. 15 LOOP $EA31

* NOTETA

54273 NOTETA

54272 $EA31 62,9,1

46,49,

17,37,

25,177

45,198

Page 114: 40 Best Machine Code Routines for C64

CIlJIlJIlJ 78 SEI CllJllJl A9 IF LDA .. SlF CIlJ1lJ3 8D 14 1lJ3 STA SIlJ314 CIlJ1lJ6 A9 CS LDA "SCS CIlJ1lJ8 8D 15 1lJ3 STA SS315 CIlJSB A9 IlJF LDA .. SIlJF CIlJSD 8D 18 D4 STA SD418 CIlJ1S A9 21 LDA ... 21 CIlJ12 8D S4 D4 STA .D4S4 CllJl!5 A9 38 LDA "S38 CIlJ17 8D S5 D4 STA SD41lJ5 CIlJ1A 8D S6 D4 STA .D4S6 CIlJ1D 58 CLI CIlJ1E 6S RTS CIlJ1F A!5 C!5 LDA SC5 CIlJ21 A2 SS LDX ".SS CIlJ23 AIlJ SS LDY ... SIlJ CIlJ25 DD 43 CS CMP .CS43,X CIlJ28 FIlJ SA BEG! .C1lJ34 CIlJ2A E8 INX CIlJ2B C8 INY CIlJ2C C8 INY CIlJ2D EIlJ IlJF CPX ... SF CIlJ2F DS F4 BNE .CS25 CIlJ31 4C 31 EA JMP SEA31 CIlJ34 B9 51 CS LDA SCS!51,Y CIlJ37 8D IlJl D4 STA SD4S1 CIlJ3A B9 52 CS LDA SCS!52,Y CIlJ3D 8D IlJIlJ D4 STA .D4IlJS CIlJ4S 4C 31 EA JMP SEA31

• : CS43 3E S9 SE 11 16 19 lE 21 • : CS4B 26 29 2E 31 36 3C 11 25 .:CS53 13 3F 15 9A 16 E3 19 Bl • : CS5B lC D6 2S 5E 22 4B 26 7E • : CS63 2B 34 2D C6 33 61 39 AC • : CS6B SS SIlJ 8S DS F3 AD 85 cm

115

Page 115: 40 Best Machine Code Routines for C64

27. Sound

This routine makes sound much easier to use. It allows you to set the voice, volume, frequency and waveform for the sound.

The syntax is SYS 16384,voice,volume,frequency,waveform.

The voice is between 1 and 3. The volume is between ° and 15. The frequency is between ° and 65535. The waveform is one of 17 (triangle), 33 (sawtooth) and 129 (noise). Pulse wave­form is not implemented. It can be set but it will not function.

The ADSR and all other features of the SID chip are set auto­matically.

To produce a rising tone the following routine could be used.

FOR A = ° TO 65535 STEP100 : SYS16384, 1, 15,A,33:NEXT:SYS16384, 1,0,0,33

The last statement turns off the sound.

PAL (C) 1979 BRAD TEMPLETON 2 20: 4000 .OPT P,OO 30: 40016 *= S4000

SOUND ROUTINE

SYNTAX

SYS 16384,VOICE, VOLUME,FRE~,WAVE

1116: 4000 20 FD AE JSR SAEFD 1216: 4003 20 8A AD JSR SAD8A

116

Page 116: 40 Best Machine Code Routines for C64

130: 4006 20 F7 B7 JSR $B7F7 140: 4009 A5 15 LDA $15 150: 400B D0 3F BNE IGIERR 160: 400D A5 14 LDA $14 170: 400F 8D DA 40 STA VOICE

190: 4012 20 FD AE JSR $AEFD 200: 40H5 20 8A AD JSR $AD8A 210: 4018 20 F7 B7 JSR $B7F7 220: 401B A5 15 LDA $15 230: 401D D0 2D BNE IGIERR 240: 401F A5 14 LDA $14 250: 4021 8D DB 40 STA VOLUME

270: 4024 20 FD AE JSR $AEFD 280: 4027 20 8A AD JSR $AD8A 290: 402A 20 F7 B7 JSR $B7F7 300: 402D A5 14 LDA $14 310: 402F 8D DD 40 STA FREGI 320: 4032 A5 15 LDA $15 330: 4034 8D DE 40 STA FREGI+1

350: 4037 20 FD AE JSR $AEFD 360: 403A 20 8A AD JSR $AD8A 370: 403D 20 F7 B7 JSR $B7F7 380: 4040 A5 15 LDA $15 390: 4042 D0 08 BNE IGIERR 400: 4044 A5 14 LDA $14 410: 4046 8D DC 40 STA WAVE 420: 4049 4C 4F 40 JMP DO 430: 404C 4C 48 B2 IGIERR JMP $B248

450: 404F A2 00 DO LDX *0 450: 4051 AD DC 40 LDA WAVE 460: 4054 DD DF 40 LOP CMP WAVETABLE,X 470: 4057 F0 08 BEGI MORE 480: 4059 E8 INX 480: 405A E0 04 CPX *4 490: 405C D0 F6 BNE LOP 500: 405E 4C 4C 40 JMP IGIERR 510: 4061 AD DA 40 MORE LDA VOICE

117

Page 117: 40 Best Machine Code Routines for C64

52": 4"64 F" E6 BEGI IGiERR 53": 4"66 C9 "4 CMP .. 4 54": 4"68 B" E2 BCS IGiERR

56": 4"6A AD DB 4" LDA VOLUME 5''': 4"6D C9 10 CMP .. 16 58": 4"6F B" DB BCS IGiERR

60": 40'1 AD DB 4" LDA VOLUME 61": 4"'4 8D 18 D4 STA 54296

63": 40" AD DA 40 LDA VOICE

650: 40'A C9 "1 CMP .. 1 660: 40'C F0 "7 BEGl VOICEl 6'0: 40'E C9 02 CMP .. 2 680: 4080 F0 20 BEGl VOICE2 698: 4882 4C BF 48 JMP VOICE3

• '18: 4085 AD DC 48 VOICEl LDA WAVE '28: 4088 8D "4 D4 STA 542'6 '38: 488B A9 80 LDA .. 128 '48: 408D 8D 05 D4 STA 542" '58: 4090 8D 06 D4 STA 542'8 '60: 4093 AD DD 40 LDA FREGI "8: 4896 8D 80 D4 STA 542'2 '88: 4899 AD DE 48 LDA FREGl+l '98: 489C 8D 01 D4 STA 542'3 8"": 4"9F 4C D9 4" JMP FINISH

; 82": 4"A2 AD DC 4" VOICE2 LDA WAVE 83": 40A5 8D "B D4 STA 54283 84": 4"A8 A9 80 LDA .. 128 858: 48AA 8D 8C D4 STA 54284 868: 48AD 8D "D D4 STA 54285 8'8: 48B" AD DD 48 LDA FREGl 888: 4"B3 8D 8' D4 STA 542'9 890: 4"B6 AD DE 40 LDA FREGI+l 90": 4"B9 8D "8 D4 STA 5428" 910: 4"BC 4C D9 40 JMP FINISH

118

Page 118: 40 Best Machine Code Routines for C64

93.0: 48BF AD DC 40 VOICE3 LDA WAVE 94.0: 40C2 8D 12 D4 STA 5429.0 95.0: 40C~ A9 80 LDA tU28 96.0: 40C7 8D 13 D4 STA 54291 970: 40CA 8D 14 D4 STA 54292 98.0: 48CD AD DD 4.0 LDA FRE6I 990: 48D0 8D 0E D4 STA 54286 1.0.0.0: 40D3 AD DE 4.0 LDA FRE6I+l 1.010: 40D6 8D 0F D4 STA 54287

1030: 48D9 60 FINISH RTS 104.0: 40DA .0.0 VOICE .BYT .0 1.050: 40DB 00 VOLUME .BYT 0 1060: 40DC 00 WAVE .BYT 0 1070: 40DD 00 00 FRE6I .WORD0 1080: 40DF 11 21 41 WAVETABLE.BYT 17,33,65,129 l4000-40E3

READY.

B* PC SR AC XR YR SP

•• 97FE 72 0.0 0.0 01 F6

4000 20 FD AE JSR .AEFD 4003 20 8A AD JSR SAD8A 4006 20 F7 B7 JSR SB7F7 4009 A5 H5 LDA .H5 400B D0 3F BNE S404C 400D A5 14 LDA S14 400F 8D DA 40 STA S40DA 4012 20 FD AE JSR SAEFD 401~ 20 8A AD JSR SAD8A 4018 20 F7 B7 JSR .B7F7 401B A~ 15 LDA .1~ 401D D0 2D BNE S404C 401F A5 14 LDA S14

119

Page 119: 40 Best Machine Code Routines for C64

4921 8D DB 49 STA .49DB 4924 29 FD AE JSR .AEFD 4927 29 8A AD JSR .AD8A 492A 29 F7 B7 JSR .B7F7 492D A5 14 LDA .14 492F 8D DD 49 STA .49DD 4932 A5 15 LDA S15 4934 8D DE 49 STA .49DE 4937 29 FD AE JSR .AEFD 493A 29 8A AD JSR .AD8A 493D 29 F7 B7 JSR SB7F7 4949 A5 13 LDA .15 4942 D9 98 BNE .494C 4944 A5 14 LDA .14 4946 8D DC 49 STA "9DC 4949 4C 4F 49 JMP .494F 494C 4C 48 B2 JMP SB248 494F A2 99 LDX ... 99 4931 AD DC 49 LDA .49DC 4934 DD DF 49 CMP .49DF,X 4937 F9 98 BEGI .4961 4939 E8 INX 495A E9 94 CPX ... 94 495C D9 F6 BNE .4954 493E 4C 4C 49 JMP .494C 4961 AD DA 49 LDA .49DA 4964 F9 E6 BEGI S494C 4966 C9 94 CMP ... 94 4968 B9 E2 BCS S494C 496A AD DB 49 LDA S49DB 496D C9 1.0 CMP ... 19 496F B9 DB BCS .494C 4971 AD DB 49 LDA .49DB 4974 8D 18 D4 STA .D418 4977 AD DA 49 LDA .49DA 4.07A C9 91 CMP ... JiH 4.07C F.0 97 BEG! .4985 4.07E C9 92 CMP ... 92 498.0 F9 2.0 BEG! .49A2 4982 4C BF 4.0 JMP .49BF 4985 AD DC 49 LDA .49DC

120

Page 120: 40 Best Machine Code Routines for C64

4088 8D 04 D4 STA .D404 408B A9 89 LDA ... 89 408D 8D 95 D4 STA .D405 4099 8D 96 D4 STA .D406 4093 AD DD 49 LDA .49DD 4096 8D 99 D4 STA .D499 4099 AD DE 40 LDA .49DE 409C 8D 91 D4 STA .D491 409F 4C D9 49 JMP .40D9 40A2 AD DC 49 LDA .40DC 40A5 8D 9B D4 STA .D40B 40A8 A9 89 LDA ... 89 40AA 8D 8C D4 STA SD40C 40AD 8D 8D D4 STA .D49D 40B9 AD DD 49 LDA .49DD 40B3 8D 87 D4 STA SD497 40B6 AD DE 48 LDA .48DE 4089 8D 88 D4 STA .D408 40BC 4C D9 48 JMP .48D9 40BF AD DC 48 LDA .48DC 40C2 8D 12 D4 STA SD412 40C5 A9 88 LDA ... 80 40C7 8D 13 D4 STA .D413 40CA 8D 14 D4 STA .D414 40CD AD DD 49 LDA .48DD 40D9 8D 8E D4 STA .D48E 40D3 AD DE 48 LDA .40DE 40D6 8D 9F D4 STA .D49F 40D9 68 RTS

.:49DA 80 90 09 99 99 11 21 41

.:49E2 81 99 BE 89 89 98 F8 09

121

Page 121: 40 Best Machine Code Routines for C64

28. Envelope

This routine is similair to Sound (above) but it allows you to set the attack, decay, sustain and release as well.

Attack, decay, sustain and release are all betwen 0 and 15.

The syntax is SYS 16384, voice, volume, waveform, frequency, attack, decay, sustain, release.

PAL (C)1979 BRAD TEMPLETON 2 28: 4888 .OPT P,OO 38: 4888 *= .4888

; ENVELOPE FUNCTION ; ; SYNTAX ; ;SYS16384,VOICE,VOLUME, ;WAVE,FREQ,A,D,S,R

128: 4fJ8fJ 28 24 41 JSR GETPARAM 138: 4883 A~ 1~ LDA $1~

14fJ: 488~ D8 6D BNE IQERR 1~8: 4887 A~ 14 LDA $14 168: 48fJ9 8D 2E 41 STA VOICE 178: 48fJC 28 24 41 JSR GETPARAM 18fJ: 4fJfJF A5 15 LDA $15 198: 4811 D8 61 BNE IG/ERR 2fJfJ: 4813 A5 14 LDA .14 218: 4fJ15 8D 2F 41 STA VOLUME 22fJ: 4818 2fJ 24 41 JSR GETPARAM 23fJ: 4fJ1B A5 15 LDA $15 24fJ: 4fJ1D DfJ 55 BNE IG/ERR

122

Page 122: 40 Best Machine Code Routines for C64

250: 401F A3 14 LDA $14 260: 4021 8D 30 41 STA WAVE 270: 4024 20 24 41 JSR GETPARAM 280: 4027 A3 14 LDA $14 290: 4029 8D 31 41 STA FREQ 300: 402C A5 15 LDA S15 310: 402E 8D 32 41 STA FREQ+1 320: 4031 20 24 41 JSR GETPARAM 330: 4034 A3 15 LDA $13 340: 4036 D0 3C BNE IQERR 350: 4038 A5 14 LDA $14 360: 403A C9 10 CMP tH6 370: 403C B0 36 BCS IQERR 380: 403E 8D 33 41 STA ATTACK 390: 4041 20 24 41 JSR GETPARAM 408: 4044 A3 13 LDA S13 410: 4046 D8 2C BNE IQERR 420: 4048 A3 14 LDA S14 430: 404A C9 10 CMP tH6 448: 404C B0 26 BCS IQERR 430: 404E 8D 34 41 STA DECAY

470: 4051 20 24 41 JSR GETPARAM 480: 4034 A3 13 LDA .13 490: 4036 D0 1C BNE IQERR 580: 4038 A3 14 LDA $14 318: 403A C9 10 CMP .. 16 328: 403C B8 16 BCS I6'lERR 330: 403E 8D 33 41 STA SUSTAIN

330: 4061 20 24 41 JSR GETPARAM 360: 4064 A5 13 LDA .13 370: 4066 D0 0C BNE I6'lERR 580: 4068 A3 14 LDA $14 398: 406A C9 10 CMP .. 16 608: 406C B8 86 BCS I6'lERR 610: 406E 8D 36 41 STA RELEASE

630: 4071 4C 77 40 JMP DO I

630: 4074 4C 48 B2 IQERR JMP SB248

123

Page 123: 40 Best Machine Code Routines for C64

; 67£1: 4£177 AD 2F 41 DO LDA VOLUME 68£1: 4B7A C9 U, CMP .. 16 69£1: 407C B0 F6 BCS IG!ERR 7£1£1: 407E 8D 18 D4 STA 54296

;CALCULATE ADSR

740: 4081 AD 34 41 LDA DECAY 75£1: 4084 4A LSR A 760: 4085 4A LSR A 770: 4086 4A LSR A 780: 4087 4A LSR A 790: 4088 18 CLC 80£1: 4089 6D 33 41 ADC ATTACK 810: 408C 8D 37 41 STA AD

83£1: 408F AD 36 41 LDA RELEASE 84£1: 4092 4A LSR A 85£1: 4093 4A LSR A 860: 4094 4A LSR A 870: 4095 4A LSR A 880: 4096 18 CLC 89£1: 4097 6D 35 41 ADC SUSTAIN 900: 409A 8D 38 41 STA SR

92£1: 409D A2 00 LDX .. 0 930: 409F AD 30 41 LDA WAVE 94£1: 40A2 DD 39 41 LOOP CMP WAVETABLE,X 95£1: 40A5 F0 08 BEG! MORE 960: 40A7 E8 INX 960: 40A8 E0 04 CPX .. 4 970: 40AA D0 F6 BNE LOOP 980: 40AC 4C 48 B2 IG!ERRl JMP $B248 ; I G!ERR

10£10: 40AF AD 2E 41 MORE LDA VOICE 1010: 40B2 F0 F8 BEG! IG!ERRl 1920: 40B4 C9 04 CMP .. 4 1030: 40B6 B0 F4 BCS IG!ERRl

1050: 40B8 C9 01 CMP .. 1

124

Page 124: 40 Best Machine Code Routines for C64

1060: 40BA F0 07 BEGI VOICEl 1070: 40BC C9 02 CMP .. 2 1080: 40BE F0 24 BEGI VOICE2 1090: 40C0 4C 05 41 JMP VOICE3

1120: 40C3 AD 30 41 VOICEl LDA WAVE 1130: 40C6 8D 04 D4 STA 54276 1140: 40C9 AD 37 41 LDA AD 1150: 40CC 8D 05 D4 STA 54277 1160: 40CF AD 38 41 LDA SR 1170: 40D2 8D 06 D4 STA 54278 1180: 40D5 AD 31 41 LDA FREGI 1190: 40D8 8D 00 D4 STA 54272 1200: 40DB AD 32 41 LDA FREGI+l 1210: 40DE 8D 01 D4 STA 54273 1220: 40El 4C 23 41 JMP FINISH

1240: 40E4 AD 30 41 VOICE2 LDA WAVE 1250: 40E7 8D 0B D4 STA 54283 1260: 40EA AD 37 41 LDA AD 1270: 40ED 8D 0C D4 STA 54284 1280: 40F0 AD 38 41 LDA SR 1290: 40F3 8D 0D D4 STA 54285 1300: 40F6 AD 31 41 LDA FREGI 1310: 40F9 8D 07 D4 STA 54279 1320: 40FC AD 32 41 LDA FREGI+l 1330: 40FF 8D 08 D4 STA 54280 1340: 4102 4C 23 41 JMP FINISH

1360: 4105 AD 30 41 VOICE3 LDA WAVE 1370: 4108 8D 12 D4 STA 54290 1380: 410B AD 37 41 LDA AD 1390: 410E 8D 13 D4 STA 54291 1400: 4111 AD 38 41 LDA SR 1410: 4114 8D 14 D4 STA 54292 1420: 4117 AD 31 41 LDA FREGI 1430: 411A 8D 0E D4 STA 54286 1440: 411D AD 32 41 LDA FREGI+l 1450: 4120 8D 0F D4 STA 54287

125

Page 125: 40 Best Machine Code Routines for C64

• 148S: 4123 6S FINISH RTS 149S: 4124 2S FD AE GETPARAM JSR $AEFD lSSS: 4127 2S 8A AD JSR $AD8A lSlS: 412A 2S F7 B7 JSR $B7F7 152S: 412D 6S RTS 153S: 412E SS VOICE .BYT S 154S: 412F SS VOLUME .BYT S 155~: 413S SS WAVE .BYT S 156S: 4131 SS SS FRE61 • WORD" 157S: 4133 SS ATTACK .BYT " 158S: 4134 "S DECAY .BYT " 159S: 4135 SS SUSTAIN .BYT " 16S": 4136 SS RELEASE .BYT " 161S: 4137 SS AD .BYT " 162S: 4138 "" SR .BYT " 163S: 4139 11 21 41 WAVETABLE.BYT 17,33,65,129 J4SSS-413D

READY.

B* PC SR AC XR YR SP

.197FE 72 SS "S S1 F6

4SSS 2S 24 41 JSR $4124 4"S3 A5 15 LDA .15 4SS5 DS 6D BNE .4874 4SS7 A5 14 LDA .14 4S"9 8D 2E 41 STA $412E 4SSC 2" 24 41 JSR $4124 4S"F A5 15 LDA $15 4S11 D" 61 BNE $4874 4S13 A5 14 LDA $14 4S15 8D 2F 41 STA $412F 4S18 2S 24 41 JSR .4124

126

Page 126: 40 Best Machine Code Routines for C64

401B A5 15 LDA $15 401D D0 55 BNE $4074 401F A5 14 LDA $14 4021 8D 30 41 STA $4130 4024 20 24 41 .JSR $4124 4027 A5 14 LDA $14 4029 8D 31 41 STA $4131 402C A5 15 LDA $15 402E 8D 32 41 STA $4132 4031 20 24 41 .JSR $4124 4034 A5 15 LDA $15 4036 D0 3C BNE $4074 4038 A5 14 LDA $14 403A C9 10 CMP "$10 403C B0 36 BCS $4074 403E 8D 33 41 STA $4133 4041 20 24 41 .JSR $4124 4044 A5 15 LDA $15 4046 D0 2C BNE $4074 4048 A5 14 LDA $14 404A C9 10 CMP "$10 404C B0 26 BCS $4074 404E 8D 34 41 STA $4134 4051 20 24 41 .JSR $4124 4054 A5 15 LDA $15 4056 D0 1C BNE $4074 4058 A5 14 LDA $14 405A C9 10 CMP "$10 405C B0 16 BCS .4074 405E 8D 35 41 STA $4135 4061 20 24 41 .JSR $4124 4064 A5 15 LDA .15 4066 D0 0C BNE $4074 4068 A5 14 LDA $14 406A C9 10 CMP "$10 406C B0 06 BCS $4074 406E 8D 36 41 STA .4136 4071 4C 77 40 .JMP .4077 4074 4C 48 B2 .JMP SB248 4077 AD 2F 41 LDA $412F 407A C9 10 CMP ... 10

127

Page 127: 40 Best Machine Code Routines for C64

4.07C B.0 F6 BCS $4.074 4.07E BD 1B D4 STA $D41B 4.081 AD 34 41 LDA $4134 4.084 4A LSR 4.0B~ 4A LSR 4.086 4A LSR 4.087 4A LSR 4.088 18 CLC 4.089 6D 33 41 ADC $4133 4.08C 8D 37 41 STA $4137 4.08F AD 36 41 LDA $4136 4.092 4A LSR 4.093 4A LSR 4.094 4A LSR 4.09~ 4A LSR 4.096 18 CLC 4.097 6D 35 41 ADC $413~ 4.09A 8D 38 41 STA $4138 4.09D A2 .0.0 LDX "$.0.0 4.09F AD 3.0 41 LDA $413.0 4.0A2 DD 39 41 CMP $4139,X 4.0A3 F.0 .08 BEQ $4.0AF 4.0A7 E8 INX 4.0A8 E.0 .04 CPX "$.04 4.0AA D.0 F6 BNE $4.0A2 4.0AC 4C 48 B2 JMP $B248 4.0AF AD 2E 41 LDA $412E 4.0B2 F.0 F8 BEQ $4.0AC 4.0B4 C9 .04 CMP ... .04 4.0B6 B.0 F4 BCS .4.0AC 4.0B8 C9 .01 CMP "$.01 4.0BA F.0 .07 BEQ .4.0C3 4.0BC C9 .02 CMP "$.02 4.0BE F.0 24 BEQ $4.0E4 4.0C.0 4C .0~ 41 JMP $41.05 4.0C3 AD 3.0 41 LDA $413.0 4.0C6 8D .04 D4 STA $D4.04 4.0C9 AD 37 41 LDA $4137 4.0CC 8D .05 D4 STA $D4.05 4.0CF AD 38 41 LDA $4138 4.0D2 8D .06 D4 STA $D4.06

128

Page 128: 40 Best Machine Code Routines for C64

4"D5 AD 31 41 LDA $4131 4"D8 8D "" D4 STA $D4.0" 4"DB AD 32 41 LDA $4132 4.0DE 8D "1 D4 STA $D4.01 4"E1 4C 23 41 JMP $4123 4"E4 AD 3" 41 LDA S413" 4"E7 8D "B D4 STA SD4"B 4"EA AD 37 41 LDA S4137 4"ED 8D "C D4 STA $D4"C 4"F" AD 38 41 LDA $4138 4.0F3 8D "D D4 STA $D4.0D 4.0F6 AD 31 41 LDA $4131 4"F9 8D "7 D4 STA $D4.07 4.0FC AD 32 41 LDA $4132 4"FF 8D "8 D4 STA $D4"8 41"2 4C 23 41 JMP S4123 41"5 AD 3" 41 LDA $413" 41"8 8D 12 D4 STA $D412 41"B AD 37 41 LDA $4137 41"E 8D 13 D4 STA $D413 4111 AD 38 41 LDA $4138 4114 8D 14 D4 STA $D414 4117 AD 31 41 LDA $4131 411A 8D "E D4 STA $D4.0E 411D AD 32 41 LDA $4132 412" 8D "F D4 STA $D4"F 4123 60 RTS 4124 2" FD AE JSR $AEFD 4127 2" SA AD JSR $AD8A 412A 2" F7 B7 JSR $B7F7 412D 6" RTS

.:412E "" "" "" "" ".0 "" ".0 ""

.:4136 "" "" "" 11 21 41 81 "4

129

Page 129: 40 Best Machine Code Routines for C64

29. DIR

This routine allows you to read the disk directory (of either or both drives on a dual drive (not two 1541s)). It does not disturb the program in memory.

The syntax is SYS 16384,drive

where drive is 0 or 1, or 2 if both drives are to be read.

PAL (C)1979 BRAD TEMPLETON 2 2": 3FFD .OPT P,OO 3": 3FFD *= 16381 4": 3FFD FNLENGTH = $B7 3": 3FFD SECADR = $B9 6": 3FFD DEVNUM = SBA 7(1: 3FFD FNADD = $BB 8(1: 3FFD FNLEN = $FD 9": 3FFD TEMP = $FB 1"(1: 3FFD ST = S9" 11(1: 3FFD SENDFNAM = $F3DS 12": 3FFD CLOSEFIL = SF642 13": 3FFD SENDSEC = $FF96 14": 3FFD IECTALK = $FFB4 13(1: 3FFD IECINP = $FFAS 16": 3FFD LINENO = $BDCD 17": 3FFD PRINT = SFFD2 18": 3FFD CR = 13

I 2(1(1: 3FFD 4C 48 B2 IGlERR JMP $B248

;DIR SYNTAX SYS 16384 22(1: 4"(1(1 2(1 FD AE JSR $AEFD 23": 4""3 2" 9E B7 JSR $B79E 24": 4"(16 SA TXA

130

Page 130: 40 Best Machine Code Routines for C64

259: 4997 C9 93 CMP tt3 269: 4999 B9 F2 BCS IGiERR 279: 499B C9 99 CMP tt9 279: 499D F9 9F BEGI ZERO 289: 499F C9 91 CMP ttl 299: 4911 D9 16 BNE BOTH 399: 4913 A9 31 LDA tt"l" 319: 4915 85 FC STA .FC 329: 4917 A9 92 LDA tt2 339: 4919 85 FD STA FNLEN 349: 491B 4C 2D 48 JMP DIR

369: 491E ZERO = * 379: 491E A9 39 LDA tt"9 N

389: 4929 85 FC STA .FC 399: 4922 A9 92 LDA tt2 499: 4924 85 FD STA FNLEN 419: 4926 4C 2D 48 JMP DIR 429: 4929 A9 91 BOTH LDA ttl 4311: 482B 85 FD STA FNLEN

458: 492D A9 99 DIR LDA tt9 469: 492F 85 99 STA ST 479: 4931 A9 24 LDA tt"s 489: 4933 85 FB STA TEMP 499: 4935 A9 FB LDA tt<TEMP 599: 4937 85 BB STA FNADD 519: 4839 A9 89 LDA tt>TEMP 529: 493B 85 BC STA FNADD+l 539: 483D A5 FD LDA FNLEN 549: 493F 85 B7 STA FNLENGTH 559: 4941 A9 98 LDA tt8 569: 4943 85 BA STA DEVNUM 579: 4945 A9 69 LDA tt.69 589: 4847 85 B9 STA SECADR 599: 4849 29 D5 F3 JSR SENDFNAM 699: 494C A5 BA LDA DEVNUM 619: 494E 29 B4 FF JSR IECTALK 629: 4951 A5 B9 LDA SECADR 639: 4853 28 96 FF JSR SEND SEC 649: 4856 A4 99 LDY ST

131

Page 131: 40 Best Machine Code Routines for C64

6~": 4"58 D" 3D BNE DLIST4 66": 4"5A A" "6 LDY #6 67": 485C 84 FB DLISTl STY TEMP 68": 485E 2" A5 FF JSR IECINP 69": 4861 A6 FC LDX TEMP+l 7"": 4"63 8~ FC STA TEMP+l 71": 486~ A4 9" LDY ST 72": 4"67 D" 2E BNE DLIST4 73": 4"69 A4 FB LDY TEMP 74": 4"6B 88 DEY 7~": 4"6C D" EE BNE DLISTl 768: 486E A4 FC LDY TEMP+l 77": 487" 2" CD BD JSR LINENO 788: 4873 A9 2" LDA #.2" 79": 487~ 2" D2 FF JSR PRINT 8"": 4878 2" A3 FF DLIST3 JSR IECINP 81": 487B A6 9" LDX ST 828: 487D D" 18 BNE DLIST4 83": 487F AA TAX 84": 4"8" F" "6 BE61 DLIST2 8~": 4882 2" D2 FF JSR PRINT 86": 4883 4C 78 4" JMP DLIST3 87": 4"88 A9 "D DLIST2 LDA #CR 88": 4"8A 2" D2 FF JSR PRINT 89": 4"8D A3 C3 LDA .C~

9"": 488F C9 3F CMP #63 9"": 4891 F" "4 BE61 DLIST4 91": 4"93 A" "4 LDY #4 92": 4"9~ D8 C3 BNE DLISTl 93": 4"97 2" 42 F6 DLIST4 JSR CLOSEFIL 948: 489A 6" RTS l3FFD-4"9B

READY.

132

Page 132: 40 Best Machine Code Routines for C64

B* PC SR AC XR YR SP

• ; 9'FE '2 fIIfII fIIfII fill F6

4f11f11f11 2f11 FD AE JSR .AEFD 4f11f113 2f11 9E B' JSR .B'9E 4f11f116 8A TXA 4f11f11' C9 f113 CMP ... fII3 4f11f119 BfII F2 BCS .3FFD 4f11f11B C9 fIIfII CMP ... fIIfII 4f11f11D FfII fIIF BEQ .4f111E 4f11f11F C9 fill CMP ... flll 4f1111 DfII 16 BNE .4f1129 4f1113 A9 31 LDA ... 31 4f11H5 85 FC STA .FC 4f111' A9 f112 LDA ... fII2 4f1119 85 FD STA .FD 4f111B 4C 2D 4f11 JMP .482D 4f111E A9 3f11 LDA ... 3f11 4f112f11 85 FC STA .FC 4f1122 A9 f112 LDA ... fII2 4f1124 85 FD STA .FD 4f1126 4C 2D 4f11 JMP .4f112D 4f1129 A9 fill LDA ... flll 4f112B 85 FD STA .FD 4f112D A9 16f11 LDA ... fIIfII 4f112F 85 9f11 STA .9f11 4f1131 A9 24 LDA ... 24 4f1133 85 FB STA .FB 4f1135 A9 FB LDA ... FB 4f113' 85 BB STA .BB 4f1139 A9 16f11 LDA ... 1616 4f113B 85 BC STA .BC 4f113D A5 FD LDA .FD 4163F 85 B' STA .B' 4f1141 A9 168 LDA ... fII8 41643 85 BA STA .BA 41645 A9 616 LDA ... 616 4164' 85 B9 STA SB9 4f1149 216 D5 F3 JSR .F3D5 4f114C A5 BA LDA .BA

133

Page 133: 40 Best Machine Code Routines for C64

404E 20 B4 FF JSR $FFB4 4051 A5 B9 LDA $B9 4053 20 96 FF JSR $FF96 4056 A4 90 LDY $90 4058 D0 3D ENE $4097 405A A0 06 LDY "$06 4/15C 84 FB STY .FB 4/15E 2/1 A5 FF JSR .FFA5 4/161 A6 FC LDX .FC 4063 85 FC STA .FC 4/165 A4 90 LDY .9/1 4067 D/I 2E ENE .4097 4069 A4 FB LDY .FB 406B 88 DEY 4/16C D0 EE ENE .405C 406E A4 FC LDY .FC 4070 20 CD BD JSR .BDCD 4073 A9 2/1 LDA ... 2/1 4075 2/1 D2 FF JSR $FFD2 4/178 20 A5 FF JSR .FFA5 4/17B A6 90 LDX $90 407D D0 18 BNE $4097 407F AA TAX 4/180 F0 06 BEG! .4088 4/182 20 D2 FF JSR .FFD2 4/185 4C 78 4/1 JMP $4078 4/188 A9 0D LDA "$0D 408A 20 D2 FF JSR .FFD2 4/18D A5 C5 LDA .C5 4/18F C9 3F CMP ... 3F 4/191 F/I 04 BEG! .4097 4093 A0 04 LDY ... 04 4095 D0 C5 BNE .405C 4097 20 42 F6 JSR .F642 409A 60 RTS

134

Page 134: 40 Best Machine Code Routines for C64

30. MSAVE

The following routine allows you save any specified area of memory. You specify the filename, the device, the secondary address, the start address and the finishing address + 1.

The syntax is as follows:

SV.S 16384," name" ,device, 1 ,start, finish + 1

PAL (C) 1979 BRAD TEMPLETON 2 20: 4000 .OPT P,OO 30: 4S00 *= .4000

~S: 4000 20 FD AE JSR .AEFD 60: 4S03 20 D4 El JSR SEID4 70: 4S06 20 FD AE JSR SAEFD 80: 4009 20 8A AD JSR .AD8A 90: 400C 20 F7 B7 JSR .B7F7 100: 400F A~ 14 LDA .14 110: 4011 48 PHA 120: 4012 A~ 15 LDA .15 130: 4S14 48 PHA 140: 4015 20 FD AE JSR SAEFD 150: 4S18 20 8A AD JSR .AD8A 160: 401B 20 F7 B7 JSR SB7F7 170: 4S1E A6 14 LDX .14 180: 4020 A4 H5 LDY .15 190: 4022 68 PLA 200: 4S23 85 FC STA .FC 210: 4025 68 PLA 220: 4S26 85 FB STA SFB

135

Page 135: 40 Best Machine Code Routines for C64

230: 4028 A9 FB 240: 402A 4C ~F E1 ] 4000-482D

READY.

B* PC SR AC

.19'FE '2 fIfI

400f1 20 FD AE 4f1f13 216 D4 E1 4f1S6 20 FD AE 416169 216 8A AD 4f1f1C 216 F' B' 40f1F A~ 14 41611 48 4f112 A~ 1~ 4014 48 4f11~ 216 FD AE 41618 20 8A AD 4f11B 20 F' B' 4S1E A6 14 416216 A4 13 4022 68 4f123 8~ FC 4S2~ 68 4f126 8~ FB 4028 A9 FB 4f12A 4C ~F E1

136

XR YR SP fIfI fll F6

JSR JSR JSR JSR JSR LDA PHA LDA PHA JSR JSR JSR LDX LDY PLA STA PLA STA LDA JMP

LDA .. SFB JMP SE1~F

SAEFD SE1D4 SAEFD SAD8A SB'F' S14

Sl~

SAEFD SAD8A SB'F' S14 Sl~

SFC

SFB .. SFB SE1~F

Page 136: 40 Best Machine Code Routines for C64

31. MLOAD/MVERIFY

The following routine allows you to load or verify to or from a specified area of memory. The load enables you to load into any area of memory, whether it was saved from that area or not. The verify allows you to verify a specific area of memory.

The syntax for M LOAD is as follows:

SYS 16394,"name",device, 1,start address

The syntax for MVERIFY is as follows:

SYS 16384,"name",device,1,start

PAL (C) 1979 BRAD TEMPLETON 2 2": 4""" .OPT P,OO 3": 4""" *= S4""" 4": 4""" 28 FD AE MVERIFY JSR SAEFD '. S": 4""3 A9 81 LDA 11 6": 4""S 8~ 8A STA SA 7": 4""7 4C 11 4" JMP LO 8": 4""A 2" FD AE MLOAD JSR SAEFD 9": 4""D A9 8" LDA I" 1"": 4""F 8S 8A STA SA 11": 4"11 2" D4 El LO JSR SEID4 12": 4"14 2" FD AE JSR SAEFD 13": 4"17 2" 8A AD JSR SAD8A 14": 4"lA 2" F7 B7 JSR SB7F7 15": 4"lD A5 "A LDA SA 16": 4"lF A6 14 LDX S14 17": 4"21 A4 15 LDY S15 18": 4"23 4C 75 El JMP SE175 ]4"""-4"26

READY.

137

Page 137: 40 Best Machine Code Routines for C64

B* PC SR AC XR YR SP

.197FE 72 00 00 01 F6

·4000 20 FD AE JSR $AEFD 4003 A9 01 LDA "$01 4005 85 0A STA $0A 4007 4C 11 40 JMP S4011 4B0A 20 FD AE JSR $AEFD 40BD A9 B0 LDA "$0B 40BF 85 BA STA SBA 4B11 20 D4 El JSR $EID4 4014 2B FD AE JSR SAEFD 4017 20 8A AD JSR SAD8A 401A 2B F7 B7 JSR $B7F7 401D A5 0A LDA S0A 4B1F A6 14 LDX $14 4B21 A4 15 LDY $15 4B23 4C 75 El JMP $E175

138

Page 138: 40 Best Machine Code Routines for C64

32. Disk

This routine allows you to send a command to the command channel of the disk drive, e.g. initialise or format.

It replaces the following in Basic:

OPEN15,8,15,"COMMAND"

The syntax is as follows:

SYS 16384,"command"

PAL (C) 1979 BRAD TEMPLETON 2 2": 4""" .OPT P,OO 3": 4""" *= S4"""

SYNTAX SYS16384, "COMMAND"

6": 4""" CLOSE = SFFC3 7": 4""" OPEN = SFFC" 8": 4""" GETNAME ... SE257 9": 4""" NEXTGJ ... SE2"6 1"": 4""" SETFNA ... SFFBD 11": 4""" SETFPA ... SFFBA 12": 4""" GIVERR = SE"F9

14": 4""" 2" FD AE JSR SAEFD 15": 4""3 A9 "F LDA tU5 16": 4""5 2" C3 FF J.SR CLOSE 17": 4""8 2" 16 4" JSR GETFPAR 18": 4""B 2" ce FF JSR OPEN 19": 4""E B" 1A BCS ERROR 2"": 4"1" A9 "F LDA tU5 21": 4,:112 2" C3 FF JSR CLOSE

139

Page 139: 40 Best Machine Code Routines for C64

220: 4015 60 RTS I

240: 4016 A9 a0 GETFPAR LDA .. 0 250: 4018 20 BD FF JSR SETFNA 260: 401B A9 0F LDA fUS 270: 401D A8 TAY 280: 401E A2 a8 LDX .. 8 290: 4020 20 BA FF JSR SETFPA 300: 4023 20 a6 E2 JSR NEXTGI 310: 4026 20 S7 E2 JSR GETNAME 320: 4029 60 RTS 330: 402A 4C F9 E0 ERROR JMP GIVERR l4000-402D

READY.

B* PC SR AC XR YR SP

• ; 97FE 72 00 00 01 F6

4000 20 FD AE JSR SAEFD 4003 A9 0F LDA .. S0F 4005 20 C3 FF JSR SFFC3 4008 20 16 40 JSR .4016 400B 20 C0 FF JSR SFFC0 400E B0 1A BCS .402A 4010 A9 0F LDA ... 0F 4012 20 C3 FF JSR SFFC3 4015 60 RTS 4016 A9 00 LDA .. S00 4018 20 BD FF JSR SFFBD 401B A9 0F LDA ... 0F 401D A8 TAY 401E A2 08 LDX ... 08 4020 20 BA FF JSR SFFBA 4023 20 06 E2 JSR SE206 4026 20 57 E2 JSR SE2S7 4029 60 RTS 402A 4C F9 E0 JMP SE0F9

140

Page 140: 40 Best Machine Code Routines for C64

33. DERROR

This routine allows you to read the disk error channel in direct mode or during a program.

It replaces the following BASIC program:

10 OPEN15,8,15 20 INPUT # 15,A$,B$,C$,O$,E$ 30 PRINT A$;B$;C$;O$;E$ 40 CLOSE15

The syntax is SYS 16384

PAL (C) 1979 BRAD TEMPLETON 2 20: 41600 30: 41600 40: 41600 ST ~0: 41600 DEVNUM 60: 41600 SECADR 70: 41600 IECTALK 80: 41600 SEND SEC 90: 41600 IECINP 100: 41600 PRINT 110: 41600 UNTALI<

J ;DERROR J

150: 41600 A9 00 160: 41602 85 90 170: 41604 A9 08 180: 41606 85 BA 190: 41608 20 B4 FF 200: 4160B A9 6F

.OPT P,OO *= 54000 = $90 .. SBA = SB9 .. 5FFB4 = SFF96 = 5FFA~

= SFFD2 = SFFAB

COMMAND

LDA #0 STA ST LDA #8 STA DEVNUM JSR IECTALK LDA #S6F

141

Page 141: 40 Best Machine Code Routines for C64

2UJ: 4BBD 85 B9 STA SECADR 22B: 4BBF 2B 96 FF JSR SEND SEC 23B: 4B12 A4 9B LOOP LDY ST 24B: 4B14 DB BA BNE DERR4 25B: 4B16 2B A5 FF JSR IECINP 26B: 4B19 2B D2 FF JSR PRINT 27B: 4B1C C9 BD CMP 113 28B: 4B1E DB F2 BNE LOOP 29B: 4B2B 2B AB FF DERR4 JSR UNTALK 3BB: 4B23 6B RTS ]4BBB-4024

READY.

B* PC SR AC XR YR SP

• ; 97FE 72 BB BB B1 F6

4BBB A9 BB LDA ISBB 4BB2 85 9B STA S9B 4BB4 A9 B8 LDA ISB8 4""6 85 BA STA SBA 4BB8 2" B4 FF JSR SFFB4 4"BB A9 6F LDA IS6F 4"BD 85 B9 STA SB9 4"BF 2" 96 FF JSR SFF96 4B12 A4 9B LDY S9B 4B14 DB BA BNE S4B2" 4B16 2B A5 FF JSR SFFA5 4B19 2B D2 FF JSR SFFD2 4B1C C9 "D CMP IS"D 4B1E DB F2 BNE 54B12 4B2B 2B AB FF JSR SFFAB 4B23 6B RTS

142

Page 142: 40 Best Machine Code Routines for C64

34. Scroll message

This routine allows a message to be scrolled across the screen independently of anything else. This could be useful during the introduction to a game, for example.

The text to be scrolled across can be a ny length from 1 charac­ter onwards. The text must end with a $FF (255) byte to tell the routine to start from the beginning again.

Three parameters are required by the routine: the start location of the text in memory, the rate of scrolling and the colour of the text. If for example you wanted one new letter to appear on the screen once every sixth of a second then the rate would be 10 (as 10/60 is one sixth).

The syntax is as follows:

SYS 16384,start of text,rate,colour

PAL (C) 1979 BRAD TEMPLETON 2 2m: 4m"" .OPT P,OO 3": 4m"" *= $4"""

5": 4""" 2" FD AE JSR $AEFD

6": 4""3 2" 8A AD JSR $AD8A

7": 4m"6 2" F7 B7 JSR $B7F7

90: 4m"9 A5 14 LDA $14 1m,,: 4""B 85 FB STA $FB

143

Page 143: 40 Best Machine Code Routines for C64

100: 400D 8D 96 40 STA TEMPF B 110: 4010 A5 15 LDA S15 120: 4012 85 FC STA SFC 120: 4014 8D 97 40 STA TEMPF C

140: 4017 20 FD AE JSR SAEFD

150: 401A 20 9E B7 JSR SB79E

160: 401D 8A TXA 170: 401E 8D 95 40 STA TEMP 180: 4021 8D 94 40 STA COUNT ER 190: 4024 20 FD AE JSR SAEFD

200: 4027 20 9E B7 JSR SB79E

210: 402A 8E 98 40 STX COLOU R

230: 402D 78 SEI 240: 402E A9 3A LDA .. <MAl N 250: 4030 8D 14 03 STA 788 260: 4033 A9 40 LDA .. >MAI N 270: 4035 8D 15 03 STA 789 280: 4038 58 CLI 290: 4039 60 RTS

320: 403A CE 94 40 MAIN DEC COUNT ER 330: 403D D0 38 BNE FINIS H

350: 403F AD 95 40 LDA TEMP 360: 4042 8D 94 40 STA COUNT ER

144

Page 144: 40 Best Machine Code Routines for C64

37~: 4045 A2 00 LDX #0 380: 4047 BD 99 07 LOOP LDA 1945, X 390: 404A 9D 98 07 STA 1944, X 400: 404D BD 99 DB LDA 1945+ 54272,X 410: 4050 9D 98 DB STA 1944+ 54272,X 420: 4053 E8 INX 430: 4054 E0 27 CPX #39 440: 4056 D0 EF BNE LOOP

460: 4058 A0 00 LDY #0 470: 405A B1 FB LDA ($FB) ,Y 480: 405C C9 3F CMP #63 481 : 405E B0 03 BCS SUBTR

482: 4060 4C 66 40 JMP PUTON

483: 4063 38 SUBTR SEC 484: 4064 E9 40 SBC #64 500: 4066 8D BF 07 PUTON STA 1983 510: 4069 20 7A 40 JSR INCRE MENT 520: 406C A5 FC LDA $FC 530: 406E 18 CLC 540: 406F 69 D4 ADC #212 550: 4071 AD 98 40 LDA COLOU R 560: 4074 8D BF DB STA 1983+ 54272

580: 4077 4C 31 EA FINISH JMP $EA31

590: 407A E6 FB INCREMENTINC $FB 600: 407C D0 02 BNE CHECK

610: 407E E6 FC INC $FC

145

Page 145: 40 Best Machine Code Routines for C64

630: 4080 A0 00 CHECK LDY H0 640: 4082 B1 FB LDA (SFB) ,Y 650: 4084 C9 FF CMP HSFF 660: 4086 F0 01 BEG! RESET

670: 4.088 60 RTS 680: 4089 AD 96 40 RESET LDA TEMPF B 690: 4.08C 85 FB STA .FB 7.00: 4.08E AD 97 4.0 LDA TEMPF C 710: 4091 85 FC STA .FC 720: 4.093 6.0 RTS 730: 4.094 .0.0 COUNTER .BYT 0 740: 4095 00 TEMP .BYT 0 750: 4096 .0.0 TEMPFB .BYT 0 760: 4.097 0.0 TEMPFC .BYT 0 77.0: 4098 .00 COLOUR .BYT 0 7~0: 4099 48 45 4C .ASC "HELL 0 I AM A CBM 64 MICRO-" 790: 40B3 43 4F 4D .ASC "COMP UTER AND I AM 64 " 8.00: 40C8 FF .BYT .FF J40.00-4.0C9

B* PC SR AC XR YR SP

• ; 97FE 72 .0.0 .0.0 40 F6

4.0.0.0 2.0 FD AE JSR .AEFD 4.0.03 2.0 8A AD JSR $AD8A 40.06 2.0 F7 B7 JSR .B7F7 4.0.09 A5 14 LDA .14 40.0B 85 FB STA .FB 4.0.0D 8D 96 40 STA $4.096 4.01.0 A5 15 LDA 515 4.012 85 FC STA SFC

146

Page 146: 40 Best Machine Code Routines for C64

4014 8D 97 40 STA $4097 4017 20 FD AE JSR $AEFD 401A 20 9E B7 JSR $B79E 401D 8A TXA 401E 8D 95 40 STA $4095 4021 8D 94 40 STA $4094 4024 20 FD AE JSR $AEFD 4027 20 9E B7 JSR $B79E 402A 8E 98 40 STX $4098 402D 78 SEI 422E A9 3A LDA "$3A 4032 8D 14 23 STA $2314 4233 A9 42 LDA "$40 4035 8D 15 23 STA 52315 4238 58 CLI 4039 62 RTS 423A CE 94 40 DEC $4094 403D D2 38 BNE 54277 423F AD 95 40 LDA $4295 4042 8D 94 40 STA 54294 4045 A2 22 LDX "$00 4247 BD 99 27 LDA $2799, X 404A 9D 98 27 STA $2798, X 424D BD 99 DB LDA 5DB99,X 4252 9D 98 DB STA $DB98,X 4053 E8 INX 4254 E2 27 CPX "$27 4256 D2 EF BNE $4047 4258 A2 22 LDY "$20 425A B1 FB LDA ($FB),Y 425C C9 3F CMP "$3F 405E B2 23 BCS 54263 4262 4C 66 40 JMP $4066 4063 38 SEC 4264 E9 40 SBC "$40 4266 8D BF 27 STA $27BF 4269 22 7A 40 JSR $427A 426C A5 FC LDA $FC 426E 18 CLC 406F 69 D4 ADC "$D4 4271 AD 98 40 LDA $4098

147

Page 147: 40 Best Machine Code Routines for C64

4S74 SD BF DB STA $DBBF 4S77 4C 31 EA JMP $EA31 4S7A E6 FB INC $FB 4S7C DS S2 BNE $4SSS 4S7E E6 FC INC $FC 4SSS AS SS LDY "$SS 4SS2 B1 FB LDA (SFB),Y 4SS4 C9 FF CMP ... FF 4SS6 FS S1 BEGl $4SS9 4SSS 6S RTS 4SS9 AD 96 4S LDA $4S96 4SSC S5 FB STA $FB 4SSE AD 97 4S LDA $4S97 4S91 S5 FC STA $FC 4S93 6S RTS

• : 4S94 SS SS SS Sta flJta 4S 45 4C • : 4S9C 4C 4F 2S 49 2ta 41 4D 2ta • : 4taA4 41 2ta 43 42 4D 2ta 36 34 • : 4SAC 2ta 4D 49 43 :52 4F 2D 43 • : 4taB4 4F 4D 5ta 55 :54 45 52 2S • : 4SBC 41 4E 44 2ta 49 2ta 41 4D • : 4taC4 2ta 36 34 2ta FF AD 37 41

148

Page 148: 40 Best Machine Code Routines for C64

35. Flash screen

This routine allows you to flash the screen colour from one colour to another at a specified rate.

The syntax is as follows:

SYS 16384,colour1,colour2,rate

where colour1 is the first colour, colour2 is the second and rate is the number of 60ths of a second between flashes, e.g. 10 is 1/6 second. Setting the rate to 0 switches off the flash.

PAL (C) 1979 BRAD TEMPLETON 2 2B: 4BBB .OPT P,OO 3B: 4BBB *= S4BBB

~YNTAX

SYSFLASH,COLOUR1, COLOUR2,NO OF CHANGES A SECOND

5B: 4BflJB 2B FD AE JSR SAEFD 7B: 4BflJ3 2B 8A AD JSR SAD8A 8flJ: 4flJflJ6 2flJ F7 B7 JSR SB7F7 9flJ: 4 flJflJ 9 A5 15 LDA S15 9B: 4BflJB FB B3 BEG! MORE 9B: 4flJBD 4C 48 B2 JMP SB248 IBB: 4flJIB A5 14 MORE LDA S14 IB1: 4flJ12 8D 8E 4B STA TEMP IflJ2: 4B15 2B FD AE JSR SAEFD llB: 4flJ18 2B 8A AD JSR SAD8A 12flJ: 4flJIB 2B F7 B7 JSR SB7F7 13flJ: 4flJIE A5 15 LDA S15

149

Page 149: 40 Best Machine Code Routines for C64

149: 4929 F9 93 BEG! MOREl 159: 4922 4C 48 B2 JMP $B248 169: 4925 A5 14 MOREl LDA $14 179: 4927 8D 8F 49 STA TEMP+l 189: 492A 29 FD AE JSR $AEFD 199: 492D 29 8A AD JSR $AD8A 299: 4939 29 F7 B7 JSR $B7F7 219: 4933 A5 15 LDA $15 229: 4935 F9 93 BEG! MORE2 239: 4937 4C 48 B2 JMP $B248 249: 493A A5 14 MORE2 LDA $14 249: 493C F9 43 BEG! RESET 259: 493E 8D 99 49 STA TEMP+2 259: 4941 78 SEI 269: 4942 A9 54 LDA I<MAIN 279: 4944 8D 14 93 STA 788 289: 4947 A9 49 ) LDA I>MAIN 299: 4949 8D 15 93 STA 789 399: 494C 58 CLI 319: 494D AD 99 49 LDA TEMP+2 319: 4959 8D 91 49 STA TEMP+3 329: 4953 69 RTS 339: 4954 MAIN = * 349: 4954 CE 91 49 DEC TEMP+3 359: 4957 D9 25 BNE FINISH 369: 4959 AD 21 D£I LDA 53281 369: 495C 29 9F AND 115 379: 495E CD 8F 49 CMP TEMP+l 389: 4961 F9 9F BEG! D09 399: 4963 AD 8F 49 LDA TEMP+l 499: 4966 8D 21 D9 STA 53281 499: 4969 AD 9S 4" LDA TEMP+2 499: 4S6C 8D 91 4" STA TEMP+3 419: 496F 4C 7E 49 JMP FINISH 429: 4S72 AD 8E 49 D09 LDA TEMP 439: 4975 8D 21 D9 STA 53281 449: 4978 AD 9S 49 LDA TEMP+2 449: 497B 8D 91 4" STA TEMP+3 459: 4"7E 4C 31 EA FINISH JMP $EA31 46": 4"81 78 RESET SEI 47": 4"82 A9 31 LDA 149

150

Page 150: 40 Best Machine Code Routines for C64

48B: 4B84 8D 14 B3 STA 788 49B: 4B87 A9 EA LDA .. 234 5BB: 4B89 8D 15 B3 STA 789 51B: 4B8C 58 CLI 52B: 4B8D 6B RTS 53B: 4"8E TEMP = * 14"BB-4B8E

READY.

B* PC SR AC XR YR SP

• ; 97FE 72 BB BB 4B F6

4"B" 2" FD AE JSR $AEFD 4""3 2" 8A AD JSR $AD8A 4""6 2B F7 B7 JSR SB7F7 4BB9 A5 15 LDA S15 4BBB FB B3 BEG! S4B1B 4BBD 4C 48 B2 JMP SB248 4B1" A5 14 LDA S14 4"12 8D 8E 4" STA S4B8E 4"15 2B FD AE JSR SAEFD 4"18 2B 8A AD JSR SAD8A 4"1B 2B F7 B7 JSR SB7F7 4"1E A5 15 LOA S15 4B2" FB "3 BEG! S4B25 4B22 4C 48 B2 JMP SB248 4B25 A5 14 LDA $14 4"27 8D 8F 4" STA S4"8F 4B2A 2B FD AE JSR SAEFD 4B2D 2B 8A AO JSR SAD8A 4B3B 2B F7 B7 JSR SB7F7 4"33 A5 15 LOA .15 4B35 FB "3 BEG! S4B3A 4B37 4C 48 B2 JMP SB248

151

Page 151: 40 Best Machine Code Routines for C64

4"3A A5 14 lDA 514 4"3C F" 43 BEG! 54"81 4"3E 8D 9" 4" STA 54"9" 4"41 78 SEI 4"42 A9 54 lDA .. 554 4"44 8D 14 "3 STA 5"314 4"47 A9 4" lDA "54" 4"49 8D 15 "3 STA 5"315 4"4C 58 ClI 4"4D AD 9" 4" lDA 54"9" 4"5" 8D 91 4" STA 54"91 4"53 6" RTS 4"54 CE 91 4" DEC 54"91 4"57 D" 25 BNE S4"7E 4"59 AD 21 D" lDA SD"21 4"5C 29 "F AND "$"F 4"5E CD 8F 4" CMP S4"8F 4"61 F" "F BEG! $4"72 4"63 AD 8F 4" lDA $4"8F 4"66 8D 21 D" STA SD"21 4"69 AD 9" 4" lDA $4"9" 4"6C 8D 91 4" STA $4"91 4"6F 4C 7E 4" JMP S4"7E 4"72 AD 8E 4" lDA $4"8E 4"75 8D 21 D" STA $D"21 4"78 AD 9" 4" LDA S4"9" 4"7B 8D 91 4" STA $4"91 4"7E 4C 31 EA JMP $EA31 4"81 78 SEI 4"82 A9 31 LDA .. 531 4"84 8D 14 "3 STA 5"314 4"87 A9 EA LDA .. SEA 4"89 8D 15 "3 STA $"315 4"8C 58 ClI 4"8D 6" RTS

152

Page 152: 40 Best Machine Code Routines for C64

36. Flash border

This routine does the same as the flash screen routine except that the border is flashed.

The syntax is as follows:

SYS16384,colour1,colour2,rate

Setting the rate to 0 turns off the flash.

PAL (C) 1979 BRAD TEMPLETON 2 20: 4000 .OPT P,OO 30: 4SSS *= S4S0S

SYNTAX 3YSFLASH,COLOUR1, COLOUR2,NO OF CHANGES A SECOND

50: 4SSS 2S FD AE JSR SAEFD 70: 4SS3 2S 8A AD JSR SAD8A 80: 4SS6 2S F7 B7 JSR SB7F7 9S: 4S09 A5 15 LDA S15 90: 4SSB FS 03 BEG! MORE 90: 4SSD 4C 48 B2 JMP SB248 100: 4S1S A5 14 MORE LDA S14 101 : 4S12 8D 8E 4S STA TEMP 102: 4S15 2S FD AE JSR SAEFD l1S: 4018 20 8A AD JSR SAD8A 120: 4S1B 20 F7 B7 JSR SB7F7 130: 4S1E A5 15 LDA S15 140: 4S2S FS 03 BEG! MOREl 15S: 4S22 4C 48 B2 JMP SB248

153

Page 153: 40 Best Machine Code Routines for C64

160: 4025 A5 14 MOREl LDA S14 170: 4027 8D 8F 40 STA TEMP+l 180: 402A 20 FD AE JSR SAEFD 190: 402D 20 8A AD JSR SAD8A 200: 4030 20 F7 B7 JSR SB7F7 210: 4033 A5 15 LDA S15 220: 4035 F0 03 BEG! MORE2 230: 4037 4C 48 B2 JMP SB248 240: 403A A5 14 MORE2 LDA S14 240: 403C F0 43 BEG! RESET 250: 403E 8D 90 40 STA TEMP+2 250: 4041 78 SEI 260: 4042 A9 54 LDA .. <MAIN 270: 4044 8D 14 03 STA 788 280: 4047 A9 40 LDA .. >MAIN 290: 4049 8D 15 03 STA 789 300: 404C 58 CLI 310=- 404D AD 90 40 LDA TEMP+2 310: 4050 8D 91 40 STA TEMP+3 320: 4053 60 RTS 330: 4054 MAIN = * 340: 4054 CE 91 40 DEC TEMP+3 350: 4057 D0 25 BNE FINISH 360: 4059 AD 20 D0 LDA 53280 360: 405C 29 0F AND .. 15 370: 405E CD 8F 40 CMP TEMP+l 380: 4061 F0 0F BEG! D00 390: 4063 AD 8F 40 LDA TEMP+1 400: 4066 8D 20 D0 STA 53280 400: 4069 AD 90 40 LDA TEMP+2 400: 406C 8D 91 40 STA TEMP+3 410: 406F 4C 7E 40 JMP FINISH 420: 4072 AD 8E 40 D00 LDA TEMP 430: 4075 8D 20 D0 STA 53280 440: 4078 AD 90 40 LDA TEMP+2 440: 407B 8D 91 40 STA TEMP+3 450: 407E 4C 31 EA FINISH JMP SEA31 460: 4081 78 RESET SEI 470: 4082 A9 31 LDA .. 49 480: 4084 8D 14 03 STA 788 490: 4087 A9 EA LDA .. 234

154

Page 154: 40 Best Machine Code Routines for C64

588: 4889 8D 15 83 STA 789 518: 488C 58 CLI 528: 488D 68 RTS 538: 488E TEMP = * l4888-488E

READY.

B* PC SR AC XR YR SP

• ; 97FE 72 88 88 4.9 F6

4888 28 FD AE JSR SAEFD 4883 28 8A AD JSR SAD8A 48.96 28 F7 B7 JSR SB7F7 4889 A5 15 LDA SH5 488B F8 83 BEG! $4818 488D 4C 48 B2 JMP $B248 4818 A5 14 LDA $14 4812 8D 8E 48 STA S488E 4"15 28 FD AE JSR SAEFD 4818 28 8A AD JSR $AD8A 481B 28 F7 B7 JSR $B7F7 481E A5 15 LDA $15 4828 F8 83 BEG! $4825 4822 4C 48 B2 JMP $B248 4825 A5 14 LDA $14 4827 8D 8F 48 STA $488F 482A 28 FD AE JSR $AEFD 482D 28 8A AD JSR $AD8A 4838 28 F7 B7 JSR $B7F7 4833 A5 15 LDA $15 4835 F8 83 BEG! $483A 4837 4C 48 B2 JMP $B248 483A A5 14 LDA $14 483C F8 43 BEG! S4881 483E 8D 98 48 STA S4898

155

Page 155: 40 Best Machine Code Routines for C64

4041 78 SEI 4042 A9 54 LDA "$54 4044 8D 14 03 STA $0314 4047 A9 40 LDA "$40 4049 8D 15 03 STA $0315 404C 58 CLI 404D AD 90 40 LDA $4090 4050 8D 91 40 STA $4091 4053 60 RTS 4054 CE 91 40 DEC $4091 4057 D0 25 BNE $407E 4059 AD 20 D0 LDA $D020 405C 29 0F AND "$0F 405E CD 8F 40 CMP $408F 4061 F0 0F BEG! $4072 4063 AD 8F 40 LDA $408F 4066 8D 20 D0 STA $D020 4069 AD 90 40 LDA $4090 406C 8D 91 40 STA $4091 406F 4C 7E 40 JMP $407E 4072 AD 8E 40 LDA $408E 4075 8D 20 D0 STA $D020 4078 AD 90 40 LDA $4090 407B 8D 91 40 STA $4091 407E 4C 31 EA JMP $EA31 4081 78 SEI 4082 A9 31 LDA "$31 4084 8D 14 03 STA $0314 4087 A9 EA LDA "$EA 4089 8D 15 03 STA $0315 408C 58 ell 408D 60 RTS

156

Page 156: 40 Best Machine Code Routines for C64

37. Flash characters

This routine flashes (or reverses) all the characters on the screen at a specified rate.

The syntax is as follows:

SYS 16384,rate

Setting the rate to 0 turns off the flash.

PAL (C) 1979 BRAD TErrlPLETON 2 20: 4000 .OPT P,OO 30: 4000 *= $4000

;SYNTAX FLASH 1 OR ;0

70: 4000 20 FD AE JSR $AEFD

80: 4003 20 8A AD JSR $AD8A

90: 4006 20 F7 B7 JSR $B7F7

100: 4009 AS 14 LDA $14 110: 400B F0 13 BEG! RESET

120: 400D 8D 67 40 STA TEMP 120: 4010 8D 68 40 STA TEMP+ 1 130: 4013 78 SEl 140: 4014 A9 2D LDA .. <MAl N

157

Page 157: 40 Best Machine Code Routines for C64

150: 4016 8D 14 03 STA 788 160: 4019 A9 40 LDA H>MAI N 170: 401B 8D 15 03 STA 789 180: 401E 58 CLI 190: 401F 60 RTS 200: 4020 78 RESET SEI 220: 4021 A9 31 LDA H49 230: 4023 8D 14 03 STA 788 240: 4026 A9 EA LDA H234 250: 4028 8D 15 03 STA 789 260: 402B 58 CLI 270: 4.02C 60 RTS 290: 4.02D CE 68 40 MAIN DEC TEMP+ 1 300: 4030 F0 03 BEG! MORE 3'10: 4032 4C 31 EA JMP $EA31

320: 4035 AD 67 40 MORE LDA TEMP 330: 4.038 8D 68 40 STA TEMP+ 1

; INVERT CHARACTERS

370: 403B A2 00 LDX H0 380: 403D BD 00 04 LOOP LDA 1024, X 390: 4040 18 CLC 400: 4041 69 80 ADC H128 410: 4043 9D 00 04 STA 1024, X

430: 4046 BD FF 04 LDA 1024+ 255,X 440: 4049 18 CLC 450: 404A 69 80 ADC H128 460: 404C 9D FF 04 STA 1024+ 255,X

480: 404F BD FE 05 LDA 1024+

158

Page 158: 40 Best Machine Code Routines for C64

255+255, X 490: 4052 18 CLC 500: 4053 69 80 ADC #128 510: 4055 9D FE 05 STA 1024+ 255+255, X

530: 4058 BD FD 06 LDA 1024+ 255+255+255,X 540: 405B 18 CLC 550: 405C 69 80 ADC #128 560: 405E 9D FD 06 STA 1024+ 255+255+255,X 570: 4061 E8 INX 580: 4062 D0 D9 BNE LOOP 590: 4064 4C 31 EA JMP SEA31

600: 4067 TEMP = it-

]4000-4067

READY.

B* PC SR AC XR YR SP

.197FE 72 1616 f6flJ 416 F6

4flJflJf6 216 FD AE JSR $AEFD 4f6flJ3 216 8A AD JSR SAD8A 4flJflJ6 2flJ F7 B7 JSR $B7F7 40flJ9 A5 14 LDA S14 4f6flJB FflJ 13 BE6I S4flJ2flJ 4f6flJD 8D 67 4flJ STA S4flJ67 4flJlflJ 8D 68 4flJ STA S4flJ68 41613 78 SEI 41614 A9 2D LDA #S2D 4flJ16 8D 14 flJ3 STA SflJ314 4flJ19 A9 4flJ LDA ttS4flJ 4flJIB 8D 15 flJ3 STA SflJ315 4flJIE 58 eLI

159

Page 159: 40 Best Machine Code Routines for C64

401F 616 RTS 40216 78 SEI 4021 A9 31 LDA "$31 4823 8D 14 163 STA $16314 4826 A9 EA LDA "$EA 4828 8D H5 163 STA $16313 402B 38 CLI 402C 616 RTS 402D CE 68 416 DEC S4f668 48316 Ff6 163 BEQ S4f635 4032 4C 31 EA JMP SEA31 4.033 AD 67 416 LDA S4f667 4838 8D 68 416 STA 541668 483B A2 1616 LDX ... 1616 483D BD 1616 164 LDA Sf64f6f6,X 48416 18 CLC 4.041 69 816 ADC "$816 4843 9D 1616 164 STA Sf64f6f6,X 4.046 BD FF 164 LDA $f64FF,X 4.049 18 CLC 4.04A 69 816 ADC ... 816 484C 9D FF 164 STA Sf64FF,X 4.04F BD FE 163 LDA Sf63FE,X 4.052 18 CLC 4.053 69 816 ADC .. S8f6 4.035 9D FE 163 STA 5f63FE,X 4.038 BD FD 166 LDA .f66FD, X 4.03B 18 CLC 4.03C 69 816 ADC ... 816 4.03E 9D FD 166 STA Sf66FD, X 4.061 E8 INX 4.062 Df6 D9 BNE 54f63D 4.064 4C 31 EA JMP .EA31 4867 216 Df6 AD JSR SADDf6

160

Page 160: 40 Best Machine Code Routines for C64

38. Flash colour

This routine flashes the colour of the characters between two specified colours at a specified rate.

The syntax is as follows:

SYS 16384,colourl,colour2,rate

A rate of zero turns off the flash.

PAL IC) 1979 BRAD TEMPLETON 2 20: 4000 .OPT P,OO 3": 400" *= S40"0

; SYNTAX SYSFLASH,COLOURI ,COLOUR2,NO OF CHANGES A SECOND

80: 4000 20 FD AE .JSR SAEFD

90: 4003 20 8A AD .JSR SAD8A

100: 4006 20 F7 B7 .JSR SB7F7

110: 4009 A5 15 LDA S15 110: 400B F0 03 BEQ MORE 110: 400D 4C 48 B2 .JMP SB248

120: 4010 A5 14 MORE LDA S14 130: 4012 aD A5 40 STA TEMP 140: 4015 20 FD AE .JSR SAEFD

161

Page 161: 40 Best Machine Code Routines for C64

15": 4"18 2" 8A AD JSR $AD8A

16": 4"lB 2" F7 B7 JSR $B7F7

17": 4"lE A5 15 LDA $15 18": 4"2m F" m3 BEQ MOREl

19": 4m22 4C 48 B2 JMP $B248

2"": 4m25 A5 14 MOREl LDA $14 21": 4"27 8D A6 4" STA TEMP+ 1 22m: 4"2A 2m FD AE JSR $AEFD

23": 4m2D 2" 8A AD JSR $AD8A

24": 4m3m 2" F7 B7 JSR $B7F7

25": 4m33 A5 15 LDA $15 26": 4m35 Fm "3 BEQ MORE2

27m: 4m37 4C 48 B2 JMP $B248

28": 4m3A A5 14 MORE2 LDA $14 28": 4m3C Fm 59 BEQ RESET

29m: 4"3E 8D A7 4" STA TEMP+ 2 29": 4"41 78 SEI 3"": 4.042 A9 54 LDA #<MAI N

31": 4.044 8D 14 m3 STA 788 32.0: 4.047 A9 4m LDA #>MAI N 33": 4"49 8D 15 m3 STA 789 34.0: 4m4C 58 CLI 35m: 4.04D AD A7 4" LDA TEMP+ 2 35": 4.05.0 8D A8 4" STA TEMP+ 3 36": 4.053 6.0 RTS

162

Page 162: 40 Best Machine Code Routines for C64

370: 4054 MAIN = * 380: 4054 CE A8 40 DEC TEMP+ 3 390: 4057 D0 29 BNE FINIS H 400: 4059 AD A4 40 LDA STORE

410: 405C CD A6 40 CMP TEMP+ 1 42": 405F F0 12 BEG! D00

440: 4061 AD A6 40 LDA TEMP+ 1 450: 4.064 8D A4 40 STA STORE

460: 4.067 20 85 40 JSR FILL 470: 4.06A AD A7 40 LDA TEMP+ 2 480: 4.06D 8D A8 40 STA TEMP+ 3 490: 4.070 4C 82 40 JMP FINIS H

510: 4.073 AD A5 40 D00 LDA TEMP 520: 4.076 8D A4 40 STA STORE

530: 4.079 20 85 40 JSR FILL 540: 4.07C AD A7 40 LDA TEMP+ 2 550: 4.07F 8D A8 40 STA TEMP+ 3

570: 4082 4C 31 EA FINISH JMP $EA31

590: 4S85 A2 00 FILL LDX tt0 600: 4S87 9D 00 D8 LOOP STA 55296 ,X 610: 4S8A 9D FF D8 STA 55296 +255,X 620: 4S8D 9D FE D9 STA 55296

163

Page 163: 40 Best Machine Code Routines for C64

+255+255,X 63.0: 4.09.0 9D FO OA STA 55296 +255+255+255,X 64.0: 4.093 E8 INX 65.0: 4.094 0.0 F1 BNE LOOP 66.0: 4.096 6.0 RTS

69.0: 4.097 78 RESET SEI 7.0.0: 4.098 A9 31 LDA #49 71.0: 4.09A 8D 14 .03 STA 788 72.0: 4.09D A9 EA LDA #234 73.0: 4.09F 8D 15 .03 STA 789 74.0: 4.0A2 58 eLI 75.0: 4.0A3 6.0 RTS 76.0: 4.0A4 .0.0 STORE .BYT .0 77.0: 4.0A5 TEMP = * 14.0.0.0-4.0A5

READY.

B* PC SR AC XR YR SP

• ,97FE 72 flJta flJta 4ta F6

4flJ.0flJ 28 FD AE JSR SAEFD 4883 2flJ 8A AD JSR SAD8A 4886 2flJ F7 B7 JSR SB7F7 4889 A5 15 LDA S15 48flJB F8 flJ3 BEG! S4.018 488D 4C 48 B2 JMP SB248 4818 A5 14 LDA S14 4812 8D A5 48 STA S48A5 4815 28 FD AE JSR SAEFD 4818 28 8A AD JSR SAD8A 481B 28 F7 B7 JSR SB7F7 481E A5 15 LDA S15 482ta F8 83 BEG! S4825

164

Page 164: 40 Best Machine Code Routines for C64

4022 4C 48 B2 JMP .B248 4025 A5 14 LDA 514 4027 8D A6 40 STA .40A6 402A 20 FD AE JSR 5AEFD 402D 20 8A AD JSR 5AD8A 4030 20 F7 B7 JSR 5B7F7 4033 A5 15 LDA .15 4035 F0 03 BEG! .403A 4037 4C 48 B2 JMP .B248 403A A5 14 LDA 514 403C F0 59 BEG! .4097 403E 8D A7 40 STA .40A7 4041 78 SEI 4042 A9 54 LDA ... 54 4044 8D 14 03 STA 50314 4047 A9 4" LDA ... 40 4049 8D 15 03 STA .0315 404C 58 CLI 404D AD A7 40 LDA '4"A7 4050 8D A8 40 STA '4"A8 4053 6" RTS 4054 CE A8 40 DEC '4"A8 4057 D" 29 BNE '4"82 4059 AD A4 4" LDA '4"A4 405C CD A6 4" CMP '4"A6 405F F0 12 BEQ .4073 4061 AD A6 4" LDA .40A6 4064 8D A4 4" STA '4"A4 4067 20 85 40 JSR .4085 406A AD A7 40 LDA '4"A7 406D 8D A8 40 STA .40A8 4"70 4C 82 4" JMP '4"82 4073 AD A5 40 LDA .40A5 4076 8D A4 40 STA .40A4 4079 20 85 40 JSR '4"85 4"7C AD A7 4" LDA .40A7 407F 8D A8 40 STA .40A8 4"82 4C 31 EA JMP 5EA31 4085 A2 0" LDX ... ,," 4"87 9D "" D8 STA 5D8"",X 4"8A 9D FF DB STA 5D8FF,X

165

Page 165: 40 Best Machine Code Routines for C64

4B8D 9D FE D9 STA $D9FE,X 4999 9D FD DA STA $DAFD,X 4B93 E8 INX 4994 DB F1 BNE $4B87 4B96 69 RTS 4B97 78 SEI 4998 A9 31 LDA ... 31 4B9A 8D 14 "3 STA .9314 499D A9 EA LDA ... EA 499F 8D 15 "3 STA .B315 49A2 58 eLI 49A3 6" RTS 49A4 "B BRI<

166

Page 166: 40 Best Machine Code Routines for C64

39. Print at

This routine allows you to print at any position on the screen without using lots of cursor controls.

The syntax is as follows:

SYS960,X, Y, "text"

X is the column to start at and is between 0 and 39. Y is the row to start at and is between 0 and 24. The text can be text in quotes, strings, numbers, variables or any other legal print statement.

PAL (C)1979 BRAD TEMPLETON 2 2.0: ,03C,0 .OPT P,OO 3.0: ,03C,0 *- 96.0

; IPRINT AT ROUTINE

6.0: 93C,0 2.0 FD AE JSR SAEFD 7.0: ,03C3 2.0 9E B7 JSR SB79E 8.0: 93C6 8A TXA 9.0: 93C7 48 PHA 1.0.0: 93C8 2.0 FD AE JSR SAEFD 11.0: 93CB 2.0 9E B7 JSR SB79E 12.0: 93CE 8A TXA 13.0: ,03CF A8 TAY 14.0: 93D,0 68 PLA H5,0: 93Dl AA TAX 16.0: 93D2 18 CLC 17.0: 93D3 2.0 F,0 FF JSR SFFF,0 18.0: 93D6 2.0 FD AE JSR SAEFD 19.0: .03D9 4C A,0 AA JMP SAAA,0

167

Page 167: 40 Best Machine Code Routines for C64

200: S3DC 00 l03C0-03DD

READY.

B* PC

• ; 97FE

S3C0 20 03C3 20 03C6 8A 03C7 48 03C8 20 03CB 20 03CE 8A 03CF A8 03D0 68 03D! AA 03D2 18 03D3 20 03D6 20 03D9 4C 03DC 00

168

BRK

SR AC XR YR SP 72 00 00 40 F6

FD AE JSR SAEFD 9E B7 JSR SB79E

lXA PHA

FD AE JSR SAEFD 9E B7 JSR SB79E

lXA lAY PLA lAX CLC

F0 FF JSR SFFF0 FD AE JSR SAEFD A0 AA JMP SAAA0

BRK

Page 168: 40 Best Machine Code Routines for C64

40. Split screen

This routine sets up a raster scan that allows the text and high res screen to coexist at the same time. You can specify where the cut is to take place and whether text or high res is at the top.

The syntax is as follows:

SYS 16384, line for change, option

where line is the line down the screen (the same as the Y coordinates for plot) and option is 1 for the text to be at the top and 0 for the text to be at the bottom. If line has the value o then the raster is switched off. The line number must be in the range 50 to 249.

PAL (C) 1979 BRAD TEMPLETON 2 20: 4000 .OPT P,OO 30: 4000 *= .4000

; ;RASTER TO ALLOW SPLIT ;SCREENS ; SYNTAX

;SYS16384,CHANGE,1= ;TEXT/0=HIRES

110: 4000 20 FD AE JSR .AEFD 120: 4003 20 8A AD JSR .AD8A 130: 4006 20 F7 B7 JSR .B7F7

150: 4009 A5 15 LDA .15 160: 400B D0 2B BNE I GlERR 170: 400D A5 14 LDA .14 180: 400F D0 03 BNE MOR 180: 4011 4C A5 40 JMP RESET

169

Page 169: 40 Best Machine Code Routines for C64

190: 4014 C9 31 MaR CMP tt49 200: 4016 90 20 BCC IGiERR 210: 4018 C9 FA CMP tt250 220: 401A B0 lC BCS IGiERR 230: 401C 8D FE 40 STA TEMP

250: 401F 20 FD AE JSR 'AEFD 260: 4022 20 8A AD JSR .AD8A 270: 4025 20 F7 B7 JSR .B7F7 280: 4028 A5 15 LDA .15 290: 402A D0 0C BNE IGiERR 300: 402C A5 14 LDA .14 310: 402E C9 02 CMP tt2 320: 4030 B0 06 BCS IG!ERR 330: 4032 8D FF 40 STA TEMP+l 340: 4035 4C 3B 40 JMP MORE 350: 4038 4C 48 B2 IG!ERR JMP .B248 360: 403B AD FE 40 MORE LDA TEMP 370: 403E 8D F8 40 STA RASTER 380: 4041 AD FF 40 LDA TEMP+l 390: 4044 C9 01 CMP ttl 400: 42146 F0 17 BEG! TEXTTOP 410: 4048 A9 0S LDA tt8 410: 404A A2 15 LDX tt21 420: 404C SD FA 40 STA TEXT 420: 404F 8E FB 40 STX TEXT+l 430: 4052 A9 3B LDA tt59 430: 4054 A2 IB LDX tt27 440: 4056 8D FC 40 STA HIRES 440: 4059 8E FD 40 STX HIRES+l 450: 405C 4C 73 40 JMP SETUP 460: 4"5F A9 15 TEXT TOP LDA tt21 460: 4061 A2 0S LDX tts 470: 4063 8D FA 40 STA TEXT 470: 4066 8E FB 40 STX TEXT+l 4S0: 4069 A9 IB LDA tt27 4S0: 406B A2 3B LDX tt59 490: 406D 8D FC 40 STA HIRES 490: 4070 8E FD 40 STX HIRES+l

; 510: 4073 SETUP = * 170

Page 170: 40 Best Machine Code Routines for C64

529: 4973 78 SEI 539: 4974 A9 7F LDA .. S7F 549: 4976 8D 9D DC STA SDC9D 559: 4"79 A9 91 LDA .. S91 569: 497B 8D lA D9 STA SD91A 579: 497E A9 92 LDA ... 92 589: 4989 85 FB STA SFB 599: 4982 AD F8 49 LDA RASTER 699: 4985 8D 12 D9 STA SD912 619: 4988 A9 18 LDA ... 18 629: 498A 8D 11 D9 STA SD911 639: 498D AD 14 93 LDA S9314 649: 4999 8D F6 49 STA FIN-2 659: 4993 AD 15 93 LDA S9315 669: 4996 8D F7 49 STA FIN-l 679: 4999 A9 C6 LDA .. <MAIN 689: 499B 8D 14 93 STA 788 699: 499E A9 49 LDA .. >MAIN 799: 49A9 8D 15 93 STA 789 719: 49A3 58 CLI 729: 49A4 69 RTS 739: 49A5 78 RESET SEI 739: 49A6 A9 31 LDA .. 49 749: 49A8 8D 14 93 STA 788 759: 49AB A9 EA LDA .. 234 759: 49AD 8D 15 93 STA 789 769: 49B9 A9 15 LDA .. 21 769: 49B2 8D 18 D9 STA 53272 779: 49B5 A9 lB LDA .. 27 779: 49B7 8D 11 D9 STA 53265 789: 49BA A9 99 LDA .. 9 789: 49BC 8D lA D9 STA .D91A 799: 49BF A9 89 LDA .. 128 799: 49Cl 8D 9D DC STA 56333 899: 4BC4 58 CLI 899: 49C5 69 RTS 819: 4BC6 AD 19 DB MAIN LDA SD919 829: 4BC9 8D 19 DB STA SD919 839: 49CC 29 91 AND .. S91 849: 49CE F9 IF BEG! LOOP 859: 49D9 C6 FB DEC SFB

171

Page 171: 40 Best Machine Code Routines for C64

86": 40D2 1" "4 BPL LOOP9 8''': 4"D4 A9 "1 LDA #S"l 88": 4"D6 85 FB STA SFB 89": 4"D8 A6 FB LOOP9 LDX SFB 9"": 4"DA BD F8 4" LDA RASTER, X 91": 4"DD 8D 12 D" STA SD"12 92": 4"E" BD FA 40 LDA TEXT,X 93": 4"E3 8D 18 D" STA 532'2 94": 4"E6 BD Fe 40 LDA HIRES,X 95": 4"E9 8D 11 D" STA SD"ll 96": 40EC 8A TXA 9''': 4"ED F" "6 BEG! LOOPl 98": 4"EF 68 LOOP PLA 990: 4"F" A8 TAY 10"0: 4"Fl 68 PLA 1010: 4"F2 AA TAX 1020: 4"F3 68 PLA 103": 40F4 4" RTI 1040: 40FS 4C 31 EA LOOPl JMP SEA31 1"4": 4"F8 FIN = * 10S0: 40F8 96 "0 RASTER .BYT 150,0 1060: 4"FA "8 15 TEXT .BYT 8,21 10'0: 40FC 3B IB HIRES .BYT 59,2' 1"8": 40FE "" 00 TEMP • WORD" ]4000-41"0

READY.

4000 2" FD AE JSR SAEFD 40"3 2" 8A AD JSR $AD8A 4"06 2" F' B' JSR $B'F' 4""9 A5 15 LDA S15 4""B D0 2B BNE 54"38 400D AS 14 LDA $14 400F D" 03 BNE $4014 4011 4C A5 40 JMP 54"A5 4014 C9 31 CMP #531

172

Page 172: 40 Best Machine Code Routines for C64

4016 90 20 BCC S4038 4018 C9 FA CMP ttSFA 401A B0 1C BCS S4038 401C 8D FE 40 STA S40FE 401F 20 FD AE JSR SAEFD 4022 20 8A AD JSR SAD8A 4025 20 F7 B7 JSR SB7F7 4028 A5 15 LDA S15 402A D0 0C BNE S4038 402C AS 14 LDA S14 402E C9 02 CMP tt.02 4030 B0 06 BCS S4038 4032 8D FF 40 STA S40FF 4035 4C 3B 40 JMP S403B 4038 4C 48 B2 JMP SB248 403B AD FE 40 LDA S40FE 403E 8D F8 40 STA .40F8 4041 AD FF 40 LDA S40FF 4044 C9 01 CMP ttS01 4046 F0 17 BEQ S405F 4048 A9 08 LDA ttS08 404A A2 15 LDX ttS15 404C 8D FA 40 STA S40FA 404F 8E FB 40 STX 540FB 4052 A9 3B LDA ttS3B 40S4 A2 1B LDX ttS1B 40S6 8D FC 40 STA S40FC 4059 8E FD 40 STX S40FD 40SC 4C 73 40 JMP S4073 40SF A9 15 LDA tt.15 4061 A2 08 LDX ttS08 4063 8D FA 40 STA S40FA 4066 8E FB 40 STX S40FB 4069 A9 1B LDA ttS1B 406B A2 3B LDX ttS3B 406D 8D FC 40 STA S40FC 4070 8E FD 40 STX S40FD 4073 78 SEI 4074 A9 7F LDA ttS7F 4076 8D 0D DC STA SDC0D 4079 A9 01 LDA ttS01

173

Page 173: 40 Best Machine Code Routines for C64

487B 8D lA D8 STA SD81A 487E A9 02 LDA .. S82 4888 85 FB STA SFB 4882 AD F8 40 LDA S48F8 4885 8D 12 D8 STA SD812 4888 A9 18 LDA ... 18 408A 8D 11 De STA SD811 488D AD 14 83 LDA S8314 4898 8D F6 48 STA S48F6 4893 AD 15 83 LDA .8315 4896 8D F7 48 STA S48F7 4899 A9 C6 LDA .. SC6 489B 8D 14 83 STA S8314 489E A9 48 LDA .. S48 48A8 8D 15 fa3 STA S8315 48A3 58 CLI 48A4 68 RTS 48A5 78 SEI 48A6 A9 31 LDA .. S31 48A8 8D 14 0:S STA .8314 48AB A9 EA LDA 4ISEA 48AD 8D 15 83 STA .8315 48B8 A9 15 LDA 4IS15 48B2 8D 18 D8 STA .D818 48B5 A9 lB LDA .. SlB 48B7 8D 11 D0 STA SD811 48BA A9 88 LDA .. S88 48BC 8D lA D8 STA SD81A 48BF A9 88 LDA ... 88 48Cl 8D 0D DC STA SDC8D 48C4 58 CLI 48C5 68 RTS 48C6 AD 19 D8 LDA SD819 48C9 8D 19 D0 STA .D819 48CC 29 81 AND 4IS81 48CE F8 lF BEG! S48EF 48D8 C6 FB DEC SFB 48D2 18 84 BPL S48D8 4.3D4 A9 81 LDA .. S81 48D6 85 FB STA SFB 48D8 A6 FB LDX SFB

174

Page 174: 40 Best Machine Code Routines for C64

4eDA BD F8 4e LDA S4eF8,X 4eDD 8D 12 De STA SDe12 4eEe BD FA 4e LDA S4eFA,X 4eE;,j; SD 18 De STA SDelS 4eE6 BD FC 4e LDA S4eFC,X 4eE9 SD 11 De STA SDell 4eEC SA TXA 4eED Fe e6 BEG! S4eF5 4eEF 6S PLA 4eFe AS TAY 4eFl 6S PLA 4eF2 AA TAX 4eF3 6S PLA 4eF4 40 RTI 40F5 4C 31 EA JMP SEA31

• : 4eFS 96 ee es 15 3B IB ee ee

175

Page 175: 40 Best Machine Code Routines for C64

40 BEST MACHINE CODE

ROUTINES FOR THE 64

All the machine code programs in this book, including Supermon, are

available on one cassette at £7.95, direct from Duckworth. Send a

cheque/postal order (or order by phone with your Access or

Barclaycard number) and the cassette will be sent post-free.

We publish many other books and cassettes, including Exploring

Adventures on the 64, Advanced Basic & Machine Code for the 64 and Impossible Routines for the 64.

Write in for a catalogue

DUCKWORTH The Old Piano Factory 43 Gloucester Crescent

LondonNWl

Telephone: 01 485 3484