OSDN Git Service

svn rev.329より移動。
[chnosproject/CHNOSProject.git] / CHNOSProject / chnos / tolset_chn_000 / chnos_009 / chnos / chnipl.nas
diff --git a/CHNOSProject/chnos/tolset_chn_000/chnos_009/chnos/chnipl.nas b/CHNOSProject/chnos/tolset_chn_000/chnos_009/chnos/chnipl.nas
new file mode 100644 (file)
index 0000000..3496759
--- /dev/null
@@ -0,0 +1,185 @@
+\r
+[INSTRSET "i486p"]\r
+\r
+; BOOT_INFO_ADDR\r
+CYLS    equ             0x0ff0\r
+\r
+       org             0x7c00                  ; \82±\82Ì\83v\83\8d\83O\83\89\83\80\82ª\82Ç\82±\82É\93Ç\82Ý\8d\9e\82Ü\82ê\82é\82Ì\82©\r
+\r
+; \88È\89º\82Í\95W\8f\80\93I\82Èfat12\83t\83H\81[\83}\83b\83g\83t\83\8d\83b\83s\81[\83f\83B\83X\83N\82Ì\82½\82ß\82Ì\8bL\8fq\r
+\r
+       jmp             entry\r
+       db              0x90\r
+       db              "chnos   "              ; \83u\81[\83g\83Z\83N\83^\82Ì\96¼\91O\82ð\8e©\97R\82É\8f\91\82¢\82Ä\82æ\82¢\81i8\83o\83C\83g\81j\r
+       dw              512                     ; 1\83Z\83N\83^\82Ì\91å\82«\82³\81i512\82É\82µ\82È\82¯\82ê\82Î\82¢\82¯\82È\82¢\81j\r
+       db              1                       ; \83N\83\89\83X\83^\82Ì\91å\82«\82³\81i1\83Z\83N\83^\82É\82µ\82È\82¯\82ê\82Î\82¢\82¯\82È\82¢\81j\r
+       dw              1                       ; fat\82ª\82Ç\82±\82©\82ç\8en\82Ü\82é\82©\81i\95\81\92Ê\82Í1\83Z\83N\83^\96Ú\82©\82ç\82É\82·\82é\81j\r
+       db              2                       ; fat\82Ì\8cÂ\90\94\81i2\82É\82µ\82È\82¯\82ê\82Î\82¢\82¯\82È\82¢\81j\r
+       dw              224                     ; \83\8b\81[\83g\83f\83B\83\8c\83N\83g\83\8a\97Ì\88æ\82Ì\91å\82«\82³\81i\95\81\92Ê\82Í224\83G\83\93\83g\83\8a\82É\82·\82é\81j\r
+       dw              2880                    ; \82±\82Ì\83h\83\89\83C\83u\82Ì\91å\82«\82³\81i2880\83Z\83N\83^\82É\82µ\82È\82¯\82ê\82Î\82¢\82¯\82È\82¢\81j\r
+       db              0xf0                    ; \83\81\83f\83B\83A\82Ì\83^\83C\83v\81i0xf0\82É\82µ\82È\82¯\82ê\82Î\82¢\82¯\82È\82¢\81j\r
+       dw              9                       ; fat\97Ì\88æ\82Ì\92·\82³\81i9\83Z\83N\83^\82É\82µ\82È\82¯\82ê\82Î\82¢\82¯\82È\82¢\81j\r
+       dw              18                      ; 1\83g\83\89\83b\83N\82É\82¢\82­\82Â\82Ì\83Z\83N\83^\82ª\82 \82é\82©\81i18\82É\82µ\82È\82¯\82ê\82Î\82¢\82¯\82È\82¢\81j\r
+       dw              2                       ; \83w\83b\83h\82Ì\90\94\81i2\82É\82µ\82È\82¯\82ê\82Î\82¢\82¯\82È\82¢\81j\r
+       dd              0                       ; \83p\81[\83e\83B\83V\83\87\83\93\82ð\8eg\82Á\82Ä\82È\82¢\82Ì\82Å\82±\82±\82Í\95K\82¸0\r
+       dd              2880                    ; \82±\82Ì\83h\83\89\83C\83u\91å\82«\82³\82ð\82à\82¤\88ê\93x\8f\91\82­\r
+       db              0, 0, 0x29              ; \82æ\82­\82í\82©\82ç\82È\82¢\82¯\82Ç\82±\82Ì\92l\82É\82µ\82Ä\82¨\82­\82Æ\82¢\82¢\82ç\82µ\82¢\r
+       dd              0xffffffff              ; \82½\82Ô\82ñ\83{\83\8a\83\85\81[\83\80\83V\83\8a\83A\83\8b\94Ô\8d\86\r
+       db              "chnosboot  "           ; \83f\83B\83X\83N\82Ì\96¼\91O\81i11\83o\83C\83g\81j\r
+       db              "fat12   "              ; \83t\83H\81[\83}\83b\83g\82Ì\96¼\91O\81i8\83o\83C\83g\81j\r
+       resb    18                              ; \82Æ\82è\82 \82¦\82¸18\83o\83C\83g\82 \82¯\82Ä\82¨\82­\r
+\r
+; \83v\83\8d\83O\83\89\83\80\96{\91Ì\r
+\r
+entry:\r
+       mov     ax, 0                   ; \83\8c\83W\83X\83^\8f\89\8aú\89»\r
+       mov     ss, ax\r
+       mov     sp, 0x7c00\r
+       mov     ds, ax\r
+\r
+; \83f\83B\83X\83N\82ð\93Ç\82Þ\r
+\r
+        mov     ax, 0x0820\r
+        mov     es, ax\r
+        mov     ch, 0            ; \83V\83\8a\83\93\83_0\r
+        mov     dh, 0            ; \83w\83b\83h0\r
+        mov     cl, 2            ; \83Z\83N\83^2\r
+        mov     bx, 18*2-1       ; \93Ç\82Ý\8d\9e\82Ý\82½\82¢\8d\87\8cv\83Z\83N\83^\90\94 (2006.12.23 \83o\83O\8fC\90³)\r
+        call    readfast        ; \8d\82\91¬\93Ç\82Ý\8d\9e\82Ý\r
+\r
+        mov     bx, 4312+0x8200+2\r
+fatloop:\r
+        add     bx, -2\r
+        cmp     word [bx], 0\r
+        jz      fatloop\r
+        mov     ax, bx\r
+        add     ax, -0x8200-5+54+53\r
+        mov     bl, 54\r
+        div     bl              ; al = ax / bl\r
+\r
+        cmp     al, 0\r
+        jnz     fatskip1\r
+        mov     al, 1\r
+fatskip1:\r
+        cmp     al, 33\r
+        jbe     fatskip2\r
+        mov     al, 33\r
+fatskip2:\r
+        mov     [CYLS], al     ; ipl\82ª\82Ç\82±\82Ü\82Å\93Ç\82ñ\82¾\82Ì\82©\82ð\83\81\83\82\r
+        add     al, -1\r
+        jz      fatskip3\r
+        mov     ah, 0\r
+        imul    bx, ax, 18*2\r
+\r
+        mov     ax, 0x0c80\r
+        mov     es, ax\r
+        mov     ch, 1            ; \83V\83\8a\83\93\83_1\r
+        mov     dh, 0            ; \83w\83b\83h0\r
+        mov     cl, 1            ; \83Z\83N\83^1\r
+        call    readfast        ; \8d\82\91¬\93Ç\82Ý\8d\9e\82Ý\r
+fatskip3:\r
+\r
+; \93Ç\82Ý\8fI\82í\82Á\82½\82Ì\82Åharibote.sys\82ð\8eÀ\8ds\82¾\81I\r
+\r
+        jmp     0xc200\r
+\r
+\r
+error:\r
+       mov             ax, 0\r
+       mov             es, ax\r
+       mov             si, msg\r
+putloop:\r
+       mov             al, [si]\r
+       add             si, 1                   ; si\82É1\82ð\91«\82·\r
+       cmp             al, 0\r
+       je              fin\r
+       mov             ah, 0x0e                        ; \88ê\95\8e\9a\95\\8e¦\83t\83@\83\93\83N\83V\83\87\83\93\r
+       mov             bx, 15                  ; \83J\83\89\81[\83R\81[\83h\r
+       int             0x10                    ; \83r\83f\83Ibios\8cÄ\82Ñ\8fo\82µ\r
+       jmp             putloop\r
+fin:\r
+       hlt                                     ; \89½\82©\82 \82é\82Ü\82Åcpu\82ð\92â\8e~\82³\82¹\82é\r
+       jmp             fin                     ; \96³\8cÀ\83\8b\81[\83v\r
+\r
+msg:   db              0x0a, 0x0a              ; \89ü\8ds\82ð2\82Â\r
+       db              "chnipl load error"\r
+       db              0x0a                    ; \89ü\8ds\r
+       db              0\r
+\r
+readfast:      ; al\82ð\8eg\82Á\82Ä\82Å\82«\82é\82¾\82¯\82Ü\82Æ\82ß\82Ä\93Ç\82Ý\8fo\82·\r
+               ; es:\93Ç\82Ý\8d\9e\82Ý\94Ô\92n, ch:\83V\83\8a\83\93\83_, dh:\83w\83b\83h, cl:\83Z\83N\83^, bx:\93Ç\82Ý\8d\9e\82Ý\83Z\83N\83^\90\94\r
+\r
+       mov             ax, es                  ; < es\82©\82çal\82Ì\8dÅ\91å\92l\82ð\8cv\8eZ >\r
+       shl             ax, 3                   ; ax\82ð32\82Å\8a\84\82Á\82Ä\81A\82»\82Ì\8c\8b\89Ê\82ðah\82É\93ü\82ê\82½\82±\82Æ\82É\82È\82é \81ishl\82Í\8d\83V\83t\83g\96½\97ß\81j\r
+       and             ah, 0x7f                        ; ah\82Íah\82ð128\82Å\8a\84\82Á\82½\97]\82è\81i512*128=64k\81j\r
+       mov             al, 128                 ; al = 128 - ah; \88ê\94Ô\8bß\82¢64kb\8b«\8aE\82Ü\82Å\8dÅ\91å\89½\83Z\83N\83^\93ü\82é\82©\r
+       sub             al, ah\r
+\r
+       mov             ah, bl                  ; < bx\82©\82çal\82Ì\8dÅ\91å\92l\82ðah\82É\8cv\8eZ >\r
+       cmp             bh, 0                   ; if (bh != 0) { ah = 18; }\r
+       je              .skip1\r
+       mov             ah, 18\r
+.skip1:\r
+       cmp             al, ah                  ; if (al > ah) { al = ah; }\r
+       jbe             .skip2\r
+       mov             al, ah\r
+.skip2:\r
+\r
+       mov             ah, 19                  ; < cl\82©\82çal\82Ì\8dÅ\91å\92l\82ðah\82É\8cv\8eZ >\r
+       sub             ah, cl                  ; ah = 19 - cl;\r
+       cmp             al, ah                  ; if (al > ah) { al = ah; }\r
+       jbe             .skip3\r
+       mov             al, ah\r
+.skip3:\r
+\r
+       push    bx\r
+       mov             si, 0                   ; \8e¸\94s\89ñ\90\94\82ð\90\94\82¦\82é\83\8c\83W\83X\83^\r
+retry:\r
+       mov             ah, 0x02                        ; ah=0x02 : \83f\83B\83X\83N\93Ç\82Ý\8d\9e\82Ý\r
+       mov             bx, 0\r
+       mov             dl, 0x00                        ; a\83h\83\89\83C\83u\r
+       push    es\r
+       push    dx\r
+       push    cx\r
+       push    ax\r
+       int             0x13                    ; \83f\83B\83X\83Nbios\8cÄ\82Ñ\8fo\82µ\r
+       jnc             next                    ; \83G\83\89\81[\82ª\82¨\82«\82È\82¯\82ê\82Înext\82Ö\r
+       add             si, 1                   ; si\82É1\82ð\91«\82·\r
+       cmp             si, 5                   ; si\82Æ5\82ð\94ä\8ar\r
+       jae             error                   ; si >= 5 \82¾\82Á\82½\82çerror\82Ö\r
+       mov             ah, 0x00\r
+       mov             dl, 0x00                        ; a\83h\83\89\83C\83u\r
+       int             0x13                    ; \83h\83\89\83C\83u\82Ì\83\8a\83Z\83b\83g\r
+       pop             ax\r
+       pop             cx\r
+       pop             dx\r
+       pop             es\r
+       jmp             retry\r
+next:\r
+       pop             ax\r
+       pop             cx\r
+       pop             dx\r
+       pop             bx                      ; es\82Ì\93à\97e\82ðbx\82Å\8eó\82¯\8eæ\82é\r
+       shr             bx, 5                   ; bx\82ð16\83o\83C\83g\92P\88Ê\82©\82ç512\83o\83C\83g\92P\88Ê\82Ö\r
+       mov             ah, 0\r
+       add             bx, ax                  ; bx += al;\r
+       shl             bx, 5                   ; bx\82ð512\83o\83C\83g\92P\88Ê\82©\82ç16\83o\83C\83g\92P\88Ê\82Ö\r
+       mov             es, bx                  ; \82±\82ê\82Å es += al * 0x20; \82É\82È\82é\r
+       pop             bx\r
+       sub             bx, ax\r
+       jz              .ret\r
+       add             cl, al                  ; cl\82Éal\82ð\91«\82·\r
+       cmp             cl, 18                  ; cl\82Æ18\82ð\94ä\8ar\r
+       jbe             readfast                ; cl <= 18 \82¾\82Á\82½\82çreadfast\82Ö\r
+       mov             cl, 1\r
+       add             dh, 1\r
+       cmp             dh, 2\r
+       jb              readfast                ; dh < 2 \82¾\82Á\82½\82çreadfast\82Ö\r
+       mov             dh, 0\r
+       add             ch, 1\r
+       jmp             readfast\r
+.ret:\r
+       ret\r
+\r
+       resb    0x7dfe-$                ; 0x7dfe\82Ü\82Å\82ð0x00\82Å\96\84\82ß\82é\96½\97ß\r
+       db              0x55, 0xaa\r