diff --git a/include/apple1.a02 b/include/apple1.a02 index d3cf3f0..4ad1ff1 100644 --- a/include/apple1.a02 +++ b/include/apple1.a02 @@ -23,8 +23,8 @@ DSTLO EQU $32 ;Destination String Pointer (string.a02) DSTHI EQU $33 BLKLO EQU $34 ;Block Segment Pointer (block.a02) BLKHI EQU $35 -PTRLO EQU $35 ;System Pointer (pointer.a02) -PTRHI EQU $36 +STKLO EQU $35 ;System Pointer (pointer.a02) +STKHI EQU $36 RDSEED EQU $3E ;Pseudo-RANDOM Seed RANDOM EQU $3F ;Pseudo-RANDOM Number Storage @@ -34,12 +34,15 @@ TEMP1 EQU $41 TEMP2 EQU $42 TEMP3 EQU $43 -BLKSLO EQU $4A ;Block Start Address -BLKSHI EQU $4B -BLKELO EQU $4C ;Block End Address -BLKEHI EQU $4D -BLKLEN EQU $4E ;Block Segment Length - +BLKLEN EQU $47 ;Block Segment Length +BLKSLO EQU $48 ;Block Start Address +BLKSHI EQU $49 +BLKELO EQU $4A ;Block End Address +BLKEHI EQU $4B +STKSLO EQU $4C ;Stack Start Address +STKSHI EQU $4D +STKELO EQU $4E ;Stack End Address +STKEHI EQU $4F ;PIA 6820 Registers KBD EQU $D010 ;Keyboard Data @@ -56,8 +59,7 @@ PRHEX EQU $FFE5 ;Subroutine - Print Low Nybble of Accumulator as Hex Digit START: LDX #$FF ;Reset stack - the monitor doesn't do this TXS ; (probably because of lack of space) - LDA #$0D ;Move cursor to next line before - JSR ECHO ; executing program + JSR NEWLIN ;Move cursor to next line before executing program JMP MAIN ;Execute Program @@ -91,19 +93,3 @@ DELCHR: LDA #DELKEY ;Load Underscore Character ;Advance Character to Next line NEWLIN: LDA #$0D ;Load C/R into Accumulator JMP PRCHR ; and Print it - -;Initialize Destination String Pointer and Index -SETDST: STX DSTLO ;Save Destination String Pointer - STY DSTHI - RTS - -;Initialize Source String Pointer and Index -SETSRC: STX SRCLO ;Save Source String Pointer - STY SRCHI - LDY #$00 ;Initialize Index Into String - RTS - -;Retrieve Source String Pointer -GETSRC: LDX SRCLO - LDY SRCHI - RTS diff --git a/include/apple1.h02 b/include/apple1.h02 index 560e2b8..a3f9db8 100644 --- a/include/apple1.h02 +++ b/include/apple1.h02 @@ -8,16 +8,24 @@ char ysave; //Y Register Storage char mode; //Mode: Store, Examine, Block Examine char buffer[]; //Input Buffer +//Platform Specific Constants +#define DELKEY $5F //Delete/Backspace Key +#define ESCKEY $1B //Escape/Stop Key +#define RTNKEY $0D //Return/Enter Key + /* Standard Library Variables */ char srclo,srchi; //Source String Pointer for Library Functions char dstlo,dsthi; //Destination String Pointer for Library Functions char blklo,blkhi; //Block Segment Pointer -char ptrlo,ptrhi; //System Pointer +char stklo,skthi; //System Pointer char blkslo, blkshi; //Block Start Address char blkelo, blkehi; //Block End Address char blklen; //Block Segment Length +char stkslo, stkshi; //Stack Start Address +char stkelo, stkehi; //Stack End Address + char temp0, temp1, temp2, temp3; //Temporary Variables //PIA 6820 Registers diff --git a/include/oric.h02 b/include/oric.h02 index 0dd362d..c870a63 100644 --- a/include/oric.h02 +++ b/include/oric.h02 @@ -7,7 +7,7 @@ #define NULKEY $00 //No Key was Pressed /* Zero Page Variables used as Pointers */ -char strlo,strhi; //String pointer for String and I/O functions +char srclo,srchi; //String pointer for String and I/O functions char dstlo,dsthi; //Secondary string pointer for String functions char temp0,temp1,temp2,temp3; //Temporary variables diff --git a/include/py65.h02 b/include/py65.h02 index cc3681d..140a10b 100644 --- a/include/py65.h02 +++ b/include/py65.h02 @@ -4,7 +4,6 @@ #define DELKEY $08 //Delete/Backspace Key #define ESCKEY $1B //Escape/Stop Key #define RTNKEY $0D //Return/Enter Key -#define NULKEY $00 //No Key was Pressed //Library Pointer Variables char srclo,srchi; //Source String Pointer for Library Functions diff --git a/include/template.h02 b/include/template.h02 index 53f559f..2395599 100644 --- a/include/template.h02 +++ b/include/template.h02 @@ -1,6 +1,6 @@ -/********************************************* - * stdlib - Template Library Routines for C02 * - *********************************************/ +/************************************************ + * template - Template Library Routines for C02 * + ************************************************/ /* Function Description * * Args: a - First Argument * diff --git a/include/vic.a02 b/include/vic.a02 index 83feb24..f6f8689 100644 --- a/include/vic.a02 +++ b/include/vic.a02 @@ -38,27 +38,8 @@ USER13 EQU $03FD ;Free Byte for User Programs USER14 EQU $03FE ;Free Byte for User Programs USER15 EQU $03FF ;Free Byte for User Programs -;Cakculated Addresses -BASICX EQU BASIC+$0B ;End of Basic Program - -;Machine Language Basic Stub - ORG BASIC ;Start - DC BASICX ; Pointer to Next Line - DC $00, $00 ; Line Number (0) - DC $9E ; SYS - DC $20 ; ' ' - DC SYSADR ; "addr" - DC $00 ;End of Line Marker - DC $00, $00 ;End of Basic Program - START: TSX ;Get Stack Pointer STX STKSAV ;and Save for Exit -; LDA #$0E ;Switch to Upper/Lower Case -; JSR PRCHR -; LDA #$08 ;Disable Commodore+Shift -; JSR PRCHR -; LDA #$93 ;Clear Screen -; JSR PRCHR JMP MAIN ;Execute Program EXIT: LDX STKSAV ;Retrieve Saved Stack Pointer diff --git a/include/vic20.a02 b/include/vic20.a02 index a433c6c..475b44b 100644 --- a/include/vic20.a02 +++ b/include/vic20.a02 @@ -5,8 +5,14 @@ VICSCN EQU $1E00 ;Video Screen Memory Area (Unexpanded) CHRROM EQU $8000 ;Character Generator ROM VICCLR EQU $9600 ;COLOR RAM (UNEXPANDED) -;BASIC Stub Constants -BASIC EQU $1001 ;Start of BASIC Program -SYSADR EQM "4110" ;M/L SYS Address +;Machine Language Basic Stub + ORG $1001 ;Start of Basic Program +BASIC: DC $0C, $10 ;Pointer to Next Line + DC $00, $00 ;Line Number (0) + DC $9E ;SYS + DC $20 ;' ' + DC $34,$31,$31,$30 ;"4110" + DC $00 ;End of Line Marker + DC $00, $00 ;End of Basic Program INCLUDE "../include/vic.a02" ;Include VIC 20 Common Code diff --git a/include/vic3k.a02 b/include/vic3k.a02 index 4ab39e9..90db978 100644 --- a/include/vic3k.a02 +++ b/include/vic3k.a02 @@ -5,8 +5,14 @@ VICSCN EQU $1E00 ;Video Screen Memory Area (Unexpanded) CHRROM EQU $8000 ;Character Generator ROM VICCLR EQU $9600 ;Color RAM (Unexpanded) -;BASIC Stub Constants -BASIC EQU $0401 ;Start of BASIC Program -SYSADR EQM "1038" ;M/L SYS Address +;Machine Language Basic Stub + ORG $0401 ;Start of Basic Program +BASIC: DC $0C, $04 ;Pointer to Next Line + DC $00, $00 ;Line Number (0) + DC $9E ;SYS + DC $20 ;' ' + DC $31,$30,$33,$38 ;"1038" + DC $00 ;End of Line Marker + DC $00, $00 ;End of Basic Program INCLUDE "../include/vic.a02" ;Include VIC 20 Common Code diff --git a/include/vic8k.a02 b/include/vic8k.a02 index db68ad4..0b11ee3 100644 --- a/include/vic8k.a02 +++ b/include/vic8k.a02 @@ -5,8 +5,14 @@ VICSCN EQU $1000 ;Video Screen Memory Area (Unexpanded) CHRROM EQU $8000 ;Character Generator ROM VICCLR EQU $9400 ;Color RAM (Unexpanded) -;BASIC Stub Constants -BASIC EQU $1201 ;Start of BASIC Program -SYSADR EQM "4622" ;M/L SYS Address +;Machine Language Basic Stub + ORG $1201 ;Start of Basic Program +BASIC: DC $0C, $12 ;Pointer to Next Line + DC $00, $00 ;Line Number (0) + DC $9E ;SYS + DC $20 ;' ' + DC $34,$36,$32,$32 ;"4622" + DC $00 ;End of Line Marker + DC $00, $00 ;End of Basic Program INCLUDE "../include/vic.a02" ;Include VIC 20 Common Code diff --git a/test/_files.txt b/test/_files.txt new file mode 100644 index 0000000..56dcf95 --- /dev/null +++ b/test/_files.txt @@ -0,0 +1,31 @@ +C02/Test/ - C02 Compiler Test & Demonstration Programs + +Batch Files - Compile and assemble programs for specific systems + + A1.BAT Apple 1 - Creates .ASC file (Woz Monitor Format, 0300R to Run) + A2.BAT Apple 2 - Creates .DSK file (Bootable Disk Image) + O1.BAT Oric-1 - Creates .TAP file (Oriculator Tape Image) + P65.BAT py65mon - Creates .BIN file (Binary file, Load and Run at 0200) + V8K.BAT VIC+8K - Creates .PRG file (Program File with BASIC stub) + +Auxillary Files - Used by Batch Files + + s2boot.dsk Apple 2 Bootable Disk Image - Used by A2.BAT + xvic.ini VICE Configuration - Used bu V8K.BAT + +C02 Test & Demonstration Files + + echo.c02 Echo typed keys to screen + echohex.c02 Display ASCII code of typed keys in Hexadecimal + + conds.c02 Test C02 Conditional Expressions + funcs.c02 Test C02 Function Calls and Parameter Passing + loops.c02 Test C02 Loop Structures + + forforpf.c02 Demo of printf function from "stringx" module + strings.c02 Demo of standard library "string" module + + testhdr.c02 Test system specific Header file functions + testsd.c02 Test module "stddef" functions + testsl.c02 Test module "stdlib" functions + testiox.c02 Test module "stdiox" functions diff --git a/test/a1.bat b/test/a1.bat new file mode 100644 index 0000000..1bcfbe9 --- /dev/null +++ b/test/a1.bat @@ -0,0 +1,22 @@ +@ECHO OFF +REM Compile and Assemble Program for Apple-1 +IF EXIST %1.c02 GOTO COMPILE + ECHO File %1.c02 not found + EXIT /B + +:COMPILE +ECHO Compiling File %1.c02 +..\c02.exe -h apple1 %1 >%1.dbg +IF ERRORLEVEL 1 EXIT /B + +ECHO Assembling File %1.asm +dasm %1.asm -f1 -o%1.obj -l%1.lst -s%1.sym +IF ERRORLEVEL 1 EXIT /B + +ECHO Converting Object File +python ..\util\bin2asc.py %1 +IF ERRORLEVEL 1 EXIT /B +DEL %1.obj + +ECHO Copying ASCII File +COPY %1.asc C:\Programs\pom1\asc\%1.asc diff --git a/test/a2.bat b/test/a2.bat new file mode 100644 index 0000000..22fea73 --- /dev/null +++ b/test/a2.bat @@ -0,0 +1,23 @@ +@ECHO OFF +IF EXIST %1.c02 GOTO COMPILE + ECHO File %1.c02 not found + EXIT /B + +:COMPILE +ECHO Compiling File %1.c02 +..\c02.exe -h apple2 %1 >%1.dbg +IF ERRORLEVEL 1 EXIT /B + +ECHO Assembling File %1.asm +dasm %1.asm -f3 -o%1.obj -l%1.lst -s%1.sym +IF ERRORLEVEL 1 EXIT /B + +ECHO Building Disk Image +COPY /Y a2boot.dsk %1.dsk +ECHO BRUN %1 |python -c "print(input().upper())" |a2tools in t %1.dsk command +a2tools in b.0C00 %1.dsk %1 %1.obj +IF ERRORLEVEL 1 EXIT /B +DEL %1.obj + +ECHO Starting Emulator +START C:\Programs\AppleWin\applewin -d1 %1.dsk diff --git a/test/conds.c02 b/test/conds.c02 new file mode 100644 index 0000000..1515457 --- /dev/null +++ b/test/conds.c02 @@ -0,0 +1,67 @@ +/**************************************** + * CONDS - Test Conditional Expressions * + ****************************************/ + +//Specify System Header using -H option +#include +#include +#include + +char allok; + +main: + +allok = #TRUE; + +putln("Test Conditionals"); + +puts(" 1<>1"); if (1<>1) failed(); else passed(); +puts(" 1<>2"); if (1<>2) passln(); else failln(); +puts(" 1==1"); if (1==1) passed(); else failed(); +puts(" 1==2"); if (1==2) failln(); else passln(); +puts("1+1=2"); if (1+1 == 2) passed(); else failed(); +puts(" 2<1"); if (2<1) failln(); else passln(); +puts(" 1<1"); if (1<1) failed(); else passed(); +puts(" 1<2"); if (1<2) passln(); else failln(); + +puts(" 1<=1"); if (1<=1) passed(); else failed(); +puts(" 1<=2"); if (1<=2) passln(); else failln(); +puts(" 2<=1"); if (2<=1) failed(); else passed(); +puts(" 2>1"); if (2>1) passln(); else failln(); +puts(" 1>1"); if (1>1) failed(); else passed(); +puts(" 1>2"); if (1>2) failln(); else passln(); +puts(" 1>=1"); if (1>=1) passed(); else failed(); +puts(" 1>=2"); if (1>=2) failln(); else passln(); +puts(" 2>=1"); if (2>=1) passed(); else failed(); +puts(" !0:+"); if (!0:+) failln(); else passln(); + +puts("$FF:+"); if ($FF:+) failed(); else passed(); +puts(" $FF"); if ($FF) passln(); else failln(); +puts("$FF:-"); if ($FF:-) passed(); else failed(); +puts(" !$FF"); if (!$FF) failln(); else passln(); +puts("$00:+"); if ($00:+) passed(); else failed(); +puts(" $00"); if ($00) failln(); else passln(); +puts("$00:-"); if ($00:-) failed(); else passed(); +puts(" !$00"); if (!$00) passln(); else failln(); + +puts(" 1!0"); if (1|0) passed(); else failed(); +puts(" !1!0"); if (!1|0) failln(); else passln(); +puts(" 1&0"); if (1&0) failed(); else passed(); +puts(" !1&0"); if (!1&0) passln(); else failln(); +puts(" 1^1"); if (1^1) failed(); else passed(); +puts(" !1^1"); if (!1^1) passln(); else failln(); + +puts(" atoc(\"0\")"); if (atoc("0")) failln(); else passln(); +puts(" atoc(\"1\")"); if (atoc("1")) passln(); else failln(); +puts(" atoc(\"127\"):+"); if (atoc("127"):+) passln(); else failln(); +puts(" atoc(\"128\"):-"); if (atoc("128"):-) passln(); else failln(); + +if (allok) putln("All Tests Passed"); +getc(); + +goto exit; + +void passed() {puts(" Pass");} +void passln() {passed(); newlin();} +void failed() {puts(" Fail"); allok = #FALSE;} +void failln() {failed(); newlin();} diff --git a/test/echohex.c02 b/test/echohex.c02 new file mode 100644 index 0000000..c9438e4 --- /dev/null +++ b/test/echohex.c02 @@ -0,0 +1,17 @@ +/******************************************************* + * ECHOHEX - Test/Demo program for C02 Standard Header * + * Displays ASCII Code of Typed Keys to Screen * + * ESCAPE/STOP key Ends Program * + *******************************************************/ + +//Specify System Header using -H option + +char key; //Key value + +main: + while() { + key = rdkey(); + prbyte(key); + prchr(' '); + if (key==#ESCKEY) goto exit; + } diff --git a/test/forforpf.c02 b/test/forforpf.c02 new file mode 100644 index 0000000..b21c55e --- /dev/null +++ b/test/forforpf.c02 @@ -0,0 +1,20 @@ +/****************************************** + * FORFORPF - Test Nested FOR with PRINTF * + ******************************************/ + +//Specify System Header using -H option +#include +#include +#include +#include + +char i,j,result; +main: + for (i=0;i<5;i++) { + for (j=0;j<5;j++) { + result=div(mult(mult(i,5)+j,3),5)+32; //(i*5+j)*3/5+32; + printf(result,"%d "); + } + newlin(); + } +goto exit; diff --git a/test/funcs.c02 b/test/funcs.c02 new file mode 100644 index 0000000..fcb4423 --- /dev/null +++ b/test/funcs.c02 @@ -0,0 +1,71 @@ +/******************************* + * FUNCS - Test Function Calls * + *******************************/ + +//Specify System Header using -H option +#include +#include +#include +#include + +char i; //index value +char n; //result of function call +char s[128]; //for Numeric to String conversions +char z; //Function Parameters + +const char passed = " Passed."; +const char failed = " Failed."; + +main: + +for (i=1;i<5;i++) test(i); +putln("Testing complete."); + +goto exit; + +//Test Use of Variable as Parameter +void test(z) { + select(z) { + case 1: test1(); + case 2: test2(); + case 3: test3(); + case 4: test4(); + default: printf(z, "Bad test value %d\n."); + } +} + + +void test1() { + puts("atoc(\"1\") = "); + n = atoc("1"); + prtnum(n); checkn(1); +} + +void test2() { + puts("atoc(\"2\") = "); + n = atoc("2"); + prtnum(n); checkn(2); +} + +void test3() { + puts("atoc(\"1\") + 2 = "); + n = atoc("1") + 2; + prtnum(n); checkn(3); +} + +void test4() { + puts("abs(atoc(\"255\") + 7 = "); + n = abs(atoc("255")) + 7; + prtnum(n); checkn(8); +} + + +//uses explicit passing of accumulator +void checkn() {if (A == n) pass(); else fail();} + +//uses implicit passing of accumulator +void prtnum() {ctoa(&s); puts(&s); putc(':');} + +//one more level of function calls - just because +void pass() {putln(&passed);} +void fail() {putln(&failed);} diff --git a/test/loops.c02 b/test/loops.c02 index de62c1d..69350dc 100644 --- a/test/loops.c02 +++ b/test/loops.c02 @@ -2,11 +2,12 @@ * LOOPS - Test C02 Loop Structures * ************************************/ -#include +//Specify System Header using -H option +#include #include char i, b; -char failed = " Test Failed!"; +const char failed = " Test Failed!"; main: diff --git a/test/o1.bat b/test/o1.bat index 3238c1c..0fb5832 100644 --- a/test/o1.bat +++ b/test/o1.bat @@ -13,7 +13,7 @@ ECHO Assembling File %1.asm dasm %1.asm -f1 -o%1.obj -l%1.lst -s%1.sym IF ERRORLEVEL 1 EXIT /B -ECHO Building Disk Image +ECHO Building Tape Image python ..\util\orictap.py %1 IF ERRORLEVEL 1 EXIT /B DEL %1.obj diff --git a/test/p65.bat b/test/p65.bat new file mode 100644 index 0000000..ae1ca17 --- /dev/null +++ b/test/p65.bat @@ -0,0 +1,15 @@ +@ECHO OFF +IF EXIST %1.c02 GOTO COMPILE + ECHO File %1.c02 not found + GOTO EOF + +:COMPILE +@ECHO Compiling File %1.c02 for py65mon +..\c02.exe -h py65 %1 >%1.dbg + +IF %ERRORLEVEL% NEQ 0 GOTO EOF + + @ECHO Assembling File %1.asm +C:\Programs\dasm %1.asm -f3 -o%1.bin -l%1.lst -s%1.sym + +:EOF diff --git a/test/strings.c02 b/test/strings.c02 index 22473d2..f1309e4 100644 --- a/test/strings.c02 +++ b/test/strings.c02 @@ -2,40 +2,47 @@ * STRINGS - Demonstrate string.h02 functions * **********************************************/ -#include -#include +//Specify System Header using -H option +#include #include +#include #include #include char slen, scmp, spos; -char s1 = "First string."; -char s2 = "Second string."; -char stest = "123456789012345678901234567890"; +const char s1 = "FIRST STRING."; +const char s2 = "SECOND STRING."; +const char stest = "123456789012345678901234567890"; char stemp[32]; -char sless = "This string is less."; -char smore = "This string is more."; +const char smore = "THIS STRING IS MORE."; +const char sless = "THIS STRING IS LESS."; char sprt[4]; -char pass = "Pass"; -char fail = "Fail"; +const char pass = "PASS"; +const char fail = "FAIL"; + +void anykey() { + putln("*PRESS A KEY*"); + if (getkey() == #ESCKEY) goto exit; + newlin(); +} main: //Demo strchr(), strrch() putln(&s1); //Print s1 to screen - puts("Position of first 's' is: "); - spos = strchr('s', &s1); //Get position of 's' + puts("POSITION OF FIRST 'S' IS: "); + spos = strchr('S', &s1); //Get position of 's' ctoa(spos, &sprt); //Convert to string putln(&sprt); //Print position to screen - puts("Position of first 'x' is: "); - spos = strchr('x', &s1); //Get position of 's' + puts("POSITION OF FIRST 'X' IS: "); + spos = strchr('X', &s1); //Get position of 's' ctoa(spos, &sprt); //Convert to string putln(&sprt); //Print position to screen - puts("Position of last 's' is: "); - spos = strrch('s', &s1); //Get position of 's' + puts("POSITION OF LAST 'S' IS: "); + spos = strrch('S', &s1); //Get position of 's' ctoa(spos, &sprt); //Convert to string putln(&sprt); //Print position to screen - puts("Position of last 'x' is: "); - spos = strrch('x', &s1); //Get position of 's' + puts("POSITION OF LAST 'X' IS: "); + spos = strrch('X', &s1); //Get position of 's' ctoa(spos, &sprt); //Convert to string putln(&sprt); //Print position to screen newlin(); @@ -44,61 +51,65 @@ main: putln(&stest); //Print stest to screen slen = strlen(&stest); //Get string length ctoa(slen, &sprt); //Convert to string - puts("Length of string is "); + puts("LENGTH OF STRING IS "); putln(&sprt); //Print length to screen newlin(); //Demo setstr(); strdst(&stemp); //Set stemp as destination street - puts("Address of stemp is $"); + puts("ADDRESS OF STEMP IS $"); prbyte(dsthi); //Print stored address to string prbyte(dstlo); newlin(); newlin(); + anykey(); + //Demo strcpy() - putln("Copying s1 to stemp: "); - strdst(&stemp); //Set Destination String - slen = strcpy(&s1); //Copy s1 into Destination String - puts("String stemp contains: "); - putln(&stemp); //Print stest to screen - ctoa(slen, &sprt); //Convert to string - puts("Total characters copied: "); - putln(&sprt); //Print length to screen + putln("COPYING S1 TO STEMP: "); + strdst(&stemp); //Set Destination String + slen = strcpy(&s1); //Copy s1 into Destination String + puts("STRING STEMP CONTAINS: "); + putln(&stemp); //Print stest to screen + ctoa(slen, &sprt); //Convert to string + puts("TOTAL CHARACTERS COPIED: "); + putln(&sprt); //Print length to screen newlin(); //Demo strcat() - putln("Concatenating s2 to stemp: "); - strdst(&stemp); //Set Destination String - slen = strcat(&s2); //Copy s1 into Destination String - puts("String stemp contains: "); - putln(&stemp); //Print stest to screen - ctoa(slen, &sprt); //Convert to string - puts("Length of concatenated string is "); - putln(&sprt); //Print length to screen + putln("CONCATENATING S2 TO STEMP: "); + strdst(&stemp); //Set Destination String + slen = strcat(&s2); //Copy s1 into Destination String + putln("STRING STEMP CONTAINS: "); + puts(" "); putln(&stemp); //Print stest to screen + ctoa(slen, &sprt); //Convert to string + puts("LENGTH OF CONCATENATED STRING IS "); + putln(&sprt); //Print length to screen newlin(); //Demo strcut() - putln("Cutting s2 at position 7 to stemp: "); + putln("CUTTING S2 AT POSITION 7 TO STEMP: "); strdst(&stemp); //Set Destination String slen = strcut(7, &s2); //Copy s1 into Destination String - puts("String stemp contains: "); + puts("STRING STEMP CONTAINS: "); putln(&stemp); //Print stest to screen ctoa(slen, &sprt); //Convert to string - puts("Length of cut string is "); + puts("LENGTH OF CUT STRING IS "); putln(&sprt); //Print length to screen newlin(); + anykey(); + //Demo strcmp(); - puts("Comparing sless to smore: "); + puts("COMPARING SLESS TO SMORE: "); strdst(&sless); scmp = strcmp(&smore); prbyte(scmp); newlin(); - puts("Comparing sless to sless: "); + puts("COMPARING SLESS TO SLESS: "); strdst(&sless); scmp = strcmp(&sless); prbyte(scmp); newlin(); - puts("Comparing smore to sless: "); + puts("COMPARING SMORE TO SLESS: "); strdst(&smore); scmp = strcmp(&sless); prbyte(scmp); newlin(); @@ -106,17 +117,17 @@ main: //Demo strspn(); putln(&stest); //Print test to screen - puts("Span matching \"0123\" is: "); + puts("SPAN MATCHING \"0123\" IS: "); strdst(&stest); //Set string to search slen = strspn("0123"); //Get position of "123" ctoa(slen, &sprt); //Convert to string putln(&sprt); //Print position to screen - puts("Span matching \"0123456789\" is: "); + puts("SPAN MATCHING \"0123456789\" IS: "); strdst(&stest); //Set string to search slen = strspn("0123456789"); //Get position of "123" ctoa(slen, &sprt); //Convert to string putln(&sprt); //Print position to screen - puts("Span matching \"789\" is: "); + puts("SPAN MATCHING \"789\" IS: "); strdst(&stest); //Set string to search slen = strspn("789"); //Get position of "123" ctoa(slen, &sprt); //Convert to string @@ -125,12 +136,14 @@ main: //Demo strstr(); putln(&stest); //Print test to screen - puts("Position of \"234\" is: "); + puts("POSITION OF \"234\" IS: "); strdst(&stest); //Set string to search spos = strstr("234"); //Get position of "123" ctoa(spos, &sprt); //Convert to string putln(&sprt); //Print position to screen newlin(); + newlin(); + goto exit; diff --git a/test/testhdr.c02 b/test/testhdr.c02 new file mode 100644 index 0000000..ca6cc38 --- /dev/null +++ b/test/testhdr.c02 @@ -0,0 +1,21 @@ +/************************************************** + * TESTHDR - Test C02 system specific Header file * + **************************************************/ + + +//use -h option on command line + +main: + + prchr('P'); + prchr('R'); + prchr('C'); + prchr('H'); + prchr('R'); + newlin(); + + getkey(); + newlin(); + +goto exit; + diff --git a/test/testiox.c02 b/test/testiox.c02 new file mode 100644 index 0000000..7ad68b1 --- /dev/null +++ b/test/testiox.c02 @@ -0,0 +1,79 @@ +/*********************************************** + * TESTIOX - Test Library stdiox.h for py65mon * + ***********************************************/ + +//Specify System Header using -H option +#include +#include +#include +#include + +char i, j; +const char s = "STRING"; + +main: + +getcpr("PRESS A KEY TO BEGIN"); + +i = 0; + +putln("PRTDEC()"); +do { + putdec(i); + putc(':'); + i++; + if (!i&7) newlin(); + if (!i&127) anykey(); +} while (i); + +putln("PRTDEL()"); +do { + putdel(i); + putc(':'); + i++; + if (!i&7) newlin(); + if (!i&127) anykey(); +} while (i); + +putln("PRTDER()"); +do { + putder(i); + putc(':'); + i++; + if (!i&7) newlin(); + if (!i&127) anykey(); +} while (i); + +putln("PRTHEX()"); +do { + puthex(i); + putc(':'); + i++; + if (!i&7) newlin(); + if (!i&127) anykey(); +} while (i); + +putln("PRTWRD()"); +do { + j = i ^ $FF; + putwrd(*,i,j); + putc(':'); + i++; + if (!i&3) newlin(); + if (!i&63) anykey(); +} while (i); + +do { + if (!i&15) putln("%C %H .%R %L. %D%%"); + if (i<32) printf(i, " %h %r %l %d%%%n"); + else printf(i," %c %h %r %l %d%%%n"); + i++; if (!i&15) anykey(); +} while (i<128); + +putln("%W.. '%S'"); +setdst(&s); +printf("%w '%s'%n"); + +done: + goto exit; + diff --git a/test/testsd.c02 b/test/testsd.c02 new file mode 100644 index 0000000..42e4a69 --- /dev/null +++ b/test/testsd.c02 @@ -0,0 +1,82 @@ +/************************************************ + * TESTSD - Test Library stddef.h02 for py65mon * + ************************************************/ + + +//use -h option on command line +#include + +const char txtstr = { + "#TRUE=",", #FALSE=", + "SAVREG($A,$B,$C)", " TEMP0,1,2=", + "RESREG()", " A,X,Y=", + "SETSRC(&$1234)"," SRCLO,HI=", " GETSRC()=", + "SETDST(&$5678)"," DSTLO,HI=", " GETDST()=" + }; +char txtidx; + +char aa,xx,yy; + +main: + txtidx = 0; + newlin(); + + prttxt(); prbyte(#TRUE); + prttxt(); prbyte(#FALSE); + newlin(); newlin(); + + temp0=0; temp1=0; temp3 = 0; + prtlin(); savreg($A,$B,$C); + prttxt(); prbyte(temp0); + prtcma(); prbyte(temp1); + prtcma(); prbyte(temp2); + newlin(); + + setreg(0,0,0); + prtlin(); aa,yy,xx = resreg(); + prttxt(); prbyte(aa); + prtcma(); prbyte(yy); + prtcma(); prbyte(xx); + newlin(); newlin(); + + + srclo = 0; srchi = 0; + prtlin(); setsrc(&$1234); + prttxt(); prbyte(srclo); + prtcma(); prbyte(srchi); + newlin(); + prttxt(); setreg(0,0,0); + getsrc(); prtwrd(); + newlin(); newlin(); + + dstlo = 0; dsthi = 0; + prtlin(); setdst(&$5678); + prttxt(); prbyte(dstlo); + prtcma(); prbyte(dsthi); + newlin(); + prttxt(); setreg(0,0,0); + getdst(); prtwrd(); + newlin(); newlin(); + + +goto exit; + +void setreg(aa,yy,xx) {} + +void prtwrd(aa,yy,xx) { + prbyte(yy); + prbyte(xx); +} + +void prtcma() {prchr(',');} + +void prtlin() {prttxt(); newlin();} + +void prttxt() { + while (txtstr[txtidx]) { + //prbyte(txtidx);prchr(' '); + prchr(txtstr[txtidx]); + txtidx++; + } + txtidx++; +} diff --git a/test/testsl.c02 b/test/testsl.c02 new file mode 100644 index 0000000..5a64c42 --- /dev/null +++ b/test/testsl.c02 @@ -0,0 +1,220 @@ +/************************************************ + * TESTSL - Test Library stdlib.h02 for py65mon * + ************************************************/ + +//Specify System Header using -H option +#include +#include + +main: + +tstabs: //Test abs() +char onum, anum, cnum; + +prchr('A'); +prchr('B'); +prchr('S'); +prchr(' '); + +//test abs() positive numbers +onum = 0; +aploop: + anum = abs(onum); + if (onum <> anum) goto abserr; + onum++; + if (onum < $80) goto aploop; + +//test abs() negative numbers +anloop: + anum = abs(onum); + cnum = -onum; + if (anum <> cnum) goto abserr; + onum++; + if (onum > $00) goto anloop; + prchr('O'); + prchr('K'); + newlin(); + +tstmlt: //Test mult() +char mltplr, mltpnd, acmlsb, acmmsb, acmlst; +char prodct, ovrflw; + +mltplr = 1; +mrloop: + prbyte(mltplr); + mltpnd = 1; acmlst = 0; + acmlsb = 0; acmmsb = 0; + mdloop: + acmlsb = acmlsb + mltplr; + if (acmlsb acmlsb) goto merror; + //if (ovrflw <> acmmsb) goto merror; + mltpnd++; + if (mltpnd > 0) goto mdloop; + mltplr++; + if (mltplr > 0) goto mrloop; + newlin(); + prchr('M'); + prchr('U'); + prchr('L'); + prchr('T'); + prchr(' '); + prchr('O'); + prchr('K'); + newlin(); + +tstdiv: //Test div() +char maxmpd, divdnd, divisr, quotnt; + +mltplr = 255; +maxmpd = 1; +drloop: + prbyte(mltplr); + mltpnd = 1; + acmlsb = 0; + ddloop: + prbyte(mltpnd); + acmlsb = acmlsb + mltplr; + prodct = mult(mltplr, mltpnd); + quotnt = div(prodct, mltpnd); + if (quotnt <> mltplr) goto derror; + mltpnd++; + if (mltpnd < maxmpd) goto ddloop; + newlin(); + mltplr>>; + maxmpd<<; + if (mltplr <> 0) goto drloop; + newlin(); + prchr('D'); + prchr('I'); + prchr('V'); + prchr(' '); + prchr('O'); + prchr('K'); + newlin(); + + +tstrnd: //Test rand() and rands() +char countr, rndnum, rndtbl[255]; + +rands(1); //Seed Random Number Generator; + +countr = 0; + +riloop: + rndtbl[countr] = 0; + countr++; + if (countr <> 0) goto riloop; + +rnloop: + rndnum = rand(); + if (rndtbl[rndnum] > 0) goto rnderr; + rndtbl[rndnum] = $FF; + prbyte(rndnum); + prchr(' '); + countr++; + if (countr < 255) goto rnloop; + newlin(); + prchr('R'); + prchr('A'); + prchr('N'); + prchr('D'); + prchr(' '); + prchr('O'); + prchr('K'); + newlin(); + +tstc2a: //Test ctoa(); +char srcchr, dstchr, tststr[4]; + +srcchr = 0; +caloop: + prbyte(srcchr); + prchr(' '); + ctoa(srcchr, &tststr); + dstchr = atoc(&tststr); + if (srcchr <> dstchr) goto c2aerr; + srcchr++; + if (srcchr <> 0) goto caloop; + newlin(); + prchr('C'); + prchr('T'); + prchr('O'); + prchr('A'); + prchr(' '); + prchr('O'); + prchr('K'); + newlin(); + + +goto exit; + +abserr: + prchr('A'); + prchr('B'); + prchr('S'); + prchr('('); + prbyte(onum); + prchr(')'); + prchr('='); + prbyte(anum); + prchr(','); + prbyte(cnum); + newlin(); + goto exit; + +merror: + newlin(); + prbyte(mltplr); + prchr('*'); + prbyte(mltpnd); + prchr('='); + //prbyte(ovrflw); + prbyte(prodct); + prchr(','); + //prbyte(acmmsb); + prbyte(acmlsb); + newlin(); +goto exit; + +derror: + newlin(); + prbyte(divdnd); + prchr('/'); + prbyte(divisr); + prchr('='); + prbyte(quotnt); + prchr(','); + prbyte(mltplr); + newlin(); +goto exit; + +rnderr: + prchr('R'); + prchr('A'); + prchr('N'); + prchr('D'); + prchr('('); + prchr(')'); + prchr('='); + prbyte(rndnum); + prchr(','); + prbyte(countr); + newlin(); + goto exit; + +c2aerr: + prchr('C'); + prchr('T'); + prchr('O'); + prchr('A'); + prchr('('); + prbyte(srcchr); + prchr(')'); + prchr('='); + prbyte(dstchr); + newlin(); + goto exit; + diff --git a/test/v8k.bat b/test/v8k.bat new file mode 100644 index 0000000..38155d8 --- /dev/null +++ b/test/v8k.bat @@ -0,0 +1,18 @@ +@ECHO OFF +IF EXIST %1.c02 GOTO COMPILE + ECHO File %1.c02 not found + GOTO EOF + +:COMPILE +ECHO Compiling File %1.c02 for VIC 20 +8k +..\c02.exe -H vic8k %1 >%1.dbg +IF %ERRORLEVEL% NEQ 0 GOTO EOF +ECHO Assembling File %1.asm +C:\Programs\dasm %1.asm -f1 -o%1.prg -l%1.lst -s%1.sym + +IF %ERRORLEVEL% NEQ 0 GOTO EOF + +ECHO Starting Emulator +@start C:\Programs\WinVICE\xvic.exe -config xvic.ini %1.prg + +:EOF \ No newline at end of file diff --git a/test/xvic.ini b/test/xvic.ini new file mode 100644 index 0000000..9e616c1 --- /dev/null +++ b/test/xvic.ini @@ -0,0 +1,22 @@ +[VIC20] +Window0Xpos=523 +Window0Ypos=58 +Window0Width=618 +Window0Height=569 +FullscreenWidth=640 +FullscreenHeight=480 +ConfirmOnExit=0 +SoundDeviceName="dx" +SoundBufferSize=100 +VirtualDevices=1 +MachineVideoStandard=2 +RAMBlock1=1 +VICVideoCache=1 +VICFilter=0 +SidEngine=1 +SidModel=0 +DriveTrueEmulation=0 +ETHERNET_DISABLED=1 +ETHERNETCARTBase=38912 +Acia1Base=38912 + diff --git a/util/bin2asc.py b/util/bin2asc.py new file mode 100644 index 0000000..7072eb5 --- /dev/null +++ b/util/bin2asc.py @@ -0,0 +1,53 @@ +#Binary to ASCII +#Converts DASM -F1 file to Apple 1 Monitor format + +#DASM -F1 File two byte load address in LSB, MSB order +#followed by binary object coda + +#Apple 1 Monitor Format +#ADDR: BYTE BYTE BYTE... +#0300: 00 01 02 03 04 05 06 07 +#0308: 08 09 0A 0B 0C 0D 0E 0F + +import os +import sys + +def getArgs(): + argCount = len(sys.argv) + if argCount != 2: + print("Usage:", sys.argv[0], "objfile") + exit(2) + return sys.argv[1] + +def splitFileSpec(filePath): + fileDir, fileSpec = os.path.split(filePath) + fileName, fileExt = os.path.splitext(fileSpec) + if fileExt == '': fileExt = '.obj' + return fileDir, fileName, fileExt + +def readPrgFile(fileSpec): + with open(fileSpec, "rb") as prgFile: + prgAddr = prgFile.read(2) + prgData = prgFile.read() + address = prgAddr[0] + prgAddr[1] * 256 + return address, prgData + +def writeAscFile(dir, name, addr, data): + ascName = os.path.join(dir, name + ".asc") + line = ""; + with open(ascName, "w") as ascFile: + for i in range(len(data)): + if i & 7 == 0: + if len(line): ascFile.write(line + '\n') + line = "{:04X}:".format(addr + i) + line = line + " {:02X}".format(data[i]) + ascFile.write(line + '\n') + return ascName + +objFile = getArgs() +fileDir, fileName, fileExt = splitFileSpec(objFile) +inName = os.path.join(fileDir, fileName + fileExt) +print("Reading file", inName) +inAddr, inData = readPrgFile(inName) +outName = writeAscFile(fileDir, fileName, inAddr, inData) +print ("Wrote file", outName)