質問編集履歴

7

修正

2020/02/13 11:05

投稿

kazuyakazuya
kazuyakazuya

スコア193

test CHANGED
File without changes
test CHANGED
@@ -972,13 +972,13 @@
972
972
 
973
973
  mov [0x0_0500],ax
974
974
 
975
- mov [0x0_0510],ax
975
+ mov [0x0_0502],ax
976
-
976
+
977
- mov [0x0_0520],ax
977
+ mov [0x0_0504],ax
978
-
978
+
979
- mov [0x0_0530],ax
979
+ mov [0x0_0506],ax
980
-
980
+
981
- mov [0x0_0540],ax
981
+ mov [0x0_0508],ax
982
982
 
983
983
 
984
984
 
@@ -988,19 +988,19 @@
988
988
 
989
989
  mov [0xA_0000],ax
990
990
 
991
- mov ax,[0x0_0510]
991
+ mov ax,[0x0_0502]
992
992
 
993
993
  mov [0xA_0050],ax
994
994
 
995
- mov ax,[0x0_520]
995
+ mov ax,[0x0_504]
996
996
 
997
997
  mov [0xA_00A0],ax
998
998
 
999
- mov ax,[0x0_530]
999
+ mov ax,[0x0_506]
1000
1000
 
1001
1001
  mov [0xA_00F0],ax
1002
1002
 
1003
- mov ax,[0x0_540]
1003
+ mov ax,[0x0_508]
1004
1004
 
1005
1005
  mov [0xA_0140],ax
1006
1006
 

6

追記

2020/02/13 11:05

投稿

kazuyakazuya
kazuyakazuya

スコア193

test CHANGED
File without changes
test CHANGED
@@ -960,4 +960,52 @@
960
960
 
961
961
  文字が出ない原因のようです。
962
962
 
963
+
964
+
965
+ 次は、0x0_0500にフォントデータ(全部1)を設置してから
966
+
963
- や、ず一番先にこれをするべきだった。
967
+ VRAMへ書き込むプログラムを書てみた。
968
+
969
+ ```s
970
+
971
+ mov ax,0b1111111111111111
972
+
973
+ mov [0x0_0500],ax
974
+
975
+ mov [0x0_0510],ax
976
+
977
+ mov [0x0_0520],ax
978
+
979
+ mov [0x0_0530],ax
980
+
981
+ mov [0x0_0540],ax
982
+
983
+
984
+
985
+
986
+
987
+ mov ax,[0x0_0500]
988
+
989
+ mov [0xA_0000],ax
990
+
991
+ mov ax,[0x0_0510]
992
+
993
+ mov [0xA_0050],ax
994
+
995
+ mov ax,[0x0_520]
996
+
997
+ mov [0xA_00A0],ax
998
+
999
+ mov ax,[0x0_530]
1000
+
1001
+ mov [0xA_00F0],ax
1002
+
1003
+ mov ax,[0x0_540]
1004
+
1005
+ mov [0xA_0140],ax
1006
+
1007
+ ```
1008
+
1009
+ 画面には何も出力されませんでした。
1010
+
1011
+ なぜなんでしょうか?

5

追記

2020/02/12 08:54

投稿

kazuyakazuya
kazuyakazuya

スコア193

test CHANGED
File without changes
test CHANGED
@@ -932,38 +932,32 @@
932
932
 
933
933
  なぜ、書き換えがうまくいっていないのでしょうか?
934
934
 
935
- ![イメージ説明](ab930ae4a0022958bb746f302a19a75f.png)
936
-
937
- プロテクトモードへ移行させると画面がまっくろになります。
938
-
939
- 0x0000:0x0500のビットを立てれば思うように表示させるはずです。たぶん
940
-
941
-
942
-
943
- どこのプログラムが間違えているのでしょうか?
935
+ ```s
944
-
945
-
946
936
 
947
937
  mov ax,0b1111111111111111
948
938
 
949
- mov [es:bp],ax
950
-
951
-
952
-
953
- ここで、そもそも[es:bp]アドレス指定が誤っているのではないか?とも考えましたが
954
-
955
- 直前に
956
-
957
- mov ax,0x0000
958
-
959
- mov [FONT.seg],ax
939
+ mov [0xA_0000],ax
960
-
961
- mov es,ax
940
+
962
-
963
- mov ax,0x0500
964
-
965
- mov [FONT.off],ax
941
+ mov [0xA_0050],ax
966
-
942
+
967
- mov ax,bp
943
+ mov [0xA_00A0],ax
944
+
968
-
945
+ mov [0xA_00F0],ax
946
+
947
+ mov [0xA_0140],ax
948
+
949
+
950
+
951
+ ```
952
+
953
+ 試しに直接VRAMへ書き込みをおこなったところ
954
+
955
+ ![イメージ説明](c3e0c39280a520e5d76c2c1d84b768ca.png)
956
+
969
- を実行させているのでアドレスは正しいはず・・・。
957
+ 書き込めさえすばしっかり写しくれているので
958
+
959
+ VRAMへデータを適切に移せていないのが
960
+
961
+ 文字が出ない原因のようです。
962
+
963
+ (いや、まず一番先にこれをするべきだった。)

4

追記

2020/02/12 07:49

投稿

kazuyakazuya
kazuyakazuya

スコア193

test CHANGED
File without changes
test CHANGED
@@ -376,1152 +376,594 @@
376
376
 
377
377
 
378
378
 
379
- **プログラム全体**
379
+ ###追記
380
+
381
+ 自分でフォントデーターを作成し、それを映し出すことを目標にします。
382
+
383
+ メモリ:0x0000:0x0500にフォントデーターを配置させます。
384
+
385
+
380
386
 
