
 ILABEL ':Includes/Amiga.L'

_LVOOpenLibrary   EQU -$0228
_LVOCloseLibrary  EQU -$019e
_LVOOpenScreen    EQU -$00c6
_LVOCloseScreen   EQU -$0042
_LVOOpenWindow    EQU -$00cc
_LVOCloseWindow   EQU -$0048
_LVOCurrentTime   EQU -$0054
_LVOSetRGB4       EQU -$0120
_LVOSetBPen       EQU -$015c
_LVOSetAPen       EQU -$0156
_LVOSetDrMd       EQU -$0162
_LVORectFill      EQU -$0132
_LVOMove          EQU -$00f0
_LVODraw          EQU -$00f6
_LVOText          EQU -$003c

sc_ViewPort       EQU 44
w_RPort           EQU 50
w_UserPort        EQU 86
msg_Class         EQU 20
msg_Code          EQU 24
im_Micros         EQU 40

XSIZE             EQU 11
YSIZE             EQU 6
HAM               EQU $800
CUSTOMSCREEN      EQU $F
MOUSEBUTTONS      EQU 8
CLOSEWINDOW       EQU $200
MyIDCMPFlags      EQU $208
ACTIVATE          EQU $1000
WINDOWCLOSE       EQU 8
MyWindowFlags     EQU $1008
SELECTDOWN        EQU $68
JAM1              EQU 0
JAM2              EQU 1


;****************************************************************************
; HOLD AND MODIFY - Demo.
; C-Listing see AMIGA ROM KERNAL MANUAL: LIBRARIES AND DEVICES page 69ff.
;****************************************************************************

 INIT_AMIGA

; Open Libraries:

 LEA GfxName,A1
 MOVEQ #0,D0
 CALLSYS OpenLibrary
 MOVE.L D0,GfxBase
 BEQ EXIT

 LEA IntuitionName,A1
 MOVEQ #0,D0
 CALLSYS OpenLibrary
 MOVE.L D0,IntuitionBase
 BEQ EXIT

; Open screen

 LEA NewScreen,A0
 LINKSYS OpenScreen,IntuitionBase
 MOVE.L D0,Screen
 BEQ EXIT

; Open window

 MOVE.L D0,WScreen
 LEA NewWindow,A0
 LINKSYS OpenWindow,IntuitionBase
 MOVE.L D0,Window
 BEQ EXIT

 MOVE.L Screen,A1
 LEA sc_ViewPort(A1),A0
 MOVE.L A0,ViewPort
 MOVE.L D0,A1
 MOVE.L w_RPort(A1),RastPort

; Set color register:

 MOVEQ #4,D0
 LEA RGBTable,A2
SCLoop:
 MOVEM.L D0/A0,-(SP)
 MOVE (A2)+,D1
 MOVE (A2)+,D2
 MOVE (A2)+,D3
 LINKSYS SetRGB4,GfxBase
 MOVEM.L (SP)+,D0/A0
 DBRA D0,SCLoop

 MOVE.L RastPort,A1
 MOVEQ #0,D0
 LINKSYS SetBPen,GfxBase

 ST Textneeded
 ST Wheelmode

MainLoop:

; Check if a message is there

 MOVE.L Window,A0
 MOVE.L w_UserPort(A0),A0
 CALLSYS GetMsg
 TST.L D0
 BEQ NoMsg

 MOVE.L D0,A1
 MOVE.L msg_Class(A1),D7
 MOVE msg_Code(A1),D6
 MOVE.L im_Micros(A1),Micros

 CALLSYS ReplyMsg

 CMPI.L #CLOSEWINDOW,D7
 BEQ EXIT

 CMPI.L #MOUSEBUTTONS,D7
 BNE.S MainLoop
 CMPI #SELECTDOWN,D6
 BNE.S MainLoop

; Change mode

 NOT.B Wheelmode

 MOVE.L RastPort,A1
 MOVEQ #0,D0
 LINKSYS SetAPen,GfxBase

 MOVE.L RastPort,A1
 MOVEQ #JAM1,D0
 LINKSYS SetDrMd,GfxBase

 MOVE.L RastPort,A1
 MOVEQ #3,D0
 MOVEQ #11,D1
 MOVE #317,D2
 MOVE #184,D3
 LINKSYS RectFill,GfxBase  ;Erase window contents

 ST Textneeded

NoMsg:

 TST.B Wheelmode
 BEQ.S \1

 BSR ColorWheel
 BRA MainLoop
\1:
 BSR ColorFull
 BRA MainLoop

EXIT:

