rem Set the logged drive ('A' to 'P') procedure setdrive (drive = char) var hl, de, bc, a_psw = integer rem -- make sure drive letter is upper case! if drive >= 'a' then drive = drive - 32 hl = 0 de = drive - 65 bc = 0EH a_psw = 0 call (5H,hl,de,bc,a_psw) end rem Set the CP/M user area (0 to 15) procedure setuser (user = integer) var hl, bc, a_psw = integer hl = 0 bc = 20H a_psw = 0 call (5H,hl,user,bc,a_psw) end comment Return size of named file as number of 128-byte records; assumes file name is upper case. If the file does not exist, the size will be reported as 0. end function fsize(filename = string:20) = integer var hl, de, bc, a_psw, p = integer based fname = string:20 based sz = integer dim byte workfcb(36) location array de = workfcb base fname at de base sz at de + 33 fname = fcb$(filename) rem See if drive was specified and set FCB accordingly p = instr(1,filename,":") if p = 0 then workfcb(0) = 0 else workfcb(0) = asc(mid(filename,p-1,1)) - 64 bc = 23H rem BDOS filesize function call (5,hl,de,bc,a_psw) rem result stored in sz end = sz rem Exercise the function var filename = string:20 filename = "INPUT.TXT" rem First check current drive and user print filename;" occupies";fsize(filename)*128;" bytes" rem Then check startup directory (A0:) setdrive 'A' setuser 0 print "A0:INPUT.TXT occupies";fsize(filename)*128;" bytes" end