381
387
  ```s
382
388
 
383
- ;第一ブートローダは省略
384
-
385
-
386
-
387
- ;/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
388
-
389
- ;カーネルローダー 第二ブートローダー。
390
-
391
- ;/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
392
-
393
-
394
-
395
- stage_2:
396
-
397
-
389
+ mov ax,0x0000
390
+
391
+ mov [FONT.seg],ax
392
+
393
+ mov ax,0x0500
394
+
395
+ mov [FONT.off],ax
396
+
397
+
398
+
399
+ ```
400
+
401
+ [es:bp]にフォントデータを配置するアドレスを配置しました。
402
+
403
+ es=0x0000
404
+
405
+ bp=0x0500
406
+
407
+ また、
408
+
409
+ ```s
410
+
411
+ FONT:
412
+
413
+ .seg: dw 0
414
+
415
+ .off: dw 0
416
+
417
+
418
+
419
+ ```
420
+
421
+ こっちにも
422
+
423
+ .seg=0x0000
424
+
425
+ .off=0x0500
426
+
427
+ を格納します。
428
+
429
+
430
+
431
+ ```s
432
+
433
+ mov ax,0b1111111111111111
434
+
435
+ mov [es:bp],ax
436
+
437
+ add bp,2
438
+
439
+ mov [es:bp],ax
440
+
441
+ add bp,4
442
+
443
+ mov [es:bp],ax
444
+
445
+ add bp,6
446
+
447
+ mov [es:bp],ax
448
+
449
+
450
+
451
+ mov ax,0b0000000000000000
452
+
453
+ add bp,8
454
+
455
+ mov [es:bp],ax
456
+
457
+ add bp,10
458
+
459
+ mov [es:bp],ax
460
+
461
+ add bp,12
462
+
463
+ mov [es:bp],ax
464
+
465
+ add bp,14
466
+
467
+ mov [es:bp],ax
468
+
469
+
470
+
471
+ ```
472
+
473
+ このコードで0x0000:0x0500で表させる先頭アドレスから最初の8バイトを11111・・・で埋め尽くし
474
+
475
+ 最初の8バイトから16バイトまでを0000・・・で埋め尽くします。
476
+
477
+ フォントデータ 1文字16バイト。1文字 縦16ドット 横8ドット
478
+
479
+ これを表示させると
480
+
481
+ ■■■■■■■■
482
+
483
+ ■■■■■■■■
484
+
485
+ ■■■■■■■■
486
+
487
+ ■■■■■■■■
488
+
489
+ ■■■■■■■■
490
+
491
+ ■■■■■■■■
492
+
493
+ ■■■■■■■■
494
+
495
+ ■■■■■■■■
496
+
497
+ □□□□□□□□
498
+
499
+ □□□□□□□□
500
+
501
+ □□□□□□□□
502
+
503
+ □□□□□□□□
504
+
505
+ □□□□□□□□
506
+
507
+ □□□□□□□□
508
+
509
+ □□□□□□□□
510
+
511
+ □□□□□□□□
512
+
513
+
514
+
515
+ このように表示されることを期待しています。
516
+
517
+ 実際に、0x0000:0x0500の領域にデータが書き込まれたか確認をします。
518
+
519
+ ```s
520
+
521
+ mov ax,[es:bp]
522
+
523
+ push 0b0100;これは気にしないでください。
524
+
525
+ push 2 ;2進数で表示させたいから基数2をプッシュ
526
+
527
+ push 16 ;0 or 1を16文字ASCIIで表示させるから16バイト
528
+
529
+ push .font_data2 ;font_data2にASCIIに変換した数値を格納
530
+
531
+ push ax;変換したい数値
532
+
533
+ call itoa;ASCII変換関数を呼び出す
534
+
535
+ add sp,10
536
+
537
+
538
+
539
+ push .font_data2 ;表示させたい文字をプッシュ(さっきASCIIに変換した数値)
540
+
541
+ call puts ;出力関数
542
+
543
+ add sp,19
544
+
545
+
546
+
547
+ .font_data2 db "----------------",0x0A,0x0D,0 ;16バイト分 0x0A,0x0Dは画面出力させるとき改行するため 0は文字列の終わりを示す。
548
+
549
+
550
+
551
+ ```
552
+
553
+ 以下、ASCII変換関数
554
+
555
+ ```s
556
+
557
+ itoa:
558
+
559
+
560
+
561
+ ;/_/_/_/_/_/_/_/_/_/_/_/
562
+
563
+ ;
564
+
565
+ ;bp (bp)
566
+
567
+ ;リターンアドレス
568
+
569
+ ;num 変換する値 (ax)
570
+
571
+ ;buff 保存先アドレス(si)
572
+
573
+ ;size 保存先バッファさきサイズ(cx)
574
+
575
+ ;radix 基数(2、8,10または16を設定する。)
576
+
577
+ ;flags B2:空白を0で埋める B1:+/-符号をつける B0:値を符号付変数として扱う(bx)
578
+
579
+ ;
580
+
581
+ ;/_/_/_/_/_/_/_/_/_/_/_/
582
+
583
+
584
+
585
+ push bp
586
+
587
+ mov bp,sp
588
+
589
+
590
+
591
+ push ax
592
+
593
+ push bx
594
+
595
+ push cx
596
+
597
+ push dx
598
+
599
+ push si
600
+
601
+ push di
602
+
603
+
604
+
605
+ mov ax,[bp + 4] ;変換する値
606
+
607
+ mov si,[bp + 6] ;保存先アドレス
608
+
609
+
610
+
611
+ mov cx,[bp + 8] ;cx=バッファサイズ
612
+
613
+
614
+
615
+ mov di,si
616
+
617
+ add di,cx
618
+
619
+ dec di ;di=バッファの最後尾
620
+
621
+
622
+
623
+ mov bx,word [bp + 12] ;flags
624
+
625
+
626
+
627
+ test bx,0b0001 ;値を符号付変数として扱う AND演算 結果が0なら ZFを立てる。
628
+
629
+
630
+
631
+ .10Q:
632
+
633
+ je .10E ;IF ZF=1
634
+
635
+
636
+
637
+ cmp ax,0
638
+
639
+
640
+
641
+ .12Q:
642
+
643
+ jge .12E
644
+
645
+ or bx,0b0010
646
+
647
+
648
+
649
+ .12E:
650
+
651
+ .10E:
652
+
653
+
654
+
655
+ test bx,0b0010
656
+
657
+
658
+
659
+ .20Q:
660
+
661
+ je .20E ;IF ZF==1
662
+
663
+ cmp ax,0
664
+
665
+
666
+
667
+ .22Q:
668
+
669
+ jge .22F
670
+
671
+ neg ax
672
+
673
+ mov [si],byte '-'
674
+
675
+
676
+
677
+ jmp .22E
678
+
679
+
680
+
681
+ .22F:
682
+
683
+
684
+
685
+ mov [si],byte '+'
686
+
687
+
688
+
689
+ .22E:
690
+
691
+ dec cx
692
+
693
+
694
+
695
+ .20E:
398
696
 
399
697
 
400
698
 
401
699
  ;/_/_/_/_/_/_/
402
700
 
403
- ;フォントアドレス取得
701
+ ;ASCII変換
404
702
 
405
703
  ;/_/_/_/_/_/_/
406
704
 
407
705
 
408
706
 
409
- push FONT
410
-
411
- call get_font_adr
412
-
413
- add sp,2
414
-
415
-
416
-
417
- ;/_/_/_/_/_/_/_/_/
418
-
419
- ;ADDRESS FONT ! >
420
-
421
- ;/_/_/_/_/_/_/_/_/
422
-
423
-
424
-
425
- push .s2
426
-
427
- call puts
428
-
429
- add sp,15
430
-
431
-
432
-
433
- ;/_/_/_/_/_/_/_/_/
434
-
435
- ;フォントアドレス表示 .seg
436
-
437
- ;/_/_/_/_/_/_/_/_/
438
-
439
-
440
-
441
- push 0b0100
442
-
443
- push 16
444
-
445
- push 4
446
-
447
- push .font_data
448
-
449
- mov bp,[FONT.seg]
707
+ mov bx,[bp + 10] ;基数
708
+
709
+
710
+
711
+ .30L:
712
+
713
+
714
+
715
+ mov dx,0
716
+
717
+ div bx
718
+
719
+ ;DX=DX:AX % 基数
720
+
721
+ ;AX=DX:AX / 基数
722
+
723
+
724
+
725
+ mov si,dx
726
+
727
+ mov dl,byte [.ascii + si]
728
+
729
+
730
+
731
+ mov [di],dl
732
+
733
+ dec di
734
+
735
+
736
+
737
+ cmp ax,0 ;割った商が0か確認
738
+
739
+
740
+
741
+ loopnz .30L ;CX を -1 し cx != 0 かつ ZF == 0
742
+
743
+
744
+
745
+ .30E:
746
+
747
+
748
+
749
+ ;
750
+
751
+ ;空白を埋める。
752
+
753
+ ;
754
+
755
+
756
+
757
+ ;cmp cx,0
758
+
759
+ ;.40Q:
760
+
761
+ ;je .40E ;IF ZF==1
762
+
763
+ ;mov al,' '
764
+
765
+
766
+
767
+ ;cmp [bp + 12],word 0b0100
768
+
769
+
770
+
771
+ ;.42Q:
772
+
773
+ ;jne .42E ;IF ZF==0
774
+
775
+ mov al,'0'
776
+
777
+
778
+
779
+ .42E:
780
+
781
+ std ;デクリメント
782
+
783
+ rep stosb ;al→di ecx=回数
784
+
785
+
786
+
787
+ .40E:
788
+
789
+
790
+
791
+ pop di
792
+
793
+ pop si
794
+
795
+ pop dx
796
+
797
+ pop cx
798
+
799
+ pop bx
800
+
801
+ pop ax
802
+
803
+
804
+
805
+ mov sp,bp
806
+
807
+ pop bp
808
+
809
+
810
+
811
+ ret
812
+
813
+
814
+
815
+ .ascii db "0123456789ABCDEF"
816
+
817
+
818
+
819
+ ```
820
+
821
+ 以下、出力関数
822
+
823
+ ```s
824
+
825
+ puts:
826
+
827
+
828
+
829
+ ;/_/_/_/_/_/_/
830
+
831
+ ;
832
+
833
+ ;bx
834
+
835
+ ;ax
836
+
837
+ ;bp←bp
838
+
839
+ ;リターンアドレス
840
+
841
+ ;文字コード
842
+
843
+ ;
844
+
845
+ ;/_/_/_/_/_/_/
846
+
847
+
450
848
 
451
849
  push bp
452
850
 
453
- call itoa
454
-
455
- add sp,10
456
-
457
-
458
-
459
- push .font_data
460
-
461
- call puts
462
-
463
- add sp,7
464
-
465
-
466
-
467
- ;/_/_/_/_/_/_/_/_/
468
-
469
- ;フォントアドレス表示 :
470
-
471
- ;/_/_/_/_/_/_/_/_/
472
-
473
-
474
-
475
- push .s4
476
-
477
- call puts
478
-
479
- add sp,2
480
-
481
-
482
-
483
- ;/_/_/_/_/_/_/_/_/
484
-
485
- ;フォントアドレス表示 .off
486
-
487
- ;/_/_/_/_/_/_/_/_/
488
-
489
-
490
-
491
- push 0b0100
492
-
493
- push 16
494
-
495
- push 4
496
-
497
- push .font_data
498
-
499
- mov bp,[FONT.off]
500
-
501
- push bp
502
-
503
- call itoa
504
-
505
- add sp,10
506
-
507
-
508
-
509
- push .font_data
510
-
511
- call puts
512
-
513
- add sp,7
514
-
515
-
516
-
517
-
518
-
519
- ;/_/_/_/_/_/_/_/_/
520
-
521
- ;< ADDRESS FONT !
522
-
523
- ;/_/_/_/_/_/_/_/_/
524
-
525
-
526
-
527
- push .s3
528
-
529
- call puts
530
-
531
- add sp,17
532
-
533
-
534
-
535
-
536
-
537
-
538
-
539
-
540
-
541
-
542
-
543
-
544
-
545
- ;/_/_/_/_/_/_/_/_/
546
-
547
- ;フォントデータを表示させる。 THIS IS FONT DATA>
548
-
549
- ;/_/_/_/_/_/_/_/_/
550
-
551
-
552
-
553
- push .s5
554
-
555
- call puts
556
-
557
- add sp,21
558
-
559
-
560
-
561
- ;/_/_/_/_/_/_/_/_/
562
-
563
- ;フォントアドレス
564
-
565
- ;/_/_/_/_/_/_/_/_/
566
-
567
-
568
-
569
- mov ax,[es:bp]
851
+ mov bp,sp
570
-
571
- push 0b0100
572
-
573
- push 2
574
-
575
- push 16
576
-
577
- push .font_data2
578
852
 
579
853
  push ax
580
854
 
581
- call itoa
582
-
583
- add sp,10
584
-
585
-
586
-
587
- push .font_data2
588
-
589
- call puts
590
-
591
- add sp,19
592
-
593
-
594
-
595
-
596
-
597
- add bp,2
598
-
599
- mov ax,[es:bp]
600
-
601
- push 0b0100
602
-
603
- push 2
604
-
605
- push 16
606
-
607
- push .font_data2
608
-
609
- push ax
610
-
611
- call itoa
612
-
613
- add sp,10
614
-
615
-
616
-
617
- push .font_data2
618
-
619
- call puts
620
-
621
- add sp,19
622
-
623
-
624
-
625
-
626
-
627
- add bp,4
628
-
629
- mov ax,[es:bp]
630
-
631
- push 0b0100
632
-
633
- push 2
634
-
635
- push 16
636
-
637
- push .font_data2
638
-
639
- push ax
640
-
641
- call itoa
642
-
643
- add sp,10
644
-
645
-
646
-
647
- push .font_data2
648
-
649
- call puts
650
-
651
- add sp,19
652
-
653
-
654
-
655
-
656
-
657
- add bp,6
658
-
659
- mov ax,[es:bp]
660
-
661
- push 0b0100
662
-
663
- push 2
664
-
665
- push 16
666
-
667
- push .font_data2
668
-
669
- push ax
670
-
671
- call itoa
672
-
673
- add sp,10
674
-
675
-
676
-
677
- push .font_data2
678
-
679
- call puts
680
-
681
- add sp,19
682
-
683
-
684
-
685
-
686
-
687
-
688
-
689
-
690
-
691
-
692
-
693
- ;/_/_/_/_/_/_/_/_/
694
-
695
- ;フォントデータを表示させる。 <THIS IS FONT DATA
696
-
697
- ;/_/_/_/_/_/_/_/_/
698
-
699
-
700
-
701
- push .s6
702
-
703
- call puts
704
-
705
- add sp,21
706
-
707
-
708
-
709
- ;/_/_/_/_/_/_/
710
-
711
- ;A20 有効化処理 https://www.hazymoon.jp/OpenBSD/annex/keyboard.html
712
-
713
- ;/_/_/_/_/_/_/
714
-
715
-
716
-
717
- cli ;割り込み禁止
718
-
719
-
720
-
721
- ;/_/_/_/_/_/_/
722
-
723
- ;キーボード無効化
724
-
725
- ;/_/_/_/_/_/_/
726
-
727
-
728
-
729
- push 0xAD
730
-
731
- call KBC_Cmd_Write
732
-
733
- add sp,2
734
-
735
-
736
-
737
- ;/_/_/_/_/_/_/
738
-
739
- ;input port 呼び出し コマンド
740
-
741
- ;/_/_/_/_/_/_/
742
-
743
-
744
-
745
- push 0xD0
746
-
747
- call KBC_Cmd_Write
748
-
749
- add sp,2
750
-
751
-
752
-
753
- ;/_/_/_/_/_/_/
754
-
755
- ; .keyに0x0D 呼び出し結果を書き込む
756
-
757
- ;/_/_/_/_/_/_/
758
-
759
-
760
-
761
- push .key
762
-
763
- call KBC_Data_Read
764
-
765
- add sp,2
766
-
767
-
768
-
769
- mov bl,[.key] ;0x0D input port 8bit blはbxの下位バイト
770
-
771
- or bl,0x02 ;2bit目のゲートA20信号線のビットを立てる。
772
-
773
-
774
-
775
- ;/_/_/_/_/_/_/
776
-
777
- ;port 0x60へ書き込んだ値が output port へ出力される。
778
-
779
- ;/_/_/_/_/_/_/
780
-
781
-
782
-
783
- push 0xD1
784
-
785
- call KBC_Cmd_Write
786
-
787
- add sp,2
788
-
789
-
790
-
791
- ;/_/_/_/_/_/_/
792
-
793
- ;ビットを立てた output data を読み込ませる。
794
-
795
- ;/_/_/_/_/_/_/
796
-
797
-
798
-
799
855
  push bx
800
856
 
801
- call KBC_Data_Write
802
-
803
- add sp,2
804
-
805
-
806
-
807
- ;/_/_/_/_/_/_/
808
-
809
- ;キーボード有効化
810
-
811
- ;/_/_/_/_/_/_/
812
-
813
-
814
-
815
- push 0xAE
816
-
817
- call KBC_Cmd_Write
818
-
819
- add sp,2
820
-
821
-
822
-
823
- ;/_/_/_/_/_/_/
824
-
825
- ;A20_Gate_Enabled... を表示
826
-
827
- ;/_/_/_/_/_/_/
828
-
829
-
830
-
831
- push .s1
857
+ push si
832
-
858
+
859
+
860
+
833
- call puts
861
+ mov si,[bp + 4]
862
+
834
-
863
+ mov ah,0x0E ;固定
864
+
865
+
866
+
867
+ mov bx,0x0000 ;固定
868
+
869
+
870
+
835
- add sp,20
871
+ cld ;DFを0にする。
836
-
837
- sti
838
-
839
-
840
-
841
- jmp stage_6
842
-
843
-
844
-
845
- ;/_/_/_/_/_/_/
846
-
847
- ;データ
848
-
849
- ;/_/_/_/_/_/_/
850
-
851
-
852
-
853
- ALIGN 2,db 0
854
-
855
-
856
-
857
- .key: dw 0
858
-
859
- .s1 db "A20_Gate_Enabled...",0
860
-
861
- .s2 db "ADDRESS FONT!>",0
862
-
863
- .s3 db "<ADDRESS FONT!",0x0A,0x0D,0
864
-
865
- .s4 db ":",0
866
-
867
- .s5 db "THIS IS FONT DATA>",0x0A,0x0D,0
868
-
869
- .s6 db "<THIS IS FONT DATA",0x0A,0x0D,0
870
-
871
- .font_data db "----",0
872
-
873
- .font_data2 db "----------------",0x0A,0x0D,0
874
-
875
-
876
-
877
-
878
-
879
- %include "../modules/real/itoa.s"
880
-
881
-
882
-
883
- FONT:
884
-
885
- .seg: dw 0
886
-
887
- .off: dw 0
888
-
889
-
890
-
891
- stage_6:
892
-
893
-
894
-
895
- ;/_/_/_/_/_/_/
896
-
897
- ;ビデオモード変更
898
-
899
- ;/_/_/_/_/_/_/
900
-
901
-
902
-
903
- push stage_6.s0
904
-
905
- call puts
906
-
907
- add sp,13
908
872
 
909
873
 
910
874
 
911
875
  .10L:
912
876
 
877
+
878
+
879
+ lodsb ;si=文字列 DF=0ならインクリメントする。
880
+
913
- mov ah,0x00
881
+ cmp al,0
914
-
915
- int 0x16
882
+
916
-
917
-
918
-
919
- cmp al,' '
883
+ je .10E ;IF ZF==1
920
-
921
- jne .10L
884
+
922
-
923
-
924
-
925
- mov ax,0x0012
885
+
926
886
 
927
887
  int 0x10
928
888
 
929
889
 
930
890
 
931
- jmp stage_7
932
-
933
-
934
-
935
-
936
-
937
- .s0 db "6th_stage...",0
938
-
939
-
940
-
941
- ;/_/_/_/_/_/_/
942
-
943
- ;GDT IDT セレクタ 初期化設定定義
944
-
945
- ;/_/_/_/_/_/_/
946
-
947
-
948
-
949
- ALIGN 4,db 0
950
-
951
-
952
-
953
- ;GDT
954
-
955
-
956
-
957
- GDT:
958
-
959
- dq 0x00_0_0_0_0_000000_0000 ;NULLディスクリプタ―
960
-
961
- .cs: dq 0x00_C_F_9_A_000000_FFFF ;コードディスクリプター
962
-
963
- .ds: dq 0x00_C_F_9_2_000000_FFFF ;データディスクリプタ―
964
-
965
- .gdt_end:
966
-
967
-
968
-
969
- SEL_CODE equ GDT.cs-GDT
970
-
971
- SEL_DATA equ GDT.ds-GDT
972
-
973
-
974
-
975
- IDT:
976
-
977
-
978
-
979
- .idt_end:
980
-
981
-
982
-
983
-
984
-
985
- ;GDTR
986
-
987
-
988
-
989
- GDTR:
990
-
991
- dw GDT.gdt_end - GDT - 1
992
-
993
- dd GDT ;GDTベースアドレス
994
-
995
-
996
-
997
- ;IDT
998
-
999
-
1000
-
1001
- IDTR:
1002
-
1003
- dw IDT.idt_end - IDT - 1
1004
-
1005
- dd IDT ;IDTベースアドレス
1006
-
1007
-
1008
-
1009
- stage_7:
1010
-
1011
-
1012
-
1013
- ;/_/_/_/_/_/_/
1014
-
1015
- ;プロテクトモード移行
1016
-
1017
- ;/_/_/_/_/_/_/
1018
-
1019
-
1020
-
1021
- cli ;割り込み禁止
1022
-
1023
-
1024
-
1025
- lgdt [GDTR]
1026
-
1027
-
1028
-
1029
- lidt [IDTR]
1030
-
1031
-
1032
-
1033
- mov eax,cr0
1034
-
1035
- or eax,1
1036
-
1037
- mov cr0,eax
1038
-
1039
- jmp $ + 2
1040
-
1041
-
1042
-
1043
- [BITS 32]
1044
-
1045
- db 0x66
1046
-
1047
- jmp SEL_CODE:CODE_32
1048
-
1049
-
1050
-
1051
- CODE_32:
1052
-
1053
-
1054
-
1055
- mov ax,SEL_DATA
1056
-
1057
- mov ds,ax
891
+ jmp .10L
892
+
893
+
894
+
895
+ .10E:
896
+
897
+
898
+
899
+ pop si
900
+
901
+ pop bx
902
+
903
+ pop ax
904
+
905
+ mov sp,bp
906
+
907
+ pop bp
908
+
909
+
910
+
911
+ ret
912
+
913
+
914
+
915
+ ```
916
+
917
+ 数値をそのまま画面に出力できないので
918
+
919
+ 数値をASCIIに変換してから表示させます。
920
+
921
+ 0x0000:0x0500から先頭の2バイトを表示させています。
922
+
923
+ さっきそこには1111...を格納したので
924
+
925
+ 1111...が2バイト分つまり
926
+
927
+ 16個 '1'が表示させるはずなのですが。。。
928
+
929
+ ![イメージ説明](721219ac3074a64bc2afffc7281c06cf.png)
930
+
931
+
932
+
933
+ なぜ、書き換えがうまくいっていないのでしょうか?
934
+
935
+ ![イメージ説明](ab930ae4a0022958bb746f302a19a75f.png)
936
+
937
+ プロテクトモードへ移行させると画面がまっくろになります。
938
+
939
+ 0x0000:0x0500のビットを立てれば思うように表示させるはずです。たぶん
940
+
941
+
942
+
943
+ どこのプログラムが間違えているのでしょうか?
944
+
945
+
946
+
947
+ mov ax,0b1111111111111111
948
+
949
+ mov [es:bp],ax
950
+
951
+
952
+
953
+ ここで、そもそも[es:bp]アドレス指定が誤っているのではないか?とも考えましたが
954
+
955
+ 直前に
956
+
957
+ mov ax,0x0000
958
+
959
+ mov [FONT.seg],ax
1058
960
 
