mirror of
https://github.com/nathanriggs/AppleIIAsm-Collection.git
synced 2024-11-28 03:52:10 +00:00
135 lines
3.4 KiB
Plaintext
135 lines
3.4 KiB
Plaintext
|
*``````````````````````````````*
|
||
|
* COMP16 :: 16-BIT COMPARE *
|
||
|
*- -*
|
||
|
* COMPARE TWO 16BIT SIGNED OR *
|
||
|
* UNSIGNED WORDS AND RETURN *
|
||
|
* THE C,Z,N FLAGS AS SET OR *
|
||
|
* CLEARED. *
|
||
|
*- -*
|
||
|
* CLOBBERS: *
|
||
|
* *
|
||
|
* FLAGS: CZN----- REG: AXYM *
|
||
|
*- -*
|
||
|
* CYCLES: ??? *
|
||
|
* SIZE: *
|
||
|
*- -*
|
||
|
* USAGE: *
|
||
|
* *
|
||
|
* LDA #>123 *
|
||
|
* PHA *
|
||
|
* LDA #<123 *
|
||
|
* PHA ; WORD 1 *
|
||
|
* LDA #>1023 *
|
||
|
* PHA *
|
||
|
* LDA #<1023 *
|
||
|
* PHA ; WORD 2 *
|
||
|
* JSR CMP16 *
|
||
|
*- -*
|
||
|
* ENTRY *
|
||
|
* *
|
||
|
* TOP OF STACK *
|
||
|
* *
|
||
|
* LOW BYTE OF RETURN ADDRESS *
|
||
|
* HI BYTE OF RETURN ADDRESS *
|
||
|
* LOW BYTE OF WORD 2 (SUBTRA) *
|
||
|
* HIGH BYTE OF WORD 2 *
|
||
|
* LOW BYTE OF WORD 1 (MINU) *
|
||
|
* HIGH BYTE OF WORD 1 *
|
||
|
*- -*
|
||
|
* EXIT *
|
||
|
* *
|
||
|
* TOP OF STACK *
|
||
|
* *
|
||
|
* FLAGS RETURNED BASED ON WORD *
|
||
|
* 1 - WORD 2. *
|
||
|
* *
|
||
|
* IF W1 & W2 ARE 2S COMPLEMENT *
|
||
|
* IF W1 = W2 Z=1,N=0 *
|
||
|
* IF W1 > W2 Z=0,N=0 *
|
||
|
* IF W1 < W2 Z=0,N=1 *
|
||
|
* ELSE *
|
||
|
* IF W1 = W2 Z=1,C=1 *
|
||
|
* IF W1 > W2 Z=0,C=1 *
|
||
|
* IF W1 < W2 Z=0,C=0 *
|
||
|
* *
|
||
|
*- -*
|
||
|
* ADAPTED FROM LEVANTHAL AND *
|
||
|
* WINTHROP'S /6502 ASSEMBLY *
|
||
|
* LANGUAGE ROUTINES/. *
|
||
|
* AS SUCH, THE SAME LICENSE *
|
||
|
* MAY NOT APPLY UNTIL RADICAL *
|
||
|
* ALTERATION. *
|
||
|
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
||
|
*
|
||
|
COMP16
|
||
|
*
|
||
|
** GET RETURN ADDRESS
|
||
|
*
|
||
|
PLA
|
||
|
STA RETADR
|
||
|
PLA
|
||
|
STA RETADR+1
|
||
|
*
|
||
|
** GET PARAMETERS
|
||
|
*
|
||
|
PLA
|
||
|
STA :SUBT ; SUBTRAHEND
|
||
|
PLA
|
||
|
STA :SUBT+1
|
||
|
PLA
|
||
|
STA :MINU ; MINUEND
|
||
|
PLA
|
||
|
STA :MINU+1
|
||
|
*
|
||
|
** RESTORE RETURN ADDRESS
|
||
|
*
|
||
|
LDA RETADR+1
|
||
|
PHA
|
||
|
LDA RETADR
|
||
|
PHA
|
||
|
*
|
||
|
LDA :MINU
|
||
|
CMP :SUBT ; COMPARE LOW BYTES
|
||
|
BEQ :EQUAL
|
||
|
*
|
||
|
** LOW BYTES ARE NOTE EQUAL
|
||
|
** COMPARE HIGH BYTES
|
||
|
*
|
||
|
LDA :MINU+1
|
||
|
SBC :SUBT+1 ; COMPARE HIGH BYTES
|
||
|
ORA #1 ; MAKE Z=0, SINCE LOW
|
||
|
; BYTES ARE NOT EQUAL
|
||
|
BVS :OVFLOW ; MUST HANDLE OVERFLOW
|
||
|
; FOR SIGNED MATH
|
||
|
RTS ; EXIT
|
||
|
*
|
||
|
** LOW BYTES ARE UQAL -- COMPARE HIGH
|
||
|
*
|
||
|
:EQUAL
|
||
|
LDA :MINU+1
|
||
|
SBC :SUBT+1 ; UPPER BYTES
|
||
|
BVS :OVFLOW
|
||
|
RTS ; RETURN W FLAGS SET
|
||
|
*
|
||
|
**
|
||
|
** OVERFLOW WITH SIGNED ARITHMETIC SO
|
||
|
** COMPLEMENT THE NEGATIVE FLAG.
|
||
|
** DO NO CHANGE THE CARRY FLAG AND
|
||
|
** MAKE THE ZERO FLAG EQUAL TO 0.
|
||
|
** COMPLEMENT NEG FLAG BY EORING
|
||
|
** #$80 AND ACCUMULATOR.
|
||
|
**
|
||
|
*
|
||
|
:OVFLOW
|
||
|
EOR #$80 ; COMPLEMENT N FLAG
|
||
|
ORA #1 ; IF OVERFLOW THEN THE
|
||
|
; WORDS ARE !=. Z= 0
|
||
|
; CARRY UNCHANGED
|
||
|
RTS
|
||
|
*
|
||
|
** DATA
|
||
|
*
|
||
|
:MINU DS 2
|
||
|
:SUBT DS 2
|
||
|
*
|