home *** CD-ROM | disk | FTP | other *** search
/ ftp.elysium.pl / ftp.elysium.pl.tar / ftp.elysium.pl / other / vic20 / connect4.src < prev    next >
Text File  |  2008-03-07  |  15KB  |  880 lines

  1. ; Zero-page registers
  2.  
  3. r0 = $fb ; a pointer
  4.  
  5. c4Player     = $07
  6. c4GameState  = $08 ; and $09
  7. c4Depth      = $0a
  8. c4Level      = $0b
  9. c4BestIndex  = $0c
  10. c4BestWorst  = $0d
  11. c4Goodness   = $0e
  12. c4Alpha      = $0f
  13. c4Beta       = $10
  14. c4MaxAB      = $11
  15. c4Best       = $12
  16. c4Temp1      = $13
  17. c4Temp2      = $14
  18. c4Temp3      = $15
  19. c4Temp4      = $16
  20. c4Temp5      = $17
  21. c4Temp6      = $18
  22.  
  23. ; Game state offsets
  24.  
  25. c4BoardOffset      = 0 ; assumed
  26. c4ScoreArrayOffset = 48
  27. c4ScoresOffset     = 186
  28. c4WinnerOffset     = 188
  29. c4TopPiecesOffset  = 189
  30.  
  31. c4StateSize        = 189
  32.  
  33. ; Other constants
  34.  
  35. c4None            = $ff
  36. c4HighestGoodness = $7f
  37. c4LowestGoodness  = $81
  38.  
  39. ; Kernal routines
  40.  
  41. chrOut = $ffd2
  42. getIn  = $ffe4
  43.  
  44. ; Start of program
  45.  
  46. * = 2049
  47. .obj "0:connect4"
  48.  
  49.     .byte 74, 8  ; end of BASIC program
  50.     .byte 0, 0   ; line number
  51.     .byte $9e    ; SYS
  52.     .asc "2124:"
  53.     .byte $8f    ; REM
  54.     .byte $22    ; quote
  55.   c4IntroText = *
  56.     .byte 147    ; clear screen
  57.     .byte 13+128
  58.     .byte 9, 14  ; switch to lower case
  59.     .asc "Connect 4"
  60.     .byte 13+128, 13+128
  61.     .asc "by Keith Pomakis"
  62.     .byte 13+128
  63.     .asc "pomakis@pobox.com"
  64.     .byte 13+128
  65.     .asc "May, 1997"
  66.     .byte 13+128
  67.     .byte 0, 0, 0
  68.  
  69.     ldx #19
  70.   - lda $06,x
  71.     sta c4ZeroPageSave-1,x
  72.     dex
  73.     bne -
  74.  
  75.     lda #<c4IntroText
  76.     sta r0
  77.     lda #>c4IntroText
  78.     sta r0+1
  79.     jsr printStr
  80.  
  81.     jsr c4PlayGame
  82.  
  83.     ldx #19
  84.   - lda c4ZeroPageSave-1,x
  85.     sta $06,x
  86.     dex
  87.     bne -
  88.     rts
  89.  
  90.  
  91. getNum = *
  92.     ; Gets a single digit between 0 and
  93.     ; 7 from the keyboard.  'q' returns
  94.     ; 0 as well.
  95.  
  96.     ; Input: r0     - pointer to prompt
  97.     ; Retrn: .Y     - the number
  98.     ; Ruins: .A
  99.  
  100.     jsr printStr
  101.  
  102.   - jsr getIn
  103.     cmp #0
  104.     beq -
  105.  
  106.     cmp #"q"
  107.     bne +
  108.     jsr chrOut
  109.     ldy #0
  110.     beq ++ ; always true
  111.  
  112.   + cmp #"0"
  113.     bmi ++
  114.     cmp #"8"
  115.     bpl ++
  116.     pha
  117.     jsr chrOut
  118.     pla
  119.     sec
  120.     sbc #"0"
  121.     tay
  122.  
  123.   + jsr printCR
  124.     jmp printCR ; jsr/rts
  125.  
  126.   + ldy 53280
  127.     lda #2
  128.     sta 53280
  129.     lda $a2 ; low byte of jiffy clock
  130.     clc
  131.     adc #4
  132.   - cmp $a2
  133.     bne -
  134.     sty 53280
  135.     beq -- ; always true
  136.  
  137.  
  138. printStr = *
  139.     ; Prints a null-terminated string.
  140.  
  141.     ; Input: r0   - pointer to string
  142.     ; Retrn: .Y   - length of string
  143.  
  144.     pha
  145.  
  146.     ldy #0
  147.   - lda (r0),y
  148.     beq +
  149.     jsr chrOut
  150.     iny
  151.     bne - ; always true
  152.  
  153.   + pla
  154.     rts
  155.  
  156.  
  157. printCR = *
  158.     ; Prints a carraige return.
  159.     ; Ruins: .A
  160.  
  161.     lda #13
  162.     jmp chrOut ; jsr/rts
  163.  
  164. ;----------------------------------------------------------------------------
  165.  
  166. c4PlayGame = *
  167.  
  168.     jsr c4NewGame
  169.  
  170.     lda #<c4PlayGameLevelStr
  171.     sta r0
  172.     lda #>c4PlayGameLevelStr
  173.     sta r0+1
  174.     jsr getNum
  175.     cpy #0
  176.     bne +
  177.     rts
  178.  
  179.   + sty c4Level
  180.     lda #0
  181.     sta c4Player
  182.  
  183.   - jsr c4PrintBoard
  184.     
  185.     ldy #c4WinnerOffset
  186.     lda (c4GameState),y
  187.     cmp #c4None
  188.     beq +
  189.     lda #<c4PlayGame1WinStr
  190.     sta r0
  191.     lda #>c4PlayGame1WinStr
  192.     sta r0+1
  193.     jsr printStr
  194.     jmp c4PlayGame
  195.  
  196.   + ldy #c4TopPiecesOffset
  197.     lda (c4GameState),y
  198.     cmp #7
  199.     bne +
  200.     rts
  201.  
  202.   / ldy c4Player
  203.     lda c4PlayGameTable,y
  204.     sta c4PlayGameMovePieceChar
  205.     lda #<c4PlayGameMoveStr
  206.     sta r0
  207.     lda #>c4PlayGameMoveStr
  208.     sta r0+1
  209.     jsr getNum
  210.     cpy #0
  211.     beq c4PlayGame ; always true
  212.  
  213.     dey
  214.     jsr c4DropPiece
  215.     bcs -
  216.  
  217.     jsr c4PrintBoard
  218.     jsr printCR
  219.  
  220.     ldy #c4WinnerOffset
  221.     lda (c4GameState),y
  222.     cmp #c4None
  223.     beq +
  224.     lda #<c4PlayGame0WinStr
  225.     sta r0
  226.     lda #>c4PlayGame0WinStr
  227.     sta r0+1
  228.     jsr printStr
  229.     jmp c4PlayGame
  230.  
  231.   + ldy #c4TopPiecesOffset
  232.     lda (c4GameState),y
  233.     cmp #7
  234.     bne +
  235.     lda #<c4PlayGameTieStr
  236.     sta r0
  237.     lda #>c4PlayGameTieStr
  238.     sta r0+1
  239.     jsr printStr
  240.     jmp c4PlayGame
  241.  
  242.   + lda c4Player
  243.     eor #$01
  244.     sta c4Player
  245.  
  246.     lda #<c4PlayGameThinkingStr
  247.     sta r0
  248.     lda #>c4PlayGameThinkingStr
  249.     sta r0+1
  250.     jsr printStr
  251.  
  252.     jsr c4AutoMove
  253.  
  254.     jsr printCR
  255.     jsr printCR
  256.  
  257.     lda c4Player
  258.     eor #$01
  259.     sta c4Player
  260.  
  261.     jmp --
  262.  
  263.   c4PlayGameTable = *
  264.     .asc "XO"
  265.  
  266.   c4PlayGameLevelStr = *
  267.     .byte 13
  268.     .asc "Level? "
  269.     .byte 0
  270.  
  271.   c4PlayGameMoveStr = *
  272.     .byte 13
  273.     .asc "Move "
  274.   c4PlayGameMovePieceChar = *
  275.     .asc " ? "
  276.     .byte 0
  277.  
  278.   c4PlayGameThinkingStr = *
  279.     .asc "Thinking"
  280.     .byte 0
  281.  
  282.   c4PlayGameTieStr = *
  283.     .byte 13
  284.     .asc "Tie!"
  285.     .byte 13, 0
  286.  
  287.   c4PlayGame0WinStr = *
  288.     .byte 13
  289.     .asc "You win!"
  290.     .byte 13, 0
  291.  
  292.   c4PlayGame1WinStr = *
  293.     .byte 13
  294.     .asc "I win!"
  295.     .byte 13, 0
  296.  
  297.  
  298. c4PrintBoard = *
  299.     ; Ruins: .A, .Y, R0
  300.  
  301.     ldy #40
  302.   - lda (c4GameState),y
  303.     bne +
  304.     lda #"X"
  305.     bne +++ ; always true
  306.   + cmp #1
  307.     bne +
  308.     lda #"O"
  309.     bne ++  ; always true
  310.   + lda #"."
  311.  
  312.   + jsr chrOut
  313.     iny
  314.     tya
  315.     and #$07
  316.     cmp #$07
  317.     bne -
  318.     jsr printCR
  319.     cpy #$07
  320.     beq +
  321.     tya
  322.     sec
  323.     sbc #15
  324.     tay
  325.     jmp -
  326.  
  327.   + lda #<c4PrintBoardStr
  328.     sta r0
  329.     lda #>c4PrintBoardStr
  330.     sta r0+1
  331.     jmp printStr ; jsr/rts
  332.  
  333.   c4PrintBoardStr = *
  334.     .asc "1234567"
  335.     .byte 13, 0
  336.  
  337.  
  338. c4NewGame = *
  339.     ; Retrn: .A   - 0
  340.     ; Ruins: .Y
  341.  
  342.     ; Set up the "real" game state.
  343.     ; Make sure it starts at a page
  344.     ; boundary.
  345.     ldx #0
  346.     stx c4GameState
  347.     ldx #>c4EndOfProgram
  348.     inx
  349.     stx c4GameState+1
  350.  
  351.     lda #c4None
  352.     ldy #47
  353.   - sta (c4GameState),y
  354.     dey
  355.     bpl -
  356.  
  357.     lda #1
  358.     ldy #c4ScoreArrayOffset
  359.   - sta (c4GameState),y
  360.     iny
  361.     cpy #c4ScoreArrayOffset+138
  362.     bne -
  363.  
  364.     lda #69
  365.     ldy #c4ScoresOffset
  366.     sta (c4GameState),y
  367.     iny
  368.     sta (c4GameState),y
  369.  
  370.     lda #c4None
  371.     ldy #c4WinnerOffset
  372.     sta (c4GameState),y
  373.  
  374.     lda #0
  375.     ldy #c4TopPiecesOffset
  376.     sta (c4GameState),y
  377.     sta c4Depth
  378.  
  379.     rts
  380.  
  381.  
  382. c4DropPieceSpecial = *
  383.     ; Input: .Y   - c4DropOrder index of column to drop into
  384.     ; Retrn: .C   - 0 success, 1 failure
  385.     ; Ruins: .A, .X, .Y, R0, c4Temp1
  386.     ;        c4Temp2, c4Temp3, c4Temp4
  387.  
  388.     tya
  389.     tax
  390.     ldy c4DropOrder,x
  391.     ; Fall through to c4DropPiece.
  392.  
  393.  
  394. c4DropPiece = *
  395.     ; Input: .Y   - column to drop into
  396.     ; Retrn: .C   - 0 success, 1 failure
  397.     ; Ruins: .A, .X, .Y, R0, c4Temp1
  398.     ;        c4Temp2, c4Temp3, c4Temp4
  399.  
  400.   - lda (c4GameState),y
  401.     cmp #c4None
  402.     beq +
  403.  
  404.     tya
  405.     clc
  406.     adc #8
  407.     tay
  408.     cpy #48
  409.     bmi -
  410.  
  411.     sec
  412.     rts
  413.  
  414.   + lda c4Player
  415.     sta (c4GameState),y
  416.  
  417.     ; Keep track of the number of
  418.     ; pieces on the top row of the
  419.     ; board so a tie can be spotted.
  420.     cpy #40
  421.     bmi +
  422.     sty c4Temp1
  423.     ldy #c4TopPiecesOffset
  424.     lda (c4GameState),y
  425.     clc
  426.     adc #1
  427.     sta (c4GameState),y
  428.     ldy c4Temp1
  429.  
  430.   + tya
  431.     jsr c4UpdateScore
  432.     clc
  433.     rts
  434.  
  435.  
  436. c4UpdateScore = *
  437.     ; Input: c4Player - player (0 or 1)
  438.     ;        .A   - index of new piece
  439.     ;               (x*8 + y)
  440.     ; Ruins: .A, .X, .Y, R0, c4Temp1,
  441.     ;        c4Temp2, c4Temp3, c4Temp4
  442.  
  443.     c4ScoreDiffOfThisPlayer  = c4Temp3
  444.     c4ScoreDiffOfOtherPlayer = c4Temp4
  445.  
  446.     ; Calculate the index of the proper
  447.     ; array of score array indexes.
  448.     ; i.e., one of c4Map00, c4Map01, ...
  449.  
  450.     asl
  451.     tay
  452.     lda c4Map,y
  453.     sta c4ProperMap
  454.     lda c4Map+1,y
  455.     sta c4ProperMap+1
  456.  
  457.     lda #0
  458.     sta c4ScoreDiffOfThisPlayer
  459.     sta c4ScoreDiffOfOtherPlayer
  460.  
  461.     ; Loop through each of the score
  462.     ; units in the indexed array.
  463.     ldx #0
  464.   c4ProperMap = *+1
  465.   - lda $ffff,x
  466.     cmp #c4None
  467.     bne ++
  468.  
  469.     ; We're done.  Update the scores.
  470.     lda c4Player
  471.     beq +
  472.     ldy #c4ScoresOffset
  473.     lda (c4GameState),y
  474.     clc
  475.     adc c4ScoreDiffOfOtherPlayer
  476.     sta (c4GameState),y
  477.     iny
  478.     lda (c4GameState),y
  479.     clc
  480.     adc c4ScoreDiffOfThisPlayer
  481.     sta (c4GameState),y
  482.     rts
  483.  
  484.   + ldy #c4ScoresOffset
  485.     lda (c4GameState),y
  486.     clc
  487.     adc c4ScoreDiffOfThisPlayer
  488.     sta (c4GameState),y
  489.     iny
  490.     lda (c4GameState),y
  491.     clc
  492.     adc c4ScoreDiffOfOtherPlayer
  493.     sta (c4GameState),y
  494.  
  495.     rts
  496.  
  497.   + clc
  498.     adc #c4ScoreArrayOffset
  499.  
  500.     ; .A now contains the index of the
  501.     ; proper score unit of player 0.
  502.  
  503.     ; Double the score unit of the
  504.     ; current player.
  505.     sta c4Temp1
  506.     ldy #0
  507.     cpy c4Player
  508.     beq +
  509.     clc
  510.     adc #69
  511.   + tay
  512.     lda (c4GameState),y
  513.     sta c4Temp2
  514.     asl
  515.     sta (c4GameState),y
  516.  
  517.     ; Is this a winning move?
  518.     cmp #16
  519.     bne +
  520.     lda c4Player
  521.     ldy #c4WinnerOffset
  522.     sta (c4GameState),y
  523.     lda #16
  524.  
  525.   + sec
  526.     sbc c4Temp2
  527.     clc
  528.     adc c4ScoreDiffOfThisPlayer
  529.     sta c4ScoreDiffOfThisPlayer
  530.  
  531.     ; Zero the score unit of the other
  532.     ; player.
  533.     lda c4Temp1
  534.     ldy #1
  535.     cpy c4Player
  536.     beq +
  537.     clc
  538.     adc #69
  539.   + tay
  540.     lda c4ScoreDiffOfOtherPlayer
  541.     sec
  542.     sbc (c4GameState),y
  543.     sta c4ScoreDiffOfOtherPlayer
  544.     lda #0
  545.     sta (c4GameState),y
  546.  
  547.     inx
  548.     bne - ; always true
  549.  
  550.  
  551. c4GoodnessOfCurrentPlayer = *
  552.     ; Calculates the "goodness" of the
  553.     ; current board relative to the
  554.     ; current player.  This amounts to
  555.     ; score(player)-score(other(player)).
  556.  
  557.     ; Retrn: .A   - goodness
  558.     ;        .Y   - current player
  559.  
  560.     ldy #c4ScoresOffset
  561.     lda (c4GameState),y
  562.     iny
  563.     sec
  564.     sbc (c4GameState),y
  565.     ldy c4Player
  566.     beq +
  567.     eor #$ff
  568.     clc
  569.     adc #1
  570.   + rts
  571.  
  572.  
  573. c4PushState = *
  574.     ; Ruins: .A, .X
  575.  
  576.     ldx c4GameState+1
  577.     stx c4OldStateAddr1
  578.     stx c4OldStateAddr2
  579.     inx
  580.     stx c4NewStateAddr1
  581.     stx c4NewStateAddr2
  582.     stx c4GameState+1
  583.  
  584.     ldx #c4StateSize
  585.   c4OldStateAddr1 = *+2
  586.   - lda $ff00,x
  587.   c4NewStateAddr1 = *+2
  588.     sta $ff00,x
  589.     dex
  590.     bne -
  591.  
  592.   c4OldStateAddr2 = *+2
  593.     lda $ff00,x
  594.   c4NewStateAddr2 = *+2
  595.     sta $ff00,x
  596.  
  597.     inc c4Depth
  598.     rts
  599.  
  600.  
  601. c4PollFn = *
  602.     ; Protect .Y!
  603.  
  604.     lda #"."
  605.     jmp chrOut ; jsr/rts
  606.  
  607.  
  608. c4AutoMove = *
  609.     ; Retrn: c4BestIndex
  610.     ;            - c4DropOrder index of column dropped into
  611.  
  612.     lda #c4LowestGoodness
  613.     sta c4BestWorst
  614.     lda #c4None
  615.     sta c4BestIndex
  616.     ldy c4GameState+1
  617.     iny
  618.     sty c4GameStatePage
  619.     lda #0
  620.     sta c4Goodness
  621.  
  622.     ldy #0
  623.   - jsr c4PushState
  624.     jsr c4PollFn
  625.  
  626.   - sty c4Temp5
  627.     jsr c4DropPieceSpecial
  628.     ldy c4Temp5
  629.     bcc +
  630.     iny
  631.     cpy #7
  632.     bne -
  633.     dec c4Depth ; pop state
  634.     dec c4GameState+1
  635.     bne c4AutoMoveFinish ; always true
  636.  
  637.     ; We have just dropped a piece
  638.     ; into column .Y
  639.  
  640.   + lda c4Player
  641.     ldx #c4WinnerOffset
  642.   c4GameStatePage = *+2
  643.     cmp $ff00,x
  644.     bne +
  645.     lda #c4HighestGoodness
  646.     sta c4Goodness
  647.     bne ++ ; always true
  648.  
  649.     ; Call c4Evaluate
  650.   + lda #c4LowestGoodness
  651.     sta c4Alpha
  652.     lda #0
  653.     sec
  654.     sbc c4BestWorst
  655.     sta c4Beta
  656.     sty c4Temp5
  657.     jsr c4Evaluate
  658.     ldy c4Temp5
  659.  
  660.   + lda c4Goodness
  661.     sec
  662.     sbc c4BestWorst
  663.     bne +
  664.  
  665.     ; Make a random decision
  666.     lda $a2 ; low byte of jiffy clock
  667.     ror
  668.     bcc c4AutoMoveContinue
  669.     bcs +++
  670.  
  671.   + bmi +
  672.     bvs c4AutoMoveContinue
  673.     bvc ++
  674.   + bvc c4AutoMoveContinue
  675.   + lda c4Goodness
  676.     sta c4BestWorst
  677.     sty c4BestIndex
  678.  
  679.   c4AutoMoveContinue = *
  680.     dec c4Depth ; pop state
  681.     dec c4GameState+1
  682.     iny
  683.     cpy #7
  684.     bne --
  685.  
  686.   c4AutoMoveFinish = *
  687.     ldy c4BestIndex
  688.     cpy #c4None
  689.     beq +
  690.     jmp c4DropPieceSpecial ; jsr/rts
  691.   + rts
  692.  
  693.  
  694. c4Evaluate = *
  695.  
  696.     lda c4Level
  697.     cmp c4Depth
  698.     bne +
  699.     jsr c4GoodnessOfCurrentPlayer
  700.     sta c4Goodness
  701.     rts
  702.  
  703.   + lda #c4LowestGoodness
  704.     sta c4Best
  705.     lda c4Alpha
  706.     sta c4MaxAB
  707.  
  708.     ldy #0
  709.     sty c4Temp6
  710.     lda c4Player
  711.     eor #1
  712.     sta c4Player
  713.  
  714.   - jsr c4PushState
  715.     jsr c4DropPieceSpecial
  716.     bcc +
  717.     dec c4Depth ; pop state
  718.     dec c4GameState+1
  719.     jmp c4EvaluateContinue2
  720.  
  721.   + ldy #c4WinnerOffset
  722.     lda (c4GameState),y
  723.     cmp #c4None
  724.     beq +
  725.  
  726.     lda #c4HighestGoodness
  727.     sec
  728.     sbc c4Depth
  729.     sta c4Goodness
  730.     bne ++ ; always true
  731.  
  732.     ; Recurse
  733.   + lda c4Best
  734.     pha
  735.     lda c4MaxAB
  736.     pha 
  737.     lda c4Temp6
  738.     pha
  739.     lda c4Alpha
  740.     pha
  741.     lda c4Beta
  742.     pha
  743.  
  744.     lda #0
  745.     sec
  746.     sbc c4Beta
  747.     sta c4Alpha
  748.     lda #0
  749.     sec
  750.     sbc c4MaxAB
  751.     sta c4Beta
  752.  
  753.     jsr c4Evaluate
  754.  
  755.     pla
  756.     sta c4Beta
  757.     pla
  758.     sta c4Alpha
  759.     pla
  760.     sta c4Temp6
  761.     pla
  762.     sta c4MaxAB
  763.     pla
  764.     sta c4Best
  765.  
  766.   + lda c4Goodness
  767.     sec
  768.     sbc c4Best
  769.     bmi +
  770.     bvs c4EvaluateContinue1
  771.     bvc ++
  772.   + bvc c4EvaluateContinue1
  773.   + beq c4EvaluateContinue1
  774.  
  775.     lda c4Goodness
  776.     sta c4Best
  777.  
  778.     lda c4Best
  779.     sec
  780.     sbc c4MaxAB
  781.     bmi +
  782.     bvs c4EvaluateContinue1
  783.     bvc ++
  784.   + bvc c4EvaluateContinue1
  785.   + beq c4EvaluateContinue1
  786.  
  787.     lda c4Best
  788.     sta c4MaxAB
  789.  
  790.   c4EvaluateContinue1 = *
  791.     dec c4Depth ; pop state
  792.     dec c4GameState+1
  793.     lda c4Beta
  794.     sec
  795.     sbc c4Best
  796.     bmi +
  797.     bvs ++
  798.     bvc c4EvaluateContinue2
  799.   + bvc +
  800.  
  801.   c4EvaluateContinue2 = *
  802.     inc c4Temp6
  803.     ldy c4Temp6
  804.     cpy #7
  805.     beq +
  806.     jmp -
  807.  
  808.   + lda c4Player
  809.     eor #1
  810.     sta c4Player
  811.     lda #0
  812.     sec
  813.     sbc c4Best
  814.     sta c4Goodness
  815.     rts
  816.  
  817. c4Map = *
  818.     .word c4Map00, c4Map01, c4Map02, c4Map03, c4Map04, c4Map05, c4Map06, 0
  819.     .word c4Map10, c4Map11, c4Map12, c4Map13, c4Map14, c4Map15, c4Map16, 0
  820.     .word c4Map20, c4Map21, c4Map22, c4Map23, c4Map24, c4Map25, c4Map26, 0
  821.     .word c4Map30, c4Map31, c4Map32, c4Map33, c4Map34, c4Map35, c4Map36, 0
  822.     .word c4Map40, c4Map41, c4Map42, c4Map43, c4Map44, c4Map45, c4Map46, 0
  823.     .word c4Map50, c4Map51, c4Map52, c4Map53, c4Map54, c4Map55, c4Map56
  824.  
  825. c4Map00 .byte 03, 24, 45, c4None
  826. c4Map01 .byte 03, 02, 27, 48, c4None
  827. c4Map02 .byte 03, 02, 04, 30, 51, c4None
  828. c4DropOrder = *
  829. ; This is an evil thing to do, but it saves 7 bytes!
  830. ; I've organized the map so that c4Map03 is overloaded to represent the
  831. ; order in which the computer tries dropping pieces.
  832. c4Map03 .byte 03, 02, 04, 01, 05, 00, 06, c4None
  833. c4Map04 .byte 02, 04, 01, 36, 60, c4None
  834. c4Map05 .byte 04, 01, 39, 63, c4None
  835. c4Map06 .byte 01, 42, 66, c4None
  836.  
  837. c4Map10 .byte 33, 24, 25, 46, c4None
  838. c4Map11 .byte 33, 54, 27, 28, 45, 49, c4None
  839. c4Map12 .byte 33, 54, 57, 30, 31, 48, 52, 06, c4None
  840. c4Map13 .byte 33, 54, 57, 07, 05, 34, 51, 55, 58, 60, c4None
  841. c4Map14 .byte 54, 57, 07, 36, 37, 00, 61, 63, c4None
  842. c4Map15 .byte 57, 07, 39, 40, 64, 66, c4None
  843. c4Map16 .byte 07, 42, 43, 67, c4None
  844.  
  845. c4Map20 .byte 08, 24, 25, 26, 47, c4None
  846. c4Map21 .byte 08, 09, 27, 28, 29, 46, 50, 06, c4None
  847. c4Map22 .byte 08, 09, 10, 30, 31, 32, 45, 49, 53, 58, 60, c4None
  848. c4Map23 .byte 08, 09, 10, 11, 05, 34, 35, 48, 52, 56, 59, 61, 63, c4None
  849. c4Map24 .byte 09, 10, 11, 36, 37, 38, 51, 55, 62, 64, 66, c4None
  850. c4Map25 .byte 10, 11, 39, 40, 41, 00, 65, 67, c4None
  851. c4Map26 .byte 11, 42, 43, 44, 68, c4None
  852.  
  853. c4Map30 .byte 12, 24, 25, 26, 06, c4None
  854. c4Map31 .byte 12, 13, 27, 28, 29, 47, 58, 60, c4None
  855. c4Map32 .byte 12, 13, 14, 30, 31, 32, 46, 50, 59, 61, 63, c4None
  856. c4Map33 .byte 12, 13, 14, 15, 05, 34, 35, 45, 49, 53, 62, 64, 66, c4None
  857. c4Map34 .byte 13, 14, 15, 36, 37, 38, 48, 52, 56, 65, 67, c4None
  858. c4Map35 .byte 14, 15, 39, 40, 41, 51, 55, 68, c4None
  859. c4Map36 .byte 15, 42, 43, 44, 00, c4None
  860.  
  861. c4Map40 .byte 16, 25, 26, 58, c4None
  862. c4Map41 .byte 16, 17, 28, 29, 59, 61, c4None
  863. c4Map42 .byte 16, 17, 18, 31, 32, 47, 62, 64, c4None
  864. c4Map43 .byte 16, 17, 18, 19, 34, 35, 46, 50, 65, 67, c4None
  865. c4Map44 .byte 17, 18, 19, 37, 38, 49, 53, 68, c4None
  866. c4Map45 .byte 18, 19, 40, 41, 52, 56, c4None
  867. c4Map46 .byte 19, 43, 44, 55, c4None
  868.  
  869. c4Map50 .byte 20, 26, 59, c4None
  870. c4Map51 .byte 20, 21, 29, 62, c4None
  871. c4Map52 .byte 20, 21, 22, 32, 65, c4None
  872. c4Map53 .byte 20, 21, 22, 23, 35, 47, 68, c4None
  873. c4Map54 .byte 21, 22, 23, 38, 50, c4None
  874. c4Map55 .byte 22, 23, 41, 53, c4None
  875. c4Map56 .byte 23, 44, 56, c4None
  876.  
  877. c4ZeroPageSave = *
  878.  
  879. c4EndOfProgram = *+18
  880.