1059
961
  mov es,ax
1060
962
 
1061
- mov fs,ax
1062
-
1063
- mov gs,ax
1064
-
1065
- mov ss,ax
1066
-
1067
-
1068
-
1069
- ;mov ecx,(KERNEL_SIZE) / 4
1070
-
1071
- ;mov esi,BOOT_END
1072
-
1073
- ;mov edi,KERNEL_LOAD
1074
-
1075
- ;cld
1076
-
1077
- ;rep movsd
1078
-
1079
-
1080
-
1081
- ;/_/_/_/_/_/_/_/_/_/_/_/
1082
-
1083
- ;
1084
-
1085
- ;
1086
-
1087
- ;以下、本来カーネルに書く内容
1088
-
1089
- ;後でコピペしなければいけない。
1090
-
1091
- ;
1092
-
1093
- ;/_/_/_/_/_/_/_/_/_/_/_/
1094
-
1095
-
1096
-
1097
- mov esi,'a'
1098
-
1099
- shl esi,4
1100
-
1101
- add esi,[FONT]
1102
-
1103
-
1104
-
1105
- mov edi,0xA_0000
1106
-
1107
-
1108
-
1109
- mov ecx,16
1110
-
1111
-
1112
-
1113
- .10L:
1114
-
1115
-
1116
-
1117
- movsb
1118
-
1119
- add edi,80 - 1
1120
-
1121
-
1122
-
1123
- loop .10L
1124
-
1125
-
1126
-
1127
- jmp $
1128
-
1129
-
1130
-
1131
- times BOOT_SIZE - ($ - $$) db 0
1132
-
1133
-
1134
-
1135
- ```
1136
-
1137
-
1138
-
1139
- アスキー変換関数
1140
-
1141
- ```s
1142
-
1143
- itoa:
1144
-
1145
-
1146
-
1147
- ;/_/_/_/_/_/_/_/_/_/_/_/
1148
-
1149
- ;
1150
-
1151
- ;bp (bp)
1152
-
1153
- ;リターンアドレス
1154
-
1155
- ;num 変換する値 (ax)
1156
-
1157
- ;buff 保存先アドレス(si)
1158
-
1159
- ;size 保存先バッファさきサイズ(cx)
1160
-
1161
- ;radix 基数(2、8,10または16を設定する。)
1162
-
1163
- ;flags B2:空白を0で埋める B1:+/-符号をつける B0:値を符号付変数として扱う(bx)
1164
-
1165
- ;
1166
-
1167
- ;/_/_/_/_/_/_/_/_/_/_/_/
1168
-
1169
-
1170
-
1171
- push bp
1172
-
1173
- mov bp,sp
1174
-
1175
-
1176
-
1177
- push ax
1178
-
1179
- push bx
1180
-
1181
- push cx
1182
-
1183
- push dx
1184
-
1185
- push si
1186
-
1187
- push di
1188
-
1189
-
1190
-
1191
- mov ax,[bp + 4] ;変換する値
1192
-
1193
- mov si,[bp + 6] ;保存先アドレス
1194
-
1195
-
1196
-
1197
- mov cx,[bp + 8] ;cx=バッファサイズ
1198
-
1199
-
1200
-
1201
- mov di,si
1202
-
1203
- add di,cx
1204
-
1205
- dec di ;di=バッファの最後尾
1206
-
1207
-
1208
-
1209
- mov bx,word [bp + 12] ;flags
1210
-
1211
-
1212
-
1213
- test bx,0b0001 ;値を符号付変数として扱う AND演算 結果が0なら ZFを立てる。
1214
-
1215
-
1216
-
1217
- .10Q:
1218
-
1219
- je .10E ;IF ZF=1
1220
-
1221
-
1222
-
1223
- cmp ax,0
1224
-
1225
-
1226
-
1227
- .12Q:
1228
-
1229
- jge .12E
1230
-
1231
- or bx,0b0010
1232
-
1233
-
1234
-
1235
- .12E:
1236
-
1237
- .10E:
1238
-
1239
-
1240
-
1241
- test bx,0b0010
1242
-
1243
-
1244
-
1245
- .20Q:
1246
-
1247
- je .20E ;IF ZF==1
1248
-
1249
- cmp ax,0
1250
-
1251
-
1252
-
1253
- .22Q:
1254
-
1255
- jge .22F
1256
-
1257
- neg ax
1258
-
1259
- mov [si],byte '-'
1260
-
1261
-
1262
-
1263
- jmp .22E
1264
-
1265
-
1266
-
1267
- .22F:
1268
-
1269
-
1270
-
1271
- mov [si],byte '+'
1272
-
1273
-
1274
-
1275
- .22E:
1276
-
1277
- dec cx
1278
-
1279
-
1280
-
1281
- .20E:
1282
-
1283
-
1284
-
1285
- ;/_/_/_/_/_/_/
1286
-
1287
- ;ASCII変換
1288
-
1289
- ;/_/_/_/_/_/_/
1290
-
1291
-
1292
-
1293
- mov bx,[bp + 10] ;基数
1294
-
1295
-
1296
-
1297
- .30L:
1298
-
1299
-
1300
-
1301
- mov dx,0
1302
-
1303
- div bx
1304
-
1305
- ;DX=DX:AX % 基数
1306
-
1307
- ;AX=DX:AX / 基数
1308
-
1309
-
1310
-
1311
- mov si,dx
1312
-
1313
- mov dl,byte [.ascii + si]
1314
-
1315
-
1316
-
1317
- mov [di],dl
1318
-
1319
- dec di
1320
-
1321
-
1322
-
1323
- cmp ax,0 ;割った商が0か確認
1324
-
1325
-
1326
-
1327
- loopnz .30L ;CX を -1 し cx != 0 かつ ZF == 0
1328
-
1329
-
1330
-
1331
- .30E:
1332
-
1333
-
1334
-
1335
- ;
1336
-
1337
- ;空白を埋める。
1338
-
1339
- ;
1340
-
1341
-
1342
-
1343
- cmp cx,0
1344
-
1345
- .40Q:
1346
-
1347
- je .40E ;IF ZF==1
1348
-
1349
- mov al,' '
1350
-
1351
-
1352
-
1353
- cmp [bp + 12],word 0b0100
1354
-
1355
-
1356
-
1357
- .42Q:
1358
-
1359
- jne .42E ;IF ZF==0
1360
-
1361
- mov al,'0'
1362
-
1363
-
1364
-
1365
- .42E:
1366
-
1367
- std ;デクリメント
1368
-
1369
- rep stosb ;al→di ecx=回数
1370
-
1371
-
1372
-
1373
- .40E:
1374
-
1375
-
1376
-
1377
- pop di
1378
-
1379
- pop si
1380
-
1381
- pop dx
1382
-
1383
- pop cx
1384
-
1385
- pop bx
1386
-
1387
- pop ax
1388
-
1389
-
1390
-
1391
- mov sp,bp
1392
-
1393
- pop bp
1394
-
1395
-
1396
-
1397
- ret
1398
-
1399
-
1400
-
1401
- .ascii db "0123456789ABCDEF"
1402
-
1403
-
1404
-
1405
- ```
1406
-
1407
-
1408
-
1409
- ```s
1410
-
1411
- mov ax,[es:bp]
1412
-
1413
- push 0b0100
1414
-
1415
- push 2
1416
-
1417
- push 16
1418
-
1419
- push .font_data2
1420
-
1421
- push ax
1422
-
1423
- call itoa
1424
-
1425
- add sp,10
1426
-
1427
-
1428
-
1429
- push .font_data2
1430
-
1431
- call puts
1432
-
1433
- add sp,19
1434
-
1435
-
1436
-
1437
-
1438
-
1439
- add bp,2
1440
-
1441
- mov ax,[es:bp]
1442
-
1443
- push 0b0100
1444
-
1445
- push 2
1446
-
1447
- push 16
1448
-
1449
- push .font_data2
1450
-
1451
- push ax
1452
-
1453
- call itoa
1454
-
1455
- add sp,10
1456
-
1457
-
1458
-
1459
- push .font_data2
1460
-
1461
- call puts
1462
-
1463
- add sp,19
1464
-
1465
-
1466
-
1467
-
1468
-
1469
- add bp,4
1470
-
1471
- mov ax,[es:bp]
1472
-
1473
- push 0b0100
1474
-
1475
- push 2
1476
-
1477
- push 16
1478
-
1479
- push .font_data2
1480
-
1481
- push ax
1482
-
1483
- call itoa
1484
-
1485
- add sp,10
1486
-
1487
-
1488
-
1489
- push .font_data2
1490
-
1491
- call puts
1492
-
1493
- add sp,19
1494
-
1495
-
1496
-
1497
-
1498
-
1499
- add bp,6
1500
-
1501
- mov ax,[es:bp]
1502
-
1503
- push 0b0100
1504
-
1505
- push 2
1506
-
1507
- push 16
1508
-
1509
- push .font_data2
1510
-
1511
- push ax
1512
-
1513
- call itoa
1514
-
1515
- add sp,10
1516
-
1517
-
1518
-
1519
- push .font_data2
1520
-
1521
- call puts
1522
-
1523
- add sp,19
1524
-
1525
- ```
1526
-
1527
- ![イメージ説明](a2aa6dd90a3511acd9ada129bb75a3b4.png)
963
+ mov ax,0x0500
964
+
965
+ mov [FONT.off],ax
966
+
967
+ mov ax,bp
968
+
969
+ これを実行させているのでアドレスは正しいはず・・・。

3

追記

2020/02/11 02:33

投稿

kazuyakazuya
kazuyakazuya

スコア193

test CHANGED
File without changes
test CHANGED
@@ -380,1058 +380,1148 @@
380
380
 
381
381
  ```s
382
382
 
