> OswFF/src  Source for OSWORD &FF : (H OSWORD &FF transfers blocks of memory between I/O and CoPro memory 2 X%?0 =&0D < X%?1 =&01 F X%!2 =I/O address P X%!6 =CoPro address Z) X%!10=Number of bytes to transfer d% X%?12=0 for H->C, =1 for C->H n: x7OS_CLI=&FFF7:OSBYTE=&FFF4:OSWORD=&FFF1:OSWRCH=&FFEE 7OSWRCR=&FFEC:OSNEWL=&FFE7:OSASCI=&FFE3:OSRDCH=&FFE0 USERV=&200 : 4ctrl=&70:saveA=&72:unused=&73:addr=&74:count=&76 : "run%=&FFFF2500:load%=&FFFF0900  mcode% &100 P=0 1 P%=run%:O%=mcode% [OPT P*3+4 .L2500 4JMP L2505 :\ New USER entry .OldUSERV AEQUW L2500 :\ Swapped with USERV to claim  .L2505 CCMP #&FF:BEQ L250C :\ If my OSWORD, jump to respond ";JMP (OldUSERV) :\ Continue via OldUSERV , 6 .L250C @CoPro address in control block ?PLA:PHA:JSR &406 :\ Initiate specified action 8LDY #&0A:LDA (ctrl),Y:TAX :\ Get count low byte 9INY:LDA (ctrl),Y:STA count :\ Get count high byte FBNE L2544 :\ Jump forward if >255 bytes to do CTXA:BEQ L2592 :\ Jump to exit if no bytes left  .L2544 KTXA:BEQ L2549 :\ Jump forward if multiple of 256 bytes IINC count :\ Inc high byte to balance DECs later  .L2549 DPLA:ROR A:BCS L2575 :\ Get command back, jump if C->H : ;JSR L259B:JSR L259B:JSR L259B :\ Delay before starting H 9JSR L259B:JSR L259B:JSR L259B :\ Delay between bytes &8INC addr:BNE L256C:INC addr+1 :\ Update I/O address 0 .L256C :>DEX:BNE L2558 :\ Loop for up to 256 bytes DBDEC count:BNE L2558 :\ Loop for each 256-byte chunk N@BEQ L2592 :\ Jump to exit when finished X: b .L2575 l LDY #&00 v .L2577 8LDA (addr),Y:STA &FEE5 :\ Transfer byte H->C 9JSR L259B:JSR L259B:JSR L259B :\ Delay between bytes 8INC addr:BNE L258B:INC addr+1 :\ Update I/O address  .L258B >DEX:BNE L2577 :\ Loop for up to 256 bytes BDEC count:BNE L2577 :\ Loop for each 256-byte chunk :  .L2592 2JSR L25A4 :\ Release Tube =LDX ctrl:LDY ctrl+1:LDA saveA :\ Restore entry registers <.L259B :\ Call here to delay 6us 0RTS :\ And return   .L259C  5LDA #&C0+7:JSR &0406 :\ Claim with ID=7 8BCC L259C:RTS :\ Loop until claimed   * .L25A4 47LDA #&80+7:JSR &0406 :\ Release with ID=7 >RTS H .end% R \!]:P%=P%-run%+load%:[OPT P*3+4 f: p@\ This code allows OSWORD &FF to live in a *runnable program z:  .exec% IPHP:SEI :\ Prevent IRQs while changing vectors ?LDY #0:BIT &27A:BPL SetupExit :\ No Tube present ELDA USERV+0:CMP OldUSERV+0:BNE Setup :\ Vector diff, claim it LLDA USERV+1:CMP OldUSERV+1:BEQ SetupExit :\ Vector same, already claimed  .Setup HLDA load%,Y:STA run%,Y:INY :\ Copy code to main memory CPY #end%-run%:BNE Setup ;LDA USERV+0:LDX OldUSERV+0 :\ Claim USERV STX USERV+0:STA OldUSERV+0 LDA USERV+1:LDX OldUSERV+1 STX USERV+1:STA OldUSERV+1 .SetupExit EPLP:RTS :\ Restore IRQs and exit : ] $D "*SAVE OSWFF ";~mcode%;" ";~O%;" ";~exec%&FFFF0000;" ";~load%