mirror of
https://github.com/nathanriggs/AppleIIAsm-Collection.git
synced 2025-02-21 04:29:15 +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 *
|
||||
*- -*
|
@ -1,6 +1,4 @@
|
||||
*
|
||||
ADDIT16
|
||||
*
|
||||
PLA
|
||||
STA RETADR
|
||||
PLA
|
||||
@ -16,11 +14,11 @@ ADDIT16
|
||||
LDA :ADD1
|
||||
CLC
|
||||
ADC :ADD2
|
||||
TAY
|
||||
TAY ; LOW BYTE
|
||||
STY RETURN
|
||||
LDA :ADD1+1
|
||||
ADC :ADD2+1
|
||||
TAX
|
||||
TAX ; HIGH BYTE
|
||||
STX RETURN+1
|
||||
LDA #2
|
||||
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 *
|
||||
*- -*
|
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: *
|
||||
* *
|
@ -1,4 +1,3 @@
|
||||
*
|
||||
UDIVD16
|
||||
LDA #0
|
||||
BEQ UDIVMD
|
||||
@ -19,17 +18,17 @@ UDIVMD
|
||||
PLA
|
||||
STA _DVEND+1
|
||||
JSR UDIV
|
||||
BCC DIVOK
|
||||
BCC DIVOK ; BR IF NO ERR
|
||||
DIVERR JMP EREXIT
|
||||
DIVOK JMP OKEXIT
|
||||
SDIVD16
|
||||
LDA #0
|
||||
BEQ SDIVMD
|
||||
LDA #0 ; RESULT IS QUOTIENT
|
||||
BEQ SDIVMD ; (INDEX=0)
|
||||
SREMD16
|
||||
LDA #2
|
||||
LDA #2 ; RES = REMAINDER (I=2)
|
||||
BNE SDIVMD
|
||||
SDIVMD
|
||||
STA _RSLTI
|
||||
STA _RSLTI ;RESULT INDEX;0=Q,2=R
|
||||
PLA
|
||||
STA RETADR
|
||||
PLA
|
||||
@ -48,8 +47,8 @@ SDIVMD
|
||||
LDA _DVEND+1
|
||||
STA _SREMD
|
||||
LDA _DVSOR+1
|
||||
BPL CHKDE
|
||||
LDA #0
|
||||
BPL CHKDE ; BR IF ALREADY POS
|
||||
LDA #0 ; SUB DVSOR FROM ZERO
|
||||
SEC
|
||||
SBC _DVSOR
|
||||
STA _DVSOR
|
||||
@ -58,8 +57,8 @@ SDIVMD
|
||||
STA _DVSOR+1
|
||||
CHKDE
|
||||
LDA _DVEND+1
|
||||
BPL DODIV
|
||||
LDA #0
|
||||
BPL DODIV ; BR IF DVEND IS POS
|
||||
LDA #0 ; SUB DVEND FROM ZERO
|
||||
SEC
|
||||
SBC _DVEND
|
||||
STA _DVEND
|
||||
@ -68,9 +67,9 @@ CHKDE
|
||||
STA _DVEND+1
|
||||
DODIV
|
||||
JSR UDIV
|
||||
BCS EREXIT
|
||||
BCS EREXIT ; EXIT IF DIV BY 0
|
||||
LDA _SQUOT
|
||||
BPL DOREM
|
||||
BPL DOREM ; BR IF Q IS POS
|
||||
LDA #0
|
||||
SEC
|
||||
SBC _DVEND
|
||||
@ -80,7 +79,7 @@ DODIV
|
||||
STA _DVEND+1
|
||||
DOREM
|
||||
LDA _SREMD
|
||||
BPL OKEXIT
|
||||
BPL OKEXIT ; BR IF REM IS POS
|
||||
LDA #0
|
||||
SEC
|
||||
SBC _DVEND+2
|
||||
@ -92,19 +91,19 @@ DOREM
|
||||
EREXIT
|
||||
LDA #0
|
||||
STA _DVEND
|
||||
STA _DVEND+1
|
||||
STA _DVEND+1 ;QUOTIENT = 0
|
||||
STA _DVEND+2
|
||||
STA _DVEND+3
|
||||
STA _DVEND+3 ; REMAINDER=0
|
||||
STA RETURN
|
||||
STA RETURN+1
|
||||
LDA #2
|
||||
STA RETLEN
|
||||
SEC
|
||||
SEC ; CARRY=1 IF ERROR
|
||||
BCS DVEXIT
|
||||
OKEXIT
|
||||
CLC
|
||||
CLC ; CARRY = 0, NO ERRORS
|
||||
DVEXIT
|
||||
LDX _RSLTI
|
||||
LDX _RSLTI ;GET INDEX TO RESULT
|
||||
LDA _DVEND,X
|
||||
TAY
|
||||
LDA _DVEND+1,X
|
||||
@ -117,7 +116,6 @@ DVEXIT
|
||||
PHA
|
||||
LDA RETADR
|
||||
PHA
|
||||
*
|
||||
RTS
|
||||
UDIV
|
||||
LDA #0
|
||||
@ -125,35 +123,36 @@ UDIV
|
||||
STA _DVEND+3
|
||||
LDA _DVSOR
|
||||
ORA _DVSOR+1
|
||||
BNE OKUDIV
|
||||
BNE OKUDIV ; BR IF DVSOR NOT 0
|
||||
SEC
|
||||
RTS
|
||||
OKUDIV
|
||||
LDX #16
|
||||
LDX #16 ; LOOP THROUGH 16 BITS
|
||||
DIVLP
|
||||
ROL _DVEND
|
||||
ROL _DVEND+1
|
||||
ROL _DVEND+2
|
||||
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
|
||||
TAY ; SAVE LOW BYTE IN Y
|
||||
LDA _DVEND+3
|
||||
SBC _DVSOR+1
|
||||
BCC DECCNT
|
||||
STY _DVEND+2
|
||||
STA _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
|
||||
ROL _DVEND ;SHFT IN LAST CAR FOR QUOT
|
||||
ROL _DVEND+1
|
||||
CLC
|
||||
CLC ; NO ERRORS, CLEAR CARRY
|
||||
RTS
|
||||
_DVSOR DS 2
|
||||
_DVEND DS 4
|
||||
_SQUOT DS 1
|
||||
_SREMD DS 1
|
||||
_RSLTI DS 1
|
||||
_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
|
@ -1,4 +1,3 @@
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* DIVD8 :: 8BIT DIVISION (8BR) *
|
||||
*- -*
|
@ -1,5 +1,4 @@
|
||||
DIVD8
|
||||
*
|
||||
PLA
|
||||
STA RETADR
|
||||
PLA
|
||||
@ -23,8 +22,8 @@ DIVD8
|
||||
PHA
|
||||
LDA RETADR
|
||||
PHA
|
||||
LDY :REM
|
||||
LDA #1
|
||||
LDY :REM ; REMAINDER TO Y
|
||||
LDA #1
|
||||
STA RETLEN
|
||||
LDA :DVSOR
|
||||
STA RETURN
|
@ -3,9 +3,9 @@
|
||||
* *
|
||||
* -< MATH DEMO >- *
|
||||
* *
|
||||
* VERSION 00.02.00 *
|
||||
* VERSION 00.03.00 *
|
||||
* *
|
||||
* 12-DEC-2018 *
|
||||
* 20-JAN-2018 *
|
||||
* *
|
||||
********************************
|
||||
* *
|
||||
@ -18,6 +18,7 @@
|
||||
*
|
||||
CYC AVE
|
||||
EXP ONLY
|
||||
TR ON
|
||||
DSK MATH.DEMO
|
||||
OBJ $BFE0
|
||||
ORG $6000
|
||||
@ -26,10 +27,11 @@
|
||||
* TOP INCLUDES (HOOKS,MACROS) *
|
||||
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
||||
*
|
||||
PUT REQUIRED.VARS
|
||||
PUT REQUIRED.HOOKS.MIN
|
||||
USE REQUIRED.MAC.MIN
|
||||
PUT MATH.HOOKS
|
||||
USE MATH.MAC
|
||||
PUT REQUIRED.HOOKS
|
||||
USE REQUIRED.MAC
|
||||
USE MATH.MAC.MIN
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* PROGRAM MAIN BODY *
|
||||
@ -222,7 +224,7 @@
|
||||
_PRNT "00 01 02 03 04 05",8D8D8D
|
||||
LDA #$84 ; = $80 + EXPONENT; -1 = $79
|
||||
STA $300
|
||||
LDA #A0 ; MANTISSA
|
||||
LDA #$A0 ; MANTISSA
|
||||
STA $301 ; STORED MOST SIGNIFICANT
|
||||
LDA #00
|
||||
STA $302
|
||||
@ -273,7 +275,23 @@
|
||||
*
|
||||
** BOTTOM INCLUDES
|
||||
*
|
||||
PUT MATH8.LIB
|
||||
PUT MATH16.LIB
|
||||
PUT REQUIRED.LIB
|
||||
PUT REQUIRED.LIB.MIN
|
||||
*
|
||||
** 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@ *
|
||||
* OUTLOOK.COM *
|
||||
* *
|
||||
* VERSION: 0.2.0 *
|
||||
* DATE: 12-DEC-2018 *
|
||||
* VERSION: 0.3.0 *
|
||||
* DATE: 20-JAN-2019 *
|
||||
* ASSEMBLER: MERLIN 8 PRO *
|
||||
* LICENSE: APACHE 2.0 *
|
||||
* 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 *
|
||||
*- -*
|
@ -1,6 +1,4 @@
|
||||
*
|
||||
MULT16
|
||||
*
|
||||
PLA
|
||||
STA RETADR
|
||||
PLA
|
||||
@ -14,29 +12,32 @@ MULT16
|
||||
PLA
|
||||
STA :MCAND+1
|
||||
LDA #0
|
||||
STA :HPROD
|
||||
STA :HPROD ; ZERO HIGH WORD
|
||||
STA :HPROD+1
|
||||
LDX #17
|
||||
CLC
|
||||
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
|
||||
ROR :HPROD+1
|
||||
ROR :HPROD
|
||||
ROR :MLIER+1
|
||||
ROR :MLIER
|
||||
BCC :DECCNT
|
||||
CLC
|
||||
BCC :DECCNT ; BR IF NEXT BIT OF
|
||||
CLC ; NEXT BIT=1 SO ADD MCAND
|
||||
LDA :MCAND
|
||||
ADC :HPROD
|
||||
STA :HPROD
|
||||
LDA :MCAND+1
|
||||
ADC :HPROD+1
|
||||
STA :HPROD+1
|
||||
STA :HPROD+1 ; CARRY = OVERFLOW
|
||||
:DECCNT
|
||||
DEX
|
||||
BNE :MULLP
|
||||
|
||||
LDY :HPROD
|
||||
LDX :HPROD+1
|
||||
BNE :MULLP ; CONTINUE UNTIL DONE
|
||||
LDY :HPROD ; LOW BYTE OF HIGH WORD
|
||||
LDX :HPROD+1 ; HIGH BYTE OF HIGH WORD
|
||||
LDA :MLIER+1
|
||||
TAX
|
||||
STX RETURN+1
|
||||
@ -51,7 +52,7 @@ MULT16
|
||||
PHA
|
||||
LDA RETADR
|
||||
PHA
|
||||
LDA :HPROD
|
||||
LDA :HPROD ;24BIT
|
||||
RTS
|
||||
:MCAND DS 3
|
||||
:MLIER DS 3
|
@ -1,4 +1,3 @@
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* MULT8 : 8BIT MULTIPLY (16BR) *
|
||||
*- -*
|
@ -1,5 +1,4 @@
|
||||
MULT8
|
||||
*
|
||||
PLA
|
||||
STA RETADR
|
||||
PLA
|
@ -1,4 +1,3 @@
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* RAND16 : 16BIT RANDOM NUMBER *
|
||||
*- -*
|
@ -1,6 +1,4 @@
|
||||
*
|
||||
RAND16
|
||||
*
|
||||
LDA RNDL
|
||||
STA :SEED
|
||||
LDA RNDH
|
||||
@ -11,7 +9,7 @@ RAND16
|
||||
LDA :SEED+1
|
||||
ROL
|
||||
BCC :NOEOR
|
||||
:DOEOR
|
||||
:DOEOR ; HIGH BYTE IN A
|
||||
EOR #>$0369
|
||||
STA :SEED+1
|
||||
LDA :SEED
|
@ -1,4 +1,3 @@
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* RAND8 :: 8-BIT RANDOM NUMBER *
|
||||
*- -*
|
@ -1,12 +1,11 @@
|
||||
** RAND8
|
||||
*
|
||||
RAND8
|
||||
LDX #8
|
||||
LDA RNDL+0
|
||||
:A
|
||||
ASL
|
||||
ASL ;SHIFT THE REG
|
||||
ROL RNDL+1
|
||||
BCC :B
|
||||
EOR #$2D
|
||||
EOR #$2D ; APPLY XOR FEEDBACK
|
||||
:B
|
||||
DEX
|
||||
BNE :A
|
||||
@ -14,5 +13,5 @@
|
||||
STA RETURN
|
||||
LDY #1
|
||||
STY RETLEN
|
||||
CMP #0
|
||||
CMP #0 ; RELOAD FLAGS
|
||||
RTS
|
@ -1,4 +1,3 @@
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* RANDB :: RANDOM BYTE *
|
||||
*- -*
|
||||
@ -64,7 +63,18 @@ RANDB
|
||||
STA :OLDMIN
|
||||
LDA #255
|
||||
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
|
||||
*
|
||||
** NEWVALUE = (((OLDVAL-NEWMIN) * (NEWMAX-NEWMIN) /
|
@ -1,5 +1,4 @@
|
||||
RANDB
|
||||
*
|
||||
PLA
|
||||
STA RETADR
|
||||
PLA
|
||||
@ -12,7 +11,18 @@ RANDB
|
||||
STA :OLDMIN
|
||||
LDA #255
|
||||
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
|
||||
LDA :OLDMAX
|
||||
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 *
|
||||
*- -*
|
||||
@ -99,4 +98,3 @@ SUBT16
|
||||
*
|
||||
:MINU DS 2
|
||||
:SUBT DS 2
|
||||
*
|
@ -1,6 +1,4 @@
|
||||
*
|
||||
SUBT16
|
||||
*
|
||||
PLA
|
||||
STA RETADR
|
||||
PLA
|
||||
@ -8,19 +6,19 @@ SUBT16
|
||||
PLA
|
||||
STA :SUBT
|
||||
PLA
|
||||
STA :SUBT+1
|
||||
STA :SUBT+1 ; SUBTRAHEND
|
||||
PLA
|
||||
STA :MINU
|
||||
PLA
|
||||
STA :MINU+1
|
||||
STA :MINU+1 ; MINUEND
|
||||
LDA :MINU
|
||||
SEC
|
||||
SBC :SUBT
|
||||
TAY
|
||||
TAY ; LOW BYTE
|
||||
STY RETURN
|
||||
LDA :MINU+1
|
||||
SBC :SUBT+1
|
||||
TAX
|
||||
TAX ; HIGH BYTE
|
||||
STX RETURN+1
|
||||
LDA #2
|
||||
STA RETLEN
|
Loading…
x
Reference in New Issue
Block a user