home *** CD-ROM | disk | FTP | other *** search
- ; SEARCH.ASM
- ;
- ;
- ; * * * REQUIRES MAC FOR ASSEMBLY * * *
- ;
- ;
- ; 'SEARCHES ASCII, CHARACTER STRINGS IN A FILE.
- ; MAY TAKE A GENERIC FILE NAME, THUS MAY SEARCH ALL *.ASM FILES
- ; ON A DISK. ALSO VERY USEFUL FOR FINDING THINGS IN MAST.CAT -
- ; FOR EXAMPLE IF YOU ARE LOOKING FOR ALL MODEM OR BYE PROGRAMS
- ; YOU COULD SEARCH LIBRARY.DAT TIME|ROBOTS TO SEE ALL ENTRIES
- ; CONTAINING REFERENCES TO EITHER "TIME" OR "ROBOTS."
- ;
- ;
- ; IMPORTANT
- ;
- ; THIS IS WARD CHRISTENSEN'S 'FIND.ASM'. I HAVE NOODLED
- ; A LITTLE WITH IT -- ESPECIALLY THE DB STATEMENTS -- SO
- ; IT CAN BE USED WITH THE FREEBASE DATA MANAGEMENT SYSTEM,
- ; BUT CHRISTENSEN SHOULD BE GIVEN CREDIT FOR CREATING IT!
- ; DAVID BROWN, STUDIO CITY, CA
- ;
- ;
- ; CAUTION:
- ;
- ; CONTAINS TERMINAL SPECIFIC STUFF AIMED AT FREEDOM 50
- ;
- ;
- ;THE USUAL EQUATES
-
- 0001 = RDCON EQU 1
- 0002 = WRCON EQU 2
- 0009 = PRINT EQU 9
- 000A = RSTRING EQU 10
- 000B = CONST EQU 11
- 000F = OPEN EQU 15
- 0010 = CLOSE EQU 16
- 0011 = SRCHF EQU 17
- 0012 = SRCHN EQU 18
- 0013 = ERASE EQU 19
- 0014 = READ EQU 20
- 0015 = WRITE EQU 21
- 0016 = MAKE EQU 22
- 0017 = REN EQU 23
- 001A = STDMA EQU 26
-
- 0005 = BDOS EQU 5
- 005C = FCB EQU 5CH
- 006C = FCB2 EQU 6CH
- 0068 = FCBEXT EQU FCB+12
- 007C = FCBRNO EQU FCB+32
- 0080 = TBUFF EQU 80H
-
- 000D = CR EQU 0DH
- 000A = LF EQU 0AH
- 001A = EOF EQU 1AH
- 0009 = TAB EQU 09H
-
- ;START OF MACRO DEFINITIONS
- ;
- ; DATA MOVE MACRO: MOVE FROM,TO,LENGTH
- ; MAY BE ADDR, OR QUOTED STRING
- ;
- MOVE MACRO FROM,TO,LEN
- LOCAL SKIP
- JMP SKIP
-
- ?MOVE: MOV A,B
- ORA C
- RZ
- MOV A,M
- STAX D
- INX H
- INX D
- DCX B
- JMP ?MOVE
-
- MOVE MACRO ?F,?T,?L
- IF NOT NUL ?F
- IRPC ?C,?F
- ?Q SET '&?C&?C' ;;TEST FOR QUOTE
- EXITM
- ENDM
- IF ?Q EQ ''''
- LOCAL ?B,?Z
- CALL ?Z
- ?B DB ?F
- ?Z POP H ;GET FROM
- LXI B,?Z-?B ;GET LEN
- ELSE
- LXI H,?F
- ENDIF
- ENDIF
- IF NOT NUL ?T
- LXI D,?T
- ENDIF
- IF NOT NUL ?L
- LXI B,?L
- ENDIF
- CALL ?MOVE
- ENDM
- SKIP: MOVE FROM,TO,LEN
- ENDM
-
- ; COMPARE MACRO: COMPAR FROM,TO,LENGTH
- ; MAY BE ADDR, OR QUOTED STRING.
- ;
- COMPAR MACRO FROM,TO,LEN
- LOCAL SKIP
- JMP SKIP
-
- ?COMPAR:MOV A,B
- ORA C
- RZ
- LDAX D
- CMP M
- RNZ
- INX D
- INX H
- DCX B
- JMP ?COMPAR
-
- COMPAR MACRO ?F,?T,?L
- IF NOT NUL ?F
- IRPC ?C,?F
- ?Q SET '&?C&?C' ;;TEST FOR QUOTE
- EXITM
- ENDM
- IF ?Q EQ ''''
- LOCAL ?B,?Z
- CALL ?Z
- ?B DB ?F
- ?Z POP H ;GET FROM
- LXI B,?Z-?B ;GET LEN
- ELSE
- LXI H,?F
- ENDIF
- ENDIF
- IF NOT NUL ?T
- LXI D,?T
- ENDIF
- IF NOT NUL ?L
- LXI B,?L
- ENDIF
- IF NOT NUL ?I
- LOCAL ?B,?Z
- CALL ?Z
- ?B DB ?I
- ?Z POP D ;GET TO
- LXI B,?Z-?B
- ENDIF
- CALL COMPARR
- ENDM
- SKIP: COMPAR FROM,TO,LEN
- ENDM
-
- ; CP/M MACRO - CPM FNC,PARM
- ;
- CPM MACRO ?F,?P
- PUSH B
- PUSH D
- PUSH H
- IF NOT NUL ?F
- MVI C,?F
- ENDIF
- IF NOT NUL ?P
- LXI D,?P
- ENDIF
- CALL BDOS
- POP H
- POP D
- POP B
- ENDM
- ;
- ; END OF MACRO DEFINITIONS
- ;
-
- 0100 ORG 100H
-
- ;- FIND -
- 0100 C32C05 JMP START
-
- ;DATA AREA
-
- 0103 5345415243PGMID: DB 'SEARCH - Version 1.0 7/2/84' ;*>DAVID BROWN
- 011E 0D0A24 DB CR,LF,'$'
- 0121 1A DB EOF
-
- 0122 4C49425241DFLTNAM:DB 'LIBRARY DAT' ;DEFAULT FILE NAME
-
- 012D 0D0A2B2B46ABORT: DB CR,LF,'++FIND ABORTED++$'
- 0140 0D0A2B2B43NOFILE: DB CR,LF,'++CANNOT FIND'
- 014F 2D2D2D2D3EFILMSG: DB '----> FILE '
- 015A 5858585858FNAME: DB 'XXXXXXXX.XXX'
- 0166 0D0A DB CR,LF
- 0168 0D0A24 CRLF: DB CR,LF,'$'
- 016B 1B2A PROMPT: DB 27,42 ;BLOW AWAY SCREEN
- 016D 1B77 DB 27,119 ; SET UP FOR SETTING INTENSITY PER CHAR
- 016F 1B5D38 DB 27,93,56 ;ROW 1, COL 25 -- TO CENTER, I HOPE
- 0172 1B4734 DB 27,71,52 ; SET INTENSITY TO FULL BLAST
- 0175 4620522045 DB 'F R E E B A S E II'
- 0189 1B4730 DB 27,71,48 ; SHUT OFF INTENSITY
- 018C 0D0A DB CR,LF
- 018E 0D0A DB CR,LF
- 0190 0D0A DB CR,LF
- 0192 0D0A DB CR,LF
- 0194 1B5D38 DB 27,93,56 ;ROW 1, COL 25, TOO
- 0197 2020534541 DB ' SEARCH PROGRAM '
- 01A9 0D0A DB CR,LF
- 01AB 0D0A413E53 DB CR,LF,'A>SEARCH File.Type [String]'
- 01C8 0D0A DB CR,LF
- 01CA 0D0A202020 DB CR,LF,' ^ ^ ^ '
- 01E7 0D0A202020 DB CR,LF,' | | | '
- 0204 0D0A202020 DB CR,LF,' | | |_Object of Search'
- 022E 0D0A202020 DB CR,LF,' | |_Type - can be *'
- 0251 0D0A202020 DB CR,LF,' |_Filename - can be *'
- 0272 0D0A202020 DB CR,LF,' Default = Library.Dat'
- 0295 0D0A0D0A DB CR,LF,CR,LF
- 0299 0D0A413E53 DB CR,LF,'A>SEARCH <-- Without Parameters for prompt.'
- 02C7 0D0A DB CR,LF
- 02C9 0D0A557070 DB CR,LF,'Upper case locates Upper & Lower case Occurrences'
- 02FC 0D0A0D0A DB CR,LF,CR,LF
- 0300 0000000000 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- 031D 0000000000 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- 033A 0000000000 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- 0351 0000000000 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0
- 035F 1B71 DB 27,113 ; TURN ON READOUT
- 0361 0D0A576F72 DB CR,LF,'Word or Phrase to Search For>'
- 0380 1B72 DB 27,114 ; TURN OFF READOUT
- 0382 0000000000 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- 0391 07 DB 7 ; BLOW THE HORN
- 0392 24 DB '$'
- ;RDBYTE FIELDS
- 0393 5408 EFCB: DW BUFF ;BUFFER ADDR
- 0395 0000 EFCBCT: DW 0 ;BYTES LEFT
- 0397 14 DB 20 ;BUFFER SIZE (IN PAGES)
- 0398 5C00 DW FCB ;FCB ADDRESS
-
- ;MFNAME FIELDS
- 039A 00 MFFLG1: DB 0 ;1ST TIME SW
- 039B MFREQ: DS 12 ;REQ NAME
- 03A7 MFCUR: DS 12 ;CURR NAME
-
- 03B3 C9 CONBUF: DB CONLEN ;LENGTH OF CONSOLE BUFFER
- 03B4 CONSIZ: DS 1 ;RESULTING SIZE AFTER READ
- 03B5 STRING: DS 200 ;WHAT TO SEARCH FOR
- 00C9 = CONLEN EQU $-CONSIZ
- 047D 2020202009LINENO: DB ' ',TAB,'$' ;LINE NUMBER
-
- 0483 DS 32 ;STACK AREA
- 04A3 STACK: DS 2
- 04A5 STRPTR: DS 2 ;POINTER FOR "|" SCAN
- 04A7 LINE: DS 133
-
- ;END OF DATA AREA
-
-
-
- ;- SAVE STACK, PRINT SIGN-ON, LOOK FOR FILE SPEC.
- 052C 210000 START: LXI H,0 ;SAVE STACK
- 052F 39 DAD SP
- 0530 22A304 SHLD STACK
- 0533 31A304 LXI SP,STACK
- CPM PRINT,PGMID ;PRINT SIGNON
- 0536+C5 PUSH B
- 0537+D5 PUSH D
- 0538+E5 PUSH H
- 0539+0E09 MVI C,PRINT
- 053B+110301 LXI D,PGMID
- 053E+CD0500 CALL BDOS
- 0541+E1 POP H
- 0542+D1 POP D
- 0543+C1 POP B
- 0544 3A5D00 LDA FCB+1
- 0547 FE20 CPI ' ' ;IF A FILE WAS SPECIFIED
- 0549 C26905 JNZ SETSTR ; GO SET UP STRING ENTERED
- ; ELSE
- MOVE DFLTNAM,FCB+1,11; MOVE IN DEFAULT FILENAME
- 054C+C35A05 JMP ??0001
- 054F+78 ?MOVE: MOV A,B
- 0550+B1 ORA C
- 0551+C8 RZ
- 0552+7E MOV A,M
- 0553+12 STAX D
- 0554+23 INX H
- 0555+13 INX D
- 0556+0B DCX B
- 0557+C34F05 JMP ?MOVE
- 055A+212201 LXI H,DFLTNAM
- 055D+115D00 LXI D,FCB+1
- 0560+010B00 LXI B,11
- 0563+CD4F05 CALL ?MOVE
- 0566 C39005 JMP GETSTR ; GO PROMPT FOR STRING.
-
- ;- SET STRING POINTERS, AND END DELIMITER.
- 0569 118000 SETSTR: LXI D,TBUFF ;DE=TBUFF
- 056C 1A LDAX D ;LENGTH
- 056D 4F MOV C,A ;SAVE LENGTH
- 056E 0600 MVI B,0 ;SETUP BC FOR MOVE
- 0570 13 INX D ;PAST LENGTH
- 0571 6F MOV L,A ;L=LENGTH
- 0572 2600 MVI H,0 ;HL=LENGTH
- 0574 19 DAD D ;HL=LAST CHAR
- 0575 3600 MVI M,0 ;STORE END DELIM
- 0577 EB XCHG ;START TO HL
-
- ;SCAN - LOOK FOR STRING, IF FOUND SAVE IT.
- 0578 23 SCAN: INX H ;TO NEXT CHAR
- 0579 7E MOV A,M ;LOOK FOR ' '
- 057A B7 ORA A ;END?
- 057B CA9005 JZ GETSTR ;..YES, THEN GET IT FROM THE CONSOLE
- 057E FE20 CPI ' ' ;
- 0580 C27805 JNZ SCAN ;NOT AT ' '
- 0583 23 INX H ;TO STRING
- MOVE ,STRING, ;HL = FROM, BC=LENGTH
- 0584+11B503 LXI D,STRING
- 0587+CD4F05 CALL ?MOVE
- 058A CDD005 CALL FRSTFI ;SEE IF FILE EXISTS
- 058D C31106 JMP OPFILE ;GO PROCESS IT
-
- ;GETSTR - ACCEPT STRING FROM CONSOLE.
- 0590 CDD005 GETSTR: CALL FRSTFI ;LOOK FOR FILE
- CPM PRINT,PROMPT ;DISPLAY PROMPT
- 0593+C5 PUSH B
- 0594+D5 PUSH D
- 0595+E5 PUSH H
- 0596+0E09 MVI C,PRINT
- 0598+116B01 LXI D,PROMPT
- 059B+CD0500 CALL BDOS
- 059E+E1 POP H
- 059F+D1 POP D
- 05A0+C1 POP B
- CPM RSTRING,CONBUF ;GET STRING
- 05A1+C5 PUSH B
- 05A2+D5 PUSH D
- 05A3+E5 PUSH H
- 05A4+0E0A MVI C,RSTRING
- 05A6+11B303 LXI D,CONBUF
- 05A9+CD0500 CALL BDOS
- 05AC+E1 POP H
- 05AD+D1 POP D
- 05AE+C1 POP B
- 05AF 3AB403 LDA CONSIZ
- 05B2 B7 ORA A
- 05B3 CA3D07 JZ EXIT
- 05B6 6F MOV L,A ;STORE DELIMITER
- 05B7 2600 MVI H,0
- 05B9 11B503 LXI D,STRING
- 05BC 19 DAD D
- 05BD 3600 MVI M,0
- CPM PRINT,CRLF
- 05BF+C5 PUSH B
- 05C0+D5 PUSH D
- 05C1+E5 PUSH H
- 05C2+0E09 MVI C,PRINT
- 05C4+116801 LXI D,CRLF
- 05C7+CD0500 CALL BDOS
- 05CA+E1 POP H
- 05CB+D1 POP D
- 05CC+C1 POP B
- 05CD C31106 JMP OPFILE ;PROCESS FILE
-
- ;FRSTFI - SEARCH FOR INITIAL FILE AND PRINT IT'S NAME.
- 05D0 CDA707 FRSTFI: CALL MFNAME ;IF FILE DOES NOT EXIST
- 05D3 D0 RNC ; TELL THEM AND EXIT.
- MOVE FCB+1,FNAME,8
- 05D4+215D00 LXI H,FCB+1
- 05D7+115A01 LXI D,FNAME
- 05DA+010800 LXI B,8
- 05DD+CD4F05 CALL ?MOVE
- MOVE FCB+9,FNAME+9,3
- 05E0+216500 LXI H,FCB+9
- 05E3+116301 LXI D,FNAME+9
- 05E6+010300 LXI B,3
- 05E9+CD4F05 CALL ?MOVE
- CPM PRINT,NOFILE
- 05EC+C5 PUSH B
- 05ED+D5 PUSH D
- 05EE+E5 PUSH H
- 05EF+0E09 MVI C,PRINT
- 05F1+114001 LXI D,NOFILE
- 05F4+CD0500 CALL BDOS
- 05F7+E1 POP H
- 05F8+D1 POP D
- 05F9+C1 POP B
- 05FA C33D07 JMP EXIT
-
- ;NEXTFL - LOOK FOR ANOTHER FILE, IF NONE THEN EXIT.
- NEXTFL: CPM PRINT,CRLF
- 05FD+C5 PUSH B
- 05FE+D5 PUSH D
- 05FF+E5 PUSH H
- 0600+0E09 MVI C,PRINT
- 0602+116801 LXI D,CRLF
- 0605+CD0500 CALL BDOS
- 0608+E1 POP H
- 0609+D1 POP D
- 060A+C1 POP B
- 060B CDA707 CALL MFNAME
- 060E DA3D07 JC EXIT
-
- ;OPFILE - OPEN FILE AND PRINT NAME.
- OPFILE: CPM OPEN,FCB
- 0611+C5 PUSH B
- 0612+D5 PUSH D
- 0613+E5 PUSH H
- 0614+0E0F MVI C,OPEN
- 0616+115C00 LXI D,FCB
- 0619+CD0500 CALL BDOS
- 061C+E1 POP H
- 061D+D1 POP D
- 061E+C1 POP B
- 061F 3C INR A
- 0620 CA3D07 JZ EXIT
- MOVE ' 0',LINENO
- 0623+CD2A06 CALL ??0003
- 0626+20202030 ??0002 DB ' 0'
- 062A+E1 ??0003 POP H ;GET FROM
- 062B+010400 LXI B,??0003-??0002 ;GET LEN
- 062E+117D04 LXI D,LINENO
- 0631+CD4F05 CALL ?MOVE
- MOVE FCB+1,FNAME,8
- 0634+215D00 LXI H,FCB+1
- 0637+115A01 LXI D,FNAME
- 063A+010800 LXI B,8
- 063D+CD4F05 CALL ?MOVE
- MOVE FCB+9,FNAME+9,3
- 0640+216500 LXI H,FCB+9
- 0643+116301 LXI D,FNAME+9
- 0646+010300 LXI B,3
- 0649+CD4F05 CALL ?MOVE
- CPM PRINT,FILMSG ;SAY WHICH FILE
- 064C+C5 PUSH B
- 064D+D5 PUSH D
- 064E+E5 PUSH H
- 064F+0E09 MVI C,PRINT
- 0651+114F01 LXI D,FILMSG
- 0654+CD0500 CALL BDOS
- 0657+E1 POP H
- 0658+D1 POP D
- 0659+C1 POP B
- 065A 210000 LXI H,0
- 065D 229503 SHLD EFCBCT
-
- ;NEXTLN - SET UP NEXT LINE NUMBER.
- 0660 218004 NEXTLN: LXI H,LINENO+3
- 0663 7E NEXT01: MOV A,M ;GET DIGIT
- 0664 F630 ORI '0' ;MAKE ASCII
- 0666 3C INR A
- 0667 77 MOV M,A
- 0668 FE3A CPI '9'+1 ;CARRY?
- 066A C27306 JNZ NEXTNC
- 066D 3630 MVI M,'0'
- 066F 2B DCX H
- 0670 C36306 JMP NEXT01
-
- ;NEXTNC - READ A LINE FROM FILE.
- 0673 21A704 NEXTNC: LXI H,LINE
- 0676 06FF MVI B,0FFH ;SO LONG LINE WON'T BLOW
- 0678 04 NEXT02: INR B
- 0679 FA9506 JM LONG ;TOO LONG A LINE
- 067C C5 PUSH B
- 067D E5 PUSH H
- 067E 219303 LXI H,EFCB
- 0681 CD4207 CALL RDBYTE
- 0684 E1 POP H
- 0685 C1 POP B
- 0686 77 MOV M,A
- 0687 23 INX H
- 0688 FE1A CPI EOF
- 068A CAFD05 JZ NEXTFL ;NEXT FILE
- 068D FE0A CPI LF
- 068F C27806 JNZ NEXT02
- 0692 C39A06 JMP EOL
-
- ;LONG - GOT A LONG LINE, CHOP IT OFF.
- 0695 360D LONG: MVI M,CR
- 0697 23 INX H
- 0698 360A MVI M,LF
-
- ;EOL - CHECK FOR OPERATOR ABORT, POINT TO STRING.
- EOL: CPM CONST ;TEST FOR ABORT
- 069A+C5 PUSH B
- 069B+D5 PUSH D
- 069C+E5 PUSH H
- 069D+0E0B MVI C,CONST
- 069F+CD0500 CALL BDOS
- 06A2+E1 POP H
- 06A3+D1 POP D
- 06A4+C1 POP B
- 06A5 B7 ORA A
- 06A6 C22407 JNZ CHRXIT ;ABORT REQUESTED
- 06A9 21B503 LXI H,STRING
-
- ;XXXXXX - WE HAVE A LINE, NOW SCAN FOR THE STRING.
- 06AC 22A504 ORLINE: SHLD STRPTR
- 06AF 21A704 LXI H,LINE
- 06B2 EB NEXTST: XCHG
- 06B3 2AA504 LHLD STRPTR
- 06B6 EB XCHG ;(HL)->LINE - (DE)->STRING
- 06B7 E5 PUSH H
-
- ;NEXTC - REPLACE '_' WITH A TAB.
- 06B8 1A NEXTC: LDAX D
- 06B9 FE5F CPI '_'
- 06BB C2C006 JNZ NOTAB
- 06BE 3E09 MVI A,TAB
- 06C0 13 NOTAB: INX D
- 06C1 B7 ORA A ;END OF STRING?
- 06C2 CAFB06 JZ MATCHED
- 06C5 FE7C CPI '|'
- 06C7 CAFB06 JZ MATCHED ;FIRST PART
- 06CA 4E MOV C,M ;FOR LOWER CASE TEST
- 06CB BE CMP M
- 06CC 23 INX H
- 06CD CAB806 JZ NEXTC
- 06D0 47 MOV B,A ;SAVE CHAR
- 06D1 79 MOV A,C ;GET CHAR
- 06D2 FE61 CPI 61H ;LOWER?
- 06D4 DAE206 JC NOTEQ ;NO, SO NO MATCH
- 06D7 FE7B CPI 7BH
- 06D9 D2E206 JNC NOTEQ
- 06DC E65F ANI 5FH ;MAKE UPPER CASE
- 06DE B8 CMP B
- 06DF CAB806 JZ NEXTC ;MATCHED
-
- 06E2 E1 NOTEQ: POP H ;RESTORE ADDR
- 06E3 23 INX H
- 06E4 7E MOV A,M
- 06E5 FE0D CPI CR
- 06E7 C2B206 JNZ NEXTST
- 06EA 2AA504 LHLD STRPTR
-
- ;FINDOR - IF AN "OR" (|) IS IN THE LINE, SCAN FOR IT.
- 06ED 7E FINDOR: MOV A,M
- 06EE 23 INX H
- 06EF FE7C CPI '|'
- 06F1 CAAC06 JZ ORLINE
- 06F4 B7 ORA A
- 06F5 C2ED06 JNZ FINDOR
- 06F8 C36006 JMP NEXTLN
-
- ;MATCHED - GOT A MATCH PRINT IT.
- 06FB E1 MATCHED:POP H ;KILL STACKED ADDR
- CPM PRINT,LINENO ;PRINT LINE NUMBER
- 06FC+C5 PUSH B
- 06FD+D5 PUSH D
- 06FE+E5 PUSH H
- 06FF+0E09 MVI C,PRINT
- 0701+117D04 LXI D,LINENO
- 0704+CD0500 CALL BDOS
- 0707+E1 POP H
- 0708+D1 POP D
- 0709+C1 POP B
- 070A 21A704 LXI H,LINE
- 070D 7E MATCHLP:MOV A,M
- 070E 5F MOV E,A
- CPM WRCON
- 070F+C5 PUSH B
- 0710+D5 PUSH D
- 0711+E5 PUSH H
- 0712+0E02 MVI C,WRCON
- 0714+CD0500 CALL BDOS
- 0717+E1 POP H
- 0718+D1 POP D
- 0719+C1 POP B
- 071A 7E MOV A,M
- 071B 23 INX H
- 071C FE0A CPI LF
- 071E C20D07 JNZ MATCHLP
- 0721 C36006 JMP NEXTLN
-
- ;CHRXIT - READ KEYBOARD, PRINT ABORT MESSAGE.
- CHRXIT: CPM RDCON
- 0724+C5 PUSH B
- 0725+D5 PUSH D
- 0726+E5 PUSH H
- 0727+0E01 MVI C,RDCON
- 0729+CD0500 CALL BDOS
- 072C+E1 POP H
- 072D+D1 POP D
- 072E+C1 POP B
- CPM PRINT,ABORT
- 072F+C5 PUSH B
- 0730+D5 PUSH D
- 0731+E5 PUSH H
- 0732+0E09 MVI C,PRINT
- 0734+112D01 LXI D,ABORT
- 0737+CD0500 CALL BDOS
- 073A+E1 POP H
- 073B+D1 POP D
- 073C+C1 POP B
-
- ;EXIT - RESTORE STACK AND RETURN TO CP/M.
- 073D 2AA304 EXIT: LHLD STACK
- 0740 F9 SPHL
- 0741 C9 RET ;TO CCP
-
- ;SUBROUTINES
- ;
- ;RDBYTE - READ BYTE FROM FILE.
- ; HL POINTS TO EFCB:
- ; EFCB;
- ; 2 BYTE BUFFER ADDR
- ; 2 BYTE "BYTES LEFT" (INIT TO 0)
- ; 1 BYTE BUFFER SIZE (IN PAGES)
- ; 2 BYTE FCB ADDRESS
- ;
- 0742 5E RDBYTE: MOV E,M ;DE = BUFFER ADDR
- 0743 23 INX H ;X
- 0744 56 MOV D,M ;X
- 0745 23 INX H ;BC = BYTES LEFT
- 0746 4E MOV C,M ;X
- 0747 23 INX H ;X
- 0748 46 MOV B,M ;X
- 0749 78 MOV A,B ;IF BYTE-COUNT NOT = ZERO
- 074A B1 ORA C ; GO READ NEXT BYTE
- 074B C29107 JNZ RDGETB ; ELSE
- 074E 23 INX H ; READ ANOTHER SECTOR.
- 074F 7E MOV A,M ;GET COUNT
- 0750 87 ADD A ;MULTIPLY BY 2
- 0751 47 MOV B,A ;SECTOR COUNT IN B
- 0752 23 INX H ;TO FCB
- 0753 E5 PUSH H ;SAVE FCB POINTER
- 0754 7E MOV A,M ;GET..
- 0755 23 INX H ;..FCB..
- 0756 66 MOV H,M ;..ADDR..
- 0757 6F MOV L,A ;..TO HL
-
- 0758 3E1A RDBLP: MVI A,EOF ;PUT EOF CHAR IN BUF
- 075A 12 STAX D ; IN CASE OF EOF.
- 075B D5 PUSH D ;SAVE DMA ADDR
- 075C E5 PUSH H ;SAVE FCB ADDR
- CPM STDMA ;SET DMA ADDR
- 075D+C5 PUSH B
- 075E+D5 PUSH D
- 075F+E5 PUSH H
- 0760+0E1A MVI C,STDMA
- 0762+CD0500 CALL BDOS
- 0765+E1 POP H
- 0766+D1 POP D
- 0767+C1 POP B
- 0768 D1 POP D ;GET FCB
- CPM READ ;READ SECTOR
- 0769+C5 PUSH B
- 076A+D5 PUSH D
- 076B+E5 PUSH H
- 076C+0E14 MVI C,READ
- 076E+CD0500 CALL BDOS
- 0771+E1 POP H
- 0772+D1 POP D
- 0773+C1 POP B
- 0774 B7 ORA A ;CHECK FOR EOF
- 0775 E1 POP H ;HL=DMA, DE=FCB
- 0776 C28607 JNZ RDBRET ;GOT EOF
- 0779 7D MOV A,L ;BUMP BUFFER POINTER
- 077A C680 ADI 80H ;TO NEXT BUFF
- 077C 6F MOV L,A ;X
- 077D 7C MOV A,H ;X
- 077E CE00 ACI 0 ;X
- 0780 67 MOV H,A ;X
- 0781 EB XCHG ;DMA TO DE, FCB TO HL
- 0782 05 DCR B ;MORE SECTORS?
- 0783 C25807 JNZ RDBLP ;YES, MORE
- 0786 E1 RDBRET: POP H ;GET FCB POINTER
- 0787 2B DCX H ;TO LENGTH
- 0788 7E MOV A,M ;GET LENGTH
- 0789 2B DCX H ;TO COUNT
- 078A 77 MOV M,A ;SET PAGE COUNT
- 078B 2B DCX H ;TO LO COUNT
- 078C 2B DCX H ;TO HI FCB
- 078D 2B DCX H ;TO EFCB START
- 078E C34207 JMP RDBYTE ;LOOP THRU AGAIN
-
- 0791 23 RDGETB: INX H ;POINT TO BUFFER SIZE
- 0792 7E MOV A,M ;GET LENGTH (PAGES)
- 0793 EB XCHG ;BUFF TO HL
- 0794 84 ADD H ;HL = END OF BUFF
- 0795 67 MOV H,A ;X
- 0796 7D MOV A,L ;X
- 0797 91 SUB C ;HL = DATA POINTER
- 0798 6F MOV L,A ;X
- 0799 7C MOV A,H ;X
- 079A 98 SBB B ;X
- 079B 67 MOV H,A ;X
- 079C 7E MOV A,M ;GET BYTE
- 079D EB XCHG ;EFCB POINTER BACK TO HL
- 079E FE1A CPI EOF ;EOF?
- 07A0 C8 RZ ;YES, LEAVE POINTERS
- 07A1 0B DCX B ;DECR COUNT
- 07A2 2B DCX H ;POINT BACK TO "BYTES LEFT"
- 07A3 70 MOV M,B ;STORE BACK COUNT
- 07A4 2B DCX H ;X
- 07A5 71 MOV M,C ;X
- 07A6 C9 RET ;RETURN TO CALLER
-
-
-
-
- ;MFNAME - MULT-FILE ACCESS SUBROUTINE.
- ;
- ; MULTI-FILE ACCESS SUBROUTINE. ALLOWS PROCESSING
- ; OF MULTIPLE FILES (I.E. *.ASM) FROM DISK. THIS
- ; ROUTINE BUILDS THE PROPER NAME IN THE FCB EACH
- ; TIME IT IS CALLED. THIS COMMAND WOULD BE USED
- ; IN SUCH PROGRAMS AS MODEM TRANSFER, TAPE SAVE,
- ; ETC IN WHICH YOU WANT TO PROCESS SINGLE OR
- ; MULTIPLE FILES.
- ;
- ; JUST CALL "MFNAME" (MULTIPLE FILE NAME) AND THE FCB
- ; WILL BE SET UP WITH THE NEXT NAME, READY TO
- ; DO NORMAL PROCESSING (OPEN, READ, ETC.)
- ;
- ; CARRY IS SET IF NO MORE NAMES CAN BE FOUND
- ;
- ; THE ROUTINE IS COMMENTED IN PSEUDO CODE,
- ; EACH PSEUDO CODE STATEMENT IS IN <<...>>
- ;
- MFNAME: CPM STDMA,80H ;<<INIT DMA ADDR, FCB>>
- 07A7+C5 PUSH B
- 07A8+D5 PUSH D
- 07A9+E5 PUSH H
- 07AA+0E1A MVI C,STDMA
- 07AC+118000 LXI D,80H
- 07AF+CD0500 CALL BDOS
- 07B2+E1 POP H
- 07B3+D1 POP D
- 07B4+C1 POP B
- 07B5 AF XRA A
- 07B6 326800 STA FCBEXT
- 07B9 327C00 STA FCBRNO
-
- 07BC 3A9A03 LDA MFFLG1 ;<<IF FIRST TIME>>
- 07BF B7 ORA A
- 07C0 C2F707 JNZ MFN01
- 07C3 3E01 MVI A,1 ; <<TURN OFF 1ST TIME SW>>
- 07C5 329A03 STA MFFLG1
- MOVE FCB,MFREQ,12 ; <<SAVE THE REQUESTED NAME>>
- 07C8+215C00 LXI H,FCB
- 07CB+119B03 LXI D,MFREQ
- 07CE+010C00 LXI B,12
- 07D1+CD4F05 CALL ?MOVE
- 07D4 3A5C00 LDA FCB
- 07D7 32A703 STA MFCUR
- MOVE MFREQ,FCB,12 ; <<SRCHF REQ NAME>>
- 07DA+219B03 LXI H,MFREQ
- 07DD+115C00 LXI D,FCB
- 07E0+010C00 LXI B,12
- 07E3+CD4F05 CALL ?MOVE
- CPM SRCHF,FCB
- 07E6+C5 PUSH B
- 07E7+D5 PUSH D
- 07E8+E5 PUSH H
- 07E9+0E11 MVI C,SRCHF
- 07EB+115C00 LXI D,FCB
- 07EE+CD0500 CALL BDOS
- 07F1+E1 POP H
- 07F2+D1 POP D
- 07F3+C1 POP B
- 07F4 C32B08 JMP MFN02 ;<<ELSE>>
-
- MFN01: MOVE MFCUR,FCB,12 ; <<SRCHF CURR NAME>>
- 07F7+21A703 LXI H,MFCUR
- 07FA+115C00 LXI D,FCB
- 07FD+010C00 LXI B,12
- 0800+CD4F05 CALL ?MOVE
- CPM SRCHF,FCB
- 0803+C5 PUSH B
- 0804+D5 PUSH D
- 0805+E5 PUSH H
- 0806+0E11 MVI C,SRCHF
- 0808+115C00 LXI D,FCB
- 080B+CD0500 CALL BDOS
- 080E+E1 POP H
- 080F+D1 POP D
- 0810+C1 POP B
- MOVE MFREQ,FCB,12 ; <<SRCHN REQ NAME>>
- 0811+219B03 LXI H,MFREQ
- 0814+115C00 LXI D,FCB
- 0817+010C00 LXI B,12
- 081A+CD4F05 CALL ?MOVE
- CPM SRCHN,FCB ;<<ENDIF>>
- 081D+C5 PUSH B
- 081E+D5 PUSH D
- 081F+E5 PUSH H
- 0820+0E12 MVI C,SRCHN
- 0822+115C00 LXI D,FCB
- 0825+CD0500 CALL BDOS
- 0828+E1 POP H
- 0829+D1 POP D
- 082A+C1 POP B
-
- 082B 3C MFN02: INR A ;<<RETURN CARRY IF NOT FOUND>>
- 082C 37 STC
- 082D C8 RZ
-
- 082E 3D DCR A ;<<MOVE NAME FOUND TO CURR>>
- 082F E603 ANI 3
- 0831 87 ADD A
- 0832 87 ADD A
- 0833 87 ADD A
- 0834 87 ADD A
- 0835 87 ADD A
- 0836 C681 ADI 81H
- 0838 6F MOV L,A
- 0839 2600 MVI H,0
- 083B E5 PUSH H
- MOVE ,MFCUR+1,11
- 083C+11A803 LXI D,MFCUR+1
- 083F+010B00 LXI B,11
- 0842+CD4F05 CALL ?MOVE
-
- 0845 E1 POP H ;<<MOVE NAME FOUND TO FCB>>
- MOVE ,FCB+1,11
- 0846+115D00 LXI D,FCB+1
- 0849+010B00 LXI B,11
- 084C+CD4F05 CALL ?MOVE
-
- 084F AF XRA A ;<<SETUP FCB>>
- 0850 326800 STA FCBEXT
- 0853 C9 RET ;<<RETURN>>
-
- 0854 = BUFF EQU $ ;DISK READ BUFER
-
- 0854 END