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

⟦b77198194⟧ TextFile

    Length: 27008 (0x6980)
    Types: TextFile
    Names: »BLOWU1.ASM«

Derivation

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

TextFile


;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; PROCEDURE CRTINI	INITIALISATION PROCEDURE
;
; NO INPUT, NO OUTPUT
;
; FUNCTION:
;      INITIALISES THE CRT CIRCUITS FOR OPERATION
;   USED AT START-UP TIME ONLY
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

CRTINI:
	XOR	A
	LD	(FLASH),A
	LD	(RETN),A
	LD	(LOCK),A
	LD	(KBFLAG),A
	LD	(OLINE),A
	LD	(ULINE),A
	LD	(INVERT),A
	LD	(PROP),A
	LD	(GENERF),A
	LD	(CURF),A
	DEC	A
	LD	(TASTBU),A
	LD	(LEADIN),A
	LD	(FSCROL),A
	INC	A
	INC	A
	LD	(HENMUL),A
	LD	(NEDMUL),A
	LD	HL,5
	LD	(SPACEWIDTH),HL
	LD	HL,3
	LD	(CHARDIST),HL
	LD	C,10
	CALL	COMPUTE
	LD	A,0FFH
	OUT	(CH80),A	; SET 16 MHZ VIDEO
				; 80 CHARACTERS/LINE
	LD	HL,PIXHO
	LD	(PIXHOR),HL
	LD	HL,PIXVE
	LD	(PIXVER),HL
	LD	HL,80
	LD	(PIXHO1),HL
	CALL	CLRSCREEN	; CLEAR VIDEO MEMORY
	LD	HL,DSTAB8	; INITIALISE THE CRTC
	CALL	CRTI20
	LD	C,27
	CALL	CONOUT
	LD	C,'*'
	JP	CONOUT
CRTI20: LD	B,12		; REGISTERS FROM TABLE
	LD	C,0
CRTI30: LD	A,C
	OUT	(CRTREG),A
	INC	C
	LD	A,(HL)
	OUT	(CRTDAT),A
	INC	HL
	DJNZ	CRTI30
	RET

; CHARREAD
;
; READS THE BYTES CORRESPONDING TO (A PART OF) A CHARACTER
; IN THE VIDEO RAM. THE BYTES READ CORRESPOND TO A BYTE COLUMN
; ON THE DISPLAY.
; "LINESPACE" BYTES ARE READ AND STORED IN VIDBUF.
;
; INPUT:
; HL IS THE ADDRESS OF THE FIRST (UPPER) RAM BYTE OF THE
; CHARACTER

CHARREAD:			; PROC CHARREAD(HL)
	PUSH	IX		;   PUSH IX
	LD	IX,VIDBUF	;   IX := ^VIDBUF
	LD	A,(LINESPACE)
	RRCA
	LD	B,A		;   DO LINESPACE/2 TIMES
	CALL	CHAR10+OFFSET
	POP	IX		;   POP IX
	RET			; ENDPROC CHARREAD


; CHARWRITE
;
; WRITES THE BYTES CORRESPONDING TO (A PART OF) A CHARACTER
; IN THE VIDEO RAM. THE BYTES WRITTEN CORRESPOND TO A BYTE COLUMN
; ON THE DISPLAY.
; "LINESPACE" BYTES ARE TAKEN FROM VIDBUF AND WRITTEN.
;
; INPUT:
; HL IS THE ADDRESS OF THE FIRST (UPPER) RAM BYTE OF THE
; CHARACTER

CHARWRITE:			; PROC CHARWRITE(HL)
	PUSH	IX		;   PUSH IX
	LD	IX,VIDBUF	;   IX := ^VIDBUF
	LD	A,(LINESPACE)
	RRCA
	LD	B,A		;   DO LINESPACE/2 TIMES
	CALL	CHAR60+OFFSET
	POP	IX		;   POP IX
	RET			; ENDPROC CHARWRITE



; SETBITS
;
; SETS A STREAM OF BITS IN A STORE AREA.
;
; INPUT:
; HL IS THE ADDRESS OF THE FIRST BYTE IN THE STORE AREA.
;   THE STORE AREA IS TREATED AS A STREAM OF BITS, WITH
;   THE BITS IN THE FIRST BYTE OF THE AREA BEING NUMBERED 0 TO 7
;   FROM LEFT TO RIGHT, THE BITS IN THE 2ND BYTE BEING NUMBERED
;   8 TO 15 ETC.
; A IS THE NUMBER OF THE STARTING BIT TO BE SET.
; B IS THE NUMBER OF BITS TO BE SET. THE BITS WITH NUMBERS
;   C THROUGH C+B-1 ARE SET.

SETBITS:			; PROC SETBITS(HL, A, B)
	LD	C,A		;   C := A
	LD	A,B		;   IF B <> 0 THEN
	OR	A
	RET	Z
	LD	A,C		;     HL :+ C DIV 8
	AND	0F8H
	RRCA
	RRCA
	RRCA
	LD	E,A
	LD	D,0
	ADD	HL,DE
	LD	A,C		;     C := 80H ROTATED RIGHT
	AND	07H		;	CIRCULAR (C MOD 8) BITS
	LD	C,80H
	OR	A
	JR	Z,SETB20
SETB10: RRC	C
	DEC	A
	JR	NZ,SETB10
SETB20: LD	DE,0		;     DO B TIMES
SETB30: LD	A,(HL)		;	HL^ := HL^ OR C
	OR	C
	LD	(HL),A
	RRC	C		;	ROTATE C RIGHT CIRCULAR
	ADC	HL,DE		;	IF C = 80H THEN HL :+ 1
	DJNZ	SETB30		;     ENDDO
				;   ENDIF
	RET			; ENDPROC SETBITS



; CRTADDR, CRTAD1, CRTAD2
;
; CALCULATES THE ADDRESS IN THE CRT RAM CORRESPONDING TO
; A CURSOR POSITION.
;
; INPUT:
; CRTADDR: XPOS AND YPOS HOLD THE CURSOR POSITION
; CRTAD1,
; CRTAD2 : DE AND HL HOLD THE CURSOR POSITION (X-DE, Y-HL)
;
; OUTPUT:
; CRTADDR,
; CRTAD1 : HL IS ADDRESS OF FIRST (UPPER) BYTE OF THE CHARACTER
;	   WHOSE BASELINE IS AT THE CURSOR POSITION.
; CRTAD2 : HL IS ADDRESS OF THE BYTE PLACED AT THE CURSOR POSITION.

