Welcome to my CHIP-16 and CHIP-16 BASIC Compiler Page

What is CHIP-16 and what can you do with it?

CHIP-16 is an interpreted programming language developed by my brother Gilbert Bertrand.
Over 20 years ago (circa 1998), Gilbert wanted to write a CHIP-8, also an interpreted programming language developed by the late Joseph Weisbecker, in INTEL© 8086 Microsoft® Macro Assembler (MASM) to run on an IBM® compatible PC.
The result of his work after all these years in developing it on and off as time permitted with his busy schedule working and taking care of his family resulted in what I consider a 'souped up' or 'jazzed up' version of CHIP-8.
Those familiar with the CHIP-8 interpreter and all those who have written CHIP-8 programs/emulators/simulators will be able to relate.
Through the years, his language went through several revisions and had different names. CHIP-16 will most likely be his last name change.
Here's a brief history in Gilbert's own words...

"Sometime in 1994, I started writing subroutines for a CHIP-8 interpreter and I got an early version working during 1995.
On Jan 27th 1996, I had a version of CHIP-8 that included color instructions for the 64X32 display page. At that time, I had renamed CHIP-8 to BERG INTERPRETER.
In January 1998, CHIP12 really started to emerge when BERG INTERPRETER became more powerful after I changed it to a 3-byte instruction interpreter instead of a 2-byte instruction interpreter to be able to add more than the 33 instructions that CHIP-8 was limited to.
I also added the ability to have sprites and the ability to play VOC sound files with the Sound Blaster CT-VOICE DRIVER.
Later in February 1998, I renamed it BERG3 INTERPRETER.
Now that BERG3 was more powerful, it still had the drawback of limited screen resolution and the painful task of entering a program the same way as CHIP-8.
So, now it was time to give it more power by creating unique color video modes in both graphics and alpha-numeric modes by programming the VGA internal registers directly within the assembly code.
A new programming language syntax was created for CHIP12 and now it had the ability to assemble a CHIP12 Assembly text file which makes it much easier to write programs not having to worry about making changes."

What exactly is an interpreted programming language?

Mr. Weisbecker, which by the way was the creator of CHIP-8, wrote an excellent article titled, "An Easy Programming System" in BYTE magazine, back in December 1978, pp. 108-122.
In the article, he describes CHIP-8 in detail and provides specific examples of a rocketship and UFO shooting-gallery game.
Quoting from his article, "In my experience, hexadecimal interpretive programming is ideally suited to real time control, video graphics, games or music synthesis.
It can be used with inexpensive computer systems consisting of a hexadecimal keyboard and only 1 K or 2 K of programmable memory.
Expensive terminals and large memories aren't required. You can quickly and easily write useful programs that require five to ten times less memory than conventional high level languages without resorting to the tedious complexities of actual machine language.
This programming approach isn't new, but surprisingly few people seem to be using it. The technique consists of designing a high level pseudomachine language that is more powerful for specific applications than conventional machine language. An interpretive program is then written to execute this new set of pseudo-instructions. Each pseudo-instruction is really just a code that specifies a machine language subroutine. This set of subroutines can be designed to perform any functions you might need for your application."

With CHIP-16 you can write any thing that "is ideally suited to real time control, video graphics, games or music synthesis."
The following programs written by me and my brother show just a fraction of how powerful CHIP-16 is for writing rich graphic programs and classic video games:


Click here to download Atari.zip

Click here to download AtariDemo.avi

Click here to download Amazed.zip

Click here to download Amazed.avi

When you run Centipede Jr, set cycles=max in DOSBox
Click here to download Centipede.zip
     
Click here to download TextTwist.zip

Click here to download Robot.zip

Click here to download RobotDemo.avi

Click here to download SPIRAL.zip

Click here to download SpiralDemo.avi

Click here to download Hangman.zip

Click here to download Hangman.avi

Click here to download LadyBug.zip

Click here to download LadyBug.avi
This program is based on my
1802 simulator program written in Visual Basic
which can be found on my Google Drive website:
1802 ELF Simulator

Click here to download CHIP16_1802Sim.zip

CHIP-16 will run in any version of Windows by using DOSBox.

Click here to download the latest version of DOSBox for your Operating System
Click here to learn how to use DOSBox

Click here to download the zipped file containing CHIP-16 interpreter and documentation files

I've also included in the CHIP16Files.zip - my new CHIP-16 debugger DBUG-16.
It's actually a modified CHIP-16 in which I added assembly code so that you now have an integrated debugger to troubleshoot programs.
It's also a perfect tool to learn the CHIP-16 instruction set.
The instructions on how to use it is found in CHIP-16 Debugger Instructions.doc

In CHIP-16, there's a PCX to SPR converter utility (Command 6) when you create sprites. I wanted to know how to do that, so I wrote one in VB.NET
Click here to download the install ZIP file

What is the CHIP-16 BASIC Compiler?

First of all, I've always wanted to build a BASIC compiler for some kind of low-level machine language.
I was going to write one for the CDP1802 microprocessor but because I wanted to learn CHIP-16, what better way to learn it by writing a BASIC compiler for it.
The CHIP-16 BASIC Compiler will take simple commands, statements and functions and translate them into CHIP-16 instruction code.


