DataMuseum.dk

Presents historical artifacts from the history of:

RegneCentralen RC700 "Piccolo"

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about RegneCentralen RC700 "Piccolo"

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦89dad7362⟧ TextFile

    Length: 11136 (0x2b80)
    Types: TextFile
    Names: »CPMBOOT.MAC«

Derivation

└─⟦72577d508⟧ Bits:30003297 Diverse BIOS typer til RC703
    └─ ⟦this⟧ »CPMBOOT.MAC« 

TextFile

	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»