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

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

CHIP-12 is an interpreted programming language developed by my brother Gilbert Bertrand.
About 20 years ago, 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.

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-12 you can write any thing that "is ideally suited to real time control, video graphics, games or music synthesis."
The following links of videos show just a fraction of how powerful CHIP-12 is for writing rich graphic programs and classic video games:


Click here to download
and view ATARIDEMO.avi

Click here to download
and view GOLDRUSH.avi

Click here to download
and view PACMANDEMO.avi

Click here to download
and view PUZZLEDEMO.avi

Click here to download
and view QBERT.avi

Click here to download
and view ROBOTDEMO.avi

Click here to download
and view SPIRALDEMO.avi

Click here to download
and view TINTINDEMO.avi

Click here to download
and view WALKDEMO.avi

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

Click here to download DOSBox 0.74 for your Operating System
Click here to learn how to use DOSBox

Click here to download a zipped file containing CHIP-12 files and demos
NOTE: Because anti-virus software often scan for and delete EXE files in downloads, I have renamed the EXE files to TXT. Therefore you must rename them back to EXE once the files have been extracted.

What is the CHIP-12 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-12, what better way to learn it by writing a BASIC compiler for it.
The CHIP-12 BASIC Compiler will take simple commands, statements and functions and compile them into CHIP-12 instruction code.

The compiler is still being developed, but you can try it out.

Click here to install the BETA version of the CHIP-12 BASIC Compiler.

NOTE: If you have already installed the CHIP-12 BASIC Compiler, you must go to Control Panel and Uninstall it before reinstalling the new update.

Click here to download the CHIP-12 BASIC Compiler PDF document.

Click here to go to the CHIP-12 BASIC Compiler HTML Online Manual.

Here are the features of CHIP-12:

CHIP-12 Instruction Set
Opcode Instruction Operation
Bn kk kk ADDC MLn + #kkkk MLn = MLn + kkkk
50 0n xx ADDC MLn + Vxx MLn = + Vxx
C4 xx kk ADDC Vxx X + #kk SPRITE Vxx X = + kk
C5 xx kk ADDC Vxx Y + #kk SPRITE Vxx Y = + kk
CE xx yy ADDC Vxx X + Vyy SPRITE Vxx X + Vyy
CF xx yy ADDC Vxx Y + Vyy SPRITE Vxx Y + Vyy
64 xx kk ADDC Vxx + #kk Vxx = + kk, V7F=CARRY
84 xx yy ADDC Vxx + Vyy Vxx = + Vyy, V7F=CARRY
5B kk kk ADDC R16 + #kkkk R16 = + kkkk, V7F=CARRY
52 kn xx BCDM MLn = Vxx #k MLn = DECIMAL Vxx (k=0 ASCII VALUE)
0A 00 cc BGND #cc CHANGE BACKGROUND COLOR = cc
09 xx 00 BGND Vxx CHANGE BACKGROUND COLOR = Vxx
53 0n xx CHAR Vxx = MLn CHARACTER SET Vxx = MLn
0C 00 cc CLSC #cc CLEAR SCREEN MODE 256 = COLOR cc
0B xx 00 CLSC Vxx CLEAR SCREEN MODE 256 = COLOR Vxx
0E bb cc CLSM #bb #cc CLEAR SCREEN = BYTE bb + COLOR cc
0D xx yy CLSM Vxx Vyy CLEAR SCREEN = BYTE Vxx + COLOR Vyy
04 00 cc COLH #cc COLOR HIT REG = cc
05 xx 00 COLH Vxx COLOR HIT REG = Vxx
06 00 cc COLR #cc COLOR REG = cc
07 xx 00 COLR Vxx COLOR REG = Vxx
5A 0n 0n COPY MLn = MLn COPY MLn = VALUE OF MLn
CA 0n 00 COPY MLn = R16 MLn = R16
CB 0n 00 COPY R16 = MLn R16 = MLn
E8 xx 00 DELE Vxx ERASE SPRITE Vxx
5F xx 0k DISP Vxx #k DISPLAY SPRITE Vxx - CANNOT BE DELETED WITH DELE Vxx
k = 0 - DISPLAY PAGE SEGMENT 9 – WVRT INSTR. NEEDED
k = 1 - DISPLAY PAGE SEGMENT A – WVRT INSTR. NOT NEEDED
6B xx yy DIVV Vxx Vyy DIVIDE Vxx / Vyy (V00=RESULT, EE=DIVIDE BY 0 ERROR) (V01=REMAINDER)
7A kk kk DLAY #kkkk DELAY kkkk (0048=1 SECOND, 1090=1 MINUTE)
7B 00 00 DLAY R16 DELAY R16 (0048=1 SECOND, 1090=1 MINUTE)
Dn xx yy DRAW Vxx Vyy #n DRAW n DATA AT Vxx, Vyy, WITH COLOR REG, USING ML0 V7F=COLLISION
4B 00 kk EXIF JOY = #kk EXEC NEXT INSTR IF JOYSTICK = kk
4C 00 xx EXIF JOY = Vxx EXEC NEXT INSTR IF JOYSTICK = Vxx
42 00 kk EXIF KEY = #kk EXEC NEXT INSTR IF KEY = kk
43 00 xx EXIF KEY = Vxx EXEC NEXT INSTR IF KEY = Vxx
2n mm mm EXIF MLn = #mmmm EXEC NEXT INSTR IF MLn = mmmm
2n mm mm EXIF MLn = @LABEL + #kkkk EXEC NEXT INSTR IF MLn = mmmm + kkkk
4E 0n 00 EXIF MLn = R16 EXEC NEXT INSTR IF MLn = R16
4A 00 00 EXIF PEND = 0 EXEC NEXT INSTR IF VOC SOUND FILE ENDED PLAY
49 00 00 EXIF PORT = 0 EXEC NEXT INSTR IF SERIAL PORT = 0
4D kk kk EXIF R16 = #kkkk EXEC NEXT INSTR IF R16 = kkkk
48 00 00 EXIF TIMR = 0 EXEC NEXT INSTR IF TIMER = 0
F8 xx kk EXIF Vxx X = #kk EXEC NEXT INSTR IF SPRITE Vxx X = kk
F9 xx kk EXIF Vxx Y = #kk EXEC NEXT INSTR IF SPRITE Vxx Y = kk
FA xx yy EXIF Vxx X = Vyy EXEC NEXT INSTR IF SPRITE Vxx X = Vyy
FB xx yy EXIF Vxx Y = Vyy EXEC NEXT INSTR IF SPRITE Vxx Y = Vyy
FC xx kk EXIF Vxx X > #kk EXEC NEXT INSTR IF SPRITE Vxx X > kk
FD xx kk EXIF Vxx Y > #kk EXEC NEXT INSTR IF SPRITE Vxx Y > kk
FE xx kk EXIF Vxx X < #kk EXEC NEXT INSTR IF SPRITE Vxx X < kk
FF xx kk EXIF Vxx Y < #kk EXEC NEXT INSTR IF SPRITE Vxx Y < kk
40 xx kk EXIF Vxx = #kk EXEC NEXT INSTR IF Vxx = kk
41 xx yy EXIF Vxx = Vyy EXEC NEXT INSTR IF Vxx = Vyy
44 xx kk EXIF Vxx > #kk EXEC NEXT INSTR IF Vxx > kk
45 xx yy EXIF Vxx > Vyy EXEC NEXT INSTR IF Vxx > Vyy
46 xx kk EXIF Vxx < #kk EXEC NEXT INSTR IF Vxx < kk
47 xx yy EXIF Vxx < Vyy EXEC NEXT INSTR IF Vxx < Vyy
EF 00 00 EXIT EXIT FROM CHIP12 PROGRAM
08 xx kn FILE Vxx AT MLn #G GET FILE Vxx.MPF=.EXT AT MLn (DEFAULT=Vxx.DAT)(k=1)
MHF=2E44h (.D) MLF=4154h (AT)
08 xx kn FILE Vxx AT MLn #W WRITE FILE Vxx.MPF=.EXT AT MLn TO # OF BYTES BY R16 (DEFAULT=Vxx.DAT)
(k=2) MHF=2E44h (.D) MLF=4154h (AT)
54 0n xx FONT MLn = Vxx MLn = FONT Vxx
78 xx 00 GETP Vxx GET BYTE Vxx FROM PORT R16
76 xx 00 GETS Vxx GET BYTE Vxx FROM SERIAL PORT - COM1,19200,03F8H
01 mm mm GOTO @LABEL GO TO mmmm
02 mm mm GSUB @LABEL GO TO CHIP12 SUB AT mmmm
6F xx 0k KEYS Vxx #k Vxx = WAIT FOR KEY (k=0 SOUND OFF, k=1 SOUND ON)
0F xx yy LCAT Vxx Vyy LOCATE Vxx, Vyy (V00=BYTE/COLOR, V01=COLOR, MLF=ADDRESS)
56 0n xx LOAD Vxx = MLn V00 -> Vxx = MLn (MLn=MLn+xx+1)
7C 0k nn LSBF #k = :nn VOC SOUND FILE k = FILENAME nn.VOC
7D xx yy LSBF Vxx = Vyy VOC SOUND FILE Vxx = FILENAME Vyy.VOC
E6 xx nn LSPF Vxx = :nn SPRITE Vxx = FILENAME nn.SPR
E7 xx yy LSPF Vxx = Vyy SPRITE Vxx = FILENAME Vyy.SPR
E4 xx kk LSPL Vxx = #kk SPRITE Vxx = kk ASCII 8X16 LARGE FONT (COLOR=COLR)
E3 xx yy LSPL Vxx = Vyy SPRITE Vxx = Vyy ASCII 8X16 LARGE FONT (COLOR=COLR)
E5 xx 0n LSPM Vxx = MLn SPRITE Vxx = DATA MLn
E2 xx kk LSPS Vxx = #kk SPRITE Vxx = kk ASCII 8X8 SMALL FONT (COLOR=COLR)
E1 xx yy LSPS Vxx = Vyy SPRITE Vxx = Vyy ASCII 8X8 SMALL FONT (COLOR=COLR)
70 00 0k MODE #k GRAPHIC MODE k
9n mm mm MOVE MHn = #mmmm MHn = mmmm
An mm mm MOVE MLn @LABEL MLn = mmmm
An mm mm MOVE MLn = @LABEL + #kkkk MLn = mmmm + kkkk
An mm mm MOVE MLn = #mmmm MLn = mmmm
59 0n 0n MOVE MLn = MLn MLn = MLn (INCR MLn+1)
60 xx kk MOVE Vxx = #kk Vxx = kk
80 xx yy MOVE Vxx = Vyy Vxx = Vyy
6D xx 00 MOVE Vxx = COLR Vxx = COLOR REG
61 xx kk MOVE Vxx ~ #kk Vxx = OR kk
81 xx yy MOVE Vxx ~ Vyy Vxx = OR Vyy
62 xx kk MOVE Vxx & #kk Vxx = AND kk
82 xx yy MOVE Vxx & Vyy Vxx = AND Vyy
63 xx kk MOVE Vxx ^ #kk Vxx = XOR kk
83 xx yy MOVE Vxx ^ Vyy Vxx = XOR Vyy
8C xx yy MOVE Vxx = Vyy X Vxx = SPRITE Vyy X
8D xx yy MOVE Vxx = Vyy Y Vxx = SPRITE Vyy Y
3F xx yy MOVE Vxx Vyy = R16 Vxx = R16(MSB), Vyy = R16(LSB)
C0 xx kk MOVE Vxx X = #kk SPRITE Vxx X = kk
C1 xx kk MOVE Vxx Y = #kk SPRITE Vxx Y = kk
C2 xx yy MOVE Vxx X = Vyy SPRITE Vxx X = Vyy
C3 xx yy MOVE Vxx Y = Vyy SPRITE Vxx Y = Vyy
C8 xx yy MOVE Vxx X = Vyy X SPRITE Vxx X = SPRITE Vyy X
C9 xx yy MOVE Vxx Y = Vyy Y SPRITE Vxx Y = SPRITE Vyy Y
CA xx yy MOVE Vxx X & Vyy SPRITE Vxx X = AND Vyy
CB xx yy MOVE Vxx Y & Vyy SPRITE Vxx Y = AND Vyy
6E kk kk MOVE R16 = #kkkk R16 = kkkk
4F xx yy MOVE R16 = Vxx Vyy R16(MSB) = Vxx, R16(LSB) = Vyy
00 mm mm MSUB @LABEL DO MACHINE LANGUAGE SUB AT mmmm (RETURN WITH CB)
6A xx yy MULV Vxx Vyy MULTIPLY Vxx * Vyy (V00=HIGH BYTE, V01=LOW BYTE)
E9 0n xx PALC Vxx = MLn CHANGE COLOR PALETTE REG Vxx = 3 BYTE DATA AT MLn
EA 00 nn PALG :nn GET PALETTE.PAL = FILENAME nn.PAL
EB 00 yy PALG Vyy GET PALETTE.PAL = FILENAME Vyy
EC xx yy PALR Vxx > Vyy ROTATE COLOR PALETTE REG -> FROM Vxx TO Vyy
ED xx yy PALR Vxx < Vyy ROTATE COLOR PALETTE REG <- FROM Vxx TO Vyy
5E 0n 0k PEEK R16 = MLn #k R16 = MLn (K=1 INCR MLn+2)
58 kn xx PEEK Vxx = MLn #k Vxx = MLn (k=1 INCR MLn+1)
7E 0k 00 PLAY #k PLAY SOUND FILE k
7F xx 00 PLAY Vxx PLAY SOUND FILE Vxx
5D 0n 0k POKE MLn = R16 #k MLn = R16 (K=1 INCR MLn+2)
57 kn xx POKE MLn = Vxx #k MLn = Vxx (K=1 INCR MLn+1)
D0 xx yy PRNT Vxx Vyy DRAW STRING USING ML0 AT Vxx, Vyy, WITH COLOR REG
V00=LAST CHARACTER BYTE PRINTED
79 xx 00 PUTP Vxx PUT BYTE Vxx TO PORT R16
77 xx 00 PUTS Vxx PUT BYTE Vxx TO SERIAL PORT - COM1,19200,03F8H
6C xx kk RAND Vxx = #kk Vxx = RANDOM kk
CC xx kk RAND Vxx X = #kk SPRITE Vxx X = RANDOM kk
CD xx kk RAND Vxx Y = #kk SPRITE Vxx Y = RANDOM kk
03 00 00 RSUB RETURN FROM CHIP12 SUB
68 xx 0k RTAT Vxx > #k Vxx = ROTATE -> k TIMES, V7F=CARRY
69 xx 0k RTAT Vxx < #k Vxx = ROTATE <- k TIMES, V7F=CARRY
88 xx yy RTAT Vxx > Vyy Vxx = ROTATE -> Vyy TIMES, V7F=CARRY
89 xx yy RTAT Vxx < Vyy Vxx = ROTATE <- Vyy TIMES, V7F=CARRY
8F k0 00 SCRN #G GET SCREEN DATA SAVED AT E000:0000 TO E000:FFFF
8F k0 00 SCRN #W WRITE SCREEN DATA AT E000:0000 TO E000:FFFF
66 xx 0k SHIF Vxx > #k Vxx = SHIFT -> k TIMES, V7F=CARRY
67 xx 0k SHIF Vxx < #k Vxx = SHIFT <- k TIMES, V7F=CARRY
86 xx yy SHIF Vxx > Vyy Vxx = SHIFT -> Vyy TIMES, V7F=CARRY
87 xx yy SHIF Vxx < Vyy Vxx = SHIFT <- Vyy TIMES, V7F=CARRY
E0 xx 00 SHOW Vxx DRAW SPRITE Vxx, V7F=COLLISION COLOR
3B 00 kk SKIF JOY = #kk SKIP NEXT INSTR IF JOYSTICK = kk
3C 00 xx SKIF JOY = Vxx SKIP NEXT INSTR IF JOYSTICK = Vxx
32 00 kk SKIF KEY = #kk SKIP NEXT INSTR IF KEY = kk
33 00 xx SKIF KEY = Vxx SKIP NEXT INSTR IF KEY = Vxx
1n mm mm SKIF MLn = #mmmm SKIP NEXT INSTR IF MLn = mmmm
1n mm mm SKIF MLn = @LABEL + #kkkk SKIP NEXT INSTR IF MLn = mmmm + kkkk
3E 0n 00 SKIF MLn = R16 SKIP NEXT INSTR IF MLn = R16
3A 00 00 SKIF PEND = 0 SKIP NEXT INSTR IF VOC SOUND FILE ENDED PLAY
39 00 00 SKIF PORT = 0 SKIP NEXT INSTR IF SERIAL PORT = 0
3D kk kk SKIF R16 = #kkkk SKIP NEXT INSTR IF R16 = kkkk
38 00 00 SKIF TIMR = 0 SKIP NEXT INSTR IF TIMER = 0
F0 xx kk SKIF Vxx X = #kk SKIP NEXT INSTR IF SPRITE Vxx X = kk
F1 xx kk SKIF Vxx Y = #kk SKIP NEXT INSTR IF SPRITE Vxx Y = kk
F2 xx yy SKIF Vxx X = Vyy SKIP NEXT INSTR IF SPRITE Vxx X = Vyy
F3 xx yy SKIF Vxx Y = Vyy SKIP NEXT INSTR IF SPRITE Vxx Y = Vyy
F4 xx kk SKIF Vxx X > #kk SKIP NEXT INSTR IF SPRITE Vxx X > kk
F5 xx kk SKIF Vxx Y > #kk SKIP NEXT INSTR IF SPRITE Vxx Y > kk
F6 xx kk SKIF Vxx X < #kk SKIP NEXT INSTR IF SPRITE Vxx X < kk
F7 xx kk SKIF Vxx Y < #kk SKIP NEXT INSTR IF SPRITE Vxx Y < kk
30 xx kk SKIF Vxx = #kk SKIP NEXT INSTR IF Vxx = kk
31 xx yy SKIF Vxx = Vyy SKIP NEXT INSTR IF Vxx = Vyy
34 xx kk SKIF Vxx > #kk SKIP NEXT INSTR IF Vxx > kk
35 xx yy SKIF Vxx > Vyy SKIP NEXT INSTR IF Vxx > Vyy
36 xx kk SKIF Vxx < #kk SKIP NEXT INSTR IF Vxx < kk
37 xx yy SKIF Vxx < Vyy SKIP NEXT INSTR IF Vxx < Vyy
00 00 00 STOP DO NOTHING INSTRUCTION (LOOP FOREVER)
55 0n xx STOR MLn = Vxx MLn = V00 -> Vxx (MLn=MLn+xx+1)
51 0n xx SUBC MLn - Vxx MLn = - Vxx
C6 xx kk SUBC Vxx X - #kk SPRITE Vxx X = - kk
C7 xx kk SUBC Vxx Y - #kk SPRITE Vxx Y = - kk
8A xx yy SUBC Vxx X - Vyy SPRITE Vxx X - Vyy
8B xx yy SUBC Vxx Y - Vyy SPRITE Vxx Y - Vyy
65 xx kk SUBC Vxx - #kk Vxx = - kk, V7F=BORROW
85 xx yy SUBC Vxx - Vyy Vxx = - Vyy, V7F=BORROW
5C kk kk SUBC R16 - #kkkk R16 = - kkkk, V7F=BORROW
73 00 kk TIMR #kk TIMER = kk (10=1 SECOND DURATION)
74 xx 00 TIMR Vxx TIMER = Vxx (10=1 SECOND DURATION)
71 00 kk TONE #kk TONE = kk (10=1 SECOND DURATION)
72 xx 00 TONE Vxx TONE = Vxx (10=1 SECOND DURATION)
8E k0 00 VDAT #G GET VARIABLES AND MEMORY POINTERS VALUES FROM CHIP12.DAT
8E k0 00 VDAT #W WRITE VARIABLES AND MEMORY POINTERS VALUES TO CHIP12.DAT
EE 00 00 WVRT WAIT FOR VERTICAL RETRACE
75 00 00 XCHG R16 EXCHANGE HIGH BITE AND LOW BITE OF R16 (EX :1234=3412)

