

;******************************************************
;*     SCROLL   (coded by Harry GRYFICE 12.1991)      *
;******************************************************

;--------------------------------------------exec base
Exec		EQU	4

OldopenLibrary	EQU	-408
CloseLibrary	EQU	-414
Forbid		EQU	-132
Permit		EQU	-138

;-----------------------------------------graphics base
StartList	EQU	$26

;---------------------------------custom chip registers
INTENA		EQU	$09A
INTENAR		EQU	$01C
DMACON		EQU	$096
DMACONR		EQU	$002
INTREQ		EQU	$09C
INTREQR		EQU	$01F
VHPOSR		EQU	$006
COL0		EQU	$180
COL1		EQU	$182
COL2		EQU	$184
COL3		EQU	$186
COL4		EQU	$188
COL5		EQU	$18A
COL6		EQU	$18C
COL7		EQU	$18E
COP1LC		EQU	$080
COPJMP1		EQU	$088
BPLCON0		EQU	$100
BPLCON1		EQU	$102
BPLCON2		EQU	$104
BPL1PTH		EQU	$0E0
BPL1PTL		EQU	$0E2
BPL2PTH		EQU	$0E4
BPL2PTL		EQU	$0E6
BPL3PTH		EQU	$0E8
BPL3PTL		EQU	$0EA
BPL1MOD		EQU	$108
BPL2MOD		EQU	$10A
DIWSTRT		EQU	$08E
DIWSTOP		EQU	$090
DDFSTRT		EQU	$092
DDFSTOP		EQU	$094
BLTAPT		EQU	$050
BLTDPT		EQU	$054
BLTAMOD		EQU	$064
BLTDMOD		EQU	$066
BLTCON0		EQU	$040
BLTCON1		EQU	$042
BLTAFWM		EQU	$044
BLTALWM		EQU	$046
BLTSIZE		EQU	$058

;---------------------------------CIA-A Port register A
CIAAPRA		EQU	$BFE001
;------------------------------------------------------

l_start		EQU	158		; będziemy skrolowaç obszar ekranu...
l_end		EQU	l_start+16	; ...od linii 158-ej do 174-ej


; Hmmm...   programik  ten  napisaîem  dawno,  dawno  temu,  toteţ jest on
; doskonaîym  przykîadem  na  to, jak NIE NALEŢY programowaç...  Ma jednak
; jednć  kolosalnć zaletę...  nie wiedzieç czemu - dziaîa !  (przynajmniej
; na  A500...).
; Aby  obejrzeç  sobie  scrolla, musisz zasemblowaç to to do pamięci CHIP.
; Moţesz  teţ  pobawiç  się w jego usprawnienie (np.  przerabiajćc biedaka
; tak,  by byî relokowalny, dopisujćc procedurkę alokujćcć kawaîek pamięci
; CHIP na ekranik i co Ci się tam jeszcze ţywnie spodoba...). Powodzenia !

; 						     choç nie mam pod czym
;							   to jednak

;							      HARRY


;******************************************* PRZYSTAWKA Z DESEREM

Hopla:	MOVEM.L	D1-D7/A0-A6,-(SP)

	LEA	GfxName(PC),A1		; adres nazwy biblioteki graficznej
					;    w A1
	MOVE.L	[Exec].W,A6		; baza exec.library w A6
	JSR	OldOpenLibrary(A6)	; otwórz bibliotekę graficznć
	MOVE.L	D0,GfxBase		; zachowaj bazę graphics.library
	BEQ.B	.error			; skok, gdy bîćd

;***************************************
	BSR.B	Start			; hej ho, hej ho, do pracy...
;***************************************

	MOVE.L	GfxBase(PC),A1
	MOVE.L	[Exec].W,A6		; baza exec.library w A6
	JSR	CloseLibrary(A6)	; zamknij bibliotekę graficznć

	MOVEM.L	(SP)+,D1-D7/A0-A6

.error:	MOVEQ	#0,D0
	RTS				; wyjőcie z programu

;*************************************************** DANIE GÎÓWNE

Start:	MOVE.L	[Exec].W,A6	; baza exec.library w A6
	JSR	Forbid(A6)	; "zamroű" maszynę

	LEA	$DFF000,A5	; w A5 poczćtek obszaru
				;      rejestrów custom
	BSR.B	InitNewCopper
	BSR.W	SetInt

;****************************************** PĘTLA

