; DIS-ASSEMBLER FOR CODE & SOURCE OUTPUT ; ; 1982.8.13. BASE ; 1983.6.21. VER.2.12 ; 1983.7.3. VER.2.20 ; ; EQUATIONS OF EXTERNAL & ENTRY LABELS ; ENTRY GETYN ;GET YES NO RESPONSE ENTRY COPY ;COPY DATA ENTRY ENDLIS ;ONE LINE END PROCESS ENTRY STLBOR ;SET LABEL DATA ENTRY LOOPDL ;LINE DECODE LOOP FOR INDEXED ENTRY CHKLBS ;CHECK LABEL ENTRY SRCHCD ;SEARCH CODE ENTRY SRCHCO ;SEARCH CODE ONLY ENTRY SETLOC ;SET LOCATION DATA ENTRY SETBYT ;SET BYTE DATA ; ENTRY WKOPCD ;OPCODE POINT IN WORK ENTRY BCODE ;INPUT FILE CODE BUFFER ENTRY PCURNT ;CURRENT PROGRAM ADDRESS ; EXT STRTMD ;START MODE SET UP ROUTINE EXT LOOPIN ;LOOP INITIALIZE ROUTINE EXT SETDB ;SET DEFINE BYTE PSUDO LINE EXT SETDW ;SET DEFINE WORD PSEUDO LINE EXT SETBDT ;SET BYTE DATA EXT SETWDT ;SET WORD DATA ; EXT IXMNEM ;MNEMONIC MAIN INDEX EXT IXMAIN ;MAIN ROUTINE INDEX ; EXT PORG ;ORIGINATE PSUDO DATA POINT EXT PEQU ;EQUATION PSUDO DATA POINT EXT PEND ;END PSUDO DATA POINT ; EXT CSTUP ;START UP COMMNET EXT CPAGE ;PAGE TOP COMMENT EXT CTAG ;TAG DATA EXT MENDCD ;END CODE POINT ; ; EQUATIONS OF BDOS FUNCTION ; CCONIN EQU 1 ;CONSOLE INPUT CCONOT EQU 2 ;CONSOLE OUTPUT CLIST EQU 5 ;LISTER CPRBUF EQU 9 ;PRINT BUFFERED DATA CRDBUF EQU 10 ;READ CONSOLE BUFFER CCONST EQU 11 ;CONSOEL STATUS COPEN EQU 15 ;OPEN FILE CCLOSE EQU 16 ;CLOSE FILE CDELET EQU 19 ;DELETE FILE CREAD EQU 20 ;READ FILE CWRITE EQU 21 ;WRITE FILE CMAKE EQU 22 ;MAKE FILE CSTDMA EQU 26 ;SET DMA ADDRESS ; ; EQUATIONS OF DATA ; HT EQU 09H ;HORIZONTAL TAB LF EQU 0AH ;LINE FEED FF EQU 0CH ;FORM FEED CR EQU 0DH ;CARRIAGRE RETURN EOF EQU 1AH ;END OF FILE MAXLIN EQU 52 ;MAX LINE / PAGE ; TOP EQU 0 ;TOP OF MEMORY BDOS EQU 5 ;BDOS ENTRY DFCB EQU 5CH ;DEFAULT FCB ; ; STARTUP ROUTINE ; START: LXI SP,STACK LDA DFCB+1 LXI H,CNOFIL CPI ' ' JZ ERSTOP ;NO INPUT FILE, SO ERROR LXI H,DFCB LXI D,INFCB XRA A CALL STFCB ;SET UP INPUT FILE FCB LDA DFCB+16 ;GET SECOND FCB DISK ORA A JZ $+6 ;NOT SPECIFIED STA DFCB ;DIFFERENT DISK LXI H,DFCB LXI D,PRNFCB MVI A,'P' LXI B,'RN' CALL STFCB ;SET LIST OUT FILE FCB .PRN LXI H,DFCB LXI D,ASMFCB MVI A,'A' LXI B,'SM' CALL STFCB ;SET SOURCE OUT FILE FCB .ASM LXI D,INFCB CALL OPEN ;OPEN INPUT FILE LXI H,CNOFND JZ ERSTOP ;NOT FOUND XRA A STA FLGLST ;CLEAR INITIALIZE FLAG STA FLGASM ; ; MVI A,-1 STA PMODE ;PASS MODE TO PASS ONE LHLD BDOS+1 SHLD PAVEND ;SAVE END OF FREE AREA CALL CONCRL LXI H,CSTUP CALL CONBOT ;PRINT START UP COMMENTS LXI H,CSTVER CALL CONBOT ;DISPLAY MAIN VERSION LXI D,CSTRTA CALL GETWDC ;GET START ADDRESS SHLD DSTADD ;SAVE START ADDRESS STARTR: LXI D,CPREND CALL GETWDC ;GET END ADDRESS MOV A,H ORA L JNZ $+6 ;HAVE SOME DATA LXI H,-1 SHLD DENPNT ;SET END POINT XCHG LHLD DSTADD ORA A CALL SUBDBL JNC STARTR ;RETRY OF END OF PROGRAM LXI D,COFFST CALL GETWDC ;GET OFFSET SHLD DOFSET ;SAVE OFFSET LXI H,CASCDM CALL GETYN ;ASCII DUMP MODE STA MASDMP LXI H,CLISTP CALL GETYN ;LISTING PASS MODE STA MLIST LXI H,CSURPS CALL GETYN ;SOURCE OUTPUT MODE STA MSOURC LXI H,CCRREF CALL GETYN ;CROSS REFERENCE MODE STA MCRREF LXI H,MASDMP MOV A,M ;GET ASCII MODE INX H ORA M ;LISTING MODE INX H INX H ORA M ;CROSS REFERENCE MODE JZ STARTN ;NO LIST OUT LXI H,CLTOFL CALL GETYN ;LIST OUT DEVICE STARTN: STA MLSTDV LXI H,CMITRF CALL GETYN ;INTERNAL TABLE REFERENCE LABEL STA MITBL LXI H,CMXTRF CALL GETYN ;EXTERNAL TABLE REFERENCE LABEL STA MXTBL LXI H,CUTAB CALL GETYN ;TAB MODE STA MTAB CALL STRTMD ;GET CPU DEPENDING OPTION LXI H,CENBYT CALL CONBOT ;BYTE ADDRESS ENTRY LXI H,DARTBL CALL GETARA ;GET BYTE ADDRESS PAIR DATA PUSH H LXI H,CENWRD CALL CONBOT ;WORD ADDRESS ENTRY POP H CALL GETARA ;GET WORD ADDRESS PAIR DATA SHLD PLABLT ;SAVE NEXT AVAILABEL POINT AS LABEL AREA MVI M,0 ;SET END MARK CALL CONCRL CALL ASCDUM ;ASCII DUMP ; ; LOOP OF EACH PASS ; PLOOP: LHLD DSTADD SHLD PCURNT ;SET CURRENT POINTER TO START ADDRESS XRA A STA MEOF ;CLEAR END OF FILE MODE DCR A STA MENDCD ;RESET END CODE MODE MVI A,8 STA CNCODE ;SET CODE READ COUNT LXI H,BCODE SHLD PCODE ;POINTER OF CODE TO INITIAL POINT CALL PASOFF ;PASS READ OF OFFSET ; ; LOOP OF ONE LINE ; LOOP: CALL CHKABT ;CHECK ABORT LDA CNCODE ;GET READ COUNT MOV B,A LHLD PCODE ;GET CODE POINT LDA MEOF ;GET END OF FILE MODE ORA A JNZ LOOPRS ;END OF FILE, SO NOT READ LOOPRD: ;LOOP TO READ CODE TO BUFFER CALL GETINF ;GET ONE BYTE JC LOOPRS ;END OF FILE MOV M,A ;GET CODE INX H DCR B JNZ LOOPRD ;TO NEXT BYTE LOOPRS: LDA MEOF ADD B ;SET UP END OF FILE CODE STA MEOF LDA PMODE ANI 0FEH JNZ LOOPST ;CROSS REFERENCE PASS CALL CLRLIN ;CLEAR LINE BUFFER CALL CLRWRK ;CLEAR WORK LDA MENDCD ;GET LAST CODE END MODE ORA A CZ CLNOUT ;IF END CODE, OUT ONE LINE COMMENT CALL CHKLBD ;CHECK LABEL DATA LOOPST: ;MNEMONIC DECODING CALL LOOPIN ;INITIALIZE OF ONE LINE START PUSH H ;SAVE RETURN ADDRESS LXI H,BCODE ;CODE DATA TOP LOOPDL: PUSH H CALL GTCRAD ;GET CURRENT ADDRESS XCHG LXI H,DARTBL ;BYTE & WORD AREA DATA TOP CALL CHKBWR ;CHECK BYTE AREA JNC LOOPDB ;BYTE AREA CALL CHKBWR ;CHECK WORD AREA JNC SETDW ;WORD AREA POP H PUSH H MOV A,M LXI H,IXMNEM ;CODE INDEX TOP CALL SRCHCD ;SEARCH CODE JC SETDB ;NOT FOUND SO DO AS BYTE DATA LXI D,IXMAIN ;ROUTINE INDEX DAD D MOV A,M INX H MOV H,M ;GET ROUTINE MOV L,A XTHL ;SET ROUTINE MOV A,M ;GET DECODED CODE MOV C,A INX H ;POINTER TO NEXT POINT LXI D,WKOPRD ;OPERAND DATA POINT MVI B,1 ;DEFAULT LENGTH IS ONE RET ;TO EACH ROUTINE ; LOOPDB: ;BYTE DATA AREA LXI H,LOOPBS XTHL PUSH H JMP SETDB ;TO SET BYTE DATA & RETURN TO NEXT ADDRESS ; LOOPBS: LHLD PCURNT LOOPBL: ;BYTE LOOP INX H PUSH D PUSH H CALL CHKLBS ;CHECK LABELED ADDRESS POP H POP D RC ;WITH LABEL LINE PUSH D PUSH H XCHG PUSH B LXI H,DARTBL CALL CHKBWR ;CHECK BYTE DATA AREA POP B POP H POP D RC ;NOT BYTE DATA AREA PUSH H ;DATA AREA MVI A,',' STAX D INX D LXI H,BCODE MOV A,B ADD L MOV L,A MVI A,0 ADC H MOV H,A ;GET CODE POINT MOV A,M ;GET CODE CALL SETBDT ;SET BYTE DATA POP H INR B ;UP BYTE COUNT MOV A,B CPI 8 JC LOOPBL ;TO NEXT BYTE RET ; ; END OF ONE LINE PROCESS ; ENDLIS: LHLD PCURNT LXI D,LBUFER CALL SETLOC INX D INX D MOV C,B ;SAVE BYTE COUNT LXI H,BCODE MOV A,M ;GET CODE DATA INX H CALL SETBYT ;SET BY HEXADECIMAL CODE DCR B JNZ $-6 ;TO NEXT BYTE MOV A,C STA CNCODE ;SET COUNT FOR READ FROM INPUT FILE MOV E,C MVI D,0 LHLD PCURNT DAD D SHLD PCURNT ;UP CURRENT ADDRESS LXI H,BCODE XCHG DAD D JMP ENDLIM+6 ;CANCEL USED CODE DATA ; ENDLIM: ;CODE DATA MOVE LOOP MOV A,M STAX D ;MOVE DATA INX H INX D INR C MOV A,C CPI 8 JNZ ENDLIM ;MOVE TO BUFFER END XCHG SHLD PCODE ;CODE POINT TO NEXT LDA PMODE ANI 0FEH CZ OUTWTB ;OUTPUT ONE LINE, IF OUTPUT PASS LHLD PCURNT XCHG CALL CHKEND ;CHECK END OF ADDRESS JC ENDPSS ;END OF ADDRESS LDA MEOF CPI 8 JC LOOP ;NOT END OF INPUT DATA LHLD DPRLNG ;END OF INPUT DATA MOV A,H ORA L JZ ENDPSS ;FILE LENGTH DEFAULT MODE SO OK LDA PMODE ;FILE OVER ORA A LXI H,CEOFER CZ CONBOT ;OUT ERROR COMMENT TO CONSOLE, IF OUTPUT PASS ENDPSS: ;END OF PASS CALL CLRLIN CALL CLRWRK ;CLEAR WORK LXI H,PMODE INR M JNZ ENDPRN ;NOT PASS ONE ; ; OUTPUT HEADING DATA ; TOPPRN: MVI A,-1 ;SET PAGING MODE STA LNCNT LHLD PLABLT EQOUTL: ;OUT EQUATIONS OF EXTERNAL RANGE LABELS MOV A,M ANI 7FH JZ ORGSET ;END OF LABEL TABLE CPI 'X' JZ EQOUTG ;EXTERNAL PROGRAM ADDRESS CPI 'Y' JZ EQOUTG ;EXTERNAL DATA ADDRESS CPI 'Z' JNZ EQOUTS ;NOT EXTERNAL LABEL LDA MXTBL ;GET EXTERNAL TABLE LABEL MODE ORA A JZ EQOUTS ;EXTERNAL TABLE MODE IS NOT ON EQOUTG: ;OUT ONE EXTERNAL ADDRESS EQUATION LXI D,WKLABL PUSH H CALL SETLBD ;SET LABEL LXI H,PEQU CALL SETOPC ;SET 'EQU' POP H PUSH H INX H MOV A,M INX H MOV L,M MOV H,A CALL SETWDT ;SET ADDRESS DATA CALL OUTWTB ;OUT EQUATION LINE POP H EQOUTS: INX H INX H INX H JMP EQOUTL ;TO NEXT DATA ; ORGSET: ;SET ORIGIN CALL CLNOUW LXI H,PORG CALL SETOPC LHLD DSTADD CALL SETWDT ;SET 'ORG' LINE CALL OUTWTB CALL CLNOUW JMP PLOOP ;TO NEXT PASS ; ; END DATA PRINT OUT PROCESS ; ENDPRN: MOV A,M DCR A JZ $+7 ;PASS ONE DCR A JNZ CRFOUT ;CROSS REFERENCE DCR M PUSH H CALL CLNOUW LXI H,PEND CALL SETOPC ;OUT 'END' LINE CALL OUTWTB POP H INR M LDA PMODE DCR A JNZ CKCRPS ;NOT LIST OUT PASS DCR M MVI A,-1 STA LNCNT ;PAGING MODE CALL CLNOUT ;OUT UNRESOLVED LABELS COMMENT LXI H,CUNRLB CALL BLNOUT MVI B,0FFH ;LINE TOP MODE LHLD PLABLT ;LABEL TABLE TOP UNRSPL: ;UNRESOLVED LABEL PRINT OUT LOOP MOV A,M ORA A JZ UNRSPE ;END OF TABLE JM UNRSPN ;RESOLVED LABEL, SO PASS ORI 80H ;SET RESOLVED BIT MOV M,A ANI 7FH CPI 'X' JNC UNRSPN ;OUT OF RANGE, SO PASS PUSH H ;UNRESOLVED LABEL ORA B JP UNRSPS ;NOT LINE TOP LXI D,LBDATA ;SET LINE TOP DATA MVI A,';' STAX D INX D INX D MVI B,7 ;DATA COUNT / LINE UNRSPS: CALL SETLBD ;SET LABEL DATA INX D INX D INX D ;THREE SPACES DCR B JNZ $+8 ;NOT LINE END CALL LINOUT ;LINE END SO PRINT ONE LINE MVI B,0FFH ;LINE TOP CODE POP H UNRSPN: ;TO NEXT INX H INX H INX H JMP UNRSPL ; UNRSPE: ORA B CP LINOUT ;OUT LAST LINE, IF ANY CODE EXISTS LXI H,PMODE INR M LDA MSOURC ORA A JNZ TOPPRN ;TO SOURCE OUTPUT PASS INR M CKCRPS: ;CHECK CROSS REFERENCE PASS LDA MCRREF ORA A JZ ENDPRC ;ALL OK END OF PROGRAM JMP PLOOP ;TO CROSS REFERNCE ; ; PRINT CROSS REFERENCE LIST ; CRFOUT: CALL CLNOUT LXI H,CLCRRF CALL BLNOUT ;OUT CROSS REFERENCE COMMNETS LHLD PLABLT ;TABLE TOP MVI B,0FFH CRFOUL: ;ONE DATA OUTPUT LOOP MOV A,M ORA A JZ CRFOUE ;END OF TABLE PUSH H JP CRFOUR ;REFERED DATA XRA A ;BASE DATA ORA B CP LINOUT ;OUT ONE LINE, IF ANY CODE LEFT MVI B,5 ;COUNT / LINE LXI D,LBDATA MVI A,';' STAX D INX D INX D POP H PUSH H CALL SETLBD ;SET BASE CODE LXI H,6 DAD D ;TO REFERED DATA PRINT POINT XCHG CRFOUS: POP H INX H INX H INX H JMP CRFOUL ;TO NEXT DATA ; CRFOUR: ;REFERED DATA ORA B JP CRFOUC ;IN SAME LINE MVI B,5 ;TO NEXT LINE LXI D,LBDATA MVI A,';' STAX D LXI H,13 DAD D ;TO REFERED DATA PRINT POINT XCHG CRFOUC: ;SET REFERED DATA POP H PUSH H CALL SETLBD ;SET ONE DATA INX D INX D DCR B JNZ CRFOUS ;TO NEXT CALL LINOUT ;END OF LINE SO OUT ONE DATA MVI B,0FFH ;SET LINE TOP MARK JMP CRFOUS ; CRFOUE: ;END OF CROSS REFERENCE ORA B CP LINOUT ;PRINT IF ANY CODE LEFT ; ; END PROCESS OF DIS-ASSEMBLE ; ENDPRC: LDA FLGLST ORA A JZ ENDPRS ;LIST OUT IS NOT USED LXI D,PRNFCB CALL CLOSE ;CLOSE LIST OUT FILE CZ ERROR ENDPRS: LDA FLGASM ORA A JZ TOP ;SOURCE FILE IS NOT USED, SO END LXI D,ASMFCB CALL CLOSE ;CLOSE SOURCE OUT FILE CZ ERROR JMP TOP ; ; ASCII CODE DUMP ; ASCDUM: CALL CLRLIN ;CLEAR LINE BUFFER LXI H,CASCII CALL BLNOUT ;ASCII DUMP COMMENT CALL PASOFF ;PASS READ OF OFFSET LHLD DSTADD ;GET START ADDRESS ASCDLP: ;ONE LINE LOOP LXI D,LBDATA MVI A,';' STAX D ;SET COMMENT MARK INX D CALL SETLOC ;SET LOCATION INX D INX D INX D ASCDBL: ;ONE BYTE LOOP CALL GETINF ;GET ONE BYTE JC ASCDUE ;END OF FILE ANI 7FH CPI ' ' JNC $+5 ;NOT CONTROL CODE ASCDUV: MVI A,'.' ;UNVISIBLE CODE, SO REPLACE BY '.' CPI 7FH JZ ASCDUV ;DELETED CODE, SO UNVISIBLE STAX D ;SET CODE INX D INX H MOV A,L ANI 7 JNZ ASCDBL ;TO NEXT BYTE INX D INX D MOV A,L ANI 1FH JNZ ASCDBL ;TO NEXT BYTE WITH SPACE PUSH H ;LINE END CALL LINOUT ;OUT ONE LINE POP D PUSH D CALL CHKEND POP H JNC ASCDLP ;TO NEXT LINE RET ; ASCDUE: ;END OF FILE PUSH H CALL LINOUT ;OUT CURRENT LINE POP D DCX D LHLD DENPNT ;GET END POINT INX H MOV A,H ORA L RNZ ;HAVE SOME DATA XCHG ;NO DATA, SO SET UP END ADDRESS SHLD DENPNT RET ; ; CHECK LABEL ; INPUT ; HL:CURRENT ADDRESS ; OUTPUT ; CF:ON LABELED ADDRESS OFF NO LABEL ; HL:DATA POINT OF LABEL TABLE ; B:B ; CHKLBS: XCHG LHLD PLABLT ;LABEL TABLE TOP DCX H CHKLBL: ;SEARCH LABEL DATA LOOP INX H MOV A,M ORA A RZ ;END OF DATA INX H MOV A,M INX H CMP D JC CHKLBL ;UNDER TO NEXT RNZ ;OVER SO END MOV A,M CMP E JC CHKLBL ;UNDER TO NEXT RNZ ;OVER SO END DCX H ;MATCH ADDRESS DCX H STC RET ; ; CHECK & SET UP LABEL ; CHKLBD: LHLD PCURNT ;GET CURRENT ADDRESS CALL CHKLBS ;CHECK LABELED ADDRESS JNC CHKNEX ;NO LABEL MOV A,M ;WITH LABEL ANI 7FH CPI 'A' CNZ CHKNEX ;CHECK NO EXECUTION POINT MOV A,M ORI 80H ;SET IN RANGE FLAG MOV M,A LXI D,WKLABL CALL SETLBD ;SET LABEL LXI H,CTAG CHKLBC: MOV A,M ;GET TAG CODE ORA A JZ OUTWTB ;END OF CODE STAX D ;SET CODE INX H INX D JMP CHKLBC ;TO NEXT CODE ; ; CHECK & SET NO EXECUTION POINT ; CHKNEX: ;CHECK EXECUTION PASS LDA MENDCD ;GET END CODE MODE ORA A RNZ ;NOT END, SO OK PUSH H LXI H,CNOEXC ;END CODE CALL BLNOUT ;NO EXECUTION PASS POP H RET ; ; SET UP OF LABELED OPERAND ; INPUT ; C:LABEL CODE ; HL:ADDRESS ; OUTPUT ; B:B ; STLBOR: PUSH B PUSH D PUSH H MOV A,L MOV L,H MOV H,A SHLD CDLABL+1 ;SAVE ADDRESS DATA TO BUFFER POP D MOV A,C MVI B,'X' CPI 'A' JZ STLBOM ;PROGRAM MODE 'A' OR 'X' INR B CPI 'D' JZ STLBOM ;DATA MODE 'D' OR 'Y' INR B ;TABLE MODE 'T' OR 'Z' STLBOM: MOV A,B ;OUT OF RANGE CODE LHLD DSTADD ;PROGRAM START ADDRESS STC CALL SUBDBL JNC STLBOX ;ADDRESS < START ADDRESS OUT OF RANGE LHLD DENPNT ;PROGRAM END ADDRESS ORA A CALL SUBDBL JC STLBOX ;ADDRESS > END ADDRESS OUT OF RANGE MOV A,C ;IN RANGE CODE STLBOX: STA CDLABL ;SET CODE LHLD PLABLT ;LABEL AREA TOP XCHG LDA PMODE DCR A DCR A JZ SRRFAD+3 ;CROSS REFERENCE MODE JMP STLBOL+1 ;OTHER ; STLBOL: ;LABEL DATA CHECK LOOP INX D LDAX D ORA A JZ STLBOG ;NOT FOUND END INX D LDAX D INX D CMP H JC STLBOL ;UNDER TO NEXT JNZ STLBOV ;OVER LDAX D CMP L JC STLBOL ;UNDER TO NEXT STLBOV: ;OVER OR EVEN DCX D DCX D JZ STLBOF ;EVEN, OS FOUND DATA STLBOG: ;NO DATA IN BUFFER LDA PMODE ORA A JP LBLERR ;NOT PASS ONE, SO ERROR CALL MKLBSP ;PASS ONE MAKE INSERT SPACE STLBOC: ;SET LABEL DATA LXI H,CDLABL ;DATA TOP LXI B,3 ;DATA LENGTH CALL COPY ;SAVE DATA DCX D DCX D DCX D JMP STLBOH ; STLBOF: ;FOUND DATA LDA PMODE ORA A JP STLBOH ;NOT PASS ONE SO PASS LDAX D CPI 'A' JZ STLBOH ;NOW HIGHEST LEVEL CPI 'X' JZ STLBOH ;NOW HIGHEST LEVEL LDA CDLABL ;GET CURRENT MODE CPI 'T' JZ STLBOH ;CURRENT LEVEL IS LOW LEVEL CPI 'Z' JNZ STLBOC ;CHANGE TO HIGHER LEVEL STLBOH: XCHG POP D LDA CDLABL POP B CPI 'Z' JNZ STLBOO ;CHECK OTHER MODE LDA MXTBL ;GET EXTERNAL TABLE LABEL MODE ORA A JZ STLBOT ;NOT LABEL MODE JMP SETLBD ;LABEL MODE ; STLBOO: CPI 'T' JNZ SETLBD ;SET LABEL DATA LDA MITBL ;GET INTERNAL TABLE LABEL MODE ORA A JNZ SETLBD ;INTERNAL TABLE LABEL MODE SO TO LABEL STLBOT: ;SET AS WORD DATA INX H MOV A,M INX H MOV L,M ;GET DATA MOV H,A JMP SETWDT ;SET AS DATA ; ; FOR CROSS REFERENCE ; SRRFAD: INX D INX D INX D LDAX D ORA A JZ LBLERR ;NOT FOUND SO ERROR JP SRRFAD ;NOT BASE LABEL INX D ;BASE DATA LDAX D INX D CMP H JC SRRFAD+2 ;UNDER TO NEXT JNZ LBLERR ;OVER SO ERROR LDAX D CMP L JC SRRFAD+2 ;UNDER TO NEXT JZ STRFAD+2 ;GET POINT ; ; LABEL ADDRESS ERROR ; LBLERR: LXI D,CPSERN LHLD PCURNT CALL SETLOC ;SET CURRENT ADDRESS TO COMMENT LXI H,CPSERR CALL CONBOT ;OUT ERROR MESSAGE TO CONSOLE ABORT: ;ABORT TO SYSTEM LXI H,CABORT CALL CONBOT JMP ENDPRC ; ; INSERT REFERENCE ADDRESS DATA ; STRFAD: INX D INX D INX D LDAX D ORA A JZ $+6 ;GET INSERT POINT JP STRFAD ;TO NEXT DATA POINT CALL MKLBSP ;MAKE INSERT SPACE LDA CDLABL STAX D ;SET MODE INX D LHLD PCURNT MOV A,H STAX D ;SET REFERED POINT INX D MOV A,L STAX D INX D POP D POP B RET ; ; GET CURRENT ADDRESS ; INPUT ; HL:CODE BUFFER POINTER ; OUTPUT ; HL:CURRENT ADDRESS ; GTCRAD: PUSH D XCHG LHLD PCURNT ;GET CURRENT TOP ADDRESS DAD D LXI D,BCODE ;CODE BUFFER TOP ORA A CALL SUBDBL ;GET DATA POP D RET ; ; SEARCH CODE ; INPUT ; A:CODE ; HL:INDEX DATA TOP ; OUTPUT ; HL:BLOCK COUNT*2 ; CF:ON NOT FOUND ; SRCHCD: CALL SRCHCO ;CHECK CODE RC ;NOT FOUND PUSH H ;GET CODE XCHG CALL SETOPC ;SET OPCODE POP H RET ; ; SEARCH CODE ; INPUT ; A:CODE ; HL:INDEX TOP ; OUTPUT ; CF:ON NOT FOUND ; HL:BLOCK COUNT*2 ; DE:MNEMONIC DATA POINT ; SRCHCO: LXI D,5 ;ONE DATA LENGTH MOV C,A ;SAVE CODE PUSH H ;SAVE INDEX POINT LXI H,0 ;CLEAR BLOCK COUNT SRCHLB: XTHL ;GET INDEX POINT ANA M ;GET MASK JNZ SRCHLS ;SOME DATA ORA M JZ SRCHCN ;END SO NOT FOUND XRA A ;ZERO DATA SRCHLS: INX H MOV B,M ;GET COUNT OF DATA INX H SRCHLD: ;ONE DATA LOOP CMP M JZ SRCHCF ;MATCH CODE DAD D ;TO NEXT DATA POINT DCR B JNZ SRCHLD ;TO NEXT DATA XTHL MOV A,C INX H ;UP BLOCK COUNT JMP SRCHLB ;TO NEXT BLOCK ; SRCHCF: ;GET CODE INX H XCHG POP H ;GET BLOCK COUNT DAD H ;*2 RET ; SRCHCN: ;NOT FOUND END STC POP H RET ; ; CHECK LOCATION WITH BYTE OR WORD AREA DATA ; INPUT ; HL:BYTE OR WORD AREA DATA TOP ; DE:LOCATION ; OUTPUT ; CF:OFF IN AREA ; CHKBWR: MOV A,M ;GET DATA COUNT ORA A INX H STC RZ ;NO DATA SO OUT OF AREA MOV B,A CHKBWL: ;CHECK LOOP MOV C,M INX H MOV A,D CMP M INX H JC CHKBWN ;START > LOCATION SO TO NEXT JNZ CHKBWC ;START < LOCATION SO TO CHECK IN AREA MOV A,E CMP C JC CHKBWN ;START > LOCATION TO NEXT CHKBWC: ;CHECK IN AREA MOV C,M INX H MOV A,M CMP D JC CHKBWS ;STOP < LOCATION TO NEXT RNZ ;IN AREA MOV A,C CMP E RNC ;IN AREA JMP CHKBWS ;STOP < LOCATION TO NEXT ; CHKBWN: ;TO NEXT INX H CHKBWS: INX H DCR B JNZ CHKBWL ;CHECK NEXT DATA STC ;END SO OUT OF AREA RET ; ; MAKE LABEL DATA INSERT SPACE ; INPUT ; DE:LABEL DATA POINT ; OUTPUT ; DE:DE ; MKLBSP: PUSH D MOV L,E MOV H,D XRA A CMP M INX H INX H INX H JNZ $-4 ;TO NEXT OF TABLE PUSH H CALL SUBDBL ;GET LENGTH MOV C,L MOV B,H POP D INX D INX D LHLD PAVEND ;END OF FREE AREA ORA A CALL SUBDBL JC MKLBOV ;LABEL TABLE OVER FLOW MOV L,E MOV H,D DCX H DCX H DCX H MOV A,M ;MOVE DATA TO THREE BYTE LOWER POINT STAX D DCX D DCX H DCX B MOV A,B ORA C JNZ $-7 ;TO NEXT BYTE POP D RET ; ; LABEL TABLE OVER FLOW ; MKLBOV: LHLD PCURNT LXI D,CSYTON CALL SETLOC ;SET CURRENT ADDRESS TO COMMENT LXI H,CSYTOV CALL CONBOT ;PRINT ERROR COMMENTS TO CONSOLE JMP ABORT ;ABORT ; ; SET OPCODE TO BUFFER ; INPUT ; HL:OPCODE DATA POINT ; OUTPUT ; DE:OPERAND BUFFER POINT ; SETOPC: LXI D,WKOPCD ;OPCODE DATA BUFFER LXI B,4 ;LENGTH OF OPCODE CALL COPY LXI D,WKOPRD ;OPERAND BUFFER POINT RET ; ; SET UP WITH TAB COMPACTION & OUTPUT DATA ; OUTWTB: LXI D,WKLABL LXI H,LBDATA LDA MTAB ;GET TAB MODE MOV C,A OUTWTL: ;ONE CODE LOOP LDAX D CPI ' ' JNZ OUTWTS ;NORMAL CODE INX D LDAX D DCX D CPI ' ' LDAX D JNZ OUTWTS ;SINGLE SPACE IS NOT CHANGED DCR C INR C JZ OUTWTS ;NOT TAB MODE MVI M,HT ;SET TAB INX D LDAX D CPI ' ' JZ $-4 ;CANCEL SPACE ORA A JZ OUTWTS ;END CODE, SO OFF HT CODE & SET END MARK INX H OUTWTS: MOV M,A ;SET CODE INX H INX D ORA A JNZ OUTWTL ;TO NEXT BYTE CALL LINOUT ;OUT DATA ; ; CLEAR WORK AREA ; CLRWRK: LXI H,WKLABL ;WORK AREA TOP MVI B,WKOPRE-WKLABL JMP CLRLIL ; ; COMMENT LINE OUTPUT ; CLNOUW: CALL CLNOUT CLNOUT: LXI H,CCOMNT ; ; BUFFERED DATA OUTPUT ; INPUT ; HL:BUFFER TOP ; BLNOUT: LXI D,LBDATA ;OUTPUT DATA BUFFER BLNOUL: MOV A,M ORA A JZ LINOUT ;END OF DATA STAX D INX D INX H JMP BLNOUL ;TO NEXT DATA ; ; OUTPUT ONE LINE OF LINE BUFFER DATA ; LINOUT: CALL GETEOP ;GET END POINT LDA PMODE ;GET PASS MODE LXI H,MASDMP ;DATA TOP OF EACH OUT PUT MODE INR A JZ LINOTS ;ASCII DUMP PASS INX H DCR A JZ LINOTS ;LISTING PASS INX H DCR A JNZ LINOTT ORA M ;SOURCE OUT PASS RZ ;NO OUT MODE LXI H,LBDATA ;DATA AREA TOP CALL ASMBOT ;OUT TO SOURCE DATA FILE JMP CLRLIN ;CLEAR BUFFER ; LINOTS: ORA M RZ ;NO OUT MODE ; LINOTT: LXI H,LBUFER ;BUFFER TOP CALL LSTBOT ;OUTPUT ; ; CLEAR LINE BUFFER ; CLRLIN: MVI B,LBEND-LBUFER ;LENGTH OF BUFFER LXI H,LBUFER ;TOP OF BUFFER CLRLIL: MVI M,' ' ;FILL BY SPACE INX H DCR B JNZ CLRLIL MVI M,0 ;SET END CODE RET ; ; GET END OF DATA POINT IN LINE BUFFER ; OUTPUT ; B:COUNT ; GETEOP: LXI H,LBEND ;END OF BUFFER MVI B,LBEND-LBUFER-2 ;LENGTH FOR SEARCH MVI A,' ' GETEOL: MVI M,0 ;SET END MARK DCX H DCR M INR M JZ $+5 ;END CODE TO NEXT CMP M RNZ ;NOT SPACE DATA DCR B JNZ GETEOL ;TO NEXT DATA RET ; ; OUTPT BUFFERED DATA TO LIST FILE ; INPUT ; HL:BUFFER TOP END BY ZERO ; LSTBOT: MOV A,M ORA A JZ LSTCRL ;END OF DATA CALL LSTOUT ;OUT ONE DATA INX H JMP LSTBOT ;TO NEXT BYTE ; ; CARRIAGE RETURN & LINE FEED FOR LISTING FILE ; LSTCRL: MVI A,CR CALL LSTOUT MVI A,LF ; ; OUTPUT TO LISTING FILE ; INPUT ; A:DATA ; LSTOUT: PUSH B PUSH D PUSH H MOV C,A LDA FLGLSD ORA A JNZ LSTOUN ;INITIALIZED CMA ;INITIALIZE PAGE DATA STA FLGLSD LXI H,0 SHLD PGCNT ;CLEAR PAGE COUNT MVI A,-1 STA LNCNT ;TO PAGING MODE LSTOUN: LDA LNCNT CPI MAXLIN+1 CNC PAGE ;PAGING LXI H,LNCNT MOV A,C CPI LF JNZ $+4 ;NOT TO NEXT LINE INR M ;UP LINE COUNT LDA MLSTDV ;GET LIST OUT DEVICE MODE ORA A MOV A,C JZ LSTOUS ;TO LISTER MODE CALL PUTPRN ;OUTPUT TO DISK MODE JMP LSTOUF ; LSTOUS: CALL LIST ;TO LISTER LSTOUF: POP H POP D POP B RET ; ; PAGING ; PAGE: PUSH B XRA A STA LNCNT ;CLEAR LINE COUNT LHLD PGCNT MOV A,L ADI 1 DAA MOV L,A MOV A,H ACI 0 DAA MOV H,A SHLD PGCNT ;UP PAGE COUNT LXI H,CPAGE CALL LISTBF ;OUT PAGE TOP COUNT CALL PRNFLN ;PRINT FILE NAME LXI D,CPANM LHLD PGCNT CALL SETLOC ;SET PAGE MVI C,3 PAGEN: LXI H,CPANM MOV A,M CPI '0' JNZ PAGES ;GET NOT ZERO DATA LXI D,CPANM+1 MVI B,4 LDAX D MOV M,A INX H INX D DCR B JNZ $-5 ;MOVE PAGE NUMBER DCR C JNZ PAGEN ;CHECK NEXT PAGES: LXI H,CPAGN CALL LISTBF ;DISPLAY CALL LSTCRL ;CR & LF CALL LSTCRL CALL LSTCRL POP B RET ; ; LIST OUT STRING ; INPUT ; HL:BUFFER TOP ; LISTBF: MOV A,M INX H ORA A RZ CALL LSTOUT JMP LISTBF ; ; LIST OUT FILE NAME ; PRNFLN: MVI A,HT CALL LSTOUT LXI H,INFCB+3 LXI B,0802H PRNFLL: MOV A,M CPI ' ' JZ PRNFLS ;END OF CODE CALL LSTOUT INX H DCR B JNZ PRNFLL PRNFLS: DCR C RZ ;END MVI A,'.' CALL LSTOUT LXI H,INFCB+11 MVI B,3 JMP PRNFLL ;TO FILE TYPE ; ; OUTPUT BUFFERED DATA TO SOURCE DATA FILE ; INPUT ; HL:DATA BUFFER POINT ; ASMBOT: MOV A,M INX H ORA A JZ ASMCRL ;END OF DATA CALL ASMOUT ;OUT ONE DATA JMP ASMBOT ;TO NEXT DATA ; ; CARRIAGE RETURN & LINE FEED FOR SOURCE FILE ; ASMCRL: MVI A,CR CALL ASMOUT MVI A,LF ; ; OUTPUT ONE DATA TO SOURCE FILE ; INPUT ; A:DATA ; ASMOUT: PUSH B PUSH D PUSH H MOV C,A CALL PUTASM ;OUT DATA POP H POP D POP B RET ; ; CHECK ABORT & INTERRUPT ; CHKABT: MVI C,CCONST CALL BDOS ;GET CONSOLE STATUS ORA A RZ ;NO DATA CALL CONIN ;GET DATA CPI 3 JZ CHKABE ;ABORTED CPI 'L' RNZ ;OTHER CODE LDA PMODE ;CURRENT ADDRESS OUT LXI H,CPONE INR A JZ CHKABS ;PASS ONE LXI H,CPLIST DCR A JZ CHKABS ;LIST OUT PASS LXI H,CPSOUR DCR A JZ CHKABS ;SOURCE OUT PASS LXI H,CPCREF ;CROSS REFFERENCE CHKABS: CALL CONBOT ;OUT MODE CALL CLRLIN LXI D,LBUFER LHLD PCURNT ;GET CURRENT ADDRESS CALL SETLOC ;SET LOCATION XRA A STAX D LXI H,LBUFER CALL CONBOT ;PRINT TO CONSOLE CALL CONCRL JMP CLRLIN ;CLEAR USED BUFFER ; CHKABE: ;ABORTED BY OPERATOR LXI H,CABOTO CALL CONBOT JMP ENDPRC ; ; BUFFER PRINT FOR CONSOLE OUTPUT ; INPUT ; HL:DATA POINT ; CONBOT: MOV A,M INX H ORA A RZ ;END OF DATA CALL CONOUT ;OUT ONE DATA JMP CONBOT ; ; CARRIGATE RETURN & LINE FEED FOR CONSOLE OUT ; CONCRL: MVI A,CR CALL CONOUT MVI A,LF ; ; CONSOLE OUTPUT ; INPUT ; A:CODE ; CONOUT: PUSH B PUSH D PUSH H PUSH PSW MOV E,A MVI C,CCONOT CALL BDOS POP PSW POP H POP D POP B RET ; ; GET WORD DATA WITH COMMENT OUT ; INPUT ; DE:COMMENT DATA TOP ; OUTPUT ; DE:INPUT DATA ; GETWDC: PUSH D XCHG CALL CONBOT ;PRINT COMMENT CALL GETWDT ;GET DATA POP D JNZ GETWDC ;ERROR RETRY RET ; ; GET WORD DATA ; OUTPUT ; HL:INPUT DATA ; ZF:ON OK OFF ERROR ; A:TERMINATION CODE ; GETWDT: CALL RDCONS ;READ CONSOLE BUFFER LXI D,RDBUFF+2 ;DATA TOP GETWDS: CALL GETHXD ;GET DATA LDAX D ;GET TERMINATOR ORA A ;MUST BE END OF LINE RET ; ; GET HEXA DECIMAL DATA ; INPUT ; DE:DATA POINTER ; OUTPUT ; HL:DATA ; DE:NEXT BUFFER POINT ; GETHXD: LXI H,0 ;CLEAR DATA DCX D INX D LDAX D CPI ' ' JZ $-4 ;CANCEL SPACE GETHXL: LDAX D ;GET ONE CHARACTER SUI '0' RC ;TOO SMALL CPI 10 JC GETHXS ;0 TO 9 SUI 'A'-'9'-1 CPI 16 RNC ;TOO LARGE CPI 10 RC ;BETWEEN '9' TO 'A' GETHXS: INX D DAD H DAD H DAD H DAD H ;*16 ORA L ;ADD CURRENT DATA MOV L,A JMP GETHXL ;TO NEXT ; ; CONSOLE INPUT ; OUTPUT ; A:DATA ; CONIN: PUSH B PUSH D PUSH H MVI C,CCONIN CALL BDOS POP H POP D POP B ANI 7FH CPI 'A'+20H-1 RC ;NOT LOWER CASE ANI 5FH ;MODIFY TO UPER CASE RET ; ; GET AREA DATA PAIR ; INPUT ; HL:BUFFER TOP ; OUTPUT ; HL:NEXT POINT OF BUFFER ; GETARA: MVI M,0 ;CLEAR COUNT XCHG PUSH D ;SAVE COUNTER POINT INX D GETARR: CALL CONCRL ;CR & LF PUSH D CALL GETWDT ;GET HEXA DECIMAL DATA CPI ' ' JZ GETARS ;TO SECOND PART CPI ',' JZ GETARS ;TO SECOND PART CPI '-' JZ GETARS ;TO SECOND PART ORA A JNZ GETARE ;ERROR MOV C,L MOV B,H MOV A,H ORA L JNZ GETARO ;ONE BYTE LENGTH POP H POP B RET ; GETARE: ;ERROR OF INPUT LXI H,CADPER CALL CONBOT ;PRINT ERROR COMMENT POP D JMP GETARR ;RETRY ; GETARS: INX D PUSH H CALL GETWDS ;GET SECOND DATA POP B JNZ GETARE ;ERROR PUSH H MOV E,C MOV D,B CALL SUBDBL ;COMPARE START & STOP POP H JC GETARE ;START > STOP SO ERROR GETARO: POP D XCHG MOV M,C INX H MOV M,B ;SET START INX H MOV M,E INX H MOV M,D ;SET STOP INX H XCHG POP H INR M ;COUNT UP PUSH H JMP GETARR ;TO NEXT ; ; SET LABEL DATA ; INPUT ; DE:DATA BUFFER ; HL:LABEL DATA POINT ; SETLBD: MOV A,M ;GET MODE CODE ANI 7FH STAX D ;SET CODE INX D INX H MOV A,M INX H MOV L,M ;GET ADDRESS DATA MOV H,A ; ; SET LOCATION DATA ; INPUT ; HL:DATA ; DE:BUFFER POINTER ; SETLOC: PUSH PSW MOV A,H CALL SETBYT ;SET HIGHER BYTE MOV A,L CALL SETBYT ;SET LOWER BYTE POP PSW RET ; ; SET BYTE DATA BY HEXADECIMAL ; INPUT ; DE:BUFFER POINTER ; A:DATA ; SETBYT: PUSH PSW RRC RRC RRC RRC CALL SETNBL ;SET HIGHER NIBBLE POP PSW SETNBL: ;SET NIBBLE ANI 0FH CPI 10 JC $+5 ;0 TO 9 ADI 'A'-'9'-1 ;A TO F SETNBR: ADI '0' STAX D ;SET DATA INX D RET ; ; SUBTRUCT DOUBLE BYTES WITH CF ; HL=HL-DE-CF ; OUTPUT ; A:A ; CF:SET BY RESULT ; SUBDBL: PUSH B MOV B,A MOV A,L SBB E MOV L,A MOV A,H SBB D MOV H,A MOV A,B POP B RET ; ; CHECK END OF PROGRAM ; INPUT ; DE:CURRENT ADDRESS ; OUTPUT ; CF:ON END OF ADDRESS ; CHKEND: LHLD DENPNT ;GET END POINT MOV A,H CMP D RC ;END JNZ CHKENS ;CHECK OVERFLOW MOV A,L CMP E RET ; CHKENS: INR A RNZ ;NOT END MOV A,D ORA A RNZ ;NOT END LHLD DSTADD CMP H RC ;END MOV A,E CMP L RET ; ; COPY DATA ; INPUT ; HL:SOURCE POINTER ; DE:DESTINATION POINTER ; BC:COUNTER ; COPY: MOV A,M STAX D INX H INX D DCX B MOV A,B ORA C JNZ COPY RET ; ; GET RESPONSE BY YES/NO ; INPUT ; HL:COMMENT POINTER ; OUTPUT ; A:-1 YES 0 NO ; GETYN: PUSH H ;SAVE COMMENT POINT CALL CONBOT ;PRINT COMMENT CALL RDCONS ;GET RESPONSE POP H LDA RDBUFF+2 CPI 'Y' STC JZ GETYNS ;GET YES ORA A JZ GETYNS ;CR IS NO CPI 'N' JNZ GETYN ;ERROR RETRY GETYNS: SBB A ;GET RESULT RET ; ; CONSOLE BUFFER READ ; RDCONS: LXI D,RDBUFF MVI C,CRDBUF CALL BDOS ;READ LXI H,RDBUFF+1 MOV E,M ;GET LENGTH MVI D,0 DAD D INX H ;GET END POINT+1 MVI M,0 ;SET END POINT RET ; ; PASS AREA OF INPUT FILE OFFSET ; PASOFF: STC CALL GETDAT ;OPEN INPUT FILE LHLD DOFSET ;GET OFFSET DATA PASOFL: MOV A,H ORA L RZ ;END OF OFFSET CALL GETINF ;GET ONE BYTE DCX H ;COUNT DOWN JNC PASOFL ;NOT TO END OF FILE, SO CHECK END LXI H,COFERR CALL CONBOT ;END OF FILE ERROR JMP ENDPRC ;TO END OF PROCESS ; ; LIST OUT ; LIST: LXI H,CURPNT INR M ;UP CUROSR COUNT MOV A,C CPI ' ' JNC LISTS ;NOT CONTROL CODE DCR M CPI CR JNZ $+5 MVI M,0 ;CARRIGARE RETURN SO CLEAR CPI HT JNZ LISTS LISTL: PUSH H MVI C,' ' CALL LIST POP H MOV A,M ANI 07H JNZ LISTL RET ; LISTS: MOV E,C MVI C,CLIST JMP BDOS ; ; GET ONE BYTE FROM INPUT FILE ; OUTPUT ; A:DATA ; CF:ON END OF FILE ; GETINF: PUSH H PUSH D PUSH B ORA A CALL GETDAT ;GET DATA POP B POP D POP H RET ; ; GET ONE BYTE DATA FROM INPUT FILE ; INPUT ; CF:ON OPEN FILE OFF GET DATA ; OUTPUT ; CF:ON END OF FILE ; A:DATA ; GETDAT: JNC GETDAN ;NORMAL MODE LXI D,INFCB CALL OPEN ;OPEN FILE CZ ERROR RET ; GETDAN: LXI D,INFCB CALL GETONE ;GET ONE BYTE FORM INPUT FILE RNZ ;OK STC ;END OF FILE RET ; ; PUT ONE BYTE TO PRINT OUT FILE ; INPUT ; C:DATA ; PUTPRN: LDA FLGLST ORA A JNZ PUTPRS ;ALREADY INITIALIZED CMA STA FLGLST ;SET INITIALIZE FLAG PUSH B LXI D,PRNFCB CALL CREATE ;CREATE FILE CZ ERROR POP B PUTPRS: LXI D,PRNFCB CALL OUTONE ;SET ONE BYTE TO LIST OUT FILE CZ ERROR RET ; ; PUT ONE BYTE TO SOURCE OUT FILE ; INPUT ; C:DATA ; PUTASM: LDA FLGASM ORA A JNZ PUTASS ;INITIALIZED CMA STA FLGASM ;SET INITIALIZED FLAG PUSH B LXI D,ASMFCB CALL CREATE ;CREATE SOURCE FILE CZ ERROR POP B PUTASS: LXI D,ASMFCB CALL OUTONE ;PUT ONE BYTE TO SOURCE FILE CZ ERROR RET ; ; OUTPUT ONE DATA ; INPUT ; C:DATA ; DE:USER FCB TOP ; OUTONE: PUSH H PUSH D PUSH B CALL OUTPUT ;OUT CODE POP B POP D POP H RNZ ;OK LXI H,CERWRT ;WRITE ERROR RET ; ; OUTPUT ONE CHARACTER BODDY ; INPUT ; C:DATA ; DE:USER FCB TOP ; OUTPUT ; ZF:ON ERROR ; OUTPUT: PUSH D LDAX D PUSH B MVI B,0 PUSH B CPI 128 JNZ OUTPUG ;NOT SECTOR BOUNDARY LXI H,38 DAD D MOV A,M ;GET SECTOR MAXIMUM COUNT DCX H INR M ;COUNT UP CURRENT COUNT CMP M JNZ OUTPUZ ;NOT TO BUFFER END OUTPUW: ;WRITE ONE DATA BLOCK POP PSW MVI M,0 ;CLEAR COUNTER OF SECTOR OUTPUL: ;ONE SECTOR WRITE LOOP PUSH H CALL SDMADD ;SET DMA ADDRESS MVI C,CWRITE CALL FILACC ;WRITE ONE SECTOR POP H ORA A JNZ OUTPUE ;WRITE ERROR INR M ;COUNT UP OF SECTOR MOV A,M INX H CMP M ;CHECK WITH END COUNT DCX H JNZ OUTPUL ;TO NEXT SECTOR MVI A,0 MOV M,A ;CLEAR SECTOR COUNT OUTPUE: PUSH PSW OUTPUZ: ;SECTOR TOP XRA A OUTPUG: ;GET CODE MOV C,A ;BIAS IN SECTOR MVI B,0 INR A STAX D ;INCRIMENT COUNT IN SECTOR DAD D ;??????? INX D STAX D DCX D CALL GETBPT ;GET CURRENT BUFFER TOP DAD B ;GET DATA POINT POP PSW POP B MOV M,C ;SET DATA POP D ORA A ;CHECK WRITE ERROR JZ OKEND ;NO ERROR STA CODWER ;SAVE ERROR CODE XRA A LDA CODWER RET ;ERROR END ; ; CLOSE FILE ; INPUT ; DE:USER FCB TOP ; CLOSE: INX D LDAX D DCX D ORA A JZ CLOSEB ;SECTOR BOUNDARY CALL GETBPT ;GET BUFFER TOP LDAX D MOV C,A ;BIAS MVI B,0 DAD B ;TO BIAS POINT CLOSEF: ;FILL BY EOF CODE CPI 128 JZ CLOSEN ;END OF SET UP MVI M,EOF ;SET CODE OF END OF FILE INX H INR A JMP CLOSEF ;TO NEXT BYTE ; CLOSEN: LXI H,37 DAD D ;GET SECTOR COUNT POINT MOV A,M INX H INR A MOV M,A ;SET MAX COUNT DCX H LXI B,CLOSEB PUSH B PUSH D PUSH H PUSH H JMP OUTPUW ;TO WRITE SECTORS & TO CLOSEB ; ; ; ; CLOSEB: MVI C,CCLOSE CALL FILACC ;CLOSE FILE CPI -1 RNZ ;OK LXI H,CERCLS ;CLOSE ERROR RET ; ; CREATE FILE ; INPUT ; DE:USER FCB TOP ; CREATE: PUSH D ;FILE MODE LXI H,14 DAD D MVI M,0 ;CLEAR COUNT MVI C,CDELET CALL FILACC ;DELETE FILE MVI C,CMAKE CALL FILACC ;MAKE FILE POP D CPI -1 JNZ OPEN ;OK LXI H,CERCRT ;CREATE ERROR RET ; ; OPEN FILE ; INPUT ; DE:USER FCB ; OPEN: PUSH D ;FILE MODE XRA A LXI H,37 DAD D MOV M,A ;CLEAR CURRENT SECTOR COUNT INX H INX H MOV A,M ;GET BUFFER LENGTH BY SECTOR COUNT DCX H MOV M,A ;SET MAX COUNT XRA A STAX D ;CLEAR COUNT INX D STAX D INX D LXI H,12 DAD D MOV M,A ;CLEAR COUNT INX H MOV M,A INX H MOV M,A INX H MOV M,A LXI H,32 DAD D MOV M,A ;CLEAR CURRENT RECODE MVI C,COPEN CALL BDOS ;OPEN FILE POP D CPI -1 RNZ ;OK LXI H,CEROPN ;OPEN ERROR RET ; ; SUCCESS END FLAG SET UP ROUTINE ; OUTPUT ; ZF:OFF ; OKEND: MVI A,1 ORA A ;RESET ZERO FLAG MVI A,0 RET ; ; GET ONE BYTE DATA ; INPUT ; DE:USER FCB ; OUTPUT ; A:DATA ; GETONE: PUSH H PUSH B LDAX D ORA A JZ GETONR ;NO DATA, SO READ DATA ANI 07FH JNZ GETONG ;GET DATA FROM BUFFER LXI H,37 DAD D INR M ;COUNT UP OF SECTOR COUNT MOV A,M INX H CMP M MVI A,0 JNZ GETONG ;NOT TO END OF BUFFER INX D ;END OF BUFFERED DATA LDAX D DCX D ORA A JZ GETONR ;NOT END OF FILE GETONB: ;END OF FILE XRA A ;SET ZERO FLAG AS ERROR MVI A,EOF POP B POP H RET ; GETONR: LXI H,37 DAD D MVI M,0 ;CLEAR SECTOR COUNT GETONL: ;ONE SECTOR READ LOOP PUSH H CALL SDMADD ;SET DMA ADDRESS MVI C,CREAD CALL FILACC ;READ FILE POP H ORA A JZ GETONN ;OK GET DATA MOV A,M ;END OF FILE ORA A JZ GETONB ;NO DATA IN BUFFER INX H MOV M,A ;SET SECTOR COUNT AS MAX SECTOR COUNT DCX H INX D STAX D ;SET END OF FILE MODE DCX D JMP GETONS ; GETONN: ;SUCCESS READ ONE SECTOR INR M ;COUNT UP CURRENT SECTOR COUNT MOV A,M INX H CMP M ;CHECK WITH MAX COUNT DCX H JNZ GETONL ;NOT TO END TO NEXT SECTOR READ GETONS: XRA A MOV M,A ;CLEAR CURRENT SECTOR COUNT GETONG: MOV C,A ;BIAS IN SECTOR MVI B,0 INR A STAX D ;COUNT UP OF COUNTER IN SECTOR CALL GETBPT ;GET BUFFER POINT DAD B ;GET TARGET POINT MOV A,M ;GET DATA POP B POP H RET ; ; FILE ACCESS OF BDOS ; INPUT ; C:FUNCTION CODE ; FILACC: PUSH D PUSH H INX D INX D ;GET FCB TOP CALL BDOS POP H POP D RET ; ; SET DMA ADDRESS BY USER FCB DATA ; INPUT ; DE:USER FCB TOP ; SDMADD: PUSH D CALL GETBPT ;GET DMA BUFFER XCHG MVI C,CSTDMA CALL BDOS POP D RET ; ; GET BUFFER POINT ; INPUT ; DE:USER FCB TOP ; OUTPUT ; HL:BUFFER POINT ; GETBPT: PUSH B LXI H,35 DAD D MOV C,M INX H MOV B,M ;GET BUFFER TOP INX H MOV A,M ;GET CURRENT SECTOR COUNT RAR MOV H,A ;*128 MVI A,0 RAR MOV L,A ;GET SECTOR BIAS DAD B ;GET TARGET SECTOR BUFFER TOP POP B RET ; ; PRINT COMMENT FOR ERROR ; DATA END BY ZERO OR CR ; INPUT ; HL:DATA POINT ; STPRNT: MOV C,M ;GET DATA XRA A CMP C JZ OKEND ;ZERO SO END CALL OUTONE ;OUT ONE CHARACTER RZ ;ERROR MVI A,CR CMP C INX H JNZ STPRNT ;NOT END CODE MVI C,LF JMP OUTONE ;LINE FEED & END ; ; SET UP OF USER FCB ; INPUT ; HL:SOURCE FCB POINT ; DE:USER FCB POINT ; ABC:FILE TYPE ; STFCB: XCHG MVI M,0 ;CLEAR SETUP/COUNT XCHG PUSH D PUSH H LXI H,11 DAD D MOV M,A ;SET INPUT FILE TYPE INX H MOV M,B INX H MOV M,C LXI H,2 DAD D ;GET FCB TOP XCHG POP H LXI B,9 ;COPY COUNT ORA A JNZ $+5 ;EXIST FILE TYPE MVI C,12 ;ALL COPY CALL COPY ;COPY FILE NAME PART POP D RET ; ; MAKE FILE NAME ; INPUT ; DE:USER FCB ; HL:SETUP BUFFER ; OUTPUT ; A:NAME LENGTH ; MKFLNM: PUSH B PUSH D PUSH H MVI B,0 INX D INX D LDAX D ;GET ENTRY TYPE ORA A JZ MKFLND ;DEFAULT DISK ORI '@' ;TO DISK NAME MOV M,A ;SET NAME INR B INX H MVI M,':' INX H INR B MKFLND: INX D MVI C,8 CALL CPYNAM ;SET FILE NAME MVI M,'.' INX H INR B MVI C,3 CALL CPYNAM ;SET FILE TYPE MVI M,0 ;SET END CODE MOV A,B ;NAME LENGTH POP H POP D POP B RET ; ; COPY FILE NAME ; INPUT ; DE:SOURCE POINTER ; HL:DESTINATION POINTER ; C:SOURCE LENGTH ; B:SETUP COUNT ; CPYNAM: LDAX D CPI ' ' JZ CPYNAS ;SPACE SO CANCEL LEFT DATA MOV M,A ;SET DATA INX H INX D INR B DCR C JNZ CPYNAM ;TO NEXT RET ;END OF SOURCE ; CPYNAS: INX D DCR C JNZ CPYNAS ;CANCEL READ RET ; ; ERROR STOP ; ERSTOP: CALL CONBOT ;NO INPUT FILE JMP TOP ; ; ERROR OF FILE I/O ; INPUT ; HL:ERROR COMMENT POINTER ; ERROR: PUSH H ;SAVE POINTER LXI H,BUFFNM CALL MKFLNM ;SET UP FILE NAME TO BUFFER LXI D,ERFCB ;DUMMY FCB FOR CONSOLE OUT CALL STPRNT ;PRINT POP H LXI D,ERFCB CALL STPRNT ;PRINT ERROR COMMENTS JMP TOP ;TO SYSTEM ; ; DUMMY FCB FOR ERROR PRINT ; ERFCB: DB 0FFH,CCONOT ; ; ERROR COMMENTS ; CEROPN: DB ' OPEN ERROR',CR CERWRT: DB ' WRITE ERROR',CR CERCLS: DB ' CLOSE ERROR',CR CERCRT: DB ' CREATE ERROR',CR CNOFIL: DB CR,LF,'NO INPUT FILE SPECIFIED - ABORTING',0 CNOFND: DB CR,LF,'INPUT FILE NOT FOUND - ABORTING',0 CABOTO: DB CR,LF,'ABORTED BY OPERATOR',0 ; ; COMMENTS ; CSTVER: DB '-2.20',CR,LF DB 'NUMERICAL INPUT BY HEXADECIMAL, DEFAULT IS SHOWN IN []',0 CSTRTA: DB CR,LF,'PROGRAM START ADDRESS [0]: ',0 CPREND: DB CR,LF,'PROGRAM END ADDRESS [FFFF]: ',0 COFFST: DB CR,LF,'PROGRAM OFFSET INTO FILE [0]: ',0 CASCDM: DB CR,LF,'ASCII DUMP [N]? ',0 CLISTP: DB CR,LF,'LISTING PASS [N]? ',0 CSURPS: DB CR,LF,'SOURCE OUTPUT PASS [N]? ',0 CCRREF: DB CR,LF,'LABEL CROSS REFERENCE PASS [N]? ',0 CLTOFL: DB CR,LF,'LIST OUTPUT TO DISK FILE [N]? ',0 CMITRF: DB CR,LF,'ALL INTERNAL IMMEDIATE DATA BY LABELS [N]? ',0 CMXTRF: DB CR,LF,'ALL EXTERNAL IMMEDIATE DATA BY LABELS [N]? ',0 CUTAB: DB CR,LF,'TABS IN OUTPUT [N]? ',0 CENBYT: DB CR,LF,'"BYTE" AREA ADDRESS SETS XXXX-YYYY',0 CENWRD: DB CR,LF,'"WORD" AREA ADDRESS SETS XXXX-YYYY',0 CADPER: DB CR,LF,'INVALID ADDRESS ENTRY, PAIR IGNORED!',CR,LF,0 CPSERR: DB '>> LABEL AT ' CPSERN: DB 'XXXX DID NOT MATCH THE PASS 1 SYMBOL TABLE! <<',0 CSYTOV: DB ' >> SYMBOL TABLE OVERFLOW OCCURED AT ' CSYTON: DB 'XXXX. <<',0 CABORT: DB CR,LF,'DIS-ASSEMBLY ABORTED!',0 COFERR: DB 'END OF FILE BEFORE PROGRAM OFFSET COMPLETE!',0 CEOFER: DB '>> UNEXPECTED END OF FILE <<',CR,LF,0 CPAGN: DB ' PAGE ' CPANM: DB 'XXXX',0 CCOMNT: DB ';',0 CASCII: DB '; ASCII DUMP',0 CNOEXC: DB '; >> NO EXECUTION PATH TO HERE <<',0 CUNRLB: DB '; UNRESOLVED LABELS',0 CLCRRF: DB '; LABEL CROSS REFERENCE',0 ; CPONE: DB ' PASS ONE:',0 CPLIST: DB ' LIST PASS:',0 CPSOUR: DB ' SOURCE OUT:',0 CPCREF: DB ' CROSS REF:',0 ; ; WRITE ERROR CODE ; CODWER: DB 0 ; ; INITIALIZE FLAG ; 0 NOT INITIALIZED ; FLGLSD: DB 0 ;LIST PRINT OUT PAGE FLGLST: DB 0 ;FOR LIST OUT FILE FLGASM: DB 0 ;FOR SOURCE OUT FILE ; ; FILE CONTROL BLOCKS ; INFCB: ;FOR INPUT FILE DS 35 DW INBUF DB 0,0,2 PRNFCB: ;FOR PRINT OUT FILE DS 35 DW LSTBUF DB 0,0,6 ASMFCB: ;FOR SOURCE FILE DS 35 DW ASMBUF DB 0,0,9 ; ; READ BUFFER ; RDBUFF: DB 80,0 DS 81 ; ; DSEG ; ; WORKING AREA ; DOFSET: DS 2 ;OFFSET DPRLNG: DS 2 ;PROGRAM LENGTH DSTADD: DS 2 ;START ADDRESS DENPNT: DS 2 ;END POINT MEOF: DS 1 ;END OF FILE MODE 0 NOT PLABLT: DS 2 ;LABEL AREA TOP PAVEND: DS 2 ;END OF FREE AREA PCURNT: DS 2 ;CURRENT ADDRESS PMODE: DS 1 ;PASS MODE -1 PASS ONE 0 LISTING 1 SOURCE ; ; DATA FOR LIST OUT ; PGCNT: DS 2 ;PAGE COUNT LNCNT: DS 1 ;LINE COUNT CURPNT: DS 1 ;CURSOR POINT ; ; WORK AREA FOR LINE DATA ; WKLABL: DS 8 ;LABEL DATA WKOPCD: DS 8 ;OPCODE WKOPRD: DS 48 ;OPRAND WKOPRE: DS 1 ;END CODE ; ; OPTION MODE DATA -1 YES 0 NO ; MASDMP: DS 1 ;ASCII DUMP MODE MLIST: DS 1 ;LISTING PASS MSOURC: DS 1 ;SOURCE OUTPUT PASS MCRREF: DS 1 ;CROSS REFERENCE PASS MLSTDV: DS 1 ;LIST OUT DEVICE 0 LISTER -1 FILE MTAB: DS 1 ;TAB MODE MITBL: DS 1 ;INTERNAL TABLE REFERENCE LABEL MODE MXTBL: DS 1 ;EXTERNAL TABLE REFERENCE LABEL MODE ; ; DECODING DATA BUFFER ; CDLABL: DS 3 ;CODE FOR LABEL & ADDRESS PCODE: DS 2 ;CODE DATA POINT CNCODE: DS 1 ;COUNT OF READ BYTE FROM INPUT FILE ; ; CODE READ BUFFER & LINE BUFFER ; BCODE: DS 8 ;CODE READ BUFFER LBUFER: DS 7 ;ADDRESS LBCODE: DS 17 ;CODE LBDATA: DS 64 ;DATA LBEND: DS 1 ; ; FILE NAME BUFFER FOR ERROR ; BUFFNM: DS 15 ; ; FILE READ WRITE BUFFER ; INBUF: DS 128*2 ;INPUT FILE BUFFER LSTBUF: DS 128*6 ;LIST OUT FILE BUFFER ASMBUF: DS 128*9 ;SOURCE OUT FILE BUFFER ; ; STACK AREA ; DS 64 STACK: ; ; DARTBL: ;DATA AREA TABLE & LABEL TABLE ; ; END