CRTADDR:			; PROC CRTADDR
	LD	DE,(XPOS)	;   DE := XPOS
	LD	HL,(YPOS)	;   HL := YPOS
CRTAD1: 			; // ENTRY POINT CRTAD1
	LD	BC,(OVERBASE)	;   HL :- OVERBASE
	AND	A
	SBC	HL,BC
CRTAD2: 			; // ENTRY POINT CRTAD2
	XOR	A		;   HL := ( (HL/2) * 2*PIXHOR/8
	RR	L
	RLA
	RL	L
	CALL	MULT
	LD	C,A		;     + HL MOD 2
	LD	B,0
	ADD	HL,BC
	SRL	D		;     + DE/8 * 2
	RR	E
	SRL	D
	RR	E
	RES	0,E
	ADD	HL,DE
	LD	DE,(CRTSTART)	;     + CRTSTART
	ADD	HL,DE
;	 RES	 7,H		 ;     ) MOD 32K
	CALL	RES76
	RET


; MULT UTILITY
;
; MULTIPLIES HL WITH PIXHOR/8
;
; DOES NOT MODIFY DE AND A

MULT:
;	 IF	 PIXHOR/8-80
;	   DEFB    ERROR
;	 ENDIF
	PUSH	AF
	LD	A,(PIXHO1)
	CP	40
	JR	Z,MULT10
	ADD	HL,HL		; *2
MULT10: ADD	HL,HL		; *4
	ADD	HL,HL		; *8
	ADD	HL,HL		; *16
	LD	B,H
	LD	C,L
	ADD	HL,HL		; *32
	ADD	HL,HL		; *64
	ADD	HL,BC		; +16
	POP	AF
	RET


; OUTCURSOR
;
; IF NOT PROPORTIONAL SPACING, THE CURSOR IS POSITIONED

OUTCURSOR:			; PROC OUTCURSOR
	LD	A,(PROP)	;   IF NOT PROP THEN
	OR	A
	RET	NZ
	LD	A,(CURF)
	OR	A
	RET	NZ
	LD	DE,(XPOS)	;     HL := CRTAD2(XPOS, YPOS+1)
	LD	HL,(YPOS)
	INC	HL
	XOR	A
	RR	L
	RLA
	RL	L
	CALL	MULT
	LD	C,A
	LD	B,0
	ADD	HL,BC
	SRL	D
	RR	E
	SRL	D
	RR	E
	RES	0,E
	ADD	HL,DE
	LD	DE,(CRTSTART)
	ADD	HL,DE
	RES	7,H
	SRL	H		;     E := HL MOD 2
	RR	L		;     HL := HL/2
	LD	E,0
	RL	E
	LD	A,10		;     CRTREG(10) := 60H+E
	OUT	(CRTREG),A
	LD	A,60H
	ADD	A,E
	OUT	(CRTDAT),A
	LD	A,11		;     CRTREG(11) := E
	OUT	(CRTREG),A
	LD	A,E
	OUT	(CRTDAT),A
	LD	A,14		;     CRTREG(14..15) := HL
	OUT	(CRTREG),A
	LD	A,H
	OUT	(CRTDAT),A
	LD	A,15
	OUT	(CRTREG),A
	LD	A,L
	OUT	(CRTDAT),A
				;   ENDIF
	RET			; ENDPROC OUTCURSOR




CLRSCREEN:
	LD	A,01		; STOP DISPLAY TO
	OUT	(CRTREG),A	; SPEED UP MEMORY
	XOR	A		; CLEARING
	OUT	(CRTDAT),A
	CALL	XCLRSC+OFFSET
				; RETURN POINT FROM RAM
	LD	HL,0
	LD	(CLRBEGIN),HL	; CLRBEGIN := 0
	CALL	OUTRFRSH	; OUTRFRSH(0)
	LD	A,01
	OUT	(CRTREG),A
;	 LD	 A,PIXHOR/8
	LD	A,(PIXHO1)
	OUT	(CRTDAT),A
	RET

DSTAB8:
	DEFB	7FH		; HORIZONTAL TOTAL
	DEFB	50H		; HORIZONTAL DISPLAYED
	DEFB	5DH		; HORIZONTAL SYNC POSITION
	DEFB	06H		; HORIZONTAL SYNC WIDTH
	DEFB	7FH		; VERTICAL TOTAL
	DEFB	1FH		; VERTICAL TOTAL ADJUST
	DEFB	78H		; VERTICAL DISPLAYED
	DEFB	7EH		; VERTICAL SYNC POSITION
	DEFB	00H		; NON-INTERLACE MODE
	DEFB	01H		; MAXIMUM SCAN LINE
	DEFB	60H		; CURSOR CONTROL $ START
	DEFB	01H		; CURSOR END

DSTAB4: DEFB	7FH/2
	DEFB	50H/2
	DEFB	5DH/2
	DEFB	6/2
	DEFB	7FH
	DEFB	1FH
	DEFB	78H
	DEFB	7EH
	DEFB	0
	DEFB	01H
	DEFB	60H
	DEFB	01H


; UPSCROLL
;
; SCROLLS THE CONTENTS OF THE SCREEN ONE LINE UP


UPSCROLL:			; PROC UPSCROLL
	LD	A,(LOCK)
	OR	A
	RET	NZ

UPSC10: 			;   REPEAT
	LD	HL,0
	LD	DE,(PIXHO1)
	PUSH	BC
	LD	B,PIXVE
UPSC12: ADD	HL,DE
	DJNZ	UPSC12
	POP	BC
	EX	DE,HL
	LD	HL,(CRTSTART)
	ADD	HL,DE		;     ) MOD 32K
	EX	DE,HL
	LD	HL,(CLRBEGIN)
	AND	A
	SBC	HL,DE
	CALL	RES76
	PUSH	HL		;     >= LINESPACE*PIXHOR/8
	LD	HL,(LINESPACE)
	CALL	MULT
	EX	DE,HL
	POP	HL
	AND	A
	SBC	HL,DE
	JR	C,UPSC10       ;
	LD	A,(FSCROL)	;   IF NOT FSCROL THEN
	OR	A
	JR	NZ,UPSC50
	LD	A,(LINESPACE)
	RRCA
	LD	B,A		;     DO LINESPACE/2 TIMES
