home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol058 / tutil.sqc / TUTIL.SRC
Encoding:
Text File  |  1985-02-10  |  10.4 KB  |  374 lines

  1. ;       TRS80 VERSION OF UTILITY SUBROUTINE PACKAGE
  2.  
  3. SYSTEM  EQU     402DH
  4.  
  5. ; MISCELLANEOUS WORKER PROCEDURES
  6.  
  7. ;       PROCEDURE TO RELOAD MENU PROGRAM
  8.  
  9. BOOT:
  10.         RESET   FCB,MUSE$NAME,'C','O','M'
  11.         JMP     BOOTER
  12.         DB      5,5
  13. MUSE$NAME:
  14.         DB      'MUSIC'
  15.  
  16. BEGIN:  RET
  17.  
  18. BLOCK:  DS      0
  19. CPU:    DB      3
  20. CLOCK:  DB      95H,58H,8DH,80H
  21. CASH:   DB      0FFH
  22. MXVCE:  DW      4
  23. LSIZE:  DW      16
  24. DAC:   DB       0FCH
  25. CRLF:   DW      0DH,00H,'$'
  26. MXCOL:  DW      64
  27. MXROW:  DW      16
  28. CEOS:   DB      31
  29. CEOL:   DB      30
  30. SCRL:   DB      42      ; ASTERISK
  31. HOME:   DB      59      ; SEMICOLON
  32. UP$ARROW: DB    91
  33. LEFT$ARROW: DB  8
  34. DOWN$ARROW: DB  10
  35. RITE$ARROW: DB  9
  36. RETURN: DB      0DH
  37. QUIT:   DB      36      ; DOLLAR SIGN
  38. CANCEL: DB      39      ; SINGLE QUOTE
  39. PAGE$HEIGHT: DW 50
  40. PAGE$FEED: DB   0
  41. PAGE$SPACE: DB  10
  42.  
  43. ;       JUMP TABLE FOR TRSDOS 2.X
  44.  
  45. CURSOR  EQU     4020H           ; CURSOR ADDRESS
  46.  
  47. JGTCH:  JMP     002BH           ; GET CHARACTER
  48. JWTCH:  JMP     0033H           ; WRITE CHARACTER
  49. JREWRT: JMP     4420H           ; CREATE FILE
  50. JRESET: JMP     4424H           ; OPEN FILE
  51. JCLOS:  JMP     4428H           ; CLOSE FILE
  52. JDELE:  JMP     442CH           ; DELETE FILE
  53. JWRIT:  JMP     443CH           ; WRITE TO FILE
  54. JREAD:  JMP     4436H           ; READ FROM FILE
  55.  
  56. ;               MUSIC BOX BEEPER ROUTINE
  57.  
  58. BEEP:
  59.         LDA     DAC
  60.         STA     BEEP01+1
  61.         DI                      ; DISABLE GLITCHER
  62.         MVI     B,0E0H          ; SET DURATION
  63.         MVI     A,0             ; CLEAR WAVEGEN
  64. BEEP01:
  65.         OUT     0               ; TO MUSIC BOX
  66.         INR     A               ; STEP FOR RAMP
  67.         INR     A
  68.         JNZ     BEEP01
  69.         INR     B               ; COUNT LAMBDA
  70.         JNZ     BEEP01
  71.         EI                      ; REGLITCH
  72.         RET
  73.         
  74. ;               PROCEDURE TO GET INTEGER
  75.  
  76. ;               INPUTS:         HL = HI$VAL
  77. ;               OUTPUTS:        HL = INTEGER
  78.  
  79. GET$INT:
  80.         SHLD    GTNTX2
  81. GTNT01:
  82.         REDLN   GTNTX5,5
  83.         LXI     H,GTNTX5
  84.         CALL    STR$TO$INT
  85.         XCHG
  86.         MOV     A,D
  87.         ORA     E
  88.         JZ      GTNT03
  89.         LHLD    GTNTX2
  90.         CALL    CPHLDE
  91.         JP      GTNT04
  92. GTNT02:
  93.         WRTLN   GTNTL1
  94.         CALL    BEEP
  95.         JMP     GTNT01
  96. GTNT03:
  97.         LDA     GTNTXZ
  98.         ORA     A
  99.         JNZ     GTNT02
  100. GTNT04:
  101.         MVI     A,1
  102.         STA     GTNTXZ
  103.         XCHG
  104.         RET
  105. GTNTX2: DW      0
  106. GTNTXZ: DB      1
  107.         DS      2
  108. GTNTX5: DS      5
  109. GTNTL1: DB      13,10,7,'Number not in range.  Reenter  >','$'
  110.  
  111. ;               PROCEDURE TO WRITE A STRING TO A FILE
  112. ;               INPUTS:         HL=@(STRING)
  113. ;                               DE=@(FCB)
  114.  
  115. SWRITE:
  116.         MOV     A,M
  117.         CPI     '$'
  118.         RZ
  119.         PUSH    H
  120.         PUSH    D
  121.         CALL    FWRIT
  122.         POP     D
  123.         POP     H
  124.         INX     H
  125.         JMP     SWRITE
  126.  
  127. ;               PROCEDURE TO CONVERT AN INTEGER TO A STRING
  128.  
  129. ;               INPUTS:         HL = @(STRING)
  130. ;                               DE = INTEGER
  131. ;                               A = S(STRING)MIN
  132.  
  133. INT$TO$STR:
  134.         DCR     A
  135.         SHLD    NTSTAD
  136.         XCHG
  137.         SHLD    NTSTX
  138.         MVI     E,TRUE                  ; PUSH(EOT);
  139.         PUSH    D
  140. NTST01:                                 ; REPEAT
  141.         STA     NTSTY
  142.         LHLD    NTSTX                   ; HL:=NTSTX MOD 10;
  143.         XCHG
  144.         LXI     H,0
  145.         LXI     B,10
  146.         CALL    DIVIDE
  147.         PUSH    H                       ; PUSH(HL);
  148.         LHLD    NTSTX                   ; NTSTX:=NTSTX DIV 10
  149.         XCHG
  150.         LXI     H,0
  151.         LXI     B,10
  152.         CALL    DIVIDE
  153.         XCHG
  154.         SHLD    NTSTX
  155.         LDA     NTSTY
  156.         DCR     A                       ; UNTIL SIZE=0;
  157.         JP      NTST01
  158.         LHLD    NTSTX                   ; OR INT=0
  159.         MOV     A,H
  160.         ORA     L
  161.         MVI     A,0FFH
  162.         JNZ     NTST01
  163.         LHLD    NTSTAD
  164. NTST02:
  165.         POP     D                       ; POP(DE);
  166.         MOV     A,E                     ; WHILE E<>EOT DO BEGIN
  167.         CPI     TRUE
  168.         RZ
  169.         ORI     30H                     ; X:=S+30H;
  170.         MOV     M,A                     ; SONG$LINE[I]:=X;
  171.         INX     H                       ; I:=I+1
  172.         JMP     NTST02                  ; END
  173. NTSTAD: DS      2
  174. NTSTX:  DS      2
  175. NTSTY:  DS      1
  176.  
  177. ;               PROCEDURE TO CONVERT A STRING TO AN INTEGER
  178.  
  179. ;               INPUTS:         HL = @(STRING)
  180. ;               OUTPUTS:        HL = INTEGER
  181.  
  182. STR$TO$INT:
  183.         LXI     D,0                     ; DE:=0;
  184. STIN01:
  185.         MOV     A,M                     ; WHILE M IN ['0'..'9']
  186.         XCHG                            ; (HL:=DE FOR RETURN)
  187.         CPI     '0'
  188.         RM
  189.         CPI     ':'
  190.         RP                              ; DO BEGIN
  191.         ANI     0FH                     ; BC:=M AND 0FH;
  192.         MVI     B,0
  193.         MOV     C,A
  194.         PUSH    D
  195.         PUSH    H                       ; HL:=10*DE;
  196.         POP     D
  197.         DAD     H
  198.         DAD     H
  199.         DAD     D
  200.         DAD     H
  201.         DAD     B                       ; DE:=HL+BC;
  202.         XCHG
  203.         POP     H
  204.         INX     H                       ; HL:=HL+1
  205.         JMP     STIN01                  ; END
  206.  
  207. ;               PROCEDURE TO COMPARE TWO STRINGS
  208.  
  209. ;               INPUTS          DE = @(STRING A)
  210. ;                               HL = @(STRING B)
  211. ;                               A = S(STRING)
  212.  
  213. ;               OUTPUTS         CONDITION CODE
  214.  
  215. STCMP:
  216.         MOV     B,A
  217. STCP01:
  218.         LDAX    D               ; GET BYTE OF STRING B
  219.         SUB     M               ; A - B
  220.         RNZ                     ; GO IF NOT EQUAL
  221.         INX     D               ; BUMP POINTERS
  222.         INX     H
  223.         DCR     B               ; COUNT BYTES
  224.         JNZ     STCP01
  225.         RET                     ; RETURN WITH EQUAL
  226.         
  227. ;               PROCEDURE TO COMPARE TWO WORDS
  228.  
  229. ;               INPUTS          HL=FIRST WORD
  230. ;                               DE=SECOND WORD
  231.  
  232. ;               OUTPUTS         CONDITION CODE(LESS C)
  233.  
  234. CPHLDE:
  235.         PUSH    B
  236.         PUSH    D
  237.         PUSH    H
  238.         MVI     B,16
  239. CPHL01:
  240.         DAD     H               ; TEST HIGH BIT
  241.         XCHG
  242.         JC      CPHL02
  243.         DAD     H               ; HL HIGH BIT OFF
  244.         XCHG
  245.         JNC     CPHL03          ; BITS THE SAME
  246.         MVI     A,0FFH          ; HL<DE
  247.         JMP     CPHL04
  248. CPHL02:
  249.         DAD     H               ; HL HIGH BIT ON
  250.         XCHG
  251.         JC      CPHL03          ; BITS THE SAME
  252.         MVI     A,01H           ; HL>DE
  253.         JMP     CPHL04
  254. CPHL03:
  255.         DCR     B
  256.         JNZ     CPHL01
  257.         MVI     A,00H           ; HL=DE
  258. CPHL04:
  259.         CPI     0               ; SET CONDITION CODE
  260.         POP     H
  261.         POP     D
  262.         POP     B
  263.         RET
  264.  
  265. ;               PROCEDURE TO SET AREA TO VALUE
  266.  
  267. ;               INPUTS          HL=@(AREA)
  268. ;                               A=VALUE
  269. ;                               B=S(AREA)
  270.  
  271. FILLCHAR:
  272.         MOV     M,A
  273.         INX     H
  274.         DCR     B
  275.         JNZ     FILLCHAR
  276.         RET
  277.  
  278. ;               PROCEDURE TO MOVE STRING TO AREA
  279.  
  280. ;               INPUTS:         HL = @(STRING)
  281. ;                               DE = @(AREA)
  282. ;                               A = S(STRING)
  283.  
  284. MOVELEFT:
  285.         PUSH    B
  286.         PUSH    D
  287.         PUSH    H
  288.         MOV     B,A
  289. MVLF01:
  290.         MOV     A,M
  291.         STAX    D
  292.         INX     H
  293.         INX     D
  294.         DCR     B
  295.         JNZ     MVLF01
  296.         POP     H
  297.         POP     D
  298.         POP     B
  299.         RET
  300.  
  301. ;               PROCEDURE TO PERFORM INTEGER MULTIPLICATION
  302.  
  303. ;               INPUTS:         HL = MULTIPLICAND
  304. ;                               DE = MULTIPLIER
  305. ;               OUTPUTS:        DEHL = PRODUCT
  306.  
  307. MULTIPLY:
  308.         PUSH    H
  309.         POP     B
  310.         MVI     A,16                    ; ITERATION COUNTER
  311.         LXI     H,0                     ; ZERO PRODUCT
  312. MULT01:
  313.         PUSH    PSW
  314.         MOV     A,D                     ; TEST NEXT
  315.         ANI     80H                     ; M$PLIER BIT
  316.         JZ      MULT02                  ; GO IF ZERO
  317.         DAD     B                       ; ADD M$CAND
  318.         JNC     MULT02                  ; GO IF NO CARRY
  319.         INX     D                       ; CARRY TO MS BYTES
  320. MULT02:
  321.         POP     PSW
  322.         DCR     A                       ; DECREMENT ITERATION COUNT
  323.         RZ                              ; DONE ON ZERO
  324.         XCHG
  325.         DAD     H                       ; SHIFT DE
  326.         XCHG
  327.         DAD     H                       ; SHIFT HL
  328.         JNC     MULT01                  ; GO IF NO CARRY
  329.         INX     D                       ; CARRY TO MS BYTES
  330.         JMP     MULT01                  ; LOOP
  331.         RET
  332.  
  333. ;               PROCEDURE TO PERFORM INTEGER DIVISION
  334.  
  335. ;               INPUTS:         HLDE = DIVIDEND
  336. ;                               BC = DIVISOR
  337. ;               OUTPUTS:        DE = QUOTIENT
  338. ;                               HL = REMAINDER
  339.  
  340. DIVIDE:
  341.         MOV     A,B                     ; GET
  342.         CMA                             ; TWO'S
  343.         MOV     B,A                     ; COMPLEMENT
  344.         MOV     A,C                     ; OF
  345.         CMA                             ; DIVISOR
  346.         MOV     C,A
  347.         INX     B
  348.         MVI     A,16                    ; ITERATION COUNT
  349. DVID01:
  350.         PUSH    PSW                     ; SAVE COUNT
  351.         DAD     H                       ; SHIFT HL
  352.         XCHG                            ; DE TO HL FOR SHIFT
  353.         DAD     H                       ; SHIFT DE
  354.         XCHG
  355.         JNC     DVID02                  ; GO IF NO CARRY
  356.         INX     H                       ; CARRY TO MS 2 BYTES
  357. DVID02:
  358.         PUSH    H                       ; SAVE HL
  359.         MOV     A,L                     ; TEST IF
  360.         ADD     C                       ; HL>BC
  361.         MOV     A,H
  362.         ADC     B
  363.         POP     H                       ; RETRIEVE HL
  364.         JM      DVID03                  ; GO IF HL<BC
  365.         DAD     B
  366.         INX     D
  367. DVID03:
  368.         POP     PSW                     ; RETRIEVE COUNTER
  369.         DCR     A                       ; DECREMENT COUNT
  370.         JNZ     DVID01                  ; REPEAT UNTIL DONE
  371.         RET
  372.  
  373.  
  374.