Pl2 CORRIG 3.DOC: Difference between revisions

From Atari Wiki
Jump to navigation Jump to search
mNo edit summary
mNo edit summary
Line 213: Line 213:
 
;MACRO if it uses this
 
;MACRO if it uses this
 
;register...
 
;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:
 
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
(The rest following the same logic of translation and code structure)
 
   
   

Revision as of 15:56, 17 December 2023


                         ---------

                   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 displaying points of different
  colors on the screen.


               [...]
               (The rest following the same logic of translation and code structure)


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