LOOP:	CMP.B	#$FF,VHPOSR(A5)
	BNE.B	LOOP

	;...

	BTST	#6,CIAAPRA	; lewy przycisk myszki wciőnięty ?
	BNE.B	LOOP

;**************************************** WYJŐCIE

waitB1:	BTST	#14,DMACONR(A5)	; przed wyjőciem warto poczekaç, aţ
	BNE.B	waitB1		;    blitter skończy się guzdraç...

	BSR.W	ResOldCopper
	BSR.W	ResetInt

	MOVE.L	[Exec].W,A6
	JSR	Permit(A6)	; wiosna...
	RTS

;***************************************************** PROCEDURKA

NewInt:	MOVEM.L	D0-D7/A0-A6,-(SP)	; tu zaczyna sie procedurka, którć
					;    podstawimy naszej maszynce, by
	BTST	#5,INTREQR(A5)		;    wykonywaîa jć co 1/50 sekundy.
	BEQ.B	no_vbl			; to nie jest VBI !

	SUBQ.W	#1,VBL_NUM
	BNE.B	scroll

	MOVE.W	#16,VBL_NUM		; 1 na 16 razy wyőwietl "fonta"
	BSR.W	AddFont			;    (kaţda litera ma szerokoőç 16
					;    pikseli, a napis przesuwamy
scroll:	BSR.W	ScrollBlit		;    o 1 piksel w jednym przejőciu)

no_vbl:	MOVE.W	#$0020,INTREQ(A5)	; zeruj bit 5 !

	MOVEM.L	(SP)+,D0-D7/A0-A6
OldInt:	JMP	$0			; skok do ROM-u


;****************************************************************
;**************************************************** PODPROGRAMY

;********************************************** NOWA COPPER-LISTA

InitNewCopper:			; wpisz adresy bitplanów w copper-listę.

	MOVE.L	#screen,D0	; obraz jest tak zdefiniowany, ţe
				;    wyőwietlana jest pierwsza linia
	MOVE.W	D0,lobpl1	;    pierwszego bitplanu, następnie
	SWAP	D0		;    pierwsza linia drugiego, pierwsza
	MOVE.W	D0,hibpl1	;    linia trzeciego i znowu: druga linia
				;    pierwszego, druga drugiego etc.
	MOVE.L	#screen+42,D0

	MOVE.W	D0,lobpl2	; dzięki temu, korzystajćc z danych
	SWAP	D0		;    (w naszym przypadku "fontów") w
	MOVE.W	D0,hibpl2	;    formacie RAW-BLIT, który ma identy-
				;    czne uîoţenie linii planów, moţemy
	MOVE.L	#screen+84,D0	;    rzucaç na ekran rysunki (dane)
				;    wielokolorowe jednym blitem, ustawia-
	MOVE.W	D0,lobpl3	;    jćc odpowiednio modulo (zarówno
	SWAP	D0		;    blitera jak i planów)
	MOVE.W	D0,hibpl3

	; wyőwietlany obraz ma 40 bajtów szerokoőci (ddfstrt=$38,
	; ddfstop=$d0), ale w pamięci zdefiniowany jest jako obraz
	; o szerokoőci 42 bajtów (nowego "fonta" dostawiamy bowiem
	; "za ramkć" (po prawej stronie), a ma on wlasnie 2 bajty
	; szerokoőci), stćd adres pierwszej linii 2. planu (vide wiersz
	; 154 programu) to screen+42, a nie screen+40 (podobnie dla
	; planu trzeciego: nie screen+80, a wîaőnie screen+84)

	MOVE.L	#copper_list,COP1LC(A5)	; copper ->
	CLR.W	COPJMP1(A5)		;  -> start
	MOVE.L	#$FFFFFFFF,BLTAFWM(A5)	; bltm AFW i ALW ("zamrozilismy
					; komputer proc.FORBID, nie musimy
	RTS				; więc za kaţdym razem ustawiaç masek

;*********************************** "PODWIEŐ" PROCEDURKĘ POD VBI

SetInt:
	MOVE.W	INTENAR(A5),OldINTbits
	MOVE.W	DMACONR(A5),OldDMAbits
	OR.L	#$80008000,OldINTbits
	MOVE.W	#$4000,INTENA(A5)		; przerwania OFF
	MOVE.L	$6C.W,OldInt+2			; podmień wektor 3 poziomu
	MOVE.L	#NewInt,$6C.W			;    przerwań, zapamiętaj stary
	MOVE.W	#$C000,INTENA(A5)
	MOVE.W	#$0020,DMACON(A5)		; sprite'y OFF
	RTS

