ееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееее3712DIAGASMЂ 3712DIAGASMЂ !3712DIAGASMЂ"#$%&'()*+,-./013712DIAGASMЂ23456789:;<=>?@A3712DIAGASMCBCDEFGHIJMEMDIAG ASMЂKLMNOPQRSTUVWXYZMEMDIAG ASMЂ[\]^_`abcdefghijMEMDIAG ASMkl ADI 7 CNO: ADI 30H MOV C,A JMP CO HXD EQU LBYTE ; ; CONSOLE INPUT ROUTINE ; CI: IN CCTRL ANI CRRDY JZ CI IN CDATA ANI *************************************** ; ;DONATED TO THE "SIG/M" CP/M USER'S GROUP BY: ; ;KELLY SMITH OF MICROCOSM ASSOCIATES ;3055 WACO AVENUE ;SIMI VALLEY, CALIFORNIA ;(805) 527-9321 (MODEM, CP/M-NET (TM)) ;(805) 527-0518 (VERBAL) ; ; ORG 0ееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееее ONE BYTE NBL: SUI '0' RC ADI 0E9H RC ADI 6 JP NIO ADI 7 RC NIO: ADI 10 ORA A RET ; ; ; ;SUBROUTINE TO CONVERT A BYTE TO ееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееее3X12DIAGDOCmnCP/M-NETMSGopqrSIG/M LIBstUGFORM LIBuvwxееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееее 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 SINGLE DENSITY CONTROLLER I/O PARAMETERS ; CNTR0100H ;ORG FOR CP/M ; ; ; DI ;DISABLE INTERRUPTS LXI SP,STACK ;SET THE STACK POINTER JMP INIT ;INITIALIZE ; ; ;DEFINE CONSOLE I/O PARAMETERS FOR ALTAIR 2SI/O BOARD ; CCTRLееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееTWO HEX CHARACTERS LBYTE: PUSH PSW RRC RRC RRC RRC ANI 0FH CALL HXDA POP PSW ANI 0FH JMP HXDA HXDA: CPI 10 JM CNO ;************************************************************************ ; MICROCOSM ASSOCIATES DISK CONTROLLER DIAGNOSTIC ; FOR ; ICOM FD3712 VER.1.0 (C) 1979 ;*********************************ееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееL EQU 0C0H ;CONTROL COMMANDS DATAO EQU 0C1H ;DATA OUT DATAI EQU 0C0H ;DATA IN ; ; ; ;************************* ;* MONITOR CODE FOLLOWS: * ;************************* ; ; ;SUBROUTINE TO CONVERT TWO HEX CHARACTERS TOееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееее 7FH RET ; ; ; CRLF: MVI C,0DH CALL CO MVI C,0AH JMP CO ; CONO: CALL BYTEO CALL CRLF RET ; CONI: CALL BYTEC PUSH PSW POP PSW XRA A ;CLEAR ALL UNITS OF DISK REMOVED STATUS, ; AND INDICATE ANY UNITS WITH ; DISK FAIL STATUS CALL TCHK ;TEST CHECK,UNIT 00 MVI A,040H CALL TCHK (0000-FFFF)=' DB 0DH,0AH,20H,'G.....GO ADDRESS(0000-FFFF)=' DB 0DH,0AH,20H,'U.....UNIT SELECT(00-03)=' DB 0DH,0AH,20H,'L.....LOOP' DB 0DH,0AH,20H,'CONTROL-A.....ALIGNMENT,AUTO(Y,N)?' DB UCTIONS ; DB 0DH,0AH,'MICROCOSM DISK DIAGNOSTIC FOR ICOM FD3712' DB 0DH,0AH,0AH,'COPYRIGHT 1979 MICROCOSM ASSOCIATES' DB 0DH,0AH,0AH,'OPERATING INSTRUCTION ARE AS FOLLOWS:' DB 0DH,0AH DB 0DH,0AH,20H,'RE TEXT FLAG ; ; ; CALL BAR ;WAIT FOR OPERATOR TO PRESS SPACE-BAR MVI B,25 ;SET-UP 25 LINE-FEEDS CALL LFEED ; ; ; CALL TEXT ;OUTPUT MORE TEXT TO CONSOLE ; ; ; DB 0DH,0AH,2 CALL LFEED CALL BAR ;WAIT FOR OPERATOR TO PRESS SPACE-BAR ; ; ; CALL TEXT ;OUTPUT MORE TEXT TO CONSOLE ; ; ; DB 0DH,0AH,0AH,0AH,0AH,20H DB 'THE FOLLOWING IS A ' DB RET ; ; CONSOLE OUTPUT ROUTINE ; CO: IN CCTRL ANI CTRDY JZ CO MOV A,C OUT CDATA RET ; ; ; ; ; ;INITIALIZE ALL PROGRAM CONTROL PARAMETERS AND OUTPUT OPER(00-4C)=' DB 0DH,0AH,20H,'R.....READ SECTOR(01-1A)=' DB 0DH,0AH,20H,'W.....WRITE SECTOR(01=1A)=' DB 0DH,0AH,20H,'P.....PATTERN(00-FF)=' DB 0DH,0AH,20H,'T.....TEST WRITE/READ CONTINUOUS' 0DH,0AH,20H,'H.....HOME' 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 0DH,0AH,20H,'S.....SEEK TO TRACKSPOND TO ALL "=" CHARACTERS, ' DB 'WITH A TWO DIGIT HEX VALUE OR ' DB 'ALPHA CHARACTER ' DB 0DH,0AH DB 'FOR ALL TEST FUNCTIONS EXCEPT,' DB 0DH,0AH,'MEMORY ADDRESS(0000-FFFF)=,' 0H DB 'THE FOLLOWING IS A SYSTEM ' DB 'STATUS TEST:' DB 0DH,0AH ; ; ; DB 080H ;END OF TEXT FLAG ; ; ; MVI A,001H ;SET SECTOR NUMBER TO 01 STA SECNO 'LIST OF ALL COMMANDS:' DB 0DH,0AH,20H DB 'ENTER A KEY-BOARD CHARACTER ' DB 'AS REQUIRED,FOR ' DB 'TEST EXECUTION' DB 0DH,0AH DB 0DH,0AH,20H,'M.....MEMORY ADDRESSATING INSTRUCTIONS ; INIT: MVI A,003H ;SET-UP CONSOLE SERIAL I/O OUT CCTRL MVI A,0B5H OUT CCTRL CALL TEXT ;OUTPUT OPERATING INSTRUCTIONS TO CONSOLE ; ; ; ;TEXT TABLE OF OPERATING INSTRDB 0DH,0AH,20H,'CONTROL-S.....SYSTEM TEST' DB 0DH,0AH,07H,20H DB 'SPACE-BAR.....ABORTS ANY ' DB 'TEST OR "HANG-UP" ' DB ' (PLEASE PRESS SPACE-BAR)' ; ; ; DB 080H ;END OF DB 'PROMPTED,WITH A "?" CHARACTER,' DB 0DH,0AH,'OR AN "INVALID" MESSAGE ' DB ' (PLEASE PRESS SPACE-BAR)' ; ; ; DB 080H ;END OF TEXT FLAG ; ; ; MVI B,11 ;SET-UP 11 LINE-FEEDS DB 'AND GO ADDRESS(0000-FFFF)=' DB 0DH,0AH,'(FOUR DIGIT HEX VALUES ARE REQUIRED' DB ',TERMINATED WITH CARRIAGE-RETURN)' DB 0DH,0AH,0AH,020H DB 'IMPROPER KEY-BOARD ENTRYS WILL BE ' ;TEST CHECK,UNIT 01 MVI A,080H CALL TCHK ;TEST CHECK,UNIT 02 MVI A,0C0H CALL TCHK ;TEST CHECK,UNIT 03 MVI B,10 ;OUTPUT 10 LINE-FEEDS TO CONSOLE CALL LFEED X CRLF MOV A,H CALL BYTEO MOV A,L CALL BYTEO RET ; ; DSPYM: CALL HLCO MVI C,'=' CALL CO MOV A,M CALL BYTEO MVI C,20H PROT ;SET WRITE PROTECT,IF "CONTROL-P" CPI 001H JZ ALIN ;JUMP TO ALIGNMENT,IF "CONTROL-A" CPI 'V' JZ VRFYT ;JUMP TO VERIFY (READ CRC,ALL TRACKS/SECTORS) LER: MVI C,'?' ;LINE INP 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 VFYCM ; CALL CECHO CALL NBL JC LER POP B ORA B RET ; ; BYTEO: PUSH PSW CALL BYTO1 MOV C,A CALL CO POP PSW CALL BTO 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 CPI RA A STA UNIT ;SET UP INITIAL SELECT FOR DRIVE 00 STA DELET ;CLEAR DELETED DATA MARK COMMAND STA RETRY ;CLEAR READ ERROR RETRY COUNTER STA TIME ;CLEAR TIMER COMMAND STA SAV CALL PARAM CALL CRLF PCHL ; ; PARAM: LXI H,0 PARM1: CALL CECHO CPI 0DH RZ DAD H DAD H DAD H DAD H JC LER UT ERROR, OUTPUT "?" TO CONSOLE CALL CO JMP MNTR ; ; CECHO: CALL CI MOV C,A CALL CO RET ; ; GO: LXI H,MSG25 ;OUTPUT GO ADDRESS? TO CONSOLE CALL MSG CLEAR VERIFY COMMAND MNTR1: LXI SP,STACK CALL CRLF MVI C,07H ;OUTPUT BELL CALL CO MVI C,40H ;OUTPUT PROMPT (@ CHARACTER) CALL CO CALL CECHO ;ECHO KEY-BOARD INPUT OYTO2 MOV C,A JMP CO ; ; BYTO1: RRC RRC RRC RRC BYTO2: ANI 0FH CPI 0AH JM BYTO3 ADI 7 BYTO3: ADI 30H RET ; ; HLCO: CALL 'P' JZ PATT ;JUMP TO SET DATA PATTERN CPI 'L' JZ LOOP ;JUMP TO SET LOOP COMMAND CPI 014H JZ TIMER ;SET TIMER CONTROL,IF "CONTROL-T" CPI 010H JZ E ;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 NBL JC LER ORA L MOV L,A JMP PARM1 ; ; BYTEC: CALL CECHO BYTC1: CALL NBL JC LER RLC RLC RLC RLC PUSH PSW 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 ;JUMP UT TO CONSOLE CPI 'M' JZ MEM ;JUMP TO MEMORY DISPLAY/ALTER CPI 'G' JZ GO ;JUMP TO GO CPI 'U' JZ UNITS ;JUMP TO UNIT SELECT CPI 'H' JZ CALL CO RET ; ; MEM: LXI H,MSG14 CALL MSG CALL PARAM MEM1: CALL DSPYM CALL CECHO CPI 05EH ;NEED TO BACK-UP? JZ MEM10 CPI 0DH LLOWS: * ;***************************** ; ; ; ; SP5: MVI C,20H CaLL CO SP4: MVI C,20H CALL CO SP3: MVI C,20H CALL CO SP2: MVI C,20H CALL CO SP1: MVI C, CALL XMTUS CALL UNCHK ;CHECK UNIT CODE BITS FOR A MATCH ; TO THE SELECTED UNIT CALL WPCHK ;CHECK WRITE PROTECT STATUS IN DATAI ;GET STATUS ANI 020H ;DRIVE FAIL XRA A ;RESET TIMER CONTROL TIMES: STA TIME JMP MNTR1 ; ; ; ;SUBROUTINE TO KILL TIME AS REQUIRED ;(TOTAL DELAY OF TIME1+TIME2+TIME3 EQUALS 2.5 SECONDS) ; TIME1: LXI H,0FFFFH ;LOAD DELAY CONSTANT TIMEA: EST ; LOOP: LXI H,MSG38 ;OUTPUT "LOOP" TO CONSOLE CALL MSG MVI A,001H ;STORE LOOP COMMAND STA BLOOP JMP MNTR1 ; ; ; ;SUBROUTINE TO TEST LOOP COMMAND ; LOOPT: CALL KBINT ;EED: MVI C,00AH ;OUTPUT A LINE-FEED TO CONSOLE CALL CO DCR B JNZ LFEED RET ; ; ; ;ROUTINE TO "PAUSE" WHILE OPERATOR READS TEXT ; (ASSUMES PAUSE ITERATIONS TO BE IN B REG.) ; PAUSE: LXI JZ MNTR CPI 20H JZ MEM9 CALL BYTC1 MOV M,A MEM9: INX H JMP MEM1 MEM10: DCX H JMP MEM1 ; ; ; TIMER: LXI H,MSG45 ;OUTPUT "TIMER CO LXI H,MSG24 ;OUTPUT "READY FOR TEST" TO CONSOLE CALL MSG CALL CRLF ;KEEP IT NEAT RET ; ; ; ;ROUTINE TO WAIT FOR SPACE-BAR FROM KEY-BOARD ; BAR: IN CCTRL ANI CRRDY J? RNZ CALL CRLF CALL SP1 LXI H,MSG31 ;OUTPUT "UNIT=" TO CONSOLE CALL MSG CALL AUNIT ;OUTPUT UNIT NUMBER TO CONSOLE CALL BYTEO CALL SP1 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 H MOV A,L ORA H JNZ TIMEB TIME3: LXI TEST KEY-BOARD INTERRUPT LDA BLOOP ;GO GET LOOP COMMAND ADI 000H ;IS IT A LOOP COMMAND? RNZ ;RETURN,IF YES JMP MNTR ; ; ; ; ; ; ;***************************** ;*DISK TEST CODE FOH,0FFFFH ;SET-UP PAUSE DELAY CALL DLY DCR B JNZ PAUSE RET ; ; ; ;ROUTINE TO DO TEST CHECK ON DRIVES ; (ASSUMES UNIT NUMBER TO BE IN A REG.) ; TCHK: STA UNIT ;SAVE UNIT NUMBER NTROL?" TO CONSOLE CALL MSG CALL CECHO CPI 'Y' JZ TIMEY CPI 'N' JZ TIMEN JMP LER TIMEY: MVI A,001H ;SET TIMER CONTROL JMP TIMES TIMEN: Z BAR ;OOPS KEY-BOARD NOT ACTIVE IN CDATA ANI 07FH ;MASK-OFF PARITY BIT CPI 020H ;SPACE-BAR? JNZ BAR ;NO KEEP WAITING RET ; ; ; ;ROUTINE TO CAUSE "LOOPING" ON A T CDATA ANI 07FH ;MASK-OFF PARITY BIT CPI 020H JZ MNTR ;GO TO MONITOR IF SPACE-BAR RET ; ; ; ;ROUTINE TO OUTPUT LINE-FEEDS TO CONSOLE ; (ASSUMES QUANTITY OF LINE-FEEDS TO BE IN B REG.) ; LF H,00FFFH TIMEC: DCX H MOV A,L ORA H JNZ TIMEC RET ; ; ; ;KEY-BOARD INTERRUPT ROUTINE, KEYED WITH "SPACE-BAR" ; KBINT: IN CCTRL ANI CRRDY RZ IN 20H CALL CO RET ; ; ; ; ; YNMSG: DB 5,'(Y,N)' ; MSG1: DB 8,0DH,0AH,' PASS=' ; MSG2: DB 6,' WRITE' ; MSG3: DB 5,' READ' ; MSG4: DB 23,0DH,0AH,'INVALID TRACK NUMBER ' ; MSG5: DB ; TO CONTROLLER CALL LOOPT ;GO TEST LOOP COMMAND JMP HOME1 ; ; ; ;SEEK TO TRACK SKT: LXI H,MSG11 ;OUTPUT "SEEK TO TRACK=" TO CONSOLE CALL MSG CALL CONIINE TO OUTPUT MESSAGES TO CONSOLE ; MSG: PUSH PSW PUSH B MOV B,M INX H MSGA: MOV C,M CALL CO INX H DCR B JNZ MSGA POP B D ; ;MSG19 RESERVED ; ;MSG20 RESERVED ; ;MSG21 RESERVED ; ;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' ; MSG2 A,81H ;TRANSMIT CLEAR COMMAND TO CONSOLE CALL XMIT MVI A,00BH ;TRANSMIT CLEAR ERROR FLAGS TO CONTROLLER CALL XMIT LXI H,000H ;CLEAR PASS AND ERROR COUNTER SHLD PCTR SHLD H,0AH,20H,'VERIFY' ; MSG49: DB 25,'ERIFY SINGLE TRACK(Y,N)? ' ; ;MSG50 RESERVED ; MSG51: DB 10,'ALIGNMENT,' ; MSG52: DB 2,'NO' ; MSG53: DB 11,'AUTO(Y,N)? ' ; MSG54: DB 13,'TRACK(00-4C)=' ; MSG55: DB 2 23,0DH,0AH,' DATA COMPARE ERROR: ' ; ;MSG6 RESERVED ; ;MSG7 RESERVED ; ;MSG8 RESERVED ; ;MSG9 RESERVED ; MSG10: DB 14,'UNIT CODE FAIL' ; MSG11: DB 20,'EEK TO TRACK(00-4C)=' ; MSG12: DB 14,'SECTOR(01-1A)=' ; MSG13: A JM TEXTB ;END OF TEXT? MOV C,A CALL CO JMP TEXTA ;NO TRY AGAIN TEXTB: POP PSW POP B XTHL ;GET THE RETURN ADDRESS RET ; ; ; ;******* POP PSW RET ; ; ; ;ROUTINE TO OUTPUT "TEXT" TO CONSOLE ; TEXT: XTHL ;GET ADDRESS OF TEXT PUSH B PUSH PSW TEXTA: MOV A,M ;CHECK FOR "END OF TEXT" FLAG INX H ORA 7: DB 5,'RITE ' ; MSG28: DB 4,'EAD ' ; MSG29: 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 UNITECTR CALL LOOPT ;GO TEST LOOP COMMAND JMP CLR1 ; ; ; ;RESTORE TO TRACK 00 ; HOME: LXI H,MSG26 ;OUTPUT "HOME" TO CONSOLE CALL MSG HOME1: CALL RSTR ;TRANSMIT "SEEK TRACK 00" COMMAND, 2,0DH,0AH,20H,'NO "BUSY" RESPONSE ' ; MSG56: DB 19,0DH,0AH,20H,'"BUSY" RUN-AWAY ' ; MSG57: DB 11,'SYSTEM TEST' ; MSG58: DB 6,'TRACK=' ; MSG59: DB 7,'SECTOR=' ; MSG60: DB 14,'SEEK TO TRACK=' ; ; ; ; ; ;ROUT DB 14,'ATTERN(00-FF)=' ; MSG14: DB 25,'EMORY 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 RESERVE********************************** ;* CONTROLLER/DISK TEST ROUTINES FOLLOW: * ;***************************************** ; ; ; ;CLEAR CONTROLLER CLR: LXI H,MSG29 ;OUTPUT "CLEAR" TO CONSOLE CALL MSG CLR1: MVI ; ;MSG41 RESERVED ; ;MSG42 RESERVED ; 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 RESERVED ; MSG48: DB 9,0D NUMBER ' ; MSG34: DB 10,'DRIVE FAIL' ; MSG35: DB 13,'WRITE PROTECT' ; ;MSG36 RESERVED ; MSG37: DB 22,'INVALID SECTOR NUMBER ' ; MSG38: DB 3,'OOP' ; MSG39: DB 14,0DH,0AH,07H,' CRC ERROR ' ; ;MSG40 RESERVED ;READ CONSOLE INPUT STA TRKNO ;STORE TRACK ADDRESS STA NEWTK ;STORE NEW TRACK NUMBER IN CASE OF LOOP CPI 04DH ;TRACK NUMBER >77 DECIMAL? JNC INER1 ;JUMP TO INPUT ERROR 1,IF SO RINT "INVALID SECTOR NUMBER", ; IF SO CPI 01BH ;TEST FOR INVALID SECTOR NUMBER JNC INER3 STA SECNO ;MUST BE GOOD STORE IT LXI H,MSG46 ;OUTPUT "CRC ONLY?" TO C LXI H,WBUF ;POINT THE DATA PATTERNS AT THE WRITE BUFFER PATT1: LDA DBUF ;GET THE DESIRED PATTERN FROM STORAGE MOV M,A ;LOAD UP THE WRITE BUFFER INX H DCX D MOV A,D ORA CALL XMITW IN DATAI ;EXAMINE STATUS FROM CONTROLLER ANI 008H ;CRC ERROR? JZ SKT2 ;IF NOT,GO TEST LOOP COMMAND LXI H,MSG39 ;OUTPUT "CRC ERROR" TO CONSOLE CALL MSG ; BYTE INTO PROPER POSITION RLC 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 CALL RSTR ;TRANSMIT A SEEK TRACK 00 COMMAND ; TO CONTROLLER,TO RESTORE THE SELECTED UNIT JMP MNTR ; ; ; ;SET DATA PATTERN ROUTINE ; PATT: LXI H,MSG13 ;OUTPUT "PATTERN=" TO CONSOLE CALL CRLF SKT1: MVI C,'.' ;MAKE A TRACK SEEK INDICATOR FOR CONSOLE CALL CO LXI D,128 ; FOR SEEKING LDA TRKNO ;GO GET THE TRACK NUMBER CPI 000H ;TRACK 00 REQSG CALL CRLF JMP MNTR ; INER2: CALL CRLF LXI H,MSG33 ;OUTPUT "INVALID UNIT NUMBER" TO CONSOLE JMP INERA ; INER3: CALL CRLF LXI H,MSG37 ;OUTPUT "INVALID SECTO E JNZ PATT1 ;LOOP UNTIL WRITE BUFFER IS FULL JMP MNTR ;GO TO MONITOR WHEN DONE ; ; ; ;OPERATOR INPUT ERROR MESSAGE ROUTINES ; INER1: LXI H,MSG4 ;OUTPUT "INVALID TRACK NUMBER " TO CONSOLE INERA: CALL M CALL CLRER ;GO CLEAR ERROR FLAGS SKT2: CALL LOOPT ;GO TEST LOOP COMMAND CALL RSTR ;TRANSMIT SEEK TRACK 00 ; COMMAND TO CONTROLLER LDA NEWTK ;RE-LOAD ORIGINAL TRACK NUMBER LXI H,MSG12 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 P CALL MSG LXI D,128 ;SET BYTE COUNT "FILL" TO 128 DECIMAL CALL CONI ;READ CONSOLE KEY-BOARD INPUT ; FOR DESIRED DATA PATTERN STA DBUF ;STORE DATA BYTE TO FREE-UP A REG. UESTED? JZ HOME1 ;IF SO,GO DO A RESTORE CALL CLRER ;TRANSMIT "CLEAR ERROR FLAGS", ; TO CONTROLLER CALL XMTUS CALL XMTTK MVI A,009H ;SEEK TO TRACK R NUMBER" TO CONSOLE JMP INERA ; ; ; ;SUBROUTINE 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 CPI 004H ;UNIT SELECT NUMBER >3? JNC INER2 RRC ;NO IT'S O.K AS REQUESTED BY OPERATOR ;SHIFT IT INTO PROPER POSITION RRC STA UNIT ;STORE UNIT SELECT STA TRKNO JMP SKT1 ;SEEK TO ORIGINAL TRACK NUMBER ; ; ; ;ROUTINE TO SELECT UNIT FOR TEST ; UNITS: LXI H,MSG32 ;OUTPUT "UNIT=" TO CONSOLE CALL MSG CALL CONI ;READ CONSOLE INPUT ONSOLE CALL MSG CALL CECHO ;GO GET KEY-BOARD INPUT CPI 'Y' ;READ CRC REQUESTED? JZ CRC1 ;IF YES,STORE READ CRC COMMAND CPI 'N' ;IF READ DATA AND CRC,CLEAR CRC COMMAND RST ; LOCATION IN WRITE BUFFER RERR1: MOV A,M ;GO GET A BYTE FROM WRITE BUFFER, ; AND STUFF IT INTO A REG. STA SHDBE ;STORE "S/B" BYTE LDAX B ;GO GET A BYTE F A,D ;ARE WE DONE MOVING IN ALL DATA BYTES? ORA E JNZ RDT2 ;GO FOR MORE,IF NOT DONE RDT3: LDA SAVE ;GO GET "SAVED STATUS" FROM STORAGE ANI 080H ;DELETED DATA MARK? CNZ MRK1 ;OREAD CRC COMMAND? 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? ;OUTPUT "DD MARK" TO CONSOLE CALL MSG CALL TKSEC ;OUTPUT TRACK AND SECTOR,THAT THE ; DELETED DATA MARK OCCURED ON RET ; ; ; ;SUBROUTINE TO COMPARE READ DATA TO WRITE DATA, ; AND INDICAD BUFFER MVI A,040H ;OUTPUT A READ BUFFER COMMAND, ; TO CONTROLLER CALL XMT4X MOV M,B INX H DCX D RDT2: MVI A,041H ;GET A DATA BYTE FROM CONTROLLER JZ CRC2 JMP LER ;OUTPUT "?" TO CONSOLE CRC1: MVI A,007H ;STORE READ CRC COMMAND JMP CRC3 CRC2: XRA A ;CLEAR READ CRC COMMAND CRC3: STA RDCRC RDTS: CALL XMTUS ;TRANSMIT UNIT/SECC COMMAND ANI 007H CZ RERR ;GO CHECK FOR DATA COMPARE ERROR, ; IF NOT A READ CRC COMMAND RDT4: CALL LOOPT ;GO TEST LOOP COMMAND JMP RDTS ; ; ; ;SUBROUTINE TO TEST DELETEDUTPUT "DD MARK" TO CONSOLE,IF SO LDA SAVE ANI 008H ;CRC ERROR? CNZ ERROR ;GO OUTPUT "CRC ERROR" TO CONSOLE, ; IF CRC ERROR OCCURED LDA RDCRC ;GO GET STATE OF READ CR CNZ 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 ;TRANSMITTE THE FIRST BYTE IN ERROR ; RERR: LXI D,128 ;GO GET BYTE COUNT INTO D&E REGS. 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 FI CALL XMT4X MOV M,B ;STUFF IT INTO THE READ BUFFER INX H ;BUMP THE POINTER TO THE NEXT LOCATION, ; IN THE READ BUFFER DCX D ;-1 TO THE BYTE COUNT MOV TOR TO CONTROLLER LXI D,128 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 DATA MARK ON READ ; DDMRK: IN DATAI ;EXAMINE STATUS FROM CONTROLLER ANI 080H ;IS IT A DD MARK? RZ MRK1: CALL CLRER ;CLEAR DD MARK STATUS FROM CONTROLLER CALL CRLF LXI H,MSG44 IN 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 REA READ COMMAND 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 ROM READ BUFFER, ; AND STUFF IT INTO A REG. INX B ;+1 TO READ BUFFER POINTER STA WAS ;STORE "WAS" BYTE CMP M ;COMPARE "WAS" BYTE,TO "S/B" BYTE JNZ RERR3 ;GOFFER POINTER DCX D ;-1 TO THE BYTE COUNT MOV A,D ;HAVE ALL DATA BYTES BEEN SENT? ORA E JNZ WRT2 ;GO SEND SOME MORE,IF NOT DONE LDA DELET ;GO GET DELETED DATA MARK COMMANDINT "INVALID SECTOR NUMBER", ; IF SO CPI 01BH ;TEST FOR INVALID SECTOR NUMBER JNC INER3 STA SECNO ;MUST BE GOOD STORE IT CALL WPRT ;HAS THE OPERATOR REQUESTED WRITE MOV A,L ;SAVE POINTER FOR DATA BYTE COUNTER STA DCTR LXI H,MSG5 ;OUTPUT "READ DATA ERROR" TO CONSOLE CALL MSG RERR5: MVI C,007H ;RING THAT BELL CALL CO LXI H,MSG15 A A ;ZERO OUT A REG. DEL3: STA DELET WRT1: CALL XMTUS ;TRANSMIT UNIT/SECTOR TO CONTROLLER LXI D,128 CALL CLRER ;GO CLEAR ERROR FLAGS LXI H,WBUF ;SET H&L REGS. TO POINT TO FIRST LHLD ECTR ;UPDATE THE 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 PRINT ERROR STATUS, ; IF A MISMATCH OCCURS INX H ;+1 TO WRITE BUFFER POINTER DCX D ;-1 TO BYTE COUNT XRA A ;ZERO OUT A REG. ORA E ;OR IN E REG. OUTPUT "DELETE DATA?" TO CONSOLE CALL MSG CALL CECHO ;GO GET KEY-BOARD INPUT CPI 'Y' ;DELETED DATA REQUESTED? JZ DEL1 ;IF YES,GO STORE WRITE DELETED ; DATA MARK COMMA PROTECTION? JNZ WRT4 ;BAIL-OUT ,IF SO IN DATAI ;GET STATUS FROM CONTROLLER ANI 010H ;MASK WRITE PROTECT BIT JNZ WRT4 ;IS THE DISKETTE WRITE PROTECTED? LXI H,MSG43 ; ;OUTPUT ERROR MESSAGE HEADER TO CONSOLE CALL MSG CALL CRLF CALL SP1 CALL AUNIT ;OUTPUT ACTUAL UNIT NUMBER TO CONSOLE CALL BYTEO CALL SP3 LDA TRKNO ;OUTPUT ; LOCATION IN WRITE BUFFER WRT2: MOV A,M ;GET A DATA BYTE FROM WRITE BUFFER OUT DATAO ;SPIT IT OUT TO THE CONTROLLER MVI A,031H CALL XMIT INX H ;BUMP THE WRITE BU LXI H,MSG12 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 PR STA DCTR ;STORE DATA BYTE COUNTER JNZ RERR1 ;GO COMPARE ANOTHER DATA BYTE, ; IF NOT FINISHED WITH ENTIRE RECORD RET ; ; ; ;SUBROUTINE TO OUTPUT READ DATA ERROR STATUS TO CONSOLE ; RERR3:ND CPI 'N' ;IF NO,CLEAR WRITE DELETED DATA ; MARK COMMAND JZ DEL2 JMP LER ;OUTPUT "?" TO CONSOLE DEL1: MVI A,00FH ;STORE WRITE DD MARK JMP DEL3 DEL2: XR BYTEO CALL 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 TRACK NUMBER TO CONSOLE 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 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 IN DATAI ;EXAMINE STATUS FROM CONTROLLER RUPT 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 OLE CALL MSG CALL CONI STA NEWTK ;SAVE THE CONSOLE INPUT CPI 04DH JNC INER1 ;OOPS VRF2: CALL RWCI ;INITIALIZE FOR VERIFY LXI D,128 LDA NEWTK ; ; ; ;SUBROUTINE TO CLEAR CONTROLLER AND/OR ERROR FLAGS ; SCLR: MVI A,081H ;TRANSMIT CLEAR CONTROLLER COMMAND ; TO CONTROLLER CALL XMIT CLRER: MVI A,00BH ;OUTPUT CLEAR ERROR FLAGS TO CONTROLLER LL TRACKS AND SECTORS ; ; ; ; ; NFORM: CALL SP1 LXI H,MSG35 ;OUTPUT "WRITE PROTECT" TO CONSOLE CALL MSG FORME: CALL LOOPT ;GO TEST LOOP COMMAND JMP VRF6 ;GO RE-VERIFY ALL TRACKS/SECTORS FORME ;EXIT TEST HERE,AND GO TO MONITOR ; AFTER CLEARING FORMAT MODE ; ; ; ;ROUTINE TO VERIFY (READ CRC) ALL TRACKS/SECTORS ; VRFYT: LXI H,MSG49 ;OUTPUT "VERIFY SINGLE TRACK?" TO CONSOLE CALL ANI 008H ;CRC ERROR? CNZ ERROR ;GO OUTPUT "CRC ERROR" TO CONSOLE, ; IF CRC ERROR OCCURED WRT3: CALL LOOPT ;GO TEST LOOP COMMAND JMP WRT1 WRT4: CALL WPMSG ;OUTPUT "WRITE CALL SKTRK ;TRANSMIT SEEK TRACK, ; TO CONTROLLER VRF4: CALL SEC01 ;INITIALIZE FOR SECTOR 01 LXI D,128 CALL VRFYR ;READ CRC'S ON THIS TRACK,ALL SECTORS CALL SEC01 STA TRKNO CPI 000H ;TRACK 00 REQUESTED? JNZ VRF3 CALL RSTR ;YES DO A SEEK TRACK 00 JMP VRF4 VRF3: CALL XMTTK ;TRANSMIT TRACK NUMBER, ; TO CONTROLLER CALL XMIT RET ; ; ; VRFYS: CALL SEC01 ;INITIALIZE FOR SECTOR 01 LXI D,128 CALL VRFYR ;GO CHECK CRC ON A SECTOR VRFY1: CALL INCTN ;INCREMENT TRACK NUMBER JZ VRFY2 ;GO DO , ; IF REQUESTED ; ; ; ;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 INTERMSG CALL CECHO ;GET A KEY-BOARD INPUT CPI 'Y' JZ VRF1 CPI 'N' JZ VRF5 JMP LER ;OOPS VRF1: CALL SP2 LXI H,MSG54 ;OUTPUT "TRACK=" TO CONSPROTECT" TO CONSOLE JMP MNTR ; ; ;SUBROUTINE TO INDICATE CRC ERROR,AND CLEAR ERROR FLAGS ; ERROR: LXI H,MSG39 ;OUTPUT "CRC ERROR" TO CONSOLE CALL MSG CALL CLRER ;CLEAR ERROR FLAGS RET ;RE-INITIALIZE TO SECTOR 01 CALL LOOPT JMP VRF2 VRF5: CALL CRLF MVI A,001H ;SET VERIFY COMMAND STA VFYCM VRF6: CALL RWCI ;INITIALIZE FOR VERIFY JMP VRFYS ;GO VERIFY ALL SKTRK ;TRANSMIT SEEK COMMAND, ; TO CONTROLLER JMP VRFYS ;GO CHECK SECTORS ON A NEW TRACK VRFY2: CALL RSTR ;TRANSMIT SEEK TRACK 00 COMMAND, ; TO CONTROLLER JMP A RESTORE,AND ATTEMPT TO ; CHECK UPPER SURFACE,IF ALL TRACKS ; HAVE BEEN CHECKED ON THE LOWER CALL XMTTK ;TRANSMIT LOAD TRACK COMMAND ; TO CONTROLLER CA ; 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 CONTROLRITE NEXT SECTOR RWCW4: CALL INCTN ;INCREMENT TRACK NUMBER JZ RWCW5 CALL XMTTK ;TRANSMIT LOAD TRACK NUMBER ; TO CONTROLLER CALL SKTRK ;TRANSMIT SEEK COMMAND TO CONTROLLER ATE THE ; START OF A PASS CALL CO LXI H,MSG1 ;OUTPUT "PASS=" TO CONSOLE CALL MSG LHLD PCTR ;OUTPUT PASS NUMBER TO CONSOLE MOV A,H CALL BYTEO DCR A STA RETRY CPI 000H ;RETRIES FINISHED? JZ MEDER ;QUIT IF RETRIES ARE FINISHED, ; THIS IS A NON-RECOVERABLE ERROR JMP TCRCE ;WERE NOT DONE YET,TRYCRLF LXI H,MSG2 ;OUTPUT "WRITE" TO CONSOLE CALL MSG CALL CRLF RWCWS: CALL SEC01 ;INITIALIZE FOR SECTOR 01 RWCW: CALL KBINT ;GO TEST FOR KEY-BOARD INTERRUPT CALL RWCW1 ;GO WRITE A SECTDIA ERROR),RESTORE,AND QUIT ; MEDER: LXI H,MSG17 ;OUTPUT "MEDIA ERROR" TO CONSOLE CALL MSG CALL RSTR ;TRANSMIT SEEK TRACK 00 COMMAND, ; TO CONTROLLER JMP MNTR ; ; ; ; LER ANI 008H ;CRC ERROR? JNZ ERTRY ;GO DO RETRIES,IF CRC ERROR HAS OCCURED RET ERTRY: CALL CLRER ;TRANSMIT CLEAR ERROR FLAGS, ; TO CONTROLLER LXI H,MSG39 ;O,L CALL BYTEO CALL RWCI ;GO INITIALIZE FOR WRITE/READ CONTINUOUS CALL WPRT ;GO GET STATE OF OPERATOR REQUESTED ; WRITE PROTECT JNZ READO ;GO DO "READ ONLY" IF WRITE PROT MOV A,L CALL BYTEO LXI H,MSG16 ;OUTPUT "ERROR TOTAL=" TO CONSOLE CALL MSG LHLD ECTR ;OUTPUT ERROR NUMBER TO CONSOLE MOV A,H CALL BYTEO MOV A AGAIN ; ; ; ;SUBROUTINE TO OUTPUT TRACK AND SECTOR IN ERROR TO THE CONSOLE ; TKSEC: CALL SP1 LXI H,MSG31 ;OUTPUT "UNIT=" TO CONSOLE CALL MSG CALL AUNIT ;OUTPUT UNIT NUMBER TO CONSOLE OR CALL SECCK ;GO CHECK FOR PROPER SECTOR NUMBER JZ RWCW4 ;GO TO A NEW TRACK IF FINISHED CALL XMTUS ;TRANSMIT LOAD UNIT/SECTOR ; COMMAND,TO CONTROLLER JMP RWCW ;GO W ; ;TEST WRITE/READ CONTINUOUS (WRITE AND READ ALL AVAILABLE TRACKS) ; RWC: LXI H,MSG30 ;OUTPUT "TEST WRITE/READ CONTINUOUS" ; TO CONSOLE CALL MSG RWCP: MVI C,007H ;OUTPUT A "BELL" TO INDICUTPUT "CRC ERROR" TO CONSOLE CALL MSG CALL TKSEC ;OUTPUT TRACK AND SECTOR IN ERROR, ; TO THE CONSOLE LDA RETRY ;GO GET THE ERROR RETRY COUNTER, ; AND UPDATE IT ECTED IN DATAI ;GET STATUS FROM CONTROLLER ANI 010H ;IS THE DISKETTE WRITE PROTECTED? JNZ READO ;JUMP TO DO READ ONLY ROUTINE ; IF WRITE PROTECT STATUS IS TRUE RWCWW: CALL LXI H,MSG59 ;OUTPUT "SECTOR=" TO CONSOLE CALL MSG LDA SECNO ;GO GET THE CURRENT SECTOR NUMBER CALL BYTEO ;OUTPUT IT TO THE CONSOLE RET ; ; ; ;SUBROUTINE TO INDICATE A "HARD ERROR"(MECALL BYTEO CALL SP2 LXI H,MSG58 ;OUTPUT "TRACK=" TO CONSOLE CALL MSG LDA TRKNO ;GET THE CURRENT TRACK NUMBER CALL BYTEO ;OUTPUT IT TO THE CONSOLE CALL SP2 JMP RWCWS ;GO WRITE SECTOR ON NEW TRACK NUMBER RWCW5: CALL RSTR ;TRANSMIT SEEK TRACK 00 ; COMMAND TO CONTROLLER RWCRX: CALL KBINT ;GO CHECK FOR KEY-BOARD INTERRUPT LDA BLOOP ;GET THE STAT ECTR RET ; ; ; ;SUBROUTINE TO READ A SECTOR IN WRITE/READ CONTINUOUS TEST ; RWCR2: XRA A ;CLEAR OUT OLD "SAVE" STATUS STA SAVE RWCR3: MVI A,003H ;TRANSMIT READ COMMAND ; TO CONTR WSEC: CALL PTKSC ;FILL WRITE BUFFER WITH ALTERNATE ; TRACK AND SECTOR NUMBER,AS DATA LXI D,128 LXI H,WBUF ;SET H&L REGS. TO POINT TO FIRST ; LOCATION IN WRITE BUFFER GO CHECK FOR 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 YETR?FIND OUT AT THE RETURN RET ; ; ; ;SUBROUTINE TO INDICATE A WRITE ERROR ; WERR: LXI H,MSG39 ;YES OUTPUT "CRC ERROR" TO CONSOLE CALL MSG LXI H,MSG2 ;OUTPUT "WRITE" TO CONSOLE CALL MSG WRITE PROTECT" TO CONSOLE CALL MSG JMP RWCRX ;GO DO A READ PASS ONLY ; ; ; ;SUBROUTINE TO WRITE A SECTOR IN WRITE/READ CONTINUOUS TEST ; RWCW1: CALL WSEC ;SET-UP FOR WRITE SECTOR MVI A,005H ;TRANSME OF THE LOOP COMMAND ADI 000H ;LOOP ON WRITE CONTINUOUS? JNZ RWCE ;GO DO ANOTHER WRITE PASS IF SO RWCRR: CALL CRLF LXI H,MSG3 ;OUTPUT "READ" TO CONSOLE CALL MSG CALL CRLF ; LOCATION IN THE WRITE BUFFER DCX D ;-1 TO BYTE COUNT MOV A,D ;ZERO OUT A REG. ORA E ;OR IN E REG. JNZ WSEC1 ;GO OUTPUT ANOTHER BYTE IF ALL THE DATA WSEC1: MOV A,M ;LOAD A BYTE FROM WRITE BUFFER ; FOR OUTPUT TO CONTROLLER OUT DATAO ;OUTPUT IT MVI A,031H CALL XMIT INX H ;BUMP THE POINTER TO THE NEXT JMP RWCR1 ;GO READ NEXT SECTOR RWCR6: CALL INCTN ;INCREMENT TRACK NUMBER JZ RWCR7 CALL XMTTK ;TRANSMIT LOAD TRACK COMMAND ; TO CONTROLLER CALL SKTRK ;TRANSMIT CALL CLRER ;TRANSMIT CLEAR ERROR FLAGS, ; TO CONTROLLER CALL TKSEC ;OUTPUT TRACK AND SECTOR IN ERROR TO CONSOLE LHLD ECTR ;UPDATE THE ERROR COUNTER INX H SHLD IT WRITE COMMAND TO CONTROLLER CALL XMITW CALL WSTAT ;GO FIND OUT STATUS OF WRITE RZ CALL WERR ;OOPS CRC ERROR JMP RWCWS ;GO TRY AGAIN ; ; ; ;SUBROUTINE TO SET-UP WRITE SECTOR ; CALL RWCI ;INITIALIZE TEST FOR READ RWCRS: CALL SEC01 ;INITIALIZE FOR SECTOR 01 RWCR1: CALL KBINT ;GO TEST FOR KEY-BOARD INTERRUPT LXI D,128 CALL RWCR2 ;GO READ A SECTOR CALL SECCK ; ; HAS NOT BEEN TRANSMITTED TO ; THE CONTROLLER RET ; ; ; ;SUBROUTINE TO CHECK STATUS OF WRITE SECTOR ; WSTAT: IN DATAI ;GO GET STATUS FROM CONTROLLER ANI 008H ;CRC ERRO ; AND UPDATE IT INX H ;INCREMENT PASS COUNTER SHLD PCTR ;STORE NEW PASS NUMBER JMP RWCP ;GO DO THE NEXT PASS ; ; ; READO: CALL SP1 LXI H,MSG35 ;OUTPUT "SEEK COMMAND TO CONTROLLER JMP RWCRS ;GO READ SECTOR ON NEW TRACK NUMBER RWCR7: CALL RSTR ;TRANSMIT SEEK TRACK 00 ; COMMAND TO CONTROLLER RWCE: LHLD PCTR ;GO GET PASS COUNTER FROM STORAGE, OLLER CALL XMITW IN DATAI ;GET CONTROLLER STATUS STA SAVE ;SAVE IT ANI 008H ;HAVE WE GOT A CRC ERROR? CNZ CLRER ;GO CLEAR ERROR FLAGS,IF SO CALL DDMRK ;GO TEST CALL MSG CALL CRLF SYSW1: CALL SEC01 ;INITIALIZE FOR SECTOR 01 CALL WMK ;WRITE A DELETED DATA MARK ON SECTOR 01 ONLY CALL SECCK ;BUMP THE SECTOR NUMBER CALL XMTUS ;TRANSMIT N ; TO CONTROLLER RET ; ; ; ; ; ; ;SYSTEM TEST (WRITES ALL TRACKS,READS TRACKS ON RANDOM SEEKS,UNITS 00 AND 01) ; SYS: LXI H,MSG57 ;OUTPUT "SYSTEM TEST" ; TO CONSOLE CALL M D ;-1 TO THE BYTE COUNT MOV A,D ;IS ALL THE DATA IN? ORA E JNZ RWCR4 ;GO GET ANOTHER DATA BYTE IF NOT DONE CALL PTKSC ;FILL WRITE BUFFER WITH ALTERNATE ; TE FOR SYSTEM TEST IN DATAI ;GET STATUS FROM THE SELECTED UNIT ANI 010H ;MASK WRITE PROTECT JNZ MNTR ;GO TO THE COMMAND MONITOR,IF WRITE PROTECTED CALL UFLIP ;SELECT THE NEXT UNIT ; ; ; ; ; ; ; ; ; ;SUBROUTINE TO INITIALIZE WRITE/READ CONTINUOUS ; RWCI: CALL SEC01 ;INITIALIZE FOR SECTOR 01 CALL XMTUS ;TRANSMIT LOAD UNIT/SECTOR ; TO CONTROLLER MVI A,081H ;TRA FOR POSSIBLE DD MARK LXI H,RBUF ;SET H&L REGS. TO POINT TO FIRST ; LOCATION IN READ BUFFER MVI A,040H ;TRANSMIT READ BUFFER COMMAND, ; TO CONTROLLER CALL XMT4X CO LXI H,MSG1 ;OUTPUT "PASS=" TO CONSOLE CALL MSG LHLD PCTR ;OUTPUT PASS NUMBER TO CONSOLE MOV A,H CALL BYTEO MOV A,L CALL BYTEO LXI H,MSGSG SYSS: CALL RGEN ;SET-UP THE RANDOM TRACK NUMBER TABLE XRA A ;SET UNIT SELECT TO 00 STA UNIT MVI C,007H ;OUTPUT A "BELL" TO INDICATE THE ; START OF A PASS CALLRACK AND SECTOR NUMBER,AS DATA CALL RERR ;GO DO A BYTE FOR BYTE COMPARE ON DATA, ; FOR POSSIBLE ERROR IN DATA FIELD ; (CRC ERROR STATUS REPORT MAY ; BE BROKEN,ANDJNZ SYSWI ;RESTORE AND CHECK IT ALSO CALL WPRT ;CHECK FOR OPERATOR REQUESTED WRITE PROTECTION JNZ SYSRO ;DO "READ ONLY" PASSES IF REQUESTED SYSW: CALL CRLF LXI H,MSG2 ;OUTPUT "WRITE" TO CONSOLE NSMIT CLEAR COMMAND ; TO CONTROLLER CALL XMIT CALL RSTR ;TRANSMIT SEEK TO TRACK 00 ; COMMAND TO CONTROLLER CALL CLRER ;TRANSMIT CLEAR ERROR FLAGS MOV M,B INX H DCX D RWCR4: MVI A,041H ;GET A DATA BYTE CALL XMT4X MOV M,B ;STUFF IT INTO THE READ BUFFER INX H ;BUMP THE READ BUFFER POINTER DCX16 ;OUTPUT "ERROR TOTAL=" TO CONSOLE CALL MSG LHLD ECTR ;OUTPUT ERROR NUMBER TO CONSOLE MOV A,H CALL BYTEO MOV A,L CALL BYTEO SYSWI: CALL RWCI ;GO INITIALIZ CALL MSG CALL CLRER ;CLEAR ANY ERROR CALL TKSEC ;OUTPUT TRACK AND SECTOR IN ERROR TO CONSOLE LHLD ECTR ;UPDATE THE ERROR COUNTER INX H SHLD ECTR JMP RWCRS NOT TELL US) LDA SAVE ;GO GET "SAVED" STATUS ANI 008H ;CRC ERROR? RZ LXI H,MSG39 ;YES OUTPUT "CRC ERROR" TO CONSOLE CALL MSG LXI H,MSG3 ;OUTPUT "READ" TO CONSOLEEXT SECTOR TO CONTROLLER SYSW2: CALL KBINT ;GO TEST FOR KEY-BOARD INTERRUPT CALL SYSWS ;GO WRITE A SECTOR CALL SECCK ;GO CHECK FOR PROPER SECTOR NUMBER JZ SYSW3 ;GO TO A NEW TRACK IF FINISHED 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 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 CASMIT LOAD UNIT/SECTOR COMMAND, ; TO CONTROLLER CALL XMTTK ;TRANSMIT LOAD TRACK NUMBER TO CONTROLLER ; COMMAND TO CONTROLLER CALL SKTRK ;TRANSMIT SEEK COMMAND TO CONTROLLER RS 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 B,L UFLIP ;SELECT NEW UNIT JNZ SYSRI ;DO A RESTORE ON UNIT 01,IF NOT UNIT 00 SYSR2: LXI D,128 CALL RMK ;CHECK FOR A DELETED DATA MARK ON SECTOR 01 ONLY CALL SEC01 ;INITIALIZE FOR SECTOR 01 SYSR3: CALL XMTUS ;TRANSMIT LOAD UNIT/SECTOR ; COMMAND,TO CONTROLLER JMP SYSW2 ;GO WRITE NEXT SECTOR SYSW3: CALL UFLIP ;SELECT NEW UNIT JNZ SYSW1 ;DO A WRITE ON UNIT 01,IF NOT UNIT 00 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 ;COMPLEMELL SEC01 ;SET SECTOR NUMBER TO 01 CALL XMTUS ;TRANSMIT LOAD UNIT/SECTOR COMMAND, ; TO CONTROLLER CALL XMTTK ;TRANSMIT LOAD TRACK COMMAND ; TO CONTROLLER CALL CALL UFLIP ;SELECT NEW UNIT JNZ SYSW4 ;SEEK TO NEXT TRACK ON UNIT 01, ; IF NOT UNIT 00 JMP SYSW1 ;GO WRITE SECTOR ON NEW TRACK NUMBER SYSW5: CALL RSTR ;TRANSMIT SEEK TRACK 00 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 TRACK CALL KBINT ;GO TEST FOR KEY-BOARD INTERRUPT LXI D,128 CALL SYSRS ;GO READ A SECTOR CALL SECCK ;GO CHECK FOR PROPER SECTOR NUMBER JZ SYSR4 ;GO TO A NEW TRACK IF FINISHED CALL CALL INCTN ;INCREMENT TRACK NUMBER JZ SYSW5 ;GO DO A RESTORE,AND ATTEMPT TO ; WRITE UPPER SURFACE,IF ALL TRACKS HAVE BEEN ; WRITTEN ON THE LOWER SYSW4: CALL XMTUS ;TRANNT 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 NUMBECONTINUOUS? 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 TEST FOR READ CALCOMMAND, ; TO CONTROLLER CALL UFLIP ;SELECT NEW UNIT SYSR: CALL KBINT ;GO CHECK FOR KEY-BOARD INTERRUPT LDA BLOOP ;GET THE STATE OF THE LOOP COMMAND ADI 000H ;LOOP ON WRITE ;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 FOR BYTE COMPARE ON DATA, ; FOR POSSIBLE ERROR IN DATA FIELD ; (CRC ERROR STATUS REPORT MAY ; BE BROKEN,AND NOT TELL US) LDA SAVE ;GO GET "SAVED" STATUS TATUS 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 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 ;POI MVI A,041H ;GET A DATA BYTE CALL XMT4X MOV M,B ;STUFF IT INTO THE READ BUFFER INX H ;BUMP THE READ BUFFER POINTER DCX D ;-1 TO THE BYTE COUNT MOV A,D ;IS ALL T ; 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 READ 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 TRACK NUMC 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 POINSTA 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 A CRNT 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 ITERATIONS HE DATA IN? ORA E JNZ RSEC ;GO GET ANOTHER DATA BYTE IF NOT DONE CALL PTKSC ;FILL WRITE BUFFER WITH ALTERNATE ; TRACK AND SECTOR NUMBER,AS DATA CALL RERR ;GO DO A BYTE 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 CHECK SBER 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 TABLET TO FIRST ; LOCATION IN READ BUFFER MVI A,040H ;TRANSMIT READ BUFFER COMMAND, ; TO CONTROLLER CALL XMT4X MOV M,B INX H DCX D RSEC: ISHED 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" COUNT XCHG ;SWAP SHLD RCTR ;SAVE THE COUNT XCHG ;SWAP AGAIN MOV A,E ORA D RNZ ;GO DO ANOTHER SEEK,IF 256 SEEKS ; NOT FIN ANI 008H ;CRC ERROR? RZ LXI H,MSG39 ;YES OUTPUT "CRC ERROR" TO CONSOLE CALL MSG LXI H,MSG3 ;OUTPUT "READ" TO CONSOLE CALL MSG CALL CLRER ;CLEAR ANY ERROR LXI H,MSG31 ;OUTPUT "UNIT=" TO CONSOLE CALL MSG CALL AUNIT ;OUTPUT UNIT NUMBER TO CONSOLE CALL BYTEO CALL RSTR ;TRANSMIT SEEK TRACK 00 COMMAND, ; TO CONTROLLLHLD ECTR ;UPDATE THE ERROR COUNTER INX H SHLD ECTR RET ; ; ; FAIL: LXI H,MSG23 ;OUTPUT "FAILED TO" TO CONSOLE CALL MSG RET ; ; ; ; ; ; ;SUBROUTINE TO INCREMENT TO READ DD MARK AND CRC,IF O.K. CALL WERR ;OOPS ANOTHER DAMN CRC ERROR JMP SYSW1 WMKR: CALL SEC01 ;INITIALIZE FOR SECTOR 01 MVI A,003H ;TRANSMIT A READ COMMAND TO CONTROLLER CALL XMITW CALL CLRER ;CLEAR THE CRC ERROR LHLD ECTR ;UPDATE THE ERROR COUNTER INX H SHLD ECTR LXI H,MSG39 ;OUTPUT "CRC ERROR" TO CONSOLE CALL MSG CALL SP1 RMK1 CALL ERROR ;YES RMK1: IN DATAI ;ONE MORE TIME FOR THE STATUS ANI 080H ;DD MARK? JZ RMK2 CALL CLRER ;YES,IT'S REALLY ON SECTOR 01 RET RMK2: CALL FAIL CALL TKSEC ;OUTPUT TRACK AND SECTOR IN ERROR TO CONSOLE LHLD ECTR ;UPDATE THE ERROR COUNTER INX H SHLD ECTR JMP SYSR3 ; ; ; ;SUBROUTINE TO WRITE AND CHECK A DELETED DATA MARK ; WMK: K NUMBER >76 DECIMAL? RET ;FIND OUT AT RETURN ; ; ; ;SUBROUTINE TO SEEK TO A TRACK ; SKTRK: MVI C,'.' ;MAKE A TRACK SEEK INDICATOR FOR THE CONSOLE CALL CO CALL KBINT ;GO CHECK FOR KEY-BOARD IRACK NUMBER ; INCTN: MVI A,001H ;SET SECTOR NUMBER TO 01 STA SECNO LDA TRKNO ;GET PRESENT TRACK NUMBER INR A ;+1 TO TRACK NUMBER STA TRKNO ;STORE IT CPI 04DH ;TRAC IN DATAI ;GET THE STATUS ANI 008H ;CRC ERROR? JZ WMK1 CALL ERROR ;YES WMK1: IN DATAI ;GET THE STATUS AGAIN ANI 080H ;DD MARK? JZ WMK2 CALL LXI H,MSG60 ;OUTPUT "SEEK TO TRACK=" TO CONSOLE CALL MSG LDA TRKNO ;GO GET CURRENT TRACK NUMBER STA NEWTK ;SAVE IT CALL BYTEO ;OUTPUT IT TO THE CONSOLE CALL SP2 ;OH OH NO DD MARK LXI H,MSG3 ;OUTPUT "READ " TO CONSOLE CALL MSG MKERR: LXI H,MSG44 ;OUTPUT "DD MARK" TO CONSOLE CALL MSG CALL TKSEC ;OUTPUT THE TRACK AND SECTOR IN ERROR CALL WSEC ;SET-UP TO WRITE A SECTOR MVI A,00FH ;TRANSMIT A WRITE DELETED DATA MARK COMMAND ; TO CONTROLLER CALL XMITW CALL WSTAT ;CHECK WRITE STATUS JZ WMKR ;GNTERRUPT LXI D,128 MVI A,009H ;TRANSMIT SEEK COMMAND, ; TO CONTROLLER CALL XMITW IN DATAI ;GO GET CONTROLLER STATUS ANI 008H ;CRC ERROR? RZ DELETED DATA MARK ; RMK: CALL SEC01 ;INITIALIZE FOR SECTOR 01 MVI A,003H ;TRANSMIT A READ COMMAND TO CONTROLLER CALL XMITW IN DATAI ;GET THE STATUS ANI 008H ;CRC ERROR? JZ CLRER ;YES,IT'S WHERE IT SHOULD BE RET WMK2: CALL FAIL ;OOPS WE ARE MISSING THE DD MARK LXI H,MSG2 ;OUTPUT "WRITE" TO CONSOLE CALL MSG JMP MKERR ; ; ; ;SUBROUTINE TO READ AND CHECK A ER LDA NEWTK ;O.K NOW PUT IT BACK STA TRKNO JMP SKTRK ;LET'S TRY SEEKING TO THIS TRACK AGAIN ; ; ; ; ;SUBROUTINE TO FILL WRITE BUFFER WITH TRACK AND SECTOR NUMBER DATA ; PTKSC: LXI D,128 ;SET BTO ALLOW C.E. ALIGNMENT 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) ; NVERSION RET ;FIND OUT AT RETURN ; ; ; ; ;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. ;PUT IT INTO THE WRITE BUFFER ALSO INX 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 DO DB 012H DB 018H DB 004H DB 00AH DB 010H DB 016H ; ; ; ;SUBROUTINE TO SEEK TO TRACK 00 (DO A RESTORE) ; RSTR: XRA A ;ZERO OUT A REG. STA R 01 ; SEC01: MVI A,001H ;SET SECTOR NUMBER TO 01 STA LSN CALL OSCTR ;INITIALIZE TO LOGICAL SECTOR CONVERSION CALL XMTUS ;TRANSMIT LOAD UNIT/SECTOR, ; TO CONTROLLER REYTE COUNT FOR CURRENT TRACK POSITION LXI 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 ; ;LOGICAL SECTOR TABLE (SKIPS EVERY 5 SECTORS) ; LSTBL: DB 001H DB 007H DB 00DH DB 013H DB 019H DB 005H DB 00BH DB 011H DB 0 LXI H,LSTBL-1 ;POINT AT LOGICAL SECTOR TABLE 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 ; ; NE,GO LOAD A TRACK NUMBER RET ;AHHHHH FINALLY DONE ; ; ; ;SUBROUTINE TO DO 26 SEQUENTIAL SECTORS ; VERSEC: LDA SECNO ;GET THE CURRENT SECTOR NUMBER INR A STA SECNO ;AND IT'S BUMPED TRKNO ;SET 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 T ; ; ; ;SUBROUTINE TO INCREMENT LOGICAL SECTOR NUMBER ; INCSN: LDA LSN ;GO GET PRESENT SECTOR NUMBER INR A ;INCREMENT SECTOR NUMBER STA LSN ;STORE IT CALL OSCTR ;GO DO LOGICAL SECTOR CO POINTER DCX D ;-1 TO THE BYTE 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 17H DB 003H DB 009H DB 00FH DB 015H DB 002H DB 008H DB 00EH DB 014H DB 01AH DB 006H DB 00CHC26: CALL INCSN ;GO INCREMENT LOGICAL SECTOR NUMBER LDA LSN ;IS THE LAST SECTOR DONE,FOR 26 LOGICAL SECTORS? CPI 01BH RET ;GO FIND OUT AT THE RETURN ; ; ; ;SUBROUTINE TO INITIALIZE FOR SECTO CPI 01BH ;ALL DONE FOR 26 SECTORS? RET ;...FIND OUT AT THE RETURN ; ; ; ;SUBROUTINE TO TRANSMIT THE PROPER SECTOR NUMBER TO THE CONTROLLER ; SECCK: JMP SEC26 ; ; ; ;SUBROUTNE TO DO 26 LOGICAL SECTORS ; SEALIN: LXI H,MSG51 ;OUTPUT "ALIGNMENT," TO THE CONSOLE CALL MSG CALL XMTUS ;TRANSMIT LOAD UNIT/SECTOR TO CONTROLLER IN DATAI ;GO GET STATUS ANI 010H ;IF IT'S NOT WRITE PROTECTED, ME (PAUSE) AS REQUIRED (DELAY CONSTANT IN H&L REGS.) ; DLY: DCX H MOV A,L ORA H JNZ DLY RET ; ; ; XMTUS: LDA SECNO ;TRANSMIT UNIT/SECTOR TO CONTROLLER MOV B,A TA 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 ALIN5: MVI A,007H ;SET-UP THE TIMER ITERATIONS COUNT ALIN6ONG KEY-BOARD INPUT ALIN2: CALL RSTR ;DO A SEEK TO TRACK 00,THE ; C.E. DISKETTE IS WRITE PROTECTED CALL CRLF ;KEEP IT NEAT CALL SP1 MVI C,'S' ;OUTPUT "SEEK TO TRACK=" TO CON ALIN7: CALL WPRT ;GO CHECK FOR OPERATOR REQUESTED ; WRITE PROTECT JNZ ALIN1 ;GO DO THE ALIGNMENT ROUTINE,IF SO CALL SP2 LXI H,MSG52 ;OUTPUT "NO WRITE PROTECT" TO CONSOLE; TO THE CONTROLLER MVI A,009H ;TRANSMIT SEEK COMMAND,TO CONTROLLER CALL XMITW JMP ALIN3 ;STAY ON THE TRACK WITH THE HEAD(S) ; LOADED NO MATTER WHAT HAPPENS ALIN4: CALL RSTR ;D ; FIND OUT IF THE OPERATOR HAS ; SELECTED WRITE PROTECTION FROM ; THE COMMAND MONITOR JZ ALIN7 ALIN1: LXI H,MSG53 ;OUTPUT "AUTO?" TO CONSOLE CONTROLLER MVI A,009H ;TRANSMIT SEEK TRACK COMMAND, ; TO CONTROLLER CALL XMITW CALL CLRER ;TRANSMIT CLEAR ERROR FLAGS, ; TO CONTROLLER CALL TIME3 : STA TIMCT CALL KBINT ;GO CHECK FOR A KEY-BOARD INTERRUPT CALL XMTUS ;TRANSMIT LOAD UNIT/SECTOR, ; TO CONTROLLER CALL XMTTK ;TRANSMIT TRACK NUMBER, ; TOSOLE CALL CO LXI H,MSG11 CALL MSG CALL CONI ;LET'S LOOK FOR A VALID HEX TRACK NUMBER STA TRKNO ;STUFF THE KEY-BOARD INPUT INTO TRACK STORAGE CPI 04DH ;TRACK NUMBER TO CALL MSG CALL WPMSG JMP MNTR ;EXIT TO THE MONITOR,UNTIL THINGS ; ARE SQUARED AWAY ALIN8: CALL TIME1 ;MAKE A DELAY JMP ALIN2 ; ; ; ; ; ; ;ROUTINE TO DELAY TIO A SEEK TO TRACK 00 MVI A,001H ;SET-UP TRACK 01 STA TRKNO CALL ALIN5 ;GO SEEK TO THE TRACK,AND STAY AWHILE CALL RSTR ;DO A SEEK TO TRACK 00 MVI A,04CH ;SET-UP TRACK 76 S CALL MSG CALL CECHO ;GO GET KEY-BOARD INPUT CPI 'Y' JZ ALIN4 ;GO DO AUTO,IF REQUESTED CPI 'N' JZ ALIN2 ;GO DO SELECTED TRACKS,IF REQUESTED JMP LER ;OOPS WR ;GO KILL SOME TIME LDA TIMCT ;GET THE TIMER ITERATIONS COUNTER DCR A ;DECREMENT IT CPI 000H ;DONE? RZ ;RETURN,IF SO JMP ALIN6 ;NOPE STAY A LITTLE WHILE LONGER ;GO DO OLD TRACK,IF NOT IN CDATA ANI 07FH CPI 'S' ;GOT A SEEK REQUEST? JZ ALIN8 ;IF YES,LET'EM CHOOSE OLDTK: CALL XMTTK ;TRANSMIT TRACK THE TRACK NUMBER, LARGE? JNC INER1 ;EXIT,IF SO ALIN3: CALL CLRER ;GO CLEAR ERROR FLAGS CALL KBINT ;GO CHECK FOR A KEY-BOARD INTERRUPT IN CCTRL ;NEW TRACK SEEK REQUESTED? ANI CRRDY JZ OLDTK LDA UNIT ORA B OUT DATAO MVI A,21H CALL XMIT CALL UNCHK ;CHECK UNIT CODE BITS FOR MATCH ; TO SELECTED UNIT RET ; ; ; XMTTK: LDA TRKNO CALL MSG MVI C,'?' CALL CO CALL SP1 CALL CECHO ;GO GET KEY-BOARD INPUT CPI 'Y' ;YES? JZ PROT1 CPI 'N' ;NO? JZ PROT2 JML" TO CONSOLE CALL MSG RET ; ; ; ;SUBROUTINE TO CHECK UNIT CODE BITS FOR MATCH TO SELECTED UNIT ; UNCHK: LDA UNIT ;GET THE UNIT NUMBER RLC RLC RLC MOV B,A ;MATCH IT TO BTW: CALL XMIT LDA TIME ;GO GET TIMER CONTROL COMMAND ADI 000H JNZ XMITT ;IF TIMER COMMAND IS SET,GO DO ; A 2.5 SECOND DELAY AND ; DON'T WAIT FOR BUSY SSG CALL AUNIT ;FORM UNIT NUMBER FROM STORAGE, ; INTO ACTUAL UNIT NUMBER CALL BYTEO WPMSG: CALL SP1 LXI H,MSG35 ;OUTPUT "WRITE PROTECT" TO CONSOLE CALL MSG 2.5 SECONDS. RET ; ; ; ;DRIVE READY TEST ; DCHK: IN DATAI ;GET STATUS FROM CONTROLLER ANI 020H ;TEST DRIVE FAIL BIT RZ CALL CRLF CALL SP1 LXI H,MSG31 ;OUT ;TRANSMIT TRACK ADDRESS TO CONTROLLER OUT DATAO MVI A,11H JMP XMIT ; ; ; XMIT: OUT CNTRL XRA A ;OUTPUT A "DUMMY" EXAMINE STATUS TO ; CONTROLLER TO CLEAR DATSOLE CALL MSG CALL AUNIT CALL BYTEO ;SHOW'EM THE UNIT NUMBER CALL SP1 ;KEEP IT NEAT LXI H,MSG10 ;OUTPUT "UNIT CODE FAIL" TO CONSOLE CALL MSG RET ; ; IT POSITION FOR UNIT CODE BITS IN DATAI ;GET'EM ANI 006H ;MASK'EM CMP B ;GOT A MATCH? RZ CALL SP1 ;OOPS NO MATCH LXI H,MSG31 ;OUTPUT "UNIT=" TO CONTATUS TO ; GO FALSE MVI B,003H ;SET-UP TIMER CONSTANTS (5 SECONDS) LXI H,0FFFFH BUSYT: DCX H ;START COUNTING DOWN MOV A,L ORA H JNZ BUSY ;TIME CALL CRLF RET ; ; ; ;ROUTINE TO ALLOW THE OPERATOR TO SET "WRITE PROTECT" ; PROT: LXI H,MSG35 ;OUTPUT "WRITE PROTECT" TO CONSOLE CALL MSG LXI H,YNMSG ;OUTPUT "(Y,N)" TO CONSOLE PUT "UNIT=" TO CONSOLE CALL MSG CALL AUNIT ;FORM UNIT STORAGE INTO PROPER ; POSITION FOR CONSOLE OUTPUT CALL BYTEO CALL SP1 LXI H,MSG34 ;OUTPUT "DRIVE FAIA OUT INTERFACE OUT CNTRL CALL DCHK ;GO TEST DRIVE FAIL BIT RET ; ; ; XMT4X: OUT CNTRL IN DATAI MOV B,A XRA A OUT CNTRL RET ; ; ; XMI; ;WRITE PROTECT TEST SUBROUTINE ; WPCHK: IN DATAI ;GET STATUS FROM CONTROLLER ANI 010H ;TEST WRITE PROTECT BIT RZ CALL SP1 LXI H,MSG31 ;OUTPUT "UNIT=" TO CONSOLE CALL M ; THAT WE MIGHT AS WELL GO BACK TO ; THE COMMAND MONITOR BUSY: IN DATAI ;TEST BUSY STATUS FROM CONTROLLER RAR JC BUSYT RET ; ; ; XMITT: CALL TIME1 ;DELAY FORD OUT? DCR B JNZ BUSY LXI H,MSG56 ;OH OH "RUN-AWAY" BUSY CALL MSG CALL SCLR ;DO A SYSTEM CLEAR JMP MNTR ;THIS CONTROLLER IS IN SO MUCH TROUBLE, P LER ;OOPS WRONG ENTRY PROT1: MVI A,001H ;YES WRITE PROTECT THIS DISK JMP PROT3 PROT2: XRA A ;WERE GOING TO WRITE ON IT PROT3: STA WPROT JMP MNTR ; ; ; ; ;SUBROUTINE TO TEST FOR OPERAY BIT ; ; ; ;SUBROUTINE TO CONVERT TWO HEX CHARACTERS TO ONE BYTE ; NBL: SUI '0' RC ADI 0E9H 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 RK EQU $ ;STORAGE FOR 512 BYTE STACK ; ; ; END 8 ;STORAGE FOR 128 BYTE READ DATA BUFFER RANTK DS 256 ;STORAGE FOR 256 RANDOM TRACK TABLE DS 512 STACS 1 ;STORAGE FOR PATTERN SELECTED DATA BYTE BLOOP: DS 1 ;STORAGE FOR "LOOP" COMMAND RDCRC: DS 1 ;STORAGE FOR "READ CRC" COMMAND TRIES: DS 1 ;STORAGE FOR "ERROR RETRIES" SAVE: DS 1 ;STORAGER'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 0100H ; ; ; DI ;DISABLE INTERRUPTS LXI SP,STACK ;SET THE STACK P;STORAGE FOR "TIMER CONTROL" COMMAND TIMCT: DS 1 ;STORAGE FOR TIMER ITERATIONS COUNT WPROT: DS 1 ;STORAGE FOR "WRITE PROTECT" COMMAND VFYCM: DS 1 ;STORAGE FOR "VERIFY" (READ CRC) COMMAND ; ; ; ;STORAGE FOR WRITTOR REQUESTED WRITE PROTECT ; WPRT: LDA WPROT ;GO GET STATE OF WRITE PROTECT COMMAND ANI 001H ;GO FIND OUT AT THE RETURN RET ; ; ; ;STORAGE FOR VARIABLES REQUIRED FOR FLEXIBLE DISKETTE DRIVE/CONTROLLER ; UNIT: ееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееее FOR "SAVED STATUS" RETRY: DS 1 ;STORAGE FOR "READ ERROR RETRY" COUNTER SHDBE: DS 1 ;STORAGE FOR "S/B" DATA FROM WRITE BUFFER WAS: DS 1 ;STORAGE FOR "WAS" DATA BYTE FROM READ BUFFER DCTR: DS 2 ;STOOINTER JMP INIT ;INITIALIZE ; ; ; ; ; ; ;DEFINE CONSOLE I/O PARAMETERS FOR ALTAIR 2SI/O BOARD ; CCTRL EQU 010H ;CONSOLE COMMAND/STATUS PORT CDATA EQU 011H ;CONSOLE DATA PORT CRRDY EQU 001H ;RECEIVER READY BIT CTRDY EQU 002H ;TRANSMITTER READE,READ,RANDOM TRACK,AND STACK BUFFERS ; WBUF DS 128 ;STORAGE FOR 128 BYTE WRITE DATA BUFFER RBUF DS 128 ;STORAGE FOR 128 BYTE READ DATA BUFFER RANTK DS 256 ;STORAGE FOR 256 RANDOM TRACK TABLE DS 512 STAC DS 1 ;STORAGE FOR DISKETTE DRIVE "UNIT" NUMBER TRKNO: DS 1 ;STORAGE FOR TRACK/CYLINDER ADDRESS LSN: DS 1 ;STORAGE FOR LOGICAL SECTOR NUMBER SECNO: DS 1 ;STORAGE FOR PHYSICAL SECTOR NUMBER DBUF: D;*********************************************************************** ; MICROCOSM ASSOCIATES "SUPER MEMORY DIAGNOSTIC" VERSION 1.01 (C) 1979 ;*********************************************************************** ; ;DONATED TO THE "SIG/M" CP/M USER RANDOM NUMBER TABLE POINTER DELET: DS 1 ;STORAGE FOR "DELETED DATA MARK" COMMAND NEWTK: DS 1 ;STORAGE FOR TRACK NUMBER,IF "LOOP" COMMAND ; IS ENABLED ON "SEEK TO TRACK" TEST TIME: DS 1 RAGE FOR "BYTE IN ERROR" DATA COUNTER ECTR: DS 2 ;STORAGE FOR "ERROR" COUNTER PCTR: DS 2 ;STORAGE FOR "PASS" COUNTER RCTR: DS 2 ;STORAGE FOR "RANDOM SEEK ITERATIONS" COUNTER RPNT: DS 2 ;STORAGE FORC RRC RRC ANI 0FH CALL HXDA POP PSW ANI 0FH JMP HXDA ; ; ; HXDA: CPI 10 JM CNO ADI 7 CNO: ADI 30H MOV C,A JMP CO ; ; ; ;CONSOLE INPUT ROUTINE ; CI: IN CCTRL ANI CRRDY JZ CI IN CDATA ANI 7FH RET ; ; ; CRLF: MV5,0DH,0AH,'GALLOPING PATTERNS TEST' ; RFMSG: DB 25,0DH,0AH,'STATIC CHECK CYCLE TEST' ; CKMSG: DB 25,0DH,0AH,'CHECKING DATA RETENTION' ; CLMSG: DB 24,0DH,0AH,'GALLOPING COLUMNS TEST' ; RDMSG: DB 22,0DH,0AH,'RANDOM PATTERNS TEST' ; SATSG: DB 23,0DH3: ADI 30H RET ; ; ; HLCO: CALL CRLF HLOUT: MOV A,H CALL BYTEO MOV A,L CALL BYTEO RET ; ; ; DSPYM: CALL HLCO MVI C,'=' CALL CO MOV A,M CALL BYTEO MVI C,20H CALL CO RET ; ; ; MEM: LXI H,MSG1 ;OUTPUT "MEMORY ADDRESS=" TO H ;SET BASE ADDRESS OF TEST RAM -1 FIND: INX H ;EXAMINE EACH BYTE MOV A,M CMA MOV M,A CMP M JZ FIND DCX H CALL HLOUT LXI H,QTMSG ;OUTPUT "MEMORY QUALIFICATION TEST ; IS IN PROGRESS" TO CONSOLE CALL MSG LXI H,01000H ;SET MEMORY "BOTDDRESS=' ; MSG2: DB 10,'O ADDRESS=' ; MSG7: DB 17,0DH,0AH,0AH,'TOP OF MEMORY=' ; QTMSG: DB 43,0DH,0AH,0AH,'MEMORY QUALIFICATION TEST IS IN PROGRESS' ; AMMSG: DB 39,0DH,0AH,0AH,'TEST MEMORY IN "AUTO" MODE (Y OR N)?' ; DFMSG: DB 47,0DH,0AH,0AH,'TES MSG CALL PARAM CALL CRLF PCHL ; ; ; PARAM: LXI H,0 PARM1: CALL CECHO CPI 0DH RZ DAD H 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 LER RLC RLC RI C,0DH CALL CO MVI C,0AH JMP CO ; ; ; CONO: CALL BYTEO CALL CRLF RET ; ; ; CONI: PUSH B CALL BYTEC POP B RET ; ; ; ;CONSOLE OUTPUT ROUTINE ; CO: IN CCTRL ANI CTRDY JZ CO MOV A,C OUT CDATA RET ; ; ; INIT: LXI H,0MEM1 ; ; ; ;KEY-BOARD INTERRUPT ROUTINE,KEYED WITH "SPACE-BAR" ; KBINT: IN CCTRL ANI CRRDY RZ IN CDATA ANI 07FH ;MASK-OFF PARITY BIT CPI 020H ;GOT A "SPACE-BAR"? JZ MNTR ;GO TO COMMAND MONITOR,IF SO RET ; ; ; SP5: MVI C,20H CALL CONSOLE CALL MSG CALL PARAM MEM1: CALL DSPYM CALL CECHO CPI 00DH JZ MNTR CPI 020H JZ MEM9 CPI 05EH JZ MEM10 CALL BYTC1 MOV M,A CMP M JZ MEM9 MVI C,' ' CALL CO MVI C,'E' CALL CO MEM9: INX H JMP MEM1 MEM10: DCX H JMP TOM" ADDRESS SHLD MBOT LXI H,0C000H ;SET MEMORY "TOP" ADDRESS SHLD MTOP LXI H,TEST ;SAVE "FUNKY RETURN" ADDRESS SHLD MTEST JMP RNDSL ;GO DO RANDOM PATTERNS TEST ON 16K BYTE MEMORY TEST: LXI SP,STACK ;RE-SET THE STACK JMP MEMTS ; ; ; MNTRT "ALL","SELECT",OR "MONITOR" (A,S OR M)?' ; TPMSG: DB 20,' TEST IS IN PROGRESS' ; TMSG: DB 17,0DH,0AH,0AH,'TESTING MEMORY' ; FMSG: DB 6,',FROM ' ; TOMSG: DB 4,' TO ' ; PSMSG: DB 7,0DH,0AH,'PASS=' ; ERMSG: DB 15,', TOTAL ERRORS=' ; PTSG: DB 2LC RLC PUSH PSW CALL CECHO CALL NBL JC LER POP B ORA B RET ; ; ; BYTEO: PUSH PSW CALL BYTO1 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 BYTO3 ADI 7 BYTO1000H ;SET DELAY COUNT FOR 6850 SETTLE TIME DELAY: DCX H MOV A,H ORA L JNZ DELAY MVI A,003H ;RESET 6850 ACIA OUT CCTRL MVI A,015H OUT CCTRL LXI H,MSGN CALL MSG TOP: LXI H,MSG7 ;OUTPUT "TOP OF MEMORY=" TO CONSOLE CALL MSG LXI H,00FFFCO SP4: MVI C,20H CALL CO SP3: MVI C,20H CALL CO SP2: MVI C,20H CALL CO SP1: MVI C,20H CALL CO RET ; ; ; ; ; ; MSGN: DB 71,0DH,0AH,'MICROCOSM ASSOCIATES "SUPER MEMORY DIAGNOSTIC"' DB ' VERSION 1.01 (C) 1979' ; MSG1: DB 14,'EMORY AMTS ;JUMP TO MEMORY TEST START,IF "T" LER: CALL CRLF ;KEEP IT NEAT MVI C,'?' ;LINE INPUT ERROR,OUTPUT "?" TO CONSOLE CALL CO JMP MNTR ; ; ; CECHO: CALL CI MOV C,A CALL CO RET ; ; ; GO: LXI H,MSG2 ;OUTPUT "GO ADDRESS=" TO CONSOLE CALL: LXI SP,STACK CALL CRLF MVI C,'-' ;OUTPUT PROMPT (- CHARACTER) CALL CO CALL CECHO ;ECHO KEY-BOARD INPUT OUT TO CONSOLE CPI 'M' JZ MEM ;JUMP TO MEMORY DISPLAY/ALTER,IF "M" CPI 'G' JZ GO ;JUMP TO GO TO MEMORY ADDRESS,IF "G" CPI 'T' JZ ME,0AH,'WRITE SATURATION TEST' ; WMSG: DB 23,0DH,0AH,'WALKING PATTERNS TEST' ; NDMSG: DB 27,0DH,0AH,0AH,'NO MEMORY BLOCKS DROPPED' ; DMMSG: DB 27,0DH,0AH,0AH,'DROPPED MEMORY BLOCK(S)=' ; LMMSG: DB 22,0DH,0AH,0AH,'LOW MEMORY ADDRESS=' ; HMMSG: DB 22MOV H,A ;MAKE A 16 BIT BLOCK ADDRESS OUT OF THIS, ; AND SAVE AS BLOCK STARTING ADDRESS SHLD BLKST ADI 010H ;ADD 4K TO START MOV H,A SHLD MEND ;SAVE AS MEMORY BLOCK END ADDRESS +1 LXI H,AUTO1 ;SAVE "AUTO1" FOR LOOPING ADDRESS SHLD AUTOR LXYES CPI 'N' JZ SELCT ;LET OPERATOR SELECT,IF NO JMP AUT ;OOPS...GAVE HIM TWO CHOICES,AND HE PICKED THIRD AUTO: CALL KBINT ;CHECK FOR KEY-BOARD INTERRUPT LXI H,DROP ;SET-UP DROP LIST POINTER SHLD DROPP ;SET DROP LIST POINTER TO START XRA A ;CL,04,05 OR 06)=' ; EPMSG: DB 24,0DH,0AH,0AH,'ENTER PATTERN(00-FF)=' ; REMSG: DB 29,0DH,0AH,'RETENTION ERROR AT ADDRESS=' ; EXMSG: DB 31,0DH,0AH,'EXPECTED "00" DATA,READ BACK ' ; MRER1: DB 20,0DH,0AH,'ERROR AT ADDRESS=',0 ; MRER2: DB 12,' READ BAC H ;BACK-UP TO MEMORY BLOCK JUST TESTED,AND LOG IT OUT MVI M,000H AUTO3: MVI A,9 ;SET ERROR DISPLAY COUNTER TO 8 PLUS 1 STA ERCNT XRA A ;CLEAR ERROR FLAG STA ERFLG LHLD MEMPT ;GET MEMORY BLOCK AND BLOCK NUMBER MOV A,M INX H ;UPDATE AND SAVE E,1 ;SET-UP BASE RAM 1ST 4K BYTE TEST ADDRESS STAAD: MOV A,E STAX B ;SAVE IT IN BUFFER INX B INC4K: MVI A,00BH ;INCREMENT TO NEXT 4K MEMORY BLOCK,STOP IF ALL ; MEMORY BLOCKS TRIED,FOR 16 K BYTE MEMORY INR E ;BUMP FOR NEXT MEMORY BLOCK CMP E ,0DH,0AH,'HIGH MEMORY ADDRESS=' ; NAMSG: DB 24,0DH,0AH,'INVALID MEMORY ADDRESS' ; OPMSG: DB 20,0DH,0AH,0AH,'TEST OPTIONS ARE:' ; TMSG1: DB 30,0DH,0AH,0DH,0AH,'01-GALLOPING PATTERNS TEST' ; TMSG2: DB 27,0DH,0AH,'02-GALLOPING COLUMNS TEST' ; TMSG3:JZ AUTO3 ;IF NOT ZERO,DROP THIS BLOCK FROM TEST LHLD DROPP ;POINT TO NEXT DROP LIST SLOT XCHG LHLD BLKST ;GET MEMORY BLOCK START ADDRESS XCHG ;AND NOW WE HAVE H&L REGS.AS DROP LIST POINTER, ; AND D&E REGS. AS THE BLOCK START MOV M,E ;SAVE EAR DROP COUNT AND ERROR FLAG DCX H MOV M,A DCX H MOV M,A AUTO0: LXI H,MBUF ;POINT TO MEMORY BUFFER SHLD MEMPT ;SAVE MEMORY POINTER FOR LOOPING AUTO1: LDA ERFLG ;GET ERROR FLAG,TO SEE IF WE DROP MEMORY ; BLOCK JUST TESTED OR NOT ORA A K ' ; MRER3: DB 11,' ,EXPECTED ' ; MRER4: DB 27,0DH,0AH,'LAST ADDRESS WRITTEN WAS ' ; MRER5: DB 14,20H,',PATTERN WAS ' ; MRER6: DB 26,0DH,0AH,'ERROR READING OTHER CELL' ; MRER7: DB 25,0DH,0AH,'ERROR READING TEST CELL' ; MRER8: DB 12,0DH,0AH,'TE NEW POINTER SHLD MEMPT ORA A ;TEST THE MEMORY BLOCK NUMBER JM AUTO0 ;RE-START IF "END" OF BUFFER JZ AUTO3 ;TRY NEXT ONE,IF DROPPED MEMORY BLOCK RLC ;CONVERT MEMORY BLOCK NUMBER TO 4K BLOCK ADDRESS RLC RLC RLC MVI L,000H ;ZERO L REG. ;ALL DONE? JP STAAD ;IF NOT,GO TEST THIS NEW MEMORY BLOCK MVI A,080H ;YES,TAG WITH "END" IN BUFFER STAX B AUT: LXI H,AMMSG ;OUTPUT "TEST MEMORY IN "AUTO" MODE (Y OR N)?" CALL MSG CALL CECHO ;GET THE ANSWER CPI 'Y' JZ AUTO ;DO AUTO MODE,IF DB 26,0DH,0AH,'03-WALKING PATTERNS TEST' ; TMSG4: DB 25,0DH,0AH,'04-RANDOM PATTERNS TEST' ; TMSG5: DB 26,0DH,0AH,'05-WRITE SATURATION TEST' ; TMSG6: DB 28,0DH,0AH,'06-STATIC CHECK CYCLE TEST' ; TMSGN: DB 44,0DH,0AH,0AH,'ENTER TEST NUMBER (01,02,03LOW BYTE OF BLOCK START INX H MOV M,D ;SAVE HIGH BYTE OF BLOCK START INX H ;GET H&L REGS. TO POINT TO NEXT DROP LIST SLOT SHLD DROPP ;SAVE THE NEW POINTER LXI H,DROPC ;+1 TO THE DROP COUNT INR M LHLD MEMPT ;GET THE MEMORY BLOCK POINTER DCXCO INX H DCR B JNZ MSGA POP B POP PSW RET ; ; ; ; ; ; ;ROUTINE TO FIND ALL 4K MEMORY BLOCKS AVAILABLE TO SYSTEM ; MEMTS: LXI H,00000H ;CLEAR THE PASS AND ERROR COUNTERS SHLD PCTR SHLD ECTR LXI B,MBUF ;POINT TO MEMORY BUFFER MVIST CELL=' ; MRER9: DB 13,', OTHER CELL=' ; MER10: DB 18,20H,20H,'PATTERN STORED=',0 ; MER11: DB 16,20H,20H,'PATTERN READ=',0 ; MER12: DB 19,0DH,0AH,'BIT(S) IN ERROR=',0 ; ; ; ; ; MSG: PUSH PSW PUSH B MOV B,M INX H MSGA: MOV C,M CALL I H,TMSG ;OUTPUT "TESTING MEMORY " TO CONSOLE CALL MSG LXI H,FMSG ;OUTPUT ", FROM " TO CONSOLE CALL MSG LHLD BLKST ;GET THE MEMORY BLOCK STARTING ADDRESS CALL HLOUT LXI H,TOMSG ;OUTPUT " TO " TO CONSOLE CALL MSG LHLD MEND ;GET THE MEMORY ENEST PUSH PSW ;SAVE THE PATTERN CALL BAKPT ;WRITE IT LXI B,500*5 ;DO 5 MINUTE DELAY "DO NOTHING" CALL LOOP1 POP PSW ;GET PATTERN CALL SATRD ;CHECK DATA AFTER 5 MINUTE DELAY RET ; ; ; ;ROUTINE TO DO "GALLOPING" MEMORY TEST IN 256 BYTE CHUNK ;GET A BYTE FROM MEMORY CMP B ;GOT A MATCH? CNZ SATER ;INDICATE "WRITE SATURATION" ERROR IF NO MATCH INX H ;BUMP POINTER FOR NEXT BYTE JMP FSTRD ;DO FAST READ ON MORE MEMORY ; ; ; SAT: PUSH PSW ;EXILE THE A REG. CALL KBINT ;CHECK KEY-BOARD II H,SATSG ;OUTPUT "WRITE SATURATION TEST" TO CONSOLE CALL MSG LHLD BLKST ;GET MEMORY BLOCK STARTING ADDRESS SHLD MBOT ;SAVE AS MEMORY BOTTOM ADDRESS LHLD MEND ;GET MEMORY BLOCK END ADDRESS SHLD MTOP ;SAVE A MEMORY "TOP" ADDRESS MVI B,100 ;SET-U CALL MSG LDA ERPAT ;GET ERROR PATTERN CALL BYTEO ;SHOW IT LXI H,MRER3 ;OUTPUT " , EXPECTED " TO CONSOLE JMP SATX ;DISPLAY EXPECTED DATA PATTERN AND EXIT ; ; ; ;ROUTINE TO DO STATIC CHECK CYCLE TEST IN "SELECT MODE" ; STATT: MVI A,0FFH ;ALL RN MVI B,100 ;NOW DO COMPLEMENT 100 TIMES CALL SAT ;....AND WE'RE OFF CMA ;WRITE WITH COMPLEMENT,1 PASS CALL BAKPT CALL SATRD ;READ THE DATA RET ; ; ; ;SUBROUTINE TO READ 1 PASS "BACKGROUND" PATTERN AS CONTAINED IN A REG. ; SATRD: LHLD MDING ADDRESS CALL HLOUT LXI H,PSMSG ;OUTPUT "PASS=" TO CONSOLE CALL MSG LHLD PCTR ;GET THE PASS COUNTER,AND UPDATE IT INX H SHLD PCTR CALL HLOUT LXI H,ERMSG ;OUTPUT ", ERRORS TOTAL=" TO CONSOLE CALL MSG LHLD ECTR ;GET THE ERROR COUNTER,DICATE ERROR IN WRITE SATURATION TEST ; SATER: STA ERPAT ;SAVE "BAD" BYTE MVI A,0FFH ;SET ERROR FLAG STA ERFLG PUSH H ;SAVE BAD BYTE ADDRESS LHLD ECTR ;UPDATE THE ERROR COUNTER INX H SHLD ECTR LDA ERCNT ;DONE DISPLAYING ALL ERRORS? DCR A NTERRUPT POP PSW ;BACK FROM EXILE PUSH B ;SAVE PASSES ON STACK CALL BAKPT ;WRITE THE "BACKGROUND" PATTERN POP B ;GET PASS COUNT DCR B ;DE-BUMP THE PASS COUNT JNZ SAT ;CONTINUE WRITING 'TILL 100 PASSES COMPLETED RET ; ; ; ;SUBROUTINE TO INP FOR 100 WRITE SATURATION PASSES XRA A ;SATURATE WITH 0'S FIRST CALL SAT ;WRITE WITH PATTERN,100 TIMES MVI A,0FFH ;FLIP PATTERN TO 1'S CALL BAKPT ;WRITE 1 TIME ONLY CALL SATRD ;DO SATURATION READ MVI B,100 ;AGAIN SET-UP 100 WRITE SATURATION PA1'S PATTERN FOR FIRST PORTION OF TEST PUSH PSW ;SAVE THE PATTERN CALL BAKPT ;WRITE IT LXI B,500*5 ;DO 5 MINUTE DELAY "DO NOTHING" CALL LOOP1 POP PSW ;GET PATTERN CALL SATRD ;READ AFTER DELAY TIME XRA A ;ALL 0'S PATTERN FOR SECOND PORTION OF TTOP ;GET MEMORY "TOP" ADDRESS XCHG ;SWAP H&L REGS. TO D&E REGS. LHLD MBOT ;TOP'S IN D&E REGS.,BOTTOM'S IN H&L REGS. MOV B,A ;SAVE PATTERN IN B REG. STA TPATT ;SAVE DATA PATTERN FOR POSSIBLE ERROR DISPLAY FSTRD: CALL COMP ;ALL DONE? RZ MOV A,MAND SHOW IT ALSO CALL HLOUT LXI H,WRTSAT ;SAVE "NEXT TEST" ADDRESS SHLD MTEST JMP RANPT ;GO DO RANDOM PATTERNS MEMORY TEST ; ; ; ;ROUTINE TO DO WRITE AMPLIFIER SATURATION TEST IN "AUTO MODE" ; WRTSAT: LXI SP,STACK ;SET THE STACK POINTER LX JZ PTX ;DON'T DISPLAY ANY MORE ERRORS,IF SO STA ERCNT LXI H,MRER1 ;OUTPUT " ERROR AT ADDRESS=" TO CONSOLE CALL MSG POP H ;GET BAD BYTE ADDRESS,BUT DON'T ; CHANGE THE STACK PUSH H CALL HLOUT LXI H,MRER2 ;OUTPUT " READ BACK " TO CONSOLE SATURATION TEST IN "SELECT MODE" ; WSATT: MVI B,100 ;SET-UP FOR 100 WRITE SATURATION PASSES CALL SAT ;WRITE WITH SELECTED PATTERN,100 TIMES CMA ;WRITE WITH COMPLEMENT,1 PASS CALL BAKPT CALL SATRD ;READ THE DATA LDA TPATT ;GET SAVED TEST PATTESSES MVI A,0FFH ;NOW SATURATE WITH 1'S CALL SAT ;WRITE WITH PATTERN,100 TIMES XRA A ;FLIP PATTERN TO 0'S CALL BAKPT ;WRITE 1 TIME ONLY CALL SATRD ;DO SATURATION READ JMP GAL ;GO DO "GALLOPING PATTERNS" MEMORY TEST ; ; ; ;ROUTINE TO DO WRITES ; (MEMORY DATA WILL BE FF HEX AND THEN 00 HEX) ; GAL: LXI H,PTSG ;OUTPUT "GALLOPING PATTERN MEMORY TEST" TO CONSOLE CALL MSG LHLD BLKST ;GET MEMORY BLOCK STARTING ADDRESS GAL1: SHLD MBOT ;SAVE AS "CHUNK" START INR H ;ADD 256 MVI L,000H ;CLEANM DATA BYTE INTO MEMORY POP H LXI H,0 ;SCRUB H&L REGS. DAD SP ;GET THE CURRENT TEST CELL ADDRESS MOV A,C ;GET LOW BYTE OF MEMORY TOP ADDRESS SUB L ;SUBTRACT LOW BYTE OF TEST CELL MOV A,B ;GET HIGH BYTE OF MEMORY TOP ADDRESS, ; AND SAVE CARR;ALL THE "CHUNKS" DONE IN THE BLOCK? JZ TEND ;IF ZERO,GO TO NEXT MEMORY BLOCK IN AUTO SEQUENCE XCHG ;NO? GET NEW "CHUNK" START ADDRESS JMP WALK1 ;GO TEST NEW "CHUNK" TEND: CALL CDROP ;SHOW ANY "DROPPED BLOCKS" LHLD AUTOR ;GET "AUTO1" RETURN AD LXI B,500 CALL LOOP1 ;DO ONE MINUTE DELAY FOR STATIC CHECK LXI H,CKMSG ;OUTPUT "CHECKING DATA RETENTION" TO CONSOLE CALL MSG LHLD MEND ;GET MEMORY BLOCK END XCHG ;SWAP TO D&E REGS. LHLD BLKST ;GET MEMORY BLOCK STARTING ADDRESS XRA A ;MAKE AND D&E REGS. RANST: MOV D,H MOV E,L SPHL ;STUFF H&L REGS. INTO SP REG. LXI H,1 ;MAKE A STARTING "SEED" FOR FIRST RANDOM PATTERN ; ; ; ;"STORR", STORES RANDOM NUMBERS THROUGHOUT THE MEMORY TEST AREA BY ;USING RANDOM NUMBERS,CAUSING MOST PATTERRITES 0'S,AND THEN WALKS 1'S) ; WALK: LXI H,WMSG ;OUTPUT "WALKING PATTERNS MEMORY TEST" TO CONSOLE CALL MSG LHLD BLKST ;GET MEMORY BLOCK STARTING ADDRESS WALK1: SHLD MBOT ;SAVE AS "CHUNK" STARTING ADDRESS INR H ;ADD 256 MVI L,000H ;SCRUB L REG. -UP L REG. SHLD MTOP ;SAVE AS "CHUNK" END +1 MVI A,0FFH ;ALL ONES BACK-GROUND PATTERN CALL GALPT ;TEST THE "CHUNK" WITH 1'S XRA A ;ALL ZEROS BACK-GROUND PATTERN CALL GALPT ;TEST THE "CHUNK" WITH 0'S LHLD MEND ;GET "CHUNK" AND MEMORY BLOCK END BOUNDRY ADDRESS LHLD MBOT ;GET OPERATOR SELECTED MEMORY "BOTTOM" ADDRESS JMP RANST ;GO TO RANDOM PATTERNS TEST START ; ; ; ;ROUTINE TO DO RANDOM PATTERNS MEMORY TEST IN "AUTO MODE" ; RANPT: LXI H,RDMSG ;OUTPUT "RANDOM PATTERNS MEMORY TEST" TO CODRESS PCHL ;GO FOR IT ; ; ; ;ROUTINE TO DO RANDOM MEMORY TEST IN "SELECT MODE" ; RNDSL: LHLD MTOP ;GET OPERATOR SELECTED MEMORY "TOP" ADDRESS MOV B,H ;SAVE IT IN B&C REGS. MOV C,L DCX B ;DE-BUMP B&C REGS. TO GET PROPER "TOP" ; MEMORY A 0'S BYTE FOR COMPARE LOOP3: CMP M ;TEST "GALLOPING PATTERN" RESULT BYTE CNZ RFERR ;IF IT DIDN'T SURVIVE,REPORT RETENTION ERROR INX H ;BUMP FOR NEXT TEST BYTE CALL COMP ;HAVE WE CHECKED THE WHOLE MEMORY BLOCK? JC LOOP3 ;IF NOT,DO IT LXI H,CN SENSITIVE AND ADDRESSING ;PROBLEMS TO BE CAUGHT.THE NUMBERS ARE STORED USING THE ;8080/8085 "PUSH" COMMAND WHICH STORES TWO ADJACENT BYTES IN THE ;FASTEST MANNER POSSIBLE. ; STORR: INX SP ;BUMP STACK POINTER BY 2'S INX SP PUSH H ;STUFF THE RANDO SHLD MTOP ;SAVE RESULT AS "CHUNK" END +1 MVI A,0FFH ;MAKE AN ALL 1'S PATTERN BYTE CALL WALKT ;LET'S GO FOR A WALK XRA A ;MAKE AN ALL 0'S PATTERN BYTE CALL WALKT ;MAYBE WE COULD JOG FOR AWHILE? LHLD MEND ;GET "CHUNK" AND BLOCK END CALL COMP CALL COMP ;HAVE WE DONE ALL 16 "CHUNKS" IN THE MEMORY BLOCK? JZ STATIC ;IF DONE,GO DO 1 MINUTE STATIC TEST XCHG ;OH...GO DO NEXT "CHUNK" IN SAME MEMORY BLOCK JMP GAL1 ; ; ; STATIC: LXI H,RFMSG ;OUTPUT "STATIC CHECK CYCLE" TO CONSOLE CALL MSG NSOLE CALL MSG RANMT: LHLD MEND ;GET MEMORY BLOCK END ADDRESS INTO B&C REGS. MOV B,H MOV C,L DCX B ;DE-BUMP B&C REGS. TO GET PROPER BLOCK END ; BOUNDRY ADDRESS DCX B DCX B LHLD BLKST ;GET MEMORY BLOCK START ADDRESS INTO H&L REGS., ; A,0FFH ;SET-UP ALL ONES PATTERN CALL GALCL ;DO "GALLOPING COLUMN" XRA A ;SET-UP ALL ZEROS PATTERN CALL GALCL ;TEST THE MEMORY BLOCK AGAIN ; ; ; ;ROUTINE TO WALK PATTERNS THRU THE MEMORY BLOCK IN 256 BYTE "CHUNKS", ; (WRITES 1'S,WALKS 0'S,THEN WLMSG ;OUTPUT "GALLOPING COLUMN MEMORY TEST" TO CONSOLE CALL MSG LHLD BLKST ;GET MEMORY BLOCK START SHLD MBOT ;SAVE IT FOR FUTURE USE IN "GALLOPING COLUMN" LHLD MEND ;GET MEMORY BLOCK END SHLD MTOP ;SAVE FOR FUTURE USE IN "GALLOPING COLUMN" MVI Y ONLY SBB H ;SUBTRACT HIGH BYTE OF TEST CELL ADDRESS JC DONE1 ;IF WE GOT THE CARRY,WERE DONE DCX SP ;NO,NOT DONE YET DCX SP POP H MOV A,L ;MAKE MORE "HASH" FOR MEMORY PATTERNS ADD A MOV L,A MOV A,H RAL MOV H,A MVI A,0 ADC L : LHLD ECTR ;UPDATE THE ERROR COUNTER INX H SHLD ECTR LHLD MTEST ;RETURN PCHL ; ; ; OUTER: IN CCTRL ANI CTRDY JZ OUTER MOV A,D RLC RLC RLC RLC ANI 0FH CPI 0AH JC OUTR1 ADI 7 OUTR1: ADI '0' OUT CDATA OUTR2: IN CCTRL ANTIL A ZERO BYTE IS FOUND. ; MSGOUT: LDAX B ANA A JNZ AR1 ;CHECKS FOR '0' END OF MESSAGE FLAG PCHL AR1: IN CCTRL ANI CTRDY JZ AR1 ;CHECK IF CONSOLE READY LDAX B OUT CDATA INX B ;OUTPUT CHARACTER JMP MSGOUT ; ; ; ;THE "ERROR" ROUTINLL THE SAME AS WHEN IT WAS STORED. ; CHKR: MOV A,M RAL DCX H MOV A,M RAL MOV M,A INX H MOV A,M RAL MOV M,A INX H MOV A,C SUB L MOV A,B SBB H JC DONE2 DCX H MOV A,M RLC RLC RLC DCX H XRA M RRC RRC ANI 1 EAD=" TO CONSOLE LXI H,ER6 JMP MSGOUT ; ER6: LXI H,0 DAD SP MOV E,D MOV D,M LXI H,ER7 JMP OUTER ; ER7: LXI B,MER12 ;OUTPUT "BITS IN ERROR=" TO CONSOLE LXI H,ER8 JMP MSGOUT ; ER8: MVI D,0 MVI B,1 LXI H,0 DAD SP MOV A,E XRA D&E REGISTERS ; CHKAL: MOV A,D MOV D,E MOV E,A CMP M JNZ ERROR INX H MOV A,C SUB L MOV A,B SBB H JNZ CHKAL ; ; ; ;THIS ROUTINE FINDS OUT WHICH PASS THE TEST IS ON, ;AND THEN SETS UP TO DO THE NEXT TEST ; LXI H,0 DAD SP LXIMOV L,A MOV A,H RLC RLC RLC XRA L RRC RRC ANI 1 XRA L MOV L,A JMP STORR ; ; ; ;"DONE1" CHECKS THE FIRST TWO BYTES FOR ERRORS AND ALSO CHECKS ;TO SEE WHICH PASS-THROUGH THE PROGRAM IS ON. ; DONE1: MOV L,E MOV H,D MVI A,1 CDISAGREEMENT IN THE TWO BYTES. ; ERROR: SPHL MVI A,0FFH ;SET ERROR FLAG STA ERFLG LDA ERCNT ;DONE SHOWING 8 ERRORS? DCR A JZ ER9 STA ERCNT LXI H,ER1 MOV D,A LXI B,MRER1 ;OUTPUT "ERROR AT ADDRESS=" TO CONSOLE JMP MSGOUT ; ER1: LXI H,E PRINTS OUT THAT THERE HAS BEEN AN ERROR AT ;THE ADDRESS IN THE H&L REGISTERS.IT THEN TELLS THAT THE TEST ;BYTE IS THE BYTE IN THE ACCUMULATOR AND THE ERROR BYTE IS THE ;BYTE POINTED TO BY THE H&L REGISTERS.FINALLY IT PRINTS OUT THE ;BITS THAT ARE IN XRA M INX H INX H CMP M JNZ ERROR INX H MOV A,C SUB L MOV A,B SBB H JC DONE2 DCX H DCX H MOV A,M INX H INX H CMP M JNZ ERROR JMP CHKR ; ; ; ;"DONE2" CHECKS TO SEE WHICH TEST HAS JUST BEEN DONE. IF IT WAS ;THE FIRSTM MOV E,A ; LOP: INR D MOV A,E RAR MOV E,A JNC NOERR ; DCR B JZ LOPE LUPE: IN CCTRL ANI CTRDY JZ LUPE MVI A,',' OUT CDATA LOPE: IN CCTRL ANI CTRDY JZ LOPE MOV A,D ADI 2FH OUT CDATA NOERR: MOV A,D CPI 8 JNZ LOP ER9 D,055AAH MOV A,M CPI 0AAH JZ STOAL LXI D,0FFFFH CPI 055H JZ STOAL LXI D,0 INR A JZ STOAL LHLD MTEST ;GO DO NEXT MEMORY TEST,WERE DONE HERE PCHL ; ; ; ;THIS ROUTINE PRINTS OUT WHAT IS POINTED TO IN MEMORY BY ;THE B&C REGISTERS UMP M JNZ CHECK DCR A INX H CMP M JNZ ERROR JMP CHKR ; ; ; CHECK: MVI A,0FEH CMP M MVI A,1 JNZ ERROR DCR A DCR A INX H CMP M JNZ ERROR ; ; ; ;"CHKR" GOES BACK AND CHECKS TO SEE IF WHAT IS STORED ;THROUGHOUT MEMORY,IS STI0 DAD SP MOV B,D XCHG LXI H,ER2 JMP OUTER ; ER2: MOV D,E LXI H,ER3 JMP OUTER ; ER3: MOV D,B LXI B,MER10 ;OUTPUT "PATTERN STORED=" TO CONSOLE LXI H,ER4 JMP MSGOUT ; ER4: LXI H,ER5 JMP OUTER ; ER5: LXI B,MER11 ;OUTPUT "PATTERN RGISTERS (AA HEX AND 55 HEX) ;THROUGHOUT THE TEST AREA ; STOAL: MOV M,D INX H MOV M,E INX H MOV A,C SUB L MOV A,B SBB H JNZ STOAL LXI H,0 DAD SP ; ; ; ;"CHKAL" TEST TO SEE IF THE DATA STORED THROUGHOUT MEMORY IS THE ;SAME AS THE TEST THEN IT SETS UP TO TEST THE COMPLIMENT, ELSE IT ;SETS UP FOR THE FINAL FOUR TESTS ; DONE2: MOV L,E MOV H,D SPHL LXI H,0FFFEH LDAX D CPI 2 JZ STORR MOV L,E MOV H,D LXI D,0AA55H ; ; ; ;"STOAL" STORES THE TWO BYTES IN THE D&E RENI CTRDY JZ OUTR2 MOV A,D ANI 0FH CPI 0AH JC OUTR3 ADI 7 OUTR3: ADI '0' OUT CDATA PCHL ; ; ; ; ; ; ;ROUTINE TO SHOW THE "DROP LIST" TO THE OPERATOR ; CDROP: LDA DROPC ;GET THE DROP COUNT ORA A ;DID WE LOSE ANYBODY? JNZ PDROP UMNS TEST" JMP WALKT ;GO DO "WALKING PATTERNS TEST" JMP RNDSL ;GO DO "RANDOM PATTERNS TEST" JMP WSATT ;GO DO "WRITE SATURATION TEST" JMP STATT ;GO DO "STATIC CHECK CYCLE TEST" RET ;THIS SHOULD'NT GET USED ; ; ; ;SUBROUTINE TO INDICATE RETD SAVE IT SHLD MTOP SEL1: LXI H,OPMSG ;OUTPUT "TEST OPTIONS ARE:" TO CONSOLE CALL MSG LXI H,TMSG1 ;OUTPUT " 01-GALLOPING PATTERNS TEST" TO CONSOLE CALL MSG LXI H,TMSG2 ;OUTPUT " 02-GALLOPING COLUMNS TEST" TO CONSOLE CALL MSG LXI H,TMSG3 ;OUTBUMP IT JNZ EDROP ;DO THEM ALL RET ; ; ; ;"SELECT" MODE ROUTINE (OPERATOR DEFINES ADDRESS RANGE,PATTERN,AND TEST) ; SELCT: MVI A,0FFH ;SET ERROR DISPLAY COUNT TO 256 STA ERCNT LXI H,SELCT ;MAKE A RETURN ADDRESS FOR END OF TEST SHLD MTEST SG ;OUTPUT " TEST IS IN PROGRESS" TO CONSOLE CALL MSG POP B ;FROM WHENCE THY CAME... LXI D,SELCT ;GO BACK TO "SELECT MODE" AFTER TEST COMPLETION PUSH D DCR B ;ADJUST THE TEST NUMBER FOR THE TABLE JUMP MOV A,B RLC ADD B MOV E,A MVI D,00LXI H,HMMSG ;OUTPUT "HIGH MEMORY ADDRESS=" TO CONSOLE CALL MSG CALL PARAM ;GET IT FROM OPERATOR XCHG ;SWAP TO D&E REGS. MOV A,D ;GET THE HIGH BYTE OF "TOP" MEMORY ADDRESS LHLD MBOT ;GET MEMORY "BOTTOM" ADDRESS CMP H ;IS THE TOP < BOTTOM? JNC LXI H,NDMSG ;OUTPUT "NO MEMORY BLOCKS DROPPED" TO CONSOLE CALL MSG RET PDROP: LXI H,DROP ;POINT TO START OF THE DROP LIST EDROP: PUSH PSW ;SAVE THE DROP COUNT PUSH H ;SAVE THE DROP POINTER LXI H,DMMSG ;OUTPUT "DROPPED MEMORY BLOCK(S)=" TO CONSOOLE CALL MSG LXI H,TMSGN ;OUTPUT " ENTER TEST NUMBER(01,02,03,04,05 OR 06)=" CALL MSG CALL CONI ;GET THE ANSWER CPI 000H ;HMMMM....DID HE PICK 00 HEX? JZ SEL1 ;IF SO,START HIM ALL OVER AGAIN CPI 007H ;TEST NUMBER SELECTED >6? JNC SEL1 ;IFPUT " 03-WALKING PATTERNS TEST" TO CONSOLE CALL MSG LXI H,TMSG4 ;OUTPUT " 04-RANDOM PATTERNS TEST" TO CONSOLE CALL MSG LXI H,TMSG5 ;OUTPUT " 05-WRITE SATURATION TEST" TO CONSOLE CALL MSG LXI H,TMSG6 ;OUTPUT " 06-STATIC CHECK CYCLE TEST" TO CONS MENU: LXI H,DFMSG ;OUTPUT "TEST "ALL","SELECT",OR "MONITOR" (Y OR N)?" ; TO CONSOLE CALL MSG CALL CECHO ;GET THE ANSWER CPI 'A' ;"ALL" CHOSEN? JZ ALL CPI 'S' ;"SELECT" CHOSEN? JZ SEL CPI 'M' ;"MONITOR" CHOSEN? JZ MNTR JMP MENU ;OOPS.0H ;MAKE A 16 BIT INDEX LXI H,BTAB ;GET THE TABLE BASE MOV A,C ;GET BACK THE SAVED PATTERN DAD D ;GET H&L REGS. TO EQUAL THE ADRESS OF THE JUMP PCHL ;GO FOR IT BTAB: JMP GALPT ;GO DO "GALLOPING PATTERNS TEST" JMP GALCL ;GO DO "GALLOPING COL STOTOP ;IF NOT,STORE THE "TOP" FOR SAFE KEEPING LXI H,NAMSG ;ARE YOU POSSIBLY ATTEMPTING TO TRY MY PATIENCE? CALL MSG JMP SELCT ;TRY AGAIN,AND AGAIN,AND AGAIN,AND....... STOTOP: XCHG ;GET THE "TOP" BACK TO H&L REGS. INX H ;GO ONE PAST THE END,ANLE CALL MSG POP H ;GET THE DROP POINTER BACK MOV E,M INX H MOV D,M INX H ;WERE NOW POINTING TO THE NEXT DROP LIST SLOT XCHG ;GET THE ADDRESS OF THE DROPPED MEMORY BLOCK CALL HLOUT XCHG ;SWAP'EM POP PSW ;GET THE DROP COUNT DCR A ;DE- YES,GIVE THE JERK ANOTHER CHANCE MOV B,A ;SAVE THE TEST NUMBER IN B REG. LXI H,EPMSG ;OUTPUT "ENTER PATTERN(00-FF)=" TO CONSOLE CALL MSG CALL CONI ;GET THE REQUESTED PATTERN MOV C,A ;SAVE IT IN C REG. PUSH B ;EXILE THE TEST NUMBER LXI H,TPMTOR MOV A,H ;IS THE REQUESTED ADDRESS <1000 HEX? CPI 010H JNC SEL0 LXI H,NAMSG ;OOPS...NOT ALLOWED,OUTPUT "INVALID ; MEMORY ADDRESS" TO CONSOLE CALL MSG JMP SEL ;GIVE'M ANOTHER CHANCE SEL0: SHLD MBOT ;SAVE IT AS MEMORY "BOTTOM" ADDRESS ..NONE OF THE ABOVE,TRY AGAIN ALL: LXI H,01000H ;SET MEMORY "BOTTOM" SHLD MBOT LXI H,0C000H ;SET MEMORY "TOP" SHLD MTOP JMP SEL1 ;TEST "ALL"..... SEL: LXI H,LMMSG ;OUTPUT "LOW MEMORY ADDRESS=" TO CONSOLE CALL MSG CALL PARAM ;GET IT FROM OPERAENTION ERROR (GALLOPING PATTERN BAD AFTER 1 MINUTE) ; RFERR: CMA ;MAKE ERROR FLAG NON-ZERO STA ERFLG CMA PUSH H ;SAVE ERROR BYTE ADDRESS LHLD ECTR ;UPDATE THE ERROR COUNTER INX H SHLD ECTR LDA ERCNT ;DONE DISPLAYING ALL ERRORS? DCR A J YES,SKIP TESTING MOV A,M ;GET THE OTHER CELL STA TPATT ;SAVE IT JUST IN CASE IT'S WRONG CMP B ;EQUAL TO PATTERN? LDAX D ;READ BACK THE TEST CELL CNZ ERR1 ;OOPS....REPORT THE ERROR CMA ;BACK TO ORIGINAL STATE......... STA TPATT ;SAVE IRORS? DCR A JZ COMEX STA ERCNT LXI H,MRER7 ;OUTPUT "ERROR READING TEST CELL" TO CONSOLE CALL MSG POP H COMER: PUSH H ;PROTECT THE INNOCENT PUSH D PUSH B PUSH PSW PUSH H LHLD ECTR ;UPDATE THE ERROR COUNTER INX H SHLD ECTR LXI HUTINE TO INDICATE ERROR IN WALKING PATTERN ; PTERR: PUSH H ;SAVE BAD BYTE ADDRESS LHLD ECTR ;UPDATE THE ERROR COUNTER INX H SHLD ECTR LDA ERCNT ;DONE DISPLAYING ERRORS? DCR A JZ PTX STA ERCNT LXI H,MRER1 ;OUTPUT " ERROR AT ADDRESS=" TO CONES FOR MEMORY TEST ; GALPT: MOV B,A ;SAVE THE PATTERN CALL BAKPT ;WRITE THE "BACKGROUND" PATTERN GALST: LHLD MBOT ;GET THE TEST CELL ADDRESS XCHG ;SWAP FOR MEMORY TOP INTO H&L REGS. PNCEL: PUSH D ;SAVE TEST CELL ADDRESS LHLD MBOT ;GET ADDRESS OX: POP H ;RESTORE THE "BAD" ADDRESS RET ;CONTINUE TESTING ; ; ; ;SUBROUTINE TO HANDLE ERRORS IN "GALLOPING PATTERN/COLUMN TESTS ; ERR1: PUSH H LHLD ECTR ;UPDATE THE ERROR COUNTER INX H SHLD ECTR LDA ERCNT ;DONE DISPLAYING ERRORS? DCR A Z RFX STA ERCNT LXI H,REMSG ;OUTPUT " RETENTION ERROR AT ADDRESS=" CALL MSG POP H ;GET THE ERROR BYTE ADDRESS CALL HLOUT PUSH H ;SAVE ERROR BYTE ADDRESS FOR EXIT CALL MSG LXI H,EXMSG ;OUTPUT "EXPECTED "00" DATA,READ BACK " TO CONSOLE CALLLL MSG POP H ;BLOW-AWAY H&L REGS. TO ADJUST THE STACK MOV A,B CALL BYTEO ;SHOW IT LXI H,MER11 ;OUTPUT "PATTERN READ=" TO CONSOLE CALL MSG LDA TPATT CALL BYTEO ;SHOW IT ALSO CALL CRLF ;KEEP IT NEAT MVI A,0FFH ;SET THE ERROR FLAG STA E,MRER8 ;OUTPUT "TEST CELL=" TO CONSOLE CALL MSG POP H PUSH H XCHG CALL HLOUT XCHG POP H PUSH H LXI H,MRER9 ;OUTPUT ", OTHER CELL=" TO CONSOLE CALL MSG POP H CALL HLOUT PUSH H LXI H,MER10 ;OUTPUT "PATTERN STORED=" TO CONSOLE CANSOLE CALL MSG POP H ;GET THE BAD BYTE ADDRESS ,BUT DON'T ;CHANGE THE STACK PUSH H CALL HLOUT LXI H,MRER2 ;OUTPUT " READ BACK " TO CONSOLE CALL MSG POP H ;GET THAT ADDRESS AGAIN PUSH H MOV A,M ;GET THE ERROR BYTE CALL BYTEO ;SHOWF OTHER CELL LDAX D ;GET CONTENTS OF TEST CELL CMA ;FLIP IT OVER STAX D ;STORE IT BACK GPLOP: CALL KBINT ;CHECK KEY-BOARD INTERRUPT POP D ;GET BACK ADDRESS OF TEST CELL PUSH D CALL COMP ;SEE IF TEST ADDRESS EQUALS OTHER ADDRESS JZ SKIP ;IF JZ COMEX STA ERCNT LXI H,MRER6 ;OUTPUT "ERROR READING OTHER CELL" TO CONSOLE CALL MSG POP H JMP COMER ;GO TO COMMON ERROR PROCESSING ; ; ; ERR2: PUSH H LHLD ECTR ;UPDATE THE ERROR COUNTER INX H SHLD ECTR LDA ERCNT ;DONE DISPLAYING ER MSG POP H ;RESTORE POINTER TO BAD BYTE ADDRESS, ; BUT DON'T CHANGE THE STACK PUSH H MOV A,M ;GET THE BAD BYTE CALL BYTEO ;SHOW IT CALL CRLF RFX: POP H ;GET THE ERROR ADDRESS BACK FOR EXIT RET ;EXIT,AND CONTINUE TESTING ; ; ; ;SUBRORFLG POP PSW ;EVERYBODY BACK FROM EXILE POP B POP D COMEX: POP H RET ; ; ; LOOP1: CALL KBINT ;CHECK FOR KEY-BOARD INTERRUPT LXI D,10000 LOOP2: DCX D MOV A,D ORA E JNZ LOOP2 DCX B MOV A,B ORA C JNZ LOOP1 RET ; ; ; ;ROUTI LXI H,MRER5 ;OUTPUT " PATTERN WAS " TO CONSOLE SATX: CALL MSG LDA TPATT ;GET THE TEST PATTERN AND OUTPUT IT TO CONSOLE CALL BYTEO CALL CRLF ;KEEP IT NEAT MVI A,0FFH ;SET THE ERROR FLAG STA ERFLG CALL KBINT ;CHECK FOR KEY-BOARD INTERRUPT PT IT LXI H,MRER3 ;OUTPUT " , EXPECTED " TO CONSOLE CALL MSG LDA ERPAT ;GET THE "GOOD" DATA BYTE CALL BYTEO ;SHOW IT ALSO LXI H,MRER4 ;OUTPUT "LAST ADDRESS WRITTEN WAS" TO CONSOLE CALL MSG LHLD LASTW ;GET THE LAST ADDRESS WRITTEN CALL HLOUTT CMP B ;STILL EQUAL TO PATTERN? CNZ ERR2 ;OOPS....WRONG HERE ALSO SKIP: INX H ;BUMP THE OTHER ADDRESS XCHG ;MEMORY TO D&E REGS. LHLD MTOP XCHG CALL COMP ;AT TOP OF MEMORY BLOCK? JNZ GPLOP ;IF NOT,CONTINUE "GALLOPING PATTERN" LOOP POP ;STORAGE FOR VARIABLES AND STACK POINTERS ; DS 16 ;16 BYTE STACK POINTER STORAGE AREA STACK: DS 000H ERPAT: DS 1 ;STORAGE FOR ERROR PATTERN ERFLG: DS 1 ;STORAGE FOR BLOCK ERROR FLAG DROPC: DS 1 ;STORAGE FOR NUMBER OF "DROPPED" BLOCKS DROP: DS 28 ;DZ PTERR ;IF BAD BYTE,REPORT ERROR INX H ;BUMP THE POINTER JMP CPAT1 ;GO FOR MORE WKSET: XCHG ;SET-UP FOR NEXT SECTION,H&L REGS. EQUAL ; LAST ADDRESS IN BLOCK+1 POP D ;D&E REGS. EQUAL "LAST WRITTEN" ADDRESS XTHL ;H&L REGS. EQUAL FIRST ADDRES4 ;GOLLY,A DECIMAL NUMBER MVI D,000H ;SCRUB D REG. DAD D XCHG ;NOW D&E REGS. EQUAL H&L REGS.+64 LHLD MTOP CALL COMP XCHG JM CINCR ;BUMP THE TEST CELL ADDRESS IF < MEMORY TOP ADDRESS JZ CINCR POP D ;GET AND SAVE THE TEST CELL PUSH D COMP ;WE DONE? RZ MOV M,A ;STORE THE BACKGROUND PATTERN INX H ;BUMP FOR NEXT ADDRESS JMP BAKGR ;GO DO MORE 'TILL WE HIT TOP ; ; ; ;SUBROUTINE TO INCREMENT H&L REGS. MODULO 64 ; INC64: INX H ;TEST FOR WRAP-AROUND MOV A,L ANI 63 RNZ MOFOR INSTANT RESET CMA ;FLIP BACKGROUND PATTERN FOR TEST PATTERN STA TPATT ;SAVE IT WPAT: CALL KBINT ;CHECK FOR KEY-BOARD INTERRUPT LDA TPATT ;GET THE TEST PATTERN MOV M,A ;STUFF PATTERN INTO MEMORY PUSH H ;SAVE "LAST WRITTEN" ADDRESS SHLD LAD ;WHOOPIE...TOP OF MEMORY BLOCK,GET BACK TEST ADDRESS LDAX D ;GET THE TEST CELL CMA ;BACK TO ORIGINAL,AND SAVE IT STAX D INX D ;BUMP FOR NEXT TEST ADDRESS CALL COMP ;TOP OF BLOCK YET? JNZ PNCEL ;IF NOT,GET THE NEXT CELL FOR TEST RET ; ; FOR MORE IF NOT DONE YET POP H ;SET-UP FOR NEXT PATTERN BYTE,H&L REGS. EQUAL ; "LAST WRITTEN" ADDRESS POP D ;D&E REGS. EQUAL LAST ADDRESS IN BLOCK+1 INX H ;BUMP FOR NEXT ADDRESS TO WRITE CALL COMP ;DONE THE WHOLE THING? RZ PUSH H ;NO,PUT S IN BLOCK PUSH D ;JAM-ON "LAST WRITTEN" TO STACK CMA ;GET TEST PATTERN BACK CPAT2: CMP M ;TEST PATTERN BYTES FROM START OF BLOCK, ; TO "LAST WRITTEN" CNZ PTERR ;ERROR IN "WALKED" BYTE? CALL COMP ;NO,THEN ARE WE DONE? INX H JNZ CPAT2 ;GO LDAX D CMA ;FLIP IT STA TPATT ;SAVE IT IN CASE IT'S WRONG CMP B ;EQUAL TO,PATTERN? CNZ ERR1 ;IF NOT,REPORT ERROR MOV A,M ;TEST OTHER CELL STA TPATT ;SAVE IT CMP B ;EQUAL TO PATTERN? CNZ ERR2 ;IF NOT,REPORT ERROR JMP CLOOP ;TRY NEXT OV A,L SUI 64 MOV L,A RNC DCR H ;BORROW IF NEEDED RET ; ; ; ;SUBROUTINE TO COMPARE H&L REGS. TO D&E REGS. FOR BLOCK COMPLETION ; COMP: PUSH B MOV B,A MOV A,H SUB D JNZ COMP1 MOV A,L SUB E COMP1: MOV A,B POP B RET ; ; ; STW INX H CMA ;FLIP TO BACKGROUND PATTERN CPAT1: CALL COMP ;TEST BACKGROUND PATTERN FROM "LAST WRITTEN+1", ; TO "END OF BLOCK" ;TESTED ALL REMAINING BACKGROUND? JZ WKSET ;IF YES,GO TEST PATTERN BYTES CMP M ;NO...TEST BACKGROUND BYTE CN ; GALCL: MOV B,A ;SAVE THE PATTERN CALL BAKPT ;WRITE BACKGROUND LHLD MBOT CNCEL: PUSH H ;SAVE TEST CELL ADDRESS MOV A,M ;GET CONTENTS OF TEST CELL CMA ;FLIP IT MOV M,A ;CRAM IT BACK CLOOP: CALL KBINT ;CHECK FOR KEY-BOARD INTERRUPT MVI E,6A COPY OF MEMORY BOTTOM ON THE STACK LHLD MBOT XTHL JMP WPAT ;GO DO SOME MORE ; ; ; ;SUBROUTINE TO GENERATE BACKGROUND PATTERN AS CONTAINED IN A REG. ; BAKPT: LHLD MTOP XCHG LHLD MBOT ;TOP'S IN D&E REGS.,BOTTOM'S IN H&L REGS. BAKGR: CALL INC64 MOV A,M STA TPATT CMP B CNZ ERR1 CALL INC64 ANI 63 RZ ;RETURN IF WRAPPED AROUND TO START ADDRESS JMP CNCEL ; ; ; WALKT: CALL BAKPT ;WRITE FULL BACKGROUND PATTERN LHLD MBOT ;POINT TO FIRST BYTE OF BLOCK ADDRESS PUSH H ;SAVE THER CELL CINCR: POP H ;GET TEST CELL ADDRESS MOV A,M ;GET CONTENTS CMA ;FLIP BACK TO ORIGINAL MOV M,A ;RESAVE CALL INC64 ;BUMP TEST ADDRESS MODULO 64 MOV A,M ;EQUAL TO PATTERN? STA TPATT ;SAVE IT IN CASE IT'S WRONG CMP B CNZ ERR1 CALLROP BUFFER DROPP: DS 2 ;POINTER TO NEXT FREE SLOT IN DROP LIST MBUF: DS 15 ;MEMORY BLOCK BUFFER DB 080H ;TERMINATOR FOR MEMORY BLOCK BUFFER POINTER MEMPT: DS 2 ;STORAGE FOR MEMORY BUFFER POINTER BLKST: DS 2 ;STORAGE FOR MEMORY BLOCK START ADDRESS MEng of various languages (BASIC, FORTRAN, COBOL, PASCAL/UCSD, PASCAL/M, PASCAL/MT, PASCAL/Z, "C", etc.). 5.0 A program "forwarding" network for "mass dissemination" of software. 6.0 An "on going" dialogue of "here's hoector, 8 sectors per track) format ("2D Extended" is hardware dependent on DMA transfer capability). This code was initially written by me about 3 years ago, when I first got into codeing for the 8080, and is therefor a bit "amateurishееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееages with "CP/M-NET (tm)", for the purpose of public access (via modem) dissemination of CP/M compatble public domain software. Benefits to be derived to the "programming public at large" are: 1.0 Free access to "professional quality" softwaay easily be modified by changing the console equates as required by you console I/O. In addition, the 3712DIAG.ASM file is compatible for testing the older Icom "Frugal Floppy" system. Primary differences between the FD3712 anND: DS 2 ;STORAGE FOR MEMORY BLOCK END ADDRESS MBOT: DS 2 ;STORAGE FOR 256 "CHUNK" START ADDRESS MTOP: DS 2 ;STORAGE FOR 256 "CHUNK" END ADDRESS TPATT: DS 1 ;STORAGE FOR LAST PATTERN WRITTEN LASTW: DS 2 ;STORAGE FOR LAST ADDRESS WRITTEN MTEST: DS 2 ;S 3055 Waco Avenue Simi Valley, California (805) 527-9321 (Modem, CP/M-NET) (805) 527-0518 (Verbal) " in some areas...that "INIT" routine with all the "STA's" for example! But in any case, the code does work quite well for a first effort on my part... Kelly Smith, Microcosm Associates Microcosm Associates Disk Diagnostic for the Icom FD3712 Single Density Disk Controller and the Icom FD3812 Double Density Disk Controller Donated to the "SIG/M" re for the price of a telephone call. 2.0 A "try before you buy" access of "commercial software" 3.0 Software "critique's" of "commercial software" 4.0 "language access" availability as a tutorial aid to a better understandid FD3812 diagnostics are in "density select" options and diskette formating capabilities of the 3812DIAG.ASM file, which supports the IBM single density/single sided format, "1D" format, "2D" format, and "2D Extended (1024 bytes per sTORAGE FOR MEMORY TEST POINTER AUTOR: DS 2 ;STORAGE FOR "AUTO1" RETURN ADDRESS FOR LOOPING PCTR: DS 2 ;STORAGE FOR "PASS" COUNTER ECTR: DS 2 ;STORAGE FOR "ERROR" COUNTER ERCNT: DS 1 ;STORAGE FOR ERROR DISPLAY COUNTER ; ; ; END  To Bruce Ratoff, Tom Churbuck, Keith Petersen Proposal For A Collaborate National CP/M User's Group June 26, 1980 I would like to propose a merging of the "SIG/M" CP/M User's Group now in it's formative st" of test options at the first execution of either program. These programs were originaly written for the MITS Altair 8800b Computer, and therefor utilize the MITS console port address's of 10 and 11 hexadecimal. These address's mCP/M User's Group by Kelly Smith This is an extensive "production test/diagnostic" for the Pertec/Icom Single and Double Density Disk Controller. The files 3712DIAG.ASM and 3812DIAG.ASM are "self documenting", with a "menu displayw to do it" documentation, for implementation of software (e.g., how to get MP/M running on your system...,etc.). Believe me, alot of people out there are "baffled" at how to write a BIOS, or how to change I/O for variCONTAINING THE SOURCE, ASSEMBLY/COMPILATION/LINKAGE COMMAND FILES, OBJECT CODE, AND ANY OTHER MACHINE READABLE DOCUMENTATION. PLEASE USE THE FOLLOWING FILE EXTENSIONS: .ASM .SOURCE FILE OR .BAS, .Z80, .FORееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееthe utilization of computers. I would be more than willing to be the "West Coast" affiliate system, and help in all details of this proposed project. Additionally, we might publish a quarterly "news letter", requiring possibly a $12 pe......... STATE .......... ZIP ....... PHONE ..................... CLUB AFFILIATION ................... NAME OF PROGRAM, PROCEDURE, OR MODULE (CIRCLE ONE) SOURCE LANGUAGE ................ HARDWARE REQUIRED ............his some thought as what we "collectively" might do...leave any correspondence on this matter on my system or Tom Churbuck's system as an "open forum". Best Regards, Kelly Smith, CP/M-NEous systems, etc.! These are just a view of my thoughts that have come to mind on this issue, and I am sure that you could add quite a bit to this... The time and ability is certainly "at hand", by evidence of Keith Petersen's systeееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееr year membership fee to cover expenses of system operation and maintenance. Of primary interest to me, is to make public domain software PUBLIC! Not under the control of profit making organization such as ЉLifeboat (read Tony Go. MEMORY REQUIRED .......... ............................... DESCRIPTION OF WHAT IT DOES: HOW TO USE IT: PLEASE ATTACH ALL RELEVANT DOCUMENTATION AND A DISKETTE T (tm) 3055 Waco Avenue Simi Valley, California, 93065 (805) 527-9321 (300 Baud Modem) (805) 527-0518 (Verbal) m, Tom Churbuck's System, the Valley Computer Club system, my system, and other's...If we could standardize access methods, utility formats, etc., as "affiliate systems", we could offer quite a bit to the public "education" of CONTRIBUTION FORM FOR SIG/M LIBRARY NAME ..................................... DATE...../...../..... ADDRESS ......................................................... CITY .....................ct that if "SIG/M" really gets "rolling", you will have your hands full with the logistics of distributing "physical diskettes" to the public...my proposal would certainly take care of any problems in that ar