AppleIIAsm-Collection/disks/disk3_math/T.MATH.DEMO
nathanriggs 16c1731e54 Strings 0.2.0 update
- bugfixes
- implemented required library
- commenting updates
- .min of every routine
2018-12-22 20:35:05 -05:00

280 lines
8.0 KiB
Plaintext

*
********************************
* *
* -< MATH DEMO >- *
* *
* VERSION 00.02.00 *
* *
* 12-DEC-2018 *
* *
********************************
* *
* NATHAN D. RIGGS *
* NATHAN.RIGGS@OUTLOOK.COM *
* *
********************************
*
** ASSEMBLER DIRECTIVES
*
CYC AVE
EXP ONLY
DSK MATH.DEMO
OBJ $BFE0
ORG $6000
*
*``````````````````````````````*
* TOP INCLUDES (HOOKS,MACROS) *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
PUT MATH.HOOKS
USE MATH.MAC
PUT REQUIRED.HOOKS
USE REQUIRED.MAC
*
*``````````````````````````````*
* PROGRAM MAIN BODY *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
JSR $FC58 ; HOME
_PRNT "INTEGER MATH LIBRARIES AND",8D
_PRNT "MACROS. ",8D
_PRNT "-------------------------",8D8D
_PRNT "THE RAND8 ROUTINE RETURNS",8D
_PRNT "A PSEUDO-RANDOM VALUE BETWEEN",8D
_PRNT "1 AND 255.",8D8D
JSR RAND8
STA $300
JSR RAND8
STA $301
JSR RAND8
STA $302
JSR RAND8
STA $303
JSR RAND8
STA $304
_DUMP $300;#5
_WAIT
*
_PRNT " ",8D8D
_PRNT "WHILE THE RNDB MACRO RETURNS",8D
_PRNT "A BYTE VALUE BETWEEN A GIVEN",8D
_PRNT "LOW AND HIGH VALUE.",8D8D
RNDB #$A0;#$AF
STA $300
RNDB #$A0;#$AF
STA $301
RNDB #$A0;#$AF
STA $302
RNDB #$A0;#$AF
STA $303
RNDB #$A0;#$AF
STA $304
_DUMP $300;#5
_WAIT
*
_PRNT " ",8D8D
_PRNT "THE MUL8 MACRO MULTIPLIES",8D
_PRNT "TWO UNSIGNED BYTES AND RETURNS",8D
_PRNT "A 16-BIT RESULT (WORD).",8D
_PRNT "NOTE THAT THIS RESULT IS STORED",8D
_PRNT "WITH THE LOW BYTE FIRST, THEN THE",8D
_PRNT "HIGH BYTE, AS PER 6502 CONVENTION.",8D8D
_PRNT ":: MUL8 #10;#10 RETURNS (L,H):",8D
LDA #10
STA $300
MUL8 #10;$300
_DUMP RETURN;#2
_WAIT
_PRNT " ",8D8D
_PRNT ":: MUL8 #100;#100 RETURNS (L,H):",8D
MUL8 #100;#100
_DUMP RETURN;#2
_PRNT " ",8D8D
_WAIT
*
_PRNT "THE DIV8 MACRO DIVIDES A ",8D
_PRNT "DIVIDEND BY A DIVISOR,"8D
_PRNT "RETURNING THE QUOTIENT.",8D
_PRNT "ALL VALUES ARE UNSIGNED.",8D8D
DIV8 #100;#10
_PRNT ":: DIV8 #100;#10 RETURNS:",8D8D
_DUMP RETURN;#1
_WAIT
_PRNT "::DIV8 #200;#33 RETURNS",8D8D
DIV8 #200;#33
STY $300 ; REMAINDER IN .Y
_DUMP RETURN;#1
_PRNT " ",8D8D
_PRNT "WITH A REMAINDER OF: ",8D
_DUMP $300;#1
_PRNT " ",8D8D
_WAIT
*
** THE FOLLOWING IS DONE JUST TO SHOW THAT
** THESE MACROS ACCEPT LITERAL VALUES AS WELL
** AS POINTERS
*
LDA #$D0 ; LOAD #2000 INTO $300
STA $300
LDA #$07
STA $301
LDA #$B8
STA $302
LDA #$0B
STA $303
ADD16 $300;#3000
_PRNT " ",8D8D
_PRNT "THE ADD16 MACRO ADDS TWO",8D
_PRNT "16-BIT VALUES, SIGNED OR UNSIGNED.",8D8D
_PRNT "ADD16 #3000;#2000 RETURNS: ",8D8D
_DUMP RETURN;RETLEN
_PRNT " ",8D8D
_WAIT
*
_PRNT " ",8D8D
_PRNT "THE SUB16 MACRO SUBTRACTS ONE",8D
_PRNT "16-BIT NUMBER FROM ANOTHER.",8D8D
_PRNT "CALCULATED LEFT TO RIGHT, L-R.",8D
_PRNT "SIGNED OR UNSIGNED.",8D8D
_PRNT "SUB16 #5000;#3000 RETURNS: ",8D8D
SUB16 #5000;#3000 ; 5000 - 3000
_DUMP RETURN;RETLEN
_PRNT " ",8D8D
_WAIT
*
_PRNT "THE MUL16 MACRO MULTIPLIES TWO",8D
_PRNT "16-BIT NUMBERS, SIGNED OR NOT.",8D8D
_PRNT "MUL16 #500;#500 RETURNS: ",8D8D
MUL16 #500;#500
_DUMP RETURN;RETLEN
_PRNT " ",8D8D
_WAIT
*
_PRNT "AND THE DIV16 MACRO DIVIDES THE",8D
_PRNT "FIRST PARAMETER BY THE SECOND.",8D8D
_PRNT "IF THE THIRD PARAMETER IS",8D
_PRNT "AN S, THEN THE DIVISION IS SIGNED;",8D
_PRNT "OTHERWISE, IT IS UNSIGNED.",8D8D
_PRNT "DIV16 #25000;#500;U RETURNS:",8D8D
DIV16 #25000;#500;U
_DUMP RETURN;RETLEN
_PRNT " ",8D8D
_WAIT
*
_PRNT "THE REM16 MACRO LIKEWISE CALCULATES",8D
_PRNT "THE REMAINDER OF A 16-BIT DIVISION.",8D
_PRNT "IT ALSO USES THE THIRD PARAMETER TO",8D
_PRNT "SIGNIFY WHETHER IT IS SIGNED (S).",8D8D
_PRNT "REM16 #5000;#333;U RETURNS:",8D8D
REM16 #5000;#333;U
_DUMP RETURN;RETLEN
_PRNT " ",8D8D
_WAIT
*
_PRNT "CMP16 COMPARES TWO 16-BIT VALUES",8D
_PRNT "SETTING FLAGS AS WOULD THE CMP ",8D
_PRNT "COMMAND IN 6502 ASSEMBLY. WE WON'T",8D
_PRNT "BE ILLUSTRATING THIS FOR NOW ",8D
_PRNT "BECAUSE I HATE YOU.",8D8D
_WAIT
*
_PRNT " ",8D8D
_PRNT "AND FINALLY, THE RND16 MACRO",8D
_PRNT "RETURNS A RANDOM 16-BIT VALUE, FROM",8D
_PRNT "0 TO 65455.",8D8D
LUP 5
_PRNT "RND16 RETURNS:",8D8D
RND16
_DUMP RETURN;RETLEN
_PRNT " ",8D8D
_WAIT
--^
*
********************************
*
* THE FOLLOWING IS CURRENTLY UNDER
* CONSTRUCTION, AND DOES NOT YET
* WORK AS PLANNED. FLOATING POINT
* ROUTINES WILL BE ADDED IN THE NEXT
* MAJOR VERSION RELEASE.
*
********************************
*
_PRNT " ",8D8D8D8D8D8D8D8D
_PRNT "FLOATING-POINT CALCULATION",8D
_PRNT "--------------------------",8D8D
_PRNT "THIS LIBRARY USES THE APPLESOFT",8D
_PRNT "ROUTINES FOR FLOATING-POINT",8D
_PRNT "ARITHMETIC, WRITTEN ORIGINALLY",8D
_PRNT "BY STEVE WOZNIAK. THESE ARE",8D
_PRNT "PRESENT IN EVERY APPLE II MODEL",8D
_PRNT "FROM THE APPLE ][+ AND FORWARD.",8D
_PRNT " ",8D8D
_WAIT
_PRNT "FLOATING-POINT VALUES ARE STORED",8D
_PRNT "USING SCIENTIFIC NOTATION, WHERE",8D
_PRNT "THE FIRST BYTE IS THE EXPONENT,",8D
_PRNT "THE SECOND THROUGH FIFTH BYTES",8D
_PRNT "ARE THE MANTISSA, AND THE SIXTH",8D
_PRNT "BYTE THE SIGN.",8D8D
_WAIT
_PRNT "EXP MANTISSA SIGN",8D
_PRNT "00 01 02 03 04 05",8D8D8D
LDA #$84 ; = $80 + EXPONENT; -1 = $79
STA $300
LDA #A0 ; MANTISSA
STA $301 ; STORED MOST SIGNIFICANT
LDA #00
STA $302
STA $303 ; LEFT TO RIGHT.
STA $304
LDA #$FF
STA $305 ; FF= NEGATIVE, 0 = POSITIVE
_DUMP $300;#6
*
** 25E10^-1 = 2.5
*
_WAIT
_PRNT "SO, LET'S PUT 2.5 IN $300 AND",8D
_PRNT "10 IN $310, THEN ADD THEM.",8D8D
_PRNT "2.5 = 25E-1 SCIENTIFIC NOTATION",8D8D
_PRNT " = 01 37 00 00 00 FF",8D8D
_PRNT "10 = 1E+1",8D
_PRNT " = 01 01 00 00 00 00",8D8D
_PRNT " ",8D8D8D
LDA #$84
LDA #$A0
STA $310
STA $311
LDA #0
STA $312
STA $313
STA $314
STA $315
_WAIT
_PRNT " ",8D8D
_PRNT "NOW LET'S ADD THEM WITH THE",8D
_PRNT "FPADD MACRO TO SEE THE RESULT.",8D8D
_PRNT "FPADD $300;$310 RETURNS:",8D8D
FPADD $300;$310
_DUMP RETURN;RETLEN
*
********************************
*
* END OF CONSTRUCTION
*
********************************
*
JMP REENTRY
*
*``````````````````````````````*
* BOTTOM INCLUDES *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
** BOTTOM INCLUDES
*
PUT MATH8.LIB
PUT MATH16.LIB
PUT REQUIRED.LIB
*