54 KiB
Disk 7: Convert
Part I: The Conversion Collection
The seventh disk in the library is used for converting between different data types. Some of these are already available on the Apple II via ROM routines, but are included here to show how such conversions work.
Currently, the Conversion Collection only includes macros and subroutines dedicated to converting strings representing different number bases to their equivalent numeric values, but more conversions will be available with more revision.
Conversion Components
The Conversion Collection contains the following components:
- A head file that includes a number of hooks, vectors and subroutines that are necessary for the operation of the whole collection.
- A macro library that includes all of the macros available in the Conversion Collection.
- Subroutines used by the macros; each macro uses a single subroutine for operation.
- A demonstration file that shows how each conversion macro works.
Conversion Collection Header File
Condition | Value |
---|---|
Name | File: HEAD.CONVERT.ASM |
Type | Header File |
Author | Nathan Riggs |
Last Revision | 13-MAY-2021 |
Assembler | Merlin 8 Pro |
OS | Apple DOS 3.3 |
Purpose | Provide appropriate hooks and routines for the Conversion Collection |
Dependencies | none |
Bytes | none |
Notes | none |
See Also | none |
DETAILS
The Conversion Header file currently includes very little, but is included as part of the collection to retain consistency with the rest of the library.
LISTING 7.00: HEAD.CONVERT.ASM Source
*``````````````````````````````*
* HEAD.CONVERT.ASM *
* *
* HOOKS TO AID IN CONVERTING *
* STRINGS TO NUMBERS AND VICE *
* VERSA, AND ALSO IN BETWEEN. *
* *
* AUTHOR: NATHAN RIGGS *
* CONTACT: NATHAN.RIGGS@ *
* OUTLOOK.COM *
* *
* DATE: 13-MAY-2019 *
* ASSEMBLER: MERLIN 8 PRO *
* LICENSE: APACHE 2.0 *
* OS: DOS 3.3 *
* *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
NOP ; OTHERWISE, MERLIN WILL CRASH
; DUE TO EMPTY FILE
Conversion Macros and Subroutines
The MAC.CONVERT.ASM file contains all of the macros associated with data type conversion in the AppleIIAsm library.
Figure 7.01: MAC.CONVERT.ASM Heading
*``````````````````````````````*
* MAC.CONVERT.ASM *
* *
* THIS COLLECTION HOLDS MACROS *
* USED FOR CONVERTING VARIABLE *
* TYPES. *
* *
* AUTHOR: NATHAN RIGGS *
* CONTACT: NATHAN.RIGGS@ *
* OUTLOOK.COM *
* *
* DATE: 13-MAY-2021 *
* ASSEMBLER: MERLIN 8 PRO *
* OS: DOS 3.3 *
* *
* SUBROUTINE FILES NEEDED *
* *
* SUB.BINASC2HEX *
* SUB.HEX2BINASC *
* SUB.HEX2HEXASC *
* SUB.HEX2INTASC *
* SUB.HEXASC2HEX *
* SUB.INTASC2HEX *
* *
* LIST OF MACROS *
* *
* I2STR: INTEGER TO STRING *
* STR2I: STRING TO INTEGER *
* H2STR: HEXADECIMAL TO STRING *
* STR2H: STRING TO HEXADECIMAL *
* B2STR: BINARY TO STRING *
* STR2B: STRING TO BINARY *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
THE I2STR MACRO
SUMMARY
Condition | Value |
---|---|
Name | I2STR |
Type | Macro |
File | MAC.CONVERT.ASM |
Author | Nathan Riggs |
Last Revision | 13-MAY-2021 |
Assembler | Merlin Pro 8 |
OS | Apple DOS 3.3 |
Purpose | convert value to integer string |
Input | ]1 = Value to convert or address of value |
Output | none |
Dependencies | HEX2INTASC |
Flags Destroyed | NZCV |
Cycles | 290+ |
Bytes | 172 |
Notes | none |
See Also | STR2I HEX2INTASC |
DETAILS
The I2STR
macro converts a numeric value into the integer form of its string equivalent. The resulting string is held in RETURN
, with its length held in RETLEN
.
LISTING 7.02: The I2STR Macro Source
*
*``````````````````````````````*
* I2STR *
* *
* CONVERTS A 16BIT INTEGER TO *
* ITS STRING EQUIVALENT. *
* *
* PARAMETERS: *
* *
* ]1 = VALUE TO CONVERT *
* *
* CYCLES: 290+ *
* SIZE: 172 BYTES *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
I2STR MAC
_MLIT ]1;WPAR1 ; {16C12B}
JSR HEX2INTASC ; {274C160B}
<<<
*
THE HEX2INTASC SUBROUTINE
SUMMARY
Condition | Value |
---|---|
Name | HEX2INTASC |
Type | Subroutine |
File | SUB.HEX2INTASC.ASM |
Author | Nathan Riggs |
Last Revision | 13-MAY-2021 |
Assembler | Merlin Pro 8 |
OS | Apple DOS 3.3 |
Purpose | Convert value to integer string |
Input | WPAR1 = Value to convert or address of value |
Output | none |
Dependencies | none |
Flags Destroyed | NZCV |
Cycles | 268+ |
Bytes | 157 |
Notes | none |
See Also | I2STR |
DETAILS
The HEX2INTASC
subroutine accepts a numeric value (or an address pointing to one) and converts it to its string equivalent in decimal base form.
LISTING 7.03: The HEX2INTASC Macro Source
*``````````````````````````````*
* HEX2INTASC (NATHAN RIGGS) *
* *
* CONVERT A SIGNED HEXADECIMAL *
* VALUE TO AN INTEGER STRING. *
* *
* INPUT: *
* *
* WPAR1 = HEX TO CONVERT *
* *
* DESTROYS: NZCIDV *
* ^^^ ^ *
* *
* CYCLES: 268+ *
* SIZE: 157 *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
]NGFLAG EQU VARTAB ; NEGATIVE FLAG
]VALSTR EQU WPAR1 ; HEXADECIMAL TO CONVERT
]MOD10 EQU VARTAB+2 ; VALUE MODULUS 10
*
HEX2INTASC
*
LDA ]VALSTR+1 ; {4C3B} STORE VALUE HIGH BYTE
STA ]NGFLAG ; {4C3B} IN THE NEGATIVE FLAG
BPL :GETBP ; {3C2B} IF VALUE IS POSITIVE, BRANCH
LDA #0 ; {3C2B} ELSE SUBTRACT LOW BYTE
SEC ; {2C1B}
SBC ]VALSTR ; {4C3B}
STA ]VALSTR ; {4C3B} STORE AS NEW LOW BYTE
LDA #0 ; {3C2B} ADJUST HIGH BYTE
SBC ]VALSTR+1 ; {4C3B}
STA ]VALSTR+1 ; {4C3B}
:GETBP
LDA #0 ; {3C2B} SET BUFFER TO EMPTY
LDY #0 ; {3C2B}
STA RETLEN,Y ; {5C2B} BUFFER(0) = 0
*
:CNVERT ; CONVERT VALUE TO STRING
LDA #0 ; {3C2B} RESET MODULUS
STA ]MOD10 ; {4C3B}
STA ]MOD10+1 ; {4C3B}
LDX #16 ; {4C3B}
CLC ; {2C1B} CLEAR CARRY
:DVLOOP
ROL ]VALSTR ; {7C3B} SHIFT CARRY INTO DIVBIT 0
ROL ]VALSTR+1 ; {7C3B} WHICH WILL BE THE QUOTIENT
ROL ]MOD10 ; {7C3B} + SHIFT DIV AT SAME TIME
ROL ]MOD10+1 ; {7C3B}
SEC ; {2C1B} SET CARRY
LDA ]MOD10 ; {4C3B} SUBTRACT #10 (DECIMAL) FROM
SBC #10 ; {4C3B} MODULUS 10
TAY ; {2C1B} SAVE LOW BYTE IN .Y
LDA ]MOD10+1 ; {4C3B} ADJUST HIGHBYTE
SBC #0 ; {4C3B} SUBTRACT CARRY
BCC :DECCNT ; {3C2B} IF DIVIDEND < DIVISOR, DEC CTR
STY ]MOD10 ; {4C3B} ELSE STORE RESULT IN MODULUS
STA ]MOD10+1 ; {4C3B} NEXT BIT OF QUOTIENT IS A 1,
; DIVIDEND = DIVIDEND - DIVISOR
:DECCNT
DEX ; {2C1B} DECREASE .X COUNTER
BNE :DVLOOP ; {3C2B} IF NOT 0, CONTINUE DIVIDING
ROL ]VALSTR ; {7C3B} ELSE SHIFT IN LAST CARRY
ROL ]VALSTR+1 ; {7C3B} FOR QUOTIENT
:CONCH
LDA ]MOD10 ; {4C3B}
CLC ; {2C1B} CLEAR CARRY
ADC #$B0 ; {4C3B} ADD '0' CHARACTER TO VALUE
; TO GET ACTUAL ASCII CHARACTER
JSR :CONCAT ; {6C3B} CONCATENATE TO STRING
*
** IF VALUE <> 0 THEN CONTINUE
*
LDA ]VALSTR ; {4C3B} IF VALUE STILL NOT 0,
ORA ]VALSTR+1 ; {7C3B} OR HIGH BIT, THEN KEEP DIVIDING
BNE :CNVERT ; {3C2B}
*
:EXIT
LDA ]NGFLAG ; {4C3B} IF NEGATIVE FLAG IS SET
BPL :POS ; {3C2B} TO ZERO, THEN NO SIGN NEEDED
LDA #173 ; {3C2B} ELSE PREPEND THE STRING
JSR :CONCAT ; {6C3B} WITH A MINUS SIGN
*
:POS ; VALUE IS POSITIVE
RTS ; {6C1B} RETLEN
*
:CONCAT ; STRING CONCATENATION SUBROUTINE
PHA ; {3C1B} SAVE CHAR ON STACK
*
** MOVE BUFFER RIGHT ONE CHAR
*
LDY #0 ; {3C2B} RESET INDEX
LDA RETLEN,Y ; {5C3B} GET CURRENT STRING LENGTH
TAY ; {2C1B} CURRENT LENGTH IS NOW INDEX
BEQ :EXITMR ; {3C2B} IF LENGTH = 0, EXIT CONCAT
*
:MVELP
LDA RETLEN,Y ; {5C3B} GET NEXT CHARACTER
INY ; {2C1B} INCREASE INDEX
STA RETLEN,Y ; {5C3B} STORE IT
DEY ; {2C1B} DECREASE INDEX BY 2
DEY ; {2C1B}
BNE :MVELP ; {3C2B} LOOP UNTIL INDEX IS 0
:EXITMR
PLA ; {3C1B} GET CHAR BACK FROM STACK
LDY #1 ; {4C3B}
STA RETLEN,Y ; {5C3B} STORE CHAR AS 1ST CHARACTER
LDY #0 ; {3C2B} RESET INDEX
LDA RETLEN,Y ; {5C3B} GET LENGTH BYTE
CLC ; {2C1B} CLEAR CARRY
ADC #1 ; {3C2B} INC LENGTH BY ONE
STA RETLEN,Y ; {5C3B} UPDATE LENGTH
*
LDA RETLEN ; {4C3B}
RTS ; {6C1B}
THE STR2I MACRO
SUMMARY
Condition | Value |
---|---|
Name | STR2I |
Type | Macro |
File | MAC.CONVERT.ASM |
Author | Nathan Riggs |
Last Revision | 13-MAY-2021 |
Assembler | Merlin Pro 8 |
OS | Apple DOS 3.3 |
Purpose | convert integer string to numeric value |
Input | ]1 = string or its address |
Output | none |
Dependencies | INTASC2HEX |
Flags Destroyed | NZCV |
Cycles | 415+ |
Bytes | 196 |
Notes | none |
See Also | I2STR INTASC2HEX |
DETAILS
The STR2I
macro converts a string that contains a number in decimal form into its numeric equivalent.
LISTING 7.04: The STR2I Macro Source
*
*``````````````````````````````*
* STR2I *
* *
* CONVERTS A STRING TO A 16BIT *
* NUMBER EQUIVALENT. *
* *
* PARAMETERS: *
* *
* ]1 = STRING OR ITS ADDRESS *
* *
* CYCLES: 415+ *
* SIZE: 196 BYTES *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
STR2I MAC
_MSTR ]1;WPAR1 ; {16C12B}
JSR INTASC2HEX ; {399C184B}
<<<
*
THE INTASC2HEX SUBROUTINE
SUMMARY
Condition | Value |
---|---|
Name | INTASC2HEX |
Type | Subroutine |
File | SUB.INTASC2HEX.ASM |
Author | Nathan Riggs |
Last Revision | 13-MAY-2021 |
Assembler | Merlin Pro 8 |
OS | Apple DOS 3.3 |
Purpose | Convert decimal strings to numeric value |
Input | WPAR1 = String or address of string |
Output | none |
Dependencies | none |
Flags Destroyed | NZCV |
Cycles | 392+ |
Bytes | 181 |
Notes | none |
See Also | STR2I |
DETAILS
The INTASC2HEX
subroutine converts a string that represents a decimal integer and hands back its numeric value in RETURN
, with the length of the number held in RETLEN
.
LISTING 7.05: The INTASC2HEX Source
*``````````````````````````````*
* INTASC2HEX (NATHAN RIGGS) *
* *
* INPUT: *
* *
* WPAR1 = STRING ADDRESS *
* *
* DESTROYS: NZCIDV *
* ^^^ ^ *
* *
* CYCLES: 392+ *
* SIZE: 181 SIZE *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
]NACCUM EQU VARTAB
]SIGN EQU VARTAB+4
]NINDEX EQU VARTAB+6
]STR EQU WPAR1
*
INTASC2HEX
*
LDY #0 ; {3C2B} INIT INDEX
LDA (]STR),Y ; {6C2B} GET STRING LENGTH
TAX ; {2C1B} TRANSFER TO .X
LDA #1 ; {3C2B} SET NINDEX TO 1
STA ]NINDEX ; {4C3B}
LDA #0 ; {3C2B} INIT ]NACCUM LOW, HIGH
STA ]NACCUM ; {4C3B} ACCUM = 0
STA ]NACCUM+1 ; {4C3B}
STA ]SIGN ; {4C3B} INIT SIGN TO 0 (POSITIVE)
TXA ; {2C1B} TRANSFER .X BACK TO .A
BNE :INIT1 ; {4C3B} IF .A != 0, CONTINUE INIT
JMP :EREXIT ; {3C3B} ELSE, EXIT WITH ERROR--NO STRING
:INIT1
LDY ]NINDEX ; {4C3B} INITIALLY, SET TO 1
LDA (]STR),Y ; {6C2B} LOAD FIRST CHARACTER
CMP #173 ; {3C2B} IF .A != "-"
BNE :PLUS ; {3C2B} THEN NUMBER IS POSITIVE
LDA #$0FF ; {3C2B} ELSE SET FLAG TO NEGATIVE
STA ]SIGN ; {4C3B}
INC ]NINDEX ; {5C2B} INCREASE INDEX
DEX ; {2C1B} DECREMENT LENGTH COUNT
BEQ :EREXIT ; {3C2B} EXIT WITH ERROR IF .X = 0
JMP :CNVERT ; {3C3B}
:PLUS
CMP #'+' ; {3C2B}
BNE :CHKDIG ; {3C2B} START CONVERSION IF 1ST
; CHARACTER IS NOT A +
INC ]NINDEX ; {5C2B} INCREASE NEW INDEX
DEX ; {2C1B} DEC COUNT; IGNORE + SIGN
BEQ :EREXIT ; {3C2B} ERROR EXIT IF ONLY
; + IN THE BUFFER
:CNVERT
LDY ]NINDEX ; {4C3B} GET NEW INDEX
LDA (]STR),Y ; {6C2B} GET NEXT CHARACTER
:CHKDIG ; CHECK DIGIT
CMP #$B0 ; {3C2B} "0"
BMI :EREXIT ; {3C2B} ERROR IF NOT A NUMERAL
CMP #$BA ; {3C2B} '9'+1; TECHNICALLY :
BPL :EREXIT ; {3C2B} ERR IF > 9 (NOT NUMERAL)
PHA ; {3C1B} DIGIT TO STACK
*
** VALID DECIMAL DIGIT SO
** ACCUM = ACCUM * 10
** = ACCUM * (8+2)
** = (ACCUM * 8) + (ACCUM * 2)
*
ASL ]NACCUM ; {6C3B}
ROL ]NACCUM+1 ; {7C3B} TIMES 2
LDA ]NACCUM ; {4C3B}
LDY ]NACCUM+1 ; {4C3B} SAVE ACCUM * 2
ASL ]NACCUM ; {6C3B}
ROL ]NACCUM+1 ; {7C3B}
ASL ]NACCUM ; {6C3B}
ROL ]NACCUM+1 ; {7C3B} TIMES 8
CLC ; {2C1B}
ADC ]NACCUM ; {4C3B} SUM WITH * 2
STA ]NACCUM ; {4C3B}
TYA ; {2C1B}
ADC ]NACCUM+1 ; {4C3B}
STA ]NACCUM+1 ; {4C3B} ACCUM=ACCUM * 10
*
PLA ; {3C1B} GET THE DIGIT FROM STACK
SEC ; {2C1B} SET CARRY
SBC #$B0 ; {2C2B} SUBTRACT ASCII '0'
CLC ; {2C1B} CLEAR CARRY
ADC ]NACCUM ; {4C3B} ADD TO ACCUMULATION
STA ]NACCUM ; {4C3B} STORE IN ACCUMULATION
LDA #0 ; {3C2B} NOW ADJUST HIGH BYTE
ADC ]NACCUM+1 ; {4C3B}
STA ]NACCUM+1 ; {4C3B}
INC ]NINDEX ; {5C3B} INC TO NEXT CHARACTER
DEX ; {2C1B} DECREMENT .X COUNTER
BNE :CNVERT ; {3C2B} IF .X != 0, CONTINUE CONVERSION
LDA ]SIGN ; {4C3B} ELSE LOAD SIGN FLAG
BPL :OKEXIT ; {3C2B} IF POSITIVE, EXIT WITHOUT ERROR
LDA #0 ; {4C3B} ELSE SET THE VALUE TO NEGATIVE
SEC ; {2C1B} SET CARRY
SBC ]NACCUM ; {4C3B} 0 - ]NACCUM
STA ]NACCUM ; {4C3B} STORE AS ]NACCUM
LDA #0 ; {3C2B} ADJUST HIGHBYTE
SBC ]NACCUM+1 ; {4C3B}
STA ]NACCUM+1 ; {4C3B}
*
:OKEXIT
CLC ; {2C1B} CLEAR CARRY TO SIGNIFY NO ERRORS
BCC :EXIT ; {3C2B}
:EREXIT
SEC ; {2C1B} SET CARRY TO INIDICATE ERROR
:EXIT
LDA #2 ; {3C2B} BYTE LENGTH IS 2
STA RETLEN ; {4C3B}
LDX ]NACCUM+1 ; {4C3B} LOAD HIGH BYTE INTO .X
LDA ]NACCUM ; {4C3B} AND LOW BYTE INTO .A
STA RETURN ; {4C3B} ALSO STORE RESULT IN RETURN
STX RETURN+1 ; {4C3B}
RTS ; {6C1B}
THE H2STR MACRO
SUMMARY
Condition | Value |
---|---|
Name | H2STR |
Type | Macro |
File | MAC.CONVERT.ASM |
Author | Nathan Riggs |
Last Revision | 13-MAY-2021 |
Assembler | Merlin Pro 8 |
OS | Apple DOS 3.3 |
Purpose | convert numeric value into its hexadecimal string equivalent |
Input | ]1 = value or its address |
Output | none |
Dependencies | HEX2HEXASC |
Flags Destroyed | NZCV |
Cycles | 97+ |
Bytes | 59 |
Notes | none |
See Also | STR2H HEX2HEXASC |
DETAILS
The H2STR
macro converts a numeric value into its string equivalent in a hexadecimal base.
LISTING 7.06: The H2STR Macro Source
*
*``````````````````````````````*
* H2STR *
* *
* CONVERTS A HEX BYTE INTO AN *
* EQUIVALENT STRING IN HEX. *
* *
* PARAMETERS: *
* *
* ]1 = HEX VALUE TO CONVERT *
* OR THE ADDRESS *
* *
* CYCLES: 97+ *
* SIZE: 59 BYTES *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
H2STR MAC
LDA ]1 ; {4C3B}
JSR HEX2HEXASC ; {93C56B}
<<<
*
THE HEX2HEXASC SUBROUTINE
SUMMARY
Condition | Value |
---|---|
Name | HEX2HEXASC |
Type | Subroutine |
File | SUB.HEX2HEXASC.ASM |
Author | Nathan Riggs |
Last Revision | 13-MAY-2021 |
Assembler | Merlin Pro 8 |
OS | Apple DOS 3.3 |
Purpose | Convert numeric value to hexadecimal string |
Input | WPAR1 = Value or address to value |
Output | none |
Dependencies | none |
Flags Destroyed | NZCV |
Cycles | 87+ |
Bytes | 53 |
Notes | none |
See Also | H2HSTR |
DETAILS
The HEX2HEXASC
subroutine takes a numeric value and returns its string equivalent in a hexadecimal base.
LISTING 7.07: The HEX2HEXASC Source
*``````````````````````````````*
* HEX2HEXASC (NATHAN RIGGS) *
* *
* INPUT: *
* *
* .A = HEX TO CONVERT *
* *
* DESTROY: NZCIDV *
* ^^^ ^ *
* *
* CYCLES: 87+ *
* SIZE: 53 BYTES *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
]LEFT EQU VARTAB ; LEFT NIBBLE
]RIGHT EQU VARTAB+2 ; RIGHT NIBBLE
]HBYTE EQU VARTAB+4 ; HEX BYTE TO CONVERT
]HEXTAB ASC "0123456789ABCDEF" ; HEX LOOKUP TABLE
*
HEX2HEXASC
STA ]HBYTE ; {4C3B} STORE HEX PASSED VIA .A
AND #$F0 ; {2C2B} MASK RIGHT
LSR ; {2C1B}
LSR ; {2C1B}
LSR ; {2C1B}
LSR ; {2C1B}
STA ]LEFT ; {4C3B} STORE LEFT NIBBLE
LDA ]HBYTE ; {4C3B}
AND #$0F ; {2C2B} MASK LEFT
STA ]RIGHT ; {4C3B} STORE RIGHT NIBBLE
LDX ]LEFT ; {4C3B} GET THE LEFT CHARACTER
LDA ]HEXTAB,X ; {6C2B} FROM LOOKUP TABLE
STA ]LEFT ; {4C3B}
LDX ]RIGHT ; {4C3B} GET THE RIGHT CHARACTER
LDA ]HEXTAB,X ; {6C2B} FROM LOOKUP TABLE
STA ]RIGHT ; {4C3B}
LDA ]LEFT ; {6C2B} STORE LEFT IN RETURN
STA RETURN ; {4C3B}
LDA ]RIGHT ; {4C3B} STORE RIGHT IN NEXT BYTE
STA RETURN+1 ; {4C3B}
LDA #2 ; {3C2B} LENGTH IN RETLEN AND .A
STA RETLEN ; {4C3B}
RTS ; {6C1B}
THE STR2H MACRO
SUMMARY
Condition | Value |
---|---|
Name | STR2H |
Type | Macro |
File | MAC.CONVERT.ASM |
Author | Nathan Riggs |
Last Revision | 13-MAY-2021 |
Assembler | Merlin Pro 8 |
OS | Apple DOS 3.3 |
Purpose | Convert a string representing a numeric value in hexadecimal to its numeric form |
Input | ]1 = String or its address |
Output | none |
Dependencies | HEXASC2HEX |
Flags Destroyed | NZCV |
Cycles | 116+ |
Bytes | 71 |
Notes | none |
See Also | H2STR HEXASC2HEX |
DETAILS
The STR2H
macro accepts a string containing characters that represent a hexadecimal number and passes back the equivalent numeric value in RETURN
with the number's length in RETLEN
.
LISTING 7.08: The STR2H Macro Source
*
*``````````````````````````````*
* STR2H *
* *
* CONVERTS A HEX STRING TO ITS *
* EQUIVALENT HEX BYTE. *
* *
* PARAMETERS: *
* *
* ]1 = STRING OR ITS ADDRESS *
* *
* CYCLES: 116+ *
* SIZE: 71 BYTES *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
STR2H MAC
_MSTR ]1;WPAR1 ; {16C12B}
JSR HEXASC2HEX ; {100C59B}
<<<
*
THE HEXASC2HEX SUBROUTINE
SUMMARY
Condition | Value |
---|---|
Name | HEXASC2HEX |
Type | Subroutine |
File | SUB.HEXASC2HEX.ASM |
Author | Nathan Riggs |
Last Revision | 13-MAY-2021 |
Assembler | Merlin Pro 8 |
OS | Apple DOS 3.3 |
Purpose | Convert a string representing a hexadecimal number into its equivalent numeric form. |
Input | WPAR11 =String or its address |
Output | none |
Dependencies | none |
Flags Destroyed | NZCV |
Cycles | 94+ |
Bytes | 56 |
Notes | none |
See Also | STR2H |
DETAILS
The HEXASC2HEX
subroutine converts a string that represents a hexadecimal byte and converts it to its numeric value. This value is passed back in RETURN
, with its length held in RETLEN
.
LISTING 7.09: The HEXASC2HEX Source
*``````````````````````````````*
* HEXASC2HEX *
* *
* INPUT: *
* *
* WPAR1 = HEX STRING ADDRESS *
* *
* DESTROYS: NZCIDV *
* ^^^ ^ *
* *
* CYCLES: 94+ *
* SIZE: 56 BYTES *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
]HI EQU VARTAB ; HIGH BYTE
]LO EQU VARTAB+2 ; LOW BYTE
]STR EQU WPAR1 ; ADDR OF STRING TO CONVERT
*
HEXASC2HEX
LDY #1 ; {3C2B} GET FIRST HEX CHARACTER
LDA (]STR),Y ; {6C2B}
STA ]HI ; {4C3B} STORE IN HIBYTE
INY ; {2C1B} INCREASE INDEX
LDA (]STR),Y ; {6C2B} TO GET SECOND HEX CHARACTER
STA ]LO ; {4C3B} AND STORE THAT IN LOW BYTE
*
SEC ; {2C1B} SET CARRY
SBC #'0' ; {3C2B} SUBTRACT '0' CHAR FROM ]LO CHAR
CMP #10 ; {3C2B} ASCII NUMERALS OFFSET
BCC :CONT ; {3C2B} IF NUMERAL, CONTINUE
SBC #7 ; {2C2B} OTHERWISE SUBTRACT LETTER OFFSET
:CONT
STA ]LO ; {4C3B} STORE VALUE INTO LOW BYTE
LDA ]HI ; {4C3B} NO WORK ON HIGH BYTE
SEC ; {2C1B} SET CARRY
SBC #'0' ; {2C2B} SUBTRACT '0' ASCII
CMP #10 ; {3C2B} IS NUMBER?
BCC :C2 ; {3C2B} THEN DONE
SBC #7 ; {2C2B} OTHERWISE LETTER OFFSET
:C2
STA ]HI ; {4C3B} STORE HIGH BYTE VALUE
ASL ; {2C1B} CLEAR LOW BYTE OF ]HI
ASL ; {2C1B}
ASL ; {2C1B}
ASL ; {2C1B}
ORA ]LO ; {7C3B} OR OPERATION TO INSERT
; LOW BYTE INTO RESULT
LDY #1 ; {3C2B} SET LENGTH OF RETURN
STY RETLEN ; {4C3B}
STA RETURN ; {4C3B} PASS BACK VIA RETURN AND .A
RTS ; {6C1B}
THE B2STR MACRO
SUMMARY
Condition | Value |
---|---|
Name | B2STR |
Type | Macro |
File | MAC.CONVERT.ASM |
Author | Nathan Riggs |
Last Revision | 13-MAY-2021 |
Assembler | Merlin Pro 8 |
OS | Apple DOS 3.3 |
Purpose | Convert a numeric value into a string representing the number's binary form. |
Input | ]1 = Value or its address |
Output | none |
Dependencies | HEX2BINASC |
Flags Destroyed | NZCV |
Cycles | 262+ |
Bytes | 167 |
Notes | none |
See Also | STR2B HEX2BINASC |
DETAILS
The STR2H
macro accepts a string containing characters that represent a hexadecimal number and passes back the equivalent numeric value in RETURN
with the number's length in RETLEN
.
LISTING 7.10: The B2STR Macro Source
*
*``````````````````````````````*
* B2STR *
* *
* CONVERTS A HEX VALUE TO ITS *
* EQUIVALENT BINARY STRING. *
* *
* PARAMETERS: *
* *
* ]1 = HEX VALUE OR ADDRESS *
* *
* CYCLES: 262+ *
* SIZE: 167 BYTES *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
B2STR MAC
LDA ]1 ; {4C3B}
STA BPAR1 ; {3C2B}
JSR HEX2BINASC ; {255C162C}
<<<
*
THE HEX2BINASC SUBROUTINE
SUMMARY
Condition | Value |
---|---|
Name | HEX2BINASC |
Type | Subroutine |
File | SUB.HEX2BINASC.ASM |
Author | Nathan Riggs |
Last Revision | 13-MAY-2021 |
Assembler | Merlin Pro 8 |
OS | Apple DOS 3.3 |
Purpose | Convert a numeric value to a string in binary. |
Input | BPAR1 =Value or its address |
Output | none |
Dependencies | none |
Flags Destroyed | NZCV |
Cycles | 249+ |
Bytes | 159 |
Notes | none |
See Also | B2STR |
DETAILS
The HEX2BINASC
subroutine converts a given value to its string equivalent in binary form. The string is passed back in RETURN
with its length held in RETLEN
.
LISTING 7.11: The HEX2BINASC Source
*``````````````````````````````*
* HEX2BINASC (NATHAN RIGGS) *
* *
* INPUT: *
* *
* BPAR1 = HEX BYTE TO CONVERT *
* *
* DESTROY: NZCIDV *
* ^^^ ^ *
* *
* CYCLES: 249+ *
* SIZE: 159 BYTES *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
]BINTAB ASC "0000" ; 0 {0C4B}
ASC "0001" ; 1 {0C4B}
ASC "0010" ; 2 {0C4B}
ASC "0011" ; 3 {0C4B}
ASC "0100" ; 4 {0C4B}
ASC "0101" ; 5 {0C4B}
ASC "0110" ; 6 {0C4B}
ASC "0111" ; 7 {0C4B}
ASC "1000" ; 8 {0C4B}
ASC "1001" ; 9 {0C4B}
ASC "1010" ; A {0C4B}
ASC "1011" ; B {0C4B}
ASC "1100" ; C {0C4B}
ASC "1101" ; D {0C4B}
ASC "1110" ; E {0C4B}
ASC "1111" ; F {0C4B}
*
]LEFT EQU VARTAB ; LEFT NIBBLE
]RIGHT EQU VARTAB+2 ; RIGHT NIBBLE
]HBYTE EQU BPAR1 ; HEX BYTE
*
HEX2BINASC
*
LDA ]HBYTE ; {4C3B}
AND #$F0 ; {4C3B} FIRST, MASK THE RIGHT NIBBLE
LSR ; {2C1B} SHIFT RIGHT
LSR ; {2C1B} SHIFT RIGHT
LSR ; {2C1B} SHIFT RIGHT
LSR ; {2C1B} SHIFT RIGHT
STA ]LEFT ; {4C3B} STORE AS LEFT NIBBLE
LDA ]HBYTE ; {4C3B}
AND #$0F ; {4C3B} NOW MASK LEFT NIBBLE
STA ]RIGHT ; {4C3B} STORE AS RIGHT NIBBLE
*
** GET LEFT FROM LOOKUP TABLE
*
ASL ]LEFT ; {6C3B} MULTIPLY ]LEFT NIBBLE
ASL ]LEFT ; {6C3B} BY FOUR
LDX ]LEFT ; {4C3B} TO GET LOOKUP TABLE OFFSET
LDA ]BINTAB,X ; {5C3B} TRANSFER APPROPRIATE
STA RETURN ; {4C3B} PART OF THE TABLE TO RETURN
LDA ]BINTAB,X+1 ;{5C3B}
STA RETURN+1 ; {4C3B}
LDA ]BINTAB,X+2 ;{5C3B}
STA RETURN+2 ; {4C3B}
LDA ]BINTAB,X+3 ;{5C3B}
STA RETURN+3 ; {4C3B}
*
** NOW GET RIGHT
*
ASL ]RIGHT ; {6C3B} MULTIPLY ]RIGHT BY 4
ASL ]RIGHT ; {6C3B} TO GET LOOKUP TABLE OFFSET
LDX ]RIGHT ; {4C3B}
LDA ]BINTAB,X ; {5C3B} AND TRANSFER APPROPRIATE
STA RETURN+4 ; {4C3B} STRING TO RETURN AFTER
LDA ]BINTAB,X+1 ;{5C3B} THE PREVIOUS NIBBLE
STA RETURN+5 ; {4C3B}
LDA ]BINTAB,X+2; {5C3B}
STA RETURN+6 ; {4C3B}
LDA ]BINTAB,X+3 ;{5C3B}
STA RETURN+7 ; {4C3B}
*
LDA #8 ; {3C2B} LENGTH IN .A AND RETLEN
STA RETLEN ; {4C3B}
RTS ; {6C1B}
THE STR2B MACRO
SUMMARY
Condition | Value |
---|---|
Name | STR2B |
Type | Macro |
File | MAC.CONVERT.ASM |
Author | Nathan Riggs |
Last Revision | 13-MAY-2021 |
Assembler | Merlin Pro 8 |
OS | Apple DOS 3.3 |
Purpose | Convert a binary string to numeric value |
Input | ]1 = String or its address |
Output | none |
Dependencies | BINASC2HEX |
Flags Destroyed | NZCV |
Cycles | 501+ |
Bytes | 331 |
Notes | none |
See Also | B2STR BINASC2HEX |
DETAILS
The STR2B
macro converts a string representing a binary number into its numeric equivalent, passing the value back in RETURN
.
LISTING 7.12: The STR2B Macro Source
*
*``````````````````````````````*
* STR2B *
* *
* CONVERTS A BINARY STRING TO *
* EQUIVALENT HEX VALUE. *
* *
* PARAMETERS: *
* *
* ]1 = STRING OR ITS ADDRESS *
* *
* CYCLES: 501+ *
* SIZE: 331 BYTES *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
STR2B MAC
_MSTR ]1;WPAR1 ; {16C12B}
JSR BINASC2HEX ; {485C319B}
<<<
THE BINASC2HEX SUBROUTINE
SUMMARY
Condition | Value |
---|---|
Name | BINASC2HEX |
Type | Subroutine |
File | SUB.BINASC2HEX.ASM |
Author | Nathan Riggs |
Last Revision | 13-MAY-2021 |
Assembler | Merlin Pro 8 |
OS | Apple DOS 3.3 |
Purpose | Convert a binary string to a number. |
Input | WPAR1 = String or its address |
Output | none |
Dependencies | none |
Flags Destroyed | NZCV |
Cycles | 513+ |
Bytes | 329 |
Notes | none |
See Also | STR2B |
DETAILS
The BINASC2HEX
subroutine accepts a string that represents an 8-bit binary value and passes back its numeric equivalent in RETURN
. Since this subroutine only accepts an 8-bit value (a byte), RETLEN
always contains #1 after the subroutine is called.
LISTING 7.13: The BINASC2HEX Source
*``````````````````````````````*
* BINASC2HEX (NATHAN RIGGS) *
* *
* CONVERTS A STRING HOLDING *
* 8 CHARACTERS OF 0S AND 1S *
* THAT SIGNIFY A BYTE INTO THE *
* APPROPRIATE HEX VALUE. *
* *
* INPUT: *
* *
* WPAR1 = STRING ADDRESS PTR *
* *
* DESTROY: NZCIDV *
* ^^^ ^ *
* *
* CYCLES: 513+ *
* SIZE: 329 BYTES *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
]HIGH EQU VARTAB
]LOW EQU VARTAB+2
]NIB EQU VARTAB+4
]STR EQU WPAR1
*
BINASC2HEX
*
JSR :TESTNIB ; {6C3B} FIRST CHECK HIGH NIBBLE
LDA ]NIB ; {4C3B} (1ST 4 'BITS' IN THE STRING)
STA ]HIGH ; {4C3B} AND STORE HEX IN ]HIGH
*
CLC ; {2C1B}
ASL ]HIGH ; {6C3B}
ASL ]HIGH ; {6C3B}
ASL ]HIGH ; {6C3B}
ASL ]HIGH ; {6C3B}
*
LDA ]STR ; {3C2B} ADD 4 TO THE STRING ADDRESS
CLC ; {2C1B} TO GET THE LOW NIBBLE
ADC #4 ; {2C2B} STRING ADDRESS
STA ]STR ; {3C2B}
LDA ]STR+1 ; {3C2B} MAKE SURE TO ADJUST
ADC #0 ; {2C2B} THE HIGH BYTE
STA ]STR+1 ; {3C2B}
JSR :TESTNIB ; {6C3B} TEST LOW NIBBLE OF STRING
LDA ]NIB ; {4C3B}
STA ]LOW ; {4C3B} AND STORE THE LOW NIBBLE HEX
*
LDA #1 ; {3C2B} STORE BYTE LENGTH
STA RETLEN ; {4C3B} IN RETLEN
LDA ]HIGH ; {4C3B} LOAD HIGH NIBBLE AND
ORA ]LOW ; {4C3B} EXCLUSIVE-OR IT WITH LOW NIB
STA RETURN ; {4C3B} TO GET COMPLETE BYTE
JMP :EXIT ; {3C3B}
*
** THE :TESTNIB SUBROUTINE TRANSLATES
** A BINARY NIBBLE STRING REPRESENTATION INTO
** ITS EQUIVALENT HEXADECIMAL CODE
*
:TESTNIB
LDY #1 ; {3C2B} START AT FIRST BINARY DIGIT
LDA (]STR),Y ; {6C2B} GET EITHER 0 OR 1 CHARACTER
CMP #"0" ; {3C2B} IF = 0
BEQ :_07 ; {3C2B} THEN NIB IS BETWEEN 0 AND 7
JMP :_8F ; {3C2B} ELSE IT IS BETWEEN 8 AND F
:_07
LDY #2 ; {3C2B} CHECK SECOND STRING DIGIT
LDA (]STR),Y ; {6C2B} AGAIN, GET 0 OR 1
CMP #"0" ; {3C2B} IF = 0
BEQ :_03 ; {3C2B} THEN NIBBLE BETWEEN 0 AND 3
JMP :_47 ; {3C3B} ELSE IT IS BETWEEN 4 AND 7
:_03
LDY #3 ; {3C2B} THIRD DIGIT OF NIBBLE
LDA (]STR),Y ; {6C2B} GET 0 OR 1 FROM STRING
CMP #"0" ; {3C2B} IF = 0,
BEQ :_01 ; {3C2B} NIBBLE IS EITHER 0 OR 1
JMP :_23 ; {3C3B} ELSE EITHER 2 OR 3
:_01
LDY #4 ; {3C2B} LAST BIT OF NIBBLE STRING
LDA (]STR),Y ; {6C2B} GET EITHER 0 OR 1
CMP #"0" ; {3C2B} IF IT IS 0,
BEQ :_00 ; {3C2B} FIRST NIBBLE IS 0
LDA #1 ; {3C2B} ELSE IT IS 1
STA ]NIB ; {4C3B} STORE NIBBLE
JMP :EXIT ; {3C3B}
:_00 LDA #0 ; {3C2B} NIBBLE IS 0000
STA ]NIB ; {4C3B}
JMP :EXIT ; {3C3B}
*
:_23 LDY #4 ; {3C2B} READ 4TH BIT IN NIBBLE
LDA (]STR),Y ; {6C2B}
CMP #"0" ; {3C2B} IF = "0",
BEQ :_02 ; {3C2B} THEN THE FIRST NIBBLE IS 2
LDA #3 ; {3C2B} ELSE IT IS 3
STA ]NIB ; {4C3B}
JMP :EXIT ; {3C3B}
:_02 LDA #$2 ; {3C2B} NIBBLE IS 2
STA ]NIB ; {4C3B}
JMP :EXIT ; {3C3B}
:_47
LDY #3 ; {3C2B} READ 3RD BIT FROM STRING
LDA (]STR),Y ; {6C2B}
CMP #"0" ; {3C2B} IF = "0",
BEQ :_45 ; {3C2B} THEN 1ST NIBBLE IS 4 OR 5
JMP :_67 ; {3C3B} ELSE IT IS 6 OR 7
:_45
LDY #3 ; {3C2B} CHECK 4TH BIT OF BIN STRING
LDA (]STR),Y ; {6C2B}
CMP #"0" ; {3C2B} IF = "0",
BEQ :_4 ; {3C2B} THEN FIRST NIB IS 4
LDA #$5 ; {3C2B} ELSE IT IS 5
STA ]NIB ; {4C3B}
JMP :EXIT ; {3C3B}
:_4 LDA #$4 ; {3C2B} NIBBLE = 4
STA ]NIB ; {4C3B}
JMP :EXIT ; {3C3B}
:_67
LDY #4 ; {3C2B} CHECK 4TH BIT IN STRING
LDA (]STR),Y ; {6C2B}
CMP #"0" ; {3C2B} IF = "0"
BEQ :_6 ; {3C2B} THEN THE FIRST NIB IS 6
LDA #$7 ; {3C2B} ELSE IT IS 7
STA ]NIB ; {4C3B}
JMP :EXIT ; {3C3B}
:_6 LDA #$6 ; {4C3B} NIBBLE = 6
STA ]NIB ; {4C3B}
JMP :EXIT ; {3C3B}
*
:_8F ; CHECK VALUE BETWEEN 8 AND F
LDY #2 ; {3C2B} CHECK SECOND BIT
LDA (]STR),Y ; {6C2B}
CMP #"0" ; {3C2B} IF = "0",
BEQ :_8B ; {3C2B} THEN NIB IS BETWEEN 8 AND B
JMP :_CF ; {3C3B} OTHERWISE BETWEEN C AND F
:_8B ; CHECK VALUES 8-B
LDY #3 ; {3C2B} CHECK 3RD BIT
LDA (]STR),Y ; {6C2B}
CMP #"0" ; {3C2B} IF = "0",
BEQ :_89 ; {3C2B} NIBBLE IS EITHER 8 OR 9
JMP :_AB ; {3C3B} ELSE IT IS BETWEEN A AND B
:_89 ; TEST WHETHER 8 OR 9
LDY #4 ; {3C2B} CHECK 4TH BIT
LDA (]STR),Y ; {6C2B}
CMP #"0" ; {3C2B} IF = "0",
BEQ :_8 ; {3C2B} THEN NIBBLE IS 8
LDA #9 ; {3C2B} ELSE, IS 9
STA ]NIB ; {4C3B}
JMP :EXIT ; {3C3B}
:_8 LDA #$8 ; {3C2B} NIBBLE = 8
STA ]NIB ; {3C2B}
JMP :EXIT ; {3C3B}
:_AB ; NIBBLE IS EITHER A OR B
LDY #4 ; {3C2B} CHECK 4TH BIT
LDA (]STR),Y ; {6C2B}
CMP #"0" ; {3C2B} IF = "0"
BEQ :_A ; {3C2B} THEN NIBBLE IS A
LDA #$B ; {3C2B} OTHERWISE, IT'S B
STA ]NIB ; {4C3B}
JMP :EXIT ; {3C3B}
:_A LDA #$A ; {3C2B} NIBBLE IS A
STA ]NIB ; {4C3B}
JMP :EXIT ; {3C3B}
:_CF ; NIBBLE IS BETWEEN C AND F
LDY #3 ; {3C2B} CHECK 3RD BIT
LDA (]STR),Y ; {6C2B}
CMP #"0" ; {3C2B} IF = "0",
BEQ :_CD ; {3C2B} THEN IT IS EITHER C AND D
JMP :_EF ; {3C3B} OTHERWISE, BETWEEN E AND F
:_CD ; NIBBLE IS EITHER C OR D
LDY #4 ; {3C2B} CHECK 4TH BIT
LDA (]STR),Y ; {6C2B}
CMP #"0" ; {3C2B} IF IT IS "0",
BEQ :_C ; {3C2B} THEN NIBBLE IS C
LDA #$D ; {3C2B} OTHERWISE, IT'S D
STA ]NIB ; {4C3B}
JMP :EXIT ; {3C3B}
:_C LDA #$C ; {4C3B} NIBBLE IS C
STA ]NIB ; {4C3B}
JMP :EXIT ; {3C3B}
:_EF ; NIBBLE IS EITHER E OR F
LDY #4 ; {3C2B} CHECK 4TH BIT
LDA (]STR),Y ; {6C2B}
CMP #"0" ; {3C2B} IF IT IS "0",
BEQ :_E ; {3C2B} THEN NIBBLE IS E
LDA #$F ; {3C2B} OTHERWISE, F
STA ]NIB ; {4C3B}
JMP :EXIT ; {3C3B}
:_E LDA #$E ; {4C3B} SET TO E
STA ]NIB ; {4C3B}
:EXIT
RTS ; {6C1B}
Part II: Conversion Collection Demo
Listing 7.14 illustrates how each of the macros in the Conversion Collection is used.
LISTING 7.14: DEMO.CONVERT.ASM Source
*
*``````````````````````````````*
* DEMO.CONVERT.ASM *
* *
* A DEMO OF THE CONVERSION *
* MACROS. *
* *
* AUTHOR: NATHAN RIGGS *
* CONTACT: NATHAN.RIGGS@ *
* OUTLOOK.COM *
* *
* DATE: 13-MAY-2021 *
* ASSEMBLER: MERLIN 8 PRO *
* OS: DOS 3.3 *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
** ASSEMBLER DIRECTIVES
*
CYC AVE
EXP OFF
TR ON
DSK DEMO.CONVERT
OBJ $BFE0
ORG $6000
*
*``````````````````````````````*
* TOP INCLUDES (PUTS, MACROS) *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
PUT MIN.HEAD.REQUIRED.ASM
USE MIN.MAC.REQUIRED.ASM
USE MIN.MAC.CONVERT.ASM
PUT MIN.HEAD.CONVERT.ASM
*
*``````````````````````````````*
* PROGRAM MAIN BODY *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
]HOME EQU $FC58
]XCOUT EQU $FDF0
*
*``````````````````````````````*
* INTEGER TO STRING *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
** THE I2STR MACRO, WHICH STANDS FOR INTEGER TO STRING,
** CONVERTS A NUMERIC VALUE INTO ITS INTEGER STRING
** EQUIVALENT. THIS STRING IS THEN STORED IN RETURN.
*
JSR ]HOME
_PRN "I2STR MACRO",8D
_PRN "===========",8D8D
I2STR #5309
_PRN "I2STR #5309 = "
_WAIT
LDA RETURN
JSR ]XCOUT
LDA RETURN+1
JSR ]XCOUT
LDA RETURN+2
JSR ]XCOUT
LDA RETURN+3
JSR ]XCOUT
_WAIT
*
*``````````````````````````````*
* STRING TO INTEGER *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
** THE STR2I (STRING TO INTEGER) MACRO TAKES A STRING
** THAT REPRESENTS AN INTEGER AND RETURNS ITS EQUIVALENT
** NUMERIC VALUE.
*
JSR ]HOME
_PRN "THE STR2I MACRO",8D
_PRN "===============",8D8D
_PRN "STR2I '255' = "
STR2I "255"
_WAIT
DUMP #RETURN;#2
_WAIT
*
*``````````````````````````````*
* HEXADECIMAL TO STRING *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
** THE H2STR (HEXADECIMAL TO STRING) MACRO CONVERTS
** A HEXADECIMAL VALUE TO ITS STRING EQUIVALENT.
*
JSR ]HOME
_PRN "HEXADECIMAL TO STRING",8D
_PRN "=====================",8D8D
_PRN "H2STR #$FF = "
_WAIT
H2STR #$FF
LDA RETURN
JSR ]XCOUT
LDA RETURN+1
JSR ]XCOUT
_WAIT
*
*``````````````````````````````*
* STRING TO HEXADECIMAL *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
** THE STR2H (STRING TO HEXADECIMAL) MACRO CONVERTS
** A STRING INTO ITS HEXADECIMAL EQUIVALENT.
*
JSR ]HOME
_PRN "STRING TO HEXADECIMAL",8D
_PRN "=====================",8D8D
_PRN "STR2H 'FF' = "
_WAIT
STR2H "FF"
DUMP #RETURN;#1
_WAIT
*
*``````````````````````````````*
* STRING TO BINARY *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
** THE STR2B (STRING TO BINARY) MACRO CONVERTS A
** STRING OF ONES AND ZEROES TO ITS EQUIVALENT
** NUMERIC VALUE.
*
JSR ]HOME
_PRN "BINARY TO STRING",8D
_PRN "================",8D8D
_PRN "STR2B '00110011' ="
_WAIT
STR2B #BIN
DUMP #RETURN;#1
_WAIT
*
*``````````````````````````````*
* BINARY TO STRING *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
** THE B2STR (BINARY TO STRING) MACRO CONVERTS A
** NUMERIC VALUE INTO AN EQUIVALENT STRING IN BINARY
** FORM.
*
JSR ]HOME
_PRN "BINARY TO STRING",8D
_PRN "===============",8D8D
_PRN "B2STR #$FF = "
_WAIT
B2STR #$FF
LDA RETURN
JSR ]XCOUT
LDA RETURN+1
JSR ]XCOUT
LDA RETURN+2
JSR ]XCOUT
LDA RETURN+3
JSR ]XCOUT
LDA RETURN+4
JSR ]XCOUT
LDA RETURN+5
JSR ]XCOUT
LDA RETURN+6
JSR ]XCOUT
LDA RETURN+7
JSR ]XCOUT
_WAIT
*
JSR ]HOME
_PRN "FIN.",8D8D8D
*
JMP REENTRY
*
*``````````````````````````````*
* BOTTOM INCLUDES *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
** BOTTOM INCLUDES
*
PUT MIN.LIB.REQUIRED.ASM
*
** INDIVIDUAL SUBROUTINE INCLUDES
*
PUT MIN.SUB.HEX2INTASC.ASM
PUT MIN.SUB.INTASC2HEX.ASM
PUT MIN.SUB.HEX2BINASC.ASM
PUT MIN.SUB.BINASC2HEX.ASM
PUT MIN.SUB.HEX2HEXASC.ASM
PUT MIN.SUB.HEXASC2HEX.ASM
*
BIN STR "00110011"
*