> OswFA/src  Source for OSWORD &FA : (H OSWORD &FA transfers blocks of memory between I/O and CoPro memory 2- X%?0 =&0D or &0E (send block length) <) X%?1 =&10 (receive block length) F X%!2 =I/O address P- X%!6 =CoPro address (segment:offset) Z* X%!10 =Number of bytes to transfer d% X%?12 =Tube transfer function n0 X%?13 =memory access control if X%?0=&0E x: 7OS_CLI=&FFF7:OSBYTE=&FFF4:OSWORD=&FFF1:OSWRCH=&FFEE 7OSWRCR=&FFEC:OSNEWL=&FFE7:OSASCI=&FFE3:OSRDCH=&FFE0 : &80, not shadow screen,  \ Shadow screen selected \ ---------------------- BLDA #&01:CMP shadow:BNE L2554 :\ Jump to select shadow memory ?BEQ L2550 :\ Jump to select I/O memory   \ Non-shadow screen selected  \ --------------------------  .L256F  ?LDA #&02:CMP shadow:BNE L2550 :\ Jump to select I/O memory BBEQ L2554 :\ Jump to select screen memory   *\ Test supplied ROM number 4\ ------------------------ > .L2577 H>PLA:TAX: #&10:BNE L2585 :\ bit 4 set, use current ROM R2TXA: #&0F :\ Reduce to 0-15 \@STA &F4:STA &FE30 :\ Set ROMCOPY and select ROM f p \ Prepare to do the transfer z \ --------------------------  .L2585 9LDY #&0A:LDA (ctrl),Y:STA numLO :\ Get count low byte :INY:LDA (ctrl),Y:STA numHI :\ Get count high byte BA numLO:BNE L2596:BEQ L2604 :\ Jump to finish if count=zero  .L2596 JLDA numLO:BEQ L259C:INC numHI :\ Inc high byte to balance DECs later  .L259C ;INY:LDA (ctrl),Y :\ Get transfer function  #\ Loop to do multiple transfers #\ -----------------------------  .L259F CoPro address in control block `?PLA:PHA:JSR &0406 :\ Initiate specified action jLDX numLO:PLA:LDY #&00 tACMP #&00:BEQ L25EC :\ Jump with 1-byte CoPro->I/O ~ACMP #&01:BEQ L2607 :\ Jump with 1-byte I/O->CoPro ACMP #&02:BEQ L261F :\ Jump with 2-byte CoPro->I/O ACMP #&03:BEQ L264A :\ Jump with 2-byte I/O->CoPro CCMP #&06:BEQ L25E6 :\ Jump with 256-byte CoPro->I/O CCMP #&07:BEQ L25E9 :\ Jump with 256-byte I/O->CoPro OLDA #&00:BEQ L2604 :\ Anything else, jump to release and finish G.L25E6:JMP L2675 :\ Jump ahead with 256-byte transfer G.L25E9:JMP L26A3 :\ Jump ahead with 256-byte transfer  \ 1-byte CoPro->I/O \ -----------------  .L25EC +JSR L26F4 :\ Delay  .L25EF  CLDA &FEE5:STA (addr),Y :\ Transfer a byte to I/O memory 9JSR L26F4 :\ Delay between bytes 8INC addr:BNE L25FD:INC addr+1 :\ Update I/O address ( .L25FD 2>DEX:BNE L25EF :\ Loop for up to 256 bytes CoPro n\ ----------------- x .L2607 ELDA (addr),Y:STA &FEE5 :\ Transfer a byte from I/O memory 9JSR L26F4 :\ Delay between bytes 8INC addr:BNE L2615:INC addr+1 :\ Update I/O address  .L2615 >DEX:BNE L2607 :\ Loop for up to 256 bytes BDEC numHI:BNE L2607 :\ Loop for each 256-byte chunk @JMP L26DA :\ Jump to exit when finished  \ 2-byte CoPro->I/O \ -----------------  .L261F ;JSR L26F4 :\ Delay before starting  .L2622 CLDA &FEE5:STA (addr),Y :\ Transfer a byte to I/O memory 8INC addr:BNE L262D:INC addr+1 :\ Update I/O address  .L262D "9NOP:NOP :\ Delay between bytes ,CLDA &FEE5:STA (addr),Y :\ Transfer a byte to I/O memory 68INC addr:BNE L263A:INC addr+1 :\ Update I/O address @ .L263A J+JSR L26F3:NOP:NOP :\ Delay T>DEX:DEX:BNE L2622 :\ Loop for up to 256 bytes ^BDEC numHI:BNE L2622 :\ Loop for each 256-byte chunk h@JMP L26DA :\ Jump to exit when finished r |\ 2-byte I/O->CoPro \ -----------------  .L264A ELDA (addr),Y:STA &FEE5 :\ Transfer a byte from I/O memory AINC addr :\ Update I/O address low byte =BEQ L2656:NOP:BNE L2658 :\ Strange way of doing it  .L2656 BINC addr+1 :\ Update I/O address high byte  .L2658 =LDA shadow :\ Delay by loading a byte ELDA (addr),Y:STA &FEE5 :\ Transfer a byte from I/O memory AINC addr :\ Update I/O address low byte =BEQ L2666:NOP:BNE L2668 :\ Strange way of doing it  .L2666 INC addr+1  .L2668 +JSR L26F3 :\ Delay &>DEX:DEX:BNE L264A :\ Loop for up to 256 bytes 0BDEC numHI:BNE L264A :\ Loop for each 256-byte chunk :@BEQ L26DA :\ Jump to exit when finished D N\ 256-byte CoPro->I/O X\ ------------------- b .L2675 l+JSR L26F4 :\ Delay v .L2678 CoPro \ -------------------  .L26A3 *>LDA (addr),Y:STA &FEE5 :\ Transfer a byte from I/O 4BNOP:NOP:NOP:INY:BNE L26A3 :\ Delay and loop for 256 bytes >CPX #&00:BNE L26BE HBDEC numHI:BEQ L26DA :\ Loop for each 256-byte chunk R .L26B6 \MJSR L26CE :\ Add 256 to I/O address in control block fOLDA #&07:JMP L259F :\ Jump back to do another 256-byte transfer p z .L26BE DEC numHI:LDA numHI CMP #&01:BNE L26B6  JSR L26CE LDA #&01:JMP L259F  -\ Add 256 to I/O address in control block -\ ---------------------------------------  .L26CE 8INC addr+1 :\ Update I/O address HLDY #&07:LDA (ctrl),Y :\ Get I/O address from control block ?CLC:ADC #&01:STA (ctrl),Y :\ Add 256 to it, store back RTS  '\ Finished, release Tube and return '\ ---------------------------------  .L26DA $7LDA #&80+7:JSR &0406 :\ Release with ID=7 .HLDA rom:CMP &F4:BEQ L26EA :\ Skip if previous ROM = current ROM 8:STA &F4:STA &FE30 :\ Restore previous ROM B .L26EA L4PLA:STA &FE34 :\ Restore ACCCON V7LDX ctrl+0:LDY ctrl+1:PLA :\ Restore registers ` .L26F3 jRTS t ~\ Delay for 24 clock cycles \ ------------------------- .L26F4 JSR L26F3:JSR L26F3:RTS  ] : "*SAVE OswFA ";~mcode%;" ";~O%;" ";~exec%;" ";~load%