added disk2: math libary

integer math for 8 and 16 bit operations. Expected to grow substantially.
This commit is contained in:
nathanriggs 2018-11-07 12:44:04 -05:00
parent 9849dbb5ea
commit ddeb2e706b
20 changed files with 6022 additions and 6 deletions

View File

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

View File

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

View 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

File diff suppressed because it is too large Load Diff

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

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

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

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

View 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

View 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

View 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

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

View 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

View 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

View 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

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

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

View 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

View 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

View 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