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 / CPMUG025.ARK / BOOT.ASM < prev    next >
Assembly Source File  |  1984-04-29  |  6KB  |  338 lines

  1. ;STOIC DISK BOOTSTRAP
  2. ;J. SACHS 2/4/77
  3. ;
  4. ;***************************************************************************
  5. ;** COPYRIGHT (C) MASSACHUSETTS INSTITUTE OF TECHNOLOGY AND HARVARD       **
  6. ;** UNIVERSITY, BIOMEDICAL ENGINEERING CENTER 1977.  ALL RIGHTS RESERVED. **
  7. ;***************************************************************************
  8.  
  9. ;DEFINE PARAMETERS
  10. BSIZE    EQU    200H        ;BLOCK SIZE (BYTES)
  11. RAM    EQU    2000H        ;START OF RAM
  12. OFFSET    EQU    0        ;LOAD OFFSET FOR DEBUGGING BOOTSTRAP
  13. MAXRT    EQU    8        ;MAXIMUM # OF RETRIES ON DISK
  14.  
  15. ;DEFINE TEMPORARY VARIABLES
  16. DBUF    EQU    RAM        ;DIRECTORY BUFFER
  17. FBUF    EQU    DBUF+BSIZE    ;FILENAME BUFFER
  18. DIRP    EQU    FBUF+7        ;DIRECTORY POINTER
  19. FBLK    EQU    DIRP+2        ;FIRST BLOCK OF FILE
  20. NBLKS    EQU    FBLK+2        ;# OF BLOCK IN FILE
  21.  
  22. ;DEFINE PERIPHERAL ADDRESSES
  23. TTYISR    EQU    0E001H        ;TTY INPUT STATUS REGISTER
  24. TTYOSR    EQU    0E002H        ;TTY OUTPUT STATUS REGISTER
  25. TTYIDR    EQU    0E003H        ;TTY INPUT DATA REGISTER
  26. TTYODR    EQU    0E004H        ;TTY OUTPUT DATA REGISTER
  27.  
  28. DSKCR    EQU    0DE00H        ;DISK CONTROL REGISTER
  29. DSKST    EQU    0DE01H        ;DISK STATUS REGISTER
  30. DSKBL    EQU    0DE02H        ;DISK BLOCK #
  31. DSKAD    EQU    0DE04H        ;DISK BUFFER ADDR
  32.  
  33. ;BOOT FILE FORMAT
  34. ;
  35. ;1ST BLOCK
  36. ;
  37. ;    WORD    CONTENTS
  38. ;
  39. ;    0    LOAD ADDRESS
  40. ;    1    STARTING ADDRESS
  41. ;    2-256    UNUSED
  42. ;
  43. ;SUBSEQUENT BLOCKS CONTAIN A CORE IMAGE STARTING
  44. ;AT THE LOAD ADDRESS
  45. ;THE LENGTH OF THE FILE IS DETERMINED BY THE DIRECTORY
  46.  
  47. ;DEFINE RESTART HANDLERS
  48.     ORG OFFSET
  49.     DI
  50.     STA 0DF00H    ;CLEAR POWER LOW INTERRUPT FLAG
  51.     JMP BOOT
  52.  
  53.     ORG OFFSET+(1*8)
  54.     DI
  55.     JMP RAM+3H
  56.  
  57.     ORG OFFSET+(2*8)
  58.     DI
  59.     JMP RAM+6H
  60.  
  61.     ORG OFFSET+(3*8)
  62.     DI
  63.     JMP RAM+9H
  64.  
  65.     ORG OFFSET+(4*8)
  66.     DI
  67.     JMP RAM+0CH
  68.  
  69.     ORG OFFSET+(5*8)
  70.     DI
  71.     JMP RAM+0FH
  72.  
  73.     ORG OFFSET+(6*8)
  74.     DI
  75.     JMP 1400H    ;FOR DEBUGGER
  76.  
  77.     ORG OFFSET+(7*8)
  78.     DI
  79.     JMP RAM+15H
  80.  
  81. DERR:    LXI H,DERM    ;GIVE "DISK ERROR" MESSAGE
  82. ERROR:    CALL MSG
  83. BOOT:
  84. SIZE:    LXI H,0C000H    ;FIRST DEVICE ADDRESS
  85.     MVI A,55H    ;ALTERNATING 1'S AND 0'S
  86. SIZE1:    DCX H        ;DECREMENT TO NEXT LOC
  87.     MOV M,A        ;STORE BYTE IN MEMORY
  88.     CMP M        ;CAN READ IT BACK ?
  89.     JNZ SIZE1    ;NO, CONTINUE
  90.     SPHL        ;YES, SET STACK PTR TO TOP OF MEMORY
  91.  
  92.     LDA 0DF00H    ;CHECK FOR POWER LOW
  93.     ANI 8
  94.     JNZ LOW        ;YES, GIVE ERROR
  95.  
  96. GETN:    LXI H,PROMPT    ;TYPE "FILENAME ? "
  97.     CALL MSG
  98.     LXI H,FBUF    ;INITIALIZE GET POINTER
  99.     MVI C,6        ;INITIALIZE GET COUNT
  100. GETN1:    CALL TTYIN    ;GET CHAR FROM KEYBOARD
  101.     CALL TTYOU    ;ECHO IT
  102.     CPI 177Q    ;RUBOUT
  103.     JZ BOOT
  104.     CPI 15Q        ;CR
  105.     JZ GETN2
  106.     MOV M,A        ;STORE CHAR IN FILENAME BUFFER
  107.     INX H
  108.     DCR C        ;6 CHARS YET ?
  109.     JNZ GETN1    ;NO
  110.     MVI A,15Q    ;YES, OUTPUT AT CR
  111.     CALL TTYOU
  112. GETN2:    MVI A,12Q    ;OUTPUT A LF
  113.     CALL TTYOU
  114.     MOV A,C        ;ONLY CR TYPED ?
  115.     CPI 6
  116.     JZ RAM        ;YES, JMP TO 1ST RAM LOCATION
  117.     MVI M,0        ;NO, STORE NULL AT END OF NAME
  118.  
  119. SEARCH:    LXI H,0        ;READ IN DIRECTORY
  120.     LXI D,DBUF
  121.     LXI B,1
  122.     CALL DSKIN
  123.     JNZ DERR    ;ERROR
  124.  
  125.     LXI H,DBUF    ;START OF DIRECTORY
  126. SRCH1:    SHLD DIRP    ;SET DIRECTORY POINTER
  127.     MOV A,M        ;END OF DIRECTORY ?
  128.     INX H
  129.     ORA M
  130.     JZ BOOT        ;YES, ASK FOR ANOTHER NAME
  131.  
  132. MATCH:    MVI C,6        ;MATCH 6 CHARS MAX
  133.     LHLD DIRP    ;POINTER TO DIRECTORY ENTRY
  134.     LXI D,FBUF    ;POINTER TO FILENAME BUFFER
  135. MTCH1:    LDAX D        ;COMPARE NEXT CHAR OF NAMES
  136.     CMP M
  137.     INX D
  138.     INX H
  139.     JNZ SRCH2    ;MISMATCH, TRY NEXT DIRECTORY ENTRY
  140.     ORA A
  141.     JZ FOUND    ;NULL, FOUND A MATCH
  142.     DCR C        ;DONE ?
  143.     JZ FOUND    ;YES, FOUND A MATCH
  144.     JMP MTCH1    ;KEEP CHECKING
  145.  
  146. SRCH2:    LHLD DIRP    ;INCREMENT DIRECTORY POINTER TO NEXT ENTRY
  147.     LXI D,8
  148.     DAD D
  149.     SHLD DIRP
  150.     JMP SRCH1    ;CHECK NEXT ENTRY
  151.  
  152. FOUND:    LHLD DIRP    ;POINTER TO DIRECTORY ENTRY
  153.     LXI D,6        ;GET FIRST BLOCK #
  154.     DAD D
  155.     MOV E,M
  156.     INX H
  157.     MOV D,M
  158.     XCHG
  159.     SHLD FBLK    ;SAVE IT
  160.  
  161.     LHLD DIRP    ;POINTER TO DIRECTORY ENTRY
  162.     LXI D,14    ;GET LAST BLOCK #
  163.     DAD D
  164.     MOV E,M
  165.     INX H
  166.     MOV D,M
  167.  
  168.     LHLD FBLK    ;SUBTRACT FIRST BLOCK #
  169.     MOV A,H
  170.     CMA
  171.     MOV H,A
  172.     MOV A,L
  173.     CMA
  174.     MOV L,A
  175.     DAD D
  176.     SHLD NBLKS    ;SAVE RESULT
  177.  
  178.     LHLD FBLK    ;READ 1ST BLOCK OF FILE
  179.     LXI D,DBUF
  180.     LXI B,1
  181.     CALL DSKIN
  182.     JNZ DERR    ;ERROR
  183.  
  184.     LHLD NBLKS    ;GET LENGTH OF FILE
  185.     MOV C,L        ;MOVE IT INTO BC
  186.     MOV B,H
  187.     LHLD DBUF+2    ;PUSH START ADDR ON STACK
  188.     PUSH H
  189.     LHLD DBUF    ;LOAD ADDR IN DE
  190.     XCHG
  191.     LHLD FBLK    ;FIRST BLOCK # IN HL
  192.     INX H
  193.     CALL DSKIN    ;READ PROGRAM
  194.     JNZ DERR    ;ERROR
  195.     RET        ;START PROGRAM
  196.  
  197. LOW:    LXI H,LOWM
  198.     JMP ERROR
  199.  
  200. PROMPT:    DB 15Q,12Q,'FILENAME ? ',0
  201. DERM:    DB 15Q,12Q,'DISK ERROR',0
  202. LOWM:    DB 15Q,12Q,'POWER LOW',0
  203.  
  204. DSKIN:    MOV A,H        ;GET UNIT #
  205.     RAR
  206.     ANI 0FH
  207.     STA DSKCR    ;SELECT UNIT
  208.  
  209. DSKI1:    MOV A,B        ;DONE ?
  210.     ORA C
  211.     RZ        ;YES, RETURN WITH A = 0
  212.  
  213.     MVI A,MAXRT    ;SET RETRY COUNTER
  214. DSKI3:    PUSH PSW
  215.  
  216.     SHLD DSKBL    ;SET BLOCK #
  217.     XCHG
  218.     SHLD DSKAD    ;SET BUFFER ADDR
  219.     XCHG
  220.     MOV A,H        ;GET UNIT #
  221.     RAR
  222.     ANI 0FH
  223.     ADI 20H        ;READ
  224.     STA DSKCR    ;START TRANSFER
  225.  
  226. DSKI2:    LDA DSKST    ;GET STATUS
  227.     ANI 80H        ;DONE ?
  228.     JZ DSKI2    ;NO
  229.  
  230.     LDA DSKST    ;GET STATUS
  231.     ANI 1        ;ERROR ?
  232.     JZ DSKI4    ;NO
  233.  
  234.     POP PSW        ;YES, GET RETRY COUNTER
  235.     DCR A
  236.     JNZ DSKI3    ;TRY AGAIN
  237.     INR A        ;RETURN WITH A = 1
  238.     RET
  239.  
  240. DSKI4:    POP PSW        ;FLUSH RETRY COUNTER
  241.     INX H        ;INCREMENT BLOCK #
  242.     PUSH H        ;INCREMENT BUFFER ADDR BY BLOCK SIZE
  243.     LXI H,BSIZE
  244.     DAD D
  245.     XCHG
  246.     POP H
  247.     DCX B        ;DECREMENT BLOCK COUNT
  248.     JMP DSKI1    ;READ SOME MORE
  249.  
  250. DSKOU:    MOV A,H        ;GET UNIT #
  251.     RAR
  252.     ANI 0FH
  253.     STA DSKCR    ;SELECT UNIT
  254.     LDA DSKST    ;GET STATUS
  255.     ANI 4
  256.     RNZ        ;WRITE PROTECTED, RETURN WITH A = 4
  257.  
  258. DSKO1:    MOV A,B        ;DONE ?
  259.     ORA C
  260.     RZ        ;YES, RETURN WITH A = 0
  261.  
  262.     MVI A,MAXRT    ;SET RETRY COUNTER
  263. DSKO3:    PUSH PSW
  264.  
  265.     SHLD DSKBL    ;SET BLOCK #
  266.     XCHG
  267.     SHLD DSKAD    ;SET BUFFER ADDR
  268.     XCHG
  269.     MOV A,H        ;GET UNIT #
  270.     RAR
  271.     ANI 0FH
  272.     ADI 40H        ;WRITE
  273.     STA DSKCR    ;START TRANSFER
  274.  
  275. DSKO2:    LDA DSKST    ;GET STATUS
  276.     ANI 80H        ;DONE ?
  277.     JZ DSKO2    ;NO
  278.  
  279.     LDA DSKST    ;GET STATUS
  280.     ANI 1        ;ERROR ?
  281.     JZ DSKO4    ;NO
  282.  
  283.     POP PSW        ;YES, GET RETRY COUNTER
  284.     DCR A
  285.     JNZ DSKO3    ;TRY AGAIN
  286.     INR A        ;RETURN WITH A = 1
  287.     RET
  288.  
  289. DSKO4:    POP PSW        ;FLUSH RETRY COUNTER
  290.     INX H        ;INCREMENT BLOCK #
  291.     PUSH H        ;INCREMENT BUFFER ADDR BY BLOCK SIZE
  292.     LXI H,BSIZE
  293.     DAD D
  294.     XCHG
  295.     POP H
  296.     DCX B        ;DECREMENT BLOCK COUNT
  297.     JMP DSKO1    ;READ SOME MORE
  298.  
  299. ;GET CHAR FROM TTY
  300. TTYIN:    LDA TTYISR
  301.     ORA A
  302.     JP TTYIN
  303.     LDA TTYIDR
  304.     ANI 177Q
  305.     RET
  306.  
  307. ;TYPE A CHARACTER ON TTY
  308. TTYOU:    PUSH PSW
  309. TTYO1:    LDA TTYOSR
  310.     ORA A
  311.     JP TTYO1
  312.     POP PSW
  313.     STA TTYODR
  314.     RET
  315.  
  316. ;TYPE A MESSAGE ON TTY
  317. MSG:    MOV A,M
  318.     INX H
  319.     ORA A
  320.     RZ
  321.     CALL TTYOU
  322.     JMP MSG
  323.  
  324. ;ENTRY POINTS FOR KERNEL
  325.     ORG OFFSET+512-12
  326.     JMP TTYIN    ;TTYIN
  327.     JMP TTYOU    ;TTYOU
  328.     JMP DSKIN    ;DSKIN
  329.     JMP DSKOU    ;DSKOU
  330.  
  331.     END
  332.  
  333.  
  334.  
  335. ***EOF***
  336.  
  337.  
  338.