added disk 4, strings library

This commit is contained in:
nathanriggs 2018-11-14 19:02:04 -05:00
parent eb2b7deea0
commit 8d0c21e0c7
17 changed files with 7150 additions and 0 deletions

View File

@ -0,0 +1,875 @@
6000- 4C 24 60 JMP $6024
6003- 0F ???
6004- D4 ???
6005- C8 INY
6006- C9 DA CMP #$DA
6008- A0 C9 LDY #$C9
600A- D3 ???
600B- A0 D3 LDY #$D3
600D- D4 ???
600E- D2 C9 CMP ($C9)
6010- CE C7 B1 DEC $B1C7
6013- 10 D4 BPL $5FE9
6015- C8 INY
6016- C9 D3 CMP #$D3
6018- A0 C9 LDY #$C9
601A- D3 ???
601B- A0 D3 LDY #$D3
601D- D4 ???
601E- D2 C9 CMP ($C9)
6020- CE C7 A0 DEC $A0C7
6023- B2 A9 LDA ($A9)
6025- 60 RTS
6026- 48 PHA
6027- A9 03 LDA #$03
6029- 48 PHA
602A- A9 60 LDA #$60
602C- 48 PHA
602D- A9 13 LDA #$13
602F- 48 PHA
6030- 20 3D 61 JSR $613D
6033- 4C 42 60 JMP $6042
6036- 03 ???
6037- C1 C2 CMP ($C2,X)
6039- C3 ???
603A- 03 ???
603B- A0 A0 LDY #$A0
603D- A0 03 LDY #$03
603F- C4 C5 CPY $C5
6041- C6 A9 DEC $A9
6043- 60 RTS
6044- 48 PHA
6045- A9 36 LDA #$36
6047- 48 PHA
6048- A9 60 LDA #$60
604A- 48 PHA
604B- A9 3E LDA #$3E
604D- 48 PHA
604E- A9 07 LDA #$07
6050- 48 PHA
6051- 20 7D 61 JSR $617D
6054- A2 60 LDX #$60
6056- A0 36 LDY #$36
6058- A9 60 LDA #$60
605A- 48 PHA
605B- A9 36 LDA #$36
605D- 48 PHA
605E- 20 5D 62 JSR $625D
6061- 4C 66 60 JMP $6066
6064- 2B ???
6065- 67 ???
6066- A9 03 LDA #$03
6068- 48 PHA
6069- A9 00 LDA #$00
606B- 48 PHA
606C- A9 2B LDA #$2B
606E- 48 PHA
606F- A9 67 LDA #$67
6071- 48 PHA
6072- 20 8F 62 JSR $628F
6075- A9 03 LDA #$03
6077- 48 PHA
6078- A9 00 LDA #$00
607A- 48 PHA
607B- 20 3A 63 JSR $633A
607E- A9 60 LDA #$60
6080- 48 PHA
6081- A9 90 LDA #$90
6083- 48 PHA
6084- A9 60 LDA #$60
6086- 48 PHA
6087- A9 9F LDA #$9F
6089- 48 PHA
608A- 20 FD 63 JSR $63FD
608D- 4C A9 60 JMP $60A9
6090- 0E D4 C8 ASL $C8D4
6093- C9 D3 CMP #$D3
6095- A0 C9 LDY #$C9
6097- D3 ???
6098- A0 C1 LDY #$C1
609A- A0 D4 LDY #$D4
609C- C5 D3 CMP $D3
609E- D4 ???
609F- 09 C9 ORA #$C9
60A1- D3 ???
60A2- A0 C1 LDY #$C1
60A4- A0 D4 LDY #$D4
60A6- C5 D3 CMP $D3
60A8- D4 ???
60A9- A9 60 LDA #$60
60AB- 48 PHA
60AC- A9 C4 LDA #$C4
60AE- 48 PHA
60AF- A9 05 LDA #$05
60B1- 48 PHA
60B2- A9 05 LDA #$05
60B4- 48 PHA
60B5- A9 60 LDA #$60
60B7- 48 PHA
60B8- A9 D5 LDA #$D5
60BA- 48 PHA
60BB- A9 0F LDA #$0F
60BD- 48 PHA
60BE- 20 85 64 JSR $6485
60C1- 4C E8 60 JMP $60E8
60C4- 10 B0 BPL $6076
60C6- B1 B2 LDA ($B2),Y
60C8- B3 ???
60C9- B4 B5 LDY $B5,X
60CB- B6 B7 LDX $B7,Y
60CD- B8 CLV
60CE- B9 B0 B1 LDA $B1B0,Y
60D1- B2 B3 LDA ($B3)
60D3- B4 B5 LDY $B5,X
60D5- 12 B0 ORA ($B0)
60D7- B0 B0 BCS $6089
60D9- B0 B0 BCS $608B
60DB- B0 B0 BCS $608D
60DD- B0 B0 BCS $608F
60DF- B0 B0 BCS $6091
60E1- B0 B0 BCS $6093
60E3- B0 B0 BCS $6095
60E5- B0 B0 BCS $6097
60E7- B0 A2 BCS $608B
60E9- 60 RTS
60EA- A0 D5 LDY #$D5
60EC- A9 60 LDA #$60
60EE- 48 PHA
60EF- A9 C4 LDA #$C4
60F1- 48 PHA
60F2- A9 01 LDA #$01
60F4- 48 PHA
60F5- A9 05 LDA #$05
60F7- 48 PHA
60F8- 20 3C 65 JSR $653C
60FB- A2 60 LDX #$60
60FD- A0 C4 LDY #$C4
60FF- A9 61 LDA #$61
6101- 48 PHA
6102- A9 19 LDA #$19
6104- 48 PHA
6105- A9 03 LDA #$03
6107- 48 PHA
6108- A9 C8 LDA #$C8
610A- 48 PHA
610B- A9 61 LDA #$61
610D- 48 PHA
610E- A9 2D LDA #$2D
6110- 48 PHA
6111- 20 CC 65 JSR $65CC
6114- A0 19 LDY #$19
6116- A2 61 LDX #$61
6118- 00 BRK
6119- 09 D8 ORA #$D8
611B- D8 CLD
611C- D8 CLD
611D- D8 CLD
611E- D8 CLD
611F- D8 CLD
6120- D8 CLD
6121- D8 CLD
6122- D8 CLD
6123- 09 B9 ORA #$B9
6125- B9 B9 B9 LDA $B9B9,Y
6128- B9 B9 B9 LDA $B9B9,Y
612B- B9 B9 09 LDA $09B9,Y
612E- B1 B1 LDA ($B1),Y
6130- B1 B1 LDA ($B1),Y
6132- B1 B1 LDA ($B1),Y
6134- B1 B1 LDA ($B1),Y
6136- B1 4C LDA ($4C),Y
6138- D0 03 BNE $613D
613A- 4C FA 63 JMP $63FA
613D- 68 PLA
613E- 85 FE STA $FE
6140- 68 PLA
6141- 85 FF STA $FF
6143- 68 PLA
6144- 85 08 STA $08
6146- 68 PLA
6147- 85 09 STA $09
6149- 68 PLA
614A- 85 06 STA $06
614C- 68 PLA
614D- 85 07 STA $07
614F- A0 00 LDY #$00
6151- B1 06 LDA ($06),Y
6153- D1 08 CMP ($08),Y
6155- 90 02 BCC $6159
6157- B1 08 LDA ($08),Y
6159- AA TAX
615A- F0 0C BEQ $6168
615C- A0 01 LDY #$01
615E- B1 06 LDA ($06),Y
6160- D1 08 CMP ($08),Y
6162- D0 0A BNE $616E
6164- C8 INY
6165- CA DEX
6166- D0 F6 BNE $615E
6168- A0 00 LDY #$00
616A- B1 06 LDA ($06),Y
616C- D1 08 CMP ($08),Y
616E- A5 FF LDA $FF
6170- 48 PHA
6171- A5 FE LDA $FE
6173- 48 PHA
6174- A0 00 LDY #$00
6176- B1 06 LDA ($06),Y
6178- AA TAX
6179- B1 08 LDA ($08),Y
617B- A8 TAY
617C- 60 RTS
617D- 68 PLA
617E- 85 FE STA $FE
6180- 68 PLA
6181- 85 FF STA $FF
6183- 68 PLA
6184- 8D 19 62 STA $6219
6187- 68 PLA
6188- 85 08 STA $08
618A- 68 PLA
618B- 85 09 STA $09
618D- 68 PLA
618E- 85 06 STA $06
6190- 68 PLA
6191- 85 07 STA $07
6193- A0 00 LDY #$00
6195- B1 06 LDA ($06),Y
6197- 8D 15 62 STA $6215
619A- 8D 16 62 STA $6216
619D- EE 16 62 INC $6216
61A0- B1 08 LDA ($08),Y
61A2- 8D 17 62 STA $6217
61A5- A9 01 LDA #$01
61A7- 8D 18 62 STA $6218
61AA- AD 17 62 LDA $6217
61AD- 18 CLC
61AE- 6D 15 62 ADC $6215
61B1- 8D 14 62 STA $6214
61B4- B0 07 BCS $61BD
61B6- CD 19 62 CMP $6219
61B9- F0 1C BEQ $61D7
61BB- 90 1A BCC $61D7
61BD- A9 FF LDA #$FF
61BF- 8D 1B 62 STA $621B
61C2- AD 19 62 LDA $6219
61C5- 38 SEC
61C6- ED 15 62 SBC $6215
61C9- 90 34 BCC $61FF
61CB- 8D 1A 62 STA $621A
61CE- AD 19 62 LDA $6219
61D1- 8D 15 62 STA $6215
61D4- 4C E5 61 JMP $61E5
61D7- 8D 15 62 STA $6215
61DA- A9 00 LDA #$00
61DC- 8D 1B 62 STA $621B
61DF- AD 17 62 LDA $6217
61E2- 8D 1A 62 STA $621A
61E5- AD 1A 62 LDA $621A
61E8- F0 15 BEQ $61FF
61EA- AC 18 62 LDY $6218
61ED- B1 08 LDA ($08),Y
61EF- AC 16 62 LDY $6216
61F2- 91 06 STA ($06),Y
61F4- EE 16 62 INC $6216
61F7- EE 18 62 INC $6218
61FA- CE 1A 62 DEC $621A
61FD- D0 EB BNE $61EA
61FF- A5 FF LDA $FF
6201- 48 PHA
6202- A5 FE LDA $FE
6204- 48 PHA
6205- AD 15 62 LDA $6215
6208- A0 00 LDY #$00
620A- 91 06 STA ($06),Y
620C- AD 1B 62 LDA $621B
620F- 6A ROR
6210- AE 14 62 LDX $6214
6213- 60 RTS
6214- 00 BRK
6215- 00 BRK
6216- 00 BRK
6217- 00 BRK
6218- 00 BRK
6219- 00 BRK
621A- 00 BRK
621B- 00 BRK
621C- EA NOP
621D- 60 RTS
621E- 68 PLA
621F- 85 FE STA $FE
6221- 68 PLA
6222- 85 FF STA $FF
6224- 68 PLA
6225- 85 08 STA $08
6227- 68 PLA
6228- 85 09 STA $09
622A- 68 PLA
622B- 85 06 STA $06
622D- 68 PLA
622E- 85 07 STA $07
6230- A0 00 LDY #$00
6232- B1 06 LDA ($06),Y
6234- 8D 5C 62 STA $625C
6237- A0 01 LDY #$01
6239- B1 06 LDA ($06),Y
623B- 91 08 STA ($08),Y
623D- C8 INY
623E- CC 5C 62 CPY $625C
6241- D0 F6 BNE $6239
6243- C8 INY
6244- A9 8D LDA #$8D
6246- 91 08 STA ($08),Y
6248- A9 00 LDA #$00
624A- 91 08 STA ($08),Y
624C- 84 08 STY $08
624E- 86 09 STX $09
6250- A5 FF LDA $FF
6252- 48 PHA
6253- A5 FE LDA $FE
6255- 48 PHA
6256- AD 5C 62 LDA $625C
6259- 69 02 ADC #$02
625B- 60 RTS
625C- 00 BRK
625D- 68 PLA
625E- 85 FE STA $FE
6260- 68 PLA
6261- 85 FF STA $FF
6263- 68 PLA
6264- 85 06 STA $06
6266- 68 PLA
6267- 85 07 STA $07
6269- A0 00 LDY #$00
626B- B1 06 LDA ($06),Y
626D- 8D 8E 62 STA $628E
6270- C8 INY
6271- B1 06 LDA ($06),Y
6273- 20 F0 FD JSR $FDF0 F8ROM:COUT1
6276- CC 8E 62 CPY $628E
6279- D0 F5 BNE $6270
627B- A0 00 LDY #$00
627D- B1 06 LDA ($06),Y
627F- A5 FF LDA $FF
6281- 48 PHA
6282- A5 FE LDA $FE
6284- 48 PHA
6285- A0 00 LDY #$00
6287- B1 06 LDA ($06),Y
6289- A4 06 LDY $06
628B- A6 07 LDX $07
628D- 60 RTS
628E- 00 BRK
628F- 68 PLA
6290- 85 FE STA $FE
6292- 68 PLA
6293- 85 FF STA $FF
6295- 68 PLA
6296- 8D 36 63 STA $6336
6299- 68 PLA
629A- 8D 37 63 STA $6337
629D- 8D 35 63 STA $6335
62A0- 10 11 BPL $62B3
62A2- A9 00 LDA #$00
62A4- 38 SEC
62A5- ED 36 63 SBC $6336
62A8- 8D 36 63 STA $6336
62AB- A9 00 LDA #$00
62AD- ED 37 63 SBC $6337
62B0- 8D 37 63 STA $6337
62B3- 68 PLA
62B4- 85 06 STA $06
62B6- 68 PLA
62B7- 85 07 STA $07
62B9- A9 00 LDA #$00
62BB- A0 00 LDY #$00
62BD- 91 06 STA ($06),Y
62BF- A9 00 LDA #$00
62C1- 8D 38 63 STA $6338
62C4- 8D 39 63 STA $6339
62C7- A2 10 LDX #$10
62C9- 18 CLC
62CA- 2E 36 63 ROL $6336
62CD- 2E 37 63 ROL $6337
62D0- 2E 38 63 ROL $6338
62D3- 2E 39 63 ROL $6339
62D6- 38 SEC
62D7- AD 38 63 LDA $6338
62DA- E9 0A SBC #$0A
62DC- A8 TAY
62DD- AD 39 63 LDA $6339
62E0- E9 00 SBC #$00
62E2- 90 06 BCC $62EA
62E4- 8C 38 63 STY $6338
62E7- 8D 39 63 STA $6339
62EA- CA DEX
62EB- D0 DD BNE $62CA
62ED- 2E 36 63 ROL $6336
62F0- 2E 37 63 ROL $6337
62F3- AD 38 63 LDA $6338
62F6- 18 CLC
62F7- 69 B0 ADC #$B0
62F9- 20 15 63 JSR $6315
62FC- AD 36 63 LDA $6336
62FF- 0D 37 63 ORA $6337
6302- D0 BB BNE $62BF
6304- AD 35 63 LDA $6335
6307- 10 05 BPL $630E
6309- A9 2D LDA #$2D
630B- 20 15 63 JSR $6315
630E- A5 FF LDA $FF
6310- 48 PHA
6311- A5 FE LDA $FE
6313- 48 PHA
6314- 60 RTS
6315- 48 PHA
6316- A0 00 LDY #$00
6318- B1 06 LDA ($06),Y
631A- A8 TAY
631B- F0 09 BEQ $6326
631D- B1 06 LDA ($06),Y
631F- C8 INY
6320- 91 06 STA ($06),Y
6322- 88 DEY
6323- 88 DEY
6324- D0 F7 BNE $631D
6326- 68 PLA
6327- A0 01 LDY #$01
6329- 91 06 STA ($06),Y
632B- A0 00 LDY #$00
632D- B1 06 LDA ($06),Y
632F- 18 CLC
6330- 69 01 ADC #$01
6332- 91 06 STA ($06),Y
6334- 60 RTS
6335- 00 BRK
6336- 00 BRK
6337- 00 BRK
6338- 00 BRK
6339- 00 BRK
633A- 68 PLA
633B- 85 FE STA $FE
633D- 68 PLA
633E- 85 FF STA $FF
6340- 68 PLA
6341- 85 06 STA $06
6343- 68 PLA
6344- 85 07 STA $07
6346- A0 00 LDY #$00
6348- B1 06 LDA ($06),Y
634A- AA TAX
634B- A9 01 LDA #$01
634D- 8D F9 63 STA $63F9
6350- A9 00 LDA #$00
6352- 8D F6 63 STA $63F6
6355- 8D F7 63 STA $63F7
6358- 8D F8 63 STA $63F8
635B- 8A TXA
635C- D0 03 BNE $6361
635E- 4C E5 63 JMP $63E5
6361- AC F9 63 LDY $63F9
6364- B1 06 LDA ($06),Y
6366- C9 2D CMP #$2D
6368- D0 0E BNE $6378
636A- A9 FF LDA #$FF
636C- 8D F8 63 STA $63F8
636F- EE F9 63 INC $63F9
6372- CA DEX
6373- F0 70 BEQ $63E5
6375- 4C 82 63 JMP $6382
6378- C9 2B CMP #$2B
637A- D0 0B BNE $6387
637C- EE F9 63 INC $63F9
637F- CA DEX
6380- F0 63 BEQ $63E5
6382- AC F9 63 LDY $63F9
6385- B1 06 LDA ($06),Y
6387- C9 B0 CMP #$B0
6389- 30 5A BMI $63E5
638B- C9 BA CMP #$BA
638D- 10 56 BPL $63E5
638F- 48 PHA
6390- 0E F6 63 ASL $63F6
6393- 2E F7 63 ROL $63F7
6396- AD F6 63 LDA $63F6
6399- AC F7 63 LDY $63F7
639C- 0E F6 63 ASL $63F6
639F- 2E F7 63 ROL $63F7
63A2- 0E F6 63 ASL $63F6
63A5- 2E F7 63 ROL $63F7
63A8- 18 CLC
63A9- 6D F6 63 ADC $63F6
63AC- 8D F6 63 STA $63F6
63AF- 98 TYA
63B0- 6D F7 63 ADC $63F7
63B3- 8D F7 63 STA $63F7
63B6- 68 PLA
63B7- 38 SEC
63B8- E9 B0 SBC #$B0
63BA- 18 CLC
63BB- 6D F6 63 ADC $63F6
63BE- 8D F6 63 STA $63F6
63C1- 90 03 BCC $63C6
63C3- EE F7 63 INC $63F7
63C6- EE F9 63 INC $63F9
63C9- CA DEX
63CA- D0 B6 BNE $6382
63CC- AD F8 63 LDA $63F8
63CF- 10 11 BPL $63E2
63D1- A9 00 LDA #$00
63D3- 38 SEC
63D4- ED F6 63 SBC $63F6
63D7- 8D F6 63 STA $63F6
63DA- A9 00 LDA #$00
63DC- ED F7 63 SBC $63F7
63DF- 8D F7 63 STA $63F7
63E2- 18 CLC
63E3- 90 01 BCC $63E6
63E5- 38 SEC
63E6- A5 FF LDA $FF
63E8- 48 PHA
63E9- A5 FE LDA $FE
63EB- 48 PHA
63EC- AE F7 63 LDX $63F7
63EF- AC F6 63 LDY $63F6
63F2- AD F9 63 LDA $63F9
63F5- 60 RTS
63F6- 00 BRK
63F7- 00 BRK
63F8- 00 BRK
63F9- 00 BRK
63FA- 4C AA 66 JMP $66AA
63FD- 68 PLA
63FE- 85 FE STA $FE
6400- 68 PLA
6401- 85 FF STA $FF
6403- 68 PLA
6404- 85 08 STA $08
6406- 68 PLA
6407- 85 09 STA $09
6409- 68 PLA
640A- 85 06 STA $06
640C- 68 PLA
640D- 85 07 STA $07
640F- A5 FF LDA $FF
6411- 48 PHA
6412- A5 FE LDA $FE
6414- 48 PHA
6415- A0 00 LDY #$00
6417- B1 06 LDA ($06),Y
6419- F0 5F BEQ $647A
641B- 8D 7F 64 STA $647F
641E- B1 08 LDA ($08),Y
6420- F0 58 BEQ $647A
6422- 8D 80 64 STA $6480
6425- AD 80 64 LDA $6480
6428- CD 7F 64 CMP $647F
642B- F0 02 BEQ $642F
642D- B0 4B BCS $647A
642F- A9 01 LDA #$01
6431- 8D 81 64 STA $6481
6434- AD 7F 64 LDA $647F
6437- 38 SEC
6438- ED 80 64 SBC $6480
643B- 8D 83 64 STA $6483
643E- EE 83 64 INC $6483
6441- AD 81 64 LDA $6481
6444- 8D 84 64 STA $6484
6447- A9 01 LDA #$01
6449- 8D 82 64 STA $6482
644C- AC 84 64 LDY $6484
644F- B1 06 LDA ($06),Y
6451- AC 82 64 LDY $6482
6454- D1 08 CMP ($08),Y
6456- D0 12 BNE $646A
6458- AC 82 64 LDY $6482
645B- CC 80 64 CPY $6480
645E- F0 14 BEQ $6474
6460- C8 INY
6461- 8C 82 64 STY $6482
6464- EE 84 64 INC $6484
6467- 4C 4C 64 JMP $644C
646A- EE 81 64 INC $6481
646D- CE 83 64 DEC $6483
6470- D0 CF BNE $6441
6472- F0 06 BEQ $647A
6474- AD 81 64 LDA $6481
6477- 4C 7E 64 JMP $647E
647A- A9 00 LDA #$00
647C- 85 FA STA $FA
647E- 60 RTS
647F- 00 BRK
6480- 00 BRK
6481- 00 BRK
6482- 00 BRK
6483- 00 BRK
6484- 00 BRK
6485- 68 PLA
6486- 85 FE STA $FE
6488- 68 PLA
6489- 85 FF STA $FF
648B- 68 PLA
648C- 8D 38 65 STA $6538
648F- 68 PLA
6490- 85 08 STA $08
6492- 68 PLA
6493- 85 09 STA $09
6495- 68 PLA
6496- 8D 39 65 STA $6539
6499- 68 PLA
649A- 8D 3A 65 STA $653A
649D- 68 PLA
649E- 85 06 STA $06
64A0- 68 PLA
64A1- 85 07 STA $07
64A3- A5 FF LDA $FF
64A5- 48 PHA
64A6- A5 FE LDA $FE
64A8- 48 PHA
64A9- A9 00 LDA #$00
64AB- 8D 37 65 STA $6537
64AE- 8D 3B 65 STA $653B
64B1- AD 39 65 LDA $6539
64B4- F0 74 BEQ $652A
64B6- AD 38 65 LDA $6538
64B9- F0 72 BEQ $652D
64BB- AD 3A 65 LDA $653A
64BE- F0 6D BEQ $652D
64C0- A0 00 LDY #$00
64C2- B1 06 LDA ($06),Y
64C4- 8D 36 65 STA $6536
64C7- CD 3A 65 CMP $653A
64CA- 90 61 BCC $652D
64CC- AD 3A 65 LDA $653A
64CF- 18 CLC
64D0- 6D 39 65 ADC $6539
64D3- B0 09 BCS $64DE
64D5- AA TAX
64D6- CA DEX
64D7- EC 36 65 CPX $6536
64DA- 90 14 BCC $64F0
64DC- F0 12 BEQ $64F0
64DE- AD 36 65 LDA $6536
64E1- 38 SEC
64E2- ED 3A 65 SBC $653A
64E5- 8D 39 65 STA $6539
64E8- EE 39 65 INC $6539
64EB- A9 FF LDA #$FF
64ED- 8D 3B 65 STA $653B
64F0- AD 39 65 LDA $6539
64F3- CD 38 65 CMP $6538
64F6- 90 0D BCC $6505
64F8- F0 0B BEQ $6505
64FA- AD 38 65 LDA $6538
64FD- 8D 39 65 STA $6539
6500- A9 FF LDA #$FF
6502- 8D 3B 65 STA $653B
6505- AE 39 65 LDX $6539
6508- F0 23 BEQ $652D
650A- A9 01 LDA #$01
650C- 8D 37 65 STA $6537
650F- AC 3A 65 LDY $653A
6512- B1 06 LDA ($06),Y
6514- AC 37 65 LDY $6537
6517- 91 08 STA ($08),Y
6519- EE 3A 65 INC $653A
651C- EE 37 65 INC $6537
651F- CA DEX
6520- D0 ED BNE $650F
6522- CE 37 65 DEC $6537
6525- AD 3B 65 LDA $653B
6528- D0 03 BNE $652D
652A- 18 CLC
652B- 90 01 BCC $652E
652D- 38 SEC
652E- AD 37 65 LDA $6537
6531- A0 00 LDY #$00
6533- 91 08 STA ($08),Y
6535- 60 RTS
6536- 00 BRK
6537- 00 BRK
6538- 00 BRK
6539- 00 BRK
653A- 00 BRK
653B- 00 BRK
653C- 68 PLA
653D- A8 TAY
653E- 68 PLA
653F- AA TAX
6540- 68 PLA
6541- 8D C8 65 STA $65C8
6544- 68 PLA
6545- 8D C9 65 STA $65C9
6548- 68 PLA
6549- 85 06 STA $06
654B- 68 PLA
654C- 85 07 STA $07
654E- 8A TXA
654F- 48 PHA
6550- 98 TYA
6551- 48 PHA
6552- A0 00 LDY #$00
6554- 8C CB 65 STY $65CB
6557- B1 06 LDA ($06),Y
6559- 8D C7 65 STA $65C7
655C- AD C8 65 LDA $65C8
655F- F0 5A BEQ $65BB
6561- AD C9 65 LDA $65C9
6564- F0 58 BEQ $65BE
6566- AD C7 65 LDA $65C7
6569- CD C9 65 CMP $65C9
656C- 90 50 BCC $65BE
656E- AD C9 65 LDA $65C9
6571- 18 CLC
6572- 6D C8 65 ADC $65C8
6575- B0 11 BCS $6588
6577- 8D CA 65 STA $65CA
657A- AA TAX
657B- CA DEX
657C- EC C7 65 CPX $65C7
657F- 90 15 BCC $6596
6581- F0 05 BEQ $6588
6583- A9 FF LDA #$FF
6585- 8D CB 65 STA $65CB
6588- AE C9 65 LDX $65C9
658B- CA DEX
658C- 8E C7 65 STX $65C7
658F- AD CB 65 LDA $65CB
6592- F0 27 BEQ $65BB
6594- D0 28 BNE $65BE
6596- AD C7 65 LDA $65C7
6599- 38 SEC
659A- ED CA 65 SBC $65CA
659D- AA TAX
659E- E8 INX
659F- F0 1A BEQ $65BB
65A1- AC CA 65 LDY $65CA
65A4- B1 06 LDA ($06),Y
65A6- AC C9 65 LDY $65C9
65A9- 91 06 STA ($06),Y
65AB- EE C9 65 INC $65C9
65AE- EE CA 65 INC $65CA
65B1- CA DEX
65B2- D0 ED BNE $65A1
65B4- AE C9 65 LDX $65C9
65B7- CA DEX
65B8- 8E C7 65 STX $65C7
65BB- 18 CLC
65BC- 90 01 BCC $65BF
65BE- 38 SEC
65BF- AD C7 65 LDA $65C7
65C2- A0 00 LDY #$00
65C4- 91 06 STA ($06),Y
65C6- 60 RTS
65C7- 00 BRK
65C8- 00 BRK
65C9- 00 BRK
65CA- 00 BRK
65CB- 00 BRK
65CC- 68 PLA
65CD- A8 TAY
65CE- 68 PLA
65CF- AA TAX
65D0- 68 PLA
65D1- 85 08 STA $08
65D3- 68 PLA
65D4- 85 09 STA $09
65D6- 68 PLA
65D7- 8D A5 66 STA $66A5
65DA- 68 PLA
65DB- 8D A6 66 STA $66A6
65DE- 68 PLA
65DF- 85 06 STA $06
65E1- 68 PLA
65E2- 85 07 STA $07
65E4- 8A TXA
65E5- 48 PHA
65E6- 98 TYA
65E7- 48 PHA
65E8- A9 00 LDA #$00
65EA- 8D A9 66 STA $66A9
65ED- A0 00 LDY #$00
65EF- B1 06 LDA ($06),Y
65F1- 8D A2 66 STA $66A2
65F4- B1 08 LDA ($08),Y
65F6- 8D A3 66 STA $66A3
65F9- D0 03 BNE $65FE
65FB- 4C 96 66 JMP $6696
65FE- AD A6 66 LDA $66A6
6601- D0 03 BNE $6606
6603- 4C 99 66 JMP $6699
6606- AD A3 66 LDA $66A3
6609- 18 CLC
660A- 6D A2 66 ADC $66A2
660D- B0 07 BCS $6616
660F- CD A5 66 CMP $66A5
6612- 90 15 BCC $6629
6614- F0 13 BEQ $6629
6616- AD A5 66 LDA $66A5
6619- 38 SEC
661A- ED A2 66 SBC $66A2
661D- 90 7A BCC $6699
661F- F0 78 BEQ $6699
6621- 8D A3 66 STA $66A3
6624- A9 FF LDA #$FF
6626- 8D A9 66 STA $66A9
6629- AD A2 66 LDA $66A2
662C- CD A6 66 CMP $66A6
662F- B0 19 BCS $664A
6631- AE A2 66 LDX $66A2
6634- E8 INX
6635- 8E A6 66 STX $66A6
6638- A9 FF LDA #$FF
663A- 8D A9 66 STA $66A9
663D- AD A2 66 LDA $66A2
6640- 18 CLC
6641- 6D A3 66 ADC $66A3
6644- 8D A2 66 STA $66A2
6647- 4C 76 66 JMP $6676
664A- AD A2 66 LDA $66A2
664D- 38 SEC
664E- ED A6 66 SBC $66A6
6651- AA TAX
6652- E8 INX
6653- AD A2 66 LDA $66A2
6656- 8D A7 66 STA $66A7
6659- 18 CLC
665A- 6D A3 66 ADC $66A3
665D- 8D A8 66 STA $66A8
6660- 8D A2 66 STA $66A2
6663- AC A7 66 LDY $66A7
6666- B1 06 LDA ($06),Y
6668- AC A8 66 LDY $66A8
666B- 91 06 STA ($06),Y
666D- CE A7 66 DEC $66A7
6670- CE A8 66 DEC $66A8
6673- CA DEX
6674- D0 ED BNE $6663
6676- A9 01 LDA #$01
6678- 8D A7 66 STA $66A7
667B- AE A3 66 LDX $66A3
667E- AC A7 66 LDY $66A7
6681- B1 08 LDA ($08),Y
6683- AC A6 66 LDY $66A6
6686- 91 06 STA ($06),Y
6688- EE A7 66 INC $66A7
668B- EE A6 66 INC $66A6
668E- CA DEX
668F- D0 ED BNE $667E
6691- AD A9 66 LDA $66A9
6694- D0 03 BNE $6699
6696- 18 CLC
6697- 90 01 BCC $669A
6699- 38 SEC
669A- AD A2 66 LDA $66A2
669D- A0 00 LDY #$00
669F- 91 06 STA ($06),Y
66A1- 60 RTS
66A2- 00 BRK
66A3- 00 BRK
66A4- 00 BRK
66A5- 00 BRK
66A6- 00 BRK
66A7- 00 BRK
66A8- 00 BRK
66A9- 00 BRK

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,46 @@
*
*``````````````````````````````*
* DECLARATIONS.PUT *
*- -*
* USED IN CONJUNCTION WITH *
* OTHER PUT FILES. DEFINES *
* BASIC DECLARATIONS USED *
* ACROSS DIFFERENT ROUTINES *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
** ADDRESS STORAGE LOCATIONS FOR
** INDIRECT ADDRESSING.
*
ADDR1 EQU $06
ADDR2 EQU $08
ADDR3 EQU $EB
ADDR4 EQU $ED
*
** SCRATCHPAD ZERO PAGE LOCATIONS AND
** DEDICATED ZERO PAGE ADDRESS TO HOLD
** A RETURN ADDRESS PASSED VIA THE STACK
*
SCRATCH EQU $19
SCRATCH2 EQU $1E
RETADR EQU $FE
*
** ZERO PAGE ADDRESSES DEDICATED TO PASSING
** BACK RESULTS WHEN THERE ARE MORE THAN
** THREE BYTES BEING PASSED (AXY) AND THE
** USE OF THE STACK IS IMPRACTICAL OR TOO SLOW
*
RESULT EQU $FA
RESULT2 EQU $FC
*
** VARIOUS HOOKS USED BY ALL ROUTINES
*
REENTRY EQU $3D0
*
** ERROR HANDLING MEMORY LOCATIONS
*
** THIS DESIGNATES A 16-BYTE BLOCK OF MEMORY
** THAT HOLDS DATA RELATED TO IDENTIFYING
** RUNTIME VALUES FOR DEBUGGING.
*
ERRLOC EQU $0C00
*

