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 / EXAM.ASM < prev    next >
Assembly Source File  |  1984-04-29  |  7KB  |  503 lines

  1. ;*********************************;
  2. ;        EXAMINE UTILITY          ;
  3. ;*********************************;
  4.     ORG    100H
  5.  
  6. ;****
  7. ; MISC. EQUATES
  8. ;****
  9.  
  10. TBUF    EQU    0080H
  11. VDMLC    EQU    0CC00H
  12. ;*****
  13. ; OBTAIN BIOS VECTORS
  14. ;*****
  15. VECTRS:    JMP    GETVEC
  16.     DS    42
  17. WBOOTE    EQU    VECTRS+3
  18. CSTS    EQU    VECTRS+6
  19. CI    EQU    VECTRS+9
  20. CO    EQU    VECTRS+12
  21. LO    EQU    VECTRS+15
  22. PO    EQU    VECTRS+18
  23. RI    EQU    VECTRS+21
  24. HOME    EQU    VECTRS+24
  25. SELDSK    EQU    VECTRS+27
  26. SETTRK    EQU    VECTRS+30
  27. SETSEC    EQU    VECTRS+33
  28. SETDMA    EQU    VECTRS+36
  29. READ    EQU    VECTRS+39
  30. WRITE    EQU    VECTRS+42
  31. GETVEC:    LXI    D,WBOOTE
  32.     LHLD    1
  33.     MVI    B,42
  34. GETVE1:    MOV    A,M
  35.     STAX    D
  36.     INX    H
  37.     INX    D
  38.     DCR    B
  39.     JNZ    GETVE1
  40. ;
  41.  
  42. ;****
  43. ; MAIN PROGRAM
  44. ;****
  45.  
  46. MAIN:    LXI    SP,STACK    ;SET STACK
  47.     LXI    H,VDMLC    ;POINT TO VDM MEMORY
  48.     MVI    B,4    ;4 PAGES IN VDM
  49.     MVI    A,' '
  50. CLR:    MVI    C,00
  51. CL2:    MOV    M,A
  52.     INX    H
  53.     DCR    C
  54.     JNZ    CL2
  55.     DCR    B
  56.     JNZ    CLR
  57.     LXI    H,TBUF    ;CLEAR BUFFER TO SPACES
  58.     MVI    B,128    ;BUFFER SIZE
  59.     MVI    A,' '
  60. CL3:    MOV    M,A
  61.     INX    H
  62.     DCR    B
  63.     JNZ    CL3
  64.     LXI    D,MSG1
  65.     LXI    H,VDMLC+64
  66.     MVI    B,64
  67.     CALL    MOVTG    ;MOV MSG1 TO SCREEN
  68.     MVI    A,00    ;CLEAR VDM I/O PORT
  69.     OUT    0C8H
  70.     STA    CURDK    ;SET DISK TO DRIVE 0
  71.     CALL    HOME    ;RESTORE HEAD
  72.     XRA    A
  73.     STA    CURTK    ;SET CURTK BYTE
  74.     INR    A
  75.     STA    CURSC    ;SET CURRENT SECTOR
  76.     LXI    H,VDMLC+128
  77.     LXI    D,MSG2
  78.     MVI    B,64
  79.     CALL    MOVTG
  80.     JMP    LOOP1
  81. LOOP:    CALL    DSPLY    ;DISPLAY PARAMETERS
  82. LOOP1:    CALL    CONIN    ;READ CONSOLE
  83.     LXI    H,2020H ;CLEAR ERROR FLAG
  84.     SHLD    VDMLC+(15*64)
  85.     LXI    H,CMDTB    ;POINT TO COMMAND TABLE
  86.     MVI    C,NCMDS    ;NUMBER OF COMMANDS
  87. CMLP:    CMP    M    ;COMMAND FOUND?
  88.     JZ    CMOK
  89.     INX    H
  90.     INX    H
  91.     INX    H
  92.     DCR    C    ;ANY COMMANDS LEFT?
  93.     JNZ    CMLP    ;YES, KEEP LOOKING
  94. ERR:    LXI    H,VDMLC+(15*64)
  95.     MOV    M,A
  96.     INX    H
  97.     MVI    M,'?'
  98.     JMP    LOOP
  99. CMOK:    INX    H
  100.     MOV    E,M
  101.     INX    H
  102.     MOV    D,M
  103.     XCHG
  104.     LXI    D,LOOP
  105.     PUSH    D
  106.     PCHL
  107.  
  108. CONIN:    CALL    CI
  109.     ANI    7FH
  110.     CPI    3
  111.     JZ    0
  112.     RET
  113.  
  114. ;****
  115. ; DISPLAY ROUTINE
  116. ;****
  117. DSPLY:    LXI    D,TBUF
  118.     LXI    H,VDMLC+256
  119.     MVI    B,80H
  120.     CALL    MOVE
  121.     LXI    H,VDMLC+128
  122.     LXI    D,MSG2
  123.     MVI    B,64    ;MOVE MESSAGE TO SCREEN
  124.     CALL    MOVTG
  125.     LXI    H,VDMLC+128+OF1    ;OFFSET TO FIELD1
  126.     LDA    CURSC
  127.     CALL    HXO    ;DISPLAY SECTOR NUMBER
  128.     LXI    H,VDMLC+128+OF2    ;OFFSET TO FIELD2
  129.     LDA    CURTK
  130.     CALL    HXO    ;DISPLAY CURTK NUMBER
  131.     LXI    H,VDMLC+128+OF3    ;OFFSET TO FIELD3
  132.     LDA    CURDK
  133.     CALL    HXO    ;DISPLAY DISK NUMBER
  134.     LXI    H,VDMLC+128+OF4
  135.     CALL    STAT
  136.     CALL    HXO
  137.     LXI    H,VDMLC+512
  138.     LXI    D,TBUF    ;POINT TO BUFFER
  139.     MVI    C,128    ;BUFFER SIZE
  140. DL3:    LDAX    D    ;GET BYTE FROM BUFFER
  141.     CALL    HXO    ;DISPLAY BYTE
  142.     INX    D    ;BUMP BUFFER POINTER
  143.     DCR    C    ;DECREMENT BYTE COUNT
  144.     JNZ    DL3    ;LOOP
  145.     LXI    H,VDMLC+(14*64)
  146.     MVI    B,64
  147.     CALL    BLANKIT
  148.     RET
  149.  
  150. BLANKIT:MVI    M,' '
  151.     INX    H
  152.     DCR    B
  153.     JNZ    BLANKIT
  154.     RET
  155.  
  156. ;****
  157. ; READ ROUTINE
  158. ;****
  159.  
  160. READR:    CALL    SETUP
  161.     CALL    READ
  162.     RET
  163.  
  164. SETUP:    LXI    B,TBUF
  165.     CALL    SETDMA
  166.     LDA    CURDK
  167.     MOV    C,A
  168.     CALL    SELDSK
  169.     LDA    CURSC
  170.     MOV    C,A
  171.     CALL    SETSEC
  172.     LDA    CURTK
  173.     MOV    C,A
  174.     CALL    SETTRK
  175.     RET
  176.  
  177. WRITR:    CALL    SETUP
  178.     CALL    WRITE
  179.     RET
  180.  
  181. NEXTR:    CALL    NXSEC    ;BUMP TO NEXT SECTOR
  182.     CC    NXTRK    ;BUMP TO NEXT CURTK
  183.     JC    ERR    ;ERROR
  184.     CALL    READR
  185.     RET
  186.  
  187. PREVR:    CALL    PVSEC    ;BUMP TO PREV. SECTOR
  188.     CC    PVTRK
  189.     JC    ERR
  190.     CALL    READR
  191.     RET
  192.  
  193. HDOUT:    CALL    PVTRK    ;DECREMENT CURTK
  194.     CALL    READR    ;READ SECTOR
  195.     RET        ;EXIT
  196.  
  197. HDIN:    CALL    NXTRK    ;INCREMENT CURTK
  198.     CALL    READR    ;READ SECTOR
  199.     RET        ;MOVE HEAD
  200.  
  201. NXSEC:    LDA    CURSC
  202.     CPI    26    ;END OF CURTK
  203.     JNC    NXS2    ;YES
  204.     INR    A
  205.     STA    CURSC
  206.     XRA    A
  207.     RET
  208. NXS2:    MVI    A,01
  209.     STA    CURSC
  210.     STC
  211.     RET
  212.  
  213. NXTRK:    LDA    CURTK
  214.     CPI    76
  215.     CMC
  216.     RC        ;ERROR
  217.     INR    A
  218.     STA    CURTK
  219.     RET
  220.  
  221. PVSEC:    LDA    CURSC
  222.     CPI    01+1
  223.     JC    PVS2
  224.     DCR    A
  225.     STA    CURSC
  226.     XRA    A
  227.     RET
  228. PVS2    MVI    A,26
  229.     STA    CURSC
  230.     STC
  231.     RET
  232.  
  233. PVTRK:    LDA    CURTK
  234.     CPI    00+1
  235.     RC
  236.     DCR    A
  237.     STA    CURTK
  238.     RET
  239.  
  240. MOVTG:    LDAX    D
  241.     ORI    80H
  242.     MOV    M,A
  243.     DCR    B
  244.     INX    H
  245.     INX    D
  246.     JNZ    MOVTG
  247.     RET
  248.  
  249. HXO:    MOV    B,A    ;SAVE BYTE IN B
  250.     RRC
  251.     RRC
  252.     RRC
  253.     RRC        ;GET HI ORDER 4 BITS
  254.     CALL    HXN    ;CONVERT TO HEX ASCII
  255.     INX    H    ;BUMP MEM ADDRESS
  256.     MOV    A,B    ;GET BYTE AGAIN
  257.     CALL    HXN    ;CONVERT
  258.     INX    H    ;BUMP MEM ADDRESS
  259.     RET
  260.  
  261. HXN:    ANI    0FH    ;GET 4 BITS
  262.     ORI    30H    ;CONVERT TO ASCII
  263.     CPI    3AH    ;A-F?
  264.     JC    HXN1    ;NO, CONTINUE
  265.     ADI    07    ;COMPENSATE
  266. HXN1:    MOV    M,A    ;STORE BYTE
  267.     RET
  268.  
  269. MOVE:    LDAX    D
  270.     MOV    M,A
  271.     INX    H
  272.     INX    D
  273.     DCR    B
  274.     JNZ    MOVE
  275.     RET
  276.  
  277. HXI:    LXI    B,0
  278.     CALL    HXC
  279.     RC
  280.     MOV    B,A
  281.     INX    H
  282.     CALL    HXC
  283.     CMC
  284.     RNC
  285.     MOV    C,A
  286.     MOV    A,B
  287.     ADD    A
  288.     ADD    A
  289.     ADD    A
  290.     ADD    A
  291.     ADD    C
  292.     MOV    B,A
  293.     MVI    C,0
  294.     RET
  295.  
  296. HXC:    CALL    CONIN
  297.     MOV    C,A
  298.     CPI    '0'
  299.     RC
  300.     CPI    '9'+1
  301.     JNC    HXA
  302.     MOV    M,A
  303.     ANI    0FH
  304.     RET
  305. HXA:    ANI    5FH
  306.     CPI    'A'
  307.     JC    HXC
  308.     CPI    'F'+1
  309.     JNC    HXC
  310.     MOV    M,A
  311.     SUI    37H
  312.     ANI    0FH
  313.     RET
  314.  
  315. GETEM:    MVI    M,'?'+80H
  316.     INX    H
  317.     MVI    M,'?'+80H
  318.     DCX    H
  319.     CALL    HXI
  320.     JNC    GETEM1
  321.     LXI    SP,STACK
  322.     JMP    LOOP
  323. GETEM1:    MOV    A,B
  324.     DCX    H
  325.     CALL    HXO
  326.     RET
  327.  
  328. NWDSK:    LXI    H,VDMLC+128+OF3
  329.     CALL    GETEM
  330.     MOV    A,B
  331.     CPI    2
  332.     JNC    NWDSK
  333.     STA    CURDK
  334.     CALL    READR
  335.     RET
  336.  
  337. NWTRK:    LXI    H,VDMLC+128+OF2
  338.     CALL    GETEM
  339.     MOV    A,B
  340.     CPI    4DH
  341.     JNC    NWTRK
  342.     STA    CURTK
  343.     MOV    A,C
  344.     CPI    20H
  345.     JZ    NWDSK
  346.     CALL    READR
  347.     RET
  348.  
  349. NWSEC:    LXI    H,VDMLC+128+OF1
  350.     CALL    GETEM
  351.     XRA    A
  352.     ADD    B
  353.     JZ    NWSEC
  354.     CPI    1BH
  355.     JNC    NWSEC
  356.     STA    CURSC
  357.     MOV    A,C
  358.     CPI    20H
  359.     JZ    NWTRK
  360.     CALL    READR
  361.     RET
  362.  
  363. GETBNO:    LXI    H,VDMLC+(14*64)
  364.     LXI    D,MSGI
  365.     MVI    B,MSGILEN
  366.     CALL    MOVTG
  367.     CALL    GETEM
  368.     MOV    A,B
  369.     CPI    129
  370.     JNC    GETBNO
  371.     DCR    A
  372.     JM    GETBNO
  373.     STA    BYTENO
  374.     MVI    B,MSGILEN+3
  375.     LXI    H,VDMLC+(14*64)
  376.     CALL    BLANKIT
  377.     RET
  378.  
  379. HEXPAT:    CALL    GETBNO
  380.     LDA    BYTENO
  381.     MOV    C,A
  382.     MVI    B,0
  383.     LXI    H,TBUF
  384.     DAD    B
  385.     XCHG
  386.     ADD    A
  387.     MOV    C,A
  388.     LXI    H,VDMLC+512
  389.     DAD    B
  390. HEXPA1:    CALL    GETEM
  391.     MOV    A,B
  392.     STAX    D
  393.     INX    D
  394.     LDA    BYTENO
  395.     INR    A
  396.     CPI    128
  397.     RNC
  398.     STA    BYTENO
  399.     JMP    HEXPA1
  400.  
  401. ASCPAT:    CALL    GETBNO
  402.     LDA    BYTENO
  403.     MOV    C,A
  404.     MVI    B,0
  405.     LXI    H,TBUF
  406.     DAD    B
  407.     XCHG
  408.     LXI    H,VDMLC+256
  409.     DAD    B
  410. ASCPA1:    MVI    M,'?'+80H
  411.     CALL    CONIN
  412.     CPI    20H
  413.     RC
  414.     MOV    M,A
  415.     STAX    D
  416.     INX    H
  417.     INX    D
  418.     LDA    BYTENO
  419.     INR    A
  420.     CPI    128
  421.     RNC
  422.     STA    BYTENO
  423.     JMP    ASCPA1
  424.  
  425. CMDTB:    DB    'R'
  426.     DW    READR
  427.     DB    'W'
  428.     DW    WRITR
  429.     DB    'A'
  430.     DW    ASCPAT
  431.     DB    'H'
  432.     DW    HEXPAT
  433.     DB    72H
  434.     DW    READR
  435.     DB    '+'    ;READ NEXT SECTOR
  436.     DW    NEXTR
  437.     DB    0AH
  438.     DW    NEXTR
  439.     DB    '-'    ;READ PREV SECTOR
  440.     DW    PREVR
  441.     DB    'D'    ;SELECT DISK DRIVE
  442.     DW    NWDSK
  443.     DB    'D'+' '
  444.     DW    NWDSK
  445.     DB    'I'    ;STEP HEAD IN
  446.     DW    HDIN
  447.     DB    69H
  448.     DW    HDIN
  449.     DB    'O'    ;STEP HEAD OUT
  450.     DW    HDOUT
  451.     DB    6FH
  452.     DW    HDOUT
  453.     DB    'Q'    ;QUIT (EXIT TO CP/M)
  454.     DW    0
  455.     DB    'Q'+' '
  456.     DW    0
  457.     DB    'S'    ;SPECIFIC SECTOR
  458.     DW    NWSEC
  459.     DB    'S'+' '
  460.     DW    NWSEC
  461.     DB    'T'
  462.     DW    NWTRK    ;SPECIFIC TRACK
  463.     DB    'T'+' '
  464.     DW    NWTRK
  465.     DB    'C'    ;CLEAR ALL AND RESTART EXAM
  466.     DW    MAIN
  467.     DB    'C'+' '
  468.     DW    MAIN
  469. NCMDS    EQU    ($-CMDTB)/3
  470.  
  471. MSG1:    DB    ' EXAM VERSION 3.1   '
  472.     DB    '                       '
  473.     DB    '                       '
  474. MSG2:    DB    'SECTOR    '
  475. MSG2A:    DB    'TRACK    '
  476. MSG2B:    DB    'DRIVE    '
  477. MSG2C:    DB    'STATUS    '
  478. MSG2D:    DB    '                              '
  479.     DB    '                    '
  480. MSGI:    DB    ' BYTE # '
  481. MSGILEN    EQU    $-MSGI
  482. OF1    EQU    (MSG2A-MSG2)-3
  483. OF2    EQU    (MSG2B-MSG2)-3
  484. OF3    EQU    (MSG2C-MSG2)-3
  485. OF4    EQU    (MSG2D-MSG2)-3
  486.  
  487.     DS    64
  488. STACK    EQU    $
  489. CURSC:    DB    00    ;CURRENT SECTOR
  490. CURTK:    DB    00    ;CURRENT TRACK
  491. CURDK:    DB    00    ;CURRENT DISK
  492. BYTENO:    DB    0
  493.  
  494.  
  495. ;*********************************
  496. ;    GET DISK STATUS
  497. ;*********************************
  498.  
  499. STAT:    IN    127    ;GET STATUS
  500.     RET        ;AND RETURN
  501.  
  502.     END
  503.