;************************************************************************* ; LOADER - program to load all modules of TUOX system into memory from ; boot disk ; - information about start segment of several modules are ; stored in "my" stack starting at address STACK_POS ; in this order: code_start_segment-data_start_segment-....... ; ; Created by Radim Drobek from VSB TU Ostrava,member of BOOTSTRAP team ; ; 14.1.1998 ;************************************************************************* .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 ES, AX MOV DS, AX MOV SS, AX MOV SP, OFFSET start STI 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, 100h MOV WORD PTR address_jump+2, FIRST_MODUL shr 4 POP SI ; get new SP to SI 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 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_f.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 boot again.',10,13,0 Press db 'Press any key to run TUOX ...',10,13,0 NewLine db 10, 13, 0 data_seg dw ? boot_buf db 512 DUP (?) ;buffer for boot record Buffer db 250 DUP (?) ;buffer for all. table end