ô > Image/src 'ô Redirect Osword &7F to image file : (Dô v0.10 22-03-1994 : Initial version, passes all drives to image 2: <ver$="0.10" FDOSBYTE=&FFF4:OSNEWL=&FFE7:OSASCI=&FFE3:OSGBPB=&FFD1:OSFIND=&FFCE PÞ mcode% &1000 Z: d ã P=0 ¸ 1 nP%=&8000:O%=mcode% x[OPT P*3+4 ‚BRK:BRK:BRK:JMP Service Œ,EQUB &82:EQUB Copyright-&8000:EQUB »ver$ –EQUS "CP/M Hard Drive"  'BRK:EQUS ver$:EQUS " (22 Mar 1994)" ª.Copyright ´)BRK:EQUS "(C)1990-98 J.G.Harston":BRK ¾: È .Service ÒCMP #1:BEQ Serv1 ÜCMP #8:BEQ Serv8 æCMP #9:BEQ Serv9 ðRTS ú:  .Serv9 RTS : " .Serv1 ,RTS 6: @ .Serv8 J TYA:PHA T!LDA &EF:CMP #127:BEQ Osword7F ^.Serv8QuitY h PLA:TAY r.Serv8Quit |LDA #8:RTS †:  .Osword7F š\ XY+0 = drive ¤\ XY+1..4 = Addr ®\ XY+5 = '3' ¸"\ XY+6 = &53=read &4B=write Â\ XY+7 = track Ì\ XY+8 = sector Ö\ XY+9 = &20+number à\ XY+10 = result ê5LDY #6:LDA (&F0),Y :\ Get command ôCMP #&53:BEQ Osw7FDrive þ?CMP #&4B:BNE Serv8QuitY :\ Not &4B or &53 - Quit .Osw7FDrive ,LDY #0:LDA (&F0),Y:CMP #4:BCS Serv8QuitY 8.Osw7FSave :\ Save workspace &+LDA &80,Y:PHA:INY:CPY #16:BNE Osw7FSave 0@LDA &F0:PHA:LDA &F1:PHA :\ Also save ctrl pointer :: D-\ Should store paths in private workspace N: X5LDY #0:LDA (&F0),Y:€ #1 :\ Get drive 0/1 bIASL A:ASL A:ASL A:ASL A:ASL A:TAX :\ X=drive*32 -> point to filename l.Osw7FName vDLDA Drives,X:STA &80,Y:INX:INY :\ Copy filename to workspace €CMP #13:BNE Osw7FName ŠBLDX #&80:LDY #0:LDA #&C0:JSR OSFIND:\ Open the file for update ”: ž\ &80 = Channel ¨#\ &81..&84 = Addr = XY+1..4 ².\ &85..&88 = Number = 0, XY+9 € 31, 0, 0 ¼A\ &89..&8C = Ptr = 0, drive.b1*80 + track*10 + sector, 0 Æ: Ð0STA &80 :\ Handle ÚFPLA:STA &F1:PLA:STA &F0 :\ Restore pointer just in case ä8PHA:LDA &F1:PHA :\ And save again îLDY #12:LDA #0:.Osw7FClear øBSTA &80,Y:DEY:BNE Osw7FClear :\ Clear GBPB control block ILDY #4:.Osw7FAddr :\ Copy addr to GBPB control block  +LDA (&F0),Y:STA &80,Y:DEY:BNE Osw7FAddr 9LDY #9:LDA (&F0),Y:€ #31:STA &86 :\ Number of sectors  CLDY #0:LDA (&F0),Y:€ #2:BEQ Osw7FTrack:\ Jump ahead with side 0 *;LDY #80 :\ Side 1 = track 80 4.Osw7FTrack >?TYA:LDY #7:CLC:ADC (&F0),Y:STA &8A :\ A=0+track or 80+track H,ASL &8A:ROL &8B:ASL &8A:ROL &8B :\ *4 R3CLC:ADC &8A:STA &8A :\ Add track \,LDA &8B:ADC #0:STA &8B :\ *5 f-ASL &8A:ROL &8B :\ *10 p"LDA &8A:LDY #8:CLC:ADC (&F0),Y z4STA &8A:LDA &8B:ADC #0:STA &8B :\ Add sector „:LDX #1:LDY #6 :\ Prepare to write Ž(LDA (&F0),Y:CMP #&4B:BEQ Osw7FAccess ˜\CMP #&5B:\BEQ Read ¢.LDX #3 :\ Read ¬.Osw7FAccess ¶?TXA:LDX #&80:LDY #&00:JSR OSGBPB :\ Access the image file À8LDY &80:LDA #0:JSR OSFIND :\ Close the file Ê9PLA:STA &F1:PLA:STA &F0 :\ Restore pointer Ô3LDY #10:LDA #0:STA (&F0),Y:LDY #15 :\ Result=Ok Þ.Osw7FRestore è;PLA:STA &80,Y:DEY:BPL Osw7FRestore :\ Restore workspace ò4PLA:LDA #0:RTS :\ Claim call ü: : 9\ Paths to drive image files, each offset by 32 bytes  .Drives $/EQUS "-net-&.CPMDISK0":EQUB 13:EQUS Ä16,½0) .\ "-adfs-$0.CPMDISK0" 8/EQUS "-net-&.CPMDISK1":EQUB 13:EQUS Ä16,½0) B\ "-adfs-$0.CPMDISK1" L: V\ Zero page Tube usage `\ 00-13 Control block j\ 14-15 Claimant IDs t\ 16-5F Poll loop ~\ 60-8F Not used ˆ\ ’]:í œ;ñ"*Save CPMImage ";~mcode%;" ";~O%;" FFFF0000 FFFBBC00" ÿ