2019年8月21日 星期三

備份》歌詞 │ 兩百萬業配【愛蜂蜜也愛檸檬】老天鵝金曲改編 │ 唱:滑借兜Jacob人 │ 原作:李麗芬/愛江山更愛美人

幫忙記錄下經典的改編歌曲的歌詞,
有附歌詞檔可供下載或列印。




【老鵝金曲改編】愛蜂蜜也愛檸檬 (原曲:愛江山更愛美人/李麗芬)



改編:老天鵝娛樂
唱聲:滑借兜Jacob人
原作:李麗芬
原曲:愛江山更愛美人


切一塊檸檬酸片 加幾毫蜂蜜香甜 一壺不到五塊錢
笑看政治的癲 喝口檸檬蜜水 旁邊四位全都在演

2019年8月16日 星期五

備份》歌詞 │ 孤單寂寞我們懂【我沒有女朋友】老天鵝金曲改編 │ 原作:周興哲/以後別做朋友 │ 唱:滑借兜Jacob

幫忙記錄下經典的改編歌曲的歌詞,
有附歌詞檔可供下載或列印。




【老鵝金曲改編】我沒有女朋友 (原曲:以後別做朋友/周興哲)



改編:老天鵝娛樂
唱聲:滑借兜Jacob
原作:周興哲
原曲:以後別做朋友


今年我又收了五張喜帖
害怕沒收回來的那一天
昨天去算命那裡花了五千
我的感情線他看不見

2019年8月14日 星期三

2019年8月12日 星期一

只要三步驟就能下載課程影片! - 新課綱銜接教材數位平台

因應108年新課綱的銜接,高一新生必須在開學前,使用《新課綱銜接教材數位平台》學習「資訊科技」、「生物」、「化學」。數位平臺學習的辦法,是「教育部國民及學前教育署」事先拍攝好教學影片,讓學生自行於暑假時間,撥空時間學習銜接教材。


但架設網站的「國立臺南第二高級中學」,希望學生全程專注於數十分鐘的影片,便無法在網站上快轉、加速影片的播放速度。

以下我們將教你只靠三步驟,就能讓各位同學的「惡夢」,快速解決掉!


一、在課程影片網頁中,任一空白處點擊右鍵。


課程影片網頁。任一空白處點擊右鍵。

2019年8月8日 星期四

自製64位元作業系統20──核心分頁Part 2

之前,我們製作了一個處理核心分頁的程式,不過我們以2MiB為單位分配,實在是太浪費了,我們準備要把這個問題解決,利用4KiB為單位分配。

2019年8月7日 星期三

備份》歌詞 │ 黃明志來和音【窮到發慌】老天鵝金曲改編 │ 唱:江小天 │ 原作:黃明志/飄向北方

幫忙記錄下經典的改編歌曲的歌詞,
有附歌詞檔可供下載或列印。




【老鵝金曲改編】窮到發慌 (原曲:飄向北方/黃明志)


改編:老天鵝娛樂
唱聲:江小天
原作:黃明志
原曲:飄向北方


窮到發慌 薪水都沒漲
每到月底的三餐 只剩下土壤
對政治失望 藍綠都是一樣
選上不管哪個黨 都貪得很爽

2019年8月6日 星期二

自製64位元作業系統19──簡易列印函式

利用以前的列印方法,加了一個緩衝區系統,我們製作出以下列印函式。我們輸出字元會先進入緩衝區,直到我們呼叫kfflush函式以後,才會把緩衝區複製到視訊記憶體。首先是我們的兩個游標的函式。
#include <text.h>

#include <kstring.h>
#include <x86.h>

#include <type.h>
#include <stdarg.h>


static __u16 getCursorPosition(void)
{
 __u16 ret;
 outb(0x0F, 0x3D4);
 ret = inb(0x3D5);
 outb(0x0E, 0x3D4);
 ret |= (__u16)inb(0x3D5) << 8;
 return ret;
}

