Test initialisation of MUIA_List_AdjustWidth and MUIA_List_AdjustHeight, and
[AROS.git] / arch / m68k-all / dos / bcpl.S
blobee9a7fc7c0684d877de30d211c9e3b04a837b28f
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     /* In-place conversion of BSTR to C string */
153 BCPL toCStr          /* -80, char *, @string */
154     movem.l     %a0-%a1,%sp@-
155     move.l      %d1,%d0
156     lsl.l       #2,%d0
157     addq.l      #1,%d0
158     move.l      %d0,%a0
159     clr.l       %d1
160     move.b      %a0@+,%d1
161     subq.l      #1,%d1
162     blt         1f
163 0:  
164     move.b      %a0@+,%d2
165     move.b      %d2,%a0@(-2)
166     dbra        %d1,0b
168     move.b      #0,%a0@(-1)
169     movem.l     %sp@+,%a0-%a1
170     BRTS
172 BCPL toBSTR         /* -7c, void, &src, @dest */
173     movem.l     %d1-%d2/%a0-%a1,%sp@-
174     lsl.l       #2,%d2
175     move.l      %d1,%a0
176     move.l      %d2,%a1
177     clr.l       %d2
178     tst.l       %d1
179     beq         1f      /* src == NULL */
181     move.b      %a0@+,%d0
182     tst.b       %d0
183     beq         1f
184     addq.l      #1,%d2
185     tst.b       %d2
186     beq         1f
187     move.b      %d0,%a1@(%d2)
188     bra         0b
190     move.b      %d2,%a1@
191     movem.l     %sp@+,%d1-%d2/%a0-%a1
192     BRTS
194 BCPL Execute        /* -6c, BOOL, &command, @input, @output */
195     movem.l     %a0-%a1/%a6,%sp@-
196     move.l      %a2@(GV_DOSBase),%a6
197     jsr         %a6@(37 * -6)   /* DOS/Execute() */
198     movem.l     %sp@+,%a0-%a1/%a6
199     BRTS
201 BCPL IsInteractive  /* -68, BOOL, @filehandle */
202     movem.l     %a0-%a1/%a6,%sp@-
203     move.l      %a2@(GV_DOSBase),%a6
204     jsr         %a6@(36 * -6)   /* DOS/IsInteractive() */
205     movem.l     %sp@+,%a0-%a1/%a6
206     BRTS
208 BCPL DateStamp      /* -64, timeval *, &time */
209     movem.l     %a0-%a1/%a6,%sp@-
210     move.l      %a2@(GV_DOSBase),%a6
211     jsr         %a6@(32 * -6)   /* DOS/DateStamp() */
212     movem.l     %sp@+,%a0-%a1/%a6
213     BRTS
215 BCPL SetProtection  /* -60, BOOL, &name, mask */
216     movem.l     %a0-%a1/%a6,%sp@-
217     move.l      %a2@(GV_DOSBase),%a6
218     jsr         %a6@(31 * -6)   /* DOS/SetProtection() */
219     movem.l     %sp@+,%a0-%a1/%a6
220     BRTS
222 BCPL SetComment     /* -5c, BOOL, &name, &comment */
223     movem.l     %a0-%a1/%a6,%sp@-
224     move.l      %a2@(GV_DOSBase),%a6
225     jsr         %a6@(30 * -6)   /* DOS/SetComment() */
226     movem.l     %sp@+,%a0-%a1/%a6
227     BRTS
229 BCPL NoReqLoadSeg   /* -54, SegList ^, @name */
230     movem.l     %a0-%a1/%a6,%sp@-
231     move.l      %a2@(GV_DOSBase),%a6
232     jsr         %a6@(28 * -6)   /* DOS/NoReqLoadSeg() */
233     movem.l     %sp@+,%a0-%a1/%a6
234     BRTS
236 BCPL clearvec       /* -50, void, @buff, lw_length */
237     tst.l       %d2
238     bmi.s       .Lclearmem_end
239     lsl.l       #2,%d1
240         /* clears one extra long by design! */
241 .Lclearmem_loop:
242     clr.l       %a0@(%d1)
243     addq.l      #4,%d1
244     dbf         %d2,.Lclearmem_loop
245 .Lclearmem_end:
246     BRTS
248 BCPL LoadSeg        /* -4c, SegList ^, &name */
249     movem.l     %a0-%a1/%a6,%sp@-
250     move.l      %a2@(GV_DOSBase),%a6
251     jsr         %a6@(25 * -6)   /* DOS/LoadSeg() */
252     movem.l     %sp@+,%a0-%a1/%a6
253     BRTS
255 BCPL CreateProc     /* -48, MessagePort *, &name, pri, seg, stackbytes */
256     movem.l     %a0-%a1/%a6,%sp@-
257     move.l      %a2@(GV_DOSBase),%a6
258     jsr         %a6@(23 * -6)   /* DOS/CreateProc() */
259     movem.l     %sp@+,%a0-%a1/%a6
260     BRTS
262 BCPL IoErr          /* -44, long */
263     movem.l     %a0-%a1/%a6,%sp@-
264     move.l      %a2@(GV_DOSBase),%a6
265     jsr         %a6@(22 * -6)   /* DOS/IoErr() */
266     movem.l     %sp@+,%a0-%a1/%a6
267     BRTS
269 BCPL CurrentDir     /* -40, FileLock ^, @FileLock */
270     movem.l     %a0-%a1/%a6,%sp@-
271     move.l      %a2@(GV_DOSBase),%a6
272     jsr         %a6@(21 * -6)   /* DOS/CurrentDir() */
273     movem.l     %sp@+,%a0-%a1/%a6
274     BRTS
276 BCPL CreateDir      /* -3c, FileLock ^, &name */
277     movem.l     %a0-%a1/%a6,%sp@-
278     move.l      %a2@(GV_DOSBase),%a6
279     jsr         %a6@(20 * -6)   /* DOS/CreateDir() */
280     movem.l     %sp@+,%a0-%a1/%a6
281     BRTS
283 BCPL Info           /* -38, BOOL, @FileLock, &InfoData */
284     movem.l     %a0-%a1/%a6,%sp@-
285     move.l      %a2@(GV_DOSBase),%a6
286     jsr         %a6@(19 * -6)   /* DOS/Info() */
287     movem.l     %sp@+,%a0-%a1/%a6
288     BRTS
290 BCPL ExNext         /* -34, BOOL, @FileLock, &FileInfo */
291     movem.l     %a0-%a1/%a6,%sp@-
292     move.l      %a2@(GV_DOSBase),%a6
293     jsr         %a6@(18 * -6)   /* DOS/ExNext() */
294     movem.l     %sp@+,%a0-%a1/%a6
295     BRTS
297 BCPL Examine        /* -30, BOOL, @FileLock, &FileInfo */
298     movem.l     %a0-%a1/%a6,%sp@-
299     move.l      %a2@(GV_DOSBase),%a6
300     jsr         %a6@(17 * -6)   /* DOS/Examine() */
301     movem.l     %sp@+,%a0-%a1/%a6
302     BRTS
304 BCPL Lock           /* -2c, FileLock ^, &name, mode */
305     movem.l     %a0-%a1/%a6,%sp@-
306     move.l      %a2@(GV_DOSBase),%a6
307     jsr         %a6@(14 * -6)   /* DOS/Lock() */
308     movem.l     %sp@+,%a0-%a1/%a6
309     BRTS
311 BCPL Rename         /* -28, BOOL, &oldname, &newname */
312     movem.l     %a0-%a1/%a6,%sp@-
313     move.l      %a2@(GV_DOSBase),%a6
314     jsr         %a6@(13 * -6)   /* DOS/Rename() */
315     movem.l     %sp@+,%a0-%a1/%a6
316     BRTS
318 BCPL DeleteFile     /* -24, BOOL, &name */
319     movem.l     %a0-%a1/%a6,%sp@-
320     move.l      %a2@(GV_DOSBase),%a6
321     jsr         %a6@(12 * -6)   /* DOS/DeleteFile() */
322     movem.l     %sp@+,%a0-%a1/%a6
323     BRTS
325 BCPL Seek           /* -20, LONG, @FileHandle, pos, mode */
326     movem.l     %a0-%a1/%a6,%sp@-
327     move.l      %a2@(GV_DOSBase),%a6
328     jsr         %a6@(11 * -6)   /* DOS/Seek() */
329     movem.l     %sp@+,%a0-%a1/%a6
330     BRTS
332 BCPL Write          /* -18, LONG, Write, @FileHandle, &buf, len */
333     movem.l     %a0-%a1/%a6,%sp@-
334     move.l      %a2@(GV_DOSBase),%a6
335     jsr         %a6@(8 * -6)    /* DOS/Write() */
336     movem.l     %sp@+,%a0-%a1/%a6
337     BRTS
339 BCPL Read           /* -0c, LONG, Read, @FileHandle, &buf, len */
340     movem.l     %a0-%a1/%a6,%sp@-
341     move.l      %a2@(GV_DOSBase),%a6
342     jsr         %a6@(7 * -6)    /* DOS/Read() */
343     movem.l     %sp@+,%a0-%a1/%a6
344     BRTS
346 BCPL copyvec        /* -08, void, @src, @dest, n */
347     movem.l     %d2-%d3/%a0-%a1,%sp@-
348         tst.l   %d3
349         bmi.s   .copydone
350         lsl.l   #2,%d1
351         move.l  %d1,%a0
352         lsl.l   #2,%d2
353         move.l  %d2,%a1
354         /* copies one extra long by design! */
355 .copyloop:
356         move.l  %a0@+,%a1@+
357         dbf             %d3,.copyloop
358 .copydone:
359     movem.l     %sp@+,%d2-%d3/%a0-%a1
360     BRTS
362 BCPL Open           /* -04, FileHandle ^, &name, mode */
363     movem.l     %a0-%a1/%a6,%sp@-
365 #if BCPLSTRINGDEBUG
366     move.l      %d1,%d0
367         bsr             bstr_debug
368 #endif
370     move.l      %a2@(GV_DOSBase),%a6
371     jsr         %a6@(5 * -6)    /* DOS/Open() */
372     movem.l     %sp@+,%a0-%a1/%a6
373     BRTS
375                      /* 4, void main */
376 BCPL Entry
377     jsr         BCPL_RunHandler
378     /* FALLTHROUGH to BCPL_Exit */
380 BCPL Exit            /*  08, void, code */
381     move.l      SysBase,%a6
382     sub.l       %a1,%a1
383     move.l      %d1,%d2
384     jsr         %a6@(FindTask)
385     move.l      %d0,%a0
386     move.l      %a0@(pr_ReturnAddr),%a0
387     lea.l       %a0@(-4),%sp
388     move.l      %d2,%d0
389     rts
391 BCPL multiply       /*  0c, D1 = D1 * D2 */
392     jsr %a5@(0x10)
393     BRTS
395 BCPL divide         /*  10, D1 = D1 / D2 */
396     jsr %a5@(0x12)
397     move.l      %a1@(4),%d2
398     BRTS
400 BCPL mod            /*  14, D1 = D1 % D2 */
401     jsr %a5@(0x12)
402     move.l      %d2,%d0 /* BRTS does move.l %d0,%d1 */
403     move.l      %a1@(4),%d2
404     BRTS
406 BCPL setIO          /*  18, void, @IOStdReq, command, &data, len, offset */
407     lsl.l       #2,%d1
408     move.w      %d2,%a0@(28,%d1)
409     move.l      %d3,%d0
410     lsl.l       #2,%d0
411     move.l      %d0,%a0@(40,%d1)
412     move.l      %d4,%a0@(36,%d1)
413     /* only first 4 params are in registers */
414     move.l      %a1@(4*4),%a0@(44,%d1)
415     BRTS
417 BCPL packlw         /*  20, LONG, &data, len */
418         movem.l %d2,%sp@-
419         moveq   #0,%d0
420 .packlw_loop:
421         lsl.l   #8,%d0
422         move.b  %a0@(%d1.l),%d0
423         addq.l  #1,%d1
424         subq.b  #1,%d2
425         bne.s   .packlw_loop
426         movem.l %sp@+,%d2
427     BRTS
429 BCPL unpacklw       /*  24, void, &data, len, LONG */
430         movem.l %d2/%d3,%sp@-
431 .unpacklw_loop:
432         rol.l   #8,%d3
433         move.b  %d3,%a0@(%d1.l)
434         addq.l  #1,%d1
435         subq.b  #1,%d2
436         bne.s   .unpacklw_loop
437         movem.l %sp@+,%d2/%d3
438     BRTS
440 BCPL Res2           /*  28, LONG, is_set_flag, result_code */
441     movem.l     %a0-%a1/%a6,%sp@-
442     move.l      %a2@(GV_DOSBase),%a6
443     tst.l       %d1
444     beq         .LRes2_get
445 .LRes2_set:
446     move.l      %d2,%d1
447     jsr         %a6@(77 * -6) /* DOS/SetIoErr */
448 .LRes2_get:
449     jsr         %a6@(22 * -6) /* DOS/IoErr */
450     movem.l     %sp@+,%a0-%a1/%a6
451     BRTS
453                      /*  30, BCPL_FrameLower */
455 BCPLd makeGVarea     /*  34, void, @buff */
456     BRTS
458 BCPL findtask        /*  38, &Process->MsgPort *, */
459     movem.l     %a0-%a1/%a6,%sp@-
460     move.l      SysBase,%a6
461     sub.l       %a1,%a1
462     jsr         %a6@(FindTask)
463     add.l       #92,%d0 /* point to &MsgPort */
464     movem.l     %sp@+,%a0-%a1/%a6
465     BRTS
467 BCPL getbyte        /*  3c, BYTE, @lw_addr, bytenum */
468     lsl.l       #2,%d1
469     add.l       %d2,%d1
470     moveq       #0,%d0
471     move.b      %a0@(%d1.l),%d0
472     BRTS
474 BCPL putbyte        /*  40, BYTE, @lw_addr, bytenum, byte */
475         lsl.l   #2,%d1
476         add.l   %d2,%d1
477         move.b  %d3,%a0@(%d1.l)
478     BRTS
480 BCPL level          /*  44, LONG (or BPTR?) */
481     move.l  %a1@(-12),%d0  /* Return caller's BCPL frame */
482     BRTS
484 BCPL longcall       /*  48, LONG, level, label */
485     move.l      %d1,%a1
486     move.l      %a1@(-4),%a4
487     jmp         %a0@(%d2.l)
489 BCPL allocMem       /*  4c, BPTR, lwlength, reqs */
490     movem.l     %a0-%a1/%a6,%sp@-
491     move.l      SysBase,%a6
492     move.l      %d1,%d0
493     addq.l      #4,%d0         /* 4 additional words for padding */
494     lsl.l       #2,%d0
495     move.l      %d2,%d1
496     bset.l      #16,%d1        /* MEMF_CLEAR */
497     jsr         %a6@(114 * -6) /* Exec/AllocVec() */
498     lsr.l       #2,%d0
499     movem.l     %sp@+,%a0-%a1/%a6
500     BRTS
502 BCPLd longjump       /*  50, LONG, label */
503     BRTS
505 BCPL doIO           /*  54, LONG, @IORequest */
506     movem.l     %a0-%a1/%a6,%sp@-
507     move.l      SysBase,%a6
508     lsl.l       #2,%d1
509     move.l      %d1,%a1
510     jsr         %a6@(76 * -6)   /* Exec/DoIO() */
511     ext.w       %d0
512     ext.l       %d0
513     movem.l     %sp@+,%a0-%a1/%a6
514     BRTS
516 BCPL sendIO         /*  58, void, @IORequest */
517     movem.l     %a0-%a1/%a6,%sp@-
518     lsl.l       #2,%d1
519     moveq.l     #0,%d2
520     move.l      %d2,%a0@(ln_Name,%d1)    /* NULL dos packet */
521     move.l      %d1, %a1
522     move.l      SysBase,%a6
523     jsr         %a6@(77 * -6)   /* Exec/SendIO */
524     movem.l     %sp@+,%a0-%a1/%a6
525     BRTS
527     /* Coroutine support:
528      * struct coroutine {
529      *      BPTR colist;
530      *      BPTR parent;
531      *      APTR frame;
532      *      APTR procedure;
533      */
534 BCPLd createco       /*  5c, void, @coroutine, lwlength */
535     BRTS
537 BCPLd deleteco       /*  60, void, @coroutine */
538     BRTS
540 BCPLd callco         /*  64, void, @coroutine, arg */
541     BRTS
543 BCPLd cowait         /*  68, void, result */
544     BRTS
546 BCPLd resumeco       /*  6c, void, @coroutine */
547     BRTS
549 BCPL installSeg     /*  70, BOOL, @memseg_BCPL */
550     movem.l     %a0-%a1,%sp@-
551     move.l      %a2,%sp@-
552     move.l      %d1,%sp@-
553     jsr         BCPL_InstallSeg
554     addq.l      #8,%sp
555     movem.l     %sp@+,%a0-%a1
556     BRTS
558 BCPL getvec         /*  74, LONG ^, lw_length */
559     movem.l     %a0-%a1/%a6,%sp@-
560     move.l      SysBase,%a6
561     move.l      %d1,%d0
562     addq.l      #1,%d0         /* extra long */
563     lsl.l       #2,%d0
564     moveq       #1,%d1
565     jsr         %a6@(114 * -6) /* Exec/AllocVec() */
566     lsr.l       #2,%d0
567     tst.l       %d0     /* If the result is NULL... */
568     bne         1f
569     move.l      %a2,%d1
570     tst.l       %d1     /* And we have a GlobVec... */
571     bne         1f
572     move.l      %a2@(GV_DOSBase),%a6
573     move.l      103,%d1 /* ERRROR_NO_FREE_STORE */
574     jsr         %a6@(77 * -6) /* DOS/SetIoErr */
575     clr.l       %d0
577     movem.l     %sp@+,%a0-%a1/%a6
578     BRTS
580 BCPL freevec        /*  78, void, @vec */
581     movem.l     %a0-%a1/%a6,%sp@-
582     move.l      SysBase,%a6
583     lsl.l       #2,%d1
584     move.l      %d1,%a1
585     jsr         %a6@(115 * -6) /* Exec/FreeVec() */
586     movem.l     %sp@+,%a0-%a1/%a6
587     BRTS
589 BCPL openDevice     /*  7c, BOOL, @IORequest, @name, unit, flags */
590     movem.l     %d5/%a0-%a1/%a6,%sp@-
591     move.l      SysBase,%a6
593 #if BCPLSTRINGDEBUG
594     move.l      %d2,%d0
595         bsr             bstr_debug
596 #endif
598     lsl.l       #2,%d1
599     move.l      %d1,%d5
601     sub.l       %a1,%a1
602     jsr         %a6@(FindTask)
603     
604     lsl.l       #2,%d2
605     addq.l      #1,%d2
606     move.l      %d2,%a0
607     move.l      %d5,%a1
608     add.l       #92,%d0
609     move.l      %d0,%a1@(14)    /* replyport = &Process->pr_MsgPort */
610     move.l      %d4,%d1
611     move.l      %d3,%d0
612     jsr         %a6@(74 * -6)   /* Exec/OpenDevice() */
613     moveq       #-1,%d1
614     tst.b       %d0
615     beq.s       od_ok
616     moveq       #0,%d1
617 od_ok:
618         move.l  %d1,%d0
619     movem.l     %sp@+,%d5/%a0-%a1/%a6
620     BRTS
622 BCPL closeDevice    /*  80, void, @IORequest */
623     movem.l     %a0-%a1/%a6,%sp@-
624     move.l      SysBase,%a6
625     lsl.l       #2,%d1
626     move.l      %d1,%a1
627     jsr         %a6@(75 * -6)   /* Exec/CloseDevice() */
628     movem.l     %sp@+,%a0-%a1/%a6
629     BRTS
631 BCPL createProcBCPL     /*  84, MessagePort *, @segarray, lw_stack_size, pri, @name,  */
632     movem.l     %a0-%a1/%a6,%sp@-
633     move.l      %a2@(GV_DOSBase),%a6
635     move.l      %d3,%sp@-
636     lsl.l       #2,%d2
637     move.l      %d2,%sp@-
638     lsl.l       #2,%d1
639     move.l      %d1,%sp@-
640     move.l      %d4,%d1
641     moveq.l     #4, %d0
642     bsr         bstr_to_cstr
643     move.l      %d1,%sp@-
644     move.l      %a6,%sp@-
645     jsr         BCPL_CreateProcBCPL
646     lea.l       %sp@(5 * 4),%sp
647     movem.l     %sp@+,%a0-%a1/%a6
648     BRTS
650 BCPL remProcess     /*  88, void */
651     jmp BCPL_Exit       /* TODO: Review if this is correct */
653 BCPL ParentDir      /*  8c, FileLock ^, @FileLock */
654     movem.l     %a0-%a1/%a6,%sp@-
655     move.l      %a2@(GV_DOSBase),%a6
656     jsr         %a6@(35 * -6)   /* DOS/ParentDir() */
657     movem.l     %sp@+,%a0-%a1/%a6
658     BRTS
660 BCPL setSignals     /*  90, void, &MsgPort, mask */
661     movem.l     %a0-%a1/%a6,%sp@-
662     move.l      SysBase,%a6
663     add.l       #mp_SigTask,%d1
664     move.l      %a0@(%d1),%a1
665     move.l      %d2,%d0
666     lsl.l       #8,%d0
667     lsl.l       #4,%d0                  /* shift to C-F signals */
668     and.l       #0xf000,%d0             /* mask only C-F signals */
669     jsr         %a6@(54 * -6)   /* Signal */
670     movem.l     %sp@+,%a0-%a1/%a6
671     BRTS
673 BCPL clearSignals   /* 94, BOOL , mask */
674     movem.l     %d2/%a0-%a1/%a6,%sp@-
675     move.l      SysBase,%a6
676     clr.l       %d0
677     lsl.l       #8,%d1
678     lsl.l       #4,%d1
679     and.l       #0xf000,%d1
680     move.l      %d1,%d2
681     jsr         %a6@(51 * -6)   /* SetSignal */
682     moveq       #0,%d1
683     and.l       %d2,%d0
684     beq.s       0f
685     moveq       #-1,%d1
686 0:      move.l  %d1,%d0
687     movem.l     %sp@+,%d2/%a0-%a1/%a6
688     BRTS
690 BCPL DOSAlert       /* 98, void, alertnumber */
691     movem.l     %d7/%a0-%a1/%a6,%sp@-
692     move.l      SysBase,%a6
693     move.l      %d1,%d7
694     jsr         %a6@(18 * -6)   /* Exec/Alert() */
695     movem.l     %sp@+,%d7/%a0-%a1/%a6
696     BRTS
698 BCPL findRootNode   /* 9c, RootNode @,  */
699     move.l      %a2@(GV_DOSBase),%d0
700     add.l       #dl_Root,%d0
701     move.l      %a0@(%d0),%d0   /* %a0 is always 0 in BCPL */
702     lsr.l       #2,%d0
703     BRTS
705 BCPL readinput      /* a0, bytelength , &buf, bytelength */
706     movem.l     %d1-%d3/%a0-%a1/%a6,%sp@-
707     move.l      %a2@(GV_DOSBase),%a6
708     move.l      %d2,%d3
709     move.l      %d1,%d2
710     jsr         %a6@(9 * -6)    /* DOS/Input() */
711     move.l      %d0,%d1
712     jsr         %a6@(7 * -6)    /* DOS/Read() */
713     movem.l     %sp@+,%d1-%d3/%a0-%a1/%a6
714     BRTS
716     /* Wait on the process's pr_MsgPort for a packet.
717      */
718 BCPL taskwait       /* a4, DosPacket @,  */
719     movem.l     %a0-%a1/%a6,%sp@-
720     move.l      %a2@(GV_DOSBase),%a6
721     jsr         %a6@(42 * -6)   /* Dos/WaitPkt() */
722     lsr.l       #2,%d0
723     movem.l     %sp@+,%a0-%a1/%a6
724     BRTS
726     /* When passed in, DosPacket's dp_Link points to
727      * an allocated, but empty, memory location. 
728      * Sent to the port of the current directory's handler.
729      */
730 BCPL putPkt         /* a8, void, @DosPacket */
731     movem.l     %a0-%a1/%a6,%sp@-
732     move.l      %a2@(GV_DOSBase),%a6
733     jsr         Dos_BCPL_putpkt
734     movem.l     %sp@+,%a0-%a1/%a6
735     BRTS
737 BCPL writeoutput    /* ac, void, &buf, bytelength */
738     movem.l     %d2-%d3/%a0-%a1/%a6,%sp@-
739     move.l      %a2@(GV_DOSBase),%a6
740     move.l      %d2,%d3
741     move.l      %d1,%d2
742     jsr         %a6@(10 * -6)   /* DOS/Output() */
743     move.l      %d0,%d1
744     jsr         %a6@(8 * -6)    /* DOS/Write() */
745     movem.l     %sp@+,%d2-%d3/%a0-%a1/%a6
746     BRTS
748     /* copy src LONG array to destination, LONG -> BYTE */
749 BCPL packstring     /* b0, long, @Array, @String */
750     movem.l     %d2-%d3/%a0-%a1,%sp@-
751 #if BCPLSTRINGDEBUG
752     move.l      %d2,%d3
753 #endif
754     lsl.l       #2,%d1
755     move.l      %d1,%a0
756     lsl.l       #2,%d2
757     move.l      %d2,%a1
758     moveq       #0,%d2
759     move.b      (3,%a0),%d2
760     move.l      %d2,%d0
761     lsr.w       #2,%d0
762 1:  move.l      (%a0)+,%d1
763     move.b      %d1,(%a1)+
764     dbf         %d2,1b
766 #if BCPLSTRINGDEBUG
767         move.l  %d0,%d2
768     move.l      %d3,%d0
769     bsr         bstr_debug
770     move.l      %d2,%d0
771 #endif
773     movem.l     %sp@+,%d2-%d3/%a0-%a1
774     BRTS
776     /* copy src BSTR to destination array, BYTE -> LONG */
777 BCPL unpackstring   /* b4, void, @String, @Array */
778     movem.l     %a0-%a1,%sp@-
780 #if BCPLSTRINGDEBUG
781     move.l      %d1,%d0
782     bsr         bstr_debug
783 #endif
785     lsl.l       #2,%d1
786     move.l      %d1,%a0
787     lsl.l       #2,%d2
788     move.l      %d2,%a1
789     moveq       #0,%d0
790     move.b      (%a0),%d0
791     moveq       #0,%d1
792 1:  move.b      (%a0)+,%d1
793     move.l      %d1,(%a1)+
794     dbf         %d0,1b
795     movem.l     %sp@+,%a0-%a1
796     BRTS
798 BCPLd holdTask       /* b8, void, @memseg */
799     BRTS
801 BCPL Delay          /* bc, void, ticks */
802     movem.l     %a0-%a1/%a6,%sp@-
803     move.l      %a2@(GV_DOSBase),%a6
804     jsr         %a6@(33 * -6)   /* DOS/Delay() */
805     movem.l     %sp@+,%a0-%a1/%a6
806     BRTS
808     /* Call the DOS internal 'dopacket' function
809      */
810 BCPL sendPacket     /* c0, BOOL, -, MsgPort, Type, -, -, Arg1,... */
811     movem.l     %a0-%a1/%a6,%sp@-
812     move.l      %a1@((4 + 7) * 4), %sp@-        /* Arg7 */
813     move.l      %a1@((4 + 6) * 4), %sp@-        /* Arg6 */
814     move.l      %a1@((4 + 5) * 4), %sp@-        /* Arg5 */
815     move.l      %a1@((4 + 4) * 4), %sp@-        /* Arg4 */
816     move.l      %a1@((4 + 3) * 4), %sp@-        /* Arg3 */
817     move.l      %a1@((4 + 2) * 4), %sp@-        /* Arg2 */
818     move.l      %a1@((4 + 1) * 4), %sp@-        /* Arg1 */
819     move.l      %d3, %sp@-                      /* Type */
820     move.l      %d2, %sp@-                      /* Port */
821     move.l      %a0, %sp@-                      /* A0 is still 0 */
822     jsr         dopacket
823     lea.l       %sp@(10 * 4), %sp
824     movem.l     %sp@+,%a0-%a1/%a6
825     BRTS
827 BCPL returnPacket   /* c4, void, @DosPacket, res1, res2 */
828     tst.l       %d1     /* Don't try to reply NULL Dos Packets */
829     beq.s       0f
830     movem.l     %a0-%a1/%a6,%sp@-
831     move.l      %a2@(GV_DOSBase),%a6
832     lsl.l       #2, %d1
833     jsr         %a6@(43 * -6)   /* DOS/ReplyPkt() */
834     movem.l     %sp@+,%a0-%a1/%a6
836     BRTS
838 #define TAG_END 0
839 #define TAG_USER        (1 << 31)
840 #define WA_Dummy        (TAG_USER + 99)
841 #define WA_Left         (WA_Dummy + 1)
842 #define WA_Top          (WA_Dummy + 2)
843 #define WA_Width        (WA_Dummy + 3)
844 #define WA_Height       (WA_Dummy + 4)
845 #define WA_Title        (WA_Dummy + 11)
846 #define WA_PubScreen    (WA_Dummy + 22)
847 #define WA_AutoAdjust   (WA_Dummy + 45)
849 BCPL openWindow     /* c8, struct Window *, leftedge, topedge, width, height, @title */
850         movem.l %a0-%a1/%a6,%sp@-
851         move.l  %a2@(GV_DOSBase),%a6
852         move.l  %a6@(dl_IntuitionBase),%a6
853         move.l  #TAG_END, %sp@-
854         move.l  #-1, %sp@-
855         move.l  #WA_AutoAdjust, %sp@-
856         move.l  %a0, %sp@-
857         move.l  #WA_PubScreen, %sp@-
858         move.l  %a1@(4*4),%sp@-
859         move.l  #WA_Title, %sp@-
860         move.l  %d4, %sp@-
861         move.l  #WA_Height, %sp@-
862         move.l  %d3, %sp@-
863         move.l  #WA_Width, %sp@-
864         move.l  %d2, %sp@-
865         move.l  #WA_Top, %sp@-
866         move.l  %d1, %sp@-
867         move.l  #WA_Left, %sp@-
868         move.l  %sp, %a1                        /* a0 is still 0 here */
869         jsr             %a6@(101 * -6)          /* OpenWindowTagList */
870         lea.l   %sp@(15 * 4),%sp
871         movem.l %sp@+,%a0-%a1/%a6
872     BRTS
874     /* If BOOL is DOSTRUE, set current directory
875      * Always return old current directory
876      */
877 BCPL setCurrentDir  /* cc, FileLock @, BOOL, @FileLock */
878     movem.l     %d3-%d4/%a0-%a1/%a6,%sp@-
880         move.l  %d1,%d3
882     move.l      SysBase,%a6
883     sub.l       %a1,%a1
884     jsr         %a6@(FindTask)
885     move.l      %d0,%a0
886     /* sanity check in CurrentDir() complained so I did this */
887     move.l      %a0@(152),%d4   /* pr_CurrentDir */
889     tst.l       %d3
890     beq.s       0f
892     move.l      %a2@(GV_DOSBase),%a6
893     move.l      %d2,%d1
894     jsr         %a6@(21 * -6)   /* DOS/CurrentDir() */
896         move.l  %d4,%d0
897     movem.l     %sp@+,%d3-%d4/%a0-%a1/%a6
898     BRTS
900 BCPLd systemRequest  /* d0, void, @line1, @line2, @line3 */
901     BRTS
903 BCPL writet         /* d4, void, @string, n */
904     movem.l     %d2-%d4,%sp@-
905     move.l      %d1, %d3
906     lsl.l       #2, %d3         /* D3 = BADDR(string) */
907     clr.l       %d4
908     move.b      %a0@(%d3),%d4   /* D4 = string[0] (strlen) */
909     tst.l       %d4
910     beq         .LBCPL_writet_pad
912     bra         .LBCPL_writet_loop_cond
914 .LBCPL_writet_loop:
915     addq.l      #1,%d3          /* D3 = pointer to next char */
916     subq.l      #1,%d2          /* D2 = reduce pad amount by 1 */
917     move.l      #(3*4 + 1*4),%d0
918     clr.l       %d1
919     move.b      %a0@(%d3),%d1   /* D1 = next char */
920     move.l      %a2@(GV_wrch), %a4
921     jsr         (%a5)
922 .LBCPL_writet_loop_cond:
923     dbf         %d4,.LBCPL_writet_loop
925 .LBCPL_writet_pad:
926     tst.l       %d2
927     ble         .LBCPL_writet_exit
928     bra         .LBCPL_writet_pad_cond
930 .LBCPL_writet_pad_loop:
931     move.l      #(3*4 + 2*4),%d0
932     moveq.l     #' ',%d1
933     move.l      %a2@(GV_wrch), %a4
934     jsr         (%a5)
935 .LBCPL_writet_pad_cond:
936     dbf         %d2,.LBCPL_writet_pad_loop
938 .LBCPL_writet_exit:
939     movem.l     %sp@+,%d2-%d4
940     BRTS
942 BCPLnd rdch           /* d8, char ,  */
943     movem.l     %a0-%a1/%a6,%sp@-
944     move.l      %a2@(GV_DOSBase),%a6
945     jsr         %a6@(9 * -6)    /* DOS/Input() */
946     move.l      %d0, %d1
947     jsr         %a6@(51 * -6)   /* DOS/FGetC() */
948     movem.l     %sp@+,%a0-%a1/%a6
949     BRTSnd
951 BCPL unrdch         /* dc, void,  */
952     movem.l     %d2/%a0-%a1/%a6,%sp@-
953     move.l      %a2@(GV_DOSBase),%a6
954     jsr         %a6@(9 * -6)    /* DOS/Input() */
955     move.l      %d0, %d1
956     moveq       #-1,%d2
957     jsr         %a6@(53 * -6)   /* DOS/UnGetC() */
958     movem.l     %sp@+,%d2/%a0-%a1/%a6
959     BRTS
961 BCPLnd wrch           /* e0, void, char */
962     movem.l     %d2/%a0-%a1/%a6,%sp@-
963     move.l      %a2@(GV_DOSBase),%a6
964     move.l      %d1, %d2
965     jsr         %a6@(10 * -6)   /* DOS/Output() */
966     move.l      %d0, %d1
967     jsr         %a6@(52 * -6)   /* DOS/FPutC() */
968     movem.l     %sp@+,%d2/%a0-%a1/%a6
969     BRTSnd
971 BCPL readinput_long   /* e4, lwlength , @buf, lwlength */
972     movem.l     %d1-%d3/%a0-%a1/%a6,%sp@-
973     move.l      %a2@(GV_DOSBase),%a6
974     move.l      %d2,%d3
975     move.l      %d1,%d2
976     jsr         %a6@(9 * -6)    /* DOS/Input() */
977     move.l      %d0,%d1
978     lsl.l       #2,%d2
979     lsl.l       #2,%d3
980     jsr         %a6@(7 * -6)    /* DOS/Read() */
981     asr.l       #2,%d0
982     movem.l     %sp@+,%d1-%d3/%a0-%a1/%a6
983     BRTS
985 BCPL writeoutput_long /* e8, void, @buf, lwlength */
986     movem.l     %d2-%d4/%a0-%a1/%a6,%sp@-
987     move.l      %a2@(GV_DOSBase),%a6
988     move.l      %d2, %d4        /* Num blocks */
989     moveq.l     #4, %d3         /* Block len (sizeof(ULONG)) */
990     move.l      %d1, %d2        /* Buffer */
991     lsl.l       #2, %d2
992     jsr         %a6@(10 * -6)   /* DOS/Output() */
993     move.l      %d0, %d1        /* Outfile */
994     jsr         %a6@(55 * -6)   /* DOS/FWrite() */
995     movem.l     %sp@+,%d2-%d4/%a0-%a1/%a6
996     BRTS
998 BCPL findinput      /* ec, FileHandle ^, @name */
999     movem.l     %d2/%a0-%a1/%a6,%sp@-
1001 #if BCPLSTRINGDEBUG
1002     move.l      %d1,%d0
1003     bsr         bstr_debug
1004 #endif
1006     moveq.l     #1, %d0
1007     bsr         bstr_to_cstr
1009     move.l      %a2@(GV_DOSBase),%a6
1010     move.l      #1005 /* MODE_OLDFILE */,%d2
1011     jsr         %a6@(5 * -6)    /* DOS/Open() */
1012     movem.l     %sp@+,%d2/%a0-%a1/%a6
1013     BRTS
1015 BCPL findoutput     /* f0, FileHandle ^, @name */
1016     movem.l     %d2/%a0-%a1/%a6,%sp@-
1017   
1018 #if BCPLSTRINGDEBUG
1019     move.l      %d1,%d0
1020     bsr         bstr_debug
1021 #endif
1023     moveq.l     #1, %d0
1024     bsr         bstr_to_cstr
1026     move.l      %a2@(GV_DOSBase),%a6
1027     move.l      #1006 /* MODE_NEWFILE */,%d2
1028     jsr         %a6@(5 * -6)    /* DOS/Open() */
1029     movem.l     %sp@+,%d2/%a0-%a1/%a6
1030     BRTS
1032 BCPL SelectInput    /* f4, void , @FileHandle */
1033     movem.l     %a0-%a1/%a6,%sp@-
1034     move.l      %a2@(GV_DOSBase),%a6
1035     jsr         %a6@(49 * -6)   /* DOS/SelectInput() */
1036     movem.l     %sp@+,%a0-%a1/%a6
1037     BRTS
1039 BCPL SelectOutput   /* f8, void , @FileHandle */
1040     movem.l     %a0-%a1/%a6,%sp@-
1041     move.l      %a2@(GV_DOSBase),%a6
1042     jsr         %a6@(50 * -6)   /* DOS/SelectOutput() */
1043     movem.l     %sp@+,%a0-%a1/%a6
1044     BRTS
1046 BCPL endread        /* fc, void,  */
1047     movem.l     %a0-%a1/%a6,%sp@-
1048     move.l      %a2@(GV_DOSBase),%a6
1049     jsr         %a6@(9 * -6)    /* DOS/Input() */
1050     move.l      %d0,%d1
1051     jsr         %a6@(6 * -6)    /* DOS/Close() */
1052     moveq.l     #0,%d1
1053     jsr         %a6@(49 * -6)   /* DOS/SelectInput() */
1054     movem.l     %sp@+,%a0-%a1/%a6
1055     BRTS
1057 BCPL endwrite       /* 100, void,  */
1058     movem.l     %a0-%a1/%a6,%sp@-
1059     move.l      %a2@(GV_DOSBase),%a6
1060     jsr         %a6@(10 * -6)   /* DOS/Output() */
1061     move.l      %d0,%d1
1062     jsr         %a6@(6 * -6)    /* DOS/Close() */
1063     moveq.l     #0,%d1
1064     jsr         %a6@(50 * -6)   /* DOS/SelectOutput() */
1065     movem.l     %sp@+,%a0-%a1/%a6
1066     BRTS
1068 BCPL Input          /* 104, FileHandle @,  */
1069     movem.l     %a0-%a1/%a6,%sp@-
1070     move.l      %a2@(GV_DOSBase),%a6
1071     jsr         %a6@(9 * -6)    /* DOS/Input() */
1072     movem.l     %sp@+,%a0-%a1/%a6
1073     BRTS
1075 BCPL Output         /* 108, FileHandle @,  */
1076     movem.l     %a0-%a1/%a6,%sp@-
1077     move.l      %a2@(GV_DOSBase),%a6
1078     jsr         %a6@(10 * -6)   /* DOS/Output() */
1079     movem.l     %sp@+,%a0-%a1/%a6
1080     BRTS
1082 BCPL readn          /* 10c, void,  */
1083     /* no dos.library equivalent for this :(
1084      * ignore all whitespace at the beginning
1085      * converts ascii to decimal
1086      */
1087     movem.l     %d2-%d7/%a0-%a1/%a6,%sp@-
1088     move.l      %a2@(GV_DOSBase),%a6
1089     jsr         %a6@(9 * -6) /* DOS/Input() */
1090     move.l      %d0,%d6
1091     moveq       #0,%d4 /* val */
1092     moveq       #0,%d5 /* neg */
1093     moveq       #10,%d3
1094     moveq       #0,%d7
1096 .readn_ws:
1097     move.l      %d6,%d1
1098     jsr         %a6@(51 * -6) /* DOS/FGetC() */
1099     move.l      %d0,%d2
1100     cmp.b       #' ',%d2
1101     beq.s       .readn_ws
1102     cmp.b       #'\t',%d2
1103     beq.s       .readn_ws
1104     cmp.b       #'\n',%d2
1105     beq.s       .readn_ws
1106     cmp.b       #'+',%d2
1107     beq.s       .readn_ch
1108     cmp.b       #'-',%d2
1109     bne.s       .readn_ch2
1110     moveq       #1,%d5
1111     bra.s       .readn_ch
1112 .readn_ch2:
1113     cmp.b       #'0',%d2
1114     bcs.s       .readn_end
1115     cmp.b       #'9',%d2
1116     bhi.s       .readn_end
1117     move.l  %d3, %sp@-
1118     move.l  %d4, %sp@-
1119     jsr     __mulsi3
1120     addq.l      #8,%sp
1121     move.l      %d0,%d4
1122     moveq       #0,%d0
1123     move.b      %d2,%d0
1124     sub.b       #'0',%d0
1125     add.l       %d0,%d4
1126 .readn_ch:
1127     moveq       #1,%d7 /* got at least one digit */
1128     move.l      %d6,%d1
1129     jsr         %a6@(51 * -6) /* DOS/FGetC() */
1130     move.l      %d0,%d2
1131     bra.s       .readn_ch2
1133 .readn_end: 
1134     move.l      %d6,%d1
1135     jsr         %a6@(53 * -6) /* DOS/UnGetC() */
1137     moveq       #-1,%d1
1138     tst.b       %d7
1139     beq.s       .readn_fail
1140     moveq       #0,%d1
1141 .readn_fail:
1142     jsr         %a6@(77 * -6) /* DOS/SetIoErr() */
1144     tst.b       %d5 /* negative? */
1145     beq.s       .readn_nneg
1146     neg.l       %d4
1147 .readn_nneg:
1148     move.l      %d4,%d0
1149     movem.l     %sp@+,%d2-%d7/%a0-%a1/%a6
1150     BRTS
1152 BCPL newline        /* 110, void,  */
1153     moveq.l     #'\n',%d1
1154     jmp         BCPL_wrch
1156 BCPL_write_base:        /* number, width, base, canneg */
1157     movem.l     %d2-%d7,%sp@-
1159     move.l      %d3,%d6         /* D6 = base */
1160     move.l      %d2,%d5         /* D5 = width */
1161     move.l      %d1,%d3         /* D3 = Number */
1162     moveq       #0,%d7
1164     tst.l       %d4
1165     beq         .Lwrite_base_pos
1167     tst.l       %d3             /* Number < 0? */
1168     bge         .Lwrite_base_pos
1170     bset        #31,%d7 /* D7 bit 31 = negative sign needed */
1171     neg.l       %d3
1172     subq.l      #1,%d5
1174 .Lwrite_base_pos:
1175     clr.l       %d4             /* D4 = Digit */
1176     clr.w       %d7             /* D7 = Num pushed chars */
1178 .Lwrite_base_loop:
1179     move.l      %d3,%d1
1180     move.l      %d6,%d2
1181     jsr         %a5@(0x12)      /* divmod: D1 = D3/base, D2 = D3 % base */
1182     move.l      %d1, %d3
1184     /* Push char */
1185     move.l      %d2, %d1
1186     cmp.b       #10, %d1
1187     blt         0f
1188     add.b       #(('A'-10)-'0'),%d1
1190     add.b       #'0',%d1        /* D1 = '0' .. '9' */
1191     move.b      %d1, %a1@(3*4 + 4*4, %d7.w)
1192     addq.w      #1, %d7
1193     subq.l      #1, %d5
1194     tst.l       %d3
1195     bgt.s       .Lwrite_base_loop
1197     /* Any extra field bits? */
1198     bra         .LBCPL_write_base_pad_cond
1199 .LBCPL_write_base_pad:
1200     moveq       #' ',%d1
1201     cmp.b       #10,%d6
1202     beq.s       .LBCPL_write_base_pad_char
1203     moveq       #'0',%d1
1204 .LBCPL_write_base_pad_char:
1205     move.l      #(3*4 + 4*4 + 8*4), %d0
1206     move.l      %a2@(GV_wrch), %a4
1207     jsr         (%a5)
1208 .LBCPL_write_base_pad_cond:
1209     subq.l      #1,%d5
1210     bpl.s       .LBCPL_write_base_pad
1212         btst    #31,%d7
1213         beq.s   .Lwrite_base_emit
1214     /* Negative sign */
1215     move.l      #'-',%d1
1216     move.l      #(3*4 + 4*4 + 8*4), %d0
1217     move.l      %a2@(GV_wrch), %a4
1218     jsr         (%a5)
1220     /* Write chars */
1221 .Lwrite_base_emit:
1222     subq.w      #1, %d7
1223     bmi.s       0f
1224     clr.l       %d1
1225     move.b      %a1@(3*4 + 4*4, %d7.w),%d1
1226     move.l      #(3*4 + 4*4 + 8*4), %d0
1227     move.l      %a2@(GV_wrch), %a4
1228     jsr         (%a5)
1229     jmp         .Lwrite_base_emit
1232     movem.l     %sp@+,%d2-%d7
1233     BRTS
1235 BCPL writei         /* 114, void, number, width */
1236     movem.l     %d3-%d4,%sp@-
1238     move.l      #(3*4 + 2*4), %d0
1239     move.l      #10,%d3
1240     move.l      #-1,%d4
1241     lea.l       BCPL_write_base, %a4
1242     jsr         (%a5)
1244     movem.l     %sp@+,%d3-%d4
1245     BRTS
1247 BCPL writen         /* 118, void, number */
1248     movem.l     %d2-%d4,%sp@-
1250     move.l      #(3*4 + 1*4), %d0
1251     clr.l       %d2
1252     move.l      #10,%d3
1253     move.l      #-1,%d4
1254     lea.l       BCPL_write_base, %a4
1255     jsr         (%a5)
1257     movem.l     %sp@+,%d2-%d4
1258     BRTS
1260 BCPL writehex       /* 11c, void, number, width */
1261     movem.l     %d3-%d4,%sp@-
1263     move.l      #(3*4 + 2*4), %d0
1264     move.l      #16,%d3
1265     clr.l       %d4
1266     lea.l       BCPL_write_base, %a4
1267     jsr         (%a5)
1269     movem.l     %sp@+,%d3-%d4
1270     BRTS
1272 BCPL writeoct       /* 120, void, number, width */
1273     movem.l     %d3-%d4,%sp@-
1275     move.l      #(3*4 + 2*4), %d0
1276     move.l      #8,%d3
1277     clr.l       %d4
1278     lea.l       BCPL_write_base, %a4
1279     jsr         (%a5)
1281     movem.l     %sp@+,%d3-%d4
1282     BRTS
1284 BCPL writes         /* 124, void, @string */
1285     move.l      %d2,%sp@-
1286     clr.l       %d2
1287     move.l      #(3*4 + 1*4),%d0
1288     move.l      %a2@(GV_writet), %a4
1289     jsr         (%a5)
1290     move.l      %sp@+,%d2
1291     BRTS
1293 #if 0 /* This is defined in bcpl_writef.S */
1294 BCPLd writef         /* 128, void, @format, arg1, arg2, ... */
1295     BRTS
1296 #endif
1298 BCPL toupper        /* 12c, void, char */
1299     move.l      %d1,%d0
1300     cmp.b       #'a',%d0
1301     bcs.s       1f
1302     cmp.b       #'z',%d0
1303     bhi.s       1f
1304     bclr        #5,%d0
1305 1:  BRTS
1307 BCPL charicmp        /* 130, long , char1, char2 */
1308     move.l      %d2,%d0
1309     cmp.b       #'a',%d0
1310     bcs.s       1f
1311     cmp.b       #'z',%d0
1312     bhi.s       1f
1313     bclr        #5,%d0
1314 1:  cmp.b       #'a',%d1
1315     bcs.s       2f
1316     cmp.b       #'z',%d1
1317     bhi.s       2f
1318     bclr        #5,%d1
1319 2:  exg         %d1,%d0
1320         sub.l   %d1,%d0
1321     BRTS
1323 BCPL stricmp         /* 134, long , @String1, @String2 */
1324     movem.l     %d1-%d3/%a0-%a1,%sp@-
1326 #if BCPLSTRINGDEBUG
1327     move.l      %d1,%d0
1328         bsr             bstr_debug
1329         move.l  %d2,%d0
1330         bsr             bstr_debug
1331 #endif
1333     lsl.l       #2,%d1
1334     move.l      %d1,%a0
1335     lsl.l       #2,%d2
1336     move.l      %d2,%a1
1337     move.b      %a0@+,%d2
1338     move.b      %a1@+,%d3
1339     moveq       #0,%d0
1340 sicmp1:
1341     tst.b       %d2
1342     beq.b       sicmp2
1343     tst.b       %d3
1344     beq.b       sicmp2
1345     subq.b      #1,%d2
1346     subq.b      #1,%d3
1348     moveq       #0,%d0
1349     move.b      %a0@+,%d0
1350     cmp.b       #'a',%d0
1351     bcs.s       sicmp3
1352     cmp.b       #'z',%d0
1353     bhi.s       sicmp3
1354     bclr        #5,%d0
1355 sicmp3:
1356     moveq       #0,%d1
1357     move.b      %a1@+,%d1
1358     cmp.b       #'a',%d1
1359     bcs.s       sicmp4
1360     cmp.b       #'z',%d1
1361     bhi.s       sicmp4
1362     bclr        #5,%d1
1363 sicmp4:
1364     sub.l       %d1,%d0
1365     beq.s       sicmp1
1366         bra.s   sicmp0
1367 sicmp2:
1368         cmp.b   %d2,%d3
1369         beq.s   sicmp0
1370         moveq   #-1,%d0
1371         tst.b   %d2
1372         beq.s   sicmp0
1373         moveq   #1,%d0
1374 sicmp0:
1375         movem.l %sp@+,%d1-%d3/%a0-%a1
1376     BRTS
1378 BCPL rdargs         /* 138, ULONG, @template, array, array_size */
1379     /* BCPL rdargs and DOS/ReadArgs() don't match up
1380      *      very nicely. We'll need to call a BCPL/ReadArgs
1381      *      routine that works the way this expects
1382      */
1383     movem.l     %a0-%a1/%a6,%sp@-
1384     move.l      %a2@(GV_DOSBase),%a6
1385     jsr         BCPL_ReadArgs
1386     movem.l     %sp@+,%a0-%a1/%a6
1387     BRTS
1389 BCPL rditem         /* 13c, void, @buf, maxlongs  */
1390     movem.l     %d2-%d3/%a0-%a2/%a6,%sp@-
1391     move.l      %a2@(GV_DOSBase),%a6
1392     lsl.l       #2,%d1
1393     addq.l      #1,%d1
1394     move.l      %d1,%a2
1395     clr.b       %a2@
1396     lsl.l       #2,%d2
1397     subq.l      #1,%d2
1398     moveq       #0,%d3
1399     /* this can't be right but at least c:execute does something now */
1400     jsr         %a6@(135 * -6)  /* DOS/ReadItem() */
1402     move.l      %a2,%a0
1403     moveq       #-1,%d2
1404 0:  addq.w      #1,%d2
1405     tst.b       %a0@+
1406         bne             0b
1407         move.b  %d2,%a2@(-1)    /* fix buf BSTR length */
1409 #if BCPLSTRINGDEBUG
1410     move.l      %d0,%d2
1411     lea.l       %a2@(-1),%a2
1412     move.l      %a2,%d0
1413     lsr.l       #2,%d0
1414     bsr         bstr_debug
1415     move.l      %d2,%d0
1416 #endif
1418     movem.l     %sp@+,%d2-%d3/%a0-%a2/%a6
1419     BRTS
1421 BCPL subString      /* 140, void, @string, @substring */
1423     movem.l     %d2-%d3/%a0-%a6,%sp@-
1424     move.l      SysBase,%a6
1425     move.l      %a2@(GV_DOSBase),%a5
1427 #if BCPLSTRINGDEBUG
1428     move.l      %d1,%d0
1429         bsr             bstr_debug
1430         move.l  %d2,%d0
1431         bsr             bstr_debug
1432 #endif
1434     moveq       #0,%d3
1436     lsl.l       #2,%d1
1437     move.l      %d1,%a2
1438     lsl.l       #2,%d2
1439     move.l      %d2,%a3
1441         moveq   #0,%d0
1442         move.b  (%a2),%d0
1443         moveq   #0,%d1
1444         move.b  (%a3),%d1
1445         add.l   %d1,%d0
1446         addq.l  #2,%d0
1447         moveq   #1,%d1
1448         jsr             %a6@(114 * -6)  /* AllocVec */
1449         move.l  %d0,%a4
1450         tst.l   %d0
1451         beq.s   findarg_end
1452         move.l  %a4,%a0
1454         move.l  %a0,%d1
1455         move.b  %a2@+,%d0
1456 findarg_copy12:
1457         beq.s   findarg_copy11
1458         move.b  %a2@+,%a0@+
1459         subq.b  #1,%d0
1460         bra.s   findarg_copy12
1461 findarg_copy11:
1462         clr.b   %a0@+
1464         move.l  %a0,%d2
1465     move.b      %a3@+,%d0
1466 findarg_copy22:
1467         beq.s   findarg_copy21
1468         move.b  %a3@+,%a0@+
1469         subq.b  #1,%d0
1470         bra.s   findarg_copy22
1471 findarg_copy21:
1472     clr.b       %a0@+
1474         exg             %a5,%a6
1475     jsr         %a6@(134 * -6)  /* DOS/FindArg() */
1476     exg         %a5,%a6
1477         move.l  %d0,%d3
1479 findarg_end:
1480         move.l  %a4,%a1
1481         jsr             %a6@(115 * -6)  /* FreeVec */
1483         move.l  %d3,%d0
1484     movem.l     %sp@+,%d2-%d3/%a0-%a6
1485     BRTS
1487         /* C:Resident uses this */
1488 BCPL load           /* 144, SegList ^, @filename */
1489     movem.l     %a0-%a1/%a6,%sp@-
1490     move.l      %a2@(GV_DOSBase),%a6
1492 #if BCPLSTRINGDEBUG
1493     move.l      %d1,%d0
1494         bsr             bstr_debug
1495 #endif
1497     moveq       #1,%d0
1498     bsr         bstr_to_cstr
1499     jsr         %a6@(25 * -6)   /* DOS/LoadSeg() */
1500     movem.l     %sp@+,%a0-%a1/%a6
1501     BRTS
1503 BCPL UnLoadSeg      /* 148, void, @seg */
1504     movem.l     %a0-%a1/%a6,%sp@-
1505     move.l      %a2@(GV_DOSBase),%a6
1506     jsr         %a6@(26 * -6)   /* DOS/UnLoadSeg */
1507     movem.l     %sp@+,%a0-%a1/%a6
1508     BRTS
1510 BCPLd tidyup         /* 150, void,  */
1511     BRTS
1513 BCPL addDevice      /* 154, void, @name */
1514     movem.l     %d2/%a0-%a1/%a6,%sp@-
1515     move.l      %a2@(GV_DOSBase),%a6
1517 #if BCPLSTRINGDEBUG
1518     move.l      %d1,%d0
1519         bsr             bstr_debug
1520 #endif
1522     moveq.l     #1,%d0
1523     bsr         bstr_to_cstr
1524     moveq       #0,%d2                  /* DLT_DEVICE */
1525     jsr         %a6@(116 * -6)  /* DOS/MakeDosEntry */
1526     move.l      %d0,%d2
1527     beq.s       0f
1528     move.l      %d2,%d1
1529     lsr.l       #2,%d2
1530     jsr         %a6@(113 * -6)  /* DOS/AddDosEntry */
1531     move.l      %d0,%d1
1532     bne.s       0f
1533     jsr         %a6@(117 * -6)  /* DOS/FreeDosEntry */
1534     moveq       #0,%d2
1535 0:      move.l  %d2,%d0
1536     movem.l     %sp@+,%d2/%a0-%a1/%a6
1537     BRTS
1539 BCPL datestamp      /* 158, @DateStamp, @DateStamp */
1540     movem.l     %a0-%a1/%a6,%sp@-
1541     lsl.l       #2,%d1
1542     move.l      %a2@(GV_DOSBase),%a6
1543     jsr.l       %a6@(32 * -6)   /* DOS/DateStamp() */
1544     lsr.l       #2,%d0
1545     movem.l     %sp@+,%a0-%a1/%a6
1546     BRTS
1548 BCPLd WaitForChar    /* 15c, BOOL , @FileHandle, time */
1549     BRTS
1551 BCPL execLib        /* 160, long , LVOffset, d0, d1, a0, a1, a2 */
1552     movem.l     %d2/%a0-%a3/%a6,%sp@-
1553     move.l      SysBase,%a6
1554     move.l      %a1,%a3
1555     move.w      %d1,%d2
1556     movem.l %a3@(4),%d0-%d1/%a0-%a2
1557     jsr         %a6@(%d2.w)
1558     movem.l     %sp@+,%d2/%a0-%a3/%a6
1559     BRTS
1561 BCPL findSegArray   /* 164, Array @,  */
1562     movem.l     %a0-%a1/%a6,%sp@-
1563     sub.l       %a1,%a1
1564     move.l      SysBase,%a6
1565     jsr         FindTask(%a6)
1566     move.l      %d0,%a0
1567     move.l      %a0@(pr_SegList),%d0
1568     movem.l     %sp@+,%a0-%a1/%a6
1569     BRTS
1571 BCPL deleteObject   /* 168, void, @name */
1572     movem.l     %a0-%a1/%a6,%sp@-
1573     moveq       #1,%d0
1574     bsr         bstr_to_cstr
1575     move.l      %a2@(GV_DOSBase),%a6
1576     jsr         %a6@(12 * -6)   /* DOS/DeleteFile() */
1577     movem.l     %sp@+,%a0-%a1/%a6
1578     BRTS
1580 BCPL rename         /* 16c, void, @oldname, @newname */
1581     movem.l     %d2/%a0-%a2/%a6,%sp@-
1582     move.l      %a2@(GV_DOSBase),%a6
1583     moveq       #1,%d0
1584     bsr         bstr_to_cstr
1585     lea         %sp@(-256),%sp
1586     move.l      %sp,%a2
1587     move.l      %a2,%a1
1588     move.l      %d1,%a0
1589 0:  move.b      %a0@+,%a1@+
1590     bne.s       0b
1591     move.l      %d2,%d1
1592     moveq       #1,%d0
1593     bsr         bstr_to_cstr
1594     move.l      %d1,%d2
1595     move.l      %a2,%d1
1596     jsr         %a6@(13 * -6)   /* DOS/Rename() */
1597     lea         %sp@(256),%sp
1598     movem.l     %sp@+,%d2/%a0-%a2/%a6
1599     BRTS
1601 /*      170 - contains APTR to IntuitionBase */
1603 BCPL Close          /* 174, void, @FileHandle */
1604     movem.l     %a0-%a1/%a6,%sp@-
1605     move.l      %a2@(GV_DOSBase),%a6
1606     jsr         %a6@(6 * -6)    /* DOS/Close() */
1607     movem.l     %sp@+,%a0-%a1/%a6
1608     BRTS
1610 BCPL getword        /* 178, void, longaddress, wordnumber */
1611         movem.l %sp@+,%d2
1612         lsl.l   #2,%d1
1613         add.l   %d2,%d2
1614         add.l   %d1,%d2
1615         moveq   #0,%d0
1616     move.w      %a0@(%d2.l),%d0
1617         movem.l %sp@+,%d2
1618     BRTS
1620 BCPL putword        /* 17c, void, longaddress, wordnumber */
1621         movem.l %sp@+,%d2
1622         lsl.l   #2,%d1
1623         add.l   %d2,%d2
1624         add.l   %d1,%d2
1625         move.w  %d3,%a0@(%d2.l)
1626         movem.l %sp@+,%d2
1627     BRTS
1628                      /* 180, ??? */
1630 BCPLd taskwait_190   /* 190, DosPacket ^,  */
1631     jmp BCPL_taskwait
1633 BCPL execute        /* 194, void, &string , @in, @out */
1634     movem.l     %a0-%a1/%a6,%sp@-
1635     move.l      %a2@(GV_DOSBase),%a6
1636     jsr         %a6@(37 * -6)   /* DOS/Execute() */
1637     movem.l     %sp@+,%a0-%a1/%a6
1638     BRTS
1640 BCPL deviceproc     /* 198, FileLock ^, @filename */
1641     movem.l     %a0-%a1/%a6,%sp@-
1642     move.l      %a2@(GV_DOSBase),%a6
1644     moveq.l     #1, %d0
1645     bsr         bstr_to_cstr
1647     jsr         %a6@(29 * -6)   /* DOS/DeviceProc() */
1648     movem.l     %sp@+,%a0-%a1/%a6
1649     BRTS
1651 BCPL libcall        /* 19c, void, libbase, LVOffset, d0, d1, a0, a1 */
1652     movem.l     %a0-%a1/%a6,%sp@-
1653     move.l      %d1,%a6
1654     move.l      %a1@(0x08),%d0
1655     move.l      %a1@(0x0c),%d1
1656     move.l      %a1@(0x10),%a0
1657     move.l      %a1@(0x14),%a1
1658     jsr         %a6@(%d2)
1659     movem.l     %sp@+,%a0-%a1/%a6
1660     BRTS
1662 BCPL writeErr           /* 1a0, void, LONG, BSTR */
1663     /* oddly enough D2 points to BSTR name of the command
1664      * which seems to be ignored.
1665      */
1666     movem.l     %d2/%a0-%a1/%a6,%sp@-
1667     tst.l       %d1
1668     beq.s       1f
1669     moveq       #0,%d2
1670     move.l      %a2@(GV_DOSBase),%a6
1671     jsr         %a6@(-0x1da)    /* PrintFault */
1672     tst.l       %d0
1673     beq.s       0f
1674 1:  moveq       #-1,%d0
1675 0:  movem.l     %sp@+,%d2/%a0-%a1/%a6
1676     BRTS
1678 BCPL findConsoleHandler /* 1a4, MsgPort *,  */
1679     movem.l     %a0-%a1/%a6,%sp@-
1680     move.l      SysBase,%a6
1681     sub.l       %a1,%a1
1682     jsr         %a6@(FindTask)
1683     move.l      %d0,%a0
1684     move.l      %a0@(pr_ConsoleTask),%d0
1685     movem.l     %sp@+,%a0-%a1/%a6
1686     BRTS
1688 BCPL findFileHandler    /* 1a8, MsgPort *,  */
1689     movem.l     %a0-%a1/%a6,%sp@-
1690     move.l      SysBase,%a6
1691     sub.l       %a1,%a1
1692     jsr         %a6@(FindTask)
1693     move.l      %d0,%a0
1694     move.l      %a0@(pr_FileSystemTask),%d0
1695     movem.l     %sp@+,%a0-%a1/%a6
1696     BRTS
1698 BCPL extractDeviceName  /* 1ac, void, @buf, separator, @name , oldpos */
1699     movem.l     %d1-%d5/%a0-%a1/%a6,%sp@-
1700     move.l      %a2@(GV_DOSBase),%a6
1702 #if BCPLSTRINGDEBUG
1703     move.l      %d3,%d0
1704         bsr             bstr_debug
1705 #endif
1707                                                         /* D2 = SplitName 'separator' */
1708     subq.l      #1,%d4                  /* D4 = oldpos - 1 (?) */
1709                                                         
1710     move.l      %d3, %d1
1711     moveq       #4, %d0
1712     bsr         bstr_to_cstr
1713                                                 /* D1 = SplitName 'name' */
1715     move.l      %a1@(0), %d3    /* Recover D1 (buf) from A1[0] */
1716     lsl.l       #2,%d3
1717     addq.l      #1,%d3                  /* D3 = SplitName 'buf' */
1719         moveq   #30,%d5                 /* D5 = SplitName 'size' */
1721     jsr         %a6@(69 * -6)   /* SplitName */
1723     move.l      %d3,%a0
1724     moveq       #-1,%d1
1725 0:  addq.w      #1,%d1
1726     tst.b       %a0@+
1727         bne             0b
1728         move.l  %d3,%a0
1729         move.b  %d1,%a0@(-1)    /* fix buf BSTR length */
1730         
1731     addq.l      #1,%d0                  /* newpos + 1 (?) */
1732     movem.l     %sp@+,%d1-%d5/%a0-%a1/%a6
1733     BRTS
1735 BCPL lock           /* 1b0, FileLock ^, @name */
1736     movem.l     %d2/%a0-%a1/%a6,%sp@-
1737     move.l      %a2@(GV_DOSBase),%a6
1739     moveq.l     #1, %d0
1740     bsr         bstr_to_cstr
1742     moveq.l     #-2,%d2         /* Shared lock */
1743     jsr         %a6@(14 * -6)   /* DOS/Lock() */
1744     movem.l     %sp@+,%d2/%a0-%a1/%a6
1745     BRTS
1747 BCPL UnLock         /* 1b4, void, @FileLock */
1748     movem.l     %a0-%a1/%a6,%sp@-
1749     move.l      %a2@(GV_DOSBase),%a6
1750     jsr         %a6@(15 * -6)   /* DOS/UnLock() */
1751     movem.l     %sp@+,%a0-%a1/%a6
1752     BRTS
1754 BCPL getlong        /* 1b8, void, longoffset, &struct */
1755     lsl.l       #2,%d1
1756     add.l       %d2,%d1
1757     move.l      %a0@(%d1),%d0
1758     BRTS
1760 BCPL putlong        /* 1bc, void, longoffset, &struct, data */
1761     lsl.l       #2,%d1
1762     add.l       %d2,%d1
1763     move.l      %a0@(%d1),%d0
1764     move.l      %d3,%a0@(%d1)
1765     BRTS
1767 BCPL openDevInfo       /* 1c0, FileHandle ^, @DevInfo, @filename/window */
1768     movem.l     %a0-%a1/%a6,%sp@-
1769     move.l      %a2@(GV_DOSBase),%a6
1770     move.l      %a6,%sp@-
1771     move.l      %d2,%sp@-
1772     move.l      %d1,%sp@-
1773     jsr         RunHandler
1774     lea.l       %sp@(12),%sp
1775     movem.l     %sp@+,%a0-%a1/%a6
1776     BRTS
1778 BCPL DupLock        /* 1c4, FileLock ^, @FileLock */
1779     movem.l     %a0-%a1/%a6,%sp@-
1780     move.l      %a2@(GV_DOSBase),%a6
1781     jsr         %a6@(16 * -6)   /* DOS/DupLock() */
1782     movem.l     %sp@+,%a0-%a1/%a6
1783     BRTS
1785 /* Calls ErrorReport(IoErr(), ...)
1786  * Why this is called 'makesysreq' is a question
1787  * for the TripOS guys.
1788  */
1789 BCPL makesysreq     /* 1c8, BOOL, type, arg, *msgport */
1790     movem.l     %a0-%a1/%a6,%sp@-
1791     move.l      %d3,%d4
1792     move.l      %d2,%d3
1793     move.l      %d1,%d2
1794     move.l      %a2@(GV_DOSBase),%a6
1795     jsr         %a6@(22 * -6)   /* IoErr */
1796     jsr         %a6@(80 * -6)   /* ErrorReport */
1797     movem.l     %sp@+,%a0-%a1/%a6
1798     BRTS
1800 BCPL strcpy         /* 1cc, void, @src, @dest */
1801     move.l      %d2,%sp@-
1802     lsl.l       #2,%d1
1803     lsl.l       #2,%d2
1804     moveq       #0,%d0
1805     move.b      %a0@(%d1),%d0
1806 0:  move.b      %a0@(%d1),%a0@(%d2)
1807     addq.l      #1,%d1
1808     addq.l      #1,%d2
1809     dbf         %d0,0b
1810     move.l      %sp@+,%d2
1811     BRTS
1813 BCPL runCommand    /* 1e4, ULONG, @codeseg, stacklongs, @cmdline, cmdlinelength */
1814     movem.l     %a0-%a1/%a6,%sp@-
1815     addq.l      #1,%d2
1816     lsl.l       #2,%d2
1817     lsl.l       #2,%d3
1818     move.l      %a2@(GV_DOSBase),%a6
1819     jsr         %a6@(84 * -6)   /* DOS/RunCommand() */
1820     movem.l     %sp@+,%a0-%a1/%a6
1821     BRTS
1823 BCPL lock_1ec       /* 1ec, FileLock ^, &name */
1824     movem.l     %d2/%a0-%a1/%a6,%sp@-
1825 #if BCPLSTRINGDEBUG
1826     move.l      %d1,%d0
1827     bsr         bstr_debug
1828 #endif
1829     move.l      %a2@(GV_DOSBase),%a6
1830     moveq.l     #1, %d0
1831     bsr         bstr_to_cstr
1832     moveq.l     #-2,%d2         /* Shared lock */
1833     jsr         %a6@(14 * -6)   /* DOS/Lock() */
1834     movem.l     %sp@+,%d2/%a0-%a1/%a6
1835     BRTS
1837 BCPL findDevInfo    /* 1f0, DevInfo ^, @name */
1838     movem.l     %d2-%d3/%a0-%a1/%a6,%sp@-
1839     move.l      %a2@(GV_DOSBase),%a6
1841 #if BCPLSTRINGDEBUG
1842     move.l      %d1,%d0
1843         bsr             bstr_debug
1844 #endif
1846     moveq.l     #1,%d0
1847     bsr         bstr_to_cstr
1849     move.l      %d1,%sp@-
1850     moveq       #0x1d,%d1       /* LDF_ALL | LDF_READ */
1851     jsr         %a6@(109 * -6)  /* DOS/LockDosList */
1852     move.l      %d0,%d1
1853     move.l      %sp@+,%d2
1854     moveq       #0x1d,%d3       /* LDF_ALL | LDF_READ */
1855     jsr         %a6@(114 * -6)  /* DOS/FindDosEntry */
1856     move.l      %d0,%sp@-
1857     moveq       #0x1d,%d1       /* LDF_ALL | LDF_READ */
1858     jsr         %a6@(110 * -6)  /* DOS/UnlockDosList */
1859     move.l      %sp@+,%d0
1860     lsr.l       #2,%d0
1861     movem.l     %sp@+,%d2-%d3/%a0-%a1/%a6
1862     BRTS
1864 BCPL createDir      /* 1f4, FileLock^, @name */
1865     movem.l     %a0-%a1/%a6,%sp@-
1866     move.l      %a2@(GV_DOSBase),%a6
1868     moveq.l     #1,%d0
1869     bsr         bstr_to_cstr
1871     jsr         %a6@(20 * -6)   /* DOS/CreateDir() */
1872     movem.l     %sp@+,%a0-%a1/%a6
1873     BRTS
1875 BCPLd compareTime    /* 1f8, SIGN , @timeval, @timeval */
1876     /* I suspect this is actually Dos/CompareDates(), but
1877      * I haven't found a user of this routine yet.
1878      */
1879     BRTS
1881 BCPL timerIO        /* 1fc, void, command, @IOStdReq, secs, usecs */
1882     movem.l     %a0-%a1/%a6,%sp@-
1883     lsl.l       #2,%d2
1884     move.l      %d2,%a1
1885     move.w      %d1,%a1@(io_Command)
1886     move.l      %d3,%a1@(tr_time + 0)
1887     move.l      %d4,%a1@(tr_time + 4)
1888     move.l      SysBase, %a6
1889     jsr.l       %a6@(76 * -6)   /* Exec/DoIO() */
1890     moveq.l     #-1,%d0 
1891     movem.l     %sp@+,%a0-%a1/%a6
1892     BRTS
1894 BCPL settime        /* 200, void, @DateStamp */
1895     move.l      %a2@(GV_DOSBase),%d0
1896     move.l      %a0@(dl_TimeReq,%d0),%d2
1897     lsl.l       #2,%d1
1898     move.l      %a0@(0,%d1),%d3 /* ds_Days */
1899     mulu.w      #(60*24),%d3    /* mulu.w is fine until 2162 AD,  */
1900                                 /* but tv_secs is too small in 2047 AD */
1901     add.l       %a0@(4,%d1),%d3 /* ds_Minute */
1902     move.l      %d3,%d4
1903     mulu.w      #(60),%d3
1904     lsr.l       #8,%d4
1905     lsr.l       #8,%d4
1906     mulu.w      #(60),%d4
1907     lsl.l       #8,%d4
1908     lsl.l       #8,%d4
1909     add.l       %d4,%d3
1910     mov.l       %a0@(8,%d1),%d4 /* ds_Tick */
1911     divu.w      #50,%d4
1912     ext.l       %d4
1913     add.l       %d4,%d3
1914     moveq.l     #0,%d4
1915     lsr.l       #2,%d2
1916     move.l      #11,%d1         /* TR_SETSYSTIME */
1917     move.l      #(1*4 + 3*4),%d0
1918     move.l      %a2@(GV_timerIO),%a4
1919     jsr         %a5@
1920     BRTS
1922     /*
1923      * On AOS, this routine called the internal
1924      * CliInit(), which handled setting up the
1925      * core SYS: lock, assigns, and paths.
1926      *
1927      * The (normally NULL) DOS Packet is always ignored.
1928      *
1929      * Although (for various reasons) this has been done
1930      * before this routine has been called, we still need
1931      * to call CliInit* to process the inbound AROS packet.
1932      *
1933      * If the passed in DOS Packet is NULL, then we have
1934      * nothing to do, since that's not valid under AROS.
1935      *
1936      * If the DOS Packet is *not* NULL, then pass it
1937      * to the appropriate CliInit* routine.
1938      *
1939      */
1940 BCPL CliInit         /* 214, APTR, @DosPacket */
1941     tst.l       %d1
1942     beq.s       .L_CliInit_exit
1944     lsl.l       #2,%d1
1945     move.l      %a0@(dp_Res1,%d1),%d2
1946     tst.l       %d2
1947     beq.s       .L_CliInit_Run
1949 .L_CliInit_Newcli:
1950     /* CliInitNewcli */
1951     move.l      #(155*-6),%d2
1952     bra.s       .L_CliInit_Init
1954 .L_CliInit_Run:
1955     /* CliInitRun */
1956     move.l      #(156*-6),%d2
1958 .L_CliInit_Init:
1959     movem.l      %a0-%a1/%a6,%sp@-
1960     move.l      %d1,%a0
1961     move.l      %a2@(GV_DOSBase),%a6
1962     jsr         %a6@(%d2)
1963     movem.l      %sp@+,%a0-%a1/%a6
1964 .L_CliInit_exit:
1965     BRTS
1967 BCPLnd CliInit_NEWCLI
1968     lsl.l       #2, %d1
1969     move.l      #1, %a0@(dp_Type, %d1)
1970     jmp         .L_CliInit_Newcli
1972 BCPLnd CliInit_RUN
1973     lsl.l       #2, %d1
1974     move.l      #-1, %a0@(dp_Type, %d1)
1975     jmp         .L_CliInit_Run
1977 BCPLnd CliInit_SYSTEM
1978     lsl.l       #2, %d1
1979     move.l      #-2, %a0@(dp_Type, %d1)
1980     jmp         .L_CliInit_Run
1982 BCPLnd CliInit_ASYSTEM
1983     lsl.l       #2, %d1
1984     move.l      #-3, %a0@(dp_Type, %d1)
1985     jmp         .L_CliInit_Run
1987 BCPLnd CliInit_BOOT
1988     lsl.l       #2, %d1
1989     move.l      #-4, %a0@(dp_Type, %d1)
1990     jmp         .L_CliInit_Run
1993 BCPL findCLI        /* 218, CommandLineInterpreter ^,  */
1994     movem.l             %a0-%a1/%a6,%sp@-
1995     move.l              %a2@(GV_DOSBase),%a6
1996     jsr                 %a6@(82 * -6)   /* DOS/Cli() */
1997     lsr.l               #2,%d0
1998     movem.l             %sp@+,%a0-%a1/%a6
1999     BRTS
2002 /* Helper routines */
2003     /* Convert BCPL string to Cstring inline in the A1 vector
2004      * In:
2005      *   D0: Index into A1, in words, to hold dest
2006      *   D1: BSTR to convert
2007      *   A1: ULONG vector
2008      * Out:
2009      *   D0: Clobbered
2010      *   D1: Memory address of Cstring
2011      *   A1: Unchanged
2012      */
2013 bstr_to_cstr:
2014     movem.l     %d0/%a0-%a1,%sp@-
2015     sub.l       %a0,%a0
2016     lsl.l       #2,%d1
2017     addq.l      #1,%d1
2018     clr.l       %sp@-
2019     move.b      %a0@(-1,%d1),%sp@(3)    /* Arg3 = strlen */
2020     move.l      %d1,%sp@-               /* Arg2 = src */
2021     lsl.l       #2,%d0
2022     pea.l       %a1@(%d0)               /* Arg1 = dest */
2023     jsr         memcpy
2024     move.l      %sp@+,%a0               /* A0 = dest */
2025     addq.l      #4,%sp                  /* Drop src */
2026     move.l      %sp@+,%d1               /* D1 = strlen */
2027     move.b      #0,%a0@(%d1)            /* Terminate string with an ASCIIZ */
2028     move.l      %a0,%d1                 /* D1 = dest */
2029     movem.l     %sp@+,%d0/%a0-%a1
2030     rts
2032 #if BCPLSTRINGDEBUG
2033 .bstr_format:
2034     .string  "%p->%p:%d:'%b'\n"
2035 bstr_debug:
2036         movem.l %d1/%a0-%a1,%sp@-
2037     move.l      %d0,%a0
2038     add.l       %a0,%a0
2039     add.l       %a0,%a0
2040     moveq       #0,%d1
2041     move.b      (%a0),%d1
2042     move.l      %d0,%sp@-
2043     move.l      %d1,%sp@-
2044     move.l  %a0,%sp@-
2045     move.l      %d0,%sp@-
2046     pea         .bstr_format(%pc)
2047     jsr     kprintf
2048     lea         20(%sp),%sp
2049     movem.l     %sp@+,%d1/%a0-%a1
2050     rts
2051 #endif