parserhook.z80 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. GrammerHook:
  2. .db 83h
  3. or a
  4. jr nz,exithook3
  5. di
  6. push hl
  7. push de
  8. push bc
  9. push af
  10. ld de,(progstart)
  11. ld a,(de)
  12. cp $5F ;make sure it is the prgm Token. I just realized that in older versions, you could have any 1-byte token instead of the prgm token!
  13. jr z,+_
  14. exithook1:
  15. pop af
  16. pop bc
  17. pop de
  18. pop hl
  19. exithook3:
  20. cp a
  21. ret
  22. _:
  23. ld hl,(progend)
  24. sbc hl,de
  25. inc de
  26. ld b,h
  27. ld c,l
  28. ld a,h
  29. or a
  30. jr z,+_
  31. ld bc,8
  32. _:
  33. ld a,c
  34. or a
  35. jr z,exithook1
  36. cp 9
  37. jr c,+_
  38. ld c,8
  39. _:
  40. ex de,hl
  41. ld de,OP1
  42. ld a,5
  43. ld (de),a
  44. inc de
  45. ldir
  46. xor a
  47. ld (de),a
  48. call SetUpData
  49. call IsOP1GrammerProg
  50. jr nz,+_
  51. ; ld hl,OP1
  52. ; ld de,OP5
  53. ; call mov9
  54. bcall(_OP1ToOP5)
  55. pop af
  56. pop bc
  57. pop de
  58. pop hl
  59. call SelectedProg
  60. or 1
  61. ret
  62. _:
  63. ld hl,cmdShadow+2 ;location of header
  64. ; ION =BB6DC918
  65. ; MOS =BB6DC901
  66. ; DCS7=BB6DAAC9
  67. ; Gram=BB6D55C9
  68. ld a,(hl) \ cp $BB \ jp nz,HookEnd
  69. inc hl \ ld a,(hl) \ cp $6D \ jp nz,HookEnd
  70. inc hl \ ld a,(hl) \ cp $C9 \ jp z,MOSIONErr
  71. ld c,a
  72. inc hl \ ld a,(hl) \ cp $C9 \ jp nz,HookEnd
  73. ld a,c \ cp $AA \ jp z,DCSErr
  74. #ifdef SHELL_BROKEN
  75. jp GramErr
  76. #endif
  77. HomeRunASM:
  78. ld hl,(TempWord5) \ ld bc,(TempWord4)
  79. jr nz,+_
  80. inc hl \ inc hl \ dec bc \ dec bc
  81. _:
  82. inc hl \ inc hl \ dec bc \ dec bc
  83. ld de,9D94h
  84. or a \ sbc hl,de
  85. add hl,de
  86. ld de,OP1
  87. jr nz,+_
  88. pop hl \ pop hl \ pop hl \ pop hl
  89. xor a
  90. ret
  91. _:
  92. ldir
  93. xor a
  94. ld (de),a
  95. ld a,5
  96. ld (OP1),a
  97. call SetUpData+3
  98. call IsOP1GrammerProg
  99. jr nz,EndHook
  100. ; ld hl,OP1
  101. ; ld de,OP5
  102. ; call mov9
  103. bcall(_OP1ToOP5)
  104. pop af
  105. pop bc
  106. pop de
  107. pop hl
  108. call SelectedProg
  109. or 1
  110. ret
  111. EndHook_prepush:
  112. push af
  113. push af
  114. push af
  115. push af
  116. EndHook:
  117. ld hl,cmdShadow+2 ;location of header
  118. ; ION =BB6DC918
  119. ; MOS =BB6DC901
  120. ; DCS7=BB6DAAC9
  121. ; Gram=BB6D55C9
  122. ld a,(hl) \ cp $BB \ jr nz,HookEnd
  123. inc hl \ ld a,(hl) \ cp $6D \ jr nz,HookEnd
  124. inc hl \ ld a,(hl) \ cp $C9
  125. jr z,HookEnd
  126. ld a,55h
  127. cp (hl)
  128. jr nz,HookEnd
  129. inc hl \ ld a,(hl) \ cp $C9
  130. jr c,+_
  131. add hl,bc
  132. _:
  133. push hl \ push bc
  134. ld h,b \ ld l,c
  135. bcall(_EnoughMem)
  136. jp c,ErrMEM
  137. ex de,hl
  138. ;HL # bytes
  139. ;DE addr
  140. ld de,9D95h ;start VarRAM
  141. push de
  142. bcall(_InsertMem)
  143. pop de \ pop bc \ pop hl
  144. ld a,(TempWord3)
  145. push de \ push bc
  146. call ReadArc
  147. ld hl,0
  148. add hl,sp
  149. ld (SPSave),hl
  150. call 9D95h ;start VarRAM
  151. pop de \ pop hl
  152. ;Delmem: HL address
  153. ; DE # of bytes
  154. bcall(_DelMem)
  155. ;===============================================================
  156. .db $F6 ;start of `or *`. Since `xor a`=AF !=0, this will result in the z flag reset, always.
  157. HookEnd:
  158. xor a
  159. pop hl
  160. ld a,h
  161. pop bc
  162. pop de
  163. pop hl
  164. ret
  165. CompatCall:
  166. call setupRAMdata
  167. IsOP1GrammerProg:
  168. ld (iy+UserFlags),8
  169. bcall(_ChkFindSym)
  170. ld (VATPtr),hl
  171. jp nc,isStartMenu_valid
  172. or 1
  173. ret