execbase        =    4
;exec--------------------------------------------
oldopenlib      = -408
allocmem        = -198
freemem         = -210
;dos---------------------------------------------
open            = - 30
close           = - 36
read            = - 42
write           = - 48
delay           = -198
input           = - 54
output          = - 60
;register----------------------------------------
mouse           = $bfe001
taste           = $bfec01
led             = mouse
;write-proggie zum amiga-screen-writer........klaus 28.6.89
run:
move.l		a0,filenameadr		;adresse filename merken
move.l		d0,filenamelength	;länge merken
move.l		execbase,a6		;basis exec
lea.l		dosname,a1		;adresse namen
jsr		oldopenlib(a6)		;dos öffnen
move.l		d0,dosbase		;adresse merken
move.l		filenamelength,d0	;länge holen
sub.l		#1,d0			;kein name ?
beq		printusage		;hinweis raus und schluß
move.l		#131072,d0		;128k Byte
move.l		#$01,d1			;nicht verschieben
jsr		allocmem(a6)		;ram raffen
move.l		d0,memadress		;adresse merken
beq		ende			;dann nicht
move.l		filenameadr,a0		;holen
move.l		filenamelength,d0	;holen
lea.l		namebuff,a1		;holen
buffloop:
move.b		(a0,d0),(a1,d0)		;einschreiben
dbra		d0,buffloop		;weiter
lea.l		namebuff,a1		;adresse buffer
move.l		filenamelength,d0	;holen
sub.l		#1,d0			;return abziehen
add.l		d0,a1			;endung
move.b		#".",(a1)+		;.asw
move.b		#"a",(a1)+		;an
move.b		#"s",(a1)+		;filenamen
move.b		#"w",(a1)+		;anhängen
move.b		#$00,(a1)		;endemarkierung
move.l		dosbase,a6		;ab jetzt
move.l		#namebuff,d1		;zeiger auf name
move.l		#1005,d2		;accessmode old
jsr		open(a6)		;file öffnen
move.l		d0,loadhandle		;handle merken
beq		fileerror		;meldung ausgeben+schluß
move.l		loadhandle,d1		;handle
move.l		memadress,d2		;zeiger auf buffer
move.l		#131072,d3		;max. länge
jsr		read(a6)		;einlesen
move.l		d0,loadlength		;länge merken !!!
bmi		readerror		;fehler !
move.l		loadlength,d0		;länge holen
sub.l		#2,d0			;attribute abziehen
move.l		d0,textlength		;-> textlänge
move.l		memadress,a0		;anfang holen
move.w		(a0),attribute		;attribute holen
add.l		#2,a0			;+2
move.l		a0,textstart		;anfangsadresse text
move.l		loadhandle,d1		;filehandle
jsr		close(a6)		;file schließen
;main--------------------------------------------
bsr		openraw			;fenster öffnen
bsr		showtext		;text ausgeben
bsr		closeraw		;fenster schließen
bsr		wegram			;speicher weg
bra		ende			;schluß
;------------------------------------------------
even
dosname:	dc.b	"dos.library",0
even
sure:		dc.l	0		;nur so
namebuff:	blk.b	80,0		;buffer für namen
filenameadr:	dc.l	0		;merker für adresse namen
filenamelength:	dc.l	0		;merker für länge
dosbase:	dc.l	0		;basis dos.library
memadress:	dc.l	0		;merker adresse von allocmem
loadhandle:	dc.l	0		
loadlength:	dc.l	0
textlength:	dc.l	0
attribute:	dc.w	0
textstart:	dc.l	0
;------------------------------------------------
printusage:
move.l		dosbase,a6		;basis dos
jsr		output(a6)		;output ermitteln
move.l		d0,d1			;in richtiges register
move.l		#usagemess,d2		;adresse text
move.l		#messend-usagemess,d3	;länge text
jsr		write(a6)		;ausgeben
ende:
clr.l		d0			;returncode
rts					;feierabend
usagemess:	dc.b	"USAGE-> write filename (without .asw)"
		dc.b	$0a,$0d,$00