UPSC30: IN	A,(PIOBD)	;	AWAIT VERTICAL SYNC
	RLCA
	JR	NC,UPSC30
	LD	DE,(PIXHO1)
	LD	L,E
	LD	H,D
	ADD	HL,DE
	EX	DE,HL
	LD	HL,(CRTSTART)
	ADD	HL,DE		;	  ) MOD 32K
	CALL	RES76
	CALL	OUTRFRSH
UPSC40: IN	A,(PIOBD)	;	AWAIT NO VERTICAL SYNC
	RLCA
	JR	C,UPSC40
	DJNZ	UPSC30		;     ENDDO
	JR	UPSC60		;   ELSE
UPSC50: LD	HL,(LINESPACE)	;     OUTRFRSH( (
	CALL	MULT		;	CRTSTART+LINESPACE*PIXHOR/8
	LD	DE,(CRTSTART)	;	) MOD 32K)
	ADD	HL,DE
	CALL	RES76
	CALL	OUTRFRSH
				;   ENDIF
UPSC60:
	LD	A,10000011B
	OUT	(PIOBC),A
	RET
				; ENDPROC UPSCROLL


; DOWNSCROLL
;
; SCROLLS THE CONTENTS OF THE SCREEN ONE LINE DOWN

DOWNSCROLL:			; PROC DOWNSCROLL
	LD	A,(LOCK)
	OR	A
	RET	NZ
DOWN05: LD	HL,(CLRBEGIN)	;   REPEAT
	LD	DE,(CRTSTART)
	AND	A
	SBC	HL,DE
	JR	NZ,DOWN05	;   UNTIL CLRBEGIN=CRTSTART
	LD	A,(FSCROL)	;   IF NOT FSCROL THEN
	OR	A
	JR	NZ,DOWN40
	LD	A,(LINESPACE)
	RRCA
	LD	B,A		;     DO LINESPACE/2 TIMES
DOWN10: IN	A,(PIOBD)	;	AWAIT VERTICAL SYNC
	RLCA
	JR	NC,DOWN10
	LD	DE,(PIXHO1)
	LD	L,E
	LD	H,D
	ADD	HL,DE
	EX	DE,HL
	LD	HL,0
	AND	A
	SBC	HL,DE
	EX	DE,HL
	LD	HL,(CRTSTART)
	ADD	HL,DE		;	  ) MOD 32K
	CALL	RES76
	LD	(CLRBEGIN),HL	;	CLRBEGIN := HL
	CALL	OUTRFRSH	;	OUTRFRSH(HL)
DOWN20: IN	A,(PIOBD)	;	AWAIT NO VERTICAL SYNC
	RLCA
	JR	C,DOWN20
	DJNZ	DOWN10		;     ENDDO
	JR	DOWN50		;   ELSE
DOWN40:
	LD	HL,(LINESPACE)	;     HL := (CRTSTART - LINESPACE*PIXHOR/8)
	CALL	MULT		;	MOD 32K
	EX	DE,HL
	LD	HL,(CRTSTART)
	AND	A
	SBC	HL,DE
	CALL	RES76
	LD	(CLRBEGIN),HL	;     CLRBEGIN := HL
	CALL	OUTRFRSH	;     OUTRFRSH(HL)
DOWN50: 			;   ENDIF
	LD	DE,(PIXHO1)
	LD	HL,0
	PUSH	BC
	LD	B,PIXVE
DOWN52: ADD	HL,DE
	DJNZ	DOWN52
	POP	BC
	EX	DE,HL
	LD	HL,(CRTSTART)
	ADD	HL,DE		;     PIXHOR/8, LINESPACE)
	CALL	RES76
	LD	A,(PIXHO1)
	LD	C,A
	LD	A,(LINESPACE)
	LD	B,A
	CALL	CLRBYTES+OFFSET
	LD	A,10000011B
	OUT	(PIOBC),A
	RET			; ENDPROC DOWNSCROLL

RES76:	PUSH	AF
	LD	A,(PIXHO1)
	CP	40
	JR	NZ,RES76A
	RES	6,H
RES76A: RES	7,H
	POP	AF
	RET

OUTRFRSH:			; PROC OUTRFRSH(HL)
	LD	(CRTSTART),HL	;   CRTSTART := HL
	SRA	H
	RR	L
	LD	A,12		;   CRTREG(12..13) := HL/2
	OUT	(CRTREG),A
	LD	A,H
	OUT	(CRTDAT),A
	LD	A,13
	OUT	(CRTREG),A
	LD	A,L
	OUT	(CRTDAT),A
	RET			; ENDPROC OUTRFRSH

ESCPLU:
	XOR	A
	LD	(GRAFF),A
	JR	PLOT
ESCMIN:
	LD	A,01
	LD	(GRAFF),A
PLOT:
	LD	HL,(ESCBUF+5)
	LD	D,L
	LD	E,H
	LD	HL,(PIXVER)
	DEC	HL
	AND	A
	SBC	HL,DE
	LD	(ESCBUF+5),HL
	LD	A,L
	LD	DE,(PIXVER)
	AND	A
	SBC	HL,DE
	JP	NC,CON900
	LD	HL,(ESCBUF+5)
	LD	C,L
	SRL	A
	LD	B,A
	LD	HL,0
	JR	Z,PLOT20
	LD	DE,(PIXHO1)
	SLA	E
	RL	D
PLOT10:
	ADD	HL,DE
	DJNZ	PLOT10
