* **************************************** * * OUTPUT HEADER AT TOP OF PAGE * PGHEAD LXI H,PCNT GET PAGE COUNT MOV A,M INR M BUMP PAGE COUNT CALL DECOT CONVERT TO ASCII DECIMAL STA PGMES+7 SAVE IT XCHG . SHLD PGMES+5 * CALL PHCLR CLEAR HEADER BUFFER LXI D,FNMSG COPY "FILE:" TO OUTPUT BUFFER CALL PHL AT LEFT MARGIN LHLD NAMPTR FOLLOW WITH THE FILE NAME LXI D,-9 DAD D XCHG . CALL PHL2 LXI D,TITLBUF COPY TITLE INTO OUTPUT BUFFER CALL PHC AT CENTER OF LINE INX D PUSH D SAVE POINTER TO 2ND TITLE LINE LXI D,PGMES COPY PAGE NUMBER INTO OUTPUT BUFFER CALL PHR AT RIGHT MARGIN LXI D,HBUF PRINT OUT OUTPUT BUFFER MOV A,C GET FILE NUMBER CALL LINEOUT * CALL PHCLR CLEAR OUTPUT BUFFER LXI D,DNMSG COPY "DISK:" TO OUTPUT BUFFER CALL PHL AT LEFT MARGIN LHLD NAMPTR FOLLOW BY THE DISK NAME LXI D,-18 DAD D XCHG . CALL PHL2 POP D GET POINTER TO 2ND TITLE LINE CALL PHC AT CENTER OF LINE LXI D,DATE COPY DATE INTO OUTPUT BUFFER CALL PHR AT RIGHT MARGIN LXI D,HBUF PRINT OUT OUTPUT BUFFER MOV A,C GET FILE NUMBER CALL LINEOUT LXI D,CRLF FOLLOW WITH BLANK LINE MOV A,C CALL LINEOUT * LDA PGCNT BUMP LINE COUNT ADI 3 STA PGCNT RET . * * PHCLR LXI D,HBUF+134 CLEAR OUTPUT BUFFER MVI B,134 MVI A,' ' JMP ZBU1 * PHL LXI H,HBUF COPY TO LEFT MARGIN OF OUTPUT BUFFER JMP MOVE * PHL2 LXI H,HBUF+7 COPY TO COLUMN 8 OF OUTPUT BUFFER JMP MOVE * PHC LXI H,HBUF+31 COPY TO CENTER OF OUTPUT BUFFER LDA TERMW CENTER DEPENDS ON WIDTH OF TERMINAL CPI 2 JC PHC1 LXI H,HBUF+40 JZ PHC1 LXI H,HBUF+66 PHC1 PUSH D COUNT NUMBER OF CHARACTERS PHC2 LDAX D ORA A JZ PHC3 INX D LDAX D ORA A JZ PHC3 INX D DCX H JMP PHC2 PHC3 POP D JMP MOVE * PHR LXI H,HBUF+62 COPY TO RIGHT MARGIN OF OUTPUT BUFFER LDA TERMW CPI 2 JC PHR1 LXI H,HBUF+70 JZ PHR1 LXI H,HBUF+122 PHR1 CALL MOVE LXI D,CRLF FOLLOW WITH CRLF CALL MOVE RET . * MOVE LDAX D MOVE FROM AT DE TO AT HL ORA A UNTILL A ZERO BYTE IS HIT RZ . MOV M,A INX D INX H JMP MOVE * * LINEOUT PUSH B LXI B,255 OUTPUT LINE MVI L,0AH UNTILL LINEFEED CALL SYS DB DWROP CALL ERR0 POP B RET . * * CONVERT 8 BIT NUMBER TO ASCII DECIMAL * NUMBER INPUT IN A, ASCII OUPUT IN E,D,A. * DECOT PUSH B MOV L,A XRA A STA SWCH NO CHRS YET MVI C,100 CALL NCON MOV E,B MVI C,10 CALL NCON MOV D,B MOV A,L ADI '0' POP B RET . * NCON MOV A,L MVI B,'0' NXTCO SUB C JC OUTB INR B ORA A JNZ NXTCO JMP OUTIT OUTB ADD C OUTIT MOV L,A MOV A,B CPI '0' JZ OUTN LDA SWCH INR A STA SWCH OUTN LDA SWCH ORA A RNZ . MVI B,' ' RET . * * SAVNAME LHLD NAMPTR SAVE FILE / DISK NAMES FOR HEADER MVI C,17 FIRST BLANK OUT SAVN0 MVI M,' ' INX H DCR C JNZ SAVN0 MVI M,0 LXI B,-9 DAD B MVI M,0 INX H SAVN1 LDAX D ORA A JZ SAVN2 CPI '/' JZ SAVN3 MOV M,A INX D INX H JMP SAVN1 * SAVN2 LHLD SYSGLO GET DEFAULT UNIT NUMBER LXI D,GLUNI DAD D MOV A,M ADI '0' JMP SAVN4 * SAVN3 INX D GET UNIT NUMBER FROM AFTER NAME LDAX D * SAVN4 STA SGLONAME+9 GET DISK NAME FOR PAGE HEADER LXI D,SGLONAME LXI H,0 CALL SYS OPEN "SYSGLOBL" DB OPEOP CALL ERR0 * LXI B,DNAMP SPACE FORWARD TO DISK NAME MVI D,1 CALL SYS DB SPAOP CALL ERR0 * LXI B,8 READ DISK NAME LHLD NAMPTR INTO SECOND LINE OF LEFT MARGIN XCHG . CALL SYS DB RBLOP CALL ERR0 * CALL SYS CLOSE "SYSGLOBL" DB CLOOP CALL ERR0 LHLD NAMPTR BUMP NAME STACK POINTER LXI D,18 DAD D SHLD NAMPTR RET . * * HEADINIT LHLD SYSGLO GET SYSTEM DATE FOR PAGE HEADER LXI D,GLDAT DAD D XCHG . CALL UNPACK UNPACK DIGITS SHLD DATE CALL UNPACK SHLD DATE+3 CALL UNPACK SHLD DATE+6 RET . * UNPACK LDAX D UNPACK BCD DIGITS ANI 0FH ADI '0' MOV H,A LDAX D RLC . RLC . RLC . RLC . ANI 0FH ADI '0' MOV L,A INX D RET . * **************************************** * * * ARGUMENT SCANNER * GARGS POP H GET RETURN ADDRESS SHLD RETAD SAVE IT * MVI A,PSOP PSCAN-OPEN STA PSTYPE LXI H,INUM CALL GANAM GET CZ ERR1 ERROR--NEED PUSH PSW SAVE DELIMITER LXI D,PSBUF COPY IN-FILE NAME FOR DEFAULT PAGE TITLE CALL SAVNAME SAVE NAME FOR TITLE POP PSW CALL CKDLM CHECK DELIMITER * LXI H,LNUM CALL GANA0 GET CALL CKDLM CHECK DELIMITER * CALL GASTI SET TYPE AND BLKSZ IN CASE OF CREATE LXI H,BNUM CALL GANA0 GET CALL CKDLM CHECK DELIMITER * CALL GASTL SET TYPE AND BLKSZ IN CASE OF CREATE LXI H,ENUM CALL GANA0 GET CALL CKDLM CHECK DELIMITER * LXI H,SNUM CALL GANA0 GET CZ GARG6 IF NONE, CHECK FOR '=' CALL CKDLM CHECK DELIMTIER MVI A,PSONE CALL SCAN LXI H,PSBUF PLACE IN PSBUF IN CASE OF ERROR MOV M,A INX H MVI M,0 CALL MAP MAP FROM LOWER TO UPPER CASE CPI 'S' IF SOMETHING AFTER SFILE, MUST BE "S=" CNZ ERR5 MVI A,PSONE CALL SCAN LXI H,PSBUF PLACE IN PSBUF IN CASE OF ERROR MOV M,A INX H MVI M,0 CPI '=' CZ GAOPS CALL ERR5 ERROR BAD SYNTAX * GARG6 CPI '=' WAS IT '='? RNZ . NO LDA LNUM YES-SET SNUM TO LNUM STA SNUM MVI A,PSONE CALL SCAN GET NEXT INPUT CAHARCTER LXI H,PSBUF PLACE IN PSBUF IN CASE OF ERROR MOV M,A INX H MVI M,0 RET . * * ********** * * GANA0 MVI A,PSCO PSCAN-CREATE AND OPEN STA PSTYPE GANAM PUSH H SAVE FILE NUMBER STORAGE ADDRESS GANA3 LDA PSTYPE GET TYPE OF PSCAN WANTED CALL SCAN PSCAN FOR FILE NAME PUSH PSW SAVE FLAGS CPI '=' CHECK FOR "S=" JNZ GANA1 NO-SKIP AHEAD LDA PSBUF CALL MAP MAP FROM LOWER CASE TO UPPER CASE CPI 'S' IS 'S' FIRST THING IN PSBUF? JZ GANA2 YES-GO GET OPTIONS * GANA1 POP PSW POP H RESTORE FILE NUMBER STORAGE ADDRESS RZ . IF NOTHING INPUTTED, RETURN JMP SAVFN SAVE FILE NUMBER AT ADDRESS IN HL * * * "S=" INPUTTED, GET OPTIONS * GANA2 POP PSW CALL GAOPS JMP GANA3 * * * SCAN LXI D,PSBUF CALL PSCAN PUSH PSW JNZ SCAN1 HIT DELIMITER RIGHT AWAY? STA PSBUF YES-STORE AT PSBUF FOR USE IN ERROR MESSAGES MVI A,0 STA PSBUF+1 FOLLOW WITH ZERO TO MARK END * SCAN1 POP PSW RNC . RETURN IF NO ERROR MOV A,E ORA A CZ ERR5 IF ZERO--ERROR BAD SYNTAX CALL ERROR ELSE, PTDOS ERROR * ********** * * CHECK FILE NUMBER AND STORE AT ADDRESS IN HL * SAVFN PUSH PSW SAVE DELIMITER MOV A,D ORA A CNZ ERR6 ERROR-BAD FILE NUMBER MOV A,E CPI 0FFH CZ ERR7 ERROR-BAD FILE NAME MOV M,A SAVE FILE NUMBER POP PSW RESTORE DELIMITER RET . * ********** * * CHECK DELIMITER (IN ACC) FOR ',' ';' OR CR. IF ',' * RETURN, IF ';' OR CR-PROCESS ARGS THEN JUMP TO RETAD * CKDLM CPI ',' RZ . POP H REMOVE 1ST RETURN ADDRESS CPI ';' JZ GAEND CPI CR JZ GAEND CALL ERR5 ERROR-BAD SYNTAX * ********** * * GET * GAOPS MVI A,'+' STA OPSGN RESET OPTION SIGN TO '+' AS DEFAULT MVI A,PSONE PSCAN-ONE CHARACTER CALL SCAN GET OPTION LXI H,PSBUF PLACE IN PSBUF IN CASE OF ERROR MOV M,A INX H MVI M,0 CPI '+' JZ OPTPL CPI '-' JZ OPTMN CPI ',' DONE WITH OPTIONS? RZ . CPI ';' DONE WITH ALL ARGUMENTS? JZ GAEND CPI CR DONE WITH ALL ARGUMENTS? JZ GAEND CPI '0' JZ OPTZE CPI '1' JZ OPTNM CPI '2' JZ OPTNM CPI '3' JZ OPTNM * GAOP2 CALL MAP MAP FROM LOWER TO UPPER CASE LXI D,GALT-1 GET LOOKUP TABLE POINTER LXI H,GAFT-1 GET FLAG TABLE POINTER MOV B,A SAVE CHARACTER SCANNED * GAOP3 INX D MOVE POINTER INX H MOVE POINTER LDAX D GET TABLE ENTRY CPI 0 END OF TABLE? CZ ERR4 YES-ERROR-ILLEGAL OPTION CMP B IS IT ONE WE WANT? JNZ GAOP3 NO-CONTINUE THROUGH TABLE LDA OPSGN ELSE, FOUND MATCH-SO SAVE OPTION MOV M,A SIGN IN IT'S FLAG TABLE ENTRY JMP GAOPS GO FOR NEXT OPTION * ***** * * OPTMN MVI A,'-' WAS '-', SO SET OPSGN STA OPSGN OPTPL MVI A,PSONE IF WAS '+' OPSGN ALREADY SET CALL SCAN GET OPTION TO BE SET LXI H,PSBUF PLACE IN PSBUF IN CASE OF ERROR MOV M,A INX H MVI M,0 JMP GAOP2 GO FIND AND SET OPTION * * OPTZE XRA A STA LFMT JMP GAOPS * * OPTNM SBI '0' STA TERMW JMP GAOPS * * GASTI MVI A,'.' TYPE I. STA FTYP LXI H,256D BLOCK SIZE = 256D SHLD FBLSZ RET . * * GASTL MVI A,'.'+80H TYPE . STA FTYP LXI H,4C0H BLOCK SIZE = 4C0H SHLD FBLSZ RET . * ***** * MAP LOWER CASE LETTERS TO UPPER CASE * MAP CPI 'a' RC CPI 'z'+1 RNC SUI 'a'-'A' RET . ********** * * * DONE WITH GETTING ARGUMENTS, PROCESS THEM * GAEND LDA AOFLG ORA A CZ CMPAO IF A OPTION WAS NOT SPECIFIED CALC IT LDA LOFLG ORA A CZ CMPLO IF L OPTION WAS NOT SPECIFIED CALC IT * LXI D,0 COMPUTE WHERE TO READ INTO RLINE LDA LOFLG CPI '+' JNZ GAEN1 LXI D,-5 IF THERE ARE LINE #, SUBTRACT 5 * GAEN1 LDA AOFLG CPI '+' JNZ GAEN2 DCX D IF ALS8 FORMAT, SUBTRACT 1 * GAEN2 LXI H,IBUF SUBTRACTIONS ARE FROM IBUF DAD D SHLD RLINE * IF LNUM=ENUM, CHANGE ENUM TO 0FFH LDA LNUM LXI H,ENUM CMP M JNZ GAEN3 IF NOT EQUAL OK-SKIP AHEAD MVI M,0FFH ELSE, SET ENUM TO 0FFH * GAEN3 LDA TERMW GET OUTPUT WIDTH (1,2,OR 3) CPI 3 JNZ GAEN4 IF NOT 3, LEAVE AS DEFAULT (4,12) MVI A,7 ELSE, SET TO WIDER VALUES STA SLNSZ 7 SYMBOLS PER LINE OF SYMTAB OUTPUT MVI A,21 STA XLNSZ 21 ADDRESS PER LINE OF XREF OUTPUT * GAEN4 LDA POFLG PAGNATION WANTED? CPI '+' CZ HEADINIT YES-SET UP PAGE HEADER * LHLD RETAD GET RETURN ADDRESS PCHL . RETURN * * ***** * * * COMPUTE FROM INUM IF ALS8 FORMAT OR NOT * CMPAO CALL CMPRD READ IN FIRST FEW LINES MVI A,'+' STA CMFLG SET FLAG SO CMPLO KNOWS LINES IN MEMORY STA AOFLG ASSUME '+' TILL DISPROVEN LXI H,SYMA1+1-1 POINT TO BYTES READ MVI B,0 * CMPA1 INX H MOV A,M DCR A JZ CMPA1 IGNORE 1'S MOV C,A CMPA2 INX H MOV A,M DCR C JZ CMPA3 CPI CR JZ CMPA4 JMP CMPA2 CMPA3 CPI CR JZ CMPA1 * CMPA4 XCHG . CHECK TO SEE IF PAST END OF READ IN DATA LHLD RDCNT DAD D RC . IF SO, THEN IS ALS8 FORMAT MVI A,'-' ELSE, IS NOT ALS8 FORMAT STA AOFLG RET . * ***** * * * COMPUTE FROM INUM IF IT HAS LINE NUMBERS OR NOT * CMPLO LDA CMFLG ARE 1ST FEW LINES IN MEMORY(FROM CMPAO)? ORA A JNZ CMPL1 CALL CMPRD IF NOT, READ THEM IN * CMPL1 MVI A,'+' STA LOFLG ASSUME '+' TILL DISPROVEN LXI H,SYMA1+1-1 POINT TO BYTES READ * CMPL2 INX H MVI C,4 WILL CHECK 1ST 4 COLUMNS LDA AOFLG IS IT ALS8 FORMAT? CPI '+' JNZ CMPL3 NO-CONTINUE MOV A,M YES-CHECK FOR BYTE COUNT=1 CPI 1 JZ CMPL2 IS SO IGNORE THAT LINE INX H SKIP OVER BYTE COUNT * CMPL3 MOV A,M CPI ' '+1 CHECK FOR INVALID NUMBER FIELD JC CMPL6 VALID CPI '0' JC CMPL5 NOT VALID CPI '9'+1 JNC CMPL5 NOT VALID * CMPL6 CPI CR JZ CMPL2 INX H DCR C JNZ CMPL3 * CMPL4 MOV A,M INX H CPI CR JNZ CMPL4 SKIP TILL CR JMP CMPL2 GO CHECK NEXT LINE * * CMPL5 XCHG . LHLD RDCNT CHECK TO SEE IF PAST END OF DATA READ DAD D RC . YES-THEN IT HAS LINE NUMBERS MVI A,'-' NO-IT DOESN'T HAVE LINE NUMBERS STA LOFLG RET * ***** * * * READ IN SOME LINES FROM INUM INTO SYMA1+1 * CMPRD LDA INUM LXI B,2048 LXI D,SYMA1+1 USE SYMBOL TABLE AS SCRATCH BUFFER CALL SYS DO THE READ DB RBLOP CALL EOFTS MVI A,CR PUT CR AT END TO MARK IT STAX D * MOV A,E CALCULATE -(ENDING ADDRESS) "RDCNR" CMA . COMPLEMENT LOW BITS MOV L,A MOV A,D CMA . COMPLEMENT HIGH BITS MOV H,A INX H AND ADD ONE TO GET TWOS COMPLIMENT SHLD RDCNT * LDA INUM MVI D,0 CALL SYS REWIND INUM DB SPAOP CALL ERR0 XRA A STA EOFLG CLEAR EOFLG,DON'T USE IT HERE RET . * * * END OF FILE ERROR TEST * EOFTS CPI EREOF JNZ ERR0 IF NOT EOF, THEN REAL ERROR MVI A,TRUE STA EOFLG SET EOFLG AND RETURN RET . * * **************************************** * * DONE--TIE UP LOOSE ENDS AND EXIT * DONE CALL ERROT OUTPUT NUMBER OF ASSEMBLY ERRORS CALL LBCOT OUTPUT NUMBER OF SYMBOLS DEFINED LDA INUM CALL CLOSE MVI A,-1 STA XLIST LDA LNUM CALL EXCLUDE ADD LNUM TO LIST OF FILES TO EOF AND CLOSE LDA BNUM CALL EXCLUDE LDA ENUM CALL EXCLUDE LDA SNUM CALL EXCLUDE CALL XEOF EOF ALL OUTPUT FILES CALL XCLOSE CLOSE ALL OUTPUT FILES CALL RERTRAP RESTORE ERROR TRAPS CALL SYS DB RETOP * DONE1 CALL RESTOR CALL SYS DB RESOP * ERROT LDA ERCNT OUTPUT # OF ASSEMBLY ERRORS ORA A JZ ERRO1 CALL DECOT STA ERCMS+2 XCHG . SHLD ERCMS ERRO1 LXI D,ERCMS CALL PRINT RET . * LBCOT LXI H,LBCNT OUTPUT # OF SYMBOLS DEFINED LXI D,LBCMS MVI C,3 MVI B,0 LBCO1 MOV A,M CPI '0' JNZ LBCO2 MOV A,B ORA A JZ LBCO3 MVI A,'0' JMP LBCO2 LBCO3 DCR B MVI A,' ' LBCO2 STAX D INX H INX D INR B DCR C JNZ LBCO1 MOV A,M STAX D LXI D,LBCMS CALL PRINT RET . * EOF CPI 0FFH FILE OPEN? RZ . NO-RETURN CALL SYS DB EOFOP CALL ERR0 RET . * CLOSE CPI 0FFH RZ . CALL SYS DB CLOOP CALL ERR0 RET . * CPYCL LDA CPYSS CPI 0FFH RZ . CALL CLOSE CALL CPYPO JMP CPYCL * * EXCLUDE CPI 0FFH MAKE LIST OF ALL OUTPUT FILE NUMBERS RZ . MOV B,A LXI H,XLIST EXCL1 MOV A,M CPI -1 END OF LIST? JZ EXCL2 YES INX H CMP B FILE NUMBER ALLREADY IN LIST? JNZ EXCL1 NOT YET-KEEP SEARCHING RET . YES-DON'T PUT IT IN EXCL2 MOV M,B ADD FILE NUMBER TO END OF LIST INX H MVI M,-1 RET . * XEOF LXI H,XLIST EOF ALL FILE NUMBERS IN XLIST XEOF1 MOV A,M CPI -1 RZ . CALL EOF INX H JMP XEOF1 * XCLOSE LXI H,XLIST CLOSE ALL FILE NUMBERS IN XLIST XCLO1 MOV A,M CPI -1 RZ . CALL CLOSE INX H JMP XCLO1 * **************************************** * * ERROR HANDLER * * ERR0 IS FOR PTDOS ERRORS,OTHERS FOR ASSM ARG ERRORS * ERR0 STA ERCOD SAVE ERROR NUMBER CALL RESTOR RESTORE SYSTEM POP H DCX H DCX H DCX H DCX H MOV A,M GET COMMAND CODE (BYTE AFTER CALL SYS) STA CMCOD LXI H,-1 MVI A,00H JMP ER2 * * DB WBLOP ERRWB CALL ERR0 WRITE BYTE ERROR * ERROP STA ERCOD OPEN ERROR FROM NAME ROUTINE MVI A,OPEOP STA CMCOD LXI H,PSBUF COPY NBUF TO PSBUF FOR ERR MESSAGE LXI D,NBUF ERRP1 LDAX D MOV M,A INX H INX D ORA A JNZ ERRP1 LXI H,-1 DON'T WANT 2ND LINE TO PRINT IN UTIL MVI A,80H RETURN AFTER CALL TO UTIL JMP ER2 * ********** * ERR1 MVI A,ERNAX NAME EXPECTED JMP ER ERR4 MVI A,ERIOS ILLEGAL OPTION SPECIFIER JMP ERROR ERR5 MVI A,ERSYN IMPROPER SYNTAX JMP ER ERR6 MVI A,ERIFI ILLEGAL FILE NUMBER JMP ERROR ERR7 MVI A,ERINA ILLEGAL FILE NAME JMP ERROR ERR8 LXI D,MSG4 BAD ALS8 FILE STRUCTURE CALL PRINT JMP ER3 * ER LXI H,PSBUF THIS ENTRY DON'T WANT ARROW,BUF TO PRINT MVI M,' ' STORE BLANK AT PSBUF SO ARROW,BUF WON'T PRINT * ERROR LXI H,-1 THIS ENTRY DON'T WANT 2ND ERROR LINE STA ERCOD LXI D,MSG0 " ASSM " PUSH H CALL PRINT POP H MVI A,84H RETURN AFTER CALL TO UTIL * ER2 CALL UTIL DB UXOP JMP ER3 CMCOD DB -1 COMMAND CODE NUMBER ERCOD DB 0 ERROR CODE NUMBER * LDA PSBUF GET FIRST CHARACTER IN PSCAN BUFFER CPI ' '+1 IS IT A PRINTING CHARACTER? JC ER3 NO-DON'T PRINT ARROW,BUFFER LXI D,MSG3 POINT TO "->(PSCAN INPUT BUFFER)" MVI A,'-' STAX D INX D MVI A,'>' STAX D INX D MVI A,' ' STAX D DCX D DCX D CALL PRINT MVI A,CR CALL CONOUT MVI A,LF CALL CONOUT * ER3 CALL RESTOR RESTORE SYSTEM CALL SYS DB SREOP * ********** * * PRINT MESSAGE AT DE TO CONSOLE * PRINT LDAX D ORA A RZ . MESSAGE IS TERMINATED WITH A ZERO BYTE CALL CONOUT INX D JMP PRINT * **************************************** * * RESTORE SYSTEM TO ORIGIONAL STATE AFTER ERROR * RESTOR LDA INUM CLOSE CALL ECLOSE MVI A,-1 STA INUM LDA LNUM CLOSE CALL ECLOSE MVI A,-1 STA LNUM LDA BNUM CLOSE CALL ECLOSE MVI A,-1 STA BNUM LDA ENUM CLOSE CALL ECLOSE MVI A,-1 STA ENUM LDA SNUM CLOSE CALL ECLOSE MVI A,-1 STA SNUM CALL ECPYCL CLOSE ALL COPY FILES CALL RERTRAP RESTORE ERROR TRAPS RET . * RERTRAP LHLD ERSWC RESTORE ERROR TRAP WORDS XCHG . LHLD ERMPT MOV M,E INX H MOV M,D RET . * * ECLOSE CPI 0FFH IS IT OPEN? RZ . NO-RETURN CALL SYS DB CLOOP NOP IGNORE ERRORS NOP NOP RET . * * ECPYCL LDA CPYSS CLOSE ALL COPY FILES CPI 0FFH DONE YET? RZ . YES-ALL CLOSED CALL ECLOSE CLOSE THIS ONE CALL CPYPO POP THIS ONE FRMO STACK JMP ECPYCL GO CLOSE NEXT ONE * **************************************** * * * STORAGE AND TABLE AREA * * ARGUMENT OPTION LOOKUP TABLE(SAME ORDER AS GAFT,END W/0) * GALT DB 'A' DB 'L' DB '#' DB 'P' DB 'X' DB 'H' DB 0 * * ARGUMENT OPTION FLAG TABLE (SAME ORDER AS GALT) * GAFT EQU $ AOFLG DB 0 A OPTION FLAG LOFLG DB 0 L OPTION FLAG NOFLG DB '-' # OPTION FLAG POFLG DB '-' P OPTION FLAG XOFLG DB '-' X OPTION FLAG HOFLG DB '+' H OPTION FLAG * * 0 NO ADDITIONAL SPACING * 1 72 COL. OUTPUT * 2 80 COL. OUTPUT(DEFAULT) * 3 132 COL. OUTPUT * OPSGN DB '+' OPTION SIGN-USED TO HOLD WHAT WILL GO IN GAFT * LINO ASC "0000" LINE NUMBERS GENERATED FOR # OPTION PGCNT DB 1 COUNT OF LINES USED FOR PAGNATION PCNT DB 1 COUNT OF PAGES PRINTED SLNSZ DB 4 # OF SYMBOLS PER LINE OF SYMTAB LISTING XLNSZ DB 12 # OF SYMBOLS PER LINE OF XREF LISTING * SGLONAME ASC "SYSGLOBL/ " DB 0 * FTYP DB '.'+80H INITIALLY TYPE . FBLSZ DW 4C0H INITIALLY BLKSZ = 4C0H DB 0 ATTRIBUTES: NONE PSBUF DS 20 PSCAN BUFFER DB 0 SAFTY PSBUF END MARKER MSG3 EQU PSBUF-3 WHERE PRINTING SHOULD BEGIN IN ERROR MSG * MSG0 ASC "ASSM" DB 0 MSG4 ASC " ASSM ERROR: BAD ALS8 FILE STRUCTURE " DB CR DB LF DB 0 * FNMSG ASC "File:" DB 0 DNMSG ASC "Disk:" DB 0 TITLBUF DB 0,0 TITLE BUFFER DS 80 PGMES ASC "Page " DB 0 NAMSG DS 20*6 STACK OF NAMES FOR TITLE NAMPTR DW NAMSG POINTER TO CURRENT ONE DATE ASC " / / " DB 0 * STMSG DB 0DH,0AH,0DH,0AH ASC " ASSM 1.1 (MOD 0) 8080 Disk Assembler" DB 0DH,0AH ASC " Copyright (C) 1977 Processor Technology" ASC " Corporation" DB 0DH,0AH,0 * ERCMS ASC " No assembly errors. " DB 0 LBCMS ASC " labels were defined." DB 0DH,0AH,0 * CRLF DB 0DH,0AH,0 ASCII CARRIAGE RETURN, LINEFEED * PSTYPE DB 0 TYPE OF PSCAN RETAD DW 0 RETURN ADDRESS STORAGE FOR GARGS IFFLG DB 0 IF FLAG ILFLG DB 0 IFFLAG LIST SUPPRESSION FLAG TERMW DB 2 TERMINAL WIDTH ASFLG DB 1 ASCII LISTING NORMALLY ON SWCH DB 0 FLAG USED IN OTITLE LFMT DB 1 DBCNT DB 5 COUNT OF DB VLAUES PER LINE * CPYSS DB 0FFH COPY FILE STACK DB 0FFH DB 0FFH DB 0FFH DB 0FFH CPYNN EQU $-CPYSS NUMBER IN COPY STACK * INUM DB -1 LNUM DB -1 BNUM DB -1 ENUM DB +1 DEFAULT IS CONSOLE SNUM DB -1 PASI DB 0 ALST DB 0 ERCNT DB 0 COUNT OF ASSEMBLY ERRORS LBCNT ASC "0000" COUNT OF SYMBOLS DEFINED XQFLG DB 0 CMFLG DB 0 FLAG USED IN CMPLO EOFLG DB 0 END OF FILE FLAG * * * SYSTEM PARAMETER AREA * CIUNT DS 1 CONIT DS 1 XQADR DS 2 ASPC DS 2 PNTR DS 2 TABA DS 2 OPRD DS 2 OIND DS 2 SCNT DS 1 SYMSAV DS 2 TEMP DS 1 OPRI DS 2 SIGN DS 1 GTLT DS 1 FTEMP DS 1 NAMWK DS 2 "NAME" WK AREA BBUF DS 2 ERSWC DS 2 ERMPT DW 0 POINTER TO SYSGLO LEVEL 2 ERROR TRAP WORD CHARFL DW 0 ADDRESS OF SYSGLO CHARACTER FLAG DS 2 JUST IN CASE * * * SYSTEM BUFFERS * BUFR DS 64 NBUF DS 10 DS 25 AREA DS 18 ABUF DS 35 OBUF DS 22 START OF OUTPUT BUFFER DS 5 IBUF DS IBFLN INPUT BUFFER DB CR SAFTY IBUF STOP RLINE DW IBUF POINTER TO START OF IBUF SBUF DS 132 BUFFER FOR SYMBOL TABLE SBPTR DW SBUF POINTER INTO SBUF HBUF DS 134 BUFFER FOR PAGE HEADER HCON DS 4 STORAGE USED IN BINH LADDR DS 2 BCOUNT DS 2 IMAGE BLOCK BYTE COUNT BADDR DS 2 IMAGE BLOCK LOADING ADDRESS COBUF DS 100 BINARY OUTPUT BUFFER RDCNT DW 0 -(READ COUNT) USED IN CMPRD XLIST DS 7 LIST OF FILES TO EOF AND CLOSE (USED IN DONE) * **************************************** * * * OPCODE TABLE * * TABLE HAS FOLLOWING FORM: 'MNEMONIC'(FILL WITH BLANKS * TO 4 CHARACTERS), TYPE/SIZE (TYPE IS DISPLACEMENT * FROM OPTJT FOR THE PROPER JUMP SHIFTED LEFT TWO * PLACES IE: FOR A TYP4 JUMP IT WOULD BE 30H)(SIZE IS * THE NUMBER OF BYTES THE INSTRUCTION TAKES IE: THE * TYP4 INSTRUCTION ABOVE IS A 1 BYTE INSTRUCTION, * ORING THIS IN TO THE TYPE/SIZE BYTE GIVES 31H), * OBJECT CODE (THE BINARY PRODUCED FOR THAT MNEMONIC). * PSEUDO OPS HAVE TYPE 0H, AND THE OBJECT BYTE IS * THIER NUMBER TESTED IN PSU1 AND PSU2. * THE ENTRIES ARE ARANGED ACCORDING TO HOW THEY GET * MAPPED BY THE HASHING FUNCTION (XORING THE 4 ASCII * LETTERS OF THE MNEMONIC THEN MASKING TO 5 BITS) * IE: 'MVI ' GETS HASHED AS 12H SO IT GOES UNDER HAS12. * NEW PSEUDOS MAY BE PLACED AT THE END SINCE IT WILL * BE SEARCHED FOR UNTILL THE END OF THE TABLE IS REACHED. * (BUT PUT IT BEFORE OPBUF) * HASH0 ASC 'CC ' SORCE CODE DB T6 TYPE/BYTE SIZE DB 0DCH OBJECT CODE * HASH1 ASC 'EQU ' DB T0 DB EQCOD ASC 'DAD ' DB T3 DB 9 ASC 'ADD ' DB T4 DB 128 ASC 'RAR ' DB T1 DB 31 * HASH2 ASC 'CALL' DB T6 DB 205 ASC 'DDB ' DB T0 DB DDCOD ASC 'RP ' DB T1 DB 0F0H * HASH3 ASC 'RET ' DB T1 DB 201 ASC 'XRI ' DB T5 DB 238 ASC 'RRC ' DB T1 DB 15 * HASH4 ASC 'SUB ' DB T4 DB 144 ASC 'RES ' DB T0 DB RSCOD ASC 'DAA ' DB T1 DB 39 ASC 'STC ' DB T1 DB 55 * HASH5 ASC 'NLST' DB T0 DB NLCOD ASC 'COPY' DB T0 DB CPCOD ASC 'TITL' DB T0 DB TICOD * HASH6 ASC 'DB ' DB T0 DB DBCOD ASC 'STA ' DB T6 DB 50 ASC 'RNZ ' DB T1 DB 0C0H ASC 'ANI ' DB T5 DB 230 ASC 'ADC ' DB T4 DB 136 * HASH7 ASC 'JNC ' DB T6 DB 0D2H ASC 'JM ' DB T6 DB 0FAH ASC 'SPHL' DB T1 DB 249 ASC 'IN ' DB T5 DB 219 ASC 'RPE ' DB T1 DB 0E8H * HASH8 ASC 'RZ ' DB T1 DB 0C8H ASC 'XTHL' DB T1 DB 227 * HASH9 ASC 'LDA ' DB T6 DB 58 ASC 'JC ' DB T6 DB 0DAH ASC 'ENDF' DB T0 DB EFCOD * HASHB ASC 'XRA ' DB T4 DB 168 ASC 'ASCZ' DB T0 DB AZCOD ASC 'LST ' DB T0 DB LSCOD ASC 'ACI ' DB T5 DB 206 * HASHC ASC 'LHLD' DB T6 DB 42 ASC 'ADI ' DB T5 DB 198 ASC 'EI ' DB T1 DB 251 ASC 'XEQ ' DB T0 DB XQCOD * HASHD ASC 'CMC ' DB T1 DB 63 ASC 'RPO ' DB T1 DB 0E0H ASC 'DI ' DB T1 DB 243 * HASHE ASC 'CNC ' DB T6 DB 0D4H ASC 'ANA ' DB T4 DB 160 ASC 'CM ' DB T6 DB 0FCH ASC 'OUT ' DB T5 DB 211 * HASHF ASC 'POP ' DB T3 DB 193 ASC 'IF ' DB T0 DB IFCOD ASC 'CMA ' DB T1 DB 47 ASC 'SUI ' DB T5 DB 214 ASC 'END ' DB T0 DB ENCOD * HAS10 ASC 'JZ ' DB T6 DB 0CAH ASC 'HLT ' DB T1 DB 118 ASC 'IFLS' DB T0 DB FLCOD * HAS11 ASC 'LDAX' DB T2 DB 10 ASC 'RC ' DB T1 DB 0D8H ASC 'ASC ' DB T0 DB ASCOD ASC 'NOP ' DB T1 DB 0 * HAS12 ASC 'MVI ' DB T5 DB 6 * HAS13 ASC 'SHLD' DB T6 DB 34 ASC 'DW ' DB T0 DB DWCOD ASC 'CP ' DB T6 DB 0F4H ASC 'SBB ' DB T4 DB 152 ASC 'PAGE' DB T0 DB PGCOD * HAS14 ASC 'MOV ' DB T4 DB 64 ASC 'XCHG' DB T1 DB 235 ASC 'ORI ' DB T5 DB 246 * HAS15 ASC 'INR ' DB T4 DB 4 ASC 'DCR ' DB T4 DB 5 ASC 'JPO ' DB T6 DB 0E2H ASC 'RST ' DB T4 DB 199 * HAS16 ASC 'CPE ' DB T6 DB 0ECH * HAS17 ASC 'JMP ' DB T6 DB 0C3H ASC 'DS ' DB T0 DB DSCOD ASC 'CNZ ' DB T6 DB 0C4H ASC 'PCHL' DB T1 DB 233 ASC 'ASCF' DB T0 DB AFCOD * HAS18 ASC 'SBI ' DB T5 DB 222 * HAS19 ASC 'CZ ' DB T6 DB 0CCH * HAS1A ASC 'CPI ' DB T5 DB 254 ASC 'JP ' DB T6 DB 0F2H ASC 'ORG ' DB T0 DB ORCOD * HAS1C ASC 'ORA ' DB T4 DB 176 ASC 'CPO ' DB T6 DB 0E4H * HAS1D ASC 'LXI ' DB T6 DB 1 ASC 'RLC ' DB T1 DB 7 * HAS1E ASC 'JNZ ' DB T6 DB 0C2H ASC 'PUSH' DB T3 DB 197 ASC 'STAX' DB T2 DB 2 ASC 'CMP ' DB T4 DB 184 * HAS1F ASC 'INX ' DB T3 DB 3 ASC 'DCX ' DB T3 DB 11 ASC 'RM ' DB T1 DB 0F8H ASC 'RNC ' DB T1 DB 0D0H ASC 'JPE ' DB T6 DB 0EAH ASC 'RAL ' DB T1 DB 23 * OPBUF DS 9 * * DEFINITION OF TYPES * BITS 7-2 ARE OPTJT OFFSETS * BITS 1-0 ARE # OF BYTES IN INSTRUCTION * T0 EQU 0 T1 EQU 0DH T2 EQU 19H T3 EQU 25H T4 EQU 31H T5 EQU 3EH T6 EQU 4BH * DBCOD EQU -1 ORCOD EQU 0 EQCOD EQU 1 DSCOD EQU 2 RSCOD EQU 2 DWCOD EQU 3 ENCOD EQU 4 PGCOD EQU 5 LSCOD EQU 6 NLCOD EQU 7 ASCOD EQU 8 TICOD EQU 9 XQCOD EQU 10 AFCOD EQU 11 DDCOD EQU 12 CPCOD EQU 13 IFCOD EQU 14 EFCOD EQU 15 FLCOD EQU 16 AZCOD EQU 17 * STP DS 2 STM TAB PTR FOR ORDERING SPTR DS 2 SEARCH POINTER FOR ORDERING HASP DS 2 HASH TABLE POINTER FOR ORDERING CCHR DS 1 CURRENT CHARACTER FOR ORDERING * **************************************** * * * HASH TABLE * HASHT DS 26*2 * **************************************** * * * REGISTER TABLE * RTBLN EQU 13 LENGTH OF RTAB BNDC0 EQU >$ BOUNDRY CHECK (WANT TO USE 8 BIT MATH) BNDC1 EQU BNDC0+RTBLN-1 IF 0-$ ENDF * RTAB DB 7 'A' DB 0 'B' DB 1 'C' DB 2 'D' DB 3 'E' DB -1 DB -1 DB 4 'H' DB -1 DB -1 DB -1 DB 5 'L' DB 6 'M' END OF TABLE * **************************************** * * * SYMBOL TABLE * STEND DW SYMA1 POINTER TO END OF SYMTAB SYMAD ASC 'PSW' DW 0 DDB 6 VALUE OF PSW ASC 'psw' DW 0 DDB 6 ASC 'SP' DB 0 DW 0 DDB 6 ASC 'sp' DB 0 DW 0 DDB 6 SYMA1 DB 0 START OF THIS SYMBOL TABLE *