;************************************ PRZYWRÓÇ STARĆ COPPER-LISTĘ

ResOldCopper:
	MOVE.L	GfxBase(PC),A6			;baza GFX library
	MOVE.L	StartList(A6),COP1LC(A5)
	CLR.W	COPJMP1(A5)
	RTS

;************************************* "ZDEJMIJ" PROCEDURKĘ Z VBI

ResetInt:
	MOVE.W	#$4000,INTENA(A5)
	MOVE.L	OldInt+2(PC),$6C.W		; przywróç stary wektor
	MOVE.W	OldINTbits(PC),INTENA(A5)	;    i zawartoőç
	MOVE.W	OldDMAbits(PC),DMACON(A5)	;    rejestrów...
	RTS

;************************************** DRUKUJ LITERKĘ NA EKRANIE

AddFont:
	SUB.L	A1,A1			; znajdű adres odpowiedniej litery
	MOVE.L	TxtPoint(PC),A0
	MOVEQ	#0,D0
	MOVE.B	(A0),D0			; w D0 kod ASCII litery
	BNE.B	no_end_scroll
					; jeţeli D0 = 0 (koniec scrolla) ->
	MOVE.L	#Text,TxtPoint		;    -> pobierz ponownie pierwszy znak
	BRA.B	AddFont

no_end_scroll:
	ADDQ.L	#1,TxtPoint
	SUBI.B	#$20,D0			; znaki tylko od spacji w górę
	ASL.L	#1,D0			; D0 = D0 * 2 (font ma 2 bajty
	LEA	TabFontAdr(PC),A0	;      szerokoőci)
	MOVE.W	0(A0,D0.W),A1
	ADDA.L	#fonts,A1		; A1 - gotowy adres danych
					;      graficznych litery

waitB2:	BTST	#14,DMACONR(A5)			; czekaj na koniec blitu
	BNE.B	waitB2
						; wyőwietl literkę...
	MOVE.L	A1,BLTAPT(A5)				; skćd ?
	MOVE.L	#screen+(l_start*42*3)+40,BLTDPT(A5)	; dokćd ?
	MOVE.L	#$09f00000,BLTCON0(A5)			; bltcon 0 i 1 (kopiuj)

	MOVE.L	#$00260028,BLTAMOD(A5)	; bltmod A i D (fonty to standardowy
					;    "rysunek" - 40 (hex.26) bajtów
					;    szerokoőci, a nasz obraz to 42
					;    (hex.28) bajty
	MOVE.W	#48*64+1,BLTSIZE(A5)	; 48 linii po 2 bajty (jedno
					;    sîowo (start !)
	RTS

;*********************************************** SCROLLING TEKSTU

ScrollBlit:
	BTST	#14,DMACONR(A5)			  ; czekaj na koniec blitu
	BNE.B	ScrollBlit

	MOVE.L	#screen+(l_end*42*3)-2,BLTAPT(A5) ; ostatnie sîowo
	MOVE.L	#screen+(l_end*42*3)-2,BLTDPT(A5) ;    przesuwanego obszaru
	MOVE.L	#$19f00002,BLTCON0(A5)		  ; jedna instrukcja ->
	MOVE.L	#$00000000,BLTAMOD(A5)		  ;    zapisanie dwójki
	MOVE.W	#48*64+21,BLTSIZE(A5)		  ;    rejestrów (szybciej)
	RTS

;****************************************************************
;******************************************************* REJESTRY

OldINTbits:	DC.W	0
OldDMAbits:	DC.W	0
GfxBase:	DC.L	0
TxtPoint:	DC.L	0		;wskaűnik aktualnej pozycji w tekőcie
vbl_num:	DC.W	16

GfxName:	DC.B	"graphics.library",0


