* 1900 200684 * * ** RASTLOAD.S * ** ASTEROIDS FOR THE ATARI 3600. ** ** THIS FILE CONTAINS THE LOADER ASSUMING 16 HIGH ZONES. * ** TRASHES ALL REGISTERS, TEMPI+0,+1,+2,+3,+4 ** ** USES FREE THRU FREE+11 AS POINTERS TO NEXT FREE POSITION IN HEADER. ** LOADER LDA #4 ;SET POINTER PAST FIRST HEADER FOR LDX #11 ; EACH DISPLAY LIST ZAPFREE STA FREE,X DEX BPL ZAPFREE LDX #35 LOADLOOP LDA STATUS,X ;CHECK STATUS OF EACH OBJECT BEQ NEXTLOAD ;CHECK IF ZERO. CMP #$FF ;FORGET IF NULL, FF. BEQ NEXTLOAD ;OTHERWISE, LOAD IT AND #$0F ;CHECK LOW NYBBLE CMP #6 ;IF = 6 THEN SHOT BNE LOADOBJ LOADSHOT LDA YPOSH,X ;A <- Y POSITION OF OBJECT EOR #$FF ;NEGATE POSITION AND #$0F ;MOD 16 IS LINE IN ZONE STA TEMPI+4 LDA YPOSH,X ;A <- Y POSITION OF OBJECT LSR A ;DIV 16 IS WHICH ZONE LSR A LSR A LSR A TAY ;Y <- WHICH ZONE LDA FREE,Y ;A <- FREE POINTER FOR THAT ZONE CLC ADC LOWZONE,Y STA TEMPI ;TEMPI = LO ADDR FOR FIRST FREE POS LDA HIGHZONE,Y STA TEMPI+1 ;TEMPI+1 = HI ADDRESS LDA FREE,Y ;A <- FREE POINTER FOR THAT ZONE ; CLC ;OPTIONAL ADC #4 ;INCREMENT FREE POINTER STA FREE,Y LDY #0 LDA #L(SHOT1) STA (TEMPI),Y ;STORE LOW ADDRESS IN HEADER - 1ST BYTE INY LDA #$7F ;PALETTE 4, WIDTH 1 STA (TEMPI),Y ;STORE IN HEADER - 2ND BYTE INY LDA TEMPI+4 ;GET LINE IN ZONE ORA #H(GRAPHICS) ;ADD TO START OF GRAPHICS DATA STA (TEMPI),Y ;STORE HIGH ADDR IN HEADER - 3RD BYTE INY LDA XPOSH,X ;GET HORIZONTAL POSITION STA (TEMPI),Y ;STORE IN HEADER - 4TH BYTE NEXTLOAD DEX ;DECREMENT INDEX BPL LOADLOOP ;CONTINUE IF NOT FINISHED JMP LOADSCOR ;LOAD SCORE AT END OF DL IF DONE * LOAD A STANDARD OBJECT INTO TWO ZONES LOADOBJ LDA YPOSH,X ;A <- Y POSITION OF OBJECT EOR #$FF ;NEGATE POSITION AND #$F ;MOD 16 IS LINE IN ZONE STA TEMPI+4 LDA YPOSH,X ;A <- Y POSITION OF OBJECT LSR A ;DIV 16 IS WHICH ZONE LSR A LSR A LSR A TAY ;Y <- WHICH ZONE LDA FREE,Y ;A <- FREE POINTER FOR THAT ZONE CLC ADC LOWZONE,Y STA TEMPI ;TEMPI = LO ADDR FOR FIRST FREE POS LDA HIGHZONE,Y STA TEMPI+1 ;TEMPI+1 = HI ADDRESS LDA FREE,Y ;A <- FREE POINTER FOR THAT ZONE ; CLC ;OPTIONAL ADC #4 ;INCREMENT FREE POINTER STA FREE,Y INY ;ALSO LOAD INTO HIGHER ZONE CPY #12 BCC YOK ;NEW ZONE NUMBER OK? LDY #0 ;NO, RESET TO LOWEST ZONE CLC YOK LDA FREE,Y ;A <- FREE POINTER FOR THAT ZONE ADC LOWZONE,Y STA TEMPI+2 ;TEMPI = LO ADDR FOR FIRST FREE POS LDA HIGHZONE,Y STA TEMPI+3 ;TEMPI+1 = HI ADDRESS LDA FREE,Y ;A <- FREE POINTER FOR THAT ZONE ; CLC ;OPTIONAL ADC #4 ;INCREMENT FREE POINTER STA FREE,Y LDY #0 LDA ACYC,X STA (TEMPI),Y ;STORE LO ADDR IN HEADER - 1ST BYTE STA (TEMPI+2),Y INY LDA PALS,X STA (TEMPI),Y ;STORE PALETTE + WIDTH INFO - 2ND BYTE STA (TEMPI+2),Y INY LDA STATUS,X ;FOR STATUS = ICON USES CHARS AS BASE CMP #ICON CLC BNE ZHADSTMP ;OTHERWISE USE GRAPHICS AS BASE LDA TEMPI+4 ADC #H(CHARS-$0F00) BNE ZSTHADDR ;BNE = JMP HERE ZHADSTMP LDA TEMPI+4 ADC #H(GRAPHICS-$0F00) ZSTHADDR STA (TEMPI),Y ;STORE HI ADDR IN HEADER - 3RD BYTE ; CLC ;OPTIONAL ADC #$10 STA (TEMPI+2),Y ;STORE HI ADDR IN HEADER - 3RD BYTE INY LDA XPOSH,X STA (TEMPI),Y ;STORE HOR POS IN HEADER - 4TH BYTE STA (TEMPI+2),Y * THIS CODE CHECKS FOR HORIZONTAL WRAP AROUND, AND LOADS THE OBJECT AGAIN * IF IT NEEDS TO, IN ORDER TO WRAP SMOOTHLY CMP #XPOSMAX-8 ;IS IT WITHIN A MARGIN OF THE EDGE? BCC NEXTLOAD ;NO. IT'S OK, GO ON TO NEXT OBJECT. CPX #25 ;UFO IS CURRENTLY THE ONLY EXCEPTION BEQ STEPNEXT ; TO X-WRAPPING. CMP #$F0 ;HAS IT BEEN WRAPPED ALREADY? BCS UNWRAP ;YES. UNWRAP IT SBC #XPOSMAX ;WRAP IT: SUBTRACT OFF A SCREEN OFFSET STA XPOSH,X ;WANTS. WRAP IT. JMP LOADOBJ ;LOAD IT AGAIN UNWRAP ADC #XPOSMAX ;UNWRAP IT: ADD BACK THE OFFSET STA XPOSH,X STEPNEXT JMP NEXTLOAD LOADSCOR ** HIGH SCORE LDY #0 LDA FREE+11 ;GET POINTER FOR TOP ZONE CLC ADC LOWZONE+11 ;GET LOW ADDR FOR DL STA TEMPI LDA HIGHZONE+11 ;GET HIGH ADDR FOR DL STA TEMPI+1 LDA #L(SCORCMHS) ;ADD TOP SCORE STA (TEMPI),Y ;LOW ADDR INY LDA #$60 ;WRITE MODE 0, INDIRECT STA (TEMPI),Y INY LDA #H(SCORCMHS) STA (TEMPI),Y ;HIGH ADDR INY LDA #$78 ;PALETTE 4, WIDTH 8 STA (TEMPI),Y INY LDA #$39 STA (TEMPI),Y ;HOR POSITION 39 HEX ** COMBINED SCORE LDA MODE ;ONLY DO FOR MODE 1 CMP #1 BNE LOADP1S INY LDA #L(SCORECMC) STA (TEMPI),Y ;STORE LOW ADDRESS OF CHARS. INY LDA #$60 ;WRITE MODE 0, INDIRECT STA (TEMPI),Y INY LDA #H(SCORECMC) STA (TEMPI),Y ;STORE HIGH ADDRESS OF CHARS. INY LDA #$90 ;PALETTE 4, WIDTH 16 STA (TEMPI),Y INY LDA #$39 ;HOR POS 39 HEX STA (TEMPI),Y ** PLAYER 1 SCORE LOADP1S LDY #0 LDA FREE+10 ;GET POINTER FOR NEXT ZONE CLC ADC LOWZONE+10 ;GET LOW ADDR FOR DL STA TEMPI LDA HIGHZONE+10 ;GET HIGH ADDR FOR DL STA TEMPI+1 LDA #L(SCORMAP1) STA (TEMPI),Y ;STORE LOW ADDRESS OF CHARS. INY LDA #$60 ;WRITE MODE 0, INDIRECT STA (TEMPI),Y INY LDA #H(SCORMAP1) STA (TEMPI),Y ;STORE HIGH ADDRESS OF CHARS. INY LDA #$10 ;PALETTE 0, WIDTH 16 STA (TEMPI),Y INY LDA #$7 ;HOR POS 7 STA (TEMPI),Y ** PLAYER 2 SCORE INY LDA #L(SCORMAP2) STA (TEMPI),Y ;STORE LOW ADDRESS OF CHARS. INY LDA #$60 ;WRITE MODE 0, INDIRECT STA (TEMPI),Y INY LDA #H(SCORMAP2) STA (TEMPI),Y ;STORE HIGH ADDRESS OF CHARS. INY LDA #$30 ;PALETTE 1, WIDTH 16 STA (TEMPI),Y INY LDA #$65 ;HOR POS 65 HEX STA (TEMPI),Y LDA FREE+11 ;INCREMENT POINTERS CLC ADC #5 STA FREE+11 LDX MODE CPX #1 BNE ZADDZ10 CLC ADC #5 STA FREE+11 ZADDZ10 LDA FREE+10 CLC ADC #10 STA FREE+10 LOADZERO LDX #11 ;LOAD ZEROS AT END OF DISPLAY LIST, DL LDY #1 LOADZLP LDA FREE,X CLC ADC LOWZONE,X STA TEMPI LDA HIGHZONE,X STA TEMPI+1 LDA #0 STA (TEMPI),Y DEX BPL LOADZLP STA LOADFLAG ;CLEAR FLAG SINCE DONE. RTS LOADSTAR LDX #11 STARLOOP LDA LOWZONE,X ;ESTABLISH LO ADDR STA TEMPI LDA HIGHZONE,X ;ESTABLISH HI ADDR STA TEMPI+1 JSR NEWRAND ;PICK A RANDOM STAR (0 TO 3) AND #$03 CLC ADC #L(STARS) ;ADD IN BASE OF STARS LDY #0 STA (TEMPI),Y ;STORE LO ADDR INY LDA STARPW,X STA (TEMPI),Y ;STORE PALETTE & WIDTH INFO INY LDA #H(CHARS) STA (TEMPI),Y ;STORE HI ADDR JSR NEWRAND ;GET A RANDOM HORIZONTAL POSITION LSR A ;BANG INTO RANGE ADC #$10 LDY #3 STA (TEMPI),Y ;STORE HOR POS DEX BPL STARLOOP RTS STARPW DB $7F,$9F,$7F,$7F,$BF,$7F,$DF,$7F,$7F,$FF,$9F,$DF EJE