LS-DOS 6.3.1 - LBCREATE Assembly Listing (HTML format version)

[Copyright 1999,2002 Frank Durda IV, All Rights Reserved.
Mirroring of any material on this page in any form is expressly prohibited.
The official web site for this material is:  http://nemesis.lonestar.org
Contact this address for use clearances: clearance at nemesis.lonestar.org
Comments and queries to this address: web_software_2011 at nemesis.lonestar.org]
MISOSYS EDAS-4.3 04/19/99 00:04:47 CREATE - LS-DOS 6.2          Page 00001 

              00001 ;LBCREATE/ASM - CREATE Command
              00003 ;
0000          00004 *GET    BUILDVER/ASM:3
              00005 ;
              00006 ;       Buildver/asm is a bit of a kludge since not all utilities can load
              00007 ;       equates from LDOS60 and still compile.  LOWCORE and everybody else
              00008 ;       relies on this setting, and it eventually ends up in LDOS60/EQU
              00009 ;       for programs that can use that.
              00010 ;
FFFF          00011 @BLD631         EQU     -1      ;<631>Build 631 distribution (LEVEL 1B)
              00012 ;       These switches activate patches made since the 1B release.
              00013 ;       It is important that all earlier patches be enabled when a higher
              00014 ;       patch is enabled.
              00015 ;       Patches C thru F were published in TMQ IV.iv, page 32 (NOTE: the
              00016 ;       patch addresses listed for SPOOL in SPOOL1/FIX are 19H high.)
FFFF          00017 @BLD631C        EQU     -1      ;<631>Apply 1C patches (SETKI)
FFFF          00018 @BLD631D        EQU     -1      ;<631>Apply 1D patches (DIR)
FFFF          00019 @BLD631E        EQU     -1      ;<631>Apply 1E patches (DIR & MEMDISK/DCT)
FFFF          00020 @BLD631F        EQU     -1      ;<631>Apply 1F patches (SPOOL)
              00021 ;       Patches G and H were published in TMQ V.i, pages 10 and 18/19.