;End program

 MOVE.L Window,D0
 BEQ.S \1
 MOVE.L D0,A0
 LINKSYS CloseWindow,IntuitionBase
\1:
 MOVE.L Screen,D0
 BEQ.S \2
 MOVE.L D0,A0
 LINKSYS CloseScreen,IntuitionBase
\2:
 MOVE.L IntuitionBase,D0
 BEQ.S \3
 MOVE.L D0,A1
 CALLSYS CloseLibrary
\3:
 MOVE.L GfxBase,D0
 BEQ.S ENDE
 MOVE.L D0,A1
 CALLSYS CloseLibrary
ENDE:
 EXIT_AMIGA

ColorFull:

;Display random selection of colors

 TST.B Textneeded
 BEQ CF_ntn

 BSR Prompt
 MOVE #255,sStop           ;Top of List of Squares yet to change
 MOVE #(4095-256),cStop    ;Top of List of colors still needing use

 MOVEQ #0,D7               ;Usecolor
 LEA XPos,A2
 LEA YPos,A3
 LEA Squares,A4
 LEA SquareColor,A5

CF_For1:
 MOVE D7,D6                ;Usesquare
 MOVE D6,(A4)+
 MOVE.L D7,(A5)+
 MOVE D6,D0
 LSL #1,D0
 ANDI #30,D0
 MOVE D6,D1
 LSR #3,D1
 ANDI #30,D1
 MOVE (A3,D1),-(SP)
 MOVE (A2,D0),-(SP)
 MOVE.L D7,-(SP)

 BSR HAMBox

 ADDQ.L #8,SP

 ADDQ.L #1,D7
 CMPI.L #256,D7
 BLT.S CF_For1

 MOVE.L #256,D7            ;Usecolor
 LEA FreeColors,A0

CF_For2:
 MOVE.L D7,(A0)+

 ADDQ.L #1,D7
 CMPI.L #4095,D7
 BLT.S CF_For2

CF_ntn:

 MOVE.L GfxBase,D0         ;Calculate random number
 MOVE.L IntuitionBase,D1
 EOR.L D1,D0
 MOVE.L RastPort,D1
 EOR.L D1,D0
 MOVE.L Window,D1
 EOR.L D1,D0
 EOR.L D4,D0
 EOR.L D0,Micros
 MOVE.L Micros,D0
 ANDI.L #$FFFF,D0
 EORI #$9DA5,D0
 MOVE D0,D1
 SWAP D1
 EOR D1,D0
 MOVE sStop,D1
 ADDQ #1,D1
 DIVU D1,D0
 SWAP D0
 MOVE D0,sChoice

 LEA Squares,A5
 MOVE D0,D1
 LSL #1,D1
 MOVE (A5,D1),D6        ;UseSquare
 MOVE sStop,D5
 LSL #1,D5
 MOVE (A5,D5),(A5,D1)
 MOVE D6,(A5,D5)

 SUBQ #1,sStop
 BCC.S \1
 MOVE #255,sStop
\1:

 MOVE.L Micros,D0
 ANDI.L #$FFFF,D0
 EORI #$5B9D,D0
 MOVE D0,D1
 SWAP D1
 EOR D1,D0
 MOVE cStop,D1
 ADDQ #1,D1
 DIVU D1,D0
 SWAP D0
 MOVE D0,cChoice

 LEA FreeColors,A5
 LEA SquareColor,A4
 MOVE D0,D1
 LSL #2,D1                 ;cChoice-Index
 MOVE cStop,D2
 LSL #2,D2                 ;cStop-Index
 MOVE D6,D3                ;UseSquare
 LSL #2,D3

 MOVE.L (A5,D1),D7      ;UseColor
 MOVE.L (A5,D2),(A5,D1)
 MOVE.L (A4,D3),(A5,D2)
 MOVE.L D7,(A4,D3)

 SUBQ #1,cStop
 BCC.S \2
 MOVE #4095-256,cStop
\2:

 LEA XPos,A0
 LEA YPos,A1
 MOVE D6,D0
 LSL #1,D0
 ANDI #30,D0
 MOVE D6,D1
 LSR #3,D1
 ANDI #30,D1
 MOVE (A1,D1),-(SP)
 MOVE (A0,D0),-(SP)
 MOVE.L D7,-(SP)

 BSR HAMBox

 ADDQ.L #8,SP

 RTS

ColorWheel:

