|
|
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 - metrics - 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»