;
; SCREEN-HARDCOPY BY KARSTEN KALWEIT
;		     AN DEN EICHEN 16
;		     D-2000 NORDERSTEDT
;
; 
; *** OFFSET'S ***
;
Execbase      = 4	;EXEC-LIBRARY
GetMsg        = -372
ReplyMsg      = -378
WaitPort      = -384
Forbid        = -132
Permit        = -138
;
DrawImage     = -114	;INTUITION.LIBRARY
OpenWindow    = -204
CloseWindow   = -72
Openlibrary   = -408
Closelibrary  = -414
ScreenToFront = -252
;
Text          = -60	;GRAPHICS.LIBRARY
Move          = -240
SetAPen       = -342
;
; *** PROGRAMM-ABLAUF-DIAGRAMM ***
;
movem.l	a0-a7/d0-d7,-(sp)
jsr	INTOpen
jsr	GPXOpen
jsr	WDOpen
jsr	DrawSelGadget
jsr	WriteText
jsr	Programm
jsr	GPXClose
jsr	INTClose
movem.l	(sp)+,a0-a7/d0-d7
rts
;
; *** PROGRAMM ***
;
PROGRAMM:
move.l	WDHandle,a0
move.l	86(a0),a0
move.l	Execbase,a6
jsr	WaitPort(a6)
move.l	WDHandle,a0
move.l	86(a0),a0
move.l	Execbase,a6
jsr	GetMsg(a6)
move.l	d0,a0
move.l	20(a0),d0
cmpi.w	#$0200,d0
beq	CGExit
move.l	28(a0),a1
move.w	38(a1),d0
cmpi.b	#$01,d0
beq	CGAgain
cmpi.b	#$02,d0
beq	CGAgain
cmpi.b	#$03,d0
beq	CGChange
cmpi.b	#$04,d0
beq	CGCheck
cmpi.b	#$05,d0
beq	CGAgain
jmp	CGAgain
;
CGChange:
bchg	#0,MWHandle
;
CGAgain:
move.l	a0,a1
move.l	Execbase,a6
jsr	ReplyMsg(a6)
jmp	Programm
;
CGCheck:
move.l	a0,a1
move.l	Execbase,a6
jsr	ReplyMsg(a6)
move.l	IG00,d0
move.l	IG01,d1
move.l	IG02,d2
cmpi.l	#$04,d0
bge	CGCheckError
cmpi.l	#$07,d1
bge	CGCheckError
cmpi.l	#$00,d2
beq	CGCheckError
move.b	d1,PRTDM
;
UserMessage:
move.w	#16,d0
move.w	#170,d1
jsr	SETPos
lea	UM00(pc),a0
moveq	#36,d0
move.l	GPXBase,a6
jsr	Text(a6)
;
move.w	#16,d0
move.w	#179,d1
jsr	SETPos
lea	UM01(pc),a0
moveq	#36,d0
move.l	GPXBase,a6
jsr	Text(a6)
;
move.w	#16,d0
move.w	#194,d1
jsr	SETPos
lea	UM02(pc),a0
moveq	#36,d0
move.l	GPXBase,a6
jsr	Text(a6)
;
move.l	#$1000,d0
Loop:
dbf	d0,Loop
;
WaitOfReader:
btst	#6,$bfe001
bne	WaitOfReader
jsr	WDClose
;
CollectSCR:
lea	SCRBuffer(pc),a0
move.l	INTBase,a1
move.l	60(a1),a1
;
ColSCRLoop:
move.l	a1,(a0)+
move.l	(a1),a1
cmpi.l	#$000000000,a1
beq	ColSCRZero
jmp	ColSCRLoop
;
ColSCRZero:
lea	SCRBuffer(pc),a1
move.l	(a1),SCRHandle
;
UCSCR:
move.b	#$00,$bfec01
jsr	TimeDelay
btst	#6,$bfe001
beq	SCRFront
cmp.b	#$76,$bfec01
beq	InitDates
jmp	UCSCR
;
SCRFront:
move.l	(a1)+,a0
cmpi.l	#$ffffffff,a0
beq	ResetPointer
move.l	a0,SCRHandle
movem.l	a0/a1,-(sp)
move.l	INTBase,a6
jsr	ScreenToFront(a6)
movem.l	(sp)+,a0/a1
jmp	UCSCR
;
ResetPointer:
lea	SCRBuffer(pc),a1
jmp	SCRFront
;
TimeDelay:
move.l	#$e000,d0
TimeDelayLoop:
subq.l	#1,d0
bne	TimeDelayLoop
rts
;
InitDates:
move.l	SCRHandle,a0
addi.l	#$c0,a0
move.l	IG00,d1
mulu	#4,d1
addi.l	d1,a0
move.l	(a0),d0
move.l	d0,BPAdress
;
move.l	SCRHandle,a0
move.w	$0c(a0),d0
cmp.w	#320,d0
beq	Low
cmp.w	#640,d0
beq	High
jmp	High
;
Low:
move.l	#40,POStep
move.w	#40,XMax
lea	PRTBM(pc),a0
move.w	#$4001,(a0)
jmp	DDTCall
;
High:
move.l	#80,POStep
move.w	#80,XMax
lea	PRTBM(pc),a0
move.w	#$8002,(a0)
;
DDTCall:
move.b	PRTDM,d0
cmpi.b	#$3,d0
bne	SearchX
lea	PRTBM(pc),a0
cmpi.w	#$4001,(a0)
beq	DDTCallLow
cmpi.w	#$8002,(a0)
beq	DDTCallHigh
jmp	SearchX
;
DDTCallLow:
move.w	#$8002,(a0)
bset	#1,MWHandle
jmp	SearchX
DDTCallHigh:
move.w	#$0005,(a0)
bset	#1,MWHandle
;
SearchX:
clr.l	d0
move.l	SCRHandle,a0
move.w	$e(a0),d0
divu	#8,d0
swap	d0
cmp.w	#$5,d0
blt	SetX
swap	d0
addq.w	#1,d0
move.w	d0,YMax
jmp	PrtLabel00
;
SetX:
swap	d0
move.w	d0,YMax
move.l	Execbase,a6	;Execbase -> a6
jsr	Forbid(a6)	;Forbid aufrufen, alle Tasks sperren
bset	#1,$bfe001	;POWER-LED ausschalten
;
; *** DRUCK-ROUTINE ***
;
PrtLabel00:
move.l	BPAdress,a0	;Bitplane Adresse-> a0
move.w	YMax,d5		;Zeilenanzahl    -> d5
;
PrtLabel01:
move.l	IG02,d7		;Druck pro Linie -> d7
;
PrtLabel02:
lea	SCFTEXT(pc),a1	;Startadresse der Befehlcodes -> a1
lea	SCETEXT(pc),a2	;Endadresse der Befehlcodes   -> a2
subi.l	a1,a2		;Zeichenanzahl berechnen
move.l	a2,d6		;Ergebniss -> d6
;
PrtLabel03:
move.b	(a1)+,d0	;Zeichen holen -> d0
jsr	PrtSend00	;Zeichen senden
subq.b	#1,d6		;Von d6 einen abziehen
bne	PrtLabel03	;Wenn d6 ungleich 0 dann PrtLabel03 
move.w	XMax,d4		;Bytes fuer eine Zeile -> d4
;
PrtLabel04:
moveq	#7,d1		;Zu testende Bits -> d1
;
PrtLabel05:
moveq	#0,d0		;Zu sendenes Byte
moveq	#0,d2		;Fuer indirekte Adressierung
moveq	#7,d3		;8 Bits vertikal zu testen -> d3
;
PrtLabel06:
btst	d1,(a0,d2)	;Bit testen
beq	PrtLabel07	;Wenn gesetzt, zu PrtLabel07
addi.l	POStep,d2	;Adress fuer naechstes Byte in d2 erhoehen
dbf	d3,PrtLabel06	;7.Bit-Reihe noch nicht getestet ? Zu PrtLabel06
btst	#0,MWHandle	;Bit 0 in MWHandle testen
bne	PrtInv00	;Nicht gesetzt, zu PrtInv00
not.b	d0		;Byte inventieren, (0=1,1=0)
;
PrtInv00:
jsr	PrtSend00	;Byte senden
btst	#1,MWHandle	;Vierfache Dichte ?
beq	PrtInvEnd00	;Nein, zu PrtInvEnd00
jsr	PrtSend00	;Byte senden
;
PrtInvEnd00:
jmp	PrtLabel08	;Sprung zu PrtLabel08
;
PrtLabel07:
bset	d3,d0		;Bit d3 in Maske d0 setzen
addi.l	POStep,d2	;Adress fuer naechstes Byte in d2 erhoehen
dbf	d3,PrtLabel06	;7.Bit-Reihe noch nicht getestet ? Zu PrtLabel06
btst	#0,MWHandle	;Bit 0 in MWHandle testen
bne	PrtInv01	;Nicht gesetzt, zu PrtInv01
not.b	d0		;Byte inventieren, (0=1,1=0)
;
PrtInv01:
jsr	PrtSend00	;Byte senden
btst	#1,MWHandle	;Vierfache Dichte ?
beq	PrtLabel08	;Nein, zu PrtLabel08
jsr	PrtSend00	;Byte senden
;
PrtLabel08:
subq.b	#1,d1		;Naechste Bit-Reihe (Vertikal) berechnen
cmpi.b	#$-1,d1		;Schon 0.Bit-Reihe getestet ?
bne	PrtLabel05	;Nein, zu PrtLabel05
;
addq.l	#1,a0		;Zu a0 einen draufrechnen
subq.w	#1,d4		;Zeile gesendet ?
bne	PrtLabel04	;Nein, zu PrtLabel04 (Naechsten 8*8 Pixel Block) 
;
moveq	#$d,d0		;Druckkopf in Ausgangsposition-Code -> d0
jsr	PrtSend00	;d0 an Drucker senden
subi.l	POStep,a0	;a0 zuruecksetzen
subq.l	#1,d7		;d7 (Druck pro Linie) minus 1
bne	PrtLabel02	;d7 gleich null, Nein, Zeile nochmals senden 
;
move.l	POStep,d0	;Neue Anfangsadresse
mulu	#8,d0		;der naechsten Zeile
move.l	d0,PEStep	;berechnen und in
addi.l	PEStep,a0	;a0 ablegen
moveq	#$a,d0		;LF-Code -> d0
jsr	PrtSend00	;d0 an Drucker senden
subq.w	#$1,d5		;d5 minus eins
bne	PrtLabel01	;Gleich Null, Nein, Naechste Zeile senden
bclr	#1,$bfe001	;POWER-LED anschalten
move.l	Execbase,a6	;Execbase -> a6
jsr	Permit(a6)	;Permit aufrufen, alle Tasks erlauben
rts
;
CGCheckError:
move.w	#48,d0
move.w	#120,d1
jsr	SetPos
lea	ER00(pc),a0
move.l	WDHandle,a1
move.l	50(a1),a1
moveq	#28,d0
move.l	GPXBase,a6
jsr	Text(a6)
move.l	#$30000,d0
;
CGCheckErrorLoop:
subq.l	#1,d0
bne	CGCheckErrorLoop
;
move.w	#48,d0
move.w	#120,d1
jsr	SetPos
lea	PT00(pc),a0
move.l	WDHandle,a1
move.l	50(a1),a1
moveq	#28,d0
move.l	GPXBase,a6
jsr	Text(a6)
jmp	Programm
;
CGExit:
move.l	a0,a1
move.l	Execbase,a6
jsr	ReplyMsg(a6)
jsr	WDClose
rts
;
; *** SUBROUTINE'S ***
;
INTOpen:
move.l	Execbase,a6
lea	INTName(pc),a1
moveq	#0,d0
jsr	Openlibrary(a6)
move.l	d0,INTBase
rts
;
INTClose:
move.l	Execbase,a6
move.l	INTBase,a1
jsr	Closelibrary(a6)
rts
;
GPXOpen:
move.l	Execbase,a6
lea	GPXName(pc),a1
moveq	#0,d0
jsr	OpenLibrary(a6)
move.l	d0,GPXBase
rts
;
GPXClose:
move.l	Execbase,a6
move.l	GPXBase,a1
jsr	CloseLibrary(a6)
rts
;
WDOpen:
move.l	INTBase,a6
lea	WDFlags(pc),a0
jsr	OpenWindow(a6)
move.l	d0,WDHandle
rts
;
WDClose:
move.l	INTBase,a6
move.l	WDHandle,a0
jsr	CloseWindow(a6)
rts
;
DrawSelGadget:
move.l	INTBase,a6
move.l	WDHandle,a0
move.l	50(a0),a0
lea	GG00Image(pc),a1
move.l	#8,d0
move.l	#111,d1
jsr	DrawImage(a6)
rts
;
PrtSend00:
move.b	#$ff,$bfe301
move.b	d0,$bfe101
;
PrtSend01:
btst	#0,$bfd000
bne	PrtSend01
rts
;
; *** TEXT-AUSGABE IM WINDOW (WD) ***
;
WriteText:
move.l	WDHandle,a1
move.l	50(a1),a1
moveq	#1,d0
move.l	GPXBase,a6
jsr	SetAPen(a6)
;
move.w	#34,d0
move.w	#35,d1
jsr	SetPos
lea	MS00(pc),a0
jsr	TextOutput
;
move.w	#34,d0
move.w	#44,d1
jsr	SetPos
lea	MS01(pc),a0
jsr	TextOutput
;
move.w	#34,d0
move.w	#53,d1
jsr	SetPos
lea	MS02(pc),a0
jsr	TextOutput
;
move.w	#34,d0
move.w	#62,d1
jsr	SetPos
lea	MS03(pc),a0
jsr	TextOutput
;
move.w	#34,d0
move.w	#71,d1
jsr	SetPos
lea	MS04(pc),a0
jsr	TextOutput
;
move.w	#34,d0
move.w	#80,d1
jsr	SetPos
lea	MS05(pc),a0
jsr	TextOutput
;
move.w	#34,d0
move.w	#89,d1
jsr	SetPos
lea	MS06(pc),a0
jsr	TextOutput
;
move.w	#34,d0
move.w	#21,d1
jsr	SetPos
lea	MS07(pc),a0
jsr	TextOutput
;
move.w	#34,d0
move.w	#102,d1
jsr	SetPos
lea	MS08(pc),a0
jsr	TextOutput
;
move.w	#48,d0
move.w	#120,d1
jsr	SetPos
lea	PT00(pc),a0
move.l	WDHandle,a1
move.l	50(a1),a1
moveq	#28,d0
move.l	GPXBase,a6
jsr	Text(a6)
rts
;
SetPos:
move.l	WDHandle,a1
move.l	50(a1),a1
move.l	GPXBase,a6
jsr	Move(a6)
rts
;
TextOutput:
move.l	WDHandle,a1
move.l	50(a1),a1
moveq	#33,d0
move.l	GPXBase,a6
jsr	Text(a6)
rts
;
; *** STRUKTUREN, ZWISCHENSPEICHER & LIBRARY-NAMEN ... ***
;
INTName:	dc.b "intuition.library",0
GPXName:	dc.b "graphics.library",0
;
even
INTBase:	dc.l 0	
GPXBase:	dc.l 0	
;
SCRBuffer:	blk.l 32,$ffffffff
SCRHandle:	dc.l 0
;
XMax:		dc.w 0
YMax:		dc.w 0
POStep:		dc.l 40
PEStep:		dc.l 0
BPAdress:	dc.l 0
;
WDHandle:	dc.l 0
MWHandle:	dc.b 0
;
even
SCFTEXT:	
dc.b 27,65,8		;8/72 INCH
dc.b 27,42		;GRAPHIC DRUCK MODE
PRTDM:dc.b 1		;PRINT MODE
PRTBM:dc.b 128,2	;ANZAHL DER ZU SENDEN BYTES (WIRD MODIFIZIERT)
SCETEXT:
;
; *** WINDOW (WD) SET-UP ***
;
even
WDFlags:
dc.w	160,000
dc.w	320,200
dc.b	00,01
dc.l	$0260
dc.l	$10ca
dc.l	GG00STGSETUP
dc.l	0
dc.l	WDName
dc.l	0,0,0,0
dc.w	1
;
WDName:	dc.b "» SHC BY K.KALWEIT IN 1988 «",0
;
; *** STRING-GADGET (GG00) ***
;
even
GG00STGSETUP:
dc.l	GG01STGSETUP
dc.w	10,14
dc.w	16,16
dc.w	0
dc.w	$802
dc.w	4
dc.l	GG00STGBorder
dc.l	0
dc.l	0
dc.l	0
dc.l	GG00STGInfo
dc.w	1
dc.l	0
;
GG00STGBorder:
dc.w	0,0
dc.b	1,0
dc.b	0
dc.b	5
dc.l	GG00STGKoord
dc.l	0
;
GG00STGKoord:
dc.w	-2,-2
dc.w	20,-2
dc.w	20,9
dc.w	-2,9
dc.w	-2,-2
;
GG00STGInfo:
dc.l	GG00STGBuffer
dc.l	0
dc.w	0
dc.w	2
dc.w	0,0
dc.w	0,0
dc.w	0,0
dc.l	0
IG00:	dc.l	0
dc.l	0
;
GG00STGBuffer:
dc.b	"0",0
;
; *** STRING-GADGET (GG01) ***
;
GG01STGSETUP:
dc.l	GG02STGSETUP
dc.w	10,28
dc.w	16,16
dc.w	0
dc.w	$802
dc.w	4
dc.l	GG01STGBorder
dc.l	0
dc.l	0
dc.l	0
dc.l	GG01STGInfo
dc.w	2
dc.l	0
;
GG01STGBorder:
dc.w	0,0
dc.b	1,0
dc.b	0
dc.b	5
dc.l	GG01STGKoord
dc.l	0
;
GG01STGKoord:
dc.w	-2,-2
dc.w	20,-2
dc.w	20,9
dc.w	-2,9
dc.w	-2,-2
;
GG01STGInfo:
dc.l	GG01STGBuffer
dc.l	0
dc.w	0
dc.w	2
dc.w	0,0
dc.w	0,0
dc.w	0,0
dc.l	0
IG01:	dc.l	6
dc.l	0
;
GG01STGBuffer:
dc.b	"6",0
;
; *** STRING-GADGET (GG02) ***
;
GG02STGSETUP:
dc.l	GG00KLICK
dc.w	10,95
dc.w	16,16
dc.w	0
dc.w	$802
dc.w	4
dc.l	GG02STGBorder
dc.l	0
dc.l	0
dc.l	0
dc.l	GG02STGInfo
dc.w	5
dc.l	0
;
GG02STGBorder:
dc.w	0,0
dc.b	1,0
dc.b	0
dc.b	5
dc.l	GG02STGKoord
dc.l	0
;
GG02STGKoord:
dc.w	-2,-2
dc.w	20,-2
dc.w	20,9
dc.w	-2,9
dc.w	-2,-2
;
GG02STGInfo:
dc.l	GG02STGBuffer
dc.l	0
dc.w	0
dc.w	2
dc.w	0,0
dc.w	0,0
dc.w	0,0
dc.l	0
IG02:	dc.l	1
dc.l	0
;
GG02STGBuffer:
dc.b	"1",0
;
; *** GADGET (GG00) SET-UP ***
;
even
GG00KLICK:
dc.l	GG01KLICK
dc.w	8,111
dc.w	32,13
dc.w	$0006
dc.w	$0101
dc.w	$0001
dc.l	GG00Image
dc.l	GG00SelImage
dc.l	GG00Text
dc.l	0
dc.l	0
dc.w	3
dc.l	0
;
GG00Image:
dc.w	00,00
dc.w	32,13
dc.w	1
dc.l	GG00Desgin
dc.b	01,01
dc.l	0
;
GG00SelImage:
dc.w	00,00
dc.w	32,13
dc.w	1
dc.l	GG00SelDesgin
dc.b	01,01
dc.l	0
;
GG00Desgin:
dc.l	%00001111111111111111111111110000
dc.l	%00110000000000000000000000001100
dc.l	%01000000000000000000000000000010
dc.l	%01000000000000000000000000000010
dc.l	%10000000000001000010000000000001
dc.l	%10000000000001100010000000000001
dc.l	%10000000000001010010000000000001
dc.l	%10000000000001001010000000000001
dc.l	%10000000000001000110000000000001
dc.l	%01000000000001000010000000000010
dc.l	%01000000000000000000000000000010
dc.l	%00110000000000000000000000001100
dc.l	%00001111111111111111111111110000
;
GG00SelDesgin:
dc.l	%00001111111111111111111111110000
dc.l	%00110000000000000000000000001100
dc.l	%01000000000000000000000000000010
dc.l	%01000000000000000000000000000010
dc.l	%10000000000001111110000000000001
dc.l	%10000000000000011000000000000001
dc.l	%10000000000000011000000000000001
dc.l	%10000000000000011000000000000001
dc.l	%10000000000000011000000000000001
dc.l	%01000000000001111110000000000010
dc.l	%01000000000000000000000000000010
dc.l	%00110000000000000000000000001100
dc.l	%00001111111111111111111111110000
;
GG00Text:
dc.b	01,00
dc.b	1
even
dc.w	00,14
dc.l	0
dc.l	GG00Commentary
dc.l	0
;
GG00Commentary:
dc.b	"MODI",0
;
; *** GADGET (GG01) SET-UP ***
;
even
GG01KLICK:
dc.l	0
dc.w	278,111
dc.w	32,13
dc.w	$0006
dc.w	$0101
dc.w	1
dc.l	GG01Image
dc.l	0
dc.l	GG01Text
dc.l	0
dc.l	0
dc.w	4
dc.l	0
;
GG01Image:
dc.w	00,00
dc.w	32,13
dc.w	1
dc.l	GG01Desgin
dc.b	01,01
dc.l	0
;
GG01Desgin:
dc.l	%00001111111111111111111111110000
dc.l	%00110000000000000000000000001100
dc.l	%01000001111100000000011110000010
dc.l	%01000110000010000001100001100010
dc.l	%10001000000000000010000000010001
dc.l	%10010000000000000100000000001001
dc.l	%10010000001110000100000000001001
dc.l	%10010000000001000100000000001001
dc.l	%10001000000001000010000000010001
dc.l	%01000110000010000001100001100010
dc.l	%01000001111100000000011110000010
dc.l	%00110000000000000000000000001100
dc.l	%00001111111111111111111111110000
;
GG01Text:
dc.b	01,00
dc.b	1
even
dc.w	-4,14
dc.l	0
dc.l	GG01Commentary
dc.l	0
;
GG01Commentary:
dc.b	"DRUCK",0
;
; *** Texte ***
;
MS00:	dc.b "-0-  60 DPI, einfache Dichte     "
MS01:	dc.b "-1- 120 DPI, doppelte Dichte     "
MS02:	dc.b "-2- 120 DPI, Schnelldruck        "
MS03:	dc.b "-3- 240 DPI, vierfache Dichte    "
MS04:	dc.b "-4-  80 DPI, Bildschirm-Grafik I "
MS05:	dc.b "-5-  72 DPI, Plotter Grafik      "
MS06:	dc.b "-6-  90 DPI, Bildschirm-Grafik II"
MS07:	dc.b "-(0-5)-      Bitplane Nummer     "
MS08:	dc.b "-(1-9)-      Druck pro Linie     "
;
UM00:	dc.b "» LEFT MOUSE-BUTTON « Screen waehlen"
UM01:	dc.b "» RETURN «            Screen drucken"
UM02:	dc.b "» LEFT MOUSE-BUTTON « wenn gelesen  "
;
PT00:	dc.b "FUER EPSON LX-800 KOMPATIBLE"
ER00:	dc.b "        » FEHLER «          "
