home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / BEEHIVE / UTILITYS / SOUNDS.ARC / SRECORD.MAC < prev   
Text File  |  1987-10-31  |  6KB  |  332 lines

  1.     .radix    0ah
  2.     .z80
  3.     aseg
  4.     title    Multilength sound recorder
  5.     org    100h
  6.  
  7. begin:    jp    start
  8.  
  9. our_fcb:    defs    36
  10.  
  11. ;-----------------------------------------
  12. ;    EQUATES
  13.  
  14. sys_rst        equ    0
  15. rd_con        equ    1
  16. wr_con        equ    2
  17. rd_rdr        equ    3
  18. wr_pun        equ    4
  19. wr_lst        equ    5
  20. direct_con    equ    6
  21. get_io_stat    equ    7
  22. put_io_stat    equ    8
  23. print_buf    equ    9
  24. rd_buf        equ    10
  25. con_rdy        equ    11
  26. version        equ    12
  27. init_bdos    equ    13
  28. log_disk    equ    14
  29. open_fil    equ    15
  30. close_fil    equ    16
  31. search_fil    equ    17
  32. search_next    equ    18
  33. del_fil        equ    19
  34. rd_seq        equ    20
  35. wr_seq        equ    21
  36. make_fil    equ    22
  37. rename_fcb    equ    23
  38. log_code    equ    24
  39. drive_no    equ    25
  40. set_dma        equ    26
  41. get_alloc    equ    27
  42. wrt_prot    equ    28
  43. get_ro        equ    29
  44. set_attrib    equ    30
  45. get_disk_parms    equ    31
  46. set_usr        equ    32
  47. rd_rand        equ    33
  48. wr_rand        equ    34
  49. file_size    equ    35
  50. set_rand    equ    36
  51.     
  52. ;bdos:        equ    5
  53. cr        equ    13
  54. lf        equ    10
  55. esc        equ    27
  56.  
  57. stop_bit    equ    0
  58. start_bit    equ    1
  59. default_fcb    equ    05ch
  60.  
  61. ;---------------------------------
  62. ;    Text messages
  63.  
  64. start_msg:
  65.         db    'MultiLength sound recorder',cr,lf
  66.         db    '$'
  67. instrs:
  68.         db    'Press start button to commence recording',cr,lf
  69.         db    'stop button to stop recording',cr,lf
  70.         db    '<ESC> before recording to quit...',cr,lf
  71.         db    '$'
  72. recording:    db    'Recording....',cr,lf
  73.         db    '$'
  74. length_record:    db    'Sound recorded occupies $'
  75. length_record2:    db    ' bytes in memory',cr,lf,'$'
  76. no_room_mesg:    db    'No room on disk- file not saved',cr,lf,'$'
  77.  
  78. ;----------------------------------
  79. ;    subroutines
  80.  
  81. bdos:    push    hl
  82.     push    de
  83.     push    bc
  84.     call    5
  85.     pop    bc
  86.     pop    de
  87.     pop    hl
  88.     ret
  89.  
  90. ;
  91. ; DECIMAL PRINT ROUTINE
  92. ; NUMBER TO PRINT IN HL REGISTER
  93. ;
  94. ODEC:    PUSH AF        ; SAVE
  95.     PUSH BC        ;
  96.     PUSH DE        ;
  97.     LD   IX,TENS    ; POINTER TO POWERS OF TEN
  98.     LD   B,5    ; FIVE DIGITS
  99.     LD   C,'0'    ; use C as leading zero flag
  100. ;
  101. LOOP:    LD   A,2FH    ; ASCII ZERO - 1
  102.     LD   E,(IX+0)    ; GET LOW BYTE
  103.     LD   D,(IX+1)    ; GET HIGH BYTE
  104. LOOP1:  AND  A        ; CHEAR CARRY
  105.     SBC  HL,DE    ; SUBTRACT DECADE
  106.     INC  A        ; INCREASE DIGIT
  107.     JR   NC,LOOP1    ; NOT NEGATIVE YET
  108.     ADD  HL,DE    ;  OK, RESTORE NO
  109.     CP   '0'    ; IS IT A ZERO ?
  110.     JR   Z,ZERO    ; YES DO LEADING ZERO TEST
  111.     LD   C,A    ; NO REMOVE SUPRESSION
  112. ODEC1:    PUSH BC        ; SAVE COUNT
  113.     LD   B,A    ; print needs it in B
  114.         CALL  VDU       ; PRINT
  115.     POP   BC    ; RESTORE COUNT
  116.     INC   IX    ; POINT TO NEXT
  117.     INC   IX    ; DECADE VALUE
  118.     DJNZ  LOOP    ; DO IT 5 TIMES
  119.     POP DE        ; RESTORE REGISTERS
  120.     POP BC        ;
  121.     POP AF        ;
  122.         RET        ; FINISHED
  123. ;
  124. ZERO:    CP   C        ; If A = '0' AND C = '0'
  125.     JR   NZ,ODEC1    ; IF NOT PRINT ZERO
  126.     LD   A,B    ; TEST COUNTER
  127.     CP   1        ; TO SEE IF LAST DIGIT
  128.     LD   A,'0'    ; RESTORE A
  129.     JR   Z,ODEC1    ; LAST DIGIT,PRINT '0'
  130.     LD   A,' '    ; IF TRUE PRINT SPACE
  131.     JR   ODEC1;
  132. ; Table for conversion to decimal
  133. ;
  134. TENS:   DEFW  10000
  135.     DEFW  1000
  136.     DEFW  100
  137.     DEFW  10
  138.     DEFW  1
  139. ;
  140. ; Carriage Return  Line Feed Routine
  141. ; called CRLF.
  142. ; no registers are changed.
  143. ;
  144. CRLF:    PUSH BC        ; Save BC.
  145.     LD   B,0DH    ; CR
  146.     CALL VDU    ; do it
  147.     LD   B,0AH    ; LF
  148.     CALL VDU    ; do it
  149.     POP  BC        ; Restore BC
  150.     RET        ; Thats All !!
  151.  
  152. vdu:    push    de
  153.     ld    e,b
  154.     ld    c,wr_con
  155.     call    bdos
  156.     pop    de
  157.     ret
  158. ;--------------------------------
  159. ;    program code
  160.  
  161. start:    ld    de,start_msg
  162.     ld    c,print_buf
  163.     call    bdos
  164.     ld    de,instrs
  165.     call    bdos
  166. ;init_pio:
  167.     ld    a,11001111b    ;set up port for control
  168.     out    (1),a
  169.     ld    a,00000011b    ;bits 0,1 inputs, rest outputs 
  170.     out    (1),a
  171.  
  172. wait_esc:
  173.     ld    c,direct_con
  174.     ld    e,0ffh
  175.     call    bdos
  176.     cp    esc        ;escape code?
  177.     jp    z,done
  178.     in    a,(0)        ;which bit?
  179.     bit    start_bit,a
  180.     jr    nz,wait_esc    ;pulled low to begin.
  181.  
  182.     ld    de,recording
  183.     ld    c,print_buf
  184.     call    bdos
  185.  
  186.     ld    hl,record+2    ;length goes in record buffer start.
  187. main_record:
  188.     ld    b,7        ;count bits thru cass.
  189.     ld    c,0        ;start with clean accumulator
  190. record_loop:
  191.     in    a,(2)        ;sample cassette line
  192.     rra            ;cassette bit into carry
  193.     rl    c        ;and from carry to storage
  194.     ld    a,c
  195.     add    a,a
  196.     add    a,a
  197.     add    a,a
  198.     add    a,a
  199.     add    a,a
  200.     add    a,a
  201.     out    (2),a        ;echo to speaker
  202.     ld    a,7        ;waste some time
  203. here:    dec    a
  204.     jr    nz,here
  205.     ld    a,i
  206.     ld    a,i
  207.     nop
  208.     nop
  209.     nop            ;waste some more time
  210.     ld    a,0
  211.     djnz    record_loop
  212.     in    a,(2)
  213.     rra
  214.     rl    c        ;repeat for last bit
  215.     ld    (hl),c        ;store it
  216.     ld    a,c
  217.     add    a,a
  218.     add    a,a
  219.     add    a,a
  220.     add    a,a
  221.     add    a,a
  222.     add    a,a
  223.     out    (2),a        ;echo to speaker
  224.     inc    hl        ;test for end of memory
  225.     ld    a,h
  226.     cp    0c0h        ;reached top address yet?
  227.     jr    z,nquit        ;yep!
  228.     in    a,(0)
  229.     bit    stop_bit,a    ;stop switch pressed?
  230.     jr    z,nquit        ;absolutely!
  231.     ld    a,4
  232. here2:    dec    a
  233.     jr    nz,here2
  234.     ld    a,i        ;waste yet more time
  235.     ld    a,i
  236.     ld    a,i
  237.     jr    main_record
  238.  
  239. nquit:    ld    de,-(record+2)    ;negate for addition
  240.     add    hl,de
  241.     ld    (record),hl    ;store this length
  242.     ld    de,length_record
  243.     ld    c,print_buf
  244.     call    bdos
  245.     push    hl        ;retain the length
  246.     call    odec
  247.     ld    de,length_record2
  248.     ld    c,print_buf
  249.     call    bdos
  250.     pop    hl
  251.  
  252. save_sound:
  253.     ld    a,l
  254.     cp    80h        ;work out how many sectors to
  255.     jr    c,save_sound2    ;save to disk
  256.     ld    de,80h
  257.     add    hl,de
  258. save_sound2:
  259.     ld    a,l        ;into djnz count
  260.     and    80h
  261.     ld    l,a
  262.     ld    b,7
  263. div128:    xor    a
  264.     rr    h
  265.     rr    l
  266.     djnz    div128
  267.     ld    b,h
  268.     ld    c,l
  269.     push    bc
  270.     ld    hl,default_fcb
  271.     ld    de,our_fcb
  272.     ld    bc,12
  273.     ldir
  274.     ld    hl,our_fcb+12
  275.     ld    de,our_fcb+13
  276.     ld    (hl),0
  277.     ld    bc,24
  278.     ldir
  279.     ld    de,our_fcb    ;now make our output file
  280.     ld    c,del_fil
  281.     call    bdos
  282.     ld    c,make_fil
  283.     call    bdos
  284.     pop    bc
  285.     cp    255        ;room on disk?    
  286.     jr    z,no_room
  287.  
  288.     ld    de,record
  289. write_on_disk:
  290.     push    bc
  291.     ld    c,set_dma
  292.     call    bdos
  293.     push    de        ;save dma address
  294.     ld    de,our_fcb
  295.     ld    c,wr_seq
  296.     call    bdos
  297.     pop    de
  298.     pop    bc
  299.     or    a
  300.     jr    nz,no_room
  301.     ex    de,hl
  302.     ld    de,128
  303.     add    hl,de        ;update record pointer
  304.     ex    de,hl
  305.     dec    bc
  306.     ld    a,b
  307.     or    c
  308.     jr    nz,write_on_disk
  309.  
  310.     ld    de,our_fcb
  311.     ld    c,close_fil
  312.     call    bdos
  313.     jr    done
  314.  
  315. no_room:
  316.     ld    de,our_fcb
  317.     ld    c,close_fil
  318.     call    bdos
  319.     ld    c,del_fil
  320.     call    bdos
  321.     ld    de,no_room_mesg
  322.     ld    c,print_buf
  323.     call    bdos
  324.  
  325. done:    ld    a,00001111b        ;reset pio to output
  326.     out    (1),a
  327.     jp    sys_rst            ;program done
  328.  
  329. record    equ    $
  330.  
  331.     end
  332.