View File

@ -0,0 +1,265 @@
*
********************************
* *
* -< STRINGS DEMO >- *
* *
* VERSION 00.00.01 *
* *
* 03/04/1980 *
* *
********************************
* *
* NATHAN D. RIGGS *
* NATHAN.RIGGS@OUTLOOK.COM *
* *
********************************
*
** ASSEMBLER DIRECTIVES
*
CYC AVE
EXP ONLY
DSK STRINGS.DEMO
*
*``````````````````````````````*
* TOP INCLUDES (PUTS, MACROS) *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
PUT DECS
USE STRINGS.MAC
*
PUT STRINGS.HOOKS
*
OBJ $BFE0
ORG $6000
*
*``````````````````````````````*
* PROGRAM MAIN BODY *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
*
*
** BIG LUMPS -- HIGH LEVEL CODE
*
*
** STRCMP COMPARES TWO STRINGS, THEN
** SETS THE STATUS REGISTER AS FOLLOWS:
*
** Z=1 IF STRINGS ARE IDENTICAL
** Z=0 IF STRINGS NOT IDENTICAL
** C=1 IF STRING2 LENGTH IS >
** C=0 IF STRING1 LENGTH IS >
*
** MACRO:
*
JMP CONT
STR1 STR "THIZ IS STRING1"
STR2 STR "THIS IS STRING 2"
CONT
LDA #>STR1
PHA
LDA #<STR1
PHA
LDA #>STR2
PHA
LDA #<STR2
PHA
JSR STRCMP
* BRK ; P = 31 = 00110001; Z=0,C=1
*
*
** STRCAT CONCATENATES TWO STRINGS AND RETURNS
** THE CONCATENATED STRING WHERE THE FIRST
** STRING WAS STORED.
*
** MACRO:
*
JMP CATCON
CATSTR STR "ABC"
BLANK STR " "
CATSTR2 STR "DEF"
*
CATCON
LDA #>CATSTR
PHA
LDA #<CATSTR
PHA
LDA #>CATSTR2
PHA
LDA #<CATSTR2
PHA
LDA #7 ; MAX SIZE OF CAT
PHA
JSR STRCAT
LDX #>CATSTR
LDY #<CATSTR
* BRK ; X,Y HOLDS LOW AND HIGH BYTES OF
* THE ADDRESS TO THE CONCATENATED STRING.
* IF YOU LIST THAT ADDRESS, YOU SHOULD SEE
* THAT THE FIRST LOCATION HOLDS THE LENGTH
* OF THE NEW STRING (06), FOLLOWED BY THE
* HEXADECIMAL CODES FOR THE CHARACTERS
* ABCDEF: C1 C2 C3 C4 C5 C6
*
*
*
** PRNSTR PRINTS THE STRING AT THE SPECIFIED
** MEMORY ADDRESS TO COUT1.
*
** MACRO:
*
LDA #>CATSTR ; FROM PREVIOUS EXAMPLE
PHA
LDA #<CATSTR
PHA
JSR PRNSTR
* BRK ; YOU SHOULD SEE
* "ABCDEF" APPENDED TO THE LINE WHERE YOU
* TYPED "BRUN STRINGS.DEMO." USE ROUTINES FROM
* STDIO FOR PLACEMENT OF THE TEXT.
*
*
*
*
JMP NUMSTRX
NUMSTR HEX 2B67 ;11111
NUMSTRX
*
LDA #>$300 ; DESTINATION
PHA
LDA #<$300
PHA
LDA #>11111 ; VALUE TO CONVERT
PHA
LDA #<11111
PHA
JSR NUM2STR
*BRK
*
* $300 SHOULD NOW HOLD 05,B1,B1,B1,B1,B1
*
*
*
** STR2NUM DOES THE OPPOSITE OF NUM2STR: IT
** RETURNS THE NUMBER EQUIVALENT OF A STRING
** AND HOLDS THEM IN X (HIGH) AND Y (LOW)
*
LDA #>$300 ; STRING FROM PREVIOUS
PHA
LDA #<$300
PHA
JSR STR2NUM
*BRK ; X,Y HOLDS 2B67, #11111
*
*
** SUBPOS RETURNS THE POSITION OF A SUBSTRING
** WITHIN A PARENT STRING.
*
LDA #>STR ; STRING ADDRESS
PHA
LDA #<STR
PHA
LDA #>SUB ; SUBSTRING ADDRESS
PHA
LDA #<SUB
PHA
JSR SUBPOS
JMP SUBPOSX
STR STR "THIS IS A TEST"
SUB STR "IS A TEST"
SUBPOSX
*BRK ; A = 06
*
*
** SUBCOPY COPIES A SUBSTRING AT THE SPECIFIED
** POSITION TO A PARTICULAR MEMORY ADDRESS
*
LDA #>STR11 ; SOURCE STRING
PHA
LDA #<STR11
PHA
LDA #5 ; INDEX TO START COPY
PHA
LDA #5 ; LENGTH TO COPY
PHA
LDA #>STR21
PHA
LDA #<STR21
PHA
LDA #15 ; MAX LENGTH OF STRING 2
PHA
JSR SUBCOPY
JMP STRCOPYX
STR11 STR "0123456789012345"
STR21 STR "000000000000000000"
STRCOPYX
LDX #>STR21
LDY #<STR21 ; ADDRESS OF STR2
*BRK ; LOCATION FOR STR21 SHOULD NOW START WITH
* 4,5,6,7,8
*
*
** SUBDEL DELETES A SUBSTRING FROM A GIVEN STRING
** AND CHANGES THE STRING SIZE ACCORDINGLY.
** MIN POSITION IS 1, NOT 0
*
LDA #>STR11 ; STRING LOCATION
PHA
LDA #<STR11
PHA
LDA #1 ; STARTING INDEX FOR DELETE
PHA
LDA #5 ; LENGTH TO DELETE
PHA
JSR SUBDEL
LDX #>STR11
LDY #<STR11
*BRK ; FIRST 5 DIGITS ARE DELETED, REMAINING STRING
* STORED ANEW
*
*
** SUBINS INSERTS A SOURCE STRING
** INTO ANOTHER DESTINATION STRING, MOVING THE
** CONTENTS AND ADJUSTING LENGTH AS NECESSARY.
*
LDA #>INS1 ; DESTINATION
PHA
LDA #<INS1
PHA
LDA #3 ; INDEX
PHA
LDA #200 ; MAXLEN OF NEW STRING
PHA
LDA #>INS2 ; SOURCE SUBSTRING
PHA
LDA #<INS2
PHA
JSR SUBINS
LDY #<INS1
LDX #>INS1
*BRK ; MEMLOC IN XY NOW HAS INS2 INSERTED INTO INS1
* AT LOCATION 3
*
** DATA
*
INS1 STR "XXXXXXXXX"
ZZZ STR "999999999"
INS2 STR "111111111"
*
*
*
*
** LITTLE LUMPS -- MID/LOW LEVEL
*
*
JMP REENTRY
*
*``````````````````````````````*
* BOTTOM INCLUDES *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
*
** BOTTOM INCLUDES
*
PUT STRINGS.LIB
PUT SUBSTRINGS.LIB
*

