📄 porting.texi
字号:
intisatty(fd) int fd;@{ return (1);@}/* * lseek -- move read/write pointer. Since a serial port * is non-seekable, we return an error. */off_tlseek(fd, offset, whence) int fd; off_t offset; int whence;@{ errno = ESPIPE; return ((off_t)-1);@}/* * fstat -- get status of a file. Since we have no file * system, we just return an error. */intfstat(fd, buf) int fd; struct stat *buf;@{ errno = EIO; return (-1);@}/* * getpid -- only one process, so just return 1. */#define __MYPID 1intgetpid()@{ return __MYPID;@}/* * kill -- go out via exit... */intkill(pid, sig) int pid; int sig;@{ if(pid == __MYPID) _exit(sig); return 0;@}/* * print -- do a raw print of a string */ intprint(ptr)char *ptr;@{ while (*ptr) @{ outbyte (*ptr++); @}@}/* * putnum -- print a 32 bit number in hex */intputnum (num)unsigned int num;@{ char buffer[9]; int count; char *bufptr = buffer; int digit; for (count = 7 ; count >= 0 ; count--) @{ digit = (num >> (count * 4)) & 0xf; if (digit <= 9) *bufptr++ = (char) ('0' + digit); else *bufptr++ = (char) ('a' - 10 + digit); @} *bufptr = (char) 0; print (buffer); return;@}@end example@node mvme.S, io.c, glue.c, Code Listings@section I/O assembler code sample@example/* * mvme.S -- board support for m68k */ .title "mvme.S for m68k-coff"/* These are predefined by new versions of GNU cpp. */#ifndef __USER_LABEL_PREFIX__#define __USER_LABEL_PREFIX__ _#endif#ifndef __REGISTER_PREFIX__#define __REGISTER_PREFIX__#endif/* ANSI concatenation macros. */#define CONCAT1(a, b) CONCAT2(a, b)#define CONCAT2(a, b) a ## b/* Use the right prefix for global labels. */#define SYM(x) CONCAT1 (__USER_LABEL_PREFIX__, x)/* Use the right prefix for registers. */#define REG(x) CONCAT1 (__REGISTER_PREFIX__, x)#define d0 REG (d0)#define d1 REG (d1)#define d2 REG (d2)#define d3 REG (d3)#define d4 REG (d4)#define d5 REG (d5)#define d6 REG (d6)#define d7 REG (d7)#define a0 REG (a0)#define a1 REG (a1)#define a2 REG (a2)#define a3 REG (a3)#define a4 REG (a4)#define a5 REG (a5)#define a6 REG (a6)#define fp REG (fp)#define sp REG (sp)#define vbr REG (vbr) .align 2 .text .global SYM (_exit) .global SYM (outln) .global SYM (outbyte) .global SYM (putDebugChar) .global SYM (inbyte) .global SYM (getDebugChar) .global SYM (havebyte) .global SYM (exceptionHandler) .set vbr_size, 0x400 .comm SYM (vbr_table), vbr_size/* * inbyte -- get a byte from the serial port * d0 - contains the byte read in */ .align 2SYM (getDebugChar): /* symbol name used by m68k-stub */SYM (inbyte): link a6, #-8 trap #15 .word inchr moveb sp@@, d0 extbl d0 unlk a6 rts/* * outbyte -- sends a byte out the serial port * d0 - contains the byte to be sent */ .align 2SYM (putDebugChar): /* symbol name used by m68k-stub */SYM (outbyte): link fp, #-4 moveb fp@@(11), sp@@ trap #15 .word outchr unlk fp rts/* * outln -- sends a string of bytes out the serial port with a CR/LF * a0 - contains the address of the string's first byte * a1 - contains the address of the string's last byte */ .align 2SYM (outln): link a6, #-8 moveml a0/a1, sp@@ trap #15 .word outln unlk a6 rts/* * outstr -- sends a string of bytes out the serial port without a CR/LF * a0 - contains the address of the string's first byte * a1 - contains the address of the string's last byte */ .align 2SYM (outstr): link a6, #-8 moveml a0/a1, sp@@ trap #15 .word outstr unlk a6 rts/* * havebyte -- checks to see if there is a byte in the serial port, * returns 1 if there is a byte, 0 otherwise. */SYM (havebyte): trap #15 .word instat beqs empty movel #1, d0 rtsempty: movel #0, d0 rts/* * These constants are for the MVME-135 board's boot monitor. They * are used with a TRAP #15 call to access the monitor's I/O routines. * they must be in the word following the trap call. */ .set inchr, 0x0 .set instat, 0x1 .set inln, 0x2 .set readstr, 0x3 .set readln, 0x4 .set chkbrk, 0x5 .set outchr, 0x20 .set outstr, 0x21 .set outln, 0x22 .set write, 0x23 .set writeln, 0x24 .set writdln, 0x25 .set pcrlf, 0x26 .set eraseln, 0x27 .set writd, 0x28 .set sndbrk, 0x29 .set tm_ini, 0x40 .set dt_ini, 0x42 .set tm_disp, 0x43 .set tm_rd, 0x44 .set redir, 0x60 .set redir_i, 0x61 .set redir_o, 0x62 .set return, 0x63 .set bindec, 0x64 .set changev, 0x67 .set strcmp, 0x68 .set mulu32, 0x69 .set divu32, 0x6A .set chk_sum, 0x6B@end example@node io.c, leds.c, mvme.S, Code Listings@section I/O code sample@example#include "w89k.h"/* * outbyte -- shove a byte out the serial port. We wait till the byte */intoutbyte(byte) unsigned char byte;@{ while ((inp(RS232REG) & TRANSMIT) == 0x0) @{ @} ; return (outp(RS232PORT, byte));@}/* * inbyte -- get a byte from the serial port */unsigned charinbyte()@{ while ((inp(RS232REG) & RECEIVE) == 0x0) @{ @}; return (inp(RS232PORT));@}@end example@node leds.c, ,io.c, Code Listings@section Led control sample@example/* * leds.h -- control the led's on a Motorola mc68ec0x0 board. */#ifndef __LEDS_H__#define __LEDS_H__#define LED_ADDR 0xd00003#define LED_0 ~0x1#define LED_1 ~0x2#define LED_2 ~0x4#define LED_3 ~0x8#define LED_4 ~0x10#define LED_5 ~0x20#define LED_6 ~0x40#define LED_7 ~0x80#define LEDS_OFF 0xff#define LEDS_ON 0x0#define FUDGE(x) ((x >= 0xa && x <= 0xf) ? (x + 'a') & 0x7f : (x + '0') & 0x7f)extern void led_putnum( char );#endif /* __LEDS_H__ *//* * leds.c -- control the led's on a Motorola mc68ec0x0 (IDP)board. */#include "leds.h"void zylons();void led_putnum();/* * led_putnum -- print a hex number on the LED. the value of num must be a char with * the ascii value. ie... number 0 is '0', a is 'a', ' ' (null) clears * the led display. * Setting the bit to 0 turns it on, 1 turns it off. * the LED's are controlled by setting the right bit mask in the base * address. * The bits are: * [d.p | g | f | e | d | c | b | a ] is the byte. * * The locations are: * * a * ----- * f | | b * | g | * ----- * | | * e | | c * ----- * d . d.p (decimal point) */voidled_putnum ( num )char num;@{ static unsigned char *leds = (unsigned char *)LED_ADDR; static unsigned char num_bits [18] = @{ 0xff, /* clear all */ 0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x98, /* numbers 0-9 */ 0x98, 0x20, 0x3, 0x27, 0x21, 0x4, 0xe /* letters a-f */ @}; if (num >= '0' && num <= '9') num = (num - '0') + 1; if (num >= 'a' && num <= 'f') num = (num - 'a') + 12; if (num == ' ') num = 0; *leds = num_bits[num];@}/* * zylons -- draw a rotating pattern. NOTE: this function never returns. */voidzylons()@{ unsigned char *leds = (unsigned char *)LED_ADDR; unsigned char curled = 0xfe; while (1) @{ *leds = curled; curled = (curled >> 1) | (curled << 7); delay ( 200 ); @}@}@end example@page@contents@c second page break makes sure right-left page alignment works right@c with a one-page toc, even though we don't have setchapternewpage odd.@page@bye
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -