; ;SNOOPY MONITOR RAM VERSION ;VERSION 1.1 ;WRITTEN BY RALPH E. BUCKNAM ;COPYRITE (C) 1979 ;ALL RIGHTS RESERVED ; ;EQUATE TABLE ; RAM: EQU 0A33FH ; CASS: EQU 6EH CASD: EQU 6FH ; TABSTA: EQU RAM-0CFFH BUFAD: EQU RAM-0A1H STAK: EQU BUFAD STKADR: EQU RAM-69H BRKAD2: EQU RAM-67H HERE4: EQU RAM-65H NXTNO: EQU RAM-63H NXTSM0: EQU RAM-61H RUN: EQU RAM-5FH JMPADR: EQU RAM-5DH TBYTE: EQU RUN-5AH BKBYT: EQU RAM-58H TBK1: EQU RAM-56H BK1: EQU RAM-54H TBK2: EQU RAM-52H BK2: EQU RAM-50H TBK3: EQU RAM-4EH BK3: EQU RAM-4CH TBK4: EQU RAM-4AH BK4: EQU RAM-48H HEREX: EQU RAM-46H SM0ADR: EQU RAM-44H OPSAVE: EQU RAM-42H STKAD2: EQU RAM-40H PAGENO: EQU RAM-3EH BKADR: EQU RAM-3CH BKADR2: EQU RAM-3AH SM0AD2: EQU RAM-38H HERE: EQU RAM-36H IBUF: EQU RAM-34H LNLENG: EQU RAM-33H BKLENG: EQU RAM-32H FLAGS: EQU RAM-31H TYPE: EQU RAM-30H OFSET: EQU RAM-2FH HEXAD: EQU RAM-2DH HEXAD2: EQU RAM-2BH HEXAD3: EQU RAM-29H HEXAD4: EQU RAM-27H STACK2: EQU RAM-0FH SAVESP: EQU STACK2 PGBUF: EQU RAM-0DH BRKMSG: EQU RAM-0AH VDMBF: EQU RAM-09H VDMBF2: EQU RAM-07H SPEED: EQU RAM-05H MODE: EQU RAM-03H IOBYT: EQU RAM-02H INIBF: EQU RAM-1H VDMBA: EQU 0CC00H ; JR START INIT1: JR INIT1A ;JUMP TO INIT1 ROUTINE START: LD SP,STAK LD HL,INIBF ;CHECK FOR INIT. LD A,55H ;INIT BYTE CP (HL) ;FIRST INIT CHECK JR NZ,INIT0 ;NOT INITLIZED CPL ;COMPLEMENT ACCUM INC HL ;NEXT CHEK POINT CP (HL) ;SECOND CHECK FOR INIT. JR Z,INIT1A ;INITILIZED INIT0: LD HL,0AA55H ;INIT. BYTES LD (INIBF),HL ;STORE INIT BYTES ; INIT2: CALL IOINT ;INIT. IN OUT BOARD XOR A LD (IOBYT),A LD (PGBUF+1),A INC A LD (BRKMSG),A ;SET BREAK MSG FLAG INC A LD (SPEED),A LD A,13H ;CONTROL S CALL OUTPUT ;CLEAR SCREEN CALL BUFOUT ;SEND MSG1 DW MSG1 INIT1A: LD SP,STAK LD HL,0 LD (OFSET),HL CALL BUFOUT DW MSG2 ;PROMPT IS * ; ;BUFFER INPUT ROUTINE ;ACCEPS UP TO 15 CHARACTERS. ; INBUF: LD HL,BUFAD LD B,18 INB1: CALL INPUT CALL OUTPUT CALL FORCE ;MAKE UPPER CASE CP 14H ;TEST FOR CTRL T JR Z,INB1 ;NO EFFECT IF CTRL T CP 5FH ;BACKSPACE JR Z,DELETE ;GO BACKSPACE CP 7FH ;TEST FOR DELETE 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. LD BC,0 LD C,A ADD HL,BC ADD HL,BC LD A,(HL) INC HL LD H,(HL) LD L,A LD DE,GOOD PUSH DE ;PUSH GOOD IN STACK JP (HL) ; ;COMMAND LIST ; CLIST: DW ERR1 ;A DW BREAK ;B BREAK TRACE DW CHOP ;C LIST & VDM DW DPHEX ;D DW ENTER ;E DW ERR1 ;F FLOOPY DW GO ;G DW ERR1 ;H DW INIT2 ;I INITIATION DW JRCALC ;J JR CALCULATOR DW PASS.2 ;K DW ERR1 ;L DW MOVE ;M MOVE DW ERR1 ;N DW ERR1 ;O DW PROM ;P PROGRAM PROMS DW MARG ;Q DW TREAD ;R READ DW SERCH ;S SEARCH DW MTEST ;T TEST MEMORY DW ERR1 ;U DW VMEM ;VERFIY MEMORY DW TWRITE ;W WRITE FROM MAG TAPES DW ERR1 ;X DW ERR1 ;Y DW ZERO ;Z ZERO MEMORY ; FORCE: CP 61H RET C CP 7BH RET NC SUB 20H 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 LD (OFSET),HL ;STORE OFSET RET ; ;THE CHOP ROUTINE SETS THE OUTBYT ;FOR OUTPUT TO VDM AND LIST DEVICE ; CHOP: LD A,2 LD (IOBYT),A ;STORE 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: DB 0AAH ;* 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,CH1 ADD 7 ;CHANG TO A-F CH1: 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 14H ;IS IT A CTRL T JR Z,HEXTT CALL FORCE ;MAKE UPPER CASE CP 5FH ;IS IT BACKSPACE ? RET Z ;YEP CP 7FH ;TEST FOR DELETE RET Z ;YES 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 DE,(HEXAD2);GET END ADR. LD HL,(HEXAD);GET START ADR LD A,(BUFAD+1) ;LOOK AT BUF. CP 'S' ;TEST FOR SYMBOLIC JP Z,ZDISAC ;DISASSEMBLE LD C,0 ;ZERO TEST BYTE REG. CP 'A' ;TEST FOR ASCII JR NZ,DPHEX1 ;DONOT SET FLAGS SET 0,C ;SET ASCII FLAG ; DPHEX1: PUSH BC ;PUSH DUMP TYPE PUSH HL EXX ;FLIP POP HL ;ADR IN PROPER POS POP BC ;RETREVE DUMP TYPE ; LD A,L AND 0FH ;STRIP OFF UPPER BITS INC A DEC A ;TEST FOR ZERO JR Z,DPHEX2 ;NO ADJUSTING REQ. ; LD B,A ;GET ADJ FACT IN B ZERHEX: DEC HL DJNZ ZERHEX ;REPEAT TILL ZERO ; DPHEX2: CALL MSTEST ;TEST FOR MESSAGE JR NOMSG ;GO TO WORK ; MSTEST: LD A,(BRKMSG) ;GET MSG BYTE BIT 0,A ;TEST FOR MSG RET Z ;NO MESSAGE NOP ;SPARE BYTE IF NEEDED PUSH BC PUSH HL CALL BUFOT2 ;OUTPUT MSG DW HEXMSG ;MESSAGE ADR. CALL CRLF ;GET NEW LINE POP HL POP BC XOR A ;ZERRO ACCUM LD (BRKMSG),A ;RESET MSG COUNTER RET ; NOMSG: CALL OFFADR ;OUTPUT ADDRESS CALL SPACE PUSH HL POP DE ;TRANSER COMPLEAT ; CALL OUTHEX ;OPUT 8 HEX BYTES CALL OUTHEX ;OPUT 8 HEX BYTES BIT 0,C ;TEST FOR ASCII JR Z,PASEND ;NO ASCII ; PUSH DE POP HL ;TRRANSFER COMPLETE CALL CRLF ;GET NEW LINE CALL MSTEST ;TEST FOR MSG LD B,4 ;SET FOR 2 SPACES CALL RSPACE ;OUT SPACES CALL OUTASC ;OUTPUT 8 ASCII BYTES CALL SPACE CALL OUTASC ;OUTPUT 8 ASCII BYTES CALL CRLF ;GET A CLEAN LINE ; PASEND: PUSH HL EXX ;GET BACK REGS POP HL ;PRESENT ADR AND A ;CLEAR CARRY FLAG SBC HL,DE ;MAKE END CALC. JP NC,GOOD ;FINISHED ? EXX ;GET FRONT REGS CALL CRLF ;GET NEW LINE JR DPHEX2 ;KEEP GOING ; OUTHEX: CALL SPACE LD B,8 ;8 HEX OUTPUTS HEX: LD A,(HL) CALL HEXOUT ;OUTPUT HEX BYTE PUSH BC CALL SPACE POP BC ;RETREIVE DATA INC HL DJNZ HEX ;KEEP GOING RET ; OUTASC: LD B,8 ASCII: PUSH BC ;SAVE FLAGS LD B,2 ;SET FOR 2 SPACES CALL RSPACE ;OUT SPACES POP BC ;RETREIVE FLAGS LD A,(HL) ;GET BYTE CALL CANCL ;CHECK FOR ASCII CALL OUTPUT INC HL ;ADVANCE COUNTER DJNZ ASCII RET ; CANCL: CP 20H ;LETER CHECK JR C,CNCL1 ;NO LETER CP 5FH ;TEST FOR BACK SPACE JR Z,CNCL1 CP 7EH RET C ; CNCL1: LD A,'.' ;SET TO OUTPUT (.) RET ; HEXMSG: DB ' 0 1 2 3 4 5 6 7 ' DB ' 8 9 A B C D E ',0C6H ; ;ZERO ROUTINE -- ZERO A BLOCK OF MEMORY ;WITH SELECTED FILL ; ZERO: LD HL,INIT1 PUSH HL ;SET UP RETURN ZERO3: LD A,(HEXAD3) ;GET FILL LD B,A ZERO1: CALL ZBLOK ZERO2: LD (HL),B ;FILL BLOCK INC HL DEC DE LD A,E OR D ;CHECK FOR END JR NZ,ZERO2 ZBLOK: LD DE,(HEXAD4) ;GET BLKLN LD HL,(HEXAD) ;AND START RET ; MTEST: CALL ZERO3 ;MEMORY TEST DB 0C4H ;SKIP 3 BYTES TWR1: DEC (HL) INC HL ;NEXT TRW: LD A,B CP (HL) ;TEST CALL NZ,ZERR DEC DE LD A,E ;END CHECK OR D ;END CHECK JR NZ,TWR1 ;KEEP GOING ; DEC (HL) ;GET THE LAST ONE CALL ZBLOK ;SET UP AGAIN CALL MSTRS ;CHECK FOR ESCAPE DEC B ;NEXT CHAR JR NZ,TRW JP INIT1 ZERR: CALL BUFOUT DW MSGA CALL ADOUT CALL BUFOT2 DW MSGB CALL MOUT CALL BUFOT2 DW MSGC LD A,B JP HEXOUT MSGA: DB 'ERROR AT:',0A0H MSGB: DB ' IS',0A0H MSGC: DB ' SHOULD BE',0A0H ; ;READ MAGNETIC TAPES ; TREAD: 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 ; MSTRS: CALL STATUS ;CHECK IF KEY PRESS CP 0FFH ;TEST FOR KEYPRESS RET NZ ;NO KEY PRESS CALL INPUT ;GET DATA CP 1BH ;TEST FOR ESCAPE JP Z,INIT1 RET ; TWRITE: 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 D 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 ; MOVE: CALL LDREG CALL MOVER JR VMEM2 ; PROM: CALL LDREG LD A,64H M.MOVES CALL MOVER DEC A JR NZ,M.MOVES ; VMEM: CALL LDREG VMEM2: LD A,(DE) CPI JR Z,NO.ERR ; ;OUTPUT ERROR INFORMATION ; PUSH AF PUSH HL PUSH DE PUSH BC DEC HL CALL ADOUT LD B,2 CALL RSPACE CALL MOUT LD B,4 CALL RSPACE EX DE,HL CALL ADOUT LD B,2 CALL RSPACE CALL MOUT CALL CRLF POP BC POP DE POP HL POP AF ; NO.ERR: INC DE RET PO JR VMEM2 ;NEXT CHECK ; MOVER: PUSH HL PUSH DE PUSH BC LDIR POP BC POP DE POP HL RET ; ;SEARCH WITH SYMBOLIC DUMP ; SERCH: LD A,8 ;NUMBER OF DUMPS PER LINE LD (LNLENG),A ;STORE LINE LENGTH LD HL,BUFAD+2;SET UP STRING CALL BUFOUT DW MSGS1 ;MSG 1 OF SEARCH CALL ENTR1 ;ENTER DATA LD DE,BUFAD+2 LD A,L ;CALCULATE STRING SUB E ;LENGTH INC A LD C,A ;STORE STRING LD B,A ;LENGTH CALL BUFOUT DW MSGS2 ;MSG 2 OF SEARCH LD HL,BUFAD+2 SERT1: CALL MOUT PUSH BC ;SAVE STRING LENGTH CALL SPACE POP BC INC HL DEC C JR NZ,SERT1 ;OUTPUT INTIRE STRING LD C,B ;IT IS READY AGIN CALL BUFOUT DW MSGS3 ;MSG 3 OF SEARCH CALL CRLF ;GET NEW LINE CALL CRLF LD HL,(HEXAD) SER1: LD DE,BUFAD+2 LD C,B ;READY AGAIN PUSH HL SER2: LD A,(DE) CP (HL) INC DE INC HL JR NZ,SER3 DEC C JR NZ,SER2 POP HL CALL SEROUT ;SEARCH OUTPUT ROUTINE PUSH HL SER3: POP HL INC HL CALL ENDCHK JP Z,GOOD JR SER1 MSGS1: DB 'ENTER SEARCH STRING IN HE',0D8H MSGS2: DB '--->',0A0H MSGS3: DB 'IS LOCATED AT',0BAH ; SEROUT: PUSH HL EXX POP HL LD A,(BUFAD+1) CP 'S' ;TEST FOR SYMBOLIC JR Z,SEROT2 LD A,(LNLENG) ;HOW MANY TO GO LD C,A ;SAVE CP 08 JR Z,SERADR ;NO SPACES LD B,4 ;GET SET FOR 4 SPACES CALL RSPACE SERADR: CALL ADOUT DEC C ;ONE LES LINE TO OUTPUT JR Z,RELOAD LD A,C ;GET POSITION SERSTR: LD (LNLENG),A ;STORE POSITION EXX RET ; RELOAD: CALL CRLF ;GET NEW LINE LD A,8 JR SERSTR ;STORE ; ;SYMBOLIC SEARCH SEROT2: CALL CRLF ;GET NEW LINE CALL ADOUT ;OUTPUT ADR. LD B,8 ;OUTPUT ADJ FACTOR PUSH HL ;MOVE TO DE REGS. POP DE EXPAND: DEC HL INC DE DJNZ EXPAND ;ADJ START AND STOP CALL ZDISAC ;DISASSEMBLE CALL CRLF LD A,(HEXAD3) ;GET CTRL OR A ;TEST CALL Z,INPUT ;WATE FOR KEY PRESS EXX RET ; ;DISASSEMBLER COMAND ROUTINE ZDISAC: LD (HERE),HL ;STORE PRESSENT ADR PUSH DE PUSH HL CALL BYTES CALL CRLF ;GET NEW LINE POP HL CALL OFFADR ;PRINT OUT ADR LD B,2 ;LOAD FOR TWO SPACES CALL RSPACE ;OUTPUT SPACES LD A,(IBUF) ;GET CTRL AND 7 ;STRIP OF FLAGS LD B,A ;GET BYTES IN B LD C,0AH ;TOTAL SPACES HEX0T: CALL MOUT ;OUT ASCII BYTES INC HL ;INCREAD ADR DEC C ;DECREASE SPACES DEC C DJNZ HEX0T ;KEEP GOING ; PUSH HL ;STORE NEXT ADR LD B,C ;SET FOR RESPACE CALL RSPACE CALL ZDISA ;OUTPUT MNEMONIC POP DE ;GET NEXT HERE POP HL ;GET END ADR PUSH HL ;SAVE END ADR AND A ;CLEAR CARRY FLAG SBC HL,DE ;CALCULATE POP HL ;GET END ADR EX DE,HL ;PROPER POS RET C ;DONE JR ZDISAC ;KEEP GPING ; ;JUMP REALITIVE CALCULATOR ; JRCALC: LD HL,(HEXAD2);WHERE YOU ARE GOING LD BC,(HEXAD);WHERE YOU ARE INC BC ;ADJUST INC BC ;ADJUST AND A ;CLEAR CARRY FLAG SBC HL,BC ;CALCULATE LD A,L ;TRANSFER RESULTS EX DE,HL ;TRANSFER FOR TESTING JP M,BKJMP ;BACKWARDS JUMP LD HL,07FH ;TEST VALUE SBC HL,DE ;TEST JP M,ERR1 JROUT: JP HEXOUT BKJMP: LD HL,0FF80H ;TEST VALUE SBC HL,DE ;TEST JP P,ERR1 JR JROUT ; ; 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 BYTS JR Z,TWOBYT ; ;TEST FOR THREE BYTE 8080 OPCODES ;PRODUCING SYMBALS ; LD BC,1AH ;NO. OF THREE BYTS CPIR ;TEST FOR 3 BYTS JR Z,BYTES3 ; ;ONE BYTE 8080 ROUTINE ; LD A,1 ;ONE BYTE JR STIBUF ;STORE ; ;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 JR STIBUF ;STORE ; ;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 EX DE,HL ;GET IN RIGHT POS JR STRSM0 ;STORE ; 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 JR STIBUF ;STORE ; FAMFD: INC HL LD A,(HL) CP 0E9H ;TEST FOR FDE9 JR NZ,FAMDFD LD A,22H ;SET FLAGS STIBUF: 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 JR STIBUF ;STORE ; ZBYTE3: LD A,3 JR STIBUF ;STORE ; ;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 LD C,A ;GET JP FACTOR IN C RLA ;TEST FOR 7 BIT HIGH SBC A ;GET 00 OF FF LD B,A ;GET RESULTS IN B ADD HL,BC ;GET RESULTS LD BC,(OFSET) ADD HL,BC STRSM0: LD (SM0ADR),HL ;STORE RESULTS RET ; ;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 ; ; ;DISASSEMBLER ROUTINES ; ZDISA: XOR A ; ZERO ACCUMULATOR LD E,A ;STORE 00 IN D REG LD IY,(HERE) ;GET ADR OF DISA 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 JP 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 MADE 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 ; 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 ; 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,20H,57H;ED 57 LD A,I DB 00H,21H,4FH;ED 4F 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 FOR NO REPOT 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 ; MSGFND: INC C DEC C JR Z,MSGOUT ;READY FOR MSG JR MXTEST ADV: INC HL MXTEST: LD A,(HL) ;GET CHAR. IN A AND A JP P,ADV ;NOT AT END INC HL DEC C JR Z,MSGOUT JR MXTEST ; 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 JR MSGOT2 ; P01: LD HL,PT01 ;PROCESS 01 JP MSGOT2 ; ; P10: LD HL,PT10 ;PROCESS 10 JR MSGOT2 ; P11: LD HL,PT11 ;PROCESS 11 JR MSGOT2 ; P13: LD HL,PT13 ;PROCESS 13 JR MSGOT2 ; P0D: LD HL,PT0D ;(HL) JR MSGOT2 ; P0E: LD HL,PT0E ;SP,HL IX IY JR MSGOT2 ; P15: LD A,D ;GET CTRL AND 38H ;CONVERT TO RST NO. JP HEXOUT ; P12: LD HL,PT12 ;(SP),HL IX IY JR MSGOT2 ; P1A: LD HL,PT1A ;A,R JR MSGOT2 ; P1F: LD HL,PT1F ;I,A JR MSGOT2 ; P20: LD HL,PT20 ;A,I JR MSGOT2 ; P21: LD HL,PT21 ;R,A JR MSGOT2 ; P05: LD HL,PT5A ;HL, CALL MSGOUT ;OUTPUT HL, JR P07 ;BC DE ?? SP ; P03: LD A,D ;GET CTRL IN A SUB 20H ;ADJ FOR ROT LD D,A ;STORE VALUE CALL P0B ;OUT COND P03A: LD HL,PT03 ;,XXXX JR MSGOT2 ; P0B: LD HL,PT0F ;CONDITIONALS JR AND38B ;OUTPUT ; P0F: CALL P0B ;OUT CONDITIONALS JR P03A ; P04: CALL P07 ;BC DE ?? SP JR P03A ;OUTPUT ; P07: LD HL,PT5B ;BC DE ?? SP AND30B: JP AND30 ;OUT REG. ; P09: LD HL,PT14 ;B C D E ?? JR AND38B ;OUTPUT ; P1B: CALL P09 ;B C D E ? ? P1BA: LD HL,PT1B ;,XX MSGOT2: JP MSGOUT ; P14: CALL P09 ;B C D E ? ? CALL COMMA ;, P14B: LD HL,PT14 ;B C D E ? ? JR AND07B ;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 NO REPOT LD HL,PT22 ;TABLE OF PREFIXES CALL AND38 ;OUTPUT PREFIXES RET ;RETURN TO CALLER ; P23: CALL P23B ;SAVE MEMORY JR P14B ;B C D E ? ? ; P24: CALL P23B ;SAVE MEMORY LD HL,PT1B+1 ;XX JR MSGOT2 ;OUTPUT XX ; P16: CALL P17B ;H L ? A LD HL,PT16A ;,(C) JP MSGOUT ;OUTPUT ,(C) ; P17: LD HL,PT16A+1;(C) CALL MSGOUT CALL COMMA ;OUT , P17B: LD HL,PT16B ;H L ? A AND38B: JP AND38 ;OUTPUT REG ; P1C: LD HL,PT06B ;(XXXX) CALL MSGOUT CALL COMMA ;OUT , JR P07 ;BC DE ?? SP ; P1D: CALL P07 ;BC DE ?? SP LD HL,PT06A ;,(XXXX) JR MSGOT2 ; P1E: LD HL,PT1E ;0 ? JR AND38B ;OUTPUT IT ; P18: LD HL,PT23 ;B C D E H CALL AND38 CALL COMMA ;OUT , JR P14B ;B C D E ? ? ; P19: CALL P09 ;B C D E ? ? CALL COMMA ;OUT , P19B: LD HL,PT23 ;B C D E H L AND07B: JP AND07 ; P22: CALL P09 ;B C D E ? ? INC IY JR P1BA ; 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 JR P19B ;B C D E H L ; PDFDCB: LD D,(IY+02) ;GET CTRL CALL SUBCB ;OUTPUT MNEMONIC JR C,DFDCB ;PROCESS BIT RES SET SUBCB1: LD HL,TCBDFD ;(IY+??):B JR AND07B ;OUTPUT ; DFDCB: LD A,D ;GET CTRL AND A ;TEST FOR BIT JP M,SUBCB1 ;NOT BIT LD HL,TCBFDF ;(IY+??): JR AND07B ;OUTPUT ; P06: LD HL,PT06 ;???,??? JP AND38 ;OUTPUT IT ; COMMA: LD HL,OUTXXX ;, JP MSGOUT ;OUT , ; ;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 ; ;SNOOPYS FAST TRACE ROUTINES ; BREAK: 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,0AH ;10 ADDRESSES LD (LNLENG),A 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,0AH ;10 LINES LD (LNLENG),A LD HL,(HEXAD) 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 BRAK AD IN HL LD (BKADR),HL ;INITAL BREAKADR 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 INITX2 ; REGADR: LD A,1 LD (TYPE),A INITX2: 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 ;GET OPCODE INFO 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,OTLIN ;KNOW MSG CALL SPACE 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. CALL SPACE XOR A ;ZERO ACCUM LD (BRKMSG),A ;ZERO BK MSG OTLIN: LD HL,(BKADR) ;GET BREAK ADR IN HL CALL SPACE CALL ADOUT 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 ; REGS: LD A,(BRKMSG) ;GET INFO TO DETERMINE BIT 0,A ;WEATHER TO PRINT REG. JP Z,REGOUT CALL MSG JP REGOUT MSG: CALL SPACE 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: CALL SPACE LD HL,STKADR-2;GET ADR OF A & F 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 CALL ADOUT ;OUTPUT BREAK ADR CALL SPACE CALL ZDISA ;CALL DISASSEMBLER LD A,0DH CALL OUTPUT ;OUTPUT CARRAGE RET LD A,0AH CALL OUTPUT LD A,(IOBYT) BIT 6,A ;TEST IF STATUS CHECK RET NZ ;NO STATUS CHECK CALL STATUS CP 0FFH ;TEST FOR KEY PRESS RET NZ ;NO KEYPRESS CALL INPUT ;EXTRA INPUT RET ; ;BREAK TRACE COMMAND ROUTINES ; CMAND: LD HL,RUN DEC (HL) JR Z,CMAND3 JP CALCUL ;KEEP GOING ; CMAND3: PUSH HL LD B,'?' ;GET PROMPT CALL VDM 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' ;KEYPRESS CHECK EVERY CRLF JR Z,SPEED1 CP '2' ;CHECK KEYPRESS END PAGE 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,(IOBYT) ;GET IN OUT BYTE RES 6,A ;STATUS CHECK JR SPEEDS SPEED2: LD A,(IOBYT) ;GET IN OUT BYTE SET 6,A ;NO STATUS CHECK SPEEDS: LD (IOBYT),A ;STORE IN OUT BYTE 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 ; ;CALCULATE WHERE NEXT BYTE SHOULD GO ; CALCUL: LD HL,(BKADR) ;GET POSITION 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 ; ;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 JR NXTBYT ;CALC. WHERE NXT 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 INC HL INC HL CP 010H ;TEST FOR DJNZ JR Z,XDJNZ ADD 0A0H ;MAKE STD. JP OPCODE JR TESTB ;TEST AS 8080 JUMPS ; ;DJNZ TEST ROUTINE ; XDJNZ: LD A,(STKADR-3);GET B REG. 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 TESTB: 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 WONT WORK LD L,A ;GET RST ADR IN L LD H,0 ;ZERO H REG RET ; ;LOAD REGISTERS AND EXECUTE ONE BYTE ; ; ;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,(IOBYT) ;GET IN OUT BYTE BIT 1,A ;TEST IF LIST ACTIVE CALL NZ,LSTAT ;WAIT IF LIST ACTIVE 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' ; 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 'OTD',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 ; ;TWO PASS ROUTINES ; PASS.2: LD HL,0A42H ;SET PAGE LENGTH LD A,L SUB H LD L,A LD (PGBUF),HL LD (PGBUF+2),A CALL COFSET ;CALCULATE OFFSET LD A,(BUFAD+1);GET SECOND BYTE CP '1' ;TEST FOR 1 JP Z,ZDISA1 ;DISASSEMBLY ONLY CP '2' ;TEST FOR 2 JP Z,ZDISA2 ;DISA, AND CROSS REF. CP '3' ;TEST FOR 3 JP NZ,ERR1 JP ZDISA3 ; ;THIS ROUTINE MAKES THE SYMBOL TABLE ; CLYSMB: LD DE,TABSTA ;START ADR SYMBOL TABLE LD H,D ;GET ADR IN H REG LD L,E ;AND IN L REG. XOR A LD (HL),A ;POKE OO TABLE START INC DE LD BC,0BFCH ;TABLE LENGTH LDIR DEC (HL) ;GET FF IN MEM. LD BC,4 LDIR RET ; ;THIS IS THE SEARCH AND INSERT ROUTINE ; SEAINS: LD IY,TABSTA LD DE,(SM0ADR);ADR POINTED TO SER4: 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 SER4 ;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 (HEREX),HL ;STORE START ADR. CONT: LD HL,(HEREX) ;GET POSITION LD (HERE),HL;POKE FO BYTES 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,(HEREX) ;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 (HEREX),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 ; 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: CALL SPACE LD A,':' CALL OUTPUT PUSH IX POP HL ;TRANSFERED LD A,H CALL CHASE LD A,L CALL HEXOUT RET ; OUTSM2: LD B,10 ;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 (HEREX),HL ;STORE PRESENT ADR. PUSH HL LD (HERE),HL;POKE FOR BYTES 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,(HEREX) ;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,(HEREX) ;GET POSITION LD (HERE),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,ENDCHX ;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 ENDCHX: LD DE,(HERE4) ;NEXT ADR LD HL,(HEXAD2) ;END ADR. AND A ;CLEAR CARY FLAG SBC HL,DE ;CHECK RET C ; " " " LD HL,(HERE4) ;GET NEXT ADR. JR REPEAT ;KEEP GOING ; ; ZDISA1: 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 CALL SPACE ; ;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 (HERE),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 CALL BYTES CALL ZDISA ;CALL 8080-Z80 DIS. CALL SM0USR ;OUTPUT SM0USR CALL CRLF CALL SPACE JR RPEAT2 ;KEEP GOING ; SM0USR: LD HL,(HEXAD) ;GET START CONT3: LD (HEREX),HL ;STORE LD (HERE),HL;POKE FOR BYTES 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,(HEREX) ;GET PRESENT POS CALL OFFADR ;OUT ADR. LD B,2 ;TWO SPACES CALL RSPACE ;OUT SPACES LD HL,(HEREX) ;GET PRESENT ADR. LD (HERE),HL;STORE FOR ZDISA CALL ZDISA ;CALL DISASSEMBLER CHKEND: LD A,(IBUF) ;GET CTRL AND 7 ;STRIP LD B,A ;GET BYTES IN B LD HL,(HEREX) ;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 DISSA1 ;DISSEMBLE CALL CRREF ;MAKE TABLE JP GOOD ;END ; ;CROSS REFFERENCE ONLY ;COMMAND ROUTINE ; ZDISA3: CALL MAKSYM ;MAKE SYMBAL TABLE CALL CRREF2 ;MAKE C-R TABLE JP GOOD ;END ; ;BASIC IN OUT ROUTINES ; OUTVDM: JR OTVDM ;OUTPUT FROM VDM OUTLIN: JR OTLINE ;OUTPUT FROM LIST JR OTCLIN ;LD A,C LIST FOR CP/M OUTPUT: JR OTPUT ;MAIN OUTPUT JR COUT ;LD A,C OUTPUT FOR CP/M INPUT: JP IPUT ;JUP INPUT ENDCHK: JP ENDCH1 ;JP END CHECK STATUS: JP STATU ;JUMP TO STATUS XSPACE: JP XSPAC ;JUMP TO XSPACE SPACE: JP SPAC ;JUMP TO SPACE RSPACE: JP RSPAC ;JUMP TO RSPACE REPOT: JP REP0T ;JUMP TO REPOT CRLF: JP CRLF0 ;CRLF WITH SWITCH JP ERR1 ;SPARE BUFOUT: JP BUF0UT ;MSG OUT WITH CRLF BUFOT2: JP BUF0T2 ;MSG NO CRLF TSTHX: JP TSTHX1 ;TEST FOR HEX PGSET: JP PGSET1 ;SET PAGE LSTAT: JP LSTAT0 ;LIST STATUS IOINT: RET ;INIT. IN OUT BOARD LD A,0 ;SPARE BYTES ; ;OUTPUTING SWITCHING ROUTINES ; OTVDM: LD (SAVESP),SP;SAVE FOREIGN STACK LD SP,STACK2 PUSH HL LD L,0 ;SET FOR VDM JR OUTPT2 ; OTCLIN: LD A,C ;LIST OUT FOR CP/M OTLINE: LD (SAVESP),SP LD SP,STACK2 PUSH HL LD L,3 JR OUTPT2 ; COUT: LD A,C ;OUTPUT FROM CP/M OTPUT: LD (SAVESP),SP;SAVE STACK LD SP,STACK2 PUSH HL LD HL,(IOBYT);GET OUT BYTE IN HL OUTPT2: PUSH BC LD B,A ;GET CHAR IN B REG PUSH DE PUSH AF BIT 0,L ;TEST FOR VDM PUSH HL ;SAVE FROM VDM TIMER CALL Z,VDM POP HL ;RETRIEVE IOBYT BIT 1,L ;TEST FOR LIST CALL NZ,LIST POP AF POP DE POP BC POP HL LD SP,(SAVESP);GET CALLERS STACK RET ; ;INPUT ROUTINE WITH OPTIONS ; IPUT: LD (SAVESP),SP;SAVE STACK LD SP,STACK2 ;GET NEW STACK PUSH HL LD HL,(IOBYT) BIT 4,L ;TEST FOR INPUT 1 CALL Z,INPUT1 BIT 4,L ;TEST FOR INPUT 2 JR Z,TFORCE ;JP IF NOT INPUT 2 CALL INPUT2 TFORCE: BIT 5,L ;TEST FORCED UPPERS JR NZ,NFORCE ;NO FORCE FORCE2: CP 61H JR C,NFORCE CP 7BH JR NC,NFORCE SUB 20H NFORCE: CP 14H ;CTRL T CALL Z,MSTSWC CP 1BH ;TEST FOR ESCAPE JP Z,INIT1 POP HL LD SP,(SAVESP);GET COLLERS STACK RET ; XSPAC: BIT 7,B ;NEGATES RESPACE RET NZ ;7 BIT IS HIGH JR RSPAC SPAC: LD B,1 RSPAC: LD A,' ' REP0T: CALL OUTPUT DJNZ REP0T RET ; ENDCH1: PUSH HL LD HL,(HEXAD4) ;GE BLOCK LN DEC HL LD (HEXAD4),HL ;PUT IT BACK LD A,L OR H POP HL RET ; CRLF0: LD A,0DH ;CRLF WITH SWITCH CALL OUTPUT LD A,0AH ;LF CALL OUTPUT CALL STATUS CP 0FFH ;TEST IF KEYPRESS RET NZ ;NO KEY PRESS JP INPUT ;WHAT GOES ON ; BUF0UT: CALL CRLF ;GET NEW LINE BUF0T2: 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 ; TSTHX1: SUB 30H ;TEST FOR HEX CP 10 ;LESS THAN A RET C ;YES IT IS 0-9 SUB 10H CP 7 ;A THROUGH F ONLY RET NC ;IT IS TO BIG ADD 9 SCF ;FLAG AS HEX RET ; ;MASTER SWITCHING ; MSTSWC: CALL SET LD A,14H ;DESTROY SWITCHING ACCM. RET ;BACK TO CALLER ; SET: BIT 4,L ;WHICH KEYBOARD CALL Z,INPUT1 BIT 4,L ;KEYBOARD 2? JR Z,SET1 CALL INPUT2 ; SET1: CP 0CH ;TEST FOR FORM FEED JR Z,VID ;CLEAR SCREEN CP 19H ;CTRL Y JR Z,VID ;SET PAGE MODE CP 13H ;CTRLS JR Z,VID ;SCROLE MODE CP 1BH ;? ESCAPE JP Z,INIT1 CP 0EH ;CTRLN LIST DEVICE JR Z,CTRLN ;WITH IT'S KEYBOARD CP 10H ;CTRL P JR Z,CTRLP ;LIST AND VDM CP 16H ;CTRL V VDM MODE JR Z,CTRLV ;SET UP FOR VDM CP 11H ;CTRL Q JP Z,PGSET ;RES PAGE & MSG COUNT CP 07H ;CTRL G JR Z,CTRLG ;LOWERS AND UPPER CASE CP 17H ;CTRL W JR Z,CTRLW ;UPPER CASE ONLY ; CALL TSTHX ;IS IT VALID RET NC ;NO DEC A ;MAKE 1=0 LD (SPEED),A ;STORE RET ; VID: PUSH HL PUSH DE PUSH BC DB 0 ;SPARE BYTE CALL VDM2 POP BC POP DE POP HL RET ; CTRLN: LD A,L ;GET IOBYT SET 0,A ;TURN OFF VID SET 1,A ;TURN ON LIST SET 4,A ;ENABLE LIST KEYBOARD JR IORET ; CTRLP: LD A,L RES 0,A ;TURN ON VDM SET 1,A ;TURN ON LIST JR IORET ; CTRLV: LD A,L RES 0,A ;TURN ON VDM RES 1,A ;TURN OFF LIST RES 4,A ;KEYBOARD 1 ACTIVE JR IORET ; CTRLG: LD A,L SET 5,A ;TURN ON UPPER CASE JR IORET ; CTRLW: LD A,L RES 5,A ;TURN OFF UPER CASE IORET: LD (IOBYT),A ;STORE NEW IOBYT RET ; ;STATUS ; STATU: PUSH HL ;SAVE CALLERS HL REG. LD HL,(IOBYT) BIT 4,L ;TEST WHICH KEYBOARD JR NZ,STAT2 ;OTHER KEYBOARD POP HL IN A,3 ;IN STATUS AND 8 ;TEST RET Z ;NO INPUT LD A,0FFH RET DB 0,0,0,0 ;SPARE BYTES ; STAT2: POP HL IN A,3 AND 8 RET Z LD A,0FFH RET DB 0,0,0,0 ;SPARE BYTES ; INPUT1: IN A,3 AND 8 JR Z,INPUT1 ;WATE IN A,1 AND 7FH ;STRIP PARITY RET DB 0,0,0,0 ;SPARE BYTES ; INPUT2: IN A,3 ;IN STATUS AND 8 JR Z,INPUT2 IN A,1 ;INPUT KEYBOARD AND 7FH ;STRIP PARITY RET DB 0,0,0,0 ;SPARE BYTES ; LSTAT0: IN A,3 ;IN STATUS AND 1 ;PORT STATUS JR Z,LSTAT0 ;KEEP WAITING IN A,3 ;IN STAUS AND 20H ;LIST DEV.READY JR NZ,LSTAT0 ;KEEP WAITING RET DB 0,0,0,0 ;SPARE BYTES ; ;LIST ROUTINES ; LIST: LD A,11H ;CTRL Q CP B JR Z,PGSET1 OD11: CALL LSTAT0 ;CALL LIST STATUS LD A,B ;GET DATE IN ACUM OUT 2,A ; OUT TTY CP 0AH ;LF RET NZ LD B,4 ;LEFT MARGINS SPACES CALL LINSP ;LINE PRINT SPACES CALL PAGE RET ; PGSET1: LD A,(PGBUF+2) LD (PGBUF),A LD A,1 LD (BRKMSG),A;SET PAG & MSG FLAG RET ; LINSP: LD A,20H LINSP2: PUSH BC LD B,A CALL LINE2 POP BC DJNZ LINSP2 RET ; LINE2: CALL LSTAT0 ;CALL LIST STATUS 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 ;4 LEFT MARGIN SPACES CALL LINSP INC HL LD A,(HL) ;RESET COUNTER LD (PGBUF),A LD A,1 LD (BRKMSG),A ;CONT BKTRAC MSG RET ; ;VIDO DRIVR ;WRITTEN FOR PROC-TECH'S VDM-1 ; VDM: LD A,B VDM2: LD DE,(VDMBF+2);GET LINE AND POS. LD HL,(VDMBF) ;GET ADR POINT CP 0CH ;FORM FEED JR Z,CLEAR CP 19H ;CTRL Y PAGE MODE JR Z,FMAT CP 13H ;CTRL S JR Z,FMAT AND 7FH ;STRIP CP 0DH ;CR JR Z,CR CP 20H ;SKIP CTRL CHAR RET C CP 5FH ;BKSP JR Z,BKSPC CP 7FH ;TEST FOR DELETE JR Z,BKSPC ;GO DELETE 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 LENGTH LD A,(MODE) ;WHICH MODE CP 19H ;CTRL Y PAGE MODE 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 19H ;CTRL Y PAGE MODE 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 CP 0D0H RET NZ LD HL,VDMBA RET JR NZ,LINE LD E,64 POP HL JR EXIT MEMCH: LD A,H ;CHECK END