383
- BOOT_LOAD equ 0x7C00
384
-
385
- ORG BOOT_LOAD
386
-
387
-
388
-
389
- ;/_/_/_/_/_/_/_/
390
-
391
- ;マクロ
392
-
393
- ;/_/_/_/_/_/_/_/
394
-
395
- %include "../include/marco.s"
396
-
397
- %include "../include/define.s"
398
-
399
-
400
-
401
- ;/_/_/_/_/_/_/_/
402
-
403
- ;BPB
404
-
405
- ;/_/_/_/_/_/_/_/
406
-
407
-
408
-
409
- entry:
410
-
411
- jmp ipl
412
-
413
- times 90 - ($ - $$) db 0x90 ;先頭から90バイトまでをnop命令で埋め尽くす。
414
-
415
-
416
-
417
- ;/_/_/_/_/_/_/_/
418
-
419
- ;ブートローダー本体
420
-
421
- ;/_/_/_/_/_/_/_/
422
-
423
-
424
-
425
- ipl:
426
-
427
-
428
-
429
- cli ;割り込み禁止
430
-
431
-
432
-
433
- mov ax,0x0000
383
+ ;第一ブートローダは省略
384
+
385
+
386
+
387
+ ;/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
388
+
389
+ ;カーネルローダー 第二ブートローダー。
390
+
391
+ ;/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
392
+
393
+
394
+
395
+ stage_2:
396
+
397
+
398
+
399
+
400
+
401
+ ;/_/_/_/_/_/_/
402
+
403
+ ;フォントアドレス取得
404
+
405
+ ;/_/_/_/_/_/_/
406
+
407
+
408
+
409
+ push FONT
410
+
411
+ call get_font_adr
412
+
413
+ add sp,2
414
+
415
+
416
+
417
+ ;/_/_/_/_/_/_/_/_/
418
+
419
+ ;ADDRESS FONT ! >
420
+
421
+ ;/_/_/_/_/_/_/_/_/
422
+
423
+
424
+
425
+ push .s2
426
+
427
+ call puts
428
+
429
+ add sp,15
430
+
431
+
432
+
433
+ ;/_/_/_/_/_/_/_/_/
434
+
435
+ ;フォントアドレス表示 .seg
436
+
437
+ ;/_/_/_/_/_/_/_/_/
438
+
439
+
440
+
441
+ push 0b0100
442
+
443
+ push 16
444
+
445
+ push 4
446
+
447
+ push .font_data
448
+
449
+ mov bp,[FONT.seg]
450
+
451
+ push bp
452
+
453
+ call itoa
454
+
455
+ add sp,10
456
+
457
+
458
+
459
+ push .font_data
460
+
461
+ call puts
462
+
463
+ add sp,7
464
+
465
+
466
+
467
+ ;/_/_/_/_/_/_/_/_/
468
+
469
+ ;フォントアドレス表示 :
470
+
471
+ ;/_/_/_/_/_/_/_/_/
472
+
473
+
474
+
475
+ push .s4
476
+
477
+ call puts
478
+
479
+ add sp,2
480
+
481
+
482
+
483
+ ;/_/_/_/_/_/_/_/_/
484
+
485
+ ;フォントアドレス表示 .off
486
+
487
+ ;/_/_/_/_/_/_/_/_/
488
+
489
+
490
+
491
+ push 0b0100
492
+
493
+ push 16
494
+
495
+ push 4
496
+
497
+ push .font_data
498
+
499
+ mov bp,[FONT.off]
500
+
501
+ push bp
502
+
503
+ call itoa
504
+
505
+ add sp,10
506
+
507
+
508
+
509
+ push .font_data
510
+
511
+ call puts
512
+
513
+ add sp,7
514
+
515
+
516
+
517
+
518
+
519
+ ;/_/_/_/_/_/_/_/_/
520
+
521
+ ;< ADDRESS FONT !
522
+
523
+ ;/_/_/_/_/_/_/_/_/
524
+
525
+
526
+
527
+ push .s3
528
+
529
+ call puts
530
+
531
+ add sp,17
532
+
533
+
534
+
535
+
536
+
537
+
538
+
539
+
540
+
541
+
542
+
543
+
544
+
545
+ ;/_/_/_/_/_/_/_/_/
546
+
547
+ ;フォントデータを表示させる。 THIS IS FONT DATA>
548
+
549
+ ;/_/_/_/_/_/_/_/_/
550
+
551
+
552
+
553
+ push .s5
554
+
555
+ call puts
556
+
557
+ add sp,21
558
+
559
+
560
+
561
+ ;/_/_/_/_/_/_/_/_/
562
+
563
+ ;フォントアドレス
564
+
565
+ ;/_/_/_/_/_/_/_/_/
566
+
567
+
568
+
569
+ mov ax,[es:bp]
570
+
571
+ push 0b0100
572
+
573
+ push 2
574
+
575
+ push 16
576
+
577
+ push .font_data2
578
+
579
+ push ax
580
+
581
+ call itoa
582
+
583
+ add sp,10
584
+
585
+
586
+
587
+ push .font_data2
588
+
589
+ call puts
590
+
591
+ add sp,19
592
+
593
+
594
+
595
+
596
+
597
+ add bp,2
598
+
599
+ mov ax,[es:bp]
600
+
601
+ push 0b0100
602
+
603
+ push 2
604
+
605
+ push 16
606
+
607
+ push .font_data2
608
+
609
+ push ax
610
+
611
+ call itoa
612
+
613
+ add sp,10
614
+
615
+
616
+
617
+ push .font_data2
618
+
619
+ call puts
620
+
621
+ add sp,19
622
+
623
+
624
+
625
+
626
+
627
+ add bp,4
628
+
629
+ mov ax,[es:bp]
630
+
631
+ push 0b0100
632
+
633
+ push 2
634
+
635
+ push 16
636
+
637
+ push .font_data2
638
+
639
+ push ax
640
+
641
+ call itoa
642
+
643
+ add sp,10
644
+
645
+
646
+
647
+ push .font_data2
648
+
649
+ call puts
650
+
651
+ add sp,19
652
+
653
+
654
+
655
+
656
+
657
+ add bp,6
658
+
659
+ mov ax,[es:bp]
660
+
661
+ push 0b0100
662
+
663
+ push 2
664
+
665
+ push 16
666
+
667
+ push .font_data2
668
+
669
+ push ax
670
+
671
+ call itoa
672
+
673
+ add sp,10
674
+
675
+
676
+
677
+ push .font_data2
678
+
679
+ call puts
680
+
681
+ add sp,19
682
+
683
+
684
+
685
+
686
+
687
+
688
+
689
+
690
+
691
+
692
+
693
+ ;/_/_/_/_/_/_/_/_/
694
+
695
+ ;フォントデータを表示させる。 <THIS IS FONT DATA
696
+
697
+ ;/_/_/_/_/_/_/_/_/
698
+
699
+
700
+
701
+ push .s6
702
+
703
+ call puts
704
+
705
+ add sp,21
706
+
707
+
708
+
709
+ ;/_/_/_/_/_/_/
710
+
711
+ ;A20 有効化処理 https://www.hazymoon.jp/OpenBSD/annex/keyboard.html
712
+
713
+ ;/_/_/_/_/_/_/
714
+
715
+
716
+
717
+ cli ;割り込み禁止
718
+
719
+
720
+
721
+ ;/_/_/_/_/_/_/
722
+
723
+ ;キーボード無効化
724
+
725
+ ;/_/_/_/_/_/_/
726
+
727
+
728
+
729
+ push 0xAD
730
+
731
+ call KBC_Cmd_Write
732
+
733
+ add sp,2
734
+
735
+
736
+
737
+ ;/_/_/_/_/_/_/
738
+
739
+ ;input port 呼び出し コマンド
740
+
741
+ ;/_/_/_/_/_/_/
742
+
743
+
744
+
745
+ push 0xD0
746
+
747
+ call KBC_Cmd_Write
748
+
749
+ add sp,2
750
+
751
+
752
+
753
+ ;/_/_/_/_/_/_/
754
+
755
+ ; .keyに0x0D 呼び出し結果を書き込む
756
+
757
+ ;/_/_/_/_/_/_/
758
+
759
+
760
+
761
+ push .key
762
+
763
+ call KBC_Data_Read
764
+
765
+ add sp,2
766
+
767
+
768
+
769
+ mov bl,[.key] ;0x0D input port 8bit blはbxの下位バイト
770
+
771
+ or bl,0x02 ;2bit目のゲートA20信号線のビットを立てる。
772
+
773
+
774
+
775
+ ;/_/_/_/_/_/_/
776
+
777
+ ;port 0x60へ書き込んだ値が output port へ出力される。
778
+
779
+ ;/_/_/_/_/_/_/
780
+
781
+
782
+
783
+ push 0xD1
784
+
785
+ call KBC_Cmd_Write
786
+
787
+ add sp,2
788
+
789
+
790
+
791
+ ;/_/_/_/_/_/_/
792
+
793
+ ;ビットを立てた output data を読み込ませる。
794
+
795
+ ;/_/_/_/_/_/_/
796
+
797
+
798
+
799
+ push bx
800
+
801
+ call KBC_Data_Write
802
+
803
+ add sp,2
804
+
805
+
806
+
807
+ ;/_/_/_/_/_/_/
808
+
809
+ ;キーボード有効化
810
+
811
+ ;/_/_/_/_/_/_/
812
+
813
+
814
+
815
+ push 0xAE
816
+
817
+ call KBC_Cmd_Write
818
+
819
+ add sp,2
820
+
821
+
822
+
823
+ ;/_/_/_/_/_/_/
824
+
825
+ ;A20_Gate_Enabled... を表示
826
+
827
+ ;/_/_/_/_/_/_/
828
+
829
+
830
+
831
+ push .s1
832
+
833
+ call puts
834
+
835
+ add sp,20
836
+
837
+ sti
838
+
839
+
840
+
841
+ jmp stage_6
842
+
843
+
844
+
845
+ ;/_/_/_/_/_/_/
846
+
847
+ ;データ
848
+
849
+ ;/_/_/_/_/_/_/
850
+
851
+
852
+
853
+ ALIGN 2,db 0
854
+
855
+
856
+
857
+ .key: dw 0
858
+
859
+ .s1 db "A20_Gate_Enabled...",0
860
+
861
+ .s2 db "ADDRESS FONT!>",0
862
+
863
+ .s3 db "<ADDRESS FONT!",0x0A,0x0D,0
864
+
865
+ .s4 db ":",0
866
+
867
+ .s5 db "THIS IS FONT DATA>",0x0A,0x0D,0
868
+
869
+ .s6 db "<THIS IS FONT DATA",0x0A,0x0D,0
870
+
871
+ .font_data db "----",0
872
+
873
+ .font_data2 db "----------------",0x0A,0x0D,0
874
+
875
+
876
+
877
+
878
+
879
+ %include "../modules/real/itoa.s"
880
+
881
+
882
+
883
+ FONT:
884
+
885
+ .seg: dw 0
886
+
887
+ .off: dw 0
888
+
889
+
890
+
891
+ stage_6:
892
+
893
+
894
+
895
+ ;/_/_/_/_/_/_/
896
+
897
+ ;ビデオモード変更
898
+
899
+ ;/_/_/_/_/_/_/
900
+
901
+
902
+
903
+ push stage_6.s0
904
+
905
+ call puts
906
+
907
+ add sp,13
908
+
909
+
910
+
911
+ .10L:
912
+
913
+ mov ah,0x00
914
+
915
+ int 0x16
916
+
917
+
918
+
919
+ cmp al,' '
920
+
921
+ jne .10L
922
+
923
+
924
+
925
+ mov ax,0x0012
926
+
927
+ int 0x10
928
+
929
+
930
+
931
+ jmp stage_7
932
+
933
+
934
+
935
+
936
+
937
+ .s0 db "6th_stage...",0
938
+
939
+
940
+
941
+ ;/_/_/_/_/_/_/
942
+
943
+ ;GDT IDT セレクタ 初期化設定定義
944
+
945
+ ;/_/_/_/_/_/_/
946
+
947
+
948
+
949
+ ALIGN 4,db 0
950
+
951
+
952
+
953
+ ;GDT
954
+
955
+
956
+
957
+ GDT:
958
+
959
+ dq 0x00_0_0_0_0_000000_0000 ;NULLディスクリプタ―
960
+
961
+ .cs: dq 0x00_C_F_9_A_000000_FFFF ;コードディスクリプター
962
+
963
+ .ds: dq 0x00_C_F_9_2_000000_FFFF ;データディスクリプタ―
964
+
965
+ .gdt_end:
966
+
967
+
968
+
969
+ SEL_CODE equ GDT.cs-GDT
970
+
971
+ SEL_DATA equ GDT.ds-GDT
972
+
973
+
974
+
975
+ IDT:
976
+
977
+
978
+
979
+ .idt_end:
980
+
981
+
982
+
983
+
984
+
985
+ ;GDTR
986
+
987
+
988
+
989
+ GDTR:
990
+
991
+ dw GDT.gdt_end - GDT - 1
992
+
993
+ dd GDT ;GDTベースアドレス
994
+
995
+
996
+
997
+ ;IDT
998
+
999
+
1000
+
1001
+ IDTR:
1002
+
1003
+ dw IDT.idt_end - IDT - 1
1004
+
1005
+ dd IDT ;IDTベースアドレス
1006
+
1007
+
1008
+
1009
+ stage_7:
1010
+
1011
+
1012
+
1013
+ ;/_/_/_/_/_/_/
1014
+
1015
+ ;プロテクトモード移行
1016
+
1017
+ ;/_/_/_/_/_/_/
1018
+
1019
+
1020
+
1021
+ cli ;割り込み禁止
1022
+
1023
+
1024
+
1025
+ lgdt [GDTR]
1026
+
1027
+
1028
+
1029
+ lidt [IDTR]
1030
+
1031
+
1032
+
1033
+ mov eax,cr0
1034
+
1035
+ or eax,1
1036
+
1037
+ mov cr0,eax
1038
+
1039
+ jmp $ + 2
1040
+
1041
+
1042
+
1043
+ [BITS 32]
1044
+
1045
+ db 0x66
1046
+
1047
+ jmp SEL_CODE:CODE_32
1048
+
1049
+
1050
+
1051
+ CODE_32:
1052
+
1053
+
1054
+
1055
+ mov ax,SEL_DATA
434
1056
 
435
1057
  mov ds,ax
436
1058
 
437
1059
  mov es,ax
438
1060
 
1061
+ mov fs,ax
1062
+
1063
+ mov gs,ax
1064
+
439
1065
  mov ss,ax
440
1066
 
441
- mov sp,BOOT_LOAD ;sp==0x7C00
442
-
443
-
444
-
445
- sti ;割り込み許可
446
-
447
- mov [BOOT.DRIVE],dl ;ブートドライブ保存(・・・?)
448
-
449
-
450
-
451
-
452
-
453
- ;/_/_/_/_/_/_/_/
454
-
455
- ;Booting... 表示
456
-
457
- ;/_/_/_/_/_/_/_/
458
-
459
-
460
-
461
- push BOOT.s0
462
-
463
- call puts
464
-
465
- add sp,11
466
-
467
-
468
-
469
-
470
-
471
- mov bx,BOOT_SECT - 1
472
-
473
- mov cx,BOOT_LOAD + SECT_SIZE
474
-
475
-
476
-
477
- ;/_/_/_/_/_/_/_/
478
-
479
- ;read_chs セクタ読み取り関数
480
-
481
- ;/_/_/_/_/_/_/_/
1067
+
1068
+
1069
+ ;mov ecx,(KERNEL_SIZE) / 4
1070
+
1071
+ ;mov esi,BOOT_END
1072
+
1073
+ ;mov edi,KERNEL_LOAD
1074
+
1075
+ ;cld
1076
+
1077
+ ;rep movsd
1078
+
1079
+
1080
+
1081
+ ;/_/_/_/_/_/_/_/_/_/_/_/
1082
+
1083
+ ;
1084
+
1085
+ ;
1086
+
1087
+ ;以下、本来カーネルに書く内容
1088
+
1089
+ ;後でコピペしなければいけない。
1090
+
1091
+ ;
1092
+
1093
+ ;/_/_/_/_/_/_/_/_/_/_/_/
1094
+
1095
+
1096
+
1097
+ mov esi,'a'
1098
+
1099
+ shl esi,4
1100
+
1101
+ add esi,[FONT]
1102
+
1103
+
1104
+
1105
+ mov edi,0xA_0000
1106
+
1107
+
1108
+
1109
+ mov ecx,16
1110
+
1111
+
1112
+
1113
+ .10L:
1114
+
1115
+
1116
+
1117
+ movsb
1118
+
1119
+ add edi,80 - 1
1120
+
1121
+
1122
+
1123
+ loop .10L
1124
+
1125
+
1126
+
1127
+ jmp $
1128
+
1129
+
1130
+
1131
+ times BOOT_SIZE - ($ - $$) db 0
1132
+
1133
+
1134
+
1135
+ ```
1136
+
1137
+
1138
+
1139
+ アスキー変換関数
1140
+
1141
+ ```s
1142
+
1143
+ itoa:
1144
+
1145
+
1146
+
1147
+ ;/_/_/_/_/_/_/_/_/_/_/_/
1148
+
1149
+ ;
1150
+
1151
+ ;bp (bp)
1152
+
1153
+ ;リターンアドレス
1154
+
1155
+ ;num 変換する値 (ax)
1156
+
1157
+ ;buff 保存先アドレス(si)
1158
+
1159
+ ;size 保存先バッファさきサイズ(cx)
1160
+
1161
+ ;radix 基数(2、8,10または16を設定する。)
1162
+
1163
+ ;flags B2:空白を0で埋める B1:+/-符号をつける B0:値を符号付変数として扱う(bx)
1164
+
1165
+ ;
1166
+
1167
+ ;/_/_/_/_/_/_/_/_/_/_/_/
1168
+
1169
+
1170
+
1171
+ push bp
1172
+
1173
+ mov bp,sp
1174
+
1175
+
1176
+
1177
+ push ax
1178
+
1179
+ push bx
482
1180
 
483
1181
  push cx
484
1182
 
485
- push bx
1183
+ push dx
486
-
1184
+
487
- push BOOT
1185
+ push si
1186
+
488
-
1187
+ push di
1188
+
1189
+
1190
+
1191
+ mov ax,[bp + 4] ;変換する値
1192
+
1193
+ mov si,[bp + 6] ;保存先アドレス
1194
+
1195
+
1196
+
1197
+ mov cx,[bp + 8] ;cx=バッファサイズ
1198
+
1199
+
1200
+
489
- call read_chs
1201
+ mov di,si
490
-
1202
+
491
- add sp,8
1203
+ add di,cx
1204
+
492
-
1205
+ dec di ;di=バッファの最後尾
493
-
494
-
1206
+
1207
+
1208
+
495
- cmp ax,bx ;axが0のときは、エラー。
1209
+ mov bx,word [bp + 12] ;flags
1210
+
1211
+
1212
+
1213
+ test bx,0b0001 ;値を符号付変数として扱う AND演算 結果が0なら ZFを立てる。
496
1214
 
497
1215
 
498
1216
 
499
1217
  .10Q:
500
1218
 
501
- jz .10E ;IF ZF=1
502
-
503
-
504
-
505
- ;/_/_/_/_/_/_/_/
506
-
507
- ;Error...を表示する。正常にセクタを読み出せなかった場合の処理。
508
-
509
- ;/_/_/_/_/_/_/_/
510
-
511
-
512
-
513
- .10T:
514
-
515
- push BOOT.s1
516
-
517
- call puts
1219
+ je .10E ;IF ZF=1
1220
+
1221
+
1222
+
1223
+ cmp ax,0
1224
+
1225
+
1226
+
1227
+ .12Q:
1228
+
1229
+ jge .12E
1230
+
1231
+ or bx,0b0010
1232
+
1233
+
1234
+
1235
+ .12E:
1236
+
1237
+ .10E:
1238
+
1239
+
1240
+
1241
+ test bx,0b0010
1242
+
1243
+
1244
+
1245
+ .20Q:
1246
+
1247
+ je .20E ;IF ZF==1
1248
+
1249
+ cmp ax,0
1250
+
1251
+
1252
+
1253
+ .22Q:
1254
+
1255
+ jge .22F
1256
+
1257
+ neg ax
1258
+
1259
+ mov [si],byte '-'
1260
+
1261
+
1262
+
1263
+ jmp .22E
1264
+
1265
+
1266
+
1267
+ .22F:
1268
+
1269
+
1270
+
1271
+ mov [si],byte '+'
1272
+
1273
+
1274
+
1275
+ .22E:
1276
+
1277
+ dec cx
1278
+
1279
+
1280
+
1281
+ .20E:
1282
+
1283
+
1284
+
1285
+ ;/_/_/_/_/_/_/
1286
+
1287
+ ;ASCII変換
1288
+
1289
+ ;/_/_/_/_/_/_/
1290
+
1291
+
1292
+
1293
+ mov bx,[bp + 10] ;基数
1294
+
1295
+
1296
+
1297
+ .30L:
1298
+
1299
+
1300
+
1301
+ mov dx,0
1302
+
1303
+ div bx
1304
+
1305
+ ;DX=DX:AX % 基数
1306
+
1307
+ ;AX=DX:AX / 基数
1308
+
1309
+
1310
+
1311
+ mov si,dx
1312
+
1313
+ mov dl,byte [.ascii + si]
1314
+
1315
+
1316
+
1317
+ mov [di],dl
1318
+
1319
+ dec di
1320
+
1321
+
1322
+
1323
+ cmp ax,0 ;割った商が0か確認
1324
+
1325
+
1326
+
1327
+ loopnz .30L ;CX を -1 し cx != 0 かつ ZF == 0
1328
+
1329
+
1330
+
1331
+ .30E:
1332
+
1333
+
1334
+
1335
+ ;
1336
+
1337
+ ;空白を埋める。
1338
+
1339
+ ;
1340
+
1341
+
1342
+
1343
+ cmp cx,0
1344
+
1345
+ .40Q:
1346
+
1347
+ je .40E ;IF ZF==1
1348
+
1349
+ mov al,' '
1350
+
1351
+
1352
+
1353
+ cmp [bp + 12],word 0b0100
1354
+
1355
+
1356
+
1357
+ .42Q:
1358
+
1359
+ jne .42E ;IF ZF==0
1360
+
1361
+ mov al,'0'
1362
+
1363
+
1364
+
1365
+ .42E:
1366
+
1367
+ std ;デクリメント
1368
+
1369
+ rep stosb ;al→di ecx=回数
1370
+
1371
+
1372
+
1373
+ .40E:
1374
+
1375
+
1376
+
1377
+ pop di
1378
+
1379
+ pop si
1380
+
1381
+ pop dx
1382
+
1383
+ pop cx
1384
+
1385
+ pop bx
1386
+
1387
+ pop ax
1388
+
1389
+
1390
+
1391
+ mov sp,bp
1392
+
1393
+ pop bp
1394
+
1395
+
1396
+
1397
+ ret
1398
+
1399
+
1400
+
1401
+ .ascii db "0123456789ABCDEF"
1402
+
1403
+
1404
+
1405
+ ```
1406
+
1407
+
1408
+
1409
+ ```s
1410
+
1411
+ mov ax,[es:bp]
1412
+
1413
+ push 0b0100
1414
+
1415
+ push 2
1416
+
1417
+ push 16
1418
+
1419
+ push .font_data2
1420
+
1421
+ push ax
1422
+
1423
+ call itoa
518
1424
 
519
1425
  add sp,10
520
1426
 
521
1427
 
522
1428
 
