|
DataMuseum.dkPresents historical artifacts from the history of: CP/M |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about CP/M Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - download
Length: 3840 (0xf00) Types: TextFile Names: »ASSEMBL.A86«
└─⟦490a8e2df⟧ Bits:30003937 SW1501 RcComal-80 v3.0 (thykier) └─ ⟦this⟧ »ASSEMBL.A86« └─⟦72a4952a6⟧ Bits:30004362 SW1501 RcComal-80 v3.0 └─ ⟦this⟧ »ASSEMBL.A86« └─⟦dcb507fe6⟧ Bits:30003936 SW1501 RcComal-80 v3.0 (ils) └─ ⟦this⟧ »ASSEMBL.A86«
VERSNO EQU 8324h ASSEMBLER EQU 28h VALUE EQU 0 REF EQU 1 REAL EQU 0 STRING EQU 2 PROC EQU 5 REALFUNC EQU 9 STRINGFUNC EQU 10 ASSERR EQU 180 CSEG $ ; FUNCTION get_real_par(no : byte): integer; ; (* henter parameter no fra COMAL og konveterer tallet og ; og lægger det i BX *) ; CALL RETURN ; CL no ; BX get_real_par REALPAR: MOV BP,RESERVER+6 ; XOR CH,CH ; SHL CX,1 ; ADD BP,CX ; MOV SI,4ÆBPÅ ; ptr := adresse_par(no); MOV BX,1 ; CALL COMALRUT ; comal_fix(ptr); RET ; ; PROCEDURE get_string_par(no : byte, adr : integer); ; (* henter parameter no fra COMAL og lægger den i adressen ; DI udpeger og fremefter *) ; CALL RETURN ; CL no ; DI adr STRPAR: MOV BP,RESERVER+6 ; PUSH DS ; POP ES ; extra_segment := pakkens data_segment; PUSH DS ; gem pakkens data_segment; MOV DS,4ÆBPÅ ; data_segment := COMAL's data_segment; XOR CH,CH ; SHL CX,1 ; ADD BP,CX ; MOV SI,4ÆBPÅ ; ptr := adresse_par(no); INC SI ; INC SI ; skip_max_længde; LODS AX ; MOV CX,AX ; hent_nuværende_længde; CLD ; REP MOVSB ; flyt strengen; POP DS ; data_segment := pakkens data_segment; RET ; ; PROCEDURE put_real_resultat(resultat : integer, ; REF resultat_segm, resultat_offset : integer); ; (* konverterer resultatet til COMAL-format og returnerer værdien *) ; CALL RETURN ; BX resultat ; AX resultat_segm ; CX resultat_offset REALRES:MOV SI,BX ; MOV BX,0 ; CALL COMALRUT ; comal_float(resultat); RET ; ; PROCEDURE put_real_parameter(resultat : integer, no : byte); ; (* konverterer resultatet til COMAL-format og lægger resultatet ; på adressen for parameter no *) ; CALL RETURN ; BX resultat ; CL no PUTREALPAR: PUSH CX ; CALL REALRES ; realres(resultat,res_segm,res_offset); MOV SI,CX ; from := res_offset; MOV BP,RESERVER+6 ; (* res_segm = COMAL's data_segment *) POP CX ; XOR CH,CH ; SHL CX,1 ; ADD BP,CX ; MOV DI,4ÆBPÅ ; to := adresse_par(no); PUSH DS ; gem pakkens data_segment; MOV ES,AX ; extra_segment := COMAL's data_segment; MOV DS,AX ; data_segment := COMAL's data_segment; MOV CX,8 ; REP MOVSB ; movebytes(from,to,8); POP DS ; hent pakkens data_segment; RET ; ; PROCEDURE finito; ; (* return far *) FINITO: MOV BP,RESERVER+6 ; SUB BP,6 ; MOV SP,BP ; return_far; RETF ; ; PROCEDURE test_error(error_kode : integer); ; (* tester om error_kode er forskellig fra nul og sætter ; i så fald fejlkoden i COMAL *) ; CALL RETURN ; AX error_kode ; PROCEDURE error(error_kode : integer); ; (* sætter fejlkoden i COMAL *) ; CALL RETURN ; AX error_kode TSTERR: OR AX,AX ; JNZ ERROR ; IF error_kode <> 0 THEN RET ; comal_set_error(error_kode); ERROR: MOV SI,AX ; MOV BX,32 ; CALL COMALRUT ; comal_set_error(error_kode); RET ; ; PROCEDURE comal_rutine(rutine_no, arg1, arg2 : integer, ; REF res_offset, res_segment : integer); ; (* kalder en af de COMAL-rutiner, der er til rådighed for pakken *) ; CALL RETURN ; BX rutine_no ; SI arg1 ; DI arg2 ; CX res_offset ; AX res_segment COMALRUT: MOV BP,RESERVER+6 ; PUSH DS ; gem pakkens data_segment; MOV DS,4ÆBPÅ ; data_segment := COMAL's data_segment; CALLF DWORD PTR ÆBPÅ ; kald COMAL-rutinen; PUSH SI ; gem resultat_offset; PUSH DS ; gem resultat_segment; CALL TSTERR ; test om der er fejl under COMAL-rutinen; POP AX ; resultat_segment; POP CX ; resultat_offset; POP DS ; data_segment := pakkens data_segment; RET ; DSEG $ ORG 100h RESERVER RW 4 CSEG $ «eof»