home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / assemblr / library / asm_kit / undos.asm < prev    next >
Assembly Source File  |  1983-10-23  |  8KB  |  187 lines

  1.     TITLE    UNDOS        ;UN-DOS A SYSTEM DISK
  2.     PAGE    25,80        ;25 LINES PER PAGE, 80 COLUMNS PER LINE
  3. CODE    SEGMENT BYTE PUBLIC 'CODE'
  4.     ASSUME    CS:CODE,DS:CODE
  5. EXTFCB    STRUC
  6. FLAG    DB    0FFH        ;EXTENDED FCB FLAG BYTE
  7. RES1    DB    5 DUP (0)    ;RESERVED FOR SYSTEM USE
  8. ATTR    DB    06H        ;ATTRIBUTE BYTE (HIDDEN, SYSTEM)
  9. DRV    DB    0        ;DRIVE NUMBER
  10. FILE    DB    "        "      ;FILE NAME
  11. EXT    DB    "   "           ;FILE EXTENSION
  12. BLK    DW    0        ;CURRENT BLOCK NUMBER
  13. REC    DW    0        ;LOGICAL RECORD SIZE OF FILE
  14. SIZE1    DW    0        ;LSB OF FILE SIZE
  15. SIZE2    DW    0        ;MSB OF FILE SIZE
  16. DATE    DW    0        ;DATE FILE WAS CREATED
  17. TIME    DW    0        ;TIME THE FILE WAS CREATED
  18. RES2    DB    8 DUP (0)    ;RESERVED FOR SYSTEM USE
  19. RELREC    DB    0        ;CURRENT RELATIVE RECORD NUMBER (IN BLOCK)
  20. RREC1    DW    0        ;LSB OF RELATIVE RECORD NUMBER
  21. RREC2    DW    0        ;MSB OF RELATIVE RECORD NUMBER
  22. SAVE1    DW    0        ;SAVE AREA ONE
  23. SAVE2    DW    0        ;SAVE AREA TWO
  24. SAVE3    DW    0        ;SAVE AREA THREE
  25. EXTFCB    ENDS            ;END OF EXTFCB STRUCTURE
  26. INPUT    EQU    0C08H        ;CLEAR KEYBOARD BUFFER THEN INPUT CODE
  27. PRINT    EQU    09H        ;PRINT STRING FUNCTION CODE
  28. OPEN    EQU    0FH        ;OPEN FILE FUNCTION CODE
  29. CLOSE    EQU    10H        ;CLOSE FILE FUNCTION CODE
  30. GETDRV    EQU    19H        ;GET CURRENT DEFAULT DRIVE FUNCTION CODE
  31. SETDTA    EQU    1AH        ;SET DISK TRANSFER ADDRESS FUNCTION CODE
  32. TABLE    EQU    1CH        ;GET ALLOCATION TABLE ADDRESS FUNCTION CODE
  33. RBLKRD    EQU    27H        ;RANDOM BLOCK READ FUNCTION CODE
  34. RBLKWR    EQU    28H        ;RANDOM BLOCK WRITE FUNCTION CODE
  35. DSPEC    EQU    BYTE PTR 5CH    ;POINTER TO DRIVE SPECIFICATION
  36. PARAM    EQU    BYTE PTR 5DH    ;POINTER TO INPUT PARAMETER
  37. BAD    EQU    0FFH        ;ERROR CODE
  38. CONV    EQU    40H        ;BINARY TO ASCII CONVERSION FACTOR
  39. ZERO    EQU    00H        ;ZERO BYTE
  40. ONE    EQU    01H        ;ONE WORD
  41. BLANK    EQU    20H        ;ASCII BLANK
  42. CRLF    EQU    0A0DH        ;ASCII LINE FEED, CARRIAGE RETURN
  43. BIOMAX    EQU    8000H        ;MAXIMUM BYTE COUNT FOR IBMBIO FILE
  44. DOSMAX    EQU    2000H        ;MAXIMUM BYTE COUNT FOR IBMDOS FILE
  45. EXIT    MACRO            ;TERMINATE INTERRUPT MACRO
  46.     INT    20H        ;DO THE TERMINATE INTERRUPT 20
  47.     ENDM            ;END OF THE EXIT MACRO
  48. DOS    MACRO            ;DOS INTERRUPT CALL MACRO
  49.     INT    21H        ;DO THE DOS INTERRUPT 21
  50.     ENDM            ;END OF DOS MACRO
  51.     ORG    100H        ;ORIGIN ADDRESS FOR COM FILES
  52. UNDOS    PROC    NEAR        ;ENTRY POINT FROM DOS 1.1
  53.     JMP    SHORT START    ;GO TO THE START-UP POINT
  54. ILLEGAL LABEL    NEAR        ;ILLEGAL PARAMETER CODE SECTION
  55.     MOV    DX,OFFSET MSG2    ;POINT TO ILLEGAL PARAMETER MESSAGE
  56.     JMP    MSGRET        ;GO PRINT THE MESSAGE AND RETURN TO DOS
  57. INVALID LABEL    NEAR        ;INVALID DRIVE CODE SECTION
  58.     MOV    DX,OFFSET MSG1    ;POINT TO INVALID DRIVE MESSAGE
  59.     JMP    MSGRET        ;GO PRINT THE MESSAGE AND RETURN TO DOS
  60. INSERT    LABEL    NEAR        ;INSERT CORRECT DISK SECTION
  61.     MOV    AL,[DEFAULT]    ;GET CURRENT DEFAULT DRIVE NUMBER
  62.     ADD    AL,CONV     ;CONVERT DRIVE NUMBER TO ASCII
  63.     MOV    [DRIVE],AL    ;STUFF DRIVE NUMBER IN MESSAGE
  64.     MOV    DX,OFFSET MSG3    ;POINT TO INSERT SYSTEM DISK MESSAGE
  65.     MOV    AH,PRINT    ;GET PRINT STRING FUNCTION CODE
  66.     DOS            ;PRINT THE MESSAGE
  67.     MOV    AX,INPUT    ;LOAD AX WITH CLEAR BUFFER AND INPUT CODE
  68.     DOS            ;GO WAIT FOR ANY CHARACTER
  69.     XOR    AL,AL        ;ZERO THE AL REGISTER
  70. START    LABEL    NEAR        ;INITIAL STARTING CODE (FROM ENTRY POINT)
  71.     CMP    [DS:PARAM],BLANK;CHECK FOR ENTERED FILENAME OR PARAMETER
  72.     JNZ    ILLEGAL     ;JUMP IF FILENAME OR PARAMETER ENTERED
  73.     CMP    AL,BAD        ;CHECK FOR INVALID DRIVE SPECIFICATION
  74.     JZ    INVALID     ;JUMP IF INVALID DRIVE SPECIFIED
  75.     MOV    AL,[DS:DSPEC]    ;GET THE REQUESTED DRIVE NUMBER
  76.     MOV    [IBMDOS].DRV,AL ;PUT DRIVE NUMBER IN IBMDOS.COM FCB
  77.     MOV    [IBMBIO].DRV,AL ;PUT DRIVE NUMBER IN IBMBIO.COM FCB
  78.     MOV    AH,OPEN     ;LOAD AH WITH OPEN FILE FUNCTION CODE
  79.     MOV    DX,OFFSET IBMBIO;POINT TO FCB FOR IBMBIO.COM FILE
  80.     DOS            ;ATTEMPT TO OPEN THE FILE IBMBIO.COM
  81.     OR    AL,AL        ;CHECK TO SEE IF FILE IS PRESENT
  82.     JNZ    INSERT        ;JUMP IF THIS IS NOT A GOOD DISK
  83.     MOV    DX,OFFSET IBMDOS;POINT TO FCB FOR IBMDOS.COM FILE
  84.     MOV    AH,OPEN     ;LOAD AH WITH OPEN FILE FUNCTION CODE
  85.     DOS            ;ATTEMPT TO OPEN THE FILE IBMDOS.COM
  86.     OR    AL,AL        ;CHECK TO SEE IF FILE IS PRESENT
  87.     JNZ    INSERT        ;JUMP IF THIS IS NOT A GOOD DISK
  88.     MOV    AH,SETDTA    ;LOAD AH WITH SET DTA FUNCTION CODE
  89.     MOV    DX,OFFSET DTA2    ;POINT TO DISK TRANSFER ADDRESS FOR IBMBIO.COM
  90.     DOS            ;SET THE DISK TRANSFER ADDRESS
  91.     MOV    AX,ONE        ;LOAD AX WITH ONE
  92.     MOV    [IBMBIO].REC,AX ;SET IBMBIO.COM RECORD SIZE TO ONE
  93.     MOV    [IBMDOS].REC,AX ;SET IBMDOS.COM RECORD SIZE TO ONE
  94.     MOV    BX,OFFSET IBMBIO;POINT TO FCB FOR IBMBIO.COM
  95.     MOV    CX,BIOMAX    ;LOAD CX WITH MAXIMUM RECORD COUNT (BYTES)
  96.     CALL    READ        ;CALL ROUTINE TO READ IN THE FILE
  97.     MOV    BX,OFFSET IBMBIO;POINT TO FCB FOR IBMBIO.COM
  98.     MOV    DX,OFFSET DTA2    ;POINT TO WHERE READ IN
  99.     CALL    WIPE        ;CALL ROUTINE TO WIPE-OUT THE CODE
  100.     MOV    DX,OFFSET DTA1    ;POINT TO DISK TRANSFER ADDRESS FOR IBMDOS.COM
  101.     MOV    AH,SETDTA    ;LOAD AH WITH SET DTA FUNCTION CODE
  102.     DOS            ;SET THE DISK TRANSFER ADDRESS
  103.     MOV    BX,OFFSET IBMDOS;POINT TO FCB FOR IBMDOS.COM
  104.     MOV    CX,DOSMAX    ;LOAD CX WITH MAXIMUM RECORD COUNT (BYTES)
  105.     CALL    READ        ;CALL ROUTINE TO READ THE FILE
  106.     MOV    BX,OFFSET IBMDOS;POINT TO FCB FOR IBMDOS.COM
  107.     MOV    DX,OFFSET DTA1    ;POINT TO WHERE IT WAS READ IN
  108.     CALL    WIPE        ;CALL ROUTINE TO WIPE-OUT THE CODE
  109.     MOV    DX,OFFSET DTA2    ;POINT TO DISK TRANSFER AREA FOR IBMBIO.COM
  110.     MOV    AH,SETDTA    ;LOAD AH WITH SET DTA FUNCTION CODE
  111.     DOS            ;SET THE DISK TRANSFER ADDRESS
  112.     MOV    BX,OFFSET IBMBIO;POINT TO IBMBIO.COM FCB
  113.     CALL    WRITE        ;CALL ROUTINE TO WRITE THE FILE
  114.     MOV    DX,OFFSET DTA1    ;POINT TO DISK TRANSFER AREA FOR IBMDOS.COM
  115.     MOV    AH,SETDTA    ;LOAD AH WITH SET DTA FUNCTION CODE
  116.     DOS            ;SET THE DISK TRANSFER ADDRESS
  117.     MOV    BX,OFFSET IBMDOS;POINT TO IBMDOS.COM FCB
  118.     CALL    WRITE        ;CALL ROUTINE TO WRITE THE FILE
  119.     MOV    DX,OFFSET MSG4    ;POINT TO SYSTEM ERASED MESSAGE
  120. MSGRET    LABEL    NEAR        ;PRINT MESSAGE AND RETURN TO DOS SECTION
  121.     MOV    AH,PRINT    ;LOAD AH WITH PRINT STRING FUNCTION CODE
  122.     DOS            ;PRINT THE MESSAGE
  123.     EXIT            ;RETURN CONTROL TO PC-DOS
  124. UNDOS    ENDP            ;END OF SYS PROCEDURE
  125. WIPE    PROC    NEAR        ;PROCEDURE TO WIPE-OUT DISK TRANSFER AREA
  126.     MOV    CX,[BX].SAVE3    ;GET THE NUMBER OF BYTES TO WIPE-OUT
  127.     MOV    DI,DX        ;GET OFFSET TO DISK TRANSFER AREA
  128.     PUSH    DS        ;SAVE A COPY OF DS ON THE STACK
  129.     POP    ES        ;PUT THE DS COPY INTO ES (POINT ES:DI TO DTA)
  130.     XOR    AL,AL        ;ZERO THE AL REGISTER
  131.     REPZ    STOSB        ;ZERO THE DISK TRANSFER AREA
  132.     RET            ;RETURN TO THE CALLER
  133. WIPE    ENDP            ;END OF THE WIPE PROCEDURE
  134. READ    PROC    NEAR        ;ROUTINE TO READ A FILE
  135.     MOV    AH,RBLKRD    ;LOAD AH WITH RANDOM BLOCK READ CODE
  136.     MOV    DX,BX        ;POINT DX TO FCB
  137.     DOS            ;READ THE BLOCK
  138.     MOV    [BX].SAVE3,CX    ;SAVE THE FILE SIZE (BYTES)
  139.     MOV    AX,[BX].DATE    ;GET DATE CREATED
  140.     MOV    [BX].SAVE1,AX    ;SAVE DATE CREATED
  141.     MOV    AX,[BX].TIME    ;GET TIME CREATED
  142.     MOV    [BX].SAVE2,AX    ;SAVE TIME CREATED
  143.     RET            ;RETURN TO THE CALLER
  144. READ    ENDP            ;END OR READ PROCEDURE
  145. WRITE    PROC    NEAR        ;ROUTINE TO WRITE THE FILE
  146.     MOV    DX,BX        ;MOVE FCB POINTER TO DX
  147.     XOR    AX,AX        ;ZERO AX REGISTER
  148.     MOV    [BX].RREC1,AX    ;SET LSB OF RELATIVE RECORD NUMBER TO ZERO
  149.     MOV    [BX].RREC2,AX    ;SET MSB OF RELATIVE RECORD NUMBER TO ZERO
  150.     INC    AX        ;INCREMENT AX TO ONE
  151.     MOV    [BX].REC,AX    ;SET RELATIVE RECORD SIZE TO ONE (BYTE)
  152.     MOV    AH,RBLKWR    ;LOAD AH WITH RANDOM BLOCK WRITE CODE
  153.     MOV    CX,[BX].SAVE3    ;GET RECORD COUNT (FILE SIZE IN BYTES)
  154.     DOS            ;WRITE THE FILE
  155.     MOV    AX,[BX].SAVE1    ;GET SAVED DATE CREATED (ORIGINAL)
  156.     MOV    [BX].DATE,AX    ;SAVE AS CURRENT DATE
  157.     MOV    AX,[BX].SAVE2    ;GET SAVED TIME CREATED (ORIGINAL)
  158.     MOV    [BX].TIME,AX    ;SAVE AS CURRENT TIME
  159.     MOV    AH,CLOSE    ;LOAD AH WITH CLOSE FILE CODE
  160.     DOS            ;CLOSE THE FILE
  161.     RET            ;RETURN TO THE CALLER
  162. WRITE    ENDP            ;END OF WRITE PROCEDURE
  163. MSG1    EQU    THIS WORD    ;MESSAGE NUMBER ONE
  164.     DB    "Invalid drive specification$"
  165. MSG2    EQU    THIS WORD    ;MESSAGE NUMBER TWO
  166.     DB    "Invalid parameter$"
  167. MSG3    EQU    THIS WORD    ;MESSAGE NUMBER THREE
  168.     DB    "Insert system disk in drive "
  169. DRIVE    EQU    THIS BYTE    ;DRIVE NUMBER IN PRINT MESSAGE
  170.     DB    "A"
  171.     DW    CRLF
  172.     DB    "and strike any key when ready"
  173.     DW    CRLF
  174.     DB    "$"
  175. MSG4    EQU    THIS WORD    ;MESSAGE NUMBER SIX
  176.     DB    "System erased!$"
  177. DEFAULT EQU    THIS BYTE    ;SAVE AREA FOR CURRENT DEFAULT DRIVE NUMBER
  178.     DB    0
  179. IBMBIO    EXTFCB    <,,,,"IBMBIO","COM">
  180. IBMDOS    EXTFCB    <,,,,"IBMDOS","COM">
  181. CHK    EQU    THIS WORD/2*2
  182. OFF    EQU    THIS WORD-CHK
  183. DTA1    EQU    THIS WORD+1    ;DISK TRANSFER AREA ONE (FILE IBMDOS)
  184. DTA2    EQU    DTA1+DOSMAX    ;DISK TRANSFER AREA TWO (FILE IBMBIO)
  185. CODE    ENDS            ;END OF CODE SEGMENT
  186.     END    UNDOS        ;END OF UNDOS COMMAND
  187.