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 SystemClick 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.
NOTE: I recommend uninstalling the old version before installing the new version.
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) |