DataMuseum.dk

Presents historical artifacts from the history of:

CP/M

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

See our Wiki for more about CP/M

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦89be42be5⟧ TextFile

    Length: 11264 (0x2c00)
    Types: TextFile
    Names: »BIOS1.ASM«

Derivation

└─⟦0d02879d3⟧ Bits:30004605 COMPAS Pascal version 3.03
    └─ ⟦this⟧ »BIOS1.ASM« 

TextFile


DOWN:				; PROC DOWN
				; // MOVE CURSOR 1 LINE DOWN
				; BEGIN
	LD	HL,(YPOS)	;   IF YPOS+LINESPACE >
	LD	DE,(LINESPACE)
	ADD	HL,DE
	LD	B,H
	LD	C,L
	LD	HL,PIXVE
	LD	DE,(UNDERBASE)
	AND	A
	SBC	HL,DE
	AND	A
	SBC	HL,BC
	JP	C,UPSCROLL	;   THEN UPSCROLL
	LD	(YPOS),BC	;   ELSE YPOS :+ LINESPACE
	RET			; ENDPROC


UP:				; PROC UP
				; // MOVE CURSOR 1 LINE UP
	LD	HL,(LINESPACE)	;   IF YPOS-LINESPACE < OVERBASE
	LD	DE,(OVERBASE)
	ADD	HL,DE
	LD	DE,(YPOS)
	AND	A
	SBC	HL,DE
	JR	Z,UP10
	JP	NC,DOWNSCROLL	;   THEN DOWNSCROLL
UP10:	LD	HL,(YPOS)
	LD	DE,(LINESPACE)
	AND	A
	SBC	HL,DE
	LD	(YPOS),HL	;   ELSE YPOS :- LINESPACE
	RET			; ENDPROC


LEFT:				; PROC LEFT
				; // MOVE CURSOR 1 UNIT LEFT
	LD	DE,-1		;   IF PROP THEN
;	 LD	 BC,PIXHOR-1	 ;     DE := -1
	LD	BC,(PIXHOR)
	DEC	BC
	LD	A,(PROP)	;     BC := PIXHOR-1
	OR	A		;   ELSE
	JR	NZ,LEFT10	;     DE := -8
	LD	DE,-8		;     BC := 8*(LINLEN-1)
;	 LD	 BC,8*(LINLEN-1)
	LD	BC,(PIXHO1)
	DEC	BC
	SLA	C
	RL	B
	SLA	C
	RL	B
	SLA	C
	RL	B
LEFT10: 			;   ENDIF
	LD	HL,(XPOS)	;   IF XPOS > 0 THEN
	LD	A,H
	OR	L
	JR	Z,LEFT20
	ADD	HL,DE		;     XPOS :+ DE
	LD	(XPOS),HL
	RET			;   ELSE
LEFT20: LD	(XPOS),BC	;     XPOS := BC
	JR	UP		;     UP
				;   ENDIF
				; ENDPROC


RIGHT:				; PROC RIGHT
				; // MOVE CURSOR 1 UNIT RIGHT
	LD	DE,1		;   IF PROP THEN
;	 LD	 BC,PIXHOR-1	 ;     DE := 1
	LD	BC,(PIXHOR)
	DEC	BC
	LD	A,(PROP)	;     BC := PIXHOR-1
	OR	A		;   ELSE
	JR	NZ,RIGH10	;     DE := 8
	LD	DE,8	       ;     BC := 8*(LINLEN-1)
;	 LD	 BC,8*(LINLEN-1)
	LD	BC,(PIXHO1)
	DEC	BC
	SLA	C
	RL	B
	SLA	C
	RL	B
	SLA	C
	RL	B

RIGH10: 			;   ENDIF
	LD	HL,(XPOS)	;   IF XPOS < BC  THEN
	AND	A
	SBC	HL,BC
	JR	NC,RIGH20
	ADD	HL,BC
	ADD	HL,DE		;     XPOS :+ DE
	LD	(XPOS),HL
	RET			;   ELSE
RIGH20: LD	HL,0
	LD	(XPOS),HL	;     XPOS := 0
	JP	DOWN		;     DOWN
				;   ENDIF
				; ENDPROC


COMPUTE:			; PROC COMPUTE(C)
				; // SET LINESPACE TO C AND COMPUTE
				; // THE RELATED VARIABLES ANEW
	LD	B,0
	LD	(LINESPACE),BC	;   LINESPACE := C
	LD	A,C
	CP	10
	LD	B,3		;   IF LINESPACE = 10
	JR	Z,COMP10	;   THEN SPCCHAR := 10; B := 3
	LD	A,12		;   ELSE SPCCHAR := 12; B := 4
	LD	B,4
