Revert r44241, it is not needed, asr is logical right shift (new leftmost bit is...
[AROS.git] / arch / m68k-all / dos / bcpl.S
blobe608d6cc519b0b093f1b0e5ba000d378016ffae9
1 /*
2     Copyright © 1995-2009, The AROS Development Team. All rights reserved.
3     $Id$
5     Desc: BCPL stubs that call into Exec and Dos libraries.
6     Lang: english
7 */
8 #define DEBUG 0
9 #define BCPLSTRINGDEBUG 0
10 #include <aros/m68k/asm.h>
12 #include "bcpl.h"
14 #define BCPL(id,name)   .equ GV_##name, id
15 #include "bcpl.inc"
16 #undef BCPL
18     /* BCPL equivalents of JSR and RTS */
20     .text
21     .balign 2
22     .globl  BCPL_jsr  /* A5 */
23 BCPL_jsr:
24     move.l  %sp@+,%a3           /* Get return address from C stack */
25     movem.l %a1/%a3-%a4,-12(%a1,%d0.l)
26     adda.l  %d0,%a1             /* Move to next BCPL FP */
27     movem.l %d1-%d4,(%a1)       /* Save argument on BCPL FP */
28     jmp     (%a4)
29     bra.s   BCPL_jsr_mult       /* This MUST be at BCPL_jsr+0x10 */
30     bra.s   BCPL_jsr_divmod     /* This MUST be at BCPL_jsr+0x12 */
31 BCPL_jsr_mult:
32     /* Call out to GCC's __mulsi3 */
33     movem.l  %a0-%a1,%sp@-
34     move.l  %d2, %sp@-
35     move.l  %d1, %sp@-
36     jsr     __mulsi3
37     addq.l  #8,%sp
38     move.l  %d0, %d1
39     movem.l  %sp@+,%a0-%a1
40     rts
41 BCPL_jsr_divmod:
42     /* Call out to GCC's __divsi3 and __modsi3 */
43     movem.l  %a0-%a1,%sp@-
44     move.l  %d2, %sp@-
45     move.l  %d1, %sp@-
46     jsr     __modsi3
47     move.l  %d0, %d2
48     jsr     __divsi3
49     move.l  %d0, %d1
50     addq.l  #8, %sp
51     movem.l  %sp@+,%a0-%a1
52     rts
54     .globl  BCPL_rts  /* A6 */
55 BCPL_rts:
56     movem.l -12(%a1),%a1/%a3   /* Restore old BCPL FP and return address */
57     move.l  -4(%a1),%a4        /* Get old A4 */
58     jmp     (%a3)              /* Go back */
61 /* BCPL macros
62  */
63     .section .rodata
64 .LBCPL_format_trace:
65     .string  "BCPL %s, D1=%p D2=%p D3=%p D4=%p, GV %p\n"
66 .LBCPL_format_ret:
67     .string  "     %s, D1=%p\n"
68 .LBCPL_format_err:
69     .string  "     %s, D1=%p IoErr=%p\n"
71     /* For dummy functions */
72     .macro  BCPLd name
73     .section .rodata
74 99:
75     .string "\name"
76     .text
77     .balign 4
78     .globl  BCPL_\name
79 BCPL_\name:
80     /* Stash away pr_Result2 into the GV */
81     move.l  SysBase,%a0
82     move.l  %a0@(ThisTask),%a0
83     move.l  %a0@(pr_Result2),%d0
84     move.l  %d0,%a2@(GV_DEBUG_Result2)
85     sub.l   %a0,%a0
87     movem.l %d1/%a0-%a1,%sp@-
88     move.l  %a2,%sp@-
89     move.l  %d4,%sp@-
90     move.l  %d3,%sp@-
91     move.l  %d2,%sp@-
92     move.l  %d1,%sp@-
93     move.l  #99b,%sp@-
94     move.l  #.LBCPL_format_trace,%sp@-
95     jsr     bcpl_command_name
96     jsr     kprintf
97     lea.l   %sp@(7*4),%sp
98     movem.l %sp@+,%d1/%a0-%a1
99     clr.l   %d0         /* DOSFALSE */
100     .endm
102     .macro  BRTSd
103     /* Retrieve old pr_Result2 */
104     move.l  %a2@(GV_DEBUG_Result2), %d2
106     movem.l %d0/%a0-%a1,%sp@-
107     move.l  SysBase,%a0
108     move.l  %a0@(ThisTask),%a0
109     move.l  %a0@(pr_Result2),%a1
110     move.l  %a1,%sp@-
111     move.l  %d0,%sp@-
112     move.l  #99b,%sp@-
113     cmp.l   %sp@(8),%d2
114     beq.s   0f
115     move.l  #.LBCPL_format_err,%sp@-
116     bra.s   1f
118     move.l  #.LBCPL_format_ret,%sp@-
120     jsr     bcpl_command_name
121     jsr     kprintf
122     lea.l   %sp@(4*4),%sp
123     movem.l %sp@+,%d0/%a0-%a1
124     move.l  %d0,%d1
125     jmp     (%a6)
126     .endm
128     /* For real functions */
129     .macro  BCPLnd name
130     .balign 4
131     .globl  BCPL_\name
132 BCPL_\name:
133     .endm
135     .macro  BRTSnd
136     move.l  %d0,%d1
137     jmp     (%a6)
138     .endm
140 #if DEBUG
141 #define BCPL BCPLd
142 #define BRTS BRTSd
143 #else
144 #define BCPL BCPLnd
145 #define BRTS BRTSnd
146 #endif
148     /* Global vector table entries */
149 BCPLd sysRequest     /* -84, void, @line1, @line2, @line3 */
150     BRTS
152 BCPL toCStr          /* -80, char *, @string */
153     move.l  %d1,%d0
154     lsl.l   #2,%d0
155     addq.l  #1,%d0
156     BRTS
158 BCPL toBSTR         /* -7c, void, &src, @dest */
159     movem.l     %d1-%d2,%sp@-
160     lsl.l       #2,%d2
161     move.l      %d2,%d0
162     addq.l      #1,%d2
163     clr.b       %a0@(%d0)
165     move.b      %a0@(%d2),%a0@(%d1)
166     tst.b       %a0@(%d1)
167     beq         1f
168     addq.l      #1,%d1
169     addq.l      #1,%d2
170     addq.l      #2,%a0@(%d0)
171     jmp         0b
173     movem.l     %sp@+,%d1-%d2
174     BRTS
176 BCPL Execute        /* -6c, BOOL, &command, @input, @output */
177     movem.l     %a0-%a1/%a6,%sp@-
178     move.l      %a2@(GV_DOSBase),%a6
179     jsr         %a6@(37 * -6)   /* DOS/Execute() */
180     movem.l     %sp@+,%a0-%a1/%a6
181     BRTS
183 BCPL IsInteractive  /* -68, BOOL, @filehandle */
184     movem.l     %a0-%a1/%a6,%sp@-
185     move.l      %a2@(GV_DOSBase),%a6
186     jsr         %a6@(36 * -6)   /* DOS/IsInteractive() */
187     movem.l     %sp@+,%a0-%a1/%a6
188     BRTS
190 BCPL DateStamp      /* -64, timeval *, &time */
191     movem.l     %a0-%a1/%a6,%sp@-
192     move.l      %a2@(GV_DOSBase),%a6
193     jsr         %a6@(32 * -6)   /* DOS/DateStamp() */
194     movem.l     %sp@+,%a0-%a1/%a6
195     BRTS
197 BCPL SetProtection  /* -60, BOOL, &name, mask */
198     movem.l     %a0-%a1/%a6,%sp@-
199     move.l      %a2@(GV_DOSBase),%a6
200     jsr         %a6@(31 * -6)   /* DOS/SetProtection() */
201     movem.l     %sp@+,%a0-%a1/%a6
202     BRTS
204 BCPL SetComment     /* -5c, BOOL, &name, &comment */
205     movem.l     %a0-%a1/%a6,%sp@-
206     move.l      %a2@(GV_DOSBase),%a6
207     jsr         %a6@(30 * -6)   /* DOS/SetComment() */
208     movem.l     %sp@+,%a0-%a1/%a6
209     BRTS
211 BCPLd QueuePacket    /* -54, void */
212     BRTS
214 BCPL clearmem       /* -50, void, @buff, lw_length */
215     lsl.l       #2,%d1
216     bra         .Lclearmem_cond
218 .Lclearmem_loop:
219     clr.l       %a0@(%d1)
220     addq.l      #4,%d1
221 .Lclearmem_cond:
222     dbf         %d2,.Lclearmem_loop
224     BRTS
226 BCPL LoadSeg        /* -4c, SegList ^, &name */
227     movem.l     %a0-%a1/%a6,%sp@-
228     move.l      %a2@(GV_DOSBase),%a6
229     jsr         %a6@(25 * -6)   /* DOS/LoadSeg() */
230     movem.l     %sp@+,%a0-%a1/%a6
231     BRTS
233 BCPL CreateProc     /* -48, MessagePort *, &name, pri, seg, stackbytes */
234     movem.l     %a0-%a1/%a6,%sp@-
235     move.l      %a2@(GV_DOSBase),%a6
236     jsr         %a6@(23 * -6)   /* DOS/CreateProc() */
237     movem.l     %sp@+,%a0-%a1/%a6
238     BRTS
240 BCPL IoErr          /* -44, long */
241     movem.l     %a0-%a1/%a6,%sp@-
242     move.l      %a2@(GV_DOSBase),%a6
243     jsr         %a6@(22 * -6)   /* DOS/IoErr() */
244     movem.l     %sp@+,%a0-%a1/%a6
245     BRTS
247 BCPL CurrentDir     /* -40, FileLock ^, @FileLock */
248     movem.l     %a0-%a1/%a6,%sp@-
249     move.l      %a2@(GV_DOSBase),%a6
250     jsr         %a6@(21 * -6)   /* DOS/CurrentDir() */
251     movem.l     %sp@+,%a0-%a1/%a6
252     BRTS
254 BCPL CreateDir      /* -3c, FileLock ^, &name */
255     movem.l     %a0-%a1/%a6,%sp@-
256     move.l      %a2@(GV_DOSBase),%a6
257     jsr         %a6@(20 * -6)   /* DOS/CreateDir() */
258     movem.l     %sp@+,%a0-%a1/%a6
259     BRTS
261 BCPL Info           /* -38, BOOL, @FileLock, &InfoData */
262     movem.l     %a0-%a1/%a6,%sp@-
263     move.l      %a2@(GV_DOSBase),%a6
264     jsr         %a6@(19 * -6)   /* DOS/Info() */
265     movem.l     %sp@+,%a0-%a1/%a6
266     BRTS
268 BCPL ExNext         /* -34, BOOL, @FileLock, &FileInfo */
269     movem.l     %a0-%a1/%a6,%sp@-
270     move.l      %a2@(GV_DOSBase),%a6
271     jsr         %a6@(18 * -6)   /* DOS/ExNext() */
272     movem.l     %sp@+,%a0-%a1/%a6
273     BRTS
275 BCPL Examine        /* -30, BOOL, @FileLock, &FileInfo */
276     movem.l     %a0-%a1/%a6,%sp@-
277     move.l      %a2@(GV_DOSBase),%a6
278     jsr         %a6@(17 * -6)   /* DOS/Examine() */
279     movem.l     %sp@+,%a0-%a1/%a6
280     BRTS
282 BCPL Lock           /* -2c, FileLock ^, &name, mode */
283     movem.l     %a0-%a1/%a6,%sp@-
284     move.l      %a2@(GV_DOSBase),%a6
285     jsr         %a6@(14 * -6)   /* DOS/Lock() */
286     movem.l     %sp@+,%a0-%a1/%a6
287     BRTS
289 BCPL Rename         /* -28, BOOL, &oldname, &newname */
290     movem.l     %a0-%a1/%a6,%sp@-
291     move.l      %a2@(GV_DOSBase),%a6
292     jsr         %a6@(13 * -6)   /* DOS/Rename() */
293     movem.l     %sp@+,%a0-%a1/%a6
294     BRTS
296 BCPL DeleteFile     /* -24, BOOL, &name */
297     movem.l     %a0-%a1/%a6,%sp@-
298     move.l      %a2@(GV_DOSBase),%a6
299     jsr         %a6@(12 * -6)   /* DOS/DeleteFile() */
300     movem.l     %sp@+,%a0-%a1/%a6
301     BRTS
303 BCPL Seek           /* -20, LONG, @FileHandle, pos, mode */
304     movem.l     %a0-%a1/%a6,%sp@-
305     move.l      %a2@(GV_DOSBase),%a6
306     jsr         %a6@(11 * -6)   /* DOS/Seek() */
307     movem.l     %sp@+,%a0-%a1/%a6
308     BRTS
310 BCPL Write          /* -18, LONG, Write, @FileHandle, &buf, len */
311     movem.l     %a0-%a1/%a6,%sp@-
312     move.l      %a2@(GV_DOSBase),%a6
313     jsr         %a6@(8 * -6)    /* DOS/Write() */
314     movem.l     %sp@+,%a0-%a1/%a6
315     BRTS
317 BCPL Read           /* -0c, LONG, Read, @FileHandle, &buf, len */
318     movem.l     %a0-%a1/%a6,%sp@-
319     move.l      %a2@(GV_DOSBase),%a6
320     jsr         %a6@(7 * -6)    /* DOS/Read() */
321     movem.l     %sp@+,%a0-%a1/%a6
322     BRTS
324 BCPL memcpy        /* -08, void, @src, @dest, n */
325     movem.l     %d2-%d3/%a0-%a1,%sp@-
326         lsl.l   #2,%d1
327         move.l  %d1,%a0
328         lsl.l   #2,%d2
329         move.l  %d2,%a1
330 .copyloop:
331         subq.l  #1,%d3
332         bmi.s   .copydone
333         move.l  %a0@+,%a1@+
334         bra.s   .copyloop
335 .copydone:
336     movem.l     %sp@+,%d2-%d3/%a0-%a1
337     BRTS
339 BCPL Open           /* -04, FileHandle ^, &name, mode */
340     movem.l     %a0-%a1/%a6,%sp@-
342 #if BCPLSTRINGDEBUG
343     move.l      %d1,%d0
344         bsr             bstr_debug
345 #endif
347     move.l      %a2@(GV_DOSBase),%a6
348     jsr         %a6@(5 * -6)    /* DOS/Open() */
349     movem.l     %sp@+,%a0-%a1/%a6
350     BRTS
352                      /* 4, void main */
353 BCPL Entry
354     jsr         BCPL_RunHandler
355     /* FALLTHROUGH to BCPL_Exit */
357 BCPL Exit            /*  08, void, code */
358     move.l      SysBase,%a6
359     sub.l       %a1,%a1
360     move.l      %d1,%d2
361     jsr         %a6@(FindTask)
362     move.l      %d0,%a0
363     move.l      %a0@(pr_ReturnAddr),%a0
364     lea.l       %a0@(-4),%sp
365     move.l      %d2,%d0
366     rts
368 BCPL multiply       /*  0c, D1 = D1 * D2 */
369     jsr %a5@(0x10)
370     BRTS
372 BCPL divide         /*  10, D1 = D1 / D2 */
373     jsr %a5@(0x12)
374     move.l      %a1@(4),%d2
375     BRTS
377 BCPL mod            /*  14, D1 = D1 % D2 */
378     jsr %a5@(0x12)
379     move.l      %d2,%d0 /* BRTS does move.l %d0,%d1 */
380     move.l      %a1@(4),%d2
381     BRTS
383 BCPL setIO          /*  18, void, @IOStdReq, command, &data, len, offset */
384     lsl.l       #2,%d1
385     move.w      %d2,%a0@(28,%d1)
386     move.l      %d3,%d0
387     lsl.l       #2,%d0
388     move.l      %d0,%a0@(40,%d1)
389     move.l      %d4,%a0@(36,%d1)
390     /* only first 4 params are in registers */
391     move.l      %a1@(4*4),%a0@(44,%d1)
392     BRTS
394 BCPLd packlw         /*  20, ?? */
395     BRTS
397 BCPLd unpacklw       /*  24, ?? */
398     BRTS
400 BCPL Res2           /*  28, LONG, is_set_flag, result_code */
401     movem.l     %a0-%a1/%a6,%sp@-
402     move.l      %a2@(GV_DOSBase),%a6
403     tst.l       %d1
404     beq         .LRes2_get
405 .LRes2_set:
406     move.l      %d2,%d1
407     jsr         %a6@(77 * -6) /* DOS/SetIoErr */
408 .LRes2_get:
409     jsr         %a6@(22 * -6) /* DOS/IoErr */
410     movem.l     %sp@+,%a0-%a1/%a6
411     BRTS
413                      /*  30, BCPL_FrameLower */
415 BCPLd makeGVarea     /*  34, void, @buff */
416     BRTS
418 BCPL findtask        /*  38, &Process->MsgPort *, */
419     movem.l     %a0-%a1/%a6,%sp@-
420     move.l      SysBase,%a6
421     sub.l       %a1,%a1
422     jsr         %a6@(FindTask)
423     add.l       #92,%d0 /* point to &MsgPort */
424     movem.l     %sp@+,%a0-%a1/%a6
425     BRTS
427 BCPLd getbyte        /*  3c, BYTE, @lw_addr, bytenum */
428     BRTS
430 BCPLd putbyte        /*  40, BYTE, @lw_addr, bytenum, byte */
431     BRTS
433 BCPL level          /*  44, LONG (or BPTR?) */
434     move.l  %a1@(-12),%d0  /* Return caller's BCPL frame */
435     BRTS
437 BCPL longcall       /*  48, LONG, level, label */
438     move.l      %d1,%a1
439     move.l      %a1@(-4),%a4
440     jmp         %a0@(%d2.l)
442 BCPL allocMem       /*  4c, BPTR, lwlength, reqs */
443     movem.l     %a0-%a1/%a6,%sp@-
444     move.l      SysBase,%a6
445     move.l      %d1,%d0
446     addq.l      #4,%d0         /* 4 additional words for padding */
447     lsl.l       #2,%d0
448     move.l      %d2,%d1
449     bset.l      #16,%d1        /* MEMF_CLEAR */
450     jsr         %a6@(114 * -6) /* Exec/AllocVec() */
451     lsr.l       #2,%d0
452     movem.l     %sp@+,%a0-%a1/%a6
453     BRTS
455 BCPLd longjump       /*  50, LONG, label */
456     BRTS
458 BCPL doIO           /*  54, LONG, @IORequest */
459     movem.l     %a0-%a1/%a6,%sp@-
460     move.l      SysBase,%a6
461     lsl.l       #2,%d1
462     move.l      %d1,%a1
463     jsr         %a6@(76 * -6)   /* Exec/DoIO() */
464     ext.w       %d0
465     ext.l       %d0
466     movem.l     %sp@+,%a0-%a1/%a6
467     BRTS
469 BCPL sendIO         /*  58, void, @IORequest */
470     movem.l     %a0-%a1/%a6,%sp@-
471     lsl.l       #2,%d1
472     moveq.l     #0,%d2
473     move.l      %d2,%a0@(ln_Name,%d1)    /* NULL dos packet */
474     move.l      %d1, %a1
475     move.l      SysBase,%a6
476     jsr         %a6@(77 * -6)   /* Exec/SendIO */
477     movem.l     %sp@+,%a0-%a1/%a6
478     BRTS
480     /* Coroutine support:
481      * struct coroutine {
482      *      BPTR colist;
483      *      BPTR parent;
484      *      APTR frame;
485      *      APTR procedure;
486      */
487 BCPLd createco       /*  5c, void, @coroutine, lwlength */
488     BRTS
490 BCPLd deleteco       /*  60, void, @coroutine */
491     BRTS
493 BCPLd callco         /*  64, void, @coroutine, arg */
494     BRTS
496 BCPLd cowait         /*  68, void, result */
497     BRTS
499 BCPLd resumeco       /*  6c, void, @coroutine */
500     BRTS
502 BCPL installSeg     /*  70, BOOL, @memseg_BCPL */
503     movem.l     %a0-%a1,%sp@-
504     move.l      %a2,%sp@-
505     move.l      %d1,%sp@-
506     jsr         BCPL_InstallSeg
507     addq.l      #8,%sp
508     movem.l     %sp@+,%a0-%a1
509     BRTS
511 BCPL getvec         /*  74, LONG ^, lw_length */
512     movem.l     %a0-%a1/%a6,%sp@-
513     move.l      SysBase,%a6
514     move.l      %d1,%d0
515     addq.l      #4,%d0         /* 4 additional words for padding */
516     lsl.l       #2,%d0
517     moveq       #1,%d1
518     bset.l      #16,%d1        /* MEMF_CLEAR */
519     jsr         %a6@(114 * -6) /* Exec/AllocVec() */
520     lsr.l       #2,%d0
521     movem.l     %sp@+,%a0-%a1/%a6
522     BRTS
524 BCPL freevec        /*  78, void, @vec */
525     movem.l     %a0-%a1/%a6,%sp@-
526     move.l      SysBase,%a6
527     lsl.l       #2,%d1
528     move.l      %d1,%a1
529     jsr         %a6@(115 * -6) /* Exec/FreeVec() */
530     movem.l     %sp@+,%a0-%a1/%a6
531     BRTS
533 BCPL openDevice     /*  7c, BOOL, @IORequest, @name, unit, flags */
534     movem.l     %d5/%a0-%a1/%a6,%sp@-
535     move.l      SysBase,%a6
537 #if BCPLSTRINGDEBUG
538     move.l      %d2,%d0
539         bsr             bstr_debug
540 #endif
542     lsl.l       #2,%d1
543     move.l      %d1,%d5
545     sub.l       %a1,%a1
546     jsr         %a6@(FindTask)
547     
548     lsl.l       #2,%d2
549     addq.l      #1,%d2
550     move.l      %d2,%a0
551     move.l      %d5,%a1
552     add.l       #92,%d0
553     move.l      %d0,%a1@(14)    /* replyport = &Process->pr_MsgPort */
554     move.l      %d4,%d1
555     move.l      %d3,%d0
556     jsr         %a6@(74 * -6)   /* Exec/OpenDevice() */
557     moveq       #-1,%d1
558     tst.b       %d0
559     beq.s       od_ok
560     moveq       #0,%d1
561 od_ok:
562         move.l  %d1,%d0
563     movem.l     %sp@+,%d5/%a0-%a1/%a6
564     BRTS
566 BCPL closeDevice    /*  80, void, @IORequest */
567     movem.l     %a0-%a1/%a6,%sp@-
568     move.l      SysBase,%a6
569     lsl.l       #2,%d1
570     move.l      %d1,%a1
571     jsr         %a6@(75 * -6)   /* Exec/CloseDevice() */
572     movem.l     %sp@+,%a0-%a1/%a6
573     BRTS
575 BCPL createProcBCPL     /*  84, MessagePort *, @segarray, lw_stack_size, pri, @name,  */
576     movem.l     %a0-%a1/%a6,%sp@-
577     move.l      %a2@(GV_DOSBase),%a6
579     move.l      %d3,%sp@-
580     lsl.l       #2,%d2
581     move.l      %d2,%sp@-
582     lsl.l       #2,%d1
583     move.l      %d1,%sp@-
584     move.l      %d4,%d1
585     moveq.l     #4, %d0
586     bsr         bstr_to_cstr
587     move.l      %d1,%sp@-
588     move.l      %a6,%sp@-
589     jsr         BCPL_CreateProcBCPL
590     lea.l       %sp@(5 * 4),%sp
591     movem.l     %sp@+,%a0-%a1/%a6
592     BRTS
594 BCPL remProcess     /*  88, void */
595     jmp BCPL_Exit       /* TODO: Review if this is correct */
597 BCPL ParentDir      /*  8c, FileLock ^, @FileLock */
598     movem.l     %a0-%a1/%a6,%sp@-
599     move.l      %a2@(GV_DOSBase),%a6
600     jsr         %a6@(35 * -6)   /* DOS/ParentDir() */
601     movem.l     %sp@+,%a0-%a1/%a6
602     BRTS
604 BCPL setSignals     /*  90, void, &MsgPort, mask */
605     movem.l     %a0-%a1/%a6,%sp@-
606     move.l      SysBase,%a6
607     add.l       #mp_SigTask,%d1
608     move.l      %a0@(%d1),%a1
609     move.l      %d2,%d0
610     lsl.l       #8,%d0
611     lsl.l       #4,%d0                  /* shift to C-F signals */
612     and.l       #0xf000,%d0             /* mask only C-F signals */
613     jsr         %a6@(54 * -6)   /* Signal */
614     movem.l     %sp@+,%a0-%a1/%a6
615     BRTS
617 BCPL clearSignals   /* 94, BOOL , mask */
618     movem.l     %d2/%a0-%a1/%a6,%sp@-
619     move.l      SysBase,%a6
620     clr.l       %d0
621     lsl.l       #8,%d1
622     lsl.l       #4,%d1
623     and.l       #0xf000,%d1
624     move.l      %d1,%d2
625     jsr         %a6@(51 * -6)   /* SetSignal */
626     moveq       #0,%d1
627     and.l       %d2,%d0
628     beq.s       0f
629     moveq       #-1,%d1
630 0:      move.l  %d1,%d0
631     movem.l     %sp@+,%d2/%a0-%a1/%a6
632     BRTS
634 BCPL DOSAlert       /* 98, void, alertnumber */
635     movem.l     %d7/%a0-%a1/%a6,%sp@-
636     move.l      SysBase,%a6
637     move.l      %d1,%d7
638     jsr         %a6@(18 * -6)   /* Exec/Alert() */
639     movem.l     %sp@+,%d7/%a0-%a1/%a6
640     BRTS
642 BCPL findRootNode   /* 9c, RootNode @,  */
643     move.l      %a2@(GV_DOSBase),%d0
644     add.l       #dl_Root,%d0
645     move.l      %a0@(%d0),%d0   /* %a0 is always 0 in BCPL */
646     lsr.l       #2,%d0
647     BRTS
649 BCPL readinput      /* a0, bytelength , &buf, bytelength */
650     movem.l     %d1-%d3/%a0-%a1/%a6,%sp@-
651     move.l      %a2@(GV_DOSBase),%a6
652     move.l      %d2,%d3
653     move.l      %d1,%d2
654     jsr         %a6@(9 * -6)    /* DOS/Input() */
655     move.l      %d0,%d1
656     jsr         %a6@(7 * -6)    /* DOS/Read() */
657     movem.l     %sp@+,%d1-%d3/%a0-%a1/%a6
658     BRTS
660     /* Wait on the process's pr_MsgPort for a packet.
661      */
662 BCPL taskwait       /* a4, DosPacket @,  */
663     movem.l     %a0-%a1/%a6,%sp@-
664     move.l      %a2@(GV_DOSBase),%a6
665     jsr         %a6@(42 * -6)   /* Dos/WaitPkt() */
666     lsr.l       #2,%d0
667     movem.l     %sp@+,%a0-%a1/%a6
668     BRTS
670     /* When passed in, DosPacket's dp_Link points to
671      * an allocated, but empty, memory location. 
672      * Sent to the port of the current directory's handler.
673      */
674 BCPL putPkt         /* a8, void, @DosPacket */
675     movem.l     %a0-%a1/%a6,%sp@-
676     move.l      %a2@(GV_DOSBase),%a6
677     jsr         Dos_BCPL_putpkt
678     movem.l     %sp@+,%a0-%a1/%a6
679     BRTS
681 BCPL writeoutput    /* ac, void, &buf, bytelength */
682     movem.l     %d2-%d3/%a0-%a1/%a6,%sp@-
683     move.l      %a2@(GV_DOSBase),%a6
684     move.l      %d2,%d3
685     move.l      %d1,%d2
686     jsr         %a6@(10 * -6)   /* DOS/Output() */
687     move.l      %d0,%d1
688     jsr         %a6@(8 * -6)    /* DOS/Write() */
689     movem.l     %sp@+,%d2-%d3/%a0-%a1/%a6
690     BRTS
692     /* copy src LONG array to destination, LONG -> BYTE */
693 BCPL packstring     /* b0, long, @Array, @String */
694     movem.l     %d2-%d3/%a0-%a1,%sp@-
695 #if BCPLSTRINGDEBUG
696     move.l      %d2,%d3
697 #endif
698     lsl.l       #2,%d1
699     move.l      %d1,%a0
700     lsl.l       #2,%d2
701     move.l      %d2,%a1
702     moveq       #0,%d2
703     move.b      (3,%a0),%d2
704     move.l      %d2,%d0
705     lsr.w       #2,%d0
706 1:  move.l      (%a0)+,%d1
707     move.b      %d1,(%a1)+
708     dbf         %d2,1b
710 #if BCPLSTRINGDEBUG
711         move.l  %d0,%d2
712     move.l      %d3,%d0
713     bsr         bstr_debug
714     move.l      %d2,%d0
715 #endif
717     movem.l     %sp@+,%d2-%d3/%a0-%a1
718     BRTS
720     /* copy src BSTR to destination array, BYTE -> LONG */
721 BCPL unpackstring   /* b4, void, @String, @Array */
722     movem.l     %a0-%a1,%sp@-
724 #if BCPLSTRINGDEBUG
725     move.l      %d1,%d0
726     bsr         bstr_debug
727 #endif
729     lsl.l       #2,%d1
730     move.l      %d1,%a0
731     lsl.l       #2,%d2
732     move.l      %d2,%a1
733     moveq       #0,%d0
734     move.b      (%a0),%d0
735     moveq       #0,%d1
736 1:  move.b      (%a0)+,%d1
737     move.l      %d1,(%a1)+
738     dbf         %d0,1b
739     movem.l     %sp@+,%a0-%a1
740     BRTS
742 BCPLd holdTask       /* b8, void, @memseg */
743     BRTS
745 BCPL Delay          /* bc, void, ticks */
746     movem.l     %a0-%a1/%a6,%sp@-
747     move.l      %a2@(GV_DOSBase),%a6
748     jsr         %a6@(33 * -6)   /* DOS/Delay() */
749     movem.l     %sp@+,%a0-%a1/%a6
750     BRTS
752     /* Call the DOS internal 'dopacket' function
753      */
754 BCPL sendPacket     /* c0, BOOL, -, MsgPort, Type, -, -, Arg1,... */
755     movem.l     %a0-%a1/%a6,%sp@-
756     move.l      %a1@((4 + 7) * 4), %sp@-        /* Arg7 */
757     move.l      %a1@((4 + 6) * 4), %sp@-        /* Arg6 */
758     move.l      %a1@((4 + 5) * 4), %sp@-        /* Arg5 */
759     move.l      %a1@((4 + 4) * 4), %sp@-        /* Arg4 */
760     move.l      %a1@((4 + 3) * 4), %sp@-        /* Arg3 */
761     move.l      %a1@((4 + 2) * 4), %sp@-        /* Arg2 */
762     move.l      %a1@((4 + 1) * 4), %sp@-        /* Arg1 */
763     move.l      %d3, %sp@-                      /* Type */
764     move.l      %d2, %sp@-                      /* Port */
765     move.l      %a0, %sp@-                      /* A0 is still 0 */
766     jsr         dopacket
767     lea.l       %sp@(10 * 4), %sp
768     movem.l     %sp@+,%a0-%a1/%a6
769     BRTS
771 BCPL returnPacket   /* c4, void, @DosPacket, res1, res2 */
772     tst.l       %d1     /* Don't try to reply NULL Dos Packets */
773     beq.s       0f
774     movem.l     %a0-%a1/%a6,%sp@-
775     move.l      %a2@(GV_DOSBase),%a6
776     lsl.l       #2, %d1
777     jsr         %a6@(43 * -6)   /* DOS/ReplyPkt() */
778     movem.l     %sp@+,%a0-%a1/%a6
780     BRTS
782 #define TAG_END 0
783 #define TAG_USER        (1 << 31)
784 #define WA_Dummy        (TAG_USER + 99)
785 #define WA_Left         (WA_Dummy + 1)
786 #define WA_Top          (WA_Dummy + 2)
787 #define WA_Width        (WA_Dummy + 3)
788 #define WA_Height       (WA_Dummy + 4)
789 #define WA_Title        (WA_Dummy + 11)
790 #define WA_PubScreen    (WA_Dummy + 22)
791 #define WA_AutoAdjust   (WA_Dummy + 45)
793 BCPL openWindow     /* c8, struct Window *, leftedge, topedge, width, height, @title */
794         movem.l %a0-%a1/%a6,%sp@-
795         move.l  %a2@(GV_DOSBase),%a6
796         move.l  %a6@(dl_IntuitionBase),%a6
797         move.l  #TAG_END, %sp@-
798         move.l  #-1, %sp@-
799         move.l  #WA_AutoAdjust, %sp@-
800         move.l  %a0, %sp@-
801         move.l  #WA_PubScreen, %sp@-
802         move.l  %a1@(4*4),%sp@-
803         move.l  #WA_Title, %sp@-
804         move.l  %d4, %sp@-
805         move.l  #WA_Height, %sp@-
806         move.l  %d3, %sp@-
807         move.l  #WA_Width, %sp@-
808         move.l  %d2, %sp@-
809         move.l  #WA_Top, %sp@-
810         move.l  %d1, %sp@-
811         move.l  #WA_Left, %sp@-
812         move.l  %sp, %a1                        /* a0 is still 0 here */
813         jsr             %a6@(101 * -6)          /* OpenWindowTagList */
814         lea.l   %sp@(15 * 4),%sp
815         movem.l %sp@+,%a0-%a1/%a6
816     BRTS
818     /* If BOOL is DOSTRUE, set current directory
819      * Always return old current directory
820      */
821 BCPL setCurrentDir  /* cc, FileLock @, BOOL, @FileLock */
822     movem.l     %d3-%d4/%a0-%a1/%a6,%sp@-
824         move.l  %d1,%d3
826     move.l      SysBase,%a6
827     sub.l       %a1,%a1
828     jsr         %a6@(FindTask)
829     move.l      %d0,%a0
830     /* sanity check in CurrentDir() complained so I did this */
831     move.l      %a0@(152),%d4   /* pr_CurrentDir */
833     tst.l       %d3
834     beq.s       0f
836     move.l      %a2@(GV_DOSBase),%a6
837     move.l      %d2,%d1
838     jsr         %a6@(21 * -6)   /* DOS/CurrentDir() */
840         move.l  %d4,%d0
841     movem.l     %sp@+,%d3-%d4/%a0-%a1/%a6
842     BRTS
844 BCPLd systemRequest  /* d0, void, @line1, @line2, @line3 */
845     BRTS
847 BCPL writet         /* d4, void, @string, n */
848     movem.l     %d2-%d4,%sp@-
849     move.l      %d1, %d3
850     lsl.l       #2, %d3         /* D3 = BADDR(string) */
851     clr.l       %d4
852     move.b      %a0@(%d3),%d4   /* D4 = string[0] (strlen) */
853     tst.l       %d4
854     beq         .LBCPL_writet_pad
856     bra         .LBCPL_writet_loop_cond
858 .LBCPL_writet_loop:
859     addq.l      #1,%d3          /* D3 = pointer to next char */
860     subq.l      #1,%d2          /* D2 = reduce pad amount by 1 */
861     move.l      #(3*4 + 1*4),%d0
862     clr.l       %d1
863     move.b      %a0@(%d3),%d1   /* D1 = next char */
864     move.l      %a2@(GV_wrch), %a4
865     jsr         (%a5)
866 .LBCPL_writet_loop_cond:
867     dbf         %d4,.LBCPL_writet_loop
869 .LBCPL_writet_pad:
870     tst.l       %d2
871     ble         .LBCPL_writet_exit
872     bra         .LBCPL_writet_pad_cond
874 .LBCPL_writet_pad_loop:
875     move.l      #(3*4 + 2*4),%d0
876     moveq.l     #' ',%d1
877     move.l      %a2@(GV_wrch), %a4
878     jsr         (%a5)
879 .LBCPL_writet_pad_cond:
880     dbf         %d2,.LBCPL_writet_pad_loop
882 .LBCPL_writet_exit:
883     movem.l     %sp@+,%d2-%d4
884     BRTS
886 BCPLnd rdch           /* d8, char ,  */
887     movem.l     %a0-%a1/%a6,%sp@-
888     move.l      %a2@(GV_DOSBase),%a6
889     jsr         %a6@(9 * -6)    /* DOS/Input() */
890     move.l      %d0, %d1
891     jsr         %a6@(51 * -6)   /* DOS/FGetC() */
892     movem.l     %sp@+,%a0-%a1/%a6
893     BRTSnd
895 BCPL unrdch         /* dc, void,  */
896     movem.l     %d2/%a0-%a1/%a6,%sp@-
897     move.l      %a2@(GV_DOSBase),%a6
898     jsr         %a6@(9 * -6)    /* DOS/Input() */
899     move.l      %d0, %d1
900     moveq       #-1,%d2
901     jsr         %a6@(53 * -6)   /* DOS/UnGetC() */
902     movem.l     %sp@+,%d2/%a0-%a1/%a6
903     BRTS
905 BCPLnd wrch           /* e0, void, char */
906     movem.l     %d2/%a0-%a1/%a6,%sp@-
907     move.l      %a2@(GV_DOSBase),%a6
908     move.l      %d1, %d2
909     jsr         %a6@(10 * -6)   /* DOS/Output() */
910     move.l      %d0, %d1
911     jsr         %a6@(52 * -6)   /* DOS/FPutC() */
912     movem.l     %sp@+,%d2/%a0-%a1/%a6
913     BRTSnd
915 BCPL readinput_long   /* e4, lwlength , @buf, lwlength */
916     movem.l     %d1-%d3/%a0-%a1/%a6,%sp@-
917     move.l      %a2@(GV_DOSBase),%a6
918     move.l      %d2,%d3
919     move.l      %d1,%d2
920     jsr         %a6@(9 * -6)    /* DOS/Input() */
921     move.l      %d0,%d1
922     lsl.l       #2,%d2
923     lsl.l       #2,%d3
924     jsr         %a6@(7 * -6)    /* DOS/Read() */
925     asr.l       #2,%d0
926     movem.l     %sp@+,%d1-%d3/%a0-%a1/%a6
927     BRTS
929 BCPL writeoutput_long /* e8, void, @buf, lwlength */
930     movem.l     %d2-%d4/%a0-%a1/%a6,%sp@-
931     move.l      %a2@(GV_DOSBase),%a6
932     move.l      %d2, %d4        /* Num blocks */
933     moveq.l     #4, %d3         /* Block len (sizeof(ULONG)) */
934     move.l      %d1, %d2        /* Buffer */
935     lsl.l       #2, %d2
936     jsr         %a6@(10 * -6)   /* DOS/Output() */
937     move.l      %d0, %d1        /* Outfile */
938     jsr         %a6@(55 * -6)   /* DOS/FWrite() */
939     movem.l     %sp@+,%d2-%d4/%a0-%a1/%a6
940     BRTS
942 BCPL findinput      /* ec, FileHandle ^, @name */
943     movem.l     %d2/%a0-%a1/%a6,%sp@-
945 #if BCPLSTRINGDEBUG
946     move.l      %d1,%d0
947     bsr         bstr_debug
948 #endif
950     moveq.l     #1, %d0
951     bsr         bstr_to_cstr
953     move.l      %a2@(GV_DOSBase),%a6
954     move.l      #1005 /* MODE_OLDFILE */,%d2
955     jsr         %a6@(5 * -6)    /* DOS/Open() */
956     movem.l     %sp@+,%d2/%a0-%a1/%a6
957     BRTS
959 BCPL findoutput     /* f0, FileHandle ^, @name */
960     movem.l     %d2/%a0-%a1/%a6,%sp@-
961   
962 #if BCPLSTRINGDEBUG
963     move.l      %d1,%d0
964     bsr         bstr_debug
965 #endif
967     moveq.l     #1, %d0
968     bsr         bstr_to_cstr
970     move.l      %a2@(GV_DOSBase),%a6
971     move.l      #1006 /* MODE_NEWFILE */,%d2
972     jsr         %a6@(5 * -6)    /* DOS/Open() */
973     movem.l     %sp@+,%d2/%a0-%a1/%a6
974     BRTS
976 BCPL SelectInput    /* f4, void , @FileHandle */
977     movem.l     %a0-%a1/%a6,%sp@-
978     move.l      %a2@(GV_DOSBase),%a6
979     jsr         %a6@(49 * -6)   /* DOS/SelectInput() */
980     movem.l     %sp@+,%a0-%a1/%a6
981     BRTS
983 BCPL SelectOutput   /* f8, void , @FileHandle */
984     movem.l     %a0-%a1/%a6,%sp@-
985     move.l      %a2@(GV_DOSBase),%a6
986     jsr         %a6@(50 * -6)   /* DOS/SelectOutput() */
987     movem.l     %sp@+,%a0-%a1/%a6
988     BRTS
990 BCPL endread        /* fc, void,  */
991     movem.l     %a0-%a1/%a6,%sp@-
992     move.l      %a2@(GV_DOSBase),%a6
993     jsr         %a6@(9 * -6)    /* DOS/Input() */
994     move.l      %d0,%d1
995     jsr         %a6@(6 * -6)    /* DOS/Close() */
996     moveq.l     #0,%d1
997     jsr         %a6@(49 * -6)   /* DOS/SelectInput() */
998     movem.l     %sp@+,%a0-%a1/%a6
999     BRTS
1001 BCPL endwrite       /* 100, void,  */
1002     movem.l     %a0-%a1/%a6,%sp@-
1003     move.l      %a2@(GV_DOSBase),%a6
1004     jsr         %a6@(10 * -6)   /* DOS/Output() */
1005     move.l      %d0,%d1
1006     jsr         %a6@(6 * -6)    /* DOS/Close() */
1007     moveq.l     #0,%d1
1008     jsr         %a6@(50 * -6)   /* DOS/SelectOutput() */
1009     movem.l     %sp@+,%a0-%a1/%a6
1010     BRTS
1012 BCPL Input          /* 104, FileHandle @,  */
1013     movem.l     %a0-%a1/%a6,%sp@-
1014     move.l      %a2@(GV_DOSBase),%a6
1015     jsr         %a6@(9 * -6)    /* DOS/Input() */
1016     movem.l     %sp@+,%a0-%a1/%a6
1017     BRTS
1019 BCPL Output         /* 108, FileHandle @,  */
1020     movem.l     %a0-%a1/%a6,%sp@-
1021     move.l      %a2@(GV_DOSBase),%a6
1022     jsr         %a6@(10 * -6)   /* DOS/Output() */
1023     movem.l     %sp@+,%a0-%a1/%a6
1024     BRTS
1026 BCPLd readn          /* 10c, void,  */
1027     BRTS
1029 BCPL newline        /* 110, void,  */
1030     moveq.l     #'\n',%d1
1031     jmp         BCPL_wrch
1033 BCPL_write_base:        /* number, width, base, canneg */
1034     movem.l     %d2-%d7,%sp@-
1036     move.l      %d3,%d6         /* D6 = base */
1037     move.l      %d2,%d5         /* D5 = width */
1038     move.l      %d1,%d3         /* D3 = Number */
1039     moveq       #0,%d7
1041     tst.l       %d4
1042     beq         .Lwrite_base_pos
1044     tst.l       %d3             /* Number < 0? */
1045     bge         .Lwrite_base_pos
1047     bset        #31,%d7 /* D7 bit 31 = negative sign needed */
1048     neg.l       %d3
1049     subq.l      #1,%d5
1051 .Lwrite_base_pos:
1052     clr.l       %d4             /* D4 = Digit */
1053     clr.w       %d7             /* D7 = Num pushed chars */
1055 .Lwrite_base_loop:
1056     move.l      %d3,%d1
1057     move.l      %d6,%d2
1058     jsr         %a5@(0x12)      /* divmod: D1 = D3/base, D2 = D3 % base */
1059     move.l      %d1, %d3
1061     /* Push char */
1062     move.l      %d2, %d1
1063     cmp.b       #10, %d1
1064     blt         0f
1065     add.b       #(('A'-10)-'0'),%d1
1067     add.b       #'0',%d1        /* D1 = '0' .. '9' */
1068     move.b      %d1, %a1@(3*4 + 4*4, %d7.w)
1069     addq.w      #1, %d7
1070     subq.l      #1, %d5
1071     tst.l       %d3
1072     bgt.s       .Lwrite_base_loop
1074     /* Any extra field bits? */
1075     bra         .LBCPL_write_base_pad_cond
1076 .LBCPL_write_base_pad:
1077     moveq       #' ',%d1
1078     cmp.b       #10,%d6
1079     beq.s       .LBCPL_write_base_pad_char
1080     moveq       #'0',%d1
1081 .LBCPL_write_base_pad_char:
1082     move.l      #(3*4 + 4*4 + 8*4), %d0
1083     move.l      %a2@(GV_wrch), %a4
1084     jsr         (%a5)
1085 .LBCPL_write_base_pad_cond:
1086     subq.l      #1,%d5
1087     bpl.s       .LBCPL_write_base_pad
1089         btst    #31,%d7
1090         beq.s   .Lwrite_base_emit
1091     /* Negative sign */
1092     move.l      #'-',%d1
1093     move.l      #(3*4 + 4*4 + 8*4), %d0
1094     move.l      %a2@(GV_wrch), %a4
1095     jsr         (%a5)
1097     /* Write chars */
1098 .Lwrite_base_emit:
1099     subq.w      #1, %d7
1100     bmi.s       0f
1101     clr.l       %d1
1102     move.b      %a1@(3*4 + 4*4, %d7.w),%d1
1103     move.l      #(3*4 + 4*4 + 8*4), %d0
1104     move.l      %a2@(GV_wrch), %a4
1105     jsr         (%a5)
1106     jmp         .Lwrite_base_emit
1109     movem.l     %sp@+,%d2-%d7
1110     BRTS
1112 BCPL writei         /* 114, void, number, width */
1113     movem.l     %d3-%d4,%sp@-
1115     move.l      #(3*4 + 2*4), %d0
1116     move.l      #10,%d3
1117     move.l      #-1,%d4
1118     lea.l       BCPL_write_base, %a4
1119     jsr         (%a5)
1121     movem.l     %sp@+,%d3-%d4
1122     BRTS
1124 BCPL writen         /* 118, void, number */
1125     movem.l     %d2-%d4,%sp@-
1127     move.l      #(3*4 + 1*4), %d0
1128     clr.l       %d2
1129     move.l      #10,%d3
1130     move.l      #-1,%d4
1131     lea.l       BCPL_write_base, %a4
1132     jsr         (%a5)
1134     movem.l     %sp@+,%d2-%d4
1135     BRTS
1137 BCPL writehex       /* 11c, void, number, width */
1138     movem.l     %d3-%d4,%sp@-
1140     move.l      #(3*4 + 2*4), %d0
1141     move.l      #16,%d3
1142     clr.l       %d4
1143     lea.l       BCPL_write_base, %a4
1144     jsr         (%a5)
1146     movem.l     %sp@+,%d3-%d4
1147     BRTS
1149 BCPL writeoct       /* 120, void, number, width */
1150     movem.l     %d3-%d4,%sp@-
1152     move.l      #(3*4 + 2*4), %d0
1153     move.l      #8,%d3
1154     clr.l       %d4
1155     lea.l       BCPL_write_base, %a4
1156     jsr         (%a5)
1158     movem.l     %sp@+,%d3-%d4
1159     BRTS
1161 BCPL writes         /* 124, void, @string */
1162     move.l      %d2,%sp@-
1163     clr.l       %d2
1164     move.l      #(3*4 + 1*4),%d0
1165     move.l      %a2@(GV_writet), %a4
1166     jsr         (%a5)
1167     move.l      %sp@+,%d2
1168     BRTS
1170 #if 0 /* This is defined in bcpl_writef.S */
1171 BCPLd writef         /* 128, void, @format, arg1, arg2, ... */
1172     BRTS
1173 #endif
1175 BCPL toupper        /* 12c, void, char */
1176     move.l      %d1,%d0
1177     cmp.b       #'a',%d0
1178     bcs.s       1f
1179     cmp.b       #'z',%d0
1180     bhi.s       1f
1181     bclr        #5,%d0
1182 1:  BRTS
1184 BCPL charicmp        /* 130, long , char1, char2 */
1185     move.l      %d2,%d0
1186     cmp.b       #'a',%d0
1187     bcs.s       1f
1188     cmp.b       #'z',%d0
1189     bhi.s       1f
1190     bclr        #5,%d0
1191 1:  cmp.b       #'a',%d1
1192     bcs.s       2f
1193     cmp.b       #'z',%d1
1194     bhi.s       2f
1195     bclr        #5,%d1
1196 2:  sub.l       %d1,%d0
1197     BRTS
1199 BCPL stricmp         /* 134, long , @String1, @String2 */
1200     movem.l     %d1-%d3/%a0-%a1,%sp@-
1202 #if BCPLSTRINGDEBUG
1203     move.l      %d1,%d0
1204         bsr             bstr_debug
1205         move.l  %d2,%d0
1206         bsr             bstr_debug
1207 #endif
1209     lsl.l       #2,%d1
1210     move.l      %d1,%a0
1211     lsl.l       #2,%d2
1212     move.l      %d2,%a1
1213     move.b      %a0@+,%d2
1214     move.b      %a1@+,%d3
1215     moveq       #0,%d0
1216 sicmp1:
1217     tst.b       %d2
1218     beq.b       sicmp2
1219     tst.b       %d3
1220     beq.b       sicmp2
1221     subq.b      #1,%d2
1222     subq.b      #1,%d3
1223     moveq       #0,%d0
1224     move.b      %a0@+,%d0
1225     bclr        #5,%d0
1226     moveq       #0,%d1
1227     move.b      %a1@+,%d1
1228     bclr        #5,%d1
1229     sub.w       %d1,%d0
1230     beq.s       sicmp1
1231         bra.s   sicmp0
1232 sicmp2:
1233         cmp.b   %d2,%d3
1234         beq.s   sicmp0
1235         moveq   #-1,%d0
1236         tst.b   %d2
1237         beq.s   sicmp0
1238         moveq   #1,%d0
1239 sicmp0:
1240     ext.l       %d0
1241         movem.l %sp@+,%d1-%d3/%a0-%a1
1242     BRTS
1244 BCPL rdargs         /* 138, ULONG, @template, array, array_size */
1245     /* BCPL rdargs and DOS/ReadArgs() don't match up
1246      *      very nicely. We'll need to call a BCPL/ReadArgs
1247      *      routine that works the way this expects
1248      */
1249     movem.l     %a0-%a1/%a6,%sp@-
1250     move.l      %a2@(GV_DOSBase),%a6
1251     jsr         BCPL_ReadArgs
1252     movem.l     %sp@+,%a0-%a1/%a6
1253     BRTS
1255 BCPL rditem         /* 13c, void, @buf, maxlongs  */
1256     movem.l     %d2-%d3/%a0-%a2/%a6,%sp@-
1257     move.l      %a2@(GV_DOSBase),%a6
1258     lsl.l       #2,%d1
1259     addq.l      #1,%d1
1260     move.l      %d1,%a2
1261     clr.b       %a2@
1262     lsl.l       #2,%d2
1263     subq.l      #1,%d2
1264     moveq       #0,%d3
1265     /* this can't be right but at least c:execute does something now */
1266     jsr         %a6@(135 * -6)  /* DOS/ReadItem() */
1268     move.l      %a2,%a0
1269     moveq       #-1,%d2
1270 0:  addq.w      #1,%d2
1271     tst.b       %a0@+
1272         bne             0b
1273         move.b  %d2,%a2@(-1)    /* fix buf BSTR length */
1275 #if BCPLSTRINGDEBUG
1276     move.l      %d0,%d2
1277     lea.l       %a2@(-1),%a2
1278     move.l      %a2,%d0
1279     lsr.l       #2,%d0
1280     bsr         bstr_debug
1281     move.l      %d2,%d0
1282 #endif
1284     movem.l     %sp@+,%d2-%d3/%a0-%a2/%a6
1285     BRTS
1287 BCPL subString      /* 140, void, @string, @substring */
1289     movem.l     %d2-%d3/%a0-%a6,%sp@-
1290     move.l      SysBase,%a6
1291     move.l      %a2@(GV_DOSBase),%a5
1293 #if BCPLSTRINGDEBUG
1294     move.l      %d1,%d0
1295         bsr             bstr_debug
1296         move.l  %d2,%d0
1297         bsr             bstr_debug
1298 #endif
1300     moveq       #0,%d3
1302     lsl.l       #2,%d1
1303     move.l      %d1,%a2
1304     lsl.l       #2,%d2
1305     move.l      %d2,%a3
1307         moveq   #0,%d0
1308         move.b  (%a2),%d0
1309         moveq   #0,%d1
1310         move.b  (%a3),%d1
1311         add.l   %d1,%d0
1312         addq.l  #2,%d0
1313         moveq   #1,%d1
1314         jsr             %a6@(114 * -6)  /* AllocVec */
1315         move.l  %d0,%a4
1316         tst.l   %d0
1317         beq.s   findarg_end
1318         move.l  %a4,%a0
1320         move.l  %a0,%d1
1321         move.b  %a2@+,%d0
1322 findarg_copy12:
1323         beq.s   findarg_copy11
1324         move.b  %a2@+,%a0@+
1325         subq.b  #1,%d0
1326         bra.s   findarg_copy12
1327 findarg_copy11:
1328         clr.b   %a0@+
1330         move.l  %a0,%d2
1331     move.b      %a3@+,%d0
1332 findarg_copy22:
1333         beq.s   findarg_copy21
1334         move.b  %a3@+,%a0@+
1335         subq.b  #1,%d0
1336         bra.s   findarg_copy22
1337 findarg_copy21:
1338     clr.b       %a0@+
1340         exg             %a5,%a6
1341     jsr         %a6@(134 * -6)  /* DOS/FindArg() */
1342     exg         %a5,%a6
1343         move.l  %d0,%d3
1345 findarg_end:
1346         move.l  %a4,%a1
1347         jsr             %a6@(115 * -6)  /* FreeVec */
1349         move.l  %d3,%d0
1350     movem.l     %sp@+,%d2-%d3/%a0-%a6
1351     BRTS
1353         /* C:Resident uses this */
1354 BCPL load           /* 144, SegList ^, @filename */
1355     movem.l     %a0-%a1/%a6,%sp@-
1356     move.l      %a2@(GV_DOSBase),%a6
1358 #if BCPLSTRINGDEBUG
1359     move.l      %d1,%d0
1360         bsr             bstr_debug
1361 #endif
1363     moveq       #1,%d0
1364     bsr         bstr_to_cstr
1365     jsr         %a6@(25 * -6)   /* DOS/LoadSeg() */
1366     movem.l     %sp@+,%a0-%a1/%a6
1367     BRTS
1369 BCPL UnLoadSeg      /* 148, void, @seg */
1370     movem.l     %a0-%a1/%a6,%sp@-
1371     move.l      %a2@(GV_DOSBase),%a6
1372     jsr         %a6@(26 * -6)   /* DOS/UnLoadSeg */
1373     movem.l     %sp@+,%a0-%a1/%a6
1374     BRTS
1376 BCPLd tidyup         /* 150, void,  */
1377     BRTS
1379 BCPL addDevice      /* 154, void, @name */
1380     movem.l     %d2/%a0-%a1/%a6,%sp@-
1381     move.l      %a2@(GV_DOSBase),%a6
1383 #if BCPLSTRINGDEBUG
1384     move.l      %d1,%d0
1385         bsr             bstr_debug
1386 #endif
1388     moveq.l     #1,%d0
1389     bsr         bstr_to_cstr
1390     moveq       #0,%d2                  /* DLT_DEVICE */
1391     jsr         %a6@(116 * -6)  /* DOS/MakeDosEntry */
1392     move.l      %d0,%d2
1393     beq.s       0f
1394     move.l      %d2,%d1
1395     lsr.l       #2,%d2
1396     jsr         %a6@(113 * -6)  /* DOS/AddDosEntry */
1397     move.l      %d0,%d1
1398     bne.s       0f
1399     jsr         %a6@(117 * -6)  /* DOS/FreeDosEntry */
1400     moveq       #0,%d2
1401 0:      move.l  %d2,%d0
1402     movem.l     %sp@+,%d2/%a0-%a1/%a6
1403     BRTS
1405 BCPL datestamp      /* 158, @DateStamp, @DateStamp */
1406     movem.l     %a0-%a1/%a6,%sp@-
1407     lsl.l       #2,%d1
1408     move.l      %a2@(GV_DOSBase),%a6
1409     jsr.l       %a6@(32 * -6)   /* DOS/DateStamp() */
1410     lsr.l       #2,%d0
1411     movem.l     %sp@+,%a0-%a1/%a6
1412     BRTS
1414 BCPLd WaitForChar    /* 15c, BOOL , @FileHandle, time */
1415     BRTS
1417 BCPL execLib        /* 160, long , LVOffset, d0, d1, a0, a1, a2 */
1418     movem.l     %d2/%a0-%a3/%a6,%sp@-
1419     move.l      SysBase,%a6
1420     move.l      %a1,%a3
1421     move.w      %d1,%d2
1422     movem.l %a3@(4),%d0-%d1/%a0-%a2
1423     jsr         %a6@(%d2.w)
1424     movem.l     %sp@+,%d2/%a0-%a3/%a6
1425     BRTS
1427 BCPL findSegArray   /* 164, Array @,  */
1428     movem.l     %a0-%a1/%a6,%sp@-
1429     sub.l       %a1,%a1
1430     move.l      SysBase,%a6
1431     jsr         FindTask(%a6)
1432     move.l      %d0,%a0
1433     move.l      %a0@(pr_SegList),%d0
1434     movem.l     %sp@+,%a0-%a1/%a6
1435     BRTS
1437 BCPL deleteObject   /* 168, void, @name */
1438     movem.l     %a0-%a1/%a6,%sp@-
1439     moveq       #1,%d0
1440     bsr         bstr_to_cstr
1441     move.l      %a2@(GV_DOSBase),%a6
1442     jsr         %a6@(12 * -6)   /* DOS/DeleteFile() */
1443     movem.l     %sp@+,%a0-%a1/%a6
1444     BRTS
1446 BCPL rename         /* 16c, void, @oldname, @newname */
1447     movem.l     %d2/%a0-%a2/%a6,%sp@-
1448     move.l      %a2@(GV_DOSBase),%a6
1449     moveq       #1,%d0
1450     bsr         bstr_to_cstr
1451     lea         %sp@(-256),%sp
1452     move.l      %sp,%a2
1453     move.l      %a2,%a1
1454     move.l      %d1,%a0
1455 0:  move.b      %a0@+,%a1@+
1456     bne.s       0b
1457     move.l      %d2,%d1
1458     moveq       #1,%d0
1459     bsr         bstr_to_cstr
1460     move.l      %d1,%d2
1461     move.l      %a2,%d1
1462     jsr         %a6@(13 * -6)   /* DOS/Rename() */
1463     lea         %sp@(256),%sp
1464     movem.l     %sp@+,%d2/%a0-%a2/%a6
1465     BRTS
1467 /*      170 - contains APTR to IntuitionBase */
1469 BCPL Close          /* 174, void, @FileHandle */
1470     movem.l     %a0-%a1/%a6,%sp@-
1471     move.l      %a2@(GV_DOSBase),%a6
1472     jsr         %a6@(6 * -6)    /* DOS/Close() */
1473     movem.l     %sp@+,%a0-%a1/%a6
1474     BRTS
1476 BCPLd getword        /* 178, void, longaddress, wordnumber */
1477     BRTS
1479 BCPLd putword        /* 17c, void, longaddress, wordnumber */
1480     BRTS
1481                      /* 180, ??? */
1483 BCPLd taskwait_190   /* 190, DosPacket ^,  */
1484     jmp BCPL_taskwait
1486 BCPL execute        /* 194, void, &string , @in, @out */
1487     movem.l     %a0-%a1/%a6,%sp@-
1488     move.l      %a2@(GV_DOSBase),%a6
1489     jsr         %a6@(37 * -6)   /* DOS/Execute() */
1490     movem.l     %sp@+,%a0-%a1/%a6
1491     BRTS
1493 BCPL deviceproc     /* 198, FileLock ^, @filename */
1494     movem.l     %a0-%a1/%a6,%sp@-
1495     move.l      %a2@(GV_DOSBase),%a6
1497     moveq.l     #1, %d0
1498     bsr         bstr_to_cstr
1500     jsr         %a6@(29 * -6)   /* DOS/DeviceProc() */
1501     movem.l     %sp@+,%a0-%a1/%a6
1502     BRTS
1504 BCPL libcall        /* 19c, void, libbase, LVOffset, d0, d1, a0, a1 */
1505     movem.l     %a0-%a1/%a6,%sp@-
1506     move.l      %d1,%a6
1507     move.l      %a1@(0x08),%d0
1508     move.l      %a1@(0x0c),%d1
1509     move.l      %a1@(0x10),%a0
1510     move.l      %a1@(0x14),%a1
1511     jsr         %a6@(%d2)
1512     movem.l     %sp@+,%a0-%a1/%a6
1513     BRTS
1515 BCPLd writeErr          /* 1a0, ??, ?? */
1516     moveq.l     #-1,%d0
1517     BRTS
1519 BCPL findConsoleHandler /* 1a4, MsgPort *,  */
1520     movem.l     %a0-%a1/%a6,%sp@-
1521     move.l      SysBase,%a6
1522     sub.l       %a1,%a1
1523     jsr         %a6@(FindTask)
1524     move.l      %d0,%a0
1525     move.l      %a0@(pr_ConsoleTask),%d0
1526     movem.l     %sp@+,%a0-%a1/%a6
1527     BRTS
1529 BCPL findFileHandler    /* 1a8, MsgPort *,  */
1530     movem.l     %a0-%a1/%a6,%sp@-
1531     move.l      SysBase,%a6
1532     sub.l       %a1,%a1
1533     jsr         %a6@(FindTask)
1534     move.l      %d0,%a0
1535     move.l      %a0@(pr_FileSystemTask),%d0
1536     movem.l     %sp@+,%a0-%a1/%a6
1537     BRTS
1539 BCPL extractDeviceName  /* 1ac, void, @buf, separator, @name , oldpos */
1540     movem.l     %d1-%d5/%a0-%a1/%a6,%sp@-
1541     move.l      %a2@(GV_DOSBase),%a6
1543 #if BCPLSTRINGDEBUG
1544     move.l      %d3,%d0
1545         bsr             bstr_debug
1546 #endif
1548                                                         /* D2 = SplitName 'separator' */
1549     subq.l      #1,%d4                  /* D4 = oldpos - 1 (?) */
1550                                                         
1551     move.l      %d3, %d1
1552     moveq       #4, %d0
1553     bsr         bstr_to_cstr
1554                                                 /* D1 = SplitName 'name' */
1556     move.l      %a1@(0), %d3    /* Recover D1 (buf) from A1[0] */
1557     lsl.l       #2,%d3
1558     addq.l      #1,%d3                  /* D3 = SplitName 'buf' */
1560         moveq   #30,%d5                 /* D5 = SplitName 'size' */
1562     jsr         %a6@(69 * -6)   /* SplitName */
1564     move.l      %d3,%a0
1565     moveq       #-1,%d1
1566 0:  addq.w      #1,%d1
1567     tst.b       %a0@+
1568         bne             0b
1569         move.l  %d3,%a0
1570         move.b  %d1,%a0@(-1)    /* fix buf BSTR length */
1571         
1572     addq.l      #1,%d0                  /* newpos + 1 (?) */
1573     movem.l     %sp@+,%d1-%d5/%a0-%a1/%a6
1574     BRTS
1576 BCPL lock           /* 1b0, FileLock ^, @name */
1577     movem.l     %d2/%a0-%a1/%a6,%sp@-
1578     move.l      %a2@(GV_DOSBase),%a6
1580     moveq.l     #1, %d0
1581     bsr         bstr_to_cstr
1583     moveq.l     #-2,%d2         /* Shared lock */
1584     jsr         %a6@(14 * -6)   /* DOS/Lock() */
1585     movem.l     %sp@+,%d2/%a0-%a1/%a6
1586     BRTS
1588 BCPL UnLock         /* 1b4, void, @FileLock */
1589     movem.l     %a0-%a1/%a6,%sp@-
1590     move.l      %a2@(GV_DOSBase),%a6
1591     jsr         %a6@(15 * -6)   /* DOS/UnLock() */
1592     movem.l     %sp@+,%a0-%a1/%a6
1593     BRTS
1595 BCPL getlong        /* 1b8, void, longoffset, &struct */
1596     lsl.l       #2,%d1
1597     add.l       %d2,%d1
1598     move.l      %a0@(%d1),%d0
1599     BRTS
1601 BCPL putlong        /* 1bc, void, longoffset, &struct, data */
1602     lsl.l       #2,%d1
1603     add.l       %d2,%d1
1604     move.l      %a0@(%d1),%d0
1605     move.l      %d3,%a0@(%d1)
1606     BRTS
1608 BCPL openDevInfo       /* 1c0, FileHandle ^, @DevInfo, @filename/window */
1609     movem.l     %a0-%a1/%a6,%sp@-
1610     move.l      %a2@(GV_DOSBase),%a6
1611     move.l      %a6,%sp@-
1612     move.l      %d2,%sp@-
1613     move.l      %d1,%sp@-
1614     jsr         RunHandler
1615     lea.l       %sp@(12),%sp
1616     movem.l     %sp@+,%a0-%a1/%a6
1617     BRTS
1619 BCPL DupLock        /* 1c4, FileLock ^, @FileLock */
1620     movem.l     %a0-%a1/%a6,%sp@-
1621     move.l      %a2@(GV_DOSBase),%a6
1622     jsr         %a6@(16 * -6)   /* DOS/DupLock() */
1623     movem.l     %sp@+,%a0-%a1/%a6
1624     BRTS
1626 /* Calls ErrorReport(IoErr(), ...)
1627  * Why this is called 'makesysreq' is a question
1628  * for the TripOS guys.
1629  */
1630 BCPL makesysreq     /* 1c8, BOOL, type, arg, *msgport */
1631     movem.l     %a0-%a1/%a6,%sp@-
1632     move.l      %d3,%d4
1633     move.l      %d2,%d3
1634     move.l      %d1,%d2
1635     move.l      %a2@(GV_DOSBase),%a6
1636     jsr         %a6@(22 * -6)   /* IoErr */
1637     jsr         %a6@(80 * -6)   /* ErrorReport */
1638     movem.l     %sp@+,%a0-%a1/%a6
1639     BRTS
1641 BCPL strcpy         /* 1cc, void, @src, @dest */
1642     move.l      %d2,%sp@-
1643     lsl.l       #2,%d1
1644     lsl.l       #2,%d2
1645     moveq       #0,%d0
1646     move.b      %a0@(%d1),%d0
1647 0:  move.b      %a0@(%d1),%a0@(%d2)
1648     addq.l      #1,%d1
1649     addq.l      #1,%d2
1650     dbf         %d0,0b
1651     move.l      %sp@+,%d2
1652     BRTS
1654 BCPL runCommand    /* 1e4, void, @codeseg, stacklongs, @cmdline, cmdlinelength */
1655     movem.l     %a0-%a1/%a6,%sp@-
1656     lsl.l       #2,%d2
1657     lsl.l       #2,%d3
1658     move.l      %a2@(GV_DOSBase),%a6
1659     jsr         %a6@(84 * -6)   /* DOS/RunCommand() */
1660     movem.l     %sp@+,%a0-%a1/%a6
1661     BRTS
1663 BCPL lock_1ec       /* 1ec, FileLock ^, &name */
1664     movem.l     %d2/%a0-%a1/%a6,%sp@-
1665 #if BCPLSTRINGDEBUG
1666     move.l      %d1,%d0
1667     bsr         bstr_debug
1668 #endif
1669     move.l      %a2@(GV_DOSBase),%a6
1670     moveq.l     #1, %d0
1671     bsr         bstr_to_cstr
1672     moveq.l     #-2,%d2         /* Shared lock */
1673     jsr         %a6@(14 * -6)   /* DOS/Lock() */
1674     movem.l     %sp@+,%d2/%a0-%a1/%a6
1675     BRTS
1677 BCPL findDevInfo    /* 1f0, DevInfo ^, @name */
1678     movem.l     %d2-%d3/%a0-%a1/%a6,%sp@-
1679     move.l      %a2@(GV_DOSBase),%a6
1681 #if BCPLSTRINGDEBUG
1682     move.l      %d1,%d0
1683         bsr             bstr_debug
1684 #endif
1686     moveq.l     #1,%d0
1687     bsr         bstr_to_cstr
1689     move.l      %d1,%sp@-
1690     moveq       #0x1d,%d1       /* LDF_ALL | LDF_READ */
1691     jsr         %a6@(109 * -6)  /* DOS/LockDosList */
1692     move.l      %d0,%d1
1693     move.l      %sp@+,%d2
1694     moveq       #0x1d,%d3       /* LDF_ALL | LDF_READ */
1695     jsr         %a6@(114 * -6)  /* DOS/FindDosEntry */
1696     move.l      %d0,%sp@-
1697     moveq       #0x1d,%d1       /* LDF_ALL | LDF_READ */
1698     jsr         %a6@(110 * -6)  /* DOS/UnlockDosList */
1699     move.l      %sp@+,%d0
1700     lsr.l       #2,%d0
1701     movem.l     %sp@+,%d2-%d3/%a0-%a1/%a6
1702     BRTS
1704 BCPL createDir      /* 1f4, FileLock^, @name */
1705     movem.l     %a0-%a1/%a6,%sp@-
1706     move.l      %a2@(GV_DOSBase),%a6
1708     moveq.l     #1,%d0
1709     bsr         bstr_to_cstr
1711     jsr         %a6@(20 * -6)   /* DOS/CreateDir() */
1712     movem.l     %sp@+,%a0-%a1/%a6
1713     BRTS
1715 BCPLd compareTime    /* 1f8, SIGN , @timeval, @timeval */
1716     /* I suspect this is actually Dos/CompareDates(), but
1717      * I haven't found a user of this routine yet.
1718      */
1719     BRTS
1721 BCPL timerIO        /* 1fc, void, command, @IOStdReq, secs, usecs */
1722     movem.l     %a0-%a1/%a6,%sp@-
1723     lsl.l       #2,%d2
1724     move.l      %d2,%a1
1725     move.w      %d1,%a1@(io_Command)
1726     move.l      %d3,%a1@(tr_time + 0)
1727     move.l      %d4,%a1@(tr_time + 4)
1728     move.l      SysBase, %a6
1729     jsr.l       %a6@(76 * -6)   /* Exec/DoIO() */
1730     moveq.l     #-1,%d0 
1731     movem.l     %sp@+,%a0-%a1/%a6
1732     BRTS
1734 BCPL settime        /* 200, void, @DateStamp */
1735     move.l      %a2@(GV_DOSBase),%d0
1736     move.l      %a0@(dl_TimeReq,%d0),%d2
1737     lsl.l       #2,%d1
1738     move.l      %a0@(0,%d1),%d3 /* ds_Days */
1739     mulu.w      #(60*24),%d3    /* mulu.w is fine until 2162 AD,  */
1740                                 /* but tv_secs is too small in 2047 AD */
1741     add.l       %a0@(4,%d1),%d3 /* ds_Minute */
1742     move.l      %d3,%d4
1743     mulu.w      #(60),%d3
1744     lsr.l       #8,%d4
1745     lsr.l       #8,%d4
1746     mulu.w      #(60),%d4
1747     lsl.l       #8,%d4
1748     lsl.l       #8,%d4
1749     add.l       %d4,%d3
1750     mov.l       %a0@(8,%d1),%d4 /* ds_Tick */
1751     divu.w      #50,%d4
1752     ext.l       %d4
1753     add.l       %d4,%d3
1754     moveq.l     #0,%d4
1755     lsr.l       #2,%d2
1756     move.l      #11,%d1         /* TR_SETSYSTIME */
1757     move.l      #(1*4 + 3*4),%d0
1758     move.l      %a2@(GV_timerIO),%a4
1759     jsr         %a5@
1760     BRTS
1762     /*
1763      * On AOS, this routine called the internal
1764      * CliInit(), which handled setting up the
1765      * core SYS: lock, assigns, and paths.
1766      *
1767      * The (normally NULL) DOS Packet is always ignored.
1768      *
1769      * Although (for various reasons) this has been done
1770      * before this routine has been called, we still need
1771      * to call CliInit* to process the inbound AROS packet.
1772      *
1773      * If the passed in DOS Packet is NULL, then we have
1774      * nothing to do, since that's not valid under AROS.
1775      *
1776      * If the DOS Packet is *not* NULL, then pass it
1777      * to the appropriate CliInit* routine.
1778      *
1779      */
1780 BCPL CliInit         /* 214, APTR, @DosPacket */
1781     tst.l       %d1
1782     beq.s       .L_CliInit_exit
1784     lsl.l       #2,%d1
1785     move.l      %a0@(dp_Res1,%d1),%d2
1786     tst.l       %d2
1787     beq.s       .L_CliInit_Run
1789 .L_CliInit_Newcli:
1790     /* CliInitNewcli */
1791     move.l      #(155*-6),%d2
1792     bra.s       .L_CliInit_Init
1794 .L_CliInit_Run:
1795     /* CliInitRun */
1796     move.l      #(156*-6),%d2
1798 .L_CliInit_Init:
1799     movem.l      %a0-%a1/%a6,%sp@-
1800     move.l      %d1,%a0
1801     move.l      %a2@(GV_DOSBase),%a6
1802     jsr         %a6@(%d2)
1803     movem.l      %sp@+,%a0-%a1/%a6
1804 .L_CliInit_exit:
1805     BRTS
1807 BCPLnd CliInit_NEWCLI
1808     lsl.l       #2, %d1
1809     move.l      #1, %a0@(dp_Type, %d1)
1810     jmp         .L_CliInit_Newcli
1812 BCPLnd CliInit_RUN
1813     lsl.l       #2, %d1
1814     move.l      #-1, %a0@(dp_Type, %d1)
1815     jmp         .L_CliInit_Run
1817 BCPLnd CliInit_SYSTEM
1818     lsl.l       #2, %d1
1819     move.l      #-2, %a0@(dp_Type, %d1)
1820     jmp         .L_CliInit_Run
1822 BCPLnd CliInit_ASYSTEM
1823     lsl.l       #2, %d1
1824     move.l      #-3, %a0@(dp_Type, %d1)
1825     jmp         .L_CliInit_Run
1827 BCPLnd CliInit_BOOT
1828     lsl.l       #2, %d1
1829     move.l      #-4, %a0@(dp_Type, %d1)
1830     jmp         .L_CliInit_Run
1833 BCPL findCLI        /* 218, CommandLineInterpreter ^,  */
1834     movem.l             %a0-%a1/%a6,%sp@-
1835     move.l              %a2@(GV_DOSBase),%a6
1836     jsr                 %a6@(82 * -6)   /* DOS/Cli() */
1837     lsr.l               #2,%d0
1838     movem.l             %sp@+,%a0-%a1/%a6
1839     BRTS
1842 /* Helper routines */
1843     /* Convert BCPL string to Cstring inline in the A1 vector
1844      * In:
1845      *   D0: Index into A1, in words, to hold dest
1846      *   D1: BSTR to convert
1847      *   A1: ULONG vector
1848      * Out:
1849      *   D0: Clobbered
1850      *   D1: Memory address of Cstring
1851      *   A1: Unchanged
1852      */
1853 bstr_to_cstr:
1854     movem.l     %d0/%a0-%a1,%sp@-
1855     sub.l       %a0,%a0
1856     lsl.l       #2,%d1
1857     addq.l      #1,%d1
1858     clr.l       %sp@-
1859     move.b      %a0@(-1,%d1),%sp@(3)    /* Arg3 = strlen */
1860     move.l      %d1,%sp@-               /* Arg2 = src */
1861     lsl.l       #2,%d0
1862     pea.l       %a1@(%d0)               /* Arg1 = dest */
1863     jsr         memcpy
1864     move.l      %sp@+,%a0               /* A0 = dest */
1865     addq.l      #4,%sp                  /* Drop src */
1866     move.l      %sp@+,%d1               /* D1 = strlen */
1867     move.b      #0,%a0@(%d1)            /* Terminate string with an ASCIIZ */
1868     move.l      %a0,%d1                 /* D1 = dest */
1869     movem.l     %sp@+,%d0/%a0-%a1
1870     rts
1872 #if BCPLSTRINGDEBUG
1873 .bstr_format:
1874     .string  "%p->%p:%d:'%b'\n"
1875 bstr_debug:
1876         movem.l %d1/%a0-%a1,%sp@-
1877     move.l      %d0,%a0
1878     add.l       %a0,%a0
1879     add.l       %a0,%a0
1880     moveq       #0,%d1
1881     move.b      (%a0),%d1
1882     move.l      %d0,%sp@-
1883     move.l      %d1,%sp@-
1884     move.l  %a0,%sp@-
1885     move.l      %d0,%sp@-
1886     pea         .bstr_format(%pc)
1887     jsr     kprintf
1888     lea         20(%sp),%sp
1889     movem.l     %sp@+,%d1/%a0-%a1
1890     rts
1891 #endif