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

⟦880237475⟧ TextFile

    Length: 22272 (0x5700)
    Types: TextFile
    Names: »BIOS2.ASM«

Derivation

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

TextFile

;
WRITEHST:
	CALL	SETUP
	LD	A,45H
	LD	(IOCMD+OFFSET),A
	CALL	IOSEC
	LD	(ERFLAG),A
	RET

READHST:
	CALL	SETUP
READH1: LD	A,46H
	LD	(IOCMD+OFFSET),A
	CALL	IOSEC
	LD	(ERFLAG),A
	RET
SETUP:	LD	A,(HSTDSK)
	LD	C,A
	LD	B,0
	LD	HL,DISKFO+OFFSET
	ADD	HL,BC
	LD	A,(HL)
	CP	0
	JR	Z,SETUP0
	CP	1
	JR	Z,SETUP1
	CP	2
	JR	Z,SETUP2
	JP	ERROR
SETUP0:
	XOR	A
	LD	(HEADNO+OFFSET),A
	LD	A,(HSTTRK)
	SRL	A
	JR	NC,SETU1
	PUSH	AF
	LD	A,1
	LD	(HEADNO+OFFSET),A
	POP	AF
SETU1:
	LD	(SEEKTR+OFFSET),A
	CALL	SETUP5
	LD	A,(HSTSEC)
	LD	HL,TR0
	CALL	SETUP8
	CALL	SETUP9
	RET
SETUP1: CALL	SETUP4
	LD	HL,TR1
	CALL	SETUP8
	XOR	A
	LD	(HEADNO+OFFSET),A
	CALL	SETUP9
	RET
SETUP2: CALL	SETUP4
	CP	09H
	JR	C,SETUP3
	SUB	9
	LD	HL,TR2
	CALL	SETUP8
	LD	A,1
	LD	(HEADNO+OFFSET),A
SETU3:
	LD	A,9
	LD	(IOEOT+OFFSET),A
	RET
SETUP3:
	LD	HL,TR2
	CALL	SETUP8
	XOR	A
	LD	(HEADNO+OFFSET),A
	JR	SETU3
SETUP4:
	LD	A,(HSTTRK)
	ADD	A,A
	LD	(SEEKTR+OFFSET),A
	CALL	SETUP5
	LD	A,(HSTSEC)
	RET
SETUP5:
	LD	A,(HSTDSK)
	LD	(SEEKNO+OFFSET),A
	RET
SETUP8:
	LD	C,A
	LD	B,0
	ADD	HL,BC
	LD	A,(HL)
	LD	(SECTOR),A
	RET
SETUP9:
	LD	A,10
	LD	(IOEOT+OFFSET),A
	RET


;	 EJECT
;	 TITLE	 MOTORSTART
;
; MOTORS - CHECK DISK RUNNING AND START IT IF NECESSARY
;
MOTORS:
	OUT	(FDCMON),A
	LD	A,(MOTORF)
	OR	A
	LD	A,(MOTOR1)
	LD	(MOTORF),A
	RET	NZ
	LD	A,0FFH
	CALL	DELAY
	RET





;	 EJECT
;	 TITLE	 IOSEC
;
; IOSEC - READ/WRITE A SECTOR
;
; INPUT : HSTTRACK  : TRACK NUMBER
;	  SECTOR    : SECTOR NUMBER
;	  IOCMD     : 06H FOR READ, 05H FOR WRITE
;	  HSTDSK    : DISK NO
;	  HEADNO    : DISK SIDE
; OUTPUT: A = 0
;
; FUNCTION:
;    READS/WRITES THE SPECIFIED SECTOR. IF AN ERROR
;  OCCURS, THE SECTOR IS RE-READ/RE-WRITTEN UP TO
;  MAXREPEATS TIMES.
;

IOSEC:
	XOR	A
	LD	(NRREPEATS),A
	LD	A,(HSTDSK)
	LD	L,A
	LD	A,(HEADNO+OFFSET)
	OR	A
	LD	A,L
	LD	(RECANO+OFFSET),A
	JR	Z,IOSEC3
	OR	04
IOSEC3:
	LD	(IODISK+OFFSET),A
IOSE05:
	CALL	MOTORS
IOSE9:	LD	HL,SEEKCO+OFFSET
	CALL	COMMAND
	CALL	ENDSEEK
	LD	A,(HSTTRK)
	LD	(IOTRKNO+OFFSET),A     ;     IN THE IO COMMAND
	LD	A,(SECTOR)	;     LIST
	LD	(IOSECNO+OFFSET),A
	LD	HL,IOCOMMAND+OFFSET
	CALL	COMMAND 	;   COMMAND(IO_COMMAND)

;
; EXECUTION PHASE
;
	LD	HL,HSTBUF
	LD	A,(IOCMD+OFFSET)
	AND	00001111B
	LD	D,0A0H
	CP	06H
	JR	NZ,IOSE50
	LD	C,FDCDT
IOSE10:
	LD	B,0
IOSE20: IN	A,(FDCST)
	AND	D
	JP	P,IOSE20
	JP	PO,IOSE90
	INI
	JP	NZ,IOSE20
	LD	B,0
IOSE21: IN	A,(FDCST)
	AND	D
	JP	P,IOSE21
	JP	PO,IOSE90
	INI
	JP	NZ,IOSE21
	JP	IOSE90
IOSE50:
	LD	C,FDCDT
IOSE60:
	LD	B,0
IOSE70: IN	A,(FDCST)
	AND	D
	JP	P,IOSE70
	JP	PO,IOSE90
	OUTI
	JP	NZ,IOSE70
	LD	B,0