COMP10: LD	(SPCCHAR),A
	LD	D,A		;   SPCAROUND := (LINESPACE-SPCCHAR)/2
	LD	A,C
	SUB	D
	RRCA
	LD	(SPCAROUND),A
	ADD	A,B		;   UNDERBASE := SPCAROUND+B
	LD	L,A
	LD	H,0
	LD	(UNDERBASE),HL
	EX	DE,HL		;   OVERBASE := LINESPACE-UNDERBASE
	LD	HL,(LINESPACE)
	AND	A
	SBC	HL,DE
	LD	(OVERBASE),HL
	RET			; ENDPROC COMPUTE


CLREOL: 			; PROC CLREOL
				; // CLEAR FROM CURSOR TO END
				; // OF LINE
	LD	HL,(XPOS)
	LD	A,L		;   IF XPOS MOD 8 <> 0 THEN
	AND	07H
	JR	Z,CLRE20
	PUSH	AF
	CALL	CRTADDR 	;     HL := CRTADDR
	POP	BC
	PUSH	HL		;     PUSH HL
				;     C := BIT STRING STARTING
	XOR	A		;	WITH (XPOS MOD 8) ONES
CLRE05: SCF			;	FROM THE LEFT SIDE AND
	RRA			;	THE RIGHT SIDE AS ZEROES
	DJNZ	CLRE05
	LD	C,A
	LD	A,(LINESPACE)
	LD	B,A
	CALL	CLRE10+OFFSET
	POP	HL		;     POP HL // CRTADDR
	INC	HL		;     HL := (HL+2) MOD 32K
	INC	HL
;	 RES	 7,H
	CALL	RES76
	JR	CLRE30		;   ELSE
CLRE20: CALL	CRTADDR 	;     HL := CRTADDR
CLRE30: 			;   ENDIF
	PUSH	HL
;	 LD	 HL,PIXHOR	 ;   C := (PIXHOR-XPOS)/8
	LD	HL,(PIXHOR)
	LD	DE,(XPOS)
	AND	A
	SBC	HL,DE
	LD	A,L
	AND	0F8H
	SRL	H
	RRA
	SRL	H
	RRA
	SRL	H
	RRA
	LD	C,A
	LD	A,(LINESPACE)
	LD	B,A		;   CLRBYTES(HL, C, LINESPACE)
	POP	HL
	CALL	CLRBYTES+OFFSET
	RET			; ENDPROC CLREOL



CLREOS: 			; PROC CLREOS
				; // CLEAR TO END OF SCREEN
	CALL	CLREOL		;   CLREOL
	LD	HL,(YPOS)	;   IF YPOS+UNDERBASE < PIXVER THEN
	LD	DE,(UNDERBASE)
	ADD	HL,DE
	EX	DE,HL
	LD	HL,PIXVE
	AND	A
	SBC	HL,DE
	JR	C,CLRE50
	JR	Z,CLRE50
	PUSH	HL
	LD	HL,(YPOS)	;     HL := CRTAD1(0,YPOS+LINESPACE)
	LD	DE,(LINESPACE)
	ADD	HL,DE
	LD	DE,0
	CALL	CRTAD1
	POP	BC		;     B := PIXVER - (YPOS+UNDERBASE)
	LD	B,C
;	 LD	 C,PIXHOR/8
	PUSH	AF
	LD	A,(PIXHO1)
	LD	C,A
	POP	AF
	CALL	CLRBYTES+OFFSET ; CLRBYTES(HL, PIXHOR/8, B)
CLRE50: 			;   ENDIF
	RET			; ENDPROC CLREOS


PUTC00:
	LD	E,A
	RLC	E
	RLC	E
	LD	B,4
	LD	HL,CHRBUF
PUTC:	PUSH	BC
	RRC	E
	RRC	E
	BIT	0,E
	JR	Z,PUTC1
	LD	A,0F0H
PUTC1:	BIT	1,E
	JR	Z,PUTC2
	OR	0FH
PUTC2:	LD	B,3
PUTC3:	LD	(HL),A
	INC	HL
	DJNZ	PUTC3
	POP	BC
	DJNZ	PUTC
	JR	PUT
;
; PUTCHR
;
; WRITES OUT A CHARACTER IN FLASHLESS MODE
; AT THE CURSOR POSITION. MOVES THE CURSOR CORRESPONDINGLY
;
; INPUT :
; A IS THE CHARACTER TO BE WRITTEN.