523
-
524
-
525
- ;/_/_/_/_/_/_/_/
526
-
527
- ;正常に読み取り成功パターン。
528
-
529
- ;/_/_/_/_/_/_/_/
530
-
531
-
532
-
533
- .10E:
534
-
535
-
536
-
537
- jmp stage_2
538
-
539
-
540
-
541
- ALIGN 2,db 0
542
-
543
- BOOT:
544
-
545
- istruc drive
546
-
547
- at drive.no,dw 0
548
-
549
- at drive.cyln,dw 0
550
-
551
- at drive.head,dw 0
552
-
553
- at drive.sect,dw 2
554
-
555
- iend
556
-
557
-
558
-
559
- .DRIVE: dw 0
560
-
561
- .s0 db "Booting...",0
562
-
563
- .s1 db "Error!...",0
564
-
565
-
566
-
567
- ;/_/_/_/_/_/_/_/
568
-
569
- ;モジュール
570
-
571
- ;/_/_/_/_/_/_/_/
572
-
573
-
574
-
575
- %include "../modules/real/puts.s"
576
-
577
- %include "../modules/real/read_chs.s"
578
-
579
- %include "../modules/real/kbc.s"
580
-
581
- %include "../modules/real/get_font_adr.s"
582
-
583
-
584
-
585
- ;/_/_/_/_/_/_/_/
586
-
587
- ;ブートシグネチャ
588
-
589
- ;/_/_/_/_/_/_/_/
590
-
591
-
592
-
593
- times 510 - ($ - $$) db 0x00 ;余っている510バイトまで0で埋める。
594
-
595
- db 0x55,0xAA
596
-
597
-
598
-
599
- ;/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
600
-
601
- ;
602
-
603
- ;/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
604
-
605
- ;
606
-
607
- ;/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
608
-
609
- ;
610
-
611
- ;/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
612
-
613
- ;
614
-
615
- ;/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
616
-
617
- ;
618
-
619
- ;/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
620
-
621
- ;
622
-
623
- ;/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
624
-
625
-
626
-
627
-
628
-
629
-
630
-
631
- ;/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
632
-
633
- ;カーネルローダー 第二ブートローダー。
634
-
635
- ;/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
636
-
637
-
638
-
639
- stage_2:
640
-
641
-
642
-
643
- ;/_/_/_/_/_/_/
644
-
645
- ;フォントアドレス取得
646
-
647
- ;/_/_/_/_/_/_/
648
-
649
-
650
-
651
- push FONT
652
-
653
- call get_font_adr
654
-
655
- add sp,2
656
-
657
-
658
-
659
- ;/_/_/_/_/_/_/
660
-
661
- ;A20 有効化処理 https://www.hazymoon.jp/OpenBSD/annex/keyboard.html
662
-
663
- ;/_/_/_/_/_/_/
664
-
665
-
666
-
667
- cli ;割り込み禁止
668
-
669
-
670
-
671
- ;/_/_/_/_/_/_/
672
-
673
- ;キーボード無効化
674
-
675
- ;/_/_/_/_/_/_/
676
-
677
-
678
-
679
- push 0xAD
680
-
681
- call KBC_Cmd_Write
682
-
683
- add sp,2
684
-
685
-
686
-
687
- ;/_/_/_/_/_/_/
688
-
689
- ;input port 呼び出し コマンド
690
-
691
- ;/_/_/_/_/_/_/
692
-
693
-
694
-
695
- push 0xD0
696
-
697
- call KBC_Cmd_Write
698
-
699
- add sp,2
700
-
701
-
702
-
703
- ;/_/_/_/_/_/_/
704
-
705
- ; .keyに0x0D 呼び出し結果を書き込む
706
-
707
- ;/_/_/_/_/_/_/
708
-
709
-
710
-
711
- push .key
712
-
713
- call KBC_Data_Read
714
-
715
- add sp,2
716
-
717
-
718
-
719
- mov bl,[.key] ;0x0D input port 8bit blはbxの下位バイト
720
-
721
- or bl,0x02 ;2bit目のゲートA20信号線のビットを立てる。
722
-
723
-
724
-
725
- ;/_/_/_/_/_/_/
726
-
727
- ;port 0x60へ書き込んだ値が output port へ出力される。
728
-
729
- ;/_/_/_/_/_/_/
730
-
731
-
732
-
733
- push 0xD1
734
-
735
- call KBC_Cmd_Write
736
-
737
- add sp,2
738
-
739
-
740
-
741
- ;/_/_/_/_/_/_/
742
-
743
- ;ビットを立てた output data を読み込ませる。
744
-
745
- ;/_/_/_/_/_/_/
746
-
747
-
748
-
749
- push bx
750
-
751
- call KBC_Data_Write
752
-
753
- add sp,2
754
-
755
-
756
-
757
- ;/_/_/_/_/_/_/
758
-
759
- ;キーボード有効化
760
-
761
- ;/_/_/_/_/_/_/
762
-
763
-
764
-
765
- push 0xAE
766
-
767
- call KBC_Cmd_Write
768
-
769
- add sp,2
770
-
771
-
772
-
773
- ;/_/_/_/_/_/_/
774
-
775
- ;A20_Gate_Enabled... を表示
776
-
777
- ;/_/_/_/_/_/_/
778
-
779
-
780
-
781
- push .s1
782
-
783
- call puts
784
-
785
- add sp,20
786
-
787
- sti
788
-
789
-
790
-
791
- jmp stage_6
792
-
793
-
794
-
795
- ;/_/_/_/_/_/_/
796
-
797
- ;データ
798
-
799
- ;/_/_/_/_/_/_/
800
-
801
-
802
-
803
- ALIGN 2,db 0
804
-
805
-
806
-
807
- .key: dw 0
808
-
809
- .s1 db "A20_Gate_Enabled...",0
810
-
811
-
812
-
813
- FONT:
814
-
815
- .seg: dw 0
816
-
817
- .off: dw 0
818
-
819
-
820
-
821
- stage_6:
822
-
823
-
824
-
825
- ;/_/_/_/_/_/_/
826
-
827
- ;ビデオモード変更
828
-
829
- ;/_/_/_/_/_/_/
830
-
831
-
832
-
833
- push stage_6.s0
834
-
835
- call puts
836
-
837
- add sp,13
838
-
839
-
840
-
841
- .10L:
842
-
843
- mov ah,0x00
844
-
845
- int 0x16
846
-
847
-
848
-
849
- cmp al,' '
850
-
851
- jne .10L
852
-
853
-
854
-
855
- mov ax,0x0012
856
-
857
- int 0x10
858
-
859
-
860
-
861
- jmp stage_7
862
-
863
-
864
-
865
-
866
-
867
- .s0 db "6th_stage...",0
868
-
869
-
870
-
871
- ;/_/_/_/_/_/_/
872
-
873
- ;GDT IDT セレクタ 初期化設定定義
874
-
875
- ;/_/_/_/_/_/_/
876
-
877
-
878
-
879
- ALIGN 4,db 0
880
-
881
-
882
-
883
- ;GDT
884
-
885
-
886
-
887
- GDT:
888
-
889
- dq 0x00_0_0_0_0_000000_0000 ;NULLディスクリプタ―
890
-
891
- .cs: dq 0x00_C_F_9_A_000000_FFFF ;コードディスクリプター
892
-
893
- .ds: dq 0x00_C_F_9_2_000000_FFFF ;データディスクリプタ―
894
-
895
- .gdt_end:
896
-
897
-
898
-
899
- SEL_CODE equ GDT.cs-GDT
900
-
901
- SEL_DATA equ GDT.ds-GDT
902
-
903
-
904
-
905
- IDT:
906
-
907
-
908
-
909
- .idt_end:
910
-
911
-
912
-
913
-
914
-
915
- ;GDTR
916
-
917
-
918
-
919
- GDTR:
920
-
921
- dw GDT.gdt_end - GDT - 1
922
-
923
- dd GDT ;GDTベースアドレス
924
-
925
-
926
-
927
- ;IDT
928
-
929
-
930
-
931
- IDTR:
932
-
933
- dw IDT.idt_end - IDT - 1
934
-
935
- dd IDT ;IDTベースアドレス
936
-
937
-
938
-
939
- stage_7:
940
-
941
-
942
-
943
- ;/_/_/_/_/_/_/
944
-
945
- ;プロテクトモード移行
946
-
947
- ;/_/_/_/_/_/_/
948
-
949
-
950
-
951
- cli ;割り込み禁止
952
-
953
-
954
-
955
- lgdt [GDTR]
956
-
957
-
958
-
959
- lidt [IDTR]
960
-
961
-
962
-
963
- mov eax,cr0
964
-
965
- or eax,1
966
-
967
- mov cr0,eax
968
-
969
- jmp $ + 2
970
-
971
-
972
-
973
- [BITS 32]
974
-
975
- db 0x66
976
-
977
- jmp SEL_CODE:CODE_32
978
-
979
-
980
-
981
- CODE_32:
982
-
983
-
984
-
985
- mov ax,SEL_DATA
986
-
987
- mov ds,ax
988
-
989
- mov es,ax
990
-
991
- mov fs,ax
992
-
993
- mov gs,ax
994
-
995
- mov ss,ax
996
-
997
-
998
-
999
-
1000
-
1001
-
1002
-
1003
- ;/_/_/_/_/_/_/_/_/_/_/_/
1004
-
1005
- ;
1006
-
1007
- ;
1008
-
1009
- ;以下、本来カーネルに書く内容
1010
-
1011
- ;後でコピペしなければいけない。
1012
-
1013
- ;
1014
-
1015
- ;/_/_/_/_/_/_/_/_/_/_/_/
1016
-
1017
-
1018
-
1019
- mov esi,'a'
1020
-
1021
- shl esi,4
1022
-
1023
- add esi,[FONT]
1024
-
1025
-
1026
-
1027
- mov edi,0xA_0000
1028
-
1029
-
1030
-
1031
- mov ecx,16
1032
-
1033
-
1034
-
1035
- .10L:
1036
-
1037
-
1038
-
1039
- movsb
1040
-
1041
- add edi,80 - 1
1042
-
1043
-
1044
-
1045
- loop .10L
1046
-
1047
-
1048
-
1049
- jmp $
1050
-
1051
-
1052
-
1053
- times BOOT_SIZE - ($ - $$) db 0
1054
-
1055
-
1429
+ push .font_data2
1430
+
1431
+ call puts
1432
+
1433
+ add sp,19
1434
+
1435
+
1436
+
1437
+
1438
+
1439
+ add bp,2
1440
+
1441
+ mov ax,[es:bp]
1442
+
1443
+ push 0b0100
1444
+
1445
+ push 2
1446
+
1447
+ push 16
1448
+
1449
+ push .font_data2
1450
+
1451
+ push ax
1452
+
1453
+ call itoa
1454
+
1455
+ add sp,10
1456
+
1457
+
1458
+
1459
+ push .font_data2
1460
+
1461
+ call puts
1462
+
1463
+ add sp,19
1464
+
1465
+
1466
+
1467
+
1468
+
1469
+ add bp,4
1470
+
1471
+ mov ax,[es:bp]
1472
+
1473
+ push 0b0100
1474
+
1475
+ push 2
1476
+
1477
+ push 16
1478
+
1479
+ push .font_data2
1480
+
1481
+ push ax
1482
+
1483
+ call itoa
1484
+
1485
+ add sp,10
1486
+
1487
+
1488
+
1489
+ push .font_data2
1490
+
1491
+ call puts
1492
+
1493
+ add sp,19
1494
+
1495
+
1496
+
1497
+
1498
+
1499
+ add bp,6
1500
+
1501
+ mov ax,[es:bp]
1502
+
1503
+ push 0b0100
1504
+
1505
+ push 2
1506
+
1507
+ push 16
1508
+
1509
+ push .font_data2
1510
+
1511
+ push ax
1512
+
1513
+ call itoa
1514
+
1515
+ add sp,10
1516
+
1517
+
1518
+
1519
+ push .font_data2
1520
+
1521
+ call puts
1522
+
1523
+ add sp,19
1056
1524
 
1057
1525
  ```
1058
1526
 
1059
-
1060
-
1061
- アスキー変換関数
1062
-
1063
- ```s
1064
-
1065
- itoa:
1066
-
1067
-
1068
-
1069
- ;/_/_/_/_/_/_/_/_/_/_/_/
1070
-
1071
- ;
1072
-
1073
- ;bp (bp)
1074
-
1075
- ;リターンアドレス
1076
-
1077
- ;num 変換する値 (ax)
1078
-
1079
- ;buff 保存先アドレス(si)
1080
-
1081
- ;size 保存先バッファさきサイズ(cx)
1082
-
1083
- ;radix 基数(2、8,10または16を設定する。)
1084
-
1085
- ;flags B2:空白を0で埋める B1:+/-符号をつける B0:値を符号付変数として扱う(bx)
1086
-
1087
- ;
1088
-
1089
- ;/_/_/_/_/_/_/_/_/_/_/_/
1090
-
1091
-
1092
-
1093
- push bp
1094
-
1095
- mov bp,sp
1096
-
1097
-
1098
-
1099
- push ax
1100
-
1101
- push bx
1102
-
1103
- push cx
1104
-
1105
- push dx
1106
-
1107
- push si
1108
-
1109
- push di
1110
-
1111
-
1112
-
1113
- mov ax,[bp + 4] ;変換する値
1114
-
1115
- mov si,[bp + 6] ;保存先アドレス
1116
-
1117
-
1118
-
1119
- mov cx,[bp + 8] ;cx=バッファサイズ
1120
-
1121
-
1122
-
1123
- mov di,si
1124
-
1125
- add di,cx
1126
-
1127
- dec di ;di=バッファの最後尾
1128
-
1129
-
1130
-
1131
- mov bx,word [bp + 12] ;flags
1132
-
1133
-
1134
-
1135
- test bx,0b0001 ;値を符号付変数として扱う AND演算 結果が0なら ZFを立てる。
1136
-
1137
-
1138
-
1139
- .10Q:
1140
-
1141
- je .10E ;IF ZF=1
1142
-
1143
-
1144
-
1145
- cmp ax,0
1146
-
1147
-
1148
-
1149
- .12Q:
1150
-
1151
- jge .12E
1152
-
1153
- or bx,0b0010
1154
-
1155
-
1156
-
1157
- .12E:
1158
-
1159
- .10E:
1160
-
1161
-
1162
-
1163
- test bx,0b0010
1164
-
1165
-
1166
-
1167
- .20Q:
1168
-
1169
- je .20E ;IF ZF==1
1170
-
1171
- cmp ax,0
1172
-
1173
-
1174
-
1175
- .22Q:
1176
-
1177
- jge .22F
1178
-
1179
- neg ax
1180
-
1181
- mov [si],byte '-'
1182
-
1183
-
1184
-
1185
- jmp .22E
1186
-
1187
-
1188
-
1189
- .22F:
1190
-
1191
-
1192
-
1193
- mov [si],byte '+'
1194
-
1195
-
1196
-
1197
- .22E:
1198
-
1199
- dec cx
1200
-
1201
-
1202
-
1203
- .20E:
1204
-
1205
-
1206
-
1207
- ;/_/_/_/_/_/_/
1527
+ ![イメージ説明](a2aa6dd90a3511acd9ada129bb75a3b4.png)
1208
-
1209
- ;ASCII変換
1210
-
1211
- ;/_/_/_/_/_/_/
1212
-
1213
-
1214
-
1215
- mov bx,[bp + 10] ;基数
1216
-
1217
-
1218
-
1219
- .30L:
1220
-
1221
-
1222
-
1223
- mov dx,0
1224
-
1225
- div bx
1226
-
1227
- ;DX=DX:AX % 基数
1228
-
1229
- ;AX=DX:AX / 基数
1230
-
1231
-
1232
-
1233
- mov si,dx
1234
-
1235
- mov dl,byte [.ascii + si]
1236
-
1237
-
1238
-
1239
- mov [di],dl
1240
-
1241
- dec di
1242
-
1243
-
1244
-
1245
- cmp ax,0 ;割った商が0か確認
1246
-
1247
-
1248
-
1249
- loopnz .30L ;CX を -1 し cx != 0 かつ ZF == 0
1250
-
1251
-
1252
-
1253
- .30E:
1254
-
1255
-
1256
-
1257
- ;
1258
-
1259
- ;空白を埋める。
1260
-
1261
- ;
1262
-
1263
-
1264
-
1265
- cmp cx,0
1266
-
1267
- .40Q:
1268
-
1269
- je .40E ;IF ZF==1
1270
-
1271
- mov al,' '
1272
-
1273
-
1274
-
1275
- cmp [bp + 12],word 0b0100
1276
-
1277
-
1278
-
1279
- .42Q:
1280
-
1281
- jne .42E ;IF ZF==0
1282
-
1283
- mov al,'0'
1284
-
1285
-
1286
-
1287
- .42E:
1288
-
1289
- std ;デクリメント
1290
-
1291
- rep stosb ;al→di ecx=回数
1292
-
1293
-
1294
-
1295
- .40E:
1296
-
1297
-
1298
-
1299
- pop di
1300
-
1301
- pop si
1302
-
1303
- pop dx
1304
-
1305
- pop cx
1306
-
1307
- pop bx
1308
-
1309
- pop ax
1310
-
1311
-
1312
-
1313
- mov sp,bp
1314
-
1315
- pop bp
1316
-
1317
-
1318
-
1319
- ret
1320
-
1321
-
1322
-
1323
- .ascii db "0123456789ABCDEF"
1324
-
1325
-
1326
-
1327
- ```
1328
-
1329
-
1330
-
1331
- ```s
1332
-
1333
- push 0b0000
1334
-
1335
- push 16
1336
-
1337
- push 8
1338
-
1339
- push .font_data
1340
-
1341
- mov ax,[bp]
1342
-
1343
- push ax
1344
-
1345
- call itoa
1346
-
1347
- add sp,10
1348
-
1349
-
1350
-
1351
- push .font_data
1352
-
1353
- call puts
1354
-
1355
- add sp,10
1356
-
1357
-
1358
-
1359
-
1360
-
1361
- push 0b0000
1362
-
1363
- push 16
1364
-
1365
- push 8
1366
-
1367
- push .font_data
1368
-
1369
- mov ax,[bp + 2]
1370
-
1371
- push ax
1372
-
1373
- call itoa
1374
-
1375
- add sp,10
1376
-
1377
-
1378
-
1379
- push .font_data
1380
-
1381
- call puts
1382
-
1383
- add sp,10
1384
-
1385
-
1386
-
1387
- push 0b0000
1388
-
1389
- push 16
1390
-
1391
- push 8
1392
-
1393
- push .font_data
1394
-
1395
- mov ax,[bp + 4]
1396
-
1397
- push ax
1398
-
1399
- call itoa
1400
-
1401
- add sp,10
1402
-
1403
-
1404
-
1405
- push .font_data
1406
-
1407
- call puts
1408
-
1409
- add sp,10
1410
-
1411
-
1412
-
1413
- push 0b0000
1414
-
1415
- push 16
1416
-
1417
- push 8
1418
-
1419
- push .font_data
1420
-
1421
- mov ax,[bp + 6]
1422
-
1423
- push ax
1424
-
1425
- call itoa
1426
-
1427
- add sp,10
1428
-
1429
-
1430
-
1431
- push .font_data
1432
-
1433
- call puts
1434
-
1435
- add sp,10
1436
-
1437
- ```

2

追記

2020/02/10 02:46

投稿

kazuyakazuya
kazuyakazuya

スコア193

test CHANGED
File without changes
test CHANGED
@@ -1055,3 +1055,383 @@
1055
1055
 
1056
1056
 
1057
1057
  ```
