Code: Alles auswählen
02B2(00A5) | org 0
02B4(0000) F0 AB BC A0 | entry mov t1,par 'get structure address
02B8(0001) 10 AA FC 80 | add t1,#4 << 2 'skip past heads and tails
02BC(0002) 55 AC BC 08 | rdlong t2,t1 'get rx_pin
02C0(0003) 01 B4 FC A0 | mov rxmask,#1
02C4(0004) 56 B4 BC 2C | shl rxmask,t2
02C8(0005) 04 AA FC 80 | add t1,#4 'get tx_pin
02CC(0006) 55 AC BC 08 | rdlong t2,t1
02D0(0007) 01 C0 FC A0 | mov txmask,#1
02D4(0008) 56 C0 BC 2C | shl txmask,t2
02D8(0009) 04 AA FC 80 | add t1,#4 'get rxtx_mode
02DC(000A) 55 B0 BC 08 | rdlong rxtxmode,t1
02E0(000B) 04 AA FC 80 | add t1,#4 'get bit_ticks
02E4(000C) 55 B2 BC 08 | rdlong bitticks,t1
02E8(000D) 04 AA FC 80 | add t1,#4 'get buffer_ptr
02EC(000E) 55 B6 BC 08 | rdlong rxbuff,t1
02F0(000F) 5B C2 BC A0 | mov txbuff,rxbuff
02F4(0010) FF C2 FC 80 | add txbuff,#255 'Change Buffer size
02F8(0011) 01 C2 FC 80 | add txbuff,#1 'add 1 more for 256
02FC(0012) 04 B0 7C 62 | test rxtxmode,#%100 wz 'init tx pin according to mode
0300(0013) 02 B0 7C 61 | test rxtxmode,#%010 wc
0304(0014) 60 E8 9B 68 | if_z_ne_c or outa,txmask
0308(0015) 60 EC AB 68 | if_z or dira,txmask
030C(0016) 34 CA FC A0 | mov txcode,#transmit 'initialize ping-pong multitasking
0310(0017) 65 BE BC 5C | receive jmpret rxcode,txcode 'run a chunk of transmit code, then return
0314(0018) 01 B0 7C 62 | test rxtxmode,#%001 wz 'wait for start bit on rx pin
0318(0019) F2 B5 3C 61 | test rxmask,ina wc
031C(001A) 17 00 64 5C | if_z_eq_c jmp #receive
0320(001B) 09 BA FC A0 | mov rxbits,#9 'ready to receive byte
0324(001C) 59 BC BC A0 | mov rxcnt,bitticks
0328(001D) 01 BC FC 28 | shr rxcnt,#1
032C(001E) F1 BD BC 80 | add rxcnt,cnt
0330(001F) 59 BC BC 80 | :bit add rxcnt,bitticks 'ready next bit period
0334(0020) 65 BE BC 5C | :wait jmpret rxcode,txcode 'run a chuck of transmit code, then return
0338(0021) 5E AA BC A0 | mov t1,rxcnt 'check if bit receive period done
033C(0022) F1 AB BC 84 | sub t1,cnt
0340(0023) 00 AA 7C C1 | cmps t1,#0 wc
0344(0024) 20 00 4C 5C | if_nc jmp #:wait
0348(0025) F2 B5 3C 61 | test rxmask,ina wc 'receive bit on rx pin
034C(0026) 01 B8 FC 30 | rcr rxdata,#1
0350(0027) 1F BA FC E4 | djnz rxbits,#:bit
0354(0028) 17 B8 FC 28 | shr rxdata,#32-9 'justify and trim received byte
0358(0029) FF B8 FC 60 | and rxdata,#$FF
035C(002A) 01 B0 7C 62 | test rxtxmode,#%001 wz 'if rx inverted, invert byte
0360(002B) FF B8 D4 6C | if_nz xor rxdata,#$FF
0364(002C) F0 AD BC 08 | rdlong t2,par 'save received byte and inc head
0368(002D) 5B AC BC 80 | add t2,rxbuff
036C(002E) 56 B8 3C 00 | wrbyte rxdata,t2
0370(002F) 5B AC BC 84 | sub t2,rxbuff
0374(0030) 01 AC FC 80 | add t2,#1
0378(0031) FF AC FC 60 | and t2,#$FF 'Change Buffer Size
037C(0032) F0 AD 3C 08 | wrlong t2,par
0380(0033) 17 00 7C 5C | jmp #receive 'byte done, receive next byte
0384(0034) 5F CA BC 5C | transmit jmpret txcode,rxcode 'run a chunk of receive code, then return
0388(0035) F0 AB BC A0 | mov t1,par 'check for head <> tail
038C(0036) 08 AA FC 80 | add t1,#2 << 2
0390(0037) 55 AC BC 08 | rdlong t2,t1
0394(0038) 04 AA FC 80 | add t1,#1 << 2
0398(0039) 55 AE BC 08 | rdlong t3,t1
039C(003A) 57 AC 3C 86 | cmp t2,t3 wz
03A0(003B) 34 00 68 5C | if_z jmp #transmit
03A4(003C) 61 AE BC 80 | add t3,txbuff 'get byte and inc tail
03A8(003D) 57 C4 BC 00 | rdbyte txdata,t3
03AC(003E) 61 AE BC 84 | sub t3,txbuff
03B0(003F) 01 AE FC 80 | add t3,#1
03B4(0040) FF AE FC 60 | and t3,#$FF 'Change Buffer Size
03B8(0041) 55 AE 3C 08 | wrlong t3,t1
03BC(0042) 00 C5 FC 68 | or txdata,#$100 'ready byte to transmit
03C0(0043) 02 C4 FC 2C | shl txdata,#2
03C4(0044) 01 C4 FC 68 | or txdata,#1
03C8(0045) 0B C6 FC A0 | mov txbits,#11
03CC(0046) F1 C9 BC A0 | mov txcnt,cnt
03D0(0047) 04 B0 7C 62 | :bit test rxtxmode,#%100 wz 'output bit on tx pin according to mode
03D4(0048) 02 B0 7C 61 | test rxtxmode,#%010 wc
03D8(0049) 01 C4 E0 6C | if_z_and_c xor txdata,#1
03DC(004A) 01 C4 FC 29 | shr txdata,#1 wc
03E0(004B) 60 E8 AB 70 | if_z muxc outa,txmask
03E4(004C) 60 EC 97 74 | if_nz muxnc dira,txmask
03E8(004D) 59 C8 BC 80 | add txcnt,bitticks 'ready next cnt
03EC(004E) 5F CA BC 5C | :wait jmpret txcode,rxcode 'run a chunk of receive code, then return
03F0(004F) 64 AA BC A0 | mov t1,txcnt 'check if bit transmit period done
03F4(0050) F1 AB BC 84 | sub t1,cnt
03F8(0051) 00 AA 7C C1 | cmps t1,#0 wc
03FC(0052) 4E 00 4C 5C | if_nc jmp #:wait
0400(0053) 47 C6 FC E4 | djnz txbits,#:bit 'another bit to transmit?
0404(0054) 34 00 7C 5C | jmp #transmit 'byte done, transmit next byte