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 / SIMTEL / CPMUG / CPMUG019.ARK / TREAD.ASM < prev    next >
Assembly Source File  |  1984-04-29  |  16KB  |  519 lines

  1. ;         TDUMP - DUMP CASSETTE TAPE TO CONSOLE
  2. ;
  3. ;         L.E. HUGHES     8080SDC     77/06/21
  4.  
  5.           ORG    100H
  6.  
  7. ;         BDOS ENTRY POINT AND FUNCTION CODES
  8.  
  9.  BDOS     EQU    5
  10.  TYPEF    EQU    2              ;TYPE CONSOLE CHARACTER
  11.  CONS     EQU    01             ;READ CONSOLE
  12.  BRKF     EQU    11             ;CONSOLE BREAKIN CHECK
  13.  CLOSEF   EQU    16             ;CLOSE FILE
  14.  DELTF    EQU    19             ;DELETE FILE
  15.  WRITEF   EQU    21             ;WRITE FILE
  16.  MAKEF    EQU    22             ;MAKE NEW FILE
  17.  
  18. ;         FILE CONTROL BLOCK DEFINITIONS
  19.  
  20.  FCB      EQU    5CH            ;DEFAULT FILE CONTROL BLOCK ADDRESS
  21.  DBUF     EQU    80H            ;DEFAULT DISK  BUFFER
  22.  FCBFN    EQU    FCB+1          ;FILE NAME
  23.  FCBFT    EQU    FCB+9          ;FILE TYPE
  24.  FCBCR    EQU    FCB+32         ;CURRENT RECORD
  25.  
  26.  FNAME    EQU    FCBFN
  27.  
  28. ;         MISC. EQUATES
  29.  
  30.  CASC     EQU    6EH            ;CASSETTE TAPE CONTROL/STATUS PORT
  31.  CASD     EQU    6FH            ;CASSETTE TAPE DATA PORT
  32.  CR       EQU    0DH            ;ASCII CARRIAGE RETURN
  33.  LF       EQU    0AH            ;ASCII LINE FEED
  34.  SOH      EQU    01H            ;ASCII START OF HEADER
  35.  STX      EQU    02H            ;ASCII START OF TEXT
  36.  ETX      EQU    03H            ;ASCII END OF TEXT
  37.  
  38. ;         MAIN PROGRAM
  39.  
  40.  TDUMP:   LXI    H,0            ;SAVE ENTRY SP
  41.           DAD    SP
  42.           SHLD   OLDSP
  43.           LXI    SP,STACK+64    ;SETUP LOCAL STACK
  44.           LXI    H,MSG0         ;PRINT INSTRUCTIONS
  45.           CALL   WAS
  46.           CALL   RAC            ;AWAIT RESPONSE, AND DISCARD IT
  47.           MVI    A,0            ;READ FIRST PRU FROM TAPE 0
  48.           LXI    H,TBUF
  49.           CALL   CTRR
  50.           PUSH   PSW
  51.           LXI    H,MSG1         ;PRINT 'FILE NAME = '
  52.           CALL   WAS
  53.           LXI    H,FNAME        ;PRINT FILE NAME
  54.           CALL   WAS
  55.           CALL   CRLF
  56.           POP    PSW
  57.           CALL   CTERR
  58.           IN     0FFH           ;READ SENSESWITCHES
  59.           ANI    02H            ;JUMP IF SW1 OFF
  60.           JZ     TDUM7
  61.           CALL   DELT           ;DELETE FILE, IF IT EXISTS
  62.           CALL   MAKE           ;CREATE NEW FILE
  63.           XRA    A              ;POSITION TO BEGINNING OF FILE
  64.           STA    FCBCR
  65.  TDUM7:   PUSH   D              ;SAVE PRU SIZE
  66.           LXI    H,0            ;INITIALIZE COUNTER
  67.           SHLD   CTR
  68.  TDUM0:   LXI    H,MSG3         ;PRINT 'PRN = '
  69.           CALL   WAS
  70.           LDA    PRN            ;PRINT PRN
  71.           CALL   WHB
  72.           LXI    H,MSG4         ;PRINT '     SIZE = '
  73.           CALL   WAS
  74.           MOV    A,D            ;PRINT SIZE
  75.           CALL   WHB
  76.           MOV    A,E
  77.           CALL   WHB
  78.           IN     0FFH           ;READ SENSESWITCHES
  79.           ANI    01H            ;JUMP IF SW0 OFF
  80.           JZ     TDUM3
  81.           CALL   CRLF
  82.           LXI    H,TBUF         ;DUMP PRU TO CONSOLE
  83.  TDUM1:   MVI    C,16           ;NUMBER OF BYTES PER LINE
  84.           CALL   CRLF
  85.           PUSH   H
  86.           LHLD   CTR
  87.           MOV    A,H            ;PRINT COUNTER
  88.           CALL   WHB
  89.           MOV    A,L
  90.           CALL   WHB
  91.           MVI    A,' '          ;PRINT ONE SPACE
  92.           CALL   WAC
  93.           POP    H
  94.           PUSH   D
  95.           PUSH   H              ;SAVE BUFFER POINTER
  96.  TDUM2:   MOV    A,D            ;EXIT IF ENTIRE PRU DUMPED
  97.           ORA    E
  98.           JZ     TDUM6
  99.           MOV    A,M            ;FETCH NEXT BYTE
  100.           INX    H
  101.           CALL   WHB            ;WRITE BYTE IN HEX
  102.           MVI    A,' '          ;WRITE A SPACE
  103.           CALL   WAC
  104.           PUSH   H              ;INCREMENT COUNTER
  105.           LHLD   CTR
  106.           INX    H
  107.           SHLD   CTR
  108.           POP    H
  109.           DCX    D
  110.           DCR    C              ;LOOP IF MORE ROOM ON LINE
  111.           JNZ    TDUM2
  112.           MVI    A,' '          ;PRINT TWO SPACES
  113.           CALL   WAC
  114.           CALL   WAC
  115.  TDUM6:   POP    H              ;RESTORE BUFFER POINTER
  116.           POP    D
  117.           MVI    C,16           ;NUMBER OF BYTES PER LINE
  118.  TDUM5:   MOV    A,D            ;EXIT IF ENTIRE PRU DUMPED
  119.           ORA    E
  120.           JZ     TDUM3
  121.           MOV    A,M            ;FETCH NEXT BYTE
  122.           INX    H
  123.           DCX    D              ;DECREMENT COUNT
  124.           ANI    7FH            ;DISCARD TOP BIT
  125.           CPI    ' '            ;CHANGE CONTROL CODES TO PERIOD
  126.           JNC    $+5
  127.           MVI    A,'.'
  128.           CALL   WAC
  129.           DCR    C
  130.           JNZ    TDUM5
  131.           CALL   BREAK          ;CHECK FOR CONSOLE BREAKIN
  132.           RRC
  133.           JNC    TDUM1          ;LOOP IF NO BREAKIN
  134.           CALL   RAC            ;ELSE DISCARD CHARACTER
  135.           JMP    TDUM4          ;AND EXIT
  136.  TDUM3:   CALL   CRLF
  137.           POP    D              ;RESTORE BLOCK SIZE
  138.           IN     0FFH           ;READ SENSESWITCHES
  139.           ANI    02H            ;JUMP IF SW1 OFF
  140.           JZ     TDUMB
  141.           PUSH   D              ;SAVE PRU SIZE
  142.           LXI    H,TBUF
  143.  TDUM8:   MOV    A,D            ;EXIT IF ENTIRE TAPE PRU WRITTEN
  144.           ORA    E
  145.           JZ     TDUMA
  146.           PUSH   D              ;COPY NEXT 128 BYTES FROM TBUF TO DBUF
  147.           LXI    D,DBUF
  148.           MVI    C,128
  149.  TDUM9:   MOV    A,M
  150.           INX    H
  151.           STAX   D
  152.           INX    D
  153.           DCR    C
  154.           JNZ    TDUM9
  155.           POP    D
  156.           CALL   WRITE          ;WRITE DBUF TO DISK
  157.           MOV    A,E            ;DE = DE - 128
  158.           SUI    128
  159.           MOV    E,A
  160.           JNC    $+4
  161.           DCR    D
  162.           JMP    TDUM8          ;LOOP
  163.  TDUMA:   POP    D              ;RESTORE PRU SIZE
  164.  TDUMB:   MOV    A,D            ;EXIT IF SHORT PRU
  165.           CPI    4
  166.           JC     TDUM4
  167.           MVI    A,0
  168.           LXI    H,TBUF         ;READ NEXT PRU FROM TAPE 0
  169.           CALL   CTRR
  170.           CALL   CTERR
  171.           PUSH   D              ;SAVE PRU SIZE
  172.           JMP    TDUM0
  173.  TDUM4:   CALL   CRLF
  174.           IN     0FFH           ;READ SENSESWITCHES
  175.           ANI    02H            ;IF SW1 ON, CLOSE FILE
  176.           CNZ    CLOSE
  177.           LHLD   OLDSP          ;RESTORE ENTRY SP
  178.           SPHL
  179.           RET                   ;RETURN TO CP/M
  180.  
  181. ;         WHB - WRITE HEX BYTE (FROM A)
  182.  
  183.  WHB:     PUSH  PSW
  184.           RLC
  185.           RLC
  186.           RLC
  187.           RLC
  188.           CALL   WHD
  189.           POP    PSW
  190.           PUSH   PSW
  191.           CALL   WHD
  192.           POP    PSW
  193.           RET
  194.  
  195. ;         WHD - WRITE HEX DIGIT (FROM LO 4 BITS OF A)
  196.  
  197.  WHD:     ANI    0FH            ;MASK OFF LO 4 BITS
  198.           ADI    '0'            ;CONVERT TO ASCII
  199.           CPI    '9'+1          ;IF '0' TO '9', GO PRINT
  200.           JC     WAC
  201.           ADI    7              ;ELSE ADJUST 10-15 TO A-F
  202.           JMP    WAC
  203.  
  204. ;         CLOSE - CLOSE DISK FILE
  205.  
  206.  CLOSE:   PUSH   H
  207.           PUSH   D
  208.           PUSH   B
  209.           MVI    C,CLOSEF
  210.           LXI    D,FCB
  211.           CALL   BDOS
  212.           POP    B
  213.           POP    D
  214.           POP    H
  215.           RET
  216.  
  217. ;         DELT - DELETE FILE
  218.  
  219.  DELT:    PUSH   H
  220.           PUSH   D
  221.           PUSH   B
  222.           MVI    C,DELTF
  223.           LXI    D,FCB
  224.           CALL   BDOS
  225.           POP    B
  226.           POP    D
  227.           POP    H
  228.           RET
  229.  
  230. ;         MAKE - MAKE NEW FILE
  231.  
  232.  MAKE:    PUSH   H
  233.           PUSH   D
  234.           PUSH   B
  235.           MVI    C,MAKEF
  236.           LXI    D,FCB
  237.           CALL   BDOS
  238.           POP    B
  239.           POP    D
  240.           POP    H
  241.           RET
  242.  
  243. ;         WRITE - WRITE DISK FILE
  244.  
  245.  WRITE:   PUSH   H
  246.           PUSH   D
  247.           PUSH   B
  248.           MVI    C,WRITEF
  249.           LXI    D,FCB
  250.           CALL   BDOS
  251.           POP    B
  252.           POP    D
  253.           POP    H
  254.           RET
  255.  
  256. ;         WAC - WRITE ASCII CHARACTER TO CONSOLE
  257. ;
  258. ;         ENTRY CONDITIONS
  259. ;            A - CHARACTER TO WRITE
  260.  
  261.  WAC:     PUSH   H
  262.           PUSH   D
  263.           PUSH   B
  264.           MVI    C,TYPEF
  265.           MOV    E,A
  266.           CALL   BDOS
  267.           POP    B
  268.           POP    D
  269.           POP    H
  270.           RET
  271.  
  272. ;         RAC - READ ASCII CHARACTER FROM CONSOLE
  273. ;
  274. ;         EXIT CONDITIONS
  275. ;            A - 7 BIT ASCII CHARACTER
  276.  
  277.  RAC:     PUSH   H
  278.           PUSH   D
  279.           PUSH   B
  280.           MVI    C,CONS
  281.           CALL   BDOS
  282.           POP    B
  283.           POP    D
  284.           POP    H
  285.           RET
  286.  
  287. ;         BREAK - CHECK FOR CONSOLE BREAKIN
  288.  
  289.  BREAK:   PUSH   H
  290.           PUSH   D
  291.           PUSH   B
  292.           MVI    C,BRKF
  293.           CALL   BDOS
  294.           POP    B
  295.           POP    D
  296.           POP    H
  297.           RET
  298.  
  299. ;         WAS - WRITE ASCII STRING TO CONSOLE
  300. ;
  301. ;         ENTRY CONDITIONS
  302. ;            HL - POINTS TO STRING TO WRITE (TERM BY ZERO BYTE)
  303.  
  304.  WAS:     MOV    A,M
  305.           INX    H
  306.           ORA    A
  307.           RZ
  308.           CALL   WAC
  309.           JMP    WAS
  310.  
  311. ;         CRLF - WRITE CR,LF TO CONSOLE
  312.  
  313.  CRLF:    MVI    A,CR
  314.           CALL   WAC
  315.           MVI    A,LF
  316.           JMP    WAC
  317.  
  318.  
  319. ;         CTRR - READ PHYSICAL RECORD FROM CASSETTE TAPE
  320. ;
  321. ;         FOR TARBELL INTERFACE WITH LASALLE RELAY BOARD
  322. ;
  323. ;         PHYSICAL RECORD FORMAT
  324. ;
  325. ;            BYTE     SIZE     FIELD CONTENTS
  326. ;            00       01       SOH (ASCII START-OF-HEADER)
  327. ;            01       08       FILENAME, LEFT JUSTIFIED, BLANK FILLED
  328. ;            09       03       FILETYPE, LEFT JUSTIFIED, BLANK FILLED
  329. ;            12       01       PHYSICAL RECORD NUMBER, 1 BYTE INTEGER
  330. ;            13       02       PHYSICAL RECORD SIZE, 2 BYTE INTEGER
  331. ;            15       01       STX (ASCII START-OF-TEXT)
  332. ;            16       XX       DATA BYTES
  333. ;            16+XX    01       ETX (ASCII END-OF-TEXT)
  334. ;            17+XX    02       CYCLIC REDUNDANCY CHECK
  335. ;
  336. ;         ENTRY CONDITIONS
  337. ;            HL - POINTS TO BUFFER TO READ INTO
  338. ;            A - TAPE UNIT NUMBER (0 OR 1)
  339. ;
  340. ;         EXIT CONDITIONS
  341. ;            DE - PHYSICAL RECORD SIZE
  342. ;            PRN - PHYSICAL RECORD NUMBER
  343. ;            FNAME - 11 BYTE NAME.TYPE BUFFER
  344. ;            C-FLAG - SET IF ERROR(S), ELSE RESET
  345.  
  346.  CTRR:    PUSH   PSW            ;SAVE UNIT NO., ETC
  347.           ADD    A              ;MOVE UNIT NO. INTO POSITION
  348.           ORI    10H            ;OR IN HUNT-MODE BIT
  349.           CALL   CTON           ;TURN ON SELECTED UNIT'S MOTOR
  350.           CALL   CTINP          ;READ FIRST BYTE OF RECORD
  351.           CPI    SOH            ;JUMP IF SOH (ALL IS GOOD)
  352.           JZ     CTRR1
  353.           POP    PSW            ;ELSE IGNORE FALSE START
  354.           JMP    CTRR
  355.  CTRR1:   PUSH   H              ;SAVE BUFFER POINTER
  356.           LXI    H,0            ;CLEAR CRC
  357.           SHLD   CRC
  358.           LXI    H,FNAME        ;READ FILE NAME.TYPE
  359.           LXI    D,11
  360.           CALL   CTRS
  361.           CALL   CTINP          ;READ PHYSICAL RECORD NUMBER INTO PRN
  362.           STA    PRN
  363.           CALL   CTINP          ;READ PHYSICAL RECORD SIZE INTO DE
  364.           MOV    D,A
  365.           CALL   CTINP
  366.           MOV    E,A
  367.           CALL   CTINP          ;READ NEXT BYTE
  368.           CPI    STX            ;JUMP IF NOT STX (ERROR)
  369.           JNZ    CTRR2
  370.           POP    H              ;RESTORE BUFFER POINTER
  371.           PUSH   D              ;SAVE PHYS REC SIZE
  372.           CALL   CTRS           ;READ DATA BYTES
  373.           CALL   CTINP          ;READ NEXT BYTE
  374.           CPI    ETX            ;JUMP IF NOT ETX (ERROR)
  375.           JNZ    CTRR2
  376.           LHLD   CRC            ;FETCH NEW CRC INTO HL
  377.           CALL   CTINP          ;READ OLD CRC INTO DE
  378.           MOV    D,A
  379.           CALL   CTINP
  380.           MOV    E,A
  381.           MOV    A,H            ;JUMP IF DE<>HL
  382.           CMP    D
  383.           JNZ    CTRR2
  384.           MOV    A,L
  385.           CMP    E
  386.           JNZ    CTRR2
  387.           POP    D              ;RESTORE PHYS REC SIZE
  388.           POP    PSW            ;RESTORE UNIT NO., ETC
  389.           CALL   CTOFF          ;TURN OFF CASSETTE MOTOR
  390.           STC                   ;CLEAR ERROR FLAG AND RETURN
  391.           CMC
  392.           RET
  393.  CTRR2:   POP    D              ;RESTORE BUFFER SIZE
  394.           POP    PSW            ;RESTORE UNIT. NO., ETC
  395.           CALL   CTOFF          ;TURN OFF CASSETTE MOTOR
  396.           STC                   ;SET ERROR FLAG AND RETURN
  397.           RET
  398.  
  399. ;         CTRS - READ STRING FROM CASSETTE TAPE
  400. ;
  401. ;         ENTRY CONDITIONS
  402. ;            HL - POINTS TO BUFFER TO READ INTO
  403. ;            DE - NUMBER OF BYTES TO READ
  404.  
  405.  CTRS:    MOV    A,D            ;RETURN IF COUNT = 0
  406.           ORA    E
  407.           RZ
  408.           CALL   CTINP          ;READ NEXT BYTE
  409.           MOV    M,A            ;STORE IT
  410.           INX    H
  411.           DCX    D              ;DECREMENT COUNT
  412.           JMP    CTRS           ;AND LOOP
  413.  
  414. ;         CTINP - READ BYTE FROM CASSETTE TAPE
  415. ;
  416. ;         ENTRY CONDITIONS
  417. ;            CRC - RUNNING CRC (INIT BY USER)
  418. ;
  419. ;         EXIT CONDITIONS
  420. ;            A - 8 BIT BYTE FROM TAPE
  421.  
  422.  CTINP:   IN     CASC           ;AWAIT RDA (INVERTED)
  423.           ANI    10H
  424.           JNZ    CTINP
  425.           IN     CASD           ;READ BYTE
  426.           CMA                   ;DISPLAY ON LIGHTS
  427.           OUT    0FFH           ;AND FALL THRU TO CTCRC
  428.           CMA
  429.  
  430. ;         CTCRC - UPDATE CRC
  431. ;
  432. ;         ENTRY CONDITIONS
  433. ;            A - NEW DATA BYTE
  434. ;            CRC - 2 BYTE BUFFER CONTAINING CRC
  435. ;            CRCP - 2 BYTE CRC POLYNOMIAL CONSTANT
  436.  
  437.  CTCRC:   PUSH   PSW            ;SAVE REGS
  438.           PUSH   B
  439.           PUSH   D
  440.           PUSH   H
  441.           MOV    B,A            ;SAVE DATA BYTE
  442.           MVI    C,8            ;SET LOOP COUNT
  443.  CTCR1:   ANI    80H            ;MASK OFF MSB OF DATA BYTES
  444.           LHLD   CRC            ;FETCH CRC INTO HL
  445.           XRA    H              ;XOR MSB OF DATA INTO CRC
  446.           MOV    H,A
  447.           DAD    H              ;LEFT SHIFT CRC 1 BIT
  448.           JNC    CTCR2          ;JUMP IF NO CARRY
  449.           MOV    A,H            ;HL = HL XOR CRCP
  450.           XRI    CRCP SHR 8
  451.           MOV    H,A
  452.           MOV    A,L
  453.           XRI    CRCP AND 0FFH
  454.           MOV    L,A
  455.  CTCR2:   SHLD   CRC            ;REPLACE CRC
  456.           DCR    C              ;DECREMTN LOOP COUNT
  457.           JZ     CTCR3          ;EXIT WHEN ENTIRE BYTE PROCESSED
  458.           MOV    A,B            ;SHIFT DATA BYTE LEFT 1 BIT
  459.           ADD    A
  460.           MOV    B,A
  461.           JMP    CTCR1          ;LOOP
  462.  CTCR3:   POP    H              ;RESTORE REGS AND RETURN
  463.           POP    D
  464.           POP    B
  465.           POP    PSW
  466.           RET
  467.  
  468. ;         CTON - TURN ON CASSETTE TAPE MOTOR
  469. ;    
  470. ;         ENTRY CONDITIONS
  471. ;            A - UNIT NO. (SHL 1) AND OPTIONAL HUNT-MODE BIT
  472.  
  473.  CTON:    ORI    1              ;TURN ON MOTOR CONTROL BIT
  474.           OUT    CASC
  475.           RET
  476.  
  477. ;         CTOFF - IDLE CASSETTE TAPE MOTOR
  478.  
  479.  CTOFF:   PUSH   PSW            ;SAVE A AND FLAGS
  480.           XRA    A              ;CLEAR INTERFACE
  481.           OUT    CASC
  482.           POP    PSW
  483.           RET
  484.  
  485. ;         CTERR - PROCESS TAPE ERROR
  486. ;
  487. ;         ENTRY CONDITIONS
  488. ;            C-FLAG - SET IF ERROR
  489.  
  490.  CTERR:   RNC                   ;RETURN IF NO ERROR
  491.           PUSH   H              ;ELSE PRINT 'TAPE ERROR'
  492.           LXI    H,MSG2
  493.           CALL   WAS
  494.           POP    H
  495.           RET
  496.  
  497. ;         DATA AREA
  498.  
  499.  PRN:     DS     1              ;PHYSICAL RECORD NUMBER BUFFER
  500.  CTR:     DS     2              ;SCRATCH COUNTER
  501.  CRC:     DS     2              ;CRC BUFFER
  502.  CRCP:    EQU    8005H          ;CRC POLYNOMIAL (CRC-16)
  503.  
  504.  TBUF:    DS     1024           ;PHYSICAL RECORD BUFFER
  505.  
  506.  MSG0:    DB     'SET SENSESWITCHES TO SELECT OPTIONS, THEN TYPE CR',CR,LF
  507.           DB     '   SW0 - ON TO GET HEX/ASCII DUMP TO CONSOLE',CR,LF
  508.           DB     '   SW1 - ON TO SAVE FILE ON DISK',CR,LF
  509.           DB     0
  510.  MSG1:    DB     'FILE NAME = ',0
  511.  MSG2:    DB     'TAPE ERROR',CR,LF,0
  512.  MSG3:    DB     'PRN = ',0
  513.  MSG4:    DB     '     SIZE = ',0
  514.  
  515.  OLDSP:   DS     2              ;STORAGE FOR ENTRY SP
  516.  STACK:   DS     64             ;LOCAL STACK
  517.  
  518.           END
  519.