|
DataMuseum.dkPresents historical artifacts from the history of: CP/M |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about CP/M Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - download
Length: 11136 (0x2b80) Types: TextFile Names: »CPMBOOT.MAC«
└─⟦72577d508⟧ Bits:30003297 Diverse BIOS typer til RC703 └─ ⟦this⟧ »CPMBOOT.MAC«
SUBTTL CP/M BIOS JUMP TABLE AND BIOS EXTENTIONS page ;============================================================================== ;= THE FOLLOWING VARIABLES SHOULD NOT BE CHANGED AS EXTERNAL = ;= PROGRAMS DEPENDS ON THEIR POSITION AND VALUES = ;============================================================================== JP BOOT WBOTE: JP WBOOT JP CONST JP CONIN JP CONOUT JP LIST JP PUNCH JP READER JP XHOME JP SELD JP SETT JP SETS JP SETD JP XREAD JP XWRITE JP STLIST JP SECTRA PAGE ADRMOD: DB 0 ; ADDRESS MODE = XY WR5A: DB 0 ; WR5B: DB 0 ; MTYPE: DB 3 ; MASCHINE TYPE: 0=RC700, 1=RC850 ; 2=ITT3290, 3=RC703 FD0: DB 255 ; MAXI MINI 96 tpi FD1: DB 255 ; 0: SS,128 B/S,26 S/T not used FD2: DB 255 ; 8: DD,512 B/S,30 S/T *DD,512 B/S,20 S/T FD3: DB 255 ;16:*SS,128 B/S,26 S/T DD,512 B/S,20 S/T FD4: DB 255 ;24:*DD,256 B/S,26 S/T !!DD,512 B/S,30 S/T 8" FD5: DB 255 ;32:*WINCHESTER DISK 0,9 MB UNIT 512 B/S FD6: DB 255 ;40:*WINCHESTER DISK 0,3 MB UNIT 512 B/S FD7: DB 255 ;48:*WINCHESTER DISK 1,9 MB UNIT 512 B/S FD8: DB 255 ;56:*WINCHESTER DISK 3,9 MB UNIT 512 B/S FD9: DB 255 ;64:*WINCHESTER DISK 7,9 MB UNIT 512 B/S FD10: DB 255 ;255: NOT USED FD11: DB 255 ;* MEANS THAT NO SECTOR TRANSLATION IS DONE. FD12: DB 255 ; FD13: DB 255 ; FD14: DB 255 ; FD15: DB 255 ; BOOTD: DB 0 ; 0 => COLD AND WARM BOOT FROM FLOPPY DISK ; <> 0 => - - - - - HARD DISK ; Opdate in CONFI area, copyed under runtime ; not used ; colour: db 0 ; Default colours written to console before ; warmboot ; Bit 6..4 defines Text colour ; Bit 2..0 defines Bagground colour PAGE DS 1 ; RESERVED FOR FUTURE USE JP WFITR ; ENTRY USED BY FORMAT UTILITY JP READS ; READER STATUS JP LINSEL ; LINE SELECTION JP EXIT ; EXIT ROUTINE JP CLOCK ; REAL TIME CLOCK JP HRDFMT ; FORMAT HARD DISK TRACK JP WAITHIT ; wait for hard disk interrupt DS 16 ; RESERVED FOR FUTURE USE PCHSAV: DW 0 ; SAVED ADDRESS OF BDOS PATCH PAGE BOTMSG: DB 13,10 DB 'Disk read error - reset' DB 13,10,0 SIGNON: DB 12 ; TFj DB 'RC703 56k CP/M vers. 2.2 rel. 1.1' DB 'RC703 56k CP/M bios QQPP 1987 TFj' DB 13,10,0 WMESS: DB 12,'Waiting',0 HDERR: DB 12,'Cannot read configuration record',13,10,0 PRMSG: LD A,(HL) ; PROCEDURE PRINT_MESSAGE; OR A ; WHILE CHARACTER<>0 DO RET Z ; WRITECHAR(CONSOLE); PUSH HL ; LD C,A ; CALL CONOUT ; POP HL ; INC HL ; JR PRMSG ; Pcolour:ld hl,(rctad) ; set colours in last two positions of ld de,78+dspstr ; current line add hl,de ; set$col: ret ; not used ld a,(colour) ; ld d,a ; and 070h ; Get Text colour nr. (supp. only 8 colours) srl a ; srl a ; In propper bits or 2 ; set text bit call s$col2 ; write it ld a,d ; and 07h ; Get Baground colour nr. (supp. only 8 col.) sla a ; In propper bits sla a ; s$col2: or 11000001b ; colour attributte ld (hl),a ; store in display buffer inc hl ; ready for next ret ; BOTERR: LD HL,BOTMSG ; PROCEDURE BOOT_ERROR; CALL PRMSG ; BEGIN BOPLP: JR BOPLP ; PRINT_MESSAGE; ; WHILE TRUE DO; ; END; PAGE EXIT: LD A,0C3H ; PROCEDURE DEF_EXIT_ROUTINE; LD (EXROUT),A ; LD (EXROUT+1),HL ; DEFINE ADDRESS EX DE,HL ; LD (EXCNT0),HL ; DEFINE COUNT RET ; CLOCK: DI ; OR A ; PROCEDURE CLOCK; JR Z,CLOCK1 ; BEGIN LD DE,(RTC0) ; IF A<>0 THEN LD HL,(RTC2) ; READ_CLOCK EI ; RET ; ELSE CLOCK1: LD (RTC0),DE ; SET_CLOCK; LD (RTC2),HL ; END; EI ; RET ; PAGE LINSEL: ADD A,SIOAC ; PROCEDURE LINE_SELECT; LD C,A ; BEGIN RESLIN: DI ; (RELEASE LINE) LD A,1 ; (SELECT READ REG. 1) OUT (C),A ; IN A,(C) ; (READ REG. 1) EI ; AND 00000001B ; JR Z,RESLIN ; (LOOP END) LD HL,2 ; (* WAIT 1-2 TIMER PERIODS *) CALL WAITD ; LD D,5 ; (* A: 0=TERMINAL PORT, 1=PRINTER PORT *) LD A,0 ; (* B: 0=RELASE, 1=LINE A, 2=LINE B *) CALL SETSIG ; DTR:=FALSE; DEC B ; RTS:=FALSE; RET M ; IF B<>0 THEN SLA B ; BEGIN OR B ; DTR:=FALSE; CALL SETSIG ; RTS:=(B=2); OR 80H ; (* WAIT AT LEAST 100 NS *) CALL SETSIG ; DTR:=TRUE; LD HL,2 ; (* WAIT 1-2 TIMER PERIODS *) CALL WAITD ; IF CTS THEN LD A,C ; A:=0FFH CP SIOAC ; ELSE LD A,(RR0_A) ; BEGIN JP Z,LINSE1 ; A:=0; LD A,(RR0_B) ; DTR:=FALSE; LINSE1: AND 20H ; RTS:=FALSE; JP Z,SETSIGN ; END; LD A,0FFH ; END; RET ; END; SETSIG: DI ; OUT (C),D ; OUT (C),A ; EI ; RET ; PCHBDS: XOR A ; PERFORM TEMP PATCH TO BDOS LD (PATCH1),A ; LD HL,(PATCH2) ; LD (PCHSAV),HL ; SAVE FOR LATER RESTORE BY PCHFIX LD HL,PCHFIX ; LD (PATCH2),HL ; SAVE ADDRESS RET ; RETURN PROM PROC. PCHFIX: PUSH HL ; RESET DISK SYS CALLED IF WBOOT FROM HD LD HL,(PCHSAV) ; GET SAVED VALUE LD (PATCH2),HL ; INSERT IT INTO BDOS POP HL ; RETURN RET ; PAGE BOOT: LD SP,BUFF ; USE DMA BUFFER AS STACK LD HL,SIGNON ; CALL PRMSG ; XOR A ; INIT. CURR. LOGGED DISK = A: LD (CDISK),A ; LD (WBFLAG),A ; WARMBOOTFLAG:=0 LD A,(BOOTD) ; OR A ; IF HARD DISK USED AND ONLINE THEN JP Z,BOOT04 ; LD A,C ; CURR. LOGGED DISK = (BOOT DISK) LD (CDISK),A ; BOOT04: XOR A ; LD (HSTACT),A ; LD (ERFLAG),A ; LD (HSTWRT),A ; IN A,(SW1) ; AND 80H ; JP Z,WBOOT ; IF MAXI DRIVE THEN WARM BOOT LD A,(DRNO) ; ELSE CP 2 ; IF MAX DRIVE < 2 THEN JP NC,BOOT1 ; LD C,1 ; CALL SELD ; CALL XHOME ; LD A,B ; AND 10H ; ; LD A,0 ; ; JP NZ,BOOT1 ; IF online(drive1) THEN ; INC A ; max_drive_no := 1 LD A,3 ; TFj BOOT1: LD (DRNO),A ; ELSE max_drive_no := 0; PAGE WBOOT: EI ; LD C,0 ; SELECT DRIVE 0 LD A,(BOOTD) ; IF BOOTD <> 0 THEN (* => HARD DISK ONLINE *) OR A ; JR Z,WBOOT5 ; LD A,2 ; WBOOT(DISK C) LD C,A ; WBOOT5: CALL SELD ; ENDIF; XOR A ; LD (UNACNT),A ; LD (IOBYTE),A ; LD (DSKNO),A ; LD (KEYFLG),A ; KEY_BUSY:=TRUE; CALL XHOME ; LD SP,BUFF ; SP:=DMA_BUFFER; LD BC,CPMB ; CALL SETD ; DMA_ADDRESS:=CPM_BASE; LD BC,1 ; CALL SETT ; TRACK:=1; LD BC,0 ; CALL SETS ; SECTOR:=0; PAGE RDSEC: PUSH BC ; REPEAT CALL XREAD ; READ(TRACK,SECTOR); OR A ; JP NZ,BOTERR ; LD HL,(DMAADR) ; LD DE,128 ; ADD HL,DE ; LD B,H ; LD C,L ; CALL SETD ; DMA_ADDRESS:=DMA_ADDRESS + 128; POP BC ; INC BC ; CALL SETS ; SECTOR:=SECTOR + 1; LD A,C ; CP NSECTS ; JP NZ,RDSEC ; UNTIL SECTOR = NSECTS; LD BC,BUFF ; DMA_ADDRESS:=BUFF; CALL SETD ; LD A,0C3H ; LD (0),A ; M(0):=OPCODE(JP); LD HL,WBOTE ; LD (1),HL ; M(1..2):=ADDRESS(WBOOTE); LD (5),A ; M(5):=OPCODE(JP); LD HL,BDOS ; LD (6),HL ; M(6..7):=ADDRESS(BDOS); LD A,(CDISK) ; AND 00001111B ; REMOVE USER BITS LD C,A ; C:=CUR_DISK; LD A,(BOOTD) ; CP C ; IF CUR.LOG.DISK =BOOTDISK THEN OK JR Z,LWBT ; CALL SELD ; ELSE CHECK LD A,H ; IF READING POSSIBLE OR L ; JR Z,SELERR ; LD BC,2 ; CALL SETT ; CALL SETS ; CALL XREAD ; OR A ; JR Z,LWBT ; SELERR: LD A,(BOOTD) ; IF BAD READ THEN CUR.LOG.DSK:=BOOTD LD (CDISK),A ; LWBT: call pcolour ; set default colours LD A,(CDISK) ; AND 00001111B ; REMOVE USER BITS LD C,A ; CP 2 ; CALL nc,PCHBDS ; PATCH BDOS if current drive on hard disk CALL SELD ; LD A,(CDISK) ; LD C,A ; GOCPM: LD HL,WBFLAG ; LD A,(HL) ; LD (HL),01 ; IF NOT WARMBOOT THEN GOTO CCP OR A ; JR Z,GOCCP ; LD A,(CPMB+7) ; ELSE OR A ; GET LENGTH OF CCP INPUT BUFFER JR Z,GOCCP ; IF LENGTH=0 THEN GO TO CCP LD HL,CPMB+9 ; ELSE ADD A,L ; IF NOT CW_FLAG THEN LD L,A ; LD A,(HL) ; OR A ; JP Z,CCPCLR ; GO TO CCPCLEAR GOCCP: JP CPMB ; ELSE GOTO CCP «eof»