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 / CPMUG001.ARK / CASDSK.ASM < prev    next >
Assembly Source File  |  1984-04-29  |  2KB  |  76 lines

  1. ; CASDSK - TRANSFER CASSETTE TO DISK
  2. ; TARBELL ELECTRONICS
  3. ;
  4.     ORG  100H
  5. FDOS:    EQU  5        ;DISK SYSTEM ENTRY POINT.
  6. TFCB:    EQU  5CH    ;DEFAULT FILE CONTROL BLOCK.
  7. TBUFF:    EQU  80H    ;DEFAULT BUFFER LOCATION.
  8.     MVI  C,22    ;CREATE FILE.
  9.     LXI  D,TFCB
  10.     CALL FDOS
  11.     MVI  C,15    ;OPEN FILE.
  12.     LXI  D,TFCB
  13.     CALL FDOS
  14. MLOOP:    LXI  H,TBUFF    ;GET ADDRESS OF BUFFER.
  15.     CALL CTRD    ;READ RECORD FROM CASSETTE.
  16.     JNZ  ERROR    ;ERROR IF NOT ZERO.
  17.     MOV  A,B    ;GET RECORD LENGTH AND
  18.     ORA  A        ;CHECK FOR LENGTH 0 (EOF).
  19.     JZ   CLOSE    ;IF EOF, CLOSE FILE.
  20.     MVI  C,21    ;WRITE A RECORD ONTO DISK.
  21.     LXI  D,TFCB
  22.     CALL FDOS
  23.     JMP  MLOOP    ;GET THE NEXT ONE.
  24. CLOSE:    MVI  C,16    ;CLOSE FILE.
  25.     LXI  D,TFCB
  26.     CALL FDOS
  27.     JMP  0        ;DO A WARM-START.
  28. ERROR:    LXI  D,QERR    ;PRINT "TAPE ERROR".
  29.     MVI  C,9
  30.     CALL FDOS
  31.     JMP  CLOSE    ;CLOSE FILE AND LEAVE.
  32. QERR:    DB   'TAPE ERROR$'
  33. ; CTRD - READ A RECORD FROM CASSETTE.
  34. ;
  35. CTRD:    CALL CASW    ;DELAY TO ALLOW LAST
  36.     CALL CASW    ;BYTE TO PASS THROUGH.
  37.     MVI  E,0    ;SET CHECKSUM=0.
  38.     MVI  A,10H    ;SET BIT 4=1.
  39.     OUT  CASC    ;RESET RECEIVER.
  40.     CALL CASR    ;READ TYPE BYTE.
  41.     CALL CASR    ;READ LENGTH BYTE.
  42.     MOV  B,A    ;PUT LENGTH BYTE IN B.
  43.     RZ        ;RETURN IF LENGTH 0.
  44.     MOV  C,A    ;PUT LENGTH IN C TOO.
  45. CRLOP:    CALL CASR    ;READ DATA BYTE.
  46.     MOV  M,A    ;PUT INTO MEMORY.
  47.     INX  H        ;INCREMENT POINTER.
  48.     DCR  C        ;DECREMENT COUNTER.
  49.     JNZ  CRLOP    ;READ ANOTHER BYTE.
  50.     MOV  C,E    ;PUT CHECKSUM IN C.
  51.     CALL CASR    ;READ CHECKSUM.
  52.     SUB  C        ;SUBTRACT FROM A.
  53.     RET        ;RETURN FROM CRLOP.
  54. ;
  55. CASR:    IN   CASC    ;READ CASS. STATUS.
  56.     ANI  10H    ;CHECK BIT 4.
  57.     JNZ  CASR    ;WAIT TILL READY.
  58.     IN   CASD    ;READ DATA.
  59.     PUSH PSW    ;SAVE REG A.
  60.     ADD  E        ;ADD TO CHECKSUM.
  61.     MOV  E,A
  62.     POP  PSW    ;RESTORE A.
  63.     ORA  A        ;SET FLAGS.
  64.     RET        ;RETURN FROM CASR.
  65. ;
  66. CASW:    PUSH PSW    ;SAVE DATA ON STACK.
  67. CLOP:    IN   CASC    ;READ STATUS.
  68.     ANI  20H    ;LOOK AT BIT 5.
  69.     JNZ  CLOP    ;WAIT UNTIL READY.
  70.     POP  PSW    ;RECOVER DATA.
  71.     OUT  CASD    ;WRITE A BYTE.
  72.     RET        ;RETURN FROM CASW.
  73. CASC:    EQU  6EH    ;STATUS PORT.
  74. CASD:    EQU  6FH    ;DATA PORT.
  75.     END
  76.