TITLE 'CP/M-86 BOOT CODE FOR Z207 21 APR 83' ;*** ; ; CP/M-86 BOOT CODE FOR Z207 ; ; ; RESTRICTED RIGHTS LEGEND ; ------------------------ ; ; "Use, duplication, or disclosure by the ; government is subject to restrictions as set forth ; in paragraph (b) (3) (B) of the Rights in Technical ; Data and Computer Software clause in DAR ; 7-104.9(a). Contractor/manufacturer is Zenith ; Data Systems Corporation of Hilltop Road, St. ; Joseph, Michigan 49085. ; FALSE EQU 0 TRUE EQU NOT FALSE WAIT EQU TRUE ;DISK I/O WITH WAIT STATES DSEG INCLUDE ZMEMMAP.LIB INCLUDE ZMTR100.LIB INCLUDE Z207DEF.LIB INCLUDE ZDPEDEF.LIB INCLUDE ZPORTS.LIB CSEG ORG BOOTORG ; ; UPON ENTRY FROM THE MONITOR ROM IT IS ASSUMED ; 1) THE Z207 MOTOR IS ON ; 2) THE HEAD IS OVER TRACK 0 ; CLDR: JMP CLDR0 ;JUMP AROUND FLAGS L_1 EQU $ DSEG ORG Offset L_1-1 PSPT RB 1 DB DPEZ207 ;DRIVE TYPE ; ; VALUES SET BY 'SYSGEN'. ; RB 1 ;LABEL FORM # HEATH RS DPEHL ;HEATH EXTENSIONS DPB RS DPBL ;DISK PARAMETER BLOCK RB 1 ;CHECKSUM COUNT EQU HEATH+OFFSET DPETRK-OFFSET DPEHTH L_2 EQU $ CSEG ORG OFFSET L_2 ; ; SET SEGMENT REGS. ; CLDR0: CLI MOV AX,CS MOV DS,AX MOV ES,AX MOV SS,AX ;SET STACK AREA MOV SP,BOOTORG+BCODEL+256 ; ; SET VALUES FOR LOAD BASED ON FLAGS SET BY SYSGEN. ; MOV AL,DPB+OFFSET DPBSPT ;CALCULATE PHYSICAL # OF SECTORS MOV BL,HEATH+OFFSET DPERPS-OFFSET DPEHTH ; PER TRACK CBW DIV BL MOV PSPT,AL MOV DH,AL MOV AL,128 ;CALCULATE # BYTES PER SECTOR MUL BL MOV WORD PTR COUNT,AX MOV CX,AX MOV AL,HEATH+OFFSET DPEUNIT-OFFSET DPEHTH ;GET 8" FLAG AND AL,CONDS8 OR AL,CONSD+CONDSEN ;SINGLE DENSITY & DISK SELECT ENABLE PUSH DS ;GET UNIT # MOV DS,.MTRDSEG OR AL,MTRBU POP DS MOV AH,HEATH ;GET FLAGS TEST AH,DPET0SD JNZ CLDR1 MOV SPSPT,DH MOV SCOUNT,CX MOV RPS,BL TEST AH,DPEDD ;CHECK BIT DENSITY JZ CLDR1 ; BR IF SINGLE DENSITY AND AL,NOT CONSD ;SET FOR DOUBLE DENSITY CLDR1: TEST AH,DPE2S ;CHECK NUMBER OF SIDES JNZ CLDR2 ; BR IF DOUBLE SIDED MOV SIDES,0 ;SAVE NUMBER OF SIDES FLAG ; ; LOAD SYSTEM FROM SYSTEM TRACKS ; CLDR2: MOV HEATH+OFFSET DPEUNIT-OFFSET DPEHTH,AL ;SAVE BASE CONTROL WORD IF WAIT OR AL,CONWE ;ENABLE WAIT STATE I/O ENDIF OUT FDCON,AL ;SELECT DRIVE MOV DL,NSBT37-1 ;NUMBER OF CP/M RECORDS TO BE LOADED CLD ;SET BUFFER DIRECTION MOV BX,1 ;INIT SIDE & SECTOR # CLDR3: CMP BL,0 ;Q. COMPLETE TRACK READ L_2A EQU $ DSEG ORG OFFSET L_2A-1 SPSPT DB 26 CSEG $ JBE CLDR5 ; BR IF NOT MOV BL,1 ;RESET SECTOR # XOR BH,0 ;UPDATE SIDE FLAG L_3 EQU $ DSEG ORG OFFSET L_3-1 SIDES DB FDFSS1 CSEG $ JNZ CLDR5 ;BR IF NOT TIME TO STEP HEAD CALL STEPIO ;STEP HEAD IN 1 TRACK TEST BYTE PTR HEATH,DPE48RO ;CHECK IF 48 TPI MEDIA ON 96 TPI DRIVE JZ CLDR5 ; BR IF NOT CLDR4C: CALL STEPIO ;STEP HEAD AGAIN CLDR5: MOV AL,BL ;GET SECTOR # OUT FDSEC,AL ;TELL CONTROLLER WHICH SECTOR MOV CX,0 ;GET SECTOR BYTE COUNT L_3A EQU $ DSEG ORG OFFSET L_3A-2 SCOUNT DW 128 CSEG $ MOV DI,0 ;GET BUFFER POINTER L_4 EQU $ DSEG ORG OFFSET L_4-2 DMAPTR DW LDCPMOS-BCODEL CSEG $ MOV AL,FDCRDS+FDFSLF+FDFDLF ;READ COMMAND OR AL,BH ;OR IN SIDE FLAG OUT FDCMD,AL ;ISSUE READ COMMAND CLDR6: IF NOT WAIT IN AL,FDAS ;WAIT FOR DRQ OR IRQ TEST AL,ASDRQ+ASIRQ JZ CLDR6 ENDIF IN AL,FDDAT ;GET DATA STOSB ;STORE IN BUFFER LOOP CLDR6 ;LOOP AND READ CALL WAITIO1 ;WAIT FOR IRQ AND GET STATUS TEST AL,AL ;CHECK FOR ERROR JNZ RDERR ; BR IF ERROR MOV DMAPTR,DI ;SAVE UPDATED BUFFER POINTER INC BL ;BUMP SECTOR # ;UPDATE CP/M RECORD COUNTER SUB DL,0 ; BY SUBTRACTIN CP/M RECORDS PER SECTOR L_5 EQU $ DSEG ORG OFFSET L_5-1 RPS DB 1 CSEG $ JNS CLDR3 ; ; DONE LOADING SYSTEM. ; PASS TO CP/M-86 LOADER. ; DONE: MOV AL,HEATH+OFFSET DPEUNIT-OFFSET DPEHTH ;DISABLE WAIT STATE I/O OUT FDCON,AL JMPF CCP ;JMP TO CP/M-86 LOADER ; ; HANDLE READ ERRORS. ; RDERR: TEST AL,FDSRNF ;CHECK IF RNF JZ BOOTERR ; BR IF NOT -- FATAL ERROR MOV AL,HEATH+OFFSET DPEUNIT-OFFSET DPEHTH TEST AL,CONDS8 JZ RDERR1 ;BR IF NOT 8" DRIVE TEST AL,CONSD JZ BOOTERR ;BR IF ALREADY DOUBLE DENSITY AND AL,NOT CONSD MOV HEATH+OFFSET DPEUNIT-OFFSET DPEHTH,AL IF WAIT OR AL,CONWE ENDIF OUT FDCON,AL MOV AL,PSPT MOV SPSPT,AL MOV AX,WORD PTR COUNT MOV SCOUNT,AX MOV AL,HEATH+OFFSET DPERPS-OFFSET DPEHTH MOV RPS,AL JMPS CLDR5 ;RETRY OPERATION AT DOUBLE DENSITY RDERR1: MOV AL,HEATH ;ASSUME 'RNF' DUE TO 48 TPI MEDIA ; IN 96 TPI DRIVE OR BYTE PTR HEATH,DPE48RO ;FLAG TO DOUBLE STEP FROM NOW ON ;FATAL ERROR IF FLAG BYTE INDICATES TEST AL,DPE48RO+DPE96T ; MEDIA SYSGENED ON 96 TPI DRIVE JZ CLDR4C ; OR ALREADY DOUBLE STEPPING ; ; BOOT ERROR. ; BOOTERR: XOR AL,AL ;TURN OFF Z207 OUT FDCON,AL JMPF MONITOR ;JMPF TO MONITOR ; ; STEP HEAD IN 1 TRACK. ; STEPIO: MOV AL,FDCSTI+FDFUTR+FDFHLB+FDFS30 ;I/O COMMAND ; ; ISSUE Z207 COMMAND AND WAIT FOR COMPLETION. ; WAITIO: OUT FDCMD,AL ;ISSUE COMMAND WAITIO1: IN AL,FDAS ;WAIT FOR IRQ TEST AL,ASIRQ JZ WAITIO1 WAITIO2: IN AL,FDSTA ;GET FINAL STATUS TEST AL,FDSNRD ;Q. READY JNZ WAITIO2 ; BR IF NOT (SOME DRIVES STACK STEP ; PULSES; THEREFORE, CONTROLLER CAN ; CAN INDICATE DONE WHEN DRIVE IS NOT) RET ; IF (OFFSET $-OFFSET CLDR) GT BCODEL %: BOOT LOADER IS TOO LARGE ENDIF CSEG LDCPMOS/16 ORG LDCCP CCP: CSEG MTRSEG ORG MTRRES MONITOR: END