C P / M 6 8 0 0 0 A s s e m b l e r Revision 02.03 Page 1 Source File: exceptn.s 1 2 ************************************************* 3 * * 4 * CP/M-68k Basic Disk Operating System * 5 * Exception Handling Module * 6 * * 7 * Version 0.0 -- July 21, 1982 * 8 * Version 0.1 -- July 25, 1982 * 9 * Version 0.2 -- October 6, 1982 * 10 * Version 0.3 -- December 21, 1982 * 11 * * 12 ************************************************* 13 14 15 .globl _initexc 16 .globl _tpa_lp 17 .globl _tpa_hp 18 19 bgetseg = 18 20 bsetexc = 22 21 buserr = 2 22 spurious = 24 23 trap0 = 32 24 trap2 = 34 25 trap3 = 35 26 endvec = 48 27 28 _initexc: 29 * Initialize Exception Vector Handlers 30 * It has 1 passed parameter: the address of the exception vector array 31 00000000 7016 move #bsetexc,d0 32 00000002 7202 moveq #2,d1 33 00000004 243C00000072 move.l #exchndl,d2 34 init1: 35 0000000A 48E7E000 movem.l d0-d2,-(sp) 36 0000000E 4E43 trap #3 * BIOS call to set exception vector 37 00000010 4CDF0007 movem.l (sp)+,d0-d2 38 00000014 5241 init2: addq #1,d1 39 00000016 5882 add.l #4,d2 40 00000018 0C410018 cmpi #spurious,d1 41 0000001C 6602 bne init3 42 0000001E 7220 move #trap0,d1 43 00000020 0C410022 init3: cmpi #trap2,d1 44 00000024 67EE beq init2 * don't init trap 2 or trap 3 45 00000026 0C410023 cmpi #trap3,d1 46 0000002A 67E8 beq init2 47 0000002C 0C410030 cmpi #endvec,d1 48 00000030 6DD8 blt init1 49 * initialize the exception vector array 50 51 00000032 7012 moveq #bgetseg,d0 52 00000034 4E43 trap #3 * get the original TPA limits 53 00000036 2040 movea.l d0,a0 54 00000038 4A58 tst.w (a0)+ 55 0000003A 2218 move.l (a0)+,d1 * d1 = original low TPA limit C P / M 6 8 0 0 0 A s s e m b l e r Revision 02.03 Page 2 Source File: exceptn.s 56 0000003C 2401 move.l d1,d2 57 0000003E D490 add.l (a0),d2 * d2 = original high TPA limit 58 00000040 263900000000 move.l _tpa_lp,d3 * d3 = new low TPA limit 59 00000046 283900000000 move.l _tpa_hp,d4 * d4 = new high TPA limit 60 0000004C 7011 move #17,d0 61 0000004E 206F0004 movea.l 4(sp),a0 62 00000052 23C800000000 move.l a0,evec_adr * save exception vector address 63 init4: 64 00000058 B290 cmp.l (a0),d1 65 0000005A 620C bhi do_init * if old exception outside orig TPA, clear it 66 0000005C B490 cmp.l (a0),d2 67 0000005E 6308 bls do_init 68 * current exception array entry is in original TPA 69 00000060 B690 cmp.l (a0),d3 70 00000062 6206 bhi dontinit * if old exception in old TPA but outside new 71 00000064 B890 cmp.l (a0),d4 * TPA, don't clear it 72 00000066 6302 bls dontinit 73 do_init: 74 00000068 4290 clr.l (a0) 75 dontinit: 76 0000006A 4A98 tst.l (a0)+ 77 0000006C 51C8FFEA dbf d0,init4 78 00000070 4E75 rts 79 80 exchndl: 81 00000072 61000056 bsr.w except 82 excrtn0: 83 00000076 61000052 bsr.w except 84 0000007A 6100004E bsr.w except 85 0000007E 6100004A bsr.w except 86 00000082 61000046 bsr.w except 87 00000086 61000042 bsr.w except 88 0000008A 613E bsr.w except 89 0000008C 613C bsr.w except 90 0000008E 613A bsr.w except 91 00000090 6138 bsr.w except 92 00000092 6136 bsr.w except 93 00000094 6134 bsr.w except 94 00000096 6132 bsr.w except 95 00000098 6130 bsr.w except 96 0000009A 612E bsr.w except 97 0000009C 612C bsr.w except 98 0000009E 612A bsr.w except 99 000000A0 6128 bsr.w except 100 000000A2 6126 bsr.w except 101 000000A4 6124 bsr.w except 102 000000A6 6122 bsr.w except 103 000000A8 6120 bsr.w except 104 000000AA 611E bsr.w except 105 000000AC 611C bsr.w except 106 000000AE 611A bsr.w except 107 000000B0 6118 bsr.w except 108 000000B2 6116 bsr.w except 109 000000B4 6114 bsr.w except 110 000000B6 6112 bsr.w except C P / M 6 8 0 0 0 A s s e m b l e r Revision 02.03 Page 3 Source File: exceptn.s 111 000000B8 6110 bsr.w except 112 000000BA 610E bsr.w except 113 000000BC 610C bsr.w except 114 000000BE 610A bsr.w except 115 000000C0 6108 bsr.w except 116 000000C2 6106 bsr.w except 117 000000C4 6104 bsr.w except 118 000000C6 6102 bsr.w except 119 000000C8 4E71 bsr.w except 120 121 122 except: 123 000000CA 4267 clr.w -(sp) 124 000000CC 48E78080 movem.l a0/d0,-(sp) * 10 words now on stack in following order: 125 * _______________________________ 126 * |____________D0.L_______________| 127 * |____________A0.L_______________| 128 * |____0000______|________________ 129 * |_______Handler Return__________| 130 * If bus error, extra 2 longs are here 131 * ______________ 132 * |__Status Reg__|________________ 133 * |_____Exception Return__________| 134 135 000000D0 202F000A move.l 10(sp),d0 * get return address from above array 136 000000D4 90BC00000076 sub.l #excrtn0,d0 * d0 now has 4 * (encoded excptn nmbr), where 137 * encoded excptn nmbr is in [0..21,22..37] 138 * representing [2..23,32..47] 139 000000DA 0C400024 cmpi #36,d0 * if d0/4 is in [0..9,22..29] then 140 000000DE 6F10 ble chkredir * the exception may be redirected 141 000000E0 0C400058 cmpi #88,d0 142 000000E4 6D20 blt dfltexc 143 000000E6 0C400074 cmpi #116,d0 144 000000EA 6E1A bgt dfltexc 145 * in range of redirected exceptions 146 000000EC 04400030 subi #48,d0 * subtract 4*12 to normalize [0..9,22..29] 147 * into [0..9,10..17] 148 chkredir: 149 000000F0 207900000000 movea.l evec_adr,a0 150 000000F6 D0C0 adda d0,a0 * index into exception vector array 151 000000F8 4A90 tst.l (a0) * if 00000000, then not redirected 152 000000FA 6658 bne usrexc 153 * not redirected, do default handler 154 000000FC 0C400028 cmpi #40,d0 155 00000100 6D04 blt dfltexc 156 00000102 06400030 addi #48,d0 * add 4*12 that was sub'd above 157 dfltexc: 158 00000106 DEFC000E adda #14,sp * throw away 7 words that we added to stack 159 0000010A E440 asr #2,d0 * divide d0 by 4 160 * now d0 is in [0..21,22..37] 161 * to represent [2..23,32..47] 162 0000010C 0C400002 cmpi #2,d0 * bus or address error? 163 00000110 6C04 bge nobusexc 164 00000112 4CDF0300 movem.l (sp)+,a0-a1 * if yes, throw away 4 words from stack 165 nobusexc: C P / M 6 8 0 0 0 A s s e m b l e r Revision 02.03 Page 4 Source File: exceptn.s 166 00000116 4A5F tst.w (sp)+ * throw away stacked SR 167 00000118 5440 addi #2,d0 168 0000011A 0C400017 cmpi #23,d0 * get back real excptn nmbr in [2..23,32..47] 169 0000011E 6F02 ble lowexc 170 00000120 5040 addi #8,d0 171 00000122 3F00 lowexc: move d0,-(sp) * save excptn nmbr 172 00000124 41F900000000 lea excmsg1,a0 173 0000012A 6100009A bsr print * print default exception message 174 0000012E 301F move (sp)+,d0 175 00000130 610000B2 bsr prtbyte 176 00000134 41F90000000F lea excmsg2, a0 177 0000013A 6100008A bsr print 178 0000013E 201F move.l (sp)+,d0 179 00000140 61000092 bsr prtlong 180 00000144 41F900000022 lea excmsg3, a0 181 0000014A 6100007A bsr print 182 0000014E 4280 clr.l d0 183 00000150 4E42 trap #2 * warm boot 184 00000152 4E73 rte 185 186 usrexc: 187 * Call user exception handler 188 * make sure exception information is on his stack 189 00000154 2F50000A move.l (a0),10(sp) * put user handler address on our stack 190 00000158 4E68 move.l usp,a0 * user stack pointer to a0 191 0000015A 0C400008 cmpi #8,d0 * address or bus error? 192 0000015E 6D24 blt addrexc * if yes, skip 193 00000160 082F000D000E btst #13,14(sp) * exception occured in user state? 194 00000166 664A bne supstat1 * if no, go to supervisor handler 195 00000168 212F0010 move.l 16(sp),-(a0) * put exception return on user stack 196 0000016C 312F000E move.w 14(sp),-(a0) * put SR on user stack 197 00000170 4E60 move.l a0,usp * update user stack pointer 198 00000172 4CDF0101 movem.l (sp)+,a0/d0 * restore regs 199 00000176 2F6F00020008 move.l 2(sp),8(sp) * move address of user handler to excptn rtn 200 0000017C 5C4F addq #6,sp * clear junk from stack 201 0000017E 02577FFF andi #$7fff,(sp) * clear trace bit 202 00000182 4E73 rte * go to user handler 203 addrexc: 204 00000184 082F000D0016 btst #13,22(sp) * exception occured in user state? 205 0000018A 662E bne supstat2 * if no, go to supervisor handler 206 0000018C 212F0018 move.l 24(sp),-(a0) * put exception return on user stack 207 00000190 312F0016 move.w 22(sp),-(a0) * put SR on user stack 208 00000194 212F0012 move.l 18(sp),-(a0) * put extra 2 longs on user stack 209 00000198 212F000E move.l 14(sp),-(a0) 210 0000019C 4E60 move.l a0,usp * update user stack pointer 211 0000019E 4CDF0101 movem.l (sp)+,a0/d0 * restore regs 212 000001A2 2F6F00020010 move.l 2(sp),16(sp) * move address of user handler to excptn rtn 213 000001A8 DEFC000E adda #14,sp * clear junk from stack 214 000001AC 02577FFF andi #$7fff,(sp) * clear trace bit 215 000001B0 4E73 rte * go to user handler 216 217 supstat1: 218 000001B2 3F6F000E0008 move.w 14(sp),8(sp) * move SR to our exception return 219 000001B8 6006 bra supstat3 220 supstat2: C P / M 6 8 0 0 0 A s s e m b l e r Revision 02.03 Page 5 Source File: exceptn.s 221 000001BA 3F6F00160008 move.w 22(sp),8(sp) 222 supstat3: 223 000001C0 4CDF0101 movem.l (sp)+,a0/d0 224 000001C4 4E73 rte 225 226 * 227 * Subroutines 228 * 229 230 print: 231 000001C6 4281 clr.l d1 232 000001C8 1218 move.b (a0)+, d1 233 000001CA 6706 beq prtdone 234 000001CC 7002 move #2, d0 235 000001CE 4E42 trap #2 236 000001D0 60F4 bra print 237 prtdone: 238 000001D2 4E75 rts 239 240 prtlong: 241 * Print d0.l in hex format 242 000001D4 3F00 move d0,-(sp) 243 000001D6 4840 swap d0 244 000001D8 6102 bsr prtword 245 000001DA 301F move (sp)+,d0 246 247 prtword: 248 * Print d0.w in hex format 249 000001DC 3F00 move d0,-(sp) 250 000001DE E048 lsr #8,d0 251 000001E0 6102 bsr prtbyte 252 000001E2 301F move (sp)+,d0 253 254 prtbyte: 255 * Print d0.b in hex format 256 000001E4 3F00 move d0,-(sp) 257 000001E6 E848 lsr #4,d0 258 000001E8 6102 bsr prtnib 259 000001EA 301F move (sp)+,d0 260 261 prtnib: 262 000001EC 0240000F andi #$f,d0 263 000001F0 0C40000A cmpi #10,d0 264 000001F4 6D04 blt lt10 265 000001F6 06000007 addi.b #'A'-'9'-1,d0 266 lt10: 267 000001FA 06000030 addi.b #'0',d0 268 000001FE 3200 move d0,d1 269 00000200 7002 move #2,d0 270 00000202 4E42 trap #2 271 00000204 4E75 rts 272 273 274 00000000 .data 275 C P / M 6 8 0 0 0 A s s e m b l e r Revision 02.03 Page 6 Source File: exceptn.s 276 excmsg1: 277 00000000 0D0A0A4578636570 .dc.b 13,10,10,'Exception $',0 277 00000008 74696F6E202400 278 279 excmsg2: 280 0000000F 2061742075736572 .dc.b ' at user address $',0 280 00000017 2061646472657373 280 0000001F 202400 281 282 excmsg3: 283 00000022 2E202041626F7274 .dc.b '. Aborted.',0 283 0000002A 65642E00 284 285 286 00000000 .bss 287 288 evec_adr: 289 00000000 .ds.l 1 290 291 00000004 .end C P / M 6 8 0 0 0 A s s e m b l e r Revision 02.03 Page 7 Source File: exceptn.s S y m b o l T a b l e _initexc 00000000 TEXT _tpa_hp ******** EXT _tpa_lp ******** EXT addrexc 00000184 TEXT bgetseg 00000012 ABS bsetexc 00000016 ABS buserr 00000002 ABS chkredir 000000F0 TEXT dfltexc 00000106 TEXT do_init 00000068 TEXT dontinit 0000006A TEXT endvec 00000030 ABS evec_adr 00000000 BSS except 000000CA TEXT exchndl 00000072 TEXT excmsg1 00000000 DATA excmsg2 0000000F DATA excmsg3 00000022 DATA excrtn0 00000076 TEXT init1 0000000A TEXT init2 00000014 TEXT init3 00000020 TEXT init4 00000058 TEXT lowexc 00000122 TEXT lt10 000001FA TEXT nobusexc 00000116 TEXT print 000001C6 TEXT prtbyte 000001E4 TEXT prtdone 000001D2 TEXT prtlong 000001D4 TEXT prtnib 000001EC TEXT prtword 000001DC TEXT spurious 00000018 ABS supstat1 000001B2 TEXT supstat2 000001BA TEXT supstat3 000001C0 TEXT trap0 00000020 ABS trap2 00000022 ABS trap3 00000023 ABS usrexc 00000154 TEXT