View File

@ -0,0 +1,9 @@
*
*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*
* *
* STRINGS.HOOKS *
* *
*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*
*
SCOUT1 EQU $FDF0
*

View File

@ -0,0 +1,872 @@
*
JMP STRINGSX
*
*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*
* *
* STRINGS ROUTINE LIBRARY *
* *
* 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). *
* *
* THIS IS A STANDARD LIBRARY *
* FOR STRING MANIPULATION. *
* STRINGS ARE MOSTLY JUST 1-D *
* ARRAYS PRECEDED BY A LENGTH *
* BYTE. THIS DIFFERS FROM THE *
* USE OF STRING IN THE PRINT *
* ROUTINES OF STDIO (THOUGH *
* NOT THE SINPUT ROUTINE) IN *
* THAT THOSE "STRINGS" ARE *
* TERMINATED WITH A #00 TO *
* INDICATE AN END, RATHER THAN *
* USING A LENGTH BYTE. *
* *
*------------------------------*
* *
* LIST OF ROUTINES *
* *
* STRCOMP : STRING COMPARE *
* STRCAT : CONCATENATE STRING *
* ASC2STR : NUL TO INDEXED STR *
* STR2ASC : INDEXED TO NUL STR *
* PRNSTR : PRINT STRING *
* NUM2STR : NUMBER TO STRING *
* STR2NUM : STRING TO NUMBER *
* *
*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*
*
*``````````````````````````````*
* STRCMP :: STRING COMPARE *
*- -*
* COMPARE TWO STRINGS AND *
* DETERMINE IF THEY ARE *
* IDENTICAL; IF NOT, DETERMINE *
* WHICH IS THE SHORTEST AND *
* WHICH IS THE LONGEST. *
* *
* Z FLAG = 1 IF IDENTICAL *
* Z FLAG = 0 IF NOT *
* CARRY = 1 IF STR2 > STR1 LEN *
* CARRY = 0 IF STR1 > STR2 LEN *
*- -*
* CLOBBERS: *
* *
* FLAGS: ????---- REG: AXYM *
*- -*
* CYCLES: ??? *
* SIZE: *
*- -*
* USAGE: *
* *
* LDA #>STR1 *
* PHA *
* LDA #<STR1 *
* PHA *
* LDA #>STR2 *
* PHA *
* LDA #<STR2 *
* PHA *
* JSR STRCMP *
* *
* STR1 STR "STRING1 " *
* STR2 STR "ZTRING2" *
*- -*
* ENTRY *
* *
* TOP OF STACK *
* *
* LOW BYTE OF RETURN ADDRESS *
* HI BYTE OF RETURN ADDRESS *
* STRING 2 ADDRESS LOW BYTE *
* STRING 2 ADDRESS HI BYTE *
* STRING 1 ADDRESS LOW BYTE *
* STRING 1 ADDRESS HI BYTE *
*- -*
* EXIT *
* *
* TOP OF STACK *
* *
* LOW BYTE OF RETURN ADDRESS *
* HI BYTE OF RETURN ADDRESS *
* *
* Y = LENGTH OF STRING 2 *
* X = LENGTH OF STRING 1 *
* A = CLOBBERED; TRASH *
* *
* - SEE DESCRIPTION FOR FLAG *
* CHANGES *
*- -*
* ADAPTED FROM LEVANTHAL AND *
* WINTHROP'S /6502 ASSEMBLY *
* LANGUAGE ROUTINES/. NOT *
* 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. *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
STRCMP
*
** SAVE RETURN ADDRESS
*
PLA
STA RETADR
PLA
STA RETADR+1
*
** GET PARAMETERS
*
PLA
STA ADDR2
PLA
STA ADDR2+1
PLA
STA ADDR1
PLA
STA ADDR1+1
*
LDY #0
LDA (ADDR1),Y ; GET LENGTH OF STRING 1
CMP (ADDR2),Y
BCC :BEGCMP ; IF STRING 2 IS SHORTER THEN
LDA (ADDR2),Y ; USE ITS LENGTH INSTEAD
*
** COMPARE THE STRINGS THROUGH THE
** LENGTH OF THE SHORTER STRING
*
:BEGCMP
TAX ; X IS LENGTH OF SHORTER STRING
BEQ :TSTLEN ; BR IF LENGTH IS 0
LDY #1 ; POINT AT FIRST CHAR OF STRINGS
:CMPLP
LDA (ADDR1),Y
CMP (ADDR2),Y
BNE :EXIT ; BR IF CHARS NOT EQUAL
; Z,C WILL BE PROPERLY SET
; OR CLEARED
; ELSE
INY ; NEXT CHAR
DEX ; DECREMENT COUNTER
BNE :CMPLP ; CONTINUE UNTIL ALL BYTES PAIRED
*
* THE 2 STRINGS ARE EQUAL TO LENGTH OF THE SHORTER
* SO USE LENGTHS AS BASIS FOR SETTING THE FLAGS
*
:TSTLEN
LDY #0 ; COMPARE LENGTHS
LDA (ADDR1),Y
CMP (ADDR2),Y ; SET OR CLEAR THE FLAGS
*
** Z FLAG = 1 IF STRINGS IDENTICAL
** Z FLAG = 0 IF NOT IDENTICAL
** CARRY = 0 IF STR2 LENGTH > STR1 LENGTH
** CARRY = 1 IF STR1 LENGTH >= STR2 LENGTH
*
:EXIT
*
** RESTORE RETURN ADDRESS
*
LDA RETADR+1
PHA
LDA RETADR
PHA
*
LDY #0
LDA (ADDR1),Y ; GET STR1 LENGTH
TAX ; RETURN IN X
LDA (ADDR2),Y ; STR2 LENGTH
TAY ; RETURN IN Y
*
RTS
*
*``````````````````````````````*
* STRCAT :: STRING CONCATENATE *
*- -*
* CONCATENATE TWO STRINGS INTO *
* A SINGLE STRING STORE WHERE *
* THE FIRST STRING IS LOCATED *
*- -*
* CLOBBERS: *
* *
* FLAGS: ????---- REG: AXYM *
*- -*
* CYCLES: ??? *
* SIZE: *
*- -*
* USAGE: *
* *
* LDA #>CATSTR *
* PHA *
* LDA #<CATSTR *
* PHA *
* LDA #>CATSTR2 *
* PHA *
* LDA #<CATSTR2 *
* PHA *
* LDA #7 ; MAX SIZE OF CAT *
* PHA *
* JSR STRCAT *
* *
* CATSTR STR "ABC" *
* BLANK STR " " *
* CATSTR2 STR "DEF" *
*- -*
* ENTRY *
* *
* TOP OF STACK *
* *
* LOW BYTE OF RETURN ADDRESS *
* HI BYTE OF RETURN ADDRESS *
* MAXIMUM LENGTH OF CONCAT STR *
* LOW BYTE OF STR2 ADDRESS *
* HIGH BYTE OF STR2 ADDRESS *
* LOW BYTE OF STR1 ADDRESS *
* HIGH BYTE OF STR1 ADDRESS *
*- -*
* EXIT *
* *
* TOP OF STACK *
* *
* LOW BYTE OF RETURN ADDRESS *
* HI BYTE OF RETURN ADDRESS *
* *
* Y = CLOBBERED; TRASH *
* X = LENGTH OF FINAL STRING *
* A = 1 OF OVERFLOW, 0 IF NO *
*- -*
* 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! *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
STRCAT
*
** SAVE RETURN ADDRESS
*
PLA
STA RETADR
PLA
STA RETADR+1
*
** GET PARAMETERS
PLA
STA :MLEN ; MAXIMUM CONCAT LENGTH
*
PLA
STA ADDR2 ; STRING 1 ADDRESS
PLA ; IN ZERO PAGE
STA ADDR2+1
PLA
STA ADDR1 ; STRING 2 ADDRESS
PLA ; IN ZERO PAGE
STA ADDR1+1
*
** DETERMINE WHERE TO START
*
LDY #0
LDA (ADDR1),Y ; GET CUR LGTH OF S1, STORE
STA :S1LEN
STA :S1IND
INC :S1IND ; START CONCAT AT END OF S1
LDA (ADDR2),Y ; GET LENGTH OF S2, STORE
STA :S2LEN
LDA #1
STA :S2IND ; START CONCAT AT BEGIN OF S2
*
** DETERMINE NUMBER OF CHAR
*
LDA :S2LEN ; GET S2 LENGTH
CLC
ADC :S1LEN ; ADD TO LENGTH OF S1
STA :S3LEN ; STORE CONCAT LENGTH
BCS :TOOLONG ; BR IF LENGTH > 255
CMP :MLEN ; CHECK AGAINST MAX LENGTH
BEQ :LENOK ; BR IF LENGTH < MAX
BCC :LENOK
*
** RESULTING STRING WILL BE TOO LONG SO
** INDICATE A STRING OVERFLOW, __SOVF = 0FF
** SET NUMBER OF CHARS TO CONCAT = MLEN - S1LEN
** SET LENGTH OF STRING 1 TO MAX LENGTH
*
:TOOLONG
LDA #$0FF
STA :SOVF ; INDICATE OVERFLOW
LDA :MLEN
SEC
SBC :S1LEN
BCC :EXIT
; EXIT IF MLEN < S1LEN
STA :SCNT ; ORIG STR WAS TOO LONG
LDA :MLEN
STA :S1LEN ; SET STR1 LENGTH TO MAX
JMP :DOCAT
*
** RESULTING LENGTH DOES NOT EXCEED MAX
** LENGTH OF STRING 1 = S1LEN + S2LEN
** INDICATE NO OVERFLOW, __SOVF = 0
** SET NUM OF CHARS TO CONCAT TO LENGTH OF STR 2
*
:LENOK
STA :S1LEN
LDA #0 ; SAVE SUM OF 2 LENGTHS
STA :SOVF ; INDICATE NO OVERFLOW
LDA :S2LEN
STA :SCNT ; COUNT = LENGTH OF STRING 2
*
** CONCAT STRINGS
*
:DOCAT
LDA :SCNT
BEQ :EXIT ; EXIT IF NO BYTES LEFT
*
:CATLP
LDY :S2IND
LDA (ADDR2),Y ; GET NEXT BYTE FROM S2
LDY :S1IND
STA (ADDR1),Y ; MOVE IT TO END OF STR 1
INC :S1IND ;INC STRING 1 INDEX
INC :S2IND ; INC STRING 2 INDEX
DEC :SCNT ; DECREMENT COUNTER
BNE :CATLP ; CONT UNTIL __SCNT = 0
*
*
:EXIT
*
** RESTORE RETURN ADDRESS
*
LDA RETADR+1
PHA
LDA RETADR
PHA
*
LDA :S1LEN
LDY #0
STA (ADDR1),Y
LDA :SOVF
ROR A ; CARRY = 1 IF OVERFLOW, 0 IF NOT
LDX :S3LEN ; RETURN FINAL LENGTH
*
RTS
*
** DATA
*
:S3LEN DS 1
:S1LEN DS 1
:S1IND DS 1
:S2LEN DS 1
:S2IND DS 1
:MLEN DS 1
:SCNT DS 1
:SOVF DS 1
*
*``````````````````````````````*
* PRNSTR :: PRINT INDEXED STR *
*- -*
* PRINT A STRING WITH LENGTH *
* THAT PRECEDES START OF STR *
*- -*
* CLOBBERS: *
* *
* FLAGS: ????---- REG: AXYM *
*- -*
* CYCLES: ??? *
* SIZE: *
*- -*
* USAGE: *
* *
* LDA #>STR ; STRING ADDRESS *
* PHA *
* LDA #<STR *
* PHA *
* JSR PRNSTR *
*- -*
* ENTRY *
* *
* TOP OF STACK *
* *
* LOW BYTE OF RETURN ADDRESS *
* HI BYTE OF RETURN ADDRESS *
* LOW BYTE OF STRING ADDRESS *
* HIGH BYTE OF STRING ADDRESS *
*- -*
* EXIT *
* *
* TOP OF STACK *
* *
* LOW BYTE OF RETURN ADDRESS *
* HI BYTE OF RETURN ADDRESS *
* *
* Y = LOW BYTE STRING ADDR *
* X = HI BYTE STRING ADDR *
* A = STRING LENGTH *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
PRNSTR
*
** SAVE RETURN ADDRESS
*
PLA
STA RETADR
PLA
STA RETADR+1
*
** GET PARAMETERS
*
PLA
STA ADDR1 ; ADDRESS OF STRING
PLA
STA ADDR1+1
*
LDY #0
LDA (ADDR1),Y ; GET STRING LENGTH
STA :S1LEN
:LP
INY
LDA (ADDR1),Y ; GET CHARACTER
JSR SCOUT1 ; PRINT CHARACTER TO SCREEN
CPY :S1LEN ; IF Y < LENGTH
BNE :LP
; LOOP; ELSE
LDY #0
LDA (ADDR1),Y
*
** RESTORE RETURN ADDRESS
*
LDA RETADR+1
PHA
LDA RETADR
PHA
*
LDY #0
LDA (ADDR1),Y ; STRING LENGTH IN A
LDY ADDR1
LDX ADDR1+1 ; ADDRESS IN Y,X
*
RTS
*
** DATA
*
:S1LEN DS 1
*
*``````````````````````````````*
* NUM2STR :: NUMBER TO STRING *
*- -*
* CONVERTS A 16-BIT NUMBER TO *
* ITS STRING EQUIVALENT. *
*- -*
* CLOBBERS: *
* *
* FLAGS: ????---- REG: AXYM *
*- -*
* CYCLES: ??? *
* SIZE: *
*- -*
* USAGE: *
* *
* LDA #>$300 ; DESTINATION *
* PHA *
* LDA #<$300 *
* PHA *
* LDA #>11111 ; VALUE TO *
* PHA ; CONVERT *
* LDA #<11111 *
* PHA *
* JSR NUM2STR *
*- -*
* ENTRY *
* *
* TOP OF STACK *
* *
* LOW BYTE OF RETURN ADDRESS *
* HI BYTE OF RETURN ADDRESS *
* LO BYTE DESTINATION ADDRESS *
* HI BYTE DESTINATION ADDRESS *
* LO BYTE VALUE TO CONVERT *
* HI BYTE VALUE TO CONVERT *
*- -*
* 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 *
*- -*
* 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! *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
NUM2STR
*
** SAVE RETURN ADDRESS
*
PLA
STA RETADR
PLA
STA RETADR+1
*
** GET PARAMETERS
*
PLA
STA :VALSTR
PLA
STA :VALSTR+1
*
STA :NGFLAG
BPL :GETBP ; BR IF VAL IS POS
LDA #0
SEC
SBC :VALSTR
STA :VALSTR
LDA #0
SBC :VALSTR+1
STA :VALSTR+1
*
:GETBP
PLA
STA ADDR1 ; ADDRESS TO STORE STRING
PLA
STA ADDR1+1
LDA #0 ; SET BUFFER TO EMPTY
LDY #0
STA (ADDR1),Y ; BUFFER(0) = 0
*
** CONVERT VAL TO STRING
*
:CNVERT
*
** VALUE = VALUE DIV 10
** MOD10 = VALUE MOD 10
*
LDA #0
STA :MOD10
STA :MOD10+1
LDX #16
CLC ; CLEAR CARRY
*
:DVLOOP
ROL :VALSTR ; SHIFT CARRY INTO DIVBIT 0
ROL :VALSTR+1 ; WHICH WILL BE THE QUOTIENT
ROL :MOD10 ; + SHIFT DIV AT SAME TIME
ROL :MOD10+1
*
** A,Y = DIVIDEND - DIVISOR
*
SEC
LDA :MOD10
SBC #10
TAY ; SAVE LOWB IN REG Y
LDA :MOD10+1
SBC #0 ; SUBTRACT CARRY
BCC :DECCNT ; BR IF DEND < DIVISOR
STY :MOD10 ; ELSE
STA :MOD10+1 ; NXT BIT OF Q IS A ONE AND SET
; DIVIDEND = DEND - DIVISOR
:DECCNT
DEX
BNE :DVLOOP
ROL :VALSTR ; SHIFT IN LAST CARRY FOR Q
ROL :VALSTR+1
*
** CONCAT NEXT CHAR
*
:CONCH
LDA :MOD10
CLC
ADC #$B0
*
** ADC #'0' ; CONVERT 0..9 TO ASCII 0-9
*
JSR :CONCAT
*
** IF VALUE <> 0 THEN CONTINUE
*
LDA :VALSTR
ORA :VALSTR+1
BNE :CNVERT ; BR IF VALUE != 0
*
:EXIT
LDA :NGFLAG
BPL :POS ; BR IF ORIG VAL POS
LDA #'-' ; ELSE
JSR :CONCAT ; PUT A MINUS SIGN IN FRONT
*
:POS
*
** RESTORE RETURN ADDRESS
*
LDA RETADR+1
PHA
LDA RETADR
PHA
*
RTS ; RETURN
*
********************************
* CONCAT SUBROUTINE
********************************
*
:CONCAT
PHA ; SAVE CHAR ON STACK
*
** MOVE BUFFER RIGHT ONE CHAR
*
LDY #0
LDA (ADDR1),Y ; GET CURRENT LENGTH
TAY
BEQ :EXITMR ; BR IF LENGTH=0
*
:MVELP
LDA (ADDR1),Y ; GET NEXT CHAR
INY
STA (ADDR1),Y ; STORE IT
DEY
DEY
BNE :MVELP ; CONT UNTIL DONE
*
:EXITMR
PLA ; GET CHAR BACK FROM STACK
LDY #1
STA (ADDR1),Y ; STORE THE CHAR
LDY #0
LDA (ADDR1),Y ; GET LENGTH BYTE
CLC
ADC #1 ; INC LENGTH BY ONE
STA (ADDR1),Y ; UPDATE LENGTH
*
RTS
*
** DATA
*
:NGFLAG DS 1
:VALSTR DS 2
:MOD10 DS 2
*
*``````````````````````````````*
* STR2NUM :: STRING TO NUMBER *
*- -*
* CONVERTS A STRING TO THE *
* EQUIVALENT 16BIT NUMBER. *
*- -*
* CLOBBERS: *
* *
* FLAGS: ????---- REG: AXYM *
*- -*
* CYCLES: ??? *
* SIZE: *
*- -*
* USAGE: *
* *
* LDA #>$300 ; STRING ADDR *
* PHA *
* LDA #<$300 *
* PHA *
* JSR STR2NUM *
*- -*
* ENTRY *
* *
* TOP OF STACK *
* *
* LOW BYTE OF RETURN ADDRESS *
* HI BYTE OF RETURN ADDRESS *
* LO BYTE OF STRING ADDRESS *
* HI BYTE OF STRING ADDRESS *
*- -*
* EXIT *
* *
* TOP OF STACK *
* *
* LOW BYTE OF RETURN ADDRESS *
* HI BYTE OF RETURN ADDRESS *
* *
* Y = HI BYTE OF NUMBER *
* X = LO BYTE OF NUMBER *
* 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! *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
*
STR2NUM
*
** SAVE RETURN ADDRESS
*
PLA
STA RETADR
PLA
STA RETADR+1
*
** GET PARAMETERS
*
PLA
STA ADDR1 ; ADRESS OF STRING
PLA ; TO CNVERT
STA ADDR1+1
*
** INITIALIZE
*
LDY #0
LDA (ADDR1),Y
TAX ; GET LENGITH; TO REGX
LDA #1
STA :NINDEX ; INDEX = 1
LDA #0
STA :NACCUM ; ACCUM = 0
STA :NACCUM+1
STA :SNGFLAG ; SIGN IS POSITIVE
*
** CHECK THAT BUFFER IS NOT ZERO
*
TXA
BNE :INIT1 ; EXIT WITH ACCUM = 0
; IF BUFFER IS EMPTY
JMP :EREXIT ; ERROR EXIT IF NOTHING
; IN BUFFER
:INIT1
LDY :NINDEX
LDA (ADDR1),Y
CMP #'-'
BNE :PLUS ; BR IF NOT -
LDA #$0FF
STA :SNGFLAG ; ELSE SIGN IS NEGATIVE
INC :NINDEX
DEX ; DECREMENT COUNT
BEQ :EREXIT ; ERROR EXIT IF ONLY
; - IN BUFFER
JMP :CNVERT
:PLUS
CMP #'+'
BNE :CHKDIG ; START CONVERSION IF 1ST
; CHARACTER IS NOT A +
INC :NINDEX
DEX ; DEC COUNT; IGNORE + SIGN
BEQ :EREXIT ; ERROR EXIT IF ONLY
; + IN THE BUFFER
:CNVERT
LDY :NINDEX
LDA (ADDR1),Y
; GET NEXT CHAR
:CHKDIG
CMP #$B0 ; "0"
BMI :EREXIT ; ERROR IF NOT A NUMERAL
CMP #$BA ; '9'+1; TECHNICALLY :
BPL :EREXIT ; ERR IF > 9 (NOT NUMERAL)
PHA ; PUSH DIGIT TO STACK
*
** VALID DECIMAL DIGIT SO
** ACCUM = ACCUM * 10
** = * (8+2)
** = (ACCUM * 8) + (ACCUM * 2)
*
ASL :NACCUM
ROL :NACCUM+1 ; TIMES 2
LDA :NACCUM
LDY :NACCUM+1 ; SAVE ACCUM * 2
ASL :NACCUM
ROL :NACCUM+1
ASL :NACCUM
ROL :NACCUM+1 ; TIMES 8
CLC
ADC :NACCUM ; SUM WITH * 2
STA :NACCUM
TYA
ADC :NACCUM+1
STA :NACCUM+1 ; ACCUM=ACCUM * 10
*
** ADD IN THE NEXT DIGIT
** ACCUM = ACCUM + DIGIT
*
PLA ; GET THE DIGIT NACK
SEC
SBC #$B0
CLC ; CONVERT STR TO BIN
ADC :NACCUM
STA :NACCUM
BCC :D2B1 ; BRANCH IF NO CARRY TO HBYTE
INC :NACCUM+1 ; ELSE INC HIGH BYTE
:D2B1
INC :NINDEX ;INC TO NEXT CHARACTER
DEX
BNE :CNVERT ; CONTINUE CONVERSION
LDA :SNGFLAG
BPL :OKEXIT ; BR IF VAL IS POSITIVE
LDA #0 ; ELSE REPLACE WITH -RESULT
SEC
SBC :NACCUM
STA :NACCUM
LDA #0
SBC :NACCUM+1
STA :NACCUM+1
*
** GET THE BINARY VALUE AND RETURN
*
:OKEXIT
CLC
BCC :EXIT
:EREXIT
SEC
:EXIT
; Y IS ALREADY LOW BYTE
*
** RESTORE RETURN ADDRESS
*
LDA RETADR+1
PHA
LDA RETADR
PHA
*
LDX :NACCUM+1
LDY :NACCUM
LDA :NINDEX
*
RTS
*
** DATA
*
:NACCUM DS 2
:SNGFLAG DS 1
:NINDEX DS 1
*
STRINGSX
*

View File

@ -0,0 +1,307 @@
*
*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*
* *
* STRINGS.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 *
* THE 8BIT STRING LIBRARIES, *
* STRINGS.LIB & SUBSTRINGS.LIB *
* *
*------------------------------*
* *
* LIST OF MACROS *
* *
* _SCMP : STRING COMPARE *
* _SCAT : STRING CONCATENATE *
* _SPRN : PRINT STRING *
* _2STR : NUMBER TO STRING *
* _2NUM : STRING TO NUMBER *
* _SPOS : FIND SUBSTRING POS *
* _SCOP : SUBSTRING COPY *
* _SDEL : SUBSTRING DELETE *
* _SINS : SUBSTRING INSERT *
* *
*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*
*
*``````````````````````````````*
* _SCMP : STRING COMPARE *
*- -*
* COMPARE TWO STRINGS AND *
* DETERMINE IF IDENTICAL, OR *
* LONGER AND SHORTER. *
* *
* Z = 1 IF IDENTICAL; 0 IF NOT *
* C = 1 IF STR2 > STR1 *
* C = 0 IF STR1 > STR2 LENGTH *
*- -*
* PARAMETERS: *
* *
* PARAM1 = STRING 1 ADDRESS *
* PARAM2 = STRING 2 ADDRESS *
*- -*
* SAMPLE USAGE: *
* _SCMP $300;$320 *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
_SCMP MAC
LDA #>]1 ; STRING 1
PHA
LDA #<]1
PHA
LDA #>]2 ; STRING 2
PHA
LDA #<]2
PHA
JSR STRCMP
<<<
*
*``````````````````````````````*
* _SCAT : CONCATENATE STRINGS *
*- -*
* CONCATENATES STRING 1 AND *
* STRING 2, STORED AT THE *
* ADDRESS OF STRING 1. *
*- -*
* PARAMETERS: *
* *
* PARAM1 = ADDR OF STRING 1 *
* PARAM2 = ADDR OF STRING 2 *
* PARAM3 = MAX LENGTH OF NEW *
* STRING *
*- -*
* SAMPLE USAGE: *
* _SCAT $300;$320;#18 *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
_SCAT MAC
LDA #>]1 ; STRING 1
PHA
LDA #<]1
PHA
LDA #>]2 ; STRING 2 ADDR
PHA
LDA #<]2
PHA
LDA ]3 ; MAX SIZE; BYTE
PHA
JSR STRCAT
<<<
*
*``````````````````````````````*
* _SPRN : PRINT STRING *
*- -*
* PRINTS THE STRING LOCATED AT *
* THE SPECIFIED ADDRESS, WHICH *
* HAS A PRECEDING LENGTH BYTE. *
*- -*
* PARAMETERS: *
* *
* PARAM1 = STRING ADDRESS *
*- -*
* SAMPLE USAGE: *
* _SPRN $300 *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
_PRS MAC
LDA #>]1 ; ADDRESS OF STRING
PHA
LDA #<]1
PHA
JSR PRNSTR
<<<
*
*``````````````````````````````*
* _2STR : NUMBER TO STRING *
*- -*
* CONVERTS A 16BIT NUMBER TO *
* ITS STRING EQUIVALENT. *
*- -*
* PARAMETERS: *
* *
* PARAM1 = ADDR TO STORE STRNG *
* PARAM2 = VALUE TO CONVERT *
*- -*
* SAMPLE USAGE: *
* _2STR $300; #11111 *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
_2STR MAC
LDA #>]1 ; DEST ADDR
PHA
LDA #<]1
PHA
LDA #>]2 ; NUMBER VAL
PHA
LDA #<]2
PHA
JSR NUM2STR
<<<
*
** NOTE: HOW TO DO ADDRESS WHERE NUM IS STORED?
*
*``````````````````````````````*
* _2NUM : STRING TO NUMBER *
*- -*
* CONVERTS A STRING TO A 16BIT *
* NUMBER EQUIVALENT; RETURNS *
* VALUE IN Y(LOW) AND X(HIGH) *
*- -*
* PARAMETERS: *
* *
* PARAM1 = ADDR TO STORE VALUE *
*- -*
* SAMPLE USAGE: *
* _2NUM $300;#11111 *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
_2NUM MAC
LDA #>]1 ; STRING ADDR
PHA
LDA #<]1
PHA
JSR STR2NUM
<<<
*
*``````````````````````````````*
* _SPOS : FIND SUBSTRING POS *
*- -*
* POSITION OF SUBSTRING WITHIN *
* ANOTHER STRING IS RETURNED *
* IN Y(LOW) AND X (HIGH) *
*- -*
* PARAMETERS: *
* *
* PARAM1 = PARENT STRING ADDR *
* PARAM2 = SUBSTRING ADDR *
*- -*
* SAMPLE USAGE: *
* _SPOS $300;$320 *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
_SPOS MAC
LDA #>]1 ; PARENT
PHA
LDA #<]1
PHA
LDA #>]2 ; SUBSTRING
PHA
LDA #<]2
PHA
JSR SUBPOS
<<<
*
*``````````````````````````````*
* _SCPY :: SUBSTRING COPY *
*- -*
* COPY A SUBSTRING FROM A *
* SOURCE STRING TO ANOTHER *
* MEMORY ADDRESS. *
*- -*
* PARAMETERS: *
* *
* PARAM1 = SOURCE STRING *
* PARAM2 = STARTING INDEX *
* PARAM3 = SUBSTRING LENGTH *
* PARAM4 = SUBSTRING ADDRESS *
* PARAM5 = MAX LENGTH *
*- -*
* SAMPLE USAGE: *
* $300;#1;#10;$320;#20 *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
_SCPY MAC
LDA #>]1 ; SOURCE STRING
PHA
LDA #<]1
PHA
LDA ]2 ; STARTING INDEX
PHA
LDA ]3 ; SUBSTRING LENGTH
PHA
LDA #>]4 ; SUBSTRING ADDR
PHA
LDA #<]4
PHA
LDA ]5 ; MAX LENGTH OF SUBSTR
JSR SUBCOPY
<<<
*
*``````````````````````````````*
* _SDEL :: DELETE SUBSTRING *
*- -*
* DELETE A SUBSTRING FROM A *
* PARENT STRING. ADJUSTS THE *
* STRING LENGTH ACCORDINGLY. *
*- -*
* PARAMETERS: *
* *
* PARAM1 = PARENT STRING ADDR *
* PARAM2 = STARTING INDEX *
* PARAM3 = DELETION LENGTH *
*- -*
* SAMPLE USAGE: *
* _SDEL $300;#3;#10 *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
_SDEL MAC
LDA #>]1 ; STRING ADDRESS
PHA
LDA #<]1
PHA
LDA ]2 ; INDEX BYTE
PHA
LDA ]3 ; LENGTH
PHA
JSR SUBDEL
<<<
*
*``````````````````````````````*
* _SINS :: INSERT SUBSTRING *
*- -*
* INSERT A SUBSTRING INTO A *
* PARENT STRING. *
*- -*
* PARAMETERS: *
* *
* PARAM1 = PARENT STRING *
* PARAM2 = INDEX *
* PARAM3 = MAX LENGTH OF NEW *
* PARAM4 = SUBSTRING *
*- -*
* SAMPLE USAGE: *
* _SINS $300;#1;#254;$6000 *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
_SINS MAC
LDA #>]1 ; PARENT STRING
PHA
LDA #<]1
PHA
LDA ]2 ; INDEX
PHA
LDA ]3 ; MAXIMUM LENGTH
PHA
LDA #>]4 SUBSTR TO INSERT
PHA
LDA #<]4
PHA
JSR SUBINS
<<<