;Display an ordered selection of colors

 TST.B Textneeded
 BEQ CW_ntn

 BSR Prompt

 MOVE.L RastPort,A1
 MOVEQ #2,D0
 LINKSYS SetAPen,GfxBase

 MOVE.L RastPort,A1
 MOVE #260,D0
 MOVEQ #17,D1
 ADD YPos+30,D1
 LINKSYS Move,GfxBase

 MOVE.L RastPort,A1
 LEA Text_Green,A0
 MOVEQ #4,D0
 LINKSYS Text,GfxBase

 MOVEQ #0,D7  ;i
 MOVEQ #0,D6  ;2*i for Index
 LEA XPos,A4
 LEA Number,A5
 MOVE.L RastPort,A1
 MOVEQ #3,D0
 MOVEQ #17,D1
 ADD YPos+30,D1

CW_For1:
 MOVEM.L D0/D1/A1,-(SP)

 ADD (A4,D6),D0
 LINKSYS Move,GfxBase

 MOVE.L 8(SP),A1
 LEA (A5,D7),A0
 MOVEQ #1,D0
 LINKSYS Text,GfxBase

 MOVEM.L (SP)+,D0/D1/A1
 ADDQ #2,D6
 ADDQ #1,D7
 CMPI #16,D7
 BLT.S CW_For1

 MOVEQ #3,D0
 LINKSYS SetAPen,GfxBase

 MOVE.L RastPort,A1
 MOVEQ #4,D0
 MOVEQ #18,D1
 LINKSYS Move,GfxBase

 MOVE.L RastPort,A1
 LEA Text_Blue,A0
 MOVEQ #4,D0
 LINKSYS Text,GfxBase

 MOVEQ #0,D7  ;i
 MOVEQ #0,D6  ;2*i for Index
 LEA YPos,A4
 LEA Number,A5
 MOVE.L RastPort,A1
 MOVEQ #7,D0
 MOVEQ #6,D1

CW_For2:
 MOVEM.L D0/D1/A1,-(SP)

 ADD (A4,D6),D1
 LINKSYS Move,GfxBase

 MOVE.L 8(SP),A1
 LEA (A5,D7),A0
 MOVEQ #1,D0
 LINKSYS Text,GfxBase

 MOVEM.L (SP)+,D0/D1/A1
 ADDQ #2,D6
 ADDQ #1,D7
 CMPI #16,D7
 BLT.S CW_For2

 MOVEQ #1,D0
 LINKSYS SetAPen,GfxBase

 MOVE.L RastPort,A1
 MOVE #271,D0
 MOVE #100,D1
 LINKSYS Move,GfxBase

 MOVE.L RastPort,A1
 LEA Text_Red,A0
 MOVEQ #3,D0
 LINKSYS Text,GfxBase

 CLR Sequence

CW_ntn:

 MOVE.L RastPort,A1
 MOVEQ #1,D0
 LINKSYS SetAPen,GfxBase

 MOVE.L RastPort,A1
 MOVEQ #JAM2,D0
 LINKSYS SetDrMd,GfxBase

 MOVE.L RastPort,A1
 MOVE #280,D0
 MOVEQ #115,D1
 LINKSYS Move,GfxBase

 MOVE.L RastPort,A1
 LEA Number,A0
 ADD Sequence,A0
 MOVEQ #1,D0
 LINKSYS Text,GfxBase

 LEA XPos,A4
 LEA YPos,A5
 MOVE Sequence,D5
 LSL #8,D5
 MOVEQ #0,D7      ;J*2

CW_Forj:

 MOVEQ #0,D6      ;I*2

CW_Fori:

 MOVE.L D7,D1
 LSR #1,D1
 MOVE.L D6,D0
 LSL #3,D0
 OR D1,D0
 OR D5,D0
 MOVE (A5,D7),-(SP)
 MOVE (A4,D6),-(SP)
 MOVE.L D0,-(SP)

 BSR HAMBox

 ADDQ.L #8,SP
 ADDQ #2,D6
 CMPI #32,D6
 BLT.S CW_Fori

 ADDQ #2,D7
 CMPI #32,D7
 BLT.S CW_Forj

 ADDQ #1,Sequence
 CMPI #16,Sequence
 BLT.S \1
 CLR Sequence
\1:

 RTS

Prompt:

;Output text:

 MOVE.L RastPort,A1
 MOVEQ #JAM2,D0
 LINKSYS SetDrMd,GfxBase

 MOVE.L RastPort,A1
 MOVEQ #4,D0
 LINKSYS SetAPen,GfxBase

 MOVE.L RastPort,A1
 MOVEQ #23,D0
 MOVE #183,D1
 LINKSYS Move,GfxBase

 MOVE.L RastPort,A1
 LEA Text_Prompt,A0
 MOVEQ #32,D0
 LINKSYS Text,GfxBase

 CLR.B Textneeded

 RTS