messend:
;------------------------------------------------
even
fileerror:
move.l		dosbase,a6		;sicher
jsr		output(a6)		;output handle holen
move.l		d0,d1			;in richtiges register
move.l		#errormess,d2		;zeiger text
move.l		#errormesse-errormess,d3;länge
jsr		write(a6)		;ausgeben
jsr		wegram			;ram freigeben
bra		ende			;feierabend
errormess:	dc.b	"FILE NOT FOUND  ERROR ?"
		dc.b	$0a,$0d,$00
errormesse:
;------------------------------------------------
even
readerror:
move.l		dosbase,a6		;sicher
jsr		output(a6)		;output handle holen
move.l		d0,d1			;
move.l		#readerr,d2		;zeiger auf text
move.l		#readerre-readerr,d3	;länge
jsr		write(a6)		;ausgeben
move.l		loadhandle,d1		;filehandle
jsr		close(a6)		;file schließen
jsr		wegram			;speicher freigeben
bra		ende			;schluß !!!
readerr:	dc.b	"FILE ERROR ?"
		dc.b	$0a,$0d,$00
readerre:
;------------------------------------------------
even
wegram:
move.l		execbase,a6		;basis exec
move.l		memadress,a1		;adresse
move.l		#131072,d0		;größe		
jsr		freemem(a6)		;freigeben
move.l		dosbase,a6		;nur so
rts					;das war's
;-----------------------------------------------
even
openraw:
move.l		dosbase,a6		;sicher
move.l		#rawtitle,d1		;zeiger auf namen
move.l		#1005,d2		;accessmode
jsr		open(a6)		;lüften
move.l		d0,rawhandle		;retten
rts					;keine prüfung
rawhandle:	dc.l	0
rawtitle:
dc.b	"RAW:0/0/640/256/ Amiga Screen Writer 1.00    "
dc.b	"(hit ESC to exit !)                          ",0
rawtitlee:
;-----------------------------------------------
even
closeraw:
move.l		dosbase,a6		;sicher
move.l		rawhandle,d1		;fensterhandle
jmp		close(a6)		;es zieht
;--------------------------------------------------------
even
showtext:
move.l		dosbase,a6		;basis dos
move.l		rawhandle,d1		;fenster
move.l		#showinit,d2		;buffer
move.l		#showinite-showinit,d3	;länge
jsr		write(a6)		;ausgeben
move.w		attribute,d0		;holen
lea.l		showstyle,a0		;holen
add.l		#1,a0			;+1
add.b		#$30,d0			;ASCII
move.b		d0,(a0)			;einschreiben
move.l		rawhandle,d1		;fenster
move.l		#showstyle,d2		;adresse buffer
move.l		#showstylee-showstyle,d3;länge
jsr		write(a6)		;ausgeben
clr.l		showcounter		;initialisieren
showloop:
move.l		dosbase,a6		;dosbasis
move.l		textstart,a5		;startadresse
move.l		showcounter,d5		;holen
add.l		#1,showcounter		;erhöhen
move.b		0(a5,d5),d0		;byte holen
cmpi.b		#$00,d0			;Help ?
beq		showhelp		;ja
cmpi.b		#$01,d0			;crsrup ?
beq		showup			;ja
cmpi.b		#$02,d0			;crsrdown ?
beq		showdown		;ja
cmpi.b		#$03,d0			;crsrleft ?
beq		showleft		;ja
cmpi.b		#$04,d0			;crsrright ?
beq		showright		;ja
cmpi.b		#$08,d0			;backspace ?
beq		showback		;ja
cmpi.b		#$0d,d0			;return ?
beq		showreturn		;ja
cmpi.b		#$20,d0			;space ?
beq		showspace		;ja
cmpi.b		#$7f,d0			;delete ?
beq		showdelete		;ja
move.b		d0,showbuffer		;in buffer
move.l		rawhandle,d1		;nummer
move.l		#showbuffer,d2		;zeiger auf text (1 zeichen)
move.l		#1,d3			;anzahl
jsr		write(a6)		;und ausgeben
showpoint:
move.b		taste,d0		;holen
move.b		#0,taste		;löschen
ror.b		#1,d0			;bit0 nach 7
not.b		d0			;negieren
cmpi.b		#$45,d0			;ESC ?
beq		showfin			;dann schluß
jsr		showdelay		;verzögern !!!
move.l		textlength,d0		;holen
move.l		showcounter,d1		;holen
cmp.l		d0,d1			;ende ?
bne		showloop		;nein !!!
showfin:
rts					;das war's

