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 */
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 BCPLd packstring /* b0, void, @Array, @String */
695 BCPLd unpackstring /* b4, void, @String, @Array */
698 BCPLd holdTask /* b8, void, @memseg */
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
708 /* Call the DOS internal 'dopacket' function
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 */
723 lea.l %sp@(10 * 4), %sp
724 movem.l %sp@+,%a0-%a1/%a6
728 BCPL returnPacket /* c4, void, @DosPacket, res1, res2 */
729 tst.l %d1 /* Don't try to reply NULL Dos Packets */
731 movem.l %a0-%a1/%a6,%sp@-
732 move.l %a2@(GV_DOSBase),%a6
734 jsr %a6@(43 * -6) /* DOS/ReplyPkt() */
735 movem.l %sp@+,%a0-%a1/%a6
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@-
756 move.l #WA_AutoAdjust, %sp@-
758 move.l #WA_PubScreen, %sp@-
759 move.l %a1@(4*4),%sp@-
760 move.l #WA_Title, %sp@-
762 move.l #WA_Height, %sp@-
764 move.l #WA_Width, %sp@-
766 move.l #WA_Top, %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
775 /* If BOOL is DOSTRUE, set current directory
776 * Always return old current directory
778 BCPL setCurrentDir /* cc, FileLock @, BOOL, @FileLock */
779 movem.l %d3-%d4/%a0-%a1/%a6,%sp@-
787 /* sanity check in CurrentDir() complained so I did this */
788 move.l %a0@(152),%d4 /* pr_CurrentDir */
793 move.l %a2@(GV_DOSBase),%a6
795 jsr %a6@(21 * -6) /* DOS/CurrentDir() */
798 movem.l %sp@+,%d3-%d4/%a0-%a1/%a6
801 BCPLd systemRequest /* d0, void, @line1, @line2, @line3 */
804 BCPL writet /* d4, void, @string, n */
805 movem.l %d2-%d4,%sp@-
807 lsl.l #2, %d3 /* D3 = BADDR(string) */
809 move.b %a0@(%d3),%d4 /* D4 = string[0] (strlen) */
811 beq .LBCPL_writet_pad
813 bra .LBCPL_writet_loop_cond
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
820 move.b %a0@(%d3),%d1 /* D1 = next char */
821 move.l %a2@(GV_wrch), %a4
823 .LBCPL_writet_loop_cond:
824 dbf %d4,.LBCPL_writet_loop
828 ble .LBCPL_writet_exit
829 bra .LBCPL_writet_pad_cond
831 .LBCPL_writet_pad_loop:
832 move.l #(3*4 + 2*4),%d0
834 move.l %a2@(GV_wrch), %a4
836 .LBCPL_writet_pad_cond:
837 dbf %d2,.LBCPL_writet_pad_loop
840 movem.l %sp@+,%d2-%d4
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() */
848 jsr %a6@(51 * -6) /* DOS/FGetC() */
849 movem.l %sp@+,%a0-%a1/%a6
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() */
858 jsr %a6@(53 * -6) /* DOS/UnGetC() */
859 movem.l %sp@+,%d2/%a0-%a1/%a6
862 BCPLnd wrch /* e0, void, char */
863 movem.l %d2/%a0-%a1/%a6,%sp@-
864 move.l %a2@(GV_DOSBase),%a6
866 jsr %a6@(10 * -6) /* DOS/Output() */
868 jsr %a6@(52 * -6) /* DOS/FPutC() */
869 movem.l %sp@+,%d2/%a0-%a1/%a6
872 BCPLd readinput_e4 /* e4, lwlength , @buf, lwlength */
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 */
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
888 BCPL findinput /* ec, FileHandle ^, @name */
889 movem.l %d2/%a0-%a1/%a6,%sp@-
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
905 BCPL findoutput /* f0, FileHandle ^, @name */
906 movem.l %d2/%a0-%a1/%a6,%sp@-
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
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
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
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() */
941 jsr %a6@(6 * -6) /* DOS/Close() */
943 jsr %a6@(49 * -6) /* DOS/SelectInput() */
944 movem.l %sp@+,%a0-%a1/%a6
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() */
952 jsr %a6@(6 * -6) /* DOS/Close() */
954 jsr %a6@(50 * -6) /* DOS/SelectOutput() */
955 movem.l %sp@+,%a0-%a1/%a6
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
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
972 BCPLd readn /* 10c, void, */
975 BCPL newline /* 110, void, */
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 */
990 tst.l %d3 /* Number < 0? */
993 bset #31,%d7 /* D7 bit 31 = negative sign needed */
998 clr.l %d4 /* D4 = Digit */
999 clr.w %d7 /* D7 = Num pushed chars */
1004 jsr %a5@(0x12) /* divmod: D1 = D3/base, D2 = D3 % base */
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)
1018 bgt.s .Lwrite_base_loop
1020 /* Any extra field bits? */
1021 bra .LBCPL_write_base_pad_cond
1022 .LBCPL_write_base_pad:
1024 move.l #(3*4 + 4*4 + 8*4), %d0
1025 move.l %a2@(GV_wrch), %a4
1027 .LBCPL_write_base_pad_cond:
1029 bpl.s .LBCPL_write_base_pad
1032 beq.s .Lwrite_base_emit
1035 move.l #(3*4 + 4*4 + 8*4), %d0
1036 move.l %a2@(GV_wrch), %a4
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
1048 jmp .Lwrite_base_emit
1051 movem.l %sp@+,%d2-%d7
1054 BCPL writei /* 114, void, number, width */
1055 movem.l %d3-%d4,%sp@-
1057 move.l #(3*4 + 2*4), %d0
1060 lea.l BCPL_write_base, %a4
1063 movem.l %sp@+,%d3-%d4
1066 BCPL writen /* 118, void, number */
1067 movem.l %d2-%d4,%sp@-
1069 move.l #(3*4 + 1*4), %d0
1073 lea.l BCPL_write_base, %a4
1076 movem.l %sp@+,%d2-%d4
1079 BCPL writehex /* 11c, void, number, width */
1080 movem.l %d3-%d4,%sp@-
1082 move.l #(3*4 + 2*4), %d0
1085 lea.l BCPL_write_base, %a4
1088 movem.l %sp@+,%d3-%d4
1091 BCPL writeoct /* 120, void, number, width */
1092 movem.l %d3-%d4,%sp@-
1094 move.l #(3*4 + 2*4), %d0
1097 lea.l BCPL_write_base, %a4
1100 movem.l %sp@+,%d3-%d4
1103 BCPL writes /* 124, void, @string */
1106 move.l #(3*4 + 1*4),%d0
1107 move.l %a2@(GV_writet), %a4
1112 #if 0 /* This is defined in bcpl_writef.S */
1113 BCPLd writef /* 128, void, @format, arg1, arg2, ... */
1117 BCPL toupper /* 12c, void, char */
1122 BCPL charicmp /* 130, long , char1, char2 */
1129 BCPL stricmp /* 134, long , @String1, @String2 */
1130 movem.l %d1-%d3/%a0-%a1,%sp@-
1171 movem.l %sp@+,%d1-%d3/%a0-%a1
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
1179 movem.l %a0-%a1/%a6,%sp@-
1180 move.l %a2@(GV_DOSBase),%a6
1182 movem.l %sp@+,%a0-%a1/%a6
1185 BCPL rditem /* 13c, void, @buf, maxlongs */
1186 movem.l %d2-%d3/%a0-%a2/%a6,%sp@-
1187 move.l %a2@(GV_DOSBase),%a6
1195 /* this can't be right but at least c:execute does something now */
1196 jsr %a6@(135 * -6) /* DOS/ReadItem() */
1203 move.b %d2,%a2@(-1) /* fix buf BSTR length */
1214 movem.l %sp@+,%d2-%d3/%a0-%a2/%a6
1217 BCPL subString /* 140, void, @string, @substring */
1219 movem.l %d2-%d3/%a0-%a6,%sp@-
1221 move.l %a2@(GV_DOSBase),%a5
1244 jsr %a6@(114 * -6) /* AllocVec */
1253 beq.s findarg_copy11
1256 bra.s findarg_copy12
1263 beq.s findarg_copy21
1266 bra.s findarg_copy22
1271 jsr %a6@(134 * -6) /* DOS/FindArg() */
1277 jsr %a6@(115 * -6) /* FreeVec */
1280 movem.l %sp@+,%d2-%d3/%a0-%a6
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
1295 jsr %a6@(25 * -6) /* DOS/LoadSeg() */
1296 movem.l %sp@+,%a0-%a1/%a6
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
1306 BCPLd tidyup /* 150, void, */
1309 BCPL addDevice /* 154, void, @name */
1310 movem.l %d2/%a0-%a1/%a6,%sp@-
1311 move.l %a2@(GV_DOSBase),%a6
1320 moveq #0,%d2 /* DLT_DEVICE */
1321 jsr %a6@(116 * -6) /* DOS/MakeDosEntry */
1326 jsr %a6@(113 * -6) /* DOS/AddDosEntry */
1329 jsr %a6@(117 * -6) /* DOS/FreeDosEntry */
1332 movem.l %sp@+,%d2/%a0-%a1/%a6
1335 BCPL datestamp /* 158, @DateStamp, @DateStamp */
1336 movem.l %a0-%a1/%a6,%sp@-
1338 move.l %a2@(GV_DOSBase),%a6
1339 jsr.l %a6@(32 * -6) /* DOS/DateStamp() */
1341 movem.l %sp@+,%a0-%a1/%a6
1344 BCPLd WaitForChar /* 15c, BOOL , @FileHandle, time */
1347 BCPL execLib /* 160, long , LVOffset, d0, d1, a0, a1, a2 */
1348 movem.l %d2/%a0-%a3/%a6,%sp@-
1352 movem.l %a3@(4),%d0-%d1/%a0-%a2
1354 movem.l %sp@+,%d2/%a0-%a3/%a6
1357 BCPL findSegArray /* 164, Array @, */
1358 movem.l %a0-%a1/%a6,%sp@-
1363 move.l %a0@(pr_SegList),%d0
1364 movem.l %sp@+,%a0-%a1/%a6
1367 BCPL deleteObject /* 168, void, @name */
1368 movem.l %a0-%a1/%a6,%sp@-
1371 move.l %a2@(GV_DOSBase),%a6
1372 jsr %a6@(12 * -6) /* DOS/DeleteFile() */
1373 movem.l %sp@+,%a0-%a1/%a6
1376 BCPL rename /* 16c, void, @oldname, @newname */
1377 movem.l %d2/%a0-%a2/%a6,%sp@-
1378 move.l %a2@(GV_DOSBase),%a6
1385 0: move.b %a0@+,%a1@+
1392 jsr %a6@(13 * -6) /* DOS/Rename() */
1394 movem.l %sp@+,%d2/%a0-%a2/%a6
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
1406 BCPLd getword /* 178, void, longaddress, wordnumber */
1409 BCPLd putword /* 17c, void, longaddress, wordnumber */
1413 BCPLd taskwait_190 /* 190, DosPacket ^, */
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
1423 BCPL deviceproc /* 198, FileLock ^, @filename */
1424 movem.l %a0-%a1/%a6,%sp@-
1425 move.l %a2@(GV_DOSBase),%a6
1430 jsr %a6@(29 * -6) /* DOS/DeviceProc() */
1431 movem.l %sp@+,%a0-%a1/%a6
1434 BCPL libcall /* 19c, void, libbase, LVOffset, d0, d1, a0, a1 */
1435 movem.l %a0-%a1/%a6,%sp@-
1437 move.l %a1@(0x08),%d0
1438 move.l %a1@(0x0c),%d1
1439 move.l %a1@(0x10),%a0
1440 move.l %a1@(0x14),%a1
1442 movem.l %sp@+,%a0-%a1/%a6
1445 BCPLd writeErr /* 1a0, ??, ?? */
1449 BCPL findConsoleHandler /* 1a4, MsgPort *, */
1450 movem.l %a0-%a1/%a6,%sp@-
1455 move.l %a0@(pr_ConsoleTask),%d0
1456 movem.l %sp@+,%a0-%a1/%a6
1459 BCPL findFileHandler /* 1a8, MsgPort *, */
1460 movem.l %a0-%a1/%a6,%sp@-
1465 move.l %a0@(pr_FileSystemTask),%d0
1466 movem.l %sp@+,%a0-%a1/%a6
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
1478 /* D2 = SplitName 'separator' */
1479 subq.l #1,%d4 /* D4 = oldpos - 1 (?) */
1484 /* D1 = SplitName 'name' */
1486 move.l %a1@(0), %d3 /* Recover D1 (buf) from A1[0] */
1488 addq.l #1,%d3 /* D3 = SplitName 'buf' */
1490 moveq #30,%d5 /* D5 = SplitName 'size' */
1492 jsr %a6@(69 * -6) /* SplitName */
1500 move.b %d1,%a0@(-1) /* fix buf BSTR length */
1502 addq.l #1,%d0 /* newpos + 1 (?) */
1503 movem.l %sp@+,%d1-%d5/%a0-%a1/%a6
1506 BCPL lock /* 1b0, FileLock ^, @name */
1507 movem.l %d2/%a0-%a1/%a6,%sp@-
1508 move.l %a2@(GV_DOSBase),%a6
1513 moveq.l #-2,%d2 /* Shared lock */
1514 jsr %a6@(14 * -6) /* DOS/Lock() */
1515 movem.l %sp@+,%d2/%a0-%a1/%a6
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
1525 BCPL getlong /* 1b8, void, longoffset, &struct */
1528 move.l %a0@(%d1),%d0
1531 BCPL putlong /* 1bc, void, longoffset, &struct, data */
1534 move.l %a0@(%d1),%d0
1535 move.l %d3,%a0@(%d1)
1538 BCPLd openfile /* 1c0, FileHandle ^, @devinfo, @filename */
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
1548 /* Calls ErrorReport(IoErr(), ...)
1549 * Why this is called 'makesysreq' is a question
1550 * for the TripOS guys.
1552 BCPL makesysreq /* 1c8, BOOL, type, arg, *msgport */
1553 movem.l %a0-%a1/%a6,%sp@-
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
1563 BCPL strcpy /* 1cc, void, @src, @dest */
1568 move.b %a0@(%d1),%d0
1569 0: move.b %a0@(%d1),%a0@(%d2)
1576 BCPL runCommand /* 1e4, void, @codeseg, stacklongs, @cmdline, cmdlinelength */
1577 movem.l %a0-%a1/%a6,%sp@-
1580 move.l %a2@(GV_DOSBase),%a6
1581 jsr %a6@(84 * -6) /* DOS/RunCommand() */
1582 movem.l %sp@+,%a0-%a1/%a6
1585 BCPL lock_1ec /* 1ec, FileLock ^, &name */
1586 movem.l %d2/%a0-%a1/%a6,%sp@-
1591 move.l %a2@(GV_DOSBase),%a6
1594 moveq.l #-2,%d2 /* Shared lock */
1595 jsr %a6@(14 * -6) /* DOS/Lock() */
1596 movem.l %sp@+,%d2/%a0-%a1/%a6
1599 BCPL findDevInfo /* 1f0, DevInfo ^, @name */
1600 movem.l %d2-%d3/%a0-%a1/%a6,%sp@-
1601 move.l %a2@(GV_DOSBase),%a6
1612 moveq #0x1d,%d1 /* LDF_ALL | LDF_READ */
1613 jsr %a6@(109 * -6) /* DOS/LockDosList */
1616 moveq #0x1d,%d3 /* LDF_ALL | LDF_READ */
1617 jsr %a6@(114 * -6) /* DOS/FindDosEntry */
1619 moveq #0x1d,%d1 /* LDF_ALL | LDF_READ */
1620 jsr %a6@(110 * -6) /* DOS/UnlockDosList */
1623 movem.l %sp@+,%d2-%d3/%a0-%a1/%a6
1626 BCPL createDir /* 1f4, FileLock^, @name */
1627 movem.l %a0-%a1/%a6,%sp@-
1628 move.l %a2@(GV_DOSBase),%a6
1633 jsr %a6@(20 * -6) /* DOS/CreateDir() */
1634 movem.l %sp@+,%a0-%a1/%a6
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.
1643 BCPL timerIO /* 1fc, void, command, @IOStdReq, secs, usecs */
1644 movem.l %a0-%a1/%a6,%sp@-
1647 move.w %d1,%a1@(io_Command)
1648 move.l %d3,%a1@(tr_time + 0)
1649 move.l %d4,%a1@(tr_time + 4)
1651 jsr.l %a6@(76 * -6) /* Exec/DoIO() */
1653 movem.l %sp@+,%a0-%a1/%a6
1656 BCPL settime /* 200, void, @DateStamp */
1657 move.l %a2@(GV_DOSBase),%d0
1658 move.l %a0@(dl_TimeReq,%d0),%d2
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 */
1672 mov.l %a0@(8,%d1),%d4 /* ds_Tick */
1678 move.l #11,%d1 /* TR_SETSYSTIME */
1679 move.l #(1*4 + 3*4),%d0
1680 move.l %a2@(GV_timerIO),%a4
1685 * On AOS, this routine called the internal
1686 * CliInit(), which handled setting up the
1687 * core SYS: lock, assigns, and paths.
1689 * The (normally NULL) DOS Packet is always ignored.
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.
1695 * If the passed in DOS Packet is NULL, then we have
1696 * nothing to do, since that's not valid under AROS.
1698 * If the DOS Packet is *not* NULL, then pass it
1699 * to the appropriate CliInit* routine.
1702 BCPL CliInit /* 214, APTR, @DosPacket */
1704 beq.s .L_CliInit_exit
1707 move.l %a0@(dp_Res1,%d1),%d2
1709 beq.s .L_CliInit_Run
1713 move.l #(155*-6),%d2
1714 bra.s .L_CliInit_Init
1718 move.l #(156*-6),%d2
1721 movem.l %a0-%a1/%a6,%sp@-
1723 move.l %a2@(GV_DOSBase),%a6
1725 movem.l %sp@+,%a0-%a1/%a6
1729 BCPLnd CliInit_NEWCLI
1731 move.l #1, %a0@(dp_Type, %d1)
1732 jmp .L_CliInit_Newcli
1736 move.l #-1, %a0@(dp_Type, %d1)
1739 BCPLnd CliInit_SYSTEM
1741 move.l #-2, %a0@(dp_Type, %d1)
1744 BCPLnd CliInit_ASYSTEM
1746 move.l #-3, %a0@(dp_Type, %d1)
1751 move.l #-4, %a0@(dp_Type, %d1)
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() */
1760 movem.l %sp@+,%a0-%a1/%a6
1764 /* Helper routines */
1765 /* Convert BCPL string to Cstring inline in the A1 vector
1767 * D0: Index into A1, in words, to hold dest
1768 * D1: BSTR to convert
1772 * D1: Memory address of Cstring
1776 movem.l %d0/%a0-%a1,%sp@-
1781 move.b %a0@(-1,%d1),%sp@(3) /* Arg3 = strlen */
1782 move.l %d1,%sp@- /* Arg2 = src */
1784 pea.l %a1@(%d0) /* Arg1 = dest */
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
1798 movem.l %d1/%a0-%a1,%sp@-
1800 pea .bstr_format(%pc)
1803 movem.l %sp@+,%d1/%a0-%a1