diff --git a/include/apple1.a02 b/include/apple1.a02 index cf431fa..51a9fff 100644 --- a/include/apple1.a02 +++ b/include/apple1.a02 @@ -16,11 +16,13 @@ RTNKEY EQU $0D ;Return/Enter Key (Carriage Return) .HEXH EQU $29 ; .YSAVE EQU $2A ;Y Register Storage .MODE EQU $2B ;Mode: Store, Examine, Block Examine -.BUFFER EQU $200 ;Input Buffer +.IN EQU $200 ;Input Buffer ;Standard Library Variables +SRCPTR EQU $30 ;Source String Pointer (stdio.a02) SRCLO EQU $30 ;Source String Pointer (stdio.a02) SRCHI EQU $31 +DSTPTR EQU $32 ;Destination String Pointer (string.a02) DSTLO EQU $32 ;Destination String Pointer (string.a02) DSTHI EQU $33 BFRLO EQU $34 ;Work Buffer Pointer @@ -48,6 +50,11 @@ STKSHI EQU $4D STKELO EQU $4E ;Stack End Address STKEHI EQU $4F +SYSBFP EQU $50 ;Position in System Buffer + +SYSBFL EQU 128 ;System Buffer Size (128 Bytes) +SYSBFR EQU .IN ;System Buffer (Input Buffer + ;PIA 6820 Registers .KBD EQU $D010 ;Keyboard Data .KBDCR EQU $D011 ;Keyboard Control Register @@ -100,3 +107,5 @@ NEWLIN: LDA #$0D ;Load C/R into Accumulator JMP PUTCHR ; and Print it INCLUDE "../include/putstr.a02" ;PUTSTR routine + + ENDSUBROUTINE diff --git a/include/apple1.h02 b/include/apple1.h02 index 7f3d82f..a99356f 100644 --- a/include/apple1.h02 +++ b/include/apple1.h02 @@ -4,6 +4,7 @@ #define DELKEY $5F //Delete/Backspace Key #define ESCKEY $1B //Escape/Stop Key #define RTNKEY $0D //Return/Enter Key +#define SYSBFL 128 //System Buffer Length /* Standard Library Variables */ char srclo,srchi; //Source String Pointer for Library Functions @@ -17,8 +18,9 @@ char blklen; //Block Segment Length char stkslo, stkshi; //Stack Start Address char stkelo, stkehi; //Stack End Address - +char random, rdseed; //Pseudo-Random Number Generator char temp0, temp1, temp2, temp3; //Temporary Variables +char sysbfr[], sysbfp; //System String Buffer and Position //Monitor Subroutines void echo(); //Print Character in Accumulator diff --git a/include/apple2.a02 b/include/apple2.a02 index 730880f..07d2b4e 100644 --- a/include/apple2.a02 +++ b/include/apple2.a02 @@ -8,29 +8,38 @@ ESCKEY EQU $1B ;Escape/Stop Key (Escape) RTNKEY EQU $0D ;Return/Enter Key (Return) ;Zero Page Variables (*=System Variable) -DSTLO EQU $06 ;Destination Pointer +DSTPTR EQU $06 ;Destination Pointer [Unused] +DSTLO EQU $06 DSTHI EQU $07 -BLKLO EQU $08 ;Block Segment Pointer (block.a02) +BLKLO EQU $08 ;Block Segment Pointer [Unused] BLKHI EQU $09 -STKLO EQU $1D ;Stack Pointer (stack.a02) -STKHI EQU $1E +SYSBFP EQU $1D ;Stack Pointer [Unused] +; $1E ;Unused +STKLO EQU $2E ;Stack Pointer [Tape Read Work Area] +STKHI EQU $2F RANDOM EQU $1F ;Random Number -INVFLG EQU $32 ;*Inverse Flag: $3F=Blinking, $7F=Inverse, $FF=Normal -SRCLO EQU $71 ;Source Pointer +.INVFLG EQU $32 ;*Inverse Flag: $3F=Blinking, $7F=Inverse, $FF=Normal +SRCPTR EQU $71 ;Source Pointer [Temporary Register] +SRCLO EQU $71 SRCHI EQU $72 RDSEED EQU $E3 ;Random Seed -BLKSLO EQU $EB ;Block Start Address -BLKSHI EQU $ED -BLKELO EQU $ED ;Block End Address +BLKSLO EQU $EB ;Block Start Address [Unused] +BLKSHI EQU $EC +BLKELO EQU $ED ;Block End Address [Unused] BLKEHI EQU $EE -BLKLEN EQU $EF ;Block Segment Length -BFRLO EQU $FA ;Work Buffer Pointer +BLKLEN EQU $EF ;Block Segment Length [Unused] +BFRLO EQU $FA ;Work Buffer Pointer [Unused] BFRHI EQU $FB -TEMP0 EQU $FC ;Temporary Storage +TEMP0 EQU $FC ;Temporary Variables [Unused] TEMP1 EQU $FD TEMP2 EQU $FE TEMP3 EQU $FF +;System Variables +SYSBFL EQU 255 ;System Buffer Size [88 Bytes] +SYSBFR EQU $0300 ;System Buffer [Keyboard Buffer] + + ;I/O Locations .KBD EQU $C000 ;Keyboard Data .AKD EQU $C010 ;Keyboard Strobe Register diff --git a/include/apple2.h02 b/include/apple2.h02 index b24ea54..902bd8d 100644 --- a/include/apple2.h02 +++ b/include/apple2.h02 @@ -4,6 +4,7 @@ #define DELKEY $08 //Delete/Backspace Key #define ESCKEY $1B //Escape/Stop Key #define RTNKEY $0D //Return/Enter Key +#define SYSBFL 255 //System Buffer Length /* Standard Library Pointers */ char srclo,srchi; //Source String Pointer for Library Functions @@ -20,6 +21,7 @@ char stkslo, stkshi; //Stack Start Address char stkelo, stkehi; //Stsck End Address char random, rdseed; //Pseudo-Random Number Generation char temp0, temp1, temp2, temp3; //Temporary Variables +char sysbfr[], sysbfp; //System String Buffer and Position /* Platform Specific Variables */ char invflg; //Video Invert Mask diff --git a/include/c64.a02 b/include/c64.a02 index d9954cf..f64e836 100644 --- a/include/c64.a02 +++ b/include/c64.a02 @@ -9,8 +9,10 @@ RTNKEY EQU $0D ;Return/Enter Key (RETURN) XMBANK EQU $0A ;Extended Memory Bank (Load/Verify Flag) XADRLO EQU $0B ;Ext Memory Address LSB (Text Index/Array Size) XADRHI EQU $0C ;Ext Memory Address MSB (Array Dimension Fkags) +SRCPTR EQU $22 ;Source Pointer [Temporary Pointers] SRCLO EQU $22 ;Source Pointer LSB [Temporary Pointers] SRCHI EQU $23 ;Source Pointer MSB [Temporary Pointers] +DSTPTR EQU $24 ;Destination Pointer [Temporary Pointers] DSTLO EQU $24 ;Destination Pointer LSB [Temporary Pointers] DSTHI EQU $25 ;Destination Pointer MSB [Temporary Pointers] BLKLO EQU $26 ;Block Pointer LSB [Floating Point Work Area] @@ -26,7 +28,9 @@ TEMP2 EQU $FD ;Temporary Variable [Unused Byte] TEMP3 EQU $FE ;Temporary Variable [Unused Byte] ;System Variables -USER3 EQU $0313 ;Free Byte for User Programs +SYSBFL EQU 88 ;System Buffer Size [88 Bytes] +SYSBFR EQU $0200 ;System Buffer [Keyboard Buffer] +SYSBFP EQU $0313 ;Position in System Buffer [Free Byte] BLKSLO EQU $0334 ;Block Start LSB [Unused Byte] BLKSHI EQU $0335 ;Block Start MSB [Unused Byte] diff --git a/include/c64.h02 b/include/c64.h02 index 505d719..7a57f94 100644 --- a/include/c64.h02 +++ b/include/c64.h02 @@ -4,6 +4,7 @@ #define DELKEY $14 //Delete/Backspace Key (DEL) #define ESCKEY $03 //Escape/Break Key (STOP) #define RTNKEY $0D //Return/Enter Key (RETURN) +#define SYSBFL 88 //System Buffer Length /* Standard Library Pointers */ char srclo,srchi; //Source String Pointer for Library Functions @@ -17,9 +18,10 @@ 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; //Stsck End Address -char random, rdseed; //Pseudo-Random Number Generation +char stkelo, stkehi; //Stack End Address +char random, rdseed; //Pseudo-Random Number Generator char temp0, temp1, temp2, temp3; //Temporary Storage +char sysbfr[], sysbfp; //System String Buffer and Position /* System Subroutines */ void delchr(); //Delete previous character diff --git a/include/run6502.a02 b/include/run6502.a02 index 018ba25..56864f2 100644 --- a/include/run6502.a02 +++ b/include/run6502.a02 @@ -40,11 +40,17 @@ STKSHI EQU $4D STKELO EQU $4E ;Stack End Address STKEHI EQU $4F +SYSBFP EQU $50 ;Position in System Buffer + +SYSBFL EQU 128 ;System Buffer Size (Max String Size) +SYSBFR EQU $0200 ;System Buffer + + ;Memory Mapped I/O _KBHIT EQU $FFF0 ;Is a Key Pressed _GETCH EQU $FFF1 ;Read Keyboard (Blocking) - ORG $0200 ;START at RAM midpoint + ORG $0400 ;START at RAM midpoint START: JMP MAIN ;Execute Program @@ -80,5 +86,7 @@ PUTCHR EQU $FFE3 ;Emulator CHROUT Routine EXIT EQU $FFEC ;Emulator SHUTDN Routine +FSCMD EQU $FFE6 ;run6502 File System Command Routine + INCLUDE "../include/prbyte.a02" ;PRBYTE and PRHEX routines INCLUDE "../include/putstr.a02" ;PUTSTR routine diff --git a/include/run6502.h02 b/include/run6502.h02 index 59deaf6..295235b 100644 --- a/include/run6502.h02 +++ b/include/run6502.h02 @@ -4,6 +4,7 @@ #define DELKEY $08 //Delete/Backspace Key #define ESCKEY $18 //Escape/Stop Key #define RTNKEY $0D //Return/Enter Key +#define SYSBFL 128 //System Buffer Length //Library Pointer Variables zeropage int srcptr, dstptr, bfrptr, blkptr; @@ -12,7 +13,6 @@ char dstlo,dsthi; //Destination String Pointer for Library Functions char bfrlo,bfrhi; //Buffer Pointer for Library Functions char blklo,blkhi; //Block Segment Pointer char stklo,stkhi; //Stack Pointer - //Library Variables char blkslo, blkshi; //Block Start Address char blkelo, blkehi; //Block End Address @@ -21,6 +21,7 @@ char stkslo, stkshi; //Stack Start Address char stkelo, stkehi; //Stsck End Address char random, rdseed; //Pseudo-Random Number Generation char temp0, temp1, temp2, temp3; //Temporary Storage +char sysbfr[], sysbfp; //System String Buffer and Position //Memory Mapped I/O char putcon; //Write Character to Console diff --git a/include/stddef.a02 b/include/stddef.a02 index 592c28b..7a7fc87 100644 --- a/include/stddef.a02 +++ b/include/stddef.a02 @@ -1,20 +1,21 @@ ;c02 library stddef.h02 assembly language subroutines -;Requires External Zero Page Variables -;DSTLO, DSTHI, SRCLO, SRCHI -;External Variables -;TEMP0, TEMP1, TEMP2 +;Requires External Zero Page Variables DSTPTR, SRCPTR +;and External Variables TEMP0, TEMP1, TEMP2 (system header) + + SUBROUTINE STDDEF ;Constant Definitions +STRSIZ EQU 128 ;Maximum String Size TRUE EQU $FF ;Returned for Success or Failure FALSE EQU $00 ;by some Library Routines ;savdst() - Save Destination Pointer SAVDST: JSR GETDST ;Load Destination Pointer - JMP SAVRXY ;Save X & Y Registers + BVC SAVRXY ;Save X & Y Registers ;savsrc() - Save Source Pointer SAVSRC: JSR GETSRC ;Load Destination Pointer - JMP SAVRXY ;Save X & Y Registers + BVC SAVRXY ;Save X & Y Registers ;Save Registers SAVREG: STA TEMP0 ;Save Accumulater @@ -23,44 +24,60 @@ SAVRXY: STX TEMP1 ;Save X Index RTS ;Restore Registers -RESREG: LDA TEMP0 ;Load Accumlator -RESRXY: LDX TEMP1 ;Load X Index - LDY TEMP2 ;Load Y Index +RESREG: LDA TEMP0 ;Load Accumulator +RESRXY: LDX TEMP1 ;Load X Index + LDY TEMP2 ;Load Y Index RTS +;Set Destination Pointer to System Buffer +SETDSB: JSR GETBFR ;Get Buffer Address + BVC SETDST + ;Set Destination Pointer to Source Pointer -SETDSS: JSR GETSRC ;Get Destination Pointer - JMP SETDST ;Store in Source Pointer +SETDSS: JSR GETSRC ;Get Destination Pointer + BVC SETDST ;Store in Source Pointer ;Restore Destination Pointer -RESDST: JSR RESRXY ;Load Address and Drop into SETDST +RESDST: JSR RESRXY ;Load Address and Drop into SETDST ;Initialize Destination Pointer -SETDST: STX DSTLO ;Store Destination Pointer - STY DSTHI +SETDST: STX DSTPTR ;Store Destination Pointer + STY DSTPTR+1 RTS ;Restore Source Pointer -RESSRC: JSR RESRXY ;Load Saved Address - JMP SETSRC ;Set Source Pointer +RESSRC: JSR RESRXY ;Load Saved Address + BVC SETSRC ;Set Source Pointer + +;Set Source Pointer to System Buffer +SETSRB: JSR GETBFR ;Get Buffer Address + BVC SETSRC ;Set Source Pointer to Destination Pointer -SETSRD: JSR GETDST ;Get Destination Point and fall into SETSRC +SETSRD: JSR GETDST ;Get Destination Point and fall into SETSRC ;Initialize Source Pointer and Index -SETSRC: STX SRCLO ;Store Source Pointer - STY SRCHI - LDY #$00 ;Initialize Index Into String +SETSRC: STX SRCPTR ;Store Source Pointer + STY SRCPTR+1 + LDY #$00 ;Initialize Index Into String + RTS + +;Retrieve System Buffer Address +GETBFR: LDX #SYSBFR + CLV ;Clear Overflow Flag for BVC RTS ;Retrieve Source String Pointer -GETDST: LDX DSTLO - LDY DSTHI +GETDST: LDX DSTPTR + LDY DSTPTR+1 + CLV ;Clear Overflow Flag for BVC RTS ;Retrieve Source String Pointer -GETSRC: LDX SRCLO - LDY SRCHI +GETSRC: LDX SRCPTR + LDY SRCPTR+1 + CLV ;Clear Overflow Flag for BVC RTS ;Add TEMP1,TEMP2 to X,Y @@ -85,16 +102,20 @@ SUBTXY: TXA ;Decrement X,Y Register Pair DECRXY: CPY #0 - BNE DECRXZ + BNE .SKIP DEY -DECRXZ: DEX +.SKIP DEX RTS ;Increment X,Y Register Pair INCRXY: INX - BNE INCRXZ + BNE .RETURN INY -INCRXZ: RTS +.RETURN RTS + +;Set Source Pointer to Buffer Location and Add Accumulator +SETDBA: LDA SYSBFP ;Get Buffer Position + JSR SETDSB ;Set Destination to Buffer Address ;Add Accumulator to Destination Address ADDDSA: TAX ;Move Accumulator to Argument LSB @@ -103,9 +124,14 @@ ADDDSA: TAX ;Move Accumulator to Argument LSB ;Add to Destination Address ;Args: Y,X = MSB,LSB of Integer to Add ;Affects: A,Y,X -ADDDST: LDA #DSTLO ;Set Index to Destination Pointer +ADDDST: LDA #DSTPTR ;Set Index to Destination Pointer BNE ADDZPW ;and Execute ADDZPW +;Set Source Pointer to System Buffer Position +SETSBP: LDA SYSBFP ;Load Position in Buffer + BMI .RETURN ;If Greater than 127, Return + JSR SETSRB ;Set Source Pointer to Buffer Address + ;Add Accumulator to Source Address ADDSRA: TAX ;Move Accumulator to Argument LSB LDY #0 ;Clear Argument MSB @@ -113,7 +139,7 @@ ADDSRA: TAX ;Move Accumulator to Argument LSB ;Add to Source Address ;Args: Y,X = MSB,LSB of Integer to Add ;Affects: A,Y,X -ADDSRC: LDA #SRCLO ;Set Index and Drop into ADDZPW +ADDSRC: LDA #SRCPTR ;Set Index and Drop into ADDZPW ;Add to Zero Page Word ;Args: A = Address of Zero Page Word @@ -130,3 +156,4 @@ ADDZPW: STA TEMP3 ;Save Zero Page Address STA 1,X ;and Save Result RTS + ENDSUBROUTINE diff --git a/include/string.a02 b/include/string.a02 index fea1822..5c45342 100644 --- a/include/string.a02 +++ b/include/string.a02 @@ -47,7 +47,7 @@ STRCMR: RTS ; ; A = $FF, C=0 if not found ; Y = Position of last character scanned STRCHR: JSR SETSRC ;Initialize Source String -STRCHA: STA TEMP3; ;Save Search Character (alternate entry point) +STRCHA: STA TEMP3 ;Save Search Character (alternate entry point) STRCHL: LDA (SRCLO),Y ;Get Next Character BEQ STRCLC ;If NUL, Return $FF and Carry Clear CMP TEMP3 ;Compare Character @@ -83,6 +83,11 @@ STRLEX: TYA ;Transfer Index to Accumulator ;Affects: N,Z STRDST EQU SETDST ;Aliased to System Header function +;strcpb(&s) - Copy String to System Buffer +STRCPB: JSR SETSRC ;Set Source Pointer to String Address + JSR SETDSB ;Set Destination Pointer to System Buffer + BVC STRCPA ;Execute String Copy + ;strcat(&s) Concatenate String (to Destination String) ;Requires: DSTLO, DSTHI - Pointer to destination string ;Args: X,Y = Pointer to source string diff --git a/include/string.h02 b/include/string.h02 index 167f305..38dff22 100644 --- a/include/string.h02 +++ b/include/string.h02 @@ -2,7 +2,7 @@ * string - String Handling Routines for C02 * *********************************************/ -/* Find Charaacter in String * +/* Find Character in String * * Args: c - Character to find * * &s - String to search * * Returns: c in s * diff --git a/include/stringx.a02 b/include/stringx.a02 index e58d016..9cc14c1 100644 --- a/include/stringx.a02 +++ b/include/stringx.a02 @@ -1,6 +1,8 @@ ; C02 library stringx.h02 assembly language subroutines ; Requires the subroutines and definitions from string.asm + SUBROUTINE STRINGX + ;Common Code - Initialize Variables STRXSI: JSR SETSRC ;Initialize Source String STY TEMP1 ;Save Destination Pointer @@ -73,3 +75,56 @@ STRSPL: JSR STRXSL ;and Search for Character in Source String BPL STRSPL ; and Loop if < 128 BMI STRXSP ;Else Return Position +;strtok(c, &s) - Split String by Specified Character +;Args: A = Delimiter, 0 = Set String to Tokenize +; X,Y = Address of Argument String +;Sets: DSTPTR = Address of Argument String +; or Address of System Buffer (A=0) +; SRCPTR = Address of System Buffer Location +; or Address of Argument String (A=0) +; TEMP0 = Delimiter Character +;Populates: SYSBFR - String to Tokenize +;Returns: A = Length of Token +; Y = New Buffer Position, $FF = End of String +; X = End of String Flag, $00 or $FF +STRTOK: ORA #0 + BNE .STRTOK ;If Delimiter is NUL + STA SYSBFP ; Initialize System Buffer Position + JMP STRCPB ; Copy String to System Buffer and Return +.STRTOK STA TEMP0 ;Save Delimiter Character + JSR SETDST ;Set Destination to String Address + JSR SETSBP ;Set Source to Current Buffer Position + BPL .STCOPY ;If at End of Buffer + LDA #0 + TAY ;Set Destination String to "" + STA (DSTPTR),Y ;and Return String Length 0 + RTS +.STCOPY LDY #0 ;Initialize Index + LDX #0 ;Clear End of String Flag +.STLOOP LDA (SRCPTR),Y ;Get Character from Source String + BNE .STSKIP ;If End of String + DEX ; Set End of Buffer Flag + BMI .STDONE ; and Finish Up +.STSKIP CMP TEMP0 ; + BEQ .STDONE ;If Not Delimiter Character + STA (DSTPTR),Y ; Copy to Destination String + INY ; Increment Index + CPY #SYSBFL ; If Less Than Buffer Size + BCC .STLOOP ; Loop + DEX ;Else Set End of Buffer Flag +.STDONE LDA #0 ;Terminate String + STA (DSTLO),Y ; +.STRTN STY TEMP0 ;Save String Length + INY ;Increment Past Delimiter + TYA ; and Add to Buffer Position + CLC + ADC SYSBFP + STA SYSBFP ;Save New Buffer Position + CPX #0 ;If End of Buffer Flag is Set + BPL .STRTRN + STX SYSBFP ; Set Buffer Position to 255 +.STRTRN LDA TEMP0 ;Return String Length + RTS + + + ENDSUBROUTINE diff --git a/include/stringx.h02 b/include/stringx.h02 index 54a5dcb..a06f10a 100644 --- a/include/stringx.h02 +++ b/include/stringx.h02 @@ -4,24 +4,23 @@ /* Find Span of Characters not matching String * * Args: &s - String of characters to match * - * Uses: String to parse specified by strdst() * + * Uses: String to parse specified by setdst() * * Sets: temp1 - Result * * Returns: Number of consecutive characters in * * Destination that are not in Source */ char strbrk(); char strcsp(); //Alias -/* Find Span of Characters matching String * - * Args: &s - String of characters to match * - * Uses: String to parse specified by strdst() * - * Sets: temp1 - Result * - * Returns: Number of consecutive characters in * - * Destination that are also in Source */ +/* Find Span of Characters matching String * + * Setup: setdst(s) - String to Search * + * Args: int &m - String to match * + * Returns: Number of consecutive characters * + * in m that are also in s */ char strspn(); /* Find First Character matching String * * Args: &s - String of characters to match * - * Uses: String to parse specified by strdst() * + * Uses: String to parse specified by setdst() * * Sets: temp1 - Result * * Returns: Position of first character in * * Destination that is also in Source * diff --git a/include/vic.a02 b/include/vic.a02 index ca60c9e..74d2933 100644 --- a/include/vic.a02 +++ b/include/vic.a02 @@ -6,8 +6,10 @@ ESCKEY EQU $03 ;Escape/Stop Key (RUN/STOP) RTNKEY EQU $0D ;Return/Enter Key (RETURN) ;Zero Page Locations +SRCPTR EQU $22 ;Source Pointer LSB [Temporary Pointers] SRCLO EQU $22 ;Source Pointer LSB [Temporary Pointers] SRCHI EQU $23 ;Source Pointer MSB [Temporary Pointers] +DSTPTR EQU $24 ;Destination Pointer LSB [Temporary Pointers] DSTLO EQU $24 ;Destination Pointer LSB [Temporary Pointers] DSTHI EQU $25 ;Destination Pointer MSB [Temporary Pointers] BLKLO EQU $26 ;Block Pointer LSB [Floating Point Work Area] @@ -23,10 +25,12 @@ TEMP2 EQU $FD ;Temporary Variable [Unused Byte] TEMP3 EQU $FE ;Temporary Variable [Unused Byte] ;System Variables +SYSBFL EQU 88 ;System Buffer Size [88 Bytes] +SYSBFR EQU $0200 ;System Buffer [Keyboard Buffer] USER0 EQU $0310 ;Free Byte for User Programs USER1 EQU $0311 ;Free Byte for User Programs USER2 EQU $0312 ;Free Byte for User Programs -USER3 EQU $0313 ;Free Byte for User Programs +SYSBFP EQU $0313 ;Position in System Buffer [Free Byte] BLKSLO EQU $0334 ;Block Start LSB [Unused Byte] BLKSHI EQU $0335 ;Block Start MSB [Unused Byte] diff --git a/include/vic/float.a02 b/include/vic/float.a02 new file mode 100644 index 0000000..1956551 --- /dev/null +++ b/include/vic/float.a02 @@ -0,0 +1,60 @@ +;VIC20 BASIC Floating Point Functions + +;pival - PI Expressed as a Five-Byte Floating Point Number +PIVAL EQU $CEA8 + +maxint EQU $D1A5 ;The Constant -32768 in Five-Byte Floating Point Format +ayint EQU $D1AA ;Convert Floating Point to Signed Integer in A and Y +intidx EQU $D1B2 ;Convert Floating Point Subscript to a Positive Integer +fpint EQU $D1BF ;Convert Floating Point Number to Signed Integer + +makfp EQU $D391 ;Convert 16-Bit Signed Integer to Floating Pointers +fpadr EQU $D7F7 ;Convert Floating Point to Unsigned Two-Byte Integer + +fpsubm EQU $D850 ;Subtract FAC1 from a Number in Memory +fpsub EQU $D853 ;Subtract FAC2 from FAC1 +fpaddm EQU $D867 ;Add FAC1 to a Number in Memory +fpaddh EQU $D86A ;Add FAC1 to FAC2 + +normlz EQU $D8FE ;Normalize Floating Point Accumulator #1 +comfac EQU $D947 ;Replace FAC1 with Its 2's Complement + +denorm EQU $D983 ;Denormalize Exponents of FAC1 and FAC2 +fpcone EQU $D9BC ;Floating Point Constant with a Value of 1 + +dolog EQU $D9EA ;Perform LOG +fpmult EQU $DA28 ;Multiply FAC1 with FAC2 +fpmltb EQU $DA59 ;Multiply Byte Subroutine +lodarg EQU $DA8C ;Move Floating Point Number from Memory into FAC2 + +multen EQU $DAE2 ;Multiply FAC1 by 10 +fpcten EQU $BAF9 ;The Constant 10 in Five-Byte Floating Format +divten EQU $DAFE ;Divide FAC1 by 10 +fpdivm EQU $DB0F ;Divide a Number in Memory by FAC1 +fpdivm EQU $DB12 ;Divide FAC2 by FAC1 +lodfac EQU $DBA2 ;Move Floating Point Number from Memory to FAC1 + +strfac EQU $DBD4 ;Move Floating Point Number from FAC1 to Memory +argfac EQU $DBFC ;Move Floating Point Number from FAC2 to FAC1 +rndmov EQU $DC0C ;Round and Move Floating Point Number from FAC1 to FAC2 +facarg EQU $DC0F ;Move Floating Point Number from FAC1 to FAC2 +round EQU $DC1B ;Round FAC1 by Adjusting Rounding Byte +sgnfac EQU $DC2B ;Put Sign of FAC1 into A Register +dosgn EQU $DC39 ;Perform SGN +bytfp EQU $DC3C ;Convert Signed Byte in A Register to Floating Point +doabs EQU $DC58 ;Perform ABS +cmpfac EQU $DC5B ;Compare FAC1 to Memory +fpint EQU $DC9B ;Convert FAC1 to 32-bit Signed Integer in $62-$65 +doint EQU $DCCC ;Perform INT + +ascfp EQU $DCF3 ;Convert ASCII String to Floating Point Number +addbyt EQU $DD7E ;Add Signed Byte in A Register to FAC1 +fpasc EQU $DDDD ;Convert Contents of FAC1 to ASCII String +dosqr EQU $DF71 ;Perform SQR +expont EQU $DF7B ;Perform ^ +negfac EQU $DFB4 ;Perform - (Unary Minus) +doexp EQU $DFED ;Perform EXP +dorrnd EQU $E094 ;Perform RND +docos EQU $E261 ;Perform COS +dosin EQU $E268 ;Perform SIN +dotan EQU $E2B1 ;Perform TAN diff --git a/include/vic/sounds.a02 b/include/vic/sounds.a02 new file mode 100644 index 0000000..609f579 --- /dev/null +++ b/include/vic/sounds.a02 @@ -0,0 +1,41 @@ +; C02 sounds library assembly routines for VIC-20 + +;beep() - Produce System Beep Sound +;Affects: A,Y +BEEP NOP ;Sound Bell + + ;Uses VIA Timer 2... +BEEPD: JSR $EF96 ;Delay YX Milliseconds + DEX + BPL BEEPD + DEY + BPL BEEPD + RTS + +BEEPX: LDX #3 ;Turn off all Sound +BEEPXL: LDA #0 ;Store 0 in all four + STA $900A,X ; VIC Sound Registers + DEX + BPL BEEPXL + RTS + +;bomb() - Produce System Explosion Sound +;Affects: None +BOMB: RTS ;Function Not Available + +;shoot() - Produce Shooting Sound +;Affects: None +SHOT: RTS ;Function Not Available + +;tick() - Produce System Tick Sound +;Affects: None +TICK: LDA $C030 ;Click Speaker Once + RTS + +;tock() - Produce System Tock Sound +;Affects: None +TOCK: RTS ;Function Not Available + +;zap() - Produce System Zap Sound +;Affects: None +ZAP: RTS ;Function Not Available diff --git a/include/vic/template.h02 b/include/vic/template.h02 new file mode 100644 index 0000000..e72c439 --- /dev/null +++ b/include/vic/template.h02 @@ -0,0 +1,42 @@ +/********************************************************* + * vector - 6502 Interrupt Vector Manipulation Functions * + *********************************************************/ + +/* Get Maskable Interrupt Address * + * Returns: $00 If Address can be * + * modified, otherwise $FF * + * Address MSB * + * Address LSB */ +char getirq(); + +/* Get Non-Maskable Interrupt Address * + * Returns: $00 If Address can be * + * modified, otherwise $FF * + * Address MSB * + * Address LSB */ +char getnmi(); + +/* Get "Reset" Interrupt Address * + * Returns: $00 If Address can be * + * modified, otherwise $FF * + * Address MSB * + * Address LSB */ +char getrst(); + +/* Set Maskable Interrupt Address */ + * Args: &d - New Interrupt Address * + * Returns: $00 If Successful, * + * otherwise $FF */ +char setirq(); + +/* Set Non-Maskable Interrupt Address */ + * Args: &d - New Interrupt Address * + * Returns: $00 If Successful, * + * otherwise $FF */ +char setnmi(); + +/* Set "Reset" Interrupt Address */ + * Args: &d - New Interrupt Address * + * Returns: $00 If Successful, * + * otherwise $FF */ +char setrst(); diff --git a/include/vic/vectors.a02 b/include/vic/vectors.a02 new file mode 100644 index 0000000..967f17d --- /dev/null +++ b/include/vic/vectors.a02 @@ -0,0 +1,82 @@ +; C02 Interrupt Vector Assembly Language Routines for VIC-20 + +;getirq() - Return IRQ Interrupt Handler Address +;Returns: A = $00 - Software Definable Address +; Y = Address MSB +; X = Address LSB +GETIRQ: LDA #$00 ;Return software definable + LDX $0314 ;and Address in CINV + LDY $0315 + RTS + +;getbrk() - Return BRK Interrupt Handler Address +;Returns: A = $00 - Software Definable Address +; Y = Address MSB +; X = Address LSB +GETBRK: LDA #$00 ;Return software definable + LDX $0316 ;and Address in CBINV + LDY $0317 + RTS + +;getnmi() - Return NMI Interrupt Handler Address +;Returns: A = $00 - Software Definable Address +; Y = Address MSB +; X = Address LSB +GETNMI: LDA #$00 ;Return software definable + LDX $0318 ;and Address in CBINV + LDY $0319 + RTS + +;getrst() - Return RESET Interrupt Handler Address +;Returns: A = $7F - Firmware Defined Address +; Y = Address MSB +; X = Address LSB +GETRST: LDX $FFFC ;Load 6502 Interrupt Vector + LDY $FFFD ;and Fall into SETRST + +;setrst() - Set RESET Interrupt Handler Address +;Args: Y = Address MSB +; X = Address LSB +;Returns: A = $7F - Failure - Can't be Changed +SETRST: LDA #$7F ;Return "Hard Coded" + RTS + +;setirq() - Set IRQ Interrupt Handler Address +;Args: Y = Address MSB +; X = Address LSB +;Returns: A = $00 - Successfully Set +SETIRQ: SEI ;Disable Interrupts + STX $0314 ;Store Address in CINV + STY $0315 + CLI ;Enable Interrupts + LDA #$00 ;Return "Modified" + RTS + +;setrst() - Set BRK Interrupt Handler Address +;Args: Y = Address MSB +; X = Address LSB +;Returns: A = $00 - Successfully Set +SETBRK: SEI ;Disable Interrupts + STX $0316 ;Store Address in CBINV + STY $0317 + CLI ;Enable Interrupts + LDA #$00 Return "Modified" + RTS + +;setnmi() - Set NMI Interrupt Handler Address +;Args: Y = Address MSB +; X = Address LSB +;Returns: A = $00 - Successfully Set +SETNMI: STX $0318 ;Store Address in NMINV + STY $0319 + LDA #$00 ;Return "Modified" + RTS + +;xitirq - Exit from IRQ Interrupt +;Exit IRQ if not Executing System IRQ Routine +XITIRQ: PLA ;Restore Y Register + TAY + PLA ;Restore Y Register + TAX + PLA ;Restore Accumulator + RTI ;Return from Interrupt diff --git a/include/vic/vectors.h02 b/include/vic/vectors.h02 new file mode 100644 index 0000000..1a82785 --- /dev/null +++ b/include/vic/vectors.h02 @@ -0,0 +1,75 @@ +/********************************************************* + * vector - 6502 Interrupt Vector Manipulation Functions * + *********************************************************/ + +/* Get BRK Handler Address * + * Returns: Status * + * $00 = modifiable * + * $7F = hard coded * + * $FF = unavailable * + * Address MSB * + * Address LSB */ +char getbrk(); + +/* Get IRQ Handler Address * + * Returns: Status * + * $00 = modifiable * + * $7F = hard coded * + * $FF = unavailable * + * Address MSB * + * Address LSB */ +char getirq(); + +/* Get NMI Handler Address * + * Returns: Status * + * $00 = modifiable * + * $7F = hard coded * + * $FF = unavailable * + * Address MSB * + * Address LSB */ +char getnmi(); + +/* Get RESET Handler Address * + * Returns: Status * + * $00 = modifiable * + * $7F = hard coded * + * $FF = unavailable * + * Address MSB * + * Address LSB */ +char getrst(); + +/* Set BRK Handler Address */ + * Args: &d - New Address * + * Returns: Result * + * $00 = modifiable * + * $7F = hard coded * + * $FF = unavailable * +char setbrk(); + +/* Set IRQ Handler Address */ + * Args: &d - New Address * + * Returns: Result * + * $00 = modifiable * + * $7F = hard coded * + * $FF = unavailable * +char setirq(); + +/* Set NMI Handler Address */ + * Args: &d - New Address * + * Returns: Result * + * $00 = modifiable * + * $7F = hard coded * + * $FF = unavailable * +char setnmi(); + +/* Set RESET Handler Address */ + * Args: &d - New Address * + * Returns: Result * + * $00 = modifiable * + * $7F = hard coded * + * $FF = unavailable * +char setrst(); + +/* Exit from IRQ Interrupt */ +xitirq: + diff --git a/include/vic20.h02 b/include/vic20.h02 index 88bc6be..06d6bda 100644 --- a/include/vic20.h02 +++ b/include/vic20.h02 @@ -4,6 +4,7 @@ #define DELKEY $14 //Delete/Backspace Key (DEL) #define ESCKEY $03 //Escape/Break Key (STOP) #define RTNKEY $0D //Return/Enter Key (RETURN) +#define SYSBFL 88 //System Buffer Length /* Standard Library Pointers */ char srclo,srchi; //Source String Pointer for Library Functions @@ -20,6 +21,7 @@ char stkslo, stkshi; //Stack Start Address char stkelo, stkehi; //Stsck End Address char random, rdseed; //Pseudo-Random Number Generation char temp0, temp1, temp2, temp3; //Temporary Storage +char sysbfr[], sysbfp; //System String Buffer and Position /* System Subroutines */ void delchr(); //Delete previous character diff --git a/include/vic3k.h02 b/include/vic3k.h02 index 5bf5e9a..d53a733 100644 --- a/include/vic3k.h02 +++ b/include/vic3k.h02 @@ -6,6 +6,7 @@ #define DELKEY $14 //Delete/Backspace Key (DEL) #define ESCKEY $03 //Escape/Stop Key (STOP) #define RTNKEY $0D //Return/Enter Key (RETURN) +#define SYSBFL 88 //System Buffer Length //Library Pointer Variables char srclo,srchi; //Source String Pointer for Library Functions @@ -21,6 +22,7 @@ char stkslo, stkshi; //Stack Start Address char stkelo, stkehi; //Stsck End Address char random, rdseed; //Pseudo-Random Number Generation char temp0, temp1, temp2, temp3; //Temporary Storage +char sysbfr[], sysbfp; //System String Buffer and Position //System Subroutines char polkey(); //Poll Console for character diff --git a/include/vic8k.h02 b/include/vic8k.h02 index 6dc6f0a..3edd3b8 100644 --- a/include/vic8k.h02 +++ b/include/vic8k.h02 @@ -6,6 +6,7 @@ #define DELKEY $14 //Delete/Backspace Key (DEL) #define ESCKEY $03 //Escape/Stop Key (STOP) #define RTNKEY $0D //Return/Enter Key (RETURN) +#define SYSBFL 88 //System Buffer Length //Library Pointer Variables char srclo,srchi; //Source String Pointer for Library Functions @@ -21,6 +22,7 @@ char stkslo, stkshi; //Stack Start Address char stkelo, stkehi; //Stsck End Address char random, rdseed; //Pseudo-Random Number Generation char temp0, temp1, temp2, temp3; //Temporary Storage +char sysbfr[], sysbfp; //System String Buffer and Position //System Subroutines char polkey(); //Poll Console for character diff --git a/include/x16.a02 b/include/x16.a02 index ffa3c82..f0845d2 100644 --- a/include/x16.a02 +++ b/include/x16.a02 @@ -6,9 +6,9 @@ DELKEY EQU $14 ;Delete/Backspace Key (Delete) ESCKEY EQU $03 ;Escape/Stop Key (RUN/STOP) RTNKEY EQU $0D ;Return/Enter Key (RETURN) -;Zero Page System Variables - x16emu Release 34 Memory Map -;UNUSED $00-$01 ;Available to User -; $02-$52 ;Used by Basic graphics commands +; $00-$01 ;Miscellaneous Pointer +; $02-$21 ;ABI Registers +; $22-$52 ;Used by Basic graphics commands XMBANK EQU $53 ;Extended Memory Bank XADRLO EQU $54 ;Ext Memory Address LSB XADRHI EQU $55 ;Ext Memory Address MSB @@ -30,12 +30,16 @@ TEMP0 EQU $64 ;Temporary Variable TEMP1 EQU $65 ;Temporary Variable TEMP2 EQU $66 ;Temporary Variable TEMP3 EQU $67 ;Temporary Variable -; $68-7F ;Available to User +SYSBFP EQU $68 ;Position in System Buffer [Free Byte] +; $69-7F ;Available to User ; $80-$83 ;Used by Kernal and DOS ; $A4-$A8 ;Reserved for KERNAL/DOS/BASIC ; $A9-$FF ;Used by BASIC - -;Other Variables - Top of Extended System RAM Area + +;Other Constants +SYSBFL EQU 128 ;System Buffer Length +;Other Variables - User Storage Area +SYSBFR EQU $0700 ;System Buffer BLKSLO EQU $07F4 ;Block Start LSB BLKSHI EQU $07F5 ;Block Start MSB BLKELO EQU $07F6 ;Block End LSB @@ -92,5 +96,5 @@ DELCHR: LDA #DELKEY ;Load Delete Character NEWLIN: LDA #RTNKEY ;Load Return Character JMP PUTCHR ;Print and Return - INCLUDE "../include/prbyte.a02" ;PRBYTE and PRHEX routine - INCLUDE "../include/putstr.a02" ;PUTSTR routine + INCLUDE "prbyte.a02" ;PRBYTE and PRHEX routine + INCLUDE "putstr.a02" ;PUTSTR routine diff --git a/include/x16.h02 b/include/x16.h02 index b174c11..7c02946 100644 --- a/include/x16.h02 +++ b/include/x16.h02 @@ -1,17 +1,18 @@ /* C02 System Header file for Commander X16 */ /* Platform Specific Settings */ -#pragma zeropage $68 //Unused Zero Page - $68-$7F +#pragma zeropage $69 //Unused Zero Page - $69-$7F /* Platform Specific Constants */ #define DELKEY $14 //Delete/Backspace Key (DEL) #define ESCKEY $03 //Escape/Break Key (STOP) #define RTNKEY $0D //Return/Enter Key (RETURN) +#define SYSBFL 128 //System Buffer Length /* Standard Library Pointers */ zeropage char srclo,srchi; //Source Pointer for Library Functions zeropage char dstlo,dsthi; //String Pointer for Library Functions -zeropage int srcptr,dstptr; //Source, Destination Pointers +zeropage int srcptr,dstptr; //Source, Destination Pointers zeropage char bfrlo,bfrhi; //Buffer Pointer for Library Functions zeropage char blklo,blkhi; //Block Segment Pointer zeropage char stklo,stkhi; //Stack Pointer @@ -24,22 +25,22 @@ char blklen; //Block Segment Length char stkslo,stkshi; //Stack Start Address char stkelo,stkehi; //Stsck End Address char random,rdseed; //Pseudo-Random Number Generation -char temp0,temp1,temp2,temp3; //Temporary Storage char xmbank; //Physical Bank +char temp0,temp1,temp2,temp3; //Temporary Storage +char sysbfr[], sysbfp; //System String Buffer and Position /* System Subroutines */ void delchr(); //Delete previous character char getkey(); //Read ASCII character from Keyboard -char getpos(); //Get Cursor Position -char getsiz(); //Get Screen Size void newlin(); //Advance cursor to beginning of next line char polkey(); //Poll Keyboard for character -char putchr(); //Print ASCII character to Keyboard +char putchr(); //Print ASCII character to Screen void prbyte(); //Print Accumulator as Hexadadecimal number void prhex(); //Print Low Nybble of Accumulator as Hex Digit char getchr(); //Wait for character from Keyboard -void setpos(); //Set Cursor Position +void putstr(); //Print String to Screen //System Labels start: //Start of Code exit: //Return to Operating System +