ееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееее-ACPMUG °6BPREFMT ВASPURGE БSMQUICKIE ВASREPORT ВAS@ SIZE БSM)SLOAD БSM#SORT БSM4 DCR A ;MAKE A=0, B=1 MOV C,A ;SEND IT IN C, CALL SELDSK ;TO SELECT THE DISK NOSET MVI C,2 ;GET TRACK 2 CALL SETTRK ;GO DO IT MVI C,1 ;GET SECTOR PURGE PUSH B ;SAVE SECTOR CALL SETSEC ;SEEK TO IT CALL RDSEC ;READ THE SECTOR LXI H,80H ;POICORD' FLAG. \ A RECORD IN USE WILL HAVE A '1' HERE. INPUT "NAME OF FILE TO PREFORMAT";FILE.NAME$ PRINT "NUMBER OF SECTORS IN FILE" PRINT "(MUST AGREE WITH FILE.SIZE IN:" PRINT " MAINT.BAS AND" INPUT " REPORT.BAS) ";NO.SEC REM RECееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееее PROVIDING THE JMP TABLE FOR ;YOUR CBIOS IS 512 BYTES FROM THE END OF THE SYSTEM. ; IF NOT MODIFIED LXI D,ERRMSG MVI C,PRINT JMP BDOS ERRMSG DB '++THIS PROGRAM HAS NOT BEEN MODIFIED',13,10 DB 'FOR YOUR CBIOS. EDIT PURGE.ASM AND'13,10 DB 'MAееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееTISQ БSM!"#$TLOAD БSM(%&'()TMAP БSM *+TSAVE БSM",-./0XREFASM БSMЂ123456789:;<=>?@XREFASM БSMЂABCDEFGHIJKLMNOPXREFASM БSMЂQRSTUVWXYZ[\]^_`XREFASM БSMOabcdefghijееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееее LENGTH 128 RECOMMENDED FOR SPEED OF ACCESS \ BUT IS NOT REQUIRED. FILE FILE.NAME$(128) FOR I=1 TO NO.SEC PRINT #1,I;0,"EMPTY RECORD",I IF I=10*INT(I/10) THEN PRINT "RECORD ";I NEXT PRINT "DONE " END ееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееKE APPROPRIATE CHANGES TO THE EQUATES' DB 10,13,'$' ENDIF CALL START IDMSG DB 'PURGE 09/10/77',0DH,0AH,'$' START POP D ;GET ID MESSGE MVI C,PRINT CALL BDOS ;PRINT ID LDA FCB ;GET DISK (0, 1, 2) ORA A ;USE LOGGED IN DISK? JZ NOSET ;..YESREM THIS IS "PREFMT.BAS" REM ROUTINE TO PREFORMAT A DISK FILE FOR USE \ WITH 'MAINT.BAS' AND 'REPORT.BAS' \ FOR MAINTAINING A COMPUTER CLUB MAILING LIST REM PROGRAM LOGIC - WRITES A '0' AS THE FIRST FIELD \ IN THE FILE - THIS IS THE 'EMPTY RECATALOG ¶ klеEDVDM DOCmеEXPLAIN DOCnopqеMAILLISTDOCprstuvwxyz{|}~ееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееMODIFIED EQU 0 ;CHANGE TO 1 WHEN CBIOS EQUATES SET OK ;PURGE - ROUTINE TO CLEAR UP A DIRECTORY ORG 100H ; ;YOU MUST MODIFY THE SYSTEM EQUATES FOR DISK PHYSICAL I/O ;BEFORE RUNNING THIS SYSTEM. ALL YOU HAVE TO DO IS CHANGE ;'SYSSIZ' FOR YOUR SYSTEM,ееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееNT TO BUFFER LXI D,32 ;DIRECTORY ENTRY LENGTH CALL CHECK ;CHECK FIRST ENTRY DAD D CALL CHECK ;CHECK SECOND ENTRY DAD D CALL CHECK ;CHECK THIRD ENTRY DAD D CALL CHECK ;CHECK LAST ENTRY CALL WRSEC ;WRITE IT BACK ;GET NEXT SECTOR POP B ;GT READ FIELD.NAME$(I) NEXT I REM MAIN PROCESSING LOOP 100 INPUT "COMMAND--->";C$ IF C$="HELP" THEN 200 IF LEFT$(C$,6)="INDEX " THEN 1000 IF LEFT$(C$,9)="POSITION " THEN 1100 IF LEFT$(C$,6)="TITLE " THEN 1300 IF C$="PRINT" THEN 1400 IF LCO$,PA$,TY$ IF PA$<>"7606" THEN 100 PRINT "DELETED ";NA$;" ";PA$ FLAG=0 PRINT #1,I;FLAG,SO$,NA$,OR$,ST$,CI$,ZI$,PH$,CO$,PA$,TY$ 100 NEXT I END CREMENT IT MOV M,A CPI '9'+1 ;CARRY? JC BUMPDN ;..NO, DONE MVI M,'0' DCX H JMP BUMP BUMPDN POP H RET ; MSG DB '00 ENTRIES PURGED$' ; ;BDOS/CBIOS EQUATES (VERSION 4) ; RDCON EQU 1 WRCON EQU 2 PRINT EQU 9 OPEN EQU 15 ;0FFH=NOT FOUND EAD KB = 1 :REM KEYBOARD INPUT ABORT = 255 :REM KB VALUE TO ABORT LF = 138:REM LINEFEED FROM KB FIELD.COUNT = 10 :REM # FIELDS IN RECORD FILE FILE.NAME$(REC.LENG),\ FILE.NAME$(REC.LENG),\ FILE.NAME$(REC.LENG),\ FILE.NAME$(REC.LENG) DIMееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееET SECTOR (IN C) INR C MOV A,C ;GET VALUE CPI 17 JC PURGE ;LOOP UNTIL DONE ;PRINT NUMBER OF ENTRIES FIXED LXI D,MSG MVI C,PRINT CALL BDOS RET ;CHECK IF A DIRECTORY ENTRY (POINTED TO BY H,L) ; IS CORRECT (0 IF IN USE, E5 IF EMPTY) ; IF NееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееCLOSE EQU 16 ; " " SRCHF EQU 17 ; " " SRCHN EQU 18 ; " " DELT EQU 19 ;NO RET CODE READ EQU 20 ;0=OK, 1=EOF WRITE EQU 21 ;0=OK, 1=ERR, 2=?, 0FFH=NO DIR SPC MAKE EQU 22 ;0FFH=BAD REN EQU 23 ;0FFH=BAD STDMA EQU 26 BDOS EQU 5 FCB EQU 5CH SYSS FIELD.NAME$(FIELD.COUNT) DIM RECORD$(FIELD.COUNT) DIM INDEX(INDEX.SIZE) DIM LINE$(4,4) TITLE$=CHR$(14)+"CACHE MAILING LIST" REM READ FIELD NAMES DATA SORT,NAME,ORGANIZATION,STREET,CITY,ZIP,\ PHONE,COMPUTER,PAID,TYPE FOR I = 1 TO FIELD.COUNREM - QUICKIE - ODD JOB CACHE FILE MAINT PROGRAM FILE.NAME$="CACHE.FIL" FILE FILE.NAME$(128) INPUT"STARTING, ENDING RECORD";STARTING,ENDING FOR I=STARTING TO ENDING READ #1,I;FLAG IF FLAG=0 THEN 100 READ #1,I;FLAG,SO$,NA$,OR$,ST$,CI$,ZI$,PH$,OT, FORCE IT TO BE AN E5 (EMPTY) CHECK MOV A,M ;GET CHAR CPI 0E5H RZ ;RET IF E5 ORA A RZ ;RET IF IN USE MVI M,0E5H ;CLEAR IT OUT ;BUMP COUNT OF CHANGED RECORDS PUSH H LXI H,MSG+1 ;POINT TO SECOND DIGIT BUMP MOV A,M ;GET DIGIT INR A ;INREM CACHE MAILING LIST REPORT PROGRAM PRINT "REPORT VERSION 0.8" SPACES$=" " UP = 3 WIDTH = 38 LENGTH = 6 FILE.NAME$="CACHE.FIL" FILE.SIZE = 512 INDEX.SIZE = 400 REC.LENG = 128 INDEX.READ = 0 :REM SHOW NO INDEX RееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееIZ EQU 24 ;SYSTEM SIZE CBIOS EQU SYSSIZ*1024-512 SELDSK EQU CBIOS+1BH SETTRK EQU SELDSK+3 SETSEC EQU SETTRK+3 SETDMA EQU SETSEC+3 RDSEC EQU SETDMA+3 WRSEC EQU RDSEC+3 EFT$(C$,6)="WIDTH " THEN 1500 IF LEFT$(C$,7)="LENGTH "THEN 1550 IF C$="TAGS" THEN 1600 IF C$="LABELS" THEN 1600 IF C$="CHECK" THEN 1700 IF LEFT$(C$,3)="UP " THEN 1800 IF C$="END" THEN 9999 199 PRINT "INVALID COMMAND" GOTO 100 REM HELP 20EXT BLANK.POS GOTO 1628 1624 IF MID$(NAME$+" ",BLANK.POS+1,2)="JR" THEN 1622 IF BLANK.POS<4 THEN 1628 IF MID$(NAME$,BLANK.POS-2,2)="MC" THEN 1622 IF MID$(NAME$,BLANK.POS-3,3)="VAN" THEN 1622 IF MID$(NAME$,BLANK.POS-3,3)=" DE" THEN 1622 IF MIDONE----";\ TAB(T7);"MICRO";\ TAB(T8);"PAID";\ TAB(T9);"T" PRINT 1420 IF POSITION > INDEX.COUNT THEN 1490 KEY = INDEX(POSITION) POSITION = POSITION + 1 GOSUB 8800 PRINT SORT$;\ TAB(T1);NAME$;\ TAB(T2);ORGANIZATION$;\ TAB(T3);STR READ 1080 PRINT "POSITIONED TO RECORD 1" POSITION = 1 GOTO 100 REM POSITION TO PARTICULAR RECORD 1100 X=ASC(MID$(C$,10,1)) IF X > 47 AND X < 58 THEN 1200 GOSUB 8910 :REM EXTRACT FIELD NAME, VALUE IF INDEX.READ = 0 THEN 8700 X=LEN(FIELD.VA INDEX.READ = 0 THEN 8700 1610 IF INP(KB)<>LF THEN 1610 REM READ 'UP' LABELS OR TAGS 1620 IF POSITION > INDEX.COUNT THEN 1690 IF INP(KB)<>LF THEN 1690 FOR I=1 TO UP 1621 IF POSITION > INDEX.COUNT THEN 1650 KEY = INDEX(POSITION) POSITION = POSI 1405 IF INP(KB)<>LF THEN 1405 REM SET UP FIELD TABS T1=6 T2=T1+25 T3=T2+21 T4=T3+25 IF WIDTH < 80 THEN T4 = 6 T5=T4+21 T6=T5+6 T7=T6+15 T8=T7+6 T9=T8+5 REM PRINT A PAGE 1410 PRINT TITLE$ PRINT LINE.COUNT = 7 PRINT "SORT";\0 PRINT "END TO END EXECUTION" PRINT "INDEX FN.FT READ INDEX FILE" PRINT "POSITION FIELD VALUE POSITION VIA FILE SCAN" PRINT GOTO 100 REM READ INDEX FILE 1000 INDEX.NAME$=MID$(C$,7,99) PRINT "READING FILE ";INDEX.NAME$ FILE INDEX.NAME$ IF .COUNT < 60 THEN 1420 PRINT CHR$(12) :REM EJECT GOTO 1410 REM WAIT FOR KEY PRESSED OTHER THAN LINEFEED 1490 PRINT 1495 IF INP(KB)=LF THEN 1495 GOTO 100 REM SET REPORT OR LABEL WIDTH 1500 WIDTH = VAL(MID$(C$,7,99)) IF WIDTH > 24 THEN 100 PEET$; IF WIDTH < 80 THEN \ PRINT :\ LINE.COUNT = LINE.COUNT + 1 PRINT TAB(T4);CITY$;\ TAB(T5);ZIP$;\ TAB(T6);PHONE$;\ TAB(T7);COM$;\ TAB(T8);PAID$;\ TAB(T9);TYPE$ LINE.COUNT = LINE.COUNT + 1 IF INP(KB)=ABORT THEN 1490 IF LINELUE$) 1110 IF POSITION > INDEX.COUNT THEN \ PRINT "NOT FOUND":\ GOTO 1080 IF INP(KB)=ABORT THEN 100 KEY = INDEX(POSITION) GOSUB 8800 :REM READ RECORD PRINT KEY,RECORD$(FIELD.NO) IF LEFT$(RECORD$(FIELD.NO),X)=FIELD.VALUE$ THEN \ GOSUB 9TION + 1 GOSUB 8800 IF C$="LABELS" THEN 1630 REM FORMAT NAME TAGS REM DON'T PRINT FOR GROUPS OR MAGAZINES IF TYPE$="G" THEN 1621 IF TYPE$="M" THEN 1621 FOR BLANK.POS = LEN(NAME$) TO 1 STEP -1 IF MID$(NAME$,BLANK.POS,1)=" " THEN 1624 1622 N TAB(T1);"---------NAME-----------";\ TAB(T2);"----ORGANIZATION----";\ TAB(T3);"---------STREET---------"; IF WIDTH < 80 THEN PRINT:\ LINE.COUNT = LINE.COUNT + 1 PRINT TAB(T4);"---------CITY-------";\ TAB(T5);"-ZIP-";\ TAB(T6);"----PHEND #5 THEN 1050 REM CAN'T FOR-NEXT: EOF WOULD EXIT LOOP EARLY I=1 1010 READ #5;INDEX(I) IF INP(KB)=ABORT THEN \ PRINT I I=I+1 GOTO 1010 1050 CLOSE 5 INDEX.COUNT = I-1 PRINT INDEX.COUNT;" INDEX ENTRIES LOADED." INDEX.READ = 1 :REM SHOWRINT "WIDTH TOO NARROW - SET TO 25" WIDTH = 25 GOTO 100 REM SET LABEL LENGTH 1550 LENGTH = VAL (MID$(C$,8,99)) IF LENGTH > 3 THEN 100 PRINT "LENGTH INVALID, SET TO 6" LENGTH = 6 GOTO 100 REM PRINT LABELS 1600 PRINT "PRESS LINEFEED" IFID POSITION":\ GOTO 1080 KEY = INDEX(POSITION) GOSUB 8800 GOSUB 9000 GOTO 100 REM ENTER TITLE 1300 TITLE$=CHR$(14)+MID$(C$,7,99) GOTO 100 REM PRINT REPORT USING INDEX 1400 PRINT "PRESS LINE FEED TO START" IF INDEX.READ = 0 THEN 8700 000:\ GOTO 100 POSITION = POSITION + 1 GOTO 1110 REM POSITION TO RECORD NUMBER 1200 POSITION = VAL(MID$(C$,10,99)) IF INDEX.READ = 0 THEN 8700 PRINT "POSITIONED TO ";POSITION IF POSITION < 1 OR POSITION > INDEX.COUNT THEN \ PRINT "INVAL$(NAME$,BLANK.POS-3,3)=" LA" THEN 1622 IF MID$(NAME$,BLANK.POS-3,3)=" DI" THEN 1622 1628 LINE$(I,1)="" IF BLANK.POS>1 THEN \ LINE$(I,1)=LEFT$(NAME$,BLANK.POS-1) LINE$(I,2)=MID$(NAME$,BLANK.POS+1,99) LINE$(I,3)=COM$ IF I=1 AND 0=LEN(COM$) THENUTTAPE EQU 4 ;OUTPUT TO PUNCH FUNCTION NO. OUTBUF EQU 9 ;OUTPUT STRING TERMINATED BY $ INBUF EQU 10 ;INPUT BUFFER FUNCTION NO. BDOS EQU 5 ;BDOS ENTRY POINT * * CONTROL CHARACTERS * CR EQU 0DH ;CARRIAGE RETURN LF EQU 0AH ;LINE FEED CNTRL EQU -40H ;OS=I-1 NEXT I IF BLANK.POS=0 THEN 199 FIELD$=LEFT$(C$,BLANK.POS) FIELD.NO = 0 FOR I=1 TO FIELD.COUNT IF LEFT$(FIELD.NAME$(I),BLANK.POS)=FIELD$ THEN\ FIELD.NO = I NEXT I IF FIELD.NO=0 THEN\ PRINT "NO SUCH FIELD ";FIELD$:\ GOTO 100 4 THEN \ FOR I=4 TO LENGTH-1 :\ PRINT :\ NEXT I GOTO 1620 REM END OF FILE - PAD W/BLANK FIELDS 1650 NAME$=" " PAID$=" " ORGANIZATION$=" " STREET$=" " CITY$=" " ZIP$=" " GOTO 1630 REM END OF LABELS 1690 PRINT 1695 IF INP(KB)=* FILE NAME: THEAD.LIB * * 7/16/77 * * * THIS LIBRARY CAN BE USED TO SET UP A STANDARD * CP/M PROGRAM. TO USE, TYPE THE PROGRAM HEADER AND * PROGRAM CONSTANTS (EQUATES), THEN READ IN THE LIBRARY. * TO RETURN TO CP/M EXECUTE A JUMP TO EXIT. * RT$=RECORD$(1) NAME$=RECORD$(2) ORGANIZATION$=RECORD$(3) STREET$=RECORD$(4) CITY$=RECORD$(5) ZIP$=RECORD$(6) PHONE$=RECORD$(7) COM$=RECORD$(8) PAID$=RECORD$(9) TYPE$=RECORD$(10) RETURN REM EXTRACT FIELD NAME, VALUE FROM C$ REM FIND \ LINE$(1,3)="." LINE$(I,4)=CITY$ GOTO 1640 1630 LINE$(I,1)=LEFT$(NAME$+SPACES$,25)+PAID$ LINE$(I,2)=ORGANIZATION$ LINE$(I,3)=STREET$ LINE$(I,4)=LEFT$(CITY$+SPACES$,24)+ZIP$ 1640 NEXT I REM PRINT THE LABELS FOR LINE = 1 TO 4 WD=WIDTHREET PRINT RECORD$(5);" ";RECORD$(6) PRINT RECORD$(7);"/";\ RECORD$(8);";";\ RECORD$(9);";";\ RECORD$(10) PRINT RETURN 9999 END  FIELD.VALUE$=MID$(C$,BLANK.POS+2,99) FIELD$=FIELD.NAME$(FIELD.NO) RETURN REM RECORD PRINT ROUTINE 9000 PRINT PRINT "RECORD #";KEY;" ";RECORD$(1) :REM SORT PRINT RECORD$(2) :REM NAME PRINT RECORD$(3) :REM ORGANIZATION PRINT RECORD$(4) :REM STLF THEN 1695 GOTO 100 REM PRINT CONTENTS OF VARIABLES 1700 PRINT "WIDTH=";WIDTH PRINT "LENGTH=";LENGTH PRINT "POSITION=";POSITION PRINT "INDEX HAS "; IF INDEX.READ = 0 THEN \ PRINT "NOT "; PRINT "BEEN READ." PRINT "INDEX ENTRIES=";INDE USERS MAIN PROGRAM MUST BE LABLED MAIN (OR CHANGE JMP) * STACK SIZE IS SET TO 64 BYTES. * * * BDOS I/O EQUATES * INCON EQU 1 ;READ CONSOLE FUNCTION NO. OUTCON EQU 2 ;WRITE CONSOLE FUNCTION NO. INTAPE EQU 3 ;INPUT FROM TAPE READER FUNCTION NO. O BLANK AFTER COMMAND 8910 FOR I=LEN(C$) TO 1 STEP -1 IF MID$(C$,I,1)=" " THEN \ BLANK.POS = I+1 NEXT I C$=MID$(C$,BLANK.POS,99) BLANK.POS = 0 REM FIND BLANK AFTER FIELD NAME FOR I=LEN(C$) TO 1 STEP -1 IF MID$(C$,I,1)=" " THEN \ BLANK.P IF LINE < 4 AND C$="TAGS" THEN \ PRINT CHR$(14);:\ WD=.5+WIDTH/2 PRINT LINE$(1,LINE);TAB(WD); PRINT LINE$(2,LINE);TAB(2*WD); PRINT LINE$(3,LINE); IF UP = 4 THEN \ PRINT TAB(3*WD);LINE$(4,LINE); PRINT NEXT LINE IF LENGTH >; ; ; PRINT SIZE OF A DISK FILE ARGUMENT IN K BYTES. ; ; ROBERT A. VAN VALZAH ; ; 7/16/77 ; * * *************************************************************** * * CP/M ASSEMBLER LIBRARY PROCEDURES * * INITIALIZATION OF TRANSIENT PROGRAM * AG=0 THEN RETURN READ #FILE.NO,KEY;\ FLAG,\ RECORD$(1),\ RECORD$(2),\ RECORD$(3),\ RECORD$(4),\ RECORD$(5),\ RECORD$(6),\ RECORD$(7),\ RECORD$(8),\ RECORD$(9),\ RECORD$(10) REM SET VARIABLE NAMES FROM RECORD$(N) 8850 SOX.COUNT GOTO 100 REM SET 'N' UP LABELS 1800 UP = VAL(MID$(C$,4,99)) GOTO 100 REM ERROR - NO INDEX READ 8700 PRINT "NO INDEX READ" GOTO 100 REM PHYSICAL READ RECORD # IN KEY 8800 FILE.NO = 1+INT((KEY-1)/128) READ #FILE.NO,KEY;FLAG IF FLCONTROL KEY OFFSET (I.E. CNTRL+'C') * * EXECUTION * ORG 100H START: LXI H,0 DAD SP SHLD OLDSP ;SAVE CP/M'S STACK POINTER LXI SP,STKTOP JMP MAIN * * * RETURN TO OPERATING SYSTEM EXIT: LHLD OLDSP ;RETURN CP/M'S STACK POINTER SPHL RET THE STACK MOV A,E ;GET REMAINDER -> A ORA A ;DONE WITH ALL DIGITS? CNZ DECA ;NO - DO THIS AGAIN WITH THE REMAINDER ; ; THE ASCII NUMBER IS NOW UP ON THE STACK, MSD FIRST ; TO COME OFF. BDOS WILL PROBABLY RETURN HERE. ; POP PSW MOV E,A MVI NT LENGTH IN K BYTES. BUT THE ; DISK IS ALLOCATED IN 1K CHUNKS, SO A LENGTH OF 4.5K ; BYTES REALLY HAS 5K BYTES ALLOCATED FOR IT. ; THEREFORE, WE MUST ROUND UP TO GET THE TRUE AMMOUNT ; OF DISK SPACE ALLOCATED FOR A FILE. ; LDA FCBRC ;GET RECORD CONITION AND SUB-DEFINITIONS * FCB EQU 005CH ;DEFAULT FILE CONTROL BLOCK * FCBDN EQU FCB+0 ;DISK NAME, 0=LOGGED IN DISK, 1=A, 2=B FCBFN EQU FCB+1 ;FILE NAME (8 CHARACTERS) FCBFT EQU FCB+9 ;FILE TYPE (3 CHARACTERS) FCBEX EQU FCB+12 ;FILE EXTENT, 0=FIRS MESSAGE AT DE AND EXIT MVI C,OUTBUF CALL BDOS JMP EXIT ; ; DECA PRINTS THE NUMBER IN THE A REG AS A DECIMAL ; NUMBER 0 - 255. CLOBBERS A AND E. ; DECA: MVI E,-1 AND 255 ;INITIALIZE QUOTITENT ; ; THIS LOOP DIVIDES THE A REG BY 10 THRU MULTI***************************************** * * ; ; MESSAGES ; LENMES: DB 'FILE LENGTH: $' KMES: DB 'K$' NOFILM: DB 'NO SUCH FILE$' ; MAIN: MVI B,0 ;CLEAR SIZE SUM REG OPEN: PUSH B ;SAVE SUM SO FAR LXI D,FCB ;OPEN AN EXTENT OF THE FILE MVI;RETURN TO SYSTEM * * STACKS * OLDSP DS 2 ;RESERVED FOR SYSTEM STACK POINTER STACK DS 64 ;SPACE FOR USER STACK STKTOP EQU $ ;STACK WORKS UP FROM HERE * * END THEAD.LIB *************************************************************** * * * * XTENT IF THIS INR A ;ONE IS FULL STA FCBEX LDA FCBRC ;EXTENT IS FULL IF RC=128 CPI 128 JZ OPEN ;IS FULL - OPEN AND ADD NEXT EXTENT ; ; REACHED LAST EXTENT, FILE LENGTH IN K BYTES IN IN B. ; PUSH B ;SAVE LENGTH LXI D,LENMES ;PRINT "FILE LENUNT ADI 0000$0111B ;CAUSE CARRY INTO BIT 3 IF ;LENGTH IS NOT AN EVEN K (ROUND UP). ANI 1111$1000B ;REMOVE ANY FRACTION LEFT RRC ;DIVIDE RESULT BY 8 RRC RRC ADD B ;ADD TO OLD SUM MOV B,A ;UPDATE NEW SUM LDA FCBEX ;PREPARE TO OPEN NEXT ET 16K, 1=NEXT 16K FCBRC EQU FCB+15 ;RECORD COUNT, 80H=FULL EXTENT FCBNR EQU FCB+32 ;NEXT RECORD TO BE READ * * BDOS FUNCTION NUMBER EQUATES * OPENFF EQU 15 ;OPEN FILE FUNCTION, 255=NOT FOUND CLOSFF EQU 16 ;CLOSE FILE FUNCTION, 255=NOT FOUND SRCHF EPLE ; SUBTRACTION. QUOTIENT IS LEFT IN E REG, ; REMAINDER-10 IS LEFT IN A. ; LOOP: INR E ;ADD ONE TO QUOTIENT FOR EACH SUBTRACT SUI 10 JNC LOOP ;HAVEN'T UNDERFLOWED YET ; ADI '0' + 10 ;CONVERT REMAINDER TO ASCII PUSH PSW ;PUT THIS DIGIT ON C,OPENFF CALL BDOS POP B ;GET SUM SO FAR BACK CPI 255 ;ABLE TO FIND THAT FILE? JZ NOTHER ;NOPE - GIVE ERROR AND EXIT ; ; FCBRC NOW CONTAINS THE NUMBER OF 128 BYTE RECORDS ; IN THIS EXTENT OF THE FILE. THUS, DIVIDING BY 8 ; WE CAN GET THE EXTE*************************************************************** * * CP/M ASSEMBLER LIBRARY PROCEDURES * * DISK I/O EQUATES THRU CP/M * * FILE NAME DISKIOEQ.LIB * * 7/16/77 * * BUFF EQU 0080H ;DEFAULT DISK I/O BUFFER * * FILE CONTROL BLOCK DEFIGTH: " MVI C,OUTBUF CALL BDOS POP B ;GET LENGTH BACK MOV A,B ;LENGTH -> A CALL DECA ;PRINT A AS A NUMBER 0 - 255 LXI D,KMES ;PRINT "K" JMP PRARET ;PRINT AND RETURN NOTHER: ;COMES HERE IF FILE CAN'T BE FOUND LXI D,NOFILM PRARET: ;PRINTTRF EQU 21 ;WRITE RECORD FUNCTION, 0=WRITE OK, ;1=ERROR IN EXTENDING FILE, ;2=NO MORE DISK DATA SPACE (>240K) ;255=NO MORE DIRECTORY SPACE MAKEFF EQU 22 ;MAKE FILE FUNCTION, 255=NO DIR. SPACE * * * END DISKIOEQ.LIB **********************QU 17 ;SEARCH FOR FILE, 255=NO MATCH SRCHN EQU 18 ;SEARCH FOR NEXT OCCURRENCE DELTFF EQU 19 ;DELETE FILE FUNCTION READRF EQU 20 ;READ NEXT RECORD FUNCTION, 0=READ OK, ;1=READ PAST END OF FILE, ;2=READING UNWRITTEN DATA IN RANDOM ;ACCESS WRIC,OUTCON JMP BDOS ; END ENTRY HE ASCII NUMBER IS NOW UP ON THE STACK, MSD FIRST ; TO COME OFF. BDOS WILL PROBABLY RETURN HERE. ; POP PSW MOV E,A MVI E LENGTH WMOVE MOV A,M ;GET CHAR STAX D ;STORE IT INX H INX D CPI 'Z'-40H ;EOF? JZ FINAL ;YES, FINAL WRITE DCR B ;128 MOVED? JNZ WMOVE CALL WRSEC ;WRITE THE RECORD LHLD BUFAD ;GET BUFFER ADDRESS LXI D,128 ;GET BUFFER LENGTH DAD D ;CA RESET OUT 6EH ;RESET NAME CALL TBIN MOV M,A INX H DCR B ;NAME PRINTED? JNZ NAME SHLD CURS ;READ THE TARBELL FILE LXI H,BUFF ;POINT TO END OF PROGRAM ;READ A LINE FROM TARBELL LINE CALL TBIN ;READ LINE LENGTH DCR A ;IS IS EOF? JZ EOF ееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееее OPERAND BUFFE MVI M,TAB ;TAB TO COMMENTS CALL CHECK MVI A,';' ;OPERAND COMMENT ;MOVE COMMENTS COMM MOV M,A ;STORE '*' OR ';' CALL CHECK CALL TBIN CPI 13 JNZ COMM ;STORE CR/LF FOR END OF LINE EOL MVI M,13 CALL CHECK MVI M,10 ;LINEFEED E.BAK LXI D,FCB MVI C,REN CALL BDOS ;RENAME ;MAKE NEW FILE NEWF LXI D,FCB MVI C,MAKE CALL BDOS INR A ;ROOM IN DIRECTORY? JNZ NEWOK ;YES ;NO ROOM IN DIRECTORY LXI D,NORMG ERXIT MVI C,09 CALL BDOS ;PRINT ERROR MESSAGE JMP 0 ;--EXIT-- ееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееее CALL CHECK JMP RDLB ;LOOP READING LABEL ;NO LABEL, OR END OF LABEL NOLAB MVI M,TAB ;STORE TAB CHAR CALL CHECK ;POINT TO OP CODE ;READ OP CODE RDOP CALL TBIN CPI ' ' JZ ENDOP CPI 13 JZ EOL ;END OF LINE MOV M,A ;STORE OP CODE CHAR CALL C;YES ;SKIP LINE NO MVI B,5 ;NNNN' ' SKIP1 CALL TBIN DCR B JNZ SKIP1 ;READ LABEL, OR BLANK RDLB CALL TBIN CPI '*' JZ COMM ;READ COMMENT IN AS IS CPI ' ' ;UNLABELED STMT? JZ NOLAB CPI 13 ;END OF LINE? JZ EOL ;MOVE LABEL MVLB MOV M,A ;TARBELL SOURCE LOAD ;COMPATIBLE WITH CCOS ; ;DELETES LINE NUMBERS, CHANGES SPACES TO TABS, ;ATTEMPTS TO INSERT ';' BEFORE OPERAND COMMENTS ORG 100H ;TO TPA FCB EQU 5CH TFCB EQU FCB+16 ;TEMP FCB FOR RENAME TAB EQU 9 ;ASCII TAB CURS EQU 3FFEH ;VDM CALL CHECK JMP LINE ;READ NEXT LINE ;EOF REACHED EOF MVI M,'Z'-40H ;EOF CHAR ;OPEN FILE LXI D,FCB MVI C,OPEN CALL BDOS INR A JZ OPERR ;WRITE THE FILE WRLP LXI D,80H ;POINT TO FILE BUFFER LHLD BUFAD ;POINT TO BUFFER MVI B,80H ;MAX MOV NORMG DB 'NO ROOM IN DIRECTORY$' READY DB 'TURN ON TAPE $' BAK DB 'BAK' ;NEW FILE MAKE WAS OK ;TYPE 'READY' MESSAGE NEWOK LXI D,READY MVI C,9 CALL BDOS ;TYPE NAME ON SCREEN LHLD CURS ;GET CURSOR MVI B,5 ;FILE NAME LENGTH MVI A,10H ;TARBELLееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееHECK JMP RDOP ;CONTINUE READING OP CODE ;END OF OP CODE ENDOP MVI M,TAB ;INSERT TAB CALL CHECK ;MOVE OPERAND MVOPE CALL TBIN CPI ' ' ;END OF OPERAND? JZ BUFFE ;YES CPI 13 ;END OF LINE? JZ EOL ;YES MOV M,A CALL CHECK JMP MVOPE ;END OFI D,TFCB ;POINT TO TEMP FCB MVI B,16 ;GET MOVE LENGTH CALL MOVE ;MOVE IT LXI H,BAK ;POINT TO 'BAK' LXI D,TFCB+9 MVI B,3 ;MOVE LENGTH CALL MOVE ;ERASE BACKUP FILE LXI D,TFCB MVI C,DELT CALL BDOS ;DELETE BACKUP ;RENAME CURRENT NAME TO NAM CURSOR LXI SP,STACK ;GET PRIVATE STACK ;IF FILE EXISTS, RENAME IT TO 'NAME.BAK' LXI D,FCB MVI C,SRCHF ;FIND IN DIRECTORY CALL BDOS INR A ;FF=>NOT FOUND JZ NEWF ;NEW FILE ;FILE ALREADY EXISTS - ERASE BACKUP COPY LXI H,FCB ;POINT TO FCB LXLC NEW ADDR SHLD BUFAD ;SAVE BUFFER ADDR JMP WRLP ;WRITE FINAL BLOCK FINAL CALL WRSEC LXI D,FCB MVI C,CLOSE CALL BDOS ;CLOSE THE FILE INR A ;OK? JZ CLSER LXI D,OKMSG JMP ERXIT OKMSG DB 'DONE$' CLSER LXI D,CLSERM JMP ERXIT CLSERM DB+1 ;SAVE IN JMP RET RTLOOP CALL SKIP$TO$FIELD CALL MOVE$FIELD CALL INCR$NON$MT CALL STORE$RECNO JMP RTLOOP ;COME HERE AT END OF FILE, EXITING RTLOOP EOF LHLD NON$MT ;GET ACTUAL REC COUNT SHLD HOW$MANY$TO$WRITE EOFRET JMP $-$ ;ADDR MODIFIED .NAME N ; ;INPUT.NAME IS THE NAME OF A RANDOM BASIC E ;FILE; OUTPUT.NAME IS THE NAME OF THE INDEX FILE ;TO BE WRITTEN. N IS THE FIELD NUMBER TO BE ;SORTED UPON ;8/14/77 DEBUG EQU 0 ORG 100H IF DEBUG LXI SP,4000H ;FOR DDT LXI H,0 SHLD 400 LXI D,NOSTG JMP ERXIT NOSTG DB 'FILE WON''T FIT IN MEMORY$' ;TARBELL INPUT ROUTINE TBIN IN 6EH ANI 10H JNZ TBIN IN 6FH RET ; DS 30 ;STACK AREA STACK DS 2 BUFAD DW BUFF BUFF EQU $ ;READ PROGRAM INTO HERE ; ; BDOS EQUATES (VERSION 2) B,12 MOVE MOV A,M STAX D INX H INX D DCR B JNZ MOVE RET ;OPEN INPUT FILE OPEN$INPUT: LXI D,FCB MVI C,OPEN CALL BDOS INR A ;OPEN OK? RNZ CALL ERXIT DB '++CAN''T OPEN INPUT FILE$' OPEN$OUTPUT: LXI D,FCB2 MVI C,DELT CALееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееее 'CLOSE ERR$' ;WRITE A RECORD WRSEC LXI D,FCB MVI C,WRITE CALL BDOS ORA A ;WROTE OK? RZ ;WRITE ERROR LXI D,WERMG JMP ERXIT WERMG DB 'WRITE ERR$' ;OPEN ERROR OPERR LXI D,OPERM JMP ERXIT OPERM DB 'OPEN ERR$' ;MOVE CHAR ROUTINE, HL TO DEECHNIQUES CALL INIT CALL READ$TABLE IF DEBUG ! RST 7 ! ENDIF CALL SORT$TABLE IF DEBUG ! RST 7 ! ENDIF CALL WRITE$SORTED$FILE IF DEBUG ! RST 7 ! ENDIF CALL ERXIT DB '++END OF SORT$' ; ;INIT ROUTINE INIT CALL GET$FLDNO CALL SAVE$FCB 0H ENDIF CALL START DB 'SORT VERSION 1.2',13,10,'$' START POP D ;GET ID MESSAGE CALL MSGPRT ;INIT LOCAL STACK LXI H,0 DAD SP SHLD STACK LXI SP,STACK ;THIS PROGRAM IS PROGRAMMED (PERHAPS NOT WELL) ;USING TOP DOWN STRUCTURED PROGRAMMING T; RDCON EQU 1 WRCON EQU 2 PRINT EQU 9 OPEN EQU 15 ;0FFH=NOT FOUND CLOSE EQU 16 ; " " SRCHF EQU 17 ; " " SRCHN EQU 18 ; " " DELT EQU 19 ;NO RET CODE READ EQU 20 ;0=OK, 1=EOF WRITE EQU 21 ;0=OK, 1=ERR, 2=?, 0FFH=NO DIR SPC MAKE EQU 22 ;0FFH=L BDOS LXI D,FCB2 MVI C,MAKE CALL BDOS INR A RNZ CALL ERXIT DB '++CAN''T OPEN OUTPUT FILE$' ERXIT POP D ;GET MESSAGE CALL MSGPRT EXIT: IF DEBUG ! RST 7 ! ENDIF LHLD STACK SPHL RET READ$TABLE: POP H ;RET ADDR SHLD EOFRET;SORT PROGRAM FOR CP/M RANDOM FILES ;USES FXED FIELD LENGTH OF 5 ;WRITES CP/M FILE OF RECORD NUMBERS, WHICH ;CAN BE READ BY CP/M AS A SEQUENTIAL FILE ;OR FROM BASIC AS A RANDOM FILE WITH RECORD ;LENGTH OF 5 ; ;COMMAND FORMAT: SORT INPUT.NAME OUTPUT, LENGTH IN B MOVE MOV A,M STAX D INX H INX D DCR B JNZ MOVE RET ;ROUTINE TO INX H AND CHECK MEMORY OVERALY CHECK INX H LDA 7 ;GET BDOS PAGE ADDR CMP H ;CHECK RNC ;RET IF OK LDA 6 ;GET BDOS PAGE DISPL CMP L RNC ;MEMORY OVERLAY CALL OPEN$INPUT RET GET$FLDNO: LDA 80H ;GET PARM LENGTH ORI 80H ;POINT TO LAST BYTE MOV L,A MVI H,0 MOV A,M ;GET FIELD NUMBER ANI 0FH ;MAKE BINARY STA FLDNO RET ;MOVE THE OUTPUT FCB NAME SAVE$FCB: LXI H,FCB+16 LXI D,FCB2 MVI ееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееBAD REN EQU 23 ;0FFH=BAD STDMA EQU 26 BDOS EQU 5 REIPL EQU 0 END 100H ; " " DELT EQU 19 ;NO RET CODE READ EQU 20 ;0=OK, 1=EOF WRITE EQU 21 ;0=OK, 1=ERR, 2=?, 0FFH=NO DIR SPC MAKE EQU 22 ;0FFH= ;SKIP TO C/R IN RECORD SKIP$TO$CR: CALL RDCHR CPI 0AH ;L/F AFTER C/R? JNZ SKIP$TO$CR RET EMPTY$REC: CALL SKIP$TO$CR SKIP$TO$FIELD: CALL INCR$RECNO CALL RDCHR ;GET FIRST CHAR IN REC CPI '0' ;EMPTY RECORD? JZ EMPTY$REC CALL RDCHR HOW$MANY$TO$WRITE DW 0 RECNO DW 0 ;DECIMAL RECORD # READ TEMP DS 2 WIDTH DB 10 ;PRINT ENTRIES/LINE CURR DS 2 CHANGE DS 1 FCB2 DB 0,'XXXXXXXXYYY',0 DS 19 DB 0 FLDNO DS 1 ;FIELD # TO SORT DS 40 ;STACK STACK DS 2 ;CPM'S STACK INPTR DW 100H ;INMOV A,M ;GET LO 2 DIGITS CALL WRITE$HEX CALL WRITE$CRLF CALL NEXT$ENTRY JNZ WSLOOP CALL CLOSE$OUTPUT RET CRLF MVI A,13 CALL TYPE MVI A,10 STA WIDTH TYPE PUSH PSW PUSH B PUSH D PUSH H MOV E,A MVI C,WRCON CALL BDOS POP H DCR B JNZ PADBL ENDPAD SHLD TABLE$POINTER MVI A,' ' CALL TYPE LDA WIDTH DCR A STA WIDTH CZ CRLF JMP SKIP$TO$CR ;SKIP TO END OF RECORD INCR$RECNO: ;INCREMENT DECIMAL RECORD NUMBER LHLD RECNO ORA A ;CLR CARRY MOV A,L ;GET LO IWRITE ERROR$' WROK LXI H,80H SHLD OUTPTR POP H POP D POP B RET WRITE$HEX: PUSH PSW ;SAVE CHAR RAR!RAR!RAR!RAR CALL WRITE$NIBBL ;WRITE LEFT DIGIT POP PSW WRITE$NIBBL: ANI 0FH CPI 10 JC ISNUM ADI 7 ISNUM ADI '0' JMP WRITE$ B,7 SWAPL MOV C,M LDAX D MOV M,A MOV A,C STAX D INX H INX D DCR B JNZ SWAPL MVI A,1 ;SHOW.. STA CHANGE ;..SWAP RET NEXT$ENTRY: LHLD CURR ;GET CURRENT ENTRY LXI D,7 ;DISPL TO NEXT DAD D SHLD CURR LHLD TEMP DCX H SHLD;',' AFTER FLAG LDA FLDNO MOV B,A SKIPLP DCR B RZ ;AT FIELD NOW SKIPCH CALL RDCHR CPI ',' JNZ SKIPCH JMP SKIPLP MOVE$FIELD: LHLD TABLE$POINTER MVI B,5 ;ALL SORT FIELDS 5 LONG CALL RDCHR ;READ FIRST CHAR (MAY BE ") CPI '"' JNZ MF RDOK DCR A JZ EOF CALL ERXIT DB '++INPUT FILE READ ERROR$' RDOK LXI H,80H POP B POP D NOREAD MOV A,M ;GET CHAR INX H SHLD INPTR POP H RET ;WRITE CRLF INTO OUTPUT FILE WRITE$CRLF: MVI A,13 CALL WRITE$CHAR MVI A,10 ;FALL INT POP D POP B POP PSW RET MSGPRT MVI C,PRINT JMP BDOS ;READ CHAR FROM INPUT FILE RDCHR PUSH H LHLD INPTR MOV A,H ;TIME TO READ? DCR A JNZ NOREAD ;READ INPUT RECORD PUSH D PUSH B LXI D,FCB MVI C,READ CALL BDOS ORA A JZNR A DAA MOV L,A MOV A,H ACI 0 DAA MOV H,A SHLD RECNO RET INCR$NON$MT: LHLD NON$MT INX H SHLD NON$MT RET STORE$RECNO: LHLD RECNO XCHG LHLD TABLE$POINTER MOV M,D INX H MOV M,E INX H SHLD TABLE$POINTER RET SCHAR CLOSE$OUTPUT: MVI A,'Z'-40H ;EOF CHAR CALL WRITE$CHAR CALL WRITE$RECORD LXI D,FCB2 MVI C,CLOSE CALL BDOS INR A RNZ CALL ERXIT DB '++OUTPUT FILE CLOSE ERROR$' TABLE$POINTER DW TABLE NON$MT DW 0 ;COUNT OF NON-EMPTY REC'S READ TEMP MOV A,H ORA L ;ZERO SET IF DONE RET WRITE$SORTED$FILE: CALL OPEN$OUTPUT LHLD HOW$MANY$TO$WRITE SHLD TEMP LXI H,TABLE+5 ;FIRST REC # SHLD CURR WSLOOP LHLD CURR MOV A,M ;GET HI REC NO CALL WRITE$NIBBL ;IGNORE HI DIGIT INX H NQ ;SKIP IF NOT '"' MOVFLP CALL RDCHR MFNQ CPI ',' JZ ENDMV CPI '"' JZ ENDMV MOV M,A ;STORE CHAR CALL TYPE INX H DCR B JNZ MOVFLP JMP ENDPAD ;PAD TO 5 LONG WITH BLANKS PADBL MVI A,' ' MOV M,A CALL TYPE DCR B INX H ENDMV INR BO WRITE$CHAR ;WRITE OUTPUT FILE CHAR WRITE$CHAR: PUSH H LHLD OUTPTR MOV M,A INR L ;FULL? SHLD OUTPTR POP H RNZ ;..NO WRITE$RECORD: PUSH B PUSH D PUSH H LXI D,FCB2 MVI C,WRITE CALL BDOS ORA A JZ WROK CALL ERXIT DB '++JNZ SORT$TABLE RET COMPR LHLD CURR XCHG LXI H,7 DAD D ;DE=CURRENT, HL = NEXT PUSH D PUSH H ;SAVE FOR SWAP COMPLP LDAX D CMP M JNZ DIFF INX H INX D DCR B JNZ COMPLP DIFF POP H POP D RET SWAP RZ ;RETURN IF = ENTRIES MVIORT$TABLE: XRA A ;GET A ZERO STA CHANGE ;SHOW NO SWAP LHLD NON$MT DCX H SHLD NON$MT SHLD TEMP ;TEMP = HOW MANY TO COMPARE LXI H,TABLE SHLD CURR SORTLP CALL COMPR CNC SWAP CALL NEXT$ENTRY JNZ SORTLP LDA CHANGE ORA A ;ANY SWAPS? PUT FILE CHAR POINTER OUTPTR DW 80H ;OUTPUT FILE CHAR POINTER TABLE EQU $ ;SORT TABLE ; ; BDOS EQUATES (VERSION 3) ; RDCON EQU 1 WRCON EQU 2 PRINT EQU 9 OPEN EQU 15 ;0FFH=NOT FOUND CLOSE EQU 16 ; " " SRCHF EQU 17 ; " " SRCHN EQU 18 ; " " 2 DB 102Q, 101Q, 111Q, 131Q, 146Q ;3 DB 14Q, 24Q, 44Q, 177Q, 4Q ;4 DB 162Q, 121Q, 121Q, 121Q, 116Q ;5 DB 36Q, 51Q, 111Q, 111Q, 106Q ;6 DB 100Q, 107Q, 110Q, 120Q, 140Q ;7 DB 66Q, 111Q, 111Q, 111Q, 66Q ;8 DB 61Q, 111Q, 111Q, 112Q, 74Q ;9,A INX H MOV M,A DAD D MOV M,A INX H MOV M,A INX H MOV M,A INX H MOV M,A INX H MOV M,A DAD D RET SHFT: PUSH H PUSH D PUSH B PUSH PSW DLY: LXI D,10*256 DCX D MOV A,D ORA E JNZ DLY+3 LXI H,VDMSCR+64 MOV D,H Mееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееее77Q, 24Q, 177Q, 24Q ;# DB 22Q, 52Q, 177Q, 52Q, 44Q ;$ DB 142Q, 144Q, 10Q, 23Q, 43Q ;% DB 66Q, 111Q, 65Q, 2Q, 5Q ;& DB 0Q, 0Q, 160Q, 0Q, 0Q ;' DB 34Q, 42Q, 101Q, 0Q, 0Q ;( DB 0Q, 0Q, 101Q, 42Q, 34Q ;) DB 42Q, 24Q, 177Q, 24Q, 42Q ;* ,M CPI 15Q JZ TISP INX H SUI 40Q JC TISQ CPI 100Q JNC TISQ PUSH H MOV E,A MVI D,0 LXI H,ROMT DAD D DAD D DAD D DAD D DAD D MVI B,5 COL: CALL SHFT MOV A,M PUSH H LXI H,VDMSCR-5 LXI D,060 MVI C,8 NXBT: RAL PUSH DELT EQU 19 ;NO RET CODE READ EQU 20 ;0=OK, 1=EOF WRITE EQU 21 ;0=OK, 1=ERR, 2=?, 0FFH=NO DIR SPC MAKE EQU 22 ;0FFH=BAD REN EQU 23 ;0FFH=BAD STDMA EQU 26 BDOS EQU 5 FCB EQU 5CH CPI 3 JZ SIGN SUI '0' JC NOCH CPI '9'+1 JNC NOCH RAL STA DLY+2 NOCH: POP PSW POP B POP D POP H RET ; TTYI: PUSH H! PUSH D! PUSH B MVI C,1 CALL 5 POP B! POP D! POP H RET ; ; TTYO: PUSH H! PUSH D! PUSH B PUSH PSW MOV EOV E,L LXI B,5 SHFZ: DAD B SHFU: MOV A,M STAX D INX D INX H MOV A,L ANI 77Q JNZ SHFU MVI A, 5 XCHG SHFV: MVI M,' ' INX H DCR A JNZ SHFV MOV A,H CPI VDMSCR/256+4 JNZ SHFZ CALL CSTS ANI 0000$0001B JZ NOCH CALL TTYI ;********************************************* ; ; Note from Randy ; TISQ is a times square type display for vdm ; will work on vti ; After it clears screen, type any message up ; to 255 characters in length and hit ; carriage return.After message iDB 10Q, 10Q, 76Q, 10Q, 10Q ;+ DB 0Q, 1Q, 6Q, 0Q, 0Q ;Q, DB 10Q, 10Q, 10Q, 10Q, 10Q ;- DB 0Q, 0Q, 1Q, 0Q, 0Q ;. DB 2Q, 4Q, 10Q, 20Q, 40Q ;; DB 76Q, 105Q, 111Q, 121Q, 76Q ;0 DB 0Q, 41Q, 177Q, 1Q, 0Q ;1 DB 43Q, 105Q, 111Q, 111Q, 61Q ; PSW JNC NDOT MVI A, 240Q CALL DOT JMP BITD NDOT: MVI A,40Q CALL DOT BITD: POP PSW DCR C JNZ NXBT POP H INX H DCR B JNZ COL CALL SHFT CALL SHFT POP H JMP TISQ DOT: MOV M,A INX H MOV M,A INX H MOV M,A INX H MOV Mееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееее,A MVI C,2 CALL 5 POP PSW POP B! POP D! POP H RET ; ; CSTS: PUSH H! PUSH D! PUSH B MVI C,11 CALL 5 POP B! POP D! POP H RET ROMT: DB 0Q, 0Q, 0Q, 0Q, 0Q ;SPACE DB 0Q, 0Q, 175Q, 0Q, 0Q ; DB 0Q, 160Q, 0Q, 160Q, 0Q ;" DB 24Q, 1 VDMSCR EQU 0E000H ; ; ORG 100H SIGN: LXI SP,1000H MVI A, 14Q CALL TTYO LXI H,SBUF MVI A,'?' CALL TTYO INPC: CALL TTYI MOV M,A INX H CPI 15Q JNZ INPC MVI A,14Q CALL TTYO LXI H,VDMSCR MVI M,40Q TISP: LXI H,SBUF TISQ: MOV As running, ; hitting other keys will change speed of ; display.A ctrl 'C' will stop display and ; allow you to enter new message. ; ;********************************************** ; ; ; SIGN TIMES SQUARE LETTER DISPLAY ON VDM ; ; 6/30/77 ; ; DB 0Q, 0Q, 24Q, 0Q, 0Q ;: DB 0Q, 1Q, 26Q, 0Q, 0Q ;; DB 10Q, 24Q, 42Q, 101Q, 0Q ;< DB 24Q, 24Q, 24Q, 24Q, 24Q ;= DB 0Q, 101Q, 42Q, 24Q, 10Q ;> DB 40Q, 100Q, 115Q, 120Q, 40Q ;? DB 76Q, 101Q, 135Q, 115Q, 71Q ;@ DB 37Q, 44Q, 104Q, 44QINIT CKSUM TO 0 SECT MVI C,128 ;C=BYTES/SECTOR CHAR CALL TBIN ;READ A CHAR MOV M,A ;STORE IT INX H ;INCR BUFF POINTER DCR C ;MORE IN SECTOR? JNZ CHAR ;YES DCR B ;MORE SECTORS? JNZ SECT ;YES ;VERIFY CKSUM CALL TBIN ;READ CKSUM LDA CKSUM ;SET UP FOR LXI D,FCB ;RENAME MVI C,REN ;FUNCTION, THEN CALL BDOS ;DO THE RENAME, ;IGNORE ERRORS. ; ;MAKE FN1.FT1 A NEW FILE ; LXI D,FCB ;POINT TO FCB MVI C,MAKE ;C=MAKE FUNCTION CALL BDOS ;MAKE THE FILE INR A ;SPACE IN DIRECTORY? JNIHQYXZI\\[XYXZH'у)*н)м)н)м)2с)м)XГ-xУЙНц-GЙ*й[XXHYHX HHJHXHXZMXHXXH  HOXI HI[HIPHX[MYH I(YYHHNXIZR NAME HEADR CALL TBIN ;READ CHAR STAX D ;POKE NAME ON VDM CMP M ;MATCH? JZ MATCH ;YES ; ;NO MATCH - TRY AGAIN ; JMP RDLP ; ;HEADER CHAR MATCHED, SEE IF DONE ; MATCH INX D ;POINT TO NEXT CHAR INX H ;POINT TO NEXT CHAR DCR B ;11 MATCHED? OS ;DELETE FN1.OLD, IGNORE ERRS ;SAVE FN1.FT1 OR FN2.FT2 FOR TAPE HEADER MATCH LXI H,FCB+1 ;GET FN1.FT1 POINTER LXI D,TAPEN ;POINT DE TO SAVE NAME AREA MVI B,11 ;NAME LENGTH LDA FCB+17 ;IS FM2.FT2 BLANK? CPI ' ' JZ MOVEN ;YES, SAVE FN1.FT1 ;S, 37Q ;A DB 177Q, 111Q, 111Q, 111Q, 66Q ;B DB 76Q, 101Q, 101Q, 101Q, 42Q ;C DB 177Q, 101Q, 101Q, 101Q, 76Q ;D DB 177Q, 111Q, 111Q, 111Q, 111Q ;E DB 177Q, 110Q, 110Q, 110Q, -------+ R 02 S SUCCESSFUL - OPEN FILE ; DIROK LXI D,FCB ;POINT TO FCB MVI C,OPEN ;GET 'OPEN' FUNCTION CALL BDOS ;OPEN THE FILE INR A ;SHOULD BE OK JNZ RDLP ;OPEN WAS OK ; ;OPEN FAILED - EXIT ; LXI D,OPNER ;POINT TO ERR MSG JMP ERXIT ;PRINT MSG, EXIT ;Z DIROK ;YES ; ;NO DIRECTORY SPACE - PRINT ERROR, EXIT ; LXI D,NODIR ;POINT TO ERR MSG ERXIT MVI C,PRINT ;GET PRINT FUNCTION CALL BDOS ;PRINT ERROR MESSAVGE EXIT LHLD STACK ;GET CCP'S STACK SPHL ;RESTORE STACK RET ;RETURN TO CCP ; ;MAKE WA;TARBELL LOAD - LOADS TAPES ;SAVED WITH TSAVE COMMAND ; ;FORMAT IS: TLOAD FN1.FT1 ; OR: TLOAD FN1.FT1 FN2.FT2 ; ;FN1.FT1 IS THE NAME OF THE FILE TO BE CREATED ON DISK, ;FN2.FT2 IS THE NAME THE FILE WAS TSAVED UNDER, IF ;DIFFERENT THAN FN1.FT1 ; F JNZ HEADR ;NO ; ;GOT HEADER MATCH, START READING ; LXI H,BUFF ;POINT TO BUFFER CALL TBIN ;READ THE NUMBER OF SECTORS STA NSEC ;SAVE NUMBER OF SECTORS MOV B,A ;SAVE IN B ORA A ;ZERO SECTORS (I.E. EOF)? JZ EOF ;YES, EOF XRA A STA CKSUM ;ECOND NAME HAS BEEN SPECIFIED LXI H,FCB+17 ;POINT TO FN2.FT2 MOVEN CALL MOVE ;SAVE THE TAPE NAME ; ;IF IT EXISTS, RENAME FN1.FT1 TO FN1.OLD ; LXI H,MYFCB ;POINT TO FN1.OLD LXI D,FCB+16 ;POINT TO SYSFCB+16 MVI B,16 ;INIT MOVE LENGTH CALL MOVE ¤&&s'К&¤&&s'К&К&¤&>р>рК&Е)Е)Е)Ђ},ѕ)Ч!п)*'у)*н)м)н)м)2с)м)XГ-xУЙНц-GЙ*й[XXHYHX HHJHXHXZMXHXXH  HOXI HI[HIPHX[MYH I(YYHHNXIZR ;OPEN WAS OK - START READING ; RDLP EQU $ ;READ LOOP MVI A,10H ;GET TARBELL RESET CHAR OUT 6EH ;RESET TARBELL ; ;READ THE TAPE HEADER ; MVI B,11 ;# OF CHARS TO MATCH LXI H,TAPEN ;POINT TO NAME TO MATCH LXI D,73B0H ;'POKE' VDM ADDR TO SHOWINTER LXI SP,STACK ;GET LOCAL STACK ;ERASE FN1.OLD IF IT EXISTS LXI H,FCB ;POINT TO FCB LXI D,MYFCB ;AND TO MY FCB MVI B,9 ;MOVE LENGTH CALL MOVE ;MOVE FILENAME TO MYFCB LXI D,MYFCB ;POINT TO FN1.OLD FCB MVI C,DELT ;DELETE FUNCTION CALL BDCB EQU 5CH ;SYSTEM FCB ORG 100H ;TO TPA CALL START ;SKIP ID ID DB '(TLOAD 8/1/77)',0DH,0AH,'$' START POP D ;GET ID MSG MVI C,PRINT CALL BDOS ;PRINT ID ;INIT PRIVATE STACK LXI H,0 ;HL=0 DAD SP ;HL=CCP'S STACK SHLD STACK ;SAVE CCP'S STACK PO ORA A JZ NOCKS ;GOT CHECKSUM ERR LXI D,CSERM MVI C,PRINT CALL BDOS ; ;HAVE READ 1 BUFFER FULL, WRITE IT TO DISK ; NOCKS LXI H,BUFF ;GET BUFF ADDR SHLD BUFAD ;INIT 'WRITE FROM' ADDR WRLP LHLD BUFAD ;GET CURRENT BUFF ADDR XCHG ;MOVE TO D,ееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееH,0AH,'$' START POP D MVI C,PRINT CALL BDOS NEXT MVI B,8+3 ;# OF CHRS TO PRINT MVI A,10H ;GET TARBELL RESET CHAR OUT 6EH ;RESET TARBELL LXI H,BUFF ;INIT SHLD ADDR ;BUFFER ADDR CHAR PUSH B ;SAVE COUNT MVI C,CONST ;FUNCTION TO CHECK CONSOLE ER ; ;EOF REACHED - CLOSE FILE ; EOF LXI D,FCB MVI C,CLOSE CALL BDOS INR A ;CLOSE OK? JNZ EXIT ;YES, RETURN ;CLOSE ERROR LXI D,CLSER JMP ERXIT OPNER DB 'OPEN FAILED$' NODIR DB 'NO DIR. SPACE$' WRERR DB 'WRITE ERR ' WRERN DB 0,'$' CSERMVI A,0DH ;GET C/R CALL TYPE MVI A,0AH ;GET L/F ;ROUTINE TO TYPE CHAR IN A TYPE PUSH B ;SAVE B (ONLY) MOV E,A ;CHR MUST BE IN E MVI C,WRCON ;C HAS FUNCTION CALL BDOS ;PRINT THE CHAR POP B ;RESTORE B RET ADDR DW BUFF ;CURRENT CHAR POINTER RCHF EQU 17 ; " " SRCHN EQU 18 ; " " DELT EQU 19 ;NO RET CODE READ EQU 20 ;0=OK, 1=EOF WRITE EQU 21 ;0=OK, 1=ERR, 2=?, 0FFH=NO DIR SPC MAKE EQU 22 ;0FFH=BAD REN EQU 23 ;0FFH=BAD STDMA EQU 26 BDOS EQU 5 REIPL EQU 0 END 100H E LXI H,128 ;HL=BUFF LENGTH DAD D ;POINT TO NEXT BUFFER SHLD BUFAD ;UPDATE BUFF ADDR MVI C,STDMA ;SET UP DMA CALL BDOS ;..ADDR LXI D,FCB ;WRITE MVI C,WRITE ;..A CALL BDOS ;..SECTOR ORA A ;CHECK STATUS JZ WROK ;WRITE WAS OK ; ;WRITE ER ;STORE MOV M,A ;CHR IN BUFF INX H SHLD ADDR DCR B ;MORE CHARS? JNZ CHAR ;YES ;GOT 11 VALID ASCII CHARS - PRINT THEM SHOW LXI D,BUFF ;POINT TO BUFF MVI C,PRINT ;FUNCTION TO PRINT CALL BDOS ;PRINT THE FILENAME CALL CRET ;TYPE C/R JMP NEXSTAT CALL BDOS ;CHECK CONSOLE DCR A ;WAS IT READY? JZ FINIS ;YES, EXIT POP B ;GET COUNT BACK IN 6EH ;READ STATUS ANI 10H ;READY? JNZ CHAR ;NO IN 6FH ;READ TARBELL CHAR CPI ' ' ;VALID ASCII? JC GOT5 ;NO CPI 'Z'+1 JNC GOT5 LHLD ADDRM DB 'CKSUM',13,10,'$' CLSER DB 'CLOSE ERR$' ;MOVE ROUTINE, FROM HL TO DE FOR LENGTH IN B MOVE MOV A,M STAX D INX H INX D DCR B JNZ MOVE RET ;TARBELL INPUT ROUTINE TBIN IN 6EH ANI 10H JNZ TBIN IN 6FH ;CALC CKSUM PUSH H LXI H,CKBUFF DS 11 ;STORE NAME HERE DB '$' ;END DELIMITER FOR CONSOLE PRINT END 100H BE IN E MVI C,WRCON ;C HAS FUNCTION CALL BDOS ;PRINT THE CHAR POP B ;RESTORE B RET ADDR DW BUFF ;CURRENT CHAR POINTER ;TARBELL MAP FOR CP/M ;PRINTS FIRST 11 CHARS READ CONST EQU 11 ;FUNCTION TO CHECK CONSOLE STAT WRCON EQU 2 ;WRITE CONSOLE CHAR PRINT EQU 9 ;PRINT BUFFER FUNCTION BDOS EQU 5 ;BDOS ENTRY POINT ORG 100H ;TO TPA BASE CALL START DB 'TMAP 09/10/77',0DROR ; ADI '0' ;GET ERROR NUMBER FROM STAT STA WRERN ;SAVE ERROR # LXI D,WRERR ;GET MESSAGE ADDR JMP ERXIT ;PRINT MESSAGE, EXIT WROK LDA NSEC ;ARE WE DCR A ;..DONE STA NSEC ;..WRITING THIS SECTOR? JNZ WRLP ;NO JMP RDLP ;YES, READ NEXT BUFFT ;DO IT AGAIN ;CHECK IF 5 CHARS READ (FOR OLD TAPE MAP) GOT5 MOV A,B ;GET COUNT CPI 7 JNC NEXT ;NOT 5 ;GOT 5 - STORE $ IN BUFFER AFTER 5TH CHAR MVI A,'$' STA BUFF+5 JMP SHOW ;ABORT FINIS POP B ;RESET STACK RET ;ROUTINE TO TYPE C/R CRET FCB CKSUM DS 1 ;CHECKSUM NSEC DS 1 ;NUMBER OF SECTORS READ BUFAD DW BUFF ;CURR DMA BUFF POINTER BUFF EQU $ ;START OF BUFFER ; ; BDOS EQUATES (VERSION 2) ; RDCON EQU 1 WRCON EQU 2 PRINT EQU 9 OPEN EQU 15 ;0FFH=NOT FOUND CLOSE EQU 16 ; " " SSUM PUSH PSW ;SAVE CHAR XRA M ;CALC CKSUM MOV M,A ;SAVE CKSUM POP PSW POP H RET DS 30 ;STACK SPACE STACK DS 2 ;SAVE STACK POINTER HERE TAPEN DS 11 ;TAPE SAVE NAME MYFCB DS 9 ;0,FILENAME DB 'OLD' ;FOR DELETE, RENAME DB 0 DS 20 ;END OF;TSAVE V.3 - TARBELL SAVE ;WORKS FOR ANY FILE ; ;WRITES 11 CHAR FILENAME, 1 BYTE # SECTORS, DATA ; ;IF 'TSAVE FN.FT ?' IS TYPED, CHECKS THE TAPE NSEC EQU 32 ;NUMBER OF SECTORS/BLOCK ORG 100H ;TO TPA CALL START ;SKIP ID ID DB '(TSAVE 8/1/77)',0D 0=NO BUFAD DW BUFF ;CURRENT READ ADDR BUFF EQU $ ;BUFFER FROM HERE ON ; ; BDOS EQUATES (VERSION 2) ; RDCON EQU 1 WRCON EQU 2 PRINT EQU 9 OPEN EQU 15 ;0FFH=NOT FOUND CLOSE EQU 16 ; " " SRCHF EQU 17 ; " " SRCHN EQU 18 ; " " ERASE EQU 19 ; TOUT XRA A ;GET A ZERO STA BUFFN ;INIT BUFF NUMBER ;DONE - IF NOT CHECKING, INSERT DELAY ;TO ALLOW FOR FILE WRITE ON LOAD LDA CHECK CPI '?' JZ READB LXI B,0 MVI D,8 WAIT DCR C JNZ WAIT DCR B JNZ WAIT DCR D JNZ WAIT ;IF EOF, SEE SO '?' PRINTS PRAST CALL BDOS RDLP LHLD BUFAD ;GET BUFFER ADDR XCHG ;MOVE TO D,E ;SET NEW BUFFER ADDR LXI H,128 DAD D ;POINT TO NEXT SHLD BUFAD MVI C,STDMA ;SET CALL BDOS ;..DMA ADDR LHLD BUFAD LXI D,FCB MVI C,READ CALL BDOS ORAR PUSH B ;SAVE BC MOV B,A ;PUT CHAR IN B RDWT IN 6EH ;READ TARBELL STAT ANI 10H JNZ RDWT IN 6FH CMP B JZ CKOK ;CHAR MATCHED ;CHAR DIDN'T MATCH - LXI D,CKERR ;GET ERR MSG JMP ERXIT ;PRINT ERROR, EXIT CKOK POP B ;RESTORE BC RET DS 3 TOUT ;WRITE IT ;IF BUFFN IS 0, THEN THAT WAS EOF LDA BUFFN ORA A ;DONE? JZ EXIT ;YES ;WRITE THE SECTORS LXI H,BUFF ;POINT TO START SHLD BUFAD ;INIT BUFF ADDR LDA BUFFN ;GET NUMBER OF BUFFERS MOV B,A ;SAVE IN B XRA A ;GET A ZERO STA CKSH,0AH,'$' START POP D ;GET ID MSG ADDR MVI C,PRINT CALL BDOS ;PRINT ID ;INIT PRIVATE STACK LXI H,0 DAD SP SHLD STACK LXI SP,STACK ;SAVE THE '?' FROM 'TSAVE FN.FT ?' LDA FCB+17 ;LOAD THE '?' STA CHECK ;SAVE ;OPEN FILE LXI D,FCB MVI LAG JMP EOFWR ;GO WRITE LAST PART OPNER LXI D,MSG2 JMP ERXIT RDERR LXI D,MSG5 ;READ ERROR JMP ERXIT ERXIT MVI C,PRINT CALL BDOS ;PRINT MESSAGE EXIT LHLD STACK ;GET ORIGINAL STACK SPHL ;RESTORE IT RET ;--EXIT-- ;TARBELL WRITE TOUT PUSH ND EOF REC (HDR, 0 DATA) LDA EOFLG ;GET FLAG ORA A ;EOF? JNZ EOFWR ;YES JMP READB ;GO READ MORE ;READ ERROR - CHECK FOR EOF RDER DCR A ;WAS IT 1? JNZ RDERR ;NO, GENUINE READ ERROR ;EOF REACHED INR A ;GET NON-ZERO VALUE STA EOFLG ;SET EOF F A ;READ OK? JNZ RDER ;NO, CHECK EOF ;INCR BUFF COUNT, IF NSEC, WRITE LDA BUFFN INR A STA BUFFN CPI NSEC JC RDLP ;LOOP IF MORE TO DO ;HAVE READ NSEC SECTORS, WRITE THEM EOFWR LDA CHECK ;WAS TSAVE ? REQUESTED? CPI '?' JNZ NCK1 ;YES - INIT0 ;STACK AREA STACK DS 2 ;STACK POINTER MSG2 DB 'CANNOT OPEN$' MSG5 DB 'READ ERR$' CKERR DB 'COMPARE UNEQUAL$' BLKNO DB 0 ;BLOCKS READ, TO BE WRITTEN BUFFN DB 0 ;BUFFER NUMBER CHECK DS 1 ;IF TSAVE ? TYPED CKSUM DS 1 ;CHECKSUM EOFLG DB 0 ;EOF FLAG,UM ;INIT CKSUM WRSEC MVI C,128 ;INIT C TO SECTOR LENGTH WRCHR MOV A,M ;GET CHAR CALL TOUT ;WRITE IT INX H ;POINT TO NEXT DCR C ;MORE IN SECTOR? JNZ WRCHR DCR B ;DECR # OF SECTORS JNZ WRSEC ;MORE SECTORS TO WRITE LDA CKSUM ;SEND CKSUM CALLC,OPEN CALL BDOS INR A ;OPEN OK? JZ OPNER ;READ FILE, WRITE TARBELL ; IN NSEC SECTOR (4K) BLOCKS READB MVI E,'*' ;PRINT '*' EVERY BLOCK WRITTEN MVI C,WRCON ;PRINT '?' IF CHECKING, OTHERWISE '*' LDA CHECK CPI '?' JNZ PRAST MOV E,A ;MOVPSW ;CALC CKSUM PUSH H LXI H,CKSUM XRA M ;CALC CKSUM MOV M,A ;SAVE IT BACK POP H ;IF CHECKING, THEN READ AND MATCH LDA CHECK CPI '?' JZ RDCK ;READ, CHECK TWAIT IN 6EH ANI 20H JNZ TWAIT POP PSW OUT 6FH RET RDCK POP PSW ;GET CHAARBELL SYNCH CHAR CALL TOUT ;OUTPUT IT SENDF LXI H,FCB+1 ;SET UP AND MVI B,8+3 ;..OUTPUT FCBLP MOV A,M ;GET FCB CHAR CALL TOUT ;WRITE IT INX H ;POINT TO NEXT DCR B ;MORE? JNZ FCBLP ;WRITE THE SECTOR COUNT LDA BUFFN ;GET SECTOR COUNT CALL FOR INPUT TEST ;INIT TARBELL FOR INPUT MVI A,10H ;GET INPUT RESET CHAR OUT 6EH ;RESET TARBELL JMP SENDF ;SKIP OUTPUT INIT ;CHECK NOT REQUESTED - INIT TARBELL OUTPUT NCK1 MVI A,3CH ;GET TARBELL START CHAR CALL TOUT ;OUTPUT IT MVI A,0E6H ;GET TNO RET CODE READ EQU 20 ;0=OK, 1=EOF WRITE EQU 21 ;0=OK, 1=ERR, 2=?, 0FFH=NO DIR SPC MAKE EQU 22 ;0FFH=BAD REN EQU 23 ;0FFH=BAD STDMA EQU 26 BDOS EQU 5 REIPL EQU 0 FCB EQU 5CH ;SYSTEM FCB DB 0E2H,38H,30H,20H,28H,0CAH,4BH,3AH,0AH,0A8H DB 0B8H,05BH,0A0H,0B0H,02AH,0,02AH,02AH,07BH,1,40H,6 DB 0,0B0H,0,0F6H,0D3H,0E9H,0C1H,0C5H,017H DB 01FH,0D8H,0C9H,4DH,45H,7H,0F8H,0D0H,0C0H,0F0H DB 0E8H,0E0H,0FH,0C7H,0C8H,098H,43H,0DEH,53H,0,022H DB 2IM2 ' DB 'IN $INR INX JC $JM $JMP JMPRJNC JNZ JP $JPE JPO ' DB 'JRC JRNCJRNZJRZ ' DB 'JZ $LBCDLDA LDAXLDD LDDRLDED' DB 'LDI LDIRLHLDLISTLIXDLIYDLSPDLXI MOV MVI ' DB 'NOP ORA ORG ORI OUT PCHLPOP PUSHRAL RAR ' DB 'RC $RET RETIRETNRLC RM $RNC RNZ ееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееBYTE,BYTE,BYTE,BYTE,BYTE,BYTE DW BYTE,RESTRT,BYTE,REG1,DOEDBR,IMM8,DOEDBR,SET DW BRNCH,DODDBR,DOFDBR,BYTE,DOEDBR,BRNCH,DOED,DOED DW LDX,BYTE,REG1,IMM8,TITLE,BYTE,REG1,IMM8,BYTE IF EVEN DW OPLOST ENDIF ; OPCODS: DB 76H ;FOR THE OPLOST ENTR EQU 35 LOCPRT EQU 303Q PRTAD EQU 5 LABSIZ EQU 6 LINLTH EQU 116 ;PRINTER LINE LIMIT MEMEND EQU 4FFFH CANKEY EQU 9 ; ; SETUP TRANSIENT PROGRAM ORIGIN ; ORG 100H JMP START ;STARTING LOCATION ; ; SETUP STACK ORIGIN ; ORG 200H STACK: ееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееH,BRNCH DW DOED DW BRNCH,BYTE,BYTE,REG1,BRNCH,BRNCH,BRNCH,BRNCH,IMM8 DW BRNCH,BRNCH,BYTE,XRF,XRFED,DEFCON,INRDCR DW XRF,BYTE,RJMP,SKIP DW XRFED,DEFADR,BYTE,ELSE,END,ENDIF,EQUATE,BYTE,BYTE DW HALT,IF,DOED,DOED,DOED,IMM8,INRDCR,XRF,BRNCH DW BRNRP $RPE RPO ' DB 'RRC RST RZ $SBB SBCDSBI SDEDSET SHLD' DB 'SIXDSIYDSPHLSSPDSTA STAISTAR' DB 'STAXSTC SUB SUI TITLXCHGXRA XRI XTHL' EVEN EQU ($-OPTAB+4) MOD 8 IF EVEN DB 'XXXX' ENDIF ADRTAB: DW OPLOST,IMM8,REG1,REG1,IMM8,REG1,IMM8,BASE,BRNC; ; ; SETUP FOR EITHER TAPE I/O OR CP/M DISK SYSTEM I/O ; ; DISK IS CHOSEN BY MAKING THE LABEL 'DISK' TRUE ; ; TRUE EQU -1 FALSE EQU NOT TRUE ; ; DISK EQU TRUE ;DISK FLAG ; ; CP/M LINKAGE EQUATES ; BOOT EQU 0 ;SYSTEM BOOT LOC BDOY DB 0CEH,88H,80H,0C6H,0A0H,0E6H,0,0CDH,0DCH DB 0A9H DB 0FCH,02FH,03FH,0B8H,0D4H,0C4H,0F4H,0ECH DB 0FEH,0E4H,0CCH,27H,9,4AH,0,5,0BH,0F3H,10H DB 0,42H,0,0FBH,0,0,0,0,8,0D9H,076H,0,46H,56H,5EH DB 0DBH,4,3,0DAH,0FAH,0C3H,18H,0D2H,0C2H,0F2H,0EAH ; ; ; OPERATION CODE TABLE ; OPTAB DB ' ACI ADC ADD ADI ANA ANI BASECALLCC $' DB 'CCD ' DB 'CM $CMA CMC CMP CNC CNZ CP $CPE CPI ' DB 'CPO CZ $DAA DAD DADCDB $DCR DCX DI $DJNZDS $DSBB' DB 'DW $EI $ELSEEND ENDIEQU EXAFEXX HLT IF $IM0 IM1 ееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееCH,BRNCH,RJMP,BRNCH,BRNCH,BRNCH,BRNCH,BRNCH DW RJMP,RJMP,RJMP,RJMP,BRNCH,DOEDBR,BRNCH,LDX,DOED,DOED DW DOEDBR,DOED,DOED,BRNCH,LIST,DODDBR,DOFDBR,DOEDBR,LXH,MRH DW MIH,BYTE,REG1,ORG,IMM8,IMM8,BYTE,PSHPOP,PSHPOP,BYTE,BYTE DW BYTE,BYTE,DOED,DOED,BYTE,F TAPE VERSION ******************* DATIN EQU 8 ; * STATIN EQU 9 DATOUT EQU 8 COUT EQU 9 DEK1 EQU 1 DEK2 EQU 2 ; * ENDIF ;******************************************** IMPSA EQU 0 LOCPTI EQU 12 FLGPTI EQU 7 CODPTI EQU 17 ILINEL EQU 80 OLINELS EQU 5 ;DISK I/O LOC CTRLS EQU 13H ;CONTROL S TFCB EQU 5CH ;TRANSIENT FCB LOC ; ; DISK BUFFER EQUATES ; BUFSIZ EQU 128 ;DISK SECTOR SIZE HEXCNT EQU 1CH ;DATA BYTE COUNT FOR INTEL HEX LOAD RECORDS ; ; ADRS EQU 7 IF NOT DISK ;ASSEMBLE I2H,22H DB 0F9H,73H,032H,47H,4FH,2,037H,90H,0D6H,0,0EBH,0A8H DB 0EEH,0E3H ; CLEAR THE DICTIONARY DICTCL: IF NOT DISK LXI D,MEMEND-LABSIZ-4 ;MEMORY LIMIT FOR TESTING ENDIF IF DISK LXI D,-LABSIZ-5 LHLD 6 ;GET END OF MEMORY FROM CP/M DAD M,E INX H MOV A,D ORI 200Q MOV M,A LXI H,REFEND MOV M,E INR L MOV M,D MVI L,LSTENT MOV A,E SUB M MOV C,A INR L MOV A,D SBB M JC REFERR ORA C JNZ LCDON2 REFERR: MVI L,REFOVF MVI M,1 LCDON2: LXI H,LCMSG LXI D,OLINEFCB: DB 0,' PRN',0 DW 0,0,0,0,0,0,0,0,0,0 ; ; DISK FILE OUTPUT BUFFERS ; HEXBUF: DS BUFSIZ+1 ;HEX FILE BUFFER PRNBUF: DS BUFSIZ+1 ;PRINT FILE BUFFER ; * ENDIF ;***W CURLC2 PASS: DB 0 LINENR: DB ' .' LINCNT: DW 0 LISTF: DW 0 LOCCTR: DB 0,0 SYMBOL: DS LABSIZ DB ' ' VALUE: DB 0,0 STARF: DB 0 OPSAV: DB 0 LABEL: DS LABSIZ DB ' ' LABVAL: DB 0,0 LOW: DB 0,0 HIGH: DB 0,0 PLACE: DB 0,0 DICSIZ: DW ((PRMOV A,M ADD A MOV C,A MOV M,E INX H MOV A,M ADC A MOV B,A ;BC = 2*NUMBER OF REFS ORA C JNZ GTAREF DCX H MVI A,0C0H ;SET DEFINING AND FIRST REF BITS STAX D DCX D XRA A STAX D DCX D MOV M,E INX H MOV M,D JMP GTARX G * ; DISK FILE CONTROL BLOCKS (FCB) ; ASMPKT: DB 0 DW IBUFF ;ASM FILE BUFFET PTR DB 0 ASMFCB: DB 0,' ASM',0 DW 0,0,0,0,0,0,0,0,0,0 ; HEXPKT: DB 0 ;HEX FILE SPACE COMPRESSION COD XCHG ENDIF LXI H,PRELAB LXI B,8 DCLEAR: MVI M,' ' DAD B MOV M,B ;CLEAR PTR TO REF TABLE INX H MOV M,B INX H MOV A,L SUB E MOV A,H SBB D JC DCLEAR MOV M,B SHLD DICTE JMP REPASS ; ; SYMBOLIC INPUT BUFFER ; ORG (($ END1: INR M ;INCREMENT PASS XRA A LXI H,LISTF MOV M,A ;RESET LIST FLAG TO FORCE PASS 2 LISTING INR L MOV M,A STA SKPFLG ;TERMINATE ANY IF-SKIPPING CALL PFLAGS LHLD DICTE LXI D,-LABSIZ-4 DAD D LCLOOP: MOV A,M CPI ' ' JNZ XINIT ***************************************** ; ; ; OBJECT OUTPUT BUFFER (FIRST 8 BYTES MUST BE IN THE SAME PAGE) ; OBUFF: DB 303Q,74Q,0,0,377Q,377Q OBUFFE EQU OBUFF+256 ; ; PASS ONE END PROCESSING INSIDE OUTPUT BUFFER (NOT USED UNTIL PASS TWO) ; ELAB-LDICT2)/(LABSIZ+4))-1 LSTENT: DW PRELAB+LABSIZ+4 PTR: DB 0,0 BUFPTR: DW 0 LBASE: DW 16 ;OBJECT CODE LISTING BASE IBASE: DW 10 ;DEFAULT BASE FOR CONSTANT EVAL. RADIX: DW 0 IPNTSV: DB 0 SAV$OR: DB 0 SAVCAR: DB 0 COLCNT: DB 6 LINLIM: DB 50 TAREF: MOV A,D ORI 200Q MOV M,A MOV A,E ;DECR DE BY TWICE # OF REFS SUB C MOV E,A MOV A,D SBB B MOV D,A GTARX: INX H MOV A,M ;GET 1ST CHAR OF NEXT SYMBOL LXI B,LABSIZ+2 DAD B CPI ' ' ;CHECK FOR END OF TABLE JNZ XIN1 MOV UNTER DW HEXBUF ;HEX FILE BUFFER PTR DB 0 ;HEX FILE BUFFER INDEX HEXFCB: DB 0,' HEX',0 DW 0,0,0,0,0,0,0,0,0,0 ; PRNPKT: DB 0 ;PRINT FILE SPACE COMPRESSION COUNTER DW PRNBUF ;PRINT FILE BUFFER PTR DB 0 ;PRINT FILE BUFFER INDEX PRN+255)SHR 8)SHL 8 ;MUST BE AT THE BEGINNING OF A PAGE IBUFFS: DS 2 IBUFF: DS 0 ; ORG (($+255)SHR 8)SHL 8 ; ; WORKING STORAGE PAGE (MUST ALL BE IN THE SAME PAGE) ; OLINE: DS OLINEL ILINE: DS ILINEL+3 ; LDICT: DW LDICT2 DICTE: DW 0 CURLCV: D XCHG LXI H,LCOUNT MVI C,4 CALL INCNUM LXI H,-LABSIZ-4 DAD D JMP LCLOOP XINIT: IF NOT DISK LXI H,MEMEND ENDIF IF DISK LHLD 6 ;MEMORY LIMIT UNDER CP/M DCX H ENDIF SHLD LDICT2+LABSIZ+2 XCHG LXI H,LDICT2+2*LABSIZ+6 XIN1: 77777Q CODSAV: DB 0 IBPTR: DB 0,0 PAGLC: DB 177Q LFCTR: DB 0 GFLAG: DB 0 SKPFLG: DB 0 LTLPTR: DW 0 PTRADR: DB 0 LFCNT: DB 0 CURPOS: DW 0 FEMARK: DB 201Q,176Q,177Q,200Q ; IF DISK ;ASSEMBLE IF DISK VERSION ******************* ; PRFLG: DB 0 REFOVF: DB 0 REFPTR: DW 0 REFEND: DW MEMEND DEFFLG: DB 0 REFFLG: DB 0 TABFLG: DB 0 DSWTCH: DB 0 RTC: DB 0 RHOLD: DB 0 RCOUNT: DB 0 AFLAGS: DB 0 DFULLF: DB 0 CODPTR: DB 0 IPOINT: DB 0 OBUFPT: DB 0 NXTLOC: DW 177777Q FIRSTL: DW 1 MVI C,LCMSGE-LCMSG CALL BLKTFR MVI A,ILINE+ILINEL+3 STA CODPTR CALL PRINT LDA DFULLF ORA A JZ DNFULL LXI H,DFMSG LXI D,OLINE MVI C,DFMSGE-DFMSG CALL BLKTFR MVI A,ILINE+ILINEL+3 STA CODPTR CALL PRINT DNFULL: CALL PRINT XRA DNXT: CALL GETLIN JC ENDOFF LXI H,RHOLD MOV D,M MVI M,0 MVI L,RCOUNT MOV M,D RPTNXT: MVI L,IPOINT MVI M,ILINE MVI L,LINCNT CALL GETLNR MVI L,LINENR LXI D,OLINE MVI C,6 CALL BLKTFR MVI L,ILINE-1 MVI M,' ' CALL GETSNX MVI LAD B MOV A,M ANI 200Q JNZ UDLOOP XCHG LXI D,ILINE MVI C,LABSIZ CALL BLKTFR XCHG MVI M,15Q MVI L,ILINE-1 MVI M,' ' MVI L,CODPTR MVI M,ILINE+ILINEL+3 LDA OLINE+FLGPTI ORI 128 ;FORCE LISTING OF UNDEFINED, UNUSED LABELS STA OLIB,M ;GET CURRENT PTR IN BC DCX H MOV C,M MOV A,C ADI 50*(LABSIZ+4) ;INCR PTR AND STORE MOV M,A INX H MOV A,B ACI 50*(LABSIZ+4) SHR 8 MOV M,A MOV L,C ;MOVE PTR TO HL MOV H,B MOV A,M ;GET 1ST CHAR OF LABEL CPI ' '+1 ;CHECK FOR ,NULINE CALL DSPLY$ ; REPASS: LXI H,IMPSA SHLD LOCCTR XRA A STA RHOLD STA RCOUNT STA AFLAGS STA DEFFLG MVI A,OLINE+CODPTI STA CODPTR LXI H,OLINE MVI B,' ' MVI C,OLINEL-1 CALL BLKSET MVI L,LINENR MVI C,5 CALL BLKSET LXI ,LINLIM DCR M ;DECR LINE COUNT LXI B,LABSIZ+4 ;SET UP INCR VALUE JNZ L9060 ;JMP IF NOT BOTTOM OF PAGE YET MVI M,50 ;RESET LINE CNT CALL PAGEJT ;SETUP PAGE EJECT FOR NEXT LINE LXI B,251*(LABSIZ+4) L9060: LHLD LTLPTR DAD B SHLD LTLPTR A STA OPSAV LXI H,UDLMSG LXI D,OLINE MVI C,UDLMSE-UDLMSG CALL ULIST CALL PRINT MVI A,1 STA OPSAV LXI H,URLMSG LXI D,OLINE MVI C,URLMSE-URLMSG CALL ULIST LDA TABFLG ORA A JZ LTLDON MVI A,0C3H STA XFIX CALL PRINT CALL PACALL PAGEJT ; IF DISK ;ASSEMBLE IF DISK VERSION ******************* LXI H,ASMPKT ;PACKET PTR * CALL CLOSE ;END OF 1ST PASS---CLOSE SOURCE FILE LXI H,ASMFCB+12 MVI B,0 MVI C,21 CALL BLKSET ;RESET SOURCE FILE FCB AREA LXI H,ASMPKT CALNE+FLGPTI CALL PRINT JMP UDLOOP UDLDON: LXI H,OLINE MVI M,15Q RET LTLDON: MVI A,0C2H ;**** CODE MODIFICATION DONE HERE *** STA XFIX ;SHIFT OUTPUT LINE FOR CODE GENERATION IN HEX LXI H,PTRADR MOV A,M ORA A JZ LTLDN2 DCR M LTLDN2: END OF TABLE JC CHKPRF ;JMP IF END MVI C,LABSIZ ;BYTE CNT CALL BLKTFR ;TRANSFER LABEL TO OUTPUT BUFFER MOV A,E ADI LABSIZ ;INCR OUTPUT BUFFER PTR MOV E,M ;GET LABEL VALUE TO DE INX H MOV D,M MVI H,OLINE SHR 8 ;RESET PAGE REG MOV LH,0 SHLD LINCNT LXI H,IBUFF SHLD IBPTR MVI M,3 ; NXTLIN: LHLD LOCCTR SHLD LABVAL XCHG LHLD CURLCV MOV M,E INX H MOV M,D LXI H,LISTF+1 MOV A,M DCX H MOV M,A MVI L,RCOUNT MOV A,M ORA A JZ REDNXT DCR M JNZ RPTNXT RE SHLD PTR JMP L9040 ; ULIST: CALL BLKTFR LXI D,LABSIZ+4 LHLD LDICT DAD D SHLD LTLPTR UDLOOP: LXI H,OPSAV MOV C,M MVI B,0 LHLD LTLPTR XCHG LXI H,LABSIZ+4 DAD D SHLD LTLPTR MOV L,E MOV H,D MOV A,M CPI ' '+1 JC UDLDON DGEJT LXI D,LABSIZ+4 LHLD LDICT DAD D SHLD LTLPTR SHLD PTR L9040: LXI H,COLCNT MVI M,6 ;RESET COLUMN CNT MVI L,ILINE-1 MVI B,' ' MVI C,82 CALL BLKSET ;CLEAR OUT BUFFER LXI D,OLINE+7 ;POINTER TO BUFFER L9050: LXI H,PTR+1 MOV L OPEN ;OPEN SOURCE FILE FOR 2ND PASS * ENDIF ;******************************************** ; IF NOT DISK ;ASSEMBLE IF TAPE VERSION ******************* CALL REWND2 ; * ENDIF ;******************************************** ; LXI D,11 LXI HOMETHING TO PRIN^ MVI L,COLCNT DCR M ;DECR COL COUNT JNZ L9050 ;JMP IF LINE NOT DONE YET CHKPRF: LXI H,PRFLG MOV A,M ;GET PRNT FLAG ORA A JZ LTLDON ;JUMP IF ALL DONE WITH DICTIONARY MVI M,0 ;RESET PRFLG CALL PRINT ;PRINT LINE LXI H,A MVI C,5 ;DIGIT CNT CALL CONBIN ;CONVERT OCTAL VALUE TO ASCII STRING LDA BASE CPI 16 MVI A,10 ADC L MOV L,A MVI M,15Q ;STORE CR FOR POSSIBLE END MOV E,L ;SAVE HL IN DE MOV D,H MVI L,PRFLG MVI M,1 ;SET PRINT FLAG TO INDICATE S,SYMBOL MOV A,M CPI ' ' JNZ CHKLAB MVI L,SYMBOL+LABSIZ MOV A,M CPI ' ' JZ GUDLAB CPI ';' JZ NODIFF CPI '+' JNZ BADLAB LDA PASS ORA A CNZ PAGEJT JMP NODIFF ; CHKLAB: MVI L,SYMBOL+LABSIZ MOV A,M CPI ' ' JZ GUDLAB BADLA HALT MIH: PUSH B CALL GETSNB POP B CPI ',' JNZ DIERR LDA SYMBOL CALL REGDET JNZ EPROC2 MOV A,C RLC RLC RLC ORA B MOV B,A JMP EPROC2 PSHPOP: PUSH B CALL GETSNB POP B CPI ' ' JNZ DIERR LDA SYMBOL CALL REGDZ JNHLD VALUE DCX H XCHG LHLD LOCCTR MOV A,E SUB L MOV B,A MOV A,D SBB H MOV C,A ;SAVE HIGH BYTE OF DIFFERENCE MOV A,B ;GET BACK LOW BYTE OF DIFFERENCE ADD A ;HIGH ORDER BIT TO CARRY MOV A,C ;GET BACK HIGH BYTE ACI 0 ;ADD HIGH OROUN LDA SYMBOL+3 CMP M JZ OPFOUN OPDIFF: MOV H,B MOV L,C JC OPLEFT MOV A,E ANI 370Q ORA D JZ OPLOST XRA A MOV A,D RAR MOV D,A MOV A,E RAR ADI 2 ANI 0374Q MOV E,A DAD D JMP OPSRCH OPLEFT: MOV A,E ANI 370Q OR JNZ DIERR LDA SYMBOL CALL REGDX MOV A,C RLC RLC RLC ORA B MOV B,A CALL PUTBYT CALL GETEXP LXI H,VALUE MOV B,M CALL PUTBYT MVI L,VALUE+1 MOV B,M JMP EPROCZ MRH: PUSH B CALL GETSNB POP B CPI ',' JNZ DIERR LDA SYMALL GETEXP LXI H,VALUE MOV B,M CALL PUTBYT MVI L,VALUE+1 MOV B,M JMP EPROCZ REG1: PUSH B CALL GETSNB POP B CPI ' ' JNZ DIERR LDA SYMBOL CALL REGDET JNZ EPROC1 MOV A,B ORA C JMP EPROC1 BRNCH: MOV A,B JMP EPROC3 DOFDBB: MVI C,'E' CALL FLAG GUDLAB: MVI L,SYMBOL LXI D,LABEL MVI C,7 CALL BLKTFR CALL GETNB JZ EPROC CALL GETSYM CPI ' ' JNZ OPLOST MVI L,SYMBOL MOV A,M CPI ' ' JZ EPROC DOFIND: LXI D,(ADRTAB-OPTAB+4) SHR 1 AND 177774Q LXI H,OPTAB+DA SYMBOL CALL REGDET JNZ EPROC1 MOV A,C RLC RLC RLC ORA B JMP EPROC1 XRFED: PUSH B MVI B,0EDH CALL PUTBYT DB 3EH ; MVI A, ***** MVI TRICK **** XRF: PUSH B CALL GETSNB POP B CPI ' ' JNZ DIERR LDA SYMBOL CALL REGDX DER BIT OF LOW BYTE OF DIFFERENCE ;TEST FOR NINE BITS ALL ONE'S OR ALL ZERO'S JZ BYTE ;IT'S OK LDA PASS ORA A MVI C,'E' CNZ FLAG MVI B,-2 ;BRANCH TO HANG IF ERROR JMP BYTE INRDCR: PUSH B CALL GETSNB POP B CPI ' ' JNZ DIERR LA D JZ OPLOST XRA A MOV A,D RAR MOV D,A CMA MOV B,A MOV A,E RAR ADI 2 ANI 374Q MOV E,A CMA MOV C,A INX B DAD B JMP OPSRCH OPFOUN: LXI H,-OPTAB DAD B XRA A MOV A,H RAR MOV B,A MOV A,L RAR MOV C,A LXI H,BOL CALL REGDET MOV B,A JNZ EPROC2 MOV B,C PUSH B CALL GETSNB POP B CPI ' ' JNZ DIERR LDA SYMBOL CALL REGDET JNZ EPROC1 MOV A,B RLC RLC RLC ORA C ORI 100Q HALTCK: CPI 76H JNZ EPROC1 GIVEI: MVI C,'I' CALL FLAG JMPR: PUSH B MVI B,0FDH JMP DOEDX DODDBR: PUSH B MVI B,0DDH JMP DOEDX DOEDBR: PUSH B MVI B,0EDH DOEDX: CALL PUTBYT POP B JMP EPROC3+1 DOED: PUSH B MVI B,0EDH CALL PUTBYT POP B JMP BYTE RJMP: CALL PUTBYT CALL GETEXP L((ADRTAB-OPTAB+4) SHR 1 AND 177774Q) OPSRCH: MOV B,H MOV C,L LDA SYMBOL CMP M JNZ OPDIFF INX H LDA SYMBOL+1 CMP M JNZ OPDIFF INX H MOV A,M CPI '$' JZ OPFOUN LDA SYMBOL+2 CMP M JNZ OPDIFF INX H MOV A,M CPI '$' JZ OPF JNZ EPROC1 MOV A,C RLC RLC RLC ORA B JMP EPROC1 LDX: PUSH B CALL GETSNB POP B CPI ' ' JNZ DIERR LDA SYMBOL CALL REGDY JNZ EPROC1 MOV A,C RLC RLC RLC ORA B JMP EPROC1 LXH: PUSH B CALL GETSNB POP B CPI ',' LXI H,OPCODS DAD B XRA A MOV B,M MVI H,SYMBOL SHR 8 RET OPLOST: LDA SKPFLG ORA A JNZ NODIFF MVI C,'I' CALL FLAG MVI B,0 CALL PUTBYT MVI B,0 CALL PUTBYT MVI A,0 JMP EPROC1 ; ; CODE GENERATION ; DOVALX: CALL PUTBYT CADRTAB DAD B MOV E,M INX H MOV D,M LDA SKPFLG ORA A JZ NOSKP LXI H,-ELSE DAD D MOV A,H ORA L JZ NOSKP LXI H,-ENDIF DAD D MOV A,H ORA L JNZ NODIFF NOSKP: PUSH D XRA A MOV A,B RAR MOV B,A MOV A,C RAR MOV C,AZ EPROC1 MOV A,C RLC RLC RLC ORA B JMP EPROC1 ; DIERR: MVI C,'I' CALL FLAG MVI B,76H JMP EPROCZ ; ; ; RESTRT: CALL GETEXP LXI H,VALUE MOV A,M CPI 0 JM DEFERR CPI 10Q JP DEFERR RLC RLC RLC ORI 307Q MOV B,A CALL PAGEJT LDA REFOVF ORA A JZ XMAP LXI H,XRFOVF LXI D,OLINE MVI C,XRFOF-XRFOVF CALL BLKTFR CALL PRINT JMP XDUN XMAP: LHLD REFEND MVI M,100Q ;SET FLAG AT END OF XREF TABLE LXI H,LDICT2+LABSIZ+4 SHLD PTR XNXT: LXI H,ILINE-1 B,0 CALL PUTBYT JMP DEFERR ; END: CALL GETNB JNZ ENDEXP ENDOFF: LXI H,FIRSTL+1 MOV A,M CPI 377Q JNZ ENDSET LHLD OBUFF+4 MOV A,H MOV H,L MOV L,A SHLD FIRSTL ENDSET: LHLD FIRSTL SHLD VALUE XRA A ENDEXP: CNZ GETEXX LHLD VALUTER CPI 'L' JNZ LISTER MVI B,1 LISTCH: LXI H,LISTF+1 MOV M,B JMP EPROC LISTER: MVI C,'E' CALL FLAG JMP EPROC SKIP: CALL GETVAL LHLD VALUE XCHG LHLD LOCCTR DAD D SHLD LOCCTR LBEDIT: LHLD LABVAL SHLD VALUE XCHG JMP LEDIT ; MVI B,4 LXI H,FEMARK CALL WRITER ; * ENDIF ;******************************************** ; LXI H,TABFLG MOV A,M ORA A JZ ENDEX MVI L,PTRADR MOV M,A ;SET PRINTER FLAG TO FORCE PAGE EJECT ENDEX: MVI L,LISTF MVI M,0 ;FORCE PAGE EJFEXP: CALL GETEXX LXI H,VALUE MOV B,M CALL PUTBYT LXI H,SYMBOL+LABSIZ MOV A,M DEFTST: CPI ',' JZ DEFCON CPI ' ' JZ EPROC DEFERR: MVI C,'E' CALL FLAG MVI A,0 JMP EPROC1 DSTRNG: CALL GETAP JZ DEFERR CPI '''' JNZ DEFORC CALL G JMP EPROCZ ; ; IF: CALL GETVAL MOV A,D ORA E JZ IFZER MVI A,0FFH IFZER: CMA ENDIF: STA SKPFLG ;A REG IS ZERO IF WE JUMP TO ENDIF ; FROM OPSRCH JMP EPROC ELSE: LDA SKPFLG CMA STA SKPFLG JMP EPROC BA NO HEX FILE NOT REQUESTED CALL OUTBUF ;OUTPUT THE LAST BIT OF CODE MVI A,1 STA OBUFF+6 ;SETUP TRANSFER VECTOR RECORD TYPE XRA A CALL OUTBFX ;WRITE OUT THE TRANSFER VECTOR MVI C,1AH CALL HEXOUT ;WRITE EOF MARK AND FORCE BUFFER FLUSH LXIE SHLD LOCCTR XCHG MVI C,5 LXI H,OLINE+LOCPTI CALL CONBIN CALL PRINT MVI L,PASS MOV A,M ORA A JZ END1 ; IF DISK ;ASSEMBLE IF DISK VERSION ******************* LDA HEXFCB ;GET HEX FILE DRIVE # * CPI 'Z'-'A'+1 JZ ENDEX2 ;BRIFz ORG: CALL GETVAL LHLD VALUE SHLD LOCCTR JMP LEDITC ; TABPAG: MVI A,255 CALL PAGECK JMP LBEDIT TPMABE: CALL GETVL LXI H,VALUE MOV A,M CALL PAGECK JMP LBEDIT PAGECK: MVI L,LOCCTR ADD M RNC XRA A MOV M,A MVI L,LABVAL MOV ECT ON PRINTER TO CLEAR MACHINE CALL PFLAGS ; ; THE FOLLOWING CODE OUTPUTS THE XREF MAP ; LDA REFFLG ORA A ;CHECK REF FLAG JZ XDUN ;JMP IF NO XREF REQUESTED MVI A,0C3H ;FIRST BYTE OF A JUMP STA XFIX ;********CODE MODIFICATION********* ETAP CPI '''' JNZ DEFTST DEFORC: MOV B,A CALL PUTBYT JMP DSTRNG ; DEFADR: CALL GETEXP LXI H,VALUE MOV B,M CALL PUTBYT MVI L,VALUE+1 MOV B,M CALL PUTBYT LXI H,SYMBOL+LABSIZ MOV A,M CPI ',' JZ DEFADR CPI ' ' JZ EPROC MVISE: CALL GETVAL LXI H,VALUE MOV A,M CPI 8 JZ BASOK CPI 16 JZ BASOK MVI C,'E' CALL FLAG MVI A,16 BASOK: STA LBASE JMP EPROC ; LIST: CALL GETNB JZ LISTER MVI B,0 CPI 'L' JZ LISTCH CPI '-' JNZ LISTER CALL GETCH JZ LIS H,HEXPKT CALL CLOSE ;CLOSE THE HEX FILE ENDEX2: ; * ENDIF ;******************************************** ; IF NOT DISK ;ASSEMBLE IF TAPE VERSION ******************* CALL OUTBUF ; * XRA A CALL PARGEN MVI B,8 MVI L,OBUFF CALL WRITER DITC: LHLD VALUE SHLD LABVAL XCHG LEDIT: LXI H,PASS MOV A,M ORA A JZ EPROC MVI C,5 MVI L,OLINE+LOCPTI CALL CONBIN JMP EPROC ; DEFCON: CALL GETNB JZ DEFERR CPI '''' JNZ DEFEXP INX H INX H MOV A,M CPI '''' JNZ DSTRNG DEM,A MVI L,LOCCTR+1 MOV A,M INR A MOV M,A MVI L,LABVAL+1 MOV M,A RET ; REPEAT: CALL GETVAL LXI H,VALUE MOV A,M MVI L,RHOLD MOV M,A JMP LBEDIT ; EQUATE: MVI L,LABEL MOV A,M CPI ' ' MVI C,'E' CZ FLAG CALL GETVAL ; LE MVI B,' ' MVI C,82 CALL BLKSET LHLD PTR MOV A,M CPI ' '+1 ;CHECK FOR END OF SYM TAB JC XDUN LXI D,LABSIZ DAD D ;BUMP HL TO VALUE FIELD MOV E,M ;PUT VALUE IN DE INX H MOV D,M LXI H,OLINE+5 MVI C,5 ;BYTE CNT CALL CONBIN ;COL DSPLY$ JMP QUIT ; * ENDIF ;******************************************** ; EPROC3: MOV B,A CALL PUTBYT CALL GETEXP LXI H,VALUE MOV B,M CALL PUTBYT MVI L,VALUE+1 MOV B,M JMP EPROCZ IMM8: EPROC2: CALL PUTBYT CALL GETEXP LXI H, ;******************************************** ; IF NOT DISK ;******************************************** MVI A,DEK1 ; * OUT ADRS CALL BSP BFIND: MVI A,2 OUT COUT BWAIT: CALL REDWAT BREAD: MOV E,D MOV D,A CALL READCH JC BREAD MOV A LHLD REFPTR MOV D,M DCX H MOV E,M MOV A,D ANI 100Q ;MASK OFF 1ST ENTRY BIT JNZ ENDITT ;JMP IF THIS SYMBOLS DONE MOV A,D ANI 77Q ;MASK OFF FLAG BITS MOV D,A CALL GTLNR ;CONVERT LINE NUM TO ASCII LHLD BUFPTR XCHG LXI H,LINENR P D JNZ FSTOP CPI 1 JNZ TFAILF CALL READCH JC FSTOP MVI A,10Q OUT COUT ENDTFL: LXI H,RTC MVI M,3 ENDTFR: LXI H,OBUFF+2 CALL READR JNC ENDTFS JNZ ENDOBJ LXI H,RTC DCR M JP ENDTFR CALL TFAILR ENDTFS: LXI H,OBUFF CALL WRITEF5Q LXI H,OLINE MOV M,A LXI H,PHEAD MOV M,A CALL PAGEJT CALL PRINT CALL PAGEJT CALL PRINT ; IF DISK ;ASSEMBLE IF DISK VERSION ******************* LDA PRNFCB ;GET PRINT FILE DRIVE # * CPI 'Z'-'A'+1 JZ BOOT ;BRIF PRINT FILE NOT RENVERT SYM VALUE TO ASCII LHLD PTR XCHG LXI H,LABSIZ+4 DAD D ;BUMP SYM TABLE PTR TO NEXT SYM SHLD PTR XCHG LXI D,OLINE+8 ;DESTINATION IN OUTBUF MVI C,LABSIZ CALL BLKTFR LXI D,-LABSIZ-2 DAD D MOV E,M INX H MOV A,M ANI 177Q M CALL REDWAT CALL READCH CALL READCH CALL READCH CPI 40Q CNZ TFAILR CALL RECWAT XRA A BS6: SUI 1 JNZ BS6 MVI A,10Q OUT COUT MVI A,DEK2 OUT ADRS MVI A,10Q OUT COUT FS2: MVI A,1 OUT COUT FFIND: CALL REDWAT CALL READCH MOV,E CMA CMP D MVI D,0 JNZ BSTOP CPI 303Q JZ BWAIT MOV D,A BSTOP: XRA A BS1: SUI 1 JNZ BS1 MVI A,10Q OUT COUT MVI A,1 OUT COUT MOV A,D CPI 201Q JZ BS2 CALL REDWAT CALL RECWAT XRA A BS3: SUI 1 JNZ BS3 JMP BFIND BS2: MVI C,5 CALL BLKTFR ;PUT LINE NUM IN OUT BUF LHLD REFPTR MOV A,M RLC JNC XLP4 XCHG XLP3: DCX H MOV A,M CPI ' ' JNZ XLP3 MVI M,'*' XLP4: LHLD BUFPTR LXI D,7 DAD D ;BUMP BUFFER POINTER SHLD BUFPTR LHLD REFPTR DCX H DCX JMP ENDTFL ENDOBJ: MVI B,4 LXI H,FEMARK CALL WRITEF CALL BSP QUIT: MVI A,1 OUT ADRS CALL REWIND HLT ; TFAILR: MVI A,10Q OUT COUT LXI H,TFRMSG CALL DSPLY$ TFRL: HLT JMP TFRL ; TFAILF: MVI A,10Q OUT COUT LXI H,TFFMSG CALQUESTED CPI 'X'-'A'+1 JZ BOOT ;BRIF PRINT FILE NOT REQUESTED (DISPLAY) MVI C,1AH LXI H,PRNPKT CALL PO ;WRITE EOF MARK AND FORCE BUFFER FLUSHING LXI H,PRNPKT CALL CLOSE ;CLOSE THE PRINT FILE JMP BOOT ;ALL DONE---RE-BOOT SYSTEM * ENDIF OV H,A MOV L,E MOV A,M ;GET MS BYTE OF OF LINE NUM ANI 277Q ;MASK OUT THE 1ST ENTRY FLAG MOV M,A SHLD REFPTR ;SAVE PTR TO ENTRY IN REF TABLE XLIST: LXI H,OLINE+18 SHLD BUFPTR LXI H,SAV$OR MVI M,16 ;ACCUMULATED LINE CHAR CNT XLOOP: D,A CALL READCH CMA CMP D JZ FCHECK FSTOP: MVI A,10Q OUT COUT XRA A FS1: SUI 1 JNZ FS1 CALL BSP JMP FS2 FCHECK: CPI 303Q JNZ FCH1 CALL RECWAT JMP FFIND FCH1: CPI 201Q JNZ FSTOP CALL READCH MOV D,A CALL READCH CMA CMCK FOR NO ENTRIES JZ XNXT MVI L,OLINE MVI M,15Q CALL PRINT ;FORCE DOUBLE SPACING JMP XNXT ENDIT: LHLD BUFPTR DCX H DCX H MVI M,15Q ;INSERT CR TO END LINE CALL PRINT LXI H,ILINE-1 MVI B,' ' MVI C,82 JMP BLKSET XDUN: MVI A,1H SHLD REFPTR LXI H,SAV$OR MOV A,M ADI 7 MOV M,A ;BUMP LINE CHAR CNT SUI LINLTH-6 JC XLOOP ;JUMP IF LINE NOT FULL YET CALL ENDIT ;PRINT LINE AND CLEAR BUFFER JMP XLIST ENDITT: CALL ENDIT LXI H,BUFPTR MOV A,M CPI OLINE+18 ;CHEVALUE MOV B,M JMP EPROCZ HALT: MVI A,166Q NOP: NOP EPROC1: MOV B,A BYTE: EPROCZ: CALL PUTBYT TITLE: EPROC: LDA SKPFLG ORA A JNZ NODIFF LXI H,LABEL MOV A,M CPI ' ' JZ NODIFF LXI D,SYMBOL MVI C,LABSIZ+1 CALL BLKTFR LXI H,DEFFLG H,OBUFPT INR M MOV E,M MVI D,0 ;SET UP TO DO A DOUBLE ADD LXI H,OBUFF+7 DAD D LDA CODSAV MOV M,A MOV A,L CPI OBUFFE-1 CZ OUTBUF MVI H,SYMBOL SHR 8 RET ; OUTBUF: LXI H,OBUFPT MOV A,M ORA A JZ OUTSET CALL PARGEN LXI H,OOAD RECORD CNC OUTBUF ;CALIF FULL RECORD NOCOD2: MVI H,SYMBOL SHR 8 RET ; OUTBUF: LXI H,OBUFPT MOV A,M ;GET BUF PTR MVI M,0 ;RESET IT ORA A JZ OUTSET ;BRIF NO CODE IN BUF OUTBFX: MOV E,A ;SETUP BYTE CNT LXI H,OBUFF+4 ;STARTIN C,1 CZ BDOS ;HANG UNTIL WE HIT ANOTHER KEY JMP NXTLIN ; CSTS: IF NOT DISK IN 17 RRC RRC SBB A RET ENDIF IF DISK PUSH B PUSH D PUSH H MVI C,11 CALL BDOS POP H POP D POP B RET ENDIF ; ENTER: XCHG LHLD LABVAL C RRC RRC RRC CALL CONV ;CONVERT NIBBLE TO ASCII AND OUTPUT IT POP PSW PUSH PSW CALL CONV POP PSW ADD D ;ACCUMULATE CHECKSUM MOV D,A RET CONV: ANI 0FH ADI 90H DAA ACI 40H DAA MOV C,A ; HEXOUT: PUSH D PUSH H LXIDD C STA CODPTR LXI H,CODSAV MOV E,M MVI D,0 SUB C MOV L,A MVI C,3 CALL CONBIN ; IF DISK ;ASSEMBLE IF DISK VERSION ******************* NOCOD: ; * LHLD LOCCTR INX H SHLD NXTLOC SHLD LOCCTR LDA HEXFCB ;GET HEX FILE DRIVE # MVI M,200Q CALL LOOKUP JC NODIFF JZ ENTER DCX H XCHG LHLD LABVAL MOV B,H MOV C,L XCHG MVI D,0 MOV A,M CMP C JZ FVSAME MVI D,'D' MOV M,C FVSAME: INX H MOV A,M CMP B JZ SVSAME MVI D,'D' MOV M,B SVSAME: MOV A,L SE INR E OUTBU2: MOV A,M ;GET BYTE CALL PBYTE ;OUTPUT IT INX H DCR E JNZ OUTBU2 ;BRIF NOT DONE XRA A SUB D ;COMPLEMENT CHECKSUM CALL PBYTE ;OUTPUT CHECKSUM LDA FIRSTL+1 CPI 377Q JNZ OUTSET ;BRIF NOT FIRST RECORD LHLD OBUFF+4 G BUF ADDR MVI C,0DH CALL HEXOUT ;OUTPUT CR MVI C,0AH CALL HEXOUT ;OUTPUT LF MVI C,':' CALL HEXOUT ;OUTPUT COLON MVI D,0 ;INIT CHECKSUM MOV A,E CALL PBYTE ;OUTPUT BYTE CNT INR E ;INCR BYTE CNT TO INCLUDE LOAD ADDR AND TYPE INR XCHG MOV M,D DCX H MOV M,E INX H MVI D,0 JMP SVSAME PUTBYT: LDA SKPFLG ORA A RNZ LDA PASS ORA A JNZ PTBYT2 LHLD LOCCTR INX H SHLD LOCCTR LDA CODPTR CPI OLINE+CODPTI+20 CZ PRINT LXI H,CODPTR MOV A,M ADI 4 MOV M,A H,HEXPKT CALL PO ;OUTPUT CHAR TO DISK POP H POP D RET ; * ENDIF ;******************************************** ; IF NOT DISK ;ASSEMBLE IF TAPE VERSION ******************* NOCOD: ; * LHLD LOCCTR INX H SHLD NXTLOC SHLD LOCCTR LXI CPI 'Z'-'A'+1 JZ NOCOD2 ;BRIF HEX FILE NOT REQUESTED LXI H,OBUFPT INR M ;INR BUF PTR MOV E,M ;GET BUF PTR MVI D,0 LXI H,OBUFF+6 DAD D ;CALC LOC LDA CODSAV ;GET CODE BYTE MOV M,A ;STORE BYTE MOV A,E CPI HEXCNT ;CHECK FOR FULL LUI LABSIZ+1 MOV L,A MOV A,H SBI 0 MOV H,A MOV A,M ORI 200Q MOV M,A MOV A,D CPI 'D' MOV C,A CZ FLAG NODIFF: CALL PRINT LDA PASS ORA A JZ NXTLIN CALL CSTS ORA A JZ NXTLIN MVI C,1 CALL BDOS CPI CTRLS ;CONTROL S MVI;SET LOAD ADDR MOV A,H MOV H,L MOV L,A SHLD FIRSTL ;STORE FIRST RECORDS LOAD ADDR OUTSET: LHLD LOCCTR MOV A,H MOV H,L MOV L,A SHLD OBUFF+4 ;SETUP NEW LOAD ADDR XRA A STA OBUFF+6 ;SETUP RECORD TYPE RET ; PBYTE: PUSH PSW RRCODPTI JZ PUTLOC CPI OLINE+CODPTI+20 JZ PUTBLX CPI OLINE+CODPTI+15 JNZ PUTCOD PUTBLX: CALL PRINT PUTLOC: LHLD LOCCTR XCHG LXI H,OLINE+LOCPTI MVI C,5 CALL CONBIN PUTCOD: LDA LBASE CPI 16 MVI C,3 JZ $+4 INR C LDA CODPTR A RET PTBYT2: LXI H,CODSAV MOV M,B MVI L,NXTLOC MOV A,M MVI L,LOCCTR CMP M JNZ PUTBLK MVI L,NXTLOC+1 MOV A,M MVI L,LOCCTR+1 CMP M PUTBLK: CNZ OUTBUF LDA DSWTCH LXI H,PTRADR ORA M JZ NOCOD LXI H,CODPTR MOV A,M CPI OLINE+BUFPT MOV A,M ADI 8 MOV B,A MVI M,0 LXI H,OBUFF CALL WRITER LDA FIRSTL+1 CPI 377Q JNZ OUTSET LHLD OBUFF+4 MOV A,H MOV H,L MOV L,A SHLD FIRSTL OUTSET: LHLD LOCCTR MOV A,H MOV H,L MOV L,A SHLD OBUFF+4 CMA MOV L,A MODDR AND RET ; READF: LXI D,IBUFF CALL SETDMA ;SETUP INPUT ADDR LXI D,ASMFCB MVI C,20 CALL BDOS ;READ IN SOURCE SECTOR ORA A RZ ;RETIF GOOD READ STC SBB A ;SET CARRY FLAG, CLEAR ZERO FLAG LXI H,IBUFF+BUFSIZ RET ; * ENDIF ;**ORE BUF INDEX CPI BUFSIZ ;CHECK FOR FULL BUFFER JNC PO4 ;BRIF BUFFER FULL MOV A,C CPI 1AH ;CHECK FOR EOF CHAR RNZ ;RETIF NOT EOF PO4: MVI M,0 ;RESET BUF INDEX INX H PUSH H ;SAVE FCB PTR CALL SETDMA ;SETUP WRITE ADDR POP D ;GET K FOR EOF SUI 1 RC ;RETIF EOF (CARRY=TRUE, ZERO=FALSE) INX H XCHG MOV A,L CPI ILINE+ILINEL JC GETLIX MVI B,15Q GETLIX: MOV M,B INX H XCHG MOV A,B CPI 15Q JNZ GETLP SHLD IBPTR RET ; IGNLF: INX H JMP GETLP ; GETETX: CALL SETDMA ;SETUP DMA ADDR POP D ;GET FCB PTR PUSH D MVI C,19 CALL BDOS ;DELETE FILE POP D MVI C,22 JMP BDOS ;MAKE FILE AND RET ; OPEN: MVI C,15 DB 11H ;LXI D TRICK ; CLOSE: MVI C,16 INX H MOV E,M ;LOAD DE WITH BUFFE * PO: MOV A,C ;GET CHAR ; CPI ' ' ;CHECK FOR BLANK ; JZ PO6 ;BRIF BLANK ; CPI 0CH ;CHECK FOR FORM FEED ; RZ ;RETIF FORM FEED MOV A,M ;GET SPACE CNT ORA A CNZ POSPC ;CALIF COMPRESSED SPACES TO BE OUTV A,H CMA MOV H,A SHLD OBUFF+6 RET ; * ENDIF ;******************************************** ; GETLIN: LHLD LINCNT INX H SHLD LINCNT LHLD IBPTR LXI D,ILINE GETLP: IF DISK ;ASSEMBLE IF DISK VERSION ******************* MOV A,L ; FOR SPACE CNT WHICH LOOKS LIKE EOF JNZ PO10 ;BRIF OK DCR M ;DECR SPACE CNT MVI C,' ' CALL PO2 ;OUTPUT SPACE PO10: MVI C,9 CALL PO2 ;OUTPUT HORIZONTAL TAB POP H ;GET PACKET PTR PUSH H MOV C,M ;GET SPACE CNT PO12: MVI M,0 ;RESET SPFCB PTR MVI C,21 ;SETUP FOR WRITE JMP BDOS ;GO WRITE RECORD AND RETURN ; PO6: INR M ;INCR SPACE CNT RET ; POSPC: PUSH B ;SAVE CHAR PUSH H ;SAVE PACKET PTR CPI 1 ;CHECK FOR SINGLE SPACE JZ PO14 ;BRIF SINGLE SPACE CPI 1AH ;CHECKXCHG SHLD IBPTR LXI H,RTC MVI M,3 GETETY: LXI H,IBUFFS CALL READF JNC GETETZ RNZ LXI H,RTC DCR M JP GETETY JMP TFAILF ; GETETZ: MVI M,3 LHLD IBPTR XCHG LXI H,IBUFF JMP GETLP ; GETHT: INX H ; IF DISK ;ASSEMBLE IF DISKR ADDR INX H MOV D,M INX H INX H PUSH H ;SAVE FCB PTR PUSH B ;SAVE FUNCTION CODE CALL SETDMA ;SETUP DMA PTR POP B ;GET FUNCTION CODE POP D ;GET FCB PTR JMP BDOS ;PERFORM FUNCTION ; SETDMA: MVI C,26 JMP BDOS ;GO SETUP DMA APUT PO2: INX H MOV E,M ;LOAD DE WITH BUFFER PTR INX H MOV D,M INX H PUSH H ;SAVE BUF INDEX PTR MOV A,M ;GET BUF INDEX MOV L,A MVI H,0 DAD D ;CALC BUF LOC MOV M,C ;STORE CHAR POP H ;GET BUF INDEX INR A ;INCR IT MOV M,A ;ST * CPI IBUFF+BUFSIZ ;CHECK FOR EMPTY BUFFER JNC GETETX ;BRIF BUFFER EMPTY * ENDIF ;******************************************** MOV A,M CPI 3 JZ GETETX CPI 11Q JZ GETHT CPI 0AH JZ IGNLF ;IGNORE LINE FEEDS MOV B,A SUI 1AH ;CHECACE CNT CALL PO2 ;OUTPUT SPACE CNT POP H ;GET PACKET PTR POP B ;GET CHAR RET PO14: MVI C,' ' JMP PO12 ;OUTPUT SINGLE SPACE ; ; MAKE: INX H MOV E,M ;LOAD DE WITH BUFFER ADDR INX H MOV D,M INX H INX H PUSH H ;PUSH FCB PTR ************************** ; MVI B,' ' MVI A,ILINE-1 SUB E ANI 7 INR A MOV C,A XCHG CALL BLKSET XCHG JMP GETLP ; ; DISK I/O ROUTINES ; IF DISK ;ASSEMBLE IF DISK VERSION ******************* ; VERSION ******************* MOV A,L ;CHECK FOR EMPTY BUFFER * CPI IBUFF+BUFSIZ JC GETHT2 ;BRIF BUFFER NOT EMPTY PUSH D CALL READF ;READ NEXT SECTOR POP D RNZ ;RETIF EOF ENCOUNTERED LXI H,IBUFF GETHT2: ; * ENDIF ;************************************************************ ; REGDZ: MVI C,6 CPI 'P' RZ JMP REGDZ1 ; REGDET: MVI C,1 CPI 'C' RZ MVI C,7 CPI 'A' RZ MVI C,3 CPI 'E' RZ MVI C,5 CPI 'L' RZ MVI C,6 CPI 'M' RZ REGDX: MVI C,6 CPI 'S'OV H,A POP PSW DCR A JNZ DIV1 ORA A MOV A,H RAR MOV D,A MOV A,L RAR MOV E,A RET ; ; SUBROUTINE MULT ; ; COME IN WITH ARGUMENTS IN BC AND DE ; RESULT RETURNED IN DE ; MULT: MOV A,C SUB E MOV A,B SBB D JP MUL1 MOV JNZ DISPL0 LXI H,OLINE+FLGPTI ;PRINT ERROR ITEMS IN PASS TWO MOV A,M CPI ' ' RZ DISPL0: XCHG LXI D,11 JMP DSPLY$ ; FLAG: LXI H,OLINE+FLGPTI MOV M,C MOV A,C CALL FLGDET MVI L,AFLAGS MOV A,M ORA B MOV M,A RET ; FLGDET: MVI DCR M JNZ PRINTL LXI H,PAGNR MVI C,3 CALL INCNUM LXI D,PHEAD CALL PRINT$ LXI D,NULINE CALL PRINT$ LXI D,NULINE CALL PRINT$ ; PRINT9: LDA LBASE CPI 16 XFIX: JNZ PR9X ;THIS IS MODIFIED WHEN THE XREF MAP GOES OUT MVI A,' ' LD LBASE XCHG CALL DIV MOV A,E ADI 220Q DAA ACI 100Q DAA POP H MOV M,A DCX H POP D DCR E RZ PUSH D JMP CONLOP ; ; SUBROUTINE DIV ; ; COME IN WITH DIVIDEND IN BC, DIVISOR IN DE ; RETURNS WITH QUOTIENT IN BC, REMAINDER IN ;RESET PAGE REG MOV M,A INR L MOV A,C LXI B,1000 CPI 10000 JZ GTLNR1 LXI B,100 CPI 1000 ;CHECK LAST POWER OF TEN USED JZ GTLNR1 ;JUMP IF IT WAS 1000 LXI B,10 CPI 100 JZ GTLNR1 ;JUMP IF IT WAS 100 MOV A,E ADI '0' MOV M,A RZ REGDZ1: MVI C,4 CPI 'H' RZ REGDY: MVI C,0 CPI 'B' RZ MVI C,2 CPI 'D' RZ MVI C,'I' CALL FLAG MVI A,166Q RET ; PAGEJT: LXI H,PAGLC MVI M,54 RET ; PRINT: LDA PASS ORA A JNZ PRINT2 LDA OLINE+FLGPTI CPI ' ' RZ ENDPUT LXI H,ENDERM LXI D,OLINE MVI C,ENDEEE-ENDERM CALL BLKTFR MVI A,ILINE+ILINEL+3 STA CODPTR JMP PRINT ; ENDPUT: MOV A,B RRC MOV B,A RNC MOV M,C INX H RET ; ENDERM: DB 'ERRORS: ' ENDERE: DB ' ',15Q ENDEEE: DS 0 ; B,1 CPI 'D' RZ MVI B,2 CPI 'I' RZ MVI B,4 CPI 'E' RZ MVI B,8 RET ; PFLAGS: LXI H,AFLAGS MOV A,M ORA A RZ LXI H,ENDERE MOV B,A MVI C,'D' CALL ENDPUT MVI C,'I' CALL ENDPUT MVI C,'E' CALL ENDPUT MVI C,'U' CALL XI H,ILINE-5 MOV M,A INX H MOV M,A INX H MOV M,A INX H MOV M,A PR9X: LXI D,OLINE CALL PRINT$ LXI D,OLINE UCALL DISPLY PRINTB: LXI H,CODPTR MVI M,OLINE+CODPTI MVI L,OLINE MVI B,' ' MVI C,OLINEL-1 CALL BLKSET MVI M,15Q RDE ; DIV: MOV A,D CMA MOV D,A MOV A,E CMA MOV E,A INX D LXI H,0 MVI A,21Q DIV1: PUSH H DAD D JNC DIV2 XTHL DIV2: POP H PUSH PSW MOV A,C RAL MOV C,A MOV A,B RAL MOV B,A MOV A,L RAL MOV L,A MOV A,H RAL MMVI L,LINENR MVI C,4 ;DIGIT CNT GTLNR4: MOV A,M ;GET DIGIT CPI '0' ;CHECK FOR LEADING ZERO RNZ ;QUIT IF NOT ZERO MVI M,' ' ;REPLACE WITH BLANK INR L DCR C JNZ GTLNR4 RET ; DISPLY: LDA PASS ORA A JZ DISPL0 LDA DSWTCH ORA A PRINT2: LDA LISTF ORA A JZ PRINT3 LDA OLINE+FLGPTI CPI ' ' JZ PRINTB PRINT3: LXI H,PAGLC INR M MOV A,M CPI 54 JM PRINT9 MVI M,0 LXI D,FORMFD MVI A,3 STA LFCTR JMP PRINTF PRINTL: LXI D,NULINE PRINTF: CALL PRINT$ LXI H,LFCTR ; ; ; BLKTFR: MOV A,M INX H STAX D INX D DCR C JNZ BLKTFR RET ; BLKSET: MOV M,B INX H DCR C JNZ BLKSET RET ; CONBIN: LDA LBASE CPI 16 JNZ $+4 DCR C PUSH B ;SAVE DIGIT CNT MOV B,D MOV C,E CONLOP: PUSH H LHLVALUE SUB C ;SUBTRACT OFF POWER OF TEN MOV E,A MOV A,D SBB B MOV D,A JNC GTLNR2 ;LOOP TILL UNDERFLOW MOV A,E ADD C ;RE-ESTABLISH CNT MOV E,A MOV A,D ADC B MOV D,A MOV A,H ADI '0'-1 ;GENERATE ASCII NUMBER MVI H,LINENR SHR 8T ; INCNUM: MOV A,M ORI '0' INR A MOV M,A CPI '9'+1 RNZ MVI M,'0' DCX H DCR C JNZ INCNUM RET GETLNR: MOV E,M INX H MOV D,M GTLNR: LXI H,LINENR LXI B,10000 GTLNR1: MVI H,0 ;RESET DIGIT CNT GTLNR2: INR H MOV A,E ;GET H,B MOV L,C XCHG MOV B,H MOV C,L MUL1: LXI H,0 XCHG MUL2: MOV A,B ORA C RZ XCHG MOV A,B RAR MOV B,A MOV A,C RAR MOV C,A JNC MUL3 DAD D MUL3: XCHG DAD H JMP MUL2 ; IF NOT DISK ;ASSEMBLE IF TAPE VERSION ************O CHECK CPI ',' JZ L2U L2A: CPI ')' JNZ L2B L2E: CALL UNSTAK JC L2C JZ GETERR JMP L2E L2B: CALL GETBOP ;GET BINARY OPERATOR JC GETERR CALL STAK2 JMP L1B ; ; UNSTACK ALL THE OPERATORS--WE SHOULD BE DONE ; L2U: STA SYMBOL+6 L2 RET ; * ENDIF ;******************************************** ; ; LEXICAL SCANNING ROUTINES ; GETEXP: CALL GETNB GETEXX: MVI B,0 JMP GETON GETVAL: CALL GETNB MVI B,-1 GETON: LXI H,GFLAG MOV M,B STA STARF ;SAVE FIRST CHAR IN CASE OF * PUSH D PUSH H MOV E,A MVI C,2 CALL BDOS ;SEND CHAR TO CONSOLE POP H POP D POP B POP PSW ENDIF ; RET ; ; DSPWRT: LDA CURPOS CPI 78 JNC DSPLYL INR A STA CURPOS MOV A,M CALL WRITEC DSPLYL: INX H DSPLY$: MOV A,M CALL GETNUM PUSH PSW ;TEMP SAVE CALL STAK1 POP PSW ;GET LAST CHAR BACK JMP L2 L1E: CALL GETUOP JC GETERR L1EX: CALL STAK2 JMP L1B L1F: LXI D,0 CALL GETAP CPI '''' JNZ L1G INX H MOV A,M CPI '''' L1H: CZ GETAP L1G: MOV ,B CPI 140Q JC LP4 ANI 137Q LP4: OUT DATOUT CPI 12Q JNZ LP1 MVI C,0 MVI B,-15 LXI H,LFCNT INR M MOV A,M CPI 66 JNZ LP5 MVI M,0 LP5: IN STATIN RLC JC LP6 INR C JNZ LP5 INR B JNZ LP5 LP699: IN STATIN RRC JNC LP699******* PARGEN: ; * ADI OBUFF+7 MOV L,A MVI A,(OBUFF+7) SHR 8 ACI 0 MOV H,A MVI D,0 MOV E,D PARGEL: MOV A,M MOV B,A XRA D MOV D,A MOV A,E RLC XRA B MOV E,A DCX H MOV A,L CPI OBUFF+3 JNZ PARGEL MOV M,E DCX H MOV CPI 'Z'+1 JNC L1C L1$: CALL GETUOP JNC L1EX LDA IPNTSV STA IPOINT CALL GETCH CALL GETSYM CALL LOOKUP JC GETUFC ;TABLE OVERFLOW LXI B,-LABSIZ DAD B MOV A,M ORI 200Q ;INDICATE LABEL HAS BEEN REFERENCED MOV M,A DCX H MOV A,M CPI '*' CZ GETCH LXI H,0 SHLD VALUE SHLD OPRPTR SHLD LABPTR JMP L1 ; L1B: CALL GETNB L1: JZ GETERR CPI ')' JZ GETERR CPI '(' JNZ L1A MOV D,A CALL STAK2 JMP L1B L1A: CPI '''' JZ L1F CPI '$' JZ L1$ CPI '@' JC L1C ANI 177Q CPI ' ' JNC DSPWRT CPI 3 JZ DSPEND CPI 15Q JZ DSPENR JMP DSPLYL ; DSPENR: MVI A,13 CALL WRITEC MVI A,10 CALL WRITEC XRA A STA CURPOS DSPEND: INX H RET ; ; PRINT$: LDA PTRADR ORA A RZ MVI A,PRTAD OUT AD,E MOV E,A CALL GETAP JZ GETERR CPI '''' JNZ L1G INX H MOV A,M CPI '''' JZ L1H CALL STAK1 ;THIS MUST FALL THROUGH TO L2C ; ; L2C: CALL GETNB JZ L2U ;ALL DONE L2: CPI '(' JZ GETERR CPI ' ' JZ L2C ;POSSIBLY END OF LINE-G MVI A,12Q OUT DATOUT MVI B,-15 JMP LP5 LP6: IN STATIN RLC JC LP6 RET LP1: CPI 14Q RNZ LP3: IN STATIN RLC JNC LP3 LP7: IN STATIN RLC JC LP7 LXI H,LFCNT INR M MOV A,M CPI 65 JNZ LP3 MVI M,0 MVI A,177Q OUT DATOUT M,D RET ; * ENDIF ;******************************************** ; WRITEC: IF NOT DISK PUSH PSW WRX: IN 17 ;GET UART STATUS ANI 1 ;MASK OFF TBE JZ WRX POP PSW OUT 16 ;SEND OUT THE DATA BYTE ENDIF ; IF DISK PUSH PSW PUSH B ANI 200Q ;SEE IF LABEL IS DEFINED JNZ L1D GETUFC: LDA PASS ORA A JNZ UFLAG LDA GFLAG ORA A JZ NOUFLAG UFLAG: MVI C,'U' CALL FLAG NOUFLAG: LXI D,0 L1D: CALL STAK1 LDA SYMBOL+LABSIZ JMP L2 L1C: CPI '0' JC L1E CPI '9'+1 JNC L1E CHAR TO C PUSH D LXI H,PRNPKT CALL PO ;WRITE CHAR TO DISK POP D RET ; * ENDIF ;******************************************** ; IF NOT DISK ;ASSEMBLE IF TAPE VERSION ******************* LPRINT: ; * IN STATIN RRC JNC LPRINT MOV ADRS PRTC: LDAX D INX D ANI 177Q CPI 15Q JZ PRTEND MOV B,A CALL LPRINT JMP PRTC PRTEND: MVI B,' ' CALL LPRINT MVI B,15Q CALL LPRINT MVI B,12Q ; IF DISK ;ASSEMBLE IF DISK VERSION ******************* LPRINT: ; * MOV C,B ;MOVEUN: CALL UNSTAK JC GETERR JNZ L2UN XCHG LHLD LABSTK LDA STARF CPI '*' JNZ L2UX MOV A,H MOV H,L MOV L,A L2UX: SHLD VALUE XCHG ORA A RET ; UNSUB: DCX D ;SET UP FOR TWO'S COMPLEMENT UNNOT: MOV A,E CMA MOV E,A MOV A,D GETCH: LXI H,IPOINT MOV B,M INR M MOV L,B MOV A,M CPI 15Q JZ GETCH1 CPI ';' RNZ GETCH1: MVI L,IPOINT MOV M,B MVI A,' ' RET ; GETNB: CALL GETCH RZ CPI ' ' JZ GETNB RET ; GETSNX: CALL GETCH JMP GETSYM GETSNB: CALL G: DW UNSUB DW UNADD DW UNNOT ; PRCTAB: DB 5,5,6,6,6,6,6,3,2,2,6,6,6 ; OPRPTR: DW 0 LABPTR: DW 0 OPRSTK: DS 40 LABSTK: DS 40 ; BINADD: DCX H MOV B,M ;GET SECOND ARG INTO B,C DCX H MOV C,M XCHG ;GET FIRST ARG INTO H,L DAD B MOV M,E INX H MOV M,D LHLD OPRPTR INX H INX H SHLD OPRPTR RET ; UNSTAK: LHLD OPRPTR LXI B,OPRSTK MOV A,L ORA A RZ DCX H DCX H SHLD OPRPTR DAD B MOV E,M INX H MOV A,M CPI '(' STC RZ ; MVI D,0 LXI H,BINADRMOV E,A DCR C JNZ SHR1 RET ; MOD: DCX H MOV B,M DCX H MOV C,M PUSH H CALL DIV POP H RET ; ANDOP: DCX H MOV A,M ANA D MOV D,A DCX H MOV A,M ANA E MOV E,A RET ; OROP: DCX H MOV A,M ORA D MOV D,A DCX RZ ;NO OPERATOR CPI 3 JNZ NBOP INX D LDA IPNTSV STA IPOINT INR C JMP GETB1 ; GOTBOP: MOV A,C ADD A MOV E,A ;E CONTAINS OPRTAB INDEX MVI B,0 LXI H,PRCTAB DAD B MOV D,M ;D CONTAINS PRECEDENCE RET ; BINOPR: DB '+',3,'- CMA MOV D,A UNADD: INX SP ;GET RID OF USUAL RETURN ADDRESS INX SP ;THIS MUST FALL THROUGH TO STAK1 ; STAK1: LHLD LABPTR INX H INX H SHLD LABPTR LXI B,LABSTK-2 DAD B MOV M,E INX H MOV M,D MVI A,-1 ORA A RET ; STAK2: NZ DIVIDZ LXI D,177777Q DCX H DCX H RET DIVIDZ: DCX H MOV B,M DCX H MOV C,M PUSH H CALL DIV POP H MOV E,C MOV D,B RET ; SHL: MOV A,E ANI 15 MOV C,A DCX H MOV D,M DCX H MOV E,M INR C DCR C RZ ;IF SHIFT CO XCHG RET ; BINSUB: DCX H MOV B,M DCX H MOV A,M SUB E MOV E,A MOV A,B SBB D MOV D,A RET ; TIMES: DCX H MOV B,M DCX H MOV C,M PUSH H CALL MULT POP H ;GET BACK LABSTK ADDRESS RET ; DIVID: MOV A,D ORA E J DAD D MOV E,M INX H MOV D,M LXI B,UNSTK2 PUSH B ;RETURN TO UNSTK2 PUSH D ;ROUTINE TO DO WORK LHLD LABPTR DCX H DCX H SHLD LABPTR LXI B,LABSTK+1 DAD B MOV D,M DCX H MOV E,M ;PICK UP FIRST OPERAND RET ;GO TO WORKING ROUH MOV A,M ORA E MOV E,A RET ; XOROP: DCX H MOV A,M XRA D MOV D,A DCX H MOV A,M XRA E MOV E,A RET ; GETAP: LXI H,IPOINT MOV B,M INR M MOV L,B MOV A,M CPI 15Q RNZ MVI L,IPOINT MOV M,B MVI A,' ' RET ; ;',3,'*',3,'/',3 DB 'SHL',3,'SHR',3 DB 'MOD',3 DB 'AND',3 DB 'OR',3 DB 'XOR' DB 4 UNOPR: DB '-',3,'+',3,'NOT ' DB 4 ; BINADR: DW BINADD DW BINSUB DW TIMES DW DIVID DW SHL DW SHR DW MOD DW ANDOP DW OROP DW XOROP UNADRLHLD OPRPTR LXI B,OPRSTK-1 DAD B MVI A,'(' CMP D JZ ONSTK2 STK2A: LHLD OPRPTR LXI B,OPRSTK-1 MOV A,L DAD B ORA A JZ ONSTK2 MOV A,M CPI '(' JZ ONSTK2 CMP D JC ONSTK2 PUSH D CALL UNSTAK POP D JMP STK2A ONSTK2: INX H UNT=0, DO NOTHING XCHG SHL1: DAD H DCR C JNZ SHL1 XCHG RET ; SHR: MOV A,E ANI 15 MOV C,A DCX H MOV D,M DCX H MOV E,M INR C DCR C RZ ;IF SHIFT COUNT=0, DO NOTHING SHR1: MOV A,D ORA A RAR MOV D,A MOV A,E RAR GETBO1 ; GETBOP: LXI D,BINOPR MVI C,0 GETBO1: LDA IPOINT DCR A STA IPOINT STA IPNTSV GETB1: LDAX D CPI 4 JZ GOTBOP CPI 3 JZ GOTBOP CALL GETCH LDAX D CMP M JNZ NBOP INX D JMP GETB1 ; NBOP: INX D LDAX D CPI 4 STC TINE ; UNSTK2: MOV M,E INX H MOV M,D MVI A,-1 ORA A ;CLEAR ZERO AND CARRY FLAGS RET ; UNST2: POP H POP H MVI C,'Z' JMP FLAG UNST1: POP H GETERR: MVI C,'E' JMP FLAG ; GETUOP: LXI D,UNOPR MVI C,(UNADR-BINADR) SHR 1 JMPETNB GETSYM: CPI '$' JZ GETSYX CPI '@' JM GETSXX CPI 'Z'+1 JP GETSXX GETSYX: LXI H,SYMBOL MOV M,A MVI B,' ' MVI C,LABSIZ MVI L,SYMBOL+1 CALL BLKSET MVI C,SYMBOL GETLOP: MOV A,C CPI SYMBOL+LABSIZ+1 ACI 0 MOV C,A CALL GETCH GS LHLD PTR ;GET PTR TO BEGINNING LOCATION FOR INSERTION JNZ NOTFX ;JUMP IF NO NEED TO ADJUST PTR LXI B,LABSIZ+4 DAD B ;BUMP PTR AHEAD ONE LABEL NOTFX: MOV B,H ;SAVE IN BC MOV C,L LHLD LSTENT ;GET PTR TO NEXT EMPTY LOCATION XCHG LXI H,LOW MOV C,M ;GET LOW LIMIT INR L MOV B,M STC ;SET BORROW TO GET HIGH-LOW-1 MOV A,E SBB C ;LSB OF HIGH-LOW-1 MOV L,A ;SAVE RESULT IN L MOV A,D SBB B ;MSB OF HIGH-LOW-1 JC NOTFND ORA L ;.OR. LSB WITH MSB JZ NOTFND MOV A,C AAR CALL GETCH CPI '0' JC GETNM4 CPI '9'+1 JC GETNM2 ;GO CHECK NEXT CHAR CPI 'A' JC GETNM4 CPI 'F'+1 JC GETNM2 ;DO MORE IF POSSIBLE HEX DIGIT CPI 'Z'+1 JNC GETNM4 MOV C,A GETNM4: STA SAVCAR MOV A,C CPI 'Q' ;OCTAL? MVI B,8 CHNGH: LXI D,LOW XRA A BIN$: STA SAV$OR ;SAVE VALUE OF CARRY FOR LATER USE MVI C,2 LXI H,PLACE CALL BLKTFR JMP BINSRH LFOUND: LDA REFFLG ORA A CNZ SAVREF ;CALL REFERENCE TABLE ROUTINE LFND: LHLD PTR ;GET POINTER TO SYMBOL IN TABLE I 10 JZ BADNUM NUMERR: MVI C,'E' CALL FLAG BADNUM: POP H ;FORCE RETURN BACK 2 LEVELS MOV C,A LDA SAVCAR ORA A JZ GETCH ;CALL GETCH IF WE HAD A SUFFIX MOV A,C RET BMABE: CPI 11 JNZ NUMERR MOV A,B CPI 2 JZ BADNUM JMP NUMERR CPI '$' JZ GETDLR CPI ':' JZ CLNDEL CPI '0' JM GETERM CPI '9'+1 JM GETDLR CPI '@' JM GETERM CPI 'Z'+1 JP GETERM GETDLR: MOV L,C MOV M,A JMP GETLOP CLNDEL: MVI A,' ' GETERM: MVI L,SYMBOL+LABSIZ MOV M,A RET GETSXX: LXI H,SYC,A MOV A,B ORA A ;CLEAR CARRY RAR MOV D,A ;SAVE (LOW+HIGH)/2 (MSB) IN D MOV M,A ;ALSO IN PLACE+1 DCR L MVI A,0 ;CLEAR A WITHOUT CLEARING CARRY RAR ;SHIFT CARRY INTO MS BIT ORA E ;.OR. IN LS BYTE MOV M,A ;SAVE IN PLACE MOV H,B DD E MOV C,A ;SAVE HIGH+LOW (LSB) MOV A,B ADC D MOV B,A ;SAVE HIGH+LOW (MSB) MVI L,PLACE+1 ;HL -> AREA WHERE (LOW+HIGH)/2 IS SAVED MOV A,C RAR ;(LOW+HIGH)/2 (LSB) MOV E,A ;SAVE IN E RLC ;C GETS LOW+HIGH WITH LS BIT MASKED OFF MOV JZ SETRAD CPI 'O' ;OCTAL? JZ SETRAD CPI 'H' ;HEX? MVI B,16 JZ SETRAD CPI 'B' ;BINARY? MVI B,2 JZ SETRAD CPI 'D' ;DECIMAL? MVI B,10 JZ SETRAD LXI H,IBASE MOV B,M ;USE DEFAULT BASE JMP GETNM5 SETRAD: XRA A STA SAVCAR G INX H MOV A,M LXI B,LABSIZ DAD B ;CALC PTR TO LABEL VALUE MOV E,M INX H MOV D,M ANI 200Q RET NOENT: LXI D,PRELAB-LDICT2 JMP NTFND5 ;GO ENTER NEW SYMBOL IN TABLE NOTFND: LDA SAV$OR ;GET CARRY VALUE FROM COMPARE ORA A ;SET FLA; ; LOOKUP: LXI H,SYMBOL LXI D,LDICT2 ;HL -> '$ ' MVI C,LABSIZ CALL CMPSTR JZ LFND LHLD DICSIZ MOV A,L ORA H JZ NOENT INX H SHLD HIGH LXI H,0 SHLD LOW BINSRH: LXI H,HIGH MOV E,M ;GET HIGH LIMIT INR L MOV D,M MVI LMBOL+LABSIZ MOV M,A MVI B,' ' MVI C,LABSIZ MVI L,SYMBOL CALL BLKSET MOV A,M RET ; GETNUM: MOV B,A LDA IPOINT DCR A ;LEAVE INBUF PTR -> 1ST DIGIT STA IPNTSV LXI D,0 ;INITIALIZE VALUE MOV A,B GETNM2: MOV C,A ;SAVE PREVIOUS CH MOV L,C DAD H DAD H ;CALC 4*(LOW+HIGH) DAD B ;CALC 5*(LOW+HIGH) LXI D,LDICT2 DAD D ;CALC ADDR IN TABLE XCHG LXI H,SYMBOL MVI C,LABSIZ ;BYTE CNT CALL CMPSTR JZ LFOUND JC CHNGH LXI D,HIGH MVI A,1 ;CARRY FLAG VALUE JMP BIN$ MOV A,D ACI 0 MOV D,A JMP GETNM6 ; GETNM: CALL GETCH CPI '0' JC BADNUM CPI '9'+1 JC GODNUM CPI 'A' JC BADNUM CPI 'F'+1 JNC BADNUM SUI 7 GODNUM: SUI '0' LXI H,RADIX MOV B,M CMP B RC CPI 13 JNZ BMABE MOV A,B CPETNM5: LXI H,RADIX MOV M,B LDA IPNTSV STA IPOINT ;RESTORE INPUT BUF PTR GETNM6: CALL GETNM ;GET NEXT DIGIT PUSH PSW ;TEMPORARY SAVE OF DIGIT VALUE LHLD RADIX MOV B,H MOV C,L CALL MULT POP PSW ;PICK UP DIGIT VALUE ADD E MOV E,A ,LABSIZ+4 DAD D ;ALSO INCR LSTENT FOR NEXT TIME AROUND SHLD LSTENT LXI H,DICTE ;GET READY FOR COMPARE (LS BYTE STORED FIRST)^ MOV A,M ;GET LAST AVAILABLE LOCATION CMP E JNZ NTFND2 ;JMP IF ROOM STILL LEFT IN TABLE INX H MOV A,M CMP D Q JZ READ1 CPI 201Q JNZ READ99 RED2: CALL READCH JC RED2 CALL BSP ORI 200Q RLC RET READ1: CALL READCH MOV D,A MOV M,A INX H CALL READCH JNC READ99 MOV E,A MOV M,A INX H MVI B,4 READ2: CALL READCH JNC READ3 MOV M,A RFOVF: DB 'CROSS-REFERENCE OVERFLOW',15Q XRFOF: DS 0 ; UDLMSG: DB 'UNDEFINED LABELS WERE:' UDLMSE: DS 0 ; URLMSG: DB 'LABELS NOT USED WERE:' URLMSE: DB 0 FILERR: DB 11Q,0,13Q,11,'** FILE NOT FOUND **',15Q ; ; IF NOT DISK ;ASSEMBLE IF TAPE VLXI H,SYMBOL MVI C,LABSIZ CALL BLKTFR XCHG XRA A MOV M,A ;SET VALUE TO ZERO INX H MOV M,A INX H MVI M,1 ;SET REF COUNT TO 1 INX H MOV M,A DCX H ;HL MUST BE RETURNED -> VALUE FIELD DCX H RET LFULL: XRA A STC ;SET CARRY D,11 CALL DELAY MVI A,6 OUT COUT REW2: IN STATIN ANI 2 JZ REW2 MVI D,34 CALL DELAY MVI A,10Q OUT COUT RET READR: MVI A,DEK1 JMP READ READF: MVI A,DEK2 READ: OUT ADRS MVI A,10Q OUT COUT MVI D,6 MVI E,51 IN STATIN ANI 2 H MOV M,B MOV A,D RLC MVI A,100Q JC STOLNR XRA A STOLNR: LXI H,LINCNT MOV E,M ;GET LS BYTE OF LINE NUM INR L ORA M MVI L,DEFFLG ORA M ;.OR. IN DEFINING REF BIT MVI M,0 ;RESET DEFFLG POP H MOV M,A DCX H MOV M,E RET ; JZ LFULL ;JMP IF TABLE FULL NTFND2: MOV A,C SUB E ;CALC # BYTES TO BE MOVED FOR INSERTION MOV C,A ;(TWO'S COMPLEMENT OF # OF BYTES) MOV A,B SBB D MOV B,A ;SAVE # BYTES IN BC ORA C ;.OR. IN LS BYTE JZ NTFND5 ;JMP IF TABLE NEEDS NO ADJU RZ IN STATIN RLC JNC CH1 IN DATIN RET DELAY: DCR E JNZ DELAY DCR D JNZ DELAY RET REDWAT: IN DATIN RDW: IN STATIN RLC JNC RDW RET RECWAT: CALL READCH JC RECWAT IN DATIN RET BSP: MVI A,10Q OUT COUT PUSH D MVI E,ERSION ******************* ; * TFRMSG: DB 11Q,0,13Q,11,'** FAILURE ON DECK 1 **',15Q TFFMSG: DB 11Q,0,13Q,11,'** FAILURE ON DECK 2 **',15Q ; READCH: XRA A MVI C,170 CH1: DCR C E/ STA DFULLF RET ; ; SUBROUTINE CMPSTR ; COMPARES BLOCK POINTED TO BY HL WITH BLOCK POINTED TO BY DE. ; C CONTAINS T+ BYTE CNT. RETURNS WITH CARRY FLAG INDICATING ; BORROWS. ; CMPSTR: XCHG DCX H SHLD PTR INX H XCHG CMPR1: MO MVI A,1 OUT COUT JZ NOLEAD ;JUMP IF NOT ON CLEAR LEADER MVI D,120 RD1: IN STATIN ANI 2 JNZ RD1 NOLEAD: CALL DELAY IN DATIN RED1: IN STATIN RLC JNC RED1 CALL READCH MOV B,A CALL READCH XRI 377Q CMP B JNZ READ99 CPI 303 PHEAD: DB 'PAGE ' PAGNR: DB '0 ASM 3.0' DB ' ' HEDING: DS 81 ; NULINE: DB 15Q FORMFD: DB 14Q,15Q ; LCMSG: DB ' ' LCOUNT: DB '0 LABELS LEFT',15Q LCMSGE: DS 0 ; DFMSG: DB 'DICTIONARY OVERFLOW',15Q DFMSGE: DS 0 ; XSTING LXI H,LABSIZ+4 DAD D ;CALC HL POINTER FOR TRANSFER BAKTFR: LDAX D MOV M,A DCX D DCX H INR C JNZ BAKTFR INR B JNZ BAKTFR INX D ;SET PTR TO INSERTION LOCATION NTFND5: LHLD DICSIZ INX H ;INCREMENT TABLE SIZE SHLD DICSIZ 34 MVI D,11 CALL DELAY MVI A,2 OUT COUT CALL REDWAT CALL RECWAT MVI E,34 MVI D,11 CALL DELAY MVI A,10Q OUT COUT MVI D,34 MVI E,0 CALL DELAY POP D RET REWIND: MVI A,10Q OUT COUT IN STATIN ANI 2 RNZ MVI E,34 MVIA REFOVF ;GET REFERENCE TABLE OVERFLOW FLAG ORA A RNZ ;RET IF OVERFLOWED LHLD PTR LXI B,LABSIZ+4 DAD B ;BUMP HL TO MSB OF REF TAB PTR MOV D,M MOV A,D ANI 177Q MOV M,A MOV B,A DCX H MOV C,M PUSH B DCX B DCX B MOV M,C INX A,M ANI 7FH MOV B,A LDAX D ANI 7FH SUB B RNZ INX D INX H DCR C JNZ CMPR1 RET ACREFS: LHLD PTR LXI B,LABSIZ+3 DAD B INR M RNZ INX H INR M RET ; SAVREF: LDA RCOUNT CPI 2 RNC LDA PASS ORA A JZ ACREFS LD XRA D MOV D,A MOV A,M XRA E RRC MOV E,A INR L JNZ RED20 INR H RED20: INR B JMP READ2 READ3: MOV A,D ORA E JNZ READ99 PUSH D MVI E,34 MVI D,11 CALL DELAY POP D MVI A,10Q OUT COUT RET READ99: CALL RECWAT CALL BSP 303Q JZ BWAIT1 CPI 347Q JZ BWAIT1 CPI 201Q JNZ BSTP MOV A,L CMA CMP H JNZ BSTP CMP B JM ARGH JNZ BWAIT1 BW5: SUI 1 JNZ BW5 JMP SRCH3 BSTP: MVI A,1 OUT COUT CALL REDWAT CALL RECWAT XRA A BW1: SUI 1 JNZ BW1 MVI A,10************************* ; MVI L,PTRADR MOV M,B ; REQPRT: LXI H,PRTREQ CALL PROMPT CPI 'N' JZ REQDSP CPI 'Y' JNZ REQPRT ; MVI B,LOCPRT LXI H,PTRADR MOV M,B ; REQDSP: LXI H,DSPREQ CALL DSPLY$ LXI H,HEDING MVI C,5 CALL DELAY REWND2: MVI A,DEK2 OUT ADRS CALL REWIND MVI A,1 OUT COUT RW11: IN STATIN ANI 2 JNZ RW11 MVI D,102 CALL DELAY CALL REDWAT CALL RECWAT MVI D,7 MVI E,170 CALL DELAY MVI A,10Q OUT COUT RET ; * ENDIF ;************ D,A CALL READCH CMA CMP D JNZ FSTP1 CPI 303Q JZ FWAIT1 CPI 347Q JZ FWAIT1 CPI 201Q JNZ FSTP1 CALL READCH MOV D,A CALL READCH CMA CMP D JNZ FSTP1 CALL READCH JNC WCHWAY FSTP1: CALL BSP JMP SRCH3 WCHWAY: MOV A,D CMP: LXI H,CRFREQ CALL PROMPT CPI 'N' LXI H,REFFLG MVI M,0 JZ REQTAB CPI 'Y' JNZ REQXRF MVI M,1 REQTAB: LXI H,TABREQ CALL PROMPT CPI 'N' MVI B,0 ;NO DICTIONARY, NO PRINT VALUE JZ REQTB CPI 'Y' JNZ REQTAB MVI B,1 ;YES, DICTIO MVI A,200Q ADD A RET WRITER: MVI A,DEK1 JMP WRITE WRITEF: MVI A,DEK2 WRITE: OUT ADRS MVI D,26 MVI E,0 IN STATIN ANI 2 JZ WR1 MVI D,255 WR1: MVI A,50Q OUT COUT MVI A,41Q OUT COUT WR69: IN STATIN ANI 2 JNZ WR69 CALL DELAY DET: LXI H,LF CALL DSPLY$ ; IF NOT DISK ;ASSEMBLE IF TAPE VERSION ******************* MVI A,DEK2 ; * OUT ADRS CALL REWIND MVI A,1 OUT COUT ENDX1: IN STATIN ANI 2 JNZ ENDX1 MVI D,102 CALL DELAY CALL REDWAT CALL RECWAT MVI D,2KEYIN$ LXI H,HEDING MOV A,M CPI 'Y' MVI B,1 JZ SDSWTC CPI 'N' MVI B,0 JNZ REQDSP SDSWTC: LXI H,DSWTCH MOV M,B LXI H,PTRADR MOV A,M ORA A JZ ENDDET HEADRQ: LXI H,HEDREQ CALL DSPLY$ LXI H,HEDING MVI C,79 CALL KEYIN$ END******************************** ; ; START OF LABEL TABLE ; LDICT2: DB 200Q+'$',' ' CURLC2: DW IMPSA DW 0 DB 80H+'C','8'+80H,'008 ' DS LABSIZ-6 DW 0,0 DB 80H+'C','8'+80H,'080 ' DS LABSIZ-6 DW -1,0 PRELAB: ; ; INITIALIZE PROCESS B JM FWAIT1 JZ GOTIT SRCH2: MVI A,2 OUT COUT BWAIT1: IN DATIN BW2: IN STATIN RLC JC BW4 ANI 4 JNZ BW2 ARGH: HLT BW4: IN DATIN BRED: MOV L,H MOV H,E MOV E,D MOV D,A CALL READCH JC BRED MOV A,E CMA CMP D JNZ BSTP CPI NARY REQTB: LXI H,TABFLG MOV M,B ; IF DISK ;ASSEMBLE IF DISK VERSION ******************* LDA PRNFCB ;GET PRINT FILE DRIVE # * CPI 'X'-'A'+1 JZ DICTCL ;BRIF DISPLAY MODE REQUESTED JMP HEADRQ ;GO GET HEADING * ENDIF ;******************* MVI A,61Q OUT COUT JMP WR3 WRITEW: IN STATIN RRC JNC WRITEW WR3: MOV A,M OUT DATOUT INR L JNZ WR5 INR H WR5: DCR B JNZ WRITEW MVI A,41Q OUT COUT MVI D,34 MVI E,0 CALL DELAY MVI A,40Q OUT COUT MVI D,34 MVI E,0 JMP MVI E,68 CALL DELAY MVI A,10Q OUT COUT MVI A,DEK1 OUT ADRS MVI B,40Q CALL REWIND SRCH3: MVI A,1 OUT COUT SRCH5: IN STATIN ANI 2 JNZ SRCH5 MVI D,102 CALL DELAY CALL REDWAT FWAIT1: CALL RECWAT CALL REDWAT CALL READCH MOVDISK ;ASSEMBLE IF DISK VERSION ******************* CALL INITDISK ;SETUP DISK I/O * LDA PRNFCB ;GET PRINT FILE DRIVE # CPI 'Z'-'A'+1 JZ DICTCL ;BRIF PRINT FILE NOT REQUESTED * ENDIF ;******************************************** ; REQXRFING ; PROMPT: CALL DSPLY$ LXI H,HEDING MVI C,7 CALL KEYIN$ LXI H,HEDING MOV A,M RET START: IF DISK LHLD 6 ;MEMORY LIMIT FROM CP/M DCX H SHLD REFEND ENDIF LXI SP,STACK XRA A STA LFCNT LXI H,ASMMSG CALL DSPLY$ ; IF Q OUT COUT JMP SRCH2 GOTIT: MVI A,10Q OUT COUT ; * ENDIF ;******************************************** JMP DICTCL ; ; IF DISK ;ASSEMBLE IF DISK VERSION ******************* INITDISK: ; * LXI H,TFCB+1 LXI D,ASMFCB+1 MVI C,8 CALLES AND CONTROL REMOTE COMPUTERS VIA MODEM 6.9 3K PONG.ASM VDM PONG GAME. THIS FILE IS FAULTY AND WILL BE RE-RELEASED ASAP 6.10 1K PREFMT.BAS MAILLIST MODULE 6.11 3K PURGE.ASM DISKETTE DIRECTORY PURGE 6.12 1K QUICKIE.BAS MAILLIST MODULE A,8 CALL WRITEC MVI A,' ' CALL WRITEC MVI A,8 CALL WRITEC DCX H RET ; KEYEND: CALL WRITEC MVI A,10 CALL WRITEC XRA A STA CURPOS RET ; ASMMSG: DB 11Q,0,13Q,11,23Q,23Q,'8080 ASSEMBLER 3.0',15Q TABREQ: DB 11Q,0,13Q,11,23Q,'DIC ;CHECK FOR LIST OPTION JNZ INITD2 ;BRIF NOT LIST LXI H,DSWTCH MVI M,1 ;TURN ON DISPLAY JMP INITD4 INITD2: CPI 'Z' ;CHECK FOR LIST AND PRINT INHIBITED JZ INITD4 ;BRIF NOT PRINT MODE LXI H,PTRADR MVI M,LOCPRT ;TURN ON PRINTER INITD4: S MAILLIST.DOC DOCUMENTAION ON CACHE MAILLIST PROGRAMS RANDY.DOC COMMENTS ON XREFASM.ASM 6.1 6K BLOAD.ASM TARBELL TAPE MITS 3.1 BASIC CSAVE TO ASCII 6.2 34K CCOS1.ASM CACHE CASETTE OPERATING SYSTEM 6.3 2K CKSUM.ASM CHECKSUMS CP/M FILES 6.4 B ENDIF ANI 177Q CPI 10Q JZ KEYBSP CPI CANKEY JZ KEYDEL IF NOT DISK CPI 'A' JC KEYSTR CPI 'Z'+1 JC KEYINV ENDIF CPI 'a' JC KEYSTR CPI 'z'+1 JNC KEYSTR KEYINV: XRI 40Q KEYSTR: MOV M,A CPI 15Q JZ KEYEND MOV A,D CPI BLKTFR ;TRANSFER FILE NAME LXI H,TFCB+1 LXI D,HEXFCB+1 MVI C,8 CALL BLKTFR LXI H,TFCB+1 LXI D,PRNFCB+1 MVI C,8 CALL BLKTFR LXI H,TFCB+9 MOV A,M ;GET SOURCE FILE DRIVE # CPI ' ' JZ INITD6 ;BRIF DEFAULT VALUE SUI 'A'-1 ;CALC D5Q END START SPREQ: DB 11Q,0,13Q,11,23Q,'DISPLAY THE OUTPUT? ',3 HEDREQ: DB 11Q,0,13Q,11,23Q,'ENTER THE HEADING:',15Q LF: DB 11Q,0,13Q,11,1TIONARY LISTING? ',3 CRFREQ: DB 11Q,0,13Q,11,23Q,'CROSS-REF LISTING? ',3 PRTREQ: DB 11Q,0,13Q,11,23Q,'PRINT THE OUTPUT? ',3 DSPREQ: DB 11Q,0,13Q,11,23Q,'DISPLAY THE OUTPUT? ',3 HEDREQ: DB 11Q,0,13Q,11,23Q,'ENTER THE HEADING:',15Q LF: DB 11Q,0,13Q,11,1UI 'A'-1 STA PRNFCB ;STORE PRINT DRIVE # INITD6: LXI H,ASMPKT CALL OPEN ;TRY TO OPEN SOURCE FILE CPI 255 JZ OPENER ;BRIF FILE NOT FOUND LXI H,HEXPKT LDA HEXFCB ;GET HEX DRIVE # CPI 'Z'-'A'+1 CNZ MAKE ;CREATE HEX FILE, IF REQUESTED 5K COMPARE.ASM COMPARES TWO CP/M FILES 6.5 15K CUTTER.ASM SEEMS TO BE VDM TO CASETTE PROGRAM, BUT DOCUMENTATION STILL AWAITED 6.6 3K IDUMP.ASM INTERPRETED FILE DUMP 6.7 9K MAINT.BAS MAILLIST MODULE 6.8 13K MODEM.ASM PROGRAM TO SEND AND RECEIVE FIL80 JNC KEYINL DCR B JZ KEYINL IF NOT DISK MOV A,M CALL WRITEC ENDIF INR D INX H JMP KEYINL ; KEYBSP: CALL KEYBSR JMP KEYINL ; KEYDEL: CALL KEYBSR JNZ KEYDEL JMP KEYINL ; KEYBSR: MOV A,B CMP C RZ INR B DCR D MVI RIVE # STA ASMFCB ;STORE DRIVE # INX H MOV A,M ;GET HEX FILE DRIVE # CPI ' ' JZ INITD6 ;BRIF DEFAULT VALUE SUI 'A'-1 STA HEXFCB ;STORE DRIVE # INX H MOV A,M ;GET PRINT FILE DRIVE # CPI ' ' JZ INITD6 ;BRIF DEFAULT VALUE CPI 'X'VOLUME 6 CHICAGO AREA COMPUTER HOBBIEST EXCHANGE SOFTWARE NUMBER SIZE NAME COMMENTS CATALOG.6 CONTENTS OF CP/M VOLUME 6 EDVDM.DOC ED.COM PATCH TO CHANGE LINES OF P COOMAND. SEE EXPLAIN.DOC EXPLAIN.DOC COMMENTS ON CERTAIN PROGRAMS **************************************** ; ; KEYIN$ MOV B,C KEYINL: IF NOT DISK IN 17 ;GET KEYBOARD STATUS ANI 2 JZ KEYINL IN 16 ;GET THE CHARACTER ENDIF IF DISK PUSH B PUSH D PUSH H MVI C,1 CALL BDOS POP H POP D POP LXI H,PRNPKT LDA PRNFCB ;GET PRINT DRIVE # CPI 'X'-'A'+1 RZ ;RETIF LIST MODE CPI 'Z'-'A'+1 CNZ MAKE ;CREATE PRINT FILE, IF REQUESTED RET OPENER: LXI H,FILERR CALL DSPLY$ ;FILE NOT FOUND JMP BOOT ;RE-BOOT THE SYSTEM * ENDIF ;****6.13 8K REPORT.BAS MAILLIST MODULE 6.14 6K SIZE.ASM GIVES SIZE OF CP/M FILE 6.15 5K SLOAD.ASM LOADER MODULE OF CCOS1 6.16 7K SORT.ASM MAILLIST MODULE 6.17 4K TISQ.ASM TIMES SQUARE (NEWSCASTER) LETTERS TO VDM 6.18 5K TLOAD.ASM TARBELL LOADER FOR TE BRIEFLY: MODEM S XXXXX.YYY SEND A FILE MODEM R XXXXX.YYY RECEIVE A FILE MODEM T OPERATE AS A TERMINAL MODEM C OPERATE AS A COMPUTER (WITHIN THE CONTEXT OF THIS PROGRAM, A 'TERMINAL' IS A 'DUMB' DEVICE WHICH TAKES CHARACTERS FROM TH CACHE, THE CHICAGO AREA COMPUTER HOBBYISTS EXCHANGE. CCOS - CACHE CASSETTE OPERATING SYSTEM CKSUM.ASM - CHECKSUMS ANY CP/M FILE PRINTING A CHECKSUM BYTE FOR EACH 256 BYTES. SOMEWHAT OBSOLETED BY COMPARE.ASM FOR COMPARING 2 FILES, BUT USEFUL WHееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееXAMPLE). IDUMP.ASM - INTERPRETED FILE DUMP. FORMAT: IDUMP XXXXX.YYY MAILLIST.DOC - DOCUMENTATION ON COMPUTER CLUB MAILING LIST PROGRAMS: MAINT.BAS REPORT.BAS PREFMT.BAS SORT.ASM MAINT.BAS - SEE MAILLIST.DOC FILE FOR DETAILS MODEM.ееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееSAVED FILES 6.19 2K TMAP.ASM MAP OF TAPE WITH TSAVED FILES 6.20 5K TSAVE.ASM CP/M FILE TO TARBELL TAPE WITH CHECKSUM 6.21 58K XREFASM.ASM CP/M COMPATIBLE ASSEMBLER PRODUCES XREF TABLES. (CP/M ASSEMBLER WILL NOT ASSMBLE THIS WITHOUT EXTEN BYTE OF DIFFERENCE IS FOUND. STOPS AT FIRST UNEQUAL COMPARE. NOTE THAT WHEN PIPPING A COM FILE, PIP PUTS A 1AH AT THE LAST BYTE OF THE FILE, THEREFORE COMPARE WILL FIND THIS DIFFERENCE AS BYTE DISPLACEMENT 80H IN THE LAST SECTOR. FORMAT: COMPEN 2 DIFFERENT PEOPLE WONDER IF THEY HAVE THE SAME VERSION OF A FILE - THEY BOTH RUN CKSUM AGAINST THEIR COPIES, THEN COMPARE RESULTS. FORMAT: CKSUM XXXXXX.YYY COMPARE.ASM - COMPARES 2 CP/M FILES. PRINTS SECTOR AND BYTE DISPLACEMENT WHERE FIRSTFROM WARD CHRISTENSEN: HERE IS HOW TO MODIFY THE CPM ED.COM PAGE (P) COMMAND FOR OTHER THAN 24 LINE DISPLAYS. FOR EXAMPLE, IF YOU HAVE A VDM, YOU WOULD LIKE 15 LINES, NOT 23, TO BE SHOWN. DDT ED.COM DDT VERSION 1.3 NEXT PC 1500 0100 -LC95 CASM - PROGRAM TO SEND AND RECEIVE PROGRAMS VIA MODEMS. USES FULL HANDSHAKING AND CHECKSUMING, 10 ERROR RETRIES, ETC. ALSO INCLUDES CODE FOR SIMPLE KEYBOARD TO KEYBOARD COMMUNICATIONS. SEE COMMENTS IN MODEM.ASM FOR OPERATING DETAILS. HERE THEY ARBRIEF DOCUMENTATION OF FILES ON THIS DISK BLOAD.ASM - READS A TARBELL TAPE OF MITS 8K 3.1 BASIC PROGRAMS AND TURNS IT INTO A SOURCE FILE. FORMAT: BLOAD XXXXXXXXX.YYY (SUPPLY YOUR OWN NAME) CCOS1.ASM - TARBELL/VDM CASSETTE OPERATING SYSTEM FROM SIVE MODS TO RE-LABEL WHERE RESERVED WORDS WERE USED, AND VERY LARGE NUMBER OF 8-BIT IMMEDIATE OPERATIONS WITH 16 BIT EXPRESSIONS.) ARE XXXXX.YYY AAAAA.BBB FULL DISK SPECIFICATIONS ALLOWED, SUCH AS: COMPARE A:TEST.ASM B:TEST.ASM CUTTER.ASM - SEE RANDY.DOC FOR DETAILS EDVDM.DOC - SHOW HOW TO MODIFY THE ED COMMAND P SUBCOMMAND TO DISPLAY 15 LINES, NOT 23 (FOR A VDM, FOR Eееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееее96 0C95 MVI M,17 0C97 -AC95 0C95 MVI M,F 0C97 -^C A>SAVE 20 EDP.COM THAT'S ALL THERE IS TO IT. IF YOU HAVE A VDM, YOU WOULD LIKE 15 LINES, NOT 23, TO BE SHOWN. DDT ED.COM DDT VERSION 1.3 NEXT PC 1500 0100 -LC95 CE KEYBOARD, AND SENDS THEM DOWN THE LINE, AND WHEN IT RECIEVES A CHARACTER FROM THE LINE, OUTPUTS IT TO THE DISPLAY (OR TTY OR WHATEVER YOU HAVE). A COMPUTER IS A SMARTER DEVICE IN THAT IT ECHOS EVERY CHARACTER IT RECEIVES. IN SENDING, IT JUSTways have to be read. Also, random writing would have to read modify, and write sectors because of the sector overlap. For speed of access during maintenance, the file is written using a randomizing or hashing technique on the person's name. T THESE PROGRAMS ARE BEING PROVIDED THROUGH THE COURTESY OF THE AUTHOR FOR THE SOLE USE OF HOBBYIST COMPUTER CLUBS IN MAINTAINING THEIR MAILING LISTS. ------------------------------------------------------ The needs of a computer club in maintaining OF AS A SKELETAL PROGRAM WHICH YOU ALWAYS EDIT AND CHANGE BEFORE USING. RANDY.DOC - DOCUMENTATION ON XREFASM, CCOS, ETC. REPORT.BAS - SEE 'MAILLIST.DOC' FOR DETAILS SIZE.ASM - PRINTS SIZE OF A CP/M FILE IN 'K' BY BOB VAN VALZAH SLOAD.ASM----------------------------------- As currently implemented, the file consists of 512, 128 byte (1 sector) records. It was originally thought that 1 sector records would be required because of the sort program written in assembler. However, the sortееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееее READS THE KEYBOARD AND SENDS WHAT IT READ). FOR TWO PEOPLE TO TALK TO EACH OTHER, ONE MUST TYPE MODEM C - THE OTHER MUST TYPE MODEM T PONG.ASM - VDM PONG GAME, KEYBOARD AGAINST COMPUTER. BY BOB VAN VALZAH PURGE.ASM - PURGE INVALID DIRECTORYe file (by last name, zip, etc.) for report purposes. 4) A program to print: Alphabetic master listings Mailing labels (usually in Zip sequence) Name tags for meeting use. The programs on this disk fulfill these a mailing list consist of the following requirements: 1) A file of names with sufficient information about each member. 2) A maintenance program to add, change, and delete records. 3) A sort program to change the order of th - WHEN YOU SAVE A PROGRAM USING CCOS, SLOAD IS USED TO LOAD IT AS AN ASM FILE UNDER CP/M FORMAT: SLOAD XXXXXX.ASM SORT.ASM - SEE 'MAILLIST.DOC' FOR DETAILS TISQ.ASM - TIMES SQUARE DEMO (BIG CHARS) FOR THE VDM. BY BOB VAN VALZAH TLOAD.ASM - program was eventually written to be independent of file length. Note that 128 is still a very good value, because of the efficiency of BASIC/E only having to read 1 sector per record. If the record length was say, 150 bytes, then 2 sectors would alFILENAME: MAILLIST.DOC, 09/17/77 by Ward Christensen ------------------------------------------------------------ DOCUMENTATION FILE FOR THE COMPUTER CLUB MAILING LIST PROGRAMS WRITTEN IN BASIC-E. ------------------------------------------------------- ENTRIES AUTOMATICALLY. SUGGEST CAREFUL USE AND TESTING ON SCRATCH DISK. QUICKIE.BAS - USED WITH MAILING LIST SYSTEM WHEN YOU NEED A 'QUICKIE' PROGRAM TO READ THE FILE, LOOK AT AND/OR CHANGE SOMETHING, AND WRITE THE RECORDS BACK. MAY BE THOUGHTneeds. 1) PREFMT.BAS preformats the required size file 2) MAINT.BAS maintains the mailing list 3) SORT.ASM sorts the file, producing an index file 4) REPORT.BAS prints listings labels and name tags. -------------------------UM. FORMAT: TSAVE XXXXXX.YYY OR TSAVE XXXXXX.YYY ? TO READ/VERIFY AFTER SAVING. XREFASM.ASM - CROSS REFERENCE ASSEMBLER. SEE RANDY.DOC FOR DETAILS.