home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / jsage / znode3 / uploads / tpatch.lbr / TPATCH.ZZ0 / TPATCH.Z80
Encoding:
Text File  |  1993-06-07  |  27.9 KB  |  1,260 lines

  1. ;--------------------------------
  2. ;TPATCH.Z80    ho    02-JAN-93
  3. ;--------------------------------
  4. ;Die Patches sind nach aufsteigenden Adressen angeordnet,
  5. ;nicht nach funktionalem Zusammenhang.
  6.  
  7. TPVers        EQU    300
  8.  
  9.         .XLIST
  10. ;Diverse EQUs >>
  11. BELL        EQU    7
  12. TAB        EQU    9
  13. LF        EQU    10
  14. CR        EQU    13
  15. EOF        EQU    26
  16. BuffInput    EQU    10
  17. Reset        EQU    13
  18. DriveSelect    EQU    14
  19. OpenFile    EQU    15
  20. CloseFile    EQU    16
  21. SearchFirst    EQU    17
  22. DeleteFile    EQU    19
  23. WriteSeq    EQU    21
  24. RenameFile    EQU    23
  25. GetDrive    EQU    25
  26. SetDMA        EQU    26
  27. GetSetUsr    EQU    32
  28. ReadRand    EQU    33
  29. SecSize        EQU    128
  30. JumpOp        EQU    0C3h
  31.  
  32. ;Adressen Zeropage (CP/M, TP Variablen) >>
  33. CurrDU        EQU    004h
  34. BDOS        EQU    005h
  35. BreakEntry    EQU    038h
  36. DefaultFCB    EQU    05Ch
  37. CmdLine        EQU    080h
  38. IOJumps        EQU    0A0h
  39. HeapPtr        EQU    0C4h
  40. IORes        EQU    0D0h
  41. BufPos        EQU    0D2h
  42. BufNext        EQU    0D4h
  43. BufLast        EQU    0D6h
  44. StandAlone    EQU    0D8h
  45. OvrDrv        EQU    0DCh
  46. CBreak        EQU    0DDh
  47. FreeRoot    EQU    0DEh
  48. HLightFlag    EQU    0E0h
  49. OvrBegin    EQU    0E6h
  50. OvrLength    EQU    0E8h
  51. FIOFlag1    EQU    0E8h
  52.  
  53. ;Adressen Laufzeitbibliothek >>
  54. IF TPVers EQ 300
  55. RV        EQU    0        ;RTL Verschiebung
  56. EV1        EQU    0        ;Editor Verschiebung
  57. EV2        EQU    0
  58. ELSE
  59. RV        EQU    1
  60. EV1        EQU    -33
  61. EV2        EQU    -30
  62. ENDIF
  63.  
  64. OutString    EQU    01D0h
  65. Print        EQU    0200h+RV
  66. ClrScr        EQU    023Eh+RV
  67. InitCharIO    EQU    0364h+RV
  68. @IOJumps    EQU    03A5h+RV
  69. SConOut        EQU    03C9h+RV
  70. ParseAFN    EQU    03EEh+RV
  71. ParseFN        EQU    0406h+RV
  72. ParseFN5    EQU    0453h+RV
  73. FillSpace    EQU    047Bh+RV
  74. ToUpper        EQU    04A6h+RV
  75. CCompInts    EQU    0773h+RV    ;CompInts+1
  76. RandReal2    EQU    0FCDh+RV
  77. Int2Real    EQU    1008h+RV
  78. CheckDecim    EQU    1239h+RV
  79. Assign2        EQU    13A0h+RV
  80. ResetT        EQU    13FFh+RV
  81. FOpen1        EQU    144Eh+RV
  82. ClearFcb    EQU    145Ah+RV
  83. FClose        EQU    1481h+RV
  84. EdInit        EQU    14FDh+RV
  85. EdCR        EQU    1556h+RV
  86. ResetFO        EQU    1811h+RV
  87. INCWord        EQU    18D1h+RV
  88. FBDOS        EQU    19BAh+RV
  89. ResetF        EQU    1A70h+RV
  90. BlkRWErr    EQU    1AE9h+RV
  91. BlockRW2    EQU    1B10h+RV
  92. Erase        EQU    1B93h+RV
  93. Rename        EQU    1BA5h+RV
  94. Execute        EQU    1BEAh+RV
  95. Overlay        EQU    1C59h+RV
  96. JoinBl1        EQU    1E2Fh+RV
  97. InitHeap    EQU    1EAFh+RV
  98. ParamCnt1    EQU    1F9Dh+RV
  99. BreakHandler    EQU    1FFBh+RV
  100. RunTimErrX    EQU    2027h+RV
  101. RunTimErr    EQU    2029h+RV
  102. ERROR        EQU    202Ch+RV
  103. HaltProgram    EQU    20D4h+RV
  104.  
  105. ;Adressen Menue/Editor/Compiler >>
  106. EditComp    EQU    20E2h+RV
  107. InitMemIO    EQU    20E5h+RV
  108. Balken        EQU    2128h+RV
  109. WhoAmI        EQU    217Dh+EV1
  110. MainMenue    EQU    223Bh+EV1
  111. ShowMain    EQU    227Ah+EV1
  112. GetLine        EQU    2261h+EV1
  113. GetLine1    EQU    2270h+EV1
  114. ShowOpt1    EQU    2374h+EV1
  115. MJumps        EQU    2472h+EV1
  116. MMainF        EQU    249Ah+EV1
  117. MWorkF2        EQU    2506h+EV1
  118. MWorkF3        EQU    250Ch+EV1
  119. NotFoundJp    EQU    259Dh+EV1
  120. NewFile        EQU    25BCh+EV1
  121. AutoSaveQ    EQU    2601h+EV1
  122. AutoSaveQuest    EQU    262Bh+EV1
  123. MSave        EQU    2639h+EV1
  124. MSave1        EQU    2692h+EV1
  125. DefSBDOS    EQU    26D3h+EV1
  126. EClearFcb    EQU    26DCh+EV1
  127. L27EA        EQU    27EAh+EV1
  128. L2841        EQU    2841h+EV1
  129. L287B        EQU    287Bh+EV1
  130. L29F8        EQU    29F8h+EV1
  131. L2A41        EQU    2A41h+EV1
  132. L2AB5        EQU    2AB5h+EV1
  133. L2B7A        EQU    2B7Ah+EV1
  134. MDir        EQU    2B93h+EV1
  135. L2C29        EQU    2C29h+EV1
  136. L2C8D        EQU    2C8Dh+EV1
  137. MLogged        EQU    2CCEh+EV1
  138. ParsePAS    EQU    2D2Ah+EV1
  139. ParseEXT    EQU    2D2Fh+EV1
  140. WorkFGiven    EQU    2D4Bh+EV1
  141. L2D50        EQU    2D50h+EV1
  142. ECmpFiles    EQU    2D7Fh+EV1
  143. ClearText    EQU    2D8Fh+EV1
  144. ReadMSG        EQU    2DA4h+EV1
  145. PrintFName    EQU    2DF8h+EV1
  146. L2E20        EQU    2E20h+EV1
  147. OpenDefault    EQU    2E51h+EV1
  148. L3566        EQU    3566h+EV2
  149. EdiConO1    EQU    4220h+EV2
  150. L44D2        EQU    44D2h+EV2
  151. L44DF        EQU    44DFh+EV2
  152. L44E1        EQU    44E1h+EV2
  153. EndAddress    EQU    44F6h+EV2
  154. LoggedDrive     EQU    44F8h+EV2
  155. MainFCB        EQU    44F9h+EV2
  156. WorkFCB        EQU    451Dh+EV2
  157. MSGPresent    EQU    4541h+EV2
  158. LoggedUser    EQU    4543h+EV2    ;Wird bereits von Overlay gerettet.
  159.     ;War vorher zum Zaehlen der ausgegebenen Zeichen. Das muss aber nicht
  160.     ;gerettet werden und wird jetzt als InTheCode-Variable realisiert.
  161. $Overlay3    EQU    473Bh+EV2
  162. $Overlay11    EQU    4821h+EV2
  163. RWObjSec    EQU    6D09h+EV2
  164. ScanSpc18    EQU    70A7h+EV2
  165. RawInput3    EQU    721Ah+EV2
  166. SBDOS        EQU    7265h+EV2
  167. CDivInt        EQU    72AEh+EV2
  168. ErrAlw2        EQU    730Ch+EV2
  169. ObjFCB        EQU    7933h
  170. SecBuf        EQU    7957h
  171.  
  172.         .LIST
  173. ;-----------------------------------------
  174. ;    Patches Laufzeitbibliothek
  175. ;-----------------------------------------
  176. ;+ Fehler behoben bei Int2Real (Endlosschleife bei $8000)
  177. ;+ Screenreset
  178.  
  179. .COMMENT %---------------------------------------
  180. Fehler in OutString beheben: (Upgrade auf V3.01)
  181.  
  182.     RET    Z        ->    JR    NZ,OutString1
  183.     JR    OutString1  ->    OR    A        ;NCarry
  184.                 ->    RET
  185. ---------------------------------------% ;COMMENT
  186.  
  187.     ORG    0103h    ;Magic, Copyright. 33 Byte frei
  188.  
  189. ;ZCPR3-Programm
  190.         DEFB    'Z3ENV'        ;<- nach Programmstart koennen diese 6
  191.         DEFB    1        ;<- Byte bei Bedarf ueberschrieben werden
  192. z3env:        DEFW    0        ;=0109h
  193. ;=8 Byte lang
  194.  
  195. ;Editor umschaltbar
  196. EExtra:        LD    (BufNext),HL    ;erstmal Befehl nachholen
  197. EditFlag    EQU    $+1        ;=010Fh
  198.         LD    A,1        ;0= TP-Editor, <>0= BDOS-10
  199.         AND    A        ;normal?
  200.         JP    Z,EdInit    ;ja -> zurueck
  201. ;hier liessen sich zur Not noch drei Byte sparen, wenn man die
  202. ;oberen 4 Zeilen ersetzt durch:
  203. ;EditFlag:    JP    EdInit        bzw.    LD    DE,EdInit
  204. ;        (EditFlag = 0C3h)        (EditFlag = 11h)
  205.     ;HL= BufPos, C= Max.Laenge, B= Flag (0= input, <>0= CON:/TRM:)
  206.         LD    (HL),C
  207.         PUSH    BC
  208.         PUSH    HL
  209.         EX    DE,HL
  210.         LD    C,BuffInput
  211.         CALL    BDOS
  212.         POP    HL        ;=BufPos
  213.         LD    D,H
  214.         LD    E,L
  215.         INC    HL
  216.         LD    A,(HL)        ;tatsaechliche Laenge
  217.         INC    HL        ;zeigt auf erstes Zeichen
  218.  
  219.         DEFB    1        ;LD BC,.. Frequency maskieren!
  220. ;=25 lang, nix mehr frei
  221. ;Frequency:    DEFW    4
  222.     ORG    0126h    ;Version?, PatchArea, TermTypStr. 66 Byte frei
  223.  
  224.         AND    A        ;=0?
  225. ;hier kann zur Not 1 Byte gespart werden, wenn die folgende Zeile
  226. ;entfernt wird und LDIR ersetzt wird durch CALL NZ,LdirRet, wobei
  227. ;LdirRet nur die Befehle LDIR und RET ausfuehrt (z.B. bei PushVars
  228. ;in TP-RTL1.INC zu finden)
  229.         JR    Z,Leer
  230.         LD    C,A
  231.         LD    B,0
  232.         LDIR            ;alles um 2 nach vorne rutschen
  233. Leer:        EX    DE,HL        ;Zeiger hinter Ende nach HL
  234.         POP    BC        ;Flag holen
  235.         JP    EdCR        ;den Rest darf der alte Editor tun
  236. ;=13 lang (insgesamt, ohne Maskierung: 37)
  237.  
  238.  
  239. IExtra:        LD    A,C
  240.         OR    A
  241.         RET    Z
  242.         LD    A,JumpOp
  243.         LD    (BreakEntry),A
  244.         LD    HL,BreakHandler
  245.         LD    (BreakEntry+1),HL
  246.         RET
  247. ;=15 lang
  248.  
  249.  
  250. OExtra:        LD    (FIOFlag1),A    ;ueberschriebenen Befehl nachholen
  251. ;E: FilePointer in HL
  252. ;V: AF, BC / R:-
  253. OER:        PUSH    HL
  254.         LD    BC,12+13
  255.         ADD    HL,BC
  256.         BIT    7,(HL)        ;wenn Bit 7 gesetzt,
  257.         JR    Z,OER1
  258.         CALL    XUserFF        ;dann den akt. User
  259.         OR    80h        ;einsetzen, aber Bit 7
  260.         LD    (HL),A        ;gesetzt lassen
  261. OER1:        POP    HL
  262.         RET
  263. ;=20 lang
  264.  
  265.  
  266. ScreenReset:    LD    HL,ScreenStr
  267.         CALL    OutString
  268.         LD    A,(StandAlone)    ;Befehl nachholen
  269.         RET
  270. ;=10 Byte lang
  271. ScreenStr:    DEFB    1,18h,0,0,0,0,0,0
  272. ;zus. 66, nix mehr frei
  273.  
  274. .COMMENT %---------------------------------------
  275. TP-RTL1.INC, Ende von CsrXY:
  276. statt:        CALL    Delay
  277.         POP    HL
  278.         POP    DE
  279.         POP    BC
  280.         POP    AF
  281.         RET
  282. kuerzer:
  283.         JP    ClrDelIns+6
  284. spart 5 Byte.
  285. CALL NC,Delay geht, da NC von OutString wegen nicht-leerem Cursorsteuerstring.
  286. Und wenn der leer war, dann ist es auch kein Fehler, wenn nicht gewartet wird.
  287. Nachfolgend: InsNumber, kann einfach verschoben werden
  288. Befehl LD B,0 ist ueberfluessig, da nach LDIR bzw. DJNZ B=0
  289. Dadurch auf 8 Byte vergroesserbar. Evtl. sogar noch mehr.
  290. Oder: ein Befehl spaeter JR HLVideo1+3 spart auch 5 Byte.
  291. ---------------------------------------% ;COMMENT
  292.  
  293. ;Kommandozeile retten
  294. ;Wenn die Kommandozeile nicht kopiert wurde, ist der Inhalt von DE' uninteressant,
  295. ;da nach CALL InitCharIO das LD HL,Endadresse ausgefuehrt wird.
  296. ;Wurde die Kommandozeile allerdings kopiert, so enthaelt DE' die neue Adresse,
  297. ;welche in DefaultIO nach HL gebracht wird, und der Befehl LD HL,Endadresse wird
  298. ;nicht ausgefuehrt (Returnadresse wurde verbogen)
  299.     ORG    InitCharIO
  300.         EXX            ;BC und HL retten
  301.         LD    HL,CmdLine
  302.         LD    A,(HL)        ;Laenge der Kommandozeile
  303.         AND    A
  304.         JR    Z,NixTun
  305.         EX    (SP),HL        ;Returnadresse runter
  306.         INC    HL        ;Skip LD HL,...
  307.         LD    E,(HL)
  308.         INC    HL
  309.         LD    D,(HL)
  310.         INC    HL
  311.         EX    (SP),HL        ;wieder drauf
  312.     ;DE= Programmende (= Anfang Heap), HL= CmdLine, A= Laenge
  313.         LD    C,A        ;Bruttolaenge nach BC
  314.         LD    B,H        ;=0
  315.         INC    BC
  316.         PUSH    DE
  317.         LDIR
  318.         POP    HL
  319. NixTun:        LD    (ParamCnt1+1),HL
  320.     ;neue Endadresse nach DE', BC und HL holen
  321.         EXX
  322.         LD    (BufPos),HL
  323.         LD    A,B
  324.         LD    (CBreak),A
  325.         CALL    IExtra
  326. ;<fall through>
  327.  
  328. DefaultIO:    LD    HL,@IOJumps
  329.         LD    DE,IOJumps
  330.         LD    BC,8*3+6*2    ;FIBs gleich mit!
  331.         LDIR
  332.         LD    HL,IORes
  333.         LD    (HL),H        ;=0
  334.         INC    HL        ;BufLen
  335.         LD    (HL),7Eh
  336.         LD    L,LOW BufNext
  337.         CALL    Clear4Bytes
  338.         LD    L,LOW HLightFlag
  339.         LD    (HL),L        ;irgendwas, nur nicht 0 oder 0FFh
  340.         EXX
  341.         EX    DE,HL        ;neue Endadresse nach HL
  342.         RET
  343. ;DefaultIO =29 Bytes lang (im Original ist das Teil 43 Byte lang!)
  344.  
  345.  
  346. ;Parse-Routine aufblasen fuer User
  347. ;E: B=0! Das ist beim Aufruf von ParseAFN bzw. ParseUFN der Fall,
  348. ;da der vorhergehende Aufruf von FillSpace mit B=0 zurueckkommt.
  349. ;Im Menue ist jedoch eine einzige Stelle (ParseEXT in TP-ME2.INC),
  350. ;wo ParseFN direkt aufgerufen wird. Hier aufpassen!
  351.     ORG    ParseFN
  352.         PUSH    DE        ;merken fuer Fehlerfall
  353.         LD    A,(DE)        ;schauen, ob Laufwerk
  354.         CALL    ToUpper        ;angegeben:
  355.         CP    'A'        ;'A' bis 'P' zulaessig
  356.         JP    C,PExtra
  357.     ;hier koennte man zur Not noch 1 Byte sparen: JR C runter zum JP NZ,PExtra
  358.         CP    'P'+1
  359.         JP    NC,PExtra
  360.         SUB    'A'-1
  361.         LD    B,A        ;Drive merken
  362.     ;die naechsten drei Zeilen kann man durch CALL Ziffer+6
  363.     ;ersetzen, das spart ein Byte
  364.         INC    DE
  365.         LD    A,(DE)
  366.         CP    ':'
  367.         JP    NZ,PExtra
  368.     ;ok. nur Drive.
  369.         INC    DE
  370.         POP    HL        ;gemerkten Zeiger wegwerfen
  371.         JP    PutDrive
  372. PBack:        LD    (HL),B        ;Laufwerk ablegen
  373.  
  374. ;Veraendert A nicht. Wenn A veraendert werden darf, kann hier
  375. ;eine Version hin, die auch den Extent loescht, das spart bei
  376. ;den aufrufenden Routinen. Fuer Parse(A/U)FN ist A zwar egal,
  377. ;aber ich verzweige aus mehreren Routinen hierher, und alle
  378. ;Faelle zu verfolgen ohne dabei was zu uebersehen ...
  379. ;Da ging mir die Sicherheit vor maximaler Platzersparnis.
  380.     ORG    ParseFN5
  381.         LD    HL,DefaultFCB+14 ;Extent und s1 lassen
  382. XParseFN:    LD    B,22
  383.  
  384. .COMMENT %---------------------------------------
  385. TP-RTL4.INC, Ende von SinReal:
  386. SinReal5:    POP    AF
  387.         JP    NegateReal-1
  388. spart 6 Byte
  389. ---------------------------------------% ;COMMENT
  390.  
  391. ;Fehler bei Int2Real (Endlosschleife bei $8000)
  392.     ORG    Int2Real+11
  393.         LD    A,91h        ;+eins mehr
  394.         DEFB    6        ;+eingeflickt LD B,29h
  395. ;--- ab hier nur um eins nach hinten verschoben
  396. Int2Real1:    ADD    HL,HL
  397.         DEC    A
  398.         BIT    7,H
  399.         JR    Z,Int2Real1
  400.         LD    B,H
  401.         LD    C,L
  402.         LD    DE,0
  403.         LD    H,D
  404.         LD    L,A
  405.         EX    AF,AF'
  406. ;--- hier wird das eine Byte eingespart:
  407. ;--- statt RET NZ/RES 7,B/RET
  408.         JR    Z,RandReal2        ;=RES 7,B/RET
  409.         RET
  410.  
  411.     ORG    ResetT+1    ;RewriteT/ResetT
  412.         CALL    OExtra        ;User kompatibel
  413.     ORG    FOpen1-7    ;DeleteFile
  414.         CALL    XBDOS        ;User dazu
  415.     ORG    FOpen1+1    ;MakeFile
  416.         CALL    XBDOS        ;User dazu
  417.  
  418. ;bei FOpen s1-Byte nicht schrotten
  419.     ORG    ClearFcb+7
  420.         LD    (HL),0        ;Extent loeschen
  421.         INC    HL
  422.         INC    HL        ;s1-Byte lassen
  423.         JP    XParseFN    ;ParseFN5+3
  424.         DEFB    'h'        ;frei
  425.  
  426.     ORG    FClose+11
  427.         CALL    XBDOS        ;User dazu
  428.  
  429. ;Editor umschaltbar
  430.     ORG    EdInit-3
  431.         JP    EExtra
  432.  
  433. .COMMENT %---------------------------------------
  434. TP-RTL6B.INC, Ende von SeekEnd
  435. statt >>>
  436.         JR    Z,SeekEnd3
  437.         ...
  438.         JR    Z,SeekEnd2
  439.         ...
  440.         JR    Z,SeekEnd2
  441.         ...
  442.         JR    NC,SeekEnd3
  443.         ...
  444.         JR    Z,SeekEnd3
  445.         ...
  446. SeekEnd2:    LD    HL,1
  447.         RET
  448. SeekEnd3:    LD    HL,0
  449.         RET
  450.  
  451. kuerzer >>>
  452.         JR    Z,SeekEnd3
  453.         ...
  454.         JR    Z,SeekEnd2
  455.         ...
  456. SeekEnd2:    JP    Z,Equal (2.INC, = LD HL,1/RET Z/...)
  457.         ...
  458.         JP    NC,TruncReal3 (= LD HL,0/RET)
  459.         ...
  460. SeekEnd3:    JP    Z,TruncReal3
  461.         ...
  462.  
  463. Spart 8-3 = 5 Byte
  464. ---------------------------------------% ;COMMENT
  465.  
  466.     ORG    ResetFO+1    ;RewriteFO/ResetFO
  467.         CALL    OExtra        ;User kompatibel
  468.     ORG    FBDOS+22
  469.         CALL    XBDOS        ;User dazu
  470.     ORG    ResetF+1    ;RewriteF/ResetF
  471.         CALL    OExtra        ;User kompatibel
  472.     ORG    ResetF+33    ;FileSize
  473.         CALL    XBDOS        ;User dazu
  474.     ORG    BlockRW2+23    ;ReadRand/WriteRand
  475.         CALL    XBDOS        ;User dazu
  476.  
  477. ;Platz schaffen
  478.     ORG    Erase+4
  479.         CALL    OER        ;User kompatibel
  480.         LD    C,DeleteFile
  481.         CALL    FBDOS+17
  482.         INC    A
  483.         RET    NZ
  484. ;das ist vorverlegt
  485. ErrNoFile:    ;E: A=0!
  486.         INC    A        ;Fehler 01 'file does not exist'
  487.         JP    BlkRWErr    ;= LD (IORes),A/RET
  488.  
  489.     ORG    Rename+24
  490.         CALL    OER        ;User kompatibel
  491.         LD    DE,12
  492.         LD    B,D
  493.         LD    C,E
  494.         ADD    HL,DE
  495.         PUSH    HL        ;Zeiger auf FCB in FIB
  496.         LD    E,16
  497.         ADD    HL,DE        ;Zeiger auf zweite Haelfte
  498.         EX    DE,HL
  499.         LD    L,DefaultFCB    ;H=0 (war DE=16)
  500.         LDIR
  501.         POP    DE
  502.         PUSH    DE
  503.         LD    C,RenameFile
  504.         CALL    XBDOS
  505.         POP    DE
  506.         INC    A
  507.         JP    NZ,Assign2+13
  508.         JR    ErrNoFile
  509. ;hier jetzt 13 Byte Platz
  510.  
  511. ;E:- / V: AF, BC / R: akt. User in A
  512. XUserFF:    LD    A,0FFh
  513. ;E: User oder 0FFh in A
  514. ;V: AF, BC
  515. ;R: - oder akt. User in A
  516. XUser:        PUSH    DE
  517.         PUSH    HL
  518.         LD    E,A
  519.         LD    C,GetSetUsr
  520.         CALL    BDOS
  521.         POP    HL
  522.         POP    DE
  523.         RET
  524. ;=13 lang, nix mehr frei
  525.  
  526.  
  527. ;altes Chain/Execute totlegen
  528.     ORG    Execute
  529.         NOP
  530.         LD    A,0CEh        ;Chain/Execute-Fehler
  531.         JP    RunTimErrX
  532. ;ab hier jetzt 92 Byte frei
  533.  
  534.  
  535. ;BDOS-Funktion ausfuehren, aber
  536. ;- vorher User setzen (steht in s1-Byte des FCB) und nachher wieder dort eintragen
  537. ;- eingestellten User dabei nicht veraendern
  538. ;Ueberall anstelle des normalen BDOS-Aufrufs einsetzen,
  539. ;wo ein Zeiger auf einen FCB in DE uebergeben wird.
  540. ;Registerverwendung beim BDOS-Aufruf:
  541. ;E: C Funktionsnummer, DE zeigt auf FCB
  542. ;R: Status in A (Status auch in HL, dies wird aber nirgends verwendet)
  543. ;d.h. fuer mich, dass ich vor dem BDOS-Aufruf nur BC und DE
  544. ;und nach dem Aufruf AF zu retten brauche
  545. XBDOS:    ;eingestellten User holen
  546.         PUSH    BC
  547.         CALL    XUserFF
  548.         LD    (OldUsr),A
  549.     ;meinen User setzen (und merken)
  550.         LD    HL,13
  551.         ADD    HL,DE        ;Adresse des s1-Bytes im FCB
  552.         LD    A,(HL)        ;ausrechnen. Dort steht User.
  553.         LD    (MyUsr),A    ;holen und merken
  554.         AND    1Fh        ;Bit 7 loeschen
  555.         CALL    XUser
  556.         POP    BC
  557.     ;eigentliche Aktion
  558.         PUSH    HL
  559.         CALL    BDOS        ;BDOS-Aufruf, verwendet s1-Byte
  560.         POP    HL        ;HL= Zeiger auf s1-Byte in FCB
  561.     ;meinen User wieder in FCB eintragen
  562. MyUsr        EQU    $+1        ;InTheCode!
  563.         LD    (HL),0        ;User eintragen
  564.     ;vorherigen User wieder einstellen
  565.         PUSH    AF
  566. OldUsr        EQU    $+1
  567.         LD    A,0
  568.         CALL    XUser
  569.         POP    AF
  570.         RET
  571. ;=36 lang
  572.  
  573.  
  574. ;Parse-Routine aufblasen fuer User
  575. PExtra:        CALL    Ziffer
  576.         JR    Z,UserInL
  577.         LD    H,L
  578.         CALL    Ziffer
  579.         JR    NZ,PutCurrDU
  580.         LD    A,H
  581.         ADD    A,A
  582.         ADD    A,A
  583.         ADD    A,H
  584.         ADD    A,A
  585.         ADD    A,L
  586.         CP    32
  587.         JR    NC,PutCurrDU
  588.         LD    L,A
  589. UserInL:    LD    A,L
  590.         POP    HL        ;gemerkten Zeiger wegwerfen
  591.         INC    DE        ;Zeiger nach ':' richten
  592.         JR    PutDU
  593.  
  594. Ziffer:        CALL    CheckDecim
  595.         JR    NC,PutCDU    ;hier liesse sich noch durch
  596.         LD    L,A        ;einen unschoenen JP C,13E0h
  597.         INC    DE        ;ein Byte sparen
  598.         LD    A,(DE)
  599.         CP    ':'
  600.         RET
  601.  
  602. ;Fehler
  603. PutCDU:        POP    AF        ;werfe Returnadresse weg
  604. PutCurrDU:    POP    DE        ;gemerkten Zeiger holen
  605.         LD    B,0        ;akt. Drive
  606. ;Drive in B
  607. PutDrive:    LD    A,0FFh        ;eigentlich nur Bit 7 setzen
  608.                     ;Vermutlich ginge auch CPL.
  609. ;User in A, Drive in B
  610. PutDU:        LD    HL,DefaultFCB+12 ;Extent
  611.         LD    (HL),H        ;=0
  612.     ;Notwendig, da ParseFN5 Extent nicht loescht
  613.         INC    HL        ;s1
  614.         LD    (HL),A        ;User ablegen
  615.         LD    L,LOW DefaultFCB
  616.         JP    PBack
  617. ;=55 lang, 1 frei
  618.         DEFB    'h'        ;frei
  619.  
  620.  
  621. ;Overlay laden von Drive/User
  622.     ORG    Overlay
  623.         LD    (OvrBegin),HL
  624.         EX    DE,HL
  625.         LD    (OvrLength),HL
  626.         POP    HL        ;Zeiger auf Overlaybereich
  627.         PUSH    HL        ;auf Stack merken
  628.         LD    C,(HL)
  629.         LD    (HL),E
  630.         INC    HL
  631.         LD    B,(HL)
  632.         LD    (HL),D
  633.         EX    DE,HL
  634.         OR    A
  635.         SBC    HL,BC
  636.         JP    Z,Overlay3
  637.     ;DE zeigt 1 Byte vor Name
  638.         CALL    ParseFN5    ;FCB loeschen. H=0, B=0
  639.         EX    DE,HL
  640.         LD    E,DefaultFCB    ;das Byte vor dem Namen wird zwar
  641.         LD    C,12        ;unnoetigerweise mitkopiert, aber
  642.         LDIR            ;das erspart mir INC HL und INC DE
  643.         PUSH    HL
  644.         XOR    A
  645.         LD    (DE),A        ;Extent
  646.         INC    DE
  647.         CALL    XUserFF
  648.         LD    (DE),A        ;s1-Byte
  649.         PUSH    DE        ;Zeiger darauf merken
  650.         LD    E,DefaultFCB
  651.         LD    A,(OvrDrv)
  652.         LD    (DE),A
  653.         LD    C,OpenFile
  654.         CALL    XBDOS        ;nicht BDOS, sonst wird s1-Byte geschrottet
  655.         POP    HL        ;Zeiger auf s1-Byte
  656.         INC    A
  657.         JR    NZ,OverL1    ;hat geklappt -> weiter
  658.     ;nicht gefunden -> installierten DU:
  659. OUser        EQU    $+1
  660.         LD    (HL),0        ;User
  661.         LD    L,DefaultFCB
  662. ODrive        EQU    $+1
  663.         LD    (HL),0        ;Drive
  664.         EX    DE,HL
  665.         LD    C,OpenFile
  666.         CALL    XBDOS
  667.         INC    A
  668. OverL1:        POP    DE        ;zeigt auf Platz fuer Funktion
  669.         JR    Z,Overlay4    ;nein -> Fehler
  670.         LD    HL,(OvrBegin)
  671.         LD    (DefaultFCB+33),HL ;random record position
  672.         LD    BC,(OvrLength)
  673. Overlay2: ;Funktion einlesen
  674.         PUSH    BC
  675.         PUSH    DE
  676.         LD    C,SetDMA
  677.         CALL    BDOS
  678.         LD    DE,DefaultFCB
  679.         LD    C,ReadRand
  680.         CALL    XBDOS
  681.         POP    DE
  682.         POP    BC
  683.         OR    A
  684.         JR    NZ,Overlay4
  685.         LD    HL,DefaultFCB+33 ;random rec. Position
  686.         CALL    INCWord
  687.         LD    L,SecSize    ;H=0
  688.         ADD    HL,DE
  689.         EX    DE,HL
  690.         DEC    BC        ;Zaehler erniedrigen
  691.         LD    A,B        ;fertig?
  692.         OR    C
  693.         JR    NZ,Overlay2    ;nein -> weiterlesen
  694.     ;Datei schliessen
  695.         LD    DE,DefaultFCB
  696.         LD    C,CloseFile
  697.         JP    OVExtra
  698.  
  699. Overlay4: ;Fehler beim Oeffnen der Datei oder beim Lesen
  700.         LD    A,0F0h
  701.         JP    RunTimErrX
  702. ;1 frei
  703.         DEFB    'o'        ;frei!
  704.  
  705.     ORG    JoinBl1+3
  706.         JR    InitHX        ;InitHeap+3
  707. ;ab hier jetzt 9 Byte frei
  708.  
  709. OVExtra:    CALL    XBDOS
  710. Overlay3: ;Funktion starten
  711.         POP    HL        ;HL= OvrArea. Startadresse ausrechnen
  712.         LD    DE,13
  713.         ADD    HL,DE
  714.         JP    (HL)        ;los geht's
  715. ;=9 lang, nix mehr frei
  716.  
  717.     ORG    InitHeap
  718.         LD    (FreeRoot),HL
  719. InitHX:        LD    (HeapPtr),HL
  720. Clear4Bytes:
  721.  
  722.  
  723. ;Kommandozeile retten
  724.     ORG    ParamCnt1+3
  725.         LD    B,(HL)
  726.         RES    7,B        ;safety first
  727.         INC    HL
  728.         LD    C,0
  729. ParamCnt3:    INC    B
  730.         DEC    B
  731.         JR    Z,ParamCnt5
  732.         LD    A,(HL)
  733.         CP    ' '
  734.         JR    Z,ParamCnt4
  735.         CP    TAB
  736.         JR    NZ,ParamCnt5
  737. ParamCnt4:    INC    HL
  738.         DEC    B
  739.         JR    ParamCnt3
  740. ParamCnt5:    LD    E,L
  741.         LD    A,H
  742.         LD    (Spezial),A    ;HighByte retten!
  743. ParamCnt6:    INC    B
  744.         DEC    B
  745.         JR    Z,ParamCnt7
  746.         LD    A,(HL)
  747.         CP    ' '
  748.         JR    Z,ParamCnt7
  749.         CP    TAB
  750.         JR    Z,ParamCnt7
  751.         INC    HL
  752.         DEC    B
  753.         JR    ParamCnt6
  754.  
  755. ParamCnt7:    LD    A,L
  756.         SUB    E
  757.         JR    Z,ParamCnt8
  758.         INC    C
  759.         DEC    D
  760.         JR    NZ,ParamCnt3
  761. ParamCnt8:    LD    L,C
  762.         LD    H,0
  763. Spezial        EQU    $+1
  764.         LD    D,0        ;gemerkte Stelle auf Wort erweitern
  765.         RET
  766.  
  767.     ORG    ERROR+1
  768.         CALL    DefaultIO
  769.  
  770.     ORG    HaltProgram
  771.         CALL    ScreenReset
  772.  
  773.  
  774. ;-----------------------------------------
  775. ;    Patches Menue/Editor
  776. ;-----------------------------------------
  777. ;Da keine grossen Platzprobleme auch nicht sonderlich optimiert.
  778. ;Kann keine DIR:-Form.
  779. ;Eingabezeile des Editors fuer Dateinamen um eins vergroessert (15 -> 16)
  780. ;auf Kosten der Eingabezeile fuer den Options-String (10 -> 9)
  781. ;Grund: 'A10:FILENAME.TYP' = 16 Zeichen!
  782.  
  783.     ORG    EditComp
  784.         JP    OpeningMenue    ;Sprung anpassen
  785.  
  786.     ORG    Balken    ;und PrSpace, OpeningMenue(1). 85 bzw. 51 Bytes frei bis WhoAmI
  787. PrintFExtra:    CALL    SConOut        ;Befehl nachholen
  788.         LD    HL,13        ;s1-Byte holen
  789.         ADD    HL,DE
  790.         LD    A,(HL)
  791.         SCF
  792.  
  793. ;davor steht CALL SConOut, das veraendert AF nicht.
  794. ;davor steht ADD A,'A', das setzt NCarry und NZero
  795. ShowExtra: ;aktuellen User anzeigen. Sollte C nicht veraendern.
  796.         CALL    NC,XUserFF    ;hole aktuellen User
  797. ShowUser:    LD    B,'0'-1
  798. SubWeiter:    INC    B
  799.         SUB    10
  800.         JR    NC,SubWeiter
  801.         ADD    A,10+'0'
  802.         LD    H,A        ;merken
  803.         LD    A,B
  804.         CP    '0'
  805.         CALL    NZ,SConOut
  806.         LD    A,H
  807.         JP    SConOut
  808. ;=32 Byte lang
  809.  
  810. ParseExtra:    LD    B,C        ;=0
  811.         CALL    ParseFN        ;Befehl nachholen
  812. UserEintragen:    LD    A,(DefaultFCB+13) ;s1-Byte
  813.         INC    A        ;=0FFh?
  814.         RET    NZ        ;nein, dann war einer angegeben
  815.         CALL    XUserFF
  816.         LD    (DefaultFCB+13),A ;aktuellen eintragen
  817.         RET
  818. ;=16 Byte lang
  819. ;zus. 48, 37 bzw. 3 frei
  820.  
  821.  
  822. ;WhoAmI:    DEFB    'TURBO ...
  823. ;'duu:filename ' = 13 Zeichen Platz freihalten
  824.  
  825.  
  826.     ORG    WhoAmI+13    ;OpeningMenue(2). 102 Byte bis neues OpeningMenue
  827. ;Original, nur verschoben
  828. PrSpace:    CALL    Print
  829.         DEFB    ' ',0
  830.         DJNZ    PrSpace
  831.         RET
  832. ;=8 Byte lang
  833. ;Kann ich weg kriegen:
  834. ;L30F6 und L3D03 beide LD A,' '/CALL SConOut/DJNZ/RET.
  835. ;Wenn ich nun bei einem PUSH AF/CALL <den anderen>/POP AF/RET mache,
  836. ;dann entspricht das PrSpace.
  837.  
  838.  
  839. ;Erweiterung fuer MLogged um User
  840. ;Die folgenden 3 Zeilen lassen sich wegkriegen:
  841. ;1. Unterroutine GetCurrDU: LD A,(CurrDU)/AND 0Fh/RET (6 Byte)
  842. ;2. im Aufruf CALL M,GetCurrDU/LD H,A/JP MLExtra
  843. MLExtra:    LD    A,(CurrDU)
  844.         AND    0Fh
  845. DriveOk:    LD    H,A
  846.         LD    A,(DefaultFCB+13) ;User
  847.         LD    L,A
  848.         INC    A
  849.         LD    A,(CurrDU)
  850.         JR    Z,NoChange
  851.         LD    A,L
  852.         CP    16
  853.         RET    NC
  854.         CALL    XUser
  855.         LD    A,L
  856.         RLCA
  857.         RLCA
  858.         RLCA
  859.         RLCA
  860. NoChange:    AND    0F0h
  861.         OR    H
  862. JustReset:    PUSH    AF        ;wenn gewuenscht ist, dass nur das neue
  863.         LD    C,Reset        ;Ziellaufwerk zurueckgesetzt wird, dann
  864.         CALL    SBDOS        ;empfiehlt sich ShLeft (TP-RTL2.INC)
  865.         POP    AF        ;um die Maske zu erzeugen:
  866.         LD    (CurrDU),A    ;(Lw in B) LD HL,1/CALL ShLeft
  867.         AND    0Fh
  868.         LD    E,A        ;hier laesst sich 3 einsparen
  869.         LD    C,DriveSelect    ;durch JP 2C9Fh (in MDir)
  870.         JP    SBDOS
  871. ;=49 Byte lang
  872.  
  873.  
  874. ;beim Vergleichen von Dateinamen auch User mit vergleichen
  875. CmpFiles:    LD    DE,WorkFCB
  876.         LD    HL,MainFCB
  877.         LD    B,12
  878. CmpFil1:    LD    A,(DE)
  879.         SUB    (HL)
  880.         RET    NZ
  881.         INC    DE
  882.         INC    HL
  883.         DJNZ    CmpFil1
  884.     ;ab hier neu dazugekommen
  885.         INC    DE        ;ignoriere Extent
  886.         INC    HL
  887.         LD    A,(DE)        ;aber vergleiche s1-Byte
  888.         SUB    (HL)
  889.         RET
  890. ;=20 Byte lang
  891. ;zus. 77, 25 frei
  892.  
  893.  
  894. ;OpeningMenue weg, TURBO.MSG immer laden, aktuellen User als LoggedUser merken,
  895. ;Dateinamen aus der CP/M-Kommandozeile uebernehmen als Work- und Main-File
  896.     ORG    MainMenue-75
  897. OpeningMenue: ;Ende des verfuegbaren Speichers
  898.         LD    HL,(BDOS+1)
  899.         LD    BC,-708
  900.         ADD    HL,BC
  901.         LD    (EndAddress),HL
  902.     ;Logged DU
  903.         LD    C,GetDrive    ;mit CALL GetCurrD (s.o.) 2 einsparbar
  904.         CALL    BDOS
  905.         INC    A
  906.         LD    (LoggedDrive),A
  907.         CALL    XUserFF        ;hole aktuellen User
  908.         LD    (LoggedUser),A
  909.     ;Kommandozeile auswerten
  910.         LD    HL,CmdLine
  911.         LD    D,H        ;=0
  912.         LD    E,(HL)        ;Laenge
  913.         LD    (HL),H        ;=0. Wichtig fuer InitMemIO!
  914.         INC    HL
  915.         ADD    HL,DE
  916.         LD    (HL),EOF    ;mit EOF statt 0 terminieren
  917.         LD    E,CmdLine+1    ;D=0
  918.         ;die folgenden zwei Zeilen sind nicht unbedingt noetig,
  919.         ;sofern man TURBO nicht mit GO starten will
  920.         XOR    A
  921.         LD    (WorkFCB+1),A    ;kein Workfile
  922.         CALL    GetLine1
  923.         JR    Z,OpeningM1
  924.         CALL    ParsePAS
  925.         PUSH    DE
  926.         LD    DE,WorkFCB
  927.         CALL    Assign2+13    ;DefaultFCB kopieren
  928.         POP    DE
  929.         CALL    GetLine1
  930.         CALL    MMainF+26
  931. OpeningM1:    CALL    InitMemIO
  932.     ;Messages und Workfile einlesen
  933. LoadMenue    EQU    $+1        ;Installierbar: 0CDh= ja, 21h= nein
  934.         CALL    ReadMSG
  935.         CALL    MyWorkF        ;WorkFile einlesen
  936.     ;    CALL    ShowMain
  937. ;hier schliesst sich MainMenue an
  938. ;=75
  939.  
  940. ;Im Hauptmenue 'Logged Drive:' --> 'Logged DU:'
  941.     ORG    ShowMain+13
  942.         DEFB    'DU:',' '+80h,0
  943.         LD    C,GetDrive    ;mit CALL GetCurrD (s.o.) 2 einsparbar
  944.         CALL    BDOS
  945.         ADD    A,'A'
  946.         CALL    SConOut
  947.         CALL    ShowExtra
  948.  
  949.     ORG    ShowOpt1+2
  950.         JP    PrSpace        ;Sprung anpassen
  951.  
  952.     ORG    MJumps+2
  953.         DEFW    MWorkF        ;Sprung anpassen
  954.  
  955.     ORG    MMainF+38
  956.         JP    Assign2+13    ;= LD HL,DefaultFCB/LD BC,36/LDIR/RET
  957. ;--- MWorkF Original, rutscht nur 6 Byte nach oben
  958. MWorkF:        LD    HL,NewFile
  959.         LD    (NotFoundJp+1),HL
  960.         CALL    AutoSaveQ
  961.         CALL    Print
  962.         DEFB    CR,LF,'Work file name',0
  963.         CALL    GetLine
  964.         LD    A,0
  965.         LD    (WorkFCB+1),A
  966.         JR    NZ,MWorkF1
  967.         CALL    ClearText
  968.         JP    MainMenue
  969.  
  970. MWorkF1:    CALL    ParsePAS
  971.         LD    DE,WorkFCB
  972. ;--- ab hier neu
  973.         CALL    Assign2+13
  974.         JR    MWorkF3        ;ab hier jetzt 11 Byte frei
  975.  
  976. MyWorkF:    CALL    WorkFGiven
  977.         JP    Z,ClearText
  978.         LD    HL,NewFile
  979.         JR    MWorkF2+3    ;= LD (NotFoundJp+1),HL/MWorkF3
  980. ;=11 Byte lang, nix mehr frei
  981.  
  982. ;Pieps vor AutoSave (Holger special)
  983. ;Problem: wenn man den aktuellen WorkFile geaendert hatte und einen
  984. ;neuen WorkFile waehlen moechte, dann kommt die Frage: 'Save? (Y/N)'.
  985. ;Wenn man aber nicht hinschaut, sondern den neuen Dateinamen blind
  986. ;eingibt, und dieser zufaellig ein 'N' enthaelt, dann wird der geaenderte
  987. ;aktuelle WorkFile weggeworfen ... Deshalb bei dieser Frage piepsen.
  988.     ORG    AutoSaveQuest
  989.         DEFB    'Save',BELL
  990.  
  991. ;User dazu
  992.     ORG    MSave+48    ;DeleteFile
  993.         CALL    SXBDOS
  994.     ORG    MSave1+6    ;MakeFile
  995.         CALL    SXBDOS
  996.     ORG    DefSBDOS+3
  997.         JP    SXBDOS
  998.  
  999.  
  1000. ;s1-Byte stehenlassen
  1001.     ORG    EClearFcb
  1002.         LD    HL,12
  1003.         JP    ClearFcb+6    ;in ClearFcb von Laufzeitbibliothek
  1004. ;ab hier jetzt 11 Byte frei
  1005.  
  1006. ;LoggedDrive + LoggedUser an Overlay uebergeben
  1007. OverExtra:    LD    A,(LoggedDrive)
  1008.         LD    H,A
  1009.         LD    A,(LoggedUser)
  1010.         LD    L,A
  1011.         RET
  1012. ;= 9 Byte lang
  1013.         DEFB    'ho'        ;2 frei
  1014.  
  1015.  
  1016. ;CmpFiles-Aufruf umbiegen
  1017.     ORG    L27EA
  1018.         CALL    CmpFiles
  1019.  
  1020.  
  1021. ;User dazu
  1022.     ORG    L2841+32    ;MCompile DeleteFile
  1023.         CALL    SXBDOS
  1024.     ORG    L2841+38    ;MCompile MakeFile
  1025.         CALL    SXBDOS
  1026.  
  1027.  
  1028. ;MCompile: z3env in generiertem COM-File auf Null setzen
  1029.     ORG    L287B+15    ;MCompile WriteSeq
  1030.         LD    HL,(z3env)
  1031.         PUSH    HL
  1032.         LD    C,SetDMA
  1033.         CALL    CompExtra
  1034.         POP    HL
  1035.         LD    (z3env),HL
  1036.  
  1037.  
  1038. ;Kopieren von Drive/Name: User mitnehmen
  1039.     ORG    L29F8+24    ;in MCompile
  1040.         LD    BC,14        ;statt 12
  1041.     ORG    L2A41+11
  1042.         LD    BC,14
  1043.     ORG    L2AB5+3    ;in MRun
  1044.         LD    BC,14
  1045.  
  1046. ;User dazu
  1047.     ORG    L2AB5+28    ;MRun OpenFile
  1048.         CALL    SXBDOS
  1049.  
  1050.  
  1051. ;Aufruf des Overlays: LoggedUser mit uebergeben
  1052.     ORG    L2B7A+2
  1053.         CALL    OverExtra
  1054.         PUSH    HL
  1055.  
  1056.  
  1057. ;akt. User verwenden wenn keiner angegeben wurde
  1058.     ORG    MDir+18        ;nach CALL ParseAFN
  1059.         CALL    UserEintragen    ;<-- zusaetzlich
  1060. ;--- ab hier Original, nur um drei nach hinten verschoben
  1061.         LD    C,GetDrive    ;mit CALL GetCurrD (s.o.) 2 einsparbar
  1062.         CALL    SBDOS
  1063.         PUSH    AF
  1064.         PUSH    AF
  1065.         LD    A,(DefaultFCB)
  1066.         OR    A
  1067.         JR    Z,L2BBB
  1068.         POP    HL
  1069.         DEC    A
  1070.         LD    E,A
  1071.         PUSH    AF
  1072.         LD    C,DriveSelect
  1073.         CALL    SBDOS
  1074. L2BBB:        POP    AF
  1075.         ADD    A,'A'
  1076.         LD    (L2C8D),A
  1077.         LD    DE,SecBuf
  1078.         LD    C,SetDMA
  1079.         CALL    SBDOS
  1080.         LD    DE,0
  1081.         LD    C,SearchFirst
  1082. L2BCE:        PUSH    DE
  1083.         CALL    DefSBDOS
  1084.         POP    DE
  1085. ;--- das hier ist um drei kuerzer    ;war:
  1086.         INC    A        ;LD C,A/INC A
  1087.         JR    Z,L2C29
  1088.         DEC    A        ;LD A,C/ADD A,A/ADD A,A
  1089.         RRCA            ;ADD A,A
  1090.         RRCA            ;ADD A,A
  1091.         RRCA            ;ADD A,A
  1092. ;--- bis hierher
  1093.     ORG    L2C29-2
  1094.         JR    L2BCE        ;Sprung korrigieren
  1095.  
  1096.  
  1097. ;MLogged aufblasen fuer DU-Form
  1098.     ORG    MLogged+7
  1099.         DEFB    'DU',0
  1100.         CALL    GetLine
  1101.         LD    A,(CurrDU)
  1102.         JP    Z,JustReset
  1103.         LD    HL,(BufLast)
  1104.         LD    (HL),EOF
  1105.         DEC    HL
  1106.         LD    (HL),':'
  1107.         CALL    ParseAFN
  1108.         LD    A,(DE)        ;muss alles verdaut sein
  1109.         CP    EOF
  1110.         RET    NZ
  1111.         LD    A,(DefaultFCB+1) ;es darf kein Dateiname angegeben sein
  1112.         CP    '?'
  1113.         RET    NZ
  1114.         LD    A,(DefaultFCB)    ;Drive
  1115.         DEC    A
  1116.         JP    P,DriveOk    ;hier auch:
  1117.         JP    MLExtra        ;CALL M,GetCurrD/LD H,A/JP MLExtra
  1118.         DEFB    'h'        ;frei
  1119.  
  1120.  
  1121. ;akt. User verwenden wenn keiner angegeben wurde
  1122.     ORG    ParseEXT+8
  1123.         CALL    ParseExtra
  1124.  
  1125.     ORG    L2D50+10
  1126.         CALL    MWorkF    ;Sprung anpassen
  1127.  
  1128.  
  1129.     ORG    ECmpFiles    ;CmpFiles ist ausgelagert. 16 Byte Platz
  1130. ;Versuch starten mit Drive=A, User=B,
  1131. ;sofern nicht gerade schon dort nachgesehen wurde
  1132. XOpenDefault:    CP    (HL)
  1133.         LD    (HL),A
  1134.         JR    NZ,XOpenDef1
  1135.         LD    A,(DefaultFCB+13)
  1136.         CP    B
  1137.         RET    Z
  1138. XOpenDef1:    LD    A,B
  1139.         LD    (DefaultFCB+13),A
  1140.         JP    OpenDefault    ;etwas zu weit fuer JR
  1141. ;=16 Byte lang, nix frei
  1142.  
  1143.  
  1144. ;PrintFName um Anzeige von User erweitern
  1145.     ORG    PrintFName+8
  1146.         PUSH    HL
  1147.         CALL    PrintFExtra
  1148.         POP    HL
  1149.         LD    A,':'
  1150.         CALL    SConOut
  1151.  
  1152.  
  1153. ;Suchen von Dateien anhand Pfad: User dazu
  1154.     ORG    L2E20+10
  1155.         LD    A,(LoggedUser)
  1156.         LD    B,A
  1157.         LD    A,(LoggedDrive)
  1158.         CALL    XOpenDefault
  1159.         RET    NZ
  1160. ;Installierbarer DU:
  1161.         LD    A,10
  1162. SearchDisk    EQU    $-1
  1163.         LD    B,10
  1164. SearchUser    EQU    $-1
  1165.         CALL    XOpenDefault
  1166.         RET    NZ
  1167.  
  1168. .COMMENT %---------------------------------------
  1169. Zeichen mit gesetztem Bit 7 behandeln: (Upgrade auf V3.01)
  1170. L2F3A+5:    JR    Z,L2F44   ->    JR    NC,L2F44
  1171.  
  1172. L2FA8+5:              ->    CP    DEL
  1173.                   ->    RET    NC
  1174. ---------------------------------------% ;COMMENT
  1175.  
  1176. .COMMENT %---------------------------------------
  1177. TP-ME2.INC, L33E4 (IsAlsum des Editors):
  1178.         CALL    IsAlnum (des Compilers)
  1179.         CCF
  1180.         RET
  1181. spart 18 Byte
  1182. ---------------------------------------% ;COMMENT
  1183.  
  1184. ;Eingabezeile des Editors fuer Dateinamen um eins vergroessern
  1185. ;auf Kosten des Options-Strings
  1186.     ORG    L3566
  1187.         LD    DE,L44DF-1
  1188.     ORG    L3566+6
  1189.         LD    DE,L44E1-1
  1190.  
  1191. ;L4543 freimachen fuer LoggedDrive
  1192.     ORG    EdiConO1
  1193.         LD    A,0
  1194. CountChars    EQU    $-1        ;InTheCode!
  1195.         NOP
  1196.         SUB    2
  1197.         LD    (CountChars),A
  1198.  
  1199.  
  1200. ;Eingabezeile des Editors fuer Dateinamen um eins vergroessern
  1201.     ORG    L44D2
  1202.         DEFB    9
  1203.     ORG    L44DF-1
  1204.         DEFB    16,0
  1205.  
  1206. ;-----------------------------------------
  1207. ;    Patches Compiler
  1208. ;-----------------------------------------
  1209. ;Erzeugung von Overlay-Dateien: User nicht schrotten
  1210. ;CALL 1460h ist auch moeglich, aber die Platzersparnis bringt hier nix
  1211. ;Lieber weniger Taktzyklen.
  1212.     ORG    $Overlay3+54
  1213.         LD    (HL),0        ;Extent loeschen
  1214.         INC    HL
  1215.         INC    HL
  1216.         CALL    XParseFN
  1217.  
  1218. ;User dazu
  1219.     ORG    $Overlay3+67    ;Overlay: DeleteFile
  1220.         CALL    SXBDOS
  1221.     ORG    $Overlay3+73    ;Overlay: MakeFile
  1222.         CALL    SXBDOS
  1223.     ORG    $Overlay11-3    ;Overlay: CloseFile
  1224.         CALL    SXBDOS
  1225.     ORG    RWObjSec+13    ;Patches: ReadRand/WriteRand
  1226.         CALL    SXBDOS
  1227.     ORG    ScanSpc18+23    ;ScanSpace: OpenFile
  1228.         CALL    SXBDOS
  1229.     ORG    RawInput3+12    ;RawInput: ReadSeq
  1230.         CALL    SXBDOS
  1231.     ORG    ErrAlw2+11    ;ErrAlways: CloseFile
  1232.         CALL    SXBDOS
  1233.  
  1234. .COMMENT %---------------------------------------
  1235. TP-C6.INC, IsNumber, CCompInts:
  1236. Umleiten auf entsprechende Routinen in Laufzeitbibliothek
  1237. spart 7+13 (abzueglich Umleitung)
  1238. CMultInt geht leider nicht so einfach, da etwas anders.
  1239. ---------------------------------------% ;COMMENT
  1240.  
  1241. ;die Divisionsroutine wird nirgendwo verwendet!
  1242.     ORG    CDivInt    ;26 Byte Platz
  1243. CompExtra:    CALL    SBDOS        ;SetDMA
  1244.         LD    HL,0
  1245.         LD    (z3env),HL
  1246.         LD    C,WriteSeq
  1247.         LD    DE,ObjFCB
  1248. ;<fall through> =14 Byte
  1249.  
  1250. ;SBDOS mit User
  1251. SXBDOS:        PUSH    IX
  1252.         PUSH    IY
  1253.         CALL    XBDOS
  1254.         JR    SBDOS+7        ;JP wenn nicht an dieser Stelle,+1 Byte
  1255. ;=9 Byte lang
  1256. ;zus. 23, 3 Byte frei
  1257.         DEFB    'hoh'
  1258.  
  1259.         END
  1260.