0600: / machine language assist 0601: / for 11/40 0602: 0603: / non-UNIX instructions 0604: mfpi = 6500^tst 0605: mtpi = 6600^tst 0606: wait = 1 0607: rtt = 6 0608: reset = 5 0609: 0610: /* --------------------------- */ 0611: .globl start, _end, _edata, _main 0612: start: 0613: bit $1,SSR0 0614: bne start / loop if restart 0615: reset 0616: 0617: / initialize systems segments 0618: 0619: mov $KISA0,r0 0620: mov $KISD0,r1 0621: mov $200,r4 0622: clr r2 0623: mov $6,r3 0624: 1: 0625: mov r2,(r0)+ 0626: mov $77406,(r1)+ / 4k rw 0627: add r4,r2 0628: sob r3,1b 0629: 0630: / initialize user segment 0631: 0632: mov $_end+63.,r2 0633: ash $-6,r2 0634: bic $!1777,r2 0635: mov r2,(r0)+ / ksr6 = sysu 0636: mov $usize-1\<8|6,(r1)+ 0637: 0638: / initialize io segment 0639: / set up counts on supervisor segments 0640: 0641: mov $IO,(r0)+ 0642: mov $77406,(r1)+ / rw 4k 0643: 0644: / get a sp and start segmentation 0645: 0646: mov $_u+[usize*64.],sp 0647: inc SSR0 0648: 0649: / clear bss 0650: 0651: mov $_edata,r0 0652: 1: 0653: clr (r0)+ 0654: cmp r0,$_end 0655: blo 1b 0656: 0657: / clear user block 0658: 0659: mov $_u,r0 0660: 1: 0661: clr (r0)+ 0662: cmp r0,$_u+[usize*64.] 0663: blo 1b 0664: 0665: / set up previous mode and call main 0666: / on return, enter user mode at 0R 0667: 0668: mov $30000,PS 0669: jsr pc,_main 0670: mov $170000,-(sp) 0671: clr -(sp) 0672: rtt 0673: 0674: /* --------------------------- */ 0675: .globl _clearseg 0676: _clearseg: 0677: mov PS,-(sp) 0678: mov UISA0,-(sp) 0679: mov $30340,PS 0680: mov 6(sp),UISA0 0681: mov UISD0,-(sp) 0682: mov $6,UISD0 0683: clr r0 0684: mov $32.,r1 0685: 1: 0686: clr -(sp) 0687: mtpi (r0)+ 0688: sob r1,1b 0689: mov (sp)+,UISD0 0690: mov (sp)+,UISA0 0691: mov (sp)+,PS 0692: rts pc 0693: 0694: /* --------------------------- */ 0695: .globl _copyseg 0696: _copyseg: 0697: mov PS,-(sp) 0698: mov UISA0,-(sp) 0699: mov UISA1,-(sp) 0700: mov $30340,PS 0701: mov 10(sp),UISA0 0702: mov 12(sp),UISA1 0703: mov UISD0,-(sp) 0704: mov UISD1,-(sp) 0705: mov $6,UISD0 0706: mov $6,UISD1 0707: mov r2,-(sp) 0708: clr r0 0709: mov $8192.,r1 0710: mov $32.,r2 0711: 1: 0712: mfpi (r0)+ 0713: mtpi (r1)+ 0714: sob r2,1b 0715: mov (sp)+,r2 0716: mov (sp)+,UISD1 0717: mov (sp)+,UISD0 0718: mov (sp)+,UISA1 0719: mov (sp)+,UISA0 0720: mov (sp)+,PS 0721: rts pc 0722: 0723: /* --------------------------- */ 0724: .globl _savu, _retu, _aretu 0725: _savu: 0726: bis $340,PS 0727: mov (sp)+,r1 0728: mov (sp),r0 0729: mov sp,(r0)+ 0730: mov r5,(r0)+ 0731: bic $340,PS 0732: jmp (r1) 0733: 0734: _aretu: 0735: bis $340,PS 0736: mov (sp)+,r1 0737: mov (sp),r0 0738: br 1f 0739: 0740: _retu: 0741: bis $340,PS 0742: mov (sp)+,r1 0743: mov (sp),KISA6 0744: mov $_u,r0 0745: 1: 0746: mov (r0)+,sp 0747: mov (r0)+,r5 0748: bic $340,PS 0749: jmp (r1) 0750: 0751: /* --------------------------- */ 0752: .globl trap, call 0753: /* --------------------------- */ 0754: .globl _trap 0755: trap: 0756: mov PS,-4(sp) 0757: tst nofault 0758: bne 1f 0759: mov SSR0,ssr 0760: mov SSR2,ssr+4 0761: mov $1,SSR0 0762: jsr r0,call1; _trap 0763: / no return 0764: 1: 0765: mov $1,SSR0 0766: mov nofault,(sp) 0767: rtt 0768: 0769: /* --------------------------- */ 0770: .globl _runrun, _swtch 0771: call1: 0772: tst -(sp) 0773: bic $340,PS 0774: br 1f 0775: 0776: call: 0777: mov PS,-(sp) 0778: 1: 0779: mov r1,-(sp) 0780: mfpi sp 0781: mov 4(sp),-(sp) 0782: bic $!37,(sp) 0783: bit $30000,PS 0784: beq 1f 0785: jsr pc,*(r0)+ 0786: 2: 0787: bis $340,PS 0788: tstb _runrun 0789: beq 2f 0790: bic $340,PS 0791: jsr pc,_swtch 0792: br 2b 0793: 2: 0794: tst (sp)+ 0795: mtpi sp 0796: br 2f 0797: 1: 0798: bis $30000,PS 0799: jsr pc,*(r0)+ 0800: cmp (sp)+,(sp)+ 0801: 2: 0802: mov (sp)+,r1 0803: tst (sp)+ 0804: mov (sp)+,r0 0805: rtt 0806: /* --------------------------- */ 0807: .globl _fubyte, _subyte 0808: /* --------------------------- */ 0809: .globl _fuibyte, _suibyte 0810: /* --------------------------- */ 0811: .globl _fuword, _suword 0812: /* --------------------------- */ 0813: .globl _fuiword, _suiword 0814: _fuibyte: 0815: _fubyte: 0816: mov 2(sp),r1 0817: bic $1,r1 0818: jsr pc,gword 0819: cmp r1,2(sp) 0820: beq 1f 0821: swab r0 0822: 1: 0823: bic $!377,r0 0824: rts pc 0825: 0826: _suibyte: 0827: _subyte: 0828: mov 2(sp),r1 0829: bic $1,r1 0830: jsr pc,gword 0831: mov r0,-(sp) 0832: cmp r1,4(sp) 0833: beq 1f 0834: movb 6(sp),1(sp) 0835: br 2f 0836: 1: 0837: movb 6(sp),(sp) 0838: 2: 0839: mov (sp)+,r0 0840: jsr pc,pword 0841: clr r0 0842: rts pc 0843: 0844: _fuiword: 0845: _fuword: 0846: mov 2(sp),r1 0847: fuword: 0848: jsr pc,gword 0849: rts pc 0850: 0851: gword: 0852: mov PS,-(sp) 0853: bis $340,PS 0854: mov nofault,-(sp) 0855: mov $err,nofault 0856: mfpi (r1) 0857: mov (sp)+,r0 0858: br 1f 0859: 0860: _suiword: 0861: _suword: 0862: mov 2(sp),r1 0863: mov 4(sp),r0 0864: suword: 0865: jsr pc,pword 0866: rts pc 0867: 0868: pword: 0869: mov PS,-(sp) 0870: bis $340,PS 0871: mov nofault,-(sp) 0872: mov $err,nofault 0873: mov r0,-(sp) 0874: mtpi (r1) 0875: 1: 0876: mov (sp)+,nofault 0877: mov (sp)+,PS 0878: rts pc 0879: 0880: err: 0881: mov (sp)+,nofault 0882: mov (sp)+,PS 0883: tst (sp)+ 0884: mov $-1,r0 0885: rts pc 0886: 0887: /* --------------------------- */ 0888: .globl _savfp, _display 0889: _savfp: 0890: _display: 0891: rts pc 0892: 0893: /* --------------------------- */ 0894: .globl _incupc 0895: _incupc: 0896: mov r2,-(sp) 0897: mov 6(sp),r2 / base of prof with base,leng,off,scale 0898: mov 4(sp),r0 / pc 0899: sub 4(r2),r0 / offset 0900: clc 0901: ror r0 0902: mul 6(r2),r0 / scale 0903: ashc $-14.,r0 0904: inc r1 0905: bic $1,r1 0906: cmp r1,2(r2) / length 0907: bhis 1f 0908: add (r2),r1 / base 0909: mov nofault,-(sp) 0910: mov $2f,nofault 0911: mfpi (r1) 0912: inc (sp) 0913: mtpi (r1) 0914: br 3f 0915: 2: 0916: clr 6(r2) 0917: 3: 0918: mov (sp)+,nofault 0919: 1: 0920: mov (sp)+,r2 0921: rts pc 0922: 0923: / Character list get/put 0924: 0925: /* --------------------------- */ 0926: .globl _getc, _putc 0927: /* --------------------------- */ 0928: .globl _cfreelist 0929: 0930: _getc: 0931: mov 2(sp),r1 0932: mov PS,-(sp) 0933: mov r2,-(sp) 0934: bis $340,PS 0935: bic $100,PS / spl 5 0936: mov 2(r1),r2 / first ptr 0937: beq 9f / empty 0938: movb (r2)+,r0 / character 0939: bic $!377,r0 0940: mov r2,2(r1) 0941: dec (r1)+ / count 0942: bne 1f 0943: clr (r1)+ 0944: clr (r1)+ / last block 0945: br 2f 0946: 1: 0947: bit $7,r2 0948: bne 3f 0949: mov -10(r2),(r1) / next block 0950: add $2,(r1) 0951: 2: 0952: dec r2 0953: bic $7,r2 0954: mov _cfreelist,(r2) 0955: mov r2,_cfreelist 0956: 3: 0957: mov (sp)+,r2 0958: mov (sp)+,PS 0959: rts pc 0960: 9: 0961: clr 4(r1) 0962: mov $-1,r0 0963: mov (sp)+,r2 0964: mov (sp)+,PS 0965: rts pc 0966: 0967: _putc: 0968: mov 2(sp),r0 0969: mov 4(sp),r1 0970: mov PS,-(sp) 0971: mov r2,-(sp) 0972: mov r3,-(sp) 0973: bis $340,PS 0974: bic $100,PS / spl 5 0975: mov 4(r1),r2 / last ptr 0976: bne 1f 0977: mov _cfreelist,r2 0978: beq 9f 0979: mov (r2),_cfreelist 0980: clr (r2)+ 0981: mov r2,2(r1) / first ptr 0982: br 2f 0983: 1: 0984: bit $7,r2 0985: bne 2f 0986: mov _cfreelist,r3 0987: beq 9f 0988: mov (r3),_cfreelist 0989: mov r3,-10(r2) 0990: mov r3,r2 0991: clr (r2)+ 0992: 2: 0993: movb r0,(r2)+ 0994: mov r2,4(r1) 0995: inc (r1) / count 0996: clr r0 0997: mov (sp)+,r3 0998: mov (sp)+,r2 0999: mov (sp)+,PS 1000: rts pc 1001: 9: 1002: mov pc,r0 1003: mov (sp)+,r3 1004: mov (sp)+,r2 1005: mov (sp)+,PS 1006: rts pc 1007: 1008: /* --------------------------- */ 1009: .globl _backup 1010: /* --------------------------- */ 1011: .globl _regloc 1012: _backup: 1013: mov 2(sp),ssr+2 1014: mov r2,-(sp) 1015: jsr pc,backup 1016: mov r2,ssr+2 1017: mov (sp)+,r2 1018: movb jflg,r0 1019: bne 2f 1020: mov 2(sp),r0 1021: movb ssr+2,r1 1022: jsr pc,1f 1023: movb ssr+3,r1 1024: jsr pc,1f 1025: movb _regloc+7,r1 1026: asl r1 1027: add r0,r1 1028: mov ssr+4,(r1) 1029: clr r0 1030: 2: 1031: rts pc 1032: 1: 1033: mov r1,-(sp) 1034: asr (sp) 1035: asr (sp) 1036: asr (sp) 1037: bic $!7,r1 1038: movb _regloc(r1),r1 1039: asl r1 1040: add r0,r1 1041: sub (sp)+,(r1) 1042: rts pc 1043: 1044: / hard part 1045: / simulate the ssr2 register missing on 11/40 1046: 1047: backup: 1048: clr r2 / backup register ssr1 1049: mov $1,bflg / clrs jflg 1050: mov ssr+4,r0 1051: jsr pc,fetch 1052: mov r0,r1 1053: ash $-11.,r0 1054: bic $!36,r0 1055: jmp *0f(r0) 1056: 0: t00; t01; t02; t03; t04; t05; t06; t07 1057: t10; t11; t12; t13; t14; t15; t16; t17 1058: 1059: t00: 1060: clrb bflg 1061: 1062: t10: 1063: mov r1,r0 1064: swab r0 1065: bic $!16,r0 1066: jmp *0f(r0) 1067: 0: u0; u1; u2; u3; u4; u5; u6; u7 1068: 1069: u6: / single op, m[tf]pi, sxt, illegal 1070: bit $400,r1 1071: beq u5 / all but m[tf], sxt 1072: bit $200,r1 1073: beq 1f / mfpi 1074: bit $100,r1 1075: bne u5 / sxt 1076: 1077: / simulate mtpi with double (sp)+,dd 1078: bic $4000,r1 / turn instr into (sp)+ 1079: br t01 1080: 1081: / simulate mfpi with double ss,-(sp) 1082: 1: 1083: ash $6,r1 1084: bis $46,r1 / -(sp) 1085: br t01 1086: 1087: u4: / jsr 1088: mov r1,r0 1089: jsr pc,setreg / assume no fault 1090: bis $173000,r2 / -2 from sp 1091: rts pc 1092: 1093: t07: / EIS 1094: clrb bflg 1095: 1096: u0: / jmp, swab 1097: u5: / single op 1098: mov r1,r0 1099: br setreg 1100: 1101: t01: / mov 1102: t02: / cmp 1103: t03: / bit 1104: t04: / bic 1105: t05: / bis 1106: t06: / add 1107: t16: / sub 1108: clrb bflg 1109: 1110: t11: / movb 1111: t12: / cmpb 1112: t13: / bitb 1113: t14: / bicb 1114: t15: / bisb 1115: mov r1,r0 1116: ash $-6,r0 1117: jsr pc,setreg 1118: swab r2 1119: mov r1,r0 1120: jsr pc,setreg 1121: 1122: / if delta(dest) is zero, 1123: / no need to fetch source 1124: 1125: bit $370,r2 1126: beq 1f 1127: 1128: / if mode(source) is R, 1129: / no fault is possible 1130: 1131: bit $7000,r1 1132: beq 1f 1133: 1134: / if reg(source) is reg(dest), 1135: / too bad. 1136: 1137: mov r2,-(sp) 1138: bic $174370,(sp) 1139: cmpb 1(sp),(sp)+ 1140: beq t17 1141: 1142: / start source cycle 1143: / pick up value of reg 1144: 1145: mov r1,r0 1146: ash $-6,r0 1147: bic $!7,r0 1148: movb _regloc(r0),r0 1149: asl r0 1150: add ssr+2,r0 1151: mov (r0),r0 1152: 1153: / if reg has been incremented, 1154: / must decrement it before fetch 1155: 1156: bit $174000,r2 1157: ble 2f 1158: dec r0 1159: bit $10000,r2 1160: beq 2f 1161: dec r0 1162: 2: 1163: 1164: / if mode is 6,7 fetch and add X(R) to R 1165: 1166: bit $4000,r1 1167: beq 2f 1168: bit $2000,r1 1169: beq 2f 1170: mov r0,-(sp) 1171: mov ssr+4,r0 1172: add $2,r0 1173: jsr pc,fetch 1174: add (sp)+,r0 1175: 2: 1176: 1177: / fetch operand 1178: / if mode is 3,5,7 fetch * 1179: 1180: jsr pc,fetch 1181: bit $1000,r1 1182: beq 1f 1183: bit $6000,r1 1184: bne fetch 1185: 1: 1186: rts pc 1187: 1188: t17: / illegal 1189: u1: / br 1190: u2: / br 1191: u3: / br 1192: u7: / illegal 1193: incb jflg 1194: rts pc 1195: 1196: setreg: 1197: mov r0,-(sp) 1198: bic $!7,r0 1199: bis r0,r2 1200: mov (sp)+,r0 1201: ash $-3,r0 1202: bic $!7,r0 1203: movb 0f(r0),r0 1204: tstb bflg 1205: beq 1f 1206: bit $2,r2 1207: beq 2f 1208: bit $4,r2 1209: beq 2f 1210: 1: 1211: cmp r0,$20 1212: beq 2f 1213: cmp r0,$-20 1214: beq 2f 1215: asl r0 1216: 2: 1217: bisb r0,r2 1218: rts pc 1219: 1220: 0: .byte 0,0,10,20,-10,-20,0,0 1221: 1222: fetch: 1223: bic $1,r0 1224: mov nofault,-(sp) 1225: mov $1f,nofault 1226: mfpi (r0) 1227: mov (sp)+,r0 1228: mov (sp)+,nofault 1229: rts pc 1230: 1231: 1: 1232: mov (sp)+,nofault 1233: clrb r2 / clear out dest on fault 1234: mov $-1,r0 1235: rts pc 1236: 1237: .bss 1238: bflg: .=.+1 1239: jflg: .=.+1 1240: .text 1241: 1242: /* --------------------------- */ 1243: .globl _copyin, _copyout 1244: _copyin: 1245: jsr pc,copsu 1246: 1: 1247: mfpi (r0)+ 1248: mov (sp)+,(r1)+ 1249: sob r2,1b 1250: br 2f 1251: 1252: _copyout: 1253: jsr pc,copsu 1254: 1: 1255: mov (r0)+,-(sp) 1256: mtpi (r1)+ 1257: sob r2,1b 1258: 2: 1259: mov (sp)+,nofault 1260: mov (sp)+,r2 1261: clr r0 1262: rts pc 1263: 1264: copsu: 1265: mov (sp)+,r0 1266: mov r2,-(sp) 1267: mov nofault,-(sp) 1268: mov r0,-(sp) 1269: mov 10(sp),r0 1270: mov 12(sp),r1 1271: mov 14(sp),r2 1272: asr r2 1273: mov $1f,nofault 1274: rts pc 1275: 1276: 1: 1277: mov (sp)+,nofault 1278: mov (sp)+,r2 1279: mov $-1,r0 1280: rts pc 1281: 1282: /* --------------------------- */ 1283: .globl _idle 1284: _idle: 1285: mov PS,-(sp) 1286: bic $340,PS 1287: wait 1288: mov (sp)+,PS 1289: rts pc 1290: 1291: /* --------------------------- */ 1292: .globl _spl0, _spl1, _spl4, _spl5, _spl6, _spl7 1293: _spl0: 1294: bic $340,PS 1295: rts pc 1296: 1297: _spl1: 1298: bis $40,PS 1299: bic $300,PS 1300: rts pc 1301: 1302: _spl4: 1303: _spl5: 1304: bis $340,PS 1305: bic $100,PS 1306: rts pc 1307: 1308: _spl6: 1309: bis $340,PS 1310: bic $40,PS 1311: rts pc 1312: 1313: _spl7: 1314: bis $340,PS 1315: rts pc 1316: 1317: /* --------------------------- */ 1318: .globl _dpadd 1319: _dpadd: 1320: mov 2(sp),r0 1321: add 4(sp),2(r0) 1322: adc (r0) 1323: rts pc 1324: 1325: /* --------------------------- */ 1326: .globl _dpcmp 1327: _dpcmp: 1328: mov 2(sp),r0 1329: mov 4(sp),r1 1330: sub 6(sp),r0 1331: sub 8(sp),r1 1332: sbc r0 1333: bge 1f 1334: cmp r0,$-1 1335: bne 2f 1336: cmp r1,$-512. 1337: bhi 3f 1338: 2: 1339: mov $-512.,r0 1340: rts pc 1341: 1: 1342: bne 2f 1343: cmp r1,$512. 1344: blo 3f 1345: 2: 1346: mov $512.,r1 1347: 3: 1348: mov r1,r0 1349: rts pc 1350: 1351: /* --------------------------- */ 1352: .globl dump 1353: dump: 1354: bit $1,SSR0 1355: bne dump 1356: 1357: / save regs r0,r1,r2,r3,r4,r5,r6,KIA6 1358: / starting at abs location 4 1359: 1360: mov r0,4 1361: mov $6,r0 1362: mov r1,(r0)+ 1363: mov r2,(r0)+ 1364: mov r3,(r0)+ 1365: mov r4,(r0)+ 1366: mov r5,(r0)+ 1367: mov sp,(r0)+ 1368: mov KISA6,(r0)+ 1369: 1370: / dump all of core (ie to first mt error) 1371: / onto mag tape. (9 track or 7 track 'binary') 1372: 1373: mov $MTC,r0 1374: mov $60004,(r0)+ 1375: clr 2(r0) 1376: 1: 1377: mov $-512.,(r0) 1378: inc -(r0) 1379: 2: 1380: tstb (r0) 1381: bge 2b 1382: tst (r0)+ 1383: bge 1b 1384: reset 1385: 1386: / end of file and loop 1387: 1388: mov $60007,-(r0) 1389: br . 1390: 1391: /* --------------------------- */ 1392: .globl _ldiv 1393: _ldiv: 1394: clr r0 1395: mov 2(sp),r1 1396: div 4(sp),r0 1397: rts pc 1398: 1399: /* --------------------------- */ 1400: .globl _lrem 1401: _lrem: 1402: clr r0 1403: mov 2(sp),r1 1404: div 4(sp),r0 1405: mov r1,r0 1406: rts pc 1407: 1408: /* --------------------------- */ 1409: .globl _lshift 1410: _lshift: 1411: mov 2(sp),r1 1412: mov (r1)+,r0 1413: mov (r1),r1 1414: ashc 4(sp),r0 1415: mov r1,r0 1416: rts pc 1417: 1418: /* --------------------------- */ 1419: .globl csv 1420: csv: 1421: mov r5,r0 1422: mov sp,r5 1423: mov r4,-(sp) 1424: mov r3,-(sp) 1425: mov r2,-(sp) 1426: jsr pc,(r0) 1427: 1428: /* --------------------------- */ 1429: .globl cret 1430: cret: 1431: mov r5,r1 1432: mov -(r1),r4 1433: mov -(r1),r3 1434: mov -(r1),r2 1435: mov r5,sp 1436: mov (sp)+,r5 1437: rts pc 1438: 1439: /* --------------------------- */ 1440: .globl _u 1441: _u = 140000 1442: usize = 16. 1443: 1444: PS = 177776 1445: SSR0 = 177572 1446: SSR2 = 177576 1447: KISA0 = 172340 1448: KISA6 = 172354 1449: KISD0 = 172300 1450: MTC = 172522 1451: UISA0 = 177640 1452: UISA1 = 177642 1453: UISD0 = 177600 1454: UISD1 = 177602 1455: IO = 7600 1456: 1457: .data 1458: /* --------------------------- */ 1459: .globl _ka6, _cputype 1460: _ka6: KISA6 1461: _cputype:40. 1462: 1463: .bss 1464: /* --------------------------- */ 1465: .globl nofault, ssr, badtrap 1466: nofault:.=.+2 1467: ssr: .=.+6 1468: badtrap:.=.+2