*
*``````````````````````````````*
* ADIM82 :       INIT 2D ARRAY *
*-                            -*
* THIS SIMPLY CREATES A 1D     *
* ARRAY WITH THE DIM OF        *
* [:AXSIZE] BY [:AYSIZE].      *
*-                            -*
* FIRST BYTE OF MEMORY USED    *
* HOLDS LENGTH OF X (ROWS);    *
* SECOND BYTE HOLDS LENGTH OF  *
* Y (COLUMNS); THIRD BYTE      *
* HOLDS LENGTH OF EACH ELEMENT *
*-                            -*
* CLOBBERS:                    *
*                              *
* FLAGS:  ????----  REG: AXYM  *
*-                            -*
* CYCLES: ???                  *
* SIZE:                        *
*-                            -*
* USAGE:                       *
*                              *
*  LDA #>$300 ; ARRAY ADDR     *
*  PHA                         *
*  LDA #<$300                  *
*  PHA                         *
*  LDA #4 ; X DIMENSION BOUND  *
*  PHA                         *
*  LDA #4 ; Y DIMENSION BOUND  *
*  PHA                         *
*  LDA #1 ; ELEMENT BYTESIZE   *
*  PHA                         *
*  LDA #$AA ; FILL CHAR        *
*  PHA                         *
*  JSR DIM82                   *
*-                            -*
* ENTRY                        *
*                              *
* TOP OF STACK                 *
*                              *
* LOW BYTE OF RETURN ADDRESS   *
* HI BYTE OF RETURN ADDRESS    *
* FILL VALUE                   *
* ELEMENT SIZE IN BYTES        *
* Y DIMENSION BOUNDARY         *
* X DIMENSION BOUNDARY         *
* ARRAY ADDRESS, LOW BYTE      *
* ARRAY ADDRESS, HIGH BYTE     *
*-                            -*
* EXIT                         *
*                              *
* TOP OF STACK                 *
*                              *
* LOW BYTE OF RETURN ADDRESS   *
* HI BYTE OF RETURN ADDRESS    *
*                              *
* .Y = ARRAY ADDRESS LO BYTE   *
* .X = ARRAY ADDRESS HI BYTE   *
* .A = ELEMENT SIZE            *
*                              *
* [RETURN] = TOTAL BYTE SIZE   *
* OF ARRAY.                    *
*                              *
* [RETLEN] = LENGTH IN BYTES   *
* OF THE RETURN VALUE.         *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
ADIM82
*
** SAVE RETURN ADDRESS
*
         PLA
         STA   RETADR
         PLA
         STA   RETADR+1
*
** GET PARAMETERS
*
         PLA
         STA   :FILL
         PLA
         STA   :MCAND     ; ELEMENT LENGTH
         PLA
         STA   :AYSIZE
         STA   :AYBAK
         PLA
         STA   :AXSIZE
         STA   :AXBAK
         PLA
         STA   ADDR1
         PLA
         STA   ADDR1+1
         LDA   #0
         STA   :MCAND+1
*
** LOOP THROUGH Y, CLEARING MEMORY
** FOR X BYTES TIMES ELEMENT SIZE,
** MOVING TO END OF LAST CLEAR
** UNTIL FINISHED
*
** MULTIPLY X AND Y
*
         LDA   #0
         TAY
         STY   SCRATCH
         BEQ   :ENTLP
*
:DOADD
         CLC
         ADC   :AXSIZE
         TAX
*
         TYA
         ADC   SCRATCH
         TAY
         TXA
*
:LP
         ASL   :AXSIZE
         ROL   SCRATCH
:ENTLP
         LSR   :AYSIZE
         BCS   :DOADD
         BNE   :LP
*
         STX   :MLIER
         STY   :MLIER+1
*
** NOW MULTIPLY BY LENGTH OF ELEMENTS
*
         LDA   #0
         STA   :PROD
         STA   :PROD+1
         STA   :PROD+2
         STA   :PROD+3
         LDX   #$10
:SHIFTR  LSR   :MLIER+1
         ROR   :MLIER
         BCC   :ROTR
         LDA   :PROD+2
         CLC
         ADC   :MCAND
         STA   :PROD+2
         LDA   :PROD+3
         ADC   :MCAND+1
:ROTR
         ROR
         STA   :PROD+3
         ROR   :PROD+2
         ROR   :PROD+1
         ROR   :PROD
         DEX
         BNE   :SHIFTR
*
         CLC
         INC   :PROD      ; INCREASE BY 3
         INC   :PROD
         INC   :PROD
         BCC   :NOCAR
         INC   :PROD+1
:NOCAR
*
** NOW CLEAR MEMORY BLOCKS, WHOLE PAGES FIRST
*
         LDA   :FILL      ; FILL VALUE
         LDX   :PROD+1    ; NOTE THAT THIS WON'T
                          ; GO BEYOND A 16BIT VALUE;
                          ; ANYTHING HIGHER THAN
                          ; 16BITS IS MORE THAN
                          ; THERE IS MEMORY IN A
                          ; STANDARD APPLE ][
         BEQ   :PART
         LDY   #0
:FULL
         STA   (ADDR1),Y
         INY
         BNE   :FULL
         INC   ADDR1+1
         DEX
         BNE   :FULL      ; LOOP UNTIL PAGES DONE
*
** NOW DO REMAINING BYTES
*
:PART
         LDX   :PROD
         BEQ   :MFEXIT
         LDY   #0
:PARTLP
         STA   (ADDR1),Y
         INY
         DEX
         BNE   :PARTLP    ; LOOP UNTIL DONE
:MFEXIT
*
** NOW SET SIZES
*
         LDY   #0
         LDA   :AXBAK
         STA   (ADDR1),Y
         INY
         LDA   :AYBAK
         STA   (ADDR1),Y
         INY
         LDA   :MCAND
         STA   (ADDR1),Y
*
** RESTORE RETURN ADDRESS
*
         LDA   RETADR+1
         PHA
         LDA   RETADR
         PHA
*
** RETURN POINTER TO STARTING ADDRESS OF ARRAY
** AND STORE TOTAL BYTE SIZE IN RETURN MEM
*
         LDY   ADDR1
         LDX   ADDR1+1
         LDA   :PROD
         STA   RETURN
         LDA   :PROD+1
         STA   RETURN+1
         LDA   :PROD+2
         STA   RETURN+2
         LDA   :PROD+3
         STA   RETURN+3
         LDA   #4         ; SIZE OF RETURN
         STA   RETLEN
         LDA   :MCAND
*
         RTS
*
** DATA
*
:PROD    DS    4
:AXSIZE  DS    1
:AYSIZE  DS    1
:AXBAK   DS    1
:AYBAK   DS    1
:MLIER   DS    2
:MCAND   DS    2
:FILL    DS    1
*
