bcpl: returnPacket needs to return true on success
[AROS.git] / arch / m68k-all / dos / bcpl.S
blob63f59795948808b76721787ef4858eccede8c3b0
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,%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 BCPLd packstring     /* b0, void, @Array, @String */
693     BRTS
695 BCPLd unpackstring   /* b4, void, @String, @Array */
696     BRTS
698 BCPLd holdTask       /* b8, void, @memseg */
699     BRTS
701 BCPL Delay          /* bc, void, ticks */
702     movem.l     %a0-%a1/%a6,%sp@-
703     move.l      %a2@(GV_DOSBase),%a6
704     jsr         %a6@(33 * -6)   /* DOS/Delay() */
705     movem.l     %sp@+,%a0-%a1/%a6
706     BRTS
708     /* Call the DOS internal 'dopacket' function
709      */
710 BCPL sendPacket     /* c0, BOOL, -, MsgPort, Type, -, -, Arg1,... */
711     movem.l     %a0-%a1/%a6,%sp@-
712     move.l      %a1@((4 + 7) * 4), %sp@-        /* Arg7 */
713     move.l      %a1@((4 + 6) * 4), %sp@-        /* Arg6 */
714     move.l      %a1@((4 + 5) * 4), %sp@-        /* Arg5 */
715     move.l      %a1@((4 + 4) * 4), %sp@-        /* Arg4 */
716     move.l      %a1@((4 + 3) * 4), %sp@-        /* Arg3 */
717     move.l      %a1@((4 + 2) * 4), %sp@-        /* Arg2 */
718     move.l      %a1@((4 + 1) * 4), %sp@-        /* Arg1 */
719     move.l      %d3, %sp@-                      /* Type */
720     move.l      %d2, %sp@-                      /* Port */
721     move.l      %a0, %sp@-                      /* A0 is still 0 */
722     jsr         dopacket
723     lea.l       %sp@(10 * 4), %sp
724     movem.l     %sp@+,%a0-%a1/%a6
725     moveq.l     #-1,%d0
726     BRTS
728 BCPL returnPacket   /* c4, void, @DosPacket, res1, res2 */
729     tst.l       %d1     /* Don't try to reply NULL Dos Packets */
730     beq.s       0f
731     movem.l     %a0-%a1/%a6,%sp@-
732     move.l      %a2@(GV_DOSBase),%a6
733     lsl.l       #2, %d1
734     jsr         %a6@(43 * -6)   /* DOS/ReplyPkt() */
735     movem.l     %sp@+,%a0-%a1/%a6
737     BRTS
739 #define TAG_END 0
740 #define TAG_USER        (1 << 31)
741 #define WA_Dummy        (TAG_USER + 99)
742 #define WA_Left         (WA_Dummy + 1)
743 #define WA_Top          (WA_Dummy + 2)
744 #define WA_Width        (WA_Dummy + 3)
745 #define WA_Height       (WA_Dummy + 4)
746 #define WA_Title        (WA_Dummy + 11)
747 #define WA_PubScreen    (WA_Dummy + 22)
748 #define WA_AutoAdjust   (WA_Dummy + 45)
750 BCPL openWindow     /* c8, struct Window *, leftedge, topedge, width, height, @title */
751         movem.l %a0-%a1/%a6,%sp@-
752         move.l  %a2@(GV_DOSBase),%a6
753         move.l  %a6@(dl_IntuitionBase),%a6
754         move.l  #TAG_END, %sp@-
755         move.l  #-1, %sp@-
756         move.l  #WA_AutoAdjust, %sp@-
757         move.l  %a0, %sp@-
758         move.l  #WA_PubScreen, %sp@-
759         move.l  %a1@(4*4),%sp@-
760         move.l  #WA_Title, %sp@-
761         move.l  %d4, %sp@-
762         move.l  #WA_Height, %sp@-
763         move.l  %d3, %sp@-
764         move.l  #WA_Width, %sp@-
765         move.l  %d2, %sp@-
766         move.l  #WA_Top, %sp@-
767         move.l  %d1, %sp@-
768         move.l  #WA_Left, %sp@-
769         move.l  %sp, %a1                        /* a0 is still 0 here */
770         jsr             %a6@(101 * -6)          /* OpenWindowTagList */
771         lea.l   %sp@(15 * 4),%sp
772         movem.l %sp@+,%a0-%a1/%a6
773     BRTS
775     /* If BOOL is DOSTRUE, set current directory
776      * Always return old current directory
777      */
778 BCPL setCurrentDir  /* cc, FileLock @, BOOL, @FileLock */
779     movem.l     %d3-%d4/%a0-%a1/%a6,%sp@-
781         move.l  %d1,%d3
783     move.l      SysBase,%a6
784     sub.l       %a1,%a1
785     jsr         %a6@(FindTask)
786     move.l      %d0,%a0
787     /* sanity check in CurrentDir() complained so I did this */
788     move.l      %a0@(152),%d4   /* pr_CurrentDir */
790     tst.l       %d3
791     beq.s       0f
793     move.l      %a2@(GV_DOSBase),%a6
794     move.l      %d2,%d1
795     jsr         %a6@(21 * -6)   /* DOS/CurrentDir() */
797         move.l  %d4,%d0
798     movem.l     %sp@+,%d3-%d4/%a0-%a1/%a6
799     BRTS
801 BCPLd systemRequest  /* d0, void, @line1, @line2, @line3 */
802     BRTS
804 BCPL writet         /* d4, void, @string, n */
805     movem.l     %d2-%d4,%sp@-
806     move.l      %d1, %d3
807     lsl.l       #2, %d3         /* D3 = BADDR(string) */
808     clr.l       %d4
809     move.b      %a0@(%d3),%d4   /* D4 = string[0] (strlen) */
810     tst.l       %d4
811     beq         .LBCPL_writet_pad
813     bra         .LBCPL_writet_loop_cond
815 .LBCPL_writet_loop:
816     addq.l      #1,%d3          /* D3 = pointer to next char */
817     subq.l      #1,%d2          /* D2 = reduce pad amount by 1 */
818     move.l      #(3*4 + 1*4),%d0
819     clr.l       %d1
820     move.b      %a0@(%d3),%d1   /* D1 = next char */
821     move.l      %a2@(GV_wrch), %a4
822     jsr         (%a5)
823 .LBCPL_writet_loop_cond:
824     dbf         %d4,.LBCPL_writet_loop
826 .LBCPL_writet_pad:
827     tst.l       %d2
828     ble         .LBCPL_writet_exit
829     bra         .LBCPL_writet_pad_cond
831 .LBCPL_writet_pad_loop:
832     move.l      #(3*4 + 2*4),%d0
833     moveq.l     #' ',%d1
834     move.l      %a2@(GV_wrch), %a4
835     jsr         (%a5)
836 .LBCPL_writet_pad_cond:
837     dbf         %d2,.LBCPL_writet_pad_loop
839 .LBCPL_writet_exit:
840     movem.l     %sp@+,%d2-%d4
841     BRTS
843 BCPLnd rdch           /* d8, char ,  */
844     movem.l     %a0-%a1/%a6,%sp@-
845     move.l      %a2@(GV_DOSBase),%a6
846     jsr         %a6@(9 * -6)    /* DOS/Input() */
847     move.l      %d0, %d1
848     jsr         %a6@(51 * -6)   /* DOS/FGetC() */
849     movem.l     %sp@+,%a0-%a1/%a6
850     BRTSnd
852 BCPL unrdch         /* dc, void,  */
853     movem.l     %d2/%a0-%a1/%a6,%sp@-
854     move.l      %a2@(GV_DOSBase),%a6
855     jsr         %a6@(9 * -6)    /* DOS/Input() */
856     move.l      %d0, %d1
857     moveq       #-1,%d2
858     jsr         %a6@(53 * -6)   /* DOS/UnGetC() */
859     movem.l     %sp@+,%d2/%a0-%a1/%a6
860     BRTS
862 BCPLnd wrch           /* e0, void, char */
863     movem.l     %d2/%a0-%a1/%a6,%sp@-
864     move.l      %a2@(GV_DOSBase),%a6
865     move.l      %d1, %d2
866     jsr         %a6@(10 * -6)   /* DOS/Output() */
867     move.l      %d0, %d1
868     jsr         %a6@(52 * -6)   /* DOS/FPutC() */
869     movem.l     %sp@+,%d2/%a0-%a1/%a6
870     BRTSnd
872 BCPLd readinput_e4   /* e4, lwlength , @buf, lwlength */
873     BRTS
875 BCPL writeoutput_e8 /* e8, void, @buf, lwlength */
876     movem.l     %d2-%d4/%a0-%a1/%a6,%sp@-
877     move.l      %a2@(GV_DOSBase),%a6
878     move.l      %d2, %d4        /* Num blocks */
879     moveq.l     #4, %d3         /* Block len (sizeof(ULONG)) */
880     move.l      %d1, %d2        /* Buffer */
881     lsl.l       #2, %d2
882     jsr         %a6@(10 * -6)   /* DOS/Output() */
883     move.l      %d0, %d1        /* Outfile */
884     jsr         %a6@(55 * -6)   /* DOS/FWrite() */
885     movem.l     %sp@+,%d2-%d4/%a0-%a1/%a6
886     BRTS
888 BCPL findinput      /* ec, FileHandle ^, @name */
889     movem.l     %d2/%a0-%a1/%a6,%sp@-
891 #if BCPLSTRINGDEBUG
892     move.l      %d1,%d0
893     bsr         bstr_debug
894 #endif
896     moveq.l     #1, %d0
897     bsr         bstr_to_cstr
899     move.l      %a2@(GV_DOSBase),%a6
900     move.l      #1005 /* MODE_OLDFILE */,%d2
901     jsr         %a6@(5 * -6)    /* DOS/Open() */
902     movem.l     %sp@+,%d2/%a0-%a1/%a6
903     BRTS
905 BCPL findoutput     /* f0, FileHandle ^, @name */
906     movem.l     %d2/%a0-%a1/%a6,%sp@-
907   
908 #if BCPLSTRINGDEBUG
909     move.l      %d1,%d0
910     bsr         bstr_debug
911 #endif
913     moveq.l     #1, %d0
914     bsr         bstr_to_cstr
916     move.l      %a2@(GV_DOSBase),%a6
917     move.l      #1006 /* MODE_NEWFILE */,%d2
918     jsr         %a6@(5 * -6)    /* DOS/Open() */
919     movem.l     %sp@+,%d2/%a0-%a1/%a6
920     BRTS
922 BCPL SelectInput    /* f4, void , @FileHandle */
923     movem.l     %a0-%a1/%a6,%sp@-
924     move.l      %a2@(GV_DOSBase),%a6
925     jsr         %a6@(49 * -6)   /* DOS/SelectInput() */
926     movem.l     %sp@+,%a0-%a1/%a6
927     BRTS
929 BCPL SelectOutput   /* f8, void , @FileHandle */
930     movem.l     %a0-%a1/%a6,%sp@-
931     move.l      %a2@(GV_DOSBase),%a6
932     jsr         %a6@(50 * -6)   /* DOS/SelectOutput() */
933     movem.l     %sp@+,%a0-%a1/%a6
934     BRTS
936 BCPL endread        /* fc, void,  */
937     movem.l     %a0-%a1/%a6,%sp@-
938     move.l      %a2@(GV_DOSBase),%a6
939     jsr         %a6@(9 * -6)    /* DOS/Input() */
940     move.l      %d0,%d1
941     jsr         %a6@(6 * -6)    /* DOS/Close() */
942     moveq.l     #0,%d1
943     jsr         %a6@(49 * -6)   /* DOS/SelectInput() */
944     movem.l     %sp@+,%a0-%a1/%a6
945     BRTS
947 BCPL endwrite       /* 100, void,  */
948     movem.l     %a0-%a1/%a6,%sp@-
949     move.l      %a2@(GV_DOSBase),%a6
950     jsr         %a6@(10 * -6)   /* DOS/Output() */
951     move.l      %d0,%d1
952     jsr         %a6@(6 * -6)    /* DOS/Close() */
953     moveq.l     #0,%d1
954     jsr         %a6@(50 * -6)   /* DOS/SelectOutput() */
955     movem.l     %sp@+,%a0-%a1/%a6
956     BRTS
958 BCPL Input          /* 104, FileHandle @,  */
959     movem.l     %a0-%a1/%a6,%sp@-
960     move.l      %a2@(GV_DOSBase),%a6
961     jsr         %a6@(9 * -6)    /* DOS/Input() */
962     movem.l     %sp@+,%a0-%a1/%a6
963     BRTS
965 BCPL Output         /* 108, FileHandle @,  */
966     movem.l     %a0-%a1/%a6,%sp@-
967     move.l      %a2@(GV_DOSBase),%a6
968     jsr         %a6@(10 * -6)   /* DOS/Output() */
969     movem.l     %sp@+,%a0-%a1/%a6
970     BRTS
972 BCPLd readn          /* 10c, void,  */
973     BRTS
975 BCPL newline        /* 110, void,  */
976     moveq.l     #'\n',%d1
977     jmp         BCPL_wrch
979 BCPL_write_base:        /* number, width, base, canneg */
980     movem.l     %d2-%d7,%sp@-
982     move.l      %d3,%d6         /* D6 = base */
983     move.l      %d2,%d5         /* D5 = width */
984     move.l      %d1,%d3         /* D3 = Number */
985     moveq       #0,%d7
987     tst.l       %d4
988     beq         .Lwrite_base_pos
990     tst.l       %d3             /* Number < 0? */
991     bge         .Lwrite_base_pos
993     bset        #31,%d7 /* D7 bit 31 = negative sign needed */
994     neg.l       %d3
995     subq.l      #1,%d5
997 .Lwrite_base_pos:
998     clr.l       %d4             /* D4 = Digit */
999     clr.w       %d7             /* D7 = Num pushed chars */
1001 .Lwrite_base_loop:
1002     move.l      %d3,%d1
1003     move.l      %d6,%d2
1004     jsr         %a5@(0x12)      /* divmod: D1 = D3/base, D2 = D3 % base */
1005     move.l      %d1, %d3
1007     /* Push char */
1008     move.l      %d2, %d1
1009     cmp.b       #10, %d1
1010     blt         0f
1011     add.b       #(('A'-10)-'0'),%d1
1013     add.b       #'0',%d1        /* D1 = '0' .. '9' */
1014     move.b      %d1, %a1@(3*4 + 4*4, %d7.w)
1015     addq.w      #1, %d7
1016     subq.l      #1, %d5
1017     tst.l       %d3
1018     bgt.s       .Lwrite_base_loop
1020     /* Any extra field bits? */
1021     bra         .LBCPL_write_base_pad_cond
1022 .LBCPL_write_base_pad:
1023     moveq       #' ',%d1
1024     move.l      #(3*4 + 4*4 + 8*4), %d0
1025     move.l      %a2@(GV_wrch), %a4
1026     jsr         (%a5)
1027 .LBCPL_write_base_pad_cond:
1028     subq.l      #1,%d5
1029     bpl.s       .LBCPL_write_base_pad
1031         btst    #31,%d7
1032         beq.s   .Lwrite_base_emit
1033     /* Negative sign */
1034     move.l      #'-',%d1
1035     move.l      #(3*4 + 4*4 + 8*4), %d0
1036     move.l      %a2@(GV_wrch), %a4
1037     jsr         (%a5)
1039     /* Write chars */
1040 .Lwrite_base_emit:
1041     subq.w      #1, %d7
1042     bmi.s       0f
1043     clr.l       %d1
1044     move.b      %a1@(3*4 + 4*4, %d7.w),%d1
1045     move.l      #(3*4 + 4*4 + 8*4), %d0
1046     move.l      %a2@(GV_wrch), %a4
1047     jsr         (%a5)
1048     jmp         .Lwrite_base_emit
1051     movem.l     %sp@+,%d2-%d7
1052     BRTS
1054 BCPL writei         /* 114, void, number, width */
1055     movem.l     %d3-%d4,%sp@-
1057     move.l      #(3*4 + 2*4), %d0
1058     move.l      #10,%d3
1059     move.l      #-1,%d4
1060     lea.l       BCPL_write_base, %a4
1061     jsr         (%a5)
1063     movem.l     %sp@+,%d3-%d4
1064     BRTS
1066 BCPL writen         /* 118, void, number */
1067     movem.l     %d2-%d4,%sp@-
1069     move.l      #(3*4 + 1*4), %d0
1070     clr.l       %d2
1071     move.l      #10,%d3
1072     move.l      #-1,%d4
1073     lea.l       BCPL_write_base, %a4
1074     jsr         (%a5)
1076     movem.l     %sp@+,%d2-%d4
1077     BRTS
1079 BCPL writehex       /* 11c, void, number, width */
1080     movem.l     %d3-%d4,%sp@-
1082     move.l      #(3*4 + 2*4), %d0
1083     move.l      #16,%d3
1084     clr.l       %d4
1085     lea.l       BCPL_write_base, %a4
1086     jsr         (%a5)
1088     movem.l     %sp@+,%d3-%d4
1089     BRTS
1091 BCPL writeoct       /* 120, void, number, width */
1092     movem.l     %d3-%d4,%sp@-
1094     move.l      #(3*4 + 2*4), %d0
1095     move.l      #8,%d3
1096     clr.l       %d4
1097     lea.l       BCPL_write_base, %a4
1098     jsr         (%a5)
1100     movem.l     %sp@+,%d3-%d4
1101     BRTS
1103 BCPL writes         /* 124, void, @string */
1104     move.l      %d2,%sp@-
1105     clr.l       %d2
1106     move.l      #(3*4 + 1*4),%d0
1107     move.l      %a2@(GV_writet), %a4
1108     jsr         (%a5)
1109     move.l      %sp@+,%d2
1110     BRTS
1112 #if 0 /* This is defined in bcpl_writef.S */
1113 BCPLd writef         /* 128, void, @format, arg1, arg2, ... */
1114     BRTS
1115 #endif
1117 BCPL toupper        /* 12c, void, char */
1118     move.l      %d1,%d0
1119     bclr        #5,%d0
1120     BRTS
1122 BCPL charicmp        /* 130, long , char1, char2 */
1123     move.l      %d2,%d0
1124     bclr        #5,%d0
1125     bclr        #5,%d1
1126     sub.l       %d1,%d0
1127     BRTS
1129 BCPL stricmp         /* 134, long , @String1, @String2 */
1130     movem.l     %d1-%d3/%a0-%a1,%sp@-
1132 #if BCPLSTRINGDEBUG
1133     move.l      %d1,%d0
1134         bsr             bstr_debug
1135         move.l  %d2,%d0
1136         bsr             bstr_debug
1137 #endif
1139     lsl.l       #2,%d1
1140     move.l      %d1,%a0
1141     lsl.l       #2,%d2
1142     move.l      %d2,%a1
1143     move.b      %a0@+,%d2
1144     move.b      %a1@+,%d3
1145     moveq       #0,%d0
1146 sicmp1:
1147     tst.b       %d2
1148     beq.b       sicmp2
1149     tst.b       %d3
1150     beq.b       sicmp2
1151     subq.b      #1,%d2
1152     subq.b      #1,%d3
1153     moveq       #0,%d0
1154     move.b      %a0@+,%d0
1155     bclr        #5,%d0
1156     moveq       #0,%d1
1157     move.b      %a1@+,%d1
1158     bclr        #5,%d1
1159     sub.w       %d1,%d0
1160     beq.s       sicmp1
1161         bra.s   sicmp0
1162 sicmp2:
1163         cmp.b   %d2,%d3
1164         beq.s   sicmp0
1165         moveq   #-1,%d0
1166         tst.b   %d2
1167         beq.s   sicmp0
1168         moveq   #1,%d0
1169 sicmp0:
1170     ext.l       %d0
1171         movem.l %sp@+,%d1-%d3/%a0-%a1
1172     BRTS
1174 BCPL rdargs         /* 138, ULONG, @template, array, array_size */
1175     /* BCPL rdargs and DOS/ReadArgs() don't match up
1176      *      very nicely. We'll need to call a BCPL/ReadArgs
1177      *      routine that works the way this expects
1178      */
1179     movem.l     %a0-%a1/%a6,%sp@-
1180     move.l      %a2@(GV_DOSBase),%a6
1181     jsr         BCPL_ReadArgs
1182     movem.l     %sp@+,%a0-%a1/%a6
1183     BRTS
1185 BCPL rditem         /* 13c, void, @buf, maxlongs  */
1186     movem.l     %d2-%d3/%a0-%a2/%a6,%sp@-
1187     move.l      %a2@(GV_DOSBase),%a6
1188     lsl.l       #2,%d1
1189     addq.l      #1,%d1
1190     move.l      %d1,%a2
1191     clr.b       %a2@
1192     lsl.l       #2,%d2
1193     subq.l      #1,%d2
1194     moveq       #0,%d3
1195     /* this can't be right but at least c:execute does something now */
1196     jsr         %a6@(135 * -6)  /* DOS/ReadItem() */
1198     move.l      %a2,%a0
1199     moveq       #-1,%d2
1200 0:  addq.w      #1,%d2
1201     tst.b       %a0@+
1202         bne             0b
1203         move.b  %d2,%a2@(-1)    /* fix buf BSTR length */
1205 #if BCPLSTRINGDEBUG
1206     move.l      %d0,%d2
1207     lea.l       %a2@(-1),%a2
1208     move.l      %a2,%d0
1209     lsr.l       #2,%d0
1210     bsr         bstr_debug
1211     move.l      %d2,%d0
1212 #endif
1214     movem.l     %sp@+,%d2-%d3/%a0-%a2/%a6
1215     BRTS
1217 BCPL subString      /* 140, void, @string, @substring */
1219     movem.l     %d2-%d3/%a0-%a6,%sp@-
1220     move.l      SysBase,%a6
1221     move.l      %a2@(GV_DOSBase),%a5
1223 #if BCPLSTRINGDEBUG
1224     move.l      %d1,%d0
1225         bsr             bstr_debug
1226         move.l  %d2,%d0
1227         bsr             bstr_debug
1228 #endif
1230     moveq       #0,%d3
1232     lsl.l       #2,%d1
1233     move.l      %d1,%a2
1234     lsl.l       #2,%d2
1235     move.l      %d2,%a3
1237         moveq   #0,%d0
1238         move.b  (%a2),%d0
1239         moveq   #0,%d1
1240         move.b  (%a3),%d1
1241         add.l   %d1,%d0
1242         addq.l  #2,%d0
1243         moveq   #1,%d1
1244         jsr             %a6@(114 * -6)  /* AllocVec */
1245         move.l  %d0,%a4
1246         tst.l   %d0
1247         beq.s   findarg_end
1248         move.l  %a4,%a0
1250         move.l  %a0,%d1
1251         move.b  %a2@+,%d0
1252 findarg_copy12:
1253         beq.s   findarg_copy11
1254         move.b  %a2@+,%a0@+
1255         subq.b  #1,%d0
1256         bra.s   findarg_copy12
1257 findarg_copy11:
1258         clr.b   %a0@+
1260         move.l  %a0,%d2
1261     move.b      %a3@+,%d0
1262 findarg_copy22:
1263         beq.s   findarg_copy21
1264         move.b  %a3@+,%a0@+
1265         subq.b  #1,%d0
1266         bra.s   findarg_copy22
1267 findarg_copy21:
1268     clr.b       %a0@+
1270         exg             %a5,%a6
1271     jsr         %a6@(134 * -6)  /* DOS/FindArg() */
1272     exg         %a5,%a6
1273         move.l  %d0,%d3
1275 findarg_end:
1276         move.l  %a4,%a1
1277         jsr             %a6@(115 * -6)  /* FreeVec */
1279         move.l  %d3,%d0
1280     movem.l     %sp@+,%d2-%d3/%a0-%a6
1281     BRTS
1283         /* C:Resident uses this */
1284 BCPL load           /* 144, SegList ^, @filename */
1285     movem.l     %a0-%a1/%a6,%sp@-
1286     move.l      %a2@(GV_DOSBase),%a6
1288 #if BCPLSTRINGDEBUG
1289     move.l      %d1,%d0
1290         bsr             bstr_debug
1291 #endif
1293     moveq       #1,%d0
1294     bsr         bstr_to_cstr
1295     jsr         %a6@(25 * -6)   /* DOS/LoadSeg() */
1296     movem.l     %sp@+,%a0-%a1/%a6
1297     BRTS
1299 BCPL UnLoadSeg      /* 148, void, @seg */
1300     movem.l     %a0-%a1/%a6,%sp@-
1301     move.l      %a2@(GV_DOSBase),%a6
1302     jsr         %a6@(26 * -6)   /* DOS/UnLoadSeg */
1303     movem.l     %sp@+,%a0-%a1/%a6
1304     BRTS
1306 BCPLd tidyup         /* 150, void,  */
1307     BRTS
1309 BCPL addDevice      /* 154, void, @name */
1310     movem.l     %d2/%a0-%a1/%a6,%sp@-
1311     move.l      %a2@(GV_DOSBase),%a6
1313 #if BCPLSTRINGDEBUG
1314     move.l      %d1,%d0
1315         bsr             bstr_debug
1316 #endif
1318     moveq.l     #1,%d0
1319     bsr         bstr_to_cstr
1320     moveq       #0,%d2                  /* DLT_DEVICE */
1321     jsr         %a6@(116 * -6)  /* DOS/MakeDosEntry */
1322     move.l      %d0,%d2
1323     beq.s       0f
1324     move.l      %d2,%d1
1325     lsr.l       #2,%d2
1326     jsr         %a6@(113 * -6)  /* DOS/AddDosEntry */
1327     move.l      %d0,%d1
1328     bne.s       0f
1329     jsr         %a6@(117 * -6)  /* DOS/FreeDosEntry */
1330     moveq       #0,%d2
1331 0:      move.l  %d2,%d0
1332     movem.l     %sp@+,%d2/%a0-%a1/%a6
1333     BRTS
1335 BCPL datestamp      /* 158, @DateStamp, @DateStamp */
1336     movem.l     %a0-%a1/%a6,%sp@-
1337     lsl.l       #2,%d1
1338     move.l      %a2@(GV_DOSBase),%a6
1339     jsr.l       %a6@(32 * -6)   /* DOS/DateStamp() */
1340     lsr.l       #2,%d0
1341     movem.l     %sp@+,%a0-%a1/%a6
1342     BRTS
1344 BCPLd WaitForChar    /* 15c, BOOL , @FileHandle, time */
1345     BRTS
1347 BCPL execLib        /* 160, long , LVOffset, d0, d1, a0, a1, a2 */
1348     movem.l     %d2/%a0-%a3/%a6,%sp@-
1349     move.l      SysBase,%a6
1350     move.l      %a1,%a3
1351     move.w      %d1,%d2
1352     movem.l %a3@(4),%d0-%d1/%a0-%a2
1353     jsr         %a6@(%d2.w)
1354     movem.l     %sp@+,%d2/%a0-%a3/%a6
1355     BRTS
1357 BCPL findSegArray   /* 164, Array @,  */
1358     movem.l     %a0-%a1/%a6,%sp@-
1359     sub.l       %a1,%a1
1360     move.l      SysBase,%a6
1361     jsr         FindTask(%a6)
1362     move.l      %d0,%a0
1363     move.l      %a0@(pr_SegList),%d0
1364     movem.l     %sp@+,%a0-%a1/%a6
1365     BRTS
1367 BCPL deleteObject   /* 168, void, @name */
1368     movem.l     %a0-%a1/%a6,%sp@-
1369     moveq       #1,%d0
1370     bsr         bstr_to_cstr
1371     move.l      %a2@(GV_DOSBase),%a6
1372     jsr         %a6@(12 * -6)   /* DOS/DeleteFile() */
1373     movem.l     %sp@+,%a0-%a1/%a6
1374     BRTS
1376 BCPL rename         /* 16c, void, @oldname, @newname */
1377     movem.l     %d2/%a0-%a2/%a6,%sp@-
1378     move.l      %a2@(GV_DOSBase),%a6
1379     moveq       #1,%d0
1380     bsr         bstr_to_cstr
1381     lea         %sp@(-256),%sp
1382     move.l      %sp,%a2
1383     move.l      %a2,%a1
1384     move.l      %d1,%a0
1385 0:  move.b      %a0@+,%a1@+
1386     bne.s       0b
1387     move.l      %d2,%d1
1388     moveq       #1,%d0
1389     bsr         bstr_to_cstr
1390     move.l      %d1,%d2
1391     move.l      %a2,%d1
1392     jsr         %a6@(13 * -6)   /* DOS/Rename() */
1393     lea         %sp@(256),%sp
1394     movem.l     %sp@+,%d2/%a0-%a2/%a6
1395     BRTS
1397 /*      170 - contains APTR to IntuitionBase */
1399 BCPL Close          /* 174, void, @FileHandle */
1400     movem.l     %a0-%a1/%a6,%sp@-
1401     move.l      %a2@(GV_DOSBase),%a6
1402     jsr         %a6@(6 * -6)    /* DOS/Close() */
1403     movem.l     %sp@+,%a0-%a1/%a6
1404     BRTS
1406 BCPLd getword        /* 178, void, longaddress, wordnumber */
1407     BRTS
1409 BCPLd putword        /* 17c, void, longaddress, wordnumber */
1410     BRTS
1411                      /* 180, ??? */
1413 BCPLd taskwait_190   /* 190, DosPacket ^,  */
1414     jmp BCPL_taskwait
1416 BCPL execute        /* 194, void, &string , @in, @out */
1417     movem.l     %a0-%a1/%a6,%sp@-
1418     move.l      %a2@(GV_DOSBase),%a6
1419     jsr         %a6@(37 * -6)   /* DOS/Execute() */
1420     movem.l     %sp@+,%a0-%a1/%a6
1421     BRTS
1423 BCPL deviceproc     /* 198, FileLock ^, @filename */
1424     movem.l     %a0-%a1/%a6,%sp@-
1425     move.l      %a2@(GV_DOSBase),%a6
1427     moveq.l     #1, %d0
1428     bsr         bstr_to_cstr
1430     jsr         %a6@(29 * -6)   /* DOS/DeviceProc() */
1431     movem.l     %sp@+,%a0-%a1/%a6
1432     BRTS
1434 BCPL libcall        /* 19c, void, libbase, LVOffset, d0, d1, a0, a1 */
1435     movem.l     %a0-%a1/%a6,%sp@-
1436     move.l      %d1,%a6
1437     move.l      %a1@(0x08),%d0
1438     move.l      %a1@(0x0c),%d1
1439     move.l      %a1@(0x10),%a0
1440     move.l      %a1@(0x14),%a1
1441     jsr         %a6@(%d2)
1442     movem.l     %sp@+,%a0-%a1/%a6
1443     BRTS
1445 BCPLd writeErr          /* 1a0, ??, ?? */
1446     moveq.l     #-1,%d0
1447     BRTS
1449 BCPL findConsoleHandler /* 1a4, MsgPort *,  */
1450     movem.l     %a0-%a1/%a6,%sp@-
1451     move.l      SysBase,%a6
1452     sub.l       %a1,%a1
1453     jsr         %a6@(FindTask)
1454     move.l      %d0,%a0
1455     move.l      %a0@(pr_ConsoleTask),%d0
1456     movem.l     %sp@+,%a0-%a1/%a6
1457     BRTS
1459 BCPL findFileHandler    /* 1a8, MsgPort *,  */
1460     movem.l     %a0-%a1/%a6,%sp@-
1461     move.l      SysBase,%a6
1462     sub.l       %a1,%a1
1463     jsr         %a6@(FindTask)
1464     move.l      %d0,%a0
1465     move.l      %a0@(pr_FileSystemTask),%d0
1466     movem.l     %sp@+,%a0-%a1/%a6
1467     BRTS
1469 BCPL extractDeviceName  /* 1ac, void, @buf, separator, @name , oldpos */
1470     movem.l     %d1-%d5/%a0-%a1/%a6,%sp@-
1471     move.l      %a2@(GV_DOSBase),%a6
1473 #if BCPLSTRINGDEBUG
1474     move.l      %d3,%d0
1475         bsr             bstr_debug
1476 #endif
1478                                                         /* D2 = SplitName 'separator' */
1479     subq.l      #1,%d4                  /* D4 = oldpos - 1 (?) */
1480                                                         
1481     move.l      %d3, %d1
1482     moveq       #4, %d0
1483     bsr         bstr_to_cstr
1484                                                 /* D1 = SplitName 'name' */
1486     move.l      %a1@(0), %d3    /* Recover D1 (buf) from A1[0] */
1487     lsl.l       #2,%d3
1488     addq.l      #1,%d3                  /* D3 = SplitName 'buf' */
1490         moveq   #30,%d5                 /* D5 = SplitName 'size' */
1492     jsr         %a6@(69 * -6)   /* SplitName */
1494     move.l      %d3,%a0
1495     moveq       #-1,%d1
1496 0:  addq.w      #1,%d1
1497     tst.b       %a0@+
1498         bne             0b
1499         move.l  %d3,%a0
1500         move.b  %d1,%a0@(-1)    /* fix buf BSTR length */
1501         
1502     addq.l      #1,%d0                  /* newpos + 1 (?) */
1503     movem.l     %sp@+,%d1-%d5/%a0-%a1/%a6
1504     BRTS
1506 BCPL lock           /* 1b0, FileLock ^, @name */
1507     movem.l     %d2/%a0-%a1/%a6,%sp@-
1508     move.l      %a2@(GV_DOSBase),%a6
1510     moveq.l     #1, %d0
1511     bsr         bstr_to_cstr
1513     moveq.l     #-2,%d2         /* Shared lock */
1514     jsr         %a6@(14 * -6)   /* DOS/Lock() */
1515     movem.l     %sp@+,%d2/%a0-%a1/%a6
1516     BRTS
1518 BCPL UnLock         /* 1b4, void, @FileLock */
1519     movem.l     %a0-%a1/%a6,%sp@-
1520     move.l      %a2@(GV_DOSBase),%a6
1521     jsr         %a6@(15 * -6)   /* DOS/UnLock() */
1522     movem.l     %sp@+,%a0-%a1/%a6
1523     BRTS
1525 BCPL getlong        /* 1b8, void, longoffset, &struct */
1526     lsl.l       #2,%d1
1527     add.l       %d2,%d1
1528     move.l      %a0@(%d1),%d0
1529     BRTS
1531 BCPL putlong        /* 1bc, void, longoffset, &struct, data */
1532     lsl.l       #2,%d1
1533     add.l       %d2,%d1
1534     move.l      %a0@(%d1),%d0
1535     move.l      %d3,%a0@(%d1)
1536     BRTS
1538 BCPLd openfile       /* 1c0, FileHandle ^, @devinfo, @filename */
1539     BRTS
1541 BCPL DupLock        /* 1c4, FileLock ^, @FileLock */
1542     movem.l     %a0-%a1/%a6,%sp@-
1543     move.l      %a2@(GV_DOSBase),%a6
1544     jsr         %a6@(16 * -6)   /* DOS/DupLock() */
1545     movem.l     %sp@+,%a0-%a1/%a6
1546     BRTS
1548 /* Calls ErrorReport(IoErr(), ...)
1549  * Why this is called 'makesysreq' is a question
1550  * for the TripOS guys.
1551  */
1552 BCPL makesysreq     /* 1c8, BOOL, type, arg, *msgport */
1553     movem.l     %a0-%a1/%a6,%sp@-
1554     move.l      %d3,%d4
1555     move.l      %d2,%d3
1556     move.l      %d1,%d2
1557     move.l      %a2@(GV_DOSBase),%a6
1558     jsr         %a6@(22 * -6)   /* IoErr */
1559     jsr         %a6@(80 * -6)   /* ErrorReport */
1560     movem.l     %sp@+,%a0-%a1/%a6
1561     BRTS
1563 BCPL strcpy         /* 1cc, void, @src, @dest */
1564     move.l      %d2,%sp@-
1565     lsl.l       #2,%d1
1566     lsl.l       #2,%d2
1567     moveq       #0,%d0
1568     move.b      %a0@(%d1),%d0
1569 0:  move.b      %a0@(%d1),%a0@(%d2)
1570     addq.l      #1,%d1
1571     addq.l      #1,%d2
1572     dbf         %d0,0b
1573     move.l      %sp@+,%d2
1574     BRTS
1576 BCPL runCommand    /* 1e4, void, @codeseg, stacklongs, @cmdline, cmdlinelength */
1577     movem.l     %a0-%a1/%a6,%sp@-
1578     lsl.l       #2,%d2
1579     lsl.l       #2,%d3
1580     move.l      %a2@(GV_DOSBase),%a6
1581     jsr         %a6@(84 * -6)   /* DOS/RunCommand() */
1582     movem.l     %sp@+,%a0-%a1/%a6
1583     BRTS
1585 BCPL lock_1ec       /* 1ec, FileLock ^, &name */
1586     movem.l     %d2/%a0-%a1/%a6,%sp@-
1587 #if BCPLSTRINGDEBUG
1588     move.l      %d1,%d0
1589     bsr         bstr_debug
1590 #endif
1591     move.l      %a2@(GV_DOSBase),%a6
1592     moveq.l     #1, %d0
1593     bsr         bstr_to_cstr
1594     moveq.l     #-2,%d2         /* Shared lock */
1595     jsr         %a6@(14 * -6)   /* DOS/Lock() */
1596     movem.l     %sp@+,%d2/%a0-%a1/%a6
1597     BRTS
1599 BCPL findDevInfo    /* 1f0, DevInfo ^, @name */
1600     movem.l     %d2-%d3/%a0-%a1/%a6,%sp@-
1601     move.l      %a2@(GV_DOSBase),%a6
1603 #if BCPLSTRINGDEBUG
1604     move.l      %d1,%d0
1605         bsr             bstr_debug
1606 #endif
1608     moveq.l     #1,%d0
1609     bsr         bstr_to_cstr
1611     move.l      %d1,%sp@-
1612     moveq       #0x1d,%d1       /* LDF_ALL | LDF_READ */
1613     jsr         %a6@(109 * -6)  /* DOS/LockDosList */
1614     move.l      %d0,%d1
1615     move.l      %sp@+,%d2
1616     moveq       #0x1d,%d3       /* LDF_ALL | LDF_READ */
1617     jsr         %a6@(114 * -6)  /* DOS/FindDosEntry */
1618     move.l      %d0,%sp@-
1619     moveq       #0x1d,%d1       /* LDF_ALL | LDF_READ */
1620     jsr         %a6@(110 * -6)  /* DOS/UnlockDosList */
1621     move.l      %sp@+,%d0
1622     lsr.l       #2,%d0
1623     movem.l     %sp@+,%d2-%d3/%a0-%a1/%a6
1624     BRTS
1626 BCPL createDir      /* 1f4, FileLock^, @name */
1627     movem.l     %a0-%a1/%a6,%sp@-
1628     move.l      %a2@(GV_DOSBase),%a6
1630     moveq.l     #1,%d0
1631     bsr         bstr_to_cstr
1633     jsr         %a6@(20 * -6)   /* DOS/CreateDir() */
1634     movem.l     %sp@+,%a0-%a1/%a6
1635     BRTS
1637 BCPLd compareTime    /* 1f8, SIGN , @timeval, @timeval */
1638     /* I suspect this is actually Dos/CompareDates(), but
1639      * I haven't found a user of this routine yet.
1640      */
1641     BRTS
1643 BCPL timerIO        /* 1fc, void, command, @IOStdReq, secs, usecs */
1644     movem.l     %a0-%a1/%a6,%sp@-
1645     lsl.l       #2,%d2
1646     move.l      %d2,%a1
1647     move.w      %d1,%a1@(io_Command)
1648     move.l      %d3,%a1@(tr_time + 0)
1649     move.l      %d4,%a1@(tr_time + 4)
1650     move.l      SysBase, %a6
1651     jsr.l       %a6@(76 * -6)   /* Exec/DoIO() */
1652     moveq.l     #-1,%d0 
1653     movem.l     %sp@+,%a0-%a1/%a6
1654     BRTS
1656 BCPL settime        /* 200, void, @DateStamp */
1657     move.l      %a2@(GV_DOSBase),%d0
1658     move.l      %a0@(dl_TimeReq,%d0),%d2
1659     lsl.l       #2,%d1
1660     move.l      %a0@(0,%d1),%d3 /* ds_Days */
1661     mulu.w      #(60*24),%d3    /* mulu.w is fine until 2162 AD,  */
1662                                 /* but tv_secs is too small in 2047 AD */
1663     add.l       %a0@(4,%d1),%d3 /* ds_Minute */
1664     move.l      %d3,%d4
1665     mulu.w      #(60),%d3
1666     lsr.l       #8,%d4
1667     lsr.l       #8,%d4
1668     mulu.w      #(60),%d4
1669     lsl.l       #8,%d4
1670     lsl.l       #8,%d4
1671     add.l       %d4,%d3
1672     mov.l       %a0@(8,%d1),%d4 /* ds_Tick */
1673     divu.w      #50,%d4
1674     ext.l       %d4
1675     add.l       %d4,%d3
1676     moveq.l     #0,%d4
1677     lsr.l       #2,%d2
1678     move.l      #11,%d1         /* TR_SETSYSTIME */
1679     move.l      #(1*4 + 3*4),%d0
1680     move.l      %a2@(GV_timerIO),%a4
1681     jsr         %a5@
1682     BRTS
1684     /*
1685      * On AOS, this routine called the internal
1686      * CliInit(), which handled setting up the
1687      * core SYS: lock, assigns, and paths.
1688      *
1689      * The (normally NULL) DOS Packet is always ignored.
1690      *
1691      * Although (for various reasons) this has been done
1692      * before this routine has been called, we still need
1693      * to call CliInit* to process the inbound AROS packet.
1694      *
1695      * If the passed in DOS Packet is NULL, then we have
1696      * nothing to do, since that's not valid under AROS.
1697      *
1698      * If the DOS Packet is *not* NULL, then pass it
1699      * to the appropriate CliInit* routine.
1700      *
1701      */
1702 BCPL CliInit         /* 214, APTR, @DosPacket */
1703     tst.l       %d1
1704     beq.s       .L_CliInit_exit
1706     lsl.l       #2,%d1
1707     move.l      %a0@(dp_Res1,%d1),%d2
1708     tst.l       %d2
1709     beq.s       .L_CliInit_Run
1711 .L_CliInit_Newcli:
1712     /* CliInitNewcli */
1713     move.l      #(155*-6),%d2
1714     bra.s       .L_CliInit_Init
1716 .L_CliInit_Run:
1717     /* CliInitRun */
1718     move.l      #(156*-6),%d2
1720 .L_CliInit_Init:
1721     movem.l      %a0-%a1/%a6,%sp@-
1722     move.l      %d1,%a0
1723     move.l      %a2@(GV_DOSBase),%a6
1724     jsr         %a6@(%d2)
1725     movem.l      %sp@+,%a0-%a1/%a6
1726 .L_CliInit_exit:
1727     BRTS
1729 BCPLnd CliInit_NEWCLI
1730     lsl.l       #2, %d1
1731     move.l      #1, %a0@(dp_Type, %d1)
1732     jmp         .L_CliInit_Newcli
1734 BCPLnd CliInit_RUN
1735     lsl.l       #2, %d1
1736     move.l      #-1, %a0@(dp_Type, %d1)
1737     jmp         .L_CliInit_Run
1739 BCPLnd CliInit_SYSTEM
1740     lsl.l       #2, %d1
1741     move.l      #-2, %a0@(dp_Type, %d1)
1742     jmp         .L_CliInit_Run
1744 BCPLnd CliInit_ASYSTEM
1745     lsl.l       #2, %d1
1746     move.l      #-3, %a0@(dp_Type, %d1)
1747     jmp         .L_CliInit_Run
1749 BCPLnd CliInit_BOOT
1750     lsl.l       #2, %d1
1751     move.l      #-4, %a0@(dp_Type, %d1)
1752     jmp         .L_CliInit_Run
1755 BCPL findCLI        /* 218, CommandLineInterpreter ^,  */
1756     movem.l             %a0-%a1/%a6,%sp@-
1757     move.l              %a2@(GV_DOSBase),%a6
1758     jsr                 %a6@(82 * -6)   /* DOS/Cli() */
1759     lsr.l               #2,%d0
1760     movem.l             %sp@+,%a0-%a1/%a6
1761     BRTS
1764 /* Helper routines */
1765     /* Convert BCPL string to Cstring inline in the A1 vector
1766      * In:
1767      *   D0: Index into A1, in words, to hold dest
1768      *   D1: BSTR to convert
1769      *   A1: ULONG vector
1770      * Out:
1771      *   D0: Clobbered
1772      *   D1: Memory address of Cstring
1773      *   A1: Unchanged
1774      */
1775 bstr_to_cstr:
1776     movem.l     %d0/%a0-%a1,%sp@-
1777     sub.l       %a0,%a0
1778     lsl.l       #2,%d1
1779     addq.l      #1,%d1
1780     clr.l       %sp@-
1781     move.b      %a0@(-1,%d1),%sp@(3)    /* Arg3 = strlen */
1782     move.l      %d1,%sp@-               /* Arg2 = src */
1783     lsl.l       #2,%d0
1784     pea.l       %a1@(%d0)               /* Arg1 = dest */
1785     jsr         memcpy
1786     move.l      %sp@+,%a0               /* A0 = dest */
1787     addq.l      #4,%sp                  /* Drop src */
1788     move.l      %sp@+,%d1               /* D1 = strlen */
1789     move.b      #0,%a0@(%d1)            /* Terminate string with an ASCIIZ */
1790     move.l      %a0,%d1                 /* D1 = dest */
1791     movem.l     %sp@+,%d0/%a0-%a1
1792     rts
1794 #if BCPLSTRINGDEBUG
1795 .bstr_format:
1796     .string  "'%b'\n"
1797 bstr_debug:
1798         movem.l %d1/%a0-%a1,%sp@-
1799     move.l  %d0,%sp@-
1800     pea         .bstr_format(%pc)
1801     jsr     kprintf
1802     addq.l      #8,%sp
1803     movem.l     %sp@+,%d1/%a0-%a1
1804     rts
1805 #endif