home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 9 / 09.iso / l / l040 / 13.ddi / RTLSYS.ZIP / MAIN.ASM < prev    next >
Encoding:
Assembly Source File  |  1992-10-28  |  7.7 KB  |  416 lines

  1.  
  2. ; *******************************************************
  3. ; *                            *
  4. ; *     Turbo Pascal Run-time Library                   *
  5. ; *    Main module                    *
  6. ; *                            *
  7. ; *     Copyright (c) 1988,92 Borland International     *
  8. ; *                            *
  9. ; *******************************************************
  10.  
  11.     TITLE    MAIN
  12.  
  13.     INCLUDE    SE.ASM
  14.  
  15. DATA    SEGMENT WORD PUBLIC
  16.  
  17. ; Externals
  18.  
  19.     EXTRN    OvrHeapSize:WORD,OvrHeapOrg:WORD,OvrHeapPtr:WORD
  20.     EXTRN    OvrHeapEnd:WORD,OvrLoadList:WORD,HeapOrg:DWORD
  21.     EXTRN    HeapPtr:DWORD,HeapEnd:DWORD,FreeList:DWORD
  22.     EXTRN    HeapError:DWORD,ExitProc:DWORD,ExitCode:WORD
  23.     EXTRN    ErrorAddr:DWORD,PrefixSeg:WORD,InOutRes:WORD
  24.     EXTRN    Input:BYTE,Output:BYTE,SaveInt00:DWORD
  25.     EXTRN    Test8086:BYTE
  26.  
  27. DATA    ENDS
  28.  
  29. CODE    SEGMENT    BYTE PUBLIC
  30.  
  31.     ASSUME    CS:CODE,DS:DATA
  32.  
  33. ; Externals
  34.  
  35.     EXTRN    AssignText:NEAR,ResetText:NEAR,RewriteText:NEAR
  36.     EXTRN    CloseText:NEAR,ClearDSeg:NEAR
  37.  
  38. ; Publics
  39.  
  40.     PUBLIC    InitTurbo,HaltTurbo,HaltError,PrintString
  41.     PUBLIC    Terminate,LibEntry,LibExit,LibExitProc,InitTask
  42.  
  43. ; Initialize runtime library. First instruction in any program
  44. ; is a call to this routine.
  45.  
  46. InitTurbo:
  47.  
  48.     MOV    DX,SEG DATA        ;Initialize DS
  49.     MOV    DS,DX
  50.     MOV    PrefixSeg,ES        ;Save PSP segment
  51.     XOR    BP,BP            ;End of stack frame chain
  52.     CALL    ClearDSeg        ;Zero fill data segment
  53.     CALL    Check8086        ;Determine CPU type
  54.     MOV    AX,SP            ;Compute first free segment
  55.     ADD    AX,4+15            ;address in AX
  56.     MOV    CL,4
  57.     SHR    AX,CL
  58.     MOV    DX,SS
  59.     ADD    AX,DX
  60.     MOV    OvrHeapOrg,AX        ;Initialize overlay manager
  61.     MOV    OvrHeapPtr,AX        ;variables
  62.     ADD    AX,OvrHeapSize
  63.     MOV    OvrHeapEnd,AX
  64.     MOV    HeapOrg.seg,AX        ;Initialize heap manager
  65.     MOV    HeapPtr.seg,AX        ;variables
  66.     MOV    FreeList.seg,AX
  67.         MOV     ES,PrefixSeg
  68.     MOV    AX,ES:pspMemTop
  69.     MOV    HeapEnd.seg,AX
  70.     MOV    HeapError.ofs,OFFSET CS:HeapFailure
  71.     MOV    HeapError.seg,CS
  72.     MOV    DI,OFFSET SaveInt00    ;Capture interrupt vectors
  73.     MOV    SI,OFFSET SaveIntTab
  74.     MOV    CX,SaveIntCnt
  75. @@1:    CLD
  76.     SEGCS    LODSB
  77.     MOV    AH,dosGetInt
  78.     INT    DOS
  79.     MOV    [DI].ofs,BX
  80.     MOV    [DI].seg,ES
  81.     ADD    DI,4
  82.     LOOP    @@1
  83.     PUSH    DS            ;Install interrupt handlers
  84.     PUSH    CS
  85.     POP    DS
  86.     MOV    DX,OFFSET Int00Handler
  87.     MOV    AX,dosSetInt*256+00H
  88.     INT    DOS
  89.     MOV    DX,OFFSET Int23Handler
  90.     MOV    AX,dosSetInt*256+23H
  91.     INT    DOS
  92.     MOV    DX,OFFSET Int24Handler
  93.     MOV    AX,dosSetInt*256+24H
  94.     INT    DOS
  95.     MOV    DX,OFFSET Int3FHandler
  96.     MOV    AX,dosSetInt*256+3FH
  97.     INT    DOS
  98.     POP    DS
  99.     MOV    AX,OFFSET Input        ;Assign/Reset Input file
  100.     PUSH    DS
  101.     PUSH    AX
  102.     PUSH    DS
  103.     PUSH    AX
  104.     MOV    AX,OFFSET ZeroString
  105.     PUSH    CS
  106.     PUSH    AX
  107.     PUSH    CS
  108.     CALL    AssignText
  109.     PUSH    CS
  110.     CALL    ResetText
  111.     MOV    AX,OFFSET Output    ;Assign/Rewrite Output file
  112.     PUSH    DS
  113.     PUSH    AX
  114.     PUSH    DS
  115.     PUSH    AX
  116.     MOV    AX,OFFSET ZeroString
  117.     PUSH    CS
  118.     PUSH    AX
  119.     PUSH    CS
  120.     CALL    AssignText
  121.     PUSH    CS
  122.     CALL    RewriteText
  123.     RETF                ;Back to main program
  124.  
  125. ; CPU detection routine. Sets the Test8086 variable according to the
  126. ; type of CPU detected.
  127.  
  128. Check8086:
  129.  
  130.     XOR    AX,AX            ;0 means 8088/8086
  131.     PUSHF                ;BX = Flags
  132.     POP    BX
  133.     AND    BH,0FH            ;Clear bits 12-15
  134.     PUSH    BX            ;Flags = BX
  135.     POPF
  136.     PUSHF                ;CX = Flags
  137.     POP    CX
  138.     AND    CH,0F0H            ;Bits 12-15 set?
  139.     CMP    CH,0F0H
  140.     JE    @@1            ;Yes, 8086
  141.     INC    AX            ;1 means 80286
  142.     OR    BH,0F0H            ;Set bits 12-15
  143.     PUSH    BX            ;Flags = BX
  144.     POPF
  145.     PUSHF                ;CX = Flags
  146.     POP    CX
  147.     AND    CH,0F0H            ;Bits 12-15 cleared?
  148.     JE    @@1            ;Yes, 80286
  149.     INC    AX            ;2 means 80386
  150. @@1:    MOV    Test8086,AL        ;Save CPU test result
  151.     RET
  152.  
  153. ; Default heap error handler. Return 0 to indicate run-time error.
  154.  
  155. HeapFailure:
  156.  
  157.     XOR    AX,AX
  158.     RETF    2
  159.  
  160. ; Critical error interrupt handler. Control arrives here when
  161. ; DOS encounters a "critical error". Convert critical error code
  162. ; to Turbo Pascal I/O error code, and return.
  163.  
  164. Int24Handler:
  165.  
  166.     STI                ;Enable interrupts
  167.     ADD    SP,6            ;Remove INT 24H return info
  168.     POP    AX            ;Get INT 21H AX register
  169.     AND    DI,01FH            ;Return AX=150..181
  170.     ADD    DI,150
  171.     CMP    AH,39H            ;DOS 2.0 style function?
  172.     JAE    @@1            ;Yes, @@1
  173.     MOV    DI,0FFFFH        ;Return AX=0FFFFH
  174. @@1:    PUSH    DI            ;Save error code
  175.     MOV    AH,54H            ;Dummy function call to get
  176.     INT    DOS            ;DOS into a stable state
  177.     MOV    BP,SP            ;Set CF in return flags
  178.     OR    BYTE PTR [BP+22],1
  179.     POP    AX            ;Restore registers
  180.     POP    BX
  181.     POP    CX
  182.     POP    DX
  183.     POP    SI
  184.     POP    DI
  185.     POP    BP
  186.     POP    DS
  187.     POP    ES
  188.     IRET                ;Return to caller
  189.  
  190. ; Overlay interrupt handler. Control arrives here if the program
  191. ; calls an overlay procedure before initializing the overlay manager.
  192.  
  193. Int3FHandler:
  194.  
  195.     MOV    AX,208
  196.     ADD    SP,6
  197.     JMP    SHORT HaltError
  198.  
  199. ; Divide by zero interrupt handler. Control arrives here upon
  200. ; executing a DIV or IDIV instruction with a zero divisor.
  201.  
  202. Int00Handler:
  203.  
  204.     MOV    AX,200
  205.  
  206. ; RunError standard procedure
  207.  
  208. HaltError:
  209.  
  210.     POP    CX
  211.     POP    BX
  212.     JMP    SHORT Terminate
  213.  
  214. ; Dummy entry points
  215.  
  216. LibEntry:
  217. LibExit:
  218. LibExitProc:
  219. InitTask:
  220.  
  221. ; Control-C interrupt handler. Control arrives here when DOS
  222. ; detects a Ctrl-C or Ctrl-Break.
  223.  
  224. Int23Handler:
  225.  
  226.     MOV    AX,255
  227.  
  228. ; Halt standard procedure
  229.  
  230. HaltTurbo:
  231.  
  232.     XOR    CX,CX
  233.     XOR    BX,BX
  234.  
  235. ; Terminate program and return to DOS
  236. ; In    AX    = Exit code
  237. ;    BX:CX = Error address (or NIL)
  238.  
  239. Terminate:
  240.  
  241.     MOV    DX,SEG DATA        ;Reset DS
  242.     MOV    DS,DX
  243.     STI                ;Enable interrupts
  244.     MOV    ExitCode,AX        ;Save exit code
  245.     MOV    AX,CX            ;Is error address NIL?
  246.     OR    AX,BX
  247.     JE    @@4            ;Yes, @@4
  248.     MOV    AX,OvrLoadList        ;Convert physical overlay
  249. @@0:    OR    AX,AX            ;address to virtual address
  250.     JE    @@3
  251.     MOV    ES,AX
  252.     MOV    AX,ES:ovSegment
  253.     OR    AX,AX
  254.     JE    @@1
  255.     SUB    AX,BX
  256.     JA    @@1
  257.     NEG    AX
  258.     CMP    AX,1000H
  259.     JAE    @@1
  260.     MOV    DX,16
  261.     MUL    DX
  262.     ADD    AX,CX
  263.     JC    @@1
  264.     CMP    AX,ES:ovCodeSize
  265.     JB    @@2
  266. @@1:    MOV    AX,ES:ovNext
  267.     JMP    @@0
  268. @@2:    MOV    CX,AX
  269.     MOV    BX,ES
  270. @@3:    SUB    BX,PrefixSeg        ;Adjust address
  271.     SUB    BX,10H
  272. @@4:    MOV    ErrorAddr.ofs,CX    ;Save error address
  273.     MOV    ErrorAddr.seg,BX
  274. @@5:    LES    BX,ExitProc        ;Call exit procedures
  275.     MOV    AX,ES
  276.     OR    AX,BX
  277.     JE    @@10
  278.     XOR    AX,AX
  279.     MOV    ExitProc.ofs,AX
  280.     MOV    ExitProc.seg,AX
  281.     MOV    InOutRes,AX
  282.     MOV    AX,OFFSET @@5
  283.     PUSH    CS
  284.     PUSH    AX
  285.     PUSH    ES
  286.     PUSH    BX
  287.     RETF
  288. @@10:    MOV    AX,OFFSET Input        ;Close Input file
  289.     PUSH    DS
  290.     PUSH    AX
  291.     PUSH    CS
  292.     CALL    CloseText
  293.     MOV    AX,OFFSET Output    ;Close Output file
  294.     PUSH    DS
  295.     PUSH    AX
  296.     PUSH    CS
  297.     CALL    CloseText
  298.     MOV    DI,OFFSET SaveInt00    ;Restore interrupt vectors
  299.     MOV    SI,OFFSET SaveIntTab
  300.     MOV    CX,SaveIntCnt
  301. @@11:    CLD
  302.     SEGCS    LODSB
  303.     MOV    AH,dosSetInt
  304.     PUSH    DS
  305.     LDS    DX,[DI]
  306.     INT    DOS
  307.     POP    DS
  308.     ADD    DI,4
  309.     LOOP    @@11
  310.     MOV    AX,ErrorAddr.ofs    ;Runtime error?
  311.     OR    AX,ErrorAddr.seg
  312.     JE    @@12            ;No, @@12
  313.     MOV    BX,OFFSET ErrorStr1    ;Print error message
  314.     CALL    PrintString
  315.     MOV    AX,ExitCode
  316.     CALL    PrintDec
  317.     MOV    BX,OFFSET ErrorStr2
  318.     CALL    PrintString
  319.     MOV    AX,ErrorAddr.seg
  320.     CALL    PrintHex
  321.     MOV    AL,':'
  322.     CALL    PrintChar
  323.     MOV    AX,ErrorAddr.ofs
  324.     CALL    PrintHex
  325.     MOV    BX,OFFSET ErrorStr3
  326.     CALL    PrintString
  327. @@12:    MOV    AX,ExitCode        ;Exit to DOS
  328.     MOV    AH,dosExit
  329.     INT    DOS
  330.  
  331. ; Print string
  332. ; In    CS:BX = String pointer
  333.  
  334. PrintString:
  335.  
  336. @@1:    MOV    AL,CS:[BX]
  337.     OR    AL,AL
  338.     JE    @@2
  339.     CALL    PrintChar
  340.     INC    BX
  341.     JMP    SHORT @@1
  342. @@2:    RET
  343.  
  344. ; Print byte in decimal
  345. ; In    AL = Value
  346.  
  347. PrintDec:
  348.  
  349.     MOV    CL,100
  350.     CALL    @@1
  351.     MOV    CL,10
  352.     CALL    @@1
  353.     JMP    SHORT @@2
  354. @@1:    XOR    AH,AH
  355.     DIV    CL
  356. @@2:    ADD    AL,'0'
  357.     PUSH    AX
  358.     CALL    PrintChar
  359.     POP    AX
  360.     MOV    AL,AH
  361.     RET
  362.  
  363. ; Print word in hex
  364. ; In    AX = Value
  365.  
  366. PrintHex:
  367.  
  368.     PUSH    AX
  369.     MOV    AL,AH
  370.     CALL    @@1
  371.     POP    AX
  372. @@1:    PUSH    AX
  373.     MOV    CL,4
  374.     SHR    AL,CL
  375.     CALL    @@2
  376.     POP    AX
  377.     AND    AL,0FH
  378. @@2:    ADD    AL,'0'
  379.     CMP    AL,'0'+10
  380.     JB    PrintChar
  381.     ADD    AL,'A'-'0'-10
  382.  
  383. ; Print character
  384. ; In    AL = Character
  385.  
  386. PrintChar:
  387.  
  388.     MOV    DL,AL
  389.     MOV    AH,6
  390.     INT    DOS
  391.     RET
  392.  
  393. ; Saved interrupt numbers
  394.  
  395. SaveIntTab    DB    00H,02H,1BH,21H,23H,24H,34H,35H,36H,37H
  396.         DB    38H,39H,3AH,3BH,3CH,3DH,3EH,3FH,75H
  397. SaveIntCnt    EQU    $-SaveIntTab
  398.  
  399. ; Error strings
  400.  
  401. ErrorStr1    DB    'Runtime error ',0
  402. ErrorStr2    DB    ' at ',0
  403. ErrorStr3    DB    '.',cr,lf
  404.  
  405. ; Empty string
  406.  
  407. ZeroString    DB    0
  408.  
  409. ; Copyright notice
  410.  
  411. Copyright    DB    'Portions Copyright (c) 1983,92 Borland'
  412.  
  413. CODE    ENDS
  414.  
  415.     END
  416.