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:
nathanriggs 2019-01-20 22:03:35 -05:00
parent ad58479739
commit d99c32fdda
50 changed files with 7115 additions and 9595 deletions

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

View File

@ -1,4 +1,3 @@
*
*``````````````````````````````*
* ADDIT16 :: ADD 16-BIT VALUES *
*- -*

View File

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

View File

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

View File

@ -1,4 +1,3 @@
*
*``````````````````````````````*
* COMP16 :: 16-BIT COMPARE *
*- -*

View 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

View File

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

View File

@ -1,4 +1,3 @@
*
*``````````````````````````````*
* 16-BIT DIVISION: *
* *

View File

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

View File

@ -1,4 +1,3 @@
*
*``````````````````````````````*
* DIVD8 :: 8BIT DIVISION (8BR) *
*- -*

View File

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

View File

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

View File

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

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,4 +1,3 @@
*
*``````````````````````````````*
* MULT16 :: MULTIPLY WORDS *
*- -*

View File

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

View File

@ -1,4 +1,3 @@
*
*``````````````````````````````*
* MULT8 : 8BIT MULTIPLY (16BR) *
*- -*

View File

@ -1,5 +1,4 @@
MULT8
*
PLA
STA RETADR
PLA

View File

@ -1,4 +1,3 @@
*
*``````````````````````````````*
* RAND16 : 16BIT RANDOM NUMBER *
*- -*

View File

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

View File

@ -1,4 +1,3 @@
*
*``````````````````````````````*
* RAND8 :: 8-BIT RANDOM NUMBER *
*- -*

View File

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

View File

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

View File

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

View File

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

View 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

View File

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

View 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

View File

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

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

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

View File

@ -1,4 +1,3 @@
*
*``````````````````````````````*
* SUBT16 :: SUBTRACT WORDS *
*- -*
@ -99,4 +98,3 @@ SUBT16
*
:MINU DS 2
:SUBT DS 2
*

View File

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