Click here to download the latest version.

NOTE: I recommend uninstalling the old version before installing the new version.


Click here to download the CHIP-16 BASIC Compiler.doc

I've written several tutorials to get you started. They are found in my manual.


Here are the features of CHIP-16:

CHIP-16 Instruction Set NOTE: All words (16-bit) in the instructions use little endian notation in the opcode
Opcode Instruction Operation

64 xx ll 00
84 xx yy 00
5B xx ll hh
CE xx yy 00

16 xx ll 00
17 xx yy 00
18 xx ll hh
19 xx yy 00

08 0n xx 00
2B 0n xx 00
50 0n ll hh

9C xx yy 00
9D xx yy 00
A8 xx ll hh
A9 xx ll hh
AA xx yy 00
AB xx yy 00

52 0n xx 00
52 0n xx 01
92 0n xx 00
92 0n xx 01

0A 00 cc 00
09 xx 00 00

53 0n xx 00

0E bb cc 00
0D xx yy 00
0C 00 cc 00
0B xx 00 00
2D 00 cc 00
2C xx 00 00

06 00 cc 00
07 xx 00 00

04 00 cc 00
05 xx 00 00

CC 0n xx 00
CD 0n xx 00

CA 0n xx 00
CB 0n xx 00
5A 0n 0n 00

1F xx 00 00

E8 xx 00 00
D1 xx 00 00

5F xx 00 00

5F xx 00 01

5F xx 00 02

5F xx 00 03


2F xx 00 00

2F xx 00 01

2F xx 00 02

2F xx 00 03


6B xx yy 00

4C xx yy 00


9A 00 ll hh
9B xx 00 00

C9 xx yy 0n

9E xx yy 00

9E xx yy 01

D5 xx yy 00

D5 xx yy 01

40 xx ll 00
41 xx yy 00
44 xx ll 00
45 xx yy 00
46 xx ll 00
47 xx yy 00

42 00 ll 00
43 xx 00 00

4D xx ll hh
4E xx yy 00
22 xx ll hh
23 xx yy 00
24 xx ll hh
25 xx yy 00

A0 xx ll hh
A1 xx ll hh
A2 xx yy 00
A3 xx yy 00
D8 xx yy 00
D9 xx yy 00
DA xx yy 00
DB xx yy 00

21 0n xx 00
20 0n ll hh
20 0n ll hh

49 00 00 00
48 00 00 00

4B 00 00 00
4A 00 00 00

4F 00 00 00

8C 0n xx 10

8C 0n xx 20

8D 0n xx 10

8D 0n xx 20


54 0n xx 00

76 xx 00 00
78 xx yy 00

1E xx yy zz

01 00 ll hh

02 00 ll hh

D6 xx 00 00

D6 xx 00 01

D6 xx 00 02


1B 00 00 00

6F xx 00 00
6F xx 10 00

BF xx 00 00
BF xx 10 00

0F xx yy 00
9F xx yy 00
D2 xx yy 00

56 0n xx 00
96 0n xx 00

EF xx yy 00
E6 xx nn nn
E7 xx yy 00
E5 0n xx 00
E4 xx ll 00
E3 xx yy 00
E2 xx ll 00
E1 xx yy 00

70 00 00 kk


60 xx ll 00
80 xx yy 00
C0 xx ll hh
C1 xx yy 00

61 xx ll 00
81 xx yy 00
C2 xx ll hh
C3 xx yy 00

62 xx ll 00
82 xx yy 00
C4 xx ll hh
C5 xx yy 00

63 xx ll 00
83 xx yy 00
C6 xx ll hh
C7 xx yy 00

3F xx yy zz
CF xx yy zz

98 xx yy 00
99 xx yy 00
94 xx yy 00
97 xx yy 00

F8 xx ll hh
F9 xx ll hh
FA xx yy 00
FB xx yy 00
FC xx yy 00
FD xx yy 00
FE xx yy 00
FF xx yy 00

6D xx 00 0B
6D xx 00 0F

90 0n ll hh

91 0n ll hh
91 0n ll hh
91 0n ll hh
59 0n 0n 00

00 00 ll hh

6A xx yy 00
3C xx yy 00

8B xx 00 00
EA 00 nn nn
EB xx 00 00

EC xx yy 00
ED xx yy 00

E9 0n xx 00
2A xx yy 00

58 0n xx 00
58 0n xx 01
5E 0n xx 00
5E 0n xx 01

6E 00 00 00
6E 00 00 01
6E 00 00 02

B0 0n ll 00
B0 1n ll 00

B1 0n ll hh
B1 1n ll hh

57 0n xx 00
57 0n xx 01
5D 0n xx 00
5D 0n xx 01

C8 xx yy 00



77 xx 00 00
79 xx yy 00

7A xx 00 00
7C 00 nn nn
7D xx 00 00

7B xx 00 00
7E 00 nn nn
7F xx 00 00

6C xx ll 00

03 00 00 00