PLOT20:
	LD	DE,(CRTSTA)
	ADD	HL,DE
	PUSH	HL
	LD	HL,(ESCBUF+3)
	LD	A,L
	LD	L,H
	LD	H,A
	LD	(ESCBUF+3),HL
	LD	DE,(PIXHOR)
	AND	A
	SBC	HL,DE
	POP	HL
	JP	NC,CON900
	PUSH	HL
	LD	HL,(ESCBUF+3)
	LD	B,L
	SRL	H
	RR	L
	SRL	H
	RR	L
	SRL	H
	RR	L
	ADD	HL,HL
	LD	E,L
	LD	D,H
	POP	HL
	ADD	HL,DE
	LD	A,C
	AND	00000001B
	JR	Z,PLOT30
	INC	HL
PLOT30:
	CALL	RES76
	PUSH	HL
	LD	HL,TABLE
	LD	A,B
	AND	00000111B
	LD	E,A
	LD	D,0
	ADD	HL,DE
	EX	DE,HL
	POP	HL
PLOT50:
	CALL	PLOT60+OFFSET
	JP	CON900
TABLE:
	DEFB	80H
	DEFB	40H
	DEFB	20H
	DEFB	10H
	DEFB	08H
	DEFB	04H
	DEFB	02H
	DEFB	01H




FUNTA:				; SET FUNCTION KEYS
	LD	HL,TXT1
	CALL	OUTTX
FUNTA1: LD	HL,TXT1A
	CALL	OUTTX
	CALL	CONIN
	PUSH	AF
	LD	C,A
	CALL	CONOUT
	POP	AF
	AND	01011111B
	CP	'F'
	CALL	NZ,FUNTA1
	CALL	CONIN
	PUSH	AF
	LD	C,A
	CALL	CONOUT
	POP	AF
	CP	31H
	JR	C,FUNTA1
	CP	35H
	JR	NC,FUNTA1
	DEC	A
	AND	00000011B
	PUSH	AF		; SAVE NO OF FUNCTION KEY
FUNT2:	LD	HL,TXT1B
	CALL	OUTTX
	LD	HL,TXT1C
	CALL	OUTTX
	CALL	CONIN		; ASK FOR SHIFT
	PUSH	AF
	LD	C,A
	CALL	CONOUT
	POP	AF
	AND	01011111B
	CP	'N'
	JR	Z,FUNT3
	CP	'J'
	JR	NZ,FUNT2
	POP	AF
	SET	2,A
	PUSH	AF
FUNT3:	LD	HL,TXT1D
	CALL	OUTTX
	LD	HL,TXT1C
	CALL	OUTTX
	CALL	CONIN			; ASK FOR CTRL
	PUSH	AF
	LD	C,A
	CALL	CONOUT
	POP	AF
	AND	01011111B
	CP	'N'
	JR	Z,FUNT4
	CP	'J'
	JR	NZ,FUNT3
	POP	AF
	SET	3,A
	PUSH	AF		; SAVE KEY
FUNT4:	POP	AF
	OR	A
	LD	C,A		; SAVE KEY
	LD	HL,FBUF 	; POINTER
	JR	Z,FUNT20	; STRING LOCATED
	LD	B,A
FUNT10: LD	A,(HL)
	INC	HL
	CP	80H
	JR	C,FUNT10
	DJNZ	FUNT10
FUNT20: PUSH	HL
	LD	HL,TXT2
	PUSH	BC		; SAVE KEY
	CALL	OUTTX
	LD	HL,TXT3
	CALL	OUTTX
	POP	BC		; RECOVER KEY
	LD	A,C
	CP	08H
	JR	C,FUNT21
	PUSH	BC
	LD	C,'C'
	CALL	CONOUT
	LD	C,' '
	CALL	CONOUT
	POP	BC
FUNT21: LD	A,C
	AND	00000100B
	JR	Z,FUNT22
	PUSH	BC
	LD	C,'S'
	CALL	CONOUT
	LD	C,' '
	CALL	CONOUT
	POP	BC
FUNT22: PUSH	BC
	LD	C,'F'
	CALL	CONOUT
	POP	BC
	LD	A,C
	AND	00000011B
	ADD	A,31H
	LD	C,A
	CALL	CONOUT
	LD	HL,TXT4
	CALL	OUTTX
	POP	HL
	LD	D,H		; SAVE START OF STRING
	LD	E,L
	PUSH	DE
FUNT25: LD	A,(HL)
	CP	80H
	JR	NC,FUNT30
	PUSH	HL
	LD	HL,FUNT26
	PUSH	HL
	CP	0DH
	JP	Z,PRINCR
	CP	0AH
	JP	Z,PRINLF
	POP	HL
	LD	C,A
	CALL	CONOUT
FUNT26: POP	HL
	INC	HL
	JR	FUNT25
FUNT30: 			; SAVE END OF STRING
	PUSH	HL
	AND	01111111B
	LD	C,A
	CALL	CONOUT		; WRITE LAST
FUNT32: LD	HL,TXT5
	CALL	OUTTX
	CALL	CONIN
	PUSH	AF
	LD	C,A
	CALL	CONOUT
	POP	AF
	AND	01011111B
	CP	'J'
	JR	Z,FUNT40
	CP	'N'
	JR	NZ,FUNT32
FUNT35:
	LD	HL,TXT6
	CALL	OUTTX
	CALL	CONIN
	PUSH	AF
	LD	C,A
	CALL	CONOUT
	POP	AF
	POP	HL		; CLEAR STACK
	POP	DE
	AND	01011111B
	CP	'J'
	JP	Z,FUNTA
	CP	'N'
	JR	NZ,FUNT35
	LD	HL,FBUF 	; MOVE STRING TO HSTBUF
	LD	DE,HSTBUF+80
	LD	BC,80H
	LDIR
	XOR	A		; SET FLAG. FBUF ACTIVE
	LD	(HSTBUF+2),A
	JP	CONF01
FUNT40: POP	HL		; END OF STRING
	POP	DE		; START OF STRING
	PUSH	DE		; SAVE START
	LD	A,80H
	LD	(DE),A
	LD	BC,FBUF+80H
	PUSH	HL
	AND	A
	SBC	HL,DE
	LD	A,L
	OR	H
	POP	HL
	JR	Z,FUNT50	; NOTHING TO MOVE
FUNT45:
	INC	DE		; CONCATENATE BUFFER
	INC	HL
	PUSH	HL
	LD	A,(HL)
	LD	(DE),A
	AND	A
	SBC	HL,BC
	LD	A,L
	OR	H
	POP	HL
	JR	NZ,FUNT45

