home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / assemblr / asm / wasm / io.mac < prev    next >
Text File  |  1987-07-24  |  16KB  |  638 lines

  1.  List-
  2.  
  3. ;=============================================================================
  4. ; Basic I/O Macro Interface
  5. ;
  6. ; These macros provide an interface with IO.ASM.  They provide methods to
  7. ; manipulate strings and processes simple I/O.  BP might be used by the
  8. ; macros to set up the interface parameters, so it should not be used to pass 
  9. ; parameters to the macros.  See IO.ASM for a description of string formats,
  10. ; how string addresses are passed, and other pertinent information.
  11. ;
  12. ; Here is a brief summary of the available macros:
  13. ;
  14. ;   String     Keyboard  Display    Attribute  Cursor  Speaker  File
  15. ;   ---------  --------  ---------  ---------  ------  -------  ------
  16. ;   LOAD       INPUT     CLS        NORMAL     HOME    BELL     OPEN
  17. ;   CLEAR      KEYBOARD  DISPLAY    BOLD       LEFT    BEEP     CREATE
  18. ;   TRUNCATE             LINE       UNDERLINE  UP      SOUND    DELETE
  19. ;   COPY                            BLINK      DOWN             READ
  20. ;   APPEND                          REVERSE    SPOS             WRITE
  21. ;   FORMAT                                     RPOS             SEEK
  22. ;   JUSTIFY                                    LOCATE           SIZE
  23. ;   LOWERCASE                                                   CLOSE
  24. ;   UPPERCASE
  25. ;   BINARY
  26. ;   DECIMAL
  27. ;   TIME
  28.  
  29. ;================================================
  30. ; Load a destination and source address.
  31. ;
  32. ; DES_OFF - destination offset: 16 bit operand.
  33. ; DES_SEG - destination segment: 16 bit operand.
  34. ; SEG_OFF - source offset: 16 bit operand.
  35. ; SEG_SEG - source segment: 16 bit operand.
  36.  
  37. Load Macro Des_Off, Des_Seg, Src_Off, Src_Seg
  38.  Load_Address Des_Off, Des_Seg
  39.  Load_Address Src_Off, Src_Seg
  40.  Endm
  41.  
  42. ;================================================
  43. ; Clear a string (set its length to zero). The
  44. ; address is returned.
  45. ;
  46. ; OFF - offset: 16 bit operand.
  47. ; SEG - segment: 16 bit operand.
  48.  
  49. Clear Macro Off, Seg
  50.  Load_Address Off, Seg
  51.  Call Clear_Str_P
  52.  Endm
  53.  
  54. ;================================================
  55. ; Trucate a string (set its length to defined value).
  56. ; The string location is returned.
  57. ;
  58. ; OFF - offset: 16 bit operand.
  59. ; SEG - segment: 16 bit operand.
  60. ; LENGTH - new string length: 8 bit register or
  61. ;  immediate data.
  62.  
  63. Truncate Macro Off, Seg, Length
  64.  Load_Address Off, Seg
  65.  Sub Sp, 2
  66.  Mov Bp, Sp
  67.  Mov Byte [Bp], Length
  68.  Call Truncate_Str_P
  69.  Endm
  70.  
  71. ;================================================
  72. ; Copy the source string to the destination. The
  73. ; destination string is returned.
  74. ;
  75. ; DES_OFF - destination offset: 16 bit operand.
  76. ; DES_SEG - destination segment: 16 bit operand.
  77. ; SEG_OFF - source offset: 16 bit operand.
  78. ; SEG_SEG - source segment: 16 bit operand.
  79.  
  80. Copy Macro Des_Off, Des_Seg, Src_Off, Src_Seg
  81.  Load_Address Des_Off, Des_Seg
  82.  Load_Address Src_Off, Src_Seg
  83.  Call Copy_Str_P
  84.  Endm
  85.  
  86. ;================================================
  87. ; Append the source string to the destination. The
  88. ; destination string is returned.
  89. ;
  90. ; DES_OFF - destination offset: 16 bit operand.
  91. ; DES_SEG - destination segment: 16 bit operand.
  92. ; SEG_OFF - source offset: 16 bit operand.
  93. ; SEG_SEG - source segment: 16 bit operand.
  94.  
  95. Append Macro Des_Off, Des_Seg, Src_Off, Src_Seg
  96.  Load_Address Des_Off, Des_Seg
  97.  Load_Address Src_Off, Src_Seg
  98.  Call Append_Str_P
  99.  Endm
  100.  
  101. ;================================================
  102. ; Format the source string and append it to the
  103. ; destination. The source string is right justified
  104. ; to the specified length BEFORE it is appended
  105. ; (though the original source string is not modified).
  106. ; The destination string is returned.
  107. ;
  108. ; DES_OFF - destination offset: 16 bit operand.
  109. ; DES_SEG - destination segment: 16 bit operand.
  110. ; SEG_OFF - source offset: 16 bit operand.
  111. ; SEG_SEG - source segment: 16 bit operand.
  112. ; LENGTH - source string length after formatting:
  113. ;  8 bit register or immediate data.
  114. ; CHAR - character to pad with: 8 bit register or
  115. ;  immediate data.
  116.  
  117. Format Macro Des_Off, Des_Seg, Src_Off, Src_Seg, Length, Char
  118.  Load_Address Des_Off, Des_Seg
  119.  Load_Address Src_Off, Src_Seg
  120.  Sub Sp, 2
  121.  Mov Bp, Sp
  122.  Mov Byte [Bp], Length
  123.  Mov Byte [Bp+1], Char
  124.  Call Format_Rgt_P
  125.  Endm
  126.  
  127. ;================================================
  128. ; Justify and append the source string to the
  129. ; destination. The length specifies the total length
  130. ; of the final string. The destination string is
  131. ; returned.
  132. ;
  133. ; DES_OFF - destination offset: 16 bit operand.
  134. ; DES_SEG - destination segment: 16 bit operand.
  135. ; SEG_OFF - source offset: 16 bit operand.
  136. ; SEG_SEG - source segment: 16 bit operand.
  137. ; LENGTH - final destination string length: 8 bit
  138. ;  register or immediate data.
  139. ; CHAR - character to pad with: 8 bit register or
  140. ;  immediate data.
  141.  
  142. Justify Macro Des_Off, Des_Seg, Src_Off, Src_Seg, Length, Char
  143.  Load_Address Des_Off, Des_Seg
  144.  Load_Address Src_Off, Src_Seg
  145.  Sub Sp, 2
  146.  Mov Bp, Sp
  147.  Mov Byte [Bp], Length
  148.  Mov Byte [Bp+1], Char
  149.  Call Justify_Rgt_P
  150.  Endm
  151.  
  152. ;================================================
  153. ; Convert a character to lower-case. AX is not
  154. ; preserved.
  155. ;
  156. ; CHAR - character: 8 bit operand, default is AL.
  157.  
  158. Lowercase Macro Char
  159.  If Type(Char) and Type()
  160.   Call Lower_Chr_P
  161.  Else
  162.   Mov Al, Char
  163.   Call Lower_Chr_P
  164.   Ifn Type(Char) And Type(0)
  165.    Mov Char, Al
  166.   Endif
  167.  Endif
  168.  Endm
  169.  
  170. ;================================================
  171. ; Convert a character to upper-case. AX is not
  172. ; preserved.
  173. ;
  174. ; CHAR - character, default is AL: 8 bit operand.
  175.  
  176. Uppercase Macro Char
  177.  If Type(Char) and Type()
  178.   Call Upper_Chr_P
  179.  Else
  180.   Mov Al, Char
  181.   Call Upper_Chr_P
  182.   Ifn Type(Char) And Type(0)
  183.    Mov Char, Al
  184.   Endif
  185.  Endif
  186.  Endm
  187.  
  188. ;================================================
  189. ; Translate a decimal string into a binary number.
  190. ; The string is translated to an unsigned 32 bit,
  191. ; so the number must be in the range 0 to
  192. ; 4294967295. The number is returned on the
  193. ; stack.
  194. ;
  195. ; SEG_OFF - string offset: 16 bit operand.
  196. ; SEG_SEG - string segment: 16 bit operand.
  197.  
  198. Binary Macro Src_Off, Src_Seg
  199.  Load_Address Src_Off, Src_Seg
  200.  Call Make_Bin_P
  201.  Endm
  202.  
  203. ;================================================
  204. ; Translate a binary number into a decimal string.
  205. ; The the number must be an unsigned 32 bit value.
  206. ; Each word of the value must be in the range 0
  207. ; to 65535 (0 to FFFFH).
  208. ;
  209. ; VAL_LO - low word of number: 16 bit operand.
  210. ; VAL_HI - high word of number, default 0: 16 bit
  211. ;  operand.
  212.  
  213. Decimal Macro Val_Lo, Val_Hi
  214.  Ifn Type(Val_Lo) And Type()
  215.   Push_Any Val_Lo
  216.   If Type(Val_Hi) And Type()
  217.    Push_Any 0
  218.   Else
  219.    Push_Any Val_Hi
  220.   Endif
  221.  Endif
  222.  Call Make_Dec_P
  223.  Endm
  224.  
  225. ;================================================
  226. ; Get the string representing the present time.
  227. ; the string address is returned on the stack.
  228.  
  229. Time Macro
  230.  Mov Ah, 2ch
  231.  Int 21h
  232.  Push Cx
  233.  Call Time_Str_P
  234.  Endm
  235.  
  236. ;================================================
  237. ; Input a character or a string from standard
  238. ; input. If no length is specified, a single
  239. ; character is input without echo and returned in
  240. ; AL, otherwise a string is input using the specified
  241. ; length and its location is returned on the stack.
  242. ; AX is not preserved.
  243. ;
  244. ; LEN - input length: 8 bit operand.
  245.  
  246. Input Macro Len
  247.  If Type(Len) And Type()
  248.   Call Input_Hid_P
  249.  Else
  250.   Mov Al, Len
  251.   Push Ax
  252.   Call Input_Str_P
  253.  Endif
  254.  Endm
  255.  
  256. ;================================================
  257. ; Get the standard input status. Zero flag is set
  258. ; if there are no characters pending.
  259.  
  260. Keyboard Macro
  261.  Call Input_Sta_P
  262.  Endm
  263.  
  264. ;================================================
  265. ; Move the cursor to the upper left corner.
  266.  
  267. Home Macro
  268.  Call Home_Cur_P
  269.  Endm
  270.  
  271. ;================================================
  272. ; Move the cursor left one column.
  273.  
  274. Left Macro
  275.  Call Left_Cur_P
  276.  Endm
  277.  
  278. ;================================================
  279. ; Move the cursor up one row.
  280.  
  281. Up Macro
  282.  Call Up_Cur_P
  283.  Endm
  284.  
  285. ;================================================
  286. ; Move the cursor down one row.
  287.  
  288. Down Macro
  289.  Call Down_Cur_P
  290.  Endm
  291.  
  292. ;================================================
  293. ; Save cursor position.
  294.  
  295. Spos Macro
  296.  Call Save_Cur_P
  297.  Endm
  298.  
  299. ;================================================
  300. ; Restore cursor position.
  301.  
  302. Rpos Macro
  303.  Call Restore_Cur_P
  304.  Endm
  305.  
  306. ;================================================
  307. ; Move the cursor to a specified position. The upper
  308. ; left corner is 1,1.
  309. ;
  310. ; ROW - row position: 8 bit register or
  311. ;   immediate data.
  312. ; COLUMN - column position: 8 bit register or
  313. ;   immediate data.
  314.  
  315. Locate Macro Row, Column
  316.  Sub Sp, 2
  317.  Mov Bp, Sp
  318.  Mov Byte [Bp+1], Row   ;set row
  319.  Mov Byte [Bp], Column  ;set column
  320.  Call Locate_Cur_P
  321.  Endm
  322.  
  323. ;================================================
  324. ; Set display attribute to normal.
  325.  
  326. Normal Macro
  327.  Call Normal_Atr_P
  328.  Endm
  329.  
  330. ;================================================
  331. ; Set display attribute to bold.
  332.  
  333. Bold Macro
  334.  Call Bold_Atr_P
  335.  Endm
  336.  
  337. ;================================================
  338. ; Set display attribute to underline.
  339.  
  340. Underline Macro
  341.  Call Underline_Atr_P
  342.  Endm
  343.  
  344. ;================================================
  345. ; Set display attribute to blink.
  346.  
  347. Blink Macro
  348.  Call Blink_Atr_P
  349.  Endm
  350.  
  351. ;================================================
  352. ; Set display attribute to reverse video.
  353.  
  354. Reverse Macro
  355.  Call Reverse_Atr_P
  356.  Endm
  357.  
  358. ;================================================
  359. ; Clear the screen and home the cursor.
  360.  
  361. Cls Macro
  362.  Call Clear_Scr_P
  363.  Endm
  364.  
  365. ;================================================
  366. ; Sound the speaker (the normal beep).
  367.  
  368. Bell Macro
  369.  Call Sound_Bel_P
  370.  Endm
  371.  
  372. Beep Macro
  373.  Call Sound_Bel_P
  374.  Endm
  375.  
  376. ;================================================
  377. ; Sound the speaker at the specified frequency
  378. ; for the specified duration.
  379. ;
  380. ; HERTZ - frequency of tone in hertz: 16 bit
  381. ;  register or immediate data.
  382. ; TIME - duration of the tone in 1/100 seconds: 16
  383. ;  bit register or immediate data.
  384.  
  385. Sound Macro Hertz, Time
  386.  Push_Any Hertz         ;frequency
  387.  Push_Any Time          ;duration
  388.  Call Sound_Spk_P
  389.  Endm
  390.  
  391. ;================================================
  392. ; Display a string or character to standard output.
  393. ; If the first parameter is 8 bit non-label, then
  394. ; it is displayed as a character. 
  395. ;
  396. ; OFF - offset or character to display: 16 bit
  397. ;  operand, 8 bit immediate data, or byte label.
  398. ; SEG - segment: 16 bit operand.
  399.  
  400. Display Macro Off, Seg
  401.  If Not(Size(Off) And Size(Byte())=0) And (Type(Off) And Type([0])=0)
  402.   Push Dx
  403.   Mov Dl, Off
  404.   Call Display_Chr_P
  405.   Pop Dx
  406.  Else
  407.   Load_Address Off, Seg
  408.   Call Display_Str_P
  409.  Endif
  410.  Endm
  411.  
  412. ;================================================
  413. ; Works exactly like DISPLAY above, but a new line
  414. ; is started after the string or character. Also,
  415. ; if no operand is specified, a string loaded on the
  416. ; stack is NOT displayed, only a new line is started.
  417. ;
  418. ; OFF - offset or character to display: 16 bit
  419. ;  operand or 8 bit immediate data.
  420. ; SEG - segment: 16 bit operand.
  421.  
  422. Line Macro Off, Seg
  423.  Ifn Type(Off) And Type()
  424.   Display Off, Seg
  425.  Endif
  426.  Call Line_P
  427.  Endm
  428.  
  429. ;================================================
  430. ; Open a file for reading and writing. The handle
  431. ; is returned on the stack.
  432. ;
  433. ; OFF - offset: 16 bit operand.
  434. ; SEG - segment: 16 bit operand.
  435.  
  436. Open Macro Off, Seg
  437.  Load_Address Off, Seg
  438.  Call Make_Nam_P
  439.  Call Open_Fil_P
  440.  Endm
  441.  
  442. ;================================================
  443. ; Create or truncate a file for reading and writing.
  444. ; The handle is returned on the stack.
  445. ;
  446. ; OFF - offset: 16 bit operand.
  447. ; SEG - segment: 16 bit operand.
  448.  
  449. Create Macro Off, Seg
  450.  Load_Address Off, Seg
  451.  Call Make_Nam_P
  452.  Call Create_Fil_P
  453.  Endm
  454.  
  455. ;================================================
  456. ; Delete a file.
  457. ;
  458. ; OFF - offset: 16 bit operand.
  459. ; SEG - segment: 16 bit operand.
  460.  
  461. Delete Macro Off, Seg
  462.  Load_Address Off, Seg
  463.  Call Make_Nam_P
  464.  Call Delete_Fil_P
  465.  Endm
  466.  
  467. ;================================================
  468. ; Read from a file. The number of bytes actually
  469. ; read is returned on the stack.
  470. ;
  471. ; HANDLE - file handle: 16 bit operand.
  472. ; BYTES - number of bytes to read: 16 bit operand.
  473. ; OFF - offset of bytes to read: 16 bit operand.
  474. ; SEG - segment of bytes to read, default DS: 16
  475. ;  bit operand.
  476.  
  477. Read Macro Handle, Bytes, Off, Seg
  478.  Ifn Type(Handle) And Type()
  479.   Push_Any Handle
  480.  Endif
  481.  Push_Any Bytes
  482.  Push_Any Off
  483.  If Type(Seg) And Type()
  484.   Push Ds
  485.  Else
  486.   Push_Any Seg
  487.  Endif
  488.  Call Read_Fil_P
  489.  Endm
  490.  
  491. ;================================================
  492. ; Write to a file.  The number of bytes actually
  493. ; written is returned on the stack.
  494. ;
  495. ; HANDLE - file handle: 16 bit operand.
  496. ; BYTES - number of bytes to write: 16 bit
  497. ;   operand.
  498. ; OFF - offset of bytes to write: 16 bit operand.
  499. ; SEG - segment of bytes to write, default DS: 16
  500. ;  bit operand.
  501.  
  502. Write Macro Handle, Bytes, Off, Seg
  503.  Ifn Type(Handle) And Type()
  504.   Push_Any Handle
  505.  Endif
  506.  Push_Any Bytes
  507.  Push_Any Off
  508.  If Type(Seg) And Type()
  509.   Push Ds
  510.  Else
  511.   Push_Any Seg
  512.  Endif
  513.  Call Write_Fil_P
  514.  Endm
  515.  
  516. ;================================================
  517. ; Move the read/write pointer of a file to a
  518. ; specified record location.
  519. ;
  520. ; HANDLE - file handle: 16 bit operand.
  521. ; RECORD_SIZE - record size: 16
  522. ;   bit operand.
  523. ; RECORD_LOW - low word of record number: 16 bit
  524. ;  operand.
  525. ; RECORD_HIGH - high word of record number, default
  526. ;  0: 16 bit operand.
  527.  
  528. Seek Macro Handle, Rec_Size, Rec_Lo, Rec_Hi
  529.  Ifn Type(Handle) And Type()
  530.   Push_Any Handle
  531.  Endif
  532.  Push_Any Rec_Size
  533.  Push_Any Rec_Lo
  534.  If Type(Rec_Hi) And Type()
  535.   Push_Any 0
  536.  Else
  537.   Push_Any Rec_Hi
  538.  Endif
  539.  Call Seek_Fil_P        ;move read/write pointer
  540.  Endm
  541.  
  542. ;================================================
  543. ; Return the size of a file and move the read/
  544. ; write pointer to the end of the file. The 32 bit
  545. ; size is returned on the stack.
  546. ;
  547. ; HANDLE - file handle: 16 bit operand.
  548.  
  549. Size Macro Handle
  550.  Ifn Type(Handle) And Type()
  551.   Push_Any Handle
  552.  Endif
  553.  Call Size_Fil_P        ;get size of file
  554.  Endm
  555.  
  556. ;================================================
  557. ; Close a file.
  558. ;
  559. ; HANDLE - file handle: 16 bit operand.
  560.  
  561. Close Macro Handle
  562.  Ifn Type(Handle) And Type()
  563.   Push_Any Handle
  564.  Endif
  565.  Call Close_Fil_P
  566.  Endm
  567.  
  568. ;================================================
  569. ; Load a 32 bit address to the stack. If no 
  570. ; parameters are specified, then nothing will be
  571. ; loaded; if a string is passed, it will be
  572. ; declared and its address will be loaded; if a
  573. ; non-word memory label is specified, its offset
  574. ; and the specified (default code) segment will
  575. ; be loaded; otherwise the specified offset and
  576. ; segment will be loaded.
  577. ;
  578. ; OFF - offset: 16 bit operand, string, or label.
  579. ; SEG - segment, default is CS: 16 bit operand.
  580.  
  581. Load_Address Macro Off, Seg
  582.  Ifn Type(Off) And Type()
  583.   If Type(Off) And Type('')
  584.    Jmps B
  585. A  Db Byte(Offset B - Offset A - 1), Off
  586. B  Mov Bp, Offset A
  587.    Push Bp
  588.    Push Cs
  589.   Else
  590.    Push_Off Off
  591.    Push_Seg Seg
  592.   Endif
  593.  Endif
  594.  Endm
  595.  
  596. ;================================================
  597. ; Push the offset part of a 32 bit address.  If
  598. ; the offset is a non-16 bit memory label, its 
  599. ; offset is pushed.
  600. ;
  601. ; OFF - offset: 16 bit operand, or label.
  602.  
  603. Push_Off Macro Op Off
  604.  If Not(Type(Off) And Type([0])=0) And (Size(Off) And Size(Word())=0)
  605.   Push_Any Offset Off
  606.  Else
  607.   Push_Any Off
  608.  Endif
  609.  Endm
  610.  
  611. ;================================================
  612. ; Push the segment part of a 32 bit address.
  613. ;
  614. ; SEG - segment, default CS: 16 bit operand.
  615.  
  616. Push_Seg Macro Seg
  617.  If Type(Seg) And Type()
  618.   Push Cs
  619.  Else
  620.   Push_Any Seg
  621.  Endif
  622.  Endm
  623.  
  624. ;================================================
  625. ; Push any 16 bit operand. 
  626. ;
  627. ; OP - operand to be pushed: 16 bit operand.
  628.  
  629. Push_Any Macro Op
  630.  If Type(Op) And Type(0)
  631.   Mov Bp, Op
  632.   Push Bp
  633.  Else
  634.   Push Op
  635.  Endif
  636.  Endm
  637.  
  638.