static void setCursorPosition(__u16 position)
{
 outb(0x0F, 0x3D4);
 outb(position & 0xFF, 0x3D5);
 outb(0x0E, 0x3D4);
 outb((position >> 8) & 0xFF, 0x3D5);
}
接下來是我們其他的部分,包含格式化輸出等等。我們的函式大多回傳一個int,只要沒有錯誤,就是回傳0。
static __u16 *screen_start_addr = (__u16 *)0xFFFFFFFF800B8000ULL;
static __u16 *buffer_start_addr = (__u16 *)0xFFFFFFFF800B9000ULL;
static __u16 buffer_cursor_position = 0;

int init_text(void)
{
 memcpy(buffer_start_addr, screen_start_addr, 0xFA0);
 buffer_cursor_position = getCursorPosition();
 return 0;
}

static void bufferScroll(void)
{
 memcpy(buffer_start_addr, buffer_start_addr + 80, 0xE60);
 buffer_cursor_position = buffer_cursor_position - (buffer_cursor_position % 80);
 memset(buffer_start_addr + 0x730, 0, 0x140); 
}

int kfflush(void)
{
 memcpy(screen_start_addr, buffer_start_addr, 0xFA0);
 setCursorPosition(buffer_cursor_position);
 return 0;
}

static void newline(void)
{
 buffer_cursor_position += 80 - buffer_cursor_position % 80;
 if (buffer_cursor_position >= 0x780) {
  buffer_cursor_position -= 80;
  bufferScroll();
 }
}


#define COLOR 0x7
static void bufferPutc(char ch)
{
 switch (ch) {
 case '\n':
 case '\r':
  newline();
  break;
 case '\b':
  --buffer_cursor_position;
  break;
 case '\t':
  buffer_cursor_position = (buffer_cursor_position & (~7)) + 8;
  break;
 default:
  *(buffer_start_addr + buffer_cursor_position++) = (__u16)COLOR << 8 | ch;
  break;
 }

 if (buffer_cursor_position >= 1920) {
  newline();
 }
}

int kputc(char ch)
{
 bufferPutc(ch);
 kfflush();
 return 0;
}

static inline void kputs_nnl(const char *s)
{
 while (*s) {
  bufferPutc(*s++);
 }
}

int kputs(const char *s)
{
 kputs_nnl(s);
 newline();
 kfflush();
 return 0;
}

static void kprintu(__u64 num)
{
 static char buf[20];
 int i = 19;
 do {
  buf[i--] = (num % 10) + '0';
  num /= 10;
 } while (num > 0);

 while (++i <= 19) {
  bufferPutc(buf[i]);
 }
}

static void kprintx(__u64 num)
{
 static char buf[16];
 int i = 15;
 do {
  buf[i--] = (num & 0xF);
  num >>= 4;
 } while (num > 0);

 while (++i <= 15) {
  bufferPutc(buf[i] > 9 ? (buf[i]-10 + 'A') : (buf[i] + '0'));
 }
}

int kprintf(const char *format, ...)
{
 va_list args;
 va_start(args, format);
 while (*format) {
  if (*format == '%') {
   switch (*++format) {
   case '%':
    bufferPutc('%');
    break;
   case 'u':
    kprintu(va_arg(args, __u32));
    break;
   case 'x':
    kprintx(va_arg(args, __u32));
    break;
   case 's':
    kputs_nnl(va_arg(args, const char *));
    break;
   case '\0':
    return 0;
   default: // unknown option
    bufferPutc(*format);
    break;
   }
  } else {
   bufferPutc(*format);
  }
  ++format;
 }
 kfflush();
 va_end(args);
 return 0;
}

2019年8月3日 星期六

自製64位元作業系統18──核心分頁

我們今天要把核心正式讀入系統,在此之前,我們要先處理核心的記憶體位置。我們為了要讓其他的程式擁有完整的空間,並且所有的程式都要享有一樣的核心位置,所以我們決定把核心放在全部記憶體的最上面2GB(其實是學Linux核心的),也就是0xFFFFFFFF80000000的位置。
我們先用以下方法將最底下的2MB映射到那個位置
# Setup Page Table low 2mb at 0xffffffff80000000 (-2GB)
  movl $0x1C4003, 0x1C0ff8
  movl $0x1C2003, 0x1C4ff0

2019年8月1日 星期四