View File

@ -0,0 +1,204 @@
*
*``````````````````````````````*
* NUM2STR :: NUMBER TO STRING *
*- -*
* CONVERTS A 16-BIT NUMBER TO *
* ITS STRING EQUIVALENT. *
*- -*
* CLOBBERS: *
* *
* FLAGS: ????---- REG: AXYM *
*- -*
* CYCLES: ??? *
* SIZE: *
*- -*
* USAGE: *
* *
* LDA #>$300 ; DESTINATION *
* PHA *
* LDA #<$300 *
* PHA *
* LDA #>11111 ; VALUE TO *
* PHA ; CONVERT *
* LDA #<11111 *
* PHA *
* JSR NUM2STR *
*- -*
* ENTRY *
* *
* TOP OF STACK *
* *
* LOW BYTE OF RETURN ADDRESS *
* HI BYTE OF RETURN ADDRESS *
* LO BYTE DESTINATION ADDRESS *
* HI BYTE DESTINATION ADDRESS *
* LO BYTE VALUE TO CONVERT *
* HI BYTE VALUE TO CONVERT *
*- -*
* 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 *
*- -*
* 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! *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
NUM2STR
*
** SAVE RETURN ADDRESS
*
PLA
STA RETADR
PLA
STA RETADR+1
*
** GET PARAMETERS
*
PLA
STA :VALSTR
PLA
STA :VALSTR+1
*
STA :NGFLAG
BPL :GETBP ; BR IF VAL IS POS
LDA #0
SEC
SBC :VALSTR
STA :VALSTR
LDA #0
SBC :VALSTR+1
STA :VALSTR+1
*
:GETBP
PLA
STA ADDR1 ; ADDRESS TO STORE STRING
PLA
STA ADDR1+1
LDA #0 ; SET BUFFER TO EMPTY
LDY #0
STA (ADDR1),Y ; BUFFER(0) = 0
*
** CONVERT VAL TO STRING
*
:CNVERT
*
** VALUE = VALUE DIV 10
** MOD10 = VALUE MOD 10
*
LDA #0
STA :MOD10
STA :MOD10+1
LDX #16
CLC ; CLEAR CARRY
*
:DVLOOP
ROL :VALSTR ; SHIFT CARRY INTO DIVBIT 0
ROL :VALSTR+1 ; WHICH WILL BE THE QUOTIENT
ROL :MOD10 ; + SHIFT DIV AT SAME TIME
ROL :MOD10+1
*
** A,Y = DIVIDEND - DIVISOR
*
SEC
LDA :MOD10
SBC #10
TAY ; SAVE LOWB IN REG Y
LDA :MOD10+1
SBC #0 ; SUBTRACT CARRY
BCC :DECCNT ; BR IF DEND < DIVISOR
STY :MOD10 ; ELSE
STA :MOD10+1 ; NXT BIT OF Q IS A ONE AND SET
; DIVIDEND = DEND - DIVISOR
:DECCNT
DEX
BNE :DVLOOP
ROL :VALSTR ; SHIFT IN LAST CARRY FOR Q
ROL :VALSTR+1
*
** CONCAT NEXT CHAR
*
:CONCH
LDA :MOD10
CLC
ADC #$B0
*
** ADC #'0' ; CONVERT 0..9 TO ASCII 0-9
*
JSR :CONCAT
*
** IF VALUE <> 0 THEN CONTINUE
*
LDA :VALSTR
ORA :VALSTR+1
BNE :CNVERT ; BR IF VALUE != 0
*
:EXIT
LDA :NGFLAG
BPL :POS ; BR IF ORIG VAL POS
LDA #'-' ; ELSE
JSR :CONCAT ; PUT A MINUS SIGN IN FRONT
*
:POS
*
** RESTORE RETURN ADDRESS
*
LDA RETADR+1
PHA
LDA RETADR
PHA
*
RTS ; RETURN
*
********************************
* CONCAT SUBROUTINE
********************************
*
:CONCAT
PHA ; SAVE CHAR ON STACK
*
** MOVE BUFFER RIGHT ONE CHAR
*
LDY #0
LDA (ADDR1),Y ; GET CURRENT LENGTH
TAY
BEQ :EXITMR ; BR IF LENGTH=0
*
:MVELP
LDA (ADDR1),Y ; GET NEXT CHAR
INY
STA (ADDR1),Y ; STORE IT
DEY
DEY
BNE :MVELP ; CONT UNTIL DONE
*
:EXITMR
PLA ; GET CHAR BACK FROM STACK
LDY #1
STA (ADDR1),Y ; STORE THE CHAR
LDY #0
LDA (ADDR1),Y ; GET LENGTH BYTE
CLC
ADC #1 ; INC LENGTH BY ONE
STA (ADDR1),Y ; UPDATE LENGTH
*
RTS
*
** DATA
*
:NGFLAG DS 1
:VALSTR DS 2
:MOD10 DS 2
*

View File

@ -0,0 +1,91 @@
*
*``````````````````````````````*
* PRNSTR :: PRINT INDEXED STR *
*- -*
* PRINT A STRING WITH LENGTH *
* THAT PRECEDES START OF STR *
*- -*
* CLOBBERS: *
* *
* FLAGS: ????---- REG: AXYM *
*- -*
* CYCLES: ??? *
* SIZE: *
*- -*
* USAGE: *
* *
* LDA #>STR ; STRING ADDRESS *
* PHA *
* LDA #<STR *
* PHA *
* JSR PRNSTR *
*- -*
* ENTRY *
* *
* TOP OF STACK *
* *
* LOW BYTE OF RETURN ADDRESS *
* HI BYTE OF RETURN ADDRESS *
* LOW BYTE OF STRING ADDRESS *
* HIGH BYTE OF STRING ADDRESS *
*- -*
* EXIT *
* *
* TOP OF STACK *
* *
* LOW BYTE OF RETURN ADDRESS *
* HI BYTE OF RETURN ADDRESS *
* *
* Y = LOW BYTE STRING ADDR *
* X = HI BYTE STRING ADDR *
* A = STRING LENGTH *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
PRNSTR
*
** SAVE RETURN ADDRESS
*
PLA
STA RETADR
PLA
STA RETADR+1
*
** GET PARAMETERS
*
PLA
STA ADDR1 ; ADDRESS OF STRING
PLA
STA ADDR1+1
*
LDY #0
LDA (ADDR1),Y ; GET STRING LENGTH
STA :S1LEN
:LP
INY
LDA (ADDR1),Y ; GET CHARACTER
JSR SCOUT1 ; PRINT CHARACTER TO SCREEN
CPY :S1LEN ; IF Y < LENGTH
BNE :LP
; LOOP; ELSE
LDY #0
LDA (ADDR1),Y
*
** RESTORE RETURN ADDRESS
*
LDA RETADR+1
PHA
LDA RETADR
PHA
*
LDY #0
LDA (ADDR1),Y ; STRING LENGTH IN A
LDY ADDR1
LDX ADDR1+1 ; ADDRESS IN Y,X
*
RTS
*
** DATA
*
:S1LEN DS 1
*
*

View File

@ -0,0 +1,194 @@
*
*``````````````````````````````*
* STR2NUM :: STRING TO NUMBER *
*- -*
* CONVERTS A STRING TO THE *
* EQUIVALENT 16BIT NUMBER. *
*- -*
* CLOBBERS: *
* *
* FLAGS: ????---- REG: AXYM *
*- -*
* CYCLES: ??? *
* SIZE: *
*- -*
* USAGE: *
* *
* LDA #>$300 ; STRING ADDR *
* PHA *
* LDA #<$300 *
* PHA *
* JSR STR2NUM *
*- -*
* ENTRY *
* *
* TOP OF STACK *
* *
* LOW BYTE OF RETURN ADDRESS *
* HI BYTE OF RETURN ADDRESS *
* LO BYTE OF STRING ADDRESS *
* HI BYTE OF STRING ADDRESS *
*- -*
* EXIT *
* *
* TOP OF STACK *
* *
* LOW BYTE OF RETURN ADDRESS *
* HI BYTE OF RETURN ADDRESS *
* *
* Y = HI BYTE OF NUMBER *
* X = LO BYTE OF NUMBER *
* 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! *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
*
STR2NUM
*
** SAVE RETURN ADDRESS
*
PLA
STA RETADR
PLA
STA RETADR+1
*
** GET PARAMETERS
*
PLA
STA ADDR1 ; ADRESS OF STRING
PLA ; TO CNVERT
STA ADDR1+1
*
** INITIALIZE
*
LDY #0
LDA (ADDR1),Y
TAX ; GET LENGITH; TO REGX
LDA #1
STA :NINDEX ; INDEX = 1
LDA #0
STA :NACCUM ; ACCUM = 0
STA :NACCUM+1
STA :SNGFLAG ; SIGN IS POSITIVE
*
** CHECK THAT BUFFER IS NOT ZERO
*
TXA
BNE :INIT1 ; EXIT WITH ACCUM = 0
; IF BUFFER IS EMPTY
JMP :EREXIT ; ERROR EXIT IF NOTHING
; IN BUFFER
:INIT1
LDY :NINDEX
LDA (ADDR1),Y
CMP #'-'
BNE :PLUS ; BR IF NOT -
LDA #$0FF
STA :SNGFLAG ; ELSE SIGN IS NEGATIVE
INC :NINDEX
DEX ; DECREMENT COUNT
BEQ :EREXIT ; ERROR EXIT IF ONLY
; - IN BUFFER
JMP :CNVERT
:PLUS
CMP #'+'
BNE :CHKDIG ; START CONVERSION IF 1ST
; CHARACTER IS NOT A +
INC :NINDEX
DEX ; DEC COUNT; IGNORE + SIGN
BEQ :EREXIT ; ERROR EXIT IF ONLY
; + IN THE BUFFER
:CNVERT
LDY :NINDEX
LDA (ADDR1),Y
; GET NEXT CHAR
:CHKDIG
CMP #$B0 ; "0"
BMI :EREXIT ; ERROR IF NOT A NUMERAL
CMP #$BA ; '9'+1; TECHNICALLY :
BPL :EREXIT ; ERR IF > 9 (NOT NUMERAL)
PHA ; PUSH DIGIT TO STACK
*
** VALID DECIMAL DIGIT SO
** ACCUM = ACCUM * 10
** = * (8+2)
** = (ACCUM * 8) + (ACCUM * 2)
*
ASL :NACCUM
ROL :NACCUM+1 ; TIMES 2
LDA :NACCUM
LDY :NACCUM+1 ; SAVE ACCUM * 2
ASL :NACCUM
ROL :NACCUM+1
ASL :NACCUM
ROL :NACCUM+1 ; TIMES 8
CLC
ADC :NACCUM ; SUM WITH * 2
STA :NACCUM
TYA
ADC :NACCUM+1
STA :NACCUM+1 ; ACCUM=ACCUM * 10
*
** ADD IN THE NEXT DIGIT
** ACCUM = ACCUM + DIGIT
*
PLA ; GET THE DIGIT NACK
SEC
SBC #$B0
CLC ; CONVERT STR TO BIN
ADC :NACCUM
STA :NACCUM
BCC :D2B1 ; BRANCH IF NO CARRY TO HBYTE
INC :NACCUM+1 ; ELSE INC HIGH BYTE
:D2B1
INC :NINDEX ;INC TO NEXT CHARACTER
DEX
BNE :CNVERT ; CONTINUE CONVERSION
LDA :SNGFLAG
BPL :OKEXIT ; BR IF VAL IS POSITIVE
LDA #0 ; ELSE REPLACE WITH -RESULT
SEC
SBC :NACCUM
STA :NACCUM
LDA #0
SBC :NACCUM+1
STA :NACCUM+1
*
** GET THE BINARY VALUE AND RETURN
*
:OKEXIT
CLC
BCC :EXIT
:EREXIT
SEC
:EXIT
; Y IS ALREADY LOW BYTE
*
** RESTORE RETURN ADDRESS
*
LDA RETADR+1
PHA
LDA RETADR
PHA
*
LDX :NACCUM+1
LDY :NACCUM
LDA :NINDEX
*
RTS
*
** DATA
*
:NACCUM DS 2
:SNGFLAG DS 1
:NINDEX DS 1
*

View File

@ -0,0 +1,188 @@
*
*``````````````````````````````*
* STRCAT :: STRING CONCATENATE *
*- -*
* CONCATENATE TWO STRINGS INTO *
* A SINGLE STRING STORE WHERE *
* THE FIRST STRING IS LOCATED *
*- -*
* CLOBBERS: *
* *
* FLAGS: ????---- REG: AXYM *
*- -*
* CYCLES: ??? *
* SIZE: *
*- -*
* USAGE: *
* *
* LDA #>CATSTR *
* PHA *
* LDA #<CATSTR *
* PHA *
* LDA #>CATSTR2 *
* PHA *
* LDA #<CATSTR2 *
* PHA *
* LDA #7 ; MAX SIZE OF CAT *
* PHA *
* JSR STRCAT *
* *
* CATSTR STR "ABC" *
* BLANK STR " " *
* CATSTR2 STR "DEF" *
*- -*
* ENTRY *
* *
* TOP OF STACK *
* *
* LOW BYTE OF RETURN ADDRESS *
* HI BYTE OF RETURN ADDRESS *
* MAXIMUM LENGTH OF CONCAT STR *
* LOW BYTE OF STR2 ADDRESS *
* HIGH BYTE OF STR2 ADDRESS *
* LOW BYTE OF STR1 ADDRESS *
* HIGH BYTE OF STR1 ADDRESS *
*- -*
* EXIT *
* *
* TOP OF STACK *
* *
* LOW BYTE OF RETURN ADDRESS *
* HI BYTE OF RETURN ADDRESS *
* *
* Y = CLOBBERED; TRASH *
* X = LENGTH OF FINAL STRING *
* A = 1 OF OVERFLOW, 0 IF NO *
*- -*
* 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! *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
STRCAT
*
** SAVE RETURN ADDRESS
*
PLA
STA RETADR
PLA
STA RETADR+1
*
** GET PARAMETERS
PLA
STA :MLEN ; MAXIMUM CONCAT LENGTH
*
PLA
STA ADDR2 ; STRING 1 ADDRESS
PLA ; IN ZERO PAGE
STA ADDR2+1
PLA
STA ADDR1 ; STRING 2 ADDRESS
PLA ; IN ZERO PAGE
STA ADDR1+1
*
** DETERMINE WHERE TO START
*
LDY #0
LDA (ADDR1),Y ; GET CUR LGTH OF S1, STORE
STA :S1LEN
STA :S1IND
INC :S1IND ; START CONCAT AT END OF S1
LDA (ADDR2),Y ; GET LENGTH OF S2, STORE
STA :S2LEN
LDA #1
STA :S2IND ; START CONCAT AT BEGIN OF S2
*
** DETERMINE NUMBER OF CHAR
*
LDA :S2LEN ; GET S2 LENGTH
CLC
ADC :S1LEN ; ADD TO LENGTH OF S1
STA :S3LEN ; STORE CONCAT LENGTH
BCS :TOOLONG ; BR IF LENGTH > 255
CMP :MLEN ; CHECK AGAINST MAX LENGTH
BEQ :LENOK ; BR IF LENGTH < MAX
BCC :LENOK
*
** RESULTING STRING WILL BE TOO LONG SO
** INDICATE A STRING OVERFLOW, __SOVF = 0FF
** SET NUMBER OF CHARS TO CONCAT = MLEN - S1LEN
** SET LENGTH OF STRING 1 TO MAX LENGTH
*
:TOOLONG
LDA #$0FF
STA :SOVF ; INDICATE OVERFLOW
LDA :MLEN
SEC
SBC :S1LEN
BCC :EXIT
; EXIT IF MLEN < S1LEN
STA :SCNT ; ORIG STR WAS TOO LONG
LDA :MLEN
STA :S1LEN ; SET STR1 LENGTH TO MAX
JMP :DOCAT
*
** RESULTING LENGTH DOES NOT EXCEED MAX
** LENGTH OF STRING 1 = S1LEN + S2LEN
** INDICATE NO OVERFLOW, __SOVF = 0
** SET NUM OF CHARS TO CONCAT TO LENGTH OF STR 2
*
:LENOK
STA :S1LEN
LDA #0 ; SAVE SUM OF 2 LENGTHS
STA :SOVF ; INDICATE NO OVERFLOW
LDA :S2LEN
STA :SCNT ; COUNT = LENGTH OF STRING 2
*
** CONCAT STRINGS
*
:DOCAT
LDA :SCNT
BEQ :EXIT ; EXIT IF NO BYTES LEFT
*
:CATLP
LDY :S2IND
LDA (ADDR2),Y ; GET NEXT BYTE FROM S2
LDY :S1IND
STA (ADDR1),Y ; MOVE IT TO END OF STR 1
INC :S1IND ;INC STRING 1 INDEX
INC :S2IND ; INC STRING 2 INDEX
DEC :SCNT ; DECREMENT COUNTER
BNE :CATLP ; CONT UNTIL __SCNT = 0
*
*
:EXIT
*
** RESTORE RETURN ADDRESS
*
LDA RETADR+1
PHA
LDA RETADR
PHA
*
LDA :S1LEN
LDY #0
STA (ADDR1),Y
LDA :SOVF
ROR A ; CARRY = 1 IF OVERFLOW, 0 IF NOT
LDX :S3LEN ; RETURN FINAL LENGTH
*
RTS
*
** DATA
*
:S3LEN DS 1
:S1LEN DS 1
:S1IND DS 1
:S2LEN DS 1
:S2IND DS 1
:MLEN DS 1
:SCNT DS 1
:SOVF DS 1
*
*