FUNT50:
	LD	B,16
	LD	HL,FBUF
FUNT52: LD	A,(HL)		; FIND LAST CHAR IN BUFFER
	INC	HL
	CP	80H
	JR	C,FUNT52
	DJNZ	FUNT52
	PUSH	HL		; SAVE FIRST PLACE NOT USED
	INC	HL		; FIRST PLACE NOT USED
	LD	BC,FBUF+80H
FUNT53: AND	A
	PUSH	HL
	SBC	HL,BC
	LD	A,L
	OR	H
	POP	HL
	JR	Z,FUNT54
	LD	(HL),0
	INC	HL
	JR	FUNT53
FUNT54: POP	HL
	DEC	HL		; LAST POSITION USED
	POP	BC		; START OF NEW STRING
	PUSH	HL		; SAVE LAST POSITION
	PUSH	BC		; SAVE START OF STRING
	AND	A
	SBC	HL,BC
	LD	C,L		; C:=COUNTER
	INC	C
	PUSH	BC		; SAVE COUNTER
	LD	HL,TXT7
	CALL	OUTTX
	POP	BC		; RECOVER BUMP COUNTER
	POP	DE		; GET START
	POP	HL
FUNT55:
	PUSH	BC		; SAVE BUMP COUNTER
	PUSH	DE		; SAVE SAVING ADRESS
	PUSH	HL
	CALL	CONIN
	POP	HL
	CP	27		; END OF STRING?
	JP	Z,FUNT35
	PUSH	HL
	PUSH	AF		; SAVE 1. CHARACTER
	LD	HL,FUNT5A
	PUSH	HL
	CP	0DH
	JP	Z,PRINCR
	CP	0AH
	JP	Z,PRINLF
	POP	HL
	LD	C,A		; GIVE IT BACK TO USER
	CALL	CONOUT
FUNT5A: POP	AF		; RESTORE CHARACTER
	POP	HL
	POP	DE		; RECOVER SAVING ADDRESS
	LD	(DE),A		; SAVE IN FBUF
	POP	BC		; RECOVER BUMP COUNTER
FUNT56:
	PUSH	HL		; SAVE LAST PLACE IN FBUF
	INC	DE		; MAKE READY FOR NEXT
	PUSH	BC		; SAVE BUMP COUNTER
	PUSH	DE		; SAVE NEXT ADDRESS
	CALL	CONIN		; GET NEXT CHARACTER
	CP	27		; ESC KEY?
	JR	Z,FUNT60	;
	PUSH	AF
	LD	HL,FUNT5B
	PUSH	HL
	CP	0DH
	JP	Z,PRINCR
	CP	0AH
	JP	Z,PRINLF
	POP	HL
	LD	C,A		; TELL THE USER
	CALL	CONOUT		; TELL THE USER
FUNT5B: POP	AF		; RECOVER CHARACTER
	POP	DE		; RECOVER NEXT ADDRESS
	POP	BC		; RECOVER BUMP COUNTER
	POP	HL		; RECOVER LAST PLACE IN FBUF
	PUSH	HL		; SAVE IT AGAIN
	PUSH	DE		; SAVE NEXT ADDRESS
	LD	D,H
	LD	E,L
	INC	DE
	PUSH	AF
	PUSH	BC		; SAVE BUMP COUNTER
	LD	A,C
	OR	A
	JR	Z,FUNT58	; NOTHING TO MOVE
FUNT57: LD	A,(HL)		; MOVE REST OF FBUF
	LD	(DE),A
	DEC	HL
	DEC	DE
	DEC	C
	JR	NZ,FUNT57
FUNT58: POP	BC		; RECOVER VALUE OF BUMP COUNTER
	POP	AF		; RECOVER CHARACTER
	POP	DE		; RECOVER CHARACTER POINTER
	LD	(DE),A		; SAVE CHARACTER IN FBUF
	POP	HL		; RECOVER POSITION IN FBUF
	INC	HL		; NEXT
	PUSH	HL
	PUSH	DE
	LD	DE,FBUF+80H
	AND	A
	SBC	HL,DE
	LD	A,L
	OR	H
	POP	DE
	POP	HL
	JR	Z,BUFFYL	; NO SPACE IN BUFFER
	JR	FUNT56		; LOOP
FUNT60: POP	DE
	DEC	DE
	LD	A,(DE)
	OR	80H
	LD	(DE),A
	JP	FUNT35

BUFFYL: PUSH	HL
	PUSH	HL
	INC	DE
	PUSH	DE
	LD	HL,TXT8
	CALL	OUTTX
	JR	FUNT60

PRINLF: LD	HL,LFTAB
	JR	PRINCL
PRINCR:
	LD	HL,CRTAB
PRINCL: LD	DE,CHRBUF
	LD	BC,12
	LDIR
	CALL	PUTC04
	CALL	OUTCURSOR
	RET

LFTAB:
	DEFB	00000000B
	DEFB	00001000B
	DEFB	00001000B
	DEFB	00001000B
	DEFB	00001000B
	DEFB	00101010B
	DEFB	00011100B
	DEFB	00001000B
	DEFB	00000000B
	DEFB	00000000B
	DEFB	00000000B
	DEFB	00000000B

CRTAB:	DEFB	00000000B
	DEFB	00000000B
	DEFB	00010000B
	DEFB	00100000B
	DEFB	01111111B
	DEFB	00100000B
	DEFB	00010000B
	DEFB	00000000B
	DEFB	00000000B
	DEFB	00000000B
	DEFB	00000000B
	DEFB	00000000B


TXT1:	DEFB	27,'*',0AH,0AH
	DEFM	'Definering af funktionstaster'
	DEFB	0
TXT1A:	DEFB	0DH,0AH,0AH
	DEFM	'Angiv en funktionstast (F1/F2/F3/F4) ? '
	DEFB	0
TXT1B:	DEFB	0DH,0AH,0AH
	DEFM	'Skal "SHIFT" '
	DEFB	0
TXT1C:	DEFM	'også være nedtrykket (J/N) ? '
	DEFB	0
TXT1D:	DEFB	0DH,0AH,0AH
	DEFM	'SKAL "CTRL" '
	DEFB	0
TXT2:	DEFB	0DH,0AH,0AH,0
TXT3:	DEFM	'Funktionstast '
	DEFB	0
TXT4:
	DEFM	' giver teksten:'
	DEFB	0DH,0AH,0AH
	DEFB	0
TXT5:	DEFB	0DH,0AH,0AH
	DEFM	'Skal dette ændres (J/N) ? '
	DEFB	0
TXT6:	DEFB	0DH,0AH,0AH
	DEFM	'Andre taster (J/N) ? '
	DEFB	0
TXT7:	DEFB	0DH,0AH,0AH
	DEFM	'Indtast ny streng. Afslut med'
	DEFB	0DH,0AH
	DEFM	'tryk på "ESC" tasten!'
	DEFB	0DH,0AH,0AH
	DEFM	'? '
	DEFB	0
TXT8:	DEFB	0DH,0AH,0AH
	DEFB	27,'I'
	DEFM	'Buffer fyldt!'
	DEFB	27,'i'
	DEFB	0

AUTOST: LD	HL,TXT9
	CALL	OUTTX
	LD	C,0		; BUMP COUNTER
	LD	HL,HSTBUF+80+80H+1 ; ADDRESS FOR STRING
AUTO10: PUSH	HL
	PUSH	BC
	CALL	CONIN
	CP	27
	JR	Z,AUTO20
	CP	08H
	JR	Z,AUTO30
	PUSH	AF
	LD	HL,AUTO15
	PUSH	HL
	CP	0DH
	JP	Z,PRINCR
	CP	0AH
	JP	Z,PRINLF
	POP	HL
	LD	C,A
	CALL	CONOUT
AUTO15: POP	AF
	POP	BC
	POP	HL
	INC	C
	CP	41H
	JR	C,AUTO17
	CP	7EH
	JR	NC,AUTO17
	AND	01011111B
AUTO17: LD	(HL),A
	INC	HL
	JP	AUTO10
AUTO20: POP	BC
	POP	HL
	XOR	A
	LD	(HSTBUF+4),A
	LD	A,C
	LD	(HSTBUF+80+80H),A
	JP	CONF01
AUTO30: LD	C,A
	CALL	CONOUT
	POP	BC
	POP	HL
	DEC	C
	DEC	HL
	JR	AUTO10

TXT9:	DEFB	27,'*',0AH,0AH
	DEFM	'Indtast navn for det program, som skal'
	DEFB	0DH,0AH
	DEFM	'starte automatisk efter indlæsning af CP/M.'
	DEFB	0DH,0AH,0AH
	DEFM	'Afslut med tryk på "ESC" tasten'
	DEFB	0DH,0AH
	DEFM	'?'
	DEFB	0

SLETIN:
	LD	A,0E5H
	LD	HL,HSTBUF
	LD	DE,HSTBUF+1
	LD	BC,511
	LD	(HL),A
	LDIR
	JP	CONF01

TASBUF: LD	HL,TXT10
	CALL	OUTTX
	CALL	CONIN
	PUSH	AF
	LD	C,A
	CALL	CONOUT
	POP	AF
	AND	01011111B
	CP	'J'
	JP	NZ,TASB10
	LD	A,0FFH
	JR	TASB20
TASB10: CP	'N'
	JR	NZ,TASBUF
	XOR	A
TASB20: LD	(TASTBU),A
	LD	(HSTBUF+5),A
	JP	CONF01

TXT10:	DEFB	27,'*',0AH
	DEFM	'Skal tastaturbuffer være aktiv (J/N) ? '
	DEFB	0


ESCb:	LD	A,(ESCBUF+3)
	CP	'N'
	JR	NZ,ESCb10
	LD	A,00010100B
	OUT	(DARTAC),A
	LD	A,01001100B
	OUT	(DARTAC),A
	JP	CON900
ESCb10: CP	'U'
	JR	NZ,ESCb20
	LD	A,00010100B
	OUT	(DARTAC),A
	LD	A,01001101B
	OUT	(DARTAC),A
	JP	CON900
ESCb20: CP	'L'
	JR	NZ,ESCb30
	LD	A,00010100B
	OUT	(DARTAC),A
	LD	A,01001111B
	OUT	(DARTAC),A
	JP	CON900
ESCb30: CP	'O'
	JR	NZ,ESCb40
	LD	A,00010011B		; REG 3
	OUT	(DARTAC),A
	LD	A,11000001B		; DATA FOR 3
	OUT	(DARTAC),A
	LD	A,00010101B		; REG 5
	OUT	(DARTAC),A
	LD	A,11101010B		; DATA FOR 5
	OUT	(DARTAC),A
	JP	CON900
ESCb40: CP	'S'
	JR	NZ,ESCb50
	LD	A,00010011B		; REG 3
	OUT	(DARTAC),A
	LD	A,01000001B
	OUT	(DARTAC),A
	LD	A,00010101B
	OUT	(DARTAC),A
	LD	A,10101010B
	OUT	(DARTAC),A
	JP	CON900
ESCb50: CP	'0'
	JR	NZ,ESCb60
	LD	A,00101000B
	LD	(BUSYLI),A
	JP	CON900
ESCb60: CP	'1'
	JR	NZ,ESCb70
	XOR	A
	LD	(BUSYLI),A
	JP	CON900
ESCb70: LD	HL,BAUDTA
	LD	A,(ESCBUF+3)
	CP	10
	JP	NC,CON900
	ADD	A,A
	LD	C,A
	LD	B,0
	ADD	HL,BC
	LD	A,00110100B
	OUT	(BAUDC),A
	LD	A,(HL)
	OUT	(BAUD0),A
	INC	HL
	LD	A,(HL)
	OUT	(BAUD0),A
	JP	CON900
;
; CONSTANTS FOR BAUD RATE DIVIDER
;
; BASED ON THAT THE DART DIVIDES BY 16
;
BAUDTA: DEFW	1		; 125000 BAUD := 0
	DEFW	2		;  62500 BAUD := 1
	DEFW	7		;  19200 BAUD := 2
	DEFW	13		;   9600 BAUD := 3
	DEFW	26		;   4800 BAUD := 4
	DEFW	52		;   2400 BAUD := 5
	DEFW	104		;   1200 BAUD := 6
	DEFW	208		;    600 BAUD := 7
	DEFW	416		;    300 BAUD := 8
	DEFW	1136		;    110 BAUD := 9



