hexed: add simple io commands
[megadrive.git] / hexed / transfer.S
index e4d5a2b..0115dd9 100644 (file)
@@ -88,6 +88,7 @@
 .endm
 
 recv_byte:
+       moveq.l         #0,d0
        recv_one_byte 1
        rts
 
@@ -107,6 +108,10 @@ recv_ad:
        move.l          d2,d0
        rts
 
+send_byte:
+       send_one_byte
+       rts
+
 
 do_transfer:
        lea             0xa10005,a1
@@ -118,14 +123,25 @@ do_transfer:
        bne             return
 
        bsr             recv_byte
-       cmp.b           #CMD_MD_SEND,d0         /* sent to us */
-       beq             transfer_recv
-       cmp.b           #CMD_MD_RECV,d0         /* recv from us */
-       beq             transfer_send
-       bra             return
+       cmp.b           #CMD_FIRST,d0
+       bcs             return
+       cmp.b           #CMD_LAST+1,d0
+       bcc             return
+       sub.b           #CMD_FIRST,d0
 
+       lsl.w           #2,d0
+       lea             (jumptab,pc,d0),a0
+       jmp             (a0)
+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
 
-transfer_recv:
+
+/* receive data from PC */
+pcc_transfer_recv:
        bsr             recv_ad
        move.l          d0,a0
        bsr             recv_ad
@@ -135,16 +151,18 @@ tr_recv_loop:
        recv_one_byte
        move.b          d0,(a0)+
        subq.l          #1,d3
-       bne             tr_recv_loop
+       bgt             tr_recv_loop
        bra             return
 
-transfer_send:
+
+/* 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*/
@@ -156,10 +174,128 @@ tr_send_loop:
        move.b          (a0)+,d0
        send_one_byte
        subq.l          #1,d3
-       bne             tr_send_loop
+       bgt             tr_send_loop
+       bra             return
+
+
+/* call specified location */
+pcc_jump:
+       bsr             recv_ad
+       move.l          d0,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