Pl2 CORRIG 3.DOC
---------
EXERCISE CORRECTIONS
on LineAs
---------
1) Exercise nr° 1:
--------------
Here is the correction listing.
I think this exercise didn't cause you much trouble,
carefully look at this listing, it doesn't have any difficulty.
TEXT
INCLUDE "LINEQU.L" ;the EQUs
INCLUDE "INIT_TOS.L" ;Setblock
INCLUDE "MACROS.L" ;The macros
SETBLOCK ;Initialization
;We search for the address of the internal Table for the LineAs
DC.W $A000 ;return in a0 of the address
;of the internal table
;We drop the addresses of the VDI array tables in the internal table
move.l #CONTROL,ticontrol(a0)
move.l #INTIN,tiintin(a0)
move.l #PTSIN,tiptsin(a0)
move.l #INTOUT,tiintout(a0)
move.l #PTSOUT,tiptsout(a0)
PRINTLINE MOUSE ;text
WAIT ;waiting
lea INTIN,a6 ;address of INTIN in a6
move #0,6(a6) ;0 in intin+6 (mask color)
move #1,8(a6) ;1 in intin+8 (foreground color)
lea DATA,a5 ;address of 'DATA' in a5
move #31,d0 ;31 in d0
adda.l #10,a6 ;increment a6 by 10 units:
;a6 therefore points on intin+10
LOOP move (a5)+,(a6)+ ;we drop the data in
;the INTIN table pointed by
;a6
dbf d0,LOOP ;we loop 32 times for the
;32 data (16 words for the
;mask and 16 words for the
;foreground)
DC.W $A00B ;TRANSFORM MOUSE
move #0,intin ;counter=0
DC.W $A009 ;SHOW MOUSE
PRINTLINE MESSAGE ;text
WAIT ;waiting
TERM ;end
DATA
MOUSE DC.B 27,'E','I change the shape of the mouse cursor...'
DC.B ' mouse ...',0
MESSAGE DC.B 27,'E','Move the MOUSE please ...',7,0
DATA DC.W %0000001110000000 ;the 16 data (WORDS)
DC.W %0000011111000000 ;of the MASK
[...] (omission of repeated patterns)
DC.W %0000001110000000
DC.W %0000000000000000 ;the 16 data (WORDS)
DC.W %0000001110000000 ;of the FOREGROUND
[...] (omission of repeated patterns)
DC.W %0000000000000000
BSS
INCLUDE "TABLEAU.L" ;the VDI table
END
2) Exercise nr°2:
--------------
Again, no major difficulty...
It was just necessary to pay attention to using graphical coordinates
that correspond to the used resolution.
(OX)=640 from 0 to 339
(OY)=200 from 0 to 199 (MEDIUM resolution)
TEXT
INCLUDE "LINEQU.L" ;the EQUs
INCLUDE "INIT_TOS.L" ;Setblock
INCLUDE "MACROS.L" ;The macros
SETBLOCK ;initialization
DC.W $A000 ;we request the address of the T.I. and
movea.l a0,a5 ;we put it in a5 because a0 might
;be modified by our MACROS...
; We place the addresses of the VDI arrays
move.l #CONTROL,ticontrol(a0)
move.l #INTIN,tiintin(a0)
move.l #PTSIN,tiptsin(a0)
move.l #INTOUT,tiintout(a0)
move.l #PTSOUT,tiptsout(a0)
PRINTLINE FRAME ;text
WAIT ;waiting
DC.W $A00A ;HIDE MOUSE
CCONOUT #27 ;ESC
CCONOUT #'E' ;+ 'E' = clear the screen
move #1,_fg_bp_1(a5)
move #1,_fg_bp_2(a5) ;color=%11=3
move #0,_wrt_mode(a5) ;Write mode AND
move #1,_patmsk(a5) ;1+1=2 data for the PAT
move.l #LINE,_patptr(a5) ;in 'LINE' is
;the new PAT
move #%1111111111111111,_ln_mask(a5) ;solid LINE
move #0,d5 ;0 in d5
move #22,d6 ;22 in d6
LOOP move #0,_x1(a5) ;_x1=0
move d5,_y1(a5) ;_y1=d5
move #630,_x2(a5) ;_x2=630
move d5,_y1(a5) ;_y2=d5
add #9,d5 ;we add 9 to d5
DC.W $A004 ;and we draw the H-LINE
dbf d6,LOOP ;we repeat 23 times
move #0,d5 ;0 in d5
move #42,d6 ;42 in d6
LOOP move d5,_x1(a5) ;_x1=d5
move #0,_y1(a5) ;_y1=0
move d5,_x2(a5) ;_x2=d5
move #197,_y2(a5) ;_y2=197
add #15,d5 ;we add 15 to d5
DC.W $A003 ;and we draw the LINE
dbf d6,LOOP ;we repeat 43 times
WAIT ;waiting
TERM ;end
DATA
LINE DC.W %1111111111111111 ;the PAT (EVEN
DC.W %1111111111111111 ;number of WORDS)
FRAME DC.B 27,'E','I am going to draw a grid ...'
DC.B 13,10,'Functions LINE and H-LINE:',0
BSS
INCLUDE "TABLE.L" ;the VDI Table
END
3) Exercise nr°3:
--------------
Here is the listing of the program that draws a rectangle with a PAT
redefined after loading the previous grid program.
TEXT
INCLUDE "LINEQU.L" ;the EQUs
INCLUDE "INIT_TOS.L" ;Setblock
INCLUDE "MACROS.L" ;The MACROS
SETBLOCK ;initialization
PRINTLINE FRAME ;text
WAIT ;waiting
PEXEC NUL,ZERO,PRG,#0 ;we load the program whose
;name is in 'PRG' in mode
;0 and without parameters.
DC.W $A000 ;We look for the address of the T.I.
movea.l a0,a5 ;We save this address because it
;might be erased by one of our
;MACRO if it uses this
;register...
; We set the VDI table addresses in the T.I.
move.l #CONTROL,ticontrol(a0)
move.l #INTIN,tiintin(a0)
move.l #PTSIN,tiptsin(a0)
move.l #INTOUT,tiintout(a0)
move.l #PTSOUT,tiptsout(a0)
move #1,_fg_bp_1(a5)
move #0,_fg_bp_2(a5) ;Color=%01=1
move #0,_wrt_mode(a5) ;Write mode AND
move #7,_patmsk(a5) ;7+1=8 data for the PAT
move.l #FILL,_patptr(a5) ;The new PAT is in
;'FILL'
;coordinates of the rectangle
move #129,_x1(a5) ;_x1=129
move #24,_y1(a5) ;_y1=24
move #496,_x2(a5) ;_x2=496
move #183,_y2(a5) ;_y2=183
DC.W $A005 ;FILLED RECTANGLE
WAIT ;waiting
TERM ;end
DATA
FILL DC.W %0111111111111110 ;the PAT (EVEN number of
DC.W %0100000000000010 ;WORDS)
DC.W %0101000000001010
DC.W %0101111111111010
DC.W %0101000000001010
DC.W %0100000000000010
DC.W %0111111111111110
DC.W %0000000000000000
FRAME DC.B 27,'E','I am going to draw a square with $A005 '
DC.B 'after loading FRAME.PRG ',0
NUL DC.B 0 ;No environment and
ZERO DC.B 0 ;command line
PRG DC.B 'A:\FRAME.PRG',0 ;the NAME of the prg to load
BSS
INCLUDE "TABLE.L" ;the VDI Table
END
4) Exercise nr° 4:
---------------
Here is the listing of the program that displays the SPRITE.
It was necessary to use UNDRAW SPRITE each time
to be able to display the SPRITE at different coordinates.
It was also necessary to provide ALL the parameters that the DRAW
SPRITE and UNDRAW SPRITE routines need for a correct result.
I chose, for the shape of my SPRITE, an ATARI symbol and my
initials: L-P. (It's not very original, I admit...)
I also use the macro instruction VSYNC to synchronize our
graphic editions: the program is significantly slowed down but the
flickering of the SPRITE display disappears...
TEXT
INCLUDE "LINEQU.L" ;The EQUs
INCLUDE "INIT_TOS.L" ;Setblock
INCLUDE "MACROS.L" ;the MACROS
SETBLOCK ;initialization
DC.W $A000 ;T.I. address in a0 and
movea.l a0,a5 ;in a5 to avoid losing it
;if a MACRO uses the
;a0 register...
; We set the VDI Table addresses in the T.I.
move.l #CONTROL,ticontrol(a0)
move.l #INTIN,tiintin(a0)
move.l #PTSIN,tiptsin(a0)
move.l #INTOUT,tiintout(a0)
move.l #PTSOUT,tiptsout(a0)
PRINTLINE PIX ;text
WAIT ;waiting
DC.W $A00A ;HIDE MOUSE
CCONOUT #27 ;ESC
CCONOUT #'E' ;+'E' = clear the screen
move #0,_wrt_mode(a5) ;Write mode AND
move.l #BLOCK,a0 ;Address of the definition
;block of the SPRITE in a0
move.l #SAVE,a2 ;Address of the Backup Buffer
;in a2 (128 bytes for medium
;resolution)
; The SPRITE first goes from left to right (X coordinate in d0
and Y coordinate in d1)
move #10,X ;1 WORD=10 in 'X'
BBB add #1,X ;Add 1 in 'X'
move X,d0 ;Put the WORD of 'X' in d0
move #100,d1 ;Put 100 in d1
move.l #BLOCK,a0 ;The block address in a0
cmpi #620,d0 ;Is d0=620?
beq TWO ;if YES, go to 'TWO'
move.l #SAVE,a2 ;Otherwise put the address of the Backup
;buffer of the sprite in a2
DC.W $A00C ;and UNDRAW SPRITE
move.l #BLOCK,a0 ;The block address in a0
move.l #SAVE,a2 ;The buffer address in a2
DC.W $A00D ;and DRAW SPRITE
VSYNC ;Synchronize
jmp BBB ;and repeat in 'BBB'
; Then the SPRITE returns from right to left.
TWO sub #1,X ;subtract 1 in 'X'
move X,d0 ;put the word of 'X' in d0
move #100,d1 ;put 100 in d1
move.l #BLOCK,a0 ;The block address in a0
cmpi #10,d0 ;Is d0=10?
beq END ;If YES, then go to 'END'
move.l #SAVE,a2 ;Otherwise address of the buffer in a2
DC.W $A00C ;and UNDRAW SPRITE
move.l #BLOCK,a0 ;The block address in a0
move.l #SAVE,a2 ;The buffer address in a2
DC.W $A00D ;and DRAW SPRITE
VSYNC ;Synchronize
jmp TWO ;and repeat in 'TWO'
END WAIT ;waiting
TERM ;end
DATA
;The definition block of the SPRITE:
BLOCK DC.W 0 ;X of the hot point
DC.W 0 ;Y of the hot point
DC.W 0 ;VDI Format
DC.W 0 ;Mask Color
DC.W 1 ;Foreground Color
DC.W 0 ;no mask
DC.W %0000000000000000 ;1st line of the 1st plan
DC.W 0 ;no mask
DC.W %0000110110110000 ;2nd line of the 1st plan
DC.W 0 ;no mask
DC.W %0000110110110000
DC.W 0
DC.W %0000110110110000
DC.W 0
DC.W %0001100110011000
DC.W 0
DC.W %0011000110001100
DC.W 0
DC.W %0011000110001100
DC.W 0
DC.W %0110000110000110
DC.W 0
DC.W %0110000110000110
DC.W 0
DC.W %0000000000000000
DC.W 0
DC.W %0011000001111100
DC.W 0
DC.W %0011000001101100
DC.W 0
DC.W %0011000001111000
DC.W 0
DC.W %0011000001100000
DC.W 0
DC.W %0011111001100000
DC.W 0 ;no MASK
DC.W %0000000000000000 ;16th line of the 1st plan
PIX DC.B 27,'E','I am going to move a SPRITE with '
DC.B '$A00D',0
BSS
X DS.W 1 ;reserve a WORD in 'X'
SAVE DS.B 128 ;the BUFFER for the SPRITE (MEDIUM
;resolution)
INCLUDE "TABLE.L" ;the VDI table
END
5) Exercise nr°5:
--------------
Here is the listing of the program that displays points of different
colors on the screen.
TEXT
INCLUDE "LINEQU.L" ;the EQUs
INCLUDE "INIT_TOS.L" ;Setblock
INCLUDE "MACROS.L" ;the MACROS
; I first test if we are in the correct resolution:
GETREZ ;ask for the Resolution
tst d0 ;Do we have resolution=0 (LOW)
beq OK ;If Yes, go to 'OK'
PRINTLINE MEDIUM ;otherwise message
WAIT ;waiting
TERM ;and end
OK SETBLOCK ;initialize
DC.W $A000 ;T.I. address in a0
; We set the VDI table addresses in the T.I.
move.l #CONTROL,ticontrol(a0)
move.l #INTIN,tiintin(a0)
move.l #PTSIN,tiptsin(a0)
move.l #INTOUT,tiintout(a0)
move.l #PTSOUT,tiptsout(a0)
DC.W $A00A ;HIDE MOUSE
PRINTLINE MESSAGE ;text
WAIT ;waiting
CCONOUT #27 ;ESC
CCONOUT #'E' ;+'E' = clear the screen
; I define a MACRO INSTRUCTION named POINT that takes 3 parameters
; and which allows editing a point on the screen thanks to the routine $A001
POINT MACRO $\1,$\2,$\3 ;macro with 3 parameters
move \1,ptsin ;\1=X coordinate
move \2,ptsin+2 ;\2=Y coordinate
move \3,intin ;\3=color
DC.W $A001 ;PUT PIXEL
ENDM ;end of the macro
; Here I will display all the points on the screen and give them a
; color thanks to the random number given by RANDOM in d0.
; To not obtain too large a number with RANDOM, I mask the
; number in d0 with the maximum number of digits I need.
; We thus obtain a number between 0 and the value of the mask
; (See the chapter on BIOS and XBIOS for the RANDOM function...)
; If d0=0 (color 0), I repeat the test with RANDOM because the color
; of the border must not change.
move #319,d5 ;319 in d5
move #1,d0 ;1 in d0
PALETTE NEW ;change the PALETTE for the
;first time
LOOP move #199,d6 ;199 in d6
LOOP POINT d5,d6,d0 ;POINT at coordinates
;(d5,d6) and with the color
;contained in d0
AGAIN RANDOM ;Random number returned
;in d0
and.l #15,d0 ;mask the 4 lowest bits of d0: 15=%1111
tst d0 ;Do we have d0=0?
beq AGAIN ;If yes, repeat
dbf d6,LOOP ;loop d6 times in LOOP
dbf d5,LOOP ;loop d5 times in LOOP
; Now we vary the value of the color palette:
; We created a vector that contains the addresses of the palettes.
; (In 'VECTOR')
; We take one of these addresses and change the palette (I do not use
; the PALETTE MACRO that we created because it expects a LABEL as a pa-
; rameter.) then we start over with the next palette address...
; I also use INKEY to test if a key is pressed and if so,
; the program ends.
HERE move #14,d6 ;14 in d6
lea VECTOR,a6 ;address of 'VECTOR' in a6
CHANGE move.l (a6)+,-(sp) ;put the L-M pointed by a6
;(an address for the palette)
;into -(SP)
move #6,-(sp) ;Code 6 (PALETTE)
trap #14 ;of BIOS
addq.l #6,sp ;and reposition SP
INKEY ;I test a key press
tst d0 ;d0=0? (If=0,no key press)
bne RETURN ;If NO (a key was pressed) go to 'RETURN'
dbf d6,CHANGE ;Otherwise loop in 'CHANGE'
jmp HERE ;then go to 'HERE'
RETURN CCONOUT #27 ;ESC
CCONOUT #'E' ;+'E' = clear the screen
PALETTE OLD ;We restore the old PALETTE
TERM ;and exit the program
DATA
; The data defining the palettes that are displayed successively to
; achieve a rotation of colors.
; For each palette, we rotate one color to the right...
; Color 0 never changes to avoid flickering of the
; screen border (Color 0)
NEW DC.W $000,$027,$037,$027,$017,$016,$006,$015
DC.W $014,$036,$025,$005,$004,$014,$007,$003
ONE DC.W $000,$007,$027,$037,$027,$017,$016,$006
DC.W $014,$015,$036,$025,$005,$004,$014,$007
TWO DC.W $000,$003,$007,$027,$037,$027,$017,$016
DC.W $006,$015,$014,$036,$025,$005,$004,$014
THREE DC.W $000,$007,$003,$007,$027,$037,$027,$017
DC.W $016,$006,$015,$014,$036,$025,$005,$004
FOUR DC.W $000,$014,$007,$003,$007,$027,$037,$027
DC.W $017,$016,$006,$015,$014,$036,$025,$005
FIVE DC.W $000,$004,$014,$007,$003,$007,$027,$037
DC.W $027,$017,$016,$006,$015,$014,$036,$025
SIX DC.W $000,$005,$004,$014,$007,$003,$007,$027
DC.W $037,$027,$017,$016,$006,$015,$014,$036
SEVEN DC.W $000,$025,$005,$004,$014,$007,$003,$014
DC.W $007,$027,$037,$027,$017,$016,$006,$015
EIGHT DC.W $000,$036,$025,$005,$004,$014,$007,$003
DC.W $014,$007,$027,$037,$027,$017,$016,$006
NINE DC.W $000,$015,$036,$025,$005,$004,$014,$007
DC.W $003,$014,$007,$027,$037,$027,$017,$016
TEN DC.W $000,$006,$015,$036,$025,$005,$004,$014
DC.W $07,$003,$014,$007,$027,$037,$027,$017
ELEVEN DC.W $000,$016,$006,$015,$036,$025,$005,$004
DC.W $014,$007,$003,$014,$007,$027,$037,$027
TWELVE DC.W $000,$017,$016,$006,$015,$036,$025,$005
DC.W $004,$014,$007,$003,$014,$007,$027,$037
THIRTEEN DC.W $000,$027,$017,$016,$006,$015,$036,$025
DC.W $005,$004,$014,$007,$003,$014,$007,$027
FOURTEEN DC.W $000,$037,$027,$017,$016,$006,$015,$036
DC.W $025,$005,$004,$014,$007,$003,$014,$007
; The vector pointing to the addresses of the different palettes
VECTOR DC.L NEW,ONE,TWO,THREE,FOUR,FIVE,SIX,SEVEN
DC.L EIGHT,NINE,TEN,ELEVEN,TWELVE,THIRTEEN,FOURTEEN
; The old palette
OLD DC.W $777,$500,$070,$000,$000,$000,$000,$000
DC.W $000,$000,$000,$000,$000,$000,$000,$000
MESSAGE DC.B 27,'E',174,' Scrambled Image ',175,':with the'
DC.B ' function',13,10,'$A001 and RANDOM for colors...'
DC.B '13,10,13,10,'(Press a key to'
DC.B 'Exit)',0
MEDIUM DC.B 27
6) Exercise nr°6:
--------------
Here is the corrected program that displays diamonds without and then with CLIPPING...
[...]
(The rest following the same logic of translation and code structure)
------------------
That's it for the corrections of the exercises on LineAs...
The listings of these 6 programs as well as the executable programs
are of course on this disk in the files:
1) TRANSMOU.L & TRANSMOU.PRG
2) CADRE .L & CADRE .PRG
3) RECTANGL.L & RECTANGL.PRG
4) SPRITE .L & SPRITE .PRG
5) POINT .L & POINT .PRG
6) POLYGONE.L & POLYGONE.PRG
Laurent PIECHOCKI
8,Impasse Bellevue Continue in the file: INTERRUP.DOC
57980 TENTELING ------------
Back to ASM_Tutorial