home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol020 / cass.z80 < prev    next >
Text File  |  1984-04-29  |  8KB  |  507 lines

  1.     TITLE CASSETTE SUBSYSTEM FOR SYSTEM MONITOR
  2. ;
  3. ;  ****Donated to the Pascal/Z80 Users Group, July 1980*****
  4. ;
  5. ;    A CASSETTE SUBSYSTEM FOR SYSTEM MONITOR
  6. ;    IT CONTROLS THE DAJEN/TELETEK UCRI. INCLUDES
  7. ;    ZAPPLE COMPATABLE {RI} AND {PO} INTERTIE
  8. ;
  9. ;    MODIFIED FOR C-MACRO ASSEMBLER MAY 1979 
  10. ;
  11. ;
  12. ;    CONSOLE BASE ADDRESS AND CASSETTE WORK AREA BASE
  13. ;
  14. ;    CBASE IS CONSOLE BASE ADDRESS
  15. ;    TWBASE IS CASSETTE VARIABLE BASE
  16. ;
  17. ;CASSETTE PORTS
  18. ;
  19. IOBASE    EQU    060H        ;PORT BASE
  20. PORTC    EQU    0CH+IOBASE    ;FILL OUTPUT PORT
  21. PORTD    EQU    0DH+IOBASE    ;STATUS PORT
  22. PORTE    EQU    0EH+IOBASE    ;LEVEL & RELAY PORT
  23. PORTF    EQU    0FH+IOBASE    ;DATA I/O PORT
  24. ;
  25. ;    CONSOLE CALL ADDRESSES
  26. ;
  27. CCALL1    EQU    CBASE+9
  28. CCALL2    EQU    CBASE+21H
  29. ;
  30. ;ENTRIES
  31. ;
  32. TBASE    EQU    $
  33. TNTRY0    JP    TINIT    ;INITIALIZE THE PACKAGE
  34. TNTRY1    JP    SVASC    ;ZAPPLE {PO} WRITE CASSETTE
  35. TNTRY2    JP    LDASC    ;ZAPPLE {RI} READ CASSETTE
  36. TNTRY3    JP    TWRITE    ;SPHINX-DAJEN WRITE CASSETTE
  37. TNTRY4    JP    TREAD    ;SPHINX-DAJEN READ CASSETTE
  38. TNTRY5    JP    OPENOUT ;CORE OPEN CASSETTE OUT-FILE
  39. TNTRY6    JP    CTOUT    ;CORE WRITE CASSETTE
  40. TNTRY7    JP    CLOUT    ;CORE CLOSE CASSETTE OUT-FILE
  41. TNTRY8    JP    OPENIN    ;CORE OPEN CASSETTE INP-FILE
  42. TNTRY9    JP    CTINP    ;CORE READ CASSETTE
  43. TNTRYA    JP    CLINP    ;CORE CLOSE CASSETTE INP-FILE
  44. ;
  45. ;EXTERNAL CALL VECTORS TO CONSOLE I.0
  46. ;
  47. TKEYIN    JP    CCALL1    ;UNSTROBED KEYBOARD CALL
  48. TBFOUT    JP    CCALL2    ;BUFFOUT MESSAGE CALL
  49. ;
  50. ;WORK AREA OF CASSETTE PACKAGE
  51. ;
  52. TWRK    DEFW    TWBASE
  53. ;
  54. ;    INITIALIZE THE PACKAGE
  55. ;
  56. TINIT    CALL    TSETUP
  57.     LD    A,0E6H
  58.     LD    (IY),A
  59.     CALL    TERROR
  60.     OR    A
  61.     JP    TEXIT
  62. ;
  63. ;    SAVE IY REG .. USED IN CASSETTE PACKAGE
  64. ;
  65. TSETUP    EX    (SP),IY
  66.     PUSH    IY
  67.     LD    IY,(TWRK)
  68.     RET
  69. ;
  70. ;    EXIT FORM CASSETTE PACKAGE
  71. ;
  72. TEXIT    POP    IY
  73.     RET
  74. ;
  75. ;    ERROR RETURN
  76. ;
  77. POPERR    POP    HL
  78. ERROUT    LD    HL,TMSG1
  79.     CALL    TBFOUT
  80.     JR    TEXIT
  81. ;
  82. ;    COMPLETE RETURN
  83. ;
  84. TDONE    LD    HL,TMSG2
  85.     CALL    TBFOUT
  86.     JR    TEXIT
  87. ;
  88. ;    CHECKSUM ERROR RETURN
  89. ;
  90. CKSMER    LD    HL,TMSG3
  91.     CALL    TBFOUT
  92.     JR    TEXIT
  93. ;
  94. ;    TEST FOR ESCAPE
  95. ;
  96. GETOUT    CALL    TKEYIN
  97.     CP    1BH
  98.     JR    Z,ESC1
  99.     OR    A
  100.     RET
  101. ESC1    SCF
  102.     RET
  103. ;
  104. ;CORE ROUTINES TO DRIVE THE DAJEN UCRI
  105. ;
  106. ;
  107. ;    INPUT A BYTE TO CASSETTE
  108. ;
  109. CTINP:    CALL    GETOUT    ;CK ESCAPE
  110.     JR    Z,CTI1    ;ESCAPE
  111.     IN    A,(PORTE)
  112.     AND    10H    ;READY?
  113.     JR    NZ,CTINP ;NO
  114.     IN    A,(PORTF);YES  GET BYTE
  115.     OR    A
  116.     RET        ;NORMAL RETURN
  117. CTI1:    SCF        ;ESCAPE RETURN
  118.     RET
  119. ;
  120. ;    OUTPUT A BYTE TO CASSETTE
  121. ;
  122. CTOUT:    PUSH    AF    ;SAVE BYTE TEMP.
  123. CTO1:    CALL    GETOUT    ;ESCAPE?
  124.     JR    Z,CTO2    ;YES
  125.     IN    A,(PORTD)
  126.     AND    01H    ;READY?
  127.     JR    Z,CTO1    ;NO
  128.     POP    AF    ;YES, GET BYTE
  129.     OUT    (PORTF),A
  130.     OR    A
  131.     RET        ;NORMAL RETURN
  132. CTO2:    POP    AF
  133.     SCF
  134.     RET        ;ESCAPE RETURN
  135. ;
  136. ;    DELAY ROUTINES
  137. ;
  138. DELAY:    PUSH HL
  139.     LD    HL,0H
  140. DL1:    CALL    GETOUT
  141.     JR    Z,DL5
  142. DL2:    INC    H
  143.     JR    Z,DL4
  144. DL3:    INC    L
  145.     JR    NZ,DL3
  146.     JR    DL1
  147. DL4:    OR    A
  148.     POP    HL
  149.     RET        ;NORMAL RETURN
  150. DL5:    SCF
  151.     POP    HL
  152.     RET        ;ESCAPE RETURN
  153. ;
  154. DELAY3: CALL    DELAY
  155.     RET C
  156. ;
  157. DELAY2: CALL    DELAY
  158.     RET C
  159.     CALL    DELAY
  160.     RET
  161. ;
  162. ;    OPEN CASSETTE INPUT FILE
  163. ;    LOOK FOR SYNC BYTE THEN RET
  164. ;
  165. OPENIN    CALL    TSETUP
  166.     CALL    OPINP
  167.     JP    TEXIT
  168. ;
  169. OPINP:    PUSH    HL
  170.     LD    HL,TMSG4
  171.     CALL    TBFOUT
  172.     LD    A,28H    ;START CASSETTE
  173.     OUT    (PORTE),A
  174. OPI1:    CALL    GETOUT    ;ESCAPE?
  175.     JR    Z,OPI2    ;YES
  176.     IN    A,(PORTE)
  177.     AND    40H    ;LEVEL OK?
  178.     JR    Z,OPI1    ;NO
  179.     CALL    DELAY    ;YES, WAIT A WHILE
  180.     JR    C,OPI3    ;ESCAPE
  181.     IN    A,(PORTE)    
  182.     AND    40H    ;LEVEL STILL OK?
  183.     JR    Z,OPINP ;NO, RESTART
  184.     CALL    DELAY    ;YES, WAIT SOME MORE
  185.     JR    C,OPI3    ;ESCAPE
  186.     LD    A,(IY);LOAD SYNC BYTE
  187.     OUT    (PORTD),A
  188.     LD    HL,TMSG5 ;NORMAL RETURN
  189.     CALL    TBFOUT
  190.     OR    A
  191.     JR    OPI3
  192. OPI2:    SCF        ;ESCAPE RETURN
  193. OPI3:    POP    HL
  194.     RET
  195. ;
  196. ;    OPEN CASSETTE OUTPUT FILE
  197. ;    OUTPUT A LEADER OF NULLS
  198. ;
  199. OPENOUT CALL    TSETUP
  200.     CALL    OPOUT
  201.     JP    TEXIT
  202. ;
  203. OPOUT:    PUSH    HL
  204.     LD    HL,TMSG6
  205.     CALL    TBFOUT
  206.     POP    HL
  207.     LD    A,28H    ;INIT CASSETTE
  208.     OUT    (PORTE),A
  209.     OUT    (PORTD),A
  210.     CALL    DELAY    ;OUTPUT SILENT LEADER
  211.     RET C        ;ESCAPE
  212.     SUB    A
  213.     OUT    (PORTC),A
  214.     CALL    DELAY3    ;OUTPUT FILL TONE
  215.     RET C        ;ESCAPE
  216.     CALL    DELAY3
  217.     RET C        ;ESCAPE
  218.     CALL    DELAY3
  219.     RET C        ;ESCAPE
  220.     LD    A,3CH    ;OUTPUT CLOCK BYTE
  221.     CALL    CTOUT
  222.     RET C        ;ESCAPE
  223.     LD    A,(IY);OUTPUT SYNC BYTE
  224.     CALL    CTOUT
  225.     RET C        ;ESCAPE
  226.     OR    A
  227.     RET        ;NORMAL RETURN
  228. ;
  229. ;    CLOSE CASSETTE INPUT AND OUTPUT FILES
  230. ;        OUT - OUTPUT A TRAILER OF NULLS
  231. ;        INP - MOVE ONTO THE TRIAULER 
  232. ;        TURN OFF CASSETTE ALSO
  233. ;
  234. CLOUT:    SUB    A    ;OUTPUT TRAILER TONE
  235.     CALL    CTOUT
  236.     RET C        ;ESCAPE
  237.     CALL    DELAY
  238.     RET C
  239. OFFCAS: LD    A,28H    ;OUTPUT SILENT TONE
  240.     OUT    (PORTE),A
  241.     OUT    (PORTD),A
  242. CLINP:    CALL    DELAY    ;INP ENTRY
  243.     RET C        ;ESCAPE
  244.     LD    A,38H    ;TURN OFF CASSETE
  245.     OUT    (PORTE),A
  246.     OR    A
  247.     RET        ;NORMAL RETURN
  248. ;
  249. ;    ESCAPE RETURN
  250. ;
  251. TERROR    CALL    OFFCAS
  252.     LD    A,02H
  253.     LD    (IY+1),A
  254.     SCF        ;SET CARRY FLAG
  255.     RET
  256. ;
  257. ;    DAJEN OUTPUT TO CASSETTE ROUTINE
  258. ;    TARBELL COMPATABLE W/CKSUM
  259. ;
  260. TWRITE    CALL    TSETUP
  261.     EX    DE,HL
  262.     LD    B,0
  263.     CALL    OPOUT    ;OPEN FILE
  264.     JP    C,ERROUT
  265.     LD    A,E    ;SEND STARTING ADDRESS
  266.     CALL    DJCO
  267.     JP    C,ERROUT
  268.     LD    A,D
  269.     CALL    DJCO
  270.     JP    C,ERROUT
  271.     LD    A,H    ;SEND NUMBER OF BYTES
  272.     CALL    DJCO
  273.     JP    C,ERROUT
  274.     LD    A,L
  275.     CALL    DJCO
  276.     JP    C,ERROUT
  277. DJ1:    LD    A,(DE)    ;SEND A BYTE
  278.     CALL    DJCO
  279.     JP    C,ERROUT
  280.     INC    DE
  281.     DEC    HL
  282.     SUB    A
  283.     OR    H
  284.     OR    L
  285.     JR    NZ,DJ1
  286.     LD    A,B    ;SEND CKSUM
  287.     CALL    DJCO
  288.     JP    C,ERROUT
  289.     CALL    CLOUT    ;CLOSE FILE
  290.     JP    C,ERROUT
  291.     JP    TDONE
  292. ;
  293. ;    DAJEN INPUT CASSETTES ROUTINE
  294. ;    3 OPTIONS AVAILABLE
  295. ;        I(CR)        STANDARD LOAD
  296. ;        IBBBB(CR)    STD.LD W/BIAS
  297. ;        IXXXX,YYYY(CR)    LOAD SPECIFIC
  298. ;                WHERE X,Y ARE BEG
  299. ;                AND END. ADDR.
  300. ;
  301. TREAD    CALL    TSETUP
  302.     OR    A
  303.     JR    Z,TRD1
  304. ;
  305. ;    LOAD SPECIFIC FROM ADDR1 TO ADDR2
  306. ;
  307.     EX    DE,HL
  308.     CALL    OPINP    ;OPEN FILE
  309.     JP    C,ERROUT
  310.     CALL    DJ4    ;LOAD IN FILE
  311.     CALL    CLINP    ;CLOSE FILE    
  312.     JP    C,ERROUT
  313.     JP    TDONE
  314. ;
  315. ;    LOAD ABSOLUTE AS DIRECTED ON TAPE
  316. ;    WITH A BIAS RESIDING IN REG HL
  317. ;
  318. TRD1    CALL    OPINP    ;OPEN FILE
  319.     JP    C,ERROUT
  320.     LD    B,0    ;INITIALIZE CKSUM
  321.     CALL    DJCI    ;GET STARTING ADDR
  322.     JP    C,ERROUT
  323.     LD    E,A
  324.     CALL    DJCI
  325.     JP    C,ERROUT
  326.     LD    D,A
  327.     ADD    HL,DE    ;ADD ON BIAS
  328.     EX    DE,HL
  329.     CALL    DJCI    ;GET NO. OF BYTES
  330.     JP    C,ERROUT
  331.     LD    H,A
  332.     CALL    DJCI
  333.     JP    C,ERROUT
  334.     LD    L,A
  335.     CALL    DJ4    ;LOAD IN FILE
  336.     CALL    CTINP    ;GET CKSUM
  337.     CP    B
  338.     PUSH    AF
  339.     CALL    CLINP    ;CLOSE FILE
  340.     JP    C,POPERR
  341.     POP    AF
  342.     JP    NZ,CKSMER
  343.     JP    TDONE
  344. DJ4:    CALL    DJCI    ;LOAD IN FILE
  345.     JP    C,POPERR
  346.     LD    (DE),A
  347.     INC    DE
  348.     DEC    HL
  349.     LD    A,H
  350.     OR    L
  351.     JR    NZ,DJ4
  352.     RET
  353. DJCI:    CALL    CTINP    ;GET BYTE
  354.     RET C
  355.     PUSH    AF
  356.     CALL    DJCK
  357.     POP    AF
  358.     RET
  359. DJCO:    CALL    CTOUT    ;SEND BYTE
  360.     RET C
  361. DJCK    ADD    A,B
  362.     LD    B,A    
  363.     OR    A
  364.     RET
  365.     EJECT
  366. ;
  367. ;    CASSETTE ROUTINES FOR ZAPPLE BASIC
  368. ;    ENTRY THOUGH THE MONITOR
  369. ;    WRITTEN BY RICHARD LERSETH AUG 15, 1978
  370. ;
  371. ;    CHECK FOR {FFH} IN PRES AND LAST BYTE
  372. ;
  373. CKFF:    INC    A    ;PRES FF?
  374.     LD    A,(IY+2)
  375.     JR    Z,CK3    ;YES
  376.     INC    A    ;LAST FF?
  377.     JR    Z,CK1    ;YES
  378.     SUB    A    ; <>   <>
  379.     INC    A
  380.     RET
  381. CK1    INC    A    ; <>   =       
  382. CK2    SCF        ; =    =
  383.     RET
  384. CK3    INC    A    ;LAST FF?
  385.     JR    Z,CK2    ;YES
  386.     SUB    A    ; =    <>
  387.     RET
  388. ;
  389. ;    CHECK FOR END OF FILE
  390. ;
  391. CKEND:    LD    A,(IY+3)
  392.     INC    A
  393.     LD    (IY+3),A
  394.     CP    08H
  395.     JR    NZ,CKE1
  396.     LD    A,(IY+4)
  397.     OR    A
  398.     JR    NZ,CKE1
  399.     SCF
  400.     RET
  401. CKE1    SUB    A
  402.     RET
  403. ;
  404. ;    RESET FLAG AND COUNTER
  405. ;
  406. RESET:    SUB    A
  407.     LD    (IY+3),A
  408.     LD    (IY+4),A
  409.     RET
  410. ;
  411. ;    OUTPUT TO CASSETTE
  412. ;
  413. SVASC    CALL    TSETUP
  414.     CALL    SAVE
  415.     JP    TEXIT
  416. ;
  417. SAVE    LD    A,(IY+1)    ;TRANS MODE?
  418.     OR    A
  419.     JR    NZ,SVFORE
  420.     LD    A,C
  421.     CALL    CTOUT
  422.     JP    C,TERROR
  423.     CALL    CKFF
  424.     LD    A,C
  425.     LD    (IY+2),A
  426.     JR    Z,AS1
  427.     CALL    C,RESET
  428.     RET
  429. AS1    CALL    CKEND
  430.     JR    C,SVAFT
  431.     RET
  432. ;
  433. SVFORE: LD    A,C
  434.     INC    A
  435.     JP    NZ,TERROR
  436.     CALL    OPOUT
  437.     JP    C,TERROR
  438.     LD    A,C
  439.     LD    (IY+2),A
  440.     CALL    CTOUT
  441.     JP    C,TERROR
  442.     SUB    A
  443.     LD    (IY+3),A
  444.     LD    (IY+1),A
  445.     INC    A
  446.     LD    (IY+4),A
  447.     RET
  448. ;
  449. SVAFT:    CALL    CLOUT
  450.     JP    C,TERROR
  451.     LD    A,2
  452.     LD    (IY+1),A
  453.     RET
  454. ;
  455. ;    INPUT FROM CASSETTE
  456. ;
  457. LDASC    CALL    TSETUP
  458.     CALL    LOAD
  459.     JP    TEXIT
  460. ;
  461. LOAD    LD    A,(IY+1)
  462.     DEC    A
  463.     JR    NZ,LDFORE
  464.     CALL    CTINP
  465.     JP    C,TERROR
  466.     PUSH    AF
  467.     CALL    CKFF
  468.     JR    Z,AL1
  469.     CALL    C,RESET
  470.     POP    AF
  471.     RET
  472. ;
  473. AL1    CALL    CKEND
  474.     JR    C, LDAFT
  475.     POP    AF
  476.     RET
  477. ;
  478. LDFORE: CALL    OPINP
  479.     JP    C,TERROR
  480.     SUB    A
  481.     LD    (IY+3),A
  482.     INC    A
  483.     LD    (IY+1),A
  484.     CALL    CTINP
  485.     JP    C,TERROR
  486.     LD    (IY+2),A
  487.     RET
  488. ;
  489. LDAFT:    CALL    CLINP
  490.     JR    NC,LD1
  491.     POP    AF
  492.     JP    TERROR
  493. LD1    POP    AF
  494.     RET
  495. ;
  496. ;PACKAGE MESSAGES
  497. CR    DEFL    0DH
  498. LF    DEFL    0AH
  499. EOM    DEFL    00H
  500. ;
  501. TMSG1    DEFB    CR,LF,'ESCAPE',EOM
  502. TMSG2    DEFB    CR,LF,'COMPLETE',EOM
  503. TMSG3    DEFB    CR,LF,'CHECKSUM ERROR',EOM
  504. TMSG4    DEFB    CR,LF,'>SEARCHING ',EOM
  505. TMSG5    DEFB    '* READING',EOM
  506. TMSG6    DEFB    CR,LF,'>WRITING ',EOM
  507.