diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c200d56 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +bak +bin +*.prg +*.dbg +*.dmp +*.txt +*.tmp diff --git a/OSKBasic.asm b/OSKBasic.asm new file mode 100644 index 0000000..fd9826d --- /dev/null +++ b/OSKBasic.asm @@ -0,0 +1,226 @@ +;******************************************************************************* +;* OldSkoolCoder BASIC * +;* * +;* Written By John C. Dale * +;* * +;* Date 26th October 2020 * +;******************************************************************************* +;* * +;* Change History * +;* 26th Oct 2020 : Created new project for use in the new OSKBasic Twitch Sers* +;* 2nd Nov 2020 : Added BASIC Tokaniser and Lister functions for new commands* +;* 23rd Nov 2020 : Added BASIC Evaluator, Executioner, Graphic and Screen Code* +;* 7th Dec 2020 : Added Graphics Functions and BASIC Commands:PLOT and RPOINT* +;* 14th Dec 2020 : Added BASIC Commands:DRAW * +;* 29th Dec 2020 : Updated BASIC Commands:DRAW to not use any BASIC Functions * +;* 6th Jan 2021 : Addes BASIC Commands: CIRCLE, COLOUR, ERASE * +;* 24th Feb 2021 : Addes BASIC Commands: SHAPE * +;* 3rd Mar 2021 : Addes REVERSE, BOX and JOY * +;* 10th Mar 2021 : Added CHAR, HCHAR and SPRITE * +;* 17th Mar 2021 : Added MOB, MOBCOL, FILL * +;* 24th Mar 2021 : Added SPON,SPOFF,SPLACE, Redefine SPRITE, GDUMP, GLOAD, * +;* GSAVE * +;* 31th Mar 2021 : Added VOICE, SOUND, CHANNEL, OFF * +;* 14th Apr 2021 : Added TRIANGLE, SAW, PULSE and NOISE, redeveloped SPRON/OFF* +;* : Added CLG * +;* 21st Apr 2021 : Configure to be a Cartridge File * +;* cartconv -t normal -name "OSK Graphics Extension" * +;* -i oskbasic.prg -o oskbasic.crt * +;******************************************************************************* + +* = $8000 ; Cartridge start Code +CARTSTART = * + +;******************************************************************************* +;* Includes * +;******************************************************************************* + +incasm "incCartInitiate.asm" +incasm "libROMRoutines.asm" +incasm "libBASICRoutines.asm" +incasm "libCharacterPETSCIIConst.asm" +incasm "libGraphicsRoutines.asm" +incasm "incBASICTokaniser.asm" +incasm "incBASICLister.asm" +incasm "incBASICEvalMy.asm" +incasm "incBASICByeBye.asm" +incasm "incVICChipLocations.asm" +incasm "incCIAChipLocations.asm" +*=$8400 + dcb $0400, $01 + +;******************************************************************************* +;* Extra BASIC Graphic Command * +;******************************************************************************* +*=$8800 +incasm "incBASICErrorHandler.asm" +incasm "incGRAPHICCommand.asm" +incasm "incSCREENCommand.asm" +incasm "incPLOTCommand.asm" +incasm "incUtilities.asm" +incasm "incRPOINTCommand.asm" +incasm "incDRAWCommand.asm" +incasm "incCIRCLECommand.asm" +incasm "incCOLOURCommand.asm" +incasm "incERASECommand.asm" +incasm "incSHAPECommand.asm" +incasm "incREVERSECommand.asm" +incasm "incBOXCommand.asm" +incasm "incJOYCommand.asm" +incasm "incCHARCommand.asm" +incasm "incHCHARCommand.asm" +incasm "incSPLACECommand.asm" +incasm "incSPRITECommand.asm" +incasm "incMOBCOLCommand.asm" +incasm "incFILLCommand.asm" +;incasm "incSPONCommand.asm" +;incasm "incSPOFFCommand.asm" +incasm "incSPCommand.asm" +incasm "incGSAVECommand.asm" +incasm "incGLOADCommand.asm" +incasm "incGDUMPCommand.asm" +incasm "incSOUNDCommand.asm" +incasm "incVOICECommand.asm" +incasm "incOFFCommand.asm" +incasm "incCHANNELCommand.asm" +incasm "incTRIANGLECommand.asm" +incasm "incSAWCommand.asm" +incasm "incPULSECommand.asm" +incasm "incNOISECommand.asm" +incasm "incCLGCommand.asm" + +;******************************************************************************* +;* Variables * +;******************************************************************************* + +Buffer = 512 +SCROLX = $D016 +RIBUF = $F7 +STAL = $C1 +MEMUSS = $C3 +INDEX = $22 +ROBUF = $F9 +LINNUM = $14 +SCREENRAM = $0400 ; $0400 +SPRITE_POINTERS = $07F8 +BITMAP_START = $A000 ; $A000 +BITMAP_END = $C000 ; $C000 + +;******************************************************************************* +;* Code * +;******************************************************************************* + +;******************************************************************************* +;* Storage Locations * +;******************************************************************************* +COMM_XLO = $02A8 + ;brk +COMM_XHI = COMM_XLO + 1 + ;brk +COMM_Y = COMM_XHI + 1 + ;brk +COMM_U = COMM_Y + 1 + ;brk +COMM_V = COMM_U + 1 + ;brk +COMM_SLO = COMM_V + 1 + ;brk +COMM_SHI = COMM_SLO + 1 + ;brk +COMM_R = COMM_SHI + 1 + ;brk +COMM_C = COMM_R + 1 + ;brk +COMM_X1LO = COMM_C + 1 + ;brk +COMM_X1HI = COMM_X1LO + 1 + ;brk +COMM_X2LO = COMM_X1HI + 1 + ;brk +COMM_X2HI = COMM_X2LO + 1 + ;brk +COMM_Y1 = COMM_X2HI + 1 + ;brk +COMM_Y2 = COMM_Y1 + 1 + ;brk +COMM_XDLO = COMM_Y2 + 1 + ;brk +COMM_XDHI = COMM_XDLO + 1 + ;brk +COMM_XXLO = COMM_XDHI + 1 + ;brk +COMM_XXHI = COMM_XXLO + 1 + ;brk +COMM_YY = COMM_XXHI + 1 + ;brk +COMM_YD = COMM_YY + 1 + ;brk +COMM_XLLO = COMM_YD + 1 + ;brk +COMM_XLHI = COMM_XLLO + 1 + ;brk +COMM_YL = COMM_XLHI + 1 + ;brk +COMM_AXLO = COMM_YL + 1 + ;brk +COMM_AXHI = COMM_AXLO + 1 + ;brk +COMM_AY = COMM_AXHI + 1 + ;brk +COMM_RXLO = COMM_AY + 1 + ;brk +COMM_RXHI = COMM_RXLO + 1 + ;brk +COMM_RY = COMM_RXHI + 1 + ;brk +COMM_XRLO = COMM_RY + 1 + ;brk +COMM_XRHI = COMM_XRLO + 1 + ;brk +COMM_YR = COMM_XRHI + 1 + ;brk +COMM_START = COMM_YR + 1 + ;text "aaaaaa +COMM_FINISH = COMM_START + 6 + ;text "aaaaaa +COMM_INCR = COMM_FINISH + 6 + ;text "aaaaaa + +ResultFrac = COMM_INCR + 6 +Result = ResultFrac + 1 +ResultHi = Result + 1 + +Working = ResultHi + 1 +WorkingHi = Working + 1 + +Estimate = WorkingHi + 1 +EstimateHi = Estimate + 1 + +Number = EstimateHi + 1 +NumberHi = Number + 1 +Divisor = NumberHi + 1 +DivisorHi = Divisor + 1 + ; xxxx 3210 +DrawingExecutionDriver = DivisorHi + 1 ; xxxx YYXX + ; XYXY 0 = Add, 1 = Subtract + ; + +COMM_XLFRAC = DrawingExecutionDriver + 1 +COMM_YLFRAC = COMM_XLFRAC + 1 +COMM_GRAPHIC_COLOUR = COMM_YLFRAC + 1 +COMM_ERASE_ENABLED = COMM_GRAPHIC_COLOUR + 1 + +COMM_CXHI = COMM_ERASE_ENABLED + 1 +COMM_CXLO = COMM_CXHI + 1 +COMM_CY = COMM_CXLO + 1 + +COMM_VOICEGATES = COMM_CY + 1 +COMM_NEXT_VAR = COMM_VOICEGATES + 4 + +BYTEMASK + BYTE $80, $40, $20, $10, $08, $04, $02, $01 + +*=$9FFF + brk +;*=$A000 +;incbin "basic.bin" diff --git a/OSKBasic.cbmprj b/OSKBasic.cbmprj new file mode 100644 index 0000000..f6e2ffc --- /dev/null +++ b/OSKBasic.cbmprj @@ -0,0 +1,625 @@ + + + + + + 2 + oskbasic.prg + 2049 + False + False + False + False + True + + This is My Version Of Simons BASIC circa 1984/5 + OldSkoolCoder + OldSkoolCoder@outlook.com + oskbasic.prg + False + CBM prg Studio 3.14.0 + True + + + False + C64 CARTRIDGE + + 40 + 1 + 0 + 0 + False + False + CHIP + 0 + + + False + False + False + + + + + OSKBasic.asm + incCartInitiate.asm + libROMRoutines.asm + libBASICRoutines.asm + libCharacterPETSCIIConst.asm + incBASICTokaniser.asm + incBASICLister.asm + incBASICEvalMy.asm + incBASICByeBye.asm + incBASICErrorHandler.asm + incGRAPHICCommand.asm + incVICChipLocations.asm + incCIAChipLocations.asm + incSCREENCommand.asm + libGraphicsRoutines.asm + incPLOTCommand.asm + incRPOINTCommand.asm + incDRAWCommand.asm + incUtilities.asm + incOldDRAWCommand.asm + incCIRCLECommand.asm + incCOLOURCommand.asm + incERASECommand.asm + incSHAPECommand.asm + incREVERSECommand.asm + incBOXCommand.asm + incJOYCommand.asm + incCHARCommand.asm + incHCHARCommand.asm + incSPLACECommand.asm + incSPRITECommand.asm + incMOBCOLCommand.asm + incFILLCommand.asm + incSPONCommand.asm + incSPOFFCommand.asm + incGSAVECommand.asm + incGLOADCommand.asm + incGDUMPCommand.asm + incSOUNDCommand.asm + incVOICECommand.asm + incOFFCommand.asm + incChannelCommand.asm + incSPCommand.asm + incSAWCommand.asm + incPULSECommand.asm + incNOISECommand.asm + incCLGCommand.asm + + 0 + 0 + + + + + + + incBASICByeBye.asm + + 2 + True + + + 22 + True;0;0;2;0;False;22;False;0 + True + + + False + False + + + incBASICErrorHandler.asm + + 2 + True + + + 16 + True;0;0;2;0;False;16;False;0 + True + + + False + True + + + incBASICEvalMy.asm + + 2 + True + + + + False + False + + + incBASICLister.asm + + 2 + True + + + + False + False + + + incBASICTokaniser.asm + + 2 + True + + + + False + True + + + incBOXCommand.asm + + 2 + True + + + + False + False + + + incCartInitiate.asm + + 2 + True + + + + False + True + + + incChannelCommand.asm + + 2 + True + + + + False + False + + + incCHARCommand.asm + + 2 + True + + + + False + False + + + incCIAChipLocations.asm + + 2 + True + + + + False + False + + + incCIRCLECommand.asm + + 2 + True + + + + False + False + + + incCLGCommand.asm + + 2 + True + + + + False + True + + + incCOLOURCommand.asm + + 2 + True + + + + False + False + + + incDRAWCommand.asm + + 2 + True + + + + False + True + + + incERASECommand.asm + + 2 + True + + + + False + False + + + incFILLCommand.asm + + 2 + True + + + + False + False + + + incGDUMPCommand.asm + + 2 + True + + + + False + False + + + incGLOADCommand.asm + + 2 + True + + + + False + True + + + incGRAPHICCommand.asm + + 2 + True + + + + False + True + + + incGSAVECommand.asm + + 2 + True + + + + False + True + + + incHCHARCommand.asm + + 2 + True + + + + False + False + + + incJOYCommand.asm + + 2 + True + + + + False + False + + + incMOBCOLCommand.asm + + 2 + True + + + + False + False + + + incNOISECommand.asm + + 2 + True + + + + False + True + + + incOFFCommand.asm + + 2 + True + + + + False + False + + + incOldDRAWCommand.asm + + 2 + True + + + + False + False + + + incPLOTCommand.asm + + 2 + True + + + + False + False + + + incPULSECommand.asm + + 2 + True + + + + False + False + + + incREVERSECommand.asm + + 2 + True + + + + False + False + + + incRPOINTCommand.asm + + 2 + True + + + + False + False + + + incSAWCommand.asm + + 2 + True + + + + False + False + + + incSCREENCommand.asm + + 2 + True + + + + False + False + + + incSHAPECommand.asm + + 2 + True + + + + False + False + + + incSOUNDCommand.asm + + 2 + True + + + + False + False + + + incSPCommand.asm + + 2 + True + + + + False + False + + + incSPLACECommand.asm + + 2 + True + + + + False + False + + + incSPOFFCommand.asm + + 2 + True + + + + False + False + + + incSPONCommand.asm + + 2 + True + + + + False + False + + + incSPRITECommand.asm + + 2 + True + + + + False + False + + + incUtilities.asm + + 2 + True + + + + False + False + + + incVICChipLocations.asm + + 2 + True + + + + False + False + + + incVOICECommand.asm + + 2 + True + + + + False + False + + + libBASICRoutines.asm + + 2 + True + + + + False + False + + + libCharacterPETSCIIConst.asm + + 2 + True + + + + False + False + + + libGraphicsRoutines.asm + + 2 + True + + + + False + True + + + libROMRoutines.asm + + 2 + True + + + + False + False + + + OSKBasic.asm + + 2 + True + + + + True + True + + + \ No newline at end of file diff --git a/OSKBasic.gitignore b/OSKBasic.gitignore new file mode 100644 index 0000000..9271386 --- /dev/null +++ b/OSKBasic.gitignore @@ -0,0 +1,6 @@ +# Created with CBM prg Studio +*.prg +bak +*.dbg +*.dmp +*.dup diff --git a/README.md b/README.md new file mode 100644 index 0000000..f84264b --- /dev/null +++ b/README.md @@ -0,0 +1,226 @@ +# GRAPHICS EXTENSION COMMANDS FOR THE COMMODORE 64 +## RUNS IN THE 6K AT THE TOP OF BASIC MEMORY +## LOADS IN LOCATION 32768 – 38912 +### WRITTEN FOR THE COMMODORE 64 BY JOHN C. DALE (aka OldSkoolCoder) +### (C) MARCH 1985 BY DALES♥FT + +This machine code program will provide 25 extra commands for your **COMMODORE 64**. The program will be placed in the top 6K of BASIC ram, but when you run it, it will protect itself. + +The commands can be used in program mode and direct mode, but suing the commands in direct mode may result sometimes in a SYNTAX error. + +Pressing **RUN/STOP** and **RESTORE** keys together will reset the computer plus resetting the commands as well. When this happens a message will appear on the screen :- + +### GRAPHICS EXTENSION FOR THE COMMODORE 64 +### (C) MARCH 1985 BY DALES♥FT +This assures you that the commands are still active in the computer. + +# THE COMMANDS AVAILABLE TO YOU +## BOX +The ***BOX*** command draws a box on the Hi-Res screen. The command parameters are two sets of co-ordinates. The first set (X1,Y1) is the lower left hand corner of the box, the second set (X2,Y2) is the top right hand corner of the box. From these co-ordinates the box is drawn. + + Format :- BOX X1, Y1 TO X2, Y2 + + Example :- 10 GRAPHIC + 20 FOR I = 0 TO 20 STEP 3 + 30 BOX I, I TO 200-I, 200-I + 40 NEXT +## CHAR +The ***CHAR*** command put text onto the H-RES screen. The command parameters are the co-ordinates of the text (X,Y), and the text that is to be printed. + + Format :- CHAR X, Y, “TEXT” + + Example :- 10 GRAPHIC + 20 A$ = “COMMANDS” + 30 CHAR 0, 100, “GRAPHICS” + 40 CHAR 72, 90, A$ +## CIRCLE +The ***CIRCLE*** command draws a circle on the Hi-Res screen. The command parameters are the centre of the circle or ellipse (X,Y), the horizontal and vertical radii (Xrad, Yrad) and where to start and finish the circle (which measured in degrees). + + Format :- CIRCLE X, Y, Xrad, Yrad, Start°, Finish° + + Example :- 10 GRAPHIC + 20 CIRCLE 160, 100, 40, 0, 361 + 30 CIRCLE 100, 50, 25, 25, 180, 270 + 40 CIRCLE 160, 100, 100, 90, 90, 180 +## COLOUR +The ***COLOUR*** command changes the screen and border colours, it also changes the extended background colours if the user wishes. Each Other setting can be between 0 to 255, but as you may know there are only sixteen colours, therefore the colour number must not exceed the value sixteen. + + Format :- COLOUR Border, Screen [, Back, Back2, Back3] + […..] these parameters are optional. + + Example :- 10 PRINT ”CLR” + 20 FOR I = 0 to 255 + 30 POKE I+1024, I + 40 POKE 55296+I, 0 + 50 NEXT : POKE 53265, PEEK(53265) OR 64 + 60 FOR COL = 0 to 16 + 70 COLOUR COL, COL+1, COL+2, COL+3, COL+4 + 80 FOR DE = 0 TO 100 : NEXT + 90 COLOUR 14, 6 + 100 NEXT + +**Note** : If you want to change the colour of the Hi-Res picture (not the background), then multiply the screen colour by what colour number you want the picture to be. + +## DRAW +The ***DRAW*** command will draw a line on the Hi-Res screen. The command parameters are two sets of co-ordinates. The first set X1, Y1 points to where the line is to start, X2, Y2 points to where the line is to finish. + + Format :- DRAW X1, Y1, TO X2, Y2 + + Example :- 10 GRAPHIC + 20 FOR I = 0 TO 200 STEP 10 + 30 DRAW 0, 200-I TO I, 0 + 40 DRAW 319-I, 200 TO 319, I + 50 DRAW 319-I, 0 TO 319, 200-I + 60 DRAW 0, I TO I, 200 + 70 NEXT +## ERASE +The ***ERASE*** command puts erase mode on or off. The first time you use this in a program it will turn on erase mode, the second time will switch the mode off. The erase mode will erase any line (or point) on the screen, but if there is no line (or point) then the erase mode will temporarily switch off the erase mode and draw the line (or point), then the erase will switch back on. + + Format :- ERASE + + Example :- 10 GRAPHIC + 20 DRAW 10, 10 TO 100, 100 + 30 ERASE : REM TURN ON ERASE + 40 DRAW 10, 100 TO 100, 10 + 50 DRAW 10, 10 TO 100, 100 + 60 ERASE : REM TURN OFF ERASE +## FILL +The ***FILL*** command will fill any area in the Hi-Res screen. The command parameters are the co-ordinates of the area to fill. The command works well in areas which have no gaps. + + Format :- FILL X, Y + + Example :- 10 GRAPHIC + 20 CIRCLE 160, 100, 80, 80, 0, 370 + 30 FILL 160, 100 +## GRAPHIC +The ***GRAPHIC*** command will put the computer into Hi-Res mode for drawing. The dimensions of the Hi-Res screen are 0 to 319 on the horizontal axis and 0 to 200 on the vertical axis. If values outside these limits are used an ILLEGAL QUANTITY ERROR will result. + + Format :- GRAPHIC +## HCHAR +The ***HCHAR*** command is just like the CHAR command but instead of plotting normal text, it puts double height text. The parameters are the co-ordinates of where the text is to be plotted. + + Format :- HCHAR X, Y, “TEXT” + + Example :- 10 GRAPHIC + 20 A$ = “COMMANDS” + 30 HCHAR 0, 100, “GRAPHICS” + 40 HCHAR 72, 90, A$ +## GDUMP +The ***GDUMP*** Command will read the Hi-Res screen and then print out the screen on the printer, if the user requires a hard copy of the picture.  +## SPRITE +The ***SPRITE*** command is used to set up the information about a sprite. The parameters are the sprite number (0 to 7), the pointer to where the data is stored for that sprite (0 to 255), whether the sprite is on or off, is the sprite expanded horizontally, is the sprite expanded vertically, has the background got priority over the sprite and is the sprite in multi-colour mode (all the information after the pointer is indicated by 0 for off, 1 for on). + + Format :- SPRITE Sprite#, Pointer, Exp X, Exp Y, Back, Mult + + Example :- Look at sprite command example + +## MOBCOL +The ***MOBCOL*** command is used to set up both the multi-colour elements of the sprite, when the sprite is in multi-colour mode. + + Format :- MOBCOL Col1, Col2 + + Example :- Look at Sprite Command Example +## PLOT +The ***PLOT*** command will plot one single point on a Hi-Res screen. The command parameters are the co-ordinates for the point to be plotted (X,Y). + + Format :- PLOT X, Y + + Example :- 10 GRAPHIC + 20 FOR X = 0 TO 319 + 30 Y = 100 + (70 * SIN (I / 64)) + 40 PLOT X, Y + 50 NEXT +## POLY +The ***POLY*** command will draw a multi sided polygon of the users choice. The command has the same parameters as the circle command, but also has an extra parameter which is the increment angle of the next side to be drawn (this is measured in degrees also). If you want a six sided polygon you work out the increment value by dividing three hundred and sixty degrees by the number of sides. + +Therefor 360° / 6 = 60° so the increment angle is 60°. + + Format :- POLY X, Y, Xrad, Yrad, Start°, Finish°, Inc° + + Example :- 10 GRAPHIC + 20 POLY 160, 100, 100, 80, 0, 370, 60 + 30 POLY 160, 100, 50, 50, 0, 370, 120 +  +## GPUT +The ***GPUT*** Command will save the Hi-Res screen on the device specified with the filename of the users’ choice. + + Format :- GPUT “FILENAME”, Dev +## GPULL +The ***GPULL*** command will load a Hi-Res screen from a specified device, with the filename of the users’ choice. + + Format :- GPULL “FILENAME”, Dev +## REVERSE +The ***REVERSE*** command makes the Hi-Res screen reverse on. I.e. all the black areas become white and all the white areas become black. + + Format :- REVERSE +## RJOY +The ***RJOY*** Command will read either port one or port two depending on what is inside the brackets. The value of the joystick will be placed in the variable which the user specified. + + Format :- RJOY ( 0 or 1) +If you put 0 in the brackets that is port two, 1 is port one. + + Example :- 10 A = RJOY(0) : B = RJOY(1) + 20 PRINT A, B + 30 GOTO 10 +The values you can get from the joystick command is :- + + 5 1 9 + + + + + + + + + + + + + 4 ++++++++++ 8 Fire = 16 + + + + + + + + + + + + + 6 2 10 +## RPDL +The ***RPDL*** command will read the paddle specified in the brackets and return that value in the specified variable. + + Format :- RPDL (0 or 1) + + Example :- 10 A = RPDL(0) : B = RPDL(1) + 20 PRINT A, B + 30 GOTO 10 +## SPENABLE +The ***SPENABLE*** command will allow the user to enable a sprite. + + Format :- SPENABLE Sprite# +## SPDISABLE +The ***SPDISABLE*** command will allow the user to disable a sprite. + + Format :- SPDISABLE Sprite# +## SPLACE +The ***SPLACE*** command will allow the user to interact wit the sprites and allow the user to easily specify the x,y coordinates and the colour of the sprite too. + + Format :- SPLACE Sprite#, X, Y, Colour + + Example :- 10 FOR I= 0 TO 62:READ A:POKE 12288 + I,A : NEXT + 20 SPRITE 0, 192, 1, 1, 0, 1 + 30 MCOL 12,15 + 40 SPLACE 0, 100, 100, 2 + 50 SPENABLE 0 + 60 GET A$ : IF A$="" THEN 60 + 70 SPDISABLE + 1000 REM SPRITE DATA + 1010 DATA 16,0,18 + 1020 DATA 8,126,28 + 1030 DATA 5,255,204 + 1040 DATA 6,16,54 + 1050 DATA 15,159,240 + 1060 DATA 8,146,16 + 1070 DATA 8,243,240 + 1080 DATA 8,242,16 + 1090 DATA 8,244,8 + 1100 DATA 31,254,24 + 1110 DATA 32,1,244 + 1120 DATA 32,0,164 + 1130 DATA 39,128,188 + 1140 DATA 39,192,164 + 1150 DATA 31,255,252 + 1160 DATA 13,60,176 + 1170 DATA 25,195,152 + 1180 DATA 49,0,140 + 1190 DATA 48,0,12 + 1200 DATA 120,0,30 + 1210 DATA 204,0,51 + \ No newline at end of file diff --git a/incBASICByeBye.asm b/incBASICByeBye.asm new file mode 100644 index 0000000..16d6467 --- /dev/null +++ b/incBASICByeBye.asm @@ -0,0 +1,26 @@ +;******************************************************************************* +;* ByeBye Routine * +;******************************************************************************* + +VEC_BYEBYE + jsr bas_CHRGET$ ; Get next character + cmp #$CC ; lower that our "Program" command range + bcc BYERTS + cmp #$FE ; Above our "Program" command range + bcs BYERTS + jsr BYEGO ; Execute our Command + jmp bas_NewStatement$ ; Got to gext BASIC Statement + +BYEGO + sbc #$CB ; subtract out Tokan Base Value + asl ; x 2 + tay ; transfer to index + lda Command_ADDR + 1,y ; Command Hi Location + pha + lda Command_ADDR,y ; Command Lo Location + pha + jmp bas_CHRGET$ ; Get Next Character + +BYERTS + jsr bas_CHRGOT$ ; Get Current Character + jmp bas_GONE$ + 3 ; BASIC Execution system diff --git a/incBASICErrorHandler.asm b/incBASICErrorHandler.asm new file mode 100644 index 0000000..ce00886 --- /dev/null +++ b/incBASICErrorHandler.asm @@ -0,0 +1,57 @@ +;******************************************************************************* +;* Error Handler Routine * +;******************************************************************************* + +ErrorHandlerLo = $22 +ErrorHandlerHi = $23 + +VEC_ErrorHandler + txa + pha + bpl @DisplayError + pla + jmp bas_ReadyPrompt$ + +@DisplayError + cmp #31 + bcc @ROMError + sec + sbc #31 + asl + tax + lda ErrorCodeAddr,x + sta ErrorHandlerLo + lda ErrorCodeAddr + 1,x + sta ErrorHandlerHi + pla + jmp bas_CustomError$ + +@ROMError + jsr COM_SCREEN + pla + tax + jmp bas_ROMError$ + 3 + +ErrorCodeADDR + ; ToDo Add Error Codes + WORD ERRORCODE_31 + WORD ERRORCODE_32 + WORD ERRORCODE_33 + +ERRORCODE_31 + TEXT "operationaL" + +ERRORCODE_32 + TEXT "this is error thirty twO" + +ERRORCODE_33 + TEXT "this is error thirty threE" +;****************************************************************************** +;* Show Syntax Error * +;****************************************************************************** + +SYNTAX_ERROR + lda #32 + sta 129 + ldx #11 + jmp (jmpvec_Error) \ No newline at end of file diff --git a/incBASICEvalMy.asm b/incBASICEvalMy.asm new file mode 100644 index 0000000..d60992e --- /dev/null +++ b/incBASICEvalMy.asm @@ -0,0 +1,22 @@ +;******************************************************************************* +;* EvalMy Routine * +;******************************************************************************* + +VEC_EVALMY + lda #0 + sta $0D ; reset variable type data + jsr bas_CHRGET$ ; get next character + cmp #$CC ; lower than our "Direct" command range + bcc EVALLV + cmp #$CE ; above our command "Direct" range + bcs EVALLV + jmp BYEGO ; Execute our Command + +EVALLV + lda $7A ; reset ChrGet Pointer + bne EVALRT + dec $7B + +EVALRT + dec $7A + jmp bas_EVAL$ + 3 ; Jump to BASIC Rom Eval Routine diff --git a/incBASICLister.asm b/incBASICLister.asm new file mode 100644 index 0000000..f056be8 --- /dev/null +++ b/incBASICLister.asm @@ -0,0 +1,42 @@ +;******************************************************************************* +;* Lister Routine * +;******************************************************************************* + +VEC_LISTER + php ; Push Status To Stack + cmp #255 ; Compare with 255 + beq LEXIT ; Is 255 then Exit + bit $0F ; Test against $0f + bmi LEXIT ; if negative then Exit + cmp #$CC ; + bcc LEXIT ; <$CC (start of our BASIC Commands) then EXIT + plp ; restore status + sec + sbc #$CB ; subtract $CB to find our command index number + tax + sty $49 ; store away Y for now + ldy #$FF ; Start Y + +RESLP1 + dex ; Decrement Command Number by 1 + beq RESPRT ; Found it ;) + +RESLP2 + iny ; increase command character counter + lda Command_LIST,y ; + bpl RESLP2 ; command char + bmi RESLP1 ; end of command char + +RESPRT + iny ; move chart index + lda Command_LIST,y ; get command char + bmi RESEXT ; exit if SHIFTED + jsr krljmp_CHROUT$ ; print + bne RESPRT ; go round for next char + +RESEXT + jmp $A6EF ; jump to BASIC Lister + +LEXIT + plp + jmp bas_UNCRUNCH$ + 3 ; Jump to Normal Basic Lister \ No newline at end of file diff --git a/incBASICTokaniser.asm b/incBASICTokaniser.asm new file mode 100644 index 0000000..e8192fc --- /dev/null +++ b/incBASICTokaniser.asm @@ -0,0 +1,174 @@ +;******************************************************************************* +;* Tokaniser Routine * +;******************************************************************************* + +VEC_TOKAN + jsr bas_CRUNCH$ + 3 + ldy #5 +LOOPOT + lda Buffer-5,y + beq CNCHRT + cmp #CHR_Quote + beq LOOPQT + cmp #"a" + bcc LOOPBK + cmp #"[" + bcs LOOPBK + sty $B1 + ldx #$00 + stx $0B + cmp #128 + bcc LOOPIN + eor #128 + +LOOPIN + sec + sbc Command_LIST,x + beq NEXT + cmp #128 + beq DONE + +LOOPNO + lda Command_LIST,x + beq LOOPBK + bmi CONTLP + inx + bne LOOPNO + +CONTLP + inc $0B + ldy $B1 + byte $A9 + +NEXT + iny + lda Buffer-5,y + inx + bne LOOPIN + +DONE + ldx $B1 + lda $0B + clc + adc #$CC + sta Buffer-5,x + +LOOPC + iny + inx + lda Buffer-5,y + sta Buffer-5,x + bne LOOPC + + ldy $B1 + +LOOPBK + iny + bne LOOPOT + +LOOPQT + iny + lda Buffer-5,y + beq CNCHRT + cmp #CHR_Quote + bne LOOPQT + beq LOOPBK + +CNCHRT + lda #0 + sta Buffer-5,y + rts +; lda #0 +; sta $0B +; sta $7A +; jmp bas_CRUNCH$ + 3 + +;****************************************************************************** +;* Command List * +;****************************************************************************** + +Command_LIST + text "graphiC" + text "screeN" + text "rploT" + text "ploT" + text "draW" + text "circlE" + text "colouR" + text "erasE" + text "shapE" + text "reversE" + text "boX" + text "joY" + text "chaR" + text "hchaR" + text "mobcoL" + text "splacE" +; text "spdisablE" +; text "spenablE" + text "spritE" + text "sP" + text "filL" + text "gpuT" + text "gpulL" + text "gdumP" + text "sounD" + text "voicE" + text "ofF" + text "channeL" + text "trianglE" + text "saW" + text "pulsE" + text "noisE" + text "clG" + brk + +;****************************************************************************** +;* Command Address * +;****************************************************************************** + +TOKANISER_ON = $91 +TOKANISER_OFF = $E4 +TOKANISER_TRIANGLE = $E6 +TOKANISER_SAW = $E7 +TOKANISER_PULSE = $E8 +TOKANISER_NOISE = $E9 + +Command_ADDR + ; Direct & Program Commands + word COM_GRAPHIC - 1 ; Tokan $CC + word COM_SCREEN - 1 ; Tokan $CD + word COM_RPOINT - 1 ; Tokan $CE + word COM_POINT - 1 ; Tokan $CF + word COM_DRAW - 1 ; Tokan $D0 + word COM_CIRCLE - 1 ; Tokan $D1 + word COM_COLOUR - 1 ; Tokan $D2 + word COM_ERASE - 1 ; Tokan $D3 + word COM_SHAPE - 1 ; Tokan $D4 + word COM_REVERSE - 1 ; Tokan $D5 + word COM_BOX - 1 ; Tokan $D6 + word COM_JOY - 1 ; Tokan $D7 + word COM_CHAR - 1 ; Tokan $D8 + word COM_HCHAR - 1 ; Tokan $D9 + word COM_MOBCOL - 1 ; Tokan $DA + word COM_SPLACE - 1 ; Tokan $DB +; word COM_SPROFF - 1 ; Tokan $DC +; word COM_SPRON - 1 ; Tokan $DD + word COM_SPRITE - 1 ; Tokan $DC + word COM_SP - 1 ; Tokan $DD + word COM_FILL - 1 ; Tokan $DE + word COM_GSAVE - 1 ; Tokan $DF + word COM_GLOAD - 1 ; Tokan $E0 + word COM_GDUMP - 1 ; Tokan $E1 + word COM_SOUND - 1 ; Tokan $E2 + word COM_VOICE - 1 ; Tokan $E3 + word COM_OFF - 1 ; Tokan $E4 + word COM_CHANNEL - 1 ; Tokan $E5 + word COM_TRIANGLE - 1 ; Tokan $E6 + word COM_SAW - 1 ; Tokan $E7 + word COM_PULSE - 1 ; Tokan $E8 + word COM_NOISE - 1 ; Tokan $E9 + word COM_CLG - 1 ; Tokan $EA + + ; Program Commands Only + diff --git a/incBOXCommand.asm b/incBOXCommand.asm new file mode 100644 index 0000000..4670a18 --- /dev/null +++ b/incBOXCommand.asm @@ -0,0 +1,108 @@ +;******************************************************************************* +;* BOX Command * +;* This BASIC function put a box on a Hi-Res Screen * +;* ***************************************************************************** +;* Syntax : BOX or b Shifted O * +;* Inputs : X1 (0->319) and Y1 (0 ->199) * +;* : X2 (0->319) and Y2 (0 ->199) * +;******************************************************************************* + +; box : box x1,y1 to x2,y2 + +COM_BOX + jsr GetNo2 ; Get X1 + sta COMM_AXLO + sty COMM_AXHI + + jsr bas_CHKCOM$ ; Checks For a Comma + jsr bas_GETBYTC$; Get Y1 + stx COMM_AY + + lda #164 + jsr bas_SYNCHR$ ; Check For the BASIC Command 'TO' + + jsr GetNo2 ; Get X2 + sta COMM_RXLO + sty COMM_RXHI + + jsr bas_CHKCOM$ ; Checks For a Comma + jsr bas_GETBYTC$; Get Y2 + stx COMM_RY + + ; X1 = AX, Y1 = AY + ; X2 = RX, Y2 = RY + ; Bottom Line of Box + ; X1,Y1 -> X2,Y1 + lda COMM_AXLO + sta COMM_X1LO + lda COMM_AXHI + sta COMM_X1HI + lda COMM_AY + sta COMM_Y1 + + lda COMM_RXLO + sta COMM_X2LO + lda COMM_RXHI + sta COMM_X2HI + lda COMM_AY + sta COMM_Y2 + + jsr DRAW_LINE_START + + ; Right Side Line of Box + ; X2,Y1 -> X2,Y2 + lda COMM_RXLO + sta COMM_X1LO + lda COMM_RXHI + sta COMM_X1HI + lda COMM_AY + sta COMM_Y1 + + lda COMM_RXLO + sta COMM_X2LO + lda COMM_RXHI + sta COMM_X2HI + lda COMM_RY + sta COMM_Y2 + + jsr DRAW_LINE_START + + ; Top Line of Box + ; X2,Y2 -> X1,Y2 + lda COMM_RXLO + sta COMM_X1LO + lda COMM_RXHI + sta COMM_X1HI + lda COMM_RY + sta COMM_Y1 + + lda COMM_AXLO + sta COMM_X2LO + lda COMM_AXHI + sta COMM_X2HI + lda COMM_RY + sta COMM_Y2 + + jsr DRAW_LINE_START + + ; Left Side Line of Box + ; X1,Y2 -> X1,Y1 + lda COMM_AXLO + sta COMM_X1LO + lda COMM_AXHI + sta COMM_X1HI + lda COMM_RY + sta COMM_Y1 + + lda COMM_AXLO + sta COMM_X2LO + lda COMM_AXHI + sta COMM_X2HI + lda COMM_AY + sta COMM_Y2 + + jsr DRAW_LINE_START + + rts + + \ No newline at end of file diff --git a/incCHARCommand.asm b/incCHARCommand.asm new file mode 100644 index 0000000..b825e63 --- /dev/null +++ b/incCHARCommand.asm @@ -0,0 +1,186 @@ +;******************************************************************************* +;* CHAR Command * +;* This BASIC function puts a string on a Hi-Res Screen * +;* ***************************************************************************** +;* Syntax : CHAR or ch Shifted A * +;* Inputs : X (0->319) and Y (0 ->199) * +;* : "text" * +;******************************************************************************* + +; char : char x,y,"hello world" +COM_CHAR + lda #0 + sta COMM_XLLO ; Flag For Double Height Chars + +COM_CHAR_START + jsr GetNo2 ; Get X + sta COMM_XRLO + sty COMM_XRHI + + jsr bas_CHKCOM$ ; Checks For a Comma + jsr bas_GETBYTC$; Get Y + stx COMM_YR + + jsr bas_CHKCOM$ ; Checks For a Comma + + jsr bas_FRMEVL$ + jsr bas_FRESTR$ + + tay + lda INDEX ; Address Of String + sta ROBUF + lda INDEX + 1 ; Address Of String + sta ROBUF + 1 + sty COMM_RXLO ; Length Of String + + sec + jsr krljmp_PLOT$ + sty COMM_AY + stx COMM_AXLO + + lda SCREENRAM + sta COMM_START + + lda #CHR_Home + jsr krljmp_CHROUT$ + + ldy #0 +CHAR_Looper + lda (ROBUF),y + cmp #CHR_Space + bcs @NotSpace + + jsr krljmp_CHROUT$ + iny + jmp CHAR_Looper + +@NotSpace + cmp #161 + bcs @ContinueChar + cmp #128 + bcc @ContinueChar + jsr krljmp_CHROUT$ + iny + jmp CHAR_Looper + +@ContinueChar + jsr krljmp_CHROUT$ + lda #CHR_Home + jsr krljmp_CHROUT$ + + lda SCREENRAM + sta LINNUM + lda #0 + sta LINNUM + 1 + + asl LINNUM ; x 2 + rol LINNUM + 1 + + asl LINNUM ; x 4 + rol LINNUM + 1 + + asl LINNUM ; x 8 + rol LINNUM + 1 + + clc + lda LINNUM + 1 + adc #$D0 + sta LINNUM + 1 + + sty COMM_YY + ldy #0 + +CHAR_LINE_Looper ; Char2 + ldx #0 +CHAR_PIXEL_Looper + lda $DC0E + and #$FE ; %1111 1110 + sta $DC0E + + lda 1 + and #$FB ; %1111 1011 + sta 1 + +READCharRom_Looper + lda (LINNUM),y + pha + + lda 1 + ora #4 ; %0000 0100 + sta 1 + + lda $DC0E + ora #$01 ; %0000 0001 + sta $DC0E + + pla + and BYTEMASK,x + cmp BYTEMASK,x + beq CHAR_PLACEDOT ; Char4 + +CHAR_PixelLooper + inx + cpx #8 + bne CHAR_PIXEL_Looper + iny + cpy #8 + bne CHAR_LINE_Looper + + ldx COMM_YY + inx + stx COMM_YY + cpx COMM_RXLO ; String Length + beq CHAR_Finished + + lda COMM_XRLO + clc + adc #8 + sta COMM_XRLO + bcc @SkipINC + inc COMM_XRHI +@SkipINC + ldy COMM_YY + jmp CHAR_Looper + +CHAR_Finished + lda COMM_START + sta SCREENRAM + + clc + ldy COMM_AY + ldx COMM_AXLO + jmp krljmp_PLOT$ + +CHAR_PLACEDOT + stx COMM_X1LO + sty COMM_Y1 + + txa + clc + adc COMM_XRLO + sta COMM_XLO + lda COMM_XRHI + adc #0 + sta COMM_XHI + + lda #7 + sec + sbc COMM_Y1 + clc + adc COMM_YR + sta COMM_Y + + jsr PLACE + + lda COMM_XLLO ; Bit 7 = 0 = Normal Size Chars, 1 = Double Height + bpl @PlotDot + jsr HCHAR_ADDING_SECONDLINE + jmp @ByPassDot + +@PlotDot + jsr DOT + +@ByPassDot + ldx COMM_X1LO + ldy COMM_Y1 + jmp CHAR_PixelLooper \ No newline at end of file diff --git a/incCIAChipLocations.asm b/incCIAChipLocations.asm new file mode 100644 index 0000000..8c316c5 --- /dev/null +++ b/incCIAChipLocations.asm @@ -0,0 +1,103 @@ +CIA1 = $DC00 + +CIA1_PRA = $DC00 + +CIA1_PRA_Joystick2_Up = %00000001 +CIA1_PRA_Joystick2_Down = %00000010 +CIA1_PRA_Joystick2_Left = %00000100 +CIA1_PRA_Joystick2_Right = %00001000 +CIA1_PRA_Joystick2_Fire = %00010000 + +CIA1_PRA_Paddle1_Fire = %00000100 +CIA1_PRA_Paddle2_Fire = %00001000 + +CIA1_PRA_Keyboard_Col5 = %00010000 +CIA1_PRA_Keyboard_Col6 = %00100000 +CIA1_PRA_Keyboard_Col7 = %01000000 + +CIA1_PRB = $DC01 + +CIA1_PRB_Joystick1_Up = %00000001 +CIA1_PRB_Joystick1_Down = %00000010 +CIA1_PRB_Joystick1_Left = %00000100 +CIA1_PRB_Joystick1_Right = %00001000 +CIA1_PRB_Joystick1_Fire = %00010000 + +CIA1_PRB_Paddle1_Fire = %00000100 +CIA1_PRB_Paddle2_Fire = %00001000 + +CIA1_PRB_Keyboard_Col5 = %00010000 +CIA1_PRB_Keyboard_Col6 = %00100000 +CIA1_PRB_Keyboard_Col7 = %01000000 + +CIA1_DDRA = $DC02 + +CIA_DDR_Bit0_Direction_Output = %00000001 +CIA_DDR_Bit0_Direction_Input = 255 - CIA_DDR_Bit0_Direction_Output ; %11111110 +CIA_DDR_Bit1_Direction_Output = %00000010 +CIA_DDR_Bit1_Direction_Input = 255 - CIA_DDR_Bit1_Direction_Output ; %11111101 +CIA_DDR_Bit2_Direction_Output = %00000100 +CIA_DDR_Bit2_Direction_Input = 255 - CIA_DDR_Bit2_Direction_Output ; %11111011 +CIA_DDR_Bit3_Direction_Output = %00001000 +CIA_DDR_Bit3_Direction_Input = 255 - CIA_DDR_Bit3_Direction_Output ; %11110111 +CIA_DDR_Bit4_Direction_Output = %00010000 +CIA_DDR_Bit4_Direction_Input = 255 - CIA_DDR_Bit4_Direction_Output ; %11101111 +CIA_DDR_Bit5_Direction_Output = %00100000 +CIA_DDR_Bit5_Direction_Input = 255 - CIA_DDR_Bit5_Direction_Output ; %11011111 +CIA_DDR_Bit6_Direction_Output = %01000000 +CIA_DDR_Bit6_Direction_Input = 255 - CIA_DDR_Bit6_Direction_Output ; %10111111 +CIA_DDR_Bit7_Direction_Output = %10000000 +CIA_DDR_Bit7_Direction_Input = 255 - CIA_DDR_Bit7_Direction_Output ; %01111111 + +CIA1_DDRB = $DC03 + +CIA1_TIMALO = $DC04 +CIA1_TIMAHI = $DC05 + +CIA1_TIMBLO = $DC06 +CIA1_TIMBHI = $DC07 + +CIA1_TODTEN = $DC08 +CIA1_TODSEC = $DC09 +CIA1_TODMIN = $DC0A +CIA1_TODHRS = $DC0B + +CIA1_SDR = $DC0C + +CIA1_ICR = $DC0D + +CIA1_CRA = $DC0E + +CIA1_CRB = $DC0F + +CIA2 = $DD00 + +CIA2_PRA = $DD00 +CIA2_PRA_VICBank_Mask = %00000011 +CIA2_PRA_VICBank_0 = %00000011 +CIA2_PRA_VICBank_1 = %00000010 +CIA2_PRA_VICBank_2 = %00000001 +CIA2_PRA_VICBank_3 = %00000000 + +CIA2_PRB = $DD01 + +CIA2_DDRA = $DD02 +CIA2_DDRB = $DD03 + +CIA2_TI2ALO = $DD04 +CIA2_TI2AHI = $DD05 + +CIA2_TI2BLO = $DD06 +CIA2_TI2BHI = $DD07 + +CIA2_TO2TEN = $DD08 +CIA2_TO2SEC = $DD09 +CIA2_TO2MIN = $DD0A +CIA2_TO2HRS = $DD0B + +CIA2_SDR = $DD0C + +CIA2_ICR = $DD0D + +CIA2_CRA = $DD0E +CIA2_CRB = $DD0F diff --git a/incCIRCLECommand.asm b/incCIRCLECommand.asm new file mode 100644 index 0000000..3393d1a --- /dev/null +++ b/incCIRCLECommand.asm @@ -0,0 +1,223 @@ +;******************************************************************************* +;* CIRCLE Command * +;* This BASIC function to draw a circle on the screen * +;* ***************************************************************************** +;* Syntax : CIRCLE or c Shifted I * +;* Inputs : X (0->319) and Y (0 ->199) * +;* : XRad (0->310) and YRad (0->199) * +;* : Start Angle (In Degrees) and the Finish Angle (In Degrees) * +;******************************************************************************* + +; circle : circle x, y, xrad, yrad, start, finish +COM_CIRCLE + jsr GetNo2 ; Get X + sta COMM_RXLO + sty COMM_RXHI + + jsr bas_CHKCOM$ ; Checks For a Comma + jsr bas_GETBYTC$; Get Y + stx COMM_RY + + jsr bas_CHKCOM$ ; Checks For a Comma + jsr GetNo2 ; Get XRad + sta COMM_XRLO + sty COMM_XRHI + + jsr bas_CHKCOM$ ; Checks For a Comma + jsr bas_GETBYTC$; Get YRad + stx COMM_YR + + jsr bas_CHKCOM$ ; Checks For a Comma + jsr GetNo2 ; Get Start Angle (In Degrees 0->360) + jsr RadianConverter ;(RADCON) + + jsr WORKOUT_X_COSINE + sta COMM_AXLO + stx COMM_AXHI + + jsr WORKOUT_Y_SINE + sty COMM_AY + + jsr bas_CHKCOM$ ; Checks For a Comma + jsr GetNo2 ; Get Start Angle (In Degrees 0->360) + jsr RadianConverter + ldx #COMM_FINISH + jsr bas_MOVEFP1M$ + + ldy #>INCREAMENT + lda #COMM_INCR + jsr bas_MOVEFP1M$ + + jsr CIRCLE_CALC_NEXT_DEGREE_POINT ;(Circle5) + jmp CIRCLE_START_DRAWING ; (Circle1) + + +INCREAMENT + word $4c7d + word $cccc + byte $cd + +RADIAN + word $6586 + word $e02e + byte $d4 + +RadianConverter + lda $15 + ldy $14 + jsr bas_GIVAYF$ + jsr bas_MOVEFP1FP2$ + ldy #>RADIAN + lda #COMM_FINISH + jsr bas_FCOMP$ ; Compare FP1 to Memory + cmp #1 + beq CIRCLE_FINISH_DRAWING + jmp CIRCLE_START_DRAWING + +CIRCLE_FINISH_DRAWING + rts + +CIRCLE_MULTIPLY_FP1_BY_INTEGER + sty COMM_XXLO + sta COMM_XXHI + jsr bas_MOVEFP1FP2$ ; Move FP1 -> FP2 + lda COMM_XXHI + ldy COMM_XXLO + jsr bas_GIVAYF$ ; Convert Int (A+Y) to FP1 + lda $66 + eor $6E + sta $6f + lda $61 + jsr bas_FMULTT$ ; FP1 = FP1 * FP2 + jmp bas_FACINX$ ; Converts FP1 -> Integer $14 $15 + +CIRCLE_CALC_NEXT_DEGREE_POINT + lda #COMM_START + jsr bas_CONUPK$ ; Move Memory -> FP2 + lda #COMM_INCR + jsr bas_MOVEMFP1$ ; Move Memory to FP1 + lda $66 + eor $6E + sta $6f + lda $61 + jsr bas_FADDT$ ; FP1 = FP1 + FP2 + ldx #COMM_START + jmp bas_MOVEFP1M$ ; move FP1 -> Memory + +WORKOUT_X_COSINE + ; Return : Acc = Lo Byte X Coord + ; : X = Hi Byte X Coord + ldx #COMM_START + jsr bas_MOVEFP1M$ + + jsr os_COS$ + + ldy COMM_XRLO + lda COMM_XRHI + jsr CIRCLE_MULTIPLY_FP1_BY_INTEGER ; Calculate the X Value for Plotting + + clc + lda $65 + adc COMM_RXLO + ;sta COMM_AXLO + pha + lda $64 + adc COMM_RXHI + ;sta COMM_AXHI + tax + pla + rts + +WORKOUT_Y_SINE + ; Return : Y = Y Coord + lda #COMM_START + jsr bas_MOVEMFP1$ + + jsr os_SIN$ + lda #0 + ldy COMM_YR + jsr CIRCLE_MULTIPLY_FP1_BY_INTEGER + + lda $65 + clc + adc COMM_RY + tay + rts + diff --git a/incCLGCommand.asm b/incCLGCommand.asm new file mode 100644 index 0000000..1e97073 --- /dev/null +++ b/incCLGCommand.asm @@ -0,0 +1,26 @@ +;******************************************************************************* +;* CLG Routine * +;* This clears the HiRes Screen * +;* ***************************************************************************** +;* Syntax : clg or * +;******************************************************************************* + +COM_CLG + lda #0 + sta RIBUF + lda #>BITMAP_START + sta RIBUF + 1 + +GRAP + ldy #0 +GRAP_Loop + lda #0 + sta (RIBUF),y + iny + bne GRAP_Loop + inc RIBUF + 1 + + lda RIBUF + 1 + cmp #>BITMAP_END + bne GRAP + rts \ No newline at end of file diff --git a/incCOLOURCommand.asm b/incCOLOURCommand.asm new file mode 100644 index 0000000..fccdbf5 --- /dev/null +++ b/incCOLOURCommand.asm @@ -0,0 +1,42 @@ +;******************************************************************************* +;* COLOUR Command * +;* This BASIC function Set the background colours * +;* ***************************************************************************** +;* Syntax : COLOUR or co Shifted L * +;* Inputs : Border Colour (0->15) * +;* : Background Colour (0 ->15) * +;* : Background Colour1 (0 ->15) (optional) * +;* : Background Colour2 (0 ->15) (optional) * +;* : Background Colour3 (0 ->15) (optional) * +'******************************************************************************* + +; colour : colour a, b, (c, d, e) +COM_COLOUR + jsr bas_GETBYTC$ + stx VICII_EXTCOL + jsr bas_CHKCOM$ ; Checks For a Comma + + jsr bas_GETBYTC$ + stx VICII_BGCOL0 + stx COMM_GRAPHIC_COLOUR + + cmp #44 + bne COLOUR_END + jsr bas_CHRGET$ + jsr bas_GETBYTC$ + stx VICII_BGCOL1 + + cmp #44 + bne COLOUR_END + jsr bas_CHRGET$ + jsr bas_GETBYTC$ + stx VICII_BGCOL2 + + cmp #44 + bne COLOUR_END + jsr bas_CHRGET$ + jsr bas_GETBYTC$ + stx VICII_BGCOL3 + +COLOUR_END + jmp GRAP_ClearScreen \ No newline at end of file diff --git a/incCartInitiate.asm b/incCartInitiate.asm new file mode 100644 index 0000000..aa65895 --- /dev/null +++ b/incCartInitiate.asm @@ -0,0 +1,130 @@ +;******************************************************************************* +;* Cartridge Initialisation Routine * +;* * +;* Written By John C. Dale * +;* * +;* Date 26th October 2020 * +;******************************************************************************* + + word CART_RESET + word CART_NMI + + TEXT "CBM80" + +CART_RESET + stx SCROLX + jsr krljmp_IOINIT$ ; CIA IO Initialisation + jsr krljmp_RAMTAS$ ; Perform RAM Test + jsr krljmp_RESTOR$ ; Restore RAM Vectors + jsr krljmp_PCINT$ ; Initialise Screen Editor and VIC Chip + cli + + jsr $E453 ; Copy BASIC Vectors To RAM. + jsr $E3BF ; Initialise BASIC + jsr $E422 ; Print BASIC StartUp Screen + + ldx #$FB ; Load Stack Pointer Start Value + txs ; Transfer To Stack Pointer + jsr COPY_CART + lda #NMI_TEXT ; Load Hi Byte of My Banner + jsr bas_PrintString$ ; Prints out My Banner + jsr START ; GoSub my Start Routine + jmp NMI_EXIT ; NMI Exit Point + +NMI_TEXT + BYTE CHR_ClearScreen + BYTE CHR_CursorDown + ;COLS"1234567890123456789012345678901234567890" + TEXT "oldskoolcoder basic for the commodore 64" + BYTE CHR_CursorDown + TEXT "oskbasic v2.020a (c) 2020 oldskoolcoder" + brk + +CART_NMI + jsr $F6BC ; + jsr krljmp_STOP$ ; Check Stop Key + beq @NMI + jmp $FE72 ; NMI RS232 Handler + +@NMI + jsr krljmp_RESTOR$ ; Restore RAM Vectors + jsr krljmp_IOINIT$ ; CIA IO Initialisation + jsr krljmp_PCINT$ ; Initialise Screen Editor and VIC Chip + jsr krljmp_CLRCHN$ ; Restore Input and Output Channels + + lda #$00 + sta $13 + jsr bas_CLRCommand$ ; Performing a BASIC CLR + cli + + lda #NMI_TEXT ; Load Hi Byte of My Banner + jsr bas_PrintString$ ; Prints out My Banner + jsr START ; GoSub my Start Routine + +NMI_EXIT + ldx #128 + jmp (jmpvec_Error) + +;******************************************************************************* +;* Start Routine * +;******************************************************************************* + +START + ldy #0 +VEC + lda MAP_VECTOR,y + sta jmpvec_Error,y + iny + cpy #12 + bne VEC + + lda #>CARTSTART-1 ; Protects Graphics BASIC From BASIC Corruption + sta 56 + sta 54 + sta 52 + + lda #319) and Y1 (0 ->199) * +;* : X2 (0->319) and Y2 (0 ->199) * +;******************************************************************************* + +; draw : draw x1,y1 to x2,y2 +COM_DRAW + jsr GetNo2 ; Get X1 + sta COMM_X1LO + sty COMM_X1HI + + jsr bas_CHKCOM$ ; Checks For a Comma + jsr bas_GETBYTC$; Get Y1 + stx COMM_Y1 + + lda #164 + jsr bas_SYNCHR$ ; Check For the BASIC Command 'TO' + + jsr GetNo2 ; Get X2 + sta COMM_X2LO + sty COMM_X2HI + + jsr bas_CHKCOM$ ; Checks For a Comma + jsr bas_GETBYTC$; Get Y2 + stx COMM_Y2 + +DRAW_LINE_START +Draw_Eval_X + lda COMM_X1HI + cmp COMM_X2HI ; Compare Hi Byte of X1 and X2 + beq @InXHi ; X1Hi = X2Hi + bcs @X1GTX2 ; X1Hi > X2Hi + bcc @X1LTX2 ; X1Hi < X2Hi + +@InXHi + lda COMM_X1LO + cmp COMM_X2LO ; Compare Lo Byte of X1 and X2 + bcc @X1LTX2 ; X1Lo < X2Lo + +@X1GTX2 ; X1 > X2 + sec + lda COMM_X1LO + sbc COMM_X2LO + sta COMM_XDLO ; Difference of X Lo byte + + lda COMM_X1HI + sbc COMM_X2HI + sta COMM_XDHI ; Difference of X Hi byte + +; lda #$38 ; SEC Instruction +; ldx #$e5 ; SBC ZeroPage Instruction +; jsr PREPAREXCALC; Alters X Draw Routine to "SUBTRACT" + + lda DrawingExecutionDriver + and #%00000101 + ora #%00001010 + sta DrawingExecutionDriver + + jmp DRAW_EVAL_Y + +@X1LTX2 ; X1 < X2 + sec + lda COMM_X2LO + sbc COMM_X1LO + sta COMM_XDLO ; Difference of X Lo byte + + lda COMM_X2HI + sbc COMM_X1HI + sta COMM_XDHI ; Difference of X Hi byte + +; lda #$18 ; CLC Instruction +; ldx #$65 ; ADC ZeroPage Instruction +; jsr PREPAREXCALC; Alters X Draw Routine to "ADD" + + lda DrawingExecutionDriver + and #%00000101 + sta DrawingExecutionDriver + +DRAW_EVAL_Y + lda COMM_Y1 + cmp COMM_Y2 ; Compare Y1 and Y2 + bcc @Y1LTY2 ; Y1 < Y2 + + sec ; Y1 >= Y2 + lda COMM_Y1 + sbc COMM_Y2 + sta COMM_YD ; Difference of Y + +; lda #$38 ; SEC Instruction +; ldx #$e5 ; SBC ZeroPage Instruction +; jsr PREPAREYCALC; Alters Y Draw Routine to "SUBTRACT" + + lda DrawingExecutionDriver + and #%00001010 + ora #%00000101 + sta DrawingExecutionDriver + + jmp DRAW_DeltaCalc + +@Y1LTY2 ; Y1 < Y2 + sec + lda COMM_Y2 + sbc COMM_Y1 + sta COMM_YD ; Difference of Y + +; lda #$18 ; CLC Instruction +; ldx #$65 ; ADC ZeroPage Instruction +; jsr PREPAREYCALC; Alters Y Draw Routine to "ADD" + + lda DrawingExecutionDriver + and #%00001010 + sta DrawingExecutionDriver + +DRAW_DeltaCalc + lda COMM_XDHI + cmp #1 + beq DRAW_ALONG_XAXIS; Is XDelta = 1 as Y will never be :( + lda COMM_XDLO ; XDelta <> 1 + cmp COMM_YD + bcs DRAW_ALONG_XAXIS; X Delta >= Y Delta + jmp DRAW_ALONG_YAXIS; X Delta < Y Delta + +DRAW_ALONG_XAXIS + lda COMM_XDLo + sta Divisor + lda COMM_XDHI + sta Divisor + 1 + + lda COMM_YD + sta Number + lda #0 + sta Number + 1 + + jsr Divide16Bit + + lda #$00 + sta COMM_XXLO ; XLine Lo byte + sta COMM_XXHI ; XLine Hi Byte + sta COMM_YLFRAC + sta COMM_XLFRAC + + lda COMM_Y1 + sta COMM_YL + + lda COMM_X1LO + sta COMM_XLLO + lda COMM_X1HI + sta COMM_XLHI + +DRAW_XAXIS_LOOP + lda DrawingExecutionDriver + and #%00000001 + bne WORKOUT_YONX_SUB +; WORKOUT_YONX_ADD + clc + lda COMM_YLFRAC + adc ResultFrac + sta COMM_YLFRAC + lda COMM_YL + adc Result + sta COMM_YL + jmp WORKOUT_XONX + +WORKOUT_YONX_SUB + sec + lda COMM_YLFRAC + sbc ResultFrac + sta COMM_YLFRAC + lda COMM_YL + sbc Result + sta COMM_YL + +WORKOUT_XONX + lda DrawingExecutionDriver + and #%00000010 + bne WORKOUT_XONX_SUB +;WORKOUT_XONX_ADD + lda COMM_XLLO + clc + adc #1 + sta COMM_XLLO + bcc @SkipIncAdd + inc COMM_XLHI +@SkipIncAdd + jmp DRAW_WORKOUT_Y_FROM_AXISX + +WORKOUT_XONX_SUB + lda COMM_XLLO + sec + sbc #1 + sta COMM_XLLO + bcs @SkipIncAdd + dec COMM_XLHI +@SkipIncAdd + +DRAW_WORKOUT_Y_FROM_AXISX + lda COMM_YL + sta COMM_Y + + lda COMM_XLLO + sta COMM_XLO + lda COMM_XLHI + sta COMM_XHI + + jsr Place + jsr Dot + + inc COMM_XXLO + bne @ByPassInc + inc COMM_XXHI + +@ByPassInc + lda COMM_XXHI + cmp COMM_XDHI + bne DRAW_XAXIS_LOOP + lda COMM_XXLO + cmp COMM_XDLO + bcs @Exit + jmp DRAW_XAXIS_LOOP +@Exit + rts + +DRAW_ALONG_YAXIS + lda COMM_YD + sta Divisor + lda #0 + sta Divisor + 1 + sta COMM_YLFRAC + sta COMM_XLFRAC + + + lda COMM_XDLo + sta Number + lda COMM_XDHI + sta Number + 1 + + jsr Divide16Bit + + lda #$00 + sta COMM_YY + + lda COMM_Y1 + sta COMM_YL + + lda COMM_X1LO + sta COMM_XLLO + lda COMM_X1HI + sta COMM_XLHI + +DRAW_YAXIS_LOOP + lda DrawingExecutionDriver + and #%00000100 + bne WORKOUT_YONY_SUB +; WORKOUT_YONY_ADD + clc + lda COMM_YL + adc #1 + sta COMM_YL + jmp WORKOUT_XONY + +WORKOUT_YONY_SUB + sec + lda COMM_YL + sbc #1 + sta COMM_YL + +WORKOUT_XONY + lda DrawingExecutionDriver + and #%00001000 + bne WORKOUT_XONY_SUB +;WORKOUT_XONY_ADD + clc + lda COMM_XLFRAC + adc ResultFrac + sta COMM_XLFRAC + lda COMM_XLLO + adc Result + sta COMM_XLLO + lda COMM_XLHI + adc ResultHi + sta COMM_XLHI + jmp DRAW_WORKOUT_X_FROM_AXISY + +WORKOUT_XONY_SUB + sec + lda COMM_XLFRAC + sbc ResultFrac + sta COMM_XLFRAC + lda COMM_XLLO + sbc Result + sta COMM_XLLO + lda COMM_XLHI + sbc ResultHi + sta COMM_XLHI + +DRAW_WORKOUT_X_FROM_AXISY + lda COMM_YL + sta COMM_Y + + lda COMM_XLLO + sta COMM_XLO + lda COMM_XLHI + sta COMM_XHI + + jsr Place + jsr Dot + + inc COMM_YY + +@ByPassInc + lda COMM_YY + cmp COMM_YD + beq @Exit + jmp DRAW_YAXIS_LOOP +@Exit + rts diff --git a/incERASECommand.asm b/incERASECommand.asm new file mode 100644 index 0000000..5851564 --- /dev/null +++ b/incERASECommand.asm @@ -0,0 +1,14 @@ +;******************************************************************************* +;* ERASE Command * +;* This BASIC function Erases Lines and shapes * +;* ***************************************************************************** +;* Syntax : ERASE or e Shifted R * +;* Inputs : * +;******************************************************************************* + +; erase : erase +COM_ERASE + lda COMM_ERASE_ENABLED + eor #$80 + sta COMM_ERASE_ENABLED + rts \ No newline at end of file diff --git a/incFILLCommand.asm b/incFILLCommand.asm new file mode 100644 index 0000000..e5b2f8c --- /dev/null +++ b/incFILLCommand.asm @@ -0,0 +1,151 @@ +;******************************************************************************* +;* FILL Command * +;* This BASIC function fills in an area on the hi-res screen * +;* ***************************************************************************** +;* Syntax : FILL or f Shifted I * +;* Inputs : X (0 -> 319) * +;* : Y (0 -> 199) * +;******************************************************************************* + +; fill : x,y +COM_FILL + jsr GetNo2 ; Get X + sta COMM_XRLO + sty COMM_XRHI + + jsr bas_CHKCOM$ ; Checks For a Comma + jsr bas_GETBYTC$; Get Y + stx COMM_YR + + lda #1 ; Fill Up + sta COMM_AY + jsr FILL_START + lda #$FF ; Fill Down + sta COMM_AY + +FILL_START + lda COMM_YR + sta COMM_YY + +FILL_LOOPER_ROW +FILL2 + lda COMM_XRLO + sta COMM_XXLO + lda COMM_XRHI + sta COMM_XXHI + + jsr BANK_OUT_ROM + +FILL_TESTING_LEFT + jsr FILL_TESTPIXEL + beq FILL_TESTING_RIGHT + + sec + lda COMM_XXLO + sbc #1 + sta COMM_XXLO + bcs @ByPassDEC + dec COMM_XXHI + +@ByPassDEC + lda COMM_XXHI + cmp #0 + bne @Continue + lda COMM_XXLO + cmp #0 + beq FILL_TESTING_RIGHT +@Continue + jmp FILL_TESTING_LEFT + +FILL_TESTING_RIGHT + lda COMM_XXLO + sta COMM_X1LO + lda COMM_XXHI + sta COMM_X1HI + lda COMM_XRLO + sta COMM_XXLO + lda COMM_XRHI + sta COMM_XXHI + +FILL5 + jsr FILL_TESTPIXEL + beq FILL_DRAWLINE + + clc + lda COMM_XXLO + adc #1 + sta COMM_XXLO + bcc @ByPassINC + inc COMM_XXHI + +@ByPassINC + lda COMM_XXHI + cmp #1 + bne @Continue + lda COMM_XXLO + cmp #64 + beq FILL_DRAWLINE +@Continue + jmp FILL5 + +FILL_DRAWLINE +FILL6 + jsr BANK_IN_ROM + + lda COMM_XXLO + sta COMM_X2LO + lda COMM_XXHI + sta COMM_X2HI + lda COMM_YY + sta COMM_Y2 + sta COMM_Y1 + jsr DRAW_LINE_START + + clc + lda COMM_YY + adc COMM_AY + sta COMM_YY + + cmp #255 + bne @Continue + jmp FILL_END +@Continue + cmp #200 + bne @CanWeContinue + jmp FILL_END + +@CanWeContinue + jsr BANK_OUT_ROM + + lda COMM_XRLO + sta COMM_XLO + lda COMM_XRHI + sta COMM_XHI + lda COMM_YY + sta COMM_Y + jsr FILL_PIXELTEST + beq FILL_END + jmp FILL_LOOPER_ROW + +FILL_END + jsr BANK_IN_ROM + rts + +FILL_TESTPIXEL + lda COMM_XXLO + sta COMM_XLO + lda COMM_XXHI + sta COMM_XHI + + lda COMM_YY + sta COMM_Y + +FILL_PIXELTEST + jsr PLACE + + ldx COMM_C + lda BYTEMASK,x + ldy #0 + and (STAL),y + cmp BYTEMASK,x + rts diff --git a/incGDUMPCommand.asm b/incGDUMPCommand.asm new file mode 100644 index 0000000..58aa22e --- /dev/null +++ b/incGDUMPCommand.asm @@ -0,0 +1,224 @@ +;******************************************************************************* +;* GDUMP Command * +;* This BASIC function to print the Graphics Screen to a printer * +;* ***************************************************************************** +;* Syntax : GDUMP or G Shifted U * +;******************************************************************************* + +; gdump : +COM_GDUMP +DUMP + lda #4 ; Logical File Number + tax ; Device Number + ldy #255 ; Secondary Address + jsr krljmp_SETLFS$ + tya ; Filename Location + tax ; " " + lda #0 ; Filename Length + jsr krljmp_SETNAM$ + jsr krljmp_OPEN$ + + ldx #4 ; Logical File Number + jsr krljmp_CHKOUT$ ; Set Output to the above logical file# + + ;lda #200 + ;sta COMM_Y1 + ;lda #0 + ;sta COMM_Y2 + lda #1 + sta COMM_Yl + +Dump_ColumnLooper +DUMP9 + lda #0 + sta COMM_XLLO + sta COMM_XLHI + sta COMM_Y2 + sta COMM_AXLO ; Byte to be Printed + lda #8 ; Setting Printer into GRAPHICS MODE + jsr krljmp_CHROUT$ + +DUMP_VerticalByteLooper +DUMP4 + lda COMM_XLLO + sta COMM_XLO + lda COMM_XLHI + sta COMM_XHI + lda COMM_Y1 + sec + sbc COMM_Y2 + sta COMM_Y + jsr PLACE + lda $01 + and #$fe ; Remove BASIC + sta $01 + ldx COMM_C + lda BYTEMASK,x + ldy #0 + and (RIBUF),y + cmp BYTEMASK,x + beq dump3 + +DUMP6 + lda $01 + ora #1 ; ReInstate BASIC + sta $01 + ldx COMM_Y2 + inx + stx COMM_Y2 + cpx #7 + bne dump4 + jmp dump5 + +DUMP_UpdatePrintByte +DUMP3 + lda #7 + sec + sbc COMM_Y2 + tax + lda BYTEMASK,x + clc + adc COMM_AXLO + sta COMM_AXLO + jmp dump6 + +DUMP_PrintByte +DUMP5 + lda COMM_AXLO + clc + adc #128 + sta COMM_AXLO + jsr krljmp_CHROUT$ + inc COMM_XLLO + bne @ByPassInc + inc COMM_XLHI + +@ByPassInc + lda COMM_XLHI + cmp #1 + beq @TestLoByteForHiByte1 + jmp dump11 + +@TestLoByteForHiByte1 + lda COMM_XLLO + cmp #64 + beq @PrintLineComplete + jmp dump11 + +@PrintLineComplete + lda COMM_Y1 + sec + sbc #7 + sta COMM_Y1 + cmp #5 + bcc DUMP_EndPrinting + + lda #13 ; Print Enter + jsr krljmp_CHROUT$ + jmp dump9 + +DUMP_EndPrinting + jsr dump12 + lda #15 ; Set Printer ot Standard Mode + jsr krljmp_CHROUT$ + lda #15 + jsr krljmp_CHROUT$ + lda #13 ; Print Enter + jsr krljmp_CHROUT$ + jsr krljmp_CLRCHN$ + lda #4 + jmp krljmp_CLOSE$ + +DUMP_RESETForNextColumn +DUMP11 + lda #0 + sta COMM_AXLO + sta COMM_Y2 + jmp dump4 + +DUMP_PrepareNextLine +DUMP12 + lda #0 + sta COMM_XLLO + sta COMM_XLHI + sta COMM_Y2 + sta COMM_AXLO + lda #13 ; Print Enter + jsr krljmp_CHROUT$ + lda #8 ; Set Printer into Graphics Mode + jsr krljmp_CHROUT$ + +DUMP13 + lda COMM_XLLO + sta COMM_XLO + lda COMM_XLHI + sta COMM_XHI + lda COMM_Y1 + sec + sbc COMM_Y2 + sta COMM_Y + jsr PLACE + lda $01 + and #$fe ; Remove BASIC + sta $01 + ldx COMM_C + lda BYTEMASK,x + ldy #0 + and (RIBUF),y + cmp BYTEMASK,x + beq dump14 + +DUMP15 + lda $01 + ora #1 ; ReInstate BASIC + sta $01 + ldx COMM_Y2 + inx + stx COMM_Y2 + cpx #5 + bne dump13 + jmp dump16 + +DUMP14 + lda #7 + sec + sbc COMM_Y2 + tax + lda BYTEMASK,x + clc + adc COMM_AXLO + sta COMM_AXLO + jmp DUMP15 + +DUMP16 + lda COMM_AXLO + clc + adc #128 + sta COMM_AXLO + jsr krljmp_CHROUT$ + inc COMM_XLLO + bne @ByPassInc + inc COMM_XLHI + +@ByPassInc + lda COMM_XLHI + cmp #1 + beq @TestLo + jmp dump18 + +@TestLo + lda COMM_XLLO + cmp #64 + beq @GoEnd + jmp dump18 + +@GoEnd + rts + +DUMP18 + lda #0 + sta COMM_AXLO + sta COMM_Y2 + jmp dump13 + + diff --git a/incGLOADCommand.asm b/incGLOADCommand.asm new file mode 100644 index 0000000..7f71496 --- /dev/null +++ b/incGLOADCommand.asm @@ -0,0 +1,33 @@ +;******************************************************************************* +;* GSAVE Command * +;* This BASIC function to save the Graphics Screen (BitMap) to a device * +;* ***************************************************************************** +;* Syntax : GSAVE or s Shifted A * +;* Inputs : FileName * +;* : Device * +;******************************************************************************* + +; gsave : "filename", device# +COM_GLOAD + jsr bas_FRMEVL$ + jsr bas_FRESTR$ + tay + sty COMM_RXLO + lda INDEX + sta RIBUF + lda INDEX + 1 + sta RIBUF + 1 + jsr bas_CHRGOT$ + jsr bas_CHKCOM$ + jsr bas_GETBYTC$ + + lda #1 ; Logical FileNumber + ldy #1 ; Logical Secondary Address + jsr krljmp_SETLFS$ + lda COMM_RXLO ; Length Of Filename + ldx RIBUF ; Pointer to File Name Text + ldy RIBUF + 1 + jsr krljmp_SETNAM$ + + lda #0 + jmp krljmp_LOAD$ diff --git a/incGRAPHICCommand.asm b/incGRAPHICCommand.asm new file mode 100644 index 0000000..feb6e61 --- /dev/null +++ b/incGRAPHICCommand.asm @@ -0,0 +1,59 @@ +;******************************************************************************* +;* Graphics Routine * +;* This sets up the VIC Chip into HiRes Graphic Mode * +;* ***************************************************************************** +;* Syntax : graphic or g shifted R * +;******************************************************************************* + +; graphic : graphic +COM_GRAPHIC +; lda #0 +; sta RIBUF +; lda #$A0 +; sta RIBUF + 1 + +;GRAP +; ldy #0 +;GRAP_Loop +; lda #0 +; sta (RIBUF),y +; iny +; bne GRAP_Loop +; inc RIBUF + 1 + +; lda RIBUF + 1 +; cmp #$C0 +; bne GRAP + + lda CIA2_DDRA + ora #%00000011 + sta CIA2_DDRA + + lda CIA2_PRA + and #255 - CIA2_PRA_VICBank_Mask + ora #CIA2_PRA_VICBank_2 ; Change VIC Chip to Bank 2 + ;ora #CIA2_PRA_VICBank_3 ; Change VIC Chip to Bank 3 + sta CIA2_PRA + + lda VICII_VMCSB + ora #%00001000 ; Change VIC Chip Video Address + ;and #%00000001 + ;ora #%00001010 ; Change VIC Chip Video Address + sta VICII_VMCSB + + lda VICII_SCROLY + ora #VICII_SCROLY_ExtendedColourMode + sta VICII_SCROLY + +GRAP_ClearScreen + ldy #0 + lda COMM_GRAPHIC_COLOUR +GRAP_BlankScreen + sta $8400,y + sta $8500,y + sta $8600,y + sta $8700,y + iny + bne GRAP_BlankScreen + + rts diff --git a/incGSAVECommand.asm b/incGSAVECommand.asm new file mode 100644 index 0000000..011a406 --- /dev/null +++ b/incGSAVECommand.asm @@ -0,0 +1,45 @@ +;******************************************************************************* +;* GSAVE Command * +;* This BASIC function to save the Graphics Screen (BitMap) to a device * +;* ***************************************************************************** +;* Syntax : GSAVE or s Shifted A * +;* Inputs : FileName * +;* : Device * +;******************************************************************************* + +; gsave : "filename", device# +COM_GSAVE + jsr bas_FRMEVL$ + jsr bas_FRESTR$ + tay + sty COMM_RXLO + lda INDEX + sta RIBUF + lda INDEX + 1 + sta RIBUF + 1 + jsr bas_CHRGOT$ + jsr bas_CHKCOM$ + jsr bas_GETBYTC$ + lda #1 ; Logical FileNumber + ldy #1 ; Logical Secondary Address + jsr krljmp_SETLFS$ + lda COMM_RXLO ; Length Of Filename + ldx RIBUF ; Pointer to File Name Text + ldy RIBUF + 1 + jsr krljmp_SETNAM$ + lda $01 + and #$fe ; Turn Off BASIC + sta $01 + lda #$a0 ; Set Start Address of Memory Save + sta ROBUF + 1 + lda #$00 + sta ROBUF + lda #ROBUF ; Start Address ZP Index + ldx #$00 ; End Address Of Memory Save + ldy #$c0 ; " " + jsr krljmp_SAVE$ + lda $01 + ora #1 ; restore BASIC ROM + sta $01 + rts + \ No newline at end of file diff --git a/incHCHARCommand.asm b/incHCHARCommand.asm new file mode 100644 index 0000000..77cf7d9 --- /dev/null +++ b/incHCHARCommand.asm @@ -0,0 +1,46 @@ +;******************************************************************************* +;* HCHAR Command * +;* This BASIC function put a string on a Hi-Res Screen * +;* ***************************************************************************** +;* Syntax : HCHAR or h Shifted C * +;* Inputs : X (0->319) and Y (0 ->199) * +;* : "text" * +;******************************************************************************* + +; hchar : hchar x,y,"hello world" +COM_HCHAR + lda #%10000000 + sta COMM_XLLO + jmp COM_CHAR_START + +HCHAR_ADDING_SECONDLINE + lda COMM_Y1 + asl ; x 2 + sta COMM_Y + + lda #14 + sec + sbc COMM_Y + clc + adc COMM_YR + sta COMM_Y + + lda COMM_X1LO + clc + adc COMM_XRLO + sta COMM_XLO + lda COMM_XRHI + adc #0 + sta COMM_XHI + jsr PLACE + jsr DOT + inc COMM_Y + lda COMM_X1LO + clc + adc COMM_XRLO + sta COMM_XLO + lda COMM_XRHI + adc #0 + sta COMM_XHI + jsr PLACE + jmp DOT diff --git a/incJOYCommand.asm b/incJOYCommand.asm new file mode 100644 index 0000000..dd87a03 --- /dev/null +++ b/incJOYCommand.asm @@ -0,0 +1,49 @@ +;******************************************************************************* +;* JOY Command * +;* This BASIC function reads the Joystick Port * +;* ***************************************************************************** +;* Syntax : JOY or j Shifted O * +;* Inputs : Joystick 0 = Joy Port 2, 1 = Joy Port 1 * +;******************************************************************************* + +; joy : joy(#) +COM_JOY + jsr bas_GETBYTC$; Get Joystick Port + cpx #2 + bcc @ReadJoyPort + jmp bas_IQERR$ + +@ReadJoyPort + jsr bas_CHKCLOSE$ + + lda CIA1_PRA,x + and #%00011111 + ;pha + ;lda #0 + sta COMM_Y +; ldx #$07 + +;@JOY1 +; pla +; pha +; and BYTEMASK,x +; cmp BYTEMASK,x +; bne @JOY2 + +;@JOY3 +; dex +; cpx #3 +; bne @JOY1 +; pla + ldy COMM_Y + lda #0 + jmp bas_GIVAYF$ + +;@JOY2 +; lda COMM_Y +; clc +; adc BYTEMASK,x ; <------ Y John Jnr ?? +; sta COMM_Y +; jmp @JOY3 + + \ No newline at end of file diff --git a/incMOBCOLCommand.asm b/incMOBCOLCommand.asm new file mode 100644 index 0000000..1716dc0 --- /dev/null +++ b/incMOBCOLCommand.asm @@ -0,0 +1,32 @@ +;******************************************************************************* +;* MOBCOL Command * +;* This BASIC function to set up the sprite multi colour options * +;* ***************************************************************************** +;* Syntax : MOBCOL or mo Shifted B * +;* Inputs : MultiColour 1 * +;* : MultiColour 2 * +;******************************************************************************* + +; mobcol : multcol1, multicol2 +COM_MOBCOL + jsr bas_GETBYTC$; Get Colour #1 + cpx #16 + bcc @ValidColour1 + ; Illegal Qty Error + jmp bas_IQERR$ + +@ValidColour1 + stx VICII_SPMC0 + + jsr bas_CHKCOM$ ; Checks For a Comma + jsr bas_GETBYTC$; Get Sprite Poointer# + cpx #16 + bcc @ValidColour2 + ; Illegal Qty Error + jmp bas_IQERR$ + +@ValidColour2 + stx VICII_SPMC1 + rts + + \ No newline at end of file diff --git a/incMOBCommand.asm b/incMOBCommand.asm new file mode 100644 index 0000000..8a6bec9 --- /dev/null +++ b/incMOBCommand.asm @@ -0,0 +1,84 @@ +;******************************************************************************* +;* MOB Command * +;* This BASIC function to set up a sprite on the system * +;* ***************************************************************************** +;* Syntax : MOB or m Shifted O * +;* Inputs : Sprite No * +;* : Sprite Pointer # * +;* : Enable / Disable * +;* : Expanded X Enable / Disable * +;* : Expanded Y Enable / Disable * +;* : Background Priority Enable / Disable * +;* : MultiColour Enable / Disable * +;******************************************************************************* + +; mob : sprite no, enable, xX, yY, background, multiCol +COM_MOB + jsr bas_GETBYTC$; Get Sprite Number + cpx #8 + bcc @ValidSpriteNo + ; Illegal Qty Error + jmp bas_IQERR$ + +@ValidSpriteNo + stx COMM_AXLO + + jsr bas_CHKCOM$ ; Checks For a Comma + jsr bas_GETBYTC$; Get Sprite Poointer# + + txa + ldx COMM_AXLO ; Sprite # + sta SPRITE_POINTERS,x ; Normal Text Mode + sta SPRITE_POINTERS + $8000,x ; Hi-Res Mode + + lda VICII_SPENA + jsr MOBPARAMGET + sta VICII_SPENA + + lda VICII_XXPAND + jsr MOBPARAMGET + sta VICII_XXPAND + + lda VICII_YXPAND + jsr MOBPARAMGET + sta VICII_YXPAND + + lda VICII_SPBGPR + jsr MOBPARAMGET + sta VICII_SPBGPR + + lda VICII_SPMC + jsr MOBPARAMGET + sta VICII_SPMC + rts + +MOBPARAMGET + sta COMM_AY + jsr bas_CHRGOT$ + jsr bas_CHKCOM$ ; Get Comma + + jsr bas_GETBYTC$ ; Get # 0->255 + cpx #2 + bcc @ValueOK + jmp bas_IQERR$ +@ValueOK + cpx #0 + beq @Disable + jsr WorkOutSpriteBit + lda COMM_AY + ora BYTEMASK,x + rts + +@Disable + jsr WorkOutSpriteBit + lda BYTEMASK,x + eor #%11111111 + and COMM_AY + rts + +WorkOutSpriteBit + lda #7 + sec + sbc COMM_AXLO + tax + rts diff --git a/incNOISECommand.asm b/incNOISECommand.asm new file mode 100644 index 0000000..74597f1 --- /dev/null +++ b/incNOISECommand.asm @@ -0,0 +1,3 @@ +COM_NOISE + ldx #31 + jmp (jmpvec_Error) \ No newline at end of file diff --git a/incOFFCommand.asm b/incOFFCommand.asm new file mode 100644 index 0000000..e8a506a --- /dev/null +++ b/incOFFCommand.asm @@ -0,0 +1,3 @@ +COM_OFF + ldx #31 + jmp (jmpvec_Error) \ No newline at end of file diff --git a/incOldDRAWCommand.asm b/incOldDRAWCommand.asm new file mode 100644 index 0000000..58dddb8 --- /dev/null +++ b/incOldDRAWCommand.asm @@ -0,0 +1,297 @@ +;******************************************************************************* +;* DRAW Command * +;* This BASIC function put a line on a Hi-Res Screen * +;* ***************************************************************************** +;* Syntax : DRAW or d Shifted R * +;* Inputs : X1 (0->319) and Y1 (0 ->199) * +;* : X2 (0->319) and Y2 (0 ->199) * +;******************************************************************************* + +; draw : draw x1,y1 to x2,y2 +COM_DRAW + jsr GetNo2 ; Get X1 + sta COMM_X1LO + sty COMM_X1HI + + jsr bas_CHKCOM$ ; Checks For a Comma + jsr bas_GETBYTC$; Get Y1 + stx COMM_Y1 + + lda #164 + jsr bas_SYNCHR$ ; Check For the BASIC Command 'TO' + + jsr GetNo2 ; Get X2 + sta COMM_X2LO + sty COMM_X2HI + + jsr bas_CHKCOM$ ; Checks For a Comma + jsr bas_GETBYTC$; Get Y2 + stx COMM_Y2 + +DRAW_LINE_START +Draw_Eval_X + lda COMM_X1HI + cmp COMM_X2HI ; Compare Hi Byte of X1 and X2 + beq @InXHi ; X1Hi = X2Hi + bcs @X1GTX2 ; X1Hi > X2Hi + bcc @X1LTX2 ; X1Hi < X2Hi + +@InXHi + lda COMM_X1LO + cmp COMM_X2LO ; Compare Lo Byte of X1 and X2 + bcc @X1LTX2 ; X1Lo < X2Lo + +@X1GTX2 ; X1 > X2 + sec + lda COMM_X1LO + sbc COMM_X2LO + sta COMM_XDLO ; Difference of X Lo byte + + lda COMM_X1HI + sbc COMM_X2HI + sta COMM_XDHI ; Difference of X Hi byte + + lda #$38 ; SEC Instruction + ldx #$e5 ; SBC ZeroPage Instruction + jsr PREPAREXCALC; Alters X Draw Routine to "SUBTRACT" + jmp DRAW_EVAL_Y + +@X1LTX2 ; X1 < X2 + sec + lda COMM_X2LO + sbc COMM_X1LO + sta COMM_XDLO ; Difference of X Lo byte + + lda COMM_X2HI + sbc COMM_X1HI + sta COMM_XDHI ; Difference of X Hi byte + + lda #$18 ; CLC Instruction + ldx #$65 ; ADC ZeroPage Instruction + jsr PREPAREXCALC; Alters X Draw Routine to "ADD" + +DRAW_EVAL_Y + lda COMM_Y1 + cmp COMM_Y2 ; Compare Y1 and Y2 + bcc @Y1LTY2 ; Y1 < Y2 + + sec ; Y1 >= Y2 + lda COMM_Y1 + sbc COMM_Y2 + sta COMM_YD ; Difference of Y + + lda #$38 ; SEC Instruction + ldx #$e5 ; SBC ZeroPage Instruction + jsr PREPAREYCALC; Alters Y Draw Routine to "SUBTRACT" + jmp DRAW_DeltaCalc + +@Y1LTY2 ; Y1 < Y2 + sec + lda COMM_Y2 + sbc COMM_Y1 + sta COMM_YD ; Difference of Y + + lda #$18 ; CLC Instruction + ldx #$65 ; ADC ZeroPage Instruction + jsr PREPAREYCALC; Alters Y Draw Routine to "ADD" + +DRAW_DeltaCalc + lda COMM_XDHI + cmp #1 + beq DRAW_ALONG_XAXIS; Is XDelta = 1 as Y will never be :( + lda COMM_XDLO ; XDelta <> 1 + cmp COMM_YD + bcs DRAW_ALONG_XAXIS; X Delta >= Y Delta + jmp DRAW_ALONG_YAXIS; X Delta < Y Delta + +DRAW_ALONG_XAXIS + lda COMM_YD + cmp #0 + bne DRAW_WORK_OUT_XRATIO + jsr DRAW_SETFPA1_TO_ZERO + jmp DRAW_XAXIS_START + +DRAW_WORK_OUT_XRATIO + ldx COMM_YD + ldy COMM_XDLO + stx COMM_XXLO + lda #0 + sta COMM_XXHI + sty COMM_YY + lda COMM_XDHI + sta 246 + + jsr DIVIDE_XX_BY_YY + jsr DRAW_MOVE_FPA1_TO_MEMORY + jmp DRAW_XAXIS_START + +DIVIDE_XX_BY_YY + lda COMM_XXHI + ldy COMM_XXLO + jsr bas_GIVAYF$ ; Converts XX into a Floating Point Value in FPA1 + jsr bas_MOVEFP1FP2$ ; Moves FPA1 -> FPA2 + lda 246 + ldy COMM_YY + jsr bas_GIVAYF$ ; Converts YY into a Floating Point Value in FPA1 + lda $66 + eor $6E + sta $6F + lda $61 + jmp bas_FPDIV$ ; FPA1 = FPA2 / FPA1 ( XX / YY ) + +DRAW_SETFPA1_TO_ZERO + lda #0 + tay + jsr bas_GIVAYF$ + +DRAW_MOVE_FPA1_TO_MEMORY + ldy #$02 ; Address Hi byte + ldx #$F0 ; Address Lo byte + jmp bas_MOVEFP1M$ ; Moves FPA1 to Memory + +DRAW_XAXIS_START + lda #$00 + sta COMM_XLLO ; XLine Lo byte + sta COMM_XLHI ; XLine Hi Byte + sta $65 + sta $64 + +DRAW_XAXIS_LOOP + ldy COMM_XLLO + ldx COMM_XLHI + lda COMM_YD + cmp #0 + beq DRAW_X_AS_YD_IS_ZERO + jsr DRAW_WORKOUT_NEW_POINT + +DRAW_X_AS_YD_IS_ZERO + lda COMM_Y1 + +DRAW_WORKOUT_Y_FROM_AXISX + clc + adc $65 + sta COMM_Y + lda COMM_X1LO + +DRAW_WORKOUT_X_FROM_AXISX + clc + adc COMM_XLLO + sta COMM_XLO + lda COMM_X1HI + adc COMM_XLHI + sta COMM_XHI + + jsr Place + jsr Dot + + inc COMM_XLLO + bne @ByPassInc + inc COMM_XLHI + +@ByPassInc + lda COMM_XLHI + cmp COMM_XDHI + bne DRAW_XAXIS_LOOP + lda COMM_XLLO + cmp COMM_XDLO + bcc DRAW_XAXIS_LOOP + rts + +DRAW_WORKOUT_NEW_POINT + txa + jsr bas_GIVAYF$ ; Convert to Float in FPA1 (y = Lo, Acc = Hi) + jsr bas_MOVEFP1FP2$ ; Move FPA1 -> FPA2 + + ldy #$02 + lda #$F0 ; Getting the XX / YY Ratio From Memory + jsr bas_MOVEMFP1$ ; Move Memory Float to FPA1 + + lda $66 + eor $6e + sta $6f + lda $61 + jsr bas_FMULTT$ ; FPA1 = FPA1 * FPA2 = New Postion + jmp bas_FACINX$ ; Converts FPA1 into Integer (Acc= Hi, Y= Lo [$64,$65]) + +PREPAREXCALC + sta DRAW_WORKOUT_X_FROM_AXISY + sta DRAW_WORKOUT_X_FROM_AXISX + txa + sta DRAW_WORKOUT_X_FROM_AXISY + 1 + sta DRAW_WORKOUT_X_FROM_AXISY + 9 + eor #8 + sta DRAW_WORKOUT_X_FROM_AXISX + 1 + sta DRAW_WORKOUT_X_FROM_AXISX + 10 + rts + +PREPAREYCALC + sta DRAW_WORKOUT_Y_FROM_AXISX + sta DRAW_WORKOUT_Y_FROM_AXISY + txa + sta DRAW_WORKOUT_Y_FROM_AXISX + 1 + eor #8 + sta DRAW_WORKOUT_Y_FROM_AXISY + 1 + rts + +DRAW_ALONG_YAXIS + lda COMM_XDHI + cmp #0 + bne DRAW_WORK_OUT_YRATIO + lda COMM_XDLO + cmp #0 + bne DRAW_WORK_OUT_YRATIO + jsr DRAW_SETFPA1_TO_ZERO + lda #255 + sta COMM_XDHI + jmp DRAW_YAXIS_START + +DRAW_WORK_OUT_YRATIO + ldy COMM_YD + ldx COMM_XDLO + sty COMM_YY + lda #0 + sta 246 + stx COMM_XXLO + lda COMM_XDHI + sta COMM_XXHI + jsr DIVIDE_XX_BY_YY + jsr DRAW_MOVE_FPA1_TO_MEMORY + +DRAW_YAXIS_START + lda #0 + sta COMM_YL + sta $65 + sta $64 + +DRAW_YAXIS_LOOP + ldy COMM_YL + ldx #0 + lda COMM_XDHI + cmp #255 + beq DRAW_Y_AS_XD_IS_ZERO + jsr DRAW_WORKOUT_NEW_POINT + +DRAW_Y_AS_XD_IS_ZERO + lda COMM_X1LO + +DRAW_WORKOUT_X_FROM_AXISY + clc + adc $65 + sta COMM_XLO + lda COMM_X1HI + adc $64 + sta COMM_XHI + lda COMM_Y1 + +DRAW_WORKOUT_Y_FROM_AXISY + clc + adc COMM_YL + sta COMM_Y + jsr Place + jsr Dot + + inc COMM_YL + lda COMM_YL + cmp COMM_YD + bcc DRAW_YAXIS_LOOP + rts diff --git a/incPLOTCommand.asm b/incPLOTCommand.asm new file mode 100644 index 0000000..081a32c --- /dev/null +++ b/incPLOTCommand.asm @@ -0,0 +1,22 @@ +;******************************************************************************* +;* PLOT Command * +;* This BASIC function put a dot in the Hi-Res Screen * +;* ***************************************************************************** +;* Syntax : PLOT or p Shifted L * +;* Inputs : X (0->319) and Y (0 ->199) * +;******************************************************************************* + +; plot : plot x,y +COM_POINT + jsr GETNo2 ; Get X Coords = 2 bytes + sta COMM_XLo + sty COMM_XHi + + jsr bas_CHKCOM$ + jsr bas_GETBYTC$ + stx COMM_Y + + jsr PLACE ; Works out the memory location to change + jmp DOT ; Sets the bit location odf the memory location + + \ No newline at end of file diff --git a/incPULSECommand.asm b/incPULSECommand.asm new file mode 100644 index 0000000..55045dd --- /dev/null +++ b/incPULSECommand.asm @@ -0,0 +1 @@ +COM_PULSE diff --git a/incREVERSECommand.asm b/incREVERSECommand.asm new file mode 100644 index 0000000..e4c2a5f --- /dev/null +++ b/incREVERSECommand.asm @@ -0,0 +1,37 @@ +;******************************************************************************* +;* REVERSE Command * +;* This BASIC function will negative the screen * +;* ***************************************************************************** +;* Syntax : REVERSE or re Shifted V * +;* Inputs : * +;* : * +;******************************************************************************* + +; reverse : reverse +COM_REVERSE + lda #$00 + sta RIBUF + lda #$A0 + sta RIBUF + 1 + + jsr BANK_OUT_ROM + +@OuterLooper + ldy #00 +@InnerLooper + lda (RIBUF),y + eor #%11111111 + sta (RIBUF),y + + iny + bne @InnerLooper + + inc RIBUF + 1 + lda RIBUF + 1 + cmp #$BF + bne @OuterLooper + + jsr BANK_IN_ROM + + rts + \ No newline at end of file diff --git a/incRPOINTCommand.asm b/incRPOINTCommand.asm new file mode 100644 index 0000000..9b410f1 --- /dev/null +++ b/incRPOINTCommand.asm @@ -0,0 +1,53 @@ +;******************************************************************************* +;* RPOINT Command * +;* This BASIC function that reads a dot in the Hi-Res Screen * +;* ***************************************************************************** +;* Syntax : RPOINT or r Shifted P * +;* Inputs : X (0->319) and Y (0 ->199) * +;* ***************************************************************************** +;* Output : either a 1 = pixel set or 0 = pixel clear * +;******************************************************************************* + +; rpoint syntax : var=rpoint(x,y) +COM_RPOINT + jsr bas_CHKCLOSE$ + 3 + + jsr GETNo2 ; Get X Coords = 2 bytes + sta COMM_XLo + sty COMM_XHi + + jsr bas_CHKCOM$ + jsr bas_GETBYTC$ + stx COMM_Y + + jsr bas_CHKCLOSE$ + + jsr PLACE ; identify byte location of bit to be read + + lda 1 + and #%11111110 ; Paging out BASIC ROM + sta 1 + + ldx COMM_C + ldy #0 + lda BYTEMASK,x + and (STAL),y + pha + + lda 1 + ora #%00000001 ; Paging in BASIC ROM + sta 1 + + pla + cmp BYTEMASK,x + bne RPOINT_RETURN1 + lda #0 + tay + jmp bas_GIVAYF$ ; Return 0 in the Floating Point Accumulator + +RPOINT_RETURN1 + lda #0 + ldy #1 + jmp bas_GIVAYF$ ; Return 1 in the Floating Point Accumulator + + diff --git a/incSAWCommand.asm b/incSAWCommand.asm new file mode 100644 index 0000000..425c4d1 --- /dev/null +++ b/incSAWCommand.asm @@ -0,0 +1 @@ +COM_SAW diff --git a/incSCREENCommand.asm b/incSCREENCommand.asm new file mode 100644 index 0000000..f6062ef --- /dev/null +++ b/incSCREENCommand.asm @@ -0,0 +1,28 @@ +;******************************************************************************* +;* Screen Routine * +;* This sets up the VIC Chip into Text Mode * +;******************************************************************************* +;* Syntax : screen or s shifted C * +;******************************************************************************* + +; screen : screen + +COM_SCREEN + lda CIA2_DDRA + ora #%00000011 ; Set CIA 2 bits 0/1 to be output Bits + sta CIA2_DDRA + + lda CIA2_PRA + and #255 - CIA2_PRA_VICBank_Mask + ora #CIA2_PRA_VICBank_0 ; Set to VIC Bank 0 + sta CIA2_PRA + + lda VICII_SCROLY + and #VICII_SCROLY_NormalColourMode + sta VICII_SCROLY ; Back to Text Mode + + lda #21 + sta VICII_VMCSB ; set video address to $0400 + rts + + diff --git a/incSHAPECommand.asm b/incSHAPECommand.asm new file mode 100644 index 0000000..1cd7d35 --- /dev/null +++ b/incSHAPECommand.asm @@ -0,0 +1,57 @@ +;******************************************************************************* +;* SHAPE Command * +;* This BASIC function to draw a polygon on the screen * +;* ***************************************************************************** +;* Syntax : SHAPE or s Shifted H * +;* Inputs : X (0->319) and Y (0 ->199) * +;* : XRad (0->310) and YRad (0->199) * +;* : Start Angle (In Degrees) and the Finish Angle (In Degrees) * +;* : Increment Angle * +;******************************************************************************* + +; shape : circle x, y, xrad, yrad, start, finish, inc +COM_SHAPE + jsr GetNo2 ; Get X + sta COMM_RXLO + sty COMM_RXHI + + jsr bas_CHKCOM$ ; Checks For a Comma + jsr bas_GETBYTC$; Get Y + stx COMM_RY + + jsr bas_CHKCOM$ ; Checks For a Comma + jsr GetNo2 ; Get XRad + sta COMM_XRLO + sty COMM_XRHI + + jsr bas_CHKCOM$ ; Checks For a Comma + jsr bas_GETBYTC$; Get YRad + stx COMM_YR + + jsr bas_CHKCOM$ ; Checks For a Comma + jsr GetNo2 ; Get Start Angle (In Degrees 0->360) + jsr RadianConverter ;(RADCON) + + jsr WORKOUT_X_COSINE + sta COMM_AXLO + stx COMM_AXHI + + jsr WORKOUT_Y_SINE + sty COMM_AY + + jsr bas_CHKCOM$ ; Checks For a Comma + jsr GetNo2 ; Get Start Angle (In Degrees 0->360) + jsr RadianConverter + ldx #COMM_FINISH + jsr bas_MOVEFP1M$ + + jsr bas_CHKCOM$ ; Checks For a Comma + jsr GetNo2 ; Get Increment Angle (In Degrees 0->360) + jsr RadianConverter + ldx #COMM_INCR + jsr bas_MOVEFP1M$ + + jsr CIRCLE_CALC_NEXT_DEGREE_POINT ;(Circle5) + jmp CIRCLE_START_DRAWING ; (Circle1) diff --git a/incSOUNDCommand.asm b/incSOUNDCommand.asm new file mode 100644 index 0000000..7b275ee --- /dev/null +++ b/incSOUNDCommand.asm @@ -0,0 +1,78 @@ +;******************************************************************************* +;* SOUND Command * +;* This BASIC function to set up the Voice Envelope * +;* ***************************************************************************** +;* Syntax : SOUND Freq, Pulse, Attack, Decay, Sustain, Release * +;* Inputs : * +;* : * +;******************************************************************************* + +; sound : Freq...... + +COM_SOUND + lda #$00 + ldy COMM_AY ; Voice OffSet V1 = 0, V2 = 7, V3 = 14 + sta $D400,y + sta $D401,y + sta $D402,y + sta $D403,y + ;sta $D404,y + sta $D405,y + sta $D406,y + + jsr GETNO2 + ldx COMM_AY + sta $D400,x + tya + sta $D401,x + + jsr bas_CHKCOM$ + jsr GETNO2 + cpy #$10 + bcc @NotIllegal + jmp bas_IQERR$ + +@NotIllegal + ldx COMM_AY + sta $D402,x + tya + sta $D403,x + jsr GetSoundOneByte ; Attack + asl + asl + asl + asl + ldx COMM_AY + sta $D405,x + jsr GetSoundOneByte ; Decay + ldx COMM_AY + ora $D405,x + sta $D405,x + + jsr GetSoundOneByte ; Sustain + asl + asl + asl + asl + ldx COMM_AY + sta $D406,x + jsr GetSoundOneByte ; Release + ldx COMM_AY + ora $D406,x + sta $D406,x + rts + +GetSoundOneByte + jsr bas_CHRGOT$ + jsr bas_CHKCOM$ + jsr bas_GETBYTC$ + cpx #$10 + bcc @NotIllegal + jmp bas_IQERR$ + +@NotIllegal + txa + and #%00001111 + rts + + diff --git a/incSPCommand.asm b/incSPCommand.asm new file mode 100644 index 0000000..77df273 --- /dev/null +++ b/incSPCommand.asm @@ -0,0 +1,64 @@ +;******************************************************************************* +;* SP Command * +;* This BASIC function to turn on and off a Sprite * +;* ***************************************************************************** +;* Syntax : SP or sp Shifted O * +;* Inputs : ON / OFF Sprite # * +;******************************************************************************* + +; sp : on/off # +COM_SP + ;jsr bas_CHRGET$ + pha + jsr bas_CHRGET$ + jsr GETSpriteNo + pla + + cmp #TOKANISER_OFF + bne @NextOption + + ;jsr bas_CHRGET$ + ;jsr GETSpriteNo + + jsr WorkOutSpriteBit + lda BYTEMASK,x + eor #%11111111 + and VICII_SPENA + sta VICII_SPENA + rts + +@NextOption + cmp #TOKANISER_ON + bne @InvalidCommand + + ;jsr bas_CHRGET$ + ;jsr GETSpriteNo + + jsr WorkOutSpriteBit + lda VICII_SPENA + ora BYTEMASK,x + sta VICII_SPENA + rts + +@InvalidCommand + pla + pla + jmp SYNTAX_ERROR + +;============================================================================== +; Get Sprite Number From Basic +; Output : x Reg = Sprite Number +; Error : Illegal Quantity +;============================================================================== +GETSpriteNo + jsr bas_GETBYTC$; Get Sprite Number + cpx #8 + bcc @ValidSpriteNo +@IllegalError + pla + pla + ; Illegal Qty Error + jmp bas_IQERR$ + +@ValidSpriteNo + rts diff --git a/incSPLACECommand.asm b/incSPLACECommand.asm new file mode 100644 index 0000000..84cc74b --- /dev/null +++ b/incSPLACECommand.asm @@ -0,0 +1,70 @@ +;******************************************************************************* +;* SPLACE Command * +;* This BASIC function to move a sprite around the screen * +;* ***************************************************************************** +;* Syntax : SPLACE or sp Shifted L * +;* Inputs : Sprite No * +;* : X (0->319) and Y (0 ->199) * +;* : Sprite Colour * +;******************************************************************************* + +; sprite : sprite no,x,y,col +COM_SPLACE + jsr GETSpriteNo + stx COMM_AXLO + + jsr bas_CHKCOM$ ; Checks For a Comma + jsr GetNo2 ; Get X + + cpy #1 + bcc @StoreXPos + beq @TestingXLo +@IllegalError + jmp bas_IQERR$ + +@TestingXLo + cmp #144 + bcs @IllegalError +@StoreXPos + sta COMM_XLO + sty COMM_XHI + + jsr bas_CHKCOM$ ; Checks For a Comma + jsr bas_GETBYTC$; Get Sprite Y + stx COMM_Y1 + + lda COMM_AXLO + asl + tay + lda COMM_XLO + sta VICII_SP0X,y + lda COMM_Y1 + sta VICII_SP0Y,y + + jsr WorkOutSpriteBit + lda BYTEMASK,x + eor #%11111111 + and VICII_MSIGX + sta VICII_MSIGX + + lda COMM_XHI + beq @SpriteColour + lda VICII_MSIGX + ora BYTEMASK,x + sta VICII_MSIGX + +@SpriteColour + jsr bas_CHKCOM$ ; Checks For a Comma + jsr bas_GETBYTC$; Get Sprite Colour + cpx #16 + bcc @SetColour + jmp bas_IQERR$ + +@SetColour + txa + ldx COMM_AXLO + sta VICII_SP0COL,x + rts + + + \ No newline at end of file diff --git a/incSPOFFCommand.asm b/incSPOFFCommand.asm new file mode 100644 index 0000000..6c0b191 --- /dev/null +++ b/incSPOFFCommand.asm @@ -0,0 +1,19 @@ +;******************************************************************************* +;* SPROFF Command * +;* This BASIC function to turn off a Sprite * +;* ***************************************************************************** +;* Syntax : SPROFF or spo Shifted F * +;* Inputs : Sprite # * +;******************************************************************************* + +; sproff : # +COM_SPROFF + jsr GETSpriteNo + stx COMM_AXLO + + jsr WorkOutSpriteBit + lda BYTEMASK,x + eor #%11111111 + and VICII_SPENA + sta VICII_SPENA + rts diff --git a/incSPONCommand.asm b/incSPONCommand.asm new file mode 100644 index 0000000..80f6737 --- /dev/null +++ b/incSPONCommand.asm @@ -0,0 +1,36 @@ +;******************************************************************************* +;* SPRON Command * +;* This BASIC function to turn on a Sprite * +;* ***************************************************************************** +;* Syntax : SPON or sp Shifted O * +;* Inputs : Sprite # * +;******************************************************************************* + +; spron : # +COM_SPRON + jsr GETSpriteNo + stx COMM_AXLO + + jsr WorkOutSpriteBit + lda VICII_SPENA + ora BYTEMASK,x + sta VICII_SPENA + rts + +;============================================================================== +; Get Sprite Number From Basic +; Output : x Reg = Sprite Number +; Error : Illegal Quantity +;============================================================================== +GETSpriteNo + jsr bas_GETBYTC$; Get Sprite Number + cpx #8 + bcc @ValidSpriteNo +@IllegalError + pla + pla + ; Illegal Qty Error + jmp bas_IQERR$ + +@ValidSpriteNo + rts diff --git a/incSPRITECommand.asm b/incSPRITECommand.asm new file mode 100644 index 0000000..9f87fba --- /dev/null +++ b/incSPRITECommand.asm @@ -0,0 +1,78 @@ +;******************************************************************************* +;* SPRITE Command * +;* This BASIC function to set up a sprite on the system * +;* ***************************************************************************** +;* Syntax : SPRITE or sp Shifted R * +;* Inputs : Sprite No * +;* : Sprite Pointer # * +;* : Expanded X Enable / Disable * +;* : Expanded Y Enable / Disable * +;* : Background Priority Enable / Disable * +;* : MultiColour Enable / Disable * +;******************************************************************************* + +; sprite : sprite no, xX, yY, background, multiCol +COM_SPRITE + jsr GETSpriteNo + stx COMM_AXLO + + jsr bas_CHKCOM$ ; Checks For a Comma + jsr bas_GETBYTC$; Get Sprite Poointer# + + txa + ldx COMM_AXLO ; Sprite # + sta SPRITE_POINTERS,x ; Normal Text Mode + sta SPRITE_POINTERS + $8000,x ; Hi-Res Mode + + lda VICII_XXPAND + jsr MOBPARAMGET + sta VICII_XXPAND + + lda VICII_YXPAND + jsr MOBPARAMGET + sta VICII_YXPAND + + lda VICII_SPBGPR + jsr MOBPARAMGET + sta VICII_SPBGPR + + lda VICII_SPMC + jsr MOBPARAMGET + sta VICII_SPMC + rts + +MOBPARAMGET + sta COMM_AY + jsr bas_CHRGOT$ + jsr bas_CHKCOM$ ; Get Comma + + jsr bas_GETBYTC$ ; Get # 0->255 + cpx #2 + bcc @ValueOK + jmp bas_IQERR$ +@ValueOK + cpx #0 + beq @Disable + jsr WorkOutSpriteBit + lda COMM_AY + ora BYTEMASK,x + rts + +@Disable + jsr WorkOutSpriteBit + lda BYTEMASK,x + eor #%11111111 + and COMM_AY + rts + +;============================================================================== +; Get Sprite Number Bit Index +; Input : COMM_AXLO +; Output : x Reg = Sprite Bit Number +;============================================================================== +WorkOutSpriteBit + lda #7 + sec + sbc COMM_AXLO + tax + rts diff --git a/incTRIANGLECommand.asm b/incTRIANGLECommand.asm new file mode 100644 index 0000000..797811b --- /dev/null +++ b/incTRIANGLECommand.asm @@ -0,0 +1 @@ +COM_TRIANGLE diff --git a/incUtilities.asm b/incUtilities.asm new file mode 100644 index 0000000..850ae5e --- /dev/null +++ b/incUtilities.asm @@ -0,0 +1,104 @@ +;******************************************************************************* +;* Library of Functions that will be used throughout the code. * +;******************************************************************************* + +;******************************************************************************* +;* 16Bit Divide Function * +;* This function works out the binary fraction of two 16 bit numbers * +;* ***************************************************************************** +;* Inputs : Number (Number to be divided by) * +;* : Divsor (The Number To divide by) * +;******************************************************************************* + +;ResultFrac = $13 +;Result = $14 +;ResultHi = $15 + +;Working = $16 +;WorkingHi = $17 + +;Estimate = $18 +;EstimateHi = $19 + +;Number = $1A +;NumberHi = $1B +;Divisor = $1C +;DivisorHi = $1D + +Divide16Bit +; Reset All Variables + lda #0 + sta ResultHi + sta Result + sta ResultFrac + + sta Working + sta WorkingHi + sta Estimate + sta EstimateHi + + ;sta Number + ;sta NumberHi + ;sta Divisor + ;sta DivisorHi + + lda Number + sta Working + lda NumberHi + sta WorkingHi + +; Load the Numbers to Divide +; lda #22 +; sta Number +; sta Working + +; lda #7 +; sta Divisor + +; Start Divide Process + ldy #0 + +@BitLevelLoop + asl Working ; Roll 0 into left hand side + rol WorkingHi ; Roll into Hi Byte To + + rol Estimate ; Roll Result of Working Bit into Estimate + rol EstimateHi + + lda EstimateHi + cmp DivisorHi + bcc @DivisorNotFit ; EstimateHi < DivisorHi, So not fitting + bne @DivisorFits ; If Estimate <> Divisor then its greater than + + ; EstimateHi >= DivisorHi, so now Test Lo bytes + lda Estimate + cmp Divisor + bcs @DivisorFits ; The Estimate is bigger than Divisor + +@DivisorNotFit + asl ResultFrac ; Estimate is still to small, roll in a Zero + jmp @RotateRoundResult + +@DivisorFits + lda Estimate ; Estimate is bigger than Divisor + sec + sbc Divisor ; Subtract Divisor + sta Estimate + + lda EstimateHi + sbc DivisorHi + sta EstimateHi + + sec ; Set the Carry + rol ResultFrac ; Roll in a One + +@RotateRoundResult + rol Result ; Contine Roll for all Result Bytes + rol ResultHi + +@CheckRightNumDigits + iny + cpy #24 ; have we run thru all 24 bits (Frac/Lo/Hi) + bne @BitLevelLoop ; Nope, loop back round + + rts ; Yes then Stop diff --git a/incVICChipLocations.asm b/incVICChipLocations.asm new file mode 100644 index 0000000..33ae07f --- /dev/null +++ b/incVICChipLocations.asm @@ -0,0 +1,98 @@ +VICII = $D000 ; Start Address Of The VIC II Chip +VICII_SP0X = $D000 ; Sprite 0 Horizontal Position +VICII_SP0Y = $D001 ; Sprite 0 Vertical Position +VICII_SP1X = $D002 ; Sprite 1 Horizontal Position +VICII_SP1Y = $D003 ; Sprite 1 Vertical Position +VICII_SP2X = $D004 ; Sprite 2 Horizontal Position +VICII_SP2Y = $D005 ; Sprite 2 Vertical Position +VICII_SP3X = $D006 ; Sprite 3 Horizontal Position +VICII_SP3Y = $D007 ; Sprite 3 Vertical Position +VICII_SP4X = $D008 ; Sprite 4 Horizontal Position +VICII_SP4Y = $D009 ; Sprite 4 Vertical Position +VICII_SP5X = $D00A ; Sprite 5 Horizontal Position +VICII_SP5Y = $D00B ; Sprite 5 Vertical Position +VICII_SP6X = $D00C ; Sprite 6 Horizontal Position +VICII_SP6Y = $D00D ; Sprite 6 Vertical Position +VICII_SP7X = $D00E ; Sprite 7 Horizontal Position +VICII_SP7Y = $D00F ; Sprite 7 Vertical Position +VICII_MSIGX = $D010 ; Most Significant Bits of Sprites 0-7 Horizontal Position + ; Bit 0: Most significant bit of Sprite 0 horizontal position + ; Bit 1: Most significant bit of Sprite 1 horizontal position + ; Bit 2: Most significant bit of Sprite 2 horizontal position + ; Bit 3: Most significant bit of Sprite 3 horizontal position + ; Bit 4: Most significant bit of Sprite 4 horizontal position + ; Bit 5: Most significant bit of Sprite 5 horizontal position + ; Bit 6: Most significant bit of Sprite 6 horizontal position + ; Bit 7: Most significant bit of Sprite 7 horizontal position +VICII_MSGX_SP0Y_On = %00000001 +VICII_MSGX_SP1Y_On = %00000010 +VICII_MSGX_SP2Y_On = %00000100 +VICII_MSGX_SP3Y_On = %00001000 +VICII_MSGX_SP4Y_On = %00010000 +VICII_MSGX_SP5Y_On = %00100000 +VICII_MSGX_SP6Y_On = %01000000 +VICII_MSGX_SP7Y_On = %10000000 + +VICII_SCROLY = $D011 ; Vertical Fine Scrolling and Control Register + ; Bits 0-2: Fine scroll display vertically by X scan lines (0-7) + ; Bit 3: Select a 24-row or 25-row text display (1=25 rows, 0=24 rows) + ; Bit 4: Blank the entire screen to the same color as the background + ; (0=blank) + ; Bit 5: Enable bitmap graphics mode (1=enable) + ; Bit 6: Enable extended color text mode (1=enable) + ; Bit 7: High bit (Bit 8) of raster compare register at 53266 ($D012) + +VICII_SCROLY_FineScroll_Mask = %00000011 +VICII_SCROLY_25Rw = %00000100 +VICII_SCROLY_24Rw = 255 - VICII_SCROLY_25Rw ; %11111011 +VICII_SCROLY_RestoreScreen = %00001000 +VICII_SCROLY_BlankScreen = 255 - VICII_SCROLY_RestoreScreen ; %11110111 +VICII_SCROLY_GraphicsMode = %00010000 +VICII_SCROLY_NormalMode = 255 - VICII_SCROLY_GraphicsMode ; %11101111 +VICII_SCROLY_ExtendedColourMode = %00100000 +VICII_SCROLY_NormalColourMode = 255 - VICII_SCROLY_ExtendedColourMode ; %11011111 +VICII_SCROLY_RasterCompareMask = %11000000 + +VICII_RASTER = $D012 + +VICII_LPENX = $D013 +VICII_LPENY = $D014 + +VICII_SPENA = $D015 + +VICII_SCROLX = $D016 + +VICII_YXPAND = $D017 + +VICII_VMCSB = $D018 + +VICII_VICIRQ = $D019 + +VICII_IRQMASK = $D01A + +VICII_SPBGPR = $D01B + +VICII_SPMC = $D01C + +VICII_XXPAND = $D01D + +VICII_SPSPCL = $D01E +VICII_SPBGCL = $D01F + +VICII_EXTCOL = $D020 +VICII_BGCOL0 = $D021 +VICII_BGCOL1 = $D022 +VICII_BGCOL2 = $D023 +VICII_BGCOL3 = $D024 + +VICII_SPMC0 = $D025 +VICII_SPMC1 = $D026 + +VICII_SP0COL = $D027 +VICII_SP1COL = $D028 +VICII_SP2COL = $D029 +VICII_SP3COL = $D01A +VICII_SP4COL = $D01B +VICII_SP5COL = $D01C +VICII_SP6COL = $D01D +VICII_SP7COL = $D01E diff --git a/incVOICECommand.asm b/incVOICECommand.asm new file mode 100644 index 0000000..8549f9b --- /dev/null +++ b/incVOICECommand.asm @@ -0,0 +1,96 @@ +;******************************************************************************* +;* VOICE Command * +;* This BASIC function to set up the Voice Channel * +;* ***************************************************************************** +;* Syntax : VOICE Voice#, Continue/Not, Volumn * +;* Inputs : * +;* : * +;******************************************************************************* + +; sound : Voice# (0-3), (0-255), (0-15) + +COM_VOICE + jsr bas_GETBYTC$ + cpx #4 + bcc @NotIllegal + +@VOICE_Illegal + jmp bas_IQERR$ + +@NotIllegal + cpx #0 + beq @VOICE_Illegal + stx COMM_AY ; VOICE Offset + stx COMM_CY ; VOICE No + + lda #$F9 + ldy #0 + +@VoiceLooper + clc + adc #$07 + iny + cpy COMM_AY + bne @VoiceLooper + sta COMM_AY + + jsr bas_CHRGOT$ + cmp #44 ; Comma + bne VOICE_EXIT + jsr bas_CHRGET$ + jsr GetVoiceType + ; jsr bas_GETBYTC$ +; cpx #2 +; bcc @NotIllegal2 +; jmp bas_IQERR$ + +;@NotIllegal2 + txa + ldy COMM_CY + sta COMM_VOICEGATES,y + + jsr bas_CHRGET$ + cmp #44 ; Comma + bne VOICE_EXIT + jsr bas_CHRGET$ + jsr bas_GETBYTC$ + cpx #$10 + bcc @NotIllegal3 + jmp bas_IQERR$ + +@NotIllegal3 + stx $D418 + +VOICE_EXIT + rts + +GetVoiceType + cmp #TOKANISER_TRIANGLE + bne @IsItSAWTooth + ldx #$10 + rts + +@IsitSAWTooth + cmp #TOKANISER_SAW + bne @IsItPulse + ldx #$20 + rts + +@IsItPulse + cmp #TOKANISER_PULSE + bne @IsItNoise + ldx #$40 + rts + +@IsItNoise + cmp #TOKANISER_NOISE + bne @Error + ldx #$80 + rts + +@Error + pla ; Pull this JSR Return + pla + pla ; Pull Basic JSR Return + pla + jmp SYNTAX_ERROR diff --git a/libBASICRoutines.asm b/libBASICRoutines.asm new file mode 100644 index 0000000..4df1de2 --- /dev/null +++ b/libBASICRoutines.asm @@ -0,0 +1,63 @@ +;******************************************************************************* +;* Get Number From Command Line Routine * +;* Output Variables : * +;* Accumulator has HiByte Value * +;* X Register has LoByte Value * +;******************************************************************************* + +LineNumberLo = $14 +LineNumberHi = $15 + +GetNumberFromCommandLine + jsr bas_CHRGOT$ + bcs GNFCL_Return ; No number on command line + jsr bas_LineGet$ ; Get Integer Value From Command Line + lda LineNumberHi ; Stores Hi Integer Value + ldx LineNumberLo ; Stores Lo Integer Value + clc + +GNFCL_Return + rts + +;******************************************************************************* +;* Print out a String * +;* Input Variables : * +;* Accumulator has LoByte Value * +;* y Register has HiByte Value * +;******************************************************************************* +ABIE + sty 248 + sta 247 + +@ABIELooper + ldy #0 + lda (247),y + cmp #0 + beq @ABIE_EXIT + jsr krljmp_CHROUT$ + inc 247 + bne @ABIE + inc 248 + +@ABIE + jmp @ABIELooper + +@ABIE_EXIT + jmp bas_ReadyPrompt$ + +;******************************************************************************* +;* GETNo2 Function * +;* This function gets a number from BASIC and returns the value in 2 bytes * +;* ***************************************************************************** +;* Inputs : * +;******************************************************************************* +;* Outputs : LineNumberLo = Acc, LineNumberHi = Yreg * +;******************************************************************************* + +GETNo2 + jsr bas_FRMNUM$ + jsr bas_GETADR$ + lda LineNumberLo + ldy LineNumberHi + rts + diff --git a/libCharacterPETSCIIConst.asm b/libCharacterPETSCIIConst.asm new file mode 100644 index 0000000..f865d4f --- /dev/null +++ b/libCharacterPETSCIIConst.asm @@ -0,0 +1,39 @@ +; --------------------------------------------------------------------- +; - Character ASCII Set Constants +; - Date 26th November 2016 +; - Created By John C. Dale +; --------------------------------------------------------------------- + +CHR_White = 5 +CHR_DisableCommodoreKey = 8 +CHR_EnableCommodoreKey = 9 +CHR_Return = 13 +CHR_SwitchToLowerCase = 14 +CHR_CursorUp = 145 +CHR_ReverseOn = 18 +CHR_Home = 19 +CHR_Overwrite = 20 +CHR_Red = 28 +CHR_CursorRight = 29 +CHR_Green = 30 +CHR_Blue = 31 +CHR_Space = 32 +CHR_ShiftReturn = 141 +CHR_SwitchToUpperCase = 142 +CHR_Black = 144 +CHR_CursorDown = 17 +CHR_ReverseOff = 146 +CHR_ClearScreen = 147 +CHR_Insert = 148 +CHR_Purple = 156 +CHR_CursorLeft = 157 +CHR_Yellow = 158 +CHR_Cyan = 159 +CHR_ShiftSpace = 160 +CHR_Quote = 34 +CHR_Equals = 61 +CHR_Colon = 58 +CHR_Comma = 44 +CHR_ExclamationMark = 33 +CHR_OpenBracket = 40 +CHR_ClosedBracket = 41 diff --git a/libGraphicsRoutines.asm b/libGraphicsRoutines.asm new file mode 100644 index 0000000..6298ee4 --- /dev/null +++ b/libGraphicsRoutines.asm @@ -0,0 +1,175 @@ +;******************************************************************************* +;* Library of Graphic Functions that will be used throughout the code. * +;******************************************************************************* + +;******************************************************************************* +;* PLACE Function * +;* This function works out the byte location of the memory address to modify * +;* ***************************************************************************** +;* Inputs : X = Pixel Column location, Y = Pixel Row Location * +;******************************************************************************* + +PLACE + clc + lda COMM_Y ; Get Y Pixel Row location + cmp #200 ; Maximum number of rows + 1 + bcs @PLACE_ERROR + lda COMM_XHI ; Get X Pixel Column Location (HiByte) + cmp #2 + bcs @PLACE_ERROR ; 2 or Above = ERROR + cmp #1 + bne WORK_PLACEOUT ; this is Zero.... so it is legal + lda COMM_XLo + cmp #64 + bcc WORK_PLACEOUT + +@PLACE_ERROR + jmp bas_IQERR$ + +WORK_PLACEOUT + ; Rw = (200 - Y) / 8 + lda #199 + sec + sbc COMM_Y + clc + lsr ; Div 2 + lsr ; Div 2 = 4 + lsr ; Div 2 = 8 + sta COMM_U ; Row Number + + ; Cl = X / 8 + lda COMM_XHi ; this is either 1 or 0 + lsr ; populate the carry flag + lda COMM_XLo ; 0-255 + + ; C BBBBBBBB + ; 1 10101011 + ; > 11010101 > 1 + ror ; Div 2 + lsr ; Div 2 = 4 + lsr ; Div 2 = 8 + sta COMM_V ; Column Number + + ; pRw = Rw * 320 (S = U * 320) + ldy COMM_U + lda #0 + sta COMM_SLO + sta COMM_SHI + cpy #0 + beq WORK_OUT_COL + +@RowMultiplier + lda COMM_SLO + clc + adc #64 + sta COMM_SLO + lda COMM_SHI + adc #1 + sta COMM_SHI + dey + bne @RowMultiplier + +WORK_OUT_COL + ; pRw = 7 - (Y - (Rw*8)) + ; pRw = 7 - (Y and 7) (R = 7- (Y and 7)) + lda COMM_Y + and #7 + sta COMM_R + sec + lda #7 + sbc COMM_R + sta COMM_R + + ; pixel = X And 7 (C = X and 7) + lda COMM_XLO + and #7 + sta COMM_C + + ; Memory Location + ; BASE + pRw + (cl * 8) + pRw ($A000 + S + (V*8) + R) + lda #0 + sta STAL + lda #>BITMAP_START + sta STAL + 1 + clc + lda STAL + adc COMM_SLO + sta STAL + lda STAL + 1 + adc COMM_SHI + sta STAL + 1 + + lda #0 + asl COMM_V ; Mult 2 + asl COMM_V ; Mult 2 = 4 + asl COMM_V ; Mult 2 = 8 + rol + clc + adc STAL + 1 + sta STAL + 1 + + clc + lda COMM_V + adc STAL + sta STAL + + bcc @ByPassInc + inc STAL + 1 + +@ByPassInc + clc + lda COMM_R + adc STAL + sta STAL + bcc @ByPassIncAgain + inc STAL + 1 + +@ByPassIncAgain + rts + +;******************************************************************************* +;* DOT Function * +;* This function sets the pixel in the memory locations set by PLACE * +;* ***************************************************************************** +;* Inputs : ZP : C1 and C2, COMM_C * +;******************************************************************************* + +DOT + jsr BANK_OUT_ROM + + ldx COMM_C + ldy #0 + lda BYTEMASK,x + pha + +SETDOT + lda COMM_ERASE_ENABLED + bmi ERASEDOT + pla + ora (STAL),y + jmp Continue +ERASEDOT + pla + eor (STAL),y +Continue + sta (STAL),y + + jsr BANK_IN_ROM + rts + +BANK_OUT_ROM + sei + lda 1 + and #%11111110 ; Paging out BASIC ROM + ;and #%11111101 ; Paging out KERNAL ROM + sta 1 + rts + +BANK_IN_ROM + lda 1 + ora #%00000001 ; Paging in BASIC ROM + ;ora #%00000010 ; Paging in KERNAL ROM + sta 1 + cli + rts + diff --git a/libROMRoutines.asm b/libROMRoutines.asm new file mode 100644 index 0000000..0215de2 --- /dev/null +++ b/libROMRoutines.asm @@ -0,0 +1,90 @@ +; BASIC Rom starts at $A000 +bas_ROMError$ = $A437 +bas_CustomError$ = $A447 +bas_DecimalPrint$ = $BDCD +bas_PrintString$ = $AB1E +bas_ReadyPrompt$ = $A474 +bas_LineGet$ = $A96B +bas_NEWCommand$ = $A642 +bas_FindLine$ = $A613 +bas_CLRCommand$ = $A67A +bas_GONE$ = $A7E4 +bas_NewStatement$ = $A7AE +bas_CRUNCH$ = $A579 +bas_UNCRUNCH$ = $A717 +bas_CHRGET$ = $0073 +bas_CHRGOT$ = $0079 +bas_EVAL$ = $AE83 +bas_CHKCOM$ = $AEFD +bas_GETBYTC$ = $B79E +bas_CHKCLOSE$ = $AEF7 +bas_GIVAYF$ = $B391 +bas_FRMNUM$ = $AD8A +bas_GETADR$ = $B7F7 +bas_SYNCHR$ = $AEFF +bas_MOVEFP1M$ = $BBD7 +bas_MOVEFP1FP2$ = $BC0F +bas_FPDIV$ = $BB12 +bas_MOVEMFP1$ = $BBA2 +bas_FMULTT$ = $BA30 +bas_FACINX$ = $B1AA +os_COS$ = $E264 +os_SIN$ = $E26B +bas_FCOMP$ = $BC5B +bas_FADDT$ = $B86A +bas_CONUPK$ = $BA8C +bas_IQERR$ = $B248 +bas_FRMEVL$ = $AD9E +bas_FRESTR$ = $B6A3 +bas_SYNTAXErr$ = $AF08 + +; Kernel Jump Vectors +krljmp_PCINT$ = $FF81 +krljmp_IOINIT$ = $FF84 +krljmp_RAMTAS$ = $FF87 +krljmp_RESTOR$ = $FF8A +krljmp_VECTOR$ = $FF8D +krljmp_SETMSG$ = $FF90 +krljmp_SECOND$ = $FF93 +krljmp_TKSA$ = $FF96 +krljmp_MEMTOP$ = $FF99 +krljmp_MEMBOT$ = $FF9C +krljmp_SCNKEY$ = $FF9F +krljmp_SETTMO$ = $FFA2 +krljmp_ACPTR$ = $FFA5 +krljmp_CIOUT$ = $FFA8 +krljmp_UNTALK$ = $FFAB +krljmp_UNLSN$ = $FFAE +krljmp_LISTEN$ = $FFB1 +krljmp_TALK$ = $FFB4 +krljmp_READST$ = $FFB7 +krljmp_SETLFS$ = $FFBA +krljmp_SETNAM$ = $FFBD +krljmp_OPEN$ = $FFC0 +krljmp_CLOSE$ = $FFC3 +krljmp_CHKIN$ = $FFC6 +krljmp_CHKOUT$ = $FFC9 +krljmp_CLRCHN$ = $FFCC +krljmp_CHRIN$ = $FFCF +krljmp_CHROUT$ = $FFD2 +krljmp_LOAD$ = $FFD5 +krljmp_SAVE$ = $FFD8 +krljmp_SETTIM$ = $FFDB +krljmp_RDTIM$ = $FFDE +krljmp_STOP$ = $FFE1 +krljmp_GETIN$ = $FFE4 +krljmp_CLALL$ = $FFE7 +krljmp_UDTIM$ = $FFEA +krljmp_SCREEN$ = $FFED +krljmp_PLOT$ = $FFF0 +krljmp_BASE$ = $FFF3 + +jmpvec_Error = $0300 +jmpvec_Main = $0302 +jmpvec_Crunch = $0304 +jmpvec_List = $0306 +jmpvec_Run = $0308 + +jmpvec_irq = $0314 +jmpvec_brk = $0316 +jmpvec_nmi = $0318 diff --git a/oskbasic.crt b/oskbasic.crt new file mode 100644 index 0000000..cae8fa6 Binary files /dev/null and b/oskbasic.crt differ