;ctype.h02 assembly language subroutines ; ;C02 Functions modify Accumulator and Flags ; ISxxxx will load $FF into Accumulator to and Set Carry if True ; and load $00 into Accumulator to and clear Carry if False ; toxxxx set Carry if character IS converted, otherwISe clear Carry ;Machine Language Subroutines modify Flags but not Accumulator ; Carry will be Set if True and Cleared if False ;Index RegISters are not modified by any routines ;Character Test Functions - Set Accumulator ISALNM: JSR ISALN ;Is Alphanumeric Character BVC ISBTF ISALPH: JSR ISALP; ;Is Alphabetic Character BVC ISBTF ISBDGT: JSR ISBIN ;Is Binary Digit BVC ISBTF ISCTRL: JSR ISCTL ;Is Control Character BVC ISBTF ISDIGT: JSR ISDGT ;Is Digit BVC ISBTF ISGRPH: JSR ISGRP ;Is Graphical Character BVC ISBTF ISHDGT: JSR ISHEX ;Is Hex Digit BVC ISBTF ISLOWR: JSR ISLWR ;Is Lowercase Character BVC ISBTF ISPNCT: JSR ISPNC ;Is Punctuation Character BVC ISBTF ISPRNT: JSR ISPRT ;Is Printable Character BVC ISBTF ISSPCE: JSR ISSPC ;Is White Space Character BVC ISBTF ISUPPR: JSR ISUPR ;Is Uppercase Character BVC ISBTF ;Internal Routines - Set Accumulator based on Carry Flag ISBTF: BCC ISFLS ;If Carry Set ISTRU: LDA #$FF ; Return TRUE RTS ;Else ISFLS: LDA #$00 ; Return FALSE RTS ;C02/ML Character Conversion Routines TOLOWR: JSR ISUPR ;If Char IS Not Upper Case BCC ISRTS ; Return ORA #$20 ;Else Set Bit 5 RTS ; and Return TOUPPR: JSR ISLWR ;If Char IS Not Lower Case BCC ISRTS ; Return AND #$DF ;Else Clear Bit 5 RTS ; and Return ;Machine Language Subroutines - Set/Clear Carry, Preserve Accumulator ISALN: JSR ISDGT ;If Char IS Digit BCS ISRTS ; Return Carry Set ;Else ISALP: JSR ISUPR ;If Char IS Upper Case BCS ISRTS ; Return Carry Set ;Else ISLWR: CMP #$61 ;If Char < 'a' BCC ISRTS ; Return with Carry Clear CMP #$7B ;Else If Char >= '{' JMP ISBCS ; Return with Carry Clear Else Return with Carry Set ISUPR: CMP #$41 ;If Char < 'A' BCC ISRTS ; Return with Carry Clear CMP #$5B ;Else If Char >= '[' ISBCS: BCS ISCLC ; Return with Carry Clear BCC ISSEC ;Else Return with Carry Set ISSEC: SEC ;Set Carry BCS ISRTS ; and Return ISCLC: CLC ;Clear Carry ISRTS: CLV ;Clear Overflow - for C02 calls RTS ;Return from Subroutine ISCTL: CMP #$7F ;If Char = DEL BEQ ISSEC ; Return Carry Set CMP #$20 ;Else If Char < ' ' JMP ISBCS ; Return Carry Set Else Return Carry Clear ISBIN: CMP #$32 ;If Char >= '2' BCS ISCLC ; Return Carry Clear ;Else ISDGT: CMP #$30 ;If Char < '0' BCC ISRTS ; Return Carry Clear CMP #$3A ;Else If Char >= ':' JMP ISBCS ; Return FALSE Else Return TRUE ISPNC: JSR ISALN ;If Char IS Alphanumeric BCS ISCLC ; Return Carry Clear ;Else ISGRP: CMP #$20 ;If Char IS Space BEQ ISCLC ; Return Carry Clear ;Else ISPRT: CMP #$80 ;If Char IS High ASCII BCS ISCLC ; Return Carry Clear JSR ISCTL ;If Char IS Not Control JMP ISBCS ; Return Carry Clear Else Return Carry Set ISSPC: CMP #$20 ;If Char IS ' ' BEQ ISSEC ; Return Carry Set CMP #$09 ;If Char < '\t' BCC ISRTS ; Return Carry Clear CMP #$0E ;Else If Char > '\r' JMP ISBCS ; Return Carry Clear Else Return Carry Set ISHEX: CMP #$41 ;If Char < 'A' BCC ISDGT ; Check for Digit CMP #$47 ;Else If Char < 'G' BCC ISSEC ; Return Carry Set CMP #$61 ;Else If Char < 'a' BCC ISRTS ; Return Carry Clear CMP #$67 ;Else If Char >= 'g' JMP ISBCS ; Return Carry Clear Else Return Carry Set