68 xx 00 0k
69 xx 00 0k
88 xx yy 00
89 xx yy 00
F0 xx 00 0k
F1 xx 00 0k
F2 xx yy 00
F3 xx yy 00

66 xx 00 0k
67 xx 00 0k
86 xx yy 00
87 xx yy 00
F4 xx 00 0k
F5 xx 00 0k
F6 xx yy 00
F7 xx yy 00

8F 00 00 10
8F 00 00 20

E0 xx 00 00
D0 xx 00 00

1A 00 00 00
1C xx yy 00
1D xx yy 00

30 xx ll 00
31 xx yy 00
34 xx ll 00
35 xx yy 00
36 xx ll 00
37 xx yy 00

32 00 ll 00
33 xx 00 00

3D xx ll hh
3E xx yy 00
12 xx ll hh
13 xx yy 00
14 xx ll hh
15 xx yy 00

A4 xx ll hh
A5 xx ll hh
A6 xx yy 00
A7 xx yy 00
DC xx yy 00
DD xx yy 00
DE xx yy 00
DF xx yy 00

11 0n xx 00
10 0n ll hh
10 0n ll hh

39 00 00 00
38 00 00 00

3B 00 00 00
3A 00 00 00

D7 xx 00 00

00 00 00 00

55 0n xx 00
95 0n xx 00

65 xx ll 00
85 xx yy 00
5C xx ll hh
8A xx yy 00

26 xx ll 00
27 xx yy 00
28 xx ll hh
29 xx yy 00

51 0n xx 00
93 0n ll hh

D3 xx yy 00
D4 xx yy 00
AC xx ll hh
AD xx ll hh
AE xx yy 00
AF xx yy 00

B2 xx yy 00
B3 xx yy 00

73 00 ll hh
74 xx 00 00

71 00 ll hh
72 xx 00 00

8E 00 00 10
8E 00 00 20

EE 00 00 00
2E 00 00 00

75 xx 00 00

ADDV Vxx + #ll
ADDV Vxx + Vyy
ADDR Rxx + #hhll
ADDR Rxx + Ryy

ADDC Vxx + #ll
ADDC Vxx + Vyy
ADDC Rxx + #hhll
ADDC Rxx + Ryy

ADDM MLn + Vxx
ADDM MLn + Rxx
ADDM MLn + #hhll

ADDS Vxx X + Vyy
ADDS Vxx Y + Vyy
ADDS Vxx X + #hhll
ADDS Vxx Y + #hhll
ADDS Vxx X + Ryy
ADDS Vxx Y + Ryy

BCDM MLn = Vxx #0
BCDM MLn = Vxx #1
BCDM MLn = Rxx #0
BCDM MLn = Rxx #1

BGND #cc
BGND Vxx

CHAR Vxx = MLn

CLSM #bb #cc
CLSM Vxx Vyy
CLSC #cc
CLSC Vxx
CLSX #cc
CLSX Vxx

COLR #cc
COLR Vxx

COLH #cc
COLH Vxx

COPY MHn = Rxx
COPY Rxx = MHn

COPY MLn = Rxx
COPY Rxx = MLn
COPY MLn = MLn

DPCX Rxx

DELE Vxx
DELX Vxx

DISP Vxx #0

DISP Vxx #1

DISP Vxx #2

DISP Vxx #3


DSPX Vxx #0

DSPX Vxx #1

DSPX Vxx #2

DSPX Vxx #3


DIVV Vxx Vyy

DIVR Rxx Ryy


DLAY #hhll
DLAY Rxx

DRAW Vxx Vyy #n

DRWL Rxx Ryy #0

DRWL Rxx Ryy #1

DRXL Rxx Ryy #0

DRXL Rxx Ryy #1

EXIF Vxx = #ll
EXIF Vxx = Vyy
EXIF Vxx > #ll
EXIF Vxx > Vyy
EXIF Vxx < #ll
EXIF Vxx < Vyy

EXIF KEY = #ll
EXIF KEY = Vxx

EXIF Rxx = #hhll
EXIF Rxx = Ryy
EXIF Rxx > #hhll
EXIF Rxx > Ryy
EXIF Rxx < #hhll
EXIF Rxx < Ryy

EXIF Vxx X = #hhll
EXIF Vxx Y = #hhll
EXIF Vxx X = Ryy
EXIF Vxx Y = Ryy
EXIF Vxx X > Ryy
EXIF Vxx Y > Ryy
EXIF Vxx X < Ryy
EXIF Vxx Y < Ryy

EXIF MLn = Rxx
EXIF MLn = #hhll
EXIF MLn = @LABEL + #hhll

EXIF PORT = 0
EXIF TIMR = 0

EXIF PVOC = 0
EXIF PWAV = 0

EXIT

FILE Vxx AT MLn #G

FILE Vxx AT MLn #W

FILE Rxx AT MLn #G

FILE Rxx AT MLn #W


FONT MLn = Vxx

GETS Vxx
GETP Rxx Vyy

GETM Rxx Ryy Vzz

GOTO @LABEL

GSUB @LABEL

HASC Vxx #0