PUTCHR: 			; PROC PUTCHR(A)
	LD	C,A
	LD	A,(GENERF)
	CP	0AH
	LD	A,C
	JR	Z,PUTC00
	LD	H,0
	LD	L,A		;   HL := A*12
	ADD	HL,HL		;     * 2
	ADD	HL,HL		;	* 4
	LD	D,H
	LD	E,L
	ADD	HL,HL		;	   * 8
	ADD	HL,DE		;	     * 12
	EX	DE,HL
	LD	HL,CHARGE
	ADD	HL,DE
	LD	DE,600H
	LD	A,(GENERF)
	OR	A
PUT1:	JR	Z,PUT
	ADD	HL,DE
	DEC	A
	JR	PUT1
PUT:	LD	A,(SPCCHAR)	;   IF SPCCHAR = 10
	CP	10
	JR	NZ,PUTC01
	INC	HL
PUTC01:
	LD	DE,CHRBUF
	LD	BC,12
	LDIR
PUTC04: LD	A,(SPCCHAR)
	LD	B,10
	CP	10
	JR	Z,PUTC02
	LD	B,12
PUTC02:
	LD	HL,CHRBUF
	XOR	A
PUTC03: OR	(HL)		;   FOR I := 1 TO 10
	INC	HL		;   DO MASK :OR CHRBUF(I)
	DJNZ	PUTC03
	LD	(MASK),A
	LD	A,(ULINE)	;   IF ULINE THEN
	OR	A
	JR	Z,PUTC10
	LD	A,(SPCCHAR)	;     IF SPCCHAR = 10
	CP	10
	LD	A,0FFH
	JR	NZ,PUTC05
	LD	(CHRBUF+9),A	;     THEN CHRBUF(9) := 0FFH
	JR	PUTC10
PUTC05: LD	(CHRBUF+11),A	;     ELSE CHRBUF(11) := 0FFH
				;   ENDIF
PUTC10: LD	A,(OLINE)	;   IF OLINE THEN
	OR	A
	JR	Z,PUTC20
	LD	A,0FFH
	LD	(CHRBUF),A	;     CHRBUF(0) := 0FFH
				;   ENDIF
PUTC20: LD	A,(INVERT)	;   IF INVERT THEN
	OR	A
	JR	Z,PUTC30
	LD	B,12
	LD	HL,CHRBUF	;     FOR I := 0 TO 11
PUTC25: LD	A,(HL)		;     DO CHRBUF(I) := COMPL(CHRBUF(I))
	CPL
	LD	(HL),A
	INC	HL
	DJNZ	PUTC25
PUTC30: 			;   ENDIF
	LD	A,(PROP)	;   IF NOT PROP THEN
	OR	A
	JR	NZ,PUT100
	LD	A,(INVERT)	;     C := INVERT
	LD	C,A
	LD	DE,VIDBUF	;     DE := ^VIDBUF(0)
	LD	A,(SPCAROUND)	;     IF SPCAROUND <> 0 THEN
	OR	A
	JR	Z,PUTC50
	LD	B,A		;	MOVE SPCAROUND BYTES
	LD	A,C		;	  WITH VALUE C TO DE^
PUTC40: LD	(DE),A		;	DE :+ SPCAROUND
	INC	DE
	DJNZ	PUTC40
	LD	HL,CHRBUF	;	MOVE CHRBUF(0..11) TO DE^
	LD	BC,12		;	DE :+ 12
	LDIR
	LD	A,(SPCAROUND)	;	MOVE SPCAROUND BYTES
	LD	B,A		;	  WITH VALUE C TO DE^
	LD	A,(VIDBUF)
PUTC45: LD	(DE),A
	INC	DE
	DJNZ	PUTC45
	JR	PUTC65		;     ELSE
PUTC50: LD	HL,CHRBUF	;	VIDBUF(0..11) := CHRBUF(0..11)
	LD	BC,12
	LDIR
PUTC65: 			;     ENDIF
	CALL	CRTADDR 	;     HL := CRTADDR
	CALL	CHARWRITE	;     CHARWRITE(HL)
	CALL	RIGHT		;     RIGHT
	JP	PUT900