1058
+
1059
+
1060
+
1061
+ アスキー変換関数
1062
+
1063
+ ```s
1064
+
1065
+ itoa:
1066
+
1067
+
1068
+
1069
+ ;/_/_/_/_/_/_/_/_/_/_/_/
1070
+
1071
+ ;
1072
+
1073
+ ;bp (bp)
1074
+
1075
+ ;リターンアドレス
1076
+
1077
+ ;num 変換する値 (ax)
1078
+
1079
+ ;buff 保存先アドレス(si)
1080
+
1081
+ ;size 保存先バッファさきサイズ(cx)
1082
+
1083
+ ;radix 基数(2、8,10または16を設定する。)
1084
+
1085
+ ;flags B2:空白を0で埋める B1:+/-符号をつける B0:値を符号付変数として扱う(bx)
1086
+
1087
+ ;
1088
+
1089
+ ;/_/_/_/_/_/_/_/_/_/_/_/
1090
+
1091
+
1092
+
1093
+ push bp
1094
+
1095
+ mov bp,sp
1096
+
1097
+
1098
+
1099
+ push ax
1100
+
1101
+ push bx
1102
+
1103
+ push cx
1104
+
1105
+ push dx
1106
+
1107
+ push si
1108
+
1109
+ push di
1110
+
1111
+
1112
+
1113
+ mov ax,[bp + 4] ;変換する値
1114
+
1115
+ mov si,[bp + 6] ;保存先アドレス
1116
+
1117
+
1118
+
1119
+ mov cx,[bp + 8] ;cx=バッファサイズ
1120
+
1121
+
1122
+
1123
+ mov di,si
1124
+
1125
+ add di,cx
1126
+
1127
+ dec di ;di=バッファの最後尾
1128
+
1129
+
1130
+
1131
+ mov bx,word [bp + 12] ;flags
1132
+
1133
+
1134
+
1135
+ test bx,0b0001 ;値を符号付変数として扱う AND演算 結果が0なら ZFを立てる。
1136
+
1137
+
1138
+
1139
+ .10Q:
1140
+
1141
+ je .10E ;IF ZF=1
1142
+
1143
+
1144
+
1145
+ cmp ax,0
1146
+
1147
+
1148
+
1149
+ .12Q:
1150
+
1151
+ jge .12E
1152
+
1153
+ or bx,0b0010
1154
+
1155
+
1156
+
1157
+ .12E:
1158
+
1159
+ .10E:
1160
+
1161
+
1162
+
1163
+ test bx,0b0010
1164
+
1165
+
1166
+
1167
+ .20Q:
1168
+
1169
+ je .20E ;IF ZF==1
1170
+
1171
+ cmp ax,0
1172
+
1173
+
1174
+
1175
+ .22Q:
1176
+
1177
+ jge .22F
1178
+
1179
+ neg ax
1180
+
1181
+ mov [si],byte '-'
1182
+
1183
+
1184
+
1185
+ jmp .22E
1186
+
1187
+
1188
+
1189
+ .22F:
1190
+
1191
+
1192
+
1193
+ mov [si],byte '+'
1194
+
1195
+
1196
+
1197
+ .22E:
1198
+
1199
+ dec cx
1200
+
1201
+
1202
+
1203
+ .20E:
1204
+
1205
+
1206
+
1207
+ ;/_/_/_/_/_/_/
1208
+
1209
+ ;ASCII変換
1210
+
1211
+ ;/_/_/_/_/_/_/
1212
+
1213
+
1214
+
1215
+ mov bx,[bp + 10] ;基数
1216
+
1217
+
1218
+
1219
+ .30L:
1220
+
1221
+
1222
+
1223
+ mov dx,0
1224
+
1225
+ div bx
1226
+
1227
+ ;DX=DX:AX % 基数
1228
+
1229
+ ;AX=DX:AX / 基数
1230
+
1231
+
1232
+
1233
+ mov si,dx
1234
+
1235
+ mov dl,byte [.ascii + si]
1236
+
1237
+
1238
+
1239
+ mov [di],dl
1240
+
1241
+ dec di
1242
+
1243
+
1244
+
1245
+ cmp ax,0 ;割った商が0か確認
1246
+
1247
+
1248
+
1249
+ loopnz .30L ;CX を -1 し cx != 0 かつ ZF == 0
1250
+
1251
+
1252
+
1253
+ .30E:
1254
+
1255
+
1256
+
1257
+ ;
1258
+
1259
+ ;空白を埋める。
1260
+
1261
+ ;
1262
+
1263
+
1264
+
1265
+ cmp cx,0
1266
+
1267
+ .40Q:
1268
+
1269
+ je .40E ;IF ZF==1
1270
+
1271
+ mov al,' '
1272
+
1273
+
1274
+
1275
+ cmp [bp + 12],word 0b0100
1276
+
1277
+
1278
+
1279
+ .42Q:
1280
+
1281
+ jne .42E ;IF ZF==0
1282
+
1283
+ mov al,'0'
1284
+
1285
+
1286
+
1287
+ .42E:
1288
+
1289
+ std ;デクリメント
1290
+
1291
+ rep stosb ;al→di ecx=回数
1292
+
1293
+
1294
+
1295
+ .40E:
1296
+
1297
+
1298
+
1299
+ pop di
1300
+
1301
+ pop si
1302
+
1303
+ pop dx
1304
+
1305
+ pop cx
1306
+
1307
+ pop bx
1308
+
1309
+ pop ax
1310
+
1311
+
1312
+
1313
+ mov sp,bp
1314
+
1315
+ pop bp
1316
+
1317
+
1318
+
1319
+ ret
1320
+
1321
+
1322
+
1323
+ .ascii db "0123456789ABCDEF"
1324
+
1325
+
1326
+
1327
+ ```
1328
+
1329
+
1330
+
1331
+ ```s
1332
+
1333
+ push 0b0000
1334
+
1335
+ push 16
1336
+
1337
+ push 8
1338
+
1339
+ push .font_data
1340
+
1341
+ mov ax,[bp]
1342
+
1343
+ push ax
1344
+
1345
+ call itoa
1346
+
1347
+ add sp,10
1348
+
1349
+
1350
+
1351
+ push .font_data
1352
+
1353
+ call puts
1354
+
1355
+ add sp,10
1356
+
1357
+
1358
+
1359
+
1360
+
1361
+ push 0b0000
1362
+
1363
+ push 16
1364
+
1365
+ push 8
1366
+
1367
+ push .font_data
1368
+
1369
+ mov ax,[bp + 2]
1370
+
1371
+ push ax
1372
+
1373
+ call itoa
1374
+
1375
+ add sp,10
1376
+
1377
+
1378
+
1379
+ push .font_data
1380
+
1381
+ call puts
1382
+
1383
+ add sp,10
1384
+
1385
+
1386
+
1387
+ push 0b0000
1388
+
1389
+ push 16
1390
+
1391
+ push 8
1392
+
1393
+ push .font_data
1394
+
1395
+ mov ax,[bp + 4]
1396
+
1397
+ push ax
1398
+
1399
+ call itoa
1400
+
1401
+ add sp,10
1402
+
1403
+
1404
+
1405
+ push .font_data
1406
+
1407
+ call puts
1408
+
1409
+ add sp,10
1410
+
1411
+
1412
+
1413
+ push 0b0000
1414
+
1415
+ push 16
1416
+
1417
+ push 8
1418
+
1419
+ push .font_data
1420
+
1421
+ mov ax,[bp + 6]
1422
+
1423
+ push ax
1424
+
1425
+ call itoa
1426
+
1427
+ add sp,10
1428
+
1429
+
1430
+
1431
+ push .font_data
1432
+
1433
+ call puts
1434
+
1435
+ add sp,10
1436
+
1437
+ ```

1

追記

2020/02/09 01:40

投稿

kazuyakazuya
kazuyakazuya

スコア193

test CHANGED
File without changes
test CHANGED
@@ -1,3 +1,27 @@
1
+ ```ここに言語を入力
2
+
3
+ 環境
4
+
5
+ ・ホスト OS windows
6
+
7
+
8
+
9
+ 作成したブートローダーから第二ブートローダーまで(内容はプロテクトモードへ移行してからVRAMへ書き込むまで)
10
+
11
+
12
+
13
+ そのプロフラムをVirtualbox上で動かしています。
14
+
15
+
16
+
17
+ 縦: 480ドット
18
+
19
+ 横: 640ドット
20
+
21
+
22
+
23
+ ```
24
+
1
25
  リアルモードからプロテクトモードへ移行させて文字を表示させたかったのですが
2
26
 
3
27
  思うようにいきません。
@@ -349,3 +373,685 @@
349
373
  どこが間違えているのか見つけられないのですが
350
374
 
351
375
  どこが間違えているのでしょうか?
