mirror of
https://github.com/nathanriggs/AppleIIAsm-Collection.git
synced 2025-02-17 09:30:26 +00:00
480 lines
11 KiB
Plaintext
480 lines
11 KiB
Plaintext
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. *
|
|
* *
|
|
*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*
|
|
*
|
|
*``````````````````````````````*
|
|
* 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
|
|
*
|
|
*``````````````````````````````*
|
|
* 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
|
|
*
|
|
*``````````````````````````````*
|
|
* 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
|
|
*
|
|
*``````````````````````````````*
|
|
* 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
|
|
*
|
|
XMATH8
|