HASC Vxx #1

HASC Vxx #2


HIDM

KEYS Vxx #0
KEYS Vxx #1

KEYZ Vxx #0
KEYZ Vxx #1

LCAT Vxx Vyy
LCAT Rxx Ryy
LCAX Rxx Ryy

LOAD Vxx = MLn
LOAD Rxx = MLn

LSPF Vxx = Vyy
LSPF Vxx = :nnnn
LSPF Vxx = Ryy
LSPM Vxx = MLn
LSPL Vxx = #ll
LSPL Vxx = Vyy
LSPS Vxx = #ll
LSPS Vxx = Vyy

MODE #kk


MOVE Vxx = #ll
MOVE Vxx = Vyy
MOVE Rxx = #hhll
MOVE Rxx = Ryy

MOVE Vxx ~ #ll
MOVE Vxx ~ Vyy
MOVE Rxx ~ #hhll
MOVE Rxx ~ Ryy

MOVE Vxx & #ll
MOVE Vxx & Vyy
MOVE Rxx & #hhll
MOVE Rxx & Ryy

MOVE Vxx ^ #ll
MOVE Vxx ^ Vyy
MOVE Rxx ^ #hhll
MOVE Rxx ^ Ryy

MOVE Vxx Vyy = Rzz
MOVE Rxx = Vyy Vzz

MOVE Vxx X = Vyy
MOVE Vxx Y = Vyy
MOVE Vxx = Vyy X
MOVE Vxx = Vyy Y

MOVE Vxx X = #hhll
MOVE Vxx Y = #hhll
MOVE Vxx X = Ryy
MOVE Vxx Y = Ryy
MOVE Vxx X = Vyy X
MOVE Vxx Y = Vyy Y
MOVE Rxx = Vyy X
MOVE Rxx = Vyy Y

MOVE Vxx = COLR #B
MOVE Vxx = COLR #F

MOVE MHn = #hhll

MOVE MLn = #hhll
MOVE MLn @LABEL
MOVE MLn = @LABEL + #hhll
MOVE MLn = MLn

MSUB @LABEL

MULV Vxx Vyy
MULR Rxx Ryy

PALG Vxx
PALG :nnnn
PALG Rxx

PALR Vxx > Vyy
PALR Vxx < Vyy

PALC Vxx = MLn
PALC Vxx = Vyy

PEEK Vxx = MLn #0
PEEK Vxx = MLn #1
PEEK Rxx = MLn
PEEK Rxx = MLn

PLAY #0
PLAY #1
PLAY #2

POKB MLn = #ll #0
POKB MLn = #ll #1

POKW MLn = #hhll #0
POKW MLn = #hhll #1

POKE MLn = Vxx #0
POKE MLn = Vxx #1
POKE MLn = Rxx #0
POKE MLn = Rxx #1

PRNT Vxx Vyy



PUTS Vxx
PUTP Rxx Vyy

PVOC Vxx
PVOC :nnnn
PVOC Rxx

PWAV Vxx
PWAV :nnnn
PWAV Rxx

RAND Vxx = #ll

RSUB

RTAT Vxx > #k
RTAT Vxx < #k
RTAT Vxx > Vyy
RTAT Vxx < Vyy
RTAT Rxx > #k
RTAT Rxx < #k
RTAT Rxx > Vyy
RTAT Rxx < Vyy

SHIF Vxx > #k
SHIF Vxx < #k
SHIF Vxx > Vyy
SHIF Vxx < Vyy
SHIF Rxx > #k
SHIF Rxx < #k
SHIF Rxx > Vyy
SHIF Rxx < Vyy

SCRN #G
SCRN #W

SHOW Vxx
SHOX Vxx

SHOM
STHM Rxx Ryy
STVM Rxx Ryy

SKIF Vxx = #ll
SKIF Vxx = Vyy
SKIF Vxx > #ll
SKIF Vxx > Vyy
SKIF Vxx < #ll
SKIF Vxx < Vyy

SKIF KEY = #ll
SKIF KEY = Vxx

SKIF Rxx = #hhll
SKIF Rxx = Ryy
SKIF Rxx > #hhll
SKIF Rxx > Ryy
SKIF Rxx < #hhll
SKIF Rxx < Ryy

SKIF Vxx X = #hhll
SKIF Vxx Y = #hhll
SKIF Vxx X = Ryy
SKIF Vxx Y = Ryy
SKIF Vxx X > Ryy
SKIF Vxx Y > Ryy
SKIF Vxx X < Ryy
SKIF Vxx Y < Ryy

SKIF MLn = Rxx
SKIF MLn = #hhll
SKIF MLn = @LABEL + #hhll

SKIF PORT = 0
SKIF TIMR = 0

SKIF PVOC = 0
SKIF PWAV = 0

SPCX Rxx

STOP

STOR MLn = Vxx
STOR MLn = Rxx

SUBV Vxx - #ll
SUBV Vxx - Vyy
SUBR Rxx - #hhll
SUBR Rxx - Ryy

SUBB Vxx - #ll
SUBB Vxx - Vyy
SUBB Rxx - #hhll
SUBB Rxx - Ryy

