; ;SN00PY THE 8080-Z80 TWO PASS ;DISASSEMBLER VER. 1.3 ;WRITTEN BY RALPH E. BUCKNAM ;COPYRITE (C) 1979 ;ALL RIGHTS RESERVED ; ;EQUATE TABLE ; BEG: EQU 8000H CASS: EQU 6EH CASD: EQU 6FH STAK: EQU BEG+40H BUFAD: EQU BEG+41H INIBF: EQU BEG+54H PGBUF: EQU BEG+56H OUTBYT: EQU BEG+59H BRKMSG: EQU BEG+5BH VDMBF: EQU BEG+5DH VDMBF2: EQU BEG+5FH MODE: EQU BEG+61H SPEED: EQU BEG+62H OFSET: EQU BEG+64H HEXAD: EQU BEG+66H HEXAD2: EQU BEG+68H HEXAD3: EQU BEG+6AH HEXAD4: EQU BEG+6CH HERE: EQU BEG+6EH HERE4: EQU BEG+70H SM0ADR: EQU BEG+72H NXTNO: EQU BEG+74H NXTSM0: EQU BEG+76H SM0AD2: EQU BEG+78H DIHXAD: EQU BEG+80H IBUF: EQU BEG+82H BKADR: EQU BEG+83H LNLENG: EQU BEG+85H BKLENG: EQU BEG+86H PAGENO: EQU BEG+87H STKAD2: EQU BEG+89H FLAGS: EQU BEG+8BH TYPE: EQU BEG+8CH STKADR: EQU BEG+0A6H OPSAVE: EQU BEG+0A8H BKADR2: EQU BEG+0AAH RUN: EQU BEG+0ACH JMPADR: EQU BEG+0AEH TBYTE: EQU BEG+0B1H BKBYT: EQU BEG+0B3H TBK1: EQU BEG+0B5H BK1: EQU BEG+0B7H TBK2: EQU BEG+0B9H BK2: EQU BEG+0BBH TBK3: EQU BEG+0BDH BK3: EQU BEG+0BFH TBK4: EQU BEG+0C1H BK4 EQU BEG+0C3H BEG2: EQU BEG+0C6H VDMBA: EQU 0CC00H ; JP BEG3 ORG BEG2 BEG3: JP START JP INPUT ;INPUT FOR EX PGM JP OUTPUT ;OUTPUT FOR EX PGM JP STATUS ;STATUS FOR EX PGM START: LD SP,STAK LD HL,INIBF ;CHECK FOR INIT. LD A,55H CP (HL) JR Z,INIT1 ;ALREADY INIT. LD (HL),A ;STORE IT NOP ;INIT INOUT BOARD NOP ;CALL IF NECESARY NOP INIT2A: XOR A LD (OUTBYT),A LD (PGBUF+1),A LD A,2 LD (SPEED),A LD A,13H ;CONTROL S CALL OUTPUT ;CLEAR SCREEN CALL BUFOUT ;SEND MSG1 DW MSG1 INIT1: LD SP,STAK LD HL,0 LD (OFSET),HL CALL BUFOUT DW MSG2 ;THE PROMPT IS >> ; ;BUFFER INPUT ROUTINE ;ACCEPS UP TO 15 CHARACTERS. ; ; INBUF: LD HL,BUFAD LD B,18 INB1: CALL INPUT CALL OUTPUT CP 7FH ;BACKSPACE JR Z,DELETE ;GO BACKSPACE LD (HL),A ;STORE DATA CP 0DH ;TEST FOR CR JR Z,BUSCA ;CONT ELSEWHERE INC HL DJNZ INB1 JP ERR1 DELETE: LD A,18 CP B JR Z,INB1 INC B ;ADJ POINTERS DEC HL JR INB1 ; ;SCANNER ROUTINE FROM DMON ;READS INPUT FROM BUFFER AND EXTRACTS ;ADDRES AND OTHER INFORMATION ; BUSCA: LD DE,BUFAD LD BC,HEXAD SCA0: INC DE LD A,(DE) CP 0DH JR Z,SCA4 CP '0' ;IS IT A SEPERATOR JR NC,SCA0 SCA1: LD HL,0 SCA2: INC DE LD A,(DE) CP '0' JR C,SCA3 ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,HL CALL TSTHX JP NC,ERR1 ADD L LD L,A JR SCA2 SCA3: LD A,L LD (BC),A INC BC LD A,H ;IN A BUFFER LD (BC),A ;AS HEX INC BC LD A,(DE) CP 0DH ;ARE WE FINSHED JR NZ,SCA1 ;NOPE! ; ;SCA4 FILLS UNUSED HEXAD'S WITH ;0000 AND PLACES 00 SEX BYTES ;BEYOND THE LAST HEX ADDRESS USED ; SCA4: LD E,6 XOR A ;JUST IN CASE SCA5: LD (BC),A INC BC DEC E JR NZ,SCA5 CALL BLKIN CALL CRLF LD A,(BUFAD) SUB 'A' JP M,ERR1 CP 26 ;LESS THAN '['. JP NC,ERR1 LD HL,CLIST ; JUMP TBL ADR. PUSH BC ;SAVE REG. LD BC,0 LD C,A ADD HL,BC ADD HL,BC POP BC LD A,(HL) INC HL LD H,(HL) LD L,A JP (HL) ; ;COMMAND LIST ; CLIST: DW ERR1 ;A DW BREAK3 ;B BREAK DW CHOP ;C LIST AND VDM DW DPHEX ;DUMP HEX DW ENTER ;E DW ERR1 ;F DW GO ;G DW ERR1 ;H DW INIT2A ;I DW ZDISA1 ;J 2 PASS NO TABLE DW ZDISA2 ;K TWO PASS C-R TABLE DW ZDISA3 ;L C-R TABLE ONLY DW MOVE ;M MOVE MEMORY DW ERR1 ;N DW ERR1 ;0 DW ERR1 ;P DW MARG ;Q DW READ ;R READ MAG TAPES DW ERR1 ;S DW ERR1 ;T DW ERR1 ;U DW VMEM ;V VERIFY MEM DW WRITE ;W WRITE MAG TAPES DW ERR1 ;X DW ERR1 ;Y DW ZERO ;Z ZERO MEMORY ; OUTPUT: PUSH AF PUSH BC PUSH DE PUSH HL PUSH IX AND 7FH ;STRIP 7 BIT LD B,A CALL MSTRS ;CHECK FOR KEYPRES LD IX,OUTBYT BIT 0,(IX+0) CALL Z,VDM BIT 1,(IX+0) CALL NZ,LINEP POP IX POP HL POP DE POP BC POP AF RET ; INPUT: IN A,3 AND 8 JR Z,INPUT IN A,1 AND 7FH FORCE: CP 61H RET C CP 7BH RET NC SUB 20H RET ; STATUS: IN A,3 AND 8 RET Z SCF RET ; SPACE: LD B,1 RSPACE: LD A,' ' REPOT: CALL OUTPUT DJNZ REPOT RET ; ENDCH: PUSH HL ; LD HL,(HEXAD4) ;GE BLOCK LN DEC HL LD (HEXAD4),HL ;PUT IT BACK LD A,L OR H POP HL RET ; CRLF: LD A,0DH CALL OUTPUT LD A,0AH ;LF JP OUTPUT ; TSTHX: SUB 30H CP 10 ; LESS THAN A RET C ;YES IT IS 1-9 SUB 10H CP 7 ;A THRU F ONLY RET NC ;IT IS TO BIG ADD 9 SCF RET ; BUFOUT: CALL CRLF ;GET NEW LINE BUFOT2: EX (SP),HL PUSH BC LD C,(HL) INC HL LD B,(HL) BUFT1: LD A,(BC) CALL OUTPUT OR A INC BC JP P,BUFT1 POP BC INC HL EX (SP),HL RET ; ;COMPLETE MESSAGE ; GOOD: CALL BUFOUT DW MSG4 JP INIT1 ; ; ;ERROR MSG SUBROUTINE ; ERR1: CALL BUFOUT DW MSG3 JP INIT1 ; BLKIN: LD HL,(HEXAD2) EX DE,HL LD HL,(HEXAD) LD A,E SUB L LD L,A LD A,D SBC H LD H,A INC HL LD (HEXAD4),HL ;BLOCK LNGTH RET ; ;OFSET CALCULATION ; COFSET: AND A ;CL CFLAG LD HL,0 LD DE,(HEXAD3) ;GET OFFSET SBC HL,DE JR Z,OFFSTR ;NO ENTRY LD HL,(HEXAD) ;GET START OF DISASSEMBLY EX DE,HL AND A ;CLEAR CARRY FLAG SBC HL,DE ;CALCULATE DISPLACMENT EX DE,HL LD HL,0 ;ZERO OUT HL REG. AND A ;CLEAR CARRY FLAG SBC HL,DE ;CALC. OFFSTR: AND A ;OFFSET IS CALCULATED EX DE,HL ;IN POSITION LD HL,0 ;ZERO HL REG SBC HL,DE ;CALC OFFSET VALUE LD (OFSET),HL ;STORE OFSET RET ; MSTRS: IN A,3 ;IN KEY PRESS AND 8 RET Z IN A,1 ;GET INFO AND 7FH CALL FORCE JR SET1 ; SET: CALL INPUT SET1: CP 1BH ;? ESCAPE JP Z,INIT1 CP ' ' ;IS IT A SPACE JR Z,SET ;WAIT CP 16H ;CTRL V VIDEO JR Z,CTRLV CP 0CH ;CTRL L LINE JR Z,CTRLL CP 10H ;CTRL P V&L JR Z,CTRLP CALL TSTHX ;IS IT VALID RET NC DEC A ;MAKE 1=0 LD (SPEED),A ;RECORD IT RET CTRLV: LD A,0 ;VID ONLY LD (OUTBYT),A ;STORE RET CTRLL: LD A,3 ;LIST ONLY LD (OUTBYT),A ;STORE RET CTRLP: LD A,2 ;LIST & VID LD (OUTBYT),A ;STORE RET ; ;TTY OUTPUT ROUTINE ; LINEP: LD A,11H ;CTRL Q CP B JR Z,PGSET OD11: IN A,3 ;IN STAUTS AND 1 JR Z,OD11 IN A,3 AND 20H JR NZ,OD11 LD A,B ;GET DATE IN ACUM OUT 2,A ; OUT TTY CP 0AH ;LF RET NZ LD B,4 ;FOUR SPACES CALL LINSP ;LINE PRINT SPACES CALL PAGE RET PGSET: LD A,(PGBUF+2) LD (PGBUF),A RET LINSP: LD A,20H LINSP2: PUSH BC LD B,A CALL LINE2 POP BC DJNZ LINSP2 RET LINE2: IN A,3 AND 1 JR Z,LINE2 IN A,3 AND 20H JR NZ,LINE2 ;KEEP WAITING LD A,B OUT 2,A RET ; ;PAGINATION ROUTINE ; PAGE: LD HL,PGBUF ;LOOK AT BUF. DEC (HL) RET NZ INC HL ;END OF PAGE NOW LD A,(HL) ;COUNT SPACES OR A RET Z ;NONE TO BE SKIPED LD B,A LCRLF: PUSH BC LD B,0DH CALL LINE2 LD B,0AH CALL LINE2 POP BC DJNZ LCRLF LD B,4 CALL LINSP INC HL LD A,(HL) ;RESET COUNTER LD (PGBUF),A LD A,1 LD (BRKMSG),A ;CONT BKTRAC MSG RET ; ;THE CHOP ROUTINE SETS THE OUTBYT ;FOR OUTPUT TO VDM AND LIST DEVICE ; CHOP: LD A,2 LD (OUTBYT),A JP INIT1 ; ;SUBROUTINE TO SET PAGE LENGTH ;AND SPACE BETWEEN PAGES ; MARG: LD HL,(HEXAD) LD A,L SUB H LD L,A LD (PGBUF),HL LD (PGBUF+2),A JP INIT1 ; MSG1: DB 'SNOOPY ON LIN',0C5H MSG2: DM '>>' ;>> PROMPT MSG3: DB 'ERRO',0D2H MSG4: DB 'COMPLET',0C5H ; ;EXECUTE AT SELECTED ADDRESS ; GO: LD HL,INIT1 ;RET ADR PUSH HL LD HL,(HEXAD) JP (HL) ; ;ROUTINE TO ENTER HEX FROM THE KEYBOARD ; ENTER: LD HL,INIT1 ;RET ADR PUSH HL ;RET IN STACK LD HL,(HEXAD) ENTR1: CALL CRLF ;CRLF CALL ADOUT ;O/P CURRENT ADD CALL SPACE CALL MOUT ;O/P CURR MEM BYT CALL SPACE CALL HEXTT PUSH AF CALL SPACE CALL MOUT ;O/P FINAL POP AF JR NZ,BKK1 DEC HL DEC HL BKK1: INC HL JR ENTR1 ; ;SUBROUTINE TO O/P REG IN HEX ; HEXOUT: PUSH BC ;SAVE LD B,A ;SAVE TEMP. CALL HEXO1 POP BC RET HEXO1: RRCA RRCA RRCA RRCA CALL CHASE ;CHANGE TO ASCII CHASE: AND 0FH ;MASK ADD 30H ;ADD '0' CP 3AH ;?>9 JR C,REN ADD 7 ;CHANGE TO A-F REN: CALL OUTPUT LD A,B RET ; ;OUT MEM BYT IN HEX ; MOUT: LD A,(HL) ;GET IT CALL HEXOUT ;OUTPUT IT RET ; ;OUTPUT ADDRESS ; ADOUT: LD A,H ;GET HI ADRESS CALL HEXOUT ;0/P IT LD A,L ;AND THE LOW CALL HEXOUT ;O/P IT RET ; ;OFSET ADDRESS OUTPUT ROUTINE ; OFFADR: PUSH DE PUSH HL LD DE,(OFSET) ADD HL,DE CALL ADOUT POP HL POP DE RET ; ;INPUT CHARACTER FROM KEYBOARD ; HEXTT: CALL INPUT ;GET BYTE CP 7FH ;IS IT BACKSPACE ? RET Z ;YEP CP ' ' ;IS IT S SPACE JR Z,NXT CALL OUTPUT CALL TSTHX ;IS IT VALID JR NC,NOPE LD B,A ;SAVE NEW DATA LD A,(HL) ;GET CURRENT DATA RLCA ;SAVE RIGHT HALF RLCA RLCA RLCA AND 0F0H OR B ;ADD IN NEW LD (HL),A JR HEXTT ;KEEP GOING NXT: OR A ;TURN OFF ZERO RET NOPE: POP AF ;CORRECT STACT RET ; ;DUMP HEX AND ASCII ; DPHEX: CALL PGSET CALL COFSET LD A,(BUFAD+1) ;LOOK AT BUF. CP 'A' LD A,0FH JR NZ,DP1 AND 7 DP1: LD D,A ;STORE LINE LENGTH LD HL,(HEXAD) ;GET ADR DP2: PUSH HL ;SAVE CALL OFFADR ;O/P OFFSET ADR DPH1: CALL SPACE CALL MOUT INC HL ;ADJ POINTERS CALL ENDCH JP Z,GOOD LD A,D ;GET LINE LENGTH AND L JR NZ,DPH1 LD A,D ;GET IT AGAIN CP 7 JR Z,SPA POP AF ;CORRECT STACK CR1: CALL CRLF JR DP2 ;GET NEW LINE SPA: LD B,5 ;OUTPUT 5 SPACES CALL RSPACE ;REPOT SPACE POP HL ;GET ORIGNAL ADR ASCOT: LD A,(HL) ;GET DATA NOP ;RESERVED FOR AND 7F NOP ;E6 F7 NOP ;RESERVED FOR 0R 40H NOP ;F6 40 CALL CANCL ;CHECK FOR ASCII CALL OUTPUT ;O/P IF VALLID CALL SPACE INC HL LD A,D ;END OF LINE ? AND L JR NZ,ASCOT ;NOT YET JR CR1 CANCL: CP 20H ; LETTER CHECK JR C,CNCL1 CP 5BH RET C CNCL1: LD A,'.' RET ; ;VIDO DRIVR ;WRITTEN FOR PROC-TECH'S VDM-1 ; VDM: LD A,B LD DE,(VDMBF+2) ;GET LINE &POS LD HL,(VDMBF) ;GET ADR POINT CP 0CH ;FORM FEED JR Z,CLEAR CP 10H ;CTRL P JR Z,FMAT CP 13H ;CTRL S JR Z,FMAT CP 1 ;RESET WOUT CLR JR Z,CLR1 AND 7FH ;STRIP CP 0DH ;CR JR Z,CR CP 20H ;SKIP CTRL CHAR RET C CP 7FH ;BKSP JR Z,BKSPC LD (HL),A INC HL CALL MEMCH NEXT: DEC E JR Z,NEXT1 EXIT: LD (HL),5FH ;RESTOR CURSOR LD (VDMBF),HL ;STORE POS AND LD (VDMBF2),DE ;LINE COUNTER ; ;DELAY LD HL,(SPEED-1) ;SPEED TO H LD L,1 TIMER: DEC HL LD A,H OR L JR NZ,TIMER RET NEXT1: LD E,64 ;LD LINE LEGNTH LD A,(MODE) ;WHICH MODE CP 10H JR NZ,SCROL INC D LD A,D ;? END OF SCREEN AND 0FH CP 0 JR Z,CLEAR JR EXIT ; ;CLEAR ROUTIN TO RESET ; CLEAR: LD A,0 OUT 0C8H,A ;OUT VDM LD HL,VDMBA CLR1: LD A,0D0H ;SET END CLR2: LD (HL),' ' INC HL CP H JR NZ,CLR2 LD HL,VDMBA ;CHECK MODE LD A,(MODE) CP 10H ;CTRL P JR Z,CLR3 LD HL,0CFC0H ;BEG SCROOL CLR3: LD DE,0040H ;SET LINE &POS JR EXIT FMAT: LD (MODE),A JR CLEAR ; ;CR ROUTINE CR: LD (HL),' ' ;SPACE INC HL DEC E JR NZ,CR CALL MEMCH JR NEXT1 BKSPC: LD (HL),' ' ;SPACE DEC HL INC E JR EXIT SCROL: INC D LD A,D AND 0FH LD D,A OUT 0C8H,A PUSH HL LINE: LD (HL),' ' ;CLEAR LINE DEC E INC HL JR NZ,LINE LD E,64 POP HL JR EXIT MEMCH: LD A,H ;CHECK END MEM CP 0D0H RET NZ LD HL,VDMBA RET ;END ; ;THIS ROUTINE MAKES THE ;SYMBOL TABLE ; CLYSMB: LD DE,TABSTA ;START ADR SYMTBL. LD H,D ;GET ADR IN H LD L,E ;AND IN L REG. XOR A LD (HL),A ;POKE 00 TABSTART INC DE LD BC,0BFCH ;TBL LENGTH LDIR DEC (HL) ;GET 0FFH IN MEM. LD BC,4 LDIR RET ;END CLR TBL. ; ;THIS ROUTINE CALCULATES THE ADR. OF JUMP ;REALITIVES, OBTAINS THE ADDRESS OF OTHER ;SYMBAL PRODUCING OPCODES AND STORES THE ;NUMBER O BYTES AND SETS FLAGS FOR SM00S ;IN I REGISTER. ; BYTES: LD HL,(HERE) ;GET POSITION LD A,(HL) ;GT CTRL BYT IN A CP 0CBH ;TEST FR CB FAMILY JR Z,TWOBYT CP 0DDH ;TEST FOR DD FAMLY JR Z,FAMDD CP 0FDH ;TEST FD FAMILY JR Z,FAMFD CP 0EDH ;TEST ED FAMILY JR Z,FAMED ; ;CHECK FOR JUMP REALITIVES ; LD BC,6 ;SIX JRS LD HL,TAB1 ;JR TABLE ADDR. CPIR ;SEARCH FOR JR JP Z,AJR ;JP IF JR ; ;NO SYMBAL TWO BYTE 8080 OPCODES ; LD BC,12H ;NO. OF TWO BYTS LD HL,TAB2 CPIR ;TEST FOR TWO BYTES JR Z,TWOBYT ; ;TEST FOR THREE BYTE 8080 OPCODES ;PRODUCING SYMBALS ; LD BC,1AH ;NO. OF THREE BYTS CPIR ;TEST FOR 3 NYTES JR Z,BYTES3 ; ;ONE BYTE 8080 ROUTINE ; LD A,1 ;ONE BYTE LD (IBUF),A ;STORE CTRL RET ;COMPLEATE ; ;THIS ROUTINE SEPERATES TWO AND ;FOUR BYTE OF THE ED FAMILY OF ;Z80 OPCODES ; FAMED: INC HL ;GET POINTER LD A,(HL) ;GET CONTROL BYTE LD HL,TAB3 ;GET TABLE ADDRES LD BC,8 ;NO. SM0 PRODUCERS CPIR ;TEST FOR SM000'S JR Z,SM0BYT ; ;TWO BYTE OPCODES ; TWOBYT: LD A,2 LD (IBUF),A ;STORE CTRL RET ; ;STORE FLAGS AND NO. OF BYTES IN I ;REG AND STORE ADDRESS OF SM000 ; SM0BYT: LD A,84H LD (IBUF),A ;STORE CTRL LD HL,(HERE) ;GET START OF INSTR. INC HL ;GET POSITION INC HL SM02: LD E,(HL) ;GET LOW ADDRESS INC HL LD D,(HL) ;GET HIGH ADDRESS LD (SM0ADR),DE ;STORE ADDRESS RET ;COMPLEATE ; BYTES3: LD HL,(HERE) ;GET ADDRESS INC HL ;POINT LOW ADR. LD A,83H ;FLAG AND BYTES LD (IBUF),A ;STORE CTRL JR SM02 ; FAMDD: INC HL LD A,(HL) CP 0E9H ;TEST FOR DDJMP JR NZ,FAMDFD LD A,12H ;SET FLAGS LD (IBUF),A ;STORE CTRL RET ; FAMFD: INC HL LD A,(HL) CP 0E9H ;TEST FOR FDE9 JR NZ,FAMDFD LD A,22H ;SET FLAGS LD (IBUF),A ;STORE CTRL RET ; ;DD &FD FAMILY ; FAMDFD: LD HL,TAB4 ;DD & FD OPCODES LD BC,1AH ;NO. OF 3 BYTES CPIR ;TEST FOR 3 BYTES JR Z,ZBYTE3 LD BC,3 CPIR ;TETS FOR SM000S JR Z,SM0BYT CP 36H ;TEST FOR 36 JR Z,BYTES4 CP 0CBH ;TEST FOR CB'S JR Z,BYTES4 JR TWOBYT ; BYTES4: LD A,4 LD (IBUF),A ;STORE CTRL RET ; ZBYTE3: LD A,3 LD (IBUF),A ;STORE CTRL RET ; ;THIS ROUTINE CALCULATES JUMP RELITIVES ; AJR: LD A,0C2H ;JR EXISTS LD (IBUF),A ;STORE CTRL LD HL,(HERE) ;GET POSITION INC HL LD A,(HL) ;GET JUMP BYTE INC HL BIT 7,A ;TEST FOR BACK JUMP JR NZ,BACK LD B,0 READY: LD C,A ADD HL,BC ;CALCULATE JUMPR LD BC,(OFSET) ADD HL,BC LD (SM0ADR),HL ;STORE RESULTS RET BACK: LD B,0FFH ;LOAD B REG. JR READY ; ;TABLES OF CONTROL CHARACTERS ; TAB1: DB 10H ;JUMP REALITIVES DB 18H DB 20H DB 28H DB 30H DB 38H ; ;TAB 2 REMAING 8080 TWO AND THREE ;BYTE OPCODES ; TAB2: DB 06H ;18H N0. OF TW0BYTE DB 0EH DB 16H DB 1EH DB 26H DB 2EH DB 36H DB 3EH DB 0C6H ;ACUM MATH-LOG DB 0CEH DB 0D6H DB 0DEH DB 0E6H DB 0EEH DB 0F6H DB 0FEH DB 0D3H ;OUT DB 0DBH ;IN ; ;THREE BYTE 8080 ; DB 01H ;12 NO.3BYTES DB 11H DB 21H DB 31H DB 22H DB 2AH DB 32H DB 3AH DB 0C2H ;CALLS DB 0CAH DB 0CDH DB 0D2H DB 0DAH DB 0E2H DB 0EAH DB 0F2H DB 0FAH DB 0C3H ;JUMPS DB 0C4H DB 0CCH DB 0D4H DB 0DCH DB 0E4H DB 0ECH DB 0F4H DB 0FCH ; ;ED OPCODES ; TAB3: DB 43H DB 4BH DB 53H DB 5BH DB 63H DB 6BH DB 73H DB 7BH ; ;DD & FD OPCODES ; TAB4: DB 26H ;2 ADD. BYTES DB 2EH DB 34H DB 35H DB 46H DB 4EH DB 56H DB 5EH DB 66H DB 6EH DB 70H DB 71H DB 72H DB 73H DB 74H DB 75H DB 77H DB 7EH DB 86H ;MATH-LOGIC DB 8EH DB 96H DB 9EH DB 0A6H DB 0AEH DB 0B6H DB 0BEH ;1AH BYTES ; DB 21H ;SM0ING BYTES4 DB 22H DB 2AH ; ;THIS IS THE SEARCH AND INSERT ;ROUTINE ; SEAINS: LD IY,TABSTA LD DE,(SM0ADR) ;ADR POINTED TO SER1: LD A,(IY+0) ;COUNTER BYTE LD H,(IY+1) ;HIGH ADR. LD L,(IY+2) ;LOW ADR. CP 0FFH ;END TABLE? RET Z OR A ;END TAB. ENTRIES? JR Z,INS1 AND A ;CLEAR CARRY FLAG SBC HL,DE ;CHECK JR Z,INS2 ;MATCHED? JR C,INCAY ;KEEP SEARCHING JR TRANS ;TRANSFER ROUTINE INCAY: INC IY INC IY ;GET READY INC IY JR SER1 ;JUMP SEARCH ; ;LOAD INFORMATION TO BE TRANSFERED ; TRANS: LD A,1 ;SET FOR FIRST EX AF,AF' ;EXCH ACCUMS EXX ;EXCH REGISTERS INS3: LD A,(IY+0) ;GET CONTROL CHAR. LD D,(IY+1) ;HIGH ADR. LD E,(IY+2) ;LOW ADR. CP 0FFH ;END OF TBL? RET Z OR A ;END OF INSERTS? JR Z,STORE CALL STORE INC IY ;GET NEXT INC IY ;TABLE POSITION INC IY ; " " JR INS3 ;KEEP GOING STORE: EX AF,AF' EXX STORE1: LD (IY+0),A ;STORE A LD (IY+1),D ;STORE HIGHER ADR. LD (IY+2),E ;STORE LOWER ADR RET INS1: INC A ;INCREASE A TO 1 JR STORE1 INS2: INC (IY+0) ;INCREASE COUNTER RET ; ;MAKE THE SYMBOL TABLE IN MEMORY ; MAKSYM: CALL CLYSMB ;CLEAR SYMBOL TBL LD HL,(HEXAD) ;GET START LD (HERE),HL ;STORE START ADR. CONT: CALL BYTES LD A,(IBUF) ;GET CTRL BIT 7,A ;TEST FOR SM0 JR Z,HERE2 ;JMP NO SM0 CALL SEAINS ;SEARCH AND INSERT HERE2: LD HL,(HERE) ;GET PRESENT POS. LD A,(IBUF) ;GET CTRL AND 7 ;STRIP OFF FLAGS LD B,A ;GET IN B REG. INCA: INC HL ;INCA HL BY ONE DJNZ INCA ;INCREASE TO B=0 LD (HERE),HL ;STORE NEXT POS. AND A ;CLEAR CARRY FLAG LD DE,(HEXAD2) ;GET END SBC HL,DE ;CALCULATE RESULTS RET Z RET NC ;RESULTS POSITIVE JR CONT ;CONTINUE ; ;THIS ROUTINE PRODUCES THE SM000 ;NUMBER. DE CONTAINS THE ADDRESS ;WHICH IS BEING CHECKED TO SEE IF ;A SM00 EXISTS. IY REGISTER CON- ;TAINS THE SM000 NUMBER AND THE ;ACCUMULATOR CONTAINS THE NUM- ;BER OF TIMES THE SM000 HAS BEEN ;POINTED T0. ; SM0IT: LD IX,0 LD IY,TABSTA SM0IT2: LD A,(IY+0) ;THE NUMBER OF SM0S. LD H,(IY+1) ;HIGH ADR. LD L,(IY+2) ;LOW ADR. AND A ;CLEAR CARRY FLAG SBC HL,DE ;CHECK RET Z ;RETURN WITH SM0 JR NC,XRA ;TOO FAR! INC IY INC IY INC IY ;READY FOR NEXT INC IX ;INCREASE SM0 NO. JR SM0IT2 ;KEEP GOING XRA: XOR A ;ZERO ACCUM. RET ; ;THIS ROUTINE OUTPUTS THE SM00 ;NUMBER OUTSM0: LD B,2 ;OUT TWO SPACES CALL RSPACE ;OUT SPACES LD A,'S' CALL OUTPUT LD A,'M' CALL OUTPUT PUSH IX POP HL ;TRANSFERED LD A,H CALL CHASE LD A,L CALL HEXOUT RET ; ;OUTPUT SMO NUMBER AND THE ;NUMBER OF CALLS. RETURNS WITH ;B REG. CONTAINING NUMBER OF ;REMAINING SPACE SMOO OR NO ;SM0; ; OUTSM2: LD B,12 ;NO. SM0 SPACES CALL SM0IT CP 0 ;0 IN ACCUM. RET Z ;YES PUSH AF ;SAVE NUMBER OF CALLS CALL OUTSM0 CALL SPACE POP AF ;GET NO OF CALLS CALL HEXOUT LD B,2 ;LOAD FOR SREPOT RET ; ;DISSASSEMBLER COMMAND ROUTINe #1 ; DISSA1: CALL MAKSYM ;MAKE SYMBOL TABLE LD HL,(HEXAD) ;GET STARD ADR. REPEAT: LD (HERE),HL ;STORE PRESENT ADR. PUSH HL CALL BYTES ;GET CTRL IN I REG. POP HL ;RETREIVE HL CALL CRLF CALL OFFADR ;PRINT ADDRESS LD B,2 ;TWO SPACES CALL RSPACE ;OUT TWO SPACES LD A,(IBUF) ;GET CTRL AND 7 ;STRIP FLAGS LD B,A ;GET BYTES IN B REG. LD C,9 ;MAX SPACES HEXOT2: CALL MOUT ;OUT IT INC HL ;INCREASE ADDRESS DEC C ;REDUCE SPACES DEC C DJNZ HEXOT2 ;REPEAT LD B,C ;SET FOR RSPACE CALL RSPACE ;OUTPUT SPACES LD (HERE4),HL ;SAVE NEXT ADR. LD DE,(HERE) ;READY FOR SM0IT LD HL,(OFSET) ADD HL,DE ;CALCULATE EX DE,HL CALL OUTSM2 ;OUT SM0 & NUMBER CALL RSPACE ;OUT REMAING SPACES LD HL,(HERE) ;GET POSITION LD (DIHXAD),HL ;START DISASA OUT CALL ZDISA ;CALL DISASS. BIT 7,B ;TEST IF REPOT CALL Z,RSPACE ;REPOT LD A,(IBUF) ;GET CTRL BIT 7,A ;TEST FOR SM0 JR Z,ENDCHK ;JP NO SM0 LD DE,(SM0ADR) ;READR FOR SM0IT CALL SM0IT ;GET SM0 NO. LD A,20H ;ONE SPACE CALL OUTPUT ;OUT UT CALL OUTSM0 ;OUTPUT NUMBER ENDCHK: LD DE,(HERE4) ;NEXT ADR LD HL,(HEXAD2) ;END ADR. AND A ;CLEAR CARY FLAG SBC HL,DE ;CHECK RET C ;END OF ROUTINE LD HL,(HERE4) ;GET NEXT ADR. JR REPEAT ;KEEP GOING ; ;TWO PASS NO SYMBOL TABLE ;DISASSEMBLER NO CROSS RFFERENCE ;COMMAND ROUTINE ; ZDISA1: CALL COFSET ;CALCULATE OFFSET CALL PGSET ;SET PAGE CNTR.=0 CALL DISSA1 JP GOOD ;RETURN TO SNOOPY ; ;THIES ROUTINES OUTPUT THE ;CROSS REFFERENCE TABLE ; CRREF: LD A,(PGBUF) ;GET REMAINING LINES LD B,A ;MOVE TO REPOT REG. PGCLR: PUSH BC ;SAVE CALL CRLF ;OUT REMAIN LINES POP BC ;SAVE DJNZ PGCLR ;OUT TO ZERO CRREF2: CALL PGSET ;RESET PAGE ; ;GET SM0 AND OUT SM0 LINE ; LD IY,TABSTA ;TABLE START LD IX,0-1 ;0 SM0S LD (NXTSM0),IY ;STORE LD (NXTNO),IX ;STORE ; ;RETURN HERE FOR REPEAT ; RPEAT2: LD IY,(NXTSM0) ;RETREAIVE LD IX,(NXTNO) ; " LD A,(IY+0) ; NO CALLS LD H,(IY+1) ;HIGH ADR. LD L,(IY+2) ;LOW ADR. INC IY INC IY INC IY LD (NXTSM0),IY ;STORE NXT INC IX LD (NXTNO),IX LD (SM0AD2),HL ;SAVE SM0 ADR. LD DE,(HEXAD3) ;GET OFFSET ADD HL,DE ;GET RESULTS LD (DIHXAD),HL ;STORE CP 0FFH ;END TBL? RET Z OR A ;END INSERTS? RET Z PUSH AF ;SAVE N0. CALLS CALL OUTSM0 ;OUTPUT CALL SPACE POP AF ;RETREIVE CALL HEXOUT ;OUT NO. CALLS LD B,2 ;LOAD FOR SPACES CALL RSPACE ;OUTPUT SPACES LD HL,(SM0AD2) ;GET ADR. OF SM0 CALL ADOUT ;OUTPUT ADR. LD B,2 ;LOAD FOR SPACES CALL RSPACE ; OUT SPACES LD HL,(DIHXAD) ;GET INFOR LD (HERE),HL ;STORE INFO CALL BYTES CALL ZDISA ;CALL 8080-Z80 DIS. CALL SM0USR ;OUTPUT SM0USR CALL CRLF JR RPEAT2 ;KEEP GOING ; ;THIS ROUTINE PRINTS OUT THE ;INSTRUCTION WHICH IS POINTING ;TO THE LAST SM0. SM0USR: LD HL,(HEXAD) ;GET START CONT3: LD (HERE),HL ;STORE CALL BYTES ;GET CONTROL LD A,(IBUF) ;GET CTRL BIT 7,A ;IS IT AS SM0 JR Z,CHKEND ;NO SMO LD DE,(SM0ADR) ;PROGRAM SM0 ADR. LD HL,(SM0AD2) ;TABLE SMO ADR. AND A ;CLEAR CARRY FLAG SBC HL,DE ;CALCULATE JR NZ,CHKEND ;NO MATCH CALL CRLF ;GET NEW LINE LD HL,(HERE) ;GET PRESENT POS CALL OFFADR ;OUT ADR. LD B,2 ;TWO SPACES CALL RSPACE ;OUT SPACES LD HL,(HERE) ;GET PRESENT ADR. LD (DIHXAD),HL ;STORE FOR ZDISA CALL ZDISA ;CALL 8080-Z80 DIS. CHKEND: LD A,(IBUF) ;GET CTRL AND 7 ;STRIP LD B,A ;GET BYTES IN B LD HL,(HERE) ;GET PRES ADR. NXTADR: INC HL DJNZ NXTADR ;GO TO ZERO EX DE,HL ;SAVE IN DE REG LD HL,(HEXAD2) ;GET END ADR AND A ;CLEAR CARY FLAG SBC HL,DE RET C ;END? EX DE,HL ;GET NEXT IN HL REG. JR CONT3 ;CONI ; ;DISASSEMBLE & CROSS REFFERENCE ;COMMAND ROUTINE ; ZDISA2: CALL COFSET ;CALCULATE OFFSET CALL PGSET ;RESET PAGE CALL DISSA1 ;DISASSEMBLE CALL CRREF ;MAKE TABLE JP GOOD ;END ; ;CROSS REFFERENCE ONLY ;COMMAND ROUTINE ; ZDISA3: CALL COFSET ;CALCULATE OFFSET CALL PGSET ;RESET PAGE CALL MAKSYM ;MAKE SYMBOL TABLE CALL CRREF2 ;MAKE C-R TABLE JP GOOD ;END ; ;READ MAGNETIC TAPES ; READ: LD HL,(HEXAD) ;GET SPECIFIC START LD B,0 ;ZERO CHECK REG. PUSH HL ;SAVE FOR LATER USE LD DE,(HEXAD2) LD A,10H OUT CASS,A LD A,(BUFAD+1) LD C,A CP 'S' ;TEST FOR SPECIFIC JR Z,RC2 ;JP REG LOAD CP 'V' ;TEST FOR VERIFY JR NZ,RC1 SET 7,C ;SET VERIFY FLAG RC1: CALL CASIN ;ADR AND BLOCK LENGTH LD L,A CALL CASIN LD H,A CALL CASIN LD D,A CALL CASIN LD E,A LD A,C ;RETREIVE CTRL BYTE CP 'M' ;DO WE HAVE MOVE? JR NZ,RC2 POP HL RC2: CALL CASIN ;GET DATA BIT 7,C ;TEST FOR VERIFY JR Z,RC3 CP (HL) PUSH AF ;SAVE FLAGS JR NZ,CASEND ;THERE IS ERROR POP AF ;REMOVE FLAGS FROM STK JR RC4 RC3: LD (HL),A RC4: INC HL ;GO TO NEXT ADR DEC DE ;REDUCE COUNT LD A,E OR D JR NZ,RC2 ;NOT DONE YEAT LD E,B CALL CASIN ;GET CHSUM FR TAPE CP E PUSH AF DEC HL CASEND: CALL ADOUT POP AF ; RETREIVE FLAGS JP NZ,ERR1 JP GOOD CASIN: IN A,CASS ;TEST STATUS AND 10H JR NZ,CASIN IN A,CASD ;GET DATA PUSH AF ;SAVE ADD B ;UPDATE CHECKSUM LD B,A CALL MSTRS POP AF ;RETREIVE DATA RET ; ; WRITE: LD HL,(HEXAD4) EX DE,HL LD HL,(HEXAD) CALL WRC JP GOOD WRC: LD A,3CH PUSH BC CALL CASOT CALL WRC2 LD B,0 LD A,L CALL CASOT LD A,H CALL CASOT LD A,D CALL CASOT LD A,E CALL CASOT WRC1: LD A,(HL) CALL CASOT INC HL DEC DE LD A,E OR B JR NZ,WRC1 LD A,B CALL CASOT POP BC RET ; WRC2: LD A,0E6H CASOT: PUSH AF ADD B LD B,A CALL MSTRS WRC3: IN A,6EH AND 20H JR NZ,WRC3 POP AF OUT 6FH,A RET LDREG: LD HL,(HEXAD) LD DE,(HEXAD3) LD BC,(HEXAD4) RET ; ; ZERO: CALL LDREG PUSH HL POP DE INC DE DEC BC XOR A LD (HL),A LDIR JP GOOD ; ; VMEM: CALL LDREG SM5: LD A,(DE) CPI DEC HL CALL NZ,SM9 CALL NZ,SM7 EX DE,HL CALL NZ,SM7 CALL NZ,SM8 CALL NZ,CRLF EX DE,HL INC HL INC DE JP PO,GOOD JR SM5 ; ; MOVE: CALL LDREG CALL SM6 JR SM5 SM6: PUSH HL PUSH DE PUSH BC LDIR POP BC POP DE POP HL RET ; SM7: PUSH AF PUSH BC CALL SPACE POP BC POP AF LD A,(HL) PUSH AF CALL HEXOUT POP AF RET SM8: PUSH AF PUSH BC CALL SPACE POP BC POP AF SM9: PUSH AF CALL ADOUT POP AF RET ; ;SNOOPYS Z80 DISASSEMBLER ; ZDISA: XOR A ; ZERO ACCUMULATOR LD E,A ;STORE 00 IN D REG LD IY,(DIHXAD);GET ADR. OF DISAS IN IY LD A,(IY+00) ;GET CNRL IN A REG CP 0CBH ;TEST FOR CB FAM JP Z,PCB ;CB PROCESS CP 0DDH ;TEST FOR DD FAMILY JR Z,PROCDD CP 0EDH ;TEST FOR ED FAMILY JR Z,PROCED CP 0FDH ;TEST FOR FD FAMILY JR Z,PROCFD ; PRODFD: AND A ;CLEAR FLAGS CALL NPROC1 ;TEST FOR NO PROCESS JP NC,PROC1 ;PROCES AS NOPROCESS LD IX,TABPRI ;ADDRESS OF TABLE LD A,E ;GET DD-FD FLAGS CP 0 ;TEST FOR 8080 TYPE JR Z,DEFIND LD IX,TABDFD ;GET DD-FD TABLE DEFIND: CALL PFIND JP C,PROC3 LD A,D ;GET CTRL OR 3FH ;GET LOWER 6 BITS CP 0BFH ;TEST FOR LGMATH JP Z,P23 LD A,D ;GET CTRL OR 38H CP 0FEH ;TEST FOR ACC. LGMATH JP Z,P24 JR ERR2 ; PROCDD: SET 0,E ;SET DD FLAGS JR PDFD PROCFD: SET 1,E ;SET FD FLAGS PDFD: INC IY ;ADVANCE ADR LD A,(IY+00) ;GET CTRL IN A CP 0CBH ;TEST FOR DD-FD CB'S JP Z,PDFDCB ;DD CB ?? ?? JR PRODFD ;PROCESS AS 8080 TYPE ; ;ED PROCESS ; PROCED: LD BC,15H ;NO OF NO PROCESS LD HL,TABN2 ;TABLE FOR ED INC IY ;GET PROPER POSITION LD A,(IY+00) ;GET CTRL AND A ;CLEAR FLAGS LD D,0EH ;CORRECT FOR TAB POSITION CALL NXTCP ;READY FOR TEST JP NC,PROC1 LD IX,TABED ;ED TABLE CALL PFIND JP C,PROC3 ;MATCH HAS BEEN FOUND ERR2: LD HL,TBERR2 ;? JP MSGOUT ;OUT ? ; ;TEST FOR NO PROCESS OPCODES ; NPROC1: LD BC,0EH ;NO OF OPCODES LD HL,TABN1 ;TAB OF NO PROCESS OPCODES LD D,0 ;GET 00 IN D REG NXTCP: CPI ;CHECK FOR MATCH RET Z ;READY FOR PROCESS PUSH AF INC D ;INCREASE FOR MSG OUT POP AF ;RETREIVE FLAGS JP PE,NXTCP ;KEEP SEARCHING LD A,(IY+00) LD D,A SCF ;FLAG NO MATCH RET ;RETURN TO CALLER ; ;SETUP FOR OPCODE REQ PROCESS ; ;THE PRIMARY FINDER ROUTINE FINDS ;THE ADDRESS WHERE THE DATE BYTES ;START FOR A PARTICULAR OPCODE. THE ;PRIMARY FINDER EXPECTS IX REGISTER ;TO HAVE THE ADDRESS OF THE OPCODE ;. IY REGISTER IS TO CONTAIN THE ;START OF THE DATE BYTE TABLE AND ;RETURNS WITH IY REGISTER POINTING ;AT THE START OF THE DATA BYTE ;FOR THE TESTED MACHINE CODE ; PFIND: LD A,(IX+00) ;GET DATA BYTE CP 0FFH ;CHECK FOR END RET Z ;END OF TABLE AND 0C0H ;STRIP OFF LOWER BYTES RLCA RLCA INC A LD B,A ;GET READY FOR DJNZ LD HL,ORIT-1 ;LOAD ADDRESS OF OR'S ADVOR: INC HL DJNZ ADVOR LD A,D ;GET CTRL BYTE IN A OR (HL) CP (IX+02) ;IS THERE A MATCH JR Z,NEXSTP ;MATCH HAS BEEN MADE INC IX INC IX INC IX JR PFIND ; NEXSTP: SCF ;SET CARRY FLAG RET ;RET TO CALLER ; ORIT: DB 00H ;NO OR DB 30H ; OR 30H DB 38H ; OR 38H DB 3FH ; OR 3FH ; ;NON PROCESS OPCODED TABLE ;FOR OPOCDES NOR REQURING ;AND PROCESSING ; TABN1: DB 00H ;NOP DB 07H ;RLCA DB 0FH ;RRCA DB 17H ;RLA DB 1FH ;RRA DB 27H ;DAA DB 2FH ;CPL DB 37H ;SCF DB 3FH ;CCF DB 0C9H ;RET DB 0D9H ;EXX DB 0F3H ;DI DB 0FBH ;EI DB 76H ;HALT ; TABN2: DB 67H ;RRD DB 6FH ;RLD DB 0A0H ;LDI DB 0A1H ;CPI DB 0A2H ;IND DB 0A3H ;OUTI DB 0A8H ;LDD DB 0A9H ;CPD DB 0AAH ;IND DB 0ABH ;OUTD DB 0B0H ;LDIR DB 0B1H ;CPRI DB 0B2H ;INIR DB 0B3H ;OTIR DB 0B8H ;LDDR DB 0B9H ;CPDR DB 0BAH ;INDR DB 0BBH ;OTDR DB 44H ;NEG DB 45H ;RETN DB 4DH ;RETI ; ;PRIMARY FINDER TABLE ; TABDFD: DB 00H,22H,36H;DD/FD 36 LD DB 00H,18H,66H;FD 66 LD H,(IY+00) DB 00H,18H,6EH;FD 6E LD L,(IY+00) DB 00H,19H,74H;FD 74 LD (IY+00),H DB 00H,19H,75H;FD 75 LD (IY+00),L ; TABPRI: DB 01H,00H,08H;08 EX AF,AF' DB 02H,01H,10H;10 DJNZ DB 16H,01H,18H;18 JR DB 96H,03H,38H;20 JR NZ,XXXX 16+80 DB 40H,04H,31H;01 LD BC,XX 00+40 DB 4DH,05H,39H;09 ADD HL,BC 0D+40 DB 80H,06H,3AH;02 LD ??? 00+80 DB 47H,07H,33H;03 INC BC 07+40 DB 48H,08H,3BH;0B DEC BC 08+40 DB 87H,09H,3CH;04 INC B 07+80 DB 88H,0AH,3DH;05 DEC B 08+80 DB 80H,1BH,3EH;06 LD B,XX 00+80 DB 84H,0BH,0F8H;C0 RET NZ 04+40 DB 0C0H,14H,7FH;40 LD B,B DB 46H,0CH,0F1H;C1 POP BC 06+40 DB 09H,0DH,0E9H;E9 JP (HL) DB 00H,0EH,0F9H;F9 LD SP,HL DB 89H,0FH,0FAH;C2 JP NZ,XXXX 09+80 DB 09H,02H,0C3H;C3 JP DB 0AH,11H,0D3H;D3 OUT DB 0BH,10H,0DBH;DB IN A,XX DB 01H,12H,0E3H;EX SP,HL PROCESS ? F9 DB 01H,13H,0EBH;EB EX DE,HL DB 83H,0FH,0FCH;C4 CALL NZ,XXXX 03+80 DB 45H,0CH,0F5H;C5 PUSH BC 05+40 DB 03H,02H,0CDH;CALL XXXX DB 8CH,15H,0FFH;RST 00 0C+80 DB 0FFH ;END OF TABLE ; ;PRIMARY FINDER ED TABLE ; TABED: DB 8BH,16H,78H;ED 40 IN B,(C) DB 8AH,17H,79H;ED 41 OUT (C),B DB 50H,05H,72H;ED 52 SBC HL,BC DB 4EH,05H,7AH;ED 4A ADC HL,BC DB 40H,1CH,73H;ED 43 LD (XXXX),BC DB 40H,1DH,7BH;ED 4B LD BC,(XXXX) DB 95H,1EH,7EH;ED 46 IM 0 DB 00H,1FH,47H;ED 47 LD I,A DB 00H,21H,4FH;ED 4F LD A,I DB 00H,20H,57H;ED 57 LD R,A DB 00H,1AH,5FH;ED 5F LD A,R DB 0FFH ;END OF TABLE ; PCOMD: PUSH DE LD D,0 ;GET ZERO IN D REG. LD B,87H ;SET NO REPOT 7 SP. LD A,(IX+01) ;GET PROCESS IN ACC. ADD A LD E,A ;GET OFFSET IN E LD HL,PRCOMD ;GET START OF TABLE ADD HL,DE ;GET TABLE POSITION LD E,(HL) ;GET LOW BYTE INC HL LD D,(HL) ;GET HIGH BYTE EX DE,HL ;GET JP ADR IN HL POP DE ;RETREIVE DATA JP (HL) ; PRCOMD: DW P00 ;00 08 EX AF,AF' DW P01 ;01 10 DJNZ DW P01 ;01 C3 CD [JP CALL] DW P03 ;03 20 JR COND DW P04 ;04 21 LD HL,XXXX DW P05 ;05 09 ADD HL,BC+ DW P06 ;06 2A ???,??? DW P07 ;07 23 INC ?? DW P07 ;08 2B DEC ?? DW P09 ;09 2C INC ? DW P09 ;0A 35 DEC ? DW P0B ;0B F0 RET COND DW P25 ;0C E5 PUSH ?? DW P0D ;0D JP (??) DW P0E ;0E LD SP,?? DW P0F ;0F F2 JP COND DW P10 ;10 DB IN A,XX DW P11 ;D3 OUT XX,A DW P12 ;12 E3 (SP),?? DW P13 ;13 EB EX DE,HL DW P14 ;14 40 LD ?,? DW P15 ;15 FF RST DW P16 ;16 ED 78 IN ?,(C) DW P17 ;17 ED 79 OUT (C),? DW P18 ;18 ?? 6E:66 LD ?,(IX+??) DW P19 ;19 ?? 74:75 LD ?,(IX,??) DW P1A ;1A ED 5A LD A,R DW P1B ;1B LD ?,XX DW P1C ;1C ED 43 LD (XXXX),BC DW P1D ;1D ED 4B LD BC(XXXX) DW P1E ;1E ED46 IM ? DW P1F ;1F ED 47 LD I,A DW P20 ;20 ED 4F LD A,I DW P21 ;21 ED 57 LD R,A DW P22 ;22 DD 35 LD (IX+?),XX ; ;OUTPUTING MESSAGE FINDER ; ;C REGISTER CONTAINS MESSAGE NUMBER ;B REGISTER CONTAINS THE REPOT VALUE ;HL REGISTER CONTAINS THE START ADDRESS ;OF THE MESSAGE BLOCK ; MSGFND: INC C DEC C JR Z,MSGOUT ;READY FOR MSG JR TEST0 ADV: INC HL TEST0: LD A,(HL) ;GET CHAR IN A AND A JP P,ADV ;NOT AT END INC HL DEC C JR Z,MSGOUT JR TEST0 ; ;THIS MESSAGE OUT ROUTINE EXCEPTS ;UPPER CASE LETTERS AND ALL OTHER ;CHARACTERS WHICH DO NOT USE THE ;5 BIT. CHARACTERS CONTAINING ;THE 5 BIT ARE TOKINS AND CAN BE ;SET TO CHANGE THE OUTPUT ; MSGOUT: LD A,(HL) PUSH AF AND 7FH BIT 5,A ;TEST FOR TOKEN JR NZ,TOKTST ;JP TO TEST TOKEN NOTOKE: CALL OUTPUT DEC B TOKRET: POP AF ;RETREIVE AF INC HL AND A RET M JR MSGOUT ; ;ADDITIONAL TOKENS WILL BE ADDED LATER ; TOKTST: BIT 6,A ;IF HIGH TOKEN JR Z,NOTOKE ;NUMBER OR SPACE CP 61H JR Z,HEXOT1 CP 62H JR Z,ADOUT2 CP 63H JR Z,TOK3 ;HL,IX,IY CP 64H JR Z,TOK4 ;(HL),(IX+XX),(IY+XX) CP 65H JR Z,TOK5 ;H X Y CP 66H JR Z,TOK6 ;L X' Y' CP 67H ;TEST FOR NO OUTPUT JR Z,TOKRET ;NO OUTPUT JP ERR1 ; TOK4: PUSH HL ;SAVE ADR LD HL,TOK4B ;(IX+XX) BIT 0,E ;TEST FOR DD JR NZ,TOKOUT BIT 1,E ;TEST FOR ED LD HL,TOK4C ;(IY+XX) JR NZ,TOKOUT LD HL,TOK4A ;(HL) TOKOUT: CALL MSGOUT POP HL ;RETREIVE MSG ADR JR TOKRET ; TOK3: PUSH HL ;SAVE ADR LD HL,TOK3B ;IX BIT 0,E ;TEST FOR DD JR NZ,TOKOUT LD HL,TOK3C ;IY BIT 1,E ;TEST FOR FD JR NZ,TOKOUT LD HL,TOK3A ;HL JR TOKOUT ; TOK5: PUSH HL ;SAVE ADR LD HL,TOK5B ;X BIT 0,E ;TEST FOR DD JR NZ,TOKOUT LD HL,TOK5C ;Y BIT 1,E ;TEST FOR FD JR NZ,TOKOUT LD HL,TOK5A ;H JR TOKOUT ; TOK6: PUSH HL ;SAVE ADR LD HL,TOK6B ;;X' BIT 0,E ;TEST FOR DD JR NZ,TOKOUT LD HL,TOK6C ;Y' BIT 1,E ;TEST FOR FD JR NZ,TOKOUT LD HL,TOK6A ;L JR TOKOUT ; HEXOT1: LD A,(IY+01) CALL HEXOUT JP TOKRET ; ADOUT2: PUSH HL ;SAVE MSG ADR LD HL,(SM0ADR);GET ADR CALL ADOUT POP HL RES 7,B ;SET FOR REPOT JP TOKRET ; ;ROTATOR ROUTINE ;HL CONTAINS MESSAGE ADR. ; AND30: LD A,D ;GET CTRL RES 6,A ;ZERO 6 BIT RRCA ;GET DATA IN PROP POS JR AND38A AND38: LD A,D ;GET CTRL AND38A: RRCA RRCA RRCA JR AND07A AND07: LD A,D AND07A: AND 07H ;STRIP UPPER BITS LD C,A ;GET DATA IN C REG. CALL MSGFND RET ; ; ;ARGUMENT PROCESSES ; P00: LD HL,PT00 ;ROCESS 00 JP MSGOUT ; P01: LD HL,PT01 ;PROCESS 01 JP MSGOUT ; ; P10: LD HL,PT10 ;PROCESS 10 JP MSGOUT ; P11: LD HL,PT11 ;PROCESS 11 JP MSGOUT ; P13: LD HL,PT13 ;PROCESS 13 JP MSGOUT ; P0D: LD HL,PT0D ;(HL) JP MSGOUT ; P0E: LD HL,PT0E ;SP,HL IX IY JP MSGOUT P15: LD A,D ;GET CTRL AND 38H ;CONVERT TO RST NO. JP HEXOUT ; P12: LD HL,PT12 ;(SP),HL IX IY JP MSGOUT ; P1A: LD HL,PT1A ;A,R JP MSGOUT ; P1F: LD HL,PT1F ;I,A JP MSGOUT ; P20: LD HL,PT20 ;A,I JP MSGOUT ; P21: LD HL,PT21 ;R,A JP MSGOUT ; P05: LD HL,PT5A ;HL, CALL MSGOUT ;OUTPUT HL, LD HL,PT5B ;BC,DE ?? SP JR AND30 ;FIND AND OUTPUT ; P03: LD A,D ;GET CTRL IN A SUB 20H ;ADJ FOR ROT LD HL,PT0F ;GET TABLE IN HL CALL AND38A ;N0 LD A P03A: LD HL,PT03 ;,XXXX JP MSGOUT ; P0B: LD HL,PT0F ;CONDITIONALS JR AND38 ;OUTPUT ; P0F: LD HL,PT0F ;CONDITIONALS CALL AND38 ;OUTPUT CONDITIONALS JR P03A ; P04: LD HL,PT5B ;BC DE ?? CALL AND30 ;OUTPUG REG. JR P03A ;OUTPUT ,XXXX ; P07: LD HL,PT5B ;BC DE ?? SP JP AND30 ;OUTPUT REG. ; P09: LD HL,PT14 ;B C D E ?? JP AND38 ;OUTPUT IT ; P1B: LD HL,PT14 ;B C D E ? ? CALL AND38 ;OUTPUT REG LD HL,PT1B ;,XX JP MSGOUT ; P14: LD HL,PT14 ;B C D E ? CALL AND38 ;OUTPUT IT LD HL,OUTXXX ;, CALL MSGOUT ;OUT , LD HL,PT14 ;B C D E ? ? JP AND07 ;OUTPUT ; P23B: LD B,06H ;SET FOR REPOT LD HL,TABMN4 ;ADD ADC SUB CALL AND38 ;OUTPUT MNEMONIC CALL RSPACE ;SET FOR SIX SPACES LD B,8AH ;SET FOR KNOW REPOT LD HL,PT22 ;TABLE OF PREFIXES CALL AND38 ;OUTPUT PREFIXES RET ;RETURN TO CALLER ; P23: CALL P23B ;SAVE MEMORY LD HL,PT14 ;B C D E ? ? JP AND07 ;OUTPUT REG ; P24: CALL P23B ;SAVE MEMORY LD HL,PT1B+1 ;XX JP MSGOUT ;OUTPUT XX ; P16: LD HL,PT16B ;H L ? A CALL AND38 ;OUTPUT REG LD HL,PT16A ;,(C) JP MSGOUT ;OUTPUT ,(C) ; P17: LD HL,PT16A+1;(C) CALL MSGOUT LD HL,OUTXXX ;, CALL MSGOUT ;OUT , LD HL,PT16B ;H L ? A JP AND38 ;OUTPUT REG. ; P1C: LD HL,PT06B ;(XXXX) CALL MSGOUT LD HL,OUTXXX ;, CALL MSGOUT LD HL,PT5B ;BC DE ?? HL JP AND30 ; P1D: LD HL,PT5B ;BC DE ?? SP CALL AND30 LD HL,PT06A ;,(XXXX) JP MSGOUT ; P1E: LD HL,PT1E ;0 ? JP AND38 ; P18: LD HL,PT23 ;B C D E H CALL AND38 LD HL,OUTXXX ;, CALL MSGOUT LD HL,PT14 ;B C D E ? ? JP AND07 ; P19: LD HL,PT14 ;B C D E ? ? CALL AND38 LD HL,OUTXXX ;, CALL MSGOUT LD HL,PT23 ;B C D E H L JP AND07 ; P22: LD HL,PT14 ;B C D E ? ? CALL AND38 INC IY LD HL,PT1B ;,XX JP MSGOUT ; P25: LD HL,PT25 ;BC DE ?? AF JP AND30 ;OUTPUT ; SUBCB: LD A,D ;GET CTRL IN ACUM. LD B,06H ;6 SPACES AND 0C0H ;STRIP LOWER BITS RRCA RRCA RRCA LD HL,TABCB ;-- BIT RES CALL AND38A ;OUTPUT REG. LD A,B ;GET REPOT NO IN A. CP 06H ;TEST FOR OUTPUT JR NZ,CRSPAC ;HEAD FOR REPOT LD HL,TABCB1 ;RLC, RRC, RL RR CALL AND38 ;OUTPUT ROTATE TYPE CRSPAC: CALL RSPACE ;OUT SPACES LD B,08AH ;NO RESPACE LD A,D ;GET CTRL AND 0C0H ;STRIP LOWER BITS CP 00H ;TEST FOR ROTATES RET Z ;NO BIT NO. LD HL,TBCB2 ;0, 1, 2, 3, CALL AND38 ;OUTPUT BIT NO. SCF ;SET CARRY FLAG RET ;RETURN TO CALLER ; PCB: LD D,(IY+01) ;GET CTRL IN D CALL SUBCB ;PRINT OUT MNEMONIC LD HL,PT23 ;B C D E H L JP AND07 ;OUTPUT REG ; PDFDCB: LD D,(IY+02) ;GET CTRL CALL SUBCB ;OUTPUT MNEMONIC JR C,DFDCB ;PROCESS BIT RES SET SUBCB1: LD HL,TCBDFD ;(IY+??):B JP AND07 ;OUTPUT ARGUMENT ; DFDCB: LD A,D ;GET CTRL AND A ;TEST FOR BIT JP M,SUBCB1 ;NOT BIT LD HL,TCBFDF ;(IY+??): JP AND07 ;OUTPUT ; P06: LD HL,PT06 ;???,??? JP AND38 ;OUTPUT ; ;OUTPUT MNEMONIC FOR NONPROCESS OPCODES ; PROC1: LD C,D ;GET CTRL IN C REG LD HL,TABMN1 LD B,86H ;SET FOR NO REPOT JP MSGFND ; ; PROC3: LD HL,TABMN3 ;GET TBL IN HL REG LD A,(IX+00) AND 3FH ;STRIP UPPER 2 BITS LD C,A ;GET CTRL IN C REG LD B,6 ;MAX OF 6 SPACES CALL MSGFND ;OUTPUT MNEMONIC CALL RSPACE JP PCOMD ; ;KNOW PROCESS ONE BYTE MNEMONIC ;DATA BYTE MNEMONIC MESSAGES ; TABMN1: DB 'NO',0D0H ;00 NOP DB 'RLC',0C1H;01 RLCA DB 'RRC',0C1H;02 RRCA DB 'RL',0C1H ;03 RLA DB 'RR',0C1H ;04 RRA DB 'DA',0C1H ;05 DAA DB 'CP',0CCH ;06 CPL DB 'SC',0C6H ;07 SCF DB 'CC',0C6H ;08 CCF DB 'RE',0D4H ;09 RET DB 'EX',0D8H ;0A EXX DB 'D',0C9H ;0B DI DB 'E',0C9H ;0C EI DB 'HAL',0D4H;0D HALT ; ;ED ONE BYTE MNOMICS ; TABMN2: DB 'RR',0C4H ;0E RRD DB 'RL',0C4H ;RLD DB 'LD',0C9H ;0FH LDI DB 'CP',0C9H ;10 CPI DB 'IN',0C9H ;11 INI DB 'OUT',0C9H;12 OUTI DB 'LD',0C4H ;13 LDD DB 'CP',0C4H ;14 CPD DB 'IN',0C4H ;15 IND DB 'OUT',0C4H;16 OUTD DB 'LDI',0D2H;17 LDIR DB 'CPI',0D2H;18 CPIR DB 'INI',0D2H;19 INIR DB 'OTI',0D2H;1A OTIR DB 'LDD',0D2H;1B LDDR DB 'CPD',0D2H;1C CPDR DB 'IND',0D2H;1D INDR DB '0TD',0D2H;1E OTDR DB 'NE',0C7H ;1F NEG DB 'RET',0CEH;20 RETN DB 'RET',0C9H;22 RETI END TABLE ; ;PROCESS MNEMONIC DATA BYTE MESSAGES ; TABMN3: DB 'L',0C4H ;00 LD DB 'E',0D8H ;01 EX DB 'DJN',0DAH;02 DJNZ DB 'CAL',0CCH;03 CALL DB 'RE',0D4H ;04 RET DB 'PUS',0C8H;05 PUSH DB 'PO',0D0H ;06 POP DB 'IN',0C3H ;07 INC DB 'DE',0C3H ;08 DEC DB 'J',0D0H ;09 JP DB 'OU',0D4H ;0A OUT DB 'I',0CEH ;0B IN DB 'RS',0D4H ;0C RST TABMN4: DB 'AD',0C4H ;OD ADD DB 'AD',0C3H ;0E ADC DB 'SU',0C2H ;0F SUB DB 'SB',0C3H ;10 SUB DB 'AN',0C4H ;11 AND DB 'XO',0D2H ;12 XOR DB 'O',0D2H ;13 OR DB 'C',0D0H ;14 CP DB 'I',0CDH ;15 IM DB 'J',0D2H ;16 JR END TABLE ; TOK3A: DB 'H',0CCH ;HL TOK3B: DB 'I',0D8H ;IY TOK3C: DB 'I',0D9H ;IY TOK4A: DB '(HL',0A9H;(HL) TOK4B: DB '(IX+',61H,0A9H;(IX+??) TOK4C: DB '(IY+',61H,0A9H;(IY+??) TOK5A: DB 0C8H ;H TOK5B: DB 0D8H ;X TOK5C: DB 0D9H ;Y TOK6A: DB 0CCH ;L TOK6B: DB 58H,0A7H ;X' TOK6C: DB 59H,0A7H ;Y' ; PT00: DB 'AF,AF',0A7H;AF,AF' PT01: DB 0E2H ;SM0ADR OUT PT10: DB 'A,',0E1H ;A,XX PT11: DB 61H,',',0C1H;XX,A PT13: DB 'DE,H',0CCH;DE,HL PT0D: DB 28H,63H,0A9H;(??) PT0E: DB 'SP,',0E3H;SP,?? PT12: DB '(SP),',0E3H;(SP),?? PT1A: DB 'A,',0D2H ;A,R PT1F: DB 'I,',0C1H ;I,A PT20: DB 'A,',0C9H ;I,A PT21: DB 'R,',0C1H ;R,A PT5A: DB 63H,0ACH ;??, PT5B: DB 42H,0C3H ;BC DB 44H,0C5H ;DE DB 0E3H ;?? DB 53H,0D0H ;SP PT03: DB 2CH,0E2H ;,XXXX PT0F: DB 4EH,0DAH ;NZ DB 0DAH ;Z DB 4EH,0C3H ;NC DB 0C3H ;C DB 50H,0CFH ;PO DB 50H,0C5H ;PE DB 0D0H ;P DB 0CDH ;M PT22: DB 41H,0ACH ;A, DB 41H,0ACH ;A, DB 0E7H ;NO OUTPUT DB 41H,0ACH ;A, DB 0E7H ;NO OUTPUT DB 0E7H ;DITO DB 0E7H ;DITO DB 0E7H ;DITO PT14: DB 0C2H,0C3H,0C4H,0C5H;B C D E DB 0E5H,0E6H,0E4H,0C1H;? ? ? A PT23: DB 0C2H,0C3H,0C4H,0C5H;B C D E DB 0C8H,0CCH ;H L DB 28H,48H,4CH,0A9H;(HL) DB 0C1H ;A OUTXXX: DB 0ACH ;, PT1B: DB 2CH,0E1H ;,XX PT06: DB '(BC),',0C1H;(BC),A DB 'A,(BC',0A9H;A,(BC) DB '(DE),',0C1H;(DE),A DB 'A,(DE',0A9H;A,(DE) DB 28H,62H ;(XXXX DB 29H,2CH,0E3H;),?? DB 63H ;?? PT06C: DB 2CH,28H,62H,0A9H;,(XXXX) DB 28H,62H,29H;(XXXX) DB 2CH,0C1H ;,A DB 41H ;A PT06A: DB 2CH ;USED BY P1D PT06B: DB 28H,62H,0A9H;(XXXX) USED BY P1C PT16A: DB 2CH,28H,43H,0A9H;,(C) PT16B: DB 0C2H,0C3H ;B C DB 0C4H,0C5H ;DE DB 0C8H,0CCH ;H L DB 0F8H,0C1H ;? A PT1E: DB 0B0H,0BFH ;0 ? DB 0B1H,0B2H ;1 2 DB 0BFH,0BFH ;? ? DB 0BFH ;? TBERR2: DB 0BFH ;? TABCB: DB 0E7H ;NO PROCESS DB 'BI',0D4H ;BIT DB 'RE',0D3H ;RES DB 'SE',0D4H ;SET TABCB1: DB 'RL',0C3H ;RLC DB 'RR',0C3H ;RRC DB 'R',0CCH ;RL DB 'R',0D2H ;RR DB 'SL',0C1H ;SLA DB 'SR',0C1H ;SRA DM 'SLL:' DB 'SR',0CCH ;SRL TCBDFD: DB 64H,3AH,0C2H;(IY+XX):B DB 64H,3AH,0C3H;:C DB 64H,3AH,0C4H;:D DB 64H,3AH,0C5H;:E DB 64H,3AH,0C8H;:H DB 64H,3AH,0CCH;:L DB 0E4H ;(IY+??) DB 64H,3AH,0C1H;:A TCBFDF: DB 64H,0BAH ;(IY+??): *B DB 64H,0BAH ;*C DB 64H,0BAH ;*D DB 64H,0BAH ;*E DB 64H,0BAH ;*H DB 64H,0BAH ;*C DB 0E4H ;(IY+??) DB 64H,0BAH ;*A TBCB2: DB 30H,0ACH ;0, DB 31H,0ACH ;1, DB 32H,0ACH ;2, DB 33H,0ACH ;3, DB 34H,0ACH ;4, DB 35H,0ACH ;5, DB 36H,0ACH ;6, DB 37H,0ACH ;7, PT25: DB 42H,0C3H ;BC DB 44H,0C5H ;DE DB 0E3H ;?? DB 41H,0C6H ;AF ;END TABLE ; ;SNOOPYS FAST TRACE ROUTINES ; BREAK3: LD A,(BUFAD+1) ;GET TYPE OF BREAK LD HL,TBYTE ;GET TBYTE FOR POINER CP 'C' JR Z,CMODE CP 'D' JR Z,DMODE CP 'G' JR Z,GMODE CP 31H ;TEST FOR RB NO.1 JR Z,BKLD1 ;SET UP REBRAKE 1 CP 32H ;TEST FOR NO. 2 JR Z,BKLD2 ;SET UP REBRAKE 2 CP 33H ;TEST FOR NO. 3 JR Z,BKLD3 ;SET UP REBRAKE 3 CP 34H ;TEST FOR NO. 4 JR Z,BKLD4 ;SET UP REBRAKE 4 JR BKSET ; CMODE: CALL MSG CALL OUTREG LD A,1 LD (RUN),A LD (RUN+1),A LD A,10 ;LINE LENGTH LD (LNLENG),A ;STORE LINE LENGTH JP CALCUL ; DMODE: CALL MSG CALL OUTREG JP GOOD ; GMODE: CALL MSG CALL OUTREG LD A,1 LD (RUN),A LD (RUN+1),A LD A,10 ;LINE LENGTH LD (LNLENG),A ;STORE LINE LENGTH LD HL,(HEXAD) ;GET NEW BREAK POINT JP REGLD ; BKLD1: LD A,(HL) ;GET BRAKE BYTE SET 0,A ;SET BRAKE BYTE CALL PGET ;STORE AND GET ADDRS LD (TBK1),HL ;STORE TEST ADDR. LD (BK1),DE ;STORE BREAK ADDR. NO 1 JR BSJ ;HEAD FOR INIT 1 ; BKLD2: LD A,(HL) SET 1,A CALL PGET LD (TBK2),HL LD (BK2),DE JR BSJ ; BKLD3: LD A,(HL) SET 2,A CALL PGET LD (TBK3),HL LD (BK3),DE JR BSJ ; BKLD4: LD A,(HL) SET 3,A CALL PGET LD (TBK4),HL LD (BK4),DE BSJ: JP INIT1 ; PGET: LD (HL),A ;STORE TBYTE LD HL,(HEXAD) ;GET TEST ADDR. LD DE,(HEXAD2) ;GET NEW BREAK ADR RET ; BKSET: XOR A ;GET A ZERO LD (HL),A ;SET UP FOR NO REBRAKES LD HL,(HEXAD) ;GET BRAKE ADR IN HL LD (BKADR),HL ;INITAL BREAK ADR. LD A,0C3H ;GET JP OPCODE IN ACCUM. LD (0038H),A ;PUT C3 AT 0038H LD DE,BKSAVE ;ADDRESS WHERE TO JP LD (0039H),DE ;RST 38 JP SAVE ROUT. LD (JMPADR),A ;PUT C3 AT JMPADR LD A,(HL) ;GET FIRST BYT OF OPCODE LD (OPSAVE),A ;SAVE BYT LD A,0FFH ;RST IN ACCUM LD (HL),A ;RST IN BREAK ADR LD A,10 ;NO OF BREAKS PER LINE LD (LNLENG),A ;STORE BK PER LINE LD A,1 ;INIT. LINES/COMM STOP LD (BKLENG),A ;STORE DATA XOR A ;ZERRO ACCUM LD HL,(HEXAD2) LD (PAGENO),HL INC A LD (BRKMSG),A ;STORE COUNT FOR BK MSG LD A,(BUFAD+1) ;GET CHAR CP 'A' ;TEST FOR ADDRESS MODE JR NZ,REGADR XOR A ;ZERO ACCUM LD (TYPE),A ; STORE TYPE INC A JR INIT2 ; REGADR: LD A,1 LD (TYPE),A INIT2: LD (RUN),A LD (RUN+1),A JP INIT1 ;COMPLETE ; ;SAVE REGISTERS. ; BKSAVE: LD (STKADR),HL ; SAVE HL 80A6H-807AH POP HL ;GET BK ADR ;1 IN HL DEC HL ;BK ADR IN HL LD (BKADR2),HL;SAVE TRUE BK ADR LD (STKAD2),SP ;SAVE FOREIGN STACK LD SP,STKADR ;GET NEW STACK PUSH AF ;AF 80A4H-80A5H PUSH BC ;BC 80A2H-80A3H PUSH DE ;DE 80A0H-80A1H PUSH IX ;IX 809EH-809FH PUSH IY ;IY 809CH-809DH LD A,I ;GET I REG IN ACCUM PUSH AF ;I REG 809BH EX AF,AF' ;AUX ACCUM ON TOP EXX ;AUX REGS ON TOP PUSH AF ;AF' 8098H-8099H PUSH BC ;BC' 8096H-8097H PUSH DE ;DE' 8094H-8095H PUSH HL ;HL' 8092H-8093H LD SP,STAK ;GET MAIN STACK LD DE,(BKADR2);GET BREAK ADR IN DE LD HL,(BKADR) ;GET INTENDED ADR LD (HERE),HL ;STORE FOR BYTES AND A ;CLEAR CARRY FLAG SBC HL,DE ;COMPARE JP NZ,ERR1 LD (JMPADR+1),DE;PROCESES BYTE LD A,(OPSAVE) ;GET REPACMENT FOR RST LD (DE),A ;REPLACE BYTE CALL BYTES ; ;THIS ROUTINE HANDELS OUTPUTING OF ;THE ADDRESS OR REGISTERS AND ;MNEMONICS WHICH ADDRESS ; LD A,(TYPE) ;GET TYPE IN ACCUM BIT 0,A ;TEST FOR TYPE JR NZ,REGS LD HL,(PAGENO) ;GET PAGE NO IN ACCUM LD A,(BRKMSG) ;TEST FOR LINE NO. BIT 0,A ;TEST IF 1 OR 0 JR Z,OUTLIN ;KNOW MSG LD A,'L' ;GET L IN ACCUM CALL OUTPUT ;OUTPUT THE L CALL ADOUT ;LINE NO INC HL ;INCREASE PAGE NO LD (PAGENO),HL;STORE PAGE NO. LD B,2 CALL RSPACE XOR A ;ZERO ACCUM LD (BRKMSG),A ;ZERO BK MSG OUTLIN: LD HL,(BKADR) ;GET BREAK ADR IN HL CALL ADOUT CALL SPACE LD HL,LNLENG ;GET LINE LENGTH IN (HL) DEC (HL) ;DEC NO. OF ADR IN LINE JP NZ,CALCUL ;CALC. NEXT INST. CALL CRLF LD A,0AH ;NO OF ADRS. PER LINE LD (LNLENG),A ;STORE LINE LENGTH LD A,1 LD (BRKMSG),A;RELOAD BREAK MSG JP CMAND ; ;THIS ROUTINE OUTPUTS REGISTERS AND ;THE MNEMONIS OF EACH BREAK INSTRUCTION ; REGS: LD A,(BRKMSG) ;GET INFO TO DETERMINE BIT 0,A ;WEATHER TO PRINT REG. JR Z,REGOUT CALL MSG JR REGOUT ; MSG: CALL BUFOT2 DW MSG9 XOR A LD (BRKMSG),A;ZERO BK MSG LD HL,(PAGENO);GET PAGE NO CALL ADOUT INC HL LD (PAGENO),HL;STORE NEW PAGE CALL CRLF RET ; REGOUT: CALL OUTREG JP CMAND ; OUTREG: LD HL,STKADR-2 ;GET ADR OF AF INC HL LD A,(HL) ;GET ACCUM IN ACCUM CALL HEXOUT ;OUT ACCUM CALL SPACE DEC HL LD A,(HL) ;GET FLAGS LD B,A ;GET FLAGS IN B REG LD A,'S' BIT 7,B ;TEST IF MINUS JR NZ,OUT1 LD A,'-' OUT1: CALL OUTPUT LD A,'Z' BIT 6,B ;TEST IF ZERO JR NZ,OUT2 LD A,'-' OUT2: CALL OUTPUT LD A,'V' BIT 2,B ;TEST PARITY JR NZ,OUT3 LD A,'-' OUT3: CALL OUTPUT LD A,'C' BIT 0,B ;TEST FOR CARRY JR NZ,OUT4 LD A,'-' OUT4: CALL OUTPUT CALL SPACE LD HL,(STKADR-4) ;GET BC IN HL CALL ADOUT ;OUT BC CALL SPACE LD HL,(STKADR-6) ;GET DE IN HL CALL ADOUT ; OUT DE CALL SPACE LD HL,(STKADR) ;GET HL IN HL CALL ADOUT ;OUT HL CALL SPACE CALL MOUT ;OUT MEMORY OUT CALL SPACE LD HL,(STKADR-8) ;GET IX IN HL CALL ADOUT CALL SPACE LD HL,(STKADR-10) ;GET IY IN HL REG. CALL ADOUT ; OUT IY CALL SPACE LD HL,(STKAD2) ; GET FOREIGN STK IN HL ; CALL ADOUT ;OUT STACK ADR CALL SPACE LD HL,(BKADR) ;GET BREAK ADR IN HL LD (DIHXAD),HL ;STORE AD FOR DISSEMB. CALL ADOUT ;OUTPUT BREAK ADR CALL SPACE CALL ZDISA ;CALL DISASSEMBLER CALL CRLF ;GET NEW LINE RET ; ;BREAK TRACE COMMAND ROUTINES ; CMAND: LD HL,RUN DEC (HL) JR Z,CMAND3 JR CALCUL ;KEEP GOING ; CMAND3: LD B,'?' ;COMMAND MODE PROMPT PUSH HL CALL VDM ;OUT PROMPT POP HL CMAND2: INC HL ;RUN1 LD DE,CMAND2+1;ADDRESS OF RET JP PUSH DE ;STORE RETURN JUMP CALL INPUT CP 1BH ;ESCAPE JP Z,GOOD CP ' ' JR Z,CONT1 ;CONTINUE NO MEG CP '/' JR Z,CONT2 ;CONTINUE MSG CP '1' ;SPEED 1 JR Z,SPEED1 CP '2' ;SPEED 2 JR Z,SPEED2 CP 1 ;ONE LINE JR Z,CTRLA CP 2 ;CTRL B 15 LINES JR Z,CTRLB CP 3 ; CTRL C 1 PAGE JR Z,CTRLC CP 4 ;CTRL D 7FH LINES JR Z,CTRLD CP 5 ;CTRL E FFH LINES JR Z,CTRLE RET SPEED1: LD A,0 JR SPEEDS SPEED2: LD A,2 SPEEDS: LD (SPEED),A RET ; CTRLA: LD A,1 LD (HL),A RET CTRLB: LD A,0EH LD (HL),A RET CTRLC: LD A,42H LD (HL),A RET CTRLD: LD A,7FH LD (HL),A RET CTRLE: LD A,0FFH LD (HL),A RET CONT1: LD A,(HL) DEC HL LD (HL),A JR CALCUL CONT2: LD A,1 LD (BRKMSG),A LD A,(HL) DEC HL LD (HL),A ; ;PART 4; CALCULATE WHERE NEXT BREAK ;SHOULD BE. ; CALCUL: LD HL,(BKADR) ;GET POSITION LD (HERE),HL ;STORE POSITION FOR BYTES LD A,(HL) ;GET CTRL BYTE IN ACCUM. LD B,A ;MOVE CTRL BYTE IN B REG LD A,(STKADR-2) ;GET FLAGS BIT 3,B ;TEST FOR 08H BIT HIGH JR NZ,FLGSTR CPL ;INVERT FLAGS FLGSTR: LD (FLAGS),A ;STORE FLAGS LD DE,REGLD ;LOAD FOR RETURN JUMP PUSH DE ;PUSH JUMP INTO STACK CALL BYTES ;GET OPCODE INFORMATION ; ;TEST FOR CALLS, JUMPS, RETURNS AND ( )JUMPS ; LD A,(IBUF) ;GET CTRL BIT 6,A ;TEST FOR JUMP REALITIVEES JR NZ,JMPREL BIT 5,A ;TEST FOR (IY)JUMP JR NZ,JUMPIY BIT 4,A ;TEST FOR (IX)JUMP JR NZ,JUMPIX ; ;THIS ROUTINE TESTS FOR 8080 JUMPS ;CALLS AND RETURNS ; LD HL,(BKADR); GET BREAK ADR. IN HL LD A,(HL) ;GET CONTROL IN ACCUM. AND 0C0H ;GET HIGH OCTAL DIGIT CP 0C0H JR Z,FRQART ;IN ACCUMULATOR ; ;THIS ROUTINE CALCULATES WHERE THE NEXT ;BYTE GOES USING INFORMATION FROM BYTES ; NXTBYT: LD A,(IBUF) ;GET CTRL AND 7 ;STRIP UNWANTED DATA LD B,A ;GET DATA IN B REG ADD1: INC HL DJNZ ADD1 ;INC TO B REG = 0 RET ; ;THIS ROUTINE TEST FOR CONDITIONAL CALLS ;JUMPS, RETURNS AND (HL) JUMPS ; FRQART: LD A,(HL) ;GET CONTROL IN ACCUM. CP 0C3H ;TEST FOR JUMP JR Z,COND CP 0CDH ;TEST FOR CALL JR Z,COND CP 0C9H ;TEST FOR RETURN JR Z,XRET CP 0E9H ;TEST FOR (HL)JUMP JR Z,XPCHL AND 07H ; STRIP UPPER 4 BITS CP 00H ;TEST FOR CONDITIONAL RET JR Z,CRET CP 04H ; TEST FOR COND. CALLS JR Z,TEST CP 02H ;TEST FOR COND. JUMPS JR Z,TEST LD A,(HL) ;GET CTRL OR 38H CP 0FFH ;TEST FOR RST JP Z,XRST ;RST PROCESS JR NXTBYT ;CALC. WHERE NEXT BYTE IS ; JUMPIY: LD HL,(STKADR-10) RET ; JUMPIX: LD HL,(STKADR-8) RET ; XPCHL: LD HL,(STKADR) RET ; COND: LD HL,(SM0ADR) ;WHAT THE HELL IS THIS RET ; XRET: CALL ADRRET ;GET ADDRES OF RET RET ; ADRRET: LD (SM0AD2),SP;SAVE WORK STACK LD SP,(STKAD2);GET FOREIGN STACK POP HL ;GET RETURN ADR IN H&L LD SP,(SM0AD2);RET WORK STACK RET ; CRET: CALL ADRRET LD (SM0ADR),HL;POKE RET ADR. LD HL,(BKADR);REPLACE BREAK ADR JR TEST ; JMPREL: LD HL,(BKADR) ;GET POSITION IN HL LD A,(HL) ;GET CONTROL IN ACCUM. CP 018H ;TEST FOR JUMP REALITIVE JR Z,COND CP 010H ;TEST FOR DJNZ JR Z,XDJNZ BIT 4,A ;TEST FOR JRZ JRNZ JR Z,XJRZ ; ;JUMP REALITIVE CARRY ROUTINE ; CALL NXTBYT ;GET NEX ADR IN HL REG LD A,(FLAGS) ; GET FLAGS IN ACCUM. BIT 0,A ;TEST FOR CARRY RET Z ;KNOW CARRY FLAG SET JR COND ; ;JUMP REALITIVE ZERO ROUTINE ; XJRZ: CALL NXTBYT LD A,(FLAGS) ;GET FLAGS IN ACCUM. BIT 6,A ;TEST FOR ZERO RET Z ;KNOW ZERO FLAG JR COND ; ;DJNZ TEST ROUTINE ; XDJNZ: CALL NXTBYT ;GET ADR OF NEXT INS LD A,(STKADR-3);GET B IN A REG DEC A RET Z JR COND ; ;TEST FOR WHICH CONDITION: CARRY, ZERO ;PARITY, AND SIGN ; TEST: CALL NXTBYT LD DE,(BKADR) LD A,(DE) ;GET CONTROL BYTe AND 0F0H ;STRIP LOWER 4 BITS CP 0C0H ;TEST FOR ZEROS JR Z,XZERO CP 0D0H ;TEST FOR CARRYS JR Z,XCARRY CP 0E0H ;TEST FOR PARITY JR Z,XPARIT ; ;TEST FOR SIGN ; LD A,(FLAGS) ;GET FLAGS IN ACCUM. BIT 7,A ;TEST FOR SIGN RET Z JR COND ; ;TEST FOR ZERO CONDITION ; XZERO: LD A,(FLAGS) ;GET FLAGS IN ACCUM BIT 6,A ;TEST FOR ZERO RET Z JR COND ; ;TEST FOR CARRY CONDITION'S ; XCARRY: LD A,(FLAGS) BIT 0,A ;TEST FOR CARRY RET Z JR COND ; ;TEST FOR PARITY CONDITIONS ; XPARIT: LD A,(FLAGS) BIT 2,A ;TEST FOR PARITY FLAG RET Z JP COND ; XRST: LD A,(HL) ;GET CTRL AND 38H ;CONVERT TO RST CP 38H ;TEST FOR RST 38 JP Z,ERR1 ;RST 38 WON'T WORK LD L,A ;GET RST IN L REG LD H,0 ;ZERO IN H REG RET ; ;PART 4: LOAD REGISTORS AND EXECUTE ONE BYTE ; ;THIS ROUTINE RECIEVES THE NEXT BREAK ;IN H & L REGISTER AND IS ACCESSED BY ;A RETURN JUMP PLACED IN THE STACK ;AT THE BEGINING OF PART 4 ; ;TEST FOR REBRAKE ; REGLD: LD A,H ;GET HIGH BIT IN A OR A ;TEST FOR 00 JR NZ,REGLD2 ;NO RST PROBLEMS LD A,L ;GET LOWER BYTE IN A ADD 0C6H ;ADD TEST FACTOR JP Z,ERR1 ;NO NO INC A ;NEXT TEST JP Z,ERR1 ;NO NO INC A ;LAST TEST JP Z,ERR1 ;NO NO ; ;TEST FOR REBRAKE ; REGLD2: LD (BKBYT),HL ;SAVE BREAK BYTE EX DE,HL ;SAVE BREAK ADDR. LD A,(TBYTE) ;GET TEST BYTE BIT 0,A ;TEST IF SET UP JR Z,TSX2 ;NOT THIS REBRAKE OR A ;GET RID OF CARRY FLAG LD HL,(TBK1) ;TEST BYTE NO. 1 SBC HL,DE ;TEST JR NZ,TSX2 ;NO REBRAKE LD HL,(BK1) ;GET NEW BREAK POINT JR BKMSG ;SETUP FOR NEW BRAKE ; TSX2: BIT 1,A ;TEST IF SETUP JR Z,TSX3 ;NOT SET UP OR A ;CLEAR CARRY FLAG LD HL,(TBK2) ;TEST BRAKE NO. 2 SBC HL,DE ;TEST JR NZ,TSX3 ;NO REBRAKE LD HL,(BK2) ;GET NEW BRAKE JR BKMSG ; TSX3: BIT 2,A ;TEST IF SET UP JR Z,TSX4 ;NOT SET UP OR A ;CLEAR CARRY FLAG LD HL,(TBK3) ;TEST BRAKE NO. 3 SBC HL,DE ;TEST JR NZ,TSX4 ;NO REBRAKE LD HL,(BK3) ;NEW BREAK POINT JR BKMSG ; TSX4: BIT 3,A ;TEST IF SETUP JR Z,REGLD0 ;NO BREAK POINT OR A ;CLEAR CARRY FLAG LD HL,(TBK4) ;GET TEST BRAKE NO. 4 SBC HL,DE ;TEST JR NZ,REGLD0 ;NO REBRAKE LD HL,(BK4) ;NEW BREAK POINT ; BKMSG: LD (BKBYT),HL ;STORE NEW BREAK POINT CALL CRLF CALL BUFOT2 DW BKMSG2 CALL CRLF ; REGLD0: LD HL,(BKBYT) ;GET NEW BREAK BYTE LD A,(OUTBYT) ;GET INOUT BYTE BIT 1,A ;TEST FOR LIST JR Z,NLIST ;NO LIST ; REGLD3: IN A,3 ;GET STATIS AND 1 JR Z,REGLD3 IN A,3 AND 20H JR NZ,REGLD3 ; NLIST: LD A,(HL) ;GET NEXT OPCODE LD (OPSAVE),A ;SAVE NEXT OP CODE LD A,0FFH ;LOAD RESTART OPCODE LD (HL),A ;POKE RST IN MEM. LD (BKADR),HL ;SAVE ADDRES OF BREAK LD SP,STKADR-20 POP HL POP DE POP BC POP AF EX AF,AF' EXX POP AF LD I,A POP IY POP IX POP DE POP BC POP AF POP HL LD SP,(STKAD2) ;GET ORIGNAL STACK JP JMPADR ;GET READY FOR NEXT BYTE ; MSG9: DB 'A FLAG B C D E H L M IX IY SP PC' DB ' PAGE # ',0A0H BKMSG2: DM 'REBRAKE' TABSTA: NOP ;START OF CROSS REF TAB. NOP IX IY SP PC' DB ' PAGE # ',0A0H BKMSG2: DM 'REBRAKE' TABSTA: NOP ;START OF CROSS REF TAB. NOP