HAMBox:

; Output box:
; 4+24(SP).L = Color, 8+24(SP).W = X, 10+24(SP).W = Y

 MOVEM.L D6/D7/A2-A5,-(SP)

 MOVE.L RastPort,A1
 MOVEQ #JAM1,D0
 LINKSYS SetDrMd,GfxBase

 MOVE.L 28(SP),D0
 LSR #8,D0
 ANDI #15,D0
 ADD #$20,D0
 MOVE.L RastPort,A1
 LINKSYS SetAPen,GfxBase

 MOVE.L RastPort,A1
 MOVE 32(SP),D0
 MOVE 34(SP),D1
 LINKSYS Move,GfxBase

 MOVE.L RastPort,A1
 MOVE 32(SP),D0
 MOVEQ #YSIZE,D1
 ADD 34(SP),D1
 LINKSYS Draw,GfxBase

 ADDQ #1,32(SP)

 MOVE.L 28(SP),D0
 LSR #4,D0
 ANDI #15,D0
 ADD #$30,D0
 MOVE.L RastPort,A1
 LINKSYS SetAPen,GfxBase

 MOVE.L RastPort,A1
 MOVE 32(SP),D0
 MOVE 34(SP),D1
 LINKSYS Move,GfxBase

 MOVE.L RastPort,A1
 MOVE 32(SP),D0
 MOVEQ #YSIZE,D1
 ADD 34(SP),D1
 LINKSYS Draw,GfxBase

 ADDQ #1,32(SP)

 MOVE.L 28(SP),D0
 ANDI #15,D0
 ADD #$10,D0
 MOVE.L RastPort,A1
 LINKSYS SetAPen,GfxBase

 MOVE.L RastPort,A1
 MOVE 32(SP),D0
 MOVE 34(SP),D1
 MOVEQ #XSIZE-2,D2
 ADD D0,D2
 MOVEQ #YSIZE,D3
 ADD D1,D3
 LINKSYS RectFill,GfxBase

 MOVEM.L (SP)+,D6/D7/A2-A5
 RTS

 DATA
Testfont:DC.L Fontname
 DC.W 8,0
Fontname:DC.B 'topaz.font',0
 ALIGN

NewScreen:
 DC.W 0,0,320,200,6
 DC.B 0,1
 DC.W HAM
 DC.W CUSTOMSCREEN
 DC.L Testfont
 DC.L STitle
 DC.L 0,0

STitle:DC.B '256 different colors',0
 ALIGN

Number:DC.B '0123456789ABCDEF',0
 ALIGN

NewWindow:
 DC.W 0,11,320,186
 DC.B -1,-1
 DC.L MyIDCMPFlags
 DC.L MyWindowFlags
 DC.L 0,0
 DC.L WTitle
WScreen:
 DC.L 0,0
 DC.W 0,0,320,186
 DC.W CUSTOMSCREEN

WTitle:DC.B 'from 4096 possible!!',0
 ALIGN

GfxName:DC.B 'graphics.library',0
IntuitionName:DC.B 'intuition.library',0
 ALIGN

GfxBase:DC.L 0
IntuitionBase:DC.L 0
Window:DC.L 0
Screen:DC.L 0

RGBTable:      ;Row wise turned around because of DBRA
 DC.W 15,15,15
 DC.W 0,0,15
 DC.W 0,15,0
 DC.W 15,0,0
 DC.W 0,0,0

Text_Green:DC.B 'Green'
Text_Blue:DC.B 'Blue'
Text_Red:DC.B 'Red'
Text_Prompt:DC.B '[Left Mouse key = Mode change]',0
 ALIGN

;Here is the field with the initialisation coordinates for the rectangle:

C@=0
X@=20
XPos:
 REPEAT
 DC.W X@
C@=C@+1
X@=X@+XSize+4
 UNTILHI 15,C@

C@=0
Y@=21
YPos:
 REPEAT
 DC.W Y@
C@=C@+1
Y@=Y@+YSize+3
 UNTILHI 15,C@

 BSS
 ALIGN
RastPort:DS.L 1
ViewPort:DS.L 1
SquareColor:DS.L 256
FreeColors:DS.L 4096-248
Squares:DS.W 260
cStop:DS.W 1
sStop:DS.W 1
Sequence:DS.W 1
Textneeded:DS.B 1
Wheelmode:DS.B 1
sChoice:DS.W 1
cChoice:DS.W 1
UseSquare:DS.W 1
UseColor:DS.W 1
Seconds:DS.L 1
Micros:DS.L 1

 END
