X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=hexed%2Ftransfer.S;fp=hexed%2Ftransfer.S;h=0115dd9cb3633069b2b276e056237ba4772b6381;hb=93c5aa8a4e294c0736b3ddd02b57b3b4f353e539;hp=4ab3affd3b135d6096f4b77297b97e4198051145;hpb=8682b7ce22bd03b72af1ccaf65a71046e5303f73;p=megadrive.git diff --git a/hexed/transfer.S b/hexed/transfer.S index 4ab3aff..0115dd9 100644 --- a/hexed/transfer.S +++ b/hexed/transfer.S @@ -108,6 +108,10 @@ recv_ad: move.l d2,d0 rts +send_byte: + send_one_byte + rts + do_transfer: lea 0xa10005,a1 @@ -132,9 +136,11 @@ jumptab: bra pcc_transfer_recv /* sent to us */ bra pcc_transfer_send /* recv from us */ bra pcc_jump + bra pcc_io bra pcc_test_code +/* receive data from PC */ pcc_transfer_recv: bsr recv_ad move.l d0,a0 @@ -149,13 +155,14 @@ tr_recv_loop: bra return +/* send data to PC */ pcc_transfer_send: bsr recv_ad move.l d0,a0 bsr recv_ad move.l d0,d3 -0: /*Lwait_tl_low:*/ +0: /*Lwait_tl_low: it should switch to rx mode before lowering tl */ move.b (a1),d0 btst.b #4,d0 bne 0b /*Lwait_tl_low*/ @@ -171,16 +178,124 @@ tr_send_loop: bra return +/* call specified location */ pcc_jump: bsr recv_ad move.l d0,a0 - jmp (a0) + jsr (a0) + bra return + + +/* do simple i/o commands */ +pcc_io: + moveq.l #0,d4 + bsr recv_byte + move.b d0,d4 + bsr recv_byte + lsl.l #8,d4 + move.b d0,d4 +pcc_io_loop: + move.b #0x40,(0xa1000b).l /* input mode */ + sub.w #1,d4 + bmi return + + bsr recv_byte + move.b d0,d3 /* cmd */ + + bsr recv_ad + move.l d0,a2 /* addr */ + + cmp.b #IOSEQ_W32, d3 + beq pcc_io_w32 + cmp.b #IOSEQ_W16, d3 + beq pcc_io_w16 + cmp.b #IOSEQ_W8, d3 + bne pcc_io_rx + +pcc_io_w8: + bsr recv_byte + move.b d0,(a2) + bra pcc_io_loop + +pcc_io_w16: + bsr recv_byte + move.b d0,d3 + bsr recv_byte + lsl.w #8,d3 + move.b d0,d3 + move.w d3,(a2) + bra pcc_io_loop + +pcc_io_w32: + bsr recv_byte + move.b d0,d3 + bsr recv_byte + lsl.w #8,d3 + move.b d0,d3 + bsr recv_byte + lsl.l #8,d3 + move.b d0,d3 + bsr recv_byte + lsl.l #8,d3 + move.b d0,d3 + move.l d3,(a2) + bra pcc_io_loop + +pcc_io_rx: +0: /*Lwait_tl_low:*/ + move.b (a1),d0 + btst.b #4,d0 + bne 0b /*Lwait_tl_low*/ + + move.b #0x4f,(0xa1000b).l + move.b #0x40,(a1) + + cmp.b #IOSEQ_R32, d3 + beq pcc_io_r32 + cmp.b #IOSEQ_R16, d3 + beq pcc_io_r16 + cmp.b #IOSEQ_R8, d3 + bne return + +pcc_io_r8: + move.b (a2),d0 + bsr send_byte + bra pcc_io_loop + +pcc_io_r16: + move.w (a2),d3 + move.w d3,d0 + lsr.w #8,d0 + bsr send_byte + move.b d3,d0 + bsr send_byte + bra pcc_io_loop + +pcc_io_r32: + move.l (a2),d3 + move.l d3,d0 + swap d0 + lsr.l #8,d0 + bsr send_byte + move.l d3,d0 + swap d0 + bsr send_byte + move.w d3,d0 + lsr.w #8,d0 + bsr send_byte + move.b d3,d0 + bsr send_byte + bra pcc_io_loop + + +/* some random code */ pcc_test_code: bra return + return: move.b #0,(0xa1000b).l /* all inputs */ move.l #0xffe000,a1