; ;SNOOPY SOURCE A Z80 DISASSEMBLER ;DESIGNED FOR REASSEMBLY BY Z80 ;ASSMBLERS. ; ;VERSION 1.1 ; ;WRITTEN BY RALPH E. BUCKNAM ;COPYRIGHT (C) 1979 ;ALL RIGHTS RESERVED ; ;EQUATE TABLE ; BDOS EQU 0005H W.BOOT EQU 0000H ; START JP START1 ;JUMP OVER ROUTINES ; ;MAIN DISK ENTRY POINT TO BDOS ; ;OUTPUT CHARACTER WHICH IS IN ACCUMULATOR ; OUTS LD E,A LD C,2 ;TOKEN FOR OUTPUT JP JBDOS ; OUTPUT: PUSH AF PUSH BC PUSH DE PUSH HL PUSH IX PUSH IY AND 7FH ;STRIP 8 BIT PUSH AF CALL ICHECK ;TEST FOR INPUT JP NZ,START ;A KEYPRESS OCCURED POP AF LD IX,OUTBYT BIT 0,(IX+0) PUSH AF CALL Z,OUTS ;OUTPUT CHAR POP AF BIT 2,(IX+00) ;TEST FOR DISK WRITE CALL NZ,B.WRIT ;PLACE A BYTE FOR WRITING POP IY POP IX POP HL POP DE POP BC POP AF RET ; INPUT PUSH BC PUSH DE PUSH HL LD C,1 CALL JBDOS POP HL POP DE POP BC AND 7FH ; FORCE: CP 61H RET C CP 7BH RET NC SUB 20H RET ; XSPACE: LD A,(OUTBYT) BIT 2,A RET NZ ;NO SPACES JR RSPACE ;OUTPUT SPACES ; TSPACE: LD A,(OUTBYT) BIT 2,A JR Z,RSPACE ;OUTPUT SPACES LD A,09H ;LOAD TAB CHAR. JP OUTPUT ; SPACE: LD B,1 RSPACE: LD A,' ' REPOT: CALL OUTPUT DJNZ REPOT RET ; BUFOUT CALL CRLF ;GET A NEW LINE ; BUFOT2 LD A,(HL) ;GET THE CHAR CALL OUTPUT ;OUTPUT CHAR OR A RET M ;END OF ROUTINE INC HL JR BUFOT2 ;MORE TO GO ; 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 ; ; ;SETUP HEXADS AND OTHER DATA ; SETUP CALL C.HEX LD (HEXAD),HL CALL C.HEX LD (HEXAD2),HL CALL C.HEX LD (HEXAD3),HL ; 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 ;CALCULATE OFFSTR: AND A ;OFSET IS CALCULATED EX DE,HL ;IN POSITION LD HL,0 SBC HL,DE LD (OFSET),HL ;STORE OFSET RET ; ;ROUTINE TO ENTER HEX FROM THE KEYBOARD ; ENTER: CALL SETUP ;GET PARAMETERS LD HL,END.IT ;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 ; ;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 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 ; XLINE: CALL CRLF LD B,16 CALL XSPACE CALL A.CNT ;OUTPUT LINE NUMBER ; XLINE2: LD A,';' JP OUTPUT ; ;DUMP HEX AND ASCII ; DPHEX CALL SETUP ;GET PARAMETER CALL COFSET LD A,(D.BYTE) ;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,END.IT 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 ; ;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 ; ; ;CHECK FOR KEY PRESS AND INPUT IF PRESSED ; ICHECK LD C,0BH ;TOKEN FOR STATUS CK CALL JBDOS ;CHECK FOR INPUT OR A ;TEST RET Z ; ;INPUT LD C,1 ;TOKEN FOR INPUT CALL JBDOS ;GET INPUT OR A RET ; F.BDOS LD DE,FCB ;ADR FILE CTRL BLOCK ; JBDOS JP BDOS ; ;SET UP DEFAULT BUFFER ; D.BUF LD DE,DBUFAD ;ADDRESS OF DEFAULT BUF ; S.DMA LD C,1AH ;TOKEN TO SET DMA JR JBDOS ;GO TO BDOS ; ;MESSAGE FINDING ROUTINE ; MSGFIND LD DE,MSGTBL-1 ;ADR. OF MESSAGE TABLE M.FIND JR M.TEST ;TEST IF END ; MSLOOP INC DE ;POINT TO CHAR. LD A,(DE) ;GET CHAR RLCA ;TEST OF END MSG JR NC,MSLOOP ;NOT AT END ; M.TEST DJNZ MSLOOP ;MSG. NOT FOUND ; INC DE JR DAT.OUT ;OUTPUT DATA ; DATOUT LD A,'$' ;END BUFFER TOKEN LD (HL),A ;STORE END TOKEN LD DE,BUFAD ;GET START OF BUFFER ; DAT.OUT LD A,(DE) ;GET CHAR CP '$' ;TEST FOR END RET Z OR A ;TEST FOR ZERO RET Z AND 7FH ;STRIP CALL OUTPUT LD A,(DE) ;GET CHAR AGAIN BIT 7,A ;TEST FOR END RET NZ INC DE ;NEXT CHAR JR DAT.OUT ; CR.LF LD DE,CRLF.0 ;ADDRESS OF MESAGE JR DAT.OUT ;OUTPUT A CR.LF ; ; ;PROGRAM STARTS HERE ; START1 LD SP,STACK LD B,0FH ;TOKEN FOR SIGN ON CALL MSGFIND ;OUTPUT SIGNON ; START2 LD SP,STACK XOR A LD (OUTBYT),A ;RESET OUT BYTE CALL CR.LF ;GET A NEW LINE LD HL,END.IT ;PREPAIR FOR RET. JUMP PUSH HL ;RETURN JUMP COMPLETE LD C,19H ;TOKEN FOR PRESSENT DRIVE CALL JBDOS ;GET PRESENT DRIVE ADD 41H ;CONVERT TO LETTER LD DE,MSGTBL ;START OF MESSABE TBL LD (DE),A ;PRESENT DRIVE STORED CALL DAT.OUT ;OUTPUT DATA ; LD IX,BUFAD ;START OF DATA LD DE,XBUF ;START OF INPUT BUFFER LD C,0AH ;INPUT BUFLINE TOKEN CALL JBDOS ; LD HL,BUF.CH ;POINT TO CHARS. LD B,(HL) ;GET COUNT OF CHAR INC B ;ONE BEOND END ; Z.LOOP INC HL ;HEAD FOR POSITION DJNZ Z.LOOP ;NOT THERE ; XOR A LD (HL),A ;SET END OF BUFFER CALL D.BUF ;SETUP DEFALT BUFFER CALL CR.LF ;GET A NEW LINE ; ;CHECK FOR DRIVE CHANGE ; LD A,(IX+00) ;GET FIRST BYTE CP 00H ;TEST FOR NO ENTRIES JR Z,START2 ;SUPER NO NO!!!!!!! LD A,':' ;GET DRIVE CHAR. CP (IX+01) ;TEST IF CHANGE LD (DRIVE),A ;SAVE NO DRIVE TOKEN CALL Z,D.SW.1 ;SWITCH IF NECCESARY ; ;FIND COMMAND ROUTINE ; LD B,0 ;ZERO TOKEN COUNTER PUSH IX ;START TRANSFER POP HL ;END TRANSFER LD IY,CNAMES ;COMMAND NAMES ; F.LOOP LD A,(IY+00) ;GET ASCII BYTE OR A ;TEST FOR END TABLE JP Z,CX.ERR ;END OF TABLE AND 7FH ;STRIP HIGH BYTE XOR (HL) ;TEST FOR MATCH JR NZ,NO.MATCH ;SETUP FOR NEXT TEST BIT 7,(IY+00) ;TEST FOR END NAME JR NZ,FOUND INC HL ;NEXT POSITION INC IY JR F.LOOP ;TRY NEXT BYTE ; NO.MATC INC B ;NEXT TOKNE PUSH IX ;START OVER AGAIN POP HL JR NX.NAME ;FIND NEXT NAME ; N.LOOP INC IY ; NX.NAME BIT 7,(IY+00) ;TEST FOR END JR Z,N.LOOP ;NOT END OF NAME ; INC IY ;START OF NAME JR F.LOOP ;TRY AGAIN ; ;VICTOR TO COMMAND ; FOUND LD A,(HL) ;GET LAST CHAR LD (D.BYTE),A ;SAVE LAST BYTE INC HL ;NEXT CHARACTER PUSH HL ;TRANSFER POP IX ;COMPLETE CALL F.START ;REMOVE SPACES LD HL,CMDTBL ;ADDRESS OF COMD TABLE LD C,B ;TRANSFER TOKEN LD B,0 ADD HL,BC ADD HL,BC LD E,(HL) ;GET LOW BYTE INC HL LD H,(HL) ;GET HIGH BYTE LD L,E ;READY FOR VICTOR JP (HL) ;OFF TO WORK ; ;DRIVE SWITCH NO. 1 ; D.SW.1 LD C,19H CALL JBDOS LD B,A ;SAVE PRESENT DRIVE LD A,(IX+00) ;GET NEW DRIVE CP 'A' ;LESS THAN [ A ]? JP C,SYNTAX ;ILLEGAL CP 'C' ;GREATER THAN [ B ]? JP NC,SYNTAX ;ILLEGAL LD DE,2 ;ADVANCE FACTOR ADD IX,DE ;NEW POSITION SUB 41H ;CONVERT TO D. NUMBER CP B ;TEST IF SAME RET Z ;NO DRIVE CHANGE LD E,A ;SETUP FOR DRIVE CHANGE LD A,B ;GET OLD DRIVE LD (DRIVE),A ;STORE OLD DRIVE ; SWDRIVE LD C,0EH ;TOKEN FOR DRIVE CHANGE CALL JBDOS ;SWITCH DRIVES RET ; ;DRIVE SWITCH NO 2 ; D.SW.2 LD A,(DRIVE) ;GET DRIVE INFO CP ':' RET Z ;NO DRIVE CHANGE LD E,A ;TRANSFER DRIVE INFO JR SWDRIVE ;SWITCH DRIVE ; ;TWO PASS NO SYMBOL TABLE ;DISASSEMBLE AND OUTPUT DATA ; ZDISA1: CALL SETUP ;GET PARAMETERS CALL COFSET ;CALCULATE OFFSET CALL Z.CNT ;RESET LINE COUNTER CALL XLINE CALL XLINE LD HL,DMSG1 ;POINT TO MESSAGE CALL BUFOT2 ;OUTPUT MESSAGE CALL XLINE CALL DISSA1 CALL OT.EQU ;OUTPUT EQUATE TABLE JP END.IT ;RETURN TO SNOOPY ; ;DISSASEMBLE AND STORE OUTPUT FOR SOURCE ; ; ZDISA2: CALL X.FCB ;SETUP FCB JP NZ,SYNTAX ;MUST BE A SPACE CALL SETUP ;GET PARAMETERS LD A,04H ;SET FOR LIST LD (OUTBYT),A ;SWITCH OUTPUT CALL COFSET ;CALCULATE OFFSET ; ;SETUP TO SAVE SOURCE AS DISK FILE ; LD C,13H ;TOKEN TO KILL FILE CALL F.BDOS ;KILL FILE IF EXISTS LD C,16H ;TOKEN TO OPEN FILE CALL F.BDOS ;CREATE NEW FILE CP 0FFH ;TEST FOR ERROR JP Z,N.DIRS ;NO DIRECTORY SPACE CALL F.OPEN ;OPEN FILE LD A,80H ;BUFFER SIZE LD (BUFSIZ),A ;STORE SIZE LD HL,DBUFAD ;START OF BUFFER LD (P.POINT),HL ;START OF BUFFER ; CALL XLINE2 CALL XLINE LD HL,DMSG2 ;POINT TO MESSAGE CALL BUFOT2 ;OUTPUT MESSAGE CALL XLINE CALL DISSA1 ;MAKE DISASSEMBLY CALL OT.EQU ;MAKE EQUATE TABLE CALL CRLF LD A,1AH ;END OF FILE CHARACT. LD B,8 ; F.END: CALL OUTPUT ;SEND END OF FILE DJNZ F.END ; ;WRITE LAST SECTOR AND CLOSE FILL ; LD A,(BUFSIZ) ;GET SIZE CP 80H ;TEST CALL NZ,WRITE ;EMPTY BUFFER LD C,10H ;TOKEN TO CLOSE FILE CALL F.BDOS ;CLOSE FILE INC A ;TEST JP Z,CL.ERR ;CANNOT CLOSE FILE ; XOR A ;GET A ZERO LD (OUTBYT),A ;SWITCH OUT DISK JP END.IT ;END OF ROUTINE ; ;BYTE WRITE ROUTINE ;THIS ROUTINE STORES THE INCOMING ACCUMULATOR IN ;THE BUFFER. WHEN THE BUFFER IS FULL, THE BUFFER ;IS PLACED ON THE DISK. THEN THE POINTERS ARE RESET. ; B.WRIT LD HL,BUFSIZ ;POINT TO WHERE BUF IS LD DE,(P.POINT) ;POINT TO WHERE BYTE IS ;STORED LD (DE),A ;STORE CHAR INC DE LD (P.POINT),DE ;STORE POINTER DEC (HL) ;TEST FOR END RET NZ ;MORE ROOM IN BUFFER ; ;WRITE A SECTOR -- EMPTY BUFFER ; WRITE LD HL,BUFSIZ ;ADDRESS OF SIZE LD (HL),80H ;RESET SIZE LD HL,DBUFAD ;START OF BUFFER LD (P.POINT),HL ;RESET POSITION LD C,15H ;TOKEN FOR WRITE CALL F.BDOS ;STORE BUFFER OR A ;WRITE OK ? RET Z ;WRITE WAS GOOD ; DEC A ;WHAT KIND OF ERROR? JP Z,N.DIRS ;DIRECTOR FULL JP D.FULL ;DISK IS FULL ; ;READ DISK FILE COMMANDS - ********** ; ;LOAD COMMAND ; LOAD CALL X.FCB ;SETUP FCB ; LOAD.2 CALL LOAD.X ;READ FILE LD C,20H ;TOKEN TO GET DMA CALL JBDOS ;GET START OF LAST DMA DEC HL ;BACK 1 LD (L.END),HL ;STORE END OF LOAD L.BYTE PUSH HL LD B,0EH ;TOKEN FOR MSG CALL MSGFIND ;OUTPUT MESSAGE POP HL CALL AD.OUT ;OUTPUT ADDRESS CALL CR.LF ;GET NEW LINE RET ; ;LOAD SPECIFIC COMMAND ; SLOAD CALL X.FCB ;SETUP FCB JP NZ,SYNTAX ;MUST BE A SPACE CALL C.HEX ;GET FIRST ADDRESS LD (HEXAD5),HL ;STORE START ADDRESS JR LOAD.2 ;FINISH UP ELSEWHARE ; ;FIND MAX SECTORS OF LOAD ; LOAD.X LD DE,START ;THE LIMIT OF LOAD LD HL,0FF50H ;BACKUP FACTOR ADD HL,DE ;STOP LOAD HERE LD DE,(HEXAD5) ;START OF LOAD CALL SECTORS ;GET SECTOR INFO LD A,B OR C ;TEST FOR ZERO JP Z,N.SPACE ; ;SETUP TO READ SECTOR ; LD DE,80H ;SECTOR LENGTH LD HL,(HEXAD5) ;START OF LOAD EXX ;HIDE DATA LD HL,(HEXAD5) ;GET DMA ADDRESS. PUSH HL ;HIDE ADDRESS CALL F.OPEN ;OPEN FILE JR READ.3 ;START READING ; ;READ SECTOR LOOP - READ TILL DONE ; READ.2 EXX ;GET DRIVE INFO DEC BC ;ONE LESS SECTOR LD A,B ;TO FAR TEST OR C ;TEST JP Z,N.SPACE ;TO FAR ERROR ADD HL,DE ;NEW DMA ADDRESS PUSH HL ;TRANSFER DAM ADDR. EXX ;HIDE DATA ; READ.3 POP DE ;GET DMA ADDR LD C,1AH ;TOKEN FOR SET DMA CALL BDOS ;SET DMA ADDRESS LD C,14H ;TOKEN FOR READ SECTOR LD DE,FCB ;POINT TO FCB CALL BDOS ;READ FILE DEC A ;TEST FOR END JP NZ,READ.2 ;CONTINUE READING ; RET ;END OF READ ROUTINE ; ; ;ERASE DISK FILE COMMANDS - ********** ; ERA CALL X.FCB ;MAKE UP FCB ; ERA.2 CALL RESET2 CALL F.FILE ;FIND FILE AND ;SWITCH DRIVES IF NEC. ; LD C,13H ;TOKEN FOR DELETE CALL F.BDOS ;KILL FILE JR END.IT ; ;FINED DISK FILE ON SPECIFIED DISK DRIVE ; F.FILE LD C,11H ;TOKEN FOR FIND FILE CALL F.BDOS ;FIND FILE CP 0FFH ;TEST IF FOUND RET NZ ;FILE HAS BEEN FOUND. ; ;DISK ERROR ROUTINES ; N.FIND LD B,03 ;TOKNE, FILE NOT FOUND DB 21H ; N.SPACE LD B,07 ;TOKEN NO LOAD ROOM DB 21H ; CL.ERR LD B,0CH ;TOKEN, CAN'T CLOSE FILE DB 21H ; SYNTAX LD B,04 ;SYNTAX ERROR TOKEN DB 21H ; N.DIRS LD B,05 ;NO DIRECTORY SPACE DB 21H ; D.FULL LD B,06 ;TOKEN FOR DISK FULL DB 21H ; CX.ERR LD B,08H ;TOKEN FOR CKSUM ERROR DB 21H ; F.EXIS LD B,09 ;FILE EXISTS TOKEN ; CALL MSGFIND ;OUTPUT ERROR END.IT CALL D.SW.2 ;SWITCH DRIVES IF REQ. LD B,2 ;TOKEN FOR CRLF CALL MSGFIND ;GET A NEW LINE JP START2 ;START OVER AGAIN ; ;OPEN FILE ROUTINE ; F.OPEN LD C,0FH ;TOKEN TO OPEN FILLE CALL F.BDOS ;OPEN FILE INC A ;TEST IF FOUND RET NZ ;FOUND JR N.FIND ;FILE NOT FOUND ; ; ;DIRECTORY COMMAND - ********** ; DIR CALL FCBX.0 ;SET UP COMMAND LINE CALL RESET2 LD A,'?' ;GET A QUESTION MARK LD (FCB+12),A ;MAKE EXTENT WILD LD DE,FCB+1 ;START OF FILE NAME LD A,(IX+00) ;GET FIRST CHAR CP 0 ;TEST FOR END CMD LINE JR Z,W.CARD ;SET FOR WILD CARD CP '*' ;TEST FOR * LD B,8 ;8 ? IN CASE PUSH AF ;FOX AND GOOS CALL Z,WILDS ;MAKE NAME WILD POP AF CALL NZ,M.FCB1 ;TRANSFER FIL NAME LD A,(IX+00) ;GET INST. BYTE CP 0 ;TEST FOR END LD A,(IX+01) ;GET NEXT CHAR ;FILE TYPE IF NEC. JP Z,SYNTAX ;NO GOOD JR Z,W.TEST ;TEST FOR WILD CARD CP '*' ;TEST FOR WILD CARD PUSH AF ;PLAY FOX AND GOOSE LD B,3 ;3 ? INCASE CALL Z,WILDS2 ;MAKE TYPE WILD POP AF CALL NZ,M.FCB3 ;TRANSFER FILE TYPE LD A,'?' ;SETUP FOR WILD CARD LD B,11 ;TEST 11 TIMES LD HL,FCB+1 ;START OF NAME ; W.TEST CP (HL) ;TEST FOR WILD CARD INC HL JR Z,T.MAKE ;MAKE TABLE DJNZ W.TEST ;MORE BYTES TO TEST ; JP F.INFO ;GET FILE INFOR ; W.CARD LD B,12 ;MAKE 12 ? CALL WILDS ; ;FIND DIRECTORY INFOMATION AND OUTPUT DISK DATA ; T.MAKE CALL F.FILE ;FINE DISK FILE ON ;SPECIFIED DRIVE DB 0FDH,2EH,3 ; [LD X',3 ] SET ;LINE LENGTH ; ;T.LOOP ROUTINE FINDS AND OUTPUTS ONE DIRECTORY ;BLOCK ; D.LOOP LD HL,DBUFAD ;ADDRESS OF BUFFER INC HL ;START OF NAMES LD DE,20H ;SPACE PER DIRECTORY AND 3 ;GET OFSET FACTOR CP 0 ;TEST FOR NO OFFSET JR Z,DIR.2 ;NO OFSET LD B,A ; ;CALCULATE OFFSET IN DISK BUFFER ; O.LOOP ADD HL,DE DJNZ O.LOOP ; ;TRANSFER NAME TO OUTPUT BUFFER ; DIR.2 LD DE,BUFAD ;START OF TRANSFER EX DE,HL LD BC,0820H ;B = 8 TIMES, C = ' ' LD (HL),C ;STORE A SPACE INC HL ; ;DETERMINE POSITION IN OUTPUT BUFFER IF START ;OUTPUT A SPACE. IF NOT START OUTPUT [ | ] ; DB 0FDH,7DH ;[ LD A,X' ] ;GET POSITION CP 3 ;TEST POSITION LD A,'|' JR NZ,SID ;OUTPUT | LD A,C ;OUTPUT ' ' ; SID LD (HL),A ;STORE CHAR. INC HL LD (HL),C ;SPACE INC HL ; ;TRANSFER NAME ; CALL ZNLOOP ;TRANSFER NAME LD A,'.' ;GET SEPERATER LD (HL),A ;STORE SEPERATRO INC HL LD B,3 ; ;TRANSFER FILE TYPE ; CALL ZNLOOP ;TRANSFER F. TYPE ; ;GET EXTENT BYTE AND OUTPUT SPACES IF 0 ELSE ;OUTPUT EXTENT NUMBER IN ONE DIGIT HEX. ; LD A,(DE) ;GET EXTENT BYTE CP 0 ;TEST FOR EXTENT JR Z,N.EXT ;NO EXTENT LD A,'+' LD (HL),A ;STORE [ + ] INC HL LD A,(DE) ;GET EXTEND BYTE CALL XCHASE ;CONVERT STORE JR SIZE ; N.EXT LD (HL),C ;SPACE INC HL LD (HL),C ;SPACE INC HL ; ;CALCULATE NUMBER OF KILOBYTES IN THE EXTENT. THEN ;PRINT OUT THE OUTPUT BUFFER ; SIZE INC DE ;GET IN POSITION INC DE INC DE LD A,(DE) ;GET BYTE LD B,A ;MOVE FOR PROCESSING SRL B SRL B SRL B ;CONVERT TO KILOBYTES AND 7 ;TEST FOR ADVANCE JR Z,N.ADVAN ;NO ADVANCE INC B ;INCREASE BY ONE ; N.ADVAN LD A,B CALL G.NUM ;CONVERT TO DECIMAL CALL DATOUT ;OUTPUT DATA ; ;CHECK LINE POSITION AND OUTPUT A CR.LF IF END ;OF LINE IS REACHED ; DB 0FDH ,2DH ;[ DEC Y' ] TEST FOR ;END OF LINE JR NZ,N.CRLF ;NOT AT END OF LINE DB 0FDH,2EH,3 ;RESET LINE LENGTH CALL CR.LF ;GET A NEW LINE ; ;FIND NEXT DIRECTORY ENTRY AND LOOP AGAIN ; N.CRLF LD C,12H ;TOKEN CALL F.BDOS ;GET INFO CP 0FFH ;TEST IF FOUND JR NZ,D.LOOP ;MORE DIRECTORY TO ;WORK ; ;CALCULATE NUMBER OF REMAING FREE KILLOBYTES ;ON DISK AND OUTPUT THE DATE ; DB 0FDH,2CH ;[ INC Y' ] DB 0FDH,2DH ;[ DEC Y' ] TEST FOR ;ZERO CALL NZ,CR.LF ;OUTPUT REMAINING ;TABLE DATE CALL CR.LF LD B,0AH ;MESSAGE TOKEN CALL MSGFIND ;OUTPUT MESSAGE LD C,19H ;TOKEN FOR GETTING DRIVE CALL JBDOS ;GET DRIVE NO ADD 41H ;CONVERT TO ASCII LD HL,BUFAD ;OUTPUT BUFFER LD (HL),A ;STORE DRIVE NO INC HL LD A,':' LD (HL),A ;STORE [ : ] INC HL LD A,' ' LD (HL),A INC HL PUSH HL ;SAVE BUFFER POSITION ; ;FIND BIT MAP AND CALCULATE NO OF USED CLUSTERS ; LD C,1BH ;TOKEN FOR BIT MAP ADR. CALL JBDOS ;GET ADDRESS LD BC,2000H ;32 BYTES; 0 SECTORS ; ;CALCULATE SECTORS USED ; S.LOOP LD D,8 ;8 CLUSTERS PER BYTE LD A,(HL) ;GET BITE BYTE INC HL ;POINT TO NEXT BYTE ; B.LOOP RLCA ;CARRY IF CLUSTER IS ;USED JR NC,N.USE ;NOT USED INC C ;ADD 1 TO CLUSTER COUNT ; N.USE DEC D ;ONE LES BIT TO CHECK JR NZ,B.LOOP ;MORE BITS TO CHECK ; DJNZ S.LOOP ;MORE BYTES TO CHECK ; ;GET MAX HEX SECTORS ; LD HL,(BDOS+1) ;GET ADDRESS LD L,3EH ;POINT TO MAX SECTORS LD A,(HL) ;GET MAX SECTORS INC A ;TOTAL NUM. OF CLUSTERS ;AVAILABLE ON DISK SUB C ;SUBTRACT USED CLUSTERS POP HL ;GET BUFFER POSITION GNUMS CALL G.NUM ;GET DECIMAL NUMBER ;AND STORE INFO. LD A,'K' ;GET A K FOR KILOBYTES LD (HL),A ;STORE INC HL CALL DATOUT ;OUTPUT DATA CALL CR.LF ;TEMIMNATE LINE JP END.IT ;END OF ROUTINE ; ;CONVERT HEXIDECIMAL ACCUMULATOR TO DECIMAL ;CONVERT HEXAD5ECIMAL ACCUMULATOR TO DECIMAL ;NUMBER AND STORE ; G.NUM PUSH HL ;SAVE START LD BC,0230H ;3 DIGITS, ASCII [ 0 ] LD D,C ;TRANSFER THAT 30H ; G.NUM2 CP 100 ;TEST FOR 100 DEC. JR C,G.NUM3 ;TO SMALL INC D ;ADVANCE BY 100 SUB 100 ;SUBTRACT 100 DEC. JR G.NUM2 ;TRY AGAIN ; G.NUM3 LD (HL),D ;STORE COUNT INC HL LD D,C ;TRANSFER 30H ; G.NUM4 CP 10 ;TEST FOR 10 DECIMAL JR C,G.NUM5 ;NO 10'S INC D ;ADVANCE COUNT SUB 10 ;SUBTRACT 10 DECIMAL JR G.NUM4 ; G.NUM5 LD (HL),D ;STORE NUMBER INC HL OR C ;CONVERT TO NUMBER LD (HL),A ;STORE NUMBER INC HL EX (SP),HL ;STORE END POSITION ; ;FILL LEADING ZEROS WITH SPACES ; G.NUM6 LD A,30H ;LOAD A ASCII ZERO CP (HL) ;TEST IF ZERO JR NZ,G.NUM7 ;NO MORE FILL LD (HL),' ' ;REPLACE WITH SPACE INC HL DJNZ G.NUM6 ;TRY NEXT DIGIT ; G.NUM7 POP HL ;RETREIVE END POSITION RET ; ;CONVERT HEX DIGIT TO ASCII CHARACTER ; XCHASE AND 0FH ;STRIP OFF UPER ADD 30H ;MAKE INTO ASCII CP 3AH ;TEST FOR LETTER JR C,CHASEX ;NO LETTER ADD 7 ;CONVERT TO LETTER ; CHASEX LD (HL),A ;STORE DIGIT INC HL RET ; ZNLOOP LD A,(DE) ;GET CHAR CP '$' ;TEST FOR TROUBLES JR NZ,DLX ;NO TROUBLES LD A,';' ;CHANGE CHARACTER DLX LD (HL),A ;STORE CHAR INC HL ;NEXT POSITION INC DE DJNZ ZNLOOP ;MORE TO TRANSFER ; RET ; ;PRINT INFOMATION ABOUT DISK FILE ; F.INFO CALL F.FILE ;FIND DISK FILE ON ;DRIVE SPECIFIED ; LD C,0 ;ZERO FILE SIZE PUSH BC ;HIDE ; ;POINT TO WHERE CLUSTER NUMBERS START AND ;COUNT CLUSTERS IN EXTENT ; INFLOOP LD HL,DBUFAD ;ADDRESS OF BUFFER LD DE,10H ;OFFSET ADD HL,DE ;START OF NAMES LD DE,20H ;STEP VALUE AND 3 ;STRIP UPPERS JR Z,F.INF5 ;NO ADVANCE LD B,A ;SET FOR DJNZ ; F.INF4 ADD HL,DE ;ADVANCE POINTER DJNZ F.INF4 ;KEEP ADVANCING ; ;TEST FOR USED CLUSTERS ; F.INF5 XOR A ;TEST CHARACTER POP BC ;RETREIVE CLUSTER USED LD B,10H ;16 TRIES ; F.INF6 CP (HL) ;TEST IF USED JR Z,F.INF7 ;END OF CLUSTERS INC HL INC C ;ADVANCE CLUSTER COUNT DJNZ F.INF6 ;KEEP TESTING ; ;CHECK IF THERE IS A NOTHER EXTENT ; F.INF7 PUSH BC ;SAVE COUNT LD C,12H ;TOKEN FOR FIND NEXT CALL F.BDOS ;GET INFO CP 0FFH ;TEST FOR EXISTANCE JR NZ,INFLOOP ;KEEP COUNTING ; ;PRINT OUT MESSAGE AND PROCESS DATA ; CALL CR.LF ;GET A NEW LINE LD B,0BH ;MESSAGE TOKEN CALL MSGFIND ;OUTPUT MESSAGE POP BC ;RETREIVE COUNT LD A,C ;TRANSFER COUNT LD HL,BUFAD JP GNUMS ;CONTINUE ELSE WHERE ; ; ;GO COMMAND - *********** ; GO CALL C.HEX ;GET HEX ADDRESS LD DE,BDOS ;ADDRESS BDOS INPUTS LD BC,W.BOOT ;WHERE TO RESET Z-DOS JP (HL) ;GO TO ASSIGNED ADDRESS ; ;RESET ZDOS, SELECT DRIVE A ; RESET LD C,0DH ;TOKEN FOR RESET JP JBDOS ;RESET SYSTEM ; ; ;START OF SECTOR'S ROUTINE ; ;CALCULATES BYTES AVAILABLE THEN CONVERTS INTO ;SECTORS. USED TO SET MAXIUM NUMBER OF SECTORS ;READ BY THE LOAD ROUTINE. THE WRITE ROUTINE ;USES THIS ROUTINE TO DETERMINE HOW MANY SECTORS ;TO WRITE ; SECTORS XOR A ;CLEAR CARRY FLAG SBC HL,DE ;GET BYTE COUNT LD A,L ;LESS THAN PAGE TO A. LD L,H ;PAGES TO L LD H,0 ;ZERO OUT H REG. ADD HL,HL ;CONVERT PAGES TO ;SECTORS BIT 7,A ;SECTOR TEST NO. 1 JR Z,NOSEC2 ;NO SECTOR HERE INC HL ;SECTOR EXISTED ; NOSEC2 AND 7FH ;SECTOR TEST NO 2 JR Z,TESTEND ;NO SECTOR HERE INC HL ;SECTOR EXISTS ; TESTEND LD B,H LD C,L RET ; ;RESET BUFFADS ; RESET2 LD HL,0 ;GET 16 BIT ZERO LD (HEXAD6),HL LD (L.END),HL ;SET NO RESAVES LD HL,0100H ;ADD OF GO GO LD (HEXAD5),HL RET ; ;MAKE FILE CONTROL BLOCK ; X.FCB CALL RESET2 ;RESET HEXAD5 AND HEXAD6 CALL M.FCB ;START FILE CTRL BLOCK CP '.' ;TEST FOR PERIOD JP NZ,SYNTAX ;MUST BE A PERIOD CALL M.FCB3 ;FINISH FCB CP ' ' ;TEST FOR SPACE RET ;RETURN TO CALLER ; ;MOVES DATA FROM INPUT BUFFER TO FILE CONTROL ;WITH DEFALT FILE TYPE {COM} ; M.FCB XOR A ;GET A ZERO LD (E.BYTE),A ;JP SYNTAX ON ERROR ; CALL FCBX.0 ;SETUP DATA ; M.FCB1 LD DE,FCB+1 ;ADDRESS OF FILE CONTROL ;BLOCK LD B,8 ;MAX NUMBER OF SPACES LD A,(IX+00) ;GET FIRST CHAR. CALL CHECKER ;TEST IF LEGAL LD (DE),A ;STORE ; M.FCB2 INC IX ;ADVANCE INC DE LD A,(IX+00) ;GET NEXT CHAR. CP 0 ;TEST FOR END RET Z ;END OF COMMAND LINE CP '.' ;TEST FOR DELIMETER RET Z ;DONE CP ' ' ;TEST FOR SPACE RET Z ;END OF COMMAND CALL CHECKER ;CHECK OUT CHAR. LD (DE),A ;STORE CHARACTER DJNZ M.FCB2 ;MORE TO GO ; JP SYNTAX ;SYNTAX ERROR ; ;PART 2 OF MAKE FILE CONTROL BLOCK ;SETS UP FILE TYPE ; M.FCB3 LD DE,FCB+9 ;START OF FILE TYPE ; INC IX ;NEXT SOURCE POSITION LD B,3 ;MAX OF THREE CHAR. ; M.FCB5 LD A,(IX+00) ;GET CHARACTER CP 0 ;TEST FOR END JP Z,SYNTAX ;TOO SOON CALL CHECKER ;CHECK OUT CHAR LD (DE),A ;STORE CHARACTER. INC IX INC DE DJNZ M.FCB5 ;MORE TO GO ; LD A,(IX+00) ;GET CHARICTOR RET ; WILDS2 LD DE,FCB+9 ;START AT RIGHT PLACE ; WILDS LD A,'?' ;GET A QUSTION MARK ; FILLS LD (DE),A INC DE DJNZ FILLS ;MORE TO GO ; INC IX ;POINT TO NEXT BYTE RET ; ;SETUP ROUTINE ; ;ZERO OUT FILE CONTROL BLOCK AND INSTALE ;DEFUALT FILE NAME {COM} ; FCBX.0 LD HL,FCB ;ADDRESS OF BUFFER CALL I.FCB ;INITILIZE FCB XOR A LD (HL),A ;ZERO END CHAR ; ;PLACE DEFALT FILE TYPE IN FILE CONTROL BLOCK ; LD HL,FCB+9 ;FILE TYPE STARTS HERE LD A,'C' ;'COM' FILE TYPE FOR LD (HL),A INC HL LD A,'O' LD (HL),A INC HL LD A,'M' LD (HL),A RET ; ;INITILIZE FILE CONTROL BLOCK WITH 00 AND SPACES ; I.FCB LD BC,2020H ;B REG 20 TIMES, C REG ;' ' PUSH HL ;SAVE START XOR A ;GET A ZERO ; FLOOP LD (HL),A ;PLACE A ZERO INC HL DJNZ FLOOP ;CONTINUE ; EX DE,HL ;SAVE END ADDRESS POP HL INC HL LD B,11 ;READY FOR SPACES ; SPACES LD (HL),C ;PLACE A SPACE INC HL DJNZ SPACES ;MORE SPACES ; EX DE,HL ;END IN HL REG. RET ; ;TEST FOR ILLEGAL CHARACTERS ;CHARACTER TO BE TESTED IS IN A ; CHECKER LD HL,SYNTAX ;GO TO SYNTAX ON ERROR PUSH HL ;MAKE RETUNS JUMP CP '"' ;TEST FOR [ " ] RET C ;CHAR IS CTRL CHAR RET Z ;IS A SPACE ; ;FORCE UPPER CASE TO LOWER CASE ; CP 61H JR C,CHECK3 ;NOT UPPER CASE CP 7BH ;ABOVE UPPER CASE JR NC,CHECK3 ;NO FORCE AND 5FH ;MAKE LOWER CASE ; CHECK3 CP ' ' ;TEST FOR ASTRIST RET C ;SYNTAX ERROR CP '>' RET Z CP '<' RET Z CP 7FH ;UNDERLINE BACK SPACE RET Z CP '.' RET Z CP ';' RET Z CP ':' RET Z ; POP HL ;REMOVE RETURN JUMP ;TO ERROR RET ; F.START LD A,(IX+00) ;GET CHAR CP ' ' ;TEST FOR SPACE RET NZ ;NO SPACE INC IX ;TRY NEXT PLACE JR F.START ; HXOUT LD B,A ;SAVE CHAR. RRCA ;GET IN POSITION RRCA RRCA RRCA CALL XCHASE ;MAKE AND STORE HIGH BIT LD A,B ;RETREIVE FOR LOW BYTE JP XCHASE ;MAKE LOW BYTE ; AD.OUT EX DE,HL ;IN POSITION LD HL,BUFAD ;START OF BUFFER LD A,D ;READY CALL HXOUT ;OUTPUT HIGH ADD LD A,E ;READY CALL HXOUT ;OUTPUT LOW BYTE LD A,'H' ;H FOR END LD (HL),A ;STORE INC HL JP DATOUT ;OUTPUT ADDRESS ; ;CONVERT ASCII HEX TO 2 DIGIT HEX NUMBER ; C.HEX CALL F.START ;REMOVE SPACES LD B,5 ;MAX CHAR INPUT LD HL,0 ;ZERO HL REG OR A ;TEST FOR 00H RET Z ; C.HEX2 LD A,(IX+00) ;GET FIRST CHAR CP 30H ;TEST FOR SEPERATOR RET C ;DONE INC IX ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,HL CALL TSTHX ;TEST IF HEX JR NC,S.ERR ;NOT HEX ADD L LD L,A ;INCLUDE NEW DATA DJNZ C.HEX2 ;CONTINUE ; S.ERR JP SYNTAX ;TOO MANY INPUTS ; ;TEST FOR HEX ; TSTHX SUB 30H ;TEST FOR HEX CP 10 ;LESS THAN [ : ] RET C ;CHAR. WAS 0 TO 9 SUB 10H ;GET READY FOR HEX CP 7 ;TEST FOR A THROUGH F RET NC ;NOT A THORUGH F ADD 9 ;CONVERT TO HEX SCF ;SET CARRY FLAG RET ;RETURN AS HEX ; E.BYTE DB 0 ; FCB DB 0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0 DB 0,0 ; ;MESSAGE TABLE ; MSGTBL DM 'A>-' ;PROMPT ;01 CRLF.0 DB 0DH,8AH ;CRLF ;02 DM 'FILE NOT FOUND' ;03 DM 'SYNTAX ERROR' ;04 DM 'NO DIRECTORY SPACE' ;05 DM 'DISK FULL' ;06 DM 'NO LOAD ROOM' ;07 DM 'COMMAND ERROR' ;08 DM 'FILE EXISTS' ;09 DM ' BYTES REMAINING ON ' ;0A DM ' FILE SIZE ' ;0B DM 'CANNOT CLOSE FILE' ;0C N.MSG DM '00000 ' ;0D DM 'LAST BYTE LOADED ' ;0E DM 'SNOOPY SOURCE ON LINE' ; ;ASCII COMMAND TABLE ; CNAMES DM 'ERASE' ;00 DM 'DIR' ;02 DM 'GO' ;05 DM 'RESET' ;06 DM 'LOAD' ;07 DM 'ENTER' DM 'DUMPA' DM 'DUMP' DM 'LIST' DM 'SOURCE' DB 0 ; ;COMMAND TABLE ; CMDTBL DW ERA ;00 DW DIR ;02 DW GO ;05 DW RESET ;06 DW LOAD ;07 DW ENTER DW DPHEX DW DPHEX DW ZDISA1 DW ZDISA2 DB 0,0 ; 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,0ED0H ;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 ; 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 ; 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 ; 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 PUSH IX POP HL ;TRANSFER POINTER LD A,'V' ;START LETTER ADD H ;GET LETTER CALL OUTPUT LD A,'.' ;GET A PERIOD CALL OUTPUT ;OUTPUT IT LD A,L CALL HEXOUT RET ; ;OUTPUT SMO NUMBER AND THE OUTSM2: LD B,8 ;NO. SM0 SPACES CALL SM0IT CP 0 ;0 IN ACCUM. RET Z ;YES LD A,0FEH ;FLAG AS USED LD (IY+00),A ;STORE USED FLAG CALL OUTSM0 DB 0,0 ;LD A,'A' DB 0,0,0 ;CALL OUTPUT LD B,4 ;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 LD A,(OUTBYT) BIT 2,A CALL Z,OFFADR ;PRINT ADDRESS LD B,2 ;TWO SPACES CALL XSPACE ;OUT TWO SPACES LD A,(IBUF) ;GET CTRL AND 7 ;STRIP FLAGS LD B,A ;GET BYTES IN B REG. LD C,10 ;MAX SPACES HEXOT2: LD A,(OUTBYT) BIT 2,A CALL Z,MOUT ;OUTPUT INSTRUCTION INC HL ;INCREASE ADDRESS DEC C ;REDUCE SPACES DEC C DJNZ HEXOT2 ;REPEAT LD B,C ;SET FOR RSPACE CALL XSPACE ;OUTPUT SPACES LD (HERE4),HL ;SAVE NEXT ADR. CALL A.CNT LD DE,(HERE) ;READY FOR SM0IT LD HL,(OFSET) ADD HL,DE ;CALCULATE EX DE,HL CALL OUTSM2 ;OUT SM0 & NUMBER CALL TSPACE ;OUT REMAING SPACES LD HL,(HERE) ;GET POSITION LD (DIHXAD),HL ;START DISASA OUT CALL ZDISA ;CALL DISASS. 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 ; ;ZERO COUNTER ; Z.CNT: LD HL,L.ADR ;ADDRESS OF LINE NO. LD A,'0' ;GET A ZERO LD B,4 ;4 ZEROS Z.CNT2: LD (HL),A ;STORE INC HL ; DJNZ Z.CNT2 ;ADVANCE ZEROS RET ; ;ADVANCE COUNTER BY ONE ; A.CNT: LD A,(OUTBYT) BIT 2,A RET NZ ;IN DISK MODE LD HL,L.ADR+3 ;LOWEST DIGIT A.CNT2: LD A,(HL) ;GET PRESENT COUNT CP '9' ;TEST FOR 9 JR Z,N.DIG ;ZERO; NEXT DIGIT INC (HL) ;INCREASE DIGIT NO JR OT.CNT ; N.DIG: LD A,'0' ;GET A ZERO LD (HL),A ;STORE THAT ZERO DEC HL ;READ FOR NXT TEST JR A.CNT2 ;NEXT TEST ; ;OUTPUT COUNTER ; OT.CNT: LD HL,L.ADR ;GET HIGEST DIGIT LD B,4 ;FOUR DIGITS O.CNT2: LD A,(HL) ;GET DIGIT CALL OUTPUT ;OUTPUT DIGIT INC HL ;NEXT DIGIT DJNZ O.CNT2 ;POINT TO NEXT DIGIT LD B,3 ;TWO SPACES JP RSPACE ;OUTPUT SPACES ; ;OUTPUT TWO BYTES IN ASSEMBLER FORMAT ; HXOUT2: PUSH BC LD B,A CALL HEX01A JR C,NO0 ;NO LEAD ZERO PUSH AF LD A,'0' ;GET A ZERO CALL OUTPUT ;OUTPUT THAT ZERO POP AF NO0: CALL OUTPUT ;OUTPUT HIGH DIGIT CALL CHASE1 ;MAKE UP LOW DIGIT CALL OUTPUT ;OUTPUT LOW DIGIT LD A,'H' CALL OUTPUT ;MAKE INTO HEX POP BC RET ; HEX01A: RRCA RRCA RRCA RRCA JR CHASE2 ; CHASE1: LD A,B CHASE2: AND 0FH ADD 30H CP 3AH RET C ADD 7 SCF CCF ;SET NC RET ; ;OUTPUT EQUATE TABLE ROUTINES ; OT.EQU: CALL XLINE CALL XLINE LD HL,DMSG3 CALL BUFOT2 CALL XLINE LD IX,0 ;ZERO SM00 COUNT LD IY,TABSTA ;START OF TABLE EQREP: LD A,(IY+00) ;GET NO. OF CALLS CP 0 ;TEST FOR END OF ENTRYS JR Z,END2 CP 0FFH ;TEST FOR END TABLE JR Z,END2 CP 0FEH ;TEST IF USED AS LABLE JR Z,INCER ;ADVANCE AND NEXT TEST LD L,(IY+02) ;GET LOW ADDRESS LD H,(IY+01) ;GET HIGH ADDRESS CALL CRLF LD A,(OUTBYT) ;PREPARE FOR TEST BIT 2,A ;TEST FOR DISK JR NZ,DISKOT ;JUMP IF DISK LD B,6 ;SPACES FOR ADDRESS CALL RSPACE ;OUTPUT SPACES LD A,'(' CALL OUTPUT CALL ADOUT ;OUTPUT ADDRESS OF EQU LD A,')' CALL OUTPUT LD B,4 CALL RSPACE DISKOT: PUSH HL CALL A.CNT ;OUTPUT LINE NO & SPAC. ;NO LINE NO FOR DISK CALL OUTSM0 ;OUTPUT SM0 NUMBER LD A,':' CALL OUTPUT LD B,2 ;TWO SPACES CALL TSPACE LD HL,EQUMSG CALL BUFOT2 ;OUTPUT (EQU) LD B,5 ;SPACES CALL TSPACE POP HL ;GET ADDRESS LD A,H ;GET HIGH BYTE CALL HEX01A ;TEST FOR LETTER JR C,NO.LET LD A,'0' ;GET LEADING ZERO CALL OUTPUT NO.LET: CALL ADOUT ;OUTPUT ADDRESS LD A,'H' ;FLAG FOR HEX CALL OUTPUT INCER: INC IX INC IY INC IY INC IY ;ADVANCE COMPLETED JR EQREP ;NEXT PASS ; END2: CALL XLINE CALL XLINE LD HL,DMSG4 CALL BUFOT2 ;OUTPUT MESSAGE RET ; EQUMSG: DM 'EQU' DMSG1: DM 'DISASSEMBLED BY SNOOPY SOURCE' DMSG2: DM 'SOURCE FROM SNOOPY SOURCE' DMSG3: DM 'EQUATE TABLE' DMSG4: DM 'END OF DATA' ; ;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 ; 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 ; 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 ; 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 ; 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 ; 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 END.IT ; 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 HXOUT2 JP TOKRET ; ADOUT2: PUSH HL ;SAVE MSG ADR LD HL,(SM0ADR);GET ADR ; ;GET SM0 MUMBER FOR OUTPUT ; PUSH BC PUSH DE PUSH IX PUSH IY EX DE,HL CALL SM0IT CALL OUTSM0 POP IY POP IX POP DE POP BC ; POP HL RES 7,B ;SET FOR REPOT JP TOKRET ; 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 HXOUT2 ; 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,08H ;SET FOR REPOT LD HL,TABMN4 ;ADD ADC SUB CALL AND38 ;OUTPUT MNEMONIC CALL TSPACE ;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,08H ;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 08H ;TEST FOR OUTPUT JR NZ,CRSPAC ;HEAD FOR REPOT LD HL,TABCB1 ;RLC, RRC, RL RR CALL AND38 ;OUTPUT ROTATE TYPE CRSPAC: CALL TSPACE ;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,8 ;MAX OF 6 SPACES CALL MSGFND ;OUTPUT MNEMONIC CALL TSPACE JP PCOMD ; 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 ; ; ; ;BUFFERS ; L.END DB 0,0 DRIVE DB 0 HEXAD DB 0,0 HEXAD2 DB 0,0 HEXAD3 DB 0,0 HEXAD4 DB 0,0 HEXAD5 DB 0,0 HEXAD6 DB 0,0 OUTBYT DB 0,0 HEXADT DB 0,0 OFSET DB 0,0 D.BYTE DB 0 IBUF DB 0 SM0ADR DB 0,0 HERE DB 0,0 HERE4 DB 0,0 DIHXAD DB 0,0 DB 0 L.ADR DB 0,0,0,0 BUFSIZ DB 0,0 P.POINT DB 0,0 ; DS 20H ;SPARE BYTES ; XBUF DB 3FH ;START OF INPUT BUF BUF.CH DB 0 ;CHAR IN BUFFER BUFAD DS 40H ;START OF BUFFER DBUFAD DS 80H ;MAIN BUFFER DS 50H ;SPACE FOR STACK STACK DB 0 TABSTA DB 0 ;START OF CR TABLE ; END AD DS 80H ;MAIN BUFFER DS 50H ;SPACE FOR STACK STACK DB 0 TABSTA DB 0 ;START OF CR TABLE ;