CTCINI:
	LD	HL,CTCINT+OFFSET
	LD	(INTCTC),HL
	LD	A,11010101B	; MODE WORD FOR CTC 0
	OUT	(CTC0),A
	LD	A,55		; COUNTER VALUE
	OUT	(CTC0),A
	LD	HL,INTCTC
	LD	A,L
	AND	11111000B	; SET INT VECTOR
	OUT	(CTC0),A
	LD	HL,KEYINT+OFFSET
	LD	(INTCTC+2),HL
	XOR	A
	LD	(SECOND),A
	LD	(MINUTE),A
	LD	(HOUR),A
	LD	(DAY),A
	LD	(MONTH),A
	LD	(YEAR),A
	LD	(MOTORF),A
	LD	(VISF),A
	LD	A,20
	LD	(MOTOR1),A
	RET
DARINI:
	LD	A,00110100B
	OUT	(BAUDC),A
	LD	HL,104		; DEFAULT 1200 BAUD FOR SERIAL
	LD	A,L		; CHANNEL
	OUT	(BAUD0),A
	LD	A,H
	OUT	(BAUD0),A
	LD	A,01110100B
	OUT	(BAUDC),A
	LD	HL,104		; DEFAULT 1200 BAUD FOR TAPE
	LD	A,L		; CHANNEL
	OUT	(BAUD1),A
	LD	A,H
	OUT	(BAUD1),A
	LD	A,10110110B
	OUT	(BAUDC),A
	LD	HL,416		; 4800 HZ FOR TAPE CHANNEL
	LD	A,L
	OUT	(BAUD2),A
	LD	A,H
	OUT	(BAUD2),A
	LD	C,DARTAC
	LD	A,00011000B	; REG 0
	OUT	(C),A
	LD	A,00010100B	; REG 4
	OUT	(C),A
	LD	A,01001100B	; DATA FOR REG 4
	OUT	(C),A
	LD	A,00010011B	; REG 3
	OUT	(C),A
	LD	A,11000001B	; DATA FOR REG 3
	OUT	(C),A
	LD	A,00010101B	; REG 5
	OUT	(C),A
	LD	A,11101010B	; DATA FOR REG 5
	OUT	(C),A
	LD	A,00101000B
	LD	(BUSYLI),A
	RET

PIOINI:
	LD	A,1H
	LD	(MODE),A
	XOR	A
	LD	(PRINTE),A	; SELECT TAXAN PRINTER
	LD	HL,CONINT+OFFSET ; INITIATE PIO
	LD	(INTPIO),HL	; SET UP INTERRUPT
	LD	HL,INTPIO	; GET LOW BYTE
	LD	A,L		; MOVE IT TO A
	OUT	(KBPIOC),A	; PLACE IN PIO
	LD	HL,SCRCLR+OFFSET
	LD	(INTPIO+2),HL
	LD	HL,INTPIO+2
	LD	A,L
	OUT	(PIOBC),A
	LD	A,0CFH		; A:=11001111B
	OUT	(KBPIOC),A	; SET MODE 3 IN CHANNEL A
	LD	A,0FFH		; I/O CONTROL WORD
				; ALL BITS IN CHANNEL A
	OUT	(KBPIOC),A	; SET TO INPUT
	LD	A,00010111B	; INTERRUPT CONTROL WORD
				; SET: NO INTERRUPT BIT 7=0
				;      INTERRUPT ON OR BIT 6=0
				;      ACTIVE LEVEL LOW BIT 5=0
				;      MASK FOLLOWS BIT 4=1
	OUT	(KBPIOC),A	;      BIT 0-3 IDENTIFIERS
	LD	A,11000001B	; MASK CONTROL WORD
	OUT	(KBPIOC),A	; BIT 1-5 ACTIVE IN INTERRUPT
	LD	A,10000011B	; ENABLE INTERRUPT BIT 7=1
	OUT	(KBPIOC),A
	LD	A,4
	LD	(KEYCO1),A
	LD	A,07		; PROGRAM 8910
	OUT	(KB89A),A	; SET REGISTER 7
	LD	A,0C0H		; ENABLE I/O CHANNALS A AND B
	OUT	(KB89D),A	; TO OUTPUT
	LD	A,0EH		; SET REGISTER 14
	OUT	(KB89A),A
	XOR	A		; SET ALL OUTPUTS TO 0
	OUT	(KB89D),A
	LD	A,0FH		; SET REGISTER 15
	OUT	(KB89A),A
	XOR	A		; SET ALL OUTPUTS TO 0
	OUT	(KB89D),A
	LD	A,0CFH		; PROGRAM CHANNEL B IN PIO
	OUT	(PIOBC),A	; TO BIT MODE
	LD	A,0FDH		; 11111101B
	OUT	(PIOBC),A	; ALL LINES INPUT EXCEPT BIT 1
				; WHICH IS STROBE FOR PRINTER
	LD	A,37H		; INTERRUPT CONTROL WORD
	OUT	(PIOBC),A	; INTERRUPT DISABLED BIT 7=0
				; INTERRUPT ON OR BIT 6=0
				; ACTIVE LEVEL HIGH BIT 5=1
				; MASK FOLLOWS BIT 4=1
	LD	A,07FH		; INTERRUPT MASK
	OUT	(PIOBC),A	; LINE 7 ONLY
	LD	A,0FFH		; SET OUTPUT (BIT 1)
	OUT	(PIOBD),A
	RET
INTINI:
	LD	HL,INTPIO
	LD	A,H
	LD	I,A
	IM	2
	RET


VALGPR: LD	HL,TXT11
	CALL	OUTTX
VALG05: CALL	CONIN
	PUSH	AF
	LD	C,A
	CALL	CONOUT
	POP	AF
	CP	31H
	JR	Z,VALG10
	CP	32H
	JR	Z,VALG10
	LD	HL,TXT11A
	CALL	OUTTX
	JR	VALG05
