ORG 0100H XEQ 100H LXI SP,STAK STAK EQU 0CBFFH CALL 0C0D5H CLEAR SCREEN SPEED EQU 0C80BH SET DISPLAY SPEED LXI H,10H SHLD SPEED CUTAB EQU 0C83CH PUT COMMANDS IN SOLOS CUSTOM TABLE LXI H,'IN' SHLD CUTAB LXI H,NI SHLD CUTAB+2 LXI H,'SB' SHLD CUTAB+4 LXI H,BS SHLD CUTAB+6 LXI H,'SD' SHLD CUTAB+8 LXI H,DS SHLD CUTAB+10 LXI H,'FD' SHLD CUTAB+12 LXI H,DF SHLD CUTAB+14 LXI H,'AH' SHLD CUTAB+16 LXI H,HA SHLD CUTAB+18 LXI H,'ON' SHLD CUTAB+20 LXI H,NO SHLD CUTAB+22 LXI H,OFIL OUTPUT FILE BUFFER SHLD EOFP EOF POINTER XRA A STA WFLG SET WRITE FLAG TO ZERO LXI H,STP 980H BYTE AREA FOR SYMBOL TABLE SHLD SYMTB SYMTB POINTS TO IT MVI A,0FFH ST COMMAND NOT AVAILABLE MOV M,A FOR LARGE FILES YOU MAY HAVE TO INX H INCREASE THIS AREA MOV M,A CALL MI CALL ROUTINE WHICH GETS INPUT FILE RETRN JMP 0C004H SINP JMP 0C01FH SOUT JMP 0C019H SCONV JMP 0C33AH SIN EQU 0C01FH SOU EQU 0C019H PS JMP 0C310H PS IS PSCAN ROUTINE IN SOLOS HA CALL ADDRS CALL CRLF HALP LXI B,OBUF PUSH D PUSH B CALL HXSYM CALL BLANK MVI D,8 PUSH H HXLP MOV A,M CALL HXBYT INX H MOV A,M CALL HXBYT CALL BLANK INX H DCR D JNZ HXLP POP H MVI D,16 ALP MOV A,M CPI 7FH JP FILL CPI 5FH JZ FILL CPI 20H JP ASOUT FILL MVI A,2EH ASOUT STAX B INX B INX H DCR D JNZ ALP MVI A,0DH STAX B POP B CALL OUTLN POP D CALL CHLDE JNC HALP RET DS CALL ADDRS CALL CRLF DSLP LXI B,OBUF PUSH D PUSH B CALL DISA1 POP B LDAX B CPI 20H THIS WAS AN ERROR IN THE DDJ ARTICLE JNZ DISPL LXI B,OBFNL DISPL CALL OUTLN POP D CALL CHLDE JNC DSLP RET OUTLN LDAX B CPI 0DH JZ CRLF PUSH B MOV B,A CALL SOUT POP B INX B JMP OUTLN CRLF CALL CKWT MVI B,0DH CALL SOUT MVI B,0AH CALL SOUT MVI B,0 CALL SOUT JMP SOUT CHLDE MOV A,E SUB L MOV A,D SBB H RET ADDRS CALL SCONV PUSH H LXI H,3FFFH CALL PS PS IS PSCAN POP D XCHG RET CKWT CALL SINP RZ ANI 7FH JZ RETRN CPI 20H RNZ PAUSE CALL SINP JZ PAUSE ANI 7FH JZ RETRN RET BS CALL ADDRS BSLP LXI B,OBUF PUSH D CALL DISL JNC BSECK PUSH H XCHG CALL LKUPA JC POPH XCHG MOV M,E INX H MOV M,D INX H MVI M,0FFH INX H MVI M,0FFH POPH POP H BSECK POP D CALL CHLDE JNC BSLP RET LKUPA EQU $ XCHG LHLD SYMTB XCHG CMPLP LDAX D CPI 0FFH JZ CKEOT CMPR1 CMP L INX D JNZ SKP2 LDAX D INX D CMP H JNZ CMPLP STC RET SKP2 INX D JMP CMPLP CKEOT EQU $ INX D LDAX D CPI 0FFH DCX D LDAX D JNZ CMPR1 RET DF CALL ADDRS PUSH H PUSH D LDA WFLG HAVE WE BEEN HERE BEFORE? CPI 1 JZ CONT YES?, CONTINUE CALL MO NO?, SELECT OUTPUT FILE CONT POP D POP H DFLP PUSH H LHLD EOFP MOV B,H MOV C,L POP H PUSH D CALL DISA1 THIS VERSION HAS NO LINE NUMBERS MVI A,1 STAX B MOV A,B STA EOFP+1 MOV A,C STA EOFP PUSH H LXI H,EOFP CHECK TO SEE IF OUTPUT BUFFER IS WITHIN MOV E,M ONE LINE OF BEING FULL INX H MOV D,M XCHG LXI D,STP-64 CALL CHLDE JNC CON NO?, DISASSEMBLE ANOTHER LINE CALL WRT YES?, WRITE THE BUFFER TO THE DISK FILE POP H POP D CALL CHLDE END OF INPUT FILE? JNC DFLP NO?, CONTINUE CALL CONMS YES?, DISPLAY OPTIONS RET CON POP H POP D CALL CHLDE END OF INPUT FILE? JNC DFLP NO?,CONTINUE CALL WRT YES?, WRITE BUFFER TO DISK CALL CONMS DISPLAY OPTIONS RET DISA1 CALL LKUPA JC DISL PUSH H LHLD SYMTB XCHG CALL CHLDE POP H JC DISNL DISL EQU $ CALL HXSYM DISNL EQU $ PUSH B CALL GTPTR POP B CALL BLANK LDAX D ANI 1FH ADI 'A'-1 STAX B INX B INX D LDAX D ANI 1FH JZ BACK1 ADI 'A'-1 STAX B INX B INX D LDAX D ANI 1FH JNZ OPCH3 MVI A,' '-'A'+1 OPCH3 ADI 'A'-1 STAX B INX B LDAX D ANI 0E0H RLC RLC RLC PUSH B LXI B,OL4TB ADD C MOV C,A MVI A,0 ADC B MOV B,A LDAX B POP B STAX B INX B DCX D BACK1 DCX D LDAX D ANI 0E0H PUSH PSW CPI 0E0H CNZ BLANK POP PSW JZ CKLNG PUSH D CPI 60H PUSH PSW JZ FS2 MOV A,M RRC RRC RRC ANI 7 MOV D,A POP PSW PUSH PSW JNC CKN MOV A,D ANI 6 MOV D,A CPI 6 JNZ FD2 POP PSW PUSH PSW CPI FRPP JZ RPPSW MVI A,'S' STAX B INX B MVI A,'P' JMP LSTOV RPPSW MVI A,'P' STAX B INX B MVI A,'S' STAX B INX B MVI A,'W' JMP LSTOV CKN CPI 0C0H JNZ CKCND MOV A,D ADI '0' JMP LSTOV CKCND CPI 0E0H JNZ FD2 MOV A,D RLC LXI D,CNDTB ADD E MOV E,A MVI A,0 ADC D MOV D,A LDAX D STAX B INX B INX D LDAX D STAX B INX B MVI A,' ' STAX B INX B JMP LSTOV FD2 EQU $ MOV A,D CALL REGDE POP PSW PUSH PSW CPI 0A0H LDAX D JNZ LSTOV STAX B INX B CALL COMMA FS2 EQU $ MOV A,M ANI 7 CALL REGDE LDAX D LSTOV EQU $ STAX B INX B POP PSW POP D CKLNG INX H INX D PUSH PSW LDAX D POP D RLC RLC RLC ANI 3 JZ CR MOV E,A MOV A,D ORA A JZ BYT2 CPI 0E0H CNZ COMMA BYT2 MOV A,E MOV E,M INX H CPI 2 JM LNG2 MOV D,M INX H XCHG CALL HXSYM XCHG STC JMP CR2 LNG2 MVI A,'0' STAX B MOV A,E RRC ANI 7FH CPI 050H MOV A,E JM PRFXD INX B PRFXD CALL HXBYT MVI A,'H' STAX B INX B CR XRA A CR2 MVI A,0DH JMP LOUT BLANK MVI A,' ' LOUT STAX B INX B RET COMMA MVI A,',' JMP LOUT REGDE LXI D,REGTB ADD E MOV E,A MVI A,0 ADC D MOV D,A RET HXSYM MVI A,'H' STAX B INX B MOV A,H CALL HXBYT MOV A,L HXBYT PUSH PSW RRC RRC RRC RRC CALL HXNBL POP PSW HXNBL ANI 0FH ADI '0' CPI '9'+1 JC LOUT ADI 'A'-'9'-1 JMP LOUT GTPTR EQU $ MOV A,M CPI 40H JNC CKG1 LXI D,GRP0X JMP LKUPX CKG1 CPI 80H JNC CKG2 CPI 76H MVI A,8 JZ GOTX INR A JMP GOTX CKG2 CPI 0C0H JNC GRP3 RRC RRC RRC ANI 7 JMP GOTX GRP3 EQU $ LXI D,GRP3X LKUPX ANI 3FH ADD E MOV E,A MVI A,0 ADC D MOV D,A LDAX D GOTX EQU $ LXI D,OPTAB MOV C,A ADD C ADD C ADD E MOV E,A MVI A,0 ADC D MOV D,A RET OL4TB EQU $ DW 'D ' DW 'HG' DW 'XL' CNDTB EQU $ DW 'ZN' DW ' Z' DW 'CN' DW ' C' DW 'OP' DW 'EP' DW ' P' DW ' M' REGTB EQU $ DW 'CB' DW 'ED' DW 'LH' DW 'AM' AA EQU 1 BB EQU 2 CC EQU 3 DD EQU 4 EE EQU 5 HH EQU 8 II EQU 9 JJ EQU 10 LL EQU 12 MM EQU 13 NN EQU 14 OO EQU 15 PP EQU 16 RR EQU 18 SS EQU 19 TT EQU 20 UU EQU 21 VV EQU 22 XX EQU 24 L2 EQU 20H L3 EQU 40H OL4D EQU 32 OL4G EQU 64 OL4H EQU 96 OL4L EQU 128 OL4X EQU 160 FRPS EQU 32 FRPP EQU 64 FS EQU 96 FD EQU 128 FDS EQU 160 FN EQU 192 FC EQU 224 OPTAB EQU $ DB AA+FS DB DD DB DD DB AA+FS DB DD DB CC DB SS+FS DB UU DB BB DB SS+FS DB BB DB BB DB AA+FS DB NN DB AA DB XX+FS DB RR DB AA DB OO+FS DB RR DB AA DB CC+FS DB MM DB PP DB HH DB LL DB TT DB MM+FDS DB OO DB VV DB MM+FD DB VV+L2 DB II DB DD+FD DB CC DB RR DB II+FD DB NN DB RR DB LL+FRPS DB XX+L3 DB II DB LL DB DD+L3 DB AA DB SS DB TT+L3 DB AA DB LL DB HH+L3 DB LL+OL4D DB SS DB HH+L3 DB LL+OL4D DB LL+FRPS DB DD DB AA+OL4X DB SS+FRPS DB TT DB AA+OL4X DB XX DB CC DB HH+OL4G DB AA DB DD+L2 DB II DB AA DB CC+L2 DB II DB SS DB UU+L2 DB II DB SS DB BB+L2 DB II DB II+FRPS DB NN DB XX DB DD+FRPS DB CC DB XX DB DD+FRPS DB AA DB DD DB DD DB AA DB AA DB AA DB NN+L2 DB II DB XX DB RR+L2 DB II DB OO DB RR+L2 DB II DB CC DB PP+L2 DB II DB RR DB LL DB CC DB RR DB RR DB CC DB RR DB AA DB LL DB RR DB AA DB RR DB CC DB MM DB AA DB CC DB MM DB CC DB SS DB TT DB CC DB JJ DB MM+L3 DB PP DB JJ+FC DB L3 DB 0 DB CC DB AA+L3 DB LL+OL4L DB CC+FC DB L3 DB 0 DB RR DB EE DB TT DB RR+FC DB 0 DB 0 DB RR+FN DB SS DB TT DB PP DB CC DB HH+OL4L DB PP+FRPP DB UU DB SS+OL4H DB PP+FRPP DB OO DB PP DB XX DB TT DB HH+OL4L DB SS DB PP DB HH+OL4L DB II DB NN+L2 DB 00 DB OO DB UU+L2 DB TT DB EE DB II DB 00 DB DD DB II DB 00 DB NN DB OO DB PP DB UU DB NN DB DD GRP0X EQU $ DB 56 DB 13 DB 19 DB 25 DB 12 DB 11 DB 10 DB 33 DB 57 DB 27 DB 18 DB 26 DB 12 DB 11 DB 10 DB 34 DB 57 DB 13 DB 19 DB 25 DB 12 DB 11 DB 10 DB 35 DB 57 DB 27 DB 18 DB 26 DB 12 DB 11 DB 10 DB 36 DB 57 DB 13 DB 17 DB 25 DB 12 DB 11 DB 10 DB 28 DB 57 DB 27 DB 16 DB 26 DB 12 DB 11 DB 10 DB 37 DB 57 DB 13 DB 15 DB 25 DB 12 DB 11 DB 10 DB 39 DB 57 DB 27 DB 14 DB 26 DB 12 DB 11 DB 10 DB 38 GRP3X EQU $ DB 45 DB 49 DB 41 DB 40 DB 43 DB 48 DB 21 DB 46 DB 45 DB 44 DB 41 DB 57 DB 43 DB 42 DB 22 DB 46 DB 45 DB 49 DB 41 DB 53 DB 43 DB 48 DB 23 DB 46 DB 45 DB 57 DB 41 DB 52 DB 43 DB 57 DB 24 DB 46 DB 45 DB 49 DB 41 DB 50 DB 43 DB 48 DB 29 DB 46 DB 45 DB 47 DB 41 DB 20 DB 43 DB 57 DB 30 DB 46 DB 45 DB 49 DB 41 DB 55 DB 43 DB 48 DB 31 DB 46 DB 45 DB 51 DB 41 DB 54 DB 43 DB 57 DB 32 DB 46 OBFNL ASC ' ' OBUF DS 64 SYMTB DS 2 MI CALL CLR CLEAR SCREEN CALL MSGI PUT UP INPUT FILE MESSAGE LXI H,IBUFI INPUT FILE NAME TO BUFFER IMF CALL SIN KEYBOARD INPUT JZ IMF MOV M,A MOVE TO BUFFER CPI 0DH C/R? SET ZERO FLAG IF SO PUSH PSW MOV B,A CNZ OUTR ECHO TO SCREEN IF NOT C/R POP PSW INX H JNZ IMF CONTINUE IF NOT C/R PI MVI A,PSOP+40H PSCAN WILL OPEN INPUT FILE LXI H,IBUFI INPUT FILE NAME IN IBUFI LXI D,OBUFI OUTPUT BUFFER FOR PSCAN CALL PSCAN JC ERR CARRY IS ERROR JZ ERR HERE, SO IS ZERO MOV A,E CPI 0FFH 0FFH IN E IS ERROR JZ ERR STA IFN GOT FILE NUMBER READ LXI H,OFP READ INPUT FILE INTO MEMORY LDA SYSGLO+GLLOW DOUBLE PRECISION SUBTRACTION SUB M GLLOW MINUS START OF INPUT FILE MOV C,A INX H LDA SYSGLO+GLLOW+1 SBB M MOV B,A BC NOW HAS MAX # BYTES READ LXI D,OFP DE HAS START ADDRESS MVI L,1 L HAS DELIMITER LDA IFN A HAS FILE NUMBER CALL SYS DB DRDOP DELIMITED READ JMP RERR ERROR RETURN NRET XCHG NORMAL RETURN, NOW HL HAS END OF SHLD EOOFP INPUT FILE. PUT IT IN EOOFP LDA IFN CALL SYS DB CLOOP CLOSE INPUT FILE JMP ERR1 ERROR RETURN JMP IFLOC DISPLAY INPUT FILE NAME, START & END ADDRESSES CLR PUSH H SAVE REGISTERS & CLEAR SCREEN PUSH D PUSH B PUSH PSW CALL 0C0D5H POP PSW POP B POP D POP H RET RERR CPI 18H AVOID ERROR MESSAGE IF INPUT FILE HAS NO EOF JZ NRET MARK JMP ERR1 IFLOC CALL CLR BINARY-HEX CONVERSION, DISPLAY LXI H,IBUFI FILE NAME, ADDRESSES, ETC. IFL1 MOV A,M HL POINTS TO INPUT FILE NAME (BUFFER) CPI 0DH CHARACTER TO A, IS IT C/R? JZ IFL2 YES? OUTPUT 'IS LOADED FROM' MOV B,A CALL OUTR NO?, PUT TO SCREEN INX H JMP IFL1 IFL2 LXI H,MS3 OUTPUT MESSAGE 3 IFL2B MOV A,M CPI 0FFH JZ IFL2A MOV B,A CALL OUTR INX H JMP IFL2B IFL2A CALL CONV BIN-HEX CONV & PUT TO SCREEN IFL3 LXI H,MS4 OUTPUT MESSAGE 4 IFL3B MOV A,M CPI 0FFH JZ IFL3A MOV B,A CALL OUTR INX H JMP IFL3B IFL3A CALL CONV2 NOW PUT END ADDRESS TO SCREEN IFL4 LXI H,MS5 OUTPUT MESSAGE 5 IFL4B MOV A,M CPI 0FFH JZ IFL5 MOV B,A CALL OUTR INX H JMP IFL4B IFL5 LXI H,MS6 OUTPUT MESSAGE 6 IFL5B MOV A,M DISPLAYS COMMANDS AVAILABLE CPI 0FFH RZ MOV B,A CALL OUTR INX H JMP IFL5B CONMS CALL CLR LXI H,MSCON OUTPUT OPTIONS MESSAGE CONM1 MOV A,M CPI 0FFH JZ OPT MOV B,A CALL OUTR INX H JMP CONM1 OPT CALL SIN INPUT OPTIONS FROM KEYBOARD JZ OPT CPI 'C' RZ CPI 'R' JZ DOS JMP OPT DOS LDA OFN CLOSE OUTPUT FILE AND RETURN TO PTDOS CALL SYS DB CLOOP JMP ERR1 CALL SYS DB RETOP MO CALL CLR CLEAR SCREEN CALL MSGO OUTPUT FILE MESSAGE LXI H,IBUFO OUTPUT FILE NAME TO BUFFER OMF CALL SIN ALL THIS SAME AS IMF JZ OMF MOV M,A CPI 0DH PUSH PSW MOV B,A CNZ OUTR POP PSW INX H JNZ OMF PO MVI A,PSCO+40H OPEN OR CREATE AND OPEN OUTPUT FILE LXI H,IBUFO LXI D,OBUFO BUFFER FOR PSCAN CALL PSCAN JC ERR JZ ERR MOV A,E CPI 0FFH JZ ERR STA OFN GOT FILE NUMBER MVI A,1 SET WFLG - STAY WITH SAME OUTPUT FILE STA WFLG CALL CLR APND LXI H,APMSG OUTPUT MESSAGE. IF OUTPUT FILE ALREADY APND1 MOV A,M EXISTS, CAN EITHER APPEND TO IT, OR CPI 0FFH OVERWRITE IT. JZ APND2 MOV B,A CALL OUTR INX H JMP APND1 APND2 CALL SIN INPUT CHOICES FROM KEYBOARD JZ APND2 CPI 'C' CONTINUE, IF NEW FILE RZ CPI 'O' OVERWRITE IF EXISTING FILE RZ CPI 'A' APPEND IF EXISTING FILE JZ APND3 JMP APND2 APND3 LDA OFN FILE NUMBER TO A MVI D,-1 SET CURSOR TO EOF CALL SYS DB SPAOP JMP ERR1 LDA OFN CURSOR NOW POINTING TO EOF LXI B,1 LET'S MOVE IT BACK ONE SPACE MVI D,128 CALL SYS DB SPAOP JMP ERR1 RET WRT LDA OFN THIS DOES A DELIMITED WRITE OF THE LXI B,0FF0H BUFFER TO THE OUTPUT FILE LXI D,OFIL MVI L,1 CALL SYS DB DWROP JMP ERR1 LXI H,OFIL SHLD EOFP LDA OFN LXI B,1 MOVE FILE CURSOR BACK ONE BYTE, SO WE MVI D,128 DON'T HAVE EOF MARKS SCATTERED THROUGHOUT CALL SYS THE FILE DB SPAOP JMP ERR1 RET MSGI LXI H,MSI THIS PUTS THE INPUT FILE MESSAGE MSGI1 MOV A,M TO THE SCREEN CPI 0FFH RZ MOV B,A CALL OUTR INX H JMP MSGI1 MSGO LXI H,MSO THIS PUTS THE OUTPUT FILE MESSAGE MSGO1 MOV A,M TO THE SCREEN CPI 0FFH RZ MOV B,A CALL OUTR INX H JMP MSGO1 OUTR PUSH H SAVE REGISTERS AND PUT 'B' TO SCREEN PUSH D PUSH B PUSH PSW CALL SOU POP PSW POP B POP D POP H RET NI JMP 100H NEW INPUT FILE - JUMP TO START NO LDA OFN NEW OUTPUT FILE - CLOSE OLD FILE CALL SYS DB CLOOP JMP ERR1 CALL MO GET NEW FILE JMP RETRN MSI ASC 'ENTER INPUT FILE NAME - C/R ' DB 0FFH MSO ASC 'ENTER OUTPUT FILE NAME - C/R ' DB 0FFH ERR1 MOV E,A ERROR CODE FROM A TO E ERR LXI H,EM PROCESS ERROR RETURNS VIA UTIL MOV M,E MVI A,84H CALL UTIL DB UXOP JMP ERR DB -1 EM DS 1 JMP RETRN MS3 ASC ' IS LOADED FROM ' DB 0FFH MS4 ASC 'H TO ' DB 0FFH MS5 ASC 'H' DB 0FFH MS6 DB 0DH DB 0AH ASC 'THE FOLLOWING COMMANDS ARE AVAILABLE' DB 0DH DB 0AH ASC 'BS ADDR1 ADDR2 - BUILD SYMBOL TABLE' DB 0DH DB 0AH ASC 'DS ADDR1 ADDR2 - DISASSEMBLE TO SCREEN' DB 0DH DB 0AH ASC 'DF ADDR1 ADDR2 - DISASSEMBLE TO DISK FILE' DB 0DH DB 0AH ASC 'NIF - NEW INPUT FILE' DB 0DH DB 0AH ASC 'NOF - NEW OUTPUT FILE' DB 0DH DB 0AH ASC 'HA ADDR1 ADDR2 - HEX-ASCII DUMP' DB 0FFH MSCON DB 0DH DB 0AH ASC 'TYPE "C" TO CONTINUE DISASSEMBLY TO DISK FILE' DB 0DH DB 0AH ASC 'TYPE "R" TO RETURN TO PTDOS ' DB 0FFH APMSG ASC 'FOR EXISTING FILE, TYPE "A" TO APPEND DATA TO FILE' DB 0DH DB 0AH ASC ' "O" TO OVERWRITE FILE' DB 0DH DB 0AH ASC 'FOR NEW FILE, TYPE "C" TO CONTINUE ' DB 0FFH CONV LXI H,OFP+4 THIS ASSUMES THAT INPUT FILES ARE IMAGE CONV1 MOV A,H FILES. IF SO, YOU WILL WANT TO START CALL HEOUT DISSASEMBLY AT THE FIFTH BYTE. IF YOU MOV A,L ARE USING NON-IMAGE FILES, LXI H,OFP. CALL HEOUT THE REST OF THIS IS BIN-HEX CONV TO RET SCREEN, ETC. HEOUT MOV C,A RRC RRC RRC RRC CALL HEOU1 MOV A,C HEOU1 ANI 0FH ADI 48 CPI 58 JC OUTH ADI 7 OUTH MOV B,A JMP SOUT CONV2 LXI H,EOOFP MOV A,M MOV E,A INX H MOV A,M MOV D,A XCHG DCX H JMP CONV1 OBUFI DS 20 DB 0AEH FILE TYPE, FOR PSCAN DW 04C0H BLOCK SIZE, FOR PSCAN DB 0 NO PROTECTION ATTRIBUTES OBUFO DS 20 IBUFI DS 10 IBUFO DS 10 EOOFP DS 2 IFN DS 1 OFN DS 1 EOFP DS 2 WFLG DS 1 OFIL DS 1000H STP DS 980H OFP EQU $ COPY NPTDEFS END