2019-01-06 23:08:25 -05:00

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