* boot org = $800 lst off xc off REDFLAG79 = $23B ; in aux mem! *------------------------------- * $800 TS (0,0) boot sector SLOT = $2b sector = $50 text = $fb2f home = $fc58 vtab = $FB5B cout = $FDF0 normal = $fe84 pr0 = $fe93 in0 = $fe89 *------------------------------- smclo = $4E smchi = $4F rw18 = $d000 slot = $fd track = $fe lastrack = $ff dum $00 dest ds 2 source ds 2 endsourc ds 2 dend *------------------------------------------------- org org hex 01 entry lda #$60 sta entry lda #MAKEBIT sta smclo ldx #$ff stx $4fb stx $3f3 stx $3f4 stx $7831 stx $c000 ;80store off stx $c002 ;RAMRD main stx $9fd8 stx $c004 ;RAMWRT main stx $c00c ;80col off stx $c00e ;Altcharset off stx $c081 ;write RAM, read ROM (2nd 4k bank) txs jsr text jsr home jsr normal jsr pr0 sta $DF35 jsr in0 stx $8492 ldx SLOT txa lsr lsr lsr lsr ora #$c0 sta :rdsect+2 lda #$0f sta sector :0 ldy sector lda skewtbl,y sta $3d lda sectaddr,y beq :1 sta $27 inc $9fd8 :rdsect jsr $005c :1 dec sector bne :0 beq decode skewtbl hex 00,0d,0b,09,07,05,03,01 hex 0e,0c,0a,08,06,04,02,0f sectaddr hex 00,09,0a,0b,00,0c,0d,0e hex 30,31,32,33,34,10,11,2f decode ldx #14 :loop lda sectaddr,x beq :nope sta :smc0+2 sta :smc1+2 ldy #0 :loop1 :smc0 lda $FF00,y eor $2F00,y :smc1 sta $FF00,y eor $7831 ;bogus garbage sta $7831 ; " " " " sta $3C iny bne :loop1 :nope dex bpl :loop ldx SLOT stage2 stx slot jsr check128k ;check for 128K memory jsr moverw18 ;& move RW18 to D000 lda #0 sta lastrack jsr rw18 hex 07,a9 ;Bbund ID byte jsr rw18 hex 00,01,00 ;drive 1 on jsr rw18 ;seek track 1 hex 02,00,01 * load & run stage 3 boot * from drive 1 jsr rw18 hex c3,ee jmp $ee00 *------------------------------------------------- * Check for AUX memory routine CHECKER lda #$EE sta $C005 lda #>MAKEBIT sta smchi sta $C003 sta $0800 lda $0C00 cmp #$EE bne :0 asl $0C00 lda $0800 cmp $0C00 beq :1 :0 clc :1 sta $C004 sta $C002 rts CHECKEND = *-CHECKER *------------------------------------------------- * * Check to make sure //c or //e * with 128k * *------------------------------- hex 34 hex 55 hex 99 check128k sta $c081 lda $FBB3 ;Apple // family ID byte cmp #6 bne NOT128K ;Must be e/c/GS bit $C017 bmi NOT128K ldx #CHECKEND :0 lda CHECKER,X sta $180,X dex bpl :0 jsr $180 bcs NOT128K rts *------------------------------- * Turn off drive and display message NOT128K ldx SLOT lda $C088,X jsr text jsr home lda #8 jsr vtab ldy #0 :0 lda MEMTEXT,Y beq * jsr cout cmp #$8D bne :1 lda #4 sta $24 :1 iny bne :0 MEMTEXT hex 8D asc "REQUIRES A //C OR //E WITH 128K" hex 00 *------------------------------- * Move RW18 * d0 < 30.40 *------------------------------- moverw18 bit $c08b bit $c08b ;rd/wrt RAM, 1st 4k bank lda #$d0 ldx #$30 ldy #$40 * a < x.y * 20 < 40.60 means 2000 < 4000.5fffm * WARNING: If x >= y, routine will wipe out 64k movemem sta dest+1 stx source+1 sty endsourc+1 ldy #0 lda #$24 sta (smclo),y sty dest sty source sty endsourc :loop lda (source),y sta (dest),y iny bne :loop inc source+1 inc dest+1 lda source+1 cmp endsourc+1 bne :loop MAKEBIT rts hex FF *------------------------------------------------- * * HLS APPLE COPY PROTECTION * COPYRIGHT (C) 1987 HLS DUPLICATION * * CONTACT ROBERT FREEDMAN 408-773-1300 * IF THERE ARE QUESTIONS ABOUT USE OF * THIS CODE * * EXIT clc IF A O K * sec IF PIRATE * *------------------------------------------------- OBJSCT = $07 ;PHYSICAL SECTOR # * ZERO PAGE * IF THIS CONFLICTS WITH YOUR CODE * CHANGE THE FOLLOWING ZERO PAGE * LOCATIONS, OR USE THE SAVE ZERO * PAGE ROUTINE HDRC = $F0 HDRS = HDRC+1 HDRT = HDRC+2 HDRV = HDRC+3 HEADER SECTOR LSRETRY = HDRC+4 ;NIB READ RETRIES PRETRY = HDRC+5 ;OBJSCT RETRIES NPTR = HDRC+6 NPTRH = HDRC+7 MEM1 = HDRC+8 MEM2 = HDRC+9 *------------------------------------------------- CheckCP lda #10 sta LSRETRY lda #>REDFLAG79 sta smchi ldx SLOT lda $C089,X lda $C08E,X lda #:NIBS ; !!!!! LOW BYTE sta NPTR lda #>:NIBS ; !!!!! HIGH BYTE sta NPTRH :AGAIN lda #$80 sta PRETRY :M1 dec PRETRY beq :LSFAIL jsr RADR16 bcs :LSFAIL lda HDRS cmp #OBJSCT bne :M1 ldy #0 :M2 lda $C08C,X bpl :M2 dey beq :LSFAIL cmp #$D5 bne :M2 ldy #0 :M3 lda $C08C,X bpl :M3 dey beq :LSFAIL cmp #$E7 bne :M3 :M4 lda $C08C,X bpl :M4 cmp #$E7 bne :LSFAIL :M5 lda $C08C,X bpl :M5 cmp #$E7 bne :LSFAIL lda $C08D,X ldy #$10 bit $6 ;3 US. ( FOR //C) :M6 lda $C08C,X bpl :M6 dey beq :LSFAIL cmp #$EE bne :M6 * NOW AT 1/2 NIBBLES * * INSTEAD OF COMPARING AGAINST A TABLE * THE DATA READ FROM THE DISK CAN BE * USED IN YOUR PROGRAM. BE CAREFUL * WHEN MODIFYING THIS PART OF THE CODE. * KEEP THE CYCLE COUNTS CONSTANT. ldy #7 :M7 lda $C08C,X ; READ DISK DATA bpl :M7 cmp (NPTR),Y ; COMPARE AGAINST TABLE bne :LSFAIL1 dey bpl :M7 bmi :GOOD :LSFAIL jmp :LSFAIL1 * A O K :GOOD eor #$79!$FC iny ldx #6 dex sta $C000,x sta (smclo),y dex sta $C000,x eor #$ED sta $239 eor #$23 sta $4E jmp yippee * FAILED, try again :LSFAIL1 ldy #-1 tya dec LSRETRY beq :GOOD jmp :AGAIN :NIBS db $FC,$EE,$EE,$FC db $E7,$EE,$FC,$E7 *------------------------------------------------- * * Read address mark * RADR16 ldy #$FD ;READ ADR HDR sty MEM1 tya eor #REDFLAG79!$FD sta smclo :RA1 iny bne :RA2 inc MEM1 beq :RAEXIT :RA2 lda $C08C,X bpl :RA2 :RA3 cmp #$D5 bne :RA1 nop :RA4 lda $C08C,X bpl :RA4 cmp #$AA bne :RA3 ldy #3 :RA5 lda $C08C,X bpl :RA5 cmp #$96 bne :RA3 lda #0 :RA6 sta MEM2 :RA7 lda $C08C,X bpl :RA7 rol sta MEM1 :RA8 lda $C08C,X bpl :RA8 and MEM1 sta HDRC,Y eor MEM2 dey bpl :RA6 tay nop clc rts :RAEXIT sec ]rts rts oscsh sec jsr $FE1F bcs * jsr $1000 jmp ($FFFC) *------------------------------------------------- yippee ldx SLOT lda $C061 bpl ]rts lda $C062 bpl ]rts lda $C000 bpl ]rts bit $C010 sta :cmp+1 ldy #-3 :loop iny iny iny lda :dispatch,y beq ]rts :cmp cmp #$11 bne :loop lda :dispatch+1,y sta 0 lda :dispatch+2,y sta 1 bit $C081 lda $C088,x jmp (0) :dispatch hex FF da oscsh asc "!" da rcmess hex 8D da confusion asc "@" da rotcube asc "^" da drive db 0 *------------------------------------------------- * * motorcycle disk drive * drive lda $C089,x ;drive back on! :loop lda $C087,x lda $C080,x jsr :delay lda $C085,x lda $C086,x jsr :delay lda $C083,x lda $C084,x jsr :delay lda $C081,x lda $C082,x jsr :delay jmp :loop :delay lda #6 sta 0 :del2 bit $C070 nop nop bit $C064 bmi *-3 dec 0 bne :del2 rts *------------------------------------------------- rotcube mainYoffset = 46 ;(192-60)/2 botYoffset = 72 mainXoffset = 68 ;(280-144)/2 color = $E4 page = $E6 dum 0 index ds 1 ysave ds 1 yadd ds 1 yoffset ds 1 dend *------------------------------------------------- rotcube jsr $f3e2 ;hgr jsr $f3d8 ;hgr2 lda #1 sta yadd sta yoffset * Draw on page not showing: mainloop lda page eor #$60 sta page ldx #$7F jsr draw * If not a //c, then wait for vbl lda $FBC0 beq :is2c lda $C019 bpl *-3 lda $C019 bmi *-3 :is2c * Now display that page bit $C054 lda page cmp #$20 beq *+5 bit $C055 * Now erase old image from last page eor #$60 sta :smc0+2 sta :smc1+2 ldx #$20 lda #0 :loop tay :smc0 sta $2000,y :smc1 sta $2080,y iny bpl :smc0 inc :smc0+2 inc :smc1+2 dex bne :loop inc index jmp mainloop *------------------------------------------------- draw stx color ldy #12-1 :drawloop lda drawlist,y sty ysave pha and #15 jsr getpoint tax tya ldy #0 jsr $f457 ;plot pla lsr lsr lsr lsr jsr getpoint ldx #0 jsr $f53a ;lineto ldy ysave dey bpl :drawloop lda yoffset clc adc yadd bne :not0 inc yadd ;make +1 inc yadd :not0 cmp #191-48-botYoffset bcc :0 dec yadd ;make -1 dec yadd :0 sta yoffset rts *------------------------------------------------- * * given a = point number, return a = xcoor, y = ycoor * getpoint tay * Get index into tables asl ;*16 asl asl asl adc index and #$3F tax tya and #4 ;bottom? cmp #4 * Compute ycoor lda ydata,x bcc :not_bot adc #botYoffset-1 :not_bot adc yoffset tay * Compute xcoor lda xdata,x adc #mainXoffset rts *------------------------------------------------- drawlist hex 01122330 ;draw top hex 45566774 ;draw bottom hex 04152637 ;draw connecting lines xdata hex 908F8E8C8A87837F7A757069635C564F hex 484039332C261F1A15100C0805030100 hex 0000010305080C10151A1F262C333940 hex 474F565C636970757A7F83878A8C8E8F ydata hex 181A1C1E21232527282A2B2D2E2E2F2F hex 2F2F2F2E2E2D2B2A28272523211E1C1A hex 181513110E0C0A080705040201010000 hex 000000010102040507080A0C0E111315 *------------------------------------------------- confusion dum 0 xr ds 1 yr ds 1 randseed ds 1 temp ds 1 dend hgr2 = $F3D8 plot = $F457 hcolor = $F6F0 * Confusion triangle confusion lda #$7F sta $E4 ;hcolor=3 jsr hgr2 * xr=xarray(0), yr=yarray(0) ldx xarray ldy yarray stx xr sty yr * Plot that dot :loop lda $C000 bpl :nokey bit $C010 cmp #$E0 bcc *+4 and #$DF cmp #"C" bne :nokey :randcol jsr getrandcol sta temp jsr $F3F4 ;clear to that color :randloop jsr getrandcol tax eor temp bmi :randloop ;different hi bits cpx temp ;same color beq :randloop :nokey ldy #0 lda xr asl tax bcc :skip iny :skip lda yr jsr plot lda yr ldx $E0 ldy $E1 inx bne *+3 iny jsr plot * Get a random number between 0-2 jsr random sec :sub30 sbc #30 bcs :sub30 adc #30 sec :sub3 sbc #3 bcs :sub3 adc #3 tax *----------- * xr stuff: * determine which midpoint routine to use lda xarray,x cmp xr bge :xarr_xr * If xarray(rand) < xr then: * xr = xarray + ( xr - xarray) / 2 lda xr sec sbc xarray,x lsr clc adc xarray,x jmp :sta_xr * If xarray(rand) >= xr then: * xr = xr + ( xarray - xr ) / 2 :xarr_xr lda xarray,x sec sbc xr lsr clc adc xr :sta_xr sta xr *----------- * yr stuff: * determine which midpoint routine to use lda yarray,x cmp yr bge :yarr_yr * If yarray(rand) < yr then: * yr = yarray + ( yr - yarray) / 2 lda yr sec sbc yarray,x lsr clc adc yarray,x jmp :sta_yr * If yarray(rand) >= yr then: * yr = yr + ( yarray - yr ) / 2 :yarr_yr lda yarray,x sec sbc yr lsr clc adc yr :sta_yr sta yr jmp :loop xarray db 70,139,0 yarray db 0,191,191 random lda randseed adc #$23 sta randseed eor $C020 ;a little randomness rts getrandcol jsr random and #7 tax jmp hcolor *------------------------------------------------- rcmess rcmess ldy #0 :0 lda :text,y beq :lores jsr $FDF0 iny bne :0 :lores bit $c000 bpl :lores sta $c00d ;80 col sta $c001 ;80 store bit $c056 bit $c052 bit $c050 bit $c05e ;merez :loop lda #$FF jsr :random sta $30 ;color lda #80 ;max x jsr :random lsr tay bit $c054 bcs *+5 bit $c055 lda #48 ;max y jsr :random jsr $F800 ;plot jmp :loop :random sta 1 lda 0 adc #$23 sta 0 eor $C020 cmp 1 bcc :ok :loop2 sbc 1 bcs :loop2 adc 1 :ok rts :text hex 8d8d asc "8/25/89",8d8d8d asc "Robert!",8d8d8d asc "Jordan and Roland wish you the very",8d8d asc "Brightest College Years.",8d8d8d8d8d asc " meres !",8d,8d asc " meres !",8d,8d asc " meres !" brk *------------------------------------------------- EOF lst on da * lst off