1: / 2: / getname 3: / 4: / takes the width of a string in r3 5: / returns a pointer to a file structure in r0 6: / 7: / there should be a string on the stack 8: / of length the contents of r3 on top of 9: / a pointer to the file variable 10: / 11: / a new file structure is allocated if needed 12: / temporary names are generated, and given 13: / names are blank trimmed 14: / 15: / if a new file buffer is allocated, the address 16: / is stored throught the file variable pointer 17: / 18: / 19: getname: 20: mov (sp)+,reta 21: mov sp,r2 22: mov r3,r1 23: inc r1 24: bic $1,r1 25: add sp,r1 26: mov (r1)+,r0 27: mov r1,newsp 28: tst (r0) 29: bne gotone 30: / 31: / dont have a file struct 32: / so alloc a new one 33: / 34: mov r0,-(sp) 35: mov (lc),r0 36: bne 1f 37: mov $1,r0 38: 1: 39: add $518.+14.,r0 40: mov r0,-(sp) 41: jsr pc,_alloc 42: tst (sp)+ 43: mov r0,518.(r0) 44: add $518.+12.,r0 45: mov (lc)+,(r0)+ 46: bne 1f 47: bis $FTEXT,FUNIT(r0) 48: mov $1,FSIZE(r0) 49: 1: 50: mov (sp),FLEV(r0) 51: mov $fchain-FCHAIN,-(sp) / get head of file chain 52: mov fchain,r1 / contents of head of file chain 53: 1: 54: bne 2f / end of the chain? 55: mov (sp)+,r1 / get last chain entry 56: mov r0,FCHAIN(r1) / and stuff the current file in 57: clr FCHAIN(r0) / last entry 58: br 3f 59: 2: 60: cmp FLEV(r1),2(sp) / are we past it yet? 61: beq 3f 62: bhi 2f 63: mov r1,(sp) / advance the chain 64: mov FCHAIN(r1),r1 65: br 1b 66: 2: 67: mov r1,FCHAIN(r0) 68: mov (sp)+,r1 / address of last entry 69: mov r0,FCHAIN(r1) / stuff in the current entry 70: 3: 71: mov r0,*(sp)+ 72: br 2f 73: / 74: / have a previous buffer 75: / close the associated file 76: / 77: gotone: 78: tst (lc)+ 79: mov (r0),r1 80: mov FUNIT(r1),r0 81: bgt 3f / from name from prog hedr 82: bic $100000,FUNIT(r1) 83: br 1f 84: 3: 85: bit $FWRITE,FUNIT(r1) 86: beq 6f 87: mov r0,-(sp) 88: mov r1,-(sp) 89: mov FBUF(r1),-(sp) 90: jsr pc,_fflush 91: tst (sp)+ 92: mov (sp)+,r1 93: mov (sp)+,r0 94: 6: 95: bic $!17,r0 96: sys close 97: bes 9f 98: bit $TEMP,FUNIT(r1) 99: beq 1f 100: tst r3 101: beq 1f 102: mov r0,-(sp) 103: mov r1,-(sp) 104: jsr pc,cleanup 105: mov (sp)+,r1 106: mov (sp)+,r0 107: 1: 108: bic $![TEMP+FTEXT],FUNIT(r1) 109: mov FBUF(r1),r0 110: clr (r0)+ / clear the getc/putc buffer 111: clr (r0)+ 112: clr (r0)+ 113: mov r1,r0 114: / 115: / get the filename to the 116: / buffer (not necess. easy) 117: / 118: 2: 119: tst r3 120: bne 2f 121: / 122: / no name given 123: / 124: tst FNAME(r0) 125: beq 1f 126: / 127: / no name given and had 128: / a prev name so use it 129: / again 130: / 131: mov newsp,sp 132: jmp *reta 133: 9: 134: mov $ECLOSE,_perrno 135: error ECLOSE 136: / 137: / no name given and no 138: / prev name so generate 139: / a new one of the form 140: / "tmp.x" 141: / 142: 1: 143: bis $TEMP,FUNIT(r0) 144: inc nextu 145: movb nextu,tnam+4 146: mov $tnam,r2 147: mov $6.,-(sp) 148: br alname 149: / 150: / name given 151: / strip trailing blanks 152: / 153: 2: 154: bic $TEMP,FUNIT(r0) 155: add r3,r2 156: clrb (r2) 157: 1: 158: cmpb -1(r2),$' 159: bne 1f 160: clrb -(r2) 161: dec r3 162: bne 1b 163: 1: 164: sub r3,r2 165: inc r3 166: mov r3,-(sp) 167: / 168: / save the new name 169: / in dynamic space 170: / 171: alname: 172: mov r0,r3 173: jsr pc,_alloc 174: mov r0,r1 175: 1: 176: movb (r2)+,(r0)+ 177: bne 1b 178: mov r1,r2 179: / 180: / free previous file name 181: / (if any) 182: / 183: mov FNAME(r3),r0 184: beq 1f 185: mov r0,-(sp) 186: jsr pc,_free 187: tst (sp)+ 188: / 189: / put the new name 190: / into the structure 191: / 192: 1: 193: mov r2,FNAME(r3) 194: mov r2,PFNAME(r3) 195: mov r3,r0 196: mov newsp,sp 197: jmp *reta 198: .bss 199: reta: .=.+2 200: newsp: .=.+2 201: .text 202: .globl cleanup 203: cleanup: 204: mov r2,-(sp) 205: mov 4(sp),r2 206: mov PFNAME(r2),0f 207: sys indir;8f 208: .data 209: 8: sys unlink;0: .. 210: .text 211: bec 1f 212: mov PFNAME(r2),_file 213: mov $EREMOVE,_perrno 214: error EREMOVE 215: 1: 216: mov PFNAME(r2),-(sp) 217: jsr pc,_free 218: tst (sp)+ 219: mov (sp)+,r2 220: rts pc