> 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 C->H, =1 for H->C n: xJ Note: the default code does not work on the Electron as the Tube I/O ; port on the Electron is at &FCE5 instead of at &FEE5. : 7OS_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 6JMP L2505 :\ New USER entry  .OldUSERV "CEQUW L2500 :\ Swapped with USERV to claim , .L2505 6ECMP #&FF:BEQ L250C :\ If my OSWORD, jump to respond @=JMP (OldUSERV) :\ Continue via OldUSERV J T .L250C ^>STX ctrl+0:STY ctrl+1:STA saveA :\ Save OSWORD parameters hLDY #&0C:LDA (ctrl),Y:PHA :\ Get read/write command :LDA ctrl+0:CLC:ADC #&06:TAX :\ Point to Control+6 JLDA #&00:ADC ctrl+1:TAY :\ XY->CoPro address in control block APLA:PHA:JSR &406 :\ Initiate specified action :LDY #&0A:LDA (ctrl),Y:TAX :\ Get count low byte ;INY:LDA (ctrl),Y:STA count :\ Get count high byte HBNE L2544 :\ Jump forward if >255 bytes to do ETXA:BEQ L2592 :\ Jump to exit if no bytes left  .L2544 MTXA:BEQ L2549 :\ Jump forward if multiple of 256 bytes KINC count :\ Inc high byte to balance DECs later  .L2549 FPLA:ROR A:BCS L2575 :\ Get command back, jump if H->C : =JSR L259B:JSR L259B:JSR L259B :\ Delay before starting >LDY #&00 :\ Zero offset for (zp),Y & .L2558 0H :;JSR L259B:JSR L259B:JSR L259B :\ Delay between bytes D:INC addr+0:BNE L256C:INC addr+1 :\ Update I/O address N .L256C X@DEX:BNE L2558 :\ Loop for up to 256 bytes bDDEC count:BNE L2558 :\ Loop for each 256-byte chunk lBBEQ L2592 :\ Jump to exit when finished v:  .L2575  LDY #&00  .L2577 :LDA (addr),Y:STA &FEE5 :\ Transfer byte H->C ;JSR L259B:JSR L259B:JSR L259B :\ Delay between bytes :INC addr+0:BNE L258B:INC addr+1 :\ Update I/O address  .L258B @DEX:BNE L2577 :\ Loop for up to 256 bytes DDEC count:BNE L2577 :\ Loop for each 256-byte chunk :  .L2592 4JSR L25A4 :\ Release Tube ?LDX ctrl+0:LDY ctrl+1:LDA saveA :\ Restore entry registers >.L259B :\ Call here to delay 6us  2RTS :\ And return   .L259C *7LDA #&C0+7:JSR &0406 :\ Claim with ID=7 4:BCC L259C:RTS :\ Loop until claimed > H .L25A4 R9LDA #&80+7:JSR &0406 :\ Release with ID=7 \RTS f .end% p z1]:P%=P%-run%+load%:off%=run%-load%:[OPT P*3+4 : @\ This code allows OSWORD &FF to live in a *runnable program :  .exec% DBIT &27A:BPL SetupExit :\ No Tube present JLDA USERV+0:CMP OldUSERV-off%+0:BNE Setup :\ Vector diff, claim it JLDA USERV+1:CMP OldUSERV-off%+1:BEQ SetupExit :\ Same, already claimed  .Setup XPHP:SEI:LDY #0 :\ Prevent IRQs while changing vectors  .SetupLp HLDA load%,Y:STA run%,Y:INY :\ Copy code to main memory CPY #end%-run%:BNE SetupLp ;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 $EPLP :\ Restore IRQs and exit ..SetupExit 8RTS B: L] VD "*SAVE OSWFF ";~mcode%;" ";~O%;" ";~exec%&FFFF0000;" ";~load%