View File

@ -0,0 +1,152 @@
*
*``````````````````````````````*
* STRCMP :: STRING COMPARE *
*- -*
* COMPARE TWO STRINGS AND *
* DETERMINE IF THEY ARE *
* IDENTICAL; IF NOT, DETERMINE *
* WHICH IS THE SHORTEST AND *
* WHICH IS THE LONGEST. *
* *
* Z FLAG = 1 IF IDENTICAL *
* Z FLAG = 0 IF NOT *
* CARRY = 1 IF STR2 > STR1 LEN *
* CARRY = 0 IF STR1 > STR2 LEN *
*- -*
* CLOBBERS: *
* *
* FLAGS: ????---- REG: AXYM *
*- -*
* CYCLES: ??? *
* SIZE: *
*- -*
* USAGE: *
* *
* LDA #>STR1 *
* PHA *
* LDA #<STR1 *
* PHA *
* LDA #>STR2 *
* PHA *
* LDA #<STR2 *
* PHA *
* JSR STRCMP *
* *
* STR1 STR "STRING1 " *
* STR2 STR "ZTRING2" *
*- -*
* ENTRY *
* *
* TOP OF STACK *
* *
* LOW BYTE OF RETURN ADDRESS *
* HI BYTE OF RETURN ADDRESS *
* STRING 2 ADDRESS LOW BYTE *
* STRING 2 ADDRESS HI BYTE *
* STRING 1 ADDRESS LOW BYTE *
* STRING 1 ADDRESS HI BYTE *
*- -*
* EXIT *
* *
* TOP OF STACK *
* *
* LOW BYTE OF RETURN ADDRESS *
* HI BYTE OF RETURN ADDRESS *
* *
* Y = LENGTH OF STRING 2 *
* X = LENGTH OF STRING 1 *
* A = CLOBBERED; TRASH *
* *
* - SEE DESCRIPTION FOR FLAG *
* CHANGES *
*- -*
* ADAPTED FROM LEVANTHAL AND *
* WINTHROP'S /6502 ASSEMBLY *
* LANGUAGE ROUTINES/. NOT *
* 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. *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
STRCMP
*
** SAVE RETURN ADDRESS
*
PLA
STA RETADR
PLA
STA RETADR+1
*
** GET PARAMETERS
*
PLA
STA ADDR2
PLA
STA ADDR2+1
PLA
STA ADDR1
PLA
STA ADDR1+1
*
LDY #0
LDA (ADDR1),Y ; GET LENGTH OF STRING 1
CMP (ADDR2),Y
BCC :BEGCMP ; IF STRING 2 IS SHORTER THEN
LDA (ADDR2),Y ; USE ITS LENGTH INSTEAD
*
** COMPARE THE STRINGS THROUGH THE
** LENGTH OF THE SHORTER STRING
*
:BEGCMP
TAX ; X IS LENGTH OF SHORTER STRING
BEQ :TSTLEN ; BR IF LENGTH IS 0
LDY #1 ; POINT AT FIRST CHAR OF STRINGS
:CMPLP
LDA (ADDR1),Y
CMP (ADDR2),Y
BNE :EXIT ; BR IF CHARS NOT EQUAL
; Z,C WILL BE PROPERLY SET
; OR CLEARED
; ELSE
INY ; NEXT CHAR
DEX ; DECREMENT COUNTER
BNE :CMPLP ; CONTINUE UNTIL ALL BYTES PAIRED
*
* THE 2 STRINGS ARE EQUAL TO LENGTH OF THE SHORTER
* SO USE LENGTHS AS BASIS FOR SETTING THE FLAGS
*
:TSTLEN
LDY #0 ; COMPARE LENGTHS
LDA (ADDR1),Y
CMP (ADDR2),Y ; SET OR CLEAR THE FLAGS
*
** Z FLAG = 1 IF STRINGS IDENTICAL
** Z FLAG = 0 IF NOT IDENTICAL
** CARRY = 0 IF STR2 LENGTH > STR1 LENGTH
** CARRY = 1 IF STR1 LENGTH >= STR2 LENGTH
*
:EXIT
*
** RESTORE RETURN ADDRESS
*
LDA RETADR+1
PHA
LDA RETADR
PHA
*
LDY #0
LDA (ADDR1),Y ; GET STR1 LENGTH
TAX ; RETURN IN X
LDA (ADDR2),Y ; STR2 LENGTH
TAY ; RETURN IN Y
*
RTS
*

View File

