home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / jsage / znode3 / uploads / tpatch.lbr / NEWCHAIN.SZU / NEWCHAIN.SOU
Encoding:
Text File  |  1993-06-07  |  7.3 KB  |  379 lines

  1. ;*
  2. ;* NewChain - Herbert Oppmann 1/93
  3. ;*
  4.  
  5. AV        EQU    0    ;TP3.00 = 0, TP3.01 = 1
  6.  
  7. NCCmdLine    EXT
  8. NCStart        EXT
  9. NCLib        EXT
  10. NCSecBuf    EXT
  11.  
  12. InitCharIO    EQU    0364h+AV
  13. ParseAFN    EQU    03EEh+AV
  14. ToUpper        EQU    04A6h+AV
  15. OutOfMem    EQU    20A8h+AV
  16.  
  17. LF        EQU    10
  18. CR        EQU    13
  19. EOF        EQU    26
  20. FCBSize        EQU    33
  21. SecSize        EQU    80h
  22.  
  23. ConString    EQU    9
  24. OpenFile    EQU    15
  25. SetDMA        EQU    26
  26. GetSetUsr    EQU    32
  27. ReadRand    EQU    33
  28.  
  29. WBoot        EQU    000h
  30. CurrDU        EQU    004h
  31. BDOS        EQU    005h
  32. DefaultFCB    EQU    05Ch
  33. CmdLine        EQU    080h
  34. DefaultDMA    EQU    080h
  35. IORes        EQU    0D0h
  36. StandAlone    EQU    0D8h
  37. TPA        EQU    0100h
  38.  
  39. ;E: FilePointer in HL
  40. NewCh:        DEFB    3Eh        ;LD A,0AFh - Execute
  41.         XOR    A        ;- Chain
  42.         LD    (Flag),A
  43.     ;allowed?
  44.         LD    A,(HL)
  45.         AND    0Fh        ;File?
  46.         LD    A,20h        ;not allowed on a logical device
  47.         JR    NZ,NewChEr1
  48.         LD    A,(StandAlone)
  49.         AND    A
  50.         LD    A,21h        ;not allowed in direct mode
  51.         JR    Z,NewChEr1
  52.     ;calculate address of FCB, s1-Byte
  53.         LD    DE,12
  54.         ADD    HL,DE        ;point to FCB in FIB
  55.         LD    (FCBAddress),HL
  56.         LD    E,13        ;D=0
  57.         ADD    HL,DE        ;point to s1 byte
  58.         PUSH    HL
  59.     ;look if there is enough space for the overlay
  60.         LD    HL,(BDOS+1)
  61.         LD    DE,-200
  62.         ADD    HL,DE
  63.         LD    (ChainFCB),HL
  64.         LD    DE,NewChEnd
  65.         AND    A
  66.         SBC    HL,DE
  67.         JP    C,OutOfMem
  68.     ;get current user and save it
  69.         LD    A,0FFh
  70.         CALL    XUser        ;get current user
  71.         LD    (OldUser),A
  72.         LD    (DefaultA+13),A
  73.         LD    (DefaultB+13),A
  74.     ;save s1 byte
  75.         POP    HL
  76.         LD    A,(HL)
  77.         LD    (MyUser),A
  78.         PUSH    HL        ;save it for case of error
  79.     ;if bit 7 is not set then set user
  80.         BIT    7,A
  81.         CALL    Z,XUser
  82.     ;if NCLib =0 then open the file
  83.         LD    HL,(NCLib)
  84.         LD    A,H        ;library option?
  85.         OR    L
  86.         JR    NZ,NewCh1    ;yes -> don't open file
  87. FCBAddress    DEFL    $+1        ;InTheCode variable
  88.         LD    DE,0
  89.         LD    C,OpenFile
  90.         CALL    BDOS
  91.         INC    A        ;ok?
  92.         JR    NZ,NewCh1
  93.         LD    A,01h        ;file does not exist
  94.  
  95. NewChEr: ;restore user in s1 byte (for next try) and restore old user
  96.         POP    HL        ;HL= pointer to s1 byte in FCB
  97.         PUSH    AF        ;save error code
  98. MyUser        DEFL    $+1
  99.         LD    (HL),0        ;restore s1 byte
  100.         LD    A,(OldUser)
  101.         CALL    XUser
  102.         POP    AF
  103. NewChEr1:    LD    (IORes),A
  104.         RET
  105.  
  106. ;E: User or 0FFh in A
  107. ;V: AF, BC, DE, HL
  108. ;R: - or current user in A
  109. XUser:        LD    E,A
  110.         LD    C,GetSetUsr
  111.         JP    BDOS
  112.  
  113. NewCh1:    ;pointer to s1 byte on stack Stack for case of error
  114.     ;read in first sector and check
  115.         LD    DE,NCSecBuf
  116.         LD    C,SetDMA
  117.         CALL    BDOS
  118.         LD    DE,(FCBAddress)
  119.         LD    C,ReadRand
  120.         CALL    BDOS
  121.         OR    A        ;ok?
  122.         LD    A,99h        ;Unexpected end-of-file
  123.         JR    NZ,NewChEr
  124. Flag        DEFL    $+1        ;InTheCode
  125.         LD    A,0
  126.         AND    A        ;Zero = Chain, NZero = Execute
  127.         JR    NZ,NewCh2
  128.     ;Chain: plausibility check, version control
  129.         LD    A,0CEh        ;Chain/Execute error
  130.         LD    HL,(NCSecBuf+0)
  131.         LD    DE,0031h    ;LD SP,TPA
  132.         SBC    HL,DE
  133.         JR    NZ,NewChEr
  134.         LD    HL,(NCSecBuf+2)
  135.         LD    DE,2101h    ;LD HL,buffer_address
  136.         SBC    HL,DE
  137.         JR    NZ,NewChEr
  138.         LD    HL,(NCSecBuf+10) ;address of InitCharIO
  139.         LD    DE,InitCharIO
  140.         SBC    HL,DE        ;still NCarry from AND A above
  141.         JR    NZ,NewChEr
  142.         JR    NewCh3
  143.  
  144. CheckZ3:    LD    DE,Z3txt
  145.         LD    B,5
  146. CheckZ4:    LD    A,(DE)
  147.         CP    (HL)
  148.         RET    NZ
  149.         INC    HL
  150.         INC    DE
  151.         DJNZ    CheckZ4
  152.         RET
  153. Z3txt:        DEFB    'Z3ENV'
  154.  
  155. NewCh2:    ;Execute: if (my program is a Z3 program and) the called program
  156.     ;is a Z3 program, and we are running ZCPR, then see that the
  157.     ;overlay sets EnvPtr
  158.         LD    HL,TPA+3
  159.         CALL    CheckZ3
  160.         JR    NZ,NewCh3
  161.     ;supply address of Z3Env as a parameter to the program.
  162.     ;ZCPR does this, and some programs expect this!
  163.         LD    HL,(TPA+9)
  164.         LD    (Z3Adr),HL
  165.         LD    HL,NCSecBuf+3
  166.         CALL    CheckZ3
  167.         JR    NZ,NewCh3
  168.         LD    HL,(TPA+9)
  169.         LD    A,H
  170.         OR    L
  171.         JR    Z,NewCh3
  172.         LD    A,H
  173.         LD    (EnvPtrH),A
  174.         LD    A,L
  175.         LD    (EnvPtrL),A
  176.         LD    A,1
  177.         LD    (SetEP+Over),A
  178. NewCh3:    ;!! from now on, there is no way back, because vital parts of the
  179.     ;!! Turbo Pascal program are overwritten now
  180.     ;build commando line
  181.         XOR    A
  182.         LD    (CmdLine),A    ;empty
  183.         LD    HL,NCCmdLine
  184.         LD    A,7Eh        ;max. length
  185.         CP    (HL)
  186.         JR    C,NewCh4
  187.         LD    A,(HL)
  188. NewCh4: ;length in A
  189.         INC    HL        ;to first char
  190.         EX    DE,HL        ;save pointer in DE
  191.         LD    L,A        ;point to end
  192.         LD    H,0
  193.         ADD    HL,DE
  194.         LD    (HL),EOF    ;terminate string
  195.     ;build (copy) command line
  196.         CALL    SkipBlanks    ;empty string?
  197.         JR    Z,NewCh7    ;yes -> finish parsing
  198.         PUSH    DE
  199.         LD    HL,CmdLine+1
  200.         LD    (HL),' '
  201.         INC    HL
  202.         LD    B,1
  203. NewCh5:        LD    A,(DE)
  204.         CP    EOF
  205.         JR    Z,NewCh6
  206.         CALL    ToUpper        ;convert to uppercase
  207.         LD    (HL),A
  208.         INC    DE
  209.         INC    HL
  210.         INC    B
  211.         JR    NewCh5
  212.  
  213. NewCh6:        LD    (HL),H        ;=0 terminate
  214.         LD    A,B        ;length
  215.         LD    (CmdLine),A
  216.         POP    DE
  217.     ;set DefaultFCB
  218.         CALL    MyParseAFN
  219.         PUSH    DE
  220.         LD    DE,DefaultA
  221.         LDIR
  222.         POP    DE
  223.         CALL    SkipBlanks    ;now empty?
  224.         JR    Z,NewCh7    ;yes -> finish parsing
  225.         CALL    MyParseAFN
  226.         LD    DE,DefaultB
  227.         LDIR
  228. NewCh7:        LD    DE,DefaultFCB
  229.         LD    HL,DefaultA
  230.         LD    BC,32
  231.         LDIR
  232.     ;prepare overlay (OldUser is already set)
  233.         LD    HL,(ChainFCB)
  234.         LD    SP,HL
  235.         EX    DE,HL        ;save pointer to FCB
  236.         LD    HL,0-SecSize    ;InLass can't handle -SecSize properly..
  237.         ADD    HL,DE
  238.         LD    (MaxMem),HL
  239.         LD    HL,33        ;random record position
  240.         ADD    HL,DE
  241.         LD    (RRPos),HL
  242.         LD    HL,(FCBAddress)
  243.         LD    BC,36        ;copy FCB
  244.         LDIR
  245.         PUSH    DE        ;start address overlay
  246.         LD    HL,Msg
  247.         ADD    HL,DE
  248.         LD    (Message),HL
  249.         LD    HL,SetEP
  250.         ADD    HL,DE
  251.         LD    (SetEnvPtr),HL
  252.         LD    HL,Fill
  253.         ADD    HL,DE
  254.         LD    (FillEnd),HL
  255.         LD    A,(Flag)
  256.         AND    A
  257.         LD    HL,TPA        ;Chain is always startet at TPA
  258.         JR    Z,NewCh8
  259.         LD    HL,(NCStart)    ;Execute may be started elsewhere
  260. NewCh8:        LD    (StartAdr),HL
  261.         LD    HL,Over
  262.         LD    BC,OverLen
  263.         LDIR
  264.     ;now we have Zero if Chain/NZero else
  265.     ;own address to HL, load address to DE, length to BC,
  266.     ;(all other data are constants while the overlay is running
  267.     ;and are thus stored in the code).
  268.         LD    BC,(NCLib)    ;length in sectors
  269.         LD    DE,(TPA+1)    ;Chain is always loaded there
  270.         RET    Z
  271.         LD    DE,(NCStart)    ;Execute may get loaded elsewhere.
  272.         RET            ;Via this mechanism CIMs can be run too
  273.  
  274. SkipBlanks:    LD    A,(DE)
  275.         CP    EOF
  276.         RET    Z
  277.         CP    ' '
  278.         RET    NZ
  279.         INC    DE
  280.         JR    SkipBlanks
  281.  
  282. DefaultA:    DEFB    0,'           ',0,0,0,0
  283. DefaultB:    DEFB    0,'           ',0,0,0,0
  284.  
  285. MyParseAFN:    CALL    ParseAFN
  286.         LD    HL,DefaultFCB
  287.         LD    BC,16
  288.         LD    A,(DefaultFCB+13)
  289.         INC    A
  290.         RET    NZ
  291.         LD    C,12        ;User lassen
  292.         RET
  293.  
  294. ;E: NCarry, load address in DE, length in sectors in BC (0 means whole file)
  295. Over:    ;load
  296. MaxMem        DEFL    $+1
  297.         LD    HL,0
  298.         SBC    HL,DE
  299.         JR    NC,Over05
  300. Message        DEFL    $+1
  301.         LD    DE,0
  302.         LD    C,ConString
  303.         CALL    BDOS
  304.         JP    WBoot
  305. Msg        EQU    $-Over
  306.         DEFB    'Out of memory',CR,LF,'$'
  307. Over05:        PUSH    BC
  308.         PUSH    DE
  309.         LD    C,SetDMA
  310.         CALL    BDOS
  311. ChainFCB    DEFL    $+1
  312.         LD    DE,0
  313.         LD    C,ReadRand
  314.         CALL    BDOS
  315.         POP    DE
  316.         POP    BC
  317.         OR    A        ;ok?
  318.         JR    NZ,Over15
  319. SetEP        EQU    $+1-Over
  320.         LD    A,0
  321.         AND    A
  322.         JR    Z,Over08
  323.         XOR    A
  324. SetEnvPtr    DEFL    $+1
  325.         LD    (0),A
  326.         LD    HL,9
  327.         ADD    HL,DE
  328. EnvPtrL        DEFL    $+1
  329.         LD    (HL),0
  330.         INC    HL
  331. EnvPtrH        DEFL    $+1
  332.         LD    (HL),0
  333. ;Bump random record count, DMA, length
  334. RRPos        DEFL    $+1
  335. Over08:        LD    HL,0
  336.         INC    (HL)
  337.         JR    NZ,Over10
  338.         INC    HL
  339.         INC    (HL)
  340. Over10:        LD    HL,SecSize
  341.         ADD    HL,DE
  342.         EX    DE,HL
  343.         DEC    BC
  344.         LD    A,B        ;at end?
  345.         OR    C
  346.         JR    NZ,Over        ;no -> continue
  347. Over15:    ;set DMA and user
  348.         PUSH    DE        ;points behind loaded code
  349.         LD    DE,DefaultDMA
  350.         LD    C,SetDMA
  351.         CALL    BDOS
  352. OldUser        DEFL    $+1
  353.         LD    E,0
  354.         LD    C,GetSetUsr
  355.         CALL    BDOS
  356.         POP    DE
  357.     ;clear and start program
  358. FillEnd        DEFL    $+1
  359.         LD    HL,0
  360.         AND    A
  361.         SBC    HL,DE
  362.         EX    DE,HL
  363.         LD    B,0FFh
  364. Fill        EQU    $-Over
  365. Over20:        LD    (HL),B
  366.         INC    HL
  367.         DEC    DE
  368.         LD    A,D
  369.         OR    E
  370.         JR    NZ,Over20
  371. Z3Adr        DEFL    $+1
  372.         LD    HL,0
  373. StartAdr    DEFL    $+1
  374.         JP    0
  375. OverLen        EQU    $-Over
  376.  
  377. NewChEnd:
  378.         END
  379.