mirror of
https://github.com/nathanriggs/AppleIIAsm-Collection.git
synced 2025-02-22 10:29:01 +00:00
Disk 4: MATH 0.3.0 updates
- separated each subroutine into own file - minor changes to comments - not too many changes for 0.3.0, really. Major changes for this disk will come with 0.5.0
This commit is contained in:
parent
ad58479739
commit
d99c32fdda
BIN
bin/d4_math.dsk
BIN
bin/d4_math.dsk
Binary file not shown.
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
30
disks/disk4_math/MINIFY
Normal file
30
disks/disk4_math/MINIFY
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
5 HOME
|
||||||
|
8 ONERR GOTO 1000
|
||||||
|
10 PRINT "ASSEMBLY CODE MINIFIER"
|
||||||
|
20 PRINT "-=-=-=-=-=-=-=-=-=-=-="
|
||||||
|
30 PRINT
|
||||||
|
35 DIM FC$(1000):C = 0
|
||||||
|
40 INPUT "ENTER THE SOURCE FILE NAME: ";FF$
|
||||||
|
50 INPUT "ENTER THE DESTINATION FILE NAME: ";DD$
|
||||||
|
55 PRINT "WORKING.."
|
||||||
|
60 PRINT CHR$ (4);"OPEN ";FF$
|
||||||
|
70 PRINT CHR$ (4);"READ ";FF$
|
||||||
|
80 GET AA$
|
||||||
|
85 REM ? CHR$ (34);".";
|
||||||
|
90 IF AA$ = CHR$ (13) THEN GOTO 200
|
||||||
|
95 S$ = S$ + AA$
|
||||||
|
110 GOTO 80
|
||||||
|
200 IF LEFT$ (S$,1) = "*" OR LEFT$ (S$,1) = ";" THEN S$ = ""
|
||||||
|
500 FC$(C) = S$
|
||||||
|
510 S$ = ""
|
||||||
|
520 C = C + 1
|
||||||
|
990 GOTO 80
|
||||||
|
1000 PRINT : PRINT CHR$ (4);"CLOSE ";FF$
|
||||||
|
1010 PRINT CHR$ (4);"OPEN ";DD$
|
||||||
|
1020 PRINT CHR$ (4);"WRITE ";DD$
|
||||||
|
1030 FOR Z = 0 TO C
|
||||||
|
1040 IF FC$(Z) < > "" THEN PRINT FC$(Z)
|
||||||
|
1050 NEXT Z
|
||||||
|
1060 PRINT CHR$ (4);"CLOSE ";DD$
|
||||||
|
1070 PRINT "DONE!": PRINT : PRINT : PRINT
|
||||||
|
1080 PRINT CHR$ (7): PRINT CHR$ (7): PRINT CHR$ (7)
|
@ -1,4 +1,3 @@
|
|||||||
*
|
|
||||||
*``````````````````````````````*
|
*``````````````````````````````*
|
||||||
* ADDIT16 :: ADD 16-BIT VALUES *
|
* ADDIT16 :: ADD 16-BIT VALUES *
|
||||||
*- -*
|
*- -*
|
@ -1,6 +1,4 @@
|
|||||||
*
|
|
||||||
ADDIT16
|
ADDIT16
|
||||||
*
|
|
||||||
PLA
|
PLA
|
||||||
STA RETADR
|
STA RETADR
|
||||||
PLA
|
PLA
|
||||||
@ -16,11 +14,11 @@ ADDIT16
|
|||||||
LDA :ADD1
|
LDA :ADD1
|
||||||
CLC
|
CLC
|
||||||
ADC :ADD2
|
ADC :ADD2
|
||||||
TAY
|
TAY ; LOW BYTE
|
||||||
STY RETURN
|
STY RETURN
|
||||||
LDA :ADD1+1
|
LDA :ADD1+1
|
||||||
ADC :ADD2+1
|
ADC :ADD2+1
|
||||||
TAX
|
TAX ; HIGH BYTE
|
||||||
STX RETURN+1
|
STX RETURN+1
|
||||||
LDA #2
|
LDA #2
|
||||||
STA RETLEN
|
STA RETLEN
|
@ -1,38 +0,0 @@
|
|||||||
*
|
|
||||||
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
|
|
@ -1,4 +1,3 @@
|
|||||||
*
|
|
||||||
*``````````````````````````````*
|
*``````````````````````````````*
|
||||||
* COMP16 :: 16-BIT COMPARE *
|
* COMP16 :: 16-BIT COMPARE *
|
||||||
*- -*
|
*- -*
|
37
disks/disk4_math/T.COMP16.SUB.MIN
Normal file
37
disks/disk4_math/T.COMP16.SUB.MIN
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
COMP16
|
||||||
|
PLA
|
||||||
|
STA RETADR
|
||||||
|
PLA
|
||||||
|
STA RETADR+1
|
||||||
|
PLA
|
||||||
|
STA :SUBT ; SUBTRAHEND
|
||||||
|
PLA
|
||||||
|
STA :SUBT+1
|
||||||
|
PLA
|
||||||
|
STA :MINU ; MINUEND
|
||||||
|
PLA
|
||||||
|
STA :MINU+1
|
||||||
|
LDA RETADR+1
|
||||||
|
PHA
|
||||||
|
LDA RETADR
|
||||||
|
PHA
|
||||||
|
LDA :MINU
|
||||||
|
CMP :SUBT ; COMPARE LOW BYTES
|
||||||
|
BEQ :EQUAL
|
||||||
|
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
|
||||||
|
RTS ; EXIT
|
||||||
|
:EQUAL
|
||||||
|
LDA :MINU+1
|
||||||
|
SBC :SUBT+1 ; UPPER BYTES
|
||||||
|
BVS :OVFLOW
|
||||||
|
RTS ; RETURN W FLAGS SET
|
||||||
|
:OVFLOW
|
||||||
|
EOR #$80 ; COMPLEMENT N FLAG
|
||||||
|
ORA #1 ; IF OVERFLOW THEN THE
|
||||||
|
RTS
|
||||||
|
:MINU DS 2
|
||||||
|
:SUBT DS 2
|
@ -1,20 +0,0 @@
|
|||||||
*``````````````````````````````*
|
|
||||||
* DECLARATIONS.PUT *
|
|
||||||
*- -*
|
|
||||||
* USED IN CONJUNCTION WITH *
|
|
||||||
* OTHER PUT FILES. DEFINES *
|
|
||||||
* BASIC DECLARATIONS USED *
|
|
||||||
* ACROSS DIFFERENT ROUTINES *
|
|
||||||
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
|
||||||
*
|
|
||||||
REENTRY EQU $03D0
|
|
||||||
SMALLASM EQU $300 ; STADDR FOR SMALL PROGRAMS
|
|
||||||
*
|
|
||||||
ADDR1 EQU $06
|
|
||||||
ADDR2 EQU $08
|
|
||||||
ADDR3 EQU $EB
|
|
||||||
ADDR4 EQU $ED
|
|
||||||
ADDR5 EQU $FA
|
|
||||||
ADDR6 EQU $FC
|
|
||||||
ADDR7 EQU $FE
|
|
||||||
*
|
|
@ -1,4 +1,3 @@
|
|||||||
*
|
|
||||||
*``````````````````````````````*
|
*``````````````````````````````*
|
||||||
* 16-BIT DIVISION: *
|
* 16-BIT DIVISION: *
|
||||||
* *
|
* *
|
@ -1,4 +1,3 @@
|
|||||||
*
|
|
||||||
UDIVD16
|
UDIVD16
|
||||||
LDA #0
|
LDA #0
|
||||||
BEQ UDIVMD
|
BEQ UDIVMD
|
||||||
@ -19,17 +18,17 @@ UDIVMD
|
|||||||
PLA
|
PLA
|
||||||
STA _DVEND+1
|
STA _DVEND+1
|
||||||
JSR UDIV
|
JSR UDIV
|
||||||
BCC DIVOK
|
BCC DIVOK ; BR IF NO ERR
|
||||||
DIVERR JMP EREXIT
|
DIVERR JMP EREXIT
|
||||||
DIVOK JMP OKEXIT
|
DIVOK JMP OKEXIT
|
||||||
SDIVD16
|
SDIVD16
|
||||||
LDA #0
|
LDA #0 ; RESULT IS QUOTIENT
|
||||||
BEQ SDIVMD
|
BEQ SDIVMD ; (INDEX=0)
|
||||||
SREMD16
|
SREMD16
|
||||||
LDA #2
|
LDA #2 ; RES = REMAINDER (I=2)
|
||||||
BNE SDIVMD
|
BNE SDIVMD
|
||||||
SDIVMD
|
SDIVMD
|
||||||
STA _RSLTI
|
STA _RSLTI ;RESULT INDEX;0=Q,2=R
|
||||||
PLA
|
PLA
|
||||||
STA RETADR
|
STA RETADR
|
||||||
PLA
|
PLA
|
||||||
@ -48,8 +47,8 @@ SDIVMD
|
|||||||
LDA _DVEND+1
|
LDA _DVEND+1
|
||||||
STA _SREMD
|
STA _SREMD
|
||||||
LDA _DVSOR+1
|
LDA _DVSOR+1
|
||||||
BPL CHKDE
|
BPL CHKDE ; BR IF ALREADY POS
|
||||||
LDA #0
|
LDA #0 ; SUB DVSOR FROM ZERO
|
||||||
SEC
|
SEC
|
||||||
SBC _DVSOR
|
SBC _DVSOR
|
||||||
STA _DVSOR
|
STA _DVSOR
|
||||||
@ -58,8 +57,8 @@ SDIVMD
|
|||||||
STA _DVSOR+1
|
STA _DVSOR+1
|
||||||
CHKDE
|
CHKDE
|
||||||
LDA _DVEND+1
|
LDA _DVEND+1
|
||||||
BPL DODIV
|
BPL DODIV ; BR IF DVEND IS POS
|
||||||
LDA #0
|
LDA #0 ; SUB DVEND FROM ZERO
|
||||||
SEC
|
SEC
|
||||||
SBC _DVEND
|
SBC _DVEND
|
||||||
STA _DVEND
|
STA _DVEND
|
||||||
@ -68,9 +67,9 @@ CHKDE
|
|||||||
STA _DVEND+1
|
STA _DVEND+1
|
||||||
DODIV
|
DODIV
|
||||||
JSR UDIV
|
JSR UDIV
|
||||||
BCS EREXIT
|
BCS EREXIT ; EXIT IF DIV BY 0
|
||||||
LDA _SQUOT
|
LDA _SQUOT
|
||||||
BPL DOREM
|
BPL DOREM ; BR IF Q IS POS
|
||||||
LDA #0
|
LDA #0
|
||||||
SEC
|
SEC
|
||||||
SBC _DVEND
|
SBC _DVEND
|
||||||
@ -80,7 +79,7 @@ DODIV
|
|||||||
STA _DVEND+1
|
STA _DVEND+1
|
||||||
DOREM
|
DOREM
|
||||||
LDA _SREMD
|
LDA _SREMD
|
||||||
BPL OKEXIT
|
BPL OKEXIT ; BR IF REM IS POS
|
||||||
LDA #0
|
LDA #0
|
||||||
SEC
|
SEC
|
||||||
SBC _DVEND+2
|
SBC _DVEND+2
|
||||||
@ -92,19 +91,19 @@ DOREM
|
|||||||
EREXIT
|
EREXIT
|
||||||
LDA #0
|
LDA #0
|
||||||
STA _DVEND
|
STA _DVEND
|
||||||
STA _DVEND+1
|
STA _DVEND+1 ;QUOTIENT = 0
|
||||||
STA _DVEND+2
|
STA _DVEND+2
|
||||||
STA _DVEND+3
|
STA _DVEND+3 ; REMAINDER=0
|
||||||
STA RETURN
|
STA RETURN
|
||||||
STA RETURN+1
|
STA RETURN+1
|
||||||
LDA #2
|
LDA #2
|
||||||
STA RETLEN
|
STA RETLEN
|
||||||
SEC
|
SEC ; CARRY=1 IF ERROR
|
||||||
BCS DVEXIT
|
BCS DVEXIT
|
||||||
OKEXIT
|
OKEXIT
|
||||||
CLC
|
CLC ; CARRY = 0, NO ERRORS
|
||||||
DVEXIT
|
DVEXIT
|
||||||
LDX _RSLTI
|
LDX _RSLTI ;GET INDEX TO RESULT
|
||||||
LDA _DVEND,X
|
LDA _DVEND,X
|
||||||
TAY
|
TAY
|
||||||
LDA _DVEND+1,X
|
LDA _DVEND+1,X
|
||||||
@ -117,7 +116,6 @@ DVEXIT
|
|||||||
PHA
|
PHA
|
||||||
LDA RETADR
|
LDA RETADR
|
||||||
PHA
|
PHA
|
||||||
*
|
|
||||||
RTS
|
RTS
|
||||||
UDIV
|
UDIV
|
||||||
LDA #0
|
LDA #0
|
||||||
@ -125,35 +123,36 @@ UDIV
|
|||||||
STA _DVEND+3
|
STA _DVEND+3
|
||||||
LDA _DVSOR
|
LDA _DVSOR
|
||||||
ORA _DVSOR+1
|
ORA _DVSOR+1
|
||||||
BNE OKUDIV
|
BNE OKUDIV ; BR IF DVSOR NOT 0
|
||||||
SEC
|
SEC
|
||||||
RTS
|
RTS
|
||||||
OKUDIV
|
OKUDIV
|
||||||
LDX #16
|
LDX #16 ; LOOP THROUGH 16 BITS
|
||||||
DIVLP
|
DIVLP
|
||||||
ROL _DVEND
|
ROL _DVEND ;SHFT CARRY INTO BIT 0 OF DVEND
|
||||||
ROL _DVEND+1
|
ROL _DVEND+1 ;WHICH WILL BE THE QUOTIENT AND
|
||||||
ROL _DVEND+2
|
ROL _DVEND+2 ;SHFT DVEND AT THE SAME TIME
|
||||||
ROL _DVEND+3
|
ROL _DVEND+3
|
||||||
CHKLT
|
CHKLT
|
||||||
SEC
|
SEC
|
||||||
LDA _DVEND+2
|
LDA _DVEND+2
|
||||||
SBC _DVSOR
|
SBC _DVSOR
|
||||||
TAY
|
TAY ; SAVE LOW BYTE IN Y
|
||||||
LDA _DVEND+3
|
LDA _DVEND+3
|
||||||
SBC _DVSOR+1
|
SBC _DVSOR+1 ;SUB HIGHBYTES W RES IN A
|
||||||
BCC DECCNT
|
BCC DECCNT ; BR IF DVEND < DVSOR AND CARRY
|
||||||
STY _DVEND+2
|
STY _DVEND+2 ; ELSE
|
||||||
STA _DVEND+3
|
STA _DVEND+3 ;VEN(1)=DVEND(1)-DVSOR
|
||||||
DECCNT
|
DECCNT
|
||||||
DEX
|
DEX
|
||||||
BNE DIVLP
|
BNE DIVLP
|
||||||
ROL _DVEND
|
ROL _DVEND ;SHFT IN LAST CAR FOR QUOT
|
||||||
ROL _DVEND+1
|
ROL _DVEND+1
|
||||||
CLC
|
CLC ; NO ERRORS, CLEAR CARRY
|
||||||
RTS
|
RTS
|
||||||
_DVSOR DS 2
|
_DVSOR DS 2 ; DIVISOR
|
||||||
_DVEND DS 4
|
_DVEND DS 4 ; DIVIDEND[0] AND QUOTIENT
|
||||||
_SQUOT DS 1
|
; DIVIDEND[1] AND REMAINDER
|
||||||
_SREMD DS 1
|
_SQUOT DS 1 ; SIGN OF QUOTIENT
|
||||||
_RSLTI DS 1
|
_SREMD DS 1 ; SIGN OF REMAINDER
|
||||||
|
_RSLTI DS 1 ; RESULT INDEX
|
@ -1,4 +1,3 @@
|
|||||||
*
|
|
||||||
*``````````````````````````````*
|
*``````````````````````````````*
|
||||||
* DIVD8 :: 8BIT DIVISION (8BR) *
|
* DIVD8 :: 8BIT DIVISION (8BR) *
|
||||||
*- -*
|
*- -*
|
@ -1,5 +1,4 @@
|
|||||||
DIVD8
|
DIVD8
|
||||||
*
|
|
||||||
PLA
|
PLA
|
||||||
STA RETADR
|
STA RETADR
|
||||||
PLA
|
PLA
|
||||||
@ -23,8 +22,8 @@ DIVD8
|
|||||||
PHA
|
PHA
|
||||||
LDA RETADR
|
LDA RETADR
|
||||||
PHA
|
PHA
|
||||||
LDY :REM
|
LDY :REM ; REMAINDER TO Y
|
||||||
LDA #1
|
LDA #1
|
||||||
STA RETLEN
|
STA RETLEN
|
||||||
LDA :DVSOR
|
LDA :DVSOR
|
||||||
STA RETURN
|
STA RETURN
|
@ -3,9 +3,9 @@
|
|||||||
* *
|
* *
|
||||||
* -< MATH DEMO >- *
|
* -< MATH DEMO >- *
|
||||||
* *
|
* *
|
||||||
* VERSION 00.02.00 *
|
* VERSION 00.03.00 *
|
||||||
* *
|
* *
|
||||||
* 12-DEC-2018 *
|
* 20-JAN-2018 *
|
||||||
* *
|
* *
|
||||||
********************************
|
********************************
|
||||||
* *
|
* *
|
||||||
@ -18,6 +18,7 @@
|
|||||||
*
|
*
|
||||||
CYC AVE
|
CYC AVE
|
||||||
EXP ONLY
|
EXP ONLY
|
||||||
|
TR ON
|
||||||
DSK MATH.DEMO
|
DSK MATH.DEMO
|
||||||
OBJ $BFE0
|
OBJ $BFE0
|
||||||
ORG $6000
|
ORG $6000
|
||||||
@ -26,10 +27,11 @@
|
|||||||
* TOP INCLUDES (HOOKS,MACROS) *
|
* TOP INCLUDES (HOOKS,MACROS) *
|
||||||
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
||||||
*
|
*
|
||||||
|
PUT REQUIRED.VARS
|
||||||
|
PUT REQUIRED.HOOKS.MIN
|
||||||
|
USE REQUIRED.MAC.MIN
|
||||||
PUT MATH.HOOKS
|
PUT MATH.HOOKS
|
||||||
USE MATH.MAC
|
USE MATH.MAC.MIN
|
||||||
PUT REQUIRED.HOOKS
|
|
||||||
USE REQUIRED.MAC
|
|
||||||
*
|
*
|
||||||
*``````````````````````````````*
|
*``````````````````````````````*
|
||||||
* PROGRAM MAIN BODY *
|
* PROGRAM MAIN BODY *
|
||||||
@ -222,7 +224,7 @@
|
|||||||
_PRNT "00 01 02 03 04 05",8D8D8D
|
_PRNT "00 01 02 03 04 05",8D8D8D
|
||||||
LDA #$84 ; = $80 + EXPONENT; -1 = $79
|
LDA #$84 ; = $80 + EXPONENT; -1 = $79
|
||||||
STA $300
|
STA $300
|
||||||
LDA #A0 ; MANTISSA
|
LDA #$A0 ; MANTISSA
|
||||||
STA $301 ; STORED MOST SIGNIFICANT
|
STA $301 ; STORED MOST SIGNIFICANT
|
||||||
LDA #00
|
LDA #00
|
||||||
STA $302
|
STA $302
|
||||||
@ -273,7 +275,23 @@
|
|||||||
*
|
*
|
||||||
** BOTTOM INCLUDES
|
** BOTTOM INCLUDES
|
||||||
*
|
*
|
||||||
PUT MATH8.LIB
|
PUT REQUIRED.LIB.MIN
|
||||||
PUT MATH16.LIB
|
*
|
||||||
PUT REQUIRED.LIB
|
** INDIVIDUAL SUBROUTINE INCLUDES
|
||||||
|
*
|
||||||
|
** 8-BIT MATH SUBROUTINES
|
||||||
|
*
|
||||||
|
PUT MULT8.SUB.MIN
|
||||||
|
PUT DIVD8.SUB.MIN
|
||||||
|
PUT RAND8.SUB.MIN
|
||||||
|
PUT RANDB.SUB.MIN
|
||||||
|
*
|
||||||
|
** 16-BIT MATH SUBROUTINES
|
||||||
|
*
|
||||||
|
PUT ADDIT16.SUB.MIN
|
||||||
|
PUT SUBT16.SUB.MIN
|
||||||
|
PUT COMP16.SUB.MIN
|
||||||
|
PUT MULT16.SUB.MIN
|
||||||
|
PUT DIVD16.SUB.MIN
|
||||||
|
PUT RAND16.SUB.MIN
|
||||||
*
|
*
|
||||||
|
@ -6,8 +6,8 @@
|
|||||||
* CONTACT: NATHAN.RIGGS@ *
|
* CONTACT: NATHAN.RIGGS@ *
|
||||||
* OUTLOOK.COM *
|
* OUTLOOK.COM *
|
||||||
* *
|
* *
|
||||||
* VERSION: 0.2.0 *
|
* VERSION: 0.3.0 *
|
||||||
* DATE: 12-DEC-2018 *
|
* DATE: 20-JAN-2019 *
|
||||||
* ASSEMBLER: MERLIN 8 PRO *
|
* ASSEMBLER: MERLIN 8 PRO *
|
||||||
* LICENSE: APACHE 2.0 *
|
* LICENSE: APACHE 2.0 *
|
||||||
* OS: DOS 3.3 *
|
* OS: DOS 3.3 *
|
||||||
|
78
disks/disk4_math/T.MATH.MAC.MIN
Normal file
78
disks/disk4_math/T.MATH.MAC.MIN
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
ADD16 MAC
|
||||||
|
_ISLIT ]1
|
||||||
|
_ISLIT ]2
|
||||||
|
JSR ADDIT16
|
||||||
|
<<<
|
||||||
|
SUB16 MAC
|
||||||
|
_ISLIT ]1
|
||||||
|
_ISLIT ]2
|
||||||
|
JSR SUBT16
|
||||||
|
<<<
|
||||||
|
MUL16 MAC
|
||||||
|
_ISLIT ]1
|
||||||
|
_ISLIT ]2
|
||||||
|
JSR MULT16
|
||||||
|
<<<
|
||||||
|
DIV16 MAC
|
||||||
|
_ISLIT ]1
|
||||||
|
_ISLIT ]2
|
||||||
|
IF S,]3 ; SIGNED
|
||||||
|
JSR SDIVD16
|
||||||
|
ELSE
|
||||||
|
JSR UDIVD16 ; UNSIGNED
|
||||||
|
FIN
|
||||||
|
<<<
|
||||||
|
REM16 MAC
|
||||||
|
_ISLIT ]1
|
||||||
|
_ISLIT ]2
|
||||||
|
IF S,]3 ; SIGNED
|
||||||
|
JSR SREMD16
|
||||||
|
ELSE
|
||||||
|
JSR UREMD16 ; UNSIGNED
|
||||||
|
FIN
|
||||||
|
<<<
|
||||||
|
RNDB MAC
|
||||||
|
LDA ]1 ; LOW
|
||||||
|
PHA
|
||||||
|
LDA ]2 ; HIGH
|
||||||
|
PHA
|
||||||
|
JSR RANDB
|
||||||
|
<<<
|
||||||
|
CMP16 MAC
|
||||||
|
_ISLIT ]1
|
||||||
|
_ISLIT ]2
|
||||||
|
JSR COMP16
|
||||||
|
<<<
|
||||||
|
MUL8 MAC
|
||||||
|
LDA ]1
|
||||||
|
PHA
|
||||||
|
LDA ]2
|
||||||
|
PHA
|
||||||
|
JSR MULT8
|
||||||
|
<<<
|
||||||
|
DIV8 MAC
|
||||||
|
LDA ]1
|
||||||
|
PHA
|
||||||
|
LDA ]2
|
||||||
|
PHA
|
||||||
|
JSR DIVD8
|
||||||
|
<<<
|
||||||
|
RND16 MAC
|
||||||
|
JSR RAND16
|
||||||
|
<<<
|
||||||
|
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
|
||||||
|
<<<
|
@ -1,108 +0,0 @@
|
|||||||
*
|
|
||||||
*``````````````````````````````*
|
|
||||||
* ADD16 :: ADD 16-BIT VALUES *
|
|
||||||
*- -*
|
|
||||||
* ADDS TWO SIXTEEN BIT VALUES *
|
|
||||||
* AND RETURNS A 16 BIT VALUE *
|
|
||||||
* IN Y (LOW) AND X (HIGH). *
|
|
||||||
*- -*
|
|
||||||
* CLOBBERS: *
|
|
||||||
* *
|
|
||||||
* FLAGS: ????---- REG: AXYM *
|
|
||||||
*- -*
|
|
||||||
* CYCLES: ??? *
|
|
||||||
* SIZE: *
|
|
||||||
*- -*
|
|
||||||
* USAGE: *
|
|
||||||
* *
|
|
||||||
* LDA #>1000 *
|
|
||||||
* PHA *
|
|
||||||
* LDA #<1000 *
|
|
||||||
* PHA *
|
|
||||||
* LDA #>1200 ; ADD2 *
|
|
||||||
* PHA *
|
|
||||||
* LDA #<1200 *
|
|
||||||
* PHA *
|
|
||||||
* JSR ADD16 *
|
|
||||||
*- -*
|
|
||||||
* 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 *
|
|
||||||
*- -*
|
|
||||||
* 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. *
|
|
||||||
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
|
||||||
*
|
|
||||||
ADD16
|
|
||||||
*
|
|
||||||
** 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
|
|
||||||
LDA :ADD1+1
|
|
||||||
ADC :ADD2+1
|
|
||||||
TAX ; HIGH BYTE
|
|
||||||
*
|
|
||||||
** RESTORE RETURN ADDRESS
|
|
||||||
*
|
|
||||||
LDA :RETADR+1
|
|
||||||
PHA
|
|
||||||
LDA :RETADR
|
|
||||||
PHA
|
|
||||||
*
|
|
||||||
RTS
|
|
||||||
*
|
|
||||||
** DATA
|
|
||||||
*
|
|
||||||
:RETADR DS 2
|
|
||||||
:ADD1 DS 2
|
|
||||||
:ADD2 DS 2
|
|
@ -1,144 +0,0 @@
|
|||||||
*
|
|
||||||
*``````````````````````````````*
|
|
||||||
* CMP16 :: 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, 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. *
|
|
||||||
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
|
||||||
*
|
|
||||||
CMP16
|
|
||||||
*
|
|
||||||
** 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
|
|
||||||
:RETADR DS 2
|
|
@ -1,335 +0,0 @@
|
|||||||
*
|
|
||||||
*``````````````````````````````*
|
|
||||||
* 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 ; DIVIDND *
|
|
||||||
* 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 *
|
|
||||||
*- -*
|
|
||||||
* 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. *
|
|
||||||
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
|
||||||
*
|
|
||||||
UDIV16
|
|
||||||
LDA #0
|
|
||||||
BEQ UDIVMD
|
|
||||||
UREM16
|
|
||||||
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
|
|
||||||
*
|
|
||||||
SDIV16
|
|
||||||
LDA #0 ; RESULT IS QUOTIENT
|
|
||||||
BEQ SDIVMD ; (INDEX=0)
|
|
||||||
*
|
|
||||||
** SIGNED REMAINDER
|
|
||||||
*
|
|
||||||
SREM16
|
|
||||||
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
|
|
||||||
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 IN STACK
|
|
||||||
*
|
|
||||||
LDA _DVEND,X
|
|
||||||
TAY
|
|
||||||
LDA _DVEND+1,X
|
|
||||||
TAX
|
|
||||||
*
|
|
||||||
** RESTORE RETURN ADDRESS
|
|
||||||
*
|
|
||||||
LDA _RETADR+1
|
|
||||||
PHA
|
|
||||||
LDA _RETADR
|
|
||||||
PHA
|
|
||||||
*
|
|
||||||
RTS
|
|
||||||
*
|
|
||||||
*
|
|
||||||
********************************
|
|
||||||
* UDIVE 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
|
|
||||||
*
|
|
||||||
** 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
|
|
@ -1,951 +0,0 @@
|
|||||||
*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*
|
|
||||||
* *
|
|
||||||
* MATH.LIB *
|
|
||||||
* *
|
|
||||||
* AUTHOR: NATHAN RIGGS *
|
|
||||||
* CONTACT: NATHAN.RIGGS@ *
|
|
||||||
* OUTLOOK.COM *
|
|
||||||
* *
|
|
||||||
* VERSION: 0.2.0 *
|
|
||||||
* DATE: 12-DEC-2018 *
|
|
||||||
* ASSEMBLER: MERLIN 8 PRO *
|
|
||||||
* OS: DOS 3.3 *
|
|
||||||
* LICENSE: APACHE 2.0 *
|
|
||||||
* *
|
|
||||||
* STANDARD INTEGER MATH *
|
|
||||||
* LIBRARY FOR 16-BIT VALUES, *
|
|
||||||
* SIGNED OR UNSIGNED, AS WELL *
|
|
||||||
* AS 16-BIT PRNG ROUTINES. *
|
|
||||||
* *
|
|
||||||
*------------------------------*
|
|
||||||
* *
|
|
||||||
* LIST OF ROUTINES *
|
|
||||||
* *
|
|
||||||
* 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 *
|
|
||||||
* *
|
|
||||||
*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*
|
|
||||||
*
|
|
||||||
*``````````````````````````````*
|
|
||||||
* 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
|
|
||||||
*
|
|
||||||
*``````````````````````````````*
|
|
||||||
* 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
|
|
||||||
*
|
|
||||||
*``````````````````````````````*
|
|
||||||
* 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
|
|
||||||
*
|
|
||||||
*``````````````````````````````*
|
|
||||||
* 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
|
|
||||||
*
|
|
||||||
*``````````````````````````````*
|
|
||||||
* 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
|
|
||||||
*
|
|
||||||
*``````````````````````````````*
|
|
||||||
* 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
|
|
||||||
*
|
|
||||||
*``````````````````````````````*
|
|
||||||
* RANDW :: RANDOM WORD *
|
|
||||||
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
|
||||||
*
|
|
||||||
*
|
|
||||||
** THIS WILL BE INCLUDED IN FUTURE UPDATES
|
|
||||||
*
|
|
||||||
*
|
|
@ -1,357 +0,0 @@
|
|||||||
*
|
|
||||||
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,164 +0,0 @@
|
|||||||
*
|
|
||||||
*``````````````````````````````*
|
|
||||||
* MUL16 :: 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 *
|
|
||||||
* RETURN FALSE RESULTS IF ONE *
|
|
||||||
* OF THE PARAMETERS HAD BEEN *
|
|
||||||
* SIGNED. THIS, 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 *
|
|
||||||
*- -*
|
|
||||||
* 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
|
|
||||||
*
|
|
||||||
** 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
|
|
||||||
LDA :MLIER
|
|
||||||
TAY
|
|
||||||
*
|
|
||||||
** RESTORE RETURN ADDRESS
|
|
||||||
*
|
|
||||||
LDA :RETADR+1
|
|
||||||
PHA
|
|
||||||
LDA :RETADR
|
|
||||||
PHA
|
|
||||||
*
|
|
||||||
LDA :HPROD ;24BIT
|
|
||||||
RTS
|
|
||||||
*
|
|
||||||
** DATA
|
|
||||||
*
|
|
||||||
:MCAND DS 3
|
|
||||||
:MLIER DS 3
|
|
||||||
:HPROD DS 2
|
|
||||||
:RETADR DS 2
|
|
@ -1,84 +0,0 @@
|
|||||||
*
|
|
||||||
*``````````````````````````````*
|
|
||||||
* RND16 : 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. I HAVE MADE SOME *
|
|
||||||
* MINOR ALTERATIONS, BUT NOT *
|
|
||||||
* NEARLY ENOUGH TO CALL IT MY *
|
|
||||||
* OWN. *
|
|
||||||
*- -*
|
|
||||||
* 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 *
|
|
||||||
*- -*
|
|
||||||
* 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 *
|
|
||||||
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
|
||||||
*
|
|
||||||
RND16
|
|
||||||
*
|
|
||||||
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
|
|
||||||
RTS
|
|
||||||
*
|
|
||||||
** DATA
|
|
||||||
*
|
|
||||||
:SEED DS 2
|
|
@ -1,110 +0,0 @@
|
|||||||
*
|
|
||||||
*``````````````````````````````*
|
|
||||||
* SUB16 :: SUBTRACT WORDS *
|
|
||||||
*- -*
|
|
||||||
* SUBTRACT ONE 16BIT NUMBER *
|
|
||||||
* FROM ANOTHER, RETURNING THE *
|
|
||||||
* RESULT IN X (HI) AND Y (LOW) *
|
|
||||||
*- -*
|
|
||||||
* CLOBBERS: *
|
|
||||||
* *
|
|
||||||
* FLAGS: ????---- REG: AXYM *
|
|
||||||
*- -*
|
|
||||||
* CYCLES: ??? *
|
|
||||||
* SIZE: *
|
|
||||||
*- -*
|
|
||||||
* USAGE: *
|
|
||||||
* *
|
|
||||||
* LDA #>1000 ; MINU *
|
|
||||||
* PHA *
|
|
||||||
* LDA #<1000 *
|
|
||||||
* PHA *
|
|
||||||
* LDA #>500 ; SUBT *
|
|
||||||
* PHA *
|
|
||||||
* LDA #<500 *
|
|
||||||
* PHA *
|
|
||||||
* JSR SUB16 *
|
|
||||||
*- -*
|
|
||||||
* 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 *
|
|
||||||
*- -*
|
|
||||||
* 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. *
|
|
||||||
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
|
||||||
*
|
|
||||||
SUB16
|
|
||||||
*
|
|
||||||
** 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
|
|
||||||
LDA :MINU+1
|
|
||||||
SBC :SUBT+1
|
|
||||||
TAX ; HIGH BYTE
|
|
||||||
*
|
|
||||||
** RESTORE REUTNR ADDRESS
|
|
||||||
*
|
|
||||||
LDA :RETADR+1
|
|
||||||
PHA
|
|
||||||
LDA :RETADR
|
|
||||||
PHA
|
|
||||||
*
|
|
||||||
RTS
|
|
||||||
*
|
|
||||||
** DATA
|
|
||||||
*
|
|
||||||
:RETADR DS 2
|
|
||||||
:MINU DS 2
|
|
||||||
:SUBT DS 2
|
|
@ -1,93 +0,0 @@
|
|||||||
*
|
|
||||||
*``````````````````````````````*
|
|
||||||
* DIV8 :: 8BIT DIVISION (8BR) *
|
|
||||||
*- -*
|
|
||||||
* DIVIDE ONE 8BIT NUMBER BY *
|
|
||||||
* ANOTHER TO GET AN 8BIT *
|
|
||||||
* RESULT. *
|
|
||||||
* *
|
|
||||||
* 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 #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 = HIGH BYTE OF PRODUCT *
|
|
||||||
* X = LOW BYTE OF PRODUCT *
|
|
||||||
* A = LOW BYTE OF PRODUCT *
|
|
||||||
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
|
||||||
*
|
|
||||||
DIV8
|
|
||||||
*
|
|
||||||
** GET RETURN ADDRESS
|
|
||||||
*
|
|
||||||
PLA
|
|
||||||
STA :RETADR
|
|
||||||
PLA
|
|
||||||
STA :RETADR+1
|
|
||||||
*
|
|
||||||
** GET PARAMETERS
|
|
||||||
*
|
|
||||||
PLA
|
|
||||||
STA :DVEND
|
|
||||||
PLA
|
|
||||||
STA :DVSOR
|
|
||||||
*
|
|
||||||
LDA #$00
|
|
||||||
LDX #8
|
|
||||||
ASL :DVSOR
|
|
||||||
:L1 ROL
|
|
||||||
CMP :DVEND
|
|
||||||
BCC :L2
|
|
||||||
SBC :DVEND
|
|
||||||
:L2 ROL :DVSOR
|
|
||||||
DEX
|
|
||||||
BNE :L1
|
|
||||||
STA :REM
|
|
||||||
*
|
|
||||||
** RESTORE RETURN ADDRESS
|
|
||||||
*
|
|
||||||
LDA :RETADR+1
|
|
||||||
PHA
|
|
||||||
LDA :RETADR
|
|
||||||
PHA
|
|
||||||
*
|
|
||||||
** LOAD QUOTIENT INTO A, REMAINDER INTO X
|
|
||||||
*
|
|
||||||
LDX :REM ; REMAINDER TO X
|
|
||||||
*
|
|
||||||
LDA :DVSOR
|
|
||||||
RTS
|
|
||||||
*
|
|
||||||
** DATA
|
|
||||||
*
|
|
||||||
:REM DS 1
|
|
||||||
:DVEND DS 1
|
|
||||||
:DVSOR DS 1
|
|
||||||
:RETADR DS 2
|
|
||||||
*
|
|
@ -1,479 +0,0 @@
|
|||||||
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
|
|
@ -1,198 +0,0 @@
|
|||||||
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
|
|
@ -1,100 +0,0 @@
|
|||||||
*
|
|
||||||
*``````````````````````````````*
|
|
||||||
* MUL8 :: 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 = HIGH BYTE OF PRODUCT *
|
|
||||||
* X = LOW BYTE OF PRODUCT *
|
|
||||||
* A = LOW BYTE OF PRODUCT *
|
|
||||||
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
|
||||||
*
|
|
||||||
MUL8
|
|
||||||
*
|
|
||||||
** GET RETURN ADDRESS
|
|
||||||
*
|
|
||||||
PLA
|
|
||||||
STA :RETADR
|
|
||||||
PLA
|
|
||||||
STA :RETADR+1
|
|
||||||
*
|
|
||||||
** GET PARAMETERS
|
|
||||||
*
|
|
||||||
PLA
|
|
||||||
STA :MUL1
|
|
||||||
PLA
|
|
||||||
STA :MUL2
|
|
||||||
*
|
|
||||||
** INIT
|
|
||||||
*
|
|
||||||
LDA #$00
|
|
||||||
TAX
|
|
||||||
STX :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
|
|
||||||
*
|
|
||||||
RTS
|
|
||||||
*
|
|
||||||
** DATA
|
|
||||||
*
|
|
||||||
:MUL1 DS 1
|
|
||||||
:MUL2 DS 1
|
|
||||||
:RETADR DS 2
|
|
||||||
:MUL1H DS 1
|
|
@ -1,151 +0,0 @@
|
|||||||
*
|
|
||||||
*``````````````````````````````*
|
|
||||||
* RANDB :: RANDOM BYTE *
|
|
||||||
*- -*
|
|
||||||
* RETURNS A RANDOM BYTE VALUE *
|
|
||||||
* BETWEEN THE HIGH AND LOW *
|
|
||||||
* BOUNDS PASSED TO ROUTINE. *
|
|
||||||
*- -*
|
|
||||||
* 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 *
|
|
||||||
*- -*
|
|
||||||
* *** 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. *
|
|
||||||
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
|
||||||
*
|
|
||||||
RANDB
|
|
||||||
*
|
|
||||||
** GET RETURN ADDRESS
|
|
||||||
*
|
|
||||||
PLA
|
|
||||||
STA :RETADR
|
|
||||||
PLA
|
|
||||||
STA :RETADR+1
|
|
||||||
*
|
|
||||||
** GET PARAMETERS
|
|
||||||
*
|
|
||||||
PLA
|
|
||||||
STA :RHB ; HIGH BOUND
|
|
||||||
PLA
|
|
||||||
STA :RLB ; LOW BOUND
|
|
||||||
*
|
|
||||||
** FORMULA: F = L + (R-((R\(H-L))*(H-L)
|
|
||||||
*
|
|
||||||
LDA :RHB
|
|
||||||
CLC
|
|
||||||
ADC #2 ; NO IDEA WHY I NEED
|
|
||||||
; THIS BUT I DO
|
|
||||||
STA :RHB
|
|
||||||
LDA :RHB ;LOAD IN HIGH RANGE
|
|
||||||
SEC
|
|
||||||
SBC :RLB ;SUBTRACT LOW RANGE
|
|
||||||
STA :RHL ;STORE HIGH - LOW HERE
|
|
||||||
JSR RND8 ; GET NUM BETWEEN 0..255
|
|
||||||
STA :R ; RANDOM 0,,255
|
|
||||||
*
|
|
||||||
** R\(H-L)
|
|
||||||
*
|
|
||||||
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
|
|
||||||
SEC
|
|
||||||
SBC :QUOT ; SUBTRACT (R/(H-L) FROM RND8
|
|
||||||
STA :QUOT ; STORE TEMP
|
|
||||||
*
|
|
||||||
** (R-(R\(H-L))*(H-L)
|
|
||||||
*
|
|
||||||
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
|
|
||||||
*
|
|
||||||
** L + EVERYTHING ELSE
|
|
||||||
*
|
|
||||||
CLC
|
|
||||||
ADC :RLB ;ADD LOW BYTE TO ALL ELSE
|
|
||||||
:FINISH
|
|
||||||
STA :RESULT ; STORE IN RESULT
|
|
||||||
LDX :RESULT+1 ; HIGH BYTE; FOR
|
|
||||||
; DEBUGGING PURPOSES
|
|
||||||
*
|
|
||||||
** RESTORE RETURN ADDRESS
|
|
||||||
*
|
|
||||||
LDA :RETADR+1
|
|
||||||
PHA
|
|
||||||
LDA :RETADR
|
|
||||||
PHA
|
|
||||||
*
|
|
||||||
LDA :RESULT ; RETURN # IN A
|
|
||||||
RTS
|
|
||||||
*
|
|
||||||
** DATA
|
|
||||||
*
|
|
||||||
:R DS 2
|
|
||||||
:RETADR DS 2
|
|
||||||
:RESULT DS 2
|
|
||||||
:RHB DS 2
|
|
||||||
:RLB DS 2
|
|
||||||
:RHL DS 2
|
|
||||||
:QUOT DS 2
|
|
@ -1,55 +0,0 @@
|
|||||||
*
|
|
||||||
*``````````````````````````````*
|
|
||||||
* RND8 :: 8-BIT RANDOM NUMBER *
|
|
||||||
*- -*
|
|
||||||
* GENERATES A PSEUDO-RANDOM *
|
|
||||||
* NUMBER BETWEEN 0..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 *
|
|
||||||
*- -*
|
|
||||||
* ENTRY: NONE *
|
|
||||||
*- -*
|
|
||||||
* EXIT *
|
|
||||||
* *
|
|
||||||
* Y = NOT AFFECTED *
|
|
||||||
* X = CLOBBERED *
|
|
||||||
* A = RANDOM NUM 0..255 *
|
|
||||||
*- -*
|
|
||||||
* NOTE: BASED ON THE PRNG *
|
|
||||||
* LISTING FOUND IN THE NESDEV *
|
|
||||||
* WIKI. *
|
|
||||||
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
|
||||||
*
|
|
||||||
RND8
|
|
||||||
*
|
|
||||||
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
|
|
||||||
CMP #0 ; RELOAD FLAGS
|
|
||||||
RTS
|
|
@ -1,4 +1,3 @@
|
|||||||
*
|
|
||||||
*``````````````````````````````*
|
*``````````````````````````````*
|
||||||
* MULT16 :: MULTIPLY WORDS *
|
* MULT16 :: MULTIPLY WORDS *
|
||||||
*- -*
|
*- -*
|
@ -1,6 +1,4 @@
|
|||||||
*
|
|
||||||
MULT16
|
MULT16
|
||||||
*
|
|
||||||
PLA
|
PLA
|
||||||
STA RETADR
|
STA RETADR
|
||||||
PLA
|
PLA
|
||||||
@ -14,29 +12,32 @@ MULT16
|
|||||||
PLA
|
PLA
|
||||||
STA :MCAND+1
|
STA :MCAND+1
|
||||||
LDA #0
|
LDA #0
|
||||||
STA :HPROD
|
STA :HPROD ; ZERO HIGH WORD
|
||||||
STA :HPROD+1
|
STA :HPROD+1
|
||||||
LDX #17
|
LDX #17 ; # OF BITS IN MPLIER
|
||||||
CLC
|
; PLUS 1. EXTRA LOOP IS
|
||||||
|
; TO MOVE LAST CARRY INTO
|
||||||
|
; THE PRODUCT.
|
||||||
|
CLC ; CLEAR CARRY FOR 1ST TIME
|
||||||
|
; THROUGH LOOP.
|
||||||
:MULLP
|
:MULLP
|
||||||
ROR :HPROD+1
|
ROR :HPROD+1
|
||||||
ROR :HPROD
|
ROR :HPROD
|
||||||
ROR :MLIER+1
|
ROR :MLIER+1
|
||||||
ROR :MLIER
|
ROR :MLIER
|
||||||
BCC :DECCNT
|
BCC :DECCNT ; BR IF NEXT BIT OF
|
||||||
CLC
|
CLC ; NEXT BIT=1 SO ADD MCAND
|
||||||
LDA :MCAND
|
LDA :MCAND
|
||||||
ADC :HPROD
|
ADC :HPROD
|
||||||
STA :HPROD
|
STA :HPROD
|
||||||
LDA :MCAND+1
|
LDA :MCAND+1
|
||||||
ADC :HPROD+1
|
ADC :HPROD+1
|
||||||
STA :HPROD+1
|
STA :HPROD+1 ; CARRY = OVERFLOW
|
||||||
:DECCNT
|
:DECCNT
|
||||||
DEX
|
DEX
|
||||||
BNE :MULLP
|
BNE :MULLP ; CONTINUE UNTIL DONE
|
||||||
|
LDY :HPROD ; LOW BYTE OF HIGH WORD
|
||||||
LDY :HPROD
|
LDX :HPROD+1 ; HIGH BYTE OF HIGH WORD
|
||||||
LDX :HPROD+1
|
|
||||||
LDA :MLIER+1
|
LDA :MLIER+1
|
||||||
TAX
|
TAX
|
||||||
STX RETURN+1
|
STX RETURN+1
|
||||||
@ -51,7 +52,7 @@ MULT16
|
|||||||
PHA
|
PHA
|
||||||
LDA RETADR
|
LDA RETADR
|
||||||
PHA
|
PHA
|
||||||
LDA :HPROD
|
LDA :HPROD ;24BIT
|
||||||
RTS
|
RTS
|
||||||
:MCAND DS 3
|
:MCAND DS 3
|
||||||
:MLIER DS 3
|
:MLIER DS 3
|
@ -1,4 +1,3 @@
|
|||||||
*
|
|
||||||
*``````````````````````````````*
|
*``````````````````````````````*
|
||||||
* MULT8 : 8BIT MULTIPLY (16BR) *
|
* MULT8 : 8BIT MULTIPLY (16BR) *
|
||||||
*- -*
|
*- -*
|
@ -1,5 +1,4 @@
|
|||||||
MULT8
|
MULT8
|
||||||
*
|
|
||||||
PLA
|
PLA
|
||||||
STA RETADR
|
STA RETADR
|
||||||
PLA
|
PLA
|
@ -1,4 +1,3 @@
|
|||||||
*
|
|
||||||
*``````````````````````````````*
|
*``````````````````````````````*
|
||||||
* RAND16 : 16BIT RANDOM NUMBER *
|
* RAND16 : 16BIT RANDOM NUMBER *
|
||||||
*- -*
|
*- -*
|
@ -1,6 +1,4 @@
|
|||||||
*
|
|
||||||
RAND16
|
RAND16
|
||||||
*
|
|
||||||
LDA RNDL
|
LDA RNDL
|
||||||
STA :SEED
|
STA :SEED
|
||||||
LDA RNDH
|
LDA RNDH
|
||||||
@ -11,7 +9,7 @@ RAND16
|
|||||||
LDA :SEED+1
|
LDA :SEED+1
|
||||||
ROL
|
ROL
|
||||||
BCC :NOEOR
|
BCC :NOEOR
|
||||||
:DOEOR
|
:DOEOR ; HIGH BYTE IN A
|
||||||
EOR #>$0369
|
EOR #>$0369
|
||||||
STA :SEED+1
|
STA :SEED+1
|
||||||
LDA :SEED
|
LDA :SEED
|
@ -1,4 +1,3 @@
|
|||||||
*
|
|
||||||
*``````````````````````````````*
|
*``````````````````````````````*
|
||||||
* RAND8 :: 8-BIT RANDOM NUMBER *
|
* RAND8 :: 8-BIT RANDOM NUMBER *
|
||||||
*- -*
|
*- -*
|
@ -1,12 +1,11 @@
|
|||||||
** RAND8
|
RAND8
|
||||||
*
|
|
||||||
LDX #8
|
LDX #8
|
||||||
LDA RNDL+0
|
LDA RNDL+0
|
||||||
:A
|
:A
|
||||||
ASL
|
ASL ;SHIFT THE REG
|
||||||
ROL RNDL+1
|
ROL RNDL+1
|
||||||
BCC :B
|
BCC :B
|
||||||
EOR #$2D
|
EOR #$2D ; APPLY XOR FEEDBACK
|
||||||
:B
|
:B
|
||||||
DEX
|
DEX
|
||||||
BNE :A
|
BNE :A
|
||||||
@ -14,5 +13,5 @@
|
|||||||
STA RETURN
|
STA RETURN
|
||||||
LDY #1
|
LDY #1
|
||||||
STY RETLEN
|
STY RETLEN
|
||||||
CMP #0
|
CMP #0 ; RELOAD FLAGS
|
||||||
RTS
|
RTS
|
@ -1,4 +1,3 @@
|
|||||||
*
|
|
||||||
*``````````````````````````````*
|
*``````````````````````````````*
|
||||||
* RANDB :: RANDOM BYTE *
|
* RANDB :: RANDOM BYTE *
|
||||||
*- -*
|
*- -*
|
||||||
@ -64,7 +63,18 @@ RANDB
|
|||||||
STA :OLDMIN
|
STA :OLDMIN
|
||||||
LDA #255
|
LDA #255
|
||||||
STA :OLDMAX
|
STA :OLDMAX
|
||||||
JSR RAND8 ; RANDOM BYTE 0..255
|
LDX #8
|
||||||
|
LDA RNDL+0
|
||||||
|
:AA
|
||||||
|
ASL
|
||||||
|
ROL RNDL+1
|
||||||
|
BCC :BB
|
||||||
|
EOR #$2D ; MAGIC NUMBER
|
||||||
|
:BB
|
||||||
|
DEX
|
||||||
|
BNE :AA
|
||||||
|
STA RNDL+0
|
||||||
|
CMP #0
|
||||||
STA :OLDVAL
|
STA :OLDVAL
|
||||||
*
|
*
|
||||||
** NEWVALUE = (((OLDVAL-NEWMIN) * (NEWMAX-NEWMIN) /
|
** NEWVALUE = (((OLDVAL-NEWMIN) * (NEWMAX-NEWMIN) /
|
@ -1,5 +1,4 @@
|
|||||||
RANDB
|
RANDB
|
||||||
*
|
|
||||||
PLA
|
PLA
|
||||||
STA RETADR
|
STA RETADR
|
||||||
PLA
|
PLA
|
||||||
@ -12,7 +11,18 @@ RANDB
|
|||||||
STA :OLDMIN
|
STA :OLDMIN
|
||||||
LDA #255
|
LDA #255
|
||||||
STA :OLDMAX
|
STA :OLDMAX
|
||||||
JSR RAND8
|
LDX #8
|
||||||
|
LDA RNDL+0
|
||||||
|
:AA
|
||||||
|
ASL
|
||||||
|
ROL RNDL+1
|
||||||
|
BCC :BB
|
||||||
|
EOR #$2D ; MAGIC NUMBER
|
||||||
|
:BB
|
||||||
|
DEX
|
||||||
|
BNE :AA
|
||||||
|
STA RNDL+0
|
||||||
|
CMP #0
|
||||||
STA :OLDVAL
|
STA :OLDVAL
|
||||||
LDA :OLDMAX
|
LDA :OLDMAX
|
||||||
SEC
|
SEC
|
@ -1,46 +0,0 @@
|
|||||||
*
|
|
||||||
*``````````````````````````````*
|
|
||||||
* 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
|
|
||||||
*
|
|
10
disks/disk4_math/T.REQUIRED.HOOKS.MIN
Normal file
10
disks/disk4_math/T.REQUIRED.HOOKS.MIN
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
ADDR1 EQU $06
|
||||||
|
ADDR2 EQU $08
|
||||||
|
ADDR3 EQU $EB
|
||||||
|
ADDR4 EQU $ED
|
||||||
|
SCRATCH EQU $19
|
||||||
|
SCRATCH2 EQU $1E
|
||||||
|
RETADR EQU $FE
|
||||||
|
RESULT EQU $FA
|
||||||
|
RESULT2 EQU $FC
|
||||||
|
REENTRY EQU $3D0
|
@ -1,235 +0,0 @@
|
|||||||
*
|
|
||||||
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
|
|
||||||
*
|
|
358
disks/disk4_math/T.REQUIRED.LIB.MIN
Normal file
358
disks/disk4_math/T.REQUIRED.LIB.MIN
Normal file
@ -0,0 +1,358 @@
|
|||||||
|
__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
|
||||||
|
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
|
||||||
|
PLA
|
||||||
|
STA :RET
|
||||||
|
PLA
|
||||||
|
STA :RET+1
|
||||||
|
PLA
|
||||||
|
STA :LENGTH
|
||||||
|
PLA
|
||||||
|
STA ADDR3
|
||||||
|
PLA
|
||||||
|
STA ADDR3+1
|
||||||
|
LDA #$8D
|
||||||
|
JSR $FDF0
|
||||||
|
LDA ADDR3+1
|
||||||
|
AND #$F0
|
||||||
|
LSR
|
||||||
|
LSR
|
||||||
|
LSR
|
||||||
|
LSR
|
||||||
|
TAX
|
||||||
|
LDA HEXTAB,X
|
||||||
|
JSR $FDF0
|
||||||
|
LDA ADDR3+1
|
||||||
|
AND #$0F
|
||||||
|
TAX
|
||||||
|
LDA HEXTAB,X
|
||||||
|
JSR $FDF0
|
||||||
|
LDA ADDR3
|
||||||
|
AND #$F0
|
||||||
|
LSR
|
||||||
|
LSR
|
||||||
|
LSR
|
||||||
|
LSR
|
||||||
|
TAX
|
||||||
|
LDA HEXTAB,X
|
||||||
|
JSR $FDF0
|
||||||
|
LDA ADDR3
|
||||||
|
AND #$0F
|
||||||
|
TAX
|
||||||
|
LDA HEXTAB,X
|
||||||
|
JSR $FDF0
|
||||||
|
LDA #186 ; :
|
||||||
|
JSR $FDF0
|
||||||
|
LDA #160 ; SPC
|
||||||
|
JSR $FDF0
|
||||||
|
LDY #0
|
||||||
|
:LP
|
||||||
|
LDA (ADDR3),Y
|
||||||
|
AND #$F0 ; MASK RIGHT
|
||||||
|
LSR
|
||||||
|
LSR
|
||||||
|
LSR
|
||||||
|
LSR
|
||||||
|
STA :LEFT
|
||||||
|
LDA (ADDR3),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 :RET+1
|
||||||
|
PHA
|
||||||
|
LDA :RET
|
||||||
|
PHA
|
||||||
|
RTS
|
||||||
|
:RET DS 2
|
||||||
|
:RIGHT DS 1
|
||||||
|
:LEFT DS 1
|
||||||
|
:LENGTH DS 1
|
||||||
|
__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
|
||||||
|
JSR $FD0C
|
||||||
|
RTS
|
||||||
|
__RSAV
|
||||||
|
STA ERRA
|
||||||
|
STX ERRX
|
||||||
|
STY ERRY
|
||||||
|
:C BCC :C0
|
||||||
|
BCS :C1
|
||||||
|
:Z BEQ :Z1
|
||||||
|
BNE :Z0
|
||||||
|
:N BMI :N1
|
||||||
|
BPL :N0
|
||||||
|
:O BVC :O0
|
||||||
|
BVS :O1
|
||||||
|
JMP :EXIT
|
||||||
|
:C0 LDA #0
|
||||||
|
STA ERRCARRY
|
||||||
|
JMP :Z
|
||||||
|
:C1 LDA #1
|
||||||
|
STA ERRCARRY
|
||||||
|
JMP :Z
|
||||||
|
:Z1 LDA #1
|
||||||
|
STA ERRZERO
|
||||||
|
JMP :N
|
||||||
|
:Z0 LDA #0
|
||||||
|
STA ERRZERO
|
||||||
|
JMP :N
|
||||||
|
:N1 LDA #1
|
||||||
|
STA ERRNEG
|
||||||
|
JMP :O
|
||||||
|
:N0 LDA #0
|
||||||
|
STA ERRNEG
|
||||||
|
JMP :O
|
||||||
|
:O0 LDA #0
|
||||||
|
STA ERROVF
|
||||||
|
JMP :EXIT
|
||||||
|
:O1 LDA #1
|
||||||
|
STA ERROVF
|
||||||
|
:EXIT
|
||||||
|
RTS
|
||||||
|
__RDMP
|
||||||
|
_PRNT " ",8D8D
|
||||||
|
_PRNT "REGISTRY DUMP",8D
|
||||||
|
_PRNT "=============",8D
|
||||||
|
_PRNT "A: "
|
||||||
|
LDA ERRA
|
||||||
|
AND #$F0 ; MASK RIGHT
|
||||||
|
LSR
|
||||||
|
LSR
|
||||||
|
LSR
|
||||||
|
LSR
|
||||||
|
STA :LEFT
|
||||||
|
LDA ERRA
|
||||||
|
AND #$0F ; MASK LEFT
|
||||||
|
STA :RIGHT
|
||||||
|
LDX :LEFT
|
||||||
|
LDA HEXTAB,X
|
||||||
|
JSR $FDF0
|
||||||
|
LDX :RIGHT
|
||||||
|
LDA HEXTAB,X
|
||||||
|
JSR $FDF0
|
||||||
|
_PRNT " ",8D
|
||||||
|
_PRNT "X: "
|
||||||
|
LDA ERRX
|
||||||
|
AND #$F0 ; MASK RIGHT
|
||||||
|
LSR
|
||||||
|
LSR
|
||||||
|
LSR
|
||||||
|
LSR
|
||||||
|
STA :LEFT
|
||||||
|
LDA ERRX
|
||||||
|
AND #$0F ; MASK LEFT
|
||||||
|
STA :RIGHT
|
||||||
|
LDX :LEFT
|
||||||
|
LDA HEXTAB,X
|
||||||
|
JSR $FDF0
|
||||||
|
LDX :RIGHT
|
||||||
|
LDA HEXTAB,X
|
||||||
|
JSR $FDF0
|
||||||
|
_PRNT " ",8D
|
||||||
|
_PRNT "Y: "
|
||||||
|
LDA ERRY
|
||||||
|
AND #$F0 ; MASK RIGHT
|
||||||
|
LSR
|
||||||
|
LSR
|
||||||
|
LSR
|
||||||
|
LSR
|
||||||
|
STA :LEFT
|
||||||
|
LDA ERRY
|
||||||
|
AND #$0F ; MASK LEFT
|
||||||
|
STA :RIGHT
|
||||||
|
LDX :LEFT
|
||||||
|
LDA HEXTAB,X
|
||||||
|
JSR $FDF0
|
||||||
|
LDX :RIGHT
|
||||||
|
LDA HEXTAB,X
|
||||||
|
JSR $FDF0
|
||||||
|
_PRNT " ",8D8D
|
||||||
|
_PRNT "STATUS FLAGS",8D
|
||||||
|
_PRNT "============",8D8D
|
||||||
|
LDA #0
|
||||||
|
CMP ERRCARRY
|
||||||
|
BEQ :CARCLR
|
||||||
|
_PRNT "CARRY: SET",8D
|
||||||
|
JMP :TESTN
|
||||||
|
:CARCLR _PRNT "CARRY: CLEAR",8D
|
||||||
|
:TESTN LDA #0
|
||||||
|
CMP ERRNEG
|
||||||
|
BEQ :NEGCLR
|
||||||
|
_PRNT "NEGATIVE: SET",8D
|
||||||
|
JMP :TESTZ
|
||||||
|
:NEGCLR _PRNT "NEGATIVE: CLEAR",8D
|
||||||
|
:TESTZ LDA #0
|
||||||
|
CMP ERRZERO
|
||||||
|
BEQ :ZCLR
|
||||||
|
_PRNT "ZERO: SET",8D
|
||||||
|
JMP :TESTO
|
||||||
|
:ZCLR _PRNT "ZERO: CLEAR",8D
|
||||||
|
:TESTO
|
||||||
|
LDA #0
|
||||||
|
CMP ERROVF
|
||||||
|
BEQ :OCLR
|
||||||
|
_PRNT "OVERFLOW: SET",8D
|
||||||
|
JMP :FIN
|
||||||
|
:OCLR _PRNT "OVERFLOW: CLEAR",8D8D8D
|
||||||
|
:FIN
|
||||||
|
RTS
|
||||||
|
:LEFT DS 1
|
||||||
|
:RIGHT DS 1
|
||||||
|
HEXTAB ASC "0123456789ABCDEF"
|
||||||
|
__ERR
|
||||||
|
JSR __RSAV
|
||||||
|
PLA
|
||||||
|
STA RETADR
|
||||||
|
PLA
|
||||||
|
STA RETADR+1
|
||||||
|
PLA
|
||||||
|
STA :DUMPLEN ; LENGTH OF DUMP
|
||||||
|
PLA
|
||||||
|
STA :DUMP ; DUMP ADDRESS LO
|
||||||
|
PLA
|
||||||
|
STA :DUMP+1 ; DUMP HI
|
||||||
|
PLA
|
||||||
|
STA :DMPMSG
|
||||||
|
PLA
|
||||||
|
STA :DMPMSG+1
|
||||||
|
PLA
|
||||||
|
STA :MESG ; ERROR MESSAGE ADDR LO
|
||||||
|
PLA
|
||||||
|
STA :MESG+1 ; HI
|
||||||
|
PLA
|
||||||
|
STA :SRID ; SUBROUTINE ID ADDR LO
|
||||||
|
PLA
|
||||||
|
STA :SRID+1 ; SUB ID HI
|
||||||
|
_PRNT " ",87878787878D8D
|
||||||
|
_PRNT "ERROR!",8D8D
|
||||||
|
_PRNT "SUBROUTINE: "
|
||||||
|
LDY #0
|
||||||
|
LDA :SRID
|
||||||
|
STA ADDR1
|
||||||
|
LDA :SRID+1
|
||||||
|
STA ADDR1+1
|
||||||
|
:LP1
|
||||||
|
LDA (ADDR1),Y
|
||||||
|
BEQ :LPX1
|
||||||
|
JSR $FDF0
|
||||||
|
INY
|
||||||
|
BNE :LP1
|
||||||
|
:LPX1
|
||||||
|
_PRNT " ",8D
|
||||||
|
_PRNT "MESSAGE: "
|
||||||
|
LDY #0
|
||||||
|
LDA :MESG
|
||||||
|
STA ADDR1
|
||||||
|
LDA :MESG+1
|
||||||
|
STA ADDR1+1
|
||||||
|
:LP2
|
||||||
|
LDA (ADDR1),Y
|
||||||
|
BEQ :LPX2
|
||||||
|
JSR $FDF0
|
||||||
|
INY
|
||||||
|
BNE :LP2
|
||||||
|
:LPX2
|
||||||
|
_PRNT " ",8D8D
|
||||||
|
_WAIT
|
||||||
|
LDY #0
|
||||||
|
LDA :DMPMSG
|
||||||
|
STA ADDR1
|
||||||
|
LDA :DMPMSG+1
|
||||||
|
STA ADDR1+1
|
||||||
|
:LP3
|
||||||
|
LDA (ADDR1),Y
|
||||||
|
BEQ :LPX3
|
||||||
|
JSR $FDF0
|
||||||
|
INY
|
||||||
|
BNE :LP3
|
||||||
|
:LPX3
|
||||||
|
_PRNT " ",8D
|
||||||
|
LDA :DUMP+1
|
||||||
|
PHA
|
||||||
|
LDA :DUMP
|
||||||
|
PHA
|
||||||
|
LDA :DUMPLEN
|
||||||
|
PHA
|
||||||
|
JSR __DUMP
|
||||||
|
_WAIT
|
||||||
|
LDA RETADR+1
|
||||||
|
PHA
|
||||||
|
LDA RETADR
|
||||||
|
PHA
|
||||||
|
_PRNT " ",8D8D
|
||||||
|
_WAIT
|
||||||
|
_RDUMP
|
||||||
|
_WAIT
|
||||||
|
LDA ERRSTOP
|
||||||
|
CMP #1
|
||||||
|
BEQ :KILL
|
||||||
|
RTS
|
||||||
|
:KILL
|
||||||
|
JMP $3D0
|
||||||
|
:DUMPLEN DS 1
|
||||||
|
:DUMP DS 2
|
||||||
|
:DMPMSG DS 2
|
||||||
|
:MESG DS 2
|
||||||
|
:SRID DS 2
|
@ -1,94 +0,0 @@
|
|||||||
********************************
|
|
||||||
* *
|
|
||||||
********************************
|
|
||||||
*
|
|
||||||
*``````````````````````````````*
|
|
||||||
* 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
|
|
||||||
<<<
|
|
||||||
*
|
|
94
disks/disk4_math/T.REQUIRED.MAC.MIN
Normal file
94
disks/disk4_math/T.REQUIRED.MAC.MIN
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
_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
|
||||||
|
<<<
|
||||||
|
_ISSTR MAC
|
||||||
|
IF "=]1 ; IF ]1 IS A STRING
|
||||||
|
JMP STRCONT
|
||||||
|
]STRTMP STR ]1
|
||||||
|
STRCONT
|
||||||
|
LDY #0
|
||||||
|
LDA ]STRTMP
|
||||||
|
STA PARLEN
|
||||||
|
STA PARAM
|
||||||
|
]STRLP1
|
||||||
|
INY
|
||||||
|
LDA ]STRTMP,Y
|
||||||
|
STA PARAM,Y
|
||||||
|
CPY PARLEN
|
||||||
|
BNE ]STRLP1
|
||||||
|
LDA #>PARAM ; GET HI
|
||||||
|
PHA
|
||||||
|
LDA #<PARAM ; GET LO
|
||||||
|
PHA
|
||||||
|
ELSE ; ]1 IS ADDRESS
|
||||||
|
LDA #>]1 ; SO GET HIBYTE OF ADDR
|
||||||
|
PHA
|
||||||
|
LDA #<]1 ; THEN LOBYTE
|
||||||
|
PHA
|
||||||
|
FIN
|
||||||
|
<<<
|
||||||
|
_GRET MAC
|
||||||
|
LDA #>]1
|
||||||
|
PHA
|
||||||
|
LDA #<]1
|
||||||
|
PHA
|
||||||
|
JSR __GETRET
|
||||||
|
<<<
|
||||||
|
_SPAR MAC
|
||||||
|
LDA #>]1
|
||||||
|
PHA
|
||||||
|
LDA #<]1
|
||||||
|
PHA
|
||||||
|
JSR __SETPARM
|
||||||
|
<<<
|
||||||
|
_DUMP MAC
|
||||||
|
LDA #>]1
|
||||||
|
PHA
|
||||||
|
LDA #<]1
|
||||||
|
PHA
|
||||||
|
LDA ]2
|
||||||
|
PHA
|
||||||
|
JSR __DUMP
|
||||||
|
<<<
|
||||||
|
_PRNT MAC
|
||||||
|
JSR __P
|
||||||
|
ASC ]1
|
||||||
|
HEX 00
|
||||||
|
<<<
|
||||||
|
_WAIT MAC
|
||||||
|
JSR __W
|
||||||
|
<<<
|
||||||
|
_RDUMP MAC
|
||||||
|
JSR __RDMP
|
||||||
|
<<<
|
||||||
|
_ERR MAC
|
||||||
|
LDA #>]1
|
||||||
|
PHA
|
||||||
|
LDA #<]1
|
||||||
|
PHA
|
||||||
|
LDA #>]2
|
||||||
|
PHA
|
||||||
|
LDA #<]2
|
||||||
|
PHA
|
||||||
|
LDA #>]3
|
||||||
|
PHA
|
||||||
|
LDA #<]3
|
||||||
|
PHA
|
||||||
|
LDA #>]4
|
||||||
|
PHA
|
||||||
|
LDA #<]4
|
||||||
|
PHA
|
||||||
|
LDA ]5
|
||||||
|
PHA
|
||||||
|
JSR __ERR
|
||||||
|
<<<
|
72
disks/disk4_math/T.REQUIRED.VARS
Normal file
72
disks/disk4_math/T.REQUIRED.VARS
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
*
|
||||||
|
********************************
|
||||||
|
* *
|
||||||
|
* VARIABLES AND SETTINGS *
|
||||||
|
* *
|
||||||
|
********************************
|
||||||
|
*
|
||||||
|
* VARIABLE DECLARATIONS ********
|
||||||
|
*
|
||||||
|
** JUMP TABLE SETUP. THIS IS FOR LOADING
|
||||||
|
** SUBROUTINES INTO MEMORY FOR ACCESS BY
|
||||||
|
** EXTERNAL EXECUTIONS. NOTE THAT THIS
|
||||||
|
** SHOULD ALWAYS BE THE VERY FIRST BIT OF
|
||||||
|
** CODE IN THE PROGRAM SO THAT ITS
|
||||||
|
** LOCATION IN MEMORY IS EASILY KNOWN.
|
||||||
|
*
|
||||||
|
JUMPTBL JMP MAIN_START ; ** ALWAYS ** START WITH
|
||||||
|
; JUMP TO MAIN_START
|
||||||
|
DS 60 ; 20 MORE ENTRIES
|
||||||
|
*
|
||||||
|
** 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
|
||||||
|
*
|
||||||
|
** ERROR HANDLING
|
||||||
|
*
|
||||||
|
ERRSTOP DS 1
|
||||||
|
ERRCTRL DS 1
|
||||||
|
ERRA DS 1
|
||||||
|
ERRX DS 1
|
||||||
|
ERRY DS 1
|
||||||
|
ERRCARRY DS 1
|
||||||
|
ERRNEG DS 1
|
||||||
|
ERRZERO DS 1
|
||||||
|
ERROVF DS 1
|
||||||
|
*
|
||||||
|
* SETTINGS *********************
|
||||||
|
*
|
||||||
|
MAIN_START
|
||||||
|
*
|
||||||
|
** ERROR HANDLING
|
||||||
|
*
|
||||||
|
** SET ERRSTOP TO 1 IF YOU WANT THE PROGRAM TO
|
||||||
|
** HALT WHEN AN ERROR IS CAUGHT
|
||||||
|
*
|
||||||
|
LDA #1
|
||||||
|
STA ERRSTOP
|
||||||
|
*
|
||||||
|
** SET ERRCTRL TO 1 IF YOU WANT ERROR CATCHING ON
|
||||||
|
** IN THE FIRST PLACE. HAVING THIS TURNED OFF WILL
|
||||||
|
** SAVE A FEW CYCLES, BUT POSSIBLY AT THE EXPENSE
|
||||||
|
** OF YOUR FRUSTRATION. CAN BE TURNED ON LATER THOUGH.
|
||||||
|
*
|
||||||
|
LDA #1
|
||||||
|
STA ERRCTRL
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
@ -1,4 +1,3 @@
|
|||||||
*
|
|
||||||
*``````````````````````````````*
|
*``````````````````````````````*
|
||||||
* SUBT16 :: SUBTRACT WORDS *
|
* SUBT16 :: SUBTRACT WORDS *
|
||||||
*- -*
|
*- -*
|
||||||
@ -99,4 +98,3 @@ SUBT16
|
|||||||
*
|
*
|
||||||
:MINU DS 2
|
:MINU DS 2
|
||||||
:SUBT DS 2
|
:SUBT DS 2
|
||||||
*
|
|
@ -1,6 +1,4 @@
|
|||||||
*
|
|
||||||
SUBT16
|
SUBT16
|
||||||
*
|
|
||||||
PLA
|
PLA
|
||||||
STA RETADR
|
STA RETADR
|
||||||
PLA
|
PLA
|
||||||
@ -8,19 +6,19 @@ SUBT16
|
|||||||
PLA
|
PLA
|
||||||
STA :SUBT
|
STA :SUBT
|
||||||
PLA
|
PLA
|
||||||
STA :SUBT+1
|
STA :SUBT+1 ; SUBTRAHEND
|
||||||
PLA
|
PLA
|
||||||
STA :MINU
|
STA :MINU
|
||||||
PLA
|
PLA
|
||||||
STA :MINU+1
|
STA :MINU+1 ; MINUEND
|
||||||
LDA :MINU
|
LDA :MINU
|
||||||
SEC
|
SEC
|
||||||
SBC :SUBT
|
SBC :SUBT
|
||||||
TAY
|
TAY ; LOW BYTE
|
||||||
STY RETURN
|
STY RETURN
|
||||||
LDA :MINU+1
|
LDA :MINU+1
|
||||||
SBC :SUBT+1
|
SBC :SUBT+1
|
||||||
TAX
|
TAX ; HIGH BYTE
|
||||||
STX RETURN+1
|
STX RETURN+1
|
||||||
LDA #2
|
LDA #2
|
||||||
STA RETLEN
|
STA RETLEN
|
Loading…
x
Reference in New Issue
Block a user