ееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееее-CATALOG060CPUDIAG ASMo CPUDIAG DOCMEMDIAG DOC]3812DIAGASMЂ !"#$%&'()*+,-.3812DIAGASMЂ/0123456789:;<=>3812DIAGASMЂ?@ABCDEFGHIJKLMN3812DIAGASMЂOPQRSTUVWXYZ[\]^&L REGS. TO D&E REGS. MVI C,9 ;LET BDOS KNOW WE WANT TO SEND A MESSAGE CALL BDOS POP D ;BACK FROM EXILE RET ; ; ; ;CHARACTER OUTPUT ROUTINE ; PCHAR: MVI C,2 CALL BDOS RET ; ; ; BYTEO: PUSH PSW CALL BYTO1 MOV E,A CALL PCHAR POP SIG/M.LIB SUBMITTAL FORM 60.1 11K ZILASM.COM 6502 SIMULATOR 60.2 5K ZX65.COM 60.3 94K ZX65R.PRN *** has a bad sector (marked) *** 60.4 39K ZX65R.ZSM 60.5 15K ZXART.DOC 60.6 9K ZXHINTS.DOC 60.7 23K ZXLDR.PRN 60.8 7K ZXLDR.ZSM 60.9 1K ZXTAB1.ееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееее'S GROUP BY: ;KELLY SMITH, MICROCOSM ASSOCIATES ;3055 WACO AVENUE ;SIMI VALLEY, CALIFORNIA, 93065 ;(805) 527-9321 (MODEM, CP/M-NET (TM)) ;(805) 527-0518 (VERBAL) ; ; ; ; ; ; ORG 00100H ; ; ; JMP CPU ;JUMP TO 8080 CPU DIAGNOSTIC ; ; ееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееее3812DIAGASMЂ_`abcdefghijklmn3812DIAGASMdopqrstuvwxyz{ееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееS VOLUME WAS ASSEMBLED BY SIG/M, A USERS GROUP IN NEW JERSEY.  1K ZAPMON.MOS ZAPPLE MONITOR FOR 6502 60.15 5K ZAPMON.HEX 60.16 3K ZAP1.INS 60.17 11K ZAP3.INS 60.18 3K ZAP5.INS THIDOC 60.10 1K ZXTAB2.DOC 60.11 1K ZXTAB3.DOC 60.12 1K ZXTAB4.DOC 60.13 2K CONCOD.LIB CONTROL CODES FOR 6502 ZAPPLE 60.14 1K ZAPMON.MOS ZAPPLE MONITOR FOR 6502 60.15 5K ZAPMON.HEX 60.16 3K ZAP1.INS 60.17 11K ZAP3.INS 60.18 3K ZAP5.INS THIееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееее; DB 'MICROCOSM ASSOCIATES 8080/8085 CPU DIAGNOSTIC' DB ' VERSION 1.0 (C) 1980' ; ; ; BDOS EQU 00005H ;BDOS ENTRY TO CP/M WBOOT EQU 00000H ;RE-ENTRY TO CP/M WARM BOOT ; ; ; ;MESSAGE OUTPUT ROUTINE ; MSG: PUSH D ;EXILE D REG. XCHG ;SWAP H CPMUG: VOLUME 60 6502 SIMULATOR - REFERENCE DR. DOBBS 8/80 6502 ZAPPLE MONITOR SIZE NAME CONTENTS -CATALOG.060 CONTENTS OF CP/MUG VOLUME 60 ABSTRACT.060 DESCRIPTION OF EACH MODULE IN THE 6502 SIMULATOR UGFORM.LIB SUBMITTAL FORM ееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееее;*********************************************************************** ; MICROCOSM ASSOCIATES 8080/8085 CPU DIAGNOSTIC VERSION 1.0 (C) 1980 ;*********************************************************************** ; ;DONATED TO THE "SIG/M" CP/M USERееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееее PSW CALL BYTO2 MOV E,A JMP PCHAR BYTO1: RRC RRC RRC RRC BYTO2: ANI 0FH CPI 0AH JM BYTO3 ADI 7 BYTO3: ADI 30H RET ; ; ; ;************************************************************ ; MESSAGE TABLE FOR OPERATIONAL CPU DI 080H ;A=D3H,C=0,P=0,S=1,Z=0 RM ;TEST "RM" CALL CPUER TCPI: RM ;TEST "RM" ADI 040H ;A=79H,C=0,P=0,S=0,Z=0 CNC CNCI ;TEST "CNC" ADI 040H ;A=53H,C=0,P=1,S=0,Z=0 RP ;TEST "RP" CALL CPUER CNCI: RC ;TEST "RC" ADI 08FH ;A=08H,C=1,P=0,S=0,0AH ;A=F5H+0AH+CARRY(1)=0,C=1 ACI 00AH ;A=0+0AH+CARRY(0)=0BH,C=0 CPI 00BH JZ SUII ;TEST "ACI" CALL CPUER SUII: SUI 00CH ;A=FFH,C=0 SUI 00FH ;A=F0H,C=1 CPI 0F0H JZ SBII ;TEST "SUI" CALL CPUER SBII: SBI 0F1H ;A=F0H-0F1H-CARRY(0)=FFH,C=1 S AND "RST 0" THRU "RST 7" ; ; ; ;TEST JUMP INSTRUCTIONS AND FLAGS ; CPU: LXI SP,STACK ;SET THE STACK POINTER ANI 0 ;INITIALIZE A REG. AND CLEAR ALL FLAGS JZ J010 ;TEST "JZ" CALL CPUER J010: JNC J020 ;TEST "JNC" CALL CPUER J020: JPE J030 ;G BRANCH CALL CPUER C030: ANI 0FFH ;SET FLAGS BACK! CPO CPOI ;TEST "CPO" CPI 0D9H JZ MOVI ;TEST "CALL" SEQUENCE SUCCESS CALL CPUER CPOI: RPE ;TEST "RPE" ADI 010H ;A=99H,C=0,P=0,S=1,Z=0 CPE CPEI ;TEST "CPE" ADI 002H ;A=D9H,C=0,P=0,S=1,Z=0TEST "JC" CALL CPUER J160: JZ J170 ;TEST "JZ" JPO J170 ;TEST "JPO" JM AIMM ;TEST "JM" J170: CALL CPUER ; ; ; ;TEST ACCUMULATOR IMMEDIATE INSTRUCTIONS ; AIMM: CPI 0 ;A=F5H,C=0,Z=0 JC CPIE ;TEST "CPI" FOR RE-SET CARRY JZ CPIE ;TEST "CPI" FOTEST ;************************************************************ ; OKCPU: DB 0CH,0DH,0AH,' CPU IS OPERATIONAL$' ; NGCPU: DB 0CH,0DH,0AH,' CPU HAS FAILED! ERROR EXIT=$' ; ; ; ;************************************************************ ; "ORI" CALL CPUER XRII: XRI 00FH ;A=7AH0FH=75H,C=0,P=0,S=0,Z=0 CPI 075H JZ C010 ;TEST "XRI" CALL CPUER ; ; ; ;TEST CALLS AND RETURNS ; C010: ANI 000H ;A=0,C=0,P=1,S=0,Z=1 CC CPUER ;TEST "CC" CPO CPUER ;TEST "CPO" CM CPUER ;TEST "CMBI 00EH ;A=FFH-OEH-CARRY(1)=F0H,C=0 CPI 0F0H JZ ANII ;TEST "SBI" CALL CPUER ANII: ANI 055H ;A=F0H55H=50H,C=0,P=1,S=0,Z=0 CPI 050H JZ ORII ;TEST "ANI" CALL CPUER ORII: ORI 03AH ;A=50H3AH=7AH,C=0,P=0,S=0,Z=0 CPI 07AH JZ XRII ;TEST TEST "JPE" CALL CPUER J030: JP J040 ;TEST "JP" CALL CPUER J040: JNZ J050 ;TEST "JNZ" JC J050 ;TEST "JC" JPO J050 ;TEST "JPO" JM J050 ;TEST "JM" JMP J060 ;TEST "JMP" (IT'S A LITTLE LATE,BUT WHAT THE HELL! J050: CALL CPUER J060: ADI 6 ;A=6,C= RPO ;TEST "RPO" CALL CPUER CPEI: RPO ;TEST "RPO" ADI 020H ;A=B9H,C=0,P=0,S=1,Z=0 CM CMI ;TEST "CM" ADI 004H ;A=D7H,C=0,P=1,S=1,Z=0 RPE ;TEST "RPE" CALL CPUER CMI: RP ;TEST "RP" ADI 080H ;A=39H,C=1,P=1,S=0,Z=0 CP TCPI ;TEST "CP" AR RE-SET ZERO CPI 0F5H ;A=F5H,C=0,Z=1 JC CPIE ;TEST "CPI" FOR RE-SET CARRY ("ADI") JNZ CPIE ;TEST "CPI" FOR RE-SET ZERO CPI 0FFH ;A=F5H,C=1,Z=0 JZ CPIE ;TEST "CPI" FOR RE-SET ZERO JC ACII ;TEST "CPI" FOR SET CARRY CPIE: CALL CPUER ACII: ACI 0 8080/8085 CPU TEST/DIAGNOSTIC ;************************************************************ ; ;NOTE: (1) PROGRAM ASSUMES "CALL",AND "LXI SP" INSTRUCTIONS WORK! ; ; (2) INSTRUCTIONS NOT TESTED ARE "HLT","DI","EI","RIM","SIM", ; " CNZ CPUER ;TEST "CNZ" CPI 000H JZ C020 ;A=0,C=0,P=0,S=0,Z=1 CALL CPUER C020: SUI 077H ;A=89H,C=1,P=0,S=1,Z=0 CNC CPUER ;TEST "CNC" CPE CPUER ;TEST "CPE" CP CPUER ;TEST "CP" CZ CPUER ;TEST "CZ" CPI 089H JZ C030 ;TEST FOR "CALLS" TAKINJZ" JNC J120 ;TEST "JNC" J110: CALL CPUER J120: ADI 081H ;A=F7H,C=0,P=0,S=1,Z=0 JM J130 ;TEST "JM" CALL CPUER J130: JZ J140 ;TEST "JZ" JC J140 ;TEST "JC" JPO J150 ;TEST "JPO" J140: CALL CPUER J150: ADI 0FEH ;A=F5H,C=1,P=1,S=1,Z=0 JC J160 ;0,P=1,S=0,Z=0 JNZ J070 ;TEST "JNZ" CALL CPUER J070: JC J080 ;TEST "JC" JPO J080 ;TEST "JPO" JP J090 ;TEST "JP" J080: CALL CPUER J090: ADI 070H ;A=76H,C=0,P=0,S=0,Z=0 JPO J100 ;TEST "JPO" CALL CPUER J100: JM J110 ;TEST "JM" JZ J110 ;TEST "Z=0 CC CCI ;TEST "CC" SUI 002H ;A=13H,C=0,P=0,S=0,Z=0 RNC ;TEST "RNC" CALL CPUER CCI: RNC ;TEST "RNC" ADI 0F7H ;A=FFH,C=0,P=1,S=1,Z=0 CNZ CNZI ;TEST "CNZ" ADI 0FEH ;A=15H,C=1,P=0,S=0,Z=0 RC ;TEST "RC" CALL CPUER CNZI: RZ ;TEST "RZ" PUER ;TEST "ADC" M MVI A,080H ADD A SBB M CPI 0CDH CNZ CPUER ;TEST "SBB" M ANA M CNZ CPUER ;TEST "ANA" M MVI A,025H ORA M CPI 037H CNZ CPUER ;TEST "ORA" M XRA M CPI 005H CNZ CPUER ;TEST "XRA" M MVI M,055H INR M DCR M ADD MVI L,0BFH ANA A ANA C ANA D ANA E ANA H ANA L ANA A CPI 024H CNZ CPUER ;TEST "ANA" B,C,D,E,H,L,A XRA A MVI B,001H MVI C,002H MVI D,004H MVI E,008H MVI H,010H MVI L,020H ORA B ORA C ORA D ORA E ORA H ORA L OR ;TEST "MOV" A,H,D,B,L,E,C,A MOV D,A INR D MOV L,D MOV C,L INR C MOV H,C MOV B,H DCR B MOV E,B MOV A,E ;TEST "MOV" A,E,B,H,C,L,D,A MOV E,A INR E MOV B,E MOV H,B INR H MOV C,H MOV L,C MOV D,L DCR D MOV A,D ;TEST "MOV"ER ;TEST "MOV" M,H AND H,M MOV M,L MVI H,(TEMP0 / 0FFH) MVI L,(TEMP0 AND 0FFH) MOV L,M MVI A,(TEMP0 AND 0FFH) CMP L CNZ CPUER ;TEST "MOV" M,L AND L,M MVI H,(TEMP0 / 0FFH) MVI L,(TEMP0 AND 0FFH) MVI A,032H MOV M,A CMP M CNZ CPUER ; ADD B ADC C ADD B ADD B ADC D ADD B ADD B ADC E ADD B ADD B ADC H ADD B ADD B ADC L ADD B ADD B ADC A CPI 037H CNZ CPUER ;TEST "ADC" B,C,D,E,H,L,A MVI A,080H ADD A MVI B,001H SBB B MVI B,0FFH ADD B SBB C ADI 001H ;A=00H,C=1,P=1,S=0,Z=1 CZ CZI ;TEST "CZ" ADI 0D0H ;A=17H,C=1,P=1,S=0,Z=0 RNZ ;TEST "RNZ" CALL CPUER CZI: RNZ ;TEST "RNZ" ADI 047H ;A=47H,C=0,P=1,S=0,Z=0 CPI 047H ;A=47H,C=0,P=1,S=0,Z=1 RZ ;TEST "RZ" CALL CPUER ; ; ; ;TEST46H MVI E,047H MVI H,(TEMP0 / 0FFH) ;HIGH BYTE OF TEST MEMORY LOCATION MVI L,(TEMP0 AND 0FFH) ;LOW BYTE OF TEST MEMORY LOCATION MOV M,B MVI B,000H MOV B,M MVI A,044H CMP B CNZ CPUER ;TEST "MOV" M,B AND B,M MOV M,D MVI D,000H MOV D,MA A CPI 03FH CNZ CPUER ;TEST "ORA" B,C,D,E,H,L,A MVI A,000H MVI H,08FH MVI L,04FH XRA B XRA C XRA D XRA E XRA H XRA L CPI 0CFH CNZ CPUER ;TEST "XRA" B,C,D,E,H,L XRA A CNZ CPUER ;TEST "XRA" A MVI B,044H MVI C,045H MVI D,0 A,D,L,C,H,B,E,A MOV H,A DCR H MOV D,H MOV B,D MOV L,B INR L MOV E,L DCR E MOV C,E MOV A,C ;TEST "MOV" A,C,E,L,B,D,H,A MOV L,A DCR L MOV H,L MOV E,H MOV D,E MOV C,D MOV B,C MOV A,B CPI 077H CNZ CPUER ;TEST "MOV" A,B,TEST "MOV" M,A ADD M CPI 064H CNZ CPUER ;TEST "ADD" M XRA A MOV A,M CPI 032H CNZ CPUER ;TEST "MOV" A,M MVI H,(TEMP0 / 0FFH) MVI L,(TEMP0 AND 0FFH) MOV A,M SUB M CNZ CPUER ;TEST "SUB" M MVI A,080H ADD A ADC M CPI 033H CNZ C ADD B SBB D ADD B SBB E ADD B SBB H ADD B SBB L CPI 0E0H CNZ CPUER ;TEST "SBB" B,C,D,E,H,L MVI A,080H ADD A SBB A CPI 0FFH CNZ CPUER ;TEST "SBB" A MVI A,0FFH MVI B,0FEH MVI C,0FCH MVI D,0EFH MVI E,07FH MVI H,0F4H "MOV","INR",AND "DCR" INSTRUCTIONS ; MOVI: MVI A,077H INR A MOV B,A INR B MOV C,B DCR C MOV D,C MOV E,D MOV H,E MOV L,H MOV A,L ;TEST "MOV" A,L,H,E,D,C,B,A DCR A MOV C,A MOV E,C MOV L,E MOV B,L MOV D,B MOV H,D MOV A,H MVI A,046H CMP D CNZ CPUER ;TEST "MOV" M,D AND D,M MOV M,E MVI E,000H MOV E,M MVI A,047H CMP E CNZ CPUER ;TEST "MOV" M,E AND E,M MOV M,H MVI H,(TEMP0 / 0FFH) MVI L,(TEMP0 AND 0FFH) MOV H,M MVI A,(TEMP0 / 0FFH) CMP H CNZ CPU SUB B SUB C SUB D SUB E SUB H SUB L CPI 078H CNZ CPUER ;TEST "SUB" B,C,D,E,H,L SUB A CNZ CPUER ;TEST "SUB" A MVI A,080H ADD A MVI B,001H MVI C,002H MVI D,003H MVI E,004H MVI H,005H MVI L,006H ADC B MVI B,080H ADD BC,D,E,H,L,A ; ; ; ;TEST ARITHMETIC AND LOGIC INSTRUCTIONS ; XRA A MVI B,001H MVI C,003H MVI D,007H MVI E,00FH MVI H,01FH MVI L,03FH ADD B ADD C ADD D ADD E ADD H ADD L ADD A CPI 0F0H CNZ CPUER ;TEST "ADD" B,C,D,E,H,L,A M CPI 05AH CNZ CPUER ;TEST "INR","DCR",AND "MVI" M LXI B,12FFH LXI D,12FFH LXI H,12FFH INX B INX D INX H MVI A,013H CMP B CNZ CPUER ;TEST "LXI" AND "INX" B CMP D CNZ CPUER ;TEST "LXI" AND "INX" D CMP H CNZ CPUER ;TEST "LXI" AHL" CMA CMP H CNZ CPUER ;TEST "SPHL" AND "XTHL" LHLD SAVSTK ;RESTORE THE "OLD" STACK-POINTER SPHL LXI H,CPUOK PCHL ;TEST "PCHL" ; ; ; CPUER: LXI H,NGCPU ;OUTPUT "CPU HAS FAILED ERROR EXIT=" TO CONSOLE CALL MSG XTHL MOV A,H CALRLC" FOR ROTATION RRC CNC CPUER ;TEST "RRC" FOR SET CARRY RRC CPI 042H CNZ CPUER ;TEST "RRC" FOR ROTATION RAL RAL CNC CPUER ;TEST "RAL" FOR SET CARRY CPI 008H CNZ CPUER ;TEST "RAL" FOR ROTATION RAR RAR CC CPUER ;TEST "RAR" FOR RE- LDA TEMPP MOV B,A LDA TEMP0 CMP B CNZ CPUER ;TEST "LHLD" AND "SHLD" LDA TEMPP+1 MOV B,A LDA TEMP0+1 CMP B CNZ CPUER ;TEST "LHLD" AND "SHLD" MVI A,0AAH STA TEMP0 MOV B,H MOV C,L XRA A LDAX B CPI 0AAH CNZ CPUER ;TEST "LDA0H DAD SP SHLD SAVSTK ;SAVE THE "OLD" STACK-POINTER! LXI SP,TEMP4 DCX SP DCX SP INX SP DCX SP MVI A,055H STA TEMP2 CMA STA TEMP3 POP B CMP B CNZ CPUER ;TEST "LXI","DAD","INX",AND "DCX" SP CMA CMP C CNZ CPUER ;TEST "LXI","D CC CPUER ;TEST "CMC MVI A,0AAH CMA CPI 055H CNZ CPUER ;TEST "CMA" ORA A ;RE-SET AUXILIARY CARRY DAA CPI 055H CNZ CPUER ;TEST "DAA" MVI A,088H ADD A DAA CPI 076H CNZ CPUER ;TEST "DAA" XRA A MVI A,0AAH DAA CNC CPUER ;TESTND "INX" H MVI A,000H CMP C CNZ CPUER ;TEST "LXI" AND "INX" B CMP E CNZ CPUER ;TEST "LXI" AND "INX" D CMP L CNZ CPUER ;TEST "LXI" AND "INX" H DCX B DCX D DCX H MVI A,012H CMP B CNZ CPUER ;TEST "DCX" B CMP D CNZ CPUER ;TEST "DC CPUER ;TEST "PUSH PSW" AND "POP PSW" CNZ CPUER ;TEST "PUSH PSW" AND "POP PSW" CPO CPUER ;TEST "PUSH PSW" AND "POP PSW" CM CPUER ;TEST "PUSH PSW" AND "POP PSW" MVI A,012H CMP B CNZ CPUER ;TEST "PUSH B" AND "POP B" MVI A,034H CMP C CNZ CPUSET CARRY CPI 002H CNZ CPUER ;TEST "RAR" FOR ROTATION LXI B,01234H LXI D,0AAAAH LXI H,05555H XRA A PUSH B PUSH D PUSH H PUSH PSW LXI B,00000H LXI D,00000H LXI H,00000H MVI A,0C0H ADI 0F0H POP PSW POP H POP D POP B CCX" B INR A STAX B LDA TEMP0 CPI 0ABH CNZ CPUER ;TEST "STAX" B MVI A,077H STA TEMP0 LHLD TEMPP LXI D,00000H XCHG XRA A LDAX D CPI 077H CNZ CPUER ;TEST "LDAX" D AND "XCHG" XRA A ADD H ADD L CNZ CPUER ;TEST "XCHG" MVI A,0AD","INX", AND "DCX" SP LXI H,TEMP4 SPHL LXI H,07733H DCX SP DCX SP XTHL LDA TEMP3 CPI 077H CNZ CPUER ;TEST "SPHL" AND "XTHL" LDA TEMP2 CPI 033H CNZ CPUER ;TEST "SPHL" AND "XTHL" MVI A,055H CMP L CNZ CPUER ;TEST "SPHL" AND "XT "DAA" CPI 010H CNZ CPUER ;TEST "DAA" XRA A MVI A,09AH DAA CNC CPUER ;TEST "DAA" CNZ CPUER ;TEST "DAA" STC MVI A,042H RLC CC CPUER ;TEST "RLC" FOR RE-SET CARRY RLC CNC CPUER ;TEST "RLC" FOR SET CARRY CPI 009H CNZ CPUER ;TEST "X" D CMP H CNZ CPUER ;TEST "DCX" H MVI A,0FFH CMP C CNZ CPUER ;TEST "DCX" B CMP E CNZ CPUER ;TEST "DCX" D CMP L CNZ CPUER ;TEST "DCX" H STA TEMP0 XRA A LDA TEMP0 CPI 0FFH CNZ CPUER ;TEST "LDA" AND "STA" LHLD TEMPP SHLD TEMP0ER ;TEST "PUSH B" AND "POP B" MVI A,0AAH CMP D CNZ CPUER ;TEST "PUSH D" AND "POP D" CMP E CNZ CPUER ;TEST "PUSH D" AND "POP D" MVI A,055H CMP H CNZ CPUER ;TEST "PUSH H" AND "POP H" CMP L CNZ CPUER ;TEST "PUSH H" AND "POP H" LXI H,0000CPUER ;TEST "DAD" B CMP H CNZ CPUER ;TEST "DAD" B MVI A,054H CMP L CNZ CPUER ;TEST "DAD" B LXI H,0AAAAH LXI D,03333H DAD D MVI A,0DDH CMP H CNZ CPUER ;TEST "DAD" D CMP L CNZ CPUER ;TEST "DAD" B STC CNC CPUER ;TEST "STC" CMC CCH STAX D LDA TEMP0 CPI 0CCH STAX D LDA TEMP0 CPI 0CCH CNZ CPUER ;TEST "STAX" D LXI H,07777H DAD H MVI A,0EEH CMP H CNZ CPUER ;TEST "DAD" H CMP L CNZ CPUER ;TEST "DAD" H LXI H,05555H LXI B,0FFFFH DAD B MVI A,055H CNC L BYTEO ;SHOW ERROR EXIT ADDRESS HIGH BYTE MOV A,L CALL BYTEO ;SHOW ERROR EXIT ADDRESS LOW BYTE JMP WBOOT ;EXIT TO CP/M WARM BOOT ; ; ; CPUOK: LXI H,OKCPU ;OUTPUT "CPU IS OPERATIONAL" TO CONSOLE CALL MSG JMP WBOOT ;EXIT TO CP/M WARM BOOT ; ST" WILL BE DISPLAYED AS FOLLOWS: ERROR AT ADDRESS=NNNN PATTERN STORED=NN PATTERN READ=NN BIT(S) IN ERROR=N,N,N,N,N,N,N,N THE DIAGNOSTIC PROGRAM WILL NOW PROCEED TO DISPLAY THE FOLLOWING MESSAGE ON THE REMOTE SYSTEM CONSOLE: ME as a ".COM" file, with BDOS calls for console I/O. This program also serves as a very good "tutorial aid" when traced with Digital Research's DDT or SID, to gain a better understanding of register manipulation and arithmetic processes RAGE AREA ; ; ; END ; ; ; MEMORY LOCATIONS SAVSTK: DS 2 ;TEMPORARY STACK-POINTER STORAGE LOCATION ; ; ; STACK EQU TEMPP+256 ;DE-BUG STACK POINTER STO 1979,1980 BY MICROCOSM ASSOCIATES DONATED TO THE "SIG/M" CP/M USER'S GROUP, BY KELLY SMITH CP/M IS A REGISTERED TRADEMARK OF DIGITAL RESEARCH 1.0 DIAGNOSTIC TEST "START-UP" EXECUTION 1.1 THE TEST WILL INITIALLY "SIl run of the program will display the following message: CPU HAS FAILED! ERROR EXIT=NNNN Where "NNNN" is the address location AFTER the test failure. The CPUDIAG.PRN file may then be referenced as to the address location "EXIT" of the ; ; TEMPP: DW TEMP0 ;POINTER USED TO TEST "LHLD","SHLD", ; AND "LDAX" INSTRUCTIONS ; TEMP0: DS 1 ;TEMPORARY STORAGE FOR CPU TEST MEMORY LOCATIONS TEMP1: DS 1 ;TEMPORARY STORAGE FOR CPU TEST MEMORY LOCATIONS TEMP2 DS 1 ;TEMPORARY STORAGE FOR CPU Tm, CP/M-NET) (805) 527-0518 (Verbal) 55 Waco Avenue Simi Valley, California, 93065 (805) 527-9321 (Modeof the 8080 and 8085 CPU. Kelly Smith, Microcosm Associates 3055 Waco Avenue Simi Valley, California, 93065 (805) 527-9321 (Mode Microcosm Associates CPU Test/Diagnostic for the 8080 and 8085 Donated to the "SIG/M" CP/M User's Group by Kelly Smith This is an extensive diagnostic for the 8080 and 80GN ON",WITH THE FOLLOWING MESSAGE DISPLAYED ON THE REMOTE CONSOLE: MICROCOSM ASSOCIATES MEMORY DIAGNOSTIC VER.1.0 (C) 1979 TOP OF MEMORY=NNNN MEMORY QUALIFICATION TEST IS IN PROGRESS ANY ERRORS OCCURING DURING THE "MEMORY QUALIFICATION TEfailure, to determine the exact nature of the problem. Error address's were not included in the ".DOC" file, because the program is typically relocated in PROM for system diagnostic purposes. The program has however been CP/Mified to runEST MEMORY LOCATIONS TEMP3: DS 1 ;TEMPORARY STORAGE FOR CPU TEST MEMORY LOCATIONS TEMP4: DS 1 ;TEMPORARY STORAGE FOR CPU TEST MEMORY LOCATIONS SAVSTK: DS 2 ;TEMPORARY STACK-POINTER STORAGE LOCATION ; ; ; STACK EQU TEMPP+256 ;DE-BUG STACK POINTER STO*************************************************************** OPERATORS MANUAL FOR THE MICROCOSM ASSOCIATES MEMORY DIAGNOSTIC, VERSION 1.0 *************************************************************** COPYRIGHT I encountered with early production run's of the NEC 8080 which exhibited problems with the "Aux Carry Flag Bit" when doing "DAA's". A succesful run of the program will display the following message: CPU IS OPERATIONAL an unsuccesfu85 CPU, and exercises most functions of the processor. This diagnostic is NOT for the Z80, but may be modified as required to handle the incompatible "Sign/Parity Flag Bit". This diagnostic was especially helpful in tracking down problemsMORY TEST IN AUTO MODE (Y OR N)? (REFERENCE SECTION 2.1 C FOR ADDITIONAL INFORMATION) 2.0 DIAGNOSTIC COMMAND MONITOR 2.1 WHEN THE "-" PROMPT CHARACTER IS DISPLAYED, THE FOLLOWING KEYBOARD ENTRIES MAY BE MADE FOR TEST/DIAGNOSS ARE READ. 3. ALL 4K BYTE CELLS ARE COMPLEMENTED. 4. ALL 4K BYTE CELLS ARE READ. 5. ALL 4K BYTE CELLS ARE ALTERNATELY WRITTEN WITH 55 HEX AND AA HEX. 6. ALL 4K BYTE CELLS ARE READ. 7. ALL 4K BYTE CELLS ARE COMPLEMENTE,03,04,05 OR 06)=NN ENTER PATTERN (00-FF)=NN TEST IS IN PROGRESS PROGRAM TEST EXECUTION BEGINS AT THE TWO DIGIT ENTRY FOR "ENTER PATTERN (00-FF)=" BY DISPLAYING "TEST IS IN PROGRESS". ENTERING "A" FOR "ALL",AUTOMATICALLY BEGINS EXECUTION BY DIS ENTRY) NNN3=NN (CR) - (WHERE "-" IS A RETURN TO THE MONITOR BY CARRIAGE-RETURN) C. "T" CAUSES "TEST MEMORY IN AUTO MODE (Y OR N)?" TO BE DISPLAYED ON THE REMOTE CONSOLE.ENTERING "Y" ONN LOGIC OF THE TEST SOFTWARE IS SUCH THAT ANY IMMEDIATE MISMATCH IS DETECTED BUT THE ERROR CELL STATE IS NOT SAVED. SUBSEQUENT SOFTWARE PROGRAM DELAYS LATER, THE ERROR CELL ADDRESS CONTENT IS AGAIN EXAMINED FOR THE MISMATCH TO BE DISEX,WITH THE FOLLOWING DISPLAY APPEARING ON THE REMOTE CONSOLE: (NOTE: A MINIMUM ADDRESS DIFFERENTIAL OF THREE ADDRESS'S MUST BE UTILIZED BY THE OPERATOR, AND MEMORY MAY NOT BE TESTED BELOW RAM MEMORY ADDRESS 1000 HEX. LOW MEMORY ADDRETIC SELECTIONS. A. "G" CAUSES "GO ADDRESS=", ALLOWING EXECUTION OF CODE AT ANY ADDRESS IN ROM/RAM MEMORY. B. "M" CAUSES "MEMORY ADDRESS ", TO ALLOW DISPLAYING ANY ADDRESS IN ROM/RAM MEMORY. FOR EXAMPLE: -MEMORY ADDRESSL PROMPT WITH A "-" CHARACTER TO INDICATE MONITOR MODE. 3.0 RAM MEMORY TEST ERROR MESSAGES A. RANDOM PATTERNS MEMORY TEST MEMORY ERRORS OCCURING DURING THE RANDOM PATTERNS TEST WILL BE DISPLAYED ON THE REMOTE CONSOLE AS FOLLOWS: PLAYING "TEST OPTIONS ARE:",ASSUMING THAT THE TEST ADDRESS RANGE IS FROM 8000 HEX TO BFFF HEX. ENTERING "M" FOR "MONITOR",CAUSES EXITING TO THE COMMAND MONITOR (SEE SECTION 1.1 FOR DETAILED EXPLANATION OF OPERATION),AND WIL THE REMOTE CONSOLE KEYBOARD WILL CAUSE THE FOLLOWING DISPLAY TO APPEAR: NO MEMORY BLOCKS DROPPED TESTING MEMORY FROM 1000 TO 2000 PASS=0000 TOTAL ERRORS=0000 RANDOM PATTERNS TEST THE TEST WILL PROCEED TO TEST WITH "WRITE SATURATPLAYED, BUT THE CELL IS NOW CORRECT. THIS INDICATES THAT A TRANSIENT/DYNAMIC ERROR HAS OCCURRED. THE TEST SEQUENCE IS AS FOLLOWS: 1. RANDOM DATA PATTERNS ARE WRITTEN THRUOUT THE 4K BYTE CELL MEMORY BLOCK. 2. ALL 4K BYTE CELLSS=NNNN (CR) HIGH MEMORY ADDRESS=NNNN (CR) TEST OPTIONS ARE: 01-GALLOPING PATTERNS TEST 02-GALLOPING COLUMNS TEST 03-WALKING PATTERNS TEST 04-RANDOM PATTERNS TEST 05-WRITE STAURATION TEST 06-STATIC CHECK CYCLE TEST ENTER TEST NUMBER(01,02=NNNN (CR) NNNN=NN (SP) NNN1=NN AA (WHERE "AA" IS AN OPERATOR ENTRY) NNN2=NN ^ (WHERE "^" IS AN OPERATOR ENTRY TO EXAMINE "PREVIOUS") NNN1=AA (SP) NNN2=BB E (WHERE "E" INDICATES "MEMORY ERROR" ON ERROR AT ADDRESS=NNNNN PATTERN STORED=NN PATTERN READ=NN BIT(S) IN ERROR=N,N,N,N,N,N,N,N NOTE, THAT ON TRANSIENT/DYNAMIC TYPE ERRORS, THE PATTERN STORED MAY MATCH THE PATTERN READ AND NO BITS WILL BE IN ERROR. THE ERROR DETECTIORY IN AUTO MODE (Y OR N)?" WILL CAUSE THE FOLLOWING DISPLAY TO APPEAR ON THE REMOTE CONSOLE: TEST "ALL","SELECT",OR "MONITOR" (A,S OR M)? ENTRY OF "S" ON THE KEYBOARD ALLOWS "SELECTION" OF TESTING MEMORY FROM ADDRESS 1000 HEX TO FFFF HION TEST", "GALLOPING PATTERNS TEST","STATIC CHECK CYCLE","CHECKING DATA RETENTION","GALLOPING COLUMNS TEST", AND "WALKING PATTERNS TEST". THE TEST WILL THEN PROCEED TO THE NEXT 4K BYTE MEMORY BLOCK. A "N" RESPONSE TO "TEST MEMOD. 8. ALL 4K BYTE CELLS ARE READ. 9. ALL 4K BYTE CELLS ARE WRITTEN WITH ALL 1'S. 10. ALL 4K BYTE CELLS ARE READ. 11. ALL 4K BYTE CELLS ARE COMPLEMENTED. 12. ALL 4K BYTE CELLS ARE READ. B. WRITE SATURATION TEST MEMORY ERRORS L +64 (N), WHERE N=1,2,3,.... ,63). 4. READ THE TEST CELL, THEN WRITE THE TEST CELL'S COMPLEMENT INTO THE TEST CELL, SO THAT IT IS IN IT'S ORIGINAL "BACKGROUND" STATE. 5. READ TWO CELLS FOLLOWING THE TEST CELL FOR REFRESH CHT SEQUENTIAL CELL IS TESTED AS IN STEP 2 AND 3. 5. A "BACKGROUND" PATTERN OF ALL 0'S IS WRITTEN INTO THE SAME 256 BYTE PORTION OF THE 4K BYTE BLOCK OF MEMORY. 6. STEPS 2,3, AND 4 ARE REPEATED. 7. STEPS 1 THRU 6 ARE REPEATED FOR THE NEXT 3. SEQUENTIALLY READ ALL BYTES IN THE 4K BYTE BLOCK. 4. WRITE A "BACKGROUND" PATTERN OF ALL 1'S IN A 4K BYTE BLOCK REPEATEDLY FOR 100 WRITE PASSES. 5. WRITE ALL 0'S IN A 4K BYTE BLOCK FOR 1 WRITE PASS ONLY. 6. SEQUENTIALLY READ ALMEMORY TEST ERROR MESSAGES ARE IDENTICAL TO THOSE DISPLAYED FOR THE GALLOPING PATTERNS MEMORY TEST. THE TEST SEQUENCE IS AS FOLLOWS: 1. A "BACKGROUND" PATTERN OF ALL 1'S IS WRITTEN INTO A 64 BYTE BYTE PORTION OF A 4K BYTE BLOCK OF MEMEACH CELL AND EVERY OTHER CELL, SLOW SENSE AMPLIFIER RECOVER, OR DESTRUCTION OF DATA DUE TO NOISE COUPLING BETWEEN CELLS WITHIN A COLUMN. THE TEST SEQUENCE IS AS FOLLOWS: 1. A "BACKGROUND" PATTERN OF ALL 1'S IS WRITTEN INTO A 256 BYTE OCCURING DURING THE WRITE SATURATION TEST WILL BE DISPLAYED ON THE REMOTE CONSOLE AS FOLLOWS: ERROR AT ADDRESS=NNNN READ BACK NN ,EXPECTED NN THE FAILURE TYPE REVEALED IS SLOW SENSE AMPLIFIER RECOVERY DUE TO SUSTAINED "CHARGING" OUTE. AFTER THIS DELAY TIME, THE LAST STATE OF MEMORY TESTING PATTERNS FROM THE GALLOPING PATTERNS MEMORY TEST IS READ FOR THE 4K BYTE BLOCK TO TEST FOR POSSIBLE ERRORS DUE TO RETENTION LOSSES. THE FOLLOWING MESSAGE WILL APPEAR ON THSEQUENTIAL 256 BYTES IN THE 4K BYTE BLOCK. D. STATIC CHECK CYCLE. UTILIZED IN THE MEMORY TEST AUTOMATIC MODE ONLY, A STATIC CHECK CYCLE WILL OCCUR AS FOLLOWS: ANY FURTHER MEMORY READ OR WRITE OPERATION IS TERMINATED FOR ONE MINL 4K BYTES IN THE 4K BYTE BLOCK. C. GALLOPING PATTERNS MEMORY TEST MEMORY ERRORS OCCURING DURING THE GALLOPING PATTERNS MEMORY WILL BE DISPLAYED ON THE REMOTE CONSOLE AS FOLLOWS: ERROR READING OTHER CELL TEST CELL=NNNN, OTHER CELL=ORY. 2. THE COMPLEMENT OF THE TEST CELL IS WRITTEN INTO THE TEST CELL, FOR THE CURRENT TEST COLUMN. 3. TEST CELL ROW'S ARE READ BY ALTERNATELY READING THE TEST CELL AND LOCATIONS +64 ADDRESS'S FROM THE TEST CELL (E.G. TEST CELPORTION OF A 4K BYTE BLOCK OF MEMORY. 2. THE COMPLIMENT OF THE TEST CELL IS WRITTEN INTO THE TEST CELL, AND ALTERNATELY THE TEST CELL IS READ AND EVERY OTHER CELL. 3. THE TEST CELL IS WRITTEN TO IT'S ORIGINAL STATE. 4. THE NEXF 0'S OR 1'S ON THE SENSE AMPLIFIER CIRCUITRY. THE TEST SEQUENCE IS AS FOLLOWS: 1. WRITE A "BACKGROUND" PATTERN OF ALL 0'S IN A 4K BYTE BLOCK REPEATEDLY FOR 100 WRITE PASSES 2. WRITE ALL 1'S IN A 4K BYTE BLOCK FOR 1 WRITE PASS ONLY. E REMOTE CONSOLE: CHECKING DATA RETENTION ANY DATA RETENTION ERROR DETECTED WILL BE DISPLAYED ON THE REMOTE CONSOLE AS FOLLOWS: DATA RETENTION ERROR AT ADDRESS=NNNN EXPECTED "00" DATA, READ BACK NN E. GALLOPING COLUMNS , OTHER CELL=NNNN, PATTERN STORED=NN PATTERN READ =NN THE TEST CELL HAS BEEN DISTURBED BY WRITING INTO SOME "OTHER" CELL. THE FAILURE TYPE REVEALED IN EITHER ERROR MESSAGE INDICATES EITHER UNSATISFACTORY ADDRESS TRANSITIONS BETWEEN NNNN PATTERN STORED=NN PATTERN READ=NN THE "OTHER" CELL (WRITTEN FROM A BACKGROUND PATTERN OF 0'S OR 1'S) HAS BEEN DISTRUBED BY WRITING INTO THE "TEST" CELL. ALTERNATELY,THIS MESSAGE MAY APPEAR: ERROR READING TEST CELL TEST CELL=NNNNECK. 6. REPEAT STEP 5 FOR ALL CELLS OF THE CURRENT TEST COLUMN, AND EVERY OTHER COLUMN (E.G. READ CELLS 3,6,9,....63; 2,4,9,...62; 1,4,7,.....61; ETC., ETC.) 7. REPEAT STEPS 2 THRU 6 FOR ALL COLUMNS. 8. WRITE A "BACKGROUNOARD ; CCTRL EQU 010H ;CONSOLE COMMAND/STATUS PORT CDATA EQU 011H ;CONSOLE DATA PORT CRRDY EQU 001H ;RECEIVER READY BIT CTRDY EQU 002H ;TRANSMITTER READY BIT ; ; ; ;DEFINE DOUBLE DENSITY CONTROLLER I/O PARAMAY BE TESTED .HOWEVER, A MINIMUM DIFFERENCE IN ADDRESS OF 3 IS REQUIRED DUE TO THE "PUSH/POP" METHOD OF MEMORY TEST BY THE RANDOM PATTERNS MEMORY TEST ("PUSH AND POP" INSTRUCTIONS ARE UTILIZED FOR MEMORY ACCESS'S BECAUSE THESE TWO INST OCCURRING DURING THE WALKING PATTERNS MEMORY TEST WILL BE DISPLAYED ON THE REMOTE CONSOLE AS FOLLOWS: ERROR AT ADDRESS=NNNN READ BACK NN, EXPECTED NN LAST ADDRESS WRITTEN WAS NNNN, PATTERN WAS NN THE TEST SEQUENCE IS AS FOLLOWS: 1. WRIT*************************************** ; ;DONATED TO THE "SIG/M" CP/M USER'S GROUP BY: ;KELLY SMITH, MICROCOSM ASSOCIATES ;3055 WACO AVENUE ;SIMI VALLEY, CALIFORNIA, 93065 ;(805) 527-9321 (MODEM, CP/M-NET (TM)) ;(805) 527-0518 (VERBAL) ; ; ; ; RECOVERY. G. OPERATOR ERROR MESSAGES ANY NON-HEXIDECIMAL KEYBOARD ENTRIES ON THE REMOTE CONSOLE WILL BE PROMPTED WITH A "?" CHARACTER, AND A RETURN TO THE COMMAND MONITOR. ANY ATTEMPT TO TEST "OUT OF RANGE" OF ADDRESS SELECTIOD" PATTERN OF ALL 0'S FOR 64 BYTES IN THE 4K BYTE MEMORY BLOCK. 9. REPEAT STEPS 2 THRU 7. 10. REPEAT STEPS 1 THRU 9 FOR THE NEXT SEQUENTIAL 64 BYTES IN THE 4K BYTE MEMORY BLOCK. ALL FAILURE TYPE REVEALED INDICATES EITHER UNSAееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееRUCTIONS PERFORM THE FASTEST ACCESS OF MEMORY). HE RANDOM PATTERNS MEMORY TEST ("PUSH AND POP" INSTRUCTIONS ARE UTILIZED FOR MEMORY ACCESS'S BECAUSE THESE TWO INSTE A "BACKGROUND" PATTERN OF ALL 1'S FOR 256 BYTES IN A 4K BYTE MEMORY BLOCK. 2. WRITE THE COMPLEMENT OF THE TEST CELL INTO THE TEST CELL. 3. READ THE REMAINING 256 BYTES, IN THE 4K BYTES OF THE BLOCK. 4. READ THE TEST CELL. 5. WRITE T ; ORG 00100H ; DI ;DISABLE INTERRUPTS LXI SP,STACK ;SET THE STACK POINTER JMP INIT ;INITIALIZE ; ; ; ; ; ; ;DEFINE CONSOLE I/O PARAMETERS FOR ALTAIR 2SI/O BNS WILL PROMPT WITH: INVALID MEMORY ADDRESS TESTING OF MEMORY IS NOT ALLOWED BELOW ADDRESS 1000, OR ABOVE FFFF, ALSO THE LOW MEMORY ADDRESS MAY NOT BE GREATER THAN THE HIGH MEMORY ADDRESS, ANY ADDRESS RANGE FROM 1000 HEX TO FFFF HEX MTISFACTORY ADDRESS TRANSITIONS BETWEEN EVERY CELL AND THE POSITION OF THE CELL'S ROW, DESTRUCTION OF STORED DATA DUE TO NOISE COUPLING AMOUNG CELLS IN THE SAME COLUMN, OR REFRESH ERRORS. F. WALKING PATTERNS MEMORY TEST MEMORY ERRORS ;************************************************************************ ; MICROCOSM ASSOCIATES DISK DIAGNOSTIC ; FOR ; ICOM FD3812 VER.1.0 (C) 1979 ;*********************************HRU 8 FOR THE NEXT SEQUENTIAL 256 BYTES IN THE 4K BYTE MEMORY BLOCK. THE FAILURE TYPES REVEALED ARE INTERNAL MULTIPLE ADDRESS SELECTION,DESTRUCTION OF STORED DATA DUE TO NOISE COUPLING WITHIN A COLUMN,AND SLOW SENSE AMPLIFIERHE COMPLEMENT OF THE TEST CELL BACK TO IT'S ORIGINAL "BACKGROUND" STATE. 6. REPEAT STEPS 2 THRU 5. 7. WRITE A "BACKGROUND" PATTERN OF ALL 0'S FOR 256 BYTES IN THE 4K BYTE MEMORY BLOCK. 8. REPEAT STEPS 2 THRU 6. 9. REPEAT STEPS 1 TETERS ; CNTRL EQU 0C0H ;CONTROL COMMANDS DATAO EQU 0C1H ;DATA OUT DATAI EQU 0C0H ;DATA IN ; ; ; ;SUBROUTINE TO CONVERT TWO HEX CHARACTERS TO ONE BYTE NBL: SUI '0' RC ADI 0E9H 0DH,0AH,20H,'S.....SEEK TO TRACK(00-4C)=' DB 0DH,0AH,20H,'R.....READ SECTOR(01-1A)=' DB 0DH,0AH,20H,'W.....WRITE SECTOR(01=1A)=' DB 0DH,0AH,20H,'F.....FORMAT SINGLE TRACK(Y,N)?' DB 0DH,0AH,20DIGIT HEX VALUES ARE REQUIRED' DB ',TERMINATED WITH CARRAIGE-RETURN)' DB 0DH,0AH,0AH,020H DB 'IMPROPER KEY-BOARD ENTRYS WILL BE ' DB 'PROMPTED,WITH A "?" CHARACTER,' DB 0DH,0AH,'OR CONSOLE INPUT ROUTINE ; CI: IN CCTRL ANI CRRDY JZ CI IN CDATA ANI 7FH RET ; ; ; CRLF: MVI C,0DH CALL CO MVI C,0AH JMP CO ; DB 0DH,0AH,20H,'U.....UNIT SELECT(00-03)=' DB 0DH,0AH,20H,'D.....DOOR LOCK(Y,N)?' DB 0DH,0AH,20H,'L.....LOOP' DB 0DH,0AH,20H,'CONTROL-A.....ALIGNMENT,AUTO(Y,N)?' DB 0DH,0AH,20H,'H...AIR FD3812 ' DB ' VERSION 1.0 (C) 1979' DB 0DH,0AH,0AH,0AH,' OPERATING INSTRUCTION ARE AS FOLLOWS:' DB 0DH,0AH DB 0DH,0AH,20H,'RESPOND TO ALL "=" CHARACTERS, ' DB 'WITH A TWO DIGIT HEX VALUE RC ADI 6 JP NIO ADI 7 RC NIO: ADI 10 ORA A RET ; ; ; ;SUBROUTINE TO CONVERT A BYTE TO TWO HEX CHARACTERS LBYTE: PUSH PSW RRC RRC SPACE-BAR ; ; ; CALL TEXT ;OUTPUT MORE TEXT TO CONSOLE ; ; ; DB 0DH,0AH,0AH,0AH,0AH,20H DB 'THE FOLLOWING IS A ' DB 'LIST OF ALL COMMANDS:' DB 0DH,0AH,20H DB AN "INVALID" MESSAGE ' DB ' (PLEASE PRESS SPACE-BAR)' ; ; ; DB 080H ;END OF TEXT FLAG ; ; ; MVI B,11 ;SET-UP 11 LINE-FEEDS CALL LFEED CALL BAR ;WAIT FOR OPERATOR TO PRESS CONO: CALL BYTEO CALL CRLF RET ; CONI: CALL BYTEC RET ; ; CONSOLE OUTPUT ROUTINE ; CO: IN CCTRL ANI CTRDY JZ CO MOV A,C OUT CDATA..HOME' DB 0DH,0AH,20H,'E.....ENABLE DRIVE(00-03)=' DB 0DH,0AH,20H,'C.....CLEAR' DB 0DH,0AH,20H,'CONTROL-T.....TIMER CONTROL(Y,N)?' DB 0DH,0AH,20H,'CONTROL-P.....WRITE PROTECT(Y,N)?' DB OR ' DB 'ALPHA CHARACTER ' DB 0DH,0AH DB 'FOR ALL TEST FUNCTIONS EXCEPT,' DB 0DH,0AH,'MEMORY ADDRESS(0000-FFFF)=,' DB 'AND GO ADDRESS(0000-FFFF)=' DB 0DH,0AH,'(FOUR RRC RRC ANI 0FH CALL HXDA POP PSW ANI 0FH HXDA: CPI 10 JM CNO ADI 7 CNO: ADI 30H MOV C,A JMP CO ; ; ; ; 'ENTER A KEY-BOARD CHARACTER ' DB 'AS REQUIRED,FOR ' DB 'TEST EXECUTION' DB 0DH,0AH DB 0DH,0AH,20H,'M.....MEMORY ADDRESS(0000-FFFF)=' DB 0DH,0AH,20H,'G.....GO ADDRESS(0000-FFFF)=' RIAL I/O OUT CCTRL MVI A,0B5H OUT CCTRL CALL TEXT ;OUTPUT OPERATING INSTRUCTIONS TO CONSOLE ; ; ; ;TEXT TABLE OF OPERATING INSTRUCTIONS ; DB 0DH,0AH,' MICROCOSM DISK DIAGNOSTIC FOR ICOM/ALT RET ; ; ; ; ; ;INITIALIZE ALL PROGRAM CONTROL PARAMETERS AND OUTPUT OPERATING INSTRUCTIONS ; INIT: LXI H,01000H ;DELAY COUNT FOR 6850 ACIA SETTLE INITD: DCX H MOV A,H ORA L JNZ INITD MVI A,003H ;SET-UP CONSOLE SEH,'P.....PATTERN(00-FF)=' DB 0DH,0AH,20H,'T.....TEST WRITE/READ CONTINUOUS' DB 0DH,0AH,20H,'CONTROL-S.....SYSTEM TEST' DB 0DH,0AH,07H,20H DB 'SPACE-BAR.....ABORTS ANY ' DB 'TEST OR CPI 'F' JZ FORM ;JUMP TO FORMAT DISKETTE CPI 'P' JZ PATT ;JUMP TO SET DATA PATTERN CPI 'L' JZ LOOP ;JUMP TO SET LOOP COMMAND CPI 014H JZ SHLD PCTR ;CLEAR PASS COUNTER MVI A,005H ;SET NUMBER OF ERROR RETRIES TO 5 DECIMAL STA TRIES ; ; ; MNTR: XRA A ;CLEAR A REG. STA BLOOP ;CLEAR LOOP COMMAND STA MODE T FLAG ; ; ; MVI A,001H ;SET SECTOR NUMBER TO 01 STA SECNO XRA A ;CLEAR ALL UNITS OF DISK REMOVED STATUS, ; AND INDICATE ANY UNITS WITH ; DISK FAIL STA JZ HOME ;JUMP TO HOME (SEEK TO TRACK 00) CPI 'S' JZ SKT ;JUMP TO SEEK TO TRACK CPI 013H JZ SYS ;JUMP TO SYSTEM TEST,IF "CONTROL-S" CPI 'W' JZ WRT STA MODE ;CLEAR FORMAT MODE STA MTREN ;CLEAR DRIVE MOTOR ENABLES STA LOCK ;CLEAR DOOR LOCK STA RETRY ;CLEAR READ ERROR RETRY COUNTER STA TIME ;CLEAR TIMER COMMAND STA "HANG-UP" ' DB ' (PLEASE PRESS SPACE-BAR)' ; ; ; DB 080H ;END OF TEXT FLAG ; ; ; CALL BAR ;WAIT FOR OPERATOR TO PRESS SPACE-BAR MVI B,25 ;SET-UP 25 LINE-FEEDS CALL LFEED CALL CECHO ;ECHO KEY-BOARD INPUT OUT TO CONSOLE CPI 003H JZ 00000H ;JUMP TO CP/M WARM BOOT,IF "CONTROL-C" CPI 'M' JZ MEM ;JUMP TO MEMORY DISPLAY/ALTER CPI 'G' JZ GO ;JUM ;CLEAR FORMAT MODE STA VFYCM ;CLEAR VERIFY COMMAND MNTR1: LXI SP,STACK CALL CRLF MVI C,07H ;OUTPUT BELL CALL CO MVI C,40H ;OUTPUT PROMPT (@ CHARACTER) CALL CO TUS STA HDSEL ;CLEAR HEAD SELECT CALL TCHK ;TEST CHECK,UNIT 00 MVI A,040H CALL TCHK ;TEST CHECK,UNIT 01 MVI A,080H CALL TCHK ;TEST CHECK,UNIT 02 MVI A ;JUMP TO WRITE SECTOR CPI 'R' JZ RDT ;JUMP TO READ SECTOR CPI 'C' JZ CLR ;JUMP TO CLEAR CONTROLLER CPI 'T' JZ RWC ;JUMP TO WRITE/READ CONTINUOUS SAVE ;CLEAR "SAVED STATUS" STA RDCRC ;CLEAR READ CRC COMMAND STA WPROT ;CLEAR WRITE PROTECT COMMAND STA VFYCM ;CLEAR VERIFY COMMAND LXI H,000H SHLD ECTR ;CLEAR ERROR COUNTER ; ; ; CALL TEXT ;OUTPUT MORE TEXT TO CONSOLE ; ; ; DB 0DH,0AH,20H DB 'THE FOLLOWING IS A SYSTEM ' DB 'STATUS TEST:' DB 0DH,0AH ; ; ; DB 080H ;END OF TEXP TO GO CPI 'D' JZ DOOR ;JUMP TO LOCK OR UNLOCK DOOR CPI 'U' JZ UNITS ;JUMP TO UNIT SELECT CPI 'E' JZ ENAB ;JUMP TO ENABLE DRIVE MOTORS CPI 'H' D DATA MARK COMMAND STA DDSEL ;CLEAR DOUBLE DENSITY SELECT STA DDSAV ;CLEAR DENSITY "SAVE" STATE STA XTEND ;CLEAR EXTENDED FORMAT COMMAND STA XTSAV ;CLEAR EXTENDED FORMAT "SAVE" STATE ,0C0H CALL TCHK ;TEST CHECK,UNIT 03 MVI B,10 ;OUTPUT 10 LINE-FEEDS TO CONSOLE CALL LFEED XRA A STA UNIT ;SET UP INITIAL SELECT FOR DRIVE 00 STA DELET ;CLEAR DELETE TIMER ;SET TIMER CONTROL,IF "CONTROL-T" CPI 010H JZ PROT ;SET WRITE PROTECT,IF "CONTROL-P" CPI 001H JZ ALIN ;JUMP TO ALIGNMENT,IF "CONTROL-A" CPI 'V' JZ VRFYT ATOR READS TEXT ; (ASSUMES PAUSE ITERATIONS TO BE IN B REG.) ; PAUSE: LXI H,0FFFFH ;SET-UP PAUSE DELAY CALL DLY DCR B JNZ PAUSE RET ; ; ; ;ROUTINE TO DO TEST CHECK ON DRIVES ; (ASSUMES JMP MEM1 ; ; ; TIMER: LXI H,MSG45 ;OUTPUT "TIMER CONTROL?" TO CONSOLE CALL MSG CALL CECHO CPI 'Y' JZ TIMEY CPI 'N' JZ TIMEN JMP DAD H DAD H DAD H JC LER CALL NBL JC LER ORA L MOV L,A JMP PARM1 ; ; BYTEC: CALL CECHO BYTC1: CALL NBL JC LR" ; KBINT: IN CCTRL ANI CRRDY RZ IN CDATA ANI 07FH ;MASK-OFF PARITY BIT CPI 020H JZ MNTR ;GO TO MONITOR IF SPACE-BAR RET ; ; ; ;ROUTINE TO OUTP CALL CO MOV A,M CALL BYTEO MVI C,20H CALL CO RET ; ; MEM: LXI H,MSG14 CALL MSG CALL PARAM MEM1: CALL DSPYM CALL CECHO C ;JUMP TO VERIFY (READ CRC,ALL TRACKS/SECTORS) LER: MVI C,'?' ;LINE INPUT ERROR, OUTPUT "?" TO CONSOLE CALL CO JMP MNTR ; ; CECHO: CALL CI MOV C,A CALL CO RET ; ; GO: LS 2.5 SECONDS) ; TIME1: LXI H,0FFFFH ;LOAD DELAY CONSTANT TIMEA: DCX H ;-1 TO H&L REGS. MOV A,L ORA H JNZ TIMEA ;GO AGAIN,UNTIL TIMED OUT TIME2: LXI H,0FFFFH TIMEB: DCX LER TIMEY: MVI A,001H ;SET TIMER CONTROL JMP TIMES TIMEN: XRA A ;RESET TIMER CONTROL TIMES: STA TIME JMP MNTR1 ; ; ; ;SUBROUTINE TO KILL TIME AS REQUIRED ;(TOTAL DELAY OF TIME1+TIME2+TIME3 EQUAER RLC RLC RLC RLC PUSH PSW CALL CECHO CALL NBL JC LER POP B ORA B RET ; ; BYTEO: PUSH PSW CALL BYTO1 UT LINE-FEEDS TO CONSOLE ; (ASSUMES QUANTITY OF LINE-FEEDS TO BE IN B REG.) ; LFEED: MVI C,00AH ;OUTPUT A LINE-FEED TO CONSOLE CALL CO DCR B JNZ LFEED RET ; ; ; ;ROUTINE TO "PAUSE" WHILE OPERPI 05EH ;NEED TO BACK-UP? JZ MEM10 CPI 0DH JZ MNTR CPI 20H JZ MEM9 CALL BYTC1 MOV M,A MEM9: INX H JMP MEM1 MEM10: DCX H LXI H,MSG25 ;OUTPUT GO ADDRESS? TO CONSOLE CALL MSG CALL PARAM CALL CRLF PCHL ; ; PARAM: LXI H,0 PARM1: CALL CECHO CPI 0DH RZ DAD H H MOV A,L ORA H JNZ TIMEB TIME3: LXI H,00FFFH TIMEC: DCX H MOV A,L ORA H JNZ TIMEC RET ; ; ; ;KEY-BOARD INTERRUPT ROUTINE, KEYED WITH "SPACE-BAYTO3 ADI 7 BYTO3: ADI 30H RET ; ; HLCO: CALL CRLF MOV A,H CALL BYTEO MOV A,L CALL BYTEO RET ; ; DSPYM: CALL HLCO MVI C,'=' MOV C,A CALL CO POP PSW CALL BYTO2 MOV C,A JMP CO ; ; BYTO1: RRC RRC RRC RRC BYTO2: ANI 0FH CPI 0AH JM B UNIT NUMBER TO BE IN A REG.) ; TCHK: STA UNIT ;SAVE UNIT NUMBER CALL XMTUS CALL UNCHK ;CHECK UNIT CODE BITS FOR A MATCH ; TO THE SELECTED UNIT CALL WPCHK ;CHECK WRITE PROTECT DB 25,0DH,0AH,' EXTENDED FORMAT(Y,N)? ' ; MSG48: DB 9,0DH,0AH,20H,'VERIFY' ; MSG49: DB 25,'ERIFY SINGLE TRACK(Y,N)? ' ; MSG50: DB 9,0DH,0AH,20H,'FORMAT' ; MSG51: DB 10,'ALIGNMENT,' ; MSG52: DB 2,'NO' ; M3)=' ; MSG9: DB 25,'ORMAT SINGLE TRACK(Y,N)? ' ; MSG10: DB 14,'UNIT CODE FAIL' ; MSG11: DB 20,'EEK TO TRACK(00-4C)=' ; MSG12: DB 14,'SECTOR(01-1A)=' ; MSG13: DB 14,'ATTERN(00-FF)=' ; MSG14: DB 25,'EMORE-BAR FROM KEY-BOARD ; BAR: IN CCTRL ANI CRRDY JZ BAR ;OOPS KEY-BOARD NOT ACTIVE IN CDATA ANI 07FH ;MASK-OFF PARITY BIT CPI 020H ;SPACE-BAR? JNZ BDB 13,'WRITE PROTECT' ; MSG36: DB 24,0DH,0AH,' DOUBLE DENSITY(Y,N)? ' ; MSG37: DB 22,'INVALID SECTOR NUMBER ' ; MSG38: DB 3,'OOP' ; MSG39: DB 14,0DH,0AH,07H,' CRC ERROR ' ; MSG40: DB 10,'LOWER HEAD' ; MSG CALL CO SP2: MVI C,20H CALL CO SP1: MVI C,20H CALL CO RET ; ; ; ; ; YNMSG: DB 5,'(Y,N)' ; MSG1: DB 8,0DH,0AH,' PASS=' ; MSG2: DB 6,' WRITE' ; MSG3: DB STATUS IN DATAI ;GET STATUS ANI 020H ;DRIVE FAIL? RNZ CALL CRLF CALL SP1 LXI H,MSG31 ;OUTPUT "UNIT=" TO CONSOLE CALL MSG CALL AUNIT ;OUD ; ;MSG22 RESERVED ; MSG23: DB 12,0DH,0AH,20H,'FAILED TO' ; MSG24: DB 14,'READY FOR TEST' ; MSG25: DB 21,'O ADDRESS(0000-FFFF)=' ; MSG26: DB 3,'OME' ; MSG27: DB 5,'RITE ' ; MSG28: DB 4,'EAD ' ; MSGY ADDRESS(0000-FFFF)=' ; MSG15: DB 33,0DH,0AH,' UNIT TRACK SECTOR BYTE WAS S/B' ; MSG16: DB 14,' TOTAL ERRORS=' ; MSG17: DB 15,0DH,0AH,' MEDIA ERROR ' ; ;MSG18 RESERVED ; ;MSG19 RESERVED ; ;MSG20 RESERVED ; ;MSG21 RESERVEAR ;NO KEEP WAITING RET ; ; ; ;ROUTINE TO CAUSE "LOOPING" ON A TEST ; LOOP: LXI H,MSG38 ;OUTPUT "LOOP" TO CONSOLE CALL MSG MVI A,001H ;STORE LOOP COMMAND STA BLOOP JMP 41: DB 10,'UPPER HEAD' ; MSG42: DB 15,'OOR LOCK(Y,N)? ' ; MSG43: DB 19,' DELETE DATA(Y,N)? ' ; MSG44: DB 8,' DD MARK' ; MSG45: DB 20,'TIMER CONTROL(Y,N)? ' ; MSG46: DB 16,' CRC ONLY(Y,N)? ' ; MSG47: 5,' READ' ; MSG4: DB 23,0DH,0AH,'INVALID TRACK NUMBER ' ; MSG5: DB 23,0DH,0AH,' DATA COMPARE ERROR: ' ; MSG6: DB 17,'LOWER HEAD(Y,N)? ' ; MSG7: DB 21,' DOUBLE SIDED DISK: ' ; MSG8: DB 19,'NABLE DRIVE(00-0TPUT UNIT NUMBER TO CONSOLE CALL BYTEO CALL SP1 LXI H,MSG24 ;OUTPUT "READY FOR TEST" TO CONSOLE CALL MSG CALL CRLF ;KEEP IT NEAT RET ; ; ; ;ROUTINE TO WAIT FOR SPAC29: DB 4,'LEAR' ; MSG30: DB 25,'EST WRITE/READ CONTINUOUS' ; MSG31: DB 5,'UNIT=' ; MSG32: DB 18,'NIT SELECT(00-03)=' ; MSG33: DB 22,0DH,0AH,'INVALID UNIT NUMBER ' ; MSG34: DB 10,'DRIVE FAIL' ; MSG35: JMP MNTR ; ; ; ; ; ; ;***************************** ;*DISK TEST CODE FOLLOWS: * ;***************************** ; ; ; ; SP5: MVI C,20H CALL CO SP4: MVI C,20H CALL CO SP3: MVI C,20H MNTR1 ; ; ; ;SUBROUTINE TO TEST LOOP COMMAND ; LOOPT: CALL KBINT ;TEST KEY-BOARD INTERRUPT LDA BLOOP ;GO GET LOOP COMMAND ADI 000H ;IS IT A LOOP COMMAND? RNZ ;RETURN,IF YES SG53: DB 11,'AUTO(Y,N)? ' ; MSG54: DB 13,'TRACK(00-4C)=' ; MSG55: DB 22,0DH,0AH,20H,'NO "BUSY" RESPONSE ' ; MSG56: DB 19,0DH,0AH,20H,'"BUSY" RUN-AWAY ' ; MSG57: DB 11,'SYSTEM TEST' ; MSG58: DB 6,'TRACK=' 'N' ;NO? JZ DOOR2 JMP LER DOOR1: MVI A,040H ;TRANSMIT DOOR LOCK COMMAND TO CONTROLLER JMP DLXMT DOOR2: XRA A ;ZERO OUT A REG. DLXMT: STA LOCK ;STORE DOOR LOCK COMMAND DL1: TRACK NUMBER >77 DECIMAL? JNC INER1 ;JUMP TO INPUT ERROR 1,IF SO CALL CRLF SKT1: MVI C,'.' ;MAKE A TRACK SEEK INDICATOR FOR CONSOLE CALL CO CALL DENT ;GO SET PROPER DENSITY CONFIGURATION, PSW TEXTA: MOV A,M ;CHECK FOR "END OF TEXT" FLAG INX H ORA A JM TEXTB ;END OF TEXT? MOV C,A CALL CO JMP TEXTA ;NO TRY AGAIN TEXTB: POP PSW MIT SEEK TRACK 00 ; COMMAND TO CONTROLLER LDA NEWTK ;RE-LOAD ORIGINAL TRACK NUMBER STA TRKNO JMP SKT1 ;SEEK TO ORIGINAL TRACK NUMBER ; ; ; ; ; ;ROUTINE TO LOCK OR UNLOCK DOOR ;SOLE CALL MSG HOME1: CALL RSTR ;TRANSMIT "SEEK TRACK 00" COMMAND, ; TO CONTROLLER CALL LOOPT ;GO TEST LOOP COMMAND JMP HOME1 ; ; ; ;SEEK TO TRACK SKT: LXI H,MSG ; MSG59: DB 7,'SECTOR=' ; MSG60: DB 14,'SEEK TO TRACK=' ; ; ; ; ; ;ROUTINE TO OUTPUT MESSAGES TO CONSOLE ; MSG: PUSH PSW PUSH B MOV B,M INX H MSGA: MOV C,M CALL ; TO CONTROLLER CALL XMTUS CALL XMTTK MVI A,009H ;SEEK TO TRACK CALL XMITW IN DATAI ;EXAMINE STATUS FROM CONTROLLER ANI 008H ;CRC ERROR? JZ ; FOR SEEKING LDA TRKNO ;GO GET THE TRACK NUMBER CPI 000H ;TRACK 00 REQUESTED? JZ HOME1 ;IF SO,GO DO A RESTORE CALL CLRER ;TRANSMIT "CLEAR ERROR FLAGS", POP B XTHL ;GET THE RETURN ADDRESS RET ; ; ; ;***************************************** ;* CONTROLLER/DISK TEST ROUTINES FOLLOW: * ;***************************************** ; ; ; ;CLEAR CONTROLLER CLR: DOOR: LXI H,MSG42 ;OUTPUT "DOOR LOCK?" TO CONSOLE CALL MSG CALL CECHO ;GO GET KEY-BOARD INPUT CPI 'Y' ;DOOR LOCK REQUESTED? JZ DOOR1 ;IF YES,GO LOCK THE DOOR CPI 11 ;OUTPUT "SEEK TO TRACK=" TO CONSOLE CALL MSG CALL CONI ;READ CONSOLE INPUT STA TRKNO ;STORE TRACK ADDRESS STA NEWTK ;STORE NEW TRACK NUMBER IN CASE OF LOOP CPI 04DH ;CO INX H DCR B JNZ MSGA POP B POP PSW RET ; ; ; ;ROUTINE TO OUTPUT "TEXT" TO CONSOLE ; TEXT: XTHL ;GET ADDRESS OF TEXT PUSH B PUSH SKT2 ;IF NOT,GO TEST LOOP COMMAND LXI H,MSG39 ;OUTPUT "CRC ERROR" TO CONSOLE CALL MSG CALL CLRER ;GO CLEAR ERROR FLAGS SKT2: CALL LOOPT ;GO TEST LOOP COMMAND CALL RSTR ;TRANS LXI H,000H ;CLEAR PASS AND ERROR COUNTER SHLD PCTR SHLD ECTR CALL LOOPT ;GO TEST LOOP COMMAND JMP CLR1 ; ; ; ;RESTORE TO TRACK 00 ; HOME: LXI H,MSG26 ;OUTPUT "HOME" TO CON LXI H,MSG29 ;OUTPUT "CLEAR" TO CONSOLE CALL MSG CLR1: MVI A,81H ;TRANSMIT CLEAR COMMAND TO CONSOLE CALL XMIT MVI A,00BH ;TRANSMIT CLEAR ERROR FLAGS TO CONTROLLER CALL XMIT CALL XMTUS ;TRANSMIT LOAD UNIT/SECTOR COMMAND ; TO CONTROLLER CALL XMTCF ;TRANSMIT LOAD CONFIGURATION ; COMMAND TO CONTROLLER CALL LOOPT ;GO TEST LOOP COMMAND TO "SINGLE" STA DDSEL STA XTEND ;RESET EXTENDED FORMAT JMP DENT1 ;GO DO SINGLE DENSITY ON TRACK 00, ; LOWER SURFACE,EVEN THOUGH WE ; HAVE BEEN IN DOUBLE DENSISITY. ; PROPER RECORD LENGTH WILL BE IN D&E REGS. ; DENT: LDA XTEND ;SAVE EXTENDED FORMAT STATE STA XTSAV LDA DDSEL ;GO GET STATE OF DOUBLE DENSITY SELECT STA DDSAV ; SAVE IT ALSO CPI ; TO CONTROLLER,TO RESTORE THE SELECTED UNIT CALL MEDIA ;GO TEST MEDIA STATUS, ; THIS MAY BE A DOUBLE SIDED DISKETTE ; ; ; ;SELECT DATA DENSITY ; DENSE: LXI H,MSG36 ;OUTPUT "DOUBLE JNC DENT5 ;IF NOT,GO SET BYTE COUNT, ; FOR DOUBLE DENSITY LDA HDSEL ;GO GET HEAD SELECT STATUS CPI 001H ;UPPER HEAD SELECTED? JNC DENT4 ;IF SO,SET BYTE COUNT AND MOD INPUT CPI 'Y' ;IS IT EXTENDED FORMAT SELECTED? JZ DEN4 ;YES GO STORE EXTENDED FORMAT COMMAND CPI 'N' ;NO,NOT REQUESTED JZ DEN5 JMP LER DEN4: MVI A,080H ;STORE EXJMP DL1 ; ; ; ;ROUTINE TO SELECT UNIT FOR TEST ; UNITS: LXI H,MSG32 ;OUTPUT "UNIT=" TO CONSOLE CALL MSG CALL CONI ;READ CONSOLE INPUT CPI 004H ;UNIT SELECT NUMBER >3? JNC I ;OUTPUT A "DUMMY" EXAMINE STATUS TO ; CONTROLLER,TO CLEAR DATA OUT INTERFACE OUT CNTRL CALL XMTCF ;TRANSMIT CONFIGURATION COMMAND, ; TO CONTROLLER LDA DDSAV 001H ;IS DOUBLE DENSITY SELECTED? JNC DENT3 ;GO TEST FOR TRACK 00,IF SO XRA A ;CLEAR DENSITY "SAVE" STATE STA DDSAV DENT1: LXI D,128 ;SET BYTE COUNT FOR SINGLE DENSITY DENT2: XRA A DENSITY?" TO CONSOLE CALL MSG CALL CECHO ;GO GET KEY-BOARD INPUT CPI 'Y' ;IS IT DOUBLE DENSITY SELECTED? JZ DEN1 ;YES GO STORE DOUBLE DENSITY COMMAND CPI 'N' ;NO GO STORE E, ; FOR DOUBLE DENSITY LDA DDSEL ;SAVE DENSITY SELECT STATUS STA DDSAV LDA XTEND ;SAVE EXTENDED FORMAT STATUS STA XTSAV XRA A ;SET DENSITY STATUS TENDED FORMAT COMMAND JMP DEN6 DEN5: XRA A ;CLEAR EXTENDED FORMAT COMMAND DEN6: STA XTEND JMP MNTR ; ; ; ; ; ; ;SUBROUTINE TO ESTABLISH CORRECT DENSITY FOR ; CURRENT TRACK POSITION AND SELECTED DENNER2 RRC ;NO IT'S O.K AS REQUESTED BY OPERATOR ;SHIFT IT INTO PROPER POSITION RRC STA UNIT ;STORE UNIT SELECT CALL RSTR ;TRANSMIT A SEEK TRACK 00 COMMAND ;RESTORE DENSITY "SAVE " STATE STA DDSEL LDA XTSAV ;RESTORE EXTENDED FORMAT "SAVE" STATE STA XTEND RET DENT3: LDA TRKNO ;GO GET CURRENT TRACK NUMBER CPI 001H ;IS IT TRACK 00? JMP DEN3 DEN2: XRA A ;STORE SINGLE DENSITY COMMAND STA DDSEL JMP DEN5 DEN3: LXI H,MSG47 ;OUTPUT "EXTENDED FORMAT" TO CONSOLE CALL MSG CALL CECHO ;GO GET KEY-BOARDSINGLE DENSITY COMMAND JZ DEN2 JMP LER ;OUTPUT "?" TO CONSOLE. THIS DUMMY ; IS'NT SURE WHAT HE WANTS DEN1: MVI A,010H ;STORE DOUBLE DENSITY SELECT COMMAND STA DDSEL TY MODE DENT4: XRA A ;CLEAR EXTENDED FORMAT FOR UPPER ; SURFACE,TRACK 00 STA XTEND DENT5: LXI D,256 ;SET BYTE COUNT FOR DOUBLE DENSITY JMP DENT2 ; ; ; ; ; ; ;TEST MEDIA STA RET ;GO BACK TO WHERE YOU CAME FROM ; ; ; ;READ INTO BUFFER FROM PRESENT TRACK ; RDT: LXI H,MSG28 ;OUTPUT "READ SECTOR=" TO CONSOLE CALL MSG LXI H,MSG12 CALL MSG CALL JZ ENAB1 CPI 002H ;IS IT UNIT SELECT 02? JZ ENAB2 CPI 003H ;IS IT UNIT SELECT 03? JZ ENAB3 CPI 004H ;UNIT SELECT >3? JNC INER2 ENAB0: MVI A,00HEAD? JZ HEAD1 ;IF YES,GO STORE LOWER HEAD SELECT CPI 'N' ;IS THE UPPER HEAD SELECTED? JZ HEAD2 ;IF YES,GO STORE UPPER HEAD SELECT JMP LER ;OUTPUT "?" TO CONSOLE,AND RETURN TO MONITOR H CRLF LXI H,MSG33 ;OUTPUT "INVALID UNIT NUMBER" TO CONSOLE JMP INERA ; INER3: CALL CRLF LXI H,MSG37 ;OUTPUT "INVALID SECTOR NUMBER" TO CONSOLE JMP INERA ; ; ; ; ;SUBROUTIN THE WRITE BUFFER INX H DCX D MOV A,D ORA E JNZ PATT1 ;LOOP UNTIL WRITE BUFFER IS FULL JMP MNTR ;GO TO MONITOR WHEN DONE ; ; ; ;SUBROUTINE TO ENABLE DRIVE MOTORS TUS SUBROUTINE ; MEDIA: IN DATAI ;GET STATUS FROM CONTROLLER ANI 040H ;TEST MEDIA STATUS JNZ HEAD1 ;GO STORE LOWER HEAD SELECT COMMAND LXI H,MSG7 ;OUTPUT "DOUBLE SIDED DISK:", COMMAND TO CONTROLLER CALL XMTCF ;TRANSMIT LOAD CONFIGURATION COMMAND ; TO CONTROLLER CALL TIME1 ;GO KILL TIME TO ALLOW MOTOR ; TO COME UP TO SPEED CALL LOOPT 1H JMP ENXMT ENAB1: MVI A,002H JMP ENXMT ENAB2: MVI A,004H JMP ENXMT ENAB3: MVI A,008H ENXMT: STA MTREN EN1: CALL XMTUS ;TRANSMIT LOAD UNIT /SECTOR ; EAD1: XRA A ;ZERO OUT A REG. AND STORE LOWER ; HEAD SELECT COMMAND STA HDSEL RET HEAD2: MVI A,020H ;STORE UPPER HEAD SELECT COMMAND STA HDSEL RET ; ; ; ;SET DE TO GET UNIT ADDRESS INTO PROPER ; POSITION FOR CONSOLE OUTPUT ; AUNIT: LDA UNIT ;GET UNIT ADDRESS FROM STORAGE RLC ;ROTATE LEFT 2 PLACES TO GET ; BYTE INTO PROPER POSITION RLC ; ENAB: LXI H,MSG8 ;OUTPUT "ENABLE DRIVE?" TO CONSOLE CALL MSG CALL CONI ;READ CONSOLE INPUT CPI 000H ;IS IT UNIT SELECT 00? JZ ENAB0 CPI 001H ;IS IT UNIT SELECT 01? ; TO CONTROLLER CALL MSG ; ; ; ;SUBROUTINE TO SELECT HEAD ; HEAD: LXI H,MSG6 ;OUTPUT "LOWER HEAD? TO CONSOLE CALL MSG CALL CECHO ;GO GET KEY-BOARD INPUT CPI 'Y' ;IS IT THE LOWER ;GO TEST LOOP COMMAND JMP EN1 ; ; ; ; ;OPERATOR INPUT ERROR MESSAGE ROUTINES ; INER1: LXI H,MSG4 ;OUTPUT "INVALID TRACK NUMBER " TO CONSOLE INERA: CALL MSG CALL CRLF JMP MNTR ; INER2: CALL FOR DESIRED DATA PATTERN STA DBUF ;STORE DATA BYTE TO FREE-UP A REG. LXI H,WBUF ;POINT THE DATA PATTERNS AT THE WRITE BUFFER PATT1: LDA DBUF ;GET THE DESIRED PATTERN FROM STORAGE MOV M,A ;LOAD UPATA PATTERN ROUTINE ; PATT: LXI H,MSG13 ;OUTPUT "PATTERN=" TO CONSOLE CALL MSG LXI D,256 ;SET BYTE COUNT "FILL" TO 256 DECIMAL CALL CONI ;READ CONSOLE KEY-BOARD INPUT ; CONI ;READ KEY-BOARD INPUT FROM CONSOLE ; TO GET DESIRED SECTOR NUMBER ADI 000H ;TEST FOR INVALID SECTOR NUMBER JZ INER3 ;GO PRINT "INVALID SECTOR NUMBER", ; IF SO 080H ;IS IT A DD MARK? RZ MRK1: CALL CLRER ;CLEAR DD MARK STATUS FROM CONTROLLER CALL CRLF LXI H,MSG44 ;OUTPUT "DD MARK" TO CONSOLE CALL MSG CALL TKSEC ;OUTPUT TRACK AND DATAI ;AND YET ANOTHER TIME FOR THE STATUS ANI 080H ;NOW A DELETED DATA MARK? CNZ CLRER ;CLEAR IT AGAIN LXI H,RBUF ;SET H&L REGS. T0 POINT TO FIRST ; LOCATION IN READ BUFFER E READ CRC COMMAND CPI 'N' ;IF READ DATA AND CRC,CLEAR CRC COMMAND JZ CRC2 JMP LER ;OUTPUT "?" TO CONSOLE CRC1: MVI A,007H ;STORE READ CRC COMMAND JMP CRC3 CRC2: XRA A CNZ ERROR ;GO OUTPUT "CRC ERROR" TO CONSOLE, ; IF CRC ERROR OCCURED LDA RDCRC ;GO GET STATE OF READ CRC COMMAND ANI 007H CZ RERR ;GO CHECK FOR DATA COMPARE ERROR, CLRER ;CLEAR IT IF SO IN DATAI ;ONE MORE TIME FOR THE STATUS ANI 080H ;DELETED DATA MARK? CNZ CLRER ;CLEAR IT ALSO JMP RDT3 ;GO TEST IT RDT1: MVI A,003H ;TRANSMIT READ COMMA CPI 01BH ;TEST FOR INVALID SECTOR NUMBER JNC INER3 STA SECNO ;MUST BE GOOD STORE IT CALL SECT8 ;GO TEST FOR EXTENDED FORMAT, ; AND LIMIT OPERATOR INPUT TO 8 SECTORS ;BUMP THE POINTER TO THE NEXT LOCATION, ; IN THE READ BUFFER DCX D ;-1 TO THE BYTE COUNT XRA A ;ARE WE DONE MOVING IN ALL DATA BYTES? ORA E JNZ RDT2 ;GO MVI A,040H ;OUTPUT A READ BUFFER COMMAND, ; TO CONTROLLER OUT CNTRL RDT2: IN DATAI ;GET A DATA BYTE FROM CONTROLLER MOV M,A ;STUFF IT INTO THE READ BUFFER INX H;CLEAR READ CRC COMMAND CRC3: STA RDCRC RDTS: CALL XMTUS ;TRANSMIT UNIT/SECTOR TO CONTROLLER CALL DENT ;GO TEST FOR PROPER DENSITY, ; AND TRANSMIT TO CONTROLLER. ; (RETURN ; IF NOT A READ CRC COMMAND RDT4: CALL LOOPT ;GO TEST LOOP COMMAND JMP RDTS ; ; ; ;SUBROUTINE TO TEST DELETED DATA MARK ON READ ; DDMRK: IN DATAI ;EXAMINE STATUS FROM CONTROLLER ANI ND TO CONTROLLER CALL XMITW IN DATAI ;EXAMINE STATUS FROM CONTROLLER STA SAVE ;SAVE POSSIBLE CRC ERROR STATUS ANI 008H ;CRC ERROR? CNZ CLRER ;CLEAR IT IF SO IN ; IF SO LXI H,MSG46 ;OUTPUT "CRC ONLY?" TO CONSOLE CALL MSG CALL CECHO ;GO GET KEY-BOARD INPUT CPI 'Y' ;READ CRC REQUESTED? JZ CRC1 ;IF YES,STOR FOR MORE,IF NOT DONE RDT3: LDA SAVE ;GO GET "SAVED STATUS" FROM STORAGE ANI 080H ;DELETED DATA MARK? CNZ MRK1 ;OUTPUT "DD MARK" TO CONSOLE,IF SO LDA SAVE ANI 008H ;CRC ERROR? MMAND? JZ RDT1 ;IF NOT,GO READ DATA AND CRC CALL XMITW IN DATAI ;EXAMINE STATUS FROM CONTROLLER STA SAVE ;SAVE POSSIBLE CRC ERROR STATUS ANI 008H ;CRC ERROR? CNZ WITH BYTE COUNT IN D&E REGS.) CALL CLRER ;GO CLEAR ERROR FLAGS RDT1A: XRA A ;CLEAR "SAVED STATUS" STA SAVE LDA RDCRC ;GO GET STATE OF READ CRC COMMAND ANI 007H ;IS IT A READ CRC COSECTOR,THAT THE ; DELETED DATA MARK OCCURED ON RET ; ; ; ; ; ; ;SUBROUTINE TO COMPARE READ DATA TO WRITE DATA, ; AND INDICATE THE FIRST BYTE IN ERROR ; RERR: CALL DENT ;GO GET BYTE COUNT INTO D&E REGSNZ WRT4 ;IS THE DISKETTE WRITE PROTECTED? LXI H,MSG43 ;OUTPUT "DELETE DATA?" TO CONSOLE CALL MSG CALL CECHO ;GO GET KEY-BOARD INPUT CPI 'Y' ;DELETED DATA REQUESTED? JZ CALL BYTEO CALL SP4 LDA SECNO ;OUTPUT SECTOR NUMBER TO CONSOLE CALL BYTEO CALL SP5 LDA DCTR ;OUTPUT BYTE NUMBER IN ERROR TO CONSOLE CALL BYTEO CALL B ;+1 TO READ BUFFER POINTER STA WAS ;STORE "WAS" BYTE CMP M ;COMPARE "WAS" BYTE,TO "S/B" BYTE JNZ RERR3 ;GO PRINT ERROR STATUS, ; IF A MISMATCH OCCURS INX R", ; IF SO CPI 01BH ;TEST FOR INVALID SECTOR NUMBER JNC INER3 STA SECNO ;MUST BE GOOD STORE IT CALL SECT8 ;LIMIT OPERATOR INPUT TO 8 SECTORS, OLE CALL MSG JMP RERR5 RERR4: LXI H,MSG40 ;OUTPUT "LOWER HEAD" TO CONSOLE CALL MSG RERR5: MVI C,007H ;RING THAT BELL CALL CO LXI H,MSG15 ;OUTPUT ERROR MESSAG. LXI B,RBUF ;SET B&C REGS. TO POINT TO FIRST ; LOCATION IN READ BUFFER LXI H,WBUF ;SET H&L REGS. TO POINT TO FIRST ; LOCATION IN WRITE BUFFER RERR1: MOV A,M ;GO GHE ERROR COUNTER TO PRESENT TRACK INX H SHLD ECTR RET ; ; ; ;WRITE FROM BUFFER TO PRESENT TRACK ; WRT: LXI H,MSG27 ;OUTPUT "WRITE SECTOR=" TO CONSOLE CALL MSG LXI H,MSG12 SP3 LDA WAS ;OUTPUT "WAS" DATA BYTE TO CONSOLE CALL BYTEO CALL SP2 LDA SHDBE ;OUTPUT "S/B" DATA BYTE TO CONSOLE CALL BYTEO CALL CRLF LHLD ECTR ;UPDATE TH ;+1 TO WRITE BUFFER POINTER DCX D ;-1 TO BYTE COUNT XRA A ;ZERO OUT A REG. ORA E ;OR IN E REG. STA DCTR ;STORE DATA BYTE COUNTER JNZ RERR1 ;GO COMPARE ANOT ; IF EXTENDED FORMAT CALL WPRT ;HAS THE OPERATOR REQUESTED WRITE PROTECTION? JNZ WRT4 ;BAIL-OUT ,IF SO IN DATAI ;GET STATUS FROM CONTROLLER ANI 010H ;MASK WRITE PROTECT BIT JE HEADER TO CONSOLE CALL MSG CALL CRLF CALL SP1 CALL AUNIT ;OUTPUT ACTUAL UNIT NUMBER TO CONSOLE CALL BYTEO CALL SP3 LDA TRKNO ;OUTPUT TRACK NUMBER TO CONSOLE ET A BYTE FROM WRITE BUFFER, ; AND STUFF IT INTO A REG. STA SHDBE ;STORE "S/B" BYTE LDAX B ;GO GET A BYTE FROM READ BUFFER, ; AND STUFF IT INTO A REG. INX CALL MSG CALL CONI ;READ KEY-BOARD INPUT FROM CONSOLE ; TO GET DESIRED SECTOR NUMBER ADI 000H ;TEST FOR INVALID SECTOR NUMBER JZ INER3 ;GO PRINT "INVALID SECTOR NUMBELXI H,MSG5 ;OUTPUT "READ DATA ERROR" TO CONSOLE CALL MSG LDA HDSEL ;GO GET HEAD SELECT ANI 020H ;IS IT THE UPPER HEAD? JZ RERR4 LXI H,MSG41 ;OUTPUT "UPPER HEAD" TO CONSHER DATA BYTE, ; IF NOT FINISHED WITH ENTIRE RECORD RET ; ; ; ;SUBROUTINE TO OUTPUT READ DATA ERROR STATUS TO CONSOLE ; RERR3: MOV A,L ;SAVE POINTER FOR DATA BYTE COUNTER STA DCTR DEL1 ;IF YES,GO STORE WRITE DELETED ; DATA MARK COMMAND CPI 'N' ;IF NO,CLEAR WRITE DELETED DATA ; MARK COMMAND JZ DEL2 JMP LER ;OUTPUT "?" TO CONSOLT IT TO CONTROLLER LDA NEWTK ;RE-ESTABLISH TRACK NUMBER STA TRKNO CPI 000H ;TRACK 00 REQUESTED? JNZ FORMA CALL RSTR ;YES DO A SEEK TRACK 00 JMP FORMB FORMA: C RNZ LDA TRKNO ;GO GET CURRENT TRACK NUMBER CPI 001H ;IF NOT,CHECK FOR 8 SECTORS OR LESS RC LDA SECNO ;SECTOR NUMBER >8 DECIMAL? CPI 009H JNC INER3 ;IF YES,O LOCATION IN WRITE BUFFER MVI A,030H ;OUTPUT WRITE BUFFER COMMAND, ; TO CONTROLLER OUT CNTRL WRT2: MOV A,M ;GET A DATA BYTE FROM WRITE BUFFER OUT DATAO ;SPIT IT OUT TO THE C FORM0 JMP LER FORMS: CALL SP2 LXI H,MSG54 ;OUTPUT "TRACK=" TO CONSOLE CALL MSG CALL CONI ;READ CONSOLE INPUT STA NEWTK ;SAVE TRACK NUMBER CPI 04DH JMP WRT1 WRT4: CALL WPMSG ;OUTPUT "WRITE PROTECT" TO CONSOLE JMP MNTR ; ; ;SUBROUTINE TO INDICATE CRC ERROR,AND CLEAR ERROR FLAGS ; ERROR: LXI H,MSG39 ;OUTPUT "CRC ERROR" TO CONSOLE CALL MSG E DEL1: MVI A,00FH ;STORE WRITE DD MARK JMP DEL3 DEL2: XRA A ;ZERO OUT A REG. DEL3: STA DELET WRT1: CALL XMTUS ;TRANSMIT UNIT/SECTOR TO CONTROLLER CALL DENT ;GO TEST FOR PROPER DENSITY, ; TO CONTROLLER CALL XMIT CLRER: MVI A,00BH ;OUTPUT CLEAR ERROR FLAGS TO CONTROLLER CALL XMIT RET ; ; ; ;ROUTINE TO FORMAT ALL TRACKS ON A DISKETTE ; FORM: LXI H,MSG9 ;OUTPUT "UTPUT "SECTOR NUMBER" ; TO CONSOLE,AND GO TO THE MONITOR RET ;NO,IT'S O.K. ; ; ; ; ;SUBROUTINE TO CLEAR CONTROLLER AND/OR ERROR FLAGS ; SCLR: MVI A,081H ;TRANSMIT CLEAR CONTROLLER COMMAND ONTROLLER INX H ;BUMP THE WRITE BUFFER POINTER DCX D ;-1 TO THE BYTE COUNT XRA A ;HAVE ALL DATA BYTES BEEN SENT? ORA E JNZ WRT2 ;GO SEND SOME MORE,IF NOT DONE JNC INER1 ;INVALID TRACK NUMBER? FORML: CALL FORMT ;GO DO A FORMAT INITIALIZE MVI A,020H ;STORE FORMAT MODE STA MODE CALL DENT ;GO ESTABLISH PROPER DENSITY, ; AND OUTPU CALL CLRER ;CLEAR ERROR FLAGS RET ; ; ; ; ;SUBROUTINE TO LIMIT OPERATOR TO 8 SECTORS IF EXTENDED FORMAT ; SECT8: LDA XTEND ;GO GET STATE OF EXTENDED FORMAT COMMAND CPI 080H ;RETURN,IF NOT EXTENDED FORMAT ; AND TRANSMIT TO CONTROLLER. ; (RETURN WITH BYTE COUNT IN D&E REGS.) CALL CLRER ;GO CLEAR ERROR FLAGS LXI H,WBUF ;SET H&L REGS. TO POINT TO FIRST ;FORMAT SINGLE TRACK?" TO CONSOLE CALL MSG CALL CECHO ;GO GET KEY-BOARD INPUT CPI 'Y' ;FORMAT SINGLE TRACK REQUESTED? JZ FORMS CPI 'N' ;IF NO,FORMAT ALL TRACKS JZ IN DATAI ;EXAMINE STATUS FROM CONTROLLER ANI 008H ;CRC ERROR? CNZ ERROR ;GO OUTPUT "CRC ERROR" TO CONSOLE, ; IF CRC ERROR OCCURED WRT3: CALL LOOPT ;GO TEST LOOP COMMAND LDA DELET ;GO GET DELETED DATA MARK COMMAND ANI 00FH ;IS IT A WRITE DD MARK COMMAND? JNZ WRT2A ;WRITE DD MARK,IF SO MVI A,005H ;OUTPUT WRITE COMMAND TO CONTROLLER WRT2A: CALL XMITW ALL XMTTK ;TRANSMIT TRACK NUMBER, ; TO CONTROLLER CALL SKTRK ;TRANSMIT SEEK COMMAND, ; TO CONTROLLER FORMB: MVI A,005H ;TRANSMIT WRITE COMMAND, ; TO CAD SELECTED? JNZ VRFYS ;GO CHECK THE UPPER SURFACE, ; IF THE UPPER HEAD IS SELECTED JMP FORME ;EXIT TEST HERE,AND GO TO MONITOR ; AFTER CLEARING FORMAT MODE ; ; ; ;ROU SURFACE,IF THE ; UPPER HEAD IS SELECTED VRFY: XRA A ;CLEAR FORMAT MODE AND HEAD SELECT STA MODE STA HDSEL LXI H,MSG48 ;OUTPUT "VERIFY" TO CONSOLE CALL DENT ;GO TEST FOR PROPER DENSITY(FORMAT MODE ; WILL BE EXECUTED AT THIS TIME),AND ; TRANSMIT TO CONTROLLER MVI A,005H ;TRANSMIT WRITE COMMAND, ; TO CONTROLLER00 COMMAND, ; TO CONTROLLER LDA HDSEL ;GET THE CURRENT STATE OF HEAD SELECT CPI 020H ;END THIS PASS,IF THE UPPER HEAD ; IS SELECTED JZ FORME CALL CPI 020H ;GO VERIFY ALL TRACKS,IF UPPER ; HEAD IS SELECTED AFTER CLEARING ; FORMAT MODE JZ VRFY ;GO VERIFY ALL TRACKS,IF DONE CALL DSIDE ;GO FIND OUT IF IT'S A ONTROLLER CALL XMITW XRA A ;CLEAR FORMAT MODE STA MODE CALL LOOPT ;GO TEST LOOP COMMAND JMP FORML FORM0: CALL FORMI ;GO DO A FORMAT INITIALIZE CALL CRLF FORM1 INCTN ;INCREMENT TRACK NUMBER JZ VRFY2 ;GO DO A RESTORE,AND ATTEMPT TO ; CHECK UPPER SURFACE,IF ALL TRACKS ; HAVE BEEN CHECKED ON THE LOWER CALL XMTTK ;TRANSMIT LOADMSG CALL CRLF VRFYS: CALL SEC01 ;INITIALIZE FOR SECTOR 01 CALL DENT ;GO ESTABLISH PROPER DENSITY, ; AND TRANSMIT TO CONTROLLER CALL VRFYR ;GO CHECK CRC ON A SECTOR VRFY1: CALL CALL XMITW CALL INCTN ;INCREMENT TRACK NUMBER JZ FORM2 ;GO DO A RESTORE,AND ATTEMPT ; TO FORMAT UPPER SURFACE ; IF ALL TRACKS HAVE BEEN DSIDE ;GO FIND OUT IF THIS IS A ; DOUBLE SIDED DISKETTE,AND ; CHECK THE UPPER SURFACE IF SO LDA HDSEL ;GET THE CURRENT STATE OF HEAD SELECT CPI 000H ;IS THE LOWER HEDOUBLE ; SIDED DISKETTE,AND SELECT HEAD ; AS REQUIRED LDA HDSEL ;GO GET HEAD SELECT STATUS CPI 000H ;IS THE LOWER HEAD SELECTED? JNZ FORM1 ;GO FORMAT UPPER: CALL KBINT ;GO TEST FOR KEY-BOARD INTERRUPT CALL SEC01 ;INITIALIZE FOR SECTOR 01 CALL FILLE5 ;FILL CONTROLLER WRITE BUFFER WITH E5'S MVI A,020H ;STORE FORMAT MODE STA MODE CALL TRACK COMMAND ; TO CONTROLLER CALL SKTRK ;TRANSMIT SEEK COMMAND, ; TO CONTROLLER JMP VRFYS ;GO CHECK SECTORS ON A NEW TRACK VRFY2: CALL RSTR ;TRANSMIT SEEK TRACK K COMMAND ; TO CONTROLLER JMP FORM1 ;FORMAT NEXT TRACK FORM2: CALL RSTR ;TRANSMIT SEEK TRACK 00 ; COMMAND TO CONTROLLER LDA HDSEL ;GO GET HEAD SELECT STATE ; FORMATTED ON LOWER CALL XMTUS ;TRANSMIT LOAD UNIT/SECTOR, ; TO CONTROLLER CALL XMTTK ;TRANSMIT LOAD TRACK NUMBER ; TO CONTROLLER CALL SKTRK ;TRANSMIT SEETINE TO VERIFY (READ CRC) ALL TRACKS/SECTORS ; VRFYT: LXI H,MSG49 ;OUTPUT "VERIFY SINGLE TRACK?" TO CONSOLE CALL MSG CALL CECHO ;GET A KEY-BOARD INPUT CPI 'Y' JZ VRF1 CPI ANI 008H ;CRC ERROR? JNZ ERTRY ;GO DO RETRIES,IF CRC ERROR HAS OCCURED CALL DDMRK ;GO TEST FOR POSSIBLE DD MARK RET ERTRY: CALL CLRER ;TRANSMIT CLEAR ERROR FLAGS, SET HEAD SELECT,TO LOWER SURFACE FORMT: CALL WPRT ;HAS THE OPERATOR REQUESTED WRITE PROTECTION? JNZ WRT4 ;BAIL-OUT,IF SO CALL RWCI ;INITIALIZE FOR FORMATTING IN DATAI ;GET CONTROLLER STATUS CALL RSTR ;YES DO A SEEK TRACK 00 JMP VRF4 VRF3: CALL XMTTK ;TRANSMIT TRACK NUMBER, ; TO CONTROLLER CALL SKTRK ;TRANSMIT SEEK TRACK, ; TO CONTROLLER VRF4:T CALL TCRCE ;GO TEST FOR POSSIBLE CRC ERROR CALL VERSEC ;GO CHECK FOR PROPER SECTOR NUMBER RZ ;SEEK TO NEXT TRACK,IF DONE CALL XMTUS ;WERE NOT FINISHED WITH THIS TRACK YET STA HDSEL ;CLEAR HEAD SELECT CALL LOOPT ;GO TEST LOOP COMMAND LDA VFYCM ;GO GET STATE OF FORMAT COMMAND ADI 000H ;MASK IT JNZ VRF6 ;GO RE-VERIFY ALL TRACKS/SECTORS, 'N' JZ VRF5 JMP LER ;OOPS VRF1: CALL SP2 LXI H,MSG54 ;OUTPUT "TRACK=" TO CONSOLE CALL MSG CALL CONI STA NEWTK ;SAVE THE CONSOLE INPUT CPI COMMAND, ; TO CONTROLLER OUT CNTRL FILL: MVI A,0E5H ;SET UP FOR DATA E5 HEX OUT DATAO ;OUT TO THE DATA PORT DCX D ;-1 TO BYTE COUNT MOV A,D ORA ANI 010H ;IS THE DISKETTE WRITE PROTECTED? JNZ NFORM ;IF YES,GO TO THE MONITOR FILLE5: LXI D,256 ;SET BYTE COUNT TO FILL ; CONTROLLERS WRITE BUFFER MVI A,030H ;OUTPUT WRITE BUFFER CALL SEC01 ;INITIALIZE FOR SECTOR 01 CALL DENT ;SET-UP DENSITY AGAIN CALL VRFYR ;READ CRC'S ON THIS TRACK,ALL SECTORS CALL SEC01 ;RE-INITIALIZE TO SECTOR 01 CALL LOOPT JMP ; GO CHECK ANOTHER SECTOR JMP VRFYR ; ; ; ;SUBROUTINE TO READ AND TEST FOR CRC ERRORS ; TCRCE: MVI A,007H ;TRANSMIT READ CRC TO CONTROLLER CALL XMITW CRCER: IN DATAI ;GET STATUS FROM CONTROLLER ; IF REQUESTED LXI H,MSG50 ;OUTPUT "FORMAT" TO CONSOLE CALL MSG JMP FORM0 ; ; ; ;SUBROUTINE TO INITIALIZE AND FILL CONTROLLER WRITE BUFFER WITH E5 HEX DATA ; FORMI: CALL HEAD1 ; 04DH JNC INER1 ;OOPS VRF2: CALL RWCI ;INITIALIZE FOR VERIFY CALL DENT ;SET-UP DENSITY LDA NEWTK STA TRKNO CPI 000H ;TRACK 00 REQUESTED? JNZ VRF3 E JNZ FILL RET ; ; ; ;SUBROUTINE TO VERIFY (READ CRC) A TRACK IN FORMAT TEST ; VRFYR: LDA TRIES ;GET RETRIES STA RETRY ;STORE IN RETRY COUNTER CALL KBINT ;GO TEST FOR KEY-BOARD INTERRUP JMP VRFYS ;GO VERIFY ALL TRACKS AND SECTORS ; ; ; ; ; NFORM: CALL SP1 LXI H,MSG35 ;OUTPUT "WRITE PROTECT" TO CONSOLE CALL MSG FORME: XRA A ;CLEAR FORMAT MODE STA MODE VRF2 VRF5: CALL CRLF MVI A,001H ;SET VERIFY COMMAND STA VFYCM XRA A ;CLEAR FORMAT MODE AND HEAD SELECT STA MODE STA HDSEL VRF6: CALL RWCI ;INITIALIZE FOR VERIFY ; TO CONTROLLER LXI H,MSG39 ;OUTPUT "CRC ERROR" TO CONSOLE CALL MSG CALL TKSEC ;OUTPUT TRACK AND SECTOR IN ERROR, ; TO THE CONSOLE LDA RETRY ;GO GET THE ERROR RETRROLLER JMP RWCWS ;GO WRITE SECTOR ON NEW TRACK NUMBER RWCW5: CALL RSTR ;TRANSMIT SEEK TRACK 00 ; COMMAND TO CONTROLLER LDA HDSEL ;GO GET HEAD SELECT STATUS CPI 020H ;GO REALHLD ECTR ;OUTPUT ERROR NUMBER TO CONSOLE MOV A,H CALL BYTEO MOV A,L CALL BYTEO CALL RWCI ;GO INITIALIZE FOR WRITE/READ CONTINUOUS CALL WPRT ;GO GET STATE OF OPERAT AUNIT ;OUTPUT UNIT NUMBER TO CONSOLE CALL BYTEO CALL SP2 LXI H,MSG58 ;OUTPUT "TRACK=" TO CONSOLE CALL MSG LDA TRKNO ;GET THE CURRENT TRACK NUMBER CALL BYTEO ;US ;TRANSMIT LOAD UNIT/SECTOR ; COMMAND,TO CONTROLLER JMP RWCW ;GO WRITE NEXT SECTOR RWCW4: CALL INCTN ;INCREMENT TRACK NUMBER JZ RWCW5 ;GO DO A RESTORE,AND ATTEMPT TO G RWCP: CALL HEAD1 ;SET HEAD SELECT TO LOWER SURFACE MVI C,007H ;OUTPUT A "BELL" TO INDICATE THE ; START OF A PASS CALL CO LXI H,MSG1 ;OUTPUT "PASS=" TO CONSOLE CALL Y COUNTER, ; AND UPDATE IT DCR A STA RETRY CPI 000H ;RETRIES FINISHED? JZ MEDER ;QUIT IF RETRIES ARE FINISHED, ; THIS IS A NON-RECOVERABLE ERO ;JUMP TO DO READ ONLY ROUTINE ; IF WRITE PROTECT STATUS IS TRUE RWCWW: CALL CRLF LXI H,MSG2 ;OUTPUT "WRITE" TO CONSOLE CALL MSG CALL CRLF RWCWS: CALL SEC01 ;INITIALIZE FOOR REQUESTED ; WRITE PROTECT JNZ READO ;GO DO "READ ONLY" IF WRITE PROTECTED IN DATAI ;GET STATUS FROM CONTROLLER ANI 010H ;IS THE DISKETTE WRITE PROTECTED? JNZ READOUTPUT IT TO THE CONSOLE CALL SP2 LXI H,MSG59 ;OUTPUT "SECTOR=" TO CONSOLE CALL MSG LDA SECNO ;GO GET THE CURRENT SECTOR NUMBER CALL BYTEO ;OUTPUT IT TO THE CONSOLE RE ; WRITE UPPER SURFACE,IF ALL TRACKS HAVE BEEN ; WRITTEN ON THE LOWER CALL XMTTK ;TRANSMIT LOAD TRACK NUMBER ; TO CONTROLLER CALL SKTRK ;TRANSMIT SEEK COMMAND TO CONT MSG LHLD PCTR ;OUTPUT PASS NUMBER TO CONSOLE MOV A,H CALL BYTEO MOV A,L CALL BYTEO LXI H,MSG16 ;OUTPUT "ERROR TOTAL=" TO CONSOLE CALL MSG ROR JMP TCRCE ;WERE NOT DONE YET,TRY AGAIN ; ; ; ;SUBROUTINE TO OUTPUT TRACK AND SECTOR IN ERROR TO THE CONSOLE ; TKSEC: CALL SP1 LXI H,MSG31 ;OUTPUT "UNIT=" TO CONSOLE CALL MSG CALLR SECTOR 01 RWCW: CALL KBINT ;GO TEST FOR KEY-BOARD INTERRUPT CALL RWCW1 ;GO WRITE A SECTOR CALL SECCK ;GO CHECK FOR PROPER SECTOR NUMBER JZ RWCW4 ;GO TO A NEW TRACK IF FINISHED CALL XMT ; TO CONTROLLER JMP MNTR ; ; ; ; ; ;TEST WRITE/READ CONTINUOUS (WRITE AND READ ALL AVAILABLE TRACKS) ; RWC: LXI H,MSG30 ;OUTPUT "TEST WRITE/READ CONTINUOUS" ; TO CONSOLE CALL MST ; ; ; ;SUBROUTINE TO INDICATE A "HARD ERROR"(MEDIA ERROR),RESTORE,AND QUIT ; MEDER: LXI H,MSG17 ;OUTPUT "MEDIA ERROR" TO CONSOLE CALL MSG CALL RSTR ;TRANSMIT SEEK TRACK 00 COMMAND, D IF THE UPPER HEAD ; IS SELECTED JZ RWCRX CALL DSIDE ;GO FIND OUT IF IT'S A DOUBLE ; SIDED DISKETTE,AND SELECT HEAD ; AS REQUIRED LDA REGS. TO POINT TO FIRST ; LOCATION IN WRITE BUFFER MVI A,030H ;OUTPUT WRITE BUFFER COMMAND, ; TO CONTROLLER OUT CNTRL WSEC1: MOV A,M ;LOAD A BYTE FROM WRITE BUFFER CALL DSIDE ;GO FIND OUT IF THIS IS A DOUBLE ; SIDED DISKETTE,AND READ UPPER ; SURFACE IF SO LDA HDSEL ;GO GET HEAD SELECT STATUS CPI 000H ;LOWER HEAD SELECTED? LXI H,MSG3 ;OUTPUT "READ" TO CONSOLE CALL MSG CALL CRLF CALL RWCI ;INITIALIZE TEST FOR READ RWCRS: CALL SEC01 ;INITIALIZE FOR SECTOR 01 RWCR1: CALL KBINT ;GO TEST FOR KEY-BOARD INTERRUPT D OUT STATUS OF WRITE RZ CALL WERR ;OOPS CRC ERROR JMP RWCWS ;GO TRY AGAIN ; ; ; ;SUBROUTINE TO SET-UP WRITE SECTOR ; WSEC: CALL PTKSC ;FILL WRITE BUFFER WITH ALTERNATE ; R CALL XMTTK ;TRANSMIT LOAD TRACK COMMAND ; TO CONTROLLER CALL SKTRK ;TRANSMIT SEEK COMMAND TO CONTROLLER JMP RWCRS ;GO READ SECTOR ON NEW TRACK NUMBER RWCR7: CALL RSTR ;TRAN HDSEL ;GO GET HEAD SELECT STATUS CPI 000H ;IS THE LOWER HEAD SELECTED? JNZ RWCWW ;GO WRITE THE UPPER SURFACE, ; IF THE UPPER HEAD IS SELECTED RWCRX: CALL KBINT ;GO CHECK FOR KEY-BOARD I SHLD PCTR ;STORE NEW PASS NUMBER JMP RWCP ;GO DO THE NEXT PASS ; ; ; READO: CALL SP1 LXI H,MSG35 ;OUTPUT "WRITE PROTECT" TO CONSOLE CALL MSG JMP RWCRX ;GO DO A READ JNZ RWCRR ;GO READ UPPER SURFACE,IF UPPER ; HEAD IS SELECTED RWCE: LHLD PCTR ;GO GET PASS COUNTER FROM STORAGE, ; AND UPDATE IT INX H ;INCREMENT PASS COUNTER CALL DENT ;GO TEST FOR PROPER DENSITY AND ; TRANSMIT TO CONTROLLER ; (RETURN WITH BYTE COUNT IN D&E REGS.) CALL RWCR2 ;GO READ A SECTOR CALL SECCK ;GO CHECK FORTRACK AND SECTOR NUMBER,AS DATA CALL DENT ;GO TEST FOR PROPER DENSITY FOR CURRENT ; TRACK POSITION,AND RETURN WITH THE ; BYTE COUNT IN THE D&E REGISTERS LXI H,WBUF ;SET H&LSMIT SEEK TRACK 00 ; COMMAND TO CONTROLLER LDA HDSEL ;GO GET HEAD SELECT STATUS CPI 020H ;GO END THIS PASS IF THE UPPER ; HEAD IS SELECTED JZ RWCE NTERRUPT CALL HEAD1 ;SELECT LOWER HEAD LDA BLOOP ;GET THE STATE OF THE LOOP COMMAND ADI 000H ;LOOP ON WRITE CONTINUOUS? JNZ RWCE ;GO DO ANOTHER WRITE PASS IF SO RWCRR: CALL CRLF PASS ONLY ; ; ; ;SUBROUTINE TO WRITE A SECTOR IN WRITE/READ CONTINUOUS TEST ; RWCW1: CALL WSEC ;SET-UP FOR WRITE SECTOR MVI A,005H ;TRANSMIT WRITE COMMAND TO CONTROLLER CALL XMITW CALL WSTAT ;GO FINJMP RWCR1 ;GO READ NEXT SECTOR RWCR6: CALL INCTN ;INCREMENT TRACK NUMBER JZ RWCR7 ;GO DO A RESTORE,AND ATTEMPT TO ; READ UPPER SURFACE,IF ALL TRACKS HAVE ; BEEN READ ON LOWE PROPER SECTOR NUMBER JZ RWCR6 ;GO TO A NEW TRACK IF FINISHED CALL XMTUS ;TRANSMIT LOAD UNIT/SECTOR COMMAND ; TO CONTROLLER,WERE NOT DONE WITH ; THIS TRACK YET ; FOR OUTPUT TO CONTROLLER OUT DATAO ;OUTPUT IT INX H ;BUMP THE POINTER TO THE NEXT ; LOCATION IN THE WRITE BUFFER DCX D ;-1 TO BYTE COUNT T "SYSTEM TEST" ; TO CONSOLE CALL MSG SYSS: CALL RGEN ;SET-UP THE RANDOM TRACK NUMBER TABLE XRA A ;SET UNIT SELECT TO 00 STA UNIT CALL HEAD1 ;SET HEAD SELECT PTKSC ;FILL WRITE BUFFER WITH ALTERNATE ; TRACK AND SECTOR NUMBER,AS DATA CALL RERR ;GO DO A BYTE FOR BYTE COMPARE ON DATA, ; FOR POSSIBLE ERROR IN DATA FIELD H,MSG39 ;YES OUTPUT "CRC ERROR" TO CONSOLE CALL MSG LXI H,MSG2 ;OUTPUT "WRITE" TO CONSOLE CALL MSG CALL CLRER ;TRANSMIT CLEAR ERROR FLAGS, ; TO CONTROLLER CR ; TO CONTROLLER MVI A,081H ;TRANSMIT CLEAR COMMAND ; TO CONTROLLER CALL XMIT CALL RSTR ;TRANSMIT SEEK TO TRACK 00 ; COMMAND TO CONTR ; LOCATION IN READ BUFFER MVI A,040H ;TRANSMIT READ BUFFER COMMAND, ; TO CONTROLLER OUT CNTRL RWCR4: IN DATAI ;GET A DATA BYTE MOV M,A ;STUFF IT INTO THE READ BU XRA A ;ZERO OUT A REG. ORA E ;OR IN E REG. JNZ WSEC1 ;GO OUTPUT ANOTHER BYTE IF ALL THE DATA ; HAS NOT BEEN TRANSMITTED TO ; THE CONTROLLER RET CALL MSG LXI H,MSG3 ;OUTPUT "READ" TO CONSOLE CALL MSG CALL CLRER ;CLEAR ANY ERROR CALL TKSEC ;OUTPUT TRACK AND SECTOR IN ERROR TO CONSOLE LHLD ECTR ;UPDATE THE ERROR C ; (CRC ERROR STATUS REPORT MAY ; BE BROKEN,AND NOT TELL US) LDA SAVE ;GO GET "SAVED" STATUS ANI 008H ;CRC ERROR? RZ LXI H,MSG39 ;YES OUTPUT "CRC ERROR" TO CONSOLEALL TKSEC ;OUTPUT TRACK AND SECTOR IN ERROR TO CONSOLE LHLD ECTR ;UPDATE THE ERROR COUNTER INX H SHLD ECTR RET ; ; ; ; ; ; ; ;SUBROUTINE TO READ A SECTOR IN WRITE/READ CONTINUOUS TEST ; RWOLLER CALL CLRER ;TRANSMIT CLEAR ERROR FLAGS ; TO CONTROLLER RET ; ; ; ; ; ; ;SYSTEM TEST (WRITES ALL TRACKS,READS TRACKS ON RANDOM SEEKS,UNITS 00 AND 01) ; SYS: LXI H,MSG57 ;OUTPUFFER INX H ;BUMP THE READ BUFFER POINTER DCX D ;-1 TO THE BYTE COUNT XRA A ;IS ALL THE DATA IN? ORA E JNZ RWCR4 ;GO GET ANOTHER DATA BYTE IF NOT DONE CALL ; ; ; ;SUBROUTINE TO CHECK STATUS OF WRITE SECTOR ; WSTAT: IN DATAI ;GO GET STATUS FROM CONTROLLER ANI 008H ;CRC ERROR?FIND OUT AT THE RETURN RET ; ; ; ;SUBROUTINE TO INDICATE A WRITE ERROR ; WERR: LXI OUNTER INX H SHLD ECTR JMP RWCRS ; ; ; ; ; ; ; ; ; ;SUBROUTINE TO INITIALIZE WRITE/READ CONTINUOUS ; RWCI: CALL SEC01 ;INITIALIZE FOR SECTOR 01 CALL XMTUS ;TRANSMIT LOAD UNIT/SECTO SAVE ;SAVE IT ANI 008H ;HAVE WE GOT A CRC ERROR? CNZ CLRER ;GO CLEAR ERROR FLAGS,IF SO CALL DDMRK ;GO TEST FOR POSSIBLE DD MARK LXI H,RBUF ;SET H&L REGS. TO POINT TO FIRST CR2: XRA A ;CLEAR OUT OLD "SAVE" STATUS STA SAVE RWCR3: MVI A,003H ;TRANSMIT READ COMMAND ; TO CONTROLLER CALL XMITW IN DATAI ;GET CONTROLLER STATUS STA TO LOWER SURFACE MVI C,007H ;OUTPUT A "BELL" TO INDICATE THE ; START OF A PASS CALL CO LXI H,MSG1 ;OUTPUT "PASS=" TO CONSOLE CALL MSG LHLD PCTR ;OUTPUT PASS NT FOR READ CALL UFLIP ;SELECT NEW UNIT JNZ SYSRI ;DO A RESTORE ON UNIT 01,IF NOT UNIT 00 SYSR2: CALL DENT ;SET DENSITY AND BYTE COUNT FOR ; CURRENT TRACK POSITION CALL RMK MBER TO CONTROLLER ; COMMAND TO CONTROLLER CALL SKTRK ;TRANSMIT SEEK COMMAND TO CONTROLLER CALL UFLIP ;SELECT NEW UNIT JNZ SYSW4 ;SEEK TO NEXT TRACK ON UNIT 01, CT JNZ MNTR ;GO TO THE COMMAND MONITOR,IF WRITE PROTECTED CALL UFLIP ;SELECT THE NEXT UNIT JNZ SYSWI ;RESTORE AND CHECK IT ALSO CALL WPRT ;CHECK FOR OPERATOR REQUESTED WRITE PROTECTION PPER SURFACE, ; IF THE UPPER HEAD IS SELECTED SYSR: CALL KBINT ;GO CHECK FOR KEY-BOARD INTERRUPT CALL HEAD1 ;SELECT LOWER HEAD LDA BLOOP ;GET THE STATE OF THE LOOP COMMAND ADI GO WRITE NEXT SECTOR SYSW3: CALL UFLIP ;SELECT NEW UNIT JNZ SYSW1 ;DO A WRITE ON UNIT 01,IF NOT UNIT 00 CALL INCTN ;INCREMENT TRACK NUMBER JZ SYSW5 ;GO DO A RESTORE,AND ATTEMPT TO UMBER TO CONSOLE MOV A,H CALL BYTEO MOV A,L CALL BYTEO LXI H,MSG16 ;OUTPUT "ERROR TOTAL=" TO CONSOLE CALL MSG LHLD ECTR ;OUTPUT ERROR NUMBER TO CONSOO A RESTORE 0N UNIT 01,IF NOT UNIT 00 LDA HDSEL ;GO GET HEAD SELECT STATUS CPI 020H ;GO READ IF THE UPPER HEAD ; IS SELECTED JZ SYSR CALL DSIDE ;GO FIND OUT IF IT'S A ; IF NOT UNIT 00 JMP SYSW1 ;GO WRITE SECTOR ON NEW TRACK NUMBER SYSW5: CALL RSTR ;TRANSMIT SEEK TRACK 00 COMMAND, ; TO CONTROLLER CALL UFLIP ;SELECT NEW UNIT JNZ SYSW5 ;D JNZ SYSRO ;DO "READ ONLY" PASSES IF REQUESTED SYSW: CALL CRLF LXI H,MSG2 ;OUTPUT "WRITE" TO CONSOLE CALL MSG CALL CRLF SYSW1: CALL SEC01 ;INITIALIZE FOR SECTOR 01 CALL WMK 000H ;LOOP ON WRITE CONTINUOUS? JNZ SYSE ;GO DO ANOTHER WRITE PASS IF SO SYSR1: CALL CRLF LXI H,MSG3 ;OUTPUT "READ" TO CONSOLE CALL MSG CALL CRLF SYSRI: CALL RWCI ;INITIALIZE TES ; WRITE UPPER SURFACE,IF ALL TRACKS HAVE BEEN ; WRITTEN ON THE LOWER SYSW4: CALL XMTUS ;TRANSMIT LOAD UNIT/SECTOR COMMAND, ; TO CONTROLLER CALL XMTTK ;TRANSMIT LOAD TRACK NULE MOV A,H CALL BYTEO MOV A,L CALL BYTEO SYSWI: CALL RWCI ;GO INITIALIZE FOR SYSTEM TEST IN DATAI ;GET STATUS FROM THE SELECTED UNIT ANI 010H ;MASK WRITE PROTE DOUBLE ; SIDED DISKETTE,AND SELECT HEAD ; AS REQUIRED LDA HDSEL ;GO GET HEAD SELECT STATUS CPI 000H ;IS THE LOWER HEAD SELECTED? JNZ SYSW ;GO WRITE THE USECTOR CALL SECCK ;GO CHECK FOR PROPER SECTOR NUMBER JZ SYSW3 ;GO TO A NEW TRACK IF FINISHED CALL XMTUS ;TRANSMIT LOAD UNIT/SECTOR ; COMMAND,TO CONTROLLER JMP SYSW2 ; ;WRITE A DELETED DATA MARK ON SECTOR 01 ONLY CALL SECCK ;BUMP THE SECTOR NUMBER CALL XMTUS ;TRANSMIT NEXT SECTOR TO CONTROLLER SYSW2: CALL KBINT ;GO TEST FOR KEY-BOARD INTERRUPT CALL SYSWS ;GO WRITE A ;CHECK FOR A DELETED DATA MARK ON SECTOR 01 ONLY CALL SEC01 ;INITIALIZE FOR SECTOR 01 SYSR3: CALL KBINT ;GO TEST FOR KEY-BOARD INTERRUPT CALL DENT ;GO TEST FOR PROPER DENSITY AND ; TRANSMIT FINISHED SYSE: LHLD PCTR ;UPDATE THE PASS COUNTER INX H SHLD PCTR LXI SP,STACK ;SET THE STACK POINTER TO RESOLVE ; THE UNSATISFIED CALL TO "RND" ;SCREW THIS ONE UP ALSO JMP CMP1B STSEC: STA SECNO ;THE NEW SECTOR NUMBER LDA TRKNO ;STUFF THE TRACK NUMBER INTO THE TABLE CPI 000H ;HAS TRACK 00 BEEN GENERATED? JNZ STMEM CALL SEC01 ;SET SECTOR NUMBER TO 01 CALL XMTUS ;TRANSMIT LOAD UNIT/SECTOR COMMAND, ; TO CONTROLLER CALL XMTTK ;TRANSMIT LOAD TRACK COMMAND ; TO CONTROLLER CA;POINT AT THE RANDOM TRACK TABLE MOV A,M ;GET A TRACK NUMBER STA TRKNO ;SAVE IT INX H ;BUMP THE POINTER SHLD RPNT ;SAVE IT ALSO DCX D ;-1 TO THE RANDOM SEEK ITERATI B,A ;PUT IT IN B REG. LDA TRKNO ;GET THE CURRENT TRACK NUMBER XRA B ;SCREW IT UP RLC RLC RLC CMP4D: CPI 04DH ;> TRACK 76? JC STTRK ;IF NOT,STORE IT AS NEW TTO CONTROLLER ; (RETURN WITH BYTE COUNT IN D&E REGS.) CALL SYSRS ;GO READ A SECTOR CALL SECCK ;GO CHECK FOR PROPER SECTOR NUMBER JZ SYSR4 ;GO TO A NEW TRACK IF FINISHED CAL NUMBER SOME ; MORE,IF THE TABLE IS NOT FULL LXI H,256 ;SET THE RANDOM SEEK ITERATIONS COUNTER ; TO 256 RANDOM SEEKS SHLD RCTR LXI H,RANTK ;SET-UP THE T MVI A,001H ;YES CHANGE IT TO TRACK 01 STMEM: MOV M,A INX H ;BUMP THE POINTER DCX D ;DECREMENT THE LENGTH MOV A,E ORA D JNZ CHEW ;GO SCREW-UP THE TRACKLL SKTRK ;TRANSMIT SEEK COMMAND TO CONTROLLER JMP SYSR2 ;GO READ SECTOR ON NEW TRACK NUMBER ; ; ; ;SUBROUTINE TO "FLIP" UNIT SELECTS ; UFLIP: LDA UNIT ;GET THE CURRENT STATE OF UNIT SELECT CMA ;COMPONS COUNT XCHG ;SWAP SHLD RCTR ;SAVE THE COUNT XCHG ;SWAP AGAIN MOV A,E ORA D RNZ ;GO DO ANOTHER SEEK,IF 256 SEEKS ; NOTRACK NUMBER RAR ;SCREW IT UP SOME MORE JMP CMP4D STTRK: STA TRKNO ;THE NEW TRACK NUMBER CMP1B: CPI 01BH ;> SECTOR 26? JC STSEC ;IF NOT,STORE IT AS NEW SECTOR NUMBER RAR L XMTUS ;TRANSMIT LOAD UNIT/SECTOR COMMAND, ; TO CONTROLLER JMP SYSR3 ;GO READ NEXT SECTOR SYSR4: CALL UFLIP ;SELECT NEW UNIT CALL RND ;GO GET A RANDOM TRACK NUMBER FROM TABLE ABLE POINTER SHLD RPNT RET ; ; ; ; ; ; ;ROUTINE TO GET A RANDOM TRACK NUMBER FROM THE TABLE ; RND: LHLD RCTR ;GET THE CURRENT SEEK COUNT XCHG ;PUT IT IN THE D&E REGS. LHLD RPNT UMBERS INTO TABLE ; RGEN: LXI D,256 ;SET RANDOM TABLE LENGTH TO 256 LXI H,RANTK ;POINT AT RANDOM TRACK NUMBER TABLE MOV A,M ;GET TRASH FROM MEMORY CHEW: STA SECNO ;START CHEWING MOV LEMENT IT ANI 040H ;MASK FOR UNIT SELECT 01 STA UNIT ;PUT NEW UNIT SELECT BACK CPI 000H ;UNIT SELECT 00? RET ;FIND OUT AT THE RETURN ; ; ; ;ROUTINE TO GENERATE RANDOM TRACK N ; AFTER 256 RANDOM SEEKS JMP SYSS ;GO DO THE NEXT PASS ; ; ; ; ; ; SYSRO: CALL SP1 LXI H,MSG35 ;OUTPUT "WRITE PROTECT" TO CONSOLE CALL MSG JMP SYSR ;GO DO A MVI A,007H ;TRANSMIT A READ CRC COMMAND TO CONTROLLER CALL XMITW IN DATAI ;GET THE STATUS ANI 008H ;CRC ERROR? JZ RMK1 CALL ERROR ;YES RMK1: IN DATAI ;ONE OUTPUT "CRC ERROR" TO CONSOLE CALL MSG LXI H,MSG3 ;OUTPUT "READ" TO CONSOLE CALL MSG CALL CLRER ;CLEAR ANY ERROR CALL TKSEC ;OUTPUT TRACK AND SECTOR IN ERROR TO CONSOLE LHLD STA SAVE MVI A,003H ;TRANSMIT READ COMMAND ; TO CONTROLLER CALL XMITW IN DATAI ;GET CONTROLLER STATUS STA SAVE ;SAVE IT ANI 008H ;HAVE WE GOT JZ WMK1 CALL ERROR ;YES WMK1: IN DATAI ;GET THE STATUS AGAIN ANI 080H ;DD MARK? JZ WMK2 CALL CLRER ;YES,IT'S WHERE IT SHOULD BE RET WMK2: CALL FAIL E IF NOT DONE CALL PTKSC ;FILL WRITE BUFFER WITH ALTERNATE ; TRACK AND SECTOR NUMBER,AS DATA CALL RERR ;GO DO A BYTE FOR BYTE COMPARE ON DATA, ; FOR POSSIBLE ERROR IN DATA READ PASS ONLY ; ; ; ; ; ; ;SUBROUTINE TO WRITE A SECTOR IN SYSTEM TEST ; SYSWS: CALL WSEC ;SET-UP TO WRITE A SECTOR MVI A,005H ;TRANSMIT WRITE COMMAND TO CONTROLLER CALL XMITW CALL WSTAT ;GO CHEA WRITE DELETED DATA MARK COMMAND ; TO CONTROLLER CALL XMITW CALL WSTAT ;CHECK WRITE STATUS JZ WMKR ;GO READ DD MARK AND CRC,IF O.K. CALL WERR ;OOPS ANOTHER DAMN CRC ER ECTR ;UPDATE THE ERROR COUNTER INX H SHLD ECTR JMP SYSR3 ; ; ; ;SUBROUTINE TO WRITE AND CHECK A DELETED DATA MARK ; WMK: CALL WSEC ;SET-UP TO WRITE A SECTOR MVI A,00FH ;TRANSMIT A CRC ERROR? CNZ CLRER ;GO CLEAR ERROR FLAGS,IF SO IN DATAI ;GET THE STATUS ANI 080H ;DELETED DATA MARK? CNZ CLRER ;CLEAR THE ERROR FLAGS,IF SO LXI H,RBUF ;SET H&L REGS. TO ;OOPS WE ARE MISSING THE DD MARK LXI H,MSG2 ;OUTPUT "WRITE" TO CONSOLE CALL MSG JMP MKERR ; ; ; ;SUBROUTINE TO READ AND CHECK A DELETED DATA MARK ; RMK: CALL SEC01 ;INITIALIZE FOR SECTOR 01 FIELD ; (CRC ERROR STATUS REPORT MAY ; BE BROKEN,AND NOT TELL US) LDA SAVE ;GO GET "SAVED" STATUS ANI 008H ;CRC ERROR? RZ LXI H,MSG39 ;YESCK STATUS OF WRITE RZ CALL WERR ;OOPS CRC ERROR GOT US AGAIN JMP SYSW1 ;GO TRY AGAIN ; ; ; ; ; ; ;SUBROUTINE TO READ A SECTOR IN SYSTEM TEST ; SYSRS: XRA A ;CLEAR OUT OLD "SAVE" STATUS ROR JMP SYSW1 WMKR: CALL SEC01 ;INITIALIZE FOR SECTOR 01 MVI A,007H ;TRANSMIT A READ CRC COMMAND TO CONTROLLER CALL XMITW IN DATAI ;GET THE STATUS ANI 008H ;CRC ERROR? ;STUFF IT INTO THE READ BUFFER INX H ;BUMP THE READ BUFFER POINTER DCX D ;-1 TO THE BYTE COUNT XRA A ;IS ALL THE DATA IN? ORA E JNZ RSEC ;GO GET ANOTHER DATA BYTPOINT TO FIRST ; LOCATION IN READ BUFFER MVI A,040H ;TRANSMIT READ BUFFER COMMAND, ; TO CONTROLLER OUT CNTRL RSEC: IN DATAI ;GET A DATA BYTE MOV M,A MORE TIME FOR THE STATUS ANI 080H ;DD MARK? JZ RMK2 CALL CLRER ;YES,IT'S REALLY ON SECTOR 01 RET RMK2: CALL FAIL ;OH OH NO DD MARK LXI H,MSG3 ;OUTPUT "READ " TO CONSOLE RET ;FIND OUT AT THE RETURN VER26: LDA SECNO ;GET THE CURRENT SECTOR NUMBER INR A ;BUMP IT STA SECNO ;SAVE IT CPI 01BH ;ALL SECTORS DONE? RET ;FIND OU STA TRKNO JMP SKTRK ;LET'S TRY SEEKING TO THIS TRACK AGAIN ; ; ; ; ;SUBROUTINE TO FILL WRITE BUFFER WITH TRACK AND SECTOR NUMBER DATA ; PTKSC: CALL DENT ;GO GET BYTE COUNT FOR CURRENT TRACK POSITION STA SECNO LDA TRKNO ;GET PRESENT TRACK NUMBER INR A ;+1 TO TRACK NUMBER STA TRKNO ;STORE IT CPI 04DH ;TRACK NUMBER >76 DECIMAL? RET ;FIND OUT AT RETURN ; ; ;AHHHHH FINALLY DONE ; ; ; ;SUBROUTINE TO DO 26 SEQUENTIAL SECTORS ; VERSEC: LDA TRKNO ;GET THE CURRENT TRACK NUMBER CPI 000H ;WE AT TRACK 00? JZ VER26 ;DO 26 SEQUENTIAL SECTORS IF SO LDA TO CONSOLE CALL MSG LDA TRKNO ;GO GET CURRENT TRACK NUMBER STA NEWTK ;SAVE IT CALL BYTEO ;OUTPUT IT TO THE CONSOLE CALL SP2 LXI H,MSG31 ;OUTPUT "UNIT=" TO CON CALL MSG MKERR: LXI H,MSG44 ;OUTPUT "DD MARK" TO CONSOLE CALL MSG CALL TKSEC ;OUTPUT THE TRACK AND SECTOR IN ERROR LHLD ECTR ;UPDATE THE ERROR COUNTER INX H SHYTE COUNT XRA A ;ALL THE DATA BEEN MOVED? ORA E RZ ;RETURN IF SO LDA SECNO ;GO GET THE CURRENT SECTOR NUMBER MOV M,A ;PUT IT INTO THE WRITE BUFFER ALSO ILXI H,WBUF ;SET-UP POINTER AT WRITE BUFFER DPAT: LDA TRKNO ;GO GET THE CURRENT TRACK NUMBER MOV M,A ;PUT IT IN THE WRITE BUFFER INX H ;BUMP THE WRITE BUFFER POINTER DCX D ;-1 TO THE B ; ;SUBROUTINE TO SEEK TO A TRACK ; SKTRK: MVI C,'.' ;MAKE A TRACK SEEK INDICATOR FOR CONSOLE CALL CO CALL KBINT ;GO CHECK FOR KEY-BOARD INTERRUPT CALL DENT ;ESTABLISH PROPER DENSITY MVI XTEND ;EXTENDED FORMAT? CPI 080H ;DO 8 SEQUENTIAL SECTORS IF SO JNZ VER26 LDA SECNO ;GET THE SECTOR NUMBER INR A STA SECNO CPI 009H ;ALL DONE FOR 8 SECTORS? SOLE CALL MSG CALL AUNIT ;OUTPUT UNIT NUMBER TO CONSOLE CALL BYTEO CALL RSTR ;TRANSMIT SEEK TRACK 00 COMMAND, ; TO CONTROLLER LDA NEWTK ;O.K NOW PUT IT BACK LD ECTR RET ; ; ; FAIL: LXI H,MSG23 ;OUTPUT "FAILED TO" TO CONSOLE CALL MSG RET ; ; ; ; ; ; ;SUBROUTINE TO INCREMENT TRACK NUMBER ; INCTN: MVI A,001H ;SET SECTOR NUMBER TO 01 NX H ;BUMP THE WRITE BUFFER POINTER AGAIN DCX D ;ANOTHER -1 TO THE BYTE COUNT XRA A ;DONE YET??? ORA E JNZ DPAT ;WELL,IF NOT DONE,GO LOAD A TRACK NUMBER RET LHLD ECTR ;UPDATE THE ERROR COUNTER INX H SHLD ECTR LXI H,MSG39 ;OUTPUT "CRC ERROR" TO CONSOLE CALL MSG CALL SP1 LXI H,MSG60 ;OUTPUT "SEEK TO TRACK=" A,009H ;TRANSMIT SEEK COMMAND, ; TO CONTROLLER CALL XMITW IN DATAI ;GO GET CONTROLLER STATUS ANI 008H ;CRC ERROR? RZ CALL CLRER ;CLEAR THE CRC ERROR T AT THE RETURN ; ; ; ;SUBROUTINE TO TRANSMIT THE PROPER SECTOR NUMBER TO THE CONTROLLER ; SECCK: LDA TRKNO ;GO GET THE CURRENT TRACK NUMBER CPI 000H ;IF IT'S TRACK 00,GO DO 26 LOGICAL SECTORS JZ SEC26 ;GO GET STATUS ANI 010H ;IF IT'S NOT WRITE PROTECTED, ; FIND OUT IF THE OPERATOR HAS ; SELECTED WRITE PROTECTION FROM ; THE COMMAND MONITOR JZ A DB 00FH DB 015H DB 002H DB 008H DB 00EH DB 014H DB 01AH DB 006H DB 00CH DB 012H DB 018H DB LDA LSN ;IS THE LAST SECTOR DONE,FOR 26 LOGICAL SECTORS? CPI 01BH RET ;GO FIND OUT AT THE RETURN ; ; ; ;SUBROUTINE TO INITIALIZE FOR SECTOR 01 ; SEC01: MVI A,001H ;SET SECTOR NUMBER TO 01 LIGNMENT OF THE FLEXIBLE DISK DRIVE ; (NOTE: THIS ROUTINE WILL NOT ALLOW THE OPERATOR TO UTILIZE ; THIS ROUTINE,UNLESS THE DISKETTE IS EITHER WRITE PROTECTED ; OR THE OPERATOR HAS SELECTED WRITE PROTECTION FROM THE COMMAND MONITOR) ; ALIN: LXI E DAD D ;ADD D&E REGS. TO LOGICAL SECTOR MOV A,M ;MOVE LOGICAL SECTOR TO A REG. STA SECNO ;STORE LOGICAL NUMBER IN "SECNO" RET ; ; ; ;LOGICAL SECTOR TABLE (SKIPS EVERY 5 SECTORS) ; LSTBL LDA XTEND ;GO GET EXTENDED FORMAT COMMAND CPI 080H ;IF IT'S EXTENDED FORMAT,GO DO 8 SEQUENTIAL SECTORS JNZ SEC26 LDA LSN ;START BUMPING FOR 8 SEQUENTIAL SECTORS INR A STA H ;TEST MEDIA STATUS BIT JNZ HEAD1 ;GO SELECT LOWER HEAD JMP HEAD2 ;GO SELECT UPPER HEAD ; ; ; ;SUBROUTINE TO SEEK TO TRACK 00 (DO A RESTORE) ; RSTR: XRA A ;ZERO OUT A REG. STA TRKNO ;SE 004H DB 00AH DB 010H DB 016H ; ; ; ;SUBROUTINE TO DETERMINE IF DISKETTE IS DOUBLE SIDED, ; AND IF SO,SELECT UPPER HEAD ; DSIDE: IN DATAI ;GO GET STATUS FROM CONTROLLER ANI 040 STA LSN CALL OSCTR ;INITIALIZE TO LOGICAL SECTOR CONVERSION CALL XMTUS ;TRANSMIT LOAD UNIT/SECTOR, ; TO CONTROLLER RET ; ; ; ;SUBROUTINE TO INCREMENT LOGICAL SECTOR NUMBER H,MSG51 ;OUTPUT "ALIGNMENT," TO THE CONSOLE CALL MSG XRA A ;SET HEAD SELECT TO THE LOWER SURFACE STA HDSEL CALL XMTUS ;TRANSMIT LOAD UNIT/SECTOR TO CONTROLLER IN DATAI : DB 001H DB 007H DB 00DH DB 013H DB 019H DB 005H DB 00BH DB 011H DB 017H DB 003H DB 009H LSN STA SECNO CPI 009H ;LAST SECTOR DONE FOR EXTENDED FORMAT? RET ;FIND OUT AT THE RETURN ; ; ; ;SUBROUTNE TO DO 26 LOGICAL SECTORS ; SEC26: CALL INCSN ;GO INCREMENT LOGICAL SECTOR NUMBER T TRACK NUMBER TO 00 CALL XMTUS ;TRANSMIT LOAD UNIT/SECTOR TO CONTROLLER MVI A,0DH ;TRANSMIT SEEK TO TRACK 00, ; TO CONTROLLER CALL XMITW RET ; ; ; ;ROUTINE TO ALLOW C.E. A ; ; ; ;LOGICAL TO PHYSICAL SECTOR NUMBER CONVERSION SUBROUTINE FOR 26 SECTORS ; OSCTR: MOV E,A ;MOVE LOGICAL SECTOR NUMBER TO E REG. MVI D,000H ;CLEAR OUT D REG. LXI H,LSTBL-1 ;POINT AT LOGICAL SECTOR TABL ; INCSN: LDA LSN ;GO GET PRESENT SECTOR NUMBER INR A ;INCREMENT SECTOR NUMBER STA LSN ;STORE IT CALL OSCTR ;GO DO LOGICAL SECTOR CONVERSION RET ;FIND OUT AT RETURN ; LIN7 ALIN1: LXI H,MSG53 ;OUTPUT "AUTO?" TO CONSOLE CALL MSG CALL CECHO ;GO GET KEY-BOARD INPUT CPI 'Y' JZ ALIN4 ;GO DO AUTO,IF REQUESTED CPI 'N' JZ ALIN2 CALL UNCHK ;CHECK UNIT CODE BITS FOR MATCH ; TO SELECTED UNIT RET ; ; ; XMTTK: LDA TRKNO ;TRANSMIT TRACK ADDRESS TO CONTROLLER OUT DATAO MVI A,11H JMP XMIT ; CALL XMTTK ;TRANSMIT TRACK NUMBER, ; TO CONTROLLER MVI A,009H ;TRANSMIT SEEK TRACK COMMAND, ; TO CONTROLLER CALL XMITW CALL CLRER ;TRANSMIT CLEAR ERROR FOARD INPUT INTO TRACK STORAGE CPI 04DH ;TRACK NUMBER TO LARGE? JNC INER1 ;EXIT,IF SO ALIN3: CALL CLRER ;GO CLEAR ERROR FLAGS CALL KBINT ;GO CHECK FOR A KEY-BOARD INTERRUPT IN CCTRL ;E A DELAY JMP ALIN2 ; ; ; ;ROUTINE TO DELAY TIME (PAUSE) AS REQUIRED (DELAY CONSTANT IN H&L REGS.) ; DLY: DCX H MOV A,L ORA H JNZ DLY RET ; ; ; XMTUS: LDA SECNO ;TRA SEEK TO TRACK 00 MVI A,04CH ;SET-UP TRACK 76 STA TRKNO CALL ALIN5 ;NOW HANG-OUT AT TRACK 76 FOR AWHILE JMP ALIN4 ;NOW LET'S DO IT ALL OVER AGAIN ; IS'NT THIS FUN ;GO DO SELECTED TRACKS,IF REQUESTED JMP LER ;OOPS WRONG KEY-BOARD INPUT ALIN2: CALL RSTR ;DO A SEEK TO TRACK 00,THE ; C.E. DISKETTE IS WRITE PROTECTED CALL CRLF ;KEEP IT NEAT ETURN,IF SO JMP ALIN6 ;NOPE STAY A LITTLE WHILE LONGER ALIN7: CALL WPRT ;GO CHECK FOR OPERATOR REQUESTED ; WRITE PROTECT JNZ ALIN1 ;GO DO THE ALIGNMENT ROUTINE,IF SO CALL SPLAGS, ; TO CONTROLLER CALL TIME3 ;GO KILL SOME TIME LDA TIMCT ;GET THE TIMER ITERATIONS COUNTER DCR A ;DECREMENT IT CPI 000H ;DONE? RZ ;RNEW TRACK SEEK REQUESTED? ANI CRRDY JZ OLDTK ;GO DO OLD TRACK,IF NOT IN CDATA ANI 07FH CPI 'S' ;GOT A SEEK REQUEST? JZ ALIN8 ;IF YES,LET'EM CHOOSE OLDTK: CALANSMIT UNIT/SECTOR/HEAD SELECT TO CONTROLLER MOV B,A LDA UNIT ORA B MOV B,A LDA HDSEL ORA B OUT DATAO MVI A,21H CALL XMIT ALIN5: MVI A,007H ;SET-UP THE TIMER ITERATIONS COUNT ALIN6: STA TIMCT CALL KBINT ;GO CHECK FOR A KEY-BOARD INTERRUPT CALL XMTUS ;TRANSMIT LOAD UNIT/SECTOR, ; TO CONTROLLER CALL SP1 MVI C,'S' ;OUTPUT "SEEK TO TRACK=" TO CONSOLE CALL CO LXI H,MSG11 CALL MSG CALL CONI ;LET'S LOOK FOR A VALID HEX TRACK NUMBER STA TRKNO ;STUFF THE KEY-B2 LXI H,MSG52 ;OUTPUT "NO WRITE PROTECT" TO CONSOLE CALL MSG CALL WPMSG JMP MNTR ;EXIT TO THE MONITOR,UNTIL THINGS ; ARE SQUARED AWAY ALIN8: CALL TIME1 ;MAK ; LOADED NO MATTER WHAT HAPPENS ALIN4: CALL RSTR ;DO A SEEK TO TRACK 00 MVI A,001H ;SET-UP TRACK 01 STA TRKNO CALL ALIN5 ;GO SEEK TO THE TRACK,AND STAY AWHILE