IMD 1.16: 31/05/2007 19:57:56 FOGCPM.109 --FOGCPM109CALL-CPMCOMz CALL-CPMDOC$DASM ZLGz !"#$%&'DIS COM&()*+,DIS INS(-./01DIS AQM23456789:;<=>?@ADIS AQMVBCDEFGHIJKL-07-00 86 DISASM AQMMNOPQRSTUVWXYZ[\DISASM AQM]-CPM109 DOCDISASM DOC0^_`abcDISSAM ASMdefghijklmnopqrsDISSAM ASM1tuvwxyzDISSAM DOC{EM2 COM|}~EM2 DOC#EM2 ASMEM2 ASM0MSA15 COM3MSA15 DOCMSA INFZDIS COM$This is the disk name. ò%́!!9s!c">=!'"@=!"@=!"=!"=!}2B=!D}2C=!I}2D=!R}2E=!}2F=!}2G=!!B=*=3!\"=!"=!"=!͞!9s#r!9^!eʐ!9^!Eʐ!=*>=!\͐*@=*@=!͐*=*=!͐*=*=!͐!͐*=*=!K͐*=*=!y͐*=*=!͐!G!͐!!%!9s!9^!e!9^!E!G!!9^!1)!9^!2<l!9^!3O< !9^!4b !9^!5u7 !9^!Gʍ! INTERACTIVE CP/M FUNCION CALL EXERCISERBY: Superior Software Corporation 01/05/84 YOU have 5k of user definable memory starting at %5u ( %4x ) ------MENU------- | ------VARIABLES------- E...Exit to CP/M | A = %5u %4x 1...View memory | BC = %5u %4x 2...Do BDOS CALL | DE = %5u %4x 3...Build FCB | HL = %5u %4x 4...View FCB&BFR | ----MEMORY POINTERS---- 5...change a var. | PFCB= %5u %4x | PBFR= %5u %4x | PMSC= %5u %4x Your Choice ́! 9^#V̀́!G!! 9s!1!(͐!9!!Z!9͑4L!! 9s*=! 9s#r!!_!9͑4v!! 9s*=! 9s#r!!d!9͑4 !! 9s*=! 9s#r!!i!9͑4!! 9s*=! 9s#r! 9^z!! 9^#V You can view memory addressed by one of the following pointersPBFR, PFCB, PMSC or HL Which to use ? PBFRPFCBPMSCHĹ!G!1!G!1! 1͎!9s!9^!y!9^!Y*@= 4*@=*@= *@=!*@="*=*@=%">=*@= 5:*@=4:*=*@=%">=*@=v*@=v*@=v*@=v*@= ʆ*=*@=%"=!,W A R N I N G - SOME CALLS SUCH AS (19) MAY BE DANGEROUSYou should have your BC variable set to the CP/M function and your DE variable set if needed. PROCEED ? (Y/N) ́!\!9s#r!G! ͐!9^!9^V3!9s#r!G!9^#V!9s! ͐!9*=! 9&!9^!9^#VsEnter Drive # Default=0,A=1,B=2,C=3,...G=7 (?=63) Enter the file name and type ́!\!9s#r!!9^#V ́!G!!9s!1 ͐!9!9x4!9s#r!9^o5ʤ !G!e 1!=!9^#V!9! ͑4 !!9s!9V3"@=!9^#V!9! ͑4B !!9s!9V3"=!9^#V!9! ͑4q !!9s!9V3"=!9^#V!9! ͑4  !!9s!9V3"=!9^#V!9! ͑4 !!9s!9V3"=!9^#V!9! ͑4 !!9s!9V3"=!9^z0 !G! 1!}}|!}|!}|}|?>o&zo&| }|>o&|o&z2c9%:c9||0/g}/o#z>/W{/_>DM!>2b9))Q#}o|gi :b9=2b9I}:b9=2b9I}DM!>))҈ =€}}/o|/g#}||g}o{_|I|7g}o·{_)}}o|gN#F# N#F#z{##^#VBK^#Vz#y####x#~#fo}|>?o&}|>o&{_|g}oI|g}o~# x^!9d9~#y!|7́!<"j9!9!9^#V!ó! 9^#V"j9!9!9^#V!ó*j9!9^#Vͳ́! 9^#VBK!</ /`i#DM+s!`isW`i! 9~#foW!! 9^#V́! 9^#V!9~#fo+s#r!ʹ!9^#VDMʹ`i#+s`i ¹o!u`i! 9~#fo!! 9^#V́! 9N#FGp`i~#fo+s#r! -́! 9N#F`i~g!<`i#DM+^ͳd!=!9s#r#+^!0^ 9^ !>9^#V! x!>9s#r .ʹ !!@9s#r#+^!0ʹ 9ʹ !@9^#V! x!@9s#ru l #+^!:9!T9~#fos#r55Ø!d+!!:9!T9~#fo##s#r++^#VF95Ø!eO!fO!gu!!9!T9~#fos#ra9a9Ø!!:9!T9~#fo##s#r++^#V895B#!9!!>955$!9!49s#ri#!:9559"!9! !>95765͂$!9!49s#r!-!69~#fo+s#rs:"!9! !>955͂$!9!49s#ri#!9! !>955$!9!49s#ri#!9!!>955$!9!49s#ri#!:95Y9!49s#rx4!89s#rÁ#eʽ"!"!!B9^#V!"!"!B9^#V!9! 9a9a9a9!9! 9!49s#rx4!89s#r!!@9s#rÁ#!:95Y9!9!69s#rsi#o!d!u="xc"s"e"f"c#,#!9!49~#fo!89s#r!89^#V!@9~#foʤ#!@9^#V!89s#r!D9~##!>9~#fo+s#r#!89~#fo#!B9^#V`ìî#!!69s#r#!69~#fo#s#r!49^#V~<$!69^#V!@9~#fo<$!49~#fo#s#r+^`ì#!D9~#s$!>9~#fo+s#r#!89~#fos$! `ìF$~$`ìǺ!9N#F!9^#V`iF95!956ͼ7Y9r9^+s! 9`iF9(65͂75G6˜$́!9N#F!9^#V! 9559ʚ%! 95Y9p! 9!955975;65`iͪF95!956ͼ7Y9)r9^+s! 9`iͪF9(65͂75!955͂$!9*&ù%i%i*d9DM*f9o&i%o&i*d9*+++*f9DM*h9!9N#F#^#Vkb6#> 6 #=&>6#=& : >R& Aڌ&[C&@O&aڌ&{Ҍ&`w# .m&ʆ&U&͓&w#V&{o|g ʆ&͓&w#w&!!|a{ !9^#V*9!9}|ھ&*9"9|!́!!!93!:o&p9s!("9!9DM!"A:*A:ʕ(`i^! *'`i^! 2'`i#DM'`i^zʕ(`i^!>S'!g'`i^!<F(!`i#DM^! †'`i^! ʉ'g'`i`i#DM~'`i^! ´'`i^! '!`i#DM+s'Î'*|'!?)'!_)C(!(!S4!;4!(!;4!x4!! 0! (Ò(`i*A:#"A:+)9s#r`i#DM~ʒ(`i^! €(`i^! ʏ(!`i#DM+sÒ(Z('!9*A:@(Can't open file for redirection: ́! 9~#(!(03͹%A:$$$.SUB́!"<!́!con:CON:lst:LST:prn:PRN:pun:PUN:rdr:RDR:́!9^#V!!9^#V_)́!K=!!9s#rÑ)!9~#fo#s#r!9^#V! ʳ)nf(½)x)!"4C4>4# *4!M4!}!}!9^#V#~#foxu4~u4# d4!9~#foʍ4#Ä4}!9^#V#^#V#N#F*4!9^#V#^#V#N#Fd4!9^#V#~#foxu4~4# 4d4!9^#V#^#V#N#F4!9^#V#n~55#5!|!9^#V#n45#+5x5 +~455!9~ i5 i5 i5~5!9~A~5[~5!}!9~a~5{i5!!9~0~5:~5i5!9~aڦ5{Ҧ5 o&!9~Aڼ5[Ҽ5 o&!*(=5!*&=w#w#w#w*&=~#~#~#~"<*&=V+^+V+^*<"<*(=s#r#s#r*<*(=*&="(="&=*&=>w#=6*&=~9#L68=ɯ<*&=*(=###{6]66Y6Y6]6+6*&=*(=#6*&=*(=#³6*&=*(=#6*&=*(=#6*&=*(=#6*&=~/w#7*(=~?G*&=^#V#~#fo))'7#7DM*&=s#r#q#p*(=~?W*&=###~^7~w+P7L77~w+b7^7~#s7O:6*&= 2 2= 3.0) ;This routine is the ZILOG mnemonic disassembler module for ZZSOURCE.ASM. ;It must replace the DASM.TDL module in ZESOURCE (ver. >= 3.0) ; DASM: CALL HSYM ;WRITE A SYMBOL IF IT EXISTS ;.. AND PUT PC ON THE CRT LHLD RPLPTR ;SEE IF THIS LINE IS REPLACED MOV A,H ORA L JZ DASM1 MOV B,M INX H ;SKIP THE '*' DCR B CALL NWLN0 ;PRINT THE REPLACING LINE AS A COMMENT MVI A,0FFH STA REPLSW ;INDICATE NO MORE PRINTING DASM1: LHLD PC XCHG LHLD OFFSET DAD D ;HL IS NOW THE BIASED PC SHLD BIASED XCHG ;DE IS NOW THE BIASED PC INX H SHLD PC ;THE NEW PC (NEXT BYTE) XCHG ;DE IS THE BYTE AFTER THE INSTRUCTION MOV B,M LXI H,OPC-4 CALL GTCD CALL TYPEOC CPI 0AH ;TYPES 0 THRU 9 ARE 1 BYTE JC OLDPC ; .. SO DON'T CHANGE THE PC LHLD PC INX H CPI 10H ;TYPES 0A THRU 0FH ARE 2-BYTERS JC NEWPC CPI 16H ;TYPES 10H THRU 15H ARE 3 BYTES JNC NEWPC INX H NEWPC: SHLD PC OLDPC: PUSH D ;SAVE THE 'E' REGISTER (MAY BE 'X' OR 'Y') MOV E,A  MVI D,0 LXI H,JMPTBL DAD D ;ADD 2*OPCODE TYPE TO JMPTBL TO GET DAD D ;.. ROUTINE ADDRESS MOV E,M INX H MOV D,M XCHG ;HL NOW CONTAINS THE ROUTINE ADDRESS POP D PUSH H LHLD BIASED RET ;'RETURN' TO THE ROUTINE ; GTCD: LXI D,4 NXTCD: DAD D NXTCD1: MOV A,M ORA A ;SEE IF WE'RE AT THE NEXT MASK YET INX H JP NXTCD1 ;JUMP IF NOT ANA B ;MASK OUT VARIABLES IN THE INSTRUCTION CMP M ;CHECK THE GENERIC INSTRUCTION TYPE JNZ NXTCD INX H MOV A,M ;AFTER A MATCH, GET THE OPCODE TYPE STA OPCTP RET ; TOC2: CPI 20H ;CONVERT SPACES IN THE TABLE TO TABS JNZ TOC1 MVI A,9 TOC1: CALL TYPE TYPEOC: INX H ;TYPE THE OPCODE THAT HL IS POINTING TO MOV A,M ORA A JZ TYPEOC JP TOC2 LHLD PC LDA OPCTP RET ; JMPTBL: DW T0 ;SIMPLE 1 BYTE INSTRUCTIONS DW T1 ;8 BIT, REGISTER ARITHMETIC & LOGICAL DW T2 ;DEC & INC DW T3 ;DOUBLE REGISTER SINGLE BYTE ARITHMETIC DW T4 ;8 BIT LOAD FROM MEMORY DW T5 ;8 BIT LOAD TO MEMORY DW T6 ;POP's AND PUSH's DW T7 ;CONDITIONAL RETURNS DW T8 ;THE RST INSTRUCTIONS DW T9 ;REGISTER TO REGISTER LOADS ;2 BYTE INSTRUCTIONS DW TA ;8 BIT LOAD IMMEDIATES DW TB ;8 BIT IMMEDIATE ARITH. & LOGICAL DW TC ;IN A,(n) DW TD ;OUT (n),A DW TE ;CONDITIONAL, RELATIVE JUMPS DW TF ;OTHER RELATIVE JUMPS ;3 BYTE INSTRUCTIONS DW T10 ;16 BIT LOADS DW T11 ;JUMPS & CALLS DW T12 ;DIRECT LOADS DW T13 ;DIRECT STORES DW T14 ;LD (nn),A DW T15 ;CONDITIONAL JUMPS & CALLS ;MULTI-BYTE OPCODES DW T16 ;THE 'CB' SERIES {1, 1A, 2A} DW T17 ;THE 'DD' SERIES {1B thru 25 & 2A} DW T18 ;THE 'FD' SERIES {1B thru 25 & 2A} DW T19 ;THE 'ED' SERIES {0, 2, 3, 26 thru 2A} ;1 BYTE DW T1A ;THE BIT, RES & SET FOR 'CB' DW T1B ;INDEX REGISTER LOADS DW T1C ;JUMP INDIRECT INDEX REGISTER DW T1D ;INDEX REGISTER ADD ;2 BYTE DW T1E ;INDEX REGISTER ARITH. AND LOGICAL DW T1F ;INDEXED LOAD TO REGISTER DW T20 ;INDEXED REGISTER STORE ;3 BYTES AFTER 'DD' OR 'FE' DW T21 ;LD xx,nn DW T22 ;LD (nn),n DW T23 ;LD xx,(nn) DW T24 ;LD (xx+d),n DW T25 ;THE 'CB' EXTENSIONS TO 'DD' OR 'FD' ;1 BYTE AFTER 'ED' DW T26 ;IN r,(C) DW T27 ;BLOCK MOVES ;3 BYTES AFTER 'ED' DW T28 ;LD (nn),dd DW T29 ;LD dd,(nn) ;WHATEVER IS LEFT DW T2A ;INDEFINED OPCODES ; ;ONE BYTE INSTRUCTIONS, SIMPLE ; T0: JMP DCRLF ; ;ARITHMETIC & LOGICAL, 8 BIT, REGISTER ; T1: CALL PSREG ;PRINT THE SOURCE REGISTER JMP DCRLF ; ;DEC AND INC INSTRUCTIONS ; T2: CALL PDREG ;PRINT THE DESTINATION REGISTER JMP DCRLF ; ;DOUBLE REGISTER SINGLE BYTE ; T3: CALL PXSREG ;PRINT HL, DE, BC, OR SP JMP DCRLF T4: CALL LPAR ; LD A,(BC or DE) CALL PXSREG CALL RPAR JMP DCRLF T5: CALL LPAR ; LD (BC or DE),A CALL PXSREG CALL RPAR CALL PCMAA JMP DCRLF ; ;POP AND PUSH ; T6: CALL PXQREG ;PRINT HL, DE, BC, OR AF JMP DCRLF ; ;CONDITIONAL RETURNS ; T7: CALL PRCND JMP DCRLF ; ;THE RST INSTRUCTIONS ; T8: MOV A,M ANI 38H CALL PRST JMP DCRLF ; ;REGISTER TO REGISTER LOADS ; T9: CALL PDREG CALL COMMA  LHLD BIASED CALL PSREG JMP DCRLF ; ;TWO BYTE INSTRUCTIONS ; 8 BIT IMMEDIATE LOADS ; TA: CALL PDREG CALL COMMA LHLD BIASED ;ARITHMETIC & LOGICAL IMMEDIATES TB: INX H DTABYT: MOV A,M CPI ' ' JC NOTASC CPI 5BH JNC NOTASC CALL PASCII MVI A,'''' CALL TYPE LDA XCSW ;WANT SYMBOL COMMENTS? ORA A JZ DCRLF CALL TAB CALL SEMI NOTASC: MOV A,M CPI 0AH JC NTSC0 CALL PASHEX MVI A,'H' CALL TYPE JMP DCRLF NTSC0: ADI '0' CALL TYPE JMP DCRLF ; ;IN ; TC: CALL LPAR ;FOR 'IN A,(C)' INX H MOV A,M CALL PASHEX MVI A,'H' CALL TYPE CALL RPAR JMP DCRLF ;OUT TD: CALL LPAR INX H MOV A,M CALL PASHEX MVI A,'H' CALL TYPE CALL RPAR CALL COMMA MVI A,'A' CALL TYPE JMP DCRLF ; ;CONDITIONAL RELATIVE JUMPS ; TE: CALL PRCND1 ;THE SPECIAL CC LIST LHLD BIASED CALL COMMA ;OTHER RELATIVE INSTRUCTIONS TF: INX H MOV A,M MOV E,A MVI D,0 LHLD PC ORA A JP PSTV DCR D PSTV: DAD D XCHG CALL PRNTDE CC PDERTN JMP DCRLF ; ;THREE BYTE INSTRUCTIONS ;16 BIT LOADS ; T10: CALL PXSREG CALL COMMA LHLD BIASED ;JUMPS AND CALLS T11 CALL PRNN CC PDERTN JMP DCRLF ; ;LOAD DIRECT ; T12: CALL DRADR CC PDERTN JMP DCRLF DRADR: CALL LPAR ;PRINT THE VALUE FOR DE IN PARENTHESIS CALL PRNN PUSH PSW CALL RPAR POP PSW RET ; ;STORE DIRECT ; T13: CALL DRADR PUSH PSW CALL COMMA MVI A,'H' CALL TYPE MVI A,'L' CALL TYPE POP PSW CC PDERTN JMP DCRLF ; ;STORE ACCUMULATOR DIRECT ; T14: CALL DRADR PUSH PSW CALL PCMAA POP PSW CC PDERTN JMP DCRLF ; ;CONDITIONAL JUMPS & CALLS ; T15: CALL PRCND CALL COMMA LHLD BIASED CALL PRNN CC PDERTN JMP DCRLF ; ;THE 'CB' SERIES LEAD IN ; T16: INX H MOV B,M ;THE SECOND BYTE OF THE INSTRUCTION SHLD BIASED LXI H,OPC2-4 CALL GTCD ;FIND THE TYPE OF THE 'CB' INSTRUCTION CALL TYPEOC JMP OLDPC ; ;THE 'DD' SERIES LEAD IN ; T17: MVI E,'X' ;FOR THE 'IX' INSTRUCTIONS T170: PUSH D INX H SHLD BIASED MOV B,M LXI H,OPC3-4 CALL GTCD CALL  TYPEOC POP D CPI 1EH JC OLDPC CPI 2AH JZ OLDPC CPI 21H INX H JC NEWPC INX H JMP NEWPC ; ;THE 'FD' SERIES LEAD IN ; T18: MVI E,'Y' JMP T170 ; ;THE 'ED' SERIES LEAD IN ; T19: INX H SHLD BIASED MOV B,M LXI H,OPC4-4 CALL GTCD CALL TYPEOC CPI 28H JC OLDPC CPI 2AH JZ OLDPC INX H INX H JMP NEWPC ; ;BIT, RES AND SET ; T1A: CALL PBIT CALL COMMA CALL PSREG JMP DCRLF ; ;INDEX REGISTER MOVES ; T1B: CALL PRXX ;TO TYPE EITHER 'IX' OR 'IY' JMP DCRLF ; ;JUMP INDIRECT TO INDEX REGISTER ; T1C: CALL LPAR CALL PRXX CALL RPAR JMP DCRLF ; ;INDEX REGISTER ADDITION ; T1D: CALL PRXX CALL COMMA MOV A,E CPI 'X' MOV A,M LXI H,IXREGS JZ T1D0 LXI H,IYREGS T1D0: CALL PXREG JMP DCRLF ; ;INDEX REGISTER ARITHMETIC AND LOGICAL ; T1E: INX H CALL PDISP ;PRINT '(IX(Y)+d) JMP DCRLF ; ;INDEXED LOAD TO REGISTER ; T1F: CALL PDREG CALL COMMA LHLD BIASED INX H CALL PDISP JMP DCRLF ; ;INDEXED REGISTER STORE ; T20: INX H CALL PDISP CALL COMMA LHLD BIASED CALL PSREG JMP DCRLF ; ; LD xx,nn ; T21: CALL PRXX CALL COMMA CALL PRNN CC PDERTN JMP DCRLF ; ; LD (nn),xx ; T22: CALL LPAR PUSH D CALL PRNN XCHG ;HL NOW CONTAINS THE NUMBER POP D ;RECOVER THE 'E' REG. ('X' OR 'Y') PUSH PSW ;SAVE THE CARRY FOR A LATER 'PEDRTN' CALL RPAR CALL COMMA CALL PRXX POP PSW ;THE CARRY FLAG IS RESTORED XCHG ;DE AGAIN CONTAINS THE VALUE FOR nn CC PDERTN JMP DCRLF ; ; LD xx,(nn) ; T23: CALL PRXX CALL COMMA CALL LPAR CALL PRNN PUSH PSW ;SAVE Cy VALUE CALL RPAR POP PSW CC PDERTN JMP DCRLF ; ; LD (xx+d),n ; T24: INX H CALL PDISP CALL COMMA JMP TB ; ;THE 'CB' EXTENSIONS TO 'DD' OR 'FD' ; T25: INX H INX H MOV B,M LXI H,OPC2-4 PUSH D ;SAVE 'X' OR 'Y' CALL GTCD CALL TYPEOC POP D MOV A,B ;GET THE O.C. ANI 7 CPI 6 JNZ ILLEG LDA OPCTP LHLD BIASED CPI 1AH JC T1E JZ DD12 ILLEG: LHLD PC DCX H DCX H SHLD PC JMP T2A DD12: INX H INX H CALL PBIT  CALL COMMA DCX H DCX H JMP T1E ; ; IN r,(C) ; T26: CALL PDREG CALL COMMA CALL LPAR MVI A,'C' CALL TYPE CALL RPAR JMP DCRLF ; ;THE BLOCK MOVES AND I/O ; T27: MOV A,M ANI 8 MVI A,'I' ;AN INCREMENTING TYPE OF INSTRUCTION? JZ T270 MVI A,'D' ;NO, IT WAS DECREMENTING T270: CALL TYPE MOV A,M ANI 10H JZ DCRLF MVI A,'R' ;A REPEATING INSTRUCTION TYPE CALL TYPE JMP DCRLF ; ; LD (nn),dd ; T28: CALL LPAR CALL PRNN PUSH PSW ;SAVE Cy VALUE PUSH D ;SAVE THE 'NN' VALUE CALL RPAR CALL COMMA LHLD BIASED CALL PXSREG POP D POP PSW CC PDERTN JMP DCRLF ; ; LD dd,(nn) ; T29: CALL PXSREG CALL COMMA LHLD BIASED CALL LPAR CALL PRNN PUSH PSW CALL RPAR POP PSW CC PDERTN JMP DCRLF ; ;ALL UNDEFINED OPCODES COME HERE FOR A 'DB VALUE' TREATMENT ; T2A: LHLD PC DCX H SHLD PC LHLD BIASED DCX H CALL PSTG DB 'DB',9,0 JMP DTABYT ; ; ; ;------------------------------------------------------------------------ ; COMMA: MVI A,',' JMP TYPE TAB: MVI A,9 JMP TYPE SEMI: MVI A,';' JMP TYPE LPAR: MVI A,'(' JMP TYPE RPAR: MVI A,')' JMP TYPE PCMAA: CALL COMMA MVI A,'A' JMP TYPE ;PRINT THE CONDITION CODE LETTERS FOR THIS INSTRUCTION. PRCND: MOV A,M ANI 38H ;FOR A FULL SET OF CONDITION CODES PRC: RRC RRC LXI H,CNDTAB CALL SKIP MOV A,M CALL TYPE INX H MOV A,M CPI '.' CNZ TYPE RET PRCND1: MOV A,M ANI 18H JMP PRC CNDTAB: DB 'NZZ.NCC.POPEP.M.' ; ;PRINT THE SOURCE REGISTER FOR A BYTE PSREG: MOV A,M PREG: LXI H,REGTAB ANI 7 CPI 6 ;MUST CATCH THE (HL) REFERENCES JZ PHLREG CALL SKIP MOV A,M JMP TYPE PHLREG: CALL LPAR MVI A,'H' CALL TYPE MVI A,'L' CALL TYPE JMP RPAR PDREG: MOV A,M ;PRINT THE DESTINATION REGISTER FOR A BYTE RAR RAR RAR JMP PREG ;ADVANCE H&L BY (A) SKIP: ADD L MOV L,A RNC INR H RET REGTAB: DB 'BCDEHLMA' ;'M' IS NEVER PRINTED - '(HL)' IS INSTEAD ; ;PRINT A DOUBLE REGISTER PAIR PXSREG: MOV A,M LXI H,DREGS JMP PXREG PXQREG: MOV A,M LXI H,DREGQ PXREG: RAR RAR RAR ANI 6 CALL SKIP MOV A,M CALL TYPE INX H MOV A,M JMP TYPE DREGS: DB 'BCDEHLSP' DREGQ: DB 'BCDEHLAF' IXREGS: DB 'BCDEIXSP' IYREGS: DB 'BCDEIYSP' ; PBIT: MOV A,M RAR RAR RAR ANI 7 ADI '0' JMP TYPE PRXX: MVI A,'I' CALL TYPE MOV A,E JMP TYPE ;PRINT A LEADING QUOTE AND THEN THE ASCII ;.. (PRINT '' FOR '). PASCII: PUSH PSW MVI A,'''' CALL TYPE POP PSW CPI '''' JNZ TYPE PUSH PSW CALL TYPE POP PSW JMP TYPE ;PRINT THE VALUE IN A AS HEX ; WITH A LEADING ZERO IF NECESSARY PASHEX: CPI 0A0H JC PHEX PUSH PSW MVI A,'0' CALL TYPE POP PSW JMP PHEX ;PRINT THE STRING AT (HL) FOR (B) CHARACTERS. PRNT: MOV A,M CALL TYPE INX H DCR B JNZ PRNT RET ; ;PRINT A DISPLACEMENT IN THE FORM '(IX+d)' PDISP: CALL LPAR CALL PRXX MVI A,'+' CALL TYPE MOV A,M CALL PASHEX MVI A,'H' CALL TYPE JMP RPAR ; ;PRINT THE NEXT 2 BYTES AS A SYMBOL (AND RETURN Cy=1) IF POSSIBLE ; PRNN: INX H MOV E,M INX H MOV D,M  PRNTDE: PUSH D CALL SYMSCH JC NOMTCH CALL PRNT ;GOT ONE, SO PRINT IT POP D STC ;INDICATE THAT A SYMBOL WAS PRINTED RET NOMTCH: LDA BUILD ;DO WE BUILD A SYMBOL? ORA A POP D JZ NOBLD ;JUST PRINT THE HEX VALUE PUSH D CALL BLDSYM POP D JMP NOBLD PDERTN: LDA XCSW ORA A RZ ;DON'T PRINT THE SYMBOL AS A COMMENT CALL TAB ;WE'LL PRINT A VALUE AS A COMMENT CALL SEMI NOBLD: MOV A,D ORA E MVI A,'0' JZ NOBLD1 MOV A,D ORA A JZ NOBLD2 CALL PASHEX ;PRINT THE HIGH ORDER BYTE MOV A,E CALL PHEX NOBLD0: MVI A,'H' NOBLD1: CALL TYPE ORA A ;CLEAR THE CARRY RET NOBLD2: MOV A,E PRST: CPI 0AH JC NOBLD3 CALL PASHEX JMP NOBLD0 NOBLD3: ADI '0' JMP NOBLD1 ; ; ;<><><><><><><><><><><><><><><> OPCODE TABLES <><><><><><><><><><><><><><><> ; OPC: DB 0FFH,0EBH,0,'EX DE,HL' DB 0FFH,008H,0,'EX AF,AF''' DB 0FFH,0D9H,0,'EXX' DB 0FFH,0E3H,0,'EX (SP),HL' DB 0FFH,027H,0,'DAA' DB 0FFH,0F3H,0,'DI' DB 0FFH,0FBH,0,'EI' DB 0FFH,076H,0,'HALT' DB 0FFH,02FH,0,'CPL'  DB 0FFH,03FH,0,'CCF' DB 0FFH,000H,0,'NOP' DB 0FFH,037H,0,'SCF' DB 0FFH,0E9H,0,'JP (HL)' DB 0FFH,007H,0,'RLCA' DB 0FFH,017H,0,'RLA' DB 0FFH,00FH,0,'RRCA' DB 0FFH,01FH,0,'RRA' DB 0FFH,0C9H,0,'RET' DB 0FFH,0F9H,0,'LD SP,HL' DB 0F8H,088H,1,'ADC A,' DB 0F8H,080H,1,'ADD A,' DB 0F8H,0A0H,1,'AND ' DB 0F8H,0B8H,1,'CP ' DB 0F8H,0B0H,1,'OR ' DB 0F8H,098H,1,'SBC A,' DB 0F8H,090H,1,'SUB ' DB 0F8H,0A8H,1,'XOR ' DB 0C7H,005H,2,'DEC ' DB 0C7H,004H,2,'INC ' DB 0CFH,009H,3,'ADD HL,' DB 0CFH,00BH,3,'DEC ' DB 0CFH,003H,3,'INC ' DB 0EFH,00AH,4,'LD A,' DB 0EFH,002H,5,'LD ' DB 0CFH,0C1H,6,'POP ' DB 0CFH,0C5H,6,'PUSH ' DB 0C7H,0C0H,7,'RET ' DB 0C7H,0C7H,8,'RST ' DB 0C0H,040H,9,'LD ' DB 0C7H,006H,0AH,'LD ' DB 0FFH,0C6H,0BH,'ADD A,' DB 0FFH,0CEH,0BH,'ADC A,' DB 0FFH,0E6H,0BH,'AND ' DB 0FFH,0FEH,0BH,'CP ' DB 0FFH,0F6H,0BH,'OR ' DB 0FFH,0D6H,0BH,'SUB ' DB 0FFH,0DEH,0BH,'SBC A,' DB 0FFH,0EEH,0BH,'XOR ' DB 0FFH,0DBH,0CH,'IN A,' DB 0FFH,0D3H,0DH,'OUT ' DB 0E7H,020H,0EH,'JR ' DB 0FFH,010H,0FH,'DJNZ ' DB 0FFH,018H,0FH,'JR ' DB 0CFH,001H,10H,'LD ' DB 0FFH,0C3H,11H,'JP ' DB 0FFH,0CDH,11H,'CALL ' DB 0FFH,03AH,12H,'LD A,' DB 0FFH,02AH,12H,'LD HL,' DB 0FFH,022H,13H,'LD ' DB 0FFH,032H,14H,'LD ' DB 0C7H,0C4H,15H,'CALL ' DB 0C7H,0C2H,15H,'JP ' DB 0FFH,0CBH,16H,0,0 DB 0FFH,0DDH,17H,0,0 DB 0FFH,0FDH,18H,0,0 DB 0FFH,0EDH,19H OPC2: DB 0F8H,000H,01H,'RLC ' DB 0F8H,008H,01H,'RRC ' DB 0F8H,010H,01H,'RL ' DB 0F8H,018H,01H,'RR ' DB 0F8H,020H,01H,'SLA ' DB 0F8H,028H,01H,'SRA ' DB 0F8H,038H,01H,'SRL ' DB 0C0H,040H,1AH,'BIT ' DB 0C0H,080H,1AH,'RES ' DB 0C0H,0C0H,1AH,'SET ' DB 080H,000H,2AH OPC3: DB 0FFH,0E3H,1BH,'EX (SP),' DB 0FFH,0E9H,1CH,'JP ' DB 0FFH,0F9H,1BH,'LD SP,' DB 0FFH,0E1H,1BH,'POP ' DB 0FFH,0E5H,1BH,'PUSH ' DB 0CFH,009H,1DH,'ADD ' DB 0FFH,023H,1BH,'INC ' DB 0FFH,02BH,1BH,'DEC ' DB 0FFH,034H,1EH,'INC ' DB 0FFH,035H,1EH,'DEC ' DB 0FFH,086H,1EH,'ADD A,' DB 0FFH,08EH,1EH,'ADC A,' DB 0FFH,096H,1EH,'SUB ' DB 0FFH,09EH,1EH,'SBC A,' DB 0FFH,0A6H,1EH,'AND ' DB 0FFH,0AEH,1EH,'XOR ' DB 0FFH,0B6H,1EH,'OR ' DB 0FFH,0BEH,1EH,'CP ' DB 0C7H,046H,1FH,'LD ' DB 0F8H,070H,20H,'LD ' DB 0FFH,021H,21H,'LD ' DB 0FFH,022H,22H,'LD ' DB 0FFH,02AH,23H,'LD ' DB 0FFH,036H,24H,'LD ' DB 0FFH,0CBH,25H,0,0 DB 080H,000H,2AH,0,0 DB 080H,080H,2AH OPC4: DB 0FEH,070H,2AH,0,0 ;PREVENTS 'IN (HL),(C)' DB 0FFH,044H,00H,'NEG' DB 0FFH,045H,00H,'RETN' DB 0FFH,046H,00H,'IM 0' DB 0FFH,056H,00H,'IM 1' DB 0FFH,05EH,00H,'IM 2' DB 0FFH,047H,00H,'LD I,A' DB 0FFH,04DH,00H,'RETI' DB 0FFH,04FH,00H,'LD R,A' DB 0FFH,057H,00H,'LD A,I' DB 0FFH,05FH,00H,'LD A,R' DB 0FFH,067H,00H,'RRD' DB 0FFH,06FH,00H,'RLD' DB 0CFH,042H,03H,'SBC HL,' DB 0CFH,04AH,03H,'ADC HL,' DB 0C7H,040H,26H,'IN ' DB 0C7H,041H,02H,'OUT (C),' DB 0E7H,0A0H,27H,'LD' DB 0E7H,0A1H,27H,'CP' DB 0E7H,0A2H,27H,'IN' DB 0F7H,0A3H,27H,'OUT' DB 0F7H,0B3H,27H,'OT' DB 0CFH,043H,28H,'LD ' DB 0CFH,04BH,29H,'LD ' DB 080H,000H,2AH,0,0  DB 080H,080H,2AH ;--------------------------- END OF OPCODE TABLE ---------------------  DB 080H,080H,2AH ;--------------------------- END OF OPCODE TABLE --------------------- ' DB 0FFH,036H,24H,'LD ' DB 0FFH,0CBH,25H,0,0 DB 080H,000H,2AH,0,0 DB 080H,080H,2AH OPC4: DB 0FEH,070H,2AH,0,0 ;PREVENTS 'IN (HL),(C)' DB 0FFH,044H,00H,'NEG' DB 0FFH,045H,00H,'RETN' DB 0FFH,046H,00H,'IM 0' DB 0FFH,056H,00H,'IM 1' DB 0FFH,05EH,00H,'IM 2' DB 0FFH,047H,00H,'LD I,A' DB 0FFH,04DH,00H,'RETI' DB 0FFH,04FH,00H,'LD R,A' DB 0FFH,057H,00H,'LD A,I' DB 0FFH,05FH,00H,'LD A,R' DB 0FFH,067H,00H,'RRD' DB 0FFH,06FH,00H,'RLD' DB 0CFH,042H,03H,'SBC HL,' DB 0CFH,04AH,03H,'ADC HL,' DB 0C7H,040H,26H,'IN ' DB 0C7H,041H,02H,'OUT (C),' DB 0E7H,0A0H,27H,'LD' DB 0E7H,0A1H,27H,'CP' DB 0E7H,0A2H,27H,'IN' DB 0F7H,0A3H,27H,'OUT' DB 0F7H,0B3H,27H,'OT' DB 0CFH,043H,28H,'LD ' DB 0CFH,04BH,29H,'LD ' DB 080H,000H,2AH,0,0  !""9"1>2222!e~L>ZF#xN)>24>24*.|g++""!{OzGr# xk>2>X2!]!]7~ ʚ#Î!͢¹!ej!;"( @ //^ :X>2!"͸2 wj!>;ͷ |U"! NE *DMY/>;ͷ *#)/>2K /!"!"͸m2>2>!w#‡!":! > ͷ w:ʹ /rʳ/r*}ž Þ>2://^ **D}Mx,V+^"! (E *DMY// >*w#<"Sͫw*!;mY*|V:څڤڅ9:͐Z ::>Hͷ :͐v : >,ͷ  :͐:,1'"6';/@7E?   :ʒ͒:u>,ͷ ͸2-  :ʱʱ :2ͱ 2>,ͷ ô :*_#/<_}o|g>Aͷ |:}:  > :͚ ͷ : >,ͷ * V =͸~2N:%*#5 %YY/!":e! > ͷ w! > ͷ V :^ **|5 ڧÐY/"! > ͷ V ÐY/ > >,ͷ Q :͘ M  > ͷ Q H! >Xͷ > ͷ ͷ :*/2 Q :}}}}}}} :gZ|PU_Zfijfʘʄ ʄ :4wqʌʙF:ʌ͌ :Ìv=q > l :0ͷ  Q / Q NzL :ͱ > ͷ Q J :ͱ :  * :ʌ͌>,ͷ ͸2-  :͸2ʉʉʉʉ ʉ(ʉ8ʉ@qqqG :- Ò :80ͷ >,ͷ Ì : 2:ʌ͌>,ͷ ͸2- : >,ͷ ͸2- >,ͷ ͸2- :2/ : ʔ ʣ ʿ :D& E& M& F& V& ^& G& O& W&  _& g& o& P :- ) :͚ ͷ  ) :͚ ͷ ) :ʳ & : ) :ccp : > >Aͷ ::::>)ͷ >,ͷ  ) C  >,ͷ >(ͷ >Aͷ ::::>)ͷ ) 2:7_ :_ ._ 1_ 4_ p :q >Is >Dͷ :>Rͷ ) :ʌ͌>,ͷ ͸2- 2 @ @4 5 ! " * & >,ͷ ͸2- >,ͷ ͸2- >2:  m :\ ` ` X ' ::͸2*_#H R /<_}o|gT] ͸ :͘ G :ʪ ʪ X X ʮ ʸ ʪ ʪ X  :͸:͸  ͸͸:͸ @ @4 5 ! " * & ͸_͸W5 *r+s+"*5 >w#w7*J zH +{I 7++*D}M; x; 7?*T] ~v +~w Á +#~+~+*D}Mf xf "0BFIN>A:o r t w y |   ͝  ͚ ͷ :͘ M ͷ # _  ͸C C > C >0ͷ ͐:>Hͷ :‰ ͸͐͸͐{ { v { >0ͷ ::>Hͷ ͸͐͸͐ʩ >Aͷ ::::>Hͷ _* > w#" ͷ  >Aͷ *|:}::>:ͷ  H  /7H> ͷ > ͷ GG S0U7ͷ xsll>0ͷ x:Åyʅ>0ͷ y:>Hͷ * î>.î6^#@w#": :̈́*#"O7_<2!~*#"*}**z0*+;}|OxG!;IY xT1*}O|G;"ɯ2|\ɯ2|\\\8080 DISASSEMBLER R.A.R Ver 1.6x 5/21/84 HIT ANY KEY TO STOP $ERROR: $, LOAD ADDRESS $DISK READ$DISK WRITE$BYTES READ:$LAST ADDRESS $BYTES READ $RECORDS WRITTEN $ASMCANNOT OPEN SOURCE$COMNO MORE DIRECTORY SPACE$CANNOT CLOSE FILE$ FIRST PASS - GETTING ADDRESSES$ ADDRESSES FOUND $;DISASSEMBLER: .COM EQU ORG 0100HDS DB 0SPNOPDIEIRST POP PUSH RET CALL JMP PSWLXI STAINX INR DCR MVI DAD LDADCX SHLD LHLD MOV HLT ADD ADC SUB SBB ANA XRA ORA CMP ADI ACI SUI SBI ANI XRI ORI CPI RAR RAL RLC RRC DAA CMA STC CMC RJCXTHLSPHLXCHGPCHL IN OUT NZZNCCPOPEPMEX AF,AF'EXXDJNZ JR BIT SET RES RRC RLC RR RL SRA SLA SRL OUT (C),IN NEGRETNRETIIM 0IM 1IM 2LD I,ALD R,ALD A,ILD A,RRRDRLD,(C)ADC HL,SBC HL,LDCPINOTOUTLD (LD DB 0CBH,DB 0EDH, ;Z80.INDEX.EXT.INSDB 0DDH,DB 0FDH, END END ; ;BLER R.A.R Ver 1.6x 5/21/84 HIT ANY KEY TO STOP $ERROR: $, LOAD ADDRESS $DISK READ$DISK WRITE$BYTES READ:$LAST ADDRESS $BYTES READ $RECORDS WRITTEN $ASMCANNOT OPEN SOURCE$COMNO MORE DIRECTORY SPACE$CANNOT CLOSE FILE$ FIRST PASS - GETTING ADDRESSE DIS.CO͠ wil disassembl an *.co fil堠 int reassembleabl cod i 808 format Th outpu fil shoul onl requir sligh modificatio t rectif addres error du t th assumptio tha al byt constant ar addresse unles the hav valu les tha 0100h Thes ar entere i th cod a he constants Th addresse tha ar les tha 0100Ƞ ar liste i commen line a th beginnin o th listing wit th appropriat equat listing I th "L optio i chose the al tw byt constant ar considere a he constant an onl on pas i mad o th file. Th outpu fil i fro si t seve time th lengt o th inpu fil s b carefu a t dis space I thi regar th outpu fil i alway writte t th B disk an th filenam i amende t hav a "X precedin th inpu fil name Th sourc fil ca b o eithe A o B dis b specifyin th appropriat prefi whe enterin th  fil name otherwis th sourc i assume t b o th defaul drive. Usage DI (filename) DI (filename).LZ Where: L mean n lin number - al젠 constant󠠠 ar considere䠠 a󠠠 he constants. Z mean n decodin o extende䠠 Z8 instruction a string o Declare Bytes. Th orde i immateria an eithe ca b use withou th other. Output B:X(filename).ASM Alternate usage: ZDIS (filename) Ther ar n option i this version. Output: B:X(filename).MAC Ther ar tw alternat form o th DISassembler Th firs produce outpu compatibl wit mos 808 assembler principall th CP/ ASM Howeve i th fla i th beginnin o th sourc cod i changed th outpu i i Z8 format hav trie t mak th堠 outpu compatibl wit th Microsof M8 assembler (thu th fil typ *.MAC. Thi assemble wil wor wit eithe 808 o Z8 code Th Z8 progra wil properl decod al o th origina 808 instructions a wel a mos o th extende instructions Excep fo th inde registe instructions whic ar stil lef a declar byt strings Th 808 versio (DIS progra i writte s tha al Z8 instruction ar capture an place i declar byt strin wit th appropriat numbe o byte i th string Approximat Z8 cod i pu i commen afte th declar byt strings I th "Z optio i chose al non-decodabl byte (a 808 instructions ar lef a singl declar byt instruction t th assembler. Th progra ma tak whil t complete I firs goe throug th fil an find al th appropriat addresses The i rewind th堠 file an disassemble th fil wit th addres pu i th appropriat places Th cod i displaye o th scree a i processe th data A th en o th fil i trie t justif al unuse addresse b creatin th appropriat storag parameters Thi proces ma tak som tim (on o tw minutes s b patient Th progra ca no b halte durin thi time Onc th justificatio i finishe th progra put al unuse addresse i equat statement a th en o th listing Afte thi th outpu fil wil b created. On wor o cautio i usin th program ɠ hav intentionall se al NOP' a declar storag statements Thi present som problem a som assembler d no alway se thes t zer i th ru module I th NOP' ar require fo th operatio o th progra an ar no cleare b it the yo ma hav som problem assemblin th listin a i stands I ma b wis t chec th cod an replac D 01 line wit D  00Ƞ befor assembly Otherwis th listin shoul reassembl an produc a exac cop o th origina program Anothe proble ɠ hav discovere i tha tw constan o FFFF wil no b liste a i i th marke ɠ us fo blankin th addres stack therefor i wil no b include i th lis a th en o th listin o unreconcilabl addresses I ca b entere eas enoug wit an edito o b usin m dis edito progra XDUMP.COM Th proble o th declar storag no bein se t zer ca b eliminate i yo us m progra ZLOAD Thi i modifie versio o CP/ LOA tha clear memor befor readin th *.HE fil an thu make an blan area al zeros. R A R ver 1.6 5.24.84  vWDIS.ASMG  !"#$%&'()*+,-./01o23456789:;<=>?@ABCDEF3O%_2|JJϐw^c2|bn`ӕÖ.(T_(|bn2%s2cKV`1ľ=lTP}!#TR̍|1|1>ǖl sKki3o\vo¾VCe3bKV`1OrȥP`GklĶݨ9r[%Ķ\  (PJ%o(K2|JlKeK;[56޹B)Dm!J,sn/_l qȥP09x%m!P*35e V,qә'Nx,qll `*y޹B)Qb5K5r/*3_&72S{lވklm;ľ9Qs1Tf[T}ľVJWJm=±qNwbp^dd[9JkF*3HvjSsWNJm?y-?UfRI17~_VvZ*gFSf[-yi3^c%ĹwhTfЉ]L_&kl1-7?||bn翼f|jT;W(%68坸FܶSIW[qNHebZ?*3_wE|#y^?-l 1TfD{Tɻ"1xώxͅ?`RQf|~5*l P}!2VQs18de sKr#{R9d[[R5rcKTf/_]Lgqe1>[HeV\Aƶy]FܶSI*37nn9-Yقܒʬ2s.*[/7?߁W_*V60뢲kCV6RU_V_\c| v1hq1TnkCc| ["^s`O^1TT kÿ*sw9qK*Jȭ~ms̅QCn)WR }~mgF_|0*lCn)WR~mq<،.*!aCn)W⾭+[09,8r%.?i@6u'jJ*׆X0+5d_sk.ƒL%Z0'%,+~mx/U25VR)J_? B+|5VgFJ*+~mxY0xTJ[c%Я ̅߉XIeVT+׆׆񱨘_\T aE%Я -*׆w_T׆_0Jp qȎT~mxEeVۺ~mc,]L_ܷu޹B)*k_`^c%Yɕ{Ke }m_+5=@6y1z_9lP3vP\|)ya ٲʉ86M*k血~mXC`nt7.߯]eV:k!7+r9| k+5=&Я +=&R ~mx0jƅPi%~mxsq~*L_^s \O9E c,*|1{r _su̇/: 0Jp!8Q\8䭙 R>Kh9T?K4Drᐷf*p!Mۅ𥂴T\]TPi:5_ȸ''K᎝qnSJB*VL%6SUfNdVI.+j{vTfDV~ y/C%_eQs1Sׇ yԵ Pnklm;dk̡/ _i7ǟ%qlڌV y Pk^sa\(ĕ*XC { k.VI*دƜ[}pX(|-kbnI%o *SYOaq喹FܶSI\FȩyC"kUA"ۉ9,82>ǖlbnIm*l}Q(S3ykX0 ԌsRRG _LxxU^*Hp*XT'4[^~|c>lffJN*i\w;W(%{;DŽf8Y.޹B)u r bQ},*V8dRAb_RA"O^*SXEvcSAGcԲ2X(X.N>aRrQR9O85VRUv=ߘ|%g;[攷XI!k{ zp=0'˅;W(%An\],*pE׊%T}sxdWJʬؾQ)%+*VL%6S~X0'28۴m] GV =b9ƺ.)bܲTPk<،fL6oT|HɊ RB3~,**V8 kE bZF*د8s2_ݍklkTRTv.ա?,4|!㐷fTX0T'>搛ŶckE bZF*_*3YlĖeNrs<ؖSɗwͱɧD{2>|s"cj}[W$Ü,h*~\.qތsp2oS3_+RkE *s ˅CޚQQAZCLc]qy_|11:fGS)47_+.dݍHG0SsW^cĿAs|\(X\,!VA2䯘 k?ƺ.p| gFVQA2ϵ k?PΛO!FۺRQ~XTPSYDU \(*x MzXB̘ Vb)fT2ߨd:B3CyԵ Pr\c#nީ$)b뢂 -H kl9kl}s<،sRR)4k?aN. S KQAQ-av#Tb3-Yقܒ KBƱ%+[[0RA"9q\٧ vs\97)bs"r˓ 7>qKTv я4@bo?K4s>U|HɊcA"RW< &9fm2>7|Q2^sEoı%+[[RA"Fycya+S8okE *x M sbHeK%?PiFKu 0_8lP3rsSG _\'/-1fܣ%Q*-b By{anmƗ̹ Z1%Jl޹B)O(4 5W/Ye-&9q57^ GXĕ*Σ_0Ǖklm;0Eu]Ta-~9ܲodS͘dhf*\\U|HU׊ɇ/ԥ:Xv2|c3**HRUPTfٴ=b9T0_8/y徭+ٴ я1>Ƃfm{y0Jl|%{;/d76㾭+JIc[0W \cQ '0b\T|,D#oJEagFT!o6mA%sn*~\]L_YS) Z1Q)`Jl7Ǿb*Jluy/dLq^oJE{ [xuU',/d\}2# >a8|)䍊 )s!JSs76{a+lr6RR9mb#̎Bvı%+[[RUKBƱ%+[ +qe s"|ɜ0P|斍JܣP3QỏL(eD(Q|=_{4Ö9R*x8 7Dg psƉLeV9o6mƾ=?ecG!;r*FΣ?,+  !+ەq4>U7=uS53§ )YQAua_1_ȸ?T|p0; x* k?ļŸ^λ/_TT|JX ʬ2sɛFl|ؒ-X-*x:䯘/dF*Vܮ*Sς9q\y8de sSGaATb3ś =yW-Tb3>|=U|HɊ KBa݇/L[Z0O_A׊+dyqKL k?TAb*a)*)}bq Z7KTb3Ny+%&B28 K5{D?RM׊\f[fG!;18de sK*0KBakE<Òbq 9qEqȎ 78 -O[?#K *S{QGazG.% Lc]TQ##*SE1 =0EE1 =y0E^TQ##U׺y0FRAG#' *Sߋ 78 c${D?r؃ .*x(T[X)b _0_ȘF͑ 1u8TQ{c+'2m2; ak<،c+ K0Eǂ9q\F͑ؒ-XM=r| l QR~yikTRT|u2NrsF*HkETb3NrsF*==94@b Zj.*Σ?,+B!_p#U` /+VbT0ؒ-XM1r<،fzGvv _+qql,TXTQxzG~)y,A׊:*`J*-b?̡/m!;b{LṬ?,+k.rsbn#v#_+0; \HS0O$KP\s|0R~y*VL%,E},//YQxkEJVTgyĕoC׊ Y|!Fw05 ?}w$KRWc:/̅BRD!7aBUua O9Eq^?T+86v*د*slN27T|!%^Qa,{`q"c['Ė9m݊l Ϙs5eJI}{3Tܳ{`N[q^Dk;{ |^xx TT+U+ =_^=د89o6mƱc\T|JX |?_+ T_+c#Sxaq0b!;5SA"%+*Σ?,K׊Ƿ 5W2/YQ#!Z2YefG!;BoB;58de sK*0DG#;T'8 cGao{D?rlw< EQ#]8 c_+R1_+fB2(dG[(S3ͱPhf\Qؒ-X-*A"%+ql,概<Òbq Z(Bƅ.1_+y*GSA!SU׊`JlƱ%+[5*Σ?,+  y3W0_ȸ%&8U|JX y2N.z##Tb32/b#fܫo_\ssKe8R('_}9x*B=%2v/rF{n1 ZS8 =c9q\8< Bӷ´sWh*V\: 7 |(<9+%OṬ?,+a1'"+F%npZ %8fmc vj!oͨ:V|!qN/*SXQ2^sᖹFܶSI*x(<0?(q\c#nީ$Gua 5X0_ȸݸ?8䭙 aƎT0miAǜ8Y.B֌ F;9q\?8sR`: 5݇/<[ܲql\c2ykF*V8 y*8Y.B֌ 04̻MeVqZ «cJly3N5kE bZF*)Č9T} 1r[3**HKu)f*Σ_0_ȸFܶS 1ul\emT 78 -O 56JRAb;y*7{ (<%œ&]LS_+>Q-av#nQ[8 -OkwN5'ikTRTP.aP}!N7sA׊`JlTPs"d q[3**Bӊ|wPJ\c2LyBWAlwtԥ:f*(/vSNӖtԥ:Xv ,* ZT|0J9LyBW'8<GU'8 KQX0miSAQxu_+R(uU'8rQAZCXhiK _+ؼs*دHkTRTP. Z{D?EST'8 KeVqւzx/*V8 kE *xbR(dG\wdPh { k.1>ʬ(FG#{TA"%+*دcQA"o^*د8S׊ Z7ΩP+1T1^~d^}0˫8 cx{D?ru^QQGXW_+RA"T(WA"%+*د8TAb*a)*Vͼs*(d*0^a8SWSTA"%+*د8 S KQ~ɧ S KQ'LS׊*ˣ:*SxE*~T>Qxy(|@G#ץ:G)YQA"oSA!S22%ٻľ9N %wPJxͅoCeV+>0 я[2kEJVTPGXW_+RA"T( y3 ={_+RB28 0E˩ K׊{#WA"%+*(d*B"oSAG#/ Z2YQã#*Σ?, { L~npWA"%+*Vͼs*`FS׊*SĹ*x(x_+RkE̽T'8 c28 я\T|HɊ y3 Ga _T\f[fG!;b_-q'cKV`128 <ÒbqLV`17L[Z0O_iq2fTB /*-b`շ/ɷ.R-#s*SPG= =ٻ0E {{D?rں 1^ 78 QTPȩw)b|/*x(GQAG#UyEя|/^ayEяWA"ƟE(*~O*{_+R)Oҧ yTTPT\f[fG!;cKV`128 7K0EQ#*1oQʬ2񴥅}s|B!o.*sP}RA"%+*Vͼs*VP;iدF}OnFL*(d*|~kUqjE"%+*Vͼs*(d*PVs(*VL%,E׊ Y|!Fw0RA2䯘G5 Z7<،qLя Cwjk.|hs! ZTsT8QqOpB<،fhsA BƉBncKq GXW_8 ÷~,{f\QQAGVjl1 1Ƣ BIя[)Aa 78 '{D?n LﱨyzRAGV XTQ=#qKի LyzRAG㖊WA"^ 78 '{D?nT)cy]GDyzRo#Eя[0EE_*~ %)c,*x(RAGTƢ B/9v; ّ =9t_+R<Òb.|F*V>1O%6h/t[2L} 8 |H f[:䯘 _+ |X0>}fܣ̻")Ĩ /*.{,*VL%,Tb38U|JX G!(|H f[8 Ts!+JF*VR|!B aFc GXW2/9mb#.c09D[%Y%?Pqȡ:Zn9} ^ Lc]̉L0WNd>evH G?0g[|D<،C.qNer%lj9M>*VL%,E׊ Y|!D!7ada__GSA"oy*GSAua__ %˅8 |/Ǖ\(/ē/yؒ-XMaߋ //dl\(#SxaNqNT|HɊ G\P({aFƢ bVAua__*-b#q0Ey1TPT^Tx L㵨yRA" Ʒ KRAG袂0EEBzǭ5)bˢ \!SAGVȢ 1~ܢ \!SAG0E? 78rLя[*S? 78rLя[_*SZT+d*~ܪ^a?/*x2{D?n0EuQG#qG)bߋ 78rLя[u L_EBzǭ0E?/*x2{D?n:)bYỤ?,Ka/*x(8RA"~ƢG  19W쥢+dVdE9Wܢda_UPTTfN[/y؈-c\(ʬ❋-:䯘/d[ {h7[Ky{cNd/sS _eD{h-s|`Wc8Qqev*f޽|0J9̉ʾwPJ\c2Jl 5.d[i3g[gL95&SA]w.M/d,!9x`WÜ,D!7aX0; vj5o17 r!^cIaX0; vj5o17^sFw- Rsiœ,⚃ 04Ye72%Ќ-s"rl+טLeVYcΡ.ա?,4|!0␷f*f;RA(y0'"+f{ 5&SAi[f[q!JS ޹B)c3**VL;AwPJ*󅌧Q× k?ƺ.C%_-概=_7*-s[Mݱ`ѝQQyW̖-概dcs1x#^{ B̾9.d[i*_*3YlĖ(Ǖm!9xq^dT8&m!JIed>||)8q\-,ykNeV1J9ԥ:Xv2aQ` s0▍+搛Ŷ `q q<8TǕ[56Džl+Ma*(dܳ-L6_74/K,6b<Ŷ{ |RU&P`y1_ye\8_*X0Oql}MY{>a_T&^1_8Qqq^?8䭙 1u>BmaGSݗ/**x&WnQ%#ǿ97pǂ9L6_U+cK2#+5SA"ƺ.C'_?-쨒cjVEEvrƎ*9̹͗O||lsR⸲JFNeopǂB=坩YywPJ*_`{ X0_2[fS`\T+c剩Yy a6|R w,/dܳY;W(%pSǎB=坩Yy a6|R w8S5nt7f塂)OX0_Ș{ 2L>|}Å;̎Bent7f2/`8Y.B+ Rsi|!y`Wc>B,!pfyWGUGU',*gay%lL6_7,X{]an|zaNrsFܲ1|r6R=,`6cG/Ui޹4aNJ\9.s϶0|\ȶTTfN[/y؈-q[ ľ9v,6o17.tɨ$YQp/1Ǣ( /*(8 "kQA"ϟEeWw㵨 L?.*( ߋ 1~hQAU_#qSLeV9mb#̎Bv!7-!;Jf*K /*(zGn7)bE =0E ?Uя܂ 1^ 78 W{D?rPA" ?Uя!oRɛ}_#qS׊>^)} Zr Z(`F\N_+)Oҧ i%oeJl?ܣqwrq-oTfwyԵ ؈۶w*VQA"ƺ. 56JRݐ7`ns\c#nީ$iK kEkŅ`҂)} Zr 焼Kf?/)? f?o< yJs*VL%,E%o”'LS GAS0O_+˩kTRTPTTfN[/y؈-Tb3~sR2ͼ+V\: ' 9#L[Z0O_ Zrb][fB*V\: 0RSĜ8 !+ەe)Ĩ\<1_ؖX fG!;bO%6S'L fG!;bO%6SA!SUf޽1 S|!c[bqF*V8 }sgFeffܷu2L%,Ӗ,*`҂iK 'DqX|e\I{kEw9.!oַT;W(%Ly”>1_8o6ma0Eœ8&HvTRޘ-_2禂s\7ğ6Uƞ9Y.86ۺRQAlw,c vj}[W*+ Rf}[1'%)O*)OXTPTfK,6b<،.7rmamUeVI wt)b  S KQAlwt< )YQU~OS@3§?U|JX RB32#ykFE{ fG!;bO%6SAQF֌ |?  kaŖ9BPknU\<1'%#dF\e1-R J *V"f-^IS0O2#_+| Tb3[콒 ʬ2sJ/te)!;bO%6KMeV)D1s}/ {%)b7*l 56jISxJx=-3{{,*x| Cŧ.b|S K<،FELeKeٴYbB\h*=pƟ8?sqƅ.1`DJNeVq^Ӗt_ ]b2**蘧x%>mߪ\T|!KRGF%'d΍sߌ]斍9Qx0̕7*Jɗ E륂ss\ɻ.|U|JXzaWcK2# fG!;5dF*x 7ƞG|!D!7a\<< _ 78 -s#r•7*Y Ga뢂Gss\ɻ.|U|JXG|!D!7acSAQ(dG(?T_#q.'/tBSDͼT|JX !vV ]_د8ybqˍ} 1S}Br_#NS@8f%ğ>Sݱ`ѝ-sq[ME^I%vƞ9Y.aX0rRAZO!4Ü;W(%Ly‚P\ ]b2*IST0 ]S0O2/K,6b|!Fw0Rm%#̅l+-qXhƱrTYBQGV 50E|35y徭+gBֿ1̿97 Y#Zr3aqdyB6JFNy|_0[DqO?7cYͦT Nk.čƅSp!77B/sc\;_+>K sX(|eNDWΛMgFJɗʅV{KuB3̱B;5Bq`p[3vǢTB ry7*xp!/̅ſA%sn*SxcNmK ~a8J7_2禂zNńŅc*%_+&*%YB/$ 2D Y/}s\ȶTf Y\7|L5Cx̱B;50␷fTṬows\#oB}[W*SÈsRRǎBa\<ʅԥ:fc vja!oͨ ;:f*(d*_*3YlĖeͨ7v@)vQU>K uB32ykyDrI\; T̉{v!Q\8x0E0̿m.;&2,W.\q| rQA]Cެo+ [876d `Wé m r\[RAفyυjJ Lc8\)%__Wޒ8M>}l]TP&`ns!JSUf,шfʬTYVpǂBTTPۺR|!dTTPs =_ᏊB.+c15Ž]i  ,*Hé,BL@) ̎c5Zp7OSl1֏E{"^{]t~x{rm]`q2_}[W**%o´sW␷fTTPc,k۶w*WĖyWRAGoByi3ۺRa\T:suu>L[Z`NJ\}2#JI׊^?K4b[TT10hK>KKTP)9D#RrQAbRr<،o}TTfϒ7Ɣ',/d\}2#{ )O/d֌ \`W  %oF|ɜ ϒ7{aYl*3J\h9*WΛM˟MeV,yL[Z`NJ\}2#{ {X.*Kuțm|!cjyi3 TiV|0>JגwΛmUA:H{"^{ Rp*uB-=#ѷuBƎ-概)OX0_ȸdFܲT:},E\B'd -!oַsW5nt7N J^< yzp kD8J*Vt ʬjN{*H汆 =k*دuT|.'2Yw`QNӖt{;U_#QhT|.'LyBW'8Ly¢B2|hiK L[ZT0miAWAGc ]5"eT|.'LyBW'8Ly¢B2'j/{; kD8J*Vt ʬjNBG#`F#5VRA𵢻TPTf5d/{; kD8K2_+ILeVit=6 夂B28dBG#`F5VRA𵢻TPTfB޽PHk*د(J*Vt ʬY ᎴϲJ*Vt ʬ/z#ܑU_#± 夂B2j/{; kD8J[c%_+ILeKeRJ*NiĕoC} >Uĕ*p|PsqU8]L>%{?|u_suU8hۃ9Y#oʼSj#*3\26mkSD87v1}۩SR:N*%v씪wp5{޹B)*;%\bB۩2bu]9;JNp?K4Se)y:Κc\NyDuTJ.+۩S8(q!˿*N).ktН]DSe)DpgX(|qvRr;U \ǹƒsR;UvJ'd+۩SqQBޝ*p'_T) pgKY5Sŧ]%?P8}Oj.*qP8wNj.*;\|k8O8S% y?UvJ-;es!vP\&NR+\|k8ԜXNRQ\cIƓObwPJT)QspwPJx[s<[SeKeؒ-X-CeV|1cu>*\\Uc| s>Uu.&R/|wC%u y?1T2:N_*9J\qr.1CJ\1T:NcG(G]1Td:N1T㜶y \Y#*9Z:kC%?P}81J'\9C%{8=yy3?1Trlw3;*9qVypwc C8}|cE3mc z8S|cd"\[C%K8%yspg.c q)y/pgc \|8|cR\YjC%:R*yq:1Tr\1J.do*Ooyck}u1Tn\Y(yr+%u>1Tn1ʭ>1TnuyrKux>1Tnz3U1- qR1Tnquqyr.z:?1TnqV1ʭ::1T wB8>1TwN%{:N1Tr,5x>1Tr),%x>1Tty:0U>1Trqy:V>1Tr!{uc ܧ7\?@ABCDEFGHIJKLMNOPoQRSTUVWXIʸ='&&&~Eyq00 p_Q1IWwݓmQѴǣ{2=|<'ݓ9w4xtOByGS5xtO}GyG7(h=|<'S]GdZWw4kL+;kL(h^GdZw4KL;[LL:To:2,I:wL*K6J/'&5'YdmLLY:wLX*DŽ~upY(]^з!]N&ȒF`9Hgݓ D dI $cY(M/pqb &lA<˝8\ȄrpLتҼeV ]~x&yA˄4/hU.wI%`. s"κ'ty:11I/G0I/'Y)6>|Ƿ_ab.?<G&yA˄qǑ oPuĄ~upNh [ut阐%-L0'˙ [e.Lت ̉@lƄ7&t̄2H_&l D ]6c9H_Lتt阤 dIqb.?ϐ%9O-A jK/dIhtyL吙/gZAäi^¤[uS˙INz&nLmI M tٝU.NL%-Lju nM̤V'=nMdR6Sä[e*] Zyi>LUewfR6aҭ2.ۅINǃITLeh=ia~5&$]SǤPIlY21ITm˶E]'mII2w^[&kˤymĤ[e*];g&y¤pUIӼIJ˶31IC}ƾ_7| ty6_~{$M0Uv_gmaR3IJ1 W<L6käU+ǓI}&5L_U: L6KäU+Ĥ>ksmԿz-2 WΟ;&YIJM0U93 WݓI}}äUgmaR&C_gmn W} L6aRgo3i}[L:W-Qtcˤ5ű+쇞I̤PgҪLLVɮ5G`Rs"*]NL:^xLLJgtQraR7BfҪLLPs"*].L5 &&rmU:01Ig}-UϤo53i}[W&t&h1Ŧoc_P~37LҕSVbc_+//K)6& gXƄ gLxH83te9HLV<$-3a&81a(1;τ gL0'ALV<$-3A|p i^2a| [eLL!L$]gH+%0+„Ƅ~] qbB0_qbB0*+t^P6-L $(\L۱XƄ޷h0T φ̄z2a [ut&x[ -LFo <jAb;Ļ 6&l|tv&TeerpLHsDŽLҕrBߊLX}cBߊe&xH8dIht唙`NYd,isy0IWv޷iaB=L0'dg9Hg~g!L}6d&l7HW. i^ -L0'3ۂnAf9H珝 5Z&tv91I0'ӓ Ҋe&tA xH8[fx gsL+JtL >NL3oC2Ҽe!| [en?<Ҽ i^iC?з!l [/$K` |cx ra |c!l D ?̉@:L0' arLV$~z-Z&gB}[d&ȒFe&xHgǃ D !L $Q:0oC:>L P3jL l UY۟1۟wp6DŽq"Ǒ *8&l7HWJ` [ut{0[DŽA=&yA˄b8LȄJ L//H p#A¹&yA˄qő \.LX*DŽLqefJϖ V'g˄Ƅm!])I=eP9d&X0evt&l_^۳Ge&xH8Y(x&xHgǃIg&rbV1akHt/}p̄ g ipg&iC21_$}s" D ].L0'ӓ D az Lت tbxMp`B:H8cB:H8I4 A I4eH+Ζ$LS9HC`BL|i*L0'5 xH8[f8\1Is"·Ҽe9Hg 6 a: ̉`Mc/L 9&t2dIhtvз!]N&tL0' Y(]^з!]N&lA0akHrCٟ xH8[f!\&x`N{axMp vtv91n D ].L ;& cB}[+lA阘P5 v09&U333A9&%:&'&H+ΖgBߊe&x[2AyH8rpL}6d&TeeZX  {8&80W0^\1WhLp1yc8\cxMp>Le^+̄q"GDŽm!$az V<$-3A|p.L l pEI[̄J LH o`N{aB=Lت ΄L&g KBĄ޷Lbk gL[p  gf, m^<V<$a3 gL_<$<<̉@b/L .^e ]NLcBL0'rax g?10anp;̉@b/L}e tLLl>0AZp̄rpL}6d&l zQL GpL s"Jv&H+Ζ AkL[po Z&H6 g0T φ̄2HgBUV& @=ԨW&|11 UY$Y(.L0' L0' ˉ 5F&tv91AZp̄4/h`NmAs"·i2I8, mM&v&iC2Ҽe9H8-h`N5$\NI80W82M-l6HL:ar- ?v&lc |dpx,h>6,LMaMRbS71Kl&fap<&zh>69ǦM̙ >qsR5ѹ UMk& |FSIǦh>6kHl*ĪbhksŦ_h>666<#ML)6ΚRl{SM|F&jbJ&^3M,M&Ħ&0I8 |Fu@fM4Y3em(&'41KlJB0I8fx2I8vhkSbp;|FSM\W& g493I |F$NM=M7m$tShIE$tG4H+M>6Ꚙ%6]0I>Is*6ޚXUL kFk0IĔ$t!g45{& ]8g4in[IB >Is,kIBwg4}Z}l$-M>6}Dc#Sg=.Mjb&fMjbU7$th71Kl̚%6inb &+hRǑIBwrM&~uM؈wML)6] >*,71 g4UY8ϱĔ$tOٚ}l$[MKD3MM}l=9coy& ]3embJ)Ŧ.gf.M|{cuMUKוIBgg&+|F3uĦ,MbUhb&f&n٪[f&VY0I芃h*iTUǦrMMXULM/Mt.6}Db41Kl"L´g478DM96}nظfXU&fMk&>雸L"~h3I, mз!\ gL .LW gsL+r0Wɦ V'\ 32aABxya8\bf&[&X02aAe:`ud .&{i !xc ΄q7'Lvn r`udS˄ aL:aev`udev`ud .&;Lnʃ V'Lvj r L:̄ &Xpbv~f &lAß`uB`vG0ꄎ NĄm!& 1W KB%tvf S˄ L% D ! D `NNs"0I/.f&lc Ga^^`NN $Q<`N0a !<$w8\a1y= [ e& y$!8=2kLaNBޙ5˅IBpLpØUrf=pLB+JtL >NL3Iy8\7' V'tS˄s".'& Ȅ4/hՐ΄L0akHg̉@1A6J8^^5$wa$/L%{a6֐ P%}g9Hng9H8=:&8L tv91I{xMp&tv91$dIh|0akH1IL 3ʘPU7'L%s" ̉@Y(8L:!0aABp;dIh3akH1I5fkUpKw`&X$tv91$. D KB% D !8$:H+Ζ$\i^2! Z&/2ˉ D  L$\.D t91$dIh#L0' ]$\.; gLHI0W82M-l6HL:ar-{ߢ_`A:Luʄ L.b6L$rz- 5fj`NĄzQL$r`NN $QBg D !&.f&X„ʘ`NN gLH p#kҼeP98&l5$\;kӾL.yx&/`w 5ŋL0'rbBߊs L1I $Q_`NN [uKvL:`V b V'\ 0$s"p5$\.;Kv0' c9Hng6֐p H+Ζ-̉@rb8\Ȅq"GDŽJ ܜU7Hs"pO&lc $⟨}e, mỏ@B&Ce [5 sY&0ˉI,`N$L0' Ga9Hg̉@B„L.%Ü$dIh8&L .6Us".'&tv0akH/& s"p KB%1$3$dIh3$ D !Xa6֐pLӎqY( N̷LnpɎ V'LŷL$N'&iC2Ҽe8\Ȅq. cP%<`uŷLn8e& U1L:QZ&l7HxĄJ視 V']˄ V's˄ {˄ SDŽJ8`uevG>0W0T !L:aʹev1akH8 KB%t93akHng8u0' GY(;9&lc 0Ix2̉@1 dIh1akHI|9H8=:&9`, m9s" 9H8=^ KB%3ap13 $QB0&L0' G7'&ȒF „m!!8$R`NN $QBtL0' 0Ix3̉@R xH8[fBL.$.f&9`, mc9H D 蘰5$I&ȒF s"s"pztLpsB` 0fj UpL>`kHg? dIh`N0$ӣ0Ix ̉@1 dIh.`N0ap13akHx<& =$ܜp0A6Js"܅ p nNx2aoxL0' s"0$. XC%tLNs"pLL%c9Hng!l p##0I8ủ@1  LpsB`, m̉@Bp/L0' c6֐p Sx dIh{2$„m!<$.kӥC:H8cBUV& 5Ŏ [ K$tq .&l$.ӥ`&xaVA1I8=:.f&T1I@UܜpfBUV& ̉@1a x0I8= ܜpf, mp211I8D tqL%´0$̉@B&dp gLH i^2apqd6֐py& rpL*H8S1&l$Ii0^\$$QB;&LND &lc rap ;H8gexMpY&l7Hgkͧ XC:$'q̄2&T1 dIhn:1$0a&ؤ D ]NLN{ap>2dIh.&w&d9H8=^`uBDŽmAy0akH8I¹!KB%tab9Hyg9H8 D ].L$ ̉@R-Ҽe8\Ȅq̄J ܜU7H8?&ȒF ].LV1$`9H8O&ߙ5$$8`NN $QBW̉@B&d6֐pcp13 dIh`NB~0$'̉@☰5$$|2ӣc&ȒF ]81$`xMpI ̉@:5$$|v%˅ $3 UeL*cBUܜ1a`NN nN80Ts" ;3I8ȒF nL0' Ka9Hyg9H8O&H+Ζ-ҼeBL0' G`9HV5$$N0' GNLت gwf, m~]0W3 $ΐ%"~apvOEݿ2$3$'̉@P5 D (L0' nL+r-SNs"ULFJ50aw2 5Nh [eߕb K`V͆]*&9a[݈~uߥfBUV&[,cV721JUAw.Lg&%iĤo53޺LU2xpI%-^%IeIF3iߊWrx0ҊW gL*xp.z39 פ.60T:n*?QraRYQB7uLjND%3R9uLگNe̤.)ZEΖtȤV'm0f?INz[&fi-Lju2vi-LjNDtȤDT:R}fRNe̤i1i:2J+^%-3imoūe&_J8mt:&}6LUi0x2Z<1ͦe¤lK J+^%-3U¹LWϤDTb/Lj7-4&n*i.¤Xk S5'&CI;2SǤ6TB¤DTtkKTf/i.+QϤD*ٙjW&d2U7&*Iפ.vI͉tv91R9uLگNޘ*+Pw~ƤC1i5ߘTS,3P9uLjM%+G&I]->#QrbҥrFǤ.I21?3>gm\7{{| >okô>kcؓTu^gggJnE}I?e-> SeWuS8)NqS8)NLse^}I?eYQ*u@UUZ nYʬ>okan/fY8)NqS8)NqS8)NqS8)NqSĤ>8)NqS8)NqS8)NqS8)NqSg8)NqS8)NqS8)NqS8)NqS8)NqS8)NqS8)NqS8)NqbbߥZg}0:1oCԿK>1Ŧ]G/~ۏ|SU?3xk;SǤMӉIeIc-3xMjq˼39~ӾLt.UŤK1i:MseIeIcZ?ՅIŻE=yQϤV'ma6LjuҦmtoJU1xg4/MitoJU1xgR6Kä|TI͉hʤ$m/xL*KRbkfb_V?:&5'=פ.ݓIeIƾؚ_pW&[{ͤK1i:]?2i:] fRs"~x++`{¤|2!(_bkLjuӍIagR6 PaOUZW!HZmYto*A}^4{4&5'-~x++ڲ^0˲b}?g~u?Z`}^14aR7;uLݴ ~H;n?:*cm ?̅I͉oˢڄi-v8L:W19mY pW?I%:&}-̤Ҋל\Ϥ.Iʩcmi>&&MsIթޘz&XFǤpU]LjcqIӼ_ٗaRz&[뙴jLU~ݵʍWWpWw1}fRz&[꼯CUAN/=Qke&LtI̤PkˤDԷe};#J50Ok5'-~x++[0iE=yQϤOk1&VXU2ȟʤ4Z164ZyM"p"ȟc!i.ݵx&}*_~ׯpWZu-3>LjND}[`mw#0x־G`N.n-{G&uSǤMep^?X[]6 >m[Y1e0,I}]hmw}D#פmLjNDz&ZӉ J+^ep16a.LLsQikN=^eǃIVWǤ$mtLSlQW[ƦGjMU{sQYGǤC釪eĤϦ^?0`LڷU¹L*KR}W&I-p_Ԝf?L*xׯN?UWW8LmіI͉tpLJ wz&MIN nMS*&LjufltoJU19MsZT>100ԟkNgb_V?:&5'=ʒǴ[fbUߙԜf?L:TNnM¤Ҋל\Ϥ$LWϤDwI7f&]}cҭRF)iUYqbҾ`ҾIVJ8̤$msy0iߊW gfRYاyt&8o}em5gb]޷T>19a]Ťp_gRkC`ĉI͉ c*&Z=np_gҥr꘴*+p_K1iVeeba]pU[&VϤ|cq¤6Z*+󟙴f&Ԇ28\5GǤҊ|k&5'ֺIZѽ*36ԗt&L*K6̤DZW1U;VǤo_tbf~uj}^jW&[{ͤPkfҪLL-Q_ԜuhcJI+1&ĘtcRs"<Q-:538\5GǤZyIթI.f&֡UNvjtL-:nIݜt[&ĴWy}~ثaĞ0i}[LZV3ʒǴ[fbUߙԜf?LZf&Z=C-SǤUYkLZ6-LZ6}b޷2i}[LZVI;>L:W1i=ZL*xfRs"Z[*&曾ԜUZ nM}Ikɤ$mc_lL;VǤo_tbf~uj}^jW&[{ͤPkfzez'&:-LZU:Wc4/2J3VeebbړEeIFIsx08\5ǑIӼhˤDZW16jbRs"')J+^% U]lt nMa5zϤDW/+ʒ2פ;쇞IN:{ˤM_ʒ2פ}ugRs"3;%e&I-ZUʤD4gRN2vykcҥr꘴_Εy&I]<'Sʤ$mc_lLڷ5IeIƿLڷUٿ06*]NLLT9ULZLju n7ߥI\ifRoLZW/פҗU?T/+|ߡԯedRs"3,I}십Y?#iU{&I-ecm5gbړJ͉h.j8Hq>okggmRUCJU Ҏy¤5kfco_>T> פLjNDun*&}uʤDZW16<Z0vS_̤Pkݿ2E[&Msi|N-2i+LVs"jt~ &LKU n7-G&:yotibR6aINφI*&:i n7-U5TLju&6LݴTP1I n7-U5TLjusäMKU Z׆I*&:i&nZjotibR6aINI*&Wg4/[Ƥ|ٍR3iUV2y̤5 a_ݢIӼgRonMZfҪLLJYֺeR6aʹTP1I|PIRUc4L*KRdtk-U5oLLJeIci^&ZKU/UfRYX3L:^Z29~tk.O'&Tgyg$q^wϤXkcb6%s_nc)RY~KU16ZjߘU>5IRUcĔ?z09+vLZzw׃Ivqo{=rr^;&7L2XV$`bj]1/{혘Ou*Y)6闿??~?__}i~U_~_O_Ͽ~~a&e&!p˯~Oo0zxLˏ? p_g=B<_ן˯럾7L־+G_~—_}Ɇ`y׎)Z}S*>1o_aݫzxL|OM}#c ׿w_7Ly]g=B<?~_~|?}ouˬ>1f? ~o?}odg=B<8_W뗟 _abR=;NLL>qSl |q|ٛ8ʼnI\::q }UÎ*7Bgp6q0I8[E8[n$gL޷LV3}o$mϘ$qLϘ$}11I8pI?_1MS$/2I8WL')2c^{=IP_$}4M-𯘦ep;+ij$iZ& 3&& rϘ$]Z&3ma6LjuҦmtoJ Z80 Disassembler for CP/M This disassembler produces "expanded INTEL mnemonics for the ZILOG Z80 microprocessor" in the same syntax as that required by Digital Research's macro assembler "MAC" with "Z80.LIB". It uses the BDOS buffered console input to get commands so use the standard CP/M line-editing keys as required by your CP/M version (2.2 allows use of backspace key). The program may be interupted during a listing by striking the ESC key which will return to the command level. The display may be stopped by using the ^S function which is described in your CP/M manual. If you push ^C in the command line or during a ^S pause you will return to CP/M and your current symbol table and disk output will be lost. The disassembler is executed by typing "DISASM" or "DISASM filename.type". If a filename is specified it must be of type ".HEX" or ".COM" and the program will Initialize and load the file into address 3000H and set the offset. If the file is type .COM then the offset is to 0100H but if the file is type .HEX the offset is computed from the first address encountered in the hex file. The DISASMbler commands are: I - initialize memory, offset and symbol table F - open file and write all further listings into this file C - close file Q - quit (return to CP/M) ^C also does this O - set offset for program H - set hard copy on/off S - build (append to) symbol table Z - build (append to) symbol table from vector T - print symbol table X - print cross-reference table N - mnemonic dump L - list code to file D - list data to file V - list vector data to file A - dump ASCII data to file The normal procedure for disassemble a program would be to load DISASM and the program and using the "N" command (perhaps with hard copy) to locate data areas, vector tables, etc making a list of their addresses. Then build the symbol table ("S" command) for each code section and the vector-symbol table ("Z" command) for vector table sections. Next create an output file and list each section (code, data, vectors, ASCII data) in order to the file. Close the file and return to CP/M completing the session. The commands are defined in detail below: I - INITIALIZE Initializes symbol table pointers and sets offset to zero. Should ONLY be done if the program to disassemble is in memory before DISASM was executed and no filename.type was specified. O - OFFSET PROGRAM Sets program offset according to the address where the code physically resides at this moment () and the address where the code resides when it is executing (). The should not be less than 3000H to allow the disassembler enough room for the symbol table. The last address in the symbol table can be read by using the "T" (print symbol table) command. If the symbol table is empty this address will be the starting address for the symbol table. F - CREATE FILE AND SEND FURTHER LISTINGS TO IT Creates file named filename.ASM and directs the disassembler to send all output from the "A", "L", "V", "D" commands to this file. If the file already exists it will be deleted. Only one file may be open at a time. C - CLOSE FILE Closes current file. Must be done before returning to CP/M and before another file can be opened. Q - QUIT AND RETURN TO CP/M Does the same as ^C, simply re-boots CP/M. H <0 or 1> - HARD COPY ON/OFF Turns hard copy echo on (1) or off (0). Similar to CP/M's ^P function except that only program output is sent to the printer (commands and error messages are not). S - BUILD SYMBOL TABLE Builds or appends to current symbol table from code starting at address and ending at the instruction before or at address . Z - BUILD SYMBOL TABLE FROM VECTOR Builds or appends to current symbol table from vector table at address until address . Vector tables are assumed to be in the format of: a groupe of compare bytes followed by an address. The number of compare bytes may be zero (pure vector addresses) or 1-9. The starting address () addrsses the first compare byte. This allows command tables to be disassembled easily. This command will request a "SKIP" value that is the number of compare bytes before the first, and between subsequent, addresses. T - DISPLAY SYMBOL TABLE Displays the last address used by the symbol table and displays all entries in the symbol table. X - DISPLAY CROSS REFERENCE TABLE Displays cross reference table for code beginning at address untill address . The cross reference table consists of a list of all instructions that address symbols in the current symbol table. This does not include references by vector tables. N - MNEMONIC DUMP Displays memory contents from address to address in hexidecimal, ASCII, and instruction. Each line is formed by the instruction that is at the address (a three byte instruction will produce a line covering three bytes). The ASCII codes are represented in the following manner: If the character is preceded by "^" then the 7 bit character is a control code (00-1F). If the character is followed by "'" then the 8th bit is HI (1). L - LIST CODE TO FILE Lists instructions from address to address and writes each displayed character to the file if it is open. D - LIST ; ; SELF-RELOCATING 8080 DIS-ASSEMBLER ; FOR CP/M COM FILES ; ; CP/M FUNCTION CODES ; RDCON: EQU 1 WRTCON: EQU 2 WRTLST: EQU 5 CSTAT: EQU 11 OPENF: EQU 15 CLOSF: EQU 16 DSKRD: EQU 20 DSKWRT: EQU 21 CREATF: EQU 22 SETDMA: EQU 26 ; ; CP/M INTERFACE ADDRESSES ; BOOT: EQU 0 CPM: EQU 5 FCB: EQU 5CH FCBCR: EQU FCB+32 DBUFF: EQU 80H ; ; MISCELLANEOUS EQUATES ; CR: EQU 0DH LF: EQU 0AH TAB: EQU 09H BSP: EQU 08H CTRL: EQU 40H ; ORG 0100H ;BASE OF TPA ; ; FIRST, RELOCATE THE DIS-ASSEMBLER ; LXI SP,STACK ;SET UP A TEMPORARY STACK LXI H,RELMSG ;POINT TO RELOCATION MESSAGE CALL PMSG ;WRITE IT CALL RDHEX ;READ THE NEW ADDRESS PUSH H ;SAVE IT ON STACK LHLD SBOT ;GET END OF RELOC BLOCK XCHG ;PUT IT IN DE LHLD SSTRT ;GET BEGINNING OF RELOC BLOCK CALL COMPH ;COMPLEMENT HL DAD D ;COMPUTE LENGTH MOV B,H ;MOVE IT TO B MOV C,L ; AND C POP H ;RECOVER DESTINATION DAD B ;ADD LENGTH MOVER: LDAX D ;GET A BYTE FROM SOURCE MOV M,A ;RELOCATE IT MOV A,B ;TEST REMAINING LENGTH ORA C ;SET FLAGS JZ CHGADR ;DONE MOVING DCX H ;LOWER DESTINATION DCX D ;LOWER ORIGIN DCX B ;LOWER COUNT JMP MOVER ;CONTINUE CHGADR: PUSH H ;SAVE DESTINATION XCHG ;GET BEGINNING CALL COMPH ;COMPLEMENT IT POP D ;RECOVER DESTINATION DAD D ;COMPUTE OFFSET SHLD DISP ;SAVE IT XCHG ;SAVE COPY OF DISPLACEMENT LHLD STOP ;END OF DIS-ASSEMBLER DAD D ;DERIVE NEW ADDRESS SHLD STOP ;SAVE IT LHLD STRT ;START OF CODE DAD D ;DERIVE NEW END SHLD STRT ;SAVE IT DCX H ;MINUS ONE TO ENTER LOOP LOOP: INX H ;NEXT BYTE XCHG ;ADDRESS TO DE LHLD STOP ;GET END ADDRESS XCHG ;SWITCH BACK MOV A,E ;GET LOW BYTE SUB L ;COMPARE MOV A,D ;GET HIGH BYTE SBB H ;FINISH COMPARE JC COMPLT ;EXIT ADDRESS MVI B,1AH ;GET 3 BYTE OPCODE COUNT LXI D,TAB3 ;ADDRESS OF 3 BYTE OPCODE TABLE CHEK3: LDAX D ;GET TABLE ENTRY CMP M ;COMPARE TO THIS OPCODE JZ ACT ;GOT ONE DCR B ;COUNT - 1 INX D ;TABLE + 1 JNZ CHEK3 ;TRY AGAIN MVI B,12H ;LENGTH OF 2 BYTE TABLE LXI D,TAB2 ;ADDRESS OF 2 BYTE TABLE CHEK2: LDAX D ;GET TABLE ENTRY CMP M ;COMPARE TO THIS OPCODE JZ SKIP ;GOT IT DCR B ;COUNT - 1 INX D ;TABLE + 1 JNZ CHEK2 ;KEEP GOING JMP LOOP ;SKIP THIS BYTE SKIP: INX H ;SKIP TWO BYTES JMP LOOP ;AND CONTINUE ACT: PUSH H ;SAVE THIS ADDRESS LHLD SBOT ;GET END OF BLOCK ADDRESS XCHG ;PUT IT IN DE LHLD SSTRT ;GET START OF BLOCK MOV B,H ;PUT START ADDRESS MOV C,L ; IN BC POP H ;RECOVER CURRENT ADDRESS INX H ;ADD 1 MOV A,E ;SET UP A SUBTRACT SUB M ;ADJUST THE LOW BYTE INX H ;POINT TO HIGH BYTE MOV A,D ;SET UP SUBTRACT SBB M ;ADJUST HIGH BYTE JC LOOP ;PAST END OF PROGRAM,DON'T ADJUST DCX H ;BACK TO LOW BYTE MOV A,M ;GET IT SUB C ;OFFSET IT INX H ;POINT TO NEXT MOV A,M ;GET HIGH BYTE SBB B ;OFFSET IT JC LOOP ;BEFORE START OF PROGRAM, DON'T ADJUST DCX H ;BACK TO LOW BYTE XCHG ;SWITCH WITH DE LHLD DISP ;GET OFFSET XCHG ;RESTORE HL MOV A,M ;GET LOW BYTE ADD E ;ADD OFFSET MOV M,A ;REPLACE IT INX H ;POINT TO HIGH BYTE MOV A,M ;GET IT ADC D ;OFFSET IT MOV M,A ;PUT IT BACK JMP LOOP ;ON TO THE NEXT ONE COMPH: MOV A,H ;GET H CMA ;REVERSE IT MOV H,A ;PUT IT BACK MOV A,L ;GET L CMA ;REVERSE IT MOV L,A ;PUT IT BACK INX H ;PLUS 1 RET ;AND GO BACK COMPLT: LXI D,START ;ORIGINAL START ADDRESS LHLD DISP ;DISPLACEMENT DAD D ;CURRENT ADDRESS PCHL ;START DIS-ASSMEBLER TAB3: DB 001H,011H,021H,022H ;LXI B,LXI D,LXI H,SHLD DB 02AH,031H,032H,03AH ;LHLD,LXI SP,STA,LDA DB 0C2H,0C3H,0C4H,0CAH ;JNZ,JMP,CNZ,JZ DB 0CCH,0CDH,0D2H,0D4H ;CZ,CALL,JNC,CNC DB 0DAH,0DCH,0E2H,0E4H ;JC,CC,JPO,CPO DB 0EAH,0ECH,0F2H,0F4H ;JPE,CPE,JP,CP DB 0FAH,0FCH ;JM,CM TAB2: DB 006H,00EH,016H,01EH ;MVI B,MVI C,MVI D,MVI E DB 026H,02EH,036H,03EH ;MVI H,MVI L,MVI M,MVI A DB 0C6H,0CEH,0D3H,0D6H ;ADI,ACI,OUT,SUI DB 0DBH,0DEH,0E6H,0EEH ;IN,SBI,ANI,XRI DB 0F6H,0FEH ;ORI,CPI ; ; STORAGE AREAS FOR RELOCATOR ; SSTRT: DW START ;START OF SOURCE SBOT: DW LAST ;BOTTOM OF SOURCE STRT: DW START ;START OF FIX AREA STOP: DW DATA ;END OF FIX AREA DISP: DW 0 ;DISPLACEMENT ; DS 32 ;STACK SPACE ; STACK: EQU $ ; ; BEGIN DIS-ASSEMBLER PROGRAM ; ; SET MEMORY POINTERS ; START: LHLD CPM+1 DCX H SPHL MOV A,L SUI 64 MOV L,A MOV A,H SBI 0 MOV H,A SHLD ENDMEM ; ; OPEN THE TARGET FILE ; OBJRTY: CALL CLFCB LXI H,OFMSG CALL PMSG LXI H,FCB+1 CALL RDFCB LXI D,FCB MVI C,OPENF CALL CPM CPI 255 JNZ OBJOK OBJERR: LXI H,FERMSG CALL PMSG JMP OBJRTY OBJOK: LXI H,FLDMSG CALL PMSG CALL RDHEX SHLD DMA ; ; READ TARGET FILE ; NEXSEC: XCHG LXI H,START MOV A,L SUI 128 MOV L,A MOV A,H SBI 0 MOV H,A CALL TSTHD JC OOMEM MVI C,SETDMA CALL CPM LXI D,FCB MVI C,DSKRD CALL CPM ORA A JNZ OBJDON LHLD DMA LXI D,128 DAD D SHLD DMA JMP NEXSEC OOMEM: LXI H,OMMSG JMP OBJERR+3 ; ; ESTABLISH OPERATING PARAMETERS ; OBJDON: LHLD DMA DCX H XCHG LXI H,ULMSG1 CALL DEMEM LXI H,ULMSG CALL PMSG LXI H,DISMSG CALL PMSG LXI H,STAMSG CALL PMSG CALL RDHEX SHLD NXTADD SHLD STADD LXI H,ENDMSG CALL PMSG CALL RDHEX SHLD ENDAD SHLD ENDAD2 LXI H,OFSTMS CALL PMSG CALL RDHEX SHLD OFFSET LXI H,PRMSG CALL PMSG CALL CONIN MVI E,0 CPI 'Y' JZ PRTOPT DCR E PRTOPT: MOV A,E STA PRSWCH LXI H,SOMSG CALL PMSG CALL CONIN MVI E,0 CPI 'Y' JZ SRCOPT INR E SRCOPT: MOV A,E STA SROSW JNZ NOSRC ; ; DISK OUTPUT IS DESIRED ; OPNOUT: CALL CLFCB LXI H,SFMSG CALL PMSG LXI H,FCB+1 CALL RDFCB LXI D,FCB MVI C,CREATF CALL CPM CPI 255 JNZ OPENOK LXI H,FERMSG CALL PMSG JMP OPNOUT OPENOK: LXI H,DBUFF SHLD NXTOUT XCHG MVI C,SETDMA CALL CPM NOSRC: MVI B,6 PUSH B LXI D,DATAS ; ; ESTABLISH KNOWN DATA AREAS ; SETKDA: POP B DCR B PUSH B JZ NODATA LXI H,KDAMSG CALL PMSG CALL CONIN CPI 'N' JZ NODATA LXI H,STAMSG CALL RSTHEX LXI H,ENDMSG CALL RSTHEX JMP SETKDA NODATA: POP B CALL CLINE LXI H,WRKMSG CALL PMSG LHLD ENDMEM  XCHG LXI H,SYMTB ; ; FILL THE SYMBOL TABLE WITH FF'S ; CLRTAB: XRA A DCR A MOV M,A INX H CALL TSTHD JC CLRTAB CALL ADDISP LXI H,OPRLEN MVI M,0 CALL CHKDTA JC NXTLIN ; ; BUILD THE SYMBOL TABLE ; BY SETTING UP ALL ADDRESSES ; REFERRED TO ; BLDTBL: LHLD NXTWRK XCHG CALL GETOPC LDA OPRLEN CPI 2 JNZ NXTLIN LHLD NXTWRK INX H MOV E,M INX H MOV D,M XCHG SHLD TMPSYM CALL SYMTST JNC NXTLIN LXI H,-1 CALL SYMTST JC TBLFUL LHLD TMPSYM XCHG MOV M,E INX H MOV M,D SHLD ESYMT NXTLIN: CALL NXTOPR XCHG LHLD ENDAD CALL TSTHD JNC BLDTBL LHLD ESYMT SHLD ENDMEM LXI D,0 LXI H,SYMTB+2 ; ; ASSIGN NUMBERS TO THE SYMBOL ADDRESSES ; NBRSYM: MOV M,E INX H MOV M,D INX H INX H INX H PUSH D XCHG LHLD ENDMEM INX H INX H CALL TSTHD JC DOORG XCHG POP D MOV A,E ADI 1 DAA MOV E,A MOV A,D ACI 0 DAA MOV D,A JMP NBRSYM ; ; WRITE AN ORG STATEMENT TO START THE PROGRAM ; DOORG: CALL SETADD CALL ADDRO LXI H,LOPCOD LXI D,ORGLIT CALL STRMOV XCHG LHLD NXTADD XCHG LXI H,LOPRND CALL DETOLN CALL FINLIN LXI H,LINE CALL PRTLIN ; ; DECODE THE OBJECT AREA TO INSTRUCTIONS ; DECODE: CALL ADDRO LXI H,OPRLEN MVI M,0 CALL MOVHEX CALL CHKDTA JC ISDATA LHLD NXTWRK XCHG CALL GETOPC PUSH B CALL MOVHEX LDA OPRLEN CPI 3 JZ ISDATA POP H MOV A,M CPI ' ' JZ NOREG CPI 'S' JNZ NOTSP INX H MVI M,'P' JMP NOTPSW NOTSP: CPI 'P' JNZ NOTPSW INX H MVI M,'S' INX H MVI M,'W' NOTPSW: LDA OPRLEN DCR A JM NOREG INX H MVI M,',' INX H NOREG: SHLD ENDLIN JMP PUTLAB ISDATA: LXI H,OPRLEN MVI M,0 LXI H,LOPCOD LXI D,DBLIT MVI C,4 PUTOPR: LDAX D MOV M,A INX D INX H DCR C JNZ PUTOPR LHLD NXTWRK XCHG LXI H,LOPRND MVI M,'0' INX H LDAX D CALL VALCH1 JNC PUTOP2 DCX H CALL PUTLIT JMP PUTOP3 PUTOP2: CALL HEXMEM MVI M,'H' PUTOP3: SHLD ENDLIN PUTLAB: LHLD NXTADD CALL SYMTST JC NOTSYM LXI H,LSYMBL CALL PUTSYM MVI M,':' LXI H,SEMICL CALL WRTLIN NOTSYM: LHLD NXTWRK INX H LDA OPRLEN CPI 2 JNZ NOT3BT MOV E,M INX H MOV D,M XCHG CALL SYMTST JNC PTCMNT XCHG LHLD ENDLIN CALL DETOLN JMP NOT2BT ; ; ADD A COMMENT TO SHOW THE ABSOLUTE ADDRESS ; REFERRED TO IN THE INSTRUCTION ; PTCMNT: LHLD ENDLIN CALL PUTSYM LXI H,LCOMNT MVI M,';' INX H MVI M,'(' PUSH H LHLD NXTWRK INX H MOV E,M INX H MOV D,M POP H INX H CALL DEMEM MVI M,')' SHLD ENDLIN JMP NOT2BT NOT3BT: CPI 1 JNZ NOT2BT LHLD ENDLIN MVI M,'0' INX H XCHG LHLD NXTWRK INX H MOV A,M CALL VALCH1 JNC LITRAL XCHG DCX H CALL PUTLIT JMP NOTLIT LITRAL: XCHG CALL HEXMEM MVI M,'H' NOTLIT: SHLD ENDLIN NOT2BT: CALL FINLIN LXI H,LINE CALL PRTLIN CALL NXTOPR LHLD NXTADD XCHG LHLD ENDAD CALL TSTHD JNC DECODE JMP ENDDIS ADDRO: CALL CLINE LHLD NXTADD XCHG LXI H,LINADR JMP DEMEM DETOLN: XRA A CALL HEXMEM CALL DEMEM MVI M,'H' SHLD ENDLIN RET STRMOV: LDAX D MOV B,A STRMV2: INX D LDAX D MOV M,A INX H DCR B RZ JMP STRMV2 PUTLIT: MVI M,'''' INX H MOV M,A INX H MVI M,'''' RET ; ; DETERMINE IF THE CURRENT CHARACTER IS A ; VALID ASCII CHARACTER. THIS ROUTINE HAS A ; LIMIT CHANGED IN THE SECOND PASS. FIRST PASS ; DISK OUTPUT USES TABS INSTEAD OF BLANK ; SPACES FOR DELIMITERS. THE SECOND ; PASS (PRINT ASCII MAP) CHANGES THE LIMIT TO ; PRINT SPACES. ; VALCH1: CPI 07FH RNC CPI '!' ; CHGLIM: EQU $-1 ; CMC RET MOVHEX: LHLD NXTWRK XCHG LXI H,LHEXDA LDA OPRLEN CPI 3 JNZ SKIP1 XRA A SKIP1: INR A MOV C,A LHXDAT: LDAX D CALL HEXMEM INX D DCR C JNZ LHXDAT RET CLINE: MVI B,71 LXI H,LINADR MVI A,' ' CLIN2: MOV M,A INX H DCR B JNZ CLIN2 RET PUTSYM: MVI M,'L' INX H INX D INX D LDAX D MOV B,A INX D LDAX D MOV D,A MOV E,B JMP DEMEM ; ; PRINT THE SYMBOL TABLE ; PRTTBL: LXI H,SROSW LXI D,DSKSWC MOV A,M STAX D INR M CALL CLINE LXI D,SYMTB TBLOUT: MVI C,5 LDAX D INR A JNZ NOTFIN INX D LDAX D INR A RZ DCX D NOTFIN: INX D INX D INX D LXI H,LINADR MORSYM: MVI M,'L' INX H CALL LOADAD DCX D CALL LOADAD INX H INX H INX D INX D INX D INX D INX D INX D INX D DCR C JNZ MORSYM LXI H,LINE CALL PRTLIN DCX D DCX D DCX D JMP TBLOUT LOADAD: LDAX D CALL HEXMEM DCX D LDAX D CALL HEXMEM INX H RET GETOPC: LDAX D CPI 076H JNZ RANGE LXI H,HLTLIT JMP PUTOPC RANGE: MVI D,040H SUB D JC REGOPT SUB D JC ISMOV SUB D JC FIXOPC REGOPT: ADD D LXI H,OPTABL MVI D,0 MOV E,A DAD D DAD D DAD D DAD D DAD D PUTOPC: LXI B,LOPCOD XCHG MVI H,4 CALL TOLINE INX B CALL XINFO RET TOLINE: LDAX D PUTIT: STAX B INX D DCR H RZ INX B JMP TOLINE ; ; DECODE THE DATA BYTE FOLLOWING THE ; OPCODE LITERAL FOR INFORMATION ABOUT ; THE INSTRUCTION BEING DIS-ASSEMBLED. ; ; BITS 7 & 6 = LENGTH OF OPERAND ; (3 = INVALID INSTRUCTION) ; BITS 5 - 0 = OPERAND MINUS 20H ; ; NOTE THAT BITS 5-0 ARE AUTOMATICALLY ; INSERTED INTO THE OUTPUT LINE, THEN ; OVERLAYED IF THE DIS-ASSEMBLER DETERMINES ; THAT THE NEXT BYTE IS USED TO DETERMINE ; WHAT THIS OPERATION IS TO DO. ; ; SINCE BITS 5-0 HAVE A 20H ADDED TO THEM, ; SETTING THEM TO ZERO RESULTS IN A BLANK ; SPACE BEING WRITTEN TO THE OUTPUT LINE. ; ; XINFO: LDAX D RLC RLC MVI H,003H ANA H STA OPRLEN LDAX D MVI H,3FH ANA H ADI 020H LXI B,LOPRND ALTER2: STAX B RET ISMOV: ADD D STA ISMOV2+1 LXI B,LOPCOD LXI D,MOVLIT MVI H,3 CALL TOLINE INX B ISMOV2: MVI A,0 MVI H,007H RRC RRC RRC LXI B,LOPRND CALL MASKRG MVI A,',' MVI H,001H INX B CALL PUTIT MVI H,007H LDA ISMOV2+1 INX B CALL MASKRG XRA A STA OPRLEN RET MASKRG: ANA H REGIN: CALL GETREG MVI H,1 CALL TOLINE RET GETREG: LXI H,REGTAB MOV E,A SUB A MOV D,A DAD D XCHG RET FIXOPC: ADD D ADD D ADD D PUSH PSW ANI 038H LXI H,OPTAB2 LXI D,0 RRC RRC RRC MOV E,A DAD D DAD D DAD D XCHG LXI B,LOPCOD MVI H,3 CALL TOLINE XRA A STA OPRLEN LXI B,LOPRND POP PSW ANI 007H JMP REGIN ; ; THE SYMBOL TABLE IS FULL ; TBLFUL: LXI H,TFMSG CALL PMSG ; ; END OF OPERATION DIS-ASSEMBLY PASS ; ENDDIS: CALL CLINE LXI H,LOPCOD MVI M,'E' INX H MVI M,'N' INX H MVI M,'D' CALL MCRLF LXI H,LINE CALL PRTLIN LXI H,SEMICL CALL PRTLIN CALL PRTTBL LXI H,SEMICL CALL PRTLIN MVI A,' ' STA CHGLIM CALL SETADD LHLD OFFSET XCHG LHLD ENDAD DAD D SHLD ENDAD LHLD NXTWRK XCHG ; ; PRINT ASCII MAP OF PROGRAM AREA ; PRASCI: LXI H,LINADR PUSH D PUSH H LXI H,OFFSET MOV A,E SUB M MOV E,A INX H MOV A,D SBB M MOV D,A POP H CALL DEMEM POP D MVI M,' ' NXASCI: INX H LDAX D CALL VALCH1 JNC GETFIL MOV M,A GOODCH: INX D MOV A,E ANI 00FH JNZ NXASCI INX H MVI M,' ' MOV A,E ANI 3FH JNZ NXASCI CALL MCRLF LXI H,LINE CALL PRTLIN LHLD ENDAD CALL TSTHD JC DOXREF JMP PRASCI GETFIL: MVI M,'.' JMP GOODCH ; ; CROSS-REFERENCE ALL SYMBOLS ; DOXREF: CALL CLINE LXI H,SEMICL CALL WRTLIN LXI H,PUTIT XRA A MOV M,A LXI H,ALTER2 MOV M,A LXI H,0 SHLD SYMPTR XRFNXT: CALL ADDSYM CALL SETADD XRFSYM: LHLD NXTWRK XCHG CALL GETOPC LDA OPRLEN CPI 2 JNZ NOXREF CALL ADDSRC LHLD NXTWRK INX H MOV A,M CMP E JNZ NOXREF INX H MOV A,M CMP D JNZ NOXREF LHLD NXTADD XCHG LHLD ENDLIN CALL DEMEM INX H SHLD ENDLIN LXI D,LLAST CALL TSTHD JC NOXREF CALL FINLIN LXI H,LINE CALL PRTLIN LXI H,SYMLOC SHLD ENDLIN NOXREF: CALL NXTOPR XCHG LHLD ENDAD CALL TSTHD JNC XRFSYM CALL FINLIN LXI H,LINE CALL PRTLIN LHLD SYMPTR INX H SHLD SYMPTR LXI D,SYMTB DAD H DAD H DAD D XCHG LHLD ENDMEM CALL TSTHD JC ENDING JMP XRFNXT ; ; JOB FINISHED. CLOSE DISK ; FILE IF NECESSARY. ; ENDING: LDA DSKSWC ADD A JNZ BOOT JMP DCLOSE ADDSYM: CALL LBLSCH LXI H,LINADR MVI M,'L' INX H CALL DEMEM INX H SHLD ENDLIN RET CONSCH: LHLD SYMPTR DAD H DAD H DAD D MOV E,M INX H MOV D,M RET ADDSRC: LXI D,SYMTB JMP CONSCH LBLSCH: LXI D,SYMTB+2 JMP CONSCH HANGUP: MVI C,'?' CALL CONOUT JMP START RDHEX: LXI H,0 NXTHEX: CALL CONIN CPI CR RZ CPI 'C'-CTRL JZ START DAD H DAD H DAD H DAD H JC HANGUP CALL TOBINY JC HANGUP ORA L MOV L,A JMP NXTHEX TOBINY: SUI '0' RC ADI 0E9H RC ADI 006H JP TOBIN2 ADI 007H RC TOBIN2: ADI 10 ORA A RET DCLOSE: LHLD NXTOUT MOV A,L CPI DBUFF JZ DONE MVI C,1AH CALL DWRITE JMP DCLOSE DONE: LXI D,FCB MVI C,CLOSF CALL CPM JMP BOOT DWRITE: PUSH H LHLD NXTOUT MOV M,C INX H SHLD NXTOUT MOV A,H POP H CPI 0 RZ PUSH B PUSH D PUSH H LXI H,DBUFF SHLD NXTOUT LXI D,FCB MVI C,DSKWRT CALL CPM POP H POP D POP B CPI 0 RZ HLT WAITER: PUSH B PUSH D PUSH H MVI C,CSTAT CALL CPM ANI 1 JNZ WAITR3 WAITR2: POP H POP D POP B RET WAITR3: MVI C,RDCON CALL CPM CPI 'C'-CTRL JZ BOOT CPI 'P'-CTRL JNZ WAITR2 LDA PRSWCH CMA STA PRSWCH JMP WAITR2 CONIN: PUSH B PUSH D PUSH H MVI C,RDCON USECPM: CALL CPM POP H POP D POP B RET CONOUT: PUSH B PUSH D PUSH H MOV E,C MVI C,WRTCON JMP USECPM LSTOUT: CALL WAITER PUSH B PUSH D PUSH H MOV E,C MVI C,WRTCON CALL CPM POP H POP D POP B LDA PRSWCH ORA A RNZ PUSH B PUSH D PUSH H MOV E,C MVI C,WRTLST JMP USECPM HEXOUT: PUSH PSW RRC RRC RRC RRC CALL TOASCI MOV C,A CALL LSTOUT POP PSW CALL TOASCI MOV C,A JMP LSTOUT HEXMEM: PUSH PSW RRC RRC RRC RRC CALL TOASCI MOV M,A INX H POP PSW CALL TOASCI MOV M,A INX H RET PMSG: MOV B,M INX H CALL CRLF PMSG1: MOV C,M CALL CONOUT DCR B RZ INX H JMP PMSG1  FINLIN: LHLD ENDLIN MCRLF: INX H MVI M,CR INX H MVI M,LF RET TSTHD: MOV A,L SUB E MOV A,H SBB D RET ADDISP: LHLD OFFSET XCHG LHLD NXTADD DAD D SHLD NXTWRK RET TOASCI: ANI 00FH ADI 090H DAA ACI 40H DAA RET DEMEM: MOV A,D CALL HEXMEM MOV A,E JMP HEXMEM NXTOPR: LHLD NXTADD XCHG LHLD NXTWRK LDA OPRLEN INR A NXTOP1: DCR A JM NXTOP2 INX H INX D JMP NXTOP1 NXTOP2: SHLD NXTWRK XCHG SHLD NXTADD RET CRLF: MVI C,CR CALL CONOUT MVI C,LF JMP CONOUT SYMTST: LXI D,SYMTB SYMTS2: LDAX D CMP L JNZ SYMTS3 INX D LDAX D CMP H JZ SYMFND JMP SYMTS3+1 SYMTS3: INX D INX D INX D INX D PUSH H LHLD ENDMEM CALL TSTHD POP H JNC SYMTS2 RET SYMFND: STC CMC DCX D RET SETADD: LHLD STADD SHLD NXTADD LHLD ENDAD2 SHLD ENDAD JMP ADDISP PRTLIN: CALL WRTLIN JMP CLINE WRTLIN: PUSH B MOV B,M WRTLN2: INX H MOV C,M MOV A,M STA CHAR PUSH B CALL LSTOUT POP B LDA SROSW ADD A JNZ NODISK MOV A,B CPI 57 JNC NODISK MOV A,C CPI ' ' JNZ OVLFLO LDA THOLD CPI TAB JZ NODISK MVI C,TAB OVLFLO: MOV A,C STA THOLD CALL DWRITE NODISK: LDA CHAR DCR B CPI LF JNZ WRTLN2 POP B RET CHKDTA: MVI B,5 LXI H,DATAS CHKDT2: CALL LOADDE PUSH H LHLD NXTADD CALL TSTHD POP H JNC CHKDT4 CHKDT3: CMC RET CHKDT4: CALL LOADDE PUSH H LHLD NXTADD XCHG CALL TSTHD POP H JNC CHKDT3 DCR B JNZ CHKDT2 CMC RET LOADDE: MOV E,M INX H MOV D,M INX H RET RSTHEX: CALL PMSG CALL RDHEX XCHG MOV M,E INX H MOV M,D INX H XCHG RET CLFCB: XRA A STA FCB LXI H,FCB+1 MVI B,11 CLFCB2: MVI M,' ' INX H DCR B JNZ CLFCB2 MVI B,21 CLFCB3: MVI M,0 INX H DCR B JNZ CLFCB3 RET RDFCB: CALL CONIN CPI CR RZ CPI '.' JZ RDFCB1 CPI 7FH JNZ RDFCB2 DCX H MVI C,BSP CALL CONOUT JMP RDFCB RDFCB2: MOV M,A INX H JMP RDFCB RDFCB1: LXI H,FCB+9 JMP RDFCB ; ; DATA AREAS ; DATA: EQU $ ; NXTOUT: DW 0 NXTADD: DW 0 STADD: DW 0 ENDAD2: DW 0 ENDAD: DW 0 OFFSET: DW 0 NXTWRK: DW 0 OPRLEN: DB 0 TMPSYM: DW 0 SROSW: DB 0 THOLD: DB 0 DATAS: DB 0FFH,0FFH,0FFH,0FFH DB 0FFH,0FFH,0FFH,0FFH DB 0FFH,0FFH,0FFH,0FFH DB 0FFH,0FFH,0FFH,0FFH DB 0FFH,0FFH,0FFH,0FFH CHAR: DB 0 ENDLIN: DW 0 DBLIT: DB 'DB ',0C9H SEMICL: DB 03H,';',CR,LF ORGLIT: DB 03H,'ORG' MOVLIT: DB 'MOV ' HLTLIT: DB 'HLT ',000H OPTABL: DB 'NOP ',000H DB 'LXI ',0A2H DB 'STAX',022H DB 'INX ',022H DB 'INR ',022H DB 'DCR ',022H DB 'MVI ',062H DB 'RLC ',000H DB 'ILLG',0C0H DB 'DAD ',022H DB 'LDAX',022H DB 'DCX ',022H DB 'INR ',023H DB 'DCR ',023H DB 'MVI ',063H DB 'RRC ',000H DB 'ILLG',0C0H DB 'LXI ',0A4H DB 'STAX',024H DB 'INX ',024H DB 'INR ',024H DB 'DCR ',024H DB 'MVI ',064H DB 'RAL ',000H DB 'ILLG',0C0H DB 'DAD ',024H DB 'LDAX',024H DB 'DCX ',024H DB 'INR ',025H DB 'DCR ',025H DB 'MVI ',065H DB 'RAR ',000H DB 'ILLG',0C0H DB 'LXI ',0A8H DB 'SHLD',080H DB 'INX ',028H DB 'INR ',028H DB 'DCR ',028H DB 'MVI ',068H DB 'DAA ',000H DB 'ILLG',0C0H DB 'DAD ',028H DB 'LHLD',080H DB 'DCX ',028H DB 'INR ',02CH DB 'DCR ',02CH DB 'MVI ',06CH DB 'CMA ',000H DB 'ILLG',0C0H DB 'LXI ',0B3H DB 'STA ',080H DB 'INX ',033H DB 'INR ',02DH DB 'DCR ',02DH DB 'MVI ',06DH DB 'STC ',000H DB 'ILLG',0C0H DB 'DAD ',033H DB 'LDA ',080H DB 'DCX ',033H DB 'INR ',021H DB 'DCR ',021H DB 'MVI ',061H DB 'CMC ',000H DB 'RNZ ',000H DB 'POP ',022H DB 'JNZ ',080H DB 'JMP ',080H DB 'CNZ ',080H DB 'PUSH',022H DB 'ADI ',040H DB 'RST ',010H DB 'RZ ',000H DB 'RET ',000H DB 'JZ ',080H DB 'ILLG',0C0H DB 'CZ ',080H DB 'CALL',080H DB 'ACI ',040H DB 'RST ',011H DB 'RNC ',000H DB 'POP ',024H DB 'JNC ',080H DB 'OUT ',040H DB 'CNC ',080H DB 'PUSH',024H DB 'SUI ',040H DB 'RST ',012H DB 'RC ',000H DB 'ILLG',0C0H DB 'JC ',080H DB 'IN ',040H DB 'CC ',080H DB 'ILLG',0C0H DB 'SBI ',040H DB 'RST ',013H DB 'RPO ',000H DB 'POP ',028H DB 'JPO ',080H DB 'XTHL',000H DB 'CPO ',080H DB 'PUSH',028H DB 'ANI ',040H DB 'RST ',014H DB 'RPE ',000H DB 'PCHL',000H DB 'JPE ',080H DB 'XCHG',000H DB 'CPE ',080H DB 'ILLG',0C0H DB 'XRI ',040H DB 'RST ',015H DB 'RP ',000H DB 'POP ',030H DB 'JP ',080H DB 'DI ',000H DB 'CP ',080H DB 'PUSH',030H DB 'ORI ',040H DB 'RST ',016H DB 'RM ',000H DB 'SPHL',000H DB 'JM ',080H DB 'EI ',000H DB 'CM ',080H DB 'ILLG',0C0H DB 'CPI ',040H DB 'RST ',017H REGTAB: DB 'BCDEHLMA' OPTAB2: DB 'ADD' DB 'ADC' DB 'SUB' DB 'SBB' DB 'ANA' DB 'XRA' DB 'ORA' DB 'CMP' SYMPTR: DW 0 DSKSWC: DB 0 PRSWCH: DB 0 DMA: DW 0 ESYMT: DW 0 ENDMEM: DW 0 LINE: DB 71 LINADR: DS 5 LHEXDA: DS 1 SYMLOC: DS 9 LSYMBL: DS 8 LOPCOD: DS 8 LOPRND: DS 10 LCOMNT: DS 20 LLAST: DS 10 DB CR,LF TFMSG: DB (FLDMSG-TFMSG)-1 DB 'SYMBOL TABLE FULL' ; SYMTB: EQU $ ; FLDMSG: DB (STAMSG-FLDMSG)-1 DB 'ADDRESS TO LOAD FILE AT IN HEX = ' STAMSG: DB (ENDMSG-STAMSG)-1 DB 'STARTING ADDRESS IN HEX = ' ENDMSG: DB (OFSTMS-ENDMSG)-1 DB 'ENDING ADDRESS IN HEX = ' OFSTMS: DB (PRMSG-OFSTMS)-1 DB 'OFFSET IN HEX = ' PRMSG: DB (SOMSG-PRMSG)-1 DB 'PRINT DIS-ASSEMBLED CODE (Y/N) ? ' SOMSG: DB (KDAMSG-SOMSG)-1 DB 'SOURCE FILE OUTPUT TO DISK (Y/N) ? ' KDAMSG: DB (WRKMSG-KDAMSG)-1 DB 'KNOWN DATA AREA (Y/N) ? ' WRKMSG: DB (OFMSG-WRKMSG)-1 DB 'WORKING',CR,LF OFMSG: DB (SFMSG-OFMSG)-1 DB 'NAME OF OBJECT FILE ? ' SFMSG: DB (FERMSG-SFMSG)-1 DB 'NAME OF SOURCE FILE TO CREATE ? ' FERMSG: DB (OMMSG-FERMSG)-1 DB 'FILE ERROR' OMMSG: DB (DISMSG-OMMSG)-1 DB 'OBJECT FILE TOO LARGE' DISMSG: DB (RELMSG-DISMSG)-1 DB 'DIS-ASSEMBLY PARAMETERS ----' RELMSG: DB (ULMSG-RELMSG)-1 DB 'ADDRESS TO LOAD DIS-ASSEMBLER IN HEX = ' ULMSG: DB (LAST-ULMSG)-1 DB 'UPPER LIMIT = ' ULMSG1: DS 4 ; LAST EQU $ ; END ' STAMSG: DB (ENDMSG-STAMSG)-1 DB 'STARTING ADDRESS IN HEX = ' ENDMSG: DB (OFSTMS-ENDMSG)-1 DB 'ENDING ADDRESS IN HEX = ' OFSTMS: DB (PRMSG-OFSTMS)-1 DB 'OFFSET IN HEX = ' PRMSG: DB (SOMSG-PRMSG)-1 DB 'PRINT DIS-ASSEMBLED CODE (Y/N) ? ' SOMSG: DB (KDAMSG-SOMSG)-1 DB 'SOURCE FILE OUTPUT TO DISK (Y/N) ? ' KDAMSG: DB (WRKMSG-KDAMSG)-1 DB 'KNOWN DATA AREA (Y/N) ? ' WRKMSG: DB (OFMSG-WRKMSG)-1 DB 'WORKING',CR,LF OFMSG: DB (SFMSG-OFMSG)-1 DB 'NAME OF OBJECT FILE ? ' SFMSG: DB (FERMSG-SFMSG)-1 DB 'NAME OF SOURCE FILE TO CREATE ? ' FERMSG: DB (OMMSG-FERMSG)-1 DB 'FILE ERROR' OMMSG: DB (DISMSG-OMMSG)-1 DB 'OBJECT FILE TOO LARGE' DISMSG: DB (RELMSG-DISMSG)-1 DB 'DIS-ASSEMBLY PARAMETERS ----' RELMSG: DB (ULMSG-RELMSG)-1 DB 'ADDRESS TO LOAD DIS-ASSEMBLER IN HEX = ' ULMSG: DB (LAST-ULMSG)-1 DB 'UPPER LIMIT = ' ULMSG1: DS 4  DISSAM.DOC Dissam.asm is the source for a snazzy disassembler. It is very like Disintel.obj when it is assembled. DIS COM&()*+,DIS INS(-./01DIS AQM23456789:;<=>?@ADIS AQMVBCDEFGHIJKLDISASM AQMMNOPQRSTUVWXYZ[\DISASM AQM]DISASM DOC0^_`abcDISSAM ASMdefghijklmnopqrsDISSAM ASM1tuvwxyzDISSAM $$$1  8080 INSTRUCTION SET EMULATOR Initial Status:  ! 6#6 #6#U! 1 ʈ{yayw# ʌe+e!  ~#ʔ ڮ~# ҡ‘>x22!""= ***Invalid Mnemonic***o= ʝ ***Bad Operand***o=< *# * #!9"# 1 x8o&" =c  ***Reboot Disk***=v *! " = ͸ͮ*# " !9"# 1 !  ***Missing Argument***o 0  ))))O  ***Bad Character in Operand***o"=U|ʝ ***Argument too Large***o=o͸!h"î" =›͸!"î*# * !9"# 1 " ͸* * * *# *! Mis2 "! !9"# 1 : " " "  PC S Z A P C A B C D E H L M SP STACK * ͦ* }͇͇͇͇͇ͩ\ͩ* ͘* ͘*! ͘^ͦ*# ͦ^#V Instruction: _o>1ڐ>0ͩ}\ͩ]éͩ> * *!*  " ~#z{0:_NOPLXI B, STAX BINX BINR BDCR BMVI B,RLC*DAD BLDAX BDCX BINR CDCR CMVI C,RRC*LXI D, STAX DINX DINR DDCR DMVI D,RAL*DAD DLDAX DDCX DINR EDCR EMVI E,RAR*LXI H, SHLD INX HINR HDCR HMVI H,DAA*DAD HLHLD DCX HINR LDCR LMVI L,CMA*LXI SP, STA INX SPINR MDCR MMVI M,STC*DAD SPLDA DCX SPINR ADCR AMVI A,CMCMOV B,BMOV B,CMOV B,DMOV B,EMOV B,HMOV B,LMOV B,MMOV B,AMOV C,BMOV C,CMOV C,DMOV C,EMOV C,HMOV C,LMOV C,MMOV C,AMOV D,BMOV D,CMOV D,DMOV D,EMOV D,HMOV D,LMOV D,MMOV D,AMOV E,BMOV E,CMOV E,DMOV E,EMOV E,HMOV E,LMOV E,MMOV E,AMOV H,BMOV H,CMOV H,DMOV H,EMOV H,HMOV H,LMOV H,MMOV H,AMOV L,BMOV L,CMOV L,DMOV L,EMOV L,HMOV L,LMOV L,MMOV L,AMOV M,BMOV M,CMOV M,DMOV M,EMOV M,HMOV M,LHLTMOV M,AMOV A,BMOV A,CMOV A,DMOV A,EMOV A,HMOV A,LMOV A,MMOV A,AADD BADD CADD DADD EADD HADD LADD MADD AADC BADC CADC DADC EADC HADC LADC MADC ASUB BSUB CSUB DSUB ESUB HSUB LSUB MSUB ASBB BSBB CSBB DSBB ESBB HSBB LSBB MSBB AANA BANA CANA DANA EANA HANA LANA MANA AXRA BXRA CXRA DXRA EXRA HXRA LXRA MXRA AORA BORA CORA DORA EORA HORA LORA MORA ACMP BCMP CCMP DCMP ECMP HCMP LCMP MCMP ARNZPOP BJNZ JMP CNZ PUSH BADI RST 0RZRETJZ *CZ CALL ACI RST 1RNCPOP DJNC OUT CNC PUSH DSUI RST 2RC*JC IN CC *SBI RST 3RPOPOP HJPO XTHLCPO PUSH HANI RST 4RPEPCHLJPE XCHGCPE *XRI RST 5RPPOP PSWJP DICP PUSH PSWORI RST 6RMSPHLJM EICM *CPI RST 7 H,DMOV H,EMOV H,HMOV H,LMOV H,MMOV H,AMOV L,BMOV L,CMOV L,DMOV L,EMOV L,HMOV L,LMOV L,MMOV L,AMOV M,BMOV M,CMOV M,DMOV M,EMOV M,HMOV M,LHLTMOV M,AMOV A,BMOV A,CMOV A,DMOV A,EMOV A,HMOV A,LMOV A,MMOV A,AADD BADD CADD DADD EADD HADD LADD MADD AADC BADC CADC DADC EADC HADC LADC MADC ASUB BSUB CSUB DSUB ESUB HSUB LSUB MSUB ASBB BS 8080A Microprocessor Instruction Set Emulator by Jeff Sheese, RETS Tech Center, Centerville, Ohio 45459 8-18-82 The 8080A Instruction Set Emulator is a teaching tool used to demonstrate the operation of the assembly language commands and how they affect the memory and microprocessor register contents. The emulator was designed to operate the computer in a machine language 'direct' mode. In BASIC, the 'direct' mode is when a person types in a command such as PRINT and watches the results of the command. The emulator will speed learning and comprehension in a positive and instructive atmosphere. When the emulator is run, a sign-on message is printed on the screen, and immediately following is the prompt: Initial status: PC S Z A P C A B C D E H L M SP STACK 2000 0 0 0 0 0 00 00 00 00 00 00 00 00 0000 0000 Instruction?_ The first line is a description of the type of registers in the microprocessor. Under each description is the actual content of the register. The letters S, Z, A, P, and C are the status flags. They change as the microprocessor status changes. Their functions and descriptions follow: Sign flag - This flag shows whether the result of the last operation was positive or negative. The sign flag will be a one if negative, or a zero if positive. It will be the same as the most significant bit in the accumulator. Zero flag - This flag shows whether the result of the last operation was zero. If the result is zero, the flag will be one. If it was not zero, the flag will be zero. Auxiliary carry flag - If the result of the last operation caused a carry from bit three to bit four, this will be one. This flag is only used for the DAA instruction. Parity flag - This flag shows whether the result of the last operation resulted in an even or odd number of ones in the resulting byte. This flag will be one if there is an even number one of bits, or odd if there is an odd number of one bits. Carry flag - This flag shows whether the result of the last operation caused a carry or a borrow from the last significant bit of the result. It will be one if a carry or a borrow did occur, or it will be zero if it did not occur. The rest of the line will show the different registers. A description of the registers follow: PC - This will show the current address of the program counter. Do not let this go below 2000H. If it does, you may accidentally alter memory that is essential for the emulator or the operating system of your computer. A - This will show the contents of the accumulator after the last instruction typed. B - This will show the contents of the B register after the last instruction typed. C - This will show the contents of the C register after the last instruction typed. D - This will show the contents of the D register after the last instruction typed. E - This will show the contents of the E register after the last instruction typed. H - This will show the contents of the H register after the last instruction typed. L - This will show the contents of the L register after the last instruction typed. M - This will show the contents of the memory address pointed to by the H-L register pair. SP - This will show the address that is the current top of the stack. STACK - This will show the last two bytes that were actually entered on the stack. This is data, not a memory address. The next thing to do is to actually type in an 8080A mnemonic. If you have a copy of the 8080A instruction set, you type in the mnemonic the same as if you were executing an assembly language program. This emulator does not support the use of labels. All numbers that are input and displayed are in hexidecimal format. After typing in the instruction, press return, and the emulator will display the new status. WARNING: DO NOT ALTER ANY MEMORY LOCATIONS BELOW 2000 HEX. THESE MEMORY LOCATIONS ARE ESSENTIAL FOR THE EMULATOR PROGRAM AND THE OPERATING SYSTEM OF YOUR COMPUTER. THE MNEMONICS AND COMMAND THAT ARE TYPED IN ARE ACTUALLY EXECUTED.  H-L register pair. SP - This will show the address that is the current top of the stack. STACK - This will show the last two bytes that were actually entered on the stack. This is data, not a memory address. The next thing to do is to actually type in an 8080A mnemonic. If you have a copy of the 8080A instruction set, you type in the mnemonic the same as if you were executing an assembly language program. This emulator does not support the use of labels. All numbers that are input and displayed are in hexidecimal format. After typing in the instruction, press re; ; 8080A Microprocessor Instruction Set Emulator ; by Jeff Sheese, RETS Tech Center, Centerville, Ohio 45459 ; ; 8-18-82 ; ; The 8080A Instruction Set Emulator is a teaching tool used to ;demonstrate the operation of the assembly language commands and ;how they affect the memory and microprocessor register contents. ;The emulator was designed to operate the computer in a machine ;language 'direct' mode. In BASIC, the 'direct' mode is when a ;person types in a command such as PRINT and watches the results ;of the command. The emulator will speed learning and ;comprehension in a positive and instructive atmosphere. ; ; When the emulator is run, a sign-on message is printed on the ;screen, and immediately following is the prompt: ; ;Initial status: ;PC S Z A P C A B C D E H L M SP STACK ;2000 0 0 0 0 0 00 00 00 00 00 00 00 00 0000 0000 ; ;Instruction?_ ; ; The first line is a description of the type of registers in ;the microprocessor. Under each description is the actual content ;of the register. The letters S, Z, A, P, and C are the status ;flags. They change as the microprocessor status changes. Their ;functions and descriptions follow: ; ; Sign flag - This flag shows whether the result of the last ;operation was positive or negative. The sign flag will be a one ;if negative, or a zero if positive. It will be the same as the ;most significant bit in the accumulator. ; ; Zero flag - This flag shows whether the result of the last ;operation was zero. If the result is zero, the flag will be one. ;If it was not zero, the flag will be zero. ; ; Auxiliary carry flag - If the result of the last operation ;caused a carry from bit three to bit four, this will be one. ;This flag is only used for the DAA instruction. ; ; Parity flag - This flag shows whether the result of the last ;operation resulted in an even or odd number of ones in the ;resulting byte. This flag will be one if there is an even number ;one of bits, or odd if there is an odd number of one bits. ; ; Carry flag - This flag shows whether the result of the last ;operation caused a carry or a borrow from the last significant ;bit of the result. It will be one if a carry or a borrow did ;occur, or it will be zero if it did not occur. ; ; The rest of the line will show the different registers. A ;description of the registers follow: ; ; PC - This will show the current address of the program ;counter. Do not let this go below 2000H. If it does, you may ;accidentally alter memory that is essential for the emulator or ;the operating system of your computer. ; ; A - This will show the contents of the accumulator after the ;last instruction typed. ; ; B - This will show the contents of the B register after the ;last instruction typed. ; ; C - This will show the contents of the C register after the ;last instruction typed. ; ; D - This will show the contents of the D register after the ;last instruction typed. ; ; E - This will show the contents of the E register after the ;last instruction typed. ; ; H - This will show the contents of the H register after the ;last instruction typed. ; ; L - This will show the contents of the L register after the ;last instruction typed. ; ; M - This will show the contents of the memory address pointed ;to by the H-L register pair. ; ; SP - This will show the address that is the current top of ;the stack. ; ; STACK - This will show the last two bytes that were actually ;entered on the stack. This is data, not a memory address. ; ; ; The next thing to do is to actually type in an 8080A ;mnemonic. If you have a copy of the 8080A instruction set, you ;type in the mnemonic the same as if you were executing an ;assembly language program. This emulator does not support the ;use of labels. All numbers that are input and displayed are in ;hexidecimal format. After typing in the instruction, press ;return, and the emulator will display the new status. ; ; WARNING: ; DO NOT ALTER ANY MEMORY LOCATIONS BELOW 2000 HEX. THESE ;MEMORY LOCATIONS ARE ESSENTIAL FOR THE EMULATOR PROGRAM AND THE ;OPERATING SYSTEM OF YOUR COMPUTER. THE MNEMONICS AND COMMAND ;THAT ARE TYPED IN ARE ACTUALLY EXECUTED. ; ; CR EQU 0DH ;CARRIAGE RETURN LF EQU 0AH ;LINE FEED CONOUT EQU 2 ;CONSOLE OUTPUT CONIN EQU 1 ;CONSOLE INPUT BDOS EQU 5 ;BDOS CALL BEL EQU 7 ;BELL CODE DEL EQU 7FH ;DELETE CHARACTER FALSE EQU 0FFFFH ;FALSE CONDITION BSPACE EQU 8 ;BACKSPACE CHARACTER wboot equ 0 ; ; DISPLAY HEADING ON CRT ; ORG 0100H ;START OF TPA BEGIN LXI SP,STACK ;SET UP STACK POINTER CALL SHOTEL ;PRINT THE FOLLOWING DB cr,lf,lf,' 8080 INSTRUCTION ' DB 'SET EMULATOR',CR,LF,LF DB CR,LF,'Initial Status:',CR,LF,0 ; ;ZERO PROGRAM STASHES ; MVI B,0CH ;COUNTER FOR 12 LOCATIONS LXI H,PCSTOR+2 ;START OF STORAGE AREA ; MVI M,00H ;PUT 1000H IN PC COUNT INX H ; MVI M,10 ; INX H ; DCR B ; ZLOOP MVI M,0 ;PUT 0 AT H-L ADDRESS INX H ;SET H-L TO NEXT LOCATION DCR B ;COUNT 1 LOCATION DONE JNZ ZLOOP ;DO SOME MORE UNTIL B=0 ; ;DISPLAY EMULATOR CPU STATUS ; JMP SPREAD ;ROUTINE FOR HEADING AND STATUS ; ;INPUT A LINE OF TYPING ; NEXT1 LXI H,BUFFER ;SET H-L TO STORAGE AREA LXI SP,STACK ;RESET STACK POINTER ; INLOOP CALL INPUT ;GET KEYBOARD CHARACTER CPI bspace ;IS IT DELETE? JZ ERASE ;YES, ERASE IT cpi 7bh ;'z' or less? jnc inloop2 ;no, continue cpi 61h ;'a' or greater? jc inloop2 ;no, continue ani 0dfh ;yes, convert lower to upper case inloop2 cpi 03h ;is it ctrl-c? jz wboot ;yes, warm boot MOV M,A ;NO,STORE IT INX H ;SET H-L TO NEXT ADDRESS CPI CR ;IS IT CR? JZ DONEIN ;YES, FINISHED JMP INLOOP ;NO, GET NEXT CHARACTER ; ERASE DCX H ;NO, BACK UP ; MVI A,BSPACE ;GET BACKUP CODE ; CALL OUTPUT ;DISPLAY IT JMP INLOOP ;RETURN FOR MORE ; ;FIND MNEMONIC IN TABLE ; DONEIN LXI H,TABLE ;SET H-L TO START OF TABLE MVI B,0 ;INITIALIZE COUNTER ; FINDIT LXI D,BUFFER-1 ;SET D-E TO ONE BEFORE BUFFER ; KEEPON INX D ;NEXT BUFFER CHARACTER LDAX D ;GET CHARACTER FROM BUFFER CMP M ;SAME AS CHARACTER IN TABLE? MOV A,M ;GET CHARACTER FROM TABLE INX H ;SET H-L TO NEXT TABLE CHARACTER JZ KEEPON ;KEEP LOOKING IF CHARS MATCH CPI 20H ;IS IT LOWER THAN ASCII SPACE? JC FOUND ;CARRY MEANS ENTRY FOUND ; PASSBY MOV A,M ;GET NEXT CHARACTER INX H ;SET H-L TO NEXT TABLE CHAR. CPI 20H ;IS IT A TYPE BYTE? JNC PASSBY ;NO, KEEP GOING INR B ;ADD ONE TO COUNTER JNZ FINDIT ;CHECK NEXT CHAR IF STILL OK MVI A,1 ;INVALID-LOAD A WITH TYPE 1 ; ;SET UP OPCODES AND ARGUMENTS ; FOUND PUSH PSW ;SAVE TYPE BYTE ON STACK MOV A,B ;CODE TO REG. A STA OPCODE ;STORE THE BYTE STA CONDTN ;STORE AT "CONDTN" ALSO LXI H,0000H ;TWO NOP'S IN H-L SHLD ARGMNT ;STORE THEM AT ARGUMENT SHLD ADDRES ;STORE AT "ADDRES" ALSO ; ;SKIP TO APPROPRIATE HANDLER ROUTINE AND EXECUTE ; POP PSW ;GET TYPE BYTE BACK IN A DCR A ;MAKES IT 00 IF TYPE 1 JNZ TYPE2 ;TRY NEXT TYPE IF NOT 0 ; ;ROUTINE FOR TYPE 1 INSTRUCTIONS ; CALL SHOTEL ;DISLAY ERR MESSAGE DB CR,LF,' ***Invalid Mnemonic***',BEL,0 JMP NEXT2 ;GET PROPER MNEMONIC ; TYPE2 DCR A ;MAKES IT 0 IF TYPE 2 JNZ TYPE3 ;TRY NEXT TYPE IF NOT 0 ; ;ROUTINE FOR TYPE 2 INSTRUCTIONS ; MVI C,1 ;THESE ARE ONE-BYTE INSTRUCTIONS LDAX D ;GET CHARACTER AFTER MNEMONIC CPI CR ;MAKE SURE ITS 0DH JZ DOINST ;GO EMULATE IF ALL IS OK ; BADOP CALL SHOTEL ;DISPLAY ERR MESSAGE IF NOT DB CR,LF,' ***Bad Operand***',BEL,0 JMP NEXT2 ;GET PROPER ENTRY ; TYPE3 DCR A ;MAKES IT 0 IF TYPE 3 JNZ TYPE4 ;TRY NEXT TYPE IF NOT 0 ; ;ROUTINE FOR TYPE 3 INSTRUCTION ; LDAX D ;GET CHARACTER AFTER MNEMONIC CPI CR ;MAKE SURE ITS CR JNZ BADOP ;DISPLAY ERR IF NOT LHLD SPSTOR ;GET EMULATOR STACK POINTER SPHL ;MAKE IT THE REAL ONE LHLD PCSTOR ;GET EMULATOR PROGRAM COUNTER INX H ;POINT TO NEXT INSTRUCTION PUSH H ;WRITE RETURN ADDRESS ON STACK LXI H,0000H ;ZERO H-L DAD SP ;ADD NEW STACK POINTER SHLD SPSTOR ;UPDATE STACK POINTER STASH LXI SP,STACK ;MAKE OUR STACK POINTER REAL MOV A,B ;GET INTRUCTION CODE ANI 38H ;STRIP NON-UNIQUE BITS MOV L,A ;MOVE NEW VALUE TO L MVI H,0000H ;MAKE H ZERO SHLD PCSTOR ;STORE ADDRESS AS PROGRAM COUNTER JMP SPREAD ;SHOW NEW EMULATOR STATUS ; TYPE4 DCR A ;MAKES IT 0 IF TYPE 4 JNZ TYPE5 ;TRY NEXT TYPE IF NOT 0 ; ;ROUTINE FOR TYPE 4 INSTRUCTION ; LDAX D ;GET NEXT CHAR AFTER MNEMONIC CPI CR ;MAKE SURE ITS A CR JNZ BADOP ;DISPLAY ERR IF NOT CALL SHOTEL ;DISPLAY EXIT MESSAGE DB CR,LF,' ***Reboot Disk***',BEL,0 JMP WBOOT ; TYPE5 DCR A ;MAKES IT 0 IF TYPE 5 JNZ TYPE6 ;TRY NEXT TYPE IF NOT 0 ; ;ROUTINE FOR TYPE 5 INSTRUCTION ; LDAX D ;GET CHARACTER AFTER MNEMONIC CPI CR ;MAKE SURE ITS A CR JNZ BADOP ;DISPLAY ERR IF NOT LHLD HSTOR ;GET EMULATOR H-L DATA SHLD PCSTOR ;MAKE IT PROGRAM COUNTER JMP SPREAD ;SHOW NEW EMULATOR STATUS ; TYPE6 DCR A ;MAKES IT 0 IF TYPE 6 JNZ TYPE7 ;TRY NEXT TYPE IF NOT 0 ; ;ROUTINE FOT TYPE 6 INSTRUCTION ; LDAX D ;GET CHARACTER AFTER MNEMONIC CPI CR ;MAKE SURE ITS A CR JNZ BADOP ;DISPLAY ERR IF NOT MVI C,1 ;RETURNS ARE 1 BYTE CALL UPDATE ;UPDATE PROGRAM COUNTER CALL CTEST ;CALL CONDITIONAL TEST ; ;RETURN HERE IF CONDITION MET ; LHLD SPSTOR ;GET EMULATOR STACK POINTER SPHL ;MAKE IT REAL POP H ;GET LAST ENTRY ON STACK SHLD PCSTOR ;MAKE IT THE PROGRAM COUNTER LXI H,0000H ;ZERO H-L REGISTERS DAD SP ;ADD THE STACK POINTER SHLD SPSTOR ;STORE IN STACK POINTER STASH LXI SP,STACK ;MAKE OUR STACK POINTER REAL JMP SPREAD ;DISPLAY NEW EMULATOR STATUS ; ;GET NUMERICAL ARGUMENTS FOR REST OF INSTRUCTION TYPES ; TYPE7 PUSH PSW ;SAVE INSTRUCTION TYPE LXI B,0000H ;ZERO B-C REGISTERS LXI H,0000H ;ZERO H-L REGISTERS LDAX D ;DID WE GET AN ARGUMENT? CPI CR ;WON'T BE CR IF SO JNZ HLOOP ;ITS OK IF NOT CR CALL SHOTEL ;SAY ITS A BADDIE DB CR,LF,' ***Missing Argument***',BEL,0 JMP NEXT2 ;GO DO IT AGAIN ; HLOOP LDAX D ;GET NEXT CHAR FROM BUFFER INX D ;SET D-E TO NEXT BUFFER ADDRESS CPI CR ;END OF HEX VALUE? JZ NOMORE ;CONVERSION FINISHED IF SO SUI 30H ;REMOVE ASCII BIAS JC ERROR ;NO GOOD IF GET A CARRY CPI 0AH ;IS IT 0 THRU 9? JC HEXOK ;IT'S OK IF SO SUI 7 ;TRY HEX LETTERS CPI 0AH ;IS IT LESS THAN 0AH? JC ERROR ;NO GOOD IF SO CPI 10H ;HIGHER THAN OF HEX? JNC ERROR ;NO GOOD IF SO ; HEXOK DAD H ;H-L = H-L TIMES TWO DAD H ;H-L = H-L TIMES FOUR DAD H ;H-L = H-L TIMES EIGHT DAD H ;H-L = H-L TIMES SIXTEEN MOV C,A ;NEW UNIT VALUE TO C DAD B ;ADD UNIT VALUE TO TOTAL JMP HLOOP ;LOOP FOR NEXT DIGIT ; ERROR CALL SHOTEL ;DISPLAY ERROR MESSAGE DB CR,LF,' ***Bad Character in Operand***',BEL,0 JMP NEXT2 ;START OVER ; NOMORE SHLD ARGMNT ;STORE VALUE AS ARGUMENT POP PSW ;GET INSTRUCTION TYPE BACK ; DCR A ;MAKES IT 0 IF TYPE 7 JNZ TYPE8 ;TRY NEXT TYPE IF NOT 0 ; ;ROUTINE FOR TYPE 7 INSTRUCTIONS ; MVI C,2 ;THESE ARE TWO BYTE INSTRUCTIONS MOV A,H ;GET HIGH BYTE OF ARGUMENT ORA A ;MUST BE ZERO FOR TWO BYTE TYPES JZ DOINST ;GO EMULATE IF ALL OK CALL SHOTEL ;DISPLAY ERR MESSAGE DB CR,LF,' ***Argument too Large***',BEL,0 JMP NEXT2 ;START OVER ; TYPE8 DCR A ;MAKES IT 0 IF TYPE 8 JNZ TYPE9 ;TRY NEXT TYPE IF NOT 0 ; ;ROUTINE FOR TYPE 8 INSTRUCTION ; XCHG ;SAVE TYPED IN ARGUMENT MVI C,3 ;JUMPS ARE THREE BYTES CALL UPDATE ;UPDATE PROGRAM COUNTER LXI H,JBACK ;LOAD H-L WITH ADDRESS OF JBACK SHLD ADDRES ;STORE AS ARGUMENT OF COND INSTR JMP CTEST ;GO TO CONDITIONAL TEST ; JBACK XCHG ;GET TYPED-IN ARGUMENT BACK SHLD PCSTOR ;STORE NEW PROGRAM COUNT JMP SPREAD ;DISPLAY NEW EMULATOR STATUS ; TYPE9 DCR A ;MAKES IT 0 IF TYPE 9 JNZ TYPE10 ;DO TYPE 10 IF NOT 0 ; ;ROUTINE FOR TYPE 9 INSTRUCTIONS ; XCHG ;SAVE TYPED IN ARGUMENT MVI C,3 ;CALLS ARE THREE BYTES CALL UPDATE ;UPDATE PROGRAM COUNTER LXI H,CBACK ;LOAD H-L ADDRESS WITH CBACK SHLD ADDRES ;STORE AS ARGMNT OF COND INSTR JMP CTEST ;GO DO COND TEST ; CBACK LHLD SPSTOR ;GET EMULATOR STACK POINTER SPHL ;MAKE IT THE REAL ONE LHLD PCSTOR ;GET EMULATOR PROGRAM COUNTER PUSH H ;WRITE RETURN ADDRESS ON STACK LXI H,0000H ;ZERO H-L REG. DAD SP ;ADD NEW STACK POINTER SHLD SPSTOR ;UPDATE STACK POINTER STASH LXI SP,STACK ;MAKE OUR STACK POINTER REAL XCHG ;GET TYPED IN ARGUMENT SHLD PCSTOR ;MAKE IT THE PROGRAM COUNTER JMP SPREAD ;DISPLAY NEW EMULATOR STATUS ; ;ROUTINE FOR TYPE 10 INSTRUCTIONS ; TYPE10 MVI C,3 ;THESE ARE THREE BYTE INSTRUCTIONS ; ;DO INSTRUCTIONS THAT CAN BE EXECUTED ; DOINST CALL UPDATE ;UPDATE PROGRAM COUNTER LHLD PSWSTR ;GET EMULATOR PSW PUSH H ;PUSH ONTO STACK POP PSW ;POP OFF STACK INTO PLACE LHLD BSTOR ;GET EMULATOR B-C PUSH H ;PUSH ONTO STACK POP B ;POP OFF STACK INTO PLACE LHLD DSTOR ;GET EMULATOR D-E PUSH H ;PUSH  ONTO STACK POP D ;POP OFF STACK INTO PLACE LHLD SPSTOR ;GET EMULATOR STACK POINTER SPHL ;MAKE IT REAL LHLD HSTOR ;GET EMULATOR H-L ; OPCODE DS 1 ;CPU CODE GOES HERE ARGMNT DS 2 ;NUMERICAL ARGUMENTS GO HERE ; STA PSWSTR ;SAVE ACCUMULATOR FOR NOW RAR ;ROTATE CARRY FLAG TO ACCUMULATOR SHLD HSTOR ;H-L TO STASH LXI H,0 ;ZERO H-L REGISTERS DAD SP ;ADD IN STACK POINTER SHLD SPSTOR ;STACK POINTER TO STASH LXI SP,STACK ;MAKE STACK POINTER REAL RAL ;ROTATE CARRY FLAG INTO PLACE LDA PSWSTR ;GET ACCUMULATOR BACK PUSH PSW ;PUSH PSW ONTO STACK POP H ;POP IT INTO H-L SHLD PSWSTR ;PSW TO STASH PUSH B ;PUSH B-C ONTO STACK POP H ;POP IT INTO H-L SHLD BSTOR ;B-C TO STASH PUSH D ;PUSH D-E ONTO STASH POP H ;POP IT INTO H-L SHLD DSTOR ;D-E TO STASH ; ;DISPLAY THE HEADING AND THE EMULATOR STATUS ; SPREAD CALL SHOTEL ;DISPLAY THE HEADING DB CR,LF,lf,'PC S Z A P C A B C D E H' DB ' L M SP STACK',CR,LF,0 LHLD PCSTOR ;GET PROGRAM COUNTER XCHG ;MOVE ADDRESS TO D-E CALL HWORD ;DISPLAY AS HEX WORD CALL BLANK2 ;PRINT TWO SPACES LHLD PSWSTR ;GET PROCESSOR STATUS WORD MOV A,L ;FLAG REGISTER TO A CALL AFLAG ;DISPLAY THE SIGN FLAG CALL AFLAG ;DISPLAY THE ZERO FLAG RLC ;PASS BY UNUSED BIT CALL AFLAG ;DISPLAY THE AUX CARRY FLAG RLC ;PASS BY UNUSED BIT CALL AFLAG ;DISPLAY PARITY FLAG RLC ;PASS BY UNUSED BIT CALL AFLAG ;DISPLAY CARRY FLAG CALL BLANK1 ;PRINT ONE SPACE MOV E,H ;GET REGISTER A DATA CALL HBYTE ;DISPLAY AS HEX CALL BLANK1 ;PRINT ONE SPACE LHLD BSTOR ;GET B-C REGISTER DATA CALL SHOREG ;DISPLAY THE REGISTERS IN HEX LHLD DSTOR ;GET D-E REGISTER DATA CALL SHOREG ;DISPLAY THE REGISTERS IN HEX LHLD HSTOR ;GET H-L REGISTER DATA CALL SHOREG ;DISPLAY THE REGISTERS IN HEX MOV E,M ;GET MEMORY DATA AT H-L ADDRESS CALL HBYTE ;DISPLAY IN HEX CALL BLANK2 ;PRINT TWO SPACES LHLD SPSTOR ;GET STACK POINTER DATA XCHG ;PUT STACK POINTER IN D-E CALL HWORD ;DISPLAY AS HEX CALL BLANK2 ;PRINT TWO SPACES XCHG ;STACK POINTER BACK TO H-L MOV E,M ;LOW BYTE OF DATA ON STACK TOP INX H ;SET H-L TO NEXT ADDRESS MOV D,M ;HIGH BYTE OF DATA ON STACK TOP CALL HWORD ;DISPLAY AS HEX ; NEXT2 CALL SHOTEL ;DISPLAY MESSAGE DB CR,LF,lf,'Instruction: ',0 JMP NEXT1 ;GET NEXT INSTRUCTION TO EMULATE ; ;DISPLAY "0" OR "1" FOR FLAG STATUS ; AFLAG RLC ;MOVE LEFTMOST BIT INTO CARRY MOV L,A ;SAVE MODIFIED BIT MVI A,'1' ;ANTICIPATE FLAG IS SET JC FLAGON ;DISPLAY "1" IF SET MVI A,'0' ;DISPLAY "0" IF RESET ; FLAGON CALL OUTPUT ;DISPLAY "1" OR "0" CALL BLANK1 ;PRINT ONE SPACE MOV A,L ;GET THE FLAG BYTE BACK RET ; ;DISPLAY H-L AS INDIVIDUAL REGISTERS ; SHOREG MOV E,H ;DO HIGH BYTE FIRST CALL HBYTE ;DISPLAY AS HEX CALL BLANK1 ;PRINT ONE SPACE MOV E,L ;DO LOW BYTE NEXT CALL HBYTE ;DISPLAY AS HEX JMP BLANK1 ;PRINT ONE SPACE ; ;PRINT ONE OR TWO BLANK SPACES ; BLANK2 CALL BLANK1 ;PRINT TWO BLANK SPACES ; BLANK1 MVI A,' ' ;PRINT ONE SPACE JMP OUTPUT ;DISPLAY THE SPACE ; ;TEST CONDITIONAL INSTRUCTIONS ; CTEST LHLD PSWSTR ;GET CONDITION FLAGS PUSH H ;PUSH THEM ONTO STACK ; CONDTN DS 1 ;HEX CPU CODE GOES HERE ADDRES DS 2 ;ADDRESS ARGUMENT GOES HERE JMP SPREAD ;DISPLAY OLD STATUS IF CONDITION FAILS ; ;UPDATE THE PROGRAM COUNTER ; UPDATE LHLD PCSTOR ;GET PROGRAM COUNTER MVI B,0 ;ZERO REGISTER B DAD B ;ADD INSTRUCTION LENGTH TO PC SHLD PCSTOR ;STORE NEW PROGRAM COUNTER RET ;RETURN ; ;OUTPUT A MESSAGE ; SHOTEL XTHL ;GET ADDRESS OF MESSAGE FROM STACK DISPL MOV A,M ;GET CHARACTER TO DISPLAY INX H ;SET H-L TO NEXT ADDRESS ORA A ;TEST FOR DELIMITER JZ EXIT ;FINISH IF END OF MESSAGE CALL OUTPUT ;DISPLAY THE CHARACTER JMP DISPL ;LOOP FOR NEXT CHARACTER ; EXIT XTHL ;FIX H-L AND STACK RET ;RETURN ; ;OUTPUT A BYTE IN HEX ; HWORD MOV A,D ;DO HIGH BYTE FIRST CALL DOHEX ; HBYTE MOV A,E ;DO LOW BYTE ; DOHEX PUSH PSW ;SAVE THE BYTE ON THE STACK RRC ;ROTATE LEFT 4 BITS INTO PLACE RRC ; RRC ; RRC ; CALL HEXOUT ;MAKE ASCII AND DISPLAY POP PSW ;GET THE BYTE BACK ; HEXOUT ANI 0FH ;KEEP ONLY RIGHT FOUR BITS ADI 30H ;ADD ASCII OFFSET CPI ':' ;IS IT A NUMBER? JC OUTPUT ;YES, DISPLAY IT ADI 7 ;MAKE IT A LETTER JMP OUTPUT ;DISPLAY THE LETTER ON THE CRT ; ;KEYBOARD INPUT ; INPUT PUSH B ;SAVE B-C PUSH D ;SAVE D-E PUSH H ;SAVE H-L MVI C,CONIN ;SET UP FOR INPUT CALL BDOS ; POP H ;RECALL H-L POP D ;RECALL D-E POP B ;RECALL BC RET ;RETURN ; ;CRT OUTPUT ; OUTPUT PUSH B ;SAVE B-C PUSH D ;SAVE D-E PUSH H ;SAVE H-L MOV E,A ;PUT CHARACTER IN REGISTER E MVI C,CONOUT ;SET UP FOR OUTPUT CALL BDOS ; POP H ;RECALL H POP D ;RECALL D POP B ;RECALL B RET ;RETURN ; BOOT JMP BOOT ;HANG HERE UNTIL RESET ; ;MNEMONIC LOOK-UP TABLE ; TABLE DB 'NOP',2 ;INSTRUCTION MNEMONIC AND TYPE DB 'LXI B,',10 DB 'STAX B',2 DB 'INX B',2 DB 'INR B',2 DB 'DCR B',2 DB 'MVI B,',7 DB 'RLC',2 DB '*',1 DB 'DAD !B',2 DB 'LDAX B',2 DB 'DCX B',2 DB 'INR C',2 DB 'DCR C',2 DB 'MVI C,',7 DB 'RRC',2 DB '*',1 DB 'LXI D,',10 DB 'STAX D',2 DB 'INX D',2 DB 'INR D',2 DB 'DCR D',2 DB 'MVI D,',7 DB 'RAL',2 DB '*',1 DB 'DAD D',2 DB 'LDAX D',2 DB 'DCX D',2 DB 'INR E',2 DB 'DCR E',2 DB 'MVI E,',7 DB 'RAR',2 DB '*',1 DB 'LXI H,',10 DB 'SHLD ',10 DB 'INX H',2 DB 'INR H',2 DB 'DCR H',2 DB 'MVI H,',7 DB 'DAA',2 DB '*',1 DB 'DAD H',2 db 'LHLD ',10 ; DB 'LHLD',10 DB 'DCX H',2 DB 'INR L',2 DB 'DCR L',2 DB 'MVI L,',7 DB 'CMA',2 DB '*',1 DB 'LXI SP,',10 DB 'STA ',10 DB 'INX SP',2 DB 'INR M',2 DB 'DCR M',2 DB 'MVI M,',7 DB 'STC',2 DB '*',1 DB 'DAD SP',2 DB 'LDA ',10 DB 'DCX SP',2 DB 'INR A',2 DB 'DCR A',2 DB 'MVI A,',7 DB 'CMC',2 DB 'MOV B,B',2 DB 'MOV B,C',2 DB 'MOV B,D',2 DB 'MOV B,E',2 DB 'MOV B,H',2 DB 'MOV B,L',2 DB 'MOV B,M',2 DB 'MOV B,A',2 DB 'MOV C,B',2 DB 'MOV C,C',2 DB 'MOV C,D',2 DB 'MOV C,E',2 DB 'MOV C,H',2 DB 'MOV C,L',2 DB 'MOV C,M',2 DB 'MOV C,A',2 DB 'MOV D,B',2 DB 'MOV D,C',2 DB 'MOV D,D',2 DB 'MOV D,E',2 DB 'MOV D,H',2 DB 'MOV D,L',2 DB 'MOV D,M',2 DB 'MOV D,A',2 DB 'MOV E,B',2 DB 'MOV E,C',2 DB 'MOV E,D',2 DB 'MOV E,E',2 DB 'MOV E,H',2 DB 'MOV E,L',2 DB 'MOV E,M',2 DB 'MOV E,A',2 DB 'MOV H,B',2 DB 'MOV H,C',2 DB 'MOV H,D',2 DB 'MOV H,E',2 DB 'MOV H,H',2 DB 'MOV H,L',2 DB 'MOV H,M',2 DB 'MOV H,A',2 DB 'MOV L,B',2 DB 'MOV L,C',2 DB 'MOV L,D',2 DB 'MOV L,E',2 DB 'MOV L,H',2 DB 'MOV L,L',2 DB 'MOV L,M',2 DB 'MOV L,A',2 DB 'MOV M,B',2 DB 'MOV M,C',2 DB 'MOV M,D',2 DB 'MOV M,E',2 DB 'MOV M,H',2 DB 'MOV M,L',2 DB 'HLT',4 DB 'MOV M,A',2 DB 'MOV A,B',2 DB 'MOV A,C',2 DB 'MOV A,D',2 DB 'MOV A,E',2 DB 'MOV A,H',2 DB 'MOV A,L',2 DB 'MOV A,M',2 DB 'MOV A,A',2 DB 'ADD B',2 DB 'ADD C',2 DB 'ADD D',2 DB 'ADD E',2 DB 'ADD H',2 DB 'ADD L',2 DB 'ADD M',2 DB 'ADD A',2 DB 'ADC B',2 DB 'ADC C',2 DB 'ADC D',2 DB 'ADC E',2 DB 'ADC H',2 DB 'ADC L',2 DB 'ADC M',2 DB 'ADC A',2 DB 'SUB B',2 DB 'SUB C',2 DB 'SUB D',2 DB 'SUB E',2 DB 'SUB H',2 DB 'SUB L',2 DB 'SUB M',2 DB 'SUB A',2 DB 'SBB B',2 DB 'SBB C',2 DB 'SBB D',2 DB 'SBB E',2 DB 'SBB H',2 DB 'SBB L',2 DB 'SBB M',2 DB 'SBB A',2 DB 'ANA B',2 DB 'ANA C',2 DB 'ANA D',2 DB 'ANA E',2 DB 'ANA H',2 DB 'ANA L',2 DB 'ANA M',2 DB 'ANA A',2 DB 'XRA B',2 DB 'XRA C',2 DB 'XRA D',2 DB 'XRA E',2 DB 'XRA H',2 DB 'XRA L',2 DB 'XRA M',2 DB 'XRA A',2 DB 'ORA B',2 DB 'ORA C',2 DB 'ORA D',2 DB 'ORA E',2 DB 'ORA H',2 DB 'ORA L',2 DB 'ORA M',2 DB 'ORA A',2 DB 'CMP B',2 DB 'CMP C',2 DB 'CMP D',2 DB 'CMP E',2 DB 'CMP H',2 DB 'CMP L',2 DB 'CMP M',2 DB 'CMP A',2 DB 'RNZ',6 DB 'POP B',2 DB 'JNZ ',8 DB 'JMP ',8 DB 'CNZ ',9 DB 'PUSH B',2 DB 'ADI ',7 DB 'RST 0',3 DB 'RZ',6 DB 'RET',6 DB 'JZ ',8 DB '*',1 DB 'CZ ',9 DB 'CALL ',9 DB 'ACI ',7 DB 'RST 1',3 DB 'RNC',6 DB 'POP D',2 DB 'JNC ',8 DB 'OUT ',7 DB 'CNC ',9 DB 'PUSH D',2 DB 'SUI ',7 DB 'RST 2',3 DB 'RC',6 DB '*',1 DB 'JC ',8 DB 'IN ',7 DB 'CC ',9 DB '*',1 DB 'SBI ',7 DB 'RST 3',3 DB 'RPO',6 DB 'POP H',2 DB 'JPO ',8 DB 'XTHL',2 DB 'CPO ',9 DB 'PUSH H',2 DB 'ANI ',7 DB 'RST 4',3 DB 'RPE',6 DB 'PCHL',5 DB 'JPE ',8 DB 'XCHG',2 DB 'CPE ',9 DB '*',1 DB 'XRI ',7 DB 'RST 5',3 DB 'RP',6 DB 'POP PSW',2 DB 'JP ',8 DB 'DI',2 DB 'CP ',9 DB 'PUSH PSW',2 DB 'ORI ',7 DB 'RST 6',3 DB 'RM',6 DB 'SPHL',2 DB 'JM ',8 DB 'EI',1 DB 'CM ',9 DB '*',1 DB 'CPI ',7 DB 'RST 7',3 ; ;STORAGE SECTION ; PCSTOR DW 2000H ;PROGRAM COUNTER (DEFAULT) PSWSTR DS 2 ;FLAGS AND A REGISTER BSTOR DS 2 ;B AND C REGISTERS DSTOR DS 2 ;D AND E REGISTERS HSTOR DS 2 ;H AND L REGISTERS SPSTOR DS 2 ;STACK POINTER DS 64H ;PROGRAM STACK STACK DS 1 ;START OF STACK BUFFER EQU $ ;TYPE IN BUFFER ; ;END OF PROGRAM ; END ACK POINTER!j %QN&Ͳ<ͱ :] H!e~#AG~#SG~MG2!,͵:a!/͵"Û!&͵\ʛ!)͵"!]m !&e\\±!|j 4e2\~#4h!\:<2Pi`"+:2!Rj \\\!ej !@j !^#6 #6#6 !+~ʦHB$PʏLʡAʺDd2d!~H#ڽj ë>#¿ë> ## #y_W":2y2:2y{ {6+~Nw#{ hW{_> ̓ hW{{_>d̓{w{2Dz2A:2G†y™2:e2ey²+~N²2:Q2Qy+~N> 2222:2 2:/2/+~0 ؗOȇ +~0:!AG0:8\|ͳ*hP* +"#*w#w#w#s#r#6!!h"p:=2>_j!:2*!h"*"p:=ʮ2>_Ú"!*MD**### ##~++~#~##l*P+w+w>2 "!:" *MD*:_ͣ S_ ##{-> ~#- l@> ͣ !F ͣ ͣ }O|[_G+~la x*͟N :ڃzOʑ̬ ʜ#͟ÄJ {_s"#~  !,!!>w2#^#V*Pm*P$$!P!N!\P!p!Pm!>w2m*MD*^#VPmK###l,m! MD ]Tas#r#6*#"N ͓*͟J "* "{_p*^#V*P*##ª6#"–:ʿ!~ >#::=,! := ! := y =!! :,!V !/! !F y !h"*"\:=2>_J*ͬ͟:x!V I^ ͖„͌ J* "* "y {_\N!o V:A*B""U:*^#V#{*P"**P*y ~#,  YPP*Di`P%"B!"B    _ЗJ*~#- M>{:>wJ*~#͆ k>{O> | ڐ`ڒ> :A*B}MD*~#ڷl§x *BYPP"BQ2c:F! >2G2H>/2F:c,!IV#{5 :G :H p - p ( p >' >, 2H=i :GC p a :HR p \ p >, >' :F<2F2G :F2F:G>' >2F> 2*>^2e:ڝ zOͭ ʫ ͟Þ > :eG^ 2>; ; > 2e ~# ;^ > > > #" Y F ::=! ~2  >H K E !=N !N !~ # N :^#V!Pq !2 !\P€ !7 !P !; *MD*^#V#"fPʹ l*f—  >L _ ^!o :*^#V{ *P *##" >L !_ >: xgy <o) >0 - G: x: Ɛ'@' #~ +~- >H _ > #~- +~- ~#O) j ͣ :;*B}*~:ʜ !ß !o > > N : !V ! ! > +~# *w O:) :" \ +!j :!w2<#"Y 6 B :f !i ! NOP LXI^B, STAX^B INX^B INR^B DCR^B MVI^B, RLC DB^08H DAD^B LDAX^B DCX^B INR^C DCR^C MVI^C, RRC DB^10H LXI^D, STAX^D INX^D INR^D DCR^D MVI^D, RAL DB^18H DAD^D LDAX^D DCX^D INR^E DCR^E MVI^E, RAR DB^20H LXI^H, SHLD^ INX^H INR^H DCR^H MVI^H, DAA DB^28H DAD^H LHLD^ DCX^H INR^L DCR^L MVI^L, CMA DB^30H LXI^SP, STA^ INX^SP INR^M DCR^M MVI^M, STC DB^38H DAD^SP LDA^ DCX^SP INR^A DCR^A MVI^A, CMC MOV^B,B MOV^B,C MOV^B,D MOV^B,E MOV^B,H MOV^B,L MOV^B,M MOV^B,A MOV^C,B MOV^C,C MOV^C,D MOV^C,E MOV^C,H MOV^C,L MOV^C,M MOV^C,A MOV^D,B MOV^D,C MOV^D,D MOV^D,E MOV^D,H MOV^D,L MOV^D,M MOV^D,A MOV^E,B MOV^E,C MOV^E,D MOV^E,E MOV^E,H MOV^E,L MOV^E,M MOV^E,A MOV^H,B MOV^H,C MOV^H,D MOV^H,E MOV^H,H MOV^H,L MOV^H,M MOV^H,A MOV^L,B MOV^L,C MOV^L,D MOV^L,E MOV^L,H MOV^L,L MOV^L,M MOV^L,A MOV^M,B MOV^M,C MOV^M,D MOV^M,E MOV^M,H MOV^M,L HLT; MOV^M,A MOV^A,B MOV^A,C MOV^A,D MOV^A,E MOV^A,H MOV^A,L MOV^A,M MOV^A,A ADD^B ADD^C ADD^D ADD^E ADD^H ADD^L ADD^M ADD^A ADC^B ADC^C ADC^D ADC^E ADC^H ADC^L ADC^M ADC^A SUB^B SUB^C SUB^D SUB^E SUB^H SUB^L SUB^M SUB^A SBB^B SBB^C SBB^D SBB^E SBB^H SBB^L SBB^M SBB^A ANA^B ANA^C ANA^D ANA^E ANA^H ANA^L ANA^M ANA^A XRA^B XRA^C XRA^D XRA^E XRA^H XRA^L XRA^M XRA^A ORA^B ORA^C ORA^D ORA^E ORA^H ORA^L ORA^M ORA^A CMP^B CMP^C CMP^D CMP^E CMP^H CMP^L CMP^M CMP^A RNZ POP^B JNZ^ JMP^; CNZ^ PUSH^B ADI^ RST^0; RZ RET; JZ^ DB^0CBH CZ^ CALL^ ACI^ RST^1; RNC POP^D JNC^ OUT^ CNC^ PUSH^D SUI^ RST^2; RC DB^0D9H JC^ IN^ CC^ DB^0DDH SBI^ RST^3; RPO POP^H JPO^ XTHL CPO^ PUSH^H ANI^ RST^4; RPE PCHL; JPE^ XCHG CPE^ DB^0EDH XRI^ RST^5; RP POP^PSW JP^ DI CP^ PUSH^PSW ORI^ RST^6; RM SPHL JM^ EI CM^ DB^0FDH CPI^ RST^7; ; Addr Hex Asc ;Label Instruction Second Byte Expanded  Second & Third Bytes Expanded  ORG 000A = LF EQU 0AH 000D = CR EQU 0DH 001A = EOF EQU 'Z'-64 0005 = BDOS EQU 0005H 005C = FCB EQU 005CH 0080 = BUFF EQU 0080H  ;  ;Direct DB  END  ;File Incomplete, Disassembly Interrupted ASMBAKCOMPRNBDOSFCBBUFF See "MSA.DOC"  COM File Empty  COM File not Found  Disk or Directory Full  MSA Version 1.5b  Write Error   Passed Parameter Error in:  Start Address # Ascii Field Select  Byte Expansion  Direct Address Flag Select  Label Select  Array Print Select  String Parameter  Vers0000H & End PRNADR+1Full Array, Last Entry FlaggedFull Array, Most Flags=FFFinal Array, Flags Removed, 0000H at End Start PRNADR <= Nth Entry <= End PRNADR0TABLFCREOFA Addr Hex Asc ;Label Instruction Second Byte Expanded  Second & Third Bytes Expanded  ORG 000A = LF EQU 0AH 000D = CR EQU 0DH 001A = EOF EQU 'Z'-64 0005 = BDOS EQU 0005H 005C = FCB EQU 005CH 0080 = BUFF EQU 0080H  ;  ;Direct DB  END  ;File Incomplete, Disassembly Interrupted ASMBAKCOMPRNBDOSFCBBUFF See "MSA.DOC"  COM File Empty  COM File not Found  Disk or Directory Full  MSA Version 1.5b  Write Error   Passed Parameter Error in:  Start Address  INSTRUCTIONS FOR MSA VERS 1.5 MSA AAAAAA.YYY XB NL N$ XXX$ D NA P XXXXH WHERE : AAAAAA = THE NAME OF A COM FILE YYY = THE OUTPUT FILE TYPE PRN/ASM ( DEFAULT IS PRN ) XB = IS FOR 2 OR 3 BYTE EXPANSION ( DEFAULT IS 1 ) NL = NO LABELS N$ = NO DEFINED BYTE STATEMENTS XXX$ = MINIMUM DEFINED BYTE LENGTH ( 3 TO 255 ) ( DEFAULT 6 ) IN DECIMAL FORMAT D = FOR FLAGGING ALL DIRECT ADDRESSES NA = NO ASCII FIELD ( PRN ONLY ) P = PRINT LABEL ARRAYS XXXXH = ORG PROGRAM @ XXXX ( MUST BE 4 DIGITS HEX ) ( DEFAULT 0100H ) NC = NO ( SYSTEM, BUFFER, FBC ) LABELS (( VERS 1.6 )) ASCII IS DEFINED AS: 0,LF,CR,CNTL(Z),20H THRU 5FH,CNTL(I) GENERAL DEFAULT FORMAT IS ( MSA AAAAAA ) PARAMETERS AFTER YYY MAY BE IN ANY ORDER.  March 4, 1984 MSA, as you may have noticed, is ASM spelled backwards, which is exactly appropriate. MSA, you see, is a disassembler. I just discovered it, and the only documentation with it was the scanty DOC file accompanying. I've only tried one short disassembly with it, but so far I am impressed. Ken Lovett DOC file accompanying. I've onlyDISSAM ASM1tuvwxyzDISSAM DOC{EM2 COM|}~EM2 DOC#EM2 ASMEM2 ASM0MSA15 COM3MSA15 DOCMSA $$$!""9"1>= >2222*.|g++""!@{OzGr# xA>2@>X2A!]B!]j~ p#d!I I !e͕¨I !e"R s Z Z r  = >2!" 2! ͕͢,= !>; |#"5 x *DM̈́ Z >; *#Z >2~ Z !"!" 2>2>!w#U!"5 > &: Z @yZ @>2Z r **D}M¶x¶V+^"5 x *DM̈́ Z àZ  >*w#"͢*!eI *|:4S|4:ͻ  :e >H :ͻ vu : >,  :ͻ :ʰUu[uPuKua'uf/uk7up?ul yʀ ʴ ʅʑʑʞ:u99 :2 2>, < 2*_#Q[/<_}o|g>A |e }e  :X ÈÈ >% :ͮ : >, U   2:ʼ*#I Ҽ̈́ ̈́ Z !":5 >  &5 >  :`r **|`I >'̈́ Z "5 >  '̈́ Z Ò >% >, |  :ͬ M›|  Hʪ%  |  :ͬ M | >) H %  | : ,,&,+,7,>,C,G :uuuuuuuzzʁ.ʸ ʸ *7:u; >%  :8e >H  | Z  | ~z : >, | u : : zz&z+z2z>zCzG U 2  (8@ :X  :80 >,  : 2>, 2X >, 2X 22c : :!DZ %EZ *MZ /FZ 4VZ 9^Z >GZ EOZ LWZ S_Z ZgZ ^oZ  :X ] :ͮ b ] :ͮ ] :g $o :% ] :cc:<  | >) >, % ]  % >, >( | >) ] 2:ʓ ʓ wʓ zʓ }ʓ  :ʥ >Iç >D :>R ] ;>, 2X 2 @ @4 5 ! " * &  >, 2X >, 2X  >2:- 2 ړ :ʂ ʆ ʆ ~ S : 2*_#n x /<_}o|gT]&  :ͬ G : ~ ~   ~    @ @4 5 ! " * & _ WI *r+s+"*I >w#w7*^ z\ +{] 7++*D}MO xO 7?*T]Ö ~Š +~‹ Õ +#~+~+*D}Mz xz "0BFIN>A:        ͱ  ͮ M  :ͬ MA L N   n n i n >0 ͻ e >H :´ ͻ ͻ ʦ æ >0 e e >H ͻ ͻ >A e e e e >H _* > w#"  >A *|e }e :>:    Z a= = > > r r  ~ 0À 7 xʞ >0 xe ð yʰ >0 ye >H * >. 6^#@w#":& : +ͯ*#"yI 7#_<2!~*#"*}**z0*+e}|OxG!etI x\*}O|Ge"ɯ2|\ɯ2|\\\@@@@@@@@Z80 DISASSEMBLER R.A.R Ver 1.6x 5/21/84 HIT ANY KEY TO STOP $ERROR: $, LOAD ADDRESS $DISK READ$DISK WRITE$BYTES READ:$LAST ADDRESS $BYTES READ $RECORDS WRITTEN $MACCANNOT OPEN SOURCE$COMNO MORE DIRECTORY SPACE$CANNOT CLOSE FILE$ FIRST PASS - GETTING ADDRESSES$ ADDRESSES FOUND $TITLE Z80 DISASSEMBLER: .COM EQU .Z80 DS DB 0SPNOPDIEIRST POP PUSH RET CALL NZZNCCPOPEPMEX AF,AF'EXXDJNZ JR BIT SET RES RRC RLC RR RL SRA SLA SRL OUT (C),IN NEGRETNRETIIM 0IM 1IM 2LD I,ALD R,ALD A,ILD A,RRRDRLD,(C)ADC HL,SBC HL,LDCPINOTOUTLD (LD DB 0CBH,DB 0EDH, ;Z80.INDEX.EXT.INSDB 0DDH,DB 0FDH, END END JP AF(HL),ALD A,(LD HL,(),A),HLLD INC DEC ADD A,ADD HL,HALT ADC A,SUB SBC A,AND AND A,XOR OR CP RRA RLA RLCA RRCA DAA CPL SCF CCF RET JP CALL EX (SP),HLLD SP,HLEX DE,HLJP (HL) IN A,OUT ; ;@@@Z80 DISASSEMBLER R.A.R Ver 1.6x 5/21/84 HIT ANY KEY TO STOP $ERROR: $, LOAD ADDRESS $DISK READ$DISK WRITE$BYTES READ:$LAST ADDRESS $BYTES READ $RECORDS WRITTEN $MACCANNOT OPEN SOURCE$COMNO MORE DIRECTORY SPACE$CANNOT CLOSE FILE$ FIRST PASS - GETTING ADDRESSES$ ADDRESSES FOUND $TITLE Z80 DISASSEMBLER: .COM EQU .Z80 DS DB 0SPNOPDIEIRST POP PUSH RET CALL NZZNCCPOPEPMEX AF,AF'EXXDJNZ JR BIT SET RES RRC RLC RR  This is the release date of the disk. EM2 COM | EM2 DOC EM2 ASM XM2 ASM MSA15 COM MSA15 DOC MSA INF ZDIS COM DISSAM .DOC 9D FB 128 1 EM2 .COM B7 EC 2688 21 EM2 .DOC D6 AE 4480 35 EM2 .ASM DF F7 22528 176 MSA15 .COM BC C8 6528 51 MSA15 .DOC C9 FE 1024 8 MSA .INF 33 40 384 3 ZDIS .COM 8D 70 4608 36  Fog Library Disk FOG-CPM.109 Copyright (1986) by Fog International Computer Users Group to the extent not copyrighted by the original author for the exclusive use and enjoyment of its members. Any reproduction or distribution for profit or personal gain is strictly forbidden. For information, contact FOG, P. O. Box 3474, Daly City, CA. 94015-0474. as part of the description of a file indicates that the program is distributed on a "try first, pay if you like it" basis. If you find the program(s) meet your need, please refer to the author's documentation for information on becoming a registered user. Only by registering and paying for the programs you like and use will the authors of such programs continue development. Often, more complete documentation, additional modules, and new releases are available only to registered users. Assembly Language programming. Filename Description -07-00 .86 This is the release date of the disk. -CPM%109 .DOC This is the description of the disk contents. CALL-CPM.COM AE14 16K [CALL-CPM 1 of 2] Learn about CP/M function calls with this program which shows registers on the screen. CALL-CPM.DOC F7B5 5K [CALL-CPM 2 of 2] DASM .ZLG 7F69 16K Zilog mnemonic insert for ZZSOURCE. DIS .COM 14E6 5K [DIS 1 of 3] 8080 Disassembler. ASseMbler source is included. DIS .INS A6A7 5K [DIS 2 of 3] DIS .AQM 3F74 27K [DIS 3 of 3] DISASM .AQM 0F75 17K [DISASM 1 of 2] Squeezed ASseMbler source for a Zilog Z80 disassembler. DISASM .DOC 03BE 6K [DISASM 2 of 2] DISSAM .ASM BAEE 23K [DISSAM 1 of 2] ASseMbler source for an 8080 disassembler. DISSAM .DOC 9DFB 1K [DISSAM 2 of 2] EM2 .COM B7EC 3K [EM2 1 of 3] Performs 8080 operations and displays register and flag  information. An excellent way to learn. EM2 .DOC D6AE 5K [EM2 2 of 3] EM2 .ASM DFF7 22K [EM2 3 of 3] MSA15 .COM BCC8 7K ver. 1.5 [MSA 1 of 3] 8080 disassembler. MSA15 .DOC C9FE 1K ver. 1.5 [MSA 2 of 3] MSA .INF 3340 1K ver. 1.5 [MSA 3 of 3] ZDIS .COM 8D70 5K Zilog Z80 disassembler. gistered users. Assembly Language programming. Filename Description -07-00 .86 This is the release date of the disk. -CPM This is the release date of the disk. CLAS6 FON {4FLETTERS u[*CFONT EXE \)$fCONVPRF EXE `$fDELFONTSHP Pn $DOWNLOADEXE %t^'BDSKSPACEEXE h,l%EFONT EXE \,JFANCFONTPRO tou(FFCONFIGEXE ]e@ as part of the description of a file indicates that the program is distributed on a "try first, pay if you like it" basis. If you find the program(s) meet your need, please refer to the author's documentation for information on becoming a registered user. Only by registering and paying for the programs you like and use will the authors of such programs continue development. Often, more complete documentation, additional modules, and new releases are available only to registered users. This disk contains tools for Z80 and Fortran-80 programmers. Z80ASM is an assembler, ZZSOURCE is a disassembler, and CPMLIB is a collection of CP/M routines for Fortran-80. Filename Description -11-18 .87 This is the release date of the disk. -CPM111 .DOC This is the description of the disk contents. Z80ASM24.COM 5D08 9K ver. 2.4 [Z80 Assembler 1 of 10] Z80 assembler using Zilog mnemonics. Will usually assemble programs written for ASM but also adds Z80 instruction set. Source code for an earlier version, Z80 library, and sample program are also included. Z80ASM24.DQC 6B34 12K ver. 2.4 [Z80 Assembler 2 of 10] Z80ASM .DOC 4D9C 4K ver. 2.4 [Z80 Assembler 3 of 10] TEST1A .ASM 0E20 3K ver. 2.4 [Z80 Assembler 4 of 10] TEST2 .ASM C29D 1K ver. 2.4 [Z80 Assembler 5 of 10] Z80MAIN .AQM BBF3 17K ver. 2.4 [Z80 Assembler 6 of 10] Z80OPCDS.ASM ED02 4K ver. 2.4 [Z80 Assembler 7 of 10] Z80SUBS .AQM 1B9C 7K ver. 2.4 [Z80 Assembler 8 of 10] Z80 .DQC D859 6K ver. 2.4 [Z80 Assembler 9 of 10] &Squeezed documentation. Z80 .LQB E674 4K ver. 2.4 [Z80 Assembler 10 of 10] Squeezed Z80 library. ZZSOURCE.COM 48AD 8K [ZZ Source 1 of 2] Z80 disassembler, one of the first such ever released. ZZSOURCE.DQC F89B 17K [ZZ Source 2 of 2] CPMLIB .DOC 676B 17K [CPM Fortran-80 Lib 1 of 14] A library of routines which can be called from Microsoft Fortran-80 programs to interface with selected CP/M CCP and BDOS functions. CPMLIB .REL 4D12 6K [CPM Fortran-80 Lib 2 of 14] CPM .DOC E8D9 2K [CPM Fortran-80 Lib 3 of 14] CPMFN .DOC E0C3 1K [CPM Fortran-80 Lib 4 of 14] CPMFN .REL D9F9 1K [CPM Fortran-80 Lib 5 of 14] CPMFN .MQC 09C6 9K [CPM Fortran-80 Lib 6 of 14] CPMFNA .DOC E53B 1K [CPM Fortran-80 Lib 7 of 14] CPMFNA .REL 6D85 1K [CPM Fortran-80 Lib 8 of 14] CPMFNA .MAC 2501 3K [CPM Fortran-80 Lib 9 of 14] CPMINT .DOC 8748 1K [CPM Fortran-80 Lib 10 of 14] CPMINT .REL FED4 5K [CPM Fortran-80 Lib 11 of 14] CPMINT .FQR A522 17K [CPM Fortran-80 Lib 12 of 14] TEST .DOC 7359 1K [CPM Fortran-80 Lib 13 of 14] TEST .FOR 7806 4K [CPM Fortran-80 Lib 14 of 14]  [CPM Fortran-80 Lib 7 of 14] CPMFNA .REL 6D85 1K [CPM Fortran-80 Lib 8 of 14] CPMFNA .MAC 2501'