Text:	DC.B ' OBUDZILES SIE JAKIS NIESWOJ... CALY DZIEN'
	DC.B ' BRAKOWALO CI CZEGOS... POKLOCILES SIE ZE'
	DC.B ' SWOIM SZEFEM... NAWET OBIAD CI TYM RAZEM'
	DC.B ' NIE SMAKOWAL (CHOC SERWOWALI TWOJE ULUBIONE'
	DC.B ' CHRUPKI Z KETCHUPEM)... WJEZDZAJAC DO GARAZU'
	DC.B ' ZATRZYMALES SIE NIECO DALEJ NIZ ZWYKLE...'
	DC.B ' W DRODZE DO DOMU BOLESNIE UCHAPAL CIE TWOJ'
	DC.B ' WLASNY PIES (TROSZKE JUZ NIEDOWIDZI BIEDACZYSKO)...'
	DC.B ' ZDESPEROWANY PLANOWALES JUZ ZAMACH NA'
	DC.B ' WLASNE ZYCIE, GDY WTEM TWOJE ROZBIEGANE OCZY SPOCZELY'
	DC.B " NA... DYSKIETCE Z DRUGIM NUMEREM IMAZINE'A !"
	DC.B ' WIDOK TEN OKAZAL SIE TAK ROZBRAJAJACY, ZE SWIEZO'
	DC.B ' NAOSTRZONY KINDZAL WYPADL CI Z DLONI... O TAK !'
	DC.B ' IMAZINE... TWOJ NIEZASTAPIONY PRZYJACIEL W'
	DC.B ' CHWILACH ZWATPIENIA I REZYGNACJI...           '

	DC.B	0	; -> to zero musi tu byç ! (vide proc.FindFontAdr)
	even

;*******************************************************tabs...

TabFontAdr:

	DC.W $0000,$0002,$0004,$0006	; fonty to zwykîy rysunek
	DC.W $0008,$000a,$000c,$000e	;    (przeksztaîcony z formatu
	DC.W $0010,$0012,$0014,$0016	;    IFF na BLIT-RAW IFF_Converterem).
	DC.W $0018,$001a,$001c,$001e	; 3 rzędy po 20 znaków
	DC.W $0020,$0022,$0024,$0026	;    o wysokoőci 16 linii kaţdy,
					;    poczćwszy od spacji (vide
	DC.W $0780,$0782,$0784,$0786	;    AMIGA BASIC: kody ASCII)
	DC.W $0788,$078a,$078c,$078e
	DC.W $0790,$0792,$0794,$0796
	DC.W $0798,$079a,$079c,$079e
	DC.W $07a0,$07a2,$07a4,$07a6

	DC.W $0f00,$0f02,$0f04,$0f06
	DC.W $0f08,$0f0a,$0f0c,$0f0e
	DC.W $0f10,$0f12,$0f14,$0f16
	DC.W $0f18,$0f1a,$0f1c,$0f1e
	DC.W $0f20,$0f22,$0f24,$0f26

;**************************************************** COPPER LIST

copper_list:

	DC.W BPLCON0,$3200,BPLCON1,$0000,BPLCON2,$0000	; 3 plany
	DC.W DIWSTRT,$2981,DIWSTOP,$29C1,DDFSTRT,$0038	; 40 bajtow w linii
	DC.W DDFSTOP,$00D0,BPL1MOD,$0056,BPL2MOD,$0056	; modulo w
							;    zwiazku ze specy-
							;    ficznć organizacjć
							;    ekranu (RAW-BLIT)

	DC.W BPL1PTH
hibpl1:	DC.W $0000	; <- tu wpisane bedć adresy planów
	DC.W BPL1PTL	;    (vide proc. InitNewCop)
lobpl1:	DC.W $0000	; <-
	DC.W BPL2PTH
hibpl2:	DC.W $0000	; <-
	DC.W BPL2PTL
lobpl2:	DC.W $0000	; <-
	DC.W BPL3PTH
hibpl3:	DC.W $0000	; <-
	DC.W BPL3PTL
lobpl3:	DC.W $0000	; <-

	DC.W	COL0,$0002,COL7,$0444,COL6,$0555	; kolory
	DC.W	COL5,$0666,COL4,$0777,COL3,$0888
	DC.W	COL2,$0999,COL1,$0AAA

	DC.W $FFDF,$FFFE				;PAL
	DC.W $FFFF,$FFFE				;END

;************************************************** PAMIĘÇ EKRANU

screen:	BLK.B	42*256*3,0		; obszar pamięci na ekran (pamieç
					;    obrazu). 42*256*3 razy wypeînij
					;    pamięç zerem od adresu "screen"
					;    (42 bajty w linii, 256 linii na
					;    1 bitplan, 3 bitplany)


;**************************************************** DANE FONTÓW

fonts:	incbin "IZ2_A:_sources/asembler/pictures/FONTS.RAW"
				; doîćcz plik "FONTS.RAW" z dyskietki

END:
