mirror of
https://github.com/nathanriggs/AppleIIAsm-Collection.git
synced 2024-12-03 18:49:28 +00:00
125 lines
4.2 KiB
NASM
125 lines
4.2 KiB
NASM
|
*``````````````````````````````*
|
||
|
* INTASC2HEX (NATHAN RIGGS) *
|
||
|
* *
|
||
|
* INPUT: *
|
||
|
* *
|
||
|
* WPAR1 = STRING ADDRESS *
|
||
|
* *
|
||
|
* OUTPUT: *
|
||
|
* *
|
||
|
* .A = HEX VALUE LOW BYTE *
|
||
|
* .X = HEX VALUE HIGH BYTE *
|
||
|
* RETURN = HEX VALUE *
|
||
|
* RETLEN = 2 *
|
||
|
* *
|
||
|
* DESTROYS: AXYNVBDIZCMS *
|
||
|
* ^^^^ ^^^ *
|
||
|
* *
|
||
|
* CYCLES: 266+ *
|
||
|
* SIZE: 196 BYTES *
|
||
|
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
||
|
*
|
||
|
]NACCUM EQU VARTAB
|
||
|
]SIGN EQU VARTAB+4
|
||
|
]NINDEX EQU VARTAB+6
|
||
|
]STR EQU WPAR1
|
||
|
*
|
||
|
INTASC2HEX
|
||
|
*
|
||
|
LDY #0 ; INIT INDEX
|
||
|
LDA (]STR),Y ; GET STRING LENGTH
|
||
|
TAX ; TRANSFER TO .X
|
||
|
LDA #1 ; SET NINDEX TO 1
|
||
|
STA ]NINDEX ;
|
||
|
LDA #0 ; INIT ]NACCUM LOW, HIGH
|
||
|
STA ]NACCUM ; ACCUM = 0
|
||
|
STA ]NACCUM+1
|
||
|
STA ]SIGN ; INIT SIGN TO 0 (POSITIVE)
|
||
|
TXA ; TRANSFER .X BACK TO .A
|
||
|
BNE :INIT1 ; IF .A != 0, CONTINUE INIT
|
||
|
JMP :EREXIT ; ELSE, EXIT WITH ERROR--NO STRING
|
||
|
:INIT1
|
||
|
LDY ]NINDEX ; INITIALLY, SET TO 1
|
||
|
LDA (]STR),Y ; LOAD FIRST CHARACTER
|
||
|
CMP #173 ; IF .A != "-"
|
||
|
BNE :PLUS ; THEN NUMBER IS POSITIVE
|
||
|
LDA #$0FF ; ELSE SET FLAG TO NEGATIVE
|
||
|
STA ]SIGN
|
||
|
INC ]NINDEX ; INCREASE INDEX
|
||
|
DEX ; DECREMENT LENGTH COUNT
|
||
|
BEQ :EREXIT ; EXIT WITH ERROR IF .X = 0
|
||
|
JMP :CNVERT
|
||
|
:PLUS
|
||
|
CMP #'+'
|
||
|
BNE :CHKDIG ; START CONVERSION IF 1ST
|
||
|
; CHARACTER IS NOT A +
|
||
|
INC ]NINDEX ; INCREASE NEW INDEX
|
||
|
DEX ; DEC COUNT; IGNORE + SIGN
|
||
|
BEQ :EREXIT ; ERROR EXIT IF ONLY
|
||
|
; + IN THE BUFFER
|
||
|
:CNVERT
|
||
|
LDY ]NINDEX ; GET NEW INDEX
|
||
|
LDA (]STR),Y ; GET NEXT CHARACTER
|
||
|
:CHKDIG ; CHECK DIGIT
|
||
|
CMP #$B0 ; "0"
|
||
|
BMI :EREXIT ; ERROR IF NOT A NUMERAL
|
||
|
CMP #$BA ; '9'+1; TECHNICALLY :
|
||
|
BPL :EREXIT ; ERR IF > 9 (NOT NUMERAL)
|
||
|
PHA ; PUSH DIGIT TO STACK
|
||
|
*
|
||
|
** VALID DECIMAL DIGIT SO
|
||
|
** ACCUM = ACCUM * 10
|
||
|
** = ACCUM * (8+2)
|
||
|
** = (ACCUM * 8) + (ACCUM * 2)
|
||
|
*
|
||
|
ASL ]NACCUM
|
||
|
ROL ]NACCUM+1 ; TIMES 2
|
||
|
LDA ]NACCUM
|
||
|
LDY ]NACCUM+1 ; SAVE ACCUM * 2
|
||
|
ASL ]NACCUM
|
||
|
ROL ]NACCUM+1
|
||
|
ASL ]NACCUM
|
||
|
ROL ]NACCUM+1 ; TIMES 8
|
||
|
CLC
|
||
|
ADC ]NACCUM ; SUM WITH * 2
|
||
|
STA ]NACCUM
|
||
|
TYA
|
||
|
ADC ]NACCUM+1
|
||
|
STA ]NACCUM+1 ; ACCUM=ACCUM * 10
|
||
|
*
|
||
|
PLA ; GET THE DIGIT FROM STACK
|
||
|
SEC ; SET CARRY
|
||
|
SBC #$B0 ; SUBTRACT ASCII '0'
|
||
|
CLC ; CLEAR CARRY
|
||
|
ADC ]NACCUM ; ADD TO ACCUMULATION
|
||
|
STA ]NACCUM ; STORE IN ACCUMULATION
|
||
|
LDA #0 ; NOW ADJUST HIGH BYTE
|
||
|
ADC ]NACCUM+1
|
||
|
STA ]NACCUM+1
|
||
|
INC ]NINDEX ;INC TO NEXT CHARACTER
|
||
|
DEX ; DECREMENT .X COUNTER
|
||
|
BNE :CNVERT ; IF .X != 0, CONTINUE CONVERSION
|
||
|
LDA ]SIGN ; ELSE LOAD SIGN FLAG
|
||
|
BPL :OKEXIT ; IF POSITIVE, EXIT WITHOUT ERROR
|
||
|
LDA #0 ; ELSE SET THE VALUE TO NEGATIVE
|
||
|
SEC ; SET CARRY
|
||
|
SBC ]NACCUM ; 0 - ]NACCUM
|
||
|
STA ]NACCUM ; STORE AS ]NACCUM
|
||
|
LDA #0 ; ADJUST HIGHBYTE
|
||
|
SBC ]NACCUM+1
|
||
|
STA ]NACCUM+1
|
||
|
*
|
||
|
:OKEXIT
|
||
|
CLC ; CLEAR CARRY TO SIGNIFY NO ERRORS
|
||
|
BCC :EXIT
|
||
|
:EREXIT
|
||
|
SEC ; SET CARRY TO INIDICATE ERROR
|
||
|
:EXIT
|
||
|
LDA #2 ; BYTE LENGTH IS 2
|
||
|
STA RETLEN
|
||
|
LDX ]NACCUM+1 ; LOAD HIGH BYTE INTO .X
|
||
|
LDA ]NACCUM ; AND LOW BYTE INTO .A
|
||
|
STA RETURN ; ALSO STORE RESULT IN RETURN
|
||
|
STX RETURN+1
|
||
|
RTS
|