IOSE71: IN	A,(FDCST)
	AND	D
	JP	P,IOSE71
	JP	PO,IOSE90
	OUTI
	JP	NZ,IOSE71
IOSE90:
	OUT	(FDCTC),A
	CALL	READRESULT
	LD	HL,RESULT	;   IF RESULT(0) = 7
	LD	A,(HL)		;     AND RESULT(1)
	CP	7		;     THROUGH RESULT(3)
	JR	NZ,IOSE99	;     = 0
	INC	HL
	LD	A,(HL)
	AND	11111000B
	LD	B,2
IOSE95: INC	HL
	OR	(HL)
	DJNZ	IOSE95
	RET	Z		;-----THEN RETURN
IOSE98:
	DEC	A
	LD	A,(HL)
	AND	00010000B
	JP	NZ,IOSE05	; TEST FOR OVERRUN?
	INC	HL
	LD	A,(HL)
	AND	00010000B	; WRONG TRACK?
	CALL	NZ,HOME
IOSE99: LD	A,(NRREPE)
	INC	A
	LD	(NRREPEATS),A
	CP	MAXREPEATS	; UNTIL NR_REPEATS =
	JP	NZ,IOSE05	;   MAX_REPEATS
	LD	A,1
	RET

ENDSEEK:
	LD	HL,SENSEIN+OFFSET
	CALL	DOCOMMAND
	CALL	READRESULT
	LD	A,(RESULT+1)
	AND	00100000B
	JR	Z,ENDSEEK
	LD	B,4
ENDS10: PUSH	BC
	LD	HL,SENSEINT+OFFSET
	CALL	DOCOMMAND
	CALL	READRESULT
	POP	BC
	DJNZ	ENDS10
	RET
COMMAND:
	IN	A,(FDCST)
	AND	1FH
	CALL	NZ,ERROR
DOCOMMAND:
	LD	B,(HL)
	INC	HL
COMM10:
	LD	A,DELAYCNT
COMM15: DEC	A
	JR	NZ,COMM15
COMM20: IN	A,(FDCST)
	RLCA
	JR	NC,COMM20
	RLCA
	CALL	C,ERROR
	LD	A,(HL)
	OUT	(FDCDT),A
	INC	HL
	DJNZ	COMM10
	RET
READRESULT:
	LD	HL,RESULT+1
	LD	B,0
RDRES1:
	LD	A,DELAYCNT
RDRES2: DEC	A
	JR	NZ,RDRES2
	IN	A,(FDCST)
	BIT	4,A
	JR	Z,RDRES8
	RLCA
	JR	NC,RDRES1
	RLCA
	CALL	NC,ERROR
	IN	A,(FDCDT)
	LD	(HL),A
	INC	HL
	INC	B
	JR	RDRES1
RDRES8: LD	HL,RESULT
	LD	(HL),B
	RET
;
;------------------------------------------------------
;
; CONSOLE OUTPUT ROUTINES FOLLOW
;

;
; OUTPUT A CHARACTER TO THE DATA SCREEN
;   THE CHARACTER IS INPUT IN C
;

CONOUT: 			;PROC CONOUT(C)
	PUSH	HL		; PUSH MAIN REGISTER SET
	PUSH	DE
	PUSH	BC
	PUSH	AF
	LD	A,(LEADIN)	; IF LEADIN = 0 THEN
	CP	0FFH		;   // NORMAL PROCESSING
	JP	NZ,CON200
	LD	A,C		;   IF C < ' ' THEN
	CP	' '		;     // CONTROL CHAR
	JP	NC,CON090	;     CASE C OF
	CP	ESC		;     ESC :
	JR	NZ,CON002
	XOR	A
	LD	(LEADIN),A	;	LEADIN := ESC
	JP	CON900
CON002: CP	CR		;     CR :
	JR	NZ,CON010
	LD	HL,0
	LD	(XPOS),HL	;	XPOS := 0
	JP	CON100		;	OUTCURSOR
CON010: CP	LF		;     LF :
	JR	NZ,CONO20
	CALL	DOWN		;	DOWN
	JP	CON100		;	OUTCURSOR
CONO20: CP	CURLEF		;     CURSOR LEFT:
	JR	NZ,CON025
	CALL	LEFT		;	LEFT
	JP	CON100		;	OUTCURSOR
CON025: CP	CURRIG		;     CURSOR RIGHT:
	JR	NZ,CON030
	CALL	RIGHT		;	RIGHT
	JP	CON100		;	OUTCURSOR
CON030: CP	CURUP		;     CURSOR UP:
	JR	NZ,CON040
	CALL	UP		;	UP
	JP	CON100		;	OUTCURSOR
CON040: CP	CURHOM		;     CURSOR HOME:
	JR	NZ,CON050
	LD	HL,0
	LD	(XPOS),HL	;	XPOS := 0
	LD	HL,(OVERBASE)
	LD	(YPOS),HL
	JR	CON100		;	OUTCURSOR
CON050: CP	7FH		; DELETE
	JR	NZ,CON090
	LD	A,(PROP)
	OR	A
	JR	NZ,CON70
	CALL	LEFT		;	  LEFT
	LD	A,' '		;	  PUTCHR(' ')
	CALL	PUTCHR
	CALL	LEFT		;	  LEFT
	JR	CON100		;	  OUTCURSOR
				;	ENDIF
CON70:	JR	CON110
CON090: 			;     OTHERWISE
	CALL	PUTCHR		;	PUTCHR(C)
				;	OUTCURSOR
				;     ENDCASE
				;   ELSE // NORMAL CHARACTER
				;	PUTCHR(C)
				;	OUTCURSOR
