!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