mirror of
https://github.com/nathanriggs/AppleIIAsm-Collection.git
synced 2025-02-08 12:30:31 +00:00
added disk2: math libary
integer math for 8 and 16 bit operations. Expected to grow substantially.
This commit is contained in:
parent
9849dbb5ea
commit
ddeb2e706b
@ -13,8 +13,8 @@ CORE DISK
|
||||
* common.lib: Common, useful subroutines: memory swaps, etc.
|
||||
|
||||
MATH DISK
|
||||
* math.lib: Integer Math Library.
|
||||
* fpmath.lib: Floating-point Math Library.
|
||||
* math8.lib: 8-bit Integer Math Library.
|
||||
* math16.lib: 16-bit Integer Math Library.
|
||||
|
||||
IO DISK
|
||||
* fileio.lib: File Input/Output Library.
|
||||
@ -43,6 +43,6 @@ MISC DISK
|
||||
UTIL DISK
|
||||
* various useful utilities
|
||||
|
||||
COMPACT DISK 1 (and maybe a second one)
|
||||
* every routine, separately packaged, without comments.
|
||||
FPMATH DISK 1 (and maybe a second one)
|
||||
* fpmath.lib: Floating-point math library
|
||||
|
||||
|
@ -13,7 +13,6 @@ CORE DISK
|
||||
* common.lib: Common, useful subroutines: memory swaps, etc.
|
||||
|
||||
MATH DISK
|
||||
|
||||
* math.lib: Integer Math Library.
|
||||
* fpmath.lib: Floating-point Math Library.
|
||||
|
||||
@ -42,4 +41,8 @@ MISC DISK
|
||||
* applesoft.lib: Library for interfacing ASM programs with Applesoft BASIC.
|
||||
|
||||
UTIL DISK
|
||||
* various useful utilities
|
||||
* various useful utilities
|
||||
|
||||
COMPACT DISK 1 (and maybe a second one)
|
||||
* every routine, separately packaged, without comments.
|
||||
|
||||
|
558
disks/disk2_math8_math16/MATH.DEMO
Normal file
558
disks/disk2_math8_math16/MATH.DEMO
Normal file
@ -0,0 +1,558 @@
|
||||
6000- A9 03 LDA #$03
|
||||
6002- 48 PHA
|
||||
6003- A9 E8 LDA #$E8
|
||||
6005- 48 PHA
|
||||
6006- A9 07 LDA #$07
|
||||
6008- 48 PHA
|
||||
6009- A9 D0 LDA #$D0
|
||||
600B- 48 PHA
|
||||
600C- 20 9C 60 JSR $609C
|
||||
600F- A9 07 LDA #$07
|
||||
6011- 48 PHA
|
||||
6012- A9 D0 LDA #$D0
|
||||
6014- 48 PHA
|
||||
6015- A9 03 LDA #$03
|
||||
6017- 48 PHA
|
||||
6018- A9 E8 LDA #$E8
|
||||
601A- 48 PHA
|
||||
601B- 20 D2 60 JSR $60D2
|
||||
601E- A9 03 LDA #$03
|
||||
6020- 48 PHA
|
||||
6021- A9 E8 LDA #$E8
|
||||
6023- 48 PHA
|
||||
6024- A9 00 LDA #$00
|
||||
6026- 48 PHA
|
||||
6027- A9 03 LDA #$03
|
||||
6029- 48 PHA
|
||||
602A- 20 08 61 JSR $6108
|
||||
602D- A9 75 LDA #$75
|
||||
602F- 48 PHA
|
||||
6030- A9 30 LDA #$30
|
||||
6032- 48 PHA
|
||||
6033- A9 0B LDA #$0B
|
||||
6035- 48 PHA
|
||||
6036- A9 B8 LDA #$B8
|
||||
6038- 48 PHA
|
||||
6039- 20 73 61 JSR $6173
|
||||
603C- A9 FC LDA #$FC
|
||||
603E- 48 PHA
|
||||
603F- A9 18 LDA #$18
|
||||
6041- 48 PHA
|
||||
6042- A9 00 LDA #$00
|
||||
6044- 48 PHA
|
||||
6045- A9 0A LDA #$0A
|
||||
6047- 48 PHA
|
||||
6048- 20 9F 61 JSR $619F
|
||||
604B- A9 FC LDA #$FC
|
||||
604D- 48 PHA
|
||||
604E- A9 18 LDA #$18
|
||||
6050- 48 PHA
|
||||
6051- A9 00 LDA #$00
|
||||
6053- 48 PHA
|
||||
6054- A9 0D LDA #$0D
|
||||
6056- 48 PHA
|
||||
6057- 20 A3 61 JSR $61A3
|
||||
605A- A9 03 LDA #$03
|
||||
605C- 48 PHA
|
||||
605D- A9 E8 LDA #$E8
|
||||
605F- 48 PHA
|
||||
6060- A9 00 LDA #$00
|
||||
6062- 48 PHA
|
||||
6063- A9 0D LDA #$0D
|
||||
6065- 48 PHA
|
||||
6066- 20 77 61 JSR $6177
|
||||
6069- A9 03 LDA #$03
|
||||
606B- 48 PHA
|
||||
606C- A9 FF LDA #$FF
|
||||
606E- 48 PHA
|
||||
606F- A9 00 LDA #$00
|
||||
6071- 48 PHA
|
||||
6072- A9 7B LDA #$7B
|
||||
6074- 48 PHA
|
||||
6075- 20 A3 62 JSR $62A3
|
||||
6078- 20 28 63 JSR $6328
|
||||
607B- A9 32 LDA #$32
|
||||
607D- 48 PHA
|
||||
607E- A9 64 LDA #$64
|
||||
6080- 48 PHA
|
||||
6081- 20 3B 63 JSR $633B
|
||||
6084- A9 64 LDA #$64
|
||||
6086- 48 PHA
|
||||
6087- A9 C8 LDA #$C8
|
||||
6089- 48 PHA
|
||||
608A- 20 D5 63 JSR $63D5
|
||||
608D- A9 C8 LDA #$C8
|
||||
608F- 48 PHA
|
||||
6090- A9 0A LDA #$0A
|
||||
6092- 48 PHA
|
||||
6093- 20 13 64 JSR $6413
|
||||
6096- 20 EA 62 JSR $62EA
|
||||
6099- 4C D0 03 JMP $03D0
|
||||
609C- 68 PLA
|
||||
609D- 8D CC 60 STA $60CC
|
||||
60A0- 68 PLA
|
||||
60A1- 8D CD 60 STA $60CD
|
||||
60A4- 68 PLA
|
||||
60A5- 8D D0 60 STA $60D0
|
||||
60A8- 68 PLA
|
||||
60A9- 8D D1 60 STA $60D1
|
||||
60AC- 68 PLA
|
||||
60AD- 8D CE 60 STA $60CE
|
||||
60B0- 68 PLA
|
||||
60B1- 8D CF 60 STA $60CF
|
||||
60B4- AD CE 60 LDA $60CE
|
||||
60B7- 18 CLC
|
||||
60B8- 6D D0 60 ADC $60D0
|
||||
60BB- A8 TAY
|
||||
60BC- AD CF 60 LDA $60CF
|
||||
60BF- 6D D1 60 ADC $60D1
|
||||
60C2- AA TAX
|
||||
60C3- AD CD 60 LDA $60CD
|
||||
60C6- 48 PHA
|
||||
60C7- AD CC 60 LDA $60CC
|
||||
60CA- 48 PHA
|
||||
60CB- 60 RTS
|
||||
60CC- 00 BRK
|
||||
60CD- 00 BRK
|
||||
60CE- 00 BRK
|
||||
60CF- 00 BRK
|
||||
60D0- 00 BRK
|
||||
60D1- 00 BRK
|
||||
60D2- 68 PLA
|
||||
60D3- 8D 02 61 STA $6102
|
||||
60D6- 68 PLA
|
||||
60D7- 8D 03 61 STA $6103
|
||||
60DA- 68 PLA
|
||||
60DB- 8D 06 61 STA $6106
|
||||
60DE- 68 PLA
|
||||
60DF- 8D 07 61 STA $6107
|
||||
60E2- 68 PLA
|
||||
60E3- 8D 04 61 STA $6104
|
||||
60E6- 68 PLA
|
||||
60E7- 8D 05 61 STA $6105
|
||||
60EA- AD 04 61 LDA $6104
|
||||
60ED- 38 SEC
|
||||
60EE- ED 06 61 SBC $6106
|
||||
60F1- A8 TAY
|
||||
60F2- AD 05 61 LDA $6105
|
||||
60F5- ED 07 61 SBC $6107
|
||||
60F8- AA TAX
|
||||
60F9- AD 03 61 LDA $6103
|
||||
60FC- 48 PHA
|
||||
60FD- AD 02 61 LDA $6102
|
||||
6100- 48 PHA
|
||||
6101- 60 RTS
|
||||
6102- 00 BRK
|
||||
6103- 00 BRK
|
||||
6104- 00 BRK
|
||||
6105- 00 BRK
|
||||
6106- 00 BRK
|
||||
6107- 00 BRK
|
||||
6108- 68 PLA
|
||||
6109- 8D 71 61 STA $6171
|
||||
610C- 68 PLA
|
||||
610D- 8D 72 61 STA $6172
|
||||
6110- 68 PLA
|
||||
6111- 8D 6C 61 STA $616C
|
||||
6114- 68 PLA
|
||||
6115- 8D 6D 61 STA $616D
|
||||
6118- 68 PLA
|
||||
6119- 8D 69 61 STA $6169
|
||||
611C- 68 PLA
|
||||
611D- 8D 6A 61 STA $616A
|
||||
6120- A9 00 LDA #$00
|
||||
6122- 8D 6F 61 STA $616F
|
||||
6125- 8D 70 61 STA $6170
|
||||
6128- A2 11 LDX #$11
|
||||
612A- 18 CLC
|
||||
612B- 6E 70 61 ROR $6170
|
||||
612E- 6E 6F 61 ROR $616F
|
||||
6131- 6E 6D 61 ROR $616D
|
||||
6134- 6E 6C 61 ROR $616C
|
||||
6137- 90 13 BCC $614C
|
||||
6139- 18 CLC
|
||||
613A- AD 69 61 LDA $6169
|
||||
613D- 6D 6F 61 ADC $616F
|
||||
6140- 8D 6F 61 STA $616F
|
||||
6143- AD 6A 61 LDA $616A
|
||||
6146- 6D 70 61 ADC $6170
|
||||
6149- 8D 70 61 STA $6170
|
||||
614C- CA DEX
|
||||
614D- D0 DC BNE $612B
|
||||
614F- AC 6F 61 LDY $616F
|
||||
6152- AE 70 61 LDX $6170
|
||||
6155- AD 6D 61 LDA $616D
|
||||
6158- AA TAX
|
||||
6159- AD 6C 61 LDA $616C
|
||||
615C- A8 TAY
|
||||
615D- AD 72 61 LDA $6172
|
||||
6160- 48 PHA
|
||||
6161- AD 71 61 LDA $6171
|
||||
6164- 48 PHA
|
||||
6165- AD 6F 61 LDA $616F
|
||||
6168- 60 RTS
|
||||
6169- 00 BRK
|
||||
616A- 00 BRK
|
||||
616B- 00 BRK
|
||||
616C- 00 BRK
|
||||
616D- 00 BRK
|
||||
616E- 00 BRK
|
||||
616F- 00 BRK
|
||||
6170- 00 BRK
|
||||
6171- 00 BRK
|
||||
6172- 00 BRK
|
||||
6173- A9 00 LDA #$00
|
||||
6175- F0 02 BEQ $6179
|
||||
6177- A9 02 LDA #$02
|
||||
6179- 8D A2 62 STA $62A2
|
||||
617C- 68 PLA
|
||||
617D- 8D 9E 62 STA $629E
|
||||
6180- 68 PLA
|
||||
6181- 8D 9F 62 STA $629F
|
||||
6184- 68 PLA
|
||||
6185- 8D 98 62 STA $6298
|
||||
6188- 68 PLA
|
||||
6189- 8D 99 62 STA $6299
|
||||
618C- 68 PLA
|
||||
618D- 8D 9A 62 STA $629A
|
||||
6190- 68 PLA
|
||||
6191- 8D 9B 62 STA $629B
|
||||
6194- 20 57 62 JSR $6257
|
||||
6197- 90 03 BCC $619C
|
||||
6199- 4C 31 62 JMP $6231
|
||||
619C- 4C 42 62 JMP $6242
|
||||
619F- A9 00 LDA #$00
|
||||
61A1- F0 04 BEQ $61A7
|
||||
61A3- A9 02 LDA #$02
|
||||
61A5- D0 00 BNE $61A7
|
||||
61A7- 8D A2 62 STA $62A2
|
||||
61AA- 68 PLA
|
||||
61AB- 8D 9E 62 STA $629E
|
||||
61AE- 68 PLA
|
||||
61AF- 8D 9F 62 STA $629F
|
||||
61B2- 68 PLA
|
||||
61B3- 8D 98 62 STA $6298
|
||||
61B6- 68 PLA
|
||||
61B7- 8D 99 62 STA $6299
|
||||
61BA- 68 PLA
|
||||
61BB- 8D 9A 62 STA $629A
|
||||
61BE- 68 PLA
|
||||
61BF- 8D 9B 62 STA $629B
|
||||
61C2- AD 9B 62 LDA $629B
|
||||
61C5- 4D 99 62 EOR $6299
|
||||
61C8- 8D A0 62 STA $62A0
|
||||
61CB- AD 9B 62 LDA $629B
|
||||
61CE- 8D A1 62 STA $62A1
|
||||
61D1- AD 99 62 LDA $6299
|
||||
61D4- 10 11 BPL $61E7
|
||||
61D6- A9 00 LDA #$00
|
||||
61D8- 38 SEC
|
||||
61D9- ED 98 62 SBC $6298
|
||||
61DC- 8D 98 62 STA $6298
|
||||
61DF- A9 00 LDA #$00
|
||||
61E1- ED 99 62 SBC $6299
|
||||
61E4- 8D 99 62 STA $6299
|
||||
61E7- AD 9B 62 LDA $629B
|
||||
61EA- 10 11 BPL $61FD
|
||||
61EC- A9 00 LDA #$00
|
||||
61EE- 38 SEC
|
||||
61EF- ED 9A 62 SBC $629A
|
||||
61F2- 8D 9A 62 STA $629A
|
||||
61F5- A9 00 LDA #$00
|
||||
61F7- ED 9B 62 SBC $629B
|
||||
61FA- 8D 9B 62 STA $629B
|
||||
61FD- 20 57 62 JSR $6257
|
||||
6200- B0 2F BCS $6231
|
||||
6202- AD A0 62 LDA $62A0
|
||||
6205- 10 11 BPL $6218
|
||||
6207- A9 00 LDA #$00
|
||||
6209- 38 SEC
|
||||
620A- ED 9A 62 SBC $629A
|
||||
620D- 8D 9A 62 STA $629A
|
||||
6210- A9 00 LDA #$00
|
||||
6212- ED 9B 62 SBC $629B
|
||||
6215- 8D 9B 62 STA $629B
|
||||
6218- AD A1 62 LDA $62A1
|
||||
621B- 10 25 BPL $6242
|
||||
621D- A9 00 LDA #$00
|
||||
621F- 38 SEC
|
||||
6220- ED 9C 62 SBC $629C
|
||||
6223- 8D 9C 62 STA $629C
|
||||
6226- A9 00 LDA #$00
|
||||
6228- ED 9D 62 SBC $629D
|
||||
622B- 8D 9D 62 STA $629D
|
||||
622E- 4C 42 62 JMP $6242
|
||||
6231- A9 00 LDA #$00
|
||||
6233- 8D 9A 62 STA $629A
|
||||
6236- 8D 9B 62 STA $629B
|
||||
6239- 8D 9C 62 STA $629C
|
||||
623C- 8D 9D 62 STA $629D
|
||||
623F- 38 SEC
|
||||
6240- B0 01 BCS $6243
|
||||
6242- 18 CLC
|
||||
6243- AE A2 62 LDX $62A2
|
||||
6246- BD 9A 62 LDA $629A,X
|
||||
6249- A8 TAY
|
||||
624A- BD 9B 62 LDA $629B,X
|
||||
624D- AA TAX
|
||||
624E- AD 9F 62 LDA $629F
|
||||
6251- 48 PHA
|
||||
6252- AD 9E 62 LDA $629E
|
||||
6255- 48 PHA
|
||||
6256- 60 RTS
|
||||
6257- A9 00 LDA #$00
|
||||
6259- 8D 9C 62 STA $629C
|
||||
625C- 8D 9D 62 STA $629D
|
||||
625F- AD 98 62 LDA $6298
|
||||
6262- 0D 99 62 ORA $6299
|
||||
6265- D0 02 BNE $6269
|
||||
6267- 38 SEC
|
||||
6268- 60 RTS
|
||||
6269- A2 10 LDX #$10
|
||||
626B- 2E 9A 62 ROL $629A
|
||||
626E- 2E 9B 62 ROL $629B
|
||||
6271- 2E 9C 62 ROL $629C
|
||||
6274- 2E 9D 62 ROL $629D
|
||||
6277- 38 SEC
|
||||
6278- AD 9C 62 LDA $629C
|
||||
627B- ED 98 62 SBC $6298
|
||||
627E- A8 TAY
|
||||
627F- AD 9D 62 LDA $629D
|
||||
6282- ED 99 62 SBC $6299
|
||||
6285- 90 06 BCC $628D
|
||||
6287- 8C 9C 62 STY $629C
|
||||
628A- 8D 9D 62 STA $629D
|
||||
628D- CA DEX
|
||||
628E- D0 DB BNE $626B
|
||||
6290- 2E 9A 62 ROL $629A
|
||||
6293- 2E 9B 62 ROL $629B
|
||||
6296- 18 CLC
|
||||
6297- 60 RTS
|
||||
6298- 00 BRK
|
||||
6299- 00 BRK
|
||||
629A- 00 BRK
|
||||
629B- 00 BRK
|
||||
629C- 00 BRK
|
||||
629D- 00 BRK
|
||||
629E- 00 BRK
|
||||
629F- 00 BRK
|
||||
62A0- 00 BRK
|
||||
62A1- 00 BRK
|
||||
62A2- 00 BRK
|
||||
62A3- 68 PLA
|
||||
62A4- 8D E8 62 STA $62E8
|
||||
62A7- 68 PLA
|
||||
62A8- 8D E9 62 STA $62E9
|
||||
62AB- 68 PLA
|
||||
62AC- 8D E6 62 STA $62E6
|
||||
62AF- 68 PLA
|
||||
62B0- 8D E7 62 STA $62E7
|
||||
62B3- 68 PLA
|
||||
62B4- 8D E4 62 STA $62E4
|
||||
62B7- 68 PLA
|
||||
62B8- 8D E5 62 STA $62E5
|
||||
62BB- AD E9 62 LDA $62E9
|
||||
62BE- 48 PHA
|
||||
62BF- AD E8 62 LDA $62E8
|
||||
62C2- 48 PHA
|
||||
62C3- AD E4 62 LDA $62E4
|
||||
62C6- CD E6 62 CMP $62E6
|
||||
62C9- F0 0B BEQ $62D6
|
||||
62CB- AD E5 62 LDA $62E5
|
||||
62CE- ED E7 62 SBC $62E7
|
||||
62D1- 09 01 ORA #$01
|
||||
62D3- 70 0A BVS $62DF
|
||||
62D5- 60 RTS
|
||||
62D6- AD E5 62 LDA $62E5
|
||||
62D9- ED E7 62 SBC $62E7
|
||||
62DC- 70 01 BVS $62DF
|
||||
62DE- 60 RTS
|
||||
62DF- 49 80 EOR #$80
|
||||
62E1- 09 01 ORA #$01
|
||||
62E3- 60 RTS
|
||||
62E4- 00 BRK
|
||||
62E5- 00 BRK
|
||||
62E6- 00 BRK
|
||||
62E7- 00 BRK
|
||||
62E8- 00 BRK
|
||||
62E9- 00 BRK
|
||||
62EA- A5 4E LDA $4E
|
||||
62EC- 8D 26 63 STA $6326
|
||||
62EF- A5 4F LDA $4F
|
||||
62F1- 8D 27 63 STA $6327
|
||||
62F4- AD 26 63 LDA $6326
|
||||
62F7- F0 19 BEQ $6312
|
||||
62F9- 0E 26 63 ASL $6326
|
||||
62FC- AD 27 63 LDA $6327
|
||||
62FF- 2A ROL
|
||||
6300- 90 1A BCC $631C
|
||||
6302- 49 03 EOR #$03
|
||||
6304- 8D 27 63 STA $6327
|
||||
6307- AD 26 63 LDA $6326
|
||||
630A- 49 69 EOR #$69
|
||||
630C- 8D 26 63 STA $6326
|
||||
630F- 4C 1F 63 JMP $631F
|
||||
6312- AD 27 63 LDA $6327
|
||||
6315- F0 EB BEQ $6302
|
||||
6317- 0A ASL
|
||||
6318- F0 02 BEQ $631C
|
||||
631A- B0 E6 BCS $6302
|
||||
631C- 8D 27 63 STA $6327
|
||||
631F- AE 27 63 LDX $6327
|
||||
6322- AC 26 63 LDY $6326
|
||||
6325- 60 RTS
|
||||
6326- 00 BRK
|
||||
6327- 00 BRK
|
||||
6328- A2 08 LDX #$08
|
||||
632A- A5 4E LDA $4E
|
||||
632C- 0A ASL
|
||||
632D- 26 4F ROL $4F
|
||||
632F- 90 02 BCC $6333
|
||||
6331- 49 2D EOR #$2D
|
||||
6333- CA DEX
|
||||
6334- D0 F6 BNE $632C
|
||||
6336- 85 4E STA $4E
|
||||
6338- C9 00 CMP #$00
|
||||
633A- 60 RTS
|
||||
633B- 68 PLA
|
||||
633C- 8D C9 63 STA $63C9
|
||||
633F- 68 PLA
|
||||
6340- 8D CA 63 STA $63CA
|
||||
6343- 68 PLA
|
||||
6344- 8D CD 63 STA $63CD
|
||||
6347- 68 PLA
|
||||
6348- 8D CF 63 STA $63CF
|
||||
634B- AD CD 63 LDA $63CD
|
||||
634E- 18 CLC
|
||||
634F- 69 02 ADC #$02
|
||||
6351- 8D CD 63 STA $63CD
|
||||
6354- AD CD 63 LDA $63CD
|
||||
6357- 38 SEC
|
||||
6358- ED CF 63 SBC $63CF
|
||||
635B- 8D D1 63 STA $63D1
|
||||
635E- 20 28 63 JSR $6328
|
||||
6361- 8D C7 63 STA $63C7
|
||||
6364- A2 00 LDX #$00
|
||||
6366- 8E C8 63 STX $63C8
|
||||
6369- 8E D2 63 STX $63D2
|
||||
636C- AD C8 63 LDA $63C8
|
||||
636F- 48 PHA
|
||||
6370- AD C7 63 LDA $63C7
|
||||
6373- 48 PHA
|
||||
6374- AD D2 63 LDA $63D2
|
||||
6377- 48 PHA
|
||||
6378- AD D1 63 LDA $63D1
|
||||
637B- 48 PHA
|
||||
637C- 20 73 61 JSR $6173
|
||||
637F- 68 PLA
|
||||
6380- 8D D3 63 STA $63D3
|
||||
6383- 68 PLA
|
||||
6384- 8D D4 63 STA $63D4
|
||||
6387- AD C7 63 LDA $63C7
|
||||
638A- 38 SEC
|
||||
638B- ED D3 63 SBC $63D3
|
||||
638E- 8D D3 63 STA $63D3
|
||||
6391- A9 00 LDA #$00
|
||||
6393- 8D D4 63 STA $63D4
|
||||
6396- AD D2 63 LDA $63D2
|
||||
6399- 48 PHA
|
||||
639A- AD D1 63 LDA $63D1
|
||||
639D- 48 PHA
|
||||
639E- AD D4 63 LDA $63D4
|
||||
63A1- 48 PHA
|
||||
63A2- AD D3 63 LDA $63D3
|
||||
63A5- 48 PHA
|
||||
63A6- 20 08 61 JSR $6108
|
||||
63A9- 68 PLA
|
||||
63AA- 8D CB 63 STA $63CB
|
||||
63AD- 68 PLA
|
||||
63AE- 8D CC 63 STA $63CC
|
||||
63B1- 18 CLC
|
||||
63B2- 6D CF 63 ADC $63CF
|
||||
63B5- 8D CB 63 STA $63CB
|
||||
63B8- AE CC 63 LDX $63CC
|
||||
63BB- AD CA 63 LDA $63CA
|
||||
63BE- 48 PHA
|
||||
63BF- AD C9 63 LDA $63C9
|
||||
63C2- 48 PHA
|
||||
63C3- AD CB 63 LDA $63CB
|
||||
63C6- 60 RTS
|
||||
63C7- 00 BRK
|
||||
63C8- 00 BRK
|
||||
63C9- 00 BRK
|
||||
63CA- 00 BRK
|
||||
63CB- 00 BRK
|
||||
63CC- 00 BRK
|
||||
63CD- 00 BRK
|
||||
63CE- 00 BRK
|
||||
63CF- 00 BRK
|
||||
63D0- 00 BRK
|
||||
63D1- 00 BRK
|
||||
63D2- 00 BRK
|
||||
63D3- 00 BRK
|
||||
63D4- 00 BRK
|
||||
63D5- 68 PLA
|
||||
63D6- 8D 10 64 STA $6410
|
||||
63D9- 68 PLA
|
||||
63DA- 8D 11 64 STA $6411
|
||||
63DD- 68 PLA
|
||||
63DE- 8D 0E 64 STA $640E
|
||||
63E1- 68 PLA
|
||||
63E2- 8D 0F 64 STA $640F
|
||||
63E5- A9 00 LDA #$00
|
||||
63E7- AA TAX
|
||||
63E8- 8E 12 64 STX $6412
|
||||
63EB- F0 11 BEQ $63FE
|
||||
63ED- 18 CLC
|
||||
63EE- 6D 0E 64 ADC $640E
|
||||
63F1- A8 TAY
|
||||
63F2- 8A TXA
|
||||
63F3- 6D 12 64 ADC $6412
|
||||
63F6- AA TAX
|
||||
63F7- 98 TYA
|
||||
63F8- 0E 0E 64 ASL $640E
|
||||
63FB- 2E 12 64 ROL $6412
|
||||
63FE- 4E 0F 64 LSR $640F
|
||||
6401- B0 EA BCS $63ED
|
||||
6403- D0 F3 BNE $63F8
|
||||
6405- AD 11 64 LDA $6411
|
||||
6408- 48 PHA
|
||||
6409- AD 10 64 LDA $6410
|
||||
640C- 48 PHA
|
||||
640D- 60 RTS
|
||||
640E- 00 BRK
|
||||
640F- 00 BRK
|
||||
6410- 00 BRK
|
||||
6411- 00 BRK
|
||||
6412- 00 BRK
|
||||
6413- 68 PLA
|
||||
6414- 8D 4E 64 STA $644E
|
||||
6417- 68 PLA
|
||||
6418- 8D 4F 64 STA $644F
|
||||
641B- 68 PLA
|
||||
641C- 8D 4C 64 STA $644C
|
||||
641F- 68 PLA
|
||||
6420- 8D 4D 64 STA $644D
|
||||
6423- A9 00 LDA #$00
|
||||
6425- A2 08 LDX #$08
|
||||
6427- 0E 4D 64 ASL $644D
|
||||
642A- 2A ROL
|
||||
642B- CD 4C 64 CMP $644C
|
||||
642E- 90 03 BCC $6433
|
||||
6430- ED 4C 64 SBC $644C
|
||||
6433- 2E 4D 64 ROL $644D
|
||||
6436- CA DEX
|
||||
6437- D0 F1 BNE $642A
|
||||
6439- 8D 4B 64 STA $644B
|
||||
643C- AD 4F 64 LDA $644F
|
||||
643F- 48 PHA
|
||||
6440- AD 4E 64 LDA $644E
|
||||
6443- 48 PHA
|
||||
6444- AE 4B 64 LDX $644B
|
||||
6447- AD 4D 64 LDA $644D
|
||||
644A- 60 RTS
|
||||
644B- 00 BRK
|
||||
644C- 00 BRK
|
||||
644D- 00 BRK
|
||||
644E- 00 BRK
|
||||
644F- 00 BRK
|
2078
disks/disk2_math8_math16/MATH.DEMO.S
Normal file
2078
disks/disk2_math8_math16/MATH.DEMO.S
Normal file
File diff suppressed because it is too large
Load Diff
20
disks/disk2_math8_math16/T.DECS
Normal file
20
disks/disk2_math8_math16/T.DECS
Normal file
@ -0,0 +1,20 @@
|
||||
*``````````````````````````````*
|
||||
* 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
|
||||
*
|
263
disks/disk2_math8_math16/T.MATH.DEMO
Normal file
263
disks/disk2_math8_math16/T.MATH.DEMO
Normal file
@ -0,0 +1,263 @@
|
||||
*
|
||||
********************************
|
||||
* *
|
||||
* -< MATH DEMO >- *
|
||||
* *
|
||||
* VERSION 00.00.01 *
|
||||
* *
|
||||
* 03/04/1980 *
|
||||
* *
|
||||
********************************
|
||||
* *
|
||||
* NATHAN D. RIGGS *
|
||||
* NATHAN.RIGGS@OUTLOOK.COM *
|
||||
* *
|
||||
********************************
|
||||
*
|
||||
** ASSEMBLER DIRECTIVES
|
||||
*
|
||||
CYC AVE
|
||||
EXP ONLY
|
||||
DSK MATH.DEMO
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* TOP INCLUDES (PUTS, MACROS) *
|
||||
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
||||
*
|
||||
PUT DECS
|
||||
*USE MATH.MAC ; CAN'T USE RIGHT NOW
|
||||
* BECAUSE OF MEMORY LIMITATIONS
|
||||
*
|
||||
PUT MATH.HOOKS
|
||||
*
|
||||
OBJ $BFE0
|
||||
ORG $6000
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* PROGRAM MAIN BODY *
|
||||
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
||||
*
|
||||
*
|
||||
*
|
||||
** BIG LUMPS -- HIGH LEVEL CODE
|
||||
*
|
||||
*
|
||||
*
|
||||
** ADD16 ADDS TWO 16-BIT NUMBERS AND
|
||||
** RETURNS THE RESULT IN Y(LOW) AND X (HIGH).
|
||||
*
|
||||
** MACRO: _ADD16 #1000;#2000
|
||||
*
|
||||
LDA #>1000 ; ADD1, HIGH
|
||||
PHA
|
||||
LDA #<1000 ; ADD1, LOW
|
||||
PHA
|
||||
LDA #>2000 ; ADD2, HIGH
|
||||
PHA
|
||||
LDA #<2000 ; ADD2, LOW
|
||||
PHA
|
||||
JSR ADD16
|
||||
* BRK ; X=0B, Y=B8, == 3000
|
||||
*
|
||||
** SUB16 SUBTRACTS ONE 16-BIT NUMBER
|
||||
** FROM ANOTHER, AND RETURNS RESULT IN
|
||||
** Y (LOW) AND X (HIGH)
|
||||
*
|
||||
** MACRO: _SUB16 #2000;#1000
|
||||
*
|
||||
LDA #>2000 ; MINUEND
|
||||
PHA
|
||||
LDA #<2000
|
||||
PHA
|
||||
LDA #>1000 ; SUBTRAHEND
|
||||
PHA
|
||||
LDA #<1000
|
||||
PHA
|
||||
JSR SUB16
|
||||
* BRK ; X = 03, Y = E8, == 1000
|
||||
*
|
||||
** MUL16 MULTIPLES TWO VALUES AND RETURNS THE
|
||||
** PRODUCT OVER THE STACK (LOW, HIGH)
|
||||
*
|
||||
** MACRO: _MUL16 #1000;#3
|
||||
*
|
||||
LDA #>1000
|
||||
PHA
|
||||
LDA #<1000 ; MULTIPLICAND
|
||||
PHA
|
||||
LDA #>3
|
||||
PHA
|
||||
LDA #<3 ; MULTIPLIER
|
||||
PHA
|
||||
JSR MUL16
|
||||
* BRK ; X=0B, Y=08, == 3000
|
||||
*
|
||||
** UDIV16 DVIDES ONE UNSIGNED NUMBER BY ANOTHER
|
||||
** UNSIGNED NUMBER, THEN RETURNS THE RESULT OVER
|
||||
** THE STACK (16-BIT).
|
||||
*
|
||||
** MACRO: _DIV16 #30000;#3000;U
|
||||
*
|
||||
LDA #>30000
|
||||
PHA
|
||||
LDA #<30000
|
||||
PHA
|
||||
LDA #>3000
|
||||
PHA
|
||||
LDA #<3000
|
||||
PHA
|
||||
JSR UDIV16
|
||||
*BRK ; X=00,Y=0A, == 30000/3000=10
|
||||
*
|
||||
** SDIV16 DIVIDES TWO NUMBERS THAT ARE
|
||||
** SIGNED.
|
||||
*
|
||||
** MACRO: _DIV16 #-1000;#10
|
||||
*
|
||||
LDA #>-1000
|
||||
PHA
|
||||
LDA #<-1000
|
||||
PHA
|
||||
LDA #>10
|
||||
PHA
|
||||
LDA #<10
|
||||
PHA
|
||||
JSR SDIV16
|
||||
* BRK ; X=FF,Y=9C, == -100 (2'S COMPLEMENT)
|
||||
*
|
||||
** SREM16 DIVIDES TWO NUMBERS THAT ARE
|
||||
** SIGNED, THEN RETURNS THE REMAINDER.
|
||||
*
|
||||
** MACRO: _REM16 #-1000;#13
|
||||
*
|
||||
LDA #>-1000
|
||||
PHA
|
||||
LDA #<-1000
|
||||
PHA
|
||||
LDA #>13
|
||||
PHA
|
||||
LDA #<13
|
||||
PHA
|
||||
JSR SREM16
|
||||
* BRK ; X=FF,Y=F4, == -12 (2'S COMPLEMENT)
|
||||
*
|
||||
** UREM16 DIVIDES TWO NUMBERS THAT ARE
|
||||
** UNSIGNED, THEN RETURNS THE REMAINDER.
|
||||
*
|
||||
** MACRO: _REM16 #1000;#13;U
|
||||
*
|
||||
LDA #>1000
|
||||
PHA
|
||||
LDA #<1000
|
||||
PHA
|
||||
LDA #>13
|
||||
PHA
|
||||
LDA #<13
|
||||
PHA
|
||||
JSR UREM16
|
||||
* BRK ; X=00,Y=0C, == 12
|
||||
*
|
||||
** CMP16 COMPARES TWO 16BIT VALUES, THEN
|
||||
** ALTERS THE REGISTER FLAGS AS FOLLOWS:
|
||||
*
|
||||
** MACRO: _CMP16 #1023;#123
|
||||
*
|
||||
|
||||
* IF W1 & W2 ARE 2S COMPLEMENT
|
||||
* IF W1 = W2 Z=1,N=0
|
||||
* IF W1 > W2 Z=0,N=0
|
||||
* IF W1 < W2 Z=0,N=1
|
||||
* ELSE
|
||||
* IF W1 = W2 Z=1,C=1
|
||||
* IF W1 > W2 Z=0,C=1
|
||||
* IF W1 < W2 Z=0,C=0
|
||||
*
|
||||
LDA #>1023
|
||||
PHA
|
||||
LDA #<1023
|
||||
PHA
|
||||
LDA #>123
|
||||
PHA
|
||||
LDA #<123
|
||||
PHA
|
||||
JSR CMP16
|
||||
* BRK ; P=31, == 11000100
|
||||
* ^^ N ZC
|
||||
* N (SIGN) =0, Z (ZERO) = 0, C (CARRY) = 0
|
||||
*
|
||||
** RND8 SIMPLY RETURNS A PSEUDO-RANDOM
|
||||
** NUMBER BETWEEN 0 AND 255 IN A.
|
||||
*
|
||||
** NO MACRO **
|
||||
*
|
||||
JSR RND8
|
||||
* BRK ; RUN THIS A FEW TIMES TO SEE A CHANGE
|
||||
*
|
||||
*
|
||||
** RANDB RETURNS A VALUE BETWEEN A LOW AND
|
||||
** HIGH BOUNDARY PUSHED TO THE STACK. SINCE THIS
|
||||
** RETURNS A BYTE, THE RANGE MUST BE 0..255.
|
||||
*
|
||||
** MACRO: _RANDB #50;#100
|
||||
*
|
||||
LDA #50
|
||||
PHA
|
||||
LDA #100 ; HIGH BOUND
|
||||
PHA
|
||||
JSR RANDB
|
||||
* BRK ; RUN A FEW TIMES TO SEE THE CHANGE IN A
|
||||
*
|
||||
** MUL8 MULTIPLIES TWO 8-BIT NUMBERS AND
|
||||
** RETURNS A 16BIT RESULT, ALL UNSIGNED.
|
||||
** MACRO: _MUL8 #100;#200
|
||||
*
|
||||
*
|
||||
LDA #100
|
||||
PHA
|
||||
LDA #200
|
||||
PHA
|
||||
JSR MUL8
|
||||
* BRK ; X=4E,Y=20, == 20000
|
||||
*
|
||||
** DIV8 DIVIDES ONE 8BIT NUMBER BY
|
||||
** ANOTHER (UNSIGNED), AND RETURNS
|
||||
** AN 8BIT QUOTIENT.
|
||||
**
|
||||
** THE QUOTIENT IS STORED IN A, WHILE
|
||||
** THE REMAINDER IS RETURNED IN X.
|
||||
** MACRO: _DIV8 #200;#10
|
||||
*
|
||||
*
|
||||
LDA #200
|
||||
PHA
|
||||
LDA #10
|
||||
PHA
|
||||
JSR DIV8
|
||||
*BRK ; A=14, X=0, == 20 R 0
|
||||
*
|
||||
** RND16 RETURNS A PSEUDO-RANDOM NUMBER (WORD)
|
||||
** BETWEEN 0 AND 65535 (0000-FFFF)
|
||||
*
|
||||
** NO MACRO **
|
||||
*
|
||||
JSR RND16
|
||||
*BRK ; BRUN A FEW TIMES TO SEE X,Y
|
||||
*
|
||||
*
|
||||
*
|
||||
*
|
||||
** LITTLE LUMPS -- MID/LOW LEVEL
|
||||
*
|
||||
*
|
||||
JMP REENTRY
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* BOTTOM INCLUDES *
|
||||
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
||||
*
|
||||
*
|
||||
** BOTTOM INCLUDES
|
||||
*
|
||||
PUT MATH16.LIB
|
||||
PUT MATH8.LIB
|
||||
*
|
5
disks/disk2_math8_math16/T.MATH.HOOKS
Normal file
5
disks/disk2_math8_math16/T.MATH.HOOKS
Normal file
@ -0,0 +1,5 @@
|
||||
*
|
||||
GETNUM EQU $FFA7 ; ASCII TO HEX IN 3E & 3F
|
||||
RNDL EQU $4E ; RANDOM NUMBER LOW
|
||||
RNDH EQU $4F ; RANDOM NUMBER HIGH
|
||||
*
|
350
disks/disk2_math8_math16/T.MATH.MAC
Normal file
350
disks/disk2_math8_math16/T.MATH.MAC
Normal file
@ -0,0 +1,350 @@
|
||||
*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*
|
||||
* *
|
||||
* MATH.MAC *
|
||||
* *
|
||||
* AUTHOR: NATHAN RIGGS *
|
||||
* CONTACT: NATHAN.RIGGS@ *
|
||||
* OUTLOOK.COM *
|
||||
* *
|
||||
* VERSION: 0.1.2 *
|
||||
* DATE: 30-OCT-2018 *
|
||||
* ASSEMBLER: MERLIN 8 PRO *
|
||||
* *
|
||||
* LICENSE: APACHE 2.0 LICENSE, *
|
||||
* WHERE APPLICABLE. CODE *
|
||||
* INSPIRED BY OR COPIED FROM *
|
||||
* OTHERS MAY FALL UNDER A *
|
||||
* DIFFERENT LICENSE. I WILL *
|
||||
* DO MY BEST TO NOTIFY SUCH *
|
||||
* CASES. *
|
||||
* *
|
||||
*------------------------------*
|
||||
* *
|
||||
* THIS IS A MACRO LIBRARY FOR *
|
||||
* MATH.LIB, AND CAN BE USED *
|
||||
* REGARDLESS OF WHETHER A *
|
||||
* SPECIFIC FUNCTION IS *
|
||||
* INCLUDED AS A PUT IN THE *
|
||||
* MAIN SOURCE. *
|
||||
* *
|
||||
*------------------------------*
|
||||
* *
|
||||
* LIST OF MACROS *
|
||||
* *
|
||||
* _ADD16 : 16BIT ADD *
|
||||
* _SUB16 : 16BIT SUBTRACT *
|
||||
* _MUL16 : 16BIT MULTIPLY *
|
||||
* _DIV16 : 16BIT DIVIDE *
|
||||
* _REM16 : 16BIT REMAINDER *
|
||||
* _RND8 : RANDOM # 0..255 *
|
||||
* _RNDB : RANDOM # LOW..HIGH *
|
||||
* *
|
||||
* _CMP16 : 16BIT COMPARE *
|
||||
* _RND16 : 16BIT RANDOM # *
|
||||
* _RNDW : RANDOM WORD LOW..HI *
|
||||
* _MUL8 : 8BIT MULTIPLY *
|
||||
* _DIV8 : 8BIT DIVIDE, REMAIND *
|
||||
* *
|
||||
*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*
|
||||
*
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* _ADD16 :: 16-BIT ADDITION *
|
||||
*- -*
|
||||
* ADD TWO 16BIT VALUES, STORE *
|
||||
* RESULT IN Y, X (LOW, HIGH) *
|
||||
*- -*
|
||||
* PARAMETERS: *
|
||||
* *
|
||||
* PARAM1 = ADDEND 1 *
|
||||
* PARAM2 = ADDEND 2 *
|
||||
*- -*
|
||||
* SAMPLE USAGE: *
|
||||
* *
|
||||
* _ADD16 #3000;#4000 *
|
||||
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
||||
*
|
||||
_ADD16 MAC
|
||||
LDA #>]1
|
||||
PHA
|
||||
LDA #<]1
|
||||
PHA
|
||||
LDA #>]2
|
||||
PHA
|
||||
LDA #<]2
|
||||
PHA
|
||||
JSR ADD16
|
||||
<<<
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* _SUB16 :: 16-BIT SUBTRACTION *
|
||||
*- -*
|
||||
* SUBTRACTS ONE 16BIT INTEGER *
|
||||
* FROM ANOTHER, STORING THE *
|
||||
* RESULT IN Y,X (LOW, HIGH) *
|
||||
*- -*
|
||||
* PARAMETERS: *
|
||||
* *
|
||||
* PARAM1 = MINUEND *
|
||||
* PARAM2 = SUBTRAHEND *
|
||||
*- -*
|
||||
* SAMPLE USAGE: *
|
||||
* *
|
||||
* _SUB16 #2000;#1500 *
|
||||
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
||||
*
|
||||
_SUB16 MAC
|
||||
LDA #>]1
|
||||
PHA
|
||||
LDA #<]1
|
||||
PHA
|
||||
LDA #>]2
|
||||
PHA
|
||||
LDA #<]2
|
||||
PHA
|
||||
JSR SUB16
|
||||
<<<
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* _MUL16 :: 16-BIT MULTIPLY *
|
||||
*- -*
|
||||
* MULTIPLIES TWO 16BIT NUMBERS *
|
||||
* AND RETURNS THE PRODUCT IN *
|
||||
* Y,X (LOW, HIGH). *
|
||||
*- -*
|
||||
* PARAMETERS: *
|
||||
* *
|
||||
* PARAM1 = MULTIPLICAND *
|
||||
* PARAM2 = MULTIPLIER *
|
||||
*- -*
|
||||
* SAMPLE USAGE: *
|
||||
* *
|
||||
* _MUL16 #400;#500 *
|
||||
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
||||
*
|
||||
_MUL16 MAC
|
||||
LDA #>]1
|
||||
PHA
|
||||
LDA #<]1
|
||||
PHA
|
||||
LDA #>]2
|
||||
PHA
|
||||
LDA #<]2
|
||||
PHA
|
||||
JSR MUL16
|
||||
*
|
||||
** NOW XFER STACK TO X,Y
|
||||
*
|
||||
** REALLY, THIS SHOULD BE IN THE
|
||||
** ACTUAL ROUTINE. UNNECESSARY CYCLES.
|
||||
*
|
||||
** ALSO, HAVE IT RETURN THE 24BIT IN A,
|
||||
** EVEN THOUGH IT'S CURRENTLY UNRELIABLE
|
||||
*
|
||||
PLA
|
||||
TAY
|
||||
PLA
|
||||
TAX ; HIGH
|
||||
<<<
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* _DIV16 :: 16-BIT DIVISION *
|
||||
*- -*
|
||||
* DIVIDES ONE 16BIT NUMBER BY *
|
||||
* ANOTHER AND RETURNS THE *
|
||||
* RESULT IN Y,X (LOW,HIGH). *
|
||||
* *
|
||||
* IF THE THIRD PARAMETER IS *
|
||||
* PASSED WITH A U, VALUES WILL *
|
||||
* BE TREATED AS UNSIGNED; IF *
|
||||
* NOT, VALUES WILL BE TREATED *
|
||||
* AS SIGNED. *
|
||||
*- -*
|
||||
* PARAMETERS: *
|
||||
* *
|
||||
* PARAM1 = DIVIDEND *
|
||||
* PARAM2 = DIVISOR *
|
||||
*- -*
|
||||
* SAMPLE USAGE: *
|
||||
* *
|
||||
* _DIV16 #3000;#300 *
|
||||
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
||||
*
|
||||
_DIV16 MAC
|
||||
LDA #>]1
|
||||
PHA
|
||||
LDA #<]1
|
||||
PHA
|
||||
LDA #>]2
|
||||
PHA
|
||||
LDA #>]2
|
||||
PHA
|
||||
IF U,]3 ; UNSIGNED
|
||||
JSR UDIV16
|
||||
ELSE
|
||||
JSR SDIV16 ; SIGNED
|
||||
FIN
|
||||
*
|
||||
** NOW TRANSFER STACK TO Y,X
|
||||
*
|
||||
PLA
|
||||
TAY ; LOW
|
||||
PLA
|
||||
TAX ; HIGH
|
||||
<<<
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* _REM16 :: 16-BIT DIV REMAINR *
|
||||
*- -*
|
||||
* DIVIDES ONE INTEGER BY *
|
||||
* ANOTHER AND RETURNS THE *
|
||||
* REMAINDER IN Y,X (LOW, HIGH) *
|
||||
* *
|
||||
* IF THE THIRD PARAMETER IS *
|
||||
* PASSED WITH A U, VALUES WILL *
|
||||
* BE TREATED AS UNSIGNED; IF *
|
||||
* NOT, VALUES WILL BE TREATED *
|
||||
* AS SIGNED. *
|
||||
*- -*
|
||||
* PARAMETERS: *
|
||||
* *
|
||||
* PARAM1 = DIVIDEND *
|
||||
* PARAM2 = DIVISOR *
|
||||
*- -*
|
||||
* SAMPLE USAGE: *
|
||||
* *
|
||||
* _REM16 #1000;#333 *
|
||||
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
||||
*
|
||||
_REM16 MAC
|
||||
LDA #>]1
|
||||
PHA
|
||||
LDA #<]1
|
||||
PHA
|
||||
LDA #>]2
|
||||
PHA
|
||||
LDA #>]2
|
||||
PHA
|
||||
IF U,]3 ; UNSIGNED
|
||||
JSR UREM16
|
||||
ELSE
|
||||
JSR SREM16 ; SIGNED
|
||||
FIN
|
||||
*
|
||||
** TRANSFER STACK TO Y,XX
|
||||
*
|
||||
PLA
|
||||
TAY ; LOW
|
||||
PLA
|
||||
TAX ; HIGH
|
||||
<<<
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* _RNDB :: 8BIT RANDOM LOW,HI *
|
||||
*- -*
|
||||
* RETURNS A RANDOM NUMBER IN *
|
||||
* REGISTER A THAT IS BETWEEN *
|
||||
* THE LOW AND HIGH BOUNDARIES *
|
||||
* PASSED IN THE PARAMETERS. *
|
||||
* *
|
||||
* NOTE THAT THIS RETURNS A *
|
||||
* BYTE, AND THUS ONLY DEALS *
|
||||
* WITH VALUES BETWEEN 0..255. *
|
||||
*- -*
|
||||
* PARAMETERS: *
|
||||
* *
|
||||
* PARAM1 = LOW BOUNDARY *
|
||||
* PARAM2 = HIGH BOUNDARY *
|
||||
*- -*
|
||||
* SAMPLE USAGE: *
|
||||
* *
|
||||
* _RNDB #50;#100 *
|
||||
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
||||
*
|
||||
_RNDB MAC
|
||||
LDA ]1 ; LOW
|
||||
PHA
|
||||
LDA ]2 ; HIGH
|
||||
PHA
|
||||
JSR RANDB
|
||||
<<<
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* _CMP16 : 16BIT COMPARISON *
|
||||
*- -*
|
||||
* COMPARES TWO 16BIT VALUES *
|
||||
* AND ALTERS THE P-REGISTER *
|
||||
* ACCORDINGLY (FLAGS). *
|
||||
*- -*
|
||||
* PARAMETERS: *
|
||||
* *
|
||||
* PARAM1 = WORD 1 TO COMPARE *
|
||||
* PARAM2 = WORD 2 TO COMPARE *
|
||||
*- -*
|
||||
* SAMPLE USAGE: *
|
||||
* *
|
||||
* _CMP16 #1023;#3021 *
|
||||
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
||||
*
|
||||
_CMP16 MAC
|
||||
LDA #>]1
|
||||
PHA
|
||||
LDA #<]1
|
||||
PHA
|
||||
LDA #>]2
|
||||
PHA
|
||||
LDA #<]2
|
||||
PHA
|
||||
JSR CMP16
|
||||
<<<
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* _MUL8 :: 8BIT MULTIPLICATION *
|
||||
*- -*
|
||||
* MULTIPLIES TWO 8BIT VALUES *
|
||||
* AND RETURNS A 16BIT RESULT *
|
||||
* IN Y,X (LOW, HIGH). *
|
||||
*- -*
|
||||
* PARAMETERS: *
|
||||
* *
|
||||
* PARAM1 = MULTIPLICAND *
|
||||
* PARAM2 = MULTIPLIER *
|
||||
*- -*
|
||||
* SAMPLE USAGE: *
|
||||
* *
|
||||
* _MUL8 #10;#20 *
|
||||
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
||||
*
|
||||
_MUL8 MAC
|
||||
LDA ]1
|
||||
PHA
|
||||
LDA ]2
|
||||
PHA
|
||||
JSR MUL8
|
||||
<<<
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* _DIV8 :: 8BIT MULTIPLICATION *
|
||||
*- -*
|
||||
* DIVIDES ONE 8BIT NUMBER BY *
|
||||
* ANOTHER AND STORES THE *
|
||||
* QUOTIENT IN A WITH THE *
|
||||
* REMAINDER IN X. *
|
||||
*- -*
|
||||
* PARAMETERS: *
|
||||
* *
|
||||
* PARAM1 = DIVIDEND *
|
||||
* PARAM2 = DIVISOR *
|
||||
*- -*
|
||||
* SAMPLE USAGE: *
|
||||
* *
|
||||
* _DIV8 #100;#10 *
|
||||
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
||||
*
|
||||
_DIV8 MAC
|
||||
LDA ]1
|
||||
PHA
|
||||
LDA ]2
|
||||
PHA
|
||||
JSR DIV8
|
||||
<<<
|
108
disks/disk2_math8_math16/T.MATH16.ADD16
Normal file
108
disks/disk2_math8_math16/T.MATH16.ADD16
Normal file
@ -0,0 +1,108 @@
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* 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
|
144
disks/disk2_math8_math16/T.MATH16.CMP16
Normal file
144
disks/disk2_math8_math16/T.MATH16.CMP16
Normal file
@ -0,0 +1,144 @@
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* 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
|
335
disks/disk2_math8_math16/T.MATH16.DIV16
Normal file
335
disks/disk2_math8_math16/T.MATH16.DIV16
Normal file
@ -0,0 +1,335 @@
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* 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
|
995
disks/disk2_math8_math16/T.MATH16.LIB
Normal file
995
disks/disk2_math8_math16/T.MATH16.LIB
Normal file
@ -0,0 +1,995 @@
|
||||
*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*
|
||||
* *
|
||||
* MATH.LIB *
|
||||
* *
|
||||
* AUTHOR: NATHAN RIGGS *
|
||||
* CONTACT: NATHAN.RIGGS@ *
|
||||
* OUTLOOK.COM *
|
||||
* *
|
||||
* VERSION: 0.1.2 *
|
||||
* DATE: 30-OCT-2018 *
|
||||
* ASSEMBLER: MERLIN 8 PRO *
|
||||
* *
|
||||
* LICENSE: APACHE 2.0, WHERE *
|
||||
* APPLICABLE. CODE INSPIRED *
|
||||
* BY THE WORKS OF OTHERS MAY *
|
||||
* FALL UNDER A DIFFERENT *
|
||||
* LICENSE (NOTED IN ROUTINE). *
|
||||
* *
|
||||
* STANDARD INTEGER MATH *
|
||||
* LIBRARY FOR 8-BIT AND 16-BIT *
|
||||
* CALCALUATIONS, AS WELL AS *
|
||||
* COMMON ROUTINES LIKE PSEUDO- *
|
||||
* RANDOM NUMBER GENERATORS. *
|
||||
* *
|
||||
*------------------------------*
|
||||
* *
|
||||
* LIST OF ROUTINES *
|
||||
* *
|
||||
* ADD16 : 16BIT ADD *
|
||||
* SUB16 : 16BIT SUBTRACT *
|
||||
* MUL16 : 16BIT MULTIPLY *
|
||||
* SDIV16 : 16BIT DIVIDE (SIGN) *
|
||||
* UDIV16 : 16BIT DIVIDE (UNSN) *
|
||||
* SREM16 : 16BIT REMNDR (SIGN) *
|
||||
* UREM16 : 16BIT REMNDR (UNSN) *
|
||||
* CMP16 : 16BIT COMPARE *
|
||||
* RND16 : RANDOM # 0..65535 *
|
||||
* *
|
||||
*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* 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
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* 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
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* 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
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* 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
|
||||
*
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* 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
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* 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
|
||||
*
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* RANDW :: RANDOM WORD *
|
||||
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
||||
*
|
||||
*
|
||||
** THIS WILL BE INCLUDED IN FUTURE UPDATES
|
||||
*
|
||||
*
|
164
disks/disk2_math8_math16/T.MATH16.MUL16
Normal file
164
disks/disk2_math8_math16/T.MATH16.MUL16
Normal file
@ -0,0 +1,164 @@
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* 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
|
84
disks/disk2_math8_math16/T.MATH16.RND16
Normal file
84
disks/disk2_math8_math16/T.MATH16.RND16
Normal file
@ -0,0 +1,84 @@
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* 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
|
110
disks/disk2_math8_math16/T.MATH16.SUB16
Normal file
110
disks/disk2_math8_math16/T.MATH16.SUB16
Normal file
@ -0,0 +1,110 @@
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* 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
|
93
disks/disk2_math8_math16/T.MATH8.DIV8
Normal file
93
disks/disk2_math8_math16/T.MATH8.DIV8
Normal file
@ -0,0 +1,93 @@
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* 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
|
||||
*
|
400
disks/disk2_math8_math16/T.MATH8.LIB
Normal file
400
disks/disk2_math8_math16/T.MATH8.LIB
Normal file
@ -0,0 +1,400 @@
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* 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
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* 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
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* 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
|
||||
*
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* 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
|
||||
*
|
100
disks/disk2_math8_math16/T.MATH8.MUL8
Normal file
100
disks/disk2_math8_math16/T.MATH8.MUL8
Normal file
@ -0,0 +1,100 @@
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* 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
|
151
disks/disk2_math8_math16/T.MATH8.RANDB
Normal file
151
disks/disk2_math8_math16/T.MATH8.RANDB
Normal file
@ -0,0 +1,151 @@
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* 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
|
55
disks/disk2_math8_math16/T.MATH8.RND8
Normal file
55
disks/disk2_math8_math16/T.MATH8.RND8
Normal file
@ -0,0 +1,55 @@
|
||||
*
|
||||
*``````````````````````````````*
|
||||
* 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
|
Loading…
x
Reference in New Issue
Block a user