mirror of
https://github.com/RevCurtisP/C02.git
synced 2025-02-20 12:29:04 +00:00
Added module intlib and updated module stdiox
This commit is contained in:
parent
71e15fb2d8
commit
0bd11dbaed
244
include/intlib.a02
Normal file
244
include/intlib.a02
Normal file
@ -0,0 +1,244 @@
|
|||||||
|
; C02 library stdlib.h02 assembly language subroutines
|
||||||
|
; Requires
|
||||||
|
; external zero page locations SRCLO and SRCHI
|
||||||
|
; and external locations RANDOM, RDSEED, TEMP0, TEMP1, and TEMP2.
|
||||||
|
|
||||||
|
;iabs(n) - Get Integer ABSolute Value
|
||||||
|
;Args: Y,X = Integer to get Absolute Value Of
|
||||||
|
;Sets: TEMP1, TEMP2
|
||||||
|
;Affects: C, N, Z
|
||||||
|
;Returns: A = Absolute Value of Argument
|
||||||
|
IABS: CPY #$80 ;If Negative (High Bit Set)
|
||||||
|
BCC IABSX ; Carry will Already be Set
|
||||||
|
JSR SAVRXY ; Copy LSB, MSB to TEMP1. TEMP2
|
||||||
|
LDA #0 ; Subtract LSB
|
||||||
|
SBC TEMP1 ; from 0
|
||||||
|
TAX ; and Copy to X Register
|
||||||
|
LDA #0 ; Subtract MSB
|
||||||
|
SBC TEMP2 ; from 0
|
||||||
|
TAY ; and Copy to Y Register
|
||||||
|
IABSX: RTS
|
||||||
|
|
||||||
|
;imax(m,n) - Get MAXimum of Two Integers
|
||||||
|
;Args: A,Y = Numbers to Compare
|
||||||
|
;Affects: N,Z,C
|
||||||
|
;Returns: A = Larger of the Two Arguments
|
||||||
|
IMAX: CPY SRCHI ;If Y < SRCHI
|
||||||
|
BCC IMAXC ; Return SRCLO, SRCHI
|
||||||
|
CPX SRCLO ;IF X >= SRCLO
|
||||||
|
BCS IMINX ; Return Argument
|
||||||
|
IMAXC: JMP GETSRC ;Return Integer in SRCLO, SRCHI
|
||||||
|
|
||||||
|
;imin(m,n) - Get MINimum Get MAXimum of Two Numbers
|
||||||
|
;Args: A,Y = Numbers to Compare
|
||||||
|
;Sets: TEMP0 = Second Argument
|
||||||
|
;Affects: N,Z,C
|
||||||
|
;Returns: A = Smaller of the Two Arguments
|
||||||
|
IMIN: CPY SRCHI ;If Y < SRCHI
|
||||||
|
BCS IMINX ; Return Argument
|
||||||
|
BNE IMAXC ;If Y > SRCHI Return SRCHI,SRCLO
|
||||||
|
CPX SRCLO ;If X < SRCLO
|
||||||
|
BCS IMINX ; Return Argument
|
||||||
|
BNE IMAXC ;If X > SRCLO Return SRCHI,SRCLO
|
||||||
|
IMINX: RTS ;Return Argument
|
||||||
|
|
||||||
|
;iadd(d) - ADD Integer d to from Integer g
|
||||||
|
;Args: Y,X = Addend
|
||||||
|
;Requires: setsrc(g) - Augend
|
||||||
|
;Sets: TEMP1,TEMP2 = Addend
|
||||||
|
;Affects: Z,C
|
||||||
|
;Returns: A = Sum (Bits 16-23)
|
||||||
|
; Y,X = Sum (Bits 0-15)
|
||||||
|
; N = Sign of Result
|
||||||
|
IADD: CLC ;Clear Carry for Addition
|
||||||
|
TXA ;Add Addend LSB
|
||||||
|
ADC SRCLO ;to Augend LSB
|
||||||
|
TAX ;and Copy to X
|
||||||
|
TYA ;Add Addend MSB
|
||||||
|
ADC SRCHI ;to Augebd MSB
|
||||||
|
TAY ;and Copy to Y
|
||||||
|
LDA #0 ;Set Overflow to 0
|
||||||
|
ROL ; Rotate Carry (Same as Adding it)
|
||||||
|
RTS ; and Return
|
||||||
|
|
||||||
|
;isub(s) - SUBtract Integer s from Integer m
|
||||||
|
;Args: Y,X = Subtrahend
|
||||||
|
;Requires: setsrc(m) - Minuend
|
||||||
|
;Sets: TEMP1,TEMP2 = Subtrahend
|
||||||
|
;Affects: Z,C
|
||||||
|
;Returns: A = Differencee (Bits 16-23)
|
||||||
|
; Y,X = Difference (Bits 0-15)
|
||||||
|
; N = Sign of Result
|
||||||
|
ISUB: JSR SAVRXY ;Store Subtrahend in TEMP1,TEMP2
|
||||||
|
SEC ;Set Carry for Subtraction
|
||||||
|
LDA SRCLO ;Load Minuend LSB
|
||||||
|
SBC TEMP1 ;Subtract Subtrahend LSB
|
||||||
|
TAX ;Copy Difference LSB to X
|
||||||
|
LDA SRCHI ;Load Minuend MSB
|
||||||
|
SBC TEMP2 ;Subtract Subtrahend MSB
|
||||||
|
TAY ;Copy Difference MSB to Y
|
||||||
|
LDA #0 ;Set Overflow Byte to 0
|
||||||
|
SBC #0 ; Subtract Carry
|
||||||
|
RTS ; and Return
|
||||||
|
|
||||||
|
;imult(m) - MULTiply Two Integers
|
||||||
|
IMULT: RTS
|
||||||
|
|
||||||
|
;idiv(d) - MULTiply Two Numbers
|
||||||
|
IDIV: RTS
|
||||||
|
|
||||||
|
|
||||||
|
;ishftl(n,i) - Shift Integer i to the Left n Bits
|
||||||
|
;Sets: TEMP1, TEMP2 = LSB, MSB of Result
|
||||||
|
;Affects: A,Y,N,Z,C
|
||||||
|
;Returns: Y,X = Shifted Integer
|
||||||
|
ISHFTL: JSR SAVRXY ;Save X,Y in TEMP1,TEMP2
|
||||||
|
TYA ;Set Counter to Number of Bits
|
||||||
|
ASL TEMP1 ;Shift LSB to Left
|
||||||
|
ROL TEMP2 ;Rotate MSB to Left
|
||||||
|
DEY ;Decrement Counter
|
||||||
|
BNE ISHFTL ; and Loop if Not 0
|
||||||
|
BEQ ISHFTX ;Return Shifted Integer
|
||||||
|
|
||||||
|
;ishftr(n,i) - Shift Integer i to the Right n Bits
|
||||||
|
;Sets: TEMP1, TEMP2 = LSB, MSB of Result
|
||||||
|
;Affects: A,Y,N,Z,C
|
||||||
|
;Returns: Y,X = Shifted Integer
|
||||||
|
ISHFTR: JSR SAVRXY ;Save X,Y in TEMP1,TEMP2
|
||||||
|
TYA ;Copy
|
||||||
|
LSR TEMP1 ;Shift LSB to Right
|
||||||
|
ROR TEMP2 ;Rotate MSB to Right
|
||||||
|
DEY ;Decrement Counter
|
||||||
|
BNE ISHFTR ; and Loop if Not 0
|
||||||
|
ISHFTX: JMP RESRXY ;Load Shifted Integer and Return
|
||||||
|
|
||||||
|
;atoi(&s) - ASCII string TO Integer
|
||||||
|
;Args: Y,X = Address of String to Convert
|
||||||
|
;Sets: TEMP1, TEMP2 = Integer Value
|
||||||
|
;Affects: TEMP0
|
||||||
|
;Returns: A = Number of Digits
|
||||||
|
; Y,X = Integer Value
|
||||||
|
ATOI: JSR SETSRC ;Initialize Source String
|
||||||
|
STY TEMP1 ;Initialize Result
|
||||||
|
STY TEMP2
|
||||||
|
ATOIL: LDA (SRCLO),Y ;Get Next Character
|
||||||
|
CMP #$30 ;If Less Than '0'
|
||||||
|
BCC ATOIX ; Exit
|
||||||
|
CMP #$3A ;If Greater Than '9'
|
||||||
|
BCS ATOIX ; Exit
|
||||||
|
AND #$0F ;Convert to Binary Nybble
|
||||||
|
STA TEMP0 ; and Save It
|
||||||
|
LDA TEMP1 ;Load Result
|
||||||
|
LDX TEMP2
|
||||||
|
ASL TEMP1 ;Multiply by 5 by
|
||||||
|
ROL TEMP2
|
||||||
|
ASL TEMP1 ; Multiplying by 4
|
||||||
|
ROL TEMP2
|
||||||
|
CLC ; And Adding Itself
|
||||||
|
ADC TEMP1
|
||||||
|
STA TEMP1
|
||||||
|
TXA
|
||||||
|
ADC TEMP2
|
||||||
|
STA TEMP2
|
||||||
|
ASL TEMP1 ;Multiply that by 2
|
||||||
|
ROL TEMP2
|
||||||
|
LDA TEMP0 ;Get Saved Nybble
|
||||||
|
CLC ;and Add to Result
|
||||||
|
ADC TEMP1 ;Add Saved Nybble
|
||||||
|
STA TEMP1 ; and Store Result
|
||||||
|
LDA #0
|
||||||
|
ADC TEMP2
|
||||||
|
STA TEMP2
|
||||||
|
INY ;Increment Index
|
||||||
|
BPL ATOIL ; and Loop
|
||||||
|
ATOIX: TYA ;Return Number of Digits
|
||||||
|
JMP RESRXY ;and Integer Value
|
||||||
|
|
||||||
|
;itoa(n) - Integer TO ASCII string
|
||||||
|
;Args: Y,X = Integer Value to Convert
|
||||||
|
;Uses: DSTHI,DSTLO = Destination String
|
||||||
|
;Returns: A,Y = Length of String
|
||||||
|
ITOA: JSR CVIBCD ;Convert Integer to Packed BCD
|
||||||
|
LDY #0 ;Initialize Index into String
|
||||||
|
STY TEMP3
|
||||||
|
ITOAA: LDY #4 ;Set Initial Digit Number
|
||||||
|
JSR UPBCDI ;Unpack Digit Y
|
||||||
|
ITOAZ: BNE ITOAS ;If Zero
|
||||||
|
DEX ; Decrement Digit Number
|
||||||
|
BNE ITOAZ ; If Not Zero Loop
|
||||||
|
BEQ ITOAS ; Else Skip Unpack
|
||||||
|
ITOAL: JSR UPBCDI ;Unpack Digit #Y
|
||||||
|
ITOAS: TAX ;Save Digit in X
|
||||||
|
TYA ;Push Digit Number into Stack
|
||||||
|
PHA
|
||||||
|
TXA ;and Restore Digit
|
||||||
|
LDY TEMP3 ;Get Index into String
|
||||||
|
ORA #$30 ;Convert Digit to ASCII
|
||||||
|
STA (DSTLO),Y ;and Store in String
|
||||||
|
INC TEMP3 ;Increment Index into String
|
||||||
|
PLA ;Pull Digit Number off Stack
|
||||||
|
TAY
|
||||||
|
DEY ;Decrement Digit Number
|
||||||
|
BPL ITOAL ;Loop if >= Zero
|
||||||
|
LDA #0 ;Terminate String
|
||||||
|
STA (DSTLO),Y
|
||||||
|
TYA ;Return String Length
|
||||||
|
RTS
|
||||||
|
|
||||||
|
;upbcdi() - UnPack digits from BCD Integer
|
||||||
|
; Assumes that TEMP0, TEMP1, and TEMP2
|
||||||
|
; are in consecutive memory locations
|
||||||
|
;Args: Y = Digit Number to Unpack (0-5)
|
||||||
|
;Uses: TEMP0 = Low Byte
|
||||||
|
; TEMP1 = Middle Byte
|
||||||
|
; TEMP2 = High Nybble
|
||||||
|
;Affects: X,C,N,Z
|
||||||
|
;Returns: A = Unpacked Digit
|
||||||
|
UPBCDI: TYA ;Divide Digit Number by 2,
|
||||||
|
LSR ; Setting Carry
|
||||||
|
TAX ; if Digit Number is Odd
|
||||||
|
LDA TEMP0,X ;Load BCD Byte
|
||||||
|
BCC UPBCDS ;If Digit Number is Odd
|
||||||
|
LSR ;Shift High Nybble to Low Nybble
|
||||||
|
LSR
|
||||||
|
LSR
|
||||||
|
LSR
|
||||||
|
UPBCDS: AND #$0F ;Strip Off High Nybble
|
||||||
|
RTS
|
||||||
|
|
||||||
|
;cvibcd(int) - ConVert Integer to packed Binary Coded Decimal
|
||||||
|
;Args: Y,X - Integer to Convert
|
||||||
|
;Sets: TEMP0 = Tens and Ones Digit
|
||||||
|
; TEMP1 = Hundreds Digit
|
||||||
|
; TEMP2 = Thousands Digit
|
||||||
|
;Affects: A,X,Y
|
||||||
|
CVIBCD: LDA #0 ;Clear BCD Bytes
|
||||||
|
STA TEMP0
|
||||||
|
STA TEMP1
|
||||||
|
STA TEMP2
|
||||||
|
PHP ;Save Status Register
|
||||||
|
SEI ;Disable Interrupts
|
||||||
|
SED ;Set Decimal Mode
|
||||||
|
TYA ;Push MSB onto Stack
|
||||||
|
PHA
|
||||||
|
TXA ;Push LSB onto Stack
|
||||||
|
PHA
|
||||||
|
TSX ;Copy Stack Pointer to X
|
||||||
|
LDY #16 ;Process 16 bits of Binary
|
||||||
|
CVIBCL: ASL $101,X ;Shift High Bit Into Carry
|
||||||
|
ROL $102,X
|
||||||
|
LDA TEMP0 ;Add 6 Digit BCD Number Itself
|
||||||
|
ADC TEMP0 ; Effectively Multiplying It by 2
|
||||||
|
STA TEMP0 ; and Adding in the Shifted Out Bit
|
||||||
|
LDA TEMP1
|
||||||
|
ADC TEMP1
|
||||||
|
STA TEMP1
|
||||||
|
LDA TEMP2
|
||||||
|
ADC TEMP2
|
||||||
|
STA TEMP2
|
||||||
|
DEY ;Decrement Counter and
|
||||||
|
BNE CVIBCL ; Process Next Bit
|
||||||
|
PLA ;Restore Stack
|
||||||
|
PLA
|
||||||
|
PLP ;Restore Status Register
|
||||||
|
RTS
|
70
include/intlib.h02
Normal file
70
include/intlib.h02
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
/*********************************************************
|
||||||
|
* intlib - Standard Library Routines for Integer Values *
|
||||||
|
*********************************************************/
|
||||||
|
|
||||||
|
/* Absolute Value *
|
||||||
|
* Args: w - Word to get absolute value of *
|
||||||
|
* Returns: (int) Absolute value of w */
|
||||||
|
char iabs();
|
||||||
|
|
||||||
|
/* Add Integers *
|
||||||
|
* Requires: setsrc(g) - Augend *
|
||||||
|
* Args: d - Addend *
|
||||||
|
* Returns: (int) Sum */
|
||||||
|
char iadd();
|
||||||
|
|
||||||
|
/* Convert ASCII String to Unsigned Integer *
|
||||||
|
* Args: &s - String to Convert *
|
||||||
|
* Returns: (char) Number of digits parsed *
|
||||||
|
* (int) Numeric value of string */
|
||||||
|
char atoi();
|
||||||
|
|
||||||
|
/* Convert Unsigned Integer to ASCII String *
|
||||||
|
* Requires: setdst(s) - Destination String *
|
||||||
|
* Args: w - Unsigned Byte to Convert *
|
||||||
|
* Returns: Length of string */
|
||||||
|
void itoa();
|
||||||
|
|
||||||
|
/* Divide Unsigned Integers *
|
||||||
|
* Requires: setsrc(n) - Numerator *
|
||||||
|
* Args: d - Denominator *
|
||||||
|
* Returns: (int) Quotient */
|
||||||
|
char idiv();
|
||||||
|
|
||||||
|
/* Maximum of Two Integers *
|
||||||
|
* Requires: setsrc(i) - First Integer *
|
||||||
|
* Args: j - Second Integer *
|
||||||
|
* Returns: (int) Greater of the Two */
|
||||||
|
char max();
|
||||||
|
|
||||||
|
/* Minimum of Two Integers *
|
||||||
|
* Requires: setsrc(i) - First Integer *
|
||||||
|
* Args: j - Second Integer *
|
||||||
|
* Returns: (int) Lesser of the Two */
|
||||||
|
char min();
|
||||||
|
|
||||||
|
/* Multiply Unsigned Integers *
|
||||||
|
* Requires: setsrc(m) - Muliplicand *
|
||||||
|
* Args: r - Multiplier *
|
||||||
|
* Returns: (char) Product (Bits 16-23) *
|
||||||
|
* (int) Product (Bits 0-15) */
|
||||||
|
char mult();
|
||||||
|
|
||||||
|
/* Shift Integer Left *
|
||||||
|
* Args: n - Number of Bits to Shift *
|
||||||
|
* w - Integer Value to Shift *
|
||||||
|
* Returns: Shifted Integer */
|
||||||
|
char ishftl();
|
||||||
|
|
||||||
|
/* Shift Byte Right *
|
||||||
|
* Args: n - Number of Bits to Shift *
|
||||||
|
* w - Integer Value to Shift *
|
||||||
|
* Returns: Shifted Integer */
|
||||||
|
char ishftr();
|
||||||
|
|
||||||
|
/* Subtract Integers *
|
||||||
|
* Requires: setsrc(m) - Minuend *
|
||||||
|
* Args: s - Subtrahend *
|
||||||
|
* Returns: (int) Difference */
|
||||||
|
char isub();
|
||||||
|
|
@ -63,3 +63,37 @@ GETSRC: LDX SRCLO
|
|||||||
LDY SRCHI
|
LDY SRCHI
|
||||||
RTS
|
RTS
|
||||||
|
|
||||||
|
;Add Accumulator to Destination Address
|
||||||
|
ADDDSA: TAX ;Move Accumulator to Argument LSB
|
||||||
|
LDY #0 ;Clear Argument MSB
|
||||||
|
|
||||||
|
;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
|
||||||
|
BNE ADDZPW ;and Execute ADDZPW
|
||||||
|
|
||||||
|
;Add Accumulator to Source Address
|
||||||
|
ADDSRA: TAX ;Move Accumulator to Argument LSB
|
||||||
|
LDY #0 ;Clear Argument MSB
|
||||||
|
|
||||||
|
;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
|
||||||
|
|
||||||
|
;Add to Zero Page Word
|
||||||
|
;Args: A = Address of Zero Page Word
|
||||||
|
; Y,X = MSB,LSB of Integer to Add
|
||||||
|
;Affects: A
|
||||||
|
ADDZPW: STA TEMP3 ;Save Zero Page Address
|
||||||
|
TXA ;Move Argument LSB to Accumulator
|
||||||
|
LDX TEMP3 ;Set Index to Zero Page Address
|
||||||
|
CLC ;Clear Carry
|
||||||
|
ADC 0,X ;Add Argument LSB to Target LSB
|
||||||
|
STA 0,X ;and Save Result
|
||||||
|
TYA ;Move Argument MSB to Accumulator
|
||||||
|
ADC 1,X ;Add Argument MSB to Target MSB
|
||||||
|
STA 1,X ;and Save Result
|
||||||
|
RTS
|
||||||
|
|
||||||
|
@ -6,6 +6,19 @@
|
|||||||
#define TRUE $FF
|
#define TRUE $FF
|
||||||
#define FALSE $00
|
#define FALSE $00
|
||||||
|
|
||||||
|
/* Add to Destination Pointer *
|
||||||
|
* Args: &n - amount to add */
|
||||||
|
void adddst();
|
||||||
|
|
||||||
|
/* Add to Source Pointer *
|
||||||
|
* Args: &n - amount to add */
|
||||||
|
void addsrc();
|
||||||
|
|
||||||
|
/* Add to Zero Page Word *
|
||||||
|
* Args: z - Zero page address *
|
||||||
|
* &n - amount to add */
|
||||||
|
void addzpw();
|
||||||
|
|
||||||
/* Get Destination Pointer *
|
/* Get Destination Pointer *
|
||||||
* Returns: Y,X=Destination address */
|
* Returns: Y,X=Destination address */
|
||||||
int getdst();
|
int getdst();
|
||||||
@ -61,3 +74,4 @@ void setsrc();
|
|||||||
|
|
||||||
/* Set Source Pointer to Destination Pointer */
|
/* Set Source Pointer to Destination Pointer */
|
||||||
void setsrd();
|
void setsrd();
|
||||||
|
|
||||||
|
@ -38,7 +38,7 @@ PUTBIL: LDA #0
|
|||||||
ASL TEMP0 ;Shift Top Bit Out
|
ASL TEMP0 ;Shift Top Bit Out
|
||||||
ADC #$30 ;Convert to '0' or '1'
|
ADC #$30 ;Convert to '0' or '1'
|
||||||
JSR PUTCHR ;Print Digit
|
JSR PUTCHR ;Print Digit
|
||||||
DEX ;Decremebt Index
|
DEX ;Decrement Index
|
||||||
BNE PUTBIL ;Loop if Not Done
|
BNE PUTBIL ;Loop if Not Done
|
||||||
RTS
|
RTS
|
||||||
|
|
||||||
@ -80,20 +80,33 @@ PUTDES: JSR PUTDEH
|
|||||||
PUTDEC: JSR CUBCD ;Convert Accumulator to Unpacked BCD
|
PUTDEC: JSR CUBCD ;Convert Accumulator to Unpacked BCD
|
||||||
LDA TEMP2 ;Get High Byte
|
LDA TEMP2 ;Get High Byte
|
||||||
BEQ PUTDE1 ;If Not Zero
|
BEQ PUTDE1 ;If Not Zero
|
||||||
JSR PUTDEP ; Convert Low Nybble
|
JSR PUTDGT ; Print Digit
|
||||||
PUTDE1: LDA TEMP1 ;Get Low Byte
|
PUTDE1: LDA TEMP1 ;Get Low Byte
|
||||||
BNE PUTDE2 ;If Not Zero
|
BNE PUTDE2 ;If Not Zero
|
||||||
CMP TEMP2 ; and Hundreds
|
CMP TEMP2 ; and Hundreds
|
||||||
BEQ PUTDE3 ; not Zero
|
BEQ PUTDE3 ; not Zero
|
||||||
PUTDE2: JSR PUTDEP ; Convert It
|
PUTDE2: JSR PUTDGT ; Print Digit
|
||||||
PUTDE3: LDA TEMP0 ;Get Low Byte
|
PUTDE3: LDA TEMP0 ;Get Low Byte
|
||||||
PUTDEP: ORA #$30 ;Convert to ASCII digit
|
PUTDGT: ORA #$30 ;Convert to ASCII digit
|
||||||
JSR PUTCHR ;And Print
|
JMP PUTCHR ;And Print
|
||||||
RTS
|
|
||||||
|
|
||||||
;puthex(&word) - PUT HEXadecimal
|
;puthex(&word) - PUT HEXadecimal
|
||||||
PUTHEX EQU PRBYTE ;Print Byte as Hexadecimal
|
PUTHEX EQU PRBYTE ;Print Byte as Hexadecimal
|
||||||
|
|
||||||
|
;putint(&word) - PUT INTeger
|
||||||
|
PUTINT: JSR CVIBCD ;Convert Integer to Packed BCD
|
||||||
|
LDY #4 ;Set Initial Digit Number
|
||||||
|
JSR UPBCDI ;Unpack Digit X
|
||||||
|
PUTINZ: BNE PUTINS ;If Zero
|
||||||
|
DEY ; Decrement Digit Number
|
||||||
|
BNE PUTINZ ; If Not Zero Loop
|
||||||
|
BEQ PUTDGT ; Else Print Digit and Return
|
||||||
|
PUTINL: JSR UPBCDI ;Unpack Digit X
|
||||||
|
PUTINS: JSR PUTDGT ;Print Digit
|
||||||
|
DEY ;Decrement Digit Number
|
||||||
|
BPL PUTINL ;Loop if >= Zero
|
||||||
|
RTS
|
||||||
|
|
||||||
;putwrd(&word) - PUT WoRD
|
;putwrd(&word) - PUT WoRD
|
||||||
;Args: Y = Word MSB
|
;Args: Y = Word MSB
|
||||||
; X = Word LSB
|
; X = Word LSB
|
||||||
@ -174,12 +187,21 @@ PRINTS: CMP #'S ;'Else If "s" or "S"
|
|||||||
LDY TEMP0 ; Restore Index
|
LDY TEMP0 ; Restore Index
|
||||||
JMP PRINTY ;
|
JMP PRINTY ;
|
||||||
PRINTW: CMP #'W ;'Else If "w" or "W"
|
PRINTW: CMP #'W ;'Else If "w" or "W"
|
||||||
BNE PRINTZ
|
BNE PRINTI
|
||||||
STY TEMP0 ; Save Index
|
STY TEMP0 ; Save Index
|
||||||
JSR SAVDST ; Save Destination Address
|
JSR SAVDST ; Save Destination Address
|
||||||
JSR PUTWRA ; Print MSB and LSB as Hex
|
JSR PUTWRA ; Print MSB and LSB as Hex
|
||||||
LDY TEMP0 ; Restore Index
|
LDY TEMP0 ; Restore Index
|
||||||
JMP PRINTY ;
|
JMP PRINTY ;
|
||||||
|
PRINTI: CMP #'I ;'Else If "i" or "I"
|
||||||
|
BNE PRINTZ
|
||||||
|
TYA ; Save Index
|
||||||
|
PHA
|
||||||
|
JSR GETDST ; Get Integer in DSTLO, DSTHI
|
||||||
|
JSR PUTINT ; Print Integer as Decimal
|
||||||
|
PLA ; Restore Index
|
||||||
|
TAY
|
||||||
|
JMP PRINTY ;
|
||||||
PRINTZ: LDA TEMP3 ;Else
|
PRINTZ: LDA TEMP3 ;Else
|
||||||
JMP PRINTC ; Print Raw Byte and Continue
|
JMP PRINTC ; Print Raw Byte and Continue
|
||||||
|
|
||||||
|
@ -43,3 +43,18 @@ void puthex();
|
|||||||
/* Print a Space Character */
|
/* Print a Space Character */
|
||||||
void putspc();
|
void putspc();
|
||||||
|
|
||||||
|
/* Print /* Print Byte as Hexadecimal Number *
|
||||||
|
* Args: b - Number to print */
|
||||||
|
void puthex();
|
||||||
|
|
||||||
|
/* Print Byte as Hexadecimal Number *
|
||||||
|
* Args: b - Number to print */
|
||||||
|
void puthex();
|
||||||
|
|
||||||
|
/* Print Byte as Hexadecimal Number *
|
||||||
|
* Args: b - Number to print */
|
||||||
|
void puthex();
|
||||||
|
|
||||||
|
/* Print Word as Hexadecimal Number *
|
||||||
|
* Args: int w - Number to print */
|
||||||
|
void putwrd();
|
||||||
|
@ -151,13 +151,14 @@ ATOCX: LDA TEMP0 ;Load Result
|
|||||||
|
|
||||||
;ctoa(n) - Character TO ASCII string
|
;ctoa(n) - Character TO ASCII string
|
||||||
;Args: Y,X = Address of String to Populate
|
;Args: Y,X = Address of String to Populate
|
||||||
;Sets: SRCLO, SRCHI = Address of String
|
;Sets: DSTLO, DSTHI = Address of String
|
||||||
; TEMP0 = Ones Digit
|
; TEMP0 = Ones Digit
|
||||||
; TEMP1 = Tens Digit
|
; TEMP1 = Tens Digit
|
||||||
; TEMP2 = Hundreds Digit
|
; TEMP2 = Hundreds Digit
|
||||||
;Affects: C,N.Z
|
;Affects: C,N.Z
|
||||||
;Returns: A,Y = Length of String
|
;Returns: A,Y = Length of String
|
||||||
CTOA: JSR SETSRC ;Initialize Source String
|
CTOA: JSR SETDST ;Initialize Source String
|
||||||
|
LDY #0 ;Initialize Index into String
|
||||||
JSR CUBCD ;Convert Accumulator to Unpacked BCD
|
JSR CUBCD ;Convert Accumulator to Unpacked BCD
|
||||||
LDA TEMP2 ;Get MSB
|
LDA TEMP2 ;Get MSB
|
||||||
BEQ CTOA1 ;If Not Zero
|
BEQ CTOA1 ;If Not Zero
|
||||||
@ -172,7 +173,7 @@ CTOA3: LDA TEMP0 ;Get Low Byte
|
|||||||
LDA #$00
|
LDA #$00
|
||||||
BEQ CTOAX ;Terminate String
|
BEQ CTOAX ;Terminate String
|
||||||
CTOAN: ORA #$30 ;Convert to ASCII digit
|
CTOAN: ORA #$30 ;Convert to ASCII digit
|
||||||
CTOAX: STA (SRCLO),Y ;Store in StringCTOAS: STA (SRCLO),Y ;Store in String
|
CTOAX: STA (DSTLO),Y ;Store in String
|
||||||
INY ;and Increment Offset
|
INY ;and Increment Offset
|
||||||
TYA ;Copy String Length to Accumulator
|
TYA ;Copy String Length to Accumulator
|
||||||
RTS
|
RTS
|
||||||
@ -214,7 +215,7 @@ CVBCDT: LDA #0 ;Clear BCD Bytes
|
|||||||
PHP ;Save Status Register
|
PHP ;Save Status Register
|
||||||
SEI ;Disable Interupts
|
SEI ;Disable Interupts
|
||||||
SED ;Set Decimal Mode
|
SED ;Set Decimal Mode
|
||||||
CVBCDL: ASL TEMP0 ;Shift High Bit Into Carry
|
CVBCDL: ASL TEMP0 ;Shift High Bit into Carry
|
||||||
LDA TEMP1 ;Add BCD Low Byte to Itself
|
LDA TEMP1 ;Add BCD Low Byte to Itself
|
||||||
ADC TEMP1 ; Plus Bit Shifted out of Binary
|
ADC TEMP1 ; Plus Bit Shifted out of Binary
|
||||||
STA TEMP1 ; Effectively Multiplying It by 2
|
STA TEMP1 ; Effectively Multiplying It by 2
|
||||||
|
Loading…
x
Reference in New Issue
Block a user