PUT100: 			;   ELSE // PROPORTIONAL
	LD	A,(CHARDIST)	;     LEFTBLANK := CHARDIST DIV 2
	LD	B,A
	SRL	A
	LD	(LEFTBLANK),A
	SUB	B		;     RIGHTBLANK := CHARDIST-LEFTBLANK
	NEG
	LD	(RIGHTBLANK),A
	LD	A,(MASK)	;     IF MASK = 0 THEN // SPACE
	OR	A
	JR	NZ,PUT105
	LD	A,(LEFTBLANK)	;	LEFTBLANK :+ SPACEWIDTH
	LD	B,A
	LD	A,(SPACEWIDTH)
	ADD	A,B
	LD	(LEFTBLANK),A
	XOR	A		;	WIDTH := 0
	LD	(WIDTH),A
	JR	PUT145		;     ELSE // MASK <> 0
PUT105: LD	B,0		;	STARTPOS := BIT NUMBER OF
PUT110: RLCA			;	  LEFTMOST ONE BIT WHEN
	JR	C,PUT120	;	  BITS ARE NUMBERED 0..7
	INC	B		;	  FROM LEFT TO RIGHT
	JR	PUT110
PUT120: LD	A,B
	LD	(STARTPOS),A
	LD	A,(MASK)	;	WIDTH := (BIT NUMBER OF
	LD	C,7+1		;	  RIGHTMOST ONE BIT) -
PUT130: RRCA			;	  STARTPOS + 1
	JR	C,PUT140
	DEC	C
	JR	PUT130
PUT140: LD	A,C
	SUB	B
	LD	(WIDTH),A
PUT145: 			;     ENDIF
;	 LD	 HL,PIXHOR	 ;     IF PIXHOR-XPOS < LEFTBLANK+
	LD	HL,(PIXHOR)
	LD	DE,(XPOS)
	AND	A
	SBC	HL,DE
	LD	A,(LEFTBLANK)
	LD	B,A
	LD	A,(WIDTH)
	ADD	A,B
	LD	B,A
	LD	A,(RIGHTBLANK)
	ADD	A,B
	LD	E,A
	LD	D,0
	AND	A
	SBC	HL,DE
	JR	NC,PUT148	;     THEN
	LD	HL,0		;	XPOS := 0
	LD	(XPOS),HL
	CALL	DOWN		;	DOWN
PUT148: 			;     ENDIF
	LD	A,01H		;     BLMASK := 01H
	LD	(BLMASK),A
	LD	A,(XPOS)
	AND	07H		;     KEEP := XPOS MOD 8
	LD	(KEEP),A
	LD	B,A
	LD	A,(MASK)	;     IF MASK <> 0 THEN
	OR	A
	JR	Z,PUT180
	LD	A,(STARTPOS)	;	A := (KEEP+LEFTBLANK-
	LD	C,A		;	      STARTPOS) MOD 8
	LD	A,(LEFTBLANK)
	ADD	A,B
	SUB	C
	AND	07H
	JR	Z,PUT170	;	IF A <> 0 THEN
	LD	D,A
	LD	C,11
	LD	HL,CHRBUF	;	  FOR I := 0 TO 10 DO
PUT150: LD	B,D
	LD	A,(HL)		;	    CHRBUF(I) :=
PUT160: RRCA			;	      CHRBUF(I) ROTATED
	DJNZ	PUT160		;	      CIRCULAR RIGHT A BITS
	LD	(HL),A
	INC	HL
	DEC	C
	JR	NZ,PUT150	;	  ENDFOR
	LD	B,D		;	  BLMASK := BLMASK ROTATED
	LD	A,(BLMASK)	;	    CIRCULAR RIGHT A BITS
PUT165: RRCA
	DJNZ	PUT165
	LD	(BLMASK),A
PUT170: 			;	ENDIF
PUT180: 			;     ENDIF
	LD	HL,VMASK
	LD	(HL),0		;     VMASK := ALL 0
	LD	DE,VMASK+1	;     CMASK := ALL 0
	LD	BC,MASKLE*2-1
	LDIR
	LD	HL,VMASK	;     SETBITS(VMASK,0,KEEP)
	LD	A,(KEEP)
	LD	B,A
	XOR	A
	CALL	SETBITS
	LD	HL,CMASK	;     SETBITS(CMASK,
	LD	A,(WIDTH)	;	KEEP+LEFTBLANK, WIDTH)
	LD	B,A
	LD	A,(KEEP)
	LD	C,A
	LD	A,(LEFTBLANK)
	ADD	A,C
	PUSH	AF
	CALL	SETBITS
	POP	BC
	LD	HL,VMASK	;     SETBITS(VMASK,
	LD	A,(WIDTH)	;	KEEP+LEFTBLANK+
	ADD	A,B		;	WIDTH+RIGHTBLANK, 15)
	LD	B,A
	LD	A,(RIGHTBLANK)
	ADD	A,B
	LD	B,15
	CALL	SETBITS
	CALL	CRTADDR 	;     VIDADDR := CRTADDR
	LD	(VIDADDR),HL
	PUSH	IX		;     PUSH IX
	LD	IX,VMASK	;     IX := ^VMASK // = ^CMASK-MASKLEN
				;     // BELOW, VMSK DENOTES IX^ AND
				;     // CMSK DENOTES (IX+MASKLEN)^