Revisions

New content as of 15 June 2017:
- Uploaded new BETA version of CHIP-12 BASIC Compiler and added new sections to the Manual
- Added 1-dimensional arrays to the BASIC Compiler.
- I finally added Multiplication  - Variable = {Variable or Number} * {Variable or Number}

New content as of 23 May 2017:
- Uploaded new BETA version of CHIP-12 BASIC Compiler and added new sections to the Manual
- Added 3 new functions and 1 statement:
LoadSoundFile; LoadPlaySound; PlaySound
If PlayEnd

New content as of 18 May 2017:
- Uploaded new BETA version of CHIP-12 BASIC Compiler and added new sections to the Manual
- Added 5 new functions:
BackGnd()
GPrint and GInput
LoadLargeFont;LoadSmallFont - You must download the updated zipped file 'CHIP12Files.ZIP' as it now contains the new font (FNT) files.

New content as of 9 May 2017:
- Added new content to CHIP-12 BASIC Compiler Manual and added a link to an HTML online version of the Manual.

New content as of 5 May 2017:
- Uploaded new BETA version of CHIP-12 BASIC Compiler and added new sections to the Manual
- Added several new functions and statements:
DeleteSprite, DisplaySprite, LoadSprite, MoveSpriteRight, MoveSpriteLeft, MoveSpriteUp, MoveSpriteDown, SetSpriteXY, ShowSpriteXY
If SpriteX() Then - End If
If SpriteY() Then - End If
GetFile, Writefile
DrawPattern
SHIFT (Left and Right)
Palette

