Motorola M68000 Assembler Basic Operating System for Fred-Machine Page 1 1 ttl Basic Operating System for Fred-Machine 2 bin 3 4 00070885 version equ $070885 5 6 * This version drops all the FE00 event handling 7 * in favour of the FE02 scheme. 8 * Dummy entry points for the FE00 "extracodes" are 8+ retained. 9 10 * External references (to ROM code) 11 00000408 load equ $408 12 13 * Device addresses 14 0007FFFC eths equ $7fffc * Status/Command register 15 0007FFFD ethd equ $7fffd * Data char reg 16 0007FFFF ethc equ $7ffff * Control char reg 17 004000C1 vdus equ $4000c1 18 004000C3 vdud equ $4000c3 19 00400100 ptm equ $400100 20 21 * Device constants 22 00000003 vinit equ 3 23 00000011 viof equ $11 24 00000091 vion equ $91 25 00000000 eiof equ 0 26 00000006 eion equ $6 27 28 * ISO Characters 29 0000007F del equ 127 30 00000004 eot equ 4 31 00000007 bel equ 7 32 00000008 bs equ 8 33 0000000A nl equ 10 34 0000000A lf equ 10 35 0000000D cr equ 13 36 0000001B esc equ 27 37 38 * Ethernet control characters 39 00000080 opn equ $80 40 00000090 cls equ $90 41 00000010 rdy equ $10 42 00000020 stx equ $20 43 00000030 dtx equ $30 44 00000050 nak equ $50 45 000000C0 ack equ $c0 46 0000000B etx equ $0b 47 48 * Filestore commands 49 00004830 uclose equ 'H'<<8+'0' 50 00004B30 close equ 'K'<<8+'0' 51 00005330 openr equ 'S'<<8+'0' 52 00005430 openw equ 'T'<<8+'0' 53 00005530 reset equ 'U'<<8+'0' 54 00005830 readsq equ 'X'<<8+'0' 55 00005930 writesq equ 'Y'<<8+'0' 56 00005F00 logmask equ 95<<8 57 00004C00 logon equ 'L'<<8 58 00004D00 logoff equ 'M'<<8 59 60 * Store addresses Motorola M68000 Assembler Basic Operating System for Fred-Machine Page 2 61 00001000 sysbot equ $1000 * const 62 * System code >= sysbot 63 * System stack < sysvars 64 00003400 sysvars equ $3400 * const 65 * System variables >= sysvars 66 00003FF0 freebot equ $3ff0 * set up by boot rom 67 00003FF4 freetop equ $3ff4 68 00003FF8 membot equ $3ff8 * remembered by system 69 00003FFC memtop equ $3ffc 70 00003FA9 fsport equ $3fa9 71 72 00003F9C currentpb equ $3f9c 73 00000000 processownarea equ a5 *$3f98 74 75 * VDU emulation stuff 76 00003FA0 screenrows equ $3fa0 77 00003FA1 screencols equ $3fa1 78 00003FA2 screenput equ $3fa2 79 00003FA4 screenputa equ $3fa4 80 81 string macro 82 \* dc.b \@b-\@a 83 \@a dc.b \1 84 \@b equ * 85 endm 86 87 text macro 88 \* dc.b \1,0 89 endm 90 91 align macro 92 ds.w 0 93 endm 94 95 ************************ 96 * Supervisor variables * 97 ************************ 98 99 00003400 org sysvars 100 003400 00000010 ds.l 4 former site of event,subevent,eve 100+ ntinfo,eventpc 101 003410 000000FC ds.b 252 former site of eventmess 102 00350C 00000004 processor ds.l 1 68000 or 68010 103 * 104 * Kernel stuff for trace etc 105 * 106 003510 00000040 ds.l 16 former event context (16 regs) 107 003550 00000014 ds.l 5 former event handler context (PC, 107+ A4,A5,A6,A7) 108 003564 0000003C rsave ds.l 15 Trap context (16 regs + PC) 109 0035A0 00000004 spsave ds.l 1 110 0035A4 00000004 lastpc ds.l 1 111 0035A8 00000006 breakpoint ds.w 3 * BP address (2w) and contents 111+ (1w) 112 0035AE 00000008 watchpoint ds.l 2 * WP address and contents 113 0035B6 00000002 targetline ds.w 1 114 0035B8 0000000C ds.w 6 old site of ether stuff, moved fur 114+ ther down 115 * 116 * Stream stuff 117 * Motorola M68000 Assembler Basic Operating System for Fred-Machine Page 3 118 * 4-longword control blocks PTR:LIM:SERVICE:EXTRA 119 * 120 0035C4 00000002 userno ds.w 1 * Filestore user numb 120+ er (or 0) 121 0035C6 00000004 curin ds.l 1 122 0035CA 00000004 curout ds.l 1 123 0035CE 00000040 in0 ds.l 16 * 4 streams, 4 longwo 123+ rds each 124 00360E 00000040 out0 ds.l 16 125 * 126 * Keyboard stuff 127 * 128 00364E 00000004 kbprom ds.l 1 * Address of prompt string 129 003652 00000002 kbmode ds.w 1 * nobuf:notecho:noecho 130 003654 00000002 vdiscard ds.w 1 * Non-zero after ^O 131 003656 00000002 vquota ds.w 1 * Number of lines left befo 131+ re freezing 132 003658 00000002 kbin ds.w 1 133 00365A 00000002 kbex ds.w 1 134 00365C 00000002 lpos ds.w 1 135 00365E 00000002 lend ds.w 1 136 003660 00000064 kbbeg ds.b 100 * Raw keyboard buffer 137 000036C4 kbend equ * 138 0036C4 0000005C lbeg ds.b 92 * Current line buffer 139 00003720 llim equ * 140 003720 00000004 vep ds.l 1 * Terminal output routine e 140+ ntry point 141 003724 00000004 kexmask ds.l 1 * KB exemption mask 142 * 143 * Misc 144 * 145 003728 00000004 millisecs ds.l 1 * 100 is added to this ever 145+ y decisec 146 00372C 00000001 cylock ds.b 1 * =0 not locked 147 * * >0 locked (with nest coun 147+ t) 148 * * + byte sign bit if ^Y pen 148+ ding 149 00372D 00000001 ds.b 1 former site of ether port used for fi 149+ lestore 150 * 151 * Ether stuff 152 * 153 00372E 00000002 station ds.w 1 154 003730 00000004 etherr ds.l 1 * error count 155 003734 00000004 dtxin ds.l 1 **order** * set on hearing DTX 156 003738 00000004 rdyin ds.l 1 **order** * set on hearing RDY 157 00373C 00000004 stxin ds.l 1 **order** * set on hearing STX 158 003740 00000004 ackin ds.l 1 **order** * set on hearing ACK/ 158+ NAK 159 003744 00000004 nakin ds.l 1 **order** * set on hearing NAK 160 * 161 * Disq stuff? 162 * 163 003748 00000004 dsqint ds.l 1 * int wait coroutine return address 164 00374C 00000004 dsqwai ds.l 1 * int wait coroutine address 165 * 166 * Ether DtxIn AST for G 167 003750 00000004 dtxast ds.l 1 168 003754 00000004 dtxa6 ds.l 1 169 003758 00000004 dtxmask ds.l 1 Motorola M68000 Assembler Basic Operating System for Fred-Machine Page 4 170 * 171 ********************* 172 * Exception vectors * 173 ********************* 174 * 175 00001000 org sysbot 176 00000000 nullstring equ 0 177 001000 00003400 dc.l sysvars Reset SP 178 001004 00002914 dc.l begin Reset PC 179 001008 0000136C dc.l berrexc Bus error 180 00100C 0000137C dc.l aerrexc Address error 181 001010 00001456 dc.l illeexc Illegal instruction 182 001014 000014C2 dc.l zerodiv Division by zero 183 001018 000014E4 dc.l chkfail CHK instruction failure 184 00101C 00001508 dc.l overflow TRAPV instruction failure 185 001020 000013E2 dc.l privexc Privilege violation 186 001024 000015BE dc.l tracexc Trace interrupt 187 001028 00001456 dc.l illeexc 'A' emulation 188 00102C 00001592 dc.l break 'F' emulation (FEED used as break 188+ point) 189 190 001030 0000149E dc.l reserved \ 191 001034 0000149E dc.l reserved \ 192 001038 0000149E dc.l reserved \ 193 00103C 0000149E dc.l reserved \ 194 001040 0000149E dc.l reserved \ 195 001044 0000149E dc.l reserved \ reserved vectors 196 001048 0000149E dc.l reserved / 197 00104C 0000149E dc.l reserved / 198 001050 0000149E dc.l reserved / 199 001054 0000149E dc.l reserved / 200 001058 0000149E dc.l reserved / 201 00105C 0000149E dc.l reserved / 202 203 001060 000013D8 dc.l spuint0 spurious interrupt 204 001064 000013DA dc.l spuint1 \ 205 001068 000013DC dc.l spuint2 > unused auto-interrupts 206 00106C 000013DE dc.l spuint3 / 207 001070 0000191A dc.l ethint ether station interface interrupt 208 001074 00001A30 dc.l kbint ACIA interrupt 209 001078 000018F4 dc.l timeint PTM interrupt 210 00107C 000013E0 dc.l spuint7 NMI 211 212 001080 00001540 dc.l setsr Trap 0: set SR=D0 213 001084 0000149E dc.l reserved 214 001088 0000149E dc.l reserved 215 00108C 0000149E dc.l reserved 216 001090 0000149E dc.l reserved 217 001094 0000149E dc.l reserved 218 001098 0000149E dc.l reserved 219 00109C 0000149E dc.l reserved 220 0010A0 0000149E dc.l reserved 221 0010A4 0000149E dc.l reserved 222 0010A8 0000149E dc.l reserved 223 0010AC 0000149E dc.l reserved 224 0010B0 0000149E dc.l reserved 225 0010B4 0000149E dc.l reserved 226 0010B8 0000149E dc.l reserved 227 0010BC 00001544 dc.l linetrap Trap 15: line-break for Imp 228 * 229 * Old-style extracode entry points Motorola M68000 Assembler Basic Operating System for Fred-Machine Page 5 230 * 231 0010C0 6000FFFE bra.w * printsymbol 232 0010C4 6000FFFE bra.w * printstring 233 0010C8 6000FFFE bra.w * readsymbol 234 0010CC 6000FFFE bra.w * nextsymbol 235 0010D0 60000B2E bra.w printstring * prompt 236 0010D4 60000EDA bra.w testsymbol 237 0010D8 60000F3C bra.w selectinput 238 0010DC 60000F74 bra.w selectoutput 239 0010E0 6000FFFE bra.w * resetinput 240 0010E4 6000FFFE bra.w * resetoutput 241 0010E8 6000FFFE bra.w * closeinput 242 0010EC 6000FFFE bra.w * closeoutput 243 0010F0 6000107E bra.w openinput 244 0010F4 60001136 bra.w openoutput 245 0010F8 6000120A bra.w etheropen 246 0010FC 600012AC bra.w etherclose 247 001100 600012DE bra.w etherwrite 248 001104 6000136A bra.w etherread 249 001108 600013E4 bra.w fcomm 250 00110C 60001450 bra.w fcommw 251 001110 600014CA bra.w fcommr 252 001114 6000FFFE bra.w * absent oldsignal 253 001118 60000BE2 bra.w pdec 254 00111C 6000FFFE bra.w * absent 255 001120 6000FFFE bra.w * absent 256 001124 6000FFFE bra.w * absent 257 001128 6000FFFE bra.w * absent 258 00112C 6000FFFE bra.w * absent 259 001130 60000A98 bra.w cputime 260 001134 6000FFFE bra.w * absent 261 001138 6000FFFE bra.w * absent 262 00113C 6000FFFE bra.w * absent 263 001140 60000EB8 bra.w settermmode 264 001144 6000FFFE bra.w * absent 265 001148 6000FFFE bra.w * absent 266 00114C 6000FFFE bra.w * absent 267 001150 6000FFFE bra.w * absent 268 001154 6000FFFE bra.w * absent 269 001158 6000FFFE bra.w * absent 270 00115C 6000FFFE bra.w * absent 271 001160 6000FFFE bra.w * absent 272 001164 6000FFFE bra.w * absent 273 001168 6000FFFE bra.w * absent 274 00116C 6000FFFE bra.w * absent 275 001170 6000FFFE bra.w * absent 276 001174 6000FFFE bra.w * absent 277 001178 6000FFFE bra.w * absent 278 00117C 6000FFFE bra.w * absent 279 001180 6000FFFE bra.w * absent 280 001184 6000FFFE bra.w * absent 281 001188 6000FFFE bra.w * absent 282 00118C 6000FFFE bra.w * absent nhex 283 001190 6000FFFE bra.w * absent bhex 284 001194 6000FFFE bra.w * absent whex 285 001198 6000FFFE bra.w * absent lhex 286 00119C 6000FFFE bra.w * absent rhex 287 0011A0 6000FFFE bra.w * absent 288 0011A4 6000FFFE bra.w * absent 289 0011A8 6000FFFE bra.w * absent 290 0011AC 6000FFFE bra.w * absent Motorola M68000 Assembler Basic Operating System for Fred-Machine Page 6 291 0011B0 6000FFFE bra.w * absent 292 0011B4 6000FFFE bra.w * absent 293 0011B8 6000FFFE bra.w * absent 294 0011BC 6000FFFE bra.w * absent 295 * 296 * New-style event handling 297 * 298 00000000 linenum equ d5 299 00000000 evlink equ 0(a5) 300 00000020 event equ 32(a5) 301 00000021 eventsub equ 33(a5) 302 00000022 eventline equ 34(a5) 303 00000024 eventextra equ 36(a5) 304 00000028 eventmess equ 40(a5) 305 00000128 eventregs equ 296(a5) 306 00000164 eventsp equ 356(a5) (=eventregs+60) 307 00000000 br0 equ a6 308 00000004 br1 equ 4(a5) 309 00000008 br2 equ 8(a5) 310 0000000C br3 equ 12(a5) 311 00000010 br4 equ 16(a5) 312 00000014 br5 equ 20(a5) 313 00000018 br6 equ 24(a5) 314 0000001C br7 equ 28(a5) 315 * 316 unlink macro 317 \* move.l \1,a1 318 bsr.s unlink 319 move.l a1,\1 320 endm 321 * 322 * Signal Event 323 * D0 = EVENT & 15 324 * + 16 if SUB present 325 * + 32 if EXTRA present 326 * + 64 if MESSAGE present 327 * D1 = SUB if present 328 * D2 = EXTRA if present 329 * A0 = MESSAGE if present 330 331 * Normal entry is to here 332 333 0011C0 48F8FFFF3564 signalevent movem.l d0-d7/a0-a7,rsave 334 335 * But enter here if registers already saved 336 337 * Store away the event context in the event record 338 0011C6 2A4D signoregs move.l processownarea,a5 339 * move.w d0,-(sp) 340 * move.w sr,d0 341 * or.w #$8000,d0 342 * trap #0 343 * move.w (sp)+,d0 344 0011C8 08800004 bclr #4,d0 345 0011CC 6704 beq.s signosub 346 0011CE 1B410021 move.b d1,eventsub 347 0011D2 08800005 signosub bclr #5,d0 348 0011D6 6704 beq.s signoextra 349 0011D8 2B420024 move.l d2,eventextra 350 0011DC 08800007 signoextra bclr #7,d0 351 0011E0 6604 bne.s signoline Motorola M68000 Assembler Basic Operating System for Fred-Machine Page 7 352 0011E2 3B450022 move.w linenum,eventline 353 0011E6 08800006 signoline bclr #6,d0 354 0011EA 6712 beq.s signomess 355 0011EC 4840 swap d0 356 0011EE 4240 clr.w d0 357 0011F0 1010 move.b (a0),d0 358 0011F2 43ED0028 lea eventmess,a1 359 0011F6 12D8 sigmessloop move.b (a0)+,(a1)+ 360 0011F8 51C8FFFC dbra d0,sigmessloop 361 0011FC 4840 swap d0 362 0011FE 1B400020 signomess move.b d0,event 363 001202 41F83564 lea rsave,a0 364 001206 43ED0128 lea eventregs,a1 365 00120A 700F moveq #15,d0 366 00120C 22D8 sigregloop move.l (a0)+,(a1)+ 367 00120E 51C8FFFC dbra d0,sigregloop 368 * Now find the trap block 369 001212 7001 moveq #1,d0 370 001214 122D0020 move.b event,d1 371 001218 E368 lsl.w d1,d0 372 00121A 41D5 lea evlink,a0 373 00121C 2050 huntloop move.l (a0),a0 ad of next trap block 374 00121E B0FC0000 cmp #0,a0 375 001222 67000096 beq crash nil => 376 001226 22680004 move.l 4(a0),a1 PC 377 00122A 3200 move.w d0,d1 378 00122C C251 and.w (a1),d1 379 00122E 67EC beq huntloop not trapped -> 380 001230 246D0164 move.l eventsp,a2 381 001234 2452 move.l (a2),a2 event PC 382 001236 43E9FFFE lea -2(a1),a1 383 00123A B5C9 cmp.l a1,a2 384 00123C 6506 blo.s trapped 385 00123E D2D1 add.w (a1),a1 386 001240 B5C9 cmp.l a1,a2 387 001242 63D8 bls huntloop 388 * Found it 389 001244 2E48 trapped move.l a0,sp 390 001246 28680008 move.l 8(a0),a4 391 00124A 2A88 move.l a0,evlink 392 unlink br0 393 unlink br1 394 unlink br2 395 unlink br3 396 unlink br4 397 unlink br5 398 unlink br6 399 unlink br7 400 001298 4284 clr.l d4 401 00129A 22680004 move.l 4(a0),a1 402 00129E 4EE90002 jmp 2(a1) 403 0012A2 2009 unlink move.l a1,d0 404 0012A4 C0BCFF000001 and.l #$ff000001,d0 405 0012AA 660C bne.s ur9 406 0012AC B3ED0164 cmp.l eventsp,a1 407 0012B0 6506 blo.s ur9 408 0012B2 B3CF cmp.l sp,a1 409 0012B4 6402 bhs.s ur9 410 0012B6 2251 move.l (a1),a1 411 0012B8 4E75 ur9 rts 412 * No trap block found Motorola M68000 Assembler Basic Operating System for Fred-Machine Page 8 413 0012BA 303C2700 crash move.w #$2700,d0 414 0012BE 4E40 trap #0 415 0012C0 41F8130C lea crashmess,a0 416 0012C4 4EB81CB2 jsr vptext 417 0012C8 4280 clr.l d0 418 0012CA 102D0020 move.b event,d0 419 0012CE 4EB81CFC jsr pdec 420 0012D2 4EB81C4A jsr space 421 0012D6 4280 clr.l d0 422 0012D8 102D0021 move.b eventsub,d0 423 0012DC 4EB81CFC jsr pdec 424 0012E0 4EB81C4A jsr space 425 0012E4 202D0024 move.l eventextra,d0 426 0012E8 4EB81CCA jsr phex 427 0012EC 4EB81C4A jsr space 428 0012F0 4280 clr.l d0 429 0012F2 302D0022 move.w eventline,d0 430 0012F6 4EB81CFC jsr pdec 431 0012FA 4EB81C4A jsr space 432 0012FE 41ED0028 lea eventmess,a0 433 001302 4EB81CBC jsr vpstring 434 001306 4E722000 stop #$2000 435 00130A 60FA bra *-4 436 crashmess text 437 align 438 * 439 * Old extracode dummy routine 440 * Assume called by JSR.W xxxx 441 * 442 001316 48F8FFFF3564 absent movem.l d0-d7/a0-a7,rsave 443 00131C 2057 move.l (sp),a0 return address 444 00131E 4282 clr.l d2 445 001320 3428FFFE move.w -2(a0),d2 xxxx 446 001324 48C2 ext.l d2 447 001326 7209 moveq #9,d1 448 001328 41F81332 lea absmess,a0 449 00132C 7070 moveq #$70,d0 450 00132E 6000FE96 bra signoregs 451 absmess string <'Attempt to call absent extracode'> 452 align 453 * 454 ************************ 455 * Exception processing * 456 ************************ 457 * 458 * Bus and Address errors 459 * 460 berrmess string <'Bus error'> 461 aerrmess string <'Address error'> 462 0000136C endmess equ * 463 align 464 00136C 48F8FFFF3564 berrexc movem.l d0-d7/a0-a7,rsave 465 001372 7202 moveq #2,d1 466 001374 740A moveq #aerrmess-berrmess,d2 467 001376 41F81354 lea berrmess,a0 468 00137A 600E bra.s aberror 469 00137C 48F8FFFF3564 aerrexc movem.l d0-d7/a0-a7,rsave 470 001382 7203 moveq #3,d1 471 001384 740E moveq #endmess-aerrmess,d2 472 001386 41F8135E lea aerrmess,a0 473 * Motorola M68000 Assembler Basic Operating System for Fred-Machine Page 9 474 00138A 2A4D aberror move.l processownarea,a5 475 00138C 43ED0028 lea eventmess,a1 476 001390 D2C2 add d2,a1 477 001392 2438350C move.l processor,d2 478 001396 22C2 move.l d2,(a1)+ 479 001398 B4BC000109AA cmp.l #68010,d2 480 00139E 670C beq.s m68010 481 0013A0 32DF move.w (sp)+,(a1)+ FC word 482 0013A2 241F move.l (sp)+,d2 Access address 483 0013A4 32DF move.w (sp)+,(a1)+ IR 484 0013A6 7070 moveq #$70,d0 485 0013A8 60000180 bra usignal 486 0013AC 3F570032 m68010 move.w (sp),$32(sp) SR 487 0013B0 2F6F00020034 move.l 2(sp),$34(sp) PC 488 0013B6 3F6F00060038 move.w 6(sp),$38(sp) Format word 489 0013BC 026F0FFF0038 and.w #$fff,$38(sp) convert to normal 490 0013C2 32EF0008 move.w 8(sp),(a1)+ SSW 491 0013C6 242F000A move.l 10(sp),d2 Access address 492 0013CA 32EF0014 move.w $14(sp),(a1)+ Inst buffer 493 0013CE 4FEF0032 lea $32(sp),sp 494 0013D2 7070 moveq #$70,d0 495 0013D4 60000154 bra usignal 496 * 497 * Spurious interrupts 498 * 499 0013D8 4E73 spuint0 rte 500 0013DA 4E73 spuint1 rte 501 0013DC 4E73 spuint2 rte 502 0013DE 4E73 spuint3 rte 503 0013E0 4E73 spuint7 rte 504 * 505 * Privilege violation exception 506 * Intercept violations caused in 68010 by 507 * MOVE SR,-(SP) 508 * and MOVE SR,Dn 509 * 510 0013E2 48E780C0 privexc movem.l d0/a0/a1,-(sp) 511 0013E6 206F000E move.l 14(sp),a0 * Offending PC 512 0013EA 3010 move.w (a0),d0 * Offending instruct 512+ ion 513 0013EC 54AF000E addq.l #2,14(sp) 514 0013F0 B07C40E7 cmp.w #$40e7,d0 * (MOVE.W SR,-(SP)) 515 0013F4 67000018 beq canpush 516 0013F8 C07CFFF8 and.w #-8,d0 517 0013FC B07C40C0 cmp.w #$40c0,d0 * (MOVE.W SR,D?) 518 001400 67000022 beq canread 519 001404 55AF000E subq.l #2,14(sp) 520 001408 4CDF0301 movem.l (sp)+,d0/a0/a1 * Something else => 521 00140C 606C bra.s privviol 522 523 * Come here on detecting MOVE SR,-(SP) 524 00140E 4E68 canpush move.l usp,a0 525 001410 312F000C move.w 12(sp),-(a0) 526 001414 4E60 move.l a0,usp 527 001416 4CDF0301 movem.l (sp)+,d0/a0/a1 528 00141A 21FC000109AA move.l #68010,processor 529 001422 4E73 rte 530 531 * Come here on detecting MOVE SR,Dn 532 * Stack layout 533 * 0(SP) D0H retadH Motorola M68000 Assembler Basic Operating System for Fred-Machine Page 10 534 * 2(SP) D0L retadL 535 * 4(SP) A0H (A0H) 536 * 6(SP) A0L MOVE.W ?(SP),Dn 537 * 8(SP) (A1H) ?=12 538 * 10(SP) (A1L) RTS 539 * 12(SP) SR (SR) 540 * 14(SP) PCH (PCH) 541 * 16(SP) PCL (PCL) 542 * Note A1 was saved to get the sites right for the 542+ rest, 543 * not to protect it (we don't corrupt it here) 544 001424 7007 canread moveq #7,d0 545 001426 C050 and.w (a0),d0 * register number 546 001428 206F0004 move.l 4(sp),a0 * (restore A0) 547 00142C EB48 lsl.w #5,d0 548 00142E E948 lsl.w #4,d0 549 001430 D07C302F add.w #$302f,d0 * Generate MOVE.W 12(SP) 549+ ,Dn 550 001434 3F400006 move.w d0,6(sp) 551 001438 201F move.l (sp)+,d0 * (restore D0) 552 00143A 3F7C000C0004 move.w #12,4(sp) * displacement for above 553 001440 3F7C4E750006 move.w #$4e75,6(sp) * RETURN instruction 554 001446 4EAF0002 jsr 2(sp) 555 00144A 508F addq.l #8,sp * skip former A0/A1 556 00144C 21FC000109AA move.l #68010,processor 557 001454 4E73 rte 558 559 * 560 * Exception or trap generated signals 561 * 562 convert macro 563 \* movem.l d0-d7/a0-a7,rsave 564 moveq #\2,d1 565 moveq #$50+\1,d0 566 lea \@,a0 567 bra * usignal 568 \@ string <\3> 569 align 570 endm 571 illeexc convert 0,4,<'Illegal instruction'> 572 privviol convert 0,8,<'Privilege violation'> 573 reserved convert 0,5,<'Reserved exception'> 574 zerodiv convert 1,4,<'Division by zero'> 575 chkfail convert 6,2,<'Out of bounds (CHK)'> 576 overflow convert 1,1,<'Overflow (TRAPV)'> 577 * 578 * Convert exception into signal (on User Stack) 579 * 580 00152A 4E69 usignal move.l usp,a1 581 00152C 232F0002 move.l 2(sp),-(a1) 582 001530 21C935A0 move.l a1,rsave+60 583 001534 4E61 move.l a1,usp 584 001536 43F811C6 lea signoregs,a1 585 00153A 2F490002 move.l a1,2(sp) 586 00153E 4E73 rte 587 * 588 * Trap 0: Set SR=D0 589 * 590 001540 3E80 setsr move.w d0,(sp) 591 001542 4E73 rte 592 * Motorola M68000 Assembler Basic Operating System for Fred-Machine Page 11 593 * Trap 15: Line break 594 * 595 001544 48E78080 linetrap movem.l d0/a0,-(sp) 596 001548 207835AE move.l watchpoint,a0 * Guard-duty 597 00154C 2010 move.l (a0),d0 598 00154E B0B835B2 cmp.l watchpoint+4,d0 599 001552 6630 bne.s changed Watched loc has changed -> 600 001554 206F000A move.l 10(sp),a0 PC 601 001558 3A18 move.w (a0)+,linenum update line number 602 00155A 2F48000A move.l a0,10(sp) update PC 603 00155E 303835B6 move.w targetline,d0 604 001562 6B0A bmi.s lt9 single-line mode -> 605 001564 B045 cmp.w linenum,d0 606 001566 6706 beq.s lt9 target line found -> 607 001568 4CDF0101 lt8 movem.l (sp)+,d0/a0 608 00156C 4E73 rte 609 00156E 4CDF0101 lt9 movem.l (sp)+,d0/a0 610 001572 604A bra.s tracexc 611 001574 48E78080 guardduty movem.l d0/a0,-(sp) 612 001578 207835AE move.l watchpoint,a0 613 00157C 2010 move.l (a0),d0 614 00157E B0B835B2 cmp.l watchpoint+4,d0 615 001582 67E4 beq lt8 616 001584 21C035B2 changed move.l d0,watchpoint+4 617 001588 4CDF0101 movem.l (sp)+,d0/a0 618 00158C 48782D2A pea protmess 619 001590 6036 bra.s except 620 * 621 * Breakpoint trap 622 * 623 001592 4AB835A8 break tst.l breakpoint Known breakpoint? 624 001596 6712 beq.s newbreak No -> 625 001598 2F08 move.l a0,-(sp) replace instruction 626 00159A 207835A8 move.l breakpoint,a0 627 00159E 30B835AC move.w breakpoint+4,(a0) 628 0015A2 42B835A8 clr.l breakpoint 629 0015A6 205F move.l (sp)+,a0 630 0015A8 6014 bra.s tracexc 631 0015AA 2F08 newbreak move.l a0,-(sp) 632 0015AC 206F0006 move.l 6(sp),a0 633 0015B0 0C50FEED cmp.w #$feed,(a0) 634 0015B4 205F move.l (sp)+,a0 635 0015B6 6600FE9E bne illeexc 636 0015BA 54AF0002 addq.l #2,2(sp) 637 0015BE 4AB835AE tracexc tst.l watchpoint 638 0015C2 66B0 bne.s guardduty 639 0015C4 48780000 ftracexc pea nullstring 640 0015C8 48F87FFF3564 except movem.l d0-d7/a0-a6,rsave * Save registers 641 0015CE 31FCFFFF3656 move.w #-1,vquota 642 0015D4 610006BA bsr vdureset 643 0015D8 610006C4 bsr home 644 0015DC 205F move.l (sp)+,a0 * Print message 645 0015DE 610006D2 bsr vptext 646 0015E2 41EF0006 exc0 lea 6(sp),a0 * Save "stack pointer 646+ " 647 0015E6 08170005 btst.b #5,(sp) 648 0015EA 6602 bne.s exc1 649 0015EC 4E68 move.l usp,a0 650 0015EE 21C835A0 exc1 move.l a0,spsave 651 0015F2 007C0500 or #$500,sr * Allow non-interrupt 651+ able KB input Motorola M68000 Assembler Basic Operating System for Fred-Machine Page 12 652 0015F6 31FCFFFF3656 move.w #-1,vquota * ^Q (for now) 653 0015FC 61000670 bsr newline * Display saved regis 653+ ters 654 001600 61000648 bsr space 655 001604 7607 moveq #7,d3 * register numbers 656 001606 41F82D67 lea sp10,a0 657 00160A 610006A6 dis0 bsr vptext 658 00160E 7037 moveq #'7',d0 659 001610 9003 sub.b d3,d0 660 001612 61000638 bsr vpsym 661 001616 41F82D69 lea sp8,a0 662 00161A 51CBFFEE dbra d3,dis0 663 00161E 41F82D72 lea dmess,a0 664 001622 6100068E bsr vptext 665 001626 7607 moveq #7,d3 * Data registers 666 001628 47F83564 lea rsave,a3 667 00162C 6100061C dis1 bsr space 668 001630 201B move.l (a3)+,d0 669 001632 61000696 bsr phex 670 001636 51CBFFF4 dbra d3,dis1 671 00163A 41F82D77 lea amess,a0 672 00163E 61000672 bsr vptext 673 001642 7607 moveq #7,d3 * Address registers 674 001644 61000604 dis2 bsr space 675 001648 201B move.l (a3)+,d0 676 00164A 6100067E bsr phex 677 00164E 51CBFFF4 dbra d3,dis2 678 001652 41F82D7C lea srmess,a0 * Status Register, 679 001656 6100065A bsr vptext 680 00165A 3017 move (sp),d0 681 00165C 61000676 bsr phex4 682 001660 3005 move.w linenum,d0 * Line number, 683 001662 6720 beq.s dis25 684 001664 2F3835CA move.l curout,-(sp) 685 001668 41F8360E lea out0,a0 686 00166C 21C835CA move.l a0,curout 687 001670 41F82D82 lea linemess,a0 688 001674 6100063C bsr vptext 689 001678 4280 clr.l d0 690 00167A 3005 move.w linenum,d0 691 00167C 6100067E bsr pdec 692 001680 21DF35CA move.l (sp)+,curout 693 001684 41F82D89 dis25 lea pcmess,a0 * and Program Counter 694 001688 61000628 bsr vptext 695 00168C 202F0002 move.l 2(sp),d0 696 001690 61000638 bsr phex 697 001694 08170007 btst.b #7,(sp) * If we are single-st 697+ epping, 698 001698 670C beq.s dis3 699 00169A 610005AE bsr space * show previous PC al 699+ so 700 00169E 203835A4 move.l lastpc,d0 701 0016A2 61000626 bsr phex 702 * 703 ********************************* 704 * Trace mode command processing * 705 ********************************* 706 * 707 0016A6 41F82D19 dis3 lea whatmess,a0 708 0016AA 61000606 bsr vptext 709 0016AE 61000126 exccom bsr kbrsym Motorola M68000 Assembler Basic Operating System for Fred-Machine Page 13 710 0016B2 B03C0019 exc2 cmp.b #'Y'-64,d0 * ^Y - Kill 711 0016B6 670000C4 beq kill 712 0016BA B03C0013 cmp.b #'S'-64,d0 713 0016BE 67EE beq exccom 714 0016C0 B03C0011 cmp.b #'Q'-64,d0 715 0016C4 67E8 beq exccom 716 0016C6 803C0020 or.b #32,d0 717 0016CA B03C0078 cmp.b #'x',d0 * X - Spy 718 0016CE 670001AE beq spy 719 0016D2 B03C0073 cmp.b #'s',d0 * S - Single Step 720 0016D6 6700008E beq step 721 0016DA B03C0062 cmp.b #'b',d0 * B - run to PC Break 721+ point 722 0016DE 6764 beq.s setbreak 723 0016E0 B03C006C cmp.b #'l',d0 * L - run to line bre 723+ akpoint 724 0016E4 6728 beq.s linebreak 725 0016E6 B03C006E cmp.b #'n',d0 * N - execute Next st 725+ atement 726 0016EA 671E beq.s nextline 727 0016EC B03C0070 cmp.b #'p',d0 * P - protect locatio 727+ n 728 0016F0 6736 beq.s setwatch 729 0016F2 B03C0063 cmp.b #'c',d0 * C - continue 730 0016F6 6722 beq.s continue 731 0016F8 B03C0072 cmp.b #'r',d0 * R - Reset everythin 731+ g 732 0016FC 670000AE beq restart 733 001700 41F82BBC lea helpmess,a0 734 001704 610005AC bsr vptext 735 001708 60A4 bra exccom 736 00170A 70FF nextline moveq #-1,d0 737 00170C 6006 bra.s lb1 738 00170E 61000134 linebreak bsr kbrdec 739 001712 6992 bvs dis3 740 001714 31C035B6 lb1 move.w d0,targetline 741 001718 6004 bra.s co1 742 00171A 427835B6 continue clr.w targetline 743 00171E 08970007 co1 bclr.b #7,(sp) 744 001722 6100009E bsr unbreak 745 001726 6042 bra.s excret 746 001728 610000CE setwatch bsr kbrhex 747 00172C 6900FF78 bvs dis3 748 001730 08800000 bclr.l #0,d0 749 001734 2040 move.l d0,a0 750 001736 21C835AE move.l a0,watchpoint 751 00173A 21D035B2 move.l (a0),watchpoint+4 752 00173E 08D70007 bset.b #7,(sp) 753 001742 6026 bra.s excret 754 001744 08970007 setbreak bclr.b #7,(sp) 755 001748 61000078 bsr unbreak 756 00174C 610000AA bsr kbrhex 757 001750 6900FF54 bvs dis3 758 001754 21C035A8 move.l d0,breakpoint 759 001758 6710 beq.s excret 760 00175A 2040 move.l d0,a0 761 00175C 31D035AC move.w (a0),breakpoint+4 762 001760 30BCFEED move.w #$feed,(a0) 763 001764 6004 bra.s excret 764 001766 08D70007 step bset.b #7,(sp) 765 00176A 61000398 excret bsr screenbot Motorola M68000 Assembler Basic Operating System for Fred-Machine Page 14 766 00176E 4CF87FFF3564 movem.l rsave,d0-d7/a0-a6 767 001774 21EF000235A4 move.l 2(sp),lastpc 768 00177A 4E73 rte 769 00177C 4A38372C kill tst.b cylock 770 001780 670A beq.s killnow * not locked out -> 771 001782 08F80007372C bset.b #7,cylock 772 001788 6000FF24 bra exccom 773 00178C 61000376 killnow bsr screenbot 774 001790 61000030 bsr unbreak 775 001794 4CF87FFF3564 movem.l rsave,d0-d7/a0-a6 776 00179A 08970007 bclr.b #7,(sp) 777 00179E 48F8FFFF3564 movem.l d0-d7/a0-a7,rsave 778 0017A4 7201 moveq #1,d1 779 0017A6 7010 moveq #$10,d0 * %signal 0,1,0 780 0017A8 6000FD80 bra usignal 781 0017AC 303CFFFF restart move.w #-1,d0 782 0017B0 51C8FFFE dbra d0,* 783 0017B4 46FC2700 move.w #$2700,sr 784 0017B8 2E780000 move.l 0,sp 785 0017BC 20780004 move.l 4,a0 786 0017C0 4ED0 jmp (a0) 787 0017C2 203835A8 unbreak move.l breakpoint,d0 788 0017C6 6602 bne.s unb1 789 0017C8 4E75 rts 790 0017CA 2040 unb1 move.l d0,a0 791 0017CC 30B835AC move.w breakpoint+4,(a0) 792 0017D0 42B835A8 clr.l breakpoint 793 0017D4 4E75 rts 794 * 795 * Trace mode command processing routines 796 * 797 0017D6 083900000040 kbrsym btst.b #0,vdus * UNbuffered 798 0017DE 67F6 beq kbrsym 799 0017E0 4280 clr.l d0 800 0017E2 1039004000C3 move.b vdud,d0 801 0017E8 C03C007F and.b #127,d0 802 0017EC B03C000D cmp.b #cr,d0 803 0017F0 6602 bne.s kbrs1 804 0017F2 700A moveq #nl,d0 805 0017F4 60000456 kbrs1 bra vpsym * to echo 806 * 807 * 808 0017F8 61DC kbrhex bsr kbrsym 809 0017FA 4281 clr.l d1 810 0017FC B03C007F kbrhex2 cmp.b #del,d0 811 001800 673A beq.s kbrhex5 812 001802 B03C0008 cmp.b #bs,d0 813 001806 6734 beq.s kbrhex5 814 001808 B03C0018 cmp.b #'X'-64,d0 815 00180C 672E beq.s kbrhex5 816 00180E B03C0030 cmp.b #'0',d0 817 001812 6D24 blt.s kbrhex4 818 001814 B03C0039 cmp.b #'9',d0 819 001818 6F12 ble.s kbrhex3 820 00181A C03C005F and.b #95,d0 821 00181E B03C0041 cmp.b #'A',d0 822 001822 6D14 blt.s kbrhex4 823 001824 B03C0046 cmp.b #'F',d0 824 001828 6E0E bgt.s kbrhex4 825 00182A 5F40 subq #7,d0 826 00182C C07C000F kbrhex3 and #15,d0 Motorola M68000 Assembler Basic Operating System for Fred-Machine Page 15 827 001830 E989 lsl.l #4,d1 828 001832 D280 add.l d0,d1 829 001834 61A0 bsr kbrsym 830 001836 60C4 bra kbrhex2 831 001838 2001 kbrhex4 move.l d1,d0 832 00183A 4E75 rts 833 00183C 2001 kbrhex5 move.l d1,d0 834 00183E 003C0002 or.b #2,ccr 835 001842 4E75 rts 836 001844 6190 kbrdec bsr kbrsym 837 001846 4281 clr.l d1 838 001848 B03C007F kbrdec1 cmp.b #del,d0 839 00184C 67EE beq.s kbrhex5 840 00184E B03C0008 cmp.b #bs,d0 841 001852 67E8 beq.s kbrhex5 842 001854 B03C0018 cmp.b #'X'-64,d0 843 001858 67E2 beq.s kbrhex5 844 00185A B03C0030 cmp.b #'0',d0 845 00185E 6DD8 blt.s kbrhex4 846 001860 B03C007F cmp.b #127,d0 847 001864 67DE beq.s kbrdec 848 001866 B03C0039 cmp.b #'9',d0 849 00186A 6ECC bgt.s kbrhex4 850 00186C C0BC0000000F and.l #15,d0 851 001872 C2FC000A mulu #10,d1 852 001876 D280 add.l d0,d1 853 001878 6100FF5C bsr kbrsym 854 00187C 60CA bra kbrdec1 855 * 856 ******* 857 * Spy * 858 ******* 859 * 860 00187E 41F82BA9 spy lea spyprom,a0 861 001882 6100042E bsr vptext 862 001886 6100FF70 bsr kbrhex * Read address 863 00188A 69F2 bvs spy 864 00188C 2640 move.l d0,a3 865 00188E 6100FF68 spy1 bsr kbrhex * and count 866 001892 69EA bvs spy 867 001894 5340 subq #1,d0 868 001896 C07C00FF and #$ff,d0 * in range 1-256 869 00189A 3800 move d0,d4 870 00189C 3600 move d0,d3 871 00189E 41F82BB4 spy2 lea spyline,a0 872 0018A2 6100040E bsr vptext 873 0018A6 320B spy3 move a3,d1 874 0018A8 C27C000F and #15,d1 875 0018AC 6614 bne.s spy4 876 0018AE 41F82BB8 lea freshline,a0 * show address at 16- 876+ byte boundaries 877 0018B2 610003FE bsr vptext 878 0018B6 200B move.l a3,d0 879 0018B8 61000410 bsr phex 880 0018BC 703A moveq #':',d0 881 0018BE 6100038C bsr vpsym 882 0018C2 61000386 spy4 bsr space 883 0018C6 101B move.b (a3)+,d0 884 0018C8 61000414 bsr phex2 * show one byte at a ti 884+ me 885 0018CC 51CBFFD8 dbra d3,spy3 Motorola M68000 Assembler Basic Operating System for Fred-Machine Page 16 886 0018D0 6100FF04 bsr kbrsym 887 0018D4 B03C003D cmp.b #'=',d0 * '=' overwrites last 887+ shown byte 888 0018D8 670C beq.s spy5 889 0018DA B03C000A cmp.b #nl,d0 * NL displays next ba 889+ tch 890 0018DE 6600FDD2 bne exc2 * anything else gets 890+ you out 891 0018E2 3604 move d4,d3 * anything else reads 891+ new address 892 0018E4 60B8 bra spy2 893 0018E6 6100FF10 spy5 bsr kbrhex 894 0018EA 1740FFFF move.b d0,-1(a3) * overwrite, then sho 894+ w next location 895 0018EE 4243 clr d3 896 0018F0 4244 clr d4 897 0018F2 60AA bra spy2 898 * 899 * 900 * Timer interrupt 901 * Counter 3 is set to interrupt every decisecond. 902 * when this happens, add 100 to millisec counter. 903 * 904 0018F4 48E7C080 timeint movem.l d0-d1/a0,-(sp) 905 0018F8 41F900400100 lea ptm,a0 906 0018FE 7204 moveq #4,d1 * Counter-3-interruptin 906+ g bit 907 001900 C2280002 and.b 2(a0),d1 * Read status register 908 001904 6702 beq.s ti1 * not counter 3 -> 909 001906 7264 moveq #100,d1 910 001908 01480004 ti1 movep.l 4(a0),d0 * Read counters 1, 2, 911 00190C 0108000C movep.w 12(a0),d0 * and 3 to placate PTM 912 001910 D3B83728 add.l d1,millisecs * update time if releva 912+ nt 913 001914 4CDF0103 movem.l (sp)+,d0-d1/a0 914 001918 4E73 rte 915 * 916 * Ether receiver interrupt 917 * 918 00191A 48E7C080 ethint movem.l d0-d1/a0,-(sp) 919 00191E 10390007FFFC move.b eths,d0 * Read status of ethe 919+ r interface 920 * moveq #1,d1 921 * and d0,d1 * Is it responsible? 922 * beq dsqtry * No -> 923 001924 6A0000FC bpl dsqtry * Not ether interrupt 923+ ing -> 924 001928 C07C0002 and.w #2,d0 * Data or Control? 925 00192C 676C beq.s ethdat * Data -> 926 00192E 12390007FFFF move.b ethc,d1 * Read the control ch 926+ aracter 927 001934 103C00F0 move.b #$f0,d0 928 001938 C001 and.b d1,d0 929 00193A 6774 beq.s ethnps 930 00193C 083900000007 ethi0 btst.b #0,eths 931 001944 67F6 beq.s ethi0 932 001946 721F moveq #31,d1 933 001948 C2390007FFFD and.b ethd,d1 934 00194E 4840 swap d0 935 001950 3001 move.w d1,d0 936 001952 E648 lsr.w #3,d0 Motorola M68000 Assembler Basic Operating System for Fred-Machine Page 17 937 001954 C07C0003 and.w #3,d0 938 001958 0A400003 eor.w #3,d0 939 00195C 41F83734 lea dtxin,a0 * Point at flag array e 939+ lement 940 001960 D0C0 add.w d0,a0 941 001962 4840 swap d0 942 001964 B03C0030 cmp.b #dtx,d0 943 001968 67000094 beq ethdtx * DTX -> 944 00196C 5848 addq #4,a0 945 00196E B03C0010 cmp.b #rdy,d0 946 001972 67000082 beq ethset * RDY -> 947 001976 5848 addq #4,a0 948 001978 B03C0020 cmp.b #stx,d0 949 00197C 67000070 beq ethstx * STX -> 950 001980 5848 addq #4,a0 951 001982 B03C00C0 cmp.b #ack,d0 952 001986 6700006E beq ethset * ACK -> 953 00198A B03C0050 cmp.b #nak,d0 954 00198E 6644 bne.s ethunk * Unknown -> 955 001990 52B83730 addq.l #1,etherr * NAK: count as error 955+ , 956 001994 03E80004 bset.b d1,4(a0) * and set both NAK an 956+ d ACK bits 957 001998 605C bra.s ethset 958 0000199A ethdat equ * 959 00199A 10390007FFFD move.b ethd,d0 960 0019A0 6100033C bsr phex2 961 0019A4 700A moveq #nl,d0 962 0019A6 610002A4 bsr vpsym 963 0019AA 52B83730 addq.l #1,etherr 964 0019AE 6048 bra.s ethiret 965 0019B0 B23C000B ethnps cmp.b #etx,d1 * Non port-specific c 965+ har 966 0019B4 6742 beq.s ethiret * ETX: ignore 967 0019B6 B23C0007 cmp.b #7,d1 968 0019BA 6618 bne.s ethunk 969 0019BC 083900000007 ethi1 btst.b #0,eths 970 0019C4 67F6 beq ethi1 971 0019C6 7200 moveq #0,d1 972 0019C8 12390007FFFD move.b ethd,d1 973 0019CE 31C1372E move.w d1,station 974 0019D2 6024 bra.s ethiret 975 0019D4 8240 ethunk or d0,d1 976 0019D6 700A moveq #nl,d0 977 0019D8 61000272 bsr vpsym 978 0019DC 705E moveq #'^',d0 979 0019DE 6100026C bsr vpsym 980 0019E2 3001 move d1,d0 981 0019E4 610002F8 bsr phex2 982 0019E8 52B83730 addq.l #1,etherr 983 0019EC 600A bra.s ethiret 984 0019EE 13FC00000007 ethstx move.b #eiof,eths 985 0019F6 03D0 ethset bset.b d1,(a0) 986 0019F8 4CDF0103 ethiret movem.l (sp)+,d0-d1/a0 987 0019FC 4E73 rte 988 0019FE 03D0 ethdtx bset.b d1,(a0) 989 001A00 2001 move.l d1,d0 * remember port number 990 001A02 22383750 move.l dtxast,d1 * AST enabled? 991 001A06 67F0 beq ethiret * No -> 992 001A08 2041 move.l d1,a0 993 001A0A 22383758 move.l dtxmask,d1 * Interested in this p Motorola M68000 Assembler Basic Operating System for Fred-Machine Page 18 993+ ort? 994 001A0E 0101 btst d0,d1 995 001A10 67E6 beq ethiret * No -> 996 001A12 48E73F7E movem.l d2-d7/a1-a6,-(sp) 997 001A16 2C783754 move.l dtxa6,a6 998 **dtxagain move.l a0,-(sp) 999 ** clr.l dtxast 1000 ** move.w #$2300,sr 1001 001A1A 4E90 jsr (a0) * Call the AST 1002 ** move.w #$2400,sr 1003 ** move.l (sp)+,a0 1004 ** move.l a0,dtxast 1005 ** move.l dtxin,d1 1006 ** bne.s ethdtxagain 1007 001A1C 4CDF7EFC movem.l (sp)+,d2-d7/a1-a6 * and return from int 1008 001A20 60D6 bra ethiret 1009 **ethdtxagain moveq #-1,d0 1010 **edl addq.l #1,d0 1011 ** ror.l d1 1012 ** bcc edl 1013 ** bra dtxagain 1014 * 1015 * Disk interrupt handler 1016 * 1017 001A22 2F383748 dsqtry move.l dsqint,-(sp) 1018 001A26 4E75 rts 1019 001A28 21DF3748 dsqwait move.l (sp)+,dsqint 1020 001A2C 60CA bra ethiret 1021 *dsqspu moveq #bel,d0 1022 * bsr vpsym 1023 * bra ethiret 1024 001A2E 60C8 dsqspu bra ethiret 1025 * 1026 * VDU Keyboard Interrupt 1027 * 1028 001A30 48E7C080 kbint movem.l d0-d1/a0,-(sp) 1029 001A34 30783658 move.w kbin,a0 1030 001A38 1239004000C1 move.b vdus,d1 1031 001A3E 707F moveq #127,d0 1032 001A40 C039004000C3 and.b vdud,d0 1033 001A46 C27C0001 and #1,d1 * Data there? 1034 001A4A 6722 beq.s kbiret * No -> 1035 001A4C 72E0 moveq #-32,d1 1036 001A4E C240 and d0,d1 1037 001A50 6664 bne.s kbbung * not control -> 1038 001A52 7201 moveq #1,d1 1039 001A54 E1A9 lsl.l d0,d1 1040 001A56 C2B83724 and.l kexmask,d1 1041 001A5A 665A bne.s kbbung * exempted -> 1042 001A5C B03C000D cmp.b #cr,d0 * Swap CR and LF 1043 001A60 6706 beq.s kbflip 1044 001A62 B03C000A cmp.b #lf,d0 1045 001A66 660C bne.s kbok 1046 001A68 0A000007 kbflip eor.b #cr!!lf,d0 1047 001A6C 6006 bra.s kbok 1048 001A6E 4CDF0103 kbiret movem.l (sp)+,d0-d1/a0 * False alarm 1049 001A72 4E73 rte 1050 001A74 4A10 kbok tst.b (a0) * After DLE? 1051 001A76 6B3E bmi.s kbbung * Yes -> 1052 001A78 B03C0019 cmp.b #'Y'-64,d0 * Pick off ^Y, 1053 001A7C 670000D0 beq kbctrly Motorola M68000 Assembler Basic Operating System for Fred-Machine Page 19 1054 001A80 B03C0014 cmp.b #'T'-64,d0 * and ^T, 1055 001A84 670000B4 beq kbctrlt 1056 001A88 B03C0010 cmp.b #'P'-64,d0 * and DLE, 1057 001A8C 670000F6 beq kbctrlp 1058 001A90 B03C0013 cmp.b #'S'-64,d0 * and ^S, 1059 001A94 670000FA beq kbctrls 1060 001A98 B03C0011 cmp.b #'Q'-64,d0 * and ^Q, 1061 001A9C 67000102 beq kbctrlq 1062 001AA0 B03C000F cmp.b #'O'-64,d0 * and ^O, 1063 001AA4 6700010A beq kbctrlo 1064 001AA8 B03C0018 cmp.b #'X'-64,d0 * and ^X. 1065 001AAC 67000098 beq kbctrlx 1066 001AB0 4A783656 tst.w vquota * Test for freeze-mod 1066+ e 1067 001AB4 6722 beq.s frozen 1068 001AB6 10C0 kbbung move.b d0,(a0)+ * Attempt to insert i 1068+ nto buffer 1069 001AB8 B0FC36C4 cmp.w #kbend,a0 1070 001ABC 6604 bne.s kbnowrap 1071 001ABE 41F83660 lea kbbeg,a0 1072 001AC2 B0F8365A kbnowrap cmp.w kbex,a0 1073 001AC6 6708 beq.s kbreject * Buffer full -> 1074 001AC8 31C83658 move.w a0,kbin 1075 001ACC 4210 clr.b (a0) * ?Safety for DLE tes 1075+ t? 1076 001ACE 609E bra kbiret 1077 001AD0 7007 kbreject moveq #bel,d0 1078 * move.w vquota,-(sp) 1079 * move.w #1,vquota 1080 * bsr vpsym 1081 * move.w (sp)+,vquota 1082 001AD2 4EB83FA2 jsr screenput 1083 001AD6 6096 bra kbiret 1084 001AD8 B03C0008 frozen cmp.b #bs,d0 1085 001ADC 6756 beq.s melt 1086 001ADE B03C000D cmp.b #cr,d0 1087 001AE2 6750 beq.s melt 1088 001AE4 B03C000A cmp.b #lf,d0 1089 001AE8 6710 beq.s defrost 1090 001AEA B03C0011 cmp.b #'Q'-64,d0 1091 001AEE 66E0 bne.s kbreject 1092 001AF0 31FCFFFF3656 move.w #-1,vquota 1093 001AF6 6000FF76 bra kbiret 1094 001AFA 31FC00013656 defrost move.w #1,vquota 1095 001B00 6000FF6C bra kbiret 1096 001B04 701B screenbot moveq #esc,d0 1097 001B06 4EB83FA2 jsr screenput 1098 001B0A 7059 moveq #'Y',d0 1099 001B0C 4EB83FA2 jsr screenput 1100 001B10 701F moveq #' '-1,d0 1101 001B12 D0383FA0 add.b screenrows,d0 1102 001B16 4EB83FA2 jsr screenput 1103 001B1A 7020 moveq #' ',d0 1104 001B1C 4EB83FA2 jsr screenput 1105 001B20 4E75 rts 1106 001B22 3F00 screenquota move.w d0,-(sp) 1107 001B24 7000 moveq #0,d0 1108 001B26 10383FA0 move.b screenrows,d0 1109 001B2A 5300 subq.b #1,d0 1110 001B2C 31C03656 move.w d0,vquota 1111 001B30 301F move.w (sp)+,d0 Motorola M68000 Assembler Basic Operating System for Fred-Machine Page 20 1112 001B32 4E75 rts 1113 001B34 61EC melt bsr screenquota 1114 001B36 6000FF36 bra kbiret 1115 001B3A 4CDF0103 kbctrlt movem.l (sp)+,d0-d1/a0 1116 001B3E 4238372C clr.b cylock 1117 001B42 6000FA80 bra ftracexc 1118 001B46 31C8365A kbctrlx move.w a0,kbex 1119 001B4A 6000FF6A bra kbbung 1120 001B4E 31C8365A kbctrly move.w a0,kbex 1121 001B52 4A38372C tst.b cylock 1122 001B56 6716 beq.s firenow 1123 001B58 08F80007372C bset.b #7,cylock 1124 * move.w vquota,-(sp) 1125 * move.w #1,vquota 1126 001B5E 705E moveq #'^',d0 1127 001B60 4EB83FA2 jsr screenput 1128 * bsr vpsym 1129 001B64 7059 moveq #'Y',d0 1130 001B66 4EB83FA2 jsr screenput 1131 * bsr vpsym 1132 * move.w (sp)+,vquota 1133 001B6A 6000FF02 bra kbiret 1134 001B6E 4CDF0103 firenow movem.l (sp)+,d0-d1/a0 1135 001B72 08970007 bclr.b #7,(sp) 1136 001B76 48F8FFFF3564 movem.l d0-d7/a0-a7,rsave 1137 001B7C 7201 moveq #1,d1 1138 001B7E 7010 moveq #$10,d0 1139 001B80 6000F9A8 bra usignal 1140 001B84 30783658 kbctrlp move.w kbin,a0 1141 001B88 10BC0080 move.b #$80,(a0) * Note pointer does 1141+ not move 1142 001B8C 6000FEE0 bra kbiret 1143 001B90 31FC00003656 kbctrls move.w #0,vquota 1144 001B96 08B800033653 bclr.b #3,kbmode+1 1145 001B9C 6000FED0 bra kbiret 1146 001BA0 31FCFFFF3656 kbctrlq move.w #-1,vquota 1147 001BA6 08F800033653 bset.b #3,kbmode+1 1148 001BAC 6000FEC0 bra kbiret 1149 001BB0 0A7800013654 kbctrlo eor.w #1,vdiscard 1150 001BB6 6600FEB6 bne kbiret 1151 001BBA 4A783656 tst.w vquota 1152 001BBE 6B00FEAE bmi kbiret 1153 001BC2 6100FF5E bsr screenquota 1154 001BC6 6000FEA6 bra kbiret 1155 1156 * 1157 * %integerfn cputime {real time in milliseconds sin 1157+ ce system startup} 1158 * 1159 001BCA 3F01 cputime move.w d1,-(sp) 1160 001BCC 40C1 move.w sr,d1 1161 001BCE 303C2600 move.w #$2600,d0 * Interrupts off 1162 001BD2 4E40 trap #0 1163 001BD4 7063 moveq.l #99,d0 1164 001BD6 90390040010C sub.b ptm+12,d0 * ms since last timer int 1165 * cmp.b #99,d0 1166 * beq.s cputimex 1167 001BDC 6610 bne.s cputimex 1168 001BDE 083900020040 btst.b #2,ptm+2 1169 001BE6 6706 beq.s cputimex 1170 001BE8 D0BC00000064 add.l #100,d0 Motorola M68000 Assembler Basic Operating System for Fred-Machine Page 21 1171 001BEE D0B83728 cputimex add.l millisecs,d0 1172 001BF2 46C1 move.w d1,sr 1173 001BF4 321F move.w (sp)+,d1 1174 001BF6 4E75 rts 1175 * 1176 * Return with result in D0 1177 * From routines which preserved d0-d2/a0-a2 1178 * 1179 001BF8 2E80 result move.l d0,(sp) 1180 * 1181 * + Return without result 1182 * (Also null output routine) 1183 * 1184 001BFA 4CDF0707 return movem.l (sp)+,d0-d2/a0-a2 1185 001BFE 4E75 rts 1186 * 1187 * %Routine printstring(A0=string) 1188 * 1189 001C00 48E7E0E0 printstring movem.l d0-d2/a0-a2,-(sp) 1190 001C04 4241 clr.w d1 1191 001C06 1218 move.b (a0)+,d1 * Size of string 1192 001C08 67F0 beq return * Null => 1193 001C0A 5341 subq.w #1,d1 * Adjusted for DBRA 1194 001C0C 1018 pst1 move.b (a0)+,d0 1195 001C0E 61000008 bsr printsymbol 1196 001C12 51C9FFF8 dbra d1,pst1 1197 001C16 60E2 bra return 1198 * 1199 * %Routine printsymbol(D0=sym) 1200 * 1201 001C18 48E7E0E0 printsymbol movem.l d0-d2/a0-a2,-(sp) 1202 001C1C 207835CA move.l curout,a0 * Point at CB 1203 001C20 22680008 move.l 8(a0),a1 * Get output routine 1203+ address 1204 001C24 4ED1 jmp (a1) * and go there 1205 * 1206 * File output routine 1207 * 1208 001C26 207835CA fo0 move.l curout,a0 1209 001C2A 2250 fileout move.l (a0),a1 1210 001C2C B3E80004 cmp.l 4(a0),a1 1211 001C30 6706 beq.s fo1 * Buffer full -> 1212 001C32 12C0 move.b d0,(a1)+ 1213 001C34 2089 move.l a1,(a0) 1214 001C36 60C2 bra return 1215 001C38 61000A16 fo1 bsr flush * Flush output buffer 1215+ , 1216 001C3C 2017 move.l (sp),d0 * restore sym and try 1216+ again. 1217 001C3E 60E6 bra fo0 1218 * 1219 * VDU output routines (VPSYM non-destructive) 1220 * 1221 001C40 4A783654 vduout tst.w vdiscard * Test for ^O 1222 001C44 66B4 bne return 1223 001C46 6104 bsr.s vpsym 1224 001C48 60B0 bra return 1225 * 1226 001C4A 7020 space moveq #' ',d0 1227 001C4C B03C000A vpsym cmp.b #nl,d0 1228 001C50 671C beq.s newline * NL -> Motorola M68000 Assembler Basic Operating System for Fred-Machine Page 22 1229 001C52 4A783656 vps0 tst.w vquota 1230 001C56 67FA beq.s vps0 1231 001C58 4EF83FA2 jmp screenput 1232 001C5C 083900010040 aciascreenput btst.b #1,vdus * Wait for TXBE 1233 001C64 67F6 beq aciascreenput 1234 001C66 13C0004000C3 move.b d0,vdud 1235 001C6C 4E75 rts 1236 001C6E 4A783656 newline tst.w vquota * Test for ^S 1237 001C72 6B0C bmi.s nl2 * Free mode -> 1238 001C74 6606 bne.s nl1 * still OK -> 1239 001C76 4A783656 nl0 tst.w vquota * Wait 1240 001C7A 67FA beq nl0 1241 001C7C 53783656 nl1 sub.w #1,vquota 1242 001C80 700D nl2 moveq #cr,d0 * Newline -> CR,LF 1243 001C82 4EB83FA2 jsr screenput 1244 001C86 700A moveq #lf,d0 1245 001C88 4EB83FA2 jsr screenput 1246 001C8C 700A moveq #nl,d0 1247 001C8E 4E75 rts 1248 * 1249 * Reset all weird Visual 200 modes 1250 * 1251 001C90 41F82B92 vdureset lea vdusetup,a0 1252 001C94 1018 vdur1 move.b (a0)+,d0 1253 001C96 6704 beq.s vdur2 1254 001C98 4EB83FA2 jsr screenput 1255 001C9C 4E75 vdur2 rts 1256 * 1257 * Home cursor 1258 * 1259 001C9E 61AA home bsr space 1260 001CA0 61A8 bsr space 1261 001CA2 61A6 bsr space 1262 001CA4 701B moveq #esc,d0 1263 001CA6 4EB83FA2 jsr screenput 1264 001CAA 7048 moveq #'H',d0 1265 001CAC 4EB83FA2 jsr screenput 1266 001CB0 4E75 rts 1267 * 1268 * VDU print text (uses 0-termination) 1269 * 1270 001CB2 1018 vptext move.b (a0)+,d0 1271 001CB4 670009C0 beq ret 1272 001CB8 6192 bsr vpsym 1273 001CBA 60F6 bra vptext 1274 * and length-prefixed for good measure 1275 001CBC 1218 vpstring move.b (a0)+,d1 1276 001CBE 670009B6 vps1 beq ret 1277 001CC2 1018 move.b (a0)+,d0 1278 001CC4 6186 bsr vpsym 1279 001CC6 5301 subq.b #1,d1 1280 001CC8 60F4 bra vps1 1281 * 1282 * VDU print hex routines for kernel 1283 * 1284 001CCA 3F00 phex move d0,-(sp) 1285 001CCC 4840 swap d0 1286 001CCE 61000004 bsr phex4 1287 001CD2 301F move (sp)+,d0 1288 001CD4 3400 phex4 move d0,d2 1289 001CD6 E048 lsr #8,d0 Motorola M68000 Assembler Basic Operating System for Fred-Machine Page 23 1290 001CD8 61000004 bsr phex2 1291 001CDC 3002 move d2,d0 1292 001CDE 3200 phex2 move d0,d1 1293 001CE0 E848 lsr #4,d0 1294 001CE2 61000004 bsr phex1 1295 001CE6 3001 move d1,d0 1296 001CE8 C03C000F phex1 and.b #15,d0 1297 001CEC B03C0009 cmp.b #9,d0 1298 001CF0 6F02 ble.s hn1 1299 001CF2 5E00 add.b #7,d0 1300 001CF4 D03C0030 hn1 add.b #'0',d0 1301 001CF8 6000FF52 bra vpsym 1302 * 1303 * VDU print decimal D0 (range 0..655359) 1304 001CFC 48E7C000 pdec movem.l d0-d1,-(sp) 1305 001D00 72FF moveq #-1,d1 1306 001D02 80FC000A pd1 divu #10,d0 1307 001D06 4840 swap d0 1308 001D08 3F00 move.w d0,-(sp) 1309 001D0A 4240 clr.w d0 1310 001D0C 5241 addq #1,d1 1311 001D0E 4840 swap d0 1312 001D10 66F0 bne pd1 1313 001D12 7030 pd2 moveq #'0',d0 1314 001D14 D05F add.w (sp)+,d0 1315 001D16 6100FF34 bsr vpsym 1316 001D1A 51C9FFF6 dbra d1,pd2 1317 001D1E 4CDF0003 movem.l (sp)+,d0-d1 1318 001D22 4E75 rts 1319 * 1320 * %Routine prompt(A0=string) 1321 * 1322 001D24 21C8364E prompt move.l a0,kbprom 1323 001D28 4E75 rts 1324 * 1325 * %Integerfn readsymbol / nextsymbol 1326 * 1327 001D2A 48E7E0E0 nextsymbol movem.l d0-d2/a0-a2,-(sp) 1328 001D2E 4281 clr.l d1 1329 001D30 6006 bra.s rs0 1330 001D32 48E7E0E0 readsymbol movem.l d0-d2/a0-a2,-(sp) 1331 001D36 7201 moveq #1,d1 1332 001D38 207835C6 rs0 move.l curin,a0 * Descriptor 1333 001D3C 22680008 move.l 8(a0),a1 1334 001D40 4ED1 jmp (a1) 1335 * 1336 * Null input routine 1337 * 1338 001D42 DEFC0018 nullin add #24,sp 1339 001D46 7049 moveq #$49,d0 1340 001D48 41F81D50 lea eof,a0 1341 001D4C 6000F472 bra signalevent 1342 eof string <'End of file reached'> 1343 align 1344 * 1345 * File input routine 1346 * 1347 001D64 2250 filein move.l (a0),a1 1348 001D66 B3E80004 cmp.l 4(a0),a1 1349 001D6A 670C beq.s fi1 * Buffer empty -> 1350 001D6C 4280 clr.l d0 Motorola M68000 Assembler Basic Operating System for Fred-Machine Page 24 1351 001D6E 1011 move.b (a1),d0 1352 001D70 D3C1 add.l d1,a1 1353 001D72 2089 move.l a1,(a0) 1354 001D74 6000FE82 bra result 1355 001D78 2401 fi1 move.l d1,d2 * Rsym:1 / Nsym:0 1356 001D7A 2028000C move.l 12(a0),d0 * Transaction number 1356+ etc 1357 001D7E D07C5830 add #readsq,d0 * for FcommR 1358 001D82 22680004 move.l 4(a0),a1 1359 001D86 2209 move.l a1,d1 1360 001D88 C2BC000001FF and.l #511,d1 1361 001D8E 66B2 bne nullin * Previous was last b 1361+ lock -> 1362 001D90 223C00000200 move.l #512,d1 * Maxsize for FcommR 1363 001D96 93C1 sub.l d1,a1 * end-512=startad for 1363+ FcommR 1364 001D98 41F80000 lea nullstring,a0 1365 001D9C 6100083E bsr fcommr 1366 001DA0 4A40 tst d0 1367 001DA2 6F9E ble nullin * End of file 1368 001DA4 207835C6 move.l curin,a0 1369 001DA8 22680004 move.l 4(a0),a1 * End of buffer -512= 1370 001DAC 93FC00000200 sub.l #512,a1 * Start of buffer 1371 001DB2 D3C2 add.l d2,a1 1372 001DB4 2089 move.l a1,(a0) * +1 or +0 1373 001DB6 93C2 sub.l d2,a1 1374 001DB8 D089 add.l a1,d0 * Actual end of data 1374+ in buffer 1375 001DBA 21400004 move.l d0,4(a0) 1376 001DBE 4280 clr.l d0 1377 001DC0 1011 move.b (a1),d0 * Extract 1st char 1378 001DC2 6000FE34 bra result 1379 001DC6 207835C6 fi2 move.l curin,a0 * Zero-size block or 1379+ Fs Err: 1380 001DCA 20280004 move.l 4(a0),d0 * note EOF status 1381 001DCE D0BC000001FF add.l #511,d0 1382 001DD4 C0BCFFFFFE00 and.l #$fffffe00,d0 1383 001DDA 21400004 move.l d0,4(a0) 1384 001DDE 6000FF62 bra nullin 1385 * 1386 * VDU input routine 1387 * 1388 001DE2 3078365E vduin move.w lend,a0 1389 001DE6 B0FC36C4 cmp.w #lbeg,a0 1390 001DEA 672C beq.s refresh * Line buffer empty -> 1391 001DEC 3078365C move.w lpos,a0 1392 001DF0 B0F8365E cmp.w lend,a0 1393 001DF4 6722 beq.s refresh * Line buffer exhausted -> 1394 001DF6 4280 clr.l d0 1395 001DF8 1010 move.b (a0),d0 * Extract character 1396 001DFA D0C1 add.w d1,a0 * Bump unless nextsymbol 1397 001DFC 31C8365C move.w a0,lpos 1398 001E00 B03C0004 cmp.b #eot,d0 * End of file? 1399 001E04 6600FDF2 bne result * No -> 1400 001E08 31FC36C4365C move.w #lbeg,lpos * Reset pointers 1401 001E0E 31FC36C4365E move.w #lbeg,lend 1402 001E14 6000FF2C bra nullin * signal end of input 1403 * 1404 * Line buffering and echo handler, which maintains 1405 * a single linear line buffer, and takes its input 1406 * from the circular keyboard buffer. Motorola M68000 Assembler Basic Operating System for Fred-Machine Page 25 1407 * 1408 001E18 41F836C4 refresh lea lbeg,a0 * Reset line buffer pointe 1408+ rs 1409 001E1C 31C8365C move.w a0,lpos 1410 001E20 31C8365E move.w a0,lend 1411 001E24 42783654 clr.w vdiscard * Re-enable output 1412 001E28 4A783656 tst.w vquota * If in page-mode, reset q 1412+ uota 1413 001E2C 6B04 bmi.s ref0 1414 001E2E 6100FCF2 bsr screenquota 1415 001E32 2078364E ref0 move.l kbprom,a0 * Emit prompt string 1416 001E36 4280 clr.l d0 1417 001E38 4282 clr.l d2 1418 001E3A 1418 move.b (a0)+,d2 1419 001E3C 5342 subq #1,d2 1420 001E3E 6B0A bmi.s ref2 1421 001E40 1018 ref1 move.b (a0)+,d0 1422 001E42 6100FE08 bsr vpsym 1423 001E46 51CAFFF8 dbra d2,ref1 1424 001E4A 6100015A ref2 bsr getsymbol 1425 001E4E 083800023653 btst.b #2,kbmode+1 1426 001E54 6600FDA2 bne result * No buffering => 1427 001E58 B03C007F cmp.b #del,d0 1428 001E5C 670000C8 beq kbdel 1429 001E60 B07C0020 cmp.w #32,d0 1430 001E64 6D18 blt.s kbcontrol 1431 001E66 61000020 bsr insert 1432 001E6A 61000038 bsr echo 1433 001E6E 60DA bra ref2 1434 001E70 31C8365E kbfree move.w a0,lend 1435 001E74 31FC36C4365C move.w #lbeg,lpos 1436 001E7A 6000FF66 bra vduin 1437 001E7E D080 kbcontrol add.l d0,d0 1438 001E80 2040 move.l d0,a0 1439 001E82 30681EDC move.w kbtable(a0),a0 1440 001E86 4ED0 jmp (a0) 1441 001E88 3078365C insert move.w lpos,a0 1442 001E8C B0FC3720 cmp.w #llim,a0 1443 001E90 6708 beq.s full 1444 001E92 10C0 move.b d0,(a0)+ 1445 001E94 31C8365C move.w a0,lpos 1446 001E98 4E75 rts 1447 001E9A 7007 full moveq #bel,d0 1448 001E9C 6100FDAE bsr vpsym 1449 001EA0 588F addq.l #4,sp 1450 001EA2 60A6 bra ref2 1451 001EA4 083800003653 echo btst.b #0,kbmode+1 1452 001EAA 6700FDA0 beq vpsym 1453 001EAE 4E75 rts 1454 001EB0 3078365C delete move.w lpos,a0 1455 001EB4 B0FC36C4 cmp.w #lbeg,a0 1456 001EB8 6720 beq.s del1 1457 001EBA 5348 subq #1,a0 1458 001EBC 31C8365C move.w a0,lpos 1459 001EC0 083800003653 btst #0,kbmode+1 1460 001EC6 6612 bne.s del1 1461 001EC8 7008 moveq #bs,d0 1462 001ECA 6100FD80 bsr vpsym 1463 001ECE 7020 moveq #' ',d0 1464 001ED0 6100FD7A bsr vpsym 1465 001ED4 7008 moveq #bs,d0 Motorola M68000 Assembler Basic Operating System for Fred-Machine Page 26 1466 001ED6 6000FD74 bra vpsym 1467 001EDA 4E75 del1 rts 1468 00001EDC kbtable equ * 1469 001EDC 1F1C dc.w kbignore 1470 001EDE 1F1C dc.w kbignore 1471 001EE0 1F1C dc.w kbignore 1472 001EE2 1F76 dc.w kbctrlc 1473 001EE4 1F50 dc.w kbeof 1474 001EE6 1F1C dc.w kbignore 1475 001EE8 1F1C dc.w kbignore 1476 001EEA 1F1C dc.w kbignore 1477 001EEC 1F2C dc.w kbcan 1478 001EEE 1F3C dc.w kbtab 1479 001EF0 1F5E dc.w kblf 1480 001EF2 1F1C dc.w kbignore 1481 001EF4 1F1C dc.w kbignore 1482 001EF6 1F5A dc.w kbcr 1483 001EF8 1F1C dc.w kbignore 1484 001EFA 1F1C dc.w kbignore 1485 001EFC 1F1C dc.w kbignore 1486 001EFE 1F1C dc.w kbignore 1487 001F00 1F1C dc.w kbignore 1488 001F02 1F1C dc.w kbignore 1489 001F04 1F1C dc.w kbignore 1490 001F06 1F2C dc.w kbcan 1491 001F08 1F1C dc.w kbignore 1492 001F0A 1F1C dc.w kbignore 1493 001F0C 1F2C dc.w kbcan 1494 001F0E 1F1C dc.w kbignore 1495 001F10 1F50 dc.w kbeof 1496 001F12 1F84 dc.w kbesc 1497 001F14 1F1C dc.w kbignore 1498 001F16 1F1C dc.w kbignore 1499 001F18 1F1C dc.w kbignore 1500 001F1A 1F1C dc.w kbignore 1501 001F1C 7007 kbignore moveq #bel,d0 1502 001F1E 6100FD2C bsr vpsym 1503 001F22 6000FF26 bra ref2 1504 001F26 6188 kbdel bsr delete 1505 001F28 6000FF20 bra ref2 1506 001F2C 6182 kbcan bsr delete 1507 001F2E 3078365C move.w lpos,a0 1508 001F32 B0FC36C4 cmp.w #lbeg,a0 1509 001F36 66F4 bne kbcan 1510 001F38 6000FF10 bra ref2 1511 001F3C 7020 kbtab moveq #' ',d0 1512 001F3E 7402 moveq #2,d2 1513 001F40 6100FF46 kbtabs bsr insert 1514 001F44 6100FF5E bsr echo 1515 001F48 51CAFFF6 dbra d2,kbtabs 1516 001F4C 6000FEFC bra ref2 1517 001F50 7004 kbeof moveq #eot,d0 1518 001F52 6100FF34 bsr insert 1519 001F56 6000FF18 bra kbfree 1520 001F5A 700D kbcr moveq #cr,d0 1521 001F5C 6002 bra.s kbnl 1522 001F5E 700A kblf moveq #lf,d0 1523 001F60 6100FF26 kbnl bsr insert 1524 001F64 083800013653 btst #1,kbmode+1 1525 001F6A 6600FF04 bne kbfree 1526 001F6E 6100FCDC bsr vpsym Motorola M68000 Assembler Basic Operating System for Fred-Machine Page 27 1527 001F72 6000FEFC bra kbfree 1528 001F76 4280 kbctrlc clr.l d0 1529 001F78 DFFC00000018 add.l #24,sp 1530 001F7E 4280 clr.l d0 1531 001F80 6000F23E bra signalevent 1532 001F84 701B kbesc moveq #esc,d0 1533 001F86 6100FF00 bsr insert 1534 001F8A 6100001A bsr getsymbol 1535 001F8E 6100FEF8 bsr insert 1536 001F92 B03C003F cmp.b #'?',d0 1537 001F96 6600FED8 bne kbfree 1538 001F9A 6100000A bsr getsymbol 1539 001F9E 6100FEE8 bsr insert 1540 001FA2 6000FECC bra kbfree 1541 001FA6 6100002A getsymbol bsr ts0 1542 001FAA 4A80 tst.l d0 1543 001FAC 6BF8 bmi.s getsymbol 1544 001FAE 4E75 rts 1545 * 1546 * %Integerfn testsymbol 1547 * Result -1 of no input available, 1548 * else return (and read) first character from buffe 1548+ r 1549 * 1550 001FB0 2F08 testsymbol move.l a0,-(sp) 1551 001FB2 4280 clr.l d0 1552 001FB4 3078365E move.w lend,a0 1553 001FB8 B0FC36C4 cmp.w #lbeg,a0 1554 001FBC 6718 beq.s ts1 * Line buff empty -> 1555 001FBE 3078365C move.w lpos,a0 1556 001FC2 B0F8365E cmp.w lend,a0 1557 001FC6 670E beq.s ts1 * Line buff exhausted -> 1558 001FC8 1018 move.b (a0)+,d0 1559 001FCA 31C8365C move.w a0,lpos * Extract from line buff 1560 001FCE 205F move.l (sp)+,a0 1561 001FD0 4E75 rts 1562 001FD2 2F08 ts0 move.l a0,-(sp) * Alternative entry point 1563 001FD4 4280 clr.l d0 * for line buffer handler 1564 001FD6 3078365A ts1 move.w kbex,a0 1565 001FDA B0F83658 cmp.w kbin,a0 1566 001FDE 6714 beq.s ts3 * kb buff empty -> 1567 001FE0 1018 move.b (a0)+,d0 * Extract from kb buff 1568 001FE2 B0FC36C4 cmp.w #kbend,a0 1569 001FE6 6604 bne.s ts2 1570 001FE8 41F83660 lea kbbeg,a0 * wrap-round 1571 001FEC 31C8365A ts2 move.w a0,kbex 1572 001FF0 205F move.l (sp)+,a0 1573 001FF2 4E75 rts 1574 001FF4 205F ts3 move.l (sp)+,a0 1575 001FF6 70FF moveq #-1,d0 1576 001FF8 4E75 rts 1577 * 1578 * %Routine set terminal mode(%integer bits) 1579 * Bit 0: suppress echo 1580 * Bit 1: suppress terminator echo 1581 * Bit 2: suppress line buffering 1582 * Bit 3: cancel page-mode 1583 * 1584 001FFA 31C03652 settermmode move.w d0,kbmode 1585 001FFE 42783654 clr.w vdiscard 1586 002002 6100FB1E bsr screenquota Motorola M68000 Assembler Basic Operating System for Fred-Machine Page 28 1587 002006 08000003 btst #3,d0 1588 00200A 67000008 beq set1 1589 00200E 31FCFFFF3656 move.w #-1,vquota 1590 002014 4E75 set1 rts 1591 * 1592 * %Routine selectinput(D0=stream) 1593 * 1594 002016 4A80 selectinput tst.l d0 1595 002018 6B08 bmi.s si1 1596 00201A B0BC00000003 cmp.l #3,d0 1597 002020 6F1E ble.s si2 1598 002022 2400 si1 move.l d0,d2 1599 002024 7207 moveq #7,d1 1600 002026 7076 moveq #$76,d0 1601 002028 41F82030 lea badstream,a0 1602 00202C 6000F192 bra signalevent 1603 badstream string <'Illegal stream'> 1604 002040 00000000 ds.w 0 1605 002040 2F00 si2 move.l d0,-(sp) 1606 002042 E988 lsl.l #4,d0 1607 002044 D0BC000035CE add.l #in0,d0 1608 00204A 21C035C6 move.l d0,curin 1609 00204E 201F move.l (sp)+,d0 1610 002050 4E75 rts 1611 * 1612 * %Routine selectoutput(D0=stream) 1613 * 1614 002052 4A80 selectoutput tst.l d0 1615 002054 6B20 bmi.s so1 1616 002056 B0BC00000003 cmp.l #3,d0 1617 00205C 6EC4 bgt.s si1 1618 00205E 2F00 move.l d0,-(sp) 1619 002060 E988 lsl.l #4,d0 1620 002062 D0BC0000360E add.l #out0,d0 1621 002068 21C035CA move.l d0,curout 1622 00206C 201F move.l (sp)+,d0 1623 00206E 31FC600010C0 move.w #$6000,$10c0 1624 002074 4E75 rts 1625 002076 31FC4E7510C0 so1 move.w #$4e75,$10c0 1626 00207C 4E75 rts 1627 * 1628 * %Routine resetinput 1629 * 1630 00207E 48E7E0E0 resetinput movem.l d0-d2/a0-a2,-(sp) 1631 002082 207835C6 move.l curin,a0 1632 002086 20280004 move.l 4(a0),d0 * Tidy buffer pointer 1632+ s 1633 00208A D0BC000001FF add.l #511,d0 1634 002090 C0BCFFFFFE00 and.l #$fffffe00,d0 1635 002096 21400004 move.l d0,4(a0) 1636 00209A 2080 move.l d0,(a0) 1637 00209C 0CA800001DE2 cmp.l #vduin,8(a0) * If keyboard, purge 1637+ 0008 buffer 1638 0020A4 6612 bne.s re1 1639 0020A6 31FC36C4365C move #lbeg,lpos 1640 0020AC 31FC36C4365E move #lbeg,lend 1641 0020B2 31F83658365A move kbin,kbex 1642 0020B8 2028000C re1 move.l 12(a0),d0 * Transaction number 1643 0020BC 6700FB3C beq return * 0 for VDU or NULL 1644 0020C0 D07C5530 add #reset,d0 1645 0020C4 41F80000 lea nullstring,a0 Motorola M68000 Assembler Basic Operating System for Fred-Machine Page 29 1646 0020C8 61000424 bsr fcomm 1647 0020CC 6000FB2C bra return 1648 * 1649 * %Routine resetoutput 1650 * 1651 0020D0 48E7E0E0 resetoutput movem.l d0-d2/a0-a2,-(sp) 1652 0020D4 207835CA move.l curout,a0 1653 0020D8 20280004 move.l 4(a0),d0 1654 0020DC 90BC00000200 sub.l #512,d0 1655 0020E2 2080 move.l d0,(a0) 1656 0020E4 60D2 bra re1 1657 * 1658 * %Routine closeinput 1659 * 1660 0020E6 48E7E0E0 closeinput movem.l d0-d2/a0-a2,-(sp) 1661 0020EA 207835C6 move.l curin,a0 1662 0020EE 20280004 move.l 4(a0),d0 * Tidy pointers 1663 0020F2 D0BC000001FF add.l #511,d0 1664 0020F8 C0BCFFFFFE00 and.l #$fffffe00,d0 1665 0020FE 21400004 move.l d0,4(a0) 1666 002102 2080 move.l d0,(a0) 1667 002104 217C00001D42 move.l #nullin,8(a0) 1668 00210C 2028000C move.l 12(a0),d0 1669 002110 6714 beq.s cli1 1670 002112 42A8000C clr.l 12(a0) 1671 002116 D07C4B30 add #close,d0 1672 00211A 41F80000 lea nullstring,a0 1673 00211E 610003CE bsr fcomm 1674 002122 207835C6 move.l curin,a0 1675 00002126 cli1 equ * 1676 *cli1 cmp.l #vduin,8(a0) * Purge buffer if key 1676+ board 1677 * bne.s dinull 1678 * move #lbeg,lpos 1679 * move #lbeg,lend 1680 * move kbin,kbex 1681 002126 20A80004 dinull move.l 4(a0),(a0) 1682 00212A 217C00001D42 move.l #nullin,8(a0) 1683 002132 42A8000C clr.l 12(a0) 1684 002136 4280 clr.l d0 1685 002138 6000FAC0 bra return 1686 * 1687 * %Routine closeoutput 1688 * 1689 00213C 48E7E0E0 closeoutput movem.l d0-d2/a0-a2,-(sp) 1690 002140 207835CA move.l curout,a0 1691 002144 6100050A bsr flush 1692 002148 207835CA move.l curout,a0 1693 00214C 217C00001BFA move.l #return,8(a0) 1694 002154 2028000C move.l 12(a0),d0 1695 002158 6700FAA0 beq return 1696 00215C 42A8000C clr.l 12(a0) 1697 002160 D07C4B30 add #close,d0 1698 002164 41F80000 lea nullstring,a0 1699 002168 61000384 bsr fcomm 1700 00216C 6000FA8C bra return 1701 * 1702 * %Routine openinput(D0=stream,A0=filename) 1703 * NB side-effect of selecting specified stream 1704 * and of closing it first 1705 * Motorola M68000 Assembler Basic Operating System for Fred-Machine Page 30 1706 002170 6100FEA4 openinput bsr selectinput 1707 002174 48E7E0E0 movem.l d0-d2/a0-a2,-(sp) 1708 002178 207835C6 move.l curin,a0 * descriptor to A0 1709 00217C 20280004 move.l 4(a0),d0 * Tidy up pointers 1710 002180 D0BC000001FF add.l #511,d0 1711 002186 C0BCFFFFFE00 and.l #$fffffe00,d0 1712 00218C 21400004 move.l d0,4(a0) 1713 002190 2080 move.l d0,(a0) 1714 002192 2028000C move.l 12(a0),d0 * Transaction number 1715 002196 6710 beq.s di1 * Zero: file not open 1715+ -> 1716 002198 D07C4830 add #uclose,d0 1717 00219C 41F80000 lea nullstring,a0 1718 0021A0 6100034C bsr fcomm 1719 0021A4 207835C6 move.l curin,a0 1720 *di1 cmp.l #vduin,8(a0) * VDU? 1721 * bne.s di2 1722 * move #lbeg,lpos * purge buffer if so 1723 * move #lbeg,lend 1724 * move kbin,kbex 1725 *di2 1726 0021A8 42A8000C di1 clr.l 12(a0) 1727 0021AC 226F000C move.l 12(sp),a1 * filename string 1728 0021B0 1011 move.b (a1),d0 * Length of filename 1729 0021B2 6700FF72 beq dinull * "" means ":N" 1730 0021B6 0C29003A0001 cmp.b #':',1(a1) * Device name? 1731 0021BC 6708 beq.s di3 * Starts with ':' -> 1732 0021BE 0C29002E0001 cmp.b #'.',1(a1) 1733 0021C4 6628 bne.s difile * Does not start with 1733+ '.' -> 1734 0021C6 B03C0001 di3 cmp.b #1,d0 * Just {"." or} ":"? 1735 0021CA 6716 beq.s divdu * Yes -> 1736 0021CC 10290002 move.b 2(a1),d0 * second char of name 1737 0021D0 803C0020 or.b #32,d0 * To lower case 1738 0021D4 B03C0060 cmp.b #'`',d0 * Test for ":@" 1739 0021D8 673E beq.s dispecial 1740 0021DA B03C006E cmp.b #'n',d0 * Test for ":N" 1741 0021DE 6700FF46 beq dinull * Everything else is 1741+ VDU 1742 0021E2 217C00001DE2 divdu move.l #vduin,8(a0) 1743 0021EA 6000FA0E bra return 1744 0021EE 217C00001D42 difile move.l #nullin,8(a0) 1745 0021F6 303835C4 move userno,d0 1746 0021FA D07C5330 add #openr,d0 1747 0021FE 2049 move.l a1,a0 1748 002200 610002EC bsr fcomm 1749 002204 207835C6 move.l curin,a0 1750 002208 217C00001D64 move.l #filein,8(a0) 1751 002210 2140000C move.l d0,12(a0) 1752 002214 6000F9E4 bra return 1753 002218 217C00001D42 dispecial move.l #nullin,8(a0) 1754 002220 4CDF0007 movem.l (sp)+,d0-d2 1755 002224 588F addq.l #4,sp 1756 002226 4CDF0600 movem.l (sp)+,a1-a2 1757 00222A 4E75 rts 1758 * 1759 * %Routine openoutput(D0=stream,A0=filename) 1760 * NB side-effect of selecting specified stream 1761 * 1762 00222C 6100FE24 openoutput bsr selectoutput 1763 002230 48E7E0E0 movem.l d0-d2/a0-a2,-(sp) Motorola M68000 Assembler Basic Operating System for Fred-Machine Page 31 1764 002234 207835CA move.l curout,a0 1765 002238 61000416 bsr flush 1766 00223C 207835CA move.l curout,a0 1767 002240 2028000C do1 move.l 12(a0),d0 * Transaction number 1768 002244 6710 beq.s do2 * Not file -> 1769 002246 D07C4830 add #uclose,d0 1770 00224A 41F80000 lea nullstring,a0 1771 00224E 6100029E bsr fcomm 1772 002252 207835CA move.l curout,a0 1773 002256 42A8000C do2 clr.l 12(a0) 1774 00225A 217C00001BFA move.l #return,8(a0) 1775 002262 226F000C move.l 12(sp),a1 * filename string 1776 002266 1011 move.b (a1),d0 1777 002268 6700F990 beq return 1778 00226C 0C29003A0001 cmp.b #':',1(a1) 1779 002272 6708 beq.s do3 1780 002274 0C29002E0001 cmp.b #'.',1(a1) 1781 00227A 6628 bne.s dofile 1782 00227C B03C0001 do3 cmp.b #1,d0 1783 002280 67000018 beq dovdu 1784 002284 10290002 move.b 2(a1),d0 1785 002288 803C0020 or.b #32,d0 1786 00228C B03C0060 cmp.b #'`',d0 1787 002290 6786 beq dispecial 1788 002292 B03C006E cmp.b #'n',d0 1789 002296 6700F962 beq return 1790 00229A 217837200008 dovdu move.l vep,8(a0) 1791 0022A0 6000F958 bra return 1792 0022A4 303835C4 dofile move userno,d0 1793 0022A8 D07C5430 add #openw,d0 1794 0022AC 48C0 ext.l d0 1795 0022AE 2049 move.l a1,a0 1796 0022B0 6100023C bsr fcomm 1797 0022B4 207835CA move.l curout,a0 1798 0022B8 217C00001C2A move.l #fileout,8(a0) 1799 0022C0 2140000C move.l d0,12(a0) 1800 0022C4 6000F934 bra return 1801 * 1802 * Auxiliary routines for Ether 1803 * 1804 * Prepare for 32-bit BTST 1805 * and lock out ^Y 1806 * 1807 0022C8 2440 portbit move.l d0,a2 1808 0022CA 4640 not.w d0 1809 0022CC E648 lsr.w #3,d0 1810 0022CE C07C0003 and.w #3,d0 1811 0022D2 C18A exg d0,a2 1812 0022D4 5238372C addq.b #1,cylock 1813 0022D8 C0BC0000001F and.l #31,d0 1814 0022DE 4E75 rts 1815 * 1816 * Unlock ^Y and fire any pending one 1817 * 1818 0022E0 4A38372C unlock tst.b cylock 1819 0022E4 6714 beq.s unl1 * ?error: not locked 1820 0022E6 5338372C subq.b #1,cylock 1821 0022EA 6A0E bpl.s unl1 * nothing pending -> 1822 0022EC 0A380080372C eor.b #$80,cylock 1823 0022F2 6708 beq.s unl2 * fire off -> 1824 0022F4 0A380080372C eor.b #$80,cylock * keep pending bit Motorola M68000 Assembler Basic Operating System for Fred-Machine Page 32 1825 0022FA 4E75 unl1 rts 1826 0022FC 7010 unl2 moveq #$10,d0 1827 0022FE 7201 moveq #1,d1 1828 002300 6000EEBE bra signalevent 1829 * 1830 * Macros to replace hang-mode calls 1831 * 1832 ethtwait macro 1833 \@ btst.b #3,eths 1834 beq \@ 1835 endm 1836 scontrol macro 1837 \* move.b \1,ethc 1838 ethtwait 1839 endm 1840 sdata macro 1841 \* move.b \1,ethd 1842 ethtwait 1843 endm 1844 * 1845 * %Routine etheropen(D0=port,D1=station<<8+port) 1846 * 1847 002304 48E7E0E0 etheropen movem.l d0-d2/a0-a2,-(sp) 1848 002308 61BE bsr portbit 1849 00230A 6700F8EE beq return 1850 00230E 01AA3738 bclr d0,rdyin(a2) 1851 002312 01AA3734 bclr d0,dtxin(a2) 1852 002316 01EA3740 bset d0,ackin(a2) 1853 00231A 01AA3744 bclr d0,nakin(a2) 1854 00231E 01AA373C bclr d0,stxin(a2) 1855 scontrol #opn 1856 sdata d0 1857 002344 01AA3738 eo2 bclr d0,rdyin(a2) 1858 002348 67FA beq eo2 1859 scontrol #stx 1860 sdata d0 1861 00236C E059 ror #8,d1 1862 sdata d1 1863 00237E E159 rol #8,d1 1864 sdata d1 1865 scontrol #etx 1866 0023A2 6100FF3C bsr unlock 1867 0023A6 6000F852 bra return 1868 * 1869 * %Routine etherclose(D0=port) 1870 * 1871 0023AA 48E7E0E0 etherclose movem.l d0-d2/a0-a2,-(sp) 1872 0023AE 6100FF18 bsr portbit 1873 0023B2 01AA3738 bclr d0,rdyin(a2) 1874 scontrol #cls 1875 sdata d0 1876 0023D8 6100FF06 bsr unlock 1877 0023DC 6000F81C bra return 1878 * 1879 * %Routine etherwrite(D0=port,D1=len,A0=buff) 1880 * 1881 0023E0 48E7E0E0 etherwrite movem.l d0-d2/a0-a2,-(sp) 1882 0023E4 6100FEE2 bsr portbit 1883 0023E8 01AA3738 bclr d0,rdyin(a2) * Permission already 1883+ obtained? 1884 0023EC 662E bne.s ew15 * Yes -> Motorola M68000 Assembler Basic Operating System for Fred-Machine Page 33 1885 0023EE 01AA3740 ew0 bclr d0,ackin(a2) * Wait for previous A 1885+ CK 1886 0023F2 67FA beq ew0 1887 scontrol #dtx 1888 sdata d0 1889 002416 01AA3738 ew1 bclr d0,rdyin(a2) * Wait for RDY 1890 00241A 67FA beq ew1 1891 ew15 scontrol #stx 1892 sdata d0 1893 00243E 5341 ew2 subq #1,d1 * Send data 1894 002440 6B000014 bmi ew3 1895 002444 13D80007FFFD move.b (a0)+,ethd 1896 00244A 083900030007 ew25 btst.b #3,eths 1897 002452 66EA bne ew2 1898 002454 60F4 bra ew25 1899 ew3 scontrol #etx 1900 002468 6100FE76 bsr unlock 1901 00246C 6000F78C bra return 1902 * 1903 * %Integerfn etherread(D0=port,D1=maxlen,A0=buff) 1904 * 1905 002470 48E7E0E0 etherread movem.l d0-d2/a0-a2,-(sp) 1906 002474 6100FE52 bsr portbit 1907 002478 01AA3734 er1 bclr d0,dtxin(a2) * Wait for DTX 1908 00247C 67FA beq er1 1909 scontrol #rdy 1910 sdata d0 1911 0024A0 01AA373C er2 bclr d0,stxin(a2) * Wait for STX 1912 0024A4 67FA beq er2 1913 0024A6 70FF moveq #-1,d0 * Count (adjusted for 1913+ ETX) 1914 0024A8 45F90007FFFC lea eths,a2 1915 0024AE 5341 er3 subq #1,d1 * Adjust quota 1916 0024B0 6B18 bmi.s er4 * Limit exceeded -> 1917 0024B2 1412 er35 move.b (a2),d2 * Wait for any charac 1917+ ter 1918 0024B4 08020000 btst #0,d2 1919 0024B8 67F8 beq er35 1920 0024BA 1412 move.b (a2),d2 * Make sure ????? 1921 0024BC 5280 addq.l #1,d0 * Count it 1922 0024BE 08020001 btst #1,d2 1923 0024C2 661E bne.s er5 * Control -> 1924 0024C4 10EA0001 move.b ethd-eths(a2),(a0)+ * Read data character 1925 0024C8 60E4 bra er3 1926 0024CA 1412 er4 move.b (a2),d2 1927 0024CC 08020000 btst #0,d2 1928 0024D0 67F8 beq er4 1929 0024D2 1412 move.b (a2),d2 * Make sure ????? 1930 0024D4 5280 addq.l #1,d0 1931 0024D6 08020001 btst #1,d2 1932 0024DA 6606 bne.s er5 1933 0024DC 142A0001 move.b ethd-eths(a2),d2 * Discard excess data 1934 0024E0 60E8 bra er4 1935 0024E2 14BC0006 er5 move.b #eion,(a2) * Re-enable interrupt 1935+ s 1936 0024E6 6100FDF8 bsr unlock 1937 0024EA 6000F70C bra result 1938 * 1939 * %Integerfn fcomm(D0=CN,A0=string) 1940 * 1941 0024EE 48E7E0E0 fcomm movem.l d0-d2/a0-a2,-(sp) Motorola M68000 Assembler Basic Operating System for Fred-Machine Page 34 1942 0024F2 4A00 tst.b d0 * intercept logoff us 1942+ er 0 1943 0024F4 6620 bne.s fc0 * n#0 -> 1944 0024F6 C07C5F00 and #logmask,d0 1945 0024FA B07C4D00 cmp #logoff,d0 1946 0024FE 6616 bne.s fc0 1947 002500 103835C5 move.b userno+1,d0 1948 002504 D03C0030 add.b #'0',d0 1949 002508 427835C4 clr.w userno 1950 00250C 4A00 tst.b d0 1951 00250E 6606 bne.s fc0 * We were logged on - 1951+ > 1952 002510 4280 clr.l d0 1953 002512 6000F6E4 bra result * Ignore spurious log 1953+ off request 1954 002516 61000170 fc0 bsr prolog * start packet, send 1954+ CN and string 1955 sdata #nl 1956 00252C 610001FE bsr response * Send ETX, Get respo 1956+ nse line 1957 002530 13FC00060007 move.b #eion,eths * re-enable ER interr 1957+ FFFC upts 1958 002538 2217 move.l (sp),d1 * Was it LOGON? 1959 00253A C27C5F00 and #logmask,d1 1960 00253E B27C4C00 cmp #logon,d1 1961 002542 670A beq.s fc4 * Yes -> 1962 002544 6100FD9A bsr unlock 1963 002548 6000F6AE bra result 1964 00254C 4240 fc3 clr d0 1965 00254E 4A40 fc4 tst d0 1966 002550 6BFA bmi fc3 1967 002552 31C035C4 move d0,userno 1968 002556 6100FD88 bsr unlock 1969 00255A 6000F69C bra result 1970 * 1971 * %Integerfn fcommw(D0=CN,A0=params,D1=size,A1=buff 1971+ er) 1972 * 1973 00255E 48E7E0E0 fcommw movem.l d0-d2/a0-a2,-(sp) 1974 002562 61000124 bsr prolog * Send CN and params 1975 002566 E859 ror #4,d1 * High-order Hdnibble 1976 002568 D27C0030 add #'0',d1 * Send high nibble 1977 sdata d1 1978 00257C E959 rol #4,d1 * restore low-order n 1978+ ibble 1979 00257E C23C000F and.b #15,d1 1980 002582 D27C0030 add #'0',d1 * Send low nibble 1981 sdata d1 1982 sdata #nl 1983 * Send data portion 1984 * D2 = TXBE bit number in ETHS 1985 * D1 = size of (rest of) data portion 1986 * A2 = address of ETHD 1987 * A1 = address of (next byte in) data buffer 1988 * A0 = address of ETHS 1989 0025A8 7403 moveq #3,d2 1990 0025AA 45F90007FFFD lea ethd,a2 1991 0025B0 41F90007FFFC lea eths,a0 1992 0025B6 72FF moveq #-1,d1 1993 0025B8 D2AF0004 add.l 4(sp),d1 1994 0025BC 6B0A bmi.s fcw2 Motorola M68000 Assembler Basic Operating System for Fred-Machine Page 35 1995 0025BE 0510 fcw1 btst.b d2,(a0) * 4 inst loop 1996 0025C0 67FC beq fcw1 1997 0025C2 1499 move.b (a1)+,(a2) 1998 0025C4 51C9FFF8 dbra d1,fcw1 1999 0025C8 61000162 fcw2 bsr response 2000 0025CC 13FC00060007 move.b #eion,eths 2001 0025D4 6100FD0A bsr unlock 2002 0025D8 6000F61E bra result 2003 * 2004 * %Integerfn fcommr(D0=CN,D1=maxsize, 2005 * A0=parm,A1=buffer) 2006 * 2007 0025DC 48E7E0E0 fcommr movem.l d0-d2/a0-a2,-(sp) 2008 0025E0 610000A6 bsr prolog 2009 sdata #nl 2010 0025F6 61000134 bsr response 2011 0025FA 222F0004 move.l 4(sp),d1 * restore limit 2012 0025FE 2E80 move.l d0,(sp) * save size (as resul 2012+ t) 2013 * Read data portion 2014 * D2 = CRF bit number in ETHS 2015 * D1 = DRF bit number in ETHS 2016 * D0 = number of bytes (left) to be read 2017 * A2 = address of ETHD 2018 * A1 = address of (next byte in) data buffer 2019 * A0 = address of ETHS 2020 002600 C340 exg d1,d0 2021 002602 9280 sub.l d0,d1 * actual-maximum size 2022 002604 6B02 bmi.s fcr1 * (won't fit: use max) 2022+ -> 2023 002606 2017 move.l (sp),d0 * use actual size 2024 002608 7201 fcr1 moveq #1,d1 2025 00260A 7402 moveq #2,d2 2026 00260C 41F90007FFFC lea eths,a0 2027 002612 45F90007FFFD lea ethd,a2 2028 002618 5380 subq.l #1,d0 2029 00261A 6A06 bpl.s fcr3 2030 00261C 600E bra.s fcr4 2031 00261E 0310 fcr2 btst.b d1,(a0) * Outer 6 inst loop 2032 002620 6612 bne.s fcr5 * Got control -> 2033 002622 0510 fcr3 btst.b d2,(a0) * Inner 4 inst loop 2034 002624 67F8 beq fcr2 2035 002626 12D2 move.b (a2),(a1)+ 2036 002628 51C8FFF8 dbra d0,fcr3 2037 * Data count exhausted or buffer full 2038 * Scan to ETX (or next control character) 2039 00262C 0510 fcr4 btst.b d2,(a0) 2040 00262E 661C bne.s fcr7 * skip data char -> 2041 002630 0310 btst.b d1,(a0) 2042 002632 67F8 beq fcr4 2043 002634 1012 fcr5 move.b (a2),d0 * inspect control char 2044 002636 B03C000B cmp.b #etx,d0 2045 00263A 6604 bne.s fcr6 2046 00263C 10280003 move.b ethc-eths(a0),d0 * skip ETX to avoid int 2046+ errupt 2047 002640 10BC0006 fcr6 move.b #eion,(a0) 2048 002644 6100FC9A bsr unlock 2049 002648 6000F5B0 bra return 2050 00264C 1012 fcr7 move.b (a2),d0 2051 00264E 60DC bra fcr4 2052 * Motorola M68000 Assembler Basic Operating System for Fred-Machine Page 36 2053 * Flush output buffer (used by fileout) 2054 * placed here because of its stack frame size, 2055 * to fit in with the event mechanism 2056 * (reason has since disappeared) 2057 002650 24280004 flush move.l 4(a0),d2 * buffer limit addres 2057+ s 2058 002654 94BC00000200 sub.l #512,d2 * buffer start addres 2058+ s 2059 00265A 2210 move.l (a0),d1 * current end of buff 2059+ er 2060 00265C 9282 sub.l d2,d1 * size of contents 2061 00265E 6716 beq.s ret * empty block -> 2062 002660 2082 move.l d2,(a0) * reset insert pointe 2062+ r 2063 002662 2028000C move.l 12(a0),d0 * Transaction number 2064 002666 670E beq.s ret * None -> 2065 002668 D07C5930 add #writesq,d0 2066 00266C 2242 move.l d2,a1 2067 00266E 41F80000 lea nullstring,a0 2068 002672 6100FEEA bsr fcommw 2069 002676 4E75 ret rts 2070 * 2071 * Auxiliary filestore routines 2072 * 2073 * Routine Magic(/D2=fsport,A2=\fsport>>3&3) 2074 * 2075 002678 C142 magic exg d0,d2 2076 00267A 4280 clr.l d0 2077 00267C 10383FA9 move.b fsport,d0 2078 002680 6100FC46 bsr portbit 2079 002684 C142 exg d0,d2 2080 002686 4E75 rts 2081 * 2082 * %routine prolog(D0=CN,A0=string) 2083 * 2084 002688 61EE prolog bsr magic 2085 00268A 05AA3740 pro0 bclr d2,ackin(a2) * flush previous pack 2085+ et 2086 00268E 67FA beq pro0 2087 002690 05AA3744 bclr d2,nakin(a2) 2088 002694 660000C2 bne hangup * Filestore dead => 2089 scontrol #dtx 2090 sdata d2 2091 0026BA 05AA3738 pro1 bclr d2,rdyin(a2) * wait for RDY 2092 0026BE 67FA beq pro1 2093 scontrol #stx 2094 sdata d2 2095 0026E2 E058 ror #8,d0 * send command letter 2096 sdata d0 2097 0026F4 E158 rol #8,d0 2098 0026F6 4A00 tst.b d0 2099 0026F8 6608 bne.s pro15 * userno/xno supplied 2099+ -> 2100 0026FA D07835C4 add userno,d0 2101 0026FE D03C0030 add.b #'0',d0 2102 pro15 sdata d0 2103 002712 1418 move.b (a0)+,d2 * string length 2104 002714 5302 pro2 sub.b #1,d2 2105 002716 6B00FF5E bmi ret 2106 00271A 13D80007FFFD move.b (a0)+,ethd 2107 002720 083900030007 pro3 btst.b #3,eths Motorola M68000 Assembler Basic Operating System for Fred-Machine Page 37 2108 002728 66EA bne pro2 2109 00272A 60F4 bra pro3 2110 * 2111 * 2112 * %integerfn response 2113 * 2114 00272C 6100FF4A response bsr magic * NB nests an extra l 2114+ ock 2115 002730 6100FBAE bsr unlock * cancel nested extra 2115+ lock 2116 scontrol #etx 2117 002746 05AA3734 res0 bclr d2,dtxin(a2) * Wait for DTX or ACK 2117+ /NAK 2118 00274A 6618 bne.s res2 * Got DTX -> 2119 00274C 052A3740 btst d2,ackin(a2) 2120 002750 67F4 beq res0 * No ACK/NAK yet -> 2121 002752 05AA3744 bclr d2,nakin(a2) 2122 002756 67EE beq.s res0 * Not NAK -> 2123 002758 41F82D3E hangup lea fsdead,a0 * %signal 9,3,0,"File 2123+ store dead" 2124 00275C 7204 moveq #4,d1 2125 00275E 7053 moveq #$53,d0 2126 002760 6000EA5E bra signalevent 2127 res2 scontrol #rdy 2128 sdata d2 2129 002786 05AA373C res3 bclr d2,stxin(a2) * wait for STX 2130 00278A 67FA beq res3 2131 00278C 4280 clr.l d0 * hdhex accumulator 2132 00278E 083900020007 res4 btst.b #2,eths 2133 002796 67F6 beq res4 2134 002798 12390007FFFD move.b ethd,d1 2135 00279E B23C000A cmp.b #nl,d1 2136 0027A2 6700008C beq res9 2137 0027A6 B23C002D cmp.b #'-',d1 2138 0027AA 6700000E beq res5 2139 0027AE 923C0030 sub.b #'0',d1 2140 0027B2 6B66 bmi.s res8 * Mod for OPENR/W ->x 2140+ no,blocks,unused 2141 0027B4 E988 lsl.l #4,d0 2142 0027B6 D001 add.b d1,d0 2143 0027B8 60D4 bra res4 2144 * Filestore error: put error message into event mes 2144+ sage 2145 * and %signal 9,3,errornumber,errormessage 2146 0027BA 4281 res5 clr.l d1 2147 0027BC 083900020007 res55 btst.b #2,eths 2148 0027C4 67F6 beq res55 2149 0027C6 14390007FFFD move.b ethd,d2 * error digit 2150 0027CC 943C0030 sub.b #'0',d2 2151 0027D0 B43C0007 cmp.b #7,d2 * error 7 is invalid user 2151+ no, 2152 0027D4 6604 bne.s res57 2153 0027D6 427835C4 clr.w userno * so invalidate it 2154 0027DA 4281 res57 clr.l d1 2155 0027DC 2A4D move.l processownarea,a5 2156 0027DE 41ED0028 lea eventmess,a0 2157 0027E2 1081 res6 move.b d1,(a0) 2158 0027E4 083900020007 res65 btst.b #2,eths 2159 0027EC 67F6 beq res65 2160 0027EE 10390007FFFD move.b ethd,d0 2161 0027F4 B03C000A cmp.b #nl,d0 Motorola M68000 Assembler Basic Operating System for Fred-Machine Page 38 2162 0027F8 6708 beq.s res7 2163 0027FA 5241 addq #1,d1 2164 0027FC 11801000 move.b d0,0(a0,d1) 2165 002800 60E0 bra res6 2166 002802 13FC00060007 res7 move.b #eion,eths 2167 00280A 6100FAD4 bsr unlock 2168 00280E 7204 moveq #4,d1 2169 002810 7053 moveq #$53,d0 2170 002812 41ED0028 lea eventmess,a0 2171 002816 6000E9A8 bra signalevent 2172 00281A 083900020007 res8 btst.b #2,eths 2173 002822 67F6 beq res8 2174 002824 12390007FFFD move.b ethd,d1 2175 00282A B23C000A cmp.b #nl,d1 2176 00282E 66EA bne res8 2177 002830 4E75 res9 rts 2178 * 2179 2180 * 32x32 bit integer signed multiply to 32 bit resul 2180+ t 2181 * D0 := D0 * D1 2182 * Overflow is reflected in SR on exit, 2183 * but full mutiplication is done anyway. 2184 2185 002832 48E77800 imul movem.l d1-d4,-(sp) 2186 002836 7800 moveq #0,d4 2187 002838 2400 move.l d0,d2 2188 00283A 6A06 bpl.s m1 2189 00283C 4480 neg.l d0 2190 00283E 7801 moveq #1,d4 2191 002840 2400 move.l d0,d2 2192 002842 4842 m1 swap d2 2193 002844 2601 move.l d1,d3 2194 002846 6A08 bpl.s m2 2195 002848 4481 neg.l d1 2196 00284A 0A440001 eor.w #1,d4 2197 00284E 2601 move.l d1,d3 2198 002850 4843 m2 swap d3 2199 002852 4A42 tst.w d2 2200 002854 6714 beq.s maz * A>>16=0 -> 2201 002856 4A43 tst.w d3 2202 002858 6726 beq.s mbz * B>>16=0 -> 2203 00285A C6C0 mulu d0,d3 2204 00285C C4C1 mulu d1,d2 2205 00285E C0C1 mulu d1,d0 2206 002860 D483 add.l d3,d2 2207 002862 4840 swap d0 2208 002864 D042 add.w d2,d0 2209 002866 4840 swap d0 2210 002868 603E bra.s mv * mandatory overflow -> 2211 00286A 4A43 maz tst.w d3 2212 00286C 6724 beq.s mabz * A>>16=B>>16=0 -> 2213 00286E C6C0 mulu d0,d3 2214 002870 C0C1 mulu d1,d0 2215 002872 4840 swap d0 2216 002874 D043 add.w d3,d0 2217 002876 4840 swap d0 2218 002878 4843 swap d3 2219 00287A 4A43 tst.w d3 2220 00287C 662A bne.s mv * certain overflow -> 2221 00287E 6014 bra.s mvt * possible overflow -> Motorola M68000 Assembler Basic Operating System for Fred-Machine Page 39 2222 002880 C4C1 mbz mulu d1,d2 2223 002882 C0C1 mulu d1,d0 2224 002884 4840 swap d0 2225 002886 D042 add.w d2,d0 2226 002888 4840 swap d0 2227 00288A 4842 swap d2 2228 00288C 4A42 tst.w d2 2229 00288E 6618 bne.s mv 2230 002890 6002 bra.s mvt 2231 002892 C0C1 mabz mulu d1,d0 2232 002894 4A80 mvt tst.l d0 2233 002896 6B10 bmi.s mv 2234 002898 08040000 btst #0,d4 2235 00289C 6702 beq.s m8 2236 00289E 4480 neg.l d0 2237 0028A0 4A80 m8 tst.l d0 2238 0028A2 4CDF001E movem.l (sp)+,d1-d4 2239 0028A6 4E75 rts 2240 0028A8 08040000 mv btst #0,d4 2241 0028AC 6702 beq.s m9 2242 0028AE 4480 neg.l d0 2243 0028B0 4A80 m9 tst.l d0 2244 0028B2 4CDF001E movem.l (sp)+,d1-d4 2245 0028B6 003C0002 or.b #2,ccr 2246 0028BA 4E75 rts 2247 2248 * Divide 32 bit integer D0 by 32 bit D1 2249 * D0 := quot, D1 := rem 2250 2251 0028BC 48E73800 idiv movem.l d2-d4,-(sp) 2252 0028C0 4244 clr d4 2253 0028C2 2401 move.l d1,d2 2254 0028C4 6744 beq.s zdivoflow 2255 0028C6 6A06 bpl.s divpos1 2256 0028C8 4482 neg.l d2 2257 0028CA 887C0002 or #2,d4 2258 0028CE 2200 divpos1 move.l d0,d1 2259 0028D0 6A08 bpl.s divpos2 2260 0028D2 4481 neg.l d1 2261 0028D4 0A8400000003 eor.l #3,d4 2262 0028DA 4280 divpos2 clr.l d0 2263 0028DC 7601 move.l #1,d3 2264 0028DE 6004 bra.s divsulps 2265 0028E0 E38A divsulp lsl.l #1,d2 2266 0028E2 E38B lsl.l #1,d3 2267 0028E4 B282 divsulps cmp.l d2,d1 2268 0028E6 62F8 bhi.s divsulp 2269 0028E8 B282 divlp cmp.l d2,d1 2270 0028EA 6504 bcs.s divnosub 2271 0028EC D083 add.l d3,d0 2272 0028EE 9282 sub.l d2,d1 2273 0028F0 E28A divnosub lsr.l #1,d2 2274 0028F2 E28B lsr.l #1,d3 2275 0028F4 66F2 bne divlp 2276 0028F6 E24C lsr #1,d4 2277 0028F8 6402 bcc.s nonegrem 2278 0028FA 4481 neg.l d1 2279 0028FC 4A44 nonegrem tst d4 2280 0028FE 6702 beq.s nonegquo 2281 002900 4480 neg.l d0 2282 002902 4A80 nonegquo tst.l d0 Motorola M68000 Assembler Basic Operating System for Fred-Machine Page 40 2283 002904 4CDF001C movem.l (sp)+,d2-d4 2284 002908 4E75 rts 2285 00290A 4CDF001C zdivoflow movem.l (sp)+,d2-d4 2286 00290E 81FC0000 divs #0,d0 * invoke trap 2287 002912 4E75 rts * never reached 2288 2289 * 2290 * 2291 ************************* 2292 * E n t r y P o i n t * 2293 ************************* 2294 * 2295 * Initialise system variables 2296 * 2297 002914 41F83660 begin lea kbbeg,a0 * Keyboard buffer stuff 2298 002918 31C83658 move a0,kbin 2299 00291C 31C8365A move a0,kbex 2300 002920 4210 clr.b (a0) 2301 002922 4238372C clr.b cylock 2302 002926 21FC00001C40 move.l #vduout,vep 2303 00292E 21FC00000000 move.l #nullstring,kbprom 2304 002936 31FC36C4365C move #lbeg,lpos 2305 00293C 31FC36C4365E move #lbeg,lend 2306 002942 11FC00183FA0 move.b #24,screenrows * VDU emulation stuff 2307 002948 11FC00503FA1 move.b #80,screencols 2308 00294E 31FC4EF93FA2 move.w #$4ef9,screenput 2309 002954 21FC00001C5C move.l #aciascreenput,screenputa 2310 00295C 42783652 clr.w kbmode * echo on, buffering on 2311 002960 42B83724 clr.l kexmask * no KB exemptions 2312 002964 6100F1BC bsr screenquota * page mode 2313 002968 31FCFFFF3656 move.w #-1,vquota * On second thought, NOPAGE 2314 00296E 42783654 clr.w vdiscard * output enabled 2315 002972 42B835A8 clr.l breakpoint * no breakpoints 2316 002976 427835B6 clr.w targetline 2317 00297A 42B835AE clr.l watchpoint 2318 00297E 21F8000035B2 move.l 0,watchpoint+4 2319 002984 42B83730 clr.l etherr * ether stuff 2320 002988 42B8373C clr.l stxin 2321 00298C 42B83734 clr.l dtxin 2322 002990 42B83744 clr.l nakin 2323 002994 21FCFFFFFFFF move.l #$ffffffff,ackin 2324 00299C 42B83738 clr.l rdyin 2325 * move.b fsport,ofsport 2326 0029A0 427835C4 clr userno * not logged on 2327 0029A4 21FC00001A2E move.l #dsqspu,dsqint 2328 0029AC 21FC00001A28 move.l #dsqwait,dsqwai 2329 0029B4 42B83758 clr.l dtxmask 2330 0029B8 42B83750 clr.l dtxast 2331 0029BC 21FC000109A0 move.l #68000,processor 2332 * 2333 * Initialise new-style extracode entry points 2334 * 2335 0029C4 703F moveq #63,d0 2336 0029C6 41F83F00 lea $3f00,a0 2337 ** lea absent,a1 2338 0029CA 323C4EF9 move.w #$4ef9,d1 2339 0029CE 2109 xcloop move.l a1,-(a0) 2340 0029D0 2088 move.l a0,(a0) ** 2341 0029D2 3101 move.w d1,-(a0) 2342 0029D4 51C8FFF8 dbra d0,xcloop 2343 extracode macro Motorola M68000 Assembler Basic Operating System for Fred-Machine Page 41 2344 \* move.l #\2,\1+2 2345 endm 2346 extracode $3f00-6,signalevent 2347 extracode $3f00-12,imul 2348 extracode $3f00-18,idiv 2349 *extracode $3f00-120,new 2350 *extracode $3f00-126,dispose 2351 extracode $3f00-132,nextsymbol 2352 extracode $3f00-138,readsymbol 2353 extracode $3f00-144,printsymbol 2354 extracode $3f00-150,printstring 2355 extracode $3f00-168,selectinput 2356 extracode $3f00-174,selectoutput 2357 extracode $3f00-192,closeinput 2358 extracode $3f00-198,closeoutput 2359 * 2360 * Remember main store particulars 2361 * 2362 002A30 21F83FF03FF8 move.l freebot,membot 2363 002A36 21F83FF43FFC move.l freetop,memtop 2364 002A3C 20783FF4 move.l freetop,a0 2365 002A40 4E60 move.l a0,usp 2366 * 2367 * Initialise stream descriptors 2368 * (Define all 4 input and all 4 output 2369 * streams as the null file) 2370 * 2371 002A42 22383FF0 move.l freebot,d1 2372 002A46 91C8 sub.l a0,a0 2373 002A48 7003 moveq #3,d0 2374 002A4A D2BC00000200 buloop add.l #512,d1 2375 002A50 214135CE move.l d1,in0(a0) 2376 002A54 214135D2 move.l d1,in0+4(a0) 2377 002A58 217C00001D42 move.l #nullin,in0+8(a0) 2378 002A60 42A835DA clr.l in0+12(a0) 2379 002A64 2141360E move.l d1,out0(a0) 2380 002A68 D2BC00000200 add.l #512,d1 2381 002A6E 21413612 move.l d1,out0+4(a0) 2382 002A72 217C00001BFA move.l #return,out0+8(a0) 2383 002A7A 42A8361A clr.l out0+12(a0) 2384 002A7E D1FC00000010 add.l #16,a0 2385 002A84 51C8FFC4 dbra d0,buloop 2386 002A88 21C13FF0 move.l d1,freebot 2387 * 2388 * (Terminal and Ethernet interface have already 2389 * been initialised, and the filestore ether port 2390 * has been opened. Now set up the timer to interru 2390+ pt 2391 * at 10Hz and to count milliseconds, driven from th 2391+ e 2392 * prescaled E clock, i.e. 100kHz. 2393 * 2394 002A8C 42B83728 clr.l millisecs 2395 002A90 41F900400100 lea ptm,a0 2396 002A96 303C6363 move.w #99<<8+99,d0 * For dual mode, ini 2396+ tialise both 2397 002A9A 0188000C movep.w d0,12(a0) * bytes of counter 3 2397+ to 100 2398 002A9E 7001 moveq #1,d0 2399 002AA0 11400002 move.b d0,2(a0) * select cr1 2400 002AA4 1080 move.b d0,(a0) * reset counters Motorola M68000 Assembler Basic Operating System for Fred-Machine Page 42 2401 002AA6 42280002 clr.b 2(a0) * select cr3 2402 002AAA 10BC0047 move.b #$47,(a0) * int,contin,dual,in 2402+ ternal,prescale 2403 002AAE 11400002 move.b d0,2(a0) * select cr1 2404 002AB2 4210 clr.b (a0) * start counters 2405 * 2406 * Shed privilege and identify the system 2407 * 2408 002AB4 13FC00910040 move.b #vion,vdus 2409 002ABC 13FC00000007 move.b #eiof,eths 2410 002AC4 46FC0700 move.w #$700,sr 2411 002AC8 41F82D91 lea identity,a0 2412 002ACC 6100F1E4 bsr vptext 2413 002AD0 41F82DB7 lea terminal,a0 2414 002AD4 4280 clr.l d0 2415 002AD6 6100F754 bsr openoutput 2416 002ADA 41F82DB7 lea terminal,a0 2417 002ADE 4280 clr.l d0 2418 002AE0 6100F68E bsr openinput 2419 002AE4 4280 clr.l d0 2420 002AE6 6100F56A bsr selectoutput 2421 002AEA 4280 clr.l d0 2422 002AEC 6100F528 bsr selectinput 2423 002AF0 40C0 move.w sr,d0 find out whether 68000 or 68010 2424 002AF2 2038350C move.l processor,d0 2425 002AF6 4EB81CFC jsr pdec 2426 002AFA 6100F172 bsr newline 2427 * 2428 * Read in the system configurer 2429 * 2430 002AFE 41F82DA8 lea main,a0 2431 002B02 20383FF0 move.l freebot,d0 2432 002B06 4EB80408 jsr load 2433 002B0A 5680 addq.l #3,d0 2434 002B0C C03C00FC and.b #$fc,d0 2435 002B10 20783FF0 move.l freebot,a0 2436 002B14 D1B83FF0 add.l d0,freebot 2437 002B18 13FC00060007 move.b #eion,eths 2438 002B20 303C0000 move.w #0,d0 2439 002B24 4E40 trap #0 2440 * 2441 * Enter it 2442 * 2443 002B26 4280 clr.l d0 2444 002B28 4281 clr.l d1 2445 002B2A 3028000C move.w 12(a0),d0 Reset offset 2446 002B2E D080 add.l d0,d0 2447 002B30 3228000E move.w 14(a0),d1 Main offset 2448 002B34 D281 add.l d1,d1 2449 002B36 34280004 move.w 4(a0),d2 Export size 2450 002B3A D4680006 add.w 6(a0),d2 + (Import size, should be 0) 2451 002B3E 26280010 move.l 16(a0),d3 MOA (module own area) size 2452 002B42 283C00000600 move.l #1024+512,d4 2453 002B48 D883 add.l d3,d4 Clear POA(1k)+PCB(512)+MOA 2454 002B4A 42A7 zloop clr.l -(sp) 2455 002B4C 5984 subq.l #4,d4 2456 002B4E 6EFA bgt zloop 2457 002B50 284F move.l sp,a4 2458 002B52 4DF43000 lea 0(a4,d3),a6 2459 002B56 4BEE0200 lea 512(a6),a5 2460 002B5A 2A4D move.l a5,processownarea Motorola M68000 Assembler Basic Operating System for Fred-Machine Page 43 2461 002B5C 21CE3F9C move.l a6,currentpb 2462 002B60 97CB sub.l a3,a3 2463 002B62 95CA sub.l a2,a2 2464 002B64 93C9 sub.l a1,a1 2465 002B66 48701820 pea 32(a0,d1.l) 2466 002B6A 41F00820 lea 32(a0,d0.l),a0 2467 002B6E 2E3C80808080 move.l #$80808080,d7 2468 002B74 2C383FF0 move.l freebot,d6 2469 002B78 4285 clr.l d5 2470 002B7A 4284 clr.l d4 2471 002B7C 4283 clr.l d3 2472 002B7E 4282 clr.l d2 2473 002B80 4281 clr.l d1 2474 002B82 4280 clr.l d0 2475 002B84 4E90 jsr (a0) 2476 002B86 205F move.l (sp)+,a0 2477 002B88 4E90 jsr (a0) 2478 002B8A 4280 clr.l d0 2479 002B8C 4EB811C0 jsr signalevent 2480 002B90 60FE bra * 2481 * 2482 * Miscellaneous strings and texts 2483 * 2484 002B92 20 vdusetup dc.b ' ',bs,bs,esc,'G',esc,'3',esc,'x', 2484+ 002B93 20 esc,'l' 2485 002B9E 1B dc.b esc,'X',esc,'k',esc,'j',esc,'b',esc 2485+ 002B9F 58 ,'K',0 2486 002BA9 1B spyprom dc.b esc,'Y% ',esc,'KSpy>',0 2487 002BB4 1B spyline dc.b esc,'Y% ' 2488 002BB8 0A freshline dc.b nl,esc,'K',0 2489 002BBC 1B helpmess dc.b esc,'Y% ' 2490 002BC0 0A dc.b nl,esc,'K^Y Stop' 2491 002BD4 0A dc.b nl,esc,'KR Reload system 2491+ 002BD5 1B ' 2492 002BF1 0A dc.b nl,esc,'KX addr size eXamine store 2492+ 002BF2 1B (SPY)' 2493 002C14 0A dc.b nl,esc,'KC Continue free 2493+ 002C15 1B ly' 2494 002C33 0A dc.b nl,esc,'KB addr Continue to s 2494+ 002C34 1B pecified Breakpoint (PC)' 2495 002C68 0A dc.b nl,esc,'KS Execute next 2495+ 002C69 1B Single instruction' 2496 002C97 0A dc.b nl,esc,'KL num Continue to s 2496+ 002C98 1B pecified Line' 2497 002CC1 0A dc.b nl,esc,'KN Execute Next 2497+ 002CC2 1B statement' 2498 002CE7 0A dc.b nl,esc,'KP addr Protect (watc 2498+ 002CE8 1B h) specified longword' 2499 whatmess text 2500 protmess text <'Protege has changed'> 2501 fsdead string <'No ACK from filestore'> 2502 disast text 2503 002D67 20 sp10 dc.b ' ' 2504 sp8 text <' '> 2505 dmess text 2506 amess text 2507 srmess text 2508 linemess text <' Line '> 2509 pcmess text 2510 002D91 53 identity dc.b 'System: ' 2511 002D99 30 dc.b version>>20&15+'0' Motorola M68000 Assembler Basic Operating System for Fred-Machine Page 44 2512 002D9A 37 dc.b version>>16&15+'0' 2513 002D9B 2F dc.b '/' 2514 002D9C 30 dc.b version>>12&15+'0' 2515 002D9D 38 dc.b version>>8&15+'0' 2516 002D9E 2F dc.b '/' 2517 002D9F 38 dc.b version>>4&15+'0' 2518 002DA0 35 dc.b version&15+'0' 2519 text 2520 main string <'system:lfs.mob'> 2521 terminal string ':' 2522 end No faults and no warnings in this assembly.