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

  1. ;    DTC LOADER
  2. ;
  3. TBASE:    EQU    100H
  4.     ORG    TBASE
  5. BOOT:    EQU    0
  6. BDOS:    EQU    5
  7. MEMTOP:    EQU    BDOS+1    ;TOP OF AVAILABLE MEMORY
  8. ;    BDOS FUNCTIONS
  9. CONOUT:    EQU    9    ;CONSOLE OUTPUT
  10. CONIN:    EQU    10    ;CONSOLE INPUT
  11. OPENF:    EQU    15    ;OPEN FILE
  12. CLOSEF:    EQU    16    ;CLOSE FILE
  13. SEARCF: EQU    17    ;SEARCH FIRST
  14. READF:    EQU    20    ;READ SECTOR
  15. INTDSK:    EQU    25    ;INTERROGATE DISK
  16. ;
  17. TFCB:    EQU    05CH    ;DEFAULT FILE CONTROL BLOCK
  18. TET:    EQU    TFCB    ;ENTRY TYPE
  19. TFN:    EQU    TET+1    ;FILE NAME
  20. TFT:    EQU    TFN+8    ;FILE TYPE
  21. TEX:    EQU    TFT+3    ;FILE EXTENT
  22. TRC:    EQU    TEX+3    ;RECORD COUNT
  23. TDM:    EQU    TRC+1    ;DISK ALLOCATION MAP
  24. TNR:    EQU    TDM+16    ;NEXT RECORD NUMBER
  25. ;
  26. TBUFF:    EQU    080H    ;DEFAULT BUFFER
  27. ;
  28. SECSIZ:    EQU    128    ;SECTOR SIZE
  29. ;
  30. CR:    EQU    0DH
  31. LF:    EQU    0AH
  32. ;
  33. ;
  34. LOAD:    LXI    H,0        ;SAVE CP/M STACK POINTER
  35.     DAD    SP
  36.     SHLD    SAVESP
  37.     LXI    SP,STACK    ;SET STACK POINTER
  38.     CALL    INIT        ;INITIALIZE FILE PARAMETERS
  39. ;
  40.     MVI    C,0        ;CLEAR BUFFER COUNT
  41. LOAD1:    CALL    GETCHR        ;SCAN TO BEGIN OF LINE
  42.     CPI    ':'
  43.     JNZ    LOAD1
  44.     LXI    D,COUNT        ;GET LOAD COUNT
  45.     CALL    HEXBYT
  46.     LDA    COUNT        ;DONE?
  47.     ORA    A
  48.     JZ    EXIT
  49.     LXI    D,LADDR        ;GET LOAD ADDRESS
  50.     CALL    GETADR
  51.     PUSH    H        ;ADD OFFSET
  52.     LHLD    LADDR
  53.     XCHG
  54.     LHLD    OFFSET
  55.     DAD    D
  56.     LXI    D,LOW        ;IS ADDRESS IN LOADER?
  57.     CALL    COMPAR
  58.     XCHG
  59.     JP    LOAD2
  60.     LXI    D,ERMES        ;YES
  61.     MVI    C,CONOUT
  62.     CALL    BDOS
  63.     JMP    EXIT
  64. ERMES:    DB    'LOAD ADDRESS WITHIN LOADER.',CR,LF,'$'
  65. ;
  66. LOAD2:    POP    H        ;RESTORE BUFFER POINTER
  67.     CALL    GETCHR        ;SKIP SEPARATOR BYTE
  68.     CALL    GETCHR
  69. LOAD3:    CALL    HEXBYT        ;LOAD DATA
  70.     PUSH    H
  71.     LXI    H,COUNT        ;DECREMENT COUNT
  72.     DCR    M
  73.     POP    H
  74.     JNZ    LOAD3
  75.     JMP    LOAD1        ;END OF LINE
  76. ;
  77. ;
  78. ;
  79. ;    GET CHARACTER FROM RECORD
  80. ;    IN - HL=BUFFER POINTER
  81. ;          C=BUFFER COUNT
  82. ;    OUT-A=CHARACTER
  83. ;
  84. GETCHR:    XRA    A    ;BUFFER EMPTY?
  85.     CMP    C
  86.     JNZ    GETCH2
  87.     MVI    C,READF    ;YES. GET NEXT RECORD
  88.     PUSH    B
  89.     PUSH    D
  90.     CALL    FILEOP
  91.     POP    D
  92.     POP    B
  93.     JZ    GETCH1
  94. EXIT:    CALL    CLOSE
  95.     MVI    C,0    ;RESTORE LOGGED DRIVE
  96. DRIVE:    EQU    $-1
  97.     CALL    $
  98. SELDSK:    EQU    $-2
  99.     LHLD    SAVESP    ;RESTORE CP/M STACK POINTER
  100.     SPHL
  101.     RET
  102. ;
  103. GETCH1:    LXI    H,TBUFF
  104.     MVI    C,SECSIZ
  105. GETCH2:    MOV    A,M
  106.     INX    H
  107.     DCR    C
  108.     RET
  109. ;
  110. ;
  111. ;
  112. ;
  113. CLOSE:    MVI    C,CLOSEF
  114. FILEOP:    LXI    D,TFCB
  115.     CALL    BDOS
  116.     CPI    0
  117.     RET
  118. ;    GET ADDRESS
  119. ;    IN - HL=4 DIGIT ASCII HEX ADDRESS
  120. ;         DE=ADDRESS OF RESULT
  121. ;
  122. GETADR:    INX    D    ;POINT TO MOST SIGN. BYTE
  123.     CALL    HEXBYT
  124.     DCX    D
  125.     DCX    D
  126.     CALL    HEXBYT
  127.     INX    D
  128.     XRA    A
  129.     RET
  130. HEXBYT:    CALL    ASCHEX
  131.     RLC
  132.     RLC
  133.     RLC
  134.     RLC
  135.     MOV    B,A
  136.     CALL    ASCHEX
  137.     ADD    B
  138.     STAX    D
  139.     INX    D
  140.     RET
  141. ASCHEX:    CALL    GETCHR
  142.     SUI    '0'
  143.     CPI    10
  144.     RM
  145.     SUI    7
  146.     RET
  147. ;    COMPARE HL & DE
  148. ;    OUT - FLAGS ARE SET TO RESULT OF HL - DE
  149. ;
  150. COMPAR:    MOV    A,H
  151.     CMP    D
  152.     RNZ
  153.     MOV    A,L
  154.     CMP    E
  155.     RET
  156. ;
  157. ;
  158. ;    VARIABLES
  159. LADDR:    DW    0    ;LOAD ADDRESS
  160. OFFSET:    DW    0    ;LOAD OFFSET
  161. SAVESP:    DW    0    ;CP/M STACK POINTER
  162. COUNT:    DW    0    ;LOAD COUNT OF LINE
  163.     DS    26
  164. STACK:
  165. LOW:    EQU    $    ;LOW LOAD ADDRESS
  166. ;
  167. ;
  168. INIT:    MVI    C,INTDSK    ;SAVE CURRENTLY LOGGED DISK
  169.     CALL    BDOS
  170.     STA    DRIVE
  171.     LHLD    BOOT+1        ;GET SELECT DISK ADDRESS
  172.     MVI    L,3*9
  173.     SHLD    SELDSK
  174.     SHLD    INISEL
  175.     LXI    H,0        ;CLEAR OFFSET
  176.     SHLD    OFFSET
  177.     MVI    B,22        ;SET MAX CHAR SCAN
  178.     LDA    TFN        ;WAS FILE SPECIFIED?
  179.     CPI    ' '
  180.     JNZ    INIT1
  181.     MVI    A,20        ;NO. SET MAX BUFFER LENGTH
  182.     STA    TBUFF
  183. INIT0:    LXI    D,FNMES        ;OUTPUT FILENAME MESSAGE
  184.     MVI    C,CONOUT
  185.     CALL    BDOS
  186.     LXI    D,TBUFF        ;INPUT FILE NAME
  187.     MVI    C,CONIN
  188.     CALL    BDOS
  189.     CALL    CRLF
  190.     LDA    TBUFF+1        ;# CHARS IN BUFFER
  191.     CPI    0
  192.     JZ    INIT0
  193.     MOV    B,A        ;B:=# CHARS IN BUFFER
  194. INIT1:    LXI    H,TBUFF+1
  195.     LDA    TBUFF+3        ;DRIVE SPECIFIED?
  196.     CPI    ':'
  197.     JNZ    INITD3
  198.     INX    H
  199.     MOV    A,M
  200.     SUI    'A'        ;YES. LEGAL DRIVE #
  201.     JM    INITD1
  202.     CPI    16
  203.     JM    INITD2
  204. INITD1:    LXI    D,DRVMES    ;NO
  205.     MVI    C,CONOUT
  206.     CALL    BDOS
  207.     JMP    EXIT
  208. DRVMES:    DB    'INVALID DRIVE.',CR,LF,'$'
  209. INITD2:    PUSH    B
  210.     MOV    C,A        ;SELECT DRIVE
  211.     CALL    $
  212. INISEL:    EQU    $-2
  213.     POP    B
  214.     LXI    H,TBUFF+3
  215. INITD3:
  216.     LXI    D,TFCB
  217. INIT2:    INX    H
  218.     INX    D
  219.     MOV    A,M
  220.     CPI    '.'        ;END OF NAME?
  221.     JZ    INIT4
  222.     CPI    ' '
  223.     JZ    INIT7
  224.     CPI    CR
  225.     JZ    INIT9
  226.     CPI    060H        ;NO. LOWER CASE?
  227.     JC    INIT3
  228.     SUI    020H        ;YES. CONVERT TO UPPER CASE
  229. INIT3:    STAX    D
  230.     DCR    B
  231.     JNZ    INIT2
  232.     JMP    INIT9
  233. INIT4:    LXI    D,TFT-1        ;GET FILE TYPE
  234. INIT5:    INX    H
  235.     INX    D
  236.     MOV    A,M
  237.     CPI    ' '
  238.     JZ    INIT7
  239.     CPI    CR
  240.     JZ    INIT9
  241.     CPI    060H
  242.     JC    INIT6
  243.     SUI    020H
  244. INIT6:    STAX    D
  245.     DCR    B
  246.     JNZ    INIT5
  247.     JP    INIT9
  248. INIT7:    INX    H        ;SCAN FOR OFFSET
  249.     MOV    A,M
  250.     CPI    '='
  251.     JZ    INIT8
  252.     CPI    CR
  253.     JZ    INIT9
  254.     DCR    B
  255.     JNZ    INIT7
  256.     JMP    INIT9
  257. INIT8:    INX    H        ;GET OFFSET
  258.     LXI    D,OFFSET
  259.     CALL    GETADR
  260. INIT9:
  261.     LDA    TFT        ;WAS FILE TYPE SPECIFIED?
  262.     CPI    ' '
  263.     JNZ    INIT11
  264.     LXI    H,HEXMES    ;SET FILE TYPE TO HEX
  265.     LXI    D,TFT
  266.     MVI    B,3
  267. INIT10:    MOV    A,M
  268.     STAX    D
  269.     INX    H
  270.     INX    D
  271.     DCR    B
  272.     JNZ    INIT10
  273. INIT11:
  274.     LXI    D,TEX        ;CLEAR EXTENT AND
  275.     MVI    B,4        ; RECORD COUNT
  276.     XRA    A
  277. INIT12:    STAX    D
  278.     INX    D
  279.     DCR    B
  280.     JNZ    INIT12
  281.     LXI    D,TNR        ;CLEAR NEXT RECORD NUMBER
  282.     STAX    D
  283.     MVI    C,SEARCF
  284.     CALL    FILEOP        ;LOOKUP HEX FILE
  285.     CPI    0FFH
  286.     JNZ    INIT13
  287.     LXI    D,EXIMES    ;OUTPUT ERROR MESSAGE
  288.     MVI    C,CONOUT
  289.     CALL    BDOS
  290.     JMP    EXIT
  291. EXIMES:    DB    'HEX FILE DOES NOT EXIST.',CR,LF,'$'
  292. INIT13:
  293.     MVI    C,OPENF        ;OPEN HEX FILE
  294.     CALL    FILEOP
  295.     RET
  296. ;
  297. ;
  298. CRLF:    LXI    D,CRLFM
  299.     MVI    C,CONOUT
  300.     CALL    BDOS
  301.     RET
  302. CRLFM:    DB     CR,LF,'$'
  303. FNMES:    DB    'FILENAME ... $'
  304. HEXMES:    DB    'HEX'
  305.     END
  306.