New content as of 23 April 2017:
- Uploaded new BETA version of CHIP-12 BASIC Compiler and added new sections to the Manual
- Added 1 new function: DefNewChar()

New content as of 21 April 2017:
- Uploaded new BETA version of CHIP-12 BASIC Compiler and Manual
- Added 1 new function: STRDUP()

New content as of 19 April 2017:
- Uploaded new BETA version of CHIP-12 BASIC Compiler and Manual
- Added new functions: Color(Variable); Call MLS - MLS - Machine Language Subroutine; .BYTE0; .BYTE1; .BYTE2; .BYTE3;
Timer(); If Timer=0 Then; If Timer<>0 Then; COPYBLOCK
-Improved Prompt String in Input statement so that you can include a string variable

New content as of 6 April 2017:
- Uploaded new BETA version of CHIP-12 BASIC Compiler and Manual (Word document)
- You can now assemble a CHIP-12 file in the compiler. This removes the restriction of the Assembly command in CHIP-12 with a limit of 256 labels and labels having a maximum length of 13 characters.
- The compiler now gives 2 extra files. An assembly (.ASM) and binary (.C12) file.

New content as of 28 March 2017:
- Added 2 new functions - LEN() and INSTR()

New content as of 26 March 2017:
- Added 3 new string functions - LEFT(), RIGHT() and MID()
- Updated manual for added string functions