; ;************************************************************ ; ; COLD BOOT LOADER (IN SAME AREA AS FREE STORAGE) ; 10/20/82 ;************************************************************ ; DIRBF: DS 128 IF DBLOCK HSTBUF: DS MAXHST ENDIF ; ENDSYS: EQU $ ;TO MAKE ASSEMBLER HAPPY ENDSYS1: DW ENDSYS ; ORG DIRBF OLDPROM: DW PROM + 18h ; constat DW PROM + 6 ; conin DW PROM + 9 ; conout ; BOOT1: LDA PVERSION ; ORA A ; old 183 prom series ? JNZ BOOT4 ; if not LXI H,OLDPROM ; LXI D,PROMADR ; LXI B,6 ; LDIR ; BOOT4: LXI H,SMSG ;PRINT OPENING MESSAGE. CALL PMSG ; ; GET DENSITY OF BOOTED DRIVE ; LDA 07FH ;ABS. ADDR. OF DENSITY FLAG LXI H,PRIAMSG ; ANI 020H ; CPI 020H ; IS IT A HARDISK? CZ PMSG ; LDA 07FH ; LXI H,DD128O ;1.4 MSG CPI 0DDH ;1.4 CODE JZ STDSINON ; CPI 10H ; JZ PDDMSG ; LXI H,DD128N ; 2.2 msg CALL PMSG ; LXI H,DD128 ; LDA 7FH ; re-get code byte ANI 03H ;MASK UPPER ORA A ; 0? JZ PDDMSG ; INR A ; LXI H,DENMSG ; LXI D,2 ; LOOP: ; DAD D ; DCR A ; JNZ LOOP ; MOV E,M ; INX H ; MOV D,M ;PTR IN D&E XCHG ;NOW IN H&L PDDMSG: ; CALL PMSG ;PRINT THE DENSITY LXI H,DSMSG ; point at ds msg. PSSDS: ; CALL PMSG ; print single or double sided LXI H,MINIMSG ; LDA 07FH ; ANI 0100$0000B ; is it a mini JNZ PMINI ; LXI H,STDMSG ; PMINI: ; CALL PMSG ; LXI H,SXMSG ; LDA 7FH ; ANI 20H ; hard? JNZ FINIS4 ; LDA 7FH ; ANI 0000$1000B ; skew bit CNZ PMSG ; FINIS4: LDA CDISK LXI H,BRLOOP ; boot read loop adr CMP L ; lower byte occupies 4 LDA CDISK ; JNZ FIN5 ; no match, is a hd XRA A ; always flop a FIN5: ; if not flop, hd will be at cdisk MVI B,15 ; LXI H,DRIVMAP+15 ; UNMAP: CMP M ; JZ UNMAPPED ; DCX H ; DCR B ; JNZ UNMAP ; UNMAPPED: MOV A,B ; STA BOOTDISK ; STA CDISK ; in case of flop, set cdisk to 0 RET ; won't need boot any more ; STDSINON: CALL PMSG ; mophadyte orphan JMP FINIS4 ; ; ; signon messages ; SMSG: DB 0DH,0AH,'X O R DATA SCIENCE CP/M Vers ' DB MSIZE/10+'0',MSIZE MOD 10 + '0' DB ' of 10.20.82 ',0 ; DENMSG: DW DD128O DW DD128N DW DD256 DW DD512 DW DD1024 DD128O: DB ' Standard 1.4 &' DD128N: DB ' 2.2 compatible directory',0DH,0AH,0 DD128: DB '128 bytes/sector',0 DD256: DB '256 bytes/sector',0 DD512: DB '512 bytes/sector',0 DD1024: DB '1024 bytes/sector',0 DSMSG: DB ' double sided',0 MINIMSG: DB ' 5"',0 STDMSG: DB ' 8"',0 PRIAMSG: DB ' Hard disk',0 SXMSG: DB ' (SKEW)',0 DW ENDSYS ; do not remove, used by dsysgen