CON100: CALL	OUTCURSOR	;   ENDIF
CON110:
	JP	CON900		; ELSE // ESC SEQUENCE
CON200:
	CP	0
	JP	NZ,CON230	; PARAMETER
	LD	HL,ESCTAB
	LD	DE,04
CON205: LD	A,(HL)
	CP	0
	JR	Z,CON207
	CP	C
	JR	Z,CON210	; MATCH
	ADD	HL,DE
	JR	CON205
CON207: LD	A,27		; NOT ESC SEQUENCE
	PUSH	BC		; SAVE C
	CALL	PUTCHR
	POP	BC
	LD	A,C
	CALL	PUTCHR
	CALL	OUTCUR
	LD	A,0FFH
	LD	(LEADIN),A
	JP	CON900
CON210: INC	HL
	LD	A,(HL)
	CP	0
	JR	NZ,CON220	; FUNCTION WITH PARAMETERS
	INC	HL		; NO PARAMETERS
	LD	C,(HL)		; GET ROUTINE ADDRESS
	INC	HL
	LD	B,(HL)
	LD	H,B
	LD	L,C
	LD	A,0FFH
	LD	(LEADIN),A	; RESET LEADIN
	JP	(HL)		; START ROUTINE
CON220: LD	(LEADIN),A	; SAVE NO OF PARAMETERS
	LD	A,01
	LD	(ESCBUF),A	; OP.CODE RECEIVED
	INC	HL
	LD	C,(HL)
	INC	HL
	LD	B,(HL)
	LD	H,B
	LD	L,C
	LD	(ESCBUF+1),HL	; SAVE ADDRESS OF EXECUTING
				; ROUTINE
	JP	CON900
CON230: LD	HL,ESCBUF+2
	LD	A,(ESCBUF)
	LD	E,A
	LD	D,0
	ADD	HL,DE
	LD	(HL),C		; SAVE PARAMETER
	INC	A
	LD	(ESCBUF),A	; SAVE IN ESCBUF
	DEC	A		; REMOVE OFFSET FROM OP.CODE
	LD	HL,LEADIN	; GET NO OF PARAMETERS
	CP	(HL)		; LAST ONE
	JP	NZ,CON900
	LD	A,0FFH		; YES
	LD	(LEADIN),A	; RESET LEADIN
	LD	HL,(ESCBUF+1)	; START EXECUTING
	JP	(HL)
ESCCOL:
	LD	HL,ESCBUF+3	; MOVE PARAMETERS
	LD	D,(HL)
	INC	HL
	LD	E,(HL)
	LD	(XSTORE),DE
	INC	HL
	LD	D,(HL)
	INC	HL
	LD	E,(HL)
	LD	(YSTORE),DE
	LD	HL,(XSTORE)	;	IF XSTORE < PIXHOR AND
;	 LD	 DE,PIXHOR
	LD	DE,(PIXHOR)
	AND	A
	SBC	HL,DE
	JR	NC,ESCC30
	LD	HL,(YSTORE)	;	  YSTORE >= UNDERBASE-1 AND
	INC	HL
	LD	DE,(UNDERBASE)
	AND	A
	SBC	HL,DE
	JR	C,ESCC30
	LD	HL,PIXVE-1	;	  YSTORE <= PIXVER-1-OVERBASE
	LD	DE,(OVERBASE)
	AND	A
	SBC	HL,DE
	LD	DE,(YSTORE)
	AND	A
	SBC	HL,DE
	JR	C,ESCC30	;	THEN
	LD	HL,PIXVE-1	;	  YPOS := PIXVER-1 - YSTORE
	LD	DE,(YSTORE)
	AND	A
	SBC	HL,DE
	LD	(YPOS),HL
	LD	HL,(XSTORE)
	LD	A,(PROP)	;	  IF NOT PROP THEN
	OR	A
	JR	NZ,ESCC20
	LD	A,L		;	    XSTORE := (XSTORE DIV 8)*8
	AND	0F8H
	LD	L,A		;	  ENDIF
ESCC20: LD	(XPOS),HL	;	  XPOS := XSTORE
	CALL	OUTCURSOR	;	  OUTCURSOR
ESCC30: 			;     ENDIF
	JP	CON800
ESCL:
	LD	A,(ESCBUF+3)
	LD	C,A
	BIT	0,C		;     IF C MOD 2 = 0 AND
	JR	NZ,CON268
	LD	A,C		;	C >= 10 AND
	CP	10
	JR	C,CON268
	CP	MAXLINESPACE+1	;	C <= MAXLINESPACE
	JR	NC,CON268	;     THEN
	LD	A,(LINESPACE)	;	PUSH LINESPACE
	PUSH	AF
	CALL	COMPUTE 	;	COMPUTE(C)
	LD	HL,(YPOS)	;	IF YPOS-OVERBASE < 0 OR
	LD	DE,(OVERBASE)
	AND	A
	SBC	HL,DE
	JR	C,CON262
	LD	HL,(YPOS)	;	  YPOS+OVERBASE >= PIXVER+1
	LD	DE,(UNDERBASE)
	ADD	HL,DE
	LD	DE,PIXVE+1
	AND	A
	SBC	HL,DE
	JR	C,CON264	;	THEN
CON262: POP	AF		;	  POP C
	LD	C,A
	CALL	COMPUTE 	;	  COMPUTE(C)
	JR	CON266		;	ELSE
CON264: POP	AF		;	  POP DUMMY
CON266: 			;	ENDIF
CON268: 			;     ENDIF
	JP	CON800
