Advertisement
mcleod_ideafix

Jupiter ACE SAVE routine

Nov 17th, 2018
584
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ; ---------------------------------
  2. ; THE 'CASSETTE INTERFACE' ROUTINES
  3. ; ---------------------------------
  4.  
  5. ; ---
  6. ; save to tape
  7. ; On entry: HL=address of block to save
  8. ;           DE=size of block to save
  9. ;           C =flag (00h = long pilot tone, FFh = short pilot tone)
  10. ;           (actually, the routine only checks the 7th bit of C to determine which length of pilot tone to apply)
  11. ; ---
  12.  
  13. L1820:  PUSH    IY
  14.  
  15.         PUSH    HL
  16.         POP     IY                      ; IY = address of block
  17.  
  18.         LD      HL,L1892
  19.         PUSH    HL                      ; 1892h is the return address for this routine
  20.  
  21.         LD      HL,$E000
  22.         BIT     7,C                     ; If C=00h
  23.         JR      Z,L1832                 ; HL remains with value E000h
  24.         LD      H,$FC                   ; else, HL = FC00h
  25. L1832:  INC     DE                      ; make the block 1-byte longer because the first byte to output is already held in C, not in memory.
  26.         DEC     IY
  27.         DI
  28.         XOR     A                       ; bit 3 of A will toggle between 0 and 1. We start with a low pulse.
  29.  
  30. L1837:  LD      B,$97                   ; Here begins the loop that outputs the pilot tone. Number of half-periods is 65536-HL.
  31.  
  32. L1839:  DJNZ    L1839                   ; 1963 t-states delay (length of a half-period)
  33.         OUT     ($FE),A
  34.         XOR     $08                     ; Toggle MIC bit
  35.         INC     L
  36.         JR      NZ,L1843                ; Next half period
  37.         INC     H
  38. L1843:  JR      NZ,L1837                ; Until we reach 0000h in HL.
  39.         LD      B,$2B
  40. L1847:  DJNZ    L1847                   ; First (high) sync pulse: 559 t-states
  41.         OUT     ($FE),A                 ; Set MIC to low.
  42.         LD      L,C                     ; L holds now the flag byte.
  43.         LD      BC,$3B08
  44. L184F:  DJNZ    L184F                   ; Second (low) sync pulse: 767 t-states
  45.         LD      A,C
  46.         OUT     ($FE),A                 ; Set MIC to high.
  47.         LD      B,$38
  48.         JP      L188A                   ;
  49.  
  50. L1859:  LD      A,C
  51.         BIT     7,B
  52.  
  53. L185C:  DJNZ    L185C                   ; Delay a half-period of a 0 pulse (728 t-states)
  54.  
  55.         JR      NC,L1864                ; If the bit being written is 0, don't add more delay and go right to the OUT part.
  56.  
  57.         LD      B,$3D
  58. L1862:  DJNZ    L1862                   ; if it was a 1, then add a delay so the total delay is the half-period of a 1 pulse (1521 t-states)
  59.  
  60. L1864:  OUT     ($FE),A                 ; toogle MIC output.
  61.         LD      B,$3A
  62.         JP      NZ,L1859                ; Go to the head of the loop for writting bits
  63.         DEC     B
  64.         XOR     A
  65.  
  66. ;Loop to output the eight bits of a byte
  67. L186D:  RL      L                       ; CF = bit 7 of L. CF holds the bit about to be written to the tape.
  68.         JP      NZ,L185C                ; As long as L is not zero, there will be bits waiting for be outputted.
  69.         DEC     DE                      ; No more bits to transfer, so count one less byte in the byte counter...
  70.         INC     IY                      ; ... and point IY to the next byte to read.
  71.         LD      B,$2E
  72.  
  73.         LD      A,$7F
  74.         IN      A,($FE)                 ; Time to check for SPACE(BREAK) pressed
  75.         RRA
  76.         RET     NC                      ; jump to 1892h if so.
  77.  
  78.         LD      A,D                     ; have we written all the bytes, *including* checksum?
  79.         CP      $FF
  80.         RET     NC                      ; jump to 1892h if so.
  81.  
  82.         OR      E
  83.         JR      Z,L188F                 ; go write the checksum on tape if all the data bytes have been written.
  84.  
  85.         LD      L,(IY+$00)              ; if not, there's data left to write. Read in the next byte
  86. L1887:  LD      A,H                     ;
  87.         XOR     L                       ; Update the checksum byte (H)
  88.         LD      H,A                     ;
  89.  
  90. L188A:  XOR     A                       ; and go again to write bits.
  91.         SCF                             ; CF=1, so the first RL L executed will put a '1' in bit 0.
  92.         JP      L186D                   ; JUMP back
  93.  
  94. ; ---
  95.  
  96. L188F:  LD      L,H                     ; Load L with the checksum byte
  97.         JR      L1887                   ; and go again to write bits.
  98.  
  99.                                         ; RETURN ADDRESS FOR THE SAVE ROUTINE.....
  100. L1892:  POP     IY                      ; restore the original IY value so that
  101.                                         ; words can be used gain.
  102.  
  103.         EX      AF,AF'                  ;;
  104.        LD      B,$3B                   ;  end pulse: 767 t-states
  105.  
  106. L1897:  DJNZ    L1897                   ; self-loop for delay. Pulse high
  107.  
  108.        XOR     A
  109.        OUT     ($FE),A                 ; MIC output to low.
  110.  
  111.        LD      A,$7F                   ; read the port $7FFE
  112.        IN      A,($FE)                 ; keyrows SPACE to V.
  113.        RRA
  114.        EI                              ; Enable Interrupts.
  115.  
  116.        JP      NC,L04F0                ; jump if SPACE pressed to Error 3
  117.                                        ; 'BREAK pressed'.
  118.  
  119.        EX      AF,AF'                  ;;
  120.         RET                             ; return.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement