mirror of
https://github.com/nathanriggs/AppleIIAsm-Collection.git
synced 2025-02-17 09:30:26 +00:00
added disk 4, strings library
This commit is contained in:
parent
eb2b7deea0
commit
8d0c21e0c7
875
disks/disk4_strings/STRINGS.DEMO
Normal file
875
disks/disk4_strings/STRINGS.DEMO
Normal 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
|
2233
disks/disk4_strings/STRINGS.DEMO.S
Normal file
2233
disks/disk4_strings/STRINGS.DEMO.S
Normal file
File diff suppressed because it is too large
Load Diff
46
disks/disk4_strings/T.DECS
Normal file
46
disks/disk4_strings/T.DECS
Normal 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
|
||||
*
|
265
disks/disk4_strings/T.STRINGS.DEMO
Normal file
265
disks/disk4_strings/T.STRINGS.DEMO
Normal 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
|
||||
*
|
9
disks/disk4_strings/T.STRINGS.HOOKS
Normal file
9
disks/disk4_strings/T.STRINGS.HOOKS
Normal file
@ -0,0 +1,9 @@
|
||||
*
|
||||
*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*
|
||||
* *
|
||||
* STRINGS.HOOKS *
|
||||
* *
|
||||
*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*
|
||||
*
|
||||
SCOUT1 EQU $FDF0
|
||||
*
|
872
disks/disk4_strings/T.STRINGS.LIB
Normal file
872
disks/disk4_strings/T.STRINGS.LIB
Normal 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
|
||||
*
|
307
disks/disk4_strings/T.STRINGS.MAC
Normal file
307
disks/disk4_strings/T.STRINGS.MAC
Normal 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
|
||||
<<<
|
204
disks/disk4_strings/T.STRINGS.NUM2STR
Normal file
204
disks/disk4_strings/T.STRINGS.NUM2STR
Normal 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
|
||||
*
|
91
disks/disk4_strings/T.STRINGS.PRNSTR
Normal file
91
disks/disk4_strings/T.STRINGS.PRNSTR
Normal 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
|
||||
*
|
||||
*
|
194
disks/disk4_strings/T.STRINGS.STR2NUM
Normal file
194
disks/disk4_strings/T.STRINGS.STR2NUM
Normal 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
|
||||
*
|
188
disks/disk4_strings/T.STRINGS.STRCAT
Normal file
188
disks/disk4_strings/T.STRINGS.STRCAT
Normal 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
|
||||
*
|
||||
*
|
152
disks/disk4_strings/T.STRINGS.STRCMP
Normal file
152
disks/disk4_strings/T.STRINGS.STRCMP
Normal 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
|
||||
*
|
876
disks/disk4_strings/T.SUBSTRINGS.LIB
Normal file
876
disks/disk4_strings/T.SUBSTRINGS.LIB
Normal 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
|
||||
*
|
221
disks/disk4_strings/T.SUBSTRINGS.SUBCOPY
Normal file
221
disks/disk4_strings/T.SUBSTRINGS.SUBCOPY
Normal 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
|
||||
*
|
197
disks/disk4_strings/T.SUBSTRINGS.SUBDEL
Normal file
197
disks/disk4_strings/T.SUBSTRINGS.SUBDEL
Normal 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
|
||||
*
|
245
disks/disk4_strings/T.SUBSTRINGS.SUBINS
Normal file
245
disks/disk4_strings/T.SUBSTRINGS.SUBINS
Normal 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
|
||||
*
|
175
disks/disk4_strings/T.SUBSTRINGS.SUBPOS
Normal file
175
disks/disk4_strings/T.SUBSTRINGS.SUBPOS
Normal 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
|
||||
*
|
Loading…
x
Reference in New Issue
Block a user