Source file: /~heha/hs/kcemu/kcswberg.zip/DISK/PLOT16.ASM

PLOT16  ASM;PLOT16.ASM	f}r XY4140
;********************
;
;PLOTTER-TREIBER V1.D
;
;haftmann#software AD
;
;********************
 
;Programmadresse
 
BEGIN	EQU 7000H;ROM-f{hig
 
;Arbeitszellenadresse
 
WS	EQU 0	 ;NICHT in IRM legen!
 
;Vereinbarungen
 
CTCStw	EQU 0A7H ;hier Zeitgeber VT256
CTC	EQU 08CH ;hier System-CTC0
PIO	EQU 091H ;M021-PIO B (JOY+CEN)
Prol	EQU 7F7FH;hier CAOS-Prolog
OS	EQU 0F003H ;PV I
NULL	EQU 0
STRUKB	EQU 0FFH ;Modulstrukturbyte
 
 
;Arbeitszellen
 
;...mit Default
POSX	EQU WS+0 ;X-Position
POSY	EQU WS+2 ;Y-Position
MAXSOP	EQU WS+4 ;MaxSpeed ohne Stift
MAXS	EQU WS+5 ;	"   mit	Stift
PANF	EQU WS+6 ;Pufferanfang
PEND	EQU WS+8 ;Pufferende
 
;...ohne Default
ZPOSX	EQU WS+10;X-Zielposition
ZPOSY	EQU WS+12;Y-Zielposition
PENNR	EQU WS+14;Stift-Nr (0=kein Pen)
STATUS	EQU WS+15;BUSY-Status 0=ready
 
DIRX	EQU WS+16;X-Richtung (1,0,-1)
DIRY	EQU WS+18;Y-Richtung (1,0,-1)
COUNT	EQU WS+20;Punktez{hler
AKTSPD	EQU WS+22;AktSpeed
MASTER	EQU WS+23;Master-Flag (>0..Y)
ANSTIEG	EQU WS+24;f}r Gerade
SLAVE	EQU WS+26;zum Aufaddieren
MAXSPD	EQU WS+28;MaxSpeed
PFST	EQU WS+30;Pufferf}llstand
LASTPEN	EQU WS+32;Letzte Stiftfarbe
WSE	EQU WS+33;Workspace-Ende
 
	ORG	BEGIN
 
