2 Copyright © 1995-2009, The AROS Development Team. All rights reserved.
5 Desc: BCPL stubs that call into Exec and Dos libraries.
9 #define BCPLSTRINGDEBUG 0
10 #include <aros/m68k/asm.h>
14 #define BCPL(id,name) .equ GV_##name, id
18 /* BCPL equivalents of JSR and RTS */
22 .globl BCPL_jsr /* A5 */
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 */
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 */
32 /* Call out to GCC's __mulsi3 */
42 /* Call out to GCC's __divsi3 and __modsi3 */
54 .globl BCPL_rts /* A6 */
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 */
65 .string "BCPL %s, D1=%p D2=%p D3=%p D4=%p, GV %p\n"
67 .string " %s, D1=%p\n"
69 .string " %s, D1=%p IoErr=%p\n"
71 /* For dummy functions */
80 /* Stash away pr_Result2 into the GV */
82 move.l %a0@(ThisTask),%a0
83 move.l %a0@(pr_Result2),%d0
84 move.l %d0,%a2@(GV_DEBUG_Result2)
87 movem.l %d1/%a0-%a1,%sp@-
94 move.l #.LBCPL_format_trace,%sp@-
98 movem.l %sp@+,%d1/%a0-%a1
99 clr.l %d0 /* DOSFALSE */
103 /* Retrieve old pr_Result2 */
104 move.l %a2@(GV_DEBUG_Result2), %d2
106 movem.l %d0/%a0-%a1,%sp@-
108 move.l %a0@(ThisTask),%a0
109 move.l %a0@(pr_Result2),%a1
115 move.l #.LBCPL_format_err,%sp@-
118 move.l #.LBCPL_format_ret,%sp@-
120 jsr bcpl_command_name
123 movem.l %sp@+,%d0/%a0-%a1
128 /* For real functions */
148 /* Global vector table entries */
149 BCPLd sysRequest /* -84, void, @line1, @line2, @line3 */
152 BCPL toCStr /* -80, char *, @string */
158 BCPL toBSTR /* -7c, void, &src, @dest */
159 movem.l %d1-%d2,%sp@-
165 move.b %a0@(%d2),%a0@(%d1)
173 movem.l %sp@+,%d1-%d2
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
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
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
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
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
211 BCPLd QueuePacket /* -54, void */
214 BCPL clearmem /* -50, void, @buff, lw_length */
222 dbf %d2,.Lclearmem_loop
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
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
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
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
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
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
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
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
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
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
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
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
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
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
324 BCPL memcpy /* -08, void, @src, @dest, n */
325 movem.l %d2-%d3/%a0-%a1,%sp@-
336 movem.l %sp@+,%d2-%d3/%a0-%a1
339 BCPL Open /* -04, FileHandle ^, &name, mode */
340 movem.l %a0-%a1/%a6,%sp@-
347 move.l %a2@(GV_DOSBase),%a6
348 jsr %a6@(5 * -6) /* DOS/Open() */
349 movem.l %sp@+,%a0-%a1/%a6
355 /* FALLTHROUGH to BCPL_Exit */
357 BCPL Exit /* 08, void, code */
363 move.l %a0@(pr_ReturnAddr),%a0
368 BCPL multiply /* 0c, D1 = D1 * D2 */
372 BCPL divide /* 10, D1 = D1 / D2 */
377 BCPL mod /* 14, D1 = D1 % D2 */
379 move.l %d2,%d0 /* BRTS does move.l %d0,%d1 */
383 BCPL setIO /* 18, void, @IOStdReq, command, &data, len, offset */
385 move.w %d2,%a0@(28,%d1)
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)
394 BCPLd packlw /* 20, ?? */
397 BCPLd unpacklw /* 24, ?? */
400 BCPL Res2 /* 28, LONG, is_set_flag, result_code */
401 movem.l %a0-%a1/%a6,%sp@-
402 move.l %a2@(GV_DOSBase),%a6
407 jsr %a6@(77 * -6) /* DOS/SetIoErr */
409 jsr %a6@(22 * -6) /* DOS/IoErr */
410 movem.l %sp@+,%a0-%a1/%a6
413 /* 30, BCPL_FrameLower */
415 BCPLd makeGVarea /* 34, void, @buff */
418 BCPL findtask /* 38, &Process->MsgPort *, */
419 movem.l %a0-%a1/%a6,%sp@-
423 add.l #92,%d0 /* point to &MsgPort */
424 movem.l %sp@+,%a0-%a1/%a6
427 BCPLd getbyte /* 3c, BYTE, @lw_addr, bytenum */
430 BCPLd putbyte /* 40, BYTE, @lw_addr, bytenum, byte */
433 BCPL level /* 44, LONG (or BPTR?) */
434 move.l %a1@(-12),%d0 /* Return caller's BCPL frame */
437 BCPL longcall /* 48, LONG, level, label */
442 BCPL allocMem /* 4c, BPTR, lwlength, reqs */
443 movem.l %a0-%a1/%a6,%sp@-
446 addq.l #4,%d0 /* 4 additional words for padding */
449 bset.l #16,%d1 /* MEMF_CLEAR */
450 jsr %a6@(114 * -6) /* Exec/AllocVec() */
452 movem.l %sp@+,%a0-%a1/%a6
455 BCPLd longjump /* 50, LONG, label */
458 BCPL doIO /* 54, LONG, @IORequest */
459 movem.l %a0-%a1/%a6,%sp@-
463 jsr %a6@(76 * -6) /* Exec/DoIO() */
466 movem.l %sp@+,%a0-%a1/%a6
469 BCPL sendIO /* 58, void, @IORequest */
470 movem.l %a0-%a1/%a6,%sp@-
473 move.l %d2,%a0@(ln_Name,%d1) /* NULL dos packet */
476 jsr %a6@(77 * -6) /* Exec/SendIO */
477 movem.l %sp@+,%a0-%a1/%a6
480 /* Coroutine support:
487 BCPLd createco /* 5c, void, @coroutine, lwlength */
490 BCPLd deleteco /* 60, void, @coroutine */
493 BCPLd callco /* 64, void, @coroutine, arg */
496 BCPLd cowait /* 68, void, result */
499 BCPLd resumeco /* 6c, void, @coroutine */
502 BCPL installSeg /* 70, BOOL, @memseg_BCPL */
503 movem.l %a0-%a1,%sp@-
508 movem.l %sp@+,%a0-%a1
511 BCPL getvec /* 74, LONG ^, lw_length */
512 movem.l %a0-%a1/%a6,%sp@-
515 addq.l #4,%d0 /* 4 additional words for padding */
518 bset.l #16,%d1 /* MEMF_CLEAR */
519 jsr %a6@(114 * -6) /* Exec/AllocVec() */
521 movem.l %sp@+,%a0-%a1/%a6
524 BCPL freevec /* 78, void, @vec */
525 movem.l %a0-%a1/%a6,%sp@-
529 jsr %a6@(115 * -6) /* Exec/FreeVec() */
530 movem.l %sp@+,%a0-%a1/%a6
533 BCPL openDevice /* 7c, BOOL, @IORequest, @name, unit, flags */
534 movem.l %d5/%a0-%a1/%a6,%sp@-
553 move.l %d0,%a1@(14) /* replyport = &Process->pr_MsgPort */
556 jsr %a6@(74 * -6) /* Exec/OpenDevice() */
563 movem.l %sp@+,%d5/%a0-%a1/%a6
566 BCPL closeDevice /* 80, void, @IORequest */
567 movem.l %a0-%a1/%a6,%sp@-
571 jsr %a6@(75 * -6) /* Exec/CloseDevice() */
572 movem.l %sp@+,%a0-%a1/%a6
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
589 jsr BCPL_CreateProcBCPL
590 lea.l %sp@(5 * 4),%sp
591 movem.l %sp@+,%a0-%a1/%a6
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
604 BCPL setSignals /* 90, void, &MsgPort, mask */
605 movem.l %a0-%a1/%a6,%sp@-
607 add.l #mp_SigTask,%d1
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
617 BCPL clearSignals /* 94, BOOL , mask */
618 movem.l %d2/%a0-%a1/%a6,%sp@-
625 jsr %a6@(51 * -6) /* SetSignal */
631 movem.l %sp@+,%d2/%a0-%a1/%a6
634 BCPL DOSAlert /* 98, void, alertnumber */
635 movem.l %d7/%a0-%a1/%a6,%sp@-
638 jsr %a6@(18 * -6) /* Exec/Alert() */
639 movem.l %sp@+,%d7/%a0-%a1/%a6
642 BCPL findRootNode /* 9c, RootNode @, */
643 move.l %a2@(GV_DOSBase),%d0
645 move.l %a0@(%d0),%d0 /* %a0 is always 0 in BCPL */
649 BCPL readinput /* a0, bytelength , &buf, bytelength */
650 movem.l %d1-%d3/%a0-%a1/%a6,%sp@-
651 move.l %a2@(GV_DOSBase),%a6
654 jsr %a6@(9 * -6) /* DOS/Input() */
656 jsr %a6@(7 * -6) /* DOS/Read() */
657 movem.l %sp@+,%d1-%d3/%a0-%a1/%a6
660 /* Wait on the process's pr_MsgPort for a packet.
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() */
667 movem.l %sp@+,%a0-%a1/%a6
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.
674 BCPL putPkt /* a8, void, @DosPacket */
675 movem.l %a0-%a1/%a6,%sp@-
676 move.l %a2@(GV_DOSBase),%a6
678 movem.l %sp@+,%a0-%a1/%a6
681 BCPL writeoutput /* ac, void, &buf, bytelength */
682 movem.l %d2-%d3/%a0-%a1/%a6,%sp@-
683 move.l %a2@(GV_DOSBase),%a6
686 jsr %a6@(10 * -6) /* DOS/Output() */
688 jsr %a6@(8 * -6) /* DOS/Write() */
689 movem.l %sp@+,%d2-%d3/%a0-%a1/%a6
692 /* copy src LONG array to destination, LONG -> BYTE */
693 BCPL packstring /* b0, long, @Array, @String */
694 movem.l %d2-%d3/%a0-%a1,%sp@-
717 movem.l %sp@+,%d2-%d3/%a0-%a1
720 /* copy src BSTR to destination array, BYTE -> LONG */
721 BCPL unpackstring /* b4, void, @String, @Array */
722 movem.l %a0-%a1,%sp@-
739 movem.l %sp@+,%a0-%a1
742 BCPLd holdTask /* b8, void, @memseg */
745 BCPL Delay /* bc, void, ticks */
746 movem.l %a0-%a1/%a6,%sp@-
747 move.l %a2@(GV_DOSBase),%a6
748 jsr %a6@(33 * -6) /* DOS/Delay() */
749 movem.l %sp@+,%a0-%a1/%a6
752 /* Call the DOS internal 'dopacket' function
754 BCPL sendPacket /* c0, BOOL, -, MsgPort, Type, -, -, Arg1,... */
755 movem.l %a0-%a1/%a6,%sp@-
756 move.l %a1@((4 + 7) * 4), %sp@- /* Arg7 */
757 move.l %a1@((4 + 6) * 4), %sp@- /* Arg6 */
758 move.l %a1@((4 + 5) * 4), %sp@- /* Arg5 */
759 move.l %a1@((4 + 4) * 4), %sp@- /* Arg4 */
760 move.l %a1@((4 + 3) * 4), %sp@- /* Arg3 */
761 move.l %a1@((4 + 2) * 4), %sp@- /* Arg2 */
762 move.l %a1@((4 + 1) * 4), %sp@- /* Arg1 */
763 move.l %d3, %sp@- /* Type */
764 move.l %d2, %sp@- /* Port */
765 move.l %a0, %sp@- /* A0 is still 0 */
767 lea.l %sp@(10 * 4), %sp
768 movem.l %sp@+,%a0-%a1/%a6
771 BCPL returnPacket /* c4, void, @DosPacket, res1, res2 */
772 tst.l %d1 /* Don't try to reply NULL Dos Packets */
774 movem.l %a0-%a1/%a6,%sp@-
775 move.l %a2@(GV_DOSBase),%a6
777 jsr %a6@(43 * -6) /* DOS/ReplyPkt() */
778 movem.l %sp@+,%a0-%a1/%a6
783 #define TAG_USER (1 << 31)
784 #define WA_Dummy (TAG_USER + 99)
785 #define WA_Left (WA_Dummy + 1)
786 #define WA_Top (WA_Dummy + 2)
787 #define WA_Width (WA_Dummy + 3)
788 #define WA_Height (WA_Dummy + 4)
789 #define WA_Title (WA_Dummy + 11)
790 #define WA_PubScreen (WA_Dummy + 22)
791 #define WA_AutoAdjust (WA_Dummy + 45)
793 BCPL openWindow /* c8, struct Window *, leftedge, topedge, width, height, @title */
794 movem.l %a0-%a1/%a6,%sp@-
795 move.l %a2@(GV_DOSBase),%a6
796 move.l %a6@(dl_IntuitionBase),%a6
797 move.l #TAG_END, %sp@-
799 move.l #WA_AutoAdjust, %sp@-
801 move.l #WA_PubScreen, %sp@-
802 move.l %a1@(4*4),%sp@-
803 move.l #WA_Title, %sp@-
805 move.l #WA_Height, %sp@-
807 move.l #WA_Width, %sp@-
809 move.l #WA_Top, %sp@-
811 move.l #WA_Left, %sp@-
812 move.l %sp, %a1 /* a0 is still 0 here */
813 jsr %a6@(101 * -6) /* OpenWindowTagList */
814 lea.l %sp@(15 * 4),%sp
815 movem.l %sp@+,%a0-%a1/%a6
818 /* If BOOL is DOSTRUE, set current directory
819 * Always return old current directory
821 BCPL setCurrentDir /* cc, FileLock @, BOOL, @FileLock */
822 movem.l %d3-%d4/%a0-%a1/%a6,%sp@-
830 /* sanity check in CurrentDir() complained so I did this */
831 move.l %a0@(152),%d4 /* pr_CurrentDir */
836 move.l %a2@(GV_DOSBase),%a6
838 jsr %a6@(21 * -6) /* DOS/CurrentDir() */
841 movem.l %sp@+,%d3-%d4/%a0-%a1/%a6
844 BCPLd systemRequest /* d0, void, @line1, @line2, @line3 */
847 BCPL writet /* d4, void, @string, n */
848 movem.l %d2-%d4,%sp@-
850 lsl.l #2, %d3 /* D3 = BADDR(string) */
852 move.b %a0@(%d3),%d4 /* D4 = string[0] (strlen) */
854 beq .LBCPL_writet_pad
856 bra .LBCPL_writet_loop_cond
859 addq.l #1,%d3 /* D3 = pointer to next char */
860 subq.l #1,%d2 /* D2 = reduce pad amount by 1 */
861 move.l #(3*4 + 1*4),%d0
863 move.b %a0@(%d3),%d1 /* D1 = next char */
864 move.l %a2@(GV_wrch), %a4
866 .LBCPL_writet_loop_cond:
867 dbf %d4,.LBCPL_writet_loop
871 ble .LBCPL_writet_exit
872 bra .LBCPL_writet_pad_cond
874 .LBCPL_writet_pad_loop:
875 move.l #(3*4 + 2*4),%d0
877 move.l %a2@(GV_wrch), %a4
879 .LBCPL_writet_pad_cond:
880 dbf %d2,.LBCPL_writet_pad_loop
883 movem.l %sp@+,%d2-%d4
886 BCPLnd rdch /* d8, char , */
887 movem.l %a0-%a1/%a6,%sp@-
888 move.l %a2@(GV_DOSBase),%a6
889 jsr %a6@(9 * -6) /* DOS/Input() */
891 jsr %a6@(51 * -6) /* DOS/FGetC() */
892 movem.l %sp@+,%a0-%a1/%a6
895 BCPL unrdch /* dc, void, */
896 movem.l %d2/%a0-%a1/%a6,%sp@-
897 move.l %a2@(GV_DOSBase),%a6
898 jsr %a6@(9 * -6) /* DOS/Input() */
901 jsr %a6@(53 * -6) /* DOS/UnGetC() */
902 movem.l %sp@+,%d2/%a0-%a1/%a6
905 BCPLnd wrch /* e0, void, char */
906 movem.l %d2/%a0-%a1/%a6,%sp@-
907 move.l %a2@(GV_DOSBase),%a6
909 jsr %a6@(10 * -6) /* DOS/Output() */
911 jsr %a6@(52 * -6) /* DOS/FPutC() */
912 movem.l %sp@+,%d2/%a0-%a1/%a6
915 BCPL readinput_long /* e4, lwlength , @buf, lwlength */
916 movem.l %d1-%d3/%a0-%a1/%a6,%sp@-
917 move.l %a2@(GV_DOSBase),%a6
920 jsr %a6@(9 * -6) /* DOS/Input() */
924 jsr %a6@(7 * -6) /* DOS/Read() */
926 movem.l %sp@+,%d1-%d3/%a0-%a1/%a6
929 BCPL writeoutput_long /* e8, void, @buf, lwlength */
930 movem.l %d2-%d4/%a0-%a1/%a6,%sp@-
931 move.l %a2@(GV_DOSBase),%a6
932 move.l %d2, %d4 /* Num blocks */
933 moveq.l #4, %d3 /* Block len (sizeof(ULONG)) */
934 move.l %d1, %d2 /* Buffer */
936 jsr %a6@(10 * -6) /* DOS/Output() */
937 move.l %d0, %d1 /* Outfile */
938 jsr %a6@(55 * -6) /* DOS/FWrite() */
939 movem.l %sp@+,%d2-%d4/%a0-%a1/%a6
942 BCPL findinput /* ec, FileHandle ^, @name */
943 movem.l %d2/%a0-%a1/%a6,%sp@-
953 move.l %a2@(GV_DOSBase),%a6
954 move.l #1005 /* MODE_OLDFILE */,%d2
955 jsr %a6@(5 * -6) /* DOS/Open() */
956 movem.l %sp@+,%d2/%a0-%a1/%a6
959 BCPL findoutput /* f0, FileHandle ^, @name */
960 movem.l %d2/%a0-%a1/%a6,%sp@-
970 move.l %a2@(GV_DOSBase),%a6
971 move.l #1006 /* MODE_NEWFILE */,%d2
972 jsr %a6@(5 * -6) /* DOS/Open() */
973 movem.l %sp@+,%d2/%a0-%a1/%a6
976 BCPL SelectInput /* f4, void , @FileHandle */
977 movem.l %a0-%a1/%a6,%sp@-
978 move.l %a2@(GV_DOSBase),%a6
979 jsr %a6@(49 * -6) /* DOS/SelectInput() */
980 movem.l %sp@+,%a0-%a1/%a6
983 BCPL SelectOutput /* f8, void , @FileHandle */
984 movem.l %a0-%a1/%a6,%sp@-
985 move.l %a2@(GV_DOSBase),%a6
986 jsr %a6@(50 * -6) /* DOS/SelectOutput() */
987 movem.l %sp@+,%a0-%a1/%a6
990 BCPL endread /* fc, void, */
991 movem.l %a0-%a1/%a6,%sp@-
992 move.l %a2@(GV_DOSBase),%a6
993 jsr %a6@(9 * -6) /* DOS/Input() */
995 jsr %a6@(6 * -6) /* DOS/Close() */
997 jsr %a6@(49 * -6) /* DOS/SelectInput() */
998 movem.l %sp@+,%a0-%a1/%a6
1001 BCPL endwrite /* 100, void, */
1002 movem.l %a0-%a1/%a6,%sp@-
1003 move.l %a2@(GV_DOSBase),%a6
1004 jsr %a6@(10 * -6) /* DOS/Output() */
1006 jsr %a6@(6 * -6) /* DOS/Close() */
1008 jsr %a6@(50 * -6) /* DOS/SelectOutput() */
1009 movem.l %sp@+,%a0-%a1/%a6
1012 BCPL Input /* 104, FileHandle @, */
1013 movem.l %a0-%a1/%a6,%sp@-
1014 move.l %a2@(GV_DOSBase),%a6
1015 jsr %a6@(9 * -6) /* DOS/Input() */
1016 movem.l %sp@+,%a0-%a1/%a6
1019 BCPL Output /* 108, FileHandle @, */
1020 movem.l %a0-%a1/%a6,%sp@-
1021 move.l %a2@(GV_DOSBase),%a6
1022 jsr %a6@(10 * -6) /* DOS/Output() */
1023 movem.l %sp@+,%a0-%a1/%a6
1026 BCPLd readn /* 10c, void, */
1029 BCPL newline /* 110, void, */
1033 BCPL_write_base: /* number, width, base, canneg */
1034 movem.l %d2-%d7,%sp@-
1036 move.l %d3,%d6 /* D6 = base */
1037 move.l %d2,%d5 /* D5 = width */
1038 move.l %d1,%d3 /* D3 = Number */
1042 beq .Lwrite_base_pos
1044 tst.l %d3 /* Number < 0? */
1045 bge .Lwrite_base_pos
1047 bset #31,%d7 /* D7 bit 31 = negative sign needed */
1052 clr.l %d4 /* D4 = Digit */
1053 clr.w %d7 /* D7 = Num pushed chars */
1058 jsr %a5@(0x12) /* divmod: D1 = D3/base, D2 = D3 % base */
1065 add.b #(('A'-10)-'0'),%d1
1067 add.b #'0',%d1 /* D1 = '0' .. '9' */
1068 move.b %d1, %a1@(3*4 + 4*4, %d7.w)
1072 bgt.s .Lwrite_base_loop
1074 /* Any extra field bits? */
1075 bra .LBCPL_write_base_pad_cond
1076 .LBCPL_write_base_pad:
1079 beq.s .LBCPL_write_base_pad_char
1081 .LBCPL_write_base_pad_char:
1082 move.l #(3*4 + 4*4 + 8*4), %d0
1083 move.l %a2@(GV_wrch), %a4
1085 .LBCPL_write_base_pad_cond:
1087 bpl.s .LBCPL_write_base_pad
1090 beq.s .Lwrite_base_emit
1093 move.l #(3*4 + 4*4 + 8*4), %d0
1094 move.l %a2@(GV_wrch), %a4
1102 move.b %a1@(3*4 + 4*4, %d7.w),%d1
1103 move.l #(3*4 + 4*4 + 8*4), %d0
1104 move.l %a2@(GV_wrch), %a4
1106 jmp .Lwrite_base_emit
1109 movem.l %sp@+,%d2-%d7
1112 BCPL writei /* 114, void, number, width */
1113 movem.l %d3-%d4,%sp@-
1115 move.l #(3*4 + 2*4), %d0
1118 lea.l BCPL_write_base, %a4
1121 movem.l %sp@+,%d3-%d4
1124 BCPL writen /* 118, void, number */
1125 movem.l %d2-%d4,%sp@-
1127 move.l #(3*4 + 1*4), %d0
1131 lea.l BCPL_write_base, %a4
1134 movem.l %sp@+,%d2-%d4
1137 BCPL writehex /* 11c, void, number, width */
1138 movem.l %d3-%d4,%sp@-
1140 move.l #(3*4 + 2*4), %d0
1143 lea.l BCPL_write_base, %a4
1146 movem.l %sp@+,%d3-%d4
1149 BCPL writeoct /* 120, void, number, width */
1150 movem.l %d3-%d4,%sp@-
1152 move.l #(3*4 + 2*4), %d0
1155 lea.l BCPL_write_base, %a4
1158 movem.l %sp@+,%d3-%d4
1161 BCPL writes /* 124, void, @string */
1164 move.l #(3*4 + 1*4),%d0
1165 move.l %a2@(GV_writet), %a4
1170 #if 0 /* This is defined in bcpl_writef.S */
1171 BCPLd writef /* 128, void, @format, arg1, arg2, ... */
1175 BCPL toupper /* 12c, void, char */
1184 BCPL charicmp /* 130, long , char1, char2 */
1199 BCPL stricmp /* 134, long , @String1, @String2 */
1200 movem.l %d1-%d3/%a0-%a1,%sp@-
1241 movem.l %sp@+,%d1-%d3/%a0-%a1
1244 BCPL rdargs /* 138, ULONG, @template, array, array_size */
1245 /* BCPL rdargs and DOS/ReadArgs() don't match up
1246 * very nicely. We'll need to call a BCPL/ReadArgs
1247 * routine that works the way this expects
1249 movem.l %a0-%a1/%a6,%sp@-
1250 move.l %a2@(GV_DOSBase),%a6
1252 movem.l %sp@+,%a0-%a1/%a6
1255 BCPL rditem /* 13c, void, @buf, maxlongs */
1256 movem.l %d2-%d3/%a0-%a2/%a6,%sp@-
1257 move.l %a2@(GV_DOSBase),%a6
1265 /* this can't be right but at least c:execute does something now */
1266 jsr %a6@(135 * -6) /* DOS/ReadItem() */
1273 move.b %d2,%a2@(-1) /* fix buf BSTR length */
1284 movem.l %sp@+,%d2-%d3/%a0-%a2/%a6
1287 BCPL subString /* 140, void, @string, @substring */
1289 movem.l %d2-%d3/%a0-%a6,%sp@-
1291 move.l %a2@(GV_DOSBase),%a5
1314 jsr %a6@(114 * -6) /* AllocVec */
1323 beq.s findarg_copy11
1326 bra.s findarg_copy12
1333 beq.s findarg_copy21
1336 bra.s findarg_copy22
1341 jsr %a6@(134 * -6) /* DOS/FindArg() */
1347 jsr %a6@(115 * -6) /* FreeVec */
1350 movem.l %sp@+,%d2-%d3/%a0-%a6
1353 /* C:Resident uses this */
1354 BCPL load /* 144, SegList ^, @filename */
1355 movem.l %a0-%a1/%a6,%sp@-
1356 move.l %a2@(GV_DOSBase),%a6
1365 jsr %a6@(25 * -6) /* DOS/LoadSeg() */
1366 movem.l %sp@+,%a0-%a1/%a6
1369 BCPL UnLoadSeg /* 148, void, @seg */
1370 movem.l %a0-%a1/%a6,%sp@-
1371 move.l %a2@(GV_DOSBase),%a6
1372 jsr %a6@(26 * -6) /* DOS/UnLoadSeg */
1373 movem.l %sp@+,%a0-%a1/%a6
1376 BCPLd tidyup /* 150, void, */
1379 BCPL addDevice /* 154, void, @name */
1380 movem.l %d2/%a0-%a1/%a6,%sp@-
1381 move.l %a2@(GV_DOSBase),%a6
1390 moveq #0,%d2 /* DLT_DEVICE */
1391 jsr %a6@(116 * -6) /* DOS/MakeDosEntry */
1396 jsr %a6@(113 * -6) /* DOS/AddDosEntry */
1399 jsr %a6@(117 * -6) /* DOS/FreeDosEntry */
1402 movem.l %sp@+,%d2/%a0-%a1/%a6
1405 BCPL datestamp /* 158, @DateStamp, @DateStamp */
1406 movem.l %a0-%a1/%a6,%sp@-
1408 move.l %a2@(GV_DOSBase),%a6
1409 jsr.l %a6@(32 * -6) /* DOS/DateStamp() */
1411 movem.l %sp@+,%a0-%a1/%a6
1414 BCPLd WaitForChar /* 15c, BOOL , @FileHandle, time */
1417 BCPL execLib /* 160, long , LVOffset, d0, d1, a0, a1, a2 */
1418 movem.l %d2/%a0-%a3/%a6,%sp@-
1422 movem.l %a3@(4),%d0-%d1/%a0-%a2
1424 movem.l %sp@+,%d2/%a0-%a3/%a6
1427 BCPL findSegArray /* 164, Array @, */
1428 movem.l %a0-%a1/%a6,%sp@-
1433 move.l %a0@(pr_SegList),%d0
1434 movem.l %sp@+,%a0-%a1/%a6
1437 BCPL deleteObject /* 168, void, @name */
1438 movem.l %a0-%a1/%a6,%sp@-
1441 move.l %a2@(GV_DOSBase),%a6
1442 jsr %a6@(12 * -6) /* DOS/DeleteFile() */
1443 movem.l %sp@+,%a0-%a1/%a6
1446 BCPL rename /* 16c, void, @oldname, @newname */
1447 movem.l %d2/%a0-%a2/%a6,%sp@-
1448 move.l %a2@(GV_DOSBase),%a6
1455 0: move.b %a0@+,%a1@+
1462 jsr %a6@(13 * -6) /* DOS/Rename() */
1464 movem.l %sp@+,%d2/%a0-%a2/%a6
1467 /* 170 - contains APTR to IntuitionBase */
1469 BCPL Close /* 174, void, @FileHandle */
1470 movem.l %a0-%a1/%a6,%sp@-
1471 move.l %a2@(GV_DOSBase),%a6
1472 jsr %a6@(6 * -6) /* DOS/Close() */
1473 movem.l %sp@+,%a0-%a1/%a6
1476 BCPLd getword /* 178, void, longaddress, wordnumber */
1479 BCPLd putword /* 17c, void, longaddress, wordnumber */
1483 BCPLd taskwait_190 /* 190, DosPacket ^, */
1486 BCPL execute /* 194, void, &string , @in, @out */
1487 movem.l %a0-%a1/%a6,%sp@-
1488 move.l %a2@(GV_DOSBase),%a6
1489 jsr %a6@(37 * -6) /* DOS/Execute() */
1490 movem.l %sp@+,%a0-%a1/%a6
1493 BCPL deviceproc /* 198, FileLock ^, @filename */
1494 movem.l %a0-%a1/%a6,%sp@-
1495 move.l %a2@(GV_DOSBase),%a6
1500 jsr %a6@(29 * -6) /* DOS/DeviceProc() */
1501 movem.l %sp@+,%a0-%a1/%a6
1504 BCPL libcall /* 19c, void, libbase, LVOffset, d0, d1, a0, a1 */
1505 movem.l %a0-%a1/%a6,%sp@-
1507 move.l %a1@(0x08),%d0
1508 move.l %a1@(0x0c),%d1
1509 move.l %a1@(0x10),%a0
1510 move.l %a1@(0x14),%a1
1512 movem.l %sp@+,%a0-%a1/%a6
1515 BCPLd writeErr /* 1a0, ??, ?? */
1519 BCPL findConsoleHandler /* 1a4, MsgPort *, */
1520 movem.l %a0-%a1/%a6,%sp@-
1525 move.l %a0@(pr_ConsoleTask),%d0
1526 movem.l %sp@+,%a0-%a1/%a6
1529 BCPL findFileHandler /* 1a8, MsgPort *, */
1530 movem.l %a0-%a1/%a6,%sp@-
1535 move.l %a0@(pr_FileSystemTask),%d0
1536 movem.l %sp@+,%a0-%a1/%a6
1539 BCPL extractDeviceName /* 1ac, void, @buf, separator, @name , oldpos */
1540 movem.l %d1-%d5/%a0-%a1/%a6,%sp@-
1541 move.l %a2@(GV_DOSBase),%a6
1548 /* D2 = SplitName 'separator' */
1549 subq.l #1,%d4 /* D4 = oldpos - 1 (?) */
1554 /* D1 = SplitName 'name' */
1556 move.l %a1@(0), %d3 /* Recover D1 (buf) from A1[0] */
1558 addq.l #1,%d3 /* D3 = SplitName 'buf' */
1560 moveq #30,%d5 /* D5 = SplitName 'size' */
1562 jsr %a6@(69 * -6) /* SplitName */
1570 move.b %d1,%a0@(-1) /* fix buf BSTR length */
1572 addq.l #1,%d0 /* newpos + 1 (?) */
1573 movem.l %sp@+,%d1-%d5/%a0-%a1/%a6
1576 BCPL lock /* 1b0, FileLock ^, @name */
1577 movem.l %d2/%a0-%a1/%a6,%sp@-
1578 move.l %a2@(GV_DOSBase),%a6
1583 moveq.l #-2,%d2 /* Shared lock */
1584 jsr %a6@(14 * -6) /* DOS/Lock() */
1585 movem.l %sp@+,%d2/%a0-%a1/%a6
1588 BCPL UnLock /* 1b4, void, @FileLock */
1589 movem.l %a0-%a1/%a6,%sp@-
1590 move.l %a2@(GV_DOSBase),%a6
1591 jsr %a6@(15 * -6) /* DOS/UnLock() */
1592 movem.l %sp@+,%a0-%a1/%a6
1595 BCPL getlong /* 1b8, void, longoffset, &struct */
1598 move.l %a0@(%d1),%d0
1601 BCPL putlong /* 1bc, void, longoffset, &struct, data */
1604 move.l %a0@(%d1),%d0
1605 move.l %d3,%a0@(%d1)
1608 BCPL openDevInfo /* 1c0, FileHandle ^, @DevInfo, @filename/window */
1609 movem.l %a0-%a1/%a6,%sp@-
1610 move.l %a2@(GV_DOSBase),%a6
1616 movem.l %sp@+,%a0-%a1/%a6
1619 BCPL DupLock /* 1c4, FileLock ^, @FileLock */
1620 movem.l %a0-%a1/%a6,%sp@-
1621 move.l %a2@(GV_DOSBase),%a6
1622 jsr %a6@(16 * -6) /* DOS/DupLock() */
1623 movem.l %sp@+,%a0-%a1/%a6
1626 /* Calls ErrorReport(IoErr(), ...)
1627 * Why this is called 'makesysreq' is a question
1628 * for the TripOS guys.
1630 BCPL makesysreq /* 1c8, BOOL, type, arg, *msgport */
1631 movem.l %a0-%a1/%a6,%sp@-
1635 move.l %a2@(GV_DOSBase),%a6
1636 jsr %a6@(22 * -6) /* IoErr */
1637 jsr %a6@(80 * -6) /* ErrorReport */
1638 movem.l %sp@+,%a0-%a1/%a6
1641 BCPL strcpy /* 1cc, void, @src, @dest */
1646 move.b %a0@(%d1),%d0
1647 0: move.b %a0@(%d1),%a0@(%d2)
1654 BCPL runCommand /* 1e4, void, @codeseg, stacklongs, @cmdline, cmdlinelength */
1655 movem.l %a0-%a1/%a6,%sp@-
1658 move.l %a2@(GV_DOSBase),%a6
1659 jsr %a6@(84 * -6) /* DOS/RunCommand() */
1660 movem.l %sp@+,%a0-%a1/%a6
1663 BCPL lock_1ec /* 1ec, FileLock ^, &name */
1664 movem.l %d2/%a0-%a1/%a6,%sp@-
1669 move.l %a2@(GV_DOSBase),%a6
1672 moveq.l #-2,%d2 /* Shared lock */
1673 jsr %a6@(14 * -6) /* DOS/Lock() */
1674 movem.l %sp@+,%d2/%a0-%a1/%a6
1677 BCPL findDevInfo /* 1f0, DevInfo ^, @name */
1678 movem.l %d2-%d3/%a0-%a1/%a6,%sp@-
1679 move.l %a2@(GV_DOSBase),%a6
1690 moveq #0x1d,%d1 /* LDF_ALL | LDF_READ */
1691 jsr %a6@(109 * -6) /* DOS/LockDosList */
1694 moveq #0x1d,%d3 /* LDF_ALL | LDF_READ */
1695 jsr %a6@(114 * -6) /* DOS/FindDosEntry */
1697 moveq #0x1d,%d1 /* LDF_ALL | LDF_READ */
1698 jsr %a6@(110 * -6) /* DOS/UnlockDosList */
1701 movem.l %sp@+,%d2-%d3/%a0-%a1/%a6
1704 BCPL createDir /* 1f4, FileLock^, @name */
1705 movem.l %a0-%a1/%a6,%sp@-
1706 move.l %a2@(GV_DOSBase),%a6
1711 jsr %a6@(20 * -6) /* DOS/CreateDir() */
1712 movem.l %sp@+,%a0-%a1/%a6
1715 BCPLd compareTime /* 1f8, SIGN , @timeval, @timeval */
1716 /* I suspect this is actually Dos/CompareDates(), but
1717 * I haven't found a user of this routine yet.
1721 BCPL timerIO /* 1fc, void, command, @IOStdReq, secs, usecs */
1722 movem.l %a0-%a1/%a6,%sp@-
1725 move.w %d1,%a1@(io_Command)
1726 move.l %d3,%a1@(tr_time + 0)
1727 move.l %d4,%a1@(tr_time + 4)
1729 jsr.l %a6@(76 * -6) /* Exec/DoIO() */
1731 movem.l %sp@+,%a0-%a1/%a6
1734 BCPL settime /* 200, void, @DateStamp */
1735 move.l %a2@(GV_DOSBase),%d0
1736 move.l %a0@(dl_TimeReq,%d0),%d2
1738 move.l %a0@(0,%d1),%d3 /* ds_Days */
1739 mulu.w #(60*24),%d3 /* mulu.w is fine until 2162 AD, */
1740 /* but tv_secs is too small in 2047 AD */
1741 add.l %a0@(4,%d1),%d3 /* ds_Minute */
1750 mov.l %a0@(8,%d1),%d4 /* ds_Tick */
1756 move.l #11,%d1 /* TR_SETSYSTIME */
1757 move.l #(1*4 + 3*4),%d0
1758 move.l %a2@(GV_timerIO),%a4
1763 * On AOS, this routine called the internal
1764 * CliInit(), which handled setting up the
1765 * core SYS: lock, assigns, and paths.
1767 * The (normally NULL) DOS Packet is always ignored.
1769 * Although (for various reasons) this has been done
1770 * before this routine has been called, we still need
1771 * to call CliInit* to process the inbound AROS packet.
1773 * If the passed in DOS Packet is NULL, then we have
1774 * nothing to do, since that's not valid under AROS.
1776 * If the DOS Packet is *not* NULL, then pass it
1777 * to the appropriate CliInit* routine.
1780 BCPL CliInit /* 214, APTR, @DosPacket */
1782 beq.s .L_CliInit_exit
1785 move.l %a0@(dp_Res1,%d1),%d2
1787 beq.s .L_CliInit_Run
1791 move.l #(155*-6),%d2
1792 bra.s .L_CliInit_Init
1796 move.l #(156*-6),%d2
1799 movem.l %a0-%a1/%a6,%sp@-
1801 move.l %a2@(GV_DOSBase),%a6
1803 movem.l %sp@+,%a0-%a1/%a6
1807 BCPLnd CliInit_NEWCLI
1809 move.l #1, %a0@(dp_Type, %d1)
1810 jmp .L_CliInit_Newcli
1814 move.l #-1, %a0@(dp_Type, %d1)
1817 BCPLnd CliInit_SYSTEM
1819 move.l #-2, %a0@(dp_Type, %d1)
1822 BCPLnd CliInit_ASYSTEM
1824 move.l #-3, %a0@(dp_Type, %d1)
1829 move.l #-4, %a0@(dp_Type, %d1)
1833 BCPL findCLI /* 218, CommandLineInterpreter ^, */
1834 movem.l %a0-%a1/%a6,%sp@-
1835 move.l %a2@(GV_DOSBase),%a6
1836 jsr %a6@(82 * -6) /* DOS/Cli() */
1838 movem.l %sp@+,%a0-%a1/%a6
1842 /* Helper routines */
1843 /* Convert BCPL string to Cstring inline in the A1 vector
1845 * D0: Index into A1, in words, to hold dest
1846 * D1: BSTR to convert
1850 * D1: Memory address of Cstring
1854 movem.l %d0/%a0-%a1,%sp@-
1859 move.b %a0@(-1,%d1),%sp@(3) /* Arg3 = strlen */
1860 move.l %d1,%sp@- /* Arg2 = src */
1862 pea.l %a1@(%d0) /* Arg1 = dest */
1864 move.l %sp@+,%a0 /* A0 = dest */
1865 addq.l #4,%sp /* Drop src */
1866 move.l %sp@+,%d1 /* D1 = strlen */
1867 move.b #0,%a0@(%d1) /* Terminate string with an ASCIIZ */
1868 move.l %a0,%d1 /* D1 = dest */
1869 movem.l %sp@+,%d0/%a0-%a1
1874 .string "%p->%p:%d:'%b'\n"
1876 movem.l %d1/%a0-%a1,%sp@-
1886 pea .bstr_format(%pc)
1889 movem.l %sp@+,%d1/%a0-%a1