home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / cpm / cpm86 / mboot86.a86 < prev    next >
Text File  |  1985-10-13  |  7KB  |  460 lines

  1. ;===============================================================;
  2. ;                                ;
  3. ;    MBOOT86.A86 Ver 1.00                    ;
  4. ;    (preliminary release 11/08/83)                ;
  5. ;                                ;
  6. ;    This program accepts a file that comes in over        ;
  7. ;    an IBM ASYNC adapter board, port-0.            ;
  8. ;                                ;
  9. ;                       **** BEWARE ****            ;
  10. ;    This codes is a 2 hour attempt at converting MBOOT    ;
  11. ;    from CP/M-80,8080 code TO CP/M-86,8086 code.  It is    ;
  12. ;    not an exact translation!!  Like MBOOT, is does have    ;
  13. ;    a terminal mode and will receive a file used the     ;
  14. ;    MODEM/XMODEM protocol.                    ;
  15. ;                                ;
  16. ;    CREDITS                            ;
  17. ;      MODEM BOOT(MBOOT)   - Keith Petersen W8SDZ        ;
  18. ;      Terminal routine    - John Taylor            ;
  19. ;      Based on MODEM.ASM  - Ward Christensen        ;
  20. ;      MBOOT86 for CP/M-86 - Daniel Deward            ;
  21. ;                                ;
  22. ;    FOR THE CP/M-86 OPERATING SYSTEM            ;
  23. ;        To generate a .CMD file,            ;
  24. ;    A>asm86 mboot86                        ;
  25. ;    A>gencmd mboot86                    ;
  26. ;                                ;
  27. ;===============================================================;
  28. ;
  29. ;    BDOS FUNCTION NUMBERS
  30. ;
  31. CONINP    EQU    1        ;CONSOLE INPUT
  32. CONOUT    EQU    2        ;CONSOLE OUTPUT
  33. CSTAT    EQU    11        ;GET CONSOLE STATUS
  34. ;
  35. ;    ASCII CONTROL CHARACTER EQUATES
  36. ;
  37. SOH    EQU    01H        ;START OF HEADER
  38. EOT    EQU    04H        ;END OF TRANSMISSION
  39. CR    EQU    0DH        ;CARRIAGE RETURN
  40. LF    EQU    0AH        ;LINE FEED
  41. ESC    EQU    1BH        ;ESCAPE
  42. ACK    EQU    06H        ;ACKNOWLEDGE
  43. NAK    EQU    15H        ;NEGATIVE ACK
  44. CAN    EQU    18H        ;CANCEL TRANSMISSION
  45. ;
  46. ERRLIM    EQU    10        
  47. EXITKEY    EQU    03H        ;CONTROL-C
  48. ;
  49. ;    I/O PORT ASSIGNMENTS
  50. ;
  51. MODDATP    EQU    03F8H        ;MODEM DATA PORT
  52. MODCTLP    EQU    03FDH        ;MODEM CONTROL PORT
  53. ;
  54. ;
  55.     CSEG
  56.     CLI                ;DISABLE INTERRUPTS
  57.     MOV    DX,OFFSET MSG1        ;LOGON
  58.     CALL    PSTRING
  59. ;
  60.     MOV    AL,FCB+1        ;CHECK FOR FILE ON COMMAND LINE
  61.     CMP    AL,' '
  62.     JNZ    TERMI
  63. ;
  64.     MOV    DX,OFFSET MSG2        ;NO FILE NAME SPECIFIED
  65.     CALL    PSTRING
  66.     JMP    EXIT
  67. ;
  68. TERMI:
  69.     MOV    DX,MODDATP
  70.     IN    AL,DX            ;GOBBLE UP GARBAGE
  71.     IN    AL,DX
  72. ;
  73.     MOV    DX,OFFSET MSG3        ;TERMINAL MODE
  74.     CALL    PSTRING
  75. ;
  76. TMODE:
  77.     CALL    STAT        ;GET KEYBOARD STATUS
  78.     JZ    TERML        ;NO CHAR READY
  79.     CALL    KEYIN        ;ESLE GET CHAR
  80.     CMP    AL,EXITKEY    ;TEST FOR EXIT
  81.     JNZ    KEYOK
  82.     JMP    EXIT
  83. ;
  84. KEYOK:
  85.     CMP    AL,ESC        ;START FILE XFER ?
  86.     JZ    RCVFIL
  87. ;
  88.     MOV    DX,MODDATP
  89.     OUT    DX,AL
  90. ;
  91. TERML:
  92.     MOV    DX,MODCTLP    ;GET MODEM STATUS 
  93.     IN    AL,DX
  94.     TEST    AL,01H
  95.     JZ    TMODE        ;NO CHAR YET
  96.     MOV    DX,MODDATP    ;GET MODEM DATA
  97.     IN    AL,DX
  98.     CALL    COUT
  99.     JMP    TMODE
  100. ;
  101. RCVFIL:
  102.     CALL    MAKEFIL
  103.     MOV    DX,OFFSET MSG4    ;FILE OPEN READY TO RECEIVE
  104.     CALL    PSTRING
  105. ;
  106. RCVLP:
  107.     CALL    RCVSECT            ;GET SECTOR
  108.     JC    RCVEOT            ;IF END OF TRANSFER
  109.     CALL    WRSECT            ;WRITE SECTOR
  110.     CALL    INCRSNO            ;ADVANCE SECTOR #
  111.     CALL    SENDACK            ;ACK RECORD
  112.     JMP    RCVLP            ;CONTINUE TILL EOT
  113. ;
  114. RCVEOT:
  115.     CALL    WRBLOCK            ;WRITE OUT LAST BUFFER
  116.     CALL    SENDACK            ;SEND ACK
  117.     CALL    CLOSEFIL        ;CLOSE THE FILE
  118. ;
  119.     MOV    DX,OFFSET MSG5        ;TRANSFER COMPLETE
  120.     CALL    PSTRING
  121.     JMP    EXIT
  122. ;
  123. ; SUBROUTINE RCVSECT
  124. ;
  125. RCVSECT:
  126.     XOR    AL,AL
  127.     MOV    ERRCT,AL    ;RESET ERROR COUNT
  128. ;
  129. RCVRPT:
  130.     MOV    CH,10        ;SET RETRY COUNT TO 10
  131.     CALL    RECV
  132.     JC    RCVSERR
  133.     CMP    AL,SOH        ;START OF HEADER
  134.     JZ    RCVSOH        ;GET IT
  135.     OR    AL,AL
  136.     JZ    RCVRPT
  137.     CMP    AL,EOT        ;END OF TRANSMISSION
  138.     STC            ;INDICATE EOT
  139.     JNZ    RCVSERR
  140.     JMP    DORET        ;YES, END OF TRANSMISSION
  141. ;
  142. RCVSERR:
  143.     MOV    CH,1
  144.     CALL    RECV
  145.     JNC    RCVSERR
  146. ;
  147.     MOV    AL,NAK        ;NAK THE BAD FRAME
  148.     CALL    SEND
  149.     MOV    AL,ERRCT
  150.     INC    AL
  151.     MOV    ERRCT,AL    ;SAVE IT BACK
  152. ;
  153.     CMP    AL,ERRLIM        ;ERROR LIMIT REACHED ?
  154.     JC    RCVRPT
  155. ;
  156. ; ABORT THE RECEIVE
  157. ;
  158. RCVSABT:
  159.     CALL    CLOSEFIL        ;SAVE WHATEVER WE GOT
  160.     MOV    DX,OFFSET MSG6        ;UNABLE TO RECEIVE BLOCK
  161.     CALL    PSTRING
  162.     JMP    EXIT
  163. ;
  164. RCVSOH:
  165.     MOV    CH,1            ;TIME OUT = 1 MSEC
  166.     CALL    RECV            ;GET A CHAR
  167.     JC    RCVSERR
  168. ;
  169.     MOV    DL,AL
  170.     MOV    CH,1
  171.     CALL    RECV
  172.     JC    RCVSERR
  173. ;
  174.     NOT    AL
  175.     CMP    AL,DL
  176.     JZ    RCVDATA
  177.     JMP    RCVSERR
  178. ;
  179. RCVDATA:
  180.     MOV    AL,DL
  181.     MOV    RCVSNO,AL
  182.     MOV    CL,0
  183.     MOV    DI,80H
  184. ;
  185. RCVCHR:
  186.     MOV    CH,1            ;TIME OUT OF 1 MSEC
  187.     CALL    RECV
  188.     JC    RCVSERR
  189. ;
  190.     MOV    BYTE PTR[DI],AL        ;SAVE THE CHARACTER
  191.     INC    DI            ;ADVANCE POINTER
  192.     CMP    DI,0100H        ;END OF BUFFER ?
  193.     JNZ    RCVCHR            ;CONTINUE UNTIL BUFFER FULL
  194. ;
  195.     MOV    DL,CL        ;SAVE CHECK SUM
  196.     MOV    CH,1        ;SET TIME OUT TO 1 MSEC
  197.     CALL    RECV
  198.     JC    RCVSERR
  199.     CMP    AL,DL
  200.     JNZ    RCVSERR
  201. ;
  202.     MOV    AL,RCVSNO
  203.     MOV    BL,AL
  204.     MOV    AL,SECTNO
  205.     CMP    BL,AL
  206.     JZ    RECVACK
  207.     INC    AL
  208.     CMP    BL,AL
  209.     JZ    RCV0
  210.     JMP    EXIT
  211. ;
  212. RCV0:    RET
  213. ;
  214. ;
  215. RECVACK:
  216.     CALL    SENDACK
  217.     JMP    RCVSECT
  218. ;
  219. SENDACK:
  220.     MOV    AL,ACK
  221. SEND:    PUSH    AX        ;SAVE OUTPUT CHAR
  222.     ADD    AL,CL
  223.     MOV    CL,AL
  224. ;
  225. SENDW:    MOV    DX,MODCTLP
  226.     IN    AL,DX
  227.     TEST    AL,20H
  228.     JZ    SENDW
  229.     POP    AX        ;RESTORE OUTPUT CHAR
  230.     MOV    DX,MODDATP
  231.     OUT    DX,AL
  232.     RET
  233. ;
  234. INCRSNO:
  235.     MOV    AL,SECTNO
  236.     INC    AL
  237.     MOV    SECTNO,AL
  238.     RET
  239. ;
  240. MAKEFIL:
  241.     MOV    DX,OFFSET FCB
  242.     MOV    CL,22
  243.     CALL    BDOS
  244.     INC    AL
  245.     JZ    DIRFULL
  246.     JMP    DORET
  247. ;
  248. DIRFULL:
  249.     MOV    DX,OFFSET MSG8
  250.     CALL    PSTRING        ;DIRCETORY FULL
  251.     JMP    EXIT
  252. ;
  253. CLOSEFIL:
  254.     MOV    DX,OFFSET FCB
  255.     MOV    CL,16
  256.     CALL    BDOS
  257.     INC    AL
  258.     JZ    NOCLOSE
  259.     JMP    DORET
  260. ;
  261. NOCLOSE:
  262.     MOV    DX,OFFSET MSG9        ;CAN'T CLOSE FILE
  263.     CALL    PSTRING
  264.     JMP    EXIT
  265. ;
  266. WRSECT:
  267.     MOV    DI,SECPTR
  268.     MOV    SI,80H
  269.     CALL    MOVE128            ;COPY TO DISK BUFFER
  270.     MOV    SECPTR,DI        ;SAVE NEW POINTER
  271. ;
  272.     MOV    AL,SECINBF
  273.     INC    AL
  274.     MOV    SECINBF,AL
  275.     CMP    AL,16
  276.     JZ    WRBLOCK
  277.     JMP    DORET
  278. ;
  279. ;    OUTPUT BUFFER TO DISK
  280. ;
  281. WRBLOCK:
  282.     MOV    AL,SECINBF        ;GET SECTOR COUNTER
  283.     OR    AL,AL
  284.     JNZ    WR0
  285.     JMP    DORET
  286. ;
  287. WR0:
  288.     MOV    CL,AL            ;CL = WRITE COUNTER
  289.     MOV    DX,OFFSET DBUF
  290. ;
  291. DKWRLP:
  292.     PUSH    DX
  293.     PUSH    BX
  294.     PUSH    CX        ;SAVE REGISTERS
  295. ;
  296.     MOV    CL,26
  297.     CALL    BDOS
  298. ;
  299.     STI            ;ENABLE INTERRUPTS
  300.     MOV    DX,OFFSET FCB
  301.     MOV    CL,21
  302.     CALL    BDOS
  303.     CLI            ;DISABLE INTERRUPTS
  304. ;
  305.     POP    CX
  306.     POP    BX
  307.     POP    DX
  308.     OR    AL,AL        ;TEST DISK WRITE STATUS
  309.     JNZ    WRERR        ;DISK WRITE ERROR
  310. ;
  311.     ADD    DX,80H        ;ADVANCE DMA POINTER
  312.     DEC    CL
  313.     JNZ    DKWRLP        ;CONTINUE WRITTING
  314. ;
  315.     MOV    SECINBF,0
  316.     MOV    DX,OFFSET DBUF
  317.     MOV    SECPTR,DX
  318. ;
  319. RSDMA:    MOV    DX,80H
  320.     MOV    CL,26
  321.     CALL    BDOS
  322.     RET
  323. ;
  324. WRERR:    CALL    RSDMA
  325.     MOV    DX,OFFSET MSG10
  326.     CALL    PSTRING        ;ERROR IN WRITTING FILE
  327.     JMP    EXIT
  328. ;
  329. ;    RECV
  330. ;    UPON ENTRY
  331. ;        CH = # OF MSEC BEFORE TIME OUT
  332. ;
  333. ;    UPON EXIT
  334. ;        CL = UPDATED CHECKSUM
  335. ;
  336. RECV:
  337.     PUSH    DX
  338.     PUSH    BX
  339. MSEC:    MOV    BX,50000
  340. MWTI:    MOV    DX,MODCTLP
  341.     IN    AL,DX
  342.     TEST    AL,01H
  343.     JNZ    MCHAR
  344.     DEC    BL
  345.     JNZ    MWTI
  346.     DEC    BH
  347.     JNZ    MWTI
  348.     DEC    CH
  349.     JNZ    MSEC
  350.     POP    BX
  351.     POP    DX
  352.     STC
  353.     RET
  354. ;
  355. MCHAR:    MOV    DX,MODDATP
  356.     IN    AL,DX
  357.     ADD    CL,AL        ;UPDATE CHECKSUM
  358.     OR    AL,AL
  359.     POP    BX
  360.     POP    DX
  361.     RET
  362. ;
  363. MOVE128:
  364.     PUSH    BX
  365.     MOV    BL,128
  366. MOVE:    MOV    AL,BYTE PTR [SI]
  367.     MOV    BYTE PTR [DI],AL
  368.     INC    SI
  369.     INC    DI
  370.     DEC    BL
  371.     JNZ    MOVE
  372.     POP    BX
  373.     RET
  374. ;
  375. EXIT:
  376.     STI
  377.     MOV    CL,0
  378.     CALL    BDOS
  379. ;
  380. PSTRING:
  381.     MOV    CL,9
  382.     CALL    BDOS
  383.     RET
  384. ;
  385. KEYIN:
  386.     PUSH    BX
  387.     PUSH    DX
  388.     MOV    CL,CONINP
  389.     CALL    BDOS
  390.     POP    DX
  391.     POP    BX
  392.     RET
  393. ;
  394. COUT:
  395.     PUSH    BX
  396.     PUSH    DX
  397.     MOV    DL,AL
  398.     MOV    CL,CONOUT
  399.     CALL    BDOS
  400.     POP    DX
  401.     POP    BX
  402.     RET
  403. ;
  404. STAT:
  405.     PUSH    BX
  406.     PUSH    DX
  407.     MOV    CL,CSTAT
  408.     CALL    BDOS
  409.     OR    AL,AL
  410.     POP    DX
  411.     POP    BX
  412.     RET
  413. ;
  414. DORET:    RET
  415. ;
  416. BDOS:
  417.     INT    224
  418.     RET
  419. ;
  420. ;    DATA AREA
  421. ;
  422.     DSEG
  423.     ORG    5CH
  424. FCB    RB    35        ;FILE CONTROL BLOCK
  425. BUFF    RB    128        ;DISK WRITE BUFFER
  426. ;
  427.     DW    0        ;ALIGN TO WORD BOUNDARY
  428. ;
  429. RCVSNO    DB    0        ;RECEIVED SECTOR NUMBER
  430. SECTNO    DB    0        ;CURRENT SECTOR NUMBER
  431. ERRCT    DB    0        ;ERROR COUNT
  432. SECPTR    DW    DBUF        ;DISK BUFFER POINTER
  433. SECINBF    DB    0        ;# OF SECTORS IN DISK BUFFER
  434. ;
  435. DBUF    RS    4096        ;DISK BUFFER
  436.     DW    0
  437. ;
  438. ;    MESSAGES
  439. ;
  440. MSG1    DB    CR,LF,'MBOOT FOR THE IBM-PC',CR,LF
  441.     DB    'Version 1.00',CR,LF,'$'
  442.  
  443. MSG2    DB    CR,LF,'No file name specified',CR,LF,'$'
  444.  
  445. MSG3    DB    CR,LF,'Terminal mode',CR,LF,LF,'$'
  446.  
  447. MSG4    DB    CR,LF,'File open, ready to receive',CR,LF,'$'
  448.  
  449. MSG5    DB    CR,LF,'Transfer complete',CR,LF,'$'
  450.  
  451. MSG6    DB    CR,LF,'Unable to receive block',CR,LF,'$'
  452.  
  453. MSG8    DB    CR,LF,'Directory full',CR,LF,'$'
  454.  
  455. MSG9    DB    CR,LF,'Cannot close file',CR,LF,'$'
  456.  
  457. MSG10    DB    CR,LF,'Error in writting file',CR,LF,'$'
  458. ;
  459.     END
  460.