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 / CPMUG008.ARK / BINLOAD1.ASM < prev    next >
Assembly Source File  |  1984-04-29  |  6KB  |  331 lines

  1. ;-----------------------------------------------
  2. ;
  3. ; LOAD CONTIGUOUS BINARY FILE FROM DISK
  4. ;
  5. ;-----------------------------------------------
  6. ;
  7. ; VERSION 0.1 - 08 SEP 77
  8. ; JEFFREY W. SHOOK
  9. ;
  10.     ORG    100H    ; CP/M ENTRY POINT
  11.  
  12. LOADB:    LXI    H,0    ; SAVE CP/M STACK
  13.     DAD    SP
  14.     SHLD    SAVSP
  15.     LXI    SP,STACK; SET STACK POINTER
  16.  
  17. ; INPUT INITIAL VALUES
  18.  
  19.     MVI    C,WCONB    ; PRINT PROGRAM NAME
  20.     LXI    D,MSG1
  21.     CALL    BDOS
  22.     JMP    NEXT1
  23.  
  24. MSG1:    DB CR,LF,0,'CONTIGUOUS FILE LOADER',CR,LF,0
  25.     DB 'ENTER ALL VALUES IN HEXIDECIMAL',CR,LF,0,'$'
  26.  
  27. NEXT1:    MVI    C,WCONB    ; REQUEST DISK #
  28.     LXI    D,MSG0
  29.     CALL    BDOS
  30.     JMP    NEXT0
  31.  
  32. MSG0:    DB CR,LF,0,'WHICH DISK (A OR B)? ','$'
  33.  
  34. NEXT0:    MVI    C,RCON    ; GET DISK
  35.     CALL    BDOS
  36.     CMA
  37.     ANI    1
  38.     STA    DISK
  39.     MVI    A,SELDSK; SELECT DRIVE
  40.     LXI    H,DISK
  41.     MOV    C,M
  42.     CALL    FBIOS
  43.     MVI    C,WCONB    ; REQUEST STARTING TRACK
  44.     LXI    D,MSG2
  45.     CALL    BDOS
  46.     JMP    NEXT2
  47.  
  48. MSG2:    DB CR,LF,0,'STARTING POINT',CR,LF,0
  49.     DB 'TRACK (XX) ? ','$'
  50.  
  51. NEXT2:    CALL    INBYTE    ; GET TRACK #
  52.     STA    TRACK
  53.     MVI    C,WCONB    ; REQUEST SECTOR #
  54.     LXI    D,MSG3
  55.     CALL    BDOS
  56.     JMP    NEXT3
  57.  
  58. MSG3:    DB CR,LF,0,'SECTOR (XX) ? ','$'
  59.  
  60. NEXT3:    CALL    INBYTE    ; GET SECTOR #
  61.     STA    RECORD
  62.  
  63.     MVI    C,WCONB    ; REQUEST SECTOR COUNT
  64.     LXI    D,MSG4
  65.     CALL    BDOS
  66.     JMP    NEXT4
  67.  
  68. MSG4:    DB CR,LF,0,'FILE SIZE, SECTORS (XXXX)? ','$'
  69.  
  70. NEXT4:    CALL    INADDR    ; INPUT # SECTORS TO READ
  71.     SHLD    RCOUNT
  72.  
  73.     MVI    C,WCONB    ; REQUEST STARTING ADDRESS
  74.     LXI    D,MSG5
  75.     CALL    BDOS
  76.     JMP    NEXT5
  77.  
  78. MSG5:    DB CR,LF,0,'STARTING ADDRESS (XXXX)? ','$'
  79.  
  80. NEXT5:    CALL    INADDR    ; INPUT STARTING ADDRESS
  81.     SHLD    DMAADR
  82.  
  83. ALLOK:    MVI    C,WCONB    ; CHECK IF ALL OK
  84.     LXI    D,MSG51
  85.     CALL    BDOS
  86.     JMP    NEXT51
  87.  
  88. MSG51:    DB CR,LF,0,'LOAD FILE? (Y,N,Q) ','$'
  89.  
  90. NEXT51:    MVI    C,RCON    ; GET CHAR
  91.     CALL    BDOS
  92.     CPI    'Q'    ; QUIT?
  93.     JZ    GOCPM
  94.     CPI    'N'    ; TRY AGAIN?
  95.     JZ    LOADB
  96.     CPI    'Y'
  97.     JNZ    ALLOK
  98.  
  99.     MVI    C,WCONB    ; PRINT BUSY MESSAGE
  100.     LXI    D,MSG6
  101.     CALL    BDOS
  102.     JMP    NEXT6
  103.  
  104. MSG6:    DB CR,LF,0,'NOW LOADING FILE',CR,LF,0,'$'
  105.  
  106. NEXT6:
  107. LOOP1:    CALL    READR    ; READ ONE RECORD
  108.     JC    DONE
  109.     LHLD    DMAADR    ; MOVE DMA POINTER
  110.     LXI    D,128    ; TO NEXT SECTOR
  111.     DAD    D
  112.     SHLD    DMAADR
  113.  
  114.     LHLD    RCOUNT    ; DECREMENT RECORD COUNT
  115.     DCX    H
  116.     SHLD    RCOUNT
  117.     MOV    A,L    ; CHECK IF DONE
  118.     ORA    H
  119.     JNZ    LOOP1
  120.  
  121. DONE:    MVI    C,WCONB    ; PRINT DONE MESSAGE
  122.     LXI    D,MSG7
  123.     CALL    BDOS
  124.     JMP    NEXT7
  125.  
  126. MSG7:    DB CR,LF,0,'LOAD COMPLETE',CR,LF,0,'$'
  127.  
  128. NEXT7:
  129.  
  130. GOCPM:    LHLD    SAVSP
  131.     SPHL
  132.     JMP    BDOS
  133.  
  134. ; READ RECORDS FROM DISK IN ORDER
  135. ;
  136. ; RETURN WITH CARRY SET WHEN END
  137. ; OF DISK IS REACHED.
  138. ;
  139. ; SET TRACK AND RECORD TO POINT
  140. ; TO NEXT RECORD TO BE READ.
  141.  
  142. ; COUNT = 0
  143.  
  144. READR:    MVI    A,SETDMA; SET DMA ADDRESS
  145.     LXI    H,DMAADR
  146.     MOV    C,M
  147.     INX    H
  148.     MOV    B,M
  149.     CALL    FBIOS
  150.  
  151.     MVI    A,SETTRK; SET TRACK
  152.     LXI    H,TRACK
  153.     MOV    C,M
  154.     CALL    FBIOS
  155.  
  156.     LXI    H,RECORD; SET SECTOR
  157.     MOV    C,M
  158.     CALL    RECSEC    ; CONVERT RECORD TO SECTOR
  159.     MVI    A,SETSEC
  160.     CALL    FBIOS
  161.  
  162.     MVI    A,READS    ; READ SECTOR
  163.     CALL    FBIOS
  164.     CPI    0
  165.     JNZ    READR2
  166.  
  167. ; COMPUTE NEXT RECORD AND TRACK
  168.  
  169.     LXI    H,RECORD; INCREMENT RECORD #
  170.     INR    M
  171.     MOV    A,M    ; CHECK FOR END OF TRACK
  172.     CPI    27
  173.     JM    READR1
  174.     MVI    M,1    ; SET TO FIRST RECORD
  175.  
  176.     LXI    H,TRACK    ; INCREMENT TRACK #
  177.     INR    M
  178.     MOV    A,M
  179.     CPI    78    ; LAST TRACK?
  180.     JP    READR2
  181. READR1:    ORA    A    ; CLEAR CARRY
  182.     RET
  183.  
  184. READR2:    STC
  185.     RET
  186.     
  187. RECSEC:    RET
  188.  
  189. ;******************************************
  190. ;* BIOS FUNCTION CALLING PROCEDURE        *
  191. ;******************************************
  192. ;
  193. ; THIS PROCEDURE ALLOWS CALLING BIOS
  194. ; FUNCTIONS WITHOUT PRIOR KNOWLEDGE OF THE
  195. ; SIZE OF THE CP/M SYSTEM.
  196. ;
  197. ; CALL FBIOS WITH THE FUNCTION IN A
  198. ; AND THE PARAMETER IN BC.
  199. ;
  200. FBIOS:    MOV    E,A    ; GET ENTRY OFFSET
  201.     MVI    D,0    ; IN DE
  202.     LHLD    1    ; GET BIOS ENTRY + 3
  203.     DAD    D    ; ADD ENTRY TO OFFSET
  204.     PCHL        ; JUMP TO BIOS
  205. ;
  206. ; BIOS ENTRY CODE NAMES
  207. ;
  208. WBOOT:    EQU    0    ; WARM BOOT
  209. CONST:    EQU    3    ; TEST CONSOLE STATUS
  210. CONIN:    EQU    6    ; CONSOLE INPUT
  211. CONOUT:    EQU    9    ; CONSOLE OUTPUT
  212. LIST:    EQU    12    ; LIST OUTPUT
  213. PUNCH:    EQU    15    ; PUNCH OUTPUT
  214. READER:    EQU    18    ; READER INPUT
  215. HOME:    EQU    21    ; HEAD TO TRACK 0
  216. SELDSK:    EQU    24    ; SELECT DRIVE
  217. SETTRK:    EQU    27    ; SET NEXT TRACK
  218. SETSEC:    EQU    30    ; SET NEXT SECTOR
  219. SETDMA:    EQU    33    ; SET DMA ADDRESS
  220. READS:    EQU    36    ; READ SECTOR
  221. WRITES:    EQU    39    ; WRITE SECTOR
  222. ;
  223. ;
  224. ;**********************************************
  225. ; HEXIDECIMAL INPUT ROUTINES FOR CP/M
  226. ;
  227. ; VERSION 0.1 - 8 SEP 77 - J.W. SHOOK
  228. ;**********************************************
  229.  
  230. INHEX:    PUSH B ! PUSH D ! PUSH H
  231.     MVI    C,RCON    ; INPUT CHARACTER
  232.     CALL    BDOS
  233.     POP H  ! POP D  ! POP B
  234.     SBI    '0'    ; REMOVE ASCII OFFSET
  235.     JC    INHEX2
  236.     CPI    10    ; DECIMAL DIGIT?
  237.     JC    INHEX1
  238.     SBI    '@'-'9'    ; REMOVE ALPHA BIAS
  239. INHEX1:    CPI    16    ; TOO LARGE?
  240.     JNC    INHEX2
  241.     ORA    A    ; CLEAR CARRY
  242.     RET
  243.  
  244. INHEX2:    XRA    A    ; CLEAR A ON ERROR
  245.     STC    ; MARK ERROR WITH CARRY
  246.     RET
  247.  
  248. INBYTE:    CALL    INHEX    ; INPUT HIGH HEX DIGIT
  249.     RC        ; ERROR
  250.     ADD    A    ; SHIFT TO LEFT HALF
  251.     ADD    A
  252.     ADD    A
  253.     ADD    A
  254.     MOV    B,A    ; SAVE BYTE
  255.     CALL    INHEX    ; GET LOW HEX DIGIT
  256.     RC        ; ERROR
  257.     ORA    B
  258.     RET
  259.  
  260.  
  261. INADDR:    CALL    INBYTE    ; INPUT 4 DIGIT HEX NUMBER
  262.     MOV    H,A
  263.     PUSH    H
  264.     CALL    INBYTE
  265.     POP    H
  266.     MOV    L,A
  267.     RET
  268.  
  269.  
  270. ; VARIABLE DECLARATIONS
  271.  
  272. DISK:    DS    1
  273. DMAADR:    DS    2
  274. TRACK:    DS    2
  275. SECTOR:    DS    1
  276. RECORD:    DS    1
  277. RCOUNT:    DS    2
  278. SAVSP:    DS    2
  279.     DS    100H
  280. STACK:    DS    2
  281.  
  282. ; SYMBOL DEFINITIONS
  283.  
  284. CR    EQU    0DH
  285. LF    EQU    0AH
  286.  
  287. ;***********************************;
  288. ;         CP/M STANDARD EQUATES     ;
  289. ;***********************************;
  290.  
  291. BOOT    EQU    0000H    ;WARM START ADDRESS
  292. TFCB    EQU    005CH    ;DEFAULT FCB ADDRESS
  293. TBUF    EQU    0080H    ;DEFAULT BUFFER ADDRESS
  294. TBASE    EQU    0100H    ;TRANSIENT PROGRAM BASE
  295. CBASE    EQU    2900H    ;CCP BASE ADDRESS
  296. BDOS    EQU    0005H    ;CPM ENTRY POINT
  297.  
  298. ;***********************************;
  299. ;       CP/M FUNCTION CODES         ;
  300. ;***********************************;
  301.  
  302. SRSET    EQU    00    ;SYSTEM RESET
  303. RCON    EQU    01    ;READ CONSOLE
  304. WCON    EQU    02    ;WRITE CONSOLE
  305. RRDR    EQU    03    ;READ READER
  306. WPUN    EQU    04    ;WRITE PUNCH
  307. WLST    EQU    05    ;WRITE LIST
  308. ISTAT    EQU    07    ;GET IOSTATUS
  309. SSTAT    EQU    08    ;SET IOSTATUS
  310. WCONB    EQU    09    ;WRITE CONSOLE BUFFER
  311. RCONB    EQU    10    ;READ CONSOLE BUFFER
  312. CSTAT    EQU    11    ;CHECK CONSOLE STATUS
  313. LHEAD    EQU    12    ;LIFT DISK HEAD
  314. RSDSK    EQU    13    ;RESET DISK SYSTEM
  315. SDISK    EQU    14    ;SELECT DISK
  316. OPEN    EQU    15    ;OPEN FILE
  317. CLOSE    EQU    16    ;CLOSE FILE
  318. SFRST    EQU    17    ;SEARCH FIRST
  319. SNEXT    EQU    18    ;SEARCH NEXT
  320. FDELT    EQU    19    ;DELETE FILE
  321. READ    EQU    20    ;READ RECORD
  322. WRITE    EQU    21    ;WRITE RECORD
  323. CREATE    EQU    22    ;CREATE FILE
  324. RENAM    EQU    23    ;RENAME FILE
  325. LOGIN    EQU    24    ;GET LOGIN
  326. IDISK    EQU    25    ;GET DISK NUMBER
  327. SDMA    EQU    26    ;SET DMA VECTOR
  328. IALLOC    EQU    27    ;GET ALLOCATION VECTOR
  329.     END
  330.  
  331.