FFFF          00022 @BLD631G        EQU     -1      ;<631>Apply 1G patches (//KEYIN,DIR,DO *)
FFFF          00023 @BLD631H        EQU     -1      ;<631>Apply 1H patches (MEMORY)
              00024 ;
              00025 ;End of BUILDVER/ASM
0000          00026 *GET    SVCMAC:3                ;SVC Macro equivalents
              00027 ;SVCMAC/ASM - LS-DOS Version VI
              00028 *LIST   OFF
              00420 *LIST   ON
0000          00422 *GET    VALUES:3                ;Misc. equates
              00423 ;VALUES/ASM - Version 6
              00424 *LIST OFF
              00451 *LIST ON
              00452 ;
2400          00453         ORG     2400H
              00454 ;
2400          00455 CREATE  EQU     $
              00456         IF      @BLD631
2400 ED731E25 00457         LD      (SAVESP+1),SP   ;<631>Save SP address
2404          00458         @@CKBRKC                ;<631>Break key down?
2404+3E6A     00459         LD      A,106
2406+EF       00460         RST     40
2407 C25425   00461         JP      NZ,ABORT        ;<631>Abort
              00462         ELSE
              00463         @@CKBRKC                ;Break key down?
              00464         JR      Z,BEGINA        ;Ok if not
              00465         LD      HL,-1           ;  else abort
              00466         RET
              00467 ;
              00468 BEGINA  LD      (SAVESP+1),SP   ;Save SP address
              00469         ENDIF
240A CD3224   00470         CALL    CREATCD         ;Do the CREATE code
              00471 ;
              00472 ;       Set ERN & offset in FCB = value at @INIT
              00473 ;
240D 210000   00474 ERN     LD      HL,$-$          ;P/u ERN (probably 0)
2410 22CE25   00475         LD      (FCB+12),HL     ;Stuff into FCB
2413 3E00     00476 OFFSET  LD      A,$-$           ;P/u offset byte
2415 32CA25   00477         LD      (FCB+8),A       ;Stuff into FCB
              00478 ;
              00479 ;       CLOSE the file if possible
              00480 ;
2418 11C225   00481         LD      DE,FCB          ;DE => FCB
              00482         IF      @BLD631
241B ED4BC825 00483         LD      BC,(FCB+6)      ;<631>
              00484         ENDIF
241F          00485         @@CLOSE                 ;Close file
241F+3E3C     00486         LD      A,60
2421+EF       00487         RST     40
2422 C21425   00488         JP      NZ,IOERR        ;NZ - I/O Error
              00489 ;
              00490 ;       Exit Routine
              00491 ;
              00492         IF      @BLD631
2425 110000   00493 SHRINK: LD      DE,0            ;<631>
2428 7A       00494         LD      A,D             ;<631>
2429 A3       00495         AND     E               ;<631>
242A 3C       00496         INC     A               ;<631>
242B CC2125   00497         CALL    Z,CLRCRE        ;<631>Clear Create flag
242E 210000   00498         LD      HL,0            ;<631>
              00499         ELSE
              00500         LD      HL,0            ;Successful - HL = 0
              00501         ENDIF
2431 C9       00502         RET                     ;Return
              00503 ;
              00504 ;       Parse the Filespec given
              00505 ;
2432 11C225   00506 CREATCD LD      DE,FCB          ;Fetch filespec
2435          00507         @@FSPEC
2435+3E4E     00508         LD      A,78
2437+EF       00509         RST     40
2438 C24A25   00510         JP      NZ,SPCREQ       ;Quit on bad name
              00511 ;
              00512 ;       Check out parameter input
              00513 ;
243B 119825   00514         LD      DE,PRMTBL$      ;Get parms
243E          00515         @@PARAM
243E+3E11     00516         LD      A,17
2440+EF       00517         RST     40
2441 C21425   00518         JP      NZ,IOERR        ;Jump on parm error
              00519 ;
              00520 ;       Check If Rec or LRL were specified
              00521 ;
2444 3AAC25   00522         LD      A,(LRESP)       ;P/u LRL response
2447 47       00523         LD      B,A             ;Save in B
2448 3AA525   00524         LD      A,(RRESP)       ;P/u REC response
244B B0       00525         OR      B               ;Either specified ?
244C 2807     00526         JR      Z,RPARM         ;No - check # records
              00527 ;
              00528 ;       If Size parm also was specified - Parameter Error
              00529 ;
244E 3A9E25   00530         LD      A,(SRESP)       ;Size can't be used
2451 B7       00531         OR      A               ;  with REC or LRL
2452 C21225   00532         JP      NZ,PRMERR       ;Specified ? - Error
              00533 ;
              00534 ;       Check Record count
              00535 ;
2455 010000   00536 RPARM   LD      BC,$-$          ;P/u # of records
2458 78       00537         LD      A,B
2459 B1       00538         OR      C
245A 200D     00539         JR      NZ,LPARM
              00540 ;
              00541 ;       Zero Records - Use Size instead
              00542 ;
245C 210000   00543 SPARM   LD      HL,$-$          ;P/u size parm
245F 7C       00544         LD      A,H
2460 B5       00545         OR      L
2461 CA1225   00546         JP      Z,PRMERR        ;Err if size not entered
              00547 ;
              00548 ;       Multiply HL x 4 to get # of sectors
              00549 ;
2464 29       00550         ADD     HL,HL           ;X 2
2465 29       00551         ADD     HL,HL           ;X 4
2466 225624   00552         LD      (RPARM+1),HL    ;Pretend it's rec input
              00553 ;
              00554 ;       Make sure LRL input is valid
              00555 ;
2469 010000   00556 LPARM   LD      BC,$-$          ;P/u LRL
246C 78       00557         LD      A,B             ;Test for > 256
246D B7       00558         OR      A               ;If hi-order = 0,
246E 2808     00559         JR      Z,LP1           ;Just use lo-order
2470 3D       00560         DEC     A               ;Test hi-order = 1
2471 C21225   00561         JP      NZ,PRMERR       ;Quit if any other
2474 B1       00562         OR      C               ;P/u lo-order
2475 C21225   00563         JP      NZ,PRMERR       ;Lo-order must be 0
2478 B1       00564 LP1     OR      C               ;Merge lo-order
              00565 ;
              00566 ;       Open the File with the LRL specified
              00567 ;
2479 11C225   00568         LD      DE,FCB          ;Open the file
247C 210026   00569         LD      HL,BUFFER
247F 47       00570         LD      B,A             ;LRL = 256, or user entry
2480          00571         @@INIT
2480+3E3A     00572         LD      A,58
2482+EF       00573         RST     40
2483 C21425   00574         JP      NZ,IOERR        ;Jump on init error
              00575 ;
              00576 ;       Display "Creating : Filespec" String
              00577 ;
2486 118925   00578         LD      DE,FILESP       ;DE => Filespec
2489 ED4BC825 00579         LD      BC,(FCB+6)      ;P/u drive #, DEC
248D 3AC225   00580         LD      A,(FCB)         ;P/u to test device/file
2490 CD3425   00581         CALL    $FNAME
2493 C21425   00582         JP      NZ,IOERR        ;Leave on error
2496 217F25   00583         LD      HL,CREATE$      ;"Creating : "
2499          00584         @@DSPLY                 ;Display it
              00585         IFEQ    00H,1
              00586         LD      HL,
              00587         ENDIF
2499+3E0A     00588         LD      A,10
249B+EF       00589         RST     40
249C C21425   00590         JP      NZ,IOERR        ;Quit on dsply error
249F 0E0D     00591         LD      C,CR            ;End line
24A1          00592         @@DSP
24A1+3E02     00593         LD      A,2
24A3+EF       00594         RST     40
24A4 C21425   00595         JP      NZ,IOERR
              00596 ;
              00597 ;       Save ERN & offset from FCB for later
              00598 ;
24A7 2ACE25   00599         LD      HL,(FCB+12)     ;P/u ERN
24AA 220E24   00600         LD      (ERN+1),HL
24AD 3ACA25   00601         LD      A,(FCB+8)       ;P/u offset byte
24B0 321424   00602         LD      (OFFSET+1),A
              00603 ;
              00604 ;       Check if the New Size > Old Size ?
              00605 ;
24B3 11C225   00606 BIGGER  LD      DE,FCB          ;DE => FCB+0
24B6          00607         @@LOF                   ;Get length of file
24B6+3E40     00608         LD      A,64
24B8+EF       00609         RST     40
24B9 60       00610         LD      H,B             ;Move len to HL
24BA 69       00611         LD      L,C
24BB ED4B5624 00612         LD      BC,(RPARM+1)    ;P/u # of records
24BF AF       00613         XOR     A               ;Clear carry
24C0 E5       00614         PUSH    HL              ;Save ERN
24C1 ED42     00615         SBC     HL,BC           ;Is new ERN > old ERN?
24C3 E1       00616         POP     HL              ;HL = ERN
24C4 D24E25   00617         JP      NC,BADSIZ       ;Go if not
              00618 ;
              00619 ;       Position FCB to Ending Record Number
              00620 ;
24C7 0B       00621         DEC     BC              ;Reduce to offset from 0
24C8          00622         @@POSN                  ;Position to new ERN
24C8+3E42     00623         LD      A,66
24CA+EF       00624         RST     40
              00625 ;
              00626 ;       Fill a 256 byte buffer with X'E5' bytes
              00627 ;
24CB 210026   00628         LD      HL,BUFFER       ;Buffer area
24CE 110126   00629         LD      DE,BUFFER+1     ;"format" a sector
24D1 01FF00   00630         LD      BC,255
24D4 36E5     00631         LD      (HL),0E5H
24D6 EDB0     00632         LDIR
              00633 ;
              00634 ;       Write the last Record of the file
              00635 ;
24D8 11C225   00636         LD      DE,FCB          ;Write the new ERN sector
24DB 25       00637         DEC     H               ;Set HL = buffer start
24DC 23       00638         INC     HL
24DD CD0D25   00639         CALL    WRITE           ;Write the last record
24E0          00640         @@REW                   ;Rewind File
24E0+3E44     00641         LD      A,68
24E2+EF       00642         RST     40
              00643 ;
              00644 ;       Read in the directory entry
              00645 ;
24E3 ED4BC825 00646         LD      BC,(FCB+6)      ;Get drive # & DEC
              00647         IF      @BLD631
24E7 CD2625   00648         CALL    SETCRE          ;<631>Set Create flag in directory
              00649         ELSE
              00650         @@DIRRD                 ;Read in record
              00651         JR      NZ,IOERR        ;Jump on read error
              00652 ;
              00653 ;       Set the CREATE bit, and write it back out
              00654 ;
              00655         INC     HL              ;Point to FCB+1 &
              00656         SET     7,(HL)          ;  set the CREATE bit
              00657         @@DIRWR                 ;Write entry back
              00658         JR      NZ,IOERR        ;Jump on write error
              00659         ENDIF
              00660 ;
              00661 ;       Do we have to Fill the file ?
              00662 ;
24EA 010001   00663 FILL    LD      BC,0100H        ;P/u FILL parm
24ED 05       00664         DEC     B
24EE C8       00665         RET     Z               ;RETurn if no Fill
              00666 ;
              00667 ;       Create a Buffer with the FILL bytes
              00668 ;
24EF D5       00669         PUSH    DE              ;Save FCB pointer
24F0 210026   00670         LD      HL,BUFFER       ;I/O buffer
24F3 71       00671         LD      (HL),C          ;Byte to xfer
24F4 110126   00672         LD      DE,BUFFER+1
24F7 01FF01   00673         LD      BC,255+256      ;Hit both buffers
24FA EDB0     00674         LDIR                    ;Xfer into buffer
              00675 ;
              00676 ;       Pt HL => User Buff, DE => FCB, BC = last Rec
              00677 ;
24FC D1       00678         POP     DE              ;Restore FCB pointer
24FD ED4B5624 00679         LD      BC,(RPARM+1)    ;P/u last record
2501 210027   00680         LD      HL,UBUFF        ;User Buffer
              00681 ;
              00682 ;       Loop to write logical records
              00683 ;
2504 78       00684 WRLOOP  LD      A,B             ;Is rec cnt = 0 ?
2505 B1       00685         OR      C
2506 C8       00686         RET     Z               ;Yes - done
2507 CD0D25   00687         CALL    WRITE           ;Write Record
250A 0B       00688         DEC     BC              ;Dec one
250B 18F7     00689         JR      WRLOOP          ;Do til BC = 0
              00690 ;
              00691 ;       Write the buffer contents
              00692 ;
250D          00693 WRITE   @@WRITE                 ;Write buffer
250D+3E4B     00694         LD      A,75
250F+EF       00695         RST     40
2510 C8       00696         RET     Z               ;Good - RETurn
2511 21       00697         DB      21H             ;Skip LD A,## instruction
2512 3E2C     00698 PRMERR  LD      A,PAR_ERR       ;Parameter Error
              00699 ;
              00700 ;       I/O error display & abort routine
              00701 ;
2514 6F       00702 IOERR   LD      L,A             ;Save error # in HL
2515 2600     00703         LD      H,0
2517 F6C0     00704         OR      0C0H            ;Short error message
2519 4F       00705         LD      C,A             ;Stuff in C for @ERROR
251A          00706         @@ERROR                 ;Display error message
251A+3E1A     00707         LD      A,26
251C+EF       00708         RST     40
251D 310000   00709 SAVESP  LD      SP,$-$          ;P/u original SP
2520 C9       00710         RET                     ;Done, RETurn
              00711         IF      @BLD631
2521 3EBE     00712 CLRCRE  LD      A,0BEH          ;<631>
2523 322D25   00713         LD      (CREFLG),A      ;<631>
2526          00714 SETCRE: @@DIRRD                 ;<631>
2526+3E57     00715         LD      A,87
2528+EF       00716         RST     40
2529 20E9     00717         JR      NZ,IOERR        ;<631>
252B 23       00718         INC     HL              ;<631>
252D          00719 CREFLG: EQU     $+1             ;<631>
252C CBFE     00720         SET     7,(HL)          ;<631>
252E          00721         @@DIRWR                 ;<631>
252E+3E58     00722         LD      A,88
2530+EF       00723         RST     40
2531 20E1     00724         JR      NZ,IOERR        ;<631>
2533 C9       00725         RET                     ;<631>
              00726         ENDIF
              00727 ;
              00728 ;       Routine to pick up device/file name
              00729 ;
2534 CB7F     00730 $FNAME  BIT     7,A             ;Test device/file
2536 2804     00731         JR      Z,FNAME1        ;Go if device
2538          00732         @@FNAME
2538+3E50     00733         LD      A,80
253A+EF       00734         RST     40
253B C9       00735         RET
253C 3E2A     00736 FNAME1  LD      A,'*'           ;Stuff device indicator
253E 12       00737         LD      (DE),A
253F 13       00738         INC     DE
2540 79       00739         LD      A,C             ;Stuff 1st character
2541 12       00740         LD      (DE),A
2542 13       00741         INC     DE
2543 78       00742         LD      A,B             ;Stuff 2nd character
2544 12       00743         LD      (DE),A
2545 13       00744         INC     DE
2546 3E03     00745         LD      A,3             ;Stuff ETX
2548 12       00746         LD      (DE),A
2549 C9       00747         RET
              00748 ;
              00749 ;       Error Message Display routine
              00750 ;
254A 215925   00751 SPCREQ  LD      HL,SPCREQ$
254D DD       00752         DB      0DDH
254E 216C25   00753 BADSIZ  LD      HL,BADSIZ$
              00754 ;
              00755 ;       Log Error Message & Abort
              00756 ;
2551          00757         @@LOGOT                 ;Log error message
              00758         IFEQ    00H,1
              00759         LD      HL,
              00760         ENDIF
2551+3E0C     00761         LD      A,12
2553+EF       00762         RST     40
              00763         IF      @BLD631
              00764 ABORT:                          ;<631>
              00765         ENDIF
2554 21FFFF   00766         LD      HL,-1           ;Set abort code
2557 18C4     00767         JR      SAVESP          ;Exit
              00768 ;
              00769 ;       Messages
              00770 ;
2559 46       00771 SPCREQ$ DB      'File spec required',CR
     69 6C 65 20 73 70 65 63
     20 72 65 71 75 69 72 65
     64 0D 
256C 46       00772 BADSIZ$ DB      'File exists larger',CR
     69 6C 65 20 65 78 69 73
     74 73 20 6C 61 72 67 65
     72 0D 
257F 43       00773 CREATE$ DB      'Creating: '
     72 65 61 74 69 6E 67 3A
     20 
2589          00774 FILESP  DS      15
              00775 ;
              00776 ;PARAMETER TABLE
              00777 ;
2598 80       00778 PRMTBL$ DB      80H             ;6.x Parameter Table
              00779 ;
              00780 ;       SIZE (S) - Accept Numeric Input only
              00781 ;
2599 94       00782         DB      NUM!ABB!4
259A 53       00783         DB      'SIZE'
     49 5A 45 
259E 00       00784 SRESP   DB      0
259F 5D24     00785         DW      SPARM+1
              00786 ;
              00787 ;       REC (R) - Accept Numeric input only
              00788 ;
25A1 93       00789         DB      NUM!ABB!3
25A2 52       00790         DB      'REC'
     45 43 
25A5 00       00791 RRESP   DB      0
25A6 5624     00792         DW      RPARM+1
              00793 ;
              00794 ;       LRL (L) - Accept Numeric input only
              00795 ;
25A8 93       00796         DB      NUM!ABB!3
25A9 4C       00797         DB      'LRL'
     52 4C 
25AC 00       00798 LRESP   DB      0
25AD 6A24     00799         DW      LPARM+1
              00800 ;
              00801 ;       FILL (F) - Accept Numeric or Flag input
              00802 ;
25AF D4       00803         DB      FLAG!NUM!ABB!4
25B0 46       00804         DB      'FILL'
     49 4C 4C 
25B4 00       00805 FRESP   DB      0
25B5 EB24     00806         DW      FILL+1
              00807         IF      @BLD631
              00808 ;
              00809 ;       SHRINK (S) 
              00810 ;
25B7 46       00811         DB      FLAG!6                  ;<631>
25B8 53       00812         DB      'SHRINK'                ;<631>
     48 52 49 4E 4B 
25BE 00       00813         DB      0                       ;<631>
25BF 2624     00814         DW      SHRINK+1                ;<631>
              00815         ENDIF
25C1 00       00816         DB      0
              00817 ;
              00818 ;       I/O buffer
              00819 ;
25C2 00       00820 FCB     DB      0
25C3          00821         DS      31
2600          00822         ORG     $<-8+1<8
2600          00823 BUFFER  DS      256
2700          00824 UBUFF   DS      256
              00825 ;
2400          00826         END     CREATE
2400 is the transfer address
00000 Total errors


[Copyright 1999,2002 Frank Durda IV, All Rights Reserved.
Mirroring of any material on this page in any form is expressly prohibited.
The official web site for this material is:  http://nemesis.lonestar.org
Contact this address for use clearances: clearance at nemesis.lonestar.org
Comments and queries to this address: web_software_2011 at nemesis.lonestar.org]

Valid HTML 4.01!