SUBM MLn - Vxx
SUBM MLn - #hhll

SUBS Vxx X - Vyy
SUBS Vxx Y - Vyy
SUBS Vxx X - #hhll
SUBS Vxx Y - #hhll
SUBS Vxx X - Ryy
SUBS Vxx Y - Ryy

SWAP Vxx Vyy
SWAP Rxx Ryy

TIMR #hhll
TIMR Rxx

TONE #hhll
TONE Rxx

VDAT #G
VDAT #W

WVRT
WVRX

XCHG Rxx

Vxx += ll, V7F=CARRY
Vxx += Vyy, V7F=CARRY
Rxx += hhll, V7F=CARRY
Rxx += Ryy, V7F=CARRY

Vxx += ll, V7F=CARRY
Vxx += Vyy, V7F=CARRY
Rxx += hhll, V7F=CARRY
Rxx += Ryy, V7F=CARRY

MLn += Vxx
MLn += Rxx
MLn = MLn + hhll

LSB OF SPRITE SPRITE Vxx X += Vyy
LSB OF SPRITE SPRITE Vxx Y += Vyy
SPRITE Vxx X += hhll
SPRITE Vxx Y += hhll
SPRITE Vxx X += Ryy
SPRITE Vxx Y += Ryy

MLn = DECIMAL Vxx (k=0 ASCII VALUE)
MLn = DECIMAL Vxx (k=1 DECIMAL VALUE)
MLn = DECIMAL Rxx (k=0 ASCII VALUE)
MLn = DECIMAL Rxx (k=1 DECIMAL VALUE)

CHANGE BACKGROUND COLOR = cc (Modes 0-6 Only)
CHANGE BACKGROUND COLOR = Vxx (Modes 0-6 Only)

CHARACTER SET Vxx = MLn

CLEAR SCREEN = BYTE bb + COLOR cc (Modes 0-6 Only)
CLEAR SCREEN = BYTE Vxx + COLOR Vyy (Modes 0-6 Only)
CLEAR SCREEN MODE 256 = COLOR cc (Modes 7-A Only)
CLEAR SCREEN MODE 256 = COLOR Vxx (Modes 7-A Only)
CLEAR SCREEN MODEX 256 = COLOR cc (ModeX B-D Only)
CLEAR SCREEN MODEX 256 = COLOR Vxx (ModeX B-D Only)

COLOR REG = #cc
COLOR REG = Vxx

COLOR HIT REG = #cc
COLOR HIT REG = Vxx

MHn = Rxx
Rxx = MHn

MLn = Rxx
Rxx = MLn
COPY MLn = VALUE OF MLn

DRAW PCX FILE Rxx WHERE Rxx = kkkk.PCX (SEE NOTES IN MANUAL ON DPCX Rxx)

ERASE SPRITE Vxx
ERASE SPRITE Vxx (MODEX B - C ONLY)

FAST DISPLAY SPRITE Vxx, CANNOT BE DELETED WITH DELE Vxx
USES VIDEO AT 9000,NEEDS WVRT, DOES NOT CHECK BACKGROUND
FAST DISPLAY SPRITE Vxx, CANNOT BE DELETED WITH DELE Vxx
USES VIDEO AT A000, DOES NOT CHECK BACKGROUND
SLOWER DISPLAY SPRITE Vxx, CANNOT BE DELETED WITH DELE Vxx
USES VIDEO AT 9000,NEEDS WVRT, CHECKS BACKGROUND
SLOWER DISPLAY SPRITE Vxx, CANNOT BE DELETED WITH DELE Vxx
USES VIDEO AT A000,CHECKS BACKGROUND

FAST DISPLAY SPRITE Vxx, CANNOT BE DELETED WITH DELX Vxx
USES MODEX B - D, NEEDS WVRX, DOES NOT CHECK BACKGROUND
FAST DISPLAY SPRITE Vxx, CANNOT BE DELETED WITH DELX Vxx
USES MODEX B - D, DOES NOT CHECK BACKGROUND
SLOWER DISPLAY SPRITE Vxx, CANNOT BE DELETED WITH DELX Vxx
USES MODEX B - D, NEEDS WVRX, CHECKS BACKGROUND
SLOWER DISPLAY SPRITE Vxx, CANNOT BE DELETED WITH DELX Vxx
USES MODEX B - D, CHECKS BACKGROUND

DIVIDE Vxx /Vyy (V00=RESULT)
V01=REMAINDER, EE=DIVIDE BY 0 ERROR
DIVIDE Rxx /Ryy (R00=RESULT)
R01=REMAINDER, EEEE=DIVIDE BY 0 ERROR

DELAY hhll (0048=1 SECOND, 1090=1 MINUTE)
DELAY Rxx (0048=1 SECOND, 1090=1 MINUTE)

DRAW n DATA AT Vxx, Vyy USING ML0 WITH COLOR REG, ,V7F=COLLISION

