* *``````````````````````````````* * ADIM81D : INIT 1D ARRAY * *- -* * CREATES AN ARRAY OF LENGTH * * [:ASIZE] WITH ELEMENTS OF * * LENGTH [:ESIZE] AT MEMORY * * LOCATION POINTED TO BY * * [:ALOC]. RETURNS ARRAY START * * LOCATION IN .A * *- -* * FIRST BYTE OF MEMORY USED * * HOLDS LENGTH OF ARRAY; * * SECOND BYTE HOLDS LENGTH OF * * ELEMENTS. * *- -* * CLOBBERS: * * * * FLAGS: ????---- REG: AXYM * *- -* * CYCLES: ??? * * SIZE: * *- -* * USAGE: * * * * LDA #>$300 ; ARRAYLOC * * PHA * * LDA #<$300 * * PHA * * LDA #10 ; ARRAY SIZE * * PHA * * LDA #2 ; ELEMENT SIZE * * PHA * * LDA #$AA ; FILL VALUE * * PHA * * JSR DIM81 * *- -* * ENTRY * * * * TOP OF STACK * * * * LOW BYTE OF RETURN ADDRESS * * HI BYTE OF RETURN ADDRESS * * FILL VALUE * * ELEMENT SIZE * * ARRAY SIZE * * LOW BYTE OF ARRAY ADDRESS * * HIGH BYTE OF ARRAY ADDRESS * *- -* * EXIT * * * * TOP OF STACK * * * * LOW BYTE OF RETURN ADDRESS * * HI BYTE OF RETURN ADDRESS * * * * .Y = LO BYTE OF ARRAY ADDR * * .X = HI BYTE OF ARRAY ADDR * * .A = ARRAY SIZE * * * * [RETURN] = TOTAL SIZE OF * * ARRAY IN BYTES (WORD) * *,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* * ADIM81 * ** SAVE RETURN ADDRESS * PLA STA RETADR PLA STA RETADR+1 * ** GET PARAMETERS * PLA STA :FILL ; FILL VALUE PLA STA :ESIZE ; ELEMENT SIZE STA :ESZBAK PLA STA :ASIZE ; ARRAY SIZE STA :ASZBAK PLA STA ADDR1 ; ARRAY ADDRESS PLA STA ADDR1+1 LDY #0 LDA #0 STY SCRATCH BEQ :ENTLP * ** MULTIPLY [:ASIZE] AND [:ESIZE] TO GET ** TOTAL SIZE OF MEMORY TO CLEAR AND USE * :DOADD CLC ADC :ASIZE TAX * TYA ADC SCRATCH TAY TXA * :LP ASL :ASIZE ROL SCRATCH :ENTLP LSR :ESIZE BCS :DOADD BNE :LP * CLC INX INX ; INCREASE BY TWO ; TO MAKE ROOM FOR SIZES BCC :NOINY ; IF .X ROLLS OVER, INC .Y INY :NOINY STX :MSIZE ; LOW BYTE STY :MSIZE+1 ; HIGH BYTE * ** NOW CLEAR MEMORY BLOCKS * ** FILL WHOLE PAGES FIRST * LDA :FILL ; FILL VALUE LDX :MSIZE+1 BEQ :PART ; IF NO WHOLE PAGES, JUST PART LDY #0 :FULL STA (ADDR1),Y INY ; NEXT BYTE BNE :FULL ; LOOP UNTIL PAGE DONE INC ADDR1+1 ; GO TO NEXT PAGE DEX BNE :FULL ; LOOP IF PAGES LEFT * ** NOW DO REMAINING PARTIAL PAGES * :PART LDX :MSIZE ; PARTIAL PAGE BYTES BEQ :MFEXIT ; EXIT IF = 0 LDY #0 :PARTLP STA (ADDR1),Y ; STORE VAL INY ; INC INDEX DEX ; DEC COUNTER BNE :PARTLP ; LOOP UNTIL DONE :MFEXIT * ** MEMORY FILL IS DONE * ** THEN, SET SIZES * LDY #0 LDA :ASZBAK STA (ADDR1),Y INY LDA :ESZBAK STA (ADDR1),Y * ** RESTORE RETURN ADDRESS * LDA RETADR+1 PHA LDA RETADR PHA * ** RETURN POINTER TO STARTING ADDR OF ARRAY * LDY ADDR1 ; LOW LDX ADDR1+1 ; HIGH LDA :ASZBAK * ** STORE TOTAL ARRAY SIZE IN BYTES ** IN MEMORY ALLOCATED FOR RETURN VALUES * LDA :MSIZE STA RETURN LDA :MSIZE+1 STA RETURN+1 LDA #2 STA RETLEN ; 2 BYTE LENGTH * RTS * ** DATA * :MSIZE DS 2 :ASIZE DS 1 :ESIZE DS 1 :ASZBAK DS 1 :ESZBAK DS 1 :FILL DS 1 *