LOWLEVEL.ASM 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887
  1. ; $Header: D:/logfiles/masters/lowlvasm.jpv 1.2 27 May 1991 19:00:10 coleb $
  2. ;
  3. ; LOWLEVEL.ASM
  4. ;
  5. ; Assembly routines for LowLevel module from PMI.
  6. ; JPI version
  7. ;
  8. ; For Repertoire Version 1.6
  9. ;
  10. LowLevel_TEXT SEGMENT BYTE 'CODE' PUBLIC
  11. LowLevel_TEXT ENDS
  12. _BSS SEGMENT BYTE 'BSS' PUBLIC
  13. LowLevel@Initialized DW ?
  14. _BSS ENDS
  15. _CONST SEGMENT BYTE 'DATA' PUBLIC
  16. _CONST ENDS
  17. DGROUP GROUP _CONST, _BSS
  18. ;============================================================================
  19. _CONST SEGMENT
  20. ;----------------------------------------------------------------------------
  21. PUBLIC LowLevel$
  22. LowLevel$ DD LowLevel$Init
  23. DB 255
  24. DB 255
  25. _CONST ENDS
  26. ;============================================================================
  27. ASSUME CS:LowLevel_TEXT
  28. ASSUME DS:_BSS
  29. LowLevel_TEXT SEGMENT
  30. ;----------------------------------------------------------------------------
  31. PUBLIC LowLevel$Init
  32. EXTRN _api_init:FAR
  33. LowLevel$Init PROC FAR
  34. PUSH DS
  35. MOV AX, _BSS
  36. MOV DS, AX
  37. MOV AX, LowLevel@Initialized
  38. CMP AX, 1
  39. JE InitEnd
  40. call _api_init
  41. MOV AX, 1
  42. MOV LowLevel@Initialized, AX
  43. InitEnd:
  44. POP DS
  45. RET 0
  46. LowLevel$Init ENDP
  47. ;----------------------------------------------------------------------------
  48. PUBLIC LowLevel$AddAddr
  49. LowLevel$AddAddr PROC FAR
  50. PUSH BP ;Set up stack frame
  51. MOV BP, SP
  52. MOV AX, 6[BP] ;bytes to add to address
  53. ADD AX, 8[BP] ;offset of address
  54. MOV DX, 10[BP] ;segment of address
  55. POP BP ;restore frame pointer
  56. RET 6
  57. LowLevel$AddAddr ENDP
  58. ;----------------------------------------------------------------------------
  59. PUBLIC LowLevel$BitwiseAnd
  60. LowLevel$BitwiseAnd PROC FAR
  61. PUSH BP ;Set up stack frame
  62. MOV BP, SP
  63. MOV AX, 8[BP] ;val1 goes into AX
  64. AND AX, 6[BP] ;AND it with val2; result stays in AX
  65. POP BP ;restore frame pointer
  66. RET 4
  67. LowLevel$BitwiseAnd ENDP
  68. ;----------------------------------------------------------------------------
  69. PUBLIC LowLevel$SubAddr
  70. LowLevel$SubAddr PROC FAR
  71. PUSH BP ;Set up stack frame
  72. MOV BP, SP
  73. MOV AX, 8[BP] ;offset of old address
  74. SUB AX, 6[BP] ;subtract bytes
  75. MOV DX, 10[BP] ;segment of address
  76. POP BP ;restore frame pointer
  77. RET 6
  78. LowLevel$SubAddr ENDP
  79. ;----------------------------------------------------------------------------
  80. PUBLIC LowLevel$DecAddr
  81. LowLevel$DecAddr PROC FAR
  82. PUSH BP ;Set up stack frame
  83. MOV BP, SP
  84. PUSH BX
  85. MOV AX, 6[BP] ;bytes to subtract from address
  86. LES BX, 8[BP] ;address of TheAdr
  87. SUB ES:[BX], AX ;subtract from address
  88. POP BX
  89. POP BP ;restore frame pointer
  90. RET 6
  91. LowLevel$DecAddr ENDP
  92. ;----------------------------------------------------------------------------
  93. PUBLIC LowLevel$IncAddr
  94. LowLevel$IncAddr PROC FAR
  95. PUSH BP ;Set up stack frame
  96. MOV BP, SP
  97. PUSH BX
  98. MOV AX, 6[BP] ;bytes to add address
  99. LES BX, 8[BP]
  100. ADD ES:[BX], AX ;add to address
  101. POP BX
  102. POP BP ;restore frame pointer
  103. RET 6
  104. LowLevel$IncAddr ENDP
  105. ;----------------------------------------------------------------------------
  106. PUBLIC LowLevel$InByte
  107. LowLevel$InByte PROC FAR
  108. PUSH BP ;set up frame pointer
  109. MOV BP, SP
  110. PUSH BX
  111. MOV DX, 10[BP] ;Port
  112. IN AL, DX ;Get the byte
  113. LES BX, 6[BP] ;Address of value
  114. MOV ES:[BX], AL ;Store it
  115. POP BX
  116. POP BP ;restore frame pointer
  117. RET 6
  118. LowLevel$InByte ENDP
  119. ;----------------------------------------------------------------------------
  120. PUBLIC LowLevel$OutByte
  121. LowLevel$OutByte PROC FAR
  122. PUSH BP ;set up frame pointer
  123. MOV BP, SP
  124. MOV DX, 8[BP] ;Port
  125. MOV AL, 6[BP] ;value
  126. OUT DX, AL ;Put the byte
  127. POP BP ;restore frame pointer
  128. RET 4
  129. LowLevel$OutByte ENDP
  130. ;----------------------------------------------------------------------------
  131. PUBLIC LowLevel$OutWord
  132. LowLevel$OutWord PROC FAR
  133. PUSH BP ;set up frame pointer
  134. MOV BP, SP
  135. MOV DX, 8[BP] ;Port
  136. MOV AX, 6[BP] ;value
  137. OUT DX, AX ;Put the word
  138. POP BP ;restore frame pointer
  139. RET 4
  140. LowLevel$OutWord ENDP
  141. ;----------------------------------------------------------------------------
  142. PUBLIC LowLevel$InWord
  143. LowLevel$InWord PROC FAR
  144. PUSH BP ;set up frame pointer
  145. MOV BP, SP
  146. PUSH BX
  147. MOV DX, 10[BP] ;Port
  148. IN AX, DX ;Get the byte
  149. LES BX, 6[BP] ;Address of value
  150. MOV ES:[BX], AX ;Store it
  151. POP BX
  152. POP BP ;restore frame pointer
  153. RET 6
  154. LowLevel$InWord ENDP
  155. ;----------------------------------------------------------------------------
  156. PUBLIC LowLevel$Interrupt
  157. IntParams STRUC
  158. DW ?, ?, ?
  159. TheRegs DD ?
  160. InterruptNumber DW ?
  161. IntParams ENDS
  162. LowLevel$Interrupt PROC FAR
  163. PUSH BP ;Set up stack frame
  164. MOV BP, SP
  165. PUSH BX ;Save needed registers
  166. PUSH CX
  167. PUSH SI
  168. PUSH DI
  169. PUSH DS
  170. MOV AX, SS ;Save stack seg and pointer
  171. MOV CS:StackSeg, AX ;since some interrupts may clobber them
  172. MOV CS:StackPtr, SP
  173. ;
  174. ; Set up the stack to fake an interrupt by doing a jump
  175. ;
  176. PUSHF ;Flags
  177. PUSH CS
  178. LEA AX, IntRet ;Interrupt return point
  179. PUSH AX
  180. MOV BX, InterruptNumber[BP] ;Interrupt number
  181. SHL BX, 1 ;Convert to long address
  182. SHL BX, 1
  183. XOR AX, AX ;Segment 0
  184. MOV DS, AX
  185. PUSH 2[BX] ;Interrupt handler segment
  186. PUSH [BX] ;Interrupt handler offset
  187. ;
  188. ; Set up the registers as requested in TheRegs from the calling
  189. ; parameters
  190. ;
  191. LDS SI, TheRegs[BP] ;Pointer to record
  192. MOV AX, [SI]
  193. MOV BX, 2[SI]
  194. MOV CX, 4[SI]
  195. MOV DX, 6[SI]
  196. MOV BP, 8[SI]
  197. PUSH 10[SI] ;Not ready for this yet
  198. MOV DI, 12[SI]
  199. MOV ES, 16[SI]
  200. MOV DS, 14[SI]
  201. POP SI ;Now I'm ready for it
  202. RET ;do the interrupt
  203. IntRet:
  204. PUSH CS:StackSeg ;old stack segment
  205. POP SS
  206. MOV SP, CS:StackPtr ;old stack pointer
  207. PUSHF ;returned flags
  208. PUSH BP ;save this too
  209. MOV BP, SP ;old frame pointer
  210. ADD BP, 14 ;allow for stuff on stack
  211. PUSH DS ;Need these for output
  212. PUSH DI
  213. LDS DI, TheRegs[BP] ;Address of register structure
  214. POP 12[DI] ;Returned DI
  215. POP 14[DI] ;Returned DS
  216. POP 8[DI] ;Returned BP
  217. MOV [DI], AX
  218. MOV 2[DI], BX
  219. MOV 4[DI], CX
  220. MOV 6[DI], DX
  221. MOV 10[DI], SI
  222. MOV 16[DI], ES
  223. POP 18[DI] ;flags
  224. ;
  225. ; Restore registers and return
  226. ;
  227. POP DS
  228. POP DI
  229. POP SI
  230. POP CX
  231. POP BX
  232. POP BP ; and frame pointers
  233. RET 6
  234. LowLevel$Interrupt ENDP
  235. ;----------------------------------------------------------------------------
  236. PUBLIC LowLevel$EMInterrupt
  237. LowLevel$EMInterrupt PROC FAR
  238. PUSH BP ;save frame pointer
  239. MOV BP, SP
  240. PUSH BX
  241. MOV AL, 6[BP] ;function
  242. LES BX, 8[BP] ;address of TheRegs structure
  243. MOV ES:[BX+1], AL ;set function in AX
  244. MOV AX, 67H ;EM interrupt number
  245. PUSH AX
  246. PUSH ES ;Segment of regs structure
  247. PUSH BX ;Offset of regs structure
  248. CALL LowLevel$Interrupt ;Call general interrupt routine
  249. POP BX
  250. POP BP
  251. RET 6
  252. LowLevel$EMInterrupt ENDP
  253. ;----------------------------------------------------------------------------
  254. PUBLIC LowLevel$VideoInterrupt
  255. LowLevel$VideoInterrupt PROC FAR
  256. PUSH BP ;save frame pointer
  257. MOV BP, SP
  258. LES DX, 6[BP] ;address of TheRegs structure
  259. MOV AX, 10H ;EM interrupt number
  260. PUSH AX
  261. PUSH ES ;Segment of regs structure
  262. PUSH DX ;Offset of regs structure
  263. CALL LowLevel$Interrupt ;Call general interrupt routine
  264. POP BP
  265. RET 4
  266. LowLevel$VideoInterrupt ENDP
  267. ;----------------------------------------------------------------------------
  268. PUBLIC LowLevel$msdos
  269. LowLevel$msdos PROC FAR
  270. PUSH BP ;save frame pointer
  271. MOV BP, SP
  272. LES DX, 6[BP] ;address of TheRegs structure
  273. MOV AX, 21H ;EM interrupt number
  274. PUSH AX
  275. PUSH ES ;Segment of regs structure
  276. PUSH DX ;Offset of regs structure
  277. CALL LowLevel$Interrupt ;Call general interrupt routine
  278. POP BP
  279. RET 4
  280. LowLevel$msdos ENDP
  281. ;----------------------------------------------------------------------------
  282. PUBLIC LowLevel$FlaggedError
  283. LowLevel$FlaggedError PROC FAR
  284. PUSH BP ;Set up Frame Pointer
  285. MOV BP, SP
  286. MOV AX, 6[BP] ;Flags register to test
  287. AND AX, 1 ;Carry Flag
  288. POP BP ;Restore Previous Frame Pointer
  289. RET 2
  290. LowLevel$FlaggedError ENDP
  291. ;----------------------------------------------------------------------------
  292. PUBLIC LowLevel$seg
  293. LowLevel$seg PROC FAR
  294. PUSH BP ;Set up Frame Pointer
  295. MOV BP,SP
  296. MOV AX, 8[BP] ;Segment of argument
  297. POP BP ;Restore Frame pointer
  298. RET 4
  299. LowLevel$seg ENDP
  300. ;----------------------------------------------------------------------------
  301. PUBLIC LowLevel$ofs
  302. LowLevel$ofs PROC FAR
  303. PUSH BP ;Set up Frame Pointer
  304. MOV BP,SP
  305. MOV AX, 6[BP] ;Offset of argument
  306. POP BP ;Restore Frame Pointer
  307. RET 4
  308. LowLevel$ofs ENDP
  309. ;----------------------------------------------------------------------------
  310. PUBLIC LowLevel$Ptr
  311. LowLevel$Ptr PROC FAR
  312. PUSH BP ;Set up Frame Pointer
  313. MOV BP, SP
  314. MOV AX, 6[BP] ;Offset
  315. MOV DX, 8[BP] ;Segment
  316. POP BP ;Restore Frame Pointer
  317. RET 4
  318. LowLevel$Ptr ENDP
  319. ;--------------------------------------------------------------------
  320. PUBLIC LowLevel$PeekByte
  321. LowLevel$PeekByte PROC FAR
  322. PUSH BP ;Set up Frame Pointer
  323. MOV BP,SP
  324. PUSH BX ;BX must be preserved during call
  325. LES BX, 6[BP] ;Address of value to return
  326. MOV AX, ES:[BX] ;Return value
  327. MOV AH, 0 ;Make sure caller ignores high byte
  328. POP BX ;Restore for caller
  329. POP BP ;Restore frame pointer
  330. RET 4
  331. LowLevel$PeekByte ENDP
  332. ;--------------------------------------------------------------------
  333. PUBLIC LowLevel$PeekWord
  334. LowLevel$PeekWord PROC FAR
  335. PUSH BP ;Set up Frame Pointer
  336. MOV BP,SP
  337. PUSH BX ;BX must be preserved during call
  338. LES BX, 6[BP] ;Address of value to return
  339. MOV AX, ES:[BX] ;Return value
  340. POP BX ;Restore for caller
  341. POP BP ;Restore frame pointer
  342. RET 4
  343. LowLevel$PeekWord ENDP
  344. ;--------------------------------------------------------------------
  345. PokeParams STRUC
  346. DW 3 DUP (?)
  347. PokeLoc DD ?
  348. PokeData DW ?
  349. PokeParams ENDS
  350. PUBLIC LowLevel$PokeWord
  351. LowLevel$PokeWord PROC FAR
  352. PUSH BP ;Set up Frame Pointer
  353. MOV BP, SP
  354. PUSH BX ;Save for caller
  355. LES BX, PokeLoc[BP] ;Address to put word at
  356. MOV AX, PokeData[BP];Value to poke
  357. MOV ES:[BX], AX ;Stuff it there
  358. POP BX ;Restore for caller
  359. POP BP ;Restore Frame Pointer
  360. RET 6
  361. LowLevel$PokeWord ENDP
  362. PUBLIC LowLevel$PokeByte
  363. LowLevel$PokeByte PROC FAR
  364. PUSH BP ;Set up Frame Pointer
  365. MOV BP, SP
  366. PUSH BX ;Save for caller
  367. LES BX, PokeLoc[BP] ;Address to put word at
  368. MOV AX, PokeData[BP];Value to poke
  369. MOV ES:[BX], AL ;Stuff it there
  370. POP BX ;Restore for caller
  371. POP BP ;Restore Frame Pointer
  372. RET 6
  373. LowLevel$PokeByte ENDP
  374. ;----------------------------------------------------------------------------
  375. PUBLIC LowLevel$ShiftArrayLeft
  376. ArrayParams STRUC
  377. DW 3 DUP(?)
  378. distance DW ?
  379. TheSize DW ?
  380. ArrayAdr DD ?
  381. ArrayParams ENDS
  382. LowLevel$ShiftArrayLeft PROC FAR
  383. ;
  384. ; Moving bytes to lower memory
  385. ;
  386. PUSH BP ;Set up Frame Pointer
  387. MOV BP, SP
  388. PUSH CX ;Save for caller
  389. MOV CX, TheSize[BP]
  390. SUB CX, distance[BP];Number of bytes to move
  391. JLE ArrayLeftExit ;Moving zero or fewer bytes
  392. PUSH DI ;Save altered registers
  393. PUSH SI
  394. PUSH DS
  395. LDS SI, ArrayAdr[BP] ;Source
  396. ADD SI, distance[BP] ;Moving bytes to lower memory
  397. LES DI, ArrayAdr[BP] ;Destination
  398. CLD
  399. REP MOVSB
  400. POP DS ;Restore altered registers
  401. POP SI
  402. POP DI
  403. ArrayLeftExit:
  404. POP CX
  405. POP BP
  406. RET 8
  407. LowLevel$ShiftArrayLeft ENDP
  408. ;----------------------------------------------------------------------------
  409. PUBLIC LowLevel$ShiftArrayRight
  410. LowLevel$ShiftArrayRight PROC FAR
  411. ;
  412. ; Moving bytes to higher memory
  413. ;
  414. PUSH BP ;Set up Frame Pointer
  415. MOV BP, SP
  416. PUSH CX ;Save for caller
  417. MOV CX, TheSize[BP]
  418. SUB CX, distance[BP];Number of bytes to move
  419. JLE ArrayLeftExit ;Moving zero or fewer bytes
  420. PUSH DI ;Save altered registers
  421. PUSH SI
  422. PUSH DS
  423. LDS SI, ArrayAdr[BP] ;Source
  424. ADD SI, CX ;CX is number of bytes to move
  425. DEC SI ;Last byte to move
  426. LES DI, ArrayAdr[BP] ;Destination
  427. ADD DI, TheSize[BP]
  428. DEC DI ;Last byte to move
  429. STD
  430. REP MOVSB
  431. CLD
  432. POP DS ;Restore altered registers
  433. POP SI
  434. POP DI
  435. ArrayRightExit:
  436. POP CX
  437. POP BP
  438. RET 8
  439. LowLevel$ShiftArrayRight ENDP
  440. ;----------------------------------------------------------------------------
  441. PUBLIC LowLevel$ShiftLeft
  442. ShftParams STRUC
  443. DW 0,0,0
  444. HowMany DW ?
  445. TheWord DD ?
  446. ShftParams ENDS
  447. LowLevel$ShiftLeft PROC FAR
  448. PUSH BP ;set up stack frame
  449. MOV BP,SP
  450. PUSH CX
  451. PUSH SI
  452. LES SI,TheWord[BP]
  453. MOV AX,ES:[SI]
  454. MOV CX,HowMany[BP]
  455. SHL AX,CL
  456. MOV ES:[SI],AX
  457. POP SI
  458. POP CX
  459. POP BP
  460. RET 6
  461. LowLevel$ShiftLeft ENDP
  462. ;----------------------------------------------------------------------------
  463. PUBLIC LowLevel$ShiftRight
  464. LowLevel$ShiftRight PROC FAR
  465. PUSH BP ;set up stack frame
  466. MOV BP,SP
  467. PUSH CX
  468. PUSH SI
  469. LES SI,TheWord[BP]
  470. MOV AX,ES:[SI]
  471. MOV CX,HowMany[BP]
  472. SHR AX,CL
  473. MOV ES:[SI],AX
  474. POP SI
  475. POP CX
  476. POP BP
  477. RET 6
  478. LowLevel$ShiftRight ENDP
  479. MoveParams STRUC
  480. DW 0,0,0
  481. Move_dsize DW ?
  482. dest DD ?
  483. source DD ?
  484. MoveParams ENDS
  485. ;----------------------------------------------------------------------------
  486. PUBLIC LowLevel$Move
  487. LowLevel$Move PROC FAR
  488. PUSH BP ;set up stack frame
  489. MOV BP,SP
  490. PUSH CX
  491. MOV CX, Move_dsize[BP]
  492. OR CX,CX
  493. JZ Move_Exit
  494. PUSH DI
  495. PUSH SI
  496. PUSH DS
  497. PUSH ES
  498. LDS SI,source[BP]
  499. LES DI,dest[BP]
  500. CLD
  501. REP MOVSB
  502. POP ES
  503. POP DS
  504. POP SI
  505. POP DI
  506. Move_Exit:
  507. POP CX
  508. POP BP
  509. RET 10
  510. LowLevel$Move ENDP
  511. FillParams STRUC
  512. DW 0,0,0
  513. thefill DW ?
  514. fsize DW ?
  515. fdest DD ?
  516. FillParams ENDS
  517. ;----------------------------------------------------------------------------
  518. PUBLIC LowLevel$Fill
  519. LowLevel$Fill PROC FAR
  520. PUSH BP ;set up stack frame
  521. MOV BP,SP
  522. PUSH CX
  523. MOV CX, fsize[BP]
  524. OR CX,CX
  525. JZ Fill_Exit
  526. PUSH AX
  527. PUSH DI
  528. PUSH ES
  529. MOV AX, thefill[BP]
  530. LES DI, fdest[BP]
  531. CLD
  532. REPNZ STOSB
  533. POP ES
  534. POP DI
  535. POP AX
  536. Fill_Exit:
  537. POP CX
  538. POP BP
  539. RET 8
  540. LowLevel$Fill ENDP
  541. ;----------------------------------------------------------------------------
  542. PUBLIC LowLevel$FillWord
  543. LowLevel$FillWord PROC FAR
  544. PUSH BP ;set up stack frame
  545. MOV BP,SP
  546. PUSH CX
  547. MOV CX, fsize[BP]
  548. OR CX,CX
  549. JZ FillWord_Exit
  550. PUSH AX
  551. PUSH DI
  552. PUSH ES
  553. MOV AX, thefill[BP]
  554. LES DI, fdest[BP]
  555. CLD
  556. REPNZ STOSW
  557. POP ES
  558. POP DI
  559. POP AX
  560. FillWord_Exit:
  561. POP CX
  562. POP BP
  563. RET 8
  564. LowLevel$FillWord ENDP
  565. EQParams STRUC
  566. DW 0,0,0
  567. start DD ?
  568. lookfor DB ?,0
  569. EQsize DW ?
  570. EQParams ENDS
  571. ;----------------------------------------------------------------------------
  572. PUBLIC LowLevel$ScanEQ
  573. LowLevel$ScanEQ PROC FAR
  574. ; Starting at the address start, scan size bytes at most,
  575. ; looking for lookfor. If size is negative, look backwards
  576. ; from start. Result is number of bytes skipped to get to
  577. ; lookfor, or size if not found
  578. PUSH BP ;set up stack frame
  579. MOV BP,SP
  580. PUSH DI
  581. PUSH CX
  582. PUSH BX
  583. LES DI,start[BP]
  584. MOV AL,lookfor[BP]
  585. MOV CX,EQsize[BP]
  586. MOV BX,CX ;size
  587. OR CX,CX
  588. JLE EQBack
  589. ;
  590. ; size is > 0
  591. ;
  592. INC CX ;i
  593. CLD
  594. REPNZ SCASB
  595. SUB BX,CX ;size - i
  596. JMP EQExit
  597. EQBack: JZ EQZero
  598. ;
  599. ; size is < 0
  600. NEG CX
  601. INC CX ;i
  602. STD
  603. REPNZ SCASB
  604. CLD
  605. ADD BX,CX ;size+i
  606. JMP EQExit
  607. EQZero: MOV BX,0 ;return 0
  608. ;
  609. ;size was 0
  610. ;
  611. EQExit: MOV AX,BX ;return value
  612. POP BX
  613. POP CX
  614. POP DI
  615. POP BP
  616. RET 8
  617. LowLevel$ScanEQ ENDP
  618. ;----------------------------------------------------------------------------
  619. PUBLIC LowLevel$ScanNE
  620. LowLevel$ScanNE PROC FAR
  621. ; Starting at the address start, scan size bytes at most,
  622. ; looking for not lookfor. If size is negative, look backwards
  623. ; from start. Result is number of bytes skipped to get to something that
  624. ; is not lookfor, or size if not found
  625. PUSH BP ;set up stack frame
  626. MOV BP,SP
  627. PUSH DI
  628. PUSH CX
  629. PUSH BX
  630. LES DI,start[BP]
  631. MOV AL,lookfor[BP]
  632. MOV CX,EQsize[BP]
  633. MOV BX,CX ;size
  634. OR CX,CX
  635. JLE NEBack
  636. ;
  637. ; size is > 0
  638. ;
  639. INC CX ;i
  640. CLD
  641. REPZ SCASB
  642. SUB BX,CX ;size - i
  643. JMP NEExit
  644. NEBack: JZ NEZero
  645. ;
  646. ; size is < 0
  647. NEG CX
  648. INC CX ;i
  649. STD
  650. REPZ SCASB
  651. CLD
  652. ADD BX,CX ;size+i
  653. JMP NEExit
  654. NEZero: MOV BX,0 ;return 0
  655. ;
  656. ;size was 0
  657. ;
  658. NEExit: MOV AX,BX ;return value
  659. POP BX
  660. POP CX
  661. POP DI
  662. POP BP
  663. RET 8
  664. LowLevel$ScanNE ENDP
  665. ;----------------------------------------------------------------------------
  666. PUBLIC LowLevel$WriteDMANoSnow
  667. DMAParams STRUC
  668. DW 0,0,0
  669. dsize DW ?
  670. ToAddr DD ?
  671. FromAddr DD ?
  672. DMAParams ENDS
  673. LowLevel$WriteDMANoSnow PROC FAR
  674. PUSH BP ;set up stack frame
  675. MOV BP,SP
  676. PUSH CX
  677. PUSH DI
  678. PUSH SI
  679. PUSH DS
  680. LES DI,ToAddr[BP]
  681. LDS SI,FromAddr[BP]
  682. MOV CX,dsize[BP]
  683. MOV DX,3DAH;
  684. TOP1: IN AL, DX ; wait until Vertical retrace
  685. TEST AL, 08H ; not in progress
  686. JNZ TOP1
  687. CLD
  688. TEST CX, 0FFFFH
  689. CHKH: JZ END1 ; exit if nothing left to write
  690. TOP2: IN AL, DX ; wait until Horiz. retrace
  691. TEST AL, 01H ; not in progress
  692. JNZ TOP2
  693. IN AL, DX ; IF in Vertical retrace
  694. TEST AL, 08H ; goto block move
  695. JNZ TOPV
  696. CLI
  697. TOPH: IN AL, DX ; wait until Horiz. retrace
  698. TEST AL, 01H ; in progress
  699. JZ TOPH
  700. MOVSB ; write one byte
  701. STI
  702. DEC CX ; dec count and go to top
  703. JMP CHKH
  704. TOPV: REPNZ MOVSB ; then move line
  705. END1: NOP
  706. POP DS
  707. POP SI
  708. POP DI
  709. POP CX
  710. POP BP
  711. RET 0AH
  712. LowLevel$WriteDMANoSnow ENDP
  713. StackSeg DW ?
  714. StackPtr DW ?
  715. LowLevel_TEXT ENDS
  716. END