DRAW LINE FROM R00(X), R01(Y) TO Rxx(X), Ryy(Y) (Modes 7-A Only)
USES VIDEO AT 9000,NEEDS WVRT
DRAW LINE FROM R00(X), R01(Y) TO Rxx(X), Ryy(Y) (Modes 7-A Only)

DRAW LINE FROM R00(X), R01(Y) TO Rxx(X), Ryy(Y) (ModeX B-D Only)
NEEDS WVRX
DRAW LINE FROM R00(X), R01(Y) TO Rxx(X), Ryy(Y) (ModeX B-D Only)

EXEC NEXT INSTR IF Vxx = ll
EXEC NEXT INSTR IF Vxx = Vyy
EXEC NEXT INSTR IF Vxx > ll
EXEC NEXT INSTR IF Vxx > Vyy
EXEC NEXT INSTR IF Vxx < ll
EXEC NEXT INSTR IF Vxx < Vyy

EXEC NEXT INSTR IF KEY = ll (LOWER CASE)
EXEC NEXT INSTR IF KEY = Vxx (LOWER CASE)

EXEC NEXT INSTR IF Rxx = hhll
EXEC NEXT INSTR IF Rxx = Ryy
EXEC NEXT INSTR IF Rxx > hhll
EXEC NEXT INSTR IF Rxx > Ryy
EXEC NEXT INSTR IF Rxx < hhll
EXEC NEXT INSTR IF Rxx < Ryy

EXEC NEXT INSTR IF SPRITE Vxx X = hhll
EXEC NEXT INSTR IF SPRITE Vxx Y = hhll
EXEC NEXT INSTR IF SPRITE Vxx X = Ryy
EXEC NEXT INSTR IF SPRITE Vxx Y = Ryy
EXIF NEXT INSTR IF SPRITE Vxx X > Ryy
EXIF NEXT INSTR IF SPRITE Vxx Y > Ryy
EXIF NEXT INSTR IF SPRITE Vxx X < Ryy
EXIF NEXT INSTR IF SPRITE Vxx Y < Ryy

EXEC NEXT INSTR IF MLn = Rxx
EXEC NEXT INSTR IF MLn = hhll
EXEC NEXT INSTR IF MLn = @LABEL + hhll

EXEC NEXT INSTR IF SERIAL PORT = 0
EXEC NEXT INSTR IF TIMER = 0

EXEC NEXT INSTR IF VOC FILE ENDED PLAY
EXEC NEXT INSTR IF WAV FILE ENDED PLAY

EXIT FROM CHIP16 PROGRAM

GET FILE Vxx AT EXT MLF, AFTER EXECUTION, MLn=# OF BYTES READ
DEFAULT=Vxx.DAT) MHF=2E44(.D)MLF=4154(.AT)
WRITE FILE Vxx AT EXT MLF ,MLn TO R3F=# OF BYTES TO WRITE
DEFAULT=Vxx.DAT) MHF=2E44(.D)MLF=4154(.AT)
GET FILE Rxx AT EXT MLF, AFTER EXECUTION, MLn=# OF BYTES READ
DEFAULT=Rxx.DAT) MHF=2E44(.D)MLF=4154(.AT)
WRITE FILE Rxx AT EXT MLF ,MLn TO R3F=# OF BYTES TO WRITE
DEFAULT=Rxx.DAT) MHF=2E44(.D)MLF=4154(.AT)

MLn = FONT Vxx

GET BYTE Vxx FROM SERIAL PORT - COM1,19200,03F8H
GET BYTE Vyy FROM PORT Rxx

GET MOUSE Rxx=X, Ryy=Y, Vzz=CLICK BUTTON

GO TO hhll

GO TO CHIP16 SUB AT hhll

HEX VALUE OF Vxx IS CONVERTED TO ASCII IN V00 AND V01
EX: IF Vxx=2A THEN V00=32 AND V01=41
HEX VALUE OF Vxx IS CONVERTED TO ASCII IN V00 AND V01 AND
ML0=V00 AND ML0+1=V01
HEX VALUE OF Vxx IS CONVERTED TO ASCII IN V00 AND V01 AND
ML0=V00 AND ML0+1=V01, ML0 is INCR +2 AFTER EXECUTION

HIDE MOUSE

Vxx = WAIT FOR KEY (SOUND OFF)(DEFAULT LOWER CASE)
Vxx = WAIT FOR KEY (SOUND ON) (DEFAULT LOWER CASE)

Vxx = WAIT FOR KEY (SOUND OFF)
Vxx = WAIT FOR KEY (SOUND ON)

