INCLUDE "BALLYEQU.H" ; SCRBCART.ASM for Astrocade - Ver. 1.12 - March 5, 2002 ; Cart Version 1.0 - 4-2-2003 ; ********** - Retyped from the Nutting manual ; * SKETCH * by Adam Trionfo ; ********** - Assembled using Zmac 1.3 ; - Source has been slightly modified to ; match EXACTLY with "3159" ROM ; The official name of this program is Scribbling ; zmac -i -m -o scrbcart.bin -x scrbcart.lst scrbcart.asm ; Sketch equates ; Sketch packet displacements SCPSIZ EQU 30 ; Size of sketch packet SCSAVA EQU 0 ; Save area start SCXC EQU 26 ; X coordinate SCYC EQU 27 ; Y coordinate SCSADL EQU 28 ; Save address Lo and Hi SCSADH EQU 29 ; Other goodies MOVTMR EQU 4 ; Move rate KSCTRV EQU 20 ; Color stepping time ORG FIRSTC ; FIRST BYTE OF CARTRIDGE ; ALL CARTRIDGES THAT USE THE MENU MUST HAVE $55 AS THE ; FIRST BYTE, SEE BALLY ROM SOURCE $0CDE FOR CHECK OF ; THIS BYTE. DB $55 ; BALLY SYSTEM SENTINEL ; O.S. MENU DATA STRUCTURE DW MENUST ; NEXT MENU LINK DW STRING ; 'SCRIBBLING' MENU TEXT DW BEGIN ; JUMP HERE IF ITEM SELECTED ; START OF MAIN PROGRAM BEGIN: SYSSUK GETPAR DW NOPLAY DB 1 DW NUMPLY SCCLR: LD SP,SCRSTK SYSTEM INTPC DO FILL DW NORMEM DW 92*BYTEPL DB 0 DO FILL DW P1SCP DW SCPSIZ*4 DB 0 DO SETOUT DB 184 DB 40 DB 8 DO MOVE DW COLORS DW 8 DW INICOL DO COLSET DW COLORS DO SETW DB 70 DB 36 DW P1SCP+SCXC DO SETW DB 83 DB 36 DW P2SCP+SCXC DO SETW DB 70 DB 48 DW P3SCP+SCXC DO SETW DB 83 DB 48 DW P4SCP+SCXC DO SETB DB MOVTMR DW CT0 DONT XINTC MAINLP: LD HL,MAINLP PUSH HL SYSSUK SENTRY DW KEYMES SYSSUK DOIT DW SCDOTB RET KEYMES: DB $2F DB $F DB $F DB $F ; Keyboard handler KEYB0: DEC B LD C,3 LD A,B CP 20 ; Clear entry down? JR Z,$+(SCCLR-$) ; Jump to clear if so RRCA RRCA AND C SYSSUK INDEXB DW CDELTB EX DE,HL LD A,B AND C LD H,A LD A,C SUB H SYSSUK INDEXB ; Point at color DW COLORS LD A,(DE) ADD A,(HL) ; Add delta factor BIT 3,B ; Was key for intensity? JR Z,$+(KEYB1-$) XOR (HL) AND 7 XOR (HL) KEYB1: LD (HL),A INC HL ; Change color on other side INC HL INC HL INC HL LD (HL),A SYSSUK COLSET DW COLORS LD A,KSCTRV ; Set KEYSEX clear timer LD (CT1),A RET ; Routine to clear KEYSEX KLRKSX: XOR A LD (KEYSEX),A RET SCDOTB: JMPd SCT0,DOWRTS,0 JMPd SCT1,KLRKSX,0 JMPd SKYD,KEYB0,0 ; Iterate through active players subroutine ITER4: LD IX,P1SCP LD A,(NUMPLY) LD B,A LD C,A ITER41: PUSH BC PUSH HL LD DE,ITRET PUSH DE JP (HL) ITRET: LD DE,SCPSIZ ADD IX,DE POP HL POP BC DJNZ $+(ITER41-$) RET ; Update Coordinates Routine SCRUPD: LD A,C SUB B SYSSUK INDEXB DW OSW0 AND $F CALL GETDLT ; Get deltas LD A,(IX+SCXC) ; Update X ADD A,D CP 152 ; Out of bounds? JR NC,$+(SCRUP1-$) LD (IX+SCXC),A SCRUP1: LD A,(IX+SCYC) ; Same for Y ADD A,H CP 85 RET NC LD (IX+SCYC),A RET ; Restore SCREST: PUSH IX POP DE LD A,(DE) AND A RET Z LD H,(IX+SCSADH) LD L,(IX+SCSADL) SYSTEM RESTOR XOR A LD (DE),A RET ; Write Routine SCRWRT: LD A,C SUB B SYSSUK INDEXB DW OSW0 AND $10 RET Z SCRWR1: DEC HL ; Backup to pot DEC HL DEC HL DEC HL DEC HL LD A,(HL) RLCA RLCA LD C,A AND 3 SYSSUK INDEXB ; Set sizes DW SIZTBL LD D,(IX+SCYC) LD E,(IX+SCXC) LD B,A LD A,C RLCA RLCA AND 3 SCRWR2: SYSSUK INDEXB DW COLMSK LD C,B SYSTEM RECTAN RET COLMSK: DB 0 DB 01010101B DB 10101010B DB 11111111B SIZTBL: DB 1 DB 2 DB 4 CDELTB: DB 8 DB -8 DB 1 DB -1 ; Save Routine SCRSAV: LD A,B SYSSUK INDEXB DW OSW0-1 AND $10 RET NZ PUSH HL LD D,(IX+SCYC) LD E,(IX+SCXC) SYSTEM RELAB1 LD (IX+SCSADH),D LD (IX+SCSADL),E EX DE,HL PUSH IX POP DE LD BC,$0803 ; Save worst case SYSTEM SAVE POP HL JR $+(SCRWR1-$) ; Zero Player Game Write Handler ZEROPL: LD HL,ZPSTMR ; LOAD PTR TO SIZE TIMER LD DE,ZPSIZ ; AND SIZE TRACKER DEC (HL) ; DECREMENT SIZE TIMER JP P,ZPA ; JUMP IF NO COUNTDOWN SYSSUK RANGED DB 48 CP 8 ; 8-479 ??? JR C,$+(ZP0-$) ; NO - ZP0 AND 3 ; YES - HAVE MORE 1-4S ZP0: INC A LD (DE),A ; GET NEW SIZE SYSSUK RANGED ; GET NEW SIZE TIMER DB 120 LD (HL),A ZPA: INC HL ; ADVANCE TO COLOR STUFF INC DE DEC (HL) ; AND DEC COLOR TIMER JP P,ZPB SYSSUK RANGED ; GET NEW COLOR DB 4 LD (DE),A SYSSUK RANGED ; GET NEW COLOR TIMER DB 120 LD (HL),A ZPB: INC HL ; TO DIRECTION STUFF INC DE DEC (HL) ; DECREMENT DIRECTION TIMER JP P,ZPD ZPC: LD DE,DIRVAL ; DE = DIRECTION TRACKER SYSSUK RANGED ; DRAW NEW DIRECTION DB 10 INC A CP 3 ; REJECT ILLEGAL MOVES JR Z,$+(ZPC-$) CP 7 JR Z,$+(ZPC-$) LD (DE),A SYSSUK RANGED DB 40 LD (DIRTMR),A ZPD: LD A,(DE) ; GET DIRECTION VALUE CALL GETDLT ; GET DELTAS LD BC,P1SCP+SCXC ; POINT AT COORDINATE LD A,(BC) ADD A,D CP 80 JR NC,$+(ZPC-$) ; GET NEW DIRECTION IF AT LMT LD (BC),A LD E,A ; SAVE X COORDINATE INC BC LD A,(BC) ADD A,H CP 46 JR NC,$+(ZPC-$) LD (BC),A LD D,A ; SET Y COORDINATE LD HL,ZPSIZ ; POINT AT SIZES AGAIN LD B,(HL) INC HL LD A,(HL) ; GET COLOR TOO CALL SCRWR2 ; DO FIRST WRITE LD H,A ; SAVE COLOR PUSH DE ; AND X,Y LD A,92 ; REFLECT Y SUB B SUB D LD D,A LD A,H SYSTEM RECTAN LD A,160 ; REFLECT X SUB C SUB E LD E,A LD A,H SYSTEM RECTAN POP HL ; RESTART X,Y LD D,H ; RESTORE Y SYSTEM RECTAN LD A,$FF ; RESET TIMEOUT LD (TIMOUT),A ZERO1: LD A,1 ; RESET COUNTER-TIMER JR $+(ZERO2-$) DOWRTS: LD A,(NUMPLY) DEC A CP 4 JP NC,ZEROPL LD HL,SCRUPD CALL ITER4 LD HL,SCREST CALL ITER4 LD HL,SCRWRT CALL ITER4 ; NOW GOING BACKWARDS SAVE AND WRITE EVERYBODY WITH TRIGG LD B,C SCRB3: LD DE,-SCPSIZ ADD IX,DE PUSH BC CALL SCRSAV POP BC DJNZ $+(SCRB3-$) LD A,MOVTMR ZERO2: LD (CT0),A RET ; DONE ; SUBROUTINE TO SCARE UP DELTAS GETDLT: PUSH BC LD B,A SYSSUK MSKTD DW $100 DB 0 DW $100 POP BC RET ; INITIAL COLORS INICOL: DB $8 DB $62 ; Value changed from $5B to match DB $A5 ; exactly with "3159" ROM DB $7 DB $8 DB $62 ; Value changed from $5B to match DB $A5 ; exactly with "3159" ROM DB $7 ; ORG $4000+3720 - Note - DEFS statements removed ; SWITCH RAM: Original Source Syntax ; DEFS 96 ---------------------- SCRSTK EQU $4EE8 ; SCRSTK: COLORS EQU $4EE8 ; COLORS: DEFS 8 ZPSTMR EQU $4EF0 ; ZPSTMR EQU $ DIRTMR EQU ZPSTMR+2 ; DIRTMR EQU ZPSTMR+2 ZPSIZ EQU DIRTMR+1 ; ZPSIZ EQU DIRTMR+1 DIRVAL EQU ZPSIZ+2 ; DIRVAL EQU ZPSIZ+2 P1SCP EQU $4EF0 ; P1SCP: DEFS SCPSIZ P2SCP EQU $4F0E ; P2SCP: DEFS SCPSIZ P3SCP EQU $4F2C ; P3SCP: DEFS SCPSIZ P4SCP EQU $4F4A ; P4SCP: DEFS SCPSIZ STRING DB 'S','C','R','I','B','B','L','I','N','G' DB $00 ; END