> RFSosw7F/s :  mcode% &400 ( zp=&B0 2: < P=0 1 FP%=&8000:O%=mcode% P[OPT P*3+4 ZBRK:BRK:BRK dJMP service n*EQUB &82:EQUB Copyright-&8000:EQUB &00 xEQUS "OSWORD &7F":BRK EQUS "0.01 (12 Jul 2009)" .Copyright BRK:EQUS "(C)JGH":BRK : .service CMP #8:BEQ service08 .serviceR4S RTS : )\** Service call &08 - Unknown OSWORD .service08 + CMP #&08 \Is it an OSWORD? A BNE serviceR4S \If not, then return - with A preserved  LDY &F0 2 STY zp \Store X on entry at &B0  LDY &F1 "1 STY &B1 \Store Y on entry at &B1 ,* LDY &EF \Load A on entry 6 CPY #&7F @ BEQ osword7F J T CPY #&77 ^> BEQ osword77 \ OSWORD &77 bypasses DiskTrap check h r RTS |\ CPY #&7D \ BNE serviceR4S \ JMP osword7D  5\************************************************ \** OSWORD &7F 5\************************************************ \  .osword7F  JSR SetSCR , LDA &FD8F \ Check DTrap flag 3 \BPL osw7Fignore \ DTrap off, ignore call  .osword77  LDY #&00 L LDA (zp),Y \ Get first byte of parameter block - Drive number * BPL osw7F_J1 \ Use this drive  JSR set10 &1 LDA &FDCB \ Get current DFS drive 0 STA (zp),Y : .osw7F_J1 D LDY #&06 N LDA (zp),Y X CMP #&53 b1 BEQ osw7F_CMD \ Jump for read sectors l CMP #&4B v2 BEQ osw7F_CMD \ Jump for write sectors .osw7Fignore  LDA #8 " RTS \ Ignore  .osw7F_CMD  LDY #13 .osw7F_Save 2 LDA &B2,Y \ Save some ZP workspace  PHA 2 LDA (zp),Y \ And copy control block  STA &B2,Y  DEY  BPL osw7F_Save  LDA &027A   BMI osw7F_TubeOk  LDA #&FF  ? STA &B5 \ No Tube, force address to &FFFFxxxx * STA &B6 4.osw7F_TubeOk > LDA &BB H #31 R3 STA &BB \ Remove sector size flags \ f\ &B0/1 => control block p\ &B2 = drive z\ &B3-6 = address  \ &B7 !\ &B8 = command, &4B or &53 \ &B9 = track \ &BA = sector \ &BB = count   LDX &B9 \ Track  LDY &BA \ Sector  LDA &B2 \ Drive  #&03  ASL A  ASL A + STA &BA \ RAMAddr=&0400*drv  TYA  A #&10 5 STA &B9 \ RAMAddr=&0010+sec+&0400*drv $- INX \ Balance first DEX . BNE osw7F_T10b 8 B.osw7F_Times10 L6 LDA &B9 \ RAMAddr=drivestart+10*track V CLC ` ADC #&0A j STA &B9 t LDA &BA ~ ADC #0  STA &BA .osw7F_T10b  DEX  BNE osw7F_Times10  \ &B3-6 = address !\ &B8 = command, &4B or &53 \ &B9-A = RAMCard address \ &BB = count  / LDA &B8 \ Command &4B or &53 3 \ %01001011 or %01010011 3 LSR A \ %00100101 or %00101001  3 LSR A \ %00010010 or %00010100 3 LSR A \ %00001001 or %00001010 3 LSR A \ %00000100 or %00000101 (7 #&01 \ b0=0 for save, b0=1 for load 2& A #&80 \ Flag 'I/O' < PHA F LDA &B5 P &B6 Z CMP #&FF d BEQ osw7F_NoTube n.osw7F_Claim x3 LDA #&CF \ Claim ID=&0F for RAMFS  JSR &406 / BCC osw7F_Claim \ Loop until claimed - LDX #&B3 \ XY=>Tube address  LDY #&00 / PLA \ Get direction byte & #&01 \ Flag 'Tube'  PHA 3 JSR &406 \ Initiate Tube transfer .osw7F_NoTube  \ Stacked flag byte means !\ &00 Save from Tube to RAMFS !\ &01 Load from RAMFS to Tube  \ &80 Save from I/O to RAMFS  \ &81 Load from RAMFS to I/O  ".osw7F_loop ,0 LDY #&00 \ Prepare transfer offset 6 LDA &B9 @ STA &FCFF J LDA &BA T/ STA &FCFE \ Select RAMCard address ^ PLA h PHA r BMI osw7Fio | ROR A  BCS osw7F_tubeload  .osw7F_tubesave  JSR TubeDelay  JSR TubeDelay  JSR TubeDelay  JSR TubeDelay  LDA &FEE5  STA &FD00,Y  INY  BNE osw7F_tubesave  BEQ osw7F_next  .osw7F_tubeload  JSR TubeDelay  JSR TubeDelay & JSR TubeDelay 0 JSR TubeDelay : LDA &FD00,Y D STA &FEE5 N INY X BNE osw7F_tubeload b BEQ osw7F_next l v .osw7Fio  ROR A  BCS osw7F_ioload .osw7F_iosave  LDA (&B3),Y  STA &FD00,Y  INY  BNE osw7F_iosave  BEQ osw7F_ionext  .osw7F_ioload  LDA &FD00,Y  STA (&B3),Y  INY  BNE osw7F_ioload   BEQ osw7F_ionext .osw7F_ionext  / INC &B4 \ Update I/O address * 4.osw7F_next > INC &B9 H BNE osw7F_count R INC &BA \.osw7F_count f DEC &BB p BNE osw7F_loop z 3 PLA \ Get transfer flag back  BMI osw7F_released 5 LDA #&8F \ Release ID=&0F for RAMFS  JSR &406 .osw7F_released  LDY #0 .osw7F_restore . PLA \ restore workspace  STA &B2,Y  INY  CPY #14  BNE osw7F_restore  LDY #10  LDA #0 6 STA (zp),Y \ Return value = &00 for Ok .TubeDelay $ RTS . 8 B L .set10 V LDA #&10 ` .SetDFS j #7 t BNE SetWS ~ .SetSCR  LDA #&0F .SetWS  STA &FCFF LDA #0  STA &FCFE RTS  ] 3"*Save RFSOSW7F ";~mcode%;" ";~O%;" 8000 8000"