showhelp:
move.l		rawhandle,d1		;fensternummer
move.l		#showclear,d2		;zeiger auf auszugebende zeic.
move.l		#showcleare-showclear,d3;anzahl
jsr		write(a6)		;ausgeben
bra		showpoint		;zurück

showup:
move.l		rawhandle,d1		;kanalnummer
move.l		#showcursorauf,d2	;buffer
move.l		#2,d3			;anzahl
jsr		write(a6)		;ausgeben		
bra		showpoint		;zurück

showdown:
move.l		rawhandle,d1		;kein kommentar mehr
move.l		#showcursorab,d2	;
move.l		#2,d3			;
jsr		write(a6)		;ausgeben
bra		showpoint		;zurück

showleft:
move.l		rawhandle,d1		;kein kommentar mehr
move.l		#showcursorlinks,d2	;
move.l		#2,d3			;
jsr		write(a6)		;ausgeben
bra		showpoint		;zurück

showright:
move.l		rawhandle,d1	;kein kommentar mehr
move.l		#showcursorrechts,d2	;
move.l		#2,d3			;
jsr		write(a6)		;ausgeben
bra		showpoint		;zurück

showback:
move.l		rawhandle,d1		;kein kommentar mehr
move.l		#showbackleer,d2	;
move.l		#4,d3			;
jsr		write(a6)		;ausgeben
bra		showpoint		;zurück

showreturn:
move.l		rawhandle,d1		;kein kommentar mehr
move.l		#showlinefeed,d2	;
move.l		#2,d3			;
jsr		write(a6)		;ausgeben
bra		showpoint		;zurück

showspace:
move.l		rawhandle,d1		;kein kommentar mehr
move.l		#showleer,d2		;
move.l		#5,d3			;
jsr		write(a6)		;ausgeben
bra		showpoint		;zurück

showdelete:
move.l		rawhandle,d1		;kein kommentar mehr
move.l		#showloesche,d2		;
move.l		#3,d3			;
jsr		write(a6)		;ausgeben
bra		showpoint		;zurück

showdelay:
bset		#1,led			;led aus
move.l		#4,d1			;4*1/50 sekunde
jsr		delay(a6)		;timeout
bclr		#1,led			;led an
rts					;das war's

escbuffer:	dc.b	$00,$00		;nur so
showbuffer:	dc.b	0		;ein byte buffer
even
delaycount:		dc.l	0	;merker
showcounter:		dc.l	0	;merker
even
showinit:	
		dc.b	$9b,$37,$37,$75	;zeilenlänge
		dc.b	$9b,$31,$30,$78	;abstand links pixel
		dc.b	$9b,$31,$35,$79	;abstand oben pixel
		dc.b	$9b,$32,$39,$74	;anzahl zeilen
		dc.b	$9b,$20,$70	;cursor an
		dc.b	$9b,"0;0H"	;cursor home
		dc.b	$9b,$4a		;fenster ab crsr löschen
showinite:
showstyle:	even
		dc.b	$9b,"0;31;40m"
showstylee:
showclear:	dc.b	$9b,"0;0H",$9b,$4a
showcleare:
even
showleer:		dc.b	$9b,$31,$40,$9b,$43,$00
showloesche:		dc.b	$9b,$31,$50,$00
showbackleer:		dc.b	$08,$9b,$31,$50
showlinefeed:		dc.b	$0d,$0a
showcursorauf:		dc.b	$9b,$41
showcursorab:		dc.b	$9b,$42
showcursorlinks:	dc.b	$9b,$43
showcursorrechts:	dc.b	$9b,$44
