1: .globl _preadn 2: .text 3: / 4: / preadn(pfloat, pdigits, pbuf) 5: / char *pbuf; 6: / 7: / This routine reads a number from the current active file. 8: / pdigits is the size of pbuf in characters. 9: / pfloat is 0 to read an integer, 1 to read a real number. 10: / it returns with the carry bit set if it reaches EOF before 11: / reading any characters of the number while EOF was not true 12: / before the call. 13: / 14: pfloat = 2. 15: pdigits = 4. 16: pbuf = 6. 17: / 18: _preadn: 19: mov pbuf(sp),r2 20: mov pdigits(sp),r3 21: jsr pc,iosync 22: mov buf,r0 23: mov FUNIT(r0),flags 24: bit $EOF,flags 25: bne 9f 26: br 2f 27: / 28: / skip white space 29: / 30: 1: 31: jsr pc,get 32: jsr pc,iosync 33: bit $EOF,FUNIT(r0) 34: bne prsec 35: 2: 36: movb *buf,r0 37: cmp r0,$' 38: beq 1b 39: cmp r0,$'\t 40: beq 1b 41: cmp r0,$14 42: beq 1b 43: cmp r0,$'\n 44: beq 1b 45: / 46: / starting point for 47: / a signed number 48: / record + and - if present 49: / 50: psignd: 51: clr r1 / digit count 52: cmp r0,$'- 53: bne 1f 54: dec r3 55: ble prtood 56: movb r0,(r2)+ 57: br 2f 58: 1: 59: cmp r0,$'+ 60: bne 1f 61: 2: 62: jsr pc,get 63: br 1f 64: / 65: / starting point for 66: / a unsigned number 67: / 68: punsd: 69: clr r1 70: 1: 71: jsr pc,iosync 72: bit $EOF,flags 73: bne 2f 74: movb *buf,r0 75: cmp r0,$'0 76: blt 2f 77: cmp r0,$'9 78: bgt 2f 79: dec r3 80: ble prtood 81: movb r0,(r2)+ 82: inc r1 83: jsr pc,get 84: br 1b 85: / 86: / got a non digit or EOF 87: / 88: 2: 89: tst r1 90: beq prerr 91: 1: 92: mov pfloat(sp),r1 93: beq 4f 94: cmp r1,$1 95: bne 1f 96: cmp r0,$'. 97: beq 3f 98: inc r1 99: 1: 100: cmp r1,$2 101: bne 4f 102: 2: 103: cmp r0,$'e 104: beq 3f 105: cmp r0,$'E 106: bne 4f 107: 3: 108: dec r3 109: ble prtood 110: movb r0,(r2)+ 111: jsr pc,get 112: inc r1 113: mov r1,pfloat(sp) 114: sub $2,r1 115: beq punsd 116: jsr pc,iosync 117: bit $EOF,flags 118: bne 6f 119: movb *buf,r0 120: br psignd 121: 4: 122: dec r3 123: ble prtood 124: clrb (r2)+ 125: rts pc 126: prsec: 127: sec 128: rts pc 129: prtood: 130: mov $ETOODIGITS,_perrno 131: error ETOODIGITS 132: prerr: 133: tst pfloat(sp) 134: beq 1f 135: 6: 136: mov $EBADFNUM,_perrno 137: error EBADFNUM 138: 1: 139: mov $EBADINUM,_perrno 140: error EBADINUM 141: 9: 142: mov $EPASTEOF,_perrno 143: error EPASTEOF 144: / 145: / long atol(str) 146: / char *str; 147: / 148: / Convert string str to an integer 149: / 150: _atol: 151: mov 2(sp),r3 152: clr r0 153: clr r1 154: cmpb (r3),$'- 155: bne 1f 156: inc r3 157: 1: 158: movb (r3)+,r2 159: beq 1f 160: ashc $1,r0 161: bvs 9f 162: mov r1,-(sp) 163: mov r0,-(sp) 164: ashc $2,r0 165: bvs 9f 166: add (sp)+,r0 167: bvs 9f 168: add (sp)+,r1 169: adc r0 170: bvs 9f 171: sub $'0,r2 172: add r2,r1 173: adc r0 174: bvs 9f 175: br 1b 176: 1: 177: cmpb *2(sp),$'- 178: bne 1f 179: neg r0 180: neg r1 181: 1: 182: sbc r0 183: rts pc 184: 9: 185: mov $EBIGGIE,_perrno 186: error EBIGGIE 187: .bss 188: flags: .=.+2 189: .text