diff --git a/include/appl2std.a02 b/include/appl2std.a02 index c4b40bf..eeacc7a 100644 --- a/include/appl2std.a02 +++ b/include/appl2std.a02 @@ -6,24 +6,20 @@ ESCKEY EQU $1B ;Escape/Stop Key (Escape) RTNKEY EQU $0D ;Return/Enter Key (Return) ;Zero Page Variables (*=System Variable) -DSTLO EQU $06 ;Destination String/Array Pointer -DSTHI EQU $07 -BLKLO EQU $08 ;Block Segment Pointer (block.a02) -BLKHI EQU $09 +DSTPTR EQU $06 ;Destination String/Array Pointer +BLKPTR EQU $08 ;Block Segment Pointer (block.a02) PTRLO EQU $1D ;System Pointer (pointer.a02) PTRHI EQU $1E RANDOM EQU $1F ;Random Number INVFLG EQU $32 ;*Inverse Flag: $3F=Blinking, $7F=Inverse, $FF=Normal RDSEED EQU $4E ;O/S Random Number Low Byte ; EQU $4F ;O/S Random Number High Byte -SRCLO EQU $71 ;Source String/Array Pointer -SRCHI EQU $72 +SRCPTR EQU $71 ;Source String/Array Pointer ; $E3 ;Unused -BLKSLO EQU $EB ;Block Start Address -BLKSHI EQU $EC -BLKELO EQU $ED ;Block End Address -BLKEHI EQU $EE +BLKBGN EQU $EB ;Block Start Address +BLKEND EQU $ED ;Block End Address BLKLEN EQU $EF ;Block Segment Length +BFRPTR EQU $FA ;Work Buffer Pointer BFRLO EQU $FA ;Work Buffer Pointer BFRHI EQU $FB TEMP0 EQU $FC ;Temporary Storage diff --git a/include/appl2std.h02 b/include/appl2std.h02 index 98f9459..26f8ff6 100644 --- a/include/appl2std.h02 +++ b/include/appl2std.h02 @@ -3,16 +3,12 @@ /* Monitor Variables */ /* Standard Library Variables */ -char srclo,srchi; //Source String Pointer for Library Functions -char dstlo,dsthi; //Destination String Pointer for Library Functions +zeropage int srcptr, dstptr, bfrptr, blkptr; char bfrlo,bfrhi; //Buffer Pointer for Library Functions -char blklo,blkhi; //Block Segment Pointer char ptrlo,ptrhi; //System Pointer -char blkslo, blkshi; //Block Start Address -char blkelo, blkehi; //Block End Address -char blklen; //Block Segment Length - +int blkbgn, blkend; //Block Start and End Address +char blklen; //Block Segment Length char temp0, temp1, temp2, temp3; //Temporary Variables //System Variables diff --git a/include/apple1.a02 b/include/apple1.a02 index 51a9fff..6a444be 100644 --- a/include/apple1.a02 +++ b/include/apple1.a02 @@ -20,15 +20,10 @@ RTNKEY EQU $0D ;Return/Enter Key (Carriage Return) ;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 BFRHI EQU $35 -BLKLO EQU $36 ;Block Segment Pointer (block.a02) -BLKHI EQU $37 +BLKPTR EQU $36 ;Block Segment Pointer (block.a02) STKLO EQU $38 ;System Pointer (pointer.a02) STKHI EQU $39 @@ -41,10 +36,8 @@ TEMP2 EQU $42 TEMP3 EQU $43 BLKLEN EQU $47 ;Block Segment Length -BLKSLO EQU $48 ;Block Start Address -BLKSHI EQU $49 -BLKELO EQU $4A ;Block End Address -BLKEHI EQU $4B +BLKBGN EQU $48 ;Block Start Address +BLKEND EQU $4A ;Block End Address STKSLO EQU $4C ;Stack Start Address STKSHI EQU $4D STKELO EQU $4E ;Stack End Address diff --git a/include/apple1.h02 b/include/apple1.h02 index a99356f..e85ca30 100644 --- a/include/apple1.h02 +++ b/include/apple1.h02 @@ -7,14 +7,11 @@ #define SYSBFL 128 //System Buffer Length /* 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 +zeropage int srcptr, dstptr, bfrptr, blkptr; char stklo,skthi; //System Pointer -char blkslo, blkshi; //Block Start Address -char blkelo, blkehi; //Block End Address -char blklen; //Block Segment Length +int blkbgn, blkend; //Block Start and End Address +char blklen; //Block Segment Length char stkslo, stkshi; //Stack Start Address char stkelo, stkehi; //Stack End Address diff --git a/include/apple2.a02 b/include/apple2.a02 index 07d2b4e..25c2b1c 100644 --- a/include/apple2.a02 +++ b/include/apple2.a02 @@ -9,10 +9,7 @@ RTNKEY EQU $0D ;Return/Enter Key (Return) ;Zero Page Variables (*=System Variable) DSTPTR EQU $06 ;Destination Pointer [Unused] -DSTLO EQU $06 -DSTHI EQU $07 -BLKLO EQU $08 ;Block Segment Pointer [Unused] -BLKHI EQU $09 +BLKPTR EQU $08 ;Block Segment Pointer [Unused] SYSBFP EQU $1D ;Stack Pointer [Unused] ; $1E ;Unused STKLO EQU $2E ;Stack Pointer [Tape Read Work Area] @@ -20,13 +17,9 @@ STKHI EQU $2F RANDOM EQU $1F ;Random Number .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 [Unused] -BLKSHI EQU $EC -BLKELO EQU $ED ;Block End Address [Unused] -BLKEHI EQU $EE +BLKBGN EQU $EB ;Block Start Address [Unused] +BLKEND EQU $ED ;Block End Address [Unused] BLKLEN EQU $EF ;Block Segment Length [Unused] BFRLO EQU $FA ;Work Buffer Pointer [Unused] BFRHI EQU $FB diff --git a/include/apple2.h02 b/include/apple2.h02 index 902bd8d..24e1fad 100644 --- a/include/apple2.h02 +++ b/include/apple2.h02 @@ -7,16 +7,13 @@ #define SYSBFL 255 //System Buffer Length /* Standard Library Pointers */ -char srclo,srchi; //Source String Pointer for Library Functions -char dstlo,dsthi; //Destination String Pointer for Library Functions +zeropage int srcptr, dstptr, bfrptr, blkptr; char bfrlo,bfrhi; //Buffer Pointer for Library Functions -char blklo,blkhi; //Block Segment Pointer char stklo,stkhi; //System Pointer /* Standard Library Variables */ -char blkslo, blkshi; //Block Start Address -char blkelo, blkehi; //Block End Address -char blklen; //Block Segment Length +int blkbgn, blkend; //Block Start and 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 diff --git a/include/bbc.a02 b/include/bbc.a02 new file mode 100644 index 0000000..d7e2727 --- /dev/null +++ b/include/bbc.a02 @@ -0,0 +1,113 @@ +; C02 Program Initialization Code for BBC Micro + +;System Specific ASCII Key Mappings +DELKEY EQU $7F ;Delete/Backspace Key ($08=Backspace, $7F=Delete) +ESCKEY EQU $1B ;Escape/Stop Key ($03=Ctrl-C, $1B=Escape) +RTNKEY EQU $0D ;Return/Enter Key ($0D=Carriage Return) +NULKEY EQU $00 ;No Key was Pressed ($00=Null) + +;Zero Page Locations +SRCPTR EQU $70 ;Source Pointer +DSTPTR EQU $72 ;Destination String Pointer (string.asm) +BFRLO EQU $74 ;Buffer Pointer LSB [Temporary String Pointer] +BFRHI EQU $75 ;Buffer Pointer MSB [Temporary String Pointer] +BLKPTR EQU $76 ;Block Pointer +STKLO EQU $78 ;Stack Pointer +STKHI EQU $79 ; Unused by OS + +TEMP0 EQU $80 ;Temporary Storage +TEMP1 EQU $81 +TEMP2 EQU $82 +TEMP3 EQU $83 + +BLKBGN EQU $84 ;Block Start Address +BLKEND EQU $86 ;Block End Address + +STKSLO EQU $88 ;Stack Start Address +STKSHI EQU $89 +STKELO EQU $8A ;Stack End Address +STKEHI EQU $8B + +; EQU $8C ;Unused +; EQU $8D ;Unused +; EQU $8E ;Unused +RANDOM EQU $8F ;Pseudo-RANDOM Number Storage +RDSEED EQU $0296 ;System Clock Low Byte + + ORG $1900 ;Program Start Address + +START: JMP MAIN ;Execute Program + +;Exit Program and Return to Operating System or Monitor +EXIT: JMP ($FFFC) ;Execute Warm Start + +;Poll Character from Keyboard +PLKEY: LDA #$81 ;Set Command to Read Key + LDY #0 ;Set Time Limit to 0 + LDX #0 + JSR #FFF4 ;Call OSBYTE + TYA ;Check Status Code + BNE GETCHE ;If Error, Check for Escape + TXA ;Else Return Character + RTS + +;Read Character from Console +GETKEY; ;Usually Drops into RDKEY, but may need to call RDKEY + ; then clean/convert returned value (e.g. Apple-1) + +;Wait for Character from Keyboard +GETCHR: JSR $FFE0 ;Call System Routine OSRDCH + BCC GETCHX ;If Error +GETCHE: CMP #$1B ; + BNE GETCHZ ; If Escape Pressed + LDA #$7E ; Acknowledge It + JSR $FFF4 ; with OSBYTE Call + LDA #$1B ; and Return ESC + BNE GETCHX ; Else +GETCHZ: LDA #0 ; Return 0 +GETCHX: RTS + +;Delete Previous Character +DELCHR: LDA #$7F ;Print DEL Character + JMP PUTCHR + +;Advance Cursor to Next line +NEWLIN EQU $FFE7 ;Aliased to System Routine OSNEWL + +;Print Character to Screen +PUTCHR: EQU $FFE3 ;Aliased to OSASCI System Routine + +;Clear the Screen +CLRSCR: LDA #$0C ;Print FF Character + JMP PUTCHR + +;Move Cursor to Specified Coordinates +SETPOS: TAX ;Save Column in X + LDA #$1F ;Issue Move Cursor Command + JSR PUTCHR + TXA ;Send X Coordinate + JSR PUTCHR + TYA ;Send Y Coordinate + JMP PUTCHR + +;Get Cursor Position +GETPOS: LDA $0318 ;Load Text Cursor X Coordinate + LDY #0319 ;Load Text Cursor Y Coordinate + RTS + +;Get Screen Size +GETSIZ: LDA $030A ;Get Right Side of Text Window + SEC + SBC $0308 ;Subtract Left Side of Text Window + TAX ;Copy to X Register + INX ;and Add 1 + LDA $0309 ;Get Bottom of Text Window + SEC + SBC $030B ;Subtract Top of Text Window + TAY ;Copy to Y Register + INY ;and Add 1 + TXA ;Copy Width to Accumulator + RTS ;Return Screen Width in A, Height in Y + + INCLUDE "../include/prbyte.a02" ;PRBYTE and PRHEX routine + INCLUDE "../include/putstr.a02" ;PUTSTR routine diff --git a/include/bbc.h02 b/include/bbc.h02 new file mode 100644 index 0000000..db1d0e8 --- /dev/null +++ b/include/bbc.h02 @@ -0,0 +1,49 @@ +/* BBC Micro Header File for C02 Standard Library */ + +/* This header contains standardized Constants, * + * Variables, and Function Calls tailored to a * + * a specific platform. */ + +/* System Specific ASCII Key Codes */ +#define DELKEY $7F //Delete/Backspace Key +#define ESCKEY $1B //Escape/Stop Key +#define RTNKEY $0D //Return/Enter Key +#define NULKEY $00 //No Key was Pressed + +/* Zero Page Variables used as Pointers */ +zeropage int srcptr, dstptr, bfrptr, blkptr; +char bfrlo,bfrhi; //Buffer Pointer for Library Functions +char stklo,stkhi; //Stack Pointer + +/* Ephemeral Library Variables * + * Available for use in program code, but may * + * be obliterated by Function Calls. * + * May be Zero Page, but not required */ +char temp0,temp1,temp2,temp3; //Temporary variables + +/* Static Library Variables * + * Must be preserved between function calls * + * May be Zero Page, but not required */ +int blkbgn, blkend; //Block Start and End Address +char blklen; //Block Segment Length +char stkslo, stkshi; //Stack Start Address +char stkelo, stkehi; //Stsck End Address +char random; //Last Result of Pseudo-Random Number Generator +char rdseed; //System Seed for Pseudo-Random Number Generator + +//System Subroutines +void delchr(); //Delete previous character +char getkey(); //Read ASCII character from Console +char getpos(); //Get Cursor Position +char getsiz(); //Get Screen Size +void newlin(); //Advance cursor to beginning of next line +char polkey(); //Poll Console for character +char putchr(); //Print ASCII character to Console +void prbyte(); //Print Accumulator as Hexadadecimal number +void prhex(); //Print Low Nybble of Accumulator as Hex Digit +char getchr(); //Wait for character from Console +void setpos(); //Set Cursor Position + +//System Labels +start: //Start of Code +exit: //Return to Operating System diff --git a/include/c64.a02 b/include/c64.a02 index f64e836..524c129 100644 --- a/include/c64.a02 +++ b/include/c64.a02 @@ -10,13 +10,8 @@ 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] -BLKHI EQU $27 ;Block Pointer MSB [Floating Point Work Area] +BLKPTR EQU $26 ;Block Pointer [Floating Point Work Area] STKLO EQU $28 ;Stack Pointer LSB [Floating Point Work Area] STKHI EQU $29 ;Stack Pointer MSB [Floating Point Work Area] BFRLO EQU $35 ;Buffer Pointer LSB [Temporary String Pointer] @@ -32,10 +27,8 @@ 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] -BLKELO EQU $0336 ;Block Start MSB [Unused Byte] -BLKEHI EQU $0337 ;Block End MSB [Unused Byte] +BLKBGN EQU $0334 ;Block Start [Unused Byte] +BLKEND EQU $0336 ;Block Start [Unused Byte] BLKLEN EQU $0338 ;Block Length [Unused Byte] RANDOM EQU $0339 ;Random Number Storage [Unused Byte] @@ -102,4 +95,5 @@ NEWLIN: LDX #0 ;Store 0 PUTSTR: TXA ;Copy LSB to Accumulator JMP $AB1E ;Execute STROUT - INCLUDE "../include/prbyte.a02" ;PRBYTE and PRHEX routine + INCLUDE "prbyte.a02" ;PRBYTE and PRHEX routine + diff --git a/include/c64.h02 b/include/c64.h02 index 7a57f94..050fe57 100644 --- a/include/c64.h02 +++ b/include/c64.h02 @@ -7,16 +7,13 @@ #define SYSBFL 88 //System Buffer Length /* Standard Library Pointers */ -char srclo,srchi; //Source String Pointer for Library Functions -char dstlo,dsthi; //Destination String Pointer for Library Functions +zeropage int srcptr, dstptr, bfrptr, blkptr; char bfrlo,bfrhi; //Buffer Pointer for Library Functions -char blklo,blkhi; //Block Segment Pointer char stklo,stkhi; //Stack Pointer /* Standard Library Variables */ -char blkslo, blkshi; //Block Start Address -char blkelo, blkehi; //Block End Address -char blklen; //Block Segment Length +int blkbgn, blkend; //Block Start and End Address +char blklen; //Block Segment Length char stkslo, stkshi; //Stack Start Address char stkelo, stkehi; //Stack End Address char random, rdseed; //Pseudo-Random Number Generator diff --git a/include/header.a02 b/include/header.a02 index a5b3edf..fcd3158 100644 --- a/include/header.a02 +++ b/include/header.a02 @@ -8,10 +8,8 @@ RTNKEY EQU $0D ;Return/Enter Key ($0D=Carriage Return) NULKEY EQU $00 ;No Key was Pressed ($00=Null) ;Zero Page Locations -SRCLO EQU $00 ;Source String/Array Pointer -SRCHI EQU $01 -DSTLO EQU $02 ;Destination String/Array Pointer -DSTHI EQU $03 +SRCPTR EQU $00 ;Source Pointer +DSTPTR EQU $02 ;Destination Pointer BFRLO EQU $04 ;Work Buffer Pointer BFRHI EQU $05 @@ -23,12 +21,10 @@ TEMP1 EQU $11 TEMP2 EQU $12 TEMP3 EQU $12 -BLKSLO EQU $20 ;Block Start Address -BLKSHI EQU $21 -BLKELO EQU $22 ;Block End Address -BLKEHI EQU $23 -BLKLO EQU $24 ;Block Pointer -BLKHI EQU $25 +BLKBGN EQU $20 ;Block Start Address +BLKEND EQU $22 ;Block End Address +BLKPTR EQU $24 ;Block Pointer +BLKLEN EQY $26 ;Block Segment Length STKSLO EQU $28 ;Stack Start Address STKSHI EQU $29 @@ -81,5 +77,8 @@ NEWLIN: RTS ;Code to move Cursor to beginning of next line ;Print Character to Screen PUTCHR RTS ;Code to write ASCII character to Screen - INCLUDE "../include/prbyte.a02" ;PRBYTE and PRHEX routines - \ No newline at end of file + INCLUDE "prbyte.a02" ;PRBYTE and PRHEX routines + INCLUDE "putstr.a02" ;PUTSTR routine + +;System Key Names +KNAMES BYTE "DELETE",0,"ESCAPE",0,"RETURN",0 diff --git a/include/header.h02 b/include/header.h02 index 34a6f0c..7a98987 100644 --- a/include/header.h02 +++ b/include/header.h02 @@ -8,12 +8,10 @@ #define DELKEY $7F //Delete/Backspace Key #define ESCKEY $1B //Escape/Stop Key #define RTNKEY $0D //Return/Enter Key -#define NULKEY $00 //No Key was Pressed +#define SYSBFL 128 //System Buffer Length /* Zero Page Variables used as Pointers */ -char strlo,strhi; //String pointer for String and I/O functions -char dstlo,dsthi; //Secondary string pointer for String functions -char blklo,blkhi; //Block Segment Pointer +zeropage int srcptr, dstptr, bfrptr, blkptr; char stklo,stkhi; //Stack Pointer /* Ephemeral Library Variables * @@ -25,23 +23,23 @@ char temp0,temp1,temp2,temp3; //Temporary variables /* Static Library Variables * * Must be preserved between function calls * * May be Zero Page, but not required */ -char blkslo, blkshi; //Block Start Address -char blkelo, blkehi; //Block End Address -char blklen; //Block Segment Length +int blkbgn, blkend; //Block Start and End Address +char blklen; //Block Segment Length char stkslo, stkshi; //Stack Start Address char stkelo, stkehi; //Stsck End Address char random; //Last Result of Pseudo-Random Number Generator char rdseed; //System Seed for Pseudo-Random Number Generator +char sysbfr[], sysbfp; //System String Buffer and Position //System Subroutines void delchr(); //Delete previous character +char getchr(); //Wait for character from Console char getkey(); //Read ASCII character from Console void newlin(); //Advance cursor to beginning of next line char polkey(); //Poll Console for character char putchr(); //Print ASCII character to Console void prbyte(); //Print Accumulator as Hexadadecimal number void prhex(); //Print Low Nybble of Accumulator as Hex Digit -char getchr(); //Wait for character from Console //System Labels start: //Start of Code diff --git a/include/intlib.a02 b/include/intlib.a02 index 09a2a4d..6a91de7 100644 --- a/include/intlib.a02 +++ b/include/intlib.a02 @@ -1,7 +1,7 @@ -; C02 library stdlib.h02 assembly language subroutines +; C02 module intlib.h02 assembly language subroutines ; Requires -; external zero page locations SRCLO and SRCHI -; and external locations RANDOM, RDSEED, TEMP0, TEMP1, and TEMP2. +; external zero page words DSTPTR and SRCPTR +; and external locations TEMP0, TEMP1, TEMP2, and TEMP3 SUBROUTINE INTLIB @@ -23,25 +23,25 @@ IABS: CPY #$80 ;If Negative (High Bit Set) ;imax(i) - Get MAXimum of Two Integers ;Args: Y,X = Second Integer -;Uses: SRCHI,SRCLO = First Integer +;Uses: SRCPTR = First Integer ;Affects: N,Z,C ;Returns: Y,X = Larger of the Two Arguments -IMAX: CPY SRCHI ;If Y < SRCHI - BCC .GETSRC ; Return SRCLO, SRCHI - CPX SRCLO ;IF X >= SRCLO +IMAX: CPY SRCPTR+1 ;If Y < SRCPTR MSB + BCC .GETSRC ; Return SRCPTR + CPX SRCPTR ;IF X >= SRCPTR LSB BCS .RETURN ; Return Argument -.GETSRC JMP GETSRC ;Return Integer in SRCLO, SRCHI +.GETSRC JMP GETSRC ;Return Integer in SRCPTR ;imin(i) - Get MINimum of Two Integers ;Args: Y,X = Second Integer -;Uses: SRCHI,SRCLO = First Integer +;Uses: SRCPTR = First Integer ;Affects: N,Z,C ;Returns: Y,X = Larger of the Two Arguments -IMIN: CPY SRCHI ;If Y < SRCHI +IMIN: CPY SRCPTR+1 ;If Y < SRCPTR+1 BCC .RETURN ; Return Argument - BNE .GETSRC ;If Y > SRCHI Return SRCHI,SRCLO - CPX SRCLO ;If X >= SRCLO - BCS .GETSRC ; Return SRCHI,SRCLO + BNE .GETSRC ;If Y > SRCPTR+1 Return SRCPTR + CPX SRCPTR ;If X >= SRCPTR + BCS .GETSRC ; Return SRCPTR RTS ;Return Argument ;iaddc(c,i) - Add Byte c to Integer i @@ -58,10 +58,10 @@ IADDC: JSR SETSRC ;Save Integer and Clear Y ; N = Sign of Result IADD: CLC ;Clear Carry for Addition TXA ;Add Addend LSB - ADC SRCLO ;to Augend LSB + ADC SRCPTR ;to Augend LSB TAX ;and Copy to X TYA ;Add Addend MSB - ADC SRCHI ;to Augebd MSB + ADC SRCPTR+1 ;to Augebd MSB TAY ;and Copy to Y LDA #0 ;Set Overflow to 0 ROL ; Rotate Carry (Same as Adding it) @@ -77,10 +77,10 @@ IADD: CLC ;Clear Carry for Addition ; N = Sign of Result ISUB: JSR SAVRXY ;Store Subtrahend in TEMP1,TEMP2 SEC ;Set Carry for Subtraction - LDA SRCLO ;Load Minuend LSB + LDA SRCPTR ;Load Minuend LSB SBC TEMP1 ;Subtract Subtrahend LSB TAX ;Copy Difference LSB to X - LDA SRCHI ;Load Minuend MSB + LDA SRCPTR+1 ;Load Minuend MSB SBC TEMP2 ;Subtract Subtrahend MSB TAY ;Copy Difference MSB to Y LDA #0 ;Set Overflow Byte to 0 @@ -204,7 +204,7 @@ ISHFTR: JSR SAVRXY ;Save X,Y in TEMP1,TEMP2 ATOI: JSR SETSRC ;Initialize Source String STY TEMP1 ;Initialize Result STY TEMP2 -.AILOOP LDA (SRCLO),Y ;Get Next Character +.AILOOP LDA (SRCPTR),Y ;Get Next Character CMP #$30 ;If Less Than '0' BCC .AIDONE ; Exit CMP #$3A ;If Greater Than '9' @@ -239,7 +239,7 @@ ATOI: JSR SETSRC ;Initialize Source String ;itoa(n) - Integer TO ASCII string ;Args: Y,X = Integer Value to Convert -;Uses: DSTHI,DSTLO = Destination String +;Uses: DSTPTR = Destination String ;Affects: X ;Returns: A,Y = Length of String ITOA: JSR CVIBCD ;Convert Integer to Packed BCD @@ -258,14 +258,14 @@ ITOA: JSR CVIBCD ;Convert Integer to Packed BCD TXA ;and Restore Digit LDY TEMP3 ;Get Index into String ORA #$30 ;Convert Digit to ASCII - STA (DSTLO),Y ;and Store in String + STA (DSTPTR),Y ;and Store in String INC TEMP3 ;Increment Index into String PLA ;Pull Digit Number off Stack TAY DEY ;Decrement Digit Number BPL .IALOOP ;Loop if >= Zero LDA #0 ;Terminate String - STA (DSTLO),Y + STA (DSTPTR),Y TYA ;Return String Length RTS diff --git a/include/kowalski.a02 b/include/kowalski.a02 new file mode 100644 index 0000000..a06fb31 --- /dev/null +++ b/include/kowalski.a02 @@ -0,0 +1,95 @@ +; Program initialization code for C02 programs +; Template for System Specific Code + + ORG $0400 ;Program Start Address + +;System Specific ASCII Key Mappings +DELKEY EQU $08 ;Delete/Backspace Key (Backspace) +ESCKEY EQU $1B ;Escape/Stop Key (Escape) +RTNKEY EQU $0D ;Return/Enter Key (Carriage Return) +NULKEY EQU $00 ;No Key was Pressed (Null) + +;Zero Page Locations +SRCPTR EQU $10 +DSTPTR EQU $12 +BFRLO EQU $14 ;Work Buffer Pointer +BFRHI EQU $15 + +STKSAV EQU $1D ;Stack Pointer Storage +RDSEED EQU $1E ;Pseudo-RANDOM Seed +RANDOM EQU $1F ;Pseudo-RANDOM Number Storage + +TEMP0 EQU $20 ;Temporary Storage +TEMP1 EQU $21 +TEMP2 EQU $22 +TEMP3 EQU $22 + +BLKBGN EQU $30 ;Block Start Address +BLKEND EQU $32 ;Block End Address +BLKPTR EQU $34 ;Block Pointer +BLKLEN EQU $36 ;Block Segment Length + +STKSLO EQU $48 ;Stack Start Address +STKSHI EQU $49 +STKELO EQU $4A ;Stack End Address +STKEHI EQU $4B +STKLO EQU $4C ;Stack Pointer +STKHI EQU $4D + +;Memory Mapped I/O +IOBASE EQU $E000 +IOINIT EQU IOBASE+0 ;Clear Terminal Window +IOPUTC EQU IOBASE+1 ;Put Character +IOPUTR EQU IOBASE+2 ;Put Raw Character +IOPUTH EQU IOBASE+3 ;Put as Hexadecimal Number +IOGETC EQU IOBASE+4 ;Get Character +IOPOSX EQU IOBASE+5 ;Set Cursor X Position +IOPOSY EQU IOBASE+6 ;Set Cursor Y Position + +START: LDX #$FF ;Initialize Stack Pointer + TXS ; + STX IOINIT ;Clear Screen + JMP MAIN ;Execute Program + +;Exit Program and Return to Monitor +EXIT: BRK ;Halt Debugger + +;Read Character from Console +GETKEY EQU $FFE0 ;Emulator CHRIN Routine + +;Poll Character from Keyboard +POLKEY: INC RDSEED ;Cycle the Random Seed + LDA IOGETC ;Code Read from Keyboard + RTS + +;Wait for Character from Console +GETCHR: JSR POLKEY ;Usually calls PLKEY + BEQ GETCHR ; until a non-zero is returned + RTS + +;Delete Previous Character +DELCHR: LDA #$08 ;Load Backspace into Accumulator + JMP PUTCHR ; and Print it + +;Advance Character to Next line +NEWLIN: LDA #$0D ;Load Carriage Return + JSR PUTCHR ;And Print It + LDA #$0A ;Load Line Feed + +;Print Character to Console +PUTCHR: STA IOPUTC ;Write Character to Screen + RTS + +;Print Hexadecimal Digit +PRHEX: AND #$0F + ORA #'0' + BNE PUTCHR + +;Print Hexadecimal Byte +PRBYTE: STA IOPUTH ;Put as Hexadecimal Number + RTS + + INCLUDE "putstr.a02" ;PUTSTR routine + + + diff --git a/include/kowalski.h02 b/include/kowalski.h02 new file mode 100644 index 0000000..dc9f119 --- /dev/null +++ b/include/kowalski.h02 @@ -0,0 +1,45 @@ +/* System Specific C02 Header File Template */ + +/* This header contains standardized Constants, * + * Variables, and Function Calls tailored to a * + * a specific platform. */ + +/* System Specific ASCII Key Codes */ +#define DELKEY $7F //Delete/Backspace Key +#define ESCKEY $1B //Escape/Stop Key +#define RTNKEY $0D //Return/Enter Key +#define NULKEY $00 //No Key was Pressed + +/* Zero Page Variables used as Pointers */ +zeropage int srcptr, dstptr, bfrptr, blkptr; +char stklo,stkhi; //Stack Pointer + +/* Ephemeral Library Variables * + * Available for use in program code, but may * + * be obliterated by Function Calls. * + * May be Zero Page, but not required */ +char temp0,temp1,temp2,temp3; //Temporary variables + +/* Static Library Variables * + * Must be preserved between function calls * + * May be Zero Page, but not required */ +int blkbgn, blkend; //Block Start and End Address +char blklen; //Block Segment Length +char stkslo, stkshi; //Stack Start Address +char stkelo, stkehi; //Stsck End Address +char random; //Last Result of Pseudo-Random Number Generator +char rdseed; //System Seed for Pseudo-Random Number Generator + +//System Subroutines +void delchr(); //Delete previous character +char getkey(); //Read ASCII character from Console +void newlin(); //Advance cursor to beginning of next line +char polkey(); //Poll Console for character +char putchr(); //Print ASCII character to Console +void prbyte(); //Print Accumulator as Hexadadecimal number +void prhex(); //Print Low Nybble of Accumulator as Hex Digit +char getchr(); //Wait for character from Console + +//System Labels +start: //Start of Code +exit: //Return to Operating System diff --git a/include/orao.a02 b/include/orao.a02 new file mode 100644 index 0000000..acdfef3 --- /dev/null +++ b/include/orao.a02 @@ -0,0 +1,78 @@ +; Orao Program Initialization Code for C02 programs + +;System Specific ASCII Key Mappings +DELKEY EQU $1F ;Left Arrow +ESCKEY EQU $03 ;Ctrl-C +RTNKEY EQU $0D ;Carriage Return +NULKEY EQU $00 ;Null + +;Zero Page Locations +SRCLO EQU $30 ;Source String/Array Pointer +SRCHI EQU $31 +DSTLO EQU $32 ;Destination String/Array Pointer +DSTHI EQU $33 +BFRLO EQU $34 ;Work Buffer Pointer +BFRHI EQU $35 + +STKSAV EQU $36 ;Stack Pointer Storage +RDSEED EQU $37 ;Pseudo-RANDOM Seed +RANDOM EQU $38 ;Pseudo-RANDOM Number Storage +TEMP0 EQU $3A ;Temporary Storage +TEMP1 EQU $3B +TEMP2 EQU $3C +TEMP3 EQU $3D + +BLKBGN EQU $40 ;Block Start Address +BLKEND EQU $42 ;Block End Address +BLKPTR EQU $44 ;Block Pointer +BLKLEN EQU $46 ;Block Segment Length + +STKSLO EQU $48 ;Stack Start Address +STKSHI EQU $49 +STKELO EQU $4A ;Stack End Address +STKEHI EQU $4B +STKLO EQU $4C ;Stack Pointer +STKHI EQU $4D + + ORG $1000 ;Program Start Address + +START: TSX ;Save Stack Pointer + STX STKSAV + JMP MAIN ;Execute Program + + +;Exit Program and Return to Operating System or Monitor +EXIT LDX STKSAV ;Restore Stack Pointer + TXS + RTS ;and Return to Caller + +RESET EQU $FFA3 ;Alias to WARMST (Monitor) + +;Poll Character from Keyboard +POLKEY: JSR $E5B0 ;Scan Keyboard + BCC POLKEX ;If No Key Pressed + LDA #NULKEY ;Return NUL +POLKEX: RTS + +;Read Character from Console +GETKEY EQU $E500 ;Alias to INCHR function + +;Wait for Character from Console +GETCHR EQU GETKEY ;Alias to GETKEY + +;Print Character to Screen +PUTCHR EQU $E762 ;Alias to OUTCH Routine + +;Delete Previous Character +DELCHR EQU $F1F2 ;Alias to BCKSPC Routine + +;Advance Cursor to Next line +NEWLIN EQU $E7F6 ;Aliased to CRLF Routine + +;Print Byte as Two-Digit Hex Number to Console +PRBYTE EQU $E803 + +;Print Low Nybble as Hex Digit to Console +PRHEX EQU $E80F + + INCLUDE "../include/putstr.a02" ;PUTSTR Routine diff --git a/include/orao.h02 b/include/orao.h02 new file mode 100644 index 0000000..b4b03c9 --- /dev/null +++ b/include/orao.h02 @@ -0,0 +1,48 @@ +/* Orao C02 Header File Template */ + +/* This header contains standardized Constants, * + * Variables, and Function Calls tailored to a * + * a specific platform. */ + +/* System Specific ASCII Key Codes */ +#define DELKEY $1F //Delete/Backspace Key +#define ESCKEY $03 //Escape/Stop Key +#define RTNKEY $0D //Return/Enter Key +#define NULKEY $00 //No Key was Pressed + +/* Zero Page Variables used as Pointers */ +zeropage int srcptr, dstptr, bfrptr, blkptr; +char stklo,stkhi; //Stack Pointer + +/* Ephemeral Library Variables * + * Available for use in program code, but may * + * be obliterated by Function Calls. * + * May be Zero Page, but not required */ +char temp0,temp1,temp2,temp3; //Temporary variables + +/* Static Library Variables * + * Must be preserved between function calls * + * May be Zero Page, but not required */ +int blkbgn, blkend; //Block Start and End Address +char blklen; //Block Segment Length +char stkslo, stkshi; //Stack Start Address +char stkelo, stkehi; //Stsck End Address +char random; //Last Result of Pseudo-Random Number Generator +char rdseed; //System Seed for Pseudo-Random Number Generator + +//System Subroutines +void delchr(); //Delete previous character +char getkey(); //Read ASCII character from Console +char getpos(); //Get Cursor Position +char getsiz(); //Get Screen Size +void newlin(); //Advance cursor to beginning of next line +char polkey(); //Poll Console for character +char putchr(); //Print ASCII character to Console +void prbyte(); //Print Accumulator as Hexadadecimal number +void prhex(); //Print Low Nybble of Accumulator as Hex Digit +char getchr(); //Wait for character from Console +void setpos(); //Set Cursor Position + +//System Labels +start: //Start of Code +exit: //Return to Operating System diff --git a/include/py65.a02 b/include/py65.a02 index b3d1da2..95445dc 100644 --- a/include/py65.a02 +++ b/include/py65.a02 @@ -6,14 +6,11 @@ ESCKEY EQU $1B ;Escape/Stop Key (Escape) RTNKEY EQU $0D ;Return/Enter Key (Carriage Return) ;Zero Page Locations -SRCLO EQU $30 ;Source String Pointer (stdio.a02) -SRCHI EQU $31 -DSTLO EQU $32 ;Destination String Pointer (string.a02) -DSTHI EQU $33 +SRCPTR EQU $30 ;Source Pointer +DSTPTR EQU $32 ;Destination Pointer BFRLO EQU $34 ;Work Buffer Pointer BFRHI EQU $35 -BLKLO EQU $36 ;Block Segment Pointer (block.a02) -BLKHI EQU $37 +BLKPTR EQU $36 ;Block Segment Pointer (block.a02) STKLO EQU $38 ;Stack Pointer (stack.a02) STKHI EQU $39 @@ -25,10 +22,8 @@ TEMP1 EQU $41 TEMP2 EQU $42 TEMP3 EQU $43 -BLKSLO EQU $46 ;Block Start Address -BLKSHI EQU $47 -BLKELO EQU $48 ;Block End Address -BLKEHI EQU $49 +BLKBGN EQU $46 ;Block Start Address +BLKEND EQU $48 ;Block End Address BLKLEN EQU $4A ;Block Segment Length STKSLO EQU $4C ;Stack Start Address diff --git a/include/py65.h02 b/include/py65.h02 index 3fd9005..edb9ae3 100644 --- a/include/py65.h02 +++ b/include/py65.h02 @@ -6,16 +6,13 @@ #define RTNKEY $0D //Return/Enter Key //Library Pointer Variables -char srclo,srchi; //Source String Pointer for Library Functions -char dstlo,dsthi; //Destination String Pointer for Library Functions +zeropage int srcptr, dstptr, bfrptr, blkptr; 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 -char blklen; //Block Segment Length +int blkbgn, blkend; //Block Start and 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 diff --git a/include/py65win.a02 b/include/py65win.a02 index 268cb08..5251859 100644 --- a/include/py65win.a02 +++ b/include/py65win.a02 @@ -6,12 +6,11 @@ ESCKEY EQU $1B ;Escape/Stop Key (Escape) RTNKEY EQU $0D ;Return/Enter Key (Carriage Return) ;Zero Page Locations -SRCLO EQU $30 ;Source String Pointer (stdio.a02) -SRCHI EQU $31 -DSTLO EQU $32 ;Destination String Pointer (string.a02) -DSTHI EQU $33 -BLKLO EQU $34 ;Block Segment Pointer (block.a02) -BLKHI EQU $35 +SRCPTR EQU $30 ;Source Pointer +DSTPTR EQU $32 ;Destination Pointer +BFRLO EQU $34 ;Work Buffer Pointer +BFRHI EQU $35 +BLKPTR EQU $36 ;Block Segment Pointer (block.a02) STKLO EQU $36 ;Stack Pointer (stack.a02) STKHI EQU $37 @@ -23,10 +22,8 @@ TEMP1 EQU $41 TEMP2 EQU $42 TEMP3 EQU $43 -BLKSLO EQU $46 ;Block Start Address -BLKSHI EQU $47 -BLKELO EQU $48 ;Block End Address -BLKEHI EQU $49 +BLKBGN EQU $46 ;Block Start Address +BLKEND EQU $48 ;Block End Address BLKLEN EQU $4A ;Block Segment Length STKSLO EQU $4C ;Stack Start Address diff --git a/include/run6502.a02 b/include/run6502.a02 index 56864f2..3ffae56 100644 --- a/include/run6502.a02 +++ b/include/run6502.a02 @@ -3,21 +3,15 @@ ;System Specific ASCII Key Mappings DELKEY EQU $08 ;Delete/Backspace Key (Backspace) ESCKEY EQU $18 ;Escape/Stop Key (Control-X) -RTNKEY EQU $0A ;Return/Enter Key (Line Feed) +RTNKEY EQU $0D ;Return/Enter Key (Carriage Return) ;Zero Page Locations SRCPTR EQU $30 ;Source String Pointer (stdio.a02) -SRCLO EQU $30 -SRCHI EQU $31 DSTPTR EQU $32 ;Destination String Pointer (string.a02) -DSTLO EQU $32 -DSTHI EQU $33 BFRPTR EQU $34 ;Work Buffer Pointer BFRLO EQU $34 BFRHI EQU $35 BLKPTR EQU $36 ;Block Segment Pointer (block.a02) -BLKLO EQU $36 -BLKHI EQU $37 STKLO EQU $38 ;Stack Pointer (stack.a02) STKHI EQU $39 @@ -29,10 +23,8 @@ TEMP1 EQU $41 TEMP2 EQU $42 TEMP3 EQU $43 -BLKSLO EQU $46 ;Block Start Address -BLKSHI EQU $47 -BLKELO EQU $48 ;Block End Address -BLKEHI EQU $49 +BLKBGN EQU $46 +BLKEND EQU $48 BLKLEN EQU $4A ;Block Segment Length STKSLO EQU $4C ;Stack Start Address @@ -55,38 +47,50 @@ _GETCH EQU $FFF1 ;Read Keyboard (Blocking) START: JMP MAIN ;Execute Program ;Read Character from Console -GETKEY EQU $FFE0 ;Emulator CHRIN Routine +GETKEY EQU $FFE0 ;Emulator _GETCH Routine ;Poll Character from Keyboard POLKEY: BRK ;Exit Emulator ;Wait for Character from Console -GETCHR: JSR GETKEY ;Read Character from STDIN +GETCHR: JSR GETKEY ;Get Key from Console + BEQ GETCHR ;If None Pressed, Loop + RTS + +;Read Character from stdin +RDCHAR: LDA $FFEA ;Read Character from STDIN CMP #$FF ;If EOF - BNE GETCHX - LDA #ESCKEY ; Set to Escape Character -GETCHX: ORA 0 ;Set Zero Flag + BNE RDCHAX + LDA #0 ; Set to ASCII NUL +RDCHAX ORA #0 ;Set Flags RTS ;Delete Previous Character DELCHR: LDA #$08 ;Load Backspace into Accumulator JSR PUTCHR ; and Print it - LDA #$20 ;Load Space into Accumulater + LDA #$20 ;Load Space into Accumulator JSR PUTCHR ; and Print it LDA #$08 ;Load Backspace into Accumulator JMP PUTCHR ; and Print it ;Advance Character to Next line -NEWLIN: LDA #RTNKEY ;Load Line Feed into Accumulater +NEWLIN: LDA #$0D ;Load Carriage Return into Accumulator + JSR PUTCHR ; and Print it + LDA #$0A ;Load Line Feed into Accumulator JMP PUTCHR ; and Print it ;Print Character to Console PUTCHR EQU $FFE3 ;Emulator CHROUT Routine +;Write Character to stdout +PRCHAR: STA $FFEA ;Read Character from STDIN + RTS + 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 + INCLUDE "prbyte.a02" ;PRBYTE and PRHEX routines + INCLUDE "putstr.a02" ;PUTSTR routine + diff --git a/include/run6502.h02 b/include/run6502.h02 index 295235b..6ec870c 100644 --- a/include/run6502.h02 +++ b/include/run6502.h02 @@ -3,19 +3,20 @@ //Platform Specific Constants #define DELKEY $08 //Delete/Backspace Key #define ESCKEY $18 //Escape/Stop Key -#define RTNKEY $0D //Return/Enter Key +#define RTNKEY $0A //Return/Enter Key #define SYSBFL 128 //System Buffer Length +const char delnam; //Delete/Backspace Key Name +const char escnam; //Escape/Stop Key Name +const char rtnnam; //Return/Enter Key Name + //Library Pointer Variables zeropage int srcptr, dstptr, bfrptr, blkptr; -char srclo,srchi; //Source String Pointer for Library Functions -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 +int blkbgn, blkend; char blklen; //Block Segment Length char stkslo, stkshi; //Stack Start Address char stkelo, stkehi; //Stsck End Address @@ -28,11 +29,11 @@ char putcon; //Write Character to Console char getcon; //Read Character from Console //System Subroutines -char polkey(); //Poll Console for character (Exits Emulator) +void delchr(); //Delete previous character char getchr(); //Wait for character from Console char getkey(); //Read ASCII character from Console (Exits Emulator) void newlin(); //Advance cursor to beginning of next line -void delchr(); //Delete previous character +char polkey(); //Poll Console for character (Exits Emulator) char putchr(); //Print ASCII character to Console void prbyte(); //Print Accumulator as Hexadadecimal number void prhex(); //Print Low Nybble of Accumulator as Hex Digit @@ -40,4 +41,3 @@ void prhex(); //Print Low Nybble of Accumulator as Hex Digit //System Labels start: //Start of Code exit: //Return to Operating System - diff --git a/include/stdiox.a02 b/include/stdiox.a02 index 8aa2d41..27b065b 100644 --- a/include/stdiox.a02 +++ b/include/stdiox.a02 @@ -295,7 +295,7 @@ PRINTF: STA TEMP3 ;Save Byte to Format TYA ;Save Index PHA TXA ;Restore Specifier - JSR GETDST ;Get Integer in DSTLO, DSTHI + JSR GETDST ;Get Integer in DSTPTR CMP #'I' ;If 'i' or 'I' BNE .FDESTJ JSR PUTINT ; Print Integer Right Justified @@ -319,7 +319,7 @@ PRINTF: STA TEMP3 ;Save Byte to Format ;char putdst() PUTDST LDY #0 ;Initialize character offset -.DLOOP LDA (DSTLO),Y ;Read next character in string +.DLOOP LDA (DSTPTR),Y ;Read next character in string BEQ .DRETY ;If Not 0 JSR PUTC ; Print character at offset, INY ; increment offset, and diff --git a/include/vic.a02 b/include/vic.a02 index 74d2933..86d1e5c 100644 --- a/include/vic.a02 +++ b/include/vic.a02 @@ -6,14 +6,9 @@ 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] -BLKHI EQU $27 ;Block Pointer MSB [Floating Point Work Area] +SRCPTR EQU $22 ;Source Pointer [Temporary Pointers] +DSTPTR EQU $24 ;Destination Pointer [Temporary Pointers] +BLKPTR EQU $26 ;Block Pointer [Floating Point Work Area] STKLO EQU $28 ;Stack Pointer LSB [Floating Point Work Area] STKHI EQU $29 ;Stack Pointer MSB [Floating Point Work Area] BFRLO EQU $35 ;Buffer Pointer LSB [Temporary String Pointer] @@ -32,10 +27,8 @@ USER1 EQU $0311 ;Free Byte for User Programs USER2 EQU $0312 ;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] -BLKELO EQU $0336 ;Block Start MSB [Unused Byte] -BLKEHI EQU $0337 ;Block End MSB [Unused Byte] +BLKBGN EQU $0334 ;Block Start [Unused Byte] +BLKEND EQU $0336 ;Block Start [Unused Byte] BLKLEN EQU $0338 ;Block Length [Unused Byte] RANDOM EQU $0339 ;Random Number Storage [Unused Byte] diff --git a/include/vic20.h02 b/include/vic20.h02 index 06d6bda..563541e 100644 --- a/include/vic20.h02 +++ b/include/vic20.h02 @@ -7,16 +7,13 @@ #define SYSBFL 88 //System Buffer Length /* Standard Library Pointers */ -char srclo,srchi; //Source String Pointer for Library Functions -char dstlo,dsthi; //Destination String Pointer for Library Functions +zeropage int srcptr, dstptr, bfrptr, blkptr; char bfrlo,bfrhi; //Buffer Pointer for Library Functions -char blklo,blkhi; //Block Segment Pointer char stklo,stkhi; //Stack Pointer /* Standard Library Variables */ -char blkslo, blkshi; //Block Start Address -char blkelo, blkehi; //Block End Address -char blklen; //Block Segment Length +int blkbgn, blkend; //Block Start and 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 diff --git a/include/vic3k.h02 b/include/vic3k.h02 index d53a733..d7803a7 100644 --- a/include/vic3k.h02 +++ b/include/vic3k.h02 @@ -8,16 +8,14 @@ #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 -char dstlo,dsthi; //Destination String Pointer for Library Functions -char blklo,blkhi; //Block Segment Pointer +/* Standard Library Pointers */ +zeropage int srcptr, dstptr, bfrptr, blkptr; +char bfrlo,bfrhi; //Buffer Pointer for Library Functions char stklo,stkhi; //Stack Pointer -//Library Variables -char blkslo, blkshi; //Block Start Address -char blkelo, blkehi; //Block End Address -char blklen; //Block Segment Length +/* Standard Library Variables */ +int blkbgn, blkend; //Block Start and 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 diff --git a/include/vic8k.h02 b/include/vic8k.h02 index 3edd3b8..aefd35c 100644 --- a/include/vic8k.h02 +++ b/include/vic8k.h02 @@ -8,16 +8,14 @@ #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 -char dstlo,dsthi; //Destination String Pointer for Library Functions -char blklo,blkhi; //Block Segment Pointer +/* Standard Library Pointers */ +zeropage int srcptr, dstptr, bfrptr, blkptr; +char bfrlo,bfrhi; //Buffer Pointer for Library Functions char stklo,stkhi; //Stack Pointer -//Library Variables -char blkslo, blkshi; //Block Start Address -char blkelo, blkehi; //Block End Address -char blklen; //Block Segment Length +/* Standard Library Variables */ +int blkbgn, blkend; //Block Start and 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 diff --git a/include/x16.a02 b/include/x16.a02 index f0845d2..0318dbd 100644 --- a/include/x16.a02 +++ b/include/x16.a02 @@ -13,13 +13,8 @@ XMBANK EQU $53 ;Extended Memory Bank XADRLO EQU $54 ;Ext Memory Address LSB XADRHI EQU $55 ;Ext Memory Address MSB SRCPTR EQU $56 ;Source Pointer -SRCLO EQU $57 ;Source Pointer LSB -SRCHI EQU $58 ;Source Pointer MSB DSTPTR EQU $59 ;Destination Pointer -DSTLO EQU $5A ;Destination Pointer LSB -DSTHI EQU $5B ;Destination Pointer MSB -BLKLO EQU $5C ;Block Pointer LSB -BLKHI EQU $5D ;Block Pointer MSB +BLKPTR EQU $5C ;Block Pointer STKLO EQU $5E ;Stack Pointer LSB STKHI EQU $5F ;Stack Pointer MSB BFRLO EQU $60 ;Buffer Pointer LSB @@ -40,10 +35,8 @@ SYSBFP EQU $68 ;Position in System Buffer [Free Byte] 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 -BLKEHI EQU $07F7 ;Block End MSB +BLKBGN EQU $07F4 ;Block Start Address +BLKEND EQU $07F6 ;Block End Address BLKLEN EQU $07F8 ;Block Length STKSAV EQU $07FA ;Machine Stack Storage diff --git a/include/x16.h02 b/include/x16.h02 index 7c02946..b72e8e1 100644 --- a/include/x16.h02 +++ b/include/x16.h02 @@ -10,17 +10,13 @@ #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, bfrptr, blkptr; zeropage char bfrlo,bfrhi; //Buffer Pointer for Library Functions -zeropage char blklo,blkhi; //Block Segment Pointer zeropage char stklo,stkhi; //Stack Pointer zeropage char xadrlo,xadrhi; //Physical Address LSB, MSB /* Standard Library Variables */ -char blkslo,blkshi; //Block Start Address -char blkelo,blkehi; //Block End Address +int blkbgn, blkend; //Block Start and End Address char blklen; //Block Segment Length char stkslo,stkshi; //Stack Start Address char stkelo,stkehi; //Stsck End Address diff --git a/test/blktest.c02 b/test/blktest.c02 index 88eccd7..ad983a8 100644 --- a/test/blktest.c02 +++ b/test/blktest.c02 @@ -16,8 +16,7 @@ #include char c, i, n, r, z; -char savlo,savhi,tmplo,tmphi; //Address Pointer -char chkhi,chklo; //Address Check +int chkint, savptr; char number[5]; const char numbrs = "zero one two threefour five six seveneightnine ten"; const char sorted = {8,5,4,9,1,7,6,3,2,0}; @@ -25,48 +24,44 @@ const char name1 = "Dick", name2 = "Jane"; char block[255]; //Array to Use as Block char temp[127]; char seglo[9],seghi[9]; -char aa,xx,yy; - -struct ssgmt { - char key[6]; - char flag; - char value; -}; +char aa,xx,yy,zz; +int yx; +struct ssgmt {char key[6]; char flag; char value;}; struct ssgmt sgmt; struct ssgmt seg1; struct ssgmt seg2; struct ssgmt tseg; +char cmpptr(chkint) {putadr(blkptr); return cmpadr(blkptr);} +void chkadr(yx) {putadr(yx);cmpadr(yx);psflln(yx);} +char equals(aa,zz) {A = (aa == zz) ? #TRUE : #FALSE;} +char cmpadr(yx) {xx = equals(chkint, '@') r=#FALSE;} psflln(r); newlin();//if (anykey()==#ESCKEY) goto exit; @@ -80,14 +75,14 @@ puts("sgmt=");prtseg(&sgmt); newlin(); puts("blkput(@seg1,&seg1); "); -blkrst(); blkput(@seg1,&seg1); r=chkptr(&$432A); +blkrst(); blkput(@seg1,&seg1); r=cmpptr(&$432A); memdst(&$4321); r = chkmem(@seg1,&seg1) & r; psflln(r); puts(" _blk=");prtseg(&$4321); newlin(); puts("blkswp(@sgmt,&sgmt); "); -blkrst(); blkswp(@sgmt,&sgmt); r = chkptr(&$4321); +blkrst(); blkswp(@sgmt,&sgmt); r = cmpptr(&$4321); memdst(&$4321); r = chkmem(@seg2,&seg2) & r; memdst(&sgmt); r = chkmem(@seg1,&seg1) & r; psflln(r); @@ -98,17 +93,17 @@ anykey(); puts("blkput(@sgmt, &sgmt);\n"); blkset(0); blkrst(); r = #TRUE; for (i=0; i<10; i++) { - printf(i,"%d: "); nsgmt(i,&sgmt); savlo=blklo;savhi=blkhi; - blkput(@sgmt,&sgmt); seglo[i]=savlo; seghi[i]=savhi; - putadr(.,savhi,savlo); puts(" _blk="); prtseg(.,savhi,savlo); - setdst(.,savhi,savlo); if (memcmp(@sgmt,&sgmt)) r = #FALSE; + printf(i,"%d: "); nsgmt(i,&sgmt); savptr=blkptr; + blkput(@sgmt,&sgmt); seglo[i]=savptr; + putadr(savptr); puts(" _blk="); prtseg(savptr); + setdst(savptr); if (memcmp(@sgmt,&sgmt)) r = #FALSE; } puts("blkput:"); psflln(r); newlin(); puts("blkget(@temp, &temp);\n"); blkrst(); r = #TRUE; for (i=0; i<10; i++) { printf(i,"%d: "); nsgmt(i,&sgmt); memclr(@temp, &temp); - putadr(.,blkhi,blklo); r = blkget(@temp, &temp); + putadr(blkptr); r = blkget(@temp, &temp); setdst(&temp); if (memcmp(@sgmt, &sgmt)) r = #FALSE; puts(" temp="); prtseg(&temp); } @@ -118,20 +113,19 @@ puts("blkmem(@sgmt, &sgmt);\n"); r = #TRUE; for (i=9; i:+; i--) { printf(i,"%d: "); nsgmt(i,&sgmt); blkmem(@sgmt,&sgmt); - if (dstlo<>seglo[i]) r = #FALSE; - if (dsthi<>seghi[i]) r = #FALSE; - putadr(.,dsthi,dstlo); puts(" _blk="); prtseg(.,dsthi,dstlo); + if (seglo[i]) r = #FALSE; + if (>dstptr<>seghi[i]) r = #FALSE; + putadr(dstptr); puts(" _blk="); prtseg(dstptr); } puts("blkmem:"); psflln(r); newlin(); - puts("blkstr(@sgmt, &sgmnt);\n"); r = #TRUE; for (i=0; i<10; i++) { printf(i,"%d: "); nsgmt(i,&sgmt); memclr(@temp, &temp); setdst(&temp); blkstr(&sgmt.key); - if (srclo<>seglo[i]) r = #FALSE; - if (srchi<>seghi[i]) r = #FALSE; - putadr(.,srchi,srclo); puts(" temp="); prtseg(&temp); + if (seglo[i]) r = #FALSE; + if (>srcptr<>seghi[i]) r = #FALSE; + putadr(srcptr); puts(" temp="); prtseg(&temp); if (memcmp(@sgmt, &sgmt)) r = #FALSE; i++; if (i=9) i=0; //evens then odds } @@ -140,7 +134,7 @@ puts("blkstr:"); psflln(r); anykey(); puts("blksrt(&temp);\n"); r = #TRUE; blksrt(&temp);blkrst(); for (i=0; i<10; i++) { printf(i,"%d: "); nsgmt(sorted[i],&sgmt); memclr(@temp, &temp); - putadr(.,blkhi,blklo); r = blkget(@temp, &temp); + putadr(blkptr); r = blkget(@temp, &temp); setdst(&temp); if (memcmp(@sgmt, &sgmt)) r = #FALSE; puts(" temp="); prtseg(&temp); } @@ -150,31 +144,6 @@ putln("Tests complete."); goto exit; -char chkptr() { - setchk(); //pass through args - putadr(.,blkhi,blklo); - return cmpadr(.,blkhi,blklo); -} -void setchk() { - chklo=X; chkhi=Y; -} - -void chkadr(tmphi,tmplo) { - putadr(.,tmphi,tmplo); - cmpadr(.,tmphi,tmplo); - psflln(tmplo & tmphi); -} - -char cmpadr(aa,yy,xx) { - xx = (chklo == xx) ? #TRUE : #FALSE; - yy = (chkhi == yy) ? #TRUE : #FALSE; - return xx & yy; -} - -void clrseg() { - setdst(); memset(0, @sgmt); -} - void prtseg(aa,yy,xx) { setdst(&tseg); memcpy(@tseg,yy,xx); setdst(&tseg.key); printf("key=\"%s\","); @@ -182,11 +151,6 @@ void prtseg(aa,yy,xx) { printf(tseg.value,",value=%d\n"); } -char chkmem() { - aa = memcmp(); //pass through args - aa = (aa==0) ? #TRUE : #FALSE; - return aa; -} //Copy Textual Representation of n to temp void numstr(n,yy,xx) { @@ -197,27 +161,20 @@ void numstr(n,yy,xx) { } //Build String Segment in Temp -void nsgmt(n,tmphi,tmplo) { +void nsgmt(n,yx) { memclr(@tseg,&tseg); numstr(n,&tseg.key); tseg.flag = trufls(n); tseg.value = n; - setdst(.,tmphi,tmplo); memcpy(@tseg,&tseg); + setdst(yx); memcpy(@tseg,&tseg); } //Print Addresses void pradrs() { - tmplo=srclo;tmphi=srchi; - puts(" SRC: $");prbyte(tmphi);prbyte(tmplo); - puts(" DST: $");prbyte(dsthi);prbyte(dstlo); - puts(" BLK: $");prbyte(blkhi);prbyte(blklo); + puts(" SRC: $");putwrd(srcptr); + puts(" DST: $");putwrd(dstptr); + puts(" BLK: $");putwrd(blkptr); newlin(); } -//Print Block Addresses -void prbadr() { - prbyte(blkshi);prbyte(blkslo);putc(' '); - prbyte(blkehi);prbyte(blkelo);putc(' '); - prbyte(blkhi);prbyte(blklo);newlin(); -}