VALG10: SUB	31H
	LD	(HSTBUF+9),A
	LD	(PRINTE),A
	LD	HL,TXT12
	CALL	OUTTX
	CALL	CONIN
	SUB	30H
	LD	(HSTBUF+11),A
	XOR	A
	LD	(HSTBUF+10),A
	JP	CONF01

TXT11:	DEFB	27,'*',0AH
	DEFM	'Der kan vælges mellem:'
	DEFB	0DH,0AH,0AH
	DEFM	'1. TAXAN/EPSON'
	DEFB	0DH,0AH
	DEFM	'2. OKI 82'
	DEFB	0AH
TXT11A: DEFB	0DH,0AH
	DEFM	'Hvilken ønskes (1/2) ? '
	DEFB	0
TXT12:	DEFB	0DH,0AH,0AH
	DEFM	'Hvilken mode ? '
	DEFB	0

STX	EQU	 02
ETX	EQU	 03
SO	EQU	 14




ESCHO:	LD	A,(ESCBUF+3)
	LD	(MODE),A
	LD	HL,STRENA	; SET CONDENSED MODE
	LD	B,STRENB-STRENA
ESCH1O:
	LD	C,(HL)
	CALL	DOLIST
	INC	HL
	DJNZ	ESCH1O
	LD	A,(LINESPACE)	; SAVE LINESPACE
	PUSH	AF
	LD	A,8
	LD	(LINESPACE),A
	LD	B,30
	LD	HL,(CRTSTA)
ESCH3O: PUSH	BC		; SAVE B (LINE COUNTER)
	PUSH	HL		; save vidadr for part 2
	PUSH	HL		; SAVE ADDRESS IN VIDEO
	LD	C,ETX		; SET GRAPHIC MODE
	CALL	DOLIST
	LD	A,(PIXHO1)
	LD	B,A
	POP	HL		; RECOVER ADDRESS IN VIDEO

ESCH6O: 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

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

	LD	HL,ESCBUF+3	; NEW PLACE FOR DATA
	LD	B,8		; BYTE COUNTER
ESCH1B: LD	C,(HL)		; MOVE DATA TO C
	CALL	DOLIST		; PRINT IT OUT
	LD	A,(HL)		; IF BYTE=ETX
	CP	ETX		;   WRITE(LST:,BYTE);
	JR	NZ,ESCH1A	; ENDIF
	LD	C,A		;
	CALL	DOLIST		;
ESCH1A: INC	HL		; NEXT
	DJNZ	ESCH1B		; 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	ESCH6O		; LOOP FOR REST OF THE LINE
	LD	C,ETX		; EXIT GRAPHIC MODE
	CALL	DOLIST		;
	LD	C,STX		;
	CALL	DOLIST		;
	LD	C,CR		; CARRIAGE RETURN
	CALL	DOLIST		;
	LD	C,ESC		; SKIP 14/144 ''
	CALL	DOLIST		;
	LD	C,'%'		;
	CALL	DOLIST		;
	LD	C,'9'		;
	CALL	DOLIST		;
	LD	C,0EH		;
	CALL	DOLIST		;
	LD	C,ETX		; SET GRAPHIC MODE
	CALL	DOLIST		;
	POP	HL		; PART 2 - get vidadr
	LD	A,(PIXHO1)	;
	LD	B,A		;

AH6:	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

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

	LD	HL,ESCBUF+3	; NEW PLACE FOR DATA
	LD	B,8		; BYTE COUNTER
AH10:	LD	C,(HL)		; MOVE DATA TO C
	CALL	DOLIST		; PRINT IT OUT
	LD	A,(HL)		; IF BYTE=ETX
	CP	ETX		;   WRITE(LST:,BYTE);
	JR	NZ,AH1A 	; ENDIF
	LD	C,A		;
	CALL	DOLIST		;
AH1A:	INC	HL		; NEXT
	DJNZ	AH10		; 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	AH6		; LOOP FOR REST OF THE LINE
	PUSH	HL		; SAVE ADDRESS IN VIDEO
	LD	C,ETX		; EXIT GRAPHIC MODE
	CALL	DOLIST		;
	LD	C,STX		;
	CALL	DOLIST		;
	LD	C,CR		; CARRIAGE RETURN
	CALL	DOLIST		;
	LD	C,ESC		;
	CALL	DOLIST		;
	LD	C,'%'		;
	CALL	DOLIST		;
	LD	C,'9'		;
	CALL	DOLIST		;
	LD	C,02H		;
	CALL	DOLIST		;
	LD	B,6		;
	LD	DE,(PIXHO1)	;
	LD	HL,0
AH15:	ADD	HL,DE
	DJNZ	AH15
	EX	DE,HL
	POP	HL
	ADD	HL,DE
	POP	BC		; RECOVER LINE COUNTER
	DEC	B		;
	JP	NZ,ESCH3O	 ;
				;DJNZ	 ESCH3
				; PART 2 finished
	POP	AF		; RESTORE LINESPACE

	LD	(LINESPACE),A	; RESTORE LINESPACE
	LD	C,CR
	CALL	DOLIST
	LD	C,30		;NORMAL MODE
	CALL	DOLIST		;
	LD	C,CR
	CALL	DOLIST
	LD	C,LF
	CALL	DOLIST

	POP	AF
	LD	(VISF),A
	JP	CON900		;


STRENA: DEFB	29		;condensed mode
	DEFB	CR
	DEFB	LF
STRENB:


DOLIST: JP	LIST

FUNCST: DEFM	'COMAL-80'
	DEFB	8DH		; RETURN WITH BIT 7 = 1
	DEFM	'COMAL80S'
	DEFB	8DH
	DEFM	'RUN'
	DEFB	8DH
	DEFB	80H
	DEFB	80H
	DEFB	80H
	DEFB	80H
	DEFB	80H
	DEFB	80H
	DEFB	80H
	DEFB	80H
	DEFB	80H
	DEFB	80H
	DEFB	80H
	DEFB	80H
	DEFB	80H
FUNCS1:



▶04◀▶04◀
▶ff◀▶04◀▶04◀H
FUNCS1:


▶ff◀▶04◀▶04◀:


▶ff◀▶04◀▶04◀S1:


▶ff◀«eof»