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:
nathanriggs 2018-12-21 16:47:01 -05:00
parent 64a7923a78
commit 1b182844cc
32 changed files with 9426 additions and 3101 deletions

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View 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
*

View 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

View 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
*

View 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

View 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
*

View 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

View 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
*

View 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

View File

@ -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
*

View File

@ -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
*

View File

@ -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
*
<<<

View File

@ -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 *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*

View 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

View File

@ -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

View 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

View 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
*

View 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

View 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
*

View 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

View 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
*

View 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

View 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
*

View 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

View 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
*

View 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

View 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
*

View 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
*

View 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
<<<
*

View 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
*

View 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