;************************************************************************* ; LOADER - program to load all modules of TUOX system into memory from ; boot disk ; - information about start segment of modules are ; stored in "my" stack starting at address STACK_POS ; Order on stack: ; 1. CS of 1st module ; 2. DS of 1st module ; 3. CS of 2nd module ; .... ; 9. RAMDisk reserved memory size ; 10. 1st free segment for user programs ; ; Modified by Petr Smidak, member of 1999 Bootstrap group, after ; old Bootstrap group(s) ; ; 9.5.1999 ;************************************************************************* .model tiny, c .386 alloc_table struc rss dw ? ;relative start sector text db 20 dup(?) ;describe modul file db 10 dup(?) ;filename of module how_much dd ? ;size in bytes of modul memory dw ? ;size to allocate memory in paragraf code_size dw ? ;size to alloc. code mem. in para. alloc_table ends .data FIRST_MODUL = 0D00H ;must be 0700h + loader code size TABLE_SIZE = 40 MODUL_NO = 4 org 100h .code startupcode start: CLI MOV AX, CS MOV DS, AX MOV SS, AX MOV SP, OFFSET start STI mov al, BYTE PTR es:[di+16] mov DRIVE, al mov al, BYTE PTR es:[di+1] mov HEAD, al mov ax, WORD PTR es:[di+2] mov CYLSEC, ax mov ax, WORD PTR es:[di+17] mov RAMDisk, ax mov ax, cs mov es, ax CALL boot2buf OR AL, AL JNZ @@ReadErr MOV BX, OFFSET Buffer MOV SI, 3 MOV AX, 1 ; sector 1 = alloc table CALL calc_sec @@three: MOV AX, 0201h ; BIOS service - 1 sector read INT 13H JNC @@Continue DEC SI JNZ @@three JMP @@ReadErr @@Continue: MOV SI, OFFSET RunMsg CALL WriteString MOV SI, OFFSET Buffer[0].alloc_table.text CALL WriteString MOV SI, OFFSET NewLine CALL WriteString MOV DI, TABLE_SIZE MOV AX, FIRST_MODUL shr 4 ;calc. to para. (seg) MOV ES, AX MOV BX, OFFSET Buffer[0].alloc_table.code_size ADD AX, [BX+DI] MOV data_seg, AX MOV DX, [BX+DI] MOV BX, OFFSET Buffer[0].alloc_table.memory MOV AX, [BX+DI] SUB AX, DX SHL AX, 4 PUSH AX @@load: MOV SI, OFFSET MsgModul CALL WriteString MOV SI, OFFSET Buffer[0].alloc_table.text ADD SI, DI CALL WriteString MOV SI, OFFSET NewLine CALL WriteString MOV SI, OFFSET MsgLoad CALL WriteString POP SI MOV CX, DS MOV DX, data_seg MOV DS, DX DEC SI ;simulate PUSH DEC SI ;decrement "my" stack and MOV WORD PTR DS:[SI], ES ;store CS of actual modul here MOV BX, OFFSET Buffer[0].alloc_table.code_size MOV AX, ES MOV DS, CX ADD AX, [BX+DI] MOV DS, DX DEC SI ;simulate PUSH DEC SI ;decrement "my" stack and MOV WORD PTR DS:[SI], AX ;store DS of actual modul here MOV DS, CX PUSH SI MOV BX, OFFSET Buffer[0].alloc_table.how_much MOV AX, [BX+DI] MOV DX, [BX+DI+2] MOV BX, OFFSET Buffer[0].alloc_table.rss MOV CX, [BX+DI] CALL read_sec ;call func with param.in AX-DX,CX,ES XOR AH, AH JNZ @@ReadErr MOV BX, OFFSET Buffer[0].alloc_table.memory MOV AX, ES ADD AX, [BX+DI] INC AX MOV ES, AX CMP DI, TABLE_SIZE*MODUL_NO JE @@all ADD DI, TABLE_SIZE JMP @@load @@all: MOV SI, OFFSET Press CALL WriteString ; Print 'press' message XOR AX,AX INT 16h MOV WORD PTR address_jump+2, FIRST_MODUL shr 4 POP SI ; get new SP to SI mov bx, RAMDisk ; store RAMDisk size MOV AX, data_seg CLI MOV SP, SI ; set stack SS:SP for KRN MOV SS, AX PUSH ES ; store 1.free segment to stack push bx MOV DS, AX ; initialize segments for KRN MOV ES, AX STI ; now JUMP to first modul ; JMP DWORD PTR address_jump ; or DB 0EAh address_jump dd 0 ; = JMP FAR (FIRST_MODUL-100h) shr 4 : 100h ; JUMP to first modul ; Load failed (read error) @@ReadErr: MOV SI, OFFSET DiskReadErr CALL WriteString ; Print error message XOR AX, AX INT 16 INT 19 exitcode include bios.inc MsgLoad db 'Loading .', 0 MsgModul db 'Module: ', 0 RunMsg db 'Running ',0 Dot db '.', 0 OKMsg db 'OK', 10, 13, 0 DiskReadErr db 'Disk Read Error.', 10, 13 db 'Change disk and press any key to reboot...',10,13,0 Press db 'Press any key to run TUOX ...',10,13,0 NewLine db 10, 13, 0 DRIVE db 0 HEAD db 0 CYLSEC dw 0 RAMDisk dw 0FFFFh data_seg dw ? boot_buf db 512 DUP(?) ;buffer for boot record Buffer db 250 DUP(?) ;buffer for all. table end