home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol050 / dtcload.prn < prev    next >
Encoding:
Text File  |  1984-04-29  |  9.7 KB  |  308 lines

  1.  
  2.  
  3.                 ;    DTC LOADER
  4.                 ;
  5.  0100 =         TBASE:    EQU    100H
  6.  0100               ORG    TBASE
  7.  0000 =         BOOT:    EQU    0
  8.  0005 =         BDOS:    EQU    5
  9.  0006 =         MEMTOP:    EQU    BDOS+1    ;TOP OF AVAILABLE MEMORY
  10.                 ;    BDOS FUNCTIONS
  11.  0009 =         CONOUT:    EQU    9    ;CONSOLE OUTPUT
  12.  000A =         CONIN:    EQU    10    ;CONSOLE INPUT
  13.  000F =         OPENF:    EQU    15    ;OPEN FILE
  14.  0010 =         CLOSEF:    EQU    16    ;CLOSE FILE
  15.  0011 =         SEARCF: EQU    17    ;SEARCH FIRST
  16.  0014 =         READF:    EQU    20    ;READ SECTOR
  17.  0019 =         INTDSK:    EQU    25    ;INTERROGATE DISK
  18.                 ;
  19.  005C =         TFCB:    EQU    05CH    ;DEFAULT FILE CONTROL BLOCK
  20.  005C =         TET:    EQU    TFCB    ;ENTRY TYPE
  21.  005D =         TFN:    EQU    TET+1    ;FILE NAME
  22.  0065 =         TFT:    EQU    TFN+8    ;FILE TYPE
  23.  0068 =         TEX:    EQU    TFT+3    ;FILE EXTENT
  24.  006B =         TRC:    EQU    TEX+3    ;RECORD COUNT
  25.  006C =         TDM:    EQU    TRC+1    ;DISK ALLOCATION MAP
  26.  007C =         TNR:    EQU    TDM+16    ;NEXT RECORD NUMBER
  27.                 ;
  28.  0080 =         TBUFF:    EQU    080H    ;DEFAULT BUFFER
  29.                 ;
  30.  0080 =         SECSIZ:    EQU    128    ;SECTOR SIZE
  31.                 ;
  32.  000D =         CR:    EQU    0DH
  33.  000A =         LF:    EQU    0AH
  34.                 ;
  35.                 ;
  36.  0100 210000    LOAD:    LXI    H,0        ;SAVE CP/M STACK POINTER
  37.  0103 39            DAD    SP
  38.  0104 22DE01        SHLD    SAVESP
  39.  0107 31FC01        LXI    SP,STACK    ;SET STACK POINTER
  40.  010A CDFC01        CALL    INIT        ;INITIALIZE FILE PARAMETERS
  41.                 ;
  42.  010D 0E00          MVI    C,0        ;CLEAR BUFFER COUNT
  43.  010F CD7C01    LOAD1:    CALL    GETCHR        ;SCAN TO BEGIN OF LINE
  44.  0112 FE3A          CPI    ':'
  45.  0114 C20F01        JNZ    LOAD1
  46.  0117 11E001        LXI    D,COUNT        ;GET LOAD COUNT
  47.  011A CDBA01        CALL    HEXBYT
  48.  011D 3AE001        LDA    COUNT        ;DONE?
  49.  0120 B7            ORA    A
  50.  0121 CA8D01        JZ    EXIT
  51.  0124 11DA01        LXI    D,LADDR        ;GET LOAD ADDRESS
  52.  0127 CDAE01        CALL    GETADR
  53.  012A E5            PUSH    H        ;ADD OFFSET
  54.  012B 2ADA01        LHLD    LADDR
  55.  012E EB            XCHG
  56.  012F 2ADC01        LHLD    OFFSET
  57.  0132 19            DAD    D
  58.  0133 11FC01        LXI    D,LOW        ;IS ADDRESS IN LOADER?
  59.  0136 CDD401        CALL    COMPAR
  60.  0139 EB            XCHG
  61.  013A F26601        JP    LOAD2
  62.  013D 114801        LXI    D,ERMES        ;YES
  63.  0140 0E09          MVI    C,CONOUT
  64.  0142 CD0500        CALL    BDOS
  65.  0145 C38D01        JMP    EXIT
  66.  0148 4C4F414420ERMES:    DB    'LOAD ADDRESS WITHIN LOADER.',CR,LF,'$'
  67.                 ;
  68.  0166 E1        LOAD2:    POP    H        ;RESTORE BUFFER POINTER
  69.  0167 CD7C01        CALL    GETCHR        ;SKIP SEPARATOR BYTE
  70.  016A CD7C01        CALL    GETCHR
  71.  016D CDBA01    LOAD3:    CALL    HEXBYT        ;LOAD DATA
  72.  0170 E5            PUSH    H
  73.  0171 21E001        LXI    H,COUNT        ;DECREMENT COUNT
  74.  0174 35            DCR    M
  75.  0175 E1            POP    H
  76.  0176 C26D01        JNZ    LOAD3
  77.  0179 C30F01        JMP    LOAD1        ;END OF LINE
  78.                 ;
  79.                 ;
  80.                 ;
  81.                 ;    GET CHARACTER FROM RECORD
  82.                 ;    IN - HL=BUFFER POINTER
  83.                 ;          C=BUFFER COUNT
  84.                 ;    OUT-A=CHARACTER
  85.                 ;
  86.  017C AF        GETCHR:    XRA    A    ;BUFFER EMPTY?
  87.  017D B9            CMP    C
  88.  017E C29F01        JNZ    GETCH2
  89.  0181 0E14          MVI    C,READF    ;YES. GET NEXT RECORD
  90.  0183 C5            PUSH    B
  91.  0184 D5            PUSH    D
  92.  0185 CDA501        CALL    FILEOP
  93.  0188 D1            POP    D
  94.  0189 C1            POP    B
  95.  018A CA9A01        JZ    GETCH1
  96.  018D CDA301    EXIT:    CALL    CLOSE
  97.  0190 0E00          MVI    C,0    ;RESTORE LOGGED DRIVE
  98.  0191 =         DRIVE:    EQU    $-1
  99.  0192 CD9201        CALL    $
  100.  0193 =         SELDSK:    EQU    $-2
  101.  0195 2ADE01        LHLD    SAVESP    ;RESTORE CP/M STACK POINTER
  102.  0198 F9            SPHL
  103.  0199 C9            RET
  104.                 ;
  105.  019A 218000    GETCH1:    LXI    H,TBUFF
  106.  019D 0E80          MVI    C,SECSIZ
  107.  019F 7E        GETCH2:    MOV    A,M
  108.  01A0 23            INX    H
  109.  01A1 0D            DCR    C
  110.  01A2 C9            RET
  111.                 ;
  112.                 ;
  113.                 ;
  114.                 ;
  115.  01A3 0E10      CLOSE:    MVI    C,CLOSEF
  116.  01A5 115C00    FILEOP:    LXI    D,TFCB
  117.  01A8 CD0500        CALL    BDOS
  118.  01AB FE00          CPI    0
  119.  01AD C9            RET
  120.                 ;    GET ADDRESS
  121.                 ;    IN - HL=4 DIGIT ASCII HEX ADDRESS
  122.                 ;         DE=ADDRESS OF RESULT
  123.                 ;
  124.  01AE 13        GETADR:    INX    D    ;POINT TO MOST SIGN. BYTE
  125.  01AF CDBA01        CALL    HEXBYT
  126.  01B2 1B            DCX    D
  127.  01B3 1B            DCX    D
  128.  01B4 CDBA01        CALL    HEXBYT
  129.  01B7 13            INX    D
  130.  01B8 AF            XRA    A
  131.  01B9 C9            RET
  132.  01BA CDC901    HEXBYT:    CALL    ASCHEX
  133.  01BD 07            RLC
  134.  01BE 07            RLC
  135.  01BF 07            RLC
  136.  01C0 07            RLC
  137.  01C1 47            MOV    B,A
  138.  01C2 CDC901        CALL    ASCHEX
  139.  01C5 80            ADD    B
  140.  01C6 12            STAX    D
  141.  01C7 13            INX    D
  142.  01C8 C9            RET
  143.  01C9 CD7C01    ASCHEX:    CALL    GETCHR
  144.  01CC D630          SUI    '0'
  145.  01CE FE0A          CPI    10
  146.  01D0 F8            RM
  147.  01D1 D607          SUI    7
  148.  01D3 C9            RET
  149.                 ;    COMPARE HL & DE
  150.                 ;    OUT - FLAGS ARE SET TO RESULT OF HL - DE
  151.                 ;
  152.  01D4 7C        COMPAR:    MOV    A,H
  153.  01D5 BA            CMP    D
  154.  01D6 C0            RNZ
  155.  01D7 7D            MOV    A,L
  156.  01D8 BB            CMP    E
  157.  01D9 C9            RET
  158.                 ;
  159.                 ;
  160.                 ;    VARIABLES
  161.  01DA 0000      LADDR:    DW    0    ;LOAD ADDRESS
  162.  01DC 0000      OFFSET:    DW    0    ;LOAD OFFSET
  163.  01DE 0000      SAVESP:    DW    0    ;CP/M STACK POINTER
  164.  01E0 0000      COUNT:    DW    0    ;LOAD COUNT OF LINE
  165.  01E2               DS    26
  166.                 STACK:
  167.  01FC =         LOW:    EQU    $    ;LOW LOAD ADDRESS
  168.                 ;
  169.                 ;
  170.  01FC 0E19      INIT:    MVI    C,INTDSK    ;SAVE CURRENTLY LOGGED DISK
  171.  01FE CD0500        CALL    BDOS
  172.  0201 329101        STA    DRIVE
  173.  0204 2A0100        LHLD    BOOT+1        ;GET SELECT DISK ADDRESS
  174.  0207 2E1B          MVI    L,3*9
  175.  0209 229301        SHLD    SELDSK
  176.  020C 227602        SHLD    INISEL
  177.  020F 210000        LXI    H,0        ;CLEAR OFFSET
  178.  0212 22DC01        SHLD    OFFSET
  179.  0215 0616          MVI    B,22        ;SET MAX CHAR SCAN
  180.  0217 3A5D00        LDA    TFN        ;WAS FILE SPECIFIED?
  181.  021A FE20          CPI    ' '
  182.  021C C24002        JNZ    INIT1
  183.  021F 3E14          MVI    A,20        ;NO. SET MAX BUFFER LENGTH
  184.  0221 328000        STA    TBUFF
  185.  0224 114303    INIT0:    LXI    D,FNMES        ;OUTPUT FILENAME MESSAGE
  186.  0227 0E09          MVI    C,CONOUT
  187.  0229 CD0500        CALL    BDOS
  188.  022C 118000        LXI    D,TBUFF        ;INPUT FILE NAME
  189.  022F 0E0A          MVI    C,CONIN
  190.  0231 CD0500        CALL    BDOS
  191.  0234 CD3703        CALL    CRLF
  192.  0237 3A8100        LDA    TBUFF+1        ;# CHARS IN BUFFER
  193.  023A FE00          CPI    0
  194.  023C CA2402        JZ    INIT0
  195.  023F 47            MOV    B,A        ;B:=# CHARS IN BUFFER
  196.  0240 218100    INIT1:    LXI    H,TBUFF+1
  197.  0243 3A8300        LDA    TBUFF+3        ;DRIVE SPECIFIED?
  198.  0246 FE3A          CPI    ':'
  199.  0248 C27C02        JNZ    INITD3
  200.  024B 23            INX    H
  201.  024C 7E            MOV    A,M
  202.  024D D641          SUI    'A'        ;YES. LEGAL DRIVE #
  203.  024F FA5702        JM    INITD1
  204.  0252 FE10          CPI    16
  205.  0254 FA7302        JM    INITD2
  206.  0257 116202    INITD1:    LXI    D,DRVMES    ;NO
  207.  025A 0E09          MVI    C,CONOUT
  208.  025C CD0500        CALL    BDOS
  209.  025F C38D01        JMP    EXIT
  210.  0262 494E56414CDRVMES:    DB    'INVALID DRIVE.',CR,LF,'$'
  211.  0273 C5        INITD2:    PUSH    B
  212.  0274 4F            MOV    C,A        ;SELECT DRIVE
  213.  0275 CD7502        CALL    $
  214.  0276 =         INISEL:    EQU    $-2
  215.  0278 C1            POP    B
  216.  0279 218300        LXI    H,TBUFF+3
  217.                 INITD3:
  218.  027C 115C00        LXI    D,TFCB
  219.  027F 23        INIT2:    INX    H
  220.  0280 13            INX    D
  221.  0281 7E            MOV    A,M
  222.  0282 FE2E          CPI    '.'        ;END OF NAME?
  223.  0284 CAA002        JZ    INIT4
  224.  0287 FE20          CPI    ' '
  225.  0289 CABF02        JZ    INIT7
  226.  028C FE0D          CPI    CR
  227.  028E CAD902        JZ    INIT9
  228.  0291 FE60          CPI    060H        ;NO. LOWER CASE?
  229.  0293 DA9802        JC    INIT3
  230.  0296 D620          SUI    020H        ;YES. CONVERT TO UPPER CASE
  231.  0298 12        INIT3:    STAX    D
  232.  0299 05            DCR    B
  233.  029A C27F02        JNZ    INIT2
  234.  029D C3D902        JMP    INIT9
  235.  02A0 116400    INIT4:    LXI    D,TFT-1        ;GET FILE TYPE
  236.  02A3 23        INIT5:    INX    H
  237.  02A4 13            INX    D
  238.  02A5 7E            MOV    A,M
  239.  02A6 FE20          CPI    ' '
  240.  02A8 CABF02        JZ    INIT7
  241.  02AB FE0D          CPI    CR
  242.  02AD CAD902        JZ    INIT9
  243.  02B0 FE60          CPI    060H
  244.  02B2 DAB702        JC    INIT6
  245.  02B5 D620          SUI    020H
  246.  02B7 12        INIT6:    STAX    D
  247.  02B8 05            DCR    B
  248.  02B9 C2A302        JNZ    INIT5
  249.  02BC F2D902        JP    INIT9
  250.  02BF 23        INIT7:    INX    H        ;SCAN FOR OFFSET
  251.  02C0 7E            MOV    A,M
  252.  02C1 FE3D          CPI    '='
  253.  02C3 CAD202        JZ    INIT8
  254.  02C6 FE0D          CPI    CR
  255.  02C8 CAD902        JZ    INIT9
  256.  02CB 05            DCR    B
  257.  02CC C2BF02        JNZ    INIT7
  258.  02CF C3D902        JMP    INIT9
  259.  02D2 23        INIT8:    INX    H        ;GET OFFSET
  260.  02D3 11DC01        LXI    D,OFFSET
  261.  02D6 CDAE01        CALL    GETADR
  262.                 INIT9:
  263.  02D9 3A6500        LDA    TFT        ;WAS FILE TYPE SPECIFIED?
  264.  02DC FE20          CPI    ' '
  265.  02DE C2F102        JNZ    INIT11
  266.  02E1 215103        LXI    H,HEXMES    ;SET FILE TYPE TO HEX
  267.  02E4 116500        LXI    D,TFT
  268.  02E7 0603          MVI    B,3
  269.  02E9 7E        INIT10:    MOV    A,M
  270.  02EA 12            STAX    D
  271.  02EB 23            INX    H
  272.  02EC 13            INX    D
  273.  02ED 05            DCR    B
  274.  02EE C2E902        JNZ    INIT10
  275.                 INIT11:
  276.  02F1 116800        LXI    D,TEX        ;CLEAR EXTENT AND
  277.  02F4 0604          MVI    B,4        ; RECORD COUNT
  278.  02F6 AF            XRA    A
  279.  02F7 12        INIT12:    STAX    D
  280.  02F8 13            INX    D
  281.  02F9 05            DCR    B
  282.  02FA C2F702        JNZ    INIT12
  283.  02FD 117C00        LXI    D,TNR        ;CLEAR NEXT RECORD NUMBER
  284.  0300 12            STAX    D
  285.  0301 0E11          MVI    C,SEARCF
  286.  0303 CDA501        CALL    FILEOP        ;LOOKUP HEX FILE
  287.  0306 FEFF          CPI    0FFH
  288.  0308 C23103        JNZ    INIT13
  289.  030B 111603        LXI    D,EXIMES    ;OUTPUT ERROR MESSAGE
  290.  030E 0E09          MVI    C,CONOUT
  291.  0310 CD0500        CALL    BDOS
  292.  0313 C38D01        JMP    EXIT
  293.  0316 4845582046EXIMES:    DB    'HEX FILE DOES NOT EXIST.',CR,LF,'$'
  294.                 INIT13:
  295.  0331 0E0F          MVI    C,OPENF        ;OPEN HEX FILE
  296.  0333 CDA501        CALL    FILEOP
  297.  0336 C9            RET
  298.                 ;
  299.                 ;
  300.  0337 114003    CRLF:    LXI    D,CRLFM
  301.  033A 0E09          MVI    C,CONOUT
  302.  033C CD0500        CALL    BDOS
  303.  033F C9            RET
  304.  0340 0D0A24    CRLFM:    DB     CR,LF,'$'
  305.  0343 46494C454EFNMES:    DB    'FILENAME ... $'
  306.  0351 484558    HEXMES:    DB    'HEX'
  307.  0354               END
  308.