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