LOCATE Vxx, Vyy (V00=BYTE/COLOR, V01=COLOR, MLF=ADDRESS)
LOCATE Rxx, Ryy (V00=COLOR, MLF=ADDRESS)
LOCATE Rxx, Ryy (V00=COLOR, MLF=ADDRESS, V01=PLANE #, MODEX B-D)

V00 -> Vxx = MLn (MLn=MLn+xx+1)
R00 -> Rxx = MLn (MLn=MLn+(2X xx)+2)

SPRITE Vxx = FILENAME Vyy.SPR
SPRITE Vxx = FILENAME nnnn.SPR
SPRITE Vxx = FILENAME Ryy.SPR
SPRITE Vxx = DATA MLn
SPRITE Vxx = ll ASCII 8X16 LARGE FONT (COLOR=COLR)
SPRITE Vxx = Vyy ASCII 8X16 LARGE FONT (COLOR=COLR)
SPRITE Vxx = ll ASCII 8X8 SMALL FONT (COLOR=COLR)
SPRITE Vxx = Vyy ASCII 8X8 SMALL FONT (COLOR=COLR)

GRAPHIC MODE kk
(If bit 7 of kk = 1, palette and font will not reset to default values)

Vxx = ll
Vxx = Vyy
Rxx = hhll
Rxx = Ryy

Vxx = OR ll
Vxx = OR Vyy
Rxx = OR hhll
Rxx = OR Ryy

Vxx = AND ll
Vxx = AND Vyy
Rxx = AND hhll
Rxx = AND Ryy

Vxx = XOR ll
Vxx = XOR Vyy
Rxx = XOR hhll
Rxx = XOR Ryy

Vxx = Rzz(MSB), Vyy = Rzz(LSB)
Rxx(MSB) = Vyy, Rxx(LSB) = Vzz

LSB OF SPRITE Vxx X = Vyy
LSB OF SPRITE Vxx Y = Vyy
Vxx = LSB OF SPRITE Vyy X
Vxx = LSB OF SPRITE Vyy Y

SPRITE Vxx X = hhll
SPRITE Vxx Y = hhll
SPRITE Vxx X = Ryy
SPRITE Vxx Y = Ryy
SPRITE Vxx X = SPRITE Vyy X
SPRITE Vxx Y = SPRITE Vyy Y
Rxx = SPRITE Vyy X
Rxx = SPRITE Vyy Y

Vxx = BACKGROUND COLOR REG
Vxx = FOREGROUND COLOR REG

MHn = hhll (MH0 IS CHANGED BY OPCODE 91)

MLn = hhll (IF MLn = ML0 THEN MH0 = #2000)
MLn = hhll (IF MLn = ML0 THEN MH0 = #2000)
MLn = hhll + hhll (IF MLn = ML0 THEN MH0 = #2000)
MEMORY MLn = MEMORY MLn (INCR MLn+1)

DO MACHINE LANGUAGE SUB AT hhll (RETURN WITH CB)

MULTIPLY Vxx * Vyy (V00=RESULT - V01=OVERFLOW)
MULTIPLY Rxx * Ryy (R00=RESULT - R01=OVERFLOW)

GET PALETTE.PAL = FILENAME Vxx.PAL
GET PALETTE.PAL = FILENAME nnnn.PAL
GET PALETTE.PAL = FILENAME Rxx.PAL

ROTATE PALETTE -> FROM Vxx to Vyy
ROTATE PALETTE <- FROM Vxx to Vyy

CHANGE COLOR PALETTE Vxx = 3 BYTE DATA AT MLn,MLn+3 AFTER EXECUTION
CHANGE COLOR PALETTE Vxx = Vyy

Vxx = MLn
Vxx = MLn, INCR MLn+1 AFTER EXECUTION
Rxx = MLn
Rxx = MLn, INCR MLn+2 AFTER EXECUTION

PLAY STOP WAV FILE
PLAY PAUSE WAV FILE
PLAY RESUME WAV FILE

POKE MLn = BYTE #ll
POKE MLn = BYTE #ll INCR MLn+1 AFTER EXECUTION

POKE MLn = WORD #hhll
POKE MLn = WORD #hhll INCR MLn+2 AFTER EXECUTION

MLn = Vxx
MLn = Vxx INCR MLn+1 AFTER EXECUTION
MLn = Rxx
MLn = Rxx INCR MLn+2 AFTER EXECUTION

DRAW STRING USING ML0 AT Vxx, Vyy, WITH COLOR REG
V00=LAST CHARACTER BYTE PRINTED
NOTE:A PRNT LOOP CAN END BY TESTING A PRNT CHARACTER 03

PUT BYTE Vxx TO SERIAL PORT - COM1,19200,03F8H
PUT BYTE Vyy TO PORT Rxx

LOAD AND PLAY SOUND BLASTER VOC FILE Vxx.VOC
LOAD AND PLAY SOUND BLASTER VOC FILE nnnn.VOC
LOAD AND PLAY SOUND BLASTER VOC FILE Rxx.VOC

LOAD AND PLAY WAV FILE Vxx.WAV
LOAD AND PLAY WAV FILE nnnn.WAV
LOAD AND PLAY WAV FILE Rxx.WAV

Vxx = RANDOM ll

RETURN FROM CHIP16 SUB

Vxx = ROTATE -> k TIMES, V7F=CARRY
Vxx = ROTATE <- k TIMES, V7F=CARRY
Vxx = ROTATE -> Vyy TIMES, V7F=CARRY
Vxx = ROTATE <- Vyy TIMES, V7F=CARRY
Rxx = ROTATE -> k TIMES, V7F=CARRY
Rxx = ROTATE <- k TIMES, V7F=CARRY
Rxx = ROTATE -> Vyy TIMES, V7F=CARRY
Rxx = ROTATE <- Vyy TIMES, V7F=CARRY

Vxx = SHIFT -> k TIMES, V7F=CARRY
Vxx = SHIFT <- k TIMES, V7F=CARRY
Vxx = SHIFT -> Vyy TIMES, V7F=CARRY
Vxx = SHIFT <- Vyy TIMES, V7F=CARRY
Rxx = SHIFT -> k TIMES, V7F=CARRY
Rxx = SHIFT <- k TIMES, V7F=CARRY
Rxx = SHIFT -> Vyy TIMES, V7F=CARRY
Rxx = SHIFT <- Vyy TIMES, V7F=CARRY

GET SCREEN DATA SAVED AT D000:0000 TO D000:FFFF
WRITE SCREEN DATA AT D000:0000 TO D000:FFFF

DRAW SPRITE Vxx, V7F=COLLISION COLOR
DRAW SPRITE Vxx, V7F=COLLISION COLOR (MODEX B-C ONLY)

SHOW MOUSE
SET MOUSE HORIZONTAL Rxx=MINIMUM, Ryy=MAXIMUM
SET MOUSE VERTICAL Rxx=MINIMUM, Ryy=MAXIMUM

SKIP NEXT INSTR IF Vxx = ll
SKIP NEXT INSTR IF Vxx = Vyy
SKIP NEXT INSTR IF Vxx > ll
SKIP NEXT INSTR IF Vxx > Vyy
SKIP NEXT INSTR IF Vxx < ll
SKIP NEXT INSTR IF Vxx < Vyy

SKIP NEXT INSTR IF KEY = ll (LOWER CASE)
SKIP NEXT INSTR IF KEY = Vxx (LOWER CASE)

SKIP NEXT INSTR IF Rxx = hhll
SKIP NEXT INSTR IF Rxx = Ryy
SKIP NEXT INSTR IF Rxx > hhll
SKIP NEXT INSTR IF Rxx > Ryy
SKIP NEXT INSTR IF Rxx < hhll
SKIP NEXT INSTR IF Rxx < Ryy

SKIP NEXT INSTR IF SPRITE Vxx X = hhll
SKIP NEXT INSTR IF SPRITE Vxx Y = hhll
SKIP NEXT INSTR IF SPRITE Vxx X = Ryy
SKIP NEXT INSTR IF SPRITE Vxx Y = Ryy
SKIP NEXT INSTR IF SPRITE Vxx X > Ryy
SKIP NEXT INSTR IF SPRITE Vxx Y > Ryy
SKIP NEXT INSTR IF SPRITE Vxx X < Ryy
SKIP NEXT INSTR IF SPRITE Vxx Y < Ryy

SKIP NEXT INSTR IF MLn = Rxx
SKIP NEXT INSTR IF MLn = hhll
SKIP NEXT INSTR IF MLn = @LABEL + hhll

SKIP NEXT INSTR IF SERIAL PORT = 0
SKIP NEXT INSTR IF TIMER = 0

SKIP NEXT INSTR IF VOC FILE ENDED PLAY
SKIP NEXT INSTR IF WAV FILE ENDED PLAY

SHOW PCX FILE Rxx WHERE Rxx = kkkk.PCX (SEE NOTES IN MANUAL ON SPCX Rxx)

DO NOTHING INSTRUCTION - LOOP FOREVER

MLn = V00 -> Vxx (MLn=MLn+xx+1)
MLn = R00 -> Rxx (MLn=MLn+(2X xx)+2)

Vxx -= ll, V7F=BORROW
Vxx -= Vyy, V7F=BORROW
Rxx -= hhll, V7F=BORROW
Rxx -= Ryy, V7F=BORROW

Vxx -= ll, V7F=BORROW
Vxx -= Vyy, V7F=BORROW
Rxx -= hhll, V7F=BORROW
Rxx -= Ryy, V7F=BORROW

MLn -= Vxx
MLn -= hhll

LSB OF SPRITE SPRITE Vxx X -= Vyy
LSB OF SPRITE SPRITE Vxx Y -= Vyy
SPRITE Vxx X -= hhll
SPRITE Vxx Y -= hhll
SPRITE Vxx X -= Ryy
SPRITE Vxx Y -= Ryy

SWAP BYTE OF Vxx WITH BYTE OF Vyy
SWAP WORD OF Rxx WITH WORD OF Ryy

TIMER = hhll (0400=1 SECOND DURATION)
TIMER = Rxx (0400=1 SECOND DURATION)

TONE = hhll (0400=1 SECOND DURATION)
TONE = Rxx (0400=1 SECOND DURATION)

GET VARIABLES AND MEMORY POINTERS VALUES FROM CHIP16.DAT
WRITE VARIABLES AND MEMORY POINTERS VALUES TO CHIP16.DAT

WAIT FOR VERTICAL RETRACE (MODES 7 TO A)
WAIT FOR VERTICAL RETRACE (MODEX B-D ONLY)

EXCHANGE MSB BYTE AND LSB BYTE OF Rxx (EX :1234=3412)