* VT52-Terminal-Emulator
* Jens Mller 1991
* Es werden alle alphanumerischen-, Kursor- und alle Funktionstasten
* sowie Escape und Home gesendet


        OUTPUT  .ACC

	include "D:\GEMMACRO.S"
	include "D:\GEMDOS_N.S"

esc	equ	27


	section text

	move.l	#mystack,sp

	appl_init
	move.w	d0,ap_id
	menu_register	ap_id,#mymenu
	move.w	#1,duplex		* 1=Voll, 2=Halb

* Hauptschleife, auf Message warten
wait_for_event
	evnt_mesag	#messagebuf
	move.l	#messagebuf,a0
	move.w	(a0),d0
	cmp.w	#40,d0
	bne.s	wait_for_event

	graf_mouse #256			* Maus ausschalten
	call_xbios Physbase		* Bildschirm auf andere
	addq.l	#2,sp			* Adresse schalten
	move.l	d0,phys_screen
	call_xbios Logbase
	addq.l	#2,sp
	move.l	d0,log_screen
	move.w	#-1,-(sp)
	pea	acc_screen
	pea	acc_screen
	call_xbios Setscreen
	lea	$C(sp),sp
	pea	titel
	call_gemdos Cconws
	addq.l	#6,sp

input_loop
	bsr.w	receive
	move.w	#2,-(sp)
	call_bios Bconstat
	addq.l	#4,sp
	tst.w	d0
	beq.s	input_loop
	move.w	#2,-(sp)
	call_bios Bconin
	addq.l	#4,sp
	tst.b	d0
	beq.s	inp1
	bsr.w	send_char
	bra.s	input_loop
inp1	swap	d0			* Scanncode in unteren 8 Bits
	cmp.b	#$62,d0
	beq.s	help_pressed
	cmp.b	#$61,d0
	beq.w	undo_pressed
	cmp.b	#$47,d0
	bne.s	inp2			* Test auf CLEAR
	move.w	d0,d4			* (Shift+Home)
	move.w	#-1,-(sp)
	call_bios Kbshift
	addq.l	#4,sp
	exg	d0,d4
	and.w	#%11,d4			* Test auf Shift
	beq.s	inp2
	move.w	#esc,d0
	bsr.w	send_char
	move.w	#'E',d0
	bsr.w	send_char
	bra.s	input_loop
inp2	lea	key_tab(pc),a6		* Sondertaste lt. Tabelle
inp3	tst.b	(a6)			* Tabellenende?
	beq.s	input_loop
	cmp.b	(a6)+,d0
	beq.s	inp5
inp4	tst.b	(a6)+			* n„chsten Eintrag suchen
	bne.s	inp4
	bra.s	inp3
inp5	move.w	#esc,d0
	bsr.w	send_char		* gefunden
inp6	move.b	(a6)+,d0
	tst.b	d0
	beq.w	input_loop
	bsr.w	send_char
	bra.s	inp6

help_pressed
	bsr.w	crs_off
	graf_mouse #257			* Maus einschalten
	form_alert duplex,#t_duplx
	move.w	int_out,duplex
	graf_mouse #256			* Maus ausschalten
	bsr.w	crs_on
	bra.w	input_loop

undo_pressed
	bsr.w	crs_off
	graf_mouse #257
	form_alert #1,#t_end
	move.w	int_out,-(sp)
	graf_mouse #256
	bsr.w	crs_on
	cmp.w	#1,(sp)+
	bne.w	input_loop
	pea	t_acc_close
	call_gemdos Cconws
	addq.l	#6,sp
	move.w	#-1,-(sp)
	move.l	phys_screen,-(sp)	* Bildschirmaddresse
	move.l	log_screen,-(sp)	* zurckschalten
	call_xbios Setscreen
	lea	$C(sp),sp
	graf_mouse #257			* Maus wieder anschalten
	bra.w	wait_for_event

send_char
	move.w	d0,-(sp)
	and.w	#$FF,d0
	move.w	d0,d7
	cmp.w	#2,duplex		* Halbduplex?
	bne.s	send1
	move.w	d0,-(sp)		* Ausgabe auf Bildschirm
	move.w	#2,-(sp)		* bei Halbduplex
	call_bios Bconout
	addq.l	#6,sp
send1	bsr.s	receive
	move.w	#1,-(sp)
	call_bios Bcostat
	addq.l	#4,sp
	tst.w	d0
	beq.s	send1
	move.w	d7,-(sp)
	move.w	#1,-(sp)
	call_bios Bconout
	addq.l	#6,sp
	move.w	(sp)+,d0
	rts

receive	move.w	d0,-(sp)
rec1	move.w	#1,-(sp)		* Anzeige aller empfangenen
	call_bios Bconstat		* Zeichen
	addq.l	#4,sp
	tst.w	d0
	beq.s	rec2
	move.w	#1,-(sp)
	call_bios Bconin
	addq.l	#4,sp
	and.w	#$FF,d0
	move.w	d0,-(sp)
	move.w	#2,-(sp)
	call_bios Bconout
	addq.l	#6,sp
	bra.s	rec1
rec2	move.w	(sp)+,d0
	rts

crs_on	pea	t_crson
	bra.s	crs1

crs_off	pea	t_crsoff
crs1	call_gemdos Cconws
	addq.l	#6,sp
	rts


	section data

mymenu	dc.b	'  VT52-Terminal',0
titel	dc.b	esc,'E',esc,'v',esc,'q',esc,'e'
	dc.b	'******************************',13,10
	dc.b	'* VT52-Terminal-Emulator 1.0 *',13,10
	dc.b	'*    (c) Jens Mller 1991    *',13,10
	dc.b	'******************************',13,10
	dc.b	'HELP: Duplexeinstellung',13,10
	dc.b	'UNDO: Programm beenden',13,10,0
t_end	dc.b	'[2][ | Programm beenden ?  ][Ja| Nein ]',0
t_duplx	dc.b	'[2][ | Welche Duplex-  | šbertragungsart ?  ]'
	dc.b	'[ Voll | Halb ]',0
t_acc_close
	dc.b	esc,'w'
t_crsoff
	dc.b	esc,'f',0
t_crson	dc.b	esc,'e',0

* Tastentabelle fr auszuwertende Sondertasten
* 1. Eintrag: Scanncode Sondertaste
* alle weiteren Eintr„ge bis $00 werden nach einem Escape gesendet
key_tab
	dc.b	$47,'H',0		* Home
	dc.b	$48,'A',0		* Crs_up
	dc.b	$50,'B',0		* Crs_down
	dc.b	$4B,'D',0		* Crs_left
	dc.b	$4D,'C',0		* Crs_right
	dc.b	$3B,'P',0		* F1
	dc.b	$3C,'Q',0		* F2
	dc.b	$3D,'R',0		* F3
	dc.b	$3E,'S',0		* F4
	dc.b	$3F,'?p',0		* F5
	dc.b	$40,'?q',0		* F6
	dc.b	$41,'?r',0		* F7
	dc.b	$42,'?s',0		* F8
	dc.b	$43,'?t',0		* F9
	dc.b	$44,'?u',0		* F10


	section bss

ap_id		ds.w	1
messagebuf	ds.b	16
duplex		ds.w	1
		even
phys_screen	ds.l	1
log_screen	ds.l	1
acc_screen	ds.b	32256
		even
		ds.l	200
mystack		ds.w	1


	include "D:\AESLIB.S"

	end

