Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- !to "test.prg", cbm
- !convtab pet
- chrout = $ffd2
- getchr = $ffe4
- turn_length = $02
- xt = $9e
- yt = $9f
- xd = $b0
- yd = $b1
- current_player = $b2
- buffer_length = $b3
- x = $b4
- y = $b5
- * = $c000
- ldy #63 ; Init board, current_player & other_player_mod
- lda #"."
- - sta board,y
- dey
- bpl -
- lda #"w"
- sta current_player
- sta board + 3*8+3
- sta board + 4*8+4
- lda #"b"
- sta other_player_mod+1
- sta board + 3*8+4
- sta board + 4*8+3
- jmp print_board
- main_loop
- lda #0 ; Read line into buffer.
- sta buffer_length
- - jsr getchr
- beq -
- ldy buffer_length
- sta buffer,y
- inc buffer_length
- cmp #3 ; RUN/STOP
- beq exit
- jsr chrout
- cmp #13 ; RETURN
- bne -
- ldy #end_txt_length - 1 ; buffer == "end\n" ?
- - lda buffer,y
- cmp end_txt,y
- bne +
- dey
- bpl -
- exit
- rts
- +
- lda buffer ; convert coordinate
- sec
- sbc #"a"
- sta x
- lda buffer+1
- clc
- sbc #"0"
- sta y
- asl ; board(x,y) = current_player
- asl
- asl
- ora x
- tay
- lda current_player
- sta board,y
- lda #-1 ; for xd = -1 to...
- sta xd
- outer_loop
- lda #-1 ; for yd = -1 to...
- sta yd
- inner_loop
- ;lda yd ; if (xd | yd) = 0 then continue.
- ora xd
- beq inner_loop_continue
- lda x ; xt, yt = x, y
- sta xt
- lda y
- sta yt
- lda #0 ; turn_length = 0
- sta turn_length
- check_line_loop
- clc ; xt += xd
- lda xt
- adc xd
- sta xt
- clc ; yt += yd
- lda yt
- adc yd
- sta yt
- ;lda yt ; check if xt and yt between 0 and 7
- ora xt
- and #%11111000
- bne no_turns
- lda yt ; Y = yt*8+xt
- asl
- asl
- asl
- ora xt
- tay
- lda board,y ; A = board(xt,yt)
- other_player_mod ; A != other_player ?
- cmp #0
- bne line_end
- tya ; store index into board in turn_coordinates.
- ldy turn_length
- sta turn_coordinates,y
- inc turn_length
- bne check_line_loop
- line_end
- cmp current_player ; board(xt,yt) == current_player ?
- beq check_line_loop_end
- no_turns
- lda #0
- sta turn_length
- check_line_loop_end
- lda turn_length ; turns ?
- beq skip_turn_loop
- tay ; do turns.
- lda current_player
- turn_loop
- ldx turn_coordinates-1,y
- sta board,x
- dey
- bne turn_loop
- skip_turn_loop
- inner_loop_continue
- inc yd ; next yd
- lda yd
- cmp #2
- bne inner_loop
- inc xd ; next xd
- lda xd
- cmp #2
- bne outer_loop
- lda current_player ; swap players.
- ldy other_player_mod+1
- sta other_player_mod+1
- sty current_player
- print_board
- ldy #0
- print_loop
- tya ; index divisible by 8 ?
- and #%00000111
- bne +
- lda #13 ; print newline.
- jsr chrout
- + lda board,y
- jsr chrout
- iny
- cpy #64
- bne print_loop
- lda #13
- jsr chrout
- jmp main_loop
- ;--------------------------------------
- !align 255, 0, 0
- end_txt
- !pet "end", 13
- end_txt_length = * - end_txt
- ;--------------------------------------
- !align 255, 0, 0
- board
- !fill 64
- buffer
- !fill 16
- turn_coordinates
- !fill 8
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement