Top Banner
TRDOS 386 Kernel v2.0.1 - 03/02/2018 TRDOS386.ASM (TRDOS 386 Kernel) - v2.0.1 1 ; **************************************************************************** 2 ; TRDOS386.ASM (TRDOS 386 Kernel) - v2.0.1 3 ; ---------------------------------------------------------------------------- 4 ; Last Update: 03/02/2018 5 ; ---------------------------------------------------------------------------- 6 ; Beginning: 04/01/2016 7 ; ---------------------------------------------------------------------------- 8 ; Assembler: NASM version 2.11 (trdos386.s) 9 ; ---------------------------------------------------------------------------- 10 ; Turkish Rational DOS 11 ; Operating System Project v2.0 by ERDOGAN TAN (Beginning: 04/01/2016) 12 ; 13 ; Derived from 'Retro UNIX 386 Kernel - v0.2.1.0' source code by Erdogan Tan 14 ; unix386.s (03/01/2016) 15 ; 16 ; Derived from TRDOS Operating System v1.0 (8086) source code by Erdogan Tan 17 ; TRDOS2.ASM (09/11/2011) 18 ; 19 ; Derived from 'IBM PC-XT-286' BIOS source code (1986) 20 ; **************************************************************************** 21 ; nasm trdos386.s -l trdos386.txt -o TRDOS386.SYS 22 23 24 KLOAD equ 10000h ; Kernel loading address 25 ; NOTE: Retro UNIX 8086 v1 /boot code loads kernel at 1000h:0000h 26 KCODE equ 08h ; Code segment descriptor (ring 0) 27 KDATA equ 10h ; Data segment descriptor (ring 0) 28 ; 19/03/2015 29 UCODE equ 1Bh ; 18h + 3h (ring 3) 30 UDATA equ 23h ; 20h + 3h (ring 3) 31 ; 24/03/2015 32 TSS equ 28h ; Task state segment descriptor (ring 0) 33 ; 19/03/2015 34 CORE equ 400000h ; Start of USER's virtual/linear address space 35 ; (at the end of the 1st 4MB) 36 ECORE equ 0FFC00000h ; End of USER's virtual address space (4GB - 4MB) 37 ; ULIMIT = (ECORE/4096) - 1 = 0FFBFFh (in GDT) 38 39 ;; 27/12/2013 40 ;KEND equ KLOAD + 65536 ; (28/12/2013) (end of kernel space) 41 ; 04/07/2016 42 KEND equ KERNELFSIZE + KLOAD 43 44 45 ; IBM PC/AT BIOS ----- 10/06/85 (postequ.inc) 46 ;--------- CMOS TABLE LOCATION ADDRESS'S ------------------------------------- 47 CMOS_SECONDS EQU 00H ; SECONDS (BCD) 48 CMOS_SEC_ALARM EQU 01H ; SECONDS ALARM (BCD) 49 CMOS_MINUTES EQU 02H ; MINUTES (BCD) 50 CMOS_MIN_ALARM EQU 03H ; MINUTES ALARM (BCD) 51 CMOS_HOURS EQU 04H ; HOURS (BCD 52 CMOS_HR_ALARM EQU 005H ; HOURS ALARM (BCD) 53 CMOS_DAY_WEEK EQU 06H ; DAY OF THE WEEK (BCD) 54 CMOS_DAY_MONTH EQU 07H ; DAY OF THE MONTH (BCD) 55 CMOS_MONTH EQU 08H ; MONTH (BCD) 56 CMOS_YEAR EQU 09H ; YEAR (TWO DIGITS) (BCD) 57 CMOS_CENTURY EQU 32H ; DATE CENTURY BYTE (BCD) 58 CMOS_REG_A EQU 0AH ; STATUS REGISTER A 59 CMOS_REG_B EQU 00BH ; STATUS REGISTER B ALARM 60 CMOS_REG_C EQU 00CH ; STATUS REGISTER C FLAGS 61 CMOS_REG_D EQU 0DH ; STATUS REGISTER D BATTERY 62 CMOS_SHUT_DOWN EQU 0FH ; SHUTDOWN STATUS COMMAND BYTE 63 ;---------------------------------------- 64 ; CMOS EQUATES FOR THIS SYSTEM ; 65 ;----------------------------------------------------------------------------- 66 CMOS_PORT EQU 070H ; I/O ADDRESS OF CMOS ADDRESS PORT 67 CMOS_DATA EQU 071H ; I/O ADDRESS OF CMOS DATA PORT 68 NMI EQU 10000000B ; DISABLE NMI INTERRUPTS MASK - 69 ; HIGH BIT OF CMOS LOCATION ADDRESS 70 71 ; Memory Allocation Table Address 72 ; 05/11/2014 73 ; 31/10/2014 74 MEM_ALLOC_TBL equ 100000h ; Memory Allocation Table at the end of 75 ; the 1st 1 MB memory space. 76 ; (This address must be aligned 77 ; on 128 KB boundary, if it will be 78 ; changed later.) 79 ; ((lower 17 bits of 32 bit M.A.T. 80 ; address must be ZERO)). 81 ; ((((Reason: 32 bit allocation 82 ; instructions, dword steps))) 83 ; (((byte >> 12 --> page >> 5))) 84 ;04/11/2014 85 PDE_A_PRESENT equ 1 ; Present flag for PDE 86 PDE_A_WRITE equ 2 ; Writable (write permission) flag 1
647

  · Web view2018. 4. 28. · TRDOS386.ASM (TRDOS 386 Kernel) - v2.0.1. 1 ; **************************************************************************** 2 ; TRDOS386.ASM (TRDOS 386

Feb 04, 2021

Download

Documents

dariahiddleston
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript

TRDOS 386 Kernel v2.0.1 - 03/02/2018

535

TRDOS386.ASM (TRDOS 386 Kernel) - v2.0.1

1 ; ****************************************************************************

2 ; TRDOS386.ASM (TRDOS 386 Kernel) - v2.0.1

3 ; ----------------------------------------------------------------------------

4 ; Last Update: 03/02/2018

5 ; ----------------------------------------------------------------------------

6 ; Beginning: 04/01/2016

7 ; ----------------------------------------------------------------------------

8 ; Assembler: NASM version 2.11 (trdos386.s)

9 ; ----------------------------------------------------------------------------

10 ; Turkish Rational DOS

11 ; Operating System Project v2.0 by ERDOGAN TAN (Beginning: 04/01/2016)

12 ;

13 ; Derived from 'Retro UNIX 386 Kernel - v0.2.1.0' source code by Erdogan Tan

14 ; unix386.s (03/01/2016)

15 ;

16 ; Derived from TRDOS Operating System v1.0 (8086) source code by Erdogan Tan

17 ; TRDOS2.ASM (09/11/2011)

18 ;

19 ; Derived from 'IBM PC-XT-286' BIOS source code (1986)

20 ; ****************************************************************************

21 ; nasm trdos386.s -l trdos386.txt -o TRDOS386.SYS

22

23

24 KLOADequ 10000h ; Kernel loading address

25 ; NOTE: Retro UNIX 8086 v1 /boot code loads kernel at 1000h:0000h

26 KCODEequ 08h; Code segment descriptor (ring 0)

27 KDATAequ 10h; Data segment descriptor (ring 0)

28 ; 19/03/2015

29 UCODEequ 1Bh ; 18h + 3h (ring 3)

30 UDATAequ 23h ; 20h + 3h (ring 3)

31 ; 24/03/2015

32 TSSequ 28h; Task state segment descriptor (ring 0)

33 ; 19/03/2015

34 COREequ 400000h ; Start of USER's virtual/linear address space

35 ; (at the end of the 1st 4MB)

36 ECOREequ 0FFC00000h ; End of USER's virtual address space (4GB - 4MB)

37 ; ULIMIT = (ECORE/4096) - 1 = 0FFBFFh (in GDT)

38

39 ;; 27/12/2013

40 ;KEND equ KLOAD + 65536 ; (28/12/2013) (end of kernel space)

41 ; 04/07/2016

42 KEND equ KERNELFSIZE + KLOAD

43

44

45 ; IBM PC/AT BIOS ----- 10/06/85 (postequ.inc)

46 ;--------- CMOS TABLE LOCATION ADDRESS'S -------------------------------------

47 CMOS_SECONDSEQU00H; SECONDS (BCD)

48 CMOS_SEC_ALARMEQU01H; SECONDS ALARM (BCD)

49 CMOS_MINUTESEQU02H; MINUTES (BCD)

50 CMOS_MIN_ALARMEQU03H; MINUTES ALARM (BCD)

51 CMOS_HOURSEQU04H; HOURS (BCD

52 CMOS_HR_ALARMEQU005H; HOURS ALARM (BCD)

53 CMOS_DAY_WEEKEQU06H; DAY OF THE WEEK (BCD)

54 CMOS_DAY_MONTHEQU07H; DAY OF THE MONTH (BCD)

55 CMOS_MONTHEQU08H; MONTH (BCD)

56 CMOS_YEAREQU09H; YEAR (TWO DIGITS) (BCD)

57 CMOS_CENTURYEQU32H; DATE CENTURY BYTE (BCD)

58 CMOS_REG_AEQU0AH; STATUS REGISTER A

59 CMOS_REG_BEQU00BH; STATUS REGISTER B ALARM

60 CMOS_REG_CEQU00CH; STATUS REGISTER C FLAGS

61 CMOS_REG_DEQU0DH; STATUS REGISTER D BATTERY

62 CMOS_SHUT_DOWNEQU0FH; SHUTDOWN STATUS COMMAND BYTE

63 ;----------------------------------------

64 ;CMOS EQUATES FOR THIS SYSTEM;

65 ;-----------------------------------------------------------------------------

66 CMOS_PORTEQU070H; I/O ADDRESS OF CMOS ADDRESS PORT

67 CMOS_DATAEQU071H; I/O ADDRESS OF CMOS DATA PORT

68 NMIEQU10000000B; DISABLE NMI INTERRUPTS MASK -

69 ; HIGH BIT OF CMOS LOCATION ADDRESS

70

71 ; Memory Allocation Table Address

72 ; 05/11/2014

73 ; 31/10/2014

74 MEM_ALLOC_TBLequ100000h; Memory Allocation Table at the end of

75 ; the 1st 1 MB memory space.

76 ; (This address must be aligned

77 ; on 128 KB boundary, if it will be

78 ; changed later.)

79 ; ((lower 17 bits of 32 bit M.A.T.

80 ; address must be ZERO)).

81 ; ((((Reason: 32 bit allocation

82 ; instructions, dword steps)))

83 ; (((byte >> 12 --> page >> 5)))

84 ;04/11/2014

85 PDE_A_PRESENTequ1; Present flag for PDE

86 PDE_A_WRITEequ 2; Writable (write permission) flag

87 PDE_A_USERequ4; User (non-system/kernel) page flag

88 ;

89 PTE_A_PRESENTequ1; Present flag for PTE (bit 0)

90 PTE_A_WRITEequ 2; Writable (write permission) flag (bit 1)

91 PTE_A_USERequ4; User (non-system/kernel) page flag (bit 2)

92 PTE_A_ACCESS equ32; Accessed flag (bit 5) ; 09/03/2015

93

94 ; 17/02/2015 (unix386.s)

95 ; 10/12/2014 - 30/12/2014 (0B000h -> 9000h) (dsectrm2.s)

96 DPT_SEGM equ 09000h ; FDPT segment (EDD v1.1, EDD v3)

97 ;

98 HD0_DPT equ 0 ; Disk parameter table address for hd0

99 HD1_DPT equ 32 ; Disk parameter table address for hd1

100 HD2_DPT equ 64 ; Disk parameter table address for hd2

101 HD3_DPT equ 96 ; Disk parameter table address for hd3

102

103

104 ; FDPT (Phoenix, Enhanced Disk Drive Specification v1.1, v3.0)

105 ; (HDPT: Programmer's Guide to the AMIBIOS, 1993)

106 ;

107 FDPT_CYLSequ 0 ; 1 word, number of cylinders

108 FDPT_HDSequ 2 ; 1 byte, number of heads

109 FDPT_TTequ 3 ; 1 byte, A0h = translated FDPT with logical values

110 ; otherwise it is standard FDPT with physical values

111 FDPT_PCMPequ 5 ; 1 word, starting write precompensation cylinder

112 ; (obsolete for IDE/ATA drives)

113 FDPT_CBequ 8 ; 1 byte, drive control byte

114 ; Bits 7-6 : Enable or disable retries (00h = enable)

115 ; Bit 5: 1 = Defect map is located at last cyl. + 1

116 ; Bit 4 : Reserved. Always 0

117 ; Bit 3 : Set to 1 if more than 8 heads

118 ; Bit 2-0 : Reserved. Alsways 0

119 FDPT_LZequ 12 ; 1 word, landing zone (obsolete for IDE/ATA drives)

120 FDPT_SPTequ 14 ; 1 byte, sectors per track

121

122 ; Floppy Drive Parameters Table (Programmer's Guide to the AMIBIOS, 1993)

123 ; (11 bytes long) will be used by diskette handler/bios

124 ; which is derived from IBM PC-AT BIOS (DISKETTE.ASM, 21/04/1986).

125

126 ; 01/02/2016

127 Logical_DOSDisks equ 90000h + 100h ; 26*256 = 6656 bytes

128 Directory_Buffer equ 80000h ; max = 64K Bytes

129 FAT_Buffer equ 91C00h ; 1536 bytes (3 sectors)

130 ; 15/02/2016

131 Cluster_Buffer equ 70000h ; max = 64K Bytes ; buffer for file read & write

132 ; 11/04/2016

133 Env_Page: equ 93000h ; 512 bytes (4096 bytes)

134 Env_Page_Size equ 512 ; (4096 bytes)

135 ; 30/07/2016

136 Video_Pg_Backup equ 98000h ; Mode 3h, video page backup (32K, 8 pages)

137

138 [BITS 16] ; We need 16-bit intructions for Real mode

139

140 [ORG 0]

141 ; 12/11/2014

142 ; Save boot drive number (that is default root drive)

143 00000000 8816[F25C] mov[boot_drv], dl ; physical drv number

144

145 ; Determine installed memory

146 ; 31/10/2014

147 ;

148 00000004 B801E8 movax, 0E801h ; Get memory size

149 00000007 CD15 int15h ; for large configurations

150 00000009 7308 jncshort chk_ms

151 0000000B B488 movah, 88h ; Get extended memory size

152 0000000D CD15 int15h

153 ;

154 ;moval, 17h; Extended memory (1K blocks) low byte

155 ;out70h, al ; select CMOS register

156 ;inal, 71h ; read data (1 byte)

157 ;movcl, al

158 ;moval, 18h ; Extended memory (1K blocks) high byte

159 ;out70h, al ; select CMOS register

160 ;inal, 71h ; read data (1 byte)

161 ;movch, al

162 ;

163 0000000F 89C1 movcx, ax

164 00000011 31D2 xordx, dx

165 chk_ms:

166 00000013 890E[EE5C] mov[mem_1m_1k], cx

167 00000017 8916[F05C] mov[mem_16m_64k], dx

168 ; 05/11/2014

169 ;anddx, dx

170 ;jzshort L2

171 0000001B 81F90004 cmp cx, 1024

172 0000001F 7351 jnbshort L0

173 ; insufficient memory_error

174 ; Minimum 2 MB memory is needed...

175 ; 05/11/2014

176 ; (real mode error printing)

177 00000021 FB sti

178 00000022 BE[3600] movsi, msg_out_of_memory

179 00000025 BB0700 movbx, 7

180 00000028 B40E movah, 0Eh; write tty

181 oom_1:

182 0000002A AC lodsb

183 0000002B 08C0 oral, al

184 0000002D 7404 jzshort oom_2

185 0000002F CD10 int10h

186 00000031 EBF7 jmpshort oom_1

187 oom_2:

188 00000033 F4 hlt

189 00000034 EBFD jmpshort oom_2

190

191 ; 20/02/2017

192 ; 05/11/2014

193 msg_out_of_memory:

194 00000036 070D0A db 07h, 0Dh, 0Ah

195 00000039 496E73756666696369- db 'Insufficient memory !'

195 00000042 656E74206D656D6F72-

195 0000004B 792021

196 0000004E 0D0A db0Dh, 0Ah

197 _int13h_48h_buffer: ; 07/07/2016

198 00000050 284D696E696D756D20- db'(Minimum 2MB memory is needed.)'

198 00000059 324D42206D656D6F72-

198 00000062 79206973206E656564-

198 0000006B 65642E29

199 0000006F 0D0A00 db0Dh, 0Ah, 0

200 ;

201

202 L0:

203 %include 'diskinit.s' ; 07/03/2015

1 <1> ; ****************************************************************************

2 <1> ; TRDOS386.ASM (TRDOS 386 Kernel) - v2.0.0 - diskinit.s

3 <1> ; ----------------------------------------------------------------------------

4 <1> ; Last Update: 09/07/2016

5 <1> ; ----------------------------------------------------------------------------

6 <1> ; Beginning: 24/01/2016

7 <1> ; ----------------------------------------------------------------------------

8 <1> ; Assembler: NASM version 2.11 (trdos386.s)

9 <1> ; ----------------------------------------------------------------------------

10 <1> ; Turkish Rational DOS

11 <1> ; Operating System Project v2.0 by ERDOGAN TAN (Beginning: 04/01/2016)

12 <1> ;

13 <1> ; Derived from 'Retro UNIX 386 Kernel - v0.2.1.0' source code by Erdogan Tan

14 <1> ; diskinit.inc (10/07/2015)

15 <1> ;

16 <1> ; Derived from 'IBM PC-XT-286' BIOS source code (1986)

17 <1> ; ****************************************************************************

18 <1>

19 <1> ; Retro UNIX 386 v1 Kernel - DISKINIT.INC

20 <1> ; Last Modification: 10/07/2015

21 <1>

22 <1> ; DISK I/O SYSTEM INITIALIZATION - Erdogan Tan (Retro UNIX 386 v1 project)

23 <1>

24 <1> ; ///////// DISK I/O SYSTEM STRUCTURE INITIALIZATION ///////////////

25 <1>

26 <1> ; 10/12/2014 - 02/02/2015 - dsectrm2.s

27 <1> ;L0:

28 <1> ; 12/11/2014 (Retro UNIX 386 v1 - beginning)

29 <1> ; Detecting disk drives... (by help of ROM-BIOS)

30 00000072 BA7F00 <1> movdx, 7Fh

31 <1> L1:

32 00000075 FEC2 <1> incdl

33 00000077 B441 <1> movah, 41h ; Check extensions present

34 <1> ; Phoenix EDD v1.1 - EDD v3

35 00000079 BBAA55 <1> movbx, 55AAh

36 0000007C CD13 <1> int 13h

37 0000007E 721A <1> jcshort L2

38 <1>

39 00000080 81FB55AA <1> cmpbx, 0AA55h

40 00000084 7514 <1> jneshort L2

41 00000086 FE06[F55C] <1> incbyte [hdc]; count of hard disks (EDD present)

42 0000008A 8816[F45C] <1> mov [last_drv], dl ; last hard disk number

43 0000008E BB[785C] <1> movbx, hd0_type - 80h

44 00000091 01D3 <1> addbx, dx

45 00000093 880F <1> mov[bx], cl ; Interface support bit map in CX

46 <1> ; Bit 0 - 1, Fixed disk access subset ready

47 <1> ; Bit 1 - 1, Drv locking and ejecting ready

48 <1> ; Bit 2 - 1, Enhanced Disk Drive Support

49 <1> ; (EDD) ready (DPTE ready)

50 <1> ; Bit 3 - 1, 64bit extensions are present

51 <1> ; (EDD-3)

52 <1> ; Bit 4 to 15 - 0, Reserved

53 00000095 80FA83 <1> cmpdl, 83h ; drive number < 83h

54 00000098 72DB <1> jbshort L1

55 <1> L2:

56 <1> ; 23/11/2014

57 <1> ; 19/11/2014

58 0000009A 30D2 <1> xordl, dl ; 0

59 <1> ; 04/02/2016 (esi -> si)

60 0000009C BE[F65C] <1> movsi, fd0_type

61 <1> L3:

62 <1> ; 14/01/2015

63 0000009F 8816[F35C] <1> mov[drv], dl

64 <1> ;

65 000000A3 B408 <1> mov ah, 08h ; Return drive parameters

66 000000A5 CD13 <1> int13h

67 000000A7 7210 <1> jcshort L4

68 <1> ; BL = drive type (for floppy drives)

69 <1> ; DL = number of floppy drives

70 <1> ;

71 <1> ; ES:DI = Address of DPT from BIOS

72 <1> ;

73 000000A9 881C <1> mov[si], bl ; Drive type

74 <1> ; 4 = 1.44 MB, 80 track, 3 1/2"

75 <1> ; 14/01/2015

76 000000AB E8BC01 <1> callset_disk_parms

77 <1> ; 10/12/2014

78 000000AE 81FE[F65C] <1> cmpsi, fd0_type

79 000000B2 7705 <1> jashort L4

80 000000B4 46 <1> incsi ; fd1_type

81 000000B5 B201 <1> movdl, 1

82 000000B7 EBE6 <1> jmpshort L3

83 <1> L4:

84 <1> ; Older BIOS (INT 13h, AH = 48h is not available)

85 000000B9 B27F <1> movdl, 7Fh

86 <1> ; 24/12/2014 (Temporary)

87 000000BB 803E[F55C]00 <1> cmpbyte [hdc], 0 ; EDD present or not ?

88 000000C0 0F879000 <1> ja L10 ; yes, all fixed disk operations

89 <1> ; will be performed according to

90 <1> ; present EDD specification

91 <1> L6:

92 000000C4 FEC2 <1> inc dl

93 000000C6 8816[F35C] <1> mov [drv], dl

94 000000CA 8816[F45C] <1> mov [last_drv], dl ; 14/01/2015

95 000000CE B408 <1> mov ah, 08h ; Return drive parameters

96 000000D0 CD13 <1> int13h; (conventional function)

97 000000D2 0F828601 <1> jc L13; fixed disk drive not ready

98 000000D6 8816[F55C] <1> mov [hdc], dl ; number of drives

99 <1> ;; 14/01/2013

100 <1> ;;pushcx

101 000000DA E88D01 <1> callset_disk_parms

102 <1> ;;popcx

103 <1> ;

104 <1> ;;andcl, 3Fh ; sectors per track (bits 0-6)

105 000000DD 8A16[F35C] <1> mov dl, [drv]

106 000000E1 BB0401 <1> movbx, 65*4 ; hd0 parameters table (INT 41h)

107 000000E4 80FA80 <1> cmpdl, 80h

108 000000E7 7603 <1> jnashort L7

109 000000E9 83C314 <1> addbx, 5*4 ; hd1 parameters table (INT 46h)

110 <1> L7:

111 000000EC 31C0 <1> xorax, ax

112 000000EE 8ED8 <1> movds, ax

113 000000F0 8B37 <1> mov si, [bx]

114 000000F2 8B4702 <1> mov ax, [bx+2]

115 000000F5 8ED8 <1> movds, ax

116 000000F7 3A4C0E <1> cmp cl, [si+FDPT_SPT] ; sectors per track

117 000000FA 0F855A01 <1> jne L12 ; invalid FDPT

118 000000FE BF0000 <1> movdi, HD0_DPT

119 00000101 80FA80 <1> cmpdl, 80h

120 00000104 7603 <1> jnashort L8

121 00000106 BF2000 <1> movdi, HD1_DPT

122 <1> L8:

123 <1> ; 30/12/2014

124 00000109 B80090 <1> movax, DPT_SEGM

125 0000010C 8EC0 <1> moves, ax

126 <1> ; 24/12/2014

127 0000010E B90800 <1> movcx, 8

128 00000111 F3A5 <1> repmovsw ; copy 16 bytes to the kernel's DPT location

129 00000113 8CC8 <1> movax, cs

130 00000115 8ED8 <1> movds, ax

131 <1> ; 02/02/2015

132 00000117 8A0E[F35C] <1> mov cl, [drv]

133 0000011B 88CB <1> movbl, cl

134 0000011D B8F001 <1> movax, 1F0h

135 00000120 80E301 <1> andbl, 1

136 00000123 7406 <1> jzshort L9

137 00000125 C0E304 <1> shlbl, 4

138 00000128 2D8000 <1> subax, 1F0h-170h

139 <1> L9:

140 0000012B AB <1> stosw; I/O PORT Base Address (1F0h, 170h)

141 0000012C 050602 <1> addax, 206h

142 0000012F AB <1> stosw; CONTROL PORT Address (3F6h, 376h)

143 00000130 88D8 <1> moval, bl

144 00000132 04A0 <1> addal, 0A0h

145 00000134 AA <1> stosb; Device/Head Register upper nibble

146 <1> ;

147 00000135 FE06[F35C] <1> incbyte [drv]

148 00000139 BB[785C] <1> movbx, hd0_type - 80h

149 0000013C 01CB <1> addbx, cx

150 0000013E 800F80 <1> or byte [bx], 80h ; present sign (when lower nibble is 0)

151 00000141 A0[F55C] <1> moval, [hdc]

152 00000144 FEC8 <1> decal

153 00000146 0F841201 <1> jz L13

154 0000014A 80FA80 <1> cmpdl, 80h

155 0000014D 0F8673FF <1> jna L6

156 00000151 E90801 <1> jmp L13

157 <1> L10:

158 00000154 FEC2 <1> inc dl

159 <1> ; 25/12/2014

160 00000156 8816[F35C] <1> mov[drv], dl

161 0000015A B408 <1> mov ah, 08h ; Return drive parameters

162 0000015C CD13 <1> int13h; (conventional function)

163 0000015E 0F82FA00 <1> jc L13

164 <1> ; 14/01/2015

165 00000162 8A16[F35C] <1> movdl, [drv]

166 00000166 52 <1> pushdx

167 00000167 51 <1> pushcx

168 00000168 E8FF00 <1> callset_disk_parms

169 0000016B 59 <1> popcx

170 0000016C 5A <1> popdx

171 <1> ; 06/07/2016 (BugFix for >64K kernel files)

172 <1> ; 04/02/2016 (esi -> si)

173 <1> ;movsi, _end ; 30 byte temporary buffer address

174 <1> ; ; at the '_end' of kernel.

175 <1> ;movword [si], 30

176 <1> ; 06/07/2016

177 0000016D BE[5000] <1> movsi, _int13h_48h_buffer

178 <1> ; 09/07/2016

179 00000170 B81E00 <1> movax, 001Eh

180 00000173 8824 <1> mov[si], ah ; 0

181 00000175 46 <1> incsi

182 00000176 8904 <1> movword [si], ax

183 <1> ; word [si] = 30

184 <1> ;

185 00000178 B448 <1> movah, 48h ; Get drive parameters (EDD function)

186 0000017A CD13 <1> int13h

187 0000017C 0F82DC00 <1> jc L13

188 <1> ; 04/02/2016 (ebx -> bx)

189 <1> ; 14/01/2015

190 00000180 28FF <1> subbh, bh

191 00000182 88D3 <1> movbl, dl

192 00000184 80EB80 <1> subbl, 80h

193 00000187 81C3[F85C] <1> addbx, hd0_type

194 0000018B 8A07 <1> mov al, [bx]

195 0000018D 0C80 <1> oral, 80h

196 0000018F 8807 <1> mov [bx], al

197 00000191 81EB[F65C] <1> subbx, hd0_type - 2 ; 15/01/2015

198 00000195 81C3[425D] <1> addbx, drv.status

199 00000199 8807 <1> mov[bx], al

200 <1> ; 04/02/2016 (eax -> ax)

201 0000019B 8B4410 <1> movax, [si+16]

202 0000019E 854412 <1> testax, [si+18]

203 000001A1 7412 <1> jzshort L10_A0h

204 <1> ; 'CHS only' disks on EDD system

205 <1> ; are reported with ZERO disk size

206 000001A3 81EB[425D] <1> subbx, drv.status

207 000001A7 C1E302 <1> shlbx, 2

208 000001AA 81C3[265D] <1> addbx, drv.size ; disk size (in sectors)

209 000001AE 8907 <1> mov[bx], ax

210 000001B0 8B4412 <1> movax, [si+18]

211 000001B3 8907 <1> mov[bx], ax

212 <1>

213 <1> L10_A0h: ; Jump here to fix a ZERO (LBA) disk size problem

214 <1> ; for CHS disks (28/02/2015)

215 <1> ; 30/12/2014

216 000001B5 BF0000 <1> movdi, HD0_DPT

217 000001B8 88D0 <1> moval, dl

218 000001BA 83E003 <1> and ax, 3

219 000001BD C0E005 <1> shlal, 5 ; *32

220 000001C0 01C7 <1> add di, ax

221 000001C2 B80090 <1> movax, DPT_SEGM

222 000001C5 8EC0 <1> moves, ax

223 <1> ;

224 000001C7 88E8 <1> moval, ch; max. cylinder number (bits 0-7)

225 000001C9 88CC <1> movah, cl

226 000001CB C0EC06 <1> shrah, 6; max. cylinder number (bits 8-9)

227 000001CE 40 <1> incax; logical cylinders (limit 1024)

228 000001CF AB <1> stosw

229 000001D0 88F0 <1> moval, dh; max. head number

230 000001D2 FEC0 <1> incal

231 000001D4 AA <1> stosb; logical heads (limits 256)

232 000001D5 B0A0 <1> moval, 0A0h ; Indicates translated table

233 000001D7 AA <1> stosb

234 000001D8 8A440C <1> moval, [si+12]

235 000001DB AA <1> stosb ; physical sectors per track

236 000001DC 31C0 <1> xorax, ax

237 <1> ;decax ; 02/01/2015

238 000001DE AB <1> stosw ; precompensation (obsolete)

239 <1> ;xoral, al ; 02/01/2015

240 000001DF AA <1> stosb ; reserved

241 000001E0 B008 <1> moval, 8 ; drive control byte

242 <1> ; (do not disable retries,

243 <1> ; more than 8 heads)

244 000001E2 AA <1> stosb

245 000001E3 8B4404 <1> movax, [si+4]

246 000001E6 AB <1> stosw ; physical number of cylinders

247 <1> ;pushax ; 02/01/2015

248 000001E7 8A4408 <1> moval, [si+8]

249 000001EA AA <1> stosb ; physical num. of heads (limit 16)

250 000001EB 29C0 <1> sub ax, ax

251 <1> ;popax ; 02/01/2015

252 000001ED AB <1> stosw ; landing zone (obsolete)

253 000001EE 88C8 <1> moval, cl ; logical sectors per track (limit 63)

254 000001F0 243F <1> and al, 3Fh

255 000001F2 AA <1> stosb

256 <1> ;subal, al ; checksum

257 <1> ;stosb

258 <1> ;

259 000001F3 83C61A <1> addsi, 26 ; (BIOS) DPTE address pointer

260 000001F6 AD <1> lodsw

261 000001F7 50 <1> pushax ; (BIOS) DPTE offset

262 000001F8 AD <1> lodsw

263 000001F9 50 <1> pushax ; (BIOS) DPTE segment

264 <1> ;

265 <1> ; checksum calculation

266 000001FA 89FE <1> movsi, di

267 000001FC 06 <1> pushes

268 000001FD 1F <1> popds

269 <1> ;movcx, 16

270 000001FE B90F00 <1> mov cx, 15

271 00000201 29CE <1> subsi, cx

272 00000203 30E4 <1> xorah, ah

273 <1> ;delcl

274 <1> L11:

275 00000205 AC <1> lodsb

276 00000206 00C4 <1> addah, al

277 00000208 E2FB <1> loopL11

278 <1> ;

279 0000020A 88E0 <1> moval, ah

280 0000020C F6D8 <1> negal; -x+x = 0

281 0000020E AA <1> stosb; put checksum in byte 15 of the tbl

282 <1> ;

283 0000020F 1F <1> popds; (BIOS) DPTE segment

284 00000210 5E <1> popsi; (BIOS) DPTE offset

285 <1> ;

286 <1> ; 23/02/2015

287 00000211 57 <1> pushdi

288 <1> ; ES:DI points to DPTE (FDPTE) location

289 <1> ;movcx, 8

290 00000212 B108 <1> movcl, 8

291 00000214 F3A5 <1> repmovsw

292 <1> ;

293 <1> ; 23/02/2015

294 <1> ; (P)ATA drive and LBA validation

295 <1> ; (invalidating SATA drives and setting

296 <1> ; CHS type I/O for old type fixed disks)

297 00000216 5B <1> popbx

298 00000217 8CC8 <1> movax, cs

299 00000219 8ED8 <1> movds, ax

300 0000021B 268B07 <1> movax, [es:bx]

301 0000021E 3DF001 <1> cmpax, 1F0h

302 00000221 7418 <1> jeshort L11a

303 00000223 3D7001 <1> cmpax, 170h

304 00000226 7413 <1> jeshort L11a

305 <1> ; invalidation

306 <1> ; (because base port address is not 1F0h or 170h)

307 00000228 30FF <1> xorbh, bh

308 0000022A 88D3 <1> movbl, dl

309 0000022C 80EB80 <1> subbl, 80h

310 0000022F C687[F85C]00 <1> movbyte [bx+hd0_type], 0 ; not a valid disk drive !

311 00000234 808F[445D]F0 <1> or byte [bx+drv.status+2], 0F0h ; (failure sign)

312 00000239 EB14 <1> jmpshort L11b

313 <1> L11a:

314 <1> ; LBA validation

315 0000023B 268A4704 <1> moval, [es:bx+4] ; Head register upper nibble

316 0000023F A840 <1> testal, 40h ; LBA bit (bit 6)

317 00000241 750C <1> jnzshort L11b ; LBA type I/O is OK! (E0h or F0h)

318 <1> ; force CHS type I/O for this drive (A0h or B0h)

319 00000243 28FF <1> subbh, bh

320 00000245 88D3 <1> movbl, dl

321 00000247 80EB80 <1> subbl, 80h ; 26/02/2015

322 0000024A 80A7[445D]FE <1> and byte [bx+drv.status+2], 0FEh ; clear bit 0

323 <1> ; bit 0 = LBA ready bit

324 <1> ; 'diskio' procedure will check this bit !

325 <1> L11b:

326 0000024F 3A16[F45C] <1> cmpdl, [last_drv] ; 25/12/2014

327 00000253 7307 <1> jnb short L13

328 00000255 E9FCFE <1> jmp L10

329 <1> L12:

330 <1> ; Restore data registers

331 00000258 8CC8 <1> movax, cs

332 0000025A 8ED8 <1> movds, ax

333 <1> L13:

334 <1> ; 13/12/2014

335 0000025C 0E <1> pushcs

336 0000025D 07 <1> popes

337 <1> L14:

338 0000025E B411 <1> mov ah, 11h

339 00000260 CD16 <1> int 16h

340 00000262 7466 <1> jz short L16 ; no keys in keyboard buffer

341 00000264 B010 <1> moval, 10h

342 00000266 CD16 <1> int 16h

343 00000268 EBF4 <1> jmp short L14

344 <1>

345 <1> set_disk_parms:

346 <1> ; 04/02/2016 (ebx -> bx)

347 <1> ; 10/07/2015

348 <1> ; 14/01/2015

349 <1> ;pushbx

350 0000026A 28FF <1> subbh, bh

351 0000026C 8A1E[F35C] <1> movbl, [drv]

352 00000270 80FB80 <1> cmpbl, 80h

353 00000273 7203 <1> jbshort sdp0

354 00000275 80EB7E <1> subbl, 7Eh

355 <1> sdp0:

356 00000278 81C3[425D] <1> addbx, drv.status

357 0000027C C60780 <1> movbyte [bx], 80h ; 'Present' flag

358 <1> ;

359 0000027F 88E8 <1> moval, ch ; last cylinder (bits 0-7)

360 00000281 88CC <1> movah, cl ;

361 00000283 C0EC06 <1> shrah, 6 ; last cylinder (bits 8-9)

362 00000286 81EB[425D] <1> subbx, drv.status

363 0000028A D0E3 <1> shlbl, 1

364 0000028C 81C3[FC5C] <1> addbx, drv.cylinders

365 00000290 40 <1> incax ; convert max. cyl number to cyl count

366 00000291 8907 <1> mov[bx], ax

367 00000293 50 <1> pushax ; ** cylinders

368 00000294 81EB[FC5C] <1> subbx, drv.cylinders

369 00000298 81C3[0A5D] <1> addbx, drv.heads

370 0000029C 30E4 <1> xorah, ah

371 0000029E 88F0 <1> moval, dh ; heads

372 000002A0 40 <1> incax

373 000002A1 8907 <1> mov[bx], ax

374 000002A3 81EB[0A5D] <1> sub bx, drv.heads

375 000002A7 81C3[185D] <1> add bx, drv.spt

376 000002AB 30ED <1> xorch, ch

377 000002AD 80E13F <1> andcl, 3Fh; sectors (bits 0-6)

378 000002B0 890F <1> mov[bx], cx

379 000002B2 81EB[185D] <1> sub bx, drv.spt

380 000002B6 D1E3 <1> shlbx, 1

381 000002B8 81C3[265D] <1> addbx, drv.size ; disk size (in sectors)

382 <1> ; LBA size = cylinders * heads * secpertrack

383 000002BC F7E1 <1> mulcx

384 000002BE 89C2 <1> movdx, ax; heads*spt

385 000002C0 58 <1> popax ; ** cylinders

386 000002C1 48 <1> decax ; 1 cylinder reserved (!?)

387 000002C2 F7E2 <1> muldx ; cylinders * (heads*spt)

388 000002C4 8907 <1> mov[bx], ax

389 000002C6 895702 <1> mov[bx+2], dx

390 <1> ;

391 <1> ;popbx

392 000002C9 C3 <1> retn

393 <1>

394 <1> L16:; 28/05/2016

204

205 ; 10/11/2014

206 000002CA FA cli; Disable interrupts (clear interrupt flag)

207 ; Reset Interrupt MASK Registers (Master&Slave)

208 ;moval, 0FFh; mask off all interrupts

209 ;out21h, al; on master PIC (8259)

210 ;jmp $+2 ; (delay)

211 ;out0A1h, al; on slave PIC (8259)

212 ;

213 ; Disable NMI

214 000002CB B080 mov al, 80h

215 000002CD E670 out 70h, al; set bit 7 to 1 for disabling NMI

216 ;23/02/2015

217 ;nop;

218 ;inal, 71h; read in 71h just after writing out to 70h

219 ; for preventing unknown state (!?)

220 ;

221 ; 20/08/2014

222 ; Moving the kernel 64 KB back (to physical address 0)

223 ; DS = CS = 1000h

224 ; 05/11/2014

225 000002CF 31C0 xorax, ax

226 000002D1 8EC0 moves, ax ; ES = 0

227 ;

228 ; 04/07/2016 - TRDOS 386 (64K - 128K kernel)

229 000002D3 31F6 xorsi, si

230 000002D5 31FF xordi, di

231 000002D7 B90040 movcx, 16384

232 000002DA F366A5 repmovsd

233 ;

234 000002DD 06 pushes ; 0

235 000002DE 68[E202] pushL17

236 000002E1 CB retf

237 L17:

238 000002E2 B90010 movcx, 1000h

239 000002E5 8EC1 moves, cx ; 1000h

240 000002E7 01C9 addcx, cx

241 000002E9 8ED9 movds, cx ; 2000h

242 000002EB 29F6 subsi, si

243 000002ED 29FF subdi, di

244 000002EF B90040 movcx, 16384

245 000002F2 F366A5 repmovsd

246

247 ; Turn off the floppy drive motor

248 000002F5 BAF203 mov dx, 3F2h

249 000002F8 EE out dx, al ; 0 ; 31/12/2013

250

251 ; Enable access to memory above one megabyte

252 L18:

253 000002F9 E464 inal, 64h

254 000002FB A802 testal, 2

255 000002FD 75FA jnz short L18

256 000002FF B0D1 moval, 0D1h; Write output port

257 00000301 E664 out64h, al

258 L19:

259 00000303 E464 inal, 64h

260 00000305 A802 testal, 2

261 00000307 75FA jnz short L19

262 00000309 B0DF moval, 0DFh; Enable A20 line

263 0000030B E660 out60h, al

264 ;L20:

265 ;

266 ; Load global descriptor table register

267

268 ;mov ax, cs

269 ;mov ds, ax

270

271 0000030D 2E0F0116[605C] lgdt [cs:gdtd]

272

273 00000313 0F20C0 mov eax, cr0

274 ; or eax, 1

275 00000316 40 inc ax

276 00000317 0F22C0 mov cr0, eax

277

278 ; Jump to 32 bit code

279

280 0000031A 66 db 66h ; Prefix for 32-bit

281 0000031B EA db 0EAh ; Opcode for far jump

282 0000031C [22030000] dd StartPM ; Offset to start, 32-bit

283 ; (1000h:StartPM = StartPM + 10000h)

284 00000320 0800 dw KCODE; This is the selector for CODE32_DESCRIPTOR,

285 ; assuming that StartPM resides in code32

286

287 ; 20/02/2017

288

289

290 [BITS 32]

291

292 StartPM:

293 ; Kernel Base Address = 0 ; 30/12/2013

294 00000322 66B81000 mov ax, KDATA ; Save data segment identifier

295 00000326 8ED8 mov ds, ax ; Move a valid data segment into DS register

296 00000328 8EC0 mov es, ax ; Move data segment into ES register

297 0000032A 8EE0 mov fs, ax ; Move data segment into FS register

298 0000032C 8EE8 mov gs, ax ; Move data segment into GS register

299 0000032E 8ED0 mov ss, ax ; Move data segment into SS register

300 00000330 BC00000900 mov esp, 90000h ; Move the stack pointer to 090000h

301

302 clear_bss: ; Clear uninitialized data area

303 ; 11/03/2015

304 00000335 31C0 xor eax, eax ; 0

305 00000337 B90E6F0000 mov ecx, (bss_end - bss_start)/4

306 ;shr ecx, 2 ; bss section is already aligned for double words

307 0000033C BF[62550100] mov edi, bss_start

308 00000341 F3AB rep stosd

309

310 memory_init:

311 ; Initialize memory allocation table and page tables

312 ; 16/11/2014

313 ; 15/11/2014

314 ; 07/11/2014

315 ; 06/11/2014

316 ; 05/11/2014

317 ; 04/11/2014

318 ; 31/10/2014 (Retro UNIX 386 v1 - Beginning)

319 ;

320 ;xoreax, eax

321 ;xor ecx, ecx

322 00000343 B108 movcl, 8

323 00000345 BF00001000 movedi, MEM_ALLOC_TBL

324 0000034A F3AB repstosd ; clear Memory Allocation Table

325 ; for the first 1 MB memory

326 ;

327 0000034C 668B0D[EE5C0000] movcx, [mem_1m_1k] ; Number of contiguous KB between

328 ; 1 and 16 MB, max. 3C00h = 15 MB.

329 00000353 66C1E902 shrcx, 2 ; convert 1 KB count to 4 KB count

330 00000357 890D[58580100] mov[free_pages], ecx

331 0000035D 668B15[F05C0000] movdx, [mem_16m_64k] ; Number of contiguous 64 KB blocks

332 ; between 16 MB and 4 GB.

333 00000364 6609D2 ordx, dx

334 00000367 7413 jzshort mi_0

335 ;

336 00000369 6689D0 movax, dx

337 0000036C C1E004 shleax, 4 ; 64 KB -> 4 KB (page count)

338 0000036F 0105[58580100] add[free_pages], eax

339 00000375 0500100000 addeax, 4096 ; 16 MB = 4096 pages

340 0000037A EB07 jmpshort mi_1

341 mi_0:

342 0000037C 6689C8 movax, cx

343 0000037F 66050001 addax, 256 ; add 256 pages for the first 1 MB

344 mi_1:

345 00000383 A3[54580100] mov[memory_size], eax ; Total available memory in pages

346 ; 1 alloc. tbl. bit = 1 memory page

347 ; 32 allocation bits = 32 mem. pages

348 ;

349 00000388 05FF7F0000 addeax, 32767 ; 32768 memory pages per 1 M.A.T. page

350 0000038D C1E80F shreax, 15 ; ((32768 * x) + y) pages (y < 32768)

351 ; --> x + 1 M.A.T. pages, if y > 0

352 ; --> x M.A.T. pages, if y = 0

353 00000390 66A3[68580100] mov[mat_size], ax ; Memory Alloc. Table Size in pages

354 00000396 C1E00C shleax, 12 ; 1 M.A.T. page = 4096 bytes

355 ; ; Max. 32 M.A.T. pages (4 GB memory)

356 00000399 89C3 movebx, eax ; M.A.T. size in bytes

357 ; Set/Calculate Kernel's Page Directory Address

358 0000039B 81C300001000 addebx, MEM_ALLOC_TBL

359 000003A1 891D[50580100] mov[k_page_dir], ebx ; Kernel's Page Directory address

360 ; just after the last M.A.T. page

361 ;

362 000003A7 83E804 subeax, 4 ; convert M.A.T. size to offset value

363 000003AA A3[60580100] mov[last_page], eax ; last page ofset in the M.A.T.

364 ; ; (allocation status search must be

365 ; stopped after here)

366 000003AF 31C0 xoreax, eax

367 000003B1 48 deceax ; FFFFFFFFh (set all bits to 1)

368 000003B2 6651 pushcx

369 000003B4 C1E905 shrecx, 5 ; convert 1 - 16 MB page count to

370 ; count of 32 allocation bits

371 000003B7 F3AB repstosd

372 000003B9 6659 popcx

373 000003BB 40 inceax ; 0

374 000003BC 80E11F andcl, 31 ; remain bits

375 000003BF 7412 jzshort mi_4

376 000003C1 8907 mov[edi], eax ; reset

377 mi_2:

378 000003C3 0FAB07 bts[edi], eax ; 06/11/2014

379 000003C6 FEC9 deccl

380 000003C8 7404 jzshort mi_3

381 000003CA FEC0 incal

382 000003CC EBF5 jmpshort mi_2

383 mi_3:

384 000003CE 28C0 subal, al ; 0

385 000003D0 83C704 addedi, 4 ; 15/11/2014

386 mi_4:

387 000003D3 6609D2 ordx, dx ; check 16M to 4G memory space

388 000003D6 7421 jzshort mi_6 ; max. 16 MB memory, no more...

389 ;

390 000003D8 B900021000 movecx, MEM_ALLOC_TBL + 512 ; End of first 16 MB memory

391 ;

392 000003DD 29F9 subecx, edi ; displacement (to end of 16 MB)

393 000003DF 7406 jzshort mi_5 ; jump if EDI points to

394 ; end of first 16 MB

395 000003E1 D1E9 shrecx, 1 ; convert to dword count

396 000003E3 D1E9 shrecx, 1 ; (shift 2 bits right)

397 000003E5 F3AB rep stosd ; reset all bits for reserved pages

398 ; (memory hole under 16 MB)

399 mi_5:

400 000003E7 6689D1 movcx, dx ; count of 64 KB memory blocks

401 000003EA D1E9 shrecx, 1 ; 1 alloc. dword per 128 KB memory

402 000003EC 9C pushf ; 16/11/2014

403 000003ED 48 deceax ; FFFFFFFFh (set all bits to 1)

404 000003EE F3AB repstosd

405 000003F0 40 inceax ; 0

406 000003F1 9D popf ; 16/11/2014

407 000003F2 7305 jncshort mi_6

408 000003F4 6648 decax ; eax = 0000FFFFh

409 000003F6 AB stosd

410 000003F7 6640 incax ; 0

411 mi_6:

412 000003F9 39DF cmpedi, ebx ; check if EDI points to

413 000003FB 730A jnbshort mi_7 ; end of memory allocation table

414 ; ; (>= MEM_ALLOC_TBL + 4906)

415 000003FD 89D9 movecx, ebx ; end of memory allocation table

416 000003FF 29F9 subecx, edi ; convert displacement/offset

417 00000401 D1E9 shrecx, 1 ; to dword count

418 00000403 D1E9 shrecx, 1 ; (shift 2 bits right)

419 00000405 F3AB rep stosd ; reset all remain M.A.T. bits

420 mi_7:

421 ; Reset M.A.T. bits in M.A.T. (allocate M.A.T. pages)

422 00000407 BA00001000 movedx, MEM_ALLOC_TBL

423 ;subebx, edx ; Mem. Alloc. Tbl. size in bytes

424 ;shrebx, 12 ; Mem. Alloc. Tbl. size in pages

425 0000040C 668B0D[68580100] movcx, [mat_size] ; Mem. Alloc. Tbl. size in pages

426 00000413 89D7 movedi, edx

427 00000415 C1EF0F shredi, 15 ; convert M.A.T. address to

428 ; byte offset in M.A.T.

429 ; (1 M.A.T. byte points to

430 ; 32768 bytes)

431 ; Note: MEM_ALLOC_TBL address

432 ; must be aligned on 128 KB

433 ; boundary!

434 00000418 01D7 addedi, edx ; points to M.A.T.'s itself

435 ; eax = 0

436 0000041A 290D[58580100] sub[free_pages], ecx ; 07/11/2014

437 mi_8:

438 00000420 0FB307 btr[edi], eax ; clear bit 0 to bit x (1 to 31)

439 ;decbl

440 00000423 FEC9 deccl

441 00000425 7404 jzshort mi_9

442 00000427 FEC0 incal

443 00000429 EBF5 jmpshort mi_8

444 mi_9:

445 ;

446 ; Reset Kernel's Page Dir. and Page Table bits in M.A.T.

447 ;(allocate pages for system page tables)

448

449 ; edx = MEM_ALLOC_TBL

450 0000042B 8B0D[54580100] movecx, [memory_size] ; memory size in pages (PTEs)

451 00000431 81C1FF030000 addecx, 1023 ; round up (1024 PTEs per table)

452 00000437 C1E90A shrecx, 10 ; convert memory page count to

453 ; page table count (PDE count)

454 ;

455 0000043A 51 pushecx ; (**) PDE count (<= 1024)

456 ;

457 0000043B 41 incecx ; +1 for kernel page directory

458 ;

459 0000043C 290D[58580100] sub[free_pages], ecx ; 07/11/2014

460 ;

461 00000442 8B35[50580100] movesi, [k_page_dir] ; Kernel's Page Directory address

462 00000448 C1EE0C shresi, 12 ; convert to page number

463 mi_10:

464 0000044B 89F0 moveax, esi ; allocation bit offset

465 0000044D 89C3 movebx, eax

466 0000044F C1EB03 shrebx, 3 ; convert to alloc. byte offset

467 00000452 80E3FC andbl, 0FCh ; clear bit 0 and bit 1

468 ; to align on dword boundary

469 00000455 83E01F andeax, 31 ; set allocation bit position

470 ; (bit 0 to bit 31)

471 ;

472 00000458 01D3 addebx, edx ; offset in M.A.T. + M.A.T. address

473 ;

474 0000045A 0FB303 btr [ebx], eax ; reset relevant bit (0 to 31)

475 ;

476 0000045D 46 incesi ; next page table

477 0000045E E2EB loopmi_10 ; allocate next kernel page table

478 ; (ecx = page table count + 1)

479 ;

480 00000460 59 popecx ; (**) PDE count (= pg. tbl. count)

481 ;

482 ; Initialize Kernel Page Directory and Kernel Page Tables

483 ;

484 ; Initialize Kernel's Page Directory

485 00000461 8B3D[50580100] movedi, [k_page_dir]

486 00000467 89F8 moveax, edi

487 00000469 0C03 oral, PDE_A_PRESENT + PDE_A_WRITE

488 ; supervisor + read&write + present

489 0000046B 89CA movedx, ecx ; (**) PDE count (= pg. tbl. count)

490 mi_11:

491 0000046D 0500100000 addeax, 4096; Add page size (PGSZ)

492 ; EAX points to next page table

493 00000472 AB stosd

494 00000473 E2F8 loopmi_11

495 00000475 29C0 subeax, eax; Empty PDE

496 00000477 66B90004 movcx, 1024; Entry count (PGSZ/4)

497 0000047B 29D1 subecx, edx

498 0000047D 7402 jzshort mi_12

499 0000047F F3AB repstosd ; clear remain (empty) PDEs

500 ;

501 ; Initialization of Kernel's Page Directory is OK, here.

502 mi_12:

503 ; Initialize Kernel's Page Tables

504 ;

505 ; (EDI points to address of page table 0)

506 ; eax = 0

507 00000481 8B0D[54580100] movecx, [memory_size] ; memory size in pages

508 00000487 89CA movedx, ecx; (***)

509 00000489 B003 moval, PTE_A_PRESENT + PTE_A_WRITE

510 ; supervisor + read&write + present

511 mi_13:

512 0000048B AB stosd

513 0000048C 0500100000 addeax, 4096

514 00000491 E2F8 loopmi_13

515 00000493 6681E2FF03 anddx, 1023; (***)

516 00000498 740B jzshort mi_14

517 0000049A 66B90004 movcx, 1024

518 0000049E 6629D1 subcx, dx; from dx (<= 1023) to 1024

519 000004A1 31C0 xoreax, eax

520 000004A3 F3AB repstosd; clear remain (empty) PTEs

521 ; of the last page table

522 mi_14:

523 ; Initialization of Kernel's Page Tables is OK, here.

524 ;

525 000004A5 89F8 moveax, edi; end of the last page table page

526 ; (beginging of user space pages)

527 000004A7 C1E80F shreax, 15; convert to M.A.T. byte offset

528 000004AA 24FC andal, 0FCh; clear bit 0 and bit 1 for

529 ; aligning on dword boundary

530

531 000004AC A3[64580100] mov[first_page], eax

532 000004B1 A3[5C580100] mov[next_page], eax ; The first free page pointer

533 ; for user programs

534 ; (Offset in Mem. Alloc. Tbl.)

535 ;

536 ; Linear/FLAT (1 to 1) memory paging for the kernel is OK, here.

537 ;

538

539 ; Enable paging

540 ;

541 000004B6 A1[50580100] mov eax, [k_page_dir]

542 000004BB 0F22D8 movcr3, eax

543 000004BE 0F20C0 moveax, cr0

544 000004C1 0D00000080 oreax, 80000000h; set paging bit (bit 31)

545 000004C6 0F22C0 movcr0, eax

546 ;jmp KCODE:StartPMP

547

548 000004C9 EA db 0EAh ; Opcode for far jump

549 000004CA [D0040000] dd StartPMP; 32 bit offset

550 000004CE 0800 dw KCODE; kernel code segment descriptor

551

552

553 StartPMP:

554 ; 06/11//2014

555 ; Clear video page 0

556 ;

557 ; Temporary Code

558 ;

559 000004D0 B9E8030000 movecx, 80*25/2

560 000004D5 BF00800B00 movedi, 0B8000h

561 ; 30/01/2016

562 ;xoreax, eax; black background, black fore color

563 000004DA B800070007 moveax, 07000700h ; black background, light gray fore color

564 000004DF F3AB repstosd

565

566 ; 19/08/2014

567 ; Kernel Base Address = 0

568 ; It is mapped to (physically) 0 in the page table.

569 ; So, here is exactly 'StartPMP' address.

570

571 ; 29/01/2016 (TRDOS 386 = TRDOS v2.0)

572 000004E1 BE[A1190100] movesi, starting_msg

573 ;; 14/08/2015 (kernel version message will appear

574 ;; when protected mode and paging is enabled)

575 000004E6 BF00800B00 movedi, 0B8000h ; 27/08/2014

576 000004EB B40A movah, 0Ah ; Black background, light green forecolor

577 ; 20/08/2014

578 000004ED E88F010000 callprintk

579

580 ; 'UNIX v7/x86' source code by Robert Nordier (1999)

581 ; // Set IRQ offsets

582 ;

583 ; Linux (v0.12) source code by Linus Torvalds (1991)

584 ;

585 ;; ICW1

586 000004F2 B011 moval, 11h; Initialization sequence

587 000004F4 E620 out20h, al; 8259A-1

588 ; jmp $+2

589 000004F6 E6A0 out0A0h, al; 8259A-2

590 ;; ICW2

591 000004F8 B020 moval, 20h; Start of hardware ints (20h)

592 000004FA E621 out21h, al;for 8259A-1

593 ; jmp $+2

594 000004FC B028 moval, 28h; Start of hardware ints (28h)

595 000004FE E6A1 out0A1h, al; for 8259A-2

596 ;

597 00000500 B004 moval, 04h;; ICW3

598 00000502 E621 out21h, al; IRQ2 of 8259A-1 (master)

599 ; jmp $+2

600 00000504 B002 moval, 02h; is 8259A-2 (slave)

601 00000506 E6A1 out0A1h, al;

602 ;; ICW4

603 00000508 B001 moval, 01h ;

604 0000050A E621 out21h, al; 8086 mode, normal EOI

605 ; jmp $+2

606 0000050C E6A1 out0A1h, al;for both chips.

607

608 ;moval, 0FFh; mask off all interrupts for now

609 ;out21h, al

610 ;; jmp $+2

611 ;out0A1h, al

612

613 ; 02/04/2015

614 ; 26/03/2015 System call (INT 30h) modification

615 ; DPL = 3 (Interrupt service routine can be called from user mode)

616 ;

617 ;; Linux (v0.12) source code by Linus Torvalds (1991)

618 ; setup_idt:

619 ;

620 ;; 16/02/2015

621 ;;mov dword [DISKETTE_INT], fdc_int ; IRQ 6 handler

622 ; 21/08/2014 (timer_int)

623 0000050E BE[64160100] movesi, ilist

624 00000513 8D3D[68550100] leaedi, [idt]

625 ; 26/03/2015

626 00000519 B930000000 movecx, 48; 48 hardware interrupts (INT 0 to INT 2Fh)

627 ; 02/04/2015

628 0000051E BB00000800 movebx, 80000h

629 rp_sidt1:

630 00000523 AD lodsd

631 00000524 89C2 movedx, eax

632 00000526 66BA008E movdx, 8E00h

633 0000052A 6689C3 movbx, ax

634 0000052D 89D8 moveax, ebx; /* selector = 0x0008 = cs */

635 ; /* interrupt gate - dpl=0, present */

636 0000052F AB stosd; selector & offset bits 0-15

637 00000530 89D0 moveax, edx

638 00000532 AB stosd; attributes & offset bits 16-23

639 00000533 E2EE looprp_sidt1

640 ; 15/04/2016

641 ; TRDOS 386 (TRDOS v2.0) /// 32 sofware interrupts ///

642 ;movcl, 16 ; 16 software interrupts (INT 30h to INT 3Fh)

643 00000535 B120 movcl, 32 ; 32 software interrupts (INT 30h to INT 4Fh)

644 rp_sidt2:

645 00000537 AD lodsd

646 00000538 21C0 andeax, eax

647 0000053A 7413 jzshort rp_sidt3

648 0000053C 89C2 movedx, eax

649 0000053E 66BA00EE movdx, 0EE00h; P=1b/DPL=11b/01110b

650 00000542 6689C3 movbx, ax

651 00000545 89D8 moveax, ebx; selector & offset bits 0-15

652 00000547 AB stosd

653 00000548 89D0 moveax, edx

654 0000054A AB stosd

655 0000054B E2EA looprp_sidt2

656 0000054D EB16 jmpshort sidt_OK

657 rp_sidt3:

658 0000054F B8[AA0A0000] moveax, ignore_int

659 00000554 89C2 movedx, eax

660 00000556 66BA00EE movdx, 0EE00h; P=1b/DPL=11b/01110b

661 0000055A 6689C3 movbx, ax

662 0000055D 89D8 moveax, ebx; selector & offset bits 0-15

663 rp_sidt4:

664 0000055F AB stosd

665 00000560 92 xchgeax, edx

666 00000561 AB stosd

667 00000562 92 xchgedx, eax

668 00000563 E2FA looprp_sidt4

669 sidt_OK:

670 00000565 0F011D[665C0000] lidt [idtd]

671 ;

672 ; TSS descriptor setup ; 24/03/2015

673 0000056C B8[E8570100] moveax, task_state_segment

674 00000571 66A3[5A5C0000] mov[gdt_tss0], ax

675 00000577 C1C010 roleax, 16

676 0000057A A2[5C5C0000] mov[gdt_tss1], al

677 0000057F 8825[5F5C0000] mov[gdt_tss2], ah

678 00000585 66C705[4E580100]68- movword [tss.IOPB], tss_end - task_state_segment

678 0000058D 00

679 ;

680 ; IO Map Base address (When this address points

681 ; to end of the TSS, CPU does not use IO port

682 ; permission bit map for RING 3 IO permissions,

683 ; access to any IO ports in ring 3 will be forbidden.)

684 ;

685 ;mov[tss.esp0], esp ; TSS offset 4

686 ;movword [tss.ss0], KDATA ; TSS offset 8 (SS)

687 0000058E 66B82800 movax, TSS ; It is needed when an interrupt

688 ; occurs (or a system call -software INT- is requested)

689 ; while cpu running in ring 3 (in user mode).

690 ; (Kernel stack pointer and segment will be loaded

691 ; from offset 4 and 8 of the TSS, by the CPU.)

692 00000592 0F00D8 ltrax ; Load task register

693 ;

694 esp0_set0:

695 ; 30/07/2015

696 00000595 8B0D[54580100] mov ecx, [memory_size] ; memory size in pages

697 0000059B C1E10C shl ecx, 12 ; convert page count to byte count

698 0000059E 81F900004000 cmpecx, CORE ; beginning of user's memory space (400000h)

699 ; (kernel mode virtual address)

700 000005A4 7605 jnashort esp0_set1

701 ;

702 ; If available memory > CORE (end of the 1st 4 MB)

703 ; set stack pointer to CORE

704 ;(Because, PDE 0 is reserved for kernel space in user's page directory)

705 ;(PDE 0 points to page table of the 1st 4 MB virtual address space)

706 000005A6 B900004000 movecx, CORE

707 esp0_set1:

708 000005AB 89CC movesp, ecx ; top of kernel stack (**tss.esp0**)

709 esp0_set_ok:

710 ; 30/07/2015 (**tss.esp0**)

711 000005AD 8925[EC570100] mov[tss.esp0], esp

712 000005B3 66C705[F0570100]10- mov word [tss.ss0], KDATA

712 000005BB 00

713 ; 14/08/2015

714 ; 10/11/2014 (Retro UNIX 386 v1 - Erdogan Tan)

715 ;

716 ;cli; Disable interrupts (for CPU)

717 ; (CPU will not handle hardware interrupts, except NMI!)

718 ;

719 000005BC 30C0 xoral, al; Enable all hardware interrupts!

720 000005BE E621 out21h, al; (IBM PC-AT compatibility)

721 000005C0 EB00 jmp $+2; (All conventional PC-AT hardware

722 000005C2 E6A1 out0A1h, al; interrupts will be in use.)

723 ; (Even if related hardware component

724 ; does not exist!)

725 ; Enable NMI

726 000005C4 B07F moval, 7Fh; Clear bit 7 to enable NMI (again)

727 000005C6 E670 out 70h, al

728 ; 23/02/2015

729 000005C8 90 nop

730 000005C9 E471 inal, 71h; read in 71h just after writing out to 70h

731 ; for preventing unknown state (!?)

732 ;

733 ; Only a NMI can occur here... (Before a 'STI' instruction)

734 ;

735 ; 02/09/2014

736 000005CB 6631DB xorbx, bx

737 000005CE 66BA0002 movdx, 0200h; Row 2, column 0 ; 07/03/2015

738 000005D2 E871170000 call_set_cpos; 24/01/2016

739 ;

740 ; 06/11/2014

741 000005D7 E8782C0000 callmemory_info

742 ; 14/08/2015

743 ;call getch ; 28/02/2015

744 drv_init:

745 000005DC FB sti; Enable Interrupts

746 ; 06/02/2015

747 000005DD 8B15[F85C0000] movedx, [hd0_type] ; hd0, hd1, hd2, hd3

748 000005E3 668B1D[F65C0000] movbx, [fd0_type] ; fd0, fd1

749 ; 22/02/2015

750 000005EA 6621DB andbx, bx

751 000005ED 751C jnzshort di1

752 ;

753 000005EF 09D2 or edx, edx

754 000005F1 752A jnzshort di2

755 ;

756 setup_error:

757 000005F3 BE[6A190100] mov esi, setup_error_msg

758 psem:

759 000005F8 AC lodsb

760 000005F9 08C0 oral, al

761 ;jzshort haltx ; 22/02/2015

762 000005FB 7427 jzshort di3

763 000005FD 56 pushesi

764 ; 13/05/2016

765 000005FE BB07000000 movebx, 7; Black background,

766 ; light gray forecolor

767 ; Video page 0 (BH=0)

768 00000603 E8AA160000 call_write_tty

769 00000608 5E popesi

770 00000609 EBED jmpshort psem

771

772 di1:

773 ; supress 'jmp short T6'

774 ; (activate fdc motor control code)

775 0000060B 66C705[EB060000]90- movword [T5], 9090h ; nop

775 00000613 90

776 ;

777 ;movax, int_0Eh; IRQ 6 handler

778 ;movdi, 0Eh*4; IRQ 6 vector

779 ;stosw

780 ;mov ax, cs

781 ;stosw

782 ;; 16/02/2015

783 ;;mov dword [DISKETTE_INT], fdc_int ; IRQ 6 handler

784 ;

785 00000614 E8AF3B0000 CALLDSKETTE_SETUP; Initialize Floppy Disks

786 ;

787 00000619 09D2 oredx, edx

788 0000061B 7407 jz short di3

789 di2:

790 0000061D E8EC3B0000 call DISK_SETUP; Initialize Fixed Disks

791 00000622 72CF jc short setup_error

792 di3:

793 00000624 E8FF2B0000 callsetup_rtc_int; 22/05/2015 (dsectrpm.s)

794 ;

795 00000629 E8D2110100 calldisplay_disks ; 07/03/2015 (Temporary)

796 ;haltx:

797 ; 14/08/2015

798 ;callgetch ; 22/02/2015

799 ;sti; Enable interrupts (for CPU)

800 ;; 29/01/2016

801 ;subah, ah ; read time count

802 ;callint1Ah

803 ;movedx, ecx ; 18.2 * seconds

804 ;md_info_msg_wait1:

805 ;; 29/01/2016

806 ;movah, 1

807 ;callint16h

808 ;jzshort md_info_msg_wait2

809 ;xorah, ah ; 0

810 ; call int16h

811 ;jmp short md_info_msg_ok

812 ;md_info_msg_wait2:

813 ;subah, ah ; read time count

814 ;callint1Ah

815 ;cmpedx, ecx ; ; 18.2 * seconds

816 ;jnashort md_info_msg_wait3

817 ;xchg edx, ecx

818 ;md_info_msg_wait3:

819 ;subecx, edx

820 ;cmpecx, 127 ; 7 seconds (18.2 * 7)

821 ;jbshort md_info_msg_wait1

822 ;md_info_msg_ok:

823 ; 08/09/2016

824 0000062E 0F20C0 moveax, cr0

825 00000631 A810 testal, 10h ; Bit 4, ET (Extension Type)

826 00000633 7408 jzshort sysinit

827 ; 27/02/2017

828 00000635 FE05[10660100] incbyte [fpready]

829 ; 80387 (FPU) is ready

830 0000063B DBE3 fninit ; Initialize Floating-Point Unit

831 sysinit:

832 ; 30/06/2015

833 0000063D E80C5C0000 callsys_init

834 ;

835 ;jmp cpu_reset ; 22/02/2015

836 hang:

837 ; 23/02/2015

838 ;sti; Enable interrupts

839 00000642 F4 hlt

840 ;

841 ;nop

842 ;; 03/12/2014

843 ;; 28/0