C P / M 6 8 0 0 0 A s s e m b l e r Revision 02.03 Page 1 Source File: bdosif.s 1 2 ***************************************************************** 3 * * 4 * CP/M-68K Basic Disk Operating System interface module * 5 * For "C" version of CP/M-68K * 6 * * 7 * Copyright (c) 1982 Digital Research, Inc. * 8 * * 9 * Version 0.2 -- September 22, 1982 * 10 * * 11 ***************************************************************** 12 13 * Declare Public Routines 14 15 .globl _bios1 * 6 BIOS entry points from BDOS 16 .globl _bios2 17 .globl _bios3 18 .globl _bios4 19 .globl _bios5 20 .globl _bios6 21 .globl _traphnd * trap #2 handler 22 .globl _swap * byte swapper 23 .globl _udiv * unsigned divide routine 24 25 * Declare external routines 26 .globl __bdos * BDOS entry point in bdosmain 27 28 * The following external references were put in just to make sure that all 29 * the BDOS modules were referenced, so we could put them in a library 30 .globl _constat * references conbdos.o 31 .globl _dirscan * references dskutil.o 32 .globl _create * references fileio.o 33 .globl _bdosrw * references bdosrw.o 34 35 biosf = 50 36 setsupf = 62 37 38 _traphnd: 39 * 40 * first save the registers and 41 * check for functions handled by assembly language routines 42 * 43 00000000 0C40003E cmpi #setsupf,d0 44 00000004 672C beq setsup 45 00000006 48E77FFE movem.l d1-d7/a0-a6,-(sp) 46 0000000A 0C400032 cmpi #biosf,d0 47 0000000E 6716 beq bioscall 48 * 49 * function number is passed in D0 50 * byte and word pararmeters are passed in D1.W 51 * address parameters are passed in D1.L 52 * 53 00000010 2F01 move.l d1,-(a7) 54 00000012 3F01 move.w d1,-(a7) 55 00000014 3F00 move.w d0,-(a7) C P / M 6 8 0 0 0 A s s e m b l e r Revision 02.03 Page 2 Source File: bdosif.s 56 00000016 4EB900000000 jsr __bdos * call BDOS 57 * 58 * now restore the regs 59 * 60 0000001C 48C0 ext.l d0 61 0000001E 504F addq #8,sp * fix up the stack 62 bdone: 63 00000020 4CDF7FFE movem.l (sp)+,a0-a6/d1-d7 64 00000024 4E73 rte * return from trap call 65 66 * 67 * direct BIOS call function 68 * 69 bioscall: 70 00000026 2041 move.l d1,a0 * get address of CPB 71 00000028 3018 move.w (a0)+,d0 72 0000002A 4CD80006 movem.l (a0)+,d1-d2 73 0000002E 4E43 trap #3 74 00000030 60EE bra bdone 75 76 * 77 * Set supervisor mode procedure 78 * 79 setsup: 80 00000032 00572000 ori #$2000,(sp) * turn on supervisor bit in SR 81 00000036 4E73 rte 82 83 * 84 * BIOS Interface Routines 85 * 86 * 87 * Note - there are 6 BIOS entry points from the BDOS, labelled BIOS1 - 88 * BIOS6, depending on the parameters passed. 89 90 _bios5: 91 * For BIOS functions sectran and set exception vector 92 * Has function number and 2 parameters, a word followed by a long word 93 00000038 242F0008 move.l 8(sp),d2 * get 2nd parameter (long word) 94 0000003C 600C bra _bios2 * join common routine 95 96 _bios4: 97 * For BIOS function seldsk 98 * Has function number followed by 2 word parameters 99 0000003E 342F0008 move.w 8(sp),d2 * get 2nd parameter (word) 100 00000042 6006 bra _bios2 * join common routine 101 102 _bios3: 103 * For BIOS function set dma 104 * Has function number followed by 1 long parameter 105 00000044 222F0006 move.l 6(sp),d1 * get long word parameter 106 00000048 6004 bra _bios1 * join common routine 107 108 _bios2: 109 * For all BIOS functions with a word parameter 110 * Word parameter follows function number C P / M 6 8 0 0 0 A s s e m b l e r Revision 02.03 Page 3 Source File: bdosif.s 111 0000004A 322F0006 move.w 6(sp),d1 * get 1st parameter (word) 112 113 _bios6: 114 _bios1: 115 * For all BIOS functions that have no parameter other than function number 116 0000004E 302F0004 move.w 4(sp),d0 * get function number 117 00000052 48E71F1E movem.l d3-d7/a3-a6,-(sp) 118 * * save C register variables 119 00000056 4E43 trap #3 * do BIOS call 120 * * returns value in d0 121 00000058 4CDF78F8 movem.l (sp)+,d3-d7/a3-a6 122 0000005C 4E75 rts 123 124 * 125 * Utility Subroutines 126 * 127 128 _swap: 129 * Swap bytes of a word, return swapped value in d0 130 0000005E 102F0005 move.b 5(sp),d0 131 00000062 E148 lsl #8,d0 132 00000064 102F0004 move.b 4(sp),d0 133 00000068 4E75 rts 134 135 _udiv: 136 * Unsigned divide routine 137 * returns unsigned quotient in D0.W 138 139 * UWORD udiv( divisor, dividend, remp ) 140 * 141 * REG LONG divisor; 142 * UWORD dividend; 143 * UWORD *remp /* pointer to remainder (returned) */ 144 145 0000006A 202F0004 move.l 4(sp), d0 * get dividend 146 0000006E 80EF0008 divu 8(sp), d0 * do the divide 147 00000072 206F000A movea.l 10(sp),a0 148 00000076 4840 swap d0 149 00000078 3080 move.w d0, (a0) * store remainder 150 0000007A 4240 clr.w d0 151 0000007C 4840 swap d0 * word quotient in d0 152 0000007E 4E75 rts 153 154 00000080 .end C P / M 6 8 0 0 0 A s s e m b l e r Revision 02.03 Page 4 Source File: bdosif.s S y m b o l T a b l e __bdos ******** EXT _bdosrw ******** EXT _bios1 0000004E TEXT _bios2 0000004A TEXT _bios3 00000044 TEXT _bios4 0000003E TEXT _bios5 00000038 TEXT _bios6 0000004E TEXT _constat ******** EXT _create ******** EXT _dirscan ******** EXT _swap 0000005E TEXT _traphnd 00000000 TEXT _udiv 0000006A TEXT bdone 00000020 TEXT bioscall 00000026 TEXT biosf 00000032 ABS setsup 00000032 TEXT setsupf 0000003E ABS