@ -0,0 +1,876 @@
*
JMP SUBSTRINGSX
*
*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*
* *
* SUBSTRING ROUTINE LIBRARY *
* *
* 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). *
* *
* THIS IS A LIBRARY FOR USING *
* SUBSTRING OPERATIONS. THIS *
* IS SEPARATE FROM THE MAIN *
* STRINGS LIBRARY BY VIRTUE OF *
* DEALING WITH FULL MEMORY *
* ERRORS IN THE ASSEMBLER. *
* YEEEEE. *
* *
*------------------------------*
* *
* LIST OF ROUTINES *
* *
* SUBPOS : FIND POS OF SUBSTR *
* SUBCOPY : COPY SUBSTRING *
* SUBDEL : DELETE SUBSTRING *
* SUBINS : INSERT SUBSTRING *
* *
*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*
*
*``````````````````````````````*
* SUBPOS :: SUBSTRING POSITION *
*- -*
* FIND THE POSITION OF A SUB- *
* STRING WITHIN ANOTHER STRING *
*- -*
* CLOBBERS: *
* *
* FLAGS: ????---- REG: AXYM *
*- -*
* CYCLES: ??? *
* SIZE: *
*- -*
* USAGE: *
* *
* LDA #>STR ; STRING ADDR *
* PHA *
* LDA #<STR *
* PHA *
* LDA #>SUB ; SUBSTR ADDR *
* PHA *
* LDA #<SUB *
* JSR SUBPOS *
*- -*
* ENTRY *
* *
* TOP OF STACK *
* *
* LOW BYTE OF RETURN ADDRESS *
* LOW BYTE OF SUBSTRING ADDR *
* HI BYTE OF SUBSTRING ADDR *
* LO BYTE OF STRING ADDR *
* HI BYTE OF STRING ADDRESS *
* HI BYTE OF RETURN ADDRESS *
*- -*
* EXIT *
* *
* TOP OF STACK *
* *
* LOW BYTE OF RETURN ADDRESS *
* HI BYTE OF RETURN ADDRESS *
* *
* Y = CLOBBERED; TRASH *
* X = CLOBBERED; TRASH *
* A = INDEX OF SUBSTRING IF *
* FOUND; OTHERWISE, 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. *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
SUBPOS
*
** SAVE RETURN ADDRESS
*
PLA
STA RETADR
PLA
STA RETADR+1
*
** GET PARAMETERS
*
PLA
STA ADDR2
PLA
STA ADDR2+1
PLA
STA ADDR1
PLA
STA ADDR1+1
*
** RESTORE RETURN ADDRESS
*
LDA RETADR+1
PHA
LDA RETADR
PHA
*
:POS
LDY #0
LDA (ADDR1),Y ; GET LENGTH OF STRING
BEQ :NOTFND ; EXIT IF LENGTH = 0
STA :SLEN
LDA (ADDR2),Y ; GET SUBSTR LENGTH
BEQ :NOTFND ; EXIT IF SUB LENGTH = 0
STA :SUBLEN
*
** IF THE SUBSTR IS LONGER THAN STR, DECLARE THE
** SUBSTR NOT FOUND
*
LDA :SUBLEN
CMP :SLEN
BEQ :LENOK
BCS :NOTFND ; CANNOT FIND SUBSTR IF
; LONGER THAN STR
*
** START, SEARCH, CONTINUE UNTIL
** REMAINING STR SHORTER THAN SUBSTR
*
:LENOK
LDA #1
STA :SINDEX ; START LOOKING AT FIRST
; CHARACTER OF STRING
LDA :SLEN ; CONT UNTIL REMAINING STR
; TOO SHORT
SEC ; COUNT=STR LEN - SUB LEN+1
SBC :SUBLEN
STA :SCOUNT
INC :SCOUNT
*
** SEARCH FOR SUBSTRING IN STRING
*
:SLP1
LDA :SINDEX
STA :SIDX ; START STR AT INDEX
LDA #1
STA :SUBIDX ; START SUB IND AT 1
*
** LOOK FOR SUBSTRING BEGINNING AT INDEX
*
:CMPLP
LDY :SIDX
LDA (ADDR1),Y ; GET NEXT CHAR FROM STR
LDY :SUBIDX
CMP (ADDR2),Y ; COMPARE TO NEXT SUB CHAR
BNE :SLP2 ; BR IF SUB NOT HERE
LDY :SUBIDX
CPY :SUBLEN ; TEST IF WE ARE DONE
BEQ :FOUND ; BR IF ALL CHARS WERE EQUAL
INY ; ELSE INC TO NEXT CHAR
STY :SUBIDX
INC :SIDX
JMP :CMPLP ; CONTINUE
*
** ARRIVE HERE IF SUBSTRING NOT FOUND
*
:SLP2
INC :SINDEX ; INCREMENT INDEX
DEC :SCOUNT ; DEC COUNT
BNE :SLP1 ; BR IF NOT DONE
BEQ :NOTFND ; ELSE EXIT TO NOT FOUND
*
:FOUND
LDA :SINDEX ; FOUND, A = STARTING IDX
JMP :EXIT
*
:NOTFND
LDA #0 ; SUB NOT FOUND, A=0
STA RESULT
:EXIT
RTS
*
** DATA
*
:SLEN DS 1
:SUBLEN DS 1
:SINDEX DS 1
:SUBIDX DS 1
:SCOUNT DS 1
:SIDX DS 1
*
*``````````````````````````````*
* SUBCOPY :: COPY SUBSTRING *
*- -*
* COPY A SUBSTRING FROM A *
* STRING TO A DESTINATION *
* ADDRESS. *
*- -*
* CLOBBERS: *
* *
* FLAGS: ????---- REG: AXYM *
*- -*
* CYCLES: ??? *
* SIZE: *
*- -*
* USAGE: *
* *
* LDA #>STR ; SOURCE STRING *
* PHA *
* LDA #<STR *
* PHA *
* LDA #IND ; COPY START INDEX *
* PHA *
* LDA LEN ; LENGTH OF SUBSTR *
* PHA *
* LDA #>SUB ; SUBSTRING ADDR *
* PHA *
* LDA #<SUB *
* PHA *
* LDA MLEN ; MAX LENGTH *
* PHA *
* JSR SUBCOPY *
*- -*
* ENTRY *
* *
* TOP OF STACK *
* *
* LOW BYTE OF RETURN ADDRESS *
* HI BYTE OF RETURN ADDRESS *
* MAX LENGTH OF DEST STRING *
* LO BYTE OF DEST STR ADDRESS *
* HI BYTE OF DEST STRING ADDR *
* NUMBER OF BYTES TO COPY *
* STARTING INDEX TO COPY FROM *
* LO BYTE OF SRC STRING ADDR *
* HI BYTE OF SOURCE STR ADDR *
*- -*
* EXIT *
* *
* TOP OF STACK *
* *
* LOW BYTE OF RETURN ADDRESS *
* HI BYTE OF RETURN ADDRESS *
* *
* Y = TRASH *
* X = TRASH *
* A = TRASH *
* *
* CARRY FLAG WILL BE 0 IF NO *
* ERRORS; ELSE, CARRY = 1 *
*- -*
* 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! *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
SUBCOPY
*
** SAVE RETURN ADDRESS
*
PLA
STA RETADR
PLA
STA RETADR+1
*
** GET PARAMETERS
*
PLA
STA :MLEN
PLA
STA ADDR2
PLA
STA ADDR2+1
PLA
STA :SCNT
PLA
STA :SINDEX
PLA
STA ADDR1
PLA
STA ADDR1+1
*
** RESTORE RETURN ADDRESS
*
LDA RETADR+1
PHA
LDA RETADR
PHA
*
LDA #0
STA :S2LEN ; DESTINATION LENGTH = 0
STA :SCERR ; ASSUME NO ERRORS
*
** CHECK FOR ZERO BYTES TO COPY OR ZERO MAX SUBSTR LENGTH
*
LDA :SCNT
BEQ :OKEXIT ; BR IF 0 BYTES TO COPY,
; S2A WILL JUST HAVE ZERO LENGTH
LDA :MLEN
BEQ :EREXIT ; ERROR EXIT IF SUBSTR HAS
; ZERO MAX LENGTH
LDA :SINDEX
BEQ :EREXIT ; ERROR EXIT IF START IDX = 0
*
** CHECK IF SRC STR REACHES STARTING INDEX
*
LDY #0
LDA (ADDR1),Y ;
STA :S1LEN ; GET LENGTH OF SOURCE STRING
CMP :SINDEX ; COMPARE TO STARTING INDEX
BCC :EREXIT ; ERROR EXIT IF INDEX TOO BIG
*
** CHECK THAT WE DO NOT COPY BEYOND THE END OF
** THE SOURCE STRING.
** IF INDEX + COUNT -1 > SLEN THEN
** COUNT = SLEN - SINDEX + 1
*
LDA :SINDEX
CLC
ADC :SCNT
BCS :RECALC
TAX ; BR IF INDEX + COUNT > 255
DEX
CPX :S1LEN
BCC :CNT10K ; BR IF IND + CNT - 1 < S1LEN
BEQ :CNT10K ; OR EQUAL
*
** THE CALLER ASKED FOR TOO MANY CHARS SO
** JUST RETURN EVERYTHING BETWEEN INDEX AND
** END OF STRING. SO CNT = S1LEN - INDEX + 1
*
:RECALC
LDA :S1LEN ; RECALCULATE COUNT
SEC
SBC :SINDEX
STA :SCNT
INC :SCNT ; CNT = S1LEN - IND + 1
LDA #$0FF
STA :SCERR ; INDICATE TRUNCATION
*
** CHECK IF COUNT IS <= THE MAXIMUM LENGTH
** OF THE DEST STRING. IF NOT, THEN SET COUNT TO
** MAX LENGTH.
** IF COUNT > MAXLEN THEN
** COUNT = MAXLEN
*
:CNT10K
LDA :SCNT
CMP :MLEN ; IF CNT > M SUBSTR LEN ?
BCC :CNT20K ; BR IF CNT < MAXLEN
BEQ :CNT20K ; BR IF CNT = MAXLEN
LDA :MLEN
STA :SCNT ; ELSE CNT = MAXLEN
LDA #$0FF
STA :SCERR ; INDICATE DEST STR OVERFLOW
*
** EVERYTHING IS SET UP SO MOVE THE
** SUBSTRING TO THE DESTINATION STRING
*
:CNT20K
LDX :SCNT ; REG X WILL BE COUNTER
BEQ :EREXIT ; ERR IF 0
LDA #1 ; START WITH 1ST CHAR IN DEST
STA :S2LEN ; RUNNING DEST INDEX
; __SINDEX IS SRC INDEX
:MVLP
LDY :SINDEX
LDA (ADDR1),Y ; GET NEXT SRC CHAR
LDY :S2LEN
STA (ADDR2),Y ; MOVE NEXT CHAR TO DEST
INC :SINDEX ; INC SRC INDEX
INC :S2LEN ; INC DEST INDEX
DEX ; DECREMENT COUNTER
BNE :MVLP ; CONT UNTIL CNT = 0
DEC :S2LEN ; SUBSTR LEN=FINAL DEST IND-1
LDA :SCERR ; CHECK FOR ANY ERRORS
BNE :EREXIT ; BR IF STR TRUNCATED OR OVERFLOW
*
** GOOD EXIT
*
:OKEXIT
CLC
BCC :EXIT
*
** ERROR EXIT
*
:EREXIT
SEC
*
** STORE LENGTH BYTE IN FRONT OF SUBSTR
*
:EXIT
LDA :S2LEN
LDY #0
STA (ADDR2),Y
RTS
*
** DATA
*
:S1LEN DS 1
:S2LEN DS 1
:MLEN DS 1
:SCNT DS 1
:SINDEX DS 1
:SCERR DS 1
*
*``````````````````````````````*
* SUBDEL :: DELETE SUBSTRING *
*- -*
* DELETE A SUBSTRING FROM A *
* STRING. *
*- -*
* CLOBBERS: *
* *
* FLAGS: ????---- REG: AXYM *
*- -*
* CYCLES: ??? *
* SIZE: *
*- -*
* USAGE: *
* *
* LDA #>STR ; STRING ADDRESS *
* PHA *
* LDA #<STR *
* PHA *
* LDA IND ; DEL START INDEX *
* PHA *
* LDA LEN ; LENGTH OF DELETE *
* PHA *
* JSR SUBDEL *
*- -*
* ENTRY *
* *
* TOP OF STACK *
* *
* LOW BYTE OF RETURN ADDRESS *
* HI BYTE OF RETURN ADDRESS *
* NUMBER OF BYTES TO DELETE *
* STARTING INDEX OF DELETION *
* LO BYTE OF STRING ADDRESS *
* HI BYTE OF STRING ADDRESS *
*- -*
* EXIT *
* *
* TOP OF STACK *
* *
* LOW BYTE OF RETURN ADDRESS *
* HI BYTE OF RETURN ADDRESS *
* *
* Y = TRASH *
* X = TRASH *
* A = TRASH *
* *
* IF NO ERRORS, CARRY = 0; *
* ELSE, CARRY = 1 *
*- -*
* 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! *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
SUBDEL
*
** SAVE RETURN ADDRES
*
PLA
TAY
PLA
TAX
*
** GET PARAMTERS
*
PLA
STA :SCNT
PLA
STA :SINDEX
PLA
STA ADDR1
PLA
STA ADDR1+1
*
** RESTORE RETURN ADDRESS
*
TXA
PHA
TYA
PHA
*
** INITIALIZE ERROR INDICATOR TO 0
*
LDY #0
STY :SCERR
LDA (ADDR1),Y
STA :S1LEN ; GET STRING LENGTH
*
** CHECK FOR A NON-ZERO COUNT AND INDEX
*
LDA :SCNT
BEQ :OKEXIT
; GOOD EXIT IF NO DELETE
LDA :SINDEX
BEQ :ERREXIT ; ERR EXIT IF START = 0
*
** CHECK FOR STARTING INDEX WITHIN THE STRING
*
* EXIT IF IT IS NOT
*
LDA :S1LEN
CMP :SINDEX
BCC :ERREXIT
*
** BE SURE THE NUMBER OF CHARACTERS REQUESTED
** TO BE DELETED ARE PRESENT.
** IF NOT, THEN ONLY DELETE FROM THE INDEX
** TO THE END OF THE STRING.
*
LDA :SINDEX
CLC
ADC :SCNT
BCS :TRUNC ;TRUNCATE IF INDEX
; + COUNT > 255
STA :SIDX ; SAVE INDEX + COUNT AS
; THE SOURCE INDEX
TAX ; X = INDEX + COUNT
DEX
CPX :S1LEN
BCC :CNTOK ; BR IF IND + CNT - 1
; < __S1LEN
; ELSE JUST TRUNC STRING
BEQ :TRUNC ; TRUNC BUT NO ERROR--
; EXACTLY ENOUGH CHARS
LDA #$0FF
STA :SCERR ; INDICATE ERROR - NOT
; ENOUGH CHARS TO DELETE
*
** TRUNCATE THE STRING - NO COMPACTING NECESSARY
*
:TRUNC
LDX :SINDEX ; STRING LENGTH =
; START INDEX - 1
DEX
STX :S1LEN
LDA :SCERR
BEQ :OKEXIT
BNE :ERREXIT
*
** DELETE THE SUBSTRING BY COMPACTING
** MOVE ALL CHARS ABOVE THE DELETED AREA DOWN
*
:CNTOK
*
** CALCULATE NUMBER OF CHARS TO MOVE
** (SLEN - SIDX + 1)
*
LDA :S1LEN ; GET STR LENGTH
SEC
SBC :SIDX ; SUBTRACT START INDEX
TAX
INX
BEQ :OKEXIT ; ADD 1 TO INCLUDE LAST
; CHAR; BR IF CNT = 0
:MVLP
LDY :SIDX
LDA (ADDR1),Y ; GET NEXT CHAR
LDY :SINDEX
STA (ADDR1),Y ;MOVE IT DOWN
INC :SINDEX
INC :SIDX ; INC DEST, SRC INDEXES
DEX
BNE :MVLP ; CONT UNTIL CNT = 0
LDX :SINDEX
DEX ; START LENGTH = FINAL
; DEST INDEX -1
STX :S1LEN
*
** GOOD EXIT
*
:OKEXIT
CLC
BCC :EXIT
:ERREXIT
SEC
*
:EXIT
LDA :S1LEN
LDY #0
STA (ADDR1),Y ; SET LENGTH OF STRING
RTS
*
** DATA
*
:S1LEN DS 1
:SCNT DS 1
:SINDEX DS 1
:SIDX DS 1
:SCERR DS 1
*
*``````````````````````````````*
* SUBINS :: INSERT SUBSTRING *
*- -*
* INSERT A SUBSTRING INTO *
* ANOTHER STRING. *
*- -*
* CLOBBERS: *
* *
* FLAGS: ????---- REG: AXYM *
*- -*
* CYCLES: ??? *
* SIZE: *
*- -*
* USAGE: *
* *
* LDA #STR ; STRING TO INS TO *
* PHA *
* LDA #<STR *
* PHA *
* LDA IND ; INDEX TO START INS *
* PHA *
* LDA MLEN ; MAX LENGTH OF STR *
* PHA *
* LDA #>SUB ; SUBSTRING TO INS *
* PHA *
* LDA #<SUB *
* PHA *
* JST SUBINS *
*- -*
* ENTRY *
* *
* TOP OF STACK *
* *
* LOW BYTE OF RETURN ADDRESS *
* HI BYTE OF RETURN ADDRESS *
* LO BYTE OF SUBSTRING ADDRESS *
* HI BYTE OF SUBSTRING ADDRESS *
* MAX LENGTH OF FINAL STRING *
* STARTING INDEX FOR INSERTION *
* LO BYTE OF SRC STRING ADDR *
* HI BYTE OF SOURCE STR ADDR *
*- -*
* EXIT *
* *
* TOP OF STACK *
* *
* LOW BYTE OF RETURN ADDRESS *
* HI BYTE OF RETURN ADDRESS *
* *
* Y = TRASH *
* X = TRASH *
* A = TRASH *
* *
* CARRY = 0 IF NO ERRORS; ELSE *
* CARRY = 1 *
*- -*
* 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! *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
SUBINS
*
** GET RETURN ADDRESS
*
PLA
TAY
PLA
TAX
*
** GET PARAMETERS
*
PLA
STA ADDR2
PLA
STA ADDR2+1
PLA
STA :MLEN
PLA
STA :SINDEX
PLA
STA ADDR1
PLA
STA ADDR1+1
*
** RESTORE RETURN ADDRESS
*
TXA
PHA
TYA
PHA
*
*
** ASSUME NO ERRORS
*
LDA #0
STA :SCERR ; ASSUME NO ERR WILL BE FOUND
*
** GET SUBSTRING AND STRING LENGTHS
** IF SUB LENGTH = 0 THEN EXIT NO ERROR
*
LDY #0
LDA (ADDR1),Y
STA :S1LEN ; GET LENGTH OF STRING
LDA (ADDR2),Y
STA :S2LEN ; GET LENGTH OF SUB
BNE :IDX0
JMP :OKEXIT ; EXIT OF NO INSERT/ERR
*
** IF STARTING INDEX IS 0 THEN ERROR EXIT
*
:IDX0
LDA :SINDEX
BNE :CHKLEN ; BR OF INDEX NOT 0
JMP :EREXIT ; ELSE ERROR EXIT
*
** CHECK THAT THE RESULTING STRING AFTER THE
** INSERTION FITS IN THE SOURCE STRING. IF NOT
** THEN TRUNCATE THE SUBSTRING AND SET
** THE TRUNCATION FLAG.
*
:CHKLEN
LDA :S2LEN ; GET SUBSTR LENGTH
CLC
ADC :S1LEN
BCS :TRUNC ;TRUN IF S1+S2 LENGTH > 255
CMP :MLEN ;
BCC :IDXLEN ; BR IF S1+S2 LEN < MAX LENGTH
BEQ :IDXLEN ; BR IF EQUAL
*
** SUBSTRING DOES NOT FIT, SO TRUNCATE IT
*
:TRUNC
LDA :MLEN ; SUBSTR LEN = MLEN - STR LEN
SEC
SBC :S1LEN
BCC :EREXIT
BEQ :EREXIT ; ERR IF MLEN < STR LEN OR 0
; (ORIGINAL STRING WAS TOO LONG)
STA :S2LEN
LDA #$0FF
STA :SCERR ; INDICATE SUBSTR WAS TRUNCATED
*
** CHECK THAT INDEX IS WITHIN STRING. IF NOT, CONCAT
** SUBSTR ONTO THE END OF THE STRING.
*
:IDXLEN
LDA :S1LEN
CMP :SINDEX ;
BCS :LENOK ; BR IF INDEX WITHIN STR
LDX :S1LEN ; ELSE CONCAT SUB AT END OF STR
INX
STX :SINDEX ; START RIGHT AFTER END OF STR
LDA #$0FF
STA :SCERR ; INDICATE ERR IN INSERT
LDA :S1LEN
CLC
ADC :S2LEN
STA :S1LEN ; ADD LENGTHS TOGETHER
JMP :MVESUB ; PERFORM MOVE, NOTHING ELSE TODO
*
** OPEN UP A SPACE IN THE SOURCE STRING FOR THE
** SUBSTRING BY MOVING THE CHARACTERS FROM THE END
** OF THE SOURCE STRING DOWN TO INDEX, UP BY
** THE SIZE OF THE STRING.
*
:LENOK
*
** CALC NUMBER OF CHARS TO MOVE
** COUNT = STR LEN - START INDEX + 1
*
LDA :S1LEN
SEC
SBC :SINDEX
TAX
INX ; X= NUM OF CHARS TO MOV
*
** SET THE SOURCE INDEX AND CALC DEST INDEX
*
LDA :S1LEN
STA :SIDX ; SRC ENDS AT ORIG STR END
CLC
ADC :S2LEN
STA :SBIDX ; DEST ENDS FURTHER BY SUB LEN
STA :S1LEN ; SET NEW LENGTH TO THIS ALSO
*
:OPNLP
LDY :SIDX
LDA (ADDR1),Y
LDY :SBIDX
STA (ADDR1),Y ; MOVE IT UP IN MEM
DEC :SIDX
DEC :SBIDX ; DE DEST IDX, COUNTER
DEX
BNE :OPNLP ; CONT UNTIL COUNTER = 0
*
** MOVE THE SUBSTR INTO THE OPEN AREA
*
:MVESUB
LDA #1
STA :SIDX
; START AT ONE IN THE SUBSTR
; START AT INDEX IN THE STRING
LDX :S2LEN ; X = NUM OF CHARS TO MOVE
*
:MVELP
LDY :SIDX
LDA (ADDR2),Y ; GET NEXT CHAR
LDY :SINDEX
STA (ADDR1),Y
INC :SIDX ; INC SUBSTR INDEX
INC :SINDEX ; INC STR INDEX
DEX ; DEC COUNTER
BNE :MVELP ; CONT UNTIL COUNTER = 0
LDA :SCERR ; GET ERROR FLAG
BNE :EREXIT ; BR IF SUBSTR WAS TRUNCED
*
:OKEXIT
CLC
BCC :EXIT
:EREXIT
SEC ; ERROR EXIT
:EXIT
LDA :S1LEN
LDY #0
STA (ADDR1),Y
RTS
*
** DATA
*
:S1LEN DS 1
:S2LEN DS 1
:SUBLEN DS 1
:MLEN DS 1
:SINDEX DS 1
:SIDX DS 1
:SBIDX DS 1
:SCERR DS 1
*
SUBSTRINGSX
*

View File

@ -0,0 +1,221 @@
*
*``````````````````````````````*
* SUBCOPY :: COPY SUBSTRING *
*- -*
* COPY A SUBSTRING FROM A *
* STRING TO A DESTINATION *
* ADDRESS. *
*- -*
* CLOBBERS: *
* *
* FLAGS: ????---- REG: AXYM *
*- -*
* CYCLES: ??? *
* SIZE: *
*- -*
* USAGE: *
* *
* LDA #>STR ; SOURCE STRING *
* PHA *
* LDA #<STR *
* PHA *
* LDA #IND ; COPY START INDEX *
* PHA *
* LDA LEN ; LENGTH OF SUBSTR *
* PHA *
* LDA #>SUB ; SUBSTRING ADDR *
* PHA *
* LDA #<SUB *
* PHA *
* LDA MLEN ; MAX LENGTH *
* PHA *
* JSR SUBCOPY *
*- -*
* ENTRY *
* *
* TOP OF STACK *
* *
* LOW BYTE OF RETURN ADDRESS *
* HI BYTE OF RETURN ADDRESS *
* MAX LENGTH OF DEST STRING *
* LO BYTE OF DEST STR ADDRESS *
* HI BYTE OF DEST STRING ADDR *
* NUMBER OF BYTES TO COPY *
* STARTING INDEX TO COPY FROM *
* LO BYTE OF SRC STRING ADDR *
* HI BYTE OF SOURCE STR ADDR *
*- -*
* EXIT *
* *
* TOP OF STACK *
* *
* LOW BYTE OF RETURN ADDRESS *
* HI BYTE OF RETURN ADDRESS *
* *
* Y = TRASH *
* X = TRASH *
* A = TRASH *
* *
* CARRY FLAG WILL BE 0 IF NO *
* ERRORS; ELSE, CARRY = 1 *
*- -*
* 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! *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
SUBCOPY
*
** SAVE RETURN ADDRESS
*
PLA
STA RETADR
PLA
STA RETADR+1
*
** GET PARAMETERS
*
PLA
STA :MLEN
PLA
STA ADDR2
PLA
STA ADDR2+1
PLA
STA :SCNT
PLA
STA :SINDEX
PLA
STA ADDR1
PLA
STA ADDR1+1
*
** RESTORE RETURN ADDRESS
*
LDA RETADR+1
PHA
LDA RETADR
PHA
*
LDA #0
STA :S2LEN ; DESTINATION LENGTH = 0
STA :SCERR ; ASSUME NO ERRORS
*
** CHECK FOR ZERO BYTES TO COPY OR ZERO MAX SUBSTR LENGTH
*
LDA :SCNT
BEQ :OKEXIT ; BR IF 0 BYTES TO COPY,
; S2A WILL JUST HAVE ZERO LENGTH
LDA :MLEN
BEQ :EREXIT ; ERROR EXIT IF SUBSTR HAS
; ZERO MAX LENGTH
LDA :SINDEX
BEQ :EREXIT ; ERROR EXIT IF START IDX = 0
*
** CHECK IF SRC STR REACHES STARTING INDEX
*
LDY #0
LDA (ADDR1),Y ;
STA :S1LEN ; GET LENGTH OF SOURCE STRING
CMP :SINDEX ; COMPARE TO STARTING INDEX
BCC :EREXIT ; ERROR EXIT IF INDEX TOO BIG
*
** CHECK THAT WE DO NOT COPY BEYOND THE END OF
** THE SOURCE STRING.
** IF INDEX + COUNT -1 > SLEN THEN
** COUNT = SLEN - SINDEX + 1
*
LDA :SINDEX
CLC
ADC :SCNT
BCS :RECALC
TAX ; BR IF INDEX + COUNT > 255
DEX
CPX :S1LEN
BCC :CNT10K ; BR IF IND + CNT - 1 < S1LEN
BEQ :CNT10K ; OR EQUAL
*
** THE CALLER ASKED FOR TOO MANY CHARS SO
** JUST RETURN EVERYTHING BETWEEN INDEX AND
** END OF STRING. SO CNT = S1LEN - INDEX + 1
*
:RECALC
LDA :S1LEN ; RECALCULATE COUNT
SEC
SBC :SINDEX
STA :SCNT
INC :SCNT ; CNT = S1LEN - IND + 1
LDA #$0FF
STA :SCERR ; INDICATE TRUNCATION
*
** CHECK IF COUNT IS <= THE MAXIMUM LENGTH
** OF THE DEST STRING. IF NOT, THEN SET COUNT TO
** MAX LENGTH.
** IF COUNT > MAXLEN THEN
** COUNT = MAXLEN
*
:CNT10K
LDA :SCNT
CMP :MLEN ; IF CNT > M SUBSTR LEN ?
BCC :CNT20K ; BR IF CNT < MAXLEN
BEQ :CNT20K ; BR IF CNT = MAXLEN
LDA :MLEN
STA :SCNT ; ELSE CNT = MAXLEN
LDA #$0FF
STA :SCERR ; INDICATE DEST STR OVERFLOW
*
** EVERYTHING IS SET UP SO MOVE THE
** SUBSTRING TO THE DESTINATION STRING
*
:CNT20K
LDX :SCNT ; REG X WILL BE COUNTER
BEQ :EREXIT ; ERR IF 0
LDA #1 ; START WITH 1ST CHAR IN DEST
STA :S2LEN ; RUNNING DEST INDEX
; __SINDEX IS SRC INDEX
:MVLP
LDY :SINDEX
LDA (ADDR1),Y ; GET NEXT SRC CHAR
LDY :S2LEN
STA (ADDR2),Y ; MOVE NEXT CHAR TO DEST
INC :SINDEX ; INC SRC INDEX
INC :S2LEN ; INC DEST INDEX
DEX ; DECREMENT COUNTER
BNE :MVLP ; CONT UNTIL CNT = 0
DEC :S2LEN ; SUBSTR LEN=FINAL DEST IND-1
LDA :SCERR ; CHECK FOR ANY ERRORS
BNE :EREXIT ; BR IF STR TRUNCATED OR OVERFLOW
*
** GOOD EXIT
*
:OKEXIT
CLC
BCC :EXIT
*
** ERROR EXIT
*
:EREXIT
SEC
*
** STORE LENGTH BYTE IN FRONT OF SUBSTR
*
:EXIT
LDA :S2LEN
LDY #0
STA (ADDR2),Y
RTS
*
** DATA
*
:S1LEN DS 1
:S2LEN DS 1
:MLEN DS 1
:SCNT DS 1
:SINDEX DS 1
:SCERR DS 1
*