PUT200: LD	A,(IX+0)	;     WHILE VMSK <> 0FFH DO
	CP	0FFH
	JR	Z,PUT260
	OR	A		;	IF VMSK <> 0
	LD	HL,(VIDADDR)	;	THEN CHARREAD(VIDADDR)
	CALL	NZ,CHARREAD
	LD	HL,VIDBUF	;	HL := ^VIDBUF
	LD	A,(SPCAROUND)	;	IF SPCAROUND <> 0 THEN
	OR	A
	JR	Z,PUT220
	LD	B,A
	LD	C,(IX+0)
	LD	A,C
	CPL
	LD	D,A
	LD	A,(INVERT)
	AND	D
	LD	D,A
PUT210: LD	A,(HL)		;	  DO SPCAROUND TIMES
	AND	C		;	    HL^ := (HL^ AND VMSK) OR
	OR	D		;	      (INVERT AND NOT VMSK)
	LD	(HL),A
	INC	HL		;	    HL :+ 1
	DJNZ	PUT210		;	  ENDDO
PUT220: 			;	ENDIF
	LD	A,(SPCCHAR)
	LD	B,A		;	DE := ^CHRBUF(0)
	LD	DE,CHRBUF	;	DO SPCCHAR TIMES
PUT230: LD	A,(BLMASK)	;	  HL^ := ((DE^ AND BLMASK)<>0)
	LD	C,A		;	    AND NOT CMSK
	LD	A,(DE)		;	    AND NOT VMSK) OR
	AND	C
	LD	C,0
	JR	Z,PUT235
	LD	A,(IX+0)
	OR	(IX+MASKLEN)
	CPL
	LD	C,A
PUT235: LD	A,(HL)		;	    (HL^ AND VMSK) OR
	AND	(IX+0)
	OR	C
	LD	C,A
	LD	A,(DE)		;	    (DE^ AND CMSK)
	AND	(IX+MASKLEN)
	OR	C
	LD	(HL),A
	INC	HL		;	  HL :+ 1
	INC	DE		;	  DE :+ 1
	DJNZ	PUT230		;	ENDDO
	LD	A,(SPCAROUND)	;	IF SPCAROUND <> 0 THEN
	OR	A
	JR	Z,PUT250
	LD	B,A
	LD	C,(IX+0)
	LD	A,C
	CPL
	LD	D,A
	LD	A,(INVERT)
	AND	D
	LD	D,A
PUT240: LD	A,(HL)		;	  DO SPCAROUND TIMES
	AND	C		;	    HL^ := (HL^ AND VMSK) OR
	OR	D		;	      (INVERT AND NOT VMSK)
	LD	(HL),A
	INC	HL		;	    HL :+ 1
	DJNZ	PUT240		;	  ENDDO
PUT250: 			;	ENDIF
	LD	HL,(VIDADDR)
	CALL	CHARWRITE	;	CHARWRITE(VIDADDR)
	LD	HL,(VIDADDR)	;	VIDADDR := (VIDADDR+2) MOD 32K
	INC	HL
	INC	HL
;	 RES	 7,H
	CALL	RES76
	LD	(VIDADDR),HL
	INC	IX		;	IX :+ 1
	JP	PUT200		;     ENDWHILE
PUT260: POP	IX		;     POP IX
	LD	A,(LEFTBLANK)	;     XPOS :+ LEFTBLANK+WIDHT+RIGHTBLANK
	LD	B,A
	LD	A,(WIDTH)
	ADD	A,B
	LD	B,A
	LD	A,(RIGHTBLANK)
	ADD	A,B
	LD	E,A
	LD	D,0
	LD	HL,(XPOS)
	ADD	HL,DE
	LD	(XPOS),HL
PUT900: 			;   ENDIF // NOT PROP / PROP
	RET			; ENDPROC PUTCHR


▶04◀▶7f◀▶04◀▶7f◀▶04◀▶7f◀«eof»