home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol058 / cutil.sqc / CUTIL.SRC
Encoding:
Text File  |  1985-02-10  |  11.3 KB  |  429 lines

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