View File

@ -0,0 +1,197 @@
*
*``````````````````````````````*
* SUBDEL :: DELETE SUBSTRING *
*- -*
* DELETE A SUBSTRING FROM A *
* STRING. *
*- -*
* CLOBBERS: *
* *
* FLAGS: ????---- REG: AXYM *
*- -*
* CYCLES: ??? *
* SIZE: *
*- -*
* USAGE: *
* *
* LDA #>STR ; STRING ADDRESS *
* PHA *
* LDA #<STR *
* PHA *
* LDA IND ; DEL START INDEX *
* PHA *
* LDA LEN ; LENGTH OF DELETE *
* PHA *
* JSR SUBDEL *
*- -*
* ENTRY *
* *
* TOP OF STACK *
* *
* LOW BYTE OF RETURN ADDRESS *
* HI BYTE OF RETURN ADDRESS *
* NUMBER OF BYTES TO DELETE *
* STARTING INDEX OF DELETION *
* LO BYTE OF STRING ADDRESS *
* HI BYTE OF STRING ADDRESS *
*- -*
* EXIT *
* *
* TOP OF STACK *
* *
* LOW BYTE OF RETURN ADDRESS *
* HI BYTE OF RETURN ADDRESS *
* *
* Y = TRASH *
* X = TRASH *
* A = TRASH *
* *
* IF NO ERRORS, CARRY = 0; *
* ELSE, CARRY = 1 *
*- -*
* 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! *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
SUBDEL
*
** SAVE RETURN ADDRES
*
PLA
TAY
PLA
TAX
*
** GET PARAMTERS
*
PLA
STA :SCNT
PLA
STA :SINDEX
PLA
STA ADDR1
PLA
STA ADDR1+1
*
** RESTORE RETURN ADDRESS
*
TXA
PHA
TYA
PHA
*
** INITIALIZE ERROR INDICATOR TO 0
*
LDY #0
STY :SCERR
LDA (ADDR1),Y
STA :S1LEN ; GET STRING LENGTH
*
** CHECK FOR A NON-ZERO COUNT AND INDEX
*
LDA :SCNT
BEQ :OKEXIT
; GOOD EXIT IF NO DELETE
LDA :SINDEX
BEQ :ERREXIT ; ERR EXIT IF START = 0
*
** CHECK FOR STARTING INDEX WITHIN THE STRING
*
* EXIT IF IT IS NOT
*
LDA :S1LEN
CMP :SINDEX
BCC :ERREXIT
*
** BE SURE THE NUMBER OF CHARACTERS REQUESTED
** TO BE DELETED ARE PRESENT.
** IF NOT, THEN ONLY DELETE FROM THE INDEX
** TO THE END OF THE STRING.
*
LDA :SINDEX
CLC
ADC :SCNT
BCS :TRUNC ;TRUNCATE IF INDEX
; + COUNT > 255
STA :SIDX ; SAVE INDEX + COUNT AS
; THE SOURCE INDEX
TAX ; X = INDEX + COUNT
DEX
CPX :S1LEN
BCC :CNTOK ; BR IF IND + CNT - 1
; < __S1LEN
; ELSE JUST TRUNC STRING
BEQ :TRUNC ; TRUNC BUT NO ERROR--
; EXACTLY ENOUGH CHARS
LDA #$0FF
STA :SCERR ; INDICATE ERROR - NOT
; ENOUGH CHARS TO DELETE
*
** TRUNCATE THE STRING - NO COMPACTING NECESSARY
*
:TRUNC
LDX :SINDEX ; STRING LENGTH =
; START INDEX - 1
DEX
STX :S1LEN
LDA :SCERR
BEQ :OKEXIT
BNE :ERREXIT
*
** DELETE THE SUBSTRING BY COMPACTING
** MOVE ALL CHARS ABOVE THE DELETED AREA DOWN
*
:CNTOK
*
** CALCULATE NUMBER OF CHARS TO MOVE
** (SLEN - SIDX + 1)
*
LDA :S1LEN ; GET STR LENGTH
SEC
SBC :SIDX ; SUBTRACT START INDEX
TAX
INX
BEQ :OKEXIT ; ADD 1 TO INCLUDE LAST
; CHAR; BR IF CNT = 0
:MVLP
LDY :SIDX
LDA (ADDR1),Y ; GET NEXT CHAR
LDY :SINDEX
STA (ADDR1),Y ;MOVE IT DOWN
INC :SINDEX
INC :SIDX ; INC DEST, SRC INDEXES
DEX
BNE :MVLP ; CONT UNTIL CNT = 0
LDX :SINDEX
DEX ; START LENGTH = FINAL
; DEST INDEX -1
STX :S1LEN
*
** GOOD EXIT
*
:OKEXIT
CLC
BCC :EXIT
:ERREXIT
SEC
*
:EXIT
LDA :S1LEN
LDY #0
STA (ADDR1),Y ; SET LENGTH OF STRING
RTS
*
** DATA
*
:S1LEN DS 1
:SCNT DS 1
:SINDEX DS 1
:SIDX DS 1
:SCERR DS 1
*

View File

@ -0,0 +1,245 @@
*
*``````````````````````````````*
* SUBINS :: INSERT SUBSTRING *
*- -*
* INSERT A SUBSTRING INTO *
* ANOTHER STRING. *
*- -*
* CLOBBERS: *
* *
* FLAGS: ????---- REG: AXYM *
*- -*
* CYCLES: ??? *
* SIZE: *
*- -*
* USAGE: *
* *
* LDA #STR ; STRING TO INS TO *
* PHA *
* LDA #<STR *
* PHA *
* LDA IND ; INDEX TO START INS *
* PHA *
* LDA MLEN ; MAX LENGTH OF STR *
* PHA *
* LDA #>SUB ; SUBSTRING TO INS *
* PHA *
* LDA #<SUB *
* PHA *
* JST SUBINS *
*- -*
* ENTRY *
* *
* TOP OF STACK *
* *
* LOW BYTE OF RETURN ADDRESS *
* HI BYTE OF RETURN ADDRESS *
* LO BYTE OF SUBSTRING ADDRESS *
* HI BYTE OF SUBSTRING ADDRESS *
* MAX LENGTH OF FINAL STRING *
* STARTING INDEX FOR INSERTION *
* LO BYTE OF SRC STRING ADDR *
* HI BYTE OF SOURCE STR ADDR *
*- -*
* EXIT *
* *
* TOP OF STACK *
* *
* LOW BYTE OF RETURN ADDRESS *
* HI BYTE OF RETURN ADDRESS *
* *
* Y = TRASH *
* X = TRASH *
* A = TRASH *
* *
* CARRY = 0 IF NO ERRORS; ELSE *
* CARRY = 1 *
*- -*
* 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! *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
SUBINS
*
** GET RETURN ADDRESS
*
PLA
TAY
PLA
TAX
*
** GET PARAMETERS
*
PLA
STA ADDR2
PLA
STA ADDR2+1
PLA
STA :MLEN
PLA
STA :SINDEX
PLA
STA ADDR1
PLA
STA ADDR1+1
*
** RESTORE RETURN ADDRESS
*
TXA
PHA
TYA
PHA
*
*
** ASSUME NO ERRORS
*
LDA #0
STA :SCERR ; ASSUME NO ERR WILL BE FOUND
*
** GET SUBSTRING AND STRING LENGTHS
** IF SUB LENGTH = 0 THEN EXIT NO ERROR
*
LDY #0
LDA (ADDR1),Y
STA :S1LEN ; GET LENGTH OF STRING
LDA (ADDR2),Y
STA :S2LEN ; GET LENGTH OF SUB
BNE :IDX0
JMP :OKEXIT ; EXIT OF NO INSERT/ERR
*
** IF STARTING INDEX IS 0 THEN ERROR EXIT
*
:IDX0
LDA :SINDEX
BNE :CHKLEN ; BR OF INDEX NOT 0
JMP :EREXIT ; ELSE ERROR EXIT
*
** CHECK THAT THE RESULTING STRING AFTER THE
** INSERTION FITS IN THE SOURCE STRING. IF NOT
** THEN TRUNCATE THE SUBSTRING AND SET
** THE TRUNCATION FLAG.
*
:CHKLEN
LDA :S2LEN ; GET SUBSTR LENGTH
CLC
ADC :S1LEN
BCS :TRUNC ;TRUN IF S1+S2 LENGTH > 255
CMP :MLEN ;
BCC :IDXLEN ; BR IF S1+S2 LEN < MAX LENGTH
BEQ :IDXLEN ; BR IF EQUAL
*
** SUBSTRING DOES NOT FIT, SO TRUNCATE IT
*
:TRUNC
LDA :MLEN ; SUBSTR LEN = MLEN - STR LEN
SEC
SBC :S1LEN
BCC :EREXIT
BEQ :EREXIT ; ERR IF MLEN < STR LEN OR 0
; (ORIGINAL STRING WAS TOO LONG)
STA :S2LEN
LDA #$0FF
STA :SCERR ; INDICATE SUBSTR WAS TRUNCATED
*
** CHECK THAT INDEX IS WITHIN STRING. IF NOT, CONCAT
** SUBSTR ONTO THE END OF THE STRING.
*
:IDXLEN
LDA :S1LEN
CMP :SINDEX ;
BCS :LENOK ; BR IF INDEX WITHIN STR
LDX :S1LEN ; ELSE CONCAT SUB AT END OF STR
INX
STX :SINDEX ; START RIGHT AFTER END OF STR
LDA #$0FF
STA :SCERR ; INDICATE ERR IN INSERT
LDA :S1LEN
CLC
ADC :S2LEN
STA :S1LEN ; ADD LENGTHS TOGETHER
JMP :MVESUB ; PERFORM MOVE, NOTHING ELSE TODO
*
** OPEN UP A SPACE IN THE SOURCE STRING FOR THE
** SUBSTRING BY MOVING THE CHARACTERS FROM THE END
** OF THE SOURCE STRING DOWN TO INDEX, UP BY
** THE SIZE OF THE STRING.
*
:LENOK
*
** CALC NUMBER OF CHARS TO MOVE
** COUNT = STR LEN - START INDEX + 1
*
LDA :S1LEN
SEC
SBC :SINDEX
TAX
INX ; X= NUM OF CHARS TO MOV
*
** SET THE SOURCE INDEX AND CALC DEST INDEX
*
LDA :S1LEN
STA :SIDX ; SRC ENDS AT ORIG STR END
CLC
ADC :S2LEN
STA :SBIDX ; DEST ENDS FURTHER BY SUB LEN
STA :S1LEN ; SET NEW LENGTH TO THIS ALSO
*
:OPNLP
LDY :SIDX
LDA (ADDR1),Y
LDY :SBIDX
STA (ADDR1),Y ; MOVE IT UP IN MEM
DEC :SIDX
DEC :SBIDX ; DE DEST IDX, COUNTER
DEX
BNE :OPNLP ; CONT UNTIL COUNTER = 0
*
** MOVE THE SUBSTR INTO THE OPEN AREA
*
:MVESUB
LDA #1
STA :SIDX
; START AT ONE IN THE SUBSTR
; START AT INDEX IN THE STRING
LDX :S2LEN ; X = NUM OF CHARS TO MOVE
*
:MVELP
LDY :SIDX
LDA (ADDR2),Y ; GET NEXT CHAR
LDY :SINDEX
STA (ADDR1),Y
INC :SIDX ; INC SUBSTR INDEX
INC :SINDEX ; INC STR INDEX
DEX ; DEC COUNTER
BNE :MVELP ; CONT UNTIL COUNTER = 0
LDA :SCERR ; GET ERROR FLAG
BNE :EREXIT ; BR IF SUBSTR WAS TRUNCED
*
:OKEXIT
CLC
BCC :EXIT
:EREXIT
SEC ; ERROR EXIT
:EXIT
LDA :S1LEN
LDY #0
STA (ADDR1),Y
RTS
*
** DATA
*
:S1LEN DS 1
:S2LEN DS 1
:SUBLEN DS 1
:MLEN DS 1
:SINDEX DS 1
:SIDX DS 1
:SBIDX DS 1
:SCERR DS 1
*

View File

@ -0,0 +1,175 @@
*
*``````````````````````````````*
* SUBPOS :: SUBSTRING POSITION *
*- -*
* FIND THE POSITION OF A SUB- *
* STRING WITHIN ANOTHER STRING *
*- -*
* CLOBBERS: *
* *
* FLAGS: ????---- REG: AXYM *
*- -*
* CYCLES: ??? *
* SIZE: *
*- -*
* USAGE: *
* *
* LDA #>STR ; STRING ADDR *
* PHA *
* LDA #<STR *
* PHA *
* LDA #>SUB ; SUBSTR ADDR *
* PHA *
* LDA #<SUB *
* JSR SUBPOS *
*- -*
* ENTRY *
* *
* TOP OF STACK *
* *
* LOW BYTE OF RETURN ADDRESS *
* LOW BYTE OF SUBSTRING ADDR *
* HI BYTE OF SUBSTRING ADDR *
* LO BYTE OF STRING ADDR *
* HI BYTE OF STRING ADDRESS *
* HI BYTE OF RETURN ADDRESS *
*- -*
* EXIT *
* *
* TOP OF STACK *
* *
* LOW BYTE OF RETURN ADDRESS *
* HI BYTE OF RETURN ADDRESS *
* *
* Y = CLOBBERED; TRASH *
* X = CLOBBERED; TRASH *
* A = INDEX OF SUBSTRING IF *
* FOUND; OTHERWISE, 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. *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
SUBPOS
*
** SAVE RETURN ADDRESS
*
PLA
STA RETADR
PLA
STA RETADR+1
*
** GET PARAMETERS
*
PLA
STA ADDR2
PLA
STA ADDR2+1
PLA
STA ADDR1
PLA
STA ADDR1+1
*
** RESTORE RETURN ADDRESS
*
LDA RETADR+1
PHA
LDA RETADR
PHA
*
:POS
LDY #0
LDA (ADDR1),Y ; GET LENGTH OF STRING
BEQ :NOTFND ; EXIT IF LENGTH = 0
STA :SLEN
LDA (ADDR2),Y ; GET SUBSTR LENGTH
BEQ :NOTFND ; EXIT IF SUB LENGTH = 0
STA :SUBLEN
*
** IF THE SUBSTR IS LONGER THAN STR, DECLARE THE
** SUBSTR NOT FOUND
*
LDA :SUBLEN
CMP :SLEN
BEQ :LENOK
BCS :NOTFND ; CANNOT FIND SUBSTR IF
; LONGER THAN STR
*
** START, SEARCH, CONTINUE UNTIL
** REMAINING STR SHORTER THAN SUBSTR
*
:LENOK
LDA #1
STA :SINDEX ; START LOOKING AT FIRST
; CHARACTER OF STRING
LDA :SLEN ; CONT UNTIL REMAINING STR
; TOO SHORT
SEC ; COUNT=STR LEN - SUB LEN+1
SBC :SUBLEN
STA :SCOUNT
INC :SCOUNT
*
** SEARCH FOR SUBSTRING IN STRING
*
:SLP1
LDA :SINDEX
STA :SIDX ; START STR AT INDEX
LDA #1
STA :SUBIDX ; START SUB IND AT 1
*
** LOOK FOR SUBSTRING BEGINNING AT INDEX
*
:CMPLP
LDY :SIDX
LDA (ADDR1),Y ; GET NEXT CHAR FROM STR
LDY :SUBIDX
CMP (ADDR2),Y ; COMPARE TO NEXT SUB CHAR
BNE :SLP2 ; BR IF SUB NOT HERE
LDY :SUBIDX
CPY :SUBLEN ; TEST IF WE ARE DONE
BEQ :FOUND ; BR IF ALL CHARS WERE EQUAL
INY ; ELSE INC TO NEXT CHAR
STY :SUBIDX
INC :SIDX
JMP :CMPLP ; CONTINUE
*
** ARRIVE HERE IF SUBSTRING NOT FOUND
*
:SLP2
INC :SINDEX ; INCREMENT INDEX
DEC :SCOUNT ; DEC COUNT
BNE :SLP1 ; BR IF NOT DONE
BEQ :NOTFND ; ELSE EXIT TO NOT FOUND
*
:FOUND
LDA :SINDEX ; FOUND, A = STARTING IDX
JMP :EXIT
*
:NOTFND
LDA #0 ; SUB NOT FOUND, A=0
STA RESULT
:EXIT
RTS
*
** DATA
*
:SLEN DS 1
:SUBLEN DS 1
:SINDEX DS 1
:SUBIDX DS 1
:SCOUNT DS 1
:SIDX DS 1
*