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 / CPM / NSTAR / GENSYS32.ASM < prev    next >
Assembly Source File  |  2000-06-30  |  24KB  |  1,132 lines

  1.  
  2. ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  3. ;
  4. ;        GENESYS version 3.2 - July 18, 1981
  5. ;               r. l. plouffe
  6. ;        for use with cp/m 1.45, 2.0x, or 2.2x
  7. ;        on north star with lifeboat bios
  8. ;
  9. ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  10. ;
  11. ;    This is a version of SYSGEN that runs above the
  12. ; sysgen image of cp/m, thus permitting the first four
  13. ; north star sectors to contain code for an expanded user
  14. ; area.  To use this feature, the cold boot loader must
  15. ; be modified to load code from ccp-900H. This version of
  16. ; GENESYS patches in a complete new cold boot loader that
  17. ; accomplishes this function into the sysgen image prior to
  18. ; writing to either a CPM.xx file or to the system tracks.
  19. ; The new loader reads all 10 sectors of the system tracks
  20. ; except that it skips sector 4 on track 1 since that sector
  21. ; is read in by the boot prom. The init routine which you put
  22. ; in user1 should run at ccp-900H and move the user2 code
  23. ; to a location just above the running cp/m. A special org
  24. ; must be contained at the portion of init that runs at
  25. ; ccp-900h so that the lifeboat format byte will be present
  26. ; at 05CH above ccp-900H since that code will be resident
  27. ; at sector 0, track 1 of the north star disk where it is
  28. ; tested by the lifeboat bios for reading or writing of files
  29. ; so that the skew factor will be correct. GENEUSER.ASM which
  30. ; is also on this disk will do all of the above and provides
  31. ; general user code for 1.45, 2.0 and 2.2 including t102 clock,
  32. ; pmmi modem, and north star parity error routines as well.
  33. ;    The program reads the format of the destination
  34. ; drive and changes the format byte found on the source
  35. ; drive so that the destination drive format remains
  36. ; unchanged after being written to with the 'sysgened' cp/m.
  37. ; Thus neither drive is changed in format so far as files
  38. ; are concerned after using GENESYS.
  39. ;
  40. ;
  41. BDOS    EQU    0005H        ;jmp to bdos function calls
  42. BIOSV    EQU    0001H        ;bios warm boot vector
  43. CR    EQU    0DH        ;carriage return
  44. LF    EQU    0AH        ;line feed
  45. TAB    EQU    09H        ;tab function
  46. BELL    EQU    07H        ;ding
  47. ;
  48. FCB    EQU    005CH        ;address of FCB
  49. FRSTCHAR EQU    005DH        ;addr of 1rst char in FCB
  50. CURREC    EQU    007CH        ;addr of curr record #
  51. SYSIMG    EQU    0100H        ;cp/m sysgen image
  52. SEC0IMG    EQU    0080H        ;sector 0 image
  53. DMAINCR    EQU    0080H        ;dma increment amount
  54. ;
  55. ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  56. ;
  57. ; Routine for moving the whole program beginning with START
  58. ; to just above the 'sysgen' image of cp/m so that the space
  59. ; from 100H to 8FFH will be available for init and user2 code
  60. ; for storage on sectors 0-3 of track 1 on the north star disk.
  61. ; If any code after START is added/changed, the address labels
  62. ; must be followed by EQU    $+BIAS.
  63. ;
  64. DEST    EQU    2D00H        ;running location of genesys
  65. ;
  66.     ORG    SYSIMG
  67. ;
  68.     LXI    B,PEND1-SOURCE1
  69.     LXI    H,DEST2+PEND1-SOURCE1
  70.     LXI    D,SOURCE2+PEND1-SOURCE1-1
  71.     CALL    MOVEIT
  72.     LXI    B,PEND-START        ;# of bytes to move
  73.     LXI    H,DEST+PEND-START    ;end of moved code
  74.     LXI    D,SOURCE-START+PEND-1    ;end of source code
  75.     CALL    MOVEIT
  76.     PCHL
  77. ;
  78. MOVEIT:    LDAX    D        ;get byte
  79.     DCX    H        ;bump pointers
  80.     MOV    M,A        ;new home
  81.     DCX    D
  82.     DCX    B        ;bump byte count
  83.     MOV    A,B        ;check if zero
  84.     ORA    C
  85.     JNZ    MOVEIT        ;if not, keep moving
  86.     RET            ;jump to start
  87. ;
  88. SOURCE    EQU    $        ;boundary memory marker
  89. ;
  90. BIAS    EQU    DEST-SOURCE    ;relocation amount
  91. ;
  92. ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  93. ;
  94. ; The beginning of it all.
  95. ;
  96. ;
  97. START:    EQU    $+BIAS        ; 
  98.     LXI    SP,STACK    ;point to new stack
  99.     LXI    D,SIGNON    ;give signon message
  100.     CALL    PRNMSG        ;to the console
  101.     CALL    SKWGEN        ;write the skew table
  102.     LDA    FRSTCHAR
  103.     CPI    20H
  104.     JZ    NOFILE        ;
  105.     LXI    D,FCB
  106.     CALL    OPEN        ;
  107.     INR    A
  108.     JNZ    OPENOK        ;
  109.     LXI    D,NOFILMSG    ;say no source file
  110.     CALL    PRNMSG        ;to the console
  111.     JMP    EXIT        ;
  112. ;
  113. OPENOK:    EQU    $+BIAS        ; 
  114.     XRA    A
  115.     STA    CURREC
  116.     MVI    C,50H        ;# of cp/m sectors in file
  117. ;
  118. CHKFIL:    EQU    $+BIAS        ;this loop checks for bad file
  119.     PUSH    B
  120.     LXI    D,FCB
  121.     CALL    SEQRD        ;read sequential
  122.     ORA    A
  123.     POP    B
  124.     JNZ    BADFILE        ;if 0, say  incomplete
  125.     DCR    C
  126.     JNZ    CHKFIL        ;if not done, get another sec.
  127. ; initialize current record buffer and set dma to sys image
  128.     XRA    A
  129.     STA    CURREC        ;set current record to 0
  130.     LXI    H,SYSIMG    ;initial dma
  131. ; now read all sectors of the file to ram at sys image
  132. RDFILE:    EQU    $+BIAS        ; 
  133.     PUSH    H
  134.     MOV    B,H        ;set dma address
  135.     MOV    C,L
  136.     CALL    DMASET
  137.     LXI    D,FCB
  138.     CALL    SEQRD        ;read sequential to dma
  139.     POP    H
  140.     ORA    A
  141.     JNZ    IMGRDY        ;
  142.     LXI    D,DMAINCR
  143.     DAD    D
  144.     JMP    RDFILE        ;
  145. ;
  146. BADFILE:EQU    $+BIAS        ; 
  147.     LXI    D,INCMPMSG    ;say source file incomplete
  148.     CALL    PRNMSG        ;to the console
  149.     JMP    EXIT        ;
  150. ; if no file in command line, get sys from selected drive
  151. NOFILE:    EQU    $+BIAS        ; 
  152.     LXI    D,SRCNAME    ;ask for source drive name
  153.     CALL    PRNMSG        ;at the console
  154.     CALL    CONIN        ;read the console buffer
  155.     SUI    41H
  156.     CPI    4
  157.     JC    FROM        ;
  158.     CALL    BADNAME        ;
  159.     JMP    NOFILE        ;
  160. ;
  161. FROM:    EQU    $+BIAS        ; 
  162.     STA    CURRDRV        ;
  163.     ADI    41H        ;convert to alpha
  164.     STA    SRCDRV        ;
  165.     LXI    D,SRCMSG    ;say to place source disk
  166.     CALL    PRNMSG        ;to the console
  167.     CALL    CONIN        ;
  168.     CPI    0DH
  169.     JNZ    EXIT        ;
  170.     CALL    CRLF        ;
  171.     XRA    A
  172.     STA    RDWRFLG        ;set flag to read
  173.     CALL    RDWRSYS        ;
  174. ;
  175. IMGRDY:    EQU    $+BIAS        ; 
  176.     LDA    900H        ;get hi byte of cold loader org
  177.     SUI    34H        ;get the difference
  178.     MOV    C,A        ;store in C for a while
  179.     LXI    H,CLDBTABL    ;point to addresses of bytes in
  180.                 ;cold loader that need to be changed
  181. CHNGCLDBT:EQU    $+BIAS
  182.     MOV    E,M
  183.     INX    H
  184.     MOV    D,M
  185.     MOV    A,M
  186.     ORA    E
  187.     JZ    MOVER
  188.     LDAX    D
  189.     ADD    C
  190.     STAX    D
  191.     INX    H
  192.     JMP    CHNGCLDBT
  193. ; now patch the cold boot loader into the system image
  194. ;
  195.     DEST1    EQU    0907H
  196. ;
  197. MOVER:    EQU    $+BIAS
  198.     LXI    B,PEND1-SOURCE1
  199.     LXI    H,DEST1+PEND1-SOURCE1
  200.     LXI    D,PEND1-1
  201. MOVCONT:EQU    $+BIAS 
  202.     LDAX    D
  203.     DCX    H
  204.     MOV    M,A
  205.     DCX    D
  206.     DCX    B
  207.     MOV    A,B
  208.     ORA    C
  209.     JNZ    MOVCONT
  210. ;now test and patch for bugs in the various versions
  211.     LDA    1201H        ;get version
  212.     LHLD    900H-1        ;get hi byte of cldbt addr.
  213.     MVI    L,0CH        ;addr in cldbt page to patch
  214.     CPI    20H        ;see if 2.0x
  215.     JNZ    TST22        ;if not, see if it's 2.2
  216.     SHLD    26BFH        ;replace in patch table
  217. TST22:    EQU    $+BIAS
  218.     CPI    22H        ;see if 2.2
  219.     JNZ    TST14        ;if not, see if it's 1.4
  220.     LDA    1511H        ;
  221.     CPI    01H        ;see if it's 2.21A
  222.     JZ    TST14        ;if so, don't patch
  223.     CPI    0CCH        ;see if it's 2.22
  224.     JZ    SKP221
  225.     SHLD    151BH        ;replace in patch table
  226.     ORA    A        ;clear status
  227. TST14:    EQU    $+BIAS
  228.     CZ    FIX221A        ;fix if 221A
  229. SKP221:    EQU    $+BIAS
  230.     MOV    A,H        ;get hi byte of cldbt addr.
  231.     ADI    24H        ;make it hi byte of sys size
  232.     MOV    B,A        ;save for a while
  233.     LDA    1201H        ;get version
  234.     CPI    0EH        ;see if 1.45
  235.     JNZ    RSTCNT        ;if not jmp to reset counter
  236.     MOV    A,B        ;get hi byte of sys size
  237.     SUI    0AH        ;make it hi byte of bios last blk
  238.     MOV    H,A        ;put in H
  239.     MVI    L,0F7H        ;addr in bios last pg to patch
  240.     SHLD    1E6CH        ;put in bdos patch table
  241.     XRA    A        ;zero A
  242.     STA    0906H        ;patch coldboot loader
  243.     MOV    A,B        ;get hi byte of sys size again
  244.     SUI    0CH        ;to make compatible w/1.45 sizing
  245.     MOV    B,A        ;save in B
  246. ; now calculate the system size and store in SAVE prompt
  247. RSTCNT:    EQU    $+BIAS
  248.     LXI    H,3030H        ;set to say 00
  249.     SHLD    FILNAM+3    ;tens digit
  250. SYSSIZ:    EQU    $+BIAS
  251.     LXI    H,FILNAM+4    ;units digit
  252.     INR    M        ;increment it
  253.     MOV    A,M        ;to acc.
  254.     CPI    3AH        ;overflow of units?
  255.     JC    SYSSIZ1        ;
  256.     MVI    M,30H        ;reset units digit
  257.     DCX    H        ;go to tens digit
  258.     INR    M        ;increment it
  259. SYSSIZ1:EQU    $+BIAS
  260.     DCR    B
  261.     DCR    B
  262.     DCR    B
  263.     DCR    B
  264.     JNZ    SYSSIZ        ;count more if not done
  265. ; now patch the image for cp/m version
  266.     LDA    900H        ;get the msb of booter
  267.     MOV    B,A        ;store in B for a while
  268.     LDA    1201H        ;get the cp/m version #
  269.     CPI    0EH        ;see if version 1.45
  270.     LXI    D,ONEFOUR    ;point to image addresses
  271.     JZ    PATCHER        ;if so jump to patch routine
  272.     CPI    20H        ;see if version 2.0x
  273.     LXI    D,TWOZERO    ;point to image addresses
  274.     JZ    PATCHER        ;if so jump to patch routine
  275.     CPI    22H        ;see if version 2.2x
  276.     LXI    D,TWOTWO    ;point to image addresses
  277.     JZ    PATCHER        ;if so jump to patch routine
  278.     JMP    BADVERS        ;if none of the above,say sorry
  279. PATCHER:EQU    $+BIAS
  280.     LXI    H,INIT+7-BIAS1+100H ;get patch location in booter
  281.     CALL    PATCH        ;patch it
  282.     LXI    H,BOOT+9-BIAS1+100H
  283.     CALL    PATCH
  284.     LXI    H,BOOT+6-BIAS1+100H
  285.     CALL    PATCH        
  286.     LXI    D,IMG0100    ;say cp/m image ready
  287.     CALL    PRNMSG        ;to the console
  288. ; now put the sys image to a selected drive
  289. DESTDR:    EQU    $+BIAS        ; 
  290.     LXI    D,TODRV        ;ask for destination drive name
  291.     CALL    PRNMSG        ;at the console
  292.     CALL    CONIN        ;read the console buffer
  293.     CPI    0DH        ;done?
  294.     JZ    EXIT        ;
  295.     SUI    41H
  296.     CPI    4
  297.     JC    DESTDRV        ;
  298.     CALL    BADNAME        ;
  299.     JMP    DESTDR        ;
  300. ;
  301. FIX221A:EQU    $+BIAS
  302.     MOV    A,H        ;get hi byte of cldbt addr
  303.     MVI    L,0F2H        ;byte to fix
  304.     SHLD    153DH        ;add to patch table
  305.     XRA    A        ;A=0
  306.     STA    247AH        ;remove stack unbalance so that
  307.                 ;read-after-write bit can be set
  308.                 ;in the MODE byte. otherwise, bug
  309.     RET
  310. ;
  311. PATCH:    EQU    $+BIAS
  312.     LDAX    D        ;lsb
  313.     MOV    M,A        ;patch it
  314.     INX    H
  315.     INX    D
  316.     LDAX    D        ;msb
  317.     ADD    B        ;add hi byte of booter
  318.     SUI    09H        ;convert to hi byte of addr
  319.     MOV    M,A        ;patch it
  320.     INX    D
  321.     RET
  322. ;
  323. DESTDRV:EQU    $+BIAS        ; 
  324.     STA    CURRDRV        ;
  325.     ADI    41H
  326.     STA    DSTDR        ;
  327. ; read the first sector (with 10 retries) of dest drive
  328. ; and get format byte to store in system image
  329.     XRA    A        ;zero the retry count
  330.     STA    RETRY        ;put in retry counter buff.
  331. X10TRY:    EQU    $+BIAS
  332.     LDA    CURRDRV        ;get current drive no.
  333.     MOV    C,A        ;
  334.     CALL    DSKSEL        ;select the drive
  335.     MVI    C,0
  336.     CALL    TRKSET        ;set to track 0
  337.     LXI    B,1        ;
  338.     CALL    SECSET        ;set to sector 1
  339.     LXI    B,SEC0IMG    ;dma
  340.     CALL    DMASET        ;set dma to SEC0IMG
  341.     LDA    RETRY        ;get retry count
  342.     CPI    0AH        ;allow 10 of them
  343.     JC    REPEAT        ;increment and read
  344. ERROR:    EQU    $+BIAS
  345.     LXI    D,PERMERR    ;point to error msg
  346.     CALL    PRNSTR        ;send it to console
  347.     JMP    EXIT        ;back to cp/m
  348. ;
  349. REPEAT:    EQU    $+BIAS
  350.     INR    A        ;bump retry counter
  351.     STA    RETRY        ;
  352.     CALL    SECRD        ;read first sector to 80h
  353.     ORA    A        ;bad read?
  354.     JNZ    X10TRY        ;if so, try again
  355. ;
  356. TINU:    EQU    $+BIAS
  357. ; now get the format byte from dest drive 1rst sector image
  358.     LDA    00DCH        ;get dest drive format
  359. ; put format byte in system image
  360.     STA    015CH        ;store it in the sys image
  361.     LXI    D,DESTMSG    ;say to place dest disk
  362.     CALL    PRNMSG        ;at the console
  363.     CALL    CONIN        ;
  364.     CPI    0DH        ;return key?
  365.     JZ    WRSYS        ;
  366.     CPI    20H        ;space bar?
  367.     JZ    WRFILE        ;if so, write sys to a file
  368.     JMP    EXIT        ;exit to cp/m if any other key
  369. ;
  370. WRSYS:    EQU    $+BIAS
  371.     CALL    CRLF        ;send cr,lf to console
  372.     LXI    D,SYSMSG
  373.     CALL    PRNMSG
  374.     LXI    H,RDWRFLG    ;point to rd/wr flag buffer
  375.     MVI    M,1        ;set it for write operations
  376.     CALL    RDWRSYS        ;
  377. DONE:    EQU    $+BIAS
  378.     LXI    D,FDONE        ;say function complete
  379.     CALL    PRNSTR        ;to the console
  380.     JMP    DESTDR        ;want another drive?
  381. ;
  382. BADVERS:EQU    $+BIAS
  383.     LXI    D,SORRY
  384.     CALL    PRNSTR
  385.     HLT
  386. ;
  387. EXIT:    EQU    $+BIAS        ; 
  388.     MVI    C,0
  389.     CALL    DSKSEL        ;select drive A
  390.     CALL    CRLF        ;output a cr,lf sequence
  391.     JMP    0        ;return to cp/m
  392. ;
  393. BADNAME:EQU    $+BIAS        ; 
  394.     LXI    D,INVLDR    ;say invalid drive name
  395.     CALL    PRNMSG        ;to the console
  396.     RET
  397. ;
  398. BADOPEN:EQU    $+BIAS
  399.     LXI    D,NOOPEN    ;say cant open the file
  400.     CALL    PRNMSG        ;to the console
  401.     JMP    EXIT        ;back to cp/m
  402. ;
  403. BADWR:    EQU    $+BIAS
  404.     LXI    D,WRBAD        ;say bad write operation
  405.     CALL    PRNMSG
  406.     JMP    EXIT
  407. ;
  408. WRFILE:    EQU    $+BIAS
  409.     CALL    CRLF
  410.     ;
  411.     MVI    B,14
  412.     LXI    D,FILNAM
  413.     LXI    H,FRSTCHAR
  414. OVER:    EQU    $+BIAS
  415.     LDAX    D
  416.     MOV    M,A
  417.     INX    H
  418.     INX    D
  419.     DCR    B
  420.     JNZ    OVER
  421.     XRA    A
  422.     STA    FCB
  423.     STA    CURREC
  424.     ;
  425.     MVI    C,SELDRV
  426.     LDA    CURRDRV
  427.     MOV    E,A
  428.     CALL    BDOS
  429.     ;
  430.     LXI    D,FCB
  431.     MVI    C,FILDEL
  432.     CALL    BDOS
  433.     LXI    D,FCB
  434.     MVI    C,FILMAK
  435.     CALL    BDOS
  436.     INR    A
  437.     JZ    BADOPEN
  438.     LXI    D,FILMSG
  439.     CALL    PRNMSG
  440.     LXI    H,SYSIMG    ;start of system image
  441. WRFIL:    EQU    $+BIAS    
  442.     PUSH    H
  443.     XCHG
  444.     CALL    BUFSET
  445.     LXI    D,FCB
  446.     MVI    C,WRSEQ
  447.     CALL    BDOS
  448.     POP    H
  449.     ORA    A
  450.     JNZ    BADWR        ;say bad write
  451.     LXI    D,DMAINCR    ;increment dma by 80h
  452.     DAD    D
  453.     PUSH    H
  454.     MVI    A,50H        ;# of cp/m sectors
  455.     LXI    H,CURREC
  456.     CMP    M
  457.     POP    H
  458.     JZ    CLOSIT
  459.     JMP    WRFIL
  460. ;
  461. CLOSIT:    EQU    $+BIAS
  462.     LXI    D,FCB
  463.     MVI    C,CLOSFIL
  464.     CALL    BDOS
  465.     INR    A
  466.     JNZ    DONE
  467. ;
  468. BADCLOS:EQU    $+BIAS
  469.     LXI    D,NOCLOSE
  470.     CALL    PRNMSG
  471.     JMP    EXIT
  472. ;
  473. SORRY:    EQU    $+BIAS
  474.     DB    CR,LF,TAB,'SORRY, BAD'
  475.     DB    ' VERSION OF CP/M',BELL,'$'
  476. ;
  477. ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  478. ;
  479. ; Routines for selecting drive, track, sector and setting of
  480. ; disk memory access address when reading or writing sys trks.
  481. ; Module provides for up to 10 tries at read or write
  482. ; and gives an error message if errors are detected.
  483. ;
  484. RDWRSYS:EQU    $+BIAS    ; 
  485. ; select which drive
  486.     LDA    CURRDRV        ;get current disk number
  487.     MOV    C,A
  488.     CALL    DSKSEL        ;select disk
  489. ; initialize dma address
  490.     LXI    H,SYSIMG        ;start of cp/m image
  491.     SHLD    IMGADR        ;current image addr buffer
  492. ; initialize current track buffer
  493.     MVI    A,0FFH        ;track zero-1
  494.     STA    TRKBUF        ;current track buffer
  495. ; initialize skew pointer to first entry in skew table
  496.     LXI    H,SKWTBL    ;point to skew table
  497.     SHLD    SKWPTR        ;put in skew pointer buffer
  498. ; now set the track number
  499. ;
  500. TRAKSET:EQU    $+BIAS        ; 
  501.     LXI    H,TRKBUF    ;get previous track #
  502.     INR    M        ;advance track #
  503.     MVI    A,2        ;get # of system tracks
  504.     CMP    M        ;see if done
  505.     RZ            ;if so, return
  506.     LXI    H,TRKBUF    ;get track number
  507.     MOV    C,M
  508.     CALL    TRKSET        ;set track number
  509. ;
  510. ; initialize sector number to zero
  511.     XRA    A        ;zero the accumulator
  512.     STA    SECBUF        ;sector number buffer
  513. ; now set sector and dma in accordance with skew table
  514. SCTRSET:EQU    $+BIAS        ; 
  515.     MVI    A,28H        ;get # of sectors/track
  516.     LXI    H,SECBUF    ;get current sector number
  517.     CMP    M        ;see if done
  518.     JZ    ADJDMA        ;
  519.     INR    M        ;advance sector number
  520.     LDA    TRKBUF        ;get current track #
  521.     ORA    A
  522.     JNZ    SCTR        ;
  523.     LDA    SECBUF        ;get sector #
  524.     MOV    E,A
  525.     MVI    D,0
  526.     LHLD    SKWPTR        ;get skew pointer
  527.     DCX    H
  528.     DAD    D
  529.     MOV    A,M
  530.     CPI    1H
  531.     JC    SCTRSET        ;
  532. SCTR:    EQU    $+BIAS        ; 
  533.     LXI    H,SECBUF    ;point to sector # buffer
  534.     MOV    E,M        ;store sector # in DE pair
  535.     MVI    D,0
  536.     LHLD    SKWPTR        ;get skew pointer
  537.     MOV    B,M
  538.     DCX    H
  539.     DAD    D
  540.     MOV    C,M
  541.     PUSH    B
  542.     CALL    SECSET        ;set sector 
  543.     POP    B
  544.     MOV    A,C
  545.     SUB    B
  546.     CALL    X128        ;
  547.     XCHG
  548.     LHLD    IMGADR        ;get current image address
  549.     DAD    D
  550.     MOV    B,H
  551.     MOV    C,L
  552.     CALL    DMASET        ;set dma address
  553. ;
  554. ; set read/write retry counter to zero
  555.     XRA    A
  556.     STA    RETRY        ;set re-try counter to 0
  557. ; now read or write up to 10 times until no error is detected
  558. TRYX10:    EQU    $+BIAS        ; 
  559.     LDA    RETRY        ;get re-try count
  560.     CPI    0AH        ;allow 10 of them
  561.     JC    RDWRTRY        ;
  562.     LXI    D,PERMERR    ;say permanent error
  563.     CALL    PRNSTR        ;to the console
  564.     CALL    CONIN        ;
  565.     CPI    0DH
  566.     JNZ    EXIT        ;
  567.     CALL    CRLF        ;
  568.     JMP    SCTRSET        ;
  569. RDWRTRY:EQU    $+BIAS        ; 
  570.     INR    A
  571.     STA    RETRY        ;bump re-try counter
  572.     LDA    RDWRFLG        ;see if read or write
  573.     ORA    A
  574.     JZ    READIT        ;if zero, then read
  575.     CALL    SECWR        ;write sector
  576.     JMP    ERRCHK        ;
  577. ;
  578. READIT:    EQU    $+BIAS        ; 
  579.     CALL    SECRD        ;
  580. ;
  581. ERRCHK:    EQU    $+BIAS        ; 
  582.     ORA    A
  583.     JZ    SCTRSET        ;if zero, then do another sec
  584.     JMP    TRYX10        ;else try again
  585. ;
  586. ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  587. ;
  588. ; This routine multiplies sector number by 128 to adjust the
  589. ; current dma address.
  590. ;
  591. ADJDMA:    EQU    $+BIAS
  592.     MVI    A,28H        ;get # of sectors/track
  593.     CALL    X128        ;multiply by 128
  594.     XCHG
  595.     LHLD    IMGADR        ;get current image sddr
  596.     DAD    D        ;adjust it
  597.     SHLD    IMGADR        ;store it
  598.     JMP    TRAKSET
  599. X128:    EQU    $+BIAS        ; 
  600.     MOV    L,A
  601.     MVI    H,0
  602.     DAD    H
  603.     DAD    H
  604.     DAD    H
  605.     DAD    H
  606.     DAD    H
  607.     DAD    H
  608.     DAD    H
  609.     RET
  610. ;
  611. SKWGEN:    EQU    $+BIAS
  612.     LXI    H,SKWTBL
  613.     MVI    A,15H
  614.     ;
  615. SKWGEN1:EQU    $+BIAS
  616.     SUI    14H
  617.     CALL    FOURSEC
  618.     ADI    10H
  619.     CALL    FOURSEC
  620.     CPI    29H
  621.     JNZ    SKWGEN1
  622.     RET
  623.     ;
  624. FOURSEC:EQU    $+BIAS
  625.     MVI    C,4
  626. SKWWR:    EQU    $+BIAS
  627.     MOV    M,A
  628.     INX    H
  629.     INR    A
  630.     DCR    C
  631.     JNZ    SKWWR
  632.     RET
  633. ;
  634. ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  635. ;
  636. ; Routines for msg out to console.
  637. ;
  638. CRLF:    EQU    $+BIAS        ;get carriage ret, line feed
  639.     LXI    D,CRLFMSG    ;point to it
  640.     JMP    PRNSTR        ;send it to console
  641. ;
  642. CRLFMSG:EQU    $+BIAS        ;carriage ret, line feed
  643.     DB    CR,LF,'$'
  644. ;
  645. PRNMSG:    EQU    $+BIAS        ; 
  646.     PUSH    D
  647.     CALL    CRLF        ;get carriage ret, line feed
  648.     POP    D
  649. ; fall through to prnstr
  650. ;
  651. ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  652. ;
  653. ; BDOS and BIOS functions
  654. ;
  655. PRNSTR:    EQU    $+BIAS        ; 
  656.     MVI    C,PRTSTRG    ;print string to console
  657.     JMP    BDOS
  658. ;
  659. DSKSEL:    EQU    $+BIAS        ;
  660.     LHLD    BIOSV
  661.     LXI    D,SELDSK    ;select disk drive
  662.     DAD    D
  663.     PCHL
  664. ;
  665. TRKSET:    EQU    $+BIAS        ; 
  666.     PUSH    B
  667.     MVI    B,0        ;zero the B register
  668.     CALL    TRKSET1        ;set track number
  669.     POP    B
  670.     RET
  671. ;
  672. TRKSET1:EQU    $+BIAS        ; 
  673.     LHLD    BIOSV
  674.     LXI    D,SETTRK    ;set track number
  675.     DAD    D
  676.     PCHL
  677. ;
  678. SECSET:    EQU    $+BIAS        ; 
  679.     LHLD    BIOSV
  680.     LXI    D,SETSEC    ;set sector number
  681.     DAD    D
  682.     PCHL
  683. ;
  684. DMASET:    EQU    $+BIAS
  685.     LHLD    BIOSV
  686.     LXI    D,SETDMA    ;set disk memory address
  687.     DAD    D
  688.     PCHL
  689. ;
  690. SECRD:    EQU    $+BIAS        ; 
  691.     LHLD    BIOSV
  692.     LXI    D,RDSEC        ;read selected sector
  693.     DAD    D
  694.     PCHL
  695. ;
  696. SECWR:    EQU    $+BIAS        ; 
  697.     LHLD    BIOSV
  698.     LXI    D,WRSEC        ;write selected sector
  699.     DAD    D
  700.     PCHL
  701. ;
  702. SEQRD:    EQU    $+BIAS        ; 
  703.     MVI    C,RDSEQ        ;read next 128 bytes to dma
  704.     JMP    BDOS
  705. ;
  706. BUFSET:    EQU    $+BIAS
  707.     MVI    C,SETBUF    ;set the dma
  708.     JMP    BDOS
  709. ;
  710. OPEN:    EQU    $+BIAS        ; 
  711.     MVI    C,OPNFIL    ;open the file
  712.     JMP    BDOS
  713. ;
  714. CONIN:    EQU    $+BIAS
  715.     MVI    C,CONSIN    ;console input
  716.     CALL    BDOS
  717.     CPI    60H        ;convert to upper case
  718.     RC
  719.     CPI    7BH
  720.     RNC
  721.     ANI    5FH
  722.     RET
  723. ;
  724. ; Messages for the console
  725. ;
  726. SIGNON:    EQU    $+BIAS        ; 
  727.     DB    TAB,'GENESYS vers 3.2',CR,LF
  728.     DB    TAB,'for cp/m 1.45,2.01,2.2,2.21A or 2.22',CR,LF
  729.     DB    TAB,'on North Star DQ w/Lifeboat bios'
  730.     DB    CR,LF,TAB,'July 18, 1981',CR,LF,'$'
  731. ;
  732. SRCNAME:EQU    $+BIAS        ; 
  733.     DB    TAB,'Source drive NAME: $'
  734. ;
  735. SRCMSG:    EQU    $+BIAS        ; 
  736.     DB    TAB,'Put SOURCE disk on: '
  737. ;
  738. SRCDRV:    EQU    $+BIAS        ; 
  739.     DB    0,', & hit RETURN$'
  740. ;
  741. IMG0100:EQU    $+BIAS        ; 
  742.     DB    CR,LF,TAB,'CP/M image in RAM from 100H'
  743.     DB    ' to 2900H$'
  744. ;
  745.     
  746. TODRV:    EQU    $+BIAS        ; 
  747.     DB    CR,LF,TAB,'Destination drive NAME'
  748.     DB    CR,LF,TAB,'(or RETURN to reboot): $'
  749. ;
  750. DESTMSG:EQU    $+BIAS        ; 
  751.     DB    TAB,'Put DESTINATION disk on: '
  752. ;
  753. DSTDR:    EQU    $+BIAS        ; 
  754.     DB    0,CR,LF,CR,LF,TAB,'& hit RETURN to write'
  755.     DB    ' system'
  756.     DB    CR,LF,TAB,'or, hit SPACE bar to save '
  757. ;
  758. FILNAM:    EQU    $+BIAS
  759.     DB    'CPMxx   COM',0,0,0,'$'
  760. ;
  761. PERMERR:EQU    $+BIAS        ; 
  762.     DB    TAB,'Hard ERROR',BELL,'$'
  763. ;
  764. FDONE:    EQU    $+BIAS        ; 
  765.     DB    TAB,'Done',BELL,'$'
  766. ;
  767. INVLDR:    EQU    $+BIAS        ; 
  768.     DB    TAB,'Invalid, (Use A B C or D)$'
  769. ;
  770. NOFILMSG:EQU    $+BIAS        ;
  771.     DB    TAB,'No source file$' 
  772. ;
  773. INCMPMSG:EQU    $+BIAS        ;
  774.     DB    TAB,'Source file incomplete$'
  775. ;
  776. NOOPEN:    EQU    $+BIAS
  777.     DB    TAB,'Can`t open file$'
  778. ;
  779. WRBAD    EQU    $+BIAS
  780.     DB    TAB,'Bad write -full disk?$'
  781. ;
  782. NOCLOSE:EQU    $+BIAS
  783.     DB    TAB,'Can`t close file -write protected?$'
  784. ;
  785. SYSMSG:    EQU    $+BIAS
  786.     DB    TAB,'Writing cp/m system -wait-$'
  787. ;
  788. FILMSG    EQU    $+BIAS
  789.     DB    TAB,'Writing cp/m.com file -wait-$'
  790. ;
  791. ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  792. ;
  793. ; Tables
  794. ;
  795. CLDBTABL:EQU    $+BIAS
  796.     DW    STRT-1
  797.     DW    STRT+3
  798.     DW    STRT+7
  799.     DW    STRT+0AH
  800.     DW    TWOTRKS+7
  801.     DW    TWOTRKS+0DH
  802.     DW    STSECT+2
  803.     DW    STSECT+0BH
  804.     DW    STSECT+0EH
  805.     DW    RDENBL+5
  806.     DW    DELAY+3
  807.     DW    DELAY+8
  808.     DW    SYNCH+4
  809.     DW    SYNCH+8
  810.     DW    COUNT+6
  811.     DW    COUNT+0FH
  812.     DW    COUNT+12H
  813.     DW    HALT+2
  814.     DW    READSECS+2
  815.     DW    TWOBLKS+8
  816.     DW    TWOBLKS+0DH
  817.     DW    TWOBLKS+12H
  818.     DW    NEXTSEC+9
  819.     DW    NEXTSEC+0DH
  820.     DW    NEXTSEC+11H
  821.     DW    NEXTSEC+20H
  822.     DW    NEXTSEC+24H
  823.     DW    INIT+2
  824.     DW    CHNGBIOS+7
  825.     DW    CHNGBIOS+0EH
  826.     DW    BOOT+2
  827.     DW    ADVSEC+2
  828.     DW    ADVSEC+8
  829.     DW    DETSEC+4
  830.     DW    DETSEC+8
  831.     DW    DETSEC+0EH
  832.     DW    0000H        ;table scan terminator
  833. ;
  834. ONEFOUR:EQU    $+BIAS        ;table for version 1.45
  835.     DW    1E40H        ;promtabl
  836.     DW    1F00H        ;bios
  837.     DW    090CH        ;promhi
  838. ;
  839. TWOZERO:EQU    $+BIAS        ;table for version 2.0x
  840.     DW    26B5H        ;promtabl
  841.     DW    2000H        ;bios
  842.     DW    26F5H        ;promhi
  843. ;
  844. TWOTWO:    EQU    $+BIAS        ;table for version 2.2x
  845.     DW    1511H        ;promtabl
  846.     DW    2000H        ;bios
  847.     DW    26F5H        ;promhi
  848. ;
  849. PEND    EQU    $+BIAS
  850.     DS    DEST2-PEND
  851. ;
  852. ;
  853. ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  854. ;
  855. ; Bdos function call equates
  856. ;
  857. CONSIN    EQU    01H        ;console input
  858. RDSEQ    EQU    14H        ;read sequential
  859. WRSEQ    EQU    15H        ;write sequential
  860. SELDRV    EQU    0EH        ;select disk
  861. SETBUF    EQU    1AH        ;set dma
  862. OPNFIL    EQU    0FH        ;open file
  863. FILDEL    EQU    13H        ;delete file
  864. FILMAK    EQU    16H        ;make a file
  865. CLOSFIL    EQU    10H        ;close file
  866. PRTSTRG    EQU    09H        ;print string to console
  867. ;
  868. ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  869. ;
  870. ; Bios function call equates
  871. ;
  872. SELDSK    EQU    18H        ;select disk drive
  873. SETTRK    EQU    1BH        ;set track number
  874. SETSEC    EQU    1EH        ;set sector number
  875. SETDMA    EQU    21H        ;set disk memory address
  876. RDSEC    EQU    24H        ;read selected sector
  877. WRSEC    EQU    27H        ;write selected sector
  878. ;
  879. ;=============================================================
  880. ;
  881. ;        COLDBOOT LOADER FOR NORTH STAR
  882. ;
  883. ; WILL LOAD ALL SECTORS ON BOTH SYSTEM TRACKS TO RAM BEGINNING
  884. ; AT CCP-900H THUS GIVING A SECOND USER AREA OF UP TO 2KBYTES.
  885. ; THE SOFTWARE SKIPS READING OF SECTOR 4 ON TRACK 1 SINCE THAT
  886. ; SECTOR IS LOADED BY THE BOOTSTRAP PROM ON THE DISK CONTROLLER.
  887. ;
  888. ;            R. L. PLOUFFE
  889. ;              12/19/80
  890. ;
  891. ;=============================================================
  892. ;
  893. ORIG    EQU    0807H        ;
  894. PROM    EQU    0E800H        ;DISK CONTR PROM ADDRESS
  895.                 ;DO NOT CHANGE EVEN IF YOU HAVE
  896.                 ;RELOCATED YOUR PROM. THE COLD BOOT
  897.                 ;LOADER NEEDS THIS VALUE TO DETERMINE
  898.                 ;AMOUNT BY WHICH YOU HAVE MOVED YOUR
  899.                 ;PROM AND THEN PATCH ALL PROM DEPENDENT
  900.                 ;BYTES IN THE BIOS BY ADDING THE DIFF-
  901.                 ;ERENCE.
  902. USER2    EQU    ORIG-800H-7H    ;LOCATION OF 2ND USER AREA
  903. CMDMSB    EQU    (PROM+300H)/256    ;HI BYTE OF CONTROLLER COMMANDS
  904. DSKRD    EQU    40H        ;BYTE FOR READ COMMAND
  905. ASTAT    EQU    10H        ;LO BYTE FOR A STATUS MASK
  906. RSTSEC    EQU    11H        ;LO BYTE FOR RESET SECTOR COMMAND
  907. STEPIN    EQU    21H        ;LO BYTE FOR STEP-IN CMD, DR 1
  908. STEPIN1    EQU    31H        ;LSB FOR STEPIN,DR1,HEAD LOADED
  909. CMOTON    EQU    35H        ;MOTORS ON, GET C-STATUS
  910. RESET    EQU    07H        ;RESET CONTROLLER, DESELECT DRIVES
  911.                 ;AND STOP THE MOTORS
  912. DMA    EQU    USER2        ;BEGINNING RAM ADDRESS
  913. STACK1    EQU    USER2        ;STACK
  914. ;
  915. DEST2    EQU    DEST+707H
  916.     ORG    ORIG
  917. SOURCE2    EQU    $
  918. BIAS1    EQU    DEST2-SOURCE2
  919. SOURCE1    EQU    $+BIAS1
  920. ;
  921.     JMP    INIT
  922. STRT:    EQU    $+BIAS1
  923.     DI
  924.     LXI    SP,STACK1+BIAS1    
  925.     XCHG
  926.     SHLD    RDCMD    
  927.     LXI    H,DMA+BIAS1    
  928.     MVI    E,2
  929. TWOTRKS0:EQU    $+BIAS1
  930.     LXI    B,0A00H
  931. TWOTRKS:EQU    $+BIAS1
  932.     PUSH    H
  933.     PUSH    B
  934.     PUSH    D
  935.     MOV    A,E
  936.     DCR    A
  937.     JZ    READ
  938.     MOV    A,C
  939.     CPI    4
  940.     JZ    NEXTSEC
  941. READ:    EQU    $+BIAS1
  942.     PUSH    H
  943. STSECT:    EQU    $+BIAS1        
  944.     CALL    ONESEC
  945.     MVI    L,CMOTON    
  946.     MOV    A,M
  947.     ANI    0FH
  948.     CMP    C
  949.     JNZ    STSECT    
  950.     LHLD    RDCMD    
  951.     MVI    L,ASTAT
  952. RDENBL:    EQU    $+BIAS1        
  953.     MOV    A,M
  954.     ANI    4
  955.     JZ    RDENBL    
  956.     MVI    A,9
  957. DELAY:    EQU    $+BIAS1        
  958.     DCR    A
  959.     JNZ    DELAY    
  960.     MVI    B,8CH
  961.     LHLD    RDCMD    
  962.     MVI    L,ASTAT
  963. SYNCH:    EQU    $+BIAS1        
  964.     MOV    A,M
  965.     RRC
  966.     JC    READSECS    
  967.     DCR    B
  968.     JNZ    SYNCH    
  969. ;
  970. REBOOT:    EQU    $+BIAS1        
  971.     LXI    H,0FFFFH
  972. COUNT:    EQU    $+BIAS1
  973.     INX    H
  974.     MOV    A,M
  975.     CPI    76H
  976.     JZ    COUNT
  977.     MVI    A,76H
  978.     MOV    M,A
  979.     MOV    A,L
  980.     CPI    07H
  981.     JZ    HALT
  982.     LHLD    RDCMD
  983.     DCR    H
  984.     DCR    H
  985.     DCR    H
  986.     MVI    L,0
  987.     PCHL
  988. ;
  989. HALT:    EQU    $+BIAS1
  990.     LHLD    RDCMD
  991.     MVI    L,RESET        ;RESET THE DISK CONTROLLER
  992.     MOV    A,M        ;DO IT
  993.     HLT            ;STOP THE COMPUTER
  994. ;
  995. READSECS:EQU    $+BIAS1        
  996.     LHLD    RDCMD    
  997.     XCHG
  998.     POP    H
  999.     MVI    B,0
  1000.     MVI    L,0
  1001.     MVI    C,2
  1002. TWOBLKS:EQU    $+BIAS1        
  1003.     LDAX    D
  1004.     MOV    M,A
  1005.     XRA    B
  1006.     RLC
  1007.     MOV    B,A
  1008.     INR    L
  1009.     JNZ    TWOBLKS    
  1010.     INR    H
  1011.     DCR    C
  1012.     JNZ    TWOBLKS
  1013.     LDAX    D
  1014.     XRA    B
  1015.     JNZ    REBOOT    
  1016. NEXTSEC:EQU    $+BIAS1
  1017.     POP    D
  1018.     POP    B
  1019.     POP     H
  1020.     INR    H
  1021.     INR    H
  1022.     INR    C
  1023.     DCR    B
  1024.     JNZ    TWOTRKS
  1025.     DCR    E
  1026.     JZ    INIT
  1027.     PUSH    H
  1028.     LHLD    RDCMD    
  1029.     DCR    H
  1030.     MVI    L,STEPIN
  1031.     MOV    A,M
  1032.     MVI    L,STEPIN1
  1033.     MOV    A,M
  1034.     MVI    L,STEPIN
  1035.     MOV    A,M
  1036.     MVI    D,2
  1037.     CALL    ADVSEC    
  1038.     POP    H
  1039.     JMP    TWOTRKS0
  1040. ;
  1041. INIT:    EQU    $+BIAS1        
  1042.     LDA    CMDHI
  1043.     SUI    CMDMSB
  1044.     MOV    C,A
  1045.     LXI    H,0000H        ;0000H, storage location for
  1046.                 ;PROMTABL address    
  1047. CHNGBIOS:EQU    $+BIAS1        
  1048.     MOV    E,M
  1049.     INX    H
  1050.     MOV    D,M
  1051.     MOV    A,M
  1052.     ORA    E
  1053.     JZ    BOOT
  1054.     LDAX    D
  1055.     ADD    C
  1056.     STAX    D
  1057.     INX    H
  1058.     JMP    CHNGBIOS    
  1059. ;
  1060. ;
  1061. ONESEC:    EQU    $+BIAS1
  1062.     MVI    D,1
  1063. ADVSEC:    EQU    $+BIAS1        
  1064.     LHLD    RDCMD    
  1065.     MVI    L,RSTSEC
  1066.     MOV    A,M
  1067.     LHLD    RDCMD    
  1068.     MVI    L,ASTAT
  1069. DETSEC:    EQU    $+BIAS1        
  1070.     MOV    A,M
  1071.     ORA    A
  1072.     JP    DETSEC    
  1073.     DCR    D
  1074.     LHLD    RDCMD    
  1075.     MVI    L,RSTSEC
  1076.     MOV    A,M
  1077.     JNZ    ADVSEC    
  1078.     RET
  1079. ;
  1080. DUPL:    EQU    $+BIAS1
  1081.     DW    0EB40H        ;duplicate required here for 2.21A
  1082.                 ;gets patched to correct prom by the
  1083.                 ;patch table in bdos
  1084. ;
  1085. BOOT:    EQU    $+BIAS1
  1086.     LDA    CMDHI
  1087.     SUI    3
  1088.     STA    0000H        ;0000H, storage location for
  1089.                 ;addr of PROM hi byte
  1090.     JMP    0000H        ;storage loc. for jmp to BIOS
  1091. ;
  1092. RDCMD:    EQU    $+BIAS1
  1093.     DB    DSKRD
  1094. CMDHI:    EQU    $+BIAS1
  1095.     DB    CMDMSB
  1096. ;
  1097. PEND1    EQU    $+BIAS1
  1098. ;
  1099. ;==========================================================
  1100. ;
  1101. ; Buffer space
  1102. ;
  1103. SKWTBL:    EQU    $+BIAS1
  1104.     DS    40        ;written by SKWGEN
  1105. ;
  1106. CURRDRV:EQU    $+BIAS1        ;current disk # buffer 
  1107.     DS    1
  1108. ;
  1109. TRKBUF:    EQU    $+BIAS1        ;current track buffer 
  1110.     DS    1
  1111. ;
  1112. SECBUF:    EQU    $+BIAS1        ;sector number buffer 
  1113.     DS    1
  1114. ;
  1115. RDWRFLG:EQU    $+BIAS1        ;read/write flag WRITE=1 
  1116.     DS    1
  1117. ;
  1118. IMGADR:    EQU    $+BIAS1        ;current image address 
  1119.     DS    2
  1120. ;
  1121. RETRY:    EQU    $+BIAS1        ;buffer for re-try count 
  1122.     DS    1
  1123. ;
  1124. SKWPTR:    EQU    $+BIAS1        ;skew pointer buffer 
  1125.     DS    2
  1126. ;
  1127.     DS    207        ;stack area 
  1128. STACK:    EQU    $+BIAS1
  1129. ;
  1130. ;    the
  1131.     END
  1132.