;Sprungtabelle f}r BASIC
	JP	BINIT
	JP	BCURSOR
	JP	LINE
	JP	PLTOT
	JP	HPGLI
	;(Kanal #1 ge|ffnet)
;Inittabelle
INIEA	DEFB	3	;Kan{le
 
	DEFB	PIO
	DEFB	1
	DEFB	7FH
 
 
	DEFB	PIO+2
	DEFB	4
	DEFB	0FH	;Byte-Ausgabe
	DEFB	0FFH	;Bit-E/A
	DEFB	20H	;Bit 5=IN
	DEFB	3	;DI
 
 
	DEFB	CTC
	DEFB	2
	DEFB	3
	DEFB	3	;doppelt
 
SPDTAB	;Geschwindigkeitstabelle
	DEFB	190
	DEFB	120
	DEFB	70
	DEFB	46
	DEFB	33
	DEFB	26
	DEFB	21
	DEFB	17
	DEFB	13
	DEFB	11
	DEFB	9
	DEFB	8
	DEFB	7
SPDTABE	DEFB	6
;Defaultbelegung Workspace
DEFAULT	DEFW	NULL
	DEFW	NULL
	DEFB	SPDTABE-SPDTAB
	DEFB	SPDTABE-SPDTAB
	DEFW	PGME	;Pufferanf
	DEFW	7800H	;Pufferende
DEFAULE
 
;Tabelle Zuordnung Taste-Routine
;f}r CURSOR	(Aufbau: Byte/Adresse)
TASTT	DEFB	8
	DEFW	CUL
	DEFB	9
	DEFW	CUR
	DEFB	10
	DEFW	CUD
	DEFB	11
	DEFW	CUU
	DEFB	11H
	DEFW	SCUU
	DEFB	12H
	DEFW	SCUD
	DEFB	18H
	DEFW	SCUR
	DEFB	19H
	DEFW	SCUL
	DEFB	'C'
	DEFW	CHECK
	DEFB	'H'
	DEFW	PENUP
	DEFB	'S'
	DEFW	PDOWN
	DEFB	'0'-20H
	DEFW	SNULL
	DEFB	'I'
	DEFW	INIT
	DEFB	'T'
	DEFW	PLTOT
	DEFB	3
	DEFW	ENDCRLF
	DEFB	0DH
	DEFW	ENDCRLF
	DEFB	'R'
	DEFW	SRAND
	NOP	;Abschlu~byte
;Programme
 
BINIT	;mit IRM-Switch
	CALL	0F018H
	CALL	INIT
	CALL	CHECK
	CALL	SRAND
CLOS	CALL	0F01BH
	RET
BCURSOR	CALL	0F018H
	CALL	CURSOR
	JR	CLOS
 
INIT	;IO-Modul suchen und einschalt.
	LD	BC,680H
INI1	INC	B
	JR	Z,NGEF
	IN	A,(C)
	CP	STRUKB
	JR	NZ,INI1
	LD	A,1
	OUT	(C),A
	LD	H,0B8H
	LD	L,B
	LD	M,A
NGEF	DI
	LD	HL,ISRCTC
	LD	(IX-8),L
	LD	(IX-7),H
	EI
 
	LD	HL,DEFAULT
	LD	DE,WS
	LD	BC,DEFAULE-DEFAULT
	LDIR	;WS-Grundbel.kopieren
	LD	HL,INIEA
	LD	D,M	;Anzahl
	INC	HL
	CALL	OS
	DEFB	44H	;INIME
	LD	HL,(PANF)
	LD	(PFST),HL
	XOR	A
	LD	(STATUS),A
	PUSH	AF
	JP	INIT1
 
 
PLTOT	;Plotter hard-u. softwarem{~ig
	;ausschalten
	LD	A,3
	OUT	CTC
	LD	A,4FH;Eingabe:hochohmig
	OUT	PIO+2
	RET
 
DSTEPX	;DirectionStep
	LD	DE,(DIRX)
STEPX	;UP Tue 1 Schritt in X-Richtung
	;DE=1	vorw{rts
	;DE=-1	r}ckw{rts
	;(DE=0	keinen Schritt)
	;VR:-
	PUSH	AF
	PUSH	HL
	LD	HL,(POSX)
	ADD	HL,DE
	LD	(POSX),HL
	POP	HL
	LD	A,E
	OR	A
	JR	Z,STXN
	INC	A
	JR	Z,STXD
	;Step X	up
	IN	A,PIO
	AND	0C0H
	OR	1
	OUT	PIO
	OR	4
	OUT	PIO
	JR	STXN
	;Step X down
STXD	IN	A,PIO
	AND	0C0H
	OUT	PIO
	OR	4
	OUT	PIO
STXN	POP	AF
	RET
 
DSTEPY	LD	DE,(DIRY)
STEPY	;UP Tue 1 Schritt in Y-Richtung
	;Kommentare analog
	PUSH	AF
	PUSH	HL
	LD	HL,(POSY)
	ADD	HL,DE
	LD	(POSY),HL
	POP	HL
	LD	A,E
	OR	A
	JR	Z,STYN
	INC	A
	JR	Z,STYD
	;Step Y up
	IN	A,PIO
	AND	0C0H
	OR	2
	OUT	PIO
	OR	4
	OUT	PIO
	JR	STYN
STYD	;Step Y down
	IN	A,PIO
	AND	0C0H
	OR	3
	OUT	PIO
	OR	4
	OUT	PIO
STYN	POP	AF
	RET
 
	DEFW	Prol
	DEFM	'PLCURS'
	DEFB	1
CURSOR	CALL	OS
	DEFB	23H
	DEFW	0A0CH	;CLS
 DEFM 'Steuerung des Plotters mit '
 DEFM 'Cursortasten bzw. mit '
 DEFM 'Shift+Cursortasten.'
	DEFW	0D0AH
 DEFM ' 0  Nullsetzen'
	DEFW	0D0AH
 DEFM ' C  Checkup'
	DEFW	0D0AH
 DEFM ' I  Initialisierung'
	DEFW	0D0AH
 DEFM ' T  Totlegen'
	DEFW	0D0AH
 DEFM ' H  Stift heben'
	DEFW	0D0AH
 DEFM ' S  Stift senken'
	DEFW	0D0AH
 DEFM ' R  R{nder absuchen'
	DEFW	0D0AH
 DEFM 'BRK Abbruch'
	DEFW	0D0AH
	NOP
	PUSH	AF
	PUSH	HL
	PUSH	DE
	PUSH	BC
	CALL	OS
	DEFM	'#Koordinaten (X,Y): '
	NOP
 
PWRDOWN
SCHL	LD	HL,(POSX)
	LD	DE,(POSY)
	LD	BC,(0B7A0H)
	CALL	OS	;Pos. ausgeben
	DEFB	1BH
	LD	(0B7A0H),BC
	;
	CALL	OS
	DEFB	16H
	RES	5,A
	LD	C,A
	LD	HL,SCHL
	PUSH	HL	;R}ckkehradresse
	LD	HL,TASTT-2
SUCH	INC	HL
	INC	HL
	LD	A,M
	INC	HL
	OR	A
	RET	Z	;falsche Taste
	CP	C
	JR	NZ,SUCH
	LD	A,M
	INC	HL
	LD	H,M
	LD	L,A
	JP	(HL)
 
SNULL	LD	HL,NULL
	LD	(POSX),HL
	LD	(POSY),HL
	RET
 
SCUL	SET	0,(IX+8)
CUL	LD	DE,-1
	JP	STEPX
 
SCUR	SET	0,(IX+8)
CUR	LD	DE,1
	JP	STEPX
 
SCUD	SET	0,(IX+8)
CUD	LD	DE,-1
	JP	STEPY
 
SCUU	SET	0,(IX+8)
CUU	LD	DE,1
	JP	STEPY
 
CHECK	PUSH	AF
CHEK1	IN	A,PIO
	RES	6,A
	OUT	PIO
	SET	6,A
	OUT	PIO
	IN	A,PIO
	BIT	5,A
	JR	Z,XLTRAG
	CALL	CUL
	LD	B,0
CHEK2	DJNZ	CHEK2
	JR	CHEK1
XLTRAG	LD	HL,(POSX)
	LD	(ZPOSX),HL
	POP	AF
	RET
 
ENDCRLF	CALL	OS
	DEFB	2CH
	POP	HL;Return-Ebene }berjp
	POP	BC
	POP	DE
	POP	HL
	POP	AF
	RET
 
 
PENUP	PUSH	AF
	IN	A,PIO
	RES	7,A
	OUT	PIO
INIT1	LD	A,(MAXSOP)
	JR	MAXSET
 
PDOWN	PUSH	AF
	IN	A,PIO
	SET	7,A
	OUT	PIO
	LD	A,(MAXS)
 
MAXSET	LD	(MAXSPD),A
	POP	AF
	RET
 
SRAND	;Suche Rand
	PUSH	AF
SRAN2	IN	A,PIO
	RES	6,A
	OUT	PIO
	SET	6,A
	OUT	PIO
	IN	A,PIO
	BIT	5,A
	JR	NZ,XRTRAG
	CALL	CUR
	LD	B,0	;warten
SRAN1	DJNZ	SRAN1
	JR	SRAN2
XRTRAG	LD	HL,(POSX)
	LD	(ZPOSY),HL
	JR	CHEK1
 
COMP	;Vergleiche HL,DE
	PUSH	HL
	OR	A
	SBC	HL,DE
	POP	HL
	RET
 
DRAWTO1	;HL=X-,DE=Y-Ziel
	PUSH	DE
	LD	DE,(POSX)
	CALL	COMP	;Vorzeichen?
	LD	BC,1
	JP	P,VORX
	DEC	C
	DEC	BC
	EX	DE,HL
VORX
	LD	(DIRX),BC
	OR	A
	SBC	HL,DE	;vzl
	EX	(SP),HL	;altes DE
	LD	DE,(POSY)
	CALL	COMP
	LD	BC,1
	JP	P,VORY
	DEC	C
	DEC	BC
	EX	DE,HL
VORY
	LD	(DIRY),BC
	OR	A
	SBC	HL,DE	;vzl
			;HL=Y-Steps
	POP	DE	;x-Steps
	 PUSH	HL
	 ADC	HL,DE
	 POP	HL
	 RET	Z	;Null Punkte
	EX	DE,HL;DE=Steps in Y-Dir
	CALL	COMP
	;Cy=1:DE>HL:Y=Master,(MASTER)=FF
	;Z =1:DE=HL:Anstieg=FFFF
	JR	Z,W45
	SBC	A	;0 od.FF
	LD	(MASTER),A
	JR	C,MASTY
	EX	DE,HL
MASTY
	LD	(COUNT),DE
	CALL	DIVI	;IY:=HL/DE
	PUSH	IY
	POP	HL
	JR	NW45
W45
	LD	(COUNT),HL
	LD	HL,0FFFFH
NW45
	LD	(ANSTIEG),HL
	SRL	H
	RR	L
	LD	(SLAVE),HL
	XOR	A
	INC	A
	RET	;PA:Z=1:keine Linie
 
DIVI	;16bit-Division IY:=HL/DE,HL<DE
	LD	B,16
DIV1	ADD	HL,HL
	JR	C,DIV3
	CALL	COMP
	JR	NC,DIV3
	ADD	IY,IY
	JR	DIV2
DIV3	OR	A
	SBC	HL,DE
	ADD	IY,IY
	INC	IY
DIV2	DJNZ	DIV1
	RET
 
ISRH	EI
	RETI
 
;***********************
ISRCTC
	PUSH	AF
	LD	A,3
	OUT	CTC	;STOP
	CALL	ISRH
	PUSH	HL
	PUSH	DE
	PUSH	BC
	LD	HL,(COUNT)
	LD	A,H
	OR	L
	JR	Z,DRAWRDY
	DEC	HL
	LD	(COUNT),HL
 
	LD	A,CTCStw
	OUT	CTC
	LD	A,(MAXSPD)
	LD	D,A
	LD	A,(AKTSPD)
	CP	D	;A>D?
	JR	NC,NINC	;ja
	INC	A
NINC
	INC	H
	DEC	H	;H=0?
	JR	NZ,NLOW
	CP	L	;A>L?
	JR	C,NLOW
	LD	A,L ;IF A>L THEN A:=L
NLOW
	LD	(AKTSPD),A
	LD	D,0
	LD	E,A
	LD	HL,SPDTAB
	ADD	HL,DE
	LD	A,M
	OUT	CTC
 
	LD	A,(MASTER)
	OR	A
	CALL	Z,DSTEPX
	CALL	NZ,DSTEPY
	LD	HL,(SLAVE)
	LD	DE,(ANSTIEG)
	ADD	HL,DE
	LD	(SLAVE),HL
	JR	NC,NSLAV
	OR	A
	CALL	Z,DSTEPY
	CALL	NZ,DSTEPX
NSLAV
	POP	BC
	POP	DE
	POP	HL
	POP	AF
	RET
 
DRAWRDY	LD	HL,(PANF)
	LD	DE,(PFST)
	CALL	COMP
	JR	Z,BRKCTC
	LD	C,M
	INC	HL
	LD	B,M	;BC=ZPOSX
	INC	HL
	LD	E,M
	INC	HL
	LD	D,M	;DE=ZPOSY
	INC	HL
	LD	A,M	;A=PENNR
	INC	HL
	PUSH	DE
	PUSH	BC
	 EX	DE,HL
	 LD	HL,(PFST);L{nge Umladen
	 OR	A
	 SBC	HL,DE
	 LD	B,H
	 LD	C,L
	 LD	HL,(PANF)
	 EX	DE,HL
	 JR	Z,NLDIR
	 LDIR
NLDIR
	 LD	(PFST),DE
	POP	HL
	POP	DE
	PUSH	AF
	DI
	LD	A,CTCStw
	OUT	CTC
	LD	A,256
	OUT	CTC
	EI
	POP	AF
	DEC	A
	CALL	Z,PDOWN
	CALL	NZ,PENUP
	PUSH	IY
	CALL	DRAWTO1
	POP	IY
	JP	Z,DRAWRDY
	JR	NSLAV
 
BRKCTC	XOR	A
	LD	(STATUS),A
	CALL	PENUP
	JR	NSLAV
;Ende ISRCTC
;************************
	DEFW	Prol
	DEFM	'PLDRAWTO'
	DEFB	1
DRAWTO	LD	(ZPOSX),HL
	LD	(ZPOSY),DE
	LD	A,C
	LD	(PENNR),A
 
LINE	;PE:ZPOSX,ZPOSY,PENNR
	PUSH	AF
	PUSH	HL
	PUSH	DE
	PUSH	BC
FI1	LD	DE,(PFST);Platz testen
	INC	DE	;5 Bytes
	INC	DE
	INC	DE
	INC	DE
	INC	DE
	LD	HL,(PEND)
	CALL	COMP
	JR	C,FI1	;warten
	;
	DI
	LD	DE,(PFST)
	LD	HL,ZPOSX
	LD	BC,5
	LDIR
	LD	(PFST),DE
	LD	A,(STATUS)
	OR	A
	JR	NZ,NPROG
	LD	A,CTCStw;CTC anwerfen
	OUT	CTC
	LD	A,255
	OUT	CTC
	LD	(STATUS),A
	LD	HL,0
	LD	(COUNT),HL
NPROG
	EI
	POP	BC
	POP	DE
	POP	HL
	POP	AF
	RET
 
	DEFW	Prol
	DEFM	'PLTEST'
	DEFB	1
	LD	HL,400H
	LD	DE,20H
	LD	C,1
	CALL	DRAWTO
	LD	HL,480H
	LD	DE,0FF00H
	LD	C,1
	CALL	DRAWTO
	LD	HL,380H
	LD	DE,0FD00H
	LD	C,1
	CALL	DRAWTO
	LD	HL,20H
	LD	DE,0FD00H
	LD	C,1
	CALL	DRAWTO
	LD	HL,0
	LD	DE,0
	LD	C,0
	CALL	DRAWTO
	CALL	OS
	DEFB	23H
	DEFB	0BH
	NOP
	RET
HPGLI	;HPGL-Interpreter (DISK!)
	call	inchr
loopi
	call	deli1
	and	5fh
	cp	'S'
	jr	nz,cmd1
	call	inchr
	and	5fh
	cp	'P'
	JR	nz,cmdx
	call	inval
	LD	H,A
	LD	A,L
	OR	A
	RET	Z	;ENDE
	LD	A,(LASTPEN)
	OR	A
	JR	Z,CMDX1
	CP	L
	JR	Z,CMDX1
	LD	A,L
	LD	(LASTPEN),A
	call    newpen
	jr	cmdx1
CMD1
	cp	'P'
	jr	nz,cmdx
	call	inchr
	and	5fh
	cp	'U'
	jr	nz,cmd2
	xor	a
pnnrx	ld	(pennr),a
	jr	cmdY
cmd2	cp	'D'
	jr	nz,cmd3
	ld	a,1
	jr	pnnrx
cmd3	cp	'A'
	jr	nz,cmdx
CMDY
	call	inchr
	CP	','
	JR	Z,CMDY
	call	deli1
	call	ntest
	jr	c,cmdx
	call	inval0
	SRL	H
	RR	L
	SRL	H
	RR	L
	ld	(zposx),hl
	call	inval
	SRL	H
	RR	L
	SRL	H
	RR	L
	ld	(zposy),hl
	call	line
	call	deli1
	cp	','
	jr	z,cmdy
CMDX	LD	H,A
CMDX1	LD	A,H
	call	semik
	LD	D,A
	LD	E,2AH
	CALL	0F015H
	LD	A,D
	jp	nc,loopi
	RET
;delim	;hinter Wei~raum fahren
;	cp	21h
;	jr	nc,deli1
;	call	inchr
;	jr	delim
deli1	cp	21h
	ret	nc
	call	inchr
	jr	deli1
semik	;hinter Semikolon fahren
	CP	';'
	jr	Z,SEMI1
	call	inchr
	jr	semik
semi1	CP	';'
	ret	NZ
	call	inchr
	jr	semi1
inchr	;Zeicheneingabe von #1
	push	hl
	push	de
	ld	de,37h
npx	call	0f015h
	pop	de
	pop	hl
	ret
ntest	;Test A auf Ziffer
	;und ggf. numerisch wandeln
	cp	30h
	ret	c
	cp	3ah
	ccf
	ret	c
	sub	30h
	ret
inval	;dez. Wert einlesen
invl1	call	inchr
	call	ntest
	jr	c,invl1
inval0	ld	hl,0
invl2	add	hl,hl
	ld	d,h
	ld	e,l
	add	hl,hl
	add	hl,hl
	add	hl,de
	ld	d,0
	ld	e,a
	add	hl,de
	call	inchr
	call	ntest
	jr	nc,invl2
	ret
newpen	;Neuer Stift
	push	hl
	push	de
	ld	hl,msgnp
	push	af
	ld	e,45h	;zkout
	call	0f015h
	ld	e,1ch
	pop	af
	call	0f015h	;ahex
	ld	e,16h
	call	0f015h	;Tastatur
	ld	e,2ch	;Newline
	jr	npx
msgnp	db	'Neuer Stift #',0
PGME
Éu
PGME:»u
MSGNP:¡u
NEWPEN:Žu
INVL2:‹u
INVAL0:ƒu
INVL1:ƒu
INVAL:yu
NTEST:	;Newline
	jr	npx
msgnp	db	'Neuer Stift #',0
PGME
Éu
PGME:»u
MSGNP:¡u
NEWPEN:Žu
INVL2:‹u
INVAL0:ƒu
INVL1:ƒu
INVAL:yu
NTEST:
Detected encoding: ANSI (CP1252)4
Wrong umlauts? - Assume file is ANSI (CP1252) encoded