376
+
377
+
378
+
379
+ **プログラム全体**
380
+
381
+ ```s
382
+
383
+ BOOT_LOAD equ 0x7C00
384
+
385
+ ORG BOOT_LOAD
386
+
387
+
388
+
389
+ ;/_/_/_/_/_/_/_/
390
+
391
+ ;マクロ
392
+
393
+ ;/_/_/_/_/_/_/_/
394
+
395
+ %include "../include/marco.s"
396
+
397
+ %include "../include/define.s"
398
+
399
+
400
+
401
+ ;/_/_/_/_/_/_/_/
402
+
403
+ ;BPB
404
+
405
+ ;/_/_/_/_/_/_/_/
406
+
407
+
408
+
409
+ entry:
410
+
411
+ jmp ipl
412
+
413
+ times 90 - ($ - $$) db 0x90 ;先頭から90バイトまでをnop命令で埋め尽くす。
414
+
415
+
416
+
417
+ ;/_/_/_/_/_/_/_/
418
+
419
+ ;ブートローダー本体
420
+
421
+ ;/_/_/_/_/_/_/_/
422
+
423
+
424
+
425
+ ipl:
426
+
427
+
428
+
429
+ cli ;割り込み禁止
430
+
431
+
432
+
433
+ mov ax,0x0000
434
+
435
+ mov ds,ax
436
+
437
+ mov es,ax
438
+
439
+ mov ss,ax
440
+
441
+ mov sp,BOOT_LOAD ;sp==0x7C00
442
+
443
+
444
+
445
+ sti ;割り込み許可
446
+
447
+ mov [BOOT.DRIVE],dl ;ブートドライブ保存(・・・?)
448
+
449
+
450
+
451
+
452
+
453
+ ;/_/_/_/_/_/_/_/
454
+
455
+ ;Booting... 表示
456
+
457
+ ;/_/_/_/_/_/_/_/
458
+
459
+
460
+
461
+ push BOOT.s0
462
+
463
+ call puts
464
+
465
+ add sp,11
466
+
467
+
468
+
469
+
470
+
471
+ mov bx,BOOT_SECT - 1
472
+
473
+ mov cx,BOOT_LOAD + SECT_SIZE
474
+
475
+
476
+
477
+ ;/_/_/_/_/_/_/_/
478
+
479
+ ;read_chs セクタ読み取り関数
480
+
481
+ ;/_/_/_/_/_/_/_/
482
+
483
+ push cx
484
+
485
+ push bx
486
+
487
+ push BOOT
488
+
489
+ call read_chs
490
+
491
+ add sp,8
492
+
493
+
494
+
495
+ cmp ax,bx ;axが0のときは、エラー。
496
+
497
+
498
+
499
+ .10Q:
500
+
501
+ jz .10E ;IF ZF=1
502
+
503
+
504
+
505
+ ;/_/_/_/_/_/_/_/
506
+
507
+ ;Error...を表示する。正常にセクタを読み出せなかった場合の処理。
508
+
509
+ ;/_/_/_/_/_/_/_/
510
+
511
+
512
+
513
+ .10T:
514
+
515
+ push BOOT.s1
516
+
517
+ call puts
518
+
519
+ add sp,10
520
+
521
+
522
+
523
+
524
+
525
+ ;/_/_/_/_/_/_/_/
526
+
527
+ ;正常に読み取り成功パターン。
528
+
529
+ ;/_/_/_/_/_/_/_/
530
+
531
+
532
+
533
+ .10E:
534
+
535
+
536
+
537
+ jmp stage_2
538
+
539
+
540
+
541
+ ALIGN 2,db 0
542
+
543
+ BOOT:
544
+
545
+ istruc drive
546
+
547
+ at drive.no,dw 0
548
+
549
+ at drive.cyln,dw 0
550
+
551
+ at drive.head,dw 0
552
+
553
+ at drive.sect,dw 2
554
+
555
+ iend
556
+
557
+
558
+
559
+ .DRIVE: dw 0
560
+
561
+ .s0 db "Booting...",0
562
+
563
+ .s1 db "Error!...",0
564
+
565
+
566
+
567
+ ;/_/_/_/_/_/_/_/
568
+
569
+ ;モジュール
570
+
571
+ ;/_/_/_/_/_/_/_/
572
+
573
+
574
+
575
+ %include "../modules/real/puts.s"
576
+
577
+ %include "../modules/real/read_chs.s"
578
+
579
+ %include "../modules/real/kbc.s"
580
+
581
+ %include "../modules/real/get_font_adr.s"
582
+
583
+
584
+
585
+ ;/_/_/_/_/_/_/_/
586
+
587
+ ;ブートシグネチャ
588
+
589
+ ;/_/_/_/_/_/_/_/
590
+
591
+
592
+
593
+ times 510 - ($ - $$) db 0x00 ;余っている510バイトまで0で埋める。
594
+
595
+ db 0x55,0xAA
596
+
597
+
598
+
599
+ ;/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
600
+
601
+ ;
602
+
603
+ ;/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
604
+
605
+ ;
606
+
607
+ ;/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
608
+
609
+ ;
610
+
611
+ ;/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
612
+
613
+ ;
614
+
615
+ ;/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
616
+
617
+ ;
618
+
619
+ ;/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
620
+
621
+ ;
622
+
623
+ ;/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
624
+
625
+
626
+
627
+
628
+
629
+
630
+
631
+ ;/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
632
+
633
+ ;カーネルローダー 第二ブートローダー。
634
+
635
+ ;/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
636
+
637
+
638
+
639
+ stage_2:
640
+
641
+
642
+
643
+ ;/_/_/_/_/_/_/
644
+
645
+ ;フォントアドレス取得
646
+
647
+ ;/_/_/_/_/_/_/
648
+
649
+
650
+
651
+ push FONT
652
+
653
+ call get_font_adr
654
+
655
+ add sp,2
656
+
657
+
658
+
659
+ ;/_/_/_/_/_/_/
660
+
661
+ ;A20 有効化処理 https://www.hazymoon.jp/OpenBSD/annex/keyboard.html
662
+
663
+ ;/_/_/_/_/_/_/
664
+
665
+
666
+
667
+ cli ;割り込み禁止
668
+
669
+
670
+
671
+ ;/_/_/_/_/_/_/
672
+
673
+ ;キーボード無効化
674
+
675
+ ;/_/_/_/_/_/_/
676
+
677
+
678
+
679
+ push 0xAD
680
+
681
+ call KBC_Cmd_Write
682
+
683
+ add sp,2
684
+
685
+
686
+
687
+ ;/_/_/_/_/_/_/
688
+
689
+ ;input port 呼び出し コマンド
690
+
691
+ ;/_/_/_/_/_/_/
692
+
693
+
694
+
695
+ push 0xD0
696
+
697
+ call KBC_Cmd_Write
698
+
699
+ add sp,2
700
+
701
+
702
+
703
+ ;/_/_/_/_/_/_/
704
+
705
+ ; .keyに0x0D 呼び出し結果を書き込む
706
+
707
+ ;/_/_/_/_/_/_/
708
+
709
+
710
+
711
+ push .key
712
+
713
+ call KBC_Data_Read
714
+
715
+ add sp,2
716
+
717
+
718
+
719
+ mov bl,[.key] ;0x0D input port 8bit blはbxの下位バイト
720
+
721
+ or bl,0x02 ;2bit目のゲートA20信号線のビットを立てる。
722
+
723
+
724
+
725
+ ;/_/_/_/_/_/_/
726
+
727
+ ;port 0x60へ書き込んだ値が output port へ出力される。
728
+
729
+ ;/_/_/_/_/_/_/
730
+
731
+
732
+
733
+ push 0xD1
734
+
735
+ call KBC_Cmd_Write
736
+
737
+ add sp,2
738
+
739
+
740
+
741
+ ;/_/_/_/_/_/_/
742
+
743
+ ;ビットを立てた output data を読み込ませる。
744
+
745
+ ;/_/_/_/_/_/_/
746
+
747
+
748
+
749
+ push bx
750
+
751
+ call KBC_Data_Write
752
+
753
+ add sp,2
754
+
755
+
756
+
757
+ ;/_/_/_/_/_/_/
758
+
759
+ ;キーボード有効化
760
+
761
+ ;/_/_/_/_/_/_/
762
+
763
+
764
+
765
+ push 0xAE
766
+
767
+ call KBC_Cmd_Write
768
+
769
+ add sp,2
770
+
771
+
772
+
773
+ ;/_/_/_/_/_/_/
774
+
775
+ ;A20_Gate_Enabled... を表示
776
+
777
+ ;/_/_/_/_/_/_/
778
+
779
+
780
+
781
+ push .s1
782
+
783
+ call puts
784
+
785
+ add sp,20
786
+
787
+ sti
788
+
789
+
790
+
791
+ jmp stage_6
792
+
793
+
794
+
795
+ ;/_/_/_/_/_/_/
796
+
797
+ ;データ
798
+
799
+ ;/_/_/_/_/_/_/
800
+
801
+
802
+
803
+ ALIGN 2,db 0
804
+
805
+
806
+
807
+ .key: dw 0
808
+
809
+ .s1 db "A20_Gate_Enabled...",0
810
+
811
+
812
+
813
+ FONT:
814
+
815
+ .seg: dw 0
816
+
817
+ .off: dw 0
818
+
819
+
820
+
821
+ stage_6:
822
+
823
+
824
+
825
+ ;/_/_/_/_/_/_/
826
+
827
+ ;ビデオモード変更
828
+
829
+ ;/_/_/_/_/_/_/
830
+
831
+
832
+
833
+ push stage_6.s0
834
+
835
+ call puts
836
+
837
+ add sp,13
838
+
839
+
840
+
841
+ .10L:
842
+
843
+ mov ah,0x00
844
+
845
+ int 0x16
846
+
847
+
848
+
849
+ cmp al,' '
850
+
851
+ jne .10L
852
+
853
+
854
+
855
+ mov ax,0x0012
856
+
857
+ int 0x10
858
+
859
+
860
+
861
+ jmp stage_7
862
+
863
+
864
+
865
+
866
+
867
+ .s0 db "6th_stage...",0
868
+
869
+
870
+
871
+ ;/_/_/_/_/_/_/
872
+
873
+ ;GDT IDT セレクタ 初期化設定定義
874
+
875
+ ;/_/_/_/_/_/_/
876
+
877
+
878
+
879
+ ALIGN 4,db 0
880
+
881
+
882
+
883
+ ;GDT
884
+
885
+
886
+
887
+ GDT:
888
+
889
+ dq 0x00_0_0_0_0_000000_0000 ;NULLディスクリプタ―
890
+
891
+ .cs: dq 0x00_C_F_9_A_000000_FFFF ;コードディスクリプター
892
+
893
+ .ds: dq 0x00_C_F_9_2_000000_FFFF ;データディスクリプタ―
894
+
895
+ .gdt_end:
896
+
897
+
898
+
899
+ SEL_CODE equ GDT.cs-GDT
900
+
901
+ SEL_DATA equ GDT.ds-GDT
902
+
903
+
904
+
905
+ IDT:
906
+
907
+
908
+
909
+ .idt_end:
910
+
911
+
912
+
913
+
914
+
915
+ ;GDTR
916
+
917
+
918
+
919
+ GDTR:
920
+
921
+ dw GDT.gdt_end - GDT - 1
922
+
923
+ dd GDT ;GDTベースアドレス
924
+
925
+
926
+
927
+ ;IDT
928
+
929
+
930
+
931
+ IDTR:
932
+
933
+ dw IDT.idt_end - IDT - 1
934
+
935
+ dd IDT ;IDTベースアドレス
936
+
937
+
938
+
939
+ stage_7:
940
+
941
+
942
+
943
+ ;/_/_/_/_/_/_/
944
+
945
+ ;プロテクトモード移行
946
+
947
+ ;/_/_/_/_/_/_/
948
+
949
+
950
+
951
+ cli ;割り込み禁止
952
+
953
+
954
+
955
+ lgdt [GDTR]
956
+
957
+
958
+
959
+ lidt [IDTR]
960
+
961
+
962
+
963
+ mov eax,cr0
964
+
965
+ or eax,1
966
+
967
+ mov cr0,eax
968
+
969
+ jmp $ + 2
970
+
971
+
972
+
973
+ [BITS 32]
974
+
975
+ db 0x66
976
+
977
+ jmp SEL_CODE:CODE_32
978
+
979
+
980
+
981
+ CODE_32:
982
+
983
+
984
+
985
+ mov ax,SEL_DATA
986
+
987
+ mov ds,ax
988
+
989
+ mov es,ax
990
+
991
+ mov fs,ax
992
+
993
+ mov gs,ax
994
+
995
+ mov ss,ax
996
+
997
+
998
+
999
+
1000
+
1001
+
1002
+
1003
+ ;/_/_/_/_/_/_/_/_/_/_/_/
1004
+
1005
+ ;
1006
+
1007
+ ;
1008
+
1009
+ ;以下、本来カーネルに書く内容
1010
+
1011
+ ;後でコピペしなければいけない。
1012
+
1013
+ ;
1014
+
1015
+ ;/_/_/_/_/_/_/_/_/_/_/_/
1016
+
1017
+
1018
+
1019
+ mov esi,'a'
1020
+
1021
+ shl esi,4
1022
+
1023
+ add esi,[FONT]
1024
+
1025
+
1026
+
1027
+ mov edi,0xA_0000
1028
+
1029
+
1030
+
1031
+ mov ecx,16
1032
+
1033
+
1034
+
1035
+ .10L:
1036
+
1037
+
1038
+
1039
+ movsb
1040
+
1041
+ add edi,80 - 1
1042
+
1043
+
1044
+
1045
+ loop .10L
1046
+
1047
+
1048
+
1049
+ jmp $
1050
+
1051
+
1052
+
1053
+ times BOOT_SIZE - ($ - $$) db 0
1054
+
1055
+
1056
+
1057
+ ```