ESCS:	LD	A,(ESCBUF+3)
	LD	C,A
	CP	MAXSPACEW+1
	JR	NC,CON275
	LD	B,0
	LD	(SPACEWIDTH),BC ;     THEN SPACEWIDTH := C
CON275:
	JP	CON800
ESCK:	LD	A,(ESCBUF+3)
	LD	C,A		;     IF C <= MAXCHARDIST
	CP	MAXCHARDIST+1
	JR	NC,CON285
	LD	B,0
	LD	(CHARDIST),BC	;     THEN CHARDIST := C
CON285:
	JR	CON800
ESCæ:
	CALL	CLRSCREEN	;	CLRSCREEN
	LD	HL,0		;	XPOS := 0
	LD	(XPOS),HL
	LD	HL,PIXVE	;	YPOS := PIXVER-UNDERBASE
	LD	DE,(UNDERBASE)
	AND	A
	SBC	HL,DE
	LD	(YPOS),HL
	CALL	OUTCURSOR	;	OUTCURSOR
	JR	CON700
ESCY:	CALL	CLREOS		;	CLREOS
	JR	CON700
ESCT:	CALL	CLREOL		;	CLREOL
	JR	CON700
ESCP:	LD	A,0FFH
	LD	(PROP),A
ESCP10: LD	A,10
	OUT	(CRTREG),A
	LD	A,7
	OUT	(CRTDAT),A
	JR	CON900
ESCLP:	XOR	A
	LD	(PROP),A
	LD	A,(XPOS)	;	  XPOS := (XPOS DIV 8)*8
	AND	0F8H
	LD	(XPOS),A
	CALL	OUTCURSOR	;	  OUTCURSOR
CON550: 			;	OTHERWISE // NOTHING
CON700: 			;     ENDCASE
CON800: 			;   ENDIF
CON900: 			; ENDIF
	POP	AF		; POP MAIN REGISTER SET
	POP	BC
	POP	DE
	POP	HL
	RET			;ENDPROC CONOUT


ESCC	XOR	A
	LD	(CURF),A
	CALL	OUTCUR
	JP	CON900

ESCLC:	LD	A,0FFH
	LD	(CURF),A
	JP	ESCP10

ESCD:	LD	A,(ESCBUF+3)
	LD	(MOTOR1),A
	JP	CON900

ESCG:	LD	HL,ESCBUF+3
	LD	DE,CHRBUF
	LD	BC,12
	LDIR
	CALL	PUTC04
	JP	CON900

ESCLG	LD	A,(ESCBUF+3)
	LD	(GENERF),A
	JP	CON900

ESCF:	LD	A,0FFH
	LD	(FSCROLL),A
	JP	CON900

ESCLF:	XOR	A
	LD	(FSCROLL),A
	JP	CON900

ESCLH:	LD	A,(ESCBUF+3)
	LD	(PRINTE),A
	LD	A,(ESCBUF+4)
	LD	(MODE),A
	JP	CON900

ESCH:	LD	A,(VISF)
	PUSH	AF
	XOR	A
	LD	(VISF),A
	LD	A,(PRINTE)
	CP	0
	JR	Z,ESCHT
	CP	1
	JP	Z,ESCHO
	JP	CON900
ESCHT:	LD	A,(ESCBUF+3)
	LD	(MODE),A
	LD	HL,STREN1	; SET LINE SPACE
	LD	B,STREN2-STREN1
ESCH1:
	LD	C,(HL)
	CALL	LIST
	INC	HL
	DJNZ	ESCH1
	LD	A,(LINESPACE)	; SAVE LINESPACE
	PUSH	AF
	LD	A,8
	LD	(LINESPACE),A
	LD	B,30
	LD	HL,(CRTSTA)
ESCH3:	PUSH	BC		; SAVE B (LINE COUNTER)
	PUSH	HL		; SAVE ADDRESS IN VIDEO
	LD	C,27
	CALL	LIST
	LD	C,'*'
	CALL	LIST
	LD	A,(MODE)       ; GET ACTUAL MODE
	LD	C,A
	CALL	LIST
	LD	BC,(PIXHOR)
	PUSH	BC		; SAVE NO OF BYTES
	CALL	LIST
	POP	BC		; RECOVER NO OF BYTES
	LD	C,B
	CALL	LIST
	LD	A,(PIXHO1)
	LD	B,A
	POP	HL		; RECOVER ADDRESS IN VIDEO

ESCH6:	PUSH	HL		; SAVE ADDRESS IN VIDEO
	PUSH	BC		; SAVE CHARACTER COUNTER
	CALL	CHARREAD	; GET DATA
	LD	HL,ESCBUF+3	; MOVE TO ESCBUF
	LD	B,8		; NO OF BYTES IN BLOCK

ESCH8:	PUSH	BC		; SAVE BYTE COUNTER
	LD	DE,VIDBUF	; GET DATA FROM VIDBUF
	LD	B,8		; NO OF BIT IN BYTE
ESCH9:	LD	A,(DE)		; GET DATA
	RLCA			; SHIFT LEFT
	LD	(DE),A		; PUT IT BACK
	RL	C		; MOVE CARRY TO C
	INC	DE		; NEXT
	DJNZ	ESCH9		; LOOP
	LD	(HL),C		; SAVE NEW DATA
	POP	BC		; RECOVER BYTE COUNTER
	INC	HL		; NEXT ADDRESS TO SAVE
	DJNZ	ESCH8		; LOOP

	LD	HL,ESCBUF+3	; NEW PLACE FOR DATA
	LD	B,8		; BYTE COUNTER
ESCH10: LD	C,(HL)		; MOVE DATA TO C
	INC	HL		; NEXT
	CALL	LIST		; PRINT IT OUT
	DJNZ	ESCH10		; LOOP UNTIL DONE
	POP	BC		; RECOVER CHARACTER COUNTER
	POP	HL		; RECOVER START ADDRESS IN VIDEO
	INC	HL
	INC	HL
	RES	7,H		; MOD 32K
	DJNZ	ESCH6		; LOOP FOR REST OF THE LINE
	PUSH	HL		; SAVE ADDRESS IN VIDEO
	LD	C,0AH		; GO TO NEXT LINE
	CALL	LIST
	LD	C,0DH
	CALL	LIST
	LD	B,6
	LD	DE,(PIXHO1)
	LD	HL,0
ESCH15: ADD	HL,DE
	DJNZ	ESCH15
	EX	DE,HL
	POP	HL
	ADD	HL,DE
	POP	BC		; RECOVER LINE COUNTER
	DJNZ	ESCH3

	POP	AF
	LD	(LINESPACE),A	; RESTORE LINESPACE
	LD	C,27
	CALL	LIST
	LD	C,'@'
	CALL	LIST
	POP	AF
	LD	(VISF),A
	JP	CON900

STREN1: DEFB	27
	DEFB	'A'		; OP.CODE
	DEFB	8		; LINE SPACE = 8/72"
STREN2:

ESCA:	LD	A,0FFH
	LD	(LOCK),A
	JP	CON900

ESCLA:	XOR	A
	LD	(LOCK),A
	JP	CON900

ESCJ:	CALL	ESCLLX		; INSERT LINE FAST
	CALL	ESCJ9+OFFSET
	JR	ESLL9A

ESCLL:				; INSERT LINE
	CALL	ESCLLX
	CALL	ESCLL9+OFFSET
	JR	ESLL9A

ESCLLX: LD	HL,(YPOS)
	LD	DE,0
	CALL	CRTAD1
	PUSH	HL		; SAVE START OF LINE TO DELETE
	LD	A,(LINESPACE)
	LD	B,A
	LD	DE,(PIXHO1)
ESCLL7: ADD	HL,DE
	DJNZ	ESCLL7
	CALL	RES76
	LD	A,PIXVE
	LD	B,A
	LD	A,(YPOS)
	LD	C,A
	LD	A,(UNDERBASE)
	ADD	A,C
	CP	B
	POP	DE
	JR	Z,ESLL9A
	PUSH	DE
	PUSH	HL
	LD	HL,0
	LD	DE,(PIXHO1)
ESCLL8: CP	B
	JR	Z,ESLL8A
	ADD	HL,DE
	INC	A
	JR	ESCLL8
ESLL8A: LD	C,L		; NO OF BYTES TO MOVE
	LD	B,H
	POP	HL		; RECOVER START OF LINE TO MOVE
	ADD	HL,BC
	DEC	HL
	CALL	RES76
	POP	DE		; RECOVER START OF LINE TO DELETE
	EX	DE,HL
	ADD	HL,BC
	DEC	HL
	CALL	RES76
	RET

ESLL9A: LD	HL,(YPOS)
	LD	DE,0
	CALL	CRTAD1
	LD	A,(PIXHO1)
	LD	C,A
	LD	A,(LINESPACE)
	LD	B,A
	CALL	CLRBYTES+OFFSET
	JP	CON900

ESCLJ:	CALL	ESCLDX		; DELETE LINE FAST
	CALL	ESCLJ9+OFFSET
	JR	ESLD9A

ESCLD:				; DELETE LINE
	CALL	ESCLDX
	CALL	ESCLD9+OFFSET
	JR	ESLD9A

ESCLDX: LD	HL,(YPOS)
	LD	DE,0
	CALL	CRTAD1
	PUSH	HL		; SAVE START OF LINE TO DELETE
	LD	A,(LINESPACE)
	LD	B,A
	LD	DE,(PIXHO1)
ESCLD7: ADD	HL,DE
	DJNZ	ESCLD7
	CALL	RES76
	LD	A,PIXVE 	; NO OF LINES
	LD	B,A		; SAVE NO OF LINES
	LD	A,(YPOS)	; GET CURSOR Y POSITION
	LD	C,A		; SAVE
	LD	A,(UNDERBASE)	; NO OF LINES BELOW CHARACTER
	ADD	A,C		; ADD CURSOR Y POSITION
	CP	B
	POP	DE
	JR	Z,ESLD9A
	PUSH	DE
	PUSH	HL
	LD	HL,0		; HL:=0
	LD	DE,(PIXHO1)	; SIZE OF ONE SWEEP
ESCLD8: CP	B		; LAST ONE
	JR	Z,ESLD8A
	ADD	HL,DE
	INC	A
	JR	ESCLD8
ESLD8A:
	LD	C,L		; NO OF BYTES TO MOVE
	LD	B,H
	POP	HL		; RECOVER START OF LINE TO MOVE
	POP	DE		; RECOVER START OF LINE TO DELETE
	RET

ESLD9A: LD	DE,0
	LD	HL,PIXVE
	LD	A,(LINESPACE)
	LD	B,0
	LD	C,A
	AND	A
	SBC	HL,BC
	CALL	CRTAD2
	LD	A,(PIXHO1)
	LD	C,A
	LD	A,(LINESPACE)
	LD	B,A
	CALL	CLRBYTES+OFFSET
	JP	CON900

ESCE:	LD	A,0FFH
	LD	(VISF),A
	JP	CON900

