FDRET LDU #RAMERJ RAM ERROR RETURN BRA FDROM0 FDROM LDU #DIG11Z FDROM0 LDS #HSTK FDROM5 LDY #FDROM6 LDA #1 JMP DELA1 FDROM6 LDA PIA0 BITA #$2 BNE FDROM5 FDROM1 LDY #FDROM7 LDA #1 JMP DELA1 FDROM7 LDA PIA0 BITA #$2 BEQ FDROM1 FDROM2 LDY #FDROM8 LDA #1 JMP DELA1 FDROM8 LDA PIA0 BITA #2 BNE FDROM2 JMP ,U AVWAIT PULS D LDU CRPROC STD PD+6,U AVWAIZ LDA PIA0 SEE IF ADVANCE PRESSED BITA #$2 WELL?? BNE AVWAT2 NAP 1,AVWAIZ WELL, WAIT FOR IT. AVWAT2 CLR PCRAM JSR SCRCLR BRA AVWAT5 AVWAT4 LDA PIA0 BITA #$2 WAIT FOR IT TO BE RELEASED BEQ AVWAT3 AVWAT5 NAP 2,AVWAT4 AVWAT3 JMP [PD+6,U] AVCHK PSHS A LDA PIA0 BITA #$2 BEQ AVCHK1 SEC PULS A,PC AVCHK1 CLC PULS A,PC * * DISPLAY BOOKKEEPPING * BOOK LDA #$FF STA STATUS JSR INITCM COLOR MATRIX PROPER. BSR AVCHK BCC BOOK3 BSR AVWAIT WAIT FOR HIM TO LET GO. BOOK3 LDA #BOOKM JSR WRD7V PRINT THE BOOKKEEPING MESSAGE LDU #SLOT1 LDA #AUDMES FIRST OF THE AUDIT MESSAGES BOOK0 PSHS A SAVE MESSAGE NUMBER JSR WRD7V PRINT IT. EXG U,X JSR RCMOSB GET THE TOP BYTE PSHS B JSR RCMOSD TFR D,Y PULS B EXG U,X BSR BOOKSB PRINT B,Y WITH APPROPRIATE BLANKING PULS A RESTORE A INCA CMPU #BKEND BLO BOOK0 THANK YOU SIR, MAY I HAVE ANOTHER?? * * COMPUTE AVERAGE PLAY TIME, AVERAGE LIVES PER GAME * LDA #AVTIM JSR WRD7V PSHS X LDX #BKTIME LDY #BKPLAY PLAYS JSR BCDIV DO THE DIVIDE PULS X LDB QUO GET TOP OF QUOTIENT LDY QUO+1 BSR BOOKSB PRINT OUT TH 6 WITH THE RITE KIND OF BLANKING LDA QUO+3 GET 100THS ANDA #$F 1/10 STA DVTEMP SAVE LDA QUO+3 BITA #$10 1 IN THE 10'S BEQ BOOK45 ANDA #$EF TAKE THE BIT AWAY LSRA 1/2 ADDA #5 RESTORE THE WHATEVER DAA BRA BOOK46 BOOK45 LSRA 1/2 BOOK46 ADDA DVTEMP ADD THE 1/10 DAA TFR A,B LDA #AVTEND JSR WRD7V PUT OUT : END LDA #AVPLA JSR WRD7V PSHS X LDX #BKMEN LDY #BKPLAY PLAYS BSR BCDIV DO THE DIVIDE PULS X LDB QUO GET TOP OF QUOTIENT LDY QUO+1 BSR BOOKSB PRINT OUT TH 6 WITH THE RITE KIND OF BLANKING LDB QUO+3 GET 100THS LDA #AVPLEN JSR WRD7V JSR AVWAIT JMP ADJV NOW GO DO ADJUSTMENT MODE BOOKSB TSTB BEQ BOOK1 LDA #AUDM1 JSR WRD7V FULL SIX DIGITS USED LDA #AUDM2 JSR WRD7V BRA BOOK2 BOOK1 LDA #AUDM3 JSR WRD7V BOOK2 RTS CBCDA PSHS B JSR RCMOSA GET THE BYTE TFR A,B ANDA #$F CMPA #$9 BLS CMCDB LDA #9 CMCDB ANDB #$F0 CMPB #$90 BLS CMCDC LDB #$90 CMCDC PSHS B ORA ,S+ PULS B,PC * DIVIDE - PASS X POINTS AT DIVIDEND * PASS Y POINTS AT DIVISOR * QUOTIENT 4 BYTES AT QUO IN BCD WITH 100THS * QUO: QQ QQ QQ . DD BCDIV PSHS X,Y,D,U LDD #0 STD QUO STD QUO+2 ZERO QUOTIENT IN CASE OF ZERO DIVIDE BSR CBCDA GET 2 BYTES OF DIVIDEND STA DIV BSR CBCDA STA DIV+1 BSR CBCDA STA DIV+2 LDD #0 STA DIV+3 STD DIV+4 STA DIVSOR+3 STD DIVSOR+4 TFR Y,X POINT AT DIVISOR JSR CBCDA STA DIVSOR JSR CBCDA STA DIVSOR+1 JSR CBCDA STA DIVSOR+2 BNE BCDIV1 NOT ZERO....WE MAY CONTIUE LDD DIVSOR CHECK FOR ALL ZERO BEQ DIVEX EXIT...ZERO DIVISOR BCDIV1 LDU #QUO+2 POINT AT UNITS QUOTIENT VALUE BCDIV4 TST DIVSOR WE NEED TO SHIFT DIVISOR DOWN BNE BCDIV2 ITS IN THE RANGE WE LIKE LEAU -1,U MOVE TO PROPER SIGNIF LDB #5 BYTES TO SHIFT LDX #DIVSOR BCDIV3 LDA 1,X STA 0,X+ DECB BNE BCDIV3 CLR ,X SHIFT IN ZEROS BRA BCDIV4 BCDIV2 LDX #DIV BCDIV5 BSR SUBME DO A SUBTRACT BCC BCDIV5 DONE WITH THIS DIGIT LDY #DIVSOR+5 LAST DIGIT LDB #5 SHIFT 3 DOWN BCDIV6 LDA -1,Y GET PREVIOUS BYTE STA ,Y LEAY -1,Y PUSH BACK DECB BNE BCDIV6 CLR ,Y SHIFTED LEAU 1,U CMPU #QUO+3 LAST QUO BYTE BLS BCDIV5 DIVEX PULS X,Y,D,U,PC SUBME LDY #DIVSOR POINT AT DIVISOR LDA #0 MAKE SURE WE FIT SUBM1 LDB A,X GET DIVIDEND BYTE (MUST BE LARGER) SUBB ,Y+ WELL?? BHI SUBGO IT IS BLO SUBBYE IT ISN'T..DONE INCA CMPA #6 BLO SUBM1 SUBGO LDB #6 LDY #DIVTMP SUBGO1 LDA #$99 GET A BYTE SUBA 6,Y STA ,Y+ DECB BNE SUBGO1 LDB #6 CLC LDA #1 SUBGO2 ADCA ,-Y DAA STA ,Y AND STORE BACK LDA #0 DECB BNE SUBGO2 LDB #5 INITIAL OFFSET WHILE WALKING LDY #DIVTMP+6 CLC SUBGO3 LDA ,-Y GET THE SUBTREHEND ADCA B,X "SUBTRACT" FROM DIVISOR DAA STA B,X STORE BACK TO DIVISOR DECB BPL SUBGO3 LDA ,U GET CURRENT QUOTIENT BYTE ADDA #1 DAA STA ,U KICK IT CLC RTS SUBBYE SEC RTS * * SOUND TEST * SNDSRT JSR SCRCLR CLEAR THE SCREEN SNDSR1 LDD #$FE01 SET UP FOR SOUND LINE 1 STD PD,U RTS SNDCYC PULS D STD PD+6,U LDA #$3F STA SOUND NAP 1,SNDC55 SNDC55 LDA #$2C STA SOUND NAP 1,SNDCY6 SNDCY6 LDA #$3F STA SOUND NAP 1,SNDCY1 SNDCY1 LDD PD,U ANDA #$3F STA SOUND LDA #SNDTEX JSR WRD7V LDA #$40 STA PD+4,U SNDCY4 NAP 1,SNDCY5 SNDCY5 JSR AVCHK ADVANCE??? BCS SNDCY3 THEN GO DEC PD+4,U BNE SNDCY4 SNDCY3 LDA PD+2,U SEE WHO SET THIS UP?? BNE SNDC90 AUTOCY DID....ALWAYS ADVANCE LDA PIA0 CHECK MANUAL/AUTO RORA BCC SNDC91 MANUAL...DON'T MOVE ON. SNDC90 LDD PD,U SEC ROLA MOVE TO NEXT LINE INCB CMPB #7 UP TO LINE 7?? BLO SNDCY2 BSR SNDSR1 SNDCY2 STD PD,U SNDC91 JMP [PD+6,U] * * CMOS RAM TEST * CMTEST LDX #CMOS LDY #RAMALS USE SAMRAM CMTST1 LDA ,X+ DON'T DO DOUBLES BECAUSE OF HARDWARE BRAIN DAM. STA ,Y+ CMPX #CMOS+$400 DONE?? BNE CMTST1 LDB #6 ENOUGH ITERATIONS TO ASSURE ORCC #$3F STOP INTERRUPTS CMTST2 LDU HSEED LDY SEED LDX #CMOS CMTST3 JSR RAND STA ,X+ LDA #WDATA STA WDOG CMPX #CMOS+$400 DONE?? BNE CMTST3 STY SEED RESTORE SEED STU HSEED LDX #CMOS CMTST4 JSR RAND EORA ,X+ ANDA #$F BNE CMEROR LDA #WDATA STA WDOG CMPX #CMOS+$400 BNE CMTST4 DECB ANOTHER PASS...DONE?? BNE CMTST2 BSR RAMBAK CLC CLEAR IT FOR REAL RTS AND RETURN RAMBAK LDU #RAMALS LDY #CMOS RAMBK0 LDA ,U+ STA ,Y+ CMPY #CMOS+$400 BNE RAMBK0 RTS CMEROR BSR RAMBAK SEC RTS * RAM TEST....Y = PLACE TO RETURN IF NO ERROR * X = SEED TO START WITH * A = ITERATIONS TO MAKE RAMTST ORCC #$3F NO INTERRUPTS DURING TEST CLR RWCNTL SET TO RAM READ TFR A,DP COUNT AT DP. TFR X,D START WITH A PASSED SEED. RAM2 TFR D,U SAVE THE SEED RAM0 LDX #0 MEMORY POINTER RAM3 COMB DONT ASK BITB #9 BNE RAM4 COMB RORA RORB BRA RAM6 RAM4 COMB BITB #9 BNE RAM5 RORA RORB BRA RAM6 RAM5 LSRA RORB RAM6 STD ,X++ EXG X,D SINCE IRQ RUNS OUT OF RAM, STROKE ROVER TSTB BNE RAM6B EVERY 256! LDB #WDATA STB WDOG HAVE A BONE..EVER BEEN BONED..... TFR DP,B CHECK IS NORMAL DIAGS CMPB #$FF FF MEANS FRONT DOOR BNE RAM6C LDB PIA0 CHECK FOR ADV. BITB #2 BEQ RAM6C NOT PRESSED. JMP ,Y TIME TO RETURN RAM6C CLRB RETURN B TO ZERO RAM6B EXG X,D TRADE BACK CMPX #RAMTOP DONE?? BNE RAM3 NOPE..CONTINUE * TFR U,D RESTORE SEED. LDX #0 RAM7 COMB BITB #9 BNE RAM8 COMB RORA RORB BRA RAM10 RAM8 COMB BITB #9 BNE RAM9 RORA RORB BRA RAM10 RAM9 LSRA RORB RAM10 CMPD ,X++ BNE RERROR RAM ERROR! RAM25 EXG X,D CHECK FOR END OF PAGE TSTB BNE RAM17 LDB #WDATA STB WDOG TFR DP,B SEE IF NORMAL RUN CMPB #$FF FRONT DOOR?? BNE RAM17C NOPE LDB PIA0 CHECK ADV. BITB #2 BEQ RAM17C JMP ,Y JUST RETURN (NO ERRORS) RAM17C CLRB RAM17 EXG X,D TRADE BACK CPX #RAMTOP DONE?? BNE RAM7 TFR D,U SHOVE NEW SEED OVER TFR DP,A CMPA #$FF FF INDICATES FRONT DOOR BNE RAM99 TFR U,D JMP RAM0 DO ANOTHER ITERATION IN THIS TEST. RAM99 DECA TAKE ONE AWAY TFR A,DP RETURN CMPA #$80 ZERO OUT IN AUTO CYCLE??? BEQ RAM99Z YEP.... TSTA SET FOR BELOW BRANCH TFR U,D MAKE SEED AND SAVED SEED LOOK ALIKE LBNE RAM0 DO ANOTHER ITERATION RAM99Z LDB #1 SET BACK TO ROM STB RWCNTL JMP ,Y RETURN RERROR LEAX -2,X BACK TO ERROR POINT EORA ,X FIND DIFFERENCE. EORB 1,X TSTA NO DIFFERENCE? BNE RERR2 DIFF. TSTB BNE RERR2 LEAX 2,X UNDO THIS BULLSHIT...MAYBE ALPHA BABY. BRA RAM25 AND CONTINUE RERR2 LDU #$30 FIND BANK NUMBER EXG X,D CLRB EXG X,D RERR0 CMPX #0 BEQ RERR1 DONE. LEAX -$100,X LEAU $10,U CMPU #$30 BLS RERR0 LDU #$10 BRA RERR0 RERR1 LEAU 1,U ASRA BCS RERR5 THIS IS THE BIT ASRB BCS RERR5 BRA RERR1 RERR5 TFR U,D BRING THE BANK,BIT INTO B LDA #1 INDICATE RAM ERROR STA RWCNTL BACK TO THAT JAZZ LDS #RERR6 RETURN HERE BRA PULSE PULSE THE LEDS RERR6 LDA #RAM>>8 TFR A,DP TFR CC,A COMA BITA #$C0 INITIAL TEST??? BEQ RER098 YEP LDA #FDRAMM BRA RER099 RER098 LDA #RERRM RER099 LDS #HSTK SET UP THE STACK JSR SCRCLR JSR WRD7V PRINT THE MESSAGE. TFR CC,A SEE WHICH TEST BITA #$40 FIRQ SAYS FRONT DOOR BNE REROR7 NOPE JMP FDRET DO THE FRONT DOOR RETURN REROR7 LDY #INIT OTHERWISE START...TRY AND RUN THE GAME. BRA DELAY DELAY LDA #32 DELA1 LDX #$5800 DELA2 LEAX -1,X LDB #WDATA STB WDOG CMPX #0 BNE DELA2 DECA BNE DELA1 JMP ,Y RETURN * * PULSE......PUT SOME CRAP IN LED'S * LOW HALF OF A IS ERROR CODE... * BOTH HALVES OF B ARE THE RELEVANT DATA. * PULSE TFR D,U SAVE A,B LDA #2 TFR A,DP PULSE0 TFR U,D LDY #PULSE1 BRA PSSUB PULSE1 LDA #2 LDY #PULSE2 BRA DELA1 PULSE2 LDY #PULSE3 BRA BLKLED PULSE3 LDA #1 LDY #PULSE4 BRA DELA1 PULSE4 TFR U,D GET DATA BACK TFR B,A SHIFT B DOWN LSRA LSRA LSRA LSRA PROPER HALF LDY #PULSE5 BRA PSSUB PULSE IT. PULSE5 LDA #2 LDY #PULSE6 BRA DELA1 PULSE6 LDY #PULSE7 BRA BLKLED PULSE7 LDA #1 LDY #PULSE8 BRA DELA1 PULSE8 TFR U,D TFR B,A LDY #PULSE9 BRA PSSUB PULSE9 LDA #2 LDY #PULS10 BRA DELA1 PULS10 LDY #PULS11 BRA BLKLED PULS11 LDA #5 LDY #PULS12 JMP DELA1 PULS12 TFR DP,A SEE IF FIRST PASS?? DECA TFR A,DP BNE PULSE0 LDY #PULS95 BRA BLKLED BLANK EM. PULS95 TFR U,D RESTORE D JMP ,S AND RETURN BLKLED LDA #$3C STA PIA0+1 INCA STA PIA1+1 LDA #$C0 STA PIA1 JMP ,Y AND RETURN * PSSUB - PUT LOW HALF OF A TO LEDS PSSUB TFR A,B SAVE A COPY. RORA BIT 0 - CARRY RORA BIT 0 - BIT 7 RORA BIT 0 - BIT 6 ANDA #$C0 STA PIA1 THOSE BITS OUT. LDA #$34 ASSUME ZERO BITB #$4 SEE IF 1 BEQ PSSUB1 NOPE LDA #$3C PSSUB1 STA PIA1+1 THATS ALL FOR THAT BIT LDA #$34 BITB #$8 BEQ PSSUB2 LDA #$3C PSSUB2 STA PIA0+1 JMP ,Y AND RETURN ROMTST ORCC #$3F NO INTERRUPTS WHILE THIS RUNS LDX #ROMTAB INDEX INTO TABLE ROM0 CMPX #ROMEND DONE?? BEQ ROMDUN YEP LDA 1,X LOOK TO SEE IF PART STUFFED?? BEQ ROMBOT NOPE...MOVE TO NEXT LDA ,X GET BASE CLRB TFR D,U USE U TO POINT THROUGH LDA #WDATA FOR ROVER ROM1 ADDB ,U+ ADD A BYTE STA WDOG EXG D,U SEE IF DUN CMPA 2,X ARE WE TO NEXT PART EXG D,U CHANGE BACK BNE ROM1 NOPE CMPB 1,X EXPECTED SUM??? BNE ROMERR NOPE....LETS SEND OUT PROBLEM WARNING. ROMBOT LEAX 2,X MOVE TO NEXT PART BRA ROM0 ROMERR LDA ,X GET THE ADDRESS OF THE BAD PART LSRA LSRA LSRA LSRA CMPA #$D ONE OF TOP 3 PARTS?? BLO ROMER1 NOPE SUBA #4 GROUP THEM WITH THE LOWER PARTS ROMER1 ADDA #1 MAKE ERRORS FROM 1-12 DAA AND MAKE BCK TFR A,B LDA #2 ROM ERROR LDS #RERR3 RETURN JMP PULSE AND SEND OUT THE CODE RERR3 LDA #RAM>>8 TFR A,DP LDA #WDATA STA WDOG LDS #HSTK JSR SCRCLR TFR CC,A COMA BITA #$C0 INITIAL TEST?? BEQ RERR94 LDA #FDROMM BRA RERR95 RERR94 LDA #ROMERM RERR95 JSR WRD7V PUT THE MESSAGE ON THE SCREEN TFR CC,B SEE WHERE WE CAM FROM BITB #$40 FIRQ SAYS FRONT DOOR BNE ROMER3 JMP FDROM ROMER3 LDY #INIT NOW TRY AND RUN THE GAME JMP DELAY BUT NOT UNTIL A SHORT DELAY. ROMDUN JMP ,Y ALL ROMS OK...RETURN. * ROMTAB - THIS TABLE INDICATES THE BASE OF THE PART, AND THE * RESULTING SUM. IF SUM=0 THEN PART IS NOT STUFFED. ROMTAB FCB $00,0 0000 FCB $10,0 1000 FCB $20,0 2000 FCB $30,0 3000 FCB $40,0 4000 FCB $50,0 5000 FCB $60,0 6000 FCB $70,0 7000 FCB $80,0 8000 FCB $90,0 9000 FCB $A0,0 A000 FCB $B0,0 B000 FCB $C0,0 C000 FCB $D0,0 D000 FCB $E0,0 E000 FCB $F0,0 F000 ROMEND FCB 0 FCB 0 CHECK BYTE (FUDGER) FOR THIS PART ($F000) FCC '(C)1982 WILLIAMS ELEC.INC' ORG $FFF0 FDB PWRUPV,PWRUPV,PWRUPV,PWRUPV FDB PWRUPV FDB PWRUPV,PWRUPV,PWRUPV END