home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol076 / survey4.asm < prev    next >
Encoding:
Assembly Source File  |  1984-04-29  |  13.8 KB  |  723 lines

  1. ;***************************************;
  2. ;                    ;
  3. ;        S U R V E Y        ;
  4. ;                    ;
  5. ;***************************************;
  6.  
  7. ;By Michael Friese  9/22/79
  8.  
  9.  
  10. ;*  Lists Kbytes used and remaining plus number of files
  11. ;   on all logged disks (up to 8)
  12. ;*  Prints Memory map and synopsis of all machine memory
  13. ;*  Lists all active I/O Ports
  14. ;*  Uses disk allocation block for all disk calculations
  15. ;
  16. ;VERSION LIST - Most recent version first.
  17. ;
  18. ;06/Jul/82 - Added Godbout DISK 1 equate and added SKIP equate
  19. ;        Bill Bolton - Software Tools, Australia
  20. ;
  21. ;01/Jun/82 - Tidied up and fixed port display, added display
  22. ;        of contents of low memory. David Bennett - Alfred
  23. ;        Hospital, Australia
  24. ;
  25. ;29/Jun/80 - Added version number test and calculations for CP/M
  26. ;        version 2 compatibility.   This program should now work
  27. ;        properly on all versions 1.4 and later.  BRR
  28. ;
  29. ;28/Jun/80 - Added IMS400 equate (prevents Industrial Micro Systems
  30. ;        controller from hanging up during port scan).  BRR
  31. ;
  32. ;24/Jun/80 - Removed MACLIB statement, included required macros
  33. ;        in source.     Bruce R. Ratoff
  34. ;
  35.  
  36. ;*******************************;
  37. ;    SYSTEM MACROS        ;
  38. ;*******************************;
  39. ;Increments 16 bit memory location X
  40. INXI    MACRO    X
  41.     LOCAL    JUST8
  42.     PUSH    H
  43.     LXI    H,X
  44.     INR    M
  45.     JNZ    JUST8
  46.     INX    H
  47.     INR    M
  48. JUST8:
  49.     POP    H
  50.     ENDM
  51. ;..............................................................
  52. ;
  53. ;    SAVE MACRO    SAVE SPECIFIED REGISTERS
  54. ;
  55. ;    SAVE    R1,R2,R3,R4
  56. ;
  57. ;        R1-R4 MAY BE B,D,H OR PSW  SAVED IN ORDER SPECIFIED
  58. ;        IF REGS ARE OMITTED SAVE B,D AND H
  59. ;
  60. SAVE    MACRO    R1,R2,R3,R4
  61.     IF NOT NUL R1&R2&R3&R4
  62.     IRP    R,<<R1>,<R2>,<R3>,<R4>>
  63.     IF    NUL R
  64.     EXITM
  65.     ENDIF
  66.     PUSH    R
  67.     ENDM
  68.     ELSE
  69.     IRPC    REG,BDH
  70.     PUSH    REG
  71.     ENDM
  72.     ENDIF
  73.     ENDM
  74. ;
  75. ;    . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  76. ;
  77. ;    RESTORE MACRO    RESTORE REGISTERS  (INVERSE OF SAVE)
  78. ;
  79. ;    RESTORE    R1,R2,R3,R4
  80. ;
  81. ;        R1-R4 MAY BE B,D,H OR PSW  RESTORED IN ORDER SPECIFIED
  82. ;        IF REGS OMITTED RESTORE H,D AND B
  83. ;
  84. RESTORE    MACRO    R1,R2,R3,R4
  85.     IF    NOT NUL R1&R2&R3&R4
  86.     IRP    R,<<R1>,<R2>,<R3>,<R4>>
  87.     IF    NUL R
  88.     EXITM
  89.     ENDIF
  90.     POP    R
  91.     ENDM
  92.     ELSE
  93.     IRPC    REG,HDB
  94.     POP    REG
  95.     ENDM
  96.     ENDIF
  97.     ENDM
  98. ;
  99. ;..............................................................
  100. ;
  101. ;    CHAROUT MACRO    CONSOLE OUTPUT FROM A
  102. ;
  103. ;    CHAROUT    ADDR
  104. ;
  105. CHAROUT    MACRO    ADDR
  106.     IF    NOT NUL ADDR
  107.     LDA    ADDR
  108.     ENDIF
  109.     MVI    C,2        ;;CONOUT
  110.     MOV    E,A        ;;CHAR TO E
  111.     CALL    5        ;;CALL BDOS
  112.     ENDM
  113. ;
  114. ;
  115. ;.............................................................
  116. ;
  117. ;    DECOUT MACRO    CONVERT A POSITIVE INTEGER TO DECIMAL AND OUTPUT 
  118. ;            TO THE CONSOLE.
  119. ;
  120. ;    DECOUT    ADDR
  121. ;
  122. ;        IF ADDR OMITTED, NUMBER ASSUMED TO BE IN HL, ELSE LOADED TO HL
  123. ;        LEADING ZEROS SUPRESSED. MAXIMUM NUMBER 65,767
  124. ;
  125. DECOUT    MACRO    ADDR
  126.     LOCAL    ENDDEC,DX
  127.     JMP    ENDDEC
  128. @DECOUT:
  129.     SAVE            ;;PUSH STACK
  130.     LXI    B,-10        ;;RADIX FOR CONVERSION
  131.     LXI    D,-1        ;;THIS BECOMES NO DIVIDED BY RADIX
  132. DX:
  133.     DAD    B        ;;SUBTRACT 10
  134.     INX    D
  135.     JC    DX
  136.     LXI    B,10
  137.     DAD    B        ;;ADD RADIX BACK IN ONCE
  138.     XCHG
  139.     MOV    A,H
  140.     ORA    L        ;;TEST FOR ZERO
  141.     CNZ    @DECOUT        ;;RECURSIVE CALL
  142.     MOV    A,E
  143.     ADI    '0'        ;;CONVERT FROM BCD TO HEX
  144.     MOV    E,A        ;;TO E FOR OUTPUT
  145.     CHAROUT            ;;CONSOLE OUTPUT
  146.     RESTORE            ;;POP STACK
  147.     RET
  148. ENDDEC:
  149. DECOUT    MACRO    ?ADDR
  150.     IF    NOT NUL ?ADDR
  151.     LHLD    ?ADDR
  152.     ENDIF
  153.     CALL    @DECOUT        ;;CALL THE SUBROUTINE
  154.     ENDM
  155.     DECOUT    ADDR
  156.     ENDM
  157. ;
  158. ;
  159. ;..............................................................
  160. ;
  161. ;    HEXOUT MACRO    CONVERT BINARY NO AND OUTPUT TO CONSOLE
  162. ;
  163. ;    HEXOUT    ADDR
  164. ;
  165. ;        NUMBER ASSUMED IN A IF NO ARGUMENT
  166. ;
  167. HEXOUT    MACRO    ADDR
  168.     LOCAL    OUTCHR,HEXEND
  169.     JMP    HEXEND
  170. HEXPRN:
  171.     SAVE    PSW
  172.     RRC
  173.     RRC
  174.     RRC
  175.     RRC            ;;SHIFT RIGHT 4
  176.     CALL    OUTCHR
  177.     RESTORE    PSW
  178. OUTCHR:
  179.     ANI    0FH        ;;MASK 4 BITS
  180.     ADI    90H        ;;ADD OFFSET
  181.     DAA            ;;DEC ADJUST
  182.     ACI    40H        ;;ADD OFFSET
  183.     DAA            ;;DEC ADJUST
  184.     MOV    E,A        ;;TO E FOR OUTPUT
  185.     MVI    C,2        ;;CONOUT
  186.     JMP    5        ;;CALL BDOS
  187. HEXEND:
  188.  
  189. HEXOUT    MACRO    ?ADDR
  190.     IF    NOT NUL ?ADDR
  191.     LDA    ?ADDR
  192.     ENDIF
  193.     CALL    HEXPRN
  194.     ENDM
  195.     HEXOUT    ADDR
  196.     ENDM
  197. ;
  198. ;
  199.  
  200. ;*******************************;
  201. ;    SYSTEM EQUATES        ;
  202. ;*******************************;
  203. TRUE    EQU    -1
  204. FALSE    EQU    NOT TRUE
  205. TARBEL    EQU    false        ; Tarbell FDC dmb 31-may-82
  206. IMS400    EQU    FALSE        ; Industrial Micro Systems FDC
  207. GODBOUT    EQU    TRUE        ; Godbout Disk 1 FDC
  208. GODBAS    EQU    0C0H        ; Base of Godbout FDC
  209. TARBAS    EQU    0F8H        ; Base of Tarbell
  210. SKIP    EQU    TARBEL OR IMS400 OR GODBOUT    ; Will be true
  211.                 ; if any skip needed
  212.     IF    TARBEL
  213. SKIPORT    EQU    TARBAS+4    ; Port # to skip if Tarbell FDC
  214.     ENDIF
  215.     IF    IMS400
  216. SKIPORT    EQU    08FH        ; Port # to skip if IMS FDC
  217.     ENDIF
  218.     IF    GODBOUT
  219. SKIPORT    EQU    GODBAS+1    ; Port # to skip if Disk 1 FDC
  220.     ENDIF
  221. BDOS    EQU    5        ; jump to BDOS
  222. bios    equ    0        ; jump to BIOS dmb 1-jun-82
  223. CRLF    EQU    0A0DH        ; CR LF sequence
  224. CRLFE    EQU    8A0DH        ; CR LF with EOL
  225. EOL    EQU    80H        ; End of line
  226. TAB    EQU    'I'-40H     ; Tab character
  227. ESC    EQU    1BH        ; Escape character
  228. TABS    EQU    9        ; Tab columns
  229.  
  230. ;***********************;
  231. ;    MAIN PROGRAM    ;
  232. ;***********************;
  233. ;
  234.     ORG    100H
  235. ;
  236. START:
  237.     LXI    H,0            ; Save stack pointer
  238.     DAD    SP
  239.     SHLD    OLDSP
  240.     LXI    SP,FINIS+64
  241.     CALL    TYPE            ; Type initial CRLF
  242.     DB    TAB,TAB,'*** System Survey (June 82) ***'
  243.     DW    CRLF,CRLFE
  244.  
  245. ;DISK SURVEY
  246.     LXI    H,8            ; Init drive counter
  247.     MVI    C,24            ; Get login vector
  248.     PUSH    H
  249.     CALL    BDOS
  250.     POP    H
  251. ROTBIT:
  252.     RAR                ; RAR login bit to C
  253.     JNC    NOTLOG            ; Drive not logged
  254.     PUSH    PSW            ; Save login
  255.     PUSH    H            ; and counter
  256.  
  257. ;Print drive letter
  258.     CALL    TYPE
  259.     DB    'Drive'
  260.     DB    ' '+EOL
  261.     MVI    A,'A'            ; Get ASCII bias
  262.     ADD    H            ; Add to drive #
  263.     MOV    E,A            ; Print drive letter
  264.     CALL    TCHR
  265.     CALL    TYPE            ; and colon
  266.     DB    ':',' '+EOL
  267.     POP    H            ; Restore drive #
  268.     PUSH    H
  269.  
  270. ;Print K already allocated
  271.     MOV    E,H
  272.     MVI    C,14            ; Log drive
  273.     CALL    BDOS
  274.     MVI    C,27            ; Index allocation vect
  275.     CALL    BDOS
  276.     MOV    L,A            ; Put in decent regs
  277.     MOV    H,B
  278.     PUSH    H            ; save for later
  279.     MVI    C,12            ; get version #
  280.     CALL    BDOS
  281.     MOV    A,L            ; zero if version 1
  282.     ORA    A
  283.     JNZ    V2X            ; otherwise, use 2.x style params
  284.     LHLD    BDOS+1            ; get vers 1 style params
  285.     MVI    L,3CH
  286.     MOV    A,M            ; get block shift factor
  287.     STA    BLKSHF
  288.     INX    H
  289.     INX    H
  290.     MOV    L,M            ; get max. block number
  291.     MVI    H,0
  292.     SHLD    MAXALL
  293.     MVI    B,32            ; assume 32 bytes in block map
  294.     JMP    GETALC            ; continue
  295. V2X:
  296.     MVI    A,'?'            ; Use wild user #
  297.     STA    FCB            ; in filename search
  298.     MVI    C,31            ; Get 2.x parameter block
  299.     CALL    BDOS
  300.     INX    H
  301.     INX    H
  302.     MOV    A,M            ; Get and save ablock shift factor
  303.     STA    BLKSHF
  304.     INX    H
  305.     INX    H
  306.     INX    H
  307.     MOV    A,M            ; Get maximum block number
  308.     INX    H            ; (double precision)
  309.     MOV    H,M
  310.     MOV    L,A
  311.     SHLD    MAXALL
  312.     INX    H
  313.     MVI    B,3            ; map size is (MAXALL+1)/8
  314. V2SH:
  315.     MOV    A,H
  316.     ORA    A            ; do 16 bit right shift
  317.     RAR
  318.     MOV    H,A
  319.     MOV    A,L
  320.     RAR
  321.     MOV    L,A
  322.     DCR    B            ; 3 times
  323.     JNZ    V2SH
  324.     MOV    B,L
  325.     LDA    MAXALL            ; allow for leftover bits if any
  326.     ANI    3
  327.     JZ    GETALC
  328.     INR    B
  329. GETALC:
  330.     POP    H
  331.     LXI    D,0            ; Init group counter
  332. NXBYTE:
  333.     MVI    C,8            ; Bit counter for byte
  334.     MOV    A,M            ; Get map byte
  335. NXBIT:
  336.     RAR                ; Rotate to C
  337.     JNC    NOBIT            ; No group allocated
  338.     INX    D            ; Inc group counter
  339. NOBIT:
  340.     DCR    C            ; Dec bit counter
  341.     JNZ    NXBIT
  342.     INX    H            ; Index next byte
  343.     DCR    B
  344.     JNZ    NXBYTE
  345.     CALL    SHF16
  346.     PUSH    H
  347.     CALL    BINDEC
  348.     CALL    TYPE
  349.     DB    'K bytes in',' '+EOL
  350.  
  351. ;Print number of files
  352.     LXI    D,FCB            ; Fake file cont block
  353.     MVI    C,17            ; Search for 1st file
  354.     CALL    BDOS
  355.     LXI    H,0            ; File counter
  356. LOOK:
  357.     CPI    255            ; Failure
  358.     JZ    PFILE
  359.     ADD    A            ; File offset times 2
  360.     ADD    A            ; 4
  361.     ADD    A            ; 8
  362.     ADD    A            ; 16
  363.     ADD    A            ; 32
  364.     ADI    80H            ; Make sure it's not a deleted file
  365.     MOV    E,A
  366.     MVI    D,0
  367.     LDAX    D
  368.     CPI    0E5H
  369.     JZ    LOOK1
  370.     INX    H            ; Bump file counter
  371. LOOK1:
  372.     LXI    D,FCB            ; Restore FCB
  373.     MVI    C,18            ; Look for addtl files
  374.     PUSH    H            ; Save file counter
  375.     CALL    BDOS
  376.     POP    H
  377.     JMP    LOOK
  378. PFILE:
  379.     CALL    BINDEC            ; Print # of files
  380.     CALL    TYPE
  381.     DB    ' files with',' '+EOL
  382.  
  383. ;Print K remaining
  384.     LHLD    MAXALL            ; Get number of blocks
  385.     XCHG
  386.     INX    D            ; Inc for actual value
  387.     CALL    SHF16
  388.     XCHG
  389.     POP    H
  390.     MOV    A,H            ; Ones comp & move
  391.     CMA
  392.     MOV    H,A
  393.     MOV    A,L
  394.     CMA
  395.     MOV    L,A
  396.     INX    H            ; Twos complement
  397.     DAD    D            ; and subtract
  398.     CALL    BINDEC            ; K remaining
  399.     CALL    TYPE
  400.     DB    'K bytes remaining'
  401.     DW    CRLFE
  402.  
  403. ;Set up to print next drive
  404.     POP    H            ; Restore bit counter
  405.     POP    PSW            ; and bitmap byte
  406. NOTLOG:
  407.     INR    H            ; Bump drive counter
  408.     DCR    L            ; Dec bit counter
  409.     JNZ    ROTBIT
  410.  
  411. ;MEMORY SURVEY
  412. ;Create header
  413. MSURV:
  414.     CALL    TYPE
  415.     DW    CRLF
  416.     DB    'Memory map:'
  417.     DW    CRLF
  418.     DB    '0',TAB,'8',TAB,'16',TAB,'24',TAB,'32'
  419.     DB    TAB,'40',TAB,'48',TAB,'56',TAB,'64'
  420.     DW    CRLF
  421.     REPT    8
  422.     DB    '|',TAB
  423.     ENDM
  424.     DB    '|'
  425.     DW    CRLF
  426.     db    ' '            ; dmb 31-May-82
  427.     DB    'T'+EOL
  428.     LXI    H,RAM
  429.     MVI    M,LOW 1023        ; Init RAM counter
  430.     INX    H
  431.     MVI    M,HIGH 1023
  432.     MVI    B,4            ; Clear ROM, EMP
  433. CLREG:
  434.     INX    H
  435.     MVI    M,0
  436.     DCR    B
  437.     JNZ    CLREG
  438.     LXI    H,1024            ; Init memory pointer
  439.     MVI    C,63            ; K to be checked
  440.  
  441. ;Start of analysis loop
  442. BEGANA:
  443.     LXI    D,1024            ; Byte counter
  444.     XRA    A            ; Clear flag bytes
  445.     STA    RAMF
  446.     STA    EMPF
  447. ANALP:
  448.     MOV    A,M            ; Get test byte and
  449.     MOV    B,A            ; store for later
  450.     CMA
  451.     MOV    M,A            ; Put invertd tst byte
  452.     SUB    M            ; Check for good write
  453.     MOV    M,B            ; Restore orignl data
  454.     JNZ    NOTMEM            ; Wasn't good write
  455.     INXI    RAM            ; Bump memory counter
  456.     JMP    NEXT            ; To next byte
  457.  
  458. NOTMEM:
  459.     STA    RAMF            ; Not considered RAM
  460.     MVI    A,0FFH            ; Is it empty space?
  461.     SUB    B
  462.     JNZ    NOTEMP            ; Inc ROM, set flag
  463.     LDA    EMPF            ; Any non empty space
  464.     ANA    A            ; before here?
  465.     JZ    NEXT
  466.     JMP    NOTEM            ; To next byte
  467. NOTEMP:
  468.     STA    EMPF            ; Set no empty flag
  469. NOTEM:
  470.     INXI    ROM
  471. NEXT:
  472.     INX    H            ; Index next byte
  473.     DCX    D            ; Decrement K counter
  474.     XRA    A
  475.     ORA    D
  476.     ORA    E
  477.     JNZ    ANALP            ; K counter not 0
  478.     PUSH    B
  479.     PUSH    H
  480.     LDA    RAMF            ; Is it RAM?
  481.     ANA    A
  482.     JNZ    NOTRAM            ; No
  483.     dcr    h            ; drop H to make compares right
  484.     LDA    BDOS+2            ; Is it under BDOS ?
  485.     CMP    H
  486.     JC    NOTTPA            ; No
  487.     CALL    TYPE            ; Yes, it's TPA
  488.     DB    'T'+EOL
  489.     JMP    NEXTK
  490. NOTTPA:
  491.     lda    bios+2            ; is it under bios ?
  492.     cmp    h
  493.     jc    nbdos
  494.     call    type            ; yes, it's BDOS
  495.     db    'C'+eol
  496.     jmp    nextk
  497. nbdos:
  498.     CALL    TYPE            ; Assume it's BIOS
  499.     DB    'B'+EOL
  500.     JMP    NEXTK
  501. ;
  502. NOTRAM:
  503.     LDA    EMPF            ; Is it empty?
  504.     ANA    A
  505.     JZ    NOMEM            ; Yes, no memory
  506.     CALL    TYPE            ; No, must be ROM
  507.     DB    'R'+EOL
  508.     JMP    NEXTK
  509. NOMEM:
  510.     CALL    TYPE
  511.     DB    ' '+EOL
  512. NEXTK:
  513.     POP    H
  514.     POP    B
  515.     DCR    C            ; Decrement K counter
  516.     JNZ    BEGANA
  517.     CALL    TYPE
  518.     DW    CRLF
  519.     DB    'T=TPA',TAB,'C=CPM',TAB,'B=BIOS or unassigned'
  520.     DB    TAB,'R=ROM or bad'
  521.     DW    CRLFE
  522. ;
  523. ; contents of first page
  524.     call    type
  525.     db    'BIOS at',' '+eol
  526.     hexout    bios+2
  527.     hexout    bios+1
  528.     call    type
  529.     db    tab,'iobyte',' '+eol
  530.     hexout    bios+3
  531.     call    type
  532.     db    tab,'drive',' '+eol
  533.     hexout    bios+4
  534.     call    type
  535.     db    tab,'BDOS at',' '+eol
  536.     hexout    bdos+2
  537.     hexout    bdos+1
  538.     call    type
  539.     dw    crlf,crlfe
  540. ;
  541. ;MEMORY SYNOPSIS
  542.     LHLD    RAM
  543.     PUSH    H            ; Save RAM
  544.     CALL    BINDEC            ; Type RAM
  545.     CALL    TYPE
  546.     DB    ' Bytes RAM',TAB,TAB+EOL
  547.     LHLD    ROM
  548.     PUSH    H
  549.     CALL    BINDEC            ; Type ROM
  550.     CALL    TYPE
  551.     DB    ' Bytes ROM',TAB,TAB+EOL
  552.     LHLD    BDOS+1
  553.     CALL    BINDEC
  554.     CALL    TYPE
  555.     DB    ' Bytes in TPA'
  556.     DW    CRLFE
  557.     POP    D            ; Get RAM
  558.     POP    H            ; Get RAM
  559.     DAD    D            ; Add 'em
  560.     PUSH    H            ; and save result
  561.     LXI    D,0            ; Subtract from this
  562.     MOV    A,H            ; Complement 16 bits
  563.     CMA
  564.     MOV    H,A
  565.     MOV    A,L
  566.     CMA
  567.     MOV    L,A            ; 2s comp bias in D
  568.     DAD    D            ; Subtract
  569.     CALL    BINDEC
  570.     CALL    TYPE
  571.     DB    ' Bytes Empty   ',TAB+EOL
  572.     POP    H            ; Restore RAM+ROM
  573.     CALL    BINDEC
  574.     CALL    TYPE
  575.     DB    ' Total Active Bytes'
  576.     DW    CRLF,CRLF
  577.  
  578. ;PORT SURVEY
  579.     DB    'Active I/O ports',':'+EOL
  580.     LXI    H,1000H            ; DELAY SO MESSAGE OUTPUT
  581. PDLY:
  582.     DCX    H            ; DOESN'T GIVE A FALSE READING
  583.     MOV    A,H            ; ON CONSOLE STATUS PORT
  584.     ORA    L
  585.     JNZ    PDLY
  586.     LXI    H,0            ; Init active port counter
  587.     mvi    d,0            ; Init port counter
  588.     mvi    e,0ffh            ; init port group variable
  589. PORTLP:
  590.     MOV    A,D
  591.  
  592.     IF    SKIP            ; Single port mask
  593.     CPI    SKIPORT
  594.     JZ    ISPORT            ; Print mask port
  595.     ENDIF
  596.  
  597.     mov    b,a            ; save port #
  598.     STA    INPORT+1
  599. INPORT:
  600.     IN    0            ; Modifiable code
  601. ; by trial and error, inactive port could return FF or echo port #
  602.     CPI    0FFH
  603.     JZ    NEXTPT
  604.     cmp    b
  605.     jz    nextpt
  606. ISPORT:
  607.     mov    a,d            ; got a live one, probably
  608.     ani    0f0h            ; is port in same group as last ?
  609.     cmp    e
  610.     jz    nocrlf
  611.     call    type            ; no, start a new line
  612.     dw    crlfe
  613.     mov    a,d            ; save for next time
  614.     ani    0f0h
  615.     mov    e,a
  616. nocrlf:
  617.     MOV    A,D            ; Get port #
  618.     PUSH    D
  619.     PUSH    H
  620.     HEXOUT
  621.     POP    H
  622.     POP    D
  623.     INX    H            ; count another one found
  624.     call    type
  625.     db    ' '+eol
  626. NEXTPT:
  627.     INR    D            ; Bump port counter
  628.     JNZ    PORTLP            ; Not done
  629.     CALL    TYPE            ; Done
  630.     DW    CRLFE
  631.     CALL    BINDEC
  632.     CALL    TYPE            ; Type Active Ports
  633.     DB    ' Ports active'
  634.     DW    CRLFE
  635.  CCP:
  636.     LHLD    OLDSP
  637.     SPHL
  638.     RET
  639.  
  640.  
  641. ;***********************;
  642. ;    SUBROUTINES    ;
  643. ;***********************;
  644.  
  645. ;Binary to decimal conversion
  646. BINDEC:
  647.     DECOUT                ; From LIB
  648.     RET
  649.  
  650. ;Types a string of text terminated with bit 7 high
  651. TYPE:
  652.     XTHL                ; Get string address
  653.     PUSH    D
  654. TYPELP:
  655.     MOV    A,M            ; Get type data
  656.     MOV    D,A            ; Save for later
  657.     ANI    7FH            ; Mask ASCII
  658.     MOV    E,A
  659.     PUSH    H
  660.     PUSH    D
  661.     CALL    TCHR
  662.     POP    D
  663.     POP    H
  664.     INX    H
  665.     MVI    A,EOL            ; End of line bit
  666.     ANA    D
  667.     JP    TYPELP            ; Not done
  668.     POP    D
  669.     XTHL                ; Get return address
  670.     RET
  671.  
  672. ;Types a single character on console
  673. TCHR:
  674.     MVI    C,2
  675.     JMP    BDOS
  676.  
  677. ;Checks sectors per block and multiplies or divides block size
  678. ;Enter with data in D. Result returned in H,L
  679. ;
  680. SHF16:
  681.     LDA    BLKSHF            ; Get shift factor (gives block size)
  682.     CPI    3            ; Is it 1K (std)?
  683.     JNZ    NOT3
  684.     MOV    L,E            ; Yes, use present #
  685. ZH:
  686.     MVI    H,0
  687.     RET
  688. ;
  689. NOT3:
  690.     CPI    2            ; Is it minifloppy?
  691.     JNZ    NOT2
  692.     MOV    A,E            ; Yes, divide by 2
  693.     RRC
  694.     ANI    7FH
  695.     MOV    L,A
  696.     JMP    ZH
  697. NOT2:
  698.     SUI    3            ; Must be something
  699.     MOV    B,A            ; larger like double
  700.     XCHG                ; sided or double dens
  701. BITSHF:
  702.     DAD    H            ; 16 bit 2^(B-1)
  703.     DCR    B
  704.     JNZ    BITSHF
  705.     RET
  706.  
  707.  
  708. ;***********************;
  709. ;    DATA STORAGE    ;
  710. ;***********************;
  711.  
  712. FCB:    DB    0,'???????????',0,0,0    ; File control block
  713.     DS    17            ; Extra FCB workspace
  714. OLDSP:    DS    2            ; Old stack pointer
  715. RAM:    DS    2            ; RAM counter
  716. ROM:    DS    2            ; ROM counter
  717. RAMF:    DS    1            ; RAM good flag
  718. EMPF:    DS    1            ; Empty so far flag
  719. BLKSHF:    DS    1            ; block shift factor
  720. MAXALL:    DS    2            ; maximum block number
  721. FINIS    EQU    $            ; End of program
  722.     END
  723.