ESCLE:	XOR	A
	LD	(VISF),A
	JP	CON900

ESCI:	LD	A,0FFH
	LD	(INVERT),A
	JP	CON900

ESCLI:	XOR	A
	LD	(INVERT),A
	JP	CON900

ESCLK:	XOR	A
	LD	(KBBUF),A
	JP	CON900

ESCLM:	LD	A,01
	OUT	(CRTREG),A
	XOR	A
	OUT	(CRTDAT),A
	JP	CON900

ESCM:	LD	A,01
	OUT	(CRTREG),A
ESCM10: IN	A,(PIOBD)
	AND	80H
	JR	Z,ESCM10
	LD	A,(PIXHO1)
	OUT	(CRTDAT),A
	JP	CON900

ESCO:	LD	A,0FFH
	LD	(OLINE),A
	JP	CON900

ESCLO:	XOR	A
	LD	(OLINE),A
	JP	CON900

ESCU:	LD	A,0FFH
	LD	(ULINE),A
	JP	CON900

ESCLU:	XOR	A
	LD	(ULINE),A
	JP	CON900

ESCV:	LD	A,0FFH
	LD	(FLASH),A
	JP	CON900

ESCLV:	XOR	A
	LD	(FLASH),A
	JP	CON900

ESCLZ:	LD	A,(ESCBUF+3)
	OR	A
	JR	NZ,ESCLZ1
	INC	A
ESCLZ1: LD	(HENMUL),A
	LD	A,(ESCBUF+4)
	OR	A
	JR	NZ,ESCLZ2
	INC	A
ESCLZ2: LD	(NEDMUL),A
	LD	A,(ESCBUF+5)
	LD	(RETN),A
	JP	CON900

HENTAB: DEFB	01,00		; RIGHT
	DEFB	01,01		; RIGHT, UP
	DEFB	00,01		; UP
	DEFB	0FFH,01 	; LEFT, UP
	DEFB	0FFH,00 	; LEFT
	DEFB	0FFH,0FFH	; LEFT, DOWN
	DEFB	00,0FFH 	; DOWN
	DEFB	01,0FFH 	; RIGHT, DOWN

ESCZ:	LD	HL,(ESCBUF+4)
	LD	A,L
	LD	L,H
	LD	H,A
	LD	(XSTORE),HL
	LD	HL,(ESCBUF+6)
	LD	D,L
	LD	E,H
	LD	HL,(PIXVER)
	DEC	HL
	AND	A
	SBC	HL,DE
	LD	(YSTORE),HL
	LD	HL,HENTAB
	LD	A,(RETN)
	AND	00000111B
	ADD	A,A
	LD	E,A
	LD	D,0
	ADD	HL,DE
	LD	E,(HL)
	INC	E
	LD	D,0
	DEC	DE
	LD	(HENX),DE
	INC	HL
	LD	E,(HL)
	INC	E
	LD	D,0
	DEC	DE
	LD	(HENY),DE
;
; PROC HENT_TEGN
;
	LD	A,(ESCBUF+3)	; GET CHARACTER
	LD	L,A
	LD	H,0
	ADD	HL,HL		; * 2
	ADD	HL,HL		; * 4
	LD	D,H
	LD	E,L
	ADD	HL,HL		; * 8
	ADD	HL,DE		; + 4 = 12
	EX	DE,HL
	LD	HL,CHARGE
	ADD	HL,DE
	LD	DE,600H
	LD	A,(GENERF)
	OR	A
ESCZ05: JR	Z,ESCZ08
	ADD	HL,DE
	DEC	A
	JR	ESCZ05
ESCZ08: LD	DE,CHRBUF
	LD	BC,12
	LDIR
	LD	A,(INVERT)
	OR	A
	JR	Z,ESCZ10
	LD	HL,CHRBUF
	LD	B,12
ESCZ09: LD	A,(HL)
	CPL
	LD	(HL),A
	INC	HL
	DJNZ	ESCZ09
ESCZ10: LD	B,12		; I#
	LD	DE,CHRBUF	; POINTER TO ACTUAL BYTE
ESCZ12:
	PUSH	BC
	LD	HL,(XSTORE)
	LD	(X1STORE),HL
	LD	HL,(YSTORE)
	LD	(Y1STORE),HL
	LD	B,8		; J#
ESCZ16: PUSH	BC		; SAVE COUNTER
	LD	HL,(X1STORE)
	LD	(X2STORE),HL
	LD	HL,(Y1STORE)
	LD	(Y2STORE),HL
	LD	A,(DE)
	RLCA
	LD	(DE),A
	PUSH	DE
	JR	NC,ESCZ17
	XOR	A
	LD	(GRAFF),A
	JR	ESCZ18
ESCZ17: LD	A,0FFH
	LD	(GRAFF),A
ESCZ18: LD	A,(NEDMUL)
	LD	B,A		; K#
ESCZ20: PUSH	BC
	LD	HL,(X2STORE)	; X3#
	LD	(X3STORE),HL
	LD	HL,(Y2STORE)	; Y3#
	LD	(Y3STORE),HL
	LD	A,(HENMUL)	;
	LD	B,A		; L#
ESCZ22: PUSH	BC
	LD	HL,(X3STORE)	; TEST THAT X3 AND Y3 ARE
	LD	DE,(PIXHOR)	; WITHIN THE SCREEN
	AND	A
	SBC	HL,DE
	JR	NC,ESCZ51
	LD	HL,(Y3STORE)
	LD	DE,(PIXVER)
	AND	A
	SBC	HL,DE
	JR	NC,ESCZ51
	LD	HL,(Y3STORE)
	LD	A,L		; ACTUAL BYTE TO A
	PUSH	BC
	LD	C,A
	SRL	A		; / 2
	LD	B,A		; B COUNTER
	LD	HL,0		; START VALUE FOR HL
	JR	Z,ESCZ24	; FIRST LINE, NO ACTION
	LD	DE,(PIXHO1)	; NO OF CHARACTERS ON A LINE
	SLA	E		; * 2
	RL	D
ESCZ23: ADD	HL,DE		; CALC Y VALUE
	DJNZ	ESCZ23
ESCZ24:
	LD	DE,(CRTSTA)	; ADD IN OFFSET
	ADD	HL,DE
	PUSH	HL		; SAVE FOR LATER
	LD	HL,(X3STORE)	; ACTUAL X POSITION
	SRL	H		; / 8
	RR	L
	SRL	H
	RR	L
	SRL	H
	RR	L
	ADD	HL,HL		; * 2
	LD	E,L		; SAVE IN DE
	LD	D,H
	POP	HL		; RECOVER Y VALUE
	ADD	HL,DE		; ADD TOGETHER
	LD	A,C
	AND	00000001B
	JR	Z,ESCZ25
	INC	HL		; SECOND BYTE
ESCZ25:
	CALL	RES76		; MODULUS 16 OR 32 K
	POP	BC
	PUSH	HL		; SAVE RESULT
	LD	HL,TABLE	; GET ACTUAL BYTE
	LD	A,(X3STORE)
	AND	00000111B
	LD	E,A
	LD	D,0
	ADD	HL,DE
	EX	DE,HL
	POP	HL
ESCZ50:
	CALL	PLOT60+OFFSET
ESCZ51:
	LD	HL,(X3STORE)
	LD	DE,(HENX)
	ADD	HL,DE
	LD	(X3STORE),HL
	LD	A,(HENY)
	LD	HL,(Y3STORE)
	LD	DE,(HENY)
	AND	A
	SBC	HL,DE
	LD	(Y3STORE),HL
	POP	BC
	DEC	B
	JP	NZ,ESCZ22	   ; L# :- 1
	LD	HL,(X2STORE)
	LD	DE,(HENY)
	ADD	HL,DE
	LD	(X2STORE),HL
	LD	HL,(Y2STORE)
	LD	DE,(HENX)
	ADD	HL,DE
	LD	(Y2STORE),HL
	POP	BC
	DEC	B
	JP	NZ,ESCZ20
	LD	A,(HENMUL)
	LD	B,A
	LD	HL,(X1STORE)
	LD	DE,(HENX)
ESCZ26: ADD	HL,DE
	DJNZ	ESCZ26
	LD	(X1STORE),HL
	LD	B,A
	LD	HL,(Y1STORE)
	LD	DE,(HENY)
ESCZ27: AND	A
	SBC	HL,DE
	DJNZ	ESCZ27
	LD	(Y1STORE),HL
	POP	DE
	POP	BC
	INC	C
	DEC	B
	JP	NZ,ESCZ16
	PUSH	DE
	LD	A,(NEDMUL)
	LD	B,A
	LD	HL,(XSTORE)
	LD	DE,(HENY)
ESCZ28: ADD	HL,DE
	DJNZ	ESCZ28
	LD	(XSTORE),HL
	LD	B,A
	LD	HL,(YSTORE)
	LD	DE,(HENX)
ESCZ29: ADD	HL,DE
	DJNZ	ESCZ29
	LD	(YSTORE),HL
	POP	DE
	POP	BC
	INC	DE
	DEC	B
	JP	NZ,ESCZ12
	JP	CON900


ESC4:
	LD	HL,DSTAB4
	CALL	CRTI20
	XOR	A
	OUT	(CH80),A
	LD	HL,PIXHO/2
	LD	(PIXHOR),HL
	LD	HL,PIXHO/16
	LD	(PIXHO1),HL
	JR	ESCSTA

ESC8:
	LD	HL,DSTAB8
	CALL	CRTI20
	LD	A,0FFH
	OUT	(CH80),A
	LD	HL,PIXHO
	LD	(PIXHOR),HL
	LD	HL,PIXHO/8
	LD	(PIXHO1),HL

ESCÆ:				; !!!!!!!!!!!!!!!!!!!
ESCSTA: LD	HL,0
	LD	(XPOS),HL
	LD	HL,(OVERBASE)
	LD	(YPOS),HL
	CALL	CLRSCREEN
	JP	CON100

ESCEQU:
	LD	A,(ESCBUF+4)
	SUB	20H
	LD	HL,PIXHO1
	CP	(HL)
;	 CP	 PIXHOR/8
	JP	NC,ESCE90
	LD	A,(ESCBUF+3)
	SUB	20H
	LD	L,A
	LD	H,0
	LD	A,(LINESPACE)
	LD	B,A
	LD	D,H
	LD	E,L
	DEC	B
ESCE10: ADD	HL,DE
	DJNZ	ESCE10
	LD	DE,(OVERBASE)
	ADD	HL,DE
	EX	DE,HL
	LD	HL,(UNDERBASE)
	ADD	HL,DE
	LD	BC,PIXVE+1
	AND	A
	SBC	HL,BC
	JR	NC,ESCE90
	LD	(YPOS),DE
	LD	A,(ESCBUF+4)
	SUB	20H
	LD	L,A
	LD	H,0
	ADD	HL,HL
	ADD	HL,HL
	ADD	HL,HL
	LD	(XPOS),HL
	CALL	OUTCUR
