mirror of
https://github.com/nathanriggs/AppleIIAsm-Collection.git
synced 2025-02-22 10:29:01 +00:00
Math Routines 0.2.0 update
- fixed a plethora of bugs - overhauled demo - integrated shared required library and macros - began early planning of floating-point routines and macros - created minified, no-comment versions of every routine
This commit is contained in:
parent
64a7923a78
commit
1b182844cc
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
100
disks/disk3_math8_math16/T.ADDIT16
Normal file
100
disks/disk3_math8_math16/T.ADDIT16
Normal file
@ -0,0 +1,100 @@
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* ADDIT16 :: ADD 16-BIT VALUES *
|
||||
*- -*
|
||||
* ADDS TWO SIXTEEN BIT VALUES *
|
||||
* AND RETURNS A 16 BIT VALUE *
|
||||
* IN .Y (LOW) AND .X (HIGH). *
|
||||
* CAN BE SIGNED OR UNSIGNED. *
|
||||
*- -*
|
||||
* CLOBBERS: *
|
||||
* *
|
||||
* FLAGS: ????---- REG: AXYM *
|
||||
*- -*
|
||||
* CYCLES: ??? *
|
||||
* SIZE: *
|
||||
*- -*
|
||||
* USAGE: *
|
||||
* *
|
||||
* LDA #>1000 *
|
||||
* PHA *
|
||||
* LDA #<1000 *
|
||||
* PHA *
|
||||
* LDA #>1200 ; ADD2 *
|
||||
* PHA *
|
||||
* LDA #<1200 *
|
||||
* PHA *
|
||||
* JSR ADDIT16 *
|
||||
*- -*
|
||||
* ENTRY *
|
||||
* *
|
||||
* TOP OF STACK *
|
||||
* *
|
||||
* LOW BYTE OF RETURN ADDRESS *
|
||||
* HI BYTE OF RETURN ADDRESS *
|
||||
* ADDEND 2 LOW BYTE *
|
||||
* ADDEND 2 HIGH BYTE *
|
||||
* ADDEND 1 LOW BYTE *
|
||||
* ADDEND 1 HIGH BYTE *
|
||||
*- -*
|
||||
* EXIT *
|
||||
* *
|
||||
* TOP OF STACK *
|
||||
* *
|
||||
* LOW BYTE OF RETURN ADDRESS *
|
||||
* HI BYTE OF RETURN ADDRESS *
|
||||
* *
|
||||
* .Y = LOW BYTE OF RESULT *
|
||||
* .X = HIGH BYTE OF RESULT *
|
||||
* .A = LOW BYTE OF RET ADDR *
|
||||
* *
|
||||
* [RETURN] = RESULT (2 BYTES) *
|
||||
* [RETLEN] = 2 (RESULT LENGTH) *
|
||||
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
||||
*
|
||||
ADDIT16
|
||||
*
|
||||
** GET RETURN ADDR
|
||||
*
|
||||
PLA
|
||||
STA RETADR
|
||||
PLA
|
||||
STA RETADR+1
|
||||
*
|
||||
** GET PARAMETERS
|
||||
*
|
||||
PLA
|
||||
STA :ADD2
|
||||
PLA
|
||||
STA :ADD2+1
|
||||
PLA
|
||||
STA :ADD1
|
||||
PLA
|
||||
STA :ADD1+1
|
||||
*
|
||||
LDA :ADD1
|
||||
CLC
|
||||
ADC :ADD2
|
||||
TAY ; LOW BYTE
|
||||
STY RETURN
|
||||
LDA :ADD1+1
|
||||
ADC :ADD2+1
|
||||
TAX ; HIGH BYTE
|
||||
STX RETURN+1
|
||||
LDA #2
|
||||
STA RETLEN
|
||||
*
|
||||
** RESTORE RETURN ADDRESS
|
||||
*
|
||||
LDA RETADR+1
|
||||
PHA
|
||||
LDA RETADR
|
||||
PHA
|
||||
*
|
||||
RTS
|
||||
*
|
||||
** DATA
|
||||
*
|
||||
:ADD1 DS 2
|
||||
:ADD2 DS 2
|
||||
*
|
33
disks/disk3_math8_math16/T.ADDIT16.MIN
Normal file
33
disks/disk3_math8_math16/T.ADDIT16.MIN
Normal file
@ -0,0 +1,33 @@
|
||||
*
|
||||
ADDIT16
|
||||
*
|
||||
PLA
|
||||
STA RETADR
|
||||
PLA
|
||||
STA RETADR+1
|
||||
PLA
|
||||
STA :ADD2
|
||||
PLA
|
||||
STA :ADD2+1
|
||||
PLA
|
||||
STA :ADD1
|
||||
PLA
|
||||
STA :ADD1+1
|
||||
LDA :ADD1
|
||||
CLC
|
||||
ADC :ADD2
|
||||
TAY
|
||||
STY RETURN
|
||||
LDA :ADD1+1
|
||||
ADC :ADD2+1
|
||||
TAX
|
||||
STX RETURN+1
|
||||
LDA #2
|
||||
STA RETLEN
|
||||
LDA RETADR+1
|
||||
PHA
|
||||
LDA RETADR
|
||||
PHA
|
||||
RTS
|
||||
:ADD1 DS 2
|
||||
:ADD2 DS 2
|
135
disks/disk3_math8_math16/T.COMP16
Normal file
135
disks/disk3_math8_math16/T.COMP16
Normal file
@ -0,0 +1,135 @@
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* 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
|
||||
*
|
38
disks/disk3_math8_math16/T.COMP16.MIN
Normal file
38
disks/disk3_math8_math16/T.COMP16.MIN
Normal file
@ -0,0 +1,38 @@
|
||||
*
|
||||
COMP16
|
||||
*
|
||||
PLA
|
||||
STA RETADR
|
||||
PLA
|
||||
STA RETADR+1
|
||||
PLA
|
||||
STA :SUBT
|
||||
PLA
|
||||
STA :SUBT+1
|
||||
PLA
|
||||
STA :MINU
|
||||
PLA
|
||||
STA :MINU+1
|
||||
LDA RETADR+1
|
||||
PHA
|
||||
LDA RETADR
|
||||
PHA
|
||||
LDA :MINU
|
||||
CMP :SUBT
|
||||
BEQ :EQUAL
|
||||
LDA :MINU+1
|
||||
SBC :SUBT+1
|
||||
ORA #1
|
||||
BVS :OVFLOW
|
||||
RTS
|
||||
:EQUAL
|
||||
LDA :MINU+1
|
||||
SBC :SUBT+1
|
||||
BVS :OVFLOW
|
||||
RTS
|
||||
:OVFLOW
|
||||
EOR #$80
|
||||
ORA #1
|
||||
RTS
|
||||
:MINU DS 2
|
||||
:SUBT DS 2
|
332
disks/disk3_math8_math16/T.DIV16
Normal file
332
disks/disk3_math8_math16/T.DIV16
Normal file
@ -0,0 +1,332 @@
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* 16-BIT DIVISION: *
|
||||
* *
|
||||
* SDIV16, UDIV16, SREM16, AND *
|
||||
* UREM16. *
|
||||
*- -*
|
||||
* SDIV16: DIVIDED 2 SIGNED BIT *
|
||||
* WORDS AND RETURN A 16-BIT *
|
||||
* SIGNED QUOTIENT. *
|
||||
* *
|
||||
* UDIV16: DIVIDE 2 UNSIGNED *
|
||||
* 16BIT WORDS AND RETURN A *
|
||||
* 16BIT UNSIGNED QUOTIENT. *
|
||||
* *
|
||||
* SREM16: DIVIDE 2 SIGNED *
|
||||
* 16BIT WORDS AND RETURN A *
|
||||
* 16BIT SIGNED REMAINDER. *
|
||||
* *
|
||||
* UREM16: DIVIDE 2 UNSIGNED *
|
||||
* 16BIT WORKDS AND RETURN A *
|
||||
* 16BIT UNSIGNED REMAINDER. *
|
||||
*- -*
|
||||
* CLOBBERS: *
|
||||
* *
|
||||
* FLAGS: ????---- REG: AXYM *
|
||||
*- -*
|
||||
* CYCLES: ??? *
|
||||
* SIZE: *
|
||||
*- -*
|
||||
* USAGE: *
|
||||
* *
|
||||
** ALL ROUTINES USE THE SAME *
|
||||
** FORMAT. *
|
||||
* *
|
||||
* LDA #>10000 *
|
||||
* PHA *
|
||||
* LDA #<10000 ; DIVIDEND *
|
||||
* PHA *
|
||||
* LDA #>1000 ; DIVISOR *
|
||||
* PHA *
|
||||
* LDA #<1000 *
|
||||
* PHA *
|
||||
* JSR UDIV16 *
|
||||
*- -*
|
||||
* ENTRY *
|
||||
* *
|
||||
* TOP OF STACK *
|
||||
* *
|
||||
* LOW BYTE OF RETURN ADDRESS *
|
||||
* HI BYTE OF RETURN ADDRESS *
|
||||
* LOW BYTE OF DIVISOR *
|
||||
* HIGH BYTE OF DIVISOR *
|
||||
* LOW BYTE OF DIVIDEND *
|
||||
* HIGH BYTE OF DIVIDEND *
|
||||
*- -*
|
||||
* EXIT *
|
||||
* *
|
||||
* TOP OF STACK *
|
||||
* *
|
||||
* LOW BYTE OF RETURN ADDRESS *
|
||||
* HI BYTE OF RETURN ADDRESS *
|
||||
* *
|
||||
* IF NO ERRORS, CARRY = 0, *
|
||||
* ELSE CARRY=1, QUOTIENT=0, *
|
||||
* AND REMAINDER=0 *
|
||||
* *
|
||||
* .Y = COUNTER; TRASH *
|
||||
* .X = COUNTER; TRASH *
|
||||
* .A = LOW BYTE OF RET ADDR *
|
||||
* *
|
||||
* [RETURN] = RESULT (2 BYTES) *
|
||||
* [RETLEN] = 2 (RESULT LENGTH) *
|
||||
*- -*
|
||||
* ADAPTED FROM LEVANTHAL AND *
|
||||
* WINTHROP'S /6502 ASSEMBLY *
|
||||
* LANGUAGE ROUTINES/. *
|
||||
* AS SUCH, IT MAY FALL UNDER A *
|
||||
* DIFFERENT LICENSE UNTIL IT *
|
||||
* IS RADICALLY REWORKED. *
|
||||
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
||||
*
|
||||
UDIVD16
|
||||
LDA #0
|
||||
BEQ UDIVMD
|
||||
UREMD16
|
||||
LDA #2
|
||||
UDIVMD
|
||||
STA _RSLTI
|
||||
*
|
||||
** GET RETURN ADDRESS
|
||||
*
|
||||
PLA
|
||||
STA RETADR
|
||||
PLA
|
||||
STA RETADR+1
|
||||
*
|
||||
** GET PARAMETERS
|
||||
*
|
||||
PLA
|
||||
STA _DVSOR
|
||||
PLA
|
||||
STA _DVSOR+1
|
||||
PLA
|
||||
STA _DVEND
|
||||
PLA
|
||||
STA _DVEND+1
|
||||
*
|
||||
JSR UDIV
|
||||
BCC DIVOK ; BR IF NO ERR
|
||||
DIVERR JMP EREXIT
|
||||
DIVOK JMP OKEXIT
|
||||
*
|
||||
** SIGNED DIVISION
|
||||
*
|
||||
SDIVD16
|
||||
LDA #0 ; RESULT IS QUOTIENT
|
||||
BEQ SDIVMD ; (INDEX=0)
|
||||
*
|
||||
** SIGNED REMAINDER
|
||||
*
|
||||
SREMD16
|
||||
LDA #2 ; RES = REMAINDER (I=2)
|
||||
BNE SDIVMD
|
||||
*
|
||||
SDIVMD
|
||||
STA _RSLTI ;RESULT INDEX;0=Q,2=R
|
||||
*
|
||||
** GET RETURN ADDRESS
|
||||
*
|
||||
PLA
|
||||
STA RETADR
|
||||
PLA
|
||||
STA RETADR+1
|
||||
*
|
||||
** GET PARAMETERS
|
||||
*
|
||||
PLA
|
||||
STA _DVSOR
|
||||
PLA
|
||||
STA _DVSOR+1
|
||||
PLA
|
||||
STA _DVEND
|
||||
PLA
|
||||
STA _DVEND+1
|
||||
*
|
||||
*
|
||||
** DETERMINE SIGN OF QUOTIENT BY
|
||||
** PERFORMING AN EXCLUSIVE OR OF
|
||||
** THE HIGH BYTES. IF THE SIGNS
|
||||
** ARE THE SAME THEN BIT 7 WILL
|
||||
** BE 0 AND THE QUOTIENT IS
|
||||
** POSITIVE. IF THE SIGNS ARE
|
||||
** DIFFERENT THEN THE QUOTIENT
|
||||
** IS NEGATIVE.
|
||||
*
|
||||
LDA _DVEND+1
|
||||
EOR _DVSOR+1
|
||||
STA _SQUOT
|
||||
*
|
||||
** SIGN OF REMAINDER IS THE SIGN
|
||||
** OF THE DIVIDEND
|
||||
*
|
||||
LDA _DVEND+1
|
||||
STA _SREMD
|
||||
*
|
||||
** TAKE THE ABSOLUTE VALUE OF
|
||||
** THE DIVISOR
|
||||
*
|
||||
LDA _DVSOR+1
|
||||
BPL CHKDE ; BR IF ALREADY POS
|
||||
LDA #0 ; SUB DVSOR FROM ZERO
|
||||
SEC
|
||||
SBC _DVSOR
|
||||
STA _DVSOR
|
||||
LDA #0
|
||||
SBC _DVSOR+1
|
||||
STA _DVSOR+1
|
||||
*
|
||||
** TAKE ABS VALUE OF THE DIVIDEND
|
||||
*
|
||||
CHKDE
|
||||
LDA _DVEND+1
|
||||
BPL DODIV ; BR IF DVEND IS POS
|
||||
LDA #0 ; SUB DVEND FROM ZERO
|
||||
SEC
|
||||
SBC _DVEND
|
||||
STA _DVEND
|
||||
LDA #0
|
||||
SBC _DVEND+1
|
||||
STA _DVEND+1
|
||||
*
|
||||
** DIVIDE ABS VALUES
|
||||
*
|
||||
DODIV
|
||||
JSR UDIV
|
||||
BCS EREXIT ; EXIT IF DIV BY 0
|
||||
*
|
||||
** NEGATE QUOTIENT IF IT IS NEGATIVE
|
||||
*
|
||||
LDA _SQUOT
|
||||
BPL DOREM ; BR IF Q IS POS
|
||||
LDA #0
|
||||
SEC
|
||||
SBC _DVEND
|
||||
STA _DVEND
|
||||
LDA #0
|
||||
SBC _DVEND+1
|
||||
STA _DVEND+1
|
||||
*
|
||||
DOREM
|
||||
*
|
||||
** NEGATE REMAINDER IF IT IS NEG
|
||||
*
|
||||
LDA _SREMD
|
||||
BPL OKEXIT ; BR IF REM IS POS
|
||||
LDA #0
|
||||
SEC
|
||||
SBC _DVEND+2
|
||||
STA _DVEND+2
|
||||
LDA #0
|
||||
SBC _DVEND+3
|
||||
STA _DVEND+3
|
||||
JMP OKEXIT
|
||||
*
|
||||
** ERROR EXIT (CARRY=1, RSLTS ARE 0)
|
||||
*
|
||||
EREXIT
|
||||
LDA #0
|
||||
STA _DVEND
|
||||
STA _DVEND+1 ;QUOTIENT = 0
|
||||
STA _DVEND+2
|
||||
STA _DVEND+3 ; REMAINDER=0
|
||||
STA RETURN
|
||||
STA RETURN+1
|
||||
LDA #2
|
||||
STA RETLEN
|
||||
SEC ; CARRY=1 IF ERROR
|
||||
BCS DVEXIT
|
||||
*
|
||||
** GOOD EXIT (CARRY = 0)
|
||||
*
|
||||
OKEXIT
|
||||
CLC ; CARRY = 0, NO ERRORS
|
||||
*
|
||||
DVEXIT
|
||||
*
|
||||
** STORE RESULT
|
||||
*
|
||||
LDX _RSLTI ;GET INDEX TO RESULT
|
||||
; 0=QUOTIENT, 2=REMAINDER
|
||||
*
|
||||
** STORE RESULT
|
||||
*
|
||||
LDA _DVEND,X
|
||||
TAY
|
||||
LDA _DVEND+1,X
|
||||
TAX
|
||||
STY RETURN
|
||||
STX RETURN+1
|
||||
LDA #2
|
||||
STA RETLEN
|
||||
*
|
||||
** RESTORE RETURN ADDRESS
|
||||
*
|
||||
LDA RETADR+1
|
||||
PHA
|
||||
LDA RETADR
|
||||
PHA
|
||||
*
|
||||
RTS
|
||||
*
|
||||
********************************
|
||||
* UDIV ROUTINE
|
||||
********************************
|
||||
UDIV
|
||||
*
|
||||
** ZERO UPPER WORD DIVIDEND
|
||||
** THIS WILL BE CALLED
|
||||
** DIVIDEND(1) BELOW
|
||||
*
|
||||
LDA #0
|
||||
STA _DVEND+2
|
||||
STA _DVEND+3
|
||||
*
|
||||
** FIRST CHECK FOR DIV BY 0
|
||||
*
|
||||
LDA _DVSOR
|
||||
ORA _DVSOR+1
|
||||
BNE OKUDIV ; BR IF DVSOR NOT 0
|
||||
SEC
|
||||
RTS
|
||||
*
|
||||
** PERFORM THE DIVISION BY
|
||||
** TRIAL SUBTRACTIONS
|
||||
*
|
||||
OKUDIV
|
||||
LDX #16 ; LOOP THROUGH 16 BITS
|
||||
DIVLP
|
||||
ROL _DVEND ;SHFT CARRY INTO BIT 0 OF DVEND
|
||||
ROL _DVEND+1 ;WHICH WILL BE THE QUOTIENT AND
|
||||
ROL _DVEND+2 ;SHFT DVEND AT THE SAME TIME
|
||||
ROL _DVEND+3
|
||||
CHKLT
|
||||
SEC
|
||||
LDA _DVEND+2
|
||||
SBC _DVSOR
|
||||
TAY ; SAVE LOW BYTE IN Y
|
||||
LDA _DVEND+3
|
||||
SBC _DVSOR+1 ;SUB HIGHBYTES W RES IN A
|
||||
BCC DECCNT ; BR IF DVEND < DVSOR AND CARRY
|
||||
STY _DVEND+2 ; ELSE
|
||||
STA _DVEND+3 ;VEN(1)=DVEND(1)-DVSOR
|
||||
*
|
||||
DECCNT
|
||||
DEX
|
||||
BNE DIVLP
|
||||
*
|
||||
ROL _DVEND ;SHFT IN LAST CAR FOR QUOT
|
||||
ROL _DVEND+1
|
||||
CLC ; NO ERRORS, CLEAR CARRY
|
||||
RTS
|
||||
*
|
||||
** DATA
|
||||
*
|
||||
_DVSOR DS 2 ; DIVISOR
|
||||
_DVEND DS 4 ; DIVIDEND[0] AND QUOTIENT
|
||||
; DIVIDEND[1] AND REMAINDER
|
||||
_SQUOT DS 1 ; SIGN OF QUOTIENT
|
||||
_SREMD DS 1 ; SIGN OF REMAINDER
|
||||
_RSLTI DS 1 ; RESULT INDEX
|
||||
*
|
159
disks/disk3_math8_math16/T.DIV16.MIN
Normal file
159
disks/disk3_math8_math16/T.DIV16.MIN
Normal file
@ -0,0 +1,159 @@
|
||||
*
|
||||
UDIVD16
|
||||
LDA #0
|
||||
BEQ UDIVMD
|
||||
UREMD16
|
||||
LDA #2
|
||||
UDIVMD
|
||||
STA _RSLTI
|
||||
PLA
|
||||
STA RETADR
|
||||
PLA
|
||||
STA RETADR+1
|
||||
PLA
|
||||
STA _DVSOR
|
||||
PLA
|
||||
STA _DVSOR+1
|
||||
PLA
|
||||
STA _DVEND
|
||||
PLA
|
||||
STA _DVEND+1
|
||||
JSR UDIV
|
||||
BCC DIVOK
|
||||
DIVERR JMP EREXIT
|
||||
DIVOK JMP OKEXIT
|
||||
SDIVD16
|
||||
LDA #0
|
||||
BEQ SDIVMD
|
||||
SREMD16
|
||||
LDA #2
|
||||
BNE SDIVMD
|
||||
SDIVMD
|
||||
STA _RSLTI
|
||||
PLA
|
||||
STA RETADR
|
||||
PLA
|
||||
STA RETADR+1
|
||||
PLA
|
||||
STA _DVSOR
|
||||
PLA
|
||||
STA _DVSOR+1
|
||||
PLA
|
||||
STA _DVEND
|
||||
PLA
|
||||
STA _DVEND+1
|
||||
LDA _DVEND+1
|
||||
EOR _DVSOR+1
|
||||
STA _SQUOT
|
||||
LDA _DVEND+1
|
||||
STA _SREMD
|
||||
LDA _DVSOR+1
|
||||
BPL CHKDE
|
||||
LDA #0
|
||||
SEC
|
||||
SBC _DVSOR
|
||||
STA _DVSOR
|
||||
LDA #0
|
||||
SBC _DVSOR+1
|
||||
STA _DVSOR+1
|
||||
CHKDE
|
||||
LDA _DVEND+1
|
||||
BPL DODIV
|
||||
LDA #0
|
||||
SEC
|
||||
SBC _DVEND
|
||||
STA _DVEND
|
||||
LDA #0
|
||||
SBC _DVEND+1
|
||||
STA _DVEND+1
|
||||
DODIV
|
||||
JSR UDIV
|
||||
BCS EREXIT
|
||||
LDA _SQUOT
|
||||
BPL DOREM
|
||||
LDA #0
|
||||
SEC
|
||||
SBC _DVEND
|
||||
STA _DVEND
|
||||
LDA #0
|
||||
SBC _DVEND+1
|
||||
STA _DVEND+1
|
||||
DOREM
|
||||
LDA _SREMD
|
||||
BPL OKEXIT
|
||||
LDA #0
|
||||
SEC
|
||||
SBC _DVEND+2
|
||||
STA _DVEND+2
|
||||
LDA #0
|
||||
SBC _DVEND+3
|
||||
STA _DVEND+3
|
||||
JMP OKEXIT
|
||||
EREXIT
|
||||
LDA #0
|
||||
STA _DVEND
|
||||
STA _DVEND+1
|
||||
STA _DVEND+2
|
||||
STA _DVEND+3
|
||||
STA RETURN
|
||||
STA RETURN+1
|
||||
LDA #2
|
||||
STA RETLEN
|
||||
SEC
|
||||
BCS DVEXIT
|
||||
OKEXIT
|
||||
CLC
|
||||
DVEXIT
|
||||
LDX _RSLTI
|
||||
LDA _DVEND,X
|
||||
TAY
|
||||
LDA _DVEND+1,X
|
||||
TAX
|
||||
STY RETURN
|
||||
STX RETURN+1
|
||||
LDA #2
|
||||
STA RETLEN
|
||||
LDA RETADR+1
|
||||
PHA
|
||||
LDA RETADR
|
||||
PHA
|
||||
*
|
||||
RTS
|
||||
UDIV
|
||||
LDA #0
|
||||
STA _DVEND+2
|
||||
STA _DVEND+3
|
||||
LDA _DVSOR
|
||||
ORA _DVSOR+1
|
||||
BNE OKUDIV
|
||||
SEC
|
||||
RTS
|
||||
OKUDIV
|
||||
LDX #16
|
||||
DIVLP
|
||||
ROL _DVEND
|
||||
ROL _DVEND+1
|
||||
ROL _DVEND+2
|
||||
ROL _DVEND+3
|
||||
CHKLT
|
||||
SEC
|
||||
LDA _DVEND+2
|
||||
SBC _DVSOR
|
||||
TAY
|
||||
LDA _DVEND+3
|
||||
SBC _DVSOR+1
|
||||
BCC DECCNT
|
||||
STY _DVEND+2
|
||||
STA _DVEND+3
|
||||
DECCNT
|
||||
DEX
|
||||
BNE DIVLP
|
||||
ROL _DVEND
|
||||
ROL _DVEND+1
|
||||
CLC
|
||||
RTS
|
||||
_DVSOR DS 2
|
||||
_DVEND DS 4
|
||||
_SQUOT DS 1
|
||||
_SREMD DS 1
|
||||
_RSLTI DS 1
|
95
disks/disk3_math8_math16/T.DIVD8
Normal file
95
disks/disk3_math8_math16/T.DIVD8
Normal file
@ -0,0 +1,95 @@
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* DIVD8 :: 8BIT DIVISION (8BR) *
|
||||
*- -*
|
||||
* DIVIDE ONE 8BIT NUMBER BY *
|
||||
* ANOTHER TO GET AN 8BIT *
|
||||
* RESULT. UNSIGNED ONLY. *
|
||||
* *
|
||||
* ORIGINAL AUTHOR IS WHITE *
|
||||
* FLAME, AS SHARED ON *
|
||||
* CODEBASE64. MINOR CHANGES. *
|
||||
*- -*
|
||||
* CLOBBERS: *
|
||||
* *
|
||||
* FLAGS: ????---- REG: AXYM *
|
||||
*- -*
|
||||
* CYCLES: ??? *
|
||||
* SIZE: *
|
||||
*- -*
|
||||
* USAGE: *
|
||||
* *
|
||||
* LDA #200 *
|
||||
* PHA *
|
||||
* PDA #10 *
|
||||
* PHA *
|
||||
* JSR DIV8 *
|
||||
*- -*
|
||||
* ENTRY *
|
||||
* *
|
||||
* LOW BYTE OF RETURN ADDRESS *
|
||||
* HIGH BYTE OF RETURN ADDRESS *
|
||||
* SECOND NUM TO BE MULTIPLIED *
|
||||
* FIRST NUM TO BE MULTIPLIED *
|
||||
*- -*
|
||||
* EXIT *
|
||||
* *
|
||||
* .Y = REMAINDER *
|
||||
* .X = UNCHANGED *
|
||||
* .A = QUOTIENT *
|
||||
* *
|
||||
* [RETURN] = QUOTIENT *
|
||||
* [RETLEN] = 1 (QUOT LENGTH) *
|
||||
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
||||
*
|
||||
DIVD8
|
||||
*
|
||||
** GET RETURN ADDRESS
|
||||
*
|
||||
PLA
|
||||
STA RETADR
|
||||
PLA
|
||||
STA RETADR+1
|
||||
*
|
||||
** GET PARAMETERS
|
||||
*
|
||||
PLA
|
||||
STA :DVEND
|
||||
PLA
|
||||
STA :DVSOR
|
||||
*
|
||||
LDA #$00
|
||||
LDY #8
|
||||
ASL :DVSOR
|
||||
:L1 ROL
|
||||
CMP :DVEND
|
||||
BCC :L2
|
||||
SBC :DVEND
|
||||
:L2 ROL :DVSOR
|
||||
DEY
|
||||
BNE :L1
|
||||
STA :REM
|
||||
*
|
||||
** RESTORE RETURN ADDRESS
|
||||
*
|
||||
LDA RETADR+1
|
||||
PHA
|
||||
LDA RETADR
|
||||
PHA
|
||||
*
|
||||
** LOAD QUOTIENT INTO A, REMAINDER INTO X
|
||||
*
|
||||
LDY :REM ; REMAINDER TO Y
|
||||
LDA #1
|
||||
STA RETLEN
|
||||
LDA :DVSOR
|
||||
STA RETURN
|
||||
*
|
||||
RTS
|
||||
*
|
||||
** DATA
|
||||
*
|
||||
:REM DS 1
|
||||
:DVEND DS 1
|
||||
:DVSOR DS 1
|
||||
*
|
34
disks/disk3_math8_math16/T.DIVD8.MIN
Normal file
34
disks/disk3_math8_math16/T.DIVD8.MIN
Normal file
@ -0,0 +1,34 @@
|
||||
DIVD8
|
||||
*
|
||||
PLA
|
||||
STA RETADR
|
||||
PLA
|
||||
STA RETADR+1
|
||||
PLA
|
||||
STA :DVEND
|
||||
PLA
|
||||
STA :DVSOR
|
||||
LDA #$00
|
||||
LDY #8
|
||||
ASL :DVSOR
|
||||
:L1 ROL
|
||||
CMP :DVEND
|
||||
BCC :L2
|
||||
SBC :DVEND
|
||||
:L2 ROL :DVSOR
|
||||
DEY
|
||||
BNE :L1
|
||||
STA :REM
|
||||
LDA RETADR+1
|
||||
PHA
|
||||
LDA RETADR
|
||||
PHA
|
||||
LDY :REM
|
||||
LDA #1
|
||||
STA RETLEN
|
||||
LDA :DVSOR
|
||||
STA RETURN
|
||||
RTS
|
||||
:REM DS 1
|
||||
:DVEND DS 1
|
||||
:DVSOR DS 1
|
@ -3,9 +3,9 @@
|
||||
* *
|
||||
* -< MATH DEMO >- *
|
||||
* *
|
||||
* VERSION 00.00.01 *
|
||||
* VERSION 00.02.00 *
|
||||
* *
|
||||
* 03/04/1980 *
|
||||
* 12-DEC-2018 *
|
||||
* *
|
||||
********************************
|
||||
* *
|
||||
@ -19,235 +19,251 @@
|
||||
CYC AVE
|
||||
EXP ONLY
|
||||
DSK MATH.DEMO
|
||||
OBJ $BFE0
|
||||
ORG $6000
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* TOP INCLUDES (PUTS, MACROS) *
|
||||
* TOP INCLUDES (HOOKS,MACROS) *
|
||||
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
||||
*
|
||||
PUT DECS
|
||||
*USE MATH.MAC ; CAN'T USE RIGHT NOW
|
||||
* BECAUSE OF MEMORY LIMITATIONS
|
||||
*
|
||||
PUT MATH.HOOKS
|
||||
*
|
||||
OBJ $BFE0
|
||||
ORG $6000
|
||||
USE MATH.MAC
|
||||
PUT REQUIRED.HOOKS
|
||||
USE REQUIRED.MAC
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* PROGRAM MAIN BODY *
|
||||
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
||||
*
|
||||
JSR $FC58 ; HOME
|
||||
_PRNT "INTEGER MATH LIBRARIES AND",8D
|
||||
_PRNT "MACROS. ",8D
|
||||
_PRNT "-------------------------",8D8D
|
||||
_PRNT "THE RAND8 ROUTINE RETURNS",8D
|
||||
_PRNT "A PSEUDO-RANDOM VALUE BETWEEN",8D
|
||||
_PRNT "1 AND 255.",8D8D
|
||||
JSR RAND8
|
||||
STA $300
|
||||
JSR RAND8
|
||||
STA $301
|
||||
JSR RAND8
|
||||
STA $302
|
||||
JSR RAND8
|
||||
STA $303
|
||||
JSR RAND8
|
||||
STA $304
|
||||
_DUMP $300;#5
|
||||
_WAIT
|
||||
*
|
||||
_PRNT " ",8D8D
|
||||
_PRNT "WHILE THE RNDB MACRO RETURNS",8D
|
||||
_PRNT "A BYTE VALUE BETWEEN A GIVEN",8D
|
||||
_PRNT "LOW AND HIGH VALUE.",8D8D
|
||||
RNDB #$A0;#$AF
|
||||
STA $300
|
||||
RNDB #$A0;#$AF
|
||||
STA $301
|
||||
RNDB #$A0;#$AF
|
||||
STA $302
|
||||
RNDB #$A0;#$AF
|
||||
STA $303
|
||||
RNDB #$A0;#$AF
|
||||
STA $304
|
||||
_DUMP $300;#5
|
||||
_WAIT
|
||||
*
|
||||
** BIG LUMPS -- HIGH LEVEL CODE
|
||||
*
|
||||
*
|
||||
*
|
||||
** ADD16 ADDS TWO 16-BIT NUMBERS AND
|
||||
** RETURNS THE RESULT IN Y(LOW) AND X (HIGH).
|
||||
*
|
||||
** MACRO: _ADD16 #1000;#2000
|
||||
*
|
||||
LDA #>1000 ; ADD1, HIGH
|
||||
PHA
|
||||
LDA #<1000 ; ADD1, LOW
|
||||
PHA
|
||||
LDA #>2000 ; ADD2, HIGH
|
||||
PHA
|
||||
LDA #<2000 ; ADD2, LOW
|
||||
PHA
|
||||
JSR ADD16
|
||||
* BRK ; X=0B, Y=B8, == 3000
|
||||
*
|
||||
** SUB16 SUBTRACTS ONE 16-BIT NUMBER
|
||||
** FROM ANOTHER, AND RETURNS RESULT IN
|
||||
** Y (LOW) AND X (HIGH)
|
||||
*
|
||||
** MACRO: _SUB16 #2000;#1000
|
||||
*
|
||||
LDA #>2000 ; MINUEND
|
||||
PHA
|
||||
LDA #<2000
|
||||
PHA
|
||||
LDA #>1000 ; SUBTRAHEND
|
||||
PHA
|
||||
LDA #<1000
|
||||
PHA
|
||||
JSR SUB16
|
||||
* BRK ; X = 03, Y = E8, == 1000
|
||||
*
|
||||
** MUL16 MULTIPLES TWO VALUES AND RETURNS THE
|
||||
** PRODUCT OVER THE STACK (LOW, HIGH)
|
||||
*
|
||||
** MACRO: _MUL16 #1000;#3
|
||||
*
|
||||
LDA #>1000
|
||||
PHA
|
||||
LDA #<1000 ; MULTIPLICAND
|
||||
PHA
|
||||
LDA #>3
|
||||
PHA
|
||||
LDA #<3 ; MULTIPLIER
|
||||
PHA
|
||||
JSR MUL16
|
||||
* BRK ; X=0B, Y=08, == 3000
|
||||
*
|
||||
** UDIV16 DVIDES ONE UNSIGNED NUMBER BY ANOTHER
|
||||
** UNSIGNED NUMBER, THEN RETURNS THE RESULT OVER
|
||||
** THE STACK (16-BIT).
|
||||
*
|
||||
** MACRO: _DIV16 #30000;#3000;U
|
||||
*
|
||||
LDA #>30000
|
||||
PHA
|
||||
LDA #<30000
|
||||
PHA
|
||||
LDA #>3000
|
||||
PHA
|
||||
LDA #<3000
|
||||
PHA
|
||||
JSR UDIV16
|
||||
*BRK ; X=00,Y=0A, == 30000/3000=10
|
||||
*
|
||||
** SDIV16 DIVIDES TWO NUMBERS THAT ARE
|
||||
** SIGNED.
|
||||
*
|
||||
** MACRO: _DIV16 #-1000;#10
|
||||
*
|
||||
LDA #>-1000
|
||||
PHA
|
||||
LDA #<-1000
|
||||
PHA
|
||||
LDA #>10
|
||||
PHA
|
||||
LDA #<10
|
||||
PHA
|
||||
JSR SDIV16
|
||||
* BRK ; X=FF,Y=9C, == -100 (2'S COMPLEMENT)
|
||||
*
|
||||
** SREM16 DIVIDES TWO NUMBERS THAT ARE
|
||||
** SIGNED, THEN RETURNS THE REMAINDER.
|
||||
*
|
||||
** MACRO: _REM16 #-1000;#13
|
||||
*
|
||||
LDA #>-1000
|
||||
PHA
|
||||
LDA #<-1000
|
||||
PHA
|
||||
LDA #>13
|
||||
PHA
|
||||
LDA #<13
|
||||
PHA
|
||||
JSR SREM16
|
||||
* BRK ; X=FF,Y=F4, == -12 (2'S COMPLEMENT)
|
||||
*
|
||||
** UREM16 DIVIDES TWO NUMBERS THAT ARE
|
||||
** UNSIGNED, THEN RETURNS THE REMAINDER.
|
||||
*
|
||||
** MACRO: _REM16 #1000;#13;U
|
||||
*
|
||||
LDA #>1000
|
||||
PHA
|
||||
LDA #<1000
|
||||
PHA
|
||||
LDA #>13
|
||||
PHA
|
||||
LDA #<13
|
||||
PHA
|
||||
JSR UREM16
|
||||
* BRK ; X=00,Y=0C, == 12
|
||||
*
|
||||
** CMP16 COMPARES TWO 16BIT VALUES, THEN
|
||||
** ALTERS THE REGISTER FLAGS AS FOLLOWS:
|
||||
*
|
||||
** MACRO: _CMP16 #1023;#123
|
||||
*
|
||||
|
||||
* 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
|
||||
*
|
||||
LDA #>1023
|
||||
PHA
|
||||
LDA #<1023
|
||||
PHA
|
||||
LDA #>123
|
||||
PHA
|
||||
LDA #<123
|
||||
PHA
|
||||
JSR CMP16
|
||||
* BRK ; P=31, == 11000100
|
||||
* ^^ N ZC
|
||||
* N (SIGN) =0, Z (ZERO) = 0, C (CARRY) = 0
|
||||
*
|
||||
** RND8 SIMPLY RETURNS A PSEUDO-RANDOM
|
||||
** NUMBER BETWEEN 0 AND 255 IN A.
|
||||
*
|
||||
** NO MACRO **
|
||||
*
|
||||
JSR RND8
|
||||
* BRK ; RUN THIS A FEW TIMES TO SEE A CHANGE
|
||||
*
|
||||
*
|
||||
** RANDB RETURNS A VALUE BETWEEN A LOW AND
|
||||
** HIGH BOUNDARY PUSHED TO THE STACK. SINCE THIS
|
||||
** RETURNS A BYTE, THE RANGE MUST BE 0..255.
|
||||
*
|
||||
** MACRO: _RANDB #50;#100
|
||||
*
|
||||
LDA #50
|
||||
PHA
|
||||
LDA #100 ; HIGH BOUND
|
||||
PHA
|
||||
JSR RANDB
|
||||
* BRK ; RUN A FEW TIMES TO SEE THE CHANGE IN A
|
||||
*
|
||||
** MUL8 MULTIPLIES TWO 8-BIT NUMBERS AND
|
||||
** RETURNS A 16BIT RESULT, ALL UNSIGNED.
|
||||
** MACRO: _MUL8 #100;#200
|
||||
*
|
||||
*
|
||||
LDA #100
|
||||
PHA
|
||||
LDA #200
|
||||
PHA
|
||||
JSR MUL8
|
||||
* BRK ; X=4E,Y=20, == 20000
|
||||
*
|
||||
** DIV8 DIVIDES ONE 8BIT NUMBER BY
|
||||
** ANOTHER (UNSIGNED), AND RETURNS
|
||||
** AN 8BIT QUOTIENT.
|
||||
**
|
||||
** THE QUOTIENT IS STORED IN A, WHILE
|
||||
** THE REMAINDER IS RETURNED IN X.
|
||||
** MACRO: _DIV8 #200;#10
|
||||
*
|
||||
*
|
||||
LDA #200
|
||||
PHA
|
||||
_PRNT " ",8D8D
|
||||
_PRNT "THE MUL8 MACRO MULTIPLIES",8D
|
||||
_PRNT "TWO UNSIGNED BYTES AND RETURNS",8D
|
||||
_PRNT "A 16-BIT RESULT (WORD).",8D
|
||||
_PRNT "NOTE THAT THIS RESULT IS STORED",8D
|
||||
_PRNT "WITH THE LOW BYTE FIRST, THEN THE",8D
|
||||
_PRNT "HIGH BYTE, AS PER 6502 CONVENTION.",8D8D
|
||||
_PRNT ":: MUL8 #10;#10 RETURNS (L,H):",8D
|
||||
LDA #10
|
||||
PHA
|
||||
JSR DIV8
|
||||
*BRK ; A=14, X=0, == 20 R 0
|
||||
STA $300
|
||||
MUL8 #10;$300
|
||||
_DUMP RETURN;#2
|
||||
_WAIT
|
||||
_PRNT " ",8D8D
|
||||
_PRNT ":: MUL8 #100;#100 RETURNS (L,H):",8D
|
||||
MUL8 #100;#100
|
||||
_DUMP RETURN;#2
|
||||
_PRNT " ",8D8D
|
||||
_WAIT
|
||||
*
|
||||
** RND16 RETURNS A PSEUDO-RANDOM NUMBER (WORD)
|
||||
** BETWEEN 0 AND 65535 (0000-FFFF)
|
||||
_PRNT "THE DIV8 MACRO DIVIDES A ",8D
|
||||
_PRNT "DIVIDEND BY A DIVISOR,"8D
|
||||
_PRNT "RETURNING THE QUOTIENT.",8D
|
||||
_PRNT "ALL VALUES ARE UNSIGNED.",8D8D
|
||||
DIV8 #100;#10
|
||||
_PRNT ":: DIV8 #100;#10 RETURNS:",8D8D
|
||||
_DUMP RETURN;#1
|
||||
_WAIT
|
||||
_PRNT "::DIV8 #200;#33 RETURNS",8D8D
|
||||
DIV8 #200;#33
|
||||
STY $300 ; REMAINDER IN .Y
|
||||
_DUMP RETURN;#1
|
||||
_PRNT " ",8D8D
|
||||
_PRNT "WITH A REMAINDER OF: ",8D
|
||||
_DUMP $300;#1
|
||||
_PRNT " ",8D8D
|
||||
_WAIT
|
||||
*
|
||||
** NO MACRO **
|
||||
** THE FOLLOWING IS DONE JUST TO SHOW THAT
|
||||
** THESE MACROS ACCEPT LITERAL VALUES AS WELL
|
||||
** AS POINTERS
|
||||
*
|
||||
JSR RND16
|
||||
*BRK ; BRUN A FEW TIMES TO SEE X,Y
|
||||
LDA #$D0 ; LOAD #2000 INTO $300
|
||||
STA $300
|
||||
LDA #$07
|
||||
STA $301
|
||||
LDA #$B8
|
||||
STA $302
|
||||
LDA #$0B
|
||||
STA $303
|
||||
ADD16 $300;#3000
|
||||
_PRNT " ",8D8D
|
||||
_PRNT "THE ADD16 MACRO ADDS TWO",8D
|
||||
_PRNT "16-BIT VALUES, SIGNED OR UNSIGNED.",8D8D
|
||||
_PRNT "ADD16 #3000;#2000 RETURNS: ",8D8D
|
||||
_DUMP RETURN;RETLEN
|
||||
_PRNT " ",8D8D
|
||||
_WAIT
|
||||
*
|
||||
_PRNT " ",8D8D
|
||||
_PRNT "THE SUB16 MACRO SUBTRACTS ONE",8D
|
||||
_PRNT "16-BIT NUMBER FROM ANOTHER.",8D8D
|
||||
_PRNT "CALCULATED LEFT TO RIGHT, L-R.",8D
|
||||
_PRNT "SIGNED OR UNSIGNED.",8D8D
|
||||
_PRNT "SUB16 #5000;#3000 RETURNS: ",8D8D
|
||||
SUB16 #5000;#3000 ; 5000 - 3000
|
||||
_DUMP RETURN;RETLEN
|
||||
_PRNT " ",8D8D
|
||||
_WAIT
|
||||
*
|
||||
_PRNT "THE MUL16 MACRO MULTIPLIES TWO",8D
|
||||
_PRNT "16-BIT NUMBERS, SIGNED OR NOT.",8D8D
|
||||
_PRNT "MUL16 #500;#500 RETURNS: ",8D8D
|
||||
MUL16 #500;#500
|
||||
_DUMP RETURN;RETLEN
|
||||
_PRNT " ",8D8D
|
||||
_WAIT
|
||||
*
|
||||
_PRNT "AND THE DIV16 MACRO DIVIDES THE",8D
|
||||
_PRNT "FIRST PARAMETER BY THE SECOND.",8D8D
|
||||
_PRNT "IF THE THIRD PARAMETER IS",8D
|
||||
_PRNT "AN S, THEN THE DIVISION IS SIGNED;",8D
|
||||
_PRNT "OTHERWISE, IT IS UNSIGNED.",8D8D
|
||||
_PRNT "DIV16 #25000;#500;U RETURNS:",8D8D
|
||||
DIV16 #25000;#500;U
|
||||
_DUMP RETURN;RETLEN
|
||||
_PRNT " ",8D8D
|
||||
_WAIT
|
||||
*
|
||||
** LITTLE LUMPS -- MID/LOW LEVEL
|
||||
_PRNT "THE REM16 MACRO LIKEWISE CALCULATES",8D
|
||||
_PRNT "THE REMAINDER OF A 16-BIT DIVISION.",8D
|
||||
_PRNT "IT ALSO USES THE THIRD PARAMETER TO",8D
|
||||
_PRNT "SIGNIFY WHETHER IT IS SIGNED (S).",8D8D
|
||||
_PRNT "REM16 #5000;#333;U RETURNS:",8D8D
|
||||
REM16 #5000;#333;U
|
||||
_DUMP RETURN;RETLEN
|
||||
_PRNT " ",8D8D
|
||||
_WAIT
|
||||
*
|
||||
_PRNT "CMP16 COMPARES TWO 16-BIT VALUES",8D
|
||||
_PRNT "SETTING FLAGS AS WOULD THE CMP ",8D
|
||||
_PRNT "COMMAND IN 6502 ASSEMBLY. WE WON'T",8D
|
||||
_PRNT "BE ILLUSTRATING THIS FOR NOW ",8D
|
||||
_PRNT "BECAUSE I HATE YOU.",8D8D
|
||||
_WAIT
|
||||
*
|
||||
_PRNT " ",8D8D
|
||||
_PRNT "AND FINALLY, THE RND16 MACRO",8D
|
||||
_PRNT "RETURNS A RANDOM 16-BIT VALUE, FROM",8D
|
||||
_PRNT "0 TO 65455.",8D8D
|
||||
LUP 5
|
||||
_PRNT "RND16 RETURNS:",8D8D
|
||||
RND16
|
||||
_DUMP RETURN;RETLEN
|
||||
_PRNT " ",8D8D
|
||||
_WAIT
|
||||
--^
|
||||
*
|
||||
********************************
|
||||
*
|
||||
* THE FOLLOWING IS CURRENTLY UNDER
|
||||
* CONSTRUCTION, AND DOES NOT YET
|
||||
* WORK AS PLANNED. FLOATING POINT
|
||||
* ROUTINES WILL BE ADDED IN THE NEXT
|
||||
* MAJOR VERSION RELEASE.
|
||||
*
|
||||
********************************
|
||||
*
|
||||
_PRNT " ",8D8D8D8D8D8D8D8D
|
||||
_PRNT "FLOATING-POINT CALCULATION",8D
|
||||
_PRNT "--------------------------",8D8D
|
||||
_PRNT "THIS LIBRARY USES THE APPLESOFT",8D
|
||||
_PRNT "ROUTINES FOR FLOATING-POINT",8D
|
||||
_PRNT "ARITHMETIC, WRITTEN ORIGINALLY",8D
|
||||
_PRNT "BY STEVE WOZNIAK. THESE ARE",8D
|
||||
_PRNT "PRESENT IN EVERY APPLE II MODEL",8D
|
||||
_PRNT "FROM THE APPLE ][+ AND FORWARD.",8D
|
||||
_PRNT " ",8D8D
|
||||
_WAIT
|
||||
_PRNT "FLOATING-POINT VALUES ARE STORED",8D
|
||||
_PRNT "USING SCIENTIFIC NOTATION, WHERE",8D
|
||||
_PRNT "THE FIRST BYTE IS THE EXPONENT,",8D
|
||||
_PRNT "THE SECOND THROUGH FIFTH BYTES",8D
|
||||
_PRNT "ARE THE MANTISSA, AND THE SIXTH",8D
|
||||
_PRNT "BYTE THE SIGN.",8D8D
|
||||
_WAIT
|
||||
_PRNT "EXP MANTISSA SIGN",8D
|
||||
_PRNT "00 01 02 03 04 05",8D8D8D
|
||||
LDA #$84 ; = $80 + EXPONENT; -1 = $79
|
||||
STA $300
|
||||
LDA #A0 ; MANTISSA
|
||||
STA $301 ; STORED MOST SIGNIFICANT
|
||||
LDA #00
|
||||
STA $302
|
||||
STA $303 ; LEFT TO RIGHT.
|
||||
STA $304
|
||||
LDA #$FF
|
||||
STA $305 ; FF= NEGATIVE, 0 = POSITIVE
|
||||
_DUMP $300;#6
|
||||
*
|
||||
** 25E10^-1 = 2.5
|
||||
*
|
||||
_WAIT
|
||||
_PRNT "SO, LET'S PUT 2.5 IN $300 AND",8D
|
||||
_PRNT "10 IN $310, THEN ADD THEM.",8D8D
|
||||
_PRNT "2.5 = 25E-1 SCIENTIFIC NOTATION",8D8D
|
||||
_PRNT " = 01 37 00 00 00 FF",8D8D
|
||||
_PRNT "10 = 1E+1",8D
|
||||
_PRNT " = 01 01 00 00 00 00",8D8D
|
||||
_PRNT " ",8D8D8D
|
||||
LDA #$84
|
||||
LDA #$A0
|
||||
STA $310
|
||||
STA $311
|
||||
LDA #0
|
||||
STA $312
|
||||
STA $313
|
||||
STA $314
|
||||
STA $315
|
||||
_WAIT
|
||||
_PRNT " ",8D8D
|
||||
_PRNT "NOW LET'S ADD THEM WITH THE",8D
|
||||
_PRNT "FPADD MACRO TO SEE THE RESULT.",8D8D
|
||||
_PRNT "FPADD $300;$310 RETURNS:",8D8D
|
||||
FPADD $300;$310
|
||||
_DUMP RETURN;RETLEN
|
||||
*
|
||||
********************************
|
||||
*
|
||||
* END OF CONSTRUCTION
|
||||
*
|
||||
********************************
|
||||
*
|
||||
JMP REENTRY
|
||||
*
|
||||
@ -255,9 +271,9 @@
|
||||
* BOTTOM INCLUDES *
|
||||
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
||||
*
|
||||
*
|
||||
** BOTTOM INCLUDES
|
||||
*
|
||||
PUT MATH16.LIB
|
||||
PUT MATH8.LIB
|
||||
PUT MATH16.LIB
|
||||
PUT REQUIRED.LIB
|
||||
*
|
||||
|
@ -3,3 +3,25 @@ GETNUM EQU $FFA7 ; ASCII TO HEX IN 3E & 3F
|
||||
RNDL EQU $4E ; RANDOM NUMBER LOW
|
||||
RNDH EQU $4F ; RANDOM NUMBER HIGH
|
||||
*
|
||||
FAC EQU $9D ; FLOATING POINT ACCUM
|
||||
FSUB EQU $E7A7 ; FLOATING POINT SUBTRACT
|
||||
FADD EQU $E7BE
|
||||
FMULT EQU $E97F ; FP MULTIPLY
|
||||
FDIV EQU $EA66 ; FP DIVIDE
|
||||
FMULTT EQU $E982
|
||||
FDIVT EQU $EA69
|
||||
FADDT EQU $E7C1
|
||||
FSUBT EQU $E7AA
|
||||
*
|
||||
MOVFM EQU $EAF9 ; MOVE FAC > MEM
|
||||
MOVMF EQU $EB2B ; MOVE MEM > FAC
|
||||
NORM EQU $E82E
|
||||
CONUPK EQU $E9E3
|
||||
*
|
||||
FLOG EQU $E941 ; LOGARITHM
|
||||
FSQR EQU $EE8D ; SQUARE ROOT
|
||||
FCOS EQU $EFEA ; FP COSINE
|
||||
FSIN EQU $EFF1 ; SINE
|
||||
FTAN EQU $F03A ; TANGENT
|
||||
FATN EQU $F09E ; ATANGENT
|
||||
*
|
||||
|
@ -6,78 +6,61 @@
|
||||
* CONTACT: NATHAN.RIGGS@ *
|
||||
* OUTLOOK.COM *
|
||||
* *
|
||||
* VERSION: 0.1.2 *
|
||||
* DATE: 30-OCT-2018 *
|
||||
* VERSION: 0.2.0 *
|
||||
* DATE: 12-DEC-2018 *
|
||||
* ASSEMBLER: MERLIN 8 PRO *
|
||||
* *
|
||||
* LICENSE: APACHE 2.0 LICENSE, *
|
||||
* WHERE APPLICABLE. CODE *
|
||||
* INSPIRED BY OR COPIED FROM *
|
||||
* OTHERS MAY FALL UNDER A *
|
||||
* DIFFERENT LICENSE. I WILL *
|
||||
* DO MY BEST TO NOTIFY SUCH *
|
||||
* CASES. *
|
||||
* LICENSE: APACHE 2.0 *
|
||||
* OS: DOS 3.3 *
|
||||
* *
|
||||
*------------------------------*
|
||||
* *
|
||||
* THIS IS A MACRO LIBRARY FOR *
|
||||
* MATH.LIB, AND CAN BE USED *
|
||||
* REGARDLESS OF WHETHER A *
|
||||
* SPECIFIC FUNCTION IS *
|
||||
* INCLUDED AS A PUT IN THE *
|
||||
* MAIN SOURCE. *
|
||||
* MATH8.LIB AND MATH16.LIB *
|
||||
* *
|
||||
*------------------------------*
|
||||
* *
|
||||
* LIST OF MACROS *
|
||||
* *
|
||||
* _ADD16 : 16BIT ADD *
|
||||
* _SUB16 : 16BIT SUBTRACT *
|
||||
* _MUL16 : 16BIT MULTIPLY *
|
||||
* _DIV16 : 16BIT DIVIDE *
|
||||
* _REM16 : 16BIT REMAINDER *
|
||||
* _RND8 : RANDOM # 0..255 *
|
||||
* _RNDB : RANDOM # LOW..HIGH *
|
||||
* *
|
||||
* _CMP16 : 16BIT COMPARE *
|
||||
* _RND16 : 16BIT RANDOM # *
|
||||
* _RNDW : RANDOM WORD LOW..HI *
|
||||
* _MUL8 : 8BIT MULTIPLY *
|
||||
* _DIV8 : 8BIT DIVIDE, REMAIND *
|
||||
* ADD16 : 16BIT ADD *
|
||||
* SUB16 : 16BIT SUBTRACT *
|
||||
* MUL16 : 16BIT MULTIPLY *
|
||||
* DIV16 : 16BIT DIVIDE *
|
||||
* REM16 : 16BIT REMAINDER *
|
||||
* RND8 : RANDOM # 0..255 *
|
||||
* RNDB : RANDOM # LOW..HIGH *
|
||||
* CMP16 : 16BIT COMPARE *
|
||||
* RND16 : 16BIT RANDOM # *
|
||||
* RNDW : RANDOM WORD LOW..HI *
|
||||
* MUL8 : 8BIT MULTIPLY *
|
||||
* DIV8 : 8BIT DIVIDE, REMAIND *
|
||||
* *
|
||||
*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*
|
||||
*
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* _ADD16 :: 16-BIT ADDITION *
|
||||
* ADD16 :: 16-BIT ADDITION *
|
||||
*- -*
|
||||
* ADD TWO 16BIT VALUES, STORE *
|
||||
* RESULT IN Y, X (LOW, HIGH) *
|
||||
*- -*
|
||||
* PARAMETERS: *
|
||||
* *
|
||||
* PARAM1 = ADDEND 1 *
|
||||
* PARAM2 = ADDEND 2 *
|
||||
* ]1 = ADDEND 1 *
|
||||
* ]2 = ADDEND 2 *
|
||||
* ]3 = INDIRECT MEM FLAG *
|
||||
*- -*
|
||||
* SAMPLE USAGE: *
|
||||
* *
|
||||
* _ADD16 #3000;#4000 *
|
||||
* ADD16 #3000;#4000 *
|
||||
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
||||
*
|
||||
_ADD16 MAC
|
||||
LDA #>]1
|
||||
PHA
|
||||
LDA #<]1
|
||||
PHA
|
||||
LDA #>]2
|
||||
PHA
|
||||
LDA #<]2
|
||||
PHA
|
||||
JSR ADD16
|
||||
ADD16 MAC
|
||||
_ISLIT ]1
|
||||
_ISLIT ]2
|
||||
JSR ADDIT16
|
||||
<<<
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* _SUB16 :: 16-BIT SUBTRACTION *
|
||||
* SUB16 :: 16-BIT SUBTRACTION *
|
||||
*- -*
|
||||
* SUBTRACTS ONE 16BIT INTEGER *
|
||||
* FROM ANOTHER, STORING THE *
|
||||
@ -85,28 +68,22 @@ _ADD16 MAC
|
||||
*- -*
|
||||
* PARAMETERS: *
|
||||
* *
|
||||
* PARAM1 = MINUEND *
|
||||
* PARAM2 = SUBTRAHEND *
|
||||
* ]1 = MINUEND *
|
||||
* ]2 = SUBTRAHEND *
|
||||
*- -*
|
||||
* SAMPLE USAGE: *
|
||||
* *
|
||||
* _SUB16 #2000;#1500 *
|
||||
* SUB16 #2000;#1500 *
|
||||
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
||||
*
|
||||
_SUB16 MAC
|
||||
LDA #>]1
|
||||
PHA
|
||||
LDA #<]1
|
||||
PHA
|
||||
LDA #>]2
|
||||
PHA
|
||||
LDA #<]2
|
||||
PHA
|
||||
JSR SUB16
|
||||
SUB16 MAC
|
||||
_ISLIT ]1
|
||||
_ISLIT ]2
|
||||
JSR SUBT16
|
||||
<<<
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* _MUL16 :: 16-BIT MULTIPLY *
|
||||
* MUL16 :: 16-BIT MULTIPLY *
|
||||
*- -*
|
||||
* MULTIPLIES TWO 16BIT NUMBERS *
|
||||
* AND RETURNS THE PRODUCT IN *
|
||||
@ -114,133 +91,88 @@ _SUB16 MAC
|
||||
*- -*
|
||||
* PARAMETERS: *
|
||||
* *
|
||||
* PARAM1 = MULTIPLICAND *
|
||||
* PARAM2 = MULTIPLIER *
|
||||
* ]1 = MULTIPLICAND *
|
||||
* ]2 = MULTIPLIER *
|
||||
*- -*
|
||||
* SAMPLE USAGE: *
|
||||
* *
|
||||
* _MUL16 #400;#500 *
|
||||
* MUL16 #400;#500 *
|
||||
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
||||
*
|
||||
_MUL16 MAC
|
||||
LDA #>]1
|
||||
PHA
|
||||
LDA #<]1
|
||||
PHA
|
||||
LDA #>]2
|
||||
PHA
|
||||
LDA #<]2
|
||||
PHA
|
||||
JSR MUL16
|
||||
*
|
||||
** NOW XFER STACK TO X,Y
|
||||
*
|
||||
** REALLY, THIS SHOULD BE IN THE
|
||||
** ACTUAL ROUTINE. UNNECESSARY CYCLES.
|
||||
*
|
||||
** ALSO, HAVE IT RETURN THE 24BIT IN A,
|
||||
** EVEN THOUGH IT'S CURRENTLY UNRELIABLE
|
||||
*
|
||||
PLA
|
||||
TAY
|
||||
PLA
|
||||
TAX ; HIGH
|
||||
MUL16 MAC
|
||||
_ISLIT ]1
|
||||
_ISLIT ]2
|
||||
JSR MULT16
|
||||
<<<
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* _DIV16 :: 16-BIT DIVISION *
|
||||
* DIV16 :: 16-BIT DIVISION *
|
||||
*- -*
|
||||
* DIVIDES ONE 16BIT NUMBER BY *
|
||||
* ANOTHER AND RETURNS THE *
|
||||
* RESULT IN Y,X (LOW,HIGH). *
|
||||
* *
|
||||
* IF THE THIRD PARAMETER IS *
|
||||
* PASSED WITH A U, VALUES WILL *
|
||||
* BE TREATED AS UNSIGNED; IF *
|
||||
* PASSED WITH A S, VALUES WILL *
|
||||
* BE TREATED AS SIGNED; IF *
|
||||
* NOT, VALUES WILL BE TREATED *
|
||||
* AS SIGNED. *
|
||||
* AS UNSIGNED. *
|
||||
*- -*
|
||||
* PARAMETERS: *
|
||||
* *
|
||||
* PARAM1 = DIVIDEND *
|
||||
* PARAM2 = DIVISOR *
|
||||
* ]1 = DIVIDEND *
|
||||
* ]2 = DIVISOR *
|
||||
*- -*
|
||||
* SAMPLE USAGE: *
|
||||
* *
|
||||
* _DIV16 #3000;#300 *
|
||||
* DIV16 #3000;#300 *
|
||||
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
||||
*
|
||||
_DIV16 MAC
|
||||
LDA #>]1
|
||||
PHA
|
||||
LDA #<]1
|
||||
PHA
|
||||
LDA #>]2
|
||||
PHA
|
||||
LDA #>]2
|
||||
PHA
|
||||
IF U,]3 ; UNSIGNED
|
||||
JSR UDIV16
|
||||
DIV16 MAC
|
||||
_ISLIT ]1
|
||||
_ISLIT ]2
|
||||
IF S,]3 ; SIGNED
|
||||
JSR SDIVD16
|
||||
ELSE
|
||||
JSR SDIV16 ; SIGNED
|
||||
JSR UDIVD16 ; UNSIGNED
|
||||
FIN
|
||||
*
|
||||
** NOW TRANSFER STACK TO Y,X
|
||||
*
|
||||
PLA
|
||||
TAY ; LOW
|
||||
PLA
|
||||
TAX ; HIGH
|
||||
<<<
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* _REM16 :: 16-BIT DIV REMAINR *
|
||||
* REM16 :: 16-BIT DIV REMAINR *
|
||||
*- -*
|
||||
* DIVIDES ONE INTEGER BY *
|
||||
* ANOTHER AND RETURNS THE *
|
||||
* REMAINDER IN Y,X (LOW, HIGH) *
|
||||
* *
|
||||
* IF THE THIRD PARAMETER IS *
|
||||
* PASSED WITH A U, VALUES WILL *
|
||||
* BE TREATED AS UNSIGNED; IF *
|
||||
* PASSED WITH A S, VALUES WILL *
|
||||
* BE TREATED AS SIGNED; IF *
|
||||
* NOT, VALUES WILL BE TREATED *
|
||||
* AS SIGNED. *
|
||||
* AS UNSIGNED. *
|
||||
*- -*
|
||||
* PARAMETERS: *
|
||||
* *
|
||||
* PARAM1 = DIVIDEND *
|
||||
* PARAM2 = DIVISOR *
|
||||
* ]1 = DIVIDEND *
|
||||
* ]2 = DIVISOR *
|
||||
*- -*
|
||||
* SAMPLE USAGE: *
|
||||
* *
|
||||
* _REM16 #1000;#333 *
|
||||
* REM16 #1000;#333 *
|
||||
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
||||
*
|
||||
_REM16 MAC
|
||||
LDA #>]1
|
||||
PHA
|
||||
LDA #<]1
|
||||
PHA
|
||||
LDA #>]2
|
||||
PHA
|
||||
LDA #>]2
|
||||
PHA
|
||||
IF U,]3 ; UNSIGNED
|
||||
JSR UREM16
|
||||
REM16 MAC
|
||||
_ISLIT ]1
|
||||
_ISLIT ]2
|
||||
IF S,]3 ; SIGNED
|
||||
JSR SREMD16
|
||||
ELSE
|
||||
JSR SREM16 ; SIGNED
|
||||
JSR UREMD16 ; UNSIGNED
|
||||
FIN
|
||||
*
|
||||
** TRANSFER STACK TO Y,XX
|
||||
*
|
||||
PLA
|
||||
TAY ; LOW
|
||||
PLA
|
||||
TAX ; HIGH
|
||||
<<<
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* _RNDB :: 8BIT RANDOM LOW,HI *
|
||||
* RNDB :: 8BIT RANDOM LOW,HI *
|
||||
*- -*
|
||||
* RETURNS A RANDOM NUMBER IN *
|
||||
* REGISTER A THAT IS BETWEEN *
|
||||
@ -253,15 +185,15 @@ _REM16 MAC
|
||||
*- -*
|
||||
* PARAMETERS: *
|
||||
* *
|
||||
* PARAM1 = LOW BOUNDARY *
|
||||
* PARAM2 = HIGH BOUNDARY *
|
||||
* ]1 = LOW BOUNDARY *
|
||||
* ]2 = HIGH BOUNDARY *
|
||||
*- -*
|
||||
* SAMPLE USAGE: *
|
||||
* *
|
||||
* _RNDB #50;#100 *
|
||||
* RNDB #50;#100 *
|
||||
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
||||
*
|
||||
_RNDB MAC
|
||||
RNDB MAC
|
||||
LDA ]1 ; LOW
|
||||
PHA
|
||||
LDA ]2 ; HIGH
|
||||
@ -270,7 +202,7 @@ _RNDB MAC
|
||||
<<<
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* _CMP16 : 16BIT COMPARISON *
|
||||
* CMP16 : 16BIT COMPARISON *
|
||||
*- -*
|
||||
* COMPARES TWO 16BIT VALUES *
|
||||
* AND ALTERS THE P-REGISTER *
|
||||
@ -278,28 +210,22 @@ _RNDB MAC
|
||||
*- -*
|
||||
* PARAMETERS: *
|
||||
* *
|
||||
* PARAM1 = WORD 1 TO COMPARE *
|
||||
* PARAM2 = WORD 2 TO COMPARE *
|
||||
* ]1 = WORD 1 TO COMPARE *
|
||||
* ]2 = WORD 2 TO COMPARE *
|
||||
*- -*
|
||||
* SAMPLE USAGE: *
|
||||
* *
|
||||
* _CMP16 #1023;#3021 *
|
||||
* CMP16 #1023;#3021 *
|
||||
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
||||
*
|
||||
_CMP16 MAC
|
||||
LDA #>]1
|
||||
PHA
|
||||
LDA #<]1
|
||||
PHA
|
||||
LDA #>]2
|
||||
PHA
|
||||
LDA #<]2
|
||||
PHA
|
||||
JSR CMP16
|
||||
CMP16 MAC
|
||||
_ISLIT ]1
|
||||
_ISLIT ]2
|
||||
JSR COMP16
|
||||
<<<
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* _MUL8 :: 8BIT MULTIPLICATION *
|
||||
* MUL8 :: 8BIT MULTIPLICATION *
|
||||
*- -*
|
||||
* MULTIPLIES TWO 8BIT VALUES *
|
||||
* AND RETURNS A 16BIT RESULT *
|
||||
@ -307,24 +233,24 @@ _CMP16 MAC
|
||||
*- -*
|
||||
* PARAMETERS: *
|
||||
* *
|
||||
* PARAM1 = MULTIPLICAND *
|
||||
* PARAM2 = MULTIPLIER *
|
||||
* ]1 = MULTIPLICAND *
|
||||
* ]2 = MULTIPLIER *
|
||||
*- -*
|
||||
* SAMPLE USAGE: *
|
||||
* *
|
||||
* _MUL8 #10;#20 *
|
||||
* MUL8 #10;#20 *
|
||||
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
||||
*
|
||||
_MUL8 MAC
|
||||
MUL8 MAC
|
||||
LDA ]1
|
||||
PHA
|
||||
LDA ]2
|
||||
PHA
|
||||
JSR MUL8
|
||||
JSR MULT8
|
||||
<<<
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* _DIV8 :: 8BIT MULTIPLICATION *
|
||||
* DIV8 :: 8BIT MULTIPLICATION *
|
||||
*- -*
|
||||
* DIVIDES ONE 8BIT NUMBER BY *
|
||||
* ANOTHER AND STORES THE *
|
||||
@ -333,18 +259,58 @@ _MUL8 MAC
|
||||
*- -*
|
||||
* PARAMETERS: *
|
||||
* *
|
||||
* PARAM1 = DIVIDEND *
|
||||
* PARAM2 = DIVISOR *
|
||||
* ]1 = DIVIDEND *
|
||||
* ]2 = DIVISOR *
|
||||
*- -*
|
||||
* SAMPLE USAGE: *
|
||||
* *
|
||||
* _DIV8 #100;#10 *
|
||||
* DIV8 #100;#10 *
|
||||
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
||||
*
|
||||
_DIV8 MAC
|
||||
DIV8 MAC
|
||||
LDA ]1
|
||||
PHA
|
||||
LDA ]2
|
||||
PHA
|
||||
JSR DIV8
|
||||
JSR DIVD8
|
||||
<<<
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* RND16 :: RANDOM 16-BIT NUM *
|
||||
*- -*
|
||||
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
||||
*
|
||||
RND16 MAC
|
||||
JSR RAND16
|
||||
<<<
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* FPADD :: FLOATING POINT ADD *
|
||||
*- -*
|
||||
* ADD TWO FLOATING-POINT NUMS *
|
||||
* STORED IN GIVEN ADDRESSES *
|
||||
* AND STORE RESULT IN [RETURN] *
|
||||
*- -*
|
||||
* USAGE: FPADD $300;$310 *
|
||||
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
||||
*
|
||||
FPADD MAC
|
||||
LDX #]1
|
||||
LDY #>]1
|
||||
JSR MOVFM
|
||||
*
|
||||
LDA #]2
|
||||
LDY #>]2
|
||||
JSR CONUPK
|
||||
JSR NORM
|
||||
LDA $9D
|
||||
JSR FADDT
|
||||
*
|
||||
LDX #RETURN
|
||||
LDY #>RETURN
|
||||
JSR MOVMF
|
||||
*
|
||||
LDA #6
|
||||
STA RETLEN
|
||||
*
|
||||
<<<
|
||||
|
@ -6,44 +6,40 @@
|
||||
* CONTACT: NATHAN.RIGGS@ *
|
||||
* OUTLOOK.COM *
|
||||
* *
|
||||
* VERSION: 0.1.2 *
|
||||
* DATE: 30-OCT-2018 *
|
||||
* VERSION: 0.2.0 *
|
||||
* DATE: 12-DEC-2018 *
|
||||
* ASSEMBLER: MERLIN 8 PRO *
|
||||
* *
|
||||
* LICENSE: APACHE 2.0, WHERE *
|
||||
* APPLICABLE. CODE INSPIRED *
|
||||
* BY THE WORKS OF OTHERS MAY *
|
||||
* FALL UNDER A DIFFERENT *
|
||||
* LICENSE (NOTED IN ROUTINE). *
|
||||
* OS: DOS 3.3 *
|
||||
* LICENSE: APACHE 2.0 *
|
||||
* *
|
||||
* STANDARD INTEGER MATH *
|
||||
* LIBRARY FOR 8-BIT AND 16-BIT *
|
||||
* CALCALUATIONS, AS WELL AS *
|
||||
* COMMON ROUTINES LIKE PSEUDO- *
|
||||
* RANDOM NUMBER GENERATORS. *
|
||||
* LIBRARY FOR 16-BIT VALUES, *
|
||||
* SIGNED OR UNSIGNED, AS WELL *
|
||||
* AS 16-BIT PRNG ROUTINES. *
|
||||
* *
|
||||
*------------------------------*
|
||||
* *
|
||||
* LIST OF ROUTINES *
|
||||
* *
|
||||
* ADD16 : 16BIT ADD *
|
||||
* SUB16 : 16BIT SUBTRACT *
|
||||
* MUL16 : 16BIT MULTIPLY *
|
||||
* SDIV16 : 16BIT DIVIDE (SIGN) *
|
||||
* UDIV16 : 16BIT DIVIDE (UNSN) *
|
||||
* SREM16 : 16BIT REMNDR (SIGN) *
|
||||
* UREM16 : 16BIT REMNDR (UNSN) *
|
||||
* CMP16 : 16BIT COMPARE *
|
||||
* RND16 : RANDOM # 0..65535 *
|
||||
* ADDIT16: 16-BIT ADD *
|
||||
* SUBT16: 16BIT SUBTRACT *
|
||||
* MULT16 : 16BIT MULTIPLY *
|
||||
* SDIVD16: 16BIT DIVIDE (SIGN) *
|
||||
* UDIVD16: 16BIT DIVIDE (UNSN) *
|
||||
* SREMD16: 16BIT REMNDR (SIGN) *
|
||||
* UREMD16: 16BIT REMNDR (UNSN) *
|
||||
* COMP16 : 16BIT COMPARE *
|
||||
* RAND16 : RANDOM # 0..65535 *
|
||||
* *
|
||||
*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* ADD16 :: ADD 16-BIT VALUES *
|
||||
* ADDIT16 :: ADD 16-BIT VALUES *
|
||||
*- -*
|
||||
* ADDS TWO SIXTEEN BIT VALUES *
|
||||
* AND RETURNS A 16 BIT VALUE *
|
||||
* IN Y (LOW) AND X (HIGH). *
|
||||
* IN .Y (LOW) AND .X (HIGH). *
|
||||
* CAN BE SIGNED OR UNSIGNED. *
|
||||
*- -*
|
||||
* CLOBBERS: *
|
||||
* *
|
||||
@ -54,15 +50,15 @@
|
||||
*- -*
|
||||
* USAGE: *
|
||||
* *
|
||||
* LDA #>1000 *
|
||||
* PHA *
|
||||
* LDA #<1000 *
|
||||
* PHA *
|
||||
* LDA #>1200 ; ADD2 *
|
||||
* PHA *
|
||||
* LDA #<1200 *
|
||||
* PHA *
|
||||
* JSR ADD16 *
|
||||
* LDA #>1000 *
|
||||
* PHA *
|
||||
* LDA #<1000 *
|
||||
* PHA *
|
||||
* LDA #>1200 ; ADD2 *
|
||||
* PHA *
|
||||
* LDA #<1200 *
|
||||
* PHA *
|
||||
* JSR ADDIT16 *
|
||||
*- -*
|
||||
* ENTRY *
|
||||
* *
|
||||
@ -82,35 +78,22 @@
|
||||
* LOW BYTE OF RETURN ADDRESS *
|
||||
* HI BYTE OF RETURN ADDRESS *
|
||||
* *
|
||||
* Y = LOW BYTE OF RESULT *
|
||||
* X = HIGH BYTE OF RESULT *
|
||||
* A = LOW BYTE OF RET ADDR *
|
||||
*- -*
|
||||
* ADAPTED FROM LEVANTHAL AND *
|
||||
* WINTHROP'S /6502 ASSEMBLY *
|
||||
* LANGUAGE ROUTINES/. *
|
||||
* AS SUCH, THIS MAY NOT FALL *
|
||||
* UNDER THE APACHE 2.0 LICENSE *
|
||||
* AGREEMENT, SINCE THE BOOK *
|
||||
* WAS WRITTEN BEFORE THE *
|
||||
* LICENSE! *
|
||||
* .Y = LOW BYTE OF RESULT *
|
||||
* .X = HIGH BYTE OF RESULT *
|
||||
* .A = LOW BYTE OF RET ADDR *
|
||||
* *
|
||||
* THAT SAID, LEVENTHAL WROTE *
|
||||
* THAT THE PURPOSE OF THE BOOK *
|
||||
* WAS TO COPY THE SOURCE CODE, *
|
||||
* AS REINVENTING THE WHEEL IS *
|
||||
* TEDIOUS, AND HE PLACED NO *
|
||||
* RESTRICTIONS ON ITS USE. *
|
||||
* [RETURN] = RESULT (2 BYTES) *
|
||||
* [RETLEN] = 2 (RESULT LENGTH) *
|
||||
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
||||
*
|
||||
ADD16
|
||||
ADDIT16
|
||||
*
|
||||
** GET RETURN ADDR
|
||||
*
|
||||
PLA
|
||||
STA :RETADR
|
||||
STA RETADR
|
||||
PLA
|
||||
STA :RETADR+1
|
||||
STA RETADR+1
|
||||
*
|
||||
** GET PARAMETERS
|
||||
*
|
||||
@ -127,31 +110,35 @@ ADD16
|
||||
CLC
|
||||
ADC :ADD2
|
||||
TAY ; LOW BYTE
|
||||
STY RETURN
|
||||
LDA :ADD1+1
|
||||
ADC :ADD2+1
|
||||
TAX ; HIGH BYTE
|
||||
STX RETURN+1
|
||||
LDA #2
|
||||
STA RETLEN
|
||||
*
|
||||
** RESTORE RETURN ADDRESS
|
||||
*
|
||||
LDA :RETADR+1
|
||||
LDA RETADR+1
|
||||
PHA
|
||||
LDA :RETADR
|
||||
LDA RETADR
|
||||
PHA
|
||||
*
|
||||
RTS
|
||||
*
|
||||
** DATA
|
||||
*
|
||||
:RETADR DS 2
|
||||
:ADD1 DS 2
|
||||
:ADD2 DS 2
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* SUB16 :: SUBTRACT WORDS *
|
||||
* SUBT16 :: SUBTRACT WORDS *
|
||||
*- -*
|
||||
* SUBTRACT ONE 16BIT NUMBER *
|
||||
* FROM ANOTHER, RETURNING THE *
|
||||
* RESULT IN X (HI) AND Y (LOW) *
|
||||
* RESULT IN .Y (LOW), .X (HI). *
|
||||
* SIGNED OR UNSIGNED. *
|
||||
*- -*
|
||||
* CLOBBERS: *
|
||||
* *
|
||||
@ -162,15 +149,15 @@ ADD16
|
||||
*- -*
|
||||
* USAGE: *
|
||||
* *
|
||||
* LDA #>1000 ; MINU *
|
||||
* PHA *
|
||||
* LDA #<1000 *
|
||||
* PHA *
|
||||
* LDA #>500 ; SUBT *
|
||||
* PHA *
|
||||
* LDA #<500 *
|
||||
* PHA *
|
||||
* JSR SUB16 *
|
||||
* LDA #>1000 ; MINUEND *
|
||||
* PHA *
|
||||
* LDA #<1000 *
|
||||
* PHA *
|
||||
* LDA #>500 ; SUBTRAHEND *
|
||||
* PHA *
|
||||
* LDA #<500 *
|
||||
* PHA *
|
||||
* JSR SUBT16 *
|
||||
*- -*
|
||||
* ENTRY *
|
||||
* *
|
||||
@ -190,35 +177,22 @@ ADD16
|
||||
* LOW BYTE OF RETURN ADDRESS *
|
||||
* HI BYTE OF RETURN ADDRESS *
|
||||
* *
|
||||
* Y = RESULT LOW BYTE *
|
||||
* X = RESULT HIGH BYTE *
|
||||
* A = LOW BYTE OF RET ADDR *
|
||||
*- -*
|
||||
* ADAPTED FROM LEVANTHAL AND *
|
||||
* WINTHROP'S /6502 ASSEMBLY *
|
||||
* LANGUAGE ROUTINES/. *
|
||||
* AS SUCH, THIS MAY NOT FALL *
|
||||
* UNDER THE APACHE 2.0 LICENSE *
|
||||
* AGREEMENT, SINCE THE BOOK *
|
||||
* WAS WRITTEN BEFORE THE *
|
||||
* LICENSE! *
|
||||
* .Y = RESULT LOW BYTE *
|
||||
* .X = RESULT HIGH BYTE *
|
||||
* .A = LOW BYTE OF RET ADDR *
|
||||
* *
|
||||
* THAT SAID, LEVENTHAL WROTE *
|
||||
* THAT THE PURPOSE OF THE BOOK *
|
||||
* WAS TO COPY THE SOURCE CODE, *
|
||||
* AS REINVENTING THE WHEEL IS *
|
||||
* TEDIOUS, AND HE PLACED NO *
|
||||
* RESTRICTIONS ON ITS USE. *
|
||||
* [RETURN] = RESULT (2 BYTES) *
|
||||
* [RETLEN] = 2 (RESULT LENGTH) *
|
||||
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
||||
*
|
||||
SUB16
|
||||
SUBT16
|
||||
*
|
||||
** GET RETURN ADDRESS
|
||||
*
|
||||
PLA
|
||||
STA :RETADR
|
||||
STA RETADR
|
||||
PLA
|
||||
STA :RETADR+1
|
||||
STA RETADR+1
|
||||
*
|
||||
** GET PARAMETERS
|
||||
*
|
||||
@ -237,42 +211,40 @@ SUB16
|
||||
SEC
|
||||
SBC :SUBT
|
||||
TAY ; LOW BYTE
|
||||
STY RETURN
|
||||
LDA :MINU+1
|
||||
SBC :SUBT+1
|
||||
TAX ; HIGH BYTE
|
||||
STX RETURN+1
|
||||
LDA #2
|
||||
STA RETLEN
|
||||
*
|
||||
** RESTORE REUTNR ADDRESS
|
||||
** RESTORE RETURN ADDRESS
|
||||
*
|
||||
LDA :RETADR+1
|
||||
LDA RETADR+1
|
||||
PHA
|
||||
LDA :RETADR
|
||||
LDA RETADR
|
||||
PHA
|
||||
*
|
||||
RTS
|
||||
*
|
||||
** DATA
|
||||
*
|
||||
:RETADR DS 2
|
||||
:MINU DS 2
|
||||
:SUBT DS 2
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* MUL16 :: MULTIPLY WORDS *
|
||||
* MULT16 :: MULTIPLY WORDS *
|
||||
*- -*
|
||||
* PERFORM MULTIPLICATION USING *
|
||||
* THE SHIFT AND ADD ALGORITHM *
|
||||
* *
|
||||
* THIS ALGORITHM PRODUCES AN *
|
||||
* UNSIGNED 32-BIT PRODUCT IN *
|
||||
* HIPROD AND MLIER WITH HIPROD *
|
||||
* BEING THE HIGH WORD. *
|
||||
* *
|
||||
* NOTE: WHILE THIS DOES PASS *
|
||||
* THE FULL 32BIT PRODUCT BACK *
|
||||
* VIA X AND Y, BUT THIS WOULD *
|
||||
* VIA X AND Y, THIS WOULD *
|
||||
* RETURN FALSE RESULTS IF ONE *
|
||||
* OF THE PARAMETERS HAD BEEN *
|
||||
* SIGNED. THIS, USUALLY ONLY *
|
||||
* SIGNED. THUS, USUALLY ONLY *
|
||||
* THE LOW WORD IS USED. *
|
||||
*- -*
|
||||
* CLOBBERS: *
|
||||
@ -284,15 +256,15 @@ SUB16
|
||||
*- -*
|
||||
* USAGE: *
|
||||
* *
|
||||
* LDA #>1000 *
|
||||
* PHA *
|
||||
* LDA #<1000 ; MCAND *
|
||||
* PHA *
|
||||
* LDA #>3 *
|
||||
* PHA *
|
||||
* LDA #<3 ; MLIER *
|
||||
* PHA *
|
||||
* JSR MUL16 ; = 3000 *
|
||||
* LDA #>1000 *
|
||||
* PHA *
|
||||
* LDA #<1000 ; MCAND *
|
||||
* PHA *
|
||||
* LDA #>3 *
|
||||
* PHA *
|
||||
* LDA #<3 ; MLIER *
|
||||
* PHA *
|
||||
* JSR MUL16 ; = 3000 *
|
||||
*- -*
|
||||
* ENTRY *
|
||||
* *
|
||||
@ -314,35 +286,26 @@ SUB16
|
||||
* LOW BYTE OF PRODUCT *
|
||||
* HIGH BYTE OF PRODUCT (16BIT) *
|
||||
* *
|
||||
* Y = LOW BYTE OF HIGH WORD *
|
||||
* X = HIGH BYTE OF HIGH WORD *
|
||||
* A = LOW BYTE OF RET ADDR *
|
||||
* .Y = LOW BYTE OF HIGH WORD *
|
||||
* .X = HIGH BYTE OF HIGH WORD *
|
||||
* .A = LOW BYTE OF RET ADDR *
|
||||
* *
|
||||
* [RETURN] = RESULT (2 BYTES) *
|
||||
* [RETLEN] = 2 (RESULT LENGTH) *
|
||||
*- -*
|
||||
* ADAPTED FROM LEVANTHAL AND *
|
||||
* WINTHROP'S /6502 ASSEMBLY *
|
||||
* LANGUAGE ROUTINES/. *
|
||||
* AS SUCH, THIS MAY NOT FALL *
|
||||
* UNDER THE APACHE 2.0 LICENSE *
|
||||
* AGREEMENT, SINCE THE BOOK *
|
||||
* WAS WRITTEN BEFORE THE *
|
||||
* LICENSE! *
|
||||
* *
|
||||
* THAT SAID, LEVENTHAL WROTE *
|
||||
* THAT THE PURPOSE OF THE BOOK *
|
||||
* WAS TO COPY THE SOURCE CODE, *
|
||||
* AS REINVENTING THE WHEEL IS *
|
||||
* TEDIOUS, AND HE PLACED NO *
|
||||
* RESTRICTIONS ON ITS USE. *
|
||||
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
||||
*
|
||||
MUL16
|
||||
MULT16
|
||||
*
|
||||
** GET RETURN ADDRESS
|
||||
*
|
||||
PLA
|
||||
STA :RETADR
|
||||
STA RETADR
|
||||
PLA
|
||||
STA :RETADR+1
|
||||
STA RETADR+1
|
||||
*
|
||||
** GET PARAMETERS
|
||||
*
|
||||
@ -400,14 +363,20 @@ MUL16
|
||||
*
|
||||
LDA :MLIER+1
|
||||
TAX
|
||||
STX RETURN+1
|
||||
LDA :MLIER
|
||||
TAY
|
||||
STY RETURN
|
||||
LDA :HPROD
|
||||
STA RETURN+2
|
||||
LDA #2
|
||||
STA RETLEN
|
||||
*
|
||||
** RESTORE RETURN ADDRESS
|
||||
*
|
||||
LDA :RETADR+1
|
||||
LDA RETADR+1
|
||||
PHA
|
||||
LDA :RETADR
|
||||
LDA RETADR
|
||||
PHA
|
||||
*
|
||||
LDA :HPROD ;24BIT
|
||||
@ -418,7 +387,6 @@ MUL16
|
||||
:MCAND DS 3
|
||||
:MLIER DS 3
|
||||
:HPROD DS 2
|
||||
:RETADR DS 2
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* 16-BIT DIVISION: *
|
||||
@ -454,15 +422,15 @@ MUL16
|
||||
** ALL ROUTINES USE THE SAME *
|
||||
** FORMAT. *
|
||||
* *
|
||||
* LDA #>10000 *
|
||||
* PHA *
|
||||
* LDA #<10000 ; DIVIDND *
|
||||
* PHA *
|
||||
* LDA #>1000 ; DIVISOR *
|
||||
* PHA *
|
||||
* LDA #<1000 *
|
||||
* PHA *
|
||||
* JSR UDIV16 *
|
||||
* LDA #>10000 *
|
||||
* PHA *
|
||||
* LDA #<10000 ; DIVIDEND *
|
||||
* PHA *
|
||||
* LDA #>1000 ; DIVISOR *
|
||||
* PHA *
|
||||
* LDA #<1000 *
|
||||
* PHA *
|
||||
* JSR UDIV16 *
|
||||
*- -*
|
||||
* ENTRY *
|
||||
* *
|
||||
@ -486,31 +454,25 @@ MUL16
|
||||
* ELSE CARRY=1, QUOTIENT=0, *
|
||||
* AND REMAINDER=0 *
|
||||
* *
|
||||
* Y = COUNTER; TRASH *
|
||||
* X = COUNTER; TRASH *
|
||||
* A = LOW BYTE OF RET ADDR *
|
||||
* .Y = COUNTER; TRASH *
|
||||
* .X = COUNTER; TRASH *
|
||||
* .A = LOW BYTE OF RET ADDR *
|
||||
* *
|
||||
* [RETURN] = RESULT (2 BYTES) *
|
||||
* [RETLEN] = 2 (RESULT LENGTH) *
|
||||
*- -*
|
||||
* ADAPTED FROM LEVANTHAL AND *
|
||||
* WINTHROP'S /6502 ASSEMBLY *
|
||||
* LANGUAGE ROUTINES/. *
|
||||
* AS SUCH, THIS MAY NOT FALL *
|
||||
* UNDER THE APACHE 2.0 LICENSE *
|
||||
* AGREEMENT, SINCE THE BOOK *
|
||||
* WAS WRITTEN BEFORE THE *
|
||||
* LICENSE! *
|
||||
* *
|
||||
* THAT SAID, LEVENTHAL WROTE *
|
||||
* THAT THE PURPOSE OF THE BOOK *
|
||||
* WAS TO COPY THE SOURCE CODE, *
|
||||
* AS REINVENTING THE WHEEL IS *
|
||||
* TEDIOUS, AND HE PLACED NO *
|
||||
* RESTRICTIONS ON ITS USE. *
|
||||
* AS SUCH, IT MAY FALL UNDER A *
|
||||
* DIFFERENT LICENSE UNTIL IT *
|
||||
* IS RADICALLY REWORKED. *
|
||||
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
||||
*
|
||||
UDIV16
|
||||
UDIVD16
|
||||
LDA #0
|
||||
BEQ UDIVMD
|
||||
UREM16
|
||||
UREMD16
|
||||
LDA #2
|
||||
UDIVMD
|
||||
STA _RSLTI
|
||||
@ -518,9 +480,9 @@ UDIVMD
|
||||
** GET RETURN ADDRESS
|
||||
*
|
||||
PLA
|
||||
STA _RETADR
|
||||
STA RETADR
|
||||
PLA
|
||||
STA _RETADR+1
|
||||
STA RETADR+1
|
||||
*
|
||||
** GET PARAMETERS
|
||||
*
|
||||
@ -540,13 +502,13 @@ DIVOK JMP OKEXIT
|
||||
*
|
||||
** SIGNED DIVISION
|
||||
*
|
||||
SDIV16
|
||||
SDIVD16
|
||||
LDA #0 ; RESULT IS QUOTIENT
|
||||
BEQ SDIVMD ; (INDEX=0)
|
||||
*
|
||||
** SIGNED REMAINDER
|
||||
*
|
||||
SREM16
|
||||
SREMD16
|
||||
LDA #2 ; RES = REMAINDER (I=2)
|
||||
BNE SDIVMD
|
||||
*
|
||||
@ -556,9 +518,9 @@ SDIVMD
|
||||
** GET RETURN ADDRESS
|
||||
*
|
||||
PLA
|
||||
STA _RETADR
|
||||
STA RETADR
|
||||
PLA
|
||||
STA _RETADR+1
|
||||
STA RETADR+1
|
||||
*
|
||||
** GET PARAMETERS
|
||||
*
|
||||
@ -658,6 +620,10 @@ EREXIT
|
||||
STA _DVEND+1 ;QUOTIENT = 0
|
||||
STA _DVEND+2
|
||||
STA _DVEND+3 ; REMAINDER=0
|
||||
STA RETURN
|
||||
STA RETURN+1
|
||||
LDA #2
|
||||
STA RETLEN
|
||||
SEC ; CARRY=1 IF ERROR
|
||||
BCS DVEXIT
|
||||
*
|
||||
@ -673,25 +639,28 @@ DVEXIT
|
||||
LDX _RSLTI ;GET INDEX TO RESULT
|
||||
; 0=QUOTIENT, 2=REMAINDER
|
||||
*
|
||||
** STORE RESULT IN STACK
|
||||
** STORE RESULT
|
||||
*
|
||||
LDA _DVEND,X
|
||||
TAY
|
||||
LDA _DVEND+1,X
|
||||
TAX
|
||||
STY RETURN
|
||||
STX RETURN+1
|
||||
LDA #2
|
||||
STA RETLEN
|
||||
*
|
||||
** RESTORE RETURN ADDRESS
|
||||
*
|
||||
LDA _RETADR+1
|
||||
LDA RETADR+1
|
||||
PHA
|
||||
LDA _RETADR
|
||||
LDA RETADR
|
||||
PHA
|
||||
*
|
||||
RTS
|
||||
*
|
||||
*
|
||||
********************************
|
||||
* UDIVE ROUTINE
|
||||
* UDIV ROUTINE
|
||||
********************************
|
||||
UDIV
|
||||
*
|
||||
@ -743,21 +712,15 @@ DECCNT
|
||||
*
|
||||
** DATA
|
||||
*
|
||||
** MAKING THESE GLOBAL FOR NOW WHILE I TRY TO
|
||||
** UNDERSTAND THIS ALGORITHM ENOUGH TO MAKE
|
||||
** IT USE LOCAL VARIABLES
|
||||
*
|
||||
_DVSOR DS 2 ; DIVISOR
|
||||
_DVEND DS 4 ; DIVIDEND[0] AND QUOTIENT
|
||||
; DIVIDEND[1] AND REMAINDER
|
||||
_RETADR DS 2
|
||||
_SQUOT DS 1 ; SIGN OF QUOTIENT
|
||||
_SREMD DS 1 ; SIGN OF REMAINDER
|
||||
_RSLTI DS 1 ; RESULT INDEX
|
||||
*
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* CMP16 :: 16-BIT COMPARE *
|
||||
* COMP16 :: 16-BIT COMPARE *
|
||||
*- -*
|
||||
* COMPARE TWO 16BIT SIGNED OR *
|
||||
* UNSIGNED WORDS AND RETURN *
|
||||
@ -773,15 +736,15 @@ _RSLTI DS 1 ; RESULT INDEX
|
||||
*- -*
|
||||
* USAGE: *
|
||||
* *
|
||||
* LDA #>123 *
|
||||
* PHA *
|
||||
* LDA #<123 *
|
||||
* PHA ; WORD 1 *
|
||||
* LDA #>1023 *
|
||||
* PHA *
|
||||
* LDA #<1023 *
|
||||
* PHA ; WORD 2 *
|
||||
* JSR CMP16 *
|
||||
* LDA #>123 *
|
||||
* PHA *
|
||||
* LDA #<123 *
|
||||
* PHA ; WORD 1 *
|
||||
* LDA #>1023 *
|
||||
* PHA *
|
||||
* LDA #<1023 *
|
||||
* PHA ; WORD 2 *
|
||||
* JSR CMP16 *
|
||||
*- -*
|
||||
* ENTRY *
|
||||
* *
|
||||
@ -814,28 +777,19 @@ _RSLTI DS 1 ; RESULT INDEX
|
||||
* ADAPTED FROM LEVANTHAL AND *
|
||||
* WINTHROP'S /6502 ASSEMBLY *
|
||||
* LANGUAGE ROUTINES/. *
|
||||
* AS SUCH, THIS MAY NOT FALL *
|
||||
* UNDER THE APACHE 2.0 LICENSE *
|
||||
* AGREEMENT, SINCE THE BOOK *
|
||||
* WAS WRITTEN BEFORE THE *
|
||||
* LICENSE! *
|
||||
* *
|
||||
* THAT SAID, LEVENTHAL WROTE *
|
||||
* THAT THE PURPOSE OF THE BOOK *
|
||||
* WAS TO COPY THE SOURCE CODE, *
|
||||
* AS REINVENTING THE WHEEL IS *
|
||||
* TEDIOUS, AND HE PLACED NO *
|
||||
* RESTRICTIONS ON ITS USE. *
|
||||
* AS SUCH, THE SAME LICENSE *
|
||||
* MAY NOT APPLY UNTIL RADICAL *
|
||||
* ALTERATION. *
|
||||
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
||||
*
|
||||
CMP16
|
||||
COMP16
|
||||
*
|
||||
** GET RETURN ADDRESS
|
||||
*
|
||||
PLA
|
||||
STA :RETADR
|
||||
STA RETADR
|
||||
PLA
|
||||
STA :RETADR+1
|
||||
STA RETADR+1
|
||||
*
|
||||
** GET PARAMETERS
|
||||
*
|
||||
@ -850,9 +804,9 @@ CMP16
|
||||
*
|
||||
** RESTORE RETURN ADDRESS
|
||||
*
|
||||
LDA :RETADR+1
|
||||
LDA RETADR+1
|
||||
PHA
|
||||
LDA :RETADR
|
||||
LDA RETADR
|
||||
PHA
|
||||
*
|
||||
LDA :MINU
|
||||
@ -898,10 +852,9 @@ CMP16
|
||||
*
|
||||
:MINU DS 2
|
||||
:SUBT DS 2
|
||||
:RETADR DS 2
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* RND16 : 16BIT RANDOM NUMBER *
|
||||
* RAND16 : 16BIT RANDOM NUMBER *
|
||||
*- -*
|
||||
* GENERATE A 16BIT PSEUDO- *
|
||||
* RANDOM NUMBER AND RETURN IT *
|
||||
@ -909,10 +862,7 @@ CMP16
|
||||
* *
|
||||
* ORIGINAL AUTHOR IS WHITE *
|
||||
* FLAME, AS SHARED ON *
|
||||
* CODEBASE64. I HAVE MADE SOME *
|
||||
* MINOR ALTERATIONS, BUT NOT *
|
||||
* NEARLY ENOUGH TO CALL IT MY *
|
||||
* OWN. *
|
||||
* CODEBASE64. *
|
||||
*- -*
|
||||
* CLOBBERS: *
|
||||
* *
|
||||
@ -931,9 +881,12 @@ CMP16
|
||||
*- -*
|
||||
* EXIT *
|
||||
* *
|
||||
* Y = HIGH BYTE OF PRODUCT *
|
||||
* X = LOW BYTE OF PRODUCT *
|
||||
* A = LOW BYTE OF PRODUCT *
|
||||
* .Y = HIGH BYTE OF PRODUCT *
|
||||
* .X = LOW BYTE OF PRODUCT *
|
||||
* .A = LOW BYTE OF PRODUCT *
|
||||
* *
|
||||
* [RETURN] = RESULT (2 BYTES) *
|
||||
* [RETLEN] = 2 (RESULT LENGTH) *
|
||||
*- -*
|
||||
* NOTE: THERE ARE 2048 MAGIC *
|
||||
* NUMBERS THAT COULD BE EOR'D *
|
||||
@ -945,7 +898,7 @@ CMP16
|
||||
* $41BB, $3D91, $B5E9, $FFEB *
|
||||
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
||||
*
|
||||
RND16
|
||||
RAND16
|
||||
*
|
||||
LDA RNDL
|
||||
STA :SEED
|
||||
@ -978,13 +931,16 @@ RND16
|
||||
STA :SEED+1
|
||||
:EXIT LDX :SEED+1
|
||||
LDY :SEED
|
||||
STY RETURN
|
||||
STX RETURN+1
|
||||
LDA #2
|
||||
STA RETLEN
|
||||
RTS
|
||||
*
|
||||
** DATA
|
||||
*
|
||||
:SEED DS 2
|
||||
*
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* RANDW :: RANDOM WORD *
|
||||
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
||||
|
357
disks/disk3_math8_math16/T.MATH16.MIN
Normal file
357
disks/disk3_math8_math16/T.MATH16.MIN
Normal file
@ -0,0 +1,357 @@
|
||||
*
|
||||
ADDIT16
|
||||
*
|
||||
PLA
|
||||
STA RETADR
|
||||
PLA
|
||||
STA RETADR+1
|
||||
PLA
|
||||
STA :ADD2
|
||||
PLA
|
||||
STA :ADD2+1
|
||||
PLA
|
||||
STA :ADD1
|
||||
PLA
|
||||
STA :ADD1+1
|
||||
LDA :ADD1
|
||||
CLC
|
||||
ADC :ADD2
|
||||
TAY
|
||||
STY RETURN
|
||||
LDA :ADD1+1
|
||||
ADC :ADD2+1
|
||||
TAX
|
||||
STX RETURN+1
|
||||
LDA #2
|
||||
STA RETLEN
|
||||
LDA RETADR+1
|
||||
PHA
|
||||
LDA RETADR
|
||||
PHA
|
||||
RTS
|
||||
:ADD1 DS 2
|
||||
:ADD2 DS 2
|
||||
*
|
||||
SUBT16
|
||||
*
|
||||
PLA
|
||||
STA RETADR
|
||||
PLA
|
||||
STA RETADR+1
|
||||
PLA
|
||||
STA :SUBT
|
||||
PLA
|
||||
STA :SUBT+1
|
||||
PLA
|
||||
STA :MINU
|
||||
PLA
|
||||
STA :MINU+1
|
||||
LDA :MINU
|
||||
SEC
|
||||
SBC :SUBT
|
||||
TAY
|
||||
STY RETURN
|
||||
LDA :MINU+1
|
||||
SBC :SUBT+1
|
||||
TAX
|
||||
STX RETURN+1
|
||||
LDA #2
|
||||
STA RETLEN
|
||||
LDA RETADR+1
|
||||
PHA
|
||||
LDA RETADR
|
||||
PHA
|
||||
RTS
|
||||
:MINU DS 2
|
||||
:SUBT DS 2
|
||||
*
|
||||
MULT16
|
||||
*
|
||||
PLA
|
||||
STA RETADR
|
||||
PLA
|
||||
STA RETADR+1
|
||||
PLA
|
||||
STA :MLIER
|
||||
PLA
|
||||
STA :MLIER+1
|
||||
PLA
|
||||
STA :MCAND
|
||||
PLA
|
||||
STA :MCAND+1
|
||||
LDA #0
|
||||
STA :HPROD
|
||||
STA :HPROD+1
|
||||
LDX #17
|
||||
CLC
|
||||
:MULLP
|
||||
ROR :HPROD+1
|
||||
ROR :HPROD
|
||||
ROR :MLIER+1
|
||||
ROR :MLIER
|
||||
BCC :DECCNT
|
||||
CLC
|
||||
LDA :MCAND
|
||||
ADC :HPROD
|
||||
STA :HPROD
|
||||
LDA :MCAND+1
|
||||
ADC :HPROD+1
|
||||
STA :HPROD+1
|
||||
:DECCNT
|
||||
DEX
|
||||
BNE :MULLP
|
||||
|
||||
LDY :HPROD
|
||||
LDX :HPROD+1
|
||||
LDA :MLIER+1
|
||||
TAX
|
||||
STX RETURN+1
|
||||
LDA :MLIER
|
||||
TAY
|
||||
STY RETURN
|
||||
LDA :HPROD
|
||||
STA RETURN+2
|
||||
LDA #2
|
||||
STA RETLEN
|
||||
LDA RETADR+1
|
||||
PHA
|
||||
LDA RETADR
|
||||
PHA
|
||||
LDA :HPROD
|
||||
RTS
|
||||
:MCAND DS 3
|
||||
:MLIER DS 3
|
||||
:HPROD DS 2
|
||||
*
|
||||
UDIVD16
|
||||
LDA #0
|
||||
BEQ UDIVMD
|
||||
UREMD16
|
||||
LDA #2
|
||||
UDIVMD
|
||||
STA _RSLTI
|
||||
PLA
|
||||
STA RETADR
|
||||
PLA
|
||||
STA RETADR+1
|
||||
PLA
|
||||
STA _DVSOR
|
||||
PLA
|
||||
STA _DVSOR+1
|
||||
PLA
|
||||
STA _DVEND
|
||||
PLA
|
||||
STA _DVEND+1
|
||||
JSR UDIV
|
||||
BCC DIVOK
|
||||
DIVERR JMP EREXIT
|
||||
DIVOK JMP OKEXIT
|
||||
SDIVD16
|
||||
LDA #0
|
||||
BEQ SDIVMD
|
||||
SREMD16
|
||||
LDA #2
|
||||
BNE SDIVMD
|
||||
SDIVMD
|
||||
STA _RSLTI
|
||||
PLA
|
||||
STA RETADR
|
||||
PLA
|
||||
STA RETADR+1
|
||||
PLA
|
||||
STA _DVSOR
|
||||
PLA
|
||||
STA _DVSOR+1
|
||||
PLA
|
||||
STA _DVEND
|
||||
PLA
|
||||
STA _DVEND+1
|
||||
LDA _DVEND+1
|
||||
EOR _DVSOR+1
|
||||
STA _SQUOT
|
||||
LDA _DVEND+1
|
||||
STA _SREMD
|
||||
LDA _DVSOR+1
|
||||
BPL CHKDE
|
||||
LDA #0
|
||||
SEC
|
||||
SBC _DVSOR
|
||||
STA _DVSOR
|
||||
LDA #0
|
||||
SBC _DVSOR+1
|
||||
STA _DVSOR+1
|
||||
CHKDE
|
||||
LDA _DVEND+1
|
||||
BPL DODIV
|
||||
LDA #0
|
||||
SEC
|
||||
SBC _DVEND
|
||||
STA _DVEND
|
||||
LDA #0
|
||||
SBC _DVEND+1
|
||||
STA _DVEND+1
|
||||
DODIV
|
||||
JSR UDIV
|
||||
BCS EREXIT
|
||||
LDA _SQUOT
|
||||
BPL DOREM
|
||||
LDA #0
|
||||
SEC
|
||||
SBC _DVEND
|
||||
STA _DVEND
|
||||
LDA #0
|
||||
SBC _DVEND+1
|
||||
STA _DVEND+1
|
||||
DOREM
|
||||
LDA _SREMD
|
||||
BPL OKEXIT
|
||||
LDA #0
|
||||
SEC
|
||||
SBC _DVEND+2
|
||||
STA _DVEND+2
|
||||
LDA #0
|
||||
SBC _DVEND+3
|
||||
STA _DVEND+3
|
||||
JMP OKEXIT
|
||||
EREXIT
|
||||
LDA #0
|
||||
STA _DVEND
|
||||
STA _DVEND+1
|
||||
STA _DVEND+2
|
||||
STA _DVEND+3
|
||||
STA RETURN
|
||||
STA RETURN+1
|
||||
LDA #2
|
||||
STA RETLEN
|
||||
SEC
|
||||
BCS DVEXIT
|
||||
OKEXIT
|
||||
CLC
|
||||
DVEXIT
|
||||
LDX _RSLTI
|
||||
LDA _DVEND,X
|
||||
TAY
|
||||
LDA _DVEND+1,X
|
||||
TAX
|
||||
STY RETURN
|
||||
STX RETURN+1
|
||||
LDA #2
|
||||
STA RETLEN
|
||||
LDA RETADR+1
|
||||
PHA
|
||||
LDA RETADR
|
||||
PHA
|
||||
*
|
||||
RTS
|
||||
UDIV
|
||||
LDA #0
|
||||
STA _DVEND+2
|
||||
STA _DVEND+3
|
||||
LDA _DVSOR
|
||||
ORA _DVSOR+1
|
||||
BNE OKUDIV
|
||||
SEC
|
||||
RTS
|
||||
OKUDIV
|
||||
LDX #16
|
||||
DIVLP
|
||||
ROL _DVEND
|
||||
ROL _DVEND+1
|
||||
ROL _DVEND+2
|
||||
ROL _DVEND+3
|
||||
CHKLT
|
||||
SEC
|
||||
LDA _DVEND+2
|
||||
SBC _DVSOR
|
||||
TAY
|
||||
LDA _DVEND+3
|
||||
SBC _DVSOR+1
|
||||
BCC DECCNT
|
||||
STY _DVEND+2
|
||||
STA _DVEND+3
|
||||
DECCNT
|
||||
DEX
|
||||
BNE DIVLP
|
||||
ROL _DVEND
|
||||
ROL _DVEND+1
|
||||
CLC
|
||||
RTS
|
||||
_DVSOR DS 2
|
||||
_DVEND DS 4
|
||||
_SQUOT DS 1
|
||||
_SREMD DS 1
|
||||
_RSLTI DS 1
|
||||
*
|
||||
COMP16
|
||||
*
|
||||
PLA
|
||||
STA RETADR
|
||||
PLA
|
||||
STA RETADR+1
|
||||
PLA
|
||||
STA :SUBT
|
||||
PLA
|
||||
STA :SUBT+1
|
||||
PLA
|
||||
STA :MINU
|
||||
PLA
|
||||
STA :MINU+1
|
||||
LDA RETADR+1
|
||||
PHA
|
||||
LDA RETADR
|
||||
PHA
|
||||
LDA :MINU
|
||||
CMP :SUBT
|
||||
BEQ :EQUAL
|
||||
LDA :MINU+1
|
||||
SBC :SUBT+1
|
||||
ORA #1
|
||||
BVS :OVFLOW
|
||||
RTS
|
||||
:EQUAL
|
||||
LDA :MINU+1
|
||||
SBC :SUBT+1
|
||||
BVS :OVFLOW
|
||||
RTS
|
||||
:OVFLOW
|
||||
EOR #$80
|
||||
ORA #1
|
||||
RTS
|
||||
:MINU DS 2
|
||||
:SUBT DS 2
|
||||
*
|
||||
RAND16
|
||||
*
|
||||
LDA RNDL
|
||||
STA :SEED
|
||||
LDA RNDH
|
||||
STA :SEED+1
|
||||
LDA :SEED
|
||||
BEQ :LOW0
|
||||
ASL :SEED
|
||||
LDA :SEED+1
|
||||
ROL
|
||||
BCC :NOEOR
|
||||
:DOEOR
|
||||
EOR #>$0369
|
||||
STA :SEED+1
|
||||
LDA :SEED
|
||||
EOR #<$0369
|
||||
STA :SEED
|
||||
JMP :EXIT
|
||||
:LOW0
|
||||
LDA :SEED+1
|
||||
BEQ :DOEOR
|
||||
ASL
|
||||
BEQ :NOEOR
|
||||
BCS :DOEOR
|
||||
:NOEOR
|
||||
STA :SEED+1
|
||||
:EXIT LDX :SEED+1
|
||||
LDY :SEED
|
||||
STY RETURN
|
||||
STX RETURN+1
|
||||
LDA #2
|
||||
STA RETLEN
|
||||
RTS
|
||||
:SEED DS 2
|
@ -1,10 +1,41 @@
|
||||
JMP XMATH8
|
||||
*
|
||||
*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*
|
||||
* *
|
||||
* MATH8.LIB *
|
||||
* *
|
||||
* AUTHOR: NATHAN RIGGS *
|
||||
* CONTACT: NATHAN.RIGGS@ *
|
||||
* OUTLOOK.COM *
|
||||
* *
|
||||
* VERSION: 0.2.0 *
|
||||
* DATE: 12-DEC-2018 *
|
||||
* ASSEMBLER: MERLIN 8 PRO *
|
||||
* LICENSE: MIT LICENSE *
|
||||
* OS: DOS 3.3 *
|
||||
* *
|
||||
* 8-BIT MATH LIBRARY FOR *
|
||||
* UNSIGNED INTEGERS ONLY. *
|
||||
* *
|
||||
*------------------------------*
|
||||
* *
|
||||
* LIST OF ROUTINES *
|
||||
* *
|
||||
* RAND8: RANDOM BYTE 1..255 *
|
||||
* RANDB: RANDOM NUMBER *
|
||||
* MULT8: 8-BIT MULTIPLY, 16 *
|
||||
* BIT RESULT. *
|
||||
* DIVD8: 8 BIT DIVIDE, 8 BIT *
|
||||
* RESULT. *
|
||||
* *
|
||||
*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* RND8 :: 8-BIT RANDOM NUMBER *
|
||||
* RAND8 :: 8-BIT RANDOM NUMBER *
|
||||
*- -*
|
||||
* GENERATES A PSEUDO-RANDOM *
|
||||
* NUMBER BETWEEN 0..255 (BYTE) *
|
||||
* AND RETURNS THE VALUE IN A. *
|
||||
* NUMBER BETWEEN 1..255 (BYTE) *
|
||||
* AND RETURNS THE VALUE IN .A *
|
||||
* *
|
||||
* THIS USES THE GALOIS LINEAR *
|
||||
* FEEDBACK SHIFT REGISTER *
|
||||
@ -19,24 +50,20 @@
|
||||
* CYCLES: ??? *
|
||||
* SIZE: *
|
||||
*- -*
|
||||
* USAGE: *
|
||||
* *
|
||||
* JSR RND8 *
|
||||
*- -*
|
||||
* ENTRY: NONE *
|
||||
* USAGE: JSR RND8 *
|
||||
*- -*
|
||||
* EXIT *
|
||||
* *
|
||||
* Y = NOT AFFECTED *
|
||||
* X = CLOBBERED *
|
||||
* A = RANDOM NUM 0..255 *
|
||||
* .Y = NOT AFFECTED *
|
||||
* .X = CLOBBERED *
|
||||
* .A = RANDOM NUM 1..255 *
|
||||
*- -*
|
||||
* NOTE: BASED ON THE PRNG *
|
||||
* LISTING FOUND IN THE NESDEV *
|
||||
* WIKI. *
|
||||
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
||||
*
|
||||
RND8
|
||||
RAND8
|
||||
*
|
||||
LDX #8
|
||||
LDA RNDL+0
|
||||
@ -51,15 +78,20 @@ RND8
|
||||
DEX
|
||||
BNE :A
|
||||
STA RNDL+0
|
||||
STA RETURN
|
||||
LDY #1
|
||||
STY RETLEN
|
||||
CMP #0 ; RELOAD FLAGS
|
||||
RTS
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* RANDB :: RANDOM BYTE *
|
||||
* RANDB :: RANDOM BYTE *
|
||||
*- -*
|
||||
* RETURNS A RANDOM BYTE VALUE *
|
||||
* BETWEEN THE HIGH AND LOW *
|
||||
* BOUNDS PASSED TO ROUTINE. *
|
||||
* NOTE THAT THIS ONLY WORKS *
|
||||
* WITH UNSIGNED VALUES. *
|
||||
*- -*
|
||||
* CLOBBERS: *
|
||||
* *
|
||||
@ -70,11 +102,11 @@ RND8
|
||||
*- -*
|
||||
* USAGE: *
|
||||
* *
|
||||
* LDA #1 ; LOW BOUND *
|
||||
* PHA *
|
||||
* LDA #100 ; HIGH *
|
||||
* PHA *
|
||||
* JSR RANDB *
|
||||
* LDA #1 ; LOW BOUND *
|
||||
* PHA *
|
||||
* LDA #100 ; HIGH *
|
||||
* PHA *
|
||||
* JSR RANDB *
|
||||
*- -*
|
||||
* ENTRY *
|
||||
* *
|
||||
@ -90,16 +122,9 @@ RND8
|
||||
* LOW BYTE OF RETURN ADDRESS *
|
||||
* HI BYTE OF RETURN ADDRESS *
|
||||
* *
|
||||
* Y = COUNTER; TRASH *
|
||||
* X = COUNTER; TRASH *
|
||||
* A = LOW BYTE OF RET ADDR *
|
||||
*- -*
|
||||
* *** NOTE: I DON'T LIKE THAT *
|
||||
* THIS HAS TO CALL UDIV16, AND *
|
||||
* THUS CANNOT BE INCLUDED ON *
|
||||
* ITS OWN. IN FUTURE, HANDLE *
|
||||
* DIVISION WITHIN ROUTINE, *
|
||||
* ESPECIALLY SINCE IT IS 8BIT. *
|
||||
* .Y = COUNTER; TRASH *
|
||||
* .X = COUNTER; TRASH *
|
||||
* .A = LOW BYTE OF RET ADDR *
|
||||
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
||||
*
|
||||
RANDB
|
||||
@ -107,106 +132,150 @@ RANDB
|
||||
** GET RETURN ADDRESS
|
||||
*
|
||||
PLA
|
||||
STA :RETADR
|
||||
STA RETADR
|
||||
PLA
|
||||
STA :RETADR+1
|
||||
STA RETADR+1
|
||||
*
|
||||
** GET PARAMETERS
|
||||
*
|
||||
PLA
|
||||
STA :RHB ; HIGH BOUND
|
||||
STA :NEWMAX
|
||||
PLA
|
||||
STA :RLB ; LOW BOUND
|
||||
STA :NEWMIN
|
||||
*
|
||||
** FORMULA: F = L + (R-((R\(H-L))*(H-L)
|
||||
** GET OLDMIN,OLDMAX,OLDVAL
|
||||
*
|
||||
LDA :RHB
|
||||
CLC
|
||||
ADC #2 ; NO IDEA WHY I NEED
|
||||
; THIS BUT I DO
|
||||
STA :RHB
|
||||
LDA :RHB ;LOAD IN HIGH RANGE
|
||||
LDA #1
|
||||
STA :OLDMIN
|
||||
LDA #255
|
||||
STA :OLDMAX
|
||||
JSR RAND8 ; RANDOM BYTE 0..255
|
||||
STA :OLDVAL
|
||||
*
|
||||
** NEWVALUE = (((OLDVAL-NEWMIN) * (NEWMAX-NEWMIN) /
|
||||
** (OLDMAX-OLDMIN)) + NEWMIN
|
||||
*
|
||||
** OR
|
||||
*
|
||||
** OLDRANGE = (OLDMAX-OLDMIN)
|
||||
** NEWRANGE = (NEWMAX - NEWMIN)
|
||||
** NEWVAL = (((OLDVAL-OLDMIN) * NEWRANGE) / OLDRANGE) + NEWMIN
|
||||
*
|
||||
** GET OLDRANGE: OLDMAX - OLDMIN
|
||||
*
|
||||
LDA :OLDMAX
|
||||
SEC
|
||||
SBC :RLB ;SUBTRACT LOW RANGE
|
||||
STA :RHL ;STORE HIGH - LOW HERE
|
||||
JSR RND8 ; GET NUM BETWEEN 0..255
|
||||
STA :R ; RANDOM 0,,255
|
||||
SBC :OLDMIN
|
||||
STA :OLDRANGE
|
||||
*
|
||||
** R\(H-L)
|
||||
** NOW GET NEWRANGE: NEWMAX - NEWMIN
|
||||
*
|
||||
LDX #0 ; STORE 0 FOR HIGH BYTE
|
||||
STX :R+1 ; 0 HIGH BYTE
|
||||
STX :RHL+1 ; 0 HIGH BYTE
|
||||
LDA :R+1
|
||||
PHA
|
||||
LDA :R
|
||||
PHA
|
||||
LDA :RHL+1 ; LOAD (H-L) BACK INTO A
|
||||
PHA
|
||||
LDA :RHL
|
||||
PHA
|
||||
JSR UDIV16 ; DIV (H-L) BY __R
|
||||
PLA
|
||||
STA :QUOT
|
||||
PLA
|
||||
STA :QUOT+1
|
||||
*
|
||||
** R-(R\(H-L)
|
||||
*
|
||||
LDA :R ; LOAD RND BACK INTO A
|
||||
LDA :NEWMAX
|
||||
SEC
|
||||
SBC :QUOT ; SUBTRACT (R/(H-L) FROM RND8
|
||||
STA :QUOT ; STORE TEMP
|
||||
SBC :NEWMIN
|
||||
STA :NEWRANGE
|
||||
*
|
||||
** (R-(R\(H-L))*(H-L)
|
||||
** NOW GET VALRANGE: OLDVAL - OLDMIN
|
||||
*
|
||||
LDA #0 ; ZERO HIGH BYTE
|
||||
STA :QUOT+1 ; 0 HIGH BYTE
|
||||
LDA :RHL+1 ; LOAD (H-L)
|
||||
PHA
|
||||
LDA :RHL
|
||||
PHA
|
||||
LDA :QUOT+1
|
||||
PHA
|
||||
LDA :QUOT
|
||||
PHA
|
||||
JSR MUL16 ; MUL (H-L) * __R - (H-L)
|
||||
PLA
|
||||
STA :RESULT
|
||||
PLA
|
||||
STA :RESULT+1
|
||||
LDA :OLDVAL
|
||||
SEC
|
||||
SBC :OLDMIN
|
||||
STA :VALRANGE
|
||||
*
|
||||
** L + EVERYTHING ELSE
|
||||
** GET MULRANGE: VALRANGE * NEWRANGE
|
||||
*
|
||||
LDA #00
|
||||
TAY
|
||||
STY :NUM1HI
|
||||
BEQ :ENTLP
|
||||
*
|
||||
:DOADD
|
||||
CLC
|
||||
ADC :RLB ;ADD LOW BYTE TO ALL ELSE
|
||||
:FINISH
|
||||
STA :RESULT ; STORE IN RESULT
|
||||
LDX :RESULT+1 ; HIGH BYTE; FOR
|
||||
; DEBUGGING PURPOSES
|
||||
ADC :VALRANGE
|
||||
TAX
|
||||
*
|
||||
TYA
|
||||
ADC :NUM1HI
|
||||
TAY
|
||||
TXA
|
||||
*
|
||||
:MLP
|
||||
ASL :VALRANGE
|
||||
ROL :NUM1HI
|
||||
:ENTLP
|
||||
LSR :NEWRANGE
|
||||
BCS :DOADD
|
||||
BNE :MLP
|
||||
*
|
||||
STA :MULRANGE
|
||||
STY :MULRANGE+1
|
||||
*
|
||||
** NOW GET DIVRANGE: MULRANGE / OLDRANGE
|
||||
*
|
||||
:DIVIDE
|
||||
LDA #0
|
||||
STA :REMAIN
|
||||
STA :REMAIN+1
|
||||
LDX #16
|
||||
*
|
||||
:DIVLP
|
||||
ASL :MULRANGE
|
||||
ROL :MULRANGE+1
|
||||
ROL :REMAIN
|
||||
ROL :REMAIN+1
|
||||
LDA :REMAIN
|
||||
SEC
|
||||
SBC :OLDRANGE
|
||||
TAY
|
||||
LDA :REMAIN+1
|
||||
SBC :OLDRANGE+1
|
||||
BCC :SKIP
|
||||
*
|
||||
STA :REMAIN+1
|
||||
STY :REMAIN
|
||||
INC :DIVRANGE
|
||||
*
|
||||
:SKIP DEX
|
||||
BNE :DIVLP
|
||||
*
|
||||
** NOW ADD NEWMIN TO DIVRANGE
|
||||
*
|
||||
LDA :DIVRANGE ; LO BYTE ONLY
|
||||
CLC
|
||||
ADC :NEWMIN
|
||||
STA :NEWVAL
|
||||
*
|
||||
** RESTORE RETURN ADDRESS
|
||||
*
|
||||
LDA :RETADR+1
|
||||
LDA RETADR+1
|
||||
PHA
|
||||
LDA :RETADR
|
||||
LDA RETADR
|
||||
PHA
|
||||
*
|
||||
LDA :RESULT ; RETURN # IN A
|
||||
LDA :NEWVAL ; RETURN # IN A
|
||||
STA RETURN
|
||||
LDX #1
|
||||
STX RETLEN
|
||||
RTS
|
||||
*
|
||||
** DATA
|
||||
*
|
||||
:R DS 2
|
||||
:RETADR DS 2
|
||||
:RESULT DS 2
|
||||
:RHB DS 2
|
||||
:RLB DS 2
|
||||
:RHL DS 2
|
||||
:QUOT DS 2
|
||||
:OLDRANGE DS 2
|
||||
:NEWRANGE DS 2
|
||||
:MULRANGE DS 2
|
||||
:DIVRANGE DS 2
|
||||
:VALRANGE DS 2
|
||||
:OLDVAL DS 2
|
||||
:NEWVAL DS 2
|
||||
:OLDMIN DS 2
|
||||
:NEWMIN DS 2
|
||||
:OLDMAX DS 2
|
||||
:NEWMAX DS 2
|
||||
:NUM1HI DS 2
|
||||
:REMAIN DS 2
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* MUL8 :: 8BIT MULTIPLY (16BR) *
|
||||
* MULT8 : 8BIT MULTIPLY (16BR) *
|
||||
*- -*
|
||||
* MULTIPLY TWO 8BIT NUMBERS TO *
|
||||
* GET 16BIT RESULT. NUMBERS *
|
||||
@ -228,11 +297,11 @@ RANDB
|
||||
*- -*
|
||||
* USAGE: *
|
||||
* *
|
||||
* LDA #100 *
|
||||
* PHA *
|
||||
* PDA #200 *
|
||||
* PHA *
|
||||
* JSR MUL8 *
|
||||
* LDA #100 *
|
||||
* PHA *
|
||||
* PDA #200 *
|
||||
* PHA *
|
||||
* JSR MUL8 *
|
||||
*- -*
|
||||
* ENTRY *
|
||||
* *
|
||||
@ -243,19 +312,22 @@ RANDB
|
||||
*- -*
|
||||
* EXIT *
|
||||
* *
|
||||
* Y = HIGH BYTE OF PRODUCT *
|
||||
* X = LOW BYTE OF PRODUCT *
|
||||
* A = LOW BYTE OF PRODUCT *
|
||||
* .Y = LOW BYTE OF PRODUCT *
|
||||
* .X = HI BYTE OF PRODUCT *
|
||||
* .A = PRODUCT LENGTH (2) *
|
||||
* *
|
||||
* [RETURN] = PRODUCT *
|
||||
* [RETLEN] = 2 (PRODUCT LEN) *
|
||||
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
||||
*
|
||||
MUL8
|
||||
MULT8
|
||||
*
|
||||
** GET RETURN ADDRESS
|
||||
*
|
||||
PLA
|
||||
STA :RETADR
|
||||
STA RETADR
|
||||
PLA
|
||||
STA :RETADR+1
|
||||
STA RETADR+1
|
||||
*
|
||||
** GET PARAMETERS
|
||||
*
|
||||
@ -267,8 +339,9 @@ MUL8
|
||||
** INIT
|
||||
*
|
||||
LDA #$00
|
||||
TAY
|
||||
TAX
|
||||
STX :MUL1H
|
||||
STY :MUL1H
|
||||
BEQ :GOLOOP
|
||||
*
|
||||
:DOADD
|
||||
@ -291,10 +364,15 @@ MUL8
|
||||
*
|
||||
** RESTORE RETURN ADDRESS
|
||||
*
|
||||
LDA :RETADR+1
|
||||
LDA RETADR+1
|
||||
PHA
|
||||
LDA :RETADR
|
||||
LDA RETADR
|
||||
PHA
|
||||
*
|
||||
STY RETURN
|
||||
STX RETURN+1
|
||||
LDA #2
|
||||
STA RETLEN
|
||||
*
|
||||
RTS
|
||||
*
|
||||
@ -302,23 +380,18 @@ MUL8
|
||||
*
|
||||
:MUL1 DS 1
|
||||
:MUL2 DS 1
|
||||
:RETADR DS 2
|
||||
:MUL1H DS 1
|
||||
*
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* DIV8 :: 8BIT DIVISION (8BR) *
|
||||
* DIVD8 :: 8BIT DIVISION (8BR) *
|
||||
*- -*
|
||||
* DIVIDE ONE 8BIT NUMBER BY *
|
||||
* ANOTHER TO GET AN 8BIT *
|
||||
* RESULT. *
|
||||
* RESULT. UNSIGNED ONLY. *
|
||||
* *
|
||||
* ORIGINAL AUTHOR IS WHITE *
|
||||
* FLAME, AS SHARED ON *
|
||||
* CODEBASE64. I HAVE MADE SOME *
|
||||
* MINOR ALTERATIONS, BUT NOT *
|
||||
* NEARLY ENOUGH TO CALL IT MY *
|
||||
* OWN. *
|
||||
* CODEBASE64. MINOR CHANGES. *
|
||||
*- -*
|
||||
* CLOBBERS: *
|
||||
* *
|
||||
@ -329,11 +402,11 @@ MUL8
|
||||
*- -*
|
||||
* USAGE: *
|
||||
* *
|
||||
* LDA #200 *
|
||||
* PHA *
|
||||
* PDA #10 *
|
||||
* PHA *
|
||||
* JSR DIV8 *
|
||||
* LDA #200 *
|
||||
* PHA *
|
||||
* PDA #10 *
|
||||
* PHA *
|
||||
* JSR DIV8 *
|
||||
*- -*
|
||||
* ENTRY *
|
||||
* *
|
||||
@ -344,19 +417,22 @@ MUL8
|
||||
*- -*
|
||||
* EXIT *
|
||||
* *
|
||||
* Y = HIGH BYTE OF PRODUCT *
|
||||
* X = LOW BYTE OF PRODUCT *
|
||||
* A = LOW BYTE OF PRODUCT *
|
||||
* .Y = REMAINDER *
|
||||
* .X = UNCHANGED *
|
||||
* .A = QUOTIENT *
|
||||
* *
|
||||
* [RETURN] = QUOTIENT *
|
||||
* [RETLEN] = 1 (QUOT LENGTH) *
|
||||
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
||||
*
|
||||
DIV8
|
||||
DIVD8
|
||||
*
|
||||
** GET RETURN ADDRESS
|
||||
*
|
||||
PLA
|
||||
STA :RETADR
|
||||
STA RETADR
|
||||
PLA
|
||||
STA :RETADR+1
|
||||
STA RETADR+1
|
||||
*
|
||||
** GET PARAMETERS
|
||||
*
|
||||
@ -366,29 +442,32 @@ DIV8
|
||||
STA :DVSOR
|
||||
*
|
||||
LDA #$00
|
||||
LDX #8
|
||||
LDY #8
|
||||
ASL :DVSOR
|
||||
:L1 ROL
|
||||
CMP :DVEND
|
||||
BCC :L2
|
||||
SBC :DVEND
|
||||
:L2 ROL :DVSOR
|
||||
DEX
|
||||
DEY
|
||||
BNE :L1
|
||||
STA :REM
|
||||
*
|
||||
** RESTORE RETURN ADDRESS
|
||||
*
|
||||
LDA :RETADR+1
|
||||
LDA RETADR+1
|
||||
PHA
|
||||
LDA :RETADR
|
||||
LDA RETADR
|
||||
PHA
|
||||
*
|
||||
** LOAD QUOTIENT INTO A, REMAINDER INTO X
|
||||
*
|
||||
LDX :REM ; REMAINDER TO X
|
||||
*
|
||||
LDY :REM ; REMAINDER TO Y
|
||||
LDA #1
|
||||
STA RETLEN
|
||||
LDA :DVSOR
|
||||
STA RETURN
|
||||
*
|
||||
RTS
|
||||
*
|
||||
** DATA
|
||||
@ -396,5 +475,5 @@ DIV8
|
||||
:REM DS 1
|
||||
:DVEND DS 1
|
||||
:DVSOR DS 1
|
||||
:RETADR DS 2
|
||||
*
|
||||
XMATH8
|
||||
|
198
disks/disk3_math8_math16/T.MATH8.MIN
Normal file
198
disks/disk3_math8_math16/T.MATH8.MIN
Normal file
@ -0,0 +1,198 @@
|
||||
JMP XMATH8
|
||||
*
|
||||
** RAND8
|
||||
*
|
||||
LDX #8
|
||||
LDA RNDL+0
|
||||
:A
|
||||
ASL
|
||||
ROL RNDL+1
|
||||
BCC :B
|
||||
EOR #$2D
|
||||
:B
|
||||
DEX
|
||||
BNE :A
|
||||
STA RNDL+0
|
||||
STA RETURN
|
||||
LDY #1
|
||||
STY RETLEN
|
||||
CMP #0
|
||||
RTS
|
||||
*
|
||||
RANDB
|
||||
*
|
||||
PLA
|
||||
STA RETADR
|
||||
PLA
|
||||
STA RETADR+1
|
||||
PLA
|
||||
STA :NEWMAX
|
||||
PLA
|
||||
STA :NEWMIN
|
||||
LDA #1
|
||||
STA :OLDMIN
|
||||
LDA #255
|
||||
STA :OLDMAX
|
||||
JSR RAND8
|
||||
STA :OLDVAL
|
||||
LDA :OLDMAX
|
||||
SEC
|
||||
SBC :OLDMIN
|
||||
STA :OLDRANGE
|
||||
LDA :NEWMAX
|
||||
SEC
|
||||
SBC :NEWMIN
|
||||
STA :NEWRANGE
|
||||
LDA :OLDVAL
|
||||
SEC
|
||||
SBC :OLDMIN
|
||||
STA :VALRANGE
|
||||
LDA #00
|
||||
TAY
|
||||
STY :NUM1HI
|
||||
BEQ :ENTLP
|
||||
:DOADD
|
||||
CLC
|
||||
ADC :VALRANGE
|
||||
TAX
|
||||
TYA
|
||||
ADC :NUM1HI
|
||||
TAY
|
||||
TXA
|
||||
:MLP
|
||||
ASL :VALRANGE
|
||||
ROL :NUM1HI
|
||||
:ENTLP
|
||||
LSR :NEWRANGE
|
||||
BCS :DOADD
|
||||
BNE :MLP
|
||||
STA :MULRANGE
|
||||
STY :MULRANGE+1
|
||||
:DIVIDE
|
||||
LDA #0
|
||||
STA :REMAIN
|
||||
STA :REMAIN+1
|
||||
LDX #16
|
||||
:DIVLP
|
||||
ASL :MULRANGE
|
||||
ROL :MULRANGE+1
|
||||
ROL :REMAIN
|
||||
ROL :REMAIN+1
|
||||
LDA :REMAIN
|
||||
SEC
|
||||
SBC :OLDRANGE
|
||||
TAY
|
||||
LDA :REMAIN+1
|
||||
SBC :OLDRANGE+1
|
||||
BCC :SKIP
|
||||
STA :REMAIN+1
|
||||
STY :REMAIN
|
||||
INC :DIVRANGE
|
||||
:SKIP DEX
|
||||
BNE :DIVLP
|
||||
LDA :DIVRANGE ; LO BYTE ONLY
|
||||
CLC
|
||||
ADC :NEWMIN
|
||||
STA :NEWVAL
|
||||
LDA RETADR+1
|
||||
PHA
|
||||
LDA RETADR
|
||||
PHA
|
||||
LDA :NEWVAL ; RETURN # IN A
|
||||
STA RETURN
|
||||
LDX #1
|
||||
STX RETLEN
|
||||
RTS
|
||||
:OLDRANGE DS 2
|
||||
:NEWRANGE DS 2
|
||||
:MULRANGE DS 2
|
||||
:DIVRANGE DS 2
|
||||
:VALRANGE DS 2
|
||||
:OLDVAL DS 2
|
||||
:NEWVAL DS 2
|
||||
:OLDMIN DS 2
|
||||
:NEWMIN DS 2
|
||||
:OLDMAX DS 2
|
||||
:NEWMAX DS 2
|
||||
:NUM1HI DS 2
|
||||
:REMAIN DS 2
|
||||
*
|
||||
MULT8
|
||||
*
|
||||
PLA
|
||||
STA RETADR
|
||||
PLA
|
||||
STA RETADR+1
|
||||
PLA
|
||||
STA :MUL1
|
||||
PLA
|
||||
STA :MUL2
|
||||
LDA #$00
|
||||
TAY
|
||||
TAX
|
||||
STY :MUL1H
|
||||
BEQ :GOLOOP
|
||||
:DOADD
|
||||
CLC
|
||||
ADC :MUL1
|
||||
TAY
|
||||
TXA
|
||||
ADC :MUL1H
|
||||
TAX
|
||||
TYA
|
||||
:LP
|
||||
ASL :MUL1
|
||||
ROL :MUL1H
|
||||
:GOLOOP
|
||||
LSR :MUL2
|
||||
BCS :DOADD
|
||||
BNE :LP
|
||||
LDA RETADR+1
|
||||
PHA
|
||||
LDA RETADR
|
||||
PHA
|
||||
STY RETURN
|
||||
STX RETURN+1
|
||||
LDA #2
|
||||
STA RETLEN
|
||||
RTS
|
||||
:MUL1 DS 1
|
||||
:MUL2 DS 1
|
||||
:MUL1H DS 1
|
||||
*
|
||||
DIVD8
|
||||
*
|
||||
PLA
|
||||
STA RETADR
|
||||
PLA
|
||||
STA RETADR+1
|
||||
PLA
|
||||
STA :DVEND
|
||||
PLA
|
||||
STA :DVSOR
|
||||
LDA #$00
|
||||
LDY #8
|
||||
ASL :DVSOR
|
||||
:L1 ROL
|
||||
CMP :DVEND
|
||||
BCC :L2
|
||||
SBC :DVEND
|
||||
:L2 ROL :DVSOR
|
||||
DEY
|
||||
BNE :L1
|
||||
STA :REM
|
||||
LDA RETADR+1
|
||||
PHA
|
||||
LDA RETADR
|
||||
PHA
|
||||
LDY :REM
|
||||
LDA #1
|
||||
STA RETLEN
|
||||
LDA :DVSOR
|
||||
STA RETURN
|
||||
RTS
|
||||
:REM DS 1
|
||||
:DVEND DS 1
|
||||
:DVSOR DS 1
|
||||
*
|
||||
XMATH8
|
156
disks/disk3_math8_math16/T.MULT16
Normal file
156
disks/disk3_math8_math16/T.MULT16
Normal file
@ -0,0 +1,156 @@
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* MULT16 :: MULTIPLY WORDS *
|
||||
*- -*
|
||||
* PERFORM MULTIPLICATION USING *
|
||||
* THE SHIFT AND ADD ALGORITHM *
|
||||
* *
|
||||
* NOTE: WHILE THIS DOES PASS *
|
||||
* THE FULL 32BIT PRODUCT BACK *
|
||||
* VIA X AND Y, THIS WOULD *
|
||||
* RETURN FALSE RESULTS IF ONE *
|
||||
* OF THE PARAMETERS HAD BEEN *
|
||||
* SIGNED. THUS, USUALLY ONLY *
|
||||
* THE LOW WORD IS USED. *
|
||||
*- -*
|
||||
* CLOBBERS: *
|
||||
* *
|
||||
* FLAGS: ????---- REG: AXYM *
|
||||
*- -*
|
||||
* CYCLES: ??? *
|
||||
* SIZE: *
|
||||
*- -*
|
||||
* USAGE: *
|
||||
* *
|
||||
* LDA #>1000 *
|
||||
* PHA *
|
||||
* LDA #<1000 ; MCAND *
|
||||
* PHA *
|
||||
* LDA #>3 *
|
||||
* PHA *
|
||||
* LDA #<3 ; MLIER *
|
||||
* PHA *
|
||||
* JSR MUL16 ; = 3000 *
|
||||
*- -*
|
||||
* ENTRY *
|
||||
* *
|
||||
* TOP OF STACK *
|
||||
* *
|
||||
* LOW BYTE OF RETURN ADDRESS *
|
||||
* HI BYTE OF RETURN ADDRESS *
|
||||
* LOW BYTE OF MULTIPLIER *
|
||||
* HIGH BYTE OF MULTIPLIER *
|
||||
* LOW BYTE OF MULTIPLICAND *
|
||||
* HIGH BYTE OF MULTIPLICAND *
|
||||
*- -*
|
||||
* EXIT *
|
||||
* *
|
||||
* TOP OF STACK *
|
||||
* *
|
||||
* LOW BYTE OF RETURN ADDRESS *
|
||||
* HI BYTE OF RETURN ADDRESS *
|
||||
* LOW BYTE OF PRODUCT *
|
||||
* HIGH BYTE OF PRODUCT (16BIT) *
|
||||
* *
|
||||
* .Y = LOW BYTE OF HIGH WORD *
|
||||
* .X = HIGH BYTE OF HIGH WORD *
|
||||
* .A = LOW BYTE OF RET ADDR *
|
||||
* *
|
||||
* [RETURN] = RESULT (2 BYTES) *
|
||||
* [RETLEN] = 2 (RESULT LENGTH) *
|
||||
*- -*
|
||||
* ADAPTED FROM LEVANTHAL AND *
|
||||
* WINTHROP'S /6502 ASSEMBLY *
|
||||
* LANGUAGE ROUTINES/. *
|
||||
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
||||
*
|
||||
MULT16
|
||||
*
|
||||
** GET RETURN ADDRESS
|
||||
*
|
||||
PLA
|
||||
STA RETADR
|
||||
PLA
|
||||
STA RETADR+1
|
||||
*
|
||||
** GET PARAMETERS
|
||||
*
|
||||
PLA
|
||||
STA :MLIER
|
||||
PLA
|
||||
STA :MLIER+1
|
||||
PLA
|
||||
STA :MCAND
|
||||
PLA
|
||||
STA :MCAND+1
|
||||
*
|
||||
** PERFORM MULTIPLICATION USING THE SHIFT
|
||||
** AND ADD ALGORITHM, WHICH PRODUCES AN
|
||||
** UNSIGNED 32-BIT PRODUCT IN :HIPROD AND
|
||||
** :MLIER WITH :HIPROD BEING THE HIGH WORD.
|
||||
*
|
||||
LDA #0
|
||||
STA :HPROD ; ZERO HIGH WORD
|
||||
STA :HPROD+1
|
||||
LDX #17 ; # OF BITS IN MPLIER
|
||||
; PLUS 1. EXTRA LOOP IS
|
||||
; TO MOVE LAST CARRY INTO
|
||||
; THE PRODUCT.
|
||||
CLC ; CLEAR CARRY FOR 1ST TIME
|
||||
; THROUGH LOOP.
|
||||
:MULLP
|
||||
*
|
||||
** IF NEXT BIT = 1 THEN
|
||||
** HIPROD = HIPROD+MCAND
|
||||
*
|
||||
ROR :HPROD+1
|
||||
ROR :HPROD
|
||||
ROR :MLIER+1
|
||||
ROR :MLIER
|
||||
BCC :DECCNT ; BR IF NEXT BIT OF
|
||||
; MULTIPLIER IS 0
|
||||
CLC ; NEXT BIT=1 SO ADD MCAND
|
||||
; TO PRODUCT
|
||||
LDA :MCAND
|
||||
ADC :HPROD
|
||||
STA :HPROD
|
||||
LDA :MCAND+1
|
||||
ADC :HPROD+1
|
||||
STA :HPROD+1 ; CARRY = OVERFLOW
|
||||
; FROM ADD
|
||||
:DECCNT
|
||||
DEX
|
||||
BNE :MULLP ; CONTINUE UNTIL DONE
|
||||
|
||||
LDY :HPROD ; LOW BYTE OF HIGH WORD
|
||||
LDX :HPROD+1 ; HIGH BYTE OF HIGH WORD
|
||||
*
|
||||
** PUSH LOW WORD OF PRODUCT ONTO THE STACK
|
||||
*
|
||||
LDA :MLIER+1
|
||||
TAX
|
||||
STX RETURN+1
|
||||
LDA :MLIER
|
||||
TAY
|
||||
STY RETURN
|
||||
LDA :HPROD
|
||||
STA RETURN+2
|
||||
LDA #2
|
||||
STA RETLEN
|
||||
*
|
||||
** RESTORE RETURN ADDRESS
|
||||
*
|
||||
LDA RETADR+1
|
||||
PHA
|
||||
LDA RETADR
|
||||
PHA
|
||||
*
|
||||
LDA :HPROD ;24BIT
|
||||
RTS
|
||||
*
|
||||
** DATA
|
||||
*
|
||||
:MCAND DS 3
|
||||
:MLIER DS 3
|
||||
:HPROD DS 2
|
||||
*
|
58
disks/disk3_math8_math16/T.MULT16.MIN
Normal file
58
disks/disk3_math8_math16/T.MULT16.MIN
Normal file
@ -0,0 +1,58 @@
|
||||
*
|
||||
MULT16
|
||||
*
|
||||
PLA
|
||||
STA RETADR
|
||||
PLA
|
||||
STA RETADR+1
|
||||
PLA
|
||||
STA :MLIER
|
||||
PLA
|
||||
STA :MLIER+1
|
||||
PLA
|
||||
STA :MCAND
|
||||
PLA
|
||||
STA :MCAND+1
|
||||
LDA #0
|
||||
STA :HPROD
|
||||
STA :HPROD+1
|
||||
LDX #17
|
||||
CLC
|
||||
:MULLP
|
||||
ROR :HPROD+1
|
||||
ROR :HPROD
|
||||
ROR :MLIER+1
|
||||
ROR :MLIER
|
||||
BCC :DECCNT
|
||||
CLC
|
||||
LDA :MCAND
|
||||
ADC :HPROD
|
||||
STA :HPROD
|
||||
LDA :MCAND+1
|
||||
ADC :HPROD+1
|
||||
STA :HPROD+1
|
||||
:DECCNT
|
||||
DEX
|
||||
BNE :MULLP
|
||||
|
||||
LDY :HPROD
|
||||
LDX :HPROD+1
|
||||
LDA :MLIER+1
|
||||
TAX
|
||||
STX RETURN+1
|
||||
LDA :MLIER
|
||||
TAY
|
||||
STY RETURN
|
||||
LDA :HPROD
|
||||
STA RETURN+2
|
||||
LDA #2
|
||||
STA RETLEN
|
||||
LDA RETADR+1
|
||||
PHA
|
||||
LDA RETADR
|
||||
PHA
|
||||
LDA :HPROD
|
||||
RTS
|
||||
:MCAND DS 3
|
||||
:MLIER DS 3
|
||||
:HPROD DS 2
|
109
disks/disk3_math8_math16/T.MULT8
Normal file
109
disks/disk3_math8_math16/T.MULT8
Normal file
@ -0,0 +1,109 @@
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* MULT8 : 8BIT MULTIPLY (16BR) *
|
||||
*- -*
|
||||
* MULTIPLY TWO 8BIT NUMBERS TO *
|
||||
* GET 16BIT RESULT. NUMBERS *
|
||||
* MUST BE UNSIGNED. *
|
||||
* *
|
||||
* ORIGINAL AUTHOR IS WHITE *
|
||||
* FLAME, AS SHARED ON *
|
||||
* CODEBASE64. I HAVE MADE SOME *
|
||||
* MINOR ALTERATIONS, BUT NOT *
|
||||
* NEARLY ENOUGH TO CALL IT MY *
|
||||
* OWN. *
|
||||
*- -*
|
||||
* CLOBBERS: *
|
||||
* *
|
||||
* FLAGS: ????---- REG: AXYM *
|
||||
*- -*
|
||||
* CYCLES: ??? *
|
||||
* SIZE: *
|
||||
*- -*
|
||||
* USAGE: *
|
||||
* *
|
||||
* LDA #100 *
|
||||
* PHA *
|
||||
* PDA #200 *
|
||||
* PHA *
|
||||
* JSR MUL8 *
|
||||
*- -*
|
||||
* ENTRY *
|
||||
* *
|
||||
* LOW BYTE OF RETURN ADDRESS *
|
||||
* HIGH BYTE OF RETURN ADDRESS *
|
||||
* SECOND NUM TO BE MULTIPLIED *
|
||||
* FIRST NUM TO BE MULTIPLIED *
|
||||
*- -*
|
||||
* EXIT *
|
||||
* *
|
||||
* .Y = LOW BYTE OF PRODUCT *
|
||||
* .X = HI BYTE OF PRODUCT *
|
||||
* .A = PRODUCT LENGTH (2) *
|
||||
* *
|
||||
* [RETURN] = PRODUCT *
|
||||
* [RETLEN] = 2 (PRODUCT LEN) *
|
||||
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
||||
*
|
||||
MULT8
|
||||
*
|
||||
** GET RETURN ADDRESS
|
||||
*
|
||||
PLA
|
||||
STA RETADR
|
||||
PLA
|
||||
STA RETADR+1
|
||||
*
|
||||
** GET PARAMETERS
|
||||
*
|
||||
PLA
|
||||
STA :MUL1
|
||||
PLA
|
||||
STA :MUL2
|
||||
*
|
||||
** INIT
|
||||
*
|
||||
LDA #$00
|
||||
TAY
|
||||
TAX
|
||||
STY :MUL1H
|
||||
BEQ :GOLOOP
|
||||
*
|
||||
:DOADD
|
||||
CLC
|
||||
ADC :MUL1
|
||||
TAY
|
||||
*
|
||||
TXA
|
||||
ADC :MUL1H
|
||||
TAX
|
||||
TYA
|
||||
*
|
||||
:LP
|
||||
ASL :MUL1
|
||||
ROL :MUL1H
|
||||
:GOLOOP
|
||||
LSR :MUL2
|
||||
BCS :DOADD
|
||||
BNE :LP
|
||||
*
|
||||
** RESTORE RETURN ADDRESS
|
||||
*
|
||||
LDA RETADR+1
|
||||
PHA
|
||||
LDA RETADR
|
||||
PHA
|
||||
*
|
||||
STY RETURN
|
||||
STX RETURN+1
|
||||
LDA #2
|
||||
STA RETLEN
|
||||
*
|
||||
RTS
|
||||
*
|
||||
** DATA
|
||||
*
|
||||
:MUL1 DS 1
|
||||
:MUL2 DS 1
|
||||
:MUL1H DS 1
|
||||
*
|
42
disks/disk3_math8_math16/T.MULT8.MIN
Normal file
42
disks/disk3_math8_math16/T.MULT8.MIN
Normal file
@ -0,0 +1,42 @@
|
||||
MULT8
|
||||
*
|
||||
PLA
|
||||
STA RETADR
|
||||
PLA
|
||||
STA RETADR+1
|
||||
PLA
|
||||
STA :MUL1
|
||||
PLA
|
||||
STA :MUL2
|
||||
LDA #$00
|
||||
TAY
|
||||
TAX
|
||||
STY :MUL1H
|
||||
BEQ :GOLOOP
|
||||
:DOADD
|
||||
CLC
|
||||
ADC :MUL1
|
||||
TAY
|
||||
TXA
|
||||
ADC :MUL1H
|
||||
TAX
|
||||
TYA
|
||||
:LP
|
||||
ASL :MUL1
|
||||
ROL :MUL1H
|
||||
:GOLOOP
|
||||
LSR :MUL2
|
||||
BCS :DOADD
|
||||
BNE :LP
|
||||
LDA RETADR+1
|
||||
PHA
|
||||
LDA RETADR
|
||||
PHA
|
||||
STY RETURN
|
||||
STX RETURN+1
|
||||
LDA #2
|
||||
STA RETLEN
|
||||
RTS
|
||||
:MUL1 DS 1
|
||||
:MUL2 DS 1
|
||||
:MUL1H DS 1
|
89
disks/disk3_math8_math16/T.RAND16
Normal file
89
disks/disk3_math8_math16/T.RAND16
Normal file
@ -0,0 +1,89 @@
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* RAND16 : 16BIT RANDOM NUMBER *
|
||||
*- -*
|
||||
* GENERATE A 16BIT PSEUDO- *
|
||||
* RANDOM NUMBER AND RETURN IT *
|
||||
* IN Y,X (LOW, HIGH). *
|
||||
* *
|
||||
* ORIGINAL AUTHOR IS WHITE *
|
||||
* FLAME, AS SHARED ON *
|
||||
* CODEBASE64. *
|
||||
*- -*
|
||||
* CLOBBERS: *
|
||||
* *
|
||||
* FLAGS: ????---- REG: AXYM *
|
||||
*- -*
|
||||
* CYCLES: ??? *
|
||||
* SIZE: *
|
||||
*- -*
|
||||
* USAGE: *
|
||||
* *
|
||||
*- -*
|
||||
* ENTRY *
|
||||
* *
|
||||
* LOW BYTE OF RETURN ADDRESS *
|
||||
* HIGH BYTE OF RETURN ADDRESS *
|
||||
*- -*
|
||||
* EXIT *
|
||||
* *
|
||||
* .Y = HIGH BYTE OF PRODUCT *
|
||||
* .X = LOW BYTE OF PRODUCT *
|
||||
* .A = LOW BYTE OF PRODUCT *
|
||||
* *
|
||||
* [RETURN] = RESULT (2 BYTES) *
|
||||
* [RETLEN] = 2 (RESULT LENGTH) *
|
||||
*- -*
|
||||
* NOTE: THERE ARE 2048 MAGIC *
|
||||
* NUMBERS THAT COULD BE EOR'D *
|
||||
* TO GENERATE A PSEUDO-RANDOM *
|
||||
* PATTERN THAT DOESN'T REPEAT *
|
||||
* UNTIL 65535 ITERATIONS. TOO *
|
||||
* MANY TO LIST HERE, BUT SOME *
|
||||
* ARE: $002D, $1979, $1B47, *
|
||||
* $41BB, $3D91, $B5E9, $FFEB *
|
||||
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
||||
*
|
||||
RAND16
|
||||
*
|
||||
LDA RNDL
|
||||
STA :SEED
|
||||
LDA RNDH
|
||||
STA :SEED+1
|
||||
*
|
||||
LDA :SEED
|
||||
BEQ :LOW0
|
||||
*
|
||||
** DO A NORMAL SHIFT
|
||||
*
|
||||
ASL :SEED
|
||||
LDA :SEED+1
|
||||
ROL
|
||||
BCC :NOEOR
|
||||
:DOEOR ; HIGH BYTE IN A
|
||||
EOR #>$0369
|
||||
STA :SEED+1
|
||||
LDA :SEED
|
||||
EOR #<$0369
|
||||
STA :SEED
|
||||
JMP :EXIT
|
||||
:LOW0
|
||||
LDA :SEED+1
|
||||
BEQ :DOEOR
|
||||
ASL
|
||||
BEQ :NOEOR
|
||||
BCS :DOEOR
|
||||
:NOEOR
|
||||
STA :SEED+1
|
||||
:EXIT LDX :SEED+1
|
||||
LDY :SEED
|
||||
STY RETURN
|
||||
STX RETURN+1
|
||||
LDA #2
|
||||
STA RETLEN
|
||||
RTS
|
||||
*
|
||||
** DATA
|
||||
*
|
||||
:SEED DS 2
|
||||
*
|
36
disks/disk3_math8_math16/T.RAND16.MIN
Normal file
36
disks/disk3_math8_math16/T.RAND16.MIN
Normal file
@ -0,0 +1,36 @@
|
||||
*
|
||||
RAND16
|
||||
*
|
||||
LDA RNDL
|
||||
STA :SEED
|
||||
LDA RNDH
|
||||
STA :SEED+1
|
||||
LDA :SEED
|
||||
BEQ :LOW0
|
||||
ASL :SEED
|
||||
LDA :SEED+1
|
||||
ROL
|
||||
BCC :NOEOR
|
||||
:DOEOR
|
||||
EOR #>$0369
|
||||
STA :SEED+1
|
||||
LDA :SEED
|
||||
EOR #<$0369
|
||||
STA :SEED
|
||||
JMP :EXIT
|
||||
:LOW0
|
||||
LDA :SEED+1
|
||||
BEQ :DOEOR
|
||||
ASL
|
||||
BEQ :NOEOR
|
||||
BCS :DOEOR
|
||||
:NOEOR
|
||||
STA :SEED+1
|
||||
:EXIT LDX :SEED+1
|
||||
LDY :SEED
|
||||
STY RETURN
|
||||
STX RETURN+1
|
||||
LDA #2
|
||||
STA RETLEN
|
||||
RTS
|
||||
:SEED DS 2
|
55
disks/disk3_math8_math16/T.RAND8
Normal file
55
disks/disk3_math8_math16/T.RAND8
Normal file
@ -0,0 +1,55 @@
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* RAND8 :: 8-BIT RANDOM NUMBER *
|
||||
*- -*
|
||||
* GENERATES A PSEUDO-RANDOM *
|
||||
* NUMBER BETWEEN 1..255 (BYTE) *
|
||||
* AND RETURNS THE VALUE IN .A *
|
||||
* *
|
||||
* THIS USES THE GALOIS LINEAR *
|
||||
* FEEDBACK SHIFT REGISTER *
|
||||
* ALGORITHM WITH POLYNOMIAL *
|
||||
* $002D. THE SEQUENCE WILL *
|
||||
* REPEAT AFTER 65535 CALLS. *
|
||||
*- -*
|
||||
* CLOBBERS: *
|
||||
* *
|
||||
* FLAGS: ????---- REG: AX-- *
|
||||
*- -*
|
||||
* CYCLES: ??? *
|
||||
* SIZE: *
|
||||
*- -*
|
||||
* USAGE: JSR RND8 *
|
||||
*- -*
|
||||
* EXIT *
|
||||
* *
|
||||
* .Y = NOT AFFECTED *
|
||||
* .X = CLOBBERED *
|
||||
* .A = RANDOM NUM 1..255 *
|
||||
*- -*
|
||||
* NOTE: BASED ON THE PRNG *
|
||||
* LISTING FOUND IN THE NESDEV *
|
||||
* WIKI. *
|
||||
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
||||
*
|
||||
RAND8
|
||||
*
|
||||
LDX #8
|
||||
LDA RNDL+0
|
||||
:A
|
||||
ASL ;SHIFT THE REG
|
||||
ROL RNDL+1
|
||||
BCC :B
|
||||
EOR #$2D ; APPLY XOR FEEDBACK
|
||||
; WHENEVER A 1 BIT IS
|
||||
; SHIFTED OUT
|
||||
:B
|
||||
DEX
|
||||
BNE :A
|
||||
STA RNDL+0
|
||||
STA RETURN
|
||||
LDY #1
|
||||
STY RETLEN
|
||||
CMP #0 ; RELOAD FLAGS
|
||||
RTS
|
||||
*
|
18
disks/disk3_math8_math16/T.RAND8.MIN
Normal file
18
disks/disk3_math8_math16/T.RAND8.MIN
Normal file
@ -0,0 +1,18 @@
|
||||
** RAND8
|
||||
*
|
||||
LDX #8
|
||||
LDA RNDL+0
|
||||
:A
|
||||
ASL
|
||||
ROL RNDL+1
|
||||
BCC :B
|
||||
EOR #$2D
|
||||
:B
|
||||
DEX
|
||||
BNE :A
|
||||
STA RNDL+0
|
||||
STA RETURN
|
||||
LDY #1
|
||||
STY RETLEN
|
||||
CMP #0
|
||||
RTS
|
191
disks/disk3_math8_math16/T.RANDB
Normal file
191
disks/disk3_math8_math16/T.RANDB
Normal file
@ -0,0 +1,191 @@
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* RANDB :: RANDOM BYTE *
|
||||
*- -*
|
||||
* RETURNS A RANDOM BYTE VALUE *
|
||||
* BETWEEN THE HIGH AND LOW *
|
||||
* BOUNDS PASSED TO ROUTINE. *
|
||||
* NOTE THAT THIS ONLY WORKS *
|
||||
* WITH UNSIGNED VALUES. *
|
||||
*- -*
|
||||
* CLOBBERS: *
|
||||
* *
|
||||
* FLAGS: ????---- REG: AXYM *
|
||||
*- -*
|
||||
* CYCLES: ??? *
|
||||
* SIZE: *
|
||||
*- -*
|
||||
* USAGE: *
|
||||
* *
|
||||
* LDA #1 ; LOW BOUND *
|
||||
* PHA *
|
||||
* LDA #100 ; HIGH *
|
||||
* PHA *
|
||||
* JSR RANDB *
|
||||
*- -*
|
||||
* ENTRY *
|
||||
* *
|
||||
* TOP OF STACK *
|
||||
* *
|
||||
* LOW BYTE OF RETURN ADDRESS *
|
||||
* HI BYTE OF RETURN ADDRESS *
|
||||
*- -*
|
||||
* EXIT *
|
||||
* *
|
||||
* TOP OF STACK *
|
||||
* *
|
||||
* LOW BYTE OF RETURN ADDRESS *
|
||||
* HI BYTE OF RETURN ADDRESS *
|
||||
* *
|
||||
* .Y = COUNTER; TRASH *
|
||||
* .X = COUNTER; TRASH *
|
||||
* .A = LOW BYTE OF RET ADDR *
|
||||
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
||||
*
|
||||
RANDB
|
||||
*
|
||||
** GET RETURN ADDRESS
|
||||
*
|
||||
PLA
|
||||
STA RETADR
|
||||
PLA
|
||||
STA RETADR+1
|
||||
*
|
||||
** GET PARAMETERS
|
||||
*
|
||||
PLA
|
||||
STA :NEWMAX
|
||||
PLA
|
||||
STA :NEWMIN
|
||||
*
|
||||
** GET OLDMIN,OLDMAX,OLDVAL
|
||||
*
|
||||
LDA #1
|
||||
STA :OLDMIN
|
||||
LDA #255
|
||||
STA :OLDMAX
|
||||
JSR RAND8 ; RANDOM BYTE 0..255
|
||||
STA :OLDVAL
|
||||
*
|
||||
** NEWVALUE = (((OLDVAL-NEWMIN) * (NEWMAX-NEWMIN) /
|
||||
** (OLDMAX-OLDMIN)) + NEWMIN
|
||||
*
|
||||
** OR
|
||||
*
|
||||
** OLDRANGE = (OLDMAX-OLDMIN)
|
||||
** NEWRANGE = (NEWMAX - NEWMIN)
|
||||
** NEWVAL = (((OLDVAL-OLDMIN) * NEWRANGE) / OLDRANGE) + NEWMIN
|
||||
*
|
||||
** GET OLDRANGE: OLDMAX - OLDMIN
|
||||
*
|
||||
LDA :OLDMAX
|
||||
SEC
|
||||
SBC :OLDMIN
|
||||
STA :OLDRANGE
|
||||
*
|
||||
** NOW GET NEWRANGE: NEWMAX - NEWMIN
|
||||
*
|
||||
LDA :NEWMAX
|
||||
SEC
|
||||
SBC :NEWMIN
|
||||
STA :NEWRANGE
|
||||
*
|
||||
** NOW GET VALRANGE: OLDVAL - OLDMIN
|
||||
*
|
||||
LDA :OLDVAL
|
||||
SEC
|
||||
SBC :OLDMIN
|
||||
STA :VALRANGE
|
||||
*
|
||||
** GET MULRANGE: VALRANGE * NEWRANGE
|
||||
*
|
||||
LDA #00
|
||||
TAY
|
||||
STY :NUM1HI
|
||||
BEQ :ENTLP
|
||||
*
|
||||
:DOADD
|
||||
CLC
|
||||
ADC :VALRANGE
|
||||
TAX
|
||||
*
|
||||
TYA
|
||||
ADC :NUM1HI
|
||||
TAY
|
||||
TXA
|
||||
*
|
||||
:MLP
|
||||
ASL :VALRANGE
|
||||
ROL :NUM1HI
|
||||
:ENTLP
|
||||
LSR :NEWRANGE
|
||||
BCS :DOADD
|
||||
BNE :MLP
|
||||
*
|
||||
STA :MULRANGE
|
||||
STY :MULRANGE+1
|
||||
*
|
||||
** NOW GET DIVRANGE: MULRANGE / OLDRANGE
|
||||
*
|
||||
:DIVIDE
|
||||
LDA #0
|
||||
STA :REMAIN
|
||||
STA :REMAIN+1
|
||||
LDX #16
|
||||
*
|
||||
:DIVLP
|
||||
ASL :MULRANGE
|
||||
ROL :MULRANGE+1
|
||||
ROL :REMAIN
|
||||
ROL :REMAIN+1
|
||||
LDA :REMAIN
|
||||
SEC
|
||||
SBC :OLDRANGE
|
||||
TAY
|
||||
LDA :REMAIN+1
|
||||
SBC :OLDRANGE+1
|
||||
BCC :SKIP
|
||||
*
|
||||
STA :REMAIN+1
|
||||
STY :REMAIN
|
||||
INC :DIVRANGE
|
||||
*
|
||||
:SKIP DEX
|
||||
BNE :DIVLP
|
||||
*
|
||||
** NOW ADD NEWMIN TO DIVRANGE
|
||||
*
|
||||
LDA :DIVRANGE ; LO BYTE ONLY
|
||||
CLC
|
||||
ADC :NEWMIN
|
||||
STA :NEWVAL
|
||||
*
|
||||
** RESTORE RETURN ADDRESS
|
||||
*
|
||||
LDA RETADR+1
|
||||
PHA
|
||||
LDA RETADR
|
||||
PHA
|
||||
*
|
||||
LDA :NEWVAL ; RETURN # IN A
|
||||
STA RETURN
|
||||
LDX #1
|
||||
STX RETLEN
|
||||
RTS
|
||||
*
|
||||
** DATA
|
||||
*
|
||||
:OLDRANGE DS 2
|
||||
:NEWRANGE DS 2
|
||||
:MULRANGE DS 2
|
||||
:DIVRANGE DS 2
|
||||
:VALRANGE DS 2
|
||||
:OLDVAL DS 2
|
||||
:NEWVAL DS 2
|
||||
:OLDMIN DS 2
|
||||
:NEWMIN DS 2
|
||||
:OLDMAX DS 2
|
||||
:NEWMAX DS 2
|
||||
:NUM1HI DS 2
|
||||
:REMAIN DS 2
|
||||
*
|
97
disks/disk3_math8_math16/T.RANDB.MIN
Normal file
97
disks/disk3_math8_math16/T.RANDB.MIN
Normal file
@ -0,0 +1,97 @@
|
||||
RANDB
|
||||
*
|
||||
PLA
|
||||
STA RETADR
|
||||
PLA
|
||||
STA RETADR+1
|
||||
PLA
|
||||
STA :NEWMAX
|
||||
PLA
|
||||
STA :NEWMIN
|
||||
LDA #1
|
||||
STA :OLDMIN
|
||||
LDA #255
|
||||
STA :OLDMAX
|
||||
JSR RAND8
|
||||
STA :OLDVAL
|
||||
LDA :OLDMAX
|
||||
SEC
|
||||
SBC :OLDMIN
|
||||
STA :OLDRANGE
|
||||
LDA :NEWMAX
|
||||
SEC
|
||||
SBC :NEWMIN
|
||||
STA :NEWRANGE
|
||||
LDA :OLDVAL
|
||||
SEC
|
||||
SBC :OLDMIN
|
||||
STA :VALRANGE
|
||||
LDA #00
|
||||
TAY
|
||||
STY :NUM1HI
|
||||
BEQ :ENTLP
|
||||
:DOADD
|
||||
CLC
|
||||
ADC :VALRANGE
|
||||
TAX
|
||||
TYA
|
||||
ADC :NUM1HI
|
||||
TAY
|
||||
TXA
|
||||
:MLP
|
||||
ASL :VALRANGE
|
||||
ROL :NUM1HI
|
||||
:ENTLP
|
||||
LSR :NEWRANGE
|
||||
BCS :DOADD
|
||||
BNE :MLP
|
||||
STA :MULRANGE
|
||||
STY :MULRANGE+1
|
||||
:DIVIDE
|
||||
LDA #0
|
||||
STA :REMAIN
|
||||
STA :REMAIN+1
|
||||
LDX #16
|
||||
:DIVLP
|
||||
ASL :MULRANGE
|
||||
ROL :MULRANGE+1
|
||||
ROL :REMAIN
|
||||
ROL :REMAIN+1
|
||||
LDA :REMAIN
|
||||
SEC
|
||||
SBC :OLDRANGE
|
||||
TAY
|
||||
LDA :REMAIN+1
|
||||
SBC :OLDRANGE+1
|
||||
BCC :SKIP
|
||||
STA :REMAIN+1
|
||||
STY :REMAIN
|
||||
INC :DIVRANGE
|
||||
:SKIP DEX
|
||||
BNE :DIVLP
|
||||
LDA :DIVRANGE ; LO BYTE ONLY
|
||||
CLC
|
||||
ADC :NEWMIN
|
||||
STA :NEWVAL
|
||||
LDA RETADR+1
|
||||
PHA
|
||||
LDA RETADR
|
||||
PHA
|
||||
LDA :NEWVAL ; RETURN # IN A
|
||||
STA RETURN
|
||||
LDX #1
|
||||
STX RETLEN
|
||||
RTS
|
||||
:OLDRANGE DS 2
|
||||
:NEWRANGE DS 2
|
||||
:MULRANGE DS 2
|
||||
:DIVRANGE DS 2
|
||||
:VALRANGE DS 2
|
||||
:OLDVAL DS 2
|
||||
:NEWVAL DS 2
|
||||
:OLDMIN DS 2
|
||||
:NEWMIN DS 2
|
||||
:OLDMAX DS 2
|
||||
:NEWMAX DS 2
|
||||
:NUM1HI DS 2
|
||||
:REMAIN DS 2
|
46
disks/disk3_math8_math16/T.REQUIRED.HOOKS
Normal file
46
disks/disk3_math8_math16/T.REQUIRED.HOOKS
Normal file
@ -0,0 +1,46 @@
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* DECLARATIONS.PUT *
|
||||
*- -*
|
||||
* USED IN CONJUNCTION WITH *
|
||||
* OTHER PUT FILES. DEFINES *
|
||||
* BASIC DECLARATIONS USED *
|
||||
* ACROSS DIFFERENT ROUTINES *
|
||||
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
||||
*
|
||||
** ADDRESS STORAGE LOCATIONS FOR
|
||||
** INDIRECT ADDRESSING.
|
||||
*
|
||||
ADDR1 EQU $06
|
||||
ADDR2 EQU $08
|
||||
ADDR3 EQU $EB
|
||||
ADDR4 EQU $ED
|
||||
*
|
||||
** SCRATCHPAD ZERO PAGE LOCATIONS AND
|
||||
** DEDICATED ZERO PAGE ADDRESS TO HOLD
|
||||
** A RETURN ADDRESS PASSED VIA THE STACK
|
||||
*
|
||||
SCRATCH EQU $19
|
||||
SCRATCH2 EQU $1E
|
||||
RETADR EQU $FE
|
||||
*
|
||||
** ZERO PAGE ADDRESSES DEDICATED TO PASSING
|
||||
** BACK RESULTS WHEN THERE ARE MORE THAN
|
||||
** THREE BYTES BEING PASSED (AXY) AND THE
|
||||
** USE OF THE STACK IS IMPRACTICAL OR TOO SLOW
|
||||
*
|
||||
RESULT EQU $FA
|
||||
RESULT2 EQU $FC
|
||||
*
|
||||
** VARIOUS HOOKS USED BY ALL ROUTINES
|
||||
*
|
||||
REENTRY EQU $3D0
|
||||
*
|
||||
** ERROR HANDLING MEMORY LOCATIONS
|
||||
*
|
||||
** THIS DESIGNATES A 16-BYTE BLOCK OF MEMORY
|
||||
** THAT HOLDS DATA RELATED TO IDENTIFYING
|
||||
** RUNTIME VALUES FOR DEBUGGING.
|
||||
*
|
||||
ERRLOC EQU $0C00
|
||||
*
|
235
disks/disk3_math8_math16/T.REQUIRED.LIB
Normal file
235
disks/disk3_math8_math16/T.REQUIRED.LIB
Normal file
@ -0,0 +1,235 @@
|
||||
*
|
||||
JMP ENDVARS
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* REQUIRED.LIB *
|
||||
*- -*
|
||||
* GLOBAL ROUTINES AND *
|
||||
* VARIABLES EITHER USED BY THE *
|
||||
* LIBRARY OR PROVIDED FOR DEMO *
|
||||
* USE OR DEBUGGING PURPOSES. *
|
||||
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
||||
*
|
||||
********************************
|
||||
* *
|
||||
* GLOBAL ROUTINES *
|
||||
* *
|
||||
********************************
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* __GETRET: GET RETURN *
|
||||
*- -*
|
||||
* COPIES THE DATA IN [RETURN] *
|
||||
* TO THE SPECIFIED LOCATION. *
|
||||
* LENGTH IS DETERMINED BY *
|
||||
* VALUE OF RETLEN. *
|
||||
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
||||
*
|
||||
__GETRET
|
||||
*
|
||||
LDY #255
|
||||
PLA
|
||||
STA ADDR1
|
||||
PLA
|
||||
STA ADDR1+1
|
||||
*
|
||||
:LP
|
||||
INY
|
||||
LDA RETURN,Y
|
||||
STA (ADDR1),Y
|
||||
CPY RETLEN
|
||||
BNE :LP
|
||||
LDA ADDR1+1
|
||||
PHA
|
||||
LDA ADDR1
|
||||
PHA
|
||||
RTS
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* __SETPARM: SET PARAMETER *
|
||||
*- -*
|
||||
* COPIES DATA FROM SPECIFIED *
|
||||
* ADDRESS TO THE [PARAM] *
|
||||
* LOCATION FOR PASSING TO *
|
||||
* A ROUTINE. *
|
||||
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
||||
*
|
||||
__SETPARM
|
||||
*
|
||||
LDY #255
|
||||
PLA
|
||||
STA ADDR1
|
||||
PLA
|
||||
STA ADDR1+1
|
||||
*
|
||||
:LP
|
||||
INY
|
||||
LDA (ADDR1),Y
|
||||
STA PARAM,Y
|
||||
CPY PARLEN
|
||||
BNE :LP
|
||||
LDA ADDR1+1
|
||||
PHA
|
||||
LDA ADDR1
|
||||
PHA
|
||||
RTS
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* __DUMP: DUMP DATA *
|
||||
*- -*
|
||||
* OUTPUTS DATA LOCATED AT THE *
|
||||
* SPECIFIED ADDRESS IN HEX *
|
||||
* FORMAT FOR SPECIFIED NUMBER *
|
||||
* OF BYTES. *
|
||||
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
||||
*
|
||||
__DUMP
|
||||
*
|
||||
PLA
|
||||
STA :RET
|
||||
PLA
|
||||
STA :RET+1
|
||||
PLA
|
||||
STA :LENGTH
|
||||
PLA
|
||||
STA ADDR1
|
||||
PLA
|
||||
STA ADDR1+1
|
||||
*
|
||||
LDA #$8D
|
||||
JSR $FDF0
|
||||
LDA ADDR1+1
|
||||
AND #$F0
|
||||
LSR
|
||||
LSR
|
||||
LSR
|
||||
LSR
|
||||
TAX
|
||||
LDA :HEXTAB,X
|
||||
JSR $FDF0
|
||||
LDA ADDR1+1
|
||||
AND #$0F
|
||||
TAX
|
||||
LDA :HEXTAB,X
|
||||
JSR $FDF0
|
||||
LDA ADDR1
|
||||
AND #$F0
|
||||
LSR
|
||||
LSR
|
||||
LSR
|
||||
LSR
|
||||
TAX
|
||||
LDA :HEXTAB,X
|
||||
JSR $FDF0
|
||||
LDA ADDR1
|
||||
AND #$0F
|
||||
TAX
|
||||
LDA :HEXTAB,X
|
||||
JSR $FDF0
|
||||
LDA #186 ; :
|
||||
JSR $FDF0
|
||||
LDA #160 ; SPC
|
||||
JSR $FDF0
|
||||
*
|
||||
LDY #0
|
||||
:LP
|
||||
LDA (ADDR1),Y
|
||||
AND #$F0 ; MASK RIGHT
|
||||
LSR
|
||||
LSR
|
||||
LSR
|
||||
LSR
|
||||
STA :LEFT
|
||||
LDA (ADDR1),Y
|
||||
AND #$0F ; MASK LEFT
|
||||
STA :RIGHT
|
||||
LDX :LEFT
|
||||
LDA :HEXTAB,X
|
||||
JSR $FDF0
|
||||
LDX :RIGHT
|
||||
LDA :HEXTAB,X
|
||||
JSR $FDF0
|
||||
LDA #160
|
||||
JSR $FDF0
|
||||
INY
|
||||
CPY :LENGTH
|
||||
BNE :LP
|
||||
*
|
||||
*LDA #$8D
|
||||
*JSR $FDF0
|
||||
LDA :RET+1
|
||||
PHA
|
||||
LDA :RET
|
||||
PHA
|
||||
*
|
||||
RTS
|
||||
*
|
||||
:RET DS 2
|
||||
:RIGHT DS 1
|
||||
:LEFT DS 1
|
||||
:LENGTH DS 1
|
||||
:HEXTAB ASC "0123456789ABCDEF"
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* __P: PRINT FOLLOWING ASC *
|
||||
*- -*
|
||||
* THIS IS THE XPRINT ROUTINE *
|
||||
* FROM STDIO.LIB, BUT STRIPPED *
|
||||
* OF COMMENTS. FOR DEBUG. *
|
||||
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
||||
*
|
||||
__P
|
||||
PLA
|
||||
STA ADDR1
|
||||
PLA
|
||||
STA ADDR1+1
|
||||
LDY #1
|
||||
:LP LDA (ADDR1),Y
|
||||
BEQ :DONE
|
||||
JSR $FDF0
|
||||
INY
|
||||
BNE :LP
|
||||
:DONE CLC
|
||||
TYA
|
||||
ADC ADDR1
|
||||
STA ADDR1
|
||||
LDA ADDR1+1
|
||||
ADC #0
|
||||
PHA
|
||||
LDA ADDR1
|
||||
PHA
|
||||
RTS
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* __W: WAIT FOR KEYPRESS *
|
||||
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
||||
*
|
||||
__W
|
||||
JSR $FD0C
|
||||
RTS
|
||||
*
|
||||
********************************
|
||||
* *
|
||||
* GLOBAL VARIABLES *
|
||||
* *
|
||||
********************************
|
||||
*
|
||||
** 256 BYTES DEDICATED TO RETURN
|
||||
** VALUES OF VARIABLE LENGTH; CAN BE
|
||||
** MODIFIED TO SUIT SMALLER OR LARGER
|
||||
** NEEDS.
|
||||
*
|
||||
*
|
||||
RETLEN DS 1 ; RETURN VALUE BYTE LENGTH
|
||||
RETURN DS 256
|
||||
*
|
||||
** 256 BYTE VALUE DEDICATED TO LARGE
|
||||
** OR VARIABLE LENGTH PARAMETERS. THIS
|
||||
** CAN ALSO BE CHANGED TO FIT SMALLER OR
|
||||
** LARGER BOUNDS.
|
||||
*
|
||||
PARLEN DS 1
|
||||
PARAM DS 256
|
||||
*
|
||||
ENDVARS
|
||||
*
|
94
disks/disk3_math8_math16/T.REQUIRED.MAC
Normal file
94
disks/disk3_math8_math16/T.REQUIRED.MAC
Normal file
@ -0,0 +1,94 @@
|
||||
********************************
|
||||
* *
|
||||
********************************
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* REQUIRED.MAC *
|
||||
*- -*
|
||||
* MACROS USED FOR CORE UTILS *
|
||||
* AND LIBRARY ROUTINES. NOTE *
|
||||
* THAT THE LIBRARIES DO NOT *
|
||||
* USE THESE MACROS, BUT MAY *
|
||||
* USE THE ROUTINES. THESE ARE *
|
||||
* MERELY PROVIDED FOR THE SAKE *
|
||||
* OF CONVENIENCE. *
|
||||
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* _ISLIT: DETERMINES WHETHER A *
|
||||
* PARAM IS LITERAL OR *
|
||||
* NOT, AND CHANGES *
|
||||
* APPROPRIATELY. FOR *
|
||||
* MACRO USE ONLY. *
|
||||
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
||||
*
|
||||
_ISLIT MAC
|
||||
IF #=]1 ; IF ]1 IS A LITERAL
|
||||
LDA ]1/$100 ; GET HI
|
||||
PHA
|
||||
LDA ]1 ; GET LO
|
||||
PHA
|
||||
ELSE ; ]1 IS ADDRESS
|
||||
LDA ]1+1 ; SO GET HIGH VAL FROM ADDR
|
||||
PHA
|
||||
LDA ]1 ; THEN LO VAL
|
||||
PHA
|
||||
FIN
|
||||
<<<
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* _GRET: GET RETURN VALUE *
|
||||
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
||||
*
|
||||
_GRET MAC
|
||||
LDA #>]1
|
||||
PHA
|
||||
LDA #<]1
|
||||
PHA
|
||||
JSR __GETRET
|
||||
<<<
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* _SPAR: SET PARAMETER *
|
||||
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
||||
*
|
||||
_SPAR MAC
|
||||
LDA #>]1
|
||||
PHA
|
||||
LDA #<]1
|
||||
PHA
|
||||
JSR __SETPARM
|
||||
<<<
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* _DUMP: DUMP DATA *
|
||||
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
||||
*
|
||||
_DUMP MAC
|
||||
LDA #>]1
|
||||
PHA
|
||||
LDA #<]1
|
||||
PHA
|
||||
LDA ]2
|
||||
PHA
|
||||
JSR __DUMP
|
||||
<<<
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* _PRNT: PRINT STRING *
|
||||
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
||||
*
|
||||
_PRNT MAC
|
||||
JSR __P
|
||||
ASC ]1
|
||||
HEX 00
|
||||
<<<
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* _WAIT: WAIT FOR KEYPRESS *
|
||||
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
||||
*
|
||||
_WAIT MAC
|
||||
JSR __W
|
||||
<<<
|
||||
*
|
102
disks/disk3_math8_math16/T.SUBT16
Normal file
102
disks/disk3_math8_math16/T.SUBT16
Normal file
@ -0,0 +1,102 @@
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* SUBT16 :: SUBTRACT WORDS *
|
||||
*- -*
|
||||
* SUBTRACT ONE 16BIT NUMBER *
|
||||
* FROM ANOTHER, RETURNING THE *
|
||||
* RESULT IN .Y (LOW), .X (HI). *
|
||||
* SIGNED OR UNSIGNED. *
|
||||
*- -*
|
||||
* CLOBBERS: *
|
||||
* *
|
||||
* FLAGS: ????---- REG: AXYM *
|
||||
*- -*
|
||||
* CYCLES: ??? *
|
||||
* SIZE: *
|
||||
*- -*
|
||||
* USAGE: *
|
||||
* *
|
||||
* LDA #>1000 ; MINUEND *
|
||||
* PHA *
|
||||
* LDA #<1000 *
|
||||
* PHA *
|
||||
* LDA #>500 ; SUBTRAHEND *
|
||||
* PHA *
|
||||
* LDA #<500 *
|
||||
* PHA *
|
||||
* JSR SUBT16 *
|
||||
*- -*
|
||||
* ENTRY *
|
||||
* *
|
||||
* TOP OF STACK *
|
||||
* *
|
||||
* LOW BYTE OF RETURN ADDRESS *
|
||||
* HI BYTE OF RETURN ADDRESS *
|
||||
* LOW BYTE OF SUBTRAHEND *
|
||||
* HIGH BYTE OF SUBTRAHEND *
|
||||
* LOW BYTE OF MINUEND *
|
||||
* HIGH BYTE OF MINUEND *
|
||||
*- -*
|
||||
* EXIT *
|
||||
* *
|
||||
* TOP OF STACK *
|
||||
* *
|
||||
* LOW BYTE OF RETURN ADDRESS *
|
||||
* HI BYTE OF RETURN ADDRESS *
|
||||
* *
|
||||
* .Y = RESULT LOW BYTE *
|
||||
* .X = RESULT HIGH BYTE *
|
||||
* .A = LOW BYTE OF RET ADDR *
|
||||
* *
|
||||
* [RETURN] = RESULT (2 BYTES) *
|
||||
* [RETLEN] = 2 (RESULT LENGTH) *
|
||||
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
||||
*
|
||||
SUBT16
|
||||
*
|
||||
** GET RETURN ADDRESS
|
||||
*
|
||||
PLA
|
||||
STA RETADR
|
||||
PLA
|
||||
STA RETADR+1
|
||||
*
|
||||
** GET PARAMETERS
|
||||
*
|
||||
PLA
|
||||
STA :SUBT
|
||||
PLA
|
||||
STA :SUBT+1 ; SUBTRAHEND
|
||||
PLA
|
||||
STA :MINU
|
||||
PLA
|
||||
STA :MINU+1 ; MINUEND
|
||||
*
|
||||
** MINUEND - SUBTRAHEND
|
||||
*
|
||||
LDA :MINU
|
||||
SEC
|
||||
SBC :SUBT
|
||||
TAY ; LOW BYTE
|
||||
STY RETURN
|
||||
LDA :MINU+1
|
||||
SBC :SUBT+1
|
||||
TAX ; HIGH BYTE
|
||||
STX RETURN+1
|
||||
LDA #2
|
||||
STA RETLEN
|
||||
*
|
||||
** RESTORE RETURN ADDRESS
|
||||
*
|
||||
LDA RETADR+1
|
||||
PHA
|
||||
LDA RETADR
|
||||
PHA
|
||||
*
|
||||
RTS
|
||||
*
|
||||
** DATA
|
||||
*
|
||||
:MINU DS 2
|
||||
:SUBT DS 2
|
||||
*
|
33
disks/disk3_math8_math16/T.SUBT16.MIN
Normal file
33
disks/disk3_math8_math16/T.SUBT16.MIN
Normal file
@ -0,0 +1,33 @@
|
||||
*
|
||||
SUBT16
|
||||
*
|
||||
PLA
|
||||
STA RETADR
|
||||
PLA
|
||||
STA RETADR+1
|
||||
PLA
|
||||
STA :SUBT
|
||||
PLA
|
||||
STA :SUBT+1
|
||||
PLA
|
||||
STA :MINU
|
||||
PLA
|
||||
STA :MINU+1
|
||||
LDA :MINU
|
||||
SEC
|
||||
SBC :SUBT
|
||||
TAY
|
||||
STY RETURN
|
||||
LDA :MINU+1
|
||||
SBC :SUBT+1
|
||||
TAX
|
||||
STX RETURN+1
|
||||
LDA #2
|
||||
STA RETLEN
|
||||
LDA RETADR+1
|
||||
PHA
|
||||
LDA RETADR
|
||||
PHA
|
||||
RTS
|
||||
:MINU DS 2
|
||||
:SUBT DS 2
|
Loading…
x
Reference in New Issue
Block a user