ESCE90: JP	CON900
ESCTAB:
	DEFB	'A'		; PAGE MODE
	DEFB	0
	DEFW	ESCA

	DEFB	'a'		; RESET PAGE MODE
	DEFB	0
	DEFW	ESCLA


	DEFB	'b'		; SET SERIAL CHANNEL
	DEFB	1
	DEFW	ESCb

	DEFB	'C'		; TURN ON CURSOR
	DEFB	0
	DEFW	ESCC

	DEFB	'c'		; TURN OFF CURSOR
	DEFB	0
	DEFW	ESCLC

	DEFB	'D'		; SET DISK TIME
	DEFB	1
	DEFW	ESCD

	DEFB	'd'		; DELETE LINE
	DEFB	0
	DEFW	ESCLD

	DEFB	'E'		; SHOW TIME
	DEFB	0
	DEFW	ESCE

	DEFB	'e'		; RESET SHOW TIME
	DEFB	0
	DEFW	ESCLE

	DEFB	'F'		; FAST SCROLL
	DEFB	0
	DEFW	ESCF

	DEFB	'f'		; SLOW SCROLL
	DEFB	0
	DEFW	ESCLF

	DEFB	'G'		; USER DEFINED CHARACTER
	DEFB	12
	DEFW	ESCG

	DEFB	'g'		; CHANGE CHARACTER GENERATOR
	DEFB	1
	DEFW	ESCLG

	DEFB	'H'		; HARD COPY FROM SCREEN
	DEFB	1
	DEFW	ESCH

	DEFB	'h'		; SET PRINTER
	DEFB	2
	DEFW	ESCLH

	DEFB	'I'		; INVERT
	DEFB	0
	DEFW	ESCI

	DEFB	'i'		; RESET INVERT
	DEFB	0
	DEFW	ESCLI

	DEFB	'J'		; INSERT LINE.
	DEFB	0		; TAKE CARE. FOR USE ONLY IN
	DEFW	ESCJ	       ; CONNECTION WITH CLEAR SCREEN
				; AND NO SCROLLING

	DEFB	'j'		; DELETE LINE. SEE COMMENTS
	DEFB	0		; ABOVE
	DEFW	ESCLJ

	DEFB	'K'		; CHARACTER DISTANCE
	DEFB	1		; IN PROPORTIONAL MODE ONLY
	DEFW	ESCK

	DEFB	'k'		; CLEAR KEYBOARD BUFFER
	DEFB	0
	DEFW	ESCLK

	DEFB	'L'		; LINE DISTANCE
	DEFB	1
	DEFW	ESCL

	DEFB	'l'		; INSERT LINE
	DEFB	0
	DEFW	ESCLL

	DEFB	'M'		; LAD DET BLIVE LYST
	DEFB	0
	DEFW	ESCM

	DEFB	'm'		; LAD DET BLIVE MØRKT
	DEFB	0
	DEFW	ESCLM

	DEFB	'O'		; OVERLINE
	DEFB	0
	DEFW	ESCO

	DEFB	'o'		; NOT OVERLINE
	DEFB	0
	DEFW	ESCLO

	DEFB	'P'		; PROPORTIONAL
	DEFB	0
	DEFW	ESCP

	DEFB	'p'		; NOT PROPORTIONAL
	DEFB	0
	DEFW	ESCLP

	DEFB	'S'		; SPACE WIDTH
	DEFB	1
	DEFW	ESCS

	DEFB	'T'		; CLEAR TO END OF LINE
	DEFB	0
	DEFW	ESCT

	DEFB	'U'		; UNDERLINE
	DEFB	0
	DEFW	ESCU

	DEFB	'u'		; NOT UNDERLINE
	DEFB	0
	DEFW	ESCLU

	DEFB	'W'		; WRITE FAST
	DEFB	0
	DEFW	ESCV

	DEFB	'w'		; WRITE SLOW
	DEFB	0
	DEFW	ESCLV

	DEFB	'Y'		; CLEAR TO END OF SCREEN
	DEFB	0
	DEFW	ESCY

	DEFB	'Z'		; WRITE ENLARGED CHARACTER
	DEFB	5
	DEFW	ESCZ

	DEFB	'z'		; SET CONSTANTS FOR ENLARGED
	DEFB	3		; CHARACTER
	DEFW	ESCLZ

	DEFB	'4'		; SET 40 CHARACTER SCREEN
	DEFB	0
	DEFW	ESC4

	DEFB	'8'
	DEFB	0
	DEFW	ESC8

	DEFB	'+'		; SET POINT
	DEFB	4
	DEFW	ESCPLU

	DEFB	'-'		; RESET POINT
	DEFB	4
	DEFW	ESCMIN

	DEFB	'='		; CURSOR ADRESSING
	DEFB	2		; WORKS IN CHARACTER
	DEFW	ESCEQU		; AND LINE UNITS

	DEFB	':'		; CURSOR ADRESSING
	DEFB	4		; WORKS IN PIXELS
	DEFW	ESCCOL

	DEFB	'*'		; CURSOR HOME AND
	DEFB	0		; CLEAR SCREEN
	DEFW	ESCSTA		; 1,1 UPPER LEFT CORNER

	DEFB	'Æ'		; SAME AS ABOVE
	DEFB	0
	DEFW	ESCÆ

	DEFB	'æ'		; CURSOR HOME TO LOWER
	DEFB	0		; LEFT CORNER AND CLEAR
	DEFW	ESCæ		; SCREEN

	DEFB	0		